From 3bb3c8d459c23fd413769690ab216d9c56230dcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Snorre=20S=C3=A6ther?= <112980079+Snorre98@users.noreply.github.com> Date: Tue, 5 Nov 2024 21:53:25 +0100 Subject: [PATCH 01/11] Improve UX of recruitment users without three interview page (#1601) * renamed applicationsWithoutInterview and and changd navigation link * UX improvment --- .../RecruitmentWithoutInterviewTable.tsx | 5 +-- .../components/WithoutInterviewList.tsx | 36 ++++++++++++++++--- .../components/WithoutInterviewModal.tsx | 22 ++++++++---- frontend/src/i18n/constants.ts | 1 + frontend/src/i18n/translations.ts | 2 ++ 5 files changed, 53 insertions(+), 13 deletions(-) diff --git a/frontend/src/Components/RecruitmentWithoutInterviewTable/RecruitmentWithoutInterviewTable.tsx b/frontend/src/Components/RecruitmentWithoutInterviewTable/RecruitmentWithoutInterviewTable.tsx index 3925b2e87..e07800bef 100644 --- a/frontend/src/Components/RecruitmentWithoutInterviewTable/RecruitmentWithoutInterviewTable.tsx +++ b/frontend/src/Components/RecruitmentWithoutInterviewTable/RecruitmentWithoutInterviewTable.tsx @@ -24,7 +24,7 @@ export function RecruitmentWithoutInterviewTable({ applicants }: RecruitmentWith { content: t(KEY.common_phonenumber), sortable: true }, { content: t(KEY.recruitment_applicant_top_position), sortable: true }, { content: t(KEY.recruitment_number_of_applications), sortable: true }, - { content: t(KEY.common_processed), sortable: true }, + { content: t(KEY.recruitment_interview_planned), sortable: true }, ]; function filterUsers(): RecruitmentUserDto[] { @@ -64,7 +64,8 @@ export function RecruitmentWithoutInterviewTable({ applicants }: RecruitmentWith value: user.applications_without_interview ? user.applications_without_interview.length : 0, content: ( ), diff --git a/frontend/src/Components/RecruitmentWithoutInterviewTable/components/WithoutInterviewList.tsx b/frontend/src/Components/RecruitmentWithoutInterviewTable/components/WithoutInterviewList.tsx index 3d41bd7a3..e9a3234aa 100644 --- a/frontend/src/Components/RecruitmentWithoutInterviewTable/components/WithoutInterviewList.tsx +++ b/frontend/src/Components/RecruitmentWithoutInterviewTable/components/WithoutInterviewList.tsx @@ -1,7 +1,8 @@ +import { Icon } from '@iconify/react'; import { useTranslation } from 'react-i18next'; -import { Link } from '~/Components'; +import { Link, Text } from '~/Components'; import { Table } from '~/Components/Table'; -import type { RecruitmentApplicationDto } from '~/dto'; +import type { RecruitmentApplicationDto, RecruitmentUserDto } from '~/dto'; import { KEY } from '~/i18n/constants'; import { reverse } from '~/named-urls'; import { ROUTES } from '~/routes'; @@ -10,17 +11,23 @@ import styles from './WithoutInterview.module.scss'; type WithoutInterviewListProps = { applications: RecruitmentApplicationDto[]; + user: RecruitmentUserDto; + applicationsWithoutInterview: RecruitmentApplicationDto[]; }; -export function WithoutInterviewList({ applications }: WithoutInterviewListProps) { +export function WithoutInterviewList({ applications, user, applicationsWithoutInterview }: WithoutInterviewListProps) { const { t } = useTranslation(); const tableColumns = [ { content: t(KEY.recruitment_position), sortable: true }, + + { content: t(KEY.recruitment_interview_planned), sortable: true }, { content: t(KEY.recruitment_priority), sortable: true }, ]; function applicationToRow(application: RecruitmentApplicationDto) { + const hasInterview = !applicationsWithoutInterview.some((app) => app.id === application.id); + return { cells: [ { @@ -28,9 +35,11 @@ export function WithoutInterviewList({ applications }: WithoutInterviewListProps content: ( @@ -38,12 +47,29 @@ export function WithoutInterviewList({ applications }: WithoutInterviewListProps ), }, + + { + value: hasInterview ? 1 : 0, + content: ( + + ), + }, application.applicant_priority, ], }; } + return (
+ + {user.first_name} {user.last_name} + applicationToRow(application))} /> ); diff --git a/frontend/src/Components/RecruitmentWithoutInterviewTable/components/WithoutInterviewModal.tsx b/frontend/src/Components/RecruitmentWithoutInterviewTable/components/WithoutInterviewModal.tsx index 2318b9e60..db9fc67a8 100644 --- a/frontend/src/Components/RecruitmentWithoutInterviewTable/components/WithoutInterviewModal.tsx +++ b/frontend/src/Components/RecruitmentWithoutInterviewTable/components/WithoutInterviewModal.tsx @@ -1,21 +1,26 @@ import { useState } from 'react'; import { Button, IconButton, Modal } from '~/Components'; -import type { RecruitmentApplicationDto } from '~/dto'; +import type { RecruitmentApplicationDto, RecruitmentUserDto } from '~/dto'; import styles from './WithoutInterview.module.scss'; import { WithoutInterviewList } from './WithoutInterviewList'; type WithoutInterviewModalProps = { + user: RecruitmentUserDto; applications: RecruitmentApplicationDto[]; - applications_without_interview: RecruitmentApplicationDto[]; + applicationsWithoutInterview: RecruitmentApplicationDto[]; }; -export function WithoutInterviewModal({ applications, applications_without_interview }: WithoutInterviewModalProps) { +export function WithoutInterviewModal({ + applications, + applicationsWithoutInterview, + user, +}: WithoutInterviewModalProps) { const [withoutInterviewModal, setWithoutInterviewModal] = useState(false); return ( <> - setWithoutInterviewModal(false)} /> - + + ); diff --git a/frontend/src/i18n/constants.ts b/frontend/src/i18n/constants.ts index 6f8a67974..a237bf674 100644 --- a/frontend/src/i18n/constants.ts +++ b/frontend/src/i18n/constants.ts @@ -280,6 +280,7 @@ export const KEY = { recruitment_interviewer: 'recruitment_interviewer', recruitment_interviewers: 'recruitment_interviewers', recruitment_interviews: 'recruitment_interviews', + recruitment_interview_planned: 'recruitment_interview_planned', recruitment_no_interviews: 'recruitment_no_interviews', recruitment_interview_set: 'recruitment_interview_set', recruitment_interview_groups: 'recruitment_interview_groups', diff --git a/frontend/src/i18n/translations.ts b/frontend/src/i18n/translations.ts index 1e3a3b20e..5e693cd43 100644 --- a/frontend/src/i18n/translations.ts +++ b/frontend/src/i18n/translations.ts @@ -262,6 +262,7 @@ export const nb = prepareTranslations({ [KEY.recruitment_not_applied]: 'Du har ikke sendt søknader til noen stillinger ennå', [KEY.recruitment_will_be_anonymized]: 'All info relatert til dine søknader vil bli slettet 3 uker etter opptaket', [KEY.recruitment_interviews]: 'Intervjuer', + [KEY.recruitment_interview_planned]: 'Intervjuer planlagt', [KEY.recruitment_interviewer]: 'Intervjuer', [KEY.recruitment_interviewers]: 'Intervjuere', [KEY.recruitment_no_interviews]: 'Ingen intervjuer', @@ -747,6 +748,7 @@ export const en = prepareTranslations({ [KEY.recruitment_will_be_anonymized]: 'All info related to the applications will be anonymized three weeks after the recruitment is over', [KEY.recruitment_interviews]: 'Interviews', + [KEY.recruitment_interview_planned]: 'Interviews planned', [KEY.recruitment_interviewer]: 'Interviewer', [KEY.recruitment_interviewers]: 'Interviewers', [KEY.recruitment_no_interviews]: 'No interviews', From 329b0d9ae01c85624db4f92de42acaf1957251bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Snorre=20S=C3=A6ther?= <112980079+Snorre98@users.noreply.github.com> Date: Tue, 5 Nov 2024 22:27:47 +0100 Subject: [PATCH 02/11] 1597 bug position route not related to recruitment (#1598) * refactor in organization recruitment page * improve organization recruitment page refactor * removed comment * refactor to use recruitmentId --- .../Components/GangPosition/GangPosition.tsx | 2 +- .../GangPositionDropdown.tsx | 7 ++++--- .../GangTypeContainer/GangTypeContainer.tsx | 17 ++++++++++------- .../PositionsTable/PositionsTable.tsx | 8 ++++---- .../OrganizationRecruitmentPage.tsx | 3 +-- .../RecruitmentApplicationFormPage.tsx | 4 ++-- .../RecruitmentApplicationsOverviewPage.tsx | 4 ++-- .../RecruitmentGangAdminPage.tsx | 1 + .../RecruitmentRecruiterDashboardPage.tsx | 1 + frontend/src/routes/frontend.ts | 2 +- 10 files changed, 27 insertions(+), 22 deletions(-) diff --git a/frontend/src/Pages/OrganizationRecruitmentPage/Components/GangPosition/GangPosition.tsx b/frontend/src/Pages/OrganizationRecruitmentPage/Components/GangPosition/GangPosition.tsx index 0b0a32026..e22c843c0 100644 --- a/frontend/src/Pages/OrganizationRecruitmentPage/Components/GangPosition/GangPosition.tsx +++ b/frontend/src/Pages/OrganizationRecruitmentPage/Components/GangPosition/GangPosition.tsx @@ -37,7 +37,7 @@ export function GangPosition({ type, recruitmentPositions }: GangItemProps) { diff --git a/frontend/src/Pages/OrganizationRecruitmentPage/Components/GangPositionDropdown/GangPositionDropdown.tsx b/frontend/src/Pages/OrganizationRecruitmentPage/Components/GangPositionDropdown/GangPositionDropdown.tsx index 21743ab80..931798285 100644 --- a/frontend/src/Pages/OrganizationRecruitmentPage/Components/GangPositionDropdown/GangPositionDropdown.tsx +++ b/frontend/src/Pages/OrganizationRecruitmentPage/Components/GangPositionDropdown/GangPositionDropdown.tsx @@ -7,12 +7,13 @@ import styles from './GangPositionDropdown.module.scss'; type GangItemProps = { type: GangTypeDto; + recruitmentId?: string; recruitmentPositions?: RecruitmentPositionDto[]; }; //TODO: DO IN ISSUE #1121, only get gang types recruiting from backend // TODO: so the filtering should be done from the backend -export function GangPositionDropdown({ type, recruitmentPositions }: GangItemProps) { +export function GangPositionDropdown({ type, recruitmentPositions, recruitmentId }: GangItemProps) { const filteredGangs = type.gangs .map((gang) => { const filteredPositions = recruitmentPositions?.filter((pos) => pos.gang.id === gang.id); @@ -30,7 +31,7 @@ export function GangPositionDropdown({ type, recruitmentPositions }: GangItemPro @@ -39,7 +40,7 @@ export function GangPositionDropdown({ type, recruitmentPositions }: GangItemPro diff --git a/frontend/src/Pages/OrganizationRecruitmentPage/Components/GangTypeContainer/GangTypeContainer.tsx b/frontend/src/Pages/OrganizationRecruitmentPage/Components/GangTypeContainer/GangTypeContainer.tsx index 9c32c12cb..ccfdf7185 100644 --- a/frontend/src/Pages/OrganizationRecruitmentPage/Components/GangTypeContainer/GangTypeContainer.tsx +++ b/frontend/src/Pages/OrganizationRecruitmentPage/Components/GangTypeContainer/GangTypeContainer.tsx @@ -1,19 +1,17 @@ import { useEffect, useState } from 'react'; +import { useParams } from 'react-router-dom'; import { SamfundetLogoSpinner } from '~/Components'; import { getGangList, getRecruitmentPositions } from '~/api'; import type { GangTypeDto, RecruitmentPositionDto } from '~/dto'; import { GangPositionDropdown } from '../GangPositionDropdown'; -type GangTypeContainerProps = { - recruitmentId: string; -}; - -export function GangTypeContainer({ recruitmentId = '-1' }: GangTypeContainerProps) { +export function GangTypeContainer() { const [recruitmentPositions, setRecruitmentPositions] = useState(); const [recruitingGangTypes, setRecruitingGangs] = useState(); const [loading, setLoading] = useState(true); - + const { recruitmentId } = useParams(); useEffect(() => { + if (!recruitmentId) return; Promise.all([getRecruitmentPositions(recruitmentId), getGangList()]) .then(([recruitmentRes, gangsRes]) => { setRecruitmentPositions(recruitmentRes.data); @@ -31,7 +29,12 @@ export function GangTypeContainer({ recruitmentId = '-1' }: GangTypeContainerPro ) : ( <> {recruitingGangTypes?.map((gangType) => ( - + ))} ); diff --git a/frontend/src/Pages/OrganizationRecruitmentPage/Components/PositionsTable/PositionsTable.tsx b/frontend/src/Pages/OrganizationRecruitmentPage/Components/PositionsTable/PositionsTable.tsx index 1daf2862f..eb0eaf61c 100644 --- a/frontend/src/Pages/OrganizationRecruitmentPage/Components/PositionsTable/PositionsTable.tsx +++ b/frontend/src/Pages/OrganizationRecruitmentPage/Components/PositionsTable/PositionsTable.tsx @@ -21,15 +21,15 @@ export function PositionsTable({ currentSelectedGang, setLoading, loading }: Pos const [positions, setPositions] = useState([]); const navigate = useNavigate(); const { t } = useTranslation(); - const recruitmentId = useParams(); + const { recruitmentId } = useParams(); const { organizationTheme } = useOrganizationContext(); useEffect(() => { - if (!currentSelectedGang || !recruitmentId.recruitmentId) { + if (!currentSelectedGang || !recruitmentId) { return; } setLoading(true); - getRecruitmentPositionsGangForApplicant(recruitmentId.recruitmentId, currentSelectedGang.id) + getRecruitmentPositionsGangForApplicant(recruitmentId, currentSelectedGang.id) .then((response) => { setPositions(response.data); setLoading(false); @@ -48,7 +48,7 @@ export function PositionsTable({ currentSelectedGang, setLoading, loading }: Pos const tableData = positions.map((item) => { const positionPageURL = reverse({ pattern: ROUTES.frontend.recruitment_application, - urlParams: { positionId: item.id, gangId: item.id }, + urlParams: { positionId: item.id, recruitmentId: recruitmentId }, }); return { cells: [ diff --git a/frontend/src/Pages/OrganizationRecruitmentPage/OrganizationRecruitmentPage.tsx b/frontend/src/Pages/OrganizationRecruitmentPage/OrganizationRecruitmentPage.tsx index 8d2479493..eb0b49c75 100644 --- a/frontend/src/Pages/OrganizationRecruitmentPage/OrganizationRecruitmentPage.tsx +++ b/frontend/src/Pages/OrganizationRecruitmentPage/OrganizationRecruitmentPage.tsx @@ -113,8 +113,7 @@ export function OrganizationRecruitmentPage() { Placeholder for tag-autocomplete search {/*^^^ issue #1275 */} - {recruitmentId && - (viewAllPositions ? : )} + {recruitmentId && (viewAllPositions ? : )} {recruitment?.separate_positions && recruitment.separate_positions.length > 0 && ( )} diff --git a/frontend/src/Pages/RecruitmentApplicationFormPage/RecruitmentApplicationFormPage.tsx b/frontend/src/Pages/RecruitmentApplicationFormPage/RecruitmentApplicationFormPage.tsx index e28efb093..fe6f0d720 100644 --- a/frontend/src/Pages/RecruitmentApplicationFormPage/RecruitmentApplicationFormPage.tsx +++ b/frontend/src/Pages/RecruitmentApplicationFormPage/RecruitmentApplicationFormPage.tsx @@ -40,7 +40,7 @@ export function RecruitmentApplicationFormPage() { const [loading, setLoading] = useState(true); - const { positionId } = useParams(); + const { positionId, recruitmentId } = useParams(); useTitle(recruitmentPosition ? (dbT(recruitmentPosition, 'name') as string) : ''); @@ -175,7 +175,7 @@ export function RecruitmentApplicationFormPage() { navigate({ url: reverse({ pattern: ROUTES.frontend.recruitment_application, - urlParams: { positionId: pos.id, gangId: pos.gang.id }, + urlParams: { positionId: pos.id, recruitmentId: recruitmentId }, }), }); }} diff --git a/frontend/src/Pages/RecruitmentApplicationsOverviewPage/RecruitmentApplicationsOverviewPage.tsx b/frontend/src/Pages/RecruitmentApplicationsOverviewPage/RecruitmentApplicationsOverviewPage.tsx index d36979d25..c6d3cebc3 100644 --- a/frontend/src/Pages/RecruitmentApplicationsOverviewPage/RecruitmentApplicationsOverviewPage.tsx +++ b/frontend/src/Pages/RecruitmentApplicationsOverviewPage/RecruitmentApplicationsOverviewPage.tsx @@ -70,7 +70,7 @@ export function RecruitmentApplicationsOverviewPage() { pattern: ROUTES.frontend.recruitment_application, urlParams: { positionId: application.recruitment_position.id, - gangId: application.recruitment_position.gang.id, + recruitmentId: recruitmentId, }, })} className={styles.position_name} @@ -131,7 +131,7 @@ export function RecruitmentApplicationsOverviewPage() { pattern: ROUTES.frontend.recruitment_application, urlParams: { positionId: application.recruitment_position.id, - gangId: application.recruitment_position.gang.id, + recruitmentId: recruitmentId, }, })} className={styles.withdrawnLink} diff --git a/frontend/src/PagesAdmin/RecruitmentGangAdminPage/RecruitmentGangAdminPage.tsx b/frontend/src/PagesAdmin/RecruitmentGangAdminPage/RecruitmentGangAdminPage.tsx index b44137a47..936037ebd 100644 --- a/frontend/src/PagesAdmin/RecruitmentGangAdminPage/RecruitmentGangAdminPage.tsx +++ b/frontend/src/PagesAdmin/RecruitmentGangAdminPage/RecruitmentGangAdminPage.tsx @@ -99,6 +99,7 @@ export function RecruitmentGangAdminPage() { pattern: ROUTES.frontend.recruitment_application, urlParams: { positionId: recruitmentPosition.id, + recruitmentId: recruitmentId, }, }), ); diff --git a/frontend/src/PagesAdmin/RecruitmentRecruiterDashboardPage/RecruitmentRecruiterDashboardPage.tsx b/frontend/src/PagesAdmin/RecruitmentRecruiterDashboardPage/RecruitmentRecruiterDashboardPage.tsx index 3afb7fb29..a1e5f76d1 100644 --- a/frontend/src/PagesAdmin/RecruitmentRecruiterDashboardPage/RecruitmentRecruiterDashboardPage.tsx +++ b/frontend/src/PagesAdmin/RecruitmentRecruiterDashboardPage/RecruitmentRecruiterDashboardPage.tsx @@ -93,6 +93,7 @@ export function RecruitmentRecruiterDashboardPage() { pattern: ROUTES.frontend.recruitment_application, urlParams: { positionId: application.recruitment_position.id, + recruitmentId: recruitmentId, }, })} > diff --git a/frontend/src/routes/frontend.ts b/frontend/src/routes/frontend.ts index e29a2550d..4bf28443b 100644 --- a/frontend/src/routes/frontend.ts +++ b/frontend/src/routes/frontend.ts @@ -19,7 +19,7 @@ export const ROUTES_FRONTEND = { contributors: '/contributors', // Recruitment: recruitment: '/recruitment/', - recruitment_application: '/recruitment/position/:positionId/', + recruitment_application: '/recruitment/:recruitmentId/position/:positionId/', recruitment_application_overview: '/recruitment/:recruitmentId/my-applications/', organization_recruitment: '/recruitment/:recruitmentId/', contact: '/contact', From 24b97cab6fb21d9352c289844f3f688243c90a67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Snorre=20S=C3=A6ther?= <112980079+Snorre98@users.noreply.github.com> Date: Tue, 5 Nov 2024 23:14:43 +0100 Subject: [PATCH 03/11] refactors the "without interview table" to use the correct link (#1599) --- .../RecruitmentWithoutInterviewTable.tsx | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/frontend/src/Components/RecruitmentWithoutInterviewTable/RecruitmentWithoutInterviewTable.tsx b/frontend/src/Components/RecruitmentWithoutInterviewTable/RecruitmentWithoutInterviewTable.tsx index e07800bef..a414c3bc0 100644 --- a/frontend/src/Components/RecruitmentWithoutInterviewTable/RecruitmentWithoutInterviewTable.tsx +++ b/frontend/src/Components/RecruitmentWithoutInterviewTable/RecruitmentWithoutInterviewTable.tsx @@ -3,6 +3,7 @@ import { useTranslation } from 'react-i18next'; import { Table } from '~/Components/Table'; import type { RecruitmentUserDto } from '~/dto'; import { KEY } from '~/i18n/constants'; +import { reverse } from '~/named-urls'; import { ROUTES } from '~/routes'; import { dbT } from '~/utils'; import { InputField } from '../InputField'; @@ -54,7 +55,19 @@ export function RecruitmentWithoutInterviewTable({ applicants }: RecruitmentWith return [ { value: `${user.first_name} ${user.last_name}`, - content: {`${user.first_name} ${user.last_name}`}, + content: ( + + {user.first_name} {user.last_name} + + ), }, user.email, user.phone_number, From 0fa76f0dc86eacd9a0cfdbc0546b4b0885c83fb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Snorre=20S=C3=A6ther?= <112980079+Snorre98@users.noreply.github.com> Date: Tue, 5 Nov 2024 23:33:27 +0100 Subject: [PATCH 04/11] adds new column and implements type map (#1600) --- .../RecruitmentGangAllApplicantsAdminPage.tsx | 10 ++++++++-- frontend/src/dto.ts | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/frontend/src/PagesAdmin/RecruitmentGangAllApplicantsAdminPage/RecruitmentGangAllApplicantsAdminPage.tsx b/frontend/src/PagesAdmin/RecruitmentGangAllApplicantsAdminPage/RecruitmentGangAllApplicantsAdminPage.tsx index 1dfb3a1dd..e35d79a0f 100644 --- a/frontend/src/PagesAdmin/RecruitmentGangAllApplicantsAdminPage/RecruitmentGangAllApplicantsAdminPage.tsx +++ b/frontend/src/PagesAdmin/RecruitmentGangAllApplicantsAdminPage/RecruitmentGangAllApplicantsAdminPage.tsx @@ -12,6 +12,7 @@ import { STATUS } from '~/http_status_codes'; import { KEY } from '~/i18n/constants'; import { reverse } from '~/named-urls'; import { ROUTES } from '~/routes'; +import { RecruitmentPriorityChoicesMapping, RecruitmentStatusChoicesMapping } from '~/types'; import { dbT } from '~/utils'; import { AdminPageLayout } from '../AdminPageLayout/AdminPageLayout'; import styles from './RecruitmentGangAllApplicantsAdminPage.module.scss'; @@ -64,7 +65,6 @@ export function RecruitmentGangAllApplicantsAdminPage() { setRecruitment(resp.data); }) .catch((data) => { - // TODO add error pop up message? if (data.request.status === STATUS.HTTP_404_NOT_FOUND) { navigate({ url: ROUTES.frontend.admin_recruitment }); } @@ -81,6 +81,7 @@ export function RecruitmentGangAllApplicantsAdminPage() { { content: t(KEY.recruitment_position), sortable: true }, { content: t(KEY.recruitment_interview_time), sortable: true }, { content: t(KEY.recruitment_interview_location), sortable: true }, + { content: t(KEY.recruitment_recruiter_priority), sortable: true }, { content: t(KEY.recruitment_recruiter_status), sortable: true }, ]; @@ -106,7 +107,12 @@ export function RecruitmentGangAllApplicantsAdminPage() { { content: {dbT(application.recruitment_position, 'name')} }, application.interview?.interview_time, application.interview?.interview_location, - application.recruiter_status, + application.recruiter_priority !== undefined + ? RecruitmentPriorityChoicesMapping[application.recruiter_priority] + : 'N/A', + application.recruiter_status !== undefined + ? RecruitmentStatusChoicesMapping[application.recruiter_status] + : 'N/A', ], }; }); diff --git a/frontend/src/dto.ts b/frontend/src/dto.ts index 4cd54cb1c..3a538bd24 100644 --- a/frontend/src/dto.ts +++ b/frontend/src/dto.ts @@ -505,7 +505,7 @@ export type RecruitmentApplicationDto = { recruitment: number; user: UserDto; applicant_priority: number; - recruiter_priority?: number | string; + recruiter_priority?: number; recruiter_status?: number; applicant_state?: number; created_at: string; From 0033466b2df63d2895ca4b2feab4494281dda78c Mon Sep 17 00:00:00 2001 From: Robin <16273164+robines@users.noreply.github.com> Date: Wed, 6 Nov 2024 07:33:08 +0100 Subject: [PATCH 05/11] Add value clamping to NumberInput (enabled by default) (#1583) --- .../Components/NumberInput/NumberInput.tsx | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/frontend/src/Components/NumberInput/NumberInput.tsx b/frontend/src/Components/NumberInput/NumberInput.tsx index 4b9b4cce5..bfa44b165 100644 --- a/frontend/src/Components/NumberInput/NumberInput.tsx +++ b/frontend/src/Components/NumberInput/NumberInput.tsx @@ -4,16 +4,44 @@ import { Input, type InputProps } from '~/Components'; export interface NumberInputProps extends Omit { onChange?: (...event: unknown[]) => void; allowDecimal?: boolean; + clamp?: boolean; } export const NumberInput = React.forwardRef( - ({ onChange, value, type, allowDecimal = true, ...props }, ref) => { + ({ onChange, value, type, min, max, allowDecimal = true, clamp = true, onBlur, ...props }, ref) => { const [inputValue, setInputValue] = useState(value || ''); useEffect(() => { setInputValue(value || ''); }, [value]); + const canClamp = clamp && (min !== undefined || max !== undefined); + + function clampValue(n: number) { + if (!canClamp) { + return n; + } + let clamped = n; + if (min !== undefined) { + clamped = Math.max(clamped, Number(min)); + } + if (max !== undefined) { + clamped = Math.min(clamped, Number(max)); + } + return clamped; + } + + function handleOnBlur(event: React.FocusEvent) { + if (canClamp) { + const clamped = clampValue(Number(event.target.value) || 0); + if (!Number.isNaN(clamped)) { + setInputValue(clamped); + onChange?.(clamped); + } + } + onBlur?.(event); + } + function isValidPartial(s: string) { // Allows for partial inputs like "-" or "1." const re = allowDecimal ? /^-?[0-9]*\.?[0-9]*$/ : /^-?[0-9]*$/; @@ -69,7 +97,7 @@ export const NumberInput = React.forwardRef( if (event.key === 'ArrowUp' || event.key === 'ArrowDown') { event.preventDefault(); const add = event.key === 'ArrowUp' ? 1 : -1; - const newVal = (Number(inputValue) || 0) + add; + const newVal = clampValue((Number(inputValue) || 0) + add); if (!Number.isNaN(newVal)) { setInputValue(newVal); onChange?.(newVal); @@ -99,6 +127,7 @@ export const NumberInput = React.forwardRef( onKeyDown={onKeyDown} onBeforeInput={onBeforeInput} onChange={handleOnChange} + onBlur={handleOnBlur} {...props} /> ); From 561201707e90b476f94e65888e78f97eff027359 Mon Sep 17 00:00:00 2001 From: Robin <16273164+robines@users.noreply.github.com> Date: Wed, 6 Nov 2024 14:36:47 +0100 Subject: [PATCH 06/11] Create queryKey factory (#1580) --- .../InformationAdminPage.tsx | 3 ++- .../components/RoleForm/RoleForm.tsx | 3 ++- .../RolesAdminPage/RolesAdminPage.tsx | 3 ++- frontend/src/queryKeys.ts | 23 +++++++++++++++++++ 4 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 frontend/src/queryKeys.ts diff --git a/frontend/src/PagesAdmin/InformationAdminPage/InformationAdminPage.tsx b/frontend/src/PagesAdmin/InformationAdminPage/InformationAdminPage.tsx index 63da9f401..b2640fb00 100644 --- a/frontend/src/PagesAdmin/InformationAdminPage/InformationAdminPage.tsx +++ b/frontend/src/PagesAdmin/InformationAdminPage/InformationAdminPage.tsx @@ -7,6 +7,7 @@ import { deleteInformationPage, getInformationPages } from '~/api'; import { useCustomNavigate, useTitle } from '~/hooks'; import { KEY } from '~/i18n/constants'; import { reverse } from '~/named-urls'; +import { infoPageKeys } from '~/queryKeys'; import { ROUTES } from '~/routes'; import { dbT, lowerCapitalize } from '~/utils'; import { AdminPageLayout } from '../AdminPageLayout/AdminPageLayout'; @@ -18,7 +19,7 @@ export function InformationAdminPage() { // TODO: add permissions on render const { data, isLoading } = useQuery({ - queryKey: ['informationpages'], + queryKey: infoPageKeys.all, queryFn: getInformationPages, }); diff --git a/frontend/src/PagesAdmin/RoleFormAdminPage/components/RoleForm/RoleForm.tsx b/frontend/src/PagesAdmin/RoleFormAdminPage/components/RoleForm/RoleForm.tsx index c9322116b..d1de3c3c3 100644 --- a/frontend/src/PagesAdmin/RoleFormAdminPage/components/RoleForm/RoleForm.tsx +++ b/frontend/src/PagesAdmin/RoleFormAdminPage/components/RoleForm/RoleForm.tsx @@ -22,6 +22,7 @@ import { MultiSelect } from '~/Components/MultiSelect'; import { createRole, editRole, getPermissions } from '~/api'; import type { RoleDto } from '~/dto'; import { KEY } from '~/i18n/constants'; +import { permissionKeys } from '~/queryKeys'; import { ROLE_CONTENT_TYPE, ROLE_NAME } from '~/schema/role'; import styles from './RoleForm.module.scss'; @@ -47,7 +48,7 @@ export function RoleForm({ role }: Props) { isLoading, isError, } = useQuery({ - queryKey: ['permissions'], + queryKey: permissionKeys.all, queryFn: getPermissions, }); diff --git a/frontend/src/PagesAdmin/RolesAdminPage/RolesAdminPage.tsx b/frontend/src/PagesAdmin/RolesAdminPage/RolesAdminPage.tsx index 96ec3bc2b..f1b22de49 100644 --- a/frontend/src/PagesAdmin/RolesAdminPage/RolesAdminPage.tsx +++ b/frontend/src/PagesAdmin/RolesAdminPage/RolesAdminPage.tsx @@ -9,6 +9,7 @@ import { getRoles } from '~/api'; import { useTitle } from '~/hooks'; import { KEY } from '~/i18n/constants'; import { reverse } from '~/named-urls'; +import { roleKeys } from '~/queryKeys'; import { ROUTES } from '~/routes'; import { lowerCapitalize } from '~/utils'; @@ -19,7 +20,7 @@ export function RolesAdminPage() { useTitle(title); const { data: roles, isLoading } = useQuery({ - queryKey: ['roles'], + queryKey: roleKeys.all, queryFn: getRoles, }); diff --git a/frontend/src/queryKeys.ts b/frontend/src/queryKeys.ts new file mode 100644 index 000000000..50e009dee --- /dev/null +++ b/frontend/src/queryKeys.ts @@ -0,0 +1,23 @@ +export const roleKeys = { + all: ['roles'] as const, + lists: () => [...roleKeys.all, 'list'] as const, + list: (filters: unknown[]) => [...roleKeys.lists(), { filters }] as const, + details: () => [...roleKeys.all, 'detail'] as const, + detail: (id: number) => [...roleKeys.details(), id] as const, +}; + +export const infoPageKeys = { + all: ['infopages'] as const, + lists: () => [...infoPageKeys.all, 'list'] as const, + list: (filters: unknown[]) => [...infoPageKeys.lists(), { filters }] as const, + details: () => [...infoPageKeys.all, 'detail'] as const, + detail: (slug: string) => [...infoPageKeys.details(), slug] as const, +}; + +export const permissionKeys = { + all: ['permissions'] as const, + lists: () => [...permissionKeys.all, 'list'] as const, + list: (filters: unknown[]) => [...permissionKeys.lists(), { filters }] as const, + details: () => [...permissionKeys.all, 'detail'] as const, + detail: (id: number) => [...permissionKeys.details(), id] as const, +}; From d1de3dab0b146b4c7d8e4be38b01d8845a69444d Mon Sep 17 00:00:00 2001 From: Robin <16273164+robines@users.noreply.github.com> Date: Wed, 6 Nov 2024 17:57:16 +0100 Subject: [PATCH 07/11] Restructure documentation (#1524) * Restructure documentation Also begin documentation of interview scheduling * Begin macos native install guide * Begin macos docker install guide * Add post-install instructions * Update data fetching docs * Add more info on main README * Undo definition list * Begin git setup guide * Update forms doc * Update numbers form section * Add editor setup guides * Update macos native docs * Add incomplete warnings * Add Dependency issues section to mac docker * Move WSL note * Resize files. Hooray for saving space :-) * Add FormDescription to form docs * typescript jsx -> tsx * tsx -> jsx (Github doesn't highlight tsx properly) * Add Dropdown docs * Separate dropdown example markdowns * Improve example consistency :-) * Add section for query key factory and data invalidation --- README.md | 53 +------ docs/README.md | 52 ++++++ docs/api-docs.md | 12 +- docs/common-errors.md | 4 +- docs/dependencies.md | 3 - docs/docker-project-specific-commands.md | 15 +- docs/editors/assets/biome_config.png | Bin 0 -> 76822 bytes .../assets/pycharm_add_interpreter.png | Bin 0 -> 88630 bytes .../assets/pycharm_interpreter_bar.png | Bin 0 -> 16076 bytes docs/editors/emacs.md | 5 + docs/editors/jetbrains.md | 90 +++++++++++ docs/editors/vim.md | 5 + docs/editors/vscode.md | 5 + docs/install/git-setup.md | 41 +++++ docs/install/install-script.md | 44 +++++ docs/install/linux-docker.md | 14 ++ docs/install/linux-native.md | 14 ++ docs/install/mac-docker.md | 60 +++++++ docs/install/mac-native.md | 73 +++++++++ docs/install/post-install.md | 36 +++++ docs/install/windows-docker.md | 34 ++++ docs/install/windows-wsl.md | 32 ++++ docs/intervew-scheduling.md | 68 ++++++++ docs/introduction.md | 36 +++++ docs/technical/README.md | 22 --- docs/technical/Samf4Tech.md | 4 +- docs/technical/backend/billig.md | 2 +- docs/technical/backend/rolesystem.md | 4 +- docs/technical/backend/seed.md | 2 +- docs/technical/frontend/components.md | 2 +- docs/technical/frontend/cypress.md | 2 + docs/technical/frontend/data-fetching.md | 125 ++++++++++++++- docs/technical/frontend/forms.md | 150 +++++++++++++++++- docs/technical/frontend/samfform.md | 5 +- docs/technical/meme.jpeg | Bin 66573 -> 0 bytes docs/technical/pipeline.md | 4 +- docs/useful-commands.md | 4 +- docs/work-methodology.md | 2 +- 38 files changed, 917 insertions(+), 107 deletions(-) create mode 100644 docs/README.md delete mode 100644 docs/dependencies.md create mode 100644 docs/editors/assets/biome_config.png create mode 100644 docs/editors/assets/pycharm_add_interpreter.png create mode 100644 docs/editors/assets/pycharm_interpreter_bar.png create mode 100644 docs/editors/emacs.md create mode 100644 docs/editors/jetbrains.md create mode 100644 docs/editors/vim.md create mode 100644 docs/editors/vscode.md create mode 100644 docs/install/git-setup.md create mode 100644 docs/install/install-script.md create mode 100644 docs/install/linux-docker.md create mode 100644 docs/install/linux-native.md create mode 100644 docs/install/mac-docker.md create mode 100644 docs/install/mac-native.md create mode 100644 docs/install/post-install.md create mode 100644 docs/install/windows-docker.md create mode 100644 docs/install/windows-wsl.md create mode 100644 docs/intervew-scheduling.md create mode 100644 docs/introduction.md delete mode 100644 docs/technical/README.md delete mode 100644 docs/technical/meme.jpeg diff --git a/README.md b/README.md index 912135fd4..e24335d94 100644 --- a/README.md +++ b/README.md @@ -2,55 +2,10 @@ -## Documentation - -- **[Technical Documentation](./docs/technical/README.md)** -- [Work Methodology](./docs/work-methodology.md) -- [Useful Commands](./docs/useful-commands.md) -- [Technologies used on Samf4 🤖](./docs/technical/Samf4Tech.md) -- [Project Specific Commands](./docs/docker-project-specific-commands.md) -- [Useful Docker aliases](./docs/docker-project-specific-commands.md) -- [🌐 API documentation](./docs/api-docs.md) - -## Installation - -We have a script that handles all installation for you. To run the script, a Github Personal Access Token (PAT) is required. -You can make one here https://github.com/settings/tokens/new. Tick scopes `repo`, `read:org` and `admin:public_key`), -then store the token somewhere safe (Github will never show it again). - -Copy these commands (press button on the right-hand side of the block) -and run from the directory you would clone the project. - -```sh -# Interactive -read -s -p "Github PAT token: " TOKEN ; X_INTERACTIVE=y /bin/bash -c "$(curl -fsSL https://$TOKEN@raw.githubusercontent.com/Samfundet/Samfundet4/master/{bash_utils.sh,install.sh})" && . ~/.bash_profile && cd Samfundet4; unset TOKEN; unset X_INTERACTIVE; -``` +## Introduction -
-Non-interactive (show/hide) +Samfundet4 is the latest and greatest iteration of samfundet.no. It's built using Django and React. -```sh -# Non-interactive -read -s -p "Github PAT token: " TOKEN ; X_INTERACTIVE=n /bin/bash -c "$(curl -fsSL https://$TOKEN@raw.githubusercontent.com/Samfundet/Samfundet4/master/{bash_utils.sh,install.sh})" && . ~/.bash_profile && cd Samfundet4; unset TOKEN; unset X_INTERACTIVE; -``` - - -
- -
-Flags explained (show/hide) - -> - X_INTERACTIVE (y/n): determines how many prompts you receive before performing an action. -> curl: -> - -f: fail fast -> - -s: silent, no progress-meter -> - -S: show error on fail -> - -L: follow redirect - -
+## Documentation -
-
-
+Looking for install guides and technical documentation? Go to the [Documentation Overview](./docs/README.md)! diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..6c13d881c --- /dev/null +++ b/docs/README.md @@ -0,0 +1,52 @@ +[**← Back: Samfundet4**](../) + +# Documentation Overview + +> [!TIP] +> If you're new, start by going through the [Introduction to Samfundet4](./introduction.md) guide. + +## Frontend + +- [Creating react components (conventions)](./technical/frontend/components.md) +- [Forms and schemas](./technical/frontend/forms.md) + - [*Deprecated: SamfForm*](./technical/frontend/samfform.md) +- [Cypress Setup Documentation](./technical/frontend/cypress.md) +- [Data fetching and State management](./technical/frontend/data-fetching.md) + +## Backend + +- [🌐 API documentation](./api-docs.md) +- [Billig (payment system)](./technical/backend/billig.md) +- [Seed scripts](./technical/backend/seed.md) +- [Role system](./technical/backend/rolesystem.md) + +## Other + +- [Automatic Interview Scheduling](./intervew-scheduling.md) + +## Workflow + +- [Work Methodology](./work-methodology.md) + - How to contribute to the project +- [Useful Commands](./useful-commands.md) +- [Useful Docker aliases](./docker-project-specific-commands.md) +- [Common error messages](./common-errors.md) + +## Pipelines & Deployment + +- [Pipeline (mypy, Biome, tsc, ...)](./technical/pipeline.md) + +## Install + +- Linux: [Docker](./install/linux-docker.md) – [Native](./install/linux-native.md) +- MacOS: [Docker](./install/mac-docker.md) – [Native](./install/mac-native.md) +- Windows: [Docker](./install/windows-docker.md) – [WSL](./install/windows-wsl.md) +- [Install script](./install/install-script.md) +- [Post-install instructions](./install/post-install.md) + +## Editor configuration + +* [JetBrains (WebStorm, PyCharm, etc...)](./editors/jetbrains.md) +* [VS Code](./editors/vscode.md) +* [Vim/Neovim](./editors/vim.md) +* [Emacs](./editors/emacs.md) diff --git a/docs/api-docs.md b/docs/api-docs.md index 963faf179..e3162ed87 100644 --- a/docs/api-docs.md +++ b/docs/api-docs.md @@ -1,3 +1,5 @@ +[**← Back: Documentation Overview**](./README.md) + # API docs API docs are generated by [drf-spectacular](https://drf-spectacular.readthedocs.io/en/latest/readme.html). @@ -6,14 +8,16 @@ API documentation is available as two different interfaces: [Swagger-UI](http://localhost:8000/schema/swagger-ui/#/) or [Redoc](http://localhost:8000/schema/redoc/) - - 🐋 _When backend server is running_ ## API schema file If you want a schema file for the API you can go to [http://localhost:8000/schema/](http://localhost:8000/schema/). -A schema file will be downloaded which can be used for multiple purposes, like sharing API documentation, or to generate code for recreating or testing the API. +A schema file will be downloaded which can be used for multiple purposes, like sharing API documentation, or to generate +code for recreating or testing the API. -> 💡 Note: You might encounter some error messages during this process. These errors are typically related to drf-spectacular not being able to parse certain views in views.py. However, the tool will still attempt to generate the documentation, though the results might not be fully comprehensive. +> [!NOTE] +> You might encounter some error messages during this process. These errors are typically related to drf-spectacular not +> being able to parse certain views in views.py. However, the tool will still attempt to generate the documentation, +> though the results might not be fully comprehensive. diff --git a/docs/common-errors.md b/docs/common-errors.md index 140e6662e..99deef8b1 100644 --- a/docs/common-errors.md +++ b/docs/common-errors.md @@ -1,3 +1,5 @@ +[**← Back: Documentation Overview**](./README.md) + # Common error messages ## Rule of thumb @@ -20,4 +22,4 @@ exec /app/entrypoint.sh: no such file or directory Cannot connect to the Docker daemon at ../../.../default/docker.sock. Is the docker daemon running? ``` ### Fix: -Make sure docker desktop is running (Windows) or run `colima start`on Mac. +Make sure docker desktop is running (Windows) or run `colima start` (or start Docker Desktop) on Mac. diff --git a/docs/dependencies.md b/docs/dependencies.md deleted file mode 100644 index 4ba44c4ae..000000000 --- a/docs/dependencies.md +++ /dev/null @@ -1,3 +0,0 @@ -## i18next - -Used for language translation diff --git a/docs/docker-project-specific-commands.md b/docs/docker-project-specific-commands.md index 4b2014d66..0b81ff628 100644 --- a/docs/docker-project-specific-commands.md +++ b/docs/docker-project-specific-commands.md @@ -1,6 +1,9 @@ -# Useful project spesific Docker actions -### For frontend actions -All commands has to be run inside a shell in a container. +[**← Back: Documentation Overview**](./README.md) + +# Useful project specific Docker actions + +## Frontend +All commands have to be run inside a shell in a container. ```bash docker compose exec frontend bash #Command to open the frontend container in a shell @@ -25,9 +28,11 @@ yarn run tsc:check #runs TypeScript Compiler check, like in GitHub Actions pipeline, but in Docker ``` -## For backend actions: +--- + +## Backend -All commands has to be run inside a shell in a container. +All commands have to be run inside a shell in a container. ```bash docker compose exec backend bash #Command to open container in a shell diff --git a/docs/editors/assets/biome_config.png b/docs/editors/assets/biome_config.png new file mode 100644 index 0000000000000000000000000000000000000000..22dfea774518e0026541a5c4f793e63a8509b727 GIT binary patch literal 76822 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

>h3)>l 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 Vt!Y4!W#}DY05Zzbm6FDR{{f2Rw5|XE literal 0 HcmV?d00001 diff --git a/docs/editors/assets/pycharm_add_interpreter.png b/docs/editors/assets/pycharm_add_interpreter.png new file mode 100644 index 0000000000000000000000000000000000000000..797b396e21804ebf922e495b7aaddbc6e90d1251 GIT binary patch literal 88630 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 literal 0 HcmV?d00001 diff --git a/docs/editors/emacs.md b/docs/editors/emacs.md new file mode 100644 index 000000000..22c80203e --- /dev/null +++ b/docs/editors/emacs.md @@ -0,0 +1,5 @@ +[**← Back: Getting started**](../introduction.md) + +# Emacs setup + +This guide hasn't been written yet. Maybe you want to? :-) diff --git a/docs/editors/jetbrains.md b/docs/editors/jetbrains.md new file mode 100644 index 000000000..5402037e9 --- /dev/null +++ b/docs/editors/jetbrains.md @@ -0,0 +1,90 @@ +[**← Back: Getting started**](../introduction.md) + +# JetBrains setup + +This will give some pointers on how to set up your JetBrains IDE (WebStorm/PyCharm). Luckily for you, there's not much +to be done, since JetBrains IDEs require very little configuration to be productive. + +Keep in mind that all the mentioned plugins are just recommended, they're not required to develop on the project. The +linters and formatters can be run through the terminal, but having them integrated in your IDE does make life a bit +easier. + +Contents: + +* [PyCharm](#pycharm) + * [Plugins](#plugins) + * [Python Interpreter](#python-interpreter) +* [WebStorm](#webstorm) + * [Plugins](#plugins-1) + * [Dependencies](#dependencies) + +--- + +## PyCharm + +### Plugins + +* [IdeaVim](https://plugins.jetbrains.com/plugin/164-ideavim) + * The most important one + * Add `set relativenumber` to `~/.ideavimrc` to get relative line numbering in your editor! + * You can open this file by clicking the "V" logo in the bottom right of your editor then `Open ~/.ideavimrc` +* [ruff](https://plugins.jetbrains.com/plugin/20574-ruff) + * Formatter/linter for Python + +### Python Interpreter + +Not having the correct interpreter selected in PyCharm can cause the IDE to not understand what Python version the +project is using, and it'll fail to resolve dependencies, causing a lot of red lines! If you are running the project in +Docker, you will also need to install dependencies locally, since the IDE doesn't check files inside the Docker +container. + +You can see what interpreter is currently selected in the bottom toolbar: + +![Currently selected interpreter](./assets/pycharm_interpreter_bar.png) + +To create an interpreter, click the button on the toolbar shown above, +then `Add new interpreter -> Add Local Interpreter...`. + +Select `Samfundet4/backend/.venv` as the location, and select the correct Python version as the Base interpreter. If +your system's Python version differs from what Samfundet4 expects (3.11 at the time of writing this), then you can +use [pyenv](https://github.com/pyenv/pyenv) to easily download another version. Then click OK to add it. + +![Add interpreter](./assets/pycharm_add_interpreter.png) + +After the interpreter has been created and selected, you can then install the dependencies inside the virtual +environment: + +```bash +~/Samfundet4 » source .venv/bin/activate +(.venv) ~/Samfundet4 » poetry install +``` + +--- + +## WebStorm + +### Plugins + +* [IdeaVim](https://plugins.jetbrains.com/plugin/164-ideavim) + * The most important one + * Add `set relativenumber` to `~/.ideavimrc` to get relative line numbering in your editor! + * You can open this file by clicking the "V" logo in the bottom right of your editor then `Open ~/.ideavimrc` +* [Biome](https://plugins.jetbrains.com/plugin/22761-biome) + * Formatter/linter for frontend code. + * Below is the recommended configuration (`Settings -> Language & Frameworks -> Biome`). It'll automatically format + and apply safe fixes on save (which in the + JetBrains world means when you tab/switch windows) + ![Biome configuration](./assets/biome_config.png) + +### Dependencies + +If you are running the project in Docker, you will also need to install dependencies locally, since the IDE doesn't +check files inside the Docker container. + +To do so, ensure you have [node](https://nodejs.org/en) and [yarn](https://classic.yarnpkg.com/lang/en/docs/install/) +installed. Then simply run yarn to install the dependencies. + +```bash +~/Samfundet4 » cd frontend +~/Samfundet4/frontend » yarn +``` diff --git a/docs/editors/vim.md b/docs/editors/vim.md new file mode 100644 index 000000000..ea79eb65e --- /dev/null +++ b/docs/editors/vim.md @@ -0,0 +1,5 @@ +[**← Back: Getting started**](../introduction.md) + +# Vim setup + +This guide hasn't been written yet. Maybe you want to? :-) diff --git a/docs/editors/vscode.md b/docs/editors/vscode.md new file mode 100644 index 000000000..a300794e4 --- /dev/null +++ b/docs/editors/vscode.md @@ -0,0 +1,5 @@ +[**← Back: Getting started**](../introduction.md) + +# VS Code setup + +This guide hasn't been written yet. Maybe you want to? :-) diff --git a/docs/install/git-setup.md b/docs/install/git-setup.md new file mode 100644 index 000000000..ef1054dc0 --- /dev/null +++ b/docs/install/git-setup.md @@ -0,0 +1,41 @@ +[**← Back: Getting started**](../introduction.md) + +> [!WARNING] +> This guide is not complete! Feel free to submit a PR to improve it :-) + +# Git setup + +Git is a Version Control System (VCS). You're required to set up Git in order to be able to pull and push to the +Samfundet4 project. + +## Creating an SSH key + +

+Windows +
+ +
+Linux/MacOS/WSL + +In your terminal, run `ssh-keygen` + +This will generate two files: `~/.ssh/id_rsa` and `~/.ssh/id_rsa.pub`. +
+ +## Adding it to GitHub + +Copy the contents of the `id_rsa.pub` file and go to the [SSH and GPG keys](https://github.com/settings/keys) GitHub +settings page. Click the green "New SSH key" button, paste the file contents in the big text box, and click "Add SSH +key". + +> [!WARNING] +> Ensure you copy the right file. `id_rsa` is a private key, never meant to be shared with anyone, unlike `id_rsa.pub`. + +## Configuring Git + +You can configure Git both locally and globally. Locally meaning your configuration only applies to a specific +directory (i.e. project), or globally for all directories. Local configuration overrides global configuration. + +## Further reading + +Want to git gud to become a git god? diff --git a/docs/install/install-script.md b/docs/install/install-script.md new file mode 100644 index 000000000..f6297fb1c --- /dev/null +++ b/docs/install/install-script.md @@ -0,0 +1,44 @@ +[**← Back: Getting started**](../introduction.md) + +> [!WARNING] +> This script has not been maintained in a while and may not work. + +# Install script + +We have a script that handles all installation for you. To run the script, a Github Personal Access Token (PAT) is +required. +You can make one here https://github.com/settings/tokens/new. Tick scopes `repo`, `read:org` and `admin:public_key`), +then store the token somewhere safe (Github will never show it again). + +Copy these commands (press button on the right-hand side of the block) +and run from the directory you would clone the project. + +```sh +# Interactive +read -s -p "Github PAT token: " TOKEN ; X_INTERACTIVE=y /bin/bash -c "$(curl -fsSL https://$TOKEN@raw.githubusercontent.com/Samfundet/Samfundet4/master/{bash_utils.sh,install.sh})" && . ~/.bash_profile && cd Samfundet4; unset TOKEN; unset X_INTERACTIVE; +``` + +
+Non-interactive (show/hide) + +```sh +# Non-interactive +read -s -p "Github PAT token: " TOKEN ; X_INTERACTIVE=n /bin/bash -c "$(curl -fsSL https://$TOKEN@raw.githubusercontent.com/Samfundet/Samfundet4/master/{bash_utils.sh,install.sh})" && . ~/.bash_profile && cd Samfundet4; unset TOKEN; unset X_INTERACTIVE; +``` + + +
+ +
+Flags explained (show/hide) + +> - X_INTERACTIVE (y/n): determines how many prompts you receive before performing an action. + > curl: +> - -f: fail fast +> - -s: silent, no progress-meter +> - -S: show error on fail +> - -L: follow redirect + +
diff --git a/docs/install/linux-docker.md b/docs/install/linux-docker.md new file mode 100644 index 000000000..0cdd96296 --- /dev/null +++ b/docs/install/linux-docker.md @@ -0,0 +1,14 @@ +[**← Back: Getting started**](../introduction.md) + +> [!WARNING] +> This guide is not complete! Feel free to submit a PR to improve it :-) + +# Installing on Linux (Docker) + +## Post-install + +Now that you've got the project up and running, check out the post-install instructions: + +

+→ Next: Post-install +

diff --git a/docs/install/linux-native.md b/docs/install/linux-native.md new file mode 100644 index 000000000..272d30990 --- /dev/null +++ b/docs/install/linux-native.md @@ -0,0 +1,14 @@ +[**← Back: Getting started**](../introduction.md) + +> [!WARNING] +> This guide is not complete! Feel free to submit a PR to improve it :-) + +# Installing on Linux (Native) + +## Post-install + +Now that you've got the project up and running, check out the post-install instructions: + +

+→ Next: Post-install +

diff --git a/docs/install/mac-docker.md b/docs/install/mac-docker.md new file mode 100644 index 000000000..51d814545 --- /dev/null +++ b/docs/install/mac-docker.md @@ -0,0 +1,60 @@ +[**← Back: Getting started**](../introduction.md) + +# Installing on MacOS (Docker) + +## Requirements + +* [Homebrew](https://docs.brew.sh/Installation) +* [colima](https://github.com/abiosoft/colima?tab=readme-ov-file#getting-started) + or [Docker Desktop](https://www.docker.com/products/docker-desktop/) + * colima can be more performant than Docker Desktop, but is less easy to use + +## Installing + +First clone the Samfundet4 repository. + +```bash +git clone git@github.com:Samfundet/Samfundet4.git +``` + +If you use colima, run `colima start` to start the engine. + +## Environment files + +Both the `frontend` and `backend` directories contain a `.docker.example.env` file. Copy these files to `.docker.env` +and adjust any values as needed. You may for example want to change the default Django superuser username and +password (`DJANGO_SUPERUSER_USERNAME` and `DJANGO_SUPERUSER_USERNAME`). + +## Building + +This builds all the Samfundet4 containers: + +```bash +cd Samfundet4 +docker compose build + +# You can also choose to build only specific containers if you want: +docker compose build frontend backend +``` + +## Running + +This will start the `backend` and `frontend` containers: + +```bash +docker compose up backend frontend +``` + +## Dependency issues? + +Editors/IDEs typically don't have access to installed dependencies which lie inside Docker containers. This means you +may have to install dependencies locally too, in order for your editor/IDE to resolve them. See +the [Editor configuration](../introduction.md#editor-configuration) guide for more information. + +## Post-install + +Now that you've got the project up and running, check out the post-install instructions: + +

+→ Next: Post-install +

diff --git a/docs/install/mac-native.md b/docs/install/mac-native.md new file mode 100644 index 000000000..256f79059 --- /dev/null +++ b/docs/install/mac-native.md @@ -0,0 +1,73 @@ +[**← Back: Getting started**](../introduction.md) + +# Installing on MacOS (Native) + +## Requirements + +* [Homebrew](https://docs.brew.sh/Installation) + * MacOS package manager +* [Poetry](https://python-poetry.org/docs/) + * Backend dependency manager +* [yarn](https://classic.yarnpkg.com/lang/en/docs/install/#mac-stable) + * Frontend dependency manager +* [pyenv](https://github.com/pyenv/pyenv) + * Python version manager. Lets you easily install the same Python version that Samfundet4 expects. + +## Installing + +First clone the Samfundet4 repository. + +```bash +git clone git@github.com:Samfundet/Samfundet4.git +``` + +Install the frontend dependencies + +```bash +cd Samfundet4/frontend +yarn +``` + +Install the backend dependencies + +```bash +cd ../backend +poetry install +``` + +Then apply migrations and run seed script (the seed script adds test data to our database) + +```bash +poetry run python3 manage.py migrate +poetry run python3 manage.py seed +``` + +## Environment files + +Both the `backend` and `frontend` directories have an `.env.example` file. In each directory, copy this file to `.env` +and adjust any values as needed. You may for example want to change the default Django superuser username and +password (`DJANGO_SUPERUSER_USERNAME` and `DJANGO_SUPERUSER_USERNAME`). + +## Running + +Start backend: + +```bash +cd backend +poetry run python3 manage.py runserver +``` + +Start frontend: + +```bash +cd frontend +yarn start +``` + +## Post-install + +Now that you've got the project up and running, check out the post-install instructions: + +

+→ Next: Post-install +

diff --git a/docs/install/post-install.md b/docs/install/post-install.md new file mode 100644 index 000000000..c20b51c15 --- /dev/null +++ b/docs/install/post-install.md @@ -0,0 +1,36 @@ +[**← Back: Getting started**](../introduction.md) + +# Post-install + +You've now (hopefully) successfully installed and started the Samfundet4 project! What now? + +We recommend spending some time ensuring your editor/IDE is properly configured. This is of course a very subjective +topic, but we give some pointers in the [Editor configuration](../introduction.md#editor-configuration) section. + +After you've set up your editor/IDE, we recommend diving in head-first and just picking +an [issue](https://github.com/Samfundet/Samfundet4/issues) you'd like to solve. Be sure to have +the [Documentation Overview](../README.md) open and ready for *when* you get stuck :-) If you find that some parts of +the documentation are lacking, don't be afraid to create a PR to fix it! + +## Resetting the database + +You'll likely encounter a situation where you'd like to "reset" the database, by deleting all its data and seeding it +again. It's quite easy to do this, the first step is to stop the backend server. Then in the `backend/database` +directory, delete either the `db.sqlite3` if you're running native (or WSL), or the `docker.db.sqlite3` file if you're +running in Docker. + +Then simply start the backend server again. This will automatically create the database file and seed it automatically. + +## Resetting migrations + +If you've done some work in backend and changed/created any models, you'll also have created migration files. You'll +occasionally encounter a situation where you and another developer have both commited migrations with the same number. +Typically the other developer will have gotten their migration file merged to master, resulting in a number conflict in +your branch. + +The easiest way to fix this is to simply delete the migration file you have created, and running the `makemigrations` +command again: + +* Docker: `docker compose exec backend bash` + * Then run the same Poetry command as in the line below +* Native: `poetry run python3 manage.py makemigrations` diff --git a/docs/install/windows-docker.md b/docs/install/windows-docker.md new file mode 100644 index 000000000..14347c924 --- /dev/null +++ b/docs/install/windows-docker.md @@ -0,0 +1,34 @@ +[**← Back: Getting started**](../introduction.md) + +> [!WARNING] +> This guide is not complete! Feel free to submit a PR to improve it :-) + +> [!NOTE] +> We do not recommend running the project this way. This is essentially running nested virtualization, which will lead +> to poor performance. Prefer running [directly in WSL](./windows-wsl.md). + +# Installing on Windows (Docker in WSL) + +## Install WSL + +To run the project in WSL, you obviousy first need WSL. +Follow [this guide](https://learn.microsoft.com/en-us/windows/wsl/install) by Microsoft. The main step is running the +following in an administrator PowerShell or command prompt: + +```shell +wsl --install +``` + +From this point on, any commands you are instructed to run, are meant to be run inside WSL unless otherwise specified. + +## Install Docker + +Next, install docker. Follow [this guide](https://docs.docker.com/desktop/install/windows-install/). + +## Post-install + +Now that you've got the project up and running, check out the post-install instructions: + +

+→ Next: Post-install +

diff --git a/docs/install/windows-wsl.md b/docs/install/windows-wsl.md new file mode 100644 index 000000000..20a69c3e5 --- /dev/null +++ b/docs/install/windows-wsl.md @@ -0,0 +1,32 @@ +[**← Back: Getting started**](../introduction.md) + +# Installing on Windows (WSL) + +> [!WARNING] +> When cloning the project, please ensure you do **not** do it inside OneDrive. Working with the project inside OneDrive +> will be incredibly slow in all aspects. + +## Introduction + +The Windows Subsystem of Linux (WSL) lets you run programs which traditionally only run in Linux. + +## Install WSL + +To run the project in WSL, you obviousy first need WSL. +Follow [this guide](https://learn.microsoft.com/en-us/windows/wsl/install) by Microsoft. The main step is running the +following in an administrator PowerShell or command prompt: + +```shell +wsl --install +``` + +This should install WSL with the Ubuntu distribution. + +## Next steps + +Since you now have a working Linux environment, the remaining steps of setting up the project are identical with the +Linux guide, so click the link below to continue the process. + +

+→ Next: Installing on Linux (Native) +

diff --git a/docs/intervew-scheduling.md b/docs/intervew-scheduling.md new file mode 100644 index 000000000..2e2af558d --- /dev/null +++ b/docs/intervew-scheduling.md @@ -0,0 +1,68 @@ +[**← Back: Documentation Overview**](./README.md) + +> [!NOTE] +> This document is a work in progress. + +# Automatic Interview Scheduling + +The aim of this document is to describe the Automatic Interview Scheduling system of Samfundet4. + +It's hard to describe concisely how the system works, so this document contains a few different user stories, describing +how each user role would interact with the system. This will hopefully help you get a better understanding of how the +system works. There's probably going to be a bit of unnecessary rambling in this document, feel free to submit a PR to +fix that:) + +First off, this system is **not** meant to be fully automatic, but semi-automatic. We don't want there to be a lot of +magic happening in the background which nobody understands, and we don't want a system that makes changes without user +interaction. Having a system that automatically schedules interviews without any supervision sounds like a recipe for +disaster. + +The goal is to help recruitment admins save time, by +automatically scheduling interviews, something which notoriously takes a long time to do manually. There are so many +edge cases in scheduling interviews, so it's important that the system is intuitive and easy to use. + +The system must also allow each gang to use the scheduling algorithm of their choosing. + +## Admin's perspective + +1. Navigate to my gang's recruitment overview page and click on a position. +2. Hit the "Automatically schedule interviews" button. +3. We are shown a dialog (or page), with a list of interviews the algorithm has suggested. + 1. Each interview suggestion shows the date, time, and partaking interviewers + 2. We are able to manually edit these interviews if we wish. This will allow us to manually edit the date, time, + location and partaking interviewers. +4. We click the submit button, which saves the interviews and sends out emails to affected applicants and interviewers, + notifying them of the upcoming interview. + 1. The email must not contain sensitive information, it should only contain the name of the gang/section/position + the applicant has applied for, as well as the date, time, and location of the interview. + +## Interviewer's perspective + +## User's perspective + +## Algorithms + +Owner refers to either the Gang or Section which owns the position. + +### Samfundet + +1. Fetch all unscheduled interviews for this position. +2. Fetch all rooms booked by Owner (if any) +3. Fetch unavailability data for all interviewers and applicants +4. For each unscheduled interview, do: + 1. + +### UKA/ISFiT + +1. + +### ISFiT + +1. + +## Race conditions and conflict + +The scheduling algorithms described above are very prone to race conditions and conflict if running them at the same +time, which isn't unthinkable since we want to allow multiple people to work on the recruitment system simultaneously. +We solve this by only allowing the interview scheduling to be run by a single process. To run the scheduler, we send a +request to add scheduling for a given position to the queue. The process fetches tasks from the queue and executes them. diff --git a/docs/introduction.md b/docs/introduction.md new file mode 100644 index 000000000..5d5f5d90c --- /dev/null +++ b/docs/introduction.md @@ -0,0 +1,36 @@ +[**← Back: Documentation Overview**](./README.md) + +# Introduction to Samfundet4 + +Welcome to Samfundet4! This guide will introduce you to the technologies used in the project, and guide you through +installing the project on your machine. + +## Technologies + +Samfundet4 is built using [Django](https://www.djangoproject.com/) and [React](https://react.dev/). Django is a Python +framework, which we use as our backend. React is a library for building frontend applications, and we use it with +the [TypeScript](https://www.typescriptlang.org/) language. + +For a more in-depth introduction to all the technologies we use, check out this +document: [Technologies used in Samfundet4](./technical/Samf4Tech.md) + +## Installation + +There are multiple ways of running this project, all with their own pros and cons. Running with +Docker is likely the easiest, but will require some initial setup and tweaking depending on your system. + +Below is a set of install guides for the various methods of installing and running the project, depending on your OS. If +you're not sure which to pick, just ask someone in MG::Web! + +- Linux: [Docker](./install/linux-docker.md) – [Native](./install/linux-native.md) +- MacOS: [Docker](./install/mac-docker.md) – [Native](./install/mac-native.md) +- Windows: [Docker](./install/windows-docker.md) – [WSL](./install/windows-wsl.md) +- [Install script](./install/install-script.md) +- [Post-install instructions](./install/post-install.md) + +## Editor configuration + +* [JetBrains (WebStorm, PyCharm, etc...)](./editors/jetbrains.md) +* [VS Code](./editors/vscode.md) +* [Vim/Neovim](./editors/vim.md) +* [Emacs](./editors/emacs.md) diff --git a/docs/technical/README.md b/docs/technical/README.md deleted file mode 100644 index 75f09d871..000000000 --- a/docs/technical/README.md +++ /dev/null @@ -1,22 +0,0 @@ - -[👈 back](/README.md) - -# Samfundet4 - Technical Documentation - - - -### Frontend - -- [Creating react components (conventions)](/docs/technical/frontend/components.md) -- [Forms and schemas](/docs/technical/frontend/forms.md) -- [Cypress Setup Documentation](/docs/technical/frontend/cypress.md) -- [Data fetching](./frontend/data-fetching.md) - -### Backend - -- [Billig (payment system)](/docs/technical/backend/billig.md) -- [Seed scripts](/docs/technical/backend/seed.md) -- [Role System](/docs/technical/backend/rolesystem.md) - -### Pipelines & Deployment -- [Pipeline (mypy, biome, tsc, ...)](/docs/technical/pipeline.md) diff --git a/docs/technical/Samf4Tech.md b/docs/technical/Samf4Tech.md index defd33130..ecbf8ec2d 100644 --- a/docs/technical/Samf4Tech.md +++ b/docs/technical/Samf4Tech.md @@ -1,6 +1,6 @@ -[👈 back](/README.md) +[**← Back: Introduction to Samfundet4**](../introduction.md) -# Technologies used on Samfundet4 +# Technologies used in Samfundet4 This text aims to both sum up the main technologies used to develop on Samfundet4 and to get a person with minimal webdev experience up to speed on the most important concepts. There is a lot this text does not cover, which might be found in other docs linked to in the [README](/README.md). diff --git a/docs/technical/backend/billig.md b/docs/technical/backend/billig.md index 321743951..26701c339 100644 --- a/docs/technical/backend/billig.md +++ b/docs/technical/backend/billig.md @@ -1,4 +1,4 @@ -[👈 back](/docs/technical/README.md) +[**← Back: Documentation Overview**](../../README.md) # Billig Integration diff --git a/docs/technical/backend/rolesystem.md b/docs/technical/backend/rolesystem.md index 833e73633..1b94d38a6 100644 --- a/docs/technical/backend/rolesystem.md +++ b/docs/technical/backend/rolesystem.md @@ -1,4 +1,6 @@ -# Role System +[**← Back: Documentation Overview**](../../README.md) + +# Role system The role system in Samfundet4 builds on the Django "authentication backend" concept. Our system adds a [custom auth backend](https://docs.djangoproject.com/en/5.0/topics/auth/customizing/). The goal of the system is to diff --git a/docs/technical/backend/seed.md b/docs/technical/backend/seed.md index 23c084427..c8bb318f5 100644 --- a/docs/technical/backend/seed.md +++ b/docs/technical/backend/seed.md @@ -1,4 +1,4 @@ -[👈 back](/docs/technical/README.md) +[**← Back: Documentation Overview**](../../README.md) # Seeding diff --git a/docs/technical/frontend/components.md b/docs/technical/frontend/components.md index 16edd34ff..90d23b7a6 100644 --- a/docs/technical/frontend/components.md +++ b/docs/technical/frontend/components.md @@ -1,4 +1,4 @@ -[👈 back](/docs/technical/README.md) +[**← Back: Documentation Overview**](../../README.md) # Components diff --git a/docs/technical/frontend/cypress.md b/docs/technical/frontend/cypress.md index fcdc7e0f2..41f17a61e 100644 --- a/docs/technical/frontend/cypress.md +++ b/docs/technical/frontend/cypress.md @@ -1,3 +1,5 @@ +[**← Back: Documentation Overview**](../../README.md) + # Cypress Setup Documentation This document outlines the steps for setting up Cypress in your project. Cypress is an end-to-end testing framework designed to make it easy to write and run tests for web applications. This guide will cover how to set up Cypress both in a Docker container and locally on your machine. diff --git a/docs/technical/frontend/data-fetching.md b/docs/technical/frontend/data-fetching.md index ebb5b9245..d402a06e2 100644 --- a/docs/technical/frontend/data-fetching.md +++ b/docs/technical/frontend/data-fetching.md @@ -1,19 +1,130 @@ -# Data fetching +[**← Back: Documentation Overview**](../../README.md) -We use the [Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) (built into browsers) to fetch data. -The `fetch` function is quite simple to use. It returns -a [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) that resolves to -the response of the request. +# Data fetching and State management + +We use the [Axios HTTP client](https://axios-http.com/docs/intro) to fetch data. It's quite simple to use, returning a +[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) resolving to the +response of the request. We use [React Query](https://tanstack.com/query/v3) for state management. State management in React is notoriously hard to get 100% right and safe, which is why using a library such as RQ is a good idea. It saves us from a lot of potential common bugs and headaches with managing state all by ourselves. -If you're not convinced, read this [great article](https://tkdodo.eu/blog/why-you-want-react-query) by TkDodo on Why You -~~Want~~ Need React Query. It explores a lot of common pitfalls/bugs. At the time of me writing this, these +If you're not convinced, read this [great article](https://tkdodo.eu/blog/why-you-want-react-query) by TkDodo on *Why +You ~~Want~~ Need React Query*. It explores a lot of common pitfalls/bugs. At the time of me writing this, these pitfalls/bugs are found absolutely everywhere we do data fetching in Samfundet4. Hopefully over time, we will replace these instances with safe state management using RQ. ## Getting started +So how do these two libraries hang together in our project? Well, we typically start by writing a very simple function +which only contains an Axios call to send a request and return the data from the response. We do this +in `frontend/src/api.ts`. Then in our components and pages and +whatnot, we use React Query to be responsible for actually calling this function when needed. + +To get started, in our component/page, call the `useQuery` hook like so, providing a query key and the query function: + +```ts +const { data, isLoading, isError } = useQuery({ + queryKey: ['informationpages'], + queryFn: getInformationPages, +}); +``` + +The project has a single global *Query Client*. This acts kind of like a global request and response cache. It contains +all the data fetched by the `useQuery` hook. You can think of it as a simple Key-Value store. In the above example, the +data fetched by the `getInformationPages` function is stored by the Query Client using the query key. The query key +therefore needs to be unique for the data we're fetching. + +## Query key factory + +Since it's extremely important that the query keys are unique, we employ a "query key factory" to generate them for us. +The factories are all defined in one place ([queryKeys.ts](../../../frontend/src/queryKeys.ts)), which should eliminate +the possibility of key collisions. Here are some examples of how to use the factories: + +```ts +// Get all information pages +const { data } = useQuery({ + queryKey: infoPageKeys.all, + queryFn: getInformationPages, +}); +``` + +```ts +// Get specific user +const { data } = useQuery({ + queryKey: userKeys.detail(userId), + queryFn: () => getUser(userId), +}); +``` + +```ts +// Get information pages with filter +const { data } = useQuery({ + queryKey: infoPageKeys.list([search, page]), + queryFn: () => getInformationPages(search, page), +}); +``` + +## Invalidating data + +Sometimes we need to invalidate data which has been fetched. An example case is when we create and save a new object, an +information page for instance, we want to clear our "information pages" cache, so that when we request all information +pages again, the data returned includes the new object. + +Doing this is quite simple with the query key factory, and we are able to invalidate on multiple levels of granularity: + +```ts +// Invalidate absolutely all information page data +queryClient.invalidateQueries({ + queryKey: infoPageKeys.all +}); + +// Invalidate all information page lists +queryClient.invalidateQueries({ + queryKey: infoPageKeys.lists() +}); + +// Invalidate a specific information page's data +queryClient.invalidateQueries({ + queryKey: infoPageKeys.detail(id) +}); +``` + +## Error handling + +We have a very simple error handler defined in the *Query Client*. If the query function returns an error (for instance, +HTTP 500), we will log it as an error to the console, and display a toast with an error message. This error message is +by default generic (i.e. "Something went wrong!"), but it can be overwritten by the useQuery-caller if desired. We do +this using the `meta` and `errorMsg` options in the useQuery hook. + +```ts +const { data, isLoading, isError } = useQuery({ + queryKey: infoPageKeys.all, + queryFn: getInformationPages, + meta: { + errorMsg: "We couldn't find the pages!" + } +}); +``` + +In the example above, if `getInformationPages` raises an error, we'll get a toast with "We couldn't find the pages!". +Note that you can (and should) use translations here as well: + +```ts +const { data, isLoading, isError } = useQuery({ + queryKey: infoPageKeys.all, + queryFn: getInformationPages, + meta: { + errorMsg: t(KEY.something_something) + } +}); +``` + +## Further reading + +React Query doesn't only have to be used for API calls, we also use it for other async tasks. + Please check out the [RQ docs Quick Start](https://tanstack.com/query/latest/docs/framework/react/quick-start). + +Also check out TkDodo's (RQ maintainer) [blog posts](https://tkdodo.eu/blog/practical-react-query) diff --git a/docs/technical/frontend/forms.md b/docs/technical/frontend/forms.md index 4be7686dd..fca7ee760 100644 --- a/docs/technical/frontend/forms.md +++ b/docs/technical/frontend/forms.md @@ -1,4 +1,4 @@ -[👈 back](/docs/technical/README.md) +[**← Back: Documentation Overview**](../../README.md) # Forms @@ -39,7 +39,7 @@ To get started, create a new file, for example `YourForm.tsx`. This file will co itself. Define a schema using zod. Remember to reuse fields when possible as mentioned in the section above (we won't do this here for example's sake). -```typescript jsx +```ts import { z } from 'zod'; const schema = z.object({ @@ -51,16 +51,16 @@ Create your form component, and use the `useForm` hook to create the form. Create the form component, and use the `useForm` hook with your schema,. -```typescript jsx +```jsx export function YourForm() { // 1. Define the form - const form = useForm>({ + const form = useForm < z.infer < typeof schema >> ({ resolver: zodResolver(schema), defaultValues: { username: '', }, }); - + // 2. Define the submit handler function onSubmit(values: z.infer) { // These values are type-safe and validated @@ -71,7 +71,7 @@ export function YourForm() { Now use the `Form` wrapper components to build our form. -```typescript jsx +```jsx export function YourForm() { // ... @@ -84,6 +84,7 @@ export function YourForm() { render={({ field }) => ( Username + Pick wisely, this cannot be changed later! @@ -97,6 +98,143 @@ export function YourForm() { } ``` +## Files + +Defining a schema type for files is a bit more complicated. Below is an example which defines a schema with an +optional `avatar` file field. + +```jsx +const schema = z.object({ + image_file: z + .instanceof(File) + .refine((file) => file.size < 1024 * 1024 * 2, { + message: "File can't be larger than 2 MB" + }) + .nullable(), +}); +``` + +And in the form below. Please note that this input must +be [uncontrolled](https://react.dev/learn/sharing-state-between-components#controlled-and-uncontrolled-components), so +we do not set `value` on it. We must also extract relevant information from the `onChange` event. In the example below, +we only want a single file, so we return the first item in the `FileList`. + +```jsx + ( + + + onChange(event.target.files?.[0])} + {...fieldProps} + /> + + + + )} +/> +``` + +## Numbers + +All HTML input values are strings. If we require a number type from an input, we must therefore convert it, as well as +deal with all non-numeric input. This can quickly become cumbersome using just the Input component. Luckily we have the +NumberInput component which does all this for us. + +```jsx + ( + + Duration + + + + + + )} +/> +``` + +## Dropdown + +Dropdowns can be used +either [controlled or uncontrolled](https://react.dev/learn/sharing-state-between-components#controlled-and-uncontrolled-components). +If you provide `value` to Dropdown, it'll be controlled. If you don't, it will be uncontrolled. + +```ts +const options: DropdownOption[] = [ + { label: 'Samfundet', value: 'samfundet' }, + { label: 'UKA', value: 'uka' }, + { label: 'ISFiT', value: 'isfit' }, +]; +``` + +Controlled: + +```jsx + ( + + Organization + Which organization does this object belong to? + + + + + )} +> + +``` + +Uncontrolled: + +```jsx + ( + + Organization + Which organization does this object belong to? + + + + + )} +> + +``` + +You can also add a "null option". This is a blank option which is added to the top of the dropdown list. This is useful +if you need the Dropdown to be optional. The label of the null option can be customized, and it can also be disabled in +order to force users to select another option. If the null option is selected, an italic font style is applied to the +dropdown, to further indicate that a special option is selected. Examples of some possibilities below: + +```jsx +// Add a simple blank null option + +``` + +```jsx +// Null option with custom label + +``` + +```jsx +// Disabled null option with custom label + +``` + + ## Example To see an example form in action, check out the form on the [components page](http://localhost:3000/components), diff --git a/docs/technical/frontend/samfform.md b/docs/technical/frontend/samfform.md index 0132e1e3b..75ed8c0cf 100644 --- a/docs/technical/frontend/samfform.md +++ b/docs/technical/frontend/samfform.md @@ -1,4 +1,7 @@ -[👈 back](/docs/technical/README.md) +[**← Back: Documentation Overview**](../../README.md) + +> [!WARNING] +> SamfForm is deprecated, and will slowly be replaced with [our wrappers](./forms.md) around React Hook Form. # SamfForm diff --git a/docs/technical/meme.jpeg b/docs/technical/meme.jpeg deleted file mode 100644 index 533857b25bf69065e3400225c37de9311921ade7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66573 zcmb5Vbx<758#PL>;10pv-Ccq$%i@c>EfCyY65M4McXtWy5Zv88!GaTl1x-HQ->rM= z`}dxi>YAFao_S99bU!_(pZ>S@?*|+X2%rdnd-o0w?%mq~_iqzU77hXaKm3;>ya5pz z@jsv-BO@WBqM)InqM)LpVPIpRp<|(=qGIA=VqxRp;NqZR;Nj!p;J;nt{P&P||CK~Q zM0qQSgN};+cK81${tdw4qP!c2r$u;23kQ$;4gvSwzacmZI5@cX@BTCQ|HV6a1Vkj{ z_i!kvZ`q{p;NTJd?_9Wd@Noa-|J#7WKzPfN^tuYI8! zcPtHL_%JEI=HT*p?B#!+XQH6I3c21Ol^kbEUA&d1>BF1zY80=^FW?CARry}gUG_0u zw?3jjbh(%*mBP8#6XL%;Y^u;@$p+Qo&uCLRwkl1V^q{%*S*$lQ^(KL&nc$;#FHNr%H4nOO?%bjce zE{uOF#r@<*4Px`H4u$SCEeW-aGhNlXPg?llb(IiLAuLde z-MM7u4(Lkp7#gcX+Gl=tLh`(C74iZ}-p^orl=(8$=mCCV&o~$UgA@N7k#cQ}_bBJ* zUCrS(ZW4#RVZwbMKndrTT-}JD{u2-lU-gnzjs<4tMMHN*q#X`#Nh3g1Z2A$)nBxOb zar^x-FXYEX@Tz=vBon}yeyLtX8-hWdGEj<7d_i^-5{i77u~_+u5MtZ0y+`CNIVLj` z?oFFDaAKr7Fig_xXCl&_3$l1gHq1aXk6QErO;73k^$i3d$4=2Q8Yv9-F7XS+_ccrhKd!W)63W z+o2sNlv_OW>-c?7d%t5Atz-q@4bU1eN&4}Q_(eL#i3#YcJfHAxj#Lrbr0}}UU#Q|+ z9~{H?gx9vm@IxX$0V**}B0r>7tRL~gX@C#9C5wgT=em%(ca2k@?ht)2BNWJ^zi5Hq z5fD5KBk?4?WR~D^Nz=5N1sXa?ItStdeh_Rkz;r6e7#-cviu?q`#NCy2APw}|={AJ8 zo;vOAENt9$mQ*JEA4NCXG4vE-xO2MoF6xJY0bFi>|yLk55%MS?sTNfBb7+NSoqUaq;WX%aNPbZ6wb$vB~DaQLJ>)*3Dd{Q zWK=AcEYdBE6m2rC)bQl0Y19|8bAS3IfWV1LSQi`N)H7jqM~cUJU@XdCjlE@)rIXIT zIUZF+&tdwqt~^et(IYayAB(KHE0~yh8D062GGqL(iy*w^9kmPo!l&m$?XQb{r#H%T zdJWF(!5IAygjTakbfm^lagEs%B>al-g=|0~llW^q!^njXN?M##cXx2`Ke|qaeB3A+*q=Txl=HKA-RGwuZ-EJ(sd7z>L2&zscSXA zj%w|LWv8vDLzArPNO)swL$UWnFLH zD!DlmXgRY|?&Qu&buDi$%Lz#b!AGbE$057+)iZ-V-h9Is@;+Ma{$e7S^2(eZLGpYS zqoT{WcMiK=cMF9CZha{r8lhF6WPOvuQ4d<Vd5zh7=q-J~iKSjif(uPG`hGNzoJMhjk3#bPX}a)1#n zsmkF%uX#T@I6eDw@uK)E=x#N`e$`8PhSy_WzqoT;*WuXEG|6XsLxVA@!GR@9v#eVh zGk~?n4cvS}o2}V&9e&K8uki5IQ$)}t+@J);Zh&Uw8*9>E+njtCt353lmhJsjWdE8V zOr}rAxw!rH4{Mtg{+w`PAX!&#F(J)uuL|h=92W$`GGtgBRwpQH^m0p0$_~fwxA~%L zGb_9_rsZxNk5c4SF**)NDvWVwJok(?OGDgu{6#*vNq*EtCJUOa_XN{qEf)TOzg`YZi5CzoU~ky8!M=7(lrJndk*mEa1Rah9ruq-|(h zg2BgPE8=>3xAR;>*61&3b{wdc?m?9YlcNoIk(nU}f3S*>_y25-becCIN3l@NJz4^K z&6Zc`tY~3piptukQ?iq!DN!kL@f;*{6o6qunoVY5MbAzVp~X&?5SdqsvYb~`gCNd} zgvW$!{=>GqLZ}XVuPcC+IX!s%4-UZeVyL}T)0X3emY?Rm{)tJVoiyTlSD*1%GT^o zTh25m67Msr!+|)K{q2yz?4%ln*fzt}vql(9$3{lIbnBl&*K5T@qM9oGTJ+Ll=zhP- zQarP1qE6d=y2-p&kcT;RaCx?A+&|LzdSoKC@PNsUy4lBg+S8@zubHg2P{2 zO@2u;&63|)+o!KgQnH&R&_9?OgK3Rfh*xXaIBDo}QzBV;YU*2k+K-6J8f^8_Oky0C zH*j%S-YpnGd45UlOB0+8PO*VgazNTw^OgA^qhVrQ3 zb0p6==rg3Dr5l$FQhu=G{H2w2c2jEDZQew?{xclg zSPYL@aRxe(BlZO!XTf!hJC7GsPO5Ut7)*))(idaahtZS^XN3H)ugmE6tJZ)7nrfuj zbh}l!92Q*&kEoVS7MB(JQa1Ak>^7bugAv zO|2^TA^aWSJtnzmhm%ENi4G^hj&3DcD(_s{C*$qa>*)7H?TvPYv=`|r`YHZxCTjDm zsccBzN{yb4(dF#hPg0UB>~m2MVzuZ}ASW4tpLzZ**lYYH=vN-T7CF{hyfltaF0D9)9q}*; z5+BqmaFD6KcL9&#mi)`63MWcbqsT!Vu&5GFMr5CuZk|Wk)hJgwa~~`kb8tQt^SG{! zmHfWcWs+g_nw?@sAFF?Jb58EnnYId@`nE!A40S4aC^XrmeBfMJ$Zs=qUZGHV!E-`- zb8kXW`K!?Ekb;3ia7yWav9{MnTfpt-b;i3M(l*_Xm@o)2)-7>#`M=beS_e2tM zgL~tf1hR;#n%EZaq%RpP^#z3(l$S{#Wn^7NSpi&nh#xUTVx@?b;Okjg zNs%cSM?Nz1fd|OXD|@X{f=_(p!HEiuQi^}46croA6c})2v~*NR$ZzMPOL?Nl=7}B2A08T#Lzl!CD{wG~# zITx;{pg!p3ul0Tzf5(?#+K_07UKC8e;~TKeMFPO{5r2mzP3hFf?xi@ipyM!(%tIfq zG^tc{V~1Uv!w&WMtGSay=4mRNhw zA}_Uso$~^3Kjc8Z?~$(@j0FlEeUp)fo#`{SVdvk9-^hlJ?L1vMcSlza^&7%n+Z1;1 z9>3~yrp2gKbIuC*rH}VEhLYTH-ULgCQ5F2|;q5AO5$$%6T&U4MiNLFd)QR$ia?{GuZeyR5+XUrSKPb0 zW0gR+>%76N0j? zt0yUe!mhIQKm>Z=Io7RCn zXm?^v>#~J?1FeH_yg)4O%set6Qi&i5MZ&Jx1=bXht~0^y^)WU%_xt=$Gp46JRe{Z* z)%X)c7HU`tGD|!6&Fd(fRil0E*R_of+j8)&gfHPf){ZN26EY43MqJ~^y?=1;!Rp1^ zSZ0ZEsw^QwZaqwIGMVt32!@0JkARH)KcVkGHSPbA(Qxr--s9jC(DLx|2@-ywrsJ0; z5}+4ikl|KfWRjJ86VXuK#I<)w@MtDq+>4?2X|9`Vs96JXD+d1dBo~-J%6N;7BIc4S zhbP@OJUC^6s2TkUtK{*V%|8~T*Ll{Fw4$sxr$m(u9br|jcn*_s$A&en^1M9Z%H}k@ z#TDdh2cJB#kS5FLc z^A8T!UXUYJzEqD0(XR%t`ND#&DdKhHc&MD)AW27zEvAtWcF+Vm){X}pZY=0)h zkwCg&HX^3F!rRM^vXqg=k(b@P+03D{XtF!}O)JrIZeNEp{lOm6Je+G`kQ!?r-P!`b zQJju(9?tksrdfLyGt$J79kTssZW+DB(voj=ykILJN+6tS`1LS60Xu@|V~;~<3rPbz z@NR6_)?i3i4YLxww@D!49j;0kZ`*I}8E-pl(csYKZ2Xzs!Bw{LB6`(oc<@Xn`(p!p ztVx$W6@~*$4a?zF!i{PYog7>ngHcEKQr|EnP?iv_sJ|W=UjZY|gGZY=x*KF&75?PtsVe{8a=(vQ)ql2R9Lma|OGr6-PqWRWs7b}{i!N#x~BUy4TMVd=$f5F@ba{Y}Cf;%Ib z&A>xf(#`?;d12l2Ae!DAEHrpUa`ViG9MO9lGN}UR#l1HH?goqSS@IuTzF@8j7ZwYP z!;Tkzf=D1bTCt?>Zw6SB#f+_x%WE!I;|fmNr{`Hp8@ZytQc`L&}%#!194v z%UIDgt=4e#*MZ+z20^dgtS;<{wkEezZVD5@ZcQzzds&BTeW2!OxmeLDOy7vixM(uMxtIk8PvPwgKAhmHeyD zF)f>hM5EuhsBEvA)=s=%E|}w%+?R&m=#{{dz4ZiB88;gxiuP?i8;t+XaP7OQ?Kt@b zkpGR1F`3x?+ASOYHV%gn(ddGU(QCpI&Qr6NE5VMeW0g8WB82|(* zkn_IO{nucxpNT&Al#7>fx&q2Is{#O(n}UPE{QL)Jo~A&K;Hl+>ae~iM2`2wqFC9}<`^gV@lCtDTEn5hx16N(kA7OcBR;m1L{y~|+7m*Q88hiT;oX~2@e>mKr78s}^S zmdY1tws+}TSZrP^70%mX>s=I9X`MQd!UEvyNHx<3>@})hRB%|5SZw#E!Td^^5uOjJ z{?^)f7!$P?)mX8ryPkm+e<(otl(q1=@DiNw@#+B9Mz>WZqEjd-pVaM)RKLoXY>Knr z3z(=`?|r~8sp3c(EtKK{&VWxQ7+Or+Gu!i$?J_pqtdyE%!gI%9=b`6pT6rJ|}CY zQ&e)7FkbD!rBwCUuAaDlmlb&4$y(~XIMcG~^jD!}k6A`t6^{PQp!rj|VytAjdb&_e z$0SI0xpL|SbTpx><)k*`RQMY`Q*LWALd=;^M(I0#C$9rbpC?%{n@FSa)_A$y)%du; zxJpUsh`yFnPHQ+c=@-05Ff+tS=*dk0QFCEba!jpsWv_7tpIPAGGHdJDJ8x^HLN_B^lMgSrIVMG}MAp-np#HQ=! zX+?eq2_f=jw=~~Agf_%?P|@*JKx`c1QYV`r^8HI< z^Mn@{oHfSOs1N0?^vE5-2nLuo+iKFu9|N-^X!OflxtVpOy)6+pg?_tY1o+9q;aaVU zu{L;zGhet`!+>Bzep;$gW{6axhTNuTD1Via5E$`PYr{X|{j7QYnh!=?(pu0pgjWC~ zo%5=^531oyE?ie(v~n`aZ2hl~)ky_kWALT<64nCg(gamE5n zUkd53fwJ_xvh=ca^t`;7vf_;bZey`L$Epj$DLJNpYba zDnRax8Db>^Mc6O#x_f|HHoado^2cmG4m#ihe;g*QwD&0`PL!FGfSDZ)6xu$^9>Pv{QLNWpn>tZ01D28;;5$7r4sx|ZgG)?$RE zWH0mxV3;F}Yzze4$t2H}1(ZT*0A!AcELTiQPK4W_(j``Lxo}$EG?31IkcoK1ZMyJ+ zaa>t@xS{k1Ji8K8-qTQEUu4%od_2P2>k)tpm}DwkT^gL{c$e3GqwE+MW_G-!f5yh> zX4#V%Fs>{3KSA*bh-+u8^CnfOpOT7;L3>bAQm~BPO?a+PJ7%yCU_cfzTT%eD z#1s(o$gNd!!i%~T~Z$}@mn`cSClO(0P159r>wM&Hz)rpEh#EmFib}LyCDPZ zvSqhL2a{oomxC1=H7i8pX_$4ioGlhB)Qjg6b_~-hA(fu~q z{&>NO!-AFBYOn4vmXJQgFB_G|sHrg3srQ(!M1o8m1Ol=RBHdP~-kq8NDHG>|gM&+K ziT^Xuj5==i;~Yc?UA6V(7kLDIv0f#BiB8&^MLI6e12wD>WC%rgnsK?*brMpykFZs^nQ?}WpK zyhYXL*#CmOb%byY{y5ncO16KCL7aQG^inUu(OZLXHOh`j2RFtNNXs%L_K77Hccm@V zp@R}oB*3K+k1Ac@m%iqR zt%v660)4Luve}f%U6n}=_FM0XAG0GJQG%we5x?Q!w-pO5F*S^cLndUJ<0-edRj*os zX`BUbPVSRBC^+vRAX-i|JUzAXUbV2ArR|rG7RY<*$>%X2BVaC$aF`!qFFAtEJM47I zPld?Xd|-E2uis^-NYYU2{iNdHVa@#Yg5IMeceuq`x(u^!t{1xP9)(Z8D|{z*l=c7> z&zVs@C0DCsT3sf*BeCFO3=1CQZyZGB?lcedxx}cRn?IhOKmKGC2eCms2mO>L!v@E>b6C{3{(R=?dyH zrlmSVOrWZx#D-i<&e*Y?I^zK*cBoRJT>T|Voi8@4svN%^VxMo0&^G}h&GlFYoJcF0 zwK2`b#SDxQxmlgcgYu`(sv?*Fvu4EGyRXAcI+PXofT=I9-cqfh$6rf7&~3cN;11B;#>Uc5m(e>^ zXVp$#e^{pdgOh&Dy)KD(f4bd4UQ|jBQ1^~Pz7Z(g03ujvie1p^`qw^ zhE%D0te&cO@otT2`Vv5()M1U!$aA9%@Dh(rkB=mWY)e(XEWH}_V<*D=%)uCLe24L4 z9iP`1F3WQW?C5#%My_q+CzN=i(+=mR1}3{dJF1pL*k~9Da;23kWgD^bzHE4kmZ7i& z)8w5u|F9)h#)H=%a}stEL~!i>nC;_X%w0x42)!mGZ)_clNpHaY0hDSf&V2mr56@Ho z>9=^dh~gb7;mEd(I;n!zbS?|kz4us>95*fS7|$NF zgt2u#m&0j-gQl^6`Gf+pudaxT@N5SP4$DMhW*>myV{`8F318lAKo7EVxAg@>(t}AL zr|L-y2tevhvuv6|dUD10I7IQ=iYSJdGMZV$qA79LQrJ5(02wKXXHQt|OQF zWL`k>aVBN6jaJfvjgnK`a zKA1y!OfBnX1$;hl(xZ@s1v$U^N*z@_Y4z`p`(s!k`@ibvgnseW57e4hO9?iaQAshmC-T&49hxP1Y>v_iUC z4D|##U41ad5lxYS+d5aokpru3Y>b6wC3;A!;)JFY(PKlO-mLz)EJVLhx)fS!)2yeG z!6)suCO*g}i{$}MzoXJO&`4T5b|{ys1r*pJ`(kDy@G$?K&@%Alny@yCg?;9cd_O+D zta)o2B%X6!Fb4YtmHc`!H}6fsi`$Czs7VBh&QfBb^H&r;Vb(7GqhdCtet4z?Fqn01 z&EU%mYo)SN@^|Ad8wzXP-DB9IFy48 zC(HGaf5@k#{7obKX?!}5mThEkoc{E?+H0D@BA(q|2dR>q;bBMWGV>yl zGH@c|hOaOR-#_3p_f`T#@MmG>4NKin*3d2WJqe!Jm%lfdMPP)8R$Wd%Fj^B=bDioK zEF4K$hTwDzHrY8+@JPDxV4t&kAmCgP6#N$)Ai_3MdA#rQfV$VX4{ zmf;nLQVhwqS8qb91}+>5hg&NMpuqUdDi@ z0R%Nnb-ni2RQdPVga6=8r2qIbYxB*QUe+n>Zsd(>+hYlbA*6*6v>VsJ)@>*7h<-{} zJd&8*y4SVTNqmV1fX15X57|H19;a=k2-+!1^=5+tY{lw-lr7 z_D>PbG{@;a-n9t#vB{Jayri$Fs0O(-h6Y`qDmA3NC1=O@rBGg zO=_q1(=2cnh3BN5xHpMV(%Fzl8-Z(vmk3jxjarEZp7D(a6hR_54;k=N2rKh$q=*|p zeoef_z1w>YQd&$?YlI$T z^^?HVcnx$+ckX-vDp)s?!l$9@exQq2c`(RF)?>?=dT?@XVQO2Gc>&X=Dr^5!ipntW z31FO$T#9_^hbHKqExJ1bBMMc>luta3b4$ARpKf3j44XwlG^uf5L{35U_h2wno*puW zXs)eiAdA2)UJRPnxiG7KBM3CkNMHy}qm)&pkuRMP%N1G2ro1D1W^XkVN{OS68Ugf; z_}?ZdU7>rnp^icQOtJkLR09Y_e&eE9iH@odBV)($q3`nYW(9<0Cyd#$Pc2YO zc5nis*EJgzoe;)AZuSGx89KYf*gcC%#z)3?-KeO%;8rQx{FgW<7KN$|1(?Y}IA+5W zvb6DB6}Y^Mv65m~i>S)bsoOX>ywCxAWsQT8^>!HmCM<;1R4K;1eatI+dK9&Dnnr{8 zm>>pdC@;w`jYqBtZdp`fYB^a%ZrM&jqy#scGLaUJ6EtBpQL>`aLrvQnux0HwjVdJQ zju;%>EPB0dfbmF)lWx3H(esC}GuDlE!71VoYiyuMUwBWd=55?TYKTr@(#M;~m$XX_ zMhj7=B?H$}BS3;2npa)4PkDb33wJZ4tf&fF*w0pmyqo!z@|vkxn1B@%H7R{WOMymr zVUTL0^ymG`r{>Uqa13d>G!DF5j9dQHQ&VORQtpHm^wHFDq*qjddRNMBCrxo7s0{XR zqcI!mBKXje{mFzpMOqSV4X@F(ZLt;;pv}Nu#bEAkGiLSF_;;&KRbG;>2LQI_f%S)x z{A?cuc+%g|Tt3}?0G^&{96!p@j@L#}Kmk|8=oOX2r>al$eBWMD9f#6P%zwvnJv5|RU> zwu4K|_MNmsXzq^zFZW7D+U8Qy2#hG_**@XIz0Zx1SPsYON5r;VT`2!n7T^2Hy2X7 zI*6px-n~s9N*vbzR2{FX{wC=wV~0uvIj8bIz&!JrCMp_y)38smyq2A;;uO!eL}DJ#ysv7 zq94xX7e!J@uu2x!)x6NZyX!2!iB!wHjoTeTh z8L`eFBg!O{*(bD5BT|~=^f!1p3>6s#B!@j^&VHJ~}6 zzxif)f4d}Edy=qE*4AuW!-_Rs;x?hootkHu!s#UX_Mle(zC`${V~vO@y2Y^>bUO8= zH!Umfl?>zBG_|;2{-Ccy!XHE^Z{8>Tk2c1;nnK&c?1fMR)GPSrfFo6NNGch3p3#NE^@tC`txt^vZqR|yMH_xP#9N(mPG;)(|*l^<1m@OTh zGyNxGUed-O8h?UOmuZP_tv9jUL)xX9Q*$Ir26#IkLa8@yNt`f9u3w{;&QuNSE4u}k zJjsZd+qL2CQO%MB2S&D1#8phR1nqOxBixL=jEJW@zxQW*ezMC~NZZ@~MO(0bodsLw z|8`)+5p`Qf+sJo&5U~|E(vTbR5~WFsPGJdDx;Uy@4|OFGN)Anep}Ml6sTLV`&zCe(nD$p?|kr|IaEVLhCAmjry z$&$u|u=(_hrAw;EQlyLi5(cDcPfCAlie^PUBk2jvyK!mz0u_AFS(ayYWW8u8!3w(a z3z==7jJS|)5w=-fs9Pvstn4B9MJv4rH3J!O2?D^Ey+*@q4A zV_kJ(<7g>MRm!K@>26yd z&kwYxXregRoX>-Oar&F{Ggf9%<15SuS4I$74EqfCq8w=C@?TNo&2ccZC|Isc0ZV6&${1X z`&qU5`9CR=d^e*W}yY5Aqk^bPp1m zgJla**Gh8rf>XjB#<_}AF?4&WXv%_~th3)-eJOJLUZXh7UY;!JiuZN?d#SeH^wO5C zn+9y@?;3`Ej5{-63wgAC7oO(MGKo?#_y_mGI?LJ{+vxFH_ljw+Qm=JK<^85k-~Z0- zuB^5f>2B7He=BU_T(q+8bVhrv^f1EQB#2m1ZM{XdeSr{CvZ&kMA=p>_LSY%oygQ9K zAuu46_OuhiFQBO|;4`+}jJOMnzW<6Qk?FF!yQwvKe^+Mg(PhnBXgE})ZafV?-sAXm zpp=mAX5>=q7r5vu(`6S#-Y`ktN+~|pA?xB$WXLQ(!Bv-jWB6f1h@8DQly`p6T|5HtM=AhZFgz>0IEQVyt4>R%UGC{Ntv+qUWu{xuM>7`8`rOI3xNM0 zv7Nd4uX<*^*0(|z?ZVm1hW2VK?GAT8Hwiaf zSZjsxZdSTjrvEzSRQX!g#L((Du1nk-D^wbLL6&y#SG5@u zF6zHjgi>8e>(mdbrv`OX_BGlh@&u(#OM!Q{Yd?x7{jB_-3=!71?Ei*;Q~L*J-*IxK zyV>>+u9-dLAKX#M*x%Ee`y8s%cHIl5ncmkX8QVZ>8x2daPd)1k*o#6VDq>0!o6>CS zk|sMSUz7v%fdKoZfwJ=^T^FZzLL0oZtI)(b8FmrFe+E4}JtU&F7E;Ry!qKV<$MTS%u**Ca{cqBi* zwmD^KWo^SpTCF(xw;SBrHjl3s?kz?Dv}OpO!LLQL?HsK*jyx{4OhdbRyQQ;&oq$uy zAJ3Hx+pea$jt008=~m&w$0DX@&bC)6)YnY^xw0(}boa#(0^;O@K35-5Tl|@S{xux32w<1=&7B zdqkZRi$=8;DFvw9N$aFrzok?md00%otU6Wkk1=3rkE);cWu{Snbx0~6(CGB!n5ptO z=oIq}?^80XsmMj}P0`wibbPG+sI;h}jkaahrQ(;}Hia29R2Zi%_D;UA;{ehKna6+@ zn3W)_dDE?lEGEsp7P$9{n-#tq0Cuva5~+n@{-%u>-V}=UI$zWAd<3=B{)5XAJk}+; zSg!tg_->%V=^-tSEj>yLJuTeU6&~tf_$T#Mq4U%Dvuy~-b1L)@+P)?#EET^0t*9s*P!$Zu)hJbO~d9=QT-&7#V4MIJBavr28Xh!j8BD-_OdH{NJ@1@{`^9#G`2c?5tZd zpdyH^Q(3a&EY`TFC|EJnaA;WZe8-z)_AK^gueESJ3g3~QK^El`Thac;Zh>7q{|@8+ zkdm=pCAA{)VXuGV+NY(d)W--f?%#M>w4-!%!-ReX!ge%Eu8gU$NhfP*PA_ljSx+!) zCd+KT2~O`Um&A z_hkClDLmx&Yk|Ze^rvp73Bl}e^6|iRdWF%HX1A4J_>o#tcjO_L&}#~c;Xk+#vq4H1 zb4m280D&`IDUrm}6RD)5dynrT2nWBy{=w0Izo33{@ZI~X@%YUwIOOmxWQiRY4*nfH zGTd9l(%U}1|KTlU2^SFu51)nyiGZ4xSDIUc&zz1v*!6#5N^iRWrQU%qN9LOWxx>JX z*KEK%v;LYEv}L?89Jo%w#)$;X6^sIRcCd0CYe`uaTsqL1tqJ1RJCHH23*xeZm^Xf` z%T=DR%N{1P^g2k%K0f7(7`za*Q9%h!1tr7hMQ$wh)ecj(p=t+8^DO@V;E*mJEws;{ z=;k#K(*c!uj%{wcWKJ5~le!EF8Erz>) zpb1k7soBaT7>4&)Z%etjJGS6TG2kM}#=Bd`Lo^NT27&A!CldX#$>w3`HvJ&)5GgvpBh8A+1G`+<5Y5WxxZxydp zs`KW*o{5ncHs=4Oy7~tfKB48UMz1yaiLquVd_{*p?bCrTqo5`f&=tV*tpWHAxo8WI z=~{p^V|vJmW;wc6sZeFG*b8tF=A%WBPgj(PQKis1(wVl}4RCiz9w7|CC<=NNKXq|x-h zO=L>X0aaY?_?&3z9SFzS_1m+bniJ`5*?kn%?T0!&Ifq0qi z$=vm&Izl`Tz&ZT~h8dm}?Ku9}B*@32tpmHp}-{BkQY3|L=+Cd|nX%+U- zs-<0GqWGkYiH$?HcHA7`fIMqt+HMAPOcTIZaXAaGCIj2gunDy-_4NARKm%QzYv6!~ zCCm2|UXGzbHNW^cEw55b)L(MTvFVI~hiV(fnDMO>c8q(+`E+vMkK2b~mMmSsL3icf zKs&{vmqg}kb3&*NX`CFt5*K#0?TJm)z`~L_tL?dW(tgT~{Mx}}bb~R>iT;!{Hcp?O zS0Y2wmXf+Blt}BD889ctvoxfc7hM(y+9@cBaU8COW>Lr)r8Cdjvbz{#)1PbSK9Ttb z9yH2DH4Pq~^HklgbImnIT44uMPH7Q9IT_3ePVGudzR^3m>2-0MvQb$!3`bAS-}6|x zcX#tD_6=3{!TyM^T2tzl$-z3JA~K^2o=FcPO(TYW3c-#9X&>o5e3bTv<O}CnPJgb-{6^e9|h$PVvUaVX%!+S7C3W^ryw3nk~jUJ%R$v4Wo75_d-ESL zVG?SLobpRnb+qF~%`@{(LbZayNJKV5*rYOK7abw@hsH(q&_+Npp2b-mW$cT0W?r@t~Jm*e_-=W7oL;Iz?(qol2+zC!a_&( z*Th05w&H;j55m0&1tphUPFujp=fPp+v;;;V)*MOT5VP8zsES{W7I%xoEuNqDwJ(!f z^F?3h-Oi(VYAO3^o9Bt|NZt|R$#GCwjMPL-K9$V*u#_K5*RbEJzWHje{_67ED7RXD zUeLv3dpdq-ZEK-Cw|AH7>SVGMp71wO>Xq{Illb#DdArTJLvfQW2hE{VAw}IrB2JCe zwco2oG?tDV-1+C#iI}BE+w0ksLQg~jb@RG}?KS2)2P(zV+85bJnM91|gD*}Nrd{)u z#cpztv962?_KYTZ@)BizAGLL^=-9`DxB8M_o6=Edx#!xa3QBzQ4Xkgz0sbB0I|Ri4 z%QxU6;Na2lAmabeHE3{~Bhkt5{m(PN|K}M3C<{+1ODPL}ItxW_kjGENkKFinZvk{f z$fkeZ_>;dSzTG>15x!7_76QvS84q_{%RM~#xSfzrOO4Oe@)gc>5$Xr zaDLFIY=-!)BvsmKX#keXmRy(%OTY_Br?E`X;w?p&NSK?K6s;}JH2s*$SR@01h61U^ zNF94lYhJ?{IuFTC?9Xvfq}U=IZu>>l$nog2*k9C6p|Ms-@JU`qeJp80gJ8dGkfHs0E=Si);T_p@#KBjQh>r%WV|>* zPvO9(G+D&0$k>pI93i}cU%^$(!|=@Mh;f!#L|QD28gq9y|KKbYB8Q?n=g&C9H2%Q> zHi^&y^6U=%8J?}<`_26PYNXV4a&$%%_#`$K9@1rZf%Zopd_&LSD~WQ-|A(r#42mP# zx`rVM5(pM7xa%OnWsm^D-5r7r?(PACyUgGoAh^2)hr!)#aCeuy-22@6s=hycs-}AP zbZ_h3=d8Vslyc1%VdFrFLxC_uS|Mr^x8O&16Y4){PI{Pje0-Gu;P#iThDt#F1Ak+X zPr^H{%`Ep=5IwRTvJ$W!@F@dvlps+dI?z>YjYOtx++O(y4Rp~D?yu-)T7C)th(j|t$z?J4n%@_9&l-?PY6{uv8rEZH zoCSl_YurpATZ3vMNvWc9HnF#q0@w{U#!lZs$G>cpbCJE=BH39>VsWQw2J5nslJ4ZX z1T(TY?|LQUi3IE?v+!6DSYvt@>-`Y=8)61w&+*ZgIGilfHDrra?2qFlFFKCK7En+0 z8g_y2|KP~tV{fJH*xD2FWF}d@ts=gFU30uBdc%&h9&5IC!#)>67mfc8YQHZEv42h*tj(+)0_5mF2Ae%pIcuW%K z;xV<3pd(vbW7tDFD48IDqx3MvuRLk&=BZ58!*)|DnTc_$&2s$@j)Z4o==|HDVW0H} zaUz*XcKz^k%6`gmx_rkiSr^HI{IS?=-`Lu&B-PwYkT2#wwE02sbAxdN_f`4l@2O1S zN#dA3>V67RQ@yROeNzEs=+|PhXhMOry61%Bi@ioh^4CO4Y-s{Q`+K&^A*Nw`^Y-vF za>b~G3egN3xbq>CKtAmsV)W+&dV!uyDwsRFz$so+!`R|^gG2JRZ1+jWw}y+y zv1Tt>eVQNv0FGPY1yAeu^J5$-+9RyA$+F5#AbV|xRo6dambAVs;8*Fa&U>N zI61q-C*;<2;Zk!NyC&9lPvUWZ6H`?)2~5iSZ5s5e$1M2!=K24c2oQzeX*z0*;a*jE zXpG@m@0Vu)_E5Su_0RD1Zibv@hqG{_vURrkk0N$(OTkM=rA?(Ey<`^Ezy{aSxmb-6 z+$GT+0TvG(0bJK%Kvwfn!VZ*iah_%vqF&2PT5BjiuG6k1Ri0^aUhlLQSefeFy~nIq zL0aCX)9&1TEACMLADKnmpa#c9F?sq?;#sU}*t3ovOXWSzKe*!bDTPz_HepPh^wGIT z1$X^3*Au$u;&vL&iyysw@y$IKsa_qQW3-Les(<6N-;VHCSu|H*-P(GzH;8JH{jk| zH~`)GG~QLQS6v|-H9C6^M&L%1ZZe&09w!>$e~k5!K@0!gzQmOu&d8tPlnI`##P>+l zT7;o(c*`_i+N1u1lN#UnJo1ye_NxmtgG zF0_|cg7Jpnwr5$K-nsYY?Y`16>SPcGweLWRsA3*Yw|9i@lZYKu|GZxD{0<@eHGN8c zrXigS%!IbKUtG{T5^JKZtMOeT0sW~wc(0LIEroaF4=9(A_i~e0+7tQy!SOmW79o~7 zuulUSsD3*l?W%n-puoG$ayq{SF}J5|^}4-@Y>yr=e|1NPrutH|*)SGL(?`|}4xz1L z32+^dd~CWEnwS0*dg0|AhfI0^T_0*=eW4N#OsIt~w8gbC;m{?GAA$}4^~CJy8Nux4 zP#dz<;SY^Q*8VvqYws#xtVsrl55C8x=DAanpmeybSNZ|A=fdFvW7)0#?O;Dgm2dIJ zuj{-7T_?Nn>MIasrG>WNeOe!62N|)`meWGhUNKBW~fu-^)k(aDFq(QKF_ypl4Q@*jHpIoo-9VmGHK zh||&DF!x3%ef@Xke;=Dkq9gL->No<&I#DZ3)f|4yspsg(A#?j`y805>L4(hI!S|yF z{kMw?ZcPJ$cAF#q2)}ek&Wp@HxB&k*tudIFbvw7$yRyAs{~RN0=3tNHitrW$sqHlX zcMMnl%Pyv<&g9r|S1T5VQc+5fa~5t=!dAb$*O&+{dIN1`YKsKh?O^{MKHK5vmk8=x z6@TYo_`u;MyQKJ^BW7h@x4Uzf!d><11w(aX^dNR4+Jl~ zrnkJjmXE1+(foHvLLOK?X=gucrW^4O&Q|(^*x=s!snTY&!>I1prsw{nJ!sXTn<0}+ zb)Dfx#U6#pn6z=Rb?Afroy}=*P>>^CaKy7{;eDYe1pk8dD)<*i^wEze6LXhpAxXRt zu^)qCBkeDv+b+AJH?y{m>v9}Sk1)P9)YT^#yXg|MTI6TzPvRpZ!b}e_ub}D_< z^XpO9t4`-j__mu(dQKGu1bpy;3R(QELyceC3s-_ z2R9R`|98Li==_<^U4RW_(s-Fp27q8+YIr8*d9>;=xfypdrJsQD|JtXjJ_l#p?w9<7 zOD3zD)ji*Q$yev;m9G8#px0?r0m!U<3pU~Z1>4M($wJV^x->!ftRgdW^VIxC&CjYH zqDbfFQP&m;v07Zn8{&R;xcFXNdHo5|GuauBn5vj=pCohgH8F8a18{+o4oltDdP9UF zyt@99n)L67*>&*fo-M92dBl*(tIZ)texF2IPT-$aD?fEdwKQer!Ern&GVU49P^^je zV;gQBpT<1ykA0zA{rvw0m@>v=<%*NNvD@p?M3t|da+3px>@76^g#u|w#2+@W2SC18 z@f%$R=D)D9_r3zow8Yk6(s{oU{NVJVw`woZnbSP~;1c6r%#7D*{8Nowad{C*m?{g6 zoY!T#_lO*6hnpcr_qHU|2{0x)=l9wU#A~@*i>vmwbPE9d2b@l`|1$!=sB2pAIN6TJ zHH1ckw@;QTbW+&|ephRJDE7600&yiF8x15JCN~ht&&Qaxn@uzKA6tOkzUU8!$IIJe zR|va<0GC4@i^@KT4`AUz?c248$_K|MH1$q&vL!B6pYQ2xtl;6>u`!~r%l_V>Z&4w9 z4Fpua>>Ad&85w>#t8z1r{s&i*eu676OY}D@kb8QVObW_`VWieHlllaUkBtG6%4hZ; z+DO!Vo0C{Yl8yaF%B3$EE=A==dva~Mzq&Iz@P^7&$^KM2+EQ#}Qj<U*p3`(Yt!RzC9R5uDUDEvfObDHu2{jn-uJSf*`4qS$`pd9 zUb*y%azeg(>g+4VlkROhYpY7_@s-nQR`=gMK=XYq9M1?tX8Mwzs^_xR)d40EY^h_8 zRq(Q_Tt--`#t7%TLYsw)(vK8aeU)S?p{RMI%|FfTOq_DMir3~_AeW;iqpo!y+ao&w z=U$Adw#fo@C*I{tqQw!sOZ^;}rPex=KM-%0=oj@B7SlfkY9KkF6Qj(k&$kq}ridAt z1T?uey|`-`dIC9>lP_DwPL^qG5jc$2p$ESkTRdShX#unF^|&!6CO-u7-UqlRthvfd z4b-VkNRUH-hj6>u^lDloU8@)0NGYqQ-=_A$=AZ<`@|~84q+A9g-@-DZh)<{w+M4=#*Rp*v!~7FVOLQ5T>G?f=MnWQee)@cbMy+#PI_S}LVG(962s~|y0S-<;5AX+V^vU?*+xcGrXIp?d+E`R^G4Mos#C=C({a18 z$^n%@G%J=g-Hq3ta1mo{Lxyu9gpVzJWw*LK=B4?YhE=tM96mNAnFlY(E&DPPPc_zm zAaYWo@pDN+p}V6`#fYjE1IUMiL!&*W+8&I^LFO9T5lBatQIFB1RX1JTu_aNvAB}gM zXx7y2Se*aM!Q^KgPwiK3g}{8WB(^1z6`QE%6SyLCN9W99>I*>PDmUP@MiEwjn*DzY z5U*REFlKuPyChJ%czd&XRPG7=_k<{}rdtY5g~^eGf>WeHnOeeNdFrX@A<{gl44usd z(ZEZuF5sJ}t%s_Apg_?vQOo<&UywVqQu9lMS7#-P*Y8y z1$a^25jH))DVJkoiS54ao>jyQ`FZSX15Fo(< zKNCjU7tEz4q)n{JDm99poHNxe4w#i?&P_F*O~HB|$zazt(&wVL9ro#VhgBrYL@6=# z4;XWu7~*chC4%lq{^?7hBirXW*r~idURyxFvkIT@o~p4I20h%e8@Xwv#$K z2f{3B*+!u@%?a6*+tYFyNgUvz9uD=3c>A4g#&?H(|W zLpLrak2IGD%*ozUfB98LA~L)z-H{wHgc`Wf#O&s?qB3t>4J6$!MfzQp~e{Cw`c?>Kmr)%NmgA(m3b@l-DM-h9> z24(8t!2NS3Zin;npyJn`ri5{A*7{1#nhOUsJ6u8Oa~kI}+IuS>KE~tib+jX!L6*+N z>#;^2uDnu_WC1Ap%Pk~Rjpf{SPOBby(j$m%*!^uYg4&PhAESCM@X(I6w{4p|;>-NB zQ@Gp|f(vdhZW_8*Ihwf89ug#74m)W*|G}|8gVztT zRr&7qnl$+l$z-~3_$tEA^hGN*yw@|!5eX<>JgX#E^~T-d?NIuhT{V%bS|bS5Bf+aB z!#xE;{=WI%-1g~RE9Vt!s)`@PBZ|5$H_1u$(yO6fYZ=^rxkDPyWXjiXISX;d7dIgf zso$U1YaPLqkzvE`WQ7CwMe4HLG-%IYRI&b#&E_T!?u&QC9*YyKscdcr>xzDSH@Llu zz~g=*fdV9~#eqTy)PZl|1n6UGQuGBopZVe-S{`hr>pcvP_IaBq zUMDwveL$JVGB#C{AKT6HZDZD?u~@D&(c!YHN8z`Mpmefy(A-w79HKK!P^@p|I_I?& zo^V<2!i$MF?ddvyOrH~*P)}Rco@vDhI4&^E@Ua^91O&Dg*Kn;&1!-~MrbK5xk;o}W zE{z#1sJ?t|uPGvl1}xM21sE)gza_jyjiIGcS&1w%k~Et*4cQ;#PUr>RpE~8eKXgj_ z$^C=--AU^|wbYA`@#zHC^muB`VzpagJjLVrZrv_B{yCLTfFFG26gpR{8$pih!6R|F z)7+{aN=*WR1!5`vXul(MK1@BXJ2mSp*Ky~-KhnH%OTUSX4^rWH-k+WkQ5YO2F7?)x zd#@<#gHFWMG8e{E&R+3JN@Z_GH=^+}PyG2Peb;bo@zw14Bzt$cjpS{Pe3TpUn%OP; zeQd>Hb7{!v%%}+n2_nl|6pF}K&=S3l^JwYGGFs2V-8D=exMH=T zdPr`teSoAS3YpR*fZ99~jf|pC>`^O+Hig8?IRTdzn%fg64wB{wT|9q<$PkJuQrM7} zhFHg#+Glp7YP6k*%Re1x55lA`bB1@#V{>_-&Bt@sFC4w@PpHR~Ryg@?^q3P}VX zNW~MRWNqhb#Rrb`g%C?UrO7Qf(m9*zj9=hbG-&)UgC9H}Dg1O_XCE9NAWh&7vkIn0 ziKdaYfOTCx+LX3c)1O4zG~ z$X0;H@}yZx`=agyW?g!vZ(eIXT>-mRp6!Xt0ctG$x~Z#tNkE>)F5ETiFu4dA-K25~ zUt$%n)K$&EzDFN-p}zu6kFZ&!G;L;2u3u;EM(Poyo#k4>z2IxsQQKvCBxVbSD9g8@ zE=^^VZ7l22sqYL@J2DbvI;Tght{p<>mNXe!%K7mz%eWQ>DOM4ybI|zlYx@NvJ+--w zF-J6UbC)xJy>YB@NwQD59_M;9?$Md@I9^ns>>sbnKwM1S%{pP3`={{ z(E==NA+MpjRwkMbJLrI~m%%A6Wq(K0X@bhtXN@%1Sv}|@U2sx@5OFjpGI;(U+!B?p z%$i|~d8baaBxWQ=yhn1h7L{#TYWIWuTs8Biq}f?X`|Lbg+VTE**aD0nYnx2Vn6wIW z_H$tUq;^`MQ)h@BezBzAj9DT>(u?$YjDwrqY76s=Fr{5q5%bCjlgE*UfM&Ss38o0t z@i8&qu{FK7bP>JR&AP{E+7QVQ`PgaqvB%dW!U|P8tw6S3vX5 zB&oNe3P!Ak00==>x7orKR*x`qy2n#&PwC(+b7AuY?vDiY|L~gh1xj{lOkhn&{85ux z^$5wYw1TU`OLAeZ=@`AvyWQ6dfv-C-)t#x=&?$BNRsm#bI(9cEy!Jo>l?+81B1LRg zQ8-kD^i)xnmu&ytUS!NpeZ9+t|M8cfutn3im)B~e(l;c=(l$A1e4|+acTOCfw^h(? zAr0SjfbPpZjz61 z>w`eC$Wp^Gfot_`u~2?UD^q?CERO94eTU3zBA5n2R<Q?!uJH*@EsglY^;a!+dnE z__G(E4DOykr+Khc{0i*TdWW9arJY+&@{L6aHQ@x`9^)NDXe%C_EpWVT_{wJ9$Xn8? z%{={er#<5KfJD;lv?z_U(RpAX=~d+HV-M z>3JhvfR#xQsTh>xRq8n$$AXvkMoNt#(f#D0XV=W!Vr{T&6>97|uCNA_5$t#mR6559 zO5)N!($uzQKT93LjJ?C{q2m97mj*C2n-5=CnKd-YoF)otaA7ch9aH@C3rSkc!r?%7 zf3&B0^seipu|QByA50N?B+Xh}Z+7@NlOD^9f?^v~8LNk)>XP7c!T8 zC}V$)%?P}&jcARSs3aXFRKl>$1ywTSMoqTB&(y!wY2j{wyX1iHG^itF{i*w}h=|s$&;V9uL&&{d~ zWnTS{-VEIz0?J3|stD;R+vHpYuLr(Pscyu4kxkGQNdr5-e1o=bSF1#>W0OcK>rmCh zOx;-`U#M)+z*)L$dM>E_x&~IKJ%Ij!j+<>z05d*Ax5RXmUutBTKxHzQ+o@W^9yfJ3 zWQ+*Kzx$j6H}5UxG(XIPjb~e9#Y=}6H;3JAHLO{Pn9Y*dx6hH)G(Sy|V#NfzKM2Um zH=Z*oihlfSmo#7w)q;PV!R2$IP*+_RT@I!oesrRFip~5;=;F|_S=T&*lxVuU^cQC?>$9GX zC8Jc=_ElQ5EWPGAio1P)Ip?_~6`!m`1%k5-bQe4VNYT(=WL!>kwa{u}T2zSC4IXwB zuo_MkF%P1_ zk^GpjNT_EY;iCkiELD(MjY-O~Vg8@vhGCYcSTJ^-5cML_sr>A~JC*>Y8Qpx!T6~gJ zy*fYy{p~T3_pKJt!{>6)d$)m)@RtRZMYdF;UA@aLmmtHhpf&0}#a_FU!ZK!MVZ`Pm zv)ghGr5Btwq=nphS5v1r)!wy!?v5STH_c|VR&9I#WC)xL^(nE)SQQIbQcUEFS!XZ) z#S?&#St7p){hkT5E6Y}R5nHxrbg}CI0U4CZMr)>vrN&+UlH#>`0^~F56nc()xMTWS zqg%3z%|I0bdSw_G?~Yg{e@cw3vM@ezbSmUFD3XriT-={Eikl5s+H2LEJ(TT15WgZo z3YltoN(-b0LyNl#6{?Ce6$ee4bzJ|@-c{Bvk-T?pGuv%7&uy!2>CI+NSMAFs!M!#JDUon16qUM( z0h)Ql69bC3Pdd6UN^|%^*Roi94Q<<4P&F#7c7y-2=tU+uGk>YG>sbhmG)F6s&VcY_ zy#8je6i->p_Nm;kt~%-HnZZhW;MO&#wrQUQK6VjF-HiZ&KHL)x*&c)nS5Vc`KMKDs zypp|V2F*<~O#*%XF4WASr2XLZ=Jl9iZ=V0!N}*#@4g3U}qZ~TVc656leB49J&`4J_ zzPu+e;kJOi7OY*LR2>LCIDv1iYle$Vz>x5<7PKRgpj<7cC9t;*tOCdBADlVuLYvhZ z$xNdq{)Sqd$C&Q9Qva@*N1Q#U?xQBRq|UfiNTB3SnxLfBnI+X4ziR5-z8GzOu7kvI zwYCiZ&BKd(=&zlfCCVtb)?ySZ$DyloFK$Cny2ml_yU8jM^HuA+6P=t2ja=8V0y+L> z-5>6Izr1}=k71QA7KdAtx6XRGc|kKzi$c~%UD4G$lPdaRHrpnI2!Q^ZKPJndFo zK-gOB$@#d0gA(RICmM@O++WS`+2LK>F!qrYetD}JN9m7EFfaRpAKTZRMnVJfW*zi2 z!}T$_tp{?=2#07p)U)IbDr%zfaVxPm@S2JA!K~YLz)Yfj zcwKNab3xJvXW|n2Hx{or97!IozVOlN4xcVDEuw;-o_a1cIOv1SXSKFu6Bx$s==ADx z>l$%R_NNlVrKQI$7o`bH)`mPWIbLFRgO?r z8~$_KHgr;W8y%bHW=_xH4QHdP0CiCJQ zo-Bx>Q$1&@DZKBCK;02%DOn=Xi|Vlw%eI?G!9s;@k5RNQMaB9SOK^DzIQ9!ur^t<>1*Y8m~$0#&uP zjGRE3(wL?8)R@w~ggzmr${kYiM3YX2>YpdA4HkPsOB5fR7IS}=W@Y~JnkPf0^2o$y zpd{o`-EvzlS12_^IarNkJJ2?^GmfeSLi~O+?R}W-91 zfDpJBT~$8g$@nnTkP`Pvhi#sV%aKt8Px53gg_x8~chxYIgB+aS!z8SDLa%v0tWXy2 z$@1Rl8+_!6O}Y@eA%uc-vnby2+SClXIcR87Smi^Qc^mda z#&pxy%B`p$Wr(*I`^TE~)49%>ZIzEzcVHxalIB`Ku`N{zsoG{qacLe*conwtd9J=0 zr@`)i(T|D!jprTX@BYDkMEkj%vSS}urwNZ*_jr#iAvkEj1=V}E4fg3?Eg5xI1X~bR zmdt9E-Dx1$RrZ)=Xs3d>ppQg{>( zb3R>i(F#xa2)48rYYtN5I5hjI8G0VF$i_q$hCCKi<(iFPCMT?RYa83CJa3N`N^ZUm zK#^>+`fwD2EjQPyk(IBtd>LK2-OADDtX)zSGdZn7LINtWzMaGggQZRX^27=47`ott zSEj7MqTb@_Pl8o593FEWnn63;CERnf6Rn*k+OnjllKXqEt8KXb3?Y6kiXuRi@;@Qk zJvwJ9)Ioj|ct&BHI{)Az>2k6;j?Nnq-@!iA7#`DC^AjE-=Oi^D4pH^gaqn9iENmM7 z=kGd^|2wMl>RWI5%=C}5CFpj)2$l$FqL<~w5Xk=gJa~SB)G>;Zr0q>2*z+EL|OPKGG=H(ELM>Vm(u=jGsuoAczMh8 z8voL|lOA}~4!q*Ncwh$&pV|9UjvPy(R{ev+QxuWb4W3o*AN;+F#j%2Rj3K6|Q``$U za@gxZ<=|zPOuSVW!jia8j^_T zb_2J#ZRY6o##&}(pB$RUYzw@5>V#;)ClK7nMZphNkqo8pU7anrY37c}^+kRuweTL& zu~@9Fzn%n6Px9J7(h~wdfrz)EscTFI#DGQv;U8sfa#8l;S*S@$olNJJexgJY57UH3eh|5*A$=cDk;&}u~OPSG)!u^~=X^~}S6;11FB zMJ|dxC7;me9@?xry_Qp`*1z8HwUn)=rCwY5X1*Y*loFegTtD4R3rzI;Y z++3#x0hjd^8&W8d*a=?;X1@)|O2SF$j~gowm~fs%NV+bb4DSIMfmtiO(jU;WJ$;E$ zdN*BkyBXH0koGwBe67;AXr9D@Z=bl9lqP9YlyI%8TNJ82p;L3cKhizqMlA54l421( zmWE>y5bms%QiZn7SAmhOK2(mZf_OS6KxqQ z>|Iahdi&YEP&L?ZAYI5HhH{yK2(np@Ap~H97TSAaXWr0L-%ZxN$bJdPTdOdA)T?Y4 zxv;%rqEbBExvICEsn!8prUK2VdN=J?)jkPrVHWw1ykw4NG!BJ*_E)7HJ1k-uP0N2< zRTjKe{|85xcw7d6y~}+tJmur5_P_RjN^He7A68tj>g{-2RJVBEdmUN^7QIkBmEt{6 zXPIrw-#_>q%27frU_LcpcN1>m_;)@67)?Uxb>9DuUlh$P%W?CdYGd;6th1j#TGWn4 z-*@-EOLg}>@b;+8w3oy?td{n@5%Yugy-L%iDsTD^t)6*x4?5qi)@te84pv$CBe)lN z&r2Mg-6ii}j1n=n=K74Rj>$k1$ZP<5j8Z9_GDm?Q>X7oSCoG~EempyIwV>nIV)C6^x=e1}A2E4dKTfOa3`0e?_jDiFMCn)YrqxSr z@gO=bPGpHUy6aS)V3JRYm!=*oh_7zoUhR#az$3NF_2F=@^W5^Nwyrs^0gvLHMR@E8 z2{FISBK0+nRQX3HkIfb#F=?c2amH0|xM3gAhqi-b9wLgG8*X#spAX~z!7Yxazr?5r zuhoI0r72psu>=PO+~05L3d-b+v-i35T=x<}!3C2|8ld7+5yitD2h-ztd?TQZDjvLUtOAKgxS}S}V zZ5v^k@*TWOXVlh}76d*$=5ELmSW=9)-<)U}kfTSr#KkYczsyRW@4nLP)hHj`UM1>=QV9UE&!hOSgR`yzkM6y(V4cVK-(Hkp#IhEZ{iEEvK?nGlzPs59XV;h7r0 zT7cZIkQdqafBG0Lwry&Lh~5eVq2AMm=#*J~6ESgDBM3Q(pLkQ*TQRa~N~SVj%(Jy~ zRb17^Rn8$x?X#x^N8*$pbz$;Nf3ymiv`|Rx4_*d1%E+v6RnN#6OgxaKt&6BBjqIi} z{Ps~~-gHZ6GEP`2?BEj!`3Ki!?2=TSN(+HVROd%VH!*Q1R8ZkePS**BM#`KzUkCYY znfdQ8bWEyu()p*V`j~cF6n||KlG5f_8+gw^(L!|nu4+XRyCgT^OV$a6_s}k|Jl}M@ zyQC48B|no9$~|^CL!l(y&MZbM(3ZWXX86B23z%79Uav^)&tHwHs(RLL{vDE)$1tYA zCl)Yi_KY9tS0XI0xy4yEO03Su-k|ip?gt4;L?TK_&jp>d{1=l*Dv*kgUO_N_LJ+38 zhvtAf?Im|)b(^iZqsBAA{|RdX(fWjmoRRC~Hi+!~O23u}2!A%MXT#$hB6{yv#3)CH z)pNAY1(cNz;f5^juISGcADkaDF6;#A-DO6EnZ7
KhZ;8redCT0me(-y@FNQgFELpS0(_Y}8VHIA#m(It=xfKYmzBZjrA`a9cNys2 zi>0uj?|_teHC{`S0K0^x;4;HC2U?@chj7SOB-Ua1-Hr>U30W+1Tx_V2#^Rpd_9o#2 z(6w5MuyZ_=Dmjr^wO_ZfIRA_>F9hnF*;j0eCE^xlw1Za*_({0**zB$SU!&-r zgP0%xym0C3^*5K5{7C?XI@V?=l%5y7cMq9MptPYeS3xhXfIt*dwu?Ne_5-nOTwD_; z5xqGbBb#5zVVqiONouYmXDEf^v=`C%7KgP>rGDsr{_13fC60R&FktGRML4^Y)Y^B_ zcQRgD=f^5n61%8vJ<)5+A2Ct*4QG#DfJ`h-%5$3A^p)hIET{WV$Uvi+qcW^T@l=4+m6= z=z@&AJJu!`9!73%8AY+E7vEI*rjrquC1QA<&pw+_$7=I6P|QC-#E>`S@1m<3iP9Gs zP%U02W3>rcY`xK3C)s0hB4-K+QlaR0C&*HROX@#0ncf)J+oM=bP$dwcKXkrQ9Gdhu zvhhH6hMi!)nu(IUDc2R9<)4**`ZL7a!CMbGk_`|MU z4vVOrTuv$Y)%6yC%afS3@V^4+J$a}X`JQUQTM9D^v<}wmPS_=fUpNVLkYvspqMBWu zu?dt>ZC-Tkey#l^vt~9yT?o9zE2l!$K!9XMZ$Sm6tDx^QU>+YXZ#}@je&`n9qm!Tv z$E*RVZ-^g;eP^49Du?a~6oKmx{MhD^ObIPHa<}zkjohouD752vr`$UTi7C_Pl??}%c7C|XGs~)yPjEocC$u|a+O-wIMspHJ%h)! zqjp-MKV!Dzm=zOt&2rQ%8j&h^G4^B4qk6^fC=p3#Q%{?9r^#D(Mo?CIS6)mVkOz>f ztX7xhI?x6rQ32P%CV4ExxZt_sixr|^yK-)eR2WUksLs7YYCfB_g2BwfVGVTt<{Aff zH8=#iPb58HF>wu7893GJ!{)^!qTRkzm?%{vRdO?=oHj?GX3MDXmeo1U3o1=-Ws6>} zIQ2@JmTjL;Socy5-}3u4*W6&awNO*1ogW(9)8p6g^ELli%;IfnOW;r8Ed$W!U4i_G zfg)VdGjq`v3jHxq^pgJd%M~tJUvaBiX856S)H&__-=h2XW1-eQgFcojZk2Rp{%_qI zbeM158vp5wd+V3}zm{ouI4lY_5oIGx$AH}U>hrG2%?tAXwPU~wQ;<3{7=LOaxQhX+ zMEOot)u609QJC*$d~p|gB25Z7^ewFP10~Z1v<+klcHus#rg05jF*L{|L=>?(MeyLm zL;i}#G4Jk1dzJ<+80#l6E~KH1^_daJ_CiWv9+JC8Jr7_Dj*wTAznB{sm{byc5k}2= zs7YFiE{ft$!{jr)vf)|@JdeoS@6D1QO3KO9$f*URE9j{^^qV=25G(jSN4FuXV|c+QoV;GUw+SR-gT zwHg93K?b7Xn9TCoBvf<4zx=^uevjx`Yv%w)XB>8o2DrPZl2LW0OsNk`c3gvZzxvd= z)Qhh6*>6RikUz&$@_v>A*Lm(SmI;L0oGF8t_cxCySOff$?0u%hnW#I#$gD zsH@GOuV7`c6II9#X`?%fUH)S7PQInrknDSi#*_yG#bOanD$v@x7`Bo?_}|Dr`1}R6 zx{5AHs)>MyDS7gACB;&boUH=BNR)=}h_y{(lCp~}Wpl(N4h3yfJjCqDXr+E1oMzr( zj5_l_itm~lWdFMPMyR!hS6`E~QGnA`GG>osi)8g`bSx>scL^*?|7DP|Q<7zeI;S^F z^SHRVY|RS_P5wc4fy5}&lv46uc0s0vU4KUzAZURo>f|GF1xZEuO?*d?oAq0Cf-ssJ zT+i`C&FDbYgq1x@r3Clr{<8elJ#|N>#z~ikP-NWHdl8;g9?l0liSw*Mq`s)zuwh4U zAr4WC6XA>?%QSaerKMFsrLWn6D2fLu_M_<1bFY?Bc|{zQj19R&b{BecE+;@J@<4tz zo2nYUR;W!$NOyHF_t_OKM={W)?dGG(B%=^8;2&IB2!9nC^YGq9kcrV(k2(8pizSnzFZDH{sq}nBFAVX!3ds z!hK^6eJikQpY)5?9z}i04wVpJ(2Ol_WWS(G76LHBx?A?P|G~wN?G@}P6n^Y-mn4yB zS5O#x5yiK@f-l~ng7Qrss9I|-E7tw7_$ZCcrUR)WR~JpMcHg@D2X}-^!_^9C4|s$> zcp1w}L&lI7#SIN8X2OP{K;C^=7kORalvTcarvi0r8xF)NFHUWYEtY7g2>oh8pEr~A z19~(i#O{SJg2dsAkG#?Cw^i(X`)e(3WA~IGL(=El)dA+DaCSFM(m<#1sDifa< z8QsBvjvu)n(cQKxwqO5x6rO42oydw+Fcdp0=Tg9SDC89<&Aw^P9@u2BTxxmO`M~#i zq?1HRDF^?85T3Ar_|X3<0+RkHc1gDFHmI0ct+C`+bl36|+9w%S_GPi~0BQR=?fAQX z6dR&!sbTjEcaOzL?>jy?~ zY4wd)LP_Zrmoo96-L-eayM}Fq_H*DsVWFlJ{x>sTPiu?C9DSu)pqXu`l<#bxp%M8+ z_a%urhps^RT9G&j>!a=~UzFtw2*X~$lo_<2ZfJN3v!R5A2w%Ul}nyeSbr^Ew)Rbp^R zG#=s4;zIOqpWtW2e@ssj&!^Y1iXHfVVTmwcX z>U9Wj-?mK*JGpNg&;anxx8icvIQOk&eAsZv&>rU%Z0o7E_{r=2Gk36$k@-|Th>uv@ zQGAcl@tthSa*_ivH7~>+V6cUq-~5vl>SwVxB^Bpja5+svHvC1)g8#)axEMJKMKZ;> zL>g=Ao9r&ZWDH~aLsqn?Wv<7IMOc}nnXhD(ga~E@SLKYPGJxD9v|x~V=o?c2XO#SY zw=uioz0!pPA0?6R&0s?%Q;V1tf{j&mTzBu( zSY;ZPq9#l(3XS>Bqd!GADhHCNaMUHye}{n}n!~N?gL7|W9NoZBZ@lp1T9845Q!oJy ztiEH;^k;SHQ&{zI8K{rg?)G9@}Z=s+ur#uqHtv-AW_zQo2J6B#@B?W#ZN#gYGc#iq%d z>s!5HY8k>Ou-)8lE@fUDZTbg=GG2;FL{12N^}@NNBT%YH>es=~)EY+B zgu3pE^j|Y+Y#KAI8iXNrIG?|!(B0{!%~l9h2lgDV4{9+@nD@$BaG@+(5Q@YY^q<>Q zf$WM@T80*h81+lJH1ryO(dz1ie&VpBeQb)^G3MPh(B9R_(bFpd?S#R^qeqO`SEP4v ze{gwb&-S^6e6Mk`3A<1Q_TuiUTe)>Bm)LpUha+0m!_4tOA?jKi7dXIwaMD5iuZbT& zYJu*9M$EpY{FvEU5#}s+&oVOFgXv=po#CEG0>Txl{eB84cswDOHI0n-A~y2cIgzn- zkVlLAFBwYP#baY)w~63rAE)Uf|0!f?xC;zSv;(AuhzK#|1_$-Nk~4jdn8_JNCr?PO zlpP|Rqd^;a1V0aJs@$daH2bjR+)DO>ZkW~zrK*#$`6R+n^?P;ILp&fOzm-JngVyvG zzYM=^yNIM^h{)d~7@8tMc88!X!6{pk70!f*z6bB0A-f4K3avtC zaB8*r=c}+M#m2Bei#9Q5WJ%2Qe{hF}&k{TP4#Q=8C>U}ry2o;)uRZbOe%;YPqk5ZHoPv$XGgU1^R6=V+3-9d7$zP^xwZVFgv1vwA{>P zGBH$^WZ`2Rd{xnnaKR(>{32g|tjLPGhDLP+>OcsU6B#>baiex**~cyjNJI z#Mm2-tj0#6M7yTxyUHE3EZKfkjPTKBq%6h|yM=kC7G%IzgklYNv(=S1aIQ9$7h5Je?aN}s}f-jZ!)Bj;oI;P%6CYZMKa8& z!5YS8;|M@Ddsi8@rEI8FiRzIlG6QEz5@S@G9zZW`PBin!=m3PN{9AdDvtj2P`?7Bs z;C2#fQePI@ixT`}8k3fXdHqDrwIfIlHicT-gWP- zd)E7UnKf(F{AGOOW?F;vy%tNk_Q#bG=lzwpinJJ8TF6?rt-_g}iY7pNW(RVvV~SrT z_gzqCG4sW~4*Z&3=`Xl>VJ)eiotwDs_NX9TqRovt!YIYNUXoSC48k z5Gv9O$tF&y_H6LwzC#I0|F-P2>!G!*XsNKQhps60rNIB4lU6#p2G5wmZpm^r+p~Qo z8K#5w@^6%Kt-N6Y!nHAcsXYlgNxR)oWO?K(!;2R9@qUzdY#|&qvG_sKom+VMXXpth zGqtc#gLaMM!F82jdy?ovDhz@PDh37d3aivmOY}}p9o+jrk`!{N>J`c|%t`HbG9*OH z-_pytaYLXS3RV?bPTdjQoZ!!cwwoZ5gW!+sLV5krBF{O1cBoztnc7- zn9GumYtHu_{{hy({yW^B@cjuA3-fV=ejLq}mTZd@_Ch$G7N)Y4O}SG5fs!kQpFI(v zkF(joC^X!px4%@AXCzYbarAE3E&=M(P<@5X_==fuJ>uL2f73{3!R3E2+ZaY5lhtka`H6UF8d< zaL{?FR5xrc3x#enLrbk;)+J;R(S0#Ris^Bin;0lT* z&jD}oA0Y8^e(X5u`+)WMGsFbvBcMlVk5KT46tit@FB)Ih>%C67+>YFF-(PsFMy{5s zLs*~+#N)e0F2XEc1v&y~rG9h5d-KB(IUHwvc3){4mjjMa%gQ;1vv-PqNrN#m?DzZF^mPZF?BJ;;ZRIHsm<~ ze+S=IdFx_=w-lQoW1my-^Z1wTuOT~H`kKlJ!1Ab2RVK3vckL_EJM}IAugVL43##2H zNbfRrb7@B4OM>MzYnZ0t*waB9aRTqBi*35qEkS8LBPxE4p#sAOi&g4NhTSt7#%8~L z>&|q#Tr?apBTTu6JYaa!>y=hT*v^f_Fz4$G4@2tEJwYcnZz*mih>(xOaoMR_u z9mmlG`;l4i^a}v?2eDz>PM=Zrw;+VBHu-B9G#~(X-Am+bRoa%tHk_;WyNOMO}2N&EH5?+!6nGVNTepQdE!|BW3V=2Uop3W&Ami* z_8PjKiFTPwg=!~W#YAP-DpeM}s%ZlOj~nNzj>Vzn19{`|NBQiH=Bn%~s3p&cP9`}$ zB`hZrSFAku*y#kVWia z%z5ON^V&IV_kyE4A;rD{tTNhD8IKzu%`zclHbh8#@&B5SJ8phG`ex42~xEhJriD%NBGUg^GlC4J2{9a(S9B5|r#p%YU=mDzWL_S;ZShQu z-diovg1zbJ>3ToqiuABNYY}qcE*0qQ|ALaK1+8&SIH8o?Qj}NhnyqHB2+QvJ!+cn8 z_-2>FZB=DWL;2g-m?i0+01A_2v^XDhtts6Z_dz&h=Q(Wy>%bHPewyKE%6AzA^AJ*ng|l>J_hqO17H*d@lO+A7cWW0v(HO<%ejy)Prk zw1Rol@}Z!8esv$kWdj+nvhVI)a@?jt;lvhaJpRW6S|T)z@at!&Y$mNg)z!!lA_Dl) z4nkkdQi=;>z{`job=@tHff-zpB|v(~3+#BOiuQn}s%?kyy`nvtI4;MlJ^oUdaBgrKZ0C9NoM`Em}-{1v&%hsmL4w^Ms+ZOF`i%3+x+w{ zW?B3l=v(1?-kBV&7$+Gf+pzYJisXek$cDQnGy+iL3$u=7d9^#iim!Q2Dzzip1S3BP zPq6lY;K#@SPG}Kfld3T3g?WBF50Bdq#SM#T?m)&;o>8q}DsvF$HqG_)w%z)GkAL7t zM8vWCwh_k-A4&_K%oS;M(i+2I0&J-G5m(OhmQ0#E9_$p$%5KUFl;ES?mIfu%X-Q#( z>sp5MpZDTHQ|8~eZ)6g~+LX2!Z@n)ean4E=d@Ton-rFJ8k_e8Znlgr^)5}`p=;eq_ ziI28E#7OdWrYV2g6OQl&(Qk78f1Xc?W0hno*AWE%8#)t=gB#hy~^ z&dB@{PQg|4eaKTzkc`b6!MGw^TrDnIvZE*&*2d7KvT2}VB(WbjK>LA(=)k$=%w3b# zku>eF)fJgqn1*kJuq%U&(bOpdtDdm7x5qRaihSp}=g`JY(7Ed>%}Y37S=Jke5^SZW zUP(Inu?x<9zgL;bBFHJQz`oFIuU_uKt(zBy@Xq^UA8J~$+ZX)d0BN^?)SM0F&;VaV ztobXKO9IcGylVHxOhM0Is~0AKeRlHJ2lPuTs|4*`N`Kn${EV2i@KodpA8#Zedf|%v)pe>}P-? zJ;~h|CKu9JdFnPbX%U3vAjy9(r)d;mM1Gfoq$pu&@l!=$M~DddhcI+d%4QBEa9{Bc zFjS1?Za#r~mfycM2QIFQS(#OlYeEdyvAhxF-WLex=&0)1+rk6>qT`7aHh{buI8GaK*xS{ z1N9d*kEeHIsr*e730s{FF&H1;f6r+5A+4aD2Cy>b~H8tL2N?wt%y)3Wc^)xZ3 zloT07c8UVcI~=lga0KjBUzMB9Wi5K_ot8Q}_AOi3)yeYUU{1l9_5Lc3+ZA=x4br5gBlGqYvh7N!T2=w*ZrTl_d;AZ z7*L}M@Jgs6I`6(4g2^u9bT6AIG92#@{gkd)U}*elA0ZWHAI zO2AJ1WaS#Zpwpw>=7RhN%awka17+7am*El?dWolk!i1?y@<;gQW;n`9r=gz_@}7H2 zVhOszTK&y?eqTQ#8aR0jJxx<7UNEf&WE0%Pd=XczgjPG-t!X=BDYEX=sD&G7w}-ps z=toO#$%V$?&6#~Iu+%9(gJ~Kx7 z<^>n%LWH!z(Bbm_vKsnv4{&Ek!1&R$$ji0iq#h&ZB7t@_JrTy-wQZ( zA7pe^7QV)HPovjbj;OJa7U*+{__0bXEK;nV6+{~a<=%-e*wWqUiH%#QN!Q`xk_0R8 zk>%BQXod2oDr;TQqXV_uPQ+|`<4+tOrOq3?&W1i=I{W|_c^>uBZ;Sn|SpyVDAk=XcCF3#~YK>f=Tluq=twxL4_LZ%|Y{ z{Xyi@RC0B!8U>K>DJ6}i^8rel=-&}EGUuS%(?&Y;pqnsj6L+>Pf4ffkeZ{R{hk4qa z2SWN1v~oED{=W8CMps`LRYs0cI-oe8Rf$p!#u{4bh9Y&P<2|Qj4hky4pEgb>F-U~> z4!1-XzyL;Usq$h)6)?zAe8CVX`@8;>AMaxzv|h+85V7nO34tJ*5kf{N4kxrnG#=h9 zQ$$x^(8#s$#tv7PDs%CeS@*NmiZEdpy+CK~hOXYGgUrwOcW_2hq| z9J_g!)xpTdiO5LZ^7r-kvTR{S<9$qfQW6G&&^8MuFOu)^4-R&OIA!+6zArN^U`@_D z%fD3cjyH;YZ4P|6rr8U!UcXQjPZ!Yp7`lrY$lT>aH3E53frPNPULw&iO&bDLic{%0-VORJMzpFi)LS7 zGRSy(FMqk5#6XKgtV4WpF3H)!Yi6*}q0i{EQhrU^&R$Zm=6&fOaH?%CevEoj#&d-s z0v~aq4kallH#P!=QUKlUDVjj3BsCgS`U3lC zH|*ZeZAiv5^Rs1O(FAf&-{LlWK?|NTNMkq=7MkX5JaM-?n^tmxl=Kp)Alte^e@-AV z@0&q^-OC7@>3eo!j3MrH-$dYmMxk`l(jm=Cr6%(8Uo^%x$eIHohjG!<9jO5QRbd^< zb0)ZGY#EZd{#!Y`jKE&dItI}m>;3O{2( zhY4f2iJ>h^y#=L(@T@D*TK80!?(`qPUcc69rya1MW9xVq)7cBXX0Gw-;j(P;1QHGw zewx0^Psa-2x{Z7CLu(?1%tyI$=uWerTB9{3!s+r9uCGjq21m*>5d;9yQkd-G+B9X` zI|5kZ^Sp?}J>3|&n0ZXHcjb~HI>Ofr9zWybwXs&RjTB)fvZgceI$m#Z_b5f6lz8be z%zkUhy*#1HPVW}*4>0yfQdo*}%sJKJn161=&;m$;c?FQrlSf<_*9jMRKXnU0$4uG9 zbp_Z->m2yFJHal`Y2Is&ky$jH10BY}#LB9| z3glxhqmVVK1sP~ySHD~;iW&0amYmv>g42y2PYkM_W4@;kcXsS@4J)WAi(Z|VNeYki zHn&Ybv=Y5Pov*Yf9^r^ztL*H}=bsNcNiw_5uP3pD-B;a+7?n0B0&h|+w|-auqi)VE%CW3dt+#Ie{bdK`NB+U;m9<==8$`r z*rM=d=f?~WVV^yEG2>sfGj8q8;bOU?(I4@(3tSCf_W4XwXJRz)R=WR+gH=g4B^gq@BpB;(2c`@H7T6Om-o36exN5+ts z7G60q<^3EZJ!AAp)Q0)G5d#&y{s_JD`>1YFwh@iOEqq!qB0f?TaujajG3h=82c%&w zb&C!0^{;QfbMoLzJ`YK^qWvPii+qS~LP}f4CbIjxB>N^mUfW~8JYic;FN%Z1_7<-$jLYpM^@Ed~WeNA9wTPuoIUP5Xc$B>` zc@p`+i2RBJv!cWYFEam|4*}6Ip@z&CX9* zHcM7Q(mB5b<;vA$KaU{}(k59k1f#(d-}_t+TYCffvuYA*J)Y!p%}Ib+D{Ph3DbRU2xG$R z(3lS!m&>||F&uvRp#qnhz*b~@R5=IIbQ5hejk|_%niXt{Sx7BQ&$o!1(#3KdvYFiDw73e0}tX} zq(I~maPIBp2l0^!??ixf&)K5{8Ftl=@wa@Cp_EO6&(3J)O})I(1{14%pY*D;xcj(w z?T1XT)zCbkazbLMIc-5IHIed#LzDe5#RDj^AK#8soc8hn$7|1&S{3-GLiL^OzBK?^Pc_DzD@PF;3*1L!VELnP;NXmfzGr zfOnzuZKOl&YPFUKuwLB&W9;KSzM%Q4cXO3V@hVYN-34ESW^D6xyRu{pE8BZ6xegCZ zx<@bmx+V~xf#(np0)0XvV=jE?)c#vLK>^3!qrD%bWG~%)cTTYXw(q*`l+6lLjg_`e z(BSSa`HZsx31a*Q$aH@HUYFF4ajFClJ}Gw8`9+oE4gG;KhVt1$FC_7g zImY1yXRxJWqM5FhPjugq*fg!4NZULHHZzpHKC@`zWENh9ZO$k$ zKbnJUzR*V_sSrZ?x+{TF2&dYmE)-9WJhbdrP0MFgjB9_?LGEEnArDMRSMLywlVIYN z>#~IOuQ)jT12Ewm7}fY77^G(36MCo`32_dv=KsdJEdK|vE}$1Sbtn1<;5P=D-{-lT zb6NJNVr;3wNCR_|!2~8`-j5>IzC}LbnLma?HbR;sb)xQwXb9E370HwYjv$9IQek^> zr=*!yd81fNmgNTK))%I&JFMybW!P}22dE{%xsk*oTZVW?c9ra|qu`FM+RlAnYCdP9 z;ktdX0>f6e&m+YkA&iws+;3oUIsFIsx;+B9TMkKf^7C&dBv#|hBBXYQ`CJ#(M|&kK zaPM_RNTLfyk>on|Jv={oa6Cc5E9=6gI2|zI@hbPr(1*MvG!;egp-ROAQ!tND7vv!` zB1GlG_>Og`k~$uKZB-;-`Jr2$F`h#lZo|+A!~KqPi?D$A&Z|n>WD?`ifyO-|l6P<)Ov^*BRJEG-_?8WOyKSI(Z~M%UVTR9TW;P} zV=iK+#F+rlZAVcW|93UMd}0KohvKMxo~yz$w))?ahjPlSK(A!kDd)irjre9LTI{tgVJ&L8&DeeBQem`~S6Rg}RSi{pAPVMmU4kGuc1 zTO=|$gz3H8y4Tfso9k}`(t^xAY6^YBA$<1K~$;n&jq3^Su+p(H2qZ6uQdlmcK$6 zhdp=W7e)#yxKKsL}DBq`@TI{^(&<9t%WmoJu%M?4-%8h_pk+^ajul1S48GAl&;i z;wy9>l(O&O-y3s$eCFJvFnIA1ENi)Rds^+A&Wc4QHu&b+XWIi^ z$ob+%AJyyQM}lT80MGiij`H?Wua_z{$NfNCBlMa4wFrS} z)qFO?qOFoV@qeUEzBM2itV!8|cMqP6O{O;Z7^L4P)o0br2m=B&r4hny;hKcuh#1yx z5PQt~K{DRM0v0`=8@f>@(n`O)L^M@>BaWh0RHHuvMu_{^a9LH{v7Lh{O{7C~_E;}U z6(9dlJ3RiWu6&t%mm!hXGEz4_8r=k*cD&(1y?^FC=AH+`)8$d7oc`r3>i@wwy+j4T zTIvWXSa@hIqGWN|hwB*nMrTnn{^?uRn}HN z4A0E)iYY1ru=wM6bMfv9U*6y$y-x`M2ge+(?ZzXRj&-b6P8QD2lbOtU5oaP zM(UwyOb8~1i&Vh_D!3eM=V}w8B^kF7Vbe9QQTY;#-S!f!^ID1u8yCm^d09H~`xM{s zkC?0@x#RGy480~IT8Gy=;iTS9`76i!LDgC2N1pJ%h+eoILQ$8cqrX`)TtwIOzBeSO znQg@Bqd4X|p$Qmy`T%6cxrff(22a?MYTjBAxP%DFSWhps@MYN1Cc?*(xv?|c zGZxzArnPUQ(Jy2$^iR^LYRYsnpX@a9E%@jB`;=iQzlGx}$c(bw()RDD1;2=KwF7BMM3<=>NF02Sq~!0PcRZFL^ehhFIJdgJ0_A zD_={)6PNU`xRxIozq~^Zab&;Ln4DM#qh3o(sED6D%^mpu!A-`uC8SnGALGB+D6P3H zWX@PgW*Y>BpPR+K%jhnCtM-0I;<{AzDyoiCopBIfM*tTPm<2V4|NaBSrU|fw>JlQ< z>Zg(m#y!RaQM9@HiDO|6>6XjizNs!S5&df#yP9a({*BWRA9Y_Q&(lQtS3_e>RD*u9C@*W@&b?0T`AvQ_??jcI$kqz+GyX)fonN{4C>9VT`x1L@G^>!{>jSS!dXeLO{wR)* zRDozytniEY*U?PcXB2jK1cSU&ETS|?+`7;jF5adljao$_wC8OU91I=lN?QHSC;8mj zYNe$Ul_(nR8x8N+h8+a|Jzxg47Ps5+(+fmu9KcO3rLygjZaI?FSFTc!AV9digtt)G zn>=EpTQYLuT*hKg;yX^9tXJJ61y+p>N`8UyL=)>S7|Qn0hY6y{8HSvMY`hDlUTyiNK&Fkqkw~Y@tGfpMwqD=kyDi9I3p+E9cp1Y-scis z3B+A-zojTtCpwSPTx-mqkz~65(1pZ|gho!jdwkG}k`J^jkXK0y1R@Yvdmm-H+nft+ zrTzm<#M$BtNVrH62q1+>`)}~eEY#!vCVBI}By3p^4#@C1s`r8hq*fChrmujv zf$@f~v;s-@slS}w6l;wLxEt9`pP=(x!Rp*Ad~LUcva_hmhO6k>=_XG2CqQ#b4>h9e z93Bg_G^xGKdIu6GayE!^or$|nfAKQfZ3;Xi!&HkW2(66v)b4b;(U16GZ~A-P)5bep ztw_xL3av6B-aW+Hx;2O%f9=s*Yvng@pmDyT@s3We+c5$f=LFZ6CnhhjxG51EsiC;} z_4(muCnsILwOKcwFb_|QK8a=PRTDk>xz!DVR7rH8D@>SxaW@2F2T9b@L#{Q|sj>Mn z0V7p=C`3vr(hVk17D+VQH*|%*C#2$sP~&~a57tFU@mJU+Jio$S)7$ZZN446Gru$V% z%ln&OH-wEC)FiBPu3UeCz7MGFp)u{BGp!n0zo;ik#3eo=)VhR&pDiEJyI|bkOL7$X zILpl7fL&?%+E_jRC_1wv7rqqui0{$2aLykxw^KU!Q*s#QhH@I79agHba#0*sefCG< zD|OG)KftcS>u>W2r)tQK#MaKy3HdLFl}F;O2%U4L-*@IYD~}P_UH<^w{*s>$-rS{c zJ`jvImk2!IE#(7%)8vJGl|{9OfEtcLkjY)N=p1Ly6y+91-90zg%<5AyMX-lSp(U?# z3&n_;1Nbau=9j)1n(mc|{~#&41}H=6#-B42zj+LiEH{wa*~P=ND|5?n1Ksf1!gWHu zK1WA!8F--TWr?o?C7CJN>eW%d1pb=!-?-$yrQ;YLaIxddHiWP5S8x`1zp$J?@EPdm z7N_$u3=k=Sg;73N)FdV#S(OrG08xh(G&{magf91kCzp(Ez1GTau3D`}k%!gzr=c_L zBg6rV&h5!KFg`Rztl{M_fd?dHXZTd;S9?-xS-EFoA7pLn*S#zqg?MYW8`wGZ!>UZP zIVFn(pb$q&^3a!LUHBiM(%~s}m^foED`oLdyIF}WTtHYzmsFa4ju1m*^b&h9lk&BP zI^9BlAoD1xyrG$=-ueSfgIv?LmWlX+pC3KNc4sp_0uf4D3eYcAl{lAy z-kTr&&05_Las8-ycU)L9eja_y*|s`_yDUK{Ej7zd?PQ{>`Z`T6!D2SvF2r-)zM)H# z-}c4K3LAOCZ=}!H4q>!@bj1EG=)7}KS}e)=o%M~I9Mw;uRh#fj%X49h`oRiXT~WRo zUxjR$Dywy}?txdt2nKGKEC2n{eGJn)_lBl zBE4?Br8wb@fWrso#d*^LswzZz3WNtnc$%6N(n{~@|lI~?2;)YtZsLqK0YAjyoy zdu(*D-l<=0_~Qrn2g}o=m2Xs1q|FBU6Sq3I$bM0eJLlA!)QfAY~waopDGM)w9c22}xYClMbea5&(@N_fXuMS89bHzvp$r z=>lF+cpgsrZ1(@$`&D(FN!tDF-^^(JVan&w*qll}A3{4*ni9l8Tp!L6A8HfUO$3SC z@g5)GLJOE4Y?f>_vyAY-ldrcarjV8VG6Gq!V3TU;3O4Mt%Q)T%>$|?&bl~_ja=qNI z^_)dY3+MV9YDE<~zN{K3^k@`<@;d(?X2DKN_prEhwp$(FaRe9Kr<_;Sp~J&qBfCy- zwm;nuarwipDG!{RFXs=?3t6j)?90{=yX)I)fwr*0u|iA_cVzjXt z*W5Dh5%kZ7A21+N{e^(#T@u{s6vj4_2+f`kJp$w3yTH-!i3Mlz18BHPCN)+4d=GDa zkqB{_@``(qI=K^{`){HU*?M%N!=)ZHvnp|zMtc_VN}S_6j`+k)GeW1EXge8-HvK8? z$sLP*1%K@oLP4Jdu@BI1by3pJ)Nq^2TPBu0zH7+2XG zdq<6Qyw4IoCF_+kJBaeBMD!LrwLMoXTcp^Z384J@0YRV4kTQcYbI!gdfzN%2m0SZUkiV#t{p_U|8JUP~l1Dr4Q8_ zOd_OLu`d&GUTFXe+g9Ua;nfWqz7=RkXZxaO5e49^>#4S5crlcISMg4xe8*5rp)0ZW ze}IPd2_peiBSSjPe*Zfzb$Sygs>Y70rNp}Olwu>atPO^XFDrssiLzu-jH9gySaj2N2v)k!_w&l872 z2cILD#)7Hu#UCC>Fosi}E~BZlj-Op_cKbRmakNFJo}9Z`jm)DK>_TUMQ5HrFz2gIHXokYeR9PGdxqih7hKc7zyIS%{U z-3^=~rFO>pia*S3B9!8A@iE}LQy9_ze#^EgG&vgn=J)cf(loy&NytNt1SUGoW7J%<(YYH+=l-(vip34HcCS~jVtjd4fJ z)sHzHJoG;Ytl83tN2*^F_e$HUuLS{4NHJsX@--xfMXtp@zV|GCC8Bw3ZwK1_1Gtxh zjCpNYxkfWz3{gE(Ag}d;C|qY@rK&>M`{9G0_jkK84QT@$YI)YTVMo879cRO-zXhr- z4>aa}*|rX6Cy!kb)^`Grx}@la9| zn-*-&`wvjHFH~c7JXC#+WrFwI5RP+()J*?3h+Kcu)v%!DkT~9&hF^h`CLiJlkK4Nu z8o~MxVDMr^v6(r1$M6tA@<}DAg|<)iVDj25#vy;SSm#@y3gt)dgXRd=K$Z85n=u#Y z%Y!-9+0+b-CR|20T!!YFdmtiP$JkU6E5UCEG>hM`*FLAk-fT8cH_A}veajq{360vJ z;TV2zX(#@?iDha6y~LT|+FPXHgh8to$VM&4<@TmsA86yX*WTGUDz`ikT&qr+aY0{V zm|=d%ouVGl^aO~PD+1S7l08hw-{u7Oy>G6)ac2ygCSjb2&0Y_{GZK$1mOLLDl;-hNn zIFZb;N=Y0kjhR|EJP{(Svz%`{S*w%8D%KlosUOYLcFjm1&}{z(q(FB4HxOD9QRtW~ zID$9%?+GFhy*@pAjr@kZ_q}#bm`GqowLg=n5Ti|PPA8X)jT}FJ1p#gD3yyN&jcJ86 zxUr-T-X-0bkMp-a5p6d62f3c|-2mJt;l|-EdmSGrOqg9iwyYj9qgrJ~&n#GXQn`4< zGB@*BMO!HdDM;`y1bfck2g{HWafWLYMF~IQ+>-2?zVypJc+0q+QSg$jy)Wq^BO_8c z-vO42xA9rw0tTBW$5;38n?Rw*dre0fqXTB%NNY$R7sEDh+_sI0D)ff4UpEECY$HAF z9+(86;SkNO7DbL06u5Dy0Le15d zd$ePb-vqAbw8Bc=Lf0QA2B`#JBrM&9mD5dm?s0LpMHoq=Ho0?*q84IadBi#2IDDQ$ za63mYy)UR#5?7Mb?cH9pYr@^3{AUPN#SO5JbKf>00%!2X@57K6s8KiB2kepd*93cM zT&K2T{sBe<$Hcrc#Cm$zc7Y-VEME_UOi>cV3~PQ2QpBhE%O#wm*eBKB61{TmO)lLM zD-}NX?L^&X_q_5v?H-Ctm`#k8@?qaDzO68&9nY=pCpt`Ky|fB5N)$fbh;&}BZTi0j zTS-J+hBpw^y>2q!KR-Mn$7-D6l-7fe@A;08GR;PS$KQn8nmV!9E5l+c9lFJDv22z* zQ5OZ*oVqtl-37lrXNQRx6BON8on^Y)K@>l;tB*f=KQr*(9KE4x{sFqbH~j;!Z5ov7 z`f-uk(k%^MXqftNc>sPN^&6mX-rl`_w|X zSG58|YEVDK-Y~Pf92A^&7bc%Dc<&g6j2{%L%&J=tYatGb{yL>Ll28+5XQW>4(2zfp zJHff7xAZiLI<1lLjdGF#?0NW zlSlbSGkX~gYC?GE1zssa`UzNE>4PXmR?*d{hZ|Lq?TmXQ6%TfHLE)q|*Z6-bruD_Z zrVnu}-sBlt*gWi3u4`P-sVmwtr98P0#oTnCs6HUrZ=wc0d>{*Sj~qDCg3lON?QAvM z0>nqwy<`R4k%eX{A9a3XBP!R_)h@VG3$DaZC9GaDK(AOi~Sg+$v}bun#oJ(y}*)t9Kj>a(WF4 z3z6VOWZJ~Xy=EkMUls^E-+o51%#Wd{G7Kq9a!F&g(NPyAQ1Ye=oQwtzN9#~W=bZ%K z5*R{=I$v9!1PO+2IwMGveapcJCa{sI2ljTZSXJq=#$XEgkdvcNC4QN-evu|Z(};G( zJ5QZVQtxK zsBP{oW0m+JTz}V&x7gv_hOU(}<88me?TmI?iZhC#XOx*p^Den>^8R@0`@0_#+L$!g zvI{tEv&`9MF&~J+QvN12v1@BHr26H6&1nq+V90Q3O}Idr{x5Vr-FJP?w8^-=F&!ZG zqrm=EK2ezg7X7(J$$iZaQvm&jGH7k2y5%K~S-aO$?1`m<m_rXTTa(Ly(-B9>_}i-pK)T(3aZOZdD!RJrD;w3G(zg?N>9hL=4}tq7p|R*%IC>O^1nx~ z86P~q&NO@)EUOYORmofJN5F;`kiR?x((-S+f}cK=roEn{MVGRx;fG0#Z*#Ay#Tl} zz%cnYdHwpecr@l(q;e0|Eo07%`1xQ*dmIO6rLKd@^6GmV&RL>3Rc}Z78OfLoQ##DZ)R>OR|(k#Gxxh8>4a?HkAxGkW=AS1=VTxMrV{ihQH@R zP|g*VTO!9=$IeTL&6{XC83WZMkThW(xww_4n!U1*qW_v>ROoT8roO5}NgimUGWbN3 zNoLox$&#nFFA>*@Rav);nZQ040fjzS*pBSQ{7Fa(rSWU5{JLy^4E(V2oUiF06=iqW z%-a`;k+10m_$FMHKgiDJI1C3P&h!Kz583PRj=?iG!A%XlLt~CN{$l-2W=8=g`=F^n z+Qv@w^UESOSeHUw&Aq5!eoyp7wbRTJ4Hxm_(yyamTzPFya$skB_ zV9nn9UbEUvL0!}`XpNh^P!7(Wq-TEZFzGTNAr{eXEID!P0HIya@MHQOo{rokL!^l* z&V!U{@~W{2)*8$9yA$*xoP`23v;|+2EsEhZGt0M<4WPP@Cv}Fx05e%Loi{^>FE{?l(w4<}m~7r6jZMUbnNWygIz4N6)fLmA;;;7NxghtHvG z3|=hZlBw8Aj%J-5p`M%mUZl&GAx`pP0ZP>8k<6*)Wwq6p>W(}l9p^frD4`!}RxsBo zF9R}9ji0bfK|E-R%0ODAeAe|FIg5nJS@;U{=yaL;xdI%~i|Y zEMuL-1th0*qdoHg-lG0pKB87hUva$&@{x0+Vr(}npH!Y5;oRHW%XC;wDw3N#z07PA zbt|SgjnU+y(VCI7ju^wO>~U(@K5M%X!gPm}Vte4VPPai^F@Ul%6y)9O=6toVkoro7@n8<$6Iyys(fz?KSU_INKLrt$z4gc=)AhPtyBL4fk1x0U?3{Y)ZiucDrz?zuO4Qg zv57-zMkxTn_bF-51g34zaoQbrUBR7ku z_>`d|s)l063afo$UU+NC)Fi8$MechSo~CynBNVh3&?2-ki@1FYfYcVbCQ8#2lsgtG zMsnRuP@AW)iQq8s(#8YLsSKH*lc7M7Sn>R`j1%nN%0 zP#p5gEQ$)gCbKHCAocAef>Rx*_ca^m{{UcH&F%jHW;knTJf||k(hWxFwNzWToXR?= zuox{lCRwcFSh{lxS{KZ~7m8Ax>6IN?^9Knxs1kb1%n;hI>MF($xRC*33yXv%D-f*; zSBOohI+Ousb7vB=ts@!uD^P1CchPUS5fBh_KT!Mo5W@D1bu=aHxB)|>M>&xDq&^2x zv!g=uP@YnkjSe6-jW^*3MK3G_wJPp01yxSi-0I_XX5W|;yJmvUY3tk*%KC_1 z^HtTJxQ5^=0qAVO{E1p9_>bL3Yx{rYEKog6LOdIP=?HHQT7$jAY|8?SF=8OWrLBK4YFw`iGs!wEg;qQ~O941s0-yt!Fj%*^lv>v^`3PXp z03EjsQTst7RTUUPZVQ1ZS%@L0SZ@dw=yl~VpoHyPM0q8=!O$<8pHjeeg;l)bUT|?* zlJbiku3l=gCHNsc1?Q+YW#*;#DEZEyM0rTM5{%&k=22a0#^SohuDO?QZNg!=v3Gy3 zFa&72DhF81wgWQoAYCaRjd;60t;2kiEf6We5t&@wi=C zv$&9s>q=q$I0j%aFI5(+S1Epb1rRl()aP9&%3jY8sP#oIY z+b&=P$w!+8*a9HCti=I#H||w6xh4HnTcLp$ifEN=p6_!y!JB}fJPCLhxMk2y@u|Jh zb+nastS%SR0<5UGU_K^DFS2G7!r_<(6)=N<%vPD3ba;qtGqBH?rL5&d3L!>{+^~Y; zse#z0IhGiTToV5PnOY;38KxzR6Sy5h<=}_XZpN2Upak#wgX)GnrBz+syhx>5 zYvry{m%s(Wm5R$zEdbJ9;3)tjKd&+AkR5ORSQ=QEVTusGAOgE%z(=T7_k`VM z#vKqGQuTGHHLFi=9Nb_yN&|>Kh=@hag95>V9J#~94chk?CElyJGP1(`%=2Q0QsuO| zxG+-gm;p;{j{{w?ai(}(%7bj(uBCv52GXTk5-yW7{{VoLt>276;rl~CTAXfUuS1!T zKPaZ;8p(3-uLBrnDRe_20T3$Zsb2@^;Fmxs7FRQ&5Aw%7~V7jkEfn{WtuA2SfD(S6J?5 z%`9ZxDa1fts$EVBT|o!KYj6MumFhOipK#sD)aAjlrNvVscMU+Lj2|SH3oIYpTNR!+yqfA_Wv=TNE>NLd)BsaNqKmjWgVrH)YUfgz ztG=-SS4TNPEP!ncMFtH%B^KluWiwY97YJZ|rMz!hbVsgZWm|WeSBOAR+BA5VG|^W6 zpv11KurE0If;wi0@8^ z%nEOoAqK0^(QEz9s95eOIowxw$(9vVbna@9uJz4ZdIZ=A#iZv3%$ zSExpb_-as!cfH(df*}o>{^9Pxs!7{$$7_EGpM*kXy#b1tErL}=b)8H|Qe(si9>)fu zBJ6S8LIAeTAhHp78F7h`Otj)6Q40K~S63K|c?|~TRSHmI<{2*YEF6Zl8ntR333)h#Y3)Vc5!F-;z+r6s8S4r{SFGK)q8_6SnH)BjmG2LD=FG@U>9~AGp9Ji;P4~9l*%6b#$u0 zM~3_E2lW(^8*Ke*7-eW*#b#p50jCu(wAWm~iDw=n5o%1+U%FU2P%M{Jt1hLtvHqaH?)sT+{X{g$+Z1N`AOKi8 zft*v+Lu&Ke0=gbjy*!Yq0JSX1`-TmK0&X(260^e#mVb8)GAkFlPY`e`E4|J7 zMLoO`MjXBpevl8bK+3xH7y@J4{lKIQgKtbc+69?;iKEsuZ;!Y;&j>6-Wl}XWw4)l& zHHR;VwxDSjFM?jnZWG3}5^Z(04aOo14Z}n-Az)I;$w=ZR0(Daj`;J2?gr(0|yvizszTj3{ zeZk&YL0Vrh2?ZYKo8|ys&qNRlPK?81=o~sHxQz)9lcE*?tH7V-K{DY=KvR0R&<07UH6D;!&1kV|5?d`t;g`Gyr4tnMaDL3g-TfLjXPEMhf)-UzM6GXkQc z64Pon@d^qHF#xzzoJNL|p_+zXAjsTRg)N>7grvULG9yP(6(KK)hSl9yP^gX7<}`Sv zAs=MgK9RV%H*(~C9d2wpO@~tG7STz1x{Yx-SOb*U+RFs-MFi0HRK>G`qJyy}yz5M6 zUwaT$2NeOlUJA`a2_8o<&?31djq?LhMPahuBdbcL$AC=C19jJ~q3X0@OH}4LULYxe zu_7AooBpK`UHH-idr#8lGPMpog{mJO=DnwOX+!k0v zrY25(5OlZdQ+_~87_9SIB|n$aTH@mD7;&0VxV|wKUI)T3KmxIIOZ`k`1JeGZOb<)` z&;Gyuz=L9g$YGl7G=(b$_~tbXE52e#LgBK|_o&5kZGsFWIAD_3FKI2p3v~uvk$H<7gy2vph&asLqWOTKMSCKk zC2fk1Qm~cIB{Hj&y|X=IDFDZM%u$cD-UQE?S`G6N-MQin-GNYq*{J3kwB=qB3n4(i zSizGF!hotZ+$b)s*fYffYPHc;*eU8NGLDv6U%2)gq}5D7+ma5HgP#yCAj;9i7=?;9 z;XY!G?qWZ2L0N4B-9XUmDbVZ0U%N$FXNrmeRtPJIDy>3AuoWOwmJs-bch=yN)YTWq z#AY3#xBZG3*UZ3KU0Vnh4GdJKf&I4v84H2Om|InHY#+Hu@PCZJioehP@YZu|Kin<4 z?Jw>mMioDZ%u0PYH3$R;1~uYVsBE$R;iI<7yu!-{pb=g7Hf^pYHnq5I9EMmni^Ahx zTns?l!RSD22}UJEQkU~6(giB{l$aOdG@+v7rd6!CwkdH1AxmqV#9D}5LbGG1R9sX7 zp5-OKz&FT- zYc(<#?p>_Z%sdz>0|F~k$etm`2f)uI;g7|&auXxNI8e+md6q3`(HKPKp?piAt*Hn; zB|+o3CAD}T#NAL$iC9dKR^BQdgiMh;h3UjlW@=G%#%Z`)8v%QT14He=(D4Gu8()7? zl#X3n=3dqq@~iZfHfO0%O~yb4y1a~g_AHyo#oj|S@=Q6SGl{Pu!zon*GP_RRhH;!wIn|W0q^CAr`yTC9SRB^)(gYf)Ey) z?}!1YD&8OkEl{Vp;Q$3U5dby1iZ%g=jke4%Rd`tK1h)@bfUru{vX%v}5LJ{w0D4aD zIf7Ham~yQgMuLWNyg^xT-S+~4)+L76b2xG05}fKCgkQtTQrjuXjo@tG*s>-*8{7CWq7yHeM}~$)vDqm>kJoiwH}dZnF{w7;0z&6 z?qeC0lqdp$xtpj18hlDn4U#onlC|x%HC;=s6j1V1v7u{R8hpVQG@>;-I20ccVDhn9 zCqHj7TX{<|19&emjJKjJfxxI{XEqYB6_{Z;w+%!v*6|aoUS>SZ1-C*K)N1tP8hF%u zXo0DoAe(?`f#1xa3V3B^4r0v-wrPUKU zp#@3iw=8ruQLiQH0~uhpUcj_psbbmX7)KW3KIvWc2qME5%t9^l5C#}HxTBRF5C>Ff zWk@997=;!oX_&sUjBMoY98#Kv0F}gZ-M`??xvrt%n92`F6BEIZq2>VDUBG2*rnDz< zYl!NDh@$LtX%d40Mgq($reG;%8Ii6B=wS zfQe{r+cWtjM!{u_O(D(JSBixJjj==L8Wr=EaT#1(E-dDDvO)3&GZA=M0rzQ8s9AMg zMt*F|3sbgHwlrl|>OBtlNDG@?C4gpQfqWdp7rv|ejuD36YnIDmVic{TRd|mCQDIQJ zafrrh>~Gux>c%r1hT+jDMj*UY1%(c%WS8KLurkG|gJ40UKis^i4iy*~4SS4IDTbQ3 z^Gd=Ej&Ksw`C^@;ylMr8PudhiUUw)E?-tC!0pi++>9U~KX@UoIf|f+@Kq|*SzYvzz z4ZA(S33)Wb`G#0Nr3X(AqIK|5HdgW6RH|EESctZzH4e#E!&Ly(sxCDV1*VsF`HfX@ zSfdiVG+yfB+Gkg>uey~r>?>Jg^D_Y%UQQw?IhQa*aafMUtthEl8{VtbJ*Tog0C^3- zQXVP+11(&AG%t%Ijeig}aCnUsS4B|*m)|5JS$Yw!fGZ5FcX0O@td`cc2oMUJ=P{k2 zf`RfwrJ9H53x43`Oz!xCHb1%9qY%qkTty+O4kin3!xag<4F+L%>&1aclJ*1fyti5*8UQCR)%1cPL;NresQ$%SxA; z+9NJ3Ey{^oW@akW+{7t+_=hNDLT(k9aSdnY!F9ASN=gY&F&SlY9Ye6yaV{nfAGuC` zU(9{DrA6=`H!ua7jd(EJSY50jY_cC{6Ipiyh>IYw)2>afU9mHQD`$V%T&L~ zDp(qK@hS9Sb1E(BeI#I8%2kUFUvl_NNK0jeTj_!|r(WQ-MU@7V<{NUZh=j+fxdOLg z(~jdjIcox>FAvuc&KEp^ii?8mWX|Z&213OhBBh z{wu>p6a#4K1VaL{QK$~40C2@X$=d`>#|+DJUL`&b;IB4%m(X!=G72>XI2Jy07qtF} z2Q+#xwh$F4QV`z%tWVYB5ultMnEo z6{Kh;?pHTvm>!rrpiyl27$dv3($;0n%~zy2YnoVIMUE)LIUlCrB@5%-K0*{WR{%9| zz}z)Rt_T(#K~M)0^DLg1_TD07i3;iS=hR-YfL^u97aF$Pz-nB;K!fx>nT zr8)=6E5W`mP`iks$n1p771NadN&7WqYJtfN6s%LUw6%Z(q`9TLw-A}@*;6}n#TG8n zpyQY+Ef+6vR}cYR7c3@*uhT!+7>|l84mz!e>LGV+%WKhb8AZizX%H)}WoLYIh?_vv zw+9KGZRRoHZlg>B(-N)Si>~9h%Xe|!a&^?y5p^>BQBRtc6%Dtjz}idY%&FRz{{V=E zOY;zqHyiQ#Og^Nfo|p^Idoqs2YZ4w55%P`U>KW+jfW^@rcK$8 zib`?}zFZtz{+P2kBz$EEdl}~YFf?%4@^q8r_I!eSyNs_Px8s+^##|8n%M-dxUj5Aw_dAVCK zSWs7@1ylW)oj`x7K&qDF9iw~?xWEB&qdiWb9c@5O&}(xV-8XP!Wf<*LF1drUHDf<8 zOTG=?kdz@9fdM<-$0#Du=**WB2T$TA=VRQ;NCTnqFZ#URo4o?GY^KX)@+a zk;X$omnc&0=aM~-qQ2r_)f;CE0%EtP4^Zv$1@aQ8X*pzN7W0h#jFzxOkxeIqEaW6RBZBECF|ZW$O~F zXr^z(*%^>kz4=jhU)|F8Zy5WSsJT&EK1jRh1Xi!vxUK_$HYM1fFWg4TL_5iH=}oBG z9o0fBOD*P#A$aYyb{$y+UX7$NQ=5rJ&Jz8Ih`I>d_bjYD%^yc}r`MlF7w z*ZhUVu`z0+Pk=3#$qfth zI195Vd!T$i6k{mcy%+jyhEOfZ#+bki>< z@fl*wbh0O^zud8b+^0(IBLH4fiZ1RX87|sf2efJ{AOnh|F}JikFPPP64nfW(g?6G= z)!CXjhVa-#@m%6mlnt?NWJGCmT_zPFXj923iiFDQ2$yk7%&hM)8Sq|Z>MUaO38H`o zHOxw|xHMi*=2cOFu2G(?Qy30QM)A~V&P{JSja{vql-q|_8y!H20@wtz6~txKTp+ss zS+vO2N&%2;H#jiOF_h6Ok~BM1c=8m^T{ra(HB4DEAS_@a3O~4xpgMg@Gm93~9nkip zWY-0@5f}+{9L6O5Fkk$eAzq@rQ1{2oq&(jQ!1qPRcrJz{3XQOTaKP^-Yyhqz>DmWT z9+iso+@rN6SBQ`RwMd{VOhcxPs@q2XqD5OE2fAck!cGS302ufa5keUzNk=JAjcbZ( zXzl|R8s4Kqm!Z1}T-Pbk@ObCqUrN+r_R7@N?pUVWdbwhwRH)%~RD3~e_^LG8`)*$y zoU^ALOHezR-9Rfqt$3-HRDq|vl!l;9!osrZ6&cg< z3tVeWg0}9Xp-jX_>wZFYf=;tpex*F8poBI;(5T5xcYxLBj3lz`Bz zO~prd00f@B09 z#ytovr>RQN+SXQJ5dtypQBu*7C78|v!0ICs9EO)t>>A@F5~?dRwqhI0pm~T5T;cwu zp$qY}|9h-Ds64Gwp&yyYO@eTJ3T?N)XHsyws>w0g|}w(MgVAR^9WL#lbV)&{?iQyW0e%iK9a0=2yNrVj+BO9mq+nPZ0O9UxNY8gK5yDf~pBQ9D(m1kQlDOGz-@-W!Xvs ziO$Iee{)zY1wWub7mj%@M(B@#4btP(WkC3BuvEZ5vK4?+I?)I_Gsg+RRg$AL`%q>0O=6!J!wft9BrDZI!v zNf8(ov&5j}DLzq!lO#I1YN`bxrXi<>lyfNREXgp=n5x8an9SCp1DHvW-Qpp<%FWjh z^sE6_`?h^W7*Z7|k@8Ch6>L~q@IzSP(3~B(K47Yb9a!ZNk-#TFd5_Coyef2)kb?LbQp? z2S+oso38#WhL}fd#Y`Zex9C8wZ+1b$6)ir!z-r8)j>RARwH*3JN1&isP3AGn2BH{) zmb+TlsGAzSQW@<52- zf0?^2RuBmdc^m%#$#K{(6;i@may-NoDDTzWz1XBTXnjo1P|^=E-~oPD14J2KW#Aat ztWf)fz!m9=K3wxB)F&a3BHd_+`3YXh|VjK>QBj2|^|kk?ChFSRk#faO#z zt+{s%AdJos)@1;oyk=!-ow<$F@m#?satLszEGu-xp{e_SXo+l7vXS`eA;Gcje}8I;srxBmcPb9GD1Sh6?A z{D7s(p$W6cE7PuLu+s$-IkiERkn)en-h3lc+~Y7d1s%)7cTlAQsBtpQ2FYTEq8ld) z3x3!f05R=%T!bDps+X9H)-;imD`-&->ZV2@UW2Y-TWN;CjzJ8G8A`O=33S^C>LN6z zD)SBCEUobsb*Nl~3{Jk@CP`jaz*s~r_1apE>a$R?*gnw}3Prwr!#5eXvCIpUhqx$V zO4Ot*yFNLWTH8}+Fd|9H$GRXv(~gMj_)^4zjTo*YX5BcAm(rmHNUyAJRpO;^j6;%$ z3WH?J4J^r=p78jG=f)x|v$b#032FqS#h;pm`^pBhPYmNi*0ju%^y*w&WiFzTG;Da7 z0TUTvPgqUBlwBoU(Z<@JG1qON2a=-}Ph?Hj4^pIynsdZQ32!6_7(G-Z9o)iaTY#)R zCBZ>jF!d~6&o{X_roa0<(6Kdm=#K?;iKP<0hgVebS?_-Hp zR((PoD#~o{Ro^kdYskAVb;P0pwC0bR`j;UxJ(w*J%T~D#1TimJ#-{XXLiGmY=s1cBEHZHgW`4)1QEj&7Hdmun7Sw@80>p(lRLfAd>ZODz zo~@kyO*BAgvHE z#Q~Csb$FHk0HJANPZgBNZp&i09+n0CL9lEK)@9KwP6HHaRctD9`T>jfmuNQa#XRC# z08u%!VtiCi6;1I0(R~TLzlwJjLgcAFMRZ(te_Pj<6 zQ{HtfBHcRi63Vn8h=K&Gv5ZtQnrp;(vwo3KfmqFz>RTY>F5cpUzwI7V+Kg0X zH4Q{q5G)?qO0?V;ty9w&p{u%;kfgUM&vh7- zLho=@+i0l7GUa5nz-6V>Mp#f+9Wch<4UsGMT;!uxa96hwt<(qri1#V3s=*M4zG4`J z10=y+ANC;BI^KH?M-4YB)A*KJ#g5w4V$m8!xko@k4G6OKtjCfi7*MzF0^$T_Wuq;} zD5A?eMYDCs%)06}H!Mtn;tE&{4629`0ekfk7u#~JXl|-onkzBlSzXIe8Z1<*xL>xQ zDs^VfMHCD94Z`ao?(=>*N}!2ScurJ*rP>wfUj;RU})LQv+U+~L!>h*fo?R|8NJ14zVIw1J1aLe>0?!HWkRHBwf>1nDLHRPj^c5-W$L_4z#`dg zs)!)6nSd&kHoP&QrCf3tw4)mkS_FF3x6y3mo6?3milAj-zi0_yiaG?UN|;=P1z@#j zEG7VAM=M6630S8g!T$i*!3nkIuB-c%s9LB%U=%9W;mziiGJ1kR7dcS)j%A>BLh)yn(REg{c{{Xp_GIA*#5i)xwWrmJhs=?+CZiXOD3(kTKkRi%p(-CHW zC4s{;#ZwsUCg{hgD&%xlcky!Zb}EL6=!DT248{uQa@<`i79S7<iB(=Csx|QTwxi z72uXJ!c?h`S=?eITnv^!JbNGz6Gt^OH7!GR2^dqn3QkpbqmP)1nM(ARDAMMrjPT-~ zM&hl)zp@N(Sf~<*I#YrIq<>@pLF6J8rE`7CU7>n?L^V)u3H`7c}L4SaH3i@lveQ&2mqMC&X@q8qiiFA;`f3mIzgfX zida_+8^{c;ToA5RfuqD>(>d-OTitkoMv~@r5Co~t7XpYaOE>Nt;8Kfk!7A^1bLjOj zV0@j&#v6C&L={;q_5^hZ8N9NSX__IbiNKTG3W|I2FJVf&cPPbz(Y9s&jpEDvMFken z0SGod(n`O&63!V?s~V=T;FLgXYg>mz4Nj%DQ%RvvLvf6~c9yz+<9i3cj;NNo zE9}b1&CZ%xdEBO|0QN#YOBaWG0D)D0bIB<)!8b{-9HIcO>$_X}AYlY$x>%e{7Fvfz z_9AeQEs#Sl8=A@rc0^j4Rf&B#YPpoQYj+SE3L9pT^mPg%?ajb8&g$w0J0Tyqd zrxM8VawR8;NDI>KiHxhgF$+(SCbJbBx!VP8hH`fs8(O4=EKB38$Npk^YJ!xDWtY(ml_+a^BB1E2Dblq8vdub2ab2F_wYU`o zw{G-j5Sl8hT*4=BR{C zRs)N3iJF-WuZU`1M(M;BqfOKs0B2$ zYEt7W?T_Z>?Tub@a8UOe(FOUtl!}BHjuklKKUN5TfDuy39VAnlVmm~!S*{|6DTtkU zn=;{do<<;{XaB-Qf^D|}Q);8{m+)JluS^o+qWDpyjCID|6b z2Jm0RL#xiqJ*rk~z?3;&Uzac=C^B1YsZ~*?iGdr*^Zm@pA05jPgKjeq#OAT7V`j|R zRZviO(Vw~E1VB?3@=>+SW3e056hUhbIk}PpV0=b@5Hgg}#w!W<~|YoP0{NXDw8{vG6ezSO*355TYZZnZSx( zaR79~8Q5+Njb5u|(7_S{*jDdNmOv>Ig+nKT^8yCDgaJ;uV~@?Vv>Gm76oq+HtuWp` zOl~vkQZcx^Fi=6G4{>Xy&|Neiz>CCLZNWY;cB9Sfb{b z$bi7^pk&Cd!UlmuZE+UaP+K@WLD)#r7f|HEa0s(pIA8%nQL*y{;gz_& z>&!IgWg`q;m8{FPYb)DXB`Fbith(TGJNCu{Jsni4C=7|j9oqDVBY74~n{+^J?ib6& z8rZ*4-1NvTjQ-^&{KXQ1WziU7F`NmX#1j>&K~4@J4xm9d0Mq3um^?vdj2y)j(87ZvE@;0{MlJ>$4`enJtG!CqM){Xh zf+ehz$v2HA4e>Xn4jO?jOmQ3mWdQhxivYFu%5LMQL@l9ff@RVut1{Ff0c_K$Vst$q zb-305O!lRaTtw{vdf5^vRg;dTE~>`Ih|Me*=*!8nwb4=1n=fdPW}@DRPYk!3a~%PF zkU|Nb31g!HFxM&6vXJ!;BoRgd@5Bn+acq1=o!OUZYCzs$B2eMp<1sS1xVw!2q{>9A zBhB*+)*NrOU$gf%G>eIl1JNG()p%~GIq!1t^(%^h@&MEnHDsrHi(QN*>3q`=#;EVK8-Qb7$GB!JScT;JxHO7X zqAj0|veW4M#B1Qr;vd--w#`G~34*4t<~c#ImNf}*n71|nD08Si2rcF?__=_vVNrdq zrkQnlid+>NT+5j-oXZxC_bcX5)VDGL!17*Yl7nu@Z$*iKfE4a+34WMwIS-6(61mh& z0ASO?%WBWKj2#!gjK>Y0MNn|92=gv1$oIO%*+UefITnpX8lsLy-bW2~D&c29*n`|C z{aKOz%M!T#VWc4ne3%F&xI<%(RNr7qFx_s) zxTe0p1Shc+vYIkxYI#`4(y#2Fa|XXcTC^}P5@iwF+mi7GyBSVqkftePsd}z$^TW8| z{4E-&<#;m0@CN9V(C0u;^ z8b;gz`->MVRi-I!BHGV06_YMEDaFwD7d(eDyGBFHv3Z%c*M(x@u&Ssnmleb?6qP+f zv&e0wdx8|kmi#T;pcd>TQJM;gt`{GI>yA)?oCMj(?`xy8`IxIOC*Vd%>T|T$1(%>$ zu0ql91gC|0!$bIBR3UwJP&i&C-D5DQNnl6-P-)F9Gz4OhX&W^|2=k}137jfeuR?D~ zfEJI)q4RO*tG+@T5y7otS%E%2ybt{wz%8IMaOGaYoMT^T> z>sdG_)+GeJ#1|0xfR7r7+!D-+OwyEVEzV)X3xSG7rT+jZ=oyb4B)TLDyzv&+hkIPh z%{GOAIFBVK?3rSbAW~(3Ro#tZ)FX82sRETt6|F#5-R;8htwdj53z_siB^hl?UZeRANwN@3TRzh zxIm&F2UacJzNgkApt*_yAPfK(m90hw90x>TXc!WpSdLD+*PwTkT~+DkSKj=rB{4^; z?|3VNBY+R;ST4qeDjDVUziVp`Nxs8;G>$)X#=L z<^i@A`mg=f)A08--C#@5rDrtt0<-Yi%GeYIl)I^P5}*V`9Au6xSQSfSwuSgQ{3bLO zN;=pu@MbA_84m`?AiPt!D_h}c{{TPCzC$48W9kbR&DO8u$|pl#EB!|_^aZrg0c&tq zqiZo#49gG~SIDl=t-Ab`1 z?A#QGxSCsRsfjH{9uVGNb3X&ZWTqvEDND{LodycXq!pmF3p5JTiy1}GJ|jU%4`276 zSc&ka@UR~tm$qbLj5VH>maXPxty}*5E0&7%KoSHU)D=j|z-@0s%q!3ve8fwI@2E5j zT(qkR;Xe#~zoX3Ng0o7+_7tjVSd z8s@FFdeV}Dk+uC;m-<;@P~xtx1XB$svI4Tm0c;Thn(`3sv(^X)YJ`0g@fD{C31gAO zUe@5D`MLw}kN7OW6i*SQk=Rq8s=ey(#51nbKpL?C$1S?Nno?qiN(7Wl1*9bhO5Y!a zUq3Mou+XKhs=>rwKpAaiL+ym=nBJUE^}EYb{{ZOb;7kI%4AcEAMw9gmB|XEebhZ0+ z_^+drQi4Sc(mckD*A28IT2R$kYA9X_J*#2M(i^}CXo%KT2f10PY=+N)q~U>R;y2bm z6L9=*C|oWsK-v=z;Vj?oETY*<8L>La zBx&un=VAfQQsF%fZrjanrYiKkOI2X&R~@!sXey!!N(ESzs*osip<~E^ldz{4g`D+P zwxtZ0TyKns7u1331)E0Z%aMWgF!D7uGXe6YCu44%@c4)nh!CYqy@bKEu80rY0oW20 z8tR|pfSUv021LP#2P(%eP)k-ss+)-sqZm6~G%hC6@-eR35Zz`1r~yd=15rqTQGNoE zMK3M<3{&niv%h3D?NI~*#3Gww0njT71fEKbdudtvku%fl0Nv9mmc)Db!TUM!b zQL6=@F7F~VH(~zR@a1Mn7K%&l-{bX2HhaAxgUvF+e2e#uu@=A-LyH1qw#!+FI(ZUBmnBB2OgxC?&?uUd~bqzz0QHLBY&(c zJDddK(YJOOQ8nX)l?@AXLk3ALVTlMAV>iA28#&&2b*>(YBjsp;N-iD_Zqm!Dk)avi z1M38z$N;fR7l%+i%cQ!&Kx|}c%*WcmV(4uNb^IkFlUBK`LhttcM6_vP@65EcY`nv= zgByTi?BFHtS$tj8xxo_9mj)qHk)G(xP(|zo>O~t!jzZ)4!ghp(H+sm`lA)!|ue>QE zV)kO)&}y;XuK-%sI|*W9?3${U5(r49GcT27e8qOKYL?oX5@;W!5#o%wWK+#kl=ZC}Au|5tph%leoCCct{&D%CR#wox!I3p*67v6f+St%NSdey9OQ) z)G#{L32w7Fa7Ha2>zG;~rAcH_NIz&RSu)G{u~i(k{{SO4+0TrBQJe2fRM>TbScKz- zAQw?p5osLQAE;xi3UY=KiCy9TLO5S}8kQaeTrqJrAKVzWa9xu=8hn5BvI_mfA9yy_V2J|e8M!T$h>ox`FT zQx_~0=b#f-A0u93z{abdFOLLLtXDMwWbFZrdPN24mIV=QaUWbOC{I^_7beO?vEk(L z)a$J3?}PxmZxt&YYAMQ>GA z6az_1&oOMMW2~R<8LGV6k}l&_m2A9?dc4a(ZbfqxaH??@9h06a6(|iQ3Q$_CjIf}=V!BGjc4-VTWC_)5+9AI;8mL07TewI%aI8unxL*Wb;i*ZI z#XOzvP|EcH!)+L$mz9-;QUiCF^)b+%rEld@!(=d~^#>~Qdw%XU!+Zg!+&dgPl^8B@ zaSqXbA&V;R62WbAJg>&@(mMKw;-5_VKit#p{y!9drPL$*lkAi0Gi-gM@t<@2KZ5#+ zul-_uIQviHecW&NGyz)xr2qK*)AW<;zZd%7;%JSN{f>{r+CJv5v-zLzbWiknn)^@V z{4LS;C;C0jpXVQpALR7U_B)?ZKgI7q!1F%y_&Lw>JWuiZen;2srk{DE=4kYc==+)z Im%qpV*;Uf2{{R30 diff --git a/docs/technical/pipeline.md b/docs/technical/pipeline.md index cc32770c0..265c01305 100644 --- a/docs/technical/pipeline.md +++ b/docs/technical/pipeline.md @@ -1,3 +1,5 @@ +[**← Back: Documentation Overview**](../README.md) + # Pipelines Is your PR not passing the pipeline checks? Look no further. @@ -18,7 +20,7 @@ _Run Biome_ yarn biome:ci ``` -_fix biome_ +_Run Biome fix_ ``` yarn biome:fix diff --git a/docs/useful-commands.md b/docs/useful-commands.md index e43aef7eb..5433adaea 100644 --- a/docs/useful-commands.md +++ b/docs/useful-commands.md @@ -1,4 +1,4 @@ -[👈 back](/README.md) +[**← Back: Documentation Overview**](./README.md) # Useful commands @@ -206,6 +206,8 @@ python -m poetry run python manage.py collectstatic
+Be sure to check out the documentation for [Docker command aliases](./docker-project-specific-commands.md). + ### 🐳 Docker: Run command inside container > `` is defined under `services` in [docker-compose.yml](/docker-compose.yml). ```bash diff --git a/docs/work-methodology.md b/docs/work-methodology.md index 1894e3f7c..43d66d013 100644 --- a/docs/work-methodology.md +++ b/docs/work-methodology.md @@ -1,4 +1,4 @@ -[👈 back](/README.md) +[**← Back: Documentation Overview**](./README.md) # Work methodology From 709f6d42def5d41b81f4ad7e4eee447c10bf1c66 Mon Sep 17 00:00:00 2001 From: Robin <16273164+robines@users.noreply.github.com> Date: Wed, 6 Nov 2024 19:17:30 +0100 Subject: [PATCH 08/11] Add endpoint for getting a role's users (#1576) --- backend/root/utils/routes.py | 1 + backend/samfundet/serializers.py | 57 +++++++++++++++++++++++++++++++- backend/samfundet/views.py | 22 +++++++++++- frontend/src/routes/backend.ts | 1 + 4 files changed, 79 insertions(+), 2 deletions(-) diff --git a/backend/root/utils/routes.py b/backend/root/utils/routes.py index 74cc0fc7e..2d1132ab8 100644 --- a/backend/root/utils/routes.py +++ b/backend/root/utils/routes.py @@ -540,6 +540,7 @@ samfundet__merch_detail = 'samfundet:merch-detail' samfundet__role_list = 'samfundet:role-list' samfundet__role_detail = 'samfundet:role-detail' +samfundet__role_users = 'samfundet:role-users' samfundet__recruitment_list = 'samfundet:recruitment-list' samfundet__recruitment_detail = 'samfundet:recruitment-detail' samfundet__recruitment_gangs = 'samfundet:recruitment-gangs' diff --git a/backend/samfundet/serializers.py b/backend/samfundet/serializers.py index 3e8488380..371910607 100644 --- a/backend/samfundet/serializers.py +++ b/backend/samfundet/serializers.py @@ -19,7 +19,7 @@ from root.constants import PHONE_NUMBER_REGEX from root.utils.mixins import CustomBaseSerializer -from .models.role import Role +from .models.role import Role, UserOrgRole, UserGangRole, UserGangSectionRole from .models.event import Event, EventGroup, EventCustomTicket, PurchaseFeedbackModel, PurchaseFeedbackQuestion, PurchaseFeedbackAlternative from .models.billig import BilligEvent, BilligPriceGroup, BilligTicketGroup from .models.general import ( @@ -40,6 +40,7 @@ KeyValue, MenuItem, TextItem, + GangSection, Reservation, ClosedPeriod, FoodCategory, @@ -426,6 +427,12 @@ class Meta: fields = '__all__' +class GangSectionSerializer(CustomBaseSerializer): + class Meta: + model = GangSection + fields = '__all__' + + class RecruitmentGangSerializer(CustomBaseSerializer): recruitment_positions = serializers.SerializerMethodField(method_name='get_positions_count', read_only=True) @@ -499,6 +506,54 @@ class Meta: fields = '__all__' +class UserOrgRoleSerializer(CustomBaseSerializer): + user = UserSerializer() + org_role = serializers.SerializerMethodField() + + class Meta: + model = UserOrgRole + fields = ('user', 'org_role') + + def get_org_role(self, obj: UserOrgRole) -> dict: + return { + 'created_at': obj.created_at, + 'created_by': UserSerializer(obj.created_by).data, + 'organization': OrganizationSerializer(obj.obj).data, + } + + +class UserGangRoleSerializer(CustomBaseSerializer): + user = UserSerializer() + gang_role = serializers.SerializerMethodField() + + class Meta: + model = UserGangRole + fields = ('user', 'gang_role') + + def get_gang_role(self, obj: UserGangRole) -> dict: + return { + 'created_at': obj.created_at, + 'created_by': UserSerializer(obj.created_by).data, + 'gang': GangSerializer(obj.obj).data, + } + + +class UserGangSectionRoleSerializer(CustomBaseSerializer): + user = UserSerializer() + section_role = serializers.SerializerMethodField() + + class Meta: + model = UserGangSectionRole + fields = ('user', 'section_role') + + def get_section_role(self, obj: UserGangSectionRole) -> dict: + return { + 'created_at': obj.created_at, + 'created_by': UserSerializer(obj.created_by).data, + 'section': GangSectionSerializer(obj.obj).data, + } + + class SaksdokumentSerializer(CustomBaseSerializer): # Read only url file path used in frontend url = serializers.SerializerMethodField(method_name='get_url', read_only=True) diff --git a/backend/samfundet/views.py b/backend/samfundet/views.py index 875f80229..e4099a47c 100644 --- a/backend/samfundet/views.py +++ b/backend/samfundet/views.py @@ -5,6 +5,7 @@ import hmac import hashlib from typing import Any +from itertools import chain from guardian.shortcuts import get_objects_for_user @@ -40,7 +41,7 @@ from .utils import event_query, generate_timeslots, get_occupied_timeslots_from_request from .homepage import homepage -from .models.role import Role +from .models.role import Role, UserOrgRole, UserGangRole, UserGangSectionRole from .serializers import ( TagSerializer, GangSerializer, @@ -67,11 +68,13 @@ EventGroupSerializer, PermissionSerializer, RecruitmentSerializer, + UserOrgRoleSerializer, ClosedPeriodSerializer, FoodCategorySerializer, OrganizationSerializer, SaksdokumentSerializer, UserFeedbackSerializer, + UserGangRoleSerializer, InterviewRoomSerializer, FoodPreferenceSerializer, UserPreferenceSerializer, @@ -82,6 +85,7 @@ ReservationCheckSerializer, UserForRecruitmentSerializer, RecruitmentPositionSerializer, + UserGangSectionRoleSerializer, RecruitmentStatisticsSerializer, RecruitmentForRecruiterSerializer, RecruitmentSeparatePositionSerializer, @@ -324,6 +328,22 @@ class RoleView(ModelViewSet): serializer_class = RoleSerializer queryset = Role.objects.all() + @action(detail=True, methods=['get']) + def users(self, request: Request, pk: int) -> Response: + role = get_object_or_404(Role, id=pk) + + org_roles = UserOrgRole.objects.filter(role=role).select_related('user', 'obj') + gang_roles = UserGangRole.objects.filter(role=role).select_related('user', 'obj') + section_roles = UserGangSectionRole.objects.filter(role=role).select_related('user', 'obj') + + org_data = UserOrgRoleSerializer(org_roles, many=True).data + gang_data = UserGangRoleSerializer(gang_roles, many=True).data + section_data = UserGangSectionRoleSerializer(section_roles, many=True).data + + combined = list(chain(org_data, gang_data, section_data)) + + return Response(combined) + # =============================== # # Sulten # diff --git a/frontend/src/routes/backend.ts b/frontend/src/routes/backend.ts index f1b8b9b81..cea34268e 100644 --- a/frontend/src/routes/backend.ts +++ b/frontend/src/routes/backend.ts @@ -539,6 +539,7 @@ export const ROUTES_BACKEND = { samfundet__merch_detail: '/api/merch/:pk/', samfundet__role_list: '/api/role/', samfundet__role_detail: '/api/role/:pk/', + samfundet__role_users: '/api/role/:pk/users/', samfundet__recruitment_list: '/api/recruitment/', samfundet__recruitment_detail: '/api/recruitment/:pk/', samfundet__recruitment_gangs: '/api/recruitment/:pk/gangs/', From 850c0c2eac782d0c9e17c24ccf6d80e7c8558a69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Snorre=20S=C3=A6ther?= <112980079+Snorre98@users.noreply.github.com> Date: Thu, 7 Nov 2024 20:12:00 +0100 Subject: [PATCH 09/11] Adds pagination component (#1586) * adds all, very inspired by shadcn * removes unused code * adds Pagination to outer barrel file * removed more unused code and comments * improved / simplified story * adds supress unique key * refactors styling * adds margin to component * Update frontend/src/Components/Pagination/components/PaginationEllipsis/PaginationEllipsis.tsx … Co-authored-by: Robin <16273164+robines@users.noreply.github.com> * add classnames * added classname to ellipsis * added ellipsis icon, same width as chevrons in pagination control (in DrfPagination) * uses classNames in PaginationContent * adds whitespace in PaginationContent * adds classNames in Pagination * whitespace in pagination * style to make button width consistent * renamed PaginationControl * renamed controllText to controlSymbol * removed style modularity from pagination control (removes props) * PaginationControllProps -> PaginationControlProps * newline between import and comp * newline between pagination imte comp and imports * barrel x 6 * use useMemo * fix storybook * sibling count and boundry count * klink siblings with boundries * changes to good ol regular function * better styling * renamed to paged pagination * renamed PaginationControll * more renaming * more rename * extend button prop * rename --------- Co-authored-by: Robin <16273164+robines@users.noreply.github.com> --- frontend/src/Components/Button/Button.tsx | 2 +- frontend/src/Components/Button/index.ts | 1 + .../Pagination/PagedPagination.module.scss | 6 + .../Pagination/PagedPagination.stories.tsx | 153 ++++++++++++++++++ .../Components/Pagination/PagedPagination.tsx | 115 +++++++++++++ .../Pagination/Pagination.module.scss | 5 + .../components/Pagination/Pagination.tsx | 8 + .../Pagination/components/Pagination/index.ts | 1 + .../PaginationButton.module.scss | 9 ++ .../PaginationButton/PaginationButton.tsx | 33 ++++ .../components/PaginationButton/index.ts | 1 + .../PaginationContent.module.scss | 9 ++ .../PaginationContent/PaginationContent.tsx | 8 + .../components/PaginationContent/index.ts | 1 + .../PaginationEllipsis.module.scss | 6 + .../PaginationEllipsis/PaginationEllipsis.tsx | 13 ++ .../components/PaginationEllipsis/index.ts | 1 + .../PaginationItem/PaginationItem.module.scss | 8 + .../PaginationItem/PaginationItem.tsx | 8 + .../components/PaginationItem/index.ts | 1 + .../Components/Pagination/components/index.ts | 5 + frontend/src/Components/Pagination/index.ts | 1 + frontend/src/Components/index.ts | 3 +- 23 files changed, 396 insertions(+), 2 deletions(-) create mode 100644 frontend/src/Components/Pagination/PagedPagination.module.scss create mode 100644 frontend/src/Components/Pagination/PagedPagination.stories.tsx create mode 100644 frontend/src/Components/Pagination/PagedPagination.tsx create mode 100644 frontend/src/Components/Pagination/components/Pagination/Pagination.module.scss create mode 100644 frontend/src/Components/Pagination/components/Pagination/Pagination.tsx create mode 100644 frontend/src/Components/Pagination/components/Pagination/index.ts create mode 100644 frontend/src/Components/Pagination/components/PaginationButton/PaginationButton.module.scss create mode 100644 frontend/src/Components/Pagination/components/PaginationButton/PaginationButton.tsx create mode 100644 frontend/src/Components/Pagination/components/PaginationButton/index.ts create mode 100644 frontend/src/Components/Pagination/components/PaginationContent/PaginationContent.module.scss create mode 100644 frontend/src/Components/Pagination/components/PaginationContent/PaginationContent.tsx create mode 100644 frontend/src/Components/Pagination/components/PaginationContent/index.ts create mode 100644 frontend/src/Components/Pagination/components/PaginationEllipsis/PaginationEllipsis.module.scss create mode 100644 frontend/src/Components/Pagination/components/PaginationEllipsis/PaginationEllipsis.tsx create mode 100644 frontend/src/Components/Pagination/components/PaginationEllipsis/index.ts create mode 100644 frontend/src/Components/Pagination/components/PaginationItem/PaginationItem.module.scss create mode 100644 frontend/src/Components/Pagination/components/PaginationItem/PaginationItem.tsx create mode 100644 frontend/src/Components/Pagination/components/PaginationItem/index.ts create mode 100644 frontend/src/Components/Pagination/components/index.ts create mode 100644 frontend/src/Components/Pagination/index.ts diff --git a/frontend/src/Components/Button/Button.tsx b/frontend/src/Components/Button/Button.tsx index 012bbef08..d259b547f 100644 --- a/frontend/src/Components/Button/Button.tsx +++ b/frontend/src/Components/Button/Button.tsx @@ -5,7 +5,7 @@ import styles from './Button.module.scss'; import type { ButtonDisplay, ButtonTheme } from './types'; import { displayToStyleMap, themeToStyleMap } from './utils'; -type ButtonProps = { +export type ButtonProps = { name?: string; theme?: ButtonTheme; display?: ButtonDisplay; diff --git a/frontend/src/Components/Button/index.ts b/frontend/src/Components/Button/index.ts index b8ca3aaac..c7cf1a21a 100644 --- a/frontend/src/Components/Button/index.ts +++ b/frontend/src/Components/Button/index.ts @@ -1,2 +1,3 @@ export { Button } from './Button'; +export type { ButtonProps } from './Button'; export type { ButtonDisplay, ButtonTheme } from './types'; diff --git a/frontend/src/Components/Pagination/PagedPagination.module.scss b/frontend/src/Components/Pagination/PagedPagination.module.scss new file mode 100644 index 000000000..fb4dcf1ec --- /dev/null +++ b/frontend/src/Components/Pagination/PagedPagination.module.scss @@ -0,0 +1,6 @@ +.container { + display: flex; + justify-content: center; + margin: 1rem; + width: 100%; +} diff --git a/frontend/src/Components/Pagination/PagedPagination.stories.tsx b/frontend/src/Components/Pagination/PagedPagination.stories.tsx new file mode 100644 index 000000000..4d72e528e --- /dev/null +++ b/frontend/src/Components/Pagination/PagedPagination.stories.tsx @@ -0,0 +1,153 @@ +import type { ComponentMeta, ComponentStory } from '@storybook/react'; +import { useState } from 'react'; +import { PagedPagination } from './PagedPagination'; + +export default { + title: 'Components/DRFPagination', + component: PagedPagination, + argTypes: { + currentPage: { + control: 'number', + description: 'Current active page', + }, + totalItems: { + control: 'number', + description: 'Total number of items to paginate', + }, + pageSize: { + control: 'number', + description: 'Number of items per page', + }, + siblingCount: { + control: 'number', + description: 'Number of sibling pages around the current page', + defaultValue: 1, + }, + boundaryCount: { + control: 'number', + description: 'Number of pages to display at the start and end', + defaultValue: 1, + }, + className: { + control: 'text', + description: 'Custom class for the pagination container', + }, + itemClassName: { + control: 'text', + description: 'Custom class for individual pagination items', + }, + }, + parameters: { + docs: { + description: { + component: 'A pagination component designed to work with Django Rest Framework pagination.', + }, + }, + }, +} as ComponentMeta; + +// Template with state management +const Template: ComponentStory = (args) => { + const [currentPage, setCurrentPage] = useState(args.currentPage); + + return ( +
+ +

Current page: {currentPage}

+
+ ); +}; + +// Basic usage +export const Basic = Template.bind({}); +Basic.args = { + currentPage: 1, + totalItems: 100, + pageSize: 10, +}; +Basic.parameters = { + docs: { + description: { + story: 'Basic pagination with default styling', + }, + }, +}; + +// Many pages example +export const ManyPages = Template.bind({}); +ManyPages.args = { + ...Basic.args, + totalItems: 2500, + currentPage: 7, +}; +ManyPages.parameters = { + docs: { + description: { + story: 'Pagination with many pages showing ellipsis', + }, + }, +}; + +// Minimal pages example +export const MinimalPages = Template.bind({}); +MinimalPages.args = { + ...Basic.args, + totalItems: 30, + pageSize: 10, +}; +MinimalPages.parameters = { + docs: { + description: { + story: 'Pagination with only a few pages using text theme', + }, + }, +}; + +// Example with increased sibling count +export const SiblingCountTwo = Template.bind({}); +SiblingCountTwo.args = { + ...Basic.args, + totalItems: 250, + siblingCount: 2, + currentPage: 5, +}; +SiblingCountTwo.parameters = { + docs: { + description: { + story: 'Pagination showing two sibling pages around the current page.', + }, + }, +}; + +// Example with increased boundary count +export const BoundaryCountTwo = Template.bind({}); +BoundaryCountTwo.args = { + ...Basic.args, + totalItems: 250, + boundaryCount: 2, + currentPage: 10, +}; +BoundaryCountTwo.parameters = { + docs: { + description: { + story: 'Pagination with two boundary pages displayed at the start and end.', + }, + }, +}; + +// Combination of increased sibling and boundary count +export const SiblingAndBoundary = Template.bind({}); +SiblingAndBoundary.args = { + ...Basic.args, + totalItems: 250, + siblingCount: 2, + boundaryCount: 2, + currentPage: 12, +}; +SiblingAndBoundary.parameters = { + docs: { + description: { + story: 'Pagination showing two sibling pages and two boundary pages.', + }, + }, +}; diff --git a/frontend/src/Components/Pagination/PagedPagination.tsx b/frontend/src/Components/Pagination/PagedPagination.tsx new file mode 100644 index 000000000..2eb18487a --- /dev/null +++ b/frontend/src/Components/Pagination/PagedPagination.tsx @@ -0,0 +1,115 @@ +import { Icon } from '@iconify/react'; +import classNames from 'classnames'; +import { useMemo } from 'react'; +import styles from './PagedPagination.module.scss'; +import { Pagination, PaginationButton, PaginationContent, PaginationEllipsis, PaginationItem } from './components'; + +type PagedPaginationPaginationItemType = (number | 'ellipsis')[]; + +interface PagedPaginationnProps { + currentPage: number; + totalItems: number; + pageSize: number; + onPageChange: (page: number) => void; + siblingCount?: number; // Controls the number of sibling pages around the current page + boundaryCount?: number; // Controls the number of boundary pages on each end + paginationClassName?: string; + itemClassName?: string; +} + +// Helper function to generate sequential page numbers +const generateSequentialPages = (start: number, end: number): number[] => { + return Array.from({ length: end - start + 1 }, (_, i) => start + i); +}; + +// Adjusted ellipsis helper functions +const showStartEllipsis = (current: number, boundaryCount: number, siblingCount: number): boolean => + boundaryCount > 0 && siblingCount > 0 && current > boundaryCount + siblingCount + 1; +const showEndEllipsis = (current: number, total: number, boundaryCount: number, siblingCount: number): boolean => + boundaryCount > 0 && siblingCount > 0 && current < total - boundaryCount - siblingCount; + +export function PagedPagination({ + currentPage, + totalItems, + pageSize, + onPageChange, + siblingCount = 1, + boundaryCount = 1, + paginationClassName, + itemClassName, +}: PagedPaginationnProps) { + const totalPages = Math.ceil(totalItems / pageSize); + + const paginationItems = useMemo(() => { + const pages: PagedPaginationPaginationItemType = []; + const startPages = generateSequentialPages(1, Math.min(boundaryCount, totalPages)); + const endPages = generateSequentialPages(Math.max(totalPages - boundaryCount + 1, boundaryCount + 1), totalPages); + + // Early return for simple pagination case + if (totalPages <= 7 + siblingCount * 2 + boundaryCount * 2) { + return generateSequentialPages(1, totalPages); + } + + // Add boundary pages at the start + pages.push(...startPages); + + // Conditionally add start ellipsis + if (showStartEllipsis(currentPage, boundaryCount, siblingCount)) { + pages.push('ellipsis'); + } + + // Add sibling pages around the current page + const startSibling = Math.max(boundaryCount + 1, currentPage - siblingCount); + const endSibling = Math.min(totalPages - boundaryCount, currentPage + siblingCount); + pages.push(...generateSequentialPages(startSibling, endSibling)); + + // Conditionally add end ellipsis + if (showEndEllipsis(currentPage, totalPages, boundaryCount, siblingCount)) { + pages.push('ellipsis'); + } + + // Add boundary pages at the end + pages.push(...endPages); + + return pages; + }, [currentPage, totalPages, siblingCount, boundaryCount]); + + return ( +
+ + + + } + onClick={() => currentPage > 1 && onPageChange(currentPage - 1)} + disabled={currentPage === 1} + /> + + + {paginationItems.map((page, index) => ( + // biome-ignore lint/suspicious/noArrayIndexKey: + + {page === 'ellipsis' ? ( + + ) : ( + onPageChange(page)} + /> + )} + + ))} + + + } + onClick={() => currentPage < totalPages && onPageChange(currentPage + 1)} + disabled={currentPage === totalPages} + /> + + + +
+ ); +} diff --git a/frontend/src/Components/Pagination/components/Pagination/Pagination.module.scss b/frontend/src/Components/Pagination/components/Pagination/Pagination.module.scss new file mode 100644 index 000000000..7385cf5f2 --- /dev/null +++ b/frontend/src/Components/Pagination/components/Pagination/Pagination.module.scss @@ -0,0 +1,5 @@ +.nav { + display: flex; + align-items: center; + width: 100%; +} diff --git a/frontend/src/Components/Pagination/components/Pagination/Pagination.tsx b/frontend/src/Components/Pagination/components/Pagination/Pagination.tsx new file mode 100644 index 000000000..eb9624caa --- /dev/null +++ b/frontend/src/Components/Pagination/components/Pagination/Pagination.tsx @@ -0,0 +1,8 @@ +import classNames from 'classnames'; +import React from 'react'; +import styles from './Pagination.module.scss'; + +export const Pagination = React.forwardRef>(({ className, ...props }, ref) => ( +