final lessons

This commit is contained in:
2026-06-07 10:44:05 +02:00
parent ceea2f206a
commit 39ec1bac72
105 changed files with 7789 additions and 1515 deletions

View File

@@ -0,0 +1,75 @@
# Les 5 — Huiswerk
## QuickPoll uitbreiden + Next.js verkennen
**Deadline:** Voor volgende les
**Inleveren:** GitHub repo link via Teams
---
## Opdracht 1 — Push naar GitHub
Als je dat nog niet hebt gedaan:
```bash
cd quickpoll
git init
git add .
git commit -m "QuickPoll Part 1 — Les 5"
# Maak nieuwe repo op github.com/new (public)
git branch -M main
git remote add origin https://github.com/JOUW-USER/quickpoll.git
git push -u origin main
```
---
## Opdracht 2 — Voeg 3 polls toe + statistiek
Pas `lib/data.ts` aan: voeg minstens **3 polls** toe met diverse opties. Op de homepage: toon het totale aantal stemmen per poll (sum van votes).
---
## Opdracht 3 — Detail-pagina aanvulling
Voeg op de poll-detailpagina toe:
- Aantal totaal stemmen (boven de buttons)
- Percentage per optie (bv. "45%") naast votes-aantal
- Een "Terug naar overzicht" link naar homepage
---
## Opdracht 4 — Eigen polish (vrij)
Kies minstens **één**:
- Mooie skeleton in `app/loading.tsx`
- Custom 404 in `app/not-found.tsx`
- Hover-animatie op poll-items
- Mobile-vriendelijke styling (responsive grid)
---
## Opdracht 5 — Reflectie (200 woorden)
Schrijf een korte reflectie:
- Wat snap je nog niet over Server vs Client Components?
- Welke onderdelen voelden makkelijk? Welke lastig?
- Wat zou je willen leren over Next.js dat we nog niet hebben gedaan?
Plak in een `REFLECTIE.md` in je repo.
---
## Inleveren
GitHub repo URL via Teams. Aan het eind moet je `pnpm dev` runnen en alles werken — geen broken pages.
---
## Tips
- **Commit per opdracht** — kleinere commits = makkelijker review
- **Test mobile** — Chrome DevTools → toggle device toolbar
- **Vraag hulp** in Teams als je vastloopt
- **Tijdsindicatie:** ~1,5 uur
Volgende les bouwen we Server Actions in — Part 2 van QuickPoll.

View File

@@ -0,0 +1,105 @@
%PDF-1.4
%<25><><EFBFBD><EFBFBD> ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 6 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/Contents 11 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 10 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/BaseFont /Symbol /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
7 0 obj
<<
/Contents 12 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 10 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
8 0 obj
<<
/PageMode /UseNone /Pages 10 0 R /Type /Catalog
>>
endobj
9 0 obj
<<
/Author (NOVI Hogeschool Utrecht) /CreationDate (D:20260607080655+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260607080655+00'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Huiswerk) /Trapped /False
>>
endobj
10 0 obj
<<
/Count 2 /Kids [ 5 0 R 7 0 R ] /Type /Pages
>>
endobj
11 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1876
>>
stream
GauHK=``=U&:WfGfQ!fFE]SekO9Cr[[(.Q`SO@I)oKl-*`0c>(6_<PGmt(d88X?HfBe><XK%T*fm-_>n5k2bWhaIV9q\1B\)))QLDnoW;_XmrCRQ>X&iBEU2#=Ksi!Y-Iejq%$JPChs25MuPE73tgZ"]mFQ<1nc:S<Q]6Y2S+kLB3N$Q-'9)R--""5[G"oF#<7schE'?q:7cAg^AqqHA?Ar?W;bA=:<8d'eZ3(P9*C2)#\`&o+'Vh.pX^W=Vep,1=qG,#rBjQ]QaZ7oiB,d7d$*lr=7:h`kXj=lSINn.X./lXeOf]kI6G:lYmT8+g?NP:DgrDL!Nu<I)1UI4Fs1j).1ES\\rKaf*%@*N&Ldre2L/-_=j/PrOi^La5/Ks#k^;lAG\6V#g!.Pg)(3d?.PBK=ZD&SZ-sVt/%!ntHXdG=U)Pid[eng;=iHVHede9$@7kNjfK!PuW,k@81k$Kh/l8C+C5AER65B/mO.?OC/o/\6)!pt9@^dkpf1(*sru/LHjq3Y/`HkoEi>rB21qJQ"T-j(UYL/)CC',--\&C)C>qBY9"W&</77q,fkO&R\JCc&aQc?Y:?ZuWRG6Dn`D*S0JN!$$O;\^m%YHp3C.OsVlNg;_SZlW&-2!kD2@CX,hZKG/uiQe.iisn-H6#.RQm9,uB"echHFMIY>FpcG<j0XYMX/'W\URUcHq2WokY6%B:KD&R+Cfg?F]1s7r_AHTl<OrU^-qfJn`\8(iP9Bd#j[E03NoF=:HROn2bQI%#(B,jkl#`mJf&n0#&ce-oIZs_Yb$KjK$2hTuV`i3]EBOhX8mrJ'-#UK6'm@J<#C_,SMt_A-.nGb2Ju7&&e\ILr$F)=-$L]%Ofq@XU3f"-%?KuJI8#^B8g4s2A2d)HaFqAh1[rcpcn'W'!44i_jn=-A(>KsE+D)+BL\$1iYR-H@cT%6%G`ed)94;pLeqKBcuBk/S,^<N^)ADk_#?Yu*SBK2WlHsIJ&8Ad-"+[#1qla]+6r)h4^"anpP,nF^uJi(n%XS'5ZQ!T2RH9BZYH%C(T<)CmMN$93K:>'CrOd\AfSh1A)auoq`Ce0On^XVj&Te;VJ("M^))(I`mK^s>B$;!A3fP-V?&Y\&l4g6H8WkXB2*/Bas4JoeIg=nBqWd5)\pU-:TdIdIIFLt2486PVr:neG6X^e[;9@jPNI?pYI'(/G_fO11nGX1W60H:/;?IWGbW.ZRYb0qP:pTBG7J/&BW9-C-D4;/ffK0q#maH?ZZirh".)HrWt2;_c2f'7RW*at#U?f5E2hO6:'mWDIaf`ogQ\sa;>2G*R)bXS(:*_2.Aj_;[8-P+&(ZL6$00O:bgr"5)G8l#h9bV8WL@"iZmA>QHHPiWJeh68NT:%<Td)7]G?lK_g;Y?tUaT%K5OX2g6036E(2)q-"N<G,pif8#9K.@g-mG;QIIp\^pH1u95B9r:u7^d'KEbV]5%7>V[I;+CEUnb0h*^\;Qb4B"Uf@1SLDF_F?6FOUjlo*Mk;OHd]bCRC-;P_0Gn;-K2F4li+KaapBVQ=0;h7`\,S`jA-]"bE]`+FC5s6uTr-IZF:\bRE9/An;hF/c[+QNV=8.SKp6"*+<SLR*8!a^c"m6Y>Q1C96*MGn9kl2FE[;d=eP,9T6B(c3U`<G%&8'[C#1o`f!^HuJQIoEc&bt]?MtFteS1?"_)?9P05ELM0CWq@1RXftn_Iebs6PSK%ArRb!r;>=3Fbr.FV8&URWkq_:A?K2oJ/usaKjK4So+"T6(:qeM*q;<ceNY/%Hd6]*p43o!NpRZcj4cjlOp4ud(nEL\8],g04pP_\15XuR`8(PSV$c(,(:0_=*T*/;k7!jAno9Ubl<^-*\Wtm[pJFTchVJkN!9F<NAiElS::OV3dk3~>endstream
endobj
12 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1429
>>
stream
Gb!;d968iG&AJ$ClqtmS0EFAfR81bES_=`)YoUipkQ6Sp"UP<6&sCZaqV/WT*i<Ji[[N4l>EhejJUMpXqs?]a4FGQ=F&2l7R_mI!$C!i&$T&t,U_e!=*rL"C=N'2A"QCf#hdo'a^AEO45L9s2,jMZfKuAm@&dJsnPU&gZ!J^L2R)Vr/\:&]hJ]*Ze-NT<^L/AT>g[C>^0iT0T0T*H2q\SrPcFbcd(=o1Io*^92$G(1k-.NN^8&I<>["-H"cSt$+Ao^`ZL;kY:C+D"U>3I[V_sobb-Dj+t;H.QW*C9PQ.;0"s,"eT^Mq<ZS9k6C#eT`_.P35_a?nD[d#iSZL`"mO8/0[[L"UP(E#e0GQ&35_?mh)?"#1g_ko=<'pmed@Q2OqopBIJk'oalG?BdH9_2erV72ouG2-EZMAS6jo_CN@@7g'Ltg<=YQ1;UeN6?!F"<BTtAt2CgjP5G[_L(CufU3^<'iCDF[A,qZI9k4'FX4#np-(Wj8DT:gl9^^X?&c=P;;mEmoMBr"Nr881Cl](SPZUG5Y34VgXlUI"/kErH[o?C"+(n4`,;f_YJ?9+p`XkAtjHCJT.M-FG]7";o?'Y%hGWDp:[_O#Y=qkB$>lf?0A\_WeZ$1G]cr+kO$X(5$Eq=-;cE>#Ec[H1m2Wr@>WHR_Db\&6VHc9IMn>@g:[P'kSkW9dT)QkZU^bjH[rtnBTQ:re["4r#c?;<Eg8m8[)CfT5eI&kKI^]X2MdWWn1[N#;]ki9^&DDAr(YJZh?`Wb@$.uHj]unHYb/^YhL`\GlfoK/[eXI_2\I"=mV!h2f>>?]S)CID0"!$=E$,$?UX#T9ku^cR"Q5M9S#cjGP/T"bo,Dl_J1i.=."@B;dsKp_DHptO2jts]n?,!`G7!q#Mjgm7,e:GQ^PAYcD5L;.T,/;'B;mJ]-X3j10cYO-,<@Lqm[sh)<^k1q`DnG8>9.]m+Jj#'d(&Jjbe/dCL*RH^GnAJcVI,pD,*$-ccB+.Buo<s'#Zt*!k+Tu!^C!Cpeh#Pf*[:=K_l(!H*jDk9st`2#^3sUHT(+I(r4bh$^aNrWSg3>i0\;=VZe5d#)0lT"D\\.;O7Pt@X8R>C8.uo!ABJT;hLRUnOpd^\VjG%1?1Ir3[MhWrs<-'P:lD(,ha+?5P/"bIP_J4/9_U,/"1*j>N;b)J_AVBckM2@J;5`sOleh&?Ds?\NYU[_Ah4@Z*B!b8a,7C;&lU5kY@]uTMFB"0MhU*OX6gao$nG6^G>:m&r44q%"WKA*0\Y0oGQQIW\Iu':j?VW^U\_WL@6J[-cu(>YEu7YO\W)%WW^2B<*Oe_IBe!UbqkDg,^.BM==cJ@h#CJBS[[mDerY34[E^-QcHQrp92+$&uMr,A:]7U)C%doh.%%.nNp0pKQ`^(B$""k4ET1:AhISZ+%Y9n9D^;M8D-7?^I56MZr3W~>endstream
endobj
xref
0 13
0000000000 65535 f
0000000061 00000 n
0000000122 00000 n
0000000229 00000 n
0000000341 00000 n
0000000446 00000 n
0000000651 00000 n
0000000728 00000 n
0000000933 00000 n
0000001002 00000 n
0000001287 00000 n
0000001353 00000 n
0000003321 00000 n
trailer
<<
/ID
[<9039fd2d998a3bef32f6fb1a7e765539><9039fd2d998a3bef32f6fb1a7e765539>]
% ReportLab generated PDF document -- digest (opensource)
/Info 9 0 R
/Root 8 0 R
/Size 13
>>
startxref
4842
%%EOF

View File

@@ -0,0 +1,168 @@
# Les 5 — Lesopdracht
## QuickPoll Part 1 — bouw de basis
**Duur:** ~120 minuten klassikaal bouwen
---
## Doel
Aan het einde heb je een werkende **QuickPoll Part 1**: lijst van polls op homepage, click → detail-page, voting met lokale state (data verdwijnt bij refresh — dat lossen we Les 7 op).
---
## Stap 1 — Setup
```bash
pnpm create next-app@latest quickpoll \
--typescript --tailwind --app --no-src-dir --import-alias "@/*"
cd quickpoll
pnpm dev
```
Check: localhost:3000 toont Next.js welcome.
---
## Stap 2 — In-memory data
`lib/data.ts`:
```typescript
export const polls = [
{
id: "1",
title: "Beste taal?",
options: [
{ id: "a", text: "TypeScript", votes: 0 },
{ id: "b", text: "Python", votes: 0 },
{ id: "c", text: "Go", votes: 0 },
],
},
];
export function getPoll(id: string) {
return polls.find(p => p.id === id);
}
```
---
## Stap 3 — Homepage
`app/page.tsx`:
```tsx
import { polls } from "@/lib/data";
import Link from "next/link";
export default function Home() {
return (
<main className="max-w-2xl mx-auto p-8">
<h1 className="text-3xl font-bold mb-6">QuickPoll</h1>
<ul className="space-y-2">
{polls.map(p => (
<li key={p.id}>
<Link href={`/poll/${p.id}`} className="text-blue-600 hover:underline">
{p.title}
</Link>
</li>
))}
</ul>
</main>
);
}
```
---
## Stap 4 — Detail-page
`app/poll/[id]/page.tsx`:
```tsx
import { getPoll } from "@/lib/data";
import { notFound } from "next/navigation";
import { VoteForm } from "@/components/VoteForm";
export default async function PollPage({
params,
}: { params: Promise<{ id: string }> }) {
const { id } = await params;
const poll = getPoll(id);
if (!poll) notFound();
return (
<main className="max-w-md mx-auto p-8">
<h1 className="text-2xl font-bold mb-4">{poll.title}</h1>
<VoteForm poll={poll} />
</main>
);
}
```
---
## Stap 5 — VoteForm (Client Component)
`components/VoteForm.tsx`:
```tsx
"use client";
import { useState } from "react";
export function VoteForm({ poll }) {
const [votes, setVotes] = useState(poll.options);
const [voted, setVoted] = useState(false);
function vote(optionId: string) {
setVotes(prev => prev.map(o =>
o.id === optionId ? { ...o, votes: o.votes + 1 } : o
));
setVoted(true);
}
return (
<div className="space-y-2">
{votes.map(o => (
<button
key={o.id}
onClick={() => vote(o.id)}
disabled={voted}
className="w-full text-left p-3 border rounded hover:bg-gray-50 disabled:opacity-50"
>
<span>{o.text}</span>
<span className="ml-auto float-right text-sm text-gray-500">
{o.votes}
</span>
</button>
))}
{voted && <p className="text-green-600 text-sm">Bedankt voor je stem!</p>}
</div>
);
}
```
---
## Eisen
- [ ] Next.js project draait lokaal
- [ ] Homepage toont lijst polls
- [ ] Klik op poll → detail-pagina
- [ ] Voting werkt lokaal (visuele update)
- [ ] not-found.tsx voor onbekende poll IDs
- [ ] Tailwind styling — leesbaar
---
## Bonus
- Voeg een 2e poll toe in `lib/data.ts`
- Maak een `app/loading.tsx` met een mooi skeleton
- Voeg basic styling polish toe (hover effects, transitions)
---
## Klaar?
Volgende les: Server Actions + form handling + voorbereiding op Supabase. Daarna Les 7 = echte database.

View File

@@ -2,7 +2,7 @@
%<25><><EFBFBD><EFBFBD> ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 7 0 R
/F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 5 0 R
>>
endobj
2 0 obj
@@ -17,22 +17,17 @@ endobj
endobj
4 0 obj
<<
/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
/BaseFont /Symbol /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/Contents 21 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 20 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
6 0 obj
<<
/Contents 22 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 20 0 R /Resources <<
/Contents 14 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 13 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
@@ -42,12 +37,17 @@ endobj
endobj
7 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font
/Contents 15 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 13 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
8 0 obj
<<
/Contents 23 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 20 0 R /Resources <<
/Contents 16 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 13 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
@@ -57,7 +57,7 @@ endobj
endobj
9 0 obj
<<
/Contents 24 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 20 0 R /Resources <<
/Contents 17 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 13 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
@@ -67,7 +67,7 @@ endobj
endobj
10 0 obj
<<
/Contents 25 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 20 0 R /Resources <<
/Contents 18 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 13 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
@@ -77,220 +77,86 @@ endobj
endobj
11 0 obj
<<
/Contents 26 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 20 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
/PageMode /UseNone /Pages 13 0 R /Type /Catalog
>>
endobj
12 0 obj
<<
/Contents 27 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 20 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
/Author (NOVI Hogeschool Utrecht) /CreationDate (D:20260607080655+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260607080655+00'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Lesopdracht) /Trapped /False
>>
endobj
13 0 obj
<<
/Contents 28 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 20 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
/Count 5 /Kids [ 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R ] /Type /Pages
>>
endobj
14 0 obj
<<
/Contents 29 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 20 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1580
>>
stream
Gatm;968iG&AIa;m,[5<.Mr[/!.@J.e?*@=Bj@]!q*J#a7>i@(P-UQMIsVuZ!0h$IXqOAo$/jgt#JY\C!Q@"`Y3?k_f/XhC112*af>']c_Yc4f2@o3W_Bi8l"@QoQ@LaY!p'(+`:d?:_N-WW4;an&#+k2Ha*GaSX:+<'52K8UI?pKsP8r#YgMklYck67!<U[!q/;T??3#Q(kc0.(_D%aF?)#_it.E6=l3OAH^l#j,n^qXWgY1\d`X0ho51b8gM!CQgAT\E$o2LGS^9mS."gVLApE>F<13$7;ES6qJXj[12uc1hF(n'*n.e\]K^3fEC7TUH"u=5+!Z#,:\]V7fURA#85@bK2>!b>UeaDL^C!-hO2;dC;KjP65m?;@tN&U@eQn\P=-f7K0s-"m\QF/\!%#[gNbJ$F$%mH;6MM[.%6:YFc[]Zln5Rr=9eP.$.G=NoUR3e6q7oMdJ/"$F+KE>l)F,V&ZTQ@^$e')Ums3L@srP/kI]KB*fYJW5O>ucMb(dRB&9eSn;,&N*Fi"#GL-6J;q)t-H6BKfO<5/4@SS^*\,_40;QA`=^(BtUSM5=N!P5kX]"0#U7#jj_RC*'HcSo"<qHE#A-:H[a<2\cVgcWBh^fAfnc*J:>^rk4Bb`JfSbO.o!-ZBmKme.J+1lHN(F'$H&o+ZlGO.\H1B=iO6Z`FZqU'!qf%?J4LX-5-1VcLc-,jYA$Z.V&/*(s.kV+D/pjec-*D,qFs6"S+HqC3:FDX(i_4R^6^iHMpo:dt,;IpMimr5KGlT%pusK3('@o0N(Th-i"pds/U%fb$0#Y^'s,lQ+u2JP\=WrPnWan$r2?<<*JD#\Dd=58G?N2unc2@Ka>j`6[:%+43YZi98X%;tohSiAcF=)00,U'q<bgYf`0,a]8_re#'>u%Yil1`&LWHi!or7<72(83G!$;,98YQ;1SD%m8I`ik=l:N3mkG@CXINsfOJ@dO;+oU/XXb&E+uK5eptTp4ICHFnT'HE)!&@K\/XHAaKsWuKmQ4j:oo5RJn;JN<H;SuJMbF-,H08Wkp;DO%bu".bA3SXq5hIN@rcZu[TRSPCU?;Z=%R;&Bp7,`jUmfI"R]!tGfXc\(9XrICbF>IBpO/ci-d`91nCDM8Us,`0Ahp/`1(Q/ClphN!IW6hi(#58d3dDrAhHchWLgRp:e_'mX;etm`Q!eWke;Bg\hPK&NRpoMC8Vs(_1LBnI`mcrKSEH#GP!:>R8Kb(MTI9:c7%,L;q6lW4h+sROL)ai+I$6o!WLMnEgqA/l?1bl7=-,T[rj\!^%"=Ba^ohi#U/UQ8;Z1F&&tRkN(>lFg$,.ZW\pT[YnSb55OC#$WqSNV0H9Frf%>(pbKIpRnI\XV,U5;;+TZ2]p3VM2I@XB??!nF1@'8Kb7)s(?cC-eb/[?92ft&YKe=1)B")m$<^O,RZ/ri`HrZUNJV$h5'e&S=1;<RSggcmaln<c7?rpL'bEG<i9(7#S'M.PAI-\>5'D-:=cJ&+[>gBR7/:U/'T+G749)AVUH#4mp:JY/+A][,NB@^\2\ZMnb-:\"QSnXkWHj)>)/+04aRG'.WOOLEgmd6"?Op^\EhD3F~>endstream
endobj
15 0 obj
<<
/Contents 30 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 20 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1461
>>
stream
Gau`S@;jmY&H/b=EA7+&.;G<I.$Da<Cb+5@"bJ?q]mZj^<0:m!M_&SJS2glGhfk;q8P[^4)2^"(Cl,ZKpNSg6k:iS(@c_74#'`:bnL4R[@CcFcLk+_-]U_*53J:&.KEoHGeFbg5hmIrq0:`5.8Yj[\#+@$9PlRKqdG!3f0i'6q+?-NLi@lBH;PaO.brhueK7'"VcEX`!Ss96Qr0j7doR%iuG"Arc,8`nSH;b9Q.gT^XnmK%`iJ6=iGRs8kV:gO&1l^Jg+ueJ\J/RMWIX)HBbdE;VbiD8Jr=c%]Ck3(pn0mg3TajB7bU1TsH-cP^#KnM%J9O7B@MebeP1S2Gi=_b=(VB,I7[Yp77Ep&,C>0p;HV1f'lTVBjTiBS!AhA1ZVDb\bC<f'W.]DX8k^?.g1i(=e"C',DW;YsXMAP!<B*HR0YC[YsbmHeF2mL8V_T[1W[U?JE'fr]J'B;g)[E`]7dp@dSasguF^8`D"T*k)2RDg*;<-/Vp[lrjdR$,DZOb,_PZcge0J1s\U"_;<eDdWX=+$]E&5`5-j8cXCrSnO2F/sN<0!M]BE%+sKL:R\MI@XaMA6q(oGo<m6c#)XOZJ*P#2ReTL`V:2N%E2Uai4(O4F7GHh3bDLKtGR9)W'mMaPaipY:O0Si=Y1(61/qpo$:=LL^HK$+?AIEp8;lnF.3O$5UK<[Yj"5'i3rAB!5,gO/_:Sul3?M#L6T*V,JY7pd%4[gna/&O#hHobAS7(Q"FfWPOj/l=7a\i\T'D%bPiLSZHFEP?'QgQbKq8',dpe2P#[28EsF]qsKugH;I,'=*FWq.uG7j9.4Nc!`Aq@)lnM4Zh>H>K"-[ATU'ZQn"Bkd/`/&9u)tle7!q1A#kYdd:,]]iMFF$58?HgDC+--d^@2KV)][n3!0l2QGGkTEZ/'eDRG<u>E&(JSM+CgAD,V$+iS%pQ7@m'N#Ni4fB,a?/^YmDGN7UJ'(5XP`Z[2/)!r.Fg1D5P)TR<'1lhN/CE33dg4I_\ephKUS0J<;Q.\[no's;n:#c^!H+JaHcf7!r*7'6])"]oqpd&/.!-T,(=#Ea)MM4mK<A+b!Wh@(N=rE^Imbp-IQ!nPG_)C^0KUqqlY[8(S%($V#g$i.I$1M[M6j\NdYh=C0en-[>#J8C@,JK(E]c..0,)'j/#:Ij)<s2j70!#ffOc-/r1atn\Bfq1Dj[]kV5&R.bb%fq:nV[")\SoMjAfGs;CpG0?URMkaAUNC#9=(WTFWG##V"V7gTgb<DiWu^2c/dGJnm*?$LL+5\P`rW"c!k_jASe?*J#Epngc]?<A\9lF8L^ahCQfiYPI\eTE_Tm_*jP(?)l3DBF8&@`DYT:[#(#RlZg0M.Nd<GkS9pke4.72_nElV<IYPks\>Ru1WE2+R_<K(QBADCrPr\-*C]?d!RO^0?RXjkdb+`q<2l6kTGk>jmCmC\?nSaB>cMcp>IdtYu%F.0kn8]E~>endstream
endobj
16 0 obj
<<
/Contents 31 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 20 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1117
>>
stream
GasJRD3(GM&BE]".AhC0Sf2)X5I'$M[CnK`8Z02&RbfROGR6s?GY#Z]9=;od58slim:lqU"QT=&h_Tm4"L($[qjeE$^TJ_^&Khe=>9F>/=FZ"]fA=7`U4Q"W!JLl9&Hrl&mK<.-.tJ'R+rV%i=<]%/0L_($OTK:bUa-T<'XmHm!_<YL'a(6;(J=VO5"(!#l^AtL7.epAf;G.O#`2lYQ._]DAnR3S;$/[d#SSgNX:+M^IK&d<rht!SPO,>"LVHQS-@5hLV%S7Q!5G@;e%@`;oaS#&Jb;+f?ijmZ,9AUc%K2YPeR;DB!VE=7=fER75lS,f]MJauV/_A)+dh!IH\c&B#ofVtg4e77aKmTiPhY^6$BId3Km+BW4f5G>*/B7g#_X(]dh-_jPB^T7-q-fYg7j<VAp$QqT,jG"d7kMn$mQNFhW,_D;Q7cJ4MpUO/+N*W-FYpdf%tj\c1j*bp0Lrrmc[OiX;F?Bc!mLFWgG%`64kMC!6#d0CaHT]A]:@C%6VN\231b/_\on*<P[VW+O?X2NAc+Qe*BGAi=Vmt[lM%^Q'GKPa)Ws9bOf=s;Lcr7g142D99fSK8A.jqV)%;8Wf)_XUp:NSZntKrGrj+aXK=V*IUa.k2Z0jZOIfVZRrk]l\H1Oa=!k.7QAJfR\B*?4:LjEM`\Xs#;5B*b^d6S`BRZJVTaF4dF?7^V2@?#./Nh_uA5.CE%,'bY)H1;1%aGT(Nc/<##a#BcHkDN@A`Md>\U<4crh_L#]:"R'k(j;gY!<4n8b\R?MZ%?)hop&6crTidhZ2=F@fH\RZ"po";XD_=lq8:<B"-h2;lAb[QPT8&Q&#ue?cC:ti3(F0#t_:hk*%FGqaI2SbAYR5"3"uRO/@NH;CrsHVK.N`'J`K:G>G)8A)E+h4lroM9!`oFEm&r9ZGj_f><+I,aj]ieYU;5u(e5d7C?fJW;]P&9jddQ^iIiA;+f-FI/oZB/Z(cE:F:G7ZRSS'UD<lJU2\:QD(8:%'Y>/Jg%hmgdck@^KMfmm/Q#3gD)l7D4p]!#F!5*)R6NCWrI@f-j"l<U0ReZ#;p$8o.30A@F]<-)$H?<@L_+k$*rE8U)Iq;DCVE)%jgV5);M1>Ch#'f#+T.Ll^~>endstream
endobj
17 0 obj
<<
/Contents 32 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 20 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1872
>>
stream
Gb!#\gN)%,&:N/3D#KHXdg-"?&--"ZSYh5kSu-3X<V$jrJJKD_(.k_Uji$3L^NW8,(X''d[khnRNHkWOT"SNO-jCAMXST\j!FF&[HHLbXR'2#H,%1Bc?I),kNX1tV#oADmWT.t@Sl>VS[N6aQ8g6Fd1!il3XTSpSLt8.%Nq8KE$8M^ak9C1!8ZK,tU7!O>]JJFgP&iH3Lb#=25C^^LQh3BaGO1E'rC&C[_0/S]W/`!b\]TVO%-)QHHoQa;G&?g3-Yjt%]u\Fg;ZR9O(&W"TYKWi"Chg7CQs[Z,H"ioV.U5SN8#Y18DbY,u+S/g1?i>,7p`Ol*mkK\/MW>4(mSs`Mit5^aGnM@O*pZ@`&K5(K$$YpR#Ot>5<CaO3(QF*Fji$RfRfZ0[TW3K32e//Kp7>Z^GY3i#WkIR>#pl8KB<iT.0kfu+98^t_1h&jeh0VgW0\Y2`NbCp0_Ma^q1V`U[4'dk1NN,l+5BXuDVZON2A1>p<U?L^_,9CK&K&bg"1gHmD@%/*;7\ND2KC?OGlZSlJ`5C&=?5TRu/)V=brbmKt(q>,sAn*gAN5$@PP)<'f.h3)KEm%jqg7nC@=^5g-AJ*W!51m`Bg+6QhY9C;N"?26+\/m=S*5[tF]+2'P8RB3Q916p05]2Gl1]IPhX]LF##u,5>R`lS'6Z+oC3/Y#Rpd'f[gr<^s;/V,>R7DoE6h/%-j18Q,^("(6?nngT3"(`h0=!97%u6'i/s3<smdQkY&V_SfQS:LPnjm4S7<lHbJC>!*6FUV.Q@o:_Ai",1_=q&0KFn$T,+Th7OQlt_7A(U8lN%q3=0:C$ji-1dE4Lm>NnX4_=H&/S4.I6B1nbCp9\p2:FsJMt%jmH\>j%V8OI7Q+=TXNO!&QTuNX*@>&74AMp@J3Q+.LqLT)))9\XN#?TgVaM"SG/9;qG"b\kEWt@9O<\4*M2;)4b](_Bo@@PpEN1`N>O.)fmmK/dl86^eBW#=4s'\P96Q=\X?_V``W$"^i!!li8S\]dcK,;eNT`Nbl..S"LBR;K=h>q?-W(gp%%^"ZJ&b0/'O>h&t)`#l,8-oRft-kb\iW["RsN>RdB6c4]uFse\n:9M'Ir3%?%7f&mX%8:7oHi2)'cu>1%cXa&l*Y$"g!oHZM<O/dIIdp2fKda0@tr#9o0TrjK&8MQC/YZ>beLU5DPaf>jHRFJt9aD"h9c,qS4b>8bL"8cZmHW:0EcruG_uG&3j0^V'WEoa2P'lXCr+Z`H*plsg-6"a4\:V"[r-!7.7QES:rm/r7Lm'1lmOgOk]V-Ld3nJSW/8E+*^\0_%*Be+@1dZ@e.miOgsp4N6/5e7Gj_Qa1cnBs>oAa)^t"YbGZ]Tlqh1j];\+mC!*<eFbsOW6@m"do2LnQ2'LlS&+lBR%*.PUV=iNJ28a5c6TM52p)T%dRq+@p0FG]YJK7[@jtTI2.k*R_3DNt,RP?simue7qKi`4]++`Ord]2p7cYa`9jfWuZ2f7cnA>;O]CGj`?HX7kYs+S&SZPDopVt3"p"'BTCD1e?]KgI<b/=,Xhb\)PR;\Xu8,N!Y'Q-a#eO$jQ1d-!T3,hseT'QJC?j],W->E.]pHUDPrH,m>Ccsfr./m$a_e50MRd*>PEuF+E',fH"5q1S"+7PKCVt77$ok6Q'>>/(oXrp14V=+.;3B%n08u&PBZW@[fp(MVGJ)6FP=IGf!,f%+[.OrnNr@eg$PFq`$G/s1N4U1;&_'C=i$%D>t_GIQt"9.\Bo$Sl>q]k"qSZ&p:e>"ses.VdI!nK%GeR!E-r5"gZTKiOlX2Vpo#a;,GM;=\A'V8*?62F^$s/T%GUq8kgrha^[h`j>"V^R0"/DY?7mWIGB`29Kq`R]d*Dm2UbI_k<922qM9<-?RM~>endstream
endobj
18 0 obj
<<
/PageMode /UseNone /Pages 20 0 R /Type /Catalog
>>
endobj
19 0 obj
<<
/Author (\(anonymous\)) /CreationDate (D:20260311071405+01'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260311071405+01'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (\(anonymous\)) /Trapped /False
>>
endobj
20 0 obj
<<
/Count 12 /Kids [ 5 0 R 6 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R 14 0 R 15 0 R
16 0 R 17 0 R ] /Type /Pages
>>
endobj
21 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1904
/Filter [ /ASCII85Decode /FlateDecode ] /Length 596
>>
stream
Gat=,a`?-*&A@ZcqVi4V:nsGp@+-E5/+Q`$(6`<2--cMo7heL1!^P2b+lAk4llZ<P:2(s"Dn=i!hfLfqJDqBgJ%G`sRg#=sA\^8VmXYZg@.=Q+(6ccF/!5QT1kTj'3@?l<Cg8m/la'MngE.e2=9^^,+InofB0^9N$]L7M-Q&#s/C"Z+"A"(G[hK!fKEN-i6kdd0^g[Jr:GN+P!q(6']=j2Os!93SY]p=a>o_;,l_S3\`rD_Z$>LJe!;1F@C:Hu4ZR]d/U>5jG$mA)HB20HDT'KpYKKs-g/\bq/P;[MECPV.pRonIM:7a9qm(-T4rGhC;.G%l3RBuN3,gsrQot>S_K"seU#Qsh(,BjJY?<G-&\?ZC((AA\$/^%n3"h;g2-.Jskarm3'8EE=CX8M!j>c@YsPu%=TocgE+\LK?9BE]jbd%%3G&+K6,KTd3->b15;fUBp)baWGl,6K"nAh6o1>O9]*,*?jEC-ian&_Nm^XVQ)Jk$7Pc8S^ie9IO-EF?>B,/Yr_bWWc##K`dcn-#8lsFY[&\Y`Z.X=ig*A4S)8q-%b@rMT(R,fU&!g;9cpsP!DWAb@S!N[PCEq8.+*W(uiE/gj5Hl$tkZ61'lA7]Gl/0_\L6bCfA@\!sbM&51]_=$[<]4n2]3617>s`-@;/r06$0&1<eYhBgijc95!bjp-XDKc[U2?PqNYC,%n=\`K+-Hh8G5XSAN/5r.Bc-]:@2="f`;d2kY8`$XtjV[&0'[f6!dr5C7@7%%,Gn!O$U\<'kAZTR@Yd>?DrVOqooPV@?k2IDdMmJ&\=&N-aR2D^:Z&5F-4\WG#^$<EbsMKI`IlV"@kOBd5JK_q;'1s"6+OAD0@OnfBbJ7q#Er7Q1]nZPna(6N=l\#%!*X$fTjiQg(uGn1/#[4"gd#5*tbh-OP$'U8M@0Z9<H%-TMgFKRX8/hVMK(L7\eV,O\:SH0-As<(?eO@-"J_4fTio+7$:99:id52n"SRTcZ9FfK4=]U_DZM#GZ'8nJ%hs!(ar^NY!W/A\Z&lcCfSLgP9i(-7]4<\P(@aCr7Rm:#:0p]Xe%?l8'+^1"MN'XcnA*i8t'@d$)[-\*]o_%f/]nfh@3e*tpa_<4=E$=uat?)a;$+&028R\IMgAb"s*jSssEJ5WcGh$eU%>3)XmmD%_ga<<Cl$r2EA7XFm9S3Np_QbCEZZJTnQ>.ftZr%p#s60.MQ@eItFZXH%+1+Ob:;/'X-G;qs2dZPpR#6_/EZ-2KTe@I0ae,A[oeT)4UTS.tYV@Vo=!*9I4"=EE%BK;,hWgUn%Q>cbOHT\lXY5Ne6Z;4i%#<X)iu]t<QS'YPG'oZ2CRFPJP9Tt5(AVlV@lEW=EF">MT_XG5`9duW"37@9+'YE856>4/G"W5#5m6]IME8>gQ_=,!-eC_pGD(^JuQ=FtsNQ<toL&6<g9_R]5XR1EtO@#N)uf5_iM@o_NkS\;L5'Ah1-\)h^fr3/`k^_r&@l1ZoAV5(TegttX$5]]A'gs0neN*(p`*sFECf(,Q*1G^ogNH$E!NcLh>Nml"XPdl&#]RY3--k%Ksc?!%LIsJ*0a%2Ij`^j6d.)cIi'%We!HS[nFFM<gAJYAhc<dG\EV&."t7sL:QobItTX9P%U06BZcPj?=kBSFTf&Jc\Z$h""2PQWB&%jPVlY*O(_HgpO$@u+*X2KOOMJbk$EQ5?]:E0V]2HF:;D13ac*_LX;jS-C;<F2Nn#C[DVXN2*AJ\^Nd.*3\QDDcC([:F(*>OZYEMWQs*5ELLl927^/P2mM_pG3jsQg#6<s'L[_-BF+*&HsVNI=1f`.MF2g>49eO,,"'LZ?W?`.2X7X]9!#=\&AbSN>!N4FeM2&)`>e/W%'!Ym"eiKq>Xq<aEe83ha2%AmQOiRL>0GEDLnaJ&D1;JWh$RQ\0;i'+p]~>endstream
endobj
22 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 395
>>
stream
GarVJb>,r/&A7ljjp75+I`LS?&PlER6H"^R<Ojd2"Sr\EO)9j+<n/\)G%Po!Zcg0OnFW?SJ:<L$3t<l>:VdcGW!Bi7aZ&0]B`s\j#ZODoX/ueAM2ed3OZ&#KJuT[<3jcF'akC7Y,:k\XP!$XY&L%_ki;Wp!W>3_T?+\j]UL'\_*D)3a`X0\lnn.:0>E<4E2#&!8(@Cm=R8fJm?0PU;h)*utQnR1\rg`37.==cTXg:\^:rfrN,.rMCj7%@jW5_UgbHUiLgu'aa`H]<o;J:60ZN:BN.D7XmBIkZ*Tqu4JL*Bod9TN'kCn":kpIuBHL07=fL?`/DZN0KBTAsES79O@Gf/E+;kUVU8MofU8q1fLrSmU=rn^,PYAhrhd$kC`@+SN5OndASRMY[~>endstream
endobj
23 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1962
>>
stream
Gat=,gN)%,&:N_CCo<I7`Jl<s!cNPP`+bZ$P=b+CD-lc7PE81h,&*.E@t/oN_2B^=ZK$n,OMG<A#D[Xn3&(8Mo5Cu?31n(_D[tQRkmY)+"\_.sql+^RnReU6fFuSN^^Gk@?/J(.b8,Zli2c6)^2Q*bTb@d?U$#Hg#uk,5_XhTq`An,O%KbDZ*0LT"eaqSiK-8g,"[lBMn3YlBbR[:SSb'B4EZTt^=n=#cWc#.\#&S2^WRYh9c*4<-[bWL?&0J&e/\'q/ZUgFjY\#9($iTRjL,qGP0[tAkcqoMh/U&Uah8]53%AW7RgIi6.8(um)<L_u*9U@Fr+gn@<S-P&pn/s"%&'@>fa`%%q1I-8*8+%$=o7\'uAEKfQ0`"F.=\2mJ%?F']2sO.=TMu+m^+N<[.ep)o<;*VN6K^uV<NsJ'RAL>CU1P2$>+'u,fj(YU>ZE\0<3XHoXBqd0p2Ga4Zi):&erXF@Su+ug75f`i6*-nVcn><#.TgPn$9+G%=f*s$LT3^P\.65pAD!SK5)HH,H@\#kVh^l))&EJ:Q9mE'_ms9hTG?D:^"VS1Uo\0keeg"C"S=_WRlfEu6@=+'%g5?(VnEMP^Dj[-W#u%OaRRR"6<-,-L1E*5;iWa<PuO%:l0TgS<^iUWVp3i"gLWi)MK`#(X1OX/oe+=DqR`\<<BD5%6IEi6&lig._@O2`WrGqWfY8a=H`$OlG:Ljq[E<ZZPtKs,TF^bIRr%!-o?P3"4_NH)*<59=q1<]Rj1Lpi0<2$3)irH1P3F/DX0W+BCuF9/EU+R7hrBhm\3))T<&)\?1+>L)`Udu-W>B($4dH]`B!XsSCUL)O*,l;"53h>N`rBP#3C$MF,Lj6H&:ZkS8r2l;04>OCcs<6gahrFMjY9mJ3GoMZJ6#XBZpWV\`$_E-8g]6C99l%ga6qI0-`i(D/"%nAUr*arfr(o[6JH#[<15f$Jous^FjfL&9RoJtX#$g^=Aa<N.`$CYefM?X15C.`E*T;F:#BPKSru%Qmo1\U4gA;V)?!H'j6E=7jZ#PTJ(Rc3DhT:Bd\1B6?",u@cJN=^.n-6)4FVf0g:rYi;H2jBkVP(5WPLJgK(VP;2GJ)/Z)m">,&Jl:A>a4NcLh:$/Q9G35j>M+5EO3u5[U.#ZD^B%L_R=3Ofjm-:=[&-l5-]`[_Acr%Jg4'q&Be!*2=_00U>-_4s@5P"<1]j^8YEEG/?;EQsbkE_nk!XqF/nnd1>]DF\gAiHMQZK8l<+/YNK5F[!$USg?:<DHBSgLqD6K5/+8E/lt3P+1>cc%hmhgUBkr$\.4'A[^Int+!![fNFtfWX!M=6@?mkX?K7tWO^<6QC?5ng?'X!FOo`]/ERe7HiQ5hWtq6#NlNF=p&PMiASG[=a-UK/L*?\"nPi9VH%Bt*86:_QD;\j6_ml:;(t64XGR+-`TKaZ>I:MJoUuVQ#2?hOs%Fl7Jbf.>XC\P2=^iIe)dN41S-j]o.Q]Bh<M]i4[kH-Ui?WX\GG>(BUAMaB3!,rtLJu$=Enl:*?lL@0mmC#g3M(&*THZ5@B]%C!-fkl)G%"l=seg*4d0!P>lk4F(M`m[e6IKHsI;"fuEmnB*X;JDV_A1cCbN:X&ZH1@Jd6$duMqS[d'.=htF(QBuKkMOD)i-O]o(mYRbI8-iH1CXSl]>/lnip>%9FcqghM."QWmc/(KCIW6OXMKP6LLDPYd)?h&P$<u%"&ndREok78C!)b^cb3I:j*=5(C'2H^,jRF[Aq[MnjQ7tZDrL!1W.73gu;^MDn+hVX?BZ92J'\2qRq':HV=C2Tn'G(J;*WWRZeG<$pHDNmcRJVcJT^.@qaj[EIW3k@fUc/oY,U^[Z6krd:r`RJp._P9_9;!"]pg8Os<a"+B!j$;rE^/GA@GO`+1PJ%,g&2nM\_[4'/s)r7OYaP=e%&t)8cr&RS\>&k`l#-tBT>1;J!WV5%nt8*`-8-\AJ:pK)'3P8:b;i*W~>endstream
endobj
24 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1741
>>
stream
Gatm;D/\/e&H8h>E<oCV/LjqgWOH9fcu(Gh+m>*7BYX>#/CCa9>')/R:,;1Nmmp*Wjd3IZ$3QT=8)?E':/UNM8*tf7!-g__iC=7)L[bd$,7MRnn6t\=41*ZY`afe[5(j4e1l)2qjq&;`5/%ZeO'"Yu,_!U,L+8_9@<cVIYV7=gJ2@c>/n,HI^>Z<;gX%C+i],et).ZLO#SRhr?Bgh`/M3\BTeo?6P89.H?(J9]K!MfmiAA\<MRSl5D3\ZBiksSY$a+al._<fk40pm0(\:!eXm==DAmH49\8`P;>MgSW#TD[^"UtAO^Ulu+"Pj8hdYG,!FigP\\:^bcXa0RX`j[XNA#.m"$UO-CR)Xsh_,5XuFSu$&K!Yp5LY,uRIUnOB9-RldTN9`">qUmVI?H*TFT'hoG>s!@)8_R+,WsuMq"MB;4MY>KL5fr;O.Lp^fq0a%n-=_#&1D>83@H=6X;-?J$6IV&DE5qOi.)LCmtBUVXA`uX-#S"j)CC*:Fo,C1T`D5BYMk&53h)JFPm4d8c*Xa`0Ete;EEK),=f%Fr75uE?cl+*DM>s5&OXjc:]>#AP8hM(\)hDm0c/gF1]]?:Ll^A2Uc?n7Q0tQ6*Pc'-nl1k!Jlc-Z^UJ96B,Fboe7u&ZA[pI6(YC8Qk,m`1blCr]4hmgP-'c8b:R9V:fV:/C0=ma4TJP=?>W-6AGniWr"Xp9-cp^N\@\Mg-YAE==%5+q':kl.kr,,!3(Y6RA5,W*M_f[ltNR$QDFe#cHPaoR>tWH,/sWRP*(cJ(_HT4-&G=l%Vp+ClXN]$t!#`QbF,m]NAt(H)L%ma107%)fm=_m:ao')`6'?TG^?^dK_,6.tr,A8kt9W%YBHNs'<e.@t:'m+@YfA+'TeK$!?M2T?=e=aEnjI`!4d>5#Z$C<Eg$6)RXt98[ALkFu3BQ(991fU\/oK/7P[#jeO.jV+8T/ZkCjD<2#rTQu>oAmc=\LHHe4ZZAmWM<P7dq#1IIk7u&8h7&1cUW<sbeg)C_$9&'m132%`U5KDu!G<gS1r>7,d:?"YUmnAiU[Ses,LhJ?g][-Xo'8FTfP=H3gGFuI,UiFeXie7SQ#;KA<2l@tZ[](9O*W5.6bBrb(R?7>Fa`meUFn^+9;b3QC^HR;Op]-5/s]CLc;i``m9hCc37^c7gZk$T3j%tjM/mYe]D[8=]]_&_>J:ntr;S]Y4s>rli%Ro!Yq@bd16LS+X3^N\+)<CpFHRn'pD?T3+H438QZ>"CCb@NpUcf_e,\U*DVOoPsle>&Mol6$e)@!HlSH5EJ%Di7?TbkZVe!(bV2NNU1VFtbIh(>d"bp8=TZJs"ZD-/EfKtEqC]"bKj!lp+N8tTAGo6S&qT&t(\er,G]Zk^=\lZ:T+57XZh:'LmJE)\9M6>q4P7JbY,KmRjbRh!!6$2:rFQT^6*a[\9qC"]75+'mGF4RE_mK(g"SY84N]d-ZCu?.HNV4h4Lof/R)Dp;@]+]"SDlGq4&ScrdF<Scpol(/AJ(pS`8uEi#(R]:nE$XS;Z#kB_8;F%^e?Z>Wo&N-[<BR/2ZH"`Xh;0Zf@NhX;&@>ZEf1>uC78F)3/fEiUj.NIJ-9Z08XHHIs'0\*2`44?Lu^^[dfPp"\=nVb4+-XpFsIiE<;n08B2gMT"Zjs31/Z[,H>GrA?BCo=<n(+)ZbZ,kPOg$l_fhjWA_<TR6X>*V:RG4Sq9X54#HA>9gY2mOm%;ir/Q;1OP>ha0,k")re9=p&j'c"O;LEhU&)~>endstream
endobj
25 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1879
>>
stream
Gatm<lYkN9&HD15iXi2APLd*Ie0A0UFBseWbIV:Cg3rIGaq?;,Q7,7tdM>.KpDp5gc,?e"K`TYMh&UuhpES!2)#,i9GE`4-5(W5S'2/c\F"eWo^uPi/:'NWZZX)hl`-*^?gqY'[odF\s&BAuHr(/H_F/TBjYQ>&@Pf\Fd*8Hhj*7lL$ig9`aG'r;[QCMqWUDZ"IkPP7imm&_n4)R;G_sd`<[i=p4&t!8B5VLBggJtqmIKX5a45$9,erLY`BuX=Z1dLqW[F#lD2KBMj)Cu*a1W2_2n>$CP4GT])F,Ad@LZ9Cu3(I[5I$2D:h;nB9Y[E?m_<W:XX"[uFYUZr[!`<pV:LWf#->-6#oemoe(@b*`O?V;Xn'Z[aAtPDJD7%*F`f4=c&?)@KnfYiMN5jgk23p-5;16hcgT$cQJ2i+ldl>P7kAN710E?NX(,UnK3#^3V6[d)[L4:mZZuA<7!Fm+63=:8DG5.)_\#b6!7D=pMMKZ^t22(3JOo%o=MF!K'\E!d;&Z<bCPe\StA^(CsBuqQ8==<"jp*WPHQ%#/3Vl09"92pZ;RR\Q5&;IhKfEsJb0.WT7-DJJcju9;i3M3(0[\":CSFQe4&ILu;K5A']<l<bt1A-9KrasM#W2&`;md?``rV[lRO;CU+-O+S,phpCSTrt_ql_03lr\OrZM]b.ejInsWSJYsp>Dc0."_2-!Y1m`hI5E4H%Z*X4mkA"HG[%CgL%3^(q6h\D9N_t%4dBE#cM73D9/`;qko!<cO-l6_oj&M@(V.gk,RTDg*N,_kMaGMcalch4>1+fO;.*V6]i&P?o&h!KBpmH[Y]UE$GE<&'WC_@X.X9M)aKY3O:`^s1?O0\H_\ZKp3g=/tY)Q#69i(F:?KX+FDA2ZCC/i?+2D55t>H+6Z/?U4P5qoD*r0b"Y[WV@GWSJ]bdeZa^&\:A?HM[5!cT/`8SM=Zu(g93KaU)[XiHgG1;&$[",*jekLQ4aXmC?gL9X^qbH0pFhM=e4b_ZUY;IdSZ_De`=0[,C\Bmt`fAD#,A-Hld<e6RZ!&AJI=m=YJ>dG1[.C#:DYQVq-G2h6kI/ar-!hWQ)7u:>-E8B87M[56Qrs6Q6[3\\tP9`K9Z8bHLZr0?s?oPV6HBZMDJqa0G:"pnp48ehmC"n_7ZQlo!V.nI]3t\m]E&CUMWP]3m8KrJ,8AlU]NJ$&b%+_dRId-F#XDO!%-Fp;e<#["@b>9Eeurno-I'H12Y'C(kFliGCPK)dfnS(VSS1RJj;EU-`dm/?Gj1@EpK#Am#`1>%bt@o-+oC)_?o9a"/9[an2u0);erue]?98Q%XA</0(eWEg<nlD&=Y4/DYS'CrL4!m5gVB?c4?c[-;kP`Md6k3\.N27!$eI`d6N!-0%bDj(sY&gV(U,qV@seOtuqrU)cA:.b'sM.$D"-C*snZM-0!#dkI43SX/U+;V'0E0#i#WRm_WT,i]r0,>WJA51B@lU:l`dn4N/g?d'!#'o?0+i\cjB6YGGMRFId<SZNi$R@\RMD<3ORiA-T$CG'rh@gS=/#\P"W<HDPBZ9fU2eMD#BcZ!Ff]^AV(X7'34@WG$fL,s,G<,Ijof#a^c;7FZ/_BMt\B<\-`L';ra"$UtHGl6Jf=EIFG#rN!M8j1;LMHCU+)p4Djc4P4<`[6FO,Lln$%I3g+ZET=ADYHSDs2;2ar**U047Q.$Bg&tJ?S#=/5/T9oNm!F!;nglen/CZe'piF8[&A9I;BYI1Q7eMK43+Xai^Eo2>uo=J&\e33QtCl3;BB9ZgP*gI0$G/rAa"aX\lPHsbY<(po`$]Ya$_V0+:^_/&M7bUJ9gTAm\8$NLnXg^OoIdRiM2!r_f_M>9DNsRC=P9C]`/XO(RPrbU+"a3[uJ4G__rA0&+g<D\G~>endstream
endobj
26 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1670
>>
stream
Gau`SCN%rc'`G1AEEf)d'6H&[Oa;6hL3Dl-?-t^8Yl^Eh6'3!gM(C]NS?s1-hfhXT/6Qt_[MT2nECbtRLZb7MF2`[hLRI&I$K1^g`\/2`)eS9K38lQ<$SQ,CQ,W#9?(X*ZD1`dH_Ls:URmjjUgA!&#D3#&/,d7B21%L$`=WFoQ/FL);#b7ZOikQq5C[2`'d;#6bchID*QpYDl"#h>DV-]hh2KKoa!FnCqD)BS<T5"mPB/%n[OBV<cm0qf?UYE[1$h<3)ZiO6Xkujh*>$C+0aG^&U9au5i%rS=eM-j2:o*ooR-:Al%[XuoIfs<+e0LsjTg%5D2W(e]gnERt$A9KD#$#>g'7khQ*fs-Q[H<2;<S+t2<F<^-XG=B,mF^M/[5]-!J_XU8/J[pi>D_im6BH42,plgXoZsrrG')si72/Z;-4f!:2&L\P=\9kL7ZsCH3!ht5@76hRt,>kI\;=hmG0R=sP&V_S_AI7\,ba$?/3m>BIdeB[uN4.)[W4*p?0H]NfKP>2b0BPc$._-%I6=unA+CuMBDYD"UZ>c'Cd8CIK@:C0^7b*XjWuSq'4:\eH)8m05<>s%C$c<_7W&u[AJ9@67.p:#b*%%5fR!%[&8@PXBiJ;[Ub'J(T(O0g8StZ(&)3kc0akFmrk#]q&0g*h'gO\\T>od#$9L$rDR!#LRoLAeE2DI?q\^PAh3`oq*R)0o"_@f$Q6Y8KD=Zj2+#oq8,k_-`?6uHSqb`m]2`#ir[@g\5J_O-)hDN1E8o:U5TP;QW,G=j2<=WU2(Z`^+kJY[cg/hSm3Gu4WT5<%$)<[p=t16!CCW5[udrE9[G5;_b6jl>bb=d5Bm:PGX.>(505kF4"P'+$TQ^FT\5]QPgSo2rF&Dk3fSL!6.*9&krZL8`Wi\inlE?X^Pl5jn@]%7,VirQ8m=lVm1NeZ@`>/n^gG%P*7S0(>`1Aj7C0')-\7XPjcglOtN43XerN`8(hJnK8KIB/W=ad8aRC8o^>(:X&O.0N:egKdB5QRNG66j*'sBH&J-p6<AT"^2SMPBe<^$@(aI(D*qnK;*3^CIq.MUI:`A1\MOOus*5*-fhAmVI_4,$3I6GEK+&9Qb)4X**E>4\rpGb\/t1``^!TWh;0Wa$rD45759?]>#s*0U9c@jMIjfTANM4$rFM40hKe0.3pAE**4NI?CNt12Yh=TJQ@FgdL6f;*NZuE;RnRr<*4eH3?b"\HFZ#IhrX2GV<\#DdBr>K*J'43>T$@4A9n)W[&K.PS%+A"0mQ-Dg2_%[s#7oD+g<BfYA4e=Qk<AUD<lV/qk[E;sH4mqY+l,1fb%$[6UIjjI;%W.\3o:s3tFWC+7,2ms4grOT1Oel;ka&BdCO71sh5U_S7b2E;&:*-8GII2A1Y$3'=qji*4Vlc&Rh,[)!40=V&g\AX%e6d&C,kOCI-E;]H?RoYj)%m(nXJbZ&Gcpoe%AiHIE)?9re93P5fEY:4q_fe?@?0Mu:I!?InV@(i02!0g:'U_J?\ML,Zs/9OA\"Cka/Os5FK(.<i_W6/>nFWKho8FL/6=b62CQ/]\Q'SY$.C6BXR1(H'3XubkUFuS<S#mUeC9FVY>V`U2'e\8eNOP)":O9g:n1oTY&;2BE'heg[siII.gln%38Gk-V64C[9B<_Z^Rr;W[?1/1U/X99%8k(f\/fBnr<lX@a0b~>endstream
endobj
27 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1595
>>
stream
Gat=+lYkN9&HAoJib"j^'/VNp;_J[#OKRu6+ipE5dK.NT0JXY!OX45+qH/jZI7NR2.>m:H&/(C$o'U_j'*F+&1]P?=^q2%S4u-M(9]s2Ni@mEG%o[7\Z0J.NPHeoXi!,]*a)ga=7C_g?plj@=`uP@0YQKnJZ<Jia3*ofmgi\J6+H8^H$_M[HX`q9F90+;hn,&S3LX9cODEp<V]g1JWBc\K"@mL)(2fDrlC4nGYjL&./<[Fi@cj_qF&JeQ+%o:Xm>kQNE1mbVSk5/g.rLg%-FJoF'VK7T$R1AJhm;UBk.d#2+$nnN6kK)s-bm&sda7(N0PaoPbg#Wog-'rs4]n>R`k&U!^$[eH=bR_&gT&"U]Aq0c/:23/'_:R=/+#sHn'2RpKbd276<\+*+7]SA+o?lICm%;[l<68"7@2"oMi'%Oi_3j24]+qPES,IIK'a8\4U+4!H#c/FZ2,AB'_tW_/#mLYd6o't21)=-;"N6hGHO4+#a[B'c,#]V(_q95`'c>k4j-&`t!Rd6jdc;5_I@EK"/8o&'O4CL=p^iP-9\*AX[0MW?9H]"VCnsSt$m8Q3h=dNpHARZkfuNW8Aq+[Jb'+<VQ/8htOHo],$O+]f<P:aNWD%cqM8aI[93,E<G#p@!7mb-WX%'Fe!K0Lb8n;DA4*I.a&*qNP]%[?_Us-4c1:]#JY2CXtI@ojAaa=^X,"^_VKYb<@>i-R^gVm@WRN`!6Y]4!7*G,riAHA*PMluSD@FNfV-]J!`q"j.n#d]rZ#5EA@kB"jGV?Ij$L1uf$K6LFdFh#hlVHdOZ^-cXjppRLA?U`IU;]18Dj_8`u]\`O.Vbq[mDAhPKiaPU>9#T+Nb%q,VhMVoH&nrXu5M\#ab$<^B^7<T;q9Ia_3Sd\Ai4Na[1&:K=I:(*<hK*=*pNlFt[p:p&8g=bIpH%@?o.m-JSiBjf=jeIab&?R/bZ>W_Z?#rQg[L/`H6omKc+7=CfVV*%GEuTH[Ygi!T`uP.j-uCnaH]Rjh?CbFm;h('\;kmAoscf``kM&]"Q0DE]Nk+2?T6ARm&AT=,2^2b:oM%^:';`'h(W.26C876_`3DTG)K&V7BD1+\&\WEc(d]#CO24@TStkgPjcUPDO^61lFMm5&Oj-jLDBeh<\7Da.3MHJ5;1>XGGDBZ11mW>GjTP+*qO])D8!NC\(K5r\;>>u$'cP`<`ho:U^QQ](Og>Oh(5dR`3#;_Kg[#^g$!c?J,G9Bodd1jRc1Wf6oD<t9WKmaR:0M)TD'M6?HHa/dte-XY%H$[:CmC<P[hDhhU:?_(M28F898`=Cg@=OeERbmY:&DNM0A@:Jskifa/e70"4llDlkDN`4jp\^;%I2L,g=MtB?%X^,1/2C&g<qgc#0iZCQ@GG10b+_+`FY1]%<jEba)*Mi^m&joNs*V_BOosi3/=:6E/LG1lBaY`/?HRP;/o@2)$gB/]5C:%":tcPbekefEn!,A;Kh7<^`W;J#$lN!"NW1qOq1l#8<bkYC#5U@@kWUjk*=t%hQSqq@Pm-[;3!:3>;ed8X@o#Nfd)]GFe^u3C2+S'=]Hbn6T1pnl+ZBm-5FJdT`,pM_qPlk5pi6JChXBepg>&C2a~>endstream
endobj
28 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1594
>>
stream
Gb!ks>Ar7S'RnZ;3%.V=$"fX%86rND6^ouLLFc)!,6^!oJWUgSN@[(FSYdA&hfhUsHr4--!VS>U0[8?4+$Y3:4Cg_IA*u:D!PB>fi.M-k0Y@T:Lk+G5]GZ%)*ihd8&b,tK+c$;116acC,9dISr["(i68BZ<Ns45c-XQ3IS2Tt,&.g:qNC&AbLkGf<4X-\%4!S/J7B="M`+pkh9L;@hfZn?f6:PG(iYYj7TjNjqS[C%_CK8Khg0*/s=4ZTX=lLSg*).AkF^\L:/oU#\+!NB3_j*:JE#lem(QbSm%bhrjYYWEqpi$GNpVW?\+CTr1_0M/Sn6-crAh[;M1fjo9r!:2-CZFEJ%>[!#=;9L!Gd'DoD?'"T[V-[(LWCYYS-Xr,3^UH9hP*[JC-E``&`hlrFSs_j+_kI%pDY4sKHX2?+qAe5jL"<h?,o84[hQ+>Z(H'Q!uQKenMlA'MiYHQS3ZPN#)`u2lP)[s!3L<].,F=$=hXR@][J/H(UJCLleL"gNR])/;iR(mMoC(D<+Z-t@+/[qoLVp*@+79`;OkA)1-0+$TGD=HeG345L;:!KBrm8GUGA5#;GVBm-Mto[!H&nMGEF8J\F%'()DX3R%''hSem@h/#A%:DBEK>rTnUdAg5AB(i`gi99ja7.[`TtXcqGa3>%G\^UlJ6Oqf<Gb>VG]eV#"ah&:],U?2qMo_?dfnX_d&@RdEkj*<?jq=Jc:6<3"V\59qSI#`05iUX1s%fOhW>g[HQD=I*9AIQ&;kes4I&iXsR:.ImeXbSDe#4@MA6H=<$n7ibu_@8;\kNi6\dlO58.Q\D$sHp?=4.n^HKh&S6Ypo[S2Z?8e6X3$^ERWB*7)](4karh%=/-EP(!dBiZ]=ilrmhSA)--Gr.RGA:G0dG-:b\_Xj3/d.\CESQl)8oV]1lMPAA7f+-nk3hcA]7`S,.ff!\^E+(Br[(5Wa_LTD)<W.=tItK9YYg1;tp5dI=@f*%%,lFe^>/XWnNNGbWk<-b'*S9qVH=!>o1'9?f>_VBQZZiV>Au..G]Z#eIN^VCU<fVC6mX-;6O\rIsKPl#0kjCa%.G^NBRa1K`gpXUOBAe6Na1@e$Y=5KCAPM=kJshF`%RnFn7"r\o5:F<uQ!J0^:.:W8kf]P,35!\]`T44^Wh[bh#l1l"7=\NZtr")Db9mlq9:b(0P-G>"?g_C5jMlkK71&-3dEDE!X#K*+M9I73qRo/nKBo=`p+26d\0cA#261KWu'nXqE$B>JtB5f1$n>8WB,GN4\YJ-KakobWWo^>Ki-h&bJrZ[Ri&K9L_XLFZBZ=FLsI#n-sD\QVNc.,MQh1k`7a?'J\,MgjB@(^lo1>31##/Do8.U,;V0_8>Zo+m9a)%D3DEsV5*+0D+-CHou6r/Z;,EcNq%,qX`E5tnTEYcmc3,WHDNBS39o+.Id$fu\ilYMjJFH^T,$EZPoWFiNL:jt#$I(eCg&C6O\[F.SeS9,_d>7uD3L$_Mg[a>2#:fm=uBKk2pll:^hP3rV[[L8BLFPM3!(:c=G\"iM@FAP$#)5QP,.O-CS,RDH3*RB/s^3lj.:5X0mE?GjZ@]k9JdfMU8T$WX!^KGL(1eF!HC0!ir~>endstream
endobj
29 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1885
>>
stream
GatU4gN)%,&:N/3Cc%OiSOO;bOVFeEm5RkiUm&enXmm&H%$?W>M^2sKoHbFUHPa=dOEG=oRLt5-mb(n(/64fFpsI9'56c?sLAj[`F9BN]cqW&DnJCtAgpub7oh*t9#I\&km@(%m%5$Ad;,,(hn>C"<6dsILFUcqj);2*TFA1I*G>-al/ITTULp5p<6e`/.k"r+uF`ln-cDkf7he>0\Wt%"(k_d'ufMGXT?$BRfV%!\&W`E7aK!JFJW)G3^8$nO<D5GJF+?j&42;mahN2!pFo?Qt;qF,eYdaE8OLKV46<h7re38XE?k:EYL5)qq>)P:;e%3E(iXr4,Z=Vd&@TTF456^Vh]9o2YA@!i@B2aZ0+D38cGe^5C=6t5JpD7/tZqdQsne,W!(m!gk./I`U*F-JfYq`]p:QI(<Jr<BXOo1',K<ZDmH(t5m:i\\#crb`a8"rLSJ;dh*#V^=*3jX6OKnfd'*jtN\Q@S1\O7E>QdUC$d[iE$dk)QE4W[Vcl(.8?I'?,iu\WLQI%=pF/LNV.[o;F1*u_a?D;QmAUSDAJr1$47J6cRqG7:SLHk[J6>(+dp\JX@Nn9PgTu;7H3p#k3tOH9n5WNcWCC\'G_9(fo1BX>WqFSc,Q,cK3`B&*4MKRlSLehrB%)ih0>V'p'5[XS;lGN/O=F9&GQu\[)0kY8X"eZ/DFFYrDMbFM#Kb>@/&l[3WNb*!5HTO1V[Ja?A?6tP.ueb_Mee(TGtefKOj;mKV^+l7L&r)*.8:#l<<1fi#T(=`u\W(,Q67@Y<g9AVHG^7N`QQ&+X)5s/JW>YN_4@%d=*OhEQ$0PW4J[,[Yq8i%36+cV(QkT5$2^-<K0T8.@sF[hj+HqQ'7FD:\pi1,)r-oc0s)RVj)%DA3l[[X_K0da(XpF,W?,-FLj#'59I@c-$[Q0`T\$&3!/HI3Q]7B%A_BYUo#3W.DMkmB5g`Ea(p'C,d\]<aX!Usl*=04j@2?XH2a)IoQ5BMd$keJ,Y`@VaEnMiEbRAtR8Q7Z"elHPd7bIM0VknRB1RZYQcB,Z%0s"^8+uoGl-%!:,<FoJ&#n0_D+TX:NG-Yd1tg=1C8Un"\jotIcSG(@1H%)9"kS]DF9Co4&C39sO3-k28Z;)`Se=%5X)lg^Z@qs])MCQ7Q0uc"idtf7;L^!--\Q*rg212(m%$!-AhRXtp<TP$pER0\Nuc'`Qs6$'H!%2_1UA'I/6jtlX'PthWPtmu-IR'=+F2M>Y]*&T#jI9F1FGa*;8E\nIBBCg6B[;TPcJb/6pgn@r@dlqc[kdI&K[(=oH-h1`h%j[s&d//0gWnqQdHf1;*!H%o6$*VOAOdjV;.\ib"\M(@6_`lQhOi[\M+G`qtK<j)`drcUdTU:buq8:#F?6.j6kZ->NV1.!Qdi9'XSLunO=^uhY8Orh$rTo9eja%EA@@"3D6q=@I2K*@DS-YlL1d3YA2@h0U[XD-Z9)TFn\*.ZBhueU&&EjA5,;^hQ;+_<*JRp&QIFm,?sVYpWI&CU]EZ2!tdX5V&9#8B;:/*S18F7]3QiS0lXif1Yt0IrOY8DWS^X!<`!Mt@62nfNXjB*n1W%E8CS&>rSmO8KTr<mW!]fbW5GhMKf^hOkZc[OfjQNqSjiGjcDiu.pdbDDPYLFhMbmOX!D0:(L.7)i=\I[TlhD;%XHli\Mb^Q%>\p1T)<I4Pat;s`L7fm8P+/^c$BnB*"H,Gh<`*ZFjBb[oMNUb7H-"'GbDN=BVN6NZ'K$guqA6QpR"Wih5'C]!U3'dZNJ&BmiJcR@<sP;a%'[t,25;Y>l@2^3i`U's%8]dT[5A1g'8bC/)RVCAco97+D:D_6<429m(@c=Z(JIcY#eh&KGS[3eZKUVnok4'<Ai08FN7EQIA/=0uERum3k<EoHKgb~>endstream
endobj
30 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 564
>>
stream
Gar>CbAQ&g&A7<ZV?$b.7a$l-.8`+6B[@M\)`L*0l,Ae:ZD*[1bK0-ba[gEuJ,gD_R+^:='dOk9m\0m!jLD]t:`B-Fap<Xt)W1,L0iCq]U.(ScNE!m6=VilQZfh'^<ZT3QI7"jM(f<-?53cMmeA<JfYa/E<)KqWA'C@S&PqR,';WliW2^hF]%B*?($a"fu9Ol>(hZf`4c-0mMUDY=?=lDG`JXf@[,K$klG5/[;(S+L6H+/pWZo&^hQ>'o/[Y[\K_,0^*15n!7q3de)Y['^blI]hU`R6fF+`sgF2"mSFD]/2un'kCXkCUWWWa9%jf?RU!e,q>+oL'h>)+lHom\m';59bT%_nWu_6@J2i&9[42@mr@R_n4;]h'\6@luo2u_\qa:WbW^:_N!IQE,<PeaPKi[CtOt/p3jC^pd892mR!t%M$6uLfDHH9*r7S`lh=[Ra!Vjo]qnKJe\(4*cXXIdZPlsX6OGco+cKlu*J@j@/aI'r#LoR,ruX$T6LrT-0@8^I%^;:%*NPpKl'hnWZqg/WpY?@-mn5\U]=snh2_S)[q.;TSc`'US[f~>endstream
endobj
31 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1710
>>
stream
Gb"/'>Ar4d'Roe[39"B.<+5:Kj'/osBm\ZA7C`]40;T0`-8<:035-Z7<WDrf);B[/#YC6#'bY-(gqNBNX.`q[L[+>B!q:@9K9$_F%AQRhN%c*>^k\%lD9umk(D+WnD=Bk]W9_(*boeS,D#?k@gLi,B'&"MH1\/)=)@X)$#4jt:\gXm-`^)k;cW2jG[q[oLILlXO0nZI1*dAju/^"[ThH&c;&lKX&YWg<URT8[see1)\1Ph%QZF.X)S7ZUjRi7(n='I8dk+SSAQa&4s?Qh)fK:6Q?:_0G&o175)L[p`mS9*NKn508LE:i<Rpb51ki'^$jOj9$H6_;I@IY1R%_FIb*ZQg;m_<@.Flf()q"?$R"&1U'&47B`Gq.mmrZSc"!2SQBQBZ"$m]s"Z0ml='d;+Bf/Vh!)AKd_[e*(;k5]S&jUL]Tu-`B<*n)3odi"?uF)_FpK<G@%IN"-37[1$\MEUWpJs?(4Y+H@,=iKD#.b<t.[!6+,$R;c';!@?"2`f*a\G8DmZ[J/!MOf:8&1pf8>B\E#@tAI<1,k6J9'_-S\VNs^hQK5$`jkm%l9\r"iqoM4nQPRu9lCiMmdMde"m`8YN7K$7WBJPR(.LT*s?Umo.I505=[":]GAOYq?M;(@a-jSc0;$f4Rc!).ga4;V)VH)mMsM</d"e&/V&ke8!a8a*06a)Gsa%6]YF:PV*s:hQj96u'>a:4VkTd3VE0@Bd81/6b85ZmpY'M8l;KROuIUBDDSG%&9r')>mdX2.tpGr_`8p:?/9$:8<KWl0T,2/h4/?b585'ldb#[oL"fCSV;hP=nI?le7@F.kL$;J>?47cX'"MjNpO2M#>VHI)S?%mp+/IP8!6RB_:&tppd1$'!kUO9^60ba`obnfj.joDS*cDDiRlq0dA)M#o$s3Oio`M2OIY'Z./A;8oY8@N,%]UXKiXH2]gEk5$^a#qFIuu8B@(c)2!,J-mCDGQkDJUd?lO?C286d$`^f'aT:<qc)]qb4%Xk=N`)ZcnPbbl2QmdQ\I!$9^[C7@U%i;#b(20kON4q$)js#e,[2;=V^(omk!-SKJ0!bVJT\M"XHIkos_.n.;@Eo6ehH`*)K(%\kpD7mWY-O31eC4fW92V;'Z@AhjhU'P!ekg<&Lpq6uV`%YgLJlA3f)?Z^`s,0,H.sr;.643(iO\,bnH`#4&$b'_H^Z>:ZO(,Bpj^oplWsDBZdXDZ[?nPL3VF8.0&u^jDn1XQ(Oa7hXnUMh@I*aTLFgqlTn;"3(kc,M<TMUpP\#KH#!"qr>l"+[+0obU&]^Sl0j=!krb;B2<`Z]@_nD:[;T/\X?7(a@?JT("5nXQ%0,_iE&n+"^q*pU!iM!]m_rYS=mpqU'<4BXBE*2U$$)sGO8%_pM^tOCRL"8GT)TUA%Rt@o/cDlI,n^V9]cb>O/7B\4hJJ'_$`XZ<<<TYjT*$b@(fC@7nb)`86<g,q9,mk/5iJ'"Z`!:F'RT3pY&sN;h*^u."h?dNJqY.$I8jkC>n/=_m_b_%e`D@aVY`I0<^4FnCL_$5Sr_&nF59#XJ>^P)B(e.u-rH$$%W]hVT=-Y2\D's@I\3u+D6>QDCKR4V';,*t$-slAn=BXTU2p&(/0fFB2h@>Ces#bG8Ygus<0H,7<J@-"'[Yq=pY(Zq'-bQ^=eA[.S9E,0kZJl0oc@$-<Q'a1H51Bo0o^)2,n<]Yd1q&X.n@WWj.,=q.`d]erCE<~>endstream
endobj
32 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2067
>>
stream
Gat=,=``=U&:WfGfXd9'P8Q^f$"!%AHKD@E2g/rdm7c=@MLm*W,U&A5SR_6J]AN^Q[Ugd+ND2#@HXO,RYY,07J#rJgB)o\A@If9VZXLEF`X.Fb$+ud3f+r.6H3&"JgBK=lKXngT@M[pRBB(MID4eEK88*buFVIJ![lB7V(ABrN\i</&73WkgB58"OBg'at*s=l"F,2D8GTlT+og:=cNqnWeN.iDlD8+KC1<.NDlKX2TC5ePmg1d=QZ.MDCE&MR(CE@d9_e#sO`H-urro$JMd,@$1'fqBY:$?Q/N?.Rp[o#?6@/oH:P;@H-qVq;C:X<Ep"k2X<i;H$j%Vuc^+OnefORK`7Ir3Sj>Pl@_%f=sljW^g3oX0>K(IFoV;AO&9M0pp`+h&p7krd(S,!R'Woq5aF-B*`:4icoXcS;XUs4SZ*kYXR["Q:N3gP8N;/JPF,q[[KO.XKPOE&G]%V9FL#2fg%lCBkBl%.p9Hhl>8fUKS]86*21>7bo2kc*L'8J@O.lYl!,6iTbj9`lr_Ym8@k\qPiU<KN$Hg3L.R]-sAhthk?8;e7&=ORoG^8cpBt'1f-=&0)$8aHeVF`S0fF]H]W);"Z$1AHIrrHFPK>^XTU&_!P&4/\k#^R[U*GXD4[e!#tT(J,):5:gk]E5gmJ(8AfI/5a(#-+"tucS_I0?8mVoY!2YLbR7c[F2_b0.^PUai=3s1/_>YAq.,0EMK9$!i\7#<+Vm>;Lu;5]P?"dDTEUsWj@m[D93oPZ/gU>%(6NK"O1AWFD%)3R"-JKLQuL0EUJ]=^SVCUPG0p$*;a5)2hW\%<H4B[^MIcP,tk,Kd]^jV]#X\D)^\Bb'H.DH+$hOl^]qY!fo,<T5JEac]no1.P&R<K8I]mUCXK7"K]F0$M9DP`On*#;0l339>[gj-R)^-kI!1cA%I^-50Bo@C3?VU6puJ4(4T`W>G^LA#Km]6DegT$)`YtXL?mCE(&KKMDgqqZq2S`RAT*,T4IriUih)uM?f.-'Xo/P;97`.c3h)oL&/;8D&ShQ'_Oa)+-LZbmWU%RDs9A:&kj47F-%\Z(9)O9FuY(>OKLE:iV?bIZ$mY8S/*5iP#(RTL_%Crkc=Ifra"J7L0'=deX;2ZOW0bP+0R7qEbk+"XB1?(RDO6gU4!4d%+F(OhNT%<o\J>9H(?^=7JBqU[Of(ZHQ8hb#2[*X##[#T0A7HLWLCZ5?gjKX_@W8j=L-MOeU0`kr:`;<+7<SUbd!Jf;4)@D2uISEb`387P9o'31<]/e4tXgU1#!4cek##i3ZRH$f*a\GT6f\6\iQg6MY!]AAhIr#'<S^8mCK$/:l87lGCm!gp>RIDB!-nL`H7flYleCf(7KdPmjiVVTmjWc2ZpXHE+VYYT;XPQ069A8A:k3-2BU<;7]2h_#n0OOkAi6rlf0l?\_R31nH9<7C!a45BA3PT/AHS`GONFGU5T?L_*K\\B$DX4_afCJi=ZTYGCGcn:thU:gf`%583=9heZr7KD%7qW<5qeHP,13-'VQPMrdW#rHURScmf@]WH9V9ch3/e'-PVo6SNRf.3uX3-^Ia+,>TN#B3#o0l8kG4+;MiUFqOZR@=psp&q=O8"(($r#=@;Q6cj'I>FSr(Pi,G4`*F7,R0ul3MC[9)9/?t.6]"#Y1)Co*&DD^_2Gh_Pei@DP+*g:<Jm@c2PA#q&cMO4UReq>AH\9b$L1UcZX`Z%KQl&;Z<3JALP1T]N<kE&nDYj]661(lX^mCEM.\dm*T2cZ;]\gk^ISD&CDd.0<codUE^g@mdF?sCoi*TmGULN\AtIZ8V)4LZ.;qep&CDf)RlWg\1%W4IuWN)b/A#eWm7ept_fJ]/XoBem^aj&,tVUnCs!'ZNJ@)@,$oY)b:qJVt_0QJ0[o9..@Z-Mi"?5]POQF4t?W,TFVF)Z_H<(3MbJ;4=4nbTsQkh]hEfE.XJ%6r)ZaC_*esg*RQp(7dgn[G1i7Kb-mt0<a]"YmGDP7@9N^++uH:TWs(1:$LV7*+3u.^c(9p:2';l8Ja94kad&+n$bm$5!qSc9AEWoGC"6;7rg'$GU6oWGS]8kLi@!Rc@PX1q[\;G~>endstream
GasbV>Ap#c&;B$;($BS#<":h#&ZMd.V,=!WBqs$;m0`r9WE?ejFJ]!6)VEm4-!LO(,ik@LhjbRAd(a]#AddO<K$.@*b)d=1S8]bJplYcp"2Z<^>_#4'N+)u(8&GF1"tbKR11i7p%MdBKK54)dN]!3M;i3%aKAo"d+A.A\EtD'"eFG"P,*FZfRM-iUI$h\2dfWoMjI4A(:</:g#eFngWu>sj;P=5V"_J;&TC;:"QDVhTCE*3<S]RlQF2eosmr2c;VQieScB.rjE]t2i&`k2^,3!?Eo\O\5RCdPkoHPsR2MKcqH1W^1TrEh[/OJm]pXeAK4`rL)+WT[\[Sti>HXit4s,:Lo3WpNY05oN5EZFF^:6jNXgguEm&X7&,=pi_=ThY9hT<0R4P'1u&Y5d8+D2G*+lE3Hl%Hb">Y)Iu^$Bt/=#P9Wc]=P1_gWe')QlZdj,hr+73/P-Z"6,dN;X828qsBPN]>di\;bQ#:1j,Ec)YR?5Ye?JQHlKHM1p/9%Ri=2]]>BbOK2:+PBFQRj=LUP\[eXV$"]j3c(ZS2[&-$g0Va&ASqec[W4K`$X^RS-qLgeQQL45Gdr=jG%%t];<\b@]~>endstream
endobj
xref
0 33
0 19
0000000000 65535 f
0000000061 00000 n
0000000122 00000 n
0000000229 00000 n
0000000341 00000 n
0000000456 00000 n
0000000661 00000 n
0000000866 00000 n
0000000971 00000 n
0000001176 00000 n
0000001381 00000 n
0000001587 00000 n
0000001793 00000 n
0000001999 00000 n
0000002205 00000 n
0000002411 00000 n
0000002617 00000 n
0000002823 00000 n
0000003029 00000 n
0000003099 00000 n
0000003380 00000 n
0000003518 00000 n
0000005514 00000 n
0000006000 00000 n
0000008054 00000 n
0000009887 00000 n
0000011858 00000 n
0000013620 00000 n
0000015307 00000 n
0000016993 00000 n
0000018970 00000 n
0000019625 00000 n
0000021427 00000 n
0000000418 00000 n
0000000523 00000 n
0000000728 00000 n
0000000933 00000 n
0000001138 00000 n
0000001343 00000 n
0000001549 00000 n
0000001619 00000 n
0000001908 00000 n
0000001993 00000 n
0000003665 00000 n
0000005218 00000 n
0000006427 00000 n
0000008391 00000 n
trailer
<<
/ID
[<4a95945443b3266c457c35d632c7f433><4a95945443b3266c457c35d632c7f433>]
[<72c3ab2d07f22178abbf649f639f9ed7><72c3ab2d07f22178abbf649f639f9ed7>]
% ReportLab generated PDF document -- digest (opensource)
/Info 19 0 R
/Root 18 0 R
/Size 33
/Info 12 0 R
/Root 11 0 R
/Size 19
>>
startxref
23586
9078
%%EOF

View File

@@ -0,0 +1,441 @@
# Les 5 — Lesstof
## Next.js Basics — het React framework
**Vak:** Technical Foundations
**Vorige les:** Les 4 — TypeScript Fundamentals
**Volgende les:** Les 6 — Next.js QuickPoll deel 2
---
## Inhoud
1. [Waarom Next.js](#1-waarom-nextjs)
2. [App Router vs Pages Router](#2-app-router-vs-pages-router)
3. [Setup — eerste project](#3-setup--eerste-project)
4. [Folder-structuur](#4-folder-structuur)
5. [Pages + Layouts](#5-pages--layouts)
6. [Server Components vs Client Components](#6-server-components-vs-client-components)
7. [Routing — dynamic + nested](#7-routing--dynamic--nested)
8. [Data fetching basics](#8-data-fetching-basics)
9. [Styling met Tailwind](#9-styling-met-tailwind)
10. [Loading + Error states](#10-loading--error-states)
11. [QuickPoll — het project van deze les](#11-quickpoll--het-project-van-deze-les)
---
## 1. Waarom Next.js
React alleen is een UI-library — niet meer. Voor een echte website heb je nodig:
- Routing (welke URL → welke pagina)
- Server-side rendering (SEO + snelle first paint)
- API endpoints
- Image optimization, fonts, caching
- Deployment
**Next.js** voegt dit allemaal toe bovenop React. Standaard framework van Vercel.
### Waarom Next.js voor deze leerlijn
- Industrie-standaard sinds 2022
- Werkt naadloos met Vercel deploy (Les 15)
- Server Components + Client Components — modern paradigm
- TypeScript first-class
- AI tools (Cursor, v0) zijn geoptimaliseerd voor Next.js
Andere keuzes (Remix, Astro, SvelteKit) bestaan, maar Next.js is de breedst gebruikte.
---
## 2. App Router vs Pages Router
Next.js heeft twee router-systemen — historisch gegroeid:
### Pages Router (legacy, sinds 2016)
- `pages/` folder
- File = route. `pages/about.tsx``/about`
- `_app.tsx`, `_document.tsx`, `getServerSideProps`, ...
### App Router (sinds Next.js 13, default sinds 14)
- `app/` folder
- File = route. `app/about/page.tsx``/about`
- Server Components by default
- Layouts, nested routing, loading states als file
- React Server Components paradigm
**In deze leerlijn: App Router.** Alle nieuwe projecten = App Router.
---
## 3. Setup — eerste project
### Create
```bash
pnpm create next-app@latest quickpoll \
--typescript --tailwind --app --no-src-dir --import-alias "@/*"
cd quickpoll
pnpm dev
```
Open `localhost:3000` → werkt.
### Wat krijg je out-of-the-box
- TypeScript geconfigureerd
- Tailwind CSS v4
- ESLint
- Hot reloading
- File-based routing
- Optimized fonts (Geist)
---
## 4. Folder-structuur
```
quickpoll/
├── app/
│ ├── layout.tsx # Root layout — wraps every page
│ ├── page.tsx # Homepage (/)
│ ├── globals.css # Tailwind imports
│ ├── about/
│ │ └── page.tsx # /about
│ └── poll/
│ └── [id]/
│ └── page.tsx # /poll/123 (dynamic)
├── components/ # Herbruikbare components
├── lib/ # Utility code
├── public/ # Static files
├── next.config.ts
├── tsconfig.json
└── package.json
```
### File-conventies
| Filename | Wat |
|----------|-----|
| `page.tsx` | De pagina-component voor deze route |
| `layout.tsx` | Wraps children met persistent UI |
| `loading.tsx` | Loading state |
| `error.tsx` | Error boundary |
| `not-found.tsx` | 404 voor deze route |
| `route.ts` | API endpoint |
---
## 5. Pages + Layouts
### Page
```tsx
// app/about/page.tsx
export default function AboutPage() {
return <h1>About us</h1>;
}
```
### Layout
```tsx
// app/layout.tsx
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="nl">
<body>
<nav>...</nav>
{children}
<footer>...</footer>
</body>
</html>
);
}
```
Layouts zijn **persistent** — niet ge-remount tussen pagina-navigaties. State blijft.
### Nested layouts
```
app/
├── layout.tsx # Root — alle pagina's
├── (marketing)/
│ ├── layout.tsx # Layout voor marketing pages
│ ├── page.tsx
│ └── about/page.tsx
└── dashboard/
├── layout.tsx # Layout voor dashboard
└── page.tsx
```
`(marketing)` = "route group" — geen URL-segment, alleen voor file-organisatie.
---
## 6. Server Components vs Client Components
App Router's grootste paradigm-shift.
### Server Component (default)
```tsx
// app/page.tsx — runt op de server
export default async function Home() {
const data = await fetch("https://api.example.com/posts").then(r => r.json());
return <ul>{data.map(p => <li key={p.id}>{p.title}</li>)}</ul>;
}
```
- Draait alleen op server
- Geen `useState`, geen `useEffect`, geen browser-APIs
- Mag `async` zijn — `await` data fetching direct
- Geen JavaScript naar client (kleinere bundle)
### Client Component
```tsx
// components/Counter.tsx
"use client";
import { useState } from "react";
export function Counter() {
const [count, setCount] = useState(0);
return <button onClick={() => setCount(count + 1)}>{count}</button>;
}
```
- `"use client"` directive bovenaan
- Gewoon React — hooks, events, state
- Wordt JavaScript naar browser
### Wanneer welke
| | Server | Client |
|---|--------|--------|
| Data fetching | ✓ | (kan, niet ideaal) |
| Hooks (useState, etc.) | ✗ | ✓ |
| Event handlers (onClick) | ✗ | ✓ |
| Browser APIs (localStorage) | ✗ | ✓ |
| SEO content | ✓ | (werkt, minder ideaal) |
**Vuistregel:** Server by default. `"use client"` alleen als nodig.
---
## 7. Routing — dynamic + nested
### Static route
```
app/about/page.tsx → /about
```
### Dynamic route
```
app/poll/[id]/page.tsx → /poll/abc-123
```
In de component:
```tsx
export default async function Poll({ params }: { params: Promise<{ id: string }> }) {
const { id } = await params;
return <div>Poll {id}</div>;
}
```
Vanaf Next.js 16: `params` is een Promise (was object).
### Catch-all routes
```
app/docs/[...slug]/page.tsx → /docs/a/b/c
```
`params.slug` = `["a", "b", "c"]`.
### Link tussen pages
```tsx
import Link from "next/link";
<Link href="/about">About</Link>
<Link href={`/poll/${id}`}>Bekijk poll</Link>
```
`Link` = client-side navigatie (geen full page reload).
---
## 8. Data fetching basics
### In Server Component
```tsx
async function getPolls() {
const res = await fetch("https://api.example.com/polls", {
next: { revalidate: 60 }, // cache 60 sec
});
return res.json();
}
export default async function Home() {
const polls = await getPolls();
return <PollList polls={polls} />;
}
```
### Cache opties
```tsx
fetch(url, { cache: "force-cache" }) // permanent (default)
fetch(url, { next: { revalidate: 60 } }) // ISR — herval na 60s
fetch(url, { cache: "no-store" }) // nooit cachen (live)
```
### In Client Component
```tsx
"use client";
import { useEffect, useState } from "react";
export function Live() {
const [data, setData] = useState(null);
useEffect(() => {
fetch("/api/data").then(r => r.json()).then(setData);
}, []);
return data ? <p>{data.value}</p> : <p>Loading...</p>;
}
```
Voor interactiviteit. Of via TanStack Query (komt later).
---
## 9. Styling met Tailwind
Tailwind = utility-first CSS framework. Class per CSS-property.
### Basics
```tsx
<div className="flex items-center gap-4 p-4 bg-white rounded-lg shadow">
<h2 className="text-2xl font-bold text-gray-900">Hello</h2>
<p className="text-sm text-gray-500">World</p>
</div>
```
### Responsive
```tsx
<div className="text-sm md:text-base lg:text-lg">
```
- Default = mobile
- `md:` = tablet+ (768px+)
- `lg:` = desktop+ (1024px+)
### Hover, focus, dark
```tsx
<button className="bg-blue-500 hover:bg-blue-600 focus:ring-2 dark:bg-blue-700">
```
### Wanneer custom CSS
99% niet nodig. Bij echt aparte animations, complexe selectors → CSS module.
---
## 10. Loading + Error states
### loading.tsx
```tsx
// app/poll/[id]/loading.tsx
export default function Loading() {
return <div className="animate-pulse">Loading poll...</div>;
}
```
Toont automatisch wanneer page-component nog `await` is.
### error.tsx
```tsx
"use client";
export default function Error({ error, reset }: {
error: Error;
reset: () => void;
}) {
return (
<div>
<h2>Oops: {error.message}</h2>
<button onClick={reset}>Probeer opnieuw</button>
</div>
);
}
```
Vangt errors in deze route subtree.
### not-found.tsx
```tsx
export default function NotFound() {
return <h1>404 Pagina niet gevonden</h1>;
}
```
Custom 404 voor deze route. Trigger met `notFound()` helper.
---
## 11. QuickPoll — het project van deze les
We bouwen **QuickPoll** — een mini-app voor snelle peilingen. Stack: Next.js + TypeScript + Tailwind.
### Wat we deze les bouwen (Part 1)
- Setup van het project
- Homepage met form om nieuwe poll te maken
- Hardcoded poll-data in een TS-file (in-memory)
- Detail-pagina voor een poll
- Voting werkt via button-click (lokaal in state)
### Volgende les (Les 6 — Part 2)
- Server actions voor vote submission
- Loading + error states
- Polish van de UI
- Setup voor database (komt in Les 7)
### Architectuur
```
app/
├── page.tsx # Homepage — lijst polls + create form
├── poll/
│ └── [id]/
│ └── page.tsx # Detail page met voting
├── components/
│ ├── PollForm.tsx # Client — create poll form
│ └── VoteForm.tsx # Client — stemmen
└── lib/
└── data.ts # In-memory poll store
```
In Les 7 vervangen we `lib/data.ts` door echte Supabase queries — en QuickPoll wordt productie-ready.
---
## Bronnen
- **Next.js docs:** https://nextjs.org/docs
- **App Router intro:** https://nextjs.org/docs/app/getting-started
- **Server Components:** https://nextjs.org/docs/app/getting-started/server-and-client-components
- **Tailwind v4 docs:** https://tailwindcss.com/docs
- **Next.js Learn (interactief):** https://nextjs.org/learn
- **shadcn/ui (component library):** https://ui.shadcn.com

View File

@@ -0,0 +1,263 @@
%PDF-1.4
%<25><><EFBFBD><EFBFBD> ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 6 0 R /F5 8 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/BaseFont /Symbol /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/Contents 20 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
7 0 obj
<<
/Contents 21 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
8 0 obj
<<
/BaseFont /ZapfDingbats /Name /F5 /Subtype /Type1 /Type /Font
>>
endobj
9 0 obj
<<
/Contents 22 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
10 0 obj
<<
/Contents 23 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
11 0 obj
<<
/Contents 24 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
12 0 obj
<<
/Contents 25 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
13 0 obj
<<
/Contents 26 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
14 0 obj
<<
/Contents 27 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
15 0 obj
<<
/Contents 28 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
16 0 obj
<<
/Contents 29 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
17 0 obj
<<
/PageMode /UseNone /Pages 19 0 R /Type /Catalog
>>
endobj
18 0 obj
<<
/Author (NOVI Hogeschool Utrecht) /CreationDate (D:20260607080655+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260607080655+00'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Lesstof) /Trapped /False
>>
endobj
19 0 obj
<<
/Count 10 /Kids [ 5 0 R 7 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R 14 0 R 15 0 R 16 0 R ] /Type /Pages
>>
endobj
20 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1889
>>
stream
GauHLh/f>L&:`lHfU9J75,:OIK]q0=V9M]2GF/*-%o",OQ5pSH"E;fE?f)U8J=W&PS6O`X)sqBaJ#hDU8doN`Zhcae!PFo<RpuY]_e]@tV(TteiT&.n[3ujHG<MUZ[%2^L%35=u@VM[s#q>ut0T`_=V=0!d)3lt=^i>t71EQr-MjG1]l3l@5/l9YP+iU5P%MbM/C6s65"M=7EqkQ,'TVA\$bqpLVL)d8qeOjshC,=31@((Z^5<aKWJ`!f1.\j$q9AjScW9C75$dO0FHNG;=SP$1m'e`s<%C;C)5u4F0,XN(A[a7rQQ;t@I69^1J3":H3"FNKGDBoMEQmE_ArP3L$o7QJ="O:4SY4!7#g5t5[5e/I'V<;V;*SrpeLog<$0o+JSa7S/)9MicB!OU8l$Og+;X<!/!*]^JDAaP<08[CKiO_(:*$%=i2c&WpbLpO68>ZAkAj:5Y^(`6!g+qhS/3:,EdOcD*lfXXdpBm[/'c@^kP<S!1Dm-R/u]cF@>Bm-E@Vm1#G*q^A6X97T_m]caJA!9acD;tQ>1$T<22))7ZP8h3^`I):3_]A6o7,.Ef:$@1A!k4$GmD,pk!NYO;1FP,R!G>TN:,;K<7B]@/(RB&?)X1>'Jhn-2'eG5]V=(\Lk(ah+_L5]c0LP[FD.\.3DAd=D]-_HdJYq,.ft8nGS,"s%dS)qpk-J>S0X<MFmEnBo>mZS+Kf?ba);VbO^d-<X(b;(mbFW,[9&h<ni&Fr=o<=+Y[+q\jA&Fl@iVg>9fB&&jN"s*[@S[/UAGe:YB?=&JEs7C=K4#;lSI`S*m$Di7h0dM2"A=&<!Ipp8bDt^CE'4^j/r=ke'=]'8la.(]2oW,\E:CTE!"r>Bk6*.-Z1u-1*eB9X!cPPf19#gCGb%KSDX#,_kDgd31*E9!gPE['.H4oW7J[Y(04!V]fgDpfUE[u637brI.]pSK.<2sm]IV>[c=SZ^;U[5K>cHe@`HpT#2o)O82rMB-jPmo`_dE_Vj_iJ#DV_1/'36LF<OSLf26*cl*;bUgkNIeXS!EA'cd&FeN7#<s\ouQmoMdt([Jp"Y%#\p*c'&$REV'V`p[o@pEU:9LGd1=3[Nb8b#l+aZ4]TfqpbpIW/6c2UJ@e^'Jf(`S=ek((b]?\3cfD5S\Y_=3_pH@gTK?YVMi#g,<OL+HZ7Aq>Q%HZiY#SG8j:3UrR1M_0%;?ZdHP"Ql(sq\=d)T9Ea0dJ!@NAJ7FhPpM=mV(W_rM&Rl&C89-c.]kr!H3:#7T0EF1ioH8Rf\o0cm2OM(ojF(8l4RggSpNcW5=WipKe2%"=heppW2\TaM9@btFdS=D)\SoC`@n?#l<Ak)]#Qe68a8<h(d:9$\U-E"tk["0'-?SngRcFm24.65hU&L,t.g0XXT75X)T?I0ckb(937p2#b\p&>K8!JmD2D2ABUKK4#3g_h&J.Vj=RYl64P/=*QouKlM,TVtK<Z=MJSX5mjS0aro?S<&/'Hks6Yj4jCjS7f*NV(.D7h=bW+rXb][a6c<8&dtj\,,!HFn0hp7f]Nnas*l=D[([f-SHfa^=X'If;O^$)$,<$de\_3ecEY?VgOsf(jpDCiZT\T:[h@?"YG0BB]*B'[sh-^0V"Mf]G;ZA<"R_+M48X)gj/j]Mb4X!CE=bObHEH`=r^K9(Z;#$>bZtUS0gSj%:?'[5E?E$T-<fgqbGe*iFgE$k,Xpt)VB-.YUlf4lfon*#=?6^KA>ZORAk[qRi\l["5K!/gbS)^3K@g;\GcIoFqJ=2kX=0TT1/,qhh9Y:rm*=40)4:W2(:g=k3S:CHiorCb$`Z?[?Co@qbS.9blh0mRuO*BmFdH;0.R!FEgp1LSq/p@4!,a3bKXKXR:/?e&5r4Tg'Gn#Z?6+r"$XBUHC2&*-A!EuJT%f~>endstream
endobj
21 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1827
>>
stream
Gb!;dD0+Dj&H9tYfXXdl%hqU$h`B5Sk0iR#juV+\E:"HR3fYeJ'4JGW+JHRLei).j"<*FuOoko)=k\;t7F*Sq5k3+!ms#3/`t/a<0jkuU@pjlo(qtbiLV<.>_EI;p(Pi`$-fdNZVgO&`oJ1AKie9L*&5\u%^&Sa!&d2VC*7t!Mo>*s7^[*Zt^.8,e!"#%Y"l@7FLNo>aC-c+N$eNu`nHC5OOEaE?#daN'0V#tF7Q"'a5q$f&(PYjJpufP]'DP3rA.bGLXl*Q%A:/9'`46CK-h(0^V:)n2049#*_j@3ON_n[<BS,F)'`),OL"53eaN%tWAeFNmJ5>CF%9U?^8`3KtT#\mYH<aZN`ILuDi(X>Tld;^)MB*l)!2^l2LkkHo8n8[dK+[_R)[O%m*Ca;R!nOB'qQiUK].*WZb`uL.AS*kXHs5"[nWc$eh-+`5.]GkGAoo/(;!#)2(Ib1&7<8HM/LM<se3]sqS48VBX!O;#\]f.*T4J^@!iIs!Osi'lN(l-o=5$or4NcT?1pL"jX-XakR)g<7K[k'Es4n_4;>DiCI.nA,kUA&764:/O7/i:@UbjR7aL8s"'$CaKr=[9iO-a"OY.[a!,YMa'25qQ0:"5%W9+'UAo;ua0oZlLMf':u4[]e+a>0*Ed;-FbiQ$/RIQiQ6&Jl,)r^td=q*JQVkiu-S9g<7iAC$*jZZ(C)=6^B.YG;rVP??O:<17d\uRLJc.6qKG-m]`208#/S"0>!!t>b8q^bq4lQ;qOC;U8$:OdrT/J/=73R-jK"qG\.;"qCnhB([qN`$78[62P!;e/WdT-R`i9AIAas?qV<p;0>7kD8&D*mrK&>HcZ5I\pYcB,7/,XS9>-U?V\Tl:8L0NKlN:1E"sp&KmQENc;C7)dK?h[l]sR>?28Sr6EJ3M@Y]$/L75Noj+nh?9=%s70c/]"fEi`o"AoV2&Mm<RRHgCPj@&<c*PeC>7En.^b@gi!&8hcOe6*Vi>`%I_>alb+]81)<a$iN%>>,KEBT0j:k%50lC[!&!l\Y/"/MAQ5gHn]IDY;X@"YV)S3MX+41o(Ft6gt"sVV1T7:\u;l7ac83()X?-r)S=8$GH$bp]$<tN9+tB%=;i6OiDX3DlO=@U#FmZeh"B6q/tZr.W+A1DVVa0g^.!<rRrA-B[XLkk4=cp$]1nng>PA5tBd,b[SStn*I3<'aEOQ\l#J9M572[+H*?EWtZ/Rk-oW^<5URAD\$=VpH"N!NP56?+fmX3>+_&TujI69r6r_)LN1qVK"LF&'F&VL!7qu3q@C(EJ6o!50)n"U%UVs$L&D59k*6qO^V+-aeF/_L92\[:":7+`uM0peJ3-.p\tlI5qpA%D7sg/b*5I^ee$o??AC]6Q%"Wm_$5NW"'sE!'aPS6\_-NP:LZ`Q%QC`gWIC.!J#k#en!MkM0bu4LD#1#l<3!o"'0;,;HH(d!lOjKl.^KK8STlOdNe*d)hgCoG:L?7Tnq0BRae6PfLI#!J58,a$Z6fK^[M_`Qae8M1Cm"gS*alfcsHm^H3(0k/=rVQ;;nj\Y9_E)@K-XrT\41(@JNjU]s+@Jtgs<e\eF1kWG`E0\YfLZ'GWs%CF*c>i/`6?H0\M??Il,^/nTjJ?\T.-,HkrkQIm7bd[np-(a-%ea[^Pj\pu9-m8UsgAr(c2l\,C$f>T2I$ncH?o5In8:)Z1EJX(&?Aeq'%.#1)7=AEl2c6TXYg(!WP`FXh*Y]qB,cSVL'Nr5E?Bmt`r:]:Bj_qbREK!M8Z<ujRP8<9JAZO_.kX<_**4%S,=`+@Ld%>Kp\(:Kg3O6SL.98Kie@@3u.u.%!n5=a9T)5Y=&+oi'OE0FQ~>endstream
endobj
22 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1745
>>
stream
GauHL>BcQ-%"@rScoHMo]>kRsQlD+BD:<)m:2b-]&"@tiGjLN"Dulk2J,O*d%+mE\c>FXaE=A#E:DtBjL4Y16lMa7GJD[8DE_:m<R*L8'_I7a#YG\/!,Jk^)>QF<%k6DDdi7f?p(S_[t,Via."mmb5'aLljd5oXi:erO?+?)!(0qpptoT\K'1_ip3TCdOU)+/(4KTs<UIa(YmH3'-c4/?#md25L&g8W)lc\Y/G&hmV.ptbh^cJWQJ0L^)SAI3`:Et_iGE64K!QY5g1gmKElRJ]'=Dd`FY!d'BAWR1mK[Z-lJU+!?nA`Q4gLslq5Ne*6._2SW?C0Jbm6jo&cjDBE](!td_D4`rK(@^D7`lK`p[Qta[#tqeQj-p5-(s(:i,b%TPCGWND^2ME_&o$>MWU:>fh!GI"-%kB"=Ha(2I1;PK(&.^gki#k$FQkZsUe:<CoI1B:C>-LUlJ5s?DB#5)YKTG"a/]gg-Hab^]NF@:jKi/\%>l7RXVU4V\&(-#(8it`j5L..p]JeIGs#_CXFm$gI;p=+jT@^AqKP32=9nZk2Cl%%-!<3ce&;El0^j7hZrdRDEZ-<-35WPV+NIA8i6N"kH'1,T=(T%'J"SUh/1h7>*5=4J;-lHd$1QsbE)W\]on^qjYkWPKK]8!,j's7%=L`h".__FgBpQt:4t4X%*L5r5hA_o<JBsJgOsNAl7g"U=[e["<fM4NFekDIHlN&P,>cF_r2qO3)f:GuY0/]k:&s%C>HUVj`U/B\70igVN(JMEl(f>j&2(R\q7gg]o0PIV^WV/t?U-r_O\a?fE]G<$7VPRK=]U!?8hg3cN)i_!jDBuKj9tTEs\D6V1Y5;L;aT<(t]#=9i6sr\oli4PVUYAe7,U`HoL.4a++p)$tWS#3.VePGGIpt*dE4$T>/\0&W*n,Ol!U;`OO@d<9/.&+'^-hkj$pJ6)ql1Uc!;%iR<s@M%Q/BJ/>aPQc!Z0>rNPD'u-.CsnftYdt`a6^&E3`IXp/0pb9%.8QHBD`>@8`2c-lT*[duTir/2)n^Z:pHIa^`7H]Y_&u8lD[FVnE$_G/#XaT#$9TBYYce&1YXrnohOU"?tDErpnL`#+icsms+QP!$eTE^>RZ<T#0]*XP.7(-$2GJbf9s8G+XN43#[+UAO&6,RN5Y-UC86ceDPRkdc$7p`T1+r3ki97EVnGs4j66#/'"mAK39Ji<>WAXn[XUB\@b<5Z[l#u"d-OI#:$G'=%OD!Jj4mG1+_Gkju?0I3:6SG\&7QOkgXu58[Y`H6]kq>O4`KGK0dYS7^snQFPo0\57\64(u<p4h*K[XmEqSppAXBoJK+=1]/r^1G\`Rj%LX[38I,0e@j0?c\fDS738nb8Ja/ZHa`+siL'73t#i420gh>[/B#o!8T3td+6+_NJ;Zh3r?8&dccXpCg3Gdq2TGs-N`+bPHlWMQ?bd\o!k<U?l-1!Oqh:%qQ!PE0A*,hkB&7-sfb1J`pVr=GNG]9!\3R#\Xj*$YMb[!ka-JBni#d[S,i[2t73_j:t8RZ=*=IHh;I@`n-I+AP$Bn]W*gE-Gu/"BZJ:gek?ogZGX1H'NMjc;*$Mnc^[JE'-\$hO6ZgJqGuVcc$J>L>snY>r*Q+1iNCH9.2Fg=hptKO90f"-_#2g%KuWXWr>TmgW;JCp6)=%&PlUh0H6E&d"]^N/3"&9gr0m:Q,1?^d\;&SGE96SFu?sWK4BAY@Xn&+RFMri%`^[%D3hW"P=FX)k=N&hCY`]qA8&&7l^~>endstream
endobj
23 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1542
>>
stream
Gb!#\hf%7-&:W5<EC_1O'FQKj'M3F]J?E+\!^X8+m[j?NfX._RQ<Zukg'.<0GLUQ-Y2qQ92`n5hRePY.mc/MM.6.+"jl_"#nC&'uk7f=skn5Bl*2XPAbLCiV&LNn+*Y;C5Y0VXnY'E;K=p]G*#bUo,PTu$J*4V_2.:3*C4"7.^9Z-FT7=e"g8B$-.l3Sb#Z$2%4$sdr6$/n+UYN&P.4J.Ej3Xi@k6SP#rlUA4[/gh/%U^,@+fU'AOobN!N6_2P)Bc=n$,1H-`!Ah_@]RC5QlWYC-)kA"eoEM0GN.W0"(CHKOj:LrMkBW1B/!/Y@0M2E)4b,aNK+3E?F]d('7!T9_baSaa.\RBV__jHiNPilKa\c1dAWgGr:He3Ve"cCP/.;-17m\6]$S4hqXU8hN@UTEHo5NK?[DeuDMV4$/(0?MNm"X5O$fZ+qp.&(<B5Vju,`u&N]S(%>I,ZqbZDRbj[%>c:d#K5JpCLPRVc<,#VZV!$?ZXETJr0#kNO?4`<n#mMXd)mAf=\.n9[5ZnAb%RH2$\Ic17fp.^c`lHWChb9-4juOPMeLX(6]1CM\PuBh$e)C?'c[$=Cn[#CsoD8KjFu<\:E[!R28_h^hX$cMEeF[a)JL0O^Y!/Ft+()[oBWW&ia1EZP!JNq<8#(Ib^"4>RedQ(rpVP[u>Yba"N%*)!*a#\OjI'h>a).'P$]f,Pir]-5%eJ8I[WoU70S$d#Js/[gt(6gC^=cF#m[cRH9[bRaRsV>ZPU0ifknO9>U@#r$kF!Wq8+E%d'f??=Z*Jqj5Ym]n@mVbR7<t?D\)>pZ("Z;FqkmpquJQZU_):9Y"#aapN+f'^HUq+:2Bq-1TC9aR4%&jhC$(&`>]UHlOk.p:)0aXjWW2@1q@e&OK5?k%6gXl65=_YlVXGPJ@"n`h"Hq3?<EQ@UX@Z"]4+FLZo1UNA3G$m/nN5XA$c,X<*2Rm.af-)J?@@R.i\LMj=UGngNUe/OW_>Q\CEZjmZ&fP<eB3Pe(n0N<bM,apXaSof!>5>obP\8/Dj&P>&1/D,NX(c#_YLS+=dCJink+TSR\bi6NSq1gJ)Kc*AJPWp0A/Db6!gl:[*e=?n/7q7(A*.?lQRr=9S]$d1N-"3"l^G<F4='\fJ7Ue\1aO]&HRLJG+D&Z5_P3a^cKZ24l?jSEi7R[e^l%sF*]2,PIj[\<!gd(Q$9H<tSOLgs^HpN_4trd@WT1OC-QJ*S:N_V+J#9)BO;_o_(H5dQ:hPFH2]aTC7pBa/Fu-9ZZ#2gogtiiiqT\b:.EM<"EcoCNhZ=TnQc3XrC6#^mb9S0ssu)p.'@m-EZ`OjW"%NJG8<\G,Y^^8hbS[cSsnmM-^Q\8Vm#?8b<=@Y>YHh7K_GP?`lYm#aMs)M2I1HBqF0:XUd&Osi7`n:7[^HB!=8"R=Hb>Q"E&+G7Xk[Ome0<Nn4f[_ScAZWj!:Rrl>8'3md4[lM*X,J<CQNlOl5TNcVSh:\BhXB+Ge?Z.j$_O0*EH#D'"(>,dpk#npE_Y$L7M@M[%:endYM;_lL:q,b?"DV[nOb!*Xq1V>H~>endstream
endobj
24 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1994
>>
stream
Gb!;d=``=U&:WfGf^Y/q3Y2<u?lFA=:$`j`2M]iDU$;_R5r*;7<(P)jlg]Jn!^&m,4u.$@M^#h/p:t/3"";gs:!MR/%.II3\jmG_KAI0<93g\oLVo_Vbp(AEJa3>V\F"qX8Ef7ja@B8<Sko9GKbV$;&0A@>E_8;%3A?s>">kX6_XNCNJHW\-E#/eXT$RA3q$up46e*gZHp:l+?eNK-Gp2].ld3lH#Jj5g<_bNNN_=3R"Wm<Ud.u_>QacH2)p'9bc*@KO<4Rr_(%`@Oi5JoF,qiel9k:sG]eek8d0a'MY0YK!5F;\(08i/._\2%*(r`HSY6FD%,?Q2cX>7u>:LW1n(jV$9Rta+]Vg4S:f&<kfSqMAK*l?QMK:iWi1R;,q\+R\m:_S>NfWH7%7sHU!=j:%[lDWI/JZ@i$kr?n>)OrmS:h)dIJl&e?`1eO8]_-2i#%l2'7@$(m-Gc%genY3.S(Yj'3jhX&l0iZ']14K,-=:W,X,L^D=@bbJR1EUh4P+SO=g)]Z`+7;eLlis_pg1+-5"uc&',X7gA:Cd9"):*Q,JFh1K."E0Z<ZA4TpR/66ueJ]0V##&MR+#'D(PRTr[qGo7W]U_3/j,a!)]$tLaeR=I1V_h<\Taf3ph-7:6h7^camC:M2D-_`fifR-l[@X=eU_Dr[q'G1@9:+fKXnVS/#2,p%NZ[h/!)/A^^IX1*DouR]#Y&RN,RJ1WWZlqONHII@eAr0!FuP-R9bg*8j3'.Zl[9]1ICsho-s<g7k]uC1T>>2G:B3^!LXTb;[U&s/srqF29a@^m]:Dcf^*\:>&IZ>.3+OChQW=Lt.li"EsVu#j+fs)sL2Y;9ETG(R.."_!*uVX'Fl-'hKT\W\\TCrT<cmE;8HR<U3fm/7E/Y[+pD]C[I$Gf,M(2kY)A0XFubeGWi=<#GX09LVogEe/J.H4M/O64alkjD6Y6fb^R3<e[k/cXl%*2aa6rT(-RG&ij6"n=%i+q6nHHLqI/YYS;ptgkB/c9`9Iq%Fg'&!o'2dU&B@Wh:DBTkj:EWB`8]VAS0p'e-'EtGBf\dqIs9"n:CH;AmFZ3^A$h,Z%PL#t#J`2dRL[hm=k`I&)c*aR5HPAaUE*PP`nKJQ4W0pB,E@E+/8:10m]#kYi08tm:h)dIU<,[ldZB#l`1DP51L6&8#!rPL6LNE8+K?6Xke>9&#0:&uK$EZjA)h5l@5)l/<)m)2Z_d'b+`Uf5R@+kP%<8n4\h_,3%.e9D41Q'Q<ie3Y\J%nU\4PfM^$3XGOTsIUQDG#>hoJf4?htf?^6IYgWYAX'V7;_`oDNH7+7bFq9tt31_Cn0:D&cfM2e3rj]H>9Y*+Z/DcFah^pplj#];k8*drr9CQsLA3?nonY,hCZ@-gS$]mMqQ2k1"%WZ-!Q6#Jfq?&+IMm4!/ORTdKfghY8tO#AU4u<\3M/S^?n?/)q`&$,;?SPqn+fR@LIAD6qo_4f<VTV1Ymg$"g=+.<CtOL8l=4),->21*kAY&*V6SZ^MX*>Ccm"%pYH>`FYNe11c4mQCZSnpc-DtpB0\jQrt9W&tS%la'=B'VFNP]-)YG`0:'IoK1U63:\(M[7T\oH)-P8L*dMV`NmlLWf'!>(/'UTo7Ci_<//?)*.7>r3%HjhSjX%_^>of#*f'NkRKo3s_BoUs1lp\75]:$>NjEA7Q>$r=0e9)3qKkA34p7uH$>?rZ?5L>,7+LcKei`3aY[0uU5%in3H80l5*bJd"ioqI+aTGOXpDX0_nDR74kROtN7mBasrn-<KO=QTFVbg2E=NT5,2!F1cY])9:[h_QhRa@@8PZRk%;@kMIU<aPS!g*.SC2MH68.o#jtJ`HDtKSCNSW:/tC^01M4%^j)!ike_.QS6gt:q7RfjOk/a.B=AW>h/RgAEg&*OnViL0Hqqgbm*]oCd5V,)oOGQ[Ec(^&\'uVn=,_YDS0-*jT>RVZ`2BnH,F(q=/d%W&TZi0(.o'S@4l`VQ8K1fn@CHNnf05bm-e?\$^nSiTE~>endstream
endobj
25 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1360
>>
stream
Gb"/&?#SIU'ReT:\1mX7'FR?-&kRA/J[S_.!'ur[?=2[nV.J@],"o'aV^W&SpQ>=C8%dK,LBZ=B)l?/ik?d"l/e:YVlSg9,K,MJ:51ip>#_i6pLl5O%hn[Qdl`5^fUYPMB3<D9+"lqc-"mNs__./;se0c@m7tSA2$A*s#"]2mmF2B)#0RdLD5b)78>X3mc9X&0q*Q0AVVHr7;k3oIVr"I(5+0isMm:Q1A@!W$V2V"H]0#GQe*qX*lrqO[7C\Wub<#//k,_FqF<!C_j#*a.QHOZ>,;+8T3V.\/iL]/6&?j"ni6>qGFD9s5eAU-$`6#Pd0N$Y\;J7!F%CBR*W[lD4Fo5uU9R=tnn51AJ)g+pl!4I2!TU7NG#@:m'?Q_A99,0L_R/6i]CnRi->QuA"@H;7j*@h((UlCN_RRK>@H_k8`aTCk7o6l&'nLggWKCTtV^/A*kSkt^8-[:J[fqD#4O<l#@=/e_r+\_n8t`(3k<hFN?]HqGf&>*B4PTA+CR/96(i-OStg',5/bYFKI.p4.IjqJ!uB)bPoRq.#"7q9oL6b(A8_[lK<<QF3@YQ/QsrZo!((4dNE.J5k9'>DDmAFr57)k5A)H^R%"Q,`:s#E:ir_q@kW((n;9)*+TWn9e+CB$g$PIBVTd-bHn`5FWJ@j6'0=Q8Z^paF-ntZUWmfKqSZe^EPah^P<R4OK,=A]JoagaC-60!%%!DX_l./MYJK_^eiuh]f0dabgX&SVc'(!9ko.`6P_72o`rV,8EKGrI%(DZ[KD#r?16o0S<ZS-24)gZ9ZS5>6-%r$'A9f*5'3Op82)p6MI[-oRE#ce:8kT[['.(qE0K?:g$]s7VQrdmKH5VP($lL@oJ5VXcdMTQjn?HV2LLiGKF`#Sj!45mKX$a;R;-]=Xl^i,FMdTg))oVpH:GS5Gpo'd)FIrSB*GEU'SD>eV?B*MQD$Vpo.^#NVKD%6l5r-)S5s@7qLF^UAl.YCN<8kO7KB]qrnL\i+42SMNO9tBVQhS6f(IguXflm^q/6Y_B'Sc`_g-[q]7":P\3ghYKhq^g&P2(c+cPV-$X;()+ZLoHLL?:""IGS7L%-oWSqg'1HDo28MnjSl/.Q!8OK(b3?dGcq\lFd/#a]^YSA?Er+=<EsXMY3*I8%RS=+9e7oFJSJL$Tlg:NA"Js-,%iUCRVDCId%lV4W?r80BIoT#:!\b<kW_B+hW:)1\Mf35Q)#d/,K5+8i7CXP\:V^qF5\#L&-B;bK"QGo?aG``/)leTf'[9L0!:^Oe\\)M$f91k7h7jTAYiD_MeHh[s#i]+tik\e+.*#&7!@__H:LY1Dc@Nbei:o;PqssFQ0*[6sl");sC&LiI-,ChJiOs5600CbA.~>endstream
endobj
26 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1820
>>
stream
Gb!#\gN)%,&:N/3m-%$d=:i7U8@l)fNK[$uj2oP\q@Mb>Tcf0u8Z3oqbBWsR?'#ak.ZU>^SM[pF`!Y.&/9]?BRK:Ad/,r'f^sa`k?8,b&9GbJaikY0fSkj]_pP?d?cZ+Ng5.(J#87:a"jNCj6/gicc!X:j]M!m@^pl+usi.HaL4HFcL$WoOU0d%O8T'l[LREL$XeU!^(b<jYfEB+PQf@U#tg:`%+g,jD_qOfU6_<O`4XgUSFF$1>:.1BOrIX_h\j\cf?9$.;9<4Rfc$>,Uc_&qk09O*EBY!mdBe'B^rU(+Jo3o%b-E3H>7655-:Mb;*\E#E:3GV');0nNU=goB1N"%HN#@i2%*_C,dOL<!Q"0^J6#0V64';'&!VF$-W5XcXnma/=5l,;SfPKK@Uu9Dn1IW+TYbAV@WI.odITNNqY)Cm?g.XX4nrN!*-<K;?PDkPMBRBqpVF[\=g[S4R[-I')!Z]4l/XhPsZ>Oa^BP4aQ'P;!'8SI[q(Q!t.Y-0oKO:q]t[@;k@&mgh%-L2HchbRDDe"2_ms^fjJt+G7Pe.dDJ(54W9Q2!$[gG$F@'h;[BSE=M[>&BJgb$=%]TQPL1d`a$e^9krKD%P3HY^/bP2!g7^--gi[?n!1C>o-ZFjLY/2HULJ"':Vf7+oUCfn&Zk@[eM!/il!M4r`pfkH+Z_QD!?[rGkQYBVTaG&@/RGK[o>f]ToCl\W=&BF<hX&O'<pfuE$97lE=hk&r>K\N)*.MOgWR4FY_7CYo'm%!E8R>O@,e[C<I>F+/,eafN[\[I]4c]0TY+cT^^OH&r(Mg2;toWGj^_e?>Gh=eE!^P>[?gBLXh[TNd_]@SZ5;CL"&oKjd@=\<6K%F3+tP%tejU1<p`b7:BbK#KBnB*^U`A(58RRHkN$iQL/I)q:(1#=bHXbR=oO)$t/EdDja5`j8F[esNec'?$.C$r3J1OEi++jf#?j*U4I#"nGk9Ag0V!)q:]?48Ou5mMc!=1`<'%nbhr`7?8s]j"*HMjKpm/nK6Us-AP.)H$=bG`CrlTgN$n\gJ$TWdFmQt8^(J(`'7Ehk8Bd9Yn$>m9\30tH[cd`bX-dK^&Pj)QlQb#"ME1u362;oqFt&Lf[Zdp/(dJ:Y$a>)\q7&;2Tf]ClXtDFD)Uj$$3="L@f8HOggTA*/LflnE;fCI6:C*@hd.c`">#-n/lUus,)l5qD3ORBN*PtH@Cuu=jp*SHLR#?-pAo%g4N8^74i<bMaF2fkbQc`I8bOoHS%hh$#mbjQI6*qcF/r%&\rO8UP]!6cg:R@NLa]@gfc\o3Emo^ZH0tQ:?["IO)lX>is!>'ga5D.YY:"PjQ6<t[`;OqfT"p2K?H@(,B1kRIQMm.lDZu/P$iQ:oe`RkOL%Ra48%TD,hFj8(S10S1DT5b_'!WYMH3%)e#h(KFPE3GngPs9m&O=+P<'c,HOCP6`".=jWl?\Jo4aVDTT(R9DUCW`_ST"\=j\qgPm3EfnWGWB.0r..0mr<@gBCc5<[-Wedh\Eo.)-nU>:1A?->f8YRdFmV-Q@5-XCRKYqa9#dIB[5-m%+i%=]Mu?F`/k.n&H*.Z4Um</3hVIB%%k?brrq+9mLcW*fbOU.>od8I08<*0a6H79"!c1rA-Rd=N.a+3BOg?U'2TY:`q/s4q$2!&'rK8jJ!#O+^nOM\@3fr[_D5@,*RN\>bMi+$ItM!DZFQ>5P9gpDE%\?kPOF+:n]GV$<7o>&Xd]G/1/l(d17:KY>3=f20VGd;Gq"nEN^kU8O.@;e*3[+4;ku#$Y1EQ<b`fSlaMSU14Mn$kp;*QnR[jB)3dN.\m,\SMfpu;uhERm0J=Z~>endstream
endobj
27 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1686
>>
stream
Gb"/&>Ar7S'RnZ;3!_4RBks05,Z;bt"7$CJ;"T?ch8?l1=f*4IZKUS:"tfE'G=5$0i];7o'\ONC)mMfqI-8B<I6(h&n\`TNGQmS]!i+oe(l-37Qq'9+]Rjc0kHdOci6q4J\,g_>%O?/^5KK0d#/23(j<9/+8eOZ*]RZ+e#Qs!u-RFt<.p+oQ(_A-p$p5X5o0je9ZZh8a**mp0(F%YCDrV5jn3S>QkV16CMdUc7CQl'&Y"'o3V%8b)$sp^En.K'kV(1JGX],#.bZ0$s_N]*J^V,;ul9_=nXn#thI"]Uog-H8!'*4sQjE8gNW[LKQBL(EDb9VugkQ/?6$?c],[p_itM'$1YifukJAYHp1f\`RMFa4t.-fI7lLTke].@\c>[FF^J=rV@FD#FO2*gQ\hTXuRpm$c*,89]eB$sTAlFTkmFG`6h=:[0VXK>9$8CI;m=fV'6C.A#0?>*D[NS&<l=G>*eAT4T<<cTMP.-W1SaHemG6OG'-D@=RU&31VE5&>rB&]T-%Xm&3mMjfhk'C49V%B2P?F>rF(pnn<Eg-J@5fGgpTYB8;r!?$$o42;rOJPKk5m&i:q^LssP$@OX#1d<"/Q)X7d/9Zh,op4IH)nJM^:cPJFq)o1-Ln>C"5<G;bPYgTj'<Aus**n1#0VXsID?is?:70D;f(C%Cg#()Qr!&H.#=fTW"0HE[rX=kYjO8!42O%K>G*3jR/j>^5[Vc'_a,T5_#mO[747:Kh!n=\ClKJg;Xs5'9XB6#s/*5'W7.XqR/*EU3)Qq-tM)_5@qqZ/(I-iF!Un0cB:X=?l6op'L)*6uu)%=Lk-]\]NLDFNK@fs-`'ad,;3p<?p/Phr@%Rm$C,]8(UtTg,8&;^r"\W73>Bo)AS>HH<e^s2SY(%"EgZ;'fb!Sh(11:-O7I$)2R,QO9H<=[cnr1Ml;XYL]\a<)BMm`MLifBF3p@W;u\3(00*>F[ddho.!c$(7B/Y7us.`G2D-\^:iM!dNr_obq-i'd'1@EQ&b"Z#4N1qjgi[1.&0ZTLBI3sfoP/g/W_kFOKuAYm+@T;R5t:iq%/][-@E!M,,/\G1_Xj2/m3ObNPM^HMIKA_Y1OK#!M^T@pFJ(k:P:5#,;Q#+11WOOlSKX\REY[LmG>8l.'?4=bBX2b0%W-;nKHHl,E"%0CU/)B3#t\RiS/goRNqKPK#%P:="(+3KC)gGiNX<(X0b\nj0$eqp^&+A,J8I&l[D?PNP.@uMQSVE`n^<]B=f5W'<O&)TF)DFV$C@-i(GSYlY*8P[1):nA[Q,%3sFmrL-bGX9$6VbKVZ,3gpfK%`-aKVX'.])7q(Q?O^S1i%Ps%m'NF]bN'&=Y@TFL/';E%Z7UT;4%bhZ?@Cnib@!(GpSiP"W]H"0&FR`4^019fK?nWN@BRY\g@OQr>QaPtL0cbWDZi,rHMZl:IY>,R)Qn_12UgZo)@sudu*=@^67;F@=aH$g,^rXOK(bTnc5=B6&CK_7aL=M(0#5c:14ljF:[@%Nu>G6:g?4cVW$B.*,pY2?ke;fp(6*#&jI\YKu(:57;8ehM%_U[lVYO%&1Mg(*1cA=T/Os]^sZYu^e=6$d#T%.;Ff/OUI?VX,9I0]8Fah!$F*R8Xt];N\6;h>n4Kq5IGn6G`3b*HVfM$5.BpA.ho\ZTls/?2j@X4tj:N/E&eG>cpaQc"N[ZM=u1"m9gDEd/H~>endstream
endobj
28 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1906
>>
stream
Gb!;d>Ar7S'Roe[35AkU(840RP,PN#d*%"F.(U16gP9>NMT".>,Z9okUtr9T^-h0pg$pB6\dYj'.&*ZXmp,YXS3t-/0=?:n!oVTC-H?h!$e#KVN%gX5K3tOOY9W$2DTI2J*d>9<"VQ+C"4_35_%0'J\If#5KS5*h(oN&YLkCWSKcpo!&odA_7"L#B'64;1;a93VXnOsk\1TDYL`ZcIqYMj.DW!r/B[J!Ik(gfm#&TXjV0\([e.6tp(,14;gZK5pX(J)$k"=b)8QR+(CH-Ck&71sD)f[HM<Jp&J9J9iNe1<9bao[SQ"Q?B-GG;7J\nHbELhE-7+W:X]L_f>&"E"STeL.&q<`4k^F_DJ^H2;;dAn.DEg69$1N^lp)=;WrnmDnc0j,SD)3RleJ+:`J0i<\o7,boh4pX(#2ENQ0WN"a7N%s5\eW1DE_kXSJ!ng5GU</V8.4%j#-Eiim5/A^Cldpm7P?YZqF2]9k12NH"jEVJO]6"K$++hWejJ\rZE\^V)(o18)U0":fmhb$m_8B"$1a>I3RA>1k+iP![[C*D'4n_"TNCNBW#!aRXI#u2u^0L5<*P42pUIpigkM$04Q%5W"+A1HYu$-r<k\*36p,lbP:N(cXJ@J"[jbsB7@"DTm#h:@T@'62c621tGb"ibB[#4]*!'jBZo!L6i%6"!l-Z^Ibb5kGhFZ#h4#/-goET69_F0Gcb;+0krq1N_EH0)'_qIIdTnkpPiYTG=l:i?lT9,F0`_COe.9"?nHDjQ_B?o>X"9e?#b$V+<FJa0O)V(\N7<I`)K,%Q+"u!U"3;,@kFf[kh<Nn!6["?@f9oREU]NZ>BG=99JB=8s/5'S-_dF<6*,2F*K@PBl[@o1RNVE`G&4]V)C8PQJZ4.]n:D(E5hOXZ1[s9h=dqZ4gTL`m`=pb=Mp-^mG"Ui2Z=9J2Pb0uD1^6#3"+C>Naj/T"ONRYS6PB+e\0;&gDP3pStuXNbU.Y]BGbUjku$G=b3<<9hVB-)doGA)a;q+:^d1A+>n*2ZGW:tSCE95!>?-J7SdER](TJqbBa0D*r=5[WJ/TNK=$l=Oe)Lt:k&RTAe;UFb;5m*g;FbH&A&tJ%W704jM[]@Bff50cKd]pnI7Kf;WoQ:4[`c&gde8[Ia<*o`F0&LG17FLL@;Sm.!VO$j>+_'LnjJ)0Y4*FP@Q7_.XlN?B,9*EXEci,;\aaI;@kBT`n`)M?AM!Ub,l1[*aREo]TP#V7`07@K1QY&]]<J4MnGBKS,G:Q*;-d\C'&-BgDSl!K+j\Yro-15N*.?UQo1m9($.NT1Wlc=\-5s?@/!#9[0\OS5H(05uVj#0F,OI4'o4U5lcK!W_s-5(@i=<2$_aCrO@m;RHHW_Zd9Oh,.=B,/r5Dk^Tk;<&8.oY_%KX*!C<i2*YiWTh\.oXU'Al=\_+#0$pJ(%JrrJ7cojt,,1i6%;4O>rpIfl@TZqoS9cO?,S!J`$=W?X7(kV<i!*eL+bQ0r!uPYkIl!qIIjB-@'c;CO<"Lnfat8ZA_N:p(XVMRNgbc^kF<+d2?6Yq$a$HZg;OlTe!>W5kB>gril]&&.uoAG7R.FpHl7T\"B>8_k>>ZYAF?I)mg\"@mPFFHP0>C8d_Q`4_A+d$+u?aJ<*BXI#J*:C6dCrL+&N.DPPc`)Z)mGfGj[JTjt5SG!iI@.#O;$BM\6aT_7pCI#f5%c):FBX?$2T^GV07l)LDr/%&ECf[nlP53i`R[5JESHi#?Am@aoT(1MlHag5\JXLGKo79[X=\h9s6EKW>:dcmKB:@t^t;.V'V[iH>HkUG>d.dbFQ0p_@o!cq4YKX$nn^I-%q17+@;[&k9:SY1?/Djt1=.OF2:id9%7a!JXen:KWXZaK1+3-S;CF<.Yd-2$la4\W!$qY=YGERn\q<&L/4M-I8E)#XPKWlD(~>endstream
endobj
29 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 654
>>
stream
GauI2?#SI?'Sc)J/'_^0.2X`Cgq3!L>,A0%4)\32nJpOJEkhd?D?#([,AF`fdBZ=uQ>b]okC&tT$/i$YpFXqrD_d.:#S7?r!XM.%Z73H47c-^lE[k/m.$chf.A/M8+0ait6c'F2BhCX"JYZ\h,XG>*&nn3WJdARf(=sc488p+*"!gIT,sSDj&Z7ImAglV#rNgtB-X1pHie+jNZ[[U03'i9qHe"K,9G3IQ[YF=ia057,_3E(W94M`3iiO\r*bLWD\@mZAC9)*u.!l-N$F9!+_1=#p%)kVlQ_IF?S2Z@4jATAc3X:6I'HR@n,@?sN,SSB'qQPskm63iq"PaH;mROL^QQV$G'14daN.JA`UH?'9m)D)X&KtI_4>[ohPRo%\^=TVt0Cp`Qkj[:=`j\YE:M/XPKh?]-DRrTh\]1lG^2Z)/Ut&8UElclgR[_/_H.,0Xo"NQ6`;/2721O/Q$ns>i@b9p>'VCZH"q5Fp\hRB&n,A56j>shCY32"CY(GN+fINQo(!FdOg@[K?<0gVYO%R`,bFjjp3[[.^/=]'NI0](+G)@r>IFmf/ljmOqB]WX%EiWV,%R5rYH/U9]QsK[@KrNhL;\1S&i1CRjANhbh[&HCirKW,KqIXgGlP,"HL&0Ns/f_EKlkYP/"5-\MMu~>endstream
endobj
xref
0 30
0000000000 65535 f
0000000061 00000 n
0000000132 00000 n
0000000239 00000 n
0000000351 00000 n
0000000428 00000 n
0000000633 00000 n
0000000738 00000 n
0000000943 00000 n
0000001026 00000 n
0000001231 00000 n
0000001437 00000 n
0000001643 00000 n
0000001849 00000 n
0000002055 00000 n
0000002261 00000 n
0000002467 00000 n
0000002673 00000 n
0000002743 00000 n
0000003028 00000 n
0000003150 00000 n
0000005131 00000 n
0000007050 00000 n
0000008887 00000 n
0000010521 00000 n
0000012607 00000 n
0000014059 00000 n
0000015971 00000 n
0000017749 00000 n
0000019747 00000 n
trailer
<<
/ID
[<2814d2269da3e51bbaeeb9604badd1d5><2814d2269da3e51bbaeeb9604badd1d5>]
% ReportLab generated PDF document -- digest (opensource)
/Info 18 0 R
/Root 17 0 R
/Size 30
>>
startxref
20492
%%EOF

Binary file not shown.

Binary file not shown.