From 18050fa20f6cc77c840c86c62efffdfa6f900ed1 Mon Sep 17 00:00:00 2001 From: "kyllian.chabanon" Date: Thu, 10 Nov 2022 01:00:49 +0100 Subject: [PATCH] Ajout de la fonction modificationEtat --- ActivitesJour.don | 27 ++- SAE.c | 502 +++++++++++++++++++++++++++++++++++++++------- SAE.h | 40 +++- exe | Bin 17048 -> 21880 bytes membres.don | 9 +- testSAE.c | 21 +- 6 files changed, 495 insertions(+), 104 deletions(-) diff --git a/ActivitesJour.don b/ActivitesJour.don index af64d63..e6eb2bd 100644 --- a/ActivitesJour.don +++ b/ActivitesJour.don @@ -1,10 +1,17 @@ - Date nbActivitesJour -12082022 500 -5092022 525 -7092022 740 -8092022 812 -9092022 850 -10092022 620 -11092022 601 -12092022 422 -13092022 501 +1 500 +2 525 +3 740 +4 812 +5 850 +6 620 +7 601 +8 422 +9 501 +1 500 +2 525 +3 740 +4 812 +5 850 +6 620 +7 601 +8 422 diff --git a/SAE.c b/SAE.c index f686673..a1b8f35 100644 --- a/SAE.c +++ b/SAE.c @@ -1,25 +1,25 @@ #include "SAE.h" -int Ouverture(int tNoCarte[], int tage[], int tPointsCarte[], int tCarteActive[], int tNbActivitesJour[], int tDate[], int tmax) +int Ouverture(int tNoCarte[], int tage[], int tPointsCarte[], int tCarteActive[], int tNbActivitesJour[], int tDate[], int tmax, int *pasAct) { - int i = 0, j = 0; + int pasMembres; + pasMembres = OuvertureMembres(tNoCarte, tage, tPointsCarte, tCarteActive, tmax); + *pasAct = OuvertureActivitesJour(tNbActivitesJour, tDate, tmax); + return pasMembres; +} + +int OuvertureMembres(int tNoCarte[], int tage[], int tPointsCarte[], int tCarteActive[], int tmax) +{ + int i = 0; int NoCarte, age, pointsCarte, CarteActive; - int Date, nbActivitesJour; - FILE *flot, *jour; + FILE *flot; flot = fopen("membres.don", "r"); - jour = fopen("ActivitesJour.don", "r"); if (flot == NULL) { printf("Pb d'ouverture du fichier membres.don\n"); return -1; } - if (jour == NULL) - { - printf("Pb d'ouverture du fichier ActivitesJour.don\n"); - return -1; - } - fscanf(flot, "%d%d%d%d%d%d%d", &NoCarte, &age, &pointsCarte, &CarteActive); - fscanf(jour, "%d%d", &Date, &nbActivitesJour); + fscanf(flot, "%d%d%d%d", &NoCarte, &age, &pointsCarte, &CarteActive); while (!feof(flot)) { if (i == tmax) @@ -35,97 +35,452 @@ int Ouverture(int tNoCarte[], int tage[], int tPointsCarte[], int tCarteActive[] fscanf(flot, "%d%d%d%d", &NoCarte, &age, &pointsCarte, &CarteActive); i++; } + fclose(flot); + return i; +} +int OuvertureActivitesJour(int tNbActivitesJour[], int tDate[], int tmax) +{ + int i = 0; + int Date, nbActivitesJour; + FILE *jour; + jour = fopen("ActivitesJour.don", "r"); + if (jour == NULL) + { + printf("Pb d'ouverture du fichier ActivitesJour.don\n"); + return -1; + } + fscanf(jour, "%d%d", &Date, &nbActivitesJour); while (!feof(jour)) { - if (j == tmax) + if (i == tmax) { printf("Tableau plein\n"); fclose(jour); return -1; } - tDate[j] = Date; - tNbActivitesJour[j] = nbActivitesJour; + tDate[i] = Date; + tNbActivitesJour[i] = nbActivitesJour; fscanf(jour, "%d%d", &Date, &nbActivitesJour); - j++; + i++; } fclose(jour); - fclose(flot); return i; } -int recherche(int tab[], int tailleLog, int valeur, int *trouve) +int choixMenu(void) +{ + int choix; + printf("\t Gestion des matières\n"); + printf("1.\tAffichage\n"); + printf("2.\tAjouter un adhérent\n"); + printf("3.\tModifier l'âge d'un adhérent\n"); + printf("4.\tSuppression d'un adhérent\n"); + printf("5.\tAjout de points sur une carte\n"); + printf("6.\tModification de l'état de la carte\n"); + printf("7.\tCréditer une activité à une carte\n"); + printf("8.\tQuitter\n"); + printf("\noption choisie :\n"); + scanf("%d", &choix); + return choix; +} + +int choixMenuAffichage(void) { - for (int i = 0; i < tailleLog; i++) + int choix; + printf("\tGestion des matières\n"); + printf("1.\tAffichage des informations d'un adhérent\n"); + printf("2.\tAffichage des informations de tous les adhérents\n"); + printf("3.\tAffichage du nombre d’entrées totale de toutes les journée\n"); + printf("4.\tAffichage du nombre d'entrées totale depuis le début\n"); + printf("5.\tAffichage du nombre total d'adhérents\n"); + printf("6.\tquitter\n"); + printf("\noption choisie :\n"); + scanf("%d", &choix); + return choix; +} + +int rechercheAdherent(int tNoCarte[], int nbelem, int NoCarte, int *trouve) +{ + int i; + for(i = 0; i < nbelem; i++) { - if (tab[i] == valeur) + if(tNoCarte[i] == NoCarte) { *trouve = 1; return i; } - else if (tab[i] > valeur) + if(tNoCarte[i] > NoCarte) { *trouve = 0; return i; } } - *trouve = 0; - return tailleLog; } -void ajouterPoints(int tNumCarte[], int tPoints[], int tailleLog) +int rechercheAdherent(int tNoCarte[], int tmax, int nbelem) { + int i = 0, NoCarte; + printf("Entrez le numéro de la carte de l'adhérent recherché : "); + scanf("%d",&NoCarte); + while (i < tmax && tNoCarte[i] != NoCarte) + { + i++; + } + if (i == tmax) + { + printf("Ce numéro d'adhérant n'existe pas, veuillez réessayer\n"); + return -1; + } + else + { + return i; + } +} - int numCarte, nbPoints, trouve, index; - char choix; +void Affichage1Adherent(int tNoCarte[], int tage[], int tPointsCarte[], int tCarteActive[], int nbelem) +{ + int pas, NoCarte, CarteActive, trouve; + printf("Entrez le numéro de la carte de l'adhérent recherché : "); + scanf("%d",&NoCarte); + pas = rechercheAdherant(tNoCarte, nbelem, NoCarte, &trouve); + if(trouve == 1) + { + printf(" N°_de_carte\tAge Points Carte_active\n"); + printf("\t%d\t%d\t%d\t%d\n", tNoCarte[pas], tage[pas], tPointsCarte[pas], tCarteActive[pas]); + } + else + { + printf("Ce numéro d'adhérant n'existe pas, veuillez réessayer\n"); + return; + } +} - printf("Entrez le numéro d'adhérent : "); - scanf("%d", &numCarte); - index = recherche(tNumCarte, tailleLog, numCarte, &trouve); - while (trouve == 0) +void AffichageTousAdherents(int tNoCarte[], int tage[], int tPointsCarte[], int tCarteActive[], int nbelem) +{ + int i; + printf(" N°_de_carte\tAge Points Carte_active\n"); + for (i = 0; i < nbelem; i++) { - printf("Numéro de carte non trouvé. Veuillez réessayer.\nEntrez le numéro d'adhérent : "); - scanf("%d", &numCarte); - index = recherche(tNumCarte, tailleLog, numCarte, &trouve); + printf("\t%d\t%d\t%d\t%d\n", tNoCarte[i], tage[i], tPointsCarte[i], tCarteActive[i]); + } +} +void AffichageNbEntreesTousJour(int tNbActivitesJour[], int tDate[], int nbelem) +{ + int i; + printf(" Date\tNb_Activites\n"); + for (i = 0; i < nbelem; i++) + { + printf("\t%d\t%d\n", tDate[i], tNbActivitesJour[i]); + } +} +void AffichageNbEntreesTotal(int tNbActivitesJour[], int nbelem) +{ + int i, somme = 0; + for (i = 0; i < nbelem; i++) + { + somme = somme + tNbActivitesJour[i]; + } + printf("Le nombre total d'entrées est de %d depuis le début.\n", somme); +} + +void AffichageNbAdherents(int nbelem) +{ + int i, somme = 0; + for (i = 0; i < nbelem; i++) + { + somme = somme + 1; } - printf("Entrez le nombre de points à ajouter : "); - scanf("%d", &nbPoints); - printf("Vous voulez bien ajouter %d points à la carte n°%d ? (O/n)", nbPoints, numCarte); - scanf("%c%*c", &choix); - if (choix == 'n' || choix == 'N') + printf("Le nombre total d'adhérents est de %d.\n", somme); +} + +void gestionMenus(void) +{ + int tNoCarte[20] = {0}, tage[20] = {0}, tPointsCarte[20] = {0}, tCarteActive[20] = {0}; + int tDate[20] = {0}, tNbActivitesJour[20] = {0}; + int tmax = 20, nbelem, choix, pasAct; + nbelem = Ouverture(tNoCarte, tage, tPointsCarte, tCarteActive, tNbActivitesJour, tDate, tmax, &pasAct); + if (nbelem < 0) { - printf("Annulation"); + printf("Erreur d'ouverture du fichier ou tableau plein !!!\n"); return; } + choix = choixMenu(); + while (choix != 8) + { + if (choix == 1) + { + choix = choixMenuAffichage(); + while (choix != 6) + { + if (choix == 1) + { + Affichage1Adherent(tNoCarte, tage, tPointsCarte, tCarteActive, nbelem); + } + if (choix == 2) + { + AffichageTousAdherents(tNoCarte, tage, tPointsCarte, tCarteActive, nbelem); + } + if (choix == 3) + { + AffichageNbEntreesTousJour(tNbActivitesJour, tDate, nbelem); + } + if (choix == 4) + { + AffichageNbEntreesTotal(tNbActivitesJour, nbelem); + } + if (choix == 5) + { + AffichageNbAdherents(nbelem); + } + choix = choixMenuAffichage(); + } + } + if (choix == 2) + { + nbelem = AjoutAdherent(tNoCarte, tage, tPointsCarte, tCarteActive, tmax, nbelem); + } + if (choix == 3) + { + ModificationAge(tNoCarte, tage, nbelem); + } + if (choix == 4) + { + nbelem = SupprimmerAdherent(tNoCarte, tage, tPointsCarte, tCarteActive, nbelem); + } + if (choix == 5) + { + + AjoutPoints(tNoCarte, tPointsCarte, nbelem); + } + if (choix == 6) + { + + } + if (choix == 7) + { + } + choix = choixMenu(); + } + Sauvegarde(tNoCarte, tage, tPointsCarte, tCarteActive, tNbActivitesJour, tDate, nbelem); + exit(1); +} + +void ModificationAge(int tNoCarte[], int tage[], int nbelem) +{ + int pas, NoCarte, age; + printf("Entrez le numéro de la carte de l'adhérent recherché : "); + scanf("%d",&NoCarte); + pas = rechercheAdherant(tNoCarte, nbelem, NoCarte, &trouve); + if(trouve == 1) + { + printf("Entrez l'age de l'adhérent : "); + scanf("%d",&age); + tage[pas] = age; + } else { - modifierPoints(tNumCarte, tPoints, tailleLog, numCarte, nbPoints); + printf("Ce numéro d'adhérant n'existe pas, veuillez réessayer\n"); return; } } -int modifierPoints(int tNumCarte[], int tPoints[], int tailleLog, int numCarte, int nbPoints) +int SupprimmerAdherent(int tNoCarte[], int tage[], int tPointsCarte[], int tCarteActive[], int nbelem) { - int index, trouve; + int pas, i, NoCarte, trouve; + printf("Entrez le numéro de la carte de l'adhérent recherché : "); + scanf("%d",&NoCarte); + pas = rechercheAdherant(tNoCarte, nbelem, NoCarte, &trouve); + if(trouve == 1) + { + for(i = pas; i < nbelem; i++) + { + tNoCarte[i] = tNoCarte[i+1]; + tage[i] = tage[i+1]; + tPointsCarte[i] = tPointsCarte[i+1]; + tCarteActive[i] = tCarteActive[i+1]; + } + nbelem = nbelem - 1; + return nbelem; + } + else + { + printf("Ce numéro d'adhérant n'existe pas, veuillez réessayer\n"); + return -1; + } + +} - index = recherche(tNumCarte, tailleLog, numCarte, &trouve); +int AjoutAdherent(int tNoCarte[], int tage[], int tPointsCarte[], int tCarteActive[], int tmax, int nbelem) +{ + int NoCarte, age, pointsCarte, CarteActive, pas; + char reponse; + printf("Donnez l'âge de l'adhérent :\n"); + scanf("%d", &age); + pas = rechercheAdherant(tNoCarte, nbelem); + for(j=nbelem; j> pas; j--) + { + if(j == tmax) + { + printf("Tableau plein, impossible d'ajouter un adhérent\n"); + return -1; + } + tNoCarte[j] = tNoCarte[j-1]; + tage[j] = tage[j-1]; + tPointsCarte[j] = tPointsCarte[j-1]; + tCarteActive[j] = tCarteActive[j-1]; + } + tNoCarte[pas] = pas + 1; + tage[pas] = age; + tPointsCarte[pas] = 0; + tCarteActive[pas] = 0; + nbelem++; + printf("Le numero de carte de l'adherent qui a %d ans est %d.\nLa carte n'est pas active car il n'y a pas de points dessus.\nVoulez-vous en ajouter ? (O / N)", tage[pas], tNoCarte[pas]); + scanf("%*c%c", &reponse); + if(reponse == 'O' || reponse == 'o') + { + AjoutPoints(tNoCarte, tPointsCarte, tCarteActive, nbelem, pas); + } + else + { + printf("La carte n'est pas active.\n"); + return nbelem; + } + return nbelem; +} + +void AjoutPoints(int tNoCarte[], int tPointsCarte[], int tCarteActive[], int nbelem, int pas) +{ + int pointsCarte, NoCarte, trouve; + printf("Entrez le numéro de la carte de l'adhérent recherché : "); + scanf("%d",&NoCarte); + pas = rechercheAdherant(tNoCarte, nbelem, NoCarte, &trouve); + if(trouve == 1) + { + printf("Entrez le nombre de points a ajouter: "); + scanf("%d", &pointsCarte); + if(pointsCarte > 0 && pointsCarte < 20) + { + tPointsCarte[pas] = pointsCarte; + tCarteActive[pas] = 1; + printf("La carte est active.\n"); + } + if(pointsCarte > 20 && pointsCarte < 50) + { + tPointsCarte[pas] = pointsCarte + pointsCarte*(1 + (5/100.0)); + tCarteActive[pas] = 1; + printf("Merci pour votre achat. Nous vous offrons 5%% supplémentaires. De plus, votre carte est active.\n"); + } + if(pointsCarte > 50 && pointsCarte < 100) + { + tPointsCarte[pas] = pointsCarte + pointsCarte*(1 + (10/100.0)); + tCarteActive[pas] = 1; + printf("Merci pour votre achat. Nous vous offrons 10%% supplémentaires. De plus, votre carte est active.\n"); + } + if(pointsCarte > 100) + { + tPointsCarte[pas] = pointsCarte + pointsCarte*(1 + (15/100.0)); + tCarteActive[pas] = 1; + printf("Merci pour votre achat. Nous vous offrons 15%% supplémentaires. De plus, votre carte est active.\n"); + } + else + { + printf("Le nombre de points est incorrect.\n"); + printf("Veuillez ressaisir le nombre de points a ajouter: "); + scanf("%d", &pointsCarte); + } + } + else + { + printf("Ce numéro d'adhérant n'existe pas, veuillez réessayer\n"); + return -1; + } +} + +int Sauvegarde(int tNoCarte[], int tage[], int tPointsCarte[], int tCarteActive[], int tNbActivitesJour[], int tDate[], int nbelem) +{ + int i, j; + FILE *flot, *jour; + flot = fopen("membres.don", "a"); + jour = fopen("ActivitesJour.don", "a"); + if (flot == NULL) + { + printf("Pb d'ouverture du fichier membres.don\n"); + return -1; + } + if (jour == NULL) + { + printf("Pb d'ouverture du fichier ActivitesJour.don\n"); + return -1; + } + for (i = 0; i < (nbelem - 1); i++) + { + fprintf(flot, "\t%d\t%d\t\t%d\t\t%d\n", tNoCarte[i], tage[i], tPointsCarte[i], tCarteActive[i]); + } + for (j = 0; j < (nbelem - 1); j++) + { + fprintf(jour, "%d\t\t%d\n", tDate[j], tNbActivitesJour[j]); + } + fclose(jour); + fclose(flot); +} - if (trouve == 0) +void DebitActivitee(int tNoCarte[], int tage[], int tPointsCarte[], int tCarteActive[], int tNbActivitesJour[], int tDate[], int nbelem) +{ + int NoCarte, trouve, pas, pointsCarte; + char reponse; + printf("Entrez le numéro de la carte de l'adhérent recherché : "); + scanf("%d",&NoCarte); + pas = rechercheAdherant(tNoCarte, nbelem, NoCarte, &trouve); + if(trouve == 1) { - printf("Numéro de carte non trouvé. Annulation de l'opétation."); - return 0; + if(tCarteActive[pas] == 1) + { + printf("Voulez-vous desactiver cette carte ? (O/N)\n"); + scanf("%*c%c", &reponse); + if(reponse == 'O' || reponse == 'o') + { + tCarteActive[pas] = 0; + printf("La carte est desactivée.\n"); + } + else + { + printf("La carte est toujours active.\n"); + } + } + else + { + printf("La carte est desactivée. Voulez-vous la réactiver ? (O/N)\n"); + scanf("%*c%c", &reponse); + if(reponse == 'O' || reponse == 'o') + { + tCarteActive[pas] = 1; + printf("La carte est activée.\n"); + } + else + { + printf("La carte est toujours desactivée.\n"); + } + } } else { - tPoints[index] += nbPoints; - return 1; + printf("Ce numéro d'adhérant n'existe pas, veuillez réessayer\n"); + return -1; } } -void modifierAge(int tNumCarte[], int tAge[], int tailleLog) +void modificationEtat(int tNumCarte[], int tEtat[], int tailleLog) { - int numCarte, age, index, trouve; - char choix; - printf("Entrez le numéro d'adhérent : "); + int choix, numCarte, index, trouve; + printf("Que voulez-vous faire ?\n1.\tActiver une carte\n2.\tDésactiver une carte"); + scanf("%d", &choix); + while (choix != 1 || choix != 2) + { + printf("Choix invalide. Veuillez réessayer.\nQue voulez-vous faire ?\n1.\tActiver une carte\n2.\tDésactiver une carte"); + scanf("%d", &choix); + } + + printf("Entrez le numéro de la carte dont vous voulez modifier l'état."); scanf("%d", &numCarte); index = recherche(tNumCarte, tailleLog, numCarte, &trouve); while (trouve == 0) @@ -135,25 +490,31 @@ void modifierAge(int tNumCarte[], int tAge[], int tailleLog) index = recherche(tNumCarte, tailleLog, numCarte, &trouve); } - printf("Entrez le nouvel âge :"); - scanf("%d", &age); - while (age <= 0) - { - printf("Âge non valide. Veuillez réessayer.\nEntrez le nouvel âge : "); - scanf("%d", &age); - } - - printf("Le nouvel âge du client n°%d est bien %d ? (O/n)", numCarte, age); - scanf("%c%*c", &choix); - if (choix == 'n' || choix == 'N') + if (choix == 1) { - printf("Annulation"); - return; + if (tEtat[index] == 1) + { + printf("La carte n°%d est déjà active"); + return; + } + else + { + printf("La carte n°%d a été activée"); + return; + } } - else + else if (choix == 2) { - tAge[index] = age; - return; + if (tEtat[index] == 0) + { + printf("La carte n°%d est déjà désactivée"); + return; + } + else + { + printf("La carte n°%d a été désactivée.") + return; + } } } @@ -260,16 +621,11 @@ int CreationAdherents(int tNoCarte[], int tage[], int tPointsCarte[], int tCarte nbelem = nbelem + 1; } -/* void pointsBonus() { } - - - - int CreationAdherents(int tAdherents[], nbClients) { int NoCarte, nom, prenom, age, pointsCarte, CarteActive, nbActivitéesJour; diff --git a/SAE.h b/SAE.h index 28adf39..4fa60f1 100644 --- a/SAE.h +++ b/SAE.h @@ -1,17 +1,37 @@ #include #include -int Ouverture(int tNoCarte[], int tage[], int tPointsCarte[], int tCarteActive[], int tNbActivitesJour[], int tDate[], int tmax); +/* Fonctions Ouverture des fichiers textes */ +int Ouverture(int tNoCarte[], int tage[], int tPointsCarte[], int tCarteActive[], int tNbActivitesJour[], int tDate[], int tmax, int *pasAct); +int OuvertureMembres(int tNoCarte[], int tage[], int tPointsCarte[], int tCarteActive[], int tmax); +int OuvertureActivitesJour(int tNbActivitesJour[], int tDate[], int tmax); void testOuverture(void); -int Sauvegarde(); + +/* Fonctions des menus */ +int choixMenu(void); +int choixMenuAffichage(void); + +/* Fonctions d'affichage */ +void Affichage1Adherent(int tNoCarte[], int tage[], int tPointsCarte[], int tCarteActive[], int nbelem); +void AffichageTousAdherents(int tNoCarte[], int tage[], int tPointsCarte[], int tCarteActive[], int nbelem); +void AffichageNbEntreesTousJours(int tNbActivitesJour[], int tDate[], int nbelem); +void AffichageNbEntreesTotal(int tNbActivitesJour[], int nbelem); +void AffichageNbAdherents(int nbelem); + +/* Fonction globale */ +void gestionMenus(void); + +/* Fonction Sauvegarde */ +int Sauvegarde(int tNoCarte[], int tage[], int tPointsCarte[], int tCarteActive[], int tNbActivitesJour[], int tDate[], int nbelem); void testSauvegarde(void); -/* -int pointsBonus(); -int CreationAdherent(); -int FrequenceCentre(); -*/ +/* Fonctions de gestion des adherents */ +int rechercheAdherant (int tNoCarte[], int nbelem); +int AjoutAdherent(int tNoCarte[], int tage[], int tPointsCarte[], int tCarteActive[], int tmax, int nbelem); +void ModificationAge(int tNoCarte[], int tage[], int nbelem); +void modificationEtat(int tNumCarte[], int tEtat[], int tailleLog) + +/* Fonstions de gestion des points */ +void ajouterPoints(int tNumCarte[], int tPoints[], int tailleLog); int recherche(int tab[], int tailleLog, int valeur, int *trouve); -int modifierPoints(int tNumCarte[], int tPoints[], int tailleLog, int numCarte, int points); -void modifierAge(int tNumCarte[], int tPoints[], int tailleLog, int nbPoints); -void modifierAge(int tNumCarte[], int tAge[], int tailleLog); \ No newline at end of file +int modifierPoints(int tNumCarte[], int tPoints[], int tailleLog, int numCarte, int points); \ No newline at end of file diff --git a/exe b/exe index 5d118ea19c6fe8f4e242c1baef76390bf552a187..35b28048e24e2e3d0ddd285f9a1da0fc58f35528 100755 GIT binary patch literal 21880 zcmeHPe{@vUoxe#y140r7F)GMYp+Hy0fcyvuB?B29+yto*u~j-uG7~a3nMvmd21{Dp zFs{>aTDmJ9dg>mtwe6AqSm_VCXl)ybZP2pa*hQOFYEz5tq(O}>Zetgn{e17e-}m0U zOkDry*|R+-7c$@P{rI7QLV>uXE>+> z!I0xgF`>VwwLK@S1&<0tlBKfw)p&sLgDYfp3_PjGf+6dD7<%OA`z;*yTXcKl#idgF z&ro+)T-zFIT(Ruh*1+P{P&m=CxTAW-;uXtWv50G_?DtGKLOFHgrUvn2?@zbRdv?o( z+v@Le&tCAt{)Y!Vwd6PXK=w$63dwW$36|lH_^My`08=!A&jo+hMsU261j8u6oDbSX z1?ZQLLtj1)ozkI@oh{?g*Nj6q#-aZ+=)`jtibbJzr;S4|8i#%ubOV3RQVYUWP9oKV z9ig~rjtCZfZRLjAW&KN3r!Cyj4q0D{ zdh>qNWm)pt#?*5k^QK<$cAXyCytOVfd37bamYMz^mk?O{7(njg-+oAlv*mMf_y8#c z1K!N!Mgprw;};_wKLnq`F(o%xK6ft}?$r?TtEBvLYS+8yU2kf{`_${}yibjmc#D4G zeeT`(Oc*$z4V2~vn`Jw!zjy81V2Q-F4c@M`y9o8BUX4%lrq{lRN_H{2lx@MsPbNQy zdeL^)V>t9lFdLwQfvfSRI zys5tIJT#Z`oC6yop5y5TP=7{@yD@%Hs7w{7J?Eb3)%G{TKI|s?VgESn_td65Pxg7v z!3qMl{Fylf);Hf4d>Gl7dV3=xm|6ZUvX<&QO2)GfLT{)C7~Hwu^JL;G82kbm%z!~^7W)e91;u-K39ZP%8$R6b}`XwVfmT_D%PLE~uNXB5Q_&qx?f?HK)2cAEd%XN9q z6|t`u!`Ea_`Mzrq3#L5>8GE>CIAyp~4JWK9H<8)Q+Cu=@UqK^3%3mRJ2goYQ$EfeN z=pwF<+1>gOB!@d?P){W0!fY++SCd&C)HQ5tcsIlf1g=0tRj3hBN7KvfP51tHend*p z5JeUc!H^@NX0Tyux26 z{27H`Mfv;#h1U@NErm}enXgEkotOlYa)RvJouHh_TLLgekvyX`35Iu4_{iEeW$mo$ z()ZxBvi30OI@5+f;2iF(x2Qi|k@lQjbu2L%%;762p@CfQIkD&GF#QynKKC|;wR2R& z|Iu7F3i_1pJmFlG+^JET#!Ha^v?yiP9wvidhe4++n6mxpDkl|b*PkwRQU|r$GI!VT zYJkp+riD8-A_p~W#&bJb+yCC4!?8=qv5O$e!HPOt{Y!gz!W^UTkE(ft7Af%e?zh~n z;=xZfoPw8MrDSY{ID5Il=_L=TjLkHT4I*|tEo5MJna$SPn?1GXh^<+JnoT86>onum z<`isA6nRF?yg9w+rL<>Mwlvdh>BT?Uhrmd6o^cp1?edHknKsVs8DSfxri}+}Htsn? zHoeI%}7*@-e#e+3DH!#ZflgbDjMxD zQO{mQ^4zDP+_k`ygIZLWqRCPVt+3Ea3pFfsp@mjiXtjmbSg6-R596Ax8$N2GJr;W0 zLi;Urz(NNtG;5(F7CLI7J1n%tLfb90!$S93=zSKt-$D;sXt#wvYM~VtT4|w%g)X$v zDhsW)&>9Q%TIgmAy-lOYR(kkQm&xn^r7n}Cw!N9mVF?bmTs~6jkV8w@x;`b%|TP0kQn4NAQ%hW%w?w{H>#&Au9 zxk-tcQbKk;^#b*)UvVZUrs4{M`W#&Dv&U3VpmAP#k}@$n!=#j!C+C9le#3}k3%V;q zSb+dg2!DiNiR?>%%;n4leasFPJLIF-As@!ZXt6pFOr8Oyd!ZyZR+;6q6nPbqBZ{20 zcD1kKSxB}NUcp=6PW9;&``nam1doKV9vlVhdW}LMJaS zV=i>^@>fCoHh1c6T-ng2J7&Qh-b4Qb98s%gMOU_HmFHaf{dd7<-W))2G;e!%R9{Z> zsfXp|6vEiCFP~<&zf{^E#g0JPAKmj!DTcxR)0+sV-cSw$H^+mv2E4^ZqW4|QJCWx} zBLk1r#Q}kot914q(9;d0*jSFF6WBpuTMzpQL>8$(ydE~bZrb>Ko{fHtl(O-7K^sey z4S0!j-oL`o6Q&`rGNiXle{ULUSB5B|X>0hnsc?x>ctd&rvPoYDdinP}Z>$N&OC{Wt zm;uFJQ{d$h?8oOIk<;~~=?3%thzs-v(uq?X`j0{f zp~2uLdlHpstjTQb6KG6EWO#)$@8qVbv>>(NWYM#!ilc~@(8H*%{;7sR90>L?@633W9t3#!pSy)K>63AMsB zG#7@37h#ZQnW881L@zK!&w`G`OZI%KA4@IofUYq09#DEZ1#dU|@FeI3Qn1DpxE%t+ zmpMldOAb!YXH&(z+nm@{A@#g{$!cT@B_Ys>U6qQ1fyCD#`Tw%3dg%-%oZ3~T572&# z*X;RtEUxBc(=g4+waY-rt_02t*-kkX(%((eZb#y^>HFozMpyPFX=kUT?oZP8PT>#8 z1A@Y9lijqzyH#E%W|?ii@q6W#xvrhv^LcZDzvs-L3wf0}P=!5_^zrdOQ-D*y_@nph zeMzFyBHWi;28`~nA{l|voz=eN8env}Kvn{qEHOI5(S6juq!$?7LG4S{0V|c*W?=Ln zzc0BJ7(Mz%(>wSQk=Ha)api|-02qBysxR3B>{^Mn0{ei(+JVt`Mf#F)VCW364q$ZK zu`js?7*-u%dx7Dq1Z*F$D}bTt{neoSFsy7b-Q@!anu`dHty?)fh zz5z@{>@YAD#qR>6h@t78!9qLvfK5l+ zeaVHuPD|_>VAsG4q#m$aB(@A#tK?P#`-sHW0Q;)6QUmNQiPZut1sA6w>K_h0)E15q z6ly)#I22K0c{4J#={dxmQ|nVtZB%!KuE+6*X0X2gWUqv%oD|!8n_cB|_hIDdfrM~x ztIMpNJ6{O*ts7G>xEnU6-g0ksr_MEaGm9%g-cq;d9kQLB@jDoN>YbAK)_Tiqp=%o~)XC!$~MP%y}9}^Ln zh`>YyCL%Bqfxp@a(DzTNL`7S$tuY#mxdM?e>YE#lz=B9(S1=k+M1w{kVKj%DT0+67 zVV9d9Q2&JdPOLv+w6_NFy;^ruJhUqm55{haB%;dT`1ZyMlT9(jxG@-uhazDk5R4gZ z{&=YOQMf0TxTd(9$ru05pje8^osk5-n`C>%=i5mY`OGMiah29Hf|0S;6fz!9(dR zHFqfPkCSGrpQTs2rfi7z9tt2T%8FmbsP~Z3+if#j?V9r8L?{j^F*VXIO*XYeLa|WL zSS=71d-r8zLgD5}l)@7U$DCb+e-t4OR{{B;5sxHdMk_*WMlVMFLi}uc2_qb#>@Wha z?EL})jGjOv9*O%~L6b%>+R_Y$BN_&qjG!RO1??;tYo$FAA`?cS_fTVk#*hk)gXO>J zhin?%wKC`XNuR;}chd9opBgcEH@n}}%*3?sY%-#^E9 zzKwQ&>>6WNFcE5Pg*n;pn144$M;9`WuZa7k`6+IsnXy@=%LYmlpB(0(m@+?L{+}w0 zT7Nt^WmBWi%zZ5|Rn);B6>9FH87NE#@_&8+pZT$J71FapW0;x{)Ws8x29eL>%<)LV zh|{;+c}5#oUU{YPb1$eT_?wD+R1h|;css)h|BclKx4Vgh%_9=Vq=`qd()1p38MlrN zv}@}7GHnymnQG2k%rC!QBrHE}rL^A_NzkY^hJsi;v~YhS!Z|df$Xa!9bzBM`qDvYV&tc{+R!DQpvo6{i4fDu0IJ#cN^}* zLDs;za^Z_O!U0wTj(|SrrCe?Y>Yadl0nePu<+=gi{berK1Ng<4bGbo4<5##rh0EM` z0S&+~4xu%GbAAndzy|>L0=@~@4Y>Rj=mW0%E%X8Z9Y;s{xyH01=mS0oSOaL_cFqpK zG;Sa51$+&+Qo8{!z>|?4z=eQ=fcF6|q*FW!ZrI9FboVWysH39j@@eOn?k_sOg6Q~` zfv7=W|3-<(&%*LT%+vBaaJ=p&$+C(Y$|`Rvzu>OYy<**E*MIQ3c~=pc^lR}q06Drr zz=hhn1Aj-*-VP$V%PQ_I-Z1^V;@jbo@?{UmZ-E~{3{8H?okb)-`VZl+7O}r5k3Zey zKMDQ{jLAO%n)<~DP5Y-n{to!bJpNvje-89YjO7D){Lh*E*=YBE@Sn)zA2IoB!2bYp z;ITaZ*G&E$;2#11t~`F!0EAY9>3b;&qi*Zel?f-4Af2i;-u-{8t^wE zhsWdJ0sc|&Kb~j5*|fh0{1V(IYeWv4_Di;xu>TK%??LWgk;lK(g;6b_)C&@MV10msNbOcw<@RXG=U~MrM+yY~lTrYs;$cJbml^BJDj~nVtW^GPY989Z4R)v-6J;U-6A>620sfsJ|1OZ{3h&d+-?GWcDg^(Q zZ{8whOaDCD{QV)mdL;{AQ!dkW{v9H%Z&aB7*1NfgtkYV7GFbs}kk&>Nx}i;_O7nT6 z`m7@3_vWfpYDmuy>_w~L;Hs!tT4Wi}kgub3yPOKXJ{xF|uEa=zx%&lfzd`Seo3 z`H)YaA~?_T=~D&gV?G_(?}#VyOT;u`6r@iVJq77y=6fCT?UxIl=lOIPsj^cPULr0u z-xFZxmf)A-?JMmRmY-p+8+L99cBi~vzMgTMXK4C^`T`-(Do~lD z=||86mAe!W)tdfq`a&T0_TYIyH?)i$%z-~ffjsm}J9bHhe{vl9{gPfL_R%AB6nW+X zd<66g*ysF_OniK896QsAUOaZb|3KS!8Onk@GXU+=^yGX+mwSDni_kB6*6%DYX!$SC zRUEeSs-|C~<0kj~5P3(^omPan9QLVS&iVVWY`07t(erDER$VxbKWoOJ*Mn}1ZC2a? z`h~@n=Jkq2Lefr|sG~1Jpgf^~_^IyKFZ6~-p5?&XLv|<$tCXPL=7_Ym)3Z>~IS!Ab zT7h+-!?7-XQOjR_m6DfdF`!p!I=`of?-?8do$NUC;fR)hM7PV+;|Wbasy9^ftPT4o zH2plC|BtEW#cwoyCw*-LMV?Io-;{Jo%KIq6^|er*%pQln7<7ui)BjaczD!)Kjmdiw zXz3=5RXJ-K7XP^G)3C*h$J2ixT*?E(CbPfJ6i{Dzj5 z^8GJnm0s9#Ge4%vyWc2$!GJ&R7wV-jc?!{BQ%f+4KOrOLhyG4~G!PVR`jL^kgr8j2hr9FBIVm3je#I3}Hz9X(Lnmo#BM55l?&qi$eiTa_Cr9+%R?#Jq|RylAl1PYN1qZ;cC=94i-4*Ukv4@n8o&Y4$@XA~V+&Y|-<*B>*E_ zQ>tp>D-Ficg1;@)gyti0vJB^F2Dp#`!iA-$jk4!2Q|SDUOCR=HsywO@hJ60lY$?k) z!K?8{XKvQ#a~s2XBxEam{bbS#Aa;E|-!U{;P(!Cat?&5hO@!O$b09-*Umw@a`xtC? z6A-#5!TNk&WGH_T4?f*qpg8gU1ipW8D`>d1nEHIKWXShDAR-Idu$PaaLiZTBeLjCO z)R$-TJ`2k+{5bUKo(0$WoXSvdTgLd$KHLq2V#@k_o@Lmh1)cHZ{_oTJ>$M!8dl?Sc z^l1y?jNfNLqnPl0Bid@oqM_clXrl7ftN=;j&#rH1J%-(OVc-t)g7!&v{T?mAko{#d zTxUq<47)z>;~0LJ1Emdc`)uzKhd!U*8S?!qmZ!0@mqVyf`#gTUPi1((46M>(zuCsO z9Qw}p2cBd>4V~@($f3{o4H(KdM%ZjP+kXZ;I&0G$qQd7!ey^ZYp6d*shfX>ESfB4h zjI1SVR=%m4RcHNQgFzu;eZF78?`<5U;G%FCS&zr@Ab2Fg`g~twU>#}U*`WgFC+jo( zJverK^ZrMTQrV$^`N?_={|Jsu&=g8vD=t_4XPi;gr|mP)vNj zi$9`OnG}Vv{sIS`_3hBiU7PH|8dd4m4$yVTg+KO(rxnc)_FZYH&+3f|e#gP&c3GB= SpAHep8m?0k=Q|V}Rq;RX^UqrV literal 17048 zcmeHOe{@^beZR8u!+}H=5WodWL;}TWvEpQj;{XQ9v6AQ34sJ;JF-R2Il582 z6a(TDE#gxAUN1f>79qbtVusvj5J-*GUsFzN748HjyCX_&r`IVxrtBe6vYRhWkV8mJ zg=z=cEhK@;+vz`ELP8;!vfQlCBgI14sGAys#MEj>t`r-kSQJ~!>5yvou%c{7S+bi^ zb~DP3=_EOX#FXPnF`?t6D$h>a$q0!l=~C+cxgI9|mK$Vt4t>yo1yi>BH0)HUmBxn? z4*Pah-+XbYSN=0q%@u3nv7YAjYvSR?cr1|_Y8+~5ZfsufO((tUWV@H6dg_X;+jfeE zXW#x~Z~ga2cduG}=xcxW%(oxCdecYAZ}Nf4BOOYl&*3M!6bH$Tc0CHtz=*yU`KJM* z^QF%~;HeEyU`9`iXe1dG!C)+%?A^2}7)|$v5>XNDjVIF)5gkm$5;}={heE+x z&N~*I#tNr;pTW_%DGdRLH z7KCU%`ZelRr)~qN{#GMUjX*U5)d*B0P>nz}0@Vn7Xauy8U)E})3xB!>w^Z42y{0sw zjhw7KVcL{7ya7?^rnC61Tj2vo`F@g5O_q>u`Z49{R&;7Y=KqEAbc;AOF7y9DdAc>6 zIx6!oQl4%Jrw+^f3zVl@!KpEse~$8W3p+I|^V^Y+jv+78+Fy0#UfZqZ-q1$QPIvF< z%rAT&x3yY+*%u{g-49Z_auICK)vahJN$WmjwEV&pkxeuDm1yq2d%>f*OG=Ys4qtW-&F?9iS+i3c zY5fwkgqHiczEm4+eG{2tBbrp~$InX(e}=qc7uzwN`W%EiVS|p@qvalXS<7X{wcO5Q zTCVG8XD)E0GuL&v5V$}-7XmXxwETuUTtr$offQf3SSo3`z%<~S4cJTY(*|7BMjn|K znX90^n&8_3AEP)=&7cnY~BwS$%e?r3iBd4`|=8Tr_n$+?;&uXKA>5km_4g@H_ zp^2)>6^@ZZ#n(T83;C`IXq|#q5%LvQ`CmgmH4e?uz=hia?#xPf0Hf+Ht;i8&Y2B- z??S0G61d=CUz_1;cD(MuEfmOM*{~UI*vDa5{2>fvB+#%Qfj1gPjTsHhlr`+I^yU<~ zSuQvt1ry|ES!Dkn%QVxmUDB}`a;!)}{0j2qSR9TqcE90^400EEMDUdpYRGkC$eqTJ zo4}C6(CZq1**Phq)O+(~5^gDhmguMm8P0b2&yNrGShZ*K9bvO)IG zBz(aXE`m@E?O*J#(61AtEp`;cU}Ch%j!qC-Ye!EL>P8f%{kijgIcmQN2h7-o;0Sf< zXuv&EbZiP-sC)dg2%DN^zkp$RhhRX-TFOz3CZiS__4iuKcgXT*%<^X*eulf`rT1sY z{R`k#e?0n2A?t(;(T49kjc{(VfSlu z;X-yP&~r2$e?VMkK2O%2`7CK``8-ttzsLbC|6OuV%V)`Xy3E{51M&t00aqAzE?X;2 z43c|^&R$r@8|RP0c`|Hm0#N)D@H{9IvP(z5lcicE-#+@dtXpLcWXS_V>+vkPVen68 z$rpn^U^tYQEx7j{S#_;hbthE~|KvcB&S4-t{0C!WW|vHQX&M}CLaXf2EMy5qctjz) z9voc-3)vQMbp0!2ZwE(LzCzXqj;?uyY&$r*+7+@IIC{)c$aaFGhaH7%H#mB1Q^@WB zM-Mts^_~jdUdR%9l~fIb`-tTF!O`WYkd1@;nB)e*(G$HwRtJa1fExmLqvRe2cZKAJ z!Cfi21K_R)hpNXa46QV;EPMO>plbbZTvx-AC)2A!-E1}T`j-iF;z&-z5 z7q}U4%^Tz3E`Zy+?{nb9k0AY76WqTTXh5 zUZ)m%FeBy;DMD$=6|y&iTZRY~vJK$QO70eLw_tQ(=z-fVx%J@UQrZIUe#zYq?i;cc zAGmiV*AA{0Qp{g!pO*gt)rDzHp;n!ZX-oqP)0l=fP2-0y>B=4N$jzAN&Ew}uaMG=& zNbwXd0Qc4U&26|GFv^Shg2!F30+Z)p(=}#szDT#FV zc)~X)GkYT`J(G%f!WmCA*4rP8q&!wTyicB2Z*G}4g{^;rGD5zf3uQcm@d#e>v0Q}2 zlAFTxuZ~L~BA)I#WaZ4* zP^q%M5Ofzu`WpNjCS8|%i>v;Vb(em&c39kb&21n5of}sYO!nDwX8BRj&V2BsF}#0D1)SU7(`P<^H3Z4p;pX&Vb94Ul4FLJif5q z)%4gR&DAopc&p3zkgLV-YVx}p+FYJCS3UIGT($DOE%nDZ${{zasTzT51ga6JMxYvj zY6Pkgs79a~f&Wht;O`Cj`$E3wrEeH1;U$id)CY}tX(iLiYYa-ylPU3cjMo}j^P4=S zW`56jolXAk#Zr=>TDs>)qKCwk%dCxYDDC@RYcIyvC620VGxNrc~xzRKxJ%Nai`t zSQg6s^-7LqpUj(n%hLbvfB3s{d(F*i9Bfha9z~;y?p5?LMZcsdmvf)b;I?kwe5!Hx3+2R+9tNDOzCS|-XCDqaN^kof9GC~J4KNPfJNZM zm*PDBEHJ)XU1*NGa(t0FKFjgNg8Q)?uNBd2u=7M)5hQ#;ttThw`7Dr<@n(!T%Mw z#}Y?o-vEADO}*gj0OLcl9G9q77i9Si5yD@SK0M{Z7AS*@N`H^)NBPVTvhU$=V;=SU zl%gUo)viP820=c9gzTHD9NyQ)&r+|0K9ytduLf1lHdQZA`$mbE*GaiMfm3_!<$Mab zXRf-40AE=F7riMxt!JW9Z?Bl$y%N+1g4iFEh@`Q1C7cZQ#gjducrdIdQ|VwRGbDPG z19)PtN5bBw${MtlCKe2(QlWjpNJ3BT6VX&?AQB8`1_t)Q#F7g_Q!i7+ivay@e*i88 zgIl)yy8^+$w)P-4&XlW$MX>$;ZT_x~&E*ogYX=baT?GT0DnV=CE`nP-?`rdR2JhOk zLQ&yZBA7`>5Wm@` zQzr=W>@I%k0%=b=t!kEgpyZw^TV2@b#Jxj1pek-_D&JgHR)FxP_YLTw9#B1H(0=Cd zIwg`C6y8Kqk9hkM8E;P}h7EbKu!8(;9gTXZPe@sRDBUl-;e82|XHY$5Nbn9R9m7i| zsirbP$WoDbhzt}r7}teYM!^f#+m}REj|}0LhBB0rvOm3%el>Xe!zhGvhN&@%4GZQ` zLueq@i|Ug)l?>--TzC;%;l(@}!1SmzG5>cMt&ecZ!L`XqeE-Un*GEb$b(tqhmt9(u zusz@BGNt!C*2L#a#+t!c?Te})rXE&Q)NbDn{5`BuxPHEGX3F*RI*!*%TOq*0qcK_Ld{a`4jY|raTrsGP{9zSmX0cGE&^mv`X^oYftZV~M9djc56 zgxA${X_ZM)bz7l8!&fr{CWpgn?@@M4hpo!sZN-ZxZT5$i0#o*vi{U)euh{JQy3O=5 zen6lK;QG0|r)~DU-eJn?dDf@CvZik#L+$7O6CNd1bTtVriT!5iFTq&t?fa`AWJN{o z_5YpCp4V9>{Vnys0()AU&>W(~_u0Jf+U_ssnf?$qbvW3b*KN~{RNCx#Gjg+ew*MIf zH1^n@*LS?HeNy?)U9}mHnRM?)^fv491L~1aI`OEf9--N_!FMLY1$)MdT%Y^Ni zz5{{Pp6{Q#l|B1ux99wMFjN-%zsF}t_9%O<$3Ts`m?wG>2i33C36hEJZ)QMI(xqgj z=GZkv^7ji|KV2M<=sM)Z!T#|1hvo