From 4f9df2214c7d4f4a997b69ca9dfd1a690af3d9fc Mon Sep 17 00:00:00 2001 From: Soriba SYLLA Date: Tue, 21 Apr 2026 16:35:31 +0000 Subject: [PATCH] Premiere version de SIRH --- SIRH/__init__.py | 0 SIRH/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 126 bytes SIRH/__pycache__/__init__.cpython-313.pyc | Bin 0 -> 149 bytes SIRH/__pycache__/__init__.cpython-314.pyc | Bin 0 -> 145 bytes SIRH/__pycache__/settings.cpython-310.pyc | Bin 0 -> 2850 bytes SIRH/__pycache__/settings.cpython-313.pyc | Bin 0 -> 3688 bytes SIRH/__pycache__/settings.cpython-314.pyc | Bin 0 -> 3231 bytes SIRH/__pycache__/urls.cpython-310.pyc | Bin 0 -> 1519 bytes SIRH/__pycache__/urls.cpython-313.pyc | Bin 0 -> 4185 bytes SIRH/__pycache__/urls.cpython-314.pyc | Bin 0 -> 1934 bytes SIRH/__pycache__/views.cpython-310.pyc | Bin 0 -> 1249 bytes SIRH/__pycache__/views.cpython-313.pyc | Bin 0 -> 30001 bytes SIRH/__pycache__/views.cpython-314.pyc | Bin 0 -> 1840 bytes SIRH/__pycache__/wsgi.cpython-310.pyc | Bin 0 -> 523 bytes SIRH/__pycache__/wsgi.cpython-313.pyc | Bin 0 -> 630 bytes SIRH/__pycache__/wsgi.cpython-314.pyc | Bin 0 -> 621 bytes SIRH/asgi.py | 16 + SIRH/settings.py | 159 + SIRH/static/SIRH/PS1.jpg | Bin 0 -> 59768 bytes SIRH/static/SIRH/cerfig.jpeg | Bin 0 -> 184572 bytes SIRH/static/SIRH/icons.css | 2078 +++ SIRH/static/SIRH/per1.webp | Bin 0 -> 134594 bytes SIRH/static/SIRH/user.jpg | Bin 0 -> 86713 bytes SIRH/static/templates/SIRH/index.html | 157 + SIRH/static/templates/SIRH/login.html | 197 + .../static/templates/SIRH/menu_principal.html | 150 + SIRH/static/templates/SIRH/message.html | 10 + SIRH/static/templates/SIRH/monprofil.html | 384 + SIRH/static/templates/SIRH/parametre.html | 223 + SIRH/static/templates/SIRH/rapport.html | 205 + SIRH/static/templates/SIRH/registration | 0 SIRH/static/templates/SIRH/rest.html | 33 + SIRH/static/templates/SIRH/tiket.html | 620 + SIRH/static/templates/menu_principale.js | 12 + SIRH/templates/SIRH/BASE.html | 31 + SIRH/templates/SIRH/login.html | 43 + SIRH/templates/SIRH/parts/menu_principal.html | 41 + SIRH/urls.py | 67 + SIRH/views.py | 37 + SIRH/wsgi.py | 16 + .../fonctions_utilitaire.cpython-310.pyc | Bin 0 -> 1376 bytes .../fonctions_utilitaire.cpython-314.pyc | Bin 0 -> 1835 bytes fonction_utilitaire/fonctions_utilitaire.py | 34 + gestion_conge/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 135 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 153 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 154 bytes .../__pycache__/admin.cpython-310.pyc | Bin 0 -> 176 bytes .../__pycache__/admin.cpython-313.pyc | Bin 0 -> 197 bytes .../__pycache__/admin.cpython-314.pyc | Bin 0 -> 198 bytes .../__pycache__/apps.cpython-310.pyc | Bin 0 -> 427 bytes .../__pycache__/apps.cpython-313.pyc | Bin 0 -> 530 bytes .../__pycache__/apps.cpython-314.pyc | Bin 0 -> 528 bytes .../__pycache__/forms.cpython-310.pyc | Bin 0 -> 861 bytes .../__pycache__/forms.cpython-313.pyc | Bin 0 -> 6075 bytes .../__pycache__/forms.cpython-314.pyc | Bin 0 -> 1167 bytes .../__pycache__/models.cpython-310.pyc | Bin 0 -> 1287 bytes .../__pycache__/models.cpython-313.pyc | Bin 0 -> 8578 bytes .../__pycache__/models.cpython-314.pyc | Bin 0 -> 2032 bytes .../__pycache__/urls.cpython-310.pyc | Bin 0 -> 554 bytes .../__pycache__/urls.cpython-313.pyc | Bin 0 -> 2027 bytes .../__pycache__/urls.cpython-314.pyc | Bin 0 -> 742 bytes .../__pycache__/views.cpython-310.pyc | Bin 0 -> 5896 bytes .../__pycache__/views.cpython-313.pyc | Bin 0 -> 55172 bytes .../__pycache__/views.cpython-314.pyc | Bin 0 -> 12508 bytes gestion_conge/admin.py | 3 + gestion_conge/apps.py | 6 + gestion_conge/forms.py | 17 + gestion_conge/migrations/0001_initial.py | 30 + gestion_conge/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-310.pyc | Bin 0 -> 1270 bytes .../__pycache__/0001_initial.cpython-313.pyc | Bin 0 -> 3766 bytes .../__pycache__/0001_initial.cpython-314.pyc | Bin 0 -> 2245 bytes .../0002_alter_conge_type.cpython-310.pyc | Bin 0 -> 655 bytes .../0002_alter_conge_type.cpython-314.pyc | Bin 0 -> 871 bytes .../__pycache__/0002_initial.cpython-310.pyc | Bin 0 -> 1170 bytes .../__pycache__/0002_initial.cpython-313.pyc | Bin 0 -> 2353 bytes .../__pycache__/0002_initial.cpython-314.pyc | Bin 0 -> 2408 bytes ...e_validateur_chef_and_more.cpython-314.pyc | Bin 0 -> 794 bytes ...3_alter_conge_date_demande.cpython-314.pyc | Bin 0 -> 869 bytes ...03_alter_reservation_motif.cpython-310.pyc | Bin 0 -> 634 bytes ...03_alter_reservation_motif.cpython-313.pyc | Bin 0 -> 816 bytes ...03_alter_reservation_motif.cpython-314.pyc | Bin 0 -> 818 bytes ...4_notification_reservation.cpython-310.pyc | Bin 0 -> 794 bytes ...4_notification_reservation.cpython-313.pyc | Bin 0 -> 1091 bytes ...4_notification_reservation.cpython-314.pyc | Bin 0 -> 1098 bytes ...e_notification_reservation.cpython-310.pyc | Bin 0 -> 576 bytes ...e_notification_reservation.cpython-313.pyc | Bin 0 -> 725 bytes ...e_notification_reservation.cpython-314.pyc | Bin 0 -> 726 bytes ...06_reservation_besoin_ordi.cpython-310.pyc | Bin 0 -> 677 bytes ...06_reservation_besoin_ordi.cpython-313.pyc | Bin 0 -> 862 bytes ...06_reservation_besoin_ordi.cpython-314.pyc | Bin 0 -> 869 bytes ..._date_debut_range_and_more.cpython-310.pyc | Bin 0 -> 847 bytes ..._date_debut_range_and_more.cpython-313.pyc | Bin 0 -> 1166 bytes ..._date_debut_range_and_more.cpython-314.pyc | Bin 0 -> 1197 bytes ...ve_reservation_besoin_ordi.cpython-310.pyc | Bin 0 -> 573 bytes ...ve_reservation_besoin_ordi.cpython-313.pyc | Bin 0 -> 722 bytes ...ve_reservation_besoin_ordi.cpython-314.pyc | Bin 0 -> 723 bytes ...08_reservation_besoin_ordi.cpython-310.pyc | Bin 0 -> 679 bytes ...08_reservation_besoin_ordi.cpython-313.pyc | Bin 0 -> 864 bytes ...08_reservation_besoin_ordi.cpython-314.pyc | Bin 0 -> 871 bytes ..._date_debut_range_and_more.cpython-310.pyc | Bin 0 -> 702 bytes ..._date_debut_range_and_more.cpython-313.pyc | Bin 0 -> 953 bytes ..._date_debut_range_and_more.cpython-314.pyc | Bin 0 -> 972 bytes .../0010_merge_20260122_1101.cpython-310.pyc | Bin 0 -> 571 bytes .../0010_merge_20260122_1101.cpython-313.pyc | Bin 0 -> 688 bytes .../0010_merge_20260122_1101.cpython-314.pyc | Bin 0 -> 683 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 146 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 167 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 165 bytes gestion_conge/models.py | 36 + .../static/gestion_conge/js/detail_conges.js | 75 + .../static/gestion_conge/js/index.js | 71 + .../templates/gestion_conge/index.html | 51 + .../parts/modalDemandeConge.html | 26 + .../gestion_conge/parts/modalDetailConge.html | 92 + .../parts/modalModificationConge.html | 48 + .../gestion_conge/parts/modalRefus.html | 24 + gestion_conge/tests.py | 3 + gestion_conge/urls.py | 27 + gestion_conge/views.py | 225 + gestion_employe/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 137 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 155 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 156 bytes .../__pycache__/admin.cpython-310.pyc | Bin 0 -> 628 bytes .../__pycache__/admin.cpython-313.pyc | Bin 0 -> 714 bytes .../__pycache__/admin.cpython-314.pyc | Bin 0 -> 932 bytes .../__pycache__/api.cpython-313.pyc | Bin 0 -> 2148 bytes .../__pycache__/api_urls.cpython-313.pyc | Bin 0 -> 579 bytes .../__pycache__/api_urls.cpython-314.pyc | Bin 0 -> 156 bytes .../__pycache__/apps.cpython-310.pyc | Bin 0 -> 456 bytes .../__pycache__/apps.cpython-313.pyc | Bin 0 -> 536 bytes .../__pycache__/apps.cpython-314.pyc | Bin 0 -> 534 bytes .../__pycache__/forms.cpython-310.pyc | Bin 0 -> 2742 bytes .../__pycache__/forms.cpython-313.pyc | Bin 0 -> 13526 bytes .../__pycache__/forms.cpython-314.pyc | Bin 0 -> 4368 bytes .../__pycache__/models.cpython-310.pyc | Bin 0 -> 5475 bytes .../__pycache__/models.cpython-313.pyc | Bin 0 -> 11595 bytes .../__pycache__/models.cpython-314.pyc | Bin 0 -> 8281 bytes .../__pycache__/urls.cpython-310.pyc | Bin 0 -> 1511 bytes .../__pycache__/urls.cpython-313.pyc | Bin 0 -> 1836 bytes .../__pycache__/urls.cpython-314.pyc | Bin 0 -> 2193 bytes .../__pycache__/views.cpython-310.pyc | Bin 0 -> 13628 bytes .../__pycache__/views.cpython-313.pyc | Bin 0 -> 35725 bytes .../__pycache__/views.cpython-314.pyc | Bin 0 -> 26203 bytes gestion_employe/admin.py | 14 + gestion_employe/forms.py | 84 + gestion_employe/migrations/0001_initial.py | 88 + gestion_employe/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-310.pyc | Bin 0 -> 3994 bytes .../__pycache__/0001_initial.cpython-313.pyc | Bin 0 -> 9674 bytes .../__pycache__/0001_initial.cpython-314.pyc | Bin 0 -> 7065 bytes ...casier_judiciaire_and_more.cpython-314.pyc | Bin 0 -> 1349 bytes ...ail_alter_employe_username.cpython-310.pyc | Bin 0 -> 689 bytes ...ail_alter_employe_username.cpython-313.pyc | Bin 0 -> 940 bytes ...ail_alter_employe_username.cpython-314.pyc | Bin 0 -> 954 bytes ...casier_judiciaire_and_more.cpython-314.pyc | Bin 0 -> 1464 bytes ...ail_alter_employe_username.cpython-310.pyc | Bin 0 -> 1074 bytes ...ail_alter_employe_username.cpython-313.pyc | Bin 0 -> 1519 bytes ...ail_alter_employe_username.cpython-314.pyc | Bin 0 -> 1528 bytes ...004_alter_departement_chef.cpython-310.pyc | Bin 0 -> 854 bytes ...004_alter_departement_chef.cpython-313.pyc | Bin 0 -> 1185 bytes ...004_alter_departement_chef.cpython-314.pyc | Bin 0 -> 1192 bytes ...mation_certificat_and_more.cpython-314.pyc | Bin 0 -> 2006 bytes ...ail_alter_employe_username.cpython-310.pyc | Bin 0 -> 704 bytes ...ail_alter_employe_username.cpython-313.pyc | Bin 0 -> 955 bytes ...ail_alter_employe_username.cpython-314.pyc | Bin 0 -> 969 bytes ...mploye_projet_employe_sexe.cpython-314.pyc | Bin 0 -> 1033 bytes ...ail_alter_employe_username.cpython-310.pyc | Bin 0 -> 1074 bytes ...ail_alter_employe_username.cpython-313.pyc | Bin 0 -> 1519 bytes ...ail_alter_employe_username.cpython-314.pyc | Bin 0 -> 1528 bytes ...issance_alter_employe_sexe.cpython-314.pyc | Bin 0 -> 1086 bytes ...rmations_formation_employe.cpython-314.pyc | Bin 0 -> 1217 bytes .../0007_tachehebdomadaire.cpython-310.pyc | Bin 0 -> 1357 bytes .../0007_tachehebdomadaire.cpython-313.pyc | Bin 0 -> 1978 bytes .../0007_tachehebdomadaire.cpython-314.pyc | Bin 0 -> 2017 bytes ...artement_chef_employe_chef.cpython-314.pyc | Bin 0 -> 1015 bytes ...8_tachehebdomadaire_statut.cpython-310.pyc | Bin 0 -> 713 bytes ...8_tachehebdomadaire_statut.cpython-313.pyc | Bin 0 -> 914 bytes ...8_tachehebdomadaire_statut.cpython-314.pyc | Bin 0 -> 916 bytes ...se_alter_employe_telephone.cpython-314.pyc | Bin 0 -> 1002 bytes ...adaire_created_at_and_more.cpython-310.pyc | Bin 0 -> 844 bytes ...adaire_created_at_and_more.cpython-313.pyc | Bin 0 -> 1111 bytes ...adaire_created_at_and_more.cpython-314.pyc | Bin 0 -> 1125 bytes ...adaire_date_tache_and_more.cpython-310.pyc | Bin 0 -> 865 bytes ...adaire_date_tache_and_more.cpython-313.pyc | Bin 0 -> 1129 bytes ...adaire_date_tache_and_more.cpython-314.pyc | Bin 0 -> 1143 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 148 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 166 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 167 bytes gestion_employe/models.py | 121 + .../static/gestion_employe/js/index.js | 263 + .../static/gestion_employe/js/mon_profil.js | 42 + .../templates/gestion_employe/index.html | 67 + .../gestion_employe/modifier-profil.html | 105 + .../templates/gestion_employe/monprofil.html | 229 + .../parts/modalAffectationProjet.html | 28 + .../parts/modalAjoutFormation.html | 21 + .../parts/modalCreationContrat.html | 57 + .../parts/modalDetailEmploye.html | 136 + .../gestion_employe/parts/modalDocument.html | 41 + .../parts/modalListeContratExpirants.html | 17 + .../parts/modificationMotPasse.html | 36 + .../tags_personnaliser.cpython-310.pyc | Bin 0 -> 1120 bytes .../tags_personnaliser.cpython-314.pyc | Bin 0 -> 1633 bytes .../templatetags/tags_personnaliser.py | 24 + gestion_employe/tests.py | 3 + gestion_employe/urls.py | 102 + gestion_employe/views.py | 447 + gestion_projet/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 136 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 159 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 155 bytes .../__pycache__/admin.cpython-310.pyc | Bin 0 -> 441 bytes .../__pycache__/admin.cpython-313.pyc | Bin 0 -> 203 bytes .../__pycache__/admin.cpython-314.pyc | Bin 0 -> 611 bytes .../__pycache__/apps.cpython-310.pyc | Bin 0 -> 453 bytes .../__pycache__/apps.cpython-313.pyc | Bin 0 -> 538 bytes .../__pycache__/apps.cpython-314.pyc | Bin 0 -> 531 bytes .../__pycache__/forms.cpython-310.pyc | Bin 0 -> 4554 bytes .../__pycache__/forms.cpython-313.pyc | Bin 0 -> 8356 bytes .../__pycache__/forms.cpython-314.pyc | Bin 0 -> 6947 bytes .../__pycache__/models.cpython-310.pyc | Bin 0 -> 7657 bytes .../__pycache__/models.cpython-313.pyc | Bin 0 -> 21228 bytes .../__pycache__/models.cpython-314.pyc | Bin 0 -> 11385 bytes .../__pycache__/urls.cpython-310.pyc | Bin 0 -> 2297 bytes .../__pycache__/urls.cpython-313.pyc | Bin 0 -> 2633 bytes .../__pycache__/urls.cpython-314.pyc | Bin 0 -> 3225 bytes .../__pycache__/views.cpython-310.pyc | Bin 0 -> 16282 bytes .../__pycache__/views.cpython-313.pyc | Bin 0 -> 41096 bytes .../__pycache__/views.cpython-314.pyc | Bin 0 -> 31054 bytes gestion_projet/admin.py | 6 + gestion_projet/forms.py | 176 + gestion_projet/migrations/0001_initial.py | 107 + gestion_projet/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-310.pyc | Bin 0 -> 4309 bytes .../__pycache__/0001_initial.cpython-313.pyc | Bin 0 -> 10691 bytes .../__pycache__/0001_initial.cpython-314.pyc | Bin 0 -> 7575 bytes ...domainederecherche_options.cpython-310.pyc | Bin 0 -> 623 bytes ...domainederecherche_options.cpython-314.pyc | Bin 0 -> 808 bytes ...get_alter_projet_budget_rh.cpython-314.pyc | Bin 0 -> 1005 bytes ...projet_dernier_alerte_mail.cpython-310.pyc | Bin 0 -> 652 bytes ...projet_dernier_alerte_mail.cpython-313.pyc | Bin 0 -> 837 bytes ...domaine_recherche_and_more.cpython-314.pyc | Bin 0 -> 1341 bytes .../0002_projet_volets.cpython-313.pyc | Bin 0 -> 1087 bytes ...eprojet_livrables_and_more.cpython-314.pyc | Bin 0 -> 2043 bytes ...ter_domainederecherche_nom.cpython-314.pyc | Bin 0 -> 1049 bytes ...rnier_alerte_mail_and_more.cpython-310.pyc | Bin 0 -> 985 bytes ...rnier_alerte_mail_and_more.cpython-313.pyc | Bin 0 -> 1268 bytes ...rnier_alerte_mail_and_more.cpython-314.pyc | Bin 0 -> 1276 bytes .../0004_delete_plan.cpython-310.pyc | Bin 0 -> 547 bytes .../0004_delete_plan.cpython-313.pyc | Bin 0 -> 696 bytes ...e_activiteprojet_livrables.cpython-314.pyc | Bin 0 -> 733 bytes ...nom_delete_livrableattendu.cpython-314.pyc | Bin 0 -> 979 bytes ...et_motif_changement_budget.cpython-314.pyc | Bin 0 -> 931 bytes ...ter_domainederecherche_nom.cpython-314.pyc | Bin 0 -> 1040 bytes ...inederecherche_id_and_more.cpython-314.pyc | Bin 0 -> 1172 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 147 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 170 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 166 bytes gestion_projet/models.py | 309 + .../gestion_projet/js/creation_projet.js | 19 + .../js/enregistrement_bailleur.js | 23 + .../js/enregistrement_financement.js | 22 + .../static/gestion_projet/js/index.js | 64 + .../js/liste_documents_projet.js | 20 + .../gestion_projet/js/suivi-activites.js | 59 + .../gestion_projet/ajout-financement.html | 37 + .../gestion_projet/creation_projet.html | 32 + .../templates/gestion_projet/index.html | 61 + .../parts/creation_bailleur.html | 20 + .../parts/liste_document_projet.html | 16 + .../parts/modalAjoutActivite.html | 20 + .../parts/modalAjoutDocument.html | 20 + .../parts/modalAjoutLivrable.html | 20 + .../parts/modalAjoutProjet.html | 21 + .../parts/modalAnnulerActivite.html | 26 + .../parts/modalDetailActivite.html | 58 + .../parts/modalDetailProjet.html | 115 + .../parts/modalFinancement.html | 20 + .../parts/modalMiseAJourDepense.html | 36 + .../gestion_projet/suivi_activite.html | 64 + gestion_projet/tests.py | 3 + gestion_projet/urls.py | 122 + gestion_projet/views.py | 485 + gestion_salle/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 135 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 154 bytes .../__pycache__/admin.cpython-310.pyc | Bin 0 -> 176 bytes .../__pycache__/admin.cpython-314.pyc | Bin 0 -> 198 bytes .../__pycache__/apps.cpython-310.pyc | Bin 0 -> 370 bytes .../__pycache__/apps.cpython-314.pyc | Bin 0 -> 467 bytes .../__pycache__/forms.cpython-310.pyc | Bin 0 -> 1556 bytes .../__pycache__/forms.cpython-314.pyc | Bin 0 -> 2331 bytes .../__pycache__/models.cpython-310.pyc | Bin 0 -> 1534 bytes .../__pycache__/models.cpython-314.pyc | Bin 0 -> 2431 bytes .../__pycache__/urls.cpython-310.pyc | Bin 0 -> 929 bytes .../__pycache__/urls.cpython-314.pyc | Bin 0 -> 1282 bytes .../__pycache__/views.cpython-310.pyc | Bin 0 -> 6129 bytes .../__pycache__/views.cpython-314.pyc | Bin 0 -> 12317 bytes gestion_salle/admin.py | 3 + gestion_salle/apps.py | 5 + gestion_salle/forms.py | 32 + gestion_salle/migrations/0001_initial.py | 34 + gestion_salle/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-310.pyc | Bin 0 -> 1554 bytes .../__pycache__/0001_initial.cpython-314.pyc | Bin 0 -> 2493 bytes ...ve_reservation_motif_refus.cpython-310.pyc | Bin 0 -> 534 bytes ...ve_reservation_motif_refus.cpython-314.pyc | Bin 0 -> 707 bytes ...3_alter_reservation_statut.cpython-310.pyc | Bin 0 -> 747 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 146 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 165 bytes gestion_salle/models.py | 33 + .../static/gestion_salle/js/index.js | 193 + .../templates/gestion_salle/index.html | 59 + .../parts/ModalRefusReservation.html | 22 + .../parts/ModaleAjoutLienZoom.html | 26 + .../parts/modalCreationReservation.html | 23 + .../parts/modalDetailResevation.html | 71 + .../parts/modalListeValidation.html | 16 + gestion_salle/tests.py | 3 + gestion_salle/urls.py | 48 + gestion_salle/views.py | 195 + manage.py | 22 + requirements.txt | 152 + static/css/bootstrap.min.css | 6 + static/css/styles.css | 278 + static/css/tabulator_bootstrap5.min.css | 2 + ...bulator_bootstrap5.min.css:Zone.Identifier | Bin 0 -> 25 bytes static/img/cerfig.jpg | Bin 0 -> 86605 bytes static/js/monprofil.js | 13 + static/js/rapport.js | 102 + static/js/sirh-index.js | 75 + staticfiles/admin/css/autocomplete.css | 279 + staticfiles/admin/css/base.css | 1180 ++ staticfiles/admin/css/changelists.css | 343 + staticfiles/admin/css/dark_mode.css | 130 + staticfiles/admin/css/dashboard.css | 29 + staticfiles/admin/css/forms.css | 498 + staticfiles/admin/css/login.css | 61 + staticfiles/admin/css/nav_sidebar.css | 150 + staticfiles/admin/css/responsive.css | 904 ++ staticfiles/admin/css/responsive_rtl.css | 89 + staticfiles/admin/css/rtl.css | 293 + .../admin/css/unusable_password_field.css | 19 + .../css/vendor/select2/LICENSE-SELECT2.md | 21 + .../admin/css/vendor/select2/select2.css | 481 + .../admin/css/vendor/select2/select2.min.css | 1 + staticfiles/admin/css/widgets.css | 613 + staticfiles/admin/img/LICENSE | 20 + staticfiles/admin/img/README.txt | 7 + staticfiles/admin/img/calendar-icons.svg | 63 + staticfiles/admin/img/gis/move_vertex_off.svg | 1 + staticfiles/admin/img/gis/move_vertex_on.svg | 1 + staticfiles/admin/img/icon-addlink.svg | 3 + staticfiles/admin/img/icon-alert.svg | 3 + staticfiles/admin/img/icon-calendar.svg | 9 + staticfiles/admin/img/icon-changelink.svg | 3 + staticfiles/admin/img/icon-clock.svg | 9 + staticfiles/admin/img/icon-deletelink.svg | 3 + staticfiles/admin/img/icon-hidelink.svg | 3 + staticfiles/admin/img/icon-no.svg | 3 + staticfiles/admin/img/icon-unknown-alt.svg | 3 + staticfiles/admin/img/icon-unknown.svg | 3 + staticfiles/admin/img/icon-viewlink.svg | 3 + staticfiles/admin/img/icon-yes.svg | 3 + staticfiles/admin/img/inline-delete.svg | 3 + staticfiles/admin/img/search.svg | 3 + staticfiles/admin/img/selector-icons.svg | 34 + staticfiles/admin/img/sorting-icons.svg | 19 + staticfiles/admin/img/tooltag-add.svg | 3 + staticfiles/admin/img/tooltag-arrowright.svg | 3 + staticfiles/admin/js/SelectBox.js | 116 + staticfiles/admin/js/SelectFilter2.js | 311 + staticfiles/admin/js/actions.js | 204 + .../admin/js/admin/DateTimeShortcuts.js | 408 + .../admin/js/admin/RelatedObjectLookups.js | 252 + staticfiles/admin/js/autocomplete.js | 33 + staticfiles/admin/js/calendar.js | 239 + staticfiles/admin/js/cancel.js | 29 + staticfiles/admin/js/change_form.js | 16 + staticfiles/admin/js/core.js | 184 + staticfiles/admin/js/filters.js | 30 + staticfiles/admin/js/inlines.js | 359 + staticfiles/admin/js/jquery.init.js | 8 + staticfiles/admin/js/nav_sidebar.js | 79 + staticfiles/admin/js/popup_response.js | 15 + staticfiles/admin/js/prepopulate.js | 43 + staticfiles/admin/js/prepopulate_init.js | 15 + staticfiles/admin/js/theme.js | 51 + .../admin/js/unusable_password_field.js | 29 + staticfiles/admin/js/urlify.js | 169 + .../admin/js/vendor/jquery/LICENSE.txt | 20 + staticfiles/admin/js/vendor/jquery/jquery.js | 10716 ++++++++++++++++ .../admin/js/vendor/jquery/jquery.min.js | 2 + .../admin/js/vendor/select2/LICENSE.md | 21 + .../admin/js/vendor/select2/i18n/af.js | 3 + .../admin/js/vendor/select2/i18n/ar.js | 3 + .../admin/js/vendor/select2/i18n/az.js | 3 + .../admin/js/vendor/select2/i18n/bg.js | 3 + .../admin/js/vendor/select2/i18n/bn.js | 3 + .../admin/js/vendor/select2/i18n/bs.js | 3 + .../admin/js/vendor/select2/i18n/ca.js | 3 + .../admin/js/vendor/select2/i18n/cs.js | 3 + .../admin/js/vendor/select2/i18n/da.js | 3 + .../admin/js/vendor/select2/i18n/de.js | 3 + .../admin/js/vendor/select2/i18n/dsb.js | 3 + .../admin/js/vendor/select2/i18n/el.js | 3 + .../admin/js/vendor/select2/i18n/en.js | 3 + .../admin/js/vendor/select2/i18n/es.js | 3 + .../admin/js/vendor/select2/i18n/et.js | 3 + .../admin/js/vendor/select2/i18n/eu.js | 3 + .../admin/js/vendor/select2/i18n/fa.js | 3 + .../admin/js/vendor/select2/i18n/fi.js | 3 + .../admin/js/vendor/select2/i18n/fr.js | 3 + .../admin/js/vendor/select2/i18n/gl.js | 3 + .../admin/js/vendor/select2/i18n/he.js | 3 + .../admin/js/vendor/select2/i18n/hi.js | 3 + .../admin/js/vendor/select2/i18n/hr.js | 3 + .../admin/js/vendor/select2/i18n/hsb.js | 3 + .../admin/js/vendor/select2/i18n/hu.js | 3 + .../admin/js/vendor/select2/i18n/hy.js | 3 + .../admin/js/vendor/select2/i18n/id.js | 3 + .../admin/js/vendor/select2/i18n/is.js | 3 + .../admin/js/vendor/select2/i18n/it.js | 3 + .../admin/js/vendor/select2/i18n/ja.js | 3 + .../admin/js/vendor/select2/i18n/ka.js | 3 + .../admin/js/vendor/select2/i18n/km.js | 3 + .../admin/js/vendor/select2/i18n/ko.js | 3 + .../admin/js/vendor/select2/i18n/lt.js | 3 + .../admin/js/vendor/select2/i18n/lv.js | 3 + .../admin/js/vendor/select2/i18n/mk.js | 3 + .../admin/js/vendor/select2/i18n/ms.js | 3 + .../admin/js/vendor/select2/i18n/nb.js | 3 + .../admin/js/vendor/select2/i18n/ne.js | 3 + .../admin/js/vendor/select2/i18n/nl.js | 3 + .../admin/js/vendor/select2/i18n/pl.js | 3 + .../admin/js/vendor/select2/i18n/ps.js | 3 + .../admin/js/vendor/select2/i18n/pt-BR.js | 3 + .../admin/js/vendor/select2/i18n/pt.js | 3 + .../admin/js/vendor/select2/i18n/ro.js | 3 + .../admin/js/vendor/select2/i18n/ru.js | 3 + .../admin/js/vendor/select2/i18n/sk.js | 3 + .../admin/js/vendor/select2/i18n/sl.js | 3 + .../admin/js/vendor/select2/i18n/sq.js | 3 + .../admin/js/vendor/select2/i18n/sr-Cyrl.js | 3 + .../admin/js/vendor/select2/i18n/sr.js | 3 + .../admin/js/vendor/select2/i18n/sv.js | 3 + .../admin/js/vendor/select2/i18n/th.js | 3 + .../admin/js/vendor/select2/i18n/tk.js | 3 + .../admin/js/vendor/select2/i18n/tr.js | 3 + .../admin/js/vendor/select2/i18n/uk.js | 3 + .../admin/js/vendor/select2/i18n/vi.js | 3 + .../admin/js/vendor/select2/i18n/zh-CN.js | 3 + .../admin/js/vendor/select2/i18n/zh-TW.js | 3 + .../admin/js/vendor/select2/select2.full.js | 6820 ++++++++++ .../js/vendor/select2/select2.full.min.js | 2 + .../admin/js/vendor/xregexp/LICENSE.txt | 21 + .../admin/js/vendor/xregexp/xregexp.js | 6126 +++++++++ .../admin/js/vendor/xregexp/xregexp.min.js | 17 + staticfiles/bootstrap.min.css | 6 + staticfiles/gestion_conge/admin.py | 3 + staticfiles/gestion_conge/apps.py | 6 + staticfiles/icons.css | 2078 +++ staticfiles/styles.css | 278 + 466 files changed, 44745 insertions(+) create mode 100644 SIRH/__init__.py create mode 100644 SIRH/__pycache__/__init__.cpython-310.pyc create mode 100644 SIRH/__pycache__/__init__.cpython-313.pyc create mode 100644 SIRH/__pycache__/__init__.cpython-314.pyc create mode 100644 SIRH/__pycache__/settings.cpython-310.pyc create mode 100644 SIRH/__pycache__/settings.cpython-313.pyc create mode 100644 SIRH/__pycache__/settings.cpython-314.pyc create mode 100644 SIRH/__pycache__/urls.cpython-310.pyc create mode 100644 SIRH/__pycache__/urls.cpython-313.pyc create mode 100644 SIRH/__pycache__/urls.cpython-314.pyc create mode 100644 SIRH/__pycache__/views.cpython-310.pyc create mode 100644 SIRH/__pycache__/views.cpython-313.pyc create mode 100644 SIRH/__pycache__/views.cpython-314.pyc create mode 100644 SIRH/__pycache__/wsgi.cpython-310.pyc create mode 100644 SIRH/__pycache__/wsgi.cpython-313.pyc create mode 100644 SIRH/__pycache__/wsgi.cpython-314.pyc create mode 100644 SIRH/asgi.py create mode 100644 SIRH/settings.py create mode 100644 SIRH/static/SIRH/PS1.jpg create mode 100644 SIRH/static/SIRH/cerfig.jpeg create mode 100644 SIRH/static/SIRH/icons.css create mode 100644 SIRH/static/SIRH/per1.webp create mode 100644 SIRH/static/SIRH/user.jpg create mode 100644 SIRH/static/templates/SIRH/index.html create mode 100644 SIRH/static/templates/SIRH/login.html create mode 100644 SIRH/static/templates/SIRH/menu_principal.html create mode 100644 SIRH/static/templates/SIRH/message.html create mode 100644 SIRH/static/templates/SIRH/monprofil.html create mode 100644 SIRH/static/templates/SIRH/parametre.html create mode 100644 SIRH/static/templates/SIRH/rapport.html create mode 100644 SIRH/static/templates/SIRH/registration create mode 100644 SIRH/static/templates/SIRH/rest.html create mode 100644 SIRH/static/templates/SIRH/tiket.html create mode 100644 SIRH/static/templates/menu_principale.js create mode 100644 SIRH/templates/SIRH/BASE.html create mode 100644 SIRH/templates/SIRH/login.html create mode 100644 SIRH/templates/SIRH/parts/menu_principal.html create mode 100644 SIRH/urls.py create mode 100644 SIRH/views.py create mode 100644 SIRH/wsgi.py create mode 100644 fonction_utilitaire/__pycache__/fonctions_utilitaire.cpython-310.pyc create mode 100644 fonction_utilitaire/__pycache__/fonctions_utilitaire.cpython-314.pyc create mode 100644 fonction_utilitaire/fonctions_utilitaire.py create mode 100644 gestion_conge/__init__.py create mode 100644 gestion_conge/__pycache__/__init__.cpython-310.pyc create mode 100644 gestion_conge/__pycache__/__init__.cpython-313.pyc create mode 100644 gestion_conge/__pycache__/__init__.cpython-314.pyc create mode 100644 gestion_conge/__pycache__/admin.cpython-310.pyc create mode 100644 gestion_conge/__pycache__/admin.cpython-313.pyc create mode 100644 gestion_conge/__pycache__/admin.cpython-314.pyc create mode 100644 gestion_conge/__pycache__/apps.cpython-310.pyc create mode 100644 gestion_conge/__pycache__/apps.cpython-313.pyc create mode 100644 gestion_conge/__pycache__/apps.cpython-314.pyc create mode 100644 gestion_conge/__pycache__/forms.cpython-310.pyc create mode 100644 gestion_conge/__pycache__/forms.cpython-313.pyc create mode 100644 gestion_conge/__pycache__/forms.cpython-314.pyc create mode 100644 gestion_conge/__pycache__/models.cpython-310.pyc create mode 100644 gestion_conge/__pycache__/models.cpython-313.pyc create mode 100644 gestion_conge/__pycache__/models.cpython-314.pyc create mode 100644 gestion_conge/__pycache__/urls.cpython-310.pyc create mode 100644 gestion_conge/__pycache__/urls.cpython-313.pyc create mode 100644 gestion_conge/__pycache__/urls.cpython-314.pyc create mode 100644 gestion_conge/__pycache__/views.cpython-310.pyc create mode 100644 gestion_conge/__pycache__/views.cpython-313.pyc create mode 100644 gestion_conge/__pycache__/views.cpython-314.pyc create mode 100644 gestion_conge/admin.py create mode 100644 gestion_conge/apps.py create mode 100644 gestion_conge/forms.py create mode 100644 gestion_conge/migrations/0001_initial.py create mode 100644 gestion_conge/migrations/__init__.py create mode 100644 gestion_conge/migrations/__pycache__/0001_initial.cpython-310.pyc create mode 100644 gestion_conge/migrations/__pycache__/0001_initial.cpython-313.pyc create mode 100644 gestion_conge/migrations/__pycache__/0001_initial.cpython-314.pyc create mode 100644 gestion_conge/migrations/__pycache__/0002_alter_conge_type.cpython-310.pyc create mode 100644 gestion_conge/migrations/__pycache__/0002_alter_conge_type.cpython-314.pyc create mode 100644 gestion_conge/migrations/__pycache__/0002_initial.cpython-310.pyc create mode 100644 gestion_conge/migrations/__pycache__/0002_initial.cpython-313.pyc create mode 100644 gestion_conge/migrations/__pycache__/0002_initial.cpython-314.pyc create mode 100644 gestion_conge/migrations/__pycache__/0002_remove_conge_validateur_chef_and_more.cpython-314.pyc create mode 100644 gestion_conge/migrations/__pycache__/0003_alter_conge_date_demande.cpython-314.pyc create mode 100644 gestion_conge/migrations/__pycache__/0003_alter_reservation_motif.cpython-310.pyc create mode 100644 gestion_conge/migrations/__pycache__/0003_alter_reservation_motif.cpython-313.pyc create mode 100644 gestion_conge/migrations/__pycache__/0003_alter_reservation_motif.cpython-314.pyc create mode 100644 gestion_conge/migrations/__pycache__/0004_notification_reservation.cpython-310.pyc create mode 100644 gestion_conge/migrations/__pycache__/0004_notification_reservation.cpython-313.pyc create mode 100644 gestion_conge/migrations/__pycache__/0004_notification_reservation.cpython-314.pyc create mode 100644 gestion_conge/migrations/__pycache__/0005_remove_notification_reservation.cpython-310.pyc create mode 100644 gestion_conge/migrations/__pycache__/0005_remove_notification_reservation.cpython-313.pyc create mode 100644 gestion_conge/migrations/__pycache__/0005_remove_notification_reservation.cpython-314.pyc create mode 100644 gestion_conge/migrations/__pycache__/0006_reservation_besoin_ordi.cpython-310.pyc create mode 100644 gestion_conge/migrations/__pycache__/0006_reservation_besoin_ordi.cpython-313.pyc create mode 100644 gestion_conge/migrations/__pycache__/0006_reservation_besoin_ordi.cpython-314.pyc create mode 100644 gestion_conge/migrations/__pycache__/0006_reservation_besoin_ordi_reservation_date_debut_range_and_more.cpython-310.pyc create mode 100644 gestion_conge/migrations/__pycache__/0006_reservation_besoin_ordi_reservation_date_debut_range_and_more.cpython-313.pyc create mode 100644 gestion_conge/migrations/__pycache__/0006_reservation_besoin_ordi_reservation_date_debut_range_and_more.cpython-314.pyc create mode 100644 gestion_conge/migrations/__pycache__/0007_remove_reservation_besoin_ordi.cpython-310.pyc create mode 100644 gestion_conge/migrations/__pycache__/0007_remove_reservation_besoin_ordi.cpython-313.pyc create mode 100644 gestion_conge/migrations/__pycache__/0007_remove_reservation_besoin_ordi.cpython-314.pyc create mode 100644 gestion_conge/migrations/__pycache__/0008_reservation_besoin_ordi.cpython-310.pyc create mode 100644 gestion_conge/migrations/__pycache__/0008_reservation_besoin_ordi.cpython-313.pyc create mode 100644 gestion_conge/migrations/__pycache__/0008_reservation_besoin_ordi.cpython-314.pyc create mode 100644 gestion_conge/migrations/__pycache__/0009_reservation_date_debut_range_and_more.cpython-310.pyc create mode 100644 gestion_conge/migrations/__pycache__/0009_reservation_date_debut_range_and_more.cpython-313.pyc create mode 100644 gestion_conge/migrations/__pycache__/0009_reservation_date_debut_range_and_more.cpython-314.pyc create mode 100644 gestion_conge/migrations/__pycache__/0010_merge_20260122_1101.cpython-310.pyc create mode 100644 gestion_conge/migrations/__pycache__/0010_merge_20260122_1101.cpython-313.pyc create mode 100644 gestion_conge/migrations/__pycache__/0010_merge_20260122_1101.cpython-314.pyc create mode 100644 gestion_conge/migrations/__pycache__/__init__.cpython-310.pyc create mode 100644 gestion_conge/migrations/__pycache__/__init__.cpython-313.pyc create mode 100644 gestion_conge/migrations/__pycache__/__init__.cpython-314.pyc create mode 100644 gestion_conge/models.py create mode 100644 gestion_conge/static/gestion_conge/js/detail_conges.js create mode 100644 gestion_conge/static/gestion_conge/js/index.js create mode 100644 gestion_conge/templates/gestion_conge/index.html create mode 100644 gestion_conge/templates/gestion_conge/parts/modalDemandeConge.html create mode 100644 gestion_conge/templates/gestion_conge/parts/modalDetailConge.html create mode 100644 gestion_conge/templates/gestion_conge/parts/modalModificationConge.html create mode 100644 gestion_conge/templates/gestion_conge/parts/modalRefus.html create mode 100644 gestion_conge/tests.py create mode 100644 gestion_conge/urls.py create mode 100644 gestion_conge/views.py create mode 100644 gestion_employe/__init__.py create mode 100644 gestion_employe/__pycache__/__init__.cpython-310.pyc create mode 100644 gestion_employe/__pycache__/__init__.cpython-313.pyc create mode 100644 gestion_employe/__pycache__/__init__.cpython-314.pyc create mode 100644 gestion_employe/__pycache__/admin.cpython-310.pyc create mode 100644 gestion_employe/__pycache__/admin.cpython-313.pyc create mode 100644 gestion_employe/__pycache__/admin.cpython-314.pyc create mode 100644 gestion_employe/__pycache__/api.cpython-313.pyc create mode 100644 gestion_employe/__pycache__/api_urls.cpython-313.pyc create mode 100644 gestion_employe/__pycache__/api_urls.cpython-314.pyc create mode 100644 gestion_employe/__pycache__/apps.cpython-310.pyc create mode 100644 gestion_employe/__pycache__/apps.cpython-313.pyc create mode 100644 gestion_employe/__pycache__/apps.cpython-314.pyc create mode 100644 gestion_employe/__pycache__/forms.cpython-310.pyc create mode 100644 gestion_employe/__pycache__/forms.cpython-313.pyc create mode 100644 gestion_employe/__pycache__/forms.cpython-314.pyc create mode 100644 gestion_employe/__pycache__/models.cpython-310.pyc create mode 100644 gestion_employe/__pycache__/models.cpython-313.pyc create mode 100644 gestion_employe/__pycache__/models.cpython-314.pyc create mode 100644 gestion_employe/__pycache__/urls.cpython-310.pyc create mode 100644 gestion_employe/__pycache__/urls.cpython-313.pyc create mode 100644 gestion_employe/__pycache__/urls.cpython-314.pyc create mode 100644 gestion_employe/__pycache__/views.cpython-310.pyc create mode 100644 gestion_employe/__pycache__/views.cpython-313.pyc create mode 100644 gestion_employe/__pycache__/views.cpython-314.pyc create mode 100644 gestion_employe/admin.py create mode 100644 gestion_employe/forms.py create mode 100644 gestion_employe/migrations/0001_initial.py create mode 100644 gestion_employe/migrations/__init__.py create mode 100644 gestion_employe/migrations/__pycache__/0001_initial.cpython-310.pyc create mode 100644 gestion_employe/migrations/__pycache__/0001_initial.cpython-313.pyc create mode 100644 gestion_employe/migrations/__pycache__/0001_initial.cpython-314.pyc create mode 100644 gestion_employe/migrations/__pycache__/0002_alter_employe_cv_alter_employe_casier_judiciaire_and_more.cpython-314.pyc create mode 100644 gestion_employe/migrations/__pycache__/0002_alter_employe_email_alter_employe_username.cpython-310.pyc create mode 100644 gestion_employe/migrations/__pycache__/0002_alter_employe_email_alter_employe_username.cpython-313.pyc create mode 100644 gestion_employe/migrations/__pycache__/0002_alter_employe_email_alter_employe_username.cpython-314.pyc create mode 100644 gestion_employe/migrations/__pycache__/0003_alter_employe_cv_alter_employe_casier_judiciaire_and_more.cpython-314.pyc create mode 100644 gestion_employe/migrations/__pycache__/0003_alter_employe_email_alter_employe_username.cpython-310.pyc create mode 100644 gestion_employe/migrations/__pycache__/0003_alter_employe_email_alter_employe_username.cpython-313.pyc create mode 100644 gestion_employe/migrations/__pycache__/0003_alter_employe_email_alter_employe_username.cpython-314.pyc create mode 100644 gestion_employe/migrations/__pycache__/0004_alter_departement_chef.cpython-310.pyc create mode 100644 gestion_employe/migrations/__pycache__/0004_alter_departement_chef.cpython-313.pyc create mode 100644 gestion_employe/migrations/__pycache__/0004_alter_departement_chef.cpython-314.pyc create mode 100644 gestion_employe/migrations/__pycache__/0004_alter_employe_formations_alter_formation_certificat_and_more.cpython-314.pyc create mode 100644 gestion_employe/migrations/__pycache__/0005_alter_employe_email_alter_employe_username.cpython-310.pyc create mode 100644 gestion_employe/migrations/__pycache__/0005_alter_employe_email_alter_employe_username.cpython-313.pyc create mode 100644 gestion_employe/migrations/__pycache__/0005_alter_employe_email_alter_employe_username.cpython-314.pyc create mode 100644 gestion_employe/migrations/__pycache__/0005_remove_employe_projet_employe_sexe.cpython-314.pyc create mode 100644 gestion_employe/migrations/__pycache__/0006_alter_employe_email_alter_employe_username.cpython-310.pyc create mode 100644 gestion_employe/migrations/__pycache__/0006_alter_employe_email_alter_employe_username.cpython-313.pyc create mode 100644 gestion_employe/migrations/__pycache__/0006_alter_employe_email_alter_employe_username.cpython-314.pyc create mode 100644 gestion_employe/migrations/__pycache__/0006_employe_date_naissance_alter_employe_sexe.cpython-314.pyc create mode 100644 gestion_employe/migrations/__pycache__/0007_remove_employe_formations_formation_employe.cpython-314.pyc create mode 100644 gestion_employe/migrations/__pycache__/0007_tachehebdomadaire.cpython-310.pyc create mode 100644 gestion_employe/migrations/__pycache__/0007_tachehebdomadaire.cpython-313.pyc create mode 100644 gestion_employe/migrations/__pycache__/0007_tachehebdomadaire.cpython-314.pyc create mode 100644 gestion_employe/migrations/__pycache__/0008_remove_departement_chef_employe_chef.cpython-314.pyc create mode 100644 gestion_employe/migrations/__pycache__/0008_tachehebdomadaire_statut.cpython-310.pyc create mode 100644 gestion_employe/migrations/__pycache__/0008_tachehebdomadaire_statut.cpython-313.pyc create mode 100644 gestion_employe/migrations/__pycache__/0008_tachehebdomadaire_statut.cpython-314.pyc create mode 100644 gestion_employe/migrations/__pycache__/0009_alter_employe_adresse_alter_employe_telephone.cpython-314.pyc create mode 100644 gestion_employe/migrations/__pycache__/0009_alter_tachehebdomadaire_created_at_and_more.cpython-310.pyc create mode 100644 gestion_employe/migrations/__pycache__/0009_alter_tachehebdomadaire_created_at_and_more.cpython-313.pyc create mode 100644 gestion_employe/migrations/__pycache__/0009_alter_tachehebdomadaire_created_at_and_more.cpython-314.pyc create mode 100644 gestion_employe/migrations/__pycache__/0010_tachehebdomadaire_date_tache_and_more.cpython-310.pyc create mode 100644 gestion_employe/migrations/__pycache__/0010_tachehebdomadaire_date_tache_and_more.cpython-313.pyc create mode 100644 gestion_employe/migrations/__pycache__/0010_tachehebdomadaire_date_tache_and_more.cpython-314.pyc create mode 100644 gestion_employe/migrations/__pycache__/__init__.cpython-310.pyc create mode 100644 gestion_employe/migrations/__pycache__/__init__.cpython-313.pyc create mode 100644 gestion_employe/migrations/__pycache__/__init__.cpython-314.pyc create mode 100644 gestion_employe/models.py create mode 100644 gestion_employe/static/gestion_employe/js/index.js create mode 100644 gestion_employe/static/gestion_employe/js/mon_profil.js create mode 100644 gestion_employe/templates/gestion_employe/index.html create mode 100644 gestion_employe/templates/gestion_employe/modifier-profil.html create mode 100644 gestion_employe/templates/gestion_employe/monprofil.html create mode 100644 gestion_employe/templates/gestion_employe/parts/modalAffectationProjet.html create mode 100644 gestion_employe/templates/gestion_employe/parts/modalAjoutFormation.html create mode 100644 gestion_employe/templates/gestion_employe/parts/modalCreationContrat.html create mode 100644 gestion_employe/templates/gestion_employe/parts/modalDetailEmploye.html create mode 100644 gestion_employe/templates/gestion_employe/parts/modalDocument.html create mode 100644 gestion_employe/templates/gestion_employe/parts/modalListeContratExpirants.html create mode 100644 gestion_employe/templates/gestion_employe/parts/modificationMotPasse.html create mode 100644 gestion_employe/templatetags/__pycache__/tags_personnaliser.cpython-310.pyc create mode 100644 gestion_employe/templatetags/__pycache__/tags_personnaliser.cpython-314.pyc create mode 100644 gestion_employe/templatetags/tags_personnaliser.py create mode 100644 gestion_employe/tests.py create mode 100644 gestion_employe/urls.py create mode 100644 gestion_employe/views.py create mode 100644 gestion_projet/__init__.py create mode 100644 gestion_projet/__pycache__/__init__.cpython-310.pyc create mode 100644 gestion_projet/__pycache__/__init__.cpython-313.pyc create mode 100644 gestion_projet/__pycache__/__init__.cpython-314.pyc create mode 100644 gestion_projet/__pycache__/admin.cpython-310.pyc create mode 100644 gestion_projet/__pycache__/admin.cpython-313.pyc create mode 100644 gestion_projet/__pycache__/admin.cpython-314.pyc create mode 100644 gestion_projet/__pycache__/apps.cpython-310.pyc create mode 100644 gestion_projet/__pycache__/apps.cpython-313.pyc create mode 100644 gestion_projet/__pycache__/apps.cpython-314.pyc create mode 100644 gestion_projet/__pycache__/forms.cpython-310.pyc create mode 100644 gestion_projet/__pycache__/forms.cpython-313.pyc create mode 100644 gestion_projet/__pycache__/forms.cpython-314.pyc create mode 100644 gestion_projet/__pycache__/models.cpython-310.pyc create mode 100644 gestion_projet/__pycache__/models.cpython-313.pyc create mode 100644 gestion_projet/__pycache__/models.cpython-314.pyc create mode 100644 gestion_projet/__pycache__/urls.cpython-310.pyc create mode 100644 gestion_projet/__pycache__/urls.cpython-313.pyc create mode 100644 gestion_projet/__pycache__/urls.cpython-314.pyc create mode 100644 gestion_projet/__pycache__/views.cpython-310.pyc create mode 100644 gestion_projet/__pycache__/views.cpython-313.pyc create mode 100644 gestion_projet/__pycache__/views.cpython-314.pyc create mode 100644 gestion_projet/admin.py create mode 100644 gestion_projet/forms.py create mode 100644 gestion_projet/migrations/0001_initial.py create mode 100644 gestion_projet/migrations/__init__.py create mode 100644 gestion_projet/migrations/__pycache__/0001_initial.cpython-310.pyc create mode 100644 gestion_projet/migrations/__pycache__/0001_initial.cpython-313.pyc create mode 100644 gestion_projet/migrations/__pycache__/0001_initial.cpython-314.pyc create mode 100644 gestion_projet/migrations/__pycache__/0002_alter_domainederecherche_options.cpython-310.pyc create mode 100644 gestion_projet/migrations/__pycache__/0002_alter_domainederecherche_options.cpython-314.pyc create mode 100644 gestion_projet/migrations/__pycache__/0002_alter_projet_budget_alter_projet_budget_rh.cpython-314.pyc create mode 100644 gestion_projet/migrations/__pycache__/0002_documentprojet_dernier_alerte_mail.cpython-310.pyc create mode 100644 gestion_projet/migrations/__pycache__/0002_documentprojet_dernier_alerte_mail.cpython-313.pyc create mode 100644 gestion_projet/migrations/__pycache__/0002_domainederecherche_remove_projet_domaine_recherche_and_more.cpython-314.pyc create mode 100644 gestion_projet/migrations/__pycache__/0002_projet_volets.cpython-313.pyc create mode 100644 gestion_projet/migrations/__pycache__/0002_remove_activiteprojet_livrables_and_more.cpython-314.pyc create mode 100644 gestion_projet/migrations/__pycache__/0003_alter_domainederecherche_nom.cpython-314.pyc create mode 100644 gestion_projet/migrations/__pycache__/0003_remove_documentprojet_dernier_alerte_mail_and_more.cpython-310.pyc create mode 100644 gestion_projet/migrations/__pycache__/0003_remove_documentprojet_dernier_alerte_mail_and_more.cpython-313.pyc create mode 100644 gestion_projet/migrations/__pycache__/0003_remove_documentprojet_dernier_alerte_mail_and_more.cpython-314.pyc create mode 100644 gestion_projet/migrations/__pycache__/0004_delete_plan.cpython-310.pyc create mode 100644 gestion_projet/migrations/__pycache__/0004_delete_plan.cpython-313.pyc create mode 100644 gestion_projet/migrations/__pycache__/0004_remove_activiteprojet_livrables.cpython-314.pyc create mode 100644 gestion_projet/migrations/__pycache__/0005_alter_livrableslivres_nom_delete_livrableattendu.cpython-314.pyc create mode 100644 gestion_projet/migrations/__pycache__/0006_activiteprojet_motif_changement_budget.cpython-314.pyc create mode 100644 gestion_projet/migrations/__pycache__/0007_alter_domainederecherche_nom.cpython-314.pyc create mode 100644 gestion_projet/migrations/__pycache__/0008_remove_domainederecherche_id_and_more.cpython-314.pyc create mode 100644 gestion_projet/migrations/__pycache__/__init__.cpython-310.pyc create mode 100644 gestion_projet/migrations/__pycache__/__init__.cpython-313.pyc create mode 100644 gestion_projet/migrations/__pycache__/__init__.cpython-314.pyc create mode 100644 gestion_projet/models.py create mode 100644 gestion_projet/static/gestion_projet/js/creation_projet.js create mode 100644 gestion_projet/static/gestion_projet/js/enregistrement_bailleur.js create mode 100644 gestion_projet/static/gestion_projet/js/enregistrement_financement.js create mode 100644 gestion_projet/static/gestion_projet/js/index.js create mode 100644 gestion_projet/static/gestion_projet/js/liste_documents_projet.js create mode 100644 gestion_projet/static/gestion_projet/js/suivi-activites.js create mode 100644 gestion_projet/templates/gestion_projet/ajout-financement.html create mode 100644 gestion_projet/templates/gestion_projet/creation_projet.html create mode 100644 gestion_projet/templates/gestion_projet/index.html create mode 100644 gestion_projet/templates/gestion_projet/parts/creation_bailleur.html create mode 100644 gestion_projet/templates/gestion_projet/parts/liste_document_projet.html create mode 100644 gestion_projet/templates/gestion_projet/parts/modalAjoutActivite.html create mode 100644 gestion_projet/templates/gestion_projet/parts/modalAjoutDocument.html create mode 100644 gestion_projet/templates/gestion_projet/parts/modalAjoutLivrable.html create mode 100644 gestion_projet/templates/gestion_projet/parts/modalAjoutProjet.html create mode 100644 gestion_projet/templates/gestion_projet/parts/modalAnnulerActivite.html create mode 100644 gestion_projet/templates/gestion_projet/parts/modalDetailActivite.html create mode 100644 gestion_projet/templates/gestion_projet/parts/modalDetailProjet.html create mode 100644 gestion_projet/templates/gestion_projet/parts/modalFinancement.html create mode 100644 gestion_projet/templates/gestion_projet/parts/modalMiseAJourDepense.html create mode 100644 gestion_projet/templates/gestion_projet/suivi_activite.html create mode 100644 gestion_projet/tests.py create mode 100644 gestion_projet/urls.py create mode 100644 gestion_projet/views.py create mode 100644 gestion_salle/__init__.py create mode 100644 gestion_salle/__pycache__/__init__.cpython-310.pyc create mode 100644 gestion_salle/__pycache__/__init__.cpython-314.pyc create mode 100644 gestion_salle/__pycache__/admin.cpython-310.pyc create mode 100644 gestion_salle/__pycache__/admin.cpython-314.pyc create mode 100644 gestion_salle/__pycache__/apps.cpython-310.pyc create mode 100644 gestion_salle/__pycache__/apps.cpython-314.pyc create mode 100644 gestion_salle/__pycache__/forms.cpython-310.pyc create mode 100644 gestion_salle/__pycache__/forms.cpython-314.pyc create mode 100644 gestion_salle/__pycache__/models.cpython-310.pyc create mode 100644 gestion_salle/__pycache__/models.cpython-314.pyc create mode 100644 gestion_salle/__pycache__/urls.cpython-310.pyc create mode 100644 gestion_salle/__pycache__/urls.cpython-314.pyc create mode 100644 gestion_salle/__pycache__/views.cpython-310.pyc create mode 100644 gestion_salle/__pycache__/views.cpython-314.pyc create mode 100644 gestion_salle/admin.py create mode 100644 gestion_salle/apps.py create mode 100644 gestion_salle/forms.py create mode 100644 gestion_salle/migrations/0001_initial.py create mode 100644 gestion_salle/migrations/__init__.py create mode 100644 gestion_salle/migrations/__pycache__/0001_initial.cpython-310.pyc create mode 100644 gestion_salle/migrations/__pycache__/0001_initial.cpython-314.pyc create mode 100644 gestion_salle/migrations/__pycache__/0002_remove_reservation_motif_refus.cpython-310.pyc create mode 100644 gestion_salle/migrations/__pycache__/0002_remove_reservation_motif_refus.cpython-314.pyc create mode 100644 gestion_salle/migrations/__pycache__/0003_alter_reservation_statut.cpython-310.pyc create mode 100644 gestion_salle/migrations/__pycache__/__init__.cpython-310.pyc create mode 100644 gestion_salle/migrations/__pycache__/__init__.cpython-314.pyc create mode 100644 gestion_salle/models.py create mode 100644 gestion_salle/static/gestion_salle/js/index.js create mode 100644 gestion_salle/templates/gestion_salle/index.html create mode 100644 gestion_salle/templates/gestion_salle/parts/ModalRefusReservation.html create mode 100644 gestion_salle/templates/gestion_salle/parts/ModaleAjoutLienZoom.html create mode 100644 gestion_salle/templates/gestion_salle/parts/modalCreationReservation.html create mode 100644 gestion_salle/templates/gestion_salle/parts/modalDetailResevation.html create mode 100644 gestion_salle/templates/gestion_salle/parts/modalListeValidation.html create mode 100644 gestion_salle/tests.py create mode 100644 gestion_salle/urls.py create mode 100644 gestion_salle/views.py create mode 100644 manage.py create mode 100644 requirements.txt create mode 100644 static/css/bootstrap.min.css create mode 100644 static/css/styles.css create mode 100644 static/css/tabulator_bootstrap5.min.css create mode 100644 static/css/tabulator_bootstrap5.min.css:Zone.Identifier create mode 100644 static/img/cerfig.jpg create mode 100644 static/js/monprofil.js create mode 100644 static/js/rapport.js create mode 100644 static/js/sirh-index.js create mode 100644 staticfiles/admin/css/autocomplete.css create mode 100644 staticfiles/admin/css/base.css create mode 100644 staticfiles/admin/css/changelists.css create mode 100644 staticfiles/admin/css/dark_mode.css create mode 100644 staticfiles/admin/css/dashboard.css create mode 100644 staticfiles/admin/css/forms.css create mode 100644 staticfiles/admin/css/login.css create mode 100644 staticfiles/admin/css/nav_sidebar.css create mode 100644 staticfiles/admin/css/responsive.css create mode 100644 staticfiles/admin/css/responsive_rtl.css create mode 100644 staticfiles/admin/css/rtl.css create mode 100644 staticfiles/admin/css/unusable_password_field.css create mode 100644 staticfiles/admin/css/vendor/select2/LICENSE-SELECT2.md create mode 100644 staticfiles/admin/css/vendor/select2/select2.css create mode 100644 staticfiles/admin/css/vendor/select2/select2.min.css create mode 100644 staticfiles/admin/css/widgets.css create mode 100644 staticfiles/admin/img/LICENSE create mode 100644 staticfiles/admin/img/README.txt create mode 100644 staticfiles/admin/img/calendar-icons.svg create mode 100644 staticfiles/admin/img/gis/move_vertex_off.svg create mode 100644 staticfiles/admin/img/gis/move_vertex_on.svg create mode 100644 staticfiles/admin/img/icon-addlink.svg create mode 100644 staticfiles/admin/img/icon-alert.svg create mode 100644 staticfiles/admin/img/icon-calendar.svg create mode 100644 staticfiles/admin/img/icon-changelink.svg create mode 100644 staticfiles/admin/img/icon-clock.svg create mode 100644 staticfiles/admin/img/icon-deletelink.svg create mode 100644 staticfiles/admin/img/icon-hidelink.svg create mode 100644 staticfiles/admin/img/icon-no.svg create mode 100644 staticfiles/admin/img/icon-unknown-alt.svg create mode 100644 staticfiles/admin/img/icon-unknown.svg create mode 100644 staticfiles/admin/img/icon-viewlink.svg create mode 100644 staticfiles/admin/img/icon-yes.svg create mode 100644 staticfiles/admin/img/inline-delete.svg create mode 100644 staticfiles/admin/img/search.svg create mode 100644 staticfiles/admin/img/selector-icons.svg create mode 100644 staticfiles/admin/img/sorting-icons.svg create mode 100644 staticfiles/admin/img/tooltag-add.svg create mode 100644 staticfiles/admin/img/tooltag-arrowright.svg create mode 100644 staticfiles/admin/js/SelectBox.js create mode 100644 staticfiles/admin/js/SelectFilter2.js create mode 100644 staticfiles/admin/js/actions.js create mode 100644 staticfiles/admin/js/admin/DateTimeShortcuts.js create mode 100644 staticfiles/admin/js/admin/RelatedObjectLookups.js create mode 100644 staticfiles/admin/js/autocomplete.js create mode 100644 staticfiles/admin/js/calendar.js create mode 100644 staticfiles/admin/js/cancel.js create mode 100644 staticfiles/admin/js/change_form.js create mode 100644 staticfiles/admin/js/core.js create mode 100644 staticfiles/admin/js/filters.js create mode 100644 staticfiles/admin/js/inlines.js create mode 100644 staticfiles/admin/js/jquery.init.js create mode 100644 staticfiles/admin/js/nav_sidebar.js create mode 100644 staticfiles/admin/js/popup_response.js create mode 100644 staticfiles/admin/js/prepopulate.js create mode 100644 staticfiles/admin/js/prepopulate_init.js create mode 100644 staticfiles/admin/js/theme.js create mode 100644 staticfiles/admin/js/unusable_password_field.js create mode 100644 staticfiles/admin/js/urlify.js create mode 100644 staticfiles/admin/js/vendor/jquery/LICENSE.txt create mode 100644 staticfiles/admin/js/vendor/jquery/jquery.js create mode 100644 staticfiles/admin/js/vendor/jquery/jquery.min.js create mode 100644 staticfiles/admin/js/vendor/select2/LICENSE.md create mode 100644 staticfiles/admin/js/vendor/select2/i18n/af.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/ar.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/az.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/bg.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/bn.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/bs.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/ca.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/cs.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/da.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/de.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/dsb.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/el.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/en.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/es.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/et.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/eu.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/fa.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/fi.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/fr.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/gl.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/he.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/hi.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/hr.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/hsb.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/hu.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/hy.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/id.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/is.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/it.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/ja.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/ka.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/km.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/ko.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/lt.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/lv.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/mk.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/ms.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/nb.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/ne.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/nl.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/pl.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/ps.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/pt-BR.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/pt.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/ro.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/ru.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/sk.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/sl.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/sq.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/sr-Cyrl.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/sr.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/sv.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/th.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/tk.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/tr.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/uk.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/vi.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/zh-CN.js create mode 100644 staticfiles/admin/js/vendor/select2/i18n/zh-TW.js create mode 100644 staticfiles/admin/js/vendor/select2/select2.full.js create mode 100644 staticfiles/admin/js/vendor/select2/select2.full.min.js create mode 100644 staticfiles/admin/js/vendor/xregexp/LICENSE.txt create mode 100644 staticfiles/admin/js/vendor/xregexp/xregexp.js create mode 100644 staticfiles/admin/js/vendor/xregexp/xregexp.min.js create mode 100644 staticfiles/bootstrap.min.css create mode 100644 staticfiles/gestion_conge/admin.py create mode 100644 staticfiles/gestion_conge/apps.py create mode 100644 staticfiles/icons.css create mode 100644 staticfiles/styles.css diff --git a/SIRH/__init__.py b/SIRH/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/SIRH/__pycache__/__init__.cpython-310.pyc b/SIRH/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c3d634d3c5cd2a8203220a16ca15384d05c8297 GIT binary patch literal 126 zcmd1j<>g`kf;oRbWPs?$AOaaM0yz#qT+9L_QW%06G#UL?G8BP?5yUS={fzwFRQ=-o rqSPGyV9y{A2oWEjnU`4-AFo$Xd5gm)H$SB`C)Ez5wU`M=urL4sRuUOB literal 0 HcmV?d00001 diff --git a/SIRH/__pycache__/__init__.cpython-313.pyc b/SIRH/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e48fe1b4bbd2384fca14bdf38a77a021266c7705 GIT binary patch literal 149 zcmey&%ge<81ho%8WPs?$AOZ#$p^VQgK*m&tbOudEzm*I{OhDdekkl;`XRDad;?$zz z7)Ku;1;>*7s2G>j;_Q2KczG$)vkyY UXb8xXVi4maGb1Bo5i^hl0FUS*p8x;= literal 0 HcmV?d00001 diff --git a/SIRH/__pycache__/__init__.cpython-314.pyc b/SIRH/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5c536a71c0c3b18b69a9ea73382d1778c6ae401 GIT binary patch literal 145 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 literal 0 HcmV?d00001 diff --git a/SIRH/__pycache__/settings.cpython-314.pyc b/SIRH/__pycache__/settings.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20060b0cb71a76ded20d61a6d4547f2d468e17a8 GIT binary patch literal 3231 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 Oj*0y1`_o{r{qYA`7S7H9 literal 0 HcmV?d00001 diff --git a/SIRH/__pycache__/urls.cpython-313.pyc b/SIRH/__pycache__/urls.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e144e3544b843110be33559371a6ddd609451266 GIT binary patch literal 4185 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 LZ6{kJsUQCbzTr#l literal 0 HcmV?d00001 diff --git a/SIRH/__pycache__/views.cpython-313.pyc b/SIRH/__pycache__/views.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..375885f06c5c187ae07f4145afdad1983accbabb GIT binary patch literal 30001 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 Kf@LootN#xQ@#}N| literal 0 HcmV?d00001 diff --git a/SIRH/__pycache__/views.cpython-314.pyc b/SIRH/__pycache__/views.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6eab784d96d5dc83ca4c21cae2c4cf3e784657d7 GIT binary patch literal 1840 zcmb7F&ube;6rTMdX)Vc?j9fd7T|B8nY+7)sCfYceU!w ztke2nR47E`;^Y+fR3Gbm554=^gNy_Ti%UXl2)%{6e?Z@?w2oW|Z3gsa=FOY;z4!Ke zqs6h&B!cnLi>LN@452^7CK~c!ar!YVTIh3RNNcDlaj7VCxu|euR_Nq4wHV{EVw}gr zy|R`lYFwK|hB}4#h!F#sG~#n8pZHTa%qv0K^m&~$xLq|l31W^{vl~GiCeP=2Ifzrz zum}w_N-Ud_D$h%S<`Txt8evsw5S5tX@KX>{Pty=<3zbo6=rCFu(g&X*WC8e$u!ypX zj$tlA=Kmgse0_k_l-}T$a&}8DOY;M#)<}pgNBi1kv9E~e!%@M52hq-= zN-8=7eJs+?p~`5azblnxBfbRn5TmJ-mCgT)lZgDi9;d97#`>OzDZ}O#sp5!g z!h#V8q(d-0{23(SIJtFrKijvVEyceA{uzHbmey9h+kA`3%4ruGUSr$@J}H*dKbGyACvm z<}*SYrb_}%c(~_L%hw^*b8ikZd5%g8cN?@T=Co{C!jK` z+}_mjir3(xq+E{Mud!LL9S`7vR31!Ej6t}IvX2u-C} zs(eD&SKMn>Zmk)`A+cqXdrWVB8}uu+A@+0%Jczbtzk+C?mr0~$?(clJvp3mG%s$Od zJx)JLKgr^wEZ(2&W*6GAr@4!d3y%scV~B}y)$I= zX)kS@Gdj^m+qIrHbCQ|rT+q9js~zp?NoxGz{9d7(TIi??r;rai_X>&{hp(XEK?_yR zUdS?vItBWA@Gc;D#Um}e$+9n6_^eH=!-L^Y0WJ*jNe{nXUZ$e1{f{V7(UwdgUZIm9 zgRDi)JoLZBMNq#htR_IT(21ICFMWUWIF)<2+D*-L)ERmK4%YLjAZLAPHfo*@4mh>H z(8b?G$e=!L1T6UP+pxMvdDZ8v&oe=(VC?+;kc}Y`sEFYJg+Toa>*qds&g*2`~Qx6jPlA literal 0 HcmV?d00001 diff --git a/SIRH/__pycache__/wsgi.cpython-310.pyc b/SIRH/__pycache__/wsgi.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f6e8a526cfdd20b1526fea1f0e46680faeb3713 GIT binary patch literal 523 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⪼^)+M}0#-+Q*3#&pwI}2ozwT&EE;^AtEWp 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�B7)jzKF_`yD9unrWExKm8S{D_`)F;jOjsU3iVHZ**VVg=Z9=>MEG^4(cyTW*Vp%DgYT9tsN80bj^3NtGZHReL!_q)a=DO zLVMZ~1^Et=sjfJ70qBQwL&l=1c$Tg7Z1Y%D)(hNMI&V<|LCh)fmEZHC)-9ZjYZ~_B z0SeZK5OL4;Mn@B{2tYKis-g!VHydYlQ7a^+exTw4)J+j{2|U$ZT`OMF3M2~%wcR|{ z2E2@`!6Qh{79a=GydKKp8@6I;Ipl^&wJJP^&K=aOsL(e3)qGm&Bx@mKoJr?}t+DWg z(vbR`U?6A!^T*@G+K*0CA7= zSC(6uX>3n8Z*^C4w^UiKRTlcTmdgp#%a}}Opoer?oO>ZyBV8p+qIPujD~HSD^>&X(#N_wUe;nTGc4?E5RM6G5^+XD+aw`=b zILJ1tnXh5THJi9oIvkL${xPIuC`!^LVI5ROwr70o9no~v!KVcYR|A@PZG~Uv7C7f2 zH$pzml{I@d+$(B&rn#eahNP?muIk#JOVw`_zJL9e`uxgL%O;wxuvcRcm(xV)i#K(lrPneTWqm# zNvYt1w>&#HnNQ`o=hOS9;}w;5RCr$%+hnucq=aNO$7KZr-r_m_tI>Q-;lonjiH)R@ z*<|c?qxqOWMbL&zM-L=A%7ZP?J-{A&D&4&d=WmKM7 z4!}5ecV5TAel1puJXEyS`bP*xl3Lx$@Y{ipFE=@;3GgwGl5 znr4eUg0TKHXg}>Mh~2)XxBf)ec#p)Vl+7RVDjz;CWWzju$`j*7`@BZtQ~v`(T;F#mf3-I=&ZblJa;5VadW3|L_f^_N_|bL# z(pR2y$bRX6v{l_Fkp0y^n$GGPo4p-2(mNRHuVhJiMdPp45;sh;xy?IZ?iEX+Yo7NE zFdxf}kOPTrgPiMwiR|N?#HzTOVHXeTSh=D|3~u?mD%oIeklpol3R)}ey1u8%rmAMK zxof%o5w*0~9$;u0++_@77wOT*kmCxu4p{M&3mIn zRU$9plG892Jmn8lGxTYGT)8!MR-zoz3s996Gd;V6QALnQ?_L)h&)G!hmr0x>E%eW; zovd%E&N#;+PqJhn45wa-7+*B4jg859%SUtBZ0W70(QkBPKNnI7bB883tA46`HKKyW zAfCOhmbIfSfrBNZ-Ct5&t(DU0_-8b^*&wEMIXs?4x`~Q5thnP+U&2WKV!cWV3wy>* zKK}qkKfqg9Gw`~;fkO{=c_Fo)L^(*yQ5>T`qV!9J>e*>yoNW(~x1et|jjjHW94Bd= z(A8Kf80Pn2-9lR{&6)210D$lMRB~Bm>jC?PZ3py~;HUDlRDaSHtta$^;To4|Wr{~1 zc7!(&zdG>AM`5UtofOg^&7B17soMivJI_!^+;U#ECyo}cg_Kd)^cOP?aR3ajD3+kq zPb}`nUhP|Kk(a}xz*4`+Es{1p`k?BbUhicf^_+w?NF#jUB`*%IfK!$;4r%17E){Q( z7V;kGnxNuI4?n7;s+`4;?2*+P7cbfBztP&KE7Udg9o#y1cv{*8$3RtRJtN#FXM(Uu>sjRLIKQf&R zoy|*L9?^`b_|j^BVoe>0Mf3sc3{xpy3c5siT?#s1_W6n+16~4{{VL5EoPR?h zBU3InRg;fVN4h}qk<=jPZZLbGS{lmAsB#dk%US^FtY#SqCotrzLc#2OCk+DzTGDZy z){YoNO~3&yfZLkxzjSVTC~*TB!cCE`IO>?`HaJi>Eq0{_2W7p&X_x|s^>-ftD@gYew${c#8-v#-c|3IeRa%>M7%` zf=DF|Es?k&_FpgY_XkvP*AdA{6i$2+mq`(8N&78$GW|0=;kz?XN@9CRH~{rlHScX* zHmIBfne4eq!nexoc{bVKzWRm&^?wY!Ahz8tb5DDcrL`oM`AvSGFW-KDbiPwf4&vl- zo{tizxBzrG;lS>UWoUQiMR=jWRh$RJFNlZBM=!1^Pv&o5(PnAth5>H<*Bc}cO@}q2 z^|fPB-4hi4Y22!4r4K0TXJCVrzO-ph&_wk9XeSFla;1EEA*E|6+{bgyQ|hhkou4k~ zfoQ-|)%kDI{ff7xsSaq}S6?kNQq8V5k}`?3+in#R7q${w(a#8!8x`F{`xdd(d!i$% zck?QrG0`}&<3qvZRPo8!p>VHDQq`j3Dy)nXvWB__Ou|MogJhaIsasQ);HVNRUr!@u z4Ih~7rk0YniJ{U!Lk{8C=B#3gl2kW2!Tp!8aD|GR>p<8lV~$1^;1>Ds zp|5O_Zg8`lRLn5S(Y_YUGyRxzW4)Q`+Tjyk(0+=7s%O-1ox3Ted6fEzOb}}2$!Tar zJlPBo6M(L$smpP&L(@~9-BryjBy$K$Z$Y%M;Ab4wj4Z%V!5Iw*sKMD-6iC1@y1E;H zxQc=5hH5?6GJB-$lX6s|`k@kY%`Ep#E*af$xM4~sRCUB*Lg_Kpbi61WLX;0wDu?=U zl7aIMtZF~1l6iJJp&KS%r2!<1IDV(~RuR2cLn0(ir9!%f8Af+p_<#;Ff_*?8R4=Ir zqDn13Aa_gRM|Dy0e(4&&aEzXKTl`4wf~|#>3~@L<$U##J=3LpH2yebW`(9||~c6(irM#Xw1j^q4h(&**&RKv5g{Jqvq zq-w}kd_7d#ebtgX`ndsX{{YEOgE8h(^suUf4sgZ?Pj#5T4HVDF)q%-x?lkQH>CThB zRz{}Z@s-iQGFzWk-4$e7Hez#rs_R5y<%@>{<39PR4 zMkN{Y+5F=wvdchgYT|3M7}l4#_6nzq=9=qNZWK>*scD)b4adsfrCFCetx@j$6KJA! zqv9nZdFC3QBlmGCA!etB;`hWF8oUP8;$7a&rUN_7e1Tiu9Pt^ouWy*}T;sk`$13rh znPPWmrq3^s!=wUIrl@?4%aAlz2&&ttkU>U1rU;vmKvU6aHRyY(AgzqG?P(-0F!3Y8 zh;GojSYvBsBbWlpPS{J!;iru|V6eMMAq86`kA8;kdJgFCFLL0gqM#E;Q84-0 zxCwauHe@lCwGvY~&6Xn2KXfcKqU%`}lv0l?#$N`LpzkJ@|1$@6TqwyUU@4Rf-wk~D%* zcFLm+z&N3tbXt+PmO&uGsjDV89CA{@Rva>-sgqh%V#g-BjfSYZVpXJW)X!x?%<5M( zj?8!}NRR@$#2n0HWkEYjMh_*atdCoHEcIk(vN$#jkw;S9)RyPE3AF=_)8>y+O^v(b zk|I&Ox73N?X(uNbQdBg!9CTFtJ5j88Zsa)?q4LApcjlD+7@mrf*JE@unspUzB|aQl zgmo{d^Ziu11x1O|5iXS|c1TU~b-yZKC^wN)sdRJfku7gMlb&?2xDJRxs#ce0?1&o* zW5b`Px9*>ShRFerXWuBM4Qw-{+H)k3YbtsZC2K;(g* z_d`4el4901`?Ea4Z&fWB<8d!I`-G^xMB!J$#R z={sQiudDbj`fU|0wN%Vs1c&h4*>x35n&G;&r>;9>th*`! zJyh(i!Pt}|doxb@cxxWdFainRE7JHwhwbm8(iq(1mKTsx)}K$SlG$*_6~2a6vPTfo zaGQc@J(+oMa*f1~#IFw~ZmRkw3^3%eqnh(5rgRT`d*27w3j0(tlb8z{bjfZ$z=iH1fict-|X@ z$=Fvwh>eqQq)c|o1Vr|z)Up)`I6^^>QI{MiJ>#;8$2mlbv@%IFg#nx0c2IDId-SMP zif3dLGYHqsc3FlF=w`nT&Q*ggmW-4$n(L~u%>m~oI&7*X20Ey?sNE?&P^7r^UCCC9 zqHSL5t$81qs76XyJ=NJLoJw=dr-^swh8YR%1gT{c>-SQ(Bl97*_fN{IE`pgRI;oi{ z2P2-r0@q zzB7})#4CH$&viqe<`$fCJeF+ptsPDhlLD=)Y`G&N>Z&GxKk-vdJKRpJ6WnrDvb?$5 z6`nqwTA`AYtLDmlP`Xmxz|?k3Yjr#W-CxenxmYxY4&5L= z5>V9RIc|4ekz$#ZOlWZf=&BO>V9ytAn@SsxoggFpR`$&)Z8$jSu$Fol*zH8Ej5SP# z0L?(B#Th3WEat7$ae$d(T%bCss_7c& z$oQ^~I zMB(t^O6}IBws4n&U+Yjm=%;DVMAxxVU{W(GHn4|eb48Xe2)(ygMHUot8~~0j&$_Op zX$4zC-Cv?pY;01hAY?~7gmp8zE_qvL3ycM>LqUYf0cUkdaF5wujpJ2!25p=xfpSK2 zR&IW(BHqZEnspwVsQoP);TSX-XOzKH+!eK_cBV9t7oIk$k+={;Nba;&%j|AoW269& zbPhIJbZI2P=nziRsO%7~yF}thk)$CVb7rIK2pj@){T6t_aNMN2-e`z%%>*HXJgGtG zQJ740deGTaN94Ov+tblc6H7wsc2u&)9Jj6ux~jVCOP^I7)dapRJ0t4eTNAeA6YX`a zx>3FtU`Y|i3aJoa{5FPcF|fj69%jkHCpE>c=DHh&arA(3uVZdHsvaS+$8e0u)_SqYGBc(xBy96e7`_YTAC~Q^>CO*Ay)HM$6P`hxJDA)%WTRIhi|I#>h2hIHm9(hA67drt}5WAd4tk+|V*RETqu72NsZ0Y}()G zDw3-Y#&*KFf~4rqR%$nfJ2_SmRe%QSnj0B@&qU!KGM3L+*2v;wBrkig-r~AZwC604 zeyilT>Ya^=UZvq*7d|O|23MZVE-ObKccycBxKdq^AC5c#+F2#N(K7@e#Axg8ylg$r z>%Ud?#~n7FyNBvL)`t%$^yYBBPpzl;TFDp=aO1F3ks9zX@%fuwS;zz2M#%O>yIeNk zDhhV$AoNFu;y~I(IwO z8;HRx*XEEIvM@I0wnes%22Dzj3GvH@86`7rF|-L`Jcs5B!{dJ=*srEMP19Lwk{u%? z74s!iT?Jd?(~J_4niaFF!O3x^8y!(^Rb@dbCv$~MOw#p#YJ*#b0vLK}$)NEGk)b{+ zV%PFkFj5fF=_+Q^dbuu~V!E8U$=MY=8*)ZAFghnPEgclWikhKnOpUEh!giblkc2l1 zC-YODN(b{$gihT>AX2ELLJFbg%ex0D0o$6mijpIAO)cG3)vz?3m9&xuwNqSb z0VfFB0Y9R$XW)^QADE(ih0ZBsJreAEbQ7yQlay@wDf9$MmT(7QcLh8Ikpo8?kerg| zzEx2Y5#31Bg&RoEJ&Ngbaq|p?ET*WFDP=@u9mn`3=8k%S`>O}CC&=oZtP_CJ$ zC6dMu({*=ptdgom$%#t{01`G-b+T!B1-q;{TW-$(02V4MMKrTD#|#bwJdpEhZus39 zQKg4qh0y68lhdM@_vraO6WFO`t*(k8zNdhFmWPVChRsQ$$|&j`4JiTS5Z^J~K~3RW z5k(bM%0O_&ojK)@vll8y%`B2UlJ}BwJFQ(>M=vbzC!u4E?DTBY1(HUOcYuFXRDLDC zYDdviTj8RO=hr5;IsX7-fInrCmWolxW9Wl)FQR<5l8@!IDj2DhRaBZKE@)QPYn+shZ#)GN{BxuY`77&3 z231^-q&PH=ctaPl&PgqoR9s%>Hx45m)vO#|99x%+XPN=N7fwL@M-%Lerttbo969bT zAm;@=N=7V>2G54;O>2XPsC^c}_Xwz|iPYV@tOX6q8yq4c;KDuD3y(Zbbu(mw2?=** zl<2S7mTtePy5mn1Y3-4_Ow7~nxRukE12=i9E#jg zc&`&9AI0pAt8o0$Nuj6gvOF8KbTINMQ#2NPGjCi$1v{P_N#=QzP5EPte8it%uDDv` z9p8#;s_B9FV<}`u`ylDc^Xrd_7t7@&*86=uEvDTwboo%XQ`|diTMrE*Wh)~YA>Fgd zYvbdipUlkV6Wr-!ca#9+h!4)eR?$jb7)L|9wptm=h+I+Ub=epI$ywS}yHITUagCR5f|wT~k`a;j?Y8XA2;R#(=@ z>4|CfRWq6D8~K86f}pzoBoOB=3b*~Vl00cBSJ~yL=fB-KmH`>{Fk{(E1;+g~HXb0W zu4YLf9;-^$JExt{vJAm$dZ?>Fv}Ibx^g<%bEzrFp9K7-dz>2GNvqgo4yd* zfgHEWt*}=~Lo=ve*FHC#v)dg10LfWNFpb#JgOsleO3vXm!y^gA-~`ua8!P)FGCW(u z5nSnKiP39o$5rHsi%v}tcTXu zH8DL4aoKOfw-?y1EFih`^X>@cg=OLg3&nP%7n)Xr@Xy6-e=|Feb>|)*aTvW)zRO!6 zhPs?+8jkDKI5zI)87)BYt-BM;$u@HBK~rNd>rFEWTTaaC2AA{w46VwhO!DG2$X~oG*Fs zruxg>k`}o7nl!k3qC89C3Tx$(cRD>%F@%B^sXoy;TxtAy8S;D+X&lvr4-Rn7_*HYl zXzJyG+ZH&4Wh1q3g_0_cyq)aaa24J5n~-R60mo(Z1r^n`7UsM=B(;3MW}J(JdUwI< zz1N289O?iaoMWQhg(h*iQK>eLaSKIUZ)=x;ah<5rT%RLH%vaD=e!W>)&PlLcI+6{-kd4z^hF$=k#y^s3dxpt~Xe&5=su%kwl+{5HsH9TJ zqLEintQtohMK{gT6XYFKF9h=4T3fIrtd4q|HB(hPURA8DByOuJTYz$juv9iz0qRq+ zgs8?fB4PP*md2s&kJ(M3CSxIRyai~pn892m1Haqdaq_o2{R-tg6&2F98Ym^GmB#^* zw7JCn2P9Slk`vrp{{Xsiu z+$RHfNN~`8idYVAj|Q~aF4yO_J8cy8JK#C2A-}0x>mP!Z@)0HCt&ug`nBy5Z?Un72 zP(eo+ik=vtU>FUIX&NG)g`>=4+WhuJU0(g# zbC(JL@%|q{FoI@!oXw)NLpB4N$#v6hB>jEZkH@ct%r}0;(7hM zgl3wlqmy&G-7|sU_;B3-oO4!mv{1n&yo{@cR5wNf418pe$#XwOE{}lXZC0m719f&@ zk7TpKO$%7qfEeb3faTd&RMKQ&GvSKamU-nO!YX)L-~$Kfpt#UA@wkQ#N_uB%aOSKV z7o5@v=Au-@xk;Zrc$-Udreo!&X$=d;r;YUz$oZr%cO~`*7;w`r6tcI=&fS;HoK<0x z&2^Fo$Dyt{Zh4e)rXDF&wqxHWCB%y4R1ZivKluw7|D6VS`-jhe0zweIA}cZl;oQ=D738w$xzm1 z3pHDCcftp7+fczH|_EY9B<7P#($w+W=rT!~0+bdBg4Aac-Q_tw3{{Uktzw;iBIV=fa zZJwr*NhOd;B$9*@<^t+U5MkLvGcpv;=A)36c0#sCNlQ}=L^#zMAcOp;nz^bG*2LPH zY(0ml@7V%a9ku~g?~WcyBar{{VY|piIzrI9`Ksw?TEGl8ULJ@yH0l-FOu(HCKfEZ0KLB_+?o* zC*=WM*-akx55sYth4gc{Ytymn*LPkK#&!y;eRW5h5p4ANY@-`W-j8pw-}GLsM^Y`- z5ZBPSd^E&3=aWxmVaHrN-YB#-<3hmt+IF0@59=6zFV!K(_CFRzmWuBO3{|{3Jir}; zfH9O0iGBpoaWfrXX2l(T3y2>ihuux!+$NGLs2Cn1^ECkNw0CcOh3gt}-6Lcy3r zoyc48DpqoNF5Lr9Auc04)n&p4Ox$22W_Tp!11rX)=B*iHCY_@_KM%3fYtrA*5e2oB z+lGZ?`7og*o@%3wA@4J4h}_YRNNGmp5b}3J$cgwZHV%2D06EI*hy^vz0BnWr1V-YR zPRovwG17WU8Vqsdn3?Au>z-n&3$WP~Pu+G&6LY8{qQ(#pG}p9aV4iud6N7@K1whh( z)|`b!aGj$dcUJY&`Eiqt{;MxvP~4JTobQ~0gbbn4xH;KGvO$kz+Z~GYf0dN>nhJ`! zTyf}TK>D6b)i`VVJKn1cCBIj)h7v!irvdUGx!DYvU6MS(v;IT#AC;q-`VM7jID5ms zDB_(iptj1$3Bj6i<*~nW&-7nG@W+MREy9gssco#DsDJepUx@Sc&UF2-wR(U6U|@0> z*nN;W0Xd#O!{5>B-AV-fMO`IqjXCn7K3rq!M(6cjnP{-uY!C>omilTi20sabr}gGl zk$BG`?YAWv#&%O;T!uZx&dDU7bka|9y6w3Ff4j{`Jh9V8Uo?$t2RENcA9AT%1-%Hg zDBRt~3C}!ZC1bDNEb#T3pwd&mTeWX5B8+O%dlD5Cw=WR*uhRo5_+E*}8r%ex4<6ux z0(!>SzUbZFua?UkK6T2zo|Tx+sa^(t+{(v4#0tyw&WDAp)7G)v>gNVHN7FmGcE{m$ zrr%NVwZ?nBdyZXKUgIN&_gYSo_6uIfBY~lyfYHgV7;oq{PL3pnNw#Mxt^7q46Hj`$ z#Zo11TNEq}YdyItI^yzq4PVN=4pxemJ`?I;8yxa06MnT^=!@S^2$i|mfV1Vs+126l zI;v(O^utXiWdqD{&YsGONM)(1$u4l@J=T^^9J^eqeKhkrM{G$O1#W3C5_H;6HVxv|E!yGXDGNz_5)`95+Eqlw0bh)6$1^^>vhpFNp5I9w> z{x`$1Txr>}r=!^a0Mezlc)P8c^9X&DY0)Or!QyoMx~~Z$Fs8E?*+bdNbmIN`XOqmBB=hdCLg0f{{RGW{{UpG^v=Te zxC{_|(a^UlV`hjD=(56k9zh{ZJO={~`YV6vr>_F3+l6OJa8*n)xw|>IRut1@@>JG< zvi6z4V5?eJ0s^I^dtHr{y*4ls=rt{e%S0!Lj02VCJ|uWs{C=79Q?PmLZrg6XVvK?S zJe8BFSn-E69k7z;Lwetbz_&YPU5>s=8rY0d#!f?q&P@Th+~D?KSoovh?GG7HnQ1_V zz9Ffv9aqb|Ny3+I5v_eK(w*$a&3-*D`=V1!(S~cu73J+>CMlX2fdD)M&u)rMBme@t zG&tJPHqU>#Ub*453%(tW#^rf6EJgFMd#`)&>VU^X8FP9j!RW!A(l)R_;LtshP_xS2 z%4p#snZh2jTx<#^^ktyv>UPpME0ev>8#P60W2JtgG8Mq0bI;4NPh=fh(NP66<=lgg z$oe{0MEv1e!EVyg>D>_8GS=)jK<0yl9hp8ct$i)HX(gq{84D>*#qYL&*w5~^JZ)`~ zYh#X*a0%IX#dDq>TI_;0T>R3K+B@6~aGWWgnMvXsDp{sN0s5;bxQ2$Tej}Jc<_hsK zQ1(BW!nw9)TsX={-7_9{_B$^HEu+;cES9UBdh|4BuvJHdZIC-2Q-46KDKCtnfHcfb zJ=9ekOxK*YPu(}>MnB@R_xLrsEyQ>U(z@SF!KIBjSo*#uex00m_f&P4*`+vajsa(u zdmW33`!>~=YFz#p4NMot27tmA1XjtdbPcIB!U#41rLtIBO{M)QAi2nf6 zABwD8K~rJjxnZS>jowS9@|yQZ?)Y|gUV(h#9u|G;;w}6wcE4O8$uESMV-5b%Gv<_49#_Ns zIO}^GmYj}i_M>11c`GWmvNA&e0aVnxIa;EG%3ZbxGq*TE$^iI42fy!9Dpzh$Qn+f_ z8UZ1XAeGHQM)Fe}an)E!3TNOHGv)5PG@Br$e&tgMA@WKT5>44fB%bOANuEUwhLI_o zCz9cKBMJq)##ue;;QEYn ziV>ls{$jlX)x&msBS5#?>EbOp)?1e!zciOU&<;n>_TLA%vxxw6siU?;;hl9S)&BrU zUW3B_0MXlp?9XKPXHR#lZs*N*nDgw=K|iYW=e+6%B#dJn6LY_RuIO8A2Qid%G&ZVn zPj97yk{13*SQroJq;tdmVV|i{oSv(h&vErtRtuGmCm;+By9^{q&fBP`sfwCCbIQou zjOua2N7Sr05%|T!wuio!iPPPy1GI=}+pm9f(G+nx0^jW2x!CqO#^WRQRX46GvvB-+ z?pGRmPIPg z0C$qp4mw_ob6-R1d{VhzNQZ?iQ%)Rk+PbW=FVJuMs_A$N{{Y1^K3*;28i`xdiir79 zH}A~;tI(jLik=|GF^pgzBSr`4p67vp#`4)VF;QaNv{PAlQq^IEM{T#$(e1nAZ>h)o z+|{@d#&8B)dHbgZmu};?WYXrhVYx)uBfUkWHv>Oa5iB1z{{Teb=R4UWp`CJjDqAdQ zF2M{N7161?xb4|Fq0b{jPLtGx*J+IYE7}iD`KpXlB%N&UpV6!VzQYTF#n~@9M`aAP zZ44qYozTvbNsi|qWNIIw6U`qGbhS}N&~E98cex^V`?-e&LGO z8k-GGZIY`w9z=!BC+MlfFOeEE5Z@%=@44AVVs?8h4BQ#w#|F4M*L0=g8dePXQ?#;7 zcE>;64;PHpHksQ`#au66Yjz7zt)>YKN zgMr9%9aIgZdk(hcorpL~DD?UfmxkbMLyrPQpbho%V8mEvyESrU;q2vAZ z*3l9DxR3t;#H{m!HDGJ(**Y-cjh1_g_%hYSbT6g3Q!+-lX%8cI`{f-)#MZjtJgTOG zdOKpQSoX-=w1)%Ka!FQ(wHcowc!}Ws(}Javs+o_fx94Yp>R|U+1_1Gr-~icu=Ww^v zTxsN|s)?_PL4q7IzIX8#z-p#lTU%jhbW=YLgzN{nPK?toIUEt>_G(8@R}cezOX%(n zqw;7YKFc?0@N%Nt9CFTE<}`Ym7sFzG_ zE-Ln(-z7)`Ne%9zWVJpR{{R$VtJc8KHUT&{0|7Z^ax}vd ziW{Q|VLJ(7RfW+5)zdPn2So5RxMM5C`0s_Lv(>(4w7MrdIbP;k2*E(ztu)tKXF)t+ z%_C!uNL+g@ny_Vf-jA6kjDe_NgWIBjR7nQRC+@eLVZn1)=Pr%9pgl)LkEo%;^UP>WX|Ff(~ei1D&5o(Mf$D`1E>9V6RB17D3~fQi2u~FU9MB+_9g2QE%5)&umd~alc#DAYdxb442F`cP2=DDCLLfy&%m-CuSTV^BQ43@kJeBH*T1ld=2GznGSpH+N zQFS2g+bW)({{Rh&7e`ngV%3p_TUo|pxIUiP%{u=8JDPU;VFFBrjr)iov`3-8ja2^t zmL~31EhVC=?KrEv$&l|;VjP-?wAvdCf~urCYLmGxJeAWR4mo?WIpGlpTSQR#l_QZgp0=XkAYu;g%+4FK}ui^4aPc!suZifpi4X(Vf#BYj|gS9V#ai=?d# zhECBRP6#`zT4RQVTMowx!Y!IUi9=vXAua@}3zWbIZm%YOmLAwyYoxxX08v00lvPe8 z#N|~~J0z<*o=U2G0#<|y@CIUcK}zg77f^ZOSIXn7nj}Haa4HELk#-bPJoi=-BAMLK zQW8-UIAfX>?ikqqikNXAdCG_l@VhLaXK*pkCjoMrnyS8b!%I&sL!HP((&PH_{ZKsy zj^uaG(`3Ul22QS9a$BAs@N0-}x@5Q*t+A8xN_9v_eIa@^i^0wvv^la(3+tr^I;Q!5 zL@z92^fHeRwOB6K=Z0Ht)fEKokTBn_qv`$EpjdnhudHB_`CiBw(l`dE55F(jdo?{A z6mf{D;f^K_O=Ckx?4{A|_s;1P&gJ1cnVT1e{5N4^MLi2p4EJDV+`Fdh00V=*`N9(AUGR{& z#S5o+{GoY`@!lkH6-(*jo|4CIcE!#7Np$}Jg42r^b3CSzzrXRH5AfYNn(K6@rT}LS zc+~Hsd9OdK@s9Dt6Z}5~@a*+0y~c`EYx)Zvc1#ZD|3@AYm2e}04m&4 z(8En1mlSM@G0CkObbSC?)(A(@Pc8Uh8^D*|C~u#|yg^Ybb!#+qN6Ux~+3L0SP7kzL zW6?oH6*%hbWzYJOt@Q@%#_#;yQ;wta01;bW1Kz~Q*$BV^$=aUoO~Poyc^s~nJnS|@ zcj8_%gsYj(?=S4*+!Xv(DQi)S9fcP_#~%mZPPxZp9V#YAc&W^v6D zjra?aUb0fxk*gqkC?%?FPQyTRlrmQ9Izk!8LCJRi07S^+{{Tiw@+-z?xSNQ$j+Uj( zrl%sC8$L0uXQJaiArICX>4-arLU&$(%7ZJ59~;XDQ`L2>Ye{r*Mo(fE$WAehbvoRC z^0=dkLU@w~wN%vBQL{5xjai-9Hcx)qvXIB$N>1J4t_(%J@sUe94OppNI#_gef*-_>aJT3%-6NG;g-l6Ok<& z@P7H&ER9!$o*;0k4&g2<`1*0`6xFRDk=Pyc`!8&UM#{}icymu83VWObhWz>arOO}F z9UShh9teC-<9-;BLB)I@K89@SicyjJ4Zn4$uz0`17v_et;qbEZ^6G|+9^38vuTPvu zPz-ZM*%)>q!z1)rJ|XargLs{pskB8L-}$uoY5xGLm+Xh)LzYO((CT^V>lx-#O%&`q zhemY+`YAk+;zvR6vh#|c0IxPTI(`u1%Bo`DQ(&seVf*s^kZp80q#mRmb&9a_L_Q^0sO8xYV(T^j~pv;kW<{m_Ij>Gl~Is0 z+aoK`?RQ&M-WE%5uBNGJ+<8w2?SvD8e?&@g@X%6meOnGHVU6wnW~+K`B%rD|c`+aV z0N6P!$B-~bLB2^`bs!*YT+`GQo#OolvbE{B#XU<8mgwJ}p$iS3AvU)Ua28TF$xeR; zN4M@(jXnChoQAlzR`)0zB$uO9;@^g{CI&YeKnd!WlZmP1!)A@~9;EISq*c`OjK?z_ z_egPnW8)=SC&EjBg1ePL*pf@`l7td##zq%&xxRQprMJD`mY*YGyk}M;FN7uWzZ@6$9E$ z>qdf_c25A7H-geOcSHAGWQ}+wt`7rZT5=UN!lDWYMAtb*BpjorjO3Hs9aC+UcM0T< zq14e^?Yg}ze$q+rgb8ZLtlyOvx!;=Ox#TXEG&H@(NFDb5(;%KIkbIYCNx?v9v^xoI zowj!9m)Q-LHyKeqndqm+QY_g*in`leb&+Y10^em5_P7&;(21eb{Qb!#`E`~-m%#o$8YlcAwnuHA{Ow*D9+bR(Glf_>S zoxvA_Q%4v5)m-xU$RE_ab7A)F_gNZ!4Ip8CbHsKEE-19mZmoPl;2lb8qZ=%T_g{(V{b&f>1oJS&QTmF{RHZVBN|4E6X>A+)czJ zJ(Na{pZV%N2lQU)X5h;mj0aKMqK-lT01?A3{Z+^s205(HKj?I0N10eW54BM^OLd-F z=l=jN%EA6?eQL1V?9lmCG;qMt{Efjserm-enNCs;jx=@U?3|KFD1u2Om5@m!l7tdu zjn72%u%aqT&^N;{RWLpYGynki3L}B@xGQ_a z8|nj>RZ>_0-wUUTPEodV@+#1^2K<3IHP89fMn*LBPL54{lNnK>Kx1#pa#LLMoyHUJ zz%mBwo~Q0W$8;^Agu(+$iO1DNC0kjr3ALfEh?cu2vdz?ADq?YrL^O`1DsqN3W#Yv= z(yV3twK;Cermo=HVoT$Df$9dzzB}zik_Nsu*?wyjEGK`eH0dJZDl))WvXGOUnsy0MAaW{}+br+GS#UNAz#j~av1I-H68$t@7cLrp2e zm>=~_j@=X|F~rb&gk~DivSu7zfObc(S{D`9Ns!3Fpn}i1P_~ulu7kD_)Qon>uU+%m@t z?He+b6HRuZWV1sgCP9ZsCpM;@1-A)2!5&?ltw+PNCD`1jU^8xKx_jk1{4{d1aN(A2 za{#2bI+?9&U51W@7(F@bg#Q37#P7*)v;ebBw(Xju1rI*63w594~sU zv($49Ym1n@J32aLb+S3!`Fo|kjrnA}XOM_IUf|Q_G1R<6NWqOD>5!vs-aXJ#yi@Tt zn&W1hlZ=o!w0qcUbtJvyE8gRZpNuMw74P}9uQwjUTdK}c`Nn%Etai}-tpSlKO? zT3UeNkOY7`^eXAGhX6)M=yS63i_d{PFIx9aZW3B*Nyw6&+I0T_lA}Bw;(rJ{KFxn^ z-WLA=z^cx#-2}1QB5C-0ACfwe_Djhv`Et*8mE<(uHePHm5pjPC*3mQ{RPeC5nD5nX z_;bZ>65?h7MR%qW{{ZDZ!LR)e5WGwzpV6{{xKDMsy^5>-AtjCyv;!CkyPxkOzh1mb3c zoi00+6UQX9ZQ{5~`w?Ea&f#+<^G~I}%EN`5ePiWwoE#mU@=!NuZnn3%wX`#{ADOKr ze#jbI%r7OngK^9_;FXGTk=Mm6YxS?yK9-ii2zt+B*^s-lP0pJR`iNZNYZ_)nRt&ukwoP1;#U_Pc+I zlHEZK6t8tGZ?3E(RFzY2zp?4|Osu%m(^QDq$K5VY3tP zXEKU5(b8|OS6~nD?TKzrx%{>aAL z7;4#9cbwd7!NV!oGRV(tBI9IKbYYa{D^KA9=ZxiL0g>n#X^8kRL=~v_L10d(6(d*Mpei=NxDIE###nQk10s021=q zbBgCkDqxO59(IyJpb_7GifC$~sVB)L+Ii={V5#mEQBuXO?^M{J11zSGss8{!q8bY8 zm2QdRjypxEhb7ZsK4Jd=@&5o6FCOgBv(lz%vHt+NaRm!OaHqLJ=hH|Z8(oIG7#~yI zCq-Kvl^+h*>X)lqyK(hO>dh)it7Q3IT>xou05~_Uak}UMN-Z?}8k`2nU?%`Ds3Evr zYVHE)04PED%SHg%V*F6xIC#p<=0L#9g(xyXC+2wS!|Ybgo17D}aT;*aIsVEgPRe^* zJ~?z!Q_Cehu{t?pb|h=Lf(mwb=2x+J)#2-&UBuS7PNoc1#NMsw{{W!&UO60@!1U$A zR&$U5TX4^@no#OGI*BRfY|!LL$7Q5*E9egnIK8}8WBg}-z0-{^XHvWX;oOy<3~?n- z3Em^DiRVZBMuV|xsl`juVxR2#DyZirRnB%eeg|cp=4^6`NMvy`CTU|sKiZsPe$3Ffe6RAMrThml!UKwzzW(=)JuB+@*$@gF)$yZ;iw=T zCrf>l)ilqU`DsHsj(tJ6*rviTOIk4Id0Vy#HO3uybmvxiWlX}^TY>Vsu2bW%vF|Q> z8~P*Spr?tNb}Dy6Wr`Ay<9GWinEl-Gc<~z%CoYxc7VQZa547nOW z2cF8Rzk)4w;5u43jymZH(8-VfM?-<|`N>uZX5%}3T>eWW()0OF>q^O+F~+cdi$6ia zmg{_);ih9qU2W`?gL&}NLM;JQt2f7|>nGe$gOS=>^p4T`!pq3_0_2T8LAkeDNiF{#ef9Kz6Z)3WZ^+mfygshsVWg<%XXYXEWIsX;Q~Z0;99 zBdJn(KIyJzo=J2!M>P@i5|MU!ja@fO9nvEKSq4c@O<2Pm(FZV$5JpGnvKQ|N_)7aB zd+qVl%y;u?{V)AO*z!v!xmKMQ+DpUAW$?R-_+n2phB%_DOMY5Qy%kmj6_e%!E;9YDhJSZ>}UaNCP&DVcVKoZQ@pew|glzs2et`8R4hnh9~Z zk%TmT(kI7~dSQ0`Gj~@-4O4LN(mN5AjK6q)X|H*4rED(l!G)%^@inUI!1`Lsd0Kyx zK!0v%`I#Kd^qhmpq|Xce4TgC~?C~4Nh80jax`M2h{{So2Uar}CwH#DZz2o_q2@B{- ziXOlfS5t2i3=jzHR!Q-rBX%Bqqw72X+(TWaT(JKDXkl_nmb`5sC)s-K--Bo_4aAhq z&u|tx>EVoIxzw(agnOjRj&w2e;{O1#lcTN>Q~>u4J=T^98!I)m^X8HFAJGDDED3SHH`krWG<#WdNAe4lRc`YTH3mOb<+zS zta6Q{38fzY0L%Ut8)STupLcX0x*EClRrKC<-leuHR(7O?--|ER!x;KE2iF{G?zq{A!Q8Lig z-C8B$3Wn0skCxp`NOOm0o@eRF7i^%UppHgbDfKzSGgr>+z5e=+=x5#Ff~C~75xVhm zYDgCa*PPi&v2_582j$y z`ys0%iVB9*aV=x6b%*+@2nXS}Jv8=dW1UG9*Za@rndehuKVCq6H%1#@ogk{>3bRo;I)xNR5d-cA&G*W%ri{f( z*sYZDP|^Xsr{;IR*Xo3ZxuwpE$4u(loaRco{{X9D?hpDYcd(W;kY!B5Dsd%i;kVK- zdSY(QBk9}NAU-m_z9P$HO}5*)zOG<3xDLao-9;P}@m2YiPIdC_otid^BlP4x`9_;$ zl~Xob-9Vh@(M3*w4?g`|eTgAeqW0O_EktzkHip|BO>`yNrmB(I0Q+a3*JA;gV>Vpsf zluO&HKXnLUz$3bJ)ltMS=d`;Vhdb!O0&kk@?T5D^XW;w)B?(^&d@ZKo#HmAf&`gxmfG<1}t`9zS&f_bs1Un0_c9#$^KpEWQ_gg6$V;|A2@av3SV5ofs zQ=DmMa3CH{KFizeH;5@}0d@mr!4B@ee&FsKs=wXgdl*d=TfS_1LF~P5xu;Hv2 zZ?eml3P!AVAG6h=sfK2Q6N87cmpR+~mySWib+m8Q6tDF20P|WqUx{qUj`Gb}bV{|f)Uq(V`?tY)5T1o1X<`o3ci$`JlE*Qgx z_+4F7&k9K;R5V5#$#(&DFS3`iD5Q=!0y0!!0m(`RphgH$PT>&S3L-T~T8a6F6cW_M zP7bH!p{1&tcWGlwebC-Z80^aYySFs>V^7g*{gO>^o^o3NIR0#GgQ=vGNiLr*JjPK? zd*sVvV_FAZ={A=KQ{AYhII7W5l`v=~@}UfCIVXZNhmort5hf8MaM7n9y62S0{mDpU zWtC7X^h^tnqugwwqL7CW;$8=IXrePaE*KqxDw^ELy;@0BQk9@#6tnX5x9F#afw8+$ z87R=u1_0SDC%V4kI+3;zI&7qCLq-5k=$hizjmnlfDwQFQ8RnYt$vk1-F6lZjRTh(9 z*$|PGw0BZDx_Kp>^iW$OEErAFrXv9}e##P#C6tm#pLZPFz@s|!e zL>26P0nYZ{P{7BIWqDIXO?ffYlAnCdq zXat4ZpRN@JXNPw>0%WyZrDl`zy!1i}&L*@timGVb6}z>&Y`wsMBJ za|HnS2BWZAAsRxbnYMZyb@i3-K0Y6Tv^0QW_X@qq1NjF$`;vs9F~vLMu)=QF4pUre z-S}+o0p+(~jhf$4T3aU&)V4TA@!M%WQacxQ`(Ym|nN37KA@JHQ>>id4oZ;AxgWGkT zm|iz6&4EK{hAP(7SH1U}qrOn_h@VgsOlXJiW7CYJbop0LG(A@J${YKrN2q?U*jDUR*L(C zKM{AS7He1;Z8RhaWcG8v(Ke0sm6WZg;o5duExg@VD8!F%cC_#JD44AgGO4vUN#Az3 z6X}hN{3wrXB5rlG^sOJnWiHq1j*0=76ZIVb0A)+SloWl~+f4-}yDhcA>FSU5m9uZZ z)b#dl0*<2LOATI}O?SAHjS=k}XWyfK`B6{tRWzb&ob9t)x>H7f8bR2epSqHkI+^K% zZIHIjL67`QgEGqA;B)(({gi%$ywM$Geq@a|`ln2D=(f@IKiWLc>=8zavaS}ksqxyV zF_u$7{bR>sM=!D>hL##8xzupvk?X6dJpK3o00j`Zm(;nI=p9{Ak5yCsF-Q06sfQRP zqIjT&f|#}u6~2|9G@tQ4{{Z|dD5_bLwU_HkvJ(J&ES;*#lz|{T1}>h)D568}4;~o~m7{1*pD3Q^ zGpi+T?PIbS-=kHGFvSA{B4c7`rzCh}k zB&>;sNgmcPerIeDhLSst_E67R1tUD#nHwBqtBwgPKX&7IDc=pbavsah>1ZUF+=Ko}>Irxn zk6p6HI@+6sYpbpm5>(W^*)mA%mi;>~L9g_2R8&epX#%mF~IjL?L<`6R8!SV z@&j8K$UjrjeHFof(bvhRihd)jI<)E(wEaG>M=a5Tp>xLOd1bbSw)IfjOKmi@Q#j!0 z8EZbJdM6L~KO8a%_=0aa!*NX!^n>obN}kVc;ksXkwo)>gpV-;OR?R7Ngn_?bbf=lW z3Ru$cj6($lFoKpC;A;jN);9zGZt9}tCzwg(tSTH@%mRN^O;qxF?t|`K42@zs3+44uX82cA|n&T~m2#C;S7vF$mNa5)f$ zQLvPm?N+Wmw^y@FjxoF4X=&@As%Ugl2ajd*aJc~OZF{rtvbVMIg>4*~n>)UlN|prt z4l`)_2Pp%U=C)501N5@3tswOUY^}UcZn!WOOd9UQq)Qt^<09oG#>m+k9LHpPCkJFD zJq2e{NhJ#sNhF~dl1U{9B$7!&2_%wGf-8jJE}epgS#h1!rEIA>2dtaZg+V(*o?cP) zvta<^o!3JIdZPweTNu^=Hw%(Aq+=T==elaqVxNUYXADqRJicg}=MJPU!NZi4?$r|j zIL1I$$-&xDywiHHo>}$ldI5F6s8!XisDapPbp@dgEI|Kq>MuQNzRlY$-eP_F7f z*e6NG+54y`tcsK8c>5~KyR_31BN|7#s**vgGCa7b2Wij$0IgYRS9y|rww;ITl?yHg zotmm0tJ|8dFLZ;@1a0b4ia6MH7dk`PHW=IRcf|}}o_SGkOL>l@Xb~2-yS7rt9W>9& zU6a{T$siHs?+gmEYs}QrXr^g-J(kGvzaLCFxz1ASjcC}uoy_@2Xi>f`1Y~{HEt*@c zWZLR>Z$K8Ev1(}4Hw!e^M^-u?k^&LE%4Sjw=P01S&Wou{grWNw)&`x16VgdQx{bnE z`ln#7;Rb@Sx%N?2MERg_jA7jhBLQ=8G0{s74xO1lKI>_Ixfo`PJL%{Z^%Zj~Vh?HG zvNBlXdkb9L=bl2Ol7?D2Otj$nXM7^FcWCB?KTC&Tbjj?wob*vrRSDaJok*8A4bCv7 zm?w?J?2L_?Akm5k#F_lsQIrdtc#W<2Ifw)YrO)}E+JCvgqzqL@cBaQNAeWy1YRH@i+%^$W38Tf>&>kmouO zGwid~oFK+!)b1_pwXb;tni@%5RmCd>$rwp!E9nWyE*;ROrciL`-IceU?Qp|@Dz-?e zi^(w$(LF^8b2SF`&xw5{j+osl$^1%}I}u0!06FG{sEV3`s7rRJee&s?vYHn9B60TQ zKKMjYw&7h(;knX=)Bn@?dk@ zYVHkXPY}+^SOCK)Aa=+5#D9{qW0?&ThFNQ%XE!_2=YOZ}f;R>lgH39L-7Cocx!c1Z z-~RxI*$+D*imi^Xl1s(FZ5#WgR9xRrMnU!@C-H zKYS=?bcx*CEM~T-pU1h>95uM=JN>rzMaxA!Mweb>1*7GmraqDV?&z9{;-rPItdLQ` z{{RjM{%3u;gf>SX{{Tc(_UNIX&5_Q!R+34P`!YYGb$xU(O4#HtudL|=8-^al^8Ik4 zFR7lGypd_Qe=*ugeuJWIy|T{J6`q_@()_Qgn0lT4(f(@eHGe}Y+mhE_YH|FuH2lxk z2+CS2y6D=+wYJ(YeK0fTb9I*$B2@fBOG3P7yKe{!i8T6L@cghDQHZc8>QPI=e z+2vEi<+HnfWJafQ+>Ym};QJ?a#y97V$xm!zjSbIEWk~N!OP#PB@_Bt#HS>yXd_LdD zpH#hA!>Im?7g>M4aXw=M;VAirvv-mGqMHm-lCs;QS9{}oeV~|N&1F|16kFr!R!+LU z<#-07=TypCMsI+0vA zoHht{Xdd|Hnbs>vxWe|&T;oq3EIcm9+xT&fx>gTKoR7j`@9w-V`@|RSH?MV7)~_a$$&fOW$Hd1cs+XKDI4$<&Zng2`pKDy!1h0w{{VCqZe4${eXB_x zdu!o|svgEQuY8XDj2fKd><3lvUL1c$+Utmly8h=-Q<5GaZ}qZ|?RH+rz&;Of{{RBU zCS-pZT31(xXOVDyRBL>Z&F? z?yM?acimP@bImm?D#4tGkRl(B=y?c6im-W3#Q`@mj*#q7GahQ~mVjmlI~5n0=JhIR z95SGKuEo`oGO5iVhY|Ev6nsHbNc~aBN~cIY+K{dKF&>X(@h+m3&1{69Vz;(`5UA?_ z6Be+qpTo%Il{__5LUl&>eaabQOeHO!QBz#0s+u1h%y1*2MCu2T*?i?|<0{$=dYysp zw>D1{8=qQr6{KRs@|A$uJBjBPzanmhb8cDV-@K?tqxdo~uqgX?kYK zk-rB@{b~$^i^%4g&yiar;D_$VY*#Xtf{<^rw!!t$!cqq-k8TdjpcNBLsyf}1+U$@I zB+M1oNjAiL^>b!_vy5Vrws$Hz%rjM;h8e~uMF zlT}3nPO=rQMUp?Onoy z8&V>ETGB|sLAvD&^3V(O+oB@5_@{6j@Uzxu7u310An(;(ny}!w{DA_Rt@Q>-&Xy~9 zwFY6?F7Bj`HnXCT={*#&IkP#CV5CkI#5W2Dt43BLKu)5B)z&gTZE4Gjib6T%TJYo{ z?v`$xf?ip5gD(=f7wiG704D{`m`+@V?VW_F2_%wMLK>L$#6}iQz7Hy6otDcP=Bcjq zLBPlc_*%HxI=V9QA=z1+=97waj150T*O0nt+0K@Tp6qf=F9dJRC-U76=i$c)=vQNt z9CAQR_abL`#>D|U@tx5{Y?7)4o<|j4=^d!dMD$6)YS6pmIZ8Jn114->L-_JHARPbL)T9j(=>f&_?H%3neawyJ;)u+_?J_x&4AN zmWC*1^I>7Htj-@%G011pawyu{Y#tbDs%e_WwU&EnI03s!DDCWxq=q^;TxgieSV#4h z65zStbrjVs6X;+!D&OU2^=3t`)^4EHrU>6wDE| zqZmUcK|&5*fK%BFvbLh>DXE-tU^t9@2UTj^0005F7#Q0F*>$85-wTDgOL8jZ5F=~fNob4WW;=PA^tE0%$(GGU#_2<6fz=h0 zGAO{?S;E5IIO5}ak<|8x9Thm(%KreF-oPq)s%a($?Zj1$3}DH8&e9q?Z_Rm!8~FbK zM{Hy5{3Qz|o8@(DxexBG3lvwRR?kGb*4a2Zk@r3!t!!^_$kuZszJr?aUN`af?RxVl zIC-DLs1Ku97?Iy~=hq7RzZF(GvgcD#Q1={{xa{AcR@R;#^Jb1XVRZ7ybhajXoc{oD z-iqy^iYTRu)l*+Dn^5T=B#y~1IV*3$ejMF+p0rTesNYj2aOaVwv3r+t3)cKP{*E^b znTofGT z#8r3c8*r;{{3eVeRKIe7mDxnp zKbi_dsS;WQf&EkuQ@KLmi4+SVz$huY?u?tNubZlYAZa=CP`~P(AyF!5B+mU8M>Luf z+T5s-eTN3+NEwvoHvu_WRx`?75uD|_9_ip@shG@esiLiu(p+mPK1mPiw3d$$>Zk^p zCL{aHD(nDNUB-P4=z>bag`V+c@fM!0HuSew+bh~$Ek?+D~FP5V8vJj)XeR&4CrCm9a~b^ zna}RB*E{S{xZw3wlRr_oc<(Es_)6RjmmMoe=&`bKKKRK~MZ|270ON$1@>@6m00*ks zs16Q0DVWgip=V>d1B^HXOgBJI@5(QmVqX~-ngHj?HNl~!2OZ6r=ldyJSjTPtNWYN8 zzB)uRLg_gug{Z&PvN@79-BhukWNSNOC&fiX)}Z0ZC@oRM339y~^ayIEmoS0VXvdn! zp(rXvHB8jBZ8_)lS-RSp>YiH`TGP}m4MmaF56K9KEK$YGZn`+LLmX_umyPm2$j?w& z9XIu(QSXI+NoIlo29;$MGgvUtpXGN-$;)!^EO-CQDf?ycac3}>mp`z+ZptI@NK zIZ0H4+Hjm?C>PWdzfS9{pSen-Uq%(JbwlRsPu3Km2@A9^m0LZ`MJ9lE2lYo6WtdcT zl&&?S9JAd@HF2XB8t*oxop5=s(c2pf%f>fGQynp2g!epj3Q8+?PAD*IFq45|xZR$;nlgD^U;lnMVHr zm1yyWgOif~02FWIW2J23SzW^7$41*axJp?|>a3v>RCCAXFoiA`2n1n8r(nx!jBU=5 z)b#|PmB=TRuDZ|)sIUg>CshmS-KF7mIN3WKobYh)8fWZLL{z^7l~YkwvG4RvP!%ZyRm+at)nn#5igi^;B<`!7Kd7fiNJEkC6_rub zmWs(kOOK|OEs6T!4Nzv0fz`7%-9$M=&7SYCRUIj79AdOX@e^kcs;C(sR+6k}tc{9e zJ!{QfQR@BL-=O3d7S7CZ*fktAH86;6@P7@Y>nAB5t!S-u*7lPdTIpTRPt1Pktl(g6 zjh7N-Dh*@(izm5V4F`M-rjU69pLG>oeKoohB}~m@Lv!jlC{@U7iik#&j0PNmw?#>O z;@S%gL`xu+pp3RC_i_IK*=H`?XJ2^NOK6SI#7+#PWS^qL-*~HrxF#1=UMsx%$8I7H z)bf4%eU_MFt+EeHhir<<#|UN zc-Ma7w!VVZn{~XL21Bub)bst;Hj>Ethk27Yxz0IpaoqjW9IN_;*Y;TPR~>O59#xmt z)Vs((Ei*|Gw0#hCRzTcIE{{*7p5FfJ&^Q;uYws3S2(8p_5q^2*7-L7*k^3*AxC{C| zSU6guD~-q-rF#Y&=8wXU{$5A!5;9FMMn)~3GvU{P7p^SwD&~#U7T|JblzOBe*&ph@ zkKoS>xMzYG&w#hJ)gzruqg03Pc`b}^#}fl1V_3$F2De~7$=X2Zu}?Im;Kc-vX&6p! z62eJe_8-uaNhM?wNhE!gA;)ahlH$4Z8DKotrg;o)&Q=eI>I|~H1F+Shka@}0pxSpz)l+ux(=2SXIWVC>HkoSFeTboZE!BQLe zpdYIF+`O<1Wf@I#nwuIVaL2k9kS;FIsOc||&Krpa{^;Xa(A?w@zH+s3)lD{l_YwzH zw6}PJ=fkDPbP`pv;|AR$XT!Eh#hJSz5ZXdaiC+ zc4wmCVd)ED=D4~406G0pu-0h7EJ^MNtUSu|`dhnk^A%?e<-g3dMLozuMN-bb>@vhY8d6&2lp1F0Ix zUI>;e`ZT_g)GiX-=K!i!UK;L16*De?rp9mWiuhOPwbT;S3a)KmdN6fr!D3e1IXkPR?PV;=$)?%k7HbO zq-W^3){HKPVL&4%9|;@su95OQOA_TaMc2O%MbV^PXa!$q#+ybhqy8`StWnV2!k{#Yi zPshh?ndhF7e(RKN+aRc&bzwg;pmT`dCn^~v_ga67g#Q2{MutnIe6=b&#PLtK#!ym8 z?t`9eb1P0hJYwudOpZYFJDLi4+SZ-$m0ehj6P&7Qs<%s>@D{ij=8o1^4Zt~6RTVCA z`HCWUmTjJjx}rqn>_nDSnufEnBMV=ANcUoR>M=lcP}np+^_&^sX}T?!M&ND0pTOLruuePp!lJ zzRS(wp{=}1>FVT`XS;m7J`20LkG z9>btRES0t~MOWf^XA1BI#`jdpTU8X54>)NI84W$jUqyI*{Tt|Q!W!NsajBWUp-kPQ zY4_?^uJHE?+IU`#l$NR}so2rX4^xl1R`|y~)=Zp+^t=u@>u=HuIvQFEcGJ>995Aq8 zF@pdiG=k z0Jnat1ID)FO+Um&KMp~-PQ@+Jn=&#oIYS}HPLQbH?Uu?ALhztGlhl2rDCvX*ePL4V}~Wx!O3?8SQH{N&2Wq)S2C`NLTih9oFeEd-p72{ zA5<3PVRRC}gCuSvG0K^vj3TC%I$sXjT(>JU+YRIZO?N_Gp- zK)cA-V7N6;74(N=%vCZ%NzO`#$sp$?F-d^o8#Pq-%|iviqhh(W$L4CrGD8{0=*X&1 z^A&yC7d%SzYnxw}3>KmpS?;qiRGfp9TPja;`lE#GT(QzL46k=~q9Uv=Kb2?WoV%~? zjf!nJ-8D?jI2VklD441+H&l_-WCTMe{?aud980FuXR?)&vKLtJ+4D)~iC8UJH?a?wcISS^G;tJBH znVqJNf^d;34T52Maup+`+b6-#DiZHxMHFUP8yk1jP~?48gAKYZ_RHb&8m4xQB5Tx^r%8Ob=;WsIw)3fO+n#y`O%#{-|CXLRcy2)O+&CiYIjzI-D8_zDlFFWJU6fJx_ z<0aOpRn?!CmIr4C-FP1t_?vy>Nz5WsO-GzI2+luJ7YS5POrqK9oO9!SvdHNv?8Mxz z2RW&E^tAmKh+epY_r=x5qQ0t0Njoz>hW(SRoI5>HFL*jnKI>6OY^I=N8GvLwnmLqJ z+rm7G271}UZhx*#LAdQm*Q4lTvdVUI z`<3ssHzrcS95lhP#~XC9fMY;Qn{oc7M=xTJfqV?%?h$)x>T`6j10nOY1~dDt<@&Eo zV_MdRhJXgZc3G&euV~V7-))f*-;Y*>j!IJWY;qUa0e32>Um3Qb0-cviXLEQ6ItHeL zvbu(4Y%e1c1vrt8mt%sUd&gwz*+X5j5LDpqx+Zd5op2v)135%ne zgeA&Z!d(+2cH1aJkC0=ssJKn1BPhCww6~r&R2LeZPCzyVUB;lf=XG2Lr)3j4FLBC^ zv0)}dVoy)9J-;YG!Z3|t%R+=5l;G^9;U7cqq8$8HtbLsCgDikL6k7{@uM zp2(KW4|FycT1e`XEGdqLXArRYrI*-4PW?19Q4l(91M1)DG&_nxuCtD-Bong0iNq z9bAADS5GTWH!8wBI0c%ds>uL3UQtM0jH7^=mI46bkP{zEfyo&Lg2bd~Av{lFrdUU1 z5E@PbK4#$v=Hb~0Sj5R9n@I?^PwuOWfcmK!Aqpoz$ysj(t(zTGvDEvb zQV}Q@ZK>ayowZo%sM|RxnCIJajYtVVyo#qGPRguxR86Ye(&WB0kIb*I9Ze*4W4S~{ zRx`}3qie|I_#gpyE%az-R!X&m{i{Y|oXWOk4o z-k4fN%nrdb9#;4IFY5N-BQ&{ z-16wPL78Z;tdwBoP*%=28CDhb10-kmS<3pI+(+4K#SNKq$%53+m-9jyHF7DEOR3q) zjjkbVtr+F9e5I8ZqL#9(2%Z@Yvbyg%o}to6_ikMCl2)48!?01YubTt7DA6@N3v@;@ zppaOHcWk&Qjqs#t4Y_6)4th1bIIV?7nO7X!PBo;#50;_h(CXRFA9Xu! z&uJKWSYP7~8)V@x;|^~6&+3Vyu1NG)?~)E~2kwfF{{W7AuQg{76l8bN-A|04BS)jh ze~sA7N-it35&_Y9yf?Nu{OZCBqYvl()jT1?J52NjRl(U9GV z7|Mevx|!smTGFyx~k z_dfv-EV^2qGxRl8RMm6c17)RTb=4YLcM6W8Q1=xzRYsymL=#S;l-nN&iP37`3%*h8 zrDA%dHKGQ_LY;#HWReOHmkASvz_{(v0Cy{nJ(m(tf=Kd7EtDYCl1W5cIfRRdE2%4> zTdxi^`R1jLEoV4Tlyw|>+L1Vq#WvUtWC4xORa+#*hptwNvYfe?3a(3IoN@x?&O18z z<)8-FNY3cUF0MS3Zna77r=_wNHp_$EAm+Aqs*vqDSvy^lR!B7ig|4Ba5Qg+c z2q80NXt`{%(AMEO{MNzHU0G2PMsTMwR$2zt~5_5!9%R?s4W+PI^r_D^?ym zY|EE4VoT;Yeqy9#t~+Hw(UZv$8y8a#5q+Gz-1M{&42~U2v8JiVGF5XJh+=>7(T051 zTgOq$)D+B{eB`Q@I~^45n+P5fE=`vZ&JR^PX4_&u{Z%A&Ix(JES}Ps6R7}~WIcs?X z)eOG`5|?IOSZH)N&XK1$$OT?tXDTSR18iYSvgJ-)p3a^%QP7f0DIpjnl1V}dB$7~q z!bBvvN`w*FMEn!TDGAv^?TRI#Q(6MAw$oNO4`9!HEKTo)r)Ieza6Zd>B%IY{eN1t% zmvUOLwqu+R5xjYnvb~aJuWrsC=CW0_F3BAh&%~ot6k7 z%buw<=eiV0w>0KRd#y%ppAj7i(X^bd7{j^cB$o@iSMHh6Ha*?~0oKPaMjLVm*|tdxKW3c`|iyBWesEX+Fyl0ruKR9CaF~s93B%mX)^<36cNk9o&;<>HCsU(Sz z7OrQJ(~_mBk=f>wNiy(!3dspBO$Qv3Ni1?Fjl`)^NkYWB2FWC$W5*@XBBamq<8Tys80p``Anj0BQh+zB3kme@pKA|nALmbjdGy@WI;B$8k(mnq=v zl1X799rh~r%UwGh8XdApEZO`u;d?gplRfc*PUw*HpR!3VK1H*yiRgLyCnS zjDkrdkQ5}>B$6@>CuI}dcS$5dW>(b9@W&kPusmmWs-=Qf#NYt#5=nG8$j>vyZnd-4 q*M2k0vf`>`I%FVn%1JJ)PGp1}aGuv5=_Hy6?MJ#=ib*R#GymCNWIFZ$ literal 0 HcmV?d00001 diff --git a/SIRH/static/SIRH/cerfig.jpeg b/SIRH/static/SIRH/cerfig.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..da67c8972d876c9490f02c989b711cd546fabb18 GIT binary patch literal 184572 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

G=N75HO=|Z@3PQjZ&CFp%4TPzu4p~( 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 QOAzTVVOf>NB31wZ0KuFeQ~&?~ literal 0 HcmV?d00001 diff --git a/SIRH/static/SIRH/user.jpg b/SIRH/static/SIRH/user.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7ab6f31dc045c9a28ddb50686ea3f947779d80a9 GIT binary patch literal 86713 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 BBhLT; literal 0 HcmV?d00001 diff --git a/SIRH/static/templates/SIRH/index.html b/SIRH/static/templates/SIRH/index.html new file mode 100644 index 0000000..45447a8 --- /dev/null +++ b/SIRH/static/templates/SIRH/index.html @@ -0,0 +1,157 @@ +{% load static %} + + + + + + + PRINCICALA + + + + + + + + + + + +

+
+ + + + +
+

Bienvenue sur le tableau de bord

+ + +
+
+
+
Congés en attente
+ +

{{ nombre_conges_attente }}

+ +
+
+
+
+
Nombre Employés
+

{{ nombre_employes }}

+
+ + +
+
+
+
Projets en cours
+ +
+
+
+
+

+ La liste des employés en congé

+ + + + + + + + + + + + + + + {% for employe in personnes_en_conge %} + + + + + + + + {% empty %} + + + + {% endfor %} + +
EmployéType de congéDate de débutDate de finStatut
{{ employe.nom }} {{ employe.prenom }}{{ employe.type }}{{ employe.date_debut }}{{ employe.date_fin }} + {{ employe.statut }} + + +
Personne en conge
+
+
+ +
+
+ + + diff --git a/SIRH/static/templates/SIRH/login.html b/SIRH/static/templates/SIRH/login.html new file mode 100644 index 0000000..83546bd --- /dev/null +++ b/SIRH/static/templates/SIRH/login.html @@ -0,0 +1,197 @@ +{% load static %} + + + + + + Connexion SI-RH + + + + + + + + + + +
+ + + + +{% if messages %} + + + + +{% endif %} +
+ {% csrf_token %} +
+ + +
+
+ + + +
+ +
+ +

+ Mot de passe oublié ? +

+
+ + + + + {% if show_politique_modal %} + + + + + + + +> + + +{% endif %} + + + + + + + + + + + + + \ No newline at end of file diff --git a/SIRH/static/templates/SIRH/menu_principal.html b/SIRH/static/templates/SIRH/menu_principal.html new file mode 100644 index 0000000..974f8bb --- /dev/null +++ b/SIRH/static/templates/SIRH/menu_principal.html @@ -0,0 +1,150 @@ +{% load static %} +{% load roles %} + + + + + + + PRINCICALA + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SIRH/static/templates/SIRH/message.html b/SIRH/static/templates/SIRH/message.html new file mode 100644 index 0000000..78ba3a4 --- /dev/null +++ b/SIRH/static/templates/SIRH/message.html @@ -0,0 +1,10 @@ + diff --git a/SIRH/static/templates/SIRH/monprofil.html b/SIRH/static/templates/SIRH/monprofil.html new file mode 100644 index 0000000..59c672f --- /dev/null +++ b/SIRH/static/templates/SIRH/monprofil.html @@ -0,0 +1,384 @@ +{% load static %} + + + + + + Profil utilisateur + + + + + + + + + + +
+
+ + {% include 'menu_principal.html' %} + + +
+ + {% if messages %} + + + {% endif %} + + + + + +
+ + {{ notifications_contrats|length }} +
+ + + + + + + +
+
+
+
+ +
+

+ Mon Profil +

+
+ +
+ +
+
+

Nom : {{ employe.last_name|default:"Non renseigné" }}

+

Prénom : {{ employe.first_name|default:"Non renseigné" }}

+

Matricule : {{ employe.matricule|default:"Non renseigné" }}

+
+
+

Département : {{ employe.departement|default:"Non renseigné" }}

+

Email : {{ employe.email|default:"Non renseigné" }}

+

Téléphone : {{ employe.telephone|default:"Non renseigné" }}

+
+
+ + +
Contrats
+ {% for contrat in contrats %} +
+
+
+

Numéro : {{ contrat.numero_contrat }}

+

Type : {{ contrat.type_contrat }}

+

Date début : {{ contrat.date_debut|date:"d/m/Y" }}

+

Date fin : {{ contrat.date_fin|date:"d/m/Y"|default:"Non précisée" }}

+
+
+

Salaire mensuel : + {% if contrat.salaire_mensuel %} + {{ contrat.salaire_mensuel }} GNF + {% else %} + Non précisé + {% endif %} +

+

Statut : + + {{ contrat.statut_auto }} + +

+

Solde congé : {{ contrat.solde_conge|default:"Non précisé" }} jours

+

Fichier : + {% if contrat.fichier_contrat %} + + Télécharger + + {% else %} + Aucun fichier + {% endif %} +

+
+
+
+ {% empty %} +

Aucun contrat trouvé.

+ {% endfor %} + + +
Projets
+
    + {% for a in affectations %} +
  • +
    + {{ a.projet.nom_projet }} - {{ a.temps_affectation }}% + {% if a.projet.statut %} + - {{ a.projet.statut }} + {% endif %} +
    + +
    + + +
    +
  • + {% empty %} +
  • Aucun projet assigné.
  • + {% endfor %} +
+
+ + + +
+
+
+
+ + {% for a in affectations %} + + + + {% endfor %} + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SIRH/static/templates/SIRH/parametre.html b/SIRH/static/templates/SIRH/parametre.html new file mode 100644 index 0000000..62b46d0 --- /dev/null +++ b/SIRH/static/templates/SIRH/parametre.html @@ -0,0 +1,223 @@ +{% load static %} + + + + + Paramètres RH + + + + + + + + + +
+
+ + {% include 'menu_principal.html' %} + + +
+ + +{% if messages %} + + + + + {% endif %} + +

Paramètres Administration

+ +
+ +
+
+
Départements
+ +
+ + + + + +
    + {% for d in departements %} +
  • + {{ d.nom }} +
    + + + + + + + +
    + {% csrf_token %} + + + +
    +
    +
  • + + + + + + + {% endfor %} +
+
+ + + +
+
+
Groupes et rôles
+ +
+ +
    + {% for g in groupes %} +
  • + {{ g.name }} + + + +
  • + {% endfor %} +
+
+
+ +
+
+
+ + + + diff --git a/SIRH/static/templates/SIRH/rapport.html b/SIRH/static/templates/SIRH/rapport.html new file mode 100644 index 0000000..7131aaa --- /dev/null +++ b/SIRH/static/templates/SIRH/rapport.html @@ -0,0 +1,205 @@ +{% load static %} + + + + + Tableau de Bord RH + + + + + + + + + +
+
+ {% include 'menu_principal.html' %} + +
+

Tableau de Bord RH

+ + + +
+
+ +
+
+ +
+
+ +
+
+ + +
+
Total Employés

{{ total_employes }}

+
Hommes

{{ hommes }}

+
Femmes

{{ femmes }}

+
Contrats expirants(2mois)

{{ expirants }}

+
+ +
+
Congés en attente
{{ conges_attente }}
+
Projets
(actifs / total)

{{ nb_projets_actifs }} / {{ nb_projets }}

+
Âge moyen
{{ age_moyen }} ans
+
+ + +
+
+
Répartition par Département
+
+
+
+
Répartition par genre
+
+
+
+ +
+
+
Projets (En cours / Terminés)
+
+
+ +
+
Projets par domaine de recherche
+
+
+
+ +
+
+
+ + + + diff --git a/SIRH/static/templates/SIRH/registration b/SIRH/static/templates/SIRH/registration new file mode 100644 index 0000000..e69de29 diff --git a/SIRH/static/templates/SIRH/rest.html b/SIRH/static/templates/SIRH/rest.html new file mode 100644 index 0000000..19f64e1 --- /dev/null +++ b/SIRH/static/templates/SIRH/rest.html @@ -0,0 +1,33 @@ +{% load static %} + + + + + Mot de passe oublié + + + + +
+

🔑 Réinitialiser le mot de passe

+ + {% if messages %} + {% for message in messages %} +
{{ message }}
+ {% endfor %} + {% endif %} + +
+ {% csrf_token %} +
+ + +
+ +
+

+ Retour à la connexion +

+
+ + diff --git a/SIRH/static/templates/SIRH/tiket.html b/SIRH/static/templates/SIRH/tiket.html new file mode 100644 index 0000000..74b353d --- /dev/null +++ b/SIRH/static/templates/SIRH/tiket.html @@ -0,0 +1,620 @@ +{% load static %} +{% load roles %} + + + + + + + Mes demandes + + + + + + +
+
+ + +
+ + + {% if notifications %} +
+ +
+ {% endif %} + + +{% if notifications_employe %} +
+ +
+{% endif %} + + + + + + + +

La liste des demandes de congés

+ +
+
+
+
+
Total Demandes
+

{{ total }}

+
+
+
+
+
+
+
Validés
+

{{ valides }}

+
+
+
+
+
+
+
Refusés
+

{{ refuses }}

+
+
+
+
+
+
+
En attente
+

{{ attentes }}

+
+
+
+
+ + + +{% if messages %} + + + + +{% endif %} + + + +
+

Liste

+ +
+ + + + + + + + + + + + + + + + + + + + + {% for conge in conges %} + + + + + + + + + + + + + + + + + +{% for conge in conges %} + +{% endfor %} + +{% for conge in conges %} + +{% endfor %} + + +{% for conge in conges %} + + +{% endfor %} + + + {% empty %} + + + + {% endfor %} + +
EmployeDate demandeTypeDate débutDate finNombre joursJours restantStatutActions
{{ conge.employe.first_name }} {{ conge.employe.last_name }}{{ conge.date_demande|date:"d/m/Y" }}{{ conge.type }}{{ conge.date_debut|date:"d/m/Y"}}{{ conge.date_fin|date:"d/m/Y" }}{{ conge.nombre_jours }}{{ conge.employe.solde_conge }} + {% if conge.statut == "Refusé" %} + Refusé + {% elif conge.statut == "Validé directeur" %} + Valide + {% elif conge.statut == "Validé chef" %} + Approuvé + {% elif conge.statut == "Refusé par chef" %} + Refusé + {% elif conge.statut == "En attente" %} + En attente + {% endif %} + + +{% if conge.statut == "En attente" and conge.employe == request.user %} + + + + + +{% endif %} + +
Aucune demande trouvée.
+ + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SIRH/static/templates/menu_principale.js b/SIRH/static/templates/menu_principale.js new file mode 100644 index 0000000..8a835dc --- /dev/null +++ b/SIRH/static/templates/menu_principale.js @@ -0,0 +1,12 @@ + + \ No newline at end of file diff --git a/SIRH/templates/SIRH/BASE.html b/SIRH/templates/SIRH/BASE.html new file mode 100644 index 0000000..5a0f392 --- /dev/null +++ b/SIRH/templates/SIRH/BASE.html @@ -0,0 +1,31 @@ +{% load static %} +{% load tags_personnaliser %} + + + + + + + + + + {% block 'css' %}{% endblock %} + {% block 'titre_page'%}{% endblock%} + + +
+
+ {% include 'parts/menu_principal.html' %} +
+ {% block 'contenu' %} {% endblock %} +
+
+ {% block 'modal' %} {% endblock %} +
+ + + + {% block 'js' %} {% endblock%} + + + diff --git a/SIRH/templates/SIRH/login.html b/SIRH/templates/SIRH/login.html new file mode 100644 index 0000000..801af39 --- /dev/null +++ b/SIRH/templates/SIRH/login.html @@ -0,0 +1,43 @@ +{% load static %} + + + + + + + + Login - SIRH + + +
+
+
+ +
Bienvenue sur les systèmes de gestion du CERFIG
+
+
+
+

Connexion

+ {% if messages %} + {% for message in messages %} +
{{message}}
+ {% endfor %} + {% endif %} + {% csrf_token %} +
+ + +
+
+ + + +
+ +
+
+
+
+ + \ No newline at end of file diff --git a/SIRH/templates/SIRH/parts/menu_principal.html b/SIRH/templates/SIRH/parts/menu_principal.html new file mode 100644 index 0000000..b9021f3 --- /dev/null +++ b/SIRH/templates/SIRH/parts/menu_principal.html @@ -0,0 +1,41 @@ +{% load static %} +{% load tags_personnaliser %} + +
+ + Mon profil + + {% if user|has_group:"ressource_humaine" or user|has_group:"direction" %} + + Tableau de bord + + {% endif %} + {% if user|has_group:"ressource_humaine" or user|has_group:"direction" %} + + Gestion des Projets + + {% endif %} + + Gestion des congés + + {% if user|is_chef_projet %} + + Suivi des Activités + + {% endif %} + + Réservation + + {% comment %} + Rapports et Statistiques + {% endcomment %} + {% comment %} + Gestion des Utilisateurs + {% endcomment %} + {% comment %} + Paramètres + {% endcomment %} + + Déconnexion + +
\ No newline at end of file diff --git a/SIRH/urls.py b/SIRH/urls.py new file mode 100644 index 0000000..3f99442 --- /dev/null +++ b/SIRH/urls.py @@ -0,0 +1,67 @@ +""" +URL configuration for SIRH project. + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/5.2/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import include, path +from django.conf.urls.static import static +from django.conf import settings +# from simple_sso.sso_server.server import Server + +from . import views + +# server_sso = Server() + +urlpatterns = [ + path( + '', + views.login_view, + name='index' + ), + + path('login/', + views.login_view, + name='login' + ), + path( + 'deconnexion/', + views.deconnexion_view, + name='deconnexion' + ), + path( + 'employé/', + include("gestion_employe.urls") + ), + path( + 'gestion-conge/', + include("gestion_conge.urls") + ), + path( + 'gestion-projet/', + include("gestion_projet.urls") + ), + path( + 'gestion-salle/', + include("gestion_salle.urls") + ), + path( + 'admin/', + admin.site.urls + ), + # path( + # 'sso', + # include(server_sso.get_urls()) + # ) +] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \ No newline at end of file diff --git a/SIRH/views.py b/SIRH/views.py new file mode 100644 index 0000000..77a057d --- /dev/null +++ b/SIRH/views.py @@ -0,0 +1,37 @@ +from django.contrib.auth import authenticate, login, logout +from django.shortcuts import render, redirect +from django.contrib import messages + +def login_view(request): + """ + Gère la connexion des utilisateurs avec redirection selon le rôle et + vérification de l'acceptation de la politique d'utilisation. + """ + if request.method == 'POST': + email = request.POST.get('mail') + password = request.POST.get('mot_de_passe') + + if not (email and password): + messages.error(request, "Veuillez remplir tous les champs.") + return render(request, 'login.html') + + user = authenticate(request, username=email, password=password) + + if user is None: + messages.error(request, "Nom d’utilisateur ou mot de passe incorrect.") + return render(request, 'login.html') + + if not user.is_active: + messages.error(request, "Compte inactif. Contactez l'administrateur.") + return render(request, 'login.html') + + login(request, user) + + return redirect("gestion_conges:conge") + + return render(request, 'login.html') + +def deconnexion_view(request): + """Gère la déconnexion de l'utilisateur.""" + logout(request) + return redirect('login') \ No newline at end of file diff --git a/SIRH/wsgi.py b/SIRH/wsgi.py new file mode 100644 index 0000000..5f96c06 --- /dev/null +++ b/SIRH/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for SIRH project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/5.2/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'SIRH.settings') + +application = get_wsgi_application() diff --git a/fonction_utilitaire/__pycache__/fonctions_utilitaire.cpython-310.pyc b/fonction_utilitaire/__pycache__/fonctions_utilitaire.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82ad949ee87679524e38dd8c4f1241fd7b4b65e4 GIT binary patch literal 1376 zcmZux&rcgi6rR~%UhD-m)QXa-YPW|9`4H1%B3Y;om=q~B)EEwyqSfFTJ8Ncl$jmG) z$Xt?KbI3ghIP!P!U(BVIdg9h|rB;2jHpP`XXdZ9h{CMB{zBd-j%T)y9x8q;aKRkqf zw;zkcfsgNDDr+dBn4=62Ft)zKoy;A$rSEbt^9Mfo-XNgQg-N)nn?@fL1;^`$z}#6QQnLhF9ov=?YD% zbm@b8;piHz(%O48b+*tu{0?8ZQ&&gFzI+DfquF^H>S*ddLQ|J6e{!L;mEtJ?*%tXw zry`Fji-&{{3m(%VR)WK~4MBM~*RfoJ?nF-2Zv81AYw>T4U zzEqa{jm7eyyZhtwUMJaWzu4)v`#ZZ`6K!>#AM}%6dvCAv(mdEY=yf{D_Dg>VxmwkVES5?4Y_RvUX_wps7G zJF|gALPXqpYLEO0&5a`mE}@qm?K;TOh>A#Xfs@tt!i_g;I|(fpM)uB|_ujtmn{VFE z2kKB1!8qLb&FV-9{mvKt5$YMQJ_ch4ts-5>p{ziK1h+%EP*$X3V2e2^8>V5fC#k#| zp~~uQ8d?2<4(QStqES734khJ3dAX#(BGjtkZP&qIE3>XcJ(GeN2D6IG0?+CV8DD6E0-9e?k9~Ju4jywnz!Y39zvj~*+(9K?UL3ukv7iW5ig@L!DGd)*bC<^!tLT6D? zC+T@9nVv!&#M5O-W*4<_?r=g z^nsh8Cm;1tX{>7@R1BR$%c37jAwM(^$PaE5#{043IUo82xD234$f_TyR+oxW>D_+T zt)CF8oYWx7H2^&#`rvU^QMz%vTi9O~2U!OInsVxxlB ze99E!m&=%td8X80GOO6%0NA2Sy`VbpOAZ9{rfJ!lGi_>hlW0$ODd3h}&%=0~K9qgsFBK9rY#@n1A1t!?jY)m*$;`$x{YG3*_({eCLEhR-S0+1}eY1$T0gWVbx zi`NBO0mT^jy1=vtpVqn`L$IuK_#r+2Pkr^68Udh z(`Kb+ITqnN1;7-GJ@8#>8m8m;*k)(Cb&a5y5m3ZQ)q`sSF~wcG4>Spr*DV|N$Re&+ z!Je_U#lq{BM<|OPOYQMb)8n1TM92M#Nj$_Pz9}XWzs6!Gk=W_amKT@O#_VE#A!DTT z`Q^;rWVkDo!bJtPOyU28w@(o2%tO-5C-8-UczGs{h^LLav!>F^?Xx3 z|K#3}_ZsT?mYQj+`KFqG_DxG&X{+U?T5hR$XW>v$zx($4YJ2i3{2G&24`U;b{e##@ z2chvys1p`XMLS3wh`x>@^~|G{hb!%&spinslj&#DzEN!(8_$i6mQiaPUeoYe25lQ# zO=GJuG}Ri~-kJY(VscMzB^LJNAN;m#@OaD zU?+wKPCuSGh>Y%!Uu;}X|1zFFh`iTG+~_D$Ozt2lEdTv-7-?C7@EiK)Yw_8uk$iHH z#VYqrr|PD-illqqqi{$;TlYT2RL!km2nJ0Q?*{`h`=Ov&_?5zj^NXL}(KALNy^zbN zmvW1F7Msi5Sza>qbfJ*B%ZBHc^-RW?&*gcyEa~Z`;6!%OD|j7w30@>}8z6lff8-@$ z$uE0y2_79$5QGIJ&^0$u3HXmq@RP9MZa8ff_7o#CC>L3|X<*V33Ed+);w{{TrH B+OYrt literal 0 HcmV?d00001 diff --git a/fonction_utilitaire/fonctions_utilitaire.py b/fonction_utilitaire/fonctions_utilitaire.py new file mode 100644 index 0000000..1ccdba0 --- /dev/null +++ b/fonction_utilitaire/fonctions_utilitaire.py @@ -0,0 +1,34 @@ +from django.utils import timezone +from gestion_employe.models import Contrat +from gestion_conge.models import Conge + + +QUOTA_CONGE_ANNUEL = 30 +NOMBRE_PAGINATION = 8 +DEBUT_RAPPEL = 60 +DUREE_FIN_CONTRAT = 90 + +def solde_conge(employe): + """Fonction de calcul du solde de congé restant l'employé""" + contrat = Contrat.objects.filter(employe=employe, statut='actif').order_by('-date_debut').first() + + if contrat is None or not contrat.date_debut: + return { + "success": False, + "message": "Votre contrat de travail n'a pas été correctement renseigner. Veuillez contacter les ressources humaines." + } + + conges = Conge.objects.filter(employe=employe, validation_direction=True, date_fin__year = timezone.now().date().year) + jours_conges_valider = sum([conge.nombre_jours for conge in conges]) + + if jours_conges_valider >= QUOTA_CONGE_ANNUEL: + return { + "success": False, + "message": "Vous avez atteint le nombre maximal de jours de congés. Veuillez contacter l'administration." + } + + return { + "success": True, + "quota_annuel": QUOTA_CONGE_ANNUEL - jours_conges_valider, + "nombre_jours_valide": jours_conges_valider + } \ No newline at end of file diff --git a/gestion_conge/__init__.py b/gestion_conge/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/gestion_conge/__pycache__/__init__.cpython-310.pyc b/gestion_conge/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7e2d94a9ea156987d7aab78009c3eba0404dbe3 GIT binary patch literal 135 zcmd1j<>g`kf+}XFOc4DTL?8o3AjbiSi&=m~3PUi1CZpd>1>tpPpJ=l9`_upPZkUo~j=opP83g5+AQuP>P{wB#AY&>+I)f&o-%5reCLr%KNa~h_vsFxJacWU< zjH8c_f@4X3RE$e%adt_5K}@h`kVi~+seqMZXeqMTNOniK1US>&ryk0@&Ee@O9 c{FKt1RJ$Tppg|yuib0Hz%#4hTMa)1J0Qx>8c>n+a literal 0 HcmV?d00001 diff --git a/gestion_conge/__pycache__/__init__.cpython-314.pyc b/gestion_conge/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cc16157acbb674e998ecaaf1e4c51b6c63942bc1 GIT binary patch literal 154 zcmdPqhza%#@_-QOsl_Fk`FZil`FZK7G4b)4d6^~g@p=W7w>WHa^HWN5 YQtgUZf#!g0Dh4q=F*7nU7BK@^0P8m*e*gdg literal 0 HcmV?d00001 diff --git a/gestion_conge/__pycache__/admin.cpython-310.pyc b/gestion_conge/__pycache__/admin.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3fdf4d333b64d33834b9c1d97330c951de4663f8 GIT binary patch literal 176 zcmd1j<>g`kf+}XFOeY}y7{oyaOhAqU5Elyoi4=wu#vF!R#wbQch7_h?22JLdKv4!w z##^k3DY=<>ews|T_)@YG^V0M6lJoOQiZYXmKnAR2C}IIpVB(j$enx(7s(x{PQEHBU tuxF5metK$gNoIatJWxw|sy^5xy@JYH95%W6DWy57c8oy1#UOJ87y$7dCp`cF literal 0 HcmV?d00001 diff --git a/gestion_conge/__pycache__/admin.cpython-313.pyc b/gestion_conge/__pycache__/admin.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f7b1982c1bc1502b5296ed90916d090184a324f GIT binary patch literal 197 zcmey&%ge<81X*7hGo66+V-N=hn4pZ$0zk%8hG2$ZMsEf$#v(=qhIA%P=9eI8O~zZS zi7C06d48HqxA;=B67$mY^^)`RN{TX*ikN{4Rx*4Bsk>$BY!wq)oLW>IC$ z72}dxoL!P%5EJYfPO4oI2hbEoAT9 zI46}TC*9}!`@XYI&t_vF+jFn@p!drq$L3SABsb>-2*?zaEMW}RfFAO9KrY!EPdxOu z5RSfS3PNU2S9N`(tE|X(u5xUQk|nuW5J*TE0fq~hE8TAH@d6-nfB(Al5i zb6Vv(!pEr8D3yt>i+t6!`nHe??JOTCV&^!UaAX4^s6DA7LcDaTI&|hJ zv$RvKNJ&U!y^`;GpU}9&^zd^LKj~7&MmJK$+xv&R_}{WPt!oq2uMH=LJD52k2*76n l>uZ~k+sWbkZnp89w4450GDH)q+2C^c?Ug%~ae`A=@L%meXO#c| literal 0 HcmV?d00001 diff --git a/gestion_conge/__pycache__/apps.cpython-313.pyc b/gestion_conge/__pycache__/apps.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d7cd8c8df7e79768c9a298c4e356797992b6e58f GIT binary patch literal 530 zcmY*WJxc>Y5Z%4I#ApnDi-`)+LbxWCf`|xF@iU}wv5|w}lG_}s=iRxxS7dz-SbxN|@`Q zYlJVT?T)AtKq^Ikf4b}SImUk{F7hbc~syAhF;q6m#C6m-6$7e_0zY#q@ zO+_QU<>umpVAd2B9UjnIb@SDke=FDS_xa=>-*#ele@VmyI!gM=Re&3okxZe~?ZC)i0=@j8y;t literal 0 HcmV?d00001 diff --git a/gestion_conge/__pycache__/apps.cpython-314.pyc b/gestion_conge/__pycache__/apps.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc8e33b9b017a4227159021387399c030d973947 GIT binary patch literal 528 zcmY*WJxjzu5Zz63exE0YAE>B^jX}6Z3lS0gK+i^G#V$I;%U)Q`B{4fGw6YL?gT0mi z#!?ontn7pnYj@qVaEmu@n0b$x*_F}i5Yg|}b;Og7?2f{d?XXM`LhY?<#@sW_Y63uF zh@u4{Vj(U{Brw$23y|n|9f)qOMbOdO5D) V)1{QYk;Sh*ht57ue-j;kRX-MRiFE(~ literal 0 HcmV?d00001 diff --git a/gestion_conge/__pycache__/forms.cpython-310.pyc b/gestion_conge/__pycache__/forms.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4201098524cb904f6f2308937205738bb807e4a1 GIT binary patch literal 861 zcmZuvy^a$x5Vm){Kl!^moy0+f(xEL#UI3v;AmECmAXM8}n~W1S^6mzEBXntx3W+zk zite6+XP|LQb+3SgV8-F+B+gpT&Y!=TZ|r6;=rUX%?|m(&0b}3DxV;1#6Wn%$0vK@3 zDxP!BAb?N@RhWmIy<{LD`oJJkd?PNyJc4-6vg8KOu#CHC)tJiO@ZZ+6re3Qh#cr<< zjR|i15QSnn2bKrG^AORo7NUojK`uZba^yN59Cx*)Csh(7T<>=a^1N={Koufn_o9q5)k??MlI z?C+2M_BfiVw#Y&!+Ka7nT_{>5K`nNzOTE4-YbQwC_i0p*vFp|}ItxsU?YU^F3u|eR zMcW!{=*spzpJ|m=%Qg#5fAF%@ z4eT`OeJS7V3Vnzex_uX6P-z#hN~OUXd?n0vo@2A;^%fb#bKinX-j}det#z?37E0S| zX3nS`65k(<-!_#R+r}t8o}a&dHC`**mQ5|`g4CF}*wOaF37Ql!u%{?eCV0wEf)jqk z;~yePf0_sAo@J34;NKjPI7ZEr(jAGG_FMmJ7;ETI$dDfhlv7P}ZWMZIng j++xqy9>{m5M4q0PPreJ;rB4pydrA-7!}nRAp9Q}F;segx literal 0 HcmV?d00001 diff --git a/gestion_conge/__pycache__/forms.cpython-313.pyc b/gestion_conge/__pycache__/forms.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..266e2a04cf67c3e92359960af334dadba5652509 GIT binary patch literal 6075 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 b^YJUWd$EpUtYe9T#*&+JZG4E`Y`gvoLe2$2 z_5=it3&uD<}jCe4U6Tj(Cm=e|I3$U>v=+DvaL=wBQ}F)YB%P;^iFGBwKYG@nweM;N{30zaYjT73!v(&YsSHXN}O^JUWKFcfE@G@EyZ4?~_UhO7hi@E|`XB!E=<1(W zw{kn@_rCmLf8fW%oO8zC$Q@Qld1PC$JiC1!5eA(KtgWhoctHMkzWUcHy8c@NBC|!a*_vm(&aEI`NwTVY zX(v?Hmck6S1^=v!^Ryq6|1N9t_i`Ml@Gnpp&Y?{yeMyF2l26|_W$Hh4A65UTz9Rrr G$L|4iMiV3e literal 0 HcmV?d00001 diff --git a/gestion_conge/__pycache__/models.cpython-310.pyc b/gestion_conge/__pycache__/models.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..17635546e1f8a0bbb33bf47efb4f2fc2bdef2bb6 GIT binary patch literal 1287 zcmY*Yy^h;P5a#knq9mT~e18U<6e?0gfFX6Mg1{HuooxiMgWNS?v!FO5iOP~IFG<@v zIMunmE)NlvZt?_Q0L9*vDYm!ZyheJn-+lxI=mu0%+Z_ zxM%gY)g#jPAVeQJ(51M(_4Ocvy*oGFCv*UP=)pdr2meEdgpSD5g9Gv%;|V-~!}rcD zi%+3X$2ro$L>6lgeFs1{(zI z&i##5{yTO{w*{Q$8@i@iP*#bmw1))@1KkB00}Y8rphK(AvO>En(7maJDxpbhkB&&W zeu-kHgQcuhxpCAZYT=)+#|xR`xRf;E@zwL6pN;2O8qT;SY24h;(Q2)uLgrJ2+@=rA z8A1|~d&oi-e!4ldG>&$Ih7WbfEgzigF6XpYEs*qx^H+5u44H)5oP$h_`TCciF8Jix z%jc7eD`m!|yO-2hHZOj_wepOiJvqCYoSk2&mO&ju(q)DM)DdBIY>kseqO4K-6)~=( z&r`BI>ganZ1tvuk@$hvbGV+@fFEUh#N*CFy8ujsx12ToF3DKQvd|Ne{yeh^6|Mih3Roo;M%rX?MI+feeIxu%xR L(1}>YPTl_i{iTWlNGl{0)lh8&8b9?_GMrATxv<>fk+?AWmNsBOt|tdYE~&GlqNj%YUIP`N`U zk+NB{Xg5%{AGQ_eKyd3V*CW`M`q2V2d@dMX~x*A_oijYtOkuQWQ*G19tm#&pp{Oc%|>>}T4Uenv2LFoHQ~oaZWw?SFq@)a%3wt5{&Bjo2>QiM>42 z`sd7~d)NTe{(?Om6w?8i&KF=hDJBP)t`}f(5qE&!!Ak^K&8Q?kgpVbj2+J`wV9;z~ zDJdtTaal7V4DDZ>VQl5b-ZrIZkRhzV5QD%Hj8HgRme9w>dGe0PI66XssIKb#=w1!{_ngpw08#59&;Pf=au?vndmUs?b!x=OS z99^Rca1OuW!1JpMcKCA%?lCiI{)^`FbgmEP9({gwpe(NM0V=iz+k~c$eVVlkUh-0; zIpEXGp@b5VcPub{%LZ?4y(Gn?a8xEv=m{8}aT7T1KdUGyIYyB81BMhnmfjx+&LB!O z`Dm-A^HQ}lU|93$h+)}(Ng`1xBComho^lgVydk;=peRyQRV5`PuX(G}<|=)#aVKnC zMGimO3O&lG{%}h1uaHFOmYf24FCPpRtBwy<5n!{<>ioEVo|^eD#fC(yC06UOzBeTSdj?r1iYpiyl|Arp`@H5 zsg{~vM6Qkm4BuH{Y#tU=A8iqQfoE+ISxrV0iYUidVu@9GbV~njv6>xvL3-t+yb}gg z`kGrt%@LPA5@WIwN#4?|p<9V)NLDp#SYDP=vE%~GQYu!TTpREq&> zs7Lp{0Ps1p$jn!V_AA5Xsx;0Z2F|G~RSc*!#%R3q2v`k;U1aA?bqhjMU`GHBFcJ6* z80L2H*a4s>>O~;)QYxwINO3u;Xr{2Vidxg8%CTk546l%sR6MBPuZ>NN2NzYDsKK+d zv;MQm#P#5$tiG2_tOO?~gTjUR^TEoSQZ^0hI(T$tRpXRIe2K{7PZBAjYP!gb*7m&u zTc{@hq?sp9{?3^@XYMB-eDdIvlCS;VrHxCQlV4r_@^a4i=K55rx&7Yw#`q??aXQQO z?V1_?$oiQ*n8|E0b6XvnO{5Pfikd?d;RLCe40TQv-%m*~d|GJnB3zcJ$yij8l>`ni z{P>+IapL^t3lmd<<`x#tE-Wro+60NJIi?dtjz*Ljc~!GcoE0X{PEKjoGV^NoNucI* zRE~woAYhZ1af*H7mPBYL*q+rDS#u%Q0$3rvlPf<#TvEcaW>J$;5+6gDS`gqs|2a5wTL3_5DkeS^dt)J zE~}zQM)A1FAq2HBL6b-UDpmDA0es4QYjF51>Dh1F&8?R7+^(D9TZ-=9yt_B+AN%_1 zzuf%&&76B7{i9M-Td}Dx-_%!VI+DIv0wlgS&-WJizV!K$v#IFp%sV?b)$Q5Gft+(8 zJy~jgsn|S}ZywrS$Tg3rXG^Z;qN_Xa>dtt#Z$1v@T-VdnPg=W*twZ_Np^~XP)B2m< zt=@;p$H%ibSH3YC+6?K-yB4Oazu0*!-+8PKBLx^;hODW5*T#6;^@C+h+sAWFKTOZS zG>iKigVEf-XN1}w)^sA^{el1O=qpg}N0CVWzuN$0sT45H|EJvs%HBK2;W`AJZGv78 zL5oJb2&mma2ZEqITOcoC6>T>)CIqcC=|<3ppdY{iOMnbSEdc{+^M#fGwr#BEhhZ5k zVNll*_D03`Kg6=kqqNo)!5|nazWrY`-}qO~HwosyYJZDht;~Pbq_6_37#dqY#dz(t zM%Hv3?5uPWC~Ta!*AWMr6(3wMj>Ef4zzWx1KMB;9fYysZyAg1dU`OK(Vy;vfgSS0Ki%m0!Na4r(4Ro)@cF=3vK{gGrWC%Z&eIrDE1Ra`bRhEcm z#pS`klW9aU5#%wAqvsHpWfBEf!&srq>7f%4@I{XXjaHE0DlAj z)jWVS1De(2yL0=_?alC4@vq{gX5Ui_<7&F=yVtwXTWlK4H4SdQpXn=b$Nr7;{8_#I z1#YAsmt@{3aHG3+bGu`m1B2Arwa%B?I`7@yxV_Gm+#L_%zl;~$uax-CB7Y>uA1UyI z8MeR&GO@zwT*=eB`FhSXaF;J}?f-ls^LnmpB*%@c&+b|oz7wbZtNWE*2jl6@+In=W zfJSnTybAD8dx`o){SyGRmv(9|TmLuhrL8Y>^*7>{`1SF}$?Q@R?WN_Qy*!AqiuTf? z+exQ8TD`SAn5)Q^22hn zY)){&DLjI^1MGyr6K}*5XwtYj^tGZP8dB`UVY`4~-+clf!bxQCmOr550_h*4 ziE%S;nm}=x=GMHm7xb@y3h+NO`bYdbNU4C4{185xEd_U^5tB78L--q!;S#7=RE#rp zMWI>I^(5eD`)ZdQE%$ze*r-O*OsVMzxcakS&K3v8asy-8BjXQ`JPiLX_S@LwHy@wN zp1z!Y`<*O*C2PAkPA;2S(a|lEL8h0*{h{=+o zJI~gr3ZAnRCa35abI{((pi-~b1Xr;S0kVRs0{E19V(Tc`Ufwku zQ6GRK`kdpOU3x#~Cg3}}eMNUq-rZAh`^&Aqyt^+mm~+1d?RrnS>P?gFQ;*wn&MWE3 z?@X+Dp4G{Mr#K*+XfUws{T#smR5l@%#S$w>2-=yt0un~kP>`lMR7wS#V22eP0;K(j zQ*aV4!UbHKS&(8edFK;YaSI&of{D2oZ_^6(VGa!#p(*7ZfhUt1A`%0R@VRjB#$w;2+l5 z0LVV1A>&$WL{5qr_=zfBRSZYfl^B@ccVVR(@t`cFx#*oLGVv**9033_;cdM)yfJ*Y z!^NJlT+djc=VZ3~)Wfq`{&d!Mx>giijYL6n(C}7(uzgCG2+Gdy!}6MA|9l#E z0a8H`xg4_ELeh#9ib8VeP?nFt3IqW@qIwGvjX4U=&_O<~By11mQzMKt zNN@_K@8w-H=znlTLH{3WV=9brxRt45pq)XstScZzHYz0s!oLv10~if$S#_5tz!<38 z0-CUkLvRWl+_(9AFkBSF2N;+Ts4F!#w-qoNT4livZ^2(-1rMcL+hHqJ@7xX;sJH7% znJP_!7pUI>I49~5phLA!JbKF}`R!5*QdCRN-kv=V=$Ezqtx=l6~A&Sx+a3|JIC zB!+dvnmrbk75`cy5r1Z%#p-pa)<=c!;e-|d3pDPVUTZritBI)M4`ZU0u7K10XF&U) zA=kJMWU`b{Wtx&&Yp=ylkZ@E1+X7bgjIOban3IK_59VaQLl1!FeI9Mev~g8W(8`ci zrQU&_Rn^DJDOQ=FM3RpIz&)!eOY(Qvi;=obX7DqNb0i48YbFei0w&E&Ri*A*xKMvCLyA^U$$F?ou63&3g_+MO(&n0% zuBg*rBOO~ixby!6W6lmew^j6 zXKmN1COSYaBmpJYJh(WYGdG~AmqzZ^zQ7!opRK_#KnAw~scJBcV2kk4>x#gRUxUaM z&J#iBt`UZ@ieWkg!%Q*2cY<-Wm~~~*K;vZG!*VDFo2wqk1@(6e-9vqar}Zz;!y>pf!u~xz)Fz+2)+mnb_r6DoJQ~u05m)Nv;wJT z$ZnTIUW%&ml$)d!2E5^0si@}G@uW}^ek_8}7u|zutgAWo>?}Bla!hNhWwDxpEtsNi z07x@`bhqA#{bTGG%DS=C(fwffi{W1#g&6gvt_SU3wEwDO-3@^<=ecw8vy=Ca7Mug6 z=I;HDV+H5SrRLuK4#a?#$5-SBa{R#N?E-(I)YkumZ`M09e1U)K;pFe;emnR0X5rKg z7z6ZnM7Z zCK3Ds!4v`v+x45HDI=>Dfcjq@0zSl8-9&wJ$Me3qp48^NMXoE)b!Cj(!R(BfGHgBdw{?ncfVgjI0ON>?!F{afg&9HqeZq^F+jXUo53OeZYh zYI(Z8v76l8>FHgLc|L^qwBFQZD6{{)^nF&bXd9ZM>TD1e&z68-|O2gK7zcuYjm_=tLp`ePh? zAkB74|H0-o`6VF3`!FiHfV)PPW&gmm{DJBEcjm}bOMvZPpT0Bu+3Zuuc=i9+HI`uq zpPJrcdn>(AeM(r4ooDZ!xOZyf)KdoQPyG(|Oa%q1Puowjop)cpcWmR>cMMeNE&m(9 CA?_Cd literal 0 HcmV?d00001 diff --git a/gestion_conge/__pycache__/models.cpython-314.pyc b/gestion_conge/__pycache__/models.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46515aac815e5cbc7e68efd3e2bb6b03c40fa556 GIT binary patch literal 2032 zcma)7O>7fK6dwPq{}U72aY9Y~Lr`1O))f*JEkzB~PDsEF(Gnt6vYBqYlVoANYi7rk zAR+lyxRm}J;MN|KQ`1XDPesb5$H=l2cM26!PrU^Np&t8Y*N&_LQb+Ra`}y9RH}k$3 zzdbw@LNI=M=TGft38BA)(jTDPV{aZlEp!>lu35xf@O96+XFSZ45jM}PcSd4T292T| zlD%U{ma3llNH2EabKK)7%rCnpP~P{qQ0MY4?yH+B(JhetQ}u>!u94b681nU$y{}vd zDNsliijWa=UzV6BiA*SqdF7FUi%C`A{P19?Bj->x0G`;39@#B>PV~zP0Veq(Mr=x! zPQcn?u*fS>z5&z_pbj|^gL4jDR;!ZimjnB&MqimPD2L?m3AYo^4gl`(U@k|7>LPMb z9@@vn{wFRDxVK)KF9`XD_w$WblX7$n9q&Qen0$bZFCunOjzAM*Tq>Hz3TbA+|EZ~N zt?MMKl5CA`Z757L4N$CX4Io<^7WWgUy?Hkeng)iZ6GnK15?x_L#fDNRP0_y+s3J>g zYh$U&fESVLgf5vDu^~6ZegCv(*!YFDhK(1cY;EK{JXBY1V4WB%Y?b?KtEN^X78OKa zxEbvSmq=YPR06d`lqNH=VSa%XRkdMrVD+nHS!wEwdyS^9gF#x-72_(6LYi8S4Im;U zt_g4`u=fyz7FtB&y8L&%*)ynRgboQzudjo+ear^}Q}OnF^ZgspH^4XdigjL|Sw{VS zHe8ipKh2`+cyAvQaEF{<-Ys@&F@-YjA%;4amv~5pen7XN7d&9g%bLO64V8zNY?UfN z0q%hVhhVQo^kptxF`Lw~#4g{+^7o4;E0-)nt;)=Nr9`Z&%xqLH&dM{+v_dSw6)bo{ zD$Z+AXsq#wVb+%@!FDblvzb;Hv}GZ^bqb~ydJ>M_oxD4Fd-6W}{?_-m?%#TpNZyfA;OTCjQ-=2CDPk!C}?&Nml^`{cbzI$hK58}}Vg3=>)0a!7NCed$3 z?Deu|Y%Tv94`7>q81oRuP-IglAV)C1)>L%CUC^Q!FKg6dx@Hi=1cM)A)vO8J!e{eS zxHxlRwm5Z>iZ_RcrcFw;72`ZvqoUc|Up#ZMc&0Q({Xz>0rcP@_S7`!tI%*q>s|vM^ z+{=LWJko29O=ceX#58rH7!G3Wx}s~~7iYVw5vtJIs&=hOcw)ezYLwIjga;SM4dz6K z>n78dF(u1Qiw7FiY!J%UsCd%&D8|4Krq!^*7}bCk#DWcuU|iD`%Tl!(s}Wtt7%uM6 zfDyt3-A>b#*p1+{J&EgM{RY!NUqTyy_a5E#phYP_DJbH5AqE^7ZOePx0VlZ zUjrT)#iHVmg$LCua8t~Jy5tZb*(ZMQT`V}%cgP^Yb4qmQoH8P#omQM351ex7_c1*Q msyI|jICniRm+KD{e~b=2Mn|7{Gp_XQ>AU4S<>v@QJN{q4L+hjf literal 0 HcmV?d00001 diff --git a/gestion_conge/__pycache__/urls.cpython-310.pyc b/gestion_conge/__pycache__/urls.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b52415d41c4992e69f2af706d1c51ab4da504dfe GIT binary patch literal 554 zcmaKo&q~8U5XN_tO`HBnt@!8US?HmS4eS-}MP(e}}QA)r8S2(E~ zxj3_kaS9%HmmajB{pce3NG<3z)J1ATuc1DY4}qmQi#jlvlF`lv9mt3pmdC|nLu>HX z3BS{3Fz32RWH!5%8IFb+ubQkpi&I_>fTwW=ycUFI(D1mDmAfL*1s?;~^+Jc`@b{`b zT*o4T*!pZK5B}U=jk=}>%Q&0M$w~>W@O(tIY-8ArALseZW;0%b!S2mhL{(=r`&EG1 zR&Z_hzRmEfk@nC4uTpT8=_jIw*2K2=<8UEU9%`w$2&b3V7va{SLK|$7KN$Zsm9P^0 a%$`-BVC$1UWsc)Ilu@h?$NO*c-#!7fQ=dWr literal 0 HcmV?d00001 diff --git a/gestion_conge/__pycache__/urls.cpython-313.pyc b/gestion_conge/__pycache__/urls.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e4b611973614db8f047977c5bfc49168fc8a0931 GIT binary patch literal 2027 zcmaKt&rcgi6vx+i{2TwaLm+`TG$e5vvsHu|1rbtIO3Q|#s#Edpx^Hco z?4|0Bf1nb_9@AT-UiuI8zI*ISJybpQ7KuZyof+>=45anpv7a|@-}}Bdv%^U~pHG**IYhsy@Zsd^n4Dq0L;4gNgwa6*eiTtk4g1SGU1B()Tzv^1o( z3}mz{WVIaRv`LuM@{rdGP|%7{)Jjm&%23uSP|>PT)oM^{C?qzo;5f-*gcJATf|4YM zQqkK{D+Ub84FO~7#uV! zLD_g_4+j+Vu1PK3we4PzGAwJ@r4UrZ2OX$G;m{bEwiV>}Y^y_c+Us}i7c{5~baX>M zG`eP+CE7cn`@zgPciRNIH=siZX7_*^7Bz;?^|tBsZOilW%Q^Ubv9~Db@O4TEfMAx!ugJn zEuUgHC!$n7YSk_BKP^#J%)>2>R;47>t;y%{xcO0BsCSfY#k2;?!mpd{Rn?8!Zn3so zypY=n$0t4Nxp&S+xHm?X&IE>qTT-0r)*~M;C;jfict+_yS2)^mAx(z4MWBc5{6>4L z1_`mpZuQhDQu!%T-O4Fvi#y%fv8`02afxR5jG)dwsnao`+>t;LQ{pkx@=%?X4i&yW zZ}d&|f4>eD_)Y3I#|4F7=_uvcg4jSv^7yM`?*E8O@VG1I;<$KuHK>4C)OPbikZV6P ztd6}ngsuZ|<_xMG>hKF8aI60L5@{sR~WmwEaw;Hgt?U9?#Ihyhur`US=-ubtPSj4vQC|E2X>#V zuM@oaYV(F4Md)Hh2%11i_ zTb}yB+j!!mrvl&iTKB#6M?QKi@Q$~%>3zX!90>ftyYs2HO?|X4aOQaX)s&C!37GR5 z%ih|Kj~)rU>D^+9p89C_U3l$h+gthEN84hNY1r~G_{b5sCc7EH8)Zg-M Vv$T(W^yKwIy*Tk>4(8b0{sphRiCq8y literal 0 HcmV?d00001 diff --git a/gestion_conge/__pycache__/urls.cpython-314.pyc b/gestion_conge/__pycache__/urls.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7fbcf592a784c2f6a55ae1b1ed04f77a0c37d848 GIT binary patch literal 742 zcmZvYF>BjE6vyu@$vI1rn&6}aB5<5^F(uB>p-@VfcCeQau5?pkM06xdZAs`ZX`?B0 z>(tNDFVfvp#X+EuDbOJy{Q!M;vPo=waPQu||Bv_nyqBJ9BRFS&%h<0WbfZ4g)0iX= zzaY6nM~LD+>S2Lf=m^tVzt%H^(L&S^<{@q)Y91N~y4$ot^-_!0UmI1fxh3G1XBqXQ zWR7b9=PlsuInDuYWdXPR$aPK8pzaRpc()4dU}X?-eWarQ-QTIEc9Y4 zh+uibf1(FykL0WOZ-P&p0WE$HXsP|EaL4 hh3zrfF5T8sVM`0`F=?0X3oYEW*PqqCIr%C~{|{fuzCZu~ literal 0 HcmV?d00001 diff --git a/gestion_conge/__pycache__/views.cpython-310.pyc b/gestion_conge/__pycache__/views.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35ee5de7cfbf2d99958629c1568fb3e210f26ea4 GIT binary patch literal 5896 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 literal 0 HcmV?d00001 diff --git a/gestion_conge/__pycache__/views.cpython-313.pyc b/gestion_conge/__pycache__/views.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..60c9b00cf2f5af7d839cdbfe63114b8462061ba6 GIT binary patch literal 55172 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

yZ|awwUC}vzU+OnlmW+`#^P=nzq+Ne77kjD> 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 &t7IX3I0n*M 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 literal 0 HcmV?d00001 diff --git a/gestion_conge/migrations/__pycache__/0001_initial.cpython-314.pyc b/gestion_conge/migrations/__pycache__/0001_initial.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ee60f18ea6698fdcfaf5d15e732d0079a35dd62 GIT binary patch literal 2245 zcma)7PfXiZ7`L6o`9pvN0s#snY)D-?NU1gnw6&`!G=y%nsY|=H3$;xANIV=nwO?q- zE;_sFrwa@&!eR*6fGCPH%dE~~WDZqcZA-uG;WW-XQGDDQpW_kQ0We}A4o?dy#& z@J#;RQdW3|`I9o8C*Tn$c_5xL4;g`7WiSgnx60*x*q8TXe~KAmrWnDOWCZ_)ui#kg z7;yK`eeR9}0{bzO3H(Lbn;DKos!G|Au%c@w;j6lgRI}tl-F3iYPR2Rve*=6A4CWpN zu}@&JUzo_UIIzJN`nr`|8Y1EZ-$tm=vC##AGZub+At3Pce)r%rP6z@z(FOBJK!=3z zJbQ|Zd=S_3A6yi0!)MvcGQ#97_Mt5F3VrilZoq&42ko*#Oo-1z4(J2O0YHwpT=xo* z4#ImSx{yQv8#xTfv2JTF?d2-jWpf0O<7Xi^`U~mz<%QT8vX9P?O}{S_Mubse>}`&+ zVc}dS5~%&4Fpd+#AoNsiPnQ{)`sR+lq=5|!#$7fS|`Fp^16%}}b6 zu`6z)T@p5tp-8IIKqR_@j7{A{q9#=liO2vJWwcqxb=qOez@}xCUOwChQHC{oK}bRl zYD>`?Jsm(!(TE@K){vvN4g^)BF&*w_d?Z+^=t>Eh(EidBQAJuAS6o|B&tp~6WYp;I z*jq-900zc=4NZS6O0w+gBzGWo(1RfoD+)3sqf}8I)e)Vqpp3Spx{8TktE(zWbU|gs zKqaa~da62BwnPJM)lJX|Y^svBZ6xWt1yQx8>bt0sEF;tL;0dzc4sR0%zc9E6L;4J) z()_yVGGRQqgdOJ8Mc^Nf&I}nF`Ye$n5)0DIl zY7DptsNc6RHHA<;>&D3XXM!mU|X5ztXld{mcInr`6wMR7|pOspyz(sU36 zz5J4>jA{tlODieJH0bR^dX}8ISfdxPLGMEny{44Got~p*BVpQz9=TMJ43~^v({&X| zns=~{o?w@Z#)bkT2DufDDTwC;{tU@2eNns%!)g}uh2kUXw|CE;m~BqX9$Yz| zShZp|TJhxGusxb-j%NObJA6CPW|${|AL(|3f55+Cn6dA9VB$r-6;C}Mwx=#Nr!E~} zODG*r$yN-t;ul`z?3t_0nX9k-)}3#UXTGyy_gnGvFNW>R+soPGv(53@1OB)0uVH&3f3%Rd7j7Rd+_o3)A1&Os zDvuz9$83RvcqVRhG#-I#4@MGwZvwsHNZZ#x!2fi^SnOml!;?|B!dZDU>wdwroiZC= z(yE0|&z)v-`pYc=t*mS68U=eO4>JR3VH++)ipGEB0 N^igd39|jo5z`tMrT(8S%5Z*uE*_IDQ6bQPjkle&aYJ?IZ@lzxPp>nfwJcG|CdwqC)5ut@P50dBL z9VoV-p~@>Dp)hNM5=NTQe)Em@n;CDnSj3F%r20{R=ZyXI;JzsWhvfDt1z^A%*7BUU zA{U&!W*|U*WgwAnDD+%G1BtC?Q#9|kn{8J&xMTOQ2>asHxx@5IlJ=3+R zhq`E7FeTM+xkai?MyLy8cG!GQj{O(QqY>Qzb+daw;XTzZ0hgZrcAZK$FV|gNqNVAI zPr5-<4QrQNV1M3O)TU^WisEtF5jo{^F8EMm1E*=^LOtfScCpq}w`-8jiPj%?MdNEd z0^FhjG-Zvp7u1J~kD3AdSN@h>`b2cRE+*{aZi{~xea-sE#E#+D%WU1XnAxt!COdok z?oIaJda}F!lhL9Mbm1kY)oH(^{q1G%U%-sqKBN#bA=Rx41Q&ddtKZ@6$e*UlMX)JM j)$POi*zefmNZ$1`ou1G=E_^;s{(>GIvtDCQJd%F^l@7E) literal 0 HcmV?d00001 diff --git a/gestion_conge/migrations/__pycache__/0002_alter_conge_type.cpython-314.pyc b/gestion_conge/migrations/__pycache__/0002_alter_conge_type.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ef6f1c8d2e2d54bb0758dcf3ee093014dc36d2f GIT binary patch literal 871 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 literal 0 HcmV?d00001 diff --git a/gestion_conge/migrations/__pycache__/0002_remove_conge_validateur_chef_and_more.cpython-314.pyc b/gestion_conge/migrations/__pycache__/0002_remove_conge_validateur_chef_and_more.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ba98d2ca4ef0439f3ae71e5c0c13ba2e47fa229 GIT binary patch literal 794 zcmaJ?S0=IET02H~YOe?|n1(uB-;2*Y~ZT>=Xg~GGxA-8JO;B zFor|GXb-wbqT8?mn}DqbVEX{|D)WTJ_n}>4Y2nHiw4C3DwvY-2tj{CK@=U}FHGn%K z(^P{o9Dqa^q;=>@8?UsHtQs!9>pmqZEUG&b^Yu&>3deJae1q%2qK zbUOD5%a~+Q+VYi0iaLa-fDm1Glv0grgnS%Dsj015oseV3g-lsSv)uen=#XX!&0RFDtp%vrTTh>+Ulm_$-?b~KVy5W=fEX=;p8$+O4dTS2)9yS?x^ z6(3|i4BzbGZW%7MA13rt+_ z?@nxM-5tN01mIsk^O~n#^SseKzk27wvHf7;UEbX(cdPz2_w!4BV_tK=Wh*~fgc5Z$#MH#X@9fvN~7Ev1)$6h(kk2|)#Fgi-`mWLou-bmhj=U~ufPy9t6* z4~R2=gBw2us)|H=<-{#gE4VUiCu))KVf@~#XZF3>^_`h%m*8Wq{|JvMAwM;lJh?GA zd5qwY>=BP{k{Xq?W=La+%#)kMGZu(vHfi0S6rH{An;Dj-XWb&D+%HW_hH^V$oBJ|M zVxjC#5bUA?KYL-Di1-~Z~ z7ANnR9|Wq<2fm*OV6oqUl8J7$!;~pY=Tz<>gedqzwy<`(4MIB8i&<{1+b53a?0DS5cxlOP!5Ggxw> z=c;x$9yE3YaM7sM8&wc*WYTTC-1KT$_{VGG>=rc8^*!cm5o6QmXI}2U=lXV~K?Cs! z!zVJbiBqE^)3|IOJ|DTnxirWx9_1H@3pa)rmxjeFgW}3japkM^ZDaemxN|yXIqt}` zi}uH7{OY9NR>@LM@Y;{tNjcb0$B~X8+fh5qzP*M>=th|`^nr1 zMHBpfUw*VbmK&N4uzYUUyB>$pmv5YHanzTu-o7jo{3k+rw}F!6c&zKltPixHwn>WR z_N$Alj@$6}334W+x>1?nf)`}!Pkxg!E=Z&qwDr)~C45Npq#081uHXIblq!Y%$zGYK MQEneuj>U=m3vyVjf&c&j literal 0 HcmV?d00001 diff --git a/gestion_conge/migrations/__pycache__/0003_alter_reservation_motif.cpython-313.pyc b/gestion_conge/migrations/__pycache__/0003_alter_reservation_motif.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7bcf2ef257509db05674c7223bee061a232b40de GIT binary patch literal 816 zcmZuuPm9w)9G%I(CfOEiRJMr4rSy^o*Q$6}Sr&?A(OUP=(aRDXvduI^)1*$OqBlYC z>}5ZIH~l!fmzKGD>a9}6t20SUS8yOR?`7uw=J(z#D-|1vvCFojuMmJAlB|cm0?R`I z&Hw@kJ_B7yVOOEb4yb_!K*~*kR1fxzwP>?GR0~YiP;>RUB(B2kQ4~_2MQM_8W0VFY z&ITI|0OpD;UkPvqJU}4=R6&rcNVyBC=IQOD=N~wQos7&JslbQ5S5U*uZbEK zvZx)}?iRP6ue+H`2co}9NHW@ACG!K1x|MoQu?e z3wbFZLw^#pBUck1r7xWLBf_e5^5a>pWgD|qcEVY(Nb=7HoP6c0%OZ-hbVZjEbx&!BY%?vRX;PD^=&gu& z_FwR(e~ydLGFMOD3SIQ-H%UuZa1LMIW9Iwv-kZ6(S+o$W-47M^1tauRlGW0eVDSLJ z1a*;v4^Rtp+)}u56>Xtw$WbcDQ9HP8teV!}duoQc>S))It^bnLR)jTVgV^IN3KL-r zBcBFIZ{3AZen}PqfC=g#jvd66t^tGc4a~KU-Y%SN$S{b(j?&4sOaI&JVn^KpgK{~V zqwi=LhIyuAaLdVoL{pg0R@%fyOcNTvO@#`57;)COvB>$f?~Mb#Z);#giYK8rq(V!p z-e)xMMQN1vQnEb#4IP5<;(#X7Ht9v-fQmx1*}Owo$T;%?dqd<&I*Jfs5dx#f0R>zj z0>TSkNW?1$1ATAz8_bC%9oK`fihPy#(xZi?Ng(OjnCG!RR3P8|3*O4?!QjS(0c#? literal 0 HcmV?d00001 diff --git a/gestion_conge/migrations/__pycache__/0004_notification_reservation.cpython-310.pyc b/gestion_conge/migrations/__pycache__/0004_notification_reservation.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67ed7d887550558442f348d9d321bd1f128aca74 GIT binary patch literal 794 zcmY*X&2H2%5O!iGn@x8m)B~c3pK~tBN+3>E)m2LYAu7aj3I{8@GaC|;cuBHINuv| z9g;wclDgpJPRdb~9=O2KFGnBfEg*kSv{7A9-e7i&Ff%u%eYP45i?-s|bm*L^*>^=>=}jXdow ztE~B?MYF9cJtlDK8GF=|7OSjBkWE&jc6$|ZV#hGDvj}VV)&*8@9!+&1tzAkTN-7by z71Dho<>zfynOLI%Zm%f+jAFB2jJ|W(p${~eA`s2+-YyR4ZcDGL=U@jL|!gC$hx$lTS!Ikw#zCPGB5W_OweWm!i mi}oHR>hXWS<-#&xb8ouY-5#0f;Bd$4kzg4~v>gWZw%NN+D|F`L~p3>7xlCCTX&{1cDLkYUQRqJz$i_y70ybH8*yq2QIhVIM z6k3p&RC7#skBM%_ahL+d0c;WwmZ8Kk17cyUO|AdgrkTpVq}*ZHgT*^Ftjn2 z#*qhOrebK)>No`C492fJrV~bkHimJ-rheeqE^)okZIL!{E#lT~;?wXouyo0?*21(@ z3{`c_qr`5y>*RpR)+^I(dW^SfEFCopaIw^CNnb6MHKuxPl02I!jQs$>sbez;s9oy> z#K)LULCOJa#CBGfjV(acH%c2D^QFLhX_Se-7kF)>TsHKl)hEU|+>C#3(tyc4z{4O9 z52)BapfXg5NH|*G0`ea9Wuz?k1%6U~yU|yXGSN%V9;IiGuiQSqbmKTT-ODW;tYFj;Rx2x^;v_@BJ^by+UG#*%mC;TZw6Ak_}B`RuPkaP083SCIb z7GyRPV^y?j#rOvm6Ts+o2xH1$e*}93cHDP}QJg9t2Bsg!!(5?vK;>Zjb3pn6$8iH0 aaW{XUyT9ZNCx1|TLE}voV4LOim-`fMrH=!Mph;4nmet-S?WfFjAUVm{M~s?}W)-$90*`i#Uy# zVwNV@wJ5fcXSFaBsh^iP;UUR!M2_N0!@;ioIa){N+A(Z#Wo6|lvRsM@8aWcR!oKqp zOhXY6Ld-xsXm?!9?KDDfJC+-Qb8iBnhC>4CIv)1?Fm2;D_H69c9UPF5B&KcJ_D!U z96b^#ZUiJ+s<1t39*PH5+{ZP6bosYEQ)C6#!EW@hTia$NAUQU#viX>& zf?X@bzfmC}i!AaorvJ-Flt)CzeTV$SP`R*BdloNpgFND{z~5kri@qcX!axPW{h#3R Vm6{gRk4A5DxjVW12XH3>_zRj)9sd9T literal 0 HcmV?d00001 diff --git a/gestion_conge/migrations/__pycache__/0005_remove_notification_reservation.cpython-310.pyc b/gestion_conge/migrations/__pycache__/0005_remove_notification_reservation.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2aaaa73c4610afca1afeb366fe941c7c6993a4e4 GIT binary patch literal 576 zcmZ`%y-ve05VoD9q-iU`!iJF8vNRn)EC?|meg-PkZdt4lU(-ZM9FnvWGpsxaPr^HR zW#SbWDCZQ^bl{{r-Jid^&$b*49D?$GdKed!kPjWS#l+wOwK_s0h@dISs81=mCV~m$ zg$M&^!k!JE33EzZ>l6EkOO=zwQ5n>+%&SnR+Oh=-#HWJbaT-zI05h>PurOa4#vNfH zXh(JL{?J^e1`$*mn1?ctKpl)mqhp@SI-bR0Gm)22LAh*v)o)i+uT?@QCzAqFo(CBy zQ`@n-qio(JI9Cqm*sw?e{XXZ9iy+laIucMoE+7wMs7i+HRBr;AT*6fhsZfqA;Ftaz zDR;5nn6J4vml=37TwQ>7DZ@nud0lz;rA(ma)7#07*O)Di-sUnrWP5@H^{9VI4~wVL zz?mJ?N)NXQGt8A~G0Ld201i~OJjD(G?he*_j(`zgyR9LrQ;~I9J7|s%Qg%>Y{p7P(!s+_u-7+R_sGij>Q zAx~qbZnxX*M>OSmvX>0YcBo*IiNg}B#$rU(7ee}~V9X;nqG^B3RL$70up9cyqva8$ zDxg$TCL^YCgVOht{>ad@cY)HqM96%Uq%7qo9I=e05le>&lfo#b>OD5*hwMedMv)45 z#?IwZS1Fab?r%u@c`lN{BxjOR(bP#(qlOwh-z0DK5RzUW$r|boaMgNA8#4czNyn^4b|_r_BBXGnv4w literal 0 HcmV?d00001 diff --git a/gestion_conge/migrations/__pycache__/0005_remove_notification_reservation.cpython-314.pyc b/gestion_conge/migrations/__pycache__/0005_remove_notification_reservation.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83dce27e08104bccddb10fcb6eef75137b0d8761 GIT binary patch literal 726 zcmZ`%zi-n(6nzZel_IF3Lu^h?seO$O96R-0DzRli z%={btIWW-bRwgz}EzG>L8xjU?c>ccg`}MtdJJ(iy!1MjZrkD_bABN12a|JH;5X@iz zlpH{pD6$C+*aB*80JZz1SD6PazPombl|?J}q2>HEv_-T(7NcyaM4HHO;SKP&)IQ$M zpbv^rP}aazHg(%XRr*e^z8p|uY=TgW+K;S~qvr~(s48`^=!*7U&#UQrk}7d5!lJgW zWnA*?v>+`DyGkP-vt&5tx?=1XIK=DK5tpV_7N*IF>wBF}XO}JKVasVeU1dcI#ADen))5lZYpw;4(8~(>2P+=_%hAJdU)VPWaWt zbb~Reu<4KumCD4?RB_2zW;S?X2A~Je9tUqxnGCwU;5nD?RXPdY9MEoQ{?QXGRuQ1G zhbYEW{jb3GWOxozEYXRmS}yqjm$=C^9|eB;6Sdh^n;JwLad z8}7%KSz{i3*s`@3y&EQ@v>hE4qRZ4qN$GYQk*@BQQ+%4;L5j~4fgc5ZwU3Y1brCK@Ig4f&&hE}FutuxvPH6-6>F0x!fR5my$6emzV2+*>(HOAIho*P49h$Ya zG(K-}A!%X1WI!(RITx2THgHB)O;pG$<)%te-_RhPXG&cRdEFP(uj6KcpXZi)l$h0H!Z>F|^qAHhpLG277h> z=Kbq5gjx3mj@#ePIr$d_KlBd_gJfpA3tmn8Z4&`6jM!$Lh literal 0 HcmV?d00001 diff --git a/gestion_conge/migrations/__pycache__/0006_reservation_besoin_ordi.cpython-313.pyc b/gestion_conge/migrations/__pycache__/0006_reservation_besoin_ordi.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5437fc0190ec5bd561c64e35e9865fcbd00e61e GIT binary patch literal 862 zcmZuwO>fgM7`Br%ZL(H$g^7uxsY0Dl4vb!gGz3E})dZ#NP>TaqG%Ib~Dv-v-PAkC) z35g3AF8dGgZ`dxaeC4!TQ9)d>(^c&xEX8@A_sg%JH<{;hHjwMfyXiH z&}9t^S1)Wh$IL2&KX3gaTMEmJO z_m$LwyVYj1RE=rdtrPw>rbD-0chU3KGxv(7?&=G0rMeH+mBee>?G4{EHI!sifIpVo zXD~B?Rf98KyJ3E8&TL>^pJa;Xnd0m56Wu>3b()TeuXCy^u(VsWCn+#>e2L?ZKOA@m{JkyQRBfGhhC;9SOzWfJBl4Sn_NM+~) literal 0 HcmV?d00001 diff --git a/gestion_conge/migrations/__pycache__/0006_reservation_besoin_ordi.cpython-314.pyc b/gestion_conge/migrations/__pycache__/0006_reservation_besoin_ordi.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..944695870de788fef90dcb15f0a36e8d7a82a967 GIT binary patch literal 869 zcmZuw&ubGw6rS1LY<9P4t1=QqWTl z;@Pu*f&MpIgoe3#@)l^(t8aE2TcLA!`+YO}-uvFSvsV}9Jp}9XtzI<22>sM#wsHqx z?>>Mr+Co0wKn*N$!;r>BR6>`KZ!96-Y~!XqOFDdBGcznr-@1${xnG)A4CM`?J`ZHX z5~1t?3u!F6hgk@@2V^e>Fh*@8v5%y&WkVsiilx=gH48@*G7Ms{Z?yBx#beJvgr8e8 zvNPXaI}iu;Tt6>8-vNo9a-Yt$sX0ys<=d%HHP@knMG0X%jMm?m>M2_ZuV|hGl8*Sw zJs2$?(q1r%r7CPw-eH20BpA?&2{Y?CQ>HAvr*gfB#^G1A32F0vDzqP@%aT4-Lh#3w6d~8YJnK^4O5hzE+74Awfx(1XA*-Gm=yg!WSTG zPaCUVJiOU@4iZJH(QG}U;*Dg(*0T-2k%j-pY#m;M77Tpj=y2qS-PPecu5VWwG!Sjnnq{$<#ycsao`u)i3m0{pFA1tNpy?dQ;Ob z+8-YCv$J}e6-&9{>mcc~YS>BbNKME(>cO&imjNl~c4qQjejX_NEl8Y$Ff}p8e{6&+ V`*s1_pS<10^7qB^Zv-UG{tE{mF*btn~_|(rq~_r=C1v4Vsnr?e11E!A6%#Y6Io*#~X(}8p6F! z4IQM47CSS1LcMx`v!bh7+h3uX=!QBJHI4*nyRL?2fZ6_`))f}YLpC`gB5OC*OZ@jkzcO=^a=rQaC3~l9%w{AcV0NUZU5%=3 zvR6hgu$8ATUO&&g*-|{a9FL5&f4Hf$+)#E4zp9EX6wpfz?k_(WH?0wEKdmtfMEEC+ z0v_-_4}bs9i+}h#C!^3NuppK7K1{qOUI~AA`OdX>%SjYJTC4k*yLPVc9=|UB0te0Y AjsO4v literal 0 HcmV?d00001 diff --git a/gestion_conge/migrations/__pycache__/0006_reservation_besoin_ordi_reservation_date_debut_range_and_more.cpython-313.pyc b/gestion_conge/migrations/__pycache__/0006_reservation_besoin_ordi_reservation_date_debut_range_and_more.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b5130dbb05ab578f04385cfbf439e3189f5ebfd GIT binary patch literal 1166 zcma)5&rcIU6rTOjZFk#BT|o#Wrj!!x1@M3g#$c!oQA7@1y_hwVZFkzNYUdGXDbO@R<~HZ$|RH}Ac9`M%jfK5rlxcYp7AB?X~x z!bnEy3=CEQ>>~?V(o?h{F=<0)auH3T60+oJWGS{(*OH{sz6|xmU`ku9q)r8_$lU07 zZRSKC4MMJUs7w5?DUOnnJp+TU0QQlMm}DU)TM|<&c~N4jovP=O;L#4PD3)rc>xGdo zL2#C`G%LL#TbUK*FZnv;n@QGahkOIR>_78!|C7I{FvH5TZ2MYejO))5HckcGz)!wS zLctDh(x6Rvd1+~B88gzMy95U`@>*UqW)FNJVY@Nr*$YO4gwzW#Wv;jWcB&d%MfY|u zC<<5LM5M=x58)M2zW^>ndu?;GxE9fuc8!GF5$)Qwnr%I)KejJuVvk<1 z4eH!GuLM5F{RRJJ-mnw6zyu=;-8W49Jn>EhGah#bs z%FLWhmQSwVIx(k?&G{p9{(yX`+K1+=A8A!LE{Dy?W;oZEdk&(=2??3fW3aYUt^q(Rv&3#9)f8&ZCO}xn zI?M}$i0i%3C4STqTj|K17)Poke%nG!vJsOvGyoc_N=$8OjeMFsT7isY%dJeKFp8xX z>;VZ|Tat$nTVFaM_aCebU|A``Xa%e+e8z>a%!^`G6=vEwmb3HFx^ZqiPkY95lthGX zCk^DeHi<$nz#(vgdc=2m!G+VI9qQCBSHH-wC!LG4_2vo@8|4|H=LrvczJPg@eZb>7jDBZL*{k8PQo2xf9t5^c@`%WFyYK*m;cK#Evg$fp-bx zu16#0djSbTvF(yR30x9%JQ7hMDbGH3-BrP#s>03J!q6v9kc7Cg0woPiGwhS}7EWRu zF(B2!4rA1Vf=Pri72+QW;raU~_nWVPZPctcnkyvQVqw4eV$H4(r&AR-N7uUvwcq`> zPW+Etr{ZT@jh(=SE>KeKzop`BC6joN(I=QbqJfT#nlw=434Q0;z(mHCgY3*+cII%Z ze0cf#p*4MAE$mqfyX0G~xo@?OGpb>pO`A{BN_$pmcjD{HzIE^1thw{ErV5t+;VGR> zxvf`JZn&@Eo`hAmooJCLFk~-UIm|7B#j_8F3O}SJaN(Jw=o(A|MUteS=;pD0RnkA3 P2Zi$YLislWCpr5EibgI4 literal 0 HcmV?d00001 diff --git a/gestion_conge/migrations/__pycache__/0007_remove_reservation_besoin_ordi.cpython-310.pyc b/gestion_conge/migrations/__pycache__/0007_remove_reservation_besoin_ordi.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c10521e9f70e84d283ada4efb21cb606ab09e65 GIT binary patch literal 573 zcmZ`%y-ve05VoDPq-iU`!oU#3bwgbA)v6(fVouT0N)x<~o7h%RdUrQW% EKj?9s;{X5v literal 0 HcmV?d00001 diff --git a/gestion_conge/migrations/__pycache__/0007_remove_reservation_besoin_ordi.cpython-313.pyc b/gestion_conge/migrations/__pycache__/0007_remove_reservation_besoin_ordi.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f360bcaddb4a3eefa5f8df404eeecfb0a8c4d939 GIT binary patch literal 722 zcmZ`%O>Yx15FPJVcQ=hF<)eVAsGwX{pppw9A{412LQp~vvA7^h)+Xz&7Ls*pZz^#^ zLgLJ&KZ2hFmsY-V>Mbbrj=kHEaKMN08_yfh%(Lh9dI)+w=p1G_0{Cg1#d0sfysg0r zV8G}#>?478;1=8iY~2BD6V!JW3CsPFU14FRPUM~&CqgP5XQ_ybjOTK=Mwb)5OS9^^{3dl@58H zGPT`mwH{N!BooJFH*~-x&vME|lBwECK-E?v`l4{m6E>oGJZ8!<_8S~Tf%0j2M5ziX z)s*RoX}nJ9(KH?zn)a?xdYB1WjIx~N+=LT0VR^#xVaB8|dZ}8UjrlQqk+D&tLOx-a zVyPRH%0jm~q;XM*Y%ndDq*T;((%fjF;^%GhR?j2JUaz;aSMYbF%jAcGPe`{*@T>ky z@{a~&`4U8{@kFa(D*sQE-N{E`9;q}&RC!;UFEH~UXwPixy7#F!3n936>NkG)jkB%h z+117`*ABv&?QVLX_r=Xc_CaK;AbB6>Dc?;7<=oZPW|)e$rIGTVRYG>eZSCr>336MT cnT-&-@BrQY?bVR?H9XyDe&1+bfOg94KUrwL?f?J) literal 0 HcmV?d00001 diff --git a/gestion_conge/migrations/__pycache__/0007_remove_reservation_besoin_ordi.cpython-314.pyc b/gestion_conge/migrations/__pycache__/0007_remove_reservation_besoin_ordi.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..98e0fa7d6ac15b722bf7851704b87e74959824e9 GIT binary patch literal 723 zcmZ`%J#Q015S_iR_|6F=fC)up6ye5-WVt|z6j?N&$Uz~p7SWxvvV9xtg1u*U*OBO4 zAZq>wKL?sb+fvb;lt9g_FUF=|i@7&@GjHb2?B2bN2=KH{&Qn1EepqL5{5x>dLNJ3f zpyU|ZM3bjbfnA`^Hc+=qI^H5-`F-vdSUc2v26g|Zb?d}L<8&x{I?aR{ETaMbmO8@Q z8FWDt3fegfv`d2q(O%c@tgj{%7@Hu}q3(fG_!zlHJzb(c7F{#pn?*HKmRxapIWKL> zeXg=puuLXt-NB}^gpZi$jk)ox{R*dey)op}IY&Q4V3JqIj2~CO385lDW zW5_riam4G4eVFz}mKDAGjGd=a=}{`U$n5WgPq;|97^GZDJ2X?Ke4JhKqm+*l6J-;A zH!o9ROlcG_U_Gs6+MjB!7?XB?H&(vszC4WIp-L6EJMk;7-s@}fgc5Zws1UvRvN)NEv1RY3yKy9Xg(LkT z{H48e;x8bfGP?ye92jZFJ2OxFW}eqfCL>1n^>|%*&e->m>{~*~3AuYj0T}RxwLIso z$OUJw7zmJG7)a!`{48?`$pxGBeh`+;gdeq4X^U-TwDbMe05)zFTKhJjSKDIm)^ zuv`Eyc`h-jdw~G^^#Bs+LH}C7;962Ig_MYfe)#q;1JO-Nbb(B*j4shXTr3t(l*QKU zkUkFWF3zHs=uD-Ru~7Mgy@o&7>zrLZIE}a|Jnr-~fOWCO&Q6~b)c|l^bj{X}cW9T! zq0&W*Gf69lHDl(JQ1iWYg$u+iApv6e`62sgTFllY1z`5lthyHU)@ARksd1|= z-n@UE#qf`2+1(GzNWG{3lWo5FWW&qole_yAQYK__lk@}^e9V(y=}qjP&k{d`y3nPW g!!oWDmx#@~X>U(QbdOJ;-3oI|kCC~+aZen{-*aZb9RL6T literal 0 HcmV?d00001 diff --git a/gestion_conge/migrations/__pycache__/0008_reservation_besoin_ordi.cpython-313.pyc b/gestion_conge/migrations/__pycache__/0008_reservation_besoin_ordi.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3073b82dabe509cdbe2d74eec7701adb90214509 GIT binary patch literal 864 zcmZ`&O>fgM7`Br%ZPHeB1w_TrRKX^c%jgBc5EOM(6O6G#EiRM6N*lKdq;av+N^n9# z;>3Z={sa6Qwo5BtIqgnyC-Sqeu7f zb0v+yje~<~BVk9lNyY1g4REuG(UaC={FkbD`3A7k_wN6M-5$K<`dZRS1MxsjAHmcH zP6JL&Y-*_^CxOv;sUdF!;i^@V=h#V6$#KeCqNPEEUPf7s{i zi~SBgOFF?TKkl*Zpq)yR3Nb%XH#d*HrjX3tp9@{*8;YtQ1qf}Qnh?U@Hh|twy8!La Q?zpshQri3l6iKuH05>w|s{jB1 literal 0 HcmV?d00001 diff --git a/gestion_conge/migrations/__pycache__/0008_reservation_besoin_ordi.cpython-314.pyc b/gestion_conge/migrations/__pycache__/0008_reservation_besoin_ordi.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..07ae4d0e448e7c38acb2aaf157d433d55f8d931f GIT binary patch literal 871 zcmZ`&&ubGw6rR~lHrZ`jYqYdje^lBcK`1>474cWAlvHX7D|*^=*koVA>Sia-ObUAH zK|K2h_y_2JqeV!Wt0!-P7QOmrx3Lv;4sX71X5X9deLHh=YSJS(K5lnnO$qsK$aoY_ zz|lhl`(&5+bc@ufqIFAI*T@XHPJC;Y_;!;voN?0We9O+Uvi-s$sTF@1TC=p*i@PFJ zF;As-dOU(ewokJNaZkumf?%ICiK0GH)~qqI6{sM2kycY1o6BjcuD&Go}k>O&2>cB++NGgK3jpkj4_$=4lu7 z;_B+^8WYgtdw|m)A?%Ef+Jr8%tR7?9V+`vL5Tw4}{Kr9|8sD3FYaDa<-D z*6J6J?gYu649oKe<@v+erNi@A536&->heK#`4fEE2)}#W)A9V(>b<2?2m5iJdQg=oMS;2u7 z0(iv>iAj@&0XS;*AfYe45iq)Wi0?g(SE9%uqXou({OMsbtud|8g(cL|=nDPOd_I4r zEIPE`;&N(%&eU2N3$=f?lkf*n_NV|CL$7Q}#h{E$cUh?;!+ zUOAEU`VmP_sZgZ`!eH@u{oRJ&WJKzY$Ye~&|HiglPxjP~HLa0K>ol literal 0 HcmV?d00001 diff --git a/gestion_conge/migrations/__pycache__/0009_reservation_date_debut_range_and_more.cpython-313.pyc b/gestion_conge/migrations/__pycache__/0009_reservation_date_debut_range_and_more.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9096966d4fb059d79c16e8464d7ca15004b9c0fe GIT binary patch literal 953 zcma)4&ubGw6rR~%$!;4>W5r@C)-;z~+FS%vq!0|EG4_zri!2PA>?E$;?4~mt!J8m> z_R_0oy?ONCXfFwK_0(G=ir~pN8$;Ss#DRJH-n{qCyzhHE&E*^f>+A2sfN2PQQ^9358Y*HT1lyNC(FQ#OD7(%`82OnDiYw>pAcSyh z&E{q;iC?&NCJvH#;MVIddE9#Bo)gbq{3MX{(C`M{C0?ZF$aW|11@2oKDA zG_jDqJJGdO>uq!5Ap6=VyMB^gAKxgASGLB5wNasXQYd~}{Zc9n?YHxujv-f9n+2gk%#IS|BXrg0`e_05Z Ve^@Kn`rwT6rQ>|*CxReF{{i-=^|k;2 literal 0 HcmV?d00001 diff --git a/gestion_conge/migrations/__pycache__/0009_reservation_date_debut_range_and_more.cpython-314.pyc b/gestion_conge/migrations/__pycache__/0009_reservation_date_debut_range_and_more.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bedff98d86b09e4980ecaa4b324f7e65f034dcd0 GIT binary patch literal 972 zcmb7C&ubGw6rR~lHoKdqO=C-i6s12dK?perwM9fRNGe*ws<))WCNm9dH@k6WB6!O| zJo{(p&7*&USBuavS5MvoDSGwIZbRBq1PA8Ldo%OB_r7oD&SJquFuvJ5U)Wgf}oHzH6T-N{Qsv6Sqa?Pto_>kK8~e$-!4L6ky2qXPgJdQ50NNjHXcYQ0vg z-6I!Dk`5CwKw?gVN?zF{Nlb`x34ubxkb%EI$eW=b>S7Qr5poo8A;TbIQLK+C8?cD7 zs2ecBwR*~aMClXV70>9yw`dK z@`zTW*{U;fEaO4z#lF`_%_VNF`QK>)%iT*Xuj)$thyp*(s)Ki2f6&BeNBCeqpoxW? zy@_e8SfghX7dbah?ed9T9MM7>0_v@0z|dUqW>W#3QV|FICRoLS4* R`skh(x4##+eY zp=PKk41WB_h*cODjqrTrI6PM zm30&=*U}3I40Zgul4;xveSkWz2p|lBad5qC{SmGmleazyI za3k*7nSVFQovkRjWkyKJg`KY}svDnNIlG_+uD}2MmUL!^da{{pVoYkFBFC&IW^!cG z$pq5Wq=&0Vr@7A;R^M*8FO*g?dhPeR{4~~KfD0anJ;a%77t-Z7k9+sVd=UC4?<`OG Mg9zV_Y^3(|8=;Y#Y5)KL literal 0 HcmV?d00001 diff --git a/gestion_conge/migrations/__pycache__/0010_merge_20260122_1101.cpython-313.pyc b/gestion_conge/migrations/__pycache__/0010_merge_20260122_1101.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a7e3e6001326bb1cb640548d8941297a3f6ff82 GIT binary patch literal 688 zcma)4&ui2`6n>Lz(%s-%>U%3MA5wy^Hqnf<}in*(|IzRY`H=6!Fb&1L{*UChplf&u)oWVO5{m>wB$ z2?-?Z6`U|)Ew~L2AaU+O;&OIYTNSL|kK6?&C$ELxl_eq5!LZ0FtqNJH{yG=HS(0hX zfJ@*&ECF&7MsDIH?!H5{eIPHXk)L~^uN$vdI#<4_2p!$bg|fQXmt`*W(vlslDIea|?9z}74LqVqR zcGNzI;&vP3IEwd1U&u~>9<0UcjtSpj;zQ#-`(1xN@!VVfMRyXgE&uBYZLM-oLsvJl zkH$&4m-Wcrf`yPh?;>s6AYFgFaOMf^7-}vasCy<%T*lbU2X_CjUuXXJ;MeBv&&}N# I7&5Q^2b$Zu;Q#;t literal 0 HcmV?d00001 diff --git a/gestion_conge/migrations/__pycache__/0010_merge_20260122_1101.cpython-314.pyc b/gestion_conge/migrations/__pycache__/0010_merge_20260122_1101.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b38b52a0c6d3eb48ca5849ae6d0e481a09d51f9e GIT binary patch literal 683 zcma)4L2DC16n?XtY?H-mTUtaAq}t0WgxydIO6frbQ_)gJylwm3WT#;?*^M(3p|>2w zbN_}v$CENwPu>Di&%Vhfgx;LP+wYrs@0<6&okusbvh(*m%750HXRYMr`N<^Moqi*a&l6w4~C2O{USY$(iXhS5K zd^~XY2I9wYHdvh8LcEYln}IAuQM%(?j6{)(q9=v6VL1{Dlk5(nHZ(vFGh>vbE`>%^ z0W~&ro>~6vN&1$i)M@85eJ=C|Q;yO%$GlU8Yp$d#_tQ8|VjK!Z1GnS$L7cSPm?Ux1 z8eJ;)^++&HO!CShn)6au1*q waw1jQ79ra>tXw%#+eGQjfxb&&>NCdv1i*HG2Mrcnh2J;!zHRLN1tRn6f9Ddn5C8xG literal 0 HcmV?d00001 diff --git a/gestion_conge/migrations/__pycache__/__init__.cpython-310.pyc b/gestion_conge/migrations/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0cb921b12988828c4866d713661bad97b1db9b5c GIT binary patch literal 146 zcmd1j<>g`kf+BtHOc4DTL?8o3AjbiSi&=m~3PUi1CZpd>1>tpPpJ=l9`_upPZkUo~oalnO>9#;uq`3$7kkcmc+;F6;$5hu*uC&Da}c> M0~uG$1SD7(03e|t1^@s6 literal 0 HcmV?d00001 diff --git a/gestion_conge/migrations/__pycache__/__init__.cpython-313.pyc b/gestion_conge/migrations/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd80a58b13123ddc0e85a68877bb3b9c1e101fbd GIT binary patch literal 167 zcmey&%ge<81WAhAnIQTxh=2h`DC08=kTI1Zok5e)ZzV$!6Oi{ABz4Qp*(xTqIJKxa z#?i+|!LcMiD#j(XIJ+djAjZWdCfGB`BPKnyxFj<_FFrXxFFiFTH#5B`5yUT!iI30B o%PfhH*DI*J#bJ}1pHiBWYFESxG!|rSF^KVznURsPh#ANN00QbMG5`Po literal 0 HcmV?d00001 diff --git a/gestion_conge/migrations/__pycache__/__init__.cpython-314.pyc b/gestion_conge/migrations/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2870925b9db6ed7509ace7caeeaa44a92a75d9cf GIT binary patch literal 165 zcmdPqhza%#@_-QOsl_Fk`FZil`FZK7F}a!PMTsDOaZG%CW?p7Ve7s&k h { + const form = document.getElementById("form-detail-conge"); + const csrftoken = new FormData(form).get("csrfmiddlewaretoken"); + const actionUrl = form.action; + const id_conge = document.getElementById("id_conge").value; + const validation_hierarchique_input = document.querySelector('input[name="validation_hierarchique"]:checked'); + const validation_hierarchique = validation_hierarchique_input ? validation_hierarchique_input.value : null; + const validation_direction_input = document.querySelector('input[name="validation_direction"]:checked'); + const validation_direction = validation_direction_input ? validation_direction_input.value : null; + const motif_refus = document.getElementById("motif_refus").value; + + fetch(actionUrl, { + method: "POST", + headers: { + "Content-Type": "application/json", + "X-CSRFToken": csrftoken + }, + body: JSON.stringify({ + id_conge, + validation_hierarchique, + validation_direction, + motif_refus + }) + }) + .then(response => response.json()) + .then(data => { + alert(data.message); + navigation.reload(); + }); + }) +} + +if(document.getElementById("validation_hierarchique_refuse")){ + document.getElementById("validation_hierarchique_refuse").addEventListener('click', function(){ + if(this.checked){ + alert("coucou"); + document.getElementById("motif_refus_container").className="d-block form-group mt-3"; + }else{ + document.getElementById("motif_refus_container").className="d-none"; + } + }) +} + +if(document.getElementById("validation_hierarchique_refuse")){ + document.getElementById("validation_hierarchique_refuse").addEventListener('click', function(){ + if(this.checked){ + document.getElementById("motif_refus_container").className="d-block form-group mt-3"; + }else{ + document.getElementById("motif_refus_container").className="d-none"; + } + }) +} + +if(document.getElementById("validation_hierarchique_valide")){ + document.getElementById("validation_hierarchique_valide").addEventListener('click', function(){ + if(this.checked){ + document.getElementById("motif_refus_container").className="d-none"; + }else{ + document.getElementById("motif_refus_container").className="d-block form-group mt-3"; + } + }) +} + +if(document.getElementById("validation_direction_valide")){ + document.getElementById("validation_direction_valide").addEventListener('click', function(){ + if(this.checked){ + document.getElementById("motif_refus_container").className="d-block form-group mt-3"; + }else{ + document.getElementById("motif_refus_container").className="d-none"; + } + }) +} \ No newline at end of file diff --git a/gestion_conge/static/gestion_conge/js/index.js b/gestion_conge/static/gestion_conge/js/index.js new file mode 100644 index 0000000..1d156cf --- /dev/null +++ b/gestion_conge/static/gestion_conge/js/index.js @@ -0,0 +1,71 @@ +const $ = (element) => document.getElementById(element); + +const url_liste_conge_attente = $("liste-demande-conges").dataset.url + +const tableau_liste_demande_conge = new Tabulator("#liste-demande-conges", { + layout : "fitColumns", + columns: [ + {"title": "Nom et Prénom", "field": "prenom_nom"}, + {"title": "Date de début", "field": "date_debut", formatter:"datetime", formatterParams:{ + inputFormat:"yyyy-MM-dd", + outputFormat:"dd/MM/yy", + }}, + {"title": "Date de fin", "field": "date_fin", formatter:"datetime", formatterParams:{ + inputFormat:"yyyy-MM-dd", + outputFormat:"dd/MM/yy", + }}, + {"title": "Type de congé", "field": "type"}, + {"title": "Date de la demande", "field": "date_demande"}, + {"title": "Validation par supérieur hiérarchique", "field": "validation_hierarchique", formatter:"tickCross", formatterParams :{ + allowEmpty : true , + }}, + {"title": "Validation par supérieur hiérarchique", "field": "validation_direction", formatter:"tickCross", formatterParams :{ + allowEmpty : true , + }}, + ], + pagination: true, + paginationSize: 5 +}) + +const bouton_demande_conges = $("bouton-demande-conge"); + +bouton_demande_conges.addEventListener("click", (e) => { + var modalDemandeConge = new bootstrap.Modal(document.getElementById('modalDemandeConge')); + modalDemandeConge.show(); +}) + +tableau_liste_demande_conge.on("rowClick", function(row, rowData) { + const data = rowData.getData(); + $("id_conge").value = data.id; + $("employe").value = data.prenom_nom; + $("type_conge").value = data.type; + $("date_debut").value = data.date_debut; + $("date_fin").value = data.date_fin; + $("date_demande").value = data.date_demande; + $("nombre_jours").value = data.nombre_jours; + $("solde_restant").value = data.solde_conge; + $("motif_refus").value = data.motif_refus; + + if($("validation_hierarchique_valide") & $("validation_hierarchique_refuse")){ + $("validation_hierarchique_valide").checked = data.validation_hierarchique === true; + $("validation_hierarchique_refuse").checked = data.validation_hierarchique === false; + } + + if($("validation_direction_valide") & $("validation_direction_refuse")){ + $("validation_direction_valide").checked = data.validation_direction === true; + $("validation_direction_refuse").checked = data.validation_direction === false; + } + + const modal = new bootstrap.Modal(document.getElementById('detailsCongeModal')); + modal.show(); +}); + +fetch(url_liste_conge_attente) + .then(response => response.json()) + .then(data => { + if(data.success === true){ + tableau_liste_demande_conge.setData(data.data) + }else{ + alert(data.message) + } + }) diff --git a/gestion_conge/templates/gestion_conge/index.html b/gestion_conge/templates/gestion_conge/index.html new file mode 100644 index 0000000..17d1ff6 --- /dev/null +++ b/gestion_conge/templates/gestion_conge/index.html @@ -0,0 +1,51 @@ +{% extends "BASE.html" %} +{% load static %} +{% block 'titre_page' %} Gestion des congés {% endblock %} +{% block 'contenu' %} + {% if messages %} + {% for message in messages %} +

{{message}}
+ {% endfor %} + {% endif %} +
+
+
+ Congés refusés +
+
+
{{ nombre_conges_refuse }}
+
+
+
+
+ Congés en attente +
+
+
{{ nombre_conges_en_attente }}
+
+
+
+
+ Congés Validé +
+
+
{{ nombre_conges_valide }}
+
+
+
+

Liste des demandes de congé

+ +
+
+
+
+
+{% endblock %} +{% block 'modal' %} + {% include 'gestion_conge/parts/modalDemandeConge.html' %} + {% include 'gestion_conge/parts/modalDetailConge.html' %} +{% endblock %} +{% block 'js' %} + + +{% endblock %} \ No newline at end of file diff --git a/gestion_conge/templates/gestion_conge/parts/modalDemandeConge.html b/gestion_conge/templates/gestion_conge/parts/modalDemandeConge.html new file mode 100644 index 0000000..511d7dc --- /dev/null +++ b/gestion_conge/templates/gestion_conge/parts/modalDemandeConge.html @@ -0,0 +1,26 @@ + \ No newline at end of file diff --git a/gestion_conge/templates/gestion_conge/parts/modalDetailConge.html b/gestion_conge/templates/gestion_conge/parts/modalDetailConge.html new file mode 100644 index 0000000..d3d3051 --- /dev/null +++ b/gestion_conge/templates/gestion_conge/parts/modalDetailConge.html @@ -0,0 +1,92 @@ + \ No newline at end of file diff --git a/gestion_conge/templates/gestion_conge/parts/modalModificationConge.html b/gestion_conge/templates/gestion_conge/parts/modalModificationConge.html new file mode 100644 index 0000000..7a920ca --- /dev/null +++ b/gestion_conge/templates/gestion_conge/parts/modalModificationConge.html @@ -0,0 +1,48 @@ +{% for conge in conges %} + +{% endfor %} diff --git a/gestion_conge/templates/gestion_conge/parts/modalRefus.html b/gestion_conge/templates/gestion_conge/parts/modalRefus.html new file mode 100644 index 0000000..ab358f2 --- /dev/null +++ b/gestion_conge/templates/gestion_conge/parts/modalRefus.html @@ -0,0 +1,24 @@ + \ No newline at end of file diff --git a/gestion_conge/tests.py b/gestion_conge/tests.py new file mode 100644 index 0000000..de8bdc0 --- /dev/null +++ b/gestion_conge/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/gestion_conge/urls.py b/gestion_conge/urls.py new file mode 100644 index 0000000..c8b0511 --- /dev/null +++ b/gestion_conge/urls.py @@ -0,0 +1,27 @@ +from django.urls import path +from . import views + +app_name = "gestion_conges" + +urlpatterns = [ + path( + '', + views.index, + name='conge' + ), + path( + 'demande_conge/', + views.demander_conge, + name='demande-conge' + ), + path( + 'liste-des-conges/', + views.liste_demande_conges, + name='liste-des-conges' + ), + path( + 'validation-des-conges/', + views.validation_de_conge, + name='validation-des-conges' + ), +] \ No newline at end of file diff --git a/gestion_conge/views.py b/gestion_conge/views.py new file mode 100644 index 0000000..0b92e84 --- /dev/null +++ b/gestion_conge/views.py @@ -0,0 +1,225 @@ +import json +from django.http import JsonResponse +from django.shortcuts import redirect, render +from django.contrib import messages +from django.contrib.auth.decorators import login_required +from gestion_conge.forms import CongeForm +from gestion_employe.models import Affectation, Employe +from django.forms.models import model_to_dict +from django.utils import timezone +from django.db.models import Q +from fonction_utilitaire import fonctions_utilitaire +from .models import Conge + +@login_required +def index(request): + """Vue de gestion de l'index""" + + employe = Employe.objects.get(user__username = request.user) + membre_direction = 'direction' in employe.user.groups.values_list('name', flat=True) + + try: + affectation = Affectation.objects.get(employe = employe, date_fin_daffectation__gte = timezone.now().date()) + except Affectation.DoesNotExist: + affectation = None + + try: + projet = Affectation.objects.get(employe=employe, date_fin_daffectation__gte = timezone.now().date()) + except Affectation.DoesNotExist: + pass + + if employe.chef: + nombre_conges_valide = Conge.objects.filter(validation_hierarchique = True, employe__departement = employe.departement).count() + nombre_conges_refuse = Conge.objects.filter(validation_hierarchique = False, employe__departement = employe.departement).count() + conges_en_attente = Conge.objects.filter(validation_hierarchique = None, employe__departement = employe.departement).order_by('-date_demande') + + elif membre_direction: + nombre_conges_valide = Conge.objects.filter(validation_direction = True).count() + nombre_conges_refuse = Conge.objects.filter(validation_direction = False).count() + conges_en_attente = Conge.objects.filter(validation_hierarchique = True, validation_direction = None).order_by('-date_demande') + + elif affectation and affectation.role == "chef_projet": + employes_du_projet = Affectation.objects.filter( + projet = projet.projet, + date_fin_daffectation__gte = timezone.now().date() + ).values('employe') + + nombre_conges_valide = Conge.objects.filter( + employe__in = employes_du_projet, + validation_hierarchique = True + ).count() + + nombre_conges_refuse = Conge.objects.filter( + Q(employe__in = employes_du_projet) & + (Q(validation_hierarchique = False) | Q(validation_direction = False)) + ).count() + + conges_en_attente = Conge.objects.filter( + Q(employe__in = employes_du_projet) & + ( + Q(validation_hierarchique__isnull = True) | Q(validation_direction__isnull = True) + ) + ).exclude( + Q(validation_hierarchique = True) | Q(validation_hierarchique = False) | + Q(validation_direction = True) | Q(validation_direction = False) + ).order_by('-date_demande') + + else: + nombre_conges_valide = Conge.objects.filter( + employe=employe, + validation_direction = True + ).count() + + nombre_conges_refuse = Conge.objects.filter(Q(employe=employe) & ( + Q(validation_direction = False) | Q(validation_hierarchique = False) + )).count() + + conges_en_attente = Conge.objects.filter( + Q(employe = employe) & + ( + Q(validation_direction__isnull = True) | Q(validation_hierarchique__isnull = True) + ) + ).exclude( + Q(validation_hierarchique = True) | Q(validation_hierarchique = False) + ).order_by('-date_demande') + + + return render(request, 'gestion_conge/index.html', { + "nombre_conges_valide": nombre_conges_valide, + "nombre_conges_refuse": nombre_conges_refuse, + "nombre_conges_en_attente": conges_en_attente.count(), + "formulaire_demande_conge": CongeForm, + "employe_est_il_chef": employe.chef, + "membre_de_la_direction": membre_direction, + "est_chef_projet": affectation.role == "chef_projet" if affectation else False, + }) + +@login_required +def demander_conge(request): + """Vue de gestion des demandes de congés""" + try: + employe = Employe.objects.get(user__username = request.user) + except Employe.DoesNotExist: + messages.error(request, "Votre demande de congé a échoué car votre profil Utilisateur n'est lié à aucun profil Employé. Veuillez contacter l'administrateur.") + return redirect("gestion_conges:conge") + + retour_quota = fonctions_utilitaire.solde_conge(employe) + if retour_quota["success"]: + quota_annuel = retour_quota['quota_annuel'] + else: + messages.error(request, retour_quota['message']) + return redirect("gestion_conges:conge") + + if request.method == "POST": + form = CongeForm(request.POST, request.FILES) + if form.is_valid(): + conge_obj = form.save(commit=False) + conge_obj.employe = employe + + if conge_obj.type == "conge_annuel": + if retour_quota["nombre_jours_valide"] + conge_obj.nombre_jours > quota_annuel: + messages.error(request, "Quota annuel dépassé (30 jours max).") + return redirect("gestion_conges:conge") + + conge_obj.save() + messages.success(request, "Votre demande de congé a été enregistrée.") + return redirect("gestion_conges:conge") + + return redirect("gestion_conges:conge") + +@login_required +def liste_demande_conges(request): + """Vue de liste des demandes de congés en attente de validation selon le statut de l'utilisateur actuel""" + try: + employe = Employe.objects.get(user__username = request.user) + except Employe.DoesNotExist: + return JsonResponse({ + "success": False, + "message": "Votre profil Utilisateur n'est lié à aucun profil Employé. Veuillez contacter l'administrateur." + }) + + try: + affectation = Affectation.objects.get( + employe=employe, + date_fin_daffectation__gte=timezone.now().date() + ) + except Affectation.DoesNotExist: + affectation = None + + if employe.chef: + print("chef") + conges_en_attente = Conge.objects.filter( + employe__departement = employe.departement, + validation_hierarchique = None + ).order_by('-date_demande') + + elif affectation and affectation.role == "chef_projet": + employes_du_projet = Affectation.objects.filter( + projet = affectation.projet, + date_fin_daffectation__gte = timezone.now().date() + ).values('employe') + + conges_en_attente = Conge.objects.filter( + employe__in = employes_du_projet, + validation_hierarchique = None + ).order_by('-date_demande') + + elif 'direction' in employe.user.groups.values_list('name', flat=True): + conges_en_attente = Conge.objects.filter( + validation_hierarchique = True, + validation_direction = None + ).order_by('-date_demande') + + else: + conges_en_attente = Conge.objects.filter( + employe__user__username = request.user + ).order_by('-date_demande') + + return JsonResponse({ + "success": True, + "data":[ + { + **model_to_dict(conge), + "prenom_nom": f"{conge.employe.user.first_name} {conge.employe.user.last_name}", + "date_demande": conge.date_demande, + "nombre_jours": conge.nombre_jours, + "type": dict(conge.TYPE_CHOICES).get(conge.type), + "solde_conge": fonctions_utilitaire.solde_conge(conge.employe)["quota_annuel"] + } + for conge in conges_en_attente]}, + safe=False + ) + +@login_required +def validation_de_conge(request): + """ + Vue de validation de conges par le superieur hierarchique. + 1- Si l'employe appartient à un département, le congé est validé par le chef de département. + 2- Si l'employé n'appartient pas à un département, le congé est validé par le chef de projet. + """ + request_data = json.loads(request.body) + conge_id = request_data.get("id_conge", None) + try: + conge = Conge.objects.get(id=conge_id) + except conge.DoesNotExist: + return JsonResponse({"message": "Le congé selectionné n'existe pas."}) + + if request.method == "POST": + validation_hierarchique = request_data.get("validation_hierarchique", None) + validation_direction = request_data.get("validation_direction", None) + motif_refus = request_data.get("motif_refus", "") + + if validation_hierarchique is not None: + conge.validation_hierarchique = True if validation_hierarchique == "valide" else False + if validation_hierarchique == "refuse" and not motif_refus: + return JsonResponse({"message": "Veuillez fournir un motif de refus."}) + conge.motif_refus = motif_refus if validation_hierarchique == "refuse" else "" + + if validation_direction is not None: + conge.validation_direction = True if validation_direction == "valide" else False + if validation_direction == "refuse" and not motif_refus: + return JsonResponse({"message": "Veuillez fournir un motif de refus."}) + conge.motif_refus = motif_refus if validation_direction == "refuse" else "" + + conge.save() + return JsonResponse({"message": "La décision a été enregistrée avec succès."}) \ No newline at end of file diff --git a/gestion_employe/__init__.py b/gestion_employe/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/gestion_employe/__pycache__/__init__.cpython-310.pyc b/gestion_employe/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..074f52a72e24173c3a3ca9e70445c5e766e5beb8 GIT binary patch literal 137 zcmd1j<>g`kf;MKROc4DTL?8o3AjbiSi&=m~3PUi1CZpd>1>tpPpJ=l9`_upPE~clV6#tA0MBYmst`YuUAlci^C>2KczG$)edAzF%ytr GVE_QyCLCV? literal 0 HcmV?d00001 diff --git a/gestion_employe/__pycache__/__init__.cpython-313.pyc b/gestion_employe/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..834a1761888796b790de32a0934c12fff9515a9e GIT binary patch literal 155 zcmey&%ge<81m#~DGePuY5CH>>P{wB#AY&>+I)f&o-%5reCLr%KNa~iAvsFxJacWU< zjH8c_f@4X3RE$e%adt_5K}@h`kVi~+seqMZPZb43dWok@(d}dx|NqoFsLFFwD eo80`A(wtPgB37VLAghW&jE~HWjEqIhKo$UEH6?cd literal 0 HcmV?d00001 diff --git a/gestion_employe/__pycache__/__init__.cpython-314.pyc b/gestion_employe/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e654d6653ab7282374958cea916d05e91e0aa3f GIT binary patch literal 156 zcmdPqhza%#@_-QOsl_Fk`FZiFxdl1-m8miD@tJvy`jTV&DT{$U=SqA&@}8K#^cUS*%c-5@g54Nr%qmLtx~WEHN=L zvoUdYE71Wg`E+;h{O;Y^tgrV0&+guPbwvO^e6V^F436+Nw`c?iqCk^^5D<}|D$=x| zIxb=YlDs66zLGN#u}GdlB$7OK=5$VqZouMzbwn32%q%e`*bQX8Ph^LTxTF-isy|T) zWRY7tk(1K4Qp>t^-BUeLW+q3zboKb+BfMV&G!hCTpoj!1sECl7y1@#|v8TsAv^IM9 z7CXjyU24g>>vOJ+m@4n5oIg!VwM0@?H7yraGg0O24eSQC3FbS?AB>iHW2{v9&BgV3 zK9)^enVQRm);x@}KbhGsK8n3aZy2yBWd5DScCZY!r^}%ix~Yq&jkK<(%hpyS6zkZ% zsYkx$(Dv}juegP`>2q75B|3gVAsS{qw;>+OdTjPbrbes4C+_l{XP m#`&>p|I%YYNe~~H{%Yvh!D5w%{%e{PO$r0TqHV(H4*3B-s*t__ literal 0 HcmV?d00001 diff --git a/gestion_employe/__pycache__/admin.cpython-313.pyc b/gestion_employe/__pycache__/admin.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d018c0bddf7fbaea27a1aeb1448f4231a7a00cca GIT binary patch literal 714 zcmbVJ%SyvQ6ur|l4-zX%RYVZ866&Hm5k!S*3pFV&8bpv#iFSz5yqHWEUAl7X#*grG zgo+aArmngx^aq@&4YkX936nGDOu=}QDX(CGg-kFI zK|04dGiL}ym|(%o8zK=WIB!aZOk^Ew)LhA|X76TkhBIV~`z(PMa}X`bR1J-23pr>r zhXr!we{~77E>|uoL;m9>l!{I}@InqO$M-Pp>UfOokRhLx5n2_;4xu=} zA-yOqrOWLHCv>CoT@+H{-4cHI>6(iZ>P6uVV_jShqBiyulIPM!CgIf=Oam8V$Wdqieg0lSdlGwsqdD z+nN0|+n!8bj=QOH#N0YQJ|X;?`KU>YEh7OT)Cau}yM5SW&qx9!J*!XZClueI_;S^Q c?LO>$f%u0sd!WxVb@tgjQ~Q7|vdSWU0F%j=0ssI2 literal 0 HcmV?d00001 diff --git a/gestion_employe/__pycache__/admin.cpython-314.pyc b/gestion_employe/__pycache__/admin.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73b477b2a6cba233c8bf5ad612af82e73c665844 GIT binary patch literal 932 zcma)4O=}ZD7=CAWvb#xR{YXnx($*5C2BD|uK|~NMB%raZcuO*DlWADpk2o_q1oQVMf^tHb zqlhJ%t9i6@GrEQX%iVxWYO&VC#XG&iOnQ`(n}zNN#J zh0&YxqB4gt$9TnB5Y!EwMo}&gKX}n7-X6q})`#hrB`qa34LH-gv4YMxjE5z>&K3h6LwF?8Gwb|sf wx^-OLN%hr68;b;*5zvepVy?5fdK?cmW2KlD-$#)q@`Oj3Z8`RR$~+$X%%=A| z>U;YFN(COhzPjeP8#I61kQ`1L-@ssp7=#HrVWKWD$&k{qT1C81xhO2=|hP3X;?JV9FK9!+QdY z=n{*TWKH3jmu!yQroOe0S<%|KXcu@}(Po}+maSFFhMU>rcS}*J*MgTmT%`x%Lk{H*L~`N zY8F%*@DcvzJ8v0FKn~BCxphmO@!gM%S?b;K-8Ex&*3fU}ZWtx%;T25UB#B|I*&}Nk zT*j!d1Q@}{cu9bVq@Kz?QvMQ2dQSW*!Y;xZdlewxN&<`t5)0|v=mh%hkR_7C)l)4O z68`wIE=(d}p_RoYA=e^kb1A^f;n@0+kdLD+!P&aH*rL_puB(JBiOa7c=Hjj0NB!A$ z&Uy+hKL^SG-!n)`M3WYIl+nBE5OOX79kd9K=H0SSKZkjV`dkT^!lNsehZ*JR<#pRB znAWoAI*?qTkj)0cWliF;N1Y;<+~rT%C0Ow=qN=Jg6?)zQ#>_+3@ry5${)7S+8t)T; zO;S&1c89iyYUzPWdf@R?H9h<&T2FLtO>IqmmwnvzL*Ms(Pp;Sc#w&f}^<<`!9H?h6 z)Usoh?ATA2o@r0DXTwj2tJ!PMQ`hQUncb=Fsom-A>F4cgJ=xVH43cwE>tMamvp$6L z2>l3n2cFh}%H>jyI+jlhbI5eojnW>J_8b)hVCae)Dr8UrxyXhPE+F7Z%`;UT#ae(h z#G3{HLZ@G;rAPPDqt*2I=0ZJ@sU@_%gjP+wu{m2$_198kd#SN%YGU)|-?FI8iGLEr z7qN)a-L#BG^Y9%uyaKjH8Q^3+(nTg4O0GSSpMV@buT!m6ZFA>N31A8}Gkhv6ZnQzg zl%ZlOz^2YH(eJ}AK&SpbhT#6|Gpc99>!vEBR>3Vh8*2EAP>U{8!!0AM1C)cH{Y!dy z)HDljzEz8&Ks}oGJuX>}!(%QhP-ZS~@EGu$ZNLvGh&WFj{hQ1@R8#NF!KFtoebWVS!7T| z@44(wz$k{LghztX={4(U@;27dBPumr?ao1b-i7!C(lCaBSEsndV{d~sDBD*V@(6R` yT>$e=ZL~5f<#tW2i}+?XWwb|PEop~ zKtLA?1V4a=j=usfKr2NcQKbv=A7B>S@)R@g&Ca}iGYx_jpjdw$r2zx@qsb!dIhcMX z@Bw0oSr;OPtf{flH6jzu$U=*_8C%_2WTV{#&U*EQ#IlCao)dJr+q<-US)jPa?bwc; znO znO>xU`u$On<%eP?6$h~>l`CdkDrb&p$bFtjF-}H8!K2m%RYxJq{vJ}}Ajf?)NlN*H zSIKyoZ&a8`w5WqM-8PdVMMtBcBleOiD|`PPDSPHjxhRIIB#+9{tIDTLPN^}LUtmg` zpl;v0#UD#LgKuqbH@C|CDenlmU*-kxba?!*_ka({QkswZbJLu@?Q6Y_;!wGpqkK?h z;tpOVHGQ~@D4m;(u~P_t!TKp&`|Yj%@YcS2YZI?|Wd8*FP2;$6;(vPfH9cy4gS&ri fsCjQMzI$@A^Ktk6?j*QAvBGoHXc)&nULm=E9ek1m literal 0 HcmV?d00001 diff --git a/gestion_employe/__pycache__/api_urls.cpython-314.pyc b/gestion_employe/__pycache__/api_urls.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11bf6f45ed5ca5ab0cd8077034164d3b0d10551f GIT binary patch literal 156 zcmdPq>P{wCAAftgHh(Vb_lhJP_LlF~@{~08C%hK5@CbT%U zs5r(WAjT!NIJ+djAST!|$OA&8rxurF=I6zy<`(4SSEj}!7G%bk7UdM{6;$5hu*uC& bDa}c>D`Ewj1hT6b#Q4O_$jDg43}gWS77ir( literal 0 HcmV?d00001 diff --git a/gestion_employe/__pycache__/apps.cpython-310.pyc b/gestion_employe/__pycache__/apps.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..926c0884369129a17154535251db5752bd83eb1d GIT binary patch literal 456 zcmZ8dy-ve05VqqKh5iT$Wkq7mlDq(dmcPPMA-ZL;LeB}QoH)dZP+8$!5U=Ewi3ea| z;+#~X;-ve0zu);zO(sKv^88KncYHssvnwt-Q&fG700gKc1&t{sa{>;qHv&x1R~9?q zE=e%>!YUF_vp=h<3st6hwz833q3BFewT~c3Oo3oGjTtzx3k+FY<1!b4an5K@Qdc{Xbsb)5?d<{;~vxahkU!N7Q&mq{TwH$%>`sg>3qbNktVHdc!E?s?YLZ<`yjPFP6t0{(W5Fvl&(|>BDz$owh(2bqq|zIMZ=f3_cu`o z|9%lARi(pfQ!}Kp*VKCm9&xEhyVxRNX0+YR*4B=lX{-OH_tpqw#yjcPIJI}wmT*jb F_6xhhbJPF; literal 0 HcmV?d00001 diff --git a/gestion_employe/__pycache__/apps.cpython-313.pyc b/gestion_employe/__pycache__/apps.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..853818e47fc9dc673739b28a00b0605d712054c0 GIT binary patch literal 536 zcmZ8eO-md>5bd6sU02t|Xf&uOY;p+9Wp0W}2&|fDblF21FJYjV-RT`V&Q6crJp{c9 z{sSTZAoy=QN`og)-U6%lbldACb*Os9t5?*=xYe3L#(q6x_Q%8ro4i_W0>&Q=xJCpK ze2k8;z-_dQJ|N<)BI3t*!*_MU%Yv}>Xp<1@=}uYh@nXobfuo(rlVrSRz%`1Izyt}8 zVBr%_1jH9L5{P|p%+p*OsZT# zV!9j7whwHvUILIRQEUK-QiAm>MJ0e}nEA$bOTD?b6Q4*bWZda?+a1M!#QRj9DqhCq z+xNrxzaitKEM-)l3w!q$XIGUid-VRP?&0;{+t0{^7u7#Ye2-rM literal 0 HcmV?d00001 diff --git a/gestion_employe/__pycache__/apps.cpython-314.pyc b/gestion_employe/__pycache__/apps.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81342060cb66126d0b52e7dd71d243a18146c1f6 GIT binary patch literal 534 zcmZ8eJ4*vW5Z=AJ_=t~)L`Cp{*cgOV3MwLKqQ*vK#qM-Cy-irX+?}^`g;puV-{3zG z|BYo>u(GlfBG&G@v2luTzG3DY=CL|HRwUXUT}M1?|89amEA&ZkMUxJ>AdDW721U9^ zrpOXu&J1DhIbCyY9XiZgCY8d62`f|$@1|)jiJPKzWeY6Qe$ZRcq(jaLQby3Z@X%!x zJ?3D6xj0~Zsq!J0D3W-;okqzWxBc$t!|Nb!CDrh<+D<|q$?BeH?dF&q2p)y1)UqPr zR`o)TD}!nXAP(9bKotSBERPHy1-Q+FsGlhTG({#c5;2bxot_MNGsq)^KzG+U)7~@1 zY6?JNfZ_@Q#7tb~$R$8FsJH5w71ere%RiGmlYZmGuXA~WN$Q^-v4(|zGx|ZA%4&L- znXCVTr->ZX@JPC|8?WAUcVzCNo|XRc#}!wN^bcXgnfZg2n;~rBgl1}J+pfElP3q7* ZK$bOpx|Gs4vh+3J(D|p$Z=&6=>Ib4@jD7$B literal 0 HcmV?d00001 diff --git a/gestion_employe/__pycache__/forms.cpython-310.pyc b/gestion_employe/__pycache__/forms.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2930a56e82d4bd7b78b64baf5894c23deee20e78 GIT binary patch literal 2742 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 Q#z&W@o=yFmKvS;qe=|0LX#fBK literal 0 HcmV?d00001 diff --git a/gestion_employe/__pycache__/models.cpython-310.pyc b/gestion_employe/__pycache__/models.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b974cd68d6ba68997896386d86f468f0317257d8 GIT binary patch literal 5475 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 K-EFn%aVyTYg+w`8* zcjMe1aC@K8ub*@J!0CSmXFv>e2&|d&H-o?B8T>8Nt)aG6T9S}XH6~(N3BQJP=BxNI z&t?)*N=D8(G%06UES{Z^C5Ey!o1B&AGihQr#WU$?%9ziy%vC8HUteoMu$BvJZz1!x z5D}P86qsJrF+;>S&IP5GU7*d=i-yBGX2x^Z#%EN*b0eO3KKn#8;m<5u4x5;b1c2E^ z8*@zCLk`t3BF)8ER+^R4*;NOct|mb4>s0$}>{>J>rKhtqs^!G&Tq<*23ag&@j5HNZ zthWgnRa+*Fnv|54RAV}qN~xyFR4n}!)ybq37A+A?$7ZECq`I0YPqMbw0rIvmA&gfa zt!H{Mi!n?DD?W=Kqb#MSWNH~yUmAWfLdz{jhR&W14rMbJBO{Xhm274%GBOeoPmiC9 zOiOY$iHS+t%p=-<4a{9vEzu}8EE-k)HLpHUu5_dSHCl!RVa4sgb?xT08}2ol(|utq zN|ST@U&lew%UqqD7e#)3rX z05h5@CzO#7f_zHx7h{9|#*ZW)|z7Nw3oItN#na=(L6J>lxKBKgfJ@A`{Qi zp^*otDh=ep`v%pP!%>MPqS?$k_pc-TtQEsRb(pfrERz_$h9>>m#&a3*R_9ugU#ga! zAe#Kn-<&U4+qK;#$r%fI**5&L?L>Ns>>xrS%KC`x2f>ME)3J0?o|RNvSh|+wa;rKL zk{oBrIa(XlHiDzA)w@VFMl+LHtOh-@^72#?Oed46GLtV`(IxRho}1jIFqvOYWYcyJs!BIY8=m` zq}3pXS$z(qEPOgHPQSJ!u{P?et`s?GyovyEndl+jAQ4Sy9M2FM(rD}uk>`n!5Z2w_ zqx67C5dYJfjP(f+UXZZixlZch{k7$NwXsCfA zqywvp@`lHO1Pn)n;Z7z;XGdS($bK}SLJDK$m6f_v^{e+?cg|2cfJAMOEYHE z*^sBD%G1@5r?twnr6EsSm8Tm#B(9qh)~~(F6KvQ|N0nzQct$pLf+F9CPUw#9Vi$Br zZ)AtKr9&X|Pl@%3-E8M{PbkO;46f2aI|)-_Nk~(%Tq>(t%cw{Whp>^J!E8rl~i*soqRJVtv3qkRntjnc2;6%hz+Gv87iHnUWwc{ zXe}-AnM^V+$?POO86?sKf>}_<>&A1H7hgf$ydnP9AlpYdJCo#OLQ2P_!FgLE36nc3 z$%FGo0Hwis%iK&Rn?cbMkI6}i4dUIMv0OG21$d9f5{V63lt2#Dhp_fLAdSH2%eu;G zNa#s@i8>e1IDjiko6~1__24ytw_-wS8r0=A?l<=eA=B8rVQg?n)dfG*2Y0EuP{^R# zIkMy!RJEmIa<-fWU}4EP&}e-P?=Iu_ijqHu8OSez044ZZ?hf7=EcyBuCko!(OJ7(D z|KQ5~E2X{1AIPwc%g-$*ev+yyBsjl%t zjuXeGBuN671$a`8hQQe-HR}dz2;}z$shP%3f=yBRu zpC_$HeI49dvrRZILE)0K(s6x9tU5EpYujJ^LqUjXV;br?XA}B*wRMS%1(R{Eh>JUxq zm}(k|1J2=KnaNAZW#=7xIqXYF@KhMFuF@K<()RtF_aqo!ArA^JG2G>>teU5isjS3Q zYlbBx7M;AVnz(eU_L`1fL{mm0100-5#ICEx>r#xVrdjkdqZ+8j#4@>bB4lEn#AYe? zubTKwR0H8qdp47erQon7WtpTbNQvWU)gfn62`S1Qb=6-vCpDGB;FlkOEC`QrR`%Z6 zTk`cOzP_dDg0HXOJ5=%=Q+&skn;!YbO1`k-3qSH*xMBHscgwx$QujXmTk!`Tds<7L zZHi~x4bzINx#a3rT-_ztz@PQL+yDLkKizY~@Yvz`=1VIc@8g#CyEAuY7MtJg_+E$7 zvU`as&0oli@4x=u>&wkQ>HMHmIe1oSK6k^u;&9!1{^s+yrMt;H$w!W!6`TL|n>TxI zbo|U6xP5VPyVAU4@y$o>P{A6i1#-I@0y))rJOdaQOKX_kAB)D~acK^~elC+rW=Y4Z z?sKv9^>Bu$=E?4%6}PYZKa4C52Y8H5n`&g}QZ;MVgS)BZL{#Gqn#b{F&M8aRB=!Pj zHFqK%!(PRp-&IR20c9`470DvV0M(wBRO?hG4f%t!(Zq#Cnw^a0;5#!?YN~$tf*M%& zH=^8DXnmDUg=&DIQ0=E@W7B2-#Kdie>eVbp^lC1Vj3;ABCaFy$aBsp0>S!xtk28r! zHOh{RYQ^i#!MVB4W-)kO+)GxNn_^lY`EPM1zAilO2$nkb7CZLlC8gs?!Pv@OlAT5G z&L!Kjy)b@3@qT$>blrCkFJ1US^nP^tz{9NK2rrDRH2F(S-NmNvLeHV)zMl+!Fj#mk zQb^1wP059m97Jy~`nE5gd2r~*$Nv6U;Y$;R%Q3|_3HPY#KpoF#mwO*36psiuih=~4 zMMvi%D;zjkICZhG|58CpDUMkT^;w6?6@U~MUENFD^WkNq;ySVL#oB%o%K^o661`R& zuchZWpZf${uRupB&|3`jE*;1xl)y_1=T>a)lC8aHYhOH(4?GxAY(opjS30+rI(HX4 zcjr?Ndl9ZsIxiNCZ7bDrJ0FZJXBF33j9U$NT*x1IkWlQya3aWQ+){LIS+YF{ERQJ8 z({LQyx=U@lify~{hnGjNh;8A5vH3Cifjf%c9r*)__l1SgkKqAEbx*8<+4T#(+tj~i zKyHn4+A*S?jN^YbRm{>F!><1FZXsY@)r3_0Lhu7HwQ*>KVt5qA`yAIqgfl7H0M8o- zN9=wZZmI>jdR)G$O+F=32c67m~2B|uP`jSFLuYZBb_7)5ZnMGxol!u9ZitB&yj zmtFLUez+b1J|kbmFCsi!9Y26_OHH|1Yz5?P5!+bnbbF{nwG3+(Wt9{OKV>Y6Tm{*Z zm7KR#tj=H<`0@+H=qEz+(NHJeg7Tw8UI7Ui0bLElBO|$Pl*&T{KU@rs};(V~uWkL#`hk~L|UnU(yNtD=Iz{P}|#VqvGyr+hh z*RY!yh@AsLNNW8(PNQO#EH7fRJbIf*PA6e#T?r|koQ3_HOT`FpS6g6-E>cfKLi$e# zGlk3V#O_ocY=C&wJ6Yp32J*IW2~lBA9GjDM$K`9#?J}(YHKz-CgkY5HG6Zm^t+{ng8S8tl&lf%wHBaKHiKQoh|pa-hB1OXan51 zLCop6@zYN@t&yh;UzbihE$^n}680P5Jm|+hH3attq2F9-M9^7=z&Bs+KSF~B4s7Mn zmal1O2j#6G+<`6mb|}6b1#jPCe5tq8|B}-GQXzDt;C{JaeVHHDau~C%A^PRO6_#X3 z93C1up<2rE5e-hd5w)H{7@<1PKAPuui0~QHYOITj>KxJ3tp*p}ax6tKGK#wbIVYtU z=}h+9M7~9YW5$L7({B(95wdOa&p{9{B@EP4boDIS9@rmF{Y(0v(~9dda8OHEsim*j z(wFb#Ah9L9@M;yg<^2!BO7n4q!u{ zuRJdP$h#frvjX21!4H7E0g!1DLb%pccLgWplC5C|rjczG6Z9%t>o!u+W-X|sl zI=2emwqG<^T;_$7PkbCy8BMJmR6WrnhrtPGdCEZR3FSWN)tQcJ+eU9rXRw+oif^s| zmquHW2DhdBF4e#&AX`T*0+rBRY8`b|Zr3n4T*WPo5g5OX1#WTziCMm+qMjK=12at< zLnhTzvyubnq-<>UFVFzpX7R)Rga~P-v5>i*x>4O)z!dj`(^3{5YdwciHB!IqJ#<5T z%N7tE{EoqIy0wGxcc>_j5~w$dcA>YExVZ26UCQyP@kx@#Qa#*rt`P#Ynb#m-5>3=r zJI7x=dm=h~>ebW3Cq&I>m#M#Zs249j9hj4&HT;ZEuAew)9kdCPc(dDr93n#E8=isvS1~oQIR3Rf;ZebF_R(MDQ;L@W! z4ViYbip%~11xAFFkxWVtn8M+^b>!xel4BSCt$4OB9xU)s+7qL})c;doyB0Ag(6RLV z502bFQULn!y>P?w)GBy7OYUuodt1pJQrw~Z&Sf(-b$_ws9#h<7kKE@G0C8@)cdg*q zRWR=QpQkp#=`T5Y6i3e*}Y)ZI?(r!Y{4P18wD?}>~H#FiP^QA+W z!Q3E-0P}_CE<7hkdsD*99QY&i=6NQE7aW029iWIlED@9F!mTAPxWLm_m!~pL034*e zHl>=Gw21gFjkSti);8@6`BiT?2I)Q}O(rt4u>^s=)gPgC$V5gdh1hgbHJzm&D$m9k zmCw-+%2ohi1QbzaJy*^V*HsDeN7Xb+Kg9KxltvJgxGt1)Ap_M*X@Jrkljp4`((rze zqgpL6AxSw>Bo&XI0t%K`8XsukffWyiD39occD9^ZdI>o?L$AU99M2iW6JXXzf3Ptk z14IZCh1n2g2ZZ`BMa~1gIT2)P=w{j|9rIAJ4lq!k~9LD`t zeu2im4W4;J@Wmh#kz-*HIBQ%T7_VZv*nZTgKByD^u~jY`O(bQ6Nv_v-L)t&H)0G>w ze?>nsnN{sZZO@%Ox4ZAjiwE94{Jq1AyO+d#;QfyGI`Ym3#~)-%$1W(xE<8H+TH)yH zh1V|@+?NX0OPb-?iXO&7?e$E$>KuJ_V!UF8RhJkZ3QvS9ijYrxM>@%;tL)&+~{vSDce2U;fI&i%QdL3nzKtmp%YmGL}QXJpN9hVE);V_Xs`* z0xXE=w4I?h8Vj{*A2-n_p5mc9hH9y-iLIkVPBN zzC&cBvsGuAA(u_2WJV&b1}Zo1Xf!QVxal;hn=j+bJ<%D5KB3Q1wXXs9phCNY;n43J zROHr?TROfyBxc%c5iV1$N3>5FkFx(l5k^Fi?}ESp>2x0n?H>uv9|>I_3Hv`1w*IHk z_mQycsoA7!yWMveV*XS>_NmXV>$q*c>%8N9Dj@r`4V57iBx}!IyZl!MG0kTi$bZxqQm0pqk_>f%}dfMBri|Fo|-*JB1`H4VzKJotp DY};@_ literal 0 HcmV?d00001 diff --git a/gestion_employe/__pycache__/models.cpython-314.pyc b/gestion_employe/__pycache__/models.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a270e41d2832f0a0ff4d352e1b6e3a08ee6c6b4a GIT binary patch literal 8281 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 literal 0 HcmV?d00001 diff --git a/gestion_employe/__pycache__/urls.cpython-313.pyc b/gestion_employe/__pycache__/urls.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a2c48f5d2772564a5d894ac10cf8123156ed9f4f GIT binary patch literal 1836 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 DWJjmN literal 0 HcmV?d00001 diff --git a/gestion_employe/__pycache__/views.cpython-313.pyc b/gestion_employe/__pycache__/views.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..954bb6a69f30a560e02da2d4ffc63421bf5f89c5 GIT binary patch literal 35725 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 U;9GXGFoSLn%lok&J~o^GAM)9Ns{jB1 literal 0 HcmV?d00001 diff --git a/gestion_employe/__pycache__/views.cpython-314.pyc b/gestion_employe/__pycache__/views.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0185fd3e781bbbe6edad145a74cf3239c393200a GIT binary patch literal 26203 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 literal 0 HcmV?d00001 diff --git a/gestion_employe/admin.py b/gestion_employe/admin.py new file mode 100644 index 0000000..03e7ed2 --- /dev/null +++ b/gestion_employe/admin.py @@ -0,0 +1,14 @@ +from django.contrib import admin +from .models import Departement, Employe + +@admin.register(Departement) +class DepartementAdmin(admin.ModelAdmin): + list_display = ("nom", ) + +@admin.register(Employe) +class EmployeAdmin(admin.ModelAdmin): + list_display = ( + "user", + "matricule", + "fonction", + ) \ No newline at end of file diff --git a/gestion_employe/forms.py b/gestion_employe/forms.py new file mode 100644 index 0000000..55fab64 --- /dev/null +++ b/gestion_employe/forms.py @@ -0,0 +1,84 @@ +from django import forms +from .models import Contrat, Departement, Employe,Affectation,Formation + +class EmployeForm(forms.ModelForm): + """Formulaire pour modifier les informations de profil d'un employé""" + class Meta: + model = Employe + fields = ( + 'adresse', + 'telephone', + 'CV', + 'diplome', + 'rib', + 'photo', + 'casier_judiciaire' + ) + +class AffectationForm(forms.ModelForm): + class Meta: + model = Affectation + fields = ( + 'projet', + 'date_affectation', + 'date_fin_daffectation', + 'role', + 'pourcentage_temps_affectation' + ) + + widgets = { + 'projet': forms.Select(attrs={'class': 'form-select'}), + 'date_affectation': forms.DateInput(attrs={'class': 'form-control', 'type': 'date'}), + 'date_fin_daffectation': forms.DateInput(attrs={'class': 'form-control', 'type': 'date'}), + 'role': forms.Select(attrs={'class': 'form-select'}), + 'pourcentage_temps_affectation': forms.NumberInput(attrs={'class': 'form-control'}), + } + +class ContratForm(forms.ModelForm): + class Meta: + model = Contrat + fields = [ + "numero_contrat", + "type_contrat", + "date_debut", + "date_fin", + "salaire_mensuel", + "statut", + "fichier_contrat" + ] + + widgets = { + 'numero_contrat': forms.TextInput(attrs={'class': 'form-control'}), + 'type_contrat': forms.Select(attrs={'class': 'form-select'}), + 'date_debut': forms.DateInput(attrs={'class': 'form-control', 'type': 'date'}), + 'date_fin': forms.DateInput(attrs={'class': 'form-control', 'type': 'date'}), + 'salaire_mensuel': forms.TextInput(attrs={'class': 'form-control'}), + 'statut': forms.Select(attrs={'class': 'form-select'}), + 'fichier_contrat': forms.FileInput(attrs={'class': 'form-control'}), + } + +class DepartementForm(forms.ModelForm): + class Meta: + model = Departement + fields = ['nom'] + +class FormationForm(forms.ModelForm): + class Meta: + model = Formation + fields = [ + 'titre', + 'organisme', + 'date_obtention', + 'date_fin', + 'description', + 'certificat' + ] + + widgets = { + 'titre': forms.TextInput(attrs={"class": "form-control"}), + 'organisme': forms.TextInput(attrs={"class": "form-control"}), + 'date_obtention': forms.DateInput(attrs={"class": "form-control", "type": "date"}), + 'date_fin': forms.DateInput(attrs={"class": "form-control", "type": "date"}), + 'description': forms.Textarea(attrs={"class": "form-control"}), + 'certificat': forms.FileInput(attrs={"class": "form-control"}), + } \ No newline at end of file diff --git a/gestion_employe/migrations/0001_initial.py b/gestion_employe/migrations/0001_initial.py new file mode 100644 index 0000000..26edccb --- /dev/null +++ b/gestion_employe/migrations/0001_initial.py @@ -0,0 +1,88 @@ +# Generated by Django 5.2.13 on 2026-04-17 12:03 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('gestion_projet', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Departement', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('nom', models.CharField(max_length=100)), + ], + ), + migrations.CreateModel( + name='Employe', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('matricule', models.CharField(blank=True, max_length=10, null=True, unique=True)), + ('fonction', models.CharField(blank=True, choices=[('directeur', 'Directeur'), ('assistant_direction', 'Assistante de direction'), ('comptable', 'Comptable'), ('raf', 'RAF'), ('data_manager', 'Data Manager'), ('logisticien', 'Logisticien'), ('post_doctorant', 'Post-Doctorant'), ('qualiticien', 'Qualiticien'), ('technicien_surface', 'Technicien de surface'), ('chauffeur', 'Chauffeur')], max_length=50, null=True)), + ('date_embauche', models.DateField(blank=True, null=True)), + ('adresse', models.CharField(blank=True, max_length=100, null=True)), + ('telephone', models.CharField(blank=True, max_length=15, null=True)), + ('sexe', models.CharField(blank=True, choices=[('m', 'Masculin'), ('f', 'Féminin')], max_length=1, null=True)), + ('date_naissance', models.DateField(blank=True, null=True)), + ('CV', models.FileField(blank=True, null=True, upload_to='cv/')), + ('diplome', models.FileField(blank=True, null=True, upload_to='diplomes/')), + ('rib', models.FileField(blank=True, null=True, upload_to='rib/')), + ('photo', models.ImageField(blank=True, null=True, upload_to='photos/')), + ('casier_judiciaire', models.FileField(blank=True, null=True, upload_to='casier/')), + ('chef', models.BooleanField(default=False, verbose_name='Cet utilisateur est-il chef de ce département ?')), + ('departement', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='gestion_employe.departement')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='Contrat', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('numero_contrat', models.CharField(max_length=100, unique=True)), + ('type_contrat', models.CharField(choices=[('contrat_duree_determinee', 'Contrat à Durée Déterminée'), ('contrat_duree_indeterminee', 'Contrat à Durée Indéterminée'), ('contrat_prestation', 'Contrat de Prestation de Service'), ('contrat_stage', 'Contrat de Stage')], max_length=50)), + ('date_debut', models.DateField()), + ('date_fin', models.DateField(blank=True, null=True)), + ('salaire_mensuel', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True)), + ('statut', models.CharField(choices=[('actif', 'Actif'), ('termine', 'Terminé'), ('suspendu', 'Suspendu'), ('rupture_contrat', 'Rupture de Contrat')], max_length=50)), + ('fichier_contrat', models.FileField(blank=True, null=True, upload_to='contrats/')), + ('employe', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gestion_employe.employe')), + ], + ), + migrations.CreateModel( + name='Formation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('titre', models.CharField(max_length=255, verbose_name='Nom du certificat')), + ('organisme', models.CharField(max_length=255, verbose_name="Nom de l'organisme")), + ('description', models.TextField(blank=True, null=True, verbose_name='Description de la formation')), + ('date_obtention', models.DateField(blank=True, null=True, verbose_name="Date d'obtention")), + ('date_fin', models.DateField(blank=True, null=True, verbose_name='Date de fin de validité')), + ('certificat', models.FileField(blank=True, null=True, upload_to='documents/formations/', verbose_name='Certificat (PDF/Image)')), + ('employe', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='employe_formation', to='gestion_employe.employe')), + ], + ), + migrations.CreateModel( + name='Affectation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('date_affectation', models.DateField()), + ('date_fin_daffectation', models.DateField(blank=True, null=True)), + ('role', models.CharField(choices=[('chef_projet', 'Chef de projet'), ('doctorant', 'Doctorant'), ('mastorant', 'Mastorant'), ('consultant', 'Consultant'), ('stagiaire', 'Stagiaire'), ('laborantin', 'Laborantin'), ('medecin', 'Médecin'), ('autre', 'Autre')], default='Membre', max_length=20)), + ('pourcentage_temps_affectation', models.DecimalField(decimal_places=2, max_digits=5)), + ('projet', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gestion_projet.projet')), + ('employe', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gestion_employe.employe')), + ], + options={ + 'unique_together': {('projet', 'employe')}, + }, + ), + ] diff --git a/gestion_employe/migrations/__init__.py b/gestion_employe/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/gestion_employe/migrations/__pycache__/0001_initial.cpython-310.pyc b/gestion_employe/migrations/__pycache__/0001_initial.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0b89e84cdc50b657a352d12a8b03ba447023799 GIT binary patch literal 3994 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 literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/0002_alter_employe_cv_alter_employe_casier_judiciaire_and_more.cpython-314.pyc b/gestion_employe/migrations/__pycache__/0002_alter_employe_cv_alter_employe_casier_judiciaire_and_more.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..633cc2ec495e2a290786874e9b52e4bec2c79159 GIT binary patch literal 1349 zcmb7EK~EDw6rSC-+wM}NtX2q-h!hSDra?4fj4>Jv7NewD#Te5vS-L|R-0s$$DG8o9 z7|+JU|A0TlgGWgd$Xq>nYXZ@$Z+5#WA;p9_ynS!>d*6I--QT)s!8?R7!Ef z8spMk7=xx}s9nAe=0-7xwj6J(aL^8CgO-fux zjMi;NNr1Q84y{w021IDlmPk7k7$70jbC^iAwtVgjEqpMM2e85|ytu`nRNCpT+on+jgZOh(<8pqyghD^@!)o*A8hB&mmr& z5*El|5yoSelVDkD58$F8p)XUHgt0JInsy`h{T7L*JC8BrFzIz{a}JW*oG^@oJft7X z28s_$_p57+1gu)FRG$#`j{B|Z%N45}nKQLj`xmDQRW4v#N{TDT^_{aDXTLDEJqNx) zKuWFMK;GEUNQeCZ^9gk|q~Gi&)GONF^R9vP%ZHiCgUsa7*woQz{>U6ZG^Y>D>HSw7 zbKxYN)Qz*4nLg%C$GkfbGttMq?U?rlV#Y&E;lM2HZ*|PYftag(p0$p7JHpIOnA*o@ z!E{{PYB4EvXWRA~e#zMgI~jH_s$MoC!WO_2nFrB)JPc+bls^l04NNzoD9T?ADa8|Q TO3^+Whq;-bxtTu*f-w6Zh{iS1 literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/0002_alter_employe_email_alter_employe_username.cpython-310.pyc b/gestion_employe/migrations/__pycache__/0002_alter_employe_email_alter_employe_username.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..92ad5b79438329a7ee2efb9fdc5861ad43e5cfb4 GIT binary patch literal 689 zcmZ8fOK;Rb44y}_n~k=D6L8>+luNU4MyN>8!hx!yoN^h3wVO^f$!znGT5+V;{t*5S z$GLLqU#P^xGbP$;E!nX@JN9QMc5g3bBtO3`^@(8Ymk%CFM8N@R|AGuK;D$B4;EgB* zXGaVK$ZG}?c`d)oLPB)PviO#2SteZC=&CCRZQI_>8VhLpwNE{ign|Ro{*Vl^f&(iA z@QN1_qdN8ja8}PDf*58u0_Happ6ue4C=yr@fz&NNO_PbnqY8UZLSeHp_6pr{wOYMY zy48a&jhjz!j7_P{?H?lYC9p3qmBF?e&fRQm^~H#pq@Da8sx2FIQLyouMguMxd+a=L zoGo0ULWNQ;Rf^si4U)f9>S8R7FY*!K23x>(t+DUu_{^nm&4AsZ@7Kuyy!Vs>;8MH6 z|JVG%x~G&5=5EZ-ZG-vQ+ETOpon4O&wnLwvbhgGpoqqiMArEHf4Egr!-)RC;eLpp_E3DV_N(gG`j& z)=+L+{|DdtAO4ocEMzmgmv;)ndXm0oq8yO#Tj>$5UWZA45JX2r6zcW*bxcDVQ!fzN zw45P*j|P)plJzXH#e0nd687R3!W@S5a7Y|onxzcFq1PwENMh!IlE4?aAty`~K7(B+ zFLF5P!C2TBOU^JL5*IK&9D0Fjli3Q!2bA$Rpdkq(_1Px_68a?UQo@-UmarQ^OxOc; z1v8SueWfxf2s;{(baLl0=CPb&7khEc=>9M!9Ama7IWxI|i0<8XpG%G0ZM569MjY+A zO~PNr(ZFpsUG%8)&|NahUHllXwCo1o!4XsTCqV)3$?zUbO<-M{ z>e@N;ZF_11Yi*RPp606K3$^iTWn8X|%Il})^-uiE&6D!oZ&|~#m%A>V-Brw&&37$U zP4C=w3}N{%y|5Q;`umBOiGOod%9VNV6^TUd&U`{UtR_<^H@_^yREH4$Gy!zJo2$_L QV2?^0C#8)aKqd+MH(_G%lK=n! literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/0002_alter_employe_email_alter_employe_username.cpython-314.pyc b/gestion_employe/migrations/__pycache__/0002_alter_employe_email_alter_employe_username.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ccea1ab212d0274fc3cd7d9dc718f27051ceac1 GIT binary patch literal 954 zcmb7C&ubGw6rR~lHoM!@q|wqstv^UFOC>}p6hx%r4^q(*R=p(|w%KVMyV*^5CSY$l zh~UjXL;r*R8x|p9j(YMINYR`4X454Sir~P!dGF1>{DH3}|Fku*fvC_59xjQy;)!S8L|##f$b@ zzg>W_4HVUIv)kw3{?W_$-(D3>SZ+?(t_gH)X+2MQ${g+Xg6NpaEbV$Mc$ui+y(Iw+ zJL0u8`XM{&Q%47FlpZAXx>RNon>}DO@TJ-3G**evXb-9j9mQD!$@uWv`0gqhHXZ9tQ3;=gFw*u ziNX+PlEh=hAW29&>e2KimkHqlUbRg;A!4@Q7nBnc7ocVW6UoDecN?#O1aH*pjYpIp zim2CkvFp~RW{yx}_DLE*?GEu2j+8E}0AeneDpctm$Lc#KMmgLA^B#>2WZfF;+7)B) zY-}Uz^3YsAHP=TgH%3dVqtfcIR6Z@0Kk<{Tuce){T*k8JPpw^iYH^`tyn7n2rFZT* z8EN@%ys#5h{QX47M7t>}rO5Q`Rq&*FZ~8j-<7*INm|W$@I>z{yfv|ICEMeoLJuGf~ MDQ^5k5G2)q0I}Qc(EtDd literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/0003_alter_employe_cv_alter_employe_casier_judiciaire_and_more.cpython-314.pyc b/gestion_employe/migrations/__pycache__/0003_alter_employe_cv_alter_employe_casier_judiciaire_and_more.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..69cbd16d106ae0f028be220db8e304686828c09a GIT binary patch literal 1464 zcmb7E!B5jr7=LZoZY={w0U<;pGA;|rM%2W_7@`5m28v5X6O)aXvOZ>^YiIjL!cH8F zXa5R=H|}1zcs7zHkazIn$=ec$Uj5pxL6*5l4_|-Zd%y43@B7~OIzKe1Ab39KznEWR z2>tM#=n*^M{1Jcyw23sXfbtyW@;v2lp>cE@Y5WAzgfdr@qM*z7Jt4$Y&|+zn5r6t_ zhG$C6thzci9ou74%`u4ORW73t8tORbA36WCWkfj*QGQbbp^+>{V`Z_J{5v4TkPN5s z<#;jGb5GD94Nbh?NlKF<)JHAeS1oZ(HMy^va!s`XP*eX|Y4VzCgMD)w>ZO(ysiF)YIV!mCyZZuwb2wRd%29j#4Ss=cUjDCSQe8TK+p|L9oSKV8Njw) zBe3mTaoZ%8!A2^&XA&3hGz_z1>ZVJY@o*`};)V$lHPVzjz{@eQ{>GtBGakIa7hH3z z83U91gw|p3hO5N$#|}sNEiNo9+`+m<;Uk?jT-obh=uQIbwt;JoOEO88z(L*^GX=w% z(Xa^MB*t$Wy5-jb-Y~}7rt4A5w2AHb+Xkr<+aPwuB%bRJBvT&yNv!x~yKoH=lUGcO z1U^#=HN6^Pr%s}~Gmf!G;T~16PAOE`pv1%29fk07e=t~c=|SnGM_jLzFP4^xw@aOR z=|w@yho-9=rORtsg1+4CZo~igC0pNj{r^E=eBgZt^B%P&ByVzUfgh6&p0*VvkDex` zPZHB-6EkNc<7evRsXBY2&K`~(EgwH=sjC<9n5=a3=C1MzEp@#oZ|W*zNpnjUC;tI$2{YINsn$!^Q`CB$Veq!~{7pq!@WzNO}VA#j4|Kbjq1RsaA1 literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/0003_alter_employe_email_alter_employe_username.cpython-310.pyc b/gestion_employe/migrations/__pycache__/0003_alter_employe_email_alter_employe_username.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..69590704795f56b25137db8d300a5b7023dd8189 GIT binary patch literal 1074 zcmaJ=J8u&~5WctVi|vF0L;>h{G!}4YKy(Nt0s=@7p@dMlIo6)Z`Hp)yyLU;Pmb7W9 zp`_;DY)h5D5Q)d^*(Om6R@&K_+1a`8o0%&*9ap1ubh8uxFg5L`GR`lHj8)pgCjlDh zsW#B*G*Tlo2WDmsEM0r4feF@;1{Ru${n;GYpl@kC`-I+T8$Cn1SsZaz#ziiqlNEre z7^%DSt4+o#ZSj!=)?XPIphx<^L@Tku027_00T$TcK;zhi=JDdDMK?`wVJX(34IRSK zO59{AX@Bi}(;^*O&^>lkd}Iu|uuRxiWb5q$69HU~P$+mIW|Op-q73@|{=<-^CGv%j zP8O#Ze3d|+vkYZp@zSot-kO=kbV!Z+qUe4-0hCEhadh&+i()MZvW=t%7lpVX#BV0E6en zsLC)eMevRn36|m3>&;g|EiQ~ta5nF1kRDwan*R-wKbdm%(=}*|Yb2VQVOoDI+t3ZY zt6RTj+8xrGr*$NCH4lPeUDCRYb%Ha(GwrsDZa$ec=c%rM MI0}fdqF*up0t=%>9RL6T literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/0003_alter_employe_email_alter_employe_username.cpython-313.pyc b/gestion_employe/migrations/__pycache__/0003_alter_employe_email_alter_employe_username.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d7d4886b8f9492b683dc0dfee989d311fa6d00f3 GIT binary patch literal 1519 zcmaJ>&2Jk;6rc63*Y-A!6SsgV3M^@aYEf*{DiT3}h#FEz(js{&NU&%+@lNca>s@DN zoG%501mesE{sy=qap6zk*hZBS&4mM}+)}xS8{*Bb7o!|HlIMNyZ{EE38;{Cm2f_OG zbMysIwfIQ?G>xdg5bL+V^lbdT6w_H?1^T;zVBhT{9c7m1xq;e5( z_2T)iQO}=h^-evfoIdMvB3T>>W%uKNhN7cm*_s|JBiqoY`^m{X=Na7ea!rF%?>p^hC$UUx z*D`G)+m|PLrnToXZ6X)PYSZu>ud-z8Dw{c8@n-l;ceY+trQ2E8P79C=eXMk;&|So| zKM3P}s+z4<>pCW(q&)M1BrH7V8w$!J(x_66)H)s$jguxR4=>XcX&kKnFAm zXw+d;aQzsRv#h7Hs$0XY#POaUP~uRfn{dHYwSzB6)Qwf46GxJ>O=Xdx>~T#nRl6Ip z4m_K?<1v1m6|9_iK(m+i48}sjE9+n)HNsF*fiZs`5JvDrD!%!quOWoLys_af%lK1& zg^K$!9{4LOzV|`=hfoeC-(dubbYYg_e4W}lX=C61J+jr>9Mx_spGc$L| z{(9rgL8Xhw#kr&6+{tt9$!zVUT05>@IjUayY2mjUzvGA1&mR}8l5;-qg(PqOs5<}4 z8xP*@J-E)!5ZW=m%7Iun@0cJyF+bCSnX&n|7Q5!-R3z46Y8|GrTUHXgWhJqDsddkS zt}%1d0+gQF(SlotI(G3(E3K-0p=y7##;<1A1jfCXj&u<$=6rT02*Y+mP52vLOD0FE;g;iLGwx|dJqAIiwEyWrr9I!JTdnfjg^{z8B z&MyVj1LDj9@i)K?i3@)M#}ZXaG#3t>xVcIMH^j`YM@BhxB+vJ~H_vZozV~LY%#=N# z#`m={{ly00Pi>fyACr^1B9Fj2fYurimcraxu5Jsv?g-~1I1gR|(7phm)3O_BHj^O3 z>ng7vA`h))P|g3Pjr-M{^!l{Ru%JoIrQ1(J67h~+Gh=26}Mm^Q%^RHw0Eu2pEvO?-ywldk^@9hko{J{5Egdq%c`%2qKsCaAI%VX0<8Z~X^o zx4g!4lQqK{i-t|G@%)4v)>txZg4f41uwVgB-EcE=a^fH-X5qA$gJq@btSo(G^ppkC zA4JI>k$KX`H2QSEoT87zkP*(Sw#>I99B--`;9V4vxGQ>cdYiCz!U>9TpQsQotx0N0 zNBd-cgOVte#UUpwb-2TrZVkzP^`@_V{tgvAU-Ym@O&#Lnh!Gs_`DB-J!GrzVkZcVp zBVpjb{>G}`>0yRDf-vqU%-kX^xa8!}yg>22ePhFBzwvnl2HDQ&%36|Wl)8J%jYtE*QL zj?}isr%*|E#%FF`otH(FN`sK}5K>YNBck{;LR&)|>8mSi7NHHwxQJ*>;zTcpWI*DO z#2rdF(>*A?n|jyVT3P0#jt}(4sY8}-DSa~PhF{{io5(^Zi3Ou=>ENO0u?78?#RoC% zs2B8LT$sy767gl~#u z(EMZ#*0br1XwAv{Z7TV$ossHU@&$uErrSB43X1S2YWfz8Tu}Ph8rivX?xTAn50n;; zic5#ZrQ-|!@%-X(W$~!8d{|ljapl)*zo93U)@i{hd1vEZNaHRYRxbVg=HqvIkFU}Z z0Nd8rIR$s^`?iA5?JqP?JF)-Kuwy^XAhixM>mXaZIqB=0o$-PYRhjA=3Aj!$vMtLxae;OD5Ae#VJ8!w)c}H_Azt64w4U~~4_z$%q BkGuc? literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/0004_alter_departement_chef.cpython-310.pyc b/gestion_employe/migrations/__pycache__/0004_alter_departement_chef.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..707adae70ca09692eecf6b37f4904dbd4c037f3f GIT binary patch literal 854 zcmZ8fy>8nu5Ek`kS#j#1LxBJV+Et5Xpq+{$NPsv^QO7M}d(lG3=Gl=-i3%kTp4&CA zQJ}BHwNqcAK#?A)xG_S2cf8{rzq{`!4i7^MSM{TxRkmgQ(#HOB(Ky9jzeB++M!1y_ z)Hb&ZCvk}OIovJ0#4G&7C)Njxxy<`+F%P`F^UX;*j7+V_|Bd<9BqA!Pp=q*mT}QSG zi)<~^CKF|?{6a9`^-{;}FJ0d$?)n4;81%$uWK9wW+}vX}bHL9#i0VR+cXK}v^8-Zh z<%i6_^H}H3!PsXkz$&_`d$mJE`2HGd4Njq`xY&Yo|a#gTW&a4T|~rIp#jyCz|#g8HLux?h#VwE z6VZBHa5jnhDxk(ssR}8@xD5w9_b9#Hq+G{p3!$N8P%bm5rGu=g@JzRKp;Xzqe4u9j+2Fvi?PdIQMh(V-q=N-sagYto0s?#vx=$B zO3-b}OwzQYXZu)kwfpX44UPa3DTjm{2TZCpFW4h&dS+(k0k*w}(5?@p?Rw{Y^^j2C zt`gQ)CN-Nzq)PmV$)%U1vcb|^;GRHMVakqY`@2l`>z>Dwa3i2jBEtG9@$86{aa>J| zf~*Ama8BADIrb|Rmw4sRz~ms)a2&yy=@>(1-6Np)WBj^qdpsMg6vh>ohLPv`#1D8F zx*>j<_$8NwREF0xeU86!ffuHH4w=3XP~tlN3fW_7`IYTE0TatROp99ul$d538+fgl z&r?2REHzi$Sj0usDB#ugc_YvCphmibbrs_0yVH9-uKtK3ChL3AiENIMHDU z+k4bhQF2{qO5%w6Hs91ya=4+5A8O-AqnV?@(W9ZU#?aK^(A1~QmyNHR-?zSPHH_kc zQEV972gY{8a1IQoiO?HiNd&PbZi@f7sE8-0V%QN+5^_>+O6rjMZkgWcc9GTC^){lp z@=mV(%jLST(p!)QgA^m4D+PX~4R7-FL`+yrQu|>X#CGw!{HXS%JqAzdeJ}-B;UsKL iNf3mViiF!g(Znxw?~mFqs2}u3I&+ZD{6%2IHU0y=J2jO6 literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/0004_alter_departement_chef.cpython-314.pyc b/gestion_employe/migrations/__pycache__/0004_alter_departement_chef.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b3e7acff8c7ec15cf25ae547de91dc16ff62b7c GIT binary patch literal 1192 zcmZuw&1(}u6rcUfW=)&)%T}<|+6V?A7AzD*gkrZOnzmt^R0>IkZ8C{#H@k6ng7lVy zc=pfGn+N{@J$X(KrVNM&Pu?Oedi6~=x-tWD=H$J8#_&T5Bc1uL)Cl^Ma zGGtB)z;sXrnL-v(0jQW2GZK{+xK7H-8HFktm8uJ91}!2}o<*ioR`TPcL}zqG3V9ka zg(Z|ye{pduB`_@@l-h11NQq2u+6~{Lw&w;+ZF)801l6+?2*rlN$v0p+s0=lkh>8`B zN@g@IP#NAH`J9V`$^=s^NAiht${`Cj$&|{`{PbnpRej{IU*R`*S!c@SvHZ;|^vdcG zT~l2hVgi-N%?M4H8X%*y=;jCocCAKQmQP8OxRlA&7o=Wb2~O}iLrP)FzGJxuOm^Fj z!=j!GW`|J1Vm@&!N^01(nuLkeOGyAS2R78m1HDqWiBtOk;}BWAK>|JiOqwmnJ0$G> z^78TnY&n$pBOOr7b}s1J0r7dZ)CAM;AUnoP#~5B~I|TR`#;@9z!+k)CV_diWfI7BI zT#uWfBjVPGTeV5x%YYoy*Z8X&yf~kO#`F!(Cw9YqMh=-;duh21kBPN?rVZMKs+qQ9 z6!2Ctm-9KcEWTDOWN>lEF!AR0x{+hL*CL}0o547sux(XrQR>_KZAt=+{V51MfrHrd zCl51=sRfZ56rpL2u4d~)g5p&xZJPSsh=EGk!Gsyzx<;IW?qQGgTNhN~|L gf^ecDVevb<^#k2KRbztsPVXg>-9+*a0%4HjAFIzY$^ZZW literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/0004_alter_employe_formations_alter_formation_certificat_and_more.cpython-314.pyc b/gestion_employe/migrations/__pycache__/0004_alter_employe_formations_alter_formation_certificat_and_more.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe9aa4a50a544ab9e4de607b256827daf059061a GIT binary patch literal 2006 zcmb7E%}*Og6rWw&YwrfIS-wkX9fBG*tqf8l(N+~rg+-xikhO6RX${ly?%-_L4|jHq zf~871R6Y04NN)Wfs@^F=0?oCjsuxS3^w`eq+G}DtQ5eg!@8kD=^Y*>B^U>I-2Kf5$ zhd-Qu6afAbN^fPl!o__qJO_Kgl(xZ^M5Qg6${&C!a0{673@}r>QiaD3u6wE2LQ`h? zHZU@O3)PUB<~a?5s1x`hQ@p^&ZfISN&3BcHby*y{3#eoQD(@+r=)ICe)4Q3<$kl*Y z=E+E=yqm2QhWdCCW@e2uie)Nm-Q?cLl{IsmOONqacYaQa|5Q^mZ>*(b&pYvraK6c_ zOtIYM8#TvzIlU8G{;h0U<&oyu;h7oqXrNqf+HB)zyf52oK7%4uu zVpyS%Jj~M3p4oS>Ycn+oVVZ>rb@m+#(e{)bSS=6xG+apl;YxdYBY_l`E9K3VZ4WiD zVWf%5YsQ&duFKRGPZima25jUIlX?*1_~4w4D2Drv-x3urbERnGBG<*^5V?-+(BEGg zsfdh-Z-Iy*W@AxYP^UZ}{`S`-QK6|DwpXkdk=<%lyPxb0$Hmz!}!4`Y4#S?w;#pG}0A_4;} z`x>nO?q4qH%Fo{rqgTrvBh6I%De@aZ$*xBu7L8S0ZPEJ}dzVWr_eDIo>*Qmu@&mQQ8 zv~4Q?1w$UQ>pRZe!VEhP&3xat(uao$qZ2-URG$gPe!JlQ2`D%w8(xwF2E1h*&v_?u z!Py4}0_0By5_uzk$Xr5j!P4-CdRZ!L($$qI##;A-jXDk34y7yIKQRTzWWy;rWH|?x z3*Z&cB?e9C7GTuOAb=2}YXP(CZ9d-5S0ayLP5=@+|FqpqFdkGmI1mcEb*rz?K3^;r zuT;^FXcXYOFe7%@kE&eZ($2PBA$CRG-uxw8Up<-PyK1qo#+8kxzP_9=l|<3eQhm{( z4ZIJRHMU^mX+Yx==jq(W%6BMb6Q$^jsYSXUD0Mj%t!r`-A;BK7FKZkOy#=$$iGz6R z<{9Y|?;Rwcu!&ydM%-V_Jf*UCw^O##9cIf?)3EHFE+@xr$UYn0;HWM>emTp$+fyam zJyu5gyx!=uQG>Lj&3m~m#iR9=aX(5#HoPDgGa-Y2K`6N32R!(*yT!M@^E?gg9Gar9 h^bvgXY&}C?+>yDvJ)?;>esibWTke*)Z4bp0`5!7Z!u0?E literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/0005_alter_employe_email_alter_employe_username.cpython-313.pyc b/gestion_employe/migrations/__pycache__/0005_alter_employe_email_alter_employe_username.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cdcffdc741c3005c0f3ddf7bfe56cf406d7b4739 GIT binary patch literal 955 zcma)4zi-n(6u$GX#BQplDHRbVD571wv>Do=fGQ#iDkXHt!GbKE+~krP96P;pB)TCX zF|%}KhW~(nqg`6v%G50=AU4E1Cst5YAx^sI@4b7U{oVIGnxA(NEOWUO>}d#nQ%SbW z2^j4FI7I{z{0!}5j`uaLRZ$t;MMS%Wi0W2yAw9WcH zPgsvd32hy*j?86UChPe@c=a1z@*;J~e@jCab(14$4Wi(9z+4@?Q-0CN?=fkl(d+~) zY|H#WFs=$;(1ANA^EB*iVM;rEG-g!cfN; Z|FRHve^`sy`siE~*UpM-KM^D;`wu%y^_>6! literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/0005_alter_employe_email_alter_employe_username.cpython-314.pyc b/gestion_employe/migrations/__pycache__/0005_alter_employe_email_alter_employe_username.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..06b5f3473d4711481085ee8077e0bf0cdb038617 GIT binary patch literal 969 zcmb7C&ubGw6rR~lHoM!_q_L%iSbvaS79r#iDX2)rAEcrsta?i_Y?Dd4cC(xA%!0k; zAfEj*^grmoVG$DM>d9LmMQ`Gp-7Jw%1PA8LdvE4_^S*E9?zJ@&!PqDl-MWI%cNwH3 zJ9lRL;EYfk+4um}F~@amI~TPJ&5lNsK~@N+jFVc6?(*IC=*}MAynu4lt~3i3S6pIt2N?yoQ9-J zhfc`pfcl(tj%m+Y5ju%62@xhCa7W}(@K*^rjT}$HLX;<@=Z1`Xu220yZUYeYyVUQv zl!a0-VLp~OJeMtnnKkZ^iw~T*fe$PnE7dwYE~! zKD-D^>79pGMi||9j^7U|-J@8?Si7VvsYr7626#e$n7q!T@Fs*9CX@N8iZTABA#7c0 T>sb3_jtjeA3%frN1ab8rHK+30 literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/0005_remove_employe_projet_employe_sexe.cpython-314.pyc b/gestion_employe/migrations/__pycache__/0005_remove_employe_projet_employe_sexe.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0fce41c264898cb1ea6f8cdffb279d659d8d3e39 GIT binary patch literal 1033 zcmZ8f&rcIU6rR~_x4YZ&t3uFVP?1Yx(s01k7-J+DQdCH@>aAt6>`u$V{-`rkgc}Fr z*|UFv{2l%QR$>AfkDk0Wf#}sYyDbnW*|*<&^WK~JzBdoX$7}>E`uQ#38bZI6Gg|o} zIDZD<2yGz;ucJB^xULE94w^ytkfY5aM{nVVF)F(HFY6f=x|6$)D*4~at!UDYf(~;< zki=XXQR35(dskHmm4?pwX8=d2g#>nx(6$U{WLL4swepQo&b2zY40bd}uK^9UAZt8B z*KL}WYnhGm^=O7+FYgqcQdQf+fQ(u$i#vtdkV;h(wquH-V*#NtX>E*{$O4VJVRA^N z(Phal6)8`}jl^z5WiGRv9?&4nc&;FB?2{;A z6uROKX>PdO>xDtA+_jzw2d{lSj)E8>C25kB2O-iXP~`VQ3b;hbyPg{=Zs1K2(he9G z(1XT_+V*Le#y*X`fO4iJltqU|$v$0EgrvFR`zc~dXlbqPxGdYTlP(=Skr_g`05%?R zgn}U*a_>lBgA2;7}%6PNhXg;TWPbA&u>vgA|ng0Z9UcJ61NcWJi^hTH3 zW#hYa)x@gZL#Ez$Y82oE%ttgZkmcfmu1y<9uLd@L({ K_y>WLR{sMz3KQM{ literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/0006_alter_employe_email_alter_employe_username.cpython-310.pyc b/gestion_employe/migrations/__pycache__/0006_alter_employe_email_alter_employe_username.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b24c38b4a6af6efba38024dcc5cdae1096a0ec8 GIT binary patch literal 1074 zcmaJ=J8u&~5Wc4$7uyL1j{?vMXw2iz6rn;W5fDIv2qlEV&9U}O>^tt^?CvFTT4>YK z&_Kyw+LkJRArg<-vrVEDthBQ;v$J#GH#1kX+nzz|uDlw5wGHE^HqI}Hj5XRKAOQxL zsnIv-v{Eax`*!B^9n*MWfDO)P101vy_mkas!Q3{w?g_myHoKPcvUtRqjEh{TT2=t2 zVyN%VuNE0=w8aM!Sbe2$fjKh!Hadw57T8!z>fnG2HK-rk&^TV)H0h=R9xTNsw4hBm znu(VzC9QAm@5ac4CUlN#I(}sJJFraHR#fxN0uupT9-+|iBFrXfF+~;jdcD<%r4sqV zM<l-QLaavT8&XvnWzt z6cN)hMbcYQv{$lJBi9z-1arWA7^C1;m11ZA}SYU^cKi3{Tsp3S=+q(>Kq=6{0}Or~7_bamR|I*Ep1+0GxwwM@(G zn9i@6c89daX%$J`xH)4T%t;5Db8xQsHz<#4&Vyi3m9#2jmEer&2Jk;6rc63*Y-9}9Jf$Y6j-GZs-f5h6hsgpqJ|WbP$Vw}2^LMq-ibYQz3a@3 z^QC~0kT`RJ3;zJzIPxcOY$K#ZbK$@#w^RmkL%iAbVw6Ki^1RRe&71dr<8is{AXv}K ztLz68p+B^dt^7n8uY>X(@{nh2B5r`pZRR#iZf;oIa#0N}BG0^rJj*xR30ek_%4NXS zi|2brJ%6UvJN2A$2CT=4WN{>vJ%|Guimr}jYj&cHZ9|{#CnxiqXK>TYH4Se0`Swhf zJe9f@sHD)YOnsRKvAkz{1+TbbdZiWfF$fMIRI~4<5)dwVGcCg_d$V5NciK-*W0}^j zW!hA>uTAw#YcFKlR4z}{rr|l>+={KMZ07i!SK*c3e7&kl?`K^*D?l#vajr*&?jojx zVHh7!)ois|%b0|c^2`U4u<(L!Bq)!_fT}|FWj;y!@a!KzJ}f7OOM-w?A?l{ecR~`~ zhq;k`9MY&K`)X#F@=h!$);N&jBy&tGWhL18ZAQaD75_WT9z|?tL=Wq$uJ*ZmO!i&b zCo(bhH!cY|CBcD9_nDBQak$>5J0r$v&~RT`Zn@n);iL<<6K>4iZMsK!!`-4%dv3Y` z>oF-@5(Vzt%|`Qu=8H}2#!-0CIQw2V%vQ6M^O)lS+=@W&RH;wHA(nJsa?Lq@1vcgE zl8^;N#$50@aQpO zcs6$@WBe#9SUK^KW-sdrjD>_(*2P3>gps5IWBwE%jNyk=eCu^zLkNF$Ys+1g@hAQo z758O4^w-vW@4fcB{sn^h(}(K=)n2_otH)8TF+AWloSJN!zv4I8zCq_UDt%y_o4G6Y zS6k-}DqTJ)E*uvZPOrMB^R?4z?WB7BxO)A^rC(n86+f(g_NZW$oQru+CwYs<)y1D* zd+=ue!OQF%p&u<$=6rT00*Y@VO(~<}jx-_A}Dy##v6jgwz3avv+u?7kU>`ceri9KY!>&%Sv zO952~apuH@e*kVA`4c#{QKdw4;lPQTt3+@^%)*6tO#@t%21|_W7(!K!BgO>n;3jo;EDf<*$uSg`A8%BU?ddD`z>zsIwJOscIp2{YM0w zZvDCOTE^;&85?8$`7zH}eJNvOyfUJ`g$iimnvr)aK3W4U;ZkKSNI z0Jg1favJWydr-p{@Jj;>#_%5lJMd`=iFJ@#2kF{vJ6XGJCuw&EmW3XlGEM3?( z!0iM36oC1!?etVr6J_VSkNC^kHFd|nn3m8VRnRvD^#9kO7j&#Dje>$!(jQ4rq+*#u zrTH$Iz~Vb;*S*Ip+SK1jAWVWGv@Gky0oJ8Iz$>TDoaOxB9?h;io?ZDHXd_ARA4V^a AtpET3 literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/0006_employe_date_naissance_alter_employe_sexe.cpython-314.pyc b/gestion_employe/migrations/__pycache__/0006_employe_date_naissance_alter_employe_sexe.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb636def514c86c0f3d4ce3957571271eeb88a34 GIT binary patch literal 1086 zcmZ8g&2G~`5Z-kh$99wcgj7W;74!$82r23T2q1*0T9p)N6&biCUAgf#b?Vr`yD9Ch z2gI2N-~s53M?m5QLR6{MUO91#)C#W5+DQ{w%j0imXTF{Nc71m|V;H*21Uc~y+n+8!crGeKKVuj%eWCho&&wx3C8-RgG%3WSP42qX zbA-z1ABr>KZv;+M{TH@M8y)}v literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/0007_remove_employe_formations_formation_employe.cpython-314.pyc b/gestion_employe/migrations/__pycache__/0007_remove_employe_formations_formation_employe.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a163c75081fffde56418904237f7bacc4316631 GIT binary patch literal 1217 zcmZuw&1(}u6rcUbW_O#mY5I|V&}vOVgRt}(9LccaFh6fI<;afzM)5EJ#!;$W*=pX2B|eQW`+HB9$VxQ5JAZib5KLLIz}G ze}ix*D>A)q*N91N&-Iy7_blxA)zOuSe$e~FonuhpdqY6Q{Wz6i!VsujiIoO5BkTBS z1Smo&$L|w-ylNuyMlG+Bp-@pvsnKlYb1YWTOLG^IQu31A{3W@?i#e#kI8<|Tgg`CV z*ToR&1k~vy9OLSYGwsPh6&A{{5Z+Sn(7h-?hvy7wAy2Zv+ohGm5w38ZHFwnwmCb06U&rdTgb zx8^a?I$&yeVXg{`Z*J^vZfreZy4S#i2RVz7Pr2k(WKv4(gC@m3LL_)CJw5<)Ht&?5 z`Iz|SLaDrk{g>2hly{4;5Ser0l+WIJnah+zBs}p@kYTg@v%U>Lqj5wOzGZ0Q-0_>- zd;nbqXgfkz5@(d-$6Xz0(`|L-L|y5muXd)EPh*m%chxYvbfPYG($_jui=EVbJC!*} zWj@V(o%_DJnT}~j_4wRiV@XXP^jLGdVh~x=b^xde}$W_BnU!J b0mAApaN|@-3d%>lom^`r*Zu(>garQqs!BXd literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/0007_tachehebdomadaire.cpython-310.pyc b/gestion_employe/migrations/__pycache__/0007_tachehebdomadaire.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8017401c8aa903e74ec003a9339a79e33cd27a46 GIT binary patch literal 1357 zcmZ8hOOG2x5T5CIc>G%LCQBf|AqP14V(*DaQG~LwciBK3Q0#E9BDKb@^0+7SaC&A! zmMh$l{{%N~{GPsY+8=;~IIvXr*h#cAny&h)tE;QNuAaQxZCUjE_V;V?rDs`xY4G9W z5_m*k@qh-fz)q~WO_C)nb>@z(ZBF8*-rP(5xo=zFSm1*9s|6l1Syzj)tu~Wq=I`97P?%H z=_bi9Q4LQ{PQKz{Qli}3NQNT0VXF$1S(u_anuW_XUf=@qG=xw{R7}9^T(KwPzN>+)2?(k z(o|!)&czZ7>X7g)PcVzhwem_)O1!$(F1EZ!LbU;lr4$>@DfO1ONW$!uYOk@9$N?8s z*=O<#?dfJ!lBi}qvl5wV?MUKbNh@pKviv6=0;tCRcsiwKyWnfhci&M>Iy&l7EQv#j zi6*(`kd-;5?HWG)mB0jwXZ>Rpa5K%hYH>~tUL{C+hx6A}m}qB>05?PvW=nyEbWB+z zbAS_lBc#59s`FSxr*yREI<#tz)}h>~Gkja_Rgq$?cE^<3>>X^K=MqJfeMfEJLmXyN zt{5!n1avLLoob9ur=!#HnPhsm-sy|k1%EL;d(J1{kI$Z}R=&aAMg7B)kIBaj|Gpfq z^Av}xWljYQ$N92KF)NGV4>FIjMNx7k1Lf5El!?g#2_UEcr}gZhs$*cT}uQW$C(Q~!Wc nUe(n$->oq08^TSr_l4HlNUskb*5~-OO{mc61*}7v+;RQ~94VrQ literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/0007_tachehebdomadaire.cpython-313.pyc b/gestion_employe/migrations/__pycache__/0007_tachehebdomadaire.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71c9e23e6901c94f06d1fe1bac729ea033b143c7 GIT binary patch literal 1978 zcma)7Pi)&%7=N~7=TFl%?$Upu%fcvwR9ahU1KKf=LennmAEw3Wq)nEL6Tc?j96Nh< z%8EE3A#vfd3sR3e4Pi}_^WWrgfh9#0U`m26IET;IiS= zbwf7^ro3sCwkUr+pAFHt-t-);La^>(gN`+bS=Y&tb`KxXD7Y|n%lr(}_#q}`$HkiO zGIZBzl57~l6RoCgm{iGnN3R>Mt#H3OHMUX~|sF=WVYS{984CkLiYV}m4Vx(Aj)-fZVn zO*af09+oHWv243qjpaKl&?uA+h8KH~LxL@qeo3+R`&Iw&f6PR_z_=49U2w+f|41Mj492 zUJueq!y7qeBbVPKY`xLR+zcQ=#soI7eByZ1b&q2}|da=lnkUziN_-;JrljJ&7$mGJ8@ z==iXS$JeCz9^Ti@(X!4-dPuOP$%J z??XQ?w(e*xo3v-$R>JGav&S>t`D|xC`v*do6rqpMCqh|xf>5f$1lbUJ^4#%-ZfdEM zT6$Dzr>?XT@Au^Nw^BE=+R3aw^4giJt;7faQ9WL4XRfspg`T`{e9%oVchbv`N{>VB z^kyru)sxR2A9l}O>YTguIN3h8)k<9J$*JS5?!v{+!o}~UAEQ4+yK9B^TA{mkv%Pk+ zyLP+1cDq$Ogm6CR^88w^uQ>KWQ2ppL3%?uv1`LwVY8*Jf&P*d$gC75o?12dNKrY*) keSzb+Qwede|AI2VqPPE)lAQD~)=ez76N^s~2)>Vh0H?4Mc>n+a literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/0007_tachehebdomadaire.cpython-314.pyc b/gestion_employe/migrations/__pycache__/0007_tachehebdomadaire.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..276bdbfa2c26f1c232817753e224c0769e253a52 GIT binary patch literal 2017 zcma)7O>7%Q6rSC+*Sn6JcvB~Ctky{(R5++6QV@wssTAV4PHAYmaVixhS=Qc(z3qC} z%#K5YIP`!x_ZV^F%B{z8qDPL770K2}2qaG245{D-yz$z_w5h~O-uE-#ym@clx6f~l zo{1uOzLtpnMi`-AxG{LZ?mZ_(5D(EV(uFld1(4#JSdgeR&3)2Zs1T;%f=uOUG=VN6 zJ(NUxcqhCu+TTAU-jM=>Ms(qIl#zes=0_QUDL$sub}N2HWYL;kAttpw*JpCgv#{fr zhhiYDZ=C!k@Vs^)Cmm67SD})AE-TOwoE;n95a^JZpo=?^jrgf+k}l~XJ*>-%pxX(;&Zh6D)jE(dUO$T^?W*IxGNXLrUoE}h~}EcV&5 zAZ8VPVo)!1IH6C{2|Wo6N-=ePz!s(z&2kkNaLMv&re)d$Gtst+c_yyqG9eZ-8`Lw( z1e+9FY@|-?nn@0f`}lyVJ|?#5*q>t-+sCBj`PgvH8fKw;UV{K9Bju`Rm$47zG#?la zb}O{X!qlb&X9U6-$wn;fmx*2H#05r&OOEN@XCqbIAlR^QsX;R$;eBTzx8XQU4OaGS zmqq(Y8776DL7uMnnPFNMi{M(_@eUv{%B%B@Dz7giG1YS+tb-{m5$y1yf}BO_LB^q8 z{_>uU9n1d~J~EMwRj|*qGX^2wo}Zt8*DxK5$-oEFw4E1x4Y(d2E)#($VW;6*HVfb6 zg4=M5++ODbY^81}^8(eVIK6b4Db*Ha^SN7o)fXSOZ$#E8R$%Vq1 zlIv@kNv0URQVoMe4Fg6*!@;1(4CB*=>F`X!8Z(SNoA}hRUF>>%*}`==3cF<+`-Fex zY-FX!hIKw<2%mQ>_JLhl2A<^ky)kvAYLdQM#1H5|wQD#~&*b3Vi_gty-XqwqxE}(i zWb2;kRy-zJC8&Zo3a*|-R+cwcmUF9wbDNDVZxsv1*5;~itl!G5-egg)jt8@E!Z3Ua zbFd7wpu`3OLH7-E5jLK{4>5h^%Jvqt#@{Y%Z0E3lpL+G}%{9Fcyk6+`_P=9w8~VOz z^!U_cQ~ztp)(=Po0{31DD1H*A)>o)2BlVWhmBfVn@MbrP)U$0R-BQvWZT4qv;?aIP zIoC?gJqi6V+x*yQy5uIO=69HTn^G5{Po$Fc453t+8=56`v~!1- z+Nrr#YVL9QICZ5Nf3KsZzmeNB^R1cr$MksSYBT=+e_T&zk7uqo?emvg=Py5zzgNFg+e?L`r9yk@ z_R-Sq_R`&>rMu1QKBV)7kQ4vpqA30r2*~upmdG=`BX%`4G5RbVQ=?sJbX@-O23Z~4 zR7PP_L9eq`DI5G@Wd{u>*LbH!`s-!S-3vOeKHt$}Vvl^m<@5dq!Sj5pay8)hHF5(? p{x9P5A=;G$K{%0-aPdbp^AmdWnVb;hN6~hC_9#C42LhuP;~#_%4MzX~ literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/0008_remove_departement_chef_employe_chef.cpython-314.pyc b/gestion_employe/migrations/__pycache__/0008_remove_departement_chef_employe_chef.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7cba6b9ed756875eefed9ab4c0873385571fc8a1 GIT binary patch literal 1015 zcmZ8f&1(}u6rcUbX0wTHjg}Ou?MmB25JL|_MZ}L*N-A2y6mLm~P4=a(Zg%7BY@xRv z#IyKU*uTTGphaoet0!-P7QOmrw`+m}`}X(deg58?+cQ@zg6GS^53j2d@>44LDO`f{ z#|VzeKB3AEX(~c#szO~R^W+wxYK>5>qqK}XX!5_SWmsrbUm^9vFR9km#2R=9+!0b`-A$_+*6okFWJ9gtycMxiRzHjsuq=rxm} zX^CDsRXb*@I(?gAv=yj9i+KiWZd_7msKTNpQKl9WsU)QrIfJC^!qDLY1`vou@4bS4 z%22Xmfir+aPh}AXLq9x%?RXt)ZGo_3;rU+V2#C22k+|dewv4u2uzO&;pHKd!wI5;1 zq6>W|_C-=T1l|oJNVC^9Uc!7_jw~tkJ@DNVvWxDs2bdEl%r5ID>v%R8he3D<`6cUz ze2^_-0&^qMG+A1NvBY8w7Zv+}xWd@m*zqMT)Mgp$dpr`p7eEk7GY$j-7lNJ#5ts8z z$}}yzE!#`XC$5_!u1i~GGYoxjg3M@zL&%@TJY$i-?t07-f_vRqK*SiI#i(=qNCI2; z+b<*FQM=h{KZWRx2#4*x9oo#qe-mg=UR@h!aW9|6)c%-UK+Zo^8p9(lUv?@ai1tvt zCu4(@TFO{cuN%kD#}+AFJ2RI~&81Oob#%3MQP4`(*i3I1PtCXbKc3NHg z1YbAB_iB7m)X}YMRgHJg_>H{EZe34G?rSGF2peuU9bh`CtPjaP^Sy~EF&|`WdB~Sh iRq%^sqOqnZ${&L$^$TN8F+NylbF1IxR(}&z(&)bs2@DGW literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/0008_tachehebdomadaire_statut.cpython-310.pyc b/gestion_employe/migrations/__pycache__/0008_tachehebdomadaire_statut.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e0bcceb3146d8e3e1e2c83c71ad24f5011dca29 GIT binary patch literal 713 zcmZWny>8S%5Z)i(oo$F9DI!5dg>+4P1rihp1%=;&2oWkbE5|cu`(%4ByS7AVq0NKj z6=->jZK?7ENJuEm?tv1Kk!CdC%xJ#dZ&z<^rHt$wH_cDZ*bfh`TSQ==+&-iL40y{r zp7T!Rg0t5Q1jw%pB=VK~B6A7R5t~mgXqL@|OS`5r#n9;9x@o5YTU+|pb&Cn?liNoW zkmVd$E`V1&ml&-ko&cw-8ALFt1WaKD@tK6=OwvRQDbd|>$-93%M0%$}>nRm>>sFtl z+g&UckJV6=HP(0xx+|b)47%-`rKuf?VH{{njJ+!LXzb_sW&a>#zB-`knjUdX=(HaL z_!w8OW`N6LYzLB|_@r9wtD&ZT8iY`N(V>e%oGcq`;c%X~ScSS$ zE>()=#uh2Rt<=d_w0_njz%}-Oec7Njf=FHb9N?ATVWfx2L0y=DU8>jk_XWy~05qz5Vbe3*kR8v#S@)NY*DeWmOvq_tvMz|D7qh z-JuXOA*0J^BDml?Jo+79hW_C^atW-8zS4Ve9Ig{C5t>&A-emV_kBgsfgn35am08bm HSM16^i-*YX literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/0008_tachehebdomadaire_statut.cpython-313.pyc b/gestion_employe/migrations/__pycache__/0008_tachehebdomadaire_statut.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a12f6bd68e56c1e1d6d0226a84bfa97585c1683 GIT binary patch literal 914 zcmZuwO>fgM7`Br%O|nkwItGIwQB}JH(AEndLuk@iH$mBUsNsTwOqO_UMw%4ckr*c= zB+gv+BlZ`#@(0Q;n|$T8Tc?6{#ZIY)7?$$pdHjC(eIF;o$w>#u^%c_S90Kq|k?|`0 z0mBsu4gdlOJ_k)mVN;`870iJeK-vv}bPu-7ani;6o<71&RKwWhEO;P^VpTCxyK=?&(y`A-kMv6Q+8^q}z+reIl;b>-7hi`$30v$WEAc z{m_pn5!08qOvZhlaaqM82@cYXvJcjJQq7Ut<%D*lgpkaZhrP(jw?jhJRHtfuR~N;g zlSTnyq8O50Ka084&3}($lC*h8`kh=kocLWLjNBG>BNB&)VB4J#7S25w3kPEvnZ-on z62|W`KUUF_O<}wnQO0B0Ns=meNO~j*NfJbaQFV91S`EVuRhAlx+G`!3=3F>wkBo0| z7GpJW6kwlo8tr79FpTM}Oc}}th}Ub6yqAnn=B;jSR#$oY%4-nzmZv?h(eTi-)>H2v zxxI^z#FN55yexcvWX2bJ`&3<7ZWLf!(tHL36WI3$x^~6T0=VnU}jxAD;l;l(9MeZsY!2*>ufgc5S_Ih$2NtwDW#zDQA#hNDCz-Ggb)Jyp%l?7GH^gjx;XYGadGUhyOt=Y z9uQ~#Mt=u4PNA1nd*#F}QY(68*KSlqvE=c4UeC;%x9i1A7afq-_i-AYAb_8WjIP2d zIC?6<9&Ce)HlT_)s%l)j1=DaFTx|wiy@6`xDCz8ZU(YeuUE>av3%?XCYr^SUwr$EnRt0gRQK*gmoseTG2Dw_JSey9on(aCj z&DFOZ*H}Ik<`zasR<&J|J8n@5y&&w(kwP)aJ-~ES&YjSU4EV{%J%c z9>e%U>P1R}WaAjOLdtj~E5wOf4oHv00g3&PFsh6a*0Ug3S7NE5sJ+thXvT$;^vGx@ zr!iK(gg*8-r(rYYgken8W*o^I#M_le^*4-AR#7w9}DVdhomme zczE87tX;}0yYy}# zP@3=GTkWso{^Gm-4j%$M*H*P-fT=a@xM5((>ZZu%2CC#n3ofL)his3U|(^b literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/0009_alter_employe_adresse_alter_employe_telephone.cpython-314.pyc b/gestion_employe/migrations/__pycache__/0009_alter_employe_adresse_alter_employe_telephone.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d24853009bbf74a616d653255aead0b23c448422 GIT binary patch literal 1002 zcmaJAr1OwzG9+YUCsb z{(^*rX0D#RHG$~WncXfBLYQP{pJ(R%eBN2THQ^w&wvPtkCj+71nq(_K z0;kUuI6ynd!&Owl0#^)SETUO-A9=G=49w+2|-;Z=!#U=@9g^Y_R zq(EbRt)c=AfHp(mOiL=A=aB&RLRZLg`oP}k_$il8+=Fc5vxIP=rr#vK5G>s73*dw> zJ+xCjI7v4i*WYqryk4o*H-YboxL1Eu^(yIhrP=z$W2&pR9}!=dao*%e>MN(`0+xIG zOuyV@(}1_s_5}?sWLNRfG-j-WS3?Kcw@-=-N5zG~+`Yl{-9hQjNonb*wDfJ}$MWIk zajAM%$l1NiANKe_KqF8-g2O63f<9`;y?wK`>t*_3>)XJ}^mA^=l#QQ(oN&hwg literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/0009_alter_tachehebdomadaire_created_at_and_more.cpython-310.pyc b/gestion_employe/migrations/__pycache__/0009_alter_tachehebdomadaire_created_at_and_more.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cef3ed8c936413cf66798f64812a65c22a19c8b5 GIT binary patch literal 844 zcmZuv&5qMB5Vn)FO+u>$4shY`gw)HXM^-{;S1f-LtPtB%E|!~_rYVVCoCL94;o2AA z$Zem4H{j?ir+tN$5R6k+T>*|fnwig;`96>JXcRMAUv8S>yT{lM7hGNe1^cw?`(%It zFImM?UU{j<*)s+n_@5d0$d~>nKlLFvX5-!&on>Rs##NCU*%VsUwqI$$vd$cIc|{cL z)2?5VL6&l0sRumgsgJ?3=Ne#tIe>t^-r9ry`XWD|e3&x`zjBBmhAV5|p}ChvFeDly z8@;;dPh@s-tQ{4B)vDAdXm3v@lLw-a*#Z|h16@gwg+Wm_vS}N8?H|O(nL*hg2-!@j zVsBPT_0|TeEz7Y_YMnx%WQCM-wl^=Z1l!+K9Q*W7h)QI-HTB2viMrQ$F594~3WeCZ z>zH=Iw^Jl!AQhD-ASB?x`II+16r8!iQQJYb&_#x|9RSW{TQ)>Qeh?+9yjdKLV;hQ& zlMpr*f;dt+@`pmaYh~$px(INE3Q%PQ)`lJev++Smte!dr#&?O)A!(l$6?QorJzmHS zY-7E`KXX21<_;b1%=!Cdp({-0nWoaoq0ZV0RZ}Ogjb36Sj$gcao^)lx$&-(7oK+~kH&$GU@29u hcVX6v?*wfgc5M6)7v7LmrDX1+XQdO0rfYkPaL=deMH6SRZ64`J8!)g<66H~`d*N#Lv zAt7<*(hFw}^dE5N7c`evd*#$ys(`pM>ktK%3QJzUnb{e?c{77t&PMQjn&DngMd-UU zMo;Pw7_0+0Kp0`=G1^qPvZ-=)9?hZ!gw?AEYmQPiMoHuEZEc9T*3^rsQ)v`cVYj^| zr?D3Xkuch!%lxP@&Os>i#~6GDaDW`d6^yuw6|P}*Md7-Ws%HOA7-FEJVckhrCohbp za0(kG6{kzufAUSp&tH_kg0S^e!8Xp|Y)O+a!eMGM%d-iTl0P}pCIXt8E<<5V_gf#))M2} zA%jSo22dUXCIre7gP%)9PUV)sZ_|xd=rvd*(k|PfT|WjQ^bPS@(2QG$XuFsdCP`Qk zB5Xo{B@_glC1kHleaRH82|{)}9>qS;2tpZlS%(EK3mP7axLh1zmwh1mKsLp7>Bv<; zj+)nIiBDJ?EjkPfJM6I0PF*31rd|Vdi@8_t#w;R)&q0L&yhwC5?mEvR#v`Y^wKZRk z!{<(gMZ0m>aVixDKdL@-&JE8QudD-OED&OVnrksK04dvJU} zeFIr*eNDY=yxZ#A$eKPj3q7-NGIR4}s&JB@J+F4q+?DMzgl3NSC z{6g>6ejlNVx~;Wcy9DPkulwSr?ia(4g#rS9+Pc9x!F8)MdB-y_KU)m{I literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/0009_alter_tachehebdomadaire_created_at_and_more.cpython-314.pyc b/gestion_employe/migrations/__pycache__/0009_alter_tachehebdomadaire_created_at_and_more.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38d4826588d71ad3b6ff4516c7d9a4dddc5ebbd0 GIT binary patch literal 1125 zcmaJ=O>fgc5MA4eV>=0LQ>ubQ1^tvlrKks_0-}hj1*Hf|WWtFgtBt))OdUI2ZzRg8 z2gI45LHPxoxbO>zkXr4P6SqjM;L5DsC{?Lg$>W)wndfw(Jj<{kYt~PW4%9a$Ks;4Wt^9_j)!zi{|&s4@Q z&1p7_u?iIBveT<)!~F+K2dqL;f8Nfb60&nI6g$(fY-5NsLM*A=vQ3_~Eg+p2=JO$2 zF~Nz`rfu4E!wzwY$EdIzMhT}bCcFyLq?FYrKCDIARP*O(x!Jj>bpXZ zIN?1m3>si3?6C-nGfq4792$v?OLs`m=g>~xVxI;r-abUz06*5Ek<=a2PS+3jshC+= zS-Fe<84D-yMXji^G2s5rcpThHzM~3*Q`YeUN_!@xs&Vk`kOF*$1TZ)x3`nd?U+(9G zfny373kzeQ1U2C2Fy8ACU($kT4C5V-McfDEAe3pBc4^?!!0~9ra?36!=7MOo(eM25#4K?Y?XAAoKr)+LG!*($xO!o~5T4Bj;#xlp!CR0j@lG=Ij rgz+FbyoYQNLIs}a2AF}SD9RrlDaBKLLeW23N8=0M#}|Gh2;%O)%DN?n literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/0010_tachehebdomadaire_date_tache_and_more.cpython-310.pyc b/gestion_employe/migrations/__pycache__/0010_tachehebdomadaire_date_tache_and_more.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb5f52d8a31965c2fcd49cb0d4a611becb311055 GIT binary patch literal 865 zcmZuw&2H2{44%o)Hk-DhTsUzBX)nzpPDlu~qT;7wtBN8Hxs0ZUF1UM--AfP9_@L+Pm_K55oWS`~&qAwDr5RbmxOJmriBDUOg@jE+} zax2G{3sG3FDszr*PV14u+Q&x?xk!&o(vjQt{L1}tB3;9OXH&D3n6(5XiZ5c24ARN_b zsTMLti?zm4CH5S3$OlJ#zy`*sw`=W^+e)sDY-x%NTPj9>R24RPw>+9{x=0OmDdl2C z^q{Yh^ev^{_qyU*83C^7b=YJDww9(txM&~X8FR2c!|4I>AFzw}`BRSi^yyNs)!3|X zJpx~ay+@Y@akWa8rpDwfGn61XFj-$?)3wR5H6?cH8$$b7`{-54m z_vBCSc303s8xajft8J|c_!r6AbJN_@*sQ-Kb literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/0010_tachehebdomadaire_date_tache_and_more.cpython-313.pyc b/gestion_employe/migrations/__pycache__/0010_tachehebdomadaire_date_tache_and_more.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a486ee0f6388cc8fa1eaa99e6eea26cd1f1fd628 GIT binary patch literal 1129 zcmZuvO-~a+7@qy??$Qbr3`8Un!ex~}jqy-pNE#ZWwGiy62eZj!+a201`%!1NMs6l1 zp1tq~Jn7B90vE_$JrOU(YP|Z+ZcB|a$-eVEGtWEwehmu+1Hrnt$K3BCLf<$UFJ%OV zTL6v_Mp$@?Y625#A`@58B3eaQyn(P}2@Q4ZG}-S<8D>&jHkETuOffNhx6SO>4TC6A z{m`La)SCDpl!gNb!%tw2kcF6l5fib%BrI+UOtzFp{%?m2LnsoKtz2W~$~y%sSS^b< zSC+uPc%??d8u-s&b+?JI{!G9Ip32_X6xkHcvwXW?UQ6_yaYpC73XtP;n?^iCLj9f> z9@3-)t4wS!ri{dPt3x}q>4d)R*e;`_#i$)qhuAT(1Bdt_qsi=lvczyemAOBMpD0bw z4h|AI=zE?iL0x$*NnraF&bU?fUFtcB+ztE8RJe!N4;(j9>U`tew;AU*mDCKg#6l}J@^9+S}u(kpQc2sIL;%U7Lz&Et5A}Z zCq{)=H^cgN#~wi=?9uVKT_+@pVf0#1>6p3AeoP}m*e!Tz2p>wi+YhW45oM88sn=I3 zarnxr(&!)#dsek-;U|s9)<2!KCev({N_R_Fba&FV%kFOU4jCVn)Nl|5U_PLMiu65U zAc^zpyZXRD`rN6ubfPVtE!;kvT|O%=o)%Y6imRXJzgCZn<%^uG8za^7iME`o7A{pk z5L&my0Ya{LAYLFe=ZTp|VXCOUudzGh0Cr6|(Veaxw8IUjnbtY2ZWbc1PNrQ4lxPpL n?rpIRpaOi+O)vvV5QN_<63n0Kte}20PG{DRXV!ipAgT8s)1)&O literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/0010_tachehebdomadaire_date_tache_and_more.cpython-314.pyc b/gestion_employe/migrations/__pycache__/0010_tachehebdomadaire_date_tache_and_more.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27da2cdfea7c7e53220c8c3de1cf7c86ee0f6428 GIT binary patch literal 1143 zcmZuw&rcIU6rSC7x4TObS|FGpF(8*k($vI+V2lwVrVzkp{c&nLnRbVEVSm)wsgWB8 z_71YOAJVl|VFg~B z5$;7{Ec769sUNqlvJgrdg24F~FvqBlxZ)tLHgqUtl@y+>Yt{T{LW-do#Zl|I>g2U& z83)=}g%Ra)wADd#P^*~6Mr~3{hg#F4(G)MB5^~0#DGkfX{a>%7@-fHYdB=p2^TOO6 z&MFF=v^umyn{E^kmw1c{%O#xRB>n<~(V9L94@EZY`M#Y2ouoE6Bmsq(wA#K$eOF`; zq8P-eRAIZQl8W_TXfqO=BrAra{+_j;JWZTEoQWl%?Mr?E|+Mg+^RV zI3}TsgNRXElMVU3(Dj72BRA;>gh_u_Zr~dMWsnOYV|Rcg>wxwoYg=xT^@fIS%6c_G z_P8)`G8x9g!th16=TpFWj9>SNFQ)}>0^@y;#oYHo8b#qA$ z%EGeJH8)|B#241O95==0Mu!Zb6?N(G`ORP)b9jm^7@ae(+2b_Em=&PXxx8($zww~< zGNvr9RjRd38XxkgTYJ9cR8sSg%(bhRT`QOGm9LTd>c%gnE_IKX{QD$Ef;a^89`$u( zR+WB6oz{IDz%RZ9rk_z1<&TaO`$8`$`UmTDa_Q^j(r*M#lKmGL4=*_Y literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/__init__.cpython-310.pyc b/gestion_employe/migrations/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a056c74035a3affeffbe67e32a9ec572aed60f8 GIT binary patch literal 148 zcmd1j<>g`kf;MKROc4DTL?8o3AjbiSi&=m~3PUi1CZpd>1>tpPpJ=l9`_upPE~clV6#tpPQLpln4?j){l?R%*!l^kJl@xyv1RYo1ape PlWGStu$T!*urL4sU#1|| literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/__init__.cpython-313.pyc b/gestion_employe/migrations/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..94382e6bdc411d7c8ca8496f9821c4c580059444 GIT binary patch literal 166 zcmey&%ge<81m#~DGePuY5CH>>P{wB#AY&>+I)f&o-%5reCLr%KNa~iWvsFxJacWU< zjH8c_f@4X3RE$e%adt_5K}@h`kVi~+seqMZPZb43dWok@rW_nQ~NTfI>K0Y%q nvm`!Vub}c4hfQvNN@-52T@fqLRFJL3AjU^#Mn=XWW*`dydBQ3i literal 0 HcmV?d00001 diff --git a/gestion_employe/migrations/__pycache__/__init__.cpython-314.pyc b/gestion_employe/migrations/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0954f9a9cb3a424ded7f964532d087bc2a86f7b4 GIT binary patch literal 167 zcmdPqhza%#@_-QOsl_Fk`FZiFxdl1-m8mhgndwD|Ad%vj`1s7c%#!$c jy@JYH95%W6DWy57c15f}LqXOSgBYKf85tRin1L(+P+ce> literal 0 HcmV?d00001 diff --git a/gestion_employe/models.py b/gestion_employe/models.py new file mode 100644 index 0000000..8f711d5 --- /dev/null +++ b/gestion_employe/models.py @@ -0,0 +1,121 @@ +from django.db import models +from django.contrib.auth.models import User +from django.utils import timezone +from gestion_projet.models import Projet + +class Departement(models.Model): + """Modèle représentant un département de l'entreprise.""" + nom = models.CharField(max_length=100) + + def __str__(self): + return self.nom + +class Employe(models.Model): + """Modèle représentant un employé de l'entreprise.""" + FONCTION_LISTE = [ + ('directeur', 'Directeur'), + ('assistant_direction', 'Assistante de direction'), + ('comptable', 'Comptable'), + ('raf', 'RAF'), + ('data_manager', 'Data Manager'), + ('logisticien', 'Logisticien'), + ('post_doctorant', 'Post-Doctorant'), + ('qualiticien', 'Qualiticien'), + ('technicien_surface', 'Technicien de surface'), + ('chauffeur', 'Chauffeur'), + ] + + user = models.OneToOneField(User, on_delete=models.CASCADE) + matricule = models.CharField(max_length=10, unique=True, null=True, blank=True) + departement = models.ForeignKey(Departement, on_delete=models.SET_NULL, null=True, blank=True) + fonction = models.CharField(max_length=50, blank=True, null=True, choices=FONCTION_LISTE) + date_embauche = models.DateField(blank=True, null=True) + adresse = models.CharField(max_length=100, null=True, blank=True) + telephone = models.CharField(max_length=15, null=True, blank=True) + sexe = models.CharField(max_length=1, null=True, blank=True, choices=[('m', 'Masculin'), ('f', 'Féminin')]) + date_naissance = models.DateField(blank=True, null=True) + + CV = models.FileField(upload_to='cv/', blank=True, null=True) + diplome = models.FileField(upload_to='diplomes/', blank=True, null=True) + rib = models.FileField(upload_to='rib/', blank=True, null=True) + photo = models.ImageField(upload_to='photos/', blank=True, null=True) + casier_judiciaire = models.FileField(upload_to='casier/', blank=True, null=True) + + chef = models.BooleanField( + default=False, + verbose_name="Cet utilisateur est-il chef de ce département ?" + ) + + def __str__(self): + return f"{self.user.first_name or 'N/A'} {self.user.last_name or ' '} ({self.matricule or ' '})" + +class Contrat(models.Model): + """Modèle représentant un contrat de travail d'un employé.""" + TYPE_CONTRAT = [ + ('contrat_duree_determinee', 'Contrat à Durée Déterminée'), + ('contrat_duree_indeterminee', 'Contrat à Durée Indéterminée'), + ('contrat_prestation', 'Contrat de Prestation de Service'), + ('contrat_stage', 'Contrat de Stage'), + ] + + STATUT_CONTRAT = [ + ('actif', 'Actif'), + ('termine', 'Terminé'), + ('suspendu', 'Suspendu'), + ('rupture_contrat', 'Rupture de Contrat'), + ] + employe = models.ForeignKey(Employe, on_delete=models.CASCADE) + numero_contrat = models.CharField(max_length=100, unique=True) + type_contrat = models.CharField( + max_length=50, + choices=TYPE_CONTRAT, + ) + date_debut = models.DateField() + date_fin = models.DateField(null=True, blank=True) + salaire_mensuel = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True) + statut = models.CharField(max_length=50, choices=STATUT_CONTRAT) + fichier_contrat = models.FileField(upload_to='contrats/', null=True, blank=True) + + @property + def nombre_jours_restant(self): + if self.date_fin: + return (self.date_fin - timezone.now().date()).days + return 100 + + def __str__(self): + return f"{self.numero_contrat} - {self.type_contrat}" + +class Affectation(models.Model): + """Modèle représentant l'affectation d'un employé à un projet avec un rôle spécifique.""" + ROLE_CHOICES = [ + ('chef_projet', 'Chef de projet'), + ('doctorant','Doctorant'), + ('mastorant','Mastorant'), + ('consultant','Consultant'), + ('stagiaire','Stagiaire'), + ('laborantin','Laborantin'), + ('medecin','Médecin'), + ('autre','Autre'), + ] + + employe = models.ForeignKey(Employe, on_delete=models.CASCADE) + projet = models.ForeignKey(Projet, on_delete=models.CASCADE) + date_affectation = models.DateField() + date_fin_daffectation = models.DateField(null=True, blank=True) + role = models.CharField(max_length=20, choices=ROLE_CHOICES, default='Membre') + pourcentage_temps_affectation = models.DecimalField(max_digits=5, decimal_places=2) + + class Meta: + unique_together = ('projet', 'employe') + +class Formation(models.Model): + """Modèle représentant une formation suivie par un employé.""" + employe = models.ForeignKey(Employe, on_delete=models.CASCADE, null=True, related_name='employe_formation') + titre = models.CharField(max_length=255, verbose_name="Nom du certificat") + organisme = models.CharField(max_length=255, verbose_name="Nom de l'organisme") + description = models.TextField(blank=True, null=True, verbose_name="Description de la formation") + date_obtention = models.DateField(blank=True, null=True, verbose_name="Date d'obtention") + date_fin = models.DateField(blank=True, null=True, verbose_name="Date de fin de validité") + certificat = models.FileField(upload_to='documents/formations/', blank=True, null=True, verbose_name="Certificat (PDF/Image)") + def __str__(self): + return self.titre \ No newline at end of file diff --git a/gestion_employe/static/gestion_employe/js/index.js b/gestion_employe/static/gestion_employe/js/index.js new file mode 100644 index 0000000..95eb1d8 --- /dev/null +++ b/gestion_employe/static/gestion_employe/js/index.js @@ -0,0 +1,263 @@ +const $ = (element) => document.getElementById(element); + +const url_liste_employe = $("tableau_liste_employe").dataset.url; +const tableau_liste_employe = new Tabulator("#tableau_liste_employe", { + columns: [ + {"title": "Matricule", "field": "matricule"}, + {"title": "Nom & Prénom", "field": "employe"}, + {"title": "Fonction", "field": "fonction"}, + {"title": "Projet", "field": "projet"}, + {"title": "Téléphone", "field": "telephone"}, + ], + // ajaxURL: url_liste_employe, + pagination: true, + paginationSize: 10, +}) + +fetch(url_liste_employe) + .then(response => response.json()) + .then(data => { + if (data.success){ + console.log(data.data) + tableau_liste_employe.setData(data.data); + }else{ + alert(data.message); + } + } + ) + +tableau_liste_employe.on("rowClick", function (row, rowData) { + const data = rowData.getData(); + document.getElementById('detail-id').value = data.id; + document.getElementById('detail-matricule').value = data.matricule; + document.getElementById('detail-employe').value = data.employe; + document.getElementById('detail-fonction').value = data.fonction; + document.getElementById('detail-departement').value = data.departement; + document.getElementById('detail-sexe').value = ""; + document.getElementById('detail-dateNaissance').value = ""; + document.getElementById('detail-email').value = data.email; + document.getElementById('detail-telephone').value = data.telephone; + document.getElementById('detail-adresse').value = data.adresse; + document.getElementById('detail-dateEmbauche').value = data.date_embauche; + document.getElementById('detail-dateNaissance').value = data.date_naissance; + document.getElementById('detail-sexe').value = data.sexe; + + document.getElementById('document-diplome').href = data.diplome; + document.getElementById('document-diplome').textContent = data.diplome || "Aucun diplôme"; + document.getElementById('document-cv').href = data.CV; + document.getElementById('document-cv').textContent = data.CV || "Aucun CV"; + document.getElementById('document-rib').href = data.rib; + document.getElementById('document-rib').textContent = data.rib || "Aucun RIB"; + document.getElementById('document-casier-judiciaire').href = data.casier_judiciaire; + document.getElementById('document-casier-judiciaire').textContent = data.casier_judiciaire || "Aucun casier judiciaire"; + + document.getElementById("document-employe").innerHTML = data.employe || "Employé inconnu"; + + document.getElementById("formations-list").innerHTML = ""; + for (const formation of data.formations) { + document.getElementById("formations-list").innerHTML += ` +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ ` + } + document.getElementById("contrat-employe").innerHTML = data.employe || "Employé inconnu"; + document.getElementById("employeIdInput").value = data.id; + + document.getElementById("contrats-list").innerHTML = ""; + for (const contrat of data.contrats) { + document.getElementById("contrats-list").innerHTML += ` +
+ ` + }; + + const supprimerButtons = document.getElementsByClassName("btn-supprimer-contrat"); + Array.from(supprimerButtons).forEach(button => { + button.addEventListener("click", function() { + const contratId = this.dataset.contratid; + fetch(`contrat/supprimer/`, { + method: "POST", + headers: { + "Content-Type": "application/json", + "X-CSRFToken": document.querySelector('[name=csrfmiddlewaretoken]').value + }, + body: JSON.stringify({ + "id": contratId + }) + }) + .then(response => response.json()) + .then(data => { + alert(data.message); + location.reload(); + }) + }); + }) + + document.getElementById("affectation-nom-employe").textContent = data.employe || "Employé inconnu"; + document.getElementById("affecter_employe_id").value = data.id; + + document.getElementById("affectations-list").innerHTML = ""; + for (const affectation of data.affectations) { + document.getElementById("affectations-list").innerHTML += ` +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+ ` + } + + Array.from(document.getElementsByClassName("btn-supprimer-affectation")).forEach(button => { + button.addEventListener("click", function() { + const affectationId = this.dataset.contratid; + fetch(`affectation/supprimer/`, { + method: "POST", + headers: { + "Content-Type": "application/json", + "X-CSRFToken": document.querySelector('[name=csrfmiddlewaretoken]').value + }, + body: JSON.stringify({ + "id": affectationId + }) + }) + .then(response => response.json()) + .then(data => { + alert(data.message); + location.reload(); + }) + }); + }) + + const modal = new bootstrap.Modal($("modalDetailEmploye")); + modal.show(); +}) + +$("enregistrerDetail").addEventListener("click", function() { + const id_ = document.getElementById('detail-id').value; + const fonction = document.getElementById('detail-fonction').value; + const dateEmbauche = document.getElementById('detail-dateEmbauche').value; + const matricule = document.getElementById('detail-matricule').value; + + const url_enregistrer_detail = $("modalDetailEmployeBody").dataset.url; + fetch(url_enregistrer_detail, { + method: "POST", + headers: { + "Content-Type": "application/json", + "X-CSRFToken": document.querySelector('[name=csrfmiddlewaretoken]').value + }, + body: JSON.stringify({ + "id": id_, + "fonction": fonction, + "date_embauche": dateEmbauche, + "matricule": matricule + }) + }) + .then(response => response.json()) + .then(data => { + alert(data.message); + location.reload(); + }) +}); + +$("input-recherche").addEventListener("input", function() { + const recherche = this.value; + if (recherche){ + tableau_liste_employe.setFilter("employe", "like", recherche); + }else{ + tableau_liste_employe.clearFilter(); + } +}) + +const listeContratExpirant = new Tabulator("#listeContratExpirant", { + columns: [ + {"title": "Employé", "field": "employe"}, + {"title": "Type de contrat", "field": "type_contrat"}, + {"title": "Date de début", "field": "date_debut", formatter: 'datetime', formatterParams:{ + inputFormat:"yyyy-MM-dd", + outputFormat:"dd/MM/yy", + }}, + {"title": "Date de fin", "field": "date_fin", formatter: 'datetime', formatterParams:{ + inputFormat:"yyyy-MM-dd", + outputFormat:"dd/MM/yy", + }}, + {"title": "Statut", "field": "statut"}, + {"title": "Lien du fichier", "field": "fichier_contrat", formatter:"link", formatterParams:{ + target:"_blank", + } + }, + ], + ajaxURL: $("boutonContratExpirants").dataset.urlexpirants, +}) \ No newline at end of file diff --git a/gestion_employe/static/gestion_employe/js/mon_profil.js b/gestion_employe/static/gestion_employe/js/mon_profil.js new file mode 100644 index 0000000..64c77f9 --- /dev/null +++ b/gestion_employe/static/gestion_employe/js/mon_profil.js @@ -0,0 +1,42 @@ +const $ = (element) => document.getElementById(element); + +url_certificat = $("tableau-certificat").dataset.url; +const tableau_certificat = new Tabulator("#tableau-certificat", { + columns: [ + {"title": "Nom du certificat", "field": "titre"}, + {"title": "Nom de l'organisme", "field": "organisme"}, + {"title": "Date d'obtention", "field": "date_obtention", formatter:"datetime", formatterParams:{ + inputFormat:"yyyy-MM-dd", + outputFormat:"dd/MM/yy", + }}, + {"title": "Date de fin de validité", "field": "date_fin", formatter:"datetime", formatterParams:{ + inputFormat:"yyyy-MM-dd", + outputFormat:"dd/MM/yy", + }}, + ], + ajaxURL: url_certificat, +}) + +const enregistrerProfil = $("enregistrerProfil"); +enregistrerProfil.addEventListener("click", (e) => { + const url = $("information-personnelles").dataset.url; + const csrftoken = document.querySelector("[name='csrfmiddlewaretoken']").value; + fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-CSRFToken': csrftoken + }, + body: JSON.stringify({ + "nom": $("nom").value, + "prenom": $("prenom").value, + "email": $("email").value, + "telephone": $("telephone").value, + "adresse": $("adresse").value, + "sexe": $("sexe").value, + "date_naissance": $("date_naissance").value, + }) + }) + .then(response => response.json()) + .then(data => alert(data.message)) +}) \ No newline at end of file diff --git a/gestion_employe/templates/gestion_employe/index.html b/gestion_employe/templates/gestion_employe/index.html new file mode 100644 index 0000000..825dec9 --- /dev/null +++ b/gestion_employe/templates/gestion_employe/index.html @@ -0,0 +1,67 @@ +{% extends "BASE.html" %} +{% load static %} +{% block 'titre_page' %} Gestion des projets {% endblock %} +{% block 'css' %} +{% endblock %} +{% block 'contenu' %} +
+

Gestion des employés

+ {% if messages %} + {% for message in messages %} + + {% endfor %} + {% endif %} + +
+
+ Nombre d'employés +

{{ nombre_employes }}

+
+
+ Nombre de prestataires +

{{ nombre_cps }}

+
+
+ Nombre de stagiaires +

{{ nombre_stage }}

+
+
+
+
+

+ + La liste des employés +

+ +
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+ +{% endblock %} +{% block 'modal' %} + {% include "gestion_employe/parts/modalDetailEmploye.html" %} + {% include "gestion_employe/parts/modalCreationContrat.html" %} + {% include "gestion_employe/parts/modalAffectationProjet.html" %} + {% include "gestion_employe/parts/modalDocument.html" %} + {% include "gestion_employe/parts/modalListeContratExpirants.html" %} +{% endblock %} +{% block 'js' %} + +{% endblock %} \ No newline at end of file diff --git a/gestion_employe/templates/gestion_employe/modifier-profil.html b/gestion_employe/templates/gestion_employe/modifier-profil.html new file mode 100644 index 0000000..c73010e --- /dev/null +++ b/gestion_employe/templates/gestion_employe/modifier-profil.html @@ -0,0 +1,105 @@ +{% extends "BASE.html" %} +{% load static %} +{% block 'titre_page' %} Gestion des employés - Mon profil {% endblock %} +{% block 'contenu' %} +
+
+
+ Modifier mon profil +
+
+
+
+ {% csrf_token %} +
+
+

+ +

+
+
+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+
+

+ +

+
+
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+
+
+
+
+ + Annuler + + +
+
+
+
+{% endblock %} +{% block 'modal' %} +{% endblock %} +{% block 'js' %} +{% endblock %} \ No newline at end of file diff --git a/gestion_employe/templates/gestion_employe/monprofil.html b/gestion_employe/templates/gestion_employe/monprofil.html new file mode 100644 index 0000000..410fd7f --- /dev/null +++ b/gestion_employe/templates/gestion_employe/monprofil.html @@ -0,0 +1,229 @@ +{% extends "BASE.html" %} +{% load static %} +{% block 'titre_page' %} Gestion des employés - Mon profil {% endblock %} +{% block 'contenu' %} +
+
+ Les informations de mon profil +
+ +
+{% if messages %} + {% for message in messages %} + + {% endfor %} +{% endif %} + + +{% if expiration_contrat %} + {% if contrat_nb_jours_restant %} +
+ Important : Votre contrat de travail expire dans {{ contrat_nb_jours_restant }} jours, veuillez contacter les ressources humaines. +
+ {% endif %} +{% else %} +
+ Important : Les informations sur votre contrat n'ont pas été renseignées, veuillez contacter les ressources humaines. +
+{% endif %} + +
+
+

+ +

+
+
+
+ {% csrf_token %} +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ +
+
+
+
+

+ +

+
+
+ {% for contrat in contrats %} +
+
+ + +
+ + +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + Voir le contrat +
+
+ {% empty %} +

Aucun contrat trouvé.

+ {% endfor %} +
+
+
+
+

+ +

+
+
+
    + {% for projet in projets %} +
  • + {{ projet.nom_projet }} ({{ projet.pourcentage_temps_affectation }}%) du {{ projet.date_debut|date:"d/m/Y" }} au + {{ projet.date_fin|date:"d/m/Y" }} en tant que {{ projet.role }}. +
  • + {% empty %} +
  • Vous n'êtes affecté à aucun projet.
  • + {% endfor %} +
+
+
+
+
+

+ +

+
+
+
+ {% csrf_token %} +
+
+
+ + {% if employe.CV %} + Fichier actuel : {{employe.CV}} + {% endif %} + +
+
+ + {% if employe.diplome %} + Fichier actuel : {{employe.diplome}} + {% endif %} + +
+
+
+
+ + {% if employe.casier_judiciaire %} + Fichier actuel : {{employe.casier_judiciaire}} + {% endif %} + +
+
+ + {% if employe.rib %} + Fichier actuel : {{employe.rib}} + {% endif %} + +
+
+
+ +
+
+
+
+
+

+ +

+
+
+
+ +
+
+
+
+{% endblock %} +{% block 'modal' %} + {% include "gestion_employe/parts/modificationMotPasse.html" %} + {% include "gestion_employe/parts/modalAjoutFormation.html" %} +{% endblock %} +{% block 'js' %} + + +{% endblock %} diff --git a/gestion_employe/templates/gestion_employe/parts/modalAffectationProjet.html b/gestion_employe/templates/gestion_employe/parts/modalAffectationProjet.html new file mode 100644 index 0000000..2abcf46 --- /dev/null +++ b/gestion_employe/templates/gestion_employe/parts/modalAffectationProjet.html @@ -0,0 +1,28 @@ + \ No newline at end of file diff --git a/gestion_employe/templates/gestion_employe/parts/modalAjoutFormation.html b/gestion_employe/templates/gestion_employe/parts/modalAjoutFormation.html new file mode 100644 index 0000000..104b791 --- /dev/null +++ b/gestion_employe/templates/gestion_employe/parts/modalAjoutFormation.html @@ -0,0 +1,21 @@ + + \ No newline at end of file diff --git a/gestion_employe/templates/gestion_employe/parts/modalCreationContrat.html b/gestion_employe/templates/gestion_employe/parts/modalCreationContrat.html new file mode 100644 index 0000000..fa0bb2b --- /dev/null +++ b/gestion_employe/templates/gestion_employe/parts/modalCreationContrat.html @@ -0,0 +1,57 @@ + + \ No newline at end of file diff --git a/gestion_employe/templates/gestion_employe/parts/modalDetailEmploye.html b/gestion_employe/templates/gestion_employe/parts/modalDetailEmploye.html new file mode 100644 index 0000000..187ef49 --- /dev/null +++ b/gestion_employe/templates/gestion_employe/parts/modalDetailEmploye.html @@ -0,0 +1,136 @@ +{% load tags_personnaliser %} + \ No newline at end of file diff --git a/gestion_employe/templates/gestion_employe/parts/modalDocument.html b/gestion_employe/templates/gestion_employe/parts/modalDocument.html new file mode 100644 index 0000000..4eeb124 --- /dev/null +++ b/gestion_employe/templates/gestion_employe/parts/modalDocument.html @@ -0,0 +1,41 @@ + diff --git a/gestion_employe/templates/gestion_employe/parts/modalListeContratExpirants.html b/gestion_employe/templates/gestion_employe/parts/modalListeContratExpirants.html new file mode 100644 index 0000000..9051355 --- /dev/null +++ b/gestion_employe/templates/gestion_employe/parts/modalListeContratExpirants.html @@ -0,0 +1,17 @@ + + \ No newline at end of file diff --git a/gestion_employe/templates/gestion_employe/parts/modificationMotPasse.html b/gestion_employe/templates/gestion_employe/parts/modificationMotPasse.html new file mode 100644 index 0000000..79366ba --- /dev/null +++ b/gestion_employe/templates/gestion_employe/parts/modificationMotPasse.html @@ -0,0 +1,36 @@ + + diff --git a/gestion_employe/templatetags/__pycache__/tags_personnaliser.cpython-310.pyc b/gestion_employe/templatetags/__pycache__/tags_personnaliser.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3c65f8062d25b96c2e076f7f053e0082f503ee0 GIT binary patch literal 1120 zcma)4O>fgM7`B}(P1A0N9rzLl-=`a4EfRP}J&JvA65$0XK!-LQ06COov)Zt+p^?3Ib z#ZmJOXkRB|Lo1<;D$AshX1#(?HJTQ}&{|BZBB{aS2T4;;L|MyBrb#VTIf$ZTK_Qw* zp=qiB0+@1l?LRpiT4|Mwnig`sqU%LeBy=o{V+S5u93*MF{tAx+XH!d12U;3!XwqCz zF0*XC((oprRRZ@0(N9PS#n^^7!dqWX#ic3*_`Qc&CepgqpAvWYdO6=!`xt(+4`z;X zl;b((_zEw`5<$I4a|FN}coS+ME~$~UDYtdeq^c6VDZ_fH`v1fx8Ha5s)Q44JYaUo4@Vq*QqKpeF=bEj8G_u%ng$HR%5ilI?j6vNYJubvLC z>&0BB)JzO-GIu=~I>WY_EA*h6+3qAUtmWPXPUCXl_q6j<4CZFJ{Sf}PCWqi$?$uC} zoXk<}E&L@~>?~mlugFLI7L`380UFHiV&uMeh?7%vj^;S;aPK|%v3~-Y-M-ezm`ibE zU4r%=hu*SGmW(HVo5a|-7Ef$1orsKWh9wTQ4`OUbo#oI=W4*DcwQHXBN_B31M`Zht zlrSf%e(XwWeXR-+6Ww*EdRzQ$RX3*Zusvzm)?028i~|U{kN0qZ$?u5hJFsyQ_icwU zu2RNq!1JUWEA1*~`!67cCYSJRp5>zGCN$Ij#jpVh~yPKI^ z90wZILTP*IHAf$-KO^YUOTmf@f}v>x{Rf;Xh0;^s>}n%nQs}_G`OSMX@4flGH+yCA zY!1Qrrt`b=iGt7{Vv!Dc3MP*M^icza=nK@4wxyaJ$|Zs2ZKbA$YK)cbOic^561pqb z7gHCrc@4cgU4+@Y+4|cvONtum%4|>WKlWti_TYwAM#e()GkCaTb(tOz%6!kWT!#$@ zu=FFUyM*Z>*$Z4N1k}E4Md1$dLZ{={R_OR%C6~KFbXe^;gzB~rCNS%5aqNHkjP!u| zyCl?IXE@M@hdI~MyMzhv;74~aTedy?5rTuyD0Cn@$R(mox1tAn+v#+M0}3(08dz|y zk~1WpO>>U1vqv8K9s!K2oer_XICVQMkYG@S4+^MGngIH!iRwaoYSdxJ>Cu!L(x#MX z>zUJ5^r|F4wH$o__9mnY^pS@;bM(lYzmjeRfkhJrhlj%0rG69;odv^z4TtVWqyo24 zJ!_8`3fE#Y<66gYLqfSm9ylyyhRoH7!8#Y)O|hGa%U-&~>o=~qJ_j3X)#|OAg!Mu{ zXx-j!)Dkh}-4qq~4@fJeQPi>}ggMtFgjRwBerCsFW*mr~g&5*v?||r|6Ak6x{9)_+ ztuZc+aPjc^5iTC%${1fA;j71Z^GMyCz(!P$98vw8NG>UgG2QTomrXmc7bknTvYdy@_MS`DEx(&ux`r+#L$hT4$j1yn*s zc>iVOpe?0{9LZ3iQY%xcO;eOCk)mMyd>h)_>^Pp;wq{Lhn%$6m%(1;gI%e{2j4T!1 z%NP86yU^Q=D_s&&!68>Xf1j(u5zpWB3A^QoABh&>D)n7r$W;8jIG*#L^odTzHTa^# z%(+1HJSfGVhdCgizN(U0{uYIN9y|DFEg>OJi_IdNXjhpH_n|XF#p3u$git% zbqPILTCT1uPp(KHZy9;MV47{;HchUzcP+2$Q&BOVPZkyNvtS7kg;R}P+4I{3j0tg{ zI`^nW4|tZ6F0ex=6/", + views.modifier_formation, + name="modifier_formation" + ), + path( + "mes-formations/supprimer//", + views.supprimer_formation, + name="supprimer_formation" + ), + path( + 'modifier-mot-passe/', + views.modifier_mot_passe, + name='modifier-mot-passe' + ), + # path( + # 'creation-departement/', + # views.creation_departement, + # name='creation-departement' + # ), + # path( + # 'modifier-departement/', + # views.modifier_departement, + # name='modifier-departement' + # ), + # path( + # 'suppression-departement/', + # views.supprimer_departement, + # name='suppression-departement/' + # ), + path( + "liste-contrat-expirants", + views.liste_contrat_expirants, + name='liste-contrat-expirants' + ) +] \ No newline at end of file diff --git a/gestion_employe/views.py b/gestion_employe/views.py new file mode 100644 index 0000000..4740abf --- /dev/null +++ b/gestion_employe/views.py @@ -0,0 +1,447 @@ +import json +from datetime import timedelta, datetime +from dateutil.relativedelta import relativedelta + +from django.utils import timezone +from django.contrib import messages +from django.contrib.auth.models import User +from django.contrib.auth import authenticate +from django.shortcuts import render, redirect +from django.contrib.auth.decorators import login_required + +from django.http import JsonResponse +from django.forms.models import model_to_dict +from django.db.models import Sum + +from .models import Employe, Contrat, Affectation, Formation +from .forms import AffectationForm, ContratForm, FormationForm +from fonction_utilitaire import fonctions_utilitaire + +@login_required +def index(request): + """Vue d'index""" + employes = Employe.objects.all().order_by('-user__date_joined') + nombre_employes = Employe.objects.count() + nombre_cps = Contrat.objects.filter(type_contrat='contrat_prestation').count() + nombre_stage = Contrat.objects.filter(type_contrat='contrat_stage').count() + date_limite = timezone.now().date() + timedelta(days=60) + nombre_expirants = Contrat.objects.filter( + date_fin__lte=date_limite, + date_fin__gte=timezone.now().date(), + statut='actif' + ).count() + + return render(request, 'gestion_employe/index.html', { + 'employes': employes, + 'nombre_employes': nombre_employes, + 'nombre_cps': nombre_cps, + 'nombre_stage': nombre_stage, + 'nombre_expirants': nombre_expirants, + 'affectation_form': AffectationForm(), + 'contrat_form': ContratForm() + }) + +@login_required +def liste_contrat_expirants(request): + """ Liste des contrats proches """ + + date_limite = timezone.now().date() + timedelta(days = fonctions_utilitaire.DUREE_FIN_CONTRAT) + contats_expirants = [ + { + 'employe': f"{contrat.employe.user.first_name} {contrat.employe.user.last_name}", + 'type_contrat': dict(Contrat.TYPE_CONTRAT).get(contrat.type_contrat), + 'date_debut': contrat.date_debut, + 'date_fin': contrat.date_fin, + 'statut': contrat.statut, + 'fichier_contrat': contrat.fichier_contrat.url if contrat.fichier_contrat else "" + } + for contrat in + Contrat.objects.filter(date_fin__lte=date_limite, date_fin__gte=timezone.now().date(), statut='actif') + ] + + return JsonResponse(contats_expirants, safe=False) + +@login_required +def affecter_employe_projet(request): + """Vue pour affecter un employé à un projet avec vérification des contraintes d'affectation""" + if request.method == 'POST': + employe_id = request.POST.get('affecter_employe_id') + try: + employe = Employe.objects.get(id=employe_id) + except Employe.DoesNotExist: + messages.error(request, "L'employé spécifié n'existe pas.") + return redirect('gestion_employe:index') + + form = AffectationForm(request.POST) + if form.is_valid(): + projet = form.cleaned_data['projet'] + date_fin_affectation = form.cleaned_data['date_fin_daffectation'] + temps_nouveau = form.cleaned_data['pourcentage_temps_affectation'] + date_affectation = form.cleaned_data['date_affectation'] + + if (date_fin_affectation and date_affectation): + total_affectation = ( + Affectation.objects.filter(employe=employe) + .aggregate(total_pourcentage_affectation = Sum('pourcentage_temps_affectation')) + ['total_pourcentage_affectation'] or 0 + ) + if (date_fin_affectation < date_affectation): + messages.warning(request, "La date de fin d'affectation ne peut pas être antérieure à la date de début.") + return redirect('gestion_employe:index') + elif date_fin_affectation > projet.date_fin: + messages.warning(request, f"La date de fin de l'affectation ({date_fin_affectation}) ne peut pas dépasser la date de fin du projet ({projet.date_fin}).") + return redirect('gestion_employe:index') + elif total_affectation + temps_nouveau > 100: + messages.warning( + request, + f"Les pourcentages d'affectation de l'employé {employe.first_name} {employe.last_name} dépasse 100% sur les différents projets ({total_affectation + temps_nouveau}%)." + ) + return redirect('gestion_employe:index') + + Affectation.objects.update_or_create( + employe=employe, + projet=projet, + defaults={ + 'date_affectation': form.cleaned_data['date_affectation'], + 'date_fin_daffectation': date_fin_affectation, + 'role': form.cleaned_data['role'], + 'pourcentage_temps_affectation': temps_nouveau, + } + ) + messages.success(request, f"L'employé {employe.user.first_name} {employe.user.last_name} a été affecté au projet {projet.nom_projet}.") + return redirect('gestion_employe:index') + else: + messages.error(request, "Erreur : Formulaire non valide.") + return redirect('gestion_employe:index') + else: + return redirect('gestion_employe:index') + +@login_required +def mon_profil(request): + """Vue pour afficher et modifier le profil de l'utilisateur connecté""" + try: + employe = Employe.objects.get(user__username=request.user) + except Employe.DoesNotExist: + messages.error(request, "Impossible d'acceder au menu 'Mon profil' car votre profil Utilisateur n'est lié à aucun profil Employé. Veuillez contacter l'Administrateur.") + return redirect("gestion_conges:conge") + + contrats = Contrat.objects.filter(employe=employe, statut='actif').first() + projets = Affectation.objects.filter( + employe = employe, + date_fin_daffectation__gte = timezone.now().date() + ).select_related('projet') + + return render( + request, + 'gestion_employe/monprofil.html', + { + 'employe': employe, + 'contrats': [{ + **model_to_dict(contrats), + "type_contrat": dict(Contrat.TYPE_CONTRAT).get(contrats.type_contrat), + "statut": dict(Contrat.STATUT_CONTRAT).get(contrats.statut), + "fichier_contrat": contrats.fichier_contrat.url if contrats.fichier_contrat else "", + } if contrats else []], + 'projets': [ + { + **model_to_dict(a.projet), + "date_affectation": a.date_affectation, + "date_fin_daffectation": a.date_fin_daffectation, + "role": dict(Affectation.ROLE_CHOICES).get(a.role), + "pourcentage_temps_affectation": a.pourcentage_temps_affectation + } for a in projets + ], + "formation_form": FormationForm(), + "expiration_contrat": contrats.nombre_jours_restant <= fonctions_utilitaire.DUREE_FIN_CONTRAT if contrats else False, + "contrat_nb_jours_restant": contrats.nombre_jours_restant if contrats else None + } + ) + +@login_required +def modifier_mot_passe(request): + """Vue pour permettre à un utilisateur de modifier son mot de passe et ses informations de profil""" + user = User.objects.get(username=request.user) + if request.method == "POST": + ancien_mdp = request.POST["ancien-mdp"] + nouveau_mdp = request.POST["nouveau-mdp"] + confirmation_mdp = request.POST["confirmation-mdp"] + + if authenticate(request, username=request.user, password=ancien_mdp) is None: + messages.error(request, "Ancien mot de passe incorrect.") + elif nouveau_mdp != confirmation_mdp: + messages.error(request, "Les deux nouveaux ne correspondent pas.") + else: + user.set_password(nouveau_mdp) + user.save() + messages.success(request, "Mot de passe modifié avec succès.") + + return redirect("gestion_employe:mon-profil") + +def modifier_employer(request): + """Vue pour permettre à un utilisateur de modifier les informations d'un employé""" + try: + employe = Employe.objects.get(user__username=request.user) + except Employe.DoesNotExist: + return JsonResponse({"message": "Employé non trouvé."}) + if request.method == "POST": + data = json.loads(request.body) + user = User.objects.get(username=request.user) + user.last_name = data['nom'] + user.first_name = data['prenom'] + user.email = data['email'] + employe.telephone = data['telephone'] + employe.adresse = data['adresse'] + employe.sexe = data['sexe'] + + if data['date_naissance']: + difference = relativedelta(timezone.now().date(), datetime.strptime(data['date_naissance'], "%Y-%m-%d").date()) + if difference.years >= 18: + employe.date_naissance = data['date_naissance'] + else: + return JsonResponse({"message": "Veuillez entrez une date de naissance correcte."}) + employe.save() + user.save() + + return JsonResponse({"message": "Profil mis à jour avec succès."}) + +def enregistrement_document(request): + employe = Employe.objects.get(user__username=request.user) + if request.method == "POST": + employe.CV = request.FILES["cv"] if 'cv' in request.FILES else employe.CV + employe.diplome = request.FILES["diplome"] if 'diplome' in request.FILES else employe.diplome + employe.rib = request.FILES["rib"] if 'rib' in request.FILES else employe.rib + employe.casier_judiciaire = request.FILES["casier_judiciaire"] if 'casier_judiciaire' in request.FILES else employe.casier_judiciaire + messages.success(request, "Documents enregistrés avec succès.") + employe.save() + + return redirect("gestion_employe:mon-profil") + +def suppression_contrat(request): + """Vue pour permettre à un utilisateur de supprimer un contrat""" + id_contrat = json.loads(request.body)['id'] + try: + contrat = Contrat.objects.get(numero_contrat = id_contrat) + except Contrat.DoesNotExist: + messages.error(request, "Contrat non trouvé.") + return JsonResponse({"message": "Contrat non trouvé."}, status=404) + + contrat.delete() + return JsonResponse({"message": "Contrat supprimé avec succès."}) + +def suppression_affectation(request): + """Vue pour permettre à un utilisateur de supprimer une affectation""" + id_affectation = json.loads(request.body)['id'] + try: + affectation = Affectation.objects.get(id=id_affectation) + except Affectation.DoesNotExist: + return JsonResponse({"message": "Affectation non trouvée."}, status=404) + + affectation.delete() + return JsonResponse({"message": "Affectation supprimée avec succès."}) + +def creation_contrat(request): + """Vue pour permettre à un utilisateur de créer un contrat pour un employé""" + try: + employe = Employe.objects.get(id=request.POST.get('employe_id')) + except Employe.DoesNotExist: + messages.error(request, "Employé non trouvé.") + return redirect('employe-index') + + if request.method == "POST": + form = ContratForm(request.POST, request.FILES) + if form.is_valid(): + contrat = form.save(commit=False) + contrat.employe = employe + contrat.save() + messages.success(request, "Contrat créé avec succès.") + return redirect('gestion_employe:index') + messages.error(request, "Formulaire non valide") + else: + form = ContratForm(initial={'employe': employe}) + return render(request, 'gestion_employe/index.html', {'contrat_form': form}) + +@login_required +def enregistrer_detail_employe(request): + """Vue pour permettre à un utilisateur de modifier les détails d'un employé via une requête AJAX""" + if request.method == "POST": + data = json.loads(request.body) + try: + employe = Employe.objects.get(id=data['id']) + except Employe.DoesNotExist: + return JsonResponse({"error": "Employé non trouvé."}, status=404) + + employe.fonction = data['fonction'] + employe.date_embauche = data['date_embauche'] + employe.matricule = data['matricule'] + employe.save() + return JsonResponse({"message": "Détails de l'employé mis à jour avec succès."}) + else: + return JsonResponse({"message": "Méthode non autorisée."}, status=405) + +@login_required +def liste_employe(request): + """ Vue pour retourner la liste de tous les employés """ + employes = Employe.objects.exclude(user__first_name = '', user__last_name = '') + + data = [] + for employe in employes: + if employe.user.first_name == ' ' and employe.user.last_name == ' ': + projets = [ + ", ".join([ + a.projet.nom_projet for a in Affectation.objects.filter( + employe=employe, + date_fin_daffectation__gte=timezone.now().date() + ) + ]) + ] + formations = [ + { + "titre": formation.titre, + "organisme": formation.organisme, + "description": formation.description, + "date_obtention": formation.date_obtention, + "date_fin": formation.date_fin, + "certificat": formation.certificat.url if formation.certificat else "", + } for formation in Formation.objects.filter(employe=employe) + ] + + contrats = [ + { + "numero_contrat": contrat.numero_contrat, + "type_contrat": contrat.type_contrat, + "date_debut": contrat.date_debut, + "date_fin": contrat.date_fin, + "salaire_mensuel": contrat.salaire_mensuel, + "statut": contrat.statut, + "fichier_contrat": contrat.fichier_contrat.url if contrat.fichier_contrat else "", + } for contrat in Contrat.objects.filter(employe=employe, statut='actif') + ] + + affectations = [ + {**model_to_dict(affectation), "projet": affectation.projet.nom_projet} + for affectation in Affectation.objects.filter( + employe=employe, + date_fin_daffectation__gte=timezone.now().date() + ) + ] + + data.append( + { + "id": employe.id, + "employe": f"{employe.user.first_name} {employe.user.last_name}", + "matricule": employe.matricule, + "email": employe.user.email, + "formations": formations, + "affectations": affectations, + "projet": projets, + "contrats": contrats, + "departement": employe.departement.nom if employe.departement else "", + "fonction": employe.fonction, + "date_embauche": employe.date_embauche, + "adresse": employe.adresse, + "telephone": employe.telephone, + "sexe": employe.sexe, + "CV": employe.CV.url if employe.CV else "", + "diplome": employe.diplome.url if employe.diplome else "", + "rib": employe.rib.url if employe.rib else "", + "photo": employe.photo.url if employe.photo else "", + "casier_judiciaire": employe.casier_judiciaire.url if employe.casier_judiciaire else "", + "date_naissance": employe.date_naissance, + } + ) + return JsonResponse({'success': True, 'data': data}, safe=False) + +@login_required +def ajouter_formation(request): + """Vue pour permettre à un employé d'ajouter une formation à son profil""" + employe = Employe.objects.get(user__username=request.user) + if request.method == "POST": + formation = FormationForm(request.POST, request.FILES) + if formation.is_valid(): + ma_formation = formation.save(commit=False) + ma_formation.employe = employe + ma_formation.save() + messages.success(request, "Formation ajoutée avec succès ") + return redirect("gestion_employe:mon-profil") + messages.error(request, "Formulaire non valide. Veuillez vérifier les informations saisies.") + return redirect("gestion_employe:mon-profil") + +def liste_formation(request): + formations = Formation.objects.filter(employe__user__username=request.user).order_by("-date_obtention") + return JsonResponse([ + { + **model_to_dict(formation), + "certificat": formation.certificat.url if formation.certificat else "" + } + for formation in formations + ], safe=False) + +@login_required +def modifier_formation(request, id_formation): + """Vue pour permettre à un employé de modifier une formation de son profil""" + try: + formation = Formation.objects.get(id=id_formation, employes=request.user) + except Formation.DoesNotExist: + messages.error(request, "Formation non trouvée.") + return redirect("mes_formations") + + if request.method == "POST": + formation = FormationForm(request.POST, request.FILES, instance=formation) + if formation.is_valid(): + messages.success(request, "Formation mise à jour ") + + formation.save() + messages.error(request, "Formulaire non valide. Veuillez vérifier les informations saisies.") + return redirect("mes_formations") + +@login_required +def supprimer_formation(request, id_formation): + """Vue pour permettre à un employé de supprimer une formation de son profil""" + try: + formation = Formation.objects.get(id=id_formation, employes=request.user) + except Formation.DoesNotExist: + messages.error(request, "Formation non trouvée.") + return redirect("mes_formations") + + if request.method == "POST": + formation.delete() + messages.success(request, "Formation supprimée ") + return redirect("mes_formations") + +# @login_required +# def creation_departement(request): +# """Gère la création d'un nouveau département via un formulaire.""" +# if request.method == 'POST': +# form_departement = DepartementForm(request.POST) +# if form_departement.is_valid(): +# form_departement.save() +# messages.success(request, "Département ajouté avec succès.") +# else: +# messages.error(request, "Erreur lors de l'ajout du département.") +# return redirect('parametres-rh') + +# @login_required +# def modifier_departement(request, id): +# """Gère la modification d'un département existant via un formulaire pré-rempli.""" +# departement = Departement.objects.get(id=id) +# form = DepartementForm(instance=departement) +# if request.method == 'POST': +# nouveau_nom_departement = request.POST.get('nom') +# if nouveau_nom_departement: +# departement.nom = nouveau_nom_departement +# departement.save() +# messages.success(request, "Département modifié avec succès.") +# return redirect('parametres-rh') +# return render(request, 'gestion_employe/edit_departement.html', { +# 'form': form, +# 'departement': departement +# }) + +# @login_required +# def supprimer_departement(request, id): +# """Gère la suppression d'un département existant.""" +# if request.method == "POST": +# departement = Departement.objects.get(id=id) +# departement.delete() +# messages.success(request, "Département supprimé avec succès !") +# return redirect('parametres-rh') \ No newline at end of file diff --git a/gestion_projet/__init__.py b/gestion_projet/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/gestion_projet/__pycache__/__init__.cpython-310.pyc b/gestion_projet/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84f50b35f084ef8afddf2b976fb90e619f2fd8d9 GIT binary patch literal 136 zcmd1j<>g`kf+vhjnIQTxh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o2B-KO;XkRlhjD zC^bhv*fYpOKRva$Br`uRzMv>SE44&FK0Y%qvm`!Vub}c4hfQvNN@-529mtSkCLqDW F008Gp98&-Q literal 0 HcmV?d00001 diff --git a/gestion_projet/__pycache__/__init__.cpython-313.pyc b/gestion_projet/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ef0681bca00578572cd8929aa29b3f2406e9d7f GIT binary patch literal 159 zcmey&%ge<81Xn*ZW`gL)AOZ#$p^VQgK*m&tbOudEzm*I{OhDdekkl*7s2G>j;_Q#%>2Cgf};Ga)RLI^_{_Y_lK6PN ig34PQHo5sJr8%i~MXW&MK-Lw57$2D#85xV1fh+(j?Izm* literal 0 HcmV?d00001 diff --git a/gestion_projet/__pycache__/__init__.cpython-314.pyc b/gestion_projet/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..191e40ae6f5d3bb11492c1494aeaaf186ff903c6 GIT binary patch literal 155 zcmdPq_I|p@<2{{|u76W#McU6Iz^F zR2<_G5aW_soL!P%5EJYfuVOSyc>Td}3x~WGrF^vH(~{BX9r! literal 0 HcmV?d00001 diff --git a/gestion_projet/__pycache__/admin.cpython-310.pyc b/gestion_projet/__pycache__/admin.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..723bcbb0b4d6e282a4ba271a4e0b100623313f4a GIT binary patch literal 441 zcmYjNy-ve05cW?}qLL!S!~-yprJ0Zz5Gqn7V4y?0WwAniYE${A*y+%@JP3?D18)+E ziK(x^#5qBtC*9|}^LOXZX9t5mLA$#6sy^}j4#}a#n2gZ literal 0 HcmV?d00001 diff --git a/gestion_projet/__pycache__/admin.cpython-313.pyc b/gestion_projet/__pycache__/admin.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4673092350f3e7f4414e19072de707a50bae732f GIT binary patch literal 203 zcmey&%ge<81Xmt@$Z!JEk3k$5V1hC}3ji5Y8G;#t8NC_27>gJc7}A+EnO}mWH5qTQ zCZ^5NS z1;2uy!7rhB5EcRjPu|4!1NdfkO9%G7_j`YT@9pF6jSk@3-(AVCsDC+d`J%?CG#Y0x z0Y*kJB$jN!gs@-~45_7CFeXRs%aSX-4P)9THSWPSFnR}Ah`D~=Ri3l@w8s6$Z7FN* zKpg#cI3{H)o#nDXV|}3VR2E_&n3%p38oy~%<5e>cs=El!U<{Tpu)!q6j?{*X*cJ=0 zbErd1_yUL6lNKtEqq5C;k>-N)vcq|4aS~=yZwOYPeT46ZX?u?bASMEQ5lDsxTn`C&D41_tcYLUDev0*Ld!dR&a zzR>De*u*crw>b4&y>O(>H54D=;?}(nFLW1eA34Mgy0hc7n5(_1D%^DKj#@^zipY#l zD%)Djk+9HZ=cRK$b7%GZ>P~B}qJ2b=q_s9fB8cRAuD*Wf=3r5`m}kz`R(Sz eA7tlWK*;^iy`LNL_l>v$1Qmr~_pfvNuKxk0u8wyA literal 0 HcmV?d00001 diff --git a/gestion_projet/__pycache__/apps.cpython-310.pyc b/gestion_projet/__pycache__/apps.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11b794a66b91a8ecf938f7096595ca33677b7403 GIT binary patch literal 453 zcmY*VJ5R$f5I)B#3Vkp@S0vUf$sa&f3y8;3A-ZL;LeB}Qk~qZ404w|z27VBWS0-jQ zCeBGE%1QV6p5L8MO(sJi`S@np8@->_*%g1xg9hGZy?@-&*bnr6^A5?!pgfd?-0SQlIR+>EyWvbD8iN80MY;k`AYnDI{gU(DY*& C2y*rS literal 0 HcmV?d00001 diff --git a/gestion_projet/__pycache__/apps.cpython-313.pyc b/gestion_projet/__pycache__/apps.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e5fe7623cd86c05a48cf28168a5d10ec6c84a4b3 GIT binary patch literal 538 zcmY*WOG_L<5bmCt-E7p2iJJuD1Jr{sm%RyLk-(_rp(4S?i!>CY(>t_|(_?kdA-M+f z4}|=I9P)2+2}nauIe80Aa!>cpdPp6rzT&H|s7KT9&k$!n8Y;iK_{%5v)|rB4(}5ep z2%`sNpCVl&i)4eaV2QAh)2*msvD-PTcPLMK! z0izhQ03#M+heg=UJ8{)$AfIb2ZG)hF2;Rg&yw6JgJR( zEk%*pM|mrRYNGr`j^YQl2T-P00>I7yI8|MEJO^-Hr^S?+2N+A#rjVs5m7^CjF;45k zKfd29m=eN~;=RT9$7caj@&u?d!Kkeb;d;Ta6?dMDT&0jY!09by(fpk#pT$li5Nm3-LGj2Q2(I zmJ+bi#!fh~Ho2UIDZcrJneSs}vNAN-N6h=6o_I3x-6nsp(jl#7L+;2KVf291DAENo zK^6(~rU>&->8kJg&||?82`isA4XN(kDvF&vtBb~kYj8+ANo(GaJ90{pGJ@V&fIg!b zFb^xt$1dlk$M(5Gk!MFTZ*p{Yw{uA|&Kh|&Ij>&j2~SmZTQs&x%=ZLO6Ft;$8YtSL zXL1;J>mGnCzTyD755TC()bas<>oQI|m0^IokP1_g@hmsx(S+CIGDV1uxv5$Az&7g% z0EID%3y2Y=I4_Ya0NHJJYS{(#>dty}qPSF1?I_yi>JsxJIzC`E2meQm;-XO1;zrt& zw;?b@4H|eLuhVNU!Q^ZI%>Aw${;MB`zV7dw!HT8*1ShvMxW*B~bkBy{c2ka;)LvhW X8~E}mrEg^MyUU}qkKqq7p{@D_R_2S1 literal 0 HcmV?d00001 diff --git a/gestion_projet/__pycache__/forms.cpython-310.pyc b/gestion_projet/__pycache__/forms.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..133fdc6b85d083fd117c7399bce1dd94089af562 GIT binary patch literal 4554 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 J14-J${{j?bS+D>A literal 0 HcmV?d00001 diff --git a/gestion_projet/__pycache__/forms.cpython-314.pyc b/gestion_projet/__pycache__/forms.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee43e1d1e106de0b0c5f5a6cea4fb4abb4fd6085 GIT binary patch literal 6947 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 b?Avt4^8XGqXX3VLTA!ZB_YTr4vv>as{KZ-t literal 0 HcmV?d00001 diff --git a/gestion_projet/__pycache__/models.cpython-313.pyc b/gestion_projet/__pycache__/models.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..495a805d0b98eba084c7abf3be36d35f795990e5 GIT binary patch literal 21228 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 Wo8K$zdLR|*dLdEjckvScg8vUZ@5!wI literal 0 HcmV?d00001 diff --git a/gestion_projet/__pycache__/models.cpython-314.pyc b/gestion_projet/__pycache__/models.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09c9670fb535ecb28ace57136bf532c4229ec959 GIT binary patch literal 11385 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 a%&I_f`-k?JE%DZ+JGtAr{}xbWyZ?VehpR{c literal 0 HcmV?d00001 diff --git a/gestion_projet/__pycache__/urls.cpython-310.pyc b/gestion_projet/__pycache__/urls.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8de164458d3e8cff02466e3bd76debd7c1e1e8dc GIT binary patch literal 2297 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 literal 0 HcmV?d00001 diff --git a/gestion_projet/__pycache__/views.cpython-310.pyc b/gestion_projet/__pycache__/views.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9645f64554902b1b55deef7afe13f69fe029f8b GIT binary patch literal 16282 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 HwzT^Ht88?( literal 0 HcmV?d00001 diff --git a/gestion_projet/__pycache__/views.cpython-313.pyc b/gestion_projet/__pycache__/views.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b5562bde51112242a52547d8d479be5840301ac GIT binary patch literal 41096 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%0A(dMrFattQk;#7IU+t5xgY6VwXF)Os#;(`rp& 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 literal 0 HcmV?d00001 diff --git a/gestion_projet/__pycache__/views.cpython-314.pyc b/gestion_projet/__pycache__/views.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..012a9c3bf2a0f0244e9f34b68fbf9374de138317 GIT binary patch literal 31054 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 literal 0 HcmV?d00001 diff --git a/gestion_projet/admin.py b/gestion_projet/admin.py new file mode 100644 index 0000000..d0ae965 --- /dev/null +++ b/gestion_projet/admin.py @@ -0,0 +1,6 @@ +from django.contrib import admin +from .models import DomaineDeRecherche + +@admin.register(DomaineDeRecherche) +class DomaineDeRecherche(admin.ModelAdmin): + list_display = ('nom',) diff --git a/gestion_projet/forms.py b/gestion_projet/forms.py new file mode 100644 index 0000000..8874d67 --- /dev/null +++ b/gestion_projet/forms.py @@ -0,0 +1,176 @@ +from django import forms +from gestion_projet.models import Projet +from .models import ( + ActiviteProjet, + Bailleur, + DocumentProjet, + FinancementProjet, + LivrablesLivres, + DomaineDeRecherche +) + +class ProjetForm(forms.ModelForm): + """Formulaire de création et de modification d'un projet, avec validation des dates et personnalisation des champs.""" + class Meta: + model = Projet + fields = ( + 'id_projet', + 'nom_projet', + 'date_debut', + 'date_fin', + 'numero_convention', + 'domaine_recherche', + 'type_projet', + 'budget', + 'budget_RH', + 'description' + ) + # domaine_recherche = forms.ModelMultipleChoiceField( + # queryset=DomaineDeRecherche.objects.all(), + # to_field_name="nom", + # required=False + # ) + widgets = { + 'id_projet': forms.TextInput(attrs={'class': "form-control"}), + 'nom_projet': forms.TextInput(attrs={'class': "form-control"}), + 'numero_convention': forms.TextInput(attrs={'class': "form-control"}), + 'domaine_recherche': forms.SelectMultiple(attrs={'class': "form-control"}), + 'type_projet': forms.Select(attrs={'class': "form-select"}), + 'budget': forms.NumberInput(attrs={'class': "form-control"}), + 'budget_RH': forms.NumberInput(attrs={'class': "form-control"}), + 'description': forms.Textarea(attrs={'class': "form-control"}), + 'date_debut': forms.DateInput(attrs={'type': 'date', 'class': "form-control"}), + 'date_fin': forms.DateInput(attrs={'type': 'date', 'class': "form-control"}), + } + +class BailleurForm(forms.ModelForm): + """ + Formulaire de création et de modification d'un bailleur, + avec validation des champs et personnalisation des labels. + """ + class Meta: + model = Bailleur + fields = ('nom_organisme', 'contact', 'email', 'pays') + widgets = { + 'nom_organisme':forms.TextInput(attrs={ + 'class':'form-control', + }), + 'contact':forms.TextInput(attrs={ + 'class':'form-control', + }), + 'email':forms.TextInput(attrs={ + 'class':'form-control', + }), + 'pays':forms.TextInput(attrs={ + 'class':'form-control', + }), + } + +class DocumentProjetForm(forms.ModelForm): + """ + Formulaire pour ajouter ou modifier un document associé à un projet, + avec validation des champs et personnalisation des labels. + """ + class Meta: + model = DocumentProjet + fields = [ + 'nom_document', + 'numero', + 'date_validite', + 'fichier', + 'description' + ] + widgets = { + 'nom_document': forms.Select(attrs={'class': 'form-select'}), + 'description': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}), + 'numero': forms.TextInput(attrs={'class': 'form-control'}), + 'date_validite': forms.DateInput(attrs={'class': 'form-control', 'type': 'date'}), + 'fichier': forms.ClearableFileInput(attrs={'class': 'form-control'}), + } + +class ActiviteProjetForm(forms.ModelForm): + """Formulaire pour créer ou modifier une activité de projet, avec validation des champs et personnalisation des widgets.""" + class Meta: + model = ActiviteProjet + fields = ( + 'titre', + 'date_debut', + 'date_fin', + 'besoin_ressource_materielle', + 'budget_prevu', + 'description', + ) + + widgets = { + 'titre':forms.TextInput(attrs={ + 'class':'form-control', + 'placeholder':'Titre de l’activité' + }), + 'description':forms.Textarea(attrs={ + 'class':'form-control', + 'rows':3, + 'placeholder':'Description de l’activité' + }), + 'date_debut':forms.DateInput(attrs={ + 'class':'form-control', + 'type':'date' + }), + 'date_fin':forms.DateInput(attrs={ + 'class':'form-control', + 'type':'date' + }), + 'besoin_ressource_materielle': forms.Textarea(attrs={ + 'class':'form-control', + 'rows':3, + 'placeholder':'Besoin de ressources matérielles' + }), + 'budget_prevu': forms.NumberInput(attrs={ + 'class':'form-control', + 'placeholder':'Budget prévu' + }), + } + +class FinancementProjetFrom(forms.ModelForm): + """Formulaire pour créer ou modifier le financement relatif à un projet.""" + class Meta: + model = FinancementProjet + fields = ( + 'projet', + 'bailleur', + 'pourcentage', + ) + + widgets = { + 'projet':forms.Select(attrs={ + 'class':'form-select', + }), + 'bailleur':forms.Select(attrs={ + 'class':'form-select', + }), + 'pourcentage':forms.NumberInput(attrs={ + 'class':'form-control', + }), + } + +class LivrablesLivresForm(forms.ModelForm): + """Formulaire pour créer ou modifier un livrable livré dans le cadre d'une activité de projet.""" + class Meta: + model = LivrablesLivres + fields = ( + 'activite', + 'nom', + 'fichier', + ) + + widgets = { + 'activite': forms.Select(attrs={ + 'class':'form-select', + }), + 'nom': forms.TextInput(attrs={ + 'class':'form-control', + 'placeholder':'Nom du livrable' + }), + 'fichier': forms.ClearableFileInput(attrs={ + 'class':'form-control', + }), + } \ No newline at end of file diff --git a/gestion_projet/migrations/0001_initial.py b/gestion_projet/migrations/0001_initial.py new file mode 100644 index 0000000..c85eb6d --- /dev/null +++ b/gestion_projet/migrations/0001_initial.py @@ -0,0 +1,107 @@ +# Generated by Django 5.2.13 on 2026-04-17 12:03 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='ActiviteProjet', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('titre', models.CharField(max_length=200, verbose_name="Titre de l'activité")), + ('description', models.TextField(blank=True, null=True, verbose_name="Description de l'activité")), + ('date_debut', models.DateField(verbose_name='Date de début')), + ('date_fin', models.DateField(verbose_name='Date de fin')), + ('annuler', models.BooleanField(default=False, verbose_name="Annuler l'activité")), + ('motif_annulation', models.TextField(blank=True, null=True, verbose_name="Motif d'annulation")), + ('motif_changement_budget', models.TextField(blank=True, null=True, verbose_name='Motif de changement de budget')), + ('budget_prevu', models.DecimalField(decimal_places=2, default=0, max_digits=15, verbose_name='Budget prévu')), + ('budget_depense', models.DecimalField(decimal_places=2, default=0, max_digits=15, verbose_name='Budget dépensé')), + ('besoin_ressource_materielle', models.TextField(verbose_name='Besoin de ressources matérielles')), + ], + ), + migrations.CreateModel( + name='Bailleur', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('nom_organisme', models.CharField(max_length=200, unique=True)), + ('contact', models.CharField(blank=True, max_length=100, null=True)), + ('email', models.EmailField(blank=True, max_length=254, null=True)), + ('pays', models.CharField(blank=True, max_length=100, null=True)), + ], + ), + migrations.CreateModel( + name='DomaineDeRecherche', + fields=[ + ('nom', models.CharField(choices=[('sciences_sociales', 'Sciences sociales'), ('naturelles', 'Naturelles'), ('humaines', 'Humaines'), ('veterinaires', 'Vétérinaires')], max_length=100, primary_key=True, serialize=False, verbose_name='Domaine de recherche')), + ], + options={ + 'verbose_name': 'Domaine de recherche', + 'verbose_name_plural': 'Domaines de recherche', + }, + ), + migrations.CreateModel( + name='LivrablesLivres', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('nom', models.CharField(max_length=255, verbose_name='Nom du livrable')), + ('fichier', models.FileField(blank=True, null=True, upload_to='fichier_livrables/')), + ('activite', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gestion_projet.activiteprojet')), + ], + ), + migrations.CreateModel( + name='Projet', + fields=[ + ('id_projet', models.CharField(blank=True, max_length=100, primary_key=True, serialize=False, unique=True, verbose_name='ID du projet')), + ('nom_projet', models.CharField(max_length=200, verbose_name='Nom du projet')), + ('date_debut', models.DateField(verbose_name='Date de début')), + ('date_fin', models.DateField(verbose_name='Date de fin')), + ('numero_convention', models.CharField(max_length=100, verbose_name='Numéro de convention')), + ('description', models.TextField(verbose_name='Description')), + ('type_projet', models.CharField(choices=[('laboratoire', 'Laboratoire'), ('épidémiologie', 'Épidémiologie'), ('sciences sociales', 'Sciences sociales'), ('cliniques', 'Cliniques'), ('autre', 'Autre')], default='épidémiologie', max_length=100, verbose_name='Type de projet')), + ('budget', models.DecimalField(decimal_places=2, max_digits=12, verbose_name='Budget')), + ('budget_RH', models.DecimalField(decimal_places=2, max_digits=12, verbose_name='Budget RH')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('bailleur', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='gestion_projet.bailleur', verbose_name='Bailleur de fonds')), + ('domaine_recherche', models.ManyToManyField(to='gestion_projet.domainederecherche')), + ], + ), + migrations.CreateModel( + name='DocumentProjet', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('date_ajout', models.DateTimeField(auto_now_add=True, verbose_name="Date d'ajout")), + ('nom_document', models.CharField(choices=[('protocole', 'Protocole d’étude'), ('ethique', "Approbation du comité d'éthique"), ('autorisation', 'Autorisation (DNLP)'), ('rapport_technique', 'Rapport technique'), ('rapport_financier', 'Rapport financier'), ('rapport_avancement', "Rapport d'avancement"), ('convention', 'Convention'), ('rapport_final', 'Rapport final'), ('autre', 'Autre')], max_length=100, verbose_name='Type de document')), + ('description', models.TextField(blank=True, verbose_name='Description')), + ('numero', models.CharField(blank=True, max_length=100, null=True, verbose_name='Numéro du document')), + ('date_validite', models.DateField(blank=True, null=True, verbose_name='Date de validité')), + ('fichier', models.FileField(upload_to='documents_projets/', verbose_name='Fichier à télécharger')), + ('projet', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='documents', to='gestion_projet.projet', verbose_name='Projet')), + ], + ), + migrations.AddField( + model_name='activiteprojet', + name='projet', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gestion_projet.projet', verbose_name='Projet'), + ), + migrations.CreateModel( + name='FinancementProjet', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('pourcentage', models.DecimalField(decimal_places=2, max_digits=5)), + ('bailleur', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gestion_projet.bailleur')), + ('projet', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gestion_projet.projet')), + ], + options={ + 'unique_together': {('projet', 'bailleur')}, + }, + ), + ] diff --git a/gestion_projet/migrations/__init__.py b/gestion_projet/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/gestion_projet/migrations/__pycache__/0001_initial.cpython-310.pyc b/gestion_projet/migrations/__pycache__/0001_initial.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41f0b831fdb9045729bb9efe89f7af20911a0460 GIT binary patch literal 4309 zcmaJ_%X1t@8Q+!oMVN^3MTq6W@3q3l+!;3Y!*w?Z6%tH;W@@)3FM73REQL;{rLXxKsM5 zxLG1=z0fNiL8h?QvqgR654o54Q5cKzC?Xcb14%piHwWM*zVW|{g#uH%Y}#aP7KepR zhn059WK)qR%(v7zz70$p&?`CSJEwVurF@rpT9DLXfv*2mYjNmR zdTqb7We+VpeV4xXXPdsiUsN{z;JG#_4fI2L-T3xL&^U$NExJK(D4X5{W}0<&W_Bt& zXLe@k$Mlx8e(2F4O&%oAJxL1f(vQ3J zq1sJ(DfiGUJfx!j9PN{ActU&ImT$>?8&)?jP=@~STT#0|=?fd8y*NnxT|Z$Dc(lV3 zVf(Zq?0d^SM>M@OiQEBaUcyK;#@ruye9wKv_Czga-1h=MW1_jsct47n8+s!qN{OFv zcJvQ)lynx$h6KCBy1_M1Z*+K|I+ORr4Olo#ws`|=qCqSkaDObDReBMa^jiUil zmBpWT)(xsVLCH)Ey(H!Gc(JIj<e|@w{?+Egc7uM{W{{ zs;OU=T^X`i)+rKHwv71+L4)v74K!Rf;3#23vTRyQ%_k$0HSaA;gN#J^M68b;^O8KC zY7TXoH<~wVnX_n6bi#DRIJ#66?xMnE_mJ7YmX45+k@V&{B#m0)!v z@cI$1OA#U~8mq@Z&;C@F9%{r#p^W?}h=x8(748qu;CgnJ=Utv;{1pgGuM7fTWqK@X zOOwX~Ta?gdv14gb{_tfmXYCExCXF`^a`6O_X(0K=g2*Ebz;6 zQCu}s_7Cr7HO}kGj;H$mI5^UROMo>b)Z7u6)tbg0e%4lA42}v!Y_Ef`#Oh<}}7?#A50V z*-;6+FgmYZF{S4sdN1w_7;hkcAW!rF%UbWEsJdzs*A;cw#iqEy;JN9#k5ey@6Btkh z9Vfx`6HPVs2@}!B2$FXS(O6P9yZh2yj+eiJXx{RNGJ#j*;6{^zC(Yvqdy<$(85;fA zycMCEywE_)`Vyj{`fWL_jmU~07?Ju)#F;+~-@zTSOgp$3MZ%`OsH$;+?ky@yi|b2^ z%eO^KZnWW#jAV8F_J+Im-s-BDy6=U18XHJ)ugx{RJ>}+q!7mPa$dn`a;55e$KML1g2(NbI_-?wXHd&v2DE| zHU0YF;*-jbKnxGcQ_+s_sM2a3}$LjV8( literal 0 HcmV?d00001 diff --git a/gestion_projet/migrations/__pycache__/0001_initial.cpython-313.pyc b/gestion_projet/migrations/__pycache__/0001_initial.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3a8ad9927b4359163035b5afdf33fd521c2d677 GIT binary patch literal 10691 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 literal 0 HcmV?d00001 diff --git a/gestion_projet/migrations/__pycache__/0002_alter_domainederecherche_options.cpython-310.pyc b/gestion_projet/migrations/__pycache__/0002_alter_domainederecherche_options.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53ae7795d38d6903dca084be7574accbb7d71506 GIT binary patch literal 623 zcmZWnJx{|h5Vf784OKyuuNg5QvXH`z5J*VC07!J}VujwRq;le5w@9$U%0J)_u<~;( zF){HM7=TM!)FMv0li&0C`TS%(Ki^;!xcQd8a>m|EFdIIB14_F=1sHI}GT!B!9WxN% zJu>i+55$Al72tPR6ns!0i@0lKY2PHnROhx=QnL{dIH0s!RFHK!Fgniryz8Mq2ufk_ zA$S&0dlJOfpia`En>+i}jD%b0qb=oSVe|lpuGwz4cVwEU!!%KD33QgEIRYB&U8AAA zUpX3c>wxQ1c6GwqKQvv?yhU@REy_H}&@Im*S*Vdo6gBzPW?dK6OV6Xa3uSdcO4pDw z(=bv<>!y@9qePY6B?2rk2h4jZS|i8>*E&=~G-n!6U5v$CLl-!)@P(NcbyelF6JP5L zW2+6SxN~}W692U#o?0K1DZ4T$rR9G|}=MkmP;64Oi9F6+fM9yjmgw7w(OpzE7Wu+42`P#hUj6>Km`K literal 0 HcmV?d00001 diff --git a/gestion_projet/migrations/__pycache__/0002_alter_domainederecherche_options.cpython-314.pyc b/gestion_projet/migrations/__pycache__/0002_alter_domainederecherche_options.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2dc0098fe3348d341f818cb9c222214c94673700 GIT binary patch literal 808 zcmZWnO>fgc5S_JS$96;MM?!^!M60GqQKb+NQY9!zh#pczL$tun>DGyt;MTFt?gojT zazLE<8(jG%flI5EIC0_@DTOoZI8j=$lE?3@-^_U4?)Ks}2h^f>eg@wVz^|0dmN5n6 zT?Gbk2pH`{9SL+BO0WS~TLY}OP%}46n7<$B85SDOZ9>KPoze=DPA}*(PXuwqJ99Na zeoDp-1qRRpfiMW|&=fkht4QQpMze4^A;an?5Z17cbJ)16VRJ{z_Ekn6=Y@qW)!dQx z!K|xX@#CHsMAWB@cHU8@9$EN6Sv%&GL|%`c7WXp6x=+{Vn$^o1l7xNcg{P&dlwZ+S zG?_~)$$XqlCjANxwYS)%Jf$RI@i7&$P^;DMksu00;Dr@iT4d6n5a|%oi~W8`6)q6+ zzVC%;J;kmQ@-|>xgld8)PCxrJp^;CcPCz+JO_$40LqXX=?9=dN)?YetLZ`0F5+Piu z6X+062o|*af^tIGf=V5y=EqcU1TcBNOcHk**cZ!Hbat_Uf5c{$Z8Rm$%MKo5QU~!^e2| z`eaxPFAUvwM!KV^E eQemVcg#MU-HZIHsWPWkZmdf9k%6~zTN%lV#9^7UC literal 0 HcmV?d00001 diff --git a/gestion_projet/migrations/__pycache__/0002_alter_projet_budget_alter_projet_budget_rh.cpython-314.pyc b/gestion_projet/migrations/__pycache__/0002_alter_projet_budget_alter_projet_budget_rh.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cfd5cf539514a93462f1291f1d169ef6f1ba4d91 GIT binary patch literal 1005 zcmaJ<&u`N(6t>eeZL)5(Wz#^~*bv*HnyAWzgoF^{$AmfrQ!#K$YtqIGE@@J17Xhao z5C=~D8{GHXwM6AKlD0;D}lV%*rx#%Tozst){Z&Bk=G+C*GU9RJZb8f%x+T>`qEBmF{;0{ zQ|4t<{{*&_;4=Z?T5deHKcb{^?xLa?y8-%|Qao>HsiR!8Oe^J@PM({DF18t_1w_h4iJdu^04X04qEBL~=Lhxx_b{Nn!n(thdue)-(6yt-Rn z{ru?b`u8X9Ub%UgGi~R1;=-{+yjOmfCQeV4t#|j?;^fa;6;s-N*NcL<>bDa)6A9Da xv@B`v1%+h(MtVs%*|Kt>`uKt}qYQ-bj|E`m&?-Ueqcbe7{3x#c2FgjQ{{k?X|3Cl$ literal 0 HcmV?d00001 diff --git a/gestion_projet/migrations/__pycache__/0002_documentprojet_dernier_alerte_mail.cpython-310.pyc b/gestion_projet/migrations/__pycache__/0002_documentprojet_dernier_alerte_mail.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e61e26f036e9872b3bd6b721f10cf2688b9a56f7 GIT binary patch literal 652 zcmZuvO=}cE5bckd-Ps|#NQ8LyBFrVTdKQTg{5TlIc$!Po*{WT8?CDwO`Ay#)*l7J2M=vP(Ln^!&Ue4aBpzn;#`PtMryK<=M}$Pq>Vi~tyL%Nkzs zMpS~cw+sZx3kDK-Ex*f3LUPKA^bhs2LioHfn@$g=b-kZ7EuigJp>+RbM2;x>B>}RE z1FHn^4X-37bs7Y4Qcod)lwxuzVR|X4nn6lZnV)_5r$K^?4fa7!ZM(L{!S5}X%je2C zGZ=0C0@~Hspc{78$AFzP*ePwX8&Eac*v}`0^y!(^?yH{yuJvdKpSaOl%IDF8a=Jmv z1x(ilEfh1KshC#E=SorAXp!!FN_`u(4XuFzZqWg{mBGFfsq27r7V>6pEd<^TkMK?InFAk&d{8!{s>+r|G2=2(uRBO@rZ%V)++WFZq3 zwsmB0>#~c39Om{d-xbb_#XQGq2RY$NpJZx2JY?w};i6cp)$U-LP)@^GtVC&dG$08- ziLOS3C6q86#)NT#2O*7L?)thgJ8_uoi$X+t;V9<9NJeoi{cgTAPQn3^K4r}wC2{lx z_~(R;^8m)e#aJeeVj^)7_i`$GAsX#$%e0Bvs*v3`r7^q)SQ0lY&bYjbE)F?ov@_x)!S^`XhGEc)&GhH#?2 zFzKgTQ76|XS7iQ0wdg$eszkzmFjstsU6WM)4IopEraFZ1uLYq0+bTlqlRGX~56jg* IK$5)rA0?ySPXGV_ literal 0 HcmV?d00001 diff --git a/gestion_projet/migrations/__pycache__/0002_domainederecherche_remove_projet_domaine_recherche_and_more.cpython-314.pyc b/gestion_projet/migrations/__pycache__/0002_domainederecherche_remove_projet_domaine_recherche_and_more.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a87a34d49ecaa8e334d4c00455c07b61ff6b8fc0 GIT binary patch literal 1341 zcmZWo&1(}u6rbHqw)twBq^XHi)MCY?l~6yRAR^Y5(u&nE>P3p|>5Aw%mr?3Py4Sj?#)uTSr{Mh^w1A1e&ZUJW`KVQ-N`~LNN+f>toeS zs0$G6Y4AmG6zhu-Uwci(V_=;NY{GR0ZJIcS2PlfIX30aoUDu(-n$oV}~;M zg=(3PR)xC0QjUm}vCAFOVASB$6v+;=+6LPv&*;90yOdc*%Q~PUwMW^O<5FT9Z7MX| zX&>ZAfzO-tJPSg5oikpL7PXsvhmAv#po(~2`nE+|CbYA|oTrqFtm#)qPI}8;duf>L z(ZNiUy7C$j->WimGHK|g2$ef!jY-BmClU2heM0vkdHQ4kky=<-xI!%3;&8U|goqI@ z8zCY=2;8*Y76qIl=(Zq&f?>}?;yZhX#*eiV&B>gJ=+g zb7pPra_SPo3Xtdsek5Kl->5x?j=8n9YHfwO&$!d6JzU3Y{&bRsTKK$bz{gecKdsOf zS>%ZKz#wcEF>Dj~VzkoPXYyrxlLYPunBJnHj^gt}P0j1C?+p_uKG~0*?ZwUxvKN13 zr{3-L3v<1~+}Fsr+3pk4wb^08?PmBOd+NR3FP3`6(&y#wYVELC?`AfKQ7xZ7j_UEm zFdYUeoEv0kkE0rBW1e=p7n>e<+Ci?^&y{+)Qup$M!(8=vECNQSvpN0EU3Mv`^*&tx zxcStun@+{t^1A3X&OeQ0*0(JI60w{9-MGc(K$H*AJpShC3l@T3+yDRo literal 0 HcmV?d00001 diff --git a/gestion_projet/migrations/__pycache__/0002_projet_volets.cpython-313.pyc b/gestion_projet/migrations/__pycache__/0002_projet_volets.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f9e500b8afd053288c57a63348a41b7ba4f0e9dd GIT binary patch literal 1087 zcmZuwPfyf96rZ-+?rvFRDH0J5YzUY%5Os?F(rt%jpxZ7pUH@<} z8l#Dxyzn9T7AAZF@v>wRPoB7~uHJoZ*&yH~GxOf>{h#-y+uyGvSa07K=xZ6FA2HKg z>M_y13&bw6kR`1mCc!PQ$}0*}N@xU4AWIoVR>oGUxt`(4eM3oUmZ?jodK5DcO-bkt zT4zo~!+^Ud$_OR70MPve$1bvyXiT;wrdaZ<#4@&8E&OYc(s2%uLAF{vFRL2=!G_Oc zmO6_p?U7_wWM*JtUhQ13GfBEQzl_$Uj;rYtVh36CqlO%`sFNEGJg=B{BH z(1<#|(2h~h`>GPdh2z7^)5z$vUVNAI-0ABa^n$+9hYtYaS>y)I}$5WUo z?+kL6lE5Xr#6uTi5xz5MorNG;-t{4y?H1u8ztkfESDjV_@zurnI=U5CqX@O;JHeL7 zx*H({*U%y7CH6^Bk2XN6H$sp2IB*(7WRg=|r^NU6pqu?7hZ70LLdO_1TRs80fbn+A z@ndb^1~6Wyj7N|M3Bp+HktPW|D1;Ku;xQ4qMbBG~-HKwP_icxwN^wp#%u&4bYUa$Xz8Z?gcHW?#Y&~L7=_R5 zGT~cM*tE-K+j>yFZ=Y_heKM^!H2L~*$8p-)ndU1N|CHp2XM;b5;{)nwD1Wu1$QQLY zm5z?`L+#wyx7^s_rSZeT%ZJ89+n72qrrO5zfic}S77mPsFXdkd{@4qpgHSoMocU@j z05xt>m5Ziw0A3Psu#;t#pv00n(=Bg=_|2u&=YxY(+TP!z{wM*iN;Tny15eT s+Ry?L2>dA0w!_r7ibnMR{#J2 literal 0 HcmV?d00001 diff --git a/gestion_projet/migrations/__pycache__/0002_remove_activiteprojet_livrables_and_more.cpython-314.pyc b/gestion_projet/migrations/__pycache__/0002_remove_activiteprojet_livrables_and_more.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a430fe5b87eddab9f2fc3a3f52b2579e90eb7636 GIT binary patch literal 2043 zcmb7FPj4GV6rbI-H@l8w$D6-xlEw{V;}ft z#i2pibE40PYc?p4g?su^EC?EK#q}EP^tRW?TCHqf7@C?di9_8QtMlXm^($ULLq|Eq z*C8lhJRlz5v#Dco!}1!Y?NW>Sv|6V={J3mee5Trdy*8>M~MkSvAUb+Y4Jl zlC@~|N+`HUo>O?d;+XC}MBQ>6Uv$Ld_GCUn5qg(6xi}xG);+sQ1Ak0}G}`p-hUp)Y zeR|0Cfcm!S*lim6;A$^RYJ|hp&%<~CFJ;jx*g2%>nBWVZE8O3*Yc>laQ#~>vxX{)k zt1K??^ky&J8;nucYUQLbF-K?{a+s>oKshAS&^2$OJA~xOy;AsN8D(hIuQ7l=vtoenzTPK zrw9oc49_Yt8T0K*i$ThWzX%ZL@I$=*=+ojiQ0$;s*eT{|u+O|^@!1nxh_>s6C|-@? zB9!Dl@xv>S>raXFUqe7l*Mb!JbhUZti;*90f(RbK1N{MYRiv+U6?sy9wb@M|ed0{J zbE4hp%)Hyl%wNP6J<-*|(}fdlp)>PdCo|nKX3vbJ6JzP8>hZ&;rv|(&dH72c{<3A-z7qA2B}){*WyP+a>g>e&bWC%}p^8O+1hRU}D*zjP^g Wp{_{kkBPJKd%uj|`vUhq!=yD594-j0KUb}=*tel z`3nSxuni7bhYFFTqDgHYX5cP3+AKJFgVc;s(bfJ~PqEaU%ssHP-(%O-l-2dy+?9S5 z3T1R7j|HN2RRxd`!oWF4a|jKP!~v;o8+cK^Ok}2!trh+(NHLNjj@HQ4CjOTzgJW)x zZO=h6Plm*t>Hr@9$U}0N!RAHa-W+WI5-7dpJR?>FjsZ1PG*&Uw+-Vsz$ps_X+u{^ZL zqg^J|gXQJrhtv%uO4C{-4v*ls^y zhzpdy>$^eRGJ4~b?)Y5D00j=CIPI|>3q9oRGr{9$Qr643@3mMRo{0nIO2sK>c zNA({KmHu}aD9%E;_kqXrpO_ek4K$x%V1QXA16`Xo4qp!}FsDxQb0_(^v)QGy$y;Z| z+o#2alj6b;fcyK}0ANL5({bC<_w);ZsX)KTWlU?J8%5*eD?UH^L)FeG)7y2!c2xG7 ziAsqwDTlb>^lS-{%0ElBf6f=sCAh>LGy|Ow^2-2XUl;{qe6~&}7Qaj^{seTA>fg;| BB`N>_ literal 0 HcmV?d00001 diff --git a/gestion_projet/migrations/__pycache__/0003_remove_documentprojet_dernier_alerte_mail_and_more.cpython-310.pyc b/gestion_projet/migrations/__pycache__/0003_remove_documentprojet_dernier_alerte_mail_and_more.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0127eb1e2cf2fd2429f5052b7d60ab4cd2b25f03 GIT binary patch literal 985 zcma)5&2H2%5Kf$AH=EssR!EhogoNOL!l7Hi5rkS%@gva+bvfeTu! zt{xd{wDkrFY$8t>xS2cg(9Z*4HufPSy#oPsu$zZ@FOQ&`IS_tvp$E~S2mM1YW0O7% zh<9jun`eA6GuJZImYUBhm1Ax0t*)*<;GoiZfo0t~Ibc-^tau`^s*x9okmlNDjJfd- z5XFxQ1t@u$6lnZLc21c(`$}T1-^2mI`ZAd+dITjZH2qiSM$G2dsr2KcnSkS?LMW*+ zfvxZJC11=A7IiAHOi|y~DixHiK3E)IbrD-Hm7)}TbJV8y^h_mxkj!i157zB*@`!k2 z&jeGMly6Np-Bp4@Q$@);F0st&-Po%_0#&w4CfE@uVJjY(kT>;mZX(X9{<%cb2b}NC z6KUVTT7WYwfwC2-D`o@qx3N(B_{@ee;W|L8EfjNE3yl)fx}h)(rl!-V+AM6^+i`Q- z;v+S~({Va-syjA6D}Hn@2v%$rIS-x8I3QSkp plB-)3!So+xuPf;K*5a%LcfnM5^Z%WnPJ4=}m9Q4oyxbw|7!q#*YB^_M`Za*p2qSFVLBarO-Z5`m!dgckqYZ?uHH7WR>Uh|@3wK%<@ zJ7g)Ro5lGfwU9jE3_`<+;-@5|d9Qd7T0+l)(3h>8`;2DkF-%TVd89lsA<8ENIxx&A z;6*|n593UC0kkDT?lU0^$WL>w%_$wwJcR==Duo_NRqxO~KcWXZvhw!RbcR~}VOB6n zGny1-R%NDL<(5#Y)?IDIrFG`-^8q~@Wc3jtvVfsZNL&B*D>*j}KCi)shP#4<0qKOatfR9hK&m*07p$E(-J%b&b=teQXZO7_w_@6ven z%6R$WIM^5k*G__KqhRwS*c=6WC&Aut?Y|KG7@k-YgxdCj{WjPGwDOJpe!+$qbw6-_ zxh+1eN(ddb_F<2=((cx*!(s#cR4siN=RFQ|c~`UgbsJ}4Lha*yHM{(qViQyY9(e_} giDekZ)J4X|?`ZvRw`I7m{88)bN$cuA2$V9wzY(Wp8vpv706_YRqENLLjXRA;z^!(k|olw)UWvCYy1z(t2h# z|4u%XLT>pQ{t~5-FHq;Q%RqbSskbFIJ@-jku{iXQ0loKoZ{ECl@ApQx8}lB5_2I91 zcEv#G@7$=CH3er|0FKcC!rCs98fbl2-!Y`If|k(d2ph`?oBKxFsSeKc*N`(`(!|;q zD6sy?jUNL|d41O7p=4PqqTE-l`V^e~2H+U&!+jV@{h%fdTyJU8+_&0uRq#wh6&lvD zaaS*W5Y?FNRtTa@Z0$R3zw*p<`|=D|sJ&dFnZ|Yt;klo*gKu!{?zB7XRH&uPIqb@L z>_NBl%6(LIsTy$>4f`~e1D+jHsTO0(Q${%n6Urqe{g5Sr4!mSBO-LH{sWJ;`PY>A7 zvxG|VI53peO~UkbE1;KBHLkag=_j46AltT)h2vHs(z}qmP zfaeG~8iq;E9axtLdBV7mkcOsNz8%v6O=GBoQNi;8sye3q>^a@e$x_b!I4)7MKTISO zG@+3!h*WyqRdxY|YCg($_ln&z-pdAb`lQtoAwt6Qjz}maXWgNsf)L(>>(1aqia)s5 z`B_jdIy>#o78TEAHt6i_;+;}l99C!cvvgo=UlCpu{0Y+|VHyK9oVEt9c>X^Zq6R<= zK>Ug(HgdPMiJ@P%j~`AvTmwO^#P$h?S(NxXv^F-|L`}V)5Y)2^O^}c>Yi`^@&mtBl@M6! zvyb_0#oboPE?<;I6$+RMOQ%&DwDr?5=3md7~XmV^I}e+i}rpI8AgF*Hp(vypcF YPqcb&H#PgMH)`HEZQl47fl(y*4^dBHMgRZ+ literal 0 HcmV?d00001 diff --git a/gestion_projet/migrations/__pycache__/0004_delete_plan.cpython-310.pyc b/gestion_projet/migrations/__pycache__/0004_delete_plan.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc6ab2ad25bd4b41541991cb9baa543d377ff14f GIT binary patch literal 547 zcmY*X%}T>S5Z+DF+Q$CeJd3wnnu3BCkqUwewiJt(A`G!R#*}0?Zc@RsUcLJYzS3Sj z`3hd@Y+7j@m|=c)X1{NCRlDsolKw|Gx#Ns|*6UZ#u^UZu~5XbyOxw7BidL7MFqnX|YcR*^~=L?L6jF7rlAS4t}>$ zeKpcFhkvsI$8=&W>{!UPnqz5>`~ChQXw1|zf>5(XhO%7MK%kZhYKT(QB|;V@DMV60 zrZgIFe0??|q@Ij290fb30bpGK;{zQLi`4opfTu;2t}88pIZAYymE)TBC(|9OSLWw7d{h~R4>Lv0;rSY75soVoFuA(93@h`WUAWm|NIZ{-k-ZD@ zG?KmiMcYl*Neg>ZgE_9Z^lA?GmW^dq8wIXuig_es)f4v>-YUOAw(`2vZW<>m(x>zh LSYcnjbwNceMOfT}*6k`A^dJL|bo08TCYd-hD|izG z&t3}t1%HlSDs%PJ+sfLzGn-vj=kW5qyziSg@0*#du7<>{*4MR+Q9^#%WWE|RFxfZY zjKn0S&&eSbbcfs^cS!8qB(ckA-321ibQ3+l!FDAkog9a z1M~NcFd}G7gcDQY#?DwscW7oUpe>xN!b8Rnjb&#GW<&f{C$I}_>jqSl}+NMFec~G17SZtZp iJU}9EnJ{)KrI$XTxBvJd^}mGY>$~6AcQ1)ars}^s;j@1L literal 0 HcmV?d00001 diff --git a/gestion_projet/migrations/__pycache__/0004_remove_activiteprojet_livrables.cpython-314.pyc b/gestion_projet/migrations/__pycache__/0004_remove_activiteprojet_livrables.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca7e54220a3af09b4cbaf825cd7f52525a9769db GIT binary patch literal 733 zcmY*X&1(}u6o0c{&2DR~AF&=vC0LN4gn$J>N)eQjik2|qZPUj#`;1#RyK!a`@Royk z_TTW&(St2>_2ezk>e<UqmX&Guc~u16-EcH@6e$ zf?^z$b>u0VdrhXCuG?ArKcK{>3C1mMKe0+~JXg4*D%>?iSG50nQB7B)o=V1vqM^u7 zNNGP!#v(dSNj5CgRUT7{Su`N+6!se&n(JzxWYH?lW9qF|>oG>DB7t!}h?0zA64ZN7 z!aSJegNCmwILm{m14NT|l#;<~h#yB$TI4qDI^w%TNR^rlSzdgOX-HX2SuY_e3hneN zr$IiZ{e;q32l zvh|~~b++-~?8fGWYx}{}c5iy0Uy9ly{IFqbKR$`Fe%_3aXJePSi&;vyI|k{>ZmHv* lxNE5SOF?cLGqo9Ge>`CI3vZQqUxU;2?eFW`f5DJh^glb8z#jkr literal 0 HcmV?d00001 diff --git a/gestion_projet/migrations/__pycache__/0005_alter_livrableslivres_nom_delete_livrableattendu.cpython-314.pyc b/gestion_projet/migrations/__pycache__/0005_alter_livrableslivres_nom_delete_livrableattendu.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d1a11ac649e36f244c9b3eb7e7a1d7ae385588d3 GIT binary patch literal 979 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 O)edA{F%ytrVE_PZJRr&d literal 0 HcmV?d00001 diff --git a/gestion_projet/migrations/__pycache__/__init__.cpython-313.pyc b/gestion_projet/migrations/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..56a1444f5963ebacd31b012d921c506f3fa87f6c GIT binary patch literal 170 zcmey&%ge<81Xn*ZW`gL)AOZ#$p^VQgK*m&tbOudEzm*I{OhDdekkl*7s2G>j;_Q#%>2Cgf};Ga)RLIo%=Dr}kU()v re0*kJW=VX!UP0w84x8Nkl+v73yCPPg$sn7HL5z>gjEsy$%s>_ZQSvK) literal 0 HcmV?d00001 diff --git a/gestion_projet/migrations/__pycache__/__init__.cpython-314.pyc b/gestion_projet/migrations/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1c65e9253b34ec316c1f34dacff766e73180a76 GIT binary patch literal 166 zcmdPq_I|p@<2{{|u76v@$@tJv 0: + return round((temps_ecoule / duree_projet) * 100, 2) + + return 0 + + def __str__(self): + return f"{self.nom_projet}" + +class FinancementProjet(models.Model): + """ + Modèle représentant le financement d'un projet par un bailleur, + avec le pourcentage de contribution. + """ + projet = models.ForeignKey( + Projet, + on_delete=models.CASCADE + ) + bailleur = models.ForeignKey( + Bailleur, + on_delete=models.CASCADE + ) + pourcentage = models.DecimalField( + max_digits = 5, + decimal_places=2 + ) + + class Meta: + unique_together = ('projet', 'bailleur') + + def __str__(self): + return f"{self.bailleur.nom} - {self.projet.nom_projet} ({self.pourcentage}%)" + +class DocumentProjet(models.Model): + """Modèle représentant un document associé à un projet, avec des métadonnées et un fichier attaché.""" + NOM_DOCUMENT_CHOICES = [ + ('protocole', 'Protocole d’étude'), + ('ethique', "Approbation du comité d'éthique"), + ('autorisation', 'Autorisation (DNLP)'), + ('rapport_technique', 'Rapport technique'), + ('rapport_financier', 'Rapport financier'), + ('rapport_avancement', "Rapport d'avancement"), + ('convention', 'Convention'), + ('rapport_final', 'Rapport final'), + ('autre', 'Autre'), + ] + + projet = models.ForeignKey( + Projet, + on_delete=models.CASCADE, + related_name='documents', + verbose_name="Projet" + ) + date_ajout = models.DateTimeField( + auto_now_add=True, + verbose_name="Date d'ajout" + ) + nom_document = models.CharField( + max_length = 100, + choices = NOM_DOCUMENT_CHOICES, + verbose_name="Type de document" + ) + description = models.TextField( + blank = True, + verbose_name = "Description" + ) + numero = models.CharField( + max_length = 100, + blank = True, + null = True, + verbose_name = "Numéro du document" + ) + date_validite = models.DateField( + blank = True, + null = True, + verbose_name = "Date de validité" + ) + fichier = models.FileField( + upload_to = 'documents_projets/', + verbose_name = "Fichier à télécharger" + ) + + def __str__(self): + return f"{self.nom_document} ({self.projet})" + +class ActiviteProjet(models.Model): + """Modèle représentant le planning d'un projet, avec des activités associées et un statut.""" + projet = models.ForeignKey( + Projet, + on_delete = models.CASCADE, + verbose_name = "Projet" + ) + titre = models.CharField( + max_length = 200, + verbose_name = "Titre de l'activité" + ) + description = models.TextField( + blank = True, + null = True, + verbose_name = "Description de l'activité" + ) + date_debut = models.DateField(verbose_name="Date de début") + date_fin = models.DateField(verbose_name="Date de fin") + annuler = models.BooleanField( + default = False, + verbose_name = "Annuler l'activité" + ) + motif_annulation = models.TextField( + blank = True, + null = True, + verbose_name = "Motif d'annulation" + ) + + motif_changement_budget = models.TextField( + blank = True, + null = True, + verbose_name = "Motif de changement de budget" + ) + budget_prevu = models.DecimalField( + max_digits = 15, + decimal_places = 2, + default = 0, + verbose_name = "Budget prévu" + ) + budget_depense = models.DecimalField( + max_digits = 15, + decimal_places = 2, + default = 0, + verbose_name = "Budget dépensé" + ) + besoin_ressource_materielle = models.TextField( + verbose_name="Besoin de ressources matérielles" + ) + + @property + def statut(self): + today = timezone.now().date() + if not self.annuler: + if self.date_fin < today: + return 'Terminé' + elif self.date_debut > today: + return 'À venir' + else: + return 'En cours' + else: + return 'Annulé' + + def __str__(self): + return f"{self.titre} ({self.projet.nom_projet})" + +# class LivrableAttendu(models.Model): +# """ +# Modèle représentant un livrable attendu pour une activité de projet, +# avec des critères de validation. +# """ +# activite = models.ForeignKey( +# ActiviteProjet, +# on_delete = models.CASCADE, +# related_name = "livrables_attendus" +# ) +# nom = models.CharField(max_length=255) + +# def __str__(self): +# return f"{self.nom} (Activité: {self.activite.titre})" + +class LivrablesLivres(models.Model): + """Modèle représentant un livrable livré pour une activité de projet.""" + activite = models.ForeignKey( + ActiviteProjet, + on_delete = models.CASCADE + ) + # nom = models.ForeignKey( + # LivrableAttendu, + # on_delete = models.CASCADE + # ) + nom = models.CharField( + max_length=255, + verbose_name="Nom du livrable" + ) + + fichier = models.FileField( + upload_to = 'fichier_livrables/', + blank = True, + null = True + ) + def __str__(self): + return self.nom \ No newline at end of file diff --git a/gestion_projet/static/gestion_projet/js/creation_projet.js b/gestion_projet/static/gestion_projet/js/creation_projet.js new file mode 100644 index 0000000..36c1a10 --- /dev/null +++ b/gestion_projet/static/gestion_projet/js/creation_projet.js @@ -0,0 +1,19 @@ +const boutonEnregistrerProjet = $("btnEnregistrerProjet"); + +boutonEnregistrerProjet.addEventListener("click", function() { + const formulaire = $("formCreationProjet"); + const formData = new FormData(formulaire); + fetch(formulaire.action, { + method: "POST", + body: formData, + headers: { + "X-CSRFToken": formData.get("csrfmiddlewaretoken") + } + }) + .then(response => { + if (response.ok) { + window.location.reload(); + alert("Projet enregistré avec succès !"); + } + }); +}); \ No newline at end of file diff --git a/gestion_projet/static/gestion_projet/js/enregistrement_bailleur.js b/gestion_projet/static/gestion_projet/js/enregistrement_bailleur.js new file mode 100644 index 0000000..afe12ea --- /dev/null +++ b/gestion_projet/static/gestion_projet/js/enregistrement_bailleur.js @@ -0,0 +1,23 @@ +const btnEnregistrerBailleur = document.getElementById('btnEnregistrerBailleur'); + +btnEnregistrerBailleur.addEventListener('click', function() { + const form = document.getElementById('formBailleur'); + const formData = new FormData(form); + + fetch(form.action, { + method: 'POST', + body: formData, + headers: { + 'X-CSRFToken': formData.get('csrfmiddlewaretoken') + } + }) + .then(response => response.json()) + .then(data => { + if (data.success) { + alert('Bailleur enregistré avec succès !'); + window.location.reload(); + } else { + alert('Ce bailleur existe déjà dans la base de données.'); + } + }); +}); \ No newline at end of file diff --git a/gestion_projet/static/gestion_projet/js/enregistrement_financement.js b/gestion_projet/static/gestion_projet/js/enregistrement_financement.js new file mode 100644 index 0000000..1e9646c --- /dev/null +++ b/gestion_projet/static/gestion_projet/js/enregistrement_financement.js @@ -0,0 +1,22 @@ +const btn_enregistrer_financement = document.getElementById('btn_enregistrer_financement'); + +btn_enregistrer_financement.addEventListener('click', function() { + const form = document.getElementById('form_financement'); + const formData = new FormData(form); + fetch(form.action, { + method: 'POST', + body: formData, + headers: { + 'X-CSRFToken': formData.get('csrfmiddlewaretoken') + } + }) + .then(response => response.json()) + .then(data => { + if (data.success) { + alert(data.message); + window.location.reload(); + }else { + alert(data.message); + } + }); +}); \ No newline at end of file diff --git a/gestion_projet/static/gestion_projet/js/index.js b/gestion_projet/static/gestion_projet/js/index.js new file mode 100644 index 0000000..eb6285e --- /dev/null +++ b/gestion_projet/static/gestion_projet/js/index.js @@ -0,0 +1,64 @@ +const $ = (element) => document.getElementById(element) +const url_liste_projet = $("tableau-liste-projet").dataset.url; +const tableau_liste_projet = new Tabulator("#tableau-liste-projet", { + fitColumns: true, + responsiveLayout : true, + columns: [ + {title: "Projet", field: "nom_projet"}, + {title: "Source de financement", field: "source_financement"}, + {title: "Budget Total", field: "budget"}, + {title: "Budget RH", field: "budget_RH"}, + {title: "Avancement", field: "avancement", formatter: "progress"}, + {title: "Statut", field: "statut"}, + ], + ajaxURL: url_liste_projet +}) + +const employes_affectes_projet = new Tabulator("#employes_affectes_projet", { + columns: [ + {title: "Employé", field: "employe"}, + {title: "Pourcentage d'affectation", field: "pourcentage_affectation"}, + ], + placeholder: "Aucun employé affecté pour ce projet", +}) + +const bailleurs_projet = new Tabulator("#bailleurs_projet", { + columns: [ + {title: "Bailleur", field: "bailleur"}, + {title: "Pourcentage de financement", field: "pourcentage_financement"}, + ], + placeholder: "Aucun bailleur attribué pour ce projet", +}) + +tableau_liste_projet.on("rowClick", function (row, rowData) { + const data = rowData.getData(); + const modal = new bootstrap.Modal($("modalDetailProjet")); + + $("detail_id_projet").value = data.id_projet; + $("detail_nom_projet").value = data.nom_projet; + $("detail_date_debut").value = data.date_debut; + $("detail_date_fin").value = data.date_fin; + $("detail_numero_convention").value = data.numero_convention; + $("detail_type_projet").value = data.type_projet; + Array.from($("detail_domaine_recherche").options).forEach(option => { + if (data.domaine_recherche.includes(option.value)) { + option.selected = true; + } else { + option.selected = false; + } + }); + $("detail_budget").value = data.budget; + $("detail_budget_rh").value = data.budget_RH; + $("detail_description").value = data.description; + $("detail_statut").value = data.statut; + + employes_affectes_projet.setData(`projet/liste-employes-par-projet/${$("detail_id_projet").value}`); + bailleurs_projet.setData(`projet/bailleurs/${data.id_projet}/`); + + modal.show(); +}) + +// $('detail-projet-form').addEventListener('submit', (e) => { +// e.preventDefault(); +// new FormData($("detail-projet-form")); +// }) \ No newline at end of file diff --git a/gestion_projet/static/gestion_projet/js/liste_documents_projet.js b/gestion_projet/static/gestion_projet/js/liste_documents_projet.js new file mode 100644 index 0000000..e586ae1 --- /dev/null +++ b/gestion_projet/static/gestion_projet/js/liste_documents_projet.js @@ -0,0 +1,20 @@ +const urlListeDocument = document.getElementById('listeDocuments').dataset.urllistedocument; + +const table_liste_documents = new Tabulator(document.getElementById('listeDocuments'), { + layout: "fitColumns", + placeholder: "Aucun document trouvé", + columns: [ + { title: "Nom du Document", field: "nom_document" }, + { title: "Numéro", field: "numero" }, + { title: "Date de Validité", field: "date_validite", formatter: "datetime", formatterParams: { + inputFormat: "yyyy-MM-dd", + outputFormat: "dd/MM/yyyy" + } + }, + { title: "Lien vers le Document", field: "lien_document", formatter:"link", formatterParams:{ + target:"_blank", + } + }, + ], + ajaxURL: urlListeDocument, +}); \ No newline at end of file diff --git a/gestion_projet/static/gestion_projet/js/suivi-activites.js b/gestion_projet/static/gestion_projet/js/suivi-activites.js new file mode 100644 index 0000000..d0775d7 --- /dev/null +++ b/gestion_projet/static/gestion_projet/js/suivi-activites.js @@ -0,0 +1,59 @@ +const $ = (element) => document.getElementById(element) + +const url_liste_activite = $("tableau-liste-activite").dataset.urllisteactivite +const tableau_liste_activite = new Tabulator("#tableau-liste-activite", { + columns: [ + {title: "Activité", field: "titre"}, + {title: "Date début", field: "date_debut"}, + {title: "Date fin", field: "date_fin"}, + {title: "Budget prévu", field: "budget_prevu"}, + {title: "Budget dépensé", field: "budget_depense"}, + {title: "Motif de changement de budget", field: "motif_changement_budget"}, + {title: "Statut", field: "statut"}, + ], + ajaxURL: url_liste_activite, +}) +tableau_liste_activite.on("rowClick", function (row, rowData) { + const data = rowData.getData(); + $("idDetailActivite").value = data.id; + $("titreDetailActivite").value = data.titre; + $("descriptionDetailActivite").value = data.description; + $("date_debutDetailActivite").value = data.date_debut; + $("date_finDetailActivite").value = data.date_fin; + $("statutDetailActivite").value = data.statut; + $("budget_prevuDetailActivite").value = data.budget_prevu; + $("besoin_ressources_materiellesDetailActivite").value = data.besoin_ressource_materielle; + const modal = new bootstrap.Modal($("modalDetailActivite")); + modal.show(); + + fetch(`liste-des-livrables/${data.id}/`) + .then(response => response.json()) + .then(livrables => { + tableau_liste_livrable.setData(livrables); + }) +}) + +const tableau_liste_livrable = new Tabulator("#listeLivrables", { + columns: [ + {title: "Livrable", field: "titre"}, + {title: "Lien du livrable", field: "lien", formatter: "link", formatterParams: {blank: true}}, + ], + placeholder: "Aucun livrable trouvé", +}) + +$("btnMiseAJourDepense").addEventListener("click", function() { + const modal = new bootstrap.Modal($("modalDepenseActivite")); + bootstrap.Modal.getOrCreateInstance($("modalDetailActivite")).hide(); + const idActivite = $("idDetailActivite").value; + const budgetPrevu = $("budget_prevuDetailActivite").value; + + $("id_activite_depense").value = idActivite; + $("budget_prevu").value = budgetPrevu; + modal.show(); +}) + +$("btnAnnulerActivite").addEventListener("click", function(event) { + new bootstrap.Modal($("modalAnnulerActivite")).show(); + $("id_activite_annulation").value = $("idDetailActivite").value; + bootstrap.Modal.getOrCreateInstance($("modalDetailActivite")).hide(); +}) \ No newline at end of file diff --git a/gestion_projet/templates/gestion_projet/ajout-financement.html b/gestion_projet/templates/gestion_projet/ajout-financement.html new file mode 100644 index 0000000..642fc29 --- /dev/null +++ b/gestion_projet/templates/gestion_projet/ajout-financement.html @@ -0,0 +1,37 @@ +{% extends "BASE.html" %} +{% load static %} +{% block 'titre_page' %} Gestion des projets {% endblock %} +{% block 'contenu' %} + + + {% if messages %} + {% for message in messages %} + + {% endfor %} + {% endif %} + +{% endblock %} +{% block 'modal' %} + {% include "gestion_projet/parts/modalAjoutProjet.html" %} +{% endblock %} +{% block 'js' %} + +{% endblock %} \ No newline at end of file diff --git a/gestion_projet/templates/gestion_projet/creation_projet.html b/gestion_projet/templates/gestion_projet/creation_projet.html new file mode 100644 index 0000000..c04c5d4 --- /dev/null +++ b/gestion_projet/templates/gestion_projet/creation_projet.html @@ -0,0 +1,32 @@ +{% extends "BASE.html" %} +{% load static %} +{% block 'titre_page' %} Gestion des projets {% endblock %} +{% block 'contenu' %} + {% if messages %} + {% for message in messages %} + + {% endfor %} + {% endif %} + {% comment %}

Enregistrement d'un nouveau projet

{% endcomment %} +
+
+
Enregistrement d'un nouveau projet
+
+
+ {% csrf_token %} + {{ formulaire_creation_projet.as_p }} +
+ + +
+
+
+
+{% endblock %} +{% block 'modal' %} +{% endblock %} +{% block 'js' %} +{% endblock %} \ No newline at end of file diff --git a/gestion_projet/templates/gestion_projet/index.html b/gestion_projet/templates/gestion_projet/index.html new file mode 100644 index 0000000..70ba584 --- /dev/null +++ b/gestion_projet/templates/gestion_projet/index.html @@ -0,0 +1,61 @@ +{% extends "BASE.html" %} +{% load static %} +{% load tags_personnaliser %} +{% block 'titre_page' %} Gestion des projets {% endblock %} +{% block 'contenu' %} +

Gestion des projets

+{% if messages %} + {% for message in messages %} + + {% endfor %} +{% endif %} +
+
+ Projets en cours +

{{projet_en_cours}}

+
+
+ Budget Total (GNF) +

{{budget_total}}

+
+
+ Personnel sous projet +

{{nombre_personnel}}

+
+
+
+
+
La liste des projets
+ {% if user|has_group:"ressource_humaine" %} +
+ + +
+ {% endif %} +
+
+
+
+
+
+
+{% endblock %} +{% block 'modal' %} + {% include "gestion_projet/parts/modalAjoutProjet.html" %} + {% include "gestion_projet/parts/modalFinancement.html" %} + {% include "gestion_projet/parts/creation_bailleur.html" %} + {% include "gestion_projet/parts/modalDetailProjet.html" %} +{% endblock %} +{% block 'js' %} + + + + +{% endblock %} \ No newline at end of file diff --git a/gestion_projet/templates/gestion_projet/parts/creation_bailleur.html b/gestion_projet/templates/gestion_projet/parts/creation_bailleur.html new file mode 100644 index 0000000..6fe4194 --- /dev/null +++ b/gestion_projet/templates/gestion_projet/parts/creation_bailleur.html @@ -0,0 +1,20 @@ + diff --git a/gestion_projet/templates/gestion_projet/parts/liste_document_projet.html b/gestion_projet/templates/gestion_projet/parts/liste_document_projet.html new file mode 100644 index 0000000..eb63ad2 --- /dev/null +++ b/gestion_projet/templates/gestion_projet/parts/liste_document_projet.html @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/gestion_projet/templates/gestion_projet/parts/modalAjoutActivite.html b/gestion_projet/templates/gestion_projet/parts/modalAjoutActivite.html new file mode 100644 index 0000000..d253eb3 --- /dev/null +++ b/gestion_projet/templates/gestion_projet/parts/modalAjoutActivite.html @@ -0,0 +1,20 @@ + \ No newline at end of file diff --git a/gestion_projet/templates/gestion_projet/parts/modalAjoutDocument.html b/gestion_projet/templates/gestion_projet/parts/modalAjoutDocument.html new file mode 100644 index 0000000..6787fad --- /dev/null +++ b/gestion_projet/templates/gestion_projet/parts/modalAjoutDocument.html @@ -0,0 +1,20 @@ + \ No newline at end of file diff --git a/gestion_projet/templates/gestion_projet/parts/modalAjoutLivrable.html b/gestion_projet/templates/gestion_projet/parts/modalAjoutLivrable.html new file mode 100644 index 0000000..6b2bb68 --- /dev/null +++ b/gestion_projet/templates/gestion_projet/parts/modalAjoutLivrable.html @@ -0,0 +1,20 @@ + \ No newline at end of file diff --git a/gestion_projet/templates/gestion_projet/parts/modalAjoutProjet.html b/gestion_projet/templates/gestion_projet/parts/modalAjoutProjet.html new file mode 100644 index 0000000..1be46ce --- /dev/null +++ b/gestion_projet/templates/gestion_projet/parts/modalAjoutProjet.html @@ -0,0 +1,21 @@ + + \ No newline at end of file diff --git a/gestion_projet/templates/gestion_projet/parts/modalAnnulerActivite.html b/gestion_projet/templates/gestion_projet/parts/modalAnnulerActivite.html new file mode 100644 index 0000000..7793aaf --- /dev/null +++ b/gestion_projet/templates/gestion_projet/parts/modalAnnulerActivite.html @@ -0,0 +1,26 @@ + \ No newline at end of file diff --git a/gestion_projet/templates/gestion_projet/parts/modalDetailActivite.html b/gestion_projet/templates/gestion_projet/parts/modalDetailActivite.html new file mode 100644 index 0000000..fba8cd9 --- /dev/null +++ b/gestion_projet/templates/gestion_projet/parts/modalDetailActivite.html @@ -0,0 +1,58 @@ + \ No newline at end of file diff --git a/gestion_projet/templates/gestion_projet/parts/modalDetailProjet.html b/gestion_projet/templates/gestion_projet/parts/modalDetailProjet.html new file mode 100644 index 0000000..a7f6087 --- /dev/null +++ b/gestion_projet/templates/gestion_projet/parts/modalDetailProjet.html @@ -0,0 +1,115 @@ +{% load tags_personnaliser %} + \ No newline at end of file diff --git a/gestion_projet/templates/gestion_projet/parts/modalFinancement.html b/gestion_projet/templates/gestion_projet/parts/modalFinancement.html new file mode 100644 index 0000000..a075b41 --- /dev/null +++ b/gestion_projet/templates/gestion_projet/parts/modalFinancement.html @@ -0,0 +1,20 @@ + \ No newline at end of file diff --git a/gestion_projet/templates/gestion_projet/parts/modalMiseAJourDepense.html b/gestion_projet/templates/gestion_projet/parts/modalMiseAJourDepense.html new file mode 100644 index 0000000..d796bb4 --- /dev/null +++ b/gestion_projet/templates/gestion_projet/parts/modalMiseAJourDepense.html @@ -0,0 +1,36 @@ + \ No newline at end of file diff --git a/gestion_projet/templates/gestion_projet/suivi_activite.html b/gestion_projet/templates/gestion_projet/suivi_activite.html new file mode 100644 index 0000000..24d44a6 --- /dev/null +++ b/gestion_projet/templates/gestion_projet/suivi_activite.html @@ -0,0 +1,64 @@ +{% extends "BASE.html" %} +{% load static %} +{% block 'titre_page' %} Gestion des projets {% endblock %} +{% block 'contenu' %} + {% if messages %} + {% for message in messages %} + + {% endfor %} + {% endif %} +
+ Suivi des Activités ({{ nom_projet }} ) +
+
+
+ Budget Total (GNF) +

{{ budget_total }}

+
+
+ Budget RH (GNF) +

{{ budget_RH }}

+
+
+ Budget Dépensé (GNF) +

{{budget_depense}}

+
+
+
+
+
La liste des Activités
+
+ + + +
+
+
+ +
+
+
+{% endblock %} +{% block 'modal' %} + {% include "gestion_projet/parts/modalAjoutActivite.html" %} + {% include "gestion_projet/parts/modalDetailActivite.html" %} + {% include "gestion_projet/parts/modalAjoutDocument.html" %} + {% include "gestion_projet/parts/modalMiseAJourDepense.html" %} + {% include "gestion_projet/parts/modalAjoutLivrable.html" %} + {% include "gestion_projet/parts/liste_document_projet.html" %} + {% include "gestion_projet/parts/modalAnnulerActivite.html" %} +{% endblock %} +{% block 'js' %} + + +{% endblock %} + \ No newline at end of file diff --git a/gestion_projet/tests.py b/gestion_projet/tests.py new file mode 100644 index 0000000..de8bdc0 --- /dev/null +++ b/gestion_projet/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/gestion_projet/urls.py b/gestion_projet/urls.py new file mode 100644 index 0000000..6e3f087 --- /dev/null +++ b/gestion_projet/urls.py @@ -0,0 +1,122 @@ +from django.urls import path +from . import views + +app_name = 'gestion_projet' + +urlpatterns = [ + path( + '', + views.index, + name='index' + ), + path( + 'modifier-financement//', + views.modifier_financement_projet, + name='modifier-financement' + ), + path( + 'projet/creation/', + views.creation_projet, + name='creation-projet' + ), + path( + 'projet/modifier//', + views.modification_projet, + name='modifier-projet' + ), + path( + 'liste-projet/', + views.liste_projet, + name='liste-projet' + ), + path( + 'projet/suppression//', + views.suppression_projet, + name='projet-suppression' + ), + path( + 'projet/ajouter-financement', + views.ajouter_financement_projet, + name='ajouter_financement' + ), + path( + 'creation-bailleur', + views.creation_bailleur, + name='creation-bailleur' + ), + path( + 'projet/affectation/', + views.affecter_employe_projet, + name='affecter-employe-projet' + ), + path( + 'projet/ajout-de-document/', + views.ajouter_document_projet, + name='ajouter-document' + ), + path( + 'projet/bailleurs//', + views.liste_bailleurs, + name='liste-bailleurs' + ), + path( + 'activite/', + views.activites_projet, + name='activites-projet' + ), + path( + 'activite/ajouter/', + views.ajouter_activite_projet, + name='ajouter-activite' + ), + path( + 'activite/modifier//', + views.modifier_activite_projet, + name='modifier-activite' + ), + path( + 'activite/annuler/', + views.annuler_activite_projet, + name='annuler-activite' + ), + path( + 'activite/liste/', + views.liste_activites_projet, + name='liste-activites-projet' + ), + # path( + # 'projet/ajout-de-document/', + # views.ajouter_document_projet, + # name='ajouter-document' + # ), + path( + 'projet/liste-des-documents/', + views.liste_documents_projet, + name='liste-documents-projet' + ), + path( + 'activite/liste-des-livrables//', + views.liste_livrables_activite, + name='liste-livrables-activite' + ), + path( + 'projet/ajout-de-livrable/', + views.ajouter_livrables_projet, + name='ajouter-livrable' + ), + path( + 'activite/mise-a-jour-depense/', + views.mises_a_jour_depense_activite, + name='mettre-a-jour-depense' + ), + path( + 'projet/liste-employes-par-projet/', + views.liste_employes_affectes, + name='liste-employes-affectes' + ), + path( + 'projet/mises-a-jour-projet', + views.mises_a_jour_projet, + name='mises-a-jour-projet' + ) +] \ No newline at end of file diff --git a/gestion_projet/views.py b/gestion_projet/views.py new file mode 100644 index 0000000..69bd619 --- /dev/null +++ b/gestion_projet/views.py @@ -0,0 +1,485 @@ +from datetime import date +from decimal import Decimal, InvalidOperation +from django.http import JsonResponse +from django.shortcuts import redirect, render +from django.utils import timezone +from django.contrib import messages +from django.contrib.auth.decorators import login_required +from django.db.models import Sum +from django.forms.models import model_to_dict +from gestion_employe.forms import AffectationForm +from gestion_employe.models import Affectation, Employe +from gestion_projet.forms import ProjetForm +from gestion_projet.models import Projet +from .models import ( + DocumentProjet, + Bailleur, + FinancementProjet, + ActiviteProjet, + LivrablesLivres, +) +from .forms import ( + ActiviteProjetForm, + DocumentProjetForm, + FinancementProjetFrom, + BailleurForm, + LivrablesLivresForm +) + +def liste_projet(request): + """ Vue pour retourner la liste de tous les projet """ + projets = Projet.objects.all().order_by('-created_at') + + data = [] + for p in projets: + financement = FinancementProjet.objects.filter(projet=p).select_related('bailleur') + data.append({ + "id_projet": p.id_projet, + "nom_projet": p.nom_projet, + "date_debut": p.date_debut, + "date_fin": p.date_fin, + "numero_convention": p.numero_convention, + "description": p.description, + "type_projet": p.type_projet, + "budget": p.budget, + "budget_RH": p.budget_RH, + "created_at": p.created_at, + "statut": p.statut, + "avancement": p.avancement, + "domaine_recherche": [d.nom for d in p.domaine_recherche.all()], + "source_financement": [f.bailleur.nom_organisme for f in financement], + }) + + return JsonResponse(data, safe=False) + +def liste_employes_affectes(request, projet_id): + """ Vue pour retourner la liste des employés affectés à un projet spécifique """ + employes = Employe.objects.filter(affectation__projet_id=projet_id).distinct() + data = [] + for employe in employes: + data.append({ + "employe": f"{employe.user.first_name} {employe.user.last_name}", + "pourcentage_affectation": Affectation.objects.get(employe=employe, projet__id_projet=projet_id).pourcentage_temps_affectation + }) + return JsonResponse(data, safe=False) + +def liste_bailleurs(request, projet_id): + """ Vue pour retourner la liste des bailleurs associés à un projet spécifique """ + bailleurs = FinancementProjet.objects.filter(projet_id=projet_id).select_related('bailleur') + data = [] + for b in bailleurs: + data.append({ + "bailleur": b.bailleur.nom_organisme, + "pourcentage_financement": b.pourcentage + }) + + return JsonResponse(data, safe=False) + +@login_required +def index(request): + projets = Projet.objects.all().order_by('-created_at') + nombre_personnel = Affectation.objects.values('employe_id').distinct().count() + budget_total = sum([projet.budget for projet in projets if projet.budget or 0]) + context = { + 'form': AffectationForm(), + 'form_ajout_financement': FinancementProjetFrom(), + 'form_ajout_bailleur': BailleurForm(), + 'bailleurs': Bailleur.objects.all(), + 'nombre_personnel': nombre_personnel, + 'budget_total': budget_total, + 'formulaire_creation_projet': ProjetForm(), + 'projet_en_cours': Projet.objects.filter(date_fin__gte=date.today()).count(), + } + + return render(request, 'gestion_projet/index.html', context) + +@login_required +def creation_projet(request): + """Vue pour créer un nouveau projet via un formulaire""" + formulaire_creation_projet = ProjetForm() + if request.method == "POST": + form = ProjetForm(request.POST) + + if form.is_valid(): + form.save() + messages.success(request, "Projet créé avec succès.") + else: + messages.error(request, "Le formulaire transmis est invalide.") + else: + form = ProjetForm() + return render( + request, + "gestion_projet/creation_projet.html", + { + "formulaire_creation_projet": formulaire_creation_projet + } + ) + +@login_required +def mises_a_jour_projet(request): + """ Vue de mises à jour des informations du projet """ + if request.method == "POST": + try: + projet = Projet.objects.get(id_projet = request.POST["id_projet"]) + except Projet.DoesNotExist: + messages.error(request, "Ce projet n'existe pas.") + else: + projet_form = ProjetForm(request.POST, instance=projet) + if projet_form.is_valid(): + projet_form.save() + messages.success(request, f"Le projet d'identifiant {request.POST['id_projet']} a été mis à jour avec succès.") + else: + messages.error(request, f"Les informations de modification transmises pour la modification du projet {request.POST['id_projet']} ne sont pas valides.") + else: + messages.error(request, "La méthode de transmission des données n'est pas valide.") + return redirect('gestion_projet:index') + +@login_required +def creation_bailleur(request): + form = BailleurForm(request.POST) + if request.method == 'POST': + if form.is_valid(): + form.save() + return JsonResponse({'success': True}) + return JsonResponse({'success': False}) + +@login_required +def ajouter_financement_projet(request): + """Ajoute un financement à un projet en vérifiant que le total ne dépasse pas 100%""" + + if request.method == 'POST': + pourcentage_recuperer = request.POST.get('pourcentage') + bailleur_id = request.POST.get('bailleur') + projet_id = request.POST.get('projet') + try: + projet = Projet.objects.get(id_projet=projet_id) + except Projet.DoesNotExist: + return JsonResponse({'success': False, 'message': "Le projet spécifié n’existe pas."}) + + try: + pourcentage_nouveau = Decimal(pourcentage_recuperer) if pourcentage_recuperer else Decimal(0) + except (InvalidOperation, TypeError): + return JsonResponse({'success': False, 'message': "Le pourcentage saisi n’est pas valide."}) + + financement_total_actuel = sum(financement.pourcentage for financement in FinancementProjet.objects.filter(projet=projet)) + if financement_total_actuel + pourcentage_nouveau > 100: + return JsonResponse({'success': False, 'message': "Le total des financements dépasse 100%."}) + + if bailleur_id: + FinancementProjet.objects.create( + projet=projet, + bailleur_id=bailleur_id, + pourcentage=pourcentage_nouveau + ) + return JsonResponse({'success': True, 'message': "Financement ajouté avec succès."}) + else: + return JsonResponse({'success': False, 'message': "Aucun bailleur sélectionné."}) + return JsonResponse({'success': False, 'message': "Requête invalide."}) + +@login_required +def modification_projet(request, projet_id): + """Vue pour éditer un projet existant via un formulaire pré-rempli""" + try: + projet = Projet.objects.get(id=projet_id) + except Projet.DoesNotExist: + messages.error(request, "Le projet spécifié n’existe pas.") + return redirect('projet-index') + + if request.method == "POST": + form = ProjetForm(request.POST) + if form.is_valid(): + form.save() + messages.success(request, "Le projet a été modifié avec succès.") + return redirect('projet-index') + messages.error(request, "Erreur lors de la modification du projet.") + form = ProjetForm(instance=projet) + return render(request, 'gestion_projet/projet-edit.html', {'form': form, 'projets': projet}) + +@login_required +def suppression_projet(request, id): + """Vue pour supprimer un projet spécifique après confirmation de l'utilisateur""" + try: + projet = Projet.objects.get(id=id) + except Projet.DoesNotExist: + messages.error(request, "Le projet spécifié n’existe pas.") + return redirect('projet-index') + + if request.method == "POST": + projet.delete() + messages.success(request, "Le projet a été supprimé avec succès.") + return redirect('projet-index') + +@login_required +def affecter_employe_projet(request, projet_id): + """Vue pour affecter un employé à un projet avec vérification des contraintes d'affectation""" + try: + projet = Projet.objects.get(id=projet_id) + except Projet.DoesNotExist: + messages.error(request, "Le projet spécifié n’existe pas.") + return redirect('projet-index') + + if request.method == 'POST': + form = AffectationForm(request.POST) + if form.is_valid(): + employe = Employe.objects.get(id=form.cleaned_data['employe'].id) + date_fin_affectation = form.cleaned_data['date_fin_daffectation'] + temps_nouveau = form.cleaned_data['temps_affectation'] + date_affectation = form.cleaned_data['date_affectation'] + + if (date_fin_affectation and date_affectation): + total_affectation = ( + Affectation.objects.filter(employe=employe) + .aggregate(total_pourcentage_affectation=Sum('temps_affectation')) + ['total_pourcentage_affectation'] or 0 + ) + if (date_fin_affectation < date_affectation): + messages.warning(request, "La date de fin d'affectation ne peut pas être antérieure à la date de début.") + return redirect('projet-index') + elif date_fin_affectation > projet.date_fin: + messages.warning(request, f"La date de fin de l'affectation ({date_fin_affectation}) ne peut pas dépasser la date de fin du projet ({projet.date_fin}).") + return redirect('projet-index') + elif total_affectation + temps_nouveau > 100: + messages.warning( + request, + f"Les pourcentages d'affectation de l'employé {employe.first_name} {employe.last_name} dépasse 100% sur les différents projets ({total_affectation + temps_nouveau}%)." + ) + return redirect('projet-index') + + Affectation.objects.update_or_create( + projet=projet, + employe=employe, + defaults={ + 'date_affectation': form.cleaned_data['date_affectation'], + 'date_fin_daffectation': date_fin_affectation, + 'role': form.cleaned_data['role'], + 'temps_affectation': temps_nouveau + } + ) + form = AffectationForm(initial={'projet': projet}) + messages.error(request, "Erreur : Formulaire non valide.") + return redirect('projet-index') + +def modifier_financement_projet(request, financement_id): + try: + financement = FinancementProjet.objects.get(id=financement_id) + except FinancementProjet.DoesNotExist: + messages.error(request, "Le financement spécifié n’existe pas.") + return redirect('projet-index') + projet = financement.projet + if request.method == 'POST': + try: + nouveau_pourcentage = Decimal(request.POST.get('pourcentage', '0')) + except InvalidOperation: + messages.error(request, "Le pourcentage saisi est invalide.") + return redirect('projet-index') + pourcentage_total_financement = ( + FinancementProjet.objects.filter(projet=projet) + .exclude(id=financement.id) + .aggregate(total_financement=Sum('pourcentage'))['pourcentage_total_financement'] or 0 + ) + if pourcentage_total_financement + nouveau_pourcentage > 100: + messages.error(request, f"Le total des financements dépasse 100% ({pourcentage_total_financement + nouveau_pourcentage}%).") + return redirect('projet-index') + financement.pourcentage = nouveau_pourcentage + financement.save() + messages.success(request, "Financement modifié avec succès.") + return redirect('projet-index') + +@login_required +def activites_projet(request): + try: + employe = Employe.objects.get(user=request.user) + except Employe.DoesNotExist: + messages.error(request, "Impossible d'accéder au menu 'Suivi des activités' car votre profil Utilisateur n'est lié à aucun profil Employe. Veuillez contacter l'administrateur.") + return redirect("gestion_conges:conge") + + try: + Affectation.objects.get(employe=employe, date_fin_daffectation__gte = timezone.now().date(), role='chef_projet') + except Affectation.DoesNotExist : + messages.error(request, "Seuls les chefs de projet ont accès à l'onglet 'Suivi des Activités'") + return redirect("gestion_conges:conge") + + projet = Affectation.objects.filter(employe=employe, role='chef_projet', date_fin_daffectation__gte=timezone.now().date()).select_related('projet').first() + if projet : + context = { + **model_to_dict(projet), + "nom_projet": projet.projet.nom_projet, + "budget_total": projet.projet.budget, + "budget_RH": projet.projet.budget_RH, + "form_ajout_activite": ActiviteProjetForm(), + "form_ajout_document": DocumentProjetForm(), + "form_ajout_livrable": LivrablesLivresForm(), + } + else : + context = { + "form_ajout_activite": ActiviteProjetForm(), + "form_ajout_document": DocumentProjetForm(), + "form_ajout_livrable": LivrablesLivresForm(), + } + return render(request, 'gestion_projet/suivi_activite.html', context) + +@login_required +def ajouter_activite_projet(request): + """Vue pour ajouter une activité à un projet spécifique via un formulaire""" + employe = Employe.objects.get(user=request.user) + projet = Affectation.objects.filter(employe=employe, role='chef_projet', date_fin_daffectation__gte=timezone.now().date()).select_related('projet').first() + + if request.method == "POST": + form = ActiviteProjetForm(request.POST) + if form.is_valid(): + activite = form.save(commit=False) + activite.projet = projet.projet + activite.budget_depense = request.POST["budget_prevu"] + activite.save() + messages.success(request, "Activité ajoutée avec succès !") + else: + messages.error(request, "Erreur : vérifiez les informations saisies.") + return redirect('gestion_projet:activites-projet') + +@login_required +def liste_activites_projet(request): + """Vue pour retourner la liste des activités d'un projet spécifique""" + employe = Employe.objects.get(user=request.user) + projet = Affectation.objects.filter(employe=employe, role='chef_projet', date_fin_daffectation__gte=timezone.now().date()).select_related('projet').first() + if projet: + activites = ActiviteProjet.objects.filter(projet_id=projet.projet.id_projet).order_by('-date_debut') + else: + activites = [] + data = [] + for a in activites: + data.append({ + "id": a.id, + "titre": a.titre, + "date_debut": a.date_debut, + "date_fin": a.date_fin, + "statut": a.statut, + "budget_prevu": a.budget_prevu, + "budget_depense": a.budget_depense, + "motif_changement_budget": a.motif_changement_budget, + "besoin_ressource_materielle": a.besoin_ressource_materielle, + "description": a.description, + }) + return JsonResponse(data, safe=False) + +@login_required +def liste_livrables_activite(request, activite_id): + """Vue pour retourner la liste des livrables attendus d'une activité spécifique""" + livrables = LivrablesLivres.objects.filter(activite__id=activite_id) + data = [] + for livrable in livrables: + print(livrable.fichier.url) + data.append({ + "titre": livrable.nom, + "lien": livrable.fichier.url if livrable.fichier else "", + }) + return JsonResponse(data, safe=False) + +@login_required +def mises_a_jour_depense_activite(request): + """Vue pour retourner la liste des activités d'un projet spécifique avec leurs dépenses mises à jour""" + if request.method == "POST": + activite_id = request.POST.get("id_activite") + budget_depense = request.POST.get("budget_depense") + motif = request.POST.get("motif", "").strip() + try: + activite = ActiviteProjet.objects.get(id=activite_id) + activite.budget_depense = Decimal(budget_depense) + if Decimal(budget_depense) != activite.budget_prevu: + activite.motif_changement_budget = motif + else: + activite.motif_changement_budget = "" + activite.save() + messages.success(request, f"Dépenses mises à jour pour l’activité '{activite.titre}'.") + except (ActiviteProjet.DoesNotExist, InvalidOperation): + messages.error(request, "Erreur lors de la mise à jour des dépenses.") + return redirect("gestion_projet:activites-projet") + +@login_required +def ajouter_livrables_projet(request): + """Vue pour ajouter un livrable à une activité de projet spécifique via un formulaire""" + + if request.method == "POST": + form = LivrablesLivresForm(request.POST, request.FILES) + if form.is_valid(): + form.save() + messages.success(request, "Livrable ajouté avec succès !") + else: + messages.error(request, "Erreur : vérifiez les informations saisies.") + return redirect('gestion_projet:activites-projet') + +@login_required +def ajouter_document_projet(request): + """Ajoute un document à un projet""" + employe = Employe.objects.get(user=request.user) + projet = Affectation.objects.filter(employe=employe, role='chef_projet', date_fin_daffectation__gte=timezone.now().date()).select_related('projet').first() + if request.method == "POST": + form = DocumentProjetForm(request.POST, request.FILES) + if form.is_valid(): + document = form.save(commit=False) + document.projet = projet.projet + document.save() + messages.success(request, "Document ajouté avec succès !") + else: + messages.error(request, "Erreur : le document n’a pas pu être enregistré.") + return redirect('gestion_projet:activites-projet') + +def liste_documents_projet(request): + employe = Employe.objects.get(user=request.user) + projet = Affectation.objects.filter(employe=employe, role='chef_projet', date_fin_daffectation__gte=timezone.now().date()).select_related('projet').first() + if projet: + documents = DocumentProjet.objects.filter(projet__id_projet=projet.projet.id_projet) + else: + documents = [] + data = [] + for d in documents: + data.append({ + "nom_document": d.nom_document, + "numero": d.numero, + "date_validite": d.date_validite, + "lien_document": d.fichier.url if d.fichier else "", + }) + return JsonResponse(data, safe=False) + +def modifier_activite_projet(request, id): + """Vue pour modifier une activité de projet spécifique via un formulaire pré-rempli""" + try: + activite = ActiviteProjet.objects.get(id=id) + except ActiviteProjet.DoesNotExist: + messages.error(request, "L'activité spécifiée n’existe pas.") + return redirect('activites-projet') + if request.method == 'POST': + form = ActiviteProjetForm(request.POST, instance=activite) + if form.is_valid(): + activite.besoin_ressource_materielle = bool(request.POST.get("besoin_ressource_materielle")) + form.save() + messages.success(request, f"Activité « {activite.titre} » modifiée avec succès.") + else: + messages.error(request, "Erreur lors de la modification de l'activité.") + return redirect('activites-projet') + + form = ActiviteProjetForm(instance=activite) + return render( + request, + 'gestion_projet/activite.html', { + 'form': form, + 'activite': activite, + } + ) + +def annuler_activite_projet(request): + """Vue pour annuler une activité de projet spécifique après confirmation de l'utilisateur""" + print(request.POST) + if request.method != "POST": + messages.error(request, "Requête invalide.") + return redirect('gestion_projet:activites-projet') + try: + activite = ActiviteProjet.objects.get(id=request.POST.get('id_activite')) + except ActiviteProjet.DoesNotExist: + messages.error(request, "L'activité spécifiée n’existe pas.") + return redirect('gestion_projet:activites-projet') + if request.method == "POST": + activite.annuler = True + activite.motif_annulation = request.POST.get("motif_annulation", "").strip() + activite.save() + messages.success(request, f"L'activité '{activite.titre}' a été annulée avec succès.") + return redirect('gestion_projet:activites-projet') \ No newline at end of file diff --git a/gestion_salle/__init__.py b/gestion_salle/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/gestion_salle/__pycache__/__init__.cpython-310.pyc b/gestion_salle/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2b6bd3d19d8b865360825cd0d240bcd6e82c387 GIT binary patch literal 135 zcmd1j<>g`kg8!%1WrFC(AOaaM0yz#qT+9L_QW%06G#UL?G8BP?5yUSo{fzwFRQ=-o zqSPGyV9y{A{q)r0lFa literal 0 HcmV?d00001 diff --git a/gestion_salle/__pycache__/admin.cpython-310.pyc b/gestion_salle/__pycache__/admin.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..48553ba01c2a746aee5a2dab28ed86c120de5bab GIT binary patch literal 176 zcmd1j<>g`kg8!%1WjX=r#~=MaJDBftOvI*uti literal 0 HcmV?d00001 diff --git a/gestion_salle/__pycache__/admin.cpython-314.pyc b/gestion_salle/__pycache__/admin.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ddb3e7ddc28ec8e1a42095cf164312c2678aa2da GIT binary patch literal 198 zcmdPq=5wbGz z3M^o^NF0{@`6u>gJ3i0nK=S?m)-+^4IM|hxf)!~vCNN;oL5me4tidEkynqoFpGB3J zw1i^sld7P=I6LqA3*X%~^$lls1u0mOh64f%6&j#!tb|F3LBzwg4UdiQO6{DTIAUH; zITbj$DbkoJ)#=tM73WH|-fSKF3#A^m+Wo$yY+qrR(V!8&PUM|$tqgv!PL@~Km+~L6 z)O{b8{nH?*gD(#Z8DuzSHniQoxz}Coms~j{Ow6@^BPNgkG-jvMUT1vq$h3eX@dIiI BRM7wc literal 0 HcmV?d00001 diff --git a/gestion_salle/__pycache__/apps.cpython-314.pyc b/gestion_salle/__pycache__/apps.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b4cf1157b385f4e5a78d2664abe94b6435f18d04 GIT binary patch literal 467 zcmY*Vu}%U(5S_g{5J4asi4hA!Y`mDzXl0CvfkbGCSz>oEIpH9u$KAQR6m}HGZ}1mv z{1CsuY+_|)XM(ZST^9xff)Y<}S_sEfLe8Qs69=MqgEnOm4&(gG!#G`OLFb0EUA?8&@X3zscC!p#<2>LZOyaH|MS+TGwej}39 z>$Yjjz`t!gKTUZ(y<_@tf8Z#>^{@wcEmZHDthB6jTw4}~*M2-s>bi~TBbr9-H^#DJ iGIwIWbjsG1)Ys#i3O;Q@$Q#tYvV`nBZhwOce_g*EtaOtA literal 0 HcmV?d00001 diff --git a/gestion_salle/__pycache__/forms.cpython-310.pyc b/gestion_salle/__pycache__/forms.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54eaa024d28e2e0cbb0a33774e3bc08a034e3b03 GIT binary patch literal 1556 zcmZuxJ9FDc5Wd5U00~l*qKBQ=FliKIBC)pPi8Z!Ii3_QaRH4B@+@k~qz{z(&Y@u~p z{{vO-{2x-~XIz^~e?c>z@h)J=jBIf3>~eX zR1|7U_0Iy8uw&;0>E80#72a8o0t4sL0{0F7g6v~pi}t&602nF+c&2}eNohIyFn}=Q zB*E~~iwDRX!U&e|e+Xk(hLz4AeD%hTM<1=LAFXTuvo66p2D{O$-U)VlPgH5-8&{`! zE=(WNN+ckT>&p1;ex8+Pa4KqbqYgTO^vi{;vU#FDmB9>-g_c>FG*T9~f>e+hhv=G+ zD!4V1Wu;^uS;na@&V_Mjd8+k0EO1&?N~1O_#1)nB>L-Nj5M5-Acv#9({E8)WlzfS& zW-`}!^XeiOYK-SvXa=ndEpjodB2V?m;1dJ{R7^D>z`kX>&Bl}V!V}o6%SoPzauVa! zCy$$Pchgfb`*SNR&oLpR43dTLBCGXhtPCRC_)5H}GbO;dd3r2zGz|t@sp%X3y~zIpCpBZI;VY@BrobT?<|T2%eZJH5A#gqpp`|s;2APM zZ|@l#VfMPMeI24%>v7UUw~R!Y5MZA}x1`#0;NOpvUr6`<@CZK|_RhO#MQ8 zg6qxcsVu})OC|E@;q!w(rYAzv^d)WgOete}`~1Q<)KxCNqN#j7bGXmP)|k_8m5;c0 z?f4eAQ1ae8Znx{dSKD}aKXTLr|J4r!KN67o(=EE)7U{?XB}5bWY=yU)&*qmpV26%T z5I3I!VV^m`5#4Tb!M(J>!%4$A#A)&%z_@%3p?0NwdYY=XENT;vnZeDNk*nKkEaYK|r@q0Z zLj=mU#aD1)M#-{|kOO+!h}G?VPQz*VoI10iEr39M%275WPk(?37Oz;IFS(@dCFolHaHPNZOU$I zT(`_zEehY#=3xC8I1hwzfr~`oz6pu@-9<%M)Ys?pP+TH@E)xlskeyf^?2|sC^=q54JU1LZp=>NZXFAB~R7rDE1o8_W$AB^B=*FsKvG zYn-ZiI$7XO(DkQu(}~=m1y=hU@&@?5dB)=Ul*+ct){*$VS?Wj_>c}}mv+ZIO>$@js znVeb1GpKisb7lilp8+JZ?tq`O3>)^q?-}&(DDde;+HYDWJzb2r(Ka<`jt>@-A5z=W z&2;`~!Au)EHPhEEYbHHVZ1NVlL31~IbaNKA@6+>6qn=kM-3YY^xQyQkGJ30^Gn#i~ zLz|?AqukN+)07tzTg(>A>n7~Kz|sTt4EX(-a3K?9Avjis%EBUO@UF84G>u@KNZpEC z0}RfzI6+l4wHd0aPFPiEtbD;hKdP#?3YxJw6I0bGo!Q*bO=?=I%JBL-GN5t0Q#v*B zHp6OhLg!$c!|uNgjY2j(H#kb~a*a{VQ7*Y@a{}Ifw4LaOmSs@Q97GbQ;Vh9g2b4u#XhXt;0`n`p))`T?VbP$A(76&Qbd&w`RvK4U-|y zOj8>*Om%B&3{S@HoxSHsSZNG36t&k5fnq!qs!g49^6x&O<(zL$`8nD?e`GPckX>$D zXGG9)d1|I? zeNlere&xWI)oA?D~BAD~S)*8Upd~Twtw9NbY^n*8RM#yPD{zwj8g< z+h4@Hp2xeErpu>>OMT^wTDfPk63=Y}q-1z5vKHPMka>N;HxYIMQo`OsgK55yQP@Eo z971y#%@H&%Ad4QNyr7flL3i^E7K@D)`B3=F*D8nq5Wsjq#O!DQSiShHn_%ktN+&je z5w~@^^IHa_Q-qmanj6gcKvex8suGd2exhtO1ZWal;uatw9wcE9q6iAnRKb2ljf#!u zQB%_SLYm<;OTgj`^_V5mw4=d>F`Dr+lvlP7O(z;JaiLuk=iQgHH#FwfKEqDxL~8nl z3+U|W(;vX8UXSgIOp{r3LX_n%%_x(KD_Tlr{pqI`I?61!Y&PCy;R zm9IYb5|0d^8;+9yTr;OF@A4|{g|@xh9XgMDtG^tocPzd?~cQ6jB>fLJU8mPpt2(4FTMZURhM&qV#{?|EB=1yQhBu)@LCW literal 0 HcmV?d00001 diff --git a/gestion_salle/__pycache__/models.cpython-310.pyc b/gestion_salle/__pycache__/models.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd3c17305619997d7522e2c6dff66510bdcf229a GIT binary patch literal 1534 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 YH1?}E&24cHPCh*I>6zaUv+eS~0D)~%(*OVf literal 0 HcmV?d00001 diff --git a/gestion_salle/__pycache__/urls.cpython-310.pyc b/gestion_salle/__pycache__/urls.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e7fda83cf44d4681aa3ea726ebbf0ae33591043 GIT binary patch literal 929 zcma))zmC&D5XN`?C+AD-gTzqKP$E+J+@sTp5*iAwK`F3Snjzp*~X9C)iVJQDOIVmtJ9g70!T}QQ0&s)Pq`oVJfA<`|a10{JN-F7>y1*MhXfHY0Jz@Zfqnu54>jUvSx8EH}_Zh@R8 zZk+f#_)|FcL}Y0Qi4(U?p>t_&p?5x!&ykNU*U^2$woy>^&>VSlgGv2B@sPh-sT^Pd z9AkolP7*W`HZ0rkA6X7QOzhDu^EjwSUNxZyjl`mFIL^#QUeJh*_2k^JEt8S4v7YqM z*^FMD9mI_k`5<-rg*(HliB#J{jvBb`Bv1^dA&*OXB-xgaQ7X#qe2ii#3QN_w0Ck?6H)pU@gO{ui)htwWwXI~={HHT6e>lhJeJzs2r!^lGRLq9N5s zBbIh=`hmcsiEGlod+f1>rq3Pt-|28I3W9J2?p=Y#59!V&yeWgyW(apfD1VkdNuk{O zy-_TcZz^1VOyzH|wScWqZbyzPciiWW_5!v;c`v!+{~aA3s=0v8%;9&}Irh2ZU;z(8 Txx){?ejz;EDtweY_Q?MLjY3;% literal 0 HcmV?d00001 diff --git a/gestion_salle/__pycache__/views.cpython-310.pyc b/gestion_salle/__pycache__/views.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..492714fa2d6a91f1d280708e2e8b9351819f970b GIT binary patch literal 6129 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 akl#L#olCz){4e3zR_ohV>klAVRR0AfjkXB@ literal 0 HcmV?d00001 diff --git a/gestion_salle/migrations/__pycache__/0003_alter_reservation_statut.cpython-310.pyc b/gestion_salle/migrations/__pycache__/0003_alter_reservation_statut.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..32a50e8fa882ba480dfc789338e8c41674906126 GIT binary patch literal 747 zcmY*XO>fgc5Z(1U@drdgJs=@CRH}sJOC146gjyj!C3dtny$2ynfEsHX5YGU$vjjre{%L13yRoN+9wT*G(x&_o`=BeEkQ*lJw zJfncD;J}Iic*zTa;d0~!aJ-C42H_75BN#(;At1gGbRvd?_^(5vlM;=WltyWd z?qE8dK9L>P?HcLFV7DG7l67mVIU)1jxH~(98yl-^Z?n+f02`^S#m3^-^i{LJ&54QD zN>_l``wM*Z`Oi!A_|S2SpZe}wTs2LvxA?Ko3GWj6^VI_inQ+l;(N;4wE&`mZUR&}{ zeU=)V(k_Tk2M1-NYINZcNAn6boMefM<$z1+Qb{)hQlk8>l;^$D{;aP6SJ(hHvkFZ| zkIh_qtSxr0eV0ynAbGh^o7$!A3b&7U$-0Nc4&l%He9_jJo3=xppS?SMo8K}#zj^bV ztbZz%m$>Ep#^1x$m(G7(W7=kqLd*gYUWcQA2Yio*f8*h@8uxg`kg8!%1WrFC(AOaaM0yz#qT+9L_QW%06G#UL?G8BP?5yUT3{fzwFRQ=-o zqSPGyV9y{A{q)r0lFaXQi(}&BGxIV_;^XxS hDsOSvy?*Sy~KYd}3x~WGrF^vH%u9DIfp< literal 0 HcmV?d00001 diff --git a/gestion_salle/models.py b/gestion_salle/models.py new file mode 100644 index 0000000..5d1d4e2 --- /dev/null +++ b/gestion_salle/models.py @@ -0,0 +1,33 @@ +from django.db import models +from gestion_employe.models import Employe + + +class Reservation(models.Model): + """Modèle de création des réservations""" + TYPE_CHOICES = [ + ('formation', 'Salle de formation'), + ('reunion', 'Salle de réunion'), + ('lien_zoom', 'Lien Zoom'), + ] + STATUT = [ + ('en_attente', 'En attente'), + ('validee', 'Validée'), + ('refusee', 'Refusée'), + ('annulee', 'Annulée'), + ] + + employe = models.ForeignKey(Employe, on_delete=models.CASCADE) + salle = models.CharField(max_length=100, choices=TYPE_CHOICES) + date_demande = models.DateTimeField(auto_now_add=True) + date_debut = models.DateField() + date_fin = models.DateField(blank=True,null=True) + heure_debut = models.TimeField() + heure_fin = models.TimeField() + besoin_zoom = models.BooleanField(default=False, verbose_name="Besoin d'un lien Zoom ?") + besoin_ordi = models.BooleanField(default=False, verbose_name="Besoin d'un ordinateur ?") + lien_zoom = models.URLField(blank=True, null=True, verbose_name="Lien Zoom") + motif_reservation = models.TextField() + statut = models.CharField(choices=STATUT, default='en_attente', max_length=25) + + def __str__(self): + return f"{self.salle} - {self.employe.user.first_name} {self.employe.user.last_name} le {self.date_reservation}" \ No newline at end of file diff --git a/gestion_salle/static/gestion_salle/js/index.js b/gestion_salle/static/gestion_salle/js/index.js new file mode 100644 index 0000000..8b5bff8 --- /dev/null +++ b/gestion_salle/static/gestion_salle/js/index.js @@ -0,0 +1,193 @@ +const $ = (element) => document.getElementById(element); +const { Schedule } = calendarjs; + +let dateAUtiliser = new Date().toISOString().split('T')[0]; +let currentReservationId = null; + +const calendrier = Schedule(document.getElementById('planning-reservation'), { + type: 'weekdays', + value: dateAUtiliser, + validRange: ['08:00', '18:00'], + ondblclick: function(self, event) { + const modal = new bootstrap.Modal($("modalDetailReservation")); + modal.show(); + fetch (`/gestion-salle/revervation/details/${event.guid}`) + .then(response => response.json()) + .then(data => { + currentReservationId = data.id_reservation; + console.log(data); + $("id_reservation_detail").value = data.id_reservation; + $("id_reservation_refus").value = data.id_reservation; + $("id_reservation_zoom").value = data.id_reservation; + $("employe").value=data.employe; + $("salle").value=data.salle; + $("statut-reservation").innerHTML=data.statut; + $("date_evenement").value=data.date_evenement; + $("heure_debut").value=data.heure_debut; + $("heure_fin").value=data.heure_fin; + $("motif_reservation").value=data.motif_reservation; + $("besoin_zoom").checked=data.besoin_zoom; + $("besoin_ordinateur").checked=data.besoin_ordinateur; + $("lien_zoom").value=data.lien_zoom; + + if(data.statut !== "annulee"){ + $("motif_refus_container").className = "d-none"; + }else{ + $("motif_refus").value=data.motif_refus; + } + }) + } +}); + +$("modalReservation").addEventListener('shown.bs.modal', (e) => { + $("id_salle").value = $("liste-salle").value; +}) + +$('semaineDate').addEventListener('change', () => { + calendrier.value = $('semaineDate').value; + calendrier.render(); +}) + +evenement_defini = null + +$("liste-salle").addEventListener("change", (e) => { + if(evenement_defini === null){ + evenement_defini = calendrier.getData(); + } + evenements = evenement_defini; + evenement_filtrer = evenements.filter((evenement) => { + if(evenement.title == $("liste-salle").value){ + return evenement + } + }) + calendrier.setData(evenement_filtrer); +}) + +function chargement_evenement(){ + const url = $("planning-reservation").dataset.url; + fetch (url) + .then(response => response.json()) + .then(data => { + calendrier.setData(data); + }) +} + +document.addEventListener("DOMContentLoaded", function () { + chargement_evenement() +}) + +$("bouton-annuler").addEventListener("click", (e) => { + const csrf = document.querySelector("[name=csrfmiddlewaretoken]").value; + const url_annuler = $("formulaire-details").dataset.urlannuler; + + fetch( + url_annuler, + { + method: "POST", + headers: { + "X-Requested-With": "XMTHttpRequest", + "X-CSRFToken": csrf + }, + body: new FormData($("formulaire-details")) + } + ) + .then(response => response.json()) + .then(data => console.log(data)) +}) + +if($("bouton-valider")){ + $("bouton-valider").addEventListener("click", (e) => { + const csrf = document.querySelector("[name=csrfmiddlewaretoken]").value; + const urlvalider = $("formulaire-details").dataset.urlvalider; + + fetch( + urlvalider, + { + method: "POST", + headers: { + "X-Requested-With": "XMTHttpRequest", + "X-CSRFToken": csrf + }, + body: new FormData($("formulaire-details")) + } + ) + .then(response => response.json()) + .then(data => console.log(data)) + }) +} + +if($("ajoutZoom")){ + $("ajoutZoom").addEventListener("click", (e) => { + e.preventDefault(); + bootstrap.Modal.getOrCreateInstance($("modalDetailReservation")).hide(); + new bootstrap.Modal($("modalZoom")).show(); + }) +} + +if($("refuserReservation")){ + $("refuserReservation").addEventListener("click", (e) => { + const csrf = document.querySelector("[name=csrfmiddlewaretoken]").value; + const url = e.currentTarget.dataset.lienrefus; + const idRes = $("id_reservation_detail").value; + + fetch(url, { + method: "POST", + headers: { + "Content-Type": "application/json", + "X-Requested-With": "XMLHttpRequest", + "X-CSRFToken": csrf + }, + body: JSON.stringify({ "id_reservation": idRes }) + }) + .then(response => response.json()) + .then(data => alert(data.message)) + .catch(error => console.error("Erreur:", error)); + }); +} + +const tableau_reservation_attente = new Tabulator("#tableau-reservation-attente", { + columns: [ + {title: "Employé", field: "employe"}, + {title: "Salle", field: "salle"}, + {title: "Date de l'evenement", field: "date_debut"}, + {title: "Heure de début", field: "heure_debut"}, + {title: "Heure de fin", field: "heure_fin"}, + {title: "Motif de reservation", field: "motif_reservation"}, + ], + placeholder: "Aucune reservation en attente.", + ajaxURL : $("tableau-reservation-attente").dataset.reservationattentes +}) + +tableau_reservation_attente.on("rowClick", (row, rowData) => { + const data = rowData.getData(); + + console.log(data); + + if(data.besoin_zoom === false){ + $("lien_zoom_container").className = 'd-none'; + } + + if(data.statut !== "refusee"){ + $("motif_refus_container").className = 'd-none'; + } + + $("id_reservation_detail").value = data.id; + $("id_reservation_refus").value = data.id; + $("id_reservation_zoom").value = data.id; + + $("employe").value=data.employe; + $("salle").value=data.salle; + $("statut-reservation").innerHTML=data.statut; + $("date_evenement").value=data.date_debut; + $("heure_debut").value=data.heure_debut; + $("heure_fin").value=data.heure_fin; + $("motif_reservation").value=data.motif_reservation; + $("besoin_zoom").checked=data.besoin_zoom; + $("besoin_ordinateur").checked=data.besoin_ordi; + $("lien_zoom").value=data.lien_zoom; + $("motif_refus").value=data.motif_refus; + + const modal = new bootstrap.Modal($("modalDetailReservation")); + bootstrap.Modal.getOrCreateInstance($("modalReservationAttente")).hide(); + modal.show(); +}) \ No newline at end of file diff --git a/gestion_salle/templates/gestion_salle/index.html b/gestion_salle/templates/gestion_salle/index.html new file mode 100644 index 0000000..b0fa88e --- /dev/null +++ b/gestion_salle/templates/gestion_salle/index.html @@ -0,0 +1,59 @@ +{% extends "BASE.html" %} +{% load static %} +{% block 'titre_page' %} Gestion des projets {% endblock %} +{% block 'css' %} + + +{% endblock %} +{% block 'contenu' %} + {% if messages %} + {% for message in messages %} + + {% endfor %} + {% endif %} +
+
+

Reservation de salle

+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+{% endblock %} +{% block 'modal' %} + {% include 'gestion_salle/parts/modalCreationReservation.html' %} + {% include 'gestion_salle/parts/ModaleAjoutLienZoom.html' %} + {% include 'gestion_salle/parts/ModalRefusReservation.html' %} + {% include 'gestion_salle/parts/modalDetailResevation.html' %} + {% include 'gestion_salle/parts/modalListeValidation.html' %} +{% endblock %} +{% block 'js' %} + + + +{% endblock %} \ No newline at end of file diff --git a/gestion_salle/templates/gestion_salle/parts/ModalRefusReservation.html b/gestion_salle/templates/gestion_salle/parts/ModalRefusReservation.html new file mode 100644 index 0000000..96d358d --- /dev/null +++ b/gestion_salle/templates/gestion_salle/parts/ModalRefusReservation.html @@ -0,0 +1,22 @@ + \ No newline at end of file diff --git a/gestion_salle/templates/gestion_salle/parts/ModaleAjoutLienZoom.html b/gestion_salle/templates/gestion_salle/parts/ModaleAjoutLienZoom.html new file mode 100644 index 0000000..0c7c534 --- /dev/null +++ b/gestion_salle/templates/gestion_salle/parts/ModaleAjoutLienZoom.html @@ -0,0 +1,26 @@ + + \ No newline at end of file diff --git a/gestion_salle/templates/gestion_salle/parts/modalCreationReservation.html b/gestion_salle/templates/gestion_salle/parts/modalCreationReservation.html new file mode 100644 index 0000000..0db15f8 --- /dev/null +++ b/gestion_salle/templates/gestion_salle/parts/modalCreationReservation.html @@ -0,0 +1,23 @@ + + \ No newline at end of file diff --git a/gestion_salle/templates/gestion_salle/parts/modalDetailResevation.html b/gestion_salle/templates/gestion_salle/parts/modalDetailResevation.html new file mode 100644 index 0000000..fb84ee8 --- /dev/null +++ b/gestion_salle/templates/gestion_salle/parts/modalDetailResevation.html @@ -0,0 +1,71 @@ + + \ No newline at end of file diff --git a/gestion_salle/templates/gestion_salle/parts/modalListeValidation.html b/gestion_salle/templates/gestion_salle/parts/modalListeValidation.html new file mode 100644 index 0000000..0f50e01 --- /dev/null +++ b/gestion_salle/templates/gestion_salle/parts/modalListeValidation.html @@ -0,0 +1,16 @@ + + \ No newline at end of file diff --git a/gestion_salle/tests.py b/gestion_salle/tests.py new file mode 100644 index 0000000..de8bdc0 --- /dev/null +++ b/gestion_salle/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/gestion_salle/urls.py b/gestion_salle/urls.py new file mode 100644 index 0000000..d13ee3e --- /dev/null +++ b/gestion_salle/urls.py @@ -0,0 +1,48 @@ +from django.urls import path +from . import views + +app_name = "gestion_salle" + +urlpatterns = [ + path( + 'revervation/', + views.index, + name='reservation-salle' + ), + path( + 'revervation/details/', + views.detail_reservation, + name='detail-reservation' + ), + + path( + 'reservation/annuler', + views.annuler_reservation, + name='annuler-reservation' + ), + path( + 'reservation/valider', + views.valider_reservation, + name='valider-reservation' + ), + path( + 'reservation/refuser', + views.refuser_reservation, + name='refuser-reservation' + ), + path( + 'reservation/ajout-de-lien-zoom', + views.ajouter_lien_zoom, + name='ajouter-lien_zoom' + ), + path( + 'liste-reservation', + views.liste_reservation, + name='liste-reservation' + ), + path( + 'liste-reservation-attente', + views.liste_reservation_attente, + name="liste-reservation-attente" + ) +] \ No newline at end of file diff --git a/gestion_salle/views.py b/gestion_salle/views.py new file mode 100644 index 0000000..de589cf --- /dev/null +++ b/gestion_salle/views.py @@ -0,0 +1,195 @@ +import json +from datetime import timedelta +from django.contrib import messages +from django.contrib.auth.decorators import login_required +from django.shortcuts import redirect, render +from django.http import JsonResponse, HttpRequest +from django.forms import model_to_dict +from gestion_employe.models import Employe +from gestion_salle.forms import ReservationForm +from .models import Reservation + +@login_required +def index(request:HttpRequest): + """Vue de gestion de la reservation de la salle""" + try: + employe = Employe.objects.get(user=request.user) + except Employe.DoesNotExist: + messages.error(request, "Impossible d'accéder au menu 'Reservation de salle' car votre profil Utilisateur n'est lié à aucun profil Employe. Veuillez contacter l'administrateur.") + return redirect('gestion_conges:conge') + + if request.method == "POST": + form = ReservationForm(request.POST) + if form.is_valid(): + date_debut = form.cleaned_data.get('date_debut') + date_fin = form.cleaned_data.get('date_fin') + salle = form.cleaned_data.get('salle') + heure_debut = form.cleaned_data.get('heure_debut') + heure_fin = form.cleaned_data.get('heure_fin') + motif_reservation = form.cleaned_data.get('motif_reservation') + besoin_zoom = form.cleaned_data.get('besoin_zoom') + besoin_ordi = form.cleaned_data.get('besoin_ordi') + + while date_debut <= date_fin : + reservation = Reservation( + employe = employe, + date_debut = date_debut, + date_fin = date_debut, + salle = salle, + heure_debut = heure_debut, + heure_fin = heure_fin, + besoin_zoom = besoin_zoom, + besoin_ordi = besoin_ordi, + motif_reservation=motif_reservation, + ) + reservation.save() + date_debut = date_debut + timedelta(days=1) + + messages.success(request, "Réservation(s) créées avec succès.") + return redirect('gestion_salle:reservation-salle') + + formulaire_reservation = ReservationForm() + departement = Employe.objects.get(user__username=request.user).departement + appartient_direction = 'direction' in request.user.groups.values_list('name', flat=True) + liste_demande_reservation = [ + reservation.id for reservation in + Reservation.objects.filter(employe=employe, statut='en_attente') + ] + + context = { + 'formulaire_reservation': formulaire_reservation, + 'nb_reservation_attente': Reservation.objects.filter(statut='en_attente').count(), + 'appartient_au_departement_informatique': 'Informatique' == departement.nom if departement else False, + 'appartient_direction': appartient_direction, + 'liste_demande_reservation': liste_demande_reservation + } + return render(request, "gestion_salle/index.html", context) + +def liste_reservation(request:HttpRequest): + """Vue d'affichage des creneaux disponibles""" + reservations = Reservation.objects.filter(statut = "validee") + liste_reservation = [] + for reservation in reservations: + color = None + if reservation.statut == "en_attente": + color = "#ffc107" + elif reservation.statut == "validee": + color = "#198754" + else: + color = "#dc3545" + + liste_reservation.append({ + "guid": reservation.pk, + "title": dict(Reservation.TYPE_CHOICES).get(reservation.salle), + "date": reservation.date_debut, + "start": reservation.heure_debut, + "end": reservation.heure_fin, + "color": color, + }) + + return JsonResponse(liste_reservation, safe=False) + +@login_required +def liste_reservation_attente(request): + reservations = Reservation.objects.filter(statut="en_attente") + liste_reservation = [ + { + **model_to_dict(reservation), + "employe": f"{reservation.employe.user.first_name} {reservation.employe.user.last_name}", + "salle": dict(Reservation.TYPE_CHOICES).get(reservation.salle) + } for reservation in reservations + ] + + return JsonResponse(liste_reservation, safe=False) + +def detail_reservation(request:HttpRequest, reservation_id:int): + reservation = Reservation.objects.get(id=reservation_id) + employe = reservation.employe.user + reservation_json = { + 'id_reservation': reservation_id, + 'employe': f"{employe.first_name} {employe.last_name}", + 'salle': reservation.salle, + 'statut': reservation.statut, + 'date_evenement': reservation.date_debut.strftime('%Y-%m-%d'), + 'heure_debut': reservation.heure_debut.strftime('%H:%M'), + 'heure_fin': reservation.heure_fin.strftime('%H:%M'), + 'motif_reservation': reservation.motif_reservation, + 'besoin_zoom': reservation.besoin_zoom, + 'besoin_ordinateur': reservation.besoin_ordi, + 'lien_zoom': reservation.lien_zoom or '', + 'motif_refus': reservation.motif_refus or '', + } + + return JsonResponse(reservation_json, safe=True) + +@login_required +def ajouter_lien_zoom(request:HttpRequest): + """Vue de gestion de l'ajout du lien zoom""" + if request.method == 'POST': + reservation_id= request.POST['id_reservation'] + try: + reservation = Reservation.objects.get(id=reservation_id) + except reservation.DoesNotExist: + messages.error(request, "La resevertion selectionné n'existe pas.") + return redirect("salle") + + if not (reservation.besoin_zoom or reservation.salle == "lien_zoom"): + messages.error(request, "Cette réservation ne nécessite pas de lien Zoom.") + return redirect('gestion_salle:reservation-salle') + elif reservation.statut in ["annulee", "refusee"]: + messages.error(request, "Le lien Zoom ne peut être ajouté pour les réservations annulée ou refusée.") + return redirect('gestion_salle:reservation-salle') + + if request.method == "POST": + lien = request.POST.get("lien_zoom") + reservation.lien_zoom = lien + reservation.statut = "validee" + reservation.save() + messages.success(request, "Le lien Zoom a été ajouté et la réservation a été validée. ") + return redirect('gestion_salle:reservation-salle') + +@login_required +def annuler_reservation(request:HttpRequest): + """Vue de gestion de l'annulation de la reservation""" + if request.method == 'POST': + reservation_id= request.POST['id_reservation'] + try: + reservation = Reservation.objects.get(id=reservation_id) + except Reservation.DoesNotExist: + messages.error(request, "La resevertion selectionné n'existe pas.") + return redirect("salle") + + reservation.statut = 'annulee' + reservation.save() + messages.success(request, "Votre réservation a été annulée.") + return redirect('gestion_salle:reservation-salle') + +@login_required +def valider_reservation(request:HttpRequest): + """Vue de gestion de l'annulation de la reservation""" + if request.method == 'POST': + reservation_id= request.POST['id_reservation'] + try: + reservation = Reservation.objects.get(id=reservation_id) + except reservation.DoesNotExist: + messages.error(request, "La resevertion selectionné n'existe pas.") + return redirect("salle") + + reservation.statut = 'validee' + reservation.save() + messages.success(request, f"Réservation de {reservation.employe.get_full_name()} validée avec succès.") + return redirect('gestion_salle:reservation-salle') + +@login_required +def refuser_reservation(request:HttpRequest): + """Vue de gestion de refus de la reservation""" + data = json.loads(request.body) + reservation_id = data.get("id_reservation") + try: + reservation = Reservation.objects.get(id=reservation_id) + except Reservation.DoesNotExist and ValueError: + return JsonResponse({"message": "La resevertion selectionné n'existe pas."}) + else: + reservation.statut = "refusee" + reservation.save() + return JsonResponse({"message": "Réservation refusée avec succès."}) \ No newline at end of file diff --git a/manage.py b/manage.py new file mode 100644 index 0000000..98b1355 --- /dev/null +++ b/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'SIRH.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..c683890 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,152 @@ +anyio==4.13.0 +argon2-cffi==25.1.0 +argon2-cffi-bindings==25.1.0 +arrow==1.4.0 +asgiref==3.11.0 +asttokens==3.0.1 +async-lru==2.3.0 +attrs==26.1.0 +Automat==20.2.0 +babel==2.18.0 +bcrypt==3.2.0 +beautifulsoup4==4.14.3 +bleach==6.3.0 +blinker==1.4 +certifi==2026.2.25 +cffi==2.0.0 +chardet==4.0.0 +charset-normalizer==3.4.7 +click==8.0.3 +cloud-init==25.3 +colorama==0.4.4 +comm==0.2.3 +command-not-found==0.3 +configobj==5.0.6 +constantly==15.1.0 +cryptography==3.4.8 +dbus-python==1.2.18 +debugpy==1.8.20 +decorator==5.2.1 +defusedxml==0.7.1 +distlib==0.4.0 +distro==1.7.0 +distro-info==1.1+ubuntu0.2 +Django==5.2.10 +et_xmlfile==2.0.0 +exceptiongroup==1.3.1 +executing==2.2.1 +fastjsonschema==2.21.2 +filelock==3.20.3 +fqdn==1.5.1 +h11==0.16.0 +httpcore==1.0.9 +httplib2==0.20.2 +httpx==0.28.1 +hyperlink==21.0.0 +idna==3.3 +importlib-metadata==4.6.4 +incremental==21.3.0 +ipykernel==7.2.0 +ipython==8.39.0 +isoduration==20.11.0 +jedi==0.19.2 +jeepney==0.7.1 +Jinja2==3.0.3 +json5==0.14.0 +jsonpatch==1.32 +jsonpointer==2.0 +jsonschema==4.26.0 +jsonschema-specifications==2025.9.1 +jupyter-events==0.12.0 +jupyter-lsp==2.3.1 +jupyter_client==8.8.0 +jupyter_core==5.9.1 +jupyter_server==2.17.0 +jupyter_server_terminals==0.5.4 +jupyterlab==4.5.6 +jupyterlab_pygments==0.3.0 +jupyterlab_server==2.28.0 +keyring==23.5.0 +lark==1.3.1 +launchpadlib==1.10.16 +lazr.restfulclient==0.14.4 +lazr.uri==1.0.6 +MarkupSafe==2.0.1 +matplotlib-inline==0.2.1 +mistune==3.2.0 +more-itertools==8.10.0 +nbclient==0.10.4 +nbconvert==7.17.0 +nbformat==5.10.4 +nest-asyncio==1.6.0 +netifaces==0.11.0 +notebook_shim==0.2.4 +numpy==2.2.6 +oauthlib==3.2.0 +openpyxl==3.1.5 +overrides==7.7.0 +packaging==26.0 +pandas==2.3.3 +pandocfilters==1.5.1 +parso==0.8.6 +pexpect==4.9.0 +platformdirs==4.5.1 +prometheus_client==0.24.1 +prompt_toolkit==3.0.52 +psutil==7.2.2 +ptyprocess==0.7.0 +pure_eval==0.2.3 +pyasn1==0.4.8 +pyasn1-modules==0.2.1 +pycparser==3.0 +pycurl==7.44.1 +Pygments==2.20.0 +PyGObject==3.42.1 +PyHamcrest==2.0.2 +PyJWT==2.3.0 +pyOpenSSL==21.0.0 +pyparsing==2.4.7 +pyrsistent==0.18.1 +pyserial==3.5 +python-apt==2.4.0+ubuntu4.1 +python-dateutil==2.9.0.post0 +python-json-logger==4.1.0 +pytz==2022.1 +PyYAML==5.4.1 +pyzmq==27.1.0 +referencing==0.37.0 +requests==2.33.1 +rfc3339-validator==0.1.4 +rfc3986-validator==0.1.1 +rfc3987-syntax==1.1.0 +rpds-py==0.30.0 +SecretStorage==3.3.1 +Send2Trash==2.1.0 +service-identity==18.1.0 +six==1.16.0 +soupsieve==2.8.3 +sqlparse==0.5.5 +ssh-import-id==5.11 +stack-data==0.6.3 +systemd-python==234 +terminado==0.18.1 +tinycss2==1.4.0 +tomli==2.4.1 +tornado==6.5.5 +traitlets==5.14.3 +Twisted==22.1.0 +typing_extensions==4.15.0 +tzdata==2025.3 +ubuntu-pro-client==8001 +ufw==0.36.1 +unattended-upgrades==0.1 +uri-template==1.3.0 +urllib3==1.26.5 +virtualenv==20.13.0+ds +wadllib==1.3.6 +wcwidth==0.6.0 +webcolors==25.10.0 +webencodings==0.5.1 +websocket-client==1.9.0 +zipp==1.0.0 +zope.interface==5.4.0 diff --git a/static/css/bootstrap.min.css b/static/css/bootstrap.min.css new file mode 100644 index 0000000..955575a --- /dev/null +++ b/static/css/bootstrap.min.css @@ -0,0 +1,6 @@ +@charset "UTF-8";/*! + * Bootstrap v5.3.7 (https://getbootstrap.com/) + * Copyright 2011-2025 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root,[data-bs-theme=light]{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-primary-text-emphasis:#052c65;--bs-secondary-text-emphasis:#2b2f32;--bs-success-text-emphasis:#0a3622;--bs-info-text-emphasis:#055160;--bs-warning-text-emphasis:#664d03;--bs-danger-text-emphasis:#58151c;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#cfe2ff;--bs-secondary-bg-subtle:#e2e3e5;--bs-success-bg-subtle:#d1e7dd;--bs-info-bg-subtle:#cff4fc;--bs-warning-bg-subtle:#fff3cd;--bs-danger-bg-subtle:#f8d7da;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#9ec5fe;--bs-secondary-border-subtle:#c4c8cb;--bs-success-border-subtle:#a3cfbb;--bs-info-border-subtle:#9eeaf9;--bs-warning-border-subtle:#ffe69c;--bs-danger-border-subtle:#f1aeb5;--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-color-rgb:33,37,41;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:rgba(33, 37, 41, 0.75);--bs-secondary-color-rgb:33,37,41;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233,236,239;--bs-tertiary-color:rgba(33, 37, 41, 0.5);--bs-tertiary-color-rgb:33,37,41;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248,249,250;--bs-heading-color:inherit;--bs-link-color:#0d6efd;--bs-link-color-rgb:13,110,253;--bs-link-decoration:underline;--bs-link-hover-color:#0a58ca;--bs-link-hover-color-rgb:10,88,202;--bs-code-color:#d63384;--bs-highlight-color:#212529;--bs-highlight-bg:#fff3cd;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg:0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width:0.25rem;--bs-focus-ring-opacity:0.25;--bs-focus-ring-color:rgba(13, 110, 253, 0.25);--bs-form-valid-color:#198754;--bs-form-valid-border-color:#198754;--bs-form-invalid-color:#dc3545;--bs-form-invalid-border-color:#dc3545}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color:#dee2e6;--bs-body-color-rgb:222,226,230;--bs-body-bg:#212529;--bs-body-bg-rgb:33,37,41;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb:222,226,230;--bs-secondary-bg:#343a40;--bs-secondary-bg-rgb:52,58,64;--bs-tertiary-color:rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb:222,226,230;--bs-tertiary-bg:#2b3035;--bs-tertiary-bg-rgb:43,48,53;--bs-primary-text-emphasis:#6ea8fe;--bs-secondary-text-emphasis:#a7acb1;--bs-success-text-emphasis:#75b798;--bs-info-text-emphasis:#6edff6;--bs-warning-text-emphasis:#ffda6a;--bs-danger-text-emphasis:#ea868f;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#031633;--bs-secondary-bg-subtle:#161719;--bs-success-bg-subtle:#051b11;--bs-info-bg-subtle:#032830;--bs-warning-bg-subtle:#332701;--bs-danger-bg-subtle:#2c0b0e;--bs-light-bg-subtle:#343a40;--bs-dark-bg-subtle:#1a1d20;--bs-primary-border-subtle:#084298;--bs-secondary-border-subtle:#41464b;--bs-success-border-subtle:#0f5132;--bs-info-border-subtle:#087990;--bs-warning-border-subtle:#997404;--bs-danger-border-subtle:#842029;--bs-light-border-subtle:#495057;--bs-dark-border-subtle:#343a40;--bs-heading-color:inherit;--bs-link-color:#6ea8fe;--bs-link-hover-color:#8bb9fe;--bs-link-color-rgb:110,168,254;--bs-link-hover-color-rgb:139,185,254;--bs-code-color:#e685b5;--bs-highlight-color:#dee2e6;--bs-highlight-bg:#664d03;--bs-border-color:#495057;--bs-border-color-translucent:rgba(255, 255, 255, 0.15);--bs-form-valid-color:#75b798;--bs-form-valid-border-color:#75b798;--bs-form-invalid-color:#ea868f;--bs-form-invalid-border-color:#ea868f}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;border:0;border-top:var(--bs-border-width) solid;opacity:.25}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.1875em;color:var(--bs-highlight-color);background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,1));text-decoration:underline}a:hover{--bs-link-color-rgb:var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;line-height:inherit;font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-weight:300;line-height:1.2;font-size:calc(1.625rem + 4.5vw)}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-weight:300;line-height:1.2;font-size:calc(1.575rem + 3.9vw)}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-weight:300;line-height:1.2;font-size:calc(1.525rem + 3.3vw)}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-weight:300;line-height:1.2;font-size:calc(1.475rem + 2.7vw)}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-weight:300;line-height:1.2;font-size:calc(1.425rem + 2.1vw)}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-weight:300;line-height:1.2;font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--bs-body-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:var(--bs-secondary-color)}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-color-type:initial;--bs-table-bg-type:initial;--bs-table-color-state:initial;--bs-table-bg-state:initial;--bs-table-color:var(--bs-emphasis-color);--bs-table-bg:var(--bs-body-bg);--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-emphasis-color);--bs-table-striped-bg:rgba(var(--bs-emphasis-color-rgb), 0.05);--bs-table-active-color:var(--bs-emphasis-color);--bs-table-active-bg:rgba(var(--bs-emphasis-color-rgb), 0.1);--bs-table-hover-color:var(--bs-emphasis-color);--bs-table-hover-bg:rgba(var(--bs-emphasis-color-rgb), 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state,var(--bs-table-color-type,var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:var(--bs-border-width);box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state,var(--bs-table-bg-type,var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--bs-border-width) * 2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:var(--bs-border-width) 0}.table-bordered>:not(caption)>*>*{border-width:0 var(--bs-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(2n){--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-active{--bs-table-color-state:var(--bs-table-active-color);--bs-table-bg-state:var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state:var(--bs-table-hover-color);--bs-table-bg-state:var(--bs-table-hover-bg)}.table-primary{--bs-table-color:#000;--bs-table-bg:#cfe2ff;--bs-table-border-color:#a6b5cc;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#e2e3e5;--bs-table-border-color:#b5b6b7;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#d1e7dd;--bs-table-border-color:#a7b9b1;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#cff4fc;--bs-table-border-color:#a6c3ca;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#fff3cd;--bs-table-border-color:#ccc2a4;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f8d7da;--bs-table-border-color:#c6acae;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#f8f9fa;--bs-table-border-color:#c6c7c8;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#212529;--bs-table-border-color:#4d5154;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + var(--bs-border-width));padding-bottom:calc(.375rem + var(--bs-border-width));margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + var(--bs-border-width));padding-bottom:calc(.5rem + var(--bs-border-width));font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + var(--bs-border-width));padding-bottom:calc(.25rem + var(--bs-border-width));font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:var(--bs-secondary-color)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-clip:padding-box;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:var(--bs-body-color);background-color:var(--bs-body-bg);border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:var(--bs-secondary-color);opacity:1}.form-control:disabled{background-color:var(--bs-secondary-bg);opacity:1}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:var(--bs-secondary-bg)}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--bs-secondary-bg)}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:var(--bs-body-color);background-color:transparent;border:solid transparent;border-width:var(--bs-border-width) 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2));padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2))}textarea.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-control-color{width:3rem;height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color::-webkit-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon,none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:var(--bs-secondary-bg)}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--bs-body-color)}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-right:1.5em;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-1.5em;margin-left:0}.form-check-input{--bs-form-check-bg:var(--bs-body-bg);flex-shrink:0;width:1em;height:1em;margin-top:.25em;vertical-align:top;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:var(--bs-border-width) solid var(--bs-border-color);-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;-webkit-appearance:none;appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;-moz-appearance:none;appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--bs-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:var(--bs-secondary-color)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(var(--bs-border-width) * 2));min-height:calc(3.5rem + calc(var(--bs-border-width) * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;max-width:100%;height:100%;padding:1rem .75rem;overflow:hidden;color:rgba(var(--bs-body-color-rgb),.65);text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:var(--bs-border-width) solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem;padding-left:.75rem}.form-floating>.form-control-plaintext~label,.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>textarea:focus~label::after,.form-floating>textarea:not(:placeholder-shown)~label::after{position:absolute;inset:1rem 0.375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>textarea:disabled~label::after{background-color:var(--bs-secondary-bg)}.form-floating>.form-control-plaintext~label{border-width:var(--bs-border-width) 0}.form-floating>.form-control:disabled~label,.form-floating>:disabled~label{color:#6c757d}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-floating,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-floating:focus-within,.input-group>.form-select:focus{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);text-align:center;white-space:nowrap;background-color:var(--bs-tertiary-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius)}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select,.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select,.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(-1 * var(--bs-border-width));border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-valid-color)}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-success);border-radius:var(--bs-border-radius)}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:var(--bs-form-valid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:var(--bs-form-valid-border-color)}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-control-color.is-valid,.was-validated .form-control-color:valid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:var(--bs-form-valid-border-color)}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:var(--bs-form-valid-color)}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:var(--bs-form-valid-color)}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-valid,.input-group>.form-floating:not(:focus-within).is-valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-control:not(:focus):valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.was-validated .input-group>.form-select:not(:focus):valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-invalid-color)}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-danger);border-radius:var(--bs-border-radius)}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:var(--bs-form-invalid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:var(--bs-form-invalid-border-color)}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-control-color.is-invalid,.was-validated .form-control-color:invalid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:var(--bs-form-invalid-border-color)}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:var(--bs-form-invalid-color)}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:var(--bs-form-invalid-color)}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-invalid,.input-group>.form-floating:not(:focus-within).is-invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-control:not(:focus):invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.was-validated .input-group>.form-select:not(:focus):invalid{z-index:4}.btn{--bs-btn-padding-x:0.75rem;--bs-btn-padding-y:0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:var(--bs-body-color);--bs-btn-bg:transparent;--bs-btn-border-width:var(--bs-border-width);--bs-btn-border-color:transparent;--bs-btn-border-radius:var(--bs-border-radius);--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.15),0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity:0.65;--bs-btn-focus-box-shadow:0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,.btn.active,.btn.show,.btn:first-child:active,:not(.btn-check)+.btn:active{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible,.btn:first-child:active:focus-visible,:not(.btn-check)+.btn:active:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked:focus-visible+.btn{box-shadow:var(--bs-btn-focus-box-shadow)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0b5ed7;--bs-btn-hover-border-color:#0a58ca;--bs-btn-focus-shadow-rgb:49,132,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0a58ca;--bs-btn-active-border-color:#0a53be;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#0d6efd;--bs-btn-disabled-border-color:#0d6efd}.btn-secondary{--bs-btn-color:#fff;--bs-btn-bg:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5c636a;--bs-btn-hover-border-color:#565e64;--bs-btn-focus-shadow-rgb:130,138,145;--bs-btn-active-color:#fff;--bs-btn-active-bg:#565e64;--bs-btn-active-border-color:#51585e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#6c757d;--bs-btn-disabled-border-color:#6c757d}.btn-success{--bs-btn-color:#fff;--bs-btn-bg:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#157347;--bs-btn-hover-border-color:#146c43;--bs-btn-focus-shadow-rgb:60,153,110;--bs-btn-active-color:#fff;--bs-btn-active-bg:#146c43;--bs-btn-active-border-color:#13653f;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#198754;--bs-btn-disabled-border-color:#198754}.btn-info{--bs-btn-color:#000;--bs-btn-bg:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#31d2f2;--bs-btn-hover-border-color:#25cff2;--bs-btn-focus-shadow-rgb:11,172,204;--bs-btn-active-color:#000;--bs-btn-active-bg:#3dd5f3;--bs-btn-active-border-color:#25cff2;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#0dcaf0;--bs-btn-disabled-border-color:#0dcaf0}.btn-warning{--bs-btn-color:#000;--bs-btn-bg:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffca2c;--bs-btn-hover-border-color:#ffc720;--bs-btn-focus-shadow-rgb:217,164,6;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffcd39;--bs-btn-active-border-color:#ffc720;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#ffc107;--bs-btn-disabled-border-color:#ffc107}.btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#bb2d3b;--bs-btn-hover-border-color:#b02a37;--bs-btn-focus-shadow-rgb:225,83,97;--bs-btn-active-color:#fff;--bs-btn-active-bg:#b02a37;--bs-btn-active-border-color:#a52834;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#dc3545;--bs-btn-disabled-border-color:#dc3545}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d3d4d5;--bs-btn-hover-border-color:#c6c7c8;--bs-btn-focus-shadow-rgb:211,212,213;--bs-btn-active-color:#000;--bs-btn-active-bg:#c6c7c8;--bs-btn-active-border-color:#babbbc;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#f8f9fa;--bs-btn-disabled-border-color:#f8f9fa}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#424649;--bs-btn-hover-border-color:#373b3e;--bs-btn-focus-shadow-rgb:66,70,73;--bs-btn-active-color:#fff;--bs-btn-active-bg:#4d5154;--bs-btn-active-border-color:#373b3e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#212529;--bs-btn-disabled-border-color:#212529}.btn-outline-primary{--bs-btn-color:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0d6efd;--bs-btn-hover-border-color:#0d6efd;--bs-btn-focus-shadow-rgb:13,110,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0d6efd;--bs-btn-active-border-color:#0d6efd;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#0d6efd;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0d6efd;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#6c757d;--bs-btn-hover-border-color:#6c757d;--bs-btn-focus-shadow-rgb:108,117,125;--bs-btn-active-color:#fff;--bs-btn-active-bg:#6c757d;--bs-btn-active-border-color:#6c757d;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#6c757d;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#198754;--bs-btn-hover-border-color:#198754;--bs-btn-focus-shadow-rgb:25,135,84;--bs-btn-active-color:#fff;--bs-btn-active-bg:#198754;--bs-btn-active-border-color:#198754;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#198754;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#198754;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#0dcaf0;--bs-btn-hover-border-color:#0dcaf0;--bs-btn-focus-shadow-rgb:13,202,240;--bs-btn-active-color:#000;--bs-btn-active-bg:#0dcaf0;--bs-btn-active-border-color:#0dcaf0;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#0dcaf0;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0dcaf0;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffc107;--bs-btn-hover-border-color:#ffc107;--bs-btn-focus-shadow-rgb:255,193,7;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffc107;--bs-btn-active-border-color:#ffc107;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#ffc107;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffc107;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#dc3545;--bs-btn-hover-border-color:#dc3545;--bs-btn-focus-shadow-rgb:220,53,69;--bs-btn-active-color:#fff;--bs-btn-active-bg:#dc3545;--bs-btn-active-border-color:#dc3545;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#dc3545;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#dc3545;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f8f9fa;--bs-btn-hover-border-color:#f8f9fa;--bs-btn-focus-shadow-rgb:248,249,250;--bs-btn-active-color:#000;--bs-btn-active-bg:#f8f9fa;--bs-btn-active-border-color:#f8f9fa;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#f8f9fa;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#f8f9fa;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#212529;--bs-btn-hover-border-color:#212529;--bs-btn-focus-shadow-rgb:33,37,41;--bs-btn-active-color:#fff;--bs-btn-active-bg:#212529;--bs-btn-active-border-color:#212529;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#212529;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#212529;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:0 0 0 #000;--bs-btn-focus-shadow-rgb:49,132,253;text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-group-lg>.btn,.btn-lg{--bs-btn-padding-y:0.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:var(--bs-border-radius-lg)}.btn-group-sm>.btn,.btn-sm{--bs-btn-padding-y:0.25rem;--bs-btn-padding-x:0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius:var(--bs-border-radius-sm)}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropdown-center,.dropend,.dropstart,.dropup,.dropup-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex:1000;--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:0.5rem;--bs-dropdown-spacer:0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:var(--bs-body-color);--bs-dropdown-bg:var(--bs-body-bg);--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:var(--bs-border-radius);--bs-dropdown-border-width:var(--bs-border-width);--bs-dropdown-inner-border-radius:calc(var(--bs-border-radius) - var(--bs-border-width));--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:0.5rem;--bs-dropdown-box-shadow:var(--bs-box-shadow);--bs-dropdown-link-color:var(--bs-body-color);--bs-dropdown-link-hover-color:var(--bs-body-color);--bs-dropdown-link-hover-bg:var(--bs-tertiary-bg);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:var(--bs-tertiary-color);--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:0.25rem;--bs-dropdown-header-color:#6c757d;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0;border-radius:var(--bs-dropdown-item-border-radius,0)}.dropdown-item:focus,.dropdown-item:hover{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color:#dee2e6;--bs-dropdown-bg:#343a40;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#dee2e6;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-header-color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:var(--bs-border-radius)}.btn-group>.btn-group:not(:first-child),.btn-group>:not(.btn-check:first-child)+.btn{margin-left:calc(-1 * var(--bs-border-width))}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:calc(-1 * var(--bs-border-width))}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:nth-child(n+3),.btn-group-vertical>:not(.btn-check)+.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;background:0 0;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width:var(--bs-border-width);--bs-nav-tabs-border-color:var(--bs-border-color);--bs-nav-tabs-border-radius:var(--bs-border-radius);--bs-nav-tabs-link-hover-border-color:var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);--bs-nav-tabs-link-active-color:var(--bs-emphasis-color);--bs-nav-tabs-link-active-bg:var(--bs-body-bg);--bs-nav-tabs-link-active-border-color:var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius:var(--bs-border-radius);--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#0d6efd}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap:1rem;--bs-nav-underline-border-width:0.125rem;--bs-nav-underline-link-active-color:var(--bs-emphasis-color);gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid transparent}.nav-underline .nav-link:focus,.nav-underline .nav-link:hover{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-grow:1;flex-basis:0;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:0.5rem;--bs-navbar-color:rgba(var(--bs-emphasis-color-rgb), 0.65);--bs-navbar-hover-color:rgba(var(--bs-emphasis-color-rgb), 0.8);--bs-navbar-disabled-color:rgba(var(--bs-emphasis-color-rgb), 0.3);--bs-navbar-active-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-padding-y:0.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-hover-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-nav-link-padding-x:0.5rem;--bs-navbar-toggler-padding-y:0.25rem;--bs-navbar-toggler-padding-x:0.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(var(--bs-emphasis-color-rgb), 0.15);--bs-navbar-toggler-border-radius:var(--bs-border-radius);--bs-navbar-toggler-focus-width:0.25rem;--bs-navbar-toggler-transition:box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:focus,.navbar-text a:hover{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-grow:1;flex-basis:100%;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color:rgba(255, 255, 255, 0.55);--bs-navbar-hover-color:rgba(255, 255, 255, 0.75);--bs-navbar-disabled-color:rgba(255, 255, 255, 0.25);--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:rgba(255, 255, 255, 0.1);--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width:var(--bs-border-width);--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:var(--bs-border-radius);--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-card-cap-padding-y:0.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(var(--bs-body-color-rgb), 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:var(--bs-body-bg);--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:0.75rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child)>.card-header,.card-group>.card:not(:last-child)>.card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child)>.card-footer,.card-group>.card:not(:last-child)>.card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child)>.card-header,.card-group>.card:not(:first-child)>.card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child)>.card-footer,.card-group>.card:not(:first-child)>.card-img-bottom{border-bottom-left-radius:0}}.accordion{--bs-accordion-color:var(--bs-body-color);--bs-accordion-bg:var(--bs-body-bg);--bs-accordion-transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out,border-radius 0.15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:var(--bs-border-width);--bs-accordion-border-radius:var(--bs-border-radius);--bs-accordion-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:var(--bs-body-color);--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23212529' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='m2 5 6 6 6-6'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform 0.2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23052c65' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='m2 5 6 6 6-6'/%3e%3c/svg%3e");--bs-accordion-btn-focus-box-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:var(--bs-primary-text-emphasis);--bs-accordion-active-bg:var(--bs-primary-bg-subtle)}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type>.accordion-header .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type>.accordion-header .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type>.accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush>.accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush>.accordion-item:first-child{border-top:0}.accordion-flush>.accordion-item:last-child{border-bottom:0}.accordion-flush>.accordion-item>.accordion-collapse,.accordion-flush>.accordion-item>.accordion-header .accordion-button,.accordion-flush>.accordion-item>.accordion-header .accordion-button.collapsed{border-radius:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:var(--bs-secondary-color);--bs-breadcrumb-item-padding-x:0.5rem;--bs-breadcrumb-item-active-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:0.75rem;--bs-pagination-padding-y:0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--bs-link-color);--bs-pagination-bg:var(--bs-body-bg);--bs-pagination-border-width:var(--bs-border-width);--bs-pagination-border-color:var(--bs-border-color);--bs-pagination-border-radius:var(--bs-border-radius);--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:var(--bs-tertiary-bg);--bs-pagination-hover-border-color:var(--bs-border-color);--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:var(--bs-secondary-bg);--bs-pagination-focus-box-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#0d6efd;--bs-pagination-active-border-color:#0d6efd;--bs-pagination-disabled-color:var(--bs-secondary-color);--bs-pagination-disabled-bg:var(--bs-secondary-bg);--bs-pagination-disabled-border-color:var(--bs-border-color);display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.active>.page-link,.page-link.active{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.disabled>.page-link,.page-link.disabled{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(-1 * var(--bs-border-width))}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:var(--bs-border-radius-lg)}.pagination-sm{--bs-pagination-padding-x:0.5rem;--bs-pagination-padding-y:0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius:var(--bs-border-radius-sm)}.badge{--bs-badge-padding-x:0.65em;--bs-badge-padding-y:0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:var(--bs-border-radius);display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:var(--bs-border-width) solid var(--bs-alert-border-color);--bs-alert-border-radius:var(--bs-border-radius);--bs-alert-link-color:inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--bs-alert-color:var(--bs-primary-text-emphasis);--bs-alert-bg:var(--bs-primary-bg-subtle);--bs-alert-border-color:var(--bs-primary-border-subtle);--bs-alert-link-color:var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color:var(--bs-secondary-text-emphasis);--bs-alert-bg:var(--bs-secondary-bg-subtle);--bs-alert-border-color:var(--bs-secondary-border-subtle);--bs-alert-link-color:var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color:var(--bs-success-text-emphasis);--bs-alert-bg:var(--bs-success-bg-subtle);--bs-alert-border-color:var(--bs-success-border-subtle);--bs-alert-link-color:var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color:var(--bs-info-text-emphasis);--bs-alert-bg:var(--bs-info-bg-subtle);--bs-alert-border-color:var(--bs-info-border-subtle);--bs-alert-link-color:var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color:var(--bs-warning-text-emphasis);--bs-alert-bg:var(--bs-warning-bg-subtle);--bs-alert-border-color:var(--bs-warning-border-subtle);--bs-alert-link-color:var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color:var(--bs-danger-text-emphasis);--bs-alert-bg:var(--bs-danger-bg-subtle);--bs-alert-border-color:var(--bs-danger-border-subtle);--bs-alert-link-color:var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color:var(--bs-light-text-emphasis);--bs-alert-bg:var(--bs-light-bg-subtle);--bs-alert-border-color:var(--bs-light-border-subtle);--bs-alert-link-color:var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color:var(--bs-dark-text-emphasis);--bs-alert-bg:var(--bs-dark-bg-subtle);--bs-alert-border-color:var(--bs-dark-border-subtle);--bs-alert-link-color:var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:var(--bs-progress-height)}}.progress,.progress-stacked{--bs-progress-height:1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg:var(--bs-secondary-bg);--bs-progress-border-radius:var(--bs-border-radius);--bs-progress-box-shadow:var(--bs-box-shadow-inset);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#0d6efd;--bs-progress-bar-transition:width 0.6s ease;display:flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color:var(--bs-body-color);--bs-list-group-bg:var(--bs-body-bg);--bs-list-group-border-color:var(--bs-border-color);--bs-list-group-border-width:var(--bs-border-width);--bs-list-group-border-radius:var(--bs-border-radius);--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:0.5rem;--bs-list-group-action-color:var(--bs-secondary-color);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-tertiary-bg);--bs-list-group-action-active-color:var(--bs-body-color);--bs-list-group-action-active-bg:var(--bs-secondary-bg);--bs-list-group-disabled-color:var(--bs-secondary-color);--bs-list-group-disabled-bg:var(--bs-body-bg);--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#0d6efd;--bs-list-group-active-border-color:#0d6efd;display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:not(.active):focus,.list-group-item-action:not(.active):hover{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:not(.active):active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{--bs-list-group-color:var(--bs-primary-text-emphasis);--bs-list-group-bg:var(--bs-primary-bg-subtle);--bs-list-group-border-color:var(--bs-primary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-primary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-primary-border-subtle);--bs-list-group-active-color:var(--bs-primary-bg-subtle);--bs-list-group-active-bg:var(--bs-primary-text-emphasis);--bs-list-group-active-border-color:var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color:var(--bs-secondary-text-emphasis);--bs-list-group-bg:var(--bs-secondary-bg-subtle);--bs-list-group-border-color:var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-secondary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-secondary-border-subtle);--bs-list-group-active-color:var(--bs-secondary-bg-subtle);--bs-list-group-active-bg:var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color:var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color:var(--bs-success-text-emphasis);--bs-list-group-bg:var(--bs-success-bg-subtle);--bs-list-group-border-color:var(--bs-success-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-success-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-success-border-subtle);--bs-list-group-active-color:var(--bs-success-bg-subtle);--bs-list-group-active-bg:var(--bs-success-text-emphasis);--bs-list-group-active-border-color:var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color:var(--bs-info-text-emphasis);--bs-list-group-bg:var(--bs-info-bg-subtle);--bs-list-group-border-color:var(--bs-info-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-info-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-info-border-subtle);--bs-list-group-active-color:var(--bs-info-bg-subtle);--bs-list-group-active-bg:var(--bs-info-text-emphasis);--bs-list-group-active-border-color:var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color:var(--bs-warning-text-emphasis);--bs-list-group-bg:var(--bs-warning-bg-subtle);--bs-list-group-border-color:var(--bs-warning-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-warning-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-warning-border-subtle);--bs-list-group-active-color:var(--bs-warning-bg-subtle);--bs-list-group-active-bg:var(--bs-warning-text-emphasis);--bs-list-group-active-border-color:var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color:var(--bs-danger-text-emphasis);--bs-list-group-bg:var(--bs-danger-bg-subtle);--bs-list-group-border-color:var(--bs-danger-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-danger-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-danger-border-subtle);--bs-list-group-active-color:var(--bs-danger-bg-subtle);--bs-list-group-active-bg:var(--bs-danger-text-emphasis);--bs-list-group-active-border-color:var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color:var(--bs-light-text-emphasis);--bs-list-group-bg:var(--bs-light-bg-subtle);--bs-list-group-border-color:var(--bs-light-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-light-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-light-border-subtle);--bs-list-group-active-color:var(--bs-light-bg-subtle);--bs-list-group-active-bg:var(--bs-light-text-emphasis);--bs-list-group-active-border-color:var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color:var(--bs-dark-text-emphasis);--bs-list-group-bg:var(--bs-dark-bg-subtle);--bs-list-group-border-color:var(--bs-dark-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-dark-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-dark-border-subtle);--bs-list-group-active-color:var(--bs-dark-bg-subtle);--bs-list-group-active-bg:var(--bs-dark-text-emphasis);--bs-list-group-active-border-color:var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color:#000;--bs-btn-close-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414'/%3e%3c/svg%3e");--bs-btn-close-opacity:0.5;--bs-btn-close-hover-opacity:0.75;--bs-btn-close-focus-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-btn-close-focus-opacity:1;--bs-btn-close-disabled-opacity:0.25;box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:transparent var(--bs-btn-close-bg) center/1em auto no-repeat;filter:var(--bs-btn-close-filter);border:0;border-radius:.375rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{--bs-btn-close-filter:invert(1) grayscale(100%) brightness(200%)}:root,[data-bs-theme=light]{--bs-btn-close-filter: }[data-bs-theme=dark]{--bs-btn-close-filter:invert(1) grayscale(100%) brightness(200%)}.toast{--bs-toast-zindex:1090;--bs-toast-padding-x:0.75rem;--bs-toast-padding-y:0.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-border-width:var(--bs-border-width);--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:var(--bs-border-radius);--bs-toast-box-shadow:var(--bs-box-shadow);--bs-toast-header-color:var(--bs-secondary-color);--bs-toast-header-bg:rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-header-border-color:var(--bs-border-color-translucent);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex:1090;position:absolute;z-index:var(--bs-toast-zindex);width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-.5 * var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:0.5rem;--bs-modal-color:var(--bs-body-color);--bs-modal-bg:var(--bs-body-bg);--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:var(--bs-border-width);--bs-modal-border-radius:var(--bs-border-radius-lg);--bs-modal-box-shadow:var(--bs-box-shadow-sm);--bs-modal-inner-border-radius:calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:var(--bs-border-width);--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:var(--bs-border-width);position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transform:translate(0,-50px);transition:transform .3s ease-out}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--bs-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5);margin-top:calc(-.5 * var(--bs-modal-header-padding-y));margin-right:calc(-.5 * var(--bs-modal-header-padding-x));margin-bottom:calc(-.5 * var(--bs-modal-header-padding-y));margin-left:auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media (min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:var(--bs-box-shadow)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media (min-width:1200px){.modal-xl{--bs-modal-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-footer,.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-footer,.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-footer,.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-footer,.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-footer,.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-footer,.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:0.5rem;--bs-tooltip-padding-y:0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color:var(--bs-body-bg);--bs-tooltip-bg:var(--bs-emphasis-color);--bs-tooltip-border-radius:var(--bs-border-radius);--bs-tooltip-opacity:0.9;--bs-tooltip-arrow-width:0.8rem;--bs-tooltip-arrow-height:0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:0.875rem;--bs-popover-bg:var(--bs-body-bg);--bs-popover-border-width:var(--bs-border-width);--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:var(--bs-border-radius-lg);--bs-popover-inner-border-radius:calc(var(--bs-border-radius-lg) - var(--bs-border-width));--bs-popover-box-shadow:var(--bs-box-shadow);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color:inherit;--bs-popover-header-bg:var(--bs-secondary-bg);--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:var(--bs-body-color);--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:0.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-top>.popover-arrow::before{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-end>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::before{border-width:0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-.5 * var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-start>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;filter:var(--bs-carousel-control-icon-filter);border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:var(--bs-carousel-indicator-active-bg);background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:var(--bs-carousel-caption-color);text-align:center}.carousel-dark{--bs-carousel-indicator-active-bg:#000;--bs-carousel-caption-color:#000;--bs-carousel-control-icon-filter:invert(1) grayscale(100)}:root,[data-bs-theme=light]{--bs-carousel-indicator-active-bg:#fff;--bs-carousel-caption-color:#fff;--bs-carousel-control-icon-filter: }[data-bs-theme=dark]{--bs-carousel-indicator-active-bg:#000;--bs-carousel-caption-color:#000;--bs-carousel-control-icon-filter:invert(1) grayscale(100)}.spinner-border,.spinner-grow{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-border-width:0.25em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:transparent}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-lg,.offcanvas-md,.offcanvas-sm,.offcanvas-xl,.offcanvas-xxl{--bs-offcanvas-zindex:1045;--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color:var(--bs-body-color);--bs-offcanvas-bg:var(--bs-body-bg);--bs-offcanvas-border-width:var(--bs-border-width);--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:var(--bs-box-shadow-sm);--bs-offcanvas-transition:transform 0.3s ease-in-out;--bs-offcanvas-title-line-height:1.5}@media (max-width:575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.show:not(.hiding),.offcanvas-sm.showing{transform:none}.offcanvas-sm.hiding,.offcanvas-sm.show,.offcanvas-sm.showing{visibility:visible}}@media (min-width:576px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media (max-width:767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.show:not(.hiding),.offcanvas-md.showing{transform:none}.offcanvas-md.hiding,.offcanvas-md.show,.offcanvas-md.showing{visibility:visible}}@media (min-width:768px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.show:not(.hiding),.offcanvas-lg.showing{transform:none}.offcanvas-lg.hiding,.offcanvas-lg.show,.offcanvas-lg.showing{visibility:visible}}@media (min-width:992px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.show:not(.hiding),.offcanvas-xl.showing{transform:none}.offcanvas-xl.hiding,.offcanvas-xl.show,.offcanvas-xl.showing{visibility:visible}}@media (min-width:1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.show:not(.hiding),.offcanvas-xxl.showing{transform:none}.offcanvas-xxl.hiding,.offcanvas-xxl.show,.offcanvas-xxl.showing{visibility:visible}}@media (min-width:1400px){.offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.show:not(.hiding),.offcanvas.showing{transform:none}.offcanvas.hiding,.offcanvas.show,.offcanvas.showing{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin-top:calc(-.5 * var(--bs-offcanvas-padding-y));margin-right:calc(-.5 * var(--bs-offcanvas-padding-x));margin-bottom:calc(-.5 * var(--bs-offcanvas-padding-y));margin-left:auto}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff!important;background-color:RGBA(var(--bs-primary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#fff!important;background-color:RGBA(var(--bs-secondary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-success{color:#fff!important;background-color:RGBA(var(--bs-success-rgb),var(--bs-bg-opacity,1))!important}.text-bg-info{color:#000!important;background-color:RGBA(var(--bs-info-rgb),var(--bs-bg-opacity,1))!important}.text-bg-warning{color:#000!important;background-color:RGBA(var(--bs-warning-rgb),var(--bs-bg-opacity,1))!important}.text-bg-danger{color:#fff!important;background-color:RGBA(var(--bs-danger-rgb),var(--bs-bg-opacity,1))!important}.text-bg-light{color:#000!important;background-color:RGBA(var(--bs-light-rgb),var(--bs-bg-opacity,1))!important}.text-bg-dark{color:#fff!important;background-color:RGBA(var(--bs-dark-rgb),var(--bs-bg-opacity,1))!important}.link-primary{color:RGBA(var(--bs-primary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important}.link-primary:focus,.link-primary:hover{color:RGBA(10,88,202,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(10,88,202,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(10,88,202,var(--bs-link-underline-opacity,1))!important}.link-secondary{color:RGBA(var(--bs-secondary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important}.link-secondary:focus,.link-secondary:hover{color:RGBA(86,94,100,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity,1))!important}.link-success{color:RGBA(var(--bs-success-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important}.link-success:focus,.link-success:hover{color:RGBA(20,108,67,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity,1))!important}.link-info{color:RGBA(var(--bs-info-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important}.link-info:focus,.link-info:hover{color:RGBA(61,213,243,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity,1))!important}.link-warning{color:RGBA(var(--bs-warning-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important}.link-warning:focus,.link-warning:hover{color:RGBA(255,205,57,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity,1))!important}.link-danger{color:RGBA(var(--bs-danger-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important}.link-danger:focus,.link-danger:hover{color:RGBA(176,42,55,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important}.link-light{color:RGBA(var(--bs-light-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important}.link-light:focus,.link-light:hover{color:RGBA(249,250,251,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important}.link-dark{color:RGBA(var(--bs-dark-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important}.link-dark:focus,.link-dark:hover{color:RGBA(26,30,33,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity,1))!important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-body-emphasis:focus,.link-body-emphasis:hover{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,.75))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,0.75))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,0.75))!important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x,0) var(--bs-focus-ring-y,0) var(--bs-focus-ring-blur,0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,0.5));text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,0.5));text-underline-offset:0.25em;-webkit-backface-visibility:hidden;backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media (prefers-reduced-motion:reduce){.icon-link>.bi{transition:none}}.icon-link-hover:focus-visible>.bi,.icon-link-hover:hover>.bi{transform:var(--bs-icon-link-transform,translate3d(.25em,0,0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:75%}.ratio-16x9{--bs-aspect-ratio:56.25%}.ratio-21x9{--bs-aspect-ratio:42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption),.visually-hidden:not(caption){position:absolute!important}.visually-hidden *,.visually-hidden-focusable:not(:focus):not(:focus-within) *{overflow:hidden!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:var(--bs-border-width);min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.object-fit-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-none{-o-object-fit:none!important;object-fit:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.overflow-x-auto{overflow-x:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.overflow-x-visible{overflow-x:visible!important}.overflow-x-scroll{overflow-x:scroll!important}.overflow-y-auto{overflow-y:auto!important}.overflow-y-hidden{overflow-y:hidden!important}.overflow-y-visible{overflow-y:visible!important}.overflow-y-scroll{overflow-y:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:var(--bs-box-shadow)!important}.shadow-sm{box-shadow:var(--bs-box-shadow-sm)!important}.shadow-lg{box-shadow:var(--bs-box-shadow-lg)!important}.shadow-none{box-shadow:none!important}.focus-ring-primary{--bs-focus-ring-color:rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color:rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color:rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color:rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color:rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color:rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color:rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color:rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-0{border:0!important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-start-0{border-left:0!important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity))!important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity))!important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity))!important}.border-black{--bs-border-opacity:1;border-color:rgba(var(--bs-black-rgb),var(--bs-border-opacity))!important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity))!important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle)!important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle)!important}.border-success-subtle{border-color:var(--bs-success-border-subtle)!important}.border-info-subtle{border-color:var(--bs-info-border-subtle)!important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle)!important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle)!important}.border-light-subtle{border-color:var(--bs-light-border-subtle)!important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle)!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.border-opacity-10{--bs-border-opacity:0.1}.border-opacity-25{--bs-border-opacity:0.25}.border-opacity-50{--bs-border-opacity:0.5}.border-opacity-75{--bs-border-opacity:0.75}.border-opacity-100{--bs-border-opacity:1}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.row-gap-0{row-gap:0!important}.row-gap-1{row-gap:.25rem!important}.row-gap-2{row-gap:.5rem!important}.row-gap-3{row-gap:1rem!important}.row-gap-4{row-gap:1.5rem!important}.row-gap-5{row-gap:3rem!important}.column-gap-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-lighter{font-weight:lighter!important}.fw-light{font-weight:300!important}.fw-normal{font-weight:400!important}.fw-medium{font-weight:500!important}.fw-semibold{font-weight:600!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-body-secondary{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-body-tertiary{--bs-text-opacity:1;color:var(--bs-tertiary-color)!important}.text-body-emphasis{--bs-text-opacity:1;color:var(--bs-emphasis-color)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis)!important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis)!important}.text-success-emphasis{color:var(--bs-success-text-emphasis)!important}.text-info-emphasis{color:var(--bs-info-text-emphasis)!important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis)!important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis)!important}.text-light-emphasis{color:var(--bs-light-text-emphasis)!important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis)!important}.link-opacity-10{--bs-link-opacity:0.1}.link-opacity-10-hover:hover{--bs-link-opacity:0.1}.link-opacity-25{--bs-link-opacity:0.25}.link-opacity-25-hover:hover{--bs-link-opacity:0.25}.link-opacity-50{--bs-link-opacity:0.5}.link-opacity-50-hover:hover{--bs-link-opacity:0.5}.link-opacity-75{--bs-link-opacity:0.75}.link-opacity-75-hover:hover{--bs-link-opacity:0.75}.link-opacity-100{--bs-link-opacity:1}.link-opacity-100-hover:hover{--bs-link-opacity:1}.link-offset-1{text-underline-offset:0.125em!important}.link-offset-1-hover:hover{text-underline-offset:0.125em!important}.link-offset-2{text-underline-offset:0.25em!important}.link-offset-2-hover:hover{text-underline-offset:0.25em!important}.link-offset-3{text-underline-offset:0.375em!important}.link-offset-3-hover:hover{text-underline-offset:0.375em!important}.link-underline-primary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-secondary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-success{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important}.link-underline-info{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important}.link-underline-warning{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important}.link-underline-danger{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important}.link-underline-light{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important}.link-underline-dark{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important}.link-underline{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-underline-opacity-0{--bs-link-underline-opacity:0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity:0}.link-underline-opacity-10{--bs-link-underline-opacity:0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity:0.1}.link-underline-opacity-25{--bs-link-underline-opacity:0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity:0.25}.link-underline-opacity-50{--bs-link-underline-opacity:0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity:0.5}.link-underline-opacity-75{--bs-link-underline-opacity:0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity:0.75}.link-underline-opacity-100{--bs-link-underline-opacity:1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-body-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-bg-rgb),var(--bs-bg-opacity))!important}.bg-body-tertiary{--bs-bg-opacity:1;background-color:rgba(var(--bs-tertiary-bg-rgb),var(--bs-bg-opacity))!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle)!important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle)!important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle)!important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle)!important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle)!important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle)!important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle)!important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle)!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-xxl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm)!important;border-top-right-radius:var(--bs-border-radius-sm)!important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg)!important;border-top-right-radius:var(--bs-border-radius-lg)!important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl)!important;border-top-right-radius:var(--bs-border-radius-xl)!important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl)!important;border-top-right-radius:var(--bs-border-radius-xxl)!important}.rounded-top-circle{border-top-left-radius:50%!important;border-top-right-radius:50%!important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill)!important;border-top-right-radius:var(--bs-border-radius-pill)!important}.rounded-end{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm)!important;border-bottom-right-radius:var(--bs-border-radius-sm)!important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg)!important;border-bottom-right-radius:var(--bs-border-radius-lg)!important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl)!important;border-bottom-right-radius:var(--bs-border-radius-xl)!important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-right-radius:var(--bs-border-radius-xxl)!important}.rounded-end-circle{border-top-right-radius:50%!important;border-bottom-right-radius:50%!important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill)!important;border-bottom-right-radius:var(--bs-border-radius-pill)!important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-0{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm)!important;border-bottom-left-radius:var(--bs-border-radius-sm)!important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg)!important;border-bottom-left-radius:var(--bs-border-radius-lg)!important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl)!important;border-bottom-left-radius:var(--bs-border-radius-xl)!important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-left-radius:var(--bs-border-radius-xxl)!important}.rounded-bottom-circle{border-bottom-right-radius:50%!important;border-bottom-left-radius:50%!important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill)!important;border-bottom-left-radius:var(--bs-border-radius-pill)!important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-0{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm)!important;border-top-left-radius:var(--bs-border-radius-sm)!important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg)!important;border-top-left-radius:var(--bs-border-radius-lg)!important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl)!important;border-top-left-radius:var(--bs-border-radius-xl)!important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl)!important;border-top-left-radius:var(--bs-border-radius-xxl)!important}.rounded-start-circle{border-bottom-left-radius:50%!important;border-top-left-radius:50%!important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill)!important;border-top-left-radius:var(--bs-border-radius-pill)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.z-n1{z-index:-1!important}.z-0{z-index:0!important}.z-1{z-index:1!important}.z-2{z-index:2!important}.z-3{z-index:3!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.object-fit-sm-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-sm-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-sm-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-sm-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-sm-none{-o-object-fit:none!important;object-fit:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.row-gap-sm-0{row-gap:0!important}.row-gap-sm-1{row-gap:.25rem!important}.row-gap-sm-2{row-gap:.5rem!important}.row-gap-sm-3{row-gap:1rem!important}.row-gap-sm-4{row-gap:1.5rem!important}.row-gap-sm-5{row-gap:3rem!important}.column-gap-sm-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-sm-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-sm-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-sm-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-sm-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-sm-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.object-fit-md-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-md-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-md-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-md-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-md-none{-o-object-fit:none!important;object-fit:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.row-gap-md-0{row-gap:0!important}.row-gap-md-1{row-gap:.25rem!important}.row-gap-md-2{row-gap:.5rem!important}.row-gap-md-3{row-gap:1rem!important}.row-gap-md-4{row-gap:1.5rem!important}.row-gap-md-5{row-gap:3rem!important}.column-gap-md-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-md-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-md-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-md-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-md-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-md-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.object-fit-lg-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-lg-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-lg-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-lg-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-lg-none{-o-object-fit:none!important;object-fit:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.row-gap-lg-0{row-gap:0!important}.row-gap-lg-1{row-gap:.25rem!important}.row-gap-lg-2{row-gap:.5rem!important}.row-gap-lg-3{row-gap:1rem!important}.row-gap-lg-4{row-gap:1.5rem!important}.row-gap-lg-5{row-gap:3rem!important}.column-gap-lg-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-lg-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-lg-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-lg-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-lg-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-lg-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.object-fit-xl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xl-none{-o-object-fit:none!important;object-fit:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.row-gap-xl-0{row-gap:0!important}.row-gap-xl-1{row-gap:.25rem!important}.row-gap-xl-2{row-gap:.5rem!important}.row-gap-xl-3{row-gap:1rem!important}.row-gap-xl-4{row-gap:1.5rem!important}.row-gap-xl-5{row-gap:3rem!important}.column-gap-xl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xl-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-xl-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-xl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.object-fit-xxl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xxl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xxl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xxl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xxl-none{-o-object-fit:none!important;object-fit:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.row-gap-xxl-0{row-gap:0!important}.row-gap-xxl-1{row-gap:.25rem!important}.row-gap-xxl-2{row-gap:.5rem!important}.row-gap-xxl-3{row-gap:1rem!important}.row-gap-xxl-4{row-gap:1.5rem!important}.row-gap-xxl-5{row-gap:3rem!important}.column-gap-xxl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xxl-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-xxl-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-xxl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xxl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xxl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/static/css/styles.css b/static/css/styles.css new file mode 100644 index 0000000..3b4d9ff --- /dev/null +++ b/static/css/styles.css @@ -0,0 +1,278 @@ +/* === Print === */ +@media print { + nav, .btn, .sidebar, .form-select, .form-control { + display: none !important; + } + body { + font-size: 12pt; + color: black; + } + table { + border-collapse: collapse; + } +} + + +@media (max-width: 768px) { + main { + margin-left: 0; + } +} + +/* === Body & Container === */ +body { + background-color: #e4dccc; + background-attachment: fixed; +} + +.dashboard-container { + background-color: #ffffff; + box-shadow: 0 0 10px rgba(0,0,0,0.05); + border-radius: 8px; + padding: 20px; + margin: 30px auto; + max-width: 1200px; +} + + + + +.sidebar { + position: fixed; + width: 220px; +} +main { + margin-left: 220px; +} + + + + + +/* === Sidebar === */ +.sidebar { + background: linear-gradient(180deg, #b35400, #993d00); /* dégradé orange foncé */ + color: white; + min-height: 100vh; /* prend toute la hauteur */ + top: 0; + z-index: 1000; + overflow-y: auto; + padding: 1rem; +} + +.sidebar .nav-link { + color: white; + font-weight: 700; +} + +.sidebar .nav-link:hover { + background-color: rgba(255, 255, 255, 0.1); + border-radius: 5px; + color: white; +} + +.sidebar .dropdown-menu { + display: none; + position: relative; + left: 10px; + top: -5px; + border: none; + padding-left: 1rem; + box-shadow: none; +} + +.sidebar .dropdown:hover .dropdown-menu { + display: block; +} + +.sidebar a { + color: white; +} + +.sidebar a:hover { + color: white; +} + +/* === Navbar / Logo / Profil === */ +.logo { + max-width: 80px; +} + +.img-profil { + width: 80px !important; + height: 80px !important; + object-fit: cover; + border-radius: 50%; +} + +/* === Cards === */ +.card { + border: 1px solid #dee2e6; + box-shadow: 0 2px 4px rgba(0,0,0,0.05); + border-radius: 8px; + transition: transform 0.3s ease; +} + +.card:hover { + transform: scale(1.02); +} + +.card-header { + background-color: #f8f9fa; + font-weight: bold !important; + color: black !important; + font-size: 1rem; + border-bottom: none; +} + +.card-body h5 { + color: black !important; + font-weight: bold; + font-size: 2.2rem; +} + +/* === Stat cards === */ +.stat-card { + background: #fff; + padding: 20px; + border-radius: 8px; + box-shadow: 0 2px 5px rgba(113, 11, 11, 0.1); +} + +/* === Employé / Projet details === */ +.employe-detail { + background-color: #f9f9f9; + border-radius: 8px; + box-shadow: 0 2px 6px rgba(0,0,0,0.1); +} + +.employe-detail .card-title { + font-size: 1.8rem; + margin-bottom: 0.5rem; +} + +.employe-detail p { + margin-bottom: 0.4rem; + font-size: 1rem; +} + +.employe-detail a.btn { + font-weight: 500; +} + +.employe-card, .projet-card { + background-color: #fff; + border-radius: 10px; + box-shadow: 0 4px 12px rgba(0,0,0,0.1); + padding: 2.5rem; + max-width: 1400px; + margin: 0 auto; + font-size: 1.1rem; +} + +/* === Forms === */ +.form-wrapper { + max-width: 1000px; + margin: auto; + background-color: rgba(255, 255, 255, 0.95); +} + +form label { + font-weight: 600; + margin-top: 1rem; + display: block; +} + +form input, form select, form textarea { + width: 100%; + padding: 0.5rem; + margin-top: 0.3rem; + border-radius: 5px; + border: 1px solid #ccc; +} + +/* === Formation badges === */ +.formation-badge { + position: relative; + display: inline-block; +} + +.formation-actions { + position: absolute; + top: -5px; + right: -5px; + display: none; +} + +.formation-badge:hover .formation-actions { + display: inline-block; +} + +.formation-actions button { + background: none; + border: none; + color: #fff; + margin-left: 5px; + font-size: 0.9rem; +} + +/* === Context menu === */ +#contextMenu { + width: 150px; +} + +/* === Transitions / Animations === */ +.fade-out { + opacity: 0; + transition: opacity 0.5s ease; +} + +#main-content { + transition: opacity 0.3s ease; +} + + +.login-box { + background: linear-gradient(to right, #f5f7fa, #c3cfe2); + border-radius: 10px; + box-shadow: 0 0 10px rgba(0,0,0,0.3); + width: 100%; + max-width: 400px; +} + +/* === Responsive === */ +@media (max-width: 576px) { + .modal-dialog { + max-width: 100%; + margin: 0; + height: 100%; + } + + .modal-content { + height: 100%; + border-radius: 0; + } + + .modal-body { + overflow-y: auto; + } + + .modal-footer button { + width: 100%; + } + + .img-profil { + width: 50px; + height: 50px; + } + + .sidebar { + width: 100%; + padding: 0.5rem 1rem; + } + + .sidebar .nav-link { + font-size: 0.9rem; + padding: 0.5rem 1rem; + } +} diff --git a/static/css/tabulator_bootstrap5.min.css b/static/css/tabulator_bootstrap5.min.css new file mode 100644 index 0000000..c5cdfdb --- /dev/null +++ b/static/css/tabulator_bootstrap5.min.css @@ -0,0 +1,2 @@ +.tabulator{border:1px solid #dee2e6;font-size:16px;overflow:hidden;position:relative;text-align:left;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0)}.tabulator[tabulator-layout=fitDataFill] .tabulator-tableholder .tabulator-table{min-width:100%}.tabulator[tabulator-layout=fitDataTable]{display:inline-block}.tabulator.tabulator-block-select,.tabulator.tabulator-ranges .tabulator-cell:not(.tabulator-editing){user-select:none}.tabulator .tabulator-header{background-color:#fff;border-bottom:1px solid #dee2e6;box-sizing:border-box;color:#555;font-weight:700;outline:none;overflow:hidden;position:relative;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;white-space:nowrap;width:100%}.tabulator .tabulator-header.tabulator-header-hidden{display:none}.tabulator .tabulator-header .tabulator-header-contents{overflow:hidden;position:relative}.tabulator .tabulator-header .tabulator-header-contents .tabulator-headers{display:inline-block}.tabulator .tabulator-header .tabulator-col{background:#fff;border-right:1px solid #aaa;box-sizing:border-box;display:inline-flex;flex-direction:column;justify-content:flex-start;overflow:hidden;position:relative;text-align:left;vertical-align:bottom}.tabulator .tabulator-header .tabulator-col.tabulator-moving{background:#e6e6e6;border:1px solid #dee2e6;pointer-events:none;position:absolute}.tabulator .tabulator-header .tabulator-col.tabulator-range-highlight{background-color:#d6d6d6;color:#000}.tabulator .tabulator-header .tabulator-col.tabulator-range-selected{background-color:#3876ca;color:#fff}.tabulator .tabulator-header .tabulator-col .tabulator-col-content{box-sizing:border-box;padding:4px;position:relative}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-header-popup-button{padding:0 8px}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-header-popup-button:hover{cursor:pointer;opacity:.6}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title-holder{position:relative}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title{box-sizing:border-box;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom;white-space:nowrap;width:100%}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title.tabulator-col-title-wrap{text-overflow:clip;white-space:normal}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title .tabulator-title-editor{background:#fff;border:1px solid #999;box-sizing:border-box;padding:1px;width:100%}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title .tabulator-header-popup-button+.tabulator-title-editor{width:calc(100% - 22px)}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-sorter{align-items:center;bottom:0;display:flex;position:absolute;right:4px;top:0}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-sorter .tabulator-arrow{border-bottom:6px solid #bbb;border-left:6px solid transparent;border-right:6px solid transparent;height:0;width:0}.tabulator .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols{border-top:1px solid #aaa;display:flex;margin-right:-1px;overflow:hidden;position:relative}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter{box-sizing:border-box;margin-top:2px;position:relative;text-align:center;width:100%}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter textarea{height:auto!important}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter svg{margin-top:3px}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter input::-ms-clear{height:0;width:0}.tabulator .tabulator-header .tabulator-col.tabulator-sortable .tabulator-col-title{padding-right:25px}@media (hover:hover) and (pointer:fine){.tabulator .tabulator-header .tabulator-col.tabulator-sortable.tabulator-col-sorter-element:hover{background-color:#e6e6e6;cursor:pointer}}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=none] .tabulator-col-content .tabulator-col-sorter{color:#bbb}@media (hover:hover) and (pointer:fine){.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=none] .tabulator-col-content .tabulator-col-sorter.tabulator-col-sorter-element .tabulator-arrow:hover{border-bottom:6px solid #555;cursor:pointer}}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=none] .tabulator-col-content .tabulator-col-sorter .tabulator-arrow{border-bottom:6px solid #bbb;border-top:none}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=ascending] .tabulator-col-content .tabulator-col-sorter{color:#666}@media (hover:hover) and (pointer:fine){.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=ascending] .tabulator-col-content .tabulator-col-sorter.tabulator-col-sorter-element .tabulator-arrow:hover{border-bottom:6px solid #555;cursor:pointer}}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=ascending] .tabulator-col-content .tabulator-col-sorter .tabulator-arrow{border-bottom:6px solid #666;border-top:none}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=descending] .tabulator-col-content .tabulator-col-sorter{color:#666}@media (hover:hover) and (pointer:fine){.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=descending] .tabulator-col-content .tabulator-col-sorter.tabulator-col-sorter-element .tabulator-arrow:hover{border-top:6px solid #555;cursor:pointer}}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=descending] .tabulator-col-content .tabulator-col-sorter .tabulator-arrow{border-bottom:none;border-top:6px solid #666;color:#666}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical .tabulator-col-content .tabulator-col-title{align-items:center;display:flex;justify-content:center;text-orientation:mixed;writing-mode:vertical-rl}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-col-vertical-flip .tabulator-col-title{transform:rotate(180deg)}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-sortable .tabulator-col-title{padding-right:0;padding-top:20px}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-sortable.tabulator-col-vertical-flip .tabulator-col-title{padding-bottom:20px;padding-right:0}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-sortable .tabulator-col-sorter{bottom:auto;justify-content:center;left:0;right:0;top:4px}.tabulator .tabulator-header .tabulator-frozen{left:0;position:sticky;z-index:11}.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-left{border-right:2px solid #dee2e6}.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-right{border-left:2px solid #dee2e6}.tabulator .tabulator-header .tabulator-calcs-holder{background:#fff!important;border-bottom:1px solid #aaa;border-top:1px solid #dee2e6;box-sizing:border-box;display:inline-block}.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row{background:#fff!important}.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle{display:none}.tabulator .tabulator-header .tabulator-frozen-rows-holder{display:inline-block;padding-top:1em}.tabulator .tabulator-header .tabulator-frozen-rows-holder:empty{display:none}.tabulator .tabulator-tableholder{-webkit-overflow-scrolling:touch;overflow:auto;position:relative;white-space:nowrap;width:100%}.tabulator .tabulator-tableholder:focus{outline:none}.tabulator .tabulator-tableholder .tabulator-placeholder{align-items:center;box-sizing:border-box;display:flex;justify-content:center;min-width:100%;width:100%}.tabulator .tabulator-tableholder .tabulator-placeholder[tabulator-render-mode=virtual]{min-height:100%}.tabulator .tabulator-tableholder .tabulator-placeholder .tabulator-placeholder-contents{color:#ccc;display:inline-block;font-size:20px;font-weight:700;padding:10px;text-align:center;white-space:normal}.tabulator .tabulator-tableholder .tabulator-table{background-color:#fff;color:#333;display:inline-block;overflow:visible;position:relative;white-space:nowrap}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.tabulator-calcs{background:#dadfe4!important;font-weight:700}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.tabulator-calcs.tabulator-calcs-top{border-bottom:2px solid #dee2e6}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.tabulator-calcs.tabulator-calcs-bottom{border-top:2px solid #dee2e6}.tabulator .tabulator-tableholder .tabulator-range-overlay{inset:0;pointer-events:none;position:absolute;z-index:10}.tabulator .tabulator-tableholder .tabulator-range-overlay .tabulator-range{border:1px solid #2975dd;box-sizing:border-box;position:absolute}.tabulator .tabulator-tableholder .tabulator-range-overlay .tabulator-range.tabulator-range-active:after{background-color:#2975dd;border-radius:999px;bottom:-3px;content:"";height:6px;position:absolute;right:-3px;width:6px}.tabulator .tabulator-tableholder .tabulator-range-overlay .tabulator-range-cell-active{border:2px solid #2975dd;box-sizing:border-box;position:absolute}.tabulator .tabulator-footer{background-color:#e6e6e6;border-top:1px solid #dee2e6;color:#555;font-weight:700;user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;white-space:nowrap}.tabulator .tabulator-footer .tabulator-footer-contents{align-items:center;display:flex;flex-direction:row;justify-content:space-between;padding:5px 10px}.tabulator .tabulator-footer .tabulator-footer-contents:empty{display:none}.tabulator .tabulator-footer .tabulator-spreadsheet-tabs{margin-top:-5px;overflow-x:auto}.tabulator .tabulator-footer .tabulator-spreadsheet-tabs .tabulator-spreadsheet-tab{border:1px solid #dee2e6;border-bottom-left-radius:5px;border-bottom-right-radius:5px;border-top:none;display:inline-block;font-size:.9em;padding:5px}.tabulator .tabulator-footer .tabulator-spreadsheet-tabs .tabulator-spreadsheet-tab:hover{cursor:pointer;opacity:.7}.tabulator .tabulator-footer .tabulator-spreadsheet-tabs .tabulator-spreadsheet-tab.tabulator-spreadsheet-tab-active{background:#fff}.tabulator .tabulator-footer .tabulator-calcs-holder{background:#f3f3f3!important;border-bottom:1px solid #dee2e6;border-top:1px solid #dee2e6;box-sizing:border-box;overflow:hidden;text-align:left;width:100%}.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row{background:#f3f3f3!important;display:inline-block}.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle{display:none}.tabulator .tabulator-footer .tabulator-calcs-holder:only-child{border-bottom:none;margin-bottom:-5px}.tabulator .tabulator-footer>*+.tabulator-page-counter{margin-left:10px}.tabulator .tabulator-footer .tabulator-page-counter{font-weight:400}.tabulator .tabulator-footer .tabulator-paginator{color:#555;flex:1;font-family:inherit;font-size:inherit;font-weight:inherit;text-align:right}.tabulator .tabulator-footer .tabulator-page-size{border:1px solid #dee2e6;border-radius:3px;display:inline-block;margin:0 5px;padding:2px 5px}.tabulator .tabulator-footer .tabulator-pages{margin:0 7px}.tabulator .tabulator-footer .tabulator-page{background:hsla(0,0%,100%,.2);border:1px solid #dee2e6;border-radius:3px;display:inline-block;margin:0 2px;padding:2px 5px}.tabulator .tabulator-footer .tabulator-page:disabled{opacity:.5}@media (hover:hover) and (pointer:fine){.tabulator .tabulator-footer .tabulator-page:not(disabled):hover{background:rgba(0,0,0,.2);color:#fff;cursor:pointer}}.tabulator .tabulator-col-resize-handle{display:inline-block;margin-left:-3px;margin-right:-3px;position:relative;vertical-align:middle;width:6px;z-index:11}@media (hover:hover) and (pointer:fine){.tabulator .tabulator-col-resize-handle:hover{cursor:ew-resize}}.tabulator .tabulator-col-resize-handle:last-of-type{margin-right:0;width:3px}.tabulator .tabulator-col-resize-guide{background-color:#999;height:100%;margin-left:-.5px;opacity:.5;position:absolute;top:0;width:4px}.tabulator .tabulator-row-resize-guide{background-color:#999;height:4px;left:0;margin-top:-.5px;opacity:.5;position:absolute;width:100%}.tabulator .tabulator-alert{align-items:center;background:rgba(0,0,0,.4);display:flex;height:100%;left:0;position:absolute;text-align:center;top:0;width:100%;z-index:100}.tabulator .tabulator-alert .tabulator-alert-msg{background:#fff;border-radius:10px;display:inline-block;font-size:16px;font-weight:700;margin:0 auto;padding:10px 20px}.tabulator .tabulator-alert .tabulator-alert-msg.tabulator-alert-state-msg{border:4px solid #333;color:#000}.tabulator .tabulator-alert .tabulator-alert-msg.tabulator-alert-state-error{border:4px solid #d00;color:#590000}.tabulator-row{background-color:#fff;box-sizing:border-box;min-height:24px;position:relative}.tabulator-row.tabulator-row-even{background-color:#e9ecef}@media (hover:hover) and (pointer:fine){.tabulator-row.tabulator-selectable:hover{background-color:#ced4da;cursor:pointer}}.tabulator-row.tabulator-selected{background-color:#9abcea}@media (hover:hover) and (pointer:fine){.tabulator-row.tabulator-selected:hover{background-color:#769bcc;cursor:pointer}}.tabulator-row.tabulator-row-moving{background:#fff;border:1px solid #000}.tabulator-row.tabulator-moving{border-bottom:1px solid #dee2e6;border-top:1px solid #dee2e6;pointer-events:none;position:absolute;z-index:15}.tabulator-row.tabulator-range-highlight .tabulator-cell.tabulator-range-row-header{background-color:#d6d6d6;color:#000}.tabulator-row.tabulator-range-highlight.tabulator-range-selected .tabulator-cell.tabulator-range-row-header,.tabulator-row.tabulator-range-selected .tabulator-cell.tabulator-range-row-header{background-color:#3876ca;color:#fff}.tabulator-row .tabulator-row-resize-handle{bottom:0;height:5px;left:0;position:absolute;right:0}.tabulator-row .tabulator-row-resize-handle.prev{bottom:auto;top:0}@media (hover:hover) and (pointer:fine){.tabulator-row .tabulator-row-resize-handle:hover{cursor:ns-resize}}.tabulator-row .tabulator-responsive-collapse{border-bottom:1px solid #dee2e6;border-top:1px solid #dee2e6;box-sizing:border-box;padding:5px}.tabulator-row .tabulator-responsive-collapse:empty{display:none}.tabulator-row .tabulator-responsive-collapse table{font-size:16px}.tabulator-row .tabulator-responsive-collapse table tr td{position:relative}.tabulator-row .tabulator-responsive-collapse table tr td:first-of-type{padding-right:10px}.tabulator-row .tabulator-cell{border-right:1px solid #dee2e6;box-sizing:border-box;display:inline-block;outline:none;overflow:hidden;padding:4px;position:relative;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.tabulator-row .tabulator-cell.tabulator-row-header{border-bottom:1px solid #dee2e6}.tabulator-row .tabulator-cell.tabulator-frozen{background-color:inherit;display:inline-block;left:0;position:sticky;z-index:11}.tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-left{border-right:2px solid #dee2e6}.tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-right{border-left:2px solid #dee2e6}.tabulator-row .tabulator-cell.tabulator-editing{border:1px solid #1d68cd;outline:none;padding:0}.tabulator-row .tabulator-cell.tabulator-editing input,.tabulator-row .tabulator-cell.tabulator-editing select{background:transparent;border:1px;outline:none}.tabulator-row .tabulator-cell.tabulator-validation-fail{border:1px solid #d00}.tabulator-row .tabulator-cell.tabulator-validation-fail input,.tabulator-row .tabulator-cell.tabulator-validation-fail select{background:transparent;border:1px;color:#d00}.tabulator-row .tabulator-cell.tabulator-row-handle{align-items:center;display:inline-flex;justify-content:center;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none}.tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box{width:80%}.tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box .tabulator-row-handle-bar{background:#666;height:3px;margin-top:2px;width:100%}.tabulator-row .tabulator-cell.tabulator-range-selected:not(.tabulator-range-only-cell-selected):not(.tabulator-range-row-header){background-color:#9abcea}.tabulator-row .tabulator-cell .tabulator-data-tree-branch-empty{display:inline-block;width:7px}.tabulator-row .tabulator-cell .tabulator-data-tree-branch{border-bottom:2px solid #dee2e6;border-bottom-left-radius:1px;border-left:2px solid #dee2e6;display:inline-block;height:9px;margin-right:5px;margin-top:-9px;vertical-align:middle;width:7px}.tabulator-row .tabulator-cell .tabulator-data-tree-control{align-items:center;background:rgba(0,0,0,.1);border:1px solid #333;border-radius:2px;display:inline-flex;height:11px;justify-content:center;margin-right:5px;overflow:hidden;vertical-align:middle;width:11px}@media (hover:hover) and (pointer:fine){.tabulator-row .tabulator-cell .tabulator-data-tree-control:hover{background:rgba(0,0,0,.2);cursor:pointer}}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-collapse{background:transparent;display:inline-block;height:7px;position:relative;width:1px}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-collapse:after{background:#333;content:"";height:1px;left:-3px;position:absolute;top:3px;width:7px}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-expand{background:#333;display:inline-block;height:7px;position:relative;width:1px}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-expand:after{background:#333;content:"";height:1px;left:-3px;position:absolute;top:3px;width:7px}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle{align-items:center;background:#666;border-radius:20px;color:#fff;display:inline-flex;font-size:1.1em;font-weight:700;height:15px;justify-content:center;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;width:15px}@media (hover:hover) and (pointer:fine){.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle:hover{cursor:pointer;opacity:.7}}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle.open .tabulator-responsive-collapse-toggle-close{display:initial}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle.open .tabulator-responsive-collapse-toggle-open{display:none}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle svg{stroke:#fff}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle .tabulator-responsive-collapse-toggle-close{display:none}.tabulator-row .tabulator-cell .tabulator-traffic-light{border-radius:14px;display:inline-block;height:14px;width:14px}.tabulator-row.tabulator-group{background:#ccc;border-bottom:1px solid #999;border-right:1px solid #dee2e6;border-top:1px solid #999;box-sizing:border-box;font-weight:700;min-width:100%;padding:5px 5px 5px 10px}@media (hover:hover) and (pointer:fine){.tabulator-row.tabulator-group:hover{background-color:rgba(0,0,0,.1);cursor:pointer}}.tabulator-row.tabulator-group.tabulator-group-visible .tabulator-arrow{border-bottom:0;border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #666;margin-right:10px}.tabulator-row.tabulator-group.tabulator-group-level-1{padding-left:30px}.tabulator-row.tabulator-group.tabulator-group-level-2{padding-left:50px}.tabulator-row.tabulator-group.tabulator-group-level-3{padding-left:70px}.tabulator-row.tabulator-group.tabulator-group-level-4{padding-left:90px}.tabulator-row.tabulator-group.tabulator-group-level-5{padding-left:110px}.tabulator-row.tabulator-group .tabulator-group-toggle{display:inline-block}.tabulator-row.tabulator-group .tabulator-arrow{border-bottom:6px solid transparent;border-left:6px solid #666;border-right:0;border-top:6px solid transparent;display:inline-block;height:0;margin-right:16px;vertical-align:middle;width:0}.tabulator-row.tabulator-group span{color:#d00;margin-left:10px}.tabulator-toggle{background:#dcdcdc;border:1px solid #ccc;box-sizing:border-box;display:flex;flex-direction:row}.tabulator-toggle.tabulator-toggle-on{background:#1c6cc2}.tabulator-toggle .tabulator-toggle-switch{background:#fff;border:1px solid #ccc;box-sizing:border-box}.tabulator-popup-container{-webkit-overflow-scrolling:touch;border:1px solid #dee2e6;box-shadow:0 0 5px 0 rgba(0,0,0,.2);box-sizing:border-box;display:inline-block;font-size:16px;overflow-y:auto;position:absolute;z-index:10000}.tabulator-popup{border-radius:3px;padding:5px}.tabulator-tooltip{border-radius:2px;box-shadow:none;font-size:12px;max-width:min(500px,100%);padding:3px 5px;pointer-events:none}.tabulator-menu .tabulator-menu-item{box-sizing:border-box;padding:5px 10px;position:relative;user-select:none}.tabulator-menu .tabulator-menu-item.tabulator-menu-item-disabled{opacity:.5}@media (hover:hover) and (pointer:fine){.tabulator-menu .tabulator-menu-item:not(.tabulator-menu-item-disabled):hover{background:#e9ecef;cursor:pointer}}.tabulator-menu .tabulator-menu-item.tabulator-menu-item-submenu{padding-right:25px}.tabulator-menu .tabulator-menu-item.tabulator-menu-item-submenu:after{border-color:#dee2e6;border-style:solid;border-width:1px 1px 0 0;content:"";display:inline-block;height:7px;position:absolute;right:10px;top:calc(5px + .4em);transform:rotate(45deg);vertical-align:top;width:7px}.tabulator-menu .tabulator-menu-separator{border-top:1px solid #dee2e6}.tabulator-edit-list{-webkit-overflow-scrolling:touch;font-size:16px;max-height:200px;overflow-y:auto}.tabulator-edit-list .tabulator-edit-list-item{color:#333;outline:none;padding:4px}.tabulator-edit-list .tabulator-edit-list-item.active{background:#1d68cd}.tabulator-edit-list .tabulator-edit-list-item.focused{outline:1px solid #1d68cd}@media (hover:hover) and (pointer:fine){.tabulator-edit-list .tabulator-edit-list-item:hover{background:#1d68cd;color:#fff;cursor:pointer}}.tabulator-edit-list .tabulator-edit-list-placeholder{color:#333;padding:4px;text-align:center}.tabulator-edit-list .tabulator-edit-list-group{border-bottom:1px solid #dee2e6;color:#333;font-weight:700;padding:6px 4px 4px}.tabulator-edit-list .tabulator-edit-list-group.tabulator-edit-list-group-level-2,.tabulator-edit-list .tabulator-edit-list-item.tabulator-edit-list-group-level-2{padding-left:12px}.tabulator-edit-list .tabulator-edit-list-group.tabulator-edit-list-group-level-3,.tabulator-edit-list .tabulator-edit-list-item.tabulator-edit-list-group-level-3{padding-left:20px}.tabulator-edit-list .tabulator-edit-list-group.tabulator-edit-list-group-level-4,.tabulator-edit-list .tabulator-edit-list-item.tabulator-edit-list-group-level-4{padding-left:28px}.tabulator-edit-list .tabulator-edit-list-group.tabulator-edit-list-group-level-5,.tabulator-edit-list .tabulator-edit-list-item.tabulator-edit-list-group-level-5{padding-left:36px}.tabulator.tabulator-ltr{direction:ltr}.tabulator.tabulator-rtl{direction:rtl;text-align:initial}.tabulator.tabulator-rtl .tabulator-header .tabulator-col{border-left:1px solid #aaa;border-right:initial}.tabulator.tabulator-rtl .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols{margin-left:-1px;margin-right:0}.tabulator.tabulator-rtl .tabulator-header .tabulator-col.tabulator-sortable .tabulator-col-title{padding-left:25px;padding-right:0}.tabulator.tabulator-rtl .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-sorter{left:8px;right:auto}.tabulator.tabulator-rtl .tabulator-tableholder .tabulator-range-overlay .tabulator-range.tabulator-range-active:after{background-color:#2975dd;border-radius:999px;bottom:-3px;content:"";height:6px;left:-3px;position:absolute;right:auto;width:6px}.tabulator.tabulator-rtl .tabulator-row .tabulator-cell{border-left:1px solid #dee2e6;border-right:initial}.tabulator.tabulator-rtl .tabulator-row .tabulator-cell .tabulator-data-tree-branch{border-bottom-left-radius:0;border-bottom-right-radius:1px;border-left:initial;border-right:2px solid #dee2e6;margin-left:5px;margin-right:0}.tabulator.tabulator-rtl .tabulator-row .tabulator-cell .tabulator-data-tree-control{margin-left:5px;margin-right:0}.tabulator.tabulator-rtl .tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-left{border-left:2px solid #dee2e6}.tabulator.tabulator-rtl .tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-right{border-right:2px solid #dee2e6}.tabulator.tabulator-rtl .tabulator-row .tabulator-col-resize-handle:last-of-type{margin-left:0;margin-right:-3px;width:3px}.tabulator.tabulator-rtl .tabulator-footer .tabulator-calcs-holder{text-align:initial}.tabulator-print-fullscreen{bottom:0;left:0;position:absolute;right:0;top:0;z-index:10000}body.tabulator-print-fullscreen-hide>:not(.tabulator-print-fullscreen){display:none!important}.tabulator-print-table{border-collapse:collapse}.tabulator-print-table .tabulator-data-tree-branch{border-bottom:2px solid #dee2e6;border-bottom-left-radius:1px;border-left:2px solid #dee2e6;display:inline-block;height:9px;margin-right:5px;margin-top:-9px;vertical-align:middle;width:7px}.tabulator-print-table .tabulator-print-table-group{background:#ccc;border-bottom:1px solid #999;border-right:1px solid #dee2e6;border-top:1px solid #999;box-sizing:border-box;font-weight:700;min-width:100%;padding:5px 5px 5px 10px}@media (hover:hover) and (pointer:fine){.tabulator-print-table .tabulator-print-table-group:hover{background-color:rgba(0,0,0,.1);cursor:pointer}}.tabulator-print-table .tabulator-print-table-group.tabulator-group-visible .tabulator-arrow{border-bottom:0;border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #666;margin-right:10px}.tabulator-print-table .tabulator-print-table-group.tabulator-group-level-1 td{padding-left:30px!important}.tabulator-print-table .tabulator-print-table-group.tabulator-group-level-2 td{padding-left:50px!important}.tabulator-print-table .tabulator-print-table-group.tabulator-group-level-3 td{padding-left:70px!important}.tabulator-print-table .tabulator-print-table-group.tabulator-group-level-4 td{padding-left:90px!important}.tabulator-print-table .tabulator-print-table-group.tabulator-group-level-5 td{padding-left:110px!important}.tabulator-print-table .tabulator-print-table-group .tabulator-group-toggle{display:inline-block}.tabulator-print-table .tabulator-print-table-group .tabulator-arrow{border-bottom:6px solid transparent;border-left:6px solid #666;border-right:0;border-top:6px solid transparent;display:inline-block;height:0;margin-right:16px;vertical-align:middle;width:0}.tabulator-print-table .tabulator-print-table-group span{color:#d00;margin-left:10px}.tabulator-print-table .tabulator-data-tree-control{align-items:center;background:rgba(0,0,0,.1);border:1px solid #333;border-radius:2px;display:inline-flex;height:11px;justify-content:center;margin-right:5px;overflow:hidden;vertical-align:middle;width:11px}@media (hover:hover) and (pointer:fine){.tabulator-print-table .tabulator-data-tree-control:hover{background:rgba(0,0,0,.2);cursor:pointer}}.tabulator-print-table .tabulator-data-tree-control .tabulator-data-tree-control-collapse{background:transparent;display:inline-block;height:7px;position:relative;width:1px}.tabulator-print-table .tabulator-data-tree-control .tabulator-data-tree-control-collapse:after{background:#333;content:"";height:1px;left:-3px;position:absolute;top:3px;width:7px}.tabulator-print-table .tabulator-data-tree-control .tabulator-data-tree-control-expand{background:#333;display:inline-block;height:7px;position:relative;width:1px}.tabulator-print-table .tabulator-data-tree-control .tabulator-data-tree-control-expand:after{background:#333;content:"";height:1px;left:-3px;position:absolute;top:3px;width:7px}.tabulator{background-color:#fff;border:none}.tabulator .tabulator-header{border-bottom:2px solid #dee2e6;border-top:1px solid #dee2e6;color:inherit}.tabulator .tabulator-header .tabulator-col{background-color:#fff;border-right:none}.tabulator .tabulator-header .tabulator-col .tabulator-col-content{padding:12px}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-sorter{right:0}.tabulator .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols{border-top:1px solid #dee2e6}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter input{background-clip:padding-box;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;color:#495057;font-size:1rem;line-height:1.5;padding:.375rem .75rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter input:focus{background-color:#fff;border:1px solid #1d68cd;color:#495057;outline:0}.tabulator .tabulator-header .tabulator-calcs-holder{border-bottom:1px solid #dee2e6;width:100%}.tabulator .tabulator-tableholder .tabulator-placeholder span{color:#000}.tabulator .tabulator-footer,.tabulator .tabulator-tableholder .tabulator-table{color:inherit}.tabulator .tabulator-footer .tabulator-spreadsheet-tabs .tabulator-spreadsheet-tab{background-color:#fff;font-weight:400}.tabulator .tabulator-footer .tabulator-spreadsheet-tabs .tabulator-spreadsheet-tab.tabulator-spreadsheet-tab-active{background-color:#0d6efd;color:#fff}.tabulator .tabulator-footer .tabulator-paginator{color:inherit}.tabulator .tabulator-footer .tabulator-pages{margin:0}.tabulator .tabulator-footer .tabulator-page{margin:5px 0 0;padding:8px 12px}.tabulator .tabulator-footer .tabulator-page[data-page=first]{border-bottom-left-radius:4px;border-top-left-radius:4px}.tabulator .tabulator-footer .tabulator-page[data-page=last]{border:1px solid #dee2e6;border-bottom-right-radius:4px;border-top-right-radius:4px}.tabulator .tabulator-footer .tabulator-page.active{background-color:#0d6efd;border-color:#0d6efd;color:#fff}.tabulator .tabulator-footer .tabulator-page:disabled{background:#fff;border-color:#dee2e6;color:#6c757d}@media (hover:hover) and (pointer:fine){.tabulator .tabulator-footer .tabulator-page:not(.disabled):hover{background:#e9ecef;border-color:#dee2e6;color:#0a58ca}}.tabulator.table{background-color:#fff}.tabulator.table:not(.thead-light) .tabulator-header,.tabulator.table:not(.thead-light) .tabulator-header .tabulator-col{background-color:#fff;border-color:#dee2e6;color:#212529}.tabulator.table .tabulator-tableholder{color:#212529}.tabulator.table .tabulator-row{background-color:#fff;border-color:#dee2e6;color:#212529}@media (hover:hover) and (pointer:fine){.tabulator.table .tabulator-row:hover{background-color:#dee2e6}.tabulator.table .tabulator-row:hover .tabulator-cell{background-color:#ced4da}}.tabulator.table .tabulator-row.tabulator-selected{background-color:#9abcea}.tabulator.table .tabulator-footer{border-color:#dee2e6!important}.tabulator.table .tabulator-footer .tabulator-calcs-holder{background:#fff!important;border-color:#dee2e6!important}.tabulator.table .tabulator-footer .tabulator-calcs-holder .tabulator-row{background-color:#fff!important;border-color:#dee2e6!important;color:#212529!important}.tabulator.table-striped:not(.table) .tabulator-row.tabulator-row-even{background-color:#e9ecef}.tabulator.table-striped:not(.table) .tabulator-row.tabulator-row-even.tabulator-selected{background-color:#9abcea}@media (hover:hover) and (pointer:fine){.tabulator.table-striped:not(.table) .tabulator-row.tabulator-row-even.tabulator-selectable:hover{background-color:#ced4da;cursor:pointer}.tabulator.table-striped:not(.table) .tabulator-row.tabulator-row-even.tabulator-selected:hover{background-color:#769bcc;cursor:pointer}}.tabulator.table-striped.table .tabulator-row:nth-child(2n) .tabulator-cell{background-color:transparent}.tabulator.table-bordered{border:1px solid #dee2e6}.tabulator.table-bordered .tabulator-header .tabulator-col,.tabulator.table-bordered .tabulator-tableholder .tabulator-table .tabulator-row .tabulator-cell{border-right:1px solid #dee2e6}.tabulator.table-borderless .tabulator-header,.tabulator.table-borderless .tabulator-row{border:none}.tabulator.table-sm .tabulator-header .tabulator-col .tabulator-col-content{padding:5px!important}.tabulator.table-sm .tabulator-tableholder .tabulator-table .tabulator-row{min-height:26px}.tabulator.table-sm .tabulator-tableholder .tabulator-table .tabulator-row .tabulator-cell{padding:5px!important}.tabulator.table-sm .tabulator-row{padding-bottom:0;padding-top:0}.tabulator.table-sm .tabulator-col-resize-handle{padding:0}.tabulator.thead-dark .tabulator-header,.tabulator.thead-dark .tabulator-header .tabulator-col{background-color:#212529;border-color:#4d5154;color:#fff}.tabulator.table-striped:not(.table-dark) .tabulator-row.tabulator-row-even,html:not([data-bs-theme=dark]) .tabulator.table-striped .tabulator-row.tabulator-row-even{background-color:#e9ecef}.tabulator.table-striped:not(.table-dark) .tabulator-row.tabulator-row-even.tabulator-selected,html:not([data-bs-theme=dark]) .tabulator.table-striped .tabulator-row.tabulator-row-even.tabulator-selected{background-color:#9abcea}@media (hover:hover) and (pointer:fine){.tabulator.table-striped:not(.table-dark) .tabulator-row.tabulator-row-even.tabulator-selectable:hover,html:not([data-bs-theme=dark]) .tabulator.table-striped .tabulator-row.tabulator-row-even.tabulator-selectable:hover{background-color:#ced4da;cursor:pointer}.tabulator.table-striped:not(.table-dark) .tabulator-row.tabulator-row-even.tabulator-selected:hover,html:not([data-bs-theme=dark]) .tabulator.table-striped .tabulator-row.tabulator-row-even.tabulator-selected:hover{background-color:#769bcc;cursor:pointer}}.tabulator.table-striped.table-dark .tabulator-row:nth-child(2n),html[data-bs-theme=dark] .tabulator.table-striped .tabulator-row:nth-child(2n){background-color:#2c3034!important}.tabulator.table-striped.table-dark .tabulator-row:nth-child(2n) .tabulator-cell,html[data-bs-theme=dark] .tabulator.table-striped .tabulator-row:nth-child(2n) .tabulator-cell{background-color:inherit}.tabulator.table-dark,html[data-bs-theme=dark] .tabulator{background-color:#212529}.tabulator.table-dark:not(.thead-light) .tabulator-header,.tabulator.table-dark:not(.thead-light) .tabulator-header .tabulator-col,html[data-bs-theme=dark] .tabulator:not(.thead-light) .tabulator-header,html[data-bs-theme=dark] .tabulator:not(.thead-light) .tabulator-header .tabulator-col{background-color:#212529;border-color:#4d5154;color:#fff}.tabulator.table-dark .tabulator-tableholder,html[data-bs-theme=dark] .tabulator .tabulator-tableholder{color:#fff}.tabulator.table-dark .tabulator-cell,.tabulator.table-dark .tabulator-row,html[data-bs-theme=dark] .tabulator .tabulator-cell,html[data-bs-theme=dark] .tabulator .tabulator-row{background-color:#212529;border-color:#4d5154;color:#fff}@media (hover:hover) and (pointer:fine){.tabulator.table-dark .tabulator-row:hover,html[data-bs-theme=dark] .tabulator .tabulator-row:hover{background-color:#4d5154}.tabulator.table-dark .tabulator-row:hover .tabulator-cell,html[data-bs-theme=dark] .tabulator .tabulator-row:hover .tabulator-cell{background-color:#323539}}.tabulator.table-dark .tabulator-row.tabulator-selected,html[data-bs-theme=dark] .tabulator .tabulator-row.tabulator-selected{background-color:#373b3e}.tabulator.table-dark .tabulator-footer,html[data-bs-theme=dark] .tabulator .tabulator-footer{border-color:#4d5154!important;color:#212529!important}.tabulator.table-dark .tabulator-footer .tabulator-calcs-holder,html[data-bs-theme=dark] .tabulator .tabulator-footer .tabulator-calcs-holder{background:#212529!important;border-color:#4d5154!important}.tabulator.table-dark .tabulator-footer .tabulator-calcs-holder .tabulator-row,html[data-bs-theme=dark] .tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row{background-color:#212529!important;border-color:#4d5154!important;color:#fff!important}.tabulator.table-dark input,html[data-bs-theme=dark] .tabulator input{background-color:#6c757d!important;color:#fff!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.table-primary{background:#cfe2ff!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.table-secondary{background:#e2e3e5!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.table-success{background:#d1e7dd!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.table-info{background:#cff4fc!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.table-warning{background:#fff3cd!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.table-danger{background:#f8d7da!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.table-light{background:#f8f9fa!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.table{background:#212529!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.table-active{background:#6c757d!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.bg-primary{background:#cfe2ff!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.bg-secondary{background:#e2e3e5!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.bg-success{background:#d1e7dd!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.bg-info{background:#cff4fc!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.bg-warning{background:#fff3cd!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.bg-danger{background:#f8d7da!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.bg-light{background:#f8f9fa!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.bg-dark{background:#212529!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.bg-active{background:#6c757d!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row .tabulator-cell.table-primary{background:#cfe2ff!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row .tabulator-cell.table-secondary{background:#e2e3e5!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row .tabulator-cell.table-success{background:#d1e7dd!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row .tabulator-cell.table-info{background:#cff4fc!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row .tabulator-cell.table-warning{background:#fff3cd!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row .tabulator-cell.table-danger{background:#f8d7da!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row .tabulator-cell.table-light{background:#f8f9fa!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row .tabulator-cell.table{background:#212529!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row .tabulator-cell.table-active{background:#6c757d!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row .tabulator-cell.bg-primary{background:#cfe2ff!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row .tabulator-cell.bg-secondary{background:#e2e3e5!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row .tabulator-cell.bg-success{background:#d1e7dd!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row .tabulator-cell.bg-info{background:#cff4fc!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row .tabulator-cell.bg-warning{background:#fff3cd!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row .tabulator-cell.bg-danger{background:#f8d7da!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row .tabulator-cell.bg-light{background:#f8f9fa!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row .tabulator-cell.bg-dark{background:#212529!important}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row .tabulator-cell.bg-active{background:#6c757d!important}.tabulator-row{border-bottom:1px solid #dee2e6;min-height:40px}.tabulator-row .tabulator-cell{border-right:none;padding:12px}.tabulator-row .tabulator-cell:last-of-type{border-right:none}.tabulator-row .tabulator-cell.tabulator-row-header{background:#fff;border-bottom:none;border-right:1px solid #dee2e6}.tabulator-row .tabulator-cell .tabulator-data-tree-control{border:1px solid #ccc}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-collapse:after,.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-expand,.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-expand:after{background:#ccc}.tabulator-row.tabulator-group{background:#fafafa}.tabulator-row.tabulator-group span{color:#666}.tabulator-edit-select-list{background:#fff}.tabulator-edit-select-list .tabulator-edit-select-list-item.active{color:#fff}.tabulator-edit-select-list .tabulator-edit-select-list-item.active.focused{outline:1px solid hsla(0,0%,100%,.5)}@media (hover:hover) and (pointer:fine){.tabulator-edit-select-list .tabulator-edit-select-list-item:hover{color:#fff}}.tabulator-edit-select-list .tabulator-edit-select-list-group,.tabulator-edit-select-list .tabulator-edit-select-list-notice{color:inherit}.tabulator.tabulator-rtl .tabulator-header .tabulator-col{border-left:initial;text-align:initial}.tabulator-print-table .tabulator-print-table-group{background:#fafafa}.tabulator-print-table .tabulator-print-table-group span{color:#666}.tabulator-print-table .tabulator-data-tree-control{color:inherit}.tabulator-print-table .tabulator-data-tree-control .tabulator-data-tree-control-collapse:after,.tabulator-print-table .tabulator-data-tree-control .tabulator-data-tree-control-expand,.tabulator-print-table .tabulator-data-tree-control .tabulator-data-tree-control-expand:after{background:#ccc}.tabulator-popup-container{background:#fff}.tabulator-edit-list .tabulator-edit-list-item.active{color:#fff}.tabulator-edit-list .tabulator-edit-list-item.active.focused{outline:1px solid hsla(0,0%,100%,.5)}@media (hover:hover) and (pointer:fine){.tabulator-edit-list .tabulator-edit-list-item:hover{color:#fff}} +/*# sourceMappingURL=tabulator_bootstrap5.min.css.map */ \ No newline at end of file diff --git a/static/css/tabulator_bootstrap5.min.css:Zone.Identifier b/static/css/tabulator_bootstrap5.min.css:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..d6c1ec682968c796b9f5e9e080cc6f674b57c766 GIT binary patch literal 25 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≦jiZgHHd0;wqxyimP?PQ#>eV?;)nk$W2jY31K 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 literal 0 HcmV?d00001 diff --git a/static/js/monprofil.js b/static/js/monprofil.js new file mode 100644 index 0000000..dc53e6c --- /dev/null +++ b/static/js/monprofil.js @@ -0,0 +1,13 @@ + + + diff --git a/static/js/rapport.js b/static/js/rapport.js new file mode 100644 index 0000000..b0f0e6d --- /dev/null +++ b/static/js/rapport.js @@ -0,0 +1,102 @@ +if ('serviceWorker' in navigator) { + window.addEventListener('load', function() { + navigator.serviceWorker.register('{% static "sw.js" %}').then(function(reg) { + console.log('Service worker registered.', reg); + }).catch(function(err) { + console.warn('Service worker registration failed:', err); + }); + }); +} + +const couleursOrange = ['#b35400', '#ff9f1c', '#ffc107', '#ffb84d', '#ffcc80']; +const departementLabels = {{ departement_labels|safe }}; +const departementCounts = {{ departement_counts|safe }}; +const sexeLabels = {{ sexe_labels|safe }}; +const sexeCounts = {{ sexe_counts|safe }}; +const projetLabels = {{ projet_labels|safe }}; +const projetCounts = {{ projet_counts|safe }}; +const ticketsLabels = ["Traités", "Non traités"]; +const ticketsCounts = [{{ tickets_traite }}, {{ tickets_non_traite }}]; +const domaineLabels = {{ domaine_labels|safe }}; +const domaineCounts = {{ domaine_counts|safe }}; + +new Chart(document.getElementById("chartDepartement"), { + type: 'pie', + plugins: [ChartDataLabels], + data: { + labels: departementLabels, + datasets: [{ data: departementCounts, backgroundColor: couleursOrange }] + }, + options: { + plugins: { + legend: { position: 'bottom' }, + datalabels: { color: '#fff', font: { weight: 'bold', size: 14 }, formatter: v => v } + } + } +}); + +new Chart(document.getElementById("chartSexe"), { + type: 'doughnut', + plugins: [ChartDataLabels], + data: { + labels: sexeLabels, + datasets: [{ data: sexeCounts, backgroundColor: couleursOrange }] + }, + options: { + plugins: { + legend: { position: 'bottom' }, + datalabels: { color: '#fff', font: { weight: 'bold', size: 14 }, formatter: v => v } + } + } +}); + +new Chart(document.getElementById("chartProjets"), { + type: 'bar', + plugins: [ChartDataLabels], + data: { + labels: projetLabels, + datasets: [{ label:'Nombre de projets', data: projetCounts, backgroundColor: couleursOrange }] + }, + options: { + responsive: true, + plugins: { + legend: { display: false }, + datalabels: { anchor:'end', align:'top', color:'#000', font:{ weight:'bold', size:16 }, formatter:v => v } + }, + scales: { + y: { beginAtZero:true, ticks:{ stepSize:1, precision:0 }, title:{ display:true, text:'Nombre de projets' } }, + x: { title:{ display:true, text:'' } } + } + } +}); + +new Chart(document.getElementById("chartDomaine"), { + type: 'bar', + plugins: [ChartDataLabels], + data: { + labels: domaineLabels, + datasets: [{ label:'Nombre de projets', data: domaineCounts, backgroundColor: couleursOrange }] + }, + options: { + responsive: true, + plugins: { + legend: { display: false }, + datalabels: { anchor:'end', align:'top', color:'#000', font:{ weight:'bold', size:14 }, formatter:v => v } + }, + scales: { + y: { beginAtZero:true, title:{ display:true, text:'Nombre de projets' }, ticks:{ precision:0, stepSize:1 } }, + x: { + ticks:{ autoSkip:false, maxRotation:100, minRotation:30, callback: function(value){ return this.getLabelForValue(value); } } + } + } + } +}); + +document.getElementById('btnVoirRapport').addEventListener('click', function() { + const projetId = document.getElementById('projetId').value; + if(!projetId) return alert("Veuillez sélectionner un projet."); + fetch(`/rapports/projet/${projetId}/`) + .then(resp => { if(!resp.ok) throw new Error("Projet non trouvé"); return resp.text(); }) + .then(html => { document.getElementById('contenuRapportProjet').innerHTML = html; }) + .catch(err => { document.getElementById('contenuRapportProjet').innerHTML = "

    Erreur lors du chargement.

    "; console.error(err); }); +}); \ No newline at end of file diff --git a/static/js/sirh-index.js b/static/js/sirh-index.js new file mode 100644 index 0000000..242fed3 --- /dev/null +++ b/static/js/sirh-index.js @@ -0,0 +1,75 @@ + + + + + + + +> + + +{% endif %} + + + + + + \ No newline at end of file diff --git a/staticfiles/admin/css/autocomplete.css b/staticfiles/admin/css/autocomplete.css new file mode 100644 index 0000000..7478c2c --- /dev/null +++ b/staticfiles/admin/css/autocomplete.css @@ -0,0 +1,279 @@ +select.admin-autocomplete { + width: 20em; +} + +.select2-container--admin-autocomplete.select2-container { + min-height: 30px; +} + +.select2-container--admin-autocomplete .select2-selection--single, +.select2-container--admin-autocomplete .select2-selection--multiple { + min-height: 30px; + padding: 0; +} + +.select2-container--admin-autocomplete.select2-container--focus .select2-selection, +.select2-container--admin-autocomplete.select2-container--open .select2-selection { + border-color: var(--body-quiet-color); + min-height: 30px; +} + +.select2-container--admin-autocomplete.select2-container--focus .select2-selection.select2-selection--single, +.select2-container--admin-autocomplete.select2-container--open .select2-selection.select2-selection--single { + padding: 0; +} + +.select2-container--admin-autocomplete.select2-container--focus .select2-selection.select2-selection--multiple, +.select2-container--admin-autocomplete.select2-container--open .select2-selection.select2-selection--multiple { + padding: 0; +} + +.select2-container--admin-autocomplete .select2-selection--single { + background-color: var(--body-bg); + border: 1px solid var(--border-color); + border-radius: 4px; +} + +.select2-container--admin-autocomplete .select2-selection--single .select2-selection__rendered { + color: var(--body-fg); + line-height: 30px; +} + +.select2-container--admin-autocomplete .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; +} + +.select2-container--admin-autocomplete .select2-selection--single .select2-selection__placeholder { + color: var(--body-quiet-color); +} + +.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow { + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; +} + +.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; +} + +.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; +} + +.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--single .select2-selection__arrow { + left: 1px; + right: auto; +} + +.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single { + background-color: var(--darkened-bg); + cursor: default; +} + +.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single .select2-selection__clear { + display: none; +} + +.select2-container--admin-autocomplete.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; +} + +.select2-container--admin-autocomplete .select2-selection--multiple { + background-color: var(--body-bg); + border: 1px solid var(--border-color); + border-radius: 4px; + cursor: text; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered { + box-sizing: border-box; + list-style: none; + margin: 0; + padding: 0 10px 5px 5px; + width: 100%; + display: flex; + flex-wrap: wrap; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered li { + list-style: none; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__placeholder { + color: var(--body-quiet-color); + margin-top: 5px; + float: left; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin: 5px; + position: absolute; + right: 0; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice { + background-color: var(--darkened-bg); + border: 1px solid var(--border-color); + border-radius: 4px; + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px; + padding: 0 5px; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove { + color: var(--body-quiet-color); + cursor: pointer; + display: inline-block; + font-weight: bold; + margin-right: 2px; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove:hover { + color: var(--body-fg); +} + +.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-search--inline { + float: right; +} + +.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + margin-left: 5px; + margin-right: auto; +} + +.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto; +} + +.select2-container--admin-autocomplete.select2-container--focus .select2-selection--multiple { + border: solid var(--body-quiet-color) 1px; + outline: 0; +} + +.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--multiple { + background-color: var(--darkened-bg); + cursor: default; +} + +.select2-container--admin-autocomplete.select2-container--disabled .select2-selection__choice__remove { + display: none; +} + +.select2-container--admin-autocomplete.select2-container--open.select2-container--above .select2-selection--single, .select2-container--admin-autocomplete.select2-container--open.select2-container--above .select2-selection--multiple { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.select2-container--admin-autocomplete.select2-container--open.select2-container--below .select2-selection--single, .select2-container--admin-autocomplete.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.select2-container--admin-autocomplete .select2-search--dropdown { + background: var(--darkened-bg); +} + +.select2-container--admin-autocomplete .select2-search--dropdown .select2-search__field { + background: var(--body-bg); + color: var(--body-fg); + border: 1px solid var(--border-color); + border-radius: 4px; +} + +.select2-container--admin-autocomplete .select2-search--inline .select2-search__field { + background: transparent; + color: var(--body-fg); + border: none; + outline: 0; + box-shadow: none; + -webkit-appearance: textfield; +} + +.select2-container--admin-autocomplete .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; + color: var(--body-fg); + background: var(--body-bg); +} + +.select2-container--admin-autocomplete .select2-results__option[role=group] { + padding: 0; +} + +.select2-container--admin-autocomplete .select2-results__option[aria-disabled=true] { + color: var(--body-quiet-color); +} + +.select2-container--admin-autocomplete .select2-results__option[aria-selected=true] { + background-color: var(--selected-bg); + color: var(--body-fg); +} + +.select2-container--admin-autocomplete .select2-results__option .select2-results__option { + padding-left: 1em; +} + +.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__group { + padding-left: 0; +} + +.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option { + margin-left: -1em; + padding-left: 2em; +} + +.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -2em; + padding-left: 3em; +} + +.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -3em; + padding-left: 4em; +} + +.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -4em; + padding-left: 5em; +} + +.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -5em; + padding-left: 6em; +} + +.select2-container--admin-autocomplete .select2-results__option--highlighted[aria-selected] { + background-color: var(--primary); + color: var(--primary-fg); +} + +.select2-container--admin-autocomplete .select2-results__group { + cursor: default; + display: block; + padding: 6px; +} + +.errors .select2-selection { + border: 1px solid var(--error-fg); +} diff --git a/staticfiles/admin/css/base.css b/staticfiles/admin/css/base.css new file mode 100644 index 0000000..3791043 --- /dev/null +++ b/staticfiles/admin/css/base.css @@ -0,0 +1,1180 @@ +/* + DJANGO Admin styles +*/ + +/* VARIABLE DEFINITIONS */ +html[data-theme="light"], +:root { + --primary: #79aec8; + --secondary: #417690; + --accent: #f5dd5d; + --primary-fg: #fff; + + --body-fg: #333; + --body-bg: #fff; + --body-quiet-color: #666; + --body-medium-color: #444; + --body-loud-color: #000; + + --header-color: #ffc; + --header-branding-color: var(--accent); + --header-bg: var(--secondary); + --header-link-color: var(--primary-fg); + + --breadcrumbs-fg: #c4dce8; + --breadcrumbs-link-fg: var(--body-bg); + --breadcrumbs-bg: #264b5d; + + --link-fg: #417893; + --link-hover-color: #036; + --link-selected-fg: var(--secondary); + + --hairline-color: #e8e8e8; + --border-color: #ccc; + + --error-fg: #ba2121; + + --message-success-bg: #dfd; + --message-warning-bg: #ffc; + --message-error-bg: #ffefef; + + --darkened-bg: #f8f8f8; /* A bit darker than --body-bg */ + --selected-bg: #e4e4e4; /* E.g. selected table cells */ + --selected-row: #ffc; + + --button-fg: #fff; + --button-bg: var(--secondary); + --button-hover-bg: #205067; + --default-button-bg: #205067; + --default-button-hover-bg: var(--secondary); + --close-button-bg: #747474; + --close-button-hover-bg: #333; + --delete-button-bg: #ba2121; + --delete-button-hover-bg: #a41515; + + --object-tools-fg: var(--button-fg); + --object-tools-bg: var(--close-button-bg); + --object-tools-hover-bg: var(--close-button-hover-bg); + + --font-family-primary: + "Segoe UI", + system-ui, + Roboto, + "Helvetica Neue", + Arial, + sans-serif, + "Apple Color Emoji", + "Segoe UI Emoji", + "Segoe UI Symbol", + "Noto Color Emoji"; + --font-family-monospace: + ui-monospace, + Menlo, + Monaco, + "Cascadia Mono", + "Segoe UI Mono", + "Roboto Mono", + "Oxygen Mono", + "Ubuntu Monospace", + "Source Code Pro", + "Fira Mono", + "Droid Sans Mono", + "Courier New", + monospace, + "Apple Color Emoji", + "Segoe UI Emoji", + "Segoe UI Symbol", + "Noto Color Emoji"; + + color-scheme: light; +} + +html, body { + height: 100%; +} + +body { + margin: 0; + padding: 0; + font-size: 0.875rem; + font-family: var(--font-family-primary); + color: var(--body-fg); + background: var(--body-bg); +} + +/* LINKS */ + +a:link, a:visited { + color: var(--link-fg); + text-decoration: none; + transition: color 0.15s, background 0.15s; +} + +a:focus, a:hover { + color: var(--link-hover-color); +} + +a:focus { + text-decoration: underline; +} + +a img { + border: none; +} + +a.section:link, a.section:visited { + color: var(--header-link-color); + text-decoration: none; +} + +a.section:focus, a.section:hover { + text-decoration: underline; +} + +/* GLOBAL DEFAULTS */ + +p, ol, ul, dl { + margin: .2em 0 .8em 0; +} + +p { + padding: 0; + line-height: 140%; +} + +h1,h2,h3,h4,h5 { + font-weight: bold; +} + +h1 { + margin: 0 0 20px; + font-weight: 300; + font-size: 1.25rem; +} + +h2 { + font-size: 1rem; + margin: 1em 0 .5em 0; +} + +h2.subhead { + font-weight: normal; + margin-top: 0; +} + +h3 { + font-size: 0.875rem; + margin: .8em 0 .3em 0; + color: var(--body-medium-color); + font-weight: bold; +} + +h4 { + font-size: 0.75rem; + margin: 1em 0 .8em 0; + padding-bottom: 3px; + color: var(--body-medium-color); +} + +h5 { + font-size: 0.625rem; + margin: 1.5em 0 .5em 0; + color: var(--body-quiet-color); + text-transform: uppercase; + letter-spacing: 1px; +} + +ul > li { + list-style-type: square; + padding: 1px 0; +} + +li ul { + margin-bottom: 0; +} + +li, dt, dd { + font-size: 0.8125rem; + line-height: 1.25rem; +} + +dt { + font-weight: bold; + margin-top: 4px; +} + +dd { + margin-left: 0; +} + +form { + margin: 0; + padding: 0; +} + +fieldset { + margin: 0; + min-width: 0; + padding: 0; + border: none; + border-top: 1px solid var(--hairline-color); +} + +details summary { + cursor: pointer; +} + +blockquote { + font-size: 0.6875rem; + color: #777; + margin-left: 2px; + padding-left: 10px; + border-left: 5px solid #ddd; +} + +code, pre { + font-family: var(--font-family-monospace); + color: var(--body-quiet-color); + font-size: 0.75rem; + overflow-x: auto; +} + +pre.literal-block { + margin: 10px; + background: var(--darkened-bg); + padding: 6px 8px; +} + +code strong { + color: #930; +} + +hr { + clear: both; + color: var(--hairline-color); + background-color: var(--hairline-color); + height: 1px; + border: none; + margin: 0; + padding: 0; + line-height: 1px; +} + +/* TEXT STYLES & MODIFIERS */ + +.small { + font-size: 0.6875rem; +} + +.mini { + font-size: 0.625rem; +} + +.help, p.help, form p.help, div.help, form div.help, div.help li { + font-size: 0.6875rem; + color: var(--body-quiet-color); +} + +div.help ul { + margin-bottom: 0; +} + +.help-tooltip { + cursor: help; +} + +p img, h1 img, h2 img, h3 img, h4 img, td img { + vertical-align: middle; +} + +.quiet, a.quiet:link, a.quiet:visited { + color: var(--body-quiet-color); + font-weight: normal; +} + +.clear { + clear: both; +} + +.nowrap { + white-space: nowrap; +} + +.hidden { + display: none !important; +} + +/* TABLES */ + +table { + border-collapse: collapse; + border-color: var(--border-color); +} + +td, th { + font-size: 0.8125rem; + line-height: 1rem; + border-bottom: 1px solid var(--hairline-color); + vertical-align: top; + padding: 8px; +} + +th { + font-weight: 500; + text-align: left; +} + +thead th, +tfoot td { + color: var(--body-quiet-color); + padding: 5px 10px; + font-size: 0.6875rem; + background: var(--body-bg); + border: none; + border-top: 1px solid var(--hairline-color); + border-bottom: 1px solid var(--hairline-color); +} + +tfoot td { + border-bottom: none; + border-top: 1px solid var(--hairline-color); +} + +thead th.required { + font-weight: bold; +} + +tr.alt { + background: var(--darkened-bg); +} + +tr:nth-child(odd), .row-form-errors { + background: var(--body-bg); +} + +tr:nth-child(even), +tr:nth-child(even) .errorlist, +tr:nth-child(odd) + .row-form-errors, +tr:nth-child(odd) + .row-form-errors .errorlist { + background: var(--darkened-bg); +} + +/* SORTABLE TABLES */ + +thead th { + padding: 5px 10px; + line-height: normal; + text-transform: uppercase; + background: var(--darkened-bg); +} + +thead th a:link, thead th a:visited { + color: var(--body-quiet-color); +} + +thead th.sorted { + background: var(--selected-bg); +} + +thead th.sorted .text { + padding-right: 42px; +} + +table thead th .text span { + padding: 8px 10px; + display: block; +} + +table thead th .text a { + display: block; + cursor: pointer; + padding: 8px 10px; +} + +table thead th .text a:focus, table thead th .text a:hover { + background: var(--selected-bg); +} + +thead th.sorted a.sortremove { + visibility: hidden; +} + +table thead th.sorted:hover a.sortremove { + visibility: visible; +} + +table thead th.sorted .sortoptions { + display: block; + padding: 9px 5px 0 5px; + float: right; + text-align: right; +} + +table thead th.sorted .sortpriority { + font-size: .8em; + min-width: 12px; + text-align: center; + vertical-align: 3px; + margin-left: 2px; + margin-right: 2px; +} + +table thead th.sorted .sortoptions a { + position: relative; + width: 14px; + height: 14px; + display: inline-block; + background: url(../img/sorting-icons.svg) 0 0 no-repeat; + background-size: 14px auto; +} + +table thead th.sorted .sortoptions a.sortremove { + background-position: 0 0; +} + +table thead th.sorted .sortoptions a.sortremove:after { + content: '\\'; + position: absolute; + top: -6px; + left: 3px; + font-weight: 200; + font-size: 1.125rem; + color: var(--body-quiet-color); +} + +table thead th.sorted .sortoptions a.sortremove:focus:after, +table thead th.sorted .sortoptions a.sortremove:hover:after { + color: var(--link-fg); +} + +table thead th.sorted .sortoptions a.sortremove:focus, +table thead th.sorted .sortoptions a.sortremove:hover { + background-position: 0 -14px; +} + +table thead th.sorted .sortoptions a.ascending { + background-position: 0 -28px; +} + +table thead th.sorted .sortoptions a.ascending:focus, +table thead th.sorted .sortoptions a.ascending:hover { + background-position: 0 -42px; +} + +table thead th.sorted .sortoptions a.descending { + top: 1px; + background-position: 0 -56px; +} + +table thead th.sorted .sortoptions a.descending:focus, +table thead th.sorted .sortoptions a.descending:hover { + background-position: 0 -70px; +} + +/* FORM DEFAULTS */ + +input, textarea, select, .form-row p, form .button { + margin: 2px 0; + padding: 2px 3px; + vertical-align: middle; + font-family: var(--font-family-primary); + font-weight: normal; + font-size: 0.8125rem; +} +.form-row div.help { + padding: 2px 3px; +} + +textarea { + vertical-align: top; +} + +/* +Minifiers remove the default (text) "type" attribute from "input" HTML tags. +Add input:not([type]) to make the CSS stylesheet work the same. +*/ +input:not([type]), input[type=text], input[type=password], input[type=email], +input[type=url], input[type=number], input[type=tel], textarea, select, +.vTextField { + border: 1px solid var(--border-color); + border-radius: 4px; + padding: 5px 6px; + margin-top: 0; + color: var(--body-fg); + background-color: var(--body-bg); +} + +/* +Minifiers remove the default (text) "type" attribute from "input" HTML tags. +Add input:not([type]) to make the CSS stylesheet work the same. +*/ +input:not([type]):focus, input[type=text]:focus, input[type=password]:focus, +input[type=email]:focus, input[type=url]:focus, input[type=number]:focus, +input[type=tel]:focus, textarea:focus, select:focus, .vTextField:focus { + border-color: var(--body-quiet-color); +} + +select { + height: 1.875rem; +} + +select[multiple] { + /* Allow HTML size attribute to override the height in the rule above. */ + height: auto; + min-height: 150px; +} + +/* FORM BUTTONS */ + +.button, input[type=submit], input[type=button], .submit-row input, a.button { + background: var(--button-bg); + padding: 10px 15px; + border: none; + border-radius: 4px; + color: var(--button-fg); + cursor: pointer; + transition: background 0.15s; +} + +a.button { + padding: 4px 5px; +} + +.button:active, input[type=submit]:active, input[type=button]:active, +.button:focus, input[type=submit]:focus, input[type=button]:focus, +.button:hover, input[type=submit]:hover, input[type=button]:hover { + background: var(--button-hover-bg); +} + +.button[disabled], input[type=submit][disabled], input[type=button][disabled] { + opacity: 0.4; +} + +.button.default, input[type=submit].default, .submit-row input.default { + border: none; + font-weight: 400; + background: var(--default-button-bg); +} + +.button.default:active, input[type=submit].default:active, +.button.default:focus, input[type=submit].default:focus, +.button.default:hover, input[type=submit].default:hover { + background: var(--default-button-hover-bg); +} + +.button[disabled].default, +input[type=submit][disabled].default, +input[type=button][disabled].default { + opacity: 0.4; +} + + +/* MODULES */ + +.module { + border: none; + margin-bottom: 30px; + background: var(--body-bg); +} + +.module p, .module ul, .module h3, .module h4, .module dl, .module pre { + padding-left: 10px; + padding-right: 10px; +} + +.module blockquote { + margin-left: 12px; +} + +.module ul, .module ol { + margin-left: 1.5em; +} + +.module h3 { + margin-top: .6em; +} + +.module h2, .module caption, .inline-group h2 { + margin: 0; + padding: 8px; + font-weight: 400; + font-size: 0.8125rem; + text-align: left; + background: var(--header-bg); + color: var(--header-link-color); +} + +.module caption, +.inline-group h2 { + font-size: 0.75rem; + letter-spacing: 0.5px; + text-transform: uppercase; +} + +.module table { + border-collapse: collapse; +} + +/* MESSAGES & ERRORS */ + +ul.messagelist { + padding: 0; + margin: 0; +} + +ul.messagelist li { + display: block; + font-weight: 400; + font-size: 0.8125rem; + padding: 10px 10px 10px 65px; + margin: 0 0 10px 0; + background: var(--message-success-bg) url(../img/icon-yes.svg) 40px 12px no-repeat; + background-size: 16px auto; + color: var(--body-fg); + word-break: break-word; +} + +ul.messagelist li.warning { + background: var(--message-warning-bg) url(../img/icon-alert.svg) 40px 14px no-repeat; + background-size: 14px auto; +} + +ul.messagelist li.error { + background: var(--message-error-bg) url(../img/icon-no.svg) 40px 12px no-repeat; + background-size: 16px auto; +} + +.errornote { + font-size: 0.875rem; + font-weight: 700; + display: block; + padding: 10px 12px; + margin: 0 0 10px 0; + color: var(--error-fg); + border: 1px solid var(--error-fg); + border-radius: 4px; + background-color: var(--body-bg); + background-position: 5px 12px; + overflow-wrap: break-word; +} + +ul.errorlist { + margin: 0 0 4px; + padding: 0; + color: var(--error-fg); + background: var(--body-bg); +} + +ul.errorlist li { + font-size: 0.8125rem; + display: block; + margin-bottom: 4px; + overflow-wrap: break-word; +} + +ul.errorlist li:first-child { + margin-top: 0; +} + +ul.errorlist li a { + color: inherit; + text-decoration: underline; +} + +td ul.errorlist { + margin: 0; + padding: 0; +} + +td ul.errorlist li { + margin: 0; +} + +.form-row.errors { + margin: 0; + border: none; + border-bottom: 1px solid var(--hairline-color); + background: none; +} + +.form-row.errors ul.errorlist li { + padding-left: 0; +} + +.errors input, .errors select, .errors textarea, +td ul.errorlist + input, td ul.errorlist + select, td ul.errorlist + textarea { + border: 1px solid var(--error-fg); +} + +.description { + font-size: 0.75rem; + padding: 5px 0 0 12px; +} + +/* BREADCRUMBS */ + +div.breadcrumbs { + background: var(--breadcrumbs-bg); + padding: 10px 40px; + border: none; + color: var(--breadcrumbs-fg); + text-align: left; +} + +div.breadcrumbs a { + color: var(--breadcrumbs-link-fg); +} + +div.breadcrumbs a:focus, div.breadcrumbs a:hover { + color: var(--breadcrumbs-fg); +} + +/* ACTION ICONS */ + +.viewlink, .inlineviewlink { + padding-left: 16px; + background: url(../img/icon-viewlink.svg) 0 1px no-repeat; +} + +.hidelink { + padding-left: 16px; + background: url(../img/icon-hidelink.svg) 0 1px no-repeat; +} + +.addlink { + padding-left: 16px; + background: url(../img/icon-addlink.svg) 0 1px no-repeat; +} + +.changelink, .inlinechangelink { + padding-left: 16px; + background: url(../img/icon-changelink.svg) 0 1px no-repeat; +} + +.deletelink { + padding-left: 16px; + background: url(../img/icon-deletelink.svg) 0 1px no-repeat; +} + +a.deletelink:link, a.deletelink:visited { + color: #CC3434; /* XXX Probably unused? */ +} + +a.deletelink:focus, a.deletelink:hover { + color: #993333; /* XXX Probably unused? */ + text-decoration: none; +} + +/* OBJECT TOOLS */ + +.object-tools { + font-size: 0.625rem; + font-weight: bold; + padding-left: 0; + float: right; + position: relative; + margin-top: -48px; +} + +.object-tools li { + display: block; + float: left; + margin-left: 5px; + height: 1rem; +} + +.object-tools a { + border-radius: 15px; +} + +.object-tools a:link, .object-tools a:visited { + display: block; + float: left; + padding: 3px 12px; + background: var(--object-tools-bg); + color: var(--object-tools-fg); + font-weight: 400; + font-size: 0.6875rem; + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.object-tools a:focus, .object-tools a:hover { + background-color: var(--object-tools-hover-bg); +} + +.object-tools a:focus{ + text-decoration: none; +} + +.object-tools a.viewsitelink, .object-tools a.addlink { + background-repeat: no-repeat; + background-position: right 7px center; + padding-right: 26px; +} + +.object-tools a.viewsitelink { + background-image: url(../img/tooltag-arrowright.svg); +} + +.object-tools a.addlink { + background-image: url(../img/tooltag-add.svg); +} + +/* OBJECT HISTORY */ + +#change-history table { + width: 100%; +} + +#change-history table tbody th { + width: 16em; +} + +#change-history .paginator { + color: var(--body-quiet-color); + border-bottom: 1px solid var(--hairline-color); + background: var(--body-bg); + overflow: hidden; +} + +/* PAGE STRUCTURE */ + +#container { + position: relative; + width: 100%; + min-width: 980px; + padding: 0; + display: flex; + flex-direction: column; + height: 100%; +} + +#container > .main { + display: flex; + flex: 1 0 auto; +} + +.main > .content { + flex: 1 0; + max-width: 100%; +} + +.skip-to-content-link { + position: absolute; + top: -999px; + margin: 5px; + padding: 5px; + background: var(--body-bg); + z-index: 1; +} + +.skip-to-content-link:focus { + left: 0px; + top: 0px; +} + +#content { + padding: 20px 40px; +} + +.dashboard #content { + width: 600px; +} + +#content-main { + float: left; + width: 100%; +} + +#content-related { + float: right; + width: 260px; + position: relative; + margin-right: -300px; +} + +@media (forced-colors: active) { + #content-related { + border: 1px solid; + } +} + +/* COLUMN TYPES */ + +.colMS { + margin-right: 300px; +} + +.colSM { + margin-left: 300px; +} + +.colSM #content-related { + float: left; + margin-right: 0; + margin-left: -300px; +} + +.colSM #content-main { + float: right; +} + +.popup .colM { + width: auto; +} + +/* HEADER */ + +#header { + width: auto; + height: auto; + display: flex; + justify-content: space-between; + align-items: center; + padding: 10px 40px; + background: var(--header-bg); + color: var(--header-color); +} + +#header a:link, #header a:visited, #logout-form button { + color: var(--header-link-color); +} + +#header a:focus , #header a:hover { + text-decoration: underline; +} + +@media (forced-colors: active) { + #header { + border-bottom: 1px solid; + } +} + +#branding { + display: flex; +} + +#site-name { + padding: 0; + margin: 0; + margin-inline-end: 20px; + font-weight: 300; + font-size: 1.5rem; + color: var(--header-branding-color); +} + +#site-name a:link, #site-name a:visited { + color: var(--accent); +} + +#branding h2 { + padding: 0 10px; + font-size: 0.875rem; + margin: -8px 0 8px 0; + font-weight: normal; + color: var(--header-color); +} + +#branding a:hover { + text-decoration: none; +} + +#logout-form { + display: inline; +} + +#logout-form button { + background: none; + border: 0; + cursor: pointer; + font-family: var(--font-family-primary); +} + +#user-tools { + float: right; + margin: 0 0 0 20px; + text-align: right; +} + +#user-tools, #logout-form button{ + padding: 0; + font-weight: 300; + font-size: 0.6875rem; + letter-spacing: 0.5px; + text-transform: uppercase; +} + +#user-tools a, #logout-form button { + border-bottom: 1px solid rgba(255, 255, 255, 0.25); +} + +#user-tools a:focus, #user-tools a:hover, +#logout-form button:active, #logout-form button:hover { + text-decoration: none; + border-bottom: 0; +} + +#logout-form button:active, #logout-form button:hover { + margin-bottom: 1px; +} + +/* SIDEBAR */ + +#content-related { + background: var(--darkened-bg); +} + +#content-related .module { + background: none; +} + +#content-related h3 { + color: var(--body-quiet-color); + padding: 0 16px; + margin: 0 0 16px; +} + +#content-related h4 { + font-size: 0.8125rem; +} + +#content-related p { + padding-left: 16px; + padding-right: 16px; +} + +#content-related .actionlist { + padding: 0; + margin: 16px; +} + +#content-related .actionlist li { + line-height: 1.2; + margin-bottom: 10px; + padding-left: 18px; +} + +#content-related .module h2 { + background: none; + padding: 16px; + margin-bottom: 16px; + border-bottom: 1px solid var(--hairline-color); + font-size: 1.125rem; + color: var(--body-fg); +} + +.delete-confirmation form input[type="submit"] { + background: var(--delete-button-bg); + border-radius: 4px; + padding: 10px 15px; + color: var(--button-fg); +} + +.delete-confirmation form input[type="submit"]:active, +.delete-confirmation form input[type="submit"]:focus, +.delete-confirmation form input[type="submit"]:hover { + background: var(--delete-button-hover-bg); +} + +.delete-confirmation form .cancel-link { + display: inline-block; + vertical-align: middle; + height: 0.9375rem; + line-height: 0.9375rem; + border-radius: 4px; + padding: 10px 15px; + color: var(--button-fg); + background: var(--close-button-bg); + margin: 0 0 0 10px; +} + +.delete-confirmation form .cancel-link:active, +.delete-confirmation form .cancel-link:focus, +.delete-confirmation form .cancel-link:hover { + background: var(--close-button-hover-bg); +} + +/* POPUP */ +.popup #content { + padding: 20px; +} + +.popup #container { + min-width: 0; +} + +.popup #header { + padding: 10px 20px; +} + +/* PAGINATOR */ + +.paginator { + display: flex; + align-items: center; + gap: 4px; + font-size: 0.8125rem; + padding-top: 10px; + padding-bottom: 10px; + line-height: 22px; + margin: 0; + border-top: 1px solid var(--hairline-color); + width: 100%; + box-sizing: border-box; +} + +.paginator a:link, .paginator a:visited { + padding: 2px 6px; + background: var(--button-bg); + text-decoration: none; + color: var(--button-fg); +} + +.paginator a.showall { + border: none; + background: none; + color: var(--link-fg); +} + +.paginator a.showall:focus, .paginator a.showall:hover { + background: none; + color: var(--link-hover-color); +} + +.paginator .end { + margin-right: 6px; +} + +.paginator .this-page { + padding: 2px 6px; + font-weight: bold; + font-size: 0.8125rem; + vertical-align: top; +} + +.paginator a:focus, .paginator a:hover { + color: white; + background: var(--link-hover-color); +} + +.paginator input { + margin-left: auto; +} + +.base-svgs { + display: none; +} + +.visually-hidden { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + overflow: hidden; + clip: rect(0,0,0,0); + white-space: nowrap; + border: 0; + color: var(--body-fg); + background-color: var(--body-bg); +} diff --git a/staticfiles/admin/css/changelists.css b/staticfiles/admin/css/changelists.css new file mode 100644 index 0000000..005b776 --- /dev/null +++ b/staticfiles/admin/css/changelists.css @@ -0,0 +1,343 @@ +/* CHANGELISTS */ + +#changelist { + display: flex; + align-items: flex-start; + justify-content: space-between; +} + +#changelist .changelist-form-container { + flex: 1 1 auto; + min-width: 0; +} + +#changelist table { + width: 100%; +} + +.change-list .hiddenfields { display:none; } + +.change-list .filtered table { + border-right: none; +} + +.change-list .filtered { + min-height: 400px; +} + +.change-list .filtered .results, .change-list .filtered .paginator, +.filtered #toolbar, .filtered div.xfull { + width: auto; +} + +.change-list .filtered table tbody th { + padding-right: 1em; +} + +#changelist-form .results { + overflow-x: auto; + width: 100%; +} + +#changelist .toplinks { + border-bottom: 1px solid var(--hairline-color); +} + +#changelist .paginator { + color: var(--body-quiet-color); + border-bottom: 1px solid var(--hairline-color); + background: var(--body-bg); + overflow: hidden; +} + +/* CHANGELIST TABLES */ + +#changelist table thead th { + padding: 0; + white-space: nowrap; + vertical-align: middle; +} + +#changelist table thead th.action-checkbox-column { + width: 1.5em; + text-align: center; +} + +#changelist table tbody td.action-checkbox { + text-align: center; +} + +#changelist table tfoot { + color: var(--body-quiet-color); +} + +/* TOOLBAR */ + +#toolbar { + padding: 8px 10px; + margin-bottom: 15px; + border-top: 1px solid var(--hairline-color); + border-bottom: 1px solid var(--hairline-color); + background: var(--darkened-bg); + color: var(--body-quiet-color); +} + +#toolbar form input { + border-radius: 4px; + font-size: 0.875rem; + padding: 5px; + color: var(--body-fg); +} + +#toolbar #searchbar { + height: 1.1875rem; + border: 1px solid var(--border-color); + padding: 2px 5px; + margin: 0; + vertical-align: top; + font-size: 0.8125rem; + max-width: 100%; +} + +#toolbar #searchbar:focus { + border-color: var(--body-quiet-color); +} + +#toolbar form input[type="submit"] { + border: 1px solid var(--border-color); + font-size: 0.8125rem; + padding: 4px 8px; + margin: 0; + vertical-align: middle; + background: var(--body-bg); + box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; + cursor: pointer; + color: var(--body-fg); +} + +#toolbar form input[type="submit"]:focus, +#toolbar form input[type="submit"]:hover { + border-color: var(--body-quiet-color); +} + +#changelist-search img { + vertical-align: middle; + margin-right: 4px; +} + +#changelist-search .help { + word-break: break-word; +} + +/* FILTER COLUMN */ + +#changelist-filter { + flex: 0 0 240px; + order: 1; + background: var(--darkened-bg); + border-left: none; + margin: 0 0 0 30px; +} + +@media (forced-colors: active) { + #changelist-filter { + border: 1px solid; + } +} + +#changelist-filter h2 { + font-size: 0.875rem; + text-transform: uppercase; + letter-spacing: 0.5px; + padding: 5px 15px; + margin-bottom: 12px; + border-bottom: none; +} + +#changelist-filter h3, +#changelist-filter details summary { + font-weight: 400; + padding: 0 15px; + margin-bottom: 10px; +} + +#changelist-filter details summary > * { + display: inline; +} + +#changelist-filter details > summary { + list-style-type: none; +} + +#changelist-filter details > summary::-webkit-details-marker { + display: none; +} + +#changelist-filter details > summary::before { + content: '→'; + font-weight: bold; + color: var(--link-hover-color); +} + +#changelist-filter details[open] > summary::before { + content: '↓'; +} + +#changelist-filter ul { + margin: 5px 0; + padding: 0 15px 15px; + border-bottom: 1px solid var(--hairline-color); +} + +#changelist-filter ul:last-child { + border-bottom: none; +} + +#changelist-filter li { + list-style-type: none; + margin-left: 0; + padding-left: 0; +} + +#changelist-filter a { + display: block; + color: var(--body-quiet-color); + word-break: break-word; +} + +#changelist-filter li.selected { + border-left: 5px solid var(--hairline-color); + padding-left: 10px; + margin-left: -15px; +} + +#changelist-filter li.selected a { + color: var(--link-selected-fg); +} + +#changelist-filter a:focus, #changelist-filter a:hover, +#changelist-filter li.selected a:focus, +#changelist-filter li.selected a:hover { + color: var(--link-hover-color); +} + +#changelist-filter #changelist-filter-extra-actions { + font-size: 0.8125rem; + margin-bottom: 10px; + border-bottom: 1px solid var(--hairline-color); +} + +/* DATE DRILLDOWN */ + +.change-list .toplinks { + display: flex; + padding-bottom: 5px; + flex-wrap: wrap; + gap: 3px 17px; + font-weight: bold; +} + +.change-list .toplinks a { + font-size: 0.8125rem; +} + +.change-list .toplinks .date-back { + color: var(--body-quiet-color); +} + +.change-list .toplinks .date-back:focus, +.change-list .toplinks .date-back:hover { + color: var(--link-hover-color); +} + +/* ACTIONS */ + +.filtered .actions { + border-right: none; +} + +#changelist table input { + margin: 0; + vertical-align: baseline; +} + +/* Once the :has() pseudo-class is supported by all browsers, the tr.selected + selector and the JS adding the class can be removed. */ +#changelist tbody tr.selected { + background-color: var(--selected-row); +} + +#changelist tbody tr:has(.action-select:checked) { + background-color: var(--selected-row); +} + +@media (forced-colors: active) { + #changelist tbody tr.selected { + background-color: SelectedItem; + } + #changelist tbody tr:has(.action-select:checked) { + background-color: SelectedItem; + } +} + +#changelist .actions { + padding: 10px; + background: var(--body-bg); + border-top: none; + border-bottom: none; + line-height: 1.5rem; + color: var(--body-quiet-color); + width: 100%; +} + +#changelist .actions span.all, +#changelist .actions span.action-counter, +#changelist .actions span.clear, +#changelist .actions span.question { + font-size: 0.8125rem; + margin: 0 0.5em; +} + +#changelist .actions:last-child { + border-bottom: none; +} + +#changelist .actions select { + vertical-align: top; + height: 1.5rem; + color: var(--body-fg); + border: 1px solid var(--border-color); + border-radius: 4px; + font-size: 0.875rem; + padding: 0 0 0 4px; + margin: 0; + margin-left: 10px; +} + +#changelist .actions select:focus { + border-color: var(--body-quiet-color); +} + +#changelist .actions label { + display: inline-block; + vertical-align: middle; + font-size: 0.8125rem; +} + +#changelist .actions .button { + font-size: 0.8125rem; + border: 1px solid var(--border-color); + border-radius: 4px; + background: var(--body-bg); + box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; + cursor: pointer; + height: 1.5rem; + line-height: 1; + padding: 4px 8px; + margin: 0; + color: var(--body-fg); +} + +#changelist .actions .button:focus, #changelist .actions .button:hover { + border-color: var(--body-quiet-color); +} diff --git a/staticfiles/admin/css/dark_mode.css b/staticfiles/admin/css/dark_mode.css new file mode 100644 index 0000000..65b58d0 --- /dev/null +++ b/staticfiles/admin/css/dark_mode.css @@ -0,0 +1,130 @@ +@media (prefers-color-scheme: dark) { + :root { + --primary: #264b5d; + --primary-fg: #f7f7f7; + + --body-fg: #eeeeee; + --body-bg: #121212; + --body-quiet-color: #d0d0d0; + --body-medium-color: #e0e0e0; + --body-loud-color: #ffffff; + + --breadcrumbs-link-fg: #e0e0e0; + --breadcrumbs-bg: var(--primary); + + --link-fg: #81d4fa; + --link-hover-color: #4ac1f7; + --link-selected-fg: #6f94c6; + + --hairline-color: #272727; + --border-color: #353535; + + --error-fg: #e35f5f; + --message-success-bg: #006b1b; + --message-warning-bg: #583305; + --message-error-bg: #570808; + + --darkened-bg: #212121; + --selected-bg: #1b1b1b; + --selected-row: #00363a; + + --close-button-bg: #333333; + --close-button-hover-bg: #666666; + + color-scheme: dark; + } + } + + +html[data-theme="dark"] { + --primary: #264b5d; + --primary-fg: #f7f7f7; + + --body-fg: #eeeeee; + --body-bg: #121212; + --body-quiet-color: #d0d0d0; + --body-medium-color: #e0e0e0; + --body-loud-color: #ffffff; + + --breadcrumbs-link-fg: #e0e0e0; + --breadcrumbs-bg: var(--primary); + + --link-fg: #81d4fa; + --link-hover-color: #4ac1f7; + --link-selected-fg: #6f94c6; + + --hairline-color: #272727; + --border-color: #353535; + + --error-fg: #e35f5f; + --message-success-bg: #006b1b; + --message-warning-bg: #583305; + --message-error-bg: #570808; + + --darkened-bg: #212121; + --selected-bg: #1b1b1b; + --selected-row: #00363a; + + --close-button-bg: #333333; + --close-button-hover-bg: #666666; + + color-scheme: dark; +} + +/* THEME SWITCH */ +.theme-toggle { + cursor: pointer; + border: none; + padding: 0; + background: transparent; + vertical-align: middle; + margin-inline-start: 5px; + margin-top: -1px; +} + +.theme-toggle svg { + vertical-align: middle; + height: 1.5rem; + width: 1.5rem; + display: none; +} + +/* +Fully hide screen reader text so we only show the one matching the current +theme. +*/ +.theme-toggle .visually-hidden { + display: none; +} + +html[data-theme="auto"] .theme-toggle .theme-label-when-auto { + display: block; +} + +html[data-theme="dark"] .theme-toggle .theme-label-when-dark { + display: block; +} + +html[data-theme="light"] .theme-toggle .theme-label-when-light { + display: block; +} + +/* ICONS */ +.theme-toggle svg.theme-icon-when-auto, +.theme-toggle svg.theme-icon-when-dark, +.theme-toggle svg.theme-icon-when-light { + fill: var(--header-link-color); + color: var(--header-bg); +} + +html[data-theme="auto"] .theme-toggle svg.theme-icon-when-auto { + display: block; +} + +html[data-theme="dark"] .theme-toggle svg.theme-icon-when-dark { + display: block; +} + +html[data-theme="light"] .theme-toggle svg.theme-icon-when-light { + display: block; +} diff --git a/staticfiles/admin/css/dashboard.css b/staticfiles/admin/css/dashboard.css new file mode 100644 index 0000000..242b81a --- /dev/null +++ b/staticfiles/admin/css/dashboard.css @@ -0,0 +1,29 @@ +/* DASHBOARD */ +.dashboard td, .dashboard th { + word-break: break-word; +} + +.dashboard .module table th { + width: 100%; +} + +.dashboard .module table td { + white-space: nowrap; +} + +.dashboard .module table td a { + display: block; + padding-right: .6em; +} + +/* RECENT ACTIONS MODULE */ + +.module ul.actionlist { + margin-left: 0; +} + +ul.actionlist li { + list-style-type: none; + overflow: hidden; + text-overflow: ellipsis; +} diff --git a/staticfiles/admin/css/forms.css b/staticfiles/admin/css/forms.css new file mode 100644 index 0000000..c6ce788 --- /dev/null +++ b/staticfiles/admin/css/forms.css @@ -0,0 +1,498 @@ +@import url('widgets.css'); + +/* FORM ROWS */ + +.form-row { + overflow: hidden; + padding: 10px; + font-size: 0.8125rem; + border-bottom: 1px solid var(--hairline-color); +} + +.form-row img, .form-row input { + vertical-align: middle; +} + +.form-row label input[type="checkbox"] { + margin-top: 0; + vertical-align: 0; +} + +form .form-row p { + padding-left: 0; +} + +.flex-container { + display: flex; +} + +.form-multiline { + flex-wrap: wrap; +} + +.form-multiline > div { + padding-bottom: 10px; +} + +/* FORM LABELS */ + +label { + font-weight: normal; + color: var(--body-quiet-color); + font-size: 0.8125rem; +} + +.required label, label.required { + font-weight: bold; +} + +/* RADIO BUTTONS */ + +form div.radiolist div { + padding-right: 7px; +} + +form div.radiolist.inline div { + display: inline-block; +} + +form div.radiolist label { + width: auto; +} + +form div.radiolist input[type="radio"] { + margin: -2px 4px 0 0; + padding: 0; +} + +form ul.inline { + margin-left: 0; + padding: 0; +} + +form ul.inline li { + float: left; + padding-right: 7px; +} + +/* FIELDSETS */ + +fieldset .fieldset-heading, +fieldset .inline-heading, +:not(.inline-related) .collapse summary { + border: 1px solid var(--header-bg); + margin: 0; + padding: 8px; + font-weight: 400; + font-size: 0.8125rem; + background: var(--header-bg); + color: var(--header-link-color); +} + +/* ALIGNED FIELDSETS */ + +.aligned label { + display: block; + padding: 4px 10px 0 0; + min-width: 160px; + width: 160px; + word-wrap: break-word; +} + +.aligned label:not(.vCheckboxLabel):after { + content: ''; + display: inline-block; + vertical-align: middle; +} + +.aligned label + p, .aligned .checkbox-row + div.help, .aligned label + div.readonly { + padding: 6px 0; + margin-top: 0; + margin-bottom: 0; + margin-left: 0; + overflow-wrap: break-word; +} + +.aligned ul label { + display: inline; + float: none; + width: auto; +} + +.aligned .form-row input { + margin-bottom: 0; +} + +.colMS .aligned .vLargeTextField, .colMS .aligned .vXMLLargeTextField { + width: 350px; +} + +form .aligned ul { + margin-left: 160px; + padding-left: 10px; +} + +form .aligned div.radiolist { + display: inline-block; + margin: 0; + padding: 0; +} + +form .aligned p.help, +form .aligned div.help { + margin-top: 0; + margin-left: 160px; + padding-left: 10px; +} + +form .aligned p.date div.help.timezonewarning, +form .aligned p.datetime div.help.timezonewarning, +form .aligned p.time div.help.timezonewarning { + margin-left: 0; + padding-left: 0; + font-weight: normal; +} + +form .aligned p.help:last-child, +form .aligned div.help:last-child { + margin-bottom: 0; + padding-bottom: 0; +} + +form .aligned input + p.help, +form .aligned textarea + p.help, +form .aligned select + p.help, +form .aligned input + div.help, +form .aligned textarea + div.help, +form .aligned select + div.help { + margin-left: 160px; + padding-left: 10px; +} + +form .aligned select option:checked { + background-color: var(--selected-row); +} + +form .aligned ul li { + list-style: none; +} + +form .aligned table p { + margin-left: 0; + padding-left: 0; +} + +.aligned .vCheckboxLabel { + padding: 1px 0 0 5px; +} + +.aligned .vCheckboxLabel + p.help, +.aligned .vCheckboxLabel + div.help { + margin-top: -4px; +} + +.colM .aligned .vLargeTextField, .colM .aligned .vXMLLargeTextField { + width: 610px; +} + +fieldset .fieldBox { + margin-right: 20px; +} + +/* WIDE FIELDSETS */ + +.wide label { + width: 200px; +} + +form .wide p.help, +form .wide ul.errorlist, +form .wide div.help { + padding-left: 50px; +} + +form div.help ul { + padding-left: 0; + margin-left: 0; +} + +.colM fieldset.wide .vLargeTextField, .colM fieldset.wide .vXMLLargeTextField { + width: 450px; +} + +/* COLLAPSIBLE FIELDSETS */ + +.collapse summary .fieldset-heading, +.collapse summary .inline-heading { + background: transparent; + border: none; + color: currentColor; + display: inline; + margin: 0; + padding: 0; +} + +/* MONOSPACE TEXTAREAS */ + +fieldset.monospace textarea { + font-family: var(--font-family-monospace); +} + +/* SUBMIT ROW */ + +.submit-row { + padding: 12px 14px 12px; + margin: 0 0 20px; + background: var(--darkened-bg); + border: 1px solid var(--hairline-color); + border-radius: 4px; + overflow: hidden; + display: flex; + gap: 10px; + flex-wrap: wrap; +} + +body.popup .submit-row { + overflow: auto; +} + +.submit-row input { + height: 2.1875rem; + line-height: 0.9375rem; +} + +.submit-row input, .submit-row a { + margin: 0; +} + +.submit-row input.default { + text-transform: uppercase; +} + +.submit-row a.deletelink { + margin-left: auto; +} + +.submit-row a.deletelink { + display: block; + background: var(--delete-button-bg); + border-radius: 4px; + padding: 0.625rem 0.9375rem; + height: 0.9375rem; + line-height: 0.9375rem; + color: var(--button-fg); +} + +.submit-row a.closelink { + display: inline-block; + background: var(--close-button-bg); + border-radius: 4px; + padding: 10px 15px; + height: 0.9375rem; + line-height: 0.9375rem; + color: var(--button-fg); +} + +.submit-row a.deletelink:focus, +.submit-row a.deletelink:hover, +.submit-row a.deletelink:active { + background: var(--delete-button-hover-bg); + text-decoration: none; +} + +.submit-row a.closelink:focus, +.submit-row a.closelink:hover, +.submit-row a.closelink:active { + background: var(--close-button-hover-bg); + text-decoration: none; +} + +/* CUSTOM FORM FIELDS */ + +.vSelectMultipleField { + vertical-align: top; +} + +.vCheckboxField { + border: none; +} + +.vDateField, .vTimeField { + margin-right: 2px; + margin-bottom: 4px; +} + +.vDateField { + min-width: 6.85em; +} + +.vTimeField { + min-width: 4.7em; +} + +.vURLField { + width: 30em; +} + +.vLargeTextField, .vXMLLargeTextField { + width: 48em; +} + +.flatpages-flatpage #id_content { + height: 40.2em; +} + +.module table .vPositiveSmallIntegerField { + width: 2.2em; +} + +.vIntegerField { + width: 5em; +} + +.vBigIntegerField { + width: 10em; +} + +.vForeignKeyRawIdAdminField { + width: 5em; +} + +.vTextField, .vUUIDField { + width: 20em; +} + +/* INLINES */ + +.inline-group { + padding: 0; + margin: 0 0 30px; +} + +.inline-group thead th { + padding: 8px 10px; +} + +.inline-group .aligned label { + width: 160px; +} + +.inline-related { + position: relative; +} + +.inline-related h4, +.inline-related:not(.tabular) .collapse summary { + margin: 0; + color: var(--body-medium-color); + padding: 5px; + font-size: 0.8125rem; + background: var(--darkened-bg); + border: 1px solid var(--hairline-color); + border-left-color: var(--darkened-bg); + border-right-color: var(--darkened-bg); +} + +.inline-related h3 span.delete { + float: right; +} + +.inline-related h3 span.delete label { + margin-left: 2px; + font-size: 0.6875rem; +} + +.inline-related fieldset { + margin: 0; + background: var(--body-bg); + border: none; + width: 100%; +} + +.inline-group .tabular fieldset.module { + border: none; +} + +.inline-related.tabular fieldset.module table { + width: 100%; + overflow-x: scroll; +} + +.last-related fieldset { + border: none; +} + +.inline-group .tabular tr.has_original td { + padding-top: 2em; +} + +.inline-group .tabular tr td.original { + padding: 2px 0 0 0; + width: 0; + _position: relative; +} + +.inline-group .tabular th.original { + width: 0px; + padding: 0; +} + +.inline-group .tabular td.original p { + position: absolute; + left: 0; + height: 1.1em; + padding: 2px 9px; + overflow: hidden; + font-size: 0.5625rem; + font-weight: bold; + color: var(--body-quiet-color); + _width: 700px; +} + +.inline-group div.add-row, +.inline-group .tabular tr.add-row td { + color: var(--body-quiet-color); + background: var(--darkened-bg); + padding: 8px 10px; + border-bottom: 1px solid var(--hairline-color); +} + +.inline-group .tabular tr.add-row td { + padding: 8px 10px; + border-bottom: 1px solid var(--hairline-color); +} + +.inline-group div.add-row a, +.inline-group .tabular tr.add-row td a { + font-size: 0.75rem; +} + +.empty-form { + display: none; +} + +/* RELATED FIELD ADD ONE / LOOKUP */ + +.related-lookup { + margin-left: 5px; + display: inline-block; + vertical-align: middle; + background-repeat: no-repeat; + background-size: 14px; +} + +.related-lookup { + width: 1rem; + height: 1rem; + background-image: url(../img/search.svg); +} + +form .related-widget-wrapper ul { + display: inline-block; + margin-left: 0; + padding-left: 0; +} + +.clearable-file-input input { + margin-top: 0; +} diff --git a/staticfiles/admin/css/login.css b/staticfiles/admin/css/login.css new file mode 100644 index 0000000..805a34b --- /dev/null +++ b/staticfiles/admin/css/login.css @@ -0,0 +1,61 @@ +/* LOGIN FORM */ + +.login { + background: var(--darkened-bg); + height: auto; +} + +.login #header { + height: auto; + padding: 15px 16px; + justify-content: center; +} + +.login #header h1 { + font-size: 1.125rem; + margin: 0; +} + +.login #header h1 a { + color: var(--header-link-color); +} + +.login #content { + padding: 20px; +} + +.login #container { + background: var(--body-bg); + border: 1px solid var(--hairline-color); + border-radius: 4px; + overflow: hidden; + width: 28em; + min-width: 300px; + margin: 100px auto; + height: auto; +} + +.login .form-row { + padding: 4px 0; +} + +.login .form-row label { + display: block; + line-height: 2em; +} + +.login .form-row #id_username, .login .form-row #id_password { + padding: 8px; + width: 100%; + box-sizing: border-box; +} + +.login .submit-row { + padding: 1em 0 0 0; + margin: 0; + text-align: center; +} + +.login .password-reset-link { + text-align: center; +} diff --git a/staticfiles/admin/css/nav_sidebar.css b/staticfiles/admin/css/nav_sidebar.css new file mode 100644 index 0000000..7eb0de9 --- /dev/null +++ b/staticfiles/admin/css/nav_sidebar.css @@ -0,0 +1,150 @@ +.sticky { + position: sticky; + top: 0; + max-height: 100vh; +} + +.toggle-nav-sidebar { + z-index: 20; + left: 0; + display: flex; + align-items: center; + justify-content: center; + flex: 0 0 23px; + width: 23px; + border: 0; + border-right: 1px solid var(--hairline-color); + background-color: var(--body-bg); + cursor: pointer; + font-size: 1.25rem; + color: var(--link-fg); + padding: 0; +} + +[dir="rtl"] .toggle-nav-sidebar { + border-left: 1px solid var(--hairline-color); + border-right: 0; +} + +.toggle-nav-sidebar:hover, +.toggle-nav-sidebar:focus { + background-color: var(--darkened-bg); +} + +#nav-sidebar { + z-index: 15; + flex: 0 0 275px; + left: -276px; + margin-left: -276px; + border-top: 1px solid transparent; + border-right: 1px solid var(--hairline-color); + background-color: var(--body-bg); + overflow: auto; +} + +[dir="rtl"] #nav-sidebar { + border-left: 1px solid var(--hairline-color); + border-right: 0; + left: 0; + margin-left: 0; + right: -276px; + margin-right: -276px; +} + +.toggle-nav-sidebar::before { + content: '\00BB'; +} + +.main.shifted .toggle-nav-sidebar::before { + content: '\00AB'; +} + +.main > #nav-sidebar { + visibility: hidden; +} + +.main.shifted > #nav-sidebar { + margin-left: 0; + visibility: visible; +} + +[dir="rtl"] .main.shifted > #nav-sidebar { + margin-right: 0; +} + +#nav-sidebar .module th { + width: 100%; + overflow-wrap: anywhere; +} + +#nav-sidebar .module th, +#nav-sidebar .module caption { + padding-left: 16px; +} + +#nav-sidebar .module td { + white-space: nowrap; +} + +[dir="rtl"] #nav-sidebar .module th, +[dir="rtl"] #nav-sidebar .module caption { + padding-left: 8px; + padding-right: 16px; +} + +#nav-sidebar .current-app .section:link, +#nav-sidebar .current-app .section:visited { + color: var(--header-color); + font-weight: bold; +} + +#nav-sidebar .current-model { + background: var(--selected-row); +} + +@media (forced-colors: active) { + #nav-sidebar .current-model { + background-color: SelectedItem; + } +} + +.main > #nav-sidebar + .content { + max-width: calc(100% - 23px); +} + +.main.shifted > #nav-sidebar + .content { + max-width: calc(100% - 299px); +} + +@media (max-width: 767px) { + #nav-sidebar, #toggle-nav-sidebar { + display: none; + } + + .main > #nav-sidebar + .content, + .main.shifted > #nav-sidebar + .content { + max-width: 100%; + } +} + +#nav-filter { + width: 100%; + box-sizing: border-box; + padding: 2px 5px; + margin: 5px 0; + border: 1px solid var(--border-color); + background-color: var(--darkened-bg); + color: var(--body-fg); +} + +#nav-filter:focus { + border-color: var(--body-quiet-color); +} + +#nav-filter.no-results { + background: var(--message-error-bg); +} + +#nav-sidebar table { + width: 100%; +} diff --git a/staticfiles/admin/css/responsive.css b/staticfiles/admin/css/responsive.css new file mode 100644 index 0000000..f0fcade --- /dev/null +++ b/staticfiles/admin/css/responsive.css @@ -0,0 +1,904 @@ +/* Tablets */ + +input[type="submit"], button { + -webkit-appearance: none; + appearance: none; +} + +@media (max-width: 1024px) { + /* Basic */ + + html { + -webkit-text-size-adjust: 100%; + } + + td, th { + padding: 10px; + font-size: 0.875rem; + } + + .small { + font-size: 0.75rem; + } + + /* Layout */ + + #container { + min-width: 0; + } + + #content { + padding: 15px 20px 20px; + } + + div.breadcrumbs { + padding: 10px 30px; + } + + /* Header */ + + #header { + flex-direction: column; + padding: 15px 30px; + justify-content: flex-start; + } + + #site-name { + margin: 0 0 8px; + line-height: 1.2; + } + + #user-tools { + margin: 0; + font-weight: 400; + line-height: 1.85; + text-align: left; + } + + #user-tools a { + display: inline-block; + line-height: 1.4; + } + + /* Dashboard */ + + .dashboard #content { + width: auto; + } + + #content-related { + margin-right: -290px; + } + + .colSM #content-related { + margin-left: -290px; + } + + .colMS { + margin-right: 290px; + } + + .colSM { + margin-left: 290px; + } + + .dashboard .module table td a { + padding-right: 0; + } + + td .changelink, td .addlink { + font-size: 0.8125rem; + } + + /* Changelist */ + + #toolbar { + border: none; + padding: 15px; + } + + #changelist-search > div { + display: flex; + flex-wrap: nowrap; + max-width: 480px; + } + + #changelist-search label { + line-height: 1.375rem; + } + + #toolbar form #searchbar { + flex: 1 0 auto; + width: 0; + height: 1.375rem; + margin: 0 10px 0 6px; + } + + #toolbar form input[type=submit] { + flex: 0 1 auto; + } + + #changelist-search .quiet { + width: 0; + flex: 1 0 auto; + margin: 5px 0 0 25px; + } + + #changelist .actions { + display: flex; + flex-wrap: wrap; + padding: 15px 0; + } + + #changelist .actions label { + display: flex; + } + + #changelist .actions select { + background: var(--body-bg); + } + + #changelist .actions .button { + min-width: 48px; + margin: 0 10px; + } + + #changelist .actions span.all, + #changelist .actions span.clear, + #changelist .actions span.question, + #changelist .actions span.action-counter { + font-size: 0.6875rem; + margin: 0 10px 0 0; + } + + #changelist-filter { + flex-basis: 200px; + } + + .change-list .filtered .results, + .change-list .filtered .paginator, + .filtered #toolbar, + .filtered .actions, + + #changelist .paginator { + border-top-color: var(--hairline-color); /* XXX Is this used at all? */ + } + + #changelist .results + .paginator { + border-top: none; + } + + /* Forms */ + + label { + font-size: 1rem; + } + + /* + Minifiers remove the default (text) "type" attribute from "input" HTML + tags. Add input:not([type]) to make the CSS stylesheet work the same. + */ + .form-row input:not([type]), + .form-row input[type=text], + .form-row input[type=password], + .form-row input[type=email], + .form-row input[type=url], + .form-row input[type=tel], + .form-row input[type=number], + .form-row textarea, + .form-row select, + .form-row .vTextField { + box-sizing: border-box; + margin: 0; + padding: 6px 8px; + min-height: 2.25rem; + font-size: 1rem; + } + + .form-row select { + height: 2.25rem; + } + + .form-row select[multiple] { + height: auto; + min-height: 0; + } + + fieldset .fieldBox + .fieldBox { + margin-top: 10px; + padding-top: 10px; + border-top: 1px solid var(--hairline-color); + } + + textarea { + max-width: 100%; + max-height: 120px; + } + + .aligned label { + padding-top: 6px; + } + + .aligned .related-lookup, + .aligned .datetimeshortcuts, + .aligned .related-lookup + strong { + align-self: center; + margin-left: 15px; + } + + form .aligned div.radiolist { + margin-left: 2px; + } + + .submit-row { + padding: 8px; + } + + .submit-row a.deletelink { + padding: 10px 7px; + } + + .button, input[type=submit], input[type=button], .submit-row input, a.button { + padding: 7px; + } + + /* Selector */ + + .selector { + display: flex; + width: 100%; + } + + .selector .selector-filter { + display: flex; + align-items: center; + } + + .selector .selector-filter input { + width: 100%; + min-height: 0; + flex: 1 1; + } + + .selector-available, .selector-chosen { + width: auto; + flex: 1 1; + display: flex; + flex-direction: column; + } + + .selector select { + width: 100%; + flex: 1 0 auto; + margin-bottom: 5px; + } + + .selector-chooseall, .selector-clearall { + align-self: center; + } + + .stacked { + flex-direction: column; + max-width: 480px; + } + + .stacked > * { + flex: 0 1 auto; + } + + .stacked select { + margin-bottom: 0; + } + + .stacked .selector-available, .stacked .selector-chosen { + width: auto; + } + + .stacked ul.selector-chooser { + padding: 0 2px; + transform: none; + } + + .stacked .selector-chooser li { + padding: 3px; + } + + .help-tooltip, .selector .help-icon { + display: none; + } + + .datetime input { + width: 50%; + max-width: 120px; + } + + .datetime span { + font-size: 0.8125rem; + } + + .datetime .timezonewarning { + display: block; + font-size: 0.6875rem; + color: var(--body-quiet-color); + } + + .datetimeshortcuts { + color: var(--border-color); /* XXX Redundant, .datetime span also sets #ccc */ + } + + .form-row .datetime input.vDateField, .form-row .datetime input.vTimeField { + width: 75%; + } + + .inline-group { + overflow: auto; + } + + /* Messages */ + + ul.messagelist li { + padding-left: 55px; + background-position: 30px 12px; + } + + ul.messagelist li.error { + background-position: 30px 12px; + } + + ul.messagelist li.warning { + background-position: 30px 14px; + } + + /* Login */ + + .login #header { + padding: 15px 20px; + } + + .login #site-name { + margin: 0; + } + + /* GIS */ + + div.olMap { + max-width: calc(100vw - 30px); + max-height: 300px; + } + + .olMap + .clear_features { + display: block; + margin-top: 10px; + } + + /* Docs */ + + .module table.xfull { + width: 100%; + } + + pre.literal-block { + overflow: auto; + } +} + +/* Mobile */ + +@media (max-width: 767px) { + /* Layout */ + + #header, #content { + padding: 15px; + } + + div.breadcrumbs { + padding: 10px 15px; + } + + /* Dashboard */ + + .colMS, .colSM { + margin: 0; + } + + #content-related, .colSM #content-related { + width: 100%; + margin: 0; + } + + #content-related .module { + margin-bottom: 0; + } + + #content-related .module h2 { + padding: 10px 15px; + font-size: 1rem; + } + + /* Changelist */ + + #changelist { + align-items: stretch; + flex-direction: column; + } + + #toolbar { + padding: 10px; + } + + #changelist-filter { + margin-left: 0; + } + + #changelist .actions label { + flex: 1 1; + } + + #changelist .actions select { + flex: 1 0; + width: 100%; + } + + #changelist .actions span { + flex: 1 0 100%; + } + + #changelist-filter { + position: static; + width: auto; + margin-top: 30px; + } + + .object-tools { + float: none; + margin: 0 0 15px; + padding: 0; + overflow: hidden; + } + + .object-tools li { + height: auto; + margin-left: 0; + } + + .object-tools li + li { + margin-left: 15px; + } + + /* Forms */ + + .form-row { + padding: 15px 0; + } + + .aligned .form-row, + .aligned .form-row > div { + max-width: 100vw; + } + + .aligned .form-row > div { + width: calc(100vw - 30px); + } + + .flex-container { + flex-flow: column; + } + + .flex-container.checkbox-row { + flex-flow: row; + } + + textarea { + max-width: none; + } + + .vURLField { + width: auto; + } + + fieldset .fieldBox + .fieldBox { + margin-top: 15px; + padding-top: 15px; + } + + .aligned label { + width: 100%; + min-width: auto; + padding: 0 0 10px; + } + + .aligned label:after { + max-height: 0; + } + + .aligned .form-row input, + .aligned .form-row select, + .aligned .form-row textarea { + flex: 1 1 auto; + max-width: 100%; + } + + .aligned .checkbox-row input { + flex: 0 1 auto; + margin: 0; + } + + .aligned .vCheckboxLabel { + flex: 1 0; + padding: 1px 0 0 5px; + } + + .aligned label + p, + .aligned label + div.help, + .aligned label + div.readonly { + padding: 0; + margin-left: 0; + } + + .aligned p.file-upload { + font-size: 0.8125rem; + } + + span.clearable-file-input { + margin-left: 15px; + } + + span.clearable-file-input label { + font-size: 0.8125rem; + padding-bottom: 0; + } + + .aligned .timezonewarning { + flex: 1 0 100%; + margin-top: 5px; + } + + form .aligned .form-row div.help { + width: 100%; + margin: 5px 0 0; + padding: 0; + } + + form .aligned ul, + form .aligned ul.errorlist { + margin-left: 0; + padding-left: 0; + } + + form .aligned div.radiolist { + margin-top: 5px; + margin-right: 15px; + margin-bottom: -3px; + } + + form .aligned div.radiolist:not(.inline) div + div { + margin-top: 5px; + } + + /* Related widget */ + + .related-widget-wrapper { + width: 100%; + display: flex; + align-items: flex-start; + } + + .related-widget-wrapper .selector { + order: 1; + flex: 1 0 auto; + } + + .related-widget-wrapper > a { + order: 2; + } + + .related-widget-wrapper .radiolist ~ a { + align-self: flex-end; + } + + .related-widget-wrapper > select ~ a { + align-self: center; + } + + /* Selector */ + + .selector { + flex-direction: column; + gap: 10px 0; + } + + .selector-available, .selector-chosen { + flex: 1 1 auto; + } + + .selector select { + max-height: 96px; + } + + .selector ul.selector-chooser { + display: flex; + width: 60px; + height: 30px; + padding: 0 2px; + transform: none; + } + + .selector ul.selector-chooser li { + float: left; + } + + .selector-remove { + background-position: 0 0; + } + + :enabled.selector-remove:focus, :enabled.selector-remove:hover { + background-position: 0 -24px; + } + + .selector-add { + background-position: 0 -48px; + } + + :enabled.selector-add:focus, :enabled.selector-add:hover { + background-position: 0 -72px; + } + + /* Inlines */ + + .inline-group[data-inline-type="stacked"] .inline-related { + border: 1px solid var(--hairline-color); + border-radius: 4px; + margin-top: 15px; + overflow: auto; + } + + .inline-group[data-inline-type="stacked"] .inline-related > * { + box-sizing: border-box; + } + + .inline-group[data-inline-type="stacked"] .inline-related .module { + padding: 0 10px; + } + + .inline-group[data-inline-type="stacked"] .inline-related .module .form-row { + border-top: 1px solid var(--hairline-color); + border-bottom: none; + } + + .inline-group[data-inline-type="stacked"] .inline-related .module .form-row:first-child { + border-top: none; + } + + .inline-group[data-inline-type="stacked"] .inline-related h3 { + padding: 10px; + border-top-width: 0; + border-bottom-width: 2px; + display: flex; + flex-wrap: wrap; + align-items: center; + } + + .inline-group[data-inline-type="stacked"] .inline-related h3 .inline_label { + margin-right: auto; + } + + .inline-group[data-inline-type="stacked"] .inline-related h3 span.delete { + float: none; + flex: 1 1 100%; + margin-top: 5px; + } + + .inline-group[data-inline-type="stacked"] .aligned .form-row > div:not([class]) { + width: 100%; + } + + .inline-group[data-inline-type="stacked"] .aligned label { + width: 100%; + } + + .inline-group[data-inline-type="stacked"] div.add-row { + margin-top: 15px; + border: 1px solid var(--hairline-color); + border-radius: 4px; + } + + .inline-group div.add-row, + .inline-group .tabular tr.add-row td { + padding: 0; + } + + .inline-group div.add-row a, + .inline-group .tabular tr.add-row td a { + display: block; + padding: 8px 10px 8px 26px; + background-position: 8px 9px; + } + + /* Submit row */ + + .submit-row { + padding: 10px; + margin: 0 0 15px; + flex-direction: column; + gap: 8px; + } + + .submit-row input, .submit-row input.default, .submit-row a { + text-align: center; + } + + .submit-row a.closelink { + padding: 10px 0; + text-align: center; + } + + .submit-row a.deletelink { + margin: 0; + } + + /* Messages */ + + ul.messagelist li { + padding-left: 40px; + background-position: 15px 12px; + } + + ul.messagelist li.error { + background-position: 15px 12px; + } + + ul.messagelist li.warning { + background-position: 15px 14px; + } + + /* Paginator */ + + .paginator .this-page, .paginator a:link, .paginator a:visited { + padding: 4px 10px; + } + + /* Login */ + + body.login { + padding: 0 15px; + } + + .login #container { + width: auto; + max-width: 480px; + margin: 50px auto; + } + + .login #header, + .login #content { + padding: 15px; + } + + .login #content-main { + float: none; + } + + .login .form-row { + padding: 0; + } + + .login .form-row + .form-row { + margin-top: 15px; + } + + .login .form-row label { + margin: 0 0 5px; + line-height: 1.2; + } + + .login .submit-row { + padding: 15px 0 0; + } + + .login br { + display: none; + } + + .login .submit-row input { + margin: 0; + text-transform: uppercase; + } + + .errornote { + margin: 0 0 20px; + padding: 8px 12px; + font-size: 0.8125rem; + } + + /* Calendar and clock */ + + .calendarbox, .clockbox { + position: fixed !important; + top: 50% !important; + left: 50% !important; + transform: translate(-50%, -50%); + margin: 0; + border: none; + overflow: visible; + } + + .calendarbox:before, .clockbox:before { + content: ''; + position: fixed; + top: 50%; + left: 50%; + width: 100vw; + height: 100vh; + background: rgba(0, 0, 0, 0.75); + transform: translate(-50%, -50%); + } + + .calendarbox > *, .clockbox > * { + position: relative; + z-index: 1; + } + + .calendarbox > div:first-child { + z-index: 2; + } + + .calendarbox .calendar, .clockbox h2 { + border-radius: 4px 4px 0 0; + overflow: hidden; + } + + .calendarbox .calendar-cancel, .clockbox .calendar-cancel { + border-radius: 0 0 4px 4px; + overflow: hidden; + } + + .calendar-shortcuts { + padding: 10px 0; + font-size: 0.75rem; + line-height: 0.75rem; + } + + .calendar-shortcuts a { + margin: 0 4px; + } + + .timelist a { + background: var(--body-bg); + padding: 4px; + } + + .calendar-cancel { + padding: 8px 10px; + } + + .clockbox h2 { + padding: 8px 15px; + } + + .calendar caption { + padding: 10px; + } + + .calendarbox .calendarnav-previous, .calendarbox .calendarnav-next { + z-index: 1; + top: 10px; + } + + /* History */ + + table#change-history tbody th, table#change-history tbody td { + font-size: 0.8125rem; + word-break: break-word; + } + + table#change-history tbody th { + width: auto; + } + + /* Docs */ + + table.model tbody th, table.model tbody td { + font-size: 0.8125rem; + word-break: break-word; + } +} diff --git a/staticfiles/admin/css/responsive_rtl.css b/staticfiles/admin/css/responsive_rtl.css new file mode 100644 index 0000000..5e8f5c5 --- /dev/null +++ b/staticfiles/admin/css/responsive_rtl.css @@ -0,0 +1,89 @@ +/* TABLETS */ + +@media (max-width: 1024px) { + [dir="rtl"] .colMS { + margin-right: 0; + } + + [dir="rtl"] #user-tools { + text-align: right; + } + + [dir="rtl"] #changelist .actions label { + padding-left: 10px; + padding-right: 0; + } + + [dir="rtl"] #changelist .actions select { + margin-left: 0; + margin-right: 15px; + } + + [dir="rtl"] .change-list .filtered .results, + [dir="rtl"] .change-list .filtered .paginator, + [dir="rtl"] .filtered #toolbar, + [dir="rtl"] .filtered div.xfull, + [dir="rtl"] .filtered .actions, + [dir="rtl"] #changelist-filter { + margin-left: 0; + } + + [dir="rtl"] .inline-group div.add-row a, + [dir="rtl"] .inline-group .tabular tr.add-row td a { + padding: 8px 26px 8px 10px; + background-position: calc(100% - 8px) 9px; + } + + [dir="rtl"] .object-tools li { + float: right; + } + + [dir="rtl"] .object-tools li + li { + margin-left: 0; + margin-right: 15px; + } + + [dir="rtl"] .dashboard .module table td a { + padding-left: 0; + padding-right: 16px; + } +} + +/* MOBILE */ + +@media (max-width: 767px) { + [dir="rtl"] .aligned .related-lookup, + [dir="rtl"] .aligned .datetimeshortcuts { + margin-left: 0; + margin-right: 15px; + } + + [dir="rtl"] .aligned ul, + [dir="rtl"] form .aligned ul.errorlist { + margin-right: 0; + } + + [dir="rtl"] #changelist-filter { + margin-left: 0; + margin-right: 0; + } + [dir="rtl"] .aligned .vCheckboxLabel { + padding: 1px 5px 0 0; + } + + [dir="rtl"] .selector-remove { + background-position: 0 0; + } + + [dir="rtl"] :enabled.selector-remove:focus, :enabled.selector-remove:hover { + background-position: 0 -24px; + } + + [dir="rtl"] .selector-add { + background-position: 0 -48px; + } + + [dir="rtl"] :enabled.selector-add:focus, :enabled.selector-add:hover { + background-position: 0 -72px; + } +} diff --git a/staticfiles/admin/css/rtl.css b/staticfiles/admin/css/rtl.css new file mode 100644 index 0000000..a2556d0 --- /dev/null +++ b/staticfiles/admin/css/rtl.css @@ -0,0 +1,293 @@ +/* GLOBAL */ + +th { + text-align: right; +} + +.module h2, .module caption { + text-align: right; +} + +.module ul, .module ol { + margin-left: 0; + margin-right: 1.5em; +} + +.viewlink, .addlink, .changelink, .hidelink { + padding-left: 0; + padding-right: 16px; + background-position: 100% 1px; +} + +.deletelink { + padding-left: 0; + padding-right: 16px; + background-position: 100% 1px; +} + +.object-tools { + float: left; +} + +thead th:first-child, +tfoot td:first-child { + border-left: none; +} + +/* LAYOUT */ + +#user-tools { + right: auto; + left: 0; + text-align: left; +} + +div.breadcrumbs { + text-align: right; +} + +#content-main { + float: right; +} + +#content-related { + float: left; + margin-left: -300px; + margin-right: auto; +} + +.colMS { + margin-left: 300px; + margin-right: 0; +} + +/* SORTABLE TABLES */ + +table thead th.sorted .sortoptions { + float: left; +} + +thead th.sorted .text { + padding-right: 0; + padding-left: 42px; +} + +/* dashboard styles */ + +.dashboard .module table td a { + padding-left: .6em; + padding-right: 16px; +} + +/* changelists styles */ + +.change-list .filtered table { + border-left: none; + border-right: 0px none; +} + +#changelist-filter { + border-left: none; + border-right: none; + margin-left: 0; + margin-right: 30px; +} + +#changelist-filter li.selected { + border-left: none; + padding-left: 10px; + margin-left: 0; + border-right: 5px solid var(--hairline-color); + padding-right: 10px; + margin-right: -15px; +} + +#changelist table tbody td:first-child, #changelist table tbody th:first-child { + border-right: none; + border-left: none; +} + +.paginator .end { + margin-left: 6px; + margin-right: 0; +} + +.paginator input { + margin-left: 0; + margin-right: auto; +} + +/* FORMS */ + +.aligned label { + padding: 0 0 3px 1em; +} + +.submit-row a.deletelink { + margin-left: 0; + margin-right: auto; +} + +.vDateField, .vTimeField { + margin-left: 2px; +} + +.aligned .form-row input { + margin-left: 5px; +} + +form .aligned ul { + margin-right: 163px; + padding-right: 10px; + margin-left: 0; + padding-left: 0; +} + +form ul.inline li { + float: right; + padding-right: 0; + padding-left: 7px; +} + +form .aligned p.help, +form .aligned div.help { + margin-left: 0; + margin-right: 160px; + padding-right: 10px; +} + +form div.help ul, +form .aligned .checkbox-row + .help, +form .aligned p.date div.help.timezonewarning, +form .aligned p.datetime div.help.timezonewarning, +form .aligned p.time div.help.timezonewarning { + margin-right: 0; + padding-right: 0; +} + +form .wide p.help, +form .wide ul.errorlist, +form .wide div.help { + padding-left: 0; + padding-right: 50px; +} + +.submit-row { + text-align: right; +} + +fieldset .fieldBox { + margin-left: 20px; + margin-right: 0; +} + +.errorlist li { + background-position: 100% 12px; + padding: 0; +} + +.errornote { + background-position: 100% 12px; + padding: 10px 12px; +} + +/* WIDGETS */ + +.calendarnav-previous { + top: 0; + left: auto; + right: 10px; + background: url(../img/calendar-icons.svg) 0 -15px no-repeat; +} + +.calendarnav-next { + top: 0; + right: auto; + left: 10px; + background: url(../img/calendar-icons.svg) 0 0 no-repeat; +} + +.calendar caption, .calendarbox h2 { + text-align: center; +} + +.selector { + float: right; +} + +.selector .selector-filter { + text-align: right; +} + +.selector-add { + background: url(../img/selector-icons.svg) 0 -96px no-repeat; + background-size: 24px auto; +} + +:enabled.selector-add:focus, :enabled.selector-add:hover { + background-position: 0 -120px; +} + +.selector-remove { + background: url(../img/selector-icons.svg) 0 -144px no-repeat; + background-size: 24px auto; +} + +:enabled.selector-remove:focus, :enabled.selector-remove:hover { + background-position: 0 -168px; +} + +.selector-chooseall { + background: url(../img/selector-icons.svg) right -128px no-repeat; +} + +:enabled.selector-chooseall:focus, :enabled.selector-chooseall:hover { + background-position: 100% -144px; +} + +.selector-clearall { + background: url(../img/selector-icons.svg) 0 -160px no-repeat; +} + +:enabled.selector-clearall:focus, :enabled.selector-clearall:hover { + background-position: 0 -176px; +} + +.inline-deletelink { + float: left; +} + +form .form-row p.datetime { + overflow: hidden; +} + +.related-widget-wrapper { + float: right; +} + +/* MISC */ + +.inline-related h2, .inline-group h2 { + text-align: right +} + +.inline-related h3 span.delete { + padding-right: 20px; + padding-left: inherit; + left: 10px; + right: inherit; + float:left; +} + +.inline-related h3 span.delete label { + margin-left: inherit; + margin-right: 2px; +} + +.inline-group .tabular td.original p { + right: 0; +} + +.selector .selector-chooser { + margin: 0; +} diff --git a/staticfiles/admin/css/unusable_password_field.css b/staticfiles/admin/css/unusable_password_field.css new file mode 100644 index 0000000..d46eb03 --- /dev/null +++ b/staticfiles/admin/css/unusable_password_field.css @@ -0,0 +1,19 @@ +/* Hide warnings fields if usable password is selected */ +form:has(#id_usable_password input[value="true"]:checked) .messagelist { + display: none; +} + +/* Hide password fields if unusable password is selected */ +form:has(#id_usable_password input[value="false"]:checked) .field-password1, +form:has(#id_usable_password input[value="false"]:checked) .field-password2 { + display: none; +} + +/* Select appropriate submit button */ +form:has(#id_usable_password input[value="true"]:checked) input[type="submit"].unset-password { + display: none; +} + +form:has(#id_usable_password input[value="false"]:checked) input[type="submit"].set-password { + display: none; +} diff --git a/staticfiles/admin/css/vendor/select2/LICENSE-SELECT2.md b/staticfiles/admin/css/vendor/select2/LICENSE-SELECT2.md new file mode 100644 index 0000000..8cb8a2b --- /dev/null +++ b/staticfiles/admin/css/vendor/select2/LICENSE-SELECT2.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/staticfiles/admin/css/vendor/select2/select2.css b/staticfiles/admin/css/vendor/select2/select2.css new file mode 100644 index 0000000..750b320 --- /dev/null +++ b/staticfiles/admin/css/vendor/select2/select2.css @@ -0,0 +1,481 @@ +.select2-container { + box-sizing: border-box; + display: inline-block; + margin: 0; + position: relative; + vertical-align: middle; } + .select2-container .select2-selection--single { + box-sizing: border-box; + cursor: pointer; + display: block; + height: 28px; + user-select: none; + -webkit-user-select: none; } + .select2-container .select2-selection--single .select2-selection__rendered { + display: block; + padding-left: 8px; + padding-right: 20px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } + .select2-container .select2-selection--single .select2-selection__clear { + position: relative; } + .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { + padding-right: 8px; + padding-left: 20px; } + .select2-container .select2-selection--multiple { + box-sizing: border-box; + cursor: pointer; + display: block; + min-height: 32px; + user-select: none; + -webkit-user-select: none; } + .select2-container .select2-selection--multiple .select2-selection__rendered { + display: inline-block; + overflow: hidden; + padding-left: 8px; + text-overflow: ellipsis; + white-space: nowrap; } + .select2-container .select2-search--inline { + float: left; } + .select2-container .select2-search--inline .select2-search__field { + box-sizing: border-box; + border: none; + font-size: 100%; + margin-top: 5px; + padding: 0; } + .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none; } + +.select2-dropdown { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + box-sizing: border-box; + display: block; + position: absolute; + left: -100000px; + width: 100%; + z-index: 1051; } + +.select2-results { + display: block; } + +.select2-results__options { + list-style: none; + margin: 0; + padding: 0; } + +.select2-results__option { + padding: 6px; + user-select: none; + -webkit-user-select: none; } + .select2-results__option[aria-selected] { + cursor: pointer; } + +.select2-container--open .select2-dropdown { + left: 0; } + +.select2-container--open .select2-dropdown--above { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } + +.select2-container--open .select2-dropdown--below { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.select2-search--dropdown { + display: block; + padding: 4px; } + .select2-search--dropdown .select2-search__field { + padding: 4px; + width: 100%; + box-sizing: border-box; } + .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none; } + .select2-search--dropdown.select2-search--hide { + display: none; } + +.select2-close-mask { + border: 0; + margin: 0; + padding: 0; + display: block; + position: fixed; + left: 0; + top: 0; + min-height: 100%; + min-width: 100%; + height: auto; + width: auto; + opacity: 0; + z-index: 99; + background-color: #fff; + filter: alpha(opacity=0); } + +.select2-hidden-accessible { + border: 0 !important; + clip: rect(0 0 0 0) !important; + -webkit-clip-path: inset(50%) !important; + clip-path: inset(50%) !important; + height: 1px !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + width: 1px !important; + white-space: nowrap !important; } + +.select2-container--default .select2-selection--single { + background-color: #fff; + border: 1px solid #aaa; + border-radius: 4px; } + .select2-container--default .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: 28px; } + .select2-container--default .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; } + .select2-container--default .select2-selection--single .select2-selection__placeholder { + color: #999; } + .select2-container--default .select2-selection--single .select2-selection__arrow { + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; } + .select2-container--default .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; } + +.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; } + +.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow { + left: 1px; + right: auto; } + +.select2-container--default.select2-container--disabled .select2-selection--single { + background-color: #eee; + cursor: default; } + .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear { + display: none; } + +.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; } + +.select2-container--default .select2-selection--multiple { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + cursor: text; } + .select2-container--default .select2-selection--multiple .select2-selection__rendered { + box-sizing: border-box; + list-style: none; + margin: 0; + padding: 0 5px; + width: 100%; } + .select2-container--default .select2-selection--multiple .select2-selection__rendered li { + list-style: none; } + .select2-container--default .select2-selection--multiple .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin-top: 5px; + margin-right: 10px; + padding: 1px; } + .select2-container--default .select2-selection--multiple .select2-selection__choice { + background-color: #e4e4e4; + border: 1px solid #aaa; + border-radius: 4px; + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px; + padding: 0 5px; } + .select2-container--default .select2-selection--multiple .select2-selection__choice__remove { + color: #999; + cursor: pointer; + display: inline-block; + font-weight: bold; + margin-right: 2px; } + .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #333; } + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline { + float: right; } + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + margin-left: 5px; + margin-right: auto; } + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto; } + +.select2-container--default.select2-container--focus .select2-selection--multiple { + border: solid black 1px; + outline: 0; } + +.select2-container--default.select2-container--disabled .select2-selection--multiple { + background-color: #eee; + cursor: default; } + +.select2-container--default.select2-container--disabled .select2-selection__choice__remove { + display: none; } + +.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple { + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } + +.select2-container--default .select2-search--dropdown .select2-search__field { + border: 1px solid #aaa; } + +.select2-container--default .select2-search--inline .select2-search__field { + background: transparent; + border: none; + outline: 0; + box-shadow: none; + -webkit-appearance: textfield; } + +.select2-container--default .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; } + +.select2-container--default .select2-results__option[role=group] { + padding: 0; } + +.select2-container--default .select2-results__option[aria-disabled=true] { + color: #999; } + +.select2-container--default .select2-results__option[aria-selected=true] { + background-color: #ddd; } + +.select2-container--default .select2-results__option .select2-results__option { + padding-left: 1em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__group { + padding-left: 0; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option { + margin-left: -1em; + padding-left: 2em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -2em; + padding-left: 3em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -3em; + padding-left: 4em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -4em; + padding-left: 5em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -5em; + padding-left: 6em; } + +.select2-container--default .select2-results__option--highlighted[aria-selected] { + background-color: #5897fb; + color: white; } + +.select2-container--default .select2-results__group { + cursor: default; + display: block; + padding: 6px; } + +.select2-container--classic .select2-selection--single { + background-color: #f7f7f7; + border: 1px solid #aaa; + border-radius: 4px; + outline: 0; + background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%); + background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%); + background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } + .select2-container--classic .select2-selection--single:focus { + border: 1px solid #5897fb; } + .select2-container--classic .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: 28px; } + .select2-container--classic .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin-right: 10px; } + .select2-container--classic .select2-selection--single .select2-selection__placeholder { + color: #999; } + .select2-container--classic .select2-selection--single .select2-selection__arrow { + background-color: #ddd; + border: none; + border-left: 1px solid #aaa; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; + background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%); + background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%); + background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); } + .select2-container--classic .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; } + +.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; } + +.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow { + border: none; + border-right: 1px solid #aaa; + border-radius: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + left: 1px; + right: auto; } + +.select2-container--classic.select2-container--open .select2-selection--single { + border: 1px solid #5897fb; } + .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow { + background: transparent; + border: none; } + .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; } + +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%); + background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%); + background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } + +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%); + background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%); + background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); } + +.select2-container--classic .select2-selection--multiple { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + cursor: text; + outline: 0; } + .select2-container--classic .select2-selection--multiple:focus { + border: 1px solid #5897fb; } + .select2-container--classic .select2-selection--multiple .select2-selection__rendered { + list-style: none; + margin: 0; + padding: 0 5px; } + .select2-container--classic .select2-selection--multiple .select2-selection__clear { + display: none; } + .select2-container--classic .select2-selection--multiple .select2-selection__choice { + background-color: #e4e4e4; + border: 1px solid #aaa; + border-radius: 4px; + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px; + padding: 0 5px; } + .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { + color: #888; + cursor: pointer; + display: inline-block; + font-weight: bold; + margin-right: 2px; } + .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #555; } + +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + float: right; + margin-left: 5px; + margin-right: auto; } + +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto; } + +.select2-container--classic.select2-container--open .select2-selection--multiple { + border: 1px solid #5897fb; } + +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } + +.select2-container--classic .select2-search--dropdown .select2-search__field { + border: 1px solid #aaa; + outline: 0; } + +.select2-container--classic .select2-search--inline .select2-search__field { + outline: 0; + box-shadow: none; } + +.select2-container--classic .select2-dropdown { + background-color: white; + border: 1px solid transparent; } + +.select2-container--classic .select2-dropdown--above { + border-bottom: none; } + +.select2-container--classic .select2-dropdown--below { + border-top: none; } + +.select2-container--classic .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; } + +.select2-container--classic .select2-results__option[role=group] { + padding: 0; } + +.select2-container--classic .select2-results__option[aria-disabled=true] { + color: grey; } + +.select2-container--classic .select2-results__option--highlighted[aria-selected] { + background-color: #3875d7; + color: white; } + +.select2-container--classic .select2-results__group { + cursor: default; + display: block; + padding: 6px; } + +.select2-container--classic.select2-container--open .select2-dropdown { + border-color: #5897fb; } diff --git a/staticfiles/admin/css/vendor/select2/select2.min.css b/staticfiles/admin/css/vendor/select2/select2.min.css new file mode 100644 index 0000000..7c18ad5 --- /dev/null +++ b/staticfiles/admin/css/vendor/select2/select2.min.css @@ -0,0 +1 @@ +.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px;padding:1px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} diff --git a/staticfiles/admin/css/widgets.css b/staticfiles/admin/css/widgets.css new file mode 100644 index 0000000..a5f615a --- /dev/null +++ b/staticfiles/admin/css/widgets.css @@ -0,0 +1,613 @@ +/* SELECTOR (FILTER INTERFACE) */ + +.selector { + display: flex; + flex: 1; + gap: 0 10px; +} + +.selector select { + height: 17.2em; + flex: 1 0 auto; + overflow: scroll; + width: 100%; +} + +.selector-available, .selector-chosen { + display: flex; + flex-direction: column; + flex: 1 1; +} + +.selector-available-title, .selector-chosen-title { + border: 1px solid var(--border-color); + border-radius: 4px 4px 0 0; +} + +.selector .helptext { + font-size: 0.6875rem; +} + +.selector-chosen .list-footer-display { + border: 1px solid var(--border-color); + border-top: none; + border-radius: 0 0 4px 4px; + margin: 0 0 10px; + padding: 8px; + text-align: center; + background: var(--primary); + color: var(--header-link-color); + cursor: pointer; +} +.selector-chosen .list-footer-display__clear { + color: var(--breadcrumbs-fg); +} + +.selector-chosen-title { + background: var(--secondary); + color: var(--header-link-color); + padding: 8px; +} + +.selector-chosen-title label { + color: var(--header-link-color); + width: 100%; +} + +.selector-available-title { + background: var(--darkened-bg); + color: var(--body-quiet-color); + padding: 8px; +} + +.selector-available-title label { + width: 100%; +} + +.selector .selector-filter { + border: 1px solid var(--border-color); + border-width: 0 1px; + padding: 8px; + color: var(--body-quiet-color); + font-size: 0.625rem; + margin: 0; + text-align: left; + display: flex; + gap: 8px; +} + +.selector .selector-filter label, +.inline-group .aligned .selector .selector-filter label { + float: left; + margin: 7px 0 0; + width: 18px; + height: 18px; + padding: 0; + overflow: hidden; + line-height: 1; + min-width: auto; +} + +.selector-filter input { + flex-grow: 1; +} + +.selector ul.selector-chooser { + align-self: center; + width: 30px; + background-color: var(--selected-bg); + border-radius: 10px; + margin: 0; + padding: 0; + transform: translateY(-17px); +} + +.selector-chooser li { + margin: 0; + padding: 3px; + list-style-type: none; +} + +.selector select { + padding: 0 10px; + margin: 0 0 10px; + border-radius: 0 0 4px 4px; +} +.selector .selector-chosen--with-filtered select { + margin: 0; + border-radius: 0; + height: 14em; +} + +.selector .selector-chosen:not(.selector-chosen--with-filtered) .list-footer-display { + display: none; +} + +.selector-add, .selector-remove { + width: 24px; + height: 24px; + display: block; + text-indent: -3000px; + overflow: hidden; + cursor: default; + opacity: 0.55; + border: none; +} + +:enabled.selector-add, :enabled.selector-remove { + opacity: 1; +} + +:enabled.selector-add:hover, :enabled.selector-remove:hover { + cursor: pointer; +} + +.selector-add { + background: url(../img/selector-icons.svg) 0 -144px no-repeat; + background-size: 24px auto; +} + +:enabled.selector-add:focus, :enabled.selector-add:hover { + background-position: 0 -168px; +} + +.selector-remove { + background: url(../img/selector-icons.svg) 0 -96px no-repeat; + background-size: 24px auto; +} + +:enabled.selector-remove:focus, :enabled.selector-remove:hover { + background-position: 0 -120px; +} + +.selector-chooseall, .selector-clearall { + display: inline-block; + height: 16px; + text-align: left; + margin: 0 auto; + overflow: hidden; + font-weight: bold; + line-height: 16px; + color: var(--body-quiet-color); + text-decoration: none; + opacity: 0.55; + border: none; +} + +:enabled.selector-chooseall:focus, :enabled.selector-clearall:focus, +:enabled.selector-chooseall:hover, :enabled.selector-clearall:hover { + color: var(--link-fg); +} + +:enabled.selector-chooseall, :enabled.selector-clearall { + opacity: 1; +} + +:enabled.selector-chooseall:hover, :enabled.selector-clearall:hover { + cursor: pointer; +} + +.selector-chooseall { + padding: 0 18px 0 0; + background: url(../img/selector-icons.svg) right -160px no-repeat; + cursor: default; +} + +:enabled.selector-chooseall:focus, :enabled.selector-chooseall:hover { + background-position: 100% -176px; +} + +.selector-clearall { + padding: 0 0 0 18px; + background: url(../img/selector-icons.svg) 0 -128px no-repeat; + cursor: default; +} + +:enabled.selector-clearall:focus, :enabled.selector-clearall:hover { + background-position: 0 -144px; +} + +/* STACKED SELECTORS */ + +.stacked { + float: left; + width: 490px; + display: block; +} + +.stacked select { + width: 480px; + height: 10.1em; +} + +.stacked .selector-available, .stacked .selector-chosen { + width: 480px; +} + +.stacked .selector-available { + margin-bottom: 0; +} + +.stacked .selector-available input { + width: 422px; +} + +.stacked ul.selector-chooser { + display: flex; + height: 30px; + width: 64px; + margin: 0 0 10px 40%; + background-color: #eee; + border-radius: 10px; + transform: none; +} + +.stacked .selector-chooser li { + float: left; + padding: 3px 3px 3px 5px; +} + +.stacked .selector-chooseall, .stacked .selector-clearall { + display: none; +} + +.stacked .selector-add { + background: url(../img/selector-icons.svg) 0 -48px no-repeat; + background-size: 24px auto; + cursor: default; +} + +.stacked :enabled.selector-add { + background-position: 0 -48px; + cursor: pointer; +} + +.stacked :enabled.selector-add:focus, .stacked :enabled.selector-add:hover { + background-position: 0 -72px; + cursor: pointer; +} + +.stacked .selector-remove { + background: url(../img/selector-icons.svg) 0 0 no-repeat; + background-size: 24px auto; + cursor: default; +} + +.stacked :enabled.selector-remove { + background-position: 0 0px; + cursor: pointer; +} + +.stacked :enabled.selector-remove:focus, .stacked :enabled.selector-remove:hover { + background-position: 0 -24px; + cursor: pointer; +} + +.selector .help-icon { + background: url(../img/icon-unknown.svg) 0 0 no-repeat; + display: inline-block; + vertical-align: middle; + margin: -2px 0 0 2px; + width: 13px; + height: 13px; +} + +.selector .selector-chosen .help-icon { + background: url(../img/icon-unknown-alt.svg) 0 0 no-repeat; +} + +.selector .search-label-icon { + background: url(../img/search.svg) 0 0 no-repeat; + display: inline-block; + height: 1.125rem; + width: 1.125rem; +} + +/* DATE AND TIME */ + +p.datetime { + line-height: 20px; + margin: 0; + padding: 0; + color: var(--body-quiet-color); + font-weight: bold; +} + +.datetime span { + white-space: nowrap; + font-weight: normal; + font-size: 0.6875rem; + color: var(--body-quiet-color); +} + +.datetime input, .form-row .datetime input.vDateField, .form-row .datetime input.vTimeField { + margin-left: 5px; + margin-bottom: 4px; +} + +table p.datetime { + font-size: 0.6875rem; + margin-left: 0; + padding-left: 0; +} + +.datetimeshortcuts .clock-icon, .datetimeshortcuts .date-icon { + position: relative; + display: inline-block; + vertical-align: middle; + height: 24px; + width: 24px; + overflow: hidden; +} + +.datetimeshortcuts .clock-icon { + background: url(../img/icon-clock.svg) 0 0 no-repeat; + background-size: 24px auto; +} + +.datetimeshortcuts a:focus .clock-icon, +.datetimeshortcuts a:hover .clock-icon { + background-position: 0 -24px; +} + +.datetimeshortcuts .date-icon { + background: url(../img/icon-calendar.svg) 0 0 no-repeat; + background-size: 24px auto; + top: -1px; +} + +.datetimeshortcuts a:focus .date-icon, +.datetimeshortcuts a:hover .date-icon { + background-position: 0 -24px; +} + +.timezonewarning { + font-size: 0.6875rem; + color: var(--body-quiet-color); +} + +/* URL */ + +p.url { + line-height: 20px; + margin: 0; + padding: 0; + color: var(--body-quiet-color); + font-size: 0.6875rem; + font-weight: bold; +} + +.url a { + font-weight: normal; +} + +/* FILE UPLOADS */ + +p.file-upload { + line-height: 20px; + margin: 0; + padding: 0; + color: var(--body-quiet-color); + font-size: 0.6875rem; + font-weight: bold; +} + +.file-upload a { + font-weight: normal; +} + +.file-upload .deletelink { + margin-left: 5px; +} + +span.clearable-file-input label { + color: var(--body-fg); + font-size: 0.6875rem; + display: inline; + float: none; +} + +/* CALENDARS & CLOCKS */ + +.calendarbox, .clockbox { + margin: 5px auto; + font-size: 0.75rem; + width: 19em; + text-align: center; + background: var(--body-bg); + color: var(--body-fg); + border: 1px solid var(--hairline-color); + border-radius: 4px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15); + overflow: hidden; + position: relative; +} + +.clockbox { + width: auto; +} + +.calendar { + margin: 0; + padding: 0; +} + +.calendar table { + margin: 0; + padding: 0; + border-collapse: collapse; + background: white; + width: 100%; +} + +.calendar caption, .calendarbox h2 { + margin: 0; + text-align: center; + border-top: none; + font-weight: 700; + font-size: 0.75rem; + color: #333; + background: var(--accent); +} + +.calendar th { + padding: 8px 5px; + background: var(--darkened-bg); + border-bottom: 1px solid var(--border-color); + font-weight: 400; + font-size: 0.75rem; + text-align: center; + color: var(--body-quiet-color); +} + +.calendar td { + font-weight: 400; + font-size: 0.75rem; + text-align: center; + padding: 0; + border-top: 1px solid var(--hairline-color); + border-bottom: none; +} + +.calendar td.selected a { + background: var(--secondary); + color: var(--button-fg); +} + +.calendar td.nonday { + background: var(--darkened-bg); +} + +.calendar td.today a { + font-weight: 700; +} + +.calendar td a, .timelist a { + display: block; + font-weight: 400; + padding: 6px; + text-decoration: none; + color: var(--body-quiet-color); +} + +.calendar td a:focus, .timelist a:focus, +.calendar td a:hover, .timelist a:hover { + background: var(--primary); + color: white; +} + +.calendar td a:active, .timelist a:active { + background: var(--header-bg); + color: white; +} + +.calendarnav { + font-size: 0.625rem; + text-align: center; + color: #ccc; + margin: 0; + padding: 1px 3px; +} + +.calendarnav a:link, #calendarnav a:visited, +#calendarnav a:focus, #calendarnav a:hover { + color: var(--body-quiet-color); +} + +.calendar-shortcuts { + background: var(--body-bg); + color: var(--body-quiet-color); + font-size: 0.6875rem; + line-height: 0.6875rem; + border-top: 1px solid var(--hairline-color); + padding: 8px 0; +} + +.calendarbox .calendarnav-previous, .calendarbox .calendarnav-next { + display: block; + position: absolute; + top: 8px; + width: 15px; + height: 15px; + text-indent: -9999px; + padding: 0; +} + +.calendarnav-previous { + left: 10px; + background: url(../img/calendar-icons.svg) 0 0 no-repeat; +} + +.calendarnav-next { + right: 10px; + background: url(../img/calendar-icons.svg) 0 -15px no-repeat; +} + +.calendar-cancel { + margin: 0; + padding: 4px 0; + font-size: 0.75rem; + background: var(--close-button-bg); + border-top: 1px solid var(--border-color); + color: var(--button-fg); +} + +.calendar-cancel:focus, .calendar-cancel:hover { + background: var(--close-button-hover-bg); +} + +.calendar-cancel a { + color: var(--button-fg); + display: block; +} + +ul.timelist, .timelist li { + list-style-type: none; + margin: 0; + padding: 0; +} + +.timelist a { + padding: 2px; +} + +/* EDIT INLINE */ + +.inline-deletelink { + float: right; + text-indent: -9999px; + background: url(../img/inline-delete.svg) 0 0 no-repeat; + width: 1.5rem; + height: 1.5rem; + border: 0px none; + margin-bottom: .25rem; +} + +.inline-deletelink:focus, .inline-deletelink:hover { + cursor: pointer; +} + +/* RELATED WIDGET WRAPPER */ +.related-widget-wrapper { + display: flex; + gap: 0 10px; + flex-grow: 1; + flex-wrap: wrap; + margin-bottom: 5px; +} + +.related-widget-wrapper-link { + opacity: .6; + filter: grayscale(1); +} + +.related-widget-wrapper-link:link { + opacity: 1; + filter: grayscale(0); +} + +/* GIS MAPS */ +.dj_map { + width: 600px; + height: 400px; +} diff --git a/staticfiles/admin/img/LICENSE b/staticfiles/admin/img/LICENSE new file mode 100644 index 0000000..a4faaa1 --- /dev/null +++ b/staticfiles/admin/img/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2014 Code Charm Ltd + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/staticfiles/admin/img/README.txt b/staticfiles/admin/img/README.txt new file mode 100644 index 0000000..bf81f35 --- /dev/null +++ b/staticfiles/admin/img/README.txt @@ -0,0 +1,7 @@ +All icons are taken from Font Awesome (https://fontawesome.com/) project. +The Font Awesome font is licensed under the SIL OFL 1.1: +- https://scripts.sil.org/OFL + +SVG icons source: https://github.com/encharm/Font-Awesome-SVG-PNG +Font-Awesome-SVG-PNG is licensed under the MIT license (see file license +in current folder). diff --git a/staticfiles/admin/img/calendar-icons.svg b/staticfiles/admin/img/calendar-icons.svg new file mode 100644 index 0000000..04c0274 --- /dev/null +++ b/staticfiles/admin/img/calendar-icons.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + diff --git a/staticfiles/admin/img/gis/move_vertex_off.svg b/staticfiles/admin/img/gis/move_vertex_off.svg new file mode 100644 index 0000000..228854f --- /dev/null +++ b/staticfiles/admin/img/gis/move_vertex_off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/staticfiles/admin/img/gis/move_vertex_on.svg b/staticfiles/admin/img/gis/move_vertex_on.svg new file mode 100644 index 0000000..96b87fd --- /dev/null +++ b/staticfiles/admin/img/gis/move_vertex_on.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/staticfiles/admin/img/icon-addlink.svg b/staticfiles/admin/img/icon-addlink.svg new file mode 100644 index 0000000..8d5c6a3 --- /dev/null +++ b/staticfiles/admin/img/icon-addlink.svg @@ -0,0 +1,3 @@ + + + diff --git a/staticfiles/admin/img/icon-alert.svg b/staticfiles/admin/img/icon-alert.svg new file mode 100644 index 0000000..e51ea83 --- /dev/null +++ b/staticfiles/admin/img/icon-alert.svg @@ -0,0 +1,3 @@ + + + diff --git a/staticfiles/admin/img/icon-calendar.svg b/staticfiles/admin/img/icon-calendar.svg new file mode 100644 index 0000000..97910a9 --- /dev/null +++ b/staticfiles/admin/img/icon-calendar.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/staticfiles/admin/img/icon-changelink.svg b/staticfiles/admin/img/icon-changelink.svg new file mode 100644 index 0000000..592b093 --- /dev/null +++ b/staticfiles/admin/img/icon-changelink.svg @@ -0,0 +1,3 @@ + + + diff --git a/staticfiles/admin/img/icon-clock.svg b/staticfiles/admin/img/icon-clock.svg new file mode 100644 index 0000000..bf9985d --- /dev/null +++ b/staticfiles/admin/img/icon-clock.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/staticfiles/admin/img/icon-deletelink.svg b/staticfiles/admin/img/icon-deletelink.svg new file mode 100644 index 0000000..4059b15 --- /dev/null +++ b/staticfiles/admin/img/icon-deletelink.svg @@ -0,0 +1,3 @@ + + + diff --git a/staticfiles/admin/img/icon-hidelink.svg b/staticfiles/admin/img/icon-hidelink.svg new file mode 100644 index 0000000..2a8b404 --- /dev/null +++ b/staticfiles/admin/img/icon-hidelink.svg @@ -0,0 +1,3 @@ + + + diff --git a/staticfiles/admin/img/icon-no.svg b/staticfiles/admin/img/icon-no.svg new file mode 100644 index 0000000..2e0d383 --- /dev/null +++ b/staticfiles/admin/img/icon-no.svg @@ -0,0 +1,3 @@ + + + diff --git a/staticfiles/admin/img/icon-unknown-alt.svg b/staticfiles/admin/img/icon-unknown-alt.svg new file mode 100644 index 0000000..1c6b99f --- /dev/null +++ b/staticfiles/admin/img/icon-unknown-alt.svg @@ -0,0 +1,3 @@ + + + diff --git a/staticfiles/admin/img/icon-unknown.svg b/staticfiles/admin/img/icon-unknown.svg new file mode 100644 index 0000000..50b4f97 --- /dev/null +++ b/staticfiles/admin/img/icon-unknown.svg @@ -0,0 +1,3 @@ + + + diff --git a/staticfiles/admin/img/icon-viewlink.svg b/staticfiles/admin/img/icon-viewlink.svg new file mode 100644 index 0000000..a1ca1d3 --- /dev/null +++ b/staticfiles/admin/img/icon-viewlink.svg @@ -0,0 +1,3 @@ + + + diff --git a/staticfiles/admin/img/icon-yes.svg b/staticfiles/admin/img/icon-yes.svg new file mode 100644 index 0000000..5883d87 --- /dev/null +++ b/staticfiles/admin/img/icon-yes.svg @@ -0,0 +1,3 @@ + + + diff --git a/staticfiles/admin/img/inline-delete.svg b/staticfiles/admin/img/inline-delete.svg new file mode 100644 index 0000000..8751150 --- /dev/null +++ b/staticfiles/admin/img/inline-delete.svg @@ -0,0 +1,3 @@ + + + diff --git a/staticfiles/admin/img/search.svg b/staticfiles/admin/img/search.svg new file mode 100644 index 0000000..c8c69b2 --- /dev/null +++ b/staticfiles/admin/img/search.svg @@ -0,0 +1,3 @@ + + + diff --git a/staticfiles/admin/img/selector-icons.svg b/staticfiles/admin/img/selector-icons.svg new file mode 100644 index 0000000..926b8e2 --- /dev/null +++ b/staticfiles/admin/img/selector-icons.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/staticfiles/admin/img/sorting-icons.svg b/staticfiles/admin/img/sorting-icons.svg new file mode 100644 index 0000000..7c31ec9 --- /dev/null +++ b/staticfiles/admin/img/sorting-icons.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/staticfiles/admin/img/tooltag-add.svg b/staticfiles/admin/img/tooltag-add.svg new file mode 100644 index 0000000..1ca64ae --- /dev/null +++ b/staticfiles/admin/img/tooltag-add.svg @@ -0,0 +1,3 @@ + + + diff --git a/staticfiles/admin/img/tooltag-arrowright.svg b/staticfiles/admin/img/tooltag-arrowright.svg new file mode 100644 index 0000000..b664d61 --- /dev/null +++ b/staticfiles/admin/img/tooltag-arrowright.svg @@ -0,0 +1,3 @@ + + + diff --git a/staticfiles/admin/js/SelectBox.js b/staticfiles/admin/js/SelectBox.js new file mode 100644 index 0000000..3db4ec7 --- /dev/null +++ b/staticfiles/admin/js/SelectBox.js @@ -0,0 +1,116 @@ +'use strict'; +{ + const SelectBox = { + cache: {}, + init: function(id) { + const box = document.getElementById(id); + SelectBox.cache[id] = []; + const cache = SelectBox.cache[id]; + for (const node of box.options) { + cache.push({value: node.value, text: node.text, displayed: 1}); + } + }, + redisplay: function(id) { + // Repopulate HTML select box from cache + const box = document.getElementById(id); + const scroll_value_from_top = box.scrollTop; + box.innerHTML = ''; + for (const node of SelectBox.cache[id]) { + if (node.displayed) { + const new_option = new Option(node.text, node.value, false, false); + // Shows a tooltip when hovering over the option + new_option.title = node.text; + box.appendChild(new_option); + } + } + box.scrollTop = scroll_value_from_top; + }, + filter: function(id, text) { + // Redisplay the HTML select box, displaying only the choices containing ALL + // the words in text. (It's an AND search.) + const tokens = text.toLowerCase().split(/\s+/); + for (const node of SelectBox.cache[id]) { + node.displayed = 1; + const node_text = node.text.toLowerCase(); + for (const token of tokens) { + if (!node_text.includes(token)) { + node.displayed = 0; + break; // Once the first token isn't found we're done + } + } + } + SelectBox.redisplay(id); + }, + get_hidden_node_count(id) { + const cache = SelectBox.cache[id] || []; + return cache.filter(node => node.displayed === 0).length; + }, + delete_from_cache: function(id, value) { + let delete_index = null; + const cache = SelectBox.cache[id]; + for (const [i, node] of cache.entries()) { + if (node.value === value) { + delete_index = i; + break; + } + } + cache.splice(delete_index, 1); + }, + add_to_cache: function(id, option) { + SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1}); + }, + cache_contains: function(id, value) { + // Check if an item is contained in the cache + for (const node of SelectBox.cache[id]) { + if (node.value === value) { + return true; + } + } + return false; + }, + move: function(from, to) { + const from_box = document.getElementById(from); + for (const option of from_box.options) { + const option_value = option.value; + if (option.selected && SelectBox.cache_contains(from, option_value)) { + SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1}); + SelectBox.delete_from_cache(from, option_value); + } + } + SelectBox.redisplay(from); + SelectBox.redisplay(to); + }, + move_all: function(from, to) { + const from_box = document.getElementById(from); + for (const option of from_box.options) { + const option_value = option.value; + if (SelectBox.cache_contains(from, option_value)) { + SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1}); + SelectBox.delete_from_cache(from, option_value); + } + } + SelectBox.redisplay(from); + SelectBox.redisplay(to); + }, + sort: function(id) { + SelectBox.cache[id].sort(function(a, b) { + a = a.text.toLowerCase(); + b = b.text.toLowerCase(); + if (a > b) { + return 1; + } + if (a < b) { + return -1; + } + return 0; + } ); + }, + select_all: function(id) { + const box = document.getElementById(id); + for (const option of box.options) { + option.selected = true; + } + } + }; + window.SelectBox = SelectBox; +} diff --git a/staticfiles/admin/js/SelectFilter2.js b/staticfiles/admin/js/SelectFilter2.js new file mode 100644 index 0000000..970b511 --- /dev/null +++ b/staticfiles/admin/js/SelectFilter2.js @@ -0,0 +1,311 @@ +/*global SelectBox, gettext, ngettext, interpolate, quickElement, SelectFilter*/ +/* +SelectFilter2 - Turns a multiple-select box into a filter interface. + +Requires core.js and SelectBox.js. +*/ +'use strict'; +{ + window.SelectFilter = { + init: function(field_id, field_name, is_stacked) { + if (field_id.match(/__prefix__/)) { + // Don't initialize on empty forms. + return; + } + const from_box = document.getElementById(field_id); + from_box.id += '_from'; // change its ID + from_box.className = 'filtered'; + from_box.setAttribute('aria-labelledby', field_id + '_from_title'); + + for (const p of from_box.parentNode.getElementsByTagName('p')) { + if (p.classList.contains("info")) { + // Remove

    , because it just gets in the way. + from_box.parentNode.removeChild(p); + } else if (p.classList.contains("help")) { + // Move help text up to the top so it isn't below the select + // boxes or wrapped off on the side to the right of the add + // button: + from_box.parentNode.insertBefore(p, from_box.parentNode.firstChild); + } + } + + //

    or
    + const selector_div = quickElement('div', from_box.parentNode); + // Make sure the selector div is at the beginning so that the + // add link would be displayed to the right of the widget. + from_box.parentNode.prepend(selector_div); + selector_div.className = is_stacked ? 'selector stacked' : 'selector'; + + //
    + const selector_available = quickElement('div', selector_div); + selector_available.className = 'selector-available'; + const selector_available_title = quickElement('div', selector_available); + selector_available_title.id = field_id + '_from_title'; + selector_available_title.className = 'selector-available-title'; + quickElement('label', selector_available_title, interpolate(gettext('Available %s') + ' ', [field_name]), 'for', field_id + '_from'); + quickElement( + 'p', + selector_available_title, + interpolate(gettext('Choose %s by selecting them and then select the "Choose" arrow button.'), [field_name]), + 'class', 'helptext' + ); + + const filter_p = quickElement('p', selector_available, '', 'id', field_id + '_filter'); + filter_p.className = 'selector-filter'; + + const search_filter_label = quickElement('label', filter_p, '', 'for', field_id + '_input'); + + quickElement( + 'span', search_filter_label, '', + 'class', 'help-tooltip search-label-icon', + 'aria-label', interpolate(gettext("Type into this box to filter down the list of available %s."), [field_name]) + ); + + filter_p.appendChild(document.createTextNode(' ')); + + const filter_input = quickElement('input', filter_p, '', 'type', 'text', 'placeholder', gettext("Filter")); + filter_input.id = field_id + '_input'; + + selector_available.appendChild(from_box); + const choose_all = quickElement( + 'button', + selector_available, + interpolate(gettext('Choose all %s'), [field_name]), + 'id', field_id + '_add_all', + 'class', 'selector-chooseall', + 'type', 'button' + ); + + //
      + const selector_chooser = quickElement('ul', selector_div); + selector_chooser.className = 'selector-chooser'; + const add_button = quickElement( + 'button', + quickElement('li', selector_chooser), + interpolate(gettext('Choose selected %s'), [field_name]), + 'id', field_id + '_add', + 'class', 'selector-add', + 'type', 'button' + ); + const remove_button = quickElement( + 'button', + quickElement('li', selector_chooser), + interpolate(gettext('Remove selected %s'), [field_name]), + 'id', field_id + '_remove', + 'class', 'selector-remove', + 'type', 'button' + ); + + //
      + const selector_chosen = quickElement('div', selector_div, '', 'id', field_id + '_selector_chosen'); + selector_chosen.className = 'selector-chosen'; + const selector_chosen_title = quickElement('div', selector_chosen); + selector_chosen_title.className = 'selector-chosen-title'; + selector_chosen_title.id = field_id + '_to_title'; + quickElement('label', selector_chosen_title, interpolate(gettext('Chosen %s') + ' ', [field_name]), 'for', field_id + '_to'); + quickElement( + 'p', + selector_chosen_title, + interpolate(gettext('Remove %s by selecting them and then select the "Remove" arrow button.'), [field_name]), + 'class', 'helptext' + ); + + const filter_selected_p = quickElement('p', selector_chosen, '', 'id', field_id + '_filter_selected'); + filter_selected_p.className = 'selector-filter'; + + const search_filter_selected_label = quickElement('label', filter_selected_p, '', 'for', field_id + '_selected_input'); + + quickElement( + 'span', search_filter_selected_label, '', + 'class', 'help-tooltip search-label-icon', + 'aria-label', interpolate(gettext("Type into this box to filter down the list of selected %s."), [field_name]) + ); + + filter_selected_p.appendChild(document.createTextNode(' ')); + + const filter_selected_input = quickElement('input', filter_selected_p, '', 'type', 'text', 'placeholder', gettext("Filter")); + filter_selected_input.id = field_id + '_selected_input'; + + quickElement( + 'select', + selector_chosen, + '', + 'id', field_id + '_to', + 'multiple', '', + 'size', from_box.size, + 'name', from_box.name, + 'aria-labelledby', field_id + '_to_title', + 'class', 'filtered' + ); + const warning_footer = quickElement('div', selector_chosen, '', 'class', 'list-footer-display'); + quickElement('span', warning_footer, '', 'id', field_id + '_list-footer-display-text'); + quickElement('span', warning_footer, ' ' + gettext('(click to clear)'), 'class', 'list-footer-display__clear'); + const clear_all = quickElement( + 'button', + selector_chosen, + interpolate(gettext('Remove all %s'), [field_name]), + 'id', field_id + '_remove_all', + 'class', 'selector-clearall', + 'type', 'button' + ); + + from_box.name = from_box.name + '_old'; + + // Set up the JavaScript event handlers for the select box filter interface + const move_selection = function(e, elem, move_func, from, to) { + if (!elem.hasAttribute('disabled')) { + move_func(from, to); + SelectFilter.refresh_icons(field_id); + SelectFilter.refresh_filtered_selects(field_id); + SelectFilter.refresh_filtered_warning(field_id); + } + e.preventDefault(); + }; + choose_all.addEventListener('click', function(e) { + move_selection(e, this, SelectBox.move_all, field_id + '_from', field_id + '_to'); + }); + add_button.addEventListener('click', function(e) { + move_selection(e, this, SelectBox.move, field_id + '_from', field_id + '_to'); + }); + remove_button.addEventListener('click', function(e) { + move_selection(e, this, SelectBox.move, field_id + '_to', field_id + '_from'); + }); + clear_all.addEventListener('click', function(e) { + move_selection(e, this, SelectBox.move_all, field_id + '_to', field_id + '_from'); + }); + warning_footer.addEventListener('click', function(e) { + filter_selected_input.value = ''; + SelectBox.filter(field_id + '_to', ''); + SelectFilter.refresh_filtered_warning(field_id); + SelectFilter.refresh_icons(field_id); + }); + filter_input.addEventListener('keypress', function(e) { + SelectFilter.filter_key_press(e, field_id, '_from', '_to'); + }); + filter_input.addEventListener('keyup', function(e) { + SelectFilter.filter_key_up(e, field_id, '_from'); + }); + filter_input.addEventListener('keydown', function(e) { + SelectFilter.filter_key_down(e, field_id, '_from', '_to'); + }); + filter_selected_input.addEventListener('keypress', function(e) { + SelectFilter.filter_key_press(e, field_id, '_to', '_from'); + }); + filter_selected_input.addEventListener('keyup', function(e) { + SelectFilter.filter_key_up(e, field_id, '_to', '_selected_input'); + }); + filter_selected_input.addEventListener('keydown', function(e) { + SelectFilter.filter_key_down(e, field_id, '_to', '_from'); + }); + selector_div.addEventListener('change', function(e) { + if (e.target.tagName === 'SELECT') { + SelectFilter.refresh_icons(field_id); + } + }); + selector_div.addEventListener('dblclick', function(e) { + if (e.target.tagName === 'OPTION') { + if (e.target.closest('select').id === field_id + '_to') { + SelectBox.move(field_id + '_to', field_id + '_from'); + } else { + SelectBox.move(field_id + '_from', field_id + '_to'); + } + SelectFilter.refresh_icons(field_id); + } + }); + from_box.closest('form').addEventListener('submit', function() { + SelectBox.filter(field_id + '_to', ''); + SelectBox.select_all(field_id + '_to'); + }); + SelectBox.init(field_id + '_from'); + SelectBox.init(field_id + '_to'); + // Move selected from_box options to to_box + SelectBox.move(field_id + '_from', field_id + '_to'); + + // Initial icon refresh + SelectFilter.refresh_icons(field_id); + }, + any_selected: function(field) { + // Temporarily add the required attribute and check validity. + field.required = true; + const any_selected = field.checkValidity(); + field.required = false; + return any_selected; + }, + refresh_filtered_warning: function(field_id) { + const count = SelectBox.get_hidden_node_count(field_id + '_to'); + const selector = document.getElementById(field_id + '_selector_chosen'); + const warning = document.getElementById(field_id + '_list-footer-display-text'); + selector.className = selector.className.replace('selector-chosen--with-filtered', ''); + warning.textContent = interpolate(ngettext( + '%s selected option not visible', + '%s selected options not visible', + count + ), [count]); + if(count > 0) { + selector.className += ' selector-chosen--with-filtered'; + } + }, + refresh_filtered_selects: function(field_id) { + SelectBox.filter(field_id + '_from', document.getElementById(field_id + "_input").value); + SelectBox.filter(field_id + '_to', document.getElementById(field_id + "_selected_input").value); + }, + refresh_icons: function(field_id) { + const from = document.getElementById(field_id + '_from'); + const to = document.getElementById(field_id + '_to'); + // Disabled if no items are selected. + document.getElementById(field_id + '_add').disabled = !SelectFilter.any_selected(from); + document.getElementById(field_id + '_remove').disabled = !SelectFilter.any_selected(to); + // Disabled if the corresponding box is empty. + document.getElementById(field_id + '_add_all').disabled = !from.querySelector('option'); + document.getElementById(field_id + '_remove_all').disabled = !to.querySelector('option'); + }, + filter_key_press: function(event, field_id, source, target) { + const source_box = document.getElementById(field_id + source); + // don't submit form if user pressed Enter + if ((event.which && event.which === 13) || (event.keyCode && event.keyCode === 13)) { + source_box.selectedIndex = 0; + SelectBox.move(field_id + source, field_id + target); + source_box.selectedIndex = 0; + event.preventDefault(); + } + }, + filter_key_up: function(event, field_id, source, filter_input) { + const input = filter_input || '_input'; + const source_box = document.getElementById(field_id + source); + const temp = source_box.selectedIndex; + SelectBox.filter(field_id + source, document.getElementById(field_id + input).value); + source_box.selectedIndex = temp; + SelectFilter.refresh_filtered_warning(field_id); + SelectFilter.refresh_icons(field_id); + }, + filter_key_down: function(event, field_id, source, target) { + const source_box = document.getElementById(field_id + source); + // right key (39) or left key (37) + const direction = source === '_from' ? 39 : 37; + // right arrow -- move across + if ((event.which && event.which === direction) || (event.keyCode && event.keyCode === direction)) { + const old_index = source_box.selectedIndex; + SelectBox.move(field_id + source, field_id + target); + SelectFilter.refresh_filtered_selects(field_id); + SelectFilter.refresh_filtered_warning(field_id); + source_box.selectedIndex = (old_index === source_box.length) ? source_box.length - 1 : old_index; + return; + } + // down arrow -- wrap around + if ((event.which && event.which === 40) || (event.keyCode && event.keyCode === 40)) { + source_box.selectedIndex = (source_box.length === source_box.selectedIndex + 1) ? 0 : source_box.selectedIndex + 1; + } + // up arrow -- wrap around + if ((event.which && event.which === 38) || (event.keyCode && event.keyCode === 38)) { + source_box.selectedIndex = (source_box.selectedIndex === 0) ? source_box.length - 1 : source_box.selectedIndex - 1; + } + } + }; + + window.addEventListener('load', function(e) { + document.querySelectorAll('select.selectfilter, select.selectfilterstacked').forEach(function(el) { + const data = el.dataset; + SelectFilter.init(el.id, data.fieldName, parseInt(data.isStacked, 10)); + }); + }); +} diff --git a/staticfiles/admin/js/actions.js b/staticfiles/admin/js/actions.js new file mode 100644 index 0000000..04b25e9 --- /dev/null +++ b/staticfiles/admin/js/actions.js @@ -0,0 +1,204 @@ +/*global gettext, interpolate, ngettext, Actions*/ +'use strict'; +{ + function show(selector) { + document.querySelectorAll(selector).forEach(function(el) { + el.classList.remove('hidden'); + }); + } + + function hide(selector) { + document.querySelectorAll(selector).forEach(function(el) { + el.classList.add('hidden'); + }); + } + + function showQuestion(options) { + hide(options.acrossClears); + show(options.acrossQuestions); + hide(options.allContainer); + } + + function showClear(options) { + show(options.acrossClears); + hide(options.acrossQuestions); + document.querySelector(options.actionContainer).classList.remove(options.selectedClass); + show(options.allContainer); + hide(options.counterContainer); + } + + function reset(options) { + hide(options.acrossClears); + hide(options.acrossQuestions); + hide(options.allContainer); + show(options.counterContainer); + } + + function clearAcross(options) { + reset(options); + const acrossInputs = document.querySelectorAll(options.acrossInput); + acrossInputs.forEach(function(acrossInput) { + acrossInput.value = 0; + }); + document.querySelector(options.actionContainer).classList.remove(options.selectedClass); + } + + function checker(actionCheckboxes, options, checked) { + if (checked) { + showQuestion(options); + } else { + reset(options); + } + actionCheckboxes.forEach(function(el) { + el.checked = checked; + el.closest('tr').classList.toggle(options.selectedClass, checked); + }); + } + + function updateCounter(actionCheckboxes, options) { + const sel = Array.from(actionCheckboxes).filter(function(el) { + return el.checked; + }).length; + const counter = document.querySelector(options.counterContainer); + // data-actions-icnt is defined in the generated HTML + // and contains the total amount of objects in the queryset + const actions_icnt = Number(counter.dataset.actionsIcnt); + counter.textContent = interpolate( + ngettext('%(sel)s of %(cnt)s selected', '%(sel)s of %(cnt)s selected', sel), { + sel: sel, + cnt: actions_icnt + }, true); + const allToggle = document.getElementById(options.allToggleId); + allToggle.checked = sel === actionCheckboxes.length; + if (allToggle.checked) { + showQuestion(options); + } else { + clearAcross(options); + } + } + + const defaults = { + actionContainer: "div.actions", + counterContainer: "span.action-counter", + allContainer: "div.actions span.all", + acrossInput: "div.actions input.select-across", + acrossQuestions: "div.actions span.question", + acrossClears: "div.actions span.clear", + allToggleId: "action-toggle", + selectedClass: "selected" + }; + + window.Actions = function(actionCheckboxes, options) { + options = Object.assign({}, defaults, options); + let list_editable_changed = false; + let lastChecked = null; + let shiftPressed = false; + + document.addEventListener('keydown', (event) => { + shiftPressed = event.shiftKey; + }); + + document.addEventListener('keyup', (event) => { + shiftPressed = event.shiftKey; + }); + + document.getElementById(options.allToggleId).addEventListener('click', function(event) { + checker(actionCheckboxes, options, this.checked); + updateCounter(actionCheckboxes, options); + }); + + document.querySelectorAll(options.acrossQuestions + " a").forEach(function(el) { + el.addEventListener('click', function(event) { + event.preventDefault(); + const acrossInputs = document.querySelectorAll(options.acrossInput); + acrossInputs.forEach(function(acrossInput) { + acrossInput.value = 1; + }); + showClear(options); + }); + }); + + document.querySelectorAll(options.acrossClears + " a").forEach(function(el) { + el.addEventListener('click', function(event) { + event.preventDefault(); + document.getElementById(options.allToggleId).checked = false; + clearAcross(options); + checker(actionCheckboxes, options, false); + updateCounter(actionCheckboxes, options); + }); + }); + + function affectedCheckboxes(target, withModifier) { + const multiSelect = (lastChecked && withModifier && lastChecked !== target); + if (!multiSelect) { + return [target]; + } + const checkboxes = Array.from(actionCheckboxes); + const targetIndex = checkboxes.findIndex(el => el === target); + const lastCheckedIndex = checkboxes.findIndex(el => el === lastChecked); + const startIndex = Math.min(targetIndex, lastCheckedIndex); + const endIndex = Math.max(targetIndex, lastCheckedIndex); + const filtered = checkboxes.filter((el, index) => (startIndex <= index) && (index <= endIndex)); + return filtered; + }; + + Array.from(document.getElementById('result_list').tBodies).forEach(function(el) { + el.addEventListener('change', function(event) { + const target = event.target; + if (target.classList.contains('action-select')) { + const checkboxes = affectedCheckboxes(target, shiftPressed); + checker(checkboxes, options, target.checked); + updateCounter(actionCheckboxes, options); + lastChecked = target; + } else { + list_editable_changed = true; + } + }); + }); + + document.querySelector('#changelist-form button[name=index]').addEventListener('click', function(event) { + if (list_editable_changed) { + const confirmed = confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost.")); + if (!confirmed) { + event.preventDefault(); + } + } + }); + + const el = document.querySelector('#changelist-form input[name=_save]'); + // The button does not exist if no fields are editable. + if (el) { + el.addEventListener('click', function(event) { + if (document.querySelector('[name=action]').value) { + const text = list_editable_changed + ? gettext("You have selected an action, but you haven’t saved your changes to individual fields yet. Please click OK to save. You’ll need to re-run the action.") + : gettext("You have selected an action, and you haven’t made any changes on individual fields. You’re probably looking for the Go button rather than the Save button."); + if (!confirm(text)) { + event.preventDefault(); + } + } + }); + } + // Sync counter when navigating to the page, such as through the back + // button. + window.addEventListener('pageshow', (event) => updateCounter(actionCheckboxes, options)); + }; + + // Call function fn when the DOM is loaded and ready. If it is already + // loaded, call the function now. + // http://youmightnotneedjquery.com/#ready + function ready(fn) { + if (document.readyState !== 'loading') { + fn(); + } else { + document.addEventListener('DOMContentLoaded', fn); + } + } + + ready(function() { + const actionsEls = document.querySelectorAll('tr input.action-select'); + if (actionsEls.length > 0) { + Actions(actionsEls); + } + }); +} diff --git a/staticfiles/admin/js/admin/DateTimeShortcuts.js b/staticfiles/admin/js/admin/DateTimeShortcuts.js new file mode 100644 index 0000000..aa1cae9 --- /dev/null +++ b/staticfiles/admin/js/admin/DateTimeShortcuts.js @@ -0,0 +1,408 @@ +/*global Calendar, findPosX, findPosY, get_format, gettext, gettext_noop, interpolate, ngettext, quickElement*/ +// Inserts shortcut buttons after all of the following: +// +// +'use strict'; +{ + const DateTimeShortcuts = { + calendars: [], + calendarInputs: [], + clockInputs: [], + clockHours: { + default_: [ + [gettext_noop('Now'), -1], + [gettext_noop('Midnight'), 0], + [gettext_noop('6 a.m.'), 6], + [gettext_noop('Noon'), 12], + [gettext_noop('6 p.m.'), 18] + ] + }, + dismissClockFunc: [], + dismissCalendarFunc: [], + calendarDivName1: 'calendarbox', // name of calendar
      that gets toggled + calendarDivName2: 'calendarin', // name of
      that contains calendar + calendarLinkName: 'calendarlink', // name of the link that is used to toggle + clockDivName: 'clockbox', // name of clock
      that gets toggled + clockLinkName: 'clocklink', // name of the link that is used to toggle + shortCutsClass: 'datetimeshortcuts', // class of the clock and cal shortcuts + timezoneWarningClass: 'timezonewarning', // class of the warning for timezone mismatch + timezoneOffset: 0, + init: function() { + const serverOffset = document.body.dataset.adminUtcOffset; + if (serverOffset) { + const localOffset = new Date().getTimezoneOffset() * -60; + DateTimeShortcuts.timezoneOffset = localOffset - serverOffset; + } + + for (const inp of document.getElementsByTagName('input')) { + if (inp.type === 'text' && inp.classList.contains('vTimeField')) { + DateTimeShortcuts.addClock(inp); + DateTimeShortcuts.addTimezoneWarning(inp); + } + else if (inp.type === 'text' && inp.classList.contains('vDateField')) { + DateTimeShortcuts.addCalendar(inp); + DateTimeShortcuts.addTimezoneWarning(inp); + } + } + }, + // Return the current time while accounting for the server timezone. + now: function() { + const serverOffset = document.body.dataset.adminUtcOffset; + if (serverOffset) { + const localNow = new Date(); + const localOffset = localNow.getTimezoneOffset() * -60; + localNow.setTime(localNow.getTime() + 1000 * (serverOffset - localOffset)); + return localNow; + } else { + return new Date(); + } + }, + // Add a warning when the time zone in the browser and backend do not match. + addTimezoneWarning: function(inp) { + const warningClass = DateTimeShortcuts.timezoneWarningClass; + let timezoneOffset = DateTimeShortcuts.timezoneOffset / 3600; + + // Only warn if there is a time zone mismatch. + if (!timezoneOffset) { + return; + } + + // Check if warning is already there. + if (inp.parentNode.querySelectorAll('.' + warningClass).length) { + return; + } + + let message; + if (timezoneOffset > 0) { + message = ngettext( + 'Note: You are %s hour ahead of server time.', + 'Note: You are %s hours ahead of server time.', + timezoneOffset + ); + } + else { + timezoneOffset *= -1; + message = ngettext( + 'Note: You are %s hour behind server time.', + 'Note: You are %s hours behind server time.', + timezoneOffset + ); + } + message = interpolate(message, [timezoneOffset]); + + const warning = document.createElement('div'); + warning.classList.add('help', warningClass); + warning.textContent = message; + inp.parentNode.appendChild(warning); + }, + // Add clock widget to a given field + addClock: function(inp) { + const num = DateTimeShortcuts.clockInputs.length; + DateTimeShortcuts.clockInputs[num] = inp; + DateTimeShortcuts.dismissClockFunc[num] = function() { DateTimeShortcuts.dismissClock(num); return true; }; + + // Shortcut links (clock icon and "Now" link) + const shortcuts_span = document.createElement('span'); + shortcuts_span.className = DateTimeShortcuts.shortCutsClass; + inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling); + const now_link = document.createElement('a'); + now_link.href = "#"; + now_link.textContent = gettext('Now'); + now_link.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.handleClockQuicklink(num, -1); + }); + const clock_link = document.createElement('a'); + clock_link.href = '#'; + clock_link.id = DateTimeShortcuts.clockLinkName + num; + clock_link.addEventListener('click', function(e) { + e.preventDefault(); + // avoid triggering the document click handler to dismiss the clock + e.stopPropagation(); + DateTimeShortcuts.openClock(num); + }); + + quickElement( + 'span', clock_link, '', + 'class', 'clock-icon', + 'title', gettext('Choose a Time') + ); + shortcuts_span.appendChild(document.createTextNode('\u00A0')); + shortcuts_span.appendChild(now_link); + shortcuts_span.appendChild(document.createTextNode('\u00A0|\u00A0')); + shortcuts_span.appendChild(clock_link); + + // Create clock link div + // + // Markup looks like: + // + + const clock_box = document.createElement('div'); + clock_box.style.display = 'none'; + clock_box.style.position = 'absolute'; + clock_box.className = 'clockbox module'; + clock_box.id = DateTimeShortcuts.clockDivName + num; + document.body.appendChild(clock_box); + clock_box.addEventListener('click', function(e) { e.stopPropagation(); }); + + quickElement('h2', clock_box, gettext('Choose a time')); + const time_list = quickElement('ul', clock_box); + time_list.className = 'timelist'; + // The list of choices can be overridden in JavaScript like this: + // DateTimeShortcuts.clockHours.name = [['3 a.m.', 3]]; + // where name is the name attribute of the . + const name = typeof DateTimeShortcuts.clockHours[inp.name] === 'undefined' ? 'default_' : inp.name; + DateTimeShortcuts.clockHours[name].forEach(function(element) { + const time_link = quickElement('a', quickElement('li', time_list), gettext(element[0]), 'href', '#'); + time_link.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.handleClockQuicklink(num, element[1]); + }); + }); + + const cancel_p = quickElement('p', clock_box); + cancel_p.className = 'calendar-cancel'; + const cancel_link = quickElement('a', cancel_p, gettext('Cancel'), 'href', '#'); + cancel_link.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.dismissClock(num); + }); + + document.addEventListener('keyup', function(event) { + if (event.which === 27) { + // ESC key closes popup + DateTimeShortcuts.dismissClock(num); + event.preventDefault(); + } + }); + }, + openClock: function(num) { + const clock_box = document.getElementById(DateTimeShortcuts.clockDivName + num); + const clock_link = document.getElementById(DateTimeShortcuts.clockLinkName + num); + + // Recalculate the clockbox position + // is it left-to-right or right-to-left layout ? + if (window.getComputedStyle(document.body).direction !== 'rtl') { + clock_box.style.left = findPosX(clock_link) + 17 + 'px'; + } + else { + // since style's width is in em, it'd be tough to calculate + // px value of it. let's use an estimated px for now + clock_box.style.left = findPosX(clock_link) - 110 + 'px'; + } + clock_box.style.top = Math.max(0, findPosY(clock_link) - 30) + 'px'; + + // Show the clock box + clock_box.style.display = 'block'; + document.addEventListener('click', DateTimeShortcuts.dismissClockFunc[num]); + }, + dismissClock: function(num) { + document.getElementById(DateTimeShortcuts.clockDivName + num).style.display = 'none'; + document.removeEventListener('click', DateTimeShortcuts.dismissClockFunc[num]); + }, + handleClockQuicklink: function(num, val) { + let d; + if (val === -1) { + d = DateTimeShortcuts.now(); + } + else { + d = new Date(1970, 1, 1, val, 0, 0, 0); + } + DateTimeShortcuts.clockInputs[num].value = d.strftime(get_format('TIME_INPUT_FORMATS')[0]); + DateTimeShortcuts.clockInputs[num].focus(); + DateTimeShortcuts.dismissClock(num); + }, + // Add calendar widget to a given field. + addCalendar: function(inp) { + const num = DateTimeShortcuts.calendars.length; + + DateTimeShortcuts.calendarInputs[num] = inp; + DateTimeShortcuts.dismissCalendarFunc[num] = function() { DateTimeShortcuts.dismissCalendar(num); return true; }; + + // Shortcut links (calendar icon and "Today" link) + const shortcuts_span = document.createElement('span'); + shortcuts_span.className = DateTimeShortcuts.shortCutsClass; + inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling); + const today_link = document.createElement('a'); + today_link.href = '#'; + today_link.appendChild(document.createTextNode(gettext('Today'))); + today_link.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.handleCalendarQuickLink(num, 0); + }); + const cal_link = document.createElement('a'); + cal_link.href = '#'; + cal_link.id = DateTimeShortcuts.calendarLinkName + num; + cal_link.addEventListener('click', function(e) { + e.preventDefault(); + // avoid triggering the document click handler to dismiss the calendar + e.stopPropagation(); + DateTimeShortcuts.openCalendar(num); + }); + quickElement( + 'span', cal_link, '', + 'class', 'date-icon', + 'title', gettext('Choose a Date') + ); + shortcuts_span.appendChild(document.createTextNode('\u00A0')); + shortcuts_span.appendChild(today_link); + shortcuts_span.appendChild(document.createTextNode('\u00A0|\u00A0')); + shortcuts_span.appendChild(cal_link); + + // Create calendarbox div. + // + // Markup looks like: + // + //
      + //

      + // + // February 2003 + //

      + //
      + // + //
      + //
      + // Yesterday | Today | Tomorrow + //
      + //

      Cancel

      + //
      + const cal_box = document.createElement('div'); + cal_box.style.display = 'none'; + cal_box.style.position = 'absolute'; + cal_box.className = 'calendarbox module'; + cal_box.id = DateTimeShortcuts.calendarDivName1 + num; + document.body.appendChild(cal_box); + cal_box.addEventListener('click', function(e) { e.stopPropagation(); }); + + // next-prev links + const cal_nav = quickElement('div', cal_box); + const cal_nav_prev = quickElement('a', cal_nav, '<', 'href', '#'); + cal_nav_prev.className = 'calendarnav-previous'; + cal_nav_prev.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.drawPrev(num); + }); + + const cal_nav_next = quickElement('a', cal_nav, '>', 'href', '#'); + cal_nav_next.className = 'calendarnav-next'; + cal_nav_next.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.drawNext(num); + }); + + // main box + const cal_main = quickElement('div', cal_box, '', 'id', DateTimeShortcuts.calendarDivName2 + num); + cal_main.className = 'calendar'; + DateTimeShortcuts.calendars[num] = new Calendar(DateTimeShortcuts.calendarDivName2 + num, DateTimeShortcuts.handleCalendarCallback(num)); + DateTimeShortcuts.calendars[num].drawCurrent(); + + // calendar shortcuts + const shortcuts = quickElement('div', cal_box); + shortcuts.className = 'calendar-shortcuts'; + let day_link = quickElement('a', shortcuts, gettext('Yesterday'), 'href', '#'); + day_link.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.handleCalendarQuickLink(num, -1); + }); + shortcuts.appendChild(document.createTextNode('\u00A0|\u00A0')); + day_link = quickElement('a', shortcuts, gettext('Today'), 'href', '#'); + day_link.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.handleCalendarQuickLink(num, 0); + }); + shortcuts.appendChild(document.createTextNode('\u00A0|\u00A0')); + day_link = quickElement('a', shortcuts, gettext('Tomorrow'), 'href', '#'); + day_link.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.handleCalendarQuickLink(num, +1); + }); + + // cancel bar + const cancel_p = quickElement('p', cal_box); + cancel_p.className = 'calendar-cancel'; + const cancel_link = quickElement('a', cancel_p, gettext('Cancel'), 'href', '#'); + cancel_link.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.dismissCalendar(num); + }); + document.addEventListener('keyup', function(event) { + if (event.which === 27) { + // ESC key closes popup + DateTimeShortcuts.dismissCalendar(num); + event.preventDefault(); + } + }); + }, + openCalendar: function(num) { + const cal_box = document.getElementById(DateTimeShortcuts.calendarDivName1 + num); + const cal_link = document.getElementById(DateTimeShortcuts.calendarLinkName + num); + const inp = DateTimeShortcuts.calendarInputs[num]; + + // Determine if the current value in the input has a valid date. + // If so, draw the calendar with that date's year and month. + if (inp.value) { + const format = get_format('DATE_INPUT_FORMATS')[0]; + const selected = inp.value.strptime(format); + const year = selected.getUTCFullYear(); + const month = selected.getUTCMonth() + 1; + const re = /\d{4}/; + if (re.test(year.toString()) && month >= 1 && month <= 12) { + DateTimeShortcuts.calendars[num].drawDate(month, year, selected); + } + } + + // Recalculate the clockbox position + // is it left-to-right or right-to-left layout ? + if (window.getComputedStyle(document.body).direction !== 'rtl') { + cal_box.style.left = findPosX(cal_link) + 17 + 'px'; + } + else { + // since style's width is in em, it'd be tough to calculate + // px value of it. let's use an estimated px for now + cal_box.style.left = findPosX(cal_link) - 180 + 'px'; + } + cal_box.style.top = Math.max(0, findPosY(cal_link) - 75) + 'px'; + + cal_box.style.display = 'block'; + document.addEventListener('click', DateTimeShortcuts.dismissCalendarFunc[num]); + }, + dismissCalendar: function(num) { + document.getElementById(DateTimeShortcuts.calendarDivName1 + num).style.display = 'none'; + document.removeEventListener('click', DateTimeShortcuts.dismissCalendarFunc[num]); + }, + drawPrev: function(num) { + DateTimeShortcuts.calendars[num].drawPreviousMonth(); + }, + drawNext: function(num) { + DateTimeShortcuts.calendars[num].drawNextMonth(); + }, + handleCalendarCallback: function(num) { + const format = get_format('DATE_INPUT_FORMATS')[0]; + return function(y, m, d) { + DateTimeShortcuts.calendarInputs[num].value = new Date(y, m - 1, d).strftime(format); + DateTimeShortcuts.calendarInputs[num].focus(); + document.getElementById(DateTimeShortcuts.calendarDivName1 + num).style.display = 'none'; + }; + }, + handleCalendarQuickLink: function(num, offset) { + const d = DateTimeShortcuts.now(); + d.setDate(d.getDate() + offset); + DateTimeShortcuts.calendarInputs[num].value = d.strftime(get_format('DATE_INPUT_FORMATS')[0]); + DateTimeShortcuts.calendarInputs[num].focus(); + DateTimeShortcuts.dismissCalendar(num); + } + }; + + window.addEventListener('load', DateTimeShortcuts.init); + window.DateTimeShortcuts = DateTimeShortcuts; +} diff --git a/staticfiles/admin/js/admin/RelatedObjectLookups.js b/staticfiles/admin/js/admin/RelatedObjectLookups.js new file mode 100644 index 0000000..1fc03c6 --- /dev/null +++ b/staticfiles/admin/js/admin/RelatedObjectLookups.js @@ -0,0 +1,252 @@ +/*global SelectBox, interpolate*/ +// Handles related-objects functionality: lookup link for raw_id_fields +// and Add Another links. +'use strict'; +{ + const $ = django.jQuery; + let popupIndex = 0; + const relatedWindows = []; + + function dismissChildPopups() { + relatedWindows.forEach(function(win) { + if(!win.closed) { + win.dismissChildPopups(); + win.close(); + } + }); + } + + function setPopupIndex() { + if(document.getElementsByName("_popup").length > 0) { + const index = window.name.lastIndexOf("__") + 2; + popupIndex = parseInt(window.name.substring(index)); + } else { + popupIndex = 0; + } + } + + function addPopupIndex(name) { + return name + "__" + (popupIndex + 1); + } + + function removePopupIndex(name) { + return name.replace(new RegExp("__" + (popupIndex + 1) + "$"), ''); + } + + function showAdminPopup(triggeringLink, name_regexp, add_popup) { + const name = addPopupIndex(triggeringLink.id.replace(name_regexp, '')); + const href = new URL(triggeringLink.href); + if (add_popup) { + href.searchParams.set('_popup', 1); + } + const win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes'); + relatedWindows.push(win); + win.focus(); + return false; + } + + function showRelatedObjectLookupPopup(triggeringLink) { + return showAdminPopup(triggeringLink, /^lookup_/, true); + } + + function dismissRelatedLookupPopup(win, chosenId) { + const name = removePopupIndex(win.name); + const elem = document.getElementById(name); + if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) { + elem.value += ',' + chosenId; + } else { + elem.value = chosenId; + } + $(elem).trigger('change'); + const index = relatedWindows.indexOf(win); + if (index > -1) { + relatedWindows.splice(index, 1); + } + win.close(); + } + + function showRelatedObjectPopup(triggeringLink) { + return showAdminPopup(triggeringLink, /^(change|add|delete)_/, false); + } + + function updateRelatedObjectLinks(triggeringLink) { + const $this = $(triggeringLink); + const siblings = $this.nextAll('.view-related, .change-related, .delete-related'); + if (!siblings.length) { + return; + } + const value = $this.val(); + if (value) { + siblings.each(function() { + const elm = $(this); + elm.attr('href', elm.attr('data-href-template').replace('__fk__', value)); + elm.removeAttr('aria-disabled'); + }); + } else { + siblings.removeAttr('href'); + siblings.attr('aria-disabled', true); + } + } + + function updateRelatedSelectsOptions(currentSelect, win, objId, newRepr, newId, skipIds = []) { + // After create/edit a model from the options next to the current + // select (+ or :pencil:) update ForeignKey PK of the rest of selects + // in the page. + + const path = win.location.pathname; + // Extract the model from the popup url '...//add/' or + // '...///change/' depending the action (add or change). + const modelName = path.split('/')[path.split('/').length - (objId ? 4 : 3)]; + // Select elements with a specific model reference and context of "available-source". + const selectsRelated = document.querySelectorAll(`[data-model-ref="${modelName}"] [data-context="available-source"]`); + + selectsRelated.forEach(function(select) { + if (currentSelect === select || skipIds && skipIds.includes(select.id)) { + return; + } + + let option = select.querySelector(`option[value="${objId}"]`); + + if (!option) { + option = new Option(newRepr, newId); + select.options.add(option); + // Update SelectBox cache for related fields. + if (window.SelectBox !== undefined && !SelectBox.cache[currentSelect.id]) { + SelectBox.add_to_cache(select.id, option); + SelectBox.redisplay(select.id); + } + return; + } + + option.textContent = newRepr; + option.value = newId; + }); + } + + function dismissAddRelatedObjectPopup(win, newId, newRepr) { + const name = removePopupIndex(win.name); + const elem = document.getElementById(name); + if (elem) { + const elemName = elem.nodeName.toUpperCase(); + if (elemName === 'SELECT') { + elem.options[elem.options.length] = new Option(newRepr, newId, true, true); + updateRelatedSelectsOptions(elem, win, null, newRepr, newId); + } else if (elemName === 'INPUT') { + if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) { + elem.value += ',' + newId; + } else { + elem.value = newId; + } + } + // Trigger a change event to update related links if required. + $(elem).trigger('change'); + } else { + const toId = name + "_to"; + const toElem = document.getElementById(toId); + const o = new Option(newRepr, newId); + SelectBox.add_to_cache(toId, o); + SelectBox.redisplay(toId); + if (toElem && toElem.nodeName.toUpperCase() === 'SELECT') { + const skipIds = [name + "_from"]; + updateRelatedSelectsOptions(toElem, win, null, newRepr, newId, skipIds); + } + } + const index = relatedWindows.indexOf(win); + if (index > -1) { + relatedWindows.splice(index, 1); + } + win.close(); + } + + function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) { + const id = removePopupIndex(win.name.replace(/^edit_/, '')); + const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); + const selects = $(selectsSelector); + selects.find('option').each(function() { + if (this.value === objId) { + this.textContent = newRepr; + this.value = newId; + } + }).trigger('change'); + updateRelatedSelectsOptions(selects[0], win, objId, newRepr, newId); + selects.next().find('.select2-selection__rendered').each(function() { + // The element can have a clear button as a child. + // Use the lastChild to modify only the displayed value. + this.lastChild.textContent = newRepr; + this.title = newRepr; + }); + const index = relatedWindows.indexOf(win); + if (index > -1) { + relatedWindows.splice(index, 1); + } + win.close(); + } + + function dismissDeleteRelatedObjectPopup(win, objId) { + const id = removePopupIndex(win.name.replace(/^delete_/, '')); + const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); + const selects = $(selectsSelector); + selects.find('option').each(function() { + if (this.value === objId) { + $(this).remove(); + } + }).trigger('change'); + const index = relatedWindows.indexOf(win); + if (index > -1) { + relatedWindows.splice(index, 1); + } + win.close(); + } + + window.showRelatedObjectLookupPopup = showRelatedObjectLookupPopup; + window.dismissRelatedLookupPopup = dismissRelatedLookupPopup; + window.showRelatedObjectPopup = showRelatedObjectPopup; + window.updateRelatedObjectLinks = updateRelatedObjectLinks; + window.dismissAddRelatedObjectPopup = dismissAddRelatedObjectPopup; + window.dismissChangeRelatedObjectPopup = dismissChangeRelatedObjectPopup; + window.dismissDeleteRelatedObjectPopup = dismissDeleteRelatedObjectPopup; + window.dismissChildPopups = dismissChildPopups; + window.relatedWindows = relatedWindows; + + // Kept for backward compatibility + window.showAddAnotherPopup = showRelatedObjectPopup; + window.dismissAddAnotherPopup = dismissAddRelatedObjectPopup; + + window.addEventListener('unload', function(evt) { + window.dismissChildPopups(); + }); + + $(document).ready(function() { + setPopupIndex(); + $("a[data-popup-opener]").on('click', function(event) { + event.preventDefault(); + opener.dismissRelatedLookupPopup(window, $(this).data("popup-opener")); + }); + $('body').on('click', '.related-widget-wrapper-link[data-popup="yes"]', function(e) { + e.preventDefault(); + if (this.href) { + const event = $.Event('django:show-related', {href: this.href}); + $(this).trigger(event); + if (!event.isDefaultPrevented()) { + showRelatedObjectPopup(this); + } + } + }); + $('body').on('change', '.related-widget-wrapper select', function(e) { + const event = $.Event('django:update-related'); + $(this).trigger(event); + if (!event.isDefaultPrevented()) { + updateRelatedObjectLinks(this); + } + }); + $('.related-widget-wrapper select').trigger('change'); + $('body').on('click', '.related-lookup', function(e) { + e.preventDefault(); + const event = $.Event('django:lookup-related'); + $(this).trigger(event); + if (!event.isDefaultPrevented()) { + showRelatedObjectLookupPopup(this); + } + }); + }); +} diff --git a/staticfiles/admin/js/autocomplete.js b/staticfiles/admin/js/autocomplete.js new file mode 100644 index 0000000..d3daeab --- /dev/null +++ b/staticfiles/admin/js/autocomplete.js @@ -0,0 +1,33 @@ +'use strict'; +{ + const $ = django.jQuery; + + $.fn.djangoAdminSelect2 = function() { + $.each(this, function(i, element) { + $(element).select2({ + ajax: { + data: (params) => { + return { + term: params.term, + page: params.page, + app_label: element.dataset.appLabel, + model_name: element.dataset.modelName, + field_name: element.dataset.fieldName + }; + } + } + }); + }); + return this; + }; + + $(function() { + // Initialize all autocomplete widgets except the one in the template + // form used when a new formset is added. + $('.admin-autocomplete').not('[name*=__prefix__]').djangoAdminSelect2(); + }); + + document.addEventListener('formset:added', (event) => { + $(event.target).find('.admin-autocomplete').djangoAdminSelect2(); + }); +} diff --git a/staticfiles/admin/js/calendar.js b/staticfiles/admin/js/calendar.js new file mode 100644 index 0000000..776310f --- /dev/null +++ b/staticfiles/admin/js/calendar.js @@ -0,0 +1,239 @@ +/*global gettext, pgettext, get_format, quickElement, removeChildren*/ +/* +calendar.js - Calendar functions by Adrian Holovaty +depends on core.js for utility functions like removeChildren or quickElement +*/ +'use strict'; +{ + // CalendarNamespace -- Provides a collection of HTML calendar-related helper functions + const CalendarNamespace = { + monthsOfYear: [ + gettext('January'), + gettext('February'), + gettext('March'), + gettext('April'), + gettext('May'), + gettext('June'), + gettext('July'), + gettext('August'), + gettext('September'), + gettext('October'), + gettext('November'), + gettext('December') + ], + monthsOfYearAbbrev: [ + pgettext('abbrev. month January', 'Jan'), + pgettext('abbrev. month February', 'Feb'), + pgettext('abbrev. month March', 'Mar'), + pgettext('abbrev. month April', 'Apr'), + pgettext('abbrev. month May', 'May'), + pgettext('abbrev. month June', 'Jun'), + pgettext('abbrev. month July', 'Jul'), + pgettext('abbrev. month August', 'Aug'), + pgettext('abbrev. month September', 'Sep'), + pgettext('abbrev. month October', 'Oct'), + pgettext('abbrev. month November', 'Nov'), + pgettext('abbrev. month December', 'Dec') + ], + daysOfWeek: [ + gettext('Sunday'), + gettext('Monday'), + gettext('Tuesday'), + gettext('Wednesday'), + gettext('Thursday'), + gettext('Friday'), + gettext('Saturday') + ], + daysOfWeekAbbrev: [ + pgettext('abbrev. day Sunday', 'Sun'), + pgettext('abbrev. day Monday', 'Mon'), + pgettext('abbrev. day Tuesday', 'Tue'), + pgettext('abbrev. day Wednesday', 'Wed'), + pgettext('abbrev. day Thursday', 'Thur'), + pgettext('abbrev. day Friday', 'Fri'), + pgettext('abbrev. day Saturday', 'Sat') + ], + daysOfWeekInitial: [ + pgettext('one letter Sunday', 'S'), + pgettext('one letter Monday', 'M'), + pgettext('one letter Tuesday', 'T'), + pgettext('one letter Wednesday', 'W'), + pgettext('one letter Thursday', 'T'), + pgettext('one letter Friday', 'F'), + pgettext('one letter Saturday', 'S') + ], + firstDayOfWeek: parseInt(get_format('FIRST_DAY_OF_WEEK')), + isLeapYear: function(year) { + return (((year % 4) === 0) && ((year % 100) !== 0 ) || ((year % 400) === 0)); + }, + getDaysInMonth: function(month, year) { + let days; + if (month === 1 || month === 3 || month === 5 || month === 7 || month === 8 || month === 10 || month === 12) { + days = 31; + } + else if (month === 4 || month === 6 || month === 9 || month === 11) { + days = 30; + } + else if (month === 2 && CalendarNamespace.isLeapYear(year)) { + days = 29; + } + else { + days = 28; + } + return days; + }, + draw: function(month, year, div_id, callback, selected) { // month = 1-12, year = 1-9999 + const today = new Date(); + const todayDay = today.getDate(); + const todayMonth = today.getMonth() + 1; + const todayYear = today.getFullYear(); + let todayClass = ''; + + // Use UTC functions here because the date field does not contain time + // and using the UTC function variants prevent the local time offset + // from altering the date, specifically the day field. For example: + // + // ``` + // var x = new Date('2013-10-02'); + // var day = x.getDate(); + // ``` + // + // The day variable above will be 1 instead of 2 in, say, US Pacific time + // zone. + let isSelectedMonth = false; + if (typeof selected !== 'undefined') { + isSelectedMonth = (selected.getUTCFullYear() === year && (selected.getUTCMonth() + 1) === month); + } + + month = parseInt(month); + year = parseInt(year); + const calDiv = document.getElementById(div_id); + removeChildren(calDiv); + const calTable = document.createElement('table'); + quickElement('caption', calTable, CalendarNamespace.monthsOfYear[month - 1] + ' ' + year); + const tableBody = quickElement('tbody', calTable); + + // Draw days-of-week header + let tableRow = quickElement('tr', tableBody); + for (let i = 0; i < 7; i++) { + quickElement('th', tableRow, CalendarNamespace.daysOfWeekInitial[(i + CalendarNamespace.firstDayOfWeek) % 7]); + } + + const startingPos = new Date(year, month - 1, 1 - CalendarNamespace.firstDayOfWeek).getDay(); + const days = CalendarNamespace.getDaysInMonth(month, year); + + let nonDayCell; + + // Draw blanks before first of month + tableRow = quickElement('tr', tableBody); + for (let i = 0; i < startingPos; i++) { + nonDayCell = quickElement('td', tableRow, ' '); + nonDayCell.className = "nonday"; + } + + function calendarMonth(y, m) { + function onClick(e) { + e.preventDefault(); + callback(y, m, this.textContent); + } + return onClick; + } + + // Draw days of month + let currentDay = 1; + for (let i = startingPos; currentDay <= days; i++) { + if (i % 7 === 0 && currentDay !== 1) { + tableRow = quickElement('tr', tableBody); + } + if ((currentDay === todayDay) && (month === todayMonth) && (year === todayYear)) { + todayClass = 'today'; + } else { + todayClass = ''; + } + + // use UTC function; see above for explanation. + if (isSelectedMonth && currentDay === selected.getUTCDate()) { + if (todayClass !== '') { + todayClass += " "; + } + todayClass += "selected"; + } + + const cell = quickElement('td', tableRow, '', 'class', todayClass); + const link = quickElement('a', cell, currentDay, 'href', '#'); + link.addEventListener('click', calendarMonth(year, month)); + currentDay++; + } + + // Draw blanks after end of month (optional, but makes for valid code) + while (tableRow.childNodes.length < 7) { + nonDayCell = quickElement('td', tableRow, ' '); + nonDayCell.className = "nonday"; + } + + calDiv.appendChild(calTable); + } + }; + + // Calendar -- A calendar instance + function Calendar(div_id, callback, selected) { + // div_id (string) is the ID of the element in which the calendar will + // be displayed + // callback (string) is the name of a JavaScript function that will be + // called with the parameters (year, month, day) when a day in the + // calendar is clicked + this.div_id = div_id; + this.callback = callback; + this.today = new Date(); + this.currentMonth = this.today.getMonth() + 1; + this.currentYear = this.today.getFullYear(); + if (typeof selected !== 'undefined') { + this.selected = selected; + } + } + Calendar.prototype = { + drawCurrent: function() { + CalendarNamespace.draw(this.currentMonth, this.currentYear, this.div_id, this.callback, this.selected); + }, + drawDate: function(month, year, selected) { + this.currentMonth = month; + this.currentYear = year; + + if(selected) { + this.selected = selected; + } + + this.drawCurrent(); + }, + drawPreviousMonth: function() { + if (this.currentMonth === 1) { + this.currentMonth = 12; + this.currentYear--; + } + else { + this.currentMonth--; + } + this.drawCurrent(); + }, + drawNextMonth: function() { + if (this.currentMonth === 12) { + this.currentMonth = 1; + this.currentYear++; + } + else { + this.currentMonth++; + } + this.drawCurrent(); + }, + drawPreviousYear: function() { + this.currentYear--; + this.drawCurrent(); + }, + drawNextYear: function() { + this.currentYear++; + this.drawCurrent(); + } + }; + window.Calendar = Calendar; + window.CalendarNamespace = CalendarNamespace; +} diff --git a/staticfiles/admin/js/cancel.js b/staticfiles/admin/js/cancel.js new file mode 100644 index 0000000..3069c6f --- /dev/null +++ b/staticfiles/admin/js/cancel.js @@ -0,0 +1,29 @@ +'use strict'; +{ + // Call function fn when the DOM is loaded and ready. If it is already + // loaded, call the function now. + // http://youmightnotneedjquery.com/#ready + function ready(fn) { + if (document.readyState !== 'loading') { + fn(); + } else { + document.addEventListener('DOMContentLoaded', fn); + } + } + + ready(function() { + function handleClick(event) { + event.preventDefault(); + const params = new URLSearchParams(window.location.search); + if (params.has('_popup')) { + window.close(); // Close the popup. + } else { + window.history.back(); // Otherwise, go back. + } + } + + document.querySelectorAll('.cancel-link').forEach(function(el) { + el.addEventListener('click', handleClick); + }); + }); +} diff --git a/staticfiles/admin/js/change_form.js b/staticfiles/admin/js/change_form.js new file mode 100644 index 0000000..96a4c62 --- /dev/null +++ b/staticfiles/admin/js/change_form.js @@ -0,0 +1,16 @@ +'use strict'; +{ + const inputTags = ['BUTTON', 'INPUT', 'SELECT', 'TEXTAREA']; + const modelName = document.getElementById('django-admin-form-add-constants').dataset.modelName; + if (modelName) { + const form = document.getElementById(modelName + '_form'); + for (const element of form.elements) { + // HTMLElement.offsetParent returns null when the element is not + // rendered. + if (inputTags.includes(element.tagName) && !element.disabled && element.offsetParent) { + element.focus(); + break; + } + } + } +} diff --git a/staticfiles/admin/js/core.js b/staticfiles/admin/js/core.js new file mode 100644 index 0000000..10504d4 --- /dev/null +++ b/staticfiles/admin/js/core.js @@ -0,0 +1,184 @@ +// Core JavaScript helper functions +'use strict'; + +// quickElement(tagType, parentReference [, textInChildNode, attribute, attributeValue ...]); +function quickElement() { + const obj = document.createElement(arguments[0]); + if (arguments[2]) { + const textNode = document.createTextNode(arguments[2]); + obj.appendChild(textNode); + } + const len = arguments.length; + for (let i = 3; i < len; i += 2) { + obj.setAttribute(arguments[i], arguments[i + 1]); + } + arguments[1].appendChild(obj); + return obj; +} + +// "a" is reference to an object +function removeChildren(a) { + while (a.hasChildNodes()) { + a.removeChild(a.lastChild); + } +} + +// ---------------------------------------------------------------------------- +// Find-position functions by PPK +// See https://www.quirksmode.org/js/findpos.html +// ---------------------------------------------------------------------------- +function findPosX(obj) { + let curleft = 0; + if (obj.offsetParent) { + while (obj.offsetParent) { + curleft += obj.offsetLeft - obj.scrollLeft; + obj = obj.offsetParent; + } + } else if (obj.x) { + curleft += obj.x; + } + return curleft; +} + +function findPosY(obj) { + let curtop = 0; + if (obj.offsetParent) { + while (obj.offsetParent) { + curtop += obj.offsetTop - obj.scrollTop; + obj = obj.offsetParent; + } + } else if (obj.y) { + curtop += obj.y; + } + return curtop; +} + +//----------------------------------------------------------------------------- +// Date object extensions +// ---------------------------------------------------------------------------- +{ + Date.prototype.getTwelveHours = function() { + return this.getHours() % 12 || 12; + }; + + Date.prototype.getTwoDigitMonth = function() { + return (this.getMonth() < 9) ? '0' + (this.getMonth() + 1) : (this.getMonth() + 1); + }; + + Date.prototype.getTwoDigitDate = function() { + return (this.getDate() < 10) ? '0' + this.getDate() : this.getDate(); + }; + + Date.prototype.getTwoDigitTwelveHour = function() { + return (this.getTwelveHours() < 10) ? '0' + this.getTwelveHours() : this.getTwelveHours(); + }; + + Date.prototype.getTwoDigitHour = function() { + return (this.getHours() < 10) ? '0' + this.getHours() : this.getHours(); + }; + + Date.prototype.getTwoDigitMinute = function() { + return (this.getMinutes() < 10) ? '0' + this.getMinutes() : this.getMinutes(); + }; + + Date.prototype.getTwoDigitSecond = function() { + return (this.getSeconds() < 10) ? '0' + this.getSeconds() : this.getSeconds(); + }; + + Date.prototype.getAbbrevDayName = function() { + return typeof window.CalendarNamespace === "undefined" + ? '0' + this.getDay() + : window.CalendarNamespace.daysOfWeekAbbrev[this.getDay()]; + }; + + Date.prototype.getFullDayName = function() { + return typeof window.CalendarNamespace === "undefined" + ? '0' + this.getDay() + : window.CalendarNamespace.daysOfWeek[this.getDay()]; + }; + + Date.prototype.getAbbrevMonthName = function() { + return typeof window.CalendarNamespace === "undefined" + ? this.getTwoDigitMonth() + : window.CalendarNamespace.monthsOfYearAbbrev[this.getMonth()]; + }; + + Date.prototype.getFullMonthName = function() { + return typeof window.CalendarNamespace === "undefined" + ? this.getTwoDigitMonth() + : window.CalendarNamespace.monthsOfYear[this.getMonth()]; + }; + + Date.prototype.strftime = function(format) { + const fields = { + a: this.getAbbrevDayName(), + A: this.getFullDayName(), + b: this.getAbbrevMonthName(), + B: this.getFullMonthName(), + c: this.toString(), + d: this.getTwoDigitDate(), + H: this.getTwoDigitHour(), + I: this.getTwoDigitTwelveHour(), + m: this.getTwoDigitMonth(), + M: this.getTwoDigitMinute(), + p: (this.getHours() >= 12) ? 'PM' : 'AM', + S: this.getTwoDigitSecond(), + w: '0' + this.getDay(), + x: this.toLocaleDateString(), + X: this.toLocaleTimeString(), + y: ('' + this.getFullYear()).substr(2, 4), + Y: '' + this.getFullYear(), + '%': '%' + }; + let result = '', i = 0; + while (i < format.length) { + if (format.charAt(i) === '%') { + result += fields[format.charAt(i + 1)]; + ++i; + } + else { + result += format.charAt(i); + } + ++i; + } + return result; + }; + + // ---------------------------------------------------------------------------- + // String object extensions + // ---------------------------------------------------------------------------- + String.prototype.strptime = function(format) { + const split_format = format.split(/[.\-/]/); + const date = this.split(/[.\-/]/); + let i = 0; + let day, month, year; + while (i < split_format.length) { + switch (split_format[i]) { + case "%d": + day = date[i]; + break; + case "%m": + month = date[i] - 1; + break; + case "%Y": + year = date[i]; + break; + case "%y": + // A %y value in the range of [00, 68] is in the current + // century, while [69, 99] is in the previous century, + // according to the Open Group Specification. + if (parseInt(date[i], 10) >= 69) { + year = date[i]; + } else { + year = (new Date(Date.UTC(date[i], 0))).getUTCFullYear() + 100; + } + break; + } + ++i; + } + // Create Date object from UTC since the parsed value is supposed to be + // in UTC, not local time. Also, the calendar uses UTC functions for + // date extraction. + return new Date(Date.UTC(year, month, day)); + }; +} diff --git a/staticfiles/admin/js/filters.js b/staticfiles/admin/js/filters.js new file mode 100644 index 0000000..f5536eb --- /dev/null +++ b/staticfiles/admin/js/filters.js @@ -0,0 +1,30 @@ +/** + * Persist changelist filters state (collapsed/expanded). + */ +'use strict'; +{ + // Init filters. + let filters = JSON.parse(sessionStorage.getItem('django.admin.filtersState')); + + if (!filters) { + filters = {}; + } + + Object.entries(filters).forEach(([key, value]) => { + const detailElement = document.querySelector(`[data-filter-title='${CSS.escape(key)}']`); + + // Check if the filter is present, it could be from other view. + if (detailElement) { + value ? detailElement.setAttribute('open', '') : detailElement.removeAttribute('open'); + } + }); + + // Save filter state when clicks. + const details = document.querySelectorAll('details'); + details.forEach(detail => { + detail.addEventListener('toggle', event => { + filters[`${event.target.dataset.filterTitle}`] = detail.open; + sessionStorage.setItem('django.admin.filtersState', JSON.stringify(filters)); + }); + }); +} diff --git a/staticfiles/admin/js/inlines.js b/staticfiles/admin/js/inlines.js new file mode 100644 index 0000000..cd3726c --- /dev/null +++ b/staticfiles/admin/js/inlines.js @@ -0,0 +1,359 @@ +/*global DateTimeShortcuts, SelectFilter*/ +/** + * Django admin inlines + * + * Based on jQuery Formset 1.1 + * @author Stanislaus Madueke (stan DOT madueke AT gmail DOT com) + * @requires jQuery 1.2.6 or later + * + * Copyright (c) 2009, Stanislaus Madueke + * All rights reserved. + * + * Spiced up with Code from Zain Memon's GSoC project 2009 + * and modified for Django by Jannis Leidel, Travis Swicegood and Julien Phalip. + * + * Licensed under the New BSD License + * See: https://opensource.org/licenses/bsd-license.php + */ +'use strict'; +{ + const $ = django.jQuery; + $.fn.formset = function(opts) { + const options = $.extend({}, $.fn.formset.defaults, opts); + const $this = $(this); + const $parent = $this.parent(); + const updateElementIndex = function(el, prefix, ndx) { + const id_regex = new RegExp("(" + prefix + "-(\\d+|__prefix__))"); + const replacement = prefix + "-" + ndx; + if ($(el).prop("for")) { + $(el).prop("for", $(el).prop("for").replace(id_regex, replacement)); + } + if (el.id) { + el.id = el.id.replace(id_regex, replacement); + } + if (el.name) { + el.name = el.name.replace(id_regex, replacement); + } + }; + const totalForms = $("#id_" + options.prefix + "-TOTAL_FORMS").prop("autocomplete", "off"); + let nextIndex = parseInt(totalForms.val(), 10); + const maxForms = $("#id_" + options.prefix + "-MAX_NUM_FORMS").prop("autocomplete", "off"); + const minForms = $("#id_" + options.prefix + "-MIN_NUM_FORMS").prop("autocomplete", "off"); + let addButton; + + /** + * The "Add another MyModel" button below the inline forms. + */ + const addInlineAddButton = function() { + if (addButton === null) { + if ($this.prop("tagName") === "TR") { + // If forms are laid out as table rows, insert the + // "add" button in a new table row: + const numCols = $this.eq(-1).children().length; + $parent.append('' + options.addText + ""); + addButton = $parent.find("tr:last a"); + } else { + // Otherwise, insert it immediately after the last form: + $this.filter(":last").after('"); + addButton = $this.filter(":last").next().find("a"); + } + } + addButton.on('click', addInlineClickHandler); + }; + + const addInlineClickHandler = function(e) { + e.preventDefault(); + const template = $("#" + options.prefix + "-empty"); + const row = template.clone(true); + row.removeClass(options.emptyCssClass) + .addClass(options.formCssClass) + .attr("id", options.prefix + "-" + nextIndex); + addInlineDeleteButton(row); + row.find("*").each(function() { + updateElementIndex(this, options.prefix, totalForms.val()); + }); + // Insert the new form when it has been fully edited. + row.insertBefore($(template)); + // Update number of total forms. + $(totalForms).val(parseInt(totalForms.val(), 10) + 1); + nextIndex += 1; + // Hide the add button if there's a limit and it's been reached. + if ((maxForms.val() !== '') && (maxForms.val() - totalForms.val()) <= 0) { + addButton.parent().hide(); + } + // Show the remove buttons if there are more than min_num. + toggleDeleteButtonVisibility(row.closest('.inline-group')); + + // Pass the new form to the post-add callback, if provided. + if (options.added) { + options.added(row); + } + row.get(0).dispatchEvent(new CustomEvent("formset:added", { + bubbles: true, + detail: { + formsetName: options.prefix + } + })); + }; + + /** + * The "X" button that is part of every unsaved inline. + * (When saved, it is replaced with a "Delete" checkbox.) + */ + const addInlineDeleteButton = function(row) { + if (row.is("tr")) { + // If the forms are laid out in table rows, insert + // the remove button into the last table cell: + row.children(":last").append('"); + } else if (row.is("ul") || row.is("ol")) { + // If they're laid out as an ordered/unordered list, + // insert an
    • after the last list item: + row.append('
    • ' + options.deleteText + "
    • "); + } else { + // Otherwise, just insert the remove button as the + // last child element of the form's container: + row.children(":first").append('' + options.deleteText + ""); + } + // Add delete handler for each row. + row.find("a." + options.deleteCssClass).on('click', inlineDeleteHandler.bind(this)); + }; + + const inlineDeleteHandler = function(e1) { + e1.preventDefault(); + const deleteButton = $(e1.target); + const row = deleteButton.closest('.' + options.formCssClass); + const inlineGroup = row.closest('.inline-group'); + // Remove the parent form containing this button, + // and also remove the relevant row with non-field errors: + const prevRow = row.prev(); + if (prevRow.length && prevRow.hasClass('row-form-errors')) { + prevRow.remove(); + } + row.remove(); + nextIndex -= 1; + // Pass the deleted form to the post-delete callback, if provided. + if (options.removed) { + options.removed(row); + } + document.dispatchEvent(new CustomEvent("formset:removed", { + detail: { + formsetName: options.prefix + } + })); + // Update the TOTAL_FORMS form count. + const forms = $("." + options.formCssClass); + $("#id_" + options.prefix + "-TOTAL_FORMS").val(forms.length); + // Show add button again once below maximum number. + if ((maxForms.val() === '') || (maxForms.val() - forms.length) > 0) { + addButton.parent().show(); + } + // Hide the remove buttons if at min_num. + toggleDeleteButtonVisibility(inlineGroup); + // Also, update names and ids for all remaining form controls so + // they remain in sequence: + let i, formCount; + const updateElementCallback = function() { + updateElementIndex(this, options.prefix, i); + }; + for (i = 0, formCount = forms.length; i < formCount; i++) { + updateElementIndex($(forms).get(i), options.prefix, i); + $(forms.get(i)).find("*").each(updateElementCallback); + } + }; + + const toggleDeleteButtonVisibility = function(inlineGroup) { + if ((minForms.val() !== '') && (minForms.val() - totalForms.val()) >= 0) { + inlineGroup.find('.inline-deletelink').hide(); + } else { + inlineGroup.find('.inline-deletelink').show(); + } + }; + + $this.each(function(i) { + $(this).not("." + options.emptyCssClass).addClass(options.formCssClass); + }); + + // Create the delete buttons for all unsaved inlines: + $this.filter('.' + options.formCssClass + ':not(.has_original):not(.' + options.emptyCssClass + ')').each(function() { + addInlineDeleteButton($(this)); + }); + toggleDeleteButtonVisibility($this); + + // Create the add button, initially hidden. + addButton = options.addButton; + addInlineAddButton(); + + // Show the add button if allowed to add more items. + // Note that max_num = None translates to a blank string. + const showAddButton = maxForms.val() === '' || (maxForms.val() - totalForms.val()) > 0; + if ($this.length && showAddButton) { + addButton.parent().show(); + } else { + addButton.parent().hide(); + } + + return this; + }; + + /* Setup plugin defaults */ + $.fn.formset.defaults = { + prefix: "form", // The form prefix for your django formset + addText: "add another", // Text for the add link + deleteText: "remove", // Text for the delete link + addCssClass: "add-row", // CSS class applied to the add link + deleteCssClass: "delete-row", // CSS class applied to the delete link + emptyCssClass: "empty-row", // CSS class applied to the empty row + formCssClass: "dynamic-form", // CSS class applied to each form in a formset + added: null, // Function called each time a new form is added + removed: null, // Function called each time a form is deleted + addButton: null // Existing add button to use + }; + + + // Tabular inlines --------------------------------------------------------- + $.fn.tabularFormset = function(selector, options) { + const $rows = $(this); + + const reinitDateTimeShortCuts = function() { + // Reinitialize the calendar and clock widgets by force + if (typeof DateTimeShortcuts !== "undefined") { + $(".datetimeshortcuts").remove(); + DateTimeShortcuts.init(); + } + }; + + const updateSelectFilter = function() { + // If any SelectFilter widgets are a part of the new form, + // instantiate a new SelectFilter instance for it. + if (typeof SelectFilter !== 'undefined') { + $('.selectfilter').each(function(index, value) { + SelectFilter.init(value.id, this.dataset.fieldName, false); + }); + $('.selectfilterstacked').each(function(index, value) { + SelectFilter.init(value.id, this.dataset.fieldName, true); + }); + } + }; + + const initPrepopulatedFields = function(row) { + row.find('.prepopulated_field').each(function() { + const field = $(this), + input = field.find('input, select, textarea'), + dependency_list = input.data('dependency_list') || [], + dependencies = []; + $.each(dependency_list, function(i, field_name) { + dependencies.push('#' + row.find('.field-' + field_name).find('input, select, textarea').attr('id')); + }); + if (dependencies.length) { + input.prepopulate(dependencies, input.attr('maxlength')); + } + }); + }; + + $rows.formset({ + prefix: options.prefix, + addText: options.addText, + formCssClass: "dynamic-" + options.prefix, + deleteCssClass: "inline-deletelink", + deleteText: options.deleteText, + emptyCssClass: "empty-form", + added: function(row) { + initPrepopulatedFields(row); + reinitDateTimeShortCuts(); + updateSelectFilter(); + }, + addButton: options.addButton + }); + + return $rows; + }; + + // Stacked inlines --------------------------------------------------------- + $.fn.stackedFormset = function(selector, options) { + const $rows = $(this); + const updateInlineLabel = function(row) { + $(selector).find(".inline_label").each(function(i) { + const count = i + 1; + $(this).html($(this).html().replace(/(#\d+)/g, "#" + count)); + }); + }; + + const reinitDateTimeShortCuts = function() { + // Reinitialize the calendar and clock widgets by force, yuck. + if (typeof DateTimeShortcuts !== "undefined") { + $(".datetimeshortcuts").remove(); + DateTimeShortcuts.init(); + } + }; + + const updateSelectFilter = function() { + // If any SelectFilter widgets were added, instantiate a new instance. + if (typeof SelectFilter !== "undefined") { + $(".selectfilter").each(function(index, value) { + SelectFilter.init(value.id, this.dataset.fieldName, false); + }); + $(".selectfilterstacked").each(function(index, value) { + SelectFilter.init(value.id, this.dataset.fieldName, true); + }); + } + }; + + const initPrepopulatedFields = function(row) { + row.find('.prepopulated_field').each(function() { + const field = $(this), + input = field.find('input, select, textarea'), + dependency_list = input.data('dependency_list') || [], + dependencies = []; + $.each(dependency_list, function(i, field_name) { + // Dependency in a fieldset. + let field_element = row.find('.form-row .field-' + field_name); + // Dependency without a fieldset. + if (!field_element.length) { + field_element = row.find('.form-row.field-' + field_name); + } + dependencies.push('#' + field_element.find('input, select, textarea').attr('id')); + }); + if (dependencies.length) { + input.prepopulate(dependencies, input.attr('maxlength')); + } + }); + }; + + $rows.formset({ + prefix: options.prefix, + addText: options.addText, + formCssClass: "dynamic-" + options.prefix, + deleteCssClass: "inline-deletelink", + deleteText: options.deleteText, + emptyCssClass: "empty-form", + removed: updateInlineLabel, + added: function(row) { + initPrepopulatedFields(row); + reinitDateTimeShortCuts(); + updateSelectFilter(); + updateInlineLabel(row); + }, + addButton: options.addButton + }); + + return $rows; + }; + + $(document).ready(function() { + $(".js-inline-admin-formset").each(function() { + const data = $(this).data(), + inlineOptions = data.inlineFormset; + let selector; + switch(data.inlineType) { + case "stacked": + selector = inlineOptions.name + "-group .inline-related"; + $(selector).stackedFormset(selector, inlineOptions.options); + break; + case "tabular": + selector = inlineOptions.name + "-group .tabular.inline-related tbody:first > tr.form-row"; + $(selector).tabularFormset(selector, inlineOptions.options); + break; + } + }); + }); +} diff --git a/staticfiles/admin/js/jquery.init.js b/staticfiles/admin/js/jquery.init.js new file mode 100644 index 0000000..f40b27f --- /dev/null +++ b/staticfiles/admin/js/jquery.init.js @@ -0,0 +1,8 @@ +/*global jQuery:false*/ +'use strict'; +/* Puts the included jQuery into our own namespace using noConflict and passing + * it 'true'. This ensures that the included jQuery doesn't pollute the global + * namespace (i.e. this preserves pre-existing values for both window.$ and + * window.jQuery). + */ +window.django = {jQuery: jQuery.noConflict(true)}; diff --git a/staticfiles/admin/js/nav_sidebar.js b/staticfiles/admin/js/nav_sidebar.js new file mode 100644 index 0000000..7e735db --- /dev/null +++ b/staticfiles/admin/js/nav_sidebar.js @@ -0,0 +1,79 @@ +'use strict'; +{ + const toggleNavSidebar = document.getElementById('toggle-nav-sidebar'); + if (toggleNavSidebar !== null) { + const navSidebar = document.getElementById('nav-sidebar'); + const main = document.getElementById('main'); + let navSidebarIsOpen = localStorage.getItem('django.admin.navSidebarIsOpen'); + if (navSidebarIsOpen === null) { + navSidebarIsOpen = 'true'; + } + main.classList.toggle('shifted', navSidebarIsOpen === 'true'); + navSidebar.setAttribute('aria-expanded', navSidebarIsOpen); + + toggleNavSidebar.addEventListener('click', function() { + if (navSidebarIsOpen === 'true') { + navSidebarIsOpen = 'false'; + } else { + navSidebarIsOpen = 'true'; + } + localStorage.setItem('django.admin.navSidebarIsOpen', navSidebarIsOpen); + main.classList.toggle('shifted'); + navSidebar.setAttribute('aria-expanded', navSidebarIsOpen); + }); + } + + function initSidebarQuickFilter() { + const options = []; + const navSidebar = document.getElementById('nav-sidebar'); + if (!navSidebar) { + return; + } + navSidebar.querySelectorAll('th[scope=row] a').forEach((container) => { + options.push({title: container.innerHTML, node: container}); + }); + + function checkValue(event) { + let filterValue = event.target.value; + if (filterValue) { + filterValue = filterValue.toLowerCase(); + } + if (event.key === 'Escape') { + filterValue = ''; + event.target.value = ''; // clear input + } + let matches = false; + for (const o of options) { + let displayValue = ''; + if (filterValue) { + if (o.title.toLowerCase().indexOf(filterValue) === -1) { + displayValue = 'none'; + } else { + matches = true; + } + } + // show/hide parent + o.node.parentNode.parentNode.style.display = displayValue; + } + if (!filterValue || matches) { + event.target.classList.remove('no-results'); + } else { + event.target.classList.add('no-results'); + } + sessionStorage.setItem('django.admin.navSidebarFilterValue', filterValue); + } + + const nav = document.getElementById('nav-filter'); + nav.addEventListener('change', checkValue, false); + nav.addEventListener('input', checkValue, false); + nav.addEventListener('keyup', checkValue, false); + + const storedValue = sessionStorage.getItem('django.admin.navSidebarFilterValue'); + if (storedValue) { + nav.value = storedValue; + checkValue({target: nav, key: ''}); + } + } + window.initSidebarQuickFilter = initSidebarQuickFilter; + initSidebarQuickFilter(); +} diff --git a/staticfiles/admin/js/popup_response.js b/staticfiles/admin/js/popup_response.js new file mode 100644 index 0000000..fecf0f4 --- /dev/null +++ b/staticfiles/admin/js/popup_response.js @@ -0,0 +1,15 @@ +'use strict'; +{ + const initData = JSON.parse(document.getElementById('django-admin-popup-response-constants').dataset.popupResponse); + switch(initData.action) { + case 'change': + opener.dismissChangeRelatedObjectPopup(window, initData.value, initData.obj, initData.new_value); + break; + case 'delete': + opener.dismissDeleteRelatedObjectPopup(window, initData.value); + break; + default: + opener.dismissAddRelatedObjectPopup(window, initData.value, initData.obj); + break; + } +} diff --git a/staticfiles/admin/js/prepopulate.js b/staticfiles/admin/js/prepopulate.js new file mode 100644 index 0000000..89e95ab --- /dev/null +++ b/staticfiles/admin/js/prepopulate.js @@ -0,0 +1,43 @@ +/*global URLify*/ +'use strict'; +{ + const $ = django.jQuery; + $.fn.prepopulate = function(dependencies, maxLength, allowUnicode) { + /* + Depends on urlify.js + Populates a selected field with the values of the dependent fields, + URLifies and shortens the string. + dependencies - array of dependent fields ids + maxLength - maximum length of the URLify'd string + allowUnicode - Unicode support of the URLify'd string + */ + return this.each(function() { + const prepopulatedField = $(this); + + const populate = function() { + // Bail if the field's value has been changed by the user + if (prepopulatedField.data('_changed')) { + return; + } + + const values = []; + $.each(dependencies, function(i, field) { + field = $(field); + if (field.val().length > 0) { + values.push(field.val()); + } + }); + prepopulatedField.val(URLify(values.join(' '), maxLength, allowUnicode)); + }; + + prepopulatedField.data('_changed', false); + prepopulatedField.on('change', function() { + prepopulatedField.data('_changed', true); + }); + + if (!prepopulatedField.val()) { + $(dependencies.join(',')).on('keyup change focus', populate); + } + }); + }; +} diff --git a/staticfiles/admin/js/prepopulate_init.js b/staticfiles/admin/js/prepopulate_init.js new file mode 100644 index 0000000..a58841f --- /dev/null +++ b/staticfiles/admin/js/prepopulate_init.js @@ -0,0 +1,15 @@ +'use strict'; +{ + const $ = django.jQuery; + const fields = $('#django-admin-prepopulated-fields-constants').data('prepopulatedFields'); + $.each(fields, function(index, field) { + $( + '.empty-form .form-row .field-' + field.name + + ', .empty-form.form-row .field-' + field.name + + ', .empty-form .form-row.field-' + field.name + ).addClass('prepopulated_field'); + $(field.id).data('dependency_list', field.dependency_list).prepopulate( + field.dependency_ids, field.maxLength, field.allowUnicode + ); + }); +} diff --git a/staticfiles/admin/js/theme.js b/staticfiles/admin/js/theme.js new file mode 100644 index 0000000..e79d375 --- /dev/null +++ b/staticfiles/admin/js/theme.js @@ -0,0 +1,51 @@ +'use strict'; +{ + function setTheme(mode) { + if (mode !== "light" && mode !== "dark" && mode !== "auto") { + console.error(`Got invalid theme mode: ${mode}. Resetting to auto.`); + mode = "auto"; + } + document.documentElement.dataset.theme = mode; + localStorage.setItem("theme", mode); + } + + function cycleTheme() { + const currentTheme = localStorage.getItem("theme") || "auto"; + const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches; + + if (prefersDark) { + // Auto (dark) -> Light -> Dark + if (currentTheme === "auto") { + setTheme("light"); + } else if (currentTheme === "light") { + setTheme("dark"); + } else { + setTheme("auto"); + } + } else { + // Auto (light) -> Dark -> Light + if (currentTheme === "auto") { + setTheme("dark"); + } else if (currentTheme === "dark") { + setTheme("light"); + } else { + setTheme("auto"); + } + } + } + + function initTheme() { + // set theme defined in localStorage if there is one, or fallback to auto mode + const currentTheme = localStorage.getItem("theme"); + currentTheme ? setTheme(currentTheme) : setTheme("auto"); + } + + window.addEventListener('load', function(_) { + const buttons = document.getElementsByClassName("theme-toggle"); + Array.from(buttons).forEach((btn) => { + btn.addEventListener("click", cycleTheme); + }); + }); + + initTheme(); +} diff --git a/staticfiles/admin/js/unusable_password_field.js b/staticfiles/admin/js/unusable_password_field.js new file mode 100644 index 0000000..ec26238 --- /dev/null +++ b/staticfiles/admin/js/unusable_password_field.js @@ -0,0 +1,29 @@ +"use strict"; +// Fallback JS for browsers which do not support :has selector used in +// admin/css/unusable_password_fields.css +// Remove file once all supported browsers support :has selector +try { + // If browser does not support :has selector this will raise an error + document.querySelector("form:has(input)"); +} catch (error) { + console.log("Defaulting to javascript for usable password form management: " + error); + // JS replacement for unsupported :has selector + document.querySelectorAll('input[name="usable_password"]').forEach(option => { + option.addEventListener('change', function() { + const usablePassword = (this.value === "true" ? this.checked : !this.checked); + const submit1 = document.querySelector('input[type="submit"].set-password'); + const submit2 = document.querySelector('input[type="submit"].unset-password'); + const messages = document.querySelector('#id_unusable_warning'); + document.getElementById('id_password1').closest('.form-row').hidden = !usablePassword; + document.getElementById('id_password2').closest('.form-row').hidden = !usablePassword; + if (messages) { + messages.hidden = usablePassword; + } + if (submit1 && submit2) { + submit1.hidden = !usablePassword; + submit2.hidden = usablePassword; + } + }); + option.dispatchEvent(new Event('change')); + }); +} diff --git a/staticfiles/admin/js/urlify.js b/staticfiles/admin/js/urlify.js new file mode 100644 index 0000000..9fc0409 --- /dev/null +++ b/staticfiles/admin/js/urlify.js @@ -0,0 +1,169 @@ +/*global XRegExp*/ +'use strict'; +{ + const LATIN_MAP = { + 'À': 'A', 'Á': 'A', 'Â': 'A', 'Ã': 'A', 'Ä': 'A', 'Å': 'A', 'Æ': 'AE', + 'Ç': 'C', 'È': 'E', 'É': 'E', 'Ê': 'E', 'Ë': 'E', 'Ì': 'I', 'Í': 'I', + 'Î': 'I', 'Ï': 'I', 'Ð': 'D', 'Ñ': 'N', 'Ò': 'O', 'Ó': 'O', 'Ô': 'O', + 'Õ': 'O', 'Ö': 'O', 'Ő': 'O', 'Ø': 'O', 'Ù': 'U', 'Ú': 'U', 'Û': 'U', + 'Ü': 'U', 'Ű': 'U', 'Ý': 'Y', 'Þ': 'TH', 'Ÿ': 'Y', 'ß': 'ss', 'à': 'a', + 'á': 'a', 'â': 'a', 'ã': 'a', 'ä': 'a', 'å': 'a', 'æ': 'ae', 'ç': 'c', + 'è': 'e', 'é': 'e', 'ê': 'e', 'ë': 'e', 'ì': 'i', 'í': 'i', 'î': 'i', + 'ï': 'i', 'ð': 'd', 'ñ': 'n', 'ò': 'o', 'ó': 'o', 'ô': 'o', 'õ': 'o', + 'ö': 'o', 'ő': 'o', 'ø': 'o', 'ù': 'u', 'ú': 'u', 'û': 'u', 'ü': 'u', + 'ű': 'u', 'ý': 'y', 'þ': 'th', 'ÿ': 'y' + }; + const LATIN_SYMBOLS_MAP = { + '©': '(c)' + }; + const GREEK_MAP = { + 'α': 'a', 'β': 'b', 'γ': 'g', 'δ': 'd', 'ε': 'e', 'ζ': 'z', 'η': 'h', + 'θ': '8', 'ι': 'i', 'κ': 'k', 'λ': 'l', 'μ': 'm', 'ν': 'n', 'ξ': '3', + 'ο': 'o', 'π': 'p', 'ρ': 'r', 'σ': 's', 'τ': 't', 'υ': 'y', 'φ': 'f', + 'χ': 'x', 'ψ': 'ps', 'ω': 'w', 'ά': 'a', 'έ': 'e', 'ί': 'i', 'ό': 'o', + 'ύ': 'y', 'ή': 'h', 'ώ': 'w', 'ς': 's', 'ϊ': 'i', 'ΰ': 'y', 'ϋ': 'y', + 'ΐ': 'i', 'Α': 'A', 'Β': 'B', 'Γ': 'G', 'Δ': 'D', 'Ε': 'E', 'Ζ': 'Z', + 'Η': 'H', 'Θ': '8', 'Ι': 'I', 'Κ': 'K', 'Λ': 'L', 'Μ': 'M', 'Ν': 'N', + 'Ξ': '3', 'Ο': 'O', 'Π': 'P', 'Ρ': 'R', 'Σ': 'S', 'Τ': 'T', 'Υ': 'Y', + 'Φ': 'F', 'Χ': 'X', 'Ψ': 'PS', 'Ω': 'W', 'Ά': 'A', 'Έ': 'E', 'Ί': 'I', + 'Ό': 'O', 'Ύ': 'Y', 'Ή': 'H', 'Ώ': 'W', 'Ϊ': 'I', 'Ϋ': 'Y' + }; + const TURKISH_MAP = { + 'ş': 's', 'Ş': 'S', 'ı': 'i', 'İ': 'I', 'ç': 'c', 'Ç': 'C', 'ü': 'u', + 'Ü': 'U', 'ö': 'o', 'Ö': 'O', 'ğ': 'g', 'Ğ': 'G' + }; + const ROMANIAN_MAP = { + 'ă': 'a', 'î': 'i', 'ș': 's', 'ț': 't', 'â': 'a', + 'Ă': 'A', 'Î': 'I', 'Ș': 'S', 'Ț': 'T', 'Â': 'A' + }; + const RUSSIAN_MAP = { + 'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'yo', + 'ж': 'zh', 'з': 'z', 'и': 'i', 'й': 'j', 'к': 'k', 'л': 'l', 'м': 'm', + 'н': 'n', 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u', + 'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch', 'ш': 'sh', 'щ': 'sh', 'ъ': '', + 'ы': 'y', 'ь': '', 'э': 'e', 'ю': 'yu', 'я': 'ya', + 'А': 'A', 'Б': 'B', 'В': 'V', 'Г': 'G', 'Д': 'D', 'Е': 'E', 'Ё': 'Yo', + 'Ж': 'Zh', 'З': 'Z', 'И': 'I', 'Й': 'J', 'К': 'K', 'Л': 'L', 'М': 'M', + 'Н': 'N', 'О': 'O', 'П': 'P', 'Р': 'R', 'С': 'S', 'Т': 'T', 'У': 'U', + 'Ф': 'F', 'Х': 'H', 'Ц': 'C', 'Ч': 'Ch', 'Ш': 'Sh', 'Щ': 'Sh', 'Ъ': '', + 'Ы': 'Y', 'Ь': '', 'Э': 'E', 'Ю': 'Yu', 'Я': 'Ya' + }; + const UKRAINIAN_MAP = { + 'Є': 'Ye', 'І': 'I', 'Ї': 'Yi', 'Ґ': 'G', 'є': 'ye', 'і': 'i', + 'ї': 'yi', 'ґ': 'g' + }; + const CZECH_MAP = { + 'č': 'c', 'ď': 'd', 'ě': 'e', 'ň': 'n', 'ř': 'r', 'š': 's', 'ť': 't', + 'ů': 'u', 'ž': 'z', 'Č': 'C', 'Ď': 'D', 'Ě': 'E', 'Ň': 'N', 'Ř': 'R', + 'Š': 'S', 'Ť': 'T', 'Ů': 'U', 'Ž': 'Z' + }; + const SLOVAK_MAP = { + 'á': 'a', 'ä': 'a', 'č': 'c', 'ď': 'd', 'é': 'e', 'í': 'i', 'ľ': 'l', + 'ĺ': 'l', 'ň': 'n', 'ó': 'o', 'ô': 'o', 'ŕ': 'r', 'š': 's', 'ť': 't', + 'ú': 'u', 'ý': 'y', 'ž': 'z', + 'Á': 'a', 'Ä': 'A', 'Č': 'C', 'Ď': 'D', 'É': 'E', 'Í': 'I', 'Ľ': 'L', + 'Ĺ': 'L', 'Ň': 'N', 'Ó': 'O', 'Ô': 'O', 'Ŕ': 'R', 'Š': 'S', 'Ť': 'T', + 'Ú': 'U', 'Ý': 'Y', 'Ž': 'Z' + }; + const POLISH_MAP = { + 'ą': 'a', 'ć': 'c', 'ę': 'e', 'ł': 'l', 'ń': 'n', 'ó': 'o', 'ś': 's', + 'ź': 'z', 'ż': 'z', + 'Ą': 'A', 'Ć': 'C', 'Ę': 'E', 'Ł': 'L', 'Ń': 'N', 'Ó': 'O', 'Ś': 'S', + 'Ź': 'Z', 'Ż': 'Z' + }; + const LATVIAN_MAP = { + 'ā': 'a', 'č': 'c', 'ē': 'e', 'ģ': 'g', 'ī': 'i', 'ķ': 'k', 'ļ': 'l', + 'ņ': 'n', 'š': 's', 'ū': 'u', 'ž': 'z', + 'Ā': 'A', 'Č': 'C', 'Ē': 'E', 'Ģ': 'G', 'Ī': 'I', 'Ķ': 'K', 'Ļ': 'L', + 'Ņ': 'N', 'Š': 'S', 'Ū': 'U', 'Ž': 'Z' + }; + const ARABIC_MAP = { + 'أ': 'a', 'ب': 'b', 'ت': 't', 'ث': 'th', 'ج': 'g', 'ح': 'h', 'خ': 'kh', 'د': 'd', + 'ذ': 'th', 'ر': 'r', 'ز': 'z', 'س': 's', 'ش': 'sh', 'ص': 's', 'ض': 'd', 'ط': 't', + 'ظ': 'th', 'ع': 'aa', 'غ': 'gh', 'ف': 'f', 'ق': 'k', 'ك': 'k', 'ل': 'l', 'م': 'm', + 'ن': 'n', 'ه': 'h', 'و': 'o', 'ي': 'y' + }; + const LITHUANIAN_MAP = { + 'ą': 'a', 'č': 'c', 'ę': 'e', 'ė': 'e', 'į': 'i', 'š': 's', 'ų': 'u', + 'ū': 'u', 'ž': 'z', + 'Ą': 'A', 'Č': 'C', 'Ę': 'E', 'Ė': 'E', 'Į': 'I', 'Š': 'S', 'Ų': 'U', + 'Ū': 'U', 'Ž': 'Z' + }; + const SERBIAN_MAP = { + 'ђ': 'dj', 'ј': 'j', 'љ': 'lj', 'њ': 'nj', 'ћ': 'c', 'џ': 'dz', + 'đ': 'dj', 'Ђ': 'Dj', 'Ј': 'j', 'Љ': 'Lj', 'Њ': 'Nj', 'Ћ': 'C', + 'Џ': 'Dz', 'Đ': 'Dj' + }; + const AZERBAIJANI_MAP = { + 'ç': 'c', 'ə': 'e', 'ğ': 'g', 'ı': 'i', 'ö': 'o', 'ş': 's', 'ü': 'u', + 'Ç': 'C', 'Ə': 'E', 'Ğ': 'G', 'İ': 'I', 'Ö': 'O', 'Ş': 'S', 'Ü': 'U' + }; + const GEORGIAN_MAP = { + 'ა': 'a', 'ბ': 'b', 'გ': 'g', 'დ': 'd', 'ე': 'e', 'ვ': 'v', 'ზ': 'z', + 'თ': 't', 'ი': 'i', 'კ': 'k', 'ლ': 'l', 'მ': 'm', 'ნ': 'n', 'ო': 'o', + 'პ': 'p', 'ჟ': 'j', 'რ': 'r', 'ს': 's', 'ტ': 't', 'უ': 'u', 'ფ': 'f', + 'ქ': 'q', 'ღ': 'g', 'ყ': 'y', 'შ': 'sh', 'ჩ': 'ch', 'ც': 'c', 'ძ': 'dz', + 'წ': 'w', 'ჭ': 'ch', 'ხ': 'x', 'ჯ': 'j', 'ჰ': 'h' + }; + + const ALL_DOWNCODE_MAPS = [ + LATIN_MAP, + LATIN_SYMBOLS_MAP, + GREEK_MAP, + TURKISH_MAP, + ROMANIAN_MAP, + RUSSIAN_MAP, + UKRAINIAN_MAP, + CZECH_MAP, + SLOVAK_MAP, + POLISH_MAP, + LATVIAN_MAP, + ARABIC_MAP, + LITHUANIAN_MAP, + SERBIAN_MAP, + AZERBAIJANI_MAP, + GEORGIAN_MAP + ]; + + const Downcoder = { + 'Initialize': function() { + if (Downcoder.map) { // already made + return; + } + Downcoder.map = {}; + for (const lookup of ALL_DOWNCODE_MAPS) { + Object.assign(Downcoder.map, lookup); + } + Downcoder.regex = new RegExp(Object.keys(Downcoder.map).join('|'), 'g'); + } + }; + + function downcode(slug) { + Downcoder.Initialize(); + return slug.replace(Downcoder.regex, function(m) { + return Downcoder.map[m]; + }); + } + + + function URLify(s, num_chars, allowUnicode) { + // changes, e.g., "Petty theft" to "petty-theft" + if (!allowUnicode) { + s = downcode(s); + } + s = s.toLowerCase(); // convert to lowercase + // if downcode doesn't hit, the char will be stripped here + if (allowUnicode) { + // Keep Unicode letters including both lowercase and uppercase + // characters, whitespace, and dash; remove other characters. + s = XRegExp.replace(s, XRegExp('[^-_\\p{L}\\p{N}\\s]', 'g'), ''); + } else { + s = s.replace(/[^-\w\s]/g, ''); // remove unneeded chars + } + s = s.replace(/^\s+|\s+$/g, ''); // trim leading/trailing spaces + s = s.replace(/[-\s]+/g, '-'); // convert spaces to hyphens + s = s.substring(0, num_chars); // trim to first num_chars chars + return s.replace(/-+$/g, ''); // trim any trailing hyphens + } + window.URLify = URLify; +} diff --git a/staticfiles/admin/js/vendor/jquery/LICENSE.txt b/staticfiles/admin/js/vendor/jquery/LICENSE.txt new file mode 100644 index 0000000..f642c3f --- /dev/null +++ b/staticfiles/admin/js/vendor/jquery/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright OpenJS Foundation and other contributors, https://openjsf.org/ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/staticfiles/admin/js/vendor/jquery/jquery.js b/staticfiles/admin/js/vendor/jquery/jquery.js new file mode 100644 index 0000000..1a86433 --- /dev/null +++ b/staticfiles/admin/js/vendor/jquery/jquery.js @@ -0,0 +1,10716 @@ +/*! + * jQuery JavaScript Library v3.7.1 + * https://jquery.com/ + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2023-08-28T13:37Z + */ +( function( global, factory ) { + + "use strict"; + + if ( typeof module === "object" && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket trac-14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var flat = arr.flat ? function( array ) { + return arr.flat.call( array ); +} : function( array ) { + return arr.concat.apply( [], array ); +}; + + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + +var isFunction = function isFunction( obj ) { + + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 + // Plus for old WebKit, typeof returns "function" for HTML collections + // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) + return typeof obj === "function" && typeof obj.nodeType !== "number" && + typeof obj.item !== "function"; + }; + + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + +var document = window.document; + + + + var preservedScriptAttributes = { + type: true, + src: true, + nonce: true, + noModule: true + }; + + function DOMEval( code, node, doc ) { + doc = doc || document; + + var i, val, + script = doc.createElement( "script" ); + + script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + + // Support: Firefox 64+, Edge 18+ + // Some browsers don't support the "nonce" property on scripts. + // On the other hand, just using `getAttribute` is not enough as + // the `nonce` attribute is reset to an empty string whenever it + // becomes browsing-context connected. + // See https://github.com/whatwg/html/issues/2369 + // See https://html.spec.whatwg.org/#nonce-attributes + // The `node.getAttribute` check was added for the sake of + // `jQuery.globalEval` so that it can fake a nonce-containing node + // via an object. + val = node[ i ] || node.getAttribute && node.getAttribute( i ); + if ( val ) { + script.setAttribute( i, val ); + } + } + } + doc.head.appendChild( script ).parentNode.removeChild( script ); + } + + +function toType( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; +} +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var version = "3.7.1", + + rhtmlSuffix = /HTML$/i, + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + even: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return ( i + 1 ) % 2; + } ) ); + }, + + odd: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return i % 2; + } ) ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + copy = options[ name ]; + + // Prevent Object.prototype pollution + // Prevent never-ending loop + if ( name === "__proto__" || target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + src = target[ name ]; + + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; + } else { + clone = src; + } + copyIsArray = false; + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + // Evaluates a script in a provided context; falls back to the global one + // if not specified. + globalEval: function( code, options, doc ) { + DOMEval( code, { nonce: options && options.nonce }, doc ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + + // Retrieve the text value of an array of DOM nodes + text: function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + + // If no nodeType, this is expected to be an array + while ( ( node = elem[ i++ ] ) ) { + + // Do not traverse comment nodes + ret += jQuery.text( node ); + } + } + if ( nodeType === 1 || nodeType === 11 ) { + return elem.textContent; + } + if ( nodeType === 9 ) { + return elem.documentElement.textContent; + } + if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + isXMLDoc: function( elem ) { + var namespace = elem && elem.namespaceURI, + docElem = elem && ( elem.ownerDocument || elem ).documentElement; + + // Assume HTML when documentElement doesn't yet exist, such as inside + // document fragments. + return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return flat( ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), + function( _i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); + } ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = toType( obj ); + + if ( isFunction( obj ) || isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +} +var pop = arr.pop; + + +var sort = arr.sort; + + +var splice = arr.splice; + + +var whitespace = "[\\x20\\t\\r\\n\\f]"; + + +var rtrimCSS = new RegExp( + "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", + "g" +); + + + + +// Note: an element does not contain itself +jQuery.contains = function( a, b ) { + var bup = b && b.parentNode; + + return a === bup || !!( bup && bup.nodeType === 1 && ( + + // Support: IE 9 - 11+ + // IE doesn't have `contains` on SVG. + a.contains ? + a.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); +}; + + + + +// CSS string/identifier serialization +// https://drafts.csswg.org/cssom/#common-serializing-idioms +var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; + +function fcssescape( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; +} + +jQuery.escapeSelector = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + + + + +var preferredDoc = document, + pushNative = push; + +( function() { + +var i, + Expr, + outermostContext, + sortInput, + hasDuplicate, + push = pushNative, + + // Local document vars + document, + documentElement, + documentIsHTML, + rbuggyQSA, + matches, + + // Instance-specific data + expando = jQuery.expando, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + nonnativeSelectorCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" + + "loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram + identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", + + // Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + + whitespace + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + + whitespace + "*" ), + rdescend = new RegExp( whitespace + "|>" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + ID: new RegExp( "^#(" + identifier + ")" ), + CLASS: new RegExp( "^\\.(" + identifier + ")" ), + TAG: new RegExp( "^(" + identifier + "|[*])" ), + ATTR: new RegExp( "^" + attributes ), + PSEUDO: new RegExp( "^" + pseudos ), + CHILD: new RegExp( + "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + bool: new RegExp( "^(?:" + booleans + ")$", "i" ), + + // For use in libraries implementing .is() + // We use this for POS matching in `select` + needsContext: new RegExp( "^" + whitespace + + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // https://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\([^\\r\\n\\f])", "g" ), + funescape = function( escape, nonHex ) { + var high = "0x" + escape.slice( 1 ) - 0x10000; + + if ( nonHex ) { + + // Strip the backslash prefix from a non-hex escape sequence + return nonHex; + } + + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair + return high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes; see `setDocument`. + // Support: IE 9 - 11+, Edge 12 - 18+ + // Removing the function wrapper causes a "Permission Denied" + // error in IE/Edge. + unloadHandler = function() { + setDocument(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && nodeName( elem, "fieldset" ); + }, + { dir: "parentNode", next: "legend" } + ); + +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + ( arr = slice.call( preferredDoc.childNodes ) ), + preferredDoc.childNodes + ); + + // Support: Android <=4.0 + // Detect silently failing push.apply + // eslint-disable-next-line no-unused-expressions + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { + apply: function( target, els ) { + pushNative.apply( target, slice.call( els ) ); + }, + call: function( target ) { + pushNative.apply( target, slice.call( arguments, 1 ) ); + } + }; +} + +function find( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + setDocument( context ); + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { + + // ID selector + if ( ( m = match[ 1 ] ) ) { + + // Document context + if ( nodeType === 9 ) { + if ( ( elem = context.getElementById( m ) ) ) { + + // Support: IE 9 only + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + push.call( results, elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE 9 only + // getElementById can match elements by name instead of ID + if ( newContext && ( elem = newContext.getElementById( m ) ) && + find.contains( context, elem ) && + elem.id === m ) { + + push.call( results, elem ); + return results; + } + } + + // Type selector + } else if ( match[ 2 ] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) { + + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // The technique has to be used as well when a leading combinator is used + // as such selectors are not recognized by querySelectorAll. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && + ( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) { + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + + // We can use :scope instead of the ID hack if the browser + // supports it & if we're not changing the context. + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when + // strict-comparing two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( newContext != context || !support.scope ) { + + // Capture the context ID, setting it first if necessary + if ( ( nid = context.getAttribute( "id" ) ) ) { + nid = jQuery.escapeSelector( nid ); + } else { + context.setAttribute( "id", ( nid = expando ) ); + } + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + + toSelector( groups[ i ] ); + } + newSelector = groups.join( "," ); + } + + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + + // All others + return select( selector.replace( rtrimCSS, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + + // Use (key + " ") to avoid collision with native prototype properties + // (see https://github.com/jquery/sizzle/issues/157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return ( cache[ key + " " ] = value ); + } + return cache; +} + +/** + * Mark a function for special use by jQuery selector module + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement( "fieldset" ); + + try { + return !!fn( el ); + } catch ( e ) { + return false; + } finally { + + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + + // release memory in IE + el = null; + } +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + return nodeName( elem, "input" ) && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + return ( nodeName( elem, "input" ) || nodeName( elem, "button" ) ) && + elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11+ + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + elem.isDisabled !== !disabled && + inDisabledFieldset( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction( function( argument ) { + argument = +argument; + return markFunction( function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ ( j = matchIndexes[ i ] ) ] ) { + seed[ j ] = !( matches[ j ] = seed[ j ] ); + } + } + } ); + } ); +} + +/** + * Checks a node for validity as a jQuery selector context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [node] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +function setDocument( node ) { + var subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + documentElement = document.documentElement; + documentIsHTML = !jQuery.isXMLDoc( document ); + + // Support: iOS 7 only, IE 9 - 11+ + // Older browsers didn't support unprefixed `matches`. + matches = documentElement.matches || + documentElement.webkitMatchesSelector || + documentElement.msMatchesSelector; + + // Support: IE 9 - 11+, Edge 12 - 18+ + // Accessing iframe documents after unload throws "permission denied" errors + // (see trac-13936). + // Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`, + // all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well. + if ( documentElement.msMatchesSelector && + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + + // Support: IE 9 - 11+, Edge 12 - 18+ + subWindow.addEventListener( "unload", unloadHandler ); + } + + // Support: IE <10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert( function( el ) { + documentElement.appendChild( el ).id = jQuery.expando; + return !document.getElementsByName || + !document.getElementsByName( jQuery.expando ).length; + } ); + + // Support: IE 9 only + // Check to see if it's possible to do matchesSelector + // on a disconnected node. + support.disconnectedMatch = assert( function( el ) { + return matches.call( el, "*" ); + } ); + + // Support: IE 9 - 11+, Edge 12 - 18+ + // IE/Edge don't support the :scope pseudo-class. + support.scope = assert( function() { + return document.querySelectorAll( ":scope" ); + } ); + + // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only + // Make sure the `:has()` argument is parsed unforgivingly. + // We include `*` in the test to detect buggy implementations that are + // _selectively_ forgiving (specifically when the list includes at least + // one valid selector). + // Note that we treat complete lack of support for `:has()` as if it were + // spec-compliant support, which is fine because use of `:has()` in such + // environments will fail in the qSA path and fall back to jQuery traversal + // anyway. + support.cssHas = assert( function() { + try { + document.querySelector( ":has(*,:jqfake)" ); + return false; + } catch ( e ) { + return true; + } + } ); + + // ID filter and find + if ( support.getById ) { + Expr.filter.ID = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute( "id" ) === attrId; + }; + }; + Expr.find.ID = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter.ID = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode( "id" ); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find.ID = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( ( elem = elems[ i++ ] ) ) { + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find.TAG = function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else { + return context.querySelectorAll( tag ); + } + }; + + // Class + Expr.find.CLASS = function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + rbuggyQSA = []; + + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { + + var input; + + documentElement.appendChild( el ).innerHTML = + "" + + ""; + + // Support: iOS <=7 - 8 only + // Boolean attributes and "value" are not treated correctly in some XML documents + if ( !el.querySelectorAll( "[selected]" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: iOS <=7 - 8 only + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } + + // Support: iOS 8 only + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push( ".#.+[+~]" ); + } + + // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ + // In some of the document kinds, these selectors wouldn't work natively. + // This is probably OK but for backwards compatibility we want to maintain + // handling them through jQuery traversal in jQuery 3.x. + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE 9 - 11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ + // In some of the document kinds, these selectors wouldn't work natively. + // This is probably OK but for backwards compatibility we want to maintain + // handling them through jQuery traversal in jQuery 3.x. + documentElement.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE 11+, Edge 15 - 18+ + // IE 11/Edge don't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + // Interestingly, IE 10 & older don't seem to have the issue. + input = document.createElement( "input" ); + input.setAttribute( "name", "" ); + el.appendChild( input ); + if ( !el.querySelectorAll( "[name='']" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + + whitespace + "*(?:''|\"\")" ); + } + } ); + + if ( !support.cssHas ) { + + // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+ + // Our regular `try-catch` mechanism fails to detect natively-unsupported + // pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`) + // in browsers that parse the `:has()` argument as a forgiving selector list. + // https://drafts.csswg.org/selectors/#relational now requires the argument + // to be parsed unforgivingly, but browsers have not yet fully adjusted. + rbuggyQSA.push( ":has" ); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { + + // Choose the first element that is related to our preferred document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( a === document || a.ownerDocument == preferredDoc && + find.contains( preferredDoc, a ) ) { + return -1; + } + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( b === document || b.ownerDocument == preferredDoc && + find.contains( preferredDoc, b ) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + }; + + return document; +} + +find.matches = function( expr, elements ) { + return find( expr, null, null, elements ); +}; + +find.matchesSelector = function( elem, expr ) { + setDocument( elem ); + + if ( documentIsHTML && + !nonnativeSelectorCache[ expr + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch ( e ) { + nonnativeSelectorCache( expr, true ); + } + } + + return find( expr, document, null, [ elem ] ).length > 0; +}; + +find.contains = function( context, elem ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( context.ownerDocument || context ) != document ) { + setDocument( context ); + } + return jQuery.contains( context, elem ); +}; + + +find.attr = function( elem, name ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( elem.ownerDocument || elem ) != document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + + // Don't get fooled by Object.prototype properties (see trac-13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + if ( val !== undefined ) { + return val; + } + + return elem.getAttribute( name ); +}; + +find.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +jQuery.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + // + // Support: Android <=4.0+ + // Testing for detecting duplicates is unpredictable so instead assume we can't + // depend on duplicate detection in all browsers without a stable sort. + hasDuplicate = !support.sortStable; + sortInput = !support.sortStable && slice.call( results, 0 ); + sort.call( results, sortOrder ); + + if ( hasDuplicate ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + splice.call( results, duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +jQuery.fn.uniqueSort = function() { + return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) ); +}; + +Expr = jQuery.expr = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + ATTR: function( match ) { + match[ 1 ] = match[ 1 ].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" ) + .replace( runescape, funescape ); + + if ( match[ 2 ] === "~=" ) { + match[ 3 ] = " " + match[ 3 ] + " "; + } + + return match.slice( 0, 4 ); + }, + + CHILD: function( match ) { + + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[ 1 ] = match[ 1 ].toLowerCase(); + + if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { + + // nth-* requires argument + if ( !match[ 3 ] ) { + find.error( match[ 0 ] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[ 4 ] = +( match[ 4 ] ? + match[ 5 ] + ( match[ 6 ] || 1 ) : + 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) + ); + match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); + + // other types prohibit arguments + } else if ( match[ 3 ] ) { + find.error( match[ 0 ] ); + } + + return match; + }, + + PSEUDO: function( match ) { + var excess, + unquoted = !match[ 6 ] && match[ 2 ]; + + if ( matchExpr.CHILD.test( match[ 0 ] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[ 3 ] ) { + match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + + // Get excess from tokenize (recursively) + ( excess = tokenize( unquoted, true ) ) && + + // advance to the next closing parenthesis + ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { + + // excess is a negative index + match[ 0 ] = match[ 0 ].slice( 0, excess ); + match[ 2 ] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + TAG: function( nodeNameSelector ) { + var expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { + return true; + } : + function( elem ) { + return nodeName( elem, expectedNodeName ); + }; + }, + + CLASS: function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + ( pattern = new RegExp( "(^|" + whitespace + ")" + className + + "(" + whitespace + "|$)" ) ) && + classCache( className, function( elem ) { + return pattern.test( + typeof elem.className === "string" && elem.className || + typeof elem.getAttribute !== "undefined" && + elem.getAttribute( "class" ) || + "" + ); + } ); + }, + + ATTR: function( name, operator, check ) { + return function( elem ) { + var result = find.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + if ( operator === "=" ) { + return result === check; + } + if ( operator === "!=" ) { + return result !== check; + } + if ( operator === "^=" ) { + return check && result.indexOf( check ) === 0; + } + if ( operator === "*=" ) { + return check && result.indexOf( check ) > -1; + } + if ( operator === "$=" ) { + return check && result.slice( -check.length ) === check; + } + if ( operator === "~=" ) { + return ( " " + result.replace( rwhitespace, " " ) + " " ) + .indexOf( check ) > -1; + } + if ( operator === "|=" ) { + return result === check || result.slice( 0, check.length + 1 ) === check + "-"; + } + + return false; + }; + }, + + CHILD: function( type, what, _argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, _context, xml ) { + var cache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( ( node = node[ dir ] ) ) { + if ( ofType ? + nodeName( node, name ) : + node.nodeType === 1 ) { + + return false; + } + } + + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + outerCache = parent[ expando ] || ( parent[ expando ] = {} ); + cache = outerCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( ( node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + + // Use previously-cached element index if available + if ( useCache ) { + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + cache = outerCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + + // Use the same loop as above to seek `elem` from the start + while ( ( node = ++nodeIndex && node && node[ dir ] || + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + if ( ( ofType ? + nodeName( node, name ) : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || + ( node[ expando ] = {} ); + outerCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + PSEUDO: function( pseudo, argument ) { + + // pseudo-class names are case-insensitive + // https://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + find.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as jQuery does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction( function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf.call( seed, matched[ i ] ); + seed[ idx ] = !( matches[ idx ] = matched[ i ] ); + } + } ) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + + // Potentially complex pseudos + not: markFunction( function( selector ) { + + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrimCSS, "$1" ) ); + + return matcher[ expando ] ? + markFunction( function( seed, matches, _context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( ( elem = unmatched[ i ] ) ) { + seed[ i ] = !( matches[ i ] = elem ); + } + } + } ) : + function( elem, _context, xml ) { + input[ 0 ] = elem; + matcher( input, null, xml, results ); + + // Don't keep the element + // (see https://github.com/jquery/sizzle/issues/299) + input[ 0 ] = null; + return !results.pop(); + }; + } ), + + has: markFunction( function( selector ) { + return function( elem ) { + return find( selector, elem ).length > 0; + }; + } ), + + contains: markFunction( function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1; + }; + } ), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // https://www.w3.org/TR/selectors/#lang-pseudo + lang: markFunction( function( lang ) { + + // lang value must be a valid identifier + if ( !ridentifier.test( lang || "" ) ) { + find.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( ( elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); + return false; + }; + } ), + + // Miscellaneous + target: function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + root: function( elem ) { + return elem === documentElement; + }, + + focus: function( elem ) { + return elem === safeActiveElement() && + document.hasFocus() && + !!( elem.type || elem.href || ~elem.tabIndex ); + }, + + // Boolean properties + enabled: createDisabledPseudo( false ), + disabled: createDisabledPseudo( true ), + + checked: function( elem ) { + + // In CSS3, :checked should return both checked and selected elements + // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + return ( nodeName( elem, "input" ) && !!elem.checked ) || + ( nodeName( elem, "option" ) && !!elem.selected ); + }, + + selected: function( elem ) { + + // Support: IE <=11+ + // Accessing the selectedIndex property + // forces the browser to treat the default option as + // selected when in an optgroup. + if ( elem.parentNode ) { + // eslint-disable-next-line no-unused-expressions + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + empty: function( elem ) { + + // https://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + parent: function( elem ) { + return !Expr.pseudos.empty( elem ); + }, + + // Element/input types + header: function( elem ) { + return rheader.test( elem.nodeName ); + }, + + input: function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + button: function( elem ) { + return nodeName( elem, "input" ) && elem.type === "button" || + nodeName( elem, "button" ); + }, + + text: function( elem ) { + var attr; + return nodeName( elem, "input" ) && elem.type === "text" && + + // Support: IE <10 only + // New HTML5 attribute values (e.g., "search") appear + // with elem.type === "text" + ( ( attr = elem.getAttribute( "type" ) ) == null || + attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + first: createPositionalPseudo( function() { + return [ 0 ]; + } ), + + last: createPositionalPseudo( function( _matchIndexes, length ) { + return [ length - 1 ]; + } ), + + eq: createPositionalPseudo( function( _matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + } ), + + even: createPositionalPseudo( function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + odd: createPositionalPseudo( function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + lt: createPositionalPseudo( function( matchIndexes, length, argument ) { + var i; + + if ( argument < 0 ) { + i = argument + length; + } else if ( argument > length ) { + i = length; + } else { + i = argument; + } + + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + gt: createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ) + } +}; + +Expr.pseudos.nth = Expr.pseudos.eq; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +function tokenize( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || ( match = rcomma.exec( soFar ) ) ) { + if ( match ) { + + // Don't consume trailing commas as valid + soFar = soFar.slice( match[ 0 ].length ) || soFar; + } + groups.push( ( tokens = [] ) ); + } + + matched = false; + + // Combinators + if ( ( match = rleadingCombinator.exec( soFar ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + + // Cast descendant combinators to space + type: match[ 0 ].replace( rtrimCSS, " " ) + } ); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || + ( match = preFilters[ type ]( match ) ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + type: type, + matches: match + } ); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + if ( parseOnly ) { + return soFar.length; + } + + return soFar ? + find.error( selector ) : + + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +} + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[ i ].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + + if ( skip && nodeName( elem, skip ) ) { + elem = elem[ dir ] || elem; + } else if ( ( oldCache = outerCache[ key ] ) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return ( newCache[ 2 ] = oldCache[ 2 ] ); + } else { + + // Reuse newcache so results back-propagate to previous elements + outerCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[ i ]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[ 0 ]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + find( selector, contexts[ i ], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( ( elem = unmatched[ i ] ) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction( function( seed, results, context, xml ) { + var temp, i, elem, matcherOut, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || + multipleContexts( selector || "*", + context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems; + + if ( matcher ) { + + // If we have a postFinder, or filtered seed, or non-seed postFilter + // or preexisting results, + matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results; + + // Find primary matches + matcher( matcherIn, matcherOut, context, xml ); + } else { + matcherOut = matcherIn; + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( ( elem = temp[ i ] ) ) { + matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) ) { + + // Restore matcherIn since elem is not yet a final match + temp.push( ( matcherIn[ i ] = elem ) ); + } + } + postFinder( null, ( matcherOut = [] ), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) && + ( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) { + + seed[ temp ] = !( results[ temp ] = elem ); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + } ); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[ 0 ].type ], + implicitRelative = leadingRelative || Expr.relative[ " " ], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf.call( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || ( + ( checkContext = context ).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + + // Avoid hanging onto element + // (see https://github.com/jquery/sizzle/issues/299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { + matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; + } else { + matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[ j ].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ) + .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) + ).replace( rtrimCSS, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find.TAG( "*", outermost ), + + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), + len = elems.length; + + if ( outermost ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + outermostContext = context == document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: iOS <=7 - 9 only + // Tolerate NodeList properties (IE: "length"; Safari: ) matching + // elements by id. (see trac-14142) + for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( !context && elem.ownerDocument != document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( ( matcher = elementMatchers[ j++ ] ) ) { + if ( matcher( elem, context || document, xml ) ) { + push.call( results, elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + + // They will have gone through all possible matchers + if ( ( elem = !matcher && elem ) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( ( matcher = setMatchers[ j++ ] ) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !( unmatched[ i ] || setMatched[ i ] ) ) { + setMatched[ i ] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + jQuery.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +function compile( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[ i ] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, + matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +} + +/** + * A low-level selection function that works with jQuery's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with jQuery selector compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +function select( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( ( selector = compiled.selector || selector ) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[ 0 ] = match[ 0 ].slice( 0 ); + if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { + + context = ( Expr.find.ID( + token.matches[ 0 ].replace( runescape, funescape ), + context + ) || [] )[ 0 ]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr.needsContext.test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[ i ]; + + // Abort if we hit a combinator + if ( Expr.relative[ ( type = token.type ) ] ) { + break; + } + if ( ( find = Expr.find[ type ] ) ) { + + // Search, expanding context for leading sibling combinators + if ( ( seed = find( + token.matches[ 0 ].replace( runescape, funescape ), + rsibling.test( tokens[ 0 ].type ) && + testContext( context.parentNode ) || context + ) ) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +} + +// One-time assignments + +// Support: Android <=4.0 - 4.1+ +// Sort stability +support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; + +// Initialize against the default document +setDocument(); + +// Support: Android <=4.0 - 4.1+ +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert( function( el ) { + + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; +} ); + +jQuery.find = find; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.unique = jQuery.uniqueSort; + +// These have always been private, but they used to be documented as part of +// Sizzle so let's maintain them for now for backwards compatibility purposes. +find.compile = compile; +find.select = select; +find.setDocument = setDocument; +find.tokenize = tokenize; + +find.escape = jQuery.escapeSelector; +find.getText = jQuery.text; +find.isXML = jQuery.isXMLDoc; +find.selectors = jQuery.expr; +find.support = jQuery.support; +find.uniqueSort = jQuery.uniqueSort; + + /* eslint-enable */ + +} )(); + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (trac-9521) + // Strict HTML recognition (trac-11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to jQuery#find + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, _i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, _i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, _i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( elem.contentDocument != null && + + // Support: IE 11+ + // elements with no `data` attribute has an object + // `contentDocument` with a `null` prototype. + getProto( elem.contentDocument ) ) { + + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && toType( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( _i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.error ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the error, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getErrorHook ) { + process.error = jQuery.Deferred.getErrorHook(); + + // The deprecated alias of the above. While the name suggests + // returning the stack, not an error instance, jQuery just passes + // it directly to `console.warn` so both will work; an instance + // just better cooperates with source maps. + } else if ( jQuery.Deferred.getStackHook ) { + process.error = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the primary Deferred + primary = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + primary.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( primary.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return primary.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); + } + + return primary.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error +// captured before the async barrier to get the original error cause +// which may otherwise be hidden. +jQuery.Deferred.exceptionHook = function( error, asyncError ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, + error.stack, asyncError ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See trac-6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( toType( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, _key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; + + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( _all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (trac-9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see trac-8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( camelCase ); + } else { + key = camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (trac-14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var documentElement = document.documentElement; + + + + var isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ); + }, + composed = { composed: true }; + + // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only + // Check attachment across shadow DOM boundaries when possible (gh-3504) + // Support: iOS 10.0-10.2 only + // Early iOS 10 versions support `attachShadow` but not `getRootNode`, + // leading to errors. We need to check for `getRootNode`. + if ( documentElement.getRootNode ) { + isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ) || + elem.getRootNode( composed ) === elem.ownerDocument; + }; + } +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + isAttached( elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, scale, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = elem.nodeType && + ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + while ( maxIterations-- ) { + + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; + + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); + +var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); + + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (trac-11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (trac-14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // Support: IE <=9 only + // IE <=9 replaces "; + support.option = !!div.lastChild; +} )(); + + +// We have to close these tags to support XHTML (trac-13200) +var wrapMap = { + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
      " ], + col: [ 2, "", "
      " ], + tr: [ 2, "", "
      " ], + td: [ 3, "", "
      " ], + + _default: [ 0, "", "" ] +}; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// Support: IE <=9 only +if ( !support.option ) { + wrapMap.optgroup = wrapMap.option = [ 1, "" ]; +} + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (trac-15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, attached, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( toType( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (trac-12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + attached = isAttached( elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( attached ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Only attach events to objects that accept data + if ( !acceptData( elem ) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = Object.create( null ); + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( nativeEvent ), + + handlers = ( + dataPriv.get( this, "events" ) || Object.create( null ) + )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( !event.rnamespace || handleObj.namespace === false || + event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (trac-13208) + // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (trac-13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + click: { + + // Utilize native event to ensure correct state for checkable inputs + setup: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + // dataPriv.set( el, "click", ... ) + leverageNative( el, "click", true ); + } + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + leverageNative( el, "click" ); + } + + // Return non-false to allow normal event-path propagation + return true; + }, + + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack + _default: function( event ) { + var target = event.target; + return rcheckableType.test( target.type ) && + target.click && nodeName( target, "input" ) && + dataPriv.get( target, "click" ) || + nodeName( target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative( el, type, isSetup ) { + + // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add + if ( !isSetup ) { + if ( dataPriv.get( el, type ) === undefined ) { + jQuery.event.add( el, type, returnTrue ); + } + return; + } + + // Register the controller as a special universal handler for all event namespaces + dataPriv.set( el, type, false ); + jQuery.event.add( el, type, { + namespace: false, + handler: function( event ) { + var result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + if ( !saved ) { + + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), so this array + // will not be confused with a leftover capture object. + saved = slice.call( arguments ); + dataPriv.set( this, type, saved ); + + // Trigger the native event and capture its result + this[ type ](); + result = dataPriv.get( this, type ); + dataPriv.set( this, type, false ); + + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + + return result; + } + + // If this is an inner synthetic event for an event with a bubbling surrogate + // (focus or blur), assume that the surrogate already propagated from triggering + // the native event and prevent that from happening again here. + // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the + // bubbling surrogate propagates *after* the non-bubbling base), but that seems + // less bad than duplication. + } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order + // Fire an inner synthetic event with the original arguments + } else if ( saved ) { + + // ...and capture the result + dataPriv.set( this, type, jQuery.event.trigger( + saved[ 0 ], + saved.slice( 1 ), + this + ) ); + + // Abort handling of the native event by all jQuery handlers while allowing + // native handlers on the same element to run. On target, this is achieved + // by stopping immediate propagation just on the jQuery event. However, + // the native event is re-wrapped by a jQuery one on each level of the + // propagation so the only way to stop it for jQuery is to stop it for + // everyone via native `stopPropagation()`. This is not a problem for + // focus/blur which don't bubble, but it does also stop click on checkboxes + // and radios. We accept this limitation. + event.stopPropagation(); + event.isImmediatePropagationStopped = returnTrue; + } + } + } ); +} + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (trac-504, trac-13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || Date.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + code: true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + which: true +}, jQuery.event.addProp ); + +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + + function focusMappedHandler( nativeEvent ) { + if ( document.documentMode ) { + + // Support: IE 11+ + // Attach a single focusin/focusout handler on the document while someone wants + // focus/blur. This is because the former are synchronous in IE while the latter + // are async. In other browsers, all those handlers are invoked synchronously. + + // `handle` from private data would already wrap the event, but we need + // to change the `type` here. + var handle = dataPriv.get( this, "handle" ), + event = jQuery.event.fix( nativeEvent ); + event.type = nativeEvent.type === "focusin" ? "focus" : "blur"; + event.isSimulated = true; + + // First, handle focusin/focusout + handle( nativeEvent ); + + // ...then, handle focus/blur + // + // focus/blur don't bubble while focusin/focusout do; simulate the former by only + // invoking the handler at the lower level. + if ( event.target === event.currentTarget ) { + + // The setup part calls `leverageNative`, which, in turn, calls + // `jQuery.event.add`, so event handle will already have been set + // by this point. + handle( event ); + } + } else { + + // For non-IE browsers, attach a single capturing handler on the document + // while someone wants focusin/focusout. + jQuery.event.simulate( delegateType, nativeEvent.target, + jQuery.event.fix( nativeEvent ) ); + } + } + + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + var attaches; + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, true ); + + if ( document.documentMode ) { + + // Support: IE 9 - 11+ + // We use the same native handler for focusin & focus (and focusout & blur) + // so we need to coordinate setup & teardown parts between those events. + // Use `delegateType` as the key as `type` is already used by `leverageNative`. + attaches = dataPriv.get( this, delegateType ); + if ( !attaches ) { + this.addEventListener( delegateType, focusMappedHandler ); + } + dataPriv.set( this, delegateType, ( attaches || 0 ) + 1 ); + } else { + + // Return false to allow normal processing in the caller + return false; + } + }, + trigger: function() { + + // Force setup before trigger + leverageNative( this, type ); + + // Return non-false to allow normal event-path propagation + return true; + }, + + teardown: function() { + var attaches; + + if ( document.documentMode ) { + attaches = dataPriv.get( this, delegateType ) - 1; + if ( !attaches ) { + this.removeEventListener( delegateType, focusMappedHandler ); + dataPriv.remove( this, delegateType ); + } else { + dataPriv.set( this, delegateType, attaches ); + } + } else { + + // Return false to indicate standard teardown should be applied + return false; + } + }, + + // Suppress native focus or blur if we're currently inside + // a leveraged native-event stack + _default: function( event ) { + return dataPriv.get( event.target, type ); + }, + + delegateType: delegateType + }; + + // Support: Firefox <=44 + // Firefox doesn't have focus(in | out) events + // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 + // + // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 + // focus(in | out) events fire after focus & blur events, + // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order + // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 + // + // Support: IE 9 - 11+ + // To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch, + // attach a single handler for both events in IE. + jQuery.event.special[ delegateType ] = { + setup: function() { + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || this, + dataHolder = document.documentMode ? this : doc, + attaches = dataPriv.get( dataHolder, delegateType ); + + // Support: IE 9 - 11+ + // We use the same native handler for focusin & focus (and focusout & blur) + // so we need to coordinate setup & teardown parts between those events. + // Use `delegateType` as the key as `type` is already used by `leverageNative`. + if ( !attaches ) { + if ( document.documentMode ) { + this.addEventListener( delegateType, focusMappedHandler ); + } else { + doc.addEventListener( type, focusMappedHandler, true ); + } + } + dataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this.document || this, + dataHolder = document.documentMode ? this : doc, + attaches = dataPriv.get( dataHolder, delegateType ) - 1; + + if ( !attaches ) { + if ( document.documentMode ) { + this.removeEventListener( delegateType, focusMappedHandler ); + } else { + doc.removeEventListener( type, focusMappedHandler, true ); + } + dataPriv.remove( dataHolder, delegateType ); + } else { + dataPriv.set( dataHolder, delegateType, attaches ); + } + } + }; +} ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + // Support: IE <=10 - 11, Edge 12 - 13 only + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( elem ).children( "tbody" )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.get( src ); + events = pdataOld.events; + + if ( events ) { + dataPriv.remove( dest, "handle events" ); + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = flat( args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + valueIsFunction = isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( valueIsFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( valueIsFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (trac-8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Re-enable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl && !node.noModule ) { + jQuery._evalUrl( node.src, { + nonce: node.nonce || node.getAttribute( "nonce" ) + }, doc ); + } + } else { + + // Unwrap a CDATA section containing script contents. This shouldn't be + // needed as in XML documents they're already not visible when + // inspecting element contents and in HTML documents they have no + // meaning but we're preserving that logic for backwards compatibility. + // This will be removed completely in 4.0. See gh-4904. + DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && isAttached( node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html; + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = isAttached( elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew jQuery#find here for performance reasons: + // https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var rcustomProp = /^--/; + + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + +var swap = function( elem, options, callback ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + +var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + container.style.cssText = "position:absolute;left:-11111px;width:60px;" + + "margin-top:1px;padding:0;border:0"; + div.style.cssText = + "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + + "margin:auto;border:1px;padding:1px;" + + "width:60%;top:1%"; + documentElement.appendChild( container ).appendChild( div ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; + + // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 + // Some styles come back with percentage values, even though they shouldn't + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; + + // Support: IE 9 - 11 only + // Detect misreporting of content dimensions for box-sizing:border-box elements + boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; + + // Support: IE 9 only + // Detect overflow:scroll screwiness (gh-3699) + // Support: Chrome <=64 + // Don't get tricked when zoom affects offsetWidth (gh-4029) + div.style.position = "absolute"; + scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + function roundPixelMeasures( measure ) { + return Math.round( parseFloat( measure ) ); + } + + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, + reliableTrDimensionsVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (trac-8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + jQuery.extend( support, { + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelBoxStyles: function() { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + }, + scrollboxSize: function() { + computeStyleTests(); + return scrollboxSizeVal; + }, + + // Support: IE 9 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Behavior in IE 9 is more subtle than in newer versions & it passes + // some versions of this test; make sure not to make it pass there! + // + // Support: Firefox 70+ + // Only Firefox includes border widths + // in computed dimensions. (gh-4529) + reliableTrDimensions: function() { + var table, tr, trChild, trStyle; + if ( reliableTrDimensionsVal == null ) { + table = document.createElement( "table" ); + tr = document.createElement( "tr" ); + trChild = document.createElement( "div" ); + + table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; + tr.style.cssText = "box-sizing:content-box;border:1px solid"; + + // Support: Chrome 86+ + // Height set through cssText does not get applied. + // Computed height then comes back as 0. + tr.style.height = "1px"; + trChild.style.height = "9px"; + + // Support: Android 8 Chrome 86+ + // In our bodyBackground.html iframe, + // display for all div elements is set to "inline", + // which causes a problem only in Android 8 Chrome 86. + // Ensuring the div is `display: block` + // gets around this issue. + trChild.style.display = "block"; + + documentElement + .appendChild( table ) + .appendChild( tr ) + .appendChild( trChild ); + + trStyle = window.getComputedStyle( tr ); + reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + + parseInt( trStyle.borderTopWidth, 10 ) + + parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; + + documentElement.removeChild( table ); + } + return reliableTrDimensionsVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + isCustomProp = rcustomProp.test( name ), + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, trac-12537) + // .css('--customProperty) (gh-3144) + if ( computed ) { + + // Support: IE <=9 - 11+ + // IE only supports `"float"` in `getPropertyValue`; in computed styles + // it's only available as `"cssFloat"`. We no longer modify properties + // sent to `.css()` apart from camelCasing, so we need to check both. + // Normally, this would create difference in behavior: if + // `getPropertyValue` returns an empty string, the value returned + // by `.css()` would be `undefined`. This is usually the case for + // disconnected elements. However, in IE even disconnected elements + // with no styles return `"none"` for `getPropertyValue( "float" )` + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( isCustomProp && ret ) { + + // Support: Firefox 105+, Chrome <=105+ + // Spec requires trimming whitespace for custom properties (gh-4926). + // Firefox only trims leading whitespace. Chrome just collapses + // both leading & trailing whitespace to a single space. + // + // Fall back to `undefined` if empty string returned. + // This collapses a missing definition with property defined + // and set to an empty string but there's no standard API + // allowing us to differentiate them without a performance penalty + // and returning `undefined` aligns with older jQuery. + // + // rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED + // as whitespace while CSS does not, but this is not a problem + // because CSS preprocessing replaces them with U+000A LINE FEED + // (which *is* CSS whitespace) + // https://www.w3.org/TR/css-syntax-3/#input-preprocessing + ret = ret.replace( rtrimCSS, "$1" ) || undefined; + } + + if ( ret === "" && !isAttached( elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style, + vendorProps = {}; + +// Return a vendor-prefixed property or undefined +function vendorPropName( name ) { + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a potentially-mapped jQuery.cssProps or vendor prefixed property +function finalPropName( name ) { + var final = jQuery.cssProps[ name ] || vendorProps[ name ]; + + if ( final ) { + return final; + } + if ( name in emptyStyle ) { + return name; + } + return vendorProps[ name ] = vendorPropName( name ) || name; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }; + +function setPositiveNumber( _elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0, + marginDelta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + // Count margin delta separately to only add it after scroll gutter adjustment. + // This is needed to make negative margins work with `outerHeight( true )` (gh-3982). + if ( box === "margin" ) { + marginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { + + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + + // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter + // Use an explicit zero to avoid NaN (gh-3964) + ) ) || 0; + } + + return delta + marginDelta; +} + +function getWidthOrHeight( elem, dimension, extra ) { + + // Start with computed style + var styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). + // Fake content-box until we know it's needed to know the true value. + boxSizingNeeded = !support.boxSizingReliable() || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox, + + val = curCSS( elem, dimension, styles ), + offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); + + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if ( rnumnonpx.test( val ) ) { + if ( !extra ) { + return val; + } + val = "auto"; + } + + + // Support: IE 9 - 11 only + // Use offsetWidth/offsetHeight for when box sizing is unreliable. + // In those cases, the computed value can be trusted to be border-box. + if ( ( !support.boxSizingReliable() && isBorderBox || + + // Support: IE 10 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Interestingly, in some cases IE 9 doesn't suffer from this issue. + !support.reliableTrDimensions() && nodeName( elem, "tr" ) || + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + val === "auto" || + + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && + + // Make sure the element is visible & connected + elem.getClientRects().length ) { + + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Where available, offsetWidth/offsetHeight approximate border box dimensions. + // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the + // retrieved value as a content box dimension. + valueIsBorderBox = offsetProp in elem; + if ( valueIsBorderBox ) { + val = elem[ offsetProp ]; + } + } + + // Normalize "" and auto + val = parseFloat( val ) || 0; + + // Adjust for the element's box model + return ( val + + boxModelAdjustment( + elem, + dimension, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + animationIterationCount: true, + aspectRatio: true, + borderImageSlice: true, + columnCount: true, + flexGrow: true, + flexShrink: true, + fontWeight: true, + gridArea: true, + gridColumn: true, + gridColumnEnd: true, + gridColumnStart: true, + gridRow: true, + gridRowEnd: true, + gridRowStart: true, + lineHeight: true, + opacity: true, + order: true, + orphans: true, + scale: true, + widows: true, + zIndex: true, + zoom: true, + + // SVG-related + fillOpacity: true, + floodOpacity: true, + stopOpacity: true, + strokeMiterlimit: true, + strokeOpacity: true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: {}, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (trac-7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug trac-9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (trac-7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append + // "px" to a few hardcoded values. + if ( type === "number" && !isCustomProp ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( _i, dimension ) { + jQuery.cssHooks[ dimension ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = getStyles( elem ), + + // Only read styles.position if the test has a chance to fail + // to avoid forcing a reflow. + scrollboxSizeBuggy = !support.scrollboxSize() && + styles.position === "absolute", + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) + boxSizingNeeded = scrollboxSizeBuggy || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra ? + boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ) : + 0; + + // Account for unreliable border-box dimensions by comparing offset* to computed and + // faking a content-box to get border and padding (gh-3699) + if ( isBorderBox && scrollboxSizeBuggy ) { + subtract -= Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + parseFloat( styles[ dimension ] ) - + boxModelAdjustment( elem, dimension, "border", false, styles ) - + 0.5 + ); + } + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( prefix !== "margin" ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && ( + jQuery.cssHooks[ tween.prop ] || + tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = Date.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 15 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY and Edge just mirrors + // the overflowX value there. + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + result.stop.bind( result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = Date.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // Use proper attribute retrieval (trac-12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classNames, cur, curValue, className, i, finalValue; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classNames = classesToArray( value ); + + if ( classNames.length ) { + return this.each( function() { + curValue = getClass( this ); + cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + for ( i = 0; i < classNames.length; i++ ) { + className = classNames[ i ]; + if ( cur.indexOf( " " + className + " " ) < 0 ) { + cur += className + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + this.setAttribute( "class", finalValue ); + } + } + } ); + } + + return this; + }, + + removeClass: function( value ) { + var classNames, cur, curValue, className, i, finalValue; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classNames = classesToArray( value ); + + if ( classNames.length ) { + return this.each( function() { + curValue = getClass( this ); + + // This expression is here for better compressibility (see addClass) + cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + for ( i = 0; i < classNames.length; i++ ) { + className = classNames[ i ]; + + // Remove *all* instances + while ( cur.indexOf( " " + className + " " ) > -1 ) { + cur = cur.replace( " " + className + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + this.setAttribute( "class", finalValue ); + } + } + } ); + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var classNames, className, i, self, + type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); + + if ( isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + classNames = classesToArray( value ); + + return this.each( function() { + if ( isValidValue ) { + + // Toggle individual class names + self = jQuery( this ); + + for ( i = 0; i < classNames.length; i++ ) { + className = classNames[ i ]; + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, valueIsFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + valueIsFunction = isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( valueIsFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (trac-14686, trac-14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (trac-2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion +var location = window.location; + +var nonce = { guid: Date.now() }; + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml, parserErrorElem; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) {} + + parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; + if ( !xml || parserErrorElem ) { + jQuery.error( "Invalid XML: " + ( + parserErrorElem ? + jQuery.map( parserErrorElem.childNodes, function( el ) { + return el.textContent; + } ).join( "\n" ) : + data + ) ); + } + return xml; +}; + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = lastElement = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (trac-9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724) + if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + lastElement = cur; + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (trac-6170) + if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && toType( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + if ( a == null ) { + return ""; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ).filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ).map( function( _i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // trac-7653, trac-8125, trac-8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + +originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes trac-9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() + " " ] = + ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) + .concat( match[ 2 ] ); + } + } + match = responseHeaders[ key.toLowerCase() + " " ]; + } + return match == null ? null : match.join( ", " ); + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (trac-10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket trac-12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 15 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // trac-9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Use a noop converter for missing script but not if jsonp + if ( !isSuccess && + jQuery.inArray( "script", s.dataTypes ) > -1 && + jQuery.inArray( "json", s.dataTypes ) < 0 ) { + s.converters[ "text script" ] = function() {}; + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( _i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + +jQuery.ajaxPrefilter( function( s ) { + var i; + for ( i in s.headers ) { + if ( i.toLowerCase() === "content-type" ) { + s.contentType = s.headers[ i ] || ""; + } + } +} ); + + +jQuery._evalUrl = function( url, options, doc ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (trac-11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + + // Only evaluate the response if it is successful (gh-4126) + // dataFilter is not invoked for failure responses, so using it instead + // of the default converter is kludgy but it works. + converters: { + "text script": function() {} + }, + dataFilter: function( response ) { + jQuery.globalEval( response, options, doc ); + } + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var htmlIsFunction = isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // trac-1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.ontimeout = + xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see trac-8605, trac-14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // trac-14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain or forced-by-attrs requests + if ( s.crossDomain || s.scriptAttrs ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( "