diff options
author | Johann Faerber <johann.faerber@hs-augsburg.de> | 2022-03-09 09:48:43 +0100 |
---|---|---|
committer | Johann Faerber <johann.faerber@hs-augsburg.de> | 2022-03-09 09:48:43 +0100 |
commit | a04bbf15b0f51696894e37f3e566998108aefd74 (patch) | |
tree | 35a36178bfb2fa257b0afcddaec29868f6e4fc77 | |
parent | fd7c3d6c1352353f3ee2da9267308a51fd67315d (diff) |
added basic design directory structure
118 files changed, 11175 insertions, 0 deletions
diff --git a/doc/datasheet.yaml b/doc/datasheet.yaml new file mode 100644 index 0000000..a8aae06 --- /dev/null +++ b/doc/datasheet.yaml @@ -0,0 +1,26 @@ +--- +title: Pulse Width Modulator +subtitle: Datasheet +author: J Färber +date: April 2022 +lang: en-UK +geometry: a4paper, left=25mm, right=20mm, top=20mm, bottom=25mm +fontsize: 12pt +code-block-font-size: \scriptsize +titlepage: true +logo: images/uasa-logo.pdf +#toc: true +#lof: true +#lot: true +#toc-own-page: true +colorlinks: true +secnumdepth: 4 +header-includes: +# 4th level header rendering +# see https://stackoverflow.com/questions/21198025/pandoc-generation-of-pdf-from-markdown-4th-header-is-rendered-differently/21204829#21204829 + - | + ``` {=latex} + \let\originAlParaGraph\paragraph + \renewcommand{\paragraph}[1]{\originAlParaGraph{#1} \hfill} + ``` +--- diff --git a/doc/images/uasa-logo.pdf b/doc/images/uasa-logo.pdf new file mode 100644 index 0000000..6ad508e --- /dev/null +++ b/doc/images/uasa-logo.pdf @@ -0,0 +1,2737 @@ +%PDF-1.3
%
+1 0 obj
<</Metadata 2 0 R/Pages 3 0 R/Type/Catalog>>
endobj
2 0 obj
<</Length 59028/Subtype/XML/Type/Metadata>>stream
+<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27 "> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + <dc:format>application/pdf</dc:format> + <dc:title> + <rdf:Alt> + <rdf:li xml:lang="x-default">Druck</rdf:li> + </rdf:Alt> + </dc:title> + </rdf:Description> + <rdf:Description rdf:about="" + xmlns:xmp="http://ns.adobe.com/xap/1.0/" + xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/"> + <xmp:MetadataDate>2015-04-28T13:11:41+02:00</xmp:MetadataDate> + <xmp:ModifyDate>2015-04-28T13:11:41+02:00</xmp:ModifyDate> + <xmp:CreateDate>2012-02-03T04:14:54+01:00</xmp:CreateDate> + <xmp:CreatorTool>Adobe Illustrator CS5</xmp:CreatorTool> + <xmp:Thumbnails> + <rdf:Alt> + <rdf:li rdf:parseType="Resource"> + <xmpGImg:format>JPEG</xmpGImg:format> + <xmpGImg:height>155</xmpGImg:height> + <xmpGImg:width>256</xmpGImg:width> + <xmpGImg:image>/9j/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAxAABh
Y3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLUhQICAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0AAABUAAAADNkZXNjAAAB
hAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFla
AAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRs
dW1pAAAD+AAAABRtZWFzAAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAA
CAxiVFJDAAAEPAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQg
Q29tcGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElF
QzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAA
OPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rlc2MAAAAAAAAA
FklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5J
RUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5J
RUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYx
OTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2
Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPtzAAE
EwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAAAAAAAAAAAAAA
AAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3
ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEA
xgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFu
AXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQC
XQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOK
A5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4F
DQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbR
BuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI
+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtp
C4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4O
SQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFt
EYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAV
EhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6
GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcd
cB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yIn
IlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kn
eierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0M
LUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0z
RjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8
Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA
50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhL
SJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQ
cVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjL
WRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh
9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tP
a6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1
hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/l
gEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqL
MIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaf
lwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopaj
BqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+L
sACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9
Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3
yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZ
bNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy
6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4
Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t////7QAMQWRvYmVfQ00AAv/uAA5BZG9iZQBkgAAA
AAH/2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgTExUTExgRDAwMDAwMEQwMDAwMDAwMDAwMDAwM
DAwMDAwMDAwMDAwMDAwBDQsLDQ4NEA4OEBQODg4UFA4ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwM
DAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIAJsBAAMBIgACEQEDEQH/3QAEABD/xAE/AAABBQEB
AQEBAQAAAAAAAAADAAECBAUGBwgJCgsBAAEFAQEBAQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAQQB
AwIEAgUHBggFAwwzAQACEQMEIRIxBUFRYRMicYEyBhSRobFCIyQVUsFiMzRygtFDByWSU/Dh8WNz
NRaisoMmRJNUZEXCo3Q2F9JV4mXys4TD03Xj80YnlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vY3
R1dnd4eXp7fH1+f3EQACAgECBAQDBAUGBwcGBTUBAAIRAyExEgRBUWFxIhMFMoGRFKGxQiPBUtHw
MyRi4XKCkkNTFWNzNPElBhaisoMHJjXC0kSTVKMXZEVVNnRl4vKzhMPTdePzRpSkhbSVxNTk9KW1
xdXl9VZmdoaWprbG1ub2JzdHV2d3h5ent8f/2gAMAwEAAhEDEQA/APVUkkklKSSSSUpJJJJSkkkk
lKSSSSUpJJVOodSx+nsa67c4vMMYwAkx9L6Ra32ps5xhEymRGI3JXRjKUhGIsnYNtZX1kZY7pu5p
Iax7TYOxafZ7v7bmOV7Dy6cyht9JOx0iDoQRo5rgpZNDcjHtodxa0tnwkcqPNEZsE4xN+5A8JHj8
q/HI4ssTIVwS9QP/ADmj9X8l1/TmteS59DjWSTJj6TP+g5aa5n6tXuqzbMZ+htbqD+/WfcP81z/8
xdMovh+X3OWgT80f1cv8D/0FfzmPgzyraXrH+EpJZ9vXMGrM+yOLtwcGOsA9gcfzXOnd/wBFaCsQ
ywmZCEhLgPDKv0ZMMsc4UZRMeIXG+oY2PbXW6x5hrAXOPgAJK5voD8jJ6rZkuc7Vrn266Hef0dZ/
qfmf1Fp/WHI9HprmD6V5FY+B91n/AIG1yF9WcfZhPyCNb3mD/JZ7G/8AT9RUs5OTncOIH04gc06/
5v8AL+u2sQEOVy5DvkPtx/a7CShddXRU+607a6wXOPkFV6f1fF6g57Kg5j2CSx4AJB/OG0uV2WWE
ZxgZATn8sesmqMczEzESYx+aTdVDreU7G6da5jttj4rYRoZdpLf6rNzlfXO/WnJ/SU444Y02uHmf
ZX/6MUPPZfa5bJIGiRwx/vT9LLymPjzQHQHiP+C2fqxXYMS17idj7IraeBtEOc3+s5bKr9PxvsuF
TR3Y0bv6x91n/TKJkX1Y1L77TtrrEuPKdy0PZ5eEZGuCNyvp+lJbnl7maRjrxSqNdf0YpElS6f1b
G6gXtqDmPrgljwAYP5w2uerqlx5IZIiUJCUT1CycJQkYyHCR0Kkkkk5apJJJJT//0PVUkkklKSSS
SUpJJJJSkkkklKSSSSUpU+o9Mo6gxjbS5jqySx7YkT9Ie4Ob7lcSTZwjOJhMCUTuCuhOUJCUTUhs
UGFh04WO3Hpna2SS7UknVznI6SSMYiIEYioxFABEpGRMibJ1JeV6h/k7rnrjRu9t/wDZf7b/AP0a
up5WH9aMcOqpyQPouNb/AIP1b/0mf9NX+i5H2jptLiZewem/4s9n/Sb71Q5X9VzfMYOkv10P8L52
3zH6zl8OXrH9VL6fKjt6DhW5n2txfJcHurBGwuHc6bv+ktJJJXYYscDIwiI8Z4pV+kWtPJOYAlIy
4RUbeZ+s15szK8ZmpqbMD9+ww1v+a3/procWhuNjVUN4qYGz4wOVzWBPUeu+udWb3Xf2We2n/wBF
LqlS5D9Zk5jmP358EP7mP+UWzzfohiw/ux4pf3pfykjvpryKX0Wia7AWuHkVV6d0jG6e99lbn2Pe
Nu55EhvO0bWtV5JXZYscpxyGIM4fLLrFrDJMRMBIiMvmClyjf8o9fnms2z4jZTx/n7P/AARdD1LJ
+y4F94MOa0hn9Z3sr/6blkfVbG912SeGgUsP/Ts/9FKlzv63mOX5fpxe9P8Auw2/7ts8r+rw5s3W
vbj5y/lB6FCycerJofRaJZYIMaH4hFSV8gEEEWCKIagJBBGhGoaPTukY/T3PfW51j3iC58aAfmt2
hqvJJJuPHDHEQhERiOgTOcpyMpHiJ6qSSST1qkkkklP/0fVUkkklKSSSSUpJJJJSkkkklKSSSSUp
JJJJSklXz/tf2O37HH2iP0cx46xu9u7b9Dcufj6zf8P/ANBVuY5r2ZCPtZMli7xx4os+Hl/ciT7k
IUaqZou91LGOVgX0AS5zSWf1m+9n/Tasj6rZPuvxjw4C5g/8Ds/9FIEfWb/h/wDoKXSOn9Sq6lVc
+l1bBu9RziIhwP7p/f2qjLPLJzeDLDDljX6ufHHTgn/3vFJtjFGHL5ccsuOV+uPDL9KP/fcL0ypd
ZyPs/Tbngw949Nnxf7P+jO9XVkfWHFzMmmluOz1GMeXWNETMbWO90fvPWhzcpRwZDAGUuEiIjrL1
en/mtLlxE5oCRAjdm9vT6kP1XxwK78kj6RFTPg33O/6Tv+gt1cpVT9YaaxVSy6utsw1uyBJ3H/pK
cfWb/h/+gqPK837OGGP7vmJiNSIfpH1Sbefl/dySn72PXb1dBs9Qksrog6t+l+37tmnp+pt3Trvj
Z+Z9H6S1Vo4cnuQE+GUL/RmOGTSyQ4JmPEJV+lE3FwvrRkBtVOMD9Nxsf8GaN/6T/wDoK/0XH+z9
NpaRDnj1H/F/v/6LfasrrvT+oZGebK6TbUWNawtI0Anc10lv57kKPrN/w/8A0Fme9LHzmbLPDlnp
7ePgjfpG5/wm97UZ8tjxxyQj+nPil+kXqEly8fWb/h/+gt3pn237FX9u/n9ZmJifZv2e3ftV7Bzf
vSMfayY6F8WSPDHyaubl/bjxe5CetVA3JtpJJKywKSSSSUpJJJJT/9L1VJJJJSkkkklKSSSSUpJJ
JJSkkkklKSSSSUgzcqvDxbMmwEtrEkN5MnaP+kVkf86q/wDuM7/PatXqN5x8G64VevtbrXyCD7Xb
vpez99cz+2Kv+4GJ/mf7Fm8/zM8WSMY5hiuN8Jh7nXfibvKYI5IEnEclGr4+H8Hd6Z1qrqFz6RW6
t7W7xJBBE7fzf6y0lidA6gMm62tuLXQA0ONlLdomYDLNPpa+xbas8nkOTDGcpjIST6hH2/8AmsHM
wEMpiI8Gg9N8akkklZYXP6n1irp72VurdY+wF0NgAAacuVH/AJ2Y/wDoHf5zf70T6yYdtldWXSJO
PO8ASdph2+P+Dcz3IZ+sWD9m3jH/AFiPowNk/ver/o/+mszPzGWOfJCWeOCAAlj4ocfHH9LhP95v
4sOOWKEhiOWRJjOp8PBLpbf6Z1erqLrGtrdW6sAw6CCHTwW/1VfWN9WsO2qizKtBDsgjYCIO0Sd8
f8I562Vb5OeSeCE8vzys7cOl+n/mtbmYwjllHH8o076/pKTeSdYvVeh5OVl/a8e0B8AbXkt27f8A
R2M3bU/PknCHFjxnKb+UHh9P7y3FCE5VOftivmri1dpMuaPQutWjZbcCzwfa9w/zdq3Om4RwcNmM
X+oWyd0QNTu2tbr7WqPBny5JESwSxRA+aZ/S/d4V+XDjhG45RklfyxHTvxNpJJJWWBSSSSSlJJJJ
Kf/T9VSSSSUpJJJJSkkkklKSSSSUpJJJJSkkkklKSSSSUpJJJJSkkkklKVb9nYHqer9mq9SZ3bBM
/vcKykmyjGVcQBraxaRKQ2JF9lJJJJyFJJJJKUkkkkpSSSSSlJJJJKUkkkkp/9Tp/qv9YOoZf1l+
seD1DKa7F6fdWzDrcK2bGudeHDcxrH2fzdf8456k/rvUD/jFo6NVkh3TH4BvdS0MINm6xu71dvrf
Ra32eoud6J9WOh/WH64fWlvWMb7S3FyWGkepZXtNjr/U/mH1bt3pV/SRsDofTuh/4zqcDo9P2al3
TX2hhc+weo4vZv3XOsf/AINn5ySnquofXn6p9NzjgZvUq68oHa5gD3hp4222VMfVU7/jXrVv6n07
HwD1K/JqZghjbPtJePTLHx6b22Tsf6u9npbf5xecfUfP+qWJ9Weo4X1idTV1EW3DqtOXHr2kE+2t
r/097mRs9On9J9q9T/CWLIZTm0/UX6uXdVY53Ra+q+rk1kF36sX+1z2N93pP/XNn+k9ar/SVJKfT
+i/W76udessp6VnMyLahLq9r63x++2u9lT7GN/fYua+qn+MXprPq9iXfWfqjP2jkPt0DJeGtftr9
WrCq/QN2/RfayvetOvq31HyvrR05mEKcvqxpsGNk4kWMqra2PTvsod6bHOr9RtO9v6H9J/Mev+m5
v6l9J6ZZ/ixz8mzGrsvvpynWWvaHPJqa9tG17vcz0fTa+rb/ADdv6X+cSU9/1Dr3Rum9Pb1PNzKq
sKwNNV+7c1+8b6/Q9Pe6/ez3t9Hf+j96D0X60/V/r24dJza8l9Yl9fuZYAIG/wBG5td3p+7+c2bF
wDcLBy/qh9U7n9Xq6R1TGNj+nPyAHVPcHeo71A/2V+m6in07rP0X+A9PffWjYPWOs5PU+tdKtZg5
/WbOlXGrqvShNhcxu2mi272e/wBR7PoMr9O30P5z/BpT19n17+qFfUT01/U6W5QdsI93ph37rsrb
9lb/ANvLJyfrgel/XjqOJ1fPbj9FxsJltdb2t/nnGn+bLGfarrNht/RN9RYnRer/AOL2r/F5Rj9T
FNwZDsrBaR9qfeH621s31Xu/kXeps+zfof5v9Er/AE7C6dmf40ckvx2upo6ZTbi1WsLfTP6vXWfQ
ta11VtdVmzY9m+pJT1uB9Z+g9R6bd1TDzGW4eM1zsiyHAsDRvcbKntbcz2e7+bRbOu9Jq6QOtWZL
W9NLW2DJh23a4hjHbdu/3Pd+4uCox6qMv/GLjYtYrqGK3ZVWIALqMp7trG/vPe9VOpfWPorv8U1P
TK8yp/UH000fZQ6bQ6uxllu+r6bK211WPba/9E//AK4kp6zqHXs5v12+r/T8TI/yZ1LHvttrDWkP
21W20v8AUcz1mfRZ9B6v9V+u31W6PmfYeo9QrpydN1Qa+wtn6Pq+gyxtP736Vc1Z/wCLf6l/+m+3
/wBtrVhfVq23GPWsTP65h9HzH5V37QozsWu514P0z9ovup9ep7jd+qM9T/Tf9qUlPrVF9ORSy/Hs
bbTa0OrsYQ5rmnVrmPb7XNciLl/8XGPiY/1ZZTg556nhtusNF5pfjwCd1lXpXue522/1f0i6hJSk
kkklKSSSSUpJJJJSkkkklKSSSSUpJJJJSkkkklKSSSSU/wD/1fTcfp+Bi33ZGNjVU35J3ZFtbGtf
YRJ3XPYA6z6bvppHp+Ac0Z5x6jmtb6bcnY31Qz/Ri6PU2a/RWL9cvrhX9V8bGeMY5uRlvc2vHD/T
Oytu+63f6d383NTfof4RbHTM+nqfTsbqFH81l1MuYJkgPaH7HfymfRckpr5v1b+r/UMn7XndOxsn
I0m22pjnGBtb6jnN/SbW/vq9bjY91Dsa6plmO9ux9L2hzC3jY6t3scxESSU0endC6N0ovd03CoxH
W/zjqa2sc4c7XOaN2z+Qi0dM6dj4bsGjFpqw3hzX4zK2tqIf/ONdS1vp/pPz1ZSSU0beidGuwmdP
twcd+FVrXjOqYa2nX3V1bdjHe530FLpvR+ldKY5nTcSnDbZHqeixrC6J2+o5o3P27vz1Qy/rKMb6
14P1cOPuOdQ+8ZO+Nuz1D6fo7Pfu9H/SrbSU5x+rnQDn/tE9Oxvtu71PtHpM3753+tu2/wA9u/wv
84rLen4LMx+ezHqbm2N9OzJDGi1zPb+jfdHqOZ7Ge1WEklIKcHCoyLsmjHqqyMmDkXMY1r7C36Hr
WNG6zb/LVFn1U+rFfqbOk4YFwi0ehXDhIftI2fR3sY9aqSSmt+zOnevRk/ZafXxW+njW+m3fWwjZ
6dL43VM2HZtYq+f9Xeg9Svbk5/T8bKvbAFttTXOgfRa5zm+9n8hyfrvVf2P0x+f6Xr7LKa/T3bJ9
a6rF3b9r/oet6n0VoJKY1111Vtqqa2uutoaxjQA1rQNrWta32ta1qkqPQ+p/tfo+H1P0vQ+11Nt9
Ldv27hO3ftZu/wAxXklKSQMHJdl4dOS+mzGda0PNFw22Mn8yxo3bXo6SlJJJJKUkkgMyHOzLcb0b
GtqrrsF5H6N5sNrTXW786yn0f0v/AB1SSk6SpdI6pT1bAZnUsdXW99tYa+N002WYz/olzfc+lXUl
KSSSSUpJZfSerZfUsjLIxmU4ONfdjV3G3da+yh/oWudjCr06qXWNs9N32r1PZ/NfpFqJKUkkkkpS
SSSSn//WsdZ+snQT/jIdZ1vJ9Hp/SMWzGpG19gffc3Zk+yhljv5nJsps/wDC6f6ldXa/6hde6ZTe
bHdJqyvst7ZYTRYy63Hvb9Gxj/Wbkfy6vYux6F9VOn9GObYHPzMjqF5yMi/IDC4uMuhvpsrY1m99
r/8Arigz6ndMZ1vP6sH2R1Sg42Zh+0UuaWsqc6GNbY1+2v8A0n59v76SnnMjMyW/4nRl/aLBkHGr
/T73b9xuaz+dnf8AyFWzrMnrXVfq19WMrMuxunZPS6srINTyyzIs2P8A0L7fdv8A6Pv93/C/4T0v
T0W/4qcH7I/p9vVuoW9PBLsfENjRXW4nd6np7PSss+l/gmfTel9cuhgYnSsV3R7usYOFW2g5WLZs
zqdgrZ6lVTNrMj1G17tm30/UZ/gf0aSmt0jCs6R/jFPSMXqF+ViV9NdZVRfa6wUuc8bcd43fmfzt
f+E9G9c5azJwar7frXjdbxurtsn9vYtjn1N3H9G1kPpxWU/m+nU//ivS/mWdF9Tvq28fWW7qmP03
K6T0pmI7Gb9seRlX3WOa+3JsG99tLtv5zH/4Ov0f8J6Wjb/i49Wg9Pd13qLukvdufhve1xOu/b9o
czd6e/3bNiSnH+sGLT1z68/V7HozrmY+Z04uGZU707rKtt93se1tex2VW39J+j/m/U/Rq30am36t
fXa36tYuVfldLzME5bKbn7zRYHPb7X/mtd6b/wBz+dp9T+b9Ra/WP8X/AErqeTh5DcjJwT07HbjY
YxnhvpiuTRY2xzX3b6p/0iP9XPqdi9EycjqF2Vf1LqeW0V3ZmUdziwR+iYP3PZV9N9n81Wkpwfq1
mZL/APFLk5dt73ZAxM8i9zyXhwOQKz6hO/c327Fl9St6pk9D+pFGLnXYuRnO9J+S17i6Xipvqv8A
c31nM3e3etxv+KvpzGZGJX1TPr6XeS8dOZaBUH/mPeC1zbvSc1jmeoz/AAVXq2WrVP1KwDT0Or7R
dt+r7w/GPsl5Gz+f9n/B/wCD2JKeZ61011HWOg/UZvUMmnpN7L78nIdZF+Q9zrr/AEbL2tY13vG3
Zt/w3+Eu9FE6dgHov+MnD6Pi5+RkYAwrLWY11zrBUXep+hiduz2erXv9/vWr/jC6c7Npw/U6O/q+
LW93qvxbDXl0btn6XFaP5/dHvpd7N9VX/G1ZH1Q+rtjfrY3q2J0zK6X0zGx31l/UD+s332fTtsrc
+xzPY7839F+h/wCESU9N9eyB9WbidAL8Mk+Qy8VdAgZ2Fi9Qw7sLMrF2NkMNdtZkS1wg6thzf67F
iH6s9YsrOHd9YMuzpxb6bqzXSMhzNuz07OoNr9T3fn2+l9o/4ZJTk9Oqy7vqx9UMOjKuwftTmsus
odtc6r7HmXvr/wCuen7LPp0v/T0/pq61r4LX9O+tR6VTddbhZGCcr08i6zIcy2u1lG6q7Ksuuay2
u79JXv2fo/6603dIxZ6cKgaaulP3Y1TI2x6N2C2sz+YynITnpdR6yzq+93rMxnYgr02bXvZeX8b9
+6r99JTznT83Oq+r31Y6zbkW2NHoU9Q32mLK8xoxG3X+p/O2UZ1mHb6jv0jKvtH+kUuodV6o3G6z
1bDfYP1mjpXTmbdwaW3MwsvNqx7bK8ezI+3ZWTTX63p12fYcf1P0K2qvq/iM+ro+rznPfijGOL6h
j1Nu30/U+js9Vv02ez6adv1f6d+wm9CsabcRtQqcXH3uI9/2lz27f1n1v1n1m/8Aaj9KkpwMarq+
NnYD+m4XWGFtra8/9o5NV9NtDttd99gf1DJ9HJo2/aKX4VNf/cf0vSt9l7AxMjN+svWLcnMyHYuD
k0DEw2Wvrra/7NiZFj3ilzHXVvc7+jW/qn89+h33KzX9XsyzIqd1Lq2Rn42La26jHLKqQX1kupdl
2YtdT8r0nbXtZ+ho9Sv9LTYtDE6dVi5eblMc5zs+1l1jTENLKqsQBmn7mO1ySnlcn1MW65/Xbup9
PyX5D3U9Yptc7AZWbf1Jjsau27Dx6PQ9GnI/aWB6f87Zbf8A4dbga7L6/wBUwbbbRj/Y8JzWV2vr
LXOs6h6j6n0vrspfZ6NXqPqdv9irP+qVr6T053Vcp3RXk78B2xzywu9R2H+0HN+2fY3fzWzf9o9D
9D9q2LYqwK6+pZHUA5xsyaqaHMMbQ2h2RYxzfztzvtj9ySnkug4GTV9SMjJ6Xbkfb225F1TDdbYH
vxMvItrx21WWbGNzfT+z5Xp7PtPq/p/UWyzqJ6v1rpzcG57cCnFHUsgt9os+0h1HTKLfcHem5n23
Jsq2/wA5j4yJgYmH9WMa85fUhX059rnY7Mo1VMpNr7cmytt59N9vqW3P/nrPoMQfqT05mJ0h2U2t
1X7RtflV1WGXV47jt6did9lePgto/Qf4D9IkpL9Ycm92X0vpFVtmO3ql9jL76jteKqabcp9VVo91
Vl7q66/VZ+lZV6vpfpP0iq20DpfXMLpVN+S/B6zTk12VWZNtj67KWsuZk42Rc+zLo31vuqt9PI/n
Ps9leyz6ev1bpVfU6amm63FvxrW34uVQQLK7GhzNw3h9VjLKrLKLqbq7KrabbFX6d0O2jN/aXUc2
zqOc2s0Uve1tVVVbiH2jHxqfY2y9zKvXusdbb+ir/m6/Ykpz/qV0+jHpz7q33ucOoZ1O2y+61m1u
TYGu9K+yyv1vZ78jb69v+FsXTKn0zptXTqrq6nueL8i7KcXRo6+x2Q9jdob7Gus9iuJKUkkkkpSS
SSSn/9f1VJJJJSkkkklKSSSSUpJJJJSkkkklKSSSSUpVxn4ZzndOFrTmMqF7qPzhW5xrbZ/V3tRn
vZWx1j3BrGAuc4mAANS5xXD1Odj42N9eLf0duVl+vlboBb0zK9PBxq3+kH7mYtFfT+pP/wCGZk/v
pKe6SWN9YOq9Twb+nYvTKKsjI6jc+gC9xY1u2q3I9UuYHeyv0t9jNv6T+brS6d1Hq1fVXdJ6wyl1
tlLsnDy8UOZXYxjmVZNNmPc+6yi/HffR/hrq7qrv8H6b0lOygDMxTmOwRYPtTaxe6ruK3OdWyz+1
ZW9q5jF+sf1ps6DT9ZcjExGYApGTkYTC85BoDfUuyqMhzm47H7f09OFZU/8AQ/8Aaz1voXcexlv1
4vsrIcx/SMdzXDgg5GWWlJTu0X0ZNLL8ext1Ng3V21uDmuB4cx7Ja5qIuVp+s7MX6s9HuooxsbK6
rW1mLQ5woxKv0br7LLHf4PGx62fzdf6S1/p0f4T1GWelfWNz+qt6Tm5OHmW5Fb7cTJwXQ13pen6+
PfjOuyn03N9T1an+vZXfV6n816X6RKd3IvpxqLMi9wrppY6yx54a1o3vcf6rQnpuqvprvpcH1WtD
63jgtcNzXf2mrkepdW691T6t5/VcOrG/ZFuNkeljv9QZNlAZdX9rbf8AzNL7Nvr0Yv2W71K/+1NX
qfouk6IAOjYABkDGpg+P6NiSkHVutdEw7GYPUH+rdc31G4jKn5Nha06XOxsavItbV6jP559fp+or
PTeq9P6rjfaen3tvqDixxEhzXt+lVdU8Ntptbu91VrGWLIso6r0jruf1LGwf2nidU9F1voPrZk0u
orNGz08p1NWTjOa1tlW3IZbXdbkfovenxOs/V5lfVuvV02Y2ZRUx3V6LWGrJApY+zGbdj2lrN7qn
vZj3s/R5H8369no/o0p6FDqyKLjY2mxlhpf6doY4OLHgNf6dm36Fmx7H7HLGxsj64EUZWTjYfpXO
b63T6y8X0MeWjf8AbrH/AGbLtxmu35FP2bG/7r3Wfo/VA76xU9PxetZZxaw/G6g3FrZWW1evdbXh
tpsyb7P0bHb8ljL8h/8ANY1P/BpKekSXL4v1oux83Do6nm9Nyq+oWNx2HAe7dTe8PdXVYyy3I+00
WuZ6LMn9W/TbP1f9J+ilj9X+tHUWZt2BTh01YGVk4wbf6jnZHoWurb6bq3Mbhfomen61n2vfkf8A
aeqn+eSnpklz7/rFk5zOm4/Rqqxm9UxW5+7JJNePjH0psurqc2y+57r2000V2V7/ANJ+nr9JPldc
6p0fAyLes0U22ssqqw7qHimrIfe/0qWPZkPuswfRdt+1Pssvq9H9NT6v8wkp30lzGH9Z76c/Exup
ZnTsxnUHiit+A4h1V5a+xtV1dl2Q6+i30/Srym+h+m+njfpf0b4vW+vdQtyrun/YHtw8iyl3S3Od
9rLKXux3WXZPqNqxLr9nrUUWYdtfpel+s/pPUSU//9D1VJJJJSkkkklKSSSSUpJJJJSkkkklKSSS
SU5P1mws7qPSz03DENzrGUZdocGmvFcf117d4d6j347X47Gf8MoXfU76qXU2Uu6RhMFjSwuZj1Me
A4bd1djGB9b/AN17FspJKeKyx1/Fr+q1VtNd/V8S++rbZYQy4U4uVV6vrj1XV2ZmMz1v0jP0d9n6
VbPTqerZ3WB1fqWKOn1Y1D8bExC9ttpNz6rcnIyH0bqK/wCi49dFVdt3+GssTdc/8UH1c/8ADWR/
7Z5S3UlPC9Ib9Z8/6m4PRGYdLas3Brp/avqj0q8a2rZLsT2Zb8+qh3p+mz9Vsu/TfamM/RLocXpN
2N9ZHZlbA3Bb02jDqM676rb7Nm36X81ZX7k/1P8A/En0f/wlj/8Anti2ElPJM+rOcz6v9C/V6b+p
dDYN2HeQarQ6p2Nk43rQ9ldjmu9Si7ZZX6tXv/Rv3rQ6VRm2Z7cg9Jo6Pi1NcC13pPyLXuDdm12G
X049Ff6T/D22Xf6On/CbqSSnj3YH1nxOgXfVfEwmZDBRbjYvVH3sawUOFjKPWo2/aPtdNRrp2Mq+
zWP/AEv2mtdN0yh+N03Ex7Btsporre2ZgtY1jhu/O4VpJJTgvf8AWHpefkuqxX9ZwMuz1qtl1bLs
d21jH43p5bqKLMTcz1aHVXepX+k9Sr/DKqfq/n9bHVcvq7G4FnU8MdPx8ZjvWdTU022tyMp7HMpu
yXX5G/0qf0VVdfp+vb6i6hJJThYud9bLTRi5HTase1jmjMzjc1+O5jS31XYVNbhmusvZu9JmVVj/
AGf/AAll+z9LVyPq3m5WJ1iuKmX39Tr6hgG6X1ONLMP0m5LKzv8ASusxLaLf+Df6i6dJJTzeHR1O
/MxtvQsbpDKnh+VkWGm5zgJ/Q4DcT3++zZ+s5P2b06/+03qfzd7onT8nDwc2m9obZfmZl9YBBll9
9t1DtP3q7GLWSSU8ridG6r0qjo3UcbHGVmYXTaum5+F6jWOcwCh2/Fuefs/rY11VnstfXVfVZ/P1
o+f0/rfXunW/a6KMKyq+nJ6bi2k2nfjv9Xb1Kyh7qfTy9vpenjer9mr/AEnqZNn6JdGkkp5zBo6j
fl45HQsbo7KXB+Te802udAd+hwRie7+c2frOR9n/AEf/AGm/0dLqXSutdTDsTN6TjO6iH7cf6xUu
ZWKmtd6tGXVWXu6pTlUbWfqbH2Y9tv8A2r+zWLsEklP/2Q==</xmpGImg:image> + </rdf:li> + </rdf:Alt> + </xmp:Thumbnails> + </rdf:Description> + <rdf:Description rdf:about="" + xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" + xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" + xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"> + <xmpMM:InstanceID>uuid:551f298d-e043-484f-abf6-792d02bf587f</xmpMM:InstanceID> + <xmpMM:DocumentID>xmp.did:CDCC195597EDE411BF6F8D436E9B2F4B</xmpMM:DocumentID> + <xmpMM:OriginalDocumentID>uuid:5D20892493BFDB11914A8590D31508C8</xmpMM:OriginalDocumentID> + <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass> + <xmpMM:DerivedFrom rdf:parseType="Resource"> + <stRef:instanceID>xmp.iid:CDCC195597EDE411BF6F8D436E9B2F4B</stRef:instanceID> + <stRef:documentID>xmp.did:CDCC195597EDE411BF6F8D436E9B2F4B</stRef:documentID> + <stRef:originalDocumentID>uuid:5D20892493BFDB11914A8590D31508C8</stRef:originalDocumentID> + <stRef:renditionClass>proof:pdf</stRef:renditionClass> + </xmpMM:DerivedFrom> + <xmpMM:History> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <stEvt:action>saved</stEvt:action> + <stEvt:instanceID>xmp.iid:05801174072068118083DE96E4AF4DB7</stEvt:instanceID> + <stEvt:when>2011-12-18T23:44:36+01:00</stEvt:when> + <stEvt:softwareAgent>Adobe Illustrator CS5</stEvt:softwareAgent> + <stEvt:changed>/</stEvt:changed> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <stEvt:action>saved</stEvt:action> + <stEvt:instanceID>xmp.iid:FE00D69E062168118083DE96E4AF4DB7</stEvt:instanceID> + <stEvt:when>2011-12-19T11:12:27+01:00</stEvt:when> + <stEvt:softwareAgent>Adobe Illustrator CS5</stEvt:softwareAgent> + <stEvt:changed>/</stEvt:changed> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <stEvt:action>converted</stEvt:action> + <stEvt:parameters>from application/postscript to application/vnd.adobe.illustrator</stEvt:parameters> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <stEvt:action>saved</stEvt:action> + <stEvt:instanceID>xmp.iid:FA7F1174072068118083A72FB8BC9D6D</stEvt:instanceID> + <stEvt:when>2012-02-03T03:52:24+01:00</stEvt:when> + <stEvt:softwareAgent>Adobe Illustrator CS5</stEvt:softwareAgent> + <stEvt:changed>/</stEvt:changed> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <stEvt:action>saved</stEvt:action> + <stEvt:instanceID>xmp.iid:00801174072068118083A72FB8BC9D6D</stEvt:instanceID> + <stEvt:when>2012-02-03T04:14:54+01:00</stEvt:when> + <stEvt:softwareAgent>Adobe Illustrator CS5</stEvt:softwareAgent> + <stEvt:changed>/</stEvt:changed> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <stEvt:action>converted</stEvt:action> + <stEvt:parameters>from application/postscript to application/vnd.adobe.photoshop</stEvt:parameters> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <stEvt:action>saved</stEvt:action> + <stEvt:instanceID>xmp.iid:CDCC195597EDE411BF6F8D436E9B2F4B</stEvt:instanceID> + <stEvt:when>2015-04-28T13:11:35+02:00</stEvt:when> + <stEvt:softwareAgent>Adobe Photoshop CS6 (Windows)</stEvt:softwareAgent> + <stEvt:changed>/</stEvt:changed> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <stEvt:action>converted</stEvt:action> + <stEvt:parameters>from application/postscript to application/pdf</stEvt:parameters> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <stEvt:action>derived</stEvt:action> + <stEvt:parameters>converted from application/vnd.adobe.photoshop to application/pdf</stEvt:parameters> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <stEvt:action>saved</stEvt:action> + <stEvt:instanceID>xmp.iid:CECC195597EDE411BF6F8D436E9B2F4B</stEvt:instanceID> + <stEvt:when>2015-04-28T13:11:35+02:00</stEvt:when> + <stEvt:softwareAgent>Adobe Photoshop CS6 (Windows)</stEvt:softwareAgent> + <stEvt:changed>/</stEvt:changed> + </rdf:li> + </rdf:Seq> + </xmpMM:History> + </rdf:Description> + <rdf:Description rdf:about="" + xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/"> + <illustrator:StartupProfile>Print</illustrator:StartupProfile> + </rdf:Description> + <rdf:Description rdf:about="" + xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/" + xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#" + xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/"> + <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint> + <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency> + <xmpTPg:NPages>1</xmpTPg:NPages> + <xmpTPg:MaxPageSize rdf:parseType="Resource"> + <stDim:w>296.999959</stDim:w> + <stDim:h>210.001652</stDim:h> + <stDim:unit>Millimeters</stDim:unit> + </xmpTPg:MaxPageSize> + <xmpTPg:PlateNames> + <rdf:Seq> + <rdf:li>Black</rdf:li> + <rdf:li>PANTONE 151 U</rdf:li> + </rdf:Seq> + </xmpTPg:PlateNames> + <xmpTPg:SwatchGroups> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <xmpG:groupName>Standard-Farbfeldgruppe</xmpG:groupName> + <xmpG:groupType>0</xmpG:groupType> + <xmpG:Colorants> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>Weiß</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>0.000000</xmpG:cyan> + <xmpG:magenta>0.000000</xmpG:magenta> + <xmpG:yellow>0.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>Schwarz</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>0.000000</xmpG:cyan> + <xmpG:magenta>0.000000</xmpG:magenta> + <xmpG:yellow>0.000000</xmpG:yellow> + <xmpG:black>100.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>CMYK Rot</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>0.000000</xmpG:cyan> + <xmpG:magenta>100.000000</xmpG:magenta> + <xmpG:yellow>100.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>CMYK Gelb</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>0.000000</xmpG:cyan> + <xmpG:magenta>0.000000</xmpG:magenta> + <xmpG:yellow>100.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>CMYK Grün</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>100.000000</xmpG:cyan> + <xmpG:magenta>0.000000</xmpG:magenta> + <xmpG:yellow>100.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>CMYK Cyan</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>100.000000</xmpG:cyan> + <xmpG:magenta>0.000000</xmpG:magenta> + <xmpG:yellow>0.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>CMYK Blau</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>100.000000</xmpG:cyan> + <xmpG:magenta>100.000000</xmpG:magenta> + <xmpG:yellow>0.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>CMYK Magenta</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>0.000000</xmpG:cyan> + <xmpG:magenta>100.000000</xmpG:magenta> + <xmpG:yellow>0.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=15 M=100 Y=90 K=10</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>14.999998</xmpG:cyan> + <xmpG:magenta>100.000000</xmpG:magenta> + <xmpG:yellow>90.000000</xmpG:yellow> + <xmpG:black>10.000002</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=90 Y=85 K=0</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>0.000000</xmpG:cyan> + <xmpG:magenta>90.000000</xmpG:magenta> + <xmpG:yellow>85.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=80 Y=95 K=0</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>0.000000</xmpG:cyan> + <xmpG:magenta>80.000000</xmpG:magenta> + <xmpG:yellow>95.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=50 Y=100 K=0</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>0.000000</xmpG:cyan> + <xmpG:magenta>50.000000</xmpG:magenta> + <xmpG:yellow>100.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=35 Y=85 K=0</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>0.000000</xmpG:cyan> + <xmpG:magenta>35.000004</xmpG:magenta> + <xmpG:yellow>85.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=5 M=0 Y=90 K=0</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>5.000001</xmpG:cyan> + <xmpG:magenta>0.000000</xmpG:magenta> + <xmpG:yellow>90.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=20 M=0 Y=100 K=0</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>19.999998</xmpG:cyan> + <xmpG:magenta>0.000000</xmpG:magenta> + <xmpG:yellow>100.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=50 M=0 Y=100 K=0</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>50.000000</xmpG:cyan> + <xmpG:magenta>0.000000</xmpG:magenta> + <xmpG:yellow>100.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=75 M=0 Y=100 K=0</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>75.000000</xmpG:cyan> + <xmpG:magenta>0.000000</xmpG:magenta> + <xmpG:yellow>100.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=85 M=10 Y=100 K=10</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>85.000000</xmpG:cyan> + <xmpG:magenta>10.000002</xmpG:magenta> + <xmpG:yellow>100.000000</xmpG:yellow> + <xmpG:black>10.000002</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=90 M=30 Y=95 K=30</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>90.000000</xmpG:cyan> + <xmpG:magenta>30.000002</xmpG:magenta> + <xmpG:yellow>95.000000</xmpG:yellow> + <xmpG:black>30.000002</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=75 M=0 Y=75 K=0</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>75.000000</xmpG:cyan> + <xmpG:magenta>0.000000</xmpG:magenta> + <xmpG:yellow>75.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=80 M=10 Y=45 K=0</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>80.000000</xmpG:cyan> + <xmpG:magenta>10.000002</xmpG:magenta> + <xmpG:yellow>45.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=70 M=15 Y=0 K=0</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>70.000000</xmpG:cyan> + <xmpG:magenta>14.999998</xmpG:magenta> + <xmpG:yellow>0.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=85 M=50 Y=0 K=0</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>85.000000</xmpG:cyan> + <xmpG:magenta>50.000000</xmpG:magenta> + <xmpG:yellow>0.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=100 M=95 Y=5 K=0</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>100.000000</xmpG:cyan> + <xmpG:magenta>95.000000</xmpG:magenta> + <xmpG:yellow>5.000001</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=100 M=100 Y=25 K=25</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>100.000000</xmpG:cyan> + <xmpG:magenta>100.000000</xmpG:magenta> + <xmpG:yellow>25.000000</xmpG:yellow> + <xmpG:black>25.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=75 M=100 Y=0 K=0</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>75.000000</xmpG:cyan> + <xmpG:magenta>100.000000</xmpG:magenta> + <xmpG:yellow>0.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=50 M=100 Y=0 K=0</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>50.000000</xmpG:cyan> + <xmpG:magenta>100.000000</xmpG:magenta> + <xmpG:yellow>0.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=35 M=100 Y=35 K=10</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>35.000004</xmpG:cyan> + <xmpG:magenta>100.000000</xmpG:magenta> + <xmpG:yellow>35.000004</xmpG:yellow> + <xmpG:black>10.000002</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=10 M=100 Y=50 K=0</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>10.000002</xmpG:cyan> + <xmpG:magenta>100.000000</xmpG:magenta> + <xmpG:yellow>50.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=95 Y=20 K=0</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>0.000000</xmpG:cyan> + <xmpG:magenta>95.000000</xmpG:magenta> + <xmpG:yellow>19.999998</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=25 M=25 Y=40 K=0</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>25.000000</xmpG:cyan> + <xmpG:magenta>25.000000</xmpG:magenta> + <xmpG:yellow>39.999996</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=40 M=45 Y=50 K=5</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>39.999996</xmpG:cyan> + <xmpG:magenta>45.000000</xmpG:magenta> + <xmpG:yellow>50.000000</xmpG:yellow> + <xmpG:black>5.000001</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=50 M=50 Y=60 K=25</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>50.000000</xmpG:cyan> + <xmpG:magenta>50.000000</xmpG:magenta> + <xmpG:yellow>60.000004</xmpG:yellow> + <xmpG:black>25.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=55 M=60 Y=65 K=40</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>55.000000</xmpG:cyan> + <xmpG:magenta>60.000004</xmpG:magenta> + <xmpG:yellow>65.000000</xmpG:yellow> + <xmpG:black>39.999996</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=25 M=40 Y=65 K=0</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>25.000000</xmpG:cyan> + <xmpG:magenta>39.999996</xmpG:magenta> + <xmpG:yellow>65.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=30 M=50 Y=75 K=10</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>30.000002</xmpG:cyan> + <xmpG:magenta>50.000000</xmpG:magenta> + <xmpG:yellow>75.000000</xmpG:yellow> + <xmpG:black>10.000002</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=35 M=60 Y=80 K=25</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>35.000004</xmpG:cyan> + <xmpG:magenta>60.000004</xmpG:magenta> + <xmpG:yellow>80.000000</xmpG:yellow> + <xmpG:black>25.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=40 M=65 Y=90 K=35</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>39.999996</xmpG:cyan> + <xmpG:magenta>65.000000</xmpG:magenta> + <xmpG:yellow>90.000000</xmpG:yellow> + <xmpG:black>35.000004</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=40 M=70 Y=100 K=50</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>39.999996</xmpG:cyan> + <xmpG:magenta>70.000000</xmpG:magenta> + <xmpG:yellow>100.000000</xmpG:yellow> + <xmpG:black>50.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=50 M=70 Y=80 K=70</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>50.000000</xmpG:cyan> + <xmpG:magenta>70.000000</xmpG:magenta> + <xmpG:yellow>80.000000</xmpG:yellow> + <xmpG:black>70.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>PANTONE 151 U</xmpG:swatchName> + <xmpG:type>SPOT</xmpG:type> + <xmpG:tint>100.000000</xmpG:tint> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:cyan>0.000000</xmpG:cyan> + <xmpG:magenta>48.000000</xmpG:magenta> + <xmpG:yellow>95.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + </rdf:Seq> + </xmpG:Colorants> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:groupName>Grautöne</xmpG:groupName> + <xmpG:groupType>1</xmpG:groupType> + <xmpG:Colorants> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=0 Y=0 K=100</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>0.000000</xmpG:cyan> + <xmpG:magenta>0.000000</xmpG:magenta> + <xmpG:yellow>0.000000</xmpG:yellow> + <xmpG:black>100.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=0 Y=0 K=90</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>0.000000</xmpG:cyan> + <xmpG:magenta>0.000000</xmpG:magenta> + <xmpG:yellow>0.000000</xmpG:yellow> + <xmpG:black>89.999405</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=0 Y=0 K=80</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>0.000000</xmpG:cyan> + <xmpG:magenta>0.000000</xmpG:magenta> + <xmpG:yellow>0.000000</xmpG:yellow> + <xmpG:black>79.998795</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=0 Y=0 K=70</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>0.000000</xmpG:cyan> + <xmpG:magenta>0.000000</xmpG:magenta> + <xmpG:yellow>0.000000</xmpG:yellow> + <xmpG:black>69.999702</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=0 Y=0 K=60</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>0.000000</xmpG:cyan> + <xmpG:magenta>0.000000</xmpG:magenta> + <xmpG:yellow>0.000000</xmpG:yellow> + <xmpG:black>59.999104</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=0 Y=0 K=50</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>0.000000</xmpG:cyan> + <xmpG:magenta>0.000000</xmpG:magenta> + <xmpG:yellow>0.000000</xmpG:yellow> + <xmpG:black>50.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=0 Y=0 K=40</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>0.000000</xmpG:cyan> + <xmpG:magenta>0.000000</xmpG:magenta> + <xmpG:yellow>0.000000</xmpG:yellow> + <xmpG:black>39.999401</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=0 Y=0 K=30</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>0.000000</xmpG:cyan> + <xmpG:magenta>0.000000</xmpG:magenta> + <xmpG:yellow>0.000000</xmpG:yellow> + <xmpG:black>29.998802</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=0 Y=0 K=20</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>0.000000</xmpG:cyan> + <xmpG:magenta>0.000000</xmpG:magenta> + <xmpG:yellow>0.000000</xmpG:yellow> + <xmpG:black>19.999701</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=0 Y=0 K=10</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>0.000000</xmpG:cyan> + <xmpG:magenta>0.000000</xmpG:magenta> + <xmpG:yellow>0.000000</xmpG:yellow> + <xmpG:black>9.999103</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=0 Y=0 K=5</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>0.000000</xmpG:cyan> + <xmpG:magenta>0.000000</xmpG:magenta> + <xmpG:yellow>0.000000</xmpG:yellow> + <xmpG:black>4.998803</xmpG:black> + </rdf:li> + </rdf:Seq> + </xmpG:Colorants> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:groupName>Leuchtende Farben</xmpG:groupName> + <xmpG:groupType>1</xmpG:groupType> + <xmpG:Colorants> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=100 Y=100 K=0</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>0.000000</xmpG:cyan> + <xmpG:magenta>100.000000</xmpG:magenta> + <xmpG:yellow>100.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=75 Y=100 K=0</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>0.000000</xmpG:cyan> + <xmpG:magenta>75.000000</xmpG:magenta> + <xmpG:yellow>100.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=0 M=10 Y=95 K=0</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>0.000000</xmpG:cyan> + <xmpG:magenta>10.000002</xmpG:magenta> + <xmpG:yellow>95.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=85 M=10 Y=100 K=0</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>85.000000</xmpG:cyan> + <xmpG:magenta>10.000002</xmpG:magenta> + <xmpG:yellow>100.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=100 M=90 Y=0 K=0</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>100.000000</xmpG:cyan> + <xmpG:magenta>90.000000</xmpG:magenta> + <xmpG:yellow>0.000000</xmpG:yellow> + <xmpG:black>0.000000</xmpG:black> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>C=60 M=90 Y=0 K=0</xmpG:swatchName> + <xmpG:mode>CMYK</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:cyan>60.000004</xmpG:cyan> + <xmpG:magenta>90.000000</xmpG:magenta> + <xmpG:yellow>0.003099</xmpG:yellow> + <xmpG:black>0.003099</xmpG:black> + </rdf:li> + </rdf:Seq> + </xmpG:Colorants> + </rdf:li> + </rdf:Seq> + </xmpTPg:SwatchGroups> + </rdf:Description> + <rdf:Description rdf:about="" + xmlns:pdf="http://ns.adobe.com/pdf/1.3/"> + <pdf:Producer>Adobe Photoshop for Windows -- Image Conversion Plug-in</pdf:Producer> + </rdf:Description> + <rdf:Description rdf:about="" + xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/"> + <photoshop:ColorMode>4</photoshop:ColorMode> + <photoshop:ICCProfile>Coated FOGRA39 (ISO 12647-2:2004)</photoshop:ICCProfile> + </rdf:Description> + </rdf:RDF> +</x:xmpmeta> + + + + + + + + + + + + + + + + + + + + + +<?xpacket end="w"?>
+endstream
endobj
3 0 obj
<</Count 1/Kids[5 0 R]/Type/Pages>>
endobj
5 0 obj
<</ArtBox[0.0 0.0 660.0 400.0]/Contents 6 0 R/MediaBox[0.0 0.0 660.0 400.0]/Parent 3 0 R/Resources<</ColorSpace<</DefaultCMYK 7 0 R>>/ProcSet[/PDF/ImageC]/XObject<</Im0 8 0 R>>>>/Type/Page>>
endobj
6 0 obj
<</Length 31>>stream
+q +660 0 0 400 0 0 cm +/Im0 Do +Q +
+endstream
endobj
8 0 obj
<</BitsPerComponent 8/ColorSpace/DeviceCMYK/DecodeParms<</Blend 1/ColorTransform 1/Colors 4/Columns 660/HSamples[1 1 1 1]/QFactor 0.0/Rows 400/VSamples[1 1 1 1]>>/Filter/DCTDecode/Height 400/ImageName/ps7F12.jpg/Intent/RelativeColorimetric/Length 77183/Name/ps7F12.jpg/Subtype/Image/Type/XObject/Width 660>>stream
+ + + + +#$%&'()*3456789:BCDEFGHIJQSTUXYZabcdefghijqrstuvwxyz +!1"89Vx2AWw$7BR#%&'()*3456:CDEFGHIJQSTUXYZabcdefghijqrstuvyz +oͱjڛnEbMHUӏdfIT|.\tSE)Zʵh3ģ؆'f'}-"N\W;$>S`ت
>NmjjAb:=w'5#sFؖ5dQI3ܖ2>b[7_c*xOfE>sVhu&j%,]qɌك蔤W]M$nJ._55,"lXg!9fN"ML2E'RjEY/fMuM@7Kp +(,5eJQ`rEu5uN?X]Afʕ21G'f)Se8JdV= +=ۮl, Mlgɦɵ#Jt!)',\i5!cTKY$aO ]9rgr$P.>`tLP6uVqr-A +YHrzvyk5PbDMec۾>=X_ɱ6KFk-3%|<\+|x.}g>0 +8bs=?ɘμFxfF=]Si=OKȶչT\VǭRUc芛Um(7څͷ'#%TL=awILsx2ˆ`r3Y*Rq,r1lc>CcŌrLsg +ЧnB[;RNk16h':X"-\zٻƊWh$ĚLf(rJlgE\7]9H9j"<*"'2j|}P!q +\d$-?X&b|$s{1lL8)SH6qg $'d2+Z%IjՉ7"iGnӗ~Q7n_pvcpxYCߥ"Y6d9En̓V O"٪DAe4!Q@g3cg}k@7fw#rqF]xHoe2P9zv0̮nX%cC}16;Y"f1c<$AYϰG^F&JwQ</n%c2<ؗT*`\cdg]ɀP5!@ +e*묡eYSET91s6}6s =? +`3NnMZc@巿>9[˦ZV{Kǿ
L]e ++Sdb+^ʊ@,xK繏Bw))wUUJؾ9g!{"sI O|>}' +tdǠ +B)vT> -\-;ʺX;:T#d9%R)3g,.6rbԆL6<i%;1춺j{6+ɻrOWXX^{s+ekr:++[| +Q[K>tO۶O] +lgܲT`ɮK~o\}1dT5ARM"yǷ%Q%1PC@ +r[DTPW6CO<p +Iq:2s8pع+!s8 +l0K^:@6̬"T{Je +汔56L"E>ڙ<<^>qDEcWNN5ەJDzĤsv!]Eɂq^Lj2R%yS{n2x2jfIB(g[8e"
x|9L7VJ، +ن}hE#X4`,mF%4(
DFːvďTErdSmDԩ0LZCD˂ÆlIc<Ǯ%W9w+x8l^?69%+6PAۥTjԹs-l"υ$_o` +MviŎYuj$jlq\̎{O[d{4'9]^Uve7t&1t +ˌ9;<N\90ծ9JQ(k<䬑']%죅H +s͒D)J%KYVddq,h[$e-YՖo^ߊf}ap +-&l]j4uyjrչڞ|%\608:ՊDEH{&+Y9YKaB{?6m.SO|9T.4i:RQeDK`O%<>MbDo%% rԻc^ԧ{Xɖz +QQQْkTlTܯfjݥ
Y$2YCX$lE&31 +
_t$ fDerQk%$|"d2s(,;g*5'2e6ᳲ@ +MP&
D!~DWZjʳ.m^H1}AM^8:f]SP7 2OzyJhfX[Hlm|g?FSQck]>{5VG2r^YofK .Hcc͒-ʫ+h2*'RRaX)0X/q{1B +~.78)D_MF.E1$lR~/Ȩłr/*|1af5VLi6WQxdK\bQ*>͈WEF*ACMS²3g07hj{c9uLg>f3g+9 |519cQD +gؔT]?Ӹr㫹芽>*|ʯs\UqeJ*nWq]e),P1 +L=Jc2zj;v:تۚK6b[bM hcZm[Tx9ޥ
ؑ,HM*۾*:jkgzʹT&KqcэwEŁG(+ ZTJxu}F!7ӷAT9Y>A2 ۬'h;KR}]ٴ>s{:sfs.9ꫜy:Ǻ|UyOn}x{<s◃'--g?*<7܆|vgx +GhQCg&<F87ȔKI9Bq1*e\̝ggWkZ{?Y*awAK>{K(wQR%++ˀtI}DFQhArmC{ +d\\| +t֭ifYgm")m9}Hvf(?*y6 : +[LGZc)=̔6}@Q9 +dd(M#$"cE*)*d)J\;DhlgAFW{n?R:adr[*oz&z.LIfx{bM!рFWa>U+(nE1HCr;ڄM2ګ9W&Tzl%UOJ\'.D1ݹ3&S1dڶMi`Ï +w< l|99#*YW9r
̾ѱ,b. +Bڷ{)Mi~sEE.LBf,\&r\c0w +V%j": +2Hئfl*(ʊ*]ceuNs&fneu!$gnqYcM"`rTHI"2}@ +xe +TUUaj2*V*FE18ڈ5bŔc6ǰdmb7H"H6lES.0TH!`1tSǏ$]8} ;O.NWT%pcUPɎ1l6s=` +P6tS̴|u'cRV"TE83xfWnkr:Z-rULc_#}.=(XU=ӨIKc)I\JG-̹£\!
ؓWz2gsVdĉQ<f^q4cd)P +ʥSKÜg\{nooh/{ +m9t_9ex|]D=/_K҇i8 +Dᤓ)17cc=QCwP1υw:M;`RXcZ=C=ҭR.s2&^ɔ(k~*:ĕ2ەѵKZ9bQQ$x#QQދڌ*dsƒV;gaFE۬sITȡ{8n6~Gh;59LȮH!gl6am#gZ#^X
[EV0zȒ۽x&#UZY3_^+LkSM3`n4vs1bυT\=^+.)=QͯIE`.KhTں.3gvHݱIR:9x +x, +l;r,3%I=Mu\7;D
ݲp.=ߜ'-ũwtt~am0CGK9!{", +Q
ϋĆ{\,'ru[VI_5yTq)1)4[c|FKz +ʉ(C +MVj|>YXUFțj9=-]ZTEݸsPq~)X=s:OÌ͖:S%s6qf_(RiVkI_M3g d,7o2bc92uKV:*ХuҭJoUVMqDIjٻ&ٴHڴA&͐OneI/4R`R`+.ʧ]˥pe3Qe9USN1͟s'? +I4jrC̚?jQ}|%pc1e`i,9ȪL4Nҕ*T}U3>Y⋌}{$ċI\`.hmYzI\R2:OQa
F%~^G7l^v*9C,ccBjZ㳟^EͶ.𢱏wb|QXt9S) + ?sy)y;zs(dH=}3D +Rc{:K]d}/:ԟrQ¨ZNNռΟw;J-}\W)/Ͽ߹ӰÃyfa8n>8`sa^CW],~߃%?`&PD +7Ncs,!oe%]OYvǷ8W-kXֱkƣZ֢5kSsZ֦F"""&NnXܥ)K)K.1lcdz==dzl91Ɍcg9ɳssۜۜr< +˿!
YGIJA9ri^Cyd +JvOwZ*fnG5ѹٛF7Eup6M64d
2Yݭt"')j;`3ds +渶aTpt*r:fዄڲuUHbw
%1e
s-6F̭ǽ85g{'ףnvXhVȇO+ǹu ʹ{L"3Q1V)>1d1~Ƀc>d#w4ʵٺxbϋdTymcۢMH.q6%E +cDǕ)cŜ$
!*$^l~ҹ;i7Cim^Y:.-]R$[8[JըBʰ6yӝ<<vLT_4e^]h]yc'J8vf0EaeCՐAEnZɖS&19;_takc\ںeCVpl.r ",Ls +0R"݊g(.v_#~;tj虜ϻKQlb?c{}hvImwPĵoY +$ܤ[dG&S;3v˴vtrVT./kUᄣ);-^^fn$X#,Vګ9U%W[ cɅR +aĤt;nj3`Y(3xgrzL\tΣ0D"`UW`2O)Ōp]euW!d.ek%ڑسfĮt,W9U{r"![iII\JI9YV;N8>TYuS&:(sd1V;ctsٷnFL$D5l0DE"cM4Ɍ.?K|9O@{ +BxpeagDJ +,T<7Pɻ'9J6Xp)"2%Ğ +,+ +TT*)8qg3}38dys8qg3fq|~8{>w#%4+2SKfMÿYd~2Ov6^m+B: .<ӶyǓq?UGA842K|?ts>3Dj + +5r<*̓M%,L|ጃd^R(w+* +Uc'1r1s8ff|&{{üvb2X) |)l]Ez +NB]OGȱrO-G2.Ooc\K˜8ȝ&1eݢ6I<no9L Fw"|` +c2GDjQu^np\ewt̖`nȲNBۙlɲׯԗEZእ:Ew769d1V.wDGO1L]I=> dD$٫t]-SfFM{?8AyWO&[dz&LyYo$YS.8e3Sa5vҬm/NF}6L$19OZd:c%5DE3Tz7#Yo6-~W
UP-O&ء!]*|/p|y[WH8LϘƴϜ~EVAMsVlc&L&(E0 +ɨ1*:hNacM$D8[죆*&)rOUrا"Ex%:8_a?{33gw.0HM-ݚgf?At?G>=3#a4c;^_w.0Hǿ@_l>g#nDV?f^q9sk6C +Ϗuzj9 mkP*ܽrD6 +5P#>l~9Kl)kVIj\2ΓX,c^l't+UUQ7DCqc9sǷ9~ccKsc|>cs07y;rھr8dvy{'tW-Gj֓+npY,l3k,6|FqE'*%lgPE9:U>E9)%2uՑ#ŸKAݰzrLhh%]l-;&'AHgI,|%L +bg9&JVi+9Ks#tˡ,S`3iGc(ty`{g;q +W\oZSܧi*>3I\v + +ʧIXAˇL 6jd.mIC, +ƥXJ-Oz)]eY,Dz3عi[Lmɀэ5)t9]Mےc3
Lv쯥RU(i +r +4ki*V*auJS +Li;XnlRW>sĆq0QF9۫koJ$$$"mjBW'2+ˀr7FqǪ/pݙCYصݻDޠe+Ťex0ā&峔ESJ
D=#xO͎^d.`h_*UYc׳+#*t8 +M[ߕv{m)PZ+k[w^N$Vu7ٚ +w.s(묡,cC9l +aǙ +{'ҭ%e7B=R5 +xJ\J\y +[!=g/v(t8ɩ淳z cպcIl)KQf,dyiH$ +l +0WY6\j}ĸ +fivɵXw6]>c]ŔJ~_Gq}EtWILMLW*8i[?M=z|45UrV}fr4CR5Ӷ=j39iGTy
z"DBښŽaY +QI7zz.GcYXlijm^>1tB|N_U,pFn=,&W8mW<j +'&Ns˞ +kս^F+H=(R' O2Vm(!QVcd/<[ULM +ɦL6N3be##2UV +SoFĪӐTnwg=bE' ƶp鹒hE$;Mâ^rҍWn:0.26p^md9jCCJ=ٲ<Z%YxDŽ<x9ɰb +?
ztM?z5"Z3ak{=g[4ce6%yRYY8\$X2 +ͲhWR[$ו$,kƕӃe^^ʹN`>J +'
,3A'"fe +8ALe*`Zw:R[[-t+i9mWC⣯Rg +T +]}[Yq#
*'s$ +Ԁ +aiDR8 +j +ă9h5+̮@Xpߚ֢۲֥n6lmIy~1mX+f/~iSux}WIWtpђC˚O=bc+VKk0̔lR9 iX+
vη/$:`+R +%2EqGO"QZǎ'Kċڢ7WP- ;3 +w\ț9N-KcTEF^j_/!v*m6p[3g+Z@`g"p9W;v=18l)[a)Ln]VNC%]ݣג<dQ"kjn ++$IףךH"FgW%Y9j-0kFưI&r +kLKWf%kѯ`CMCɵYLcYH2pD3|5vtȳw ()b9l9ֺJ|hwݪ +7j枣j{~Jܭy" +
)dXnKf12l(^\S +
}vɖOtKUJ_YIp +\{(nY +t{zirR_Gl +? +u[K3;v,W7OR,vQxaMI +]V5Cpl<>2calg:( +i&u1@ÏK6~& +p;9Hř5ֈkPj[.[Xlqnk`قݰtHr xۏ}Re7eYt3gvĽ!{1EܮHؒK"꫱RQJSpގN}Kl$h^5:!b^!U9&1sFxM +y9B.Z.Aw 雤]Hr0zLsߢlk +o"Q&$HЁ=Ce0r7o%:Wdxq*ã: +εt~\=.pI˻2LC&fUp +8q5U +9=.exՃHk69ڟ/hS'
5)-
0TNa3H<$ f +\ +dLc{5,͢<x9) + +cǼli:TmSS9 +3;ƨ)ۨ:V9vU;,.ڍRO3+JH*H +#!G +V/uQ*i&-\>"l +>
q\U +`)@7l걡e$e)y0k,KEm/9A4Nؽ}4F, +vSg-~tɭ;ۧͩ/G<=Q5ө[8Y}R.*_,e}(t7%m9bտQim'˺)=PILXݷ!ȖR +/.%\y+$ɋ8 +^~.1y +8w*UԏK~ݤNz݉_^mF)5KrŶfwYcyD +Șs'k75tW5DRlXP y<g\$P + +Sj۵y&r'eդ9QJ@ +*حftKWj𨿞\ +.%XU7є3.e=~L$|bǰd"< +Vu2zrarnoƽǼVBW=,Ud}G/f'eї#$kP+~'6xޠornqc{TWyǫ<lm*6$:$HvI1"qj8UK
]=o'-[Md"% ;vI'I $0tp+`$1 + +WʵYf1eZvMV2P+oQ})* +i +weǢLKEd>m7ɍ\ +fO + +R_5y)qk4_fbQ:s}]wGh + +<(L( +3s~N6G,o&Cu#iCXLከ;) +k]83=U+۪MvpZ)2$馉Rg +SGmM}orRAuvE2D:3HC\ + + +b1C%9\1L\L\81sgl +Zz~ƍՙ֟p枞+.uS#rQL@ +V~4amԨ-snaE,&F/+5a3P*ƀ}':u/ҟӻ:5i"LNyaJ2ij+9[+]IVvm@O;cΎAqy㩘in+gvDʽUۣuP!Y3e:j +Evnj$oIaNqrLcd㱘<l˒>& +N +j:hԛ&IS"rC1 + +m\ɼjf34zVDkit_CT>;.7#m])ZyI9xjʬAW)qXװơFJ +3/fctpvϪ_OXM2Y62ѡ-,54}R3MT}U{` +? +RU2p +8smV}r0g^L_©Ž>$d,+JZ[i#]J:;pH~7OnѐоˢE ګ:W!EcSjr̐?U\+@o?h +e<T +C<lT¨eO)L`6 +C +ЍϕF|to^GIlr6uH4Ro~gI7OeZ,g4_YxԜ.?6AFX,clMR`6Q) +rYtR3 +Ṝ8|N& [8握 +ӥpˍ|]Ç,)Դ,*19s&r +dVGdUS6(N:j&r93g +2SH)MU;NJeGH +q&L{H}Яy7kj^=_1YRZl/h/H,<vJ3]G'_mתtdr=WԔF"6L7W٫"ykN_ +
5b?|y+=5/Tq' +}nf]Wӽ][כ5p4XZz3|mEUnJqgG
sJm^zb< +2cyD&k_'gV+8@ +nt-}3e'
KD克GUn]ƚEԤ^ȹλ=.#Ƽ +zbiz-ǼRfig + +)+Y$2:>j}j]Ym_sZj +`꺖|Ը2:~d* +0,ymq&V +M(B#z-78~
yEp +2*6ue8wa;EPjK嬑ɜ +uGOM~!A徂5Y[7D};@G4FiVh1֖! +2^9Ø6nع]5կ[ޡTjh>lGed5υeϤrwyAId<,pvUU}idAjyTm + ÕKV)҉`R) "@jͷǷYe9'fYfߩO̺y+-$\tM: +wM&Dj +Fo|Jjhk߮UlKXo2wfs$uhd)Pl&V6vJ]_xd$n&b%ʭ&gIuNJ KL0 +pFƩPpՑWlwʦ&.f +FnU㛷hkiJ[lԆI}utĔSWD>rgn\ +R9Iu5vv̢"XH +q-6}c]hѫ'R3A$ + +ߠUnkvOjh=bB3['Aac+rY [m/niٛFf[4p\,V4승Yܪd$_9S=]ÂBп_ +endstream
endobj
7 0 obj
[/ICCBased 9 0 R]
endobj
9 0 obj
<</Filter/FlateDecode/Length 492593/N 4>>stream
+HwPS -Ћ!H
$!.HZHǂ DAJQDқ4A =3μ;͛y;7g5u +pݑfz9eS+q*8/?& +1r8jF=(HpE$=n2 +Qߎ'JHKJKde+19X\#P^IA\G^iWyIeLOs' +]tub#NcfZ+3V֟N~85`o08zzi/.[{P"ܓKK ȁ)M!}a,(h^bgT_x{q)DaoBT4'WFAKfZވ̺ +{
/@?J
؏z~$Os9=}s&w6w|B䥸s+~_\lon"ߖvwǿM_
U D +2-&6ØaYNL(%#,Vk
3*G
g>70^_><@Qk +W]TkS/?nyB@K] =I<h#cU}qVbT+G& +"xEE`8lR,b +қH"ņ1oy
]zyܭӽCy|+ᾷ.9\^qcMJ[:~ m]yai£so?{#{WCɎ<݂B
"(M K]3Tf,&'/&RLLz9hW._VЯl,}_+QbͪħWW6խ\}tCӖk-٭t5]vrL||?8iA45=<i{_|K?/DX +KxlqQW2:HG +r;A;bjJ +߹/3 +><1]^~|h +>$P@%hیoK/<U˥[:5pzgE>{W4yw8f8eD*RBy;`nQtVy:_@ϨgaJ +O +#/a^#.y?FPgq?:K1b4wߘUuF]WqP&<g\|KW'SE<nǪ}XL'D{-IZkOoʗ=i +z"̏973g`0'Cw%|WHo;ZN*tQx2%α
e}|N J. +2caZnpHu| +zP1iDhTL.YeP]G&G,,<d !mH79/8xR&sHz^B#Me&h?˂$VÌGͷwf2]"6m}R=bfclqgU=d0ՒWN{D + +'->`] +7p=z=`nLh(n)ݡa&so쓝@Zl +v>*K&vV,*p$i;Rxټ_PG?+\ʽMbL6))r>=@x5*fv]^Zduz]X?P41p9Q~*^*,0#%8b;Q'p*$LEf"wǕSC戽Hah:-"dk>uy7C/)d%x`'qyo SY "&]#65; +tk/ G &0,#Bv"R959oQm@;/D5RIP+-GM#º'uhAt0";=kմ?{-We_]ډ[jA
)H>Au%W#Ժ>D.ٜJA1~ S̕V asUB +䪪/j)+68˼=wpmbnv\ߝtGOx;`uKJ̄wAߕx~Ϟl.ɂQ!h0RȥjEGlsܦ5#J58/G
V//"N1J;mh`$?,Wq$L$0lJVzq+ĬЈAaix!dpTP/H_zZY +U)$Yǭ,H -Ϻg,7xeIHh6 <{*M@+{
Pw/f +X8Dm*Q/ZB\@a8~r;E=,7!oM2D[..Reړ7tA};GbsWhq2A];%mi"+g=Uf*l3xݲ?Ia~
/&.u +궥 +>'ggUi
AN?oO%),z~U
3^Gj)ȀZMۂFiPnQY#TVtgSVD^O˿:JOg+SMnveKlou"̋'gøSzّ[
oIpkк½+/eM=Pm4?EAO =Ф>˭=@tVw{[u)jW>'jcJ|e57R1a7/zu
c\V˞ Bb-C~}5ְGU*Z$SmƩૌL"CƼ+g~>dwE͢B`Ѥ*]vQ)TTڒWЬ~E0!U~Jqb `,<7q |? +;.ˊr_/C:x)P]aΥ:媀B3-⊗cpcـ=#ӗ=Z"#j%"b7KJːйcle/_>*E7@+V6ŸnvQGM]wTnG<2
!_,>P蓧VwN5[,*tgGvR20B'džɫ+
tGj
x1jMTn"AKFoUkoȱ*h$e1%#* +V"8%{4G(ȫ*d+~?ɟt#gG9w[wߺ4ݑĈvOrb4鴶ר=yR:p(bHY-Ƞ$D~)5a:GXmr]c^vzKS8=UĊ3c7o1UNϹu!8EGpҮ69Esu|?Wx5ɻ3FI
a ~۸ߕ +TCY
bY#thG:tW5-BG^pw+.xZt#4ruI_o$郅t/*-]V:SI#< +BqEd_07<He@.zjڌ̘k~ Kf(U%5Yzt@љ3#ʒ֢>Ɉp0
e,%(IkLgu=Xin##Ί9W"o;!t%-Izx`to[!֦Z?Q,YjwgW tCOTmW}9ӒB$pqL?5LRDH|]gpOhz셠kJ$ۨ +sOk|8C "rզqc(:/k~%Dj[ihH5nߛ-787_A%V"RjxwڶᎣͿ3"汬6EVÄA'X*{G~GZVAZv}&(lݽ6$>Yԟn-ZT3(( D;峰&pۜ :J2gkSIJ}']V +WC;KX_="ŸXʰ #ލ=Omp(e{K nK溞b@mfl_#va^X +5s'nW*B6núowcj\ě8]qQPCSܕ5'YQ4R0jf9Tv.if\PqBjB5n~'C͔qՏ\0&v iz\M\O$B5/
p',Q9= Lr{wuhhxˬ[æ=O*̥B@4'C =?촺t毃4g[TN͡JAW4˙^M'cZ +aUIrÚ=!0KN"0qq(ynmi]a PU>?IG<բ038|"5|;"yh!lYf`TڧHϦݤ<30ŝ)#ae^ڼxภl`ST_'HF<{ڤ0iN#({-~~r}f}Z}OGD~
C~7H+)Ѥ݁j~n +rI;fS炜ZKO^?Cm]7{+EܣՄ'd+т~@( rf"Zv&NܶCG67^4+(>0N?~/mr7if+ZegN͵ҊC:Y;7R5*g^W}̪qwen"Z/NPCF7>n*H2HSՃU}qhʙfe{/Yڹ=NZWBђF7#I*Ɛ3D.r݃},kq;e-,3YVNB'E7 *Xxi<|pķ]dྠZYHMmB}6S+ffOBT;|rp8dX0M@Bp#6+@|r|`p;˯dNSXMpEBPg~6-+- <{ +[stw`(W~kyp ;nGN5|d>C?1]@8l^|Eb?,Υkz, +00X
m[<?bPAߩ,C] IGe_ߠ.1^IxO/'`cR.1B8- 梛x*g;ԗ~KtCP^W.T +Dw2EkH|0`W*q"]|P&XbĀC\1=.kCլĊIUl(ha^ȊKJmXpq}P9Vaâo^Q#ŜdD@@φPފ
YAɈ~j<T($8}o#p}kR5)ZT
" QvK1T5q!pnAu:XIO3`[)m!{}Sl-/kZ朜!:^́tsc!Xv[d1 +qIgVZM&۷d6g9~60hyfT1_uV͵z[qIҙ +&1O%D'M DzFHqK0;J57GdQX"/!C\8"wv%>+>r'ф1N[Mƿɢuo✔b/HRl+W|[{ṕ)LvŝiC؋pׯg߬+1+KL!Ԙ@|m#>`V(S<{;PXVK~JxY'VV}b{7anWT4 +08^`lw`Yll`ײ/lp q28u{lbۇ̝9M;]w[c]|B[v4hL̫%B"HPgp"?es1c\cekE +B7)*ѧ7{>ĭGulk(67aRܶcS|}<()2L/ΤX.`sk$Z<%S0aF~l7'yi^2N@HS&xpyRF}Nք5Qd-!c%٘$cL# +Zx..m}1K橤ybI֜%sSBqrMї8mr0)YͳRܹBwWX8Je3)}U[)WO{eTS pJJyςG5ꪲ5\E2zP$\ +YFtQwd^N +1wEtHt8Eu%UTTl^*!%U,kF܂0!wi +KyشvYV:^tFƔ.{od%;V:6C&1nG(y%^eOacD=4ONi6썂; ˭L`f7Qk{2f7PI"ăW(^\ $b1S.%.F6;oAAj[ T>f+(n_I߉^ʻǫbȌ[nq13ߏBb7C
Ӂ|S綵<*/У%ڋDrܱo|RהulsUZ_fת@^uP6T)#:ςlama$Hl^z'1`XPҺ}*%]ibd9&e@}@v^HdnKn( +̖{]1;R
;e#ZT"?hpiK
Bzޒf1zlRIP<΅R1bm],2;%E7THM>+aOέbw?RHGQK+6f[ev&ŧj|xR4X%kZ%Nhr HzOޢ[WJk2V\^Jpsκ[GFH'3Yb}O. =דgM!.grWsG @d+Mw8|oA8a +6'GCg5ɇE-h-;^)(pdϔPY u_Te.<e $ZOrǶJFrGڬ|G)+ME8VUad<'zfd{0
oLXf4iicQrph)W1
~hrQfYXG/N4J;Ft_fN
+*&/x }vuL7 Z +ڡ>k$G-)1="Y_w:j˱LiYm! ;ʀ}bZFr'^;hͰYնg0hE6AL%eO%wAݞa?UBW24a:Qc~yʦ/
dWm_Z!ÿlq*MlX[͔+l;):|UKeo3W# +)ln>fĆ3_yL3̀yVii߇k4[p+Z~ɮNW +WB~l^Q%¸k=LzbBw -lƯ* +BD+R<lMMtRV #y6_vȑu-| +Go +%>7[T*Pu2Gn.(+QO^K#6`.m@6?e÷Yk7|RO;1KKCXo}Ic?bVx*r7k23{7}M;=3˚P1YldHv^Jg1͘܇L>Lۡ=mz!b= ,;1),%=3|~XEq1o[9^iUSlwzXRkTNP'JeR@1p4@ٕK\Ƽ42i|S`D7n +"kSͲE~fy,p +7%Tw#UUCs0}*ڇ(jWA,ӘTRr`]Crz5_VYA9?uayK$mZiin%44Q5Zq%!'Jj$;tр +a,ߛp,=Dշ{nk>Rg,*CcL57iRXZ#EoP +LԠ?2o$?9a s}DZ4qlse-X"Lk-?pr2i@$~Ó2Mʉii}ppʬdsƝX3K?P20l,$i|d%|_^pc˧jWSKS>P1$Nݎ/M,{oi{c6W +':Ғ1)Xtjwi|Ȱ^T5=SV,H?>V3Bs(Ț1V6IȋybtPyuz_v֯zwA{<xK{yr|#z^|{yH}|E1T}I|} }=w'Gx9"x3yvz8zxq{"\{G|*0|։# +TJ?Lql~ukۺo͙-j_gC8yI=9~:spլFf{W8)4Җ.fLʆS:4mY:cO +qdR}[h*wc7%_H.3d5v4W<Vq*;iɟjLRE=J
t=>}6xBxvPŬgcn +7N\VYgM`TfM~o1*:hgKxD:ppqR/Gx-<Uw#<I|zp sFc1;TLbЖ%#,慹bUX8أP5f7Y`xlXb3{WVvd\٘ d!.DCX>5-Ӡ`_ol
ts&+s0K2'AkO* +7UdAjD-Q&!Q B\ 3h(;l
0weX{!i)5$uۙ.mD&WdXQ<ZKV<d^x:?T;it쯲>6l44+\e8\SaOƞ*˞!}S|ILJ\ +h8 +0?ER.ocqE-輏'l$m'X +<|!b_7sD]&1b+r'"ؔ\ާ7-rܕbMxswq >"5OE"ϞGG2/#w5m_QwRrRq<$W`K(ABc>%%D 0oD`D :P˝nYE5e۹+F2Wͪy"9u/pQF$'ߕ>r3&=70N@9 +mUQ)!..U[_ +?KFJ4GĹÄY$ܐ''\]fG63IAv_mfax"C%k4BbT4TՂ"k<\{dq s7/d4V +{lhxZ]b[~=ifig5Fb(ק9;O٧ViGGX_}n]wӸik6f:,p,@бkbmuFR!s37:!?`CW֧&`':gUDtx4DLؠ²CKh#NL +mRҦUa9B6c.oo18g
JVnv[[mFGvzB+J02Nhļɍr/
䜲Cy5(raDlGx~H?I.ȩ
GH;A!A0sARxJ8*ۛD[Ѯ~b +W.Q{!n(1_9W'IlCw'Cp^~ +UUu +nIR:^ar]J& :þҝm)%қFҚp} 2ed';(MdFڶk
]*HДPPCjߙm>wE2j샽/;Έ?*,oqS6wniZMfOdI&~Ej<uDQKkM|\hF:;TBYćCKu;w1/5%>*tcHV=֗7<Lk2XF]E=m,6rU蹲P/WSEFlPyzS8Q:/~`~kLS
0RߪnFS +( + d%/eo2Q,xuԁQ,jM2hƥ(Y諧
$aig_cOl,Mު+ܱw_1j9CBu.ёb`hOq +TddVvϦþ\f&Qn='қT*l{_"orKCbqѿ6#Y0|SRaW dxGjZ7K&DS=DDKvt:NtOh_pZ%WIj@VkG*EL<QN@>S"R&D}cQB)ٺ:X~IuT$'+{5mM/)y ]X{.OI-Qx
bYzEIbxo~Ub.Xܔ#NA(lcZVrA6cJ!,i9+x);kfċJ1$kGeNWIbP@vɛ/ySj_ʥsJ3]jAxLRdȆkHx?H
n'kd,.62@-:3+r2Djgylդ~e|^D4\UY?d=eH;:Oah::=`#?vTE96MI2R +ޫ']|_{T#t=ჸi}f5A vijթXd!S)q OK +_0ˤh;vpzi"0HnU\קX~y7sTfJ0'i_WΠmJ(et>f݅]m[-S]Лc<"_.×z;,^Aɝwp36 +iWRj|pI%(E:"L{+:eȾgdOژ9ؔgF:fՓԙdb:JJ[pdR"QfQPge +U.4hzZZ_<dm\4mlvMsk],1x@A2U١(Y ZW!lM +@+PJ6^ݯ_ϖWt]pw]Z!*g~#Q}Vn'+ + mzݜaZDٞIj\!bD'7'^5P<v,gv 2n1[0tK)KwN _AiGBuL'Eov}ĜU[ʸ?Mb=uvUٝxFڢXaI-=nN:qaf.ʖWf5L.{UB7%t
m'O5v^k8Ys
饌0w!.vy~"qqHSN
+'غE.>m]$h$0Åzm㍝|SiaYvq%Ҟ +Я%a@"{/[VG+RYpy-²L'80lK6wǫ[Ŧ"VaM&}V;碇s-x٣j$_aЦ[z_
ujlQ^ˣS/)Gi;kA.!b1x>؋ǯ]uG_i?M^.ZRbG*I;Ҙh.}h!BQ0bPEYBtZi+m]xR)^FПf:s.C?!%8^k gbztٱh]3YQǟbFc:y'.!ܖYi3s{Wrp?sBe
t`Y|u]NZLvB@w6}x*@z1y{l
<1}8${ +uxoy<dyYazPN_{BW{6â|*.}M~
zbon&dF@YNMũvByo6T*&@
ܘ=
ynLn쵗cްXbMy1B=6o*D>ӚRPgMyiniƊc]*,X;߉aMAI6:)phgz<όۂx葿mݴbʯeW9.L2A\58)ݛ?h<x]]mU6bLW@LAAHoj5ʞi)ț +ǍH}ww̷lϳaЮ|Vͪ&Kߥ,@蔬5g)s<{)@bRwHlKaPVV+Kx!@mW5Z)`{}T],˃v3k̲]`᭯FUCKD@`;5($)xq!-v_tcOvjkZ(`cUJפå@&4̞)c#䊇o}s|e*pt+ZzitOnuEfv:ۮx-/yh#z.{ '~ +oVye1OyZPz"O`zEe{B:ܭ|/Ȩ|$}l +W[no%e +meߏDodپZCOƴ;JEP$:תۄ/զ:$Aҟ8$K0BoD0dY#OPE:)/ʥ$Q +$^$nyRd+dYfO$Dέь:!/ċ$^{HI^#nncǻ,Y9ÓNѱD*:Pv/9$i|6] )Ebn cnX+NODJ5:$ؔ/l$t@sg;Z.ZڋmͿtc#
XN9D9Dy/xі$ۚk!mp1dbֺ%XU"M1C۫r9צƜ/jN$8ϔɈ[ym֮rbǫHX YMȯƥCX9aN/_䜄$"FuoPvqw_rxsғxu*yYvmAzwYJzxD{Qz.{z{{Sܢsy>tz2uzv{'1wR{Qx|Mlx|X4y}PCzZ}-ez~ z~-qԃ s-t;£9u(iv1}w +!!$$wߛ{C I0B{M ED[T~{QfiŌ=~\C¤P/P%`vָ)Y/Y4T?5hMsqjq+:m'E)̐/kby@}{DR39놑>cvvSDžƖMt?65)`o&Z]d?qF4 ++0@ל7ty +^A`qrF:TZ,ʡ2m T)q YK|_iY y{.uXN.|K$F^k}fVSTD^7{ѷz~gȡOL-*݁yV0]?3mnH>1GF)eDK;hز +wGPXkm +_BIѨ+ ڣ㞠t7tj}7Deߣo]3%j%Hn-E/GXr#3,+b=?^'NC%}Uss6p)n2 +TmJocz}a
Ҽ؈ WǖS<c%
n*DJ=}K䄹f^JkcN3HCKy8B( +YlѭVbjtȳǼoەԊQ*J$;i+_lFZdTn-s:?@[Kݠ\(h +)2 +[!{81ar+9iFk#q";m{&k}K>Kl$t_@*CTV
z7vdr]&4DiOQi
lp;#K}&<c[w[oA, +xJкDg&vhh\ +6+5DľGѺHs͉}dU3 ͫV>2 + ]-jxP$#LmNܫyZ44CDcXj66DgmZHSd}Wlɾ[oy@nę&)Ι;-~(.xrZG`znrYoB)`cТzٶmixC,WSeH)5ڗ>B>dS#YZ퐉FyQ R!,-j"~jo**e; +I`h]<nVD¤Hb,q(Ȕ4ZcGP=sQpv/R0!pxe_l&!?F%GNw33䊘""=XC7Βq/߉)˗M9h;F奢.qY8$I-BD/ĵ#L(>f+oZˎL;T +O'{XzE|H>PcU)'ItJ&}>wͧ3dQ%{z;-'L5CXj>^!#ͪIWhMsfZC&9 +3WʏeL)!acE2'(h*A)?+f7GHtcfի-(U+bІ]Qx[Beb;<R,ꌤX5oXDU}6)AG-dQl:g0\_ŖX^C7L+e8_"9˳w> \h3J0DMM;Q[9Ԙ8L*fd@kR9rLDg5ٍBuJCa&NOlٯAM:m!vİ̞;('y
*1\_M + +Ϧmߔq;K/G(:'ܷb^#jQtkA}R*SY<~522] +/+%U)lD鍩TՇ_+T0A+ Ng9S.јFw9[InZKG%!Fo}]xLD +(p:'"x98\tWؑF+e]-vl? +{NC)j]܉cVA)1-Ū'}F pcnND6lW<CnFCM.~JoQ;g + 2VKCnݭ69u1;X$i:~omI_tfqү;V3:lTɬ^}hEw#ÚETh|A +[%KL$I?웠u* +^3$<+gSa)j* jRADʢ(Le{KG(Yr1ݴf([c#YKllbS#Cg~>)2I1_vZ4^u)j'6kV6V,Vb# ?/;̱;o5g:nĬ7},4mG6_n) yҰ_2l(hs`L]x7z.թQһޜ첱nEͣc:6ԥ4ݨ`j(a֍4kɪRM]Լe+-[Zb_Hq6Zن:2+}Ec]ZH&:LQОkdèi_V.36$o^ϰQ-E4<7*,+}3a$}rRHjgKV\zRffmÉl@$]{%qf,h`=Zo:5snX5~ą( +wejwtpO1Yt37zh3HjYh+0`ҕ#ݶb?&ZQ~)TKtyɘ1r)G^T>Q0ON\PP+8\6zQ-*Ze^Pxe +dP&ub~JY!Y/!]1h>@jVuF'lqV螩m1:UH≢8QEvWb\#ˡyNſ'\u/H$wuψ +MxoI&v}!&yh嫎\0tx +̙+{S +t^yuSvHw>-xx2!y&.z_| 7~irzhz^ +<YgʆJ]LSۅNI?+6+ ɟyA윈h kiIa"g=]9SF
&Ilz?_ +Buf\aRHTq?9X5x+! +``ĉ܁f3\@wR`HK>Z5x+!KVӘЍ ++Beq~[8RtH^6>ͧȚ5R*+p!$ +ɑK<ł0e9P[}Q-H.>R254$+a_!8F +feh`Nrj3.s%l5Vt#n#buoJuqzvs[gzwtTaxv@vyww*yxfzyoѾotK*puH|r/v@sPw0thx"xuzyfPvyS_wz?xd{*x|fy|`m~o#~"p~8q~_Is~wt6~e<u`~Ruvw'>wfI)wNgxE|k݇%mêo +gpqlqńvPsjd:tRQuu>Dv}))vgẃ~j +OlJrmo^pƋQu!r$c9svPt=u(v'w8i^kdmin<psqpbBrˍP +t?= u(uwjvWc hӣ$j&lL%mښ̈́o[!rpѕalr4Oasy<tu(Ltu?ƪh,iTkm7nrp=c`q7Nr4<>sx(tOg +#yd1t#96`GGp4c]ϹNM;(A
? B_d=tC8e@@"h$[RJuq5; +~(^b +_0SR>0͡#,WٖM +r]S~³Km#jc=Bf3>"d',EodbU})XO%yڪ!J@U~eѼvӋ@qnM!{ n3۲ciwuCcS:dZ7;Kw%7@ks5N'A̝ra{;N93&`q +=PmhbaOZG|mXs̩^4>?@Uzڽ'a8,Y
oۃ<)P[iH60?[^&=NBG
'i]a# +@LA5&i6u3QsN=g6P`f+]i@'RG@=`eU~Qa!:ǶWK_5PK)P>-hΎ7Tհ\W9'i6["%ӡvȘY) +IN0 +CA#-nrf,lp%ǜ(l0yL@-yDS~-~e +S4c^z +]5 +tk +@qѶN6I`a?bꢗ`Pl{i0>#xz)FXہvgڮPxKkn<RM8Dv78NeZ^tj5LG2wWhE?mTs_I;49u0%
d;D7^yb3orsqUc@,ZʼWn?(Iwz3,}ox({͜o?s^\2Svkz'ԭNϩP(L6I@ͼFJ[QZ\6MsReg؛\ަXjxdxN>Y^㫳3\~qUv*mI{RXj;,&9N\FDDwx#YvZNۙW)+(YCv:+4CYM,ٸrNF"I~y +~%^
At
"X]-ig48|GҴ3"_ +#V%@ǃ*PIER=A +䩺j%7<h+C5{tlV7ag rYOMOd8XѽVɲOv"p}ߎVhXՄqs/g2;6I8CP)N{ͿO~J=ݻ(mn%=B%h%]n%#La}-к0SaňavPBTZoRD8m'ǖף}q<_qS@1lAK]7`=_*F"IZj:yW?zVZ51JCR="PfJQ~s0w!J{/ӯnS{9Y~Ll^\kEX#?"p\*hc'Ubqqܝ弸Oa>%d_o: ~_/l9PKo:~Ty(mmaWHЫͳ/stMDxI,LQ5SMzt)$"`rSh +K +XQU<]-}!e\NfQ,u,.|O|f~\Z?
έA
}sy%*_I)ο`ߞ6_ҷ;I\la
Ch)Ha{~T' 3zIgKw{5czֺUw:
bĀvX~fծrCi˳?qLr(|# +/[cW}BwsZk>KcYpڸ?fr+"4'90Q&OVt\q]s_x>[2Tލ (Z_kN4 +LEF)"bvۊ<.|ԲBT?X hLcԀci.W$-lBB5 +_ƭ$SYo^,^rhT(ʥ)4gɒ?s"z`Gyو=\ϣ_RHOOq|< +6JrU>{E10Ipe6V <Ro|I&AĈ]g̥PWRj:W#tx~ne&61/c9z/V\b!簉HS@S c,u2%یsΘ!rg2pU0v>DOy! + +ldRp*<s-qwTGJ*_Y$,';b,^vO'χjtZJԡ'c;l?o7t=-~Ԯui87uԕX.W涐h'y` +Ep/dtu]9 _]l .}oz"{D| {~ +/1(i2_VJLE0Bc8~u-"ٔ' +{ jh +
<kсhcH^ۨU>K~Ab7--:K"ɕ
+.d!g뫮^Y}TO"KA]t7]-q"
^g|g[]٧Z9TLěJlA 8S7g-> g"W Ŏ.fê&]cSTJ]@Ŝȝ57/R-"q蔻HD=F7a_iGW¸RjN56l?D9m;EQo1qz'@sEwtbxvјz +s1KuY'vxLϞyX | +5,~^ +pirl(s7n;sGt\pBa|ur0O-vt<wu&xv
ywxƹk^nmpx2nq;psQ+qxtrru`ctw+N<uMxS;GvUy[&Zvz +%u}:
w{}f}gi8k2 lYzn;op"^mqLs:t-%tw
ve{>Hg;i؉Ck\/m^no]~pKr<9vsI%Jsuւtd6wfxhҐCjP}l{mn8W\oފK%q\8rN%rUWu'3cA.e#g蘟iՖL|klm}[o.Jp8q$r1tb}d壉glif{jklҗ[nIp^85qJ +$q@t2ua߯媧d@fx\hozjX)jl2ZjmSI|o'7pN$qDsfaDceWgziͧj)kYmkIn7p;$}psN/`Jc0EeyO:gnoyii[ik8Y^l@Hn7fo՜u$ep&+sAt1dK#uf2ui`vk}wAmmwo[xqJ <ԉ +y9VlxZk|][$HC?nW3^#4#`'-q%;Q/خf̛`ƭrwO'erϩutKeJ4@x!@/I_!;
y@8,Z=lKzQ{T/!G=Jl-xA 3F6rpJǚ;jhi-+ +4OyUVX=oRNwPFV<m1*GP<,yyfC%T/QyM&_Y88$ 8Rt8 +l/E@Cૺx+6[Y]0Bl)q +kd "Ym?7hk$"P!(0,VohJH}nJޣDY"?ޔU=a-\Zq`8g9f\ +Y|7j) +[ݤ^UtsNo!(rZ7C5y'gϫA;?JݎBņȐzc*K?]3'7(;\ޮ4*|KNsB!+|pF`OWp"+&ނhĤ=- {/5&2=(yA+=?9SJ} t*DlBU(ѵv"9s>y1zȭV!eQ6_T~7FD]Cw[k>D3
|LEH-'P8YOz2j=^
u)>QJ$$~=QDp7!aa΄E?Z6n;u95~VT^>) +x\q})Q*flfwD,*'}=?BuppQF~)GOFWW/h4^֪͡kUj\uEʌmd_? +ʞouQ)E) Rp!%~^݀mlD+sbW4M +I"Tq`h孁;2-"1̄G?XxAs~=pQN5F +T-Qjau!MPNi.?B+SO a_BL~nhw%G~y]wJB`E}
oe7c[_j$'(߇ |6lTB6AX+aO.-P5醲=DMHPo5r1O+qkխfIRzjY).A[6FW|{./]LmlcŻ +ENֆ\$,K*䙊,rBV.ܠeXyIiw[8Z'Uqhc%(>5$ܑj2\gvi,8<HLmS[RYowr'*R<CeyUYSaҸ\p5"*Z+
UBƃ)Aj^)V`{++ƱgŒGx5`Ij{"ДE'>ɂԂ;^q8 +N(7O`AlYʿ3WGvRFwy&]=B)+D_7:zrzC +)dfe$)eǵ5ߜJ
\iC
&)֬Gb^QQCBe@|%xD2,Z*첄ɳMI}{Hϳ^k +:%(ʩ$?'펠dIW;Fs/K->#n\J5d["tY`L-UӮx["!.vψoKh++쭼 'VxhU]'V'7 |IJl!ԍ.~;pcn +kT!8+G6||{H+ƌ+h(4f[Gg`W': +UD@q
*ug@\1_a"Y918$镖$BAcoXȮm uM+W=u \_6}mtciZ_+ +*(żLKe4z_Yz^(|hi2K^ڲNë.iP-SVu%|aQItߩՁFjXi:$M4;1e )=V=Gۈ'>EJqtʽL:#sZD,QREIpY͊ŴX.ϰ),vUO_Qǁ,
&˵+0kěY +0/J}+^,"8xd@1;t$6c-ICS~1L +%d57SE;g65N|v#e!!YH/(~*!)h#j
|xT"JJӆ)0nGyaOY9^`%*$'LTgw@!!a=>>j>mPbػnX!mSY%#C!ﵼ='4Ut|KaO+aWc%^^[^=3lXqv[^dVo{Pfܮ=2spӏ7Bl{B +:ط3&N_=@
9ˑlW>` =Fx8*>zL[`㛻ͱ%(U;hn頑̯ϛ'@5[\#/N^>-a#J-P +mW +ͲXY}^%=<\7yE0jw\XzZU͈g7{BmTtnj U5'_%_hI*OWVωsCU%oT_`-Id$,$5~u>UVjKDj2*u}? +MTC.aB.3j:@c~h$:䧒.u^H^*GAf +D[;PCKE.x9Uu,ڄx|njozycp,%eregZiOel&DnX7ɑpY*r1fsu{Dy|io=ikd<mYӖ2o.N3pCCr7ft1*u@u}fwڍ x}"xapn3qcʖs;Y tcNuBv7lx *Iy.*zK
+{ +~w[w\m2x#bؕxX2yMVzUB]{%6T{*|}t
r~q<v8~l2~~Va~Wm~L!Aώ~64b)3
hX҅9u:wkMia-7VLAP 5Ҍ)F(%
؈R+[$tMjs`~ԉV&(K0@n5}ꇟ)n^_x
ewXsti _˒&}UMlK
l@sό~5$M).ctnrahv_cT珳J@ +1H| +~Qhl`t} +ˋJ(kl-b$Ѓ4XN/ND:\ /_9$v!8 ǃ\́fjHa}X +vNG.D[䇋:^4/$f߆.Y?Յ a +jΏg`ڛDWyύMʖyC6&:r/v$A.*f +9\ݔ.ޓ#܌iB
fhS_dU+LnȜB͒9qn.r9#ŏ`'2 +)eS}c\eRhHj&?0lB5Wnf*bphrC\s{w +osP>j _kbӝmSewnhJ} p#jl{qm[|roZItAq~7u\si#utIxufihkjmlo]{n&qkForZsqStKIru6sw"t_wewmxd's@ftEhuNEjv\zFl[wXj'n#xNYoy4HGqmz 6Arz"?s{vk{a|adj|vf|h}1y +j}~il}Xn~Gp4~D5q~i!q~Uu~P`~Dbe,sg^wiyhkTWmnFo&59pz+!ptγ^}aR<icf8vhkgjVlF;nG4o!oȅ4&tP]Er<`&t!bԓe2ugyf0iKV4kEm4vn!{ops}\FW_-a)dOtfGechUjE3lΏ4(n2!cnPr[wH^dacsedh/TjKDl)03m!OmrZ7]h`{bseJMcgTni4Dek3m !?m.
r;֭Z"])J_RbbgrodȩcugTi<sDk)3l!2lÓ~
4qp +_Sq bMTr)e/s"gvLt&jdfu+lV:v8oEFw<q63uxs!xtX B{uGlhnjjolIqntrBpfe]str#U:tsDxuuZ2vv9ww zyx"jrql&rmt0o)uTspvkdEqw~TQs@xCty}2\uzRuz x{ʭ$h\zj:{4k{im{rho|lcEp|S|q}BCsX}1te}t} x҇_S +fL2`=t"C +Iy(¼=鏰5#Eli+qe#3^d]$ h7F2:c/۸#KBOq vJb;\VI; :O̤Ӥ`_ +Atp5X]}=E-c&%k~(N[)
4⧆xW@F6ȩٰuf#O~W+ y_#Tw#B>(fbK%,rИ5yS02xbymbE##@4>-4zڅhx{]8)9lۜ{dX+$PV?V¸eexoz2u4y/o;I;,QjUO#?w1>5>S{)4\s(nfY'\[gv*!Ag6f˾NsN|r0q4Jby@Y}<pO
=6wXEΜ` {Wh': v r_|r]WS$a5ɿ5KQM=WBԧ!L/
+s\r70Wwȹ\'d=/>LN2M2G2+K7W
<$?ъ0Gy+)~Ia/ +TM3U$o;*-(oAnUqpsz?n 46ڝD%.C
kXP$,P~ I)ldIN?Apc +/T$; +E1TIYA:H9>`'rd'G #0k6H,AE7e
%a1%J"u|L8>b> +|.'8= Ѹ)Î̥x{*\9RkD.25t{ʍoum xX%+0_NjEG7Ům}*V`JÖ2,fMsқE_g'ڷnejiRPGZ)E[Lёh_i"jeڿgm-&rG?j-<CNIUq-*lβEmS P""ϛMήӈhG#Gx\{"IaԤg@ry
#]3ÝHSGrDDD7]85/bEF"]PuI*2,[VAGBx͖;h/TZ><a(XdLg,hC~DW[j}2埶holpQITVE)\`MBU ^r"9vux: ɋ4W.Q26EpOhb{UȢ68dC]X=_v5oXk)aYAvKU`/IS9}Z=U4=h(݁{s07dZkNhm"}&\I&˭ !}v0V|bO&8>A9Ѵ71iK]"]_@3W"CV}(s@pJvJc>a54.QS2ǜ(1#ZoZe]dWP_ֿIe^R-L!VgFz'j+~f]@fgy$#hw̦<{=IնS9Ȯ +ؓw8+x*ր!4Eǣ(ܨgè(1[Z<te79 :~̦=kGX*ZU+t:Ns%V17d,WT'*IFNo8 +
BgWeWL@s X"}G*jn\{i_&BQ
F:Xrg|pWE +(՝{ӄȇe3`SV˥(6[S]d\Tψ/jg>BU/Bwߥ/ +h[t] +;H%JS'aRWIzBr2ɑSads|b%P&Rdރ +Eٰ&,i6;Zq'pzUKtE+qrϦM=oI;4t$XZӲ`Jt }E3d |vTn%e{"yLkޣDW
խNd."߅~$N@CB|)@s^vSk $BTLLzJ<ۇ?M +B>ق)p]4\RYNYenvV>2H5;qз=S$@ Ju"0@G<tqam"匆Fa ;]PeYh'qF +KjY9
!:k2y^X?0iql9YA?
Z`!ضYEAM;]94ۯYF*7OzO1Wr#rL6*Cݪ&K=!=w:!_v,a7k+7M@$I>s j/fXfV!옫*մ /,+ +]?TsdQ8i9CЦ1xWvWuZLOoeb0;\hrC.LJM_OՌ5 NY@8oQ9Y7g:m]Řc
pcMcu\Oi +h)%L۩Z<ËB +sv2BԬ%F`w s0/Bw\CM0A& HԆ[p70NEӜ[" [2,2xKȈv@]uCETzȓtST8{C2O%.x{)w95@j
6Pc@ N7a.%֍.+:>XRP:UH(?˕7O.ȑo%[3ύ^D<LHj>`S*7_&JapBc:%f1hu)j\m+;o:"Lr 㒐wP +nprUu*Zy +W|0q}(~4~s3ڋx +8'ړX0E!(jk ,
pd: +{Bl{1pni|KnU|0 ~t|ɪZל`\č_Ubupeag{RiAk1m8&m sR%XQ[Y،t^I~aoqc`fTSQRhA`j&0l<l' +-sVhkY8\{|_؍6n}b_eMPg}@iՈW0fk]KkV +rDUd4X[Ε{^ɓma_'db/Pf`@zi0)j&j +rN0TU*W Z|{]l`˘m^ycOf@hPC/iFjq:SnEV2KZ#zH]+l `]bᛨOeu?g/iWqiMFqDbR$VJ;Yjy\k_~]pbOJNd일?g6m/h
i#BppPkZ{ +YrxwzRbu]Sdv:fwyhwkbjx]lyMnz\>Fp%{-q]{-qR{w |ա3`~ b~1e~]xUg6~jJiJ~\kQ~M9m>=n4-fp3Dp)%<v?4^pIa?cow&e݄iAh[;j3(Ll3=.mS-o6o7uc3]N̐_ލbVvdjh\f^Zzi5WKkFW<me,nWng +t@\"^aa>u-cgfIYhQKWS +<TU5$oy(WTc5kB4}[OLg0E2Sم"Mt=qɳ==r> +fQojvlK|7%܃(.CDZaM\)>-́˧!ct (Z1n{sBsj*!-QU2!w\h?||s:#^.#LE)!56Fy.[%O:"m].^(-#9UdiҰxiGMF*]Asnks!Yv-XsN8MU-ɉ +K{vʯl1krȴDnʚS}n8)re]Նl*-QOdW*b@8~(M;H?e>amаcHlBy>ӡ/ʰ%iK:B/ߒI +};p"[՟z.Mf<gc GiEJI4[IX,X683U@f!\tG}HC{R[pYs1"Ah#80kA7 X=1*14+k4 ٻNȩsqd?l3gDzNU +b"怺*[6[p.~Ѧ̹@DhnmL]7Ȝd
T}Ɨ +N7B/䮱c mܿ8160yFMQ"Ѩ>ہ1vX˅ +syxhYSYhO>yi*6D`R}䪪p3=]rM>\ ^9#&ăOennfj)Ĩ4_Gg._'HBhwj7zЉ5T +Ԟ64%O5:N '7Mu^.V~yGwBuh`4K%?#I>/%O +fc~՟<PH+}sܲD'N+mxqɿW ,`*Tm-옕p᩺P,<9mU X1UZ'lc Z@JC,:q!YdgN\&"dZ)=SGҵCDEN*42qKA<=
1#bz*D +&ƝIMgS;7 'Cq~zì挓3'p^19xa
3wuXp<m0.BA̮3P1' +wj5MsW}(Vx#WuV,+iZZUۋWJ/}d[аێ0a?b}V<e{(M^x*,U1?K*VdkWM8VV؇~O6Ei}0Cߜ%JםNko,ԌZHnk/2ՑM*W[/-24"Zǫʪ٠dYV$DCIVZ}oIdTw<.UGY*x,L7+id<J..
TCź_Jb`͜$xޱMu}vXǏ=4 rk5{s 5.sICbZ1-pf8C{%
c"$TroLet)HΞM6Cm z1ˊf7%b{B0Jz~ǧ6Q;9\~3>%xoGP*/91KOGcjGc噉X0oNE +>XJb'(%7^Rg#=X T@NKdAב!i0j-;2n +{~^ShE"32u!b0C>;Ѽ$Ϳ2H% W!'E~R'~cK2LfnZlB''xj3i%y15Dȷ"@'c8~<F
DWxwŇ0C\Tkq̸
lbLst'FL<$&ec爗I=r_c>C +iw1#BmÌxhp;_dRJ
I߰!_cΒ#Ղ*MWw[q# +bsl<UƩM7q<Pe*S6A(K02KV $|o7,SDDCZ=p4<<^ X
$v"牋d'+'LϪBqs~O$zk?R +6V\F'fnC8KT%˙y״;I#AxTUajgL`5ED_Qf N2++8c +gRQi"hū@>"iVV!dKAd2)Y酼8ʟ"/CgGdrǝ--D8cK(>5!LqU +r*d$("eu1Lj9YlhWߣRUΗ4K
!6=%5MQ&3 +s&$&H(QEf-1n%/شi BnKL@h&>W&Ap[Z72(MIIҩl7l'i)3KhA +[Rb'3 +/i
DfhsSNF|QD1_-&AʘppL/l + RxW9)?§Xk%'_nXHG)_3p< +LWҞ3]LUiyZ _|pi#5M>AV@V! +
s)lx +"hqblyR%I@SsbO(PIe+{HĊ&ӽ _[OBTF]|}ہEҷ-W 7O ^b:ޝ\TR]SJtæ|9د"cl 1V45.^z +nqwSwVfj92DT1DvPFk8b~;d]~>n.!NyN7NXəC+T8NIQS`Y0?4x<'Z7̃g +.lsMY#q3'dy)ZmŴ-IF^hFgmwp97ĤՌ^U,_{ܳ[ǯyTM'Ӗá5<\abcP%:9;ӉK}*WP3`Ŝ( +8W8SX.yކ>MXƠjD!E8];SZ]O!ﲶ+'+{_"6@cpZDN.᧩X3Agis$7 U +6ޢ*$EtQpj\bnIH_xBPe4K\FTQ +FעkRrhiq< +CӰ:5տ5<)J)79[|#{N9X2O=xp?AوQc_;|0,QPm Yůh{CM6gkuZk9>gjc:cY[.[|Uۊ9'a%9IOeUN97%|\-$_[Չx"e1/\gUjneji˜n`U[
%b%?dw}Zs,pvH[xr|S%PE9'#.xjy[/jm=jݿ!i<4]lmuS"l%
:^hh^ԥj9ض3t"w݉e
dzv +\>k2
`jP_4TG2¡p[st?pÑ,4<qqr1g.56W[yJ忢)[HE|ou|4.X|$^s6lE2C#v/^X I/ӧ
yD"Am|y̨,̬MHkU]{i%鉪Uo*c`YO.ӊ$&1P/* _l4 +qڞx
03&<@öAoްRӉ
p-bѿ*pq&s[n)kŻ뚒ӊ50NC q,1˧ʯEϴ3T֒=Eʳ +_s] ʞDCheG)I oT?NbEܜf+'}#hX<'{NfHs$*'O<PۖB'COm}G94 +y/\"çs T=u^an`. ґk# ,hs,c/K_jsH;s]d72߰Eΰήm{KL41#_myZHTm v3n8r4aᗰ3HeG[v;#6_֔>!IFQG'|6,܍7Xo`+.8aycM}M?E$D%Ւ۞M_M=.ZT@Q(KC[Kk%%ɪos<˲Khhp+PlJni;YӎLucuj8R%lWf&EUC%X[9ᚲ~$~uۖ0Tq +N*p}5y +AF~+Cc9/NtӯܲavUџ$MWM}ō1hmohF^*;q'-oܤcE[BZ[5)8!jRkIT}):Sה̨]\ +4if$"aR?\]i1`qCC6g~zsə³2_D2ܪl~\ܟڀVCf?/f2]INTx9"Wsu.BuN"*Ţ}U4LN_ψU>Ѱ$%&]*_u7q28}Gjr442/%dt2m
qS٦#;WC37Y +D729X.i' P#
rCpRML;a7ʠ+-7c|\LY05|-lŭE0ERJ8:t;)adsNr j,܋ +&amYD<=d.q +x$ʂKhK!T@p 䘙L$$K"u(mu]TJ[*?<_VH.j\RC7dxm ɛ |`=wm*РCYǡA`O9m2~02pCqЙ}w_>j1#@ffkB +p͢Lp8GVms\iiIIWBO2zig?UYng`N,DLs9Vv(ؐN\+f6D)->Èj7zYO3 M3v]@Ĭh~LcptGk4^ZbEJh}]K'eM=ƧYI/
#bId}H/0,1hg*%X*$v="}U牮ℤu8QE S!ڑʉ +q`5zkE!sLFI{ML&ًEt:pbi)8Ϥi/%N`s:Gu Mhp_y4!i2+ +l4V?lT4-w Jj?ƕN@hQϦ`RP1Ȧc+_UߗTB7Ia -P`
&h +ަ^YvUYTWv-sVT+Ť`()z:ܚE<Cp BT_
"U/<,V#JPS0uF5E@ Fr(:Z'NWW8\[ P%BI m,3K2i+a)h^V +-6 +ڪK(ڛt[ַ=sWƲə0M9fmS-E5i~[H3NKt-dI:;D&:I4PEJ͛$n3%lO +si9պ11BR:`.nX?/ceDh#-/~xV/FS,jLH|h,FB-AfC"49<jY2hďlBV햎PY}`4щD/P9[_Ή!3VTSsgO߯!5҃N,MC,RXQjT_T +[,svZHGQ M0(_ǴϳwX70V(gnT͛^] !t%Eo5L8NJ<EӾo3GYlv
fxXQJ^5JW$2ن(gnf96Xd' +|`,>Vɞ/
Gqr +Źd*G>ꈚ!wM/<oϋI,LrS2LU1M RɘQUl4&x٨oK+:*[R?^e5)?"\;xB?ρgC +6۳+wկۓݏ?ݝR,R6dvCSO\e=~|?2}^k[Ez+Q f۶ xޤBB%],]`4M/%Cw)XMiz-J猑R/ܴ
łb掲Qp5/_^%reD]}&g{ !e5"b(,CssnօRї+cE)Jzo^.Mu?%
ZN{J1FWś5\.9(*7Ǖ#h5WUL:[%ΑHۼ|R2I@wƷ*X[J +㉙"r^vۘ[z1:._%DUkv
1kD{$cf4a5_V}ӌCSNp0@jʭ4'Ua([b7$
p& +sn^m7&9都،_cDUPlZ[ʳ>${;^AǑnΔW{CfGVj<0AP\2{#g?`XH-)7ٲTvTo4n/iL
>f=4k=Èkԇ>B +R:Wj??8T5ՁzҸ9Iه8RRhLa<g-Osy:@Ɩ^gqɽӵI%*/9b{V 1]-6v=1r}ʌOex-HS\+MBɉWPGIx2^sMGO-V]UD`bOǞ ݓ㜢bZA<((&)<I/Hpq++Mt}B?5XHbcLb\k>Ex@X(eJSq!dUG3OMRiq|-!at.B.ɯR|])P!dHTOk$'QkV:~FnⰖmU
+#ؤ'k#t]6M +^qwQXoM +zeyOPbN0zq#褔b+K3jFZx$
J.zfw*w56/Wk
I>,go!
X.zZ,. +ˈe1e*S%^[W5xQav53< 'xJ8:b$W[Tǘ%-HI;Ѭa4²6ܤ8z0҈p̩K{oU/w +K>R,VR;c=eNfMHNI?=)P7hkʔ]i"r:3S8=3n뼝X6&ՖO6O]DRǩGvT[UCay;쩢}.g\8^O(+ +W@4)q&*KJVo''7F)$b<jHل"` ~YŨ=6Q
o(ӅK[ &nɞC3l2&z)P+'VlR$4ek%z" +;9BBQv8Z摝<HEUew!SOCgU*^_ +Jr:0+(bU@NxH4#j9(JЗZRe om/sF39ďiYUv(t HV!'Q(^Ac
ؼNsZ7p0ܗ&ZiL +̣*Xi~KE,) YCjQ#36hx +8,Ye3;Sn8@O"ofrB"G4zˠ+cӲ̺,/f*bZw1WFO\e?;;`Z1㧵_OR$cRd7j4L{f>4^RuHUO0b +*vc&_'ddEP[+~!nZ<TF ?9w/wTc #R!_R:tdz7?͠)6. +jRE|^dY<B"U2"a3$vv<G1*x@X(|.[Jd4ixC-BѣOHǪU~5,|=BH>}A`a e52$mGhTuxoHAR4F +u.ؽo{A6 +2:JӘ;rZ9C7h]]yz.olcG`z&y^F/~Ƞ_KAƧ fZ:ol#fCd$wg)xp{WJR;%=NH9ﵽFI+dvyֻ^K0 +*hPV<SAȅ
2~c $_̉)ɷtP1юtj;k}Ts|ܟlcaJ/}cewk_
+z4 gA + +ު춼A(
!x(EHHx9A2_$J&P(t!mߏr/ +R&!Ӎd%WS.Y]-㐧qbE($L\J%+49-MQ蜧H}1HRڂQɀ+CJencJcr +C#+,(ov(݂s'p7v>ܰK[fISB3E;F<BBF>F97g9 +.V)mvpx"#nɿwqN-U5U +@6!џ:bކ.10nn{ׯdb6Z,2/*Z&5)ɦX7 jx1+0o;ȱ]2.{*dZ@R-Hѧriik8PU,+v?\Ձ:Z7 +\9$"1 +BExJP=y?eшs>x%< +U5D@a-{Q"1uE⁹&)?Gϳ7bɓ2`b<[X*v(4Y%bAi-ߠ5 +,} Z/xD@'ʻIMPO;k(XnfȇE zX,oau +)T_[#Hc(\8 MҫH7ZkM(K|)G^*QŤbV1Tڂ<(nAHPX)e";F~9 ztybTނ4]W@̆y!R[sdz|T&{}0G= +dgn=UTcn`"Ahn~k{ +}Z[i1XsɍPSeWcsoD>/Dk:=*lagzN`CCU+kSiտ< Y6QU/r,gF<'H +IoGi'UQ2PؚEqmђO"ٕ-`#)t˴|7W2c4RruP>v +R*\a|k(㍇Wdngt~_hרZahGHU+]5T:9HcG~MLߩ]B5<bBd +)-sr"~y[`
tpiҘgcJPVN8JO+*t>r4~ΉHօ/Pf +O(,Ϳ~*w&{,;>UϔRؿyXTԊG=d +V^0"@2o=VL2'\0} +<i; +Qxy-ӕc*Jjn4uDKn_L:𢤜ƭ~eYVиJ-'@1=T4m:UeJ?Q;-SOS$LR整~HYfb'nȀ{A_Eo3LP2K5I_Z}嚦HR +Cshh +&J/fGZs@))jID:cwq+[8*XOox3hl-!/Z$RG!nqAt<ډad$-wk)>O fu[}M:L"C8fXI]jczI<8yS);GwwtƱx3e2fשs6yZwxԦҩIC_MB?H)]iRKx9e= {|e i,nAspTYjzb1|#~6[(4[ + ."2.@HHɗޓ$$0PԖ{VQ<UO=Ϲ`QW6}]_ĹD%k@xCF!ُBwRO2yدxZLڊӚYjm}ONӢz +]AJ#,=x(1fD ͦASugݏSmv4!Ѽ)r'E +%[SBԬZBߖlR"؏)<犳܄tūB~tR\aUs_iBI뼙<z;OF=9_7\
9sI~r=%WQHEېjS!2'xųV7@-,ENJͥM8w/ ,!~Yb%=2_,=7l,չ@^{*%G~<^ZHG6ɪ$~
(S1!:;:=#7Gغ'L!C;)'1-8\[NkU/蚷Tqy/wPvUՀjl% : +D+* F)&MIAUC%J,1%
@XA`/(*bgMs͘G-yJ"ω(K}A]ZD7Fy0:(B&q쇴=BXDzK6rdTÔ3E$
d~}U0Ea8&] L.S+%Q|^mOJt̮O^a9`Wx
Ch=2/4ݸdv,F7ݬvchr'`|RM֟]>fHXlSD3l=;92v^µŁ`l'ԱXw`5qꨣڌ:~!vbht8x\JpFG[zP9P=V!:[1^Lע6cTDgt)egS:HpK>\S4փ>jo8D|(-@7*i
cAx6Rw Dv_+h̔yյKCF'6^8I6k|.,jU +x4>40wPs)x|i5t{.ڰ{KJ:u[p \A Jz!<I7SQ:!3Luy:%&Gr@
H4yyWeU>`Q,Fiٌ8D?GHR; +[v ++3: e.BC1'N39OP;6Mz%s5[2`eSO)YZ6֩<ggLf*2*k$1@ +UN4gJZgt3s~[g@%l7G*L@zT
˟am.?lyFhe%?&PIz"\q`>2nPDYY^gLGVɞcdIvuxn~z똝KvPG*KsPydI=X&(I6SC7"g#]V3
NyjFo7e
R 2!]$u#?*^M38_O<!>/hPyn6*
nen"°D shF0hÚ +@FM1 + %Pw9'{l=nZ +ZĪ8njŢx\g}/N0NXe0Bhp]*lbNezW,Qҍ*2er<+b"g!L#@rH +H4TG +PyP*Vo致ADZAZC .Bh3U0oPWT}wwI^8QP@_M`<fВϐvëzjskJhw弒~ӗ%q8P?7:p}\shm5!P]q]3ޣZ
gKf;s֊ҫ_mI\RG[v,}Iܺk&blˋ?m_P= -'pL%B<Ǻ(f77=wWuSEU6\u
+9>jݸb{?0Qe{DYP
Ah
::*o=,: + C&X({%彈>S©!JT*Լ»gfDWCJPǚ5 +؍k"(oh3.w榈gF&r߆t]炻S8:c~_X{}[i}xLJxy_FopAhg,d}'UZ8
͂Z1v4Ա6I@SؒӁ0R;`m4} +lQic5Oc0g-űZ;wN!\ҝ?l !uK7#ө&n (m~RʝexꟵf>&|Igg 6Ͽc~&B +zSҩ34ɛZ<q@h&ӠÔi585QW|PS*i
*_u3,6,<VlaJ`tWuR;GG3j(Gd֯F,AkChBrp{Bҁ3O*~^%*ve?Z|yjzX1Kck~sg/ +RRV=jeپp@ݶ]c
1ij@#<O`[$]XxrIv-K}vlRJX]Ka.E1z1J7{?@oظPZgYq\Ei8UOf)COK&H9*x.у&TH JD#9o$9]uR>- + +~U^rViĠؖ?#SNf4sNJjKtrBs1t\ Vn-WT߆|pUa%jq.>!=NϢu HٯڥJ{e^0)A!@+b>"I$uAQOe{CrIYlPfh.<*4M_hAtr&Z^W,1薔#cƤ!F1G&yʌEHbh-¿$V屬y|,} XG]ߵeJu{py5w@]lq kAWy+ۇOy>muIMG<[QgD[0nIr+gKs`o)1op؈{JS6G'2rc%ddu*I[=*ƍ +u#jM|G+Tk*+g7Ls0U.lf!9q]gAiӂb1Yrރ^Yv +B_}%rb +E!UQp=/9f-p$0+KS!V>]I8XԩWsߡt5[;|?ݐh1SQ5#A?0M:Bg/t]ڐfbNB(sdkBEu8$ +AojJq%{Zpr?^lTcOVIG9z9{1!RSޏyk\7(I&dca0)>wMV{V+y?JEVH3\~;~FC]I<$m %+CU8S\ +pjƷ +i:T7u8/ -O_zil,+'u^|,%Sbqz1LFt!&8t-KVo~N4Ғ
B'~@u3j,'Y9 +)qs~n +ͳs䖖 +r +zm91\09Maoԝ>jjXd|nY!^1GXYUaV(bpm߱q<' +1 @(.$0cdJaFQBZU{c$+h&1Ľ8*cA4S"ӻɺ&nǠ8[E7m2{¡ 0\½ȏT7> &Qߥ|>R#` +cjmZҒ՟U**ByN,GQh<*.{KTmI1i!(GAO!A,9pyqX)0qP5T<K ⪤{?(4][0$8z[9br,^lW$.))5 +Lڨ"rFfL!=[$1Gz+f+(Et"HFMS
f5}ٯ4K4+53ѕ:RV.WU'KN{Kx[XEyXJg2;qeX487ˀ-QrLEut@Jy飌q7c)6@
`7spb-[/1c':J-2ϨM9V7Br~ezDy#a'* +B:㮡`EZ9/ɐo+2!~c yЇX8${L:jHtm"Wl/] #% +5K)%Y?4Riy?3/lǔH|?p.H2E +qM:ZV]Rҋ//7:^2`ӡ/G5BgOk?9ZYL`c|sSu{rK{Ϯqmu[=ٽ7ڐw.wI9uoI?&~xn:e4_5ͮ?IFo{!f0so>͟[87S? +LffSV[uVC-6k!7)!NjZ҉LqrF&Yk{<@\+$;r<e=V>H?<@0A%BCD +EEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abdef%g0h<iIjWkflvmnopqrtu v9wSxnyz{|~"Ceх@Qcv͐5RpҚ>dۣ/Zߪ
;iǯ0Nlɸ +,Os>lśHq̙4WxԘշ 5I[lzy`F+qO, uO)lF!gD! +V
#
g;^0{N"qE !"#p$G%%&'()j*L+/,,-./012p3\4J586(7889:;<=>?@AB~CoDaETFGG<H1I'JKL
MMNOPQRSTUVWXYZ[\]^_`abde +fgh#i-j7kAlMmYneorpqrstuvwyz%{;|Q}h~ς +)JkԋDiܔ*Rz˚HsɡEl4]ڱ0[=lŽKx¦ +^%
zA _'Hk4T q!9" +*+,-i.D//0123f4A556789^:8;;<=>x?R@,AABCDqEMF)GGHIJ|K[L;MMNOPQRuS\TEU0VWWXYZ[\]^_`valbacXdNeEf<g3h)i jkllmnopqrstuvwxyxzq{k|e}a~^\[\^bhoyÌ4Oj×"BcƠ'Ffé ?]|۳@eݼ 8jMČRɖ!gέ9~Qט'pܺP:16Nu>d( +a;|q7bA'):8%Xܯul4 +}D0[~->IpcOYd1XFh3SB4rE:"<;$;:ׯk"2wP\%U:%#y+hAZqgwu"
{^!xH_m0ξJʹ(%@h3ҭyx +1@]!],\~HJ_?L@M)LD"%9)ey%
:h~!> n`NN<ٵ/<P2C +C< +81W{{7;7*U[+)Mmiӳm
-R2b:#~]b/B +>?Ss{=ᰬjxkz^[ ++-= +ʯ]1GjÖNgGW,T$=]EN:uİwv
E{䱙6Chf()VލLu&oޛ,fR@7W}(\N:__zQ> +}3<SiI(qFq!uK`((zFs$/y˙mOTW*\蒅t-bK(D\ +b^E6,ءԻ;*s4ER(l$LKDE6Pou"
>;/e3ކTgMN2_6Ç=^9AD +b{}z_![JR?&Z;AHQan@({.YOwL/ WqxTd`Tk
+18mL~Hnx`,F}/ék?٢ɥ<ܧ8d~G% I=='o\*_!9&(=zN4脹QQy,\e;B*LM//eG9?~?&ʯ -8QWeH.hU61f +_|kw.A qm˴5+ge^lVӃ"W_״<#Ș(A5/b<%i4l<]+;rn*XgNV9h = Clb3Vs]~
}]E[gsϘkgɧѩ#eN8l5.Y4#FFqzV)5.qIǝw+&UH6ہDmt"ҦA5*rj](浴k+k*+nKF:iM-8[9%aӖm(
BBꝾ3dѥ$.XekD{ܪ潹aHCDCaG|Ojyћ(&v#1K/`\B"W^]o$SX! +!{A^O /]++M1|-H8MZNW7tnU{UT:P\V:0ɲ.X]9ܓnUNPVI19wY1!ݭuL}`%z +^CLuEe Ȇ^FuU6Q^=Wڗgg#J6ZbzgO}Ԗ5?WxEdkgtLrs剖͆[IݪF=uv>( !#9KM?!MځZj6wu1g+m:z G˷ˏY<"ExQtꁷ
JJQwCy}yy]Y[B𬋆MGpm=>K;9qw 0\u^>>P5Pޗ +0Q@s4rStvse<:lPYՒ& +d1zFzii0k + sʮS&0g'ǮSzO8-1vԪ{Xϲ5'&'P% +V^!DL:IT- +˯^O8n,t +p6mreYME%wHҮS&e6Nx&Mƀ0s`R#4l'2n^M\34\HW҆c 8a8m%#(5&^}?q% |^_S&5c8KS"C#%%{$:w"Y@'\,U֭I+Wfy/J깜3Y#q$tkH #ap%Xҭq_˾Llq~zv3^C>e~)~ +?b#2i7 +T~-u\ŮPC3%yZhWr 0 Ulg8YLGBZ9@sʤCYxmԁwݺrUO\ATDN8I,~,bFAWPeW3rReZ]< WݕiD`6pG,:la'["[):ZɞmTu]RrdZ!?Qip +ce7F +XZ1 +Jpa;-6{\JdDӎ +aM'UL7,NnfȺU0*B7K8- +LGA_֍ɏCmɊעsO 3~6lMs8X?נX2c
B]UtGݡUJ9ܙJ o>.)Cd%ޠ:V uMt
лohܮ=ߢܘ^HZHT5&{ʯ +|D=9_B.R?vup=oiHӑVuGU270=[Ǟ$2øR>6ǦV\l;Z܊V
+Kv6IzD[BGZO7e֢&[)\|Jd('Քȏrv!^!qKy=#ksbh'9rsrY[klʂ4jY8I{P,YM⑁
PƜEB@J=GLu,Z[1?+4֩}֮ZFOQ-81Tzw UsZf;9-rI7x8.ԜY~R8Ѳ}"%Ռ,GAW"VDD_d5৪x CaB=H~m?xH=EKEWOTv>}-jNH0 + }vWqĴufKқ[0\{PptE͞w;sD1(,x Y53Yh}qFeӮbZ̨P$nE
;`Α1l(I |άpس.ejZsOEss;Pjh1m(b U>|+^p~neqZ,1O(EQa;C1(ui9 ڈsZ~v0}jr}` +}U~BKg~ATdi76.%Bdfu +jl_&U`K5A0.7ueg.&*%;ɂ9˂u;jx#_TQU:&K=Aτ7i.,q_%[7)̏#uEmjg؋_U-t|K +BA%7d.1͆ +%w*Ereu`È|j1{_r厱U"J@pO7bS.C%VŅ$Wu ܗQiݼs_%2TǰJéЎ@飹7c._m6%4pڀ2͟ tN i^ⵗ^TgJ/w@֣$7d.xՊ&iAwPGtsˠiMVD^T]җJ}9@Ȣk7kv.J&GN֩Mt2MSiѡq^YuT&?MJ]@7zp.ˍ>&t#qok)shź_i^2SKJA@~7{ .Օ_c&A@sh
]곗USѭ\J+#@7f. Y&o |zo|z̑}3{i\}|)}|~
}/{~K}gn~~*S,~~>~*(~{,x{o{ta|k`|ǂg}zX}lJfB}łR:~>L~dp*~5yOAzrYzC{b{͈ڌ|4y|e/}Qa}x=}܃*\~;;yTyg}z zsz{f=w{xd4|gP|=4}a*&}׃lxE؋xΞAyJ"y!z5j>zv{M*cQ{܍O|i<|\*}rhwTx(3xy(NRyƉz@HuzՔb{nyOl|<|*(}VwՅwx'ex|,y<yНtzm}a{
<N{<H|;*8|vʾ$w@w)-xJxިyrLt'z*aFzN{N<{*E|t7v/wCwyMxx$y'sby`zVN9z;{*P|76^vѾѬvʏ'wEqwϼux^Oxꮫryw`EzMz;{]*Y|mvAGvdAwˆwû<x/x!r2y>+_yȤ!Mz_;{'*`{ދ眃txyvz+9zқ{ˁ|?ur|bAI}O~?;ހ~)lẃ< +D#;큊ZtLsa1dN/xN;SY (5eڋȀ!Fvh$lX +l +s(CgOJcA
pWLQQ xqyVŘ ķD҄k\o#wYy13K(S_~g뻱峅 ~[^0pɈG+ܵ} 5nȺcls✀J1"*< +^J6~QCX鯁59\
a1dFD04.w;0u.E_&Zcֈؕ=Gd+*erPh%sr,aе +b;i3 U^o#HV굾)2,obqVi4]vw>'׳W6!EI>_pz<ZEL#B
qMhK9/,\A!+%oK%¥>)xxcvL0bquf 7?jjh>?^\Y#ʯG)RBQX~F8F_D< +Q<_CUXyF|sM{v*4UWp`H +08Jm?qWߞS|lLwy ޙȫ +NL헡, +l~øjb7*&"4+\rT'Vn\5.q`&sS.RkICwv&[r{k +z!(A p!UjIRU:=ح.?\jDtE"5c9!ه=0
/F3h8{24Ulx
@ڦ>_L֩l-@]Nk GY$"N (64{/ׯl"eGeu1Y/ìD6J*%F@M#x|hUGZ-*|>'叹5EJw
Ty[uG)P*Gb! +,g,{?//\~7 +r# +jk|h?|s.jb6P^$@gH4<%"/+0i0 =yA ~'Y +NxR#po=F͵ڞO-t&73<á'$RM»"0XNG^1D>jhQߨM}&ǨpjO|dh2:'xiT+kmc{d4.W}iK?^-H,Q.So2P"rcWz$ajUNsZ2iqe͑ + hIGO^)uԿf}C&= +A%RV*Ȇ^^{B2ણ𫟠pZ'Qw?ⷛK<Q^nEf<۾VF +^-c8=ȣv&~ +r+*$v.g. +m_[U3:>7Մ;wb] +Q.7f#D(xabaO"Fޒn:`VuɖTUUNK}!oOrJoaxA؇u/PȆ2-6]*[U;/reU^ј +/.TklO"7{77T4^uo?yi|Wɒ4}Z?K5ukqrt-DtP)j}6N_߳Tڸ4Iq2VQFޒH@&5(AJ)]?E,{zuq yɴQti_nE> +bH|apԠ#_ +ex()S0I'b9F`"
{1ϫ>ʑ[ocW[YޙwiP19b$,&ĀGht~In+d7*'W<̓'Hfb k| %c*p} +d>_RW2nqQُu5f%ďܖ5b9YŔg=0^n&kk;7O,5|Wz/é/O앗1/˹x%:Y0 +{XG(U.vabYG錝=2 D^9'rGL^;Zc3z7+g EHu`V5 IDI|31vba0fsq>5vGYyf?B,ѽe91x"wԲ`&`h5
f0ظAۣ]SMC4aZQIPD" B`Ic͛DU֒v#(<KNݦУ۔7KC-dkm>snQqƨhM^{M7nJ +dsAZp|EPGP!>+5n+,$ˆW$ymÃ=nd8AZ-P}G*E=5ҋ,"$ď1UfyAndEc"_YLPGG=65C,vy$= +Kx nc}YBPDF$]=ٟpu5,%2ވx|mռ*cr#dYl>Ow=Fɤ=ў5)I),%BωF$x2mJc?ĤY<٠OFJ=ʞH52쑂-1%_c. +òz|wkzwٝ#{bx؉{yvx|[zc|{O}i|<C}}x)7~^~Zw+x[&yyzz6>nz}u6{ja|N|;}<)}v(ҿww͇xw8y'yڄt zY`{GM{;4|S(}Qt咈uؐvӫ"wp(hx8yNryЈ`zMM{]:|(|t tSBuؖv9wvxTqy-_6zaLz։':i{(|rtsdydtTu6vFv8awƕ4px7^wy7L-zg-:'{?2(|ޝrήsctnuyQv^pfwIpx6]y Kz9zM({)4rdtʝsU\t:SugwupvoRwϛY]<xKXy9zQ({jNr/Es
sIgtVutvnws\x]vKyI9zBD({+Oکr=rļs=QtyƑZuYvv@mw%\8x +Jx9qy)z+٥qԜr`sptDؐu!~vgmQv[wơwJx9UyȒ)zΊssˢu +mτsqBiohZyHX%+)!a{ȿiE5Jl"{IXf +ڢ1u,,r-U]wuq2&[tyqdܾonCQ
&Pa/C9a>#~a&uhbIQ;5)t'VAZẀ|%搾0S#Vuv?aboUsmDցzA6 hׇ +ƻ%LP()HPu'^hvPءlDntYryW+Ŵ6x'&ғw-Sq4¯Th00"7 +R.'|aO&>0HS#ma7CG|3=7fx[:I_ƛ[SK'fAр/ńm8,po R-.\
[&g(ǂ\/{,` vbLT +xG(=?j<@-h5-Ά1J8)5^6JnyE UD`<Rg=H_3<u P8a>)r.6%'IBXEuǏoF_Y2
;+CitSttKn:Inq;Ԯ +>M144b3fP/b$Zp 6NAy$Օ2>XчdmpG|j3'l5X)ی7=a/)JToKOӯGI!S~5{X!FM"U晚!(_'*RKQb%W!6Jӽȶ5TnQ + +*TArNr&f{.qM
LqL&0N; +n-ugzTnR +|Mvb [|(ߖLwud|іx\"qmw(Ta]g@5:^A
D{l%Gly/@bjDؔ݀:lK1I%P&Er"=1@cJ:G$x|@z'ƛ;NP);09%*P0[F]^k~m(WmяMQe + g*Vsfdj4!N̩nOGjmA8!#)9ʼֻJ'SaZS
eod+ekٓ<! /xolƷ4/hKtn`~jœTW +/c`Ў)C齑ee~x&u ٻ+&ȌIAj1sA/9t?
s#6ki|dT70t.r>9CHL(B,6XuznzMA*\_OZw%A}a209Tw"G(>bʷp0D7JלX8e~T.¬0~{=#b[1m0 +Vw5/mUZ/VHTM51R`Ji2Tud\ DxC|եߨ:msރYԵ#ݵ}\jb17U@ZGf&O +Uxftp<Tgu47JSM4RPNX' /n)5dg
QwUۂ3":+GB"H"+ACRp6h7k҈YJ1Ԥ<WrfNj#pK&/,VcNK7iIHveԌgp=5ۇ~SA0bwq*6Ca'PA.6hG.ZI:WO#kKLrk,oov5:?ur-)TF'-P2D(X,#d mC7mc]-%b]N(;;'Tipxza߱%x,Ao]Wk}f;!w7.鼶Ne'iܝ%;ho!͉ ݠ(Wf*ץ|-ۛK1فAIV^:CRU:XEVR Kfsw[Y~y.W,⡵yTrU`v\>Η~H7qN(s~;}!^p}x5 +DEDTK)(.UR ɔd&ɤ 7a;;;*SAdmw)k{Y<]%t@,kM@̑nc}ORUoM%I2;5kۮO22֠0}(d͇7-ӒOg`Av=u2"\7!s799x)gChUI!_VTZ8\
x54<!gHsW]>5fl)wbNJa}(П\XI\t>b7XYR2~8<T5TpUUK +q}#{+yk|NB[IiB]e$5~kh2"uT'A)bƐ|Ϗ-:+<b,tDyI;Lzۏ77ֳnFt2+J)O *Sis%zagQ{p&%pV#/fCҊ/[AD][@]eofj̠O>+i:%4弭'DUeQ"h_-$cFۻ +sֲX;cC%gwb3$s-[r`OϐV iDBƃz+)@*sG,#:jg֗ߒ$|tIC尞yP5uTsYmg˶;K7?5'-qhuw~Iܲ^ƺHiw*}݆<f՝lV3_TU +.8c +q2 'vذݮhQv^uw +TL " +aO#%z +(*D[0LBof= B 0Bd6FTR<=\`i8ZjveI3yqƨfnw%{'J_X3N-ލ}wElg)i=3pb +&|ײP^"#}hKB8m/Ebov%"-{Dȡ@!5acNm֓;bEW=EEwQ1_牋}+{OF$m~HXҴX+NMDKzW-I +_[JL%k?zwҾ|B=3R{aHDLk½KȞTK}x*͕}Y>ރVՉ's<LM'%jT[Ѥ>PF arʉe-3{yh+gԝ:9nb6$l`-6LK9
2G(k7%u}bLjQM4yWPD- +_CPny~3 +9[1הeʞԦdʤqM1jٛP6ds 3p:2_[(dQzI^M,)Ǫ`1;,Iڅf߰+ BkXnXZV0%+r34ߕ[IK265Eֶa:ҭN"ذ BgBS_5Ӫ8CT=ƕ^Y].@Ǻq0y7\U&64@r9ʥlG>·CP7W7Iֳ!|L} +a
Q$<4t +&14$P,4]*@qtZYr_D #nǍc<V6F40SQ.vbp;LCh'Di"IfG[ +X{;MOr4ۡuf=VO\ +<v*΄GefHK+.1Cl͓YX)dLt y]3'S0N,ro`pMf_vEksta)rJ,M7z[<Al nF<kY/k3ⱬ*xYlyTnF31`> +-;\T.Ls^Ӭ=XRcap|n;M<Kc|J<>ȹsÛWR֢6{:~#x,aGp_ +vwƍC{YG*df6W*xnZ6W~&.멌 +Z]WݭNiw_~ᅘ>.sϩWڞh{,-c(kyH^EL1y{d79_9+Yx?|\F%-3Ϭ̟XH)["cf]k\dqcxV?6>Oqn"5f+ +Y䯇w͵[i1BHê'a"_?::_?{p9 ],P/e/Y8*݊o,B&
4_^}$!>ra9ByGOpx N +zܰaZÅJ(J9WQXDhI+@E
LhA|ؽ|*<|D7
ϝa4(DÞ
6ua?rQ}NdƣT?;)IYArCOB_"O9*ԣۇުeE%V(0Fޝ^F]*a=RÚ#,&AGlG+`GX̱5ƨV̥c7R!`)rt .5vxAL_bYY'Lb&JqK: ٙd'{א(yq2a7Kj36)x QfE4WwSԙ.T3r<{W F= 6}G6ݡgh||9Eu;(ݕɶ{?y/ёkup'}oQocI~ki0ʪhJ[I;n$e]%tHzgtnv&6A%f82N5u754@KgdO~Csi<FOD-]כL^56-6ii)!n!5/i|/<)h}D7* +ġ:Sz˪D_PWv=[[<lF8#6Ƕ*^v"GӁ_j[I
Mw2:EB/KZ/Cbom^OV1wIJ^ G˴I<J +VdHWGeynXs2Ӹ#9cYO6+אּKe
K)/&w_ +眛%b5?Б9_m卯Iu.Q)^ƿ +!іk-h1@Ou9=R'hLЩfJb($i+(bW6Mrd'\r}ȀhZţr*BH߮lHZOqĭ~!*%AC {k!Lnt:=טOKl$M+E9S
R +VC>uM(4Jv?{AEBHt&@Msp)( %ӜP3Xkez֗"§6s͟Fc{RH."#O7Z1upDp@K>am'fGCAe}cX:|Jx+~WLjm®H,wH@5[UHRPgMǴP4cMnܙ~ZC> +lE8x?'}:遲;V.Ncj\DthU&ptW +T?Ѥm(G@ENux.ls 6*팵aai85Ts)S-?gOĢt78#@ox7~8D\bQ{U0E;C(~fRH)mс@b~uϫ @ߚVEGSojul6Si?*Bø;UJnv⬭6]g܋l0zWy7=O,8C=4Na\I[-%T)m($[l(+0dj8J,:wa_5c3"*lcqq^yEc3حm
b4"}I@zW*
qK z]Vc¤>EB)/A{Y昖)yn__[NQStĮSsts( +Wj;й۩T7AZzd!p^;VmJË%z +^BH(~kάe՟+&IUطƕٗt=)YޡwD:%b!$gF<{|5bW;F!QmBd]LDdSwb[b3(gYo:@ÀZ4CYF>a剺v[_6%SiiGc^]ap;KF 'd܄1UOg^sN +[iMY_~$?c!EUaExc4ZW9Ab.h,0X.Y>=4<5Q:ݏeoB]5;Kq*V7 +/PW%=ƈһ"aY욑?pIWFn^<QOI,J2G֡%7e1E{dN)U;[Vab[*i~B&zP;_v':@^{Vb+G5"ﲆ%D"RDpWH +ޤ^yDs~j#z~K*=pӜcAru"u. cqnA^ +vц>|rg\9ˉQ䈫F;U1'لׇ L`|1@q[5f-a[GQe>Fd;njډ1'V>)暠{fјxpJeޗ[)ёPF -;kz1jY'TlsVzx9oܚ_e-NZh&P-vEƐ;:1<?"'~9yҝ%o,dxZ +8O0EGn:1ꌾ'+iǟحy-٩`n̥dYƝOd#D':k0!'g̃(mpwu^o"lapbArNWsMxFuBwc8$y.qz$*|u~;&svͩ%u lPEvaw#WKxDMVywBz8g?{.}}-$O~wۈ׀t +800.Aa%Gだ~#tHSjO`SUޛbKՄAg!8.b%m:͆~9bs륙i_uIUcK:A·7h+.L%?}sҒsD $iR^"T6K=JAkI7Ǐo.u% +Q|\QruhԔ^u8sT~J8A)ь7l.~%1C|q#gca]TAZJƑ@ޒa\7k.gV%ƈ$Ʌ{iqYàgY]i[SܘJ+d +@7<.P3%̇ˈ҄tXz̧)lpӣof柸] SPmI@e97T.>%ч0wMn'mocqPY訉rPJ=tmFv%=vw4 ~y+0B{d"
}|~wtAm.OuWcavcYw_P@xFy=Zz4|=+OM}"ߎ"~v~zRl1zb{oYA{O¢K|F}>=<}4~+kt#RMIWu벼;l.-\bqX᥋uOuWFQ=42+q#QubІ
kKbQXwO~FL/<04+J#tk(a4XN'E˛_<̗4s+T#7X<BtGgjadWjNt@Ed<3+#݊|~wsٖIj*e`WGڐN#EQ_<s3^+Î?%#)s:Xiz`9CVߢNM̞,E `<R3ґ+ÍƉ${兼ri9q8_ѦVMDҙ0<(b3{+`$'LMcr8whҪ_}rV:t(MBZDD<7e3'+$6)rlԾ]o_c`[pZ&QqQ:@sAH4t@<"v7x]/z%'{ }%,lucF+uZ3vQ,*wH(x@<!y7{@/ؚ|(0} 5@lkzc{Y {_Q{H{!|@7}E7~/~(^!/nd:l-]bܵ9Y +kb;Y.1PkUGfc?g7뛁0)h(ڑ!τ2r6k7+aZmX鮃P-GϤ?џÉr7X06C(8"%08]j|aXܑOCG?+7֚K0Ak)"S&j癜aWJX_8OZGo~?7Ǚ0G)4"y) +tp_dr`TtyDu5wj`&y<giYWkB
lnt
pHdqCT9sDu`4w"&x܈w`gNii"ejdLllFn>vsuokcqISsZDTu4v菊&x0$xcixkרy=myo݇zIqwzsf^{quSU|wE|x4g}zh$~L|2v3s0vtVwuvjx2vxwuyxeTzWyT{&zDk{{4||$}}tU|du(|
u|v}6w}txu}dbyZ~QTzH~C{63|?$}rۅC/s˄^t9nu҃{vuswcx|SaygCkz3{$|q!pr͡stoBuXrvBbw/Rx؆By3fz$|qopدq̔KrstqvHaw&}RxLByo3:z%{ٽosvq
r'珊s;QtUpuq6avQwэB3x3z%{8oO+plqqrsÚ|ot+`mv Qw^Ax)2y%7z;Qnװooq +o
p1qN|rxms^tOv>IAwj2x莔%gz2l~i.b~k^'~mt~o`~qCp~s(`~tPvAI?x1zT#|;~|r +|sTw|t@Sg + +ALV aPA9zwXS[Zz**z̃VS ]r7O;lW~xL/'HhwGH\ŮP<7CUXy96`Ȅ7̨݆}j_, 9II[O@M
.hv,-B;,Q9]Ua4tNNv3Ƿ0/2&l}R|,sd6*Qe%LYp!=%*:|]|ӿA=b7 +L7+ziD-fU܀#Ogʤe =<}*`<bo4H[Z%}$t!~WY*ѹ$]CsKT`[fr;]|K qm\1!7mFCzaHO8!ۢBgh +"g>xG=iu#J26|&Ue6'L_Fss*vp}04u +F0iYS0yHw +ob<ƑjJB5>;T +3D˞3wKHhYiE\6+>UdG0Fym^#:kyQZ`J)3AÊ@H9}F{:RאSOAD +2ҦpVv|[2Y&;] +P
<CCK +CӇ*VYKe\~WT,t4ZCVm7թ
%Fԛp/̀h +#۵0К(w +NaX-STNHzN7 +:{t 꽭Yw J] ֦g]_W[Lh s0
A)iSc@qn)N|bj%}ļE'$8ۂ}g M-4{VO +qt\xNa%+c +f6ҁL
uDxIYTn32f8rܣ'L% Tܼ,Th +a| +;S|E\dD\)vmyxgyK's,%y-`#ڈ-Z&ԤtPUu<3T>^^Ӌo]
bkҠH-$\wahu4J5`JkJ9-YٗfVaj}aƃ $=.xy%WW Gj5Keo,J!Җ)ˤM)%k
"١xO>W-'fm1`*ڮZ(-ꗉ,ŭlXw:eJUC^="]NFHW +*-o}Va&ܨ38٨KUaG)}zT:<hH>V:B2lPRq(2IDw B98r;w\5I?vB7jª=lUit<r+SI@t"n>.=
ƴҘWOBte.]hA#0_!sKT@cs|< ip3<
hl"җ9t%0=5i6@L({|"l|=ZT--,Y}זTAn/ +ħorF0<h^ĒU{Kt[A!8.؆&lF3ezƩhpܥkf7m\oS q IyWs?/u-5w@,=ya##{}yodp0dpf_ra\ysRuNI Iv?V+xq5z,W{#g}Py5uot*vew[뜝xR;tyHŖHz?7{5/|,n(}#1~UU$xR{n|Od|[O}.Qv}HbN~:>M~5\R,h#|)wm!dTсZQ@H}>5e,$˂%vףmAXWcZ4 +{\|{S\|J}|B~~9~1sU)!*҇Dn<,2e-D\4&NSQsKJ\B@y9ΕB1) +"3n&/mLdCL[^RퟰfJR +m d5([]IRWJTxAЗ91c)ą3"#pl2cZR>e=IA 9koG1wه)<"}2nl"P`cDOZpQܝő*Iq#[AX~9@ꋾ1`W)닿&"Lj'sĄk{bΤÙ^Z-Q:I*A Y9x1K鋭)Ul"هŇG;jrk1pbbKYȠyQ?ɘIH6@8 +@ -q"侵V͘H)\\ zFKv$w''Ro5ݱ6'YB;;b QOGl EA%-zVuTS87)>m{WX]eGOsCX:}6R|t+jOPHFh}A&|1>SK3m3<]@Μ,_@z.=B1OF?{ۅ@o8g</kop߁fȈ$%"+P+G}=3hr/C}lg&;ɩC"6{gcz"fL*\fsӆrjws !VIN\a69Ǐ,8{,J,@tiQ0Y'=H4/zY4NR3.5q&[( +s&NIh诰WȞ!_+<mʢ.VC1HMq.xھ蕂#Ao4#R$;ٗNBʬ.Ȟ?@w.U<t9` +OG7\_ږ}NyYx**n=n$^p?NiyҎ?hZCRr-N%MoE0צ +;ks=R\T
W=$DE!A$K?弓|K ҥ6At&&~@" ]ꕆKΏ2VDQ2DqyG+=}r;v;M'4w_un#o/c/p +×Z{^5JgLHy(n_Mê28ɊD#ӆubQ[GD ԠUh4hsTP0RLޤ.>㿰#&Sd ++:):i5+FV 6Ed<G?vAdRU75+aX'Cp +M.j#ڋ~+cq<wAFpSe헢6qi'Axs7X-6BP +eah_tѲw#[&f4cl +x:S܈`n!'wv(zY(v©KV=RF5ӾI'!e(3xHN}qS>+<`29oS7,TQ[Ī֔ZHv +L[<iXct7>(1;*NvA并KMUuk;.Iw_ݧ Ww?/>&:x҄+I +Vݼ?ʄL7 -ղ(U]>PoKi^<(mGq]5:+[g=lצ@Q͞pt_ ʈ 98=a|6Eڐ{=hWhHޒ=]ՔnxTD~(eZ8T?! |oߜŚy&nPZ8SZU2UpP>G$Z=sAf՝Uqv&'jl¥ +3H_$U
]\7;@φ9QՇ~麝ډ=)]\UwS&[K
VwkG !.a)BEaA<jtm'OY51tV]d3R?a JM~M +\]MrDR +-GTL2>^C.%./Zs3 +kb3OL +"ԥE<c]DxL;7oCszq|w/g;6kU$_˵xo!ۉWnx! YY8iaq̰M<G$0aOm>53%qʂ|NX9>]kO$dsn= +Z6dHb@ 论!(Y +lo|,&8neq'[Z:Gû$Ҭ!PhJ;j+6*j"[{@Z#Z0S9Nz?+Ue]E#CҾe=L Qo8y*ˣhGQ8oIQ+ͺd*RMJ4d)-e[U2e+ bUֲ&j1zhB6m& +Ic#.=+) ԄE>!禔0U8)!R0&lIP^xM*<C=V}4@C5[Q]e98j縀nBWd7y@98GZnB?"72p5E߃"4 +uGX:){GX*<d8U$yݢ1%k0,K>rȸ'#pS)rllB6SWX4 \5'kW9[JoG)y %;LI+&k&V) +xƛؐ@FUmA/Е˧ +hnMm G]݀w*psJN&O߰oє>QT,P:DWKrԅV7,NS= 0+[XZS=<cߋ5kS뺋<^?q$EKcBd|P9$ Jٶp~>cލWEԴPs[9++f$w=\ٔɡIp1-HEl^)㲾[Fc)#gTcfA2N+V Tq,GD" +%cqvFCSy2ZnL%q`W88Ndbo/uItl,4ޚSzb(v@]巽JFܯU uF˚#ĵ&L[vBϕy6Ur⪬.?6FPI~o)x.$uyK8,$O]ϫ3jZkzKcuV{vii]sl]gaSŘ+lrqeK%p^tDW/kNoԕanh՞IhjWrL|+LD?o:wQ>/ʦ{\cHYyA6 [ +UfZeҩ=j+7'2m=ʃWY]+ gY1tGt<@!gM"$MH +1L
SaPXW"1)\)|+`E +Z^f*6OgQ +GeH"|ۉi\#$#XBȭxxOuu{mEeU*G>h:h>Vg'6+^hóG +1pXɢ<σe´pSv1\oM +BJI[oXJ1`Ȋ5pv\kE@]~#U.T`K!ѾkSxwmX<ȼbx 3LXjȗq9"JTIE?EBܣʯEt`2c +5Lͥi=^%;24qw 7$dJ0I`j\#0
_'uwu\(5o>1jJt8wj21L)A"HQ!Nl~GASMN!P֣+H;ޢ%R֑dL-Y/F7w-^9e1{Pj49$.
V$$(X=d,D"#WdB Pښ3'KBUʞh=Hi44GbZpIˬIYcMH^i]swƆZ3 [O֘<nj}y(Qq ̓fʪ%^OT'iPR6͕ӺO&ڢn{`LfsI/~88,o<'a +YU/2%;m|?hDZE/mqSܺIQJ
+G/dDŽ\ȿDUލs)َB~ZidMbkz0GDK=FB+*M⯊9ŏtS;=ıC<I
.rx^"N%^ +hQ/p=nD3fڛgz485ڭ`,n&l91ˈn
~
FA@L#ꣶ?aiYGNĶ7n k|vZMH]̗+p387G*(O\+ۖى"2.&Jވ]],tES 2/n-x,f,?@/|&:Y+zJ^-^?gcM1UOGpUb(;. i@F7Mtz(8c/xxI{G)b-*wEreL֞5/Lw|/YiIv)#!KwkᢈD"T +("G_|INVAeUQqբ(X@\-z,-/̓
Im.!u*FU0k^v--,ٖk%4k˸Ymz|
jCO0K LDPh5&-,Oc|/Lu:9dցD~`^ b(ʳD0¸d&va9b9̾}_dp3 6XCa뙈FEJlrDhJS7[wJ\63B63!&itBP'.Tg`wVvOcsP?IA<ق2 +lDV܊QŘNvo SY@cEA.yKqMX ލ}rܑtanQlg4M)$13:/yXmK1 &œ\IҤ:gcքp.J:T<&%I&er (J:pqŻwJObl2}gn_ɹ +q?ky2ra;`UFf ')kش-V
0Xd}:QwE4j'C>g,zTs:tLx|-dmf@/&_ +$D.$w#B2N!,Y-H@378/D=H=AlE&I6e/@2p".xM F`<9r ~':-
`~Sq1K,ǽ]ni7bD(gGLaP%fC!+ faǤIg4Gw1E&?STJ'YYq`G wt]#%~gq3iڻbpv1@MRJ4DžAqj +4.7$źHjʼnvl""10 +nfd5l8x +lW!ڃ~SRq\v|eǻdL>)~6s,-8 榃dpůC +z/o +Հ.fÔW?Xlcgl|Tr}r*
kAr:;9^Rm7`xM";Mғ'*wɱ%^jײߕyTsM&MiNf{pZ0bw'4U54 +lI5buT AiUs/8O>O.PNo jX[`ޥʁm.m@=XHt+]"fTNYeI!S:,$9CJ1Aj;+{+i:[4`)V +j2U`OR"v +v)S0>D3$[C fˊ1 샭s~!)FagqL܊ç5A$3z8NXE"4vha.
D=B\h_}<kizVb#
4pZ +_Baqx%_DsqףOس"zx[;VQT]5D- +AN?g:5g4D_GdABƒG +]) [B
G}{]wvOɑjNG)@⽂{1>rQ,HZЏ(جd}iO_}! ?a5
;5<V<ݘkXTOU~MW]R5$7S$ws,cHaid놶z2=cc_du"epL^ʊm/اAL#!fRgoqfAhh֓*`AMR2~dQ1zE6 +i)GGp'c8QF1^${.s#X1i & +²4s,,\n%H+\ʽ +yBy47Dl~Wg.cř!J#Kb BVƭMl_ԣhba]Yc7/2M{H<"51wѥaQX5Igq?34;ƪE=Lm:N?"\g4ż%"xM*u`玿rnP/gl2"uyiRC{Ao5_8"(wn+W,?ʻ^W}ڔ.CxM[[|d彁,ɦsUՖtU_.xҹ9YT6A-,4]\3Ͷ4*%jԧj=*x}f\NHL]_lv4n]t7u[fypyNQ%0jIbM
>3dEtj6h;_מصU6\i>iL@bd0m_ԉ_S +Aʰ|P +;q`BS0dKG,_SMd5y@+t[cMJXC +9!zERdNoSckzrd'BRU'z!*" +ѽCwP|%4=B"Ce6̇>B'p-sџ3ш<Mַiۜ5Fibt9E +~Ւ4Bb @68- 6aѲ3m6Iص?*A;=NVItXh1}C/'9eż,yj^q|vGJOui)|aB0YUs]qh:Mh&=]?77Wu3Lɡh^bYuTCUf'B`o=\։G7}D$Si`0ZRٙx֝E4 Q'|"ɨ+Nҭ7_P${|U핿c^ngU%MTG;@xN.7& +"2
"qB! o{M"]&JvI>SV{%l"uV+JzI%Mx:\6玬rN{Lf˛8aQRC[o^ꥧY"Ѩ-/rDM~0KH팕ϲ=xײi٣XI{HWZn* +a8SkJ!6 +x>.1ц2I|m&!{m4%6 "RmH&b9Pljkt
֬Qfrܢ4f8?$B,hnx4p<:(yWD[ƨo:9ȾEͦ!WDԉMz69f%!D>g"%ĥke&i5aHq{ba]zT*6Edn{C\Tk=*@$v1Pn(tl]'|s7*Ζ. }2 +Js*oS +*sUihjVRJSWw3nʨX_33!/RAxB?~q=QJOM`H;ffXT.nYLDVt`FUe[ >YtU}5X86"ژ8vu~|1D2R;%_|"Sh:f
m;'Æ +iXa\#=QI--*u'[<vrԹiN:-OK%T.y
`IJ4<FPeb +s.jzV/<^F'+hli[<מ\E#) 4dKR"/619R¢5Sl8MMv-waX.~^7".} ܨ*2#|/٧ǰ@y63-Hcћ}M8[5| +PT=}*(/]O|7ՙ +@"R,D QY5
[ ٨YV]vs:Sa)!Lg.!/.[modp,R[WK8~E!rei/paAE{3]~gYUa$O&u +Ns,|>寛)%<Fq#oJ+Z7lWQ#kKۄ>rz*pQrKG(7AbuiP3
bEG85 uTXꮘpPxT) +aKؐs_areE^EӑNt;F"ϐ/'{{d2J*weTsih{}|H\_=K0;yæočdq[o&_vΩl]/ +^QcHe.^0>bn?|~k@ +3t3dzT5mد7olҏL.68խo,*a$<;U-kf³̳L=Q:_2My!d0NS9f%Ena?Ժ,| +hpMjʈ HyC@t1Nր+L#l^s)]|+rt%aP.K?R-pp *]ZXO@5иmC'DQ4+sʽcu?нU8m"Eƍzbe ⊫ذG6Iu3ЇUbԮ|E]@SX@Rj!GV'ܖC`P2*_3" +o|6XazGrx6oD+Eɥ=h[BkI6쁦PYt?ҡns;}I9OԥT=r/&A儿@(즄Ę>=m`;Y|b[rw[̓/G#Y0'+|@`?81lo)ʺk`Jͫ-`#-Lts-DPnfՌ Rh,R{`tgNQ7po]\oNkc?k%/9b!8Ǻǟ +*U#U̿+̡>Uy/# +ޜ%h(+"+)
+sL)kzG)
<`Y$NմS]L$N"(/3Ql*Cc:MOmm-@Su_%MUϸ8lu)\3l5I*:VPXnknߛ}T`*@xfɝ:>U?vqŧ;ʰ$]kk]kmU5 ^hȧw=T8
Թ|3V+hinP$YkŖ9ƿOU7( +EuK"1 2aa_ͱWAH;a},2wcBxV9Lj
=`| +O<fasGjmJ"[^Ƭ?Apu +@# +s=b F4j/".ܻvA;H @RNYnh$54ņsӺgj7fv
Eߦގqߟkˠ<Wę?Ə\XĐ.ŽӨ.tO|X=e},BolX
#0\YdhEEq]쩨ƎaVbَp</4ֽ4֧5nMI$bq3Q_~/{xb(!6w-Í&/ԠR%1EsvU]kUBVMT*́nWwM(~Koi>
DiuY5a(g92Q^y|V`R#XjJxzV3UBo*6&Ķ/eonnoYэ<FlMx-U?cTj=yY4S;)%8u ٭-ӵ^"kSC؋C%MmRO(-O9vGz%pV~К!
`Ȁ5U<QFQ;8*K%)̔Q8V<>T$./Fgv9l=G6ިQ7Ȫ۔)uj#Nb`Poyd"X̟*>r8P.u6rwW<QgPEr!D0hیkbpztdrS*Cs ظ_x-O + GݚfZLu
~}fi0Oҧ9Z$NhFgG.{wA'G p]{l#tTR8oBS|=b<s98;J2W=8<Yu?G Y}7ߵl<{͝IBb]%z+DVk.^&p,FkSD.}E^7cGtSjE=Nz]N:U=u_
SɾN,ikOFRu(veV|YsEDŽ&˯W1z*J~OJy5dJ.էxeVI8.ԥ|MJ)=[/M<F]38/V{3Gj]iIeCN<>A~k@ +ЎOYVq+,rySpL$#'|*;O*F{uF?H99yN8O/pRRD|ʫT/s+}(uc@<1u_`F38I"#3^(D*+ܫhXj\ @/ȏJȿwRA]CR#8"N/D/Je\@P[)UqPNPYu#v'u崳 +9SxSKPQ9UXU0əR a!Y{inqVw릜5 +3NK `H(BXӃ}
f*R@QZJbsUԅ#o#D,&dHϘD3þ +yk-:X|u7\@p䶹NF)q.HJ6F|J˽
ҪjqUUJw=E܅[Lכ6c
Fl%F@M,X#]7u,Q]kg%6{8oyZRh J@m]E檖xJWGbj$Z`9wI;ubޭfA2_5Ep$>^1ϬI+
1π2-K<RIߢCE'>>N~#+;㾭uueV7QJӠR<C% J~
H/eבK*tȿ/P47v1) l>.~<`(aHru0
^HYɟ#/Pp"V=#/duKU\gQ~X%|(,+fYړu>~NVjfʸ\[J-P\~Shem^K^s%vL}W-<R0s^=l^LRLGw<ey,OG/*eEpʺ!402X]dwsvIf+([WdIxe%عf ]bmρ$c"
uxTWPf i.ƛȜQ6߈:r[Z@4zL]xسXq@CvݝjIj{,އDYƱsRi)] +tw·&z Ti߇Hd&P-
b +DtxCS2Vu ; U8{28+4Ùu;l[HB=4PN
ES-ʫ}u:Vd6`*+A6ڙ ? +ԲW<ff6Ǚ_HcEҋ9dk}
85k*la)sW/]VㆣYšbU5;|Cma0Gi + +(U\=purٿJPWy ,<h8g&W8wTIl@3o뢝ݺ-9!IL:LÀ?jۣ'AUgBʟbFy3= 0C]P +̜ԤCU syy;g.wHFyEtC?FQ۳%Dubp"Fy}3wr}Icu3!QDwVHcu|H#aFɗ2db6/$V~ |$}8* +Z{x[)4tuLM~q|?D7̤oi'[!tqÙ~`7}B7de*_B;ekэ3qQ8!!.d=<`jEɌu4F-8owrE +h1Kg7?lN&E-CJN$I%O|tQR^<UY$_`baGqa?zf@[aԷE.s+].*2BeʄԢr2XMPk($H1 +&Ȕdd#+aBY9'mE[UŁZZۊ֪rEj-y})F>76ѧ0 +.*G|\ x'I'ȪP}&-Y>Ht"5"7<%5JQ>RBR20v"7cS0W6l
mxvPQGKzchND2Vľ`o$NU:ÏڧtEя zٳ
s7GPX/?89RK."q5r'sR|L6pX߃e[Q
qP?`BU~vT{8,S/ k[iQjw|aUѰZ."8*{Jw6 +R8fXFnK]:|7MlELu乱[DW1-rd= oެXjo4AG5^ϷO>[ts:]c +㗢m/%nH*~є:O߱?QvԭVt1gis3$YVM^!ɽ gU|hzR8j:iԝXaɼ2C:s'Aæ!j4՝Uqb'n4:ULβMfN&_37ZCa?T jg}%T2+֫wqL
][/%30e}ML/e +M +iQ/V\V+#uU}9 ,'C
"Qyc=S^kI?+cѱ
aөƸ *RZ
+d):d/Q~_C7e\Nz1SP}rETp,h0DcX_ļ88V@ەhcBփB:GCKL+$\e,#%
H 0+H&obW;Ƚx|h0Y $Flқk$&M]|ZCz$$\$~S>8/t $0g
qEh3v9Q*!rgL\0d%A?4G/ǘ;!(SH0Bo!bp\{wN./5a5UuofK`
cR p1ݷ71aݴݏQ9EXJXN +"S.]G6
9&LS5լ'k№JA|c]8s$ͣ:ƻu8/od\ի~(TAs]&Kʨǐz DOm<. l-\MXWfĘiIefX[w97Fo/3ۀ4.R=/o>qfB?"%6r}nّ~δՠMr0~0@K L%>BW.~NuOo8dYw@sGȔL/s~C^_JGTX)z@@ +Rݼ.Sy^eLbVNm=ZTdiZ^a76 +x^)^hƥ{|F{
FUk4>,h@DBwB~Q/mGcrOpGuq^L90m5YJ9hIFb\D'l_$0tWdnx FO>FƔRC\;NI|W|"0UJ"Q
wdTbPjˊ1|'r +7LA4QТ-ek7w´_lLPEڠSC1U}NA ͚49h3Cd>ЩTDS1|ּ$0PCA< +BP=xFjU9<8
7 >ʏfLbz +v7&2F1դ`BމY.&=Gt,PG - +|. .ܫCL=k4҄$mŏq1Ec#oڧ a%-{ֈ&W&hWoV._QL?k*H깺-2L }2%ln͈i[A¤S݂FwWn@#ګ陻VTO2wMX&HS{b/.ifL +t5dqQG6֫`yБ;Q`/%Nj$1.ȫׂaf895:Ktg8rܣ~6dtQ}ii4["YIV
6Iֿ Pb5QMSEHEΒosҖȇfLvٸQ
սQG画!Κ +\ѲӏuKPݤmeI4= b(rdQ0d~qyOPÒ\5
qԵm7/}-7Th:|X}.O_j\mg@?Rx࠳w +3>&P;y[fs[* +᮪%Œܚ-l3^dSkvfi|W|78qmw";%eg0OJʇkmOEUd<v
acgU
K8G#~|}`YPG'Z aIg3iǵWZiN=Mh6ԍU9;lZ!qSw3C][岮7M[_46@+sh^R{%L̡bi!E8f%0B~/AtIؙL$0|Mꃅd䕴f|HRWP)?APos)7 +zT+ +0xQ
:GdN;FM;c`\ё02x]ɒ[AYNۏ0
i:(ܿYѪ h7&r6l[]M+~jX_N7d\oPS5u +[c/2*>%-1En
T9|+NeN +*:ݭ<l4w>DaRsK!"w1djuDvI_~3|S^kRZK8oF[f*ƃ"i2f=1NJ#Q+,$fNZµSk-]ewtts:fl8Hc0_l}{Pe$ t~<a +NýA]2Ѹ0O)2Ú([*j#T!эg+ck䭮tӅRצen*y\fƙA7`@ +<5j ~<u#:Dx'Dw욪.<?+Mi\ln C
.',,keKTJ0_CWD;9lo~|_cmV\gK(ߘS:/"vIuÔ +!ȳWxpd(ׇ:5Ġ\'v]_R]*dhZϑ*n@BSw +,BuH"M܊DĿ1M`t*6e>O*lE}d=ML>VG̨:W52ĖqRØJ4Dϣ_!d%q!9vR%-P2w|$D%`,fȐk fʯp1z6_o^`n|z(Ւ/M?s)Ŵ2D]J3*B]T^ڇ8\\ht%rQEbߐ\t(f'✷34JŔ9.`p^g{y4u-3LjF倐kfUvW+MW +eWL/xNꖻ! +\# XAl>/LjXj\,:@f-ճj_;q6XE%Yܘ1=ʥTSaM!q#zJ/@=Lb6M[T1QOTر(c
9qb1m`QDYMl݆P(}Kĭh +v6 ai C!ԋgTB1AG.зrB +Q}DۦtcRb"Zͤ-+?b=[#V[cd 4r%>v7_?=`.^*g{d+Sզ> ?VPg"c4oJ*kHc(b鶎`+{m"fUq-µ+NK`HpeS^dɘ&q^R]pٱh>\U鿧O]]y:qNRQᆎ
y6ɟZgҾ5=4iD!:+Ѻ/ +[vZb⼄XI燖՟HYXI\$_;jo'Pz´\K}X{i]~Xc-|Rj䔂݉RY8S+AHGѿ@IJLˮ+PNi]$`l<UwFKÁ +WӰXh5?8䐡[_t*0_\9FMor*/:Ad4i^c +˪ #YZP+25c~F0{ ]cvIHf*H3I]$T?|P*:O%%]WֆH+-h3HEbTHzEW:F/MzUP*7QTF6~kh"/G|~P2
\@d8tN4,F= +3)pmF
ih.p0,?rMވ牵^D諻;5۲)5 JNF2('FMϢi7 +Z
r]FBM'&B1z>2!hD_cpNq +PG%R|^08V*4;}XbLhOtGD:m3
1CbȔȦqfmU|:MM,uinkAPyX^]Z&2V>BZZ,Nj\@園A) |F嫇I<=Nx7]")Xޓմ2dS]:?&Q{CMFkȨ+B?$(qyu۾t/q
V,b H5R&sdSJk>Z*irm +gsS{7]hM7e!͗Pxey+8WqRg)JZsZ6]WMZ9;hVXcZmQ5[F.s*Ū@~sdIy@꺥T*~O~6t>Y0C7{a40F"TxLAnQ? +iW0wBZ(+zLҴ}*|)1&=ŋh(mCoӆhd0`0=16]B;6n +B ]Jm%
بDD5b!P>KsxJנg ]%K3$]iuѧҽ'>*fDsT1
YdB +6?'Q7j!,Z-c0k
+'kOX[T!f<75?Nd{6zmC_cSus=kei4OmMk!T<2|"Ӧ"s*4{S/kvD1f<E?+zΦ9}5ޤmx4XEFÂ/Jlr?*z7I٨m<*hjS^Ycy՞bQUĿ3`?s+V,cOTeIvjf9sph3],N*`]KF¿gW&jGN<B[LVtZQ\M'+^Ro*UA[-}O5&JѺk7)ʸ_Z`S'Uljw1Ɖ?Y5;HͯTL2S$vP.P0lju8[hQw%texjʔX ŋZxx]pzIJ6?1U;餍X%v-vXn +i HPt8|r7=IAÉh9DcJlLySx>-.߁GkG盉䗹c/IO6x(9 +:B++쉻~3xy?Pͭ0'M' hh'<H8 }NVFݒ!l.]'ծNO?zYδa7^\R-cǡڜO,I]|f>}<@tiTox8h쯯oRՙBˡXz +^i b.y:+W6̮·3yhD6/a{CoxwBJ +W.yUIYݫ,Qzp(v烜ޘY_.N!a^CxdmA$d',1Usg{cϜ_qb.gmZKÖeo"._T
v6(פΒJ'0c9nȘPx7@c'meZc%7WMEr3WxMe>hF<ԧ0ωnehG.Û-TJά05ᯙ(MGKPyP$uM>q8D$.{(v*rtYOC;ǣᇨAT_JeA)7D軀DE(y:GI1?qk{ +:^KjAd.##o<r v\Z5;'H1CYML"M$`&"_HAaWBăR! DLQJ4KPJ{7ҜQ_.Δ1|.PS :._R/@Qo}ׁNpvb|ڕMӞi۰ΨsL-1.━wn|[bK}u!3 '赺 +iu)Y_Ev֑Z)pgEgYk$~JƊk;ڣ@"!=|]ڂϙ(a8DA-3x! +OZ3t'X~0p@"J1"E[L;C} XQCTk{j/kwh0 L 6[6֘,ykp<c>f{'*$g!}ߙCH +E?Lߜ+^I[CE
ѡ~ˬ/n{6\fhZ*ͺ0wFqe8<`vU<MO;ڠ5nj|InEGV4HOv}U:;M"]uE? ӌ{պz;sY&Ou,TҔM^Ol1ڡ?|Qs_2?Ǻ"ISu[vҔM+mO +mh Domx*'to0ƕǝl +37>*N792ѓ/ø
IN<YirMY.ӄ +|U o~Y><,!5@)ܠڤÖ7䥪`4\)ҬVMM\Q{d~L +&kUC)"듲85_:֜CM$n4e\ +l + +(nEHb!=d&N +%&PkpZ<7/pLaRv%V/:b)<HmJ&+.JvA&Xҝq[AG2BmOOӝ93OYyK\dwi0Vtz'{l}g8(xc( baHtdw¯.EVQƱ75`8ʋO5^|uEK{~osI6joEhZc +$Hx(ԍ<w2|*G8]j(.L3h1PڤXi}߄?h5آ :߱ K<q^i;2f# C$fMXs
T/,^39&)iTY\f`fl@4-6J07{)?v?r2H6Nxhx@F%c`*R5qmd!ֹ!cv5&WZ{M89<KWtmWp]ũQ7Z,=HY@^'y"+<'i^
xڷE`\%`WΈmxG`aR"/әLi|rODi +UCYZ/ST
5ȼ.NQ8r|i2K{>T)7%k[*qیL]>>b-i);i' lm-OL=W!fcOri8z}働dFTF3wd +r_Ģ +)))U$7kZ6!
dwNH}+MUjx'5I},#
y<zQ5Ս2LuH-s;]v { +m1rMȞɬ;I_guҭKjdEAVTujjryF :+7Ab1hO +UZUݲ
;P_9 +:&`<yMXԃy!O`}JgS\Z;S9;
_$^7pxWcA=]xsj]U*-+pBk̉~e
1tk +3y`C8y7}"K,/Bhz;]^MIVdkӚ4P% zR͋0-}F_Yk}絃x`~|i/|#e9-KpUmo/Eq^)tkvvRI2OVP1Y1J殺Q}Ѵ@=^ +XbT! ½onNR +
s߳3;'l&e4TKxPLUZp_ׄq*geNLy}qs0Һ+Lo5hٸިvC>6i)PjN:GN4yC)Dn!EHEܗu][BH5SQAkaFvh>la3Yڦ"ciǰYJ."fibEφiQMn"dib0b".)VXȋD/S|"SaÂj='҄O@V8Er0!f+.-m6h#Ƶ (A0e##B懿hn +oܠǙiQ`aamt.MegH GG_?-1'6sD53J<oXkOhCLaθӒOAcKd*iDa!2.ՇO~p:<:-D7f:1l2 +][i*=(5@JrXr־:"~'PJ
KT{(~F䋛Z|D<oR8gL:ãjlcZ*/̱X)=q-u;oU۳`{/]ܗ</P<g<(
K̩Qsb_f}ƋU;wsR3Y̬*57iw=)z[OGZg3m?ǩJS\?jYyyҭ"{Ho_d[5eD=u\E@r*#B]TXY _ݨcFus Xd5q;cetO02GRu]46cT6=f&>)mDb{
~|XtBs[hN@Zø_.FxvH=r͙#{EDaq<(t.i`PX:tnӮ!xFg.zvaCkPg.c@5jPuT/"p[B +J*/3rVxuxtc?Țzh9UJd +Ԭ?Yܷҧlpʀ}{*Γ=sֻ]+] @ffL-]NQ'tw$UyqSK%¢VOm'?4\ᵚ#U}ܙsGuE[{ݯtyru볊GU[$/6]7xڌcyH`o}Ɛ`Y/4>i|*-~A>]{ORnu|3f124r?=B +&+?_ +ty/ockێρ:vMBTCWQPRqGe%2^aԶDG-%a(!V!ى$g46aD%KOPVd&=V('9&Ǝ8$*#<H85qE<M[˃uP?<}N k(jjdϾ%d~]hsKCNZb30(ʞA_:s=>y^?_+y`GI6A#eګB*hboXfaaS͇ + +KԥvǑ:U+EbuC +)%@3NeCI#në/饆˅p854*c\QAY +%bjIfhM>E"pHÄ4M*tq\U:, <0y3
etE>~Fgo*۰&6$N'ҒCX; lrRWEM(e{O ö֢Yxb?IԓkdV)TP +B\oW|L^472V2qQT`){N` +%KP#J +э\fe dyi'-V[WChd&CꘆV3Pi`j*Zԡj̷o^e~r5dd<Y~Zh˖Xj~WP$()WUSڠq-ĭf@ھc'pn#=&{?`nq#G?ayᔣ3>~g|1B
L +xW]0̤oqfi<imcp댏`P0%,<*RkI7553efepǿ)pnk➸(n]ݸmo 7yŽǿ~%SSR4瀦44a:˕2==ܟΦ4sY@gM&W=X(bQl7000000030Hq) wAW;OYIO{W'`u<+_F?\(G@nWӥo!k|XWVOȅ>esgvSS|!g9IgQث§|sU"UG>8\ddpga乆^\'t{UovՉ}kJE|VҗddCCT08S&r\cyWS><hqixZ^-7im@0rXoa*a*g; "j+~MB_'z$,))?I5$xa}J
w_6X=BXh),ڲ +únzgI)I{IÅ/vrZ7U扪%/ʨ +KͼڛEʇnR`>wdgzK_Ai' +QBGlZmmh6;csqDFWcm0oU)kfjriJE!_,.s(]fnۛfj + +_!R4E,͕:&4M̙نc-,tQK'd- +( +""(*^"xcu}ӗ}<3Oއp;R-Xo7qr0:'MjqJ-ҦW)URÚe[ܥpi4
lՐ8Ȕ#N0iVQQʊ/2fjr2fd*"t:E=YˮUjU?]짶:+
H>nㆼWGޱbUI=Jڠ(cTd5f2Z3W3WP)8A݅2p/鄇1ܥyvBZ+OWh"yz*B;[Ti; +dù2B7x@lCyQEn\.Y2ϼ͚TL)~CQȘm!3f
ag>? +ʩe.y ܃N1"ϔNa[~8NΠGUam=#$FQ.'3<9f"-]0ۂGkq[A{N/.',È}PRP[ţ}yM"V!n9wn> + p$vmȼ&Rs,lx.G<˖G
IY\O.<͜!,_`o0IA,t[6 4^yyߊ>]0GoCPP,b(d%kr5AR1ei\< |H%rM6M.8Ų[ yUvW>&LǪ2Jp +4 +h|fuC9tИ0LTdh(m,<<5C4f<m y7@X3hsl۞:8.:<|GWI6ŋrޫWEEي +pj$;茙#1!P] ON[j76xJc~h=Oaȥ,9sxKc.rkzl W{-ajTŝ_WwT}5ua XiO_'/ڗ'c
ϫ#N9PK= +&x֝4A[ܡw[j濾8m+n,}H١]\;~.'q1*6&gɅkre<>Ї-moMʆʀ5tj;N +ui4\~:dBJ8T!0: Ee6)k1
KĖNS2/3`KCB!7y͗tA&< +hґ84gOY%>~WYTlY3MN2
cl)Sd죈]TQM[~p~0<@wh@ŜH L;IDvCL($^%*ʲR{ɅF}f堎, +y&`~4p @ AFHG24y_#zFeqzBTmfңэRScR&o<V_í+
DPG"^xKS+<Q-"xXF
ufkl$G7"vsD*bǚR$7 I=2AZ@7e~>-ZhB'2#E +ƪXc,Cd OaM-(M~N]LDטĽV1i7CϪ63yㅌDq{Q&<|+">f?,?a6tLj4j\BR+8fz%eR^2I`1t{ܚ~b`@s@SFmmtW3لyܫv5[5rXjfs +&2xqJ5g,º AdBˉ}wnOfjp0?I7Wu h%+:K,$Y!yd.oĚ +oރ6<e/&s֣&oʋ5@ȓM* k©-XsUѿNwTN_|l_v5;7͇w${pg-tțwz!N=ci_c$M#KBc(^fM@? +m!3m~ձ(nɩ4rnEKzε:xֽ&p֫ +j69#߯fhS϶ΟU~;u&J=gOJq37|vASrŹ^2Yf,AXvͯF&~˞O?R='dK[*"$DJݹmu!#{Nצ3Խ\
xdžUv32`e + +8 +K9bh|l.7nIh^J>*T<HFTɒ02:GaR(
41| +su +4F/ǂ"\N Jn8dcm#e.F)ֲh5mc9Ѽr<
Z]/JiWPz-5;eGeX-aehV>NAT2$]ZuX4Fjbl(^`:`A2a侮j?]w\"g'cm%H7*bg,L& GEw%"+'NcX'gh;|k}?1yZ=N&"gQQ4eFu2 }^kk
+ٝt@#dh:9h/T:l}Ώ!"<G"I깠BtH=W6.Y0$3'?{';X3,0=h}cZ.gpǽGLz\-4o!
$ +*yUW5>G#;6B7v҅-錵vg
4AcJϺOZܾzʶ2#2xuK9.u:P4chձ*Tqle܄ +rKN&7) +0p<=NfobЎofῚ,`4{o/9Lp1(8VBN%Eq&i~`=kPݷWp| +K*FSJVz*"^pd&<7ocx5C!4P@٩PyVHwWE-e+xt0$]NIQ1lG5ب1Є4;%#Y)eڹE_N([7+hQ,3m9<l`Lv{}P5@S`0 ?>x)M4Jj^y2%_$ ET\ Zrȣ3bht`::IЀQC=jsЎaH H.[L|ZaiR6SިZ t i2d>C9ۢPP)S9NsF'pKh9Љa2u[gl57ZWJE*,2Glkh?Zvd@ƋjGMc0hD
{5OB{@ +lflP{p=tA?yi]J-;IwE7Ы1ZQ7ڨ"FJLơrQC7tIQYoMjh>g@megJ\`<|NLbRx%}c,ZQc.%mܢ)6+fEհYa2{} ;بHbr!} >P?ɳk{K4\iaTtEQ!6iz
.w541-MB69u^ϜӧTf0Jr]#ACd:Lw2vO[e+M,.>fِȔkOk9M}m@\>aX[YlWsMǒw#KⲴ\IЄZPC3j> +;HK]L!.bq$1g.5|̀r#Y<܍R}[q&jؽL2^Sg]Ըkk.OzkxZ~=>G@qmMPt)؞vߝpWigp*R\V xefS=Y^*
L6"Jf̓w 9߽Ezf<l8pg**yۑRaIkP:TyVES'˅e.J+k2M0IJ'(mqjzq{~
H戓SsSgo`p5&6XsKlI:OP4'ڝ#nqgK.D7߭sRڵ-5{}ӇÛFUGףˑ7mL{&2kj\d2DžokYi8WMe"Uɞe
Ҡ+1X= PC>8s%DwgMaN] @f~(,`OD. NgX&>sMxȘ2f!S7b$o?߾M+э_\yzrt>2 *Mv/*êyr:r-I1MR钯7hգIѩS:ۮ$hC
A|m_7g?~xw_?{xt5ϸ_v4Č8vZq;cx, @B @@$$ +S6N88I_b>ZB90VR|V]ӼiF/їadnH3Mfw>7xcS} +aEdǀn8K,BZ*lȞ`wp^w^8@:$u<dִm*ov +=ls }+x#-`ǃV.`u{ +Ü9\N{x"|L] !菐fol7x@?ґ iq#]+([`dx%Th`;D+^@il:VӘI؆`
86ҐnggW!THE^CB,}LR*YEˡŒeLt9TI$˸k><q@<9$֓GD;ewE.E5Q.oc!π5Z,Y&HpgʗRF!eKa]ě3g1 mژ |+
H +P((tB,ȐKZR\ZLʖXn
a
rrS9yB3X1A=#K߮Ax6PpEA сCd}`RrW.Gp|_xW( :+ŪU A1|8q?b#HiXbSPꎆ2 (
"A1!4fR^2$Q|l4f*RS<ZO*R%R'
W1kCʍ +NťrN}{]s]l/v^,^oPpd +8EHU@*Ґ4dB/pd6FV2_v{َT^ܾ6HE#/68"bIsgruLzT*^T(j/}褚Nfӭow~וրFAVYmhQ~J^WKayЂ +uHa۵|JP2J]
i@쌠s}?-~G +kP'T2_=u!.2J **MR rTKJEP3䂪3nedA]Pig҄3p3{|G; x |3_|J[Oz1..w%=.=-jK`fASԭ@:B.~5v?|iu5{emc;;W1xs8u@Y_kkSd4)K|U]u=
@&Ґ4nznta8Ťk)_6)Md +osOV<Sþvu[}`o%Vf. +S}M3Za{|{ci$٩v^%0U<FO09|J=Ĕ{ʘJjK^O{
HCѷPkyA֑u/ߙ=}Ūn
_+w!DEO% NP<'ሄי%|ƛy:AopU
37̿y:ߦm잷{@]Kʛ;aE!s1EϡariSBtZ6,ڻfilտ3j`r6w,ؠŘk0|Eq8¿8?99'1g]#J~2<.'"2ln +iHmYru#Q=su.o +l,raߞ06081pԇV$
=N|@8Yp'8 +uvĺ]}0,`q8Ha*0`Ă3 +>BռFOk`1[{!/ɂFvD؋qg8sS<]7;@mhND+-O +'y2><ϼ4=48hKDHC84[px<N)_'k)2+ՐrQ($ZJDC|z f'}<Kz}U"vAC4cvp1ntBekhҔeJlR$_T!eTLCOLא-td;"
x&}D#
B!l!DZB,"Oi" +?8N#^vOf}^L[U->+R}w{(?D68*RbH!i9j v&tΣ +("( r + ((X'呷ece5~?
/ +r,_5KRқV@Z?}\ڃ^e159@K@ +N;,iΥ BDDԡjyZ5yP(T@tO : +/P +!'Io`0Mt04Q[ +ݍ4FL/78 +
:p`; +^#<]Ҿ{'.<Ќ +0G'7%ڴ"*'ʑq::bڈfBi-mtY \f%CB-[b]f>?vЉfs|ΈtrAu)%hy
Y|
5U4Ś&n3=Y3tm*v!Ynqٿ9~>8h?5U4Q}*ϐ4xMhJReMI2EclITt7`TD(rYCkombc'<Z_ЍiG$-q2[Ȓ"&z!QGXC}]l]!_XWtCtZﬞ[~8:&MÁQr{߅&3cKȭB\3Fh4k(Tn6ՠthm5F +f`:uɍK7{-=w=\>ntS_ Ie
+"Yh^Rw$+MERw({$:.
OTE2.l;X.hi.{kEݍϺiV ̙DsegO0c(vh l4Yty /L!SzA|k:<Ϳ<0-puoZ`_,m_3
+'YW|;.{|QJ_8@L!?z@ͅO?KEu r|W-Ftpbڏ?n^3Xok/lAOWϽQg> i|q1OϒPOgAEbe>0Lgtz:ֵAEa
HBBH ;T@A nXEq_uwT`P, +XQBM@^z.>7=y9;
fd[Oh6%37DiDý/B\X
jG]Un-uuҎxDx#"户<luC!v0:hF5~#j*3fj:Z7x|m*q4,~|_LΫ8C@1#xpkcC2#BԱ([;.ezω]bωJj /-ӈ:0,Wbb;-lҰʃ]h6D1GkB (P7"Pdwݐ yf5SKS_55glXau*V;s֓Þ +bAu#v`g9AD%s^&+dAԼJcB̙n*,^*wV X> +Λ=k.p r{+.;∐7I5-o"/i2W +| +wJ~ѐgl߸IxDG|QlBSTJ@5MHg&O䟃Ze/dN+f'2Bx.b.R\ # +q\'AI5?~Tۧh:Ov)AʱV M>K#kSќ#l[|Hs4# &Q0:?z2`3Z3xX3tB=|^~C)j85Cd[kKewl=Wݧ2珆Es&wpjȝe?$ +*Szn8F7zL;_ڏa44G0=qvvWӔЧ5dlH ĶVP;:_BB!d}N?SQJ #+c @+c}x]D}ۨEӽa>ĽԶq- ݺF^Abw9H=ɋf#j)6+llO' x3C&Ҙ*rG{zb겺Y2n;8Ox]'un&cd`l\%#s#[YU,{q5_e]9XSN[\M
pnqy_s$rCБw%<H!ِb2l#i5 +<u;hyz%"Y{2)36%16rk
z#5Gv͔v5agS̓tt̂r!!iSl&wPK"VfD!!]+Lk5)܇I +&U/9B
)RKkvZܺNK9
drrb%J)kwQ?]d0C: +Xr)
L{SUSWSJ// +k/NO^|6?ŧ%-uҖcZS '|i9)V6_U2<:Mwp"4\WxN[r&^l*;%)(;!Tv\#沃e@>s:fBk[/DwMY1`a{LJ?,NJU$->UTf(Z~TVj:"c:8j:8kQ1Oo2U5Irs?Ph +KM%/q/ \bO=}z=
K#?&YFҋdKQii(q߫C @z?D͝GhOv^+;eGb2| |KY&F{.{y$Hp{>+,wcq(k6nKCyE^C.hT,Z؛jejZk/63IHgtF$b# #JXPDz>N3dDhfW꺯E|vo- +Pe1ZRLp0{ M16@xF_u7U2ukʛ%!_![UxH(/m'8۟DF )SWV`,i@j &81p<^yjP8 +QqT**"{oV& OHBHR@ +8YGVҒۿHK]E'Ŀ<_Nc!gDC +B," +>j?GXaUx}֧}2mm6:8Bf(Ofi"f=sC +=pe'((IE :yV#&/0!qSm84k "7V3[!s)N|>DSHLF퍒D)1Z~ȿſwȯ(>k!j:`X
XVa7wlT>
GFϻC%˓~%2
b:IxtCx-l6F#g/S>(uZfi r~ںkVnZ{<q דHv"Lf3w$L^Z)QB&@gG2ϰ+?!j5ׁvG-T'|lB]iȎDj'OnNM?ϐ2 +$ѥZI-YRT%!ɩ!IgHR @[cD5^5slQub^srL{AGFxޖ®Ѩ\nr'I\K +yEV~:J^9//\ʋcʵSy2(W#2C@ٸ& e +k1)q-wcg.=U[jRDL.)VXHRJYQ)4H(^QצPqE;}m
`i]&P?uN:fiJenk. +!9dbC&s&-&L/U<2/>7?7^ë5gnxxJ)?`W5۲CkמXy[W_KQNmLPc> _Cg4HF^ ';!@*JA:=Q-JhW&<>^AQ!Xm,sHٲ;W.i͟3~Usx~Uo;>O8D4UTf/rҳs2RT)BF& +Ka/Oߞ"ACuBBC zJCږܹ|x*/-h3ѲruCpR|T(*`+lDdT"*4%촚Vbfo,QڣM-283#o^;~__=k&7y|Rp]Y(.#u8Y!3%Uɑ*4YJTRU%dYs1IvWGvk
=0` +m +۾|WW
xںKVl=/n{TYV.sNQb3JD
[B(y
AQSpyZl~S6 Yt$__s|>|agX|ymW[\[Kw5ufq +ETHG?R(2 +RȢ(xz +ݯ_o1Z4
k"u8wo
)ϼ1_'T.lHVݩض:o;Uy$S]y6Cu~BVuy[U2H7NGNۡ*;t0?]l˚|o&mFh\tW55K6jVo&lLDJW֝٠MS?[y&:Ƣ"|y.<4;?X$%6*L{2AB4,NU[*i
{5 ET,}XR +kn*k kMG-zx +[U6UݳCeƠvڙ3^oy Z7uT+lU/[K//LKv$`cKKګb%6mȵAOsj{yd:r'euZ:R=O%EcQԥ1 L&~Fc䇬|=D47m-sƚBzKoC?M1~Ӏ|
{%
, +2ٚ( +8MNg'̝/'aLGR/s!؞!2#Ͳ}>AhO+B>!0jd2>&O 9K +sW, @`O, `:`A$;::IwPZ.42l0zNDLu +sak +F~V +:ۋqA@$ +mPBh&h% vV ߔqE۴ +༖sz,. 1"oWW +$I`ev@U.!}A*-mA~,WfQ~(Qt9 wAz:Ȩ0e HOUw,Z[H
_"O-eՐՠizA:^QT!Uۀ3\A̘Jz +Ye|`%_dUNV^~W!yд+4YTe7bP +?S5XN,g]"ԳmY1 +v-~urvܞLRdW:xFaم"q-E8 ++XrmJX1o+=P*qYAB.ҥ*
FENx)>x-?bEnWޞIOlX̚\,CmBLQ,)*T/U TDYXef>VOf
I>|5˪ +=mwlǂqcCΙZL& +JP1j\Jm&Q >Ջ[tY:N+jŏ4#FABqisa֗.ty[qFʭ-~LUtͷ*rsTOtZNed'
JYA!6`1C~6&{I|} +
sa
v~}k穪5Nk6w<N u1Rhx)Rfaʔr,CkRY:2m$Ad2L {xO48,Ey .ZWupU{y6-@e)4Nʷ0FG +2TRDYXV.qlř\b('9/6i3R@\^2.u[i*p\m:U:rK)*be$rYb$zQGZ<DGה4-TE;a'̈jPҦR\ab9-Sx>ΥuW{ӁƆM1KG 6:CU9i1L2dM'Ds`0&Z{~Z`|h48^
TvpvvҶ/5lÉkC!S
ƒ3y*r4+@/0gOd%5k4 ySڄ)L
fx8O6ܩZP۳ʩg낆K+=[P]s1HQYjZNWU̸ + +wʦU6*b+1ϰXۓ\̠j?YDnwt\rnW9_Is{ö黢e'rO*?)مhK=d@5mnE7J[n_I^ɢk_:C\0rtq4ѵ>LJgnR
% +!qnBrlDu +""^DO';:u;A< +gA7GY\ojr<!G!_%DŽ;f>?S| +֪Ho=&!;lOgOl&tu0c>c?ixXr0$P@u?̡~p0^ALJ8
( Цg#-BzIiJ~uDSKd^#^1x/E#>0X@0$O7ea<HPY +dO!c/idluJFMaa#ދ @
h6/*aq Kh4H-\R-F_u2 8:N +#jXtI$iO^#W4(o ?2Ph3VBiΣ )Cլ
;1|,dt#+kꔁCެ `3XP90ba'Cgq9#T#]~']]>>W^O*]ʛ=E'"PuTE + stl FN% K1dS̀rWDXRlҾQ~}th^_v5Ui5+뺘:I}=82N Sa +kv02"P 5J̶{LN据LJCfMUЬۡV骦tWܬy`5<;&r#Y@0LTd!?P6Z!,Q&uyŭ{a\`zf\fybW#6S}{#i/Y5;[o-VZ6j> +*S-Dt/Ž,ץ7٤O +4mswmͶdmVg;hݰ__گ:kr:CswZ6GA$̍OfL]߿ڹjYN|2PR/5ʭt:]wq^ulr^鼜cnRż\
6iWAkXPQUWOEvdi;2qr̀UgU-wҵenOEss.ɵkKYv]S' +?/]|EqUaOɡ{1X?smG3~YiJ[\}REOV
GWQoCG*8P\[boɛ9K*#9`YS|7Lxt{8`nj#tA.ZK!3̘3F342.CY\JnIWNw<J-v={|~ok}a+8PƱ^ +%᧔̔r;JRO'˩
NjC M2NS<եJ}K:!Z(gˊƚwx^jqՔ7Gùúm4zJ3MmHi46Qʨ&2F%yYA~Q^30')3TAenBOb#RSrsJ;{2C;.CD6NLjJ}Ffz
Ǭ +*RV9UFmbRYREv >^$_Ez:Q PUXt*2yiYqg0>OI,z*Kb^"z'OD x,O+VE`]HF
x$2T_Xmu{W8xPl-ro(kI2VfferB0!3O1[9~>90`Y.<\䩂V#@MjeP fJsL)mVJc uʼn(fXlDbU 2Y& ="g;`-YrUA} +_7Tٺ0`7,W]t>[k,[]1'NEi|-etn-+"T^(w07U{*H9+s
>K|%(W
puƅ5M^;TT[C..%JSRy +)l!)?()E x0`Np?W7JZث4h
La7JNUmP48ȕQG$,N=Adlj +cŅaM@,'GKĢ~lj(EKV}+`ZwZaU0m;m嶱פ-Fv:MH<T%%kRUV\93(GKkr*r"+w9Ent +jj"TfjppI
wb&}]}Zͽz*J~qGZcC qi
Riz+>';^WTasP]FbRZk*"Ҁ' +l{bJ7= +^<0څm?lv\YQ3uҫ
.{]$f
QB Ia1}}TRP_6)Ot,21`h@8#xGU +^e.m"/M\0^kd>k%7{7>N߿ tv}]e2bGߪksx-[Q%}\
P: xB2>iawQM6ܵqvO;>9Y|~gok/v_ímYleg=UZX&scn.V`P89 `@{Ñ>Ӊ@k}_dd̶ۜ=7A.VcCi"D$3nۍQFtj* +˨_L= +|PWhUa@ۅҪQz-u~;2lY~v7D{8g6Y@2xt6."B +(؟<}$:m3<Ag>B}@B@<}c
rx쯼rVWE+'0sIFwF_N}GQ;}P'F4@2_ 28RN " d] +sHcA)>a'0-,u +s?*vpy\~r6.&d>pGyOC@8< +ݭ!z(gmO.ul.=C4-}5'B7W+Mˊ]]K,;u:=>;DpD=fbl@4LnVj gd|Ck^,Zu!27rYY3S*y}.ɤIuc:#gCɟKP<P2 v +|;ZA.rtL/s-MzQȰmY.ri^s=GθlL:EMzq±ʣ)kGR*[}IՇj4~\Kִk߫jwkwf2d[b3u߱fބgؤ{EN$;7i#ܤRSש*5t4{t5ݺ{mi[zUJ3 Rl kX<npǵm^c[J)oWK=/&O-TWmT]٭/mחmoKߢ%J4R>}~]_oX5lAY5u +Nv`51JcZ7@o@-o5H<ή"_ϭ)YRݝcTmIl\42l23V*{eڌu%縮^c`XC%MczJ2{F"Ҽ4;bY?~Y#g(TYXL-3\n*5g*M;טdNf2].4=)]9ԓ3('aȷ-t"mi︆Jٍe>qJюȪiK?/1/
)\a0[6m\C.`0fȥ%各"Jn$9{vkHK;>~yίuޜŋϚ7wyZo0=_V.ϓU6R+W.˳e2Ҧ2e3ٲ/dsT[S/Dm2-Frn6pՆ霩ZS-v8T8JXU,/1fWNjr^<-GQ-ϨVg(';CkvY,㹜ȘõL[SfJ`R-F}O7]|X]y[xuSH}[Cwmޙ=)[P( +TF6E*^1S(cȉW<ޖ=59FkhbւZk`A
n6/V6l㢞&?fK}`mKeUϞqaY|DNqRBZQjZb~"./OWw07jg*reD9yOT_eͅA}W +i@[%2ED|*5[)jHq`s!tn.e͝ƵBNacIcgSD@v}Lhjm|L|urrDeZtRDZY!<.업T\5*bG0&`b/u +:$n9G|eQ№xi,YҠL n(I n<]x$I؟ts[Pda&AT*QT*i.n2*;M +
눏iO
jW}۾;VQUq:*zĦ·H}R<,#38p``t3[
Ctk_p-:a8+tHrmHDMYa"*4Uؿo<ȯX!DY2 +7fG!GHBkFPvR躃+5㪧YKBo=C}"C ~C+|}{|W|*L{?:zdC= +(20-˗c.Ks#/Lp? +5,؈As
RPCK-q2s\@
MW!Sњd:-AWE譫ej(]Jo +D M@Cf"t&LdULddgE-tOLpf>Z`fAEK +D1r]ih@j9Zb9uDZ!͐{ܳL
3Xb|1?K wkd΅tC`QgFEJ3
mL&)lVWD>Ѧ_=-t#tqR26͆i3vlvgEn]uq*su;#{t +}ܯ?ޏ>>
_P-Qms?t;<wn"`j;uo
F1x~N +vu:vys~<<s
nσdz 4@;g! WփP*k09x~jz)lDN5F仐}oCy =wKMaCgaansx5>q +uxЋ +jì]7E3DU
vB X0@2Г\[^Vŕ<ۢOo!f(1{eJF$ ֱZq)gx7wxJ|[)╋J/ay;_o +M[Yfݫݕ#mgg)t)5[Uf:MSVkU.BsM-qR3%W#3M7ifNABF [m
\A[v +[vTNTp bsL^&fJST +mNLkФhk4~MxHKP;*ԾQ'k'I1 41&У,SkwZ[\z#"]Zb#+?%15W)U"N8NO5kx#i\T~PѽRsNxٓJc@dApu7X@@M>CH5uTzS +^DvYMc/eՙFT}iffG!1j.P(1 +DdFAe5,g>*#xܺu{s&HY-kURܼ=yekխ^wcU\Ì_:f~FϠ!9Jj2D~QW}=!_sToE)q)+ +2Ss22b)8]pcEtA[JT~oJĮ;GSuLЛC +KzhO<Ho-o$*(q
?_ߢX{.Ѵ[>R<I=xt^GG/DmbUDdU +:C/cdK*Ksӫ$G{{d*^dd({md_ +h~:-zB
MGDh:lfCB\ y3Ș(RQA`"6 +SX(bpa={(:H('T2Т1->K_OZޤOJƤ +;*[:ր:ϱƱ٣ct;_*۩@^ +tA!m84t`QEHC7nJ6N(caer`P'w9} +EUhʸ4T0P0Eo)ID/{@{h-Yjk/̻=2-,vxP?Ӝ{i=Ѵzgޢנw(#X37}1TlZ9u<ȅGO+DN4oޟX>\gcL0|qAqˠ *0HDICv$ {N%$ +@T\^ю9v<Vfl;}XXwx#\纇{?ލ{F~t]ƣcxt˥YaK($_b.]Y==jy<wxugaǛ1w8 +sXItbn0I=+sA׃<Jy|v
9CBCOа٠Q/h*XJ6m?!2.MU5}Ujv15:drrr:B=Cf<;x9c2|1qbcLШ0.VI;$+yĸek\1,l~1̍8,fElؓ&V ++#ORw
pNLQ^^]t`t7=?s=lױ-wC|ww@
xyr_7Te2m16})x +v9DOXqr}c2/l)qmRExHKrIq9.#7%: +#[rtJH2FVͨ51*eG*d esR8"2,MCЄY ^uJ&2\_9gR&׳%(k:[=zdSW)3~VR.E9Spc4/C晑f=ׄ٠l"i9w>uwnj"ppPawE]Жqf
I15rbEJ2ݚ.Vg +զ|E`V&AaK_}J"2FTQg.x +N+Z%̫(za{>qe=VkFUdH %Jz.cJ1r5bRKj%4]sIy"MӾi%kEiLPptǹ +_P)ԺWrgi" *n`F +[ȿ䉙 f*Dm +" ?_{;ڝۦXS%;{3/xg|{.F_(!S9JO:sNBiEYRǦ8b[QIv>۱Q4o>?B<\к2>wU$Z\PUV:2Yt;+2)9!IEi
kBl٪UE I=܍P BN!4B*Z<Z1zcvN]zm8cu*mjꖪbTZ|-
?*b +
ge&[YJY3,>exp +Hp!
9쩐B7^vy"3ϸ|Zp!Y: +ASBFzˁŒ +:\Ot;1-{A n}p?@"=#0_D1E0fӥÆ~װ1_Q]DDOBwÏ N ;Lg:A[D%Sdn&)&R +Bh"h!*%!(Jًșy'$3G;<q[VTK9sj)X[Zzl']oX}Y@q5|Ār"/@E@RqGp%&JM鈝#oi_*kJN魄߬7ۤZwd
ò:[Vk;-fs5ϥć}ʳ1u
*mD.Kt 2W.;#L0%*kg+n+/R6$}KZIZAu%yRvݪsBuD]8p4hKbt[L,Ȧg˽zs4ޏfsẐ[3t9r텴s~P\tU8t-;te{tJ݁gOd3Z23
0v(B'8RY0 sIW0O?h='S(<+]y.+;5/kaHٌeR?ŮՆܮ"wc;G3G2d +=y)`YM{ bo&Dyؼ0OvF5uq ".ŵ*@ @f@ % vv= ADAPc-[G匧uα=3z[l?>??{XONG=pWyiE,juw`Z )'Zqwo=ϯ j#X3y$aAl*/'#"!҅`;H> /[)Ao\Ot?!z]$a\x?AŔ~ԇmAn|8oP;!w!-_CE Ivϔv8VpG
3<F:fUaC +)y AIiYREZMk6ڤ]a-fxI\xvxzz9Hp[8R }S3Hp77sf~Η2\ϧ<ոo21ȢHmOLoI00兌rSD>^Y+2JrIqT \N" +F>2Ӳ:MH1M8E#VkFIYJgR\^Ҽ$iB9 +Ĕ tAeƧfE<RW.;k%OI#R~Z* >t2/"RR|f?'j +;p~Q| p~3~<7xekD0۶:;@KvVkiK&F옶^LI'T)qs*3eMFgǙLq\e.[5]*#^q:*>@7vs߂ݠM)Fc'`ݧkTȉRISy
lnibqbb؍HV㣈#FE)zPS +@_.1/qQDoXN\ojߊŕ2wegF/7[aх箶@r?s +墐Ԥ_7`|9^\k3G:0qkQY@]MPGH +ұ9lj$z+=}y\g +t4h(L$x,luX>VB߈JܯCȷ!M#B +@) +b_Z)=@y@@H0!Uh"<@?r-C
4P.O_r3s3O.5i%ژnVzHA.' +ϰ/O)X bIJC_R /H
"T;!t;?MNРC bLNwʛ8Ty\ou&N.bș+Fe-ZdҴ2
kADA-X@AY$}A@"@$,ְM,BTj\ѱjS;L]PxB/ۙ*93ܿ}y}{Ň(QJOԉԊ_E!f%ff6c + +S07to$.fpAz\GT.ث..eY&mo͈gS[RY XVRɚJY'PQ<Nlu##{̕,}`|?G50T ꭎ`<K4MU2EMPyz\.ȖY C
_*dlK^q +xYRTQ#JW$nQhbTL) 59?5?<qkɏ0F̠`{B@rgS!αQrx%U*1٥28VT$LUU%nRmOLQ%N +6MKTKT4,x&;_+
AW?Mn;syeϳ!ѯP)X^%Ό\NP6+&bOX+8T;,W̶QI%iف}1:]k53J3ڮjݩU+mI^,Kk̈IϦ'j +42f984vq_5f% +{9tbЇ{>MO;ҶLZ_%'H
NiOmk\6P9Xv>vjގHh>l.+8'{ + +8CՐk(1Ԯ1{F[I1uλEnFkġÇޮ-fs76 +?E7ŶdF|oVn%8G!yLOo}Mr:+ْ3?9ߤQNE7/ + ĊB塄XpzTKc=?'`><(
+g@x/,^%{cM& +J)O6`_AH5#lvx +w̟,(-Ѻ-'KDY Yr;(Gq0g:o1zE)'VhYXPSSlWQ~wmgm/ݶw+vϨ0ȚCb&9sY݂<lY$NQqԓg:-v^JMKe#۵kve:%I$<MzF[iSsksG/SȇM"X1Jg^O-)5xw*wygyg5<[<뻙)dvHkzAw~fduZ[^s?*E&Gt8Bc! +44G0֜7FL}8ڕ~ߟϺ4:
Lvqۃ2WNN.o}+v˚dGee_
!yܫQIxƅG +sjG\{3Br:B#MNjm3$a||+Za!EAEE~EYyͼAq|_,YTjjY|@ +S$ +R3R +T$TX@AA LXXk\hƬbI,ѻgx̽ywO~}<\^ c-{
cמZ3ǶM}urY3-VeDd,sZ6=yiwbjj))sR(f4(RZ)1)71ɃA1ɯc?&}kpȗuRl/4CUbZINA^њб#rbR2&\5obtyl*ELZQptfETnA靁"""# +#%p-,#iO؇KPUbR+LQ),[`U8cyv_=$e9AY_go +>Y>!/}B2
F*kp.w;Mw\TV裴~+&KJ̓gY/s]85 3"wX~Oh~!_7}F!'=+3h0Bb>Fg|dľJce+]VTyk/dhcق
+blq +/OZmFY{p:7EWEYy 砲+N%CE\nf}by}=yϯ`U12wXagɒOiRFm%&DpB Wf:)ʝvʃ6U'U]4d׆Ov\a
Ζ +6c^D7;#hɛf7Fikd6qgchQM<5^4tkԽ]|4,ѓ̿-z +p]8}օmK躴˦mqnۧvD˱o4'<ղmt95F +Ojc4:0Qܡ:vDH:㥓;I;WuvnTԹKպEeb_T&tvKƟ|by⍪wj>Dn欤.= +9Ǻ`3^9~hs/Iٸ?P3
F$SSGDI$͇)I´B2lx5iH涐rgȧS!I8y7cww(8%x/)c< +f`=فt0DFCSdzoҫ'IEY^%˭~mNy|JJ|*Q> [`uW,SބX'6 +"pɃQKw(cW%һ +T[JN@lFKhemjD[Эu =F'U%V%zeBbU3+PY3y"<pݸ0wMz,f
$/[jۗ-h$]mo3X672ZEZQîR4Tts*2HHxHb.XehPeAcP
\3naց$ + +^e>,@?gkaH_5|-zoP_""Hk(5uxmeڤ`(CRKxF X`>~qtz)^Wj|ȕ-z
?W8=
+w]Wy +#dg;k +N_rY,ENZ5.+B +9\K,?=T_)A[.^6_\EsPpgp(xX{Xg_Ž!{B!ZCU]5RyXTQf,aU9^֢~C)1(L)6]R!*!<fyFȍ·8#BmT_i_+=#ԕ1oɻb&iral1͆̕/䭆%Jysl)6_SESSS[c{fC769Zb%%Cr籟ľ:/p&= Q$͎a҄[hK>'n4it&zj]1Wc,[g,622
jaX;!b_@ !B dMlQO"8nxqicם:v4Ӥ[bil̸xF9wyrx-byF϶6|G8f1 +q&<Ra8&;dnx&ʼ6 ! Dh(ljND/e>KĜ"c$6}7}f~})1@<NϰqO8^nc|W-
7K,%'y< +U.rn+uqܑtw1`k~7pVfnQg!PK/3 +SMlwΗTkg
SfMi<}("d?:?: +[y}轼=ݼ|W +[߮M TrZr7 +^d6Q&#a#d#}l דd_D?9GD+)<$Du?Җ1Z[猶R+"_YzQyo6`
u[tka6(6#ɣ\h%I҈~+PGuڢu#dV&؈v.7~Txuƪm1y5 +$.A->TےVx$E!MRjl"[*~-z|ɒV},%!W<-\Ex&kTs5ԙn}/ m0rqQvLǑʆ84G,[Tɶ88"-P[P,E$^ zCMԾ>Z1o9lZm0ʴפtlo.oQhT
Xy)U(RĊ&Ne]Gn ΐ.[N+NZY.{SZw?T9/6YkKyowpow`DNڷgg0 +vlwQ5hISub!9BuSҦRxZjWmTVvFJǬ"SVQKĶ]+G0sqd3wBw0t@GO;˵뀷*, "EڪZfik#iekzR4cB2Ws2PsYX88I4dM=>{pr^"@7HՃ_I/HSV]( \&@qn#Н9}@w/*QtnǓ9=~= +Ʊ];=^DQq +^j$Jr-@r5Уq
2g*.l8B/D^MAqSٗ9T3w<F3ܾ$\72md_.Q" +|G/8~Mq_...^pkK'2VMr{Ѫ;N~CޕWF}O@ݤnQwOn W8(=e3~B|)8[Q2RЈF &f!W23q "F9m젝=)@mH=\kD6=у-=xC0=)|j$ɛN\rRJG[@f2ʸn%KToф8Nn\'}Õ.9O? pWDϠcHr9əMNs0GYUdrk +)"+xTjp9:αj1IO\\$|!91[,YqdMg̓LKZNJ\MN(|eq8#܍vmLʞ`-Y\*H=Fkݛ37ɚE|Tr"'26QTutpq;y:DAI$HȷD[w%>PpNO$8-)4|Z)8fV8ly8(~E)hT֡Au{UgQo}{7rP(`+ +H'x\E +g|%yeo폓&wQq82\gbk"m)ܖc{sQ{<JPQ]y +$E@{Sv6D +{%ǥ꛲|yjAUV/<}gk
oaw0qu~6EV!+ՌmLk7kȋ4%tzm@N-~dQ֞WPfiQejVjJsw:_Ŝzl0l
B[p4\oU>DQVn*SMQfU2jJU.W^h^nfEAOm?fLn]NxlW<:ߜ&lIP9[#E%A:E@u65vvvYv+Vۥ/gۧ;,ӗ:,W;.7;.֟qZ)Y)yS|MYcl
Q饒qDM}9FͪḦa醱NӜR
K
S
.
y.Ɇb$C<>D)9N'nu??wDTb(GXXe}f6$rbxIy)t9c,G^3ӍS|w㍏^*<6+ߜl[X +xbML(sxoYTQS,F$sGy\S,SLSrnSپ
S~{L-LT# &-cX-Mn9\(J\.haQ^3,#|Y[&MlgY8ђ h,h6x;Gc߹H2
3 +l2DAvG`aU6dWѸhmh&F5f['O㾆k{}9咟7N7XK\[#dP0'Mtse8)].m~<Ш"9ĬX9 Qb`/wʒfΔK˅i:W5E+JE2!Q#QBg q]~<Q."ٛdG7i2ASݴju+2[clӓa,O$%jVT#ce%K7I⏮BIf'A'962)6 +VyM)YhBek蜘*Mʋ%9K1
ѩ;QđSn("yN0:|LqzCd[t2~衺 +E()*,[4U1Kˏ+ώwJ.rR#E8\.Zv
U*C2 +C2WtzkdB5%Z(/5Cq= +ĂRo]EiAZbE16 +˓#0rPe0Dt,VnH90cPSWNA9I3ߧzSlg7i$@JUȩ"S;O?rQ%f*cmdBK3*KINҷg,=1sAeۀ;++ziWs#v^U_rW! +iNH#HWh 1\aJb6zamMPm2u3kNoWsK_[̯|bt7-UdHk-s((ȹHjV;HDXlfcoМjהkVSojML}Lig6jxlYuoL'8]:зIc^p&ץn+DwBzwAz!S#
}|RuU;ճpnWGStwT_qKm)n?~1kt&ց2s;TDq=6TFR`m|UA:^%sUKUzbUHUjmvۭwXi9-/6BaIFZ^"[I7浜{^Ablo6<ࡶnjԾz`:\ऎ8S\,uN +&8<"`"* iN l7.p`fπͰ#Ř>
@X|8r+1uC +|6ec<ft1?M71#{sm{U\s w|>Eˇ(\Ɣ?1g>sB^@6l1Kw8<3IWy6qUq Nc+/` D3s}6܀loif3r>~E?6Ib99zCO^;zԟ1>/ɿ-r#Yl6٘=uyDs=
Lt50&_dqR-ď(3 -x=0P.1ɺſn)}C411+n.^"(z̠OI_ }U6:x
^zezF2m,#\㪮[40`:1X2YJ̈0|8:Sˡ +j詧XKO==\\|}y\dDx꧴
h10}1/ķbLWȤOIO =܆05p{g=j/=\QIi! +"@AAMY*PQPTKTL3-5Ki6u.Դ]LsfͶ{mjgne?>x<jL-
sqa`d/Q>0dĜFaPW>fuQu<p6;P>>B|\q8hupw,8_ۀ@?7WfLԩD7Gfi?1g`}N +f"a:rDN~LN +a) ?%% +KM<;,w1+Ap/DIc1J8phY)L/\Y=Ly`2
u>=q{a4iw<i8"igH;&?!_7|%!j],XZ8\΅c+ +1i&!8!&ľbb<Ktnb$q=;q1NLJ%n'oOCH:HO:NK:ӛtǧ'ǔI^|-sluR{՜~2$8_O3&ʢt]N2$ZC.ZKPE>QoӷG-%">Y!I$&;U*Z,P.KB&ϡ-`LX +bwJiߠTE$fZF*Ӻ$UNImC됴K{ۤ;7J[s
҅ +FPe4
<CCL=Fg1hjbJ':[P"P彈Ry
z2d +3l#tۡ(?zjjyO-~O-.q}>_{D^dJ1*8P^% Dq״6* +[*~ki~c+/ձ;21Õ"$ʞE*r_q>,2lGqogk|:ֽMʯKJ5tպLw3mOssR\vԵ#qm`vuv +[ftfo?]3Vr7I:< }fmN |qkN$4'hRGuGE]q;p"*\Df +gfKBӗ~ñrc՞oEU% +Ԅhhl~qGȼ;oͻ'8+obkjL=]9!`1p}_H]A_^
JY~=:xh* +OKh4Pؤ1%aN3eo1QLV{0dF@j\ېl[JkRI%2<9]#y`wk~гs nJ|σ=c4s4fUiSfe={+ՓeJn$y6{7y=ExjS\e_W}+W/)-l\1eWL1^=sc*؋8ieDƲ<mf +Ws;|3+)f4tKCI- +TB} +*To|dM7S&ތf@0xCu鶯<]JOZ/-'zp7Ii;>-R)BcE1h7e".{9p)vLhvЌ^Z/ˉw!^N~ȨgVr.g 9 .%!X4ĥ@'b$,~_7~U-H <ODcafL?PtK(:^r
#&]8p)rr.(49$"'0tEN<m}IOY/P00/K!Gt BS+CRT2Z(p>>'|_³YGJxs\q
_nЛ-tQb +we_̹n1s1@D:J4^?h2g~˜2.e%J9sg?UOUdCW3q~#l>Y/t
uBك=(> +w.xR-N.. +maUc+%ҌVJ +}-jyBEE +с,tQaԔ$zRUWZcZ_;lVzy>ސr7o@5WTG=n1^;ʻ qm> +DE))ja?b|FAMУtb;5c^|\d|f5YУ-lRŻxwq8=hݨ:XV,c +7h\FX2gߧ7zt]8ߡu;:E7* MC ;+.ݚة^q:p~W%8f|GI4Zeb\^no1T<eƲ6qG2KIiaN0,JjW
leJJu4X=VxL0^E#61
֓ϖ]aQZ+KMfC|ɜ2VNI5v&j8Seec1=˘M/3&
h#cW$SE!ku Өc#hVH}u`uD9ju˦2&حUj#f,'3YȌY`=-+^J)4Eo=)/x\j'
:I +Ƴ>SZZ#ݖ@Tk`sUmѕj~EKilYQk5bOT*%X<XؼX๐PyS$V(!ļ⼆Z30;^N.ٻu{ԝi*;uΊbU։&QS${Kq;"ؾ7c۾jۿNpIݶnx}DF6!ap3G*"4倁W_#^I~v!^VI6ߋܭ78}q2{?n^13Y0مmo2_?sD#,ϐڟNEmGEy~}v):_7p;8-ͣFgoyv}GD:y;
Ơ= +cK`>cМp&Anhb X"J}("0+|l"#:CzFpdu +Qt1B!?faN%9ysz&[07!rc7.;BB8uY p +'^ +Zj6
usZݴ+:Ugk;i7{Y>*k|=|y}؟JL1}ɔ[dN=9XZu:O]rQK:+Ӏ,_edva_㓁9FDSTWдBmqJ#_ +ZKFa;x/.Er0}ܳwp-#{<F1hf%3YQN_*ɩ宍>-'U<vp8,S,?ac
ɓ|Jח +9Fm^["Vkkj8Uv8UuZUTO4?褨,Υ_KO~([`$[敇vs]eu2X肅M]NgՆCBf9Wq^\[\kĥ%}=s݈4_,_,O8dW6y5^ڲ;vX1MZaMKhBY\O%ezT'-ϕȊe᭲n.9wQQ߸a%2mf⁝&j
m6-Ac*EQ!B\jJE\ +2Q9BQeQՊCnRd60r4qO7u=-kni<5gtk)mi09EfoT5y Qq\0 3\f9T=&-;&}=XalH3vxƮL6V&(W֘1<Qsd5g7\}ZҮF(PnRdA%)?A'5=Bj7gd4Sg)Wi3)$sjnSYk x!<6SLL*sJsC;2])jʹk1day9IziFAj5)lVG%Mi ul2YyYW{[1փh)ڐai2<HcYT+cߗs].FA +313C#tJOI咔$xħ(M,u-+6+:ːTJүH9 +ORmW;J}UC5DB&0|j, ?[\;?A}2eâ0̰,(JTⒸe":0(pkPѨc4m5ڦijjR.mx9clZ212J@uL@kj̐!CY˃Y7
Jz>0~µOy|.85؇4Zr}:ViJ4`ʹ(%+Lc:htVaDVqXfA2Y2FO/==o}2 +3Ψ~+%vUKLw1Lj<o'MX2xh̙({ +wl)u4fҨVz5M!9r<r^2%چ4Xz&[l6K/<sii9mOiǽOwtU)Fe=4Ge6[ΕdIp LwY
k=B5] x{WUS}wO{w4\S}WԫۜjϮsv{v}yYcY_;֫9ՒkTzbssvu\<(N]G%h0c7cW11ǣcGb^ᅼC(rNJ"5}vuP):. :߉%,I=-r8::ޙ#Ԯ`"զ`"9Y +^~DA(`-GmFE9ss{2KA|JS"KW{SZ^Vk\*+W>.L%**c~VaEynXmY=gDأҐRb=R&EB*Qt=@Pbit7u0nf#X
&J-c.<>v:rΫIRr)Y)nXX́Z5\jt#TpkIkX'Bkeut[kpv͆=5`^K u١Z +,osƮj"ı8vr#:.$|r4z= ֳh<ӈKt]Bz57}X9b0#vHuk'~~.:sr8<L"& +D-Rg芊՜Gyzj@#w R] +5FfxG$s8:(%f{4z}b3-f0pI?SȡD/T(ꥃ٢ym:Cpf̶ay~x3W7tع2fJF*=rw>79߬h(ܞ' +Bzh~qx4V6pn1o1ǼU+^k__{}~@7:>Efh~PTxŕ3"89xKZ
2Tws8OtRtخLT/Z +cG?ǘw֗Qx92Hp[<'m ƒS*1Npk#geQI-E-5F~RÇr?W
{CTլ~0ggc#wɤC젭jdmTij9]l3Pٮ*,SJTAE۴ʿQ+QG*BA<>zu
~qքv|7g[sUʐ8['i]P
N+,C%aT6Sie" ܥZEK#vkIZmCqu^Q>m`%0 # $@ ]#cK`lu2m:'Iڦm:dLvI;iڸnijy߽O߽74̻OyY؝F뿉s+/"
%vҪRE+Or8hA-(S#1:\>:g{&iv<Mєj&TиSFoӰ}R?rUY{eJ?o +.uYW´m*~ifglyM8q
IZd\K +:p;X㿬ÞeoFKCr +{|ݽiXQVX^RToПXK?/܋߃ucq1
"8½_Fm\ +T0~9o4juz۽aPXjߘW}'Y"[{Q^#34ݕd
,{k``y` 8.\ǂDZ;'oup Z5(rS0& ++CrcZU.H+B/HCߑ?wĺRmL_Ypsh>@P<B=c4DyF
<+Vc5V7ǜªGl6KѨ<-FĺtBmˢEo +4QP$r_\~(Ȓw%آY0Gctw tƥ?NN9QT&L\C+x@ %MbHP$뼽E]qv> +g5î}J7xf(.8$9# N#1JgyEs OqevqA\8`AhxCNPMnC%s<EUjQ;>{C6GG?f?{]P(`D4}R}Lj=ݭwLokdN +S_)xf^!A/o^WQO1/3?U<SY4kT9*u0`4h՟1_j(t "3^/(ڳL/}G&!F'./t +`Zs3Ï8kl ͔6d7r9,ܓX:NtOI7} +}R^HQa +9F)+_z"lLiR +;6QҳP7
Rb=z5Fy9Nqc6˰ZjBlf8m0ڱ۩GK=B.q7]X؍]DDPߏ.69gˠ2F1fg +9T[ +VB.YUz5I]l6 ʪJ +Bmn߯ྉpcob+V*,R90`TplWYR8+tRT>v1:T:֣wRk'pCm,qMM凓
gBb(sJ85TA=&8mpVa^A>afr_*+qq?kyL!pG僕m0iP5kiVԠvR4ky[jR!XݖKj%ϵvUkzuHa\cv6
&[6؝t$jMdS>0_+i;6pZVk٠EjԬvWjܥE!UB^т!vW;ԧFq}pptm[x7r
2Hk~~:FaZ>|ZlxZFy,5%#0RC>t.ׂkU3rGRUc*."=ͻ_{
Yǣzi?vpoAzQ65\"2کj!<CoW}Ս)TՌ_VUbUF,SEj͍O,[ugECI仆/w>G^<;iuYcCd(- ʫTUGT5MQ"ܨ2Cy|CYBCit$P8;f;bNb.gżmiV}avim&u梿],?@uP8oUөJga3PL79g88;v(Td*[iќ? 'ZŽe96h/$~u&r<$JǗZMUpm(uJ\dSkЕc.pg,,3Ֆ܄AS$<h=a5+Ik 5&̚/7ǜѲdf
|ǯX4R-*Ui,$f&&,AAS=ϝl|[w-mMv3[4T9d{S{jUp' +LK%*Tپ*LL_a/4-c=)%(;9HαMIηg$ϱ}i:Go#%e×r#ٷǑ{1w]vx阔
qp7Ytj5:W9~f*/}rQ1˟`淦e'pҊI`9_HoqLwcvwvw'w7ׂ[07M3U<7߅<QNVnUfxCzeJ
x-@5)ir@cb̑qMWV=>k3m8jx=6kGl5~`g4Z>@ur +" +
h7dEeE妨tjL66&4I1jk$Dicl{㼊˿9}B˓3+))F-hu"5gi`nM~:4:w5<j7O[ l[nvxMq&0=ԥැkm0?YiͰGh=FIC=8>k})lgO3۳LcE8{w}w}hs^N{JhNiZw3MQK
^52,I!ʆ&Y,欐g9H4)3JJpL2uL3q1:z8zrd(7tFd2Ddhx]a+~;ays̵Z 7cȖ8c4ڙhE9gisF8m +wPө2
u)ԹSC($,+_Sp
Y?%+d=4fCa[9ғX$'B)ȤHWF*8
sMTkRJr*@W]+nCE/˧--s=p=0\)哳v*Ey +q4=mjj] +zgN{69'qk0b06ͼao}b<\<]M
C +ZGa付L;Z^gNgRIpcRO(g=c/ChCa}G_{|;?HVs#>"ZGKGa[yi +&iD
~tB<ˏ!y#`GYG1zrd`G<t몤UŰu*,u:&h^J^֏.D A8+&Heqo'=dsuNtT; +!&>K3f KgB~"a4Ġ gfuz%:.ӓn&n +{Z29zw~}ۗ{tE?TDKpfO|+ݵ?T.^Rk`T6Wx'?RG=:vEx +
+0f!mķsTd?S0JaT¨QOmګV:h=Me^k35ӟa^
OR/\baM3/!20r9`x#ଅQB%GYi#QANn=B=w~H+BNicg&a$g`,Is)Sc=ycomdXZ
ovDuYO^p0(xa%I8,lr@\ kp*U +W!szǴ^ +/WUサ{ӆ+ͻvw&Gwd7MdC6&ImhhB)BbNBA?#8((2< u?=s~{4©\ږLVM^ѦR9I4hF+NJq~UC4|Rq4@6`Xtn_lu֖bMTjSOzm,\6viOECJkxZx>Q&`}+]U'Uy#U!,Q76q|>6K_җ\L[[I_ W\a
F3F_|)ft1*'fjnk-}hk-6ܻD7}~XQD7VUjkUUfOU]ivUö-Z3ck>`_voqho)/#¼[~x7ڎ{~mdjгBz]f'hzB6O鱯{!GowqqGwj=f^-+y}b]Z~y'6.
mw~l@CgD<uKW~j-VGjǭ`n_}y[z/WIE?
HPGi4Q~,P,hSgpl-AA{}0;,/1q2=ӴZtki4~Q:{Ὄ38gu6qZ?Һ&SrZPP}uhZP%&:<kU/;*gGeWm5o]-\[q;]!|~FPuU}D6K
.RH*RgDmՑ6{e$fˣ){Ytg[4z,>lDcG^14Zߵqk8JQ踶]jwZ$owVu&VX*bFYt֙n$6h͢،Qس(5c_3~Vy]/+wF^ǻf^G{`(
$ +z8N9;MqOi:|9xg~yJHut~TxKa>cRJ<m3aXf:C_R{1aH;:{qE}^dô?S_VnDXpsNO?}G 31DσK0/&ߢ1y>f`\BW5 {v쵰o%{%0.^<oAP8zXnzҳ0c +x^|RLQK螇[pc%{=z?Ӫ箅%!Lk;~N?~;< id8}ջ& ̣0|7B @/dL&6d,6Y!8I DDTP(TT˩VOjTkuhW[պ)GSlx/_f{}Cw6L_Bo:Iw5]kt;B%E:癰Y~>)?SJg?> wNJȪ'թ۽q@/q8f<Eg$SL~ԝ L9*ަ|]:.^{Qu NQcLjײ,&S+|aC,|{8ߘ/LqYgʃdUpq؇;$)9&HԽV߽ol~K0̵X;RxL`eqqè#øF]xO=&</y/[ݛ;}VnuBϊc?sa2<Q++܅?d]&`L㹙ܡ8PoDuװZX}z>7`r{3g1- F5ch
0ǘ8I7໕S{+f.cXK&:Nm}WGmgx)r~daNjSn$5|k;#FFl%{c63OVst}űv戵q3Wo XNp4%Y85O㽕Hv"f3u)rb-|-cܜI(;BpG!J>=(W60LxvU{=iөί`"VÙUZmT8U7@ǵ|W1bg:5rh?Uh7ϗrmRՌHWjnN6!>;s+8UOܨؼY?oƒjyaEhY1&52wg6z.Rmfʂ4=?]S +4Ԛ +N邅MZ]㋺[<G4S4B-Meh(n#_rL}iOЗzpsۉkf=LdyZdO/T,L+2*5QhFevj4W#`V\ަޜ+ԓ_ݹ*uWGuf2k)}v;)Ztת<CZhn"y%h(F
+ԟRoz +)DеtJAuw~یVFqdhZ1:eo(;WO 5&$1bY昫G9 +;+tR݅u*lVgaQgZ<a4l2Jv
LV1WY[.}i =pg)Eg(֢81-'Qb,ߙ^gB +\jo4&W2ecf}مϽѪujX[*}#UQUu}arrvʮ
kJS1噧O<j8qrQ>OY[j*V7jUz6o[ES*rWkU>j/ZXl.epԐ(NBQJbA۪\X
Y^*_uˍ[hUtX>6b+]es[wU;d|Gfaꓶ['{dE ]'[-Ɵ*"yep5҆6c4XE+uqioko26m4oxe՟0OZ7g
~ +4QI*RW$Ӛ*wk\v9*x@@X6dŌF^6#mv۾#l}Y-' +[aMZ+Q7̶Vz.JZZz9r+C|ٻUUPrCM PfhL hI +*.t=gMt[3]6n5w?%Ҿ$)'CaÕZ+5ܮpJւi^xkn߃J{Zs{_Wb?4S]
{g nue+]*F6P)-+9R"J(!Ҝy.*4?yA8 4AA@Q~98"P+xIs\d6Ҕ5a붩զn;n5ήl^w00||}U2_%
20ElEB ZFwj{%|uU++dwb+S+lҨ2
ss9ɐ;"'ue +F&*ПUspp-bY8p05$eTd5BW`D$- +:װ.^?V_i@U4|fO>68~\Ǐqu.{z[PI:s7@_?θ;[8bd<.;ˋ~Ǐs(&PM|\F!ScX{R}?~n]Ww +$:Tgr.ĶVtb۵nrlBk~36> +$љ/\-hp +G,Ӱ?kv!mv`۵kqJ7^jMeNpW7tW^wq<Xg=dl`#ʆ}+Wv5i=IM:y&کF}~ +ӱ?:c3~lvHRGP5نjJ[g<}@G><F_t2# +i8bH#t`?f5j&M<]22H-˖yؠA_qr} +:WF5Xc"qLgVj,8r("Rn-^47a5TH#2Og
xCƆQuE{b>\!pE8xi1RVy〣J| +RNuRδD;qf5ȵ5r6l9[9N8 +! 424aܣTdSg֨k +))r=?W^u]۸nscYXkIjT {ʽcU Ol>3U2dphV(o"[l5UY~2.hupO|:ljZ|!0dQSU4S7"U9#f+{d,R(2G-TF22)ԩ}J3U鼦>Trxnb FVV4A%;y^ +/%4\;:L٣;&Fs+sLfYcJ
VJPSRM3Ue%Ӕk)Ac$p"YyA5p_ +KCf_eM45tD0ORjHRBR5}\Bs5-ԦJ%5hUq͚lyA,GXY#&*kĄ>4
}lgꄿ|9"0"K6dl-#f T%LI(M
Vbx'+>"݈?Ϙ<ؘYa<YoD2ڍQ{ Q/OG1Qֈ=b3\I.×LJjROS&%X͊Fhuu + +"ZQ FMR[hjNLFMMQ&ĤL8Q;m6f[XN9>w{ҕe)b#Ti$֘وKm&4bNIhӧxonLԀJPvm>oV̔ +|clC4'B UJž˚n*fdEeOSdvgnKW-K6Jbs)ض\sVќ.$shЄ75~G +Jw2`dKf[bz9_?US#5`Yڭ +iX5^q)x\^5:朓_uλܿj.72`!|oIsع#Bq +r+Xs$ic6v#Ǒfpn"D<6k??6[߂\ +¨]jd5"S`B(-dc-A8=pՒ +0x39pʥNd`5F2jkѹu\ln^A@דzpFLrn\[Z-bl)Z[ˋ@9:@>Y4bN@Eo /ci`hro$+E=<hCq=3،V
@~K与XRP
n1\R4S
7MiÕ`5~q3x;:4{I >GЮfSlE/Wї-_h9|5_@mRjJ +oWOYYڰQZGD/.k
EQ +bsN8rWjxIXχEAbܰ*{ٰ@: +I|9MNPA2 +<~?Yx?^y_~<;:ŧ'>7
:&W<<b2Wq +?N ̎D̯/QЗ9LćS +<K$N?ZFc(m0p$NgM>vQ0u9/A8 y5`ctt>K`jQ}cXѢwP2Wr\\خ25آP;Waq;K=C|.d0#LV` + xBEc'\)*yj2VEdJ:SӾ@0[֡m\sEV_{ib^4R\!xR ʃx*2<ZRUBUaŜ*/'DEԣcYM4s4z)ﻹvF2m>!9Ď'\8M2PR(7*WYu-QƴڦuGVRi+lL&M>^<J~"ˆ +Sdo3+fL9E.nQVe/P}Bo`ViJw\tS)E_(HZb784;AAi̥Iq+ˑ#ê̲Re9^斡ܫ~SrMGNإ}/?s\S3%> +[8G}`r4Z>W +>𪫊"+Կ3 !xz͠T6[>8WXMoHV+S.b]6ŸUEnzL!.5 Q)~J 3
肫
4PZmx/l;D QLSǠpOB
4Sxn|^3b} @ksjgT6YnjҰImHvrx9} >(G>~zx^LSx1B0({\yuTUj?;XJX7ZOg?P/~̤q~qz1(ݘ1|ypS=FpRo
be2^Yz1^xØ!fb:RͺDl=-k{ +XI\09ֳu4rɯ{g*Jrm͢U"9 +8%>7"6Gs 3۸w0c{u'IQ;)[J[X4xk*fb 1˾¹![w;)`VMO^fe]wxh^b/|_ft߾~ֺnpt~6Xc ߳A0 +%;6y'l3l7w?a~D3Op'iq q|0w +6P:'{2>5.o%{d..ip[2`Vl;v+?YP(;*
[eM +:al73[r]]v끏~'+˶('t?6Q*qE)שM2sj}٪sT9}[Uf{ +?xivx5ӖZ9Jl;쇱ߡScqOs%K:+A9@U KTے>ۯV5^cb88ʱ_up4~UX2~,E%Iڋ{jlα#fYYv>_[9s)Y#28Z-aicWtπ5Iγ"K#|;g U?ۍ?[kp2#G1F?ȸD]PU +5i')>&q4("qgPDr'Otqi'9J&fF +k\Up.\A"puA<#cVbdbu;*tv}¹1_f<fl2k҈ѬaCveϪSA}B1v(fUW.u&Ԟ3Hβr+{^ܛj}@ٿWw_%}\>x8?繁\7ϪXC]y.u{՞P$?
q +/ZVKq/[KS<E]XOz/umS Crc]fPgiڋ)TVK/Kj*Sc*]qL,j-o粗!G3 sp]∟` 8։?QKȚ,\uj6S]U;zFՋd~CնDdPdR,;Iu +\6U\o>$KA'UIsXŞ27\S +<?T=M"2sH +ElO#GqA=|qΈ\+$P,sCAr ڣఌe*VNV p +~\_''H5J +e}TDȇ?WK4410" udzXm?o<MU>Shۜi +#\[rBʱv`۽1:V`{
(-VM:?Y7ҿI)LB5 +^J'T%uc7@)4w`YhQ^{viP;Vǣ4hG7f)'{*ph6-=2Nlz@-hv6 +{OZaaoIr(l}Y."]:A\ +FFVImyLp- uઅf=$:ة<Yzr"L HϬT =zz1`Y^| }w32wO#8^`THb25V)jVT!V2.vL(P0->,_yy1/Ou¿ixW22r,}`!~D9j21PhWRQ)@QjZTm< eD UQUf}BN!9_(f}?<[5$n(4?C\YT!6l!U4mPb1.cZv8gesqPk2";'tum8&[DYdC"t|׀?!O59
r,SyGβZ9#*-M%!Y+VRqM2gTޥʯxYFyJƲkz.FNz Znx@(w娴^鐭R֪YeTY(7B'or|)˩;WqJW*f4Q~flZ}?OV2UTPS~MPy5Q ` Cy-Cb,FNPi3kZ;\ZM
2'@h>jx{;ϊkd +ddA!p0Cף0&s1֝'|Ob{Idbw1 +4PRb . +>ɞ<555V5A](ra8bpᨀʬ^v[dj>*(Ut\yG#ш-\URRZ[`ƾ
V)7'Fᩀ{
̇c1]WIQͦjb0jo|'kp]XoYZgI'<nxD#8*[\*e!TڥHPeGqjL~>w6pv ڸ[9<: .
LxW +80&Mx +tꔄsEBN4 şo[2,wffV>GrZheXgD˚4;eܔĿv#Q#@5(%<Oşk+M<9VqegGWrbwKfndKYly:ŔGxX/!ܸ!]7ek \|Ҡ.@?b<+ A,n&9ndy%#/KbJL,Z1gQ3eL +; +'|7+`GE2imb*"$3JEК14EB1c7B喊CܒGoB +gBt-`-7-d-c0Dɀ^BJG(q":q,A}~ 363p(gX`)jusݻ}: +Z}>`kNqn0ҍixVj9YC/!č pNDM` +(s2WڦAaA%Z
+iXG{H
FSr8R/j +/W~jך~~Fl%h;{Ͼa>roǎ8ug|KWrcb]OHrOĒ<i;%w?zXS+ohlni}'ή~y?_M(f#Yc DA&݈7#ِoE%'bN\
~ĈoD b!f%n%~|O9 GK.O~)?W%Dg҈5BM6'{J}bP5#5ävR7_蓼Lw1=a{Ͳ7<{۴uݦó,X/z),`00=MZcXtB\QҖ^Ťp,q$[ ;uu7n.t|3G]ۅk$EA"2BNhh~q4?ioή/^ToKg2ZǷb5-H1AN!bnDHnatS +CUh6YzMpq,m pwqxA$jCCB~/`hkRpjE2"!ej̲lF27HC(sYl21|~CBɢuEడI!f\1AtYf96Bܸ
͒aopp'&N}|3Y,*29'ηUEq +U&FG<E!ra>PYkFW?]^2XqQZ!% +k<u)v%^酜 +1'S#U>[omD8oQUqCC[^G9| VFU{V?pxWC*`e#ےсb~p̜_AMyAvmtjx*" +(UTKʡr
ձ]u+'$@D!$ $! %vvf 3<{ߔi3hg7YG!! +l/vyfchPI +|9 wʅG; kX4OhӼ]&n{](sY8qEͣfq(OiI")k +KҢ&bxp:˪IїMH\75<:6 +:o{nq{opJP{&F[R|֣'ؚ̙t/{#pr][8J!9BR)#EQL[( +W6_ԍI̾4`ik*V4M4$%3pm)]f[
,fسvehzu鲼)`D,JJb$){<Sh@W#L2Uсڧ@IQ1 +ln93yL$|R!_̟Q%iȑyR b8f/bK;2c@̛݀.}`ֲatvf+ĜkPc3{щ-*OḚwhxJ?yU6A=$/6t
W
OWG+!b +UE3TXE;:at FKܟ[f.(6)|DP)1RT4."3o̫r,&`8<G9h it!RގK%|#l zCV͐`%ԎPaؾfLN5|D/γtwg+ݠ#"C."leP_
&00H'+'cnLrL"lw-nޕ@°:<=KOM3&x'Ѓn ǏB,=d74A\L,SbabK4lٲ'w0טY7ZX@?oxuIBⱀ>& N:4 csg<P`1Rrw631=6^,̣_Θ纪y7G(kqYi\FJ|7Ӟ> O yZCɟ-;+u{#g#xzvU} +YOU7&~`
P(rp,oaq^K_m:ld4)c:@Oʊ
%e}TB0AU&SLZtݘ[7rWꓹrZxMb2W;7<AJK|47CeD3T^k֡(f
bR\뭁wv9C`zX˖`kŵ4J#)wp*Q%rԔҡS:t͔W;$NG08ǾFx*IКĵPSefjj1WoW[03u +n^FKICB
awVjUggp,̸Nzq +[%hdn?߮S_o +ĥ1Yon#R!/քVTQLU( R(\iN/{i#_ђ=:[[;یc]:j?8iqc/uj}ik_;NgjtD*CB$}_ a B$EY\ +IS10Fq|<_uÔn=?! %ínyJ:iY]"4 +ز1SIՄ49aMp mwB
uUr':>E +D<gkvWL27{kXl_mI`>']ԶYA}+'pXu@t-0E
"a̴BK['q +Js-J(w+MM\joaZM\K +k3hq'@ߋ +Y2iHv)MuT[Sͭ +j^P`fAY8f"YjQg+ +%ΆGUv<SJVE`B=9hE +c;Aubcf=賓)[YC7s)U=ė]//{F5.o}xYEyٝi[;flWv?{/l.vz1ճr3tܹ7JgåUϷ5ri9M<zS =N~Vwf^믞zD?g[<^&sJ.5]ǮT$8I"PІjꠛ6 k(u5e$YWݼRoì?}ޯuK'XoيdR|+>/`_|~,xyI|{gW;B$Q%XjK7[)ya)ElDlbk\ÄRɋ>[W=FQ%^%"KQb0{{#?mY:'5Xp5N&x*<t6<w:g,+l&|>mՄ縘r]L.8iE
k0g`MjY;5%ÇșL8gu&[K'NE=CX8p>}Ӽiމueu8iQ̣_aZ[)aKy:쳎oυAG +r#7=(1IӪmPa"3ʕqqiQ:6a1Rؾ-
_a[73G=/q/{8s\eIXt\PDY(& pd[.>'u1<0gFR__R3+3eEr E)efr,n$#/D2"Cp6(gyA|+ 7!p Ao8A};X;Hs$@4I)q9!ZD+Jt: ]k+MEJRi +՚()jcxhbѢdS< d_C.2 C2nE,bZWb8p&)2Ld|Gm$ꌁEu QZSg֪i
ꑰf`N٬ "C2!CAF:!\x%/f'Q343Z2$Q=_5LWO('ZA;٤j>nvZl\d!CA C.a<%.3X8HMGG u/&yMEM!M4U(S8US0>͂6y9𐁋|H_/b- H\r;r.7Fk&iiMCHQ&iS놢4XNݏkѡ5
r7[A|dAkPD"CWt'9C01X嶍ӊ&Huk_>Aږjkfڴ(
K6<dG2p8❡
])'e-&elԘ]gNҍ9%?+:);Y{(MRm26I 1 +,Y)"C;8A5 &M^p +gBE&A4?R0^֥KuiRe](9J*{T*( ! +A;xG3lƛ\C\%/*nvʃDq*M+g{lI-Hvɺ, xPPwn5;mUu+'o:R|wLN/Ҵ:iiUUUE^![SȖv,ࣟ7PP (k>+j"uQ{3b'a9m4T^ʬǶWrSߩdV +2EOU_OMx`]jvjzr}p+'D@%!6rrJ9Í0@@A仿죍@2iVRE!盝6
EW@TYB]o x4Sg^}->-am9y1D^4X۩%Ci)w?4I(1օ*;8
NfWR{ΜP;:uY5OD bWP4Q<xfZ2]!ڐ$^TcgFB|C(iWNkj~%67P`]`dE +цݣ[VY[|jyQ6l}nTfa;/;\oP8q%/#&HaJC@?'libK౿UĿA]Yv"6OjB䭦_KN\7mWXWq<I¥"|_?HmbRsY&fy_ Pp`҄*߿n_뷭86nXzUcCnf%ĕ<w%2F<ޣn}WF?Ppbz}_7wTq㦉kնwɺM_IH܍yOcIr mz6+_ޣOTxLy,+x)Qi]@u/sv3f`/ٶ7I]6rSBXd~aܧpb)bebnхn7YM&PI.F(߯Qjla5+N߸y\5K6\LٸUEʍLR<f-H3|kkb
w FegI*͖
jm"HMgsb1\2Rc>]
RGz(%-d;T!a=a +yр Ҿ^͟^ g'¯w :\CqkFJ(U+v˱Yš\9U2edTBV5mX~~-ޅ#v$0b), At6z>֟V[&,-eeg2£,-wޣM"H h@۰CiM#$8f'muxs! r,(`f +HBV(sV(-9r<ƫ+{ʧ7T%Gn
C{!mC8fC1LVGoWst29WL)*z½5GGYo`ٛ;כ;
q{v
!mԻ\S+q!n^`&VQejBr@&@ȩkEzhё?̟w^ v@<6pц+`jgH!❴)rZ\5Mo4;xDQQw.juUkP<@AG +Ԡ@5&
P#eٸKub\eBLp!S gu3ƲM]A)gP1 +5h ?$@q>jΟ
dP@)}GLbZ29¹ƞ8~\Z47rD\COArZ6Æ +@
U߁g@7@+&0oiҌ<<4F$#HSHƳs^b뤚|*dp=:@%l
{@Wq`l4/Ǿ|SܘHJ.e=dR{ogBVʕZHVA"-/ʭP (69;VwWШ5~d+^lBG"aN{eydWZZ%/RjaZŇk> +y@i1P#rT.3rC Y`
6aC=`ݞG
8D-?7]
nE nIZG+?[Lmו\ ci"tw\'X T*mzhpp]ڐx^S{?1kB;O +>{/fVpjTC稒XtQiW&ƮJX2F Ff̥ro`>uzE#aV'N~2E'C?^.#íJM/OSHj}?GM)tmjϮtt-6
_SzX{~bGF<Ck$B)?D02 X=NcRExJk)jU*WNoUimaѿlH>s{'ml7y)ʿyP,w*(q0 +2O +%|ś=S̯%bMÞO1YSg7offzhe8;~
kswryCs.H,c##/o1eޓ§>tLG4L4&~=慦.dj!Mh܂ +H
C` 6a[ý@ (x3tC0+"^ԇq . {Q;NaYV +h&;@E^v[> {H2i1kTbCƬ>ðg3HC?
,",A`! .U@fT%O]R"Wi6)ކ
(^_Dݗ?FѬH|_mlj"2^ +ӯݗKԭ1PÜ; iȘ?l'
A0J;Ajf +5Se$h2x2xR<vhquTˤc-7\8@{{/z"ҐF,hz)ۡ" bzdIq(#d"\7V[:֪`)y+۴a`Pp78,dA<O.Eꥐ99@9^^AV(Dؙ$dLv"2
F́[G/ѽewJyw~$
Jrj iH_8Uq
(zyBmh"ҘwwnU"s&3[;}I)˩Sw)i̕E'w4 +]h66%x%H'yU*m<4i7w&2LepBZSLF&iQ6 +n_ҧ-8ؚ'3+[mEJegA'UWN)o-Sv*ԤAE䤡K蝾B۲ck~;As|pt9vu
Gq!OZ.د>ԩ՜(\(T_<]t0r6 mVWHd?s%-mv?Cw|tu\h`_{TܕQ^v|y</զ{Ku9ݜ"I*[f`ac3cd86;E"KbZJ)>z߹Ox|?;7JoJݼ)ycSM)RϪZi6LQ`fRcTgoⴟEw~͒:d#ԊʨEl-vC\ͺ2Ml~KsvĜSenH<ޘZ
ҩT!je6 l~?B;O;|L:^l=+ +jh^S}"lKɱCq
'=tClޙqΪk!jH1{&fp}/ܧvd̼u*ϣ09i!M=۳"%DLRևU5W;QZ*l[.*_;d"P3a^f6u+uq_b,>sד]W\qI*nLm
٢6*euƑ5AM
kj:kmGE!KO; +Y|!-X%fgPa,s[3ZA>vBLd'^V:/`1X`0@O
-W2h +AL钃OG=_|^> (g6p/
o! TkՐ"mjf_
+0`=|ث'3e{>ـ?/`k5TjAH[!Upku*PFQCQG +WU`>TQĈד^@@⥨_ѳr@#c0#CHfObl-!n=;"_j$B{C$QpE9
h0Q`\ۃGk<YA<M@ꥸOT:@E5Ȩ)G5HY lWxC$74ܨ'EJ:ׁf,8]11DGF=|, x(nũGZcE KB KB AEE"dmYvԪ[osk|=pMDk+@;A&'pq>@9 ! +mmk(]+C=" xm*%F*Wz]\kSR5^4( ť!Y e 8ΟANG(:mˊ;7;2Y1T +$ +q\2YXMV +jr|Et(K}J9_)+hR`:(7HK- 3HYxWd*(96-jOo}9?Vޫn%zajfUPThB^]hU1+$r1,ѧʥ+rB +k Pbʯ_W[ssuNy~AxGia)z _."*1_*UvSݩ峻*nS.` }*Sll (Cf(rX~pKQSkgmk[w]]& +]Đ*e<BXDUesi54λZCu0,np8=vO)@1_ +Dc}
d}n
*-~kUS7Ojvehq]{&2FAT4<EOR0ՄLA->'$:tC5)SKuiijSjl Yr7Yr?tl^\l8wf
>(>:X'pKRKR6>+ԣjjb:!P$&*.)@36Aom/kX>o<`1ݾoký[r|ՍHU$.6ŋh"VD+ҪR-LW,.Vu]Ln:>4/1e pu[rumfconuٲ;7ðHJ +['EA?Mb dXC
bJgag7lhy٬A[cfOMw~5}a +v}Og;$g?xWҽCӝ++/'WPOu۳R[fͳIcUsN.<6 8"9?%qGoy>@#(7g=lk}o
t4W*ŏWg[}w+MFKBnCnrzp>3#%F
#u#jg6ʝEbgv`DW>VP)Oo(KGIbTKoPP_ +Nӄ2!?<Mr;&c!u1iFBt4͔*9ZLJk*ddm(`xˍysZrX1%5o;IHyB.5rrf+<>@vѪQq&йJň +Fܥor4tP݄T7=A) +p2pR
+] eD'3r!W Q!:ƌzR> i-̤_Lg}o}-1ft(G1ӡr涩G,-kv4m`7Ɔ!/)$eP*0AXeѐ`Rp,Bx2,\m$m8iCv4lu?\@\|ABuQ+%1PFFq:V>&ѬENWOJJN;_
/P.Svvku/ZC%LCM9Ce/˯TB(5oa'ռ +qdJ2k6im%*)wYޥ>UT{S\ڡ(m38V|ovT^k_ry0z/f7rjc{
L֊vEبXߴ+kumojlګnX7]|WM~_}5g\&0.Bbl]:Y!SQ#;3m2MzYg-=yK=S}O9\xgjoZ6Y[j^?upc0CѩӢm"$%o5n,1ff`̂8"%D!u8Y,u[=N-|DƼLo}@xQGxqu
0JKn[!iLߧaΕ<_]><3u0NP\fod16^ױnEu:Y7cẌ́ꄅ̪ʄEj`44Dmփ);ta>]kb]hvxQe10c&iX6-V[m&TsZr5y^U<4Sqg!P6´:W +)^v܁y#0?;:NLj0kĜZb1 +:_E_&=䫒 +Di\9B4[]i=خ
shC_ˊ?/;UsL== +LJg$gPiٕdv*Y T˄ +rrS()iAaL8e6_DCWcHdY۴`nɡuf^U4>iG(2OHjv)!Rsb1XR\:P(/Qa^ꔈ:-Sg + H~zH6Ԇ(إM~ґuҝ4V} += +[4b8&*V%4Q~:[KʳJ9^/gߑgeY )M{TȡM4P
gM(ީ8\e~^g5Uoe0|i__egEs"4F*J8<ɐ3 +:SLc(RY] +*AYc1!gLJ2e?*\
Gam-PIgͯsM4osWG Q1W@гid<SJVq%=ZF+If(IZ`&mX5aO[WnW[ 6fnWGkk.^PVGLGb|*2BpC!-GKJqy<{BHD:Z0KOվ+r>mcFQ3F7\L6^j]
TG9cӔ 9%)$TZP"SC- IhB?!NJ54!Yy(( +4MAbDW gܩQ7/\h$x} +sG.IOtm
$eWջ`*PK +^#;D@= + +0gsVtwXWl!HHVH; P#K{:lźXJkUzjjE(T(twȃ\@G4cq?p]N܃?R^rST(57ZR'QLak[:hp^
Og\\pu"WtW+X-&IҨ<E}{PfrMST+jN'j^21Cm3Xzl;agN6pRm,J1dVFH#|I"5:Ez-KQ͏HgU0DQiԜxP@a20v +hc--`a֖p4bxY#B,͇| +L?CFXl +[anڃ7xer-ұ%.Z6#Ly~VgIhaum5 +v|YpvO݅ݵEn/Z4XhzSPƢ5\[Ɇz(0Xj-4XΛjfVV߶1lh]nI?Wu8\Y\jzꎒ[궕RrnSɕ
u65z`Uk@&P)(֟UK|_s8pdp{;ړ'[ҥGW*Z^]q}ٮֲ-eW66kh*{V?4꽍=C,32YN0Dj0h>&k&)JVEQ='-R.%EzNyf^|//߬Ҭ)$MvUL%HhCX2bB}bt]8̮p51[rRHTmr}wDτ۹˶s_MMJ1rr \yXLVuܯ#m6[\ؿuJԵ;zmkm|xGrJmY:WXUXϫTꪳy-znVe=qs˳sd(h e)_~<uΥW]9g~@Q"vLLQ<[̭kuiڤ5IO+76I49L|yHy]hִGtл[Z#qBklL(OȯI/e j˄u kbW8'JH(% +U$Dž`础FX%OPaUvI uc!wQ1OC{;v8!VДmLg-kyYYyTո0Z4.䔏ǖJdi%%0QxTҫ?aHWn?ܳz ⎘hޡ-܄}Ȧ҈}E͗ac=E5őUa,P+ +<]t}F@}95ue|U +f2ulܛN׃®EƮjFkk%h.η 8|{?&, T3 pAݤܑݏiP3+%P,~l6f7:ڵCBs"|Gx{?n
|t6hff#<ͮd`d7;8K1hg4(ґb(rl4^M:ZM:LxLxNFLu6Uj=Vʩ+i$&w3 +QSZdd2ZYOtu1HG9ښDԱ&MU<@2X{ +j%cP<9]bv`;#Ob~uǫty?<02pF V J3pZX +_D+ ۀ[$\.9_ݎaz\g/n|!t1<14N1"d < +g
$ +2.0)鍩bg5αvzbXgb{XX'dwpp:fvk +U|s@QW(HVRRs!Eu&X#2Z,wޯDmEؾ9NXr`
MMv`i
7Z].M2),W.WUpԻq'Tyl\N`NBΐ2Q1Ht Zք }ܳYp>+ZvlwFm+jjPP.M(۔[*̋)ۙS~\,&g
2
wQA^}nfkvP*EM1*5EQPJ +plZЏ>T[-q,QpZˋ?sִsMٳ˴kWٱ"5x)ז$i]}mR͖:&[ +.PD5?ɇ;y'b5ʒM+Kӣ}xZVFIΜR^\}ARɡyI%?Iŭ +_M5?vYs-}zpg3}jb:-5g|U'gV'L:9|ƴIJ k˿WQ4-
*Z֛5Ho㊺->
A13 +? CgHFg(RZ -Ұ"%\КkilWh|;>PywV)_\S^t:PmC=sX@Kȿ5tz8lr7&[<>ەe~Ջ}ze^ rwS䚾o}ԣP+>)>тVF3HEFG +'zTW`
's .sFXE&-8G3xg/kȿ3 czG +qcq(`)C%K^cqdc<N8[NEXe7OYp 6uOO'\;@D D0xq8NȲ!߁R'tu~(4D;k̴?pXvk `B@HX?/a#]F:qicvQ@^yU%8p&cP$e ߝB%yZgd9S3:ei!֛8Gsu %rsg{~6qpiMWY%0PDEjgzsc&]5XI
<l!78CQZqD=wx(zEq%} g@D!xBKЃjP
R&e,)Q{ӽ(ʠ|.pE[B +QrQj!(%@#v?ݐ犼^9 +QşjA*fJ1r6*=n[]Ӊl1ʗHPY;V AbT7T}vQ[3 |B+J_z=ʅTgNB: ++TbՂ +!(ؤ-,愅+AosFYȵoa'g0c=l +~R'3RrE^"ϑ;!Y~En[fK3dJ2dϰdg kE +6'K'1Zڨ8TTtU&MUFҫ+ROdW3
E^[wnfp%/t`l{=haWqb71+rE"ZneTH:AjjB۫ku2ZFS*O*3u^]ȹ +ؑs/*s8зN Y',t*ѨO1dņ"#f7&T^dxM?`9XXdtw= + +3y3 li`45ÜzppA4߂r +Sq@Q(smL/>s9+jp֧fԏԗړ]g?%4 78绂/l?^ŕt8D(!wN2э#U-~qVpEJK.%85Za9m1美[ztok#n>7hky:zg@[hv #O>OȘ)A:a#;?&vF(]ȮHmأr{:U='۸'AOzdnqm_@kyu<CK ɿOܲ{{> Wl2C!SnBcX=Iu+bXj7*t߄l%/%d B=G_m>$n /
ra4"&J-Q I"W,FH}5CMg2$! rRJHmBGxx/_ZB%TFPB7$}* fSyˆL+h!^k$$GB\ Elω{ ]AS9o)} <!]
효`vPɴO[ ^Ӈ^/,Hs+TW,o*)<g7x3/{>_Q[DAS@T@|!$/` _]"P&ġ8EQ!fdR!Hb $+$$]>1GΈ"Ǣ>_ 9Q/1%:4r~VTJ(PQ&=Ň,`ZFfB#[)t'_%}O Bxtr
rr0+``W7[C70Lk|PK+/y.rQ,M> +e;-wCAC``J8*FPEjNQ
TQ-Pd]z\4xI&UOvoݶZ声FEgX~xw'Wn
67l0
R礈 jD&`?{>Ac>[0b3S]GR݃i_تث1yNs٬nuvhGF
A`QFѬrbXX$g1YGRcs^LN,S{\o-6ވ_η9akfSR Gx T!t +#es]\sSFYŌ73B2ߵ͚c; T_e.:6gOxMNh9O'ѻܙAE ry|x5γajs8,CCAt^.ob~{q4^/q,X_MނC1*{W a3wC!F$B7<i_0OT;
ץ1sںҊbMWN.YkG2[KK%n.KTz5i}iWҁHYM
C&HR6IE&7LrJQp4jvOHZ6-lV9o(_Uʌu3VX]QR把+#ki2~><zݽIڦȵ*0vjzXUw`R#uy5}a { VĢ Hq a0$d #pXaCdjāxǪuXZl㴽ioʇy>Ώq=Rq}Lnv~@'ήsVΉfؓ:6 e^6 XPZ<W +c +g4~ʶ+-:<ZH|Dک;6~jPOS0yQd1kx#L%&3Y%r. --|I +Xì2ᙨxB4HgdD `ďK@cZ<75rr-LsPsqCA:÷bvR5 fU| +\S"VpJN9@}+=AǖQ"q#}0pyUΖo(s6:Z"|ScNGMׯ2-Q] MϑNLz\&(L$LKĦϲ$s!{x4An>](UiSTzwX73DUrh%Y|$:;5/K$+$II56I|rD<*KV,J5N/I',0bsq\ͅsh!#[k<MWY*BFxsDԬDT&U na)G6ϖݕeE)!72'Os?D?1q 0nz]muNø&hcEu6EEgNIl@z0B禊9hyYBTNs0>2$"(<U\D02 J6Gx2 +,z-O=6P=dtsiA]]]~~_}|ozӺ&tҨ#, 5?}p{4,; PxNRN;饜r3ZֱN90v~}]]>}|kwyILt}qxυL`7 +s5^[ka>Ʊqڸ˭w^Xrz7vk3VNWeb +])+S
n1v1Z=C5 2|6Il\\_YGG.~E+xQ6CG +XNG]yh@vb~W +}D;u8<;l+E9Ը\-H1QsTutie
(; +zTvQv]Fwz~h~#Z +ჾt.s9@|}`,cDv8{mCt.>o>ioy7|} 0W4J +GC3;.\.!E8!u ^L{-c<qn +KbDW$JK5Z[uWXXf}&+ӑlNE6ٜis<1imǶSzӮCbtHp:Z#{Da@.RާQ$[ICSr.#D=1 VgcT:1XLcWB*ob:d
·eۜe{d·g\Z}.O\>vx{{St'2KK7"Q~L?"1>$.![EkE!<σc$ԌݗP?vo& ;v%yH<ݒ-͉>M _>G +aU:ܿAA(wk\ó~o!s)496Eȴ +jQUG/QZ.RA1>sx6yxΟ3No8Rf +7i&k*0%MdI&OZ3yFLuflyf|Y +̵E*3Zds\ysee[6 QpB +,:K7|^栳ԇshX
3]LMJ;IR5%'ziN|QV2<"kiRyV]RYVSRfoRhlMoRIbb&Ɇz {>S}us +;ތPAcibSmr\tUBMtE~^|ٔ(.L-]:3wC]SsI-ȹy4A٠@AUr߃E٧c[@H[>ٷȚl_Iۼ0B*+wXQdNzpŬiɴtmQzvJ_ӮU淨U.Ӡ(,ozETVE +*; H;(PAqDPhTPp#h.@M&qIJ$*ʢXj~<
Ϲw{ҾM֣^f4]9á~d +UNm3.b(M*
O YnqLʚdUc1ٗٿGg
GƸؕR`<4P2NmZcUF3MǠ`{輒1+=S7L_ް,N1aN6QyMqy_FuDŽ Ězhl-h.8B3h5R*[(",oXWf|e&&-J*\Y!&4::*)"#,;4?<h3FcD<' +=*kzԋר۷Q'^C٫AcaE3&Zmx4Ru$.pSHzr`B嬺}}=|돺Է9uoG-NNAp~82 AG4?2-.u$o@b}N%j^F\h\i|ff?[|e38+x&ttWP ב[{28 Y6nc"]mn6o@mmjsn홊i̦WN8dh5r2|<M<έh1˴Z^ CZr{Y?$<}`U7 +s'_@i+!Wv +
P84T裙245RF4fTL>\KAqwz1{zw͟C;%vY,Q443})KV_e0@ ąŲ)DH $=!@Id kX
ȾCAZV7ZZ:ں[vt<N{@g^O낖w߸~sM}隆o`ZO|Q#^qgq\yEzi}_k$HJo} AkHYdww~$6doCUMwvX +܅>h7~)h<c5ʷ6W(mx~Αy2\u6Sz̭`
p"\,zYlI|@ؔD#.,jX~ZkwbwiH뷿6j!X?|N?[9ǚ0Ut>J.3ZB +ȷb,- `Le?}~ތ_ǭ\dhW]ܺȢ5QkE;e9av9b:d;`M;Ͳ:cs>ʺìm ݧ@"b^,K>?p̯sm9ͳkO>町V6p_b=GaC^)}I#=ؿ&09zq(Sf`
y+1r>) +y.q3#LCm>ӂ>a3iRI+ذG4aBøhwLtwDtw +B( +Ry=q֔#̔.X] +2R 'cd +O]%NqqV\?(JO%ߋ |ȗXS^p
eGJ힠kh VĬ14= +$~9ItuP! +RCDbh
BQ_X>+(bbK!_1S~Q]@xe0m D/bGhhعѢ7tvUiN&6q]>&+ ꚹ~~2&~ū_bbϙw*cLyp) +"rz&Fgh.zgt<IN%Q ,he, XK<k&C߾~y!+{VĬ5 .y;g,չwӄE")e4\;v,ҿ!($t\sqX08Fz8I֚T"ΐDfdޱeF2\m}\c]1Q]tHsZ>y"Gd"g}LwI!gq%ikǝm6bhM1Ԯ~}Sveq +IWk{5Ih{jH/v=ݮm74~ N\+B-5^mowU1gnFlu<Vd{l +'IIJdzxt{F&y>IX5הPصйVsC&[*ڲw>`{@ k.wWiN|@02= ث.r^N55iY{h:v*v*6O١vwګrx#Єڶlm^Iw.39*- +Vq$ORH?V>}s+a1M/>u0=!t;Os_W +'A$ Yf$-2 +D H +d(S|" |Ffyk El<ƪ eşxm($+32C3g[#_%fS2&It֢x +`/(M+?6eIBb`:fp2=9&23̤*yy>7?a7?LC&EI#kg^F7B1C"c3-?LJ'/bԂi\BrzVӱMs
u~W*.(*h>a2Kx h'j5U<L~ TSULnkJYhMpCZi⊶uqIW^uh04"I?8'䘟P5 +N/*1hլZm
H/GuMe1Ϥ\tβA8T8ʼnQ
waCBU&Ä +Zh.p<Ҍ]ك^drwX +59!/^q&/h٘=ݺCJrƄZ3ٺ*gc-t. +[+p;K×9w/98zDnNKl,2Hnfߠ#f=e("XEv +a H +lz<Dy&t؋<+ڝ22vgݏ徃bį7;)=J7ɷ
lM69T"1 k!"wwgw>㎛^K-̃dNE;I8â,߾\1`w@2 n +zCZ!Mj"^pZ8&gju ud*\CjV + ++9+A*IN/sDEH[HFĈec-?a/<:<Լzs dX
L5&Ơ\f]A#i~Y%ȂbK,H$6Y0$g+2K ~酯+A{}|l-<GSfѻAGCH$r]*#B2E3եj]_ݚHLUOsRy{ly,W*[BDZ^=]G\-(Ӽ-oAKk +}5O
DQq}q + +q9š~|\<{Yԟ9qwv
Ƭ +MaMHcԡ" +" QDAE(+
.F#ڢ$h YK4cy99s38sw}D?[=v!zsl/e@0?p5 畘"|G ߓUo :}1x1~+DoDp }&P| e>шZK^.杊yG=s/G +5Ut>K?
yaL 0\JX)u`dLBF֪\TM1 +0](K@l;j8Ko7+>^_x10DB 1 .#%bH+g)^V}^?h.GX#H1"1b0C1LF! pURZeX݄Zn,U=(C&^|"0iïAƈ1!)sL3B8J02_I?#}ŏ#+=z<t~;<^d&|L΄jj*d*&0Pe<+@7 %˂g><p,Z85ñIQ G*+%Ŭ1yT7`ZkLTXbmn{)>UIe='UͥB.,ketETIEkh=]Tk~8B47#ni3:s\q1勘g<331зpiO[!t]CRA}g8:gRAgMY2k-tbIF9l{-%d*Le%Sn3߆̎8oƨPhn¹m4zR+$) n]!} C9*a5N
Cͼ%_HNKHTwI^vJpZZ0(r<;Zh%[K:0{jD~sQî\3_t//w_.+]-#6ڤE;<Z=zԶy<Toh2Fw ltl4rH~7A#E@L踇KP;>AcOfON;|Z}hVhmU*0blΏlծЩeZ&^;~tw/.`k=3K]ώ!篹/td_6dV6,PP>N>`~]Nڀ5g{
V?7hʏȌ*&2!s0#k8^ÉNMEKM6`WAkL90P90`<h<ո^iNgR+Zb +jՁ
fUv + SMyot23_̆<Rp>z.Љ=\ԢpV1^sc$0PYMh⨪t/BXV[))ZZi,duYH=6!lJ/,~lSfA. +bVaXFr$z +os(CScvyal-a0=\2 +][#[Xek8|NNGJ,+&d-ZU2)kspl&d|\Feeoys'9| +&BXuBKLH[aZ4jx.SS<'kyOҤeM+)9i\3<GJx~7\=A+6ڽ +ET~u&>uyץѭRi^mƣ{5)<Pᾧ_K\w +ڴ~!UR8 +lf]Ɛu[/HzxHx +6|:e:F*&3dR@62B%}Z/gzЈ%~"zYP`,Y#kd
!O'9zVҡoXGFtU1z
]9Oq-i`kNEت!y։?DJI?k0e
Fv5hfMs]ɤ#OPH+k~a/ً ǧ\&M..o7.m#wA}Pk>X[8ҳGCOF =驢c؏pn7qUuAHAF?cpMOaӘk=idғCO=Z~Bvc +2>×8?Ϯ}観tBF!dXf NK8:<jfY+qy͜*:v%9NI:$m8gp >1zV+43q9|PoB!yfbt{4e"OE<\P$݃riZ!Z3+EY%̫qb/Z-ٲMm89)Y%G5D*>uo-\;JP
e3?BM"}65N;.E˰hr)8\1]Am]WB/f5`@H@0 +3Fia;p{]4}B4}\&rY]Y,)oANf<E&[ރ|[.eex>G{R;!6k怣UI_d$pY2$tJV$A7IH>
?rp23YC@Fe!d>|v?ţ-)sCׅb%+60VÉ5.by@66f3Szv1b1}1#~f0wFWbH}-`oؽ #E1h]F<Z$Y-CdY>rZf5GOzevd̨l1fXc+8;Xp+alobkcyxt, +2/a^Ղl)h]iR<y0GqXrר>~DoSt%*vJhb-ڢt]O&*b)B<ͷpB
#𗰞uxwLu45 +(4E*u`_ZCUiʶ$'K9ܡNnS.XRKSK@o({TOtW%}3ug
-BT='*3d;rZW!CSڦiNAFziV;&:N}iTcV>gVK*O<9rܷ݅
;zֳ~h.M1cB[Mvp_U~ՠki.i֚&mN1jjW~+-[[S*48͗2t=Asy?xl3|X2kFdߟa3
@k4Vj*Od긕ZxVN?ge|<OOMR
GY]Z3/C[--@\Vz&h%
[ -\Oks{f,b+kl&f@S)TU S#|EY^Qyª9%7L7Op/B6 +5 +LgLYYX-Č8G
p/v'B*0!=@Ojax4f$4%v()rzq%sdVNg`K-,̲kkyLiyNnzI4t%Ea`~BddډR!.8k
Dzc=DY>9ZY-{\liz3Qlu);_&f6*C`b +gyB1_4hDY0ņu6#%BzĶ=]Y͘ݶљODw +_X^/C۰k69 +H- 4ҁ|sQ75ת%7%;r?&7b7`-G)Qͮ7
-CclXxs-<P~^wjw)5@<15 0}I@ +6괌E8!Y$炁E&"{\8Q;Ucfvy䦓ƒ;#@pOn/S9SKe*mȡPŁvu"wh]^8ѱN372d/?zD ?u#ׁ^!FE1\gSg!ǃgz,D/3(^G1_uj~=L1amOM2h>wI'T!FZt͢bYE`1bŊNp㾫jn:]TMQ T23`=^#l!~eěxx Ӭ+(vakȷHh#m
y BE7XDR#/|E<{;~FCR}.1T?S%2|.Ii6
nAχӿQhDz*Y1d#+d]yV!݊;mT4Zpm7SA7D>saE;Ћ6*Oއk&YsZH2rVL^spJ>*uhEO:h#I61 +}guPf5ĒORHH#g-99-<GQ(!~sˌ6H5P]e]|[,oO=@?+ie18.ġEGI8"K!Y:ZeaulFM),hE$]F=8IDe*DTiO>|o;M)kף!pe&)&XK+nisn\zc=PRu;UP#J^ +۽Da(xnu_)Yj, +u%Z]6<hAOھAMOQY쟊 +tf;|/R6zįY( ݕ=|_Q_K"Co^vCacy;ウ
.4J0T!-:[Z?O?AZ\5 MV)+ + YVP&+mp*/Ն9lE,j- @4,G8[і!=P;LHv?RV:bUɈ)6El>jn.צiA9AAvYvvڛvOWi#iԇm +#[8:c:ڳKk*JFXo֍u}c>!GzB,}:*L}c>1]_F_锦orZkuN}眬{<sR8Rt֣lw~e.s>zaKHIaycuvq:G=fdf湮1$R\WEa"PLS\6rkţV.Fp%v +iD"e=)<J,|גOz/^B=?<CV
3;OLEzGfEOJա{Av}GӮQrdO)%'gs\Xpœ"#Gg;/֔mZ1jMŚ͚jMhLeul"/K(""82 +pD8\a\:.Ubƭ}jZMl4imbf3h[8|3c;is_+;B!}g'ۉe-:{KsAMc3cT&WL.d,
)*+*(<_^רwgO?5zz0uuP!J75{X<YC,-SN7WUQsed/voq:hVNNvfaD̹*fAT!*K"jf*CK9}-"5?PBҲ`W7%+Wl^bYʳJeWu,W?;iN:030g&,;??R?'*S[1,][7,M|XvCT֢=wghR%B&(VnREK86 z)sCb~MYyto}X]i{t933ӊUSuQSt5d1rn]ĤCu&.LN(>8~_C~vd/lVB#T?+A
2*%vʯL;bi>je9!ɥEaIeCK&6N(]P#(o{%901oϔLh#D*WȜwȬZm^mLoMxՓܦ-꙲0'iLüx"~mc
1<hw܂[^W|{l? VsDwr_"M>i*YM#2vHm'!-!}@B}1sGWy?77&Nݣ_]w홚#UʀUjF|[
ױpWCmZn'-2%@D$D%sHX>yT8_Qc,q626}:Ҹψe/_vyXs.MkDY9sԁ<BMH9BZ4J5"L` eg1ۏ2Mvipnqf*v2U8L
ս[m=`zWȚWkRqZ8(NVNz+qu-Ý&2yȘM^.2-Q`Q$k3Ԝ`jN
1glͥsoG͐~Z?l+^;e}+8Dx֮bpђeoI"2jHvN2)> +q,>6qiawqzGqFG1pjs5,11DJ62fzOxc-"*=q=`/]nb5DlĦ..]\Bp@Γ-{(=I弮ɹSd)Eq@$䠈+"J_{X?\s ;?x't'j`5ȱ|].I_C. +ߖ6le?]W7\ӻD&9B
qߋ84؈u9<Ӌ\.rr!|** +_K? k'uyKX8qY^pހ?[v +y'[p71'^ټ&7vFȟ{ޅ]A]1 w==kWBQtDuD</<8G{un<S|>?=͂;TM^-F\g`y +kI8͝U2*xc(9_s<呔?,5&cً}.,q8ۡɇD-X%Z|]]rx$'qDx^"fSfP\)¯S N$]$ұC&ة +csP1>/l\NI,J`^H=,{NKsjƄT|Z1Y;,ec4.[`{]ҟm?k%mV juo/Ens +-19RS<c,O;"װ~r]'{C]@|>]d_jɽd}?1iPC? +>Ua@4[Yܩ4t(-mJǪ(rӨ\W\U3?3!:yd\-'<|ylW[Ĺa\`BN],1\ѯ3z59be`{&ZT֬67"zu/V=5qK\C9=n L2V$9H/pG*lu=Jo\\ |:*`R +KER˱4en2oXVY69Yf6}<$д:VCVrBFv7 +qmTkV +,C`
v/y +<hWUx
H
#"_z;\:|)q4Eg#'\5S䛍}GRьG3 +R +S>t>N[nJoG~x*\^;E.tp_&i<Ѯu +N!/b\~<үaPgCyܰ
V<7A0,l{UuY*A5 /X7poZ1͐hNBg:g-^^STN
X>ŕaP3D1+~)G;Y{!hrE}hM@#Cu<t +pz4E}/$Uо7xA1H?ˊn$QǡM'z#$4sagOcON'UABuL;uxD|];7}/ˇSK@$e<M[$lɹTzKtD)%:D-^Fm#,Ѵ#Ҫ=v_3+='Zw +udZux~<V|_1Hj~43 + 4E[j4f4WLќ
bY:ulZ.RIUVZ=WGћ!
?
.S7mf +m;T`{Aʳ}nXbbȵyOuK}+x +W$1'Pmlw긁rC4%<d(Mj(N|Pc(L\`Xs1g1˸ۘsqqsEo$~jp<7c;_rpkLe:bY^1Pn,4%
3$oOk^<ɼ4Q>)s|,YR0g~JenJev~KN䳾3~}7K|bp3xG Əz"WU+E8-P״,$-ݒk>o}BdLysggˬ5FkŚZiiwHTO<)^zgPƏtz +pl +<pwФG&WCZ& п +%+XGk_.(+&jPE4DDa(01UMms4$͢M$M,IkCHN[9p~NZ9ͯ1cv+=eh5#ƚ+*Lii̥iⴭ´}GyͶyͶl)P[ +u +x~D~>a54Vj + +]Mޥh笓歗ֱ^= +5-Sx{*w{S57WA[+4g|{vg6_{Ut{~jnu]AMRvuR]q/ݡꋒ_7x`cSQ><(8Fr}!mcv~n$7%ԻS*!lla25~4q4jWU9C~F68H-A-,;93=Aȴ^Lİ{`=hvnEO&мyN*Aa`Y#xGA8a{MvHw+pM;YІn%A
7n +ba(ѩI
+D
l@g:(nw!n=]'|LA';@Z1h&W +yJ^SգehFc-,FWY
5T/PcNiQ&8}$2*랓hc+ +h.Ztگ8@~z$ :ʍ>'5&`4G9f<tr(i^i`K6Q:Mo<Co7NGǨœq=w%#a]S<O1\W 9FXsu]q<m I @^A,b +x4]'N4[IvڦNttd2mӴIן|<$s߽|Ldžc8უAYᘄc8f`
+2=oCtWV.#M6a[1<=v?|k5+.*G#l'1 +?M`~Q_{u<>M" S|\tO~];Y>9uqNby+v}_c|BUx)8OR<J(?`^e(M;cm2tk
t.FvH/pNhVŋ">A
Z_E=ZOQYtXHY~=Qdp%vsQyI +r茢NX鄲+X\;^ZJфQ:ͩViVN3kVݥ)[4zƷ}JcX:B*ẏ DHCѠx6zNoE'vhXwJZLfOvl4Mgi"t(,RH"ߠ!/'́8dLb9\h1(q/!w</dE<R$h%e-I4ͥtF
hb&38g\4!h4g8s3y{@
h^5s2~+ϗ7{ӶxRЀr6\܈JOGh6GMӹds(VB:ވvu
I_wDЧ{VУ(jo ExrљQ;KFtdo+`<iDoXц14).gpFya?F0TG
~Ck3}^Cgz
.ÜcXu6D6w9XSϐ(Q⯔a\磈eLE:hAũ̀)o"5D>CmtF7vH<nI1 0$miqE2Kץ
EH +ߖ: +?:[0 Q"庅
k +ZSY6 $XQ*i!*k1{.si7%|VQc*yYQYr_2m6ZW+bjE>x&( RI}$5yN["iɜEc35euBi.*mӱ֫eeb-ec̥1[>W-lfVkpc`LUFl_áZu;vǑphDP].sTUv{[_n[c8~Ei[TØBb ++>WB[PX8xpe4Jݴڝ{l^SSAD]Q\PmTT)q'/v⌎9eؽ1E<y^?yU vV}{ S`{/О +-mЦ8ZUB[9Bfv*L.WlSY5FcYE<ϵ)9HHr~/n,:e=A:<`m!0h;k:yT/j=TIc*=\>Y,4QhIVvݽ2{$Z>,uq_gw(/ԴN8JsT+<۰'2|3 A +79pMnL}fg߹;zX+ePq0"g/ܭpكDf\Db +œ&2BҞP!*eԡjNR0 +$#JERdZ*`2}|S>:#eqL9I' r6y
<rkeHKM8% +)\ +c\
dDR#uxQgIa>lh8(6!ߝl& +o0xlXu
ĸx?x+ApJA i +z5[
hwҔ`G.].6ul<7M}fs>1y( +;[D44;h7zuS +1""G9QlG]a|Uz>"S7I~0=6Y@:#ˠE`NА!GΑq!Rpuq2z8 I;EQ0CHOa2)t A{09G݃FDnҨ}tܸNoqE2bǾfi|=nQɎo=avfm㴶ͺ>BeH{]wϷ-ia} +>E?hAo0iY7z4zbH4l:3Y2cbf&r}+'j)$Ml5%~JC!f_`=
n1~4Y0Xc0*pZW0MLg%a>"hy[Yݭ^?6Ĝ#sw3Wk"?[)_2c^T>J|akm$5-4<ENAq돏q8?;5c*)s)̇QH:ɴ{y^tQB(O(u + .㚖YY75n\God5k֛{:(ZnU>EU!K~UW+T_bF-YKw+Mwg]"AͼB+i+F?o漢NʧU%Ae]GkE-HVq@e<-)V%ZlB[~\qvA/nhvs2tYC\\sMa"u;6lO{OWIO0h +*?hS88] drC +RaYc +le>f!-af 15erS҆6V-!~*]46,`X6ژd jO5>87<ה^`/5 +5dJ
iv4-=sr/S1O
uyLy>{"Jz}=>jD5|*Ŷ~̞}}?@"B4?1>Ȕmjβ0gzd'y̶xgyEf[R#,#[E$[wX'Z'D&j{~.븾(emytպ աh|_>ЪQT֠0 +n1,ɈRzREY&xMO7wl\R;K?<37H;RE,*dQ`XCP +AYq%**(`eܠZ"S9k[w˨ڱ3gTghmi3p{~3}I|j%NLᝐءxROS㜚8t
@\g͖"2ijO,CebzK^z*'M`Hզ|R"]B`7,3<kr@;:&:M;qNmTJtj"tF Ir ;g4~N{fĬޒ=XrCYY#]'dqKLLH$edx'tcuzc.hc\mlFD_i<1gDmT&܀Rh4daB4X<1$'Fs"b5./=4^7MĘrMѦRmJ3T5Ԩ0m{}x?e8^ӖM/eD&勘m/1 +iJ0PK[HVUp^A8sס߫~r09=:=;aȻ^5&wO11o[U2+AS$K".#U5S5:QbYg +.v
ujmuRrp[J +)p+|gq8JMh9 +4ֱRS7n&zfm"jJP=r2 _@ +E1(Y~W=+UƅrOu[VUW;\7807pk_X>o2..йk +K<%)&~5̒<y#pǻwpg8X41^&7Y#P?;q a{'V:[h?+QN;--F-TQͱ9@o+:!G+̿nݭ0%V2u)X5x<: ytH
1W㍲\"{f;;ڨ
O=+W~B(x8TE|ķ\^$vhjb.ղ=AnmdUҕ[P~?@Xb$1F씉ğL%t`90pwV6L&YuDmb?jō + ytut_*.xF($$L3mp*, n
Cy&؏DcWYekzKzkםy~$eE`MM pԓ 'EN)t\XYG>ǻvV5:ʵ\Mg||l''r!w v\\NsunIHB@nJ-v6UueĺJ6mZM6iNl|;Gw<9aǙq?mlIDkzYk}Y5ӂS +N*XVyq\ǒ؉cb M1La^ǜt`JSLH!{qO!K +58MI}N$plS%`1[Z1̤!naS#L[DY]Ø5l`]DD8?N` =ekE\-y9Gˌxf$2Ոd:tc:ˋCY~Lfwb"rb8HγA8*r^`wП?BolYz_ [E>OmY$YءlV+T~T!VXF(jhQ +5]JJmh*}RE[֩-oҖb7)l*^S~_UkeޏUyGbG7}<k-!&h@S?FMpYYN`)-NUy^mKA$8 Ua xEر-ENWBvNJ,#UOVg||))r]n]tu==}-k(B(턩Pڭ0E! ԡ)rG;B3BvhYc{߫]EzקBzPVo|s\>rڥҰH + +QG^ԄhrNdGa[(ң0DHހ~gErHFr,Ls["_~&܍Тi-Xb0L:QZl")PbEc4i?eC("Cq\iKob.uE(PNkRL}HAI8
L1r(,6q^8/R/3óI&=4} xd\" "1N0uH= `W&Eh3A`O Zɜ&$"/44sGL8=~|(1{x{a>7cޏvQ}"kbkre6ScMfoC]BV8vnr>2 %Òyb=65W&q+_%sqq<T\~\bcov}̱8盜gb18<ƈAsknZ`pe?l=C~r*/wBx)ph</S|-[L\Эsyܼyp>#$fxuN[Z^!+yɹ\ tT7,B2ed$dM2!@$@E@6AieX"X<j=JZZoj;ޛ]^t#.[&YYY6r +f1ÏAA^j%{qzi
q?s#1Ws!:'P8PB~ +\YG zNG;Cw,~rq\DO5pWsVýS_8><u6W<iQ28*΄8DV{xs7)XNQ>T>a#A-#Y6ӧdbW<)*xji3Z鄧_c.$r71_*8]p)@䔑Q<<X4* +#t'Y+⨀ZzI5YD.ҩ\4 բ\-ix:Wܝ\1lFX7gA1B"}j,'I!]zre LNy#j(ss-ƥf\--i2>&=2x\Lץv+FDjHe=X<[λ>|Y:*P2ɢEH*']1-Ai.-Ylj٦y`Z"3M5=*5Rm:&UAoTӧR|{#Y f7p5^gg+ɂ2α*b}bKsh-rV%3.YjJMxTRTR^WJBn+U3sJO-wON~4JZ#)2J2+.Nv)3KfRmQ̍Ts1/TW(eCÚW5M^mm^w:$&
DoV(
q&$8ؔjKʒj=r4muڦu[Ee:.ײMHN.3ߺ0³tkF?+r_A}Af$PJ6+][fsJm.V*[ekOuslKN[>ӶYk5-iHMMzMMI$|Oz7lw :88tf5K-Z6Z< RRESij#W(2:*َ,\ñ`w6m~O'_U֔6!!k< +zyқE@+@-,8MR.ٱ˙ul},HsV؝
)Ύdg!ѹʐܠd=ePc3[zk0y
;gϐ%+e9 +:ޙW +IWsZb-3dTN,ⷣr^ySQR3NQ2~JɕS +v.RP*7) o復n9*qM{2f{p5kM*9Y$JcT}JdrV{zWhuwTF)*C)%J W*F%5]_KλR ;wB>y4HdDddᲯba0j|Vg +ўV+XӀ\Ȣ=mRiib5qК(n#f@՟"0$^-k +~J)^&$ḵ0242m3|K$C.VjYkPRVr:gԣe#"$\/ZJt=H:)ށ og`x<VG~Ə5=PEܶkк?ۛ^MZJk8oT$,d+.uSRx`7:8l[HVrс/uJbvJz}5 Jg\8/efeRrUc? +#? +5ϭAV6/M#Ϋc([ǡ7`xF1&iOf4ٰogTa]e0>WНfkUh'tzs
pEn +"D3KᙈSᘁ};?Vӧmj*i3x*%Sg>?{CbM<p<cᙄiT|&)pd#bWhVTyd+^BX8=D^#\- +/kqZQp xÓS<jbv4 +N/wK:o`rcoe +kSFFLf:> +١އ8 (V +լ-ʎ+uoJYTdUy*/|rç)'bʎR%_R,J,V9ͶWefDSbYM +"[AH.qVI1I=R b{dS%jRUc
jQ/T"+dp&XOТ?KX5 8;\dpM;sԂlJ+HR`IxG:2$a(G(! wLA2@B+ڥF|+{S+oKHO@=L<Do9({hWd2T=%&Hp`Q93e@rZ~ꬓWKVU^F꠨# Ze r|/A>YRrOXk@%({#=Hd'5"ᵺC{뎒A%m"vՅr!\ZDXDIi-mkV9; >7m-2݁T _Tâ0Ca=9Ap + ާnI\r<UnYcEnh/L5%<mr::L,:/M^{]`4ܴ|DdIT0 +s/|O<{4vb&^y
~`_ +* +K< }$rNNX:xD[@[]G\EK\E|,"ɧ1~Ï~fxN24'w@5Pc$(-߄k[:KL<q8)ZǏ~Cŏ#,,7tPR졄i3x7y~t|KcpV!PDDx,:
cvEa&;i_v#o9~l>c +Fu5nS][n鱶vm?zMH4Mvlz2O}SO3mpXwkYZҜQE~]y-:c,/},Oc_B#)xR"|x{<5䃣Ȼ 1iO<O$C'q}է!\_[3s[k}D
W!8ٿ.\^Z^zc5q'Fn6}1H~NX?뇿m(mi#R,hf9甊`)8jk5M.`gT'v: +WJ+"UJP,۪Bwņ2rܻfa#=mlsVR\WuKIUBXw%>2O}2<v\h][YTurT)&Vdx,q(S&ZF=J*3-JT|em6V[;USLmr%>|{x+j|Ɏ4!K
Ѳ4$*k6UixKX-J);XxU".)LuߔQSv}pϿfU^o 쇯4אZ4e6=|JnU?Y m*P\~>E(uTF+ub&R_}.5q +``x.[fЁkG-"P'\${]NKÝ?&)!d/AW +P?AUpFǼ
QI쟤Oc}w> +lb-K膟%Hwt02࢛OT141h4r<=&àmൊK9Wo5b~BC,p}iCe!3vsx|O=fV3i>TO.:ɒ x{n6L;h3DX`v},d"/%8L=9L"qcه%Q:sE̎Q +[\ ++Ր +S뜗闸ornRܛ$&ܠ"ͳ5A̽L3[ErI'CB|+O\oɭ9XwW7w]z4w(]xM0T0:r]J9ěo!Ϋ!#?53vH=dPC*[3nG'2wCIC
dsl%lͱcM97lAb*Mp` mZҊ)֊ub+XikR +^be00φuv/s}jϨWfz焦n]Oʖ^Mk^cGP*z
bYw +i/$|LOgU4JBU!IMw~tH\ӿ!D ILذi~[,DoW:߇[ufϘ%&7&80zuY +1q=]݀yC'#ipH~B?dOˇ6wc?Yؾxc۫ƑK)9~?Ciچz;>9z4F"ӱ|"XaM.c'~Gc;~l?BadO6CވD,) ֡4)-ODJnbء,w)je?6XO~<J"s%W:m=k\7SW:
;\b3yQi00ZF+m"mpb6gkȌxF"[h>4 +v%"ٝeT5#zG>D_а9tg,qZ#i}b@qe\E`U:X! +oyT%DgNvh?mҏhݖ@;tZ +TcWRN[*PinJrg8wl+UIydTv~UY7QH{Y\2Vc2A3_>!WA,PeaTj+SFvPdk5l=tCm@Vre6*ӶKd.846ݔ9/LjFl7`f11@Ԋ|J{ re/VqI9*tT)`une;)1OoXԒJ)yRIP|R EX%iua^x\tԎQ#m9QY9^AE*4)Ң<YvV(٤tg)JuUstO++FPlG+xGH^?d8`Du9jzfQv%*ӕW]6ݥJu*ݡDwq+HڮPߒꂢ4y[[CVpgтau&FT*aiuaL%zkשxob~xz황(ginIov]ܟ{XaM`U2rc-^O4eOH6Ed?0ME0-<-,Mt'?nip얺Xg3jDvL%s*u(k4?8\rb̙]]x]K7qǹ!~] +agc6S00Ld)}IIllG}4Af 3^a5dhH2ε +8Ù_(ȢkevXZEXQQ"A8 +&AE&Qhڌ!ɴ555Ʀfi☴Ic:I˗L;#}^3b~/gf)5 ɐJi6L,۔2XM1R,,F_I<PsG]j,S9R#
%zf¥:?ڨI;C!䢃۩G{7ϰH.`YkE`(ֽ*Rȧ29J́;E4 +>KcwS^e|Rbq|
_Zq;FrB;-RptSBdB`5uY,h] +]ϱp$a=l2_d-ܶ-G3oyPfT_G?#E.L3 +xl8I'$JUKQ%ʧx +x>=Gq"%j[D@~4:\[?A{H"5=iM LVy$h&yTdJojSiƛzmڦ̠:*Wy]\ hqoA`(A1{>MCL
֔2Z%(wX&e0@3)|
gn˼\iJ1)ɼ_Ǖ[9B*>s
p_,n5` <%<S<2@E!aQH-ZR9Nّyʌ,8TfWu˔`]xkb#T9,(z䇲 8¿6U/S\1<aU^I9QÕ=ZѱgK˖4x'*^$L%kW}beoh>YO}A-Ej1 2nPs9x&36PaJTj]c,u(Q\1-rtX%K#߫q{^aW>1^m!l/I^JA( +snVHn
K<s2%Pmm$ÿۍHJxY25 +"/3$>ਃ\
PN88Dz䎏<=@E16FJhcIMjkڔmdB6hgҦNFљdj\N<>pT#A13&d=O)0IFKM/z<k_ :{-S*%&6$0x`
-Bn3;)'
ps +\Y³hy7ͭTd.E\O|pݖbv8 JXy/g"v?dyBFVqxTpǗ~>cǫaaaf>ΐlTcu#'-c%p"^yfszH2WKKN#\E=ìnE#?j>m=я2QluG>xu~Rk+)'y1V%%G.3[vmv V+Xd[7AS v1. +^bNa=oKڅ0{4Z/C@=x
MMtS'D,w;jxA-"`!fƌ.1VPfAqh=#187t)CWi9\u}?51H] TH;\
G+ف۹@HфOy + ^c|gS` +6ʯu@I{dh@fSo/bƨj$F.
2x%;?b
O.xp.ٯ`eTGVrY`; ~&oþSc +X@divY]щRxZnd3BI<|ls@𩌾ChVa0P_Ă +z%*$Cq 8Ji\p3ŭW?♋EYSY6F7[,nAw÷)֯E!?ZB
<|_4|sRFR_6|fb,bYg\R)|:'.Գ9,:!S+\ƽs<]TuS)!ZqE8b8"ҥ(2ClybJaSQ\Mdk$S/jFdfT5u\R#^Dq)|[Ƒ;;YNJ57֖J.='-'+6ND)/XHnErtŒ]t͒[%ise$Y7&FaI{QgŠ$#mpٙOf`]Y@1xd6Ia%'!Y%#1SL0!咖e2)Fc$G$>%>) /JD.KKFoo<H낌r{\" + +!( $hSvhwfdcX2b35Y9إYoϙh/}s%Δ'BӭkLgS&yC#?* +WP519F̍KbxqZ[pi.8D;_g;dc~mG^ioӠZӡ*=+ɐ }b|/cbLQQʔƈ̴i314(dVƠ蟹8f"a4Q;kIx?6:ȭ_ZA!=sڎ40FJFi%ch8"N-1ԯ;rJ,%rfp%rL~_
K'3jaˡK"F9܊\92 +TL,j;V+k +|[Ve6RB ?L0v?Y8^шk%y6 ʈܩb@͐Sk%m R[%ܻuZݭRLjӸb>C__@~̀iPn/bÝ5E
^a5HF$PMi vFݾi0 LzBI9],jPQlcZ? :UOq.N:GXmgj4ي//iwgGCn b8Z-th3?xV%mkWzV\b6o1@Z5v\B):G̅rbvskv< +=v]@'%u߫eK</4p''8?DC;m'mϯۙQIJP4%Yz\ '%.#me1˽]i6>^%x-q/^p˼:x=0tu=#q>9,Gq$Gһ<?RVjeuYˆU>
Si*НhA1_ˏMd=Ow2Wj)ݶ<,.pe=*Vue{%ghIŭ1|XGv٭dwhf)_-׳mZNdn%{)ˬ}xw.Nz2Md(r'ĵ8Dkq*wՕrd?=.>.3,&[nIߚ6.mvxy$t2B!]EvUC9XgshpflbDu^i_+' Bȇ+#*uq9RWNn1vٍ8| +z,nqd K!sU|Rܒ@ʟ
Lgl/|=xY\Jan3y-ƵgE;ϵhJl&Q3wYj;Y6س:uB@LrC;ťU/ew3},uePxԨjF%u|%N8zr&,ӻ%+\BEksGUk2r\b|ZW"15Uzh*WESd}6EoAѶ*b~my3}/\686epD%Z|quExLUUM1K3*HW+2 +ţPnٻq>Ū\X`Զymzg5>79C*gDTᛀoRLIuLi9FQu+DK*6'x]8Ν8u +|dJ5]k-9JTVZ%ɵvXl+dmmѶW2G%rRY$5sZ
`0wg45B +KAI^8Rg|Cɳ{%^!6GXM_2Hc:+ a99luEp1P S(%wInQbuISYr19Òl6Iu!)NE'ñw y!<:sوa8zśc m> +Ssp3p0S"4:vhPXQNseg2gQad$!#|އ]m^ >tq"xf1"65 +jiPiɵdXyс/: +=Nƈ4aQ~bލ
(=b)(ʯ6z8k"gތn;gpbÜ6PE1Њ'ODs3A݄/6bⱎ>vl3ܻ:A>Ow6U3F}۪NxMLv؝$cx<2JNl%/|&95|\fyWƹASmp7@|r8;@lG8POB>AG<&?vr+F-YSC{6-CVJ-/ +1Ʊ
^DjA;尌õ ?O`>rOcUx!G~'+ϲ[!6)8OǓ O~&:? .i*h`;aݣUik M%de=2ܣńlE5ȍ95RFxi#pQZj|m<9ܠ
xKrޖ6%[kW;($ɼjda\<L+^8!k=amW3]W=E<kD8@ vx_*dGi
TiBT0B )28`8^ߨsFh䠤3A>(rWRdD=^#E+8O{ڋ"Bk|HL߬+ɩѩL蟎L8r(@~ ː 3+!"
o&K:h}Iz"3XOh_ۯ6:6S+h&&q$. +gduatX\qD$
\1#MѪScVciS5.uZS[MҴq[5uS퓏yf?sy{Ϲi>kpЃFVxى bf`FvQ)vm4ߪ j:pxxeOJ[ڃ3hZ4(3i7D +h_bA4ϣ#~n9DjX$Ȝ),3ɯ@|ޏQd`n_{dc?a0d@cgnK(!b
2KPP-~D1YRג!>Nb_JY8ug(w|M&O~6v
R@"> +
55GC|?$ +#9+1/"~>1`
Xt;%$(6)W~bâ#4TAA;(jL@᳝![2ߓX4qPC$ HK:q< +:⨾Xn9Dsc;Αѝ$?İd$KXN,)Z'X[_8z +=Cy%\0ۓ3 +e
[Aɯ3tufy7ޘMG$eѹE]Wmv|Sk$ۥ;5 +1<,-ǡ)Wxѩ=ޭ[ր +B@WCYI7Jcx +56čJ\R%1vI-)%qswFXSgǥ
[LŃzr]_fL+>x)m[γxڧn +:UΜZb]0,X 1 lĐ-h~Gޥb1aXb;eS?I+Ssquq͎-݁,7?+ +Id1Đg5]U^34.iFGWڦPv{K8[
M6zbOnR9!1*~*Ǘfگ^g;X +ǬICg<=_[q
6<[ܛH"<ݐU^81֧{/Cu7/̙FŖOӢa\;=2N*GfsAѝ@
}˕Mim`DKc*/_K'c"A[|;S܋+!{}(Gw +;pH*TePPPAݚNN:WmWI&>Vh_%?|-}<%+Sr`s>2X8v|PY%`-{KsĀ9;d
dP
Gwni8ؿᨊ״P6 +@Y56IMbOEGǔ=J ` +7<k8<~k6H@Ɉ!a9\}ȷ"F[Jar^&>Y1~~02đQ*ɹOp[_'6
#&b#YyVc}a8.'pYi!EIՃ}ݡ:BJfo{6in8{ڧE=[1l>|쀒4?13*Gr#u2=fgxgwsڥ
X% B +b {ZHJ,$J}B[kG8ϷYnVx[;%C_VɐBb(1ԅG.l
>- s_z<o͡ +7zcxÌд3{
X}PfZi_SjljSBkeƂNX=gw߹Ec
ޢ
؈C?!W7(Rrhr2`>rʄ9Pȫ_Ra
%%njE'F
`
J۟J;!1i*Vh3-4aɳbTMhͭQ^W.t1soENMX[CJbVKt'>l|RJeù,=Yܰ0sԏJg
JgCEY(PݷVy|Y1'1\Ɔ
='m%ڼ&rΣ#ZO+=dr>Y}
6b((Poл0+Lh8.Y4H--ka495lj\i5^~>/Afg1[zD@/Wݳ\Y䠑+ctHӤUR3BV~7l~lRo[^MFt]ctPDviLA~ϫމ4U75ri}geofx RcǔJKCĹ1^xWꀳc=dmbBEv!SzfECgq 9e&
rov WȱŭALً#.cC}h3:'Ty\r;OKFԜHER<`uJm:l=!
r{e'gʉg.Y2);}9Z:6Xap\۾K>{#Km[¦c?HUU^L7McUJܒ_[pYy<Es+&ieF\XQ$o((%X_fI-K@t6KA>n,h:}ԽFE9ͣHӖ1)|իK-_9ܶxu"u VsD'/|+\8e)%:(kD)
ԉHCv`etJ\4
-bA ;`;`}1 %۷Ȇ{AA! +Ղᔞ7w+C8z֪QQZnh(PDM
+2ɧ +wm]Rt !
\,~M;q0KMLlXgCu1 +
ke=VJ0"sd;F=Q4I$GҊH1'}
M@` ",@U c +<r=_'/B)9Oc#)1>'_ fg=4נ5(+B!b(A\PeY{r_&?+NFpGeIk\9..1%2jGLDhZ7CbUEjTϯc +_ +\jSfC+2}؎DImR@uuFs{Dr{1 +QHaȉ<#T~#FӺj?@ mUbel{DOPrq%z{uA4'q0#sY<~>H`
&!1wS{j%wM&/ۭܞw:৻]S:4rv.#7<?Z<Bg qR4ebi{_wIM:'2"J:8
wNT/NH!Ǔ~'EF$ (;71U;(=ZG5詽26g<&l|1yp]&lqEۜ(Y0t>Š
6C9oF-zgfؐq$Ɉ3E0[Ȫ4yD
A05pݏ&کo{vJRYޓǦ8MBǸ#vĵ-4u-W7EZSdti@
~@9G&(@ +Tw=;?ft_61Z6`s&) %׆*k.
nލ.ҘgivP&(ޱhжx~Wcr]Iͣ%U=U}+ȼy)l? +p6,r!'CJǡ (P2~8M@z0?C[_5/[T{mJбd.uɔps<%l2oضȋ0Fe؎mnlƓPw'3]78Y3ݍ4N&4Sښ_kC<~Ʉ0ILs~j}a>v%f+j*)";M@| +=Z'plX/\c0v+_G +b`j|
:;:
;lJYۏe]f<y +߲1t}$&" +CQ똞fi0UT6(U +3635CU9Qt"y=?9AXUPA
ʷUUoW=pݝfڊcټscpg8g|ޔ-?;Y?N^ +?]4T'ԞxD|TZ||I*\+@coȄzŴlҸqƱj.?3+Uگ02R,;1_8S8SU*N
Zj/nh">^>1F05⁅-|6g]q< iR +lژ[4@kW؏CϦpL,mล[YX8[w%/}Jh͐vpDkCU)2O@Zb$M8Z`YSI\'-a.bEs)z:K}UwmHW6dևb !l|f$C"WDZ-,b؛yoA0~{{!T+7Іܣ{nuΦ@ a3$&KB k.p6x)s|otuOѷc#%wBGJ
4͵l244"ou +`~ylPfxG_>#ޗޔP& +qrNhM|WzW.N^OkmDy(EX4Xiv(Vu^ӵo1IǜY5|/+tt!MK)b>_ +`)
4#mJPcSTCHQT E]94i;Pْ%7g<ji}Ml('m.kr5ix|(2e>2O9?\-nR))'tבZymti8YPl`jP.iLgQhg0jT2&!ߩM(*W,b[-'xd^_$+8+c::.*j`(zH.i/4yThDvOMjUk9AnbJ~L) +hW+NJ\o
,eCFi +X4#xQLr`&'ѡ +(&Bs˝L^
x8<ᏺNiaNN8mxmVlʊj;DŽ=cqߌ+5dC_TRʆMϣo]mTʸkEI729=ބB^_|Q}oT;Yљm !h!7fmạ-3VƂ.C}A;[/*՜SnK%uGeF )mmknDC̗
xߠFyUmm{8N.z^
fy܆Q1=!էzk.todV4N +DhJጢ.*o\l`}!qQV}K^9z|JڙZ/'CCR;XJYL~
F]k+I(\BDV +p'6o_K21n){AҜ>ƥ[,>=ё,jjnNkɧ]h%EQ$#2Y X+IV|1qx`o֍SE2\9#g<똃!|peh</ +%DC8~M$>B}c\Q{uo-+^[s_٦M9N8<w~YU,YfEpx[Jah(CծK{-':*طnkZԣx"0u\7ΧT_DDD2i28Y^0Ue@IGvٛߓ>"
~kN}+Yg풾VgcEYIa㙳3nosqyoSsؿ;{n>[}-_7~Kz/N;Ώ$VUdj#g&F0c-sIvs$۹$Dx0p+biҽbοkZUŏ2<(J:4C<0QW;`dLY ^a_ #VVR)FN"
~AzԴc}-I_ +*F8vJzPԁ6t4C-u` +K-PDIqIK!|V0܃P5yDQB1mDڛ fP* в@+
2K!i +OG(w@ [y7M><bGĤdsחkPCq٭<$qfZ;/[QoF0/F~- +7 `<Y?H{K<n?1ɸ h*(-=ɦH!MA$,09ˏ]eǯ0.'.$-u%L>QʔC:31 h!Rq'Uw +2<hC"{3bㄊ,2t}T' d/u)>4p1Ιf2>0 +30b+ІJR)INYZB4$m݀X!^qTv<(:<g,OldJLpNt@ikֹ?eM?Ow{
z|vrckhH&∆$d*D +J8e\d)}.; ='=NzQ2X{*?;άJSQV_e?ca 9]R +k8KEpIA=ѢGE@!KѰ 36D!IHY"eGZ:pQ_s}]j/TGU\yEJzYk*093lkkiǎpc(ESW0v;U׆-:j +ef;rMԻZu~s-0_;BdbZX:w8Jqq7}[\Q-./N&1tuFlUC0T];"5+>LM\òdDAMM`dɕ&7דA'q4ЀS:jnf4
v8.z9̵=cc3b2HKҩY삶Ό20.g6;:mƔ#y6EDOmP +l owKl[w~iE>`]M,VW(']& [|c'2_3~ept%[
ÍPo#A6{6?C#Z"Ӕ
rZJU%/w_#\Ziy=$S.&g
FՁ+_!p +
%
OzMp<72ZkĊRF U^ҟZv]]L.Ek(2\5Fuhݧv|mgGoC}]s2f)ST.\UA?[$KvK)8
:_lY
dõ@7ZCk? +m#vL9sw
%t]awGЄv,МܑҘq=üfuD0#rQduj(T5 +lUT+br9V\g)jgw +ߣ)Z6YY>O_>~lq#1!ˮ%$ԧs.<?%<?$y|&'z|aݗZܗ*1A&ebDU0֥~)6G:,/) AC0 +{7]JtYa\ +N1[gw +> +sn]}edtsc Ym +nY
ea,8Cɉqb!^)x/Kצ_ģ!l/ԀRp;ixHC@^kL;8Y$fR'>pɄ&m,#Äb+|UA6kz$w1:OmK+>h4ˌvpA= NԱ=&Eq.>L +Hbs,)AP&Y+DlF.P~PJxuTKԀ1j0E,a!ĭY +Iv@d@/yGwOe<AĽY)}qIc$E*D1U.Nyr]AQ^Q^~(eiIkID yH7CζU Qwy_xgBzx8}!Rzܬ["MjfQ@u=5Vu-*KDP{+c*b3.Bx9.|+}lU&K-94asHO҄l
@q.)n/ҋM*ucBZhWҺq+JirJh}Y +Fo>HÏn75S{Ǫ<?ѠzTQ9"K9 +Jxr
',WUUW~R:*嬎|Vwi.Gú_5-A v0b5ޖ۳~D{u@{|snu$F!ۜGO c˫%ɢ3I$EMF.k29!:5RsP
AhilA`j%Vپp~p~mXPG>ب184aE^|VrV\Hj8VKE@Ҽkf)Ɛml2l5}_e>ְ{`Gvݮ lnDJbS+ <*/_!jSSeԪzAگ\QNr{
Wة +k[A(7Tb2Yl䢯k^>tCl&25d]dqE2.ѱ2#C_kOk;5
? ++ݾZ[ݮzGVV;u +9U/,CrݵO'ϪJ.I5d*]U_+5ѕ
'oG9]\ 6Q
9TC.|~J;mmjw3LK-I^vbSŞM):<62SǥgKUwH+Ziz:bBc3ivVW y14i?9;|+ۙ%9zmaFMɦԦݪe>HRXܰHx? +/^x rߡx$T"wHsVcԋ5v/<cqcrx [{E}mV=wGt&6Y(3$/k'uIɤgvGG+斾gx{zŔgt$&bgDr_nx5sSnXW_6sޜi~,zM7yO%ɃmR[~Wazgy+v
07{13|+^V7,'SfrS2kBV~Nr-5$5T#PFHYB4h{:Lzc3 +ǖ9L8<s'i3T9-DFCb8cq5VVǜYŜ(e&&@GCWS i5\xCNa֤RM9EFy +Vి&- ~fj!zIl~6fOOc5aa͇=NApX'7/z0p/Lex@p)'m)r4QG囄<hm:L_CfI0^wm+LwqGBKn
T]i BJ{AH.հD'd:"4 ?z\`E6KAÞt
h6pYÓ4K٘M 76aK% +gG(~J6(PÜag7jé2> RD B?xI!
CDn\yrA=6B +?>;?ʣp}* A*P8Bx6kMB!8,I&Ւosq5tT&}oeυ#g `*CD5D[́I˭xbˁ4M8!Z/EDW(FgÒ!ɍ/1$ToDU/ѠxX
C5͍4A<-@R˱8g\,*Q1,U}UJ Қ>^YC'ݕdϓoRzR?%ޗ5ˆ j"F1җAB!+k"GWEU_ƤO> +Sˎ*W]Fv5[v;S֑T6یه[ޕM`mYH1Y&v5rc~ʒI?&{b֥uGC7 +1Gm_jlZfkǶvUSoAYx1&ez; |NWӑ'%Fs&
9<i!S8$n 0nJ^p~ tqէLDP +{J#)[" +%䷦-f~Sj1UïESVWSfVh +X6ViN WÉ?`$a)xVKz6:QuiA
^T?H0#1fX,(i!i%[e_oZ8mYEjъ0ҘvZMGgPҙJR&OVe%8ayNQ.(fhļ2n3;`c?`6;~NVbu|åuYW8:DPz:+ I /+F)%-"Kbi Pq@ZL;sr0%>Ic
ʹ\=vk=pO&a%RjCέ,b˘Yjz:d9a)D@!s)gLAƁlg +L`Ǫ#f']lnw|}>ȣK&U|t "znJa()5Y9U
@#T4̧% +JdQCm<&?n|01 +(_.:/:1_^<{'g8b;!|7-`27 '0JaBy{ps73ү.y-4=߅:Jzt[Յ:G
+:wN6w'o"|]>\r +[rOR`,k99 +)[V;1sx啥m +r.r3h킿G_zh1a>RB/On~ +rs:5+k>|YTW?sD@D@ }C' l +^Y&"@Gb|RO<>y([ca VZ&J.ę];A4
1\;8:dU +:#ɢ$E#U
4$!
h0H$u/AjH#Q`OFM5A/ ,?
_W)`-"5%tAH^XwƂq Sul'uĀ
짤4pFhӜI$qҧ/lH'R<^;ң|vz$Y1`%QfC"R%՜QRk"8!]L +^H;I:M}:6}28
c?O2`F$Sim-y9AŞȈ,<9Wu*l6pəN?șJ?ΙLq| +_s? +'/E`=i +X@H6!G3=pq1!N 'k[cf_YѰhH%?Iފ$/c AtP +)&C6TTT'CB#)E6s\VHFīC⦌AC%-wɅ~ɍ7ҞWWʧAe쓢GY~W>%)ȱ
dv_h2hC\&%hG+d ?dTeV(^K6U==?^Q?+镾(푿/1ߕ9sC1y5kJf +dlrUvB$ܨ}(_:<bI?{e*jd>WQ<v+4׳՝9ÅsFs+?gٳ g\Gh\Qm r_3>\R.Q>ʭ*}hXv[Ew+k;+UsΏʛGNe?ն}(=7j7y T +u^֨6F:}ZnMjpA6JsG)ίYv35zμ3t<YE5Xl +٠K<`3~
qno62F?Z`߭-PRUVzz٥"}݅Bs=E
gZ
]O'+ߕ!܃r{KԺXiVmu~A⟪K(YqdS%֒JO[]3+Pet{JLAL(Jgs&?a6hPYN.WzHCҥ+Njo5ƵG5i<TqT~o*5mYİ]vOg +TdC٨3GX1sruPh?$ot%w6\*h/<;[n<Pj}sUƽUۛvWlU]ӎMۗ:q +٬-`ϫS>Gnln6zOVGGƧtQLfm^_9P_ɩȼS_J]-(go1?gE1Nzfˊ`!!Sܦ%sYq'\H:PZCⒺK[utZUeRZyS1Am.k.Ⱦ՜O[ng=g>+ͣnqR++QӡI|ThsH⠳L%#}52l:14Zmcֲr:YaV&+#!+#w^A<'.Ib/#U05WCZc$.vwbϵ4Sk*YMm*),vr ;? E +NoD0UBeX+W|/qKfG8#~}]Qg˸/ԥS+3KsJJ:bK:be{m%M̵`<7C0K`>.ywóIYx4)p)1#g:|#zbRsy٭%)iuu٭̶ƶְɖІк2^0QT|/[d`W +6iaXQ#4L[_u68qkv8$d02ψLojig4;z:'j:+Z6n2y$n<QOxBa~Aoj`蜥W3iJUԑj¥ Aʀ*J~Ce~n2zu)"BX$B!?ܻ& +s?G"nW降2udrJ|41`nb飻vשO?T|pt3˺#/<=e +[ S79n&܂vOaqb#26ǀ#,pp +"".iVfXӾSSLifeZZn^|^ν\C<*w^ +~|.oxP7~#6WDs.b`_7wQEڀp +pQ^8~5A[0>6?G{X!ܖCZml&yB@h +d?(v4g
큏^ +5Poq1~4vHd%;7uSꢻ(PZc^Q~}I@'.Y+Gѣ1q'oF,f@-$b_aA*/!+zM_D%<,a>a>ֳKma=c=>;&n3[5K: +Cw^SFfbm +9^2W
n0+G{Sۓ44 "!.9͑q\ w_kWWW6˨O3e ?JbM DVs n6.p@]akBafG;&&A~V4{`>A;jg)Ujj}OiA`0EE 2@0srO5k
jQ&O|mV]:#tbT<NsHW*WJSԊt.uJܩ։+=Y>ѧ4_͍mf閳 v.qF_꙯]ogmӥjʦAǴLA
ݐ*SJ5<T)IHj + + +]yIOf~Z_:Td(,fB
r-0}ϛz}вs[cpɬ]aMXQPi5U[=%y%93%*l˂9^e}>gj|#Cȴ&
\4q~r#~$Th[xa6WRLeYBYW.W(e(fF*^K2%,}45%&jl~vʃ7n2?x#ѥm7կAUbTWr%Bqn:]+QUU:JӤKroTsU/Y]̷9@g[Nh:iᔻG]is7=u(`Q{K}={am"_*dZIPYhUUI
:ValWXY;(EJ!$T#U)ǎ
aUlbY,Xб8Vڊeul˨2θ*` s>_=oAjfqf٭AX:Fѳf܌VHG\,9u*LPr<gYBXᑤ-ųr~;ߐ}E^r^NAR^A퇶'oK̿5aS[7
y(uLϏУ^ ֽ&Kg/Zq>X}2.8S֗>`Q2rm-ӊ +6'M[1~r/}e?2
Ըw)5̘1ڒR=rE+埏O\{*q)sM[R:MBɒ%rJcKfŖRv}US~x"&XolG!CDN-~W:uoZzC>j5
6D2wSOOK=P>{YE1Yy+/:{fi乺őEgD0?aXF&[^fݯuwwͨȝwU6[h]oz>9hqI gTJZQfAx'מmҙeȨ '] \Ct1ԛgЭOe9OԎ`ͬ #:[S!uӂ_&?r/.~=gwp(эsDDgo=0}Oh+kNCr^yg3}4i01**qzL91Mˣ7F5l1\Rmu=,/4 dwPiuDlDf$;|Em"mR +q{2NԦibS;2t5Z͇m~h>T\GKeng`;Owv<#mb=tYgcT-Sףizu +u[-ۻ/[їտF՟'K2x\$CAwX*.UCvDV15ZrD2ļc}\ᢆL
T <<.; t
Pw'W\5+WNOT(ha
1r"c
\Oxܠvrdq\r1Uvb-Rye:,~!vD(L@fQ0!` +-e'x!'і;.8lXVm`X>nVT2P2e`/Fbd64L
)(O0t,܊+k;Xۀ3 +<VT\YQYj8 LkԖc a=Sķ]A|xĸ#Yd9C]N .ArҟVq!9!~w#nްcyZCʱi<'@n/#d:gH\!Iv8
5{.wI>*\>Pv;L[
CfP9>r.PD(|;V +Q +kw#߸G^Eއuh<C`+0*( +'S!@|}5+f}Y;m7aعI햊HR{9b9vfj7+#ɶ!vTJ3LD8V-34sgR/4] y>P9ycy1ew
f$쑤iDuiyb*aQx:kz7a=RR\ +Ev-\o^
<>{.ZdCf!#,Fdwf +,=E$A£<W ʤ<"w*?rQ`9")b,R/%3E+^q+y쇀փ猴lᤚبrRZWJXU&R6JbEU^EJ^(~+,ͤOuC,nмdfb%fzpe!ہV.s>g^rlSN*ݮU*%RY*ɴH +fMS iKGkkYP/NwA.2x@C + q##BD9} +Eez=L7_OZx͵*ӵ&JFsG6s{ns>nyܒyr&פS# 04BאGS zpo0EfΎ
ퟕ-Ko䨯$tfWX۳[\Zhq6{L&ǩ펓9UZGcnsj}ywGm| + :3Q@<3 R3^Lb*I^LU#)>*"\cot[J72MFVYzvkiv_t-{(=]yŨ-Q1TC C?V +SheR5[ swi>e05='撚"ڙӼv
Wͩs\=w[sOqu ~(⣰B>"--f5<_F#Wi=7^7-ܩ= +UB)\3%<A1LPį;bcs?jOZ<[+|P~TN1-,ɖc ,"K/!9Z(t_?+t%QbW%"Ke"V8/J +sa8GX-J2%$iǒt,?]Ng>
A$)7#|H7_f~:ev+%nk{msCs"OԤG%s(EV.dKI,M/OTUFy\!'H%c%DD6$)MsYK>~*1rS +z{㫻Nmo) +9XGqT3uܔ,H * qDy\BW;"uP>'W&DqCP2$O*#V\pFMpvYo핾֍}d|OI2Rb*LT(b*PSTs*JKy/|#&scAt -<cwc%k 0xf3sjRSQv-"rhJ5'IcdFjڒDK*/$F[! HW3 +N&JC}G}^,\@~t7Va@77]
Vpw7A=IÎd߹lNm_{P[$4ߛ<_[Lo/FOϡG<^pt}+JC߆ +)*r01k dC +H +r桘f +drd"AC<&Odab%PzϾdRz_~c2wPTK%r&5AyAW?.i,0H?\/4OhLIrHd^r bA<iB|<1Y +"1" !_KPnBC~X0r6 +7a9_ +($^| +z~d"G?lL+ݨ0e>6z4~FȻ呷M_D4m=6zk5WR[5^v;BZGԹ?mFhS2C Aɷx#b +߷%a]1g6aE}ǜ=9z+Kc/gTj/fTi6hϛiϙwkZtg,ͺ6KԄkǵf:8%QDzy4Xdy'eo>Q[k956' ?ZW'K895.=C٭˾xJ0o\h#)B +H;fp-vh9Ny<3Uzq0dnxc9s>3~t8gPӁܝMܣ);7FʞƆEcwC7|}5<Q熹J/Tu,,3Ցm.tpzʁyMK3*{{ +k
ͻXv`QtղmvjGIH +&oLt@f{.Z̢DrsX3'X91ʼng7fMeZo4k}uv:{[l_ۏ6/jl5_Oqmtq +tyTb/yuS:u3ec~X=(Cyh-qfaiۦ̵mq,ʱ<wcm^&o.co~9\A^AՔ.[?ʉNS0ͥw;bug;uc'ui:2zDrHE,MÂqus)[ʝMe3sO]PP(tUqUiuڒϝ
%KV:Λʩe&VNuE,C4D +"Z +&![ aװX ; + +Ejh]`ZNDZPЎ8ЎΌJ3Ǚ{ws?Ais*_+MZrϺ NYӉhc괌ԃeRauB)ag!ab|ფBѻB0x9BYHY +7b1M
QM}3aM!A0p9o2 +{]i}%~5551٢o;Y3iGn|E^ϩ\ +QEcc +.\8MW('O? +` +RZ_GCsP[ +P-8hhECK]ԵCzC.29Ȕj#r-dkzYqJ5zuf 﨡OWA*/k:+AzC3q\
Pa
rנNpQ[ALK٨SFMj Ϩ&,/HRChƄB -BBt2}#;*ʱfPYl`A3|{}{y~M0 +>?TCp@5x~D>SxYJ{z7nqo0h% "Ly~ :,q/s{E5X[ˀ~j
!8tPȯbk_J͞jIOHzo%=ewC>GH|FHWIw|'nnvo4*2?..@B!BO
b!Rk"4{~|_3-XNTX bu+pտX]9hz<WoZ_ ~js1˳r/ꇣk\2$ql5_ǹ=c= +]ͳg;Ĩrktx9ln}΄8F\s!Ɉi_2{&G2@Ԅ%UUV"
E3B+Ntl?cXcQ|KtyZ3ROEmq?q<ha{G_93q8#.}lp:~)UӀ8J + BWmlA~*|#҄=.6m{&K9{˦+Xs$6@;6jf3^
O%|,zvsu)PQhL ++ UEn>KŞ+<5.GELx$>us)?i꿏#=SNo:<n(e-ܗLl:O{=a7YȍuW=ox"3|吔|HDzᕆՄvBwv0y}m-Kam{a-!->Y +u2D26^l]((.;"cΎuܟ]-M%J
H
kDlG "[-͂f~f`(j\T`"^2^9^A"G&@Ye(s.n*`WLrgc:Fu&xvf&C$&QIL:AW'j ˪
E#J
vJJ 0*-1"0Y1.\7ѿv<vvTi-بik=ۭ]ݒҔY[+]Ϯ%TJ86Nt7T-I%JrRgcҀYabLn*sư(n0ĎٯjV#-;J\ +|~P]8*+#,C)I/N*J5'Kߑޛ,K?M>!/s1V B*C>[ +L6=,ưWQsͨ(sb}[,}[(J>:[CM6mgUr*Cde4('TP%M,,p + gDEw E<n<[tiT0; +;*(HAc뒨1hA# J0Ah
XcƦX\c(Hnroo{9MVjk.SZTH렬l`閹N[v}>˛;y]Ng-ںx3?ɘpv殌Ĭ4cV|cv[jbV_rb,4&eb»:ay4v +g2*,-)l)l)苊cORG6"}A] +=r52C +.*xmP"+rt)*Rm!lcv|D5YuD̐m"~ xFoQ?YZ{%S*POg W"?A4rVHQ"4c[(D^ +tW[.E_ldDB͇=b_hܗ{SylV<.[~H}@S!S-uIiQzG*EoߓvLodW}Qv<tUQ/Ɖ1QA^W~-z_بcآmءXxP>?diPgīj9 +c:7Q%sRU.ܡ4)(JҤZFeEyfV>UHLڐ $g { +{ml
UּfUWuiVw2YS:Evzmm#ʹ?d@p%@p +m\{$T-.юsBuq~JFAܟEy9E6rNԃGȹ7!ALZ&̡1xVl7w943>U^P (/X":cݤ4K7'IO.S +>CwͿ҄2hFFZ@fwjajF뱸A_VUbJA./UH˛C32RaI"XM* +ȕT@3?C]Ps?v +UC@\PYQW*ZAyO99Ϲ'y~~r?/XFgyNO1Q'L03S+byT)e6c3;`=sses%9;dsysMPgaչ?`J*mK_iux^eu@*Jr +!c,nޜ@q`|';S]wkĮXM +V]$Qvȟ]a\=ad] 1h4"}>4@^@οLr S 1Y}'iyFiH,2(' +B aIB[ D +)18vNdǾm9+lIyQ+$ρtbrwZ~`g2C +nօ [BZf>jp4Ax&T+>+.4" +|)TiLA)ߟ^7 eIBZ2B22µ
4MF6c:c$*TDeƵHUHUM$PS\ s;;kT +q#H[(b.YQs :*TD+b[VfPuլU:EeaFyNbY(-͗2'/9Q~?Kr%#̖Q92n&s>{Gj jz5K;j"wjqʓ}Kӂ +=(%)(DLyk|?>M~8^(:.E>O7FX@0 +HS]9T AG״7:(Vtz
˩VQ裬L+2vY%9iJe\bg@'*OJ& %/bKޱIJ"ToNzx3/.cat5̦Jq)O,%5TQUvR*&ԼxU#/NˉS'bx,9#*f%M.\C:ps`ų{)uu]!*wEٗk6J[d7 xMQxF&WhFqt9c-^c
x'6 +~'y C +MU^FU7I6S xӌ<om*wie*~tvkr+ϙ&3fƖlj>3k:˒
>Z MuyG=V\u d'`O,aC{p\y\QHG=>I'yOrzZ `p=߃ݓ 3SG)~ +@5SA6; + +(( +"u[?ā{oV⠊ZqTwҞr8シ{)e;=V +ʭ픹yKpmT3zJ~!ONІhk/A%X!7J~bՐS )`e0L; +-7pLRtZJ2[1:Vh.F8'ɼ7t+DLv$TZj2OG +桴i k1e4=[FGd$
| H%&W^!)F`{蕳VdFs9<}k'VK1ru
F|;|vvipod껵z/{"'rϓs_C(FX|)a=w> +c/gkwIFߙ9qnpWrWpTq^ +<x{>L=ɠcAp +v1xhR^2N['%8Xp70F}aтkYaaφ/((X/:UtTOT8*>">-ޯxjO^GH";; pʏƳwjaZ]YMQQ}{
mNζ>j]c}H@bژ256d7fnAj9Fv[ToThWBM@<)ce;/HA\VJ%PoR?.{y;;Ŏ+d[5͚*>&
Nh8Ӵ;ՠl?+`E=K +ϵuY^+uVy{/Uxy/MYxgq⏾Eϼ>xЃt#PE=^z\&iLv#-b6.k
IL+,etR}RTbE +UO[ֿZyzuxJ=hN;hk{K>H=m)aT6kWx1,0GabÌE=V66T2a6lQ4ûc '~>>E;'e_WL13hHÎtL]UteFV2AaA9w<9Y3ӍƊ\IQף?Gf߄eŞGg +@:4P.wcղ.W+sͼ }d&zLHf9vt2-%Oeb|ez@=R6[6[YΪZnd=܂HTC=\{Xǿ{ڵ*2)R)$]uHiJdKmM)#HrefJ3gʐNf$sa<A?>ϳ]ou:k!]l^]h.C%Yʂy*̨͉?gVD3RRB>IJL^6!8dMMau䫣S:ƥ"R[p}5,}( +
PH5Z,}"eYۉKǖNpxȒ^%^a%JʇJ]R55H2sճ_ѿ`ZH.3bH];Hf<2$q2aUTؕ}Vw _1yJ7PMk&`|@Fqip +Դ:,owr/N~ݸ5xsXpp5z`F{6$|I[0ilfMAʘᖑbTq}B8iSj3yhmYvĺv[5]v+E?r=za;@N@MWW-GB
v S60lW2xWy`U_>Uze]m]Uf9jWUٰCwc[bw*e
x
啴fjL} DbT-B\0SW#
VxՎ6ZoY;ģv,unu
]kw=n0R8F+?Ǿn-,S}H&j:(0k?lG#$d.(=g]nI7[˓:K?mKz%v'#!Fz~-p;8vH*z<8̤wq 8
8 A +6DfGX7ê-a0o$(/΅B(ZVðe7-ϠN@ucݷsܕtZ7;x4.̀% +`|C +[FݲV?n<@.7»۸}GS-zֻGJ?sg|kL +:>Ebw6靷Tӿc_^НqJ@y/Jum^N/3sbg7ϑK_pO ߲{1f͓9#p瘝v?f>$u'w&;Ă8/L)F+ּED_HP`@@L`T`D@E"fi+ G:tJ?R{1;Л98*<H'\o%tjd
*ǘH=~F'|B:nR[sk'dYi"Yg>`UOw0~
dhw%NٟI'*aL005R#!g7sP180Y3%ϑIoEt-GؕZo~IC3pwf~{&\a$ +aT3;CaP1 =NL<li>UBO9+-ng\5I#%=Vm\@%γX&c!9ka02{\[;ngf~&q&I{TQqS"\Ur%
l;Zkp-dلַ8m%9i'i7{tF5ueq\H!IDH <HH $\LH0;1;"*TԂJe`0ejkGl5:vf:egvZl?ʇ:~sw7BPID=
͍ןGk差WnYC=zi@yѧޭOvۧ{[n@V)Ku:B}-^X.^ 6APHYl%{AxBem_bi nyr-t#t=EZf$-1HטEIU,22yJ|-Y?Z!g,zzVЫ(qwYL*v7$m&Z WY/EZ/FZ_^losmso39ϙN۞^.Nsn=ܗvǸo즸$; ,HV4oR?rѝh/cy16$~1bgcg='cDž' w.:;Mv4*iX@qhYG0 t?"ZKpCK1vN$v8'Ju}H|BT|Llp97p\Fœ;FgwwWw}}"-. "2Z(/Aw)hA`q>%Tp29y*I$m\s{WR>"t%.CC%cf)^ɊWsN3zK$!6 BV<'We8t4IVG\FSS݇RpYwLcɪ|{d2_ϯC6.;F1f)mkV]Z)IoFx7J
@{}wJ S\q.d٢:fF2ғ͊=>=iJJW!/Mڀ6yK@3Y>(? W['j*9A +)Q*Qa(@ `AdBt} +-!(ZN}A{u^_NA/*YtzVS1F5&JSj25<\K|;'Cs8!@ϠA~Rq +u~#kVQ%v)HԗiҌb/r<yA%?R˓EKgq +s$H*),`'|qyV +yvL#tx|P
{=E{'<PMd<k.&,KH=,* +EIPN:EEA$,`Da0R1֥EDZ.SNvSy>swsowK Z8S$^Y~=V*˪u̳1'f}N~W_NWQ>d߅B`BڀEbO*(q\ǥwE6=6B>6Qo}n-reFۊt]k] +j:|ʿ'\# WK%kībJ^U,^^eE\e'twW{T]I(NTOTyr=M`/P٫R*oB+Xo9e +`.}SJUj~stD;G4B&8,R# A9;X_G.[h2~Kjd7<\@tA +$;k@zOo~ +s d>#ȚYsfZ]T\wH~"%w}
x +PG2괂ӪxslSO3N0<' {kWq&2N56?cuWYLSaPfEzNq}OjSwԥ#9mKrfQ{ΣM*lNٔMc8YNWGvqn:1CUYsmie\aa;-&9%nmi9-bIҊ5^bwXFܳJ<Ոp+g|JSRV*a/"g1y(D3'c-X->E鶼V[vBfi63S!q5r^ַB[&SIa~䊿B2|WHy<<@
܁s3'ڌIp!%hW'wEX6%8˓ݪs9ܲ|_T/jҭA +i_P`\z"8Gz)8[ypy`-?[EGo!Uf`ⱻ̒zݨHWfޢn(.HrUyR"*zAL'ȒmHe Mv<
N H1|=j[uȃyh$:o + +RAF~MXz~[XZ~OXb04E10CO g9z
S-5Ўu7
tZM 5U16*MCae{nywviD(V*)%U$e`r_P9JP +W~__/;ϗm}3D`=#ځ|K&kjh&*mԲuI5b*'jMP9(AoLjn6|SÍ)śU=At硓kykovhT&[k"t44fp6iem/A٠ݻ*F{;Z{Ɏ>\WYǰ#k"seE- =D-D.#RuSq)YKӷ/O"rnNwxlcth]gcn:QH9k;Eyu+¸.rg63AcG==;#c~RQV/+/D3"iG҄屽ѽYz"{*hv8Dۯ9"]Xa +_مt2+;E>Ely$cD[@,sЈC+(eCICp(}V#2mmlBl[C,
8bwjI,wl,cyfPោΣ}0`ī1>ǍZP̨#EzSh +btqh`Dh<f8"QZԚGtf#}aSIUß{Ϧ{?cU|#>JgiP~GQނ琟ޟxpWmd0bFJeNO<0+cE'AwU$R"JÈDSD~07&g-9CZaXO
dkȠe2Ta3Y'd2}͑d2L&s bp1 }mvu +1?}%w3m"?Y}7'zhfĝ#)g +]N/{߀)x^`-?cPA~~BL^Amx
A^X2j +( "EAVDZ]QKu]u;Yu۩[ֵov|@&<.|I *4v` {:G1>{= +hKj:zAzCo +:k2F'}\L0GmS1?B9/_`5qXgb^`;SKzv(G7(7Ri,.kE}lBg,7GVtjE'qq:j;IGlШWt^02o`];1/p=qっǞGw-f#IE4ᢦt@MtңtLPOG=::IzCAwzϟie9; +W0ۋ11Ϩ̂.s皿/[Ȣ6;e)2Md&+Y'im5ۮmm5ʆVˎحMn;ʾvh_wڟb;2}G;i{E1ۼ+rՆVyC<a<ӱI /u\-q\)ot9{CUQ.eG.%u.^:Uh%si\yٮv-1LzY[<ܮiұ!JRRXZvVU**V(V+Z]%~"~A _qӤ W#7unox-tϧ;= +hk*B,(S%JgīPY㕯l6);|rU[}#q_AA;]zO Kge]g3Q/1톗>J$ojNsTF8kn1<MO&7GSY១Y`Դkz4Á)1a0I}?0I?Iլ>{1됃Y>=xA>6SK5ɴ*<(WSZ7h
˵&a,(E['j{D ]xQQvR
ϧX-~S|uS9r yi5rJF!SmxW<̢(5Δ钩W &$uiAlNW,Ոcukt1!ZwX$V>Qt0:
S:\3F'1sF
w k>ۑs<{(=sSB,CSzR`mrX/U+BɝKwD&_YWђo_#l`d:\Bh?~ +J)42KgK)E N*ug)1 27]k +rLNp49G *ej0.5CD0 b* y,SAvt5P#wUk/ϙ~=|3)9{b+.sBJGliULu-}FDU +Υy=_P*E +]@tzc +jנ}=xlDGv{P{6(vyC'WWP\R%Jt^s'7ʻ +,w}m^^h E 0N>%T B{BY@P!$| KvTH +{%6v6U]Y_M[_a3~G1hrE]ZTKs5}q$3$$*p$H p$r 3J +U[vnw1n;q:|Cb朴yPZ˜60{SN椬咍eXdYc3Uaُ<eg>^{b8B?DKLz-Y@a9+Og k\^On7zۼASWz)}z|w}O:_/I~ɳ^˲=6rr<-33qt{Z2wXY;,PV+w*mϿS9Ʊ+g8{9ʥV孀f_MFۘh1GEh9nz[1t\Y[<F5W|35zCUЩvj{U6U+U෨ͪ&Ցչ:Ս `v܁21TgT4Z#cZM.F9s9)>]ٙYZ^ߢ16kLAMKp9^[3 h͙j[a&̓JVW@N
z]sDŽE970z +X|w>cix9,VkVa'ܤiOJW%E߁e@*G
o<{^ٍy32YH=(lh+Nj.L/YA|ADX7q&1"EHDdrdH7KNXs@*E7Z3(bB\C"j]\.+M5fp*tbCPY`h7tD
ha*:p<Zkm1 +|)N)p +ܢU`~h5c=!.},fs:Y[%LWe9Q3VG룳볌Dx,*t9RUNdF铈t?%%8%c_B@j+ja/j̵aZ=BuTkQeIbצdfm:Oc*gLjLSkarEWU-UwE;~b<<pE +qX@>&Zl$IN |x^8?`E
1x)5X{#gבsDB..3c9 +m !YA7q +6oАߗ4F{a-& +qAPUq츔:h:Q8uZe7 =?w}D/ +c8+FNκGN.]Ht%.'
l@7&בk%pwuwm%M<g!#D B8?EE# +2F/s,83!B1;: +wOsΎȫp2p +VGs0xi+Oh'V:oH +g0 5rF?9 +sBጆ/ ɀ'bT[9<̃xڑp³ +W/oD'\=p-ُom}<c0k8C1 Ml`W= +Z-^Y#Rl)u{KwR!T:|Q%)YV<b[GtGi5@n3
(FҖa֍њ1fcG+|ho9-[IKΧαMA~淞ZvPj?Yz<89>h6hQ3>5YHtds9m%Yjns`wa`+wArnCP>ho~>^m炪@VP9̜ +OE3Tr$щXA0`ס5ɊŴD3is[4/Ԅ;4hu6* U犪DsEjYFrMcǩTѩD۹XsԹPsC\y,~X;vCPnOFn^cn%Q[&4DL׆G:VjNYTrmTqvD[RRȥ@嚯]alU,W07\u4~8u`C?
9@]Mϣzo˩*u +gE;EK1Z +|=)ej<r&I6Ty3iATW +gVzعMtpfcnq,fQAsMiNxnQ0=&Ա0:R7=rtVI.3S7+CWmWz)dR~,Q@Q/;WSWf݁8q5 %')(f"ٱ:cfHJ5I)2HdH0)⍋qU +qhܯ1WWVpup4qB"GUDeV9X9xYaζHxbN0[,e\i4*c̭hsRgeØς +&ci9oj0 +#toaafASO1ݙ?gBqy~y~)yK|+ޑ'1wB~W|iS\eǯ{u]q'-UR\u2b8TӊGjjqaT,X3%YJ<`3[yY*{r.z8qԟ{,txF8LNJaźVXÆ*fVJijLSJ54@K)4F)wJ]S⬳cXk1ƺ8Z6Z6Z:ºe]"V2DhVc2SF/TӏR&f%]]sM76lcTmmehmnc3DrCmE0jVjHe*(`/\k)aXpqz?XfXM#kfKa4C|v/ۃjT=Vd')>C5Ⱦ@iz
m{M6.P{zws;̶&Eje6ߌ{$(Iޭ&yɣ%R2&˵Nbs-4Z3D2Me#p!ow-mR!3@P*0f[Gro7"bp\NoiWhlmlv>we&6bhU]vofm^i9ZvHЄ}R3Rd%"]~6!.Ciѷ/`=\<zCCYc<߲?_wQO,) +3'wL +bK1xN",Daj?(c.ray5B}@Nj4q -s΄;
zvJgpCч1oҮo؟kҏ,$q88zY^x^O<k +t9ctW^Go_1|'#\rA%5|2h,E90(":IoQFXzMͬK/1"8D<;;@ފ|i09Gp9͆ C.9CQU +\AGݦgաNӬqS~R;=hw]>SMjqZ/8dyN!gUk +Xh_l翷SZf: S[N;@c_=oEMCFM9#Xڧd&EP +a-zt;=i-En1tpX]N3ٍWU~S5m+'}ocsQ3ҭuū#]{LNj3= m.VU}֪n`T;pj|;UwXNj_SeChS}(Fm~+#ח9rWmj 38~T]m +QMH6.QuhևVU:kڰ,VҡWr +S? c9-l
WCdꆧv4mq6De*jlQ"*Wk +T>rh&3~#V$I$ ApI +j&a=Vhq\l< j4&ϋ덷%u%'E2/ʑ*{5T5,(tLAn<$`J/Hedq,yM4ZnqZl4H΄z@f<)KY%Vo&U?M5`i ѻ۵9XͰ1 1g_Naվ,Z6JlJk55$=ڶMViU=#r
&[ +c[ieF"} q:B(tTQk:Mz^CI&9U +{kWmrGXYR{/'Nv_O.r|\x,t]YhgEE +ŽݩLn&"R%+sV(g٥".U%u*u5z_irFir
`E|ޅvxl:-hRzUY*20ʼROQy6O٪x̞d2;0xߓz-Uf9GnA_F0n{1g!hQM[GuZ=U',J%V_)L24L?(O'e$&ff$eT12@?7Qc~%h=6h7sۤ w**kJe6ep-P MRcCURnCCRNC();ПĤY$#pE1c.H^Da3#Mcj{[/lCoz(LCK/ .U%Pqh9C)diY`6'?hڊ9m.RV/h7DP< <)HkOm{{W<͖ofFĈxyz8y^\w@=F1xO氒ëNp&K6r2Vp)O7iV^j|xt^}뗬՝x[W- +FЛ^@=":E`г6AG(#tu@ilJX-gk-50kUd22A+"Ҳt=R
}CK=ez6_pOC86o݃zJƉ11ڱz,VŴ\,V +hY*IPrl+)bQHұ$9G;$9 Dă]<8fycؑP!01yfh2M.'d +%LjI<KI 'ʈ?'d+' ߇Fp1~'(\]x^#M9o5qҗ-HqXa~88hq4V +n>fw=T$Oqtaw ]n@ =ݓ=@>F +༂!^t ZSQuCp5i:<\œ|P +fxz2h3'6qi#<4z7Sz+GG[Y.<IDi[>v)KmL\߸N;f?Ɓ]0%3i46hc~&9wV?3V=SJݓiFZ>y-ὑڼwP[xIjr}>#_^ĕ~;xrs_4fYxQM2x֏L
biմ$f.LZKK}]WLm~eį5SvZ8}%->@MӷQ5/PM]x© +`9U," +92);sǖKMV8Ś*[,$Z܊kBcmPL
cmC24vMeAe`t9
bxNݰE[я\X n|.eN"[/e9W5:bzGHgO$3j{,_e*G4+r('Ꭻ0_Y@;Џ}50V#ĒpIJFһ8:N(֙&V9%N$(]uqG,ur>23""Q\q սU*8ʀ #2( .ȦR%BdQc +Ԙi$5165*&j=`=was}}L3n9%{vw}VSK[`
x/s~*.f0E#C##_rcqm6;28M=[B{wAsn:~kww8FW=[sϠ&eeIIR,%r4sz⦁_EX[},,aFe12b3Y,CgPzuK|[w
&<2$My +Tu[5V>օf5_V#o5:\ۢ'd7!52 r-X 'z4"K_?|l]eWIz6TrM-F.yrі+cv mXZ,eܑ˰Įج +Rꑟ؊"znd!Ct,(/d(` +(|8#Kyʕ\t +@-Q-+H9~xzK(^\`+e(e(.oi<h,hQ=a +MVΡpg6jD~ +CxXDXPYGє3H.!jx8B.WTlxdx$J +;De]f*%N:WnEZ1]96e+˵DTNGe_U=x؟`L#:&z2*rZPwPP:Q9^/+kf)ˬJ^,wҼW)էH|*٧V&-P5k~{JfW|r
!#->JT*ߠվo2+ORZ(%`-\AEhnPOiv%5 +gcX&]χqs>9]&F(P-9JI J4Ei)ZM*4WDܰ4C\0;|aV&*ÌCƘ8D쎭x8=jŊӺ2n;#HekY6]Є&4M($mJi)4Ȗ*[,@Uѩɢ"2:0(BuX93z
2B0y{S,Nnb:$ь2-#Cɰ*"fb٣55栲\oVˌ(+3Uc3TŪժҬ%Y;6Q_vfFڔRkDV[cU)rdKL lEbSWUZ +K:d)UY415ܹ@QUbko}AWd=^
{s~?/blx_7<p-F<QO^"N2ST\UY^zL[+Qyb[of/{MIae?4lD;2jZO-U":蘋i8gTI3MQVv#]ZPW({eBxC3bt;3w.0:]+ogvF!yјf9&[~<`;´j|!:fW2GALwKNw)`iXA^0ߔYayhl3zr<9_?G$L9 1xoƒ<I$Z@}X:Zұ+,ž
/]Q೨F5"(`+kZTkf-y2CEߪQ?M}K/ɐM5b|a +8{u=HBh
$IAg [9,\h.wh}N Lg]Fp6=جIn S +T\ФQZЧLño{}Tz%
Q2bP3UC(y!"7dUr\^kB5!iz`UjZՀʾ)ˮK1 މoY #`111CM\Mb %~NparPدL
*~)s)Ջ}kw/2JPn9@4q㣈-*zKj]3KUR"NI-#A$EfIH\EVuӤieRPE?b[$y#zB1|cѓ5H#,IA=%ݢ6uKhtC^tfrNQL;"ʩrW纨''d'[}[Ѹ\KEՠmħ'3!$X_Ɔ:fU!^b$y.e9x9xx{ +&%th~JJ4DOb'}Pzq87g:\Xq68E +<*'PϒS?{MwqxhQvg^pY~RxS'___>n4n]bqs}6<l3^np\!ap` +R<"6::K\J
?C)B#a9]ݰcmhpSeci$!$s88N'8'&Ĺ P@^a@9KP2ڵkv0UeSZm!M:umS?&g{~_Dɴ6IfJ1D1nLiVzq1\+|e%~@>1Mq(0UZ/+a).4=<?h1bLtmċq ;1YBOE'ii1?aŦA3% %@sM&b1Xq<N'Ѱ8p<}1R{{=X>}?[*zX +\C,mA|FX ĩ>^N98MN=yd^fFew?hdH>&qԟD\G-[21xj5qL:G!bkQ$vz;Ǚ&czwX,b@~O6 +m#/wb.xsBh"6덿댟Jo\M5h9K?p=M9ʑcNL:?g ].T:ItM+!cM[:Ӭ.*,//zC2} ;MSg84uE۸ku09n(L3c<-*ciNCـIKf1zG3nK\cT[&jiݣTZ)KzK-\Y,,̬ޡ_#59~g)"!\D--d4ٲu6XSZ&Jj[RekV+m],v&fZ-QKUulZlD-.JWl"Krz#j/kׁ)}?WXG
VFG]ejBHt:J%!;JcjЕT묕#:sܭ9JJ}%%+]CUho;=K۫ WrL*줽jT\vҕ +WP沊rr)G-vE5+USͰZޠw*y}N6_r?KY/嚚Uޠop~c!~c3W +baQɃc=eS-x<O6zz!8%e7E}Y1!'BBZRjiu] +qcNP(;\Gi +[` +SՉYfQ3}ְ:#>仉D]$ ͟ ^MoҤWiĿ0d}*cs\Fȥv*5w0v-+ ]z[@)&$@-!ֿ1X_wDwK5aI&ܤpb#r23
_Ϝ /?VyVK!X@iH >`²
*<#*@dp[B R r?~G
X/lfNld2CZ4@._K.6r56#"J@d(BFBf +!7]ӔcT.-%>:=Üż>o$@ +?ϵ{s}Yoz/1yہ]QQW}ஸ@Fdf%숀QDA\qjDtbpE+1ĚQQS۴6Mml&i1'<|}>~)P,. +"68Nzp +,B\/Czr?bAHM.q/\x(-𭃫Jx8,X>.g9p\C-Nw-Vsvoܦ?=].w.*3N|Qx\1D +R>p#(5-EHҫGx-ЗR.z[~DHChݧR*Od&p|)Q҅;o((HB~N e kup
|oF"U_u2X&uD=D9}ǏOP?P^~⼏μ%o.H$}No?Qo |Abp&a{|v?nnn0~!MplL)We;E u~A9i%7/01ȥĤ_^I<)" /$RyWfUṗc1XDތ^Zǥ(Y165ycy&#<VZ~Xc؞AU؟ep +G&90e#~4G#~.d5p*©iTRNR]XpdĿõwz+Jh.-bhx%;<E)D_l³kdٯ@ˉC=f3u3%FPo- +k!FSTf58VK% 3tttk*Ӯ~n\F!֏W,WVVf5> +qS0R1|%Y*i2G'UW+_*eF2ޣJz,=Ȏ).tOܐdR')}/3ϰjw e,->en@12E%e}ejl)7AJHR<B +TK?Q{%ϷS^%>Aπ?ItA4e[E6֓:곀uҷiCtH⡉R44U +2e_L(vb_.y$:yidZddސL2VH2tπSUb?Ϻ|n6r +ʚ:ud0)
ÆKA@>,$ox<,A$+hd/I"cBkFդ\$|I~$; rX">ֿԁutd^Wô2)dCt*Qrha)9b&#,GI^I __J](#?Wjw02ki Kmg%ߔ^]+|(7ҳy刡2."P2#%=(c"4I4eTx%9ʮ$^U
3UKBJMޤGQcOk1ShdpjMQN/ךuCvVO־Hh2?G>~dXI)TM$cj(S:2&S5Ej\l6&n}ԨjD{>U/>$'(`&!Z§%QSN2-ZII'6$Ē&lVbj9C5F,,ejeaYMjUa=ZUS-_fIEV%#hD,dŏ +jSMH|Rd3hm([(rߑKCbxԓU +A\Aŵ(-56D<Ɠjb2&1iDMNMV63eĎKt7y@l(|HJ~C_vC!!xCaqBu9r9EḷUw,.[/8I"52"]C5(&DW Nj8oh2M2IeO*1%-WhRz%5($鰂.*(㻜&t9 MD!5x.q4je16Y1)S}/5Z}R+<uR+Ԕ^f(T@R6N~CI}Sީ7&v/o<z.ӗ`Ru̝KO835{(P#<PAa +4Y=.ߌyg3\喱U9ߐsrI%)6KGo\HO AjpGU^{s+[ynqŖ +,K-e,rLed)U +z6I +.r[N,,erA++l: +!q|ԫpmeF=l,<ԃ9=BV +I@v䀍EԆ6B[/ȉF,l =8z»C C=oeYx/w2۞6ѺSu,&\
E'u>[Vrv5UJf'j$E`&80Á/@*tfUd7̒Lm''(w3y{mZ[K.VY<qR 8xG8 +bǍp$s~-2s9{6gЪ%_ +uoӫ +G?H! SD^;9`[p(m{[mU/o0\)ر4QNh Z
i-@U
ok
ӊmx_ 51D7S?
/YӉz<S +2ήR5_X<YWK%ݲ.[
/mF_qo!pF@x3O8Ҩ,<Oȇ%$+btN>'i1] +/Us0}
urO|ã4_?OcR(>ʴ +&HlIxUD`d.ׂuaBܣ\w-\K͓;^'qZbHZH},cRs|љT*.ȡoG;YN2J=gy1_͊֕T_,\CaOF2e+óA6cǕihSNwRkY֯X}є[blVŞ*qBwe\ihpgeqi1]yXY,gҽ5ɫI&cJjDJ:3\\{є
Hbk, ;@پ7\~cT{LT&g?KEX*%*!hi|PA_@]:ur<y`nJYkev +(Q"FXZ`V.d= +3h#6U}1ֳDM5F$fL2&'ZL2]g;3w}އhRUVҡv8@EN+?R#j\%60V9a>+/ك{{Pq{/`p;b_AW0_tT3MB3QRaHCR5<ԡ
+VvX'^̈:#+ݲJJa I8c"wS/vfac| /g1-kȾ*K,ʱ*˒(G]9Gc +#5z3Hi6l+؍F\lOSLL)6Hx<)guEHltLAG9Zl3kV_٭QJ+ŚaFR\a/56ք9Fш-7lo>#v]QSx|Gk~]{*G_"QJ2jq${)-qR![UII&gyFLrRnDTYFDB#,mA洷zRzJo +J8̚s"8s125h{5)V>}g*=T1hEmd+"#ie!2g*ȱ@
uc|'4$|3o/k1tQpnmM'R+l!9X&^I9l_EdМxsRB䎕hHsi@^Wܿ;{
Ⱦ'c?<oco-YWei4Z dzRA +*P@AbW!\8BPX!WT/YF} +wTD77Gyoe&l*hAK5Ur5=K`B+AqRgp˙y8]2&W_F'f{7er,Eyخh +pTqWqTQ̕l1N&%L"SH]KV-AR lHM_bd8̲L\\ԐrQ[Cy3=MN_TM Mez^Lݬw+^lha^@^밅S2-їBn,êyIhbo xzz.$h:6x[|YuulYFOlXM_b~rRg^=b}hf.EC"{h&4^3DR!XKuX=k3#:8QJIh +_!
@O6J>Zrt,gOZ9LZE+~,#-[CG&O&i>F%-Z'(>/X8< +y`'mXA bكql'';wEfOpؽIӿI;O6Ky<LX]y4 +Vw:Iyn v#Jx5NuJiq|?G;vp +^
dMAEdx'(цĮ"3ĮmҾ
p4±V*7plo/>Ul]л~ Vg%߅=(W<ipd +'pXAG2A7@AkEW>tȮ#\ƐCaF?U"8N!* IZ7PRW+?Qer-Rn~D*G)eG^Wf#~'{ʈx9}\<`.y\Dz!x
?F{UQ%Z%OrDYe;)WtrW)'RΘz9b*+v2e7M*tR)kWrgJ6}%ksYcq_$yYC.2[Yr;gܦpLZaiJQv|]\\ts6+%al}JL(,weS7Zn+`N3|o}u <UeE: +Ea' +O3Wa9LM`4H1')%dʜ,L6fg*&ۥhG"p4*٦PnRPΔPK*0{N0#OƷ1YWI;7.E͉O} +Rtn"]&E+,/GK +W +pݭ\FnS$?gۘǰvը^piBW' $0{bߓ*?C+-['vayE,k^/܃ +78<I] +!>wn
U4|b'ZR,(-*H(rU2\ʷczIXp/aJC]G#6k:#s6Me
$YiZv;ObV555I"YQ ;Vߥ5O.wk>8@064@oໍp7%f;ߍ~dlf43liM4&Ip=aiT=:c~{wXÎ i` +s |.с/pvHFѷ8C[kmRz܈mzK,'G0I=|jҩ.4Ҽ2{xI!1EEwA|'܁"~ǂ
78?ӅCp T'Пxd}q\Jq +' +~ooĈg6D~ +Gq1?C0xqD`_Sc0=)dA|>Ai}[̨7~s`xa7a/GN!c2EL3)i:Ń'/COћ(WRlNS|˫WF|1Kg^e,1HDR_$3G<N,!Uzx݂UcX*\$0ۥOj]ȍ;].˃ӫBS;ƙ}َüX!9pcbL2rga)>H{D2 +c_,/u +2Ct~W/dGCس>qbK_ +n,%8S*il23AaRxjkn'SIt$<G]֠<YIYk&oqDL\6rRdԀUx&e",B1N
LvLjh\XGv8ݑ\+-Rz&Xy` +F5ȷxsi sMfGqprTL3\][Y{᳚QVՅ^rIMC|f`eGEM&jUǧZި!+UTM*f=1KŴ;9J9K-Nq}rDVekby4ԫ5$@~aجĖElT7\~#RyG# +lSKņn
7Ra ++pR/*pMA(_Qu(+:,sS"{S;>i7&8BUA&U',$]#BrtH(Vq*a3+e,q2"N)-o(#UT3&VpY*5ڴQFVѬe*T1^d9"3BFdVveL-.մ\)MJ6SRIc>tK +?1~i@2TfI&ghlfS%I)IJNU-9y.S\Ŧ.UtFE1S&cwLω }h
<Wr-A.΅4H=ҩNNmJ)#լUiيKsȔ>B1ިȌ6msnQh
R*(cg|!:Fur3w_[zjSANLƜ=DqYQJPtv"3e+^0{Bs*$UAd]eeQaaK%z?;![Z9ѳ+axK9iK=\ʩ[9Icn#Ђ +)P#OGn;WX8-b.ZBV؇8ckɿ#Ӥ<K;\Z:\rLN] +) S`iK^'d4FwTN~.t[\\gŷu~0&(n>{.5N
\Y}XWqѸS5m%MS9ϼ䆼'0ywe/gK(}%s{ +In=|6M5*(Yqk"'!GhL}ACK1u4UAnpf0 +aP>N +V.(jUmlScS趱m665kjulݮiibɆ<<{}{>xsO'I*ޯ2{*~G!1/9cNc;:
h /E=SO<![Lk?G
'A!s%z:(!:] ++7X};؆6t1xQ\6Jp8DdznPW|~KASb.9z1w/>Xttsuqw+Wڅ;ORx&}_i +13MF]Șk!:Q/H/HLS#'lc-('sٽkrw.<.%'X#%|Y&>^V?o7q?+?6p>%;-&?3EIs߱Y|F
'l!S,>bq}>`%/.W8x|
d%3|1bk.<YOح{lSWhVﰁ-tLAAb\y`I6I\F/@WpvkwW*E-f96+9G56f-aʙ](qp)ttCzMl$'<?:#|1%ÓDvK[ح"ErJ6bhDzG%!n^'#0Qu7!c$<v8fbs)Bl`s,
}4^b:SO +4\b`:?8x,kmngǪ$77at!i)K[/E<YExn'ssrM=+k14;8Uۉݑ&XELk*~_$Lp%5.y||fd2+.NNit4rg;ʕSF~pkf#>b$`\[J+,f×"J~
f2'9"9nYƭaF%h5080_'ݕl`4-ZnJwOR{fyd*#OIJ4+P)K1^z*kLS>,^[=YVH=n/N-kWɛfҼdofX5.O5[(_V)¿V)sL? +:ǘug\`=b=n[JȗM92$觘&Y+:ЦDE*<h*4d!+bڠ ;o9ߔ麌gNqSp0vbuE_5c2rO8"ḱ +3OS(e +MQH+0l-+N>;bD1"US,w5iZص8"+*I'Y"aR`d"c$sm-BZybc~1Yy[R
s}k@-[ѲV_|;#%]FcgWMDyƧݞ#7;δc2;d:C/FgzG{yb_7z'h)B|̢vb3>1&sFܒح)d(eC2IuLndn*i}c=3
6.Ѳ +-%Z29Z:" |bpp8hu$Ee0f +I 1*(K,A6AEUEDDTDaPZwetڎ3utNt*N;M?!ϩ:swFu
Kp麈 2\ʦj#[Ʀ)c1]zVifG(Z!Lj':fMjNKj9R8J˕E%AɌK¥;I=&D'&*O[5Ǭ0g+#֬ғbrseUx:[\sDHtUrQ%U*4=1M3M@[u<Lt6hMkq0B+5i.JV(15bNpT +7kYΈ/MMWnej7:#7НoW2ߗX,/]IZm5ps5<nX?Ȝ.ftᴈA_.0E4n ڶj
bEG +J\Sɑ8ߍ5XJ]VjʌjZaˁ-3PK(%F
vhڢL#|k~1;Чc*HFhF3q\hl2(הzS(ŷ.ߋo '
x4wf5zs&kp^뉺QDϸBq$zoǃg^?j$JSfgGwu>`k}jvw5~w-3xqch%ۢI4'Llx"Of؎qqTo3 }qBOpS_;br{kC[]rͤ="[f\`.oow=C}ʜrV:Dw47/T﹄8$~EcHOr@'
۱oi7
{
W}r|R_'Q/_ŧў +8~K M3CQcyx!/:^e~O 'xAJcxGg!ESÿ]gM;AJHM|s^OO''4r_em/OxH40?K`'NO
^q/%kIgcL3ׄǣ\^<wZsz8{C>U#Ӷp>-\_ȷVn9mkq9 M^5yۅCxe9vޮǣN]ƪآ7ɓ`Q&M5|zĝ+x&Fo/+rPwܯ&uV<fQO7dU0fF/mqOoղRC5`/Mum&,x}Ty +'AOR5,~gG˖<E9`
5$.5/Gf'+b{*NNAhdn$5]BPV``v|XEz:rPu&|Q'sNn5}߮yWJ-IŤ\9AM!MEfe7x=ΆU kO>9}Ul= ԗ8mKLdӱYqnS^k=$Z-w.""7dXR*L9́^ >PkorN^I#?>u1d7_,6q7w.@N%Ƒ#ȑtJR.'z+^ɥQ7ڗEQaDwy)"'薺$EVZ]d6Gc1d~,{زȋƑB/(e/lEiFZgE^gENs[Aixtθ422YՑH6:t4Er#)뗑Q2Mrngo!Ǘu=~3f~7B9gvr#';-"K^ddD~H64RsD)H5]Dy.Ku'zz9y샿k\̢x]&.d.aEizUꑡrr~\{DznfuE'(,洐Y-dz:mzotdS-<!~Krְfr2RRN2PQbSP%ȕhR*jK^Y/,ZB!xw®gMkYb7l%fd\22[,'9x2XQ5 !iXJPB"DB,Q_RY$iRboe j0-RN;MZKZK"{K-9Ǚ{B?{>tCK
ōqv#(;;ڋ,+-H[0)ǷrCKoᲞ]v?uC_a +2(a=ը7tpҘCUэٕՕǥ@hpV$?!SP^B^bj~%b .f4R7OtI*[w|זܗa9 c-}.zEo#cK6r'r` f Kewny]T,b
⛩CgL@'@]o
6&R%4(9.͍Me +.V+ +% %ca!F1
&$dI\F*t,|HBrIj{d#hɗ|3㒝IzK`肤GQ1$ݒ,ݕ4=|T^{f^dP䫂 +(̖-kʤ)pfC5cV%(^F͚N ygԩ2]bdJR$+T2bLV ~#FED0)&6.>a9)R3s-ygUkֽGjJR!)dV$Q&q(^Hv\BW⟈[ {˃>DM4D_#c/c[h&OܿPj߾-wK=%9E +Ċ >ǧTavfD'Pm[|ps/ב_6D6n:Sn(g^=9Ke{)#]ʀ}edM+گj(wE$*F6 +G7FsRewdBFf_tN 6hb!?Yv%?+a@U;5d/Xz%Y`_He]L-FfP|6W;mC5߳Yhc_l ]s,"~ +zx[n}6Sաv#/41#9i+6<h7&m[P7R
i$mKRc+؏FN +pO,JV8kN- +hI@лnUԠY +6q4KB6N+ԸM.v.ɲ+YU
:/鼫w?0@]P]$k o[ +HU]Иl!yRsAGdЉтyL)$@4 }L@X7o^ߠByFM-:;3P~<r);,On?5Q5Gc-3;V~[
]V~۪XjRq$
mKUK( pC:zHaU)O%u!FAGi? p&@.gt%@,# 5cOC7@2e#:tN6yjV%4a(H!Zм`.dwgo"Hc@A#3@D"`HB\L)XE& +}XDArC))'Ju4d5UeO?z&Iiēܔecz~FH&o9o&F{+j_CJk1Pg +$(1A] +DyB^inܦ0Sace̴nOi6~~ԗU\, +~T7_l;oIRYW~<sء1l.-U}-!ҔKW +l H9"~s +Dۜiы)VD$f6>d</9Zƥsg$%%~ +n䍽~luϮ(}9`A ܽqՒsf͘1cւ^FkVMq45P1FQpK, Ts (8E@vtQULC)LbBbO0\V$zٷh +uckz%079eO]wY tʚC7c`Hx~"mĮƺڪʪꆎ)w`G{0?j+I6vLRGf[`/np + +Aer&z,RI-+a_LT2I*]qC3W3u_˂ߗF(ѵ'=zı3Wn?!kFMI^VFzzfzvaE%DR"|l,hׇ`'Jlیv +M1ʊXwnma@I~ ;bju3浪ξK:K]q`?l]fڵ8z +w&DG&M\qO4My9YO3э5oZ{#ԫ3ɘՕ;[e-<?ն.u
[ +(<w-~۵C|CS^a6*Y}G?m\?w=x>y -g0W` +endstream
endobj
10 0 obj
<</CreationDate(D:20120203041454+01'00')/Creator(Adobe Illustrator CS5)/ModDate(D:20150428131141+02'00')/Producer(Adobe Photoshop for Windows -- Image Conversion Plug-in)/Title(Druck)>>
endobj
xref
+0 11
+0000000000 65535 f
+0000000016 00000 n
+0000000076 00000 n
+0000059182 00000 n
+0000000000 00000 f
+0000059233 00000 n
+0000059439 00000 n
+0000137044 00000 n
+0000059519 00000 n
+0000137077 00000 n
+0000629746 00000 n
+trailer
+<</Size 11/Root 1 0 R/Info 10 0 R/ID[<64EF656E86A13F4BBC364BAC8316D01E><DE8C070F82399748B7C6019685060DD8>]>>
+startxref
+629948
+%%EOF
diff --git a/doc/makefile b/doc/makefile new file mode 100644 index 0000000..ac16ff2 --- /dev/null +++ b/doc/makefile @@ -0,0 +1,78 @@ +## ---------------------------------------------------------------------------- +## Script : makefile +## ---------------------------------------------------------------------------- +## Author : Johann Faerber +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: This makefile allows automating documentation process +## based on markdown and pandoc +## +## ---------------------------------------------------------------------------- + +################################################################### +# Definitions +# +################################################################### +PROJECT = pulse_width_modulator + +DATASHEET_YAML = datasheet.yaml +REPORT_YAML = report.yaml +PRESENTATION_YAML = presentation.yaml + +################################################################### +# Main Targets +# +################################################################### + +help: + @echo '"make" does intentionally nothing. Type:' + @echo ' "make datasheet" to create a datasheet' + @echo ' "make report" to create a report' + @echo ' "make presentation" to create a presentation' + @echo ' "make clean" to remove all generated files' + + +datasheet: $(PROJECT)_datasheet.md + pandoc --template uasa_meng_vlsi_template.tex $(DATASHEET_YAML) $(PROJECT)_datasheet.md -o $(PROJECT)_datasheet.pdf --highlight-style tango + + +report: $(PROJECT)_report.md + pandoc --template uasa_meng_vlsi_template.tex $(REPORT_YAML) $(PROJECT)_report.md -o $(PROJECT)_report.pdf --highlight-style tango --number-sections + + +presentation: $(PROJECT)_presentation.md + pandoc -t beamer --template uasa_meng_vlsi_template.tex $(PRESENTATION_YAML) $(PROJECT)_presentation.md -o $(PROJECT)_presentation.pdf + + + +clean: + rm -rf $(PROJECT)_datasheet.pdf $(PROJECT)_report.pdf $(PROJECT)_presentation.pdf + +## ---------------------------------------------------------------------------- +## Description: +## ------------ +## assumes the following design directory structure as prerequisite +## +## project +## | +## |-- makefile +## | +## +-- doc/ +## | |-- stepper_motor_controller_datasheet.md +## | |-- stepper_motor_controller_datasheet.pdf +## | |-- stepper_motor_controller_report.md +## | |-- stepper_motor_controller_report.pdf +## | |-- stepper_motor_controller_presentation.md +## | |-- stepper_motor_controller_presentation.pdf +## | |-- ... +## | | +## | +-- images +## | |-- smctrl_modes.fodg +## | |-- smctrl_modes.png +## | |-- smctrl_modes_simwave.png +## | |-- wave_drive_timing.pdf +## | |-- wave_drive_timing.svg +## | |-- ... +## | +## ---------------------------------------------------------------------------- + diff --git a/doc/presentation.yaml b/doc/presentation.yaml new file mode 100644 index 0000000..fbb54bf --- /dev/null +++ b/doc/presentation.yaml @@ -0,0 +1,11 @@ +--- +title: Presentation Title +subtitle: VLSI-Design Module - Presentation +author: J Färber +date: July 202x +lang: en-UK +theme: Pittsburgh +colortheme: default +code-block-font-size: \tiny +--- + diff --git a/doc/pulse_width_modulator_datasheet.md b/doc/pulse_width_modulator_datasheet.md new file mode 100644 index 0000000..2f1caa4 --- /dev/null +++ b/doc/pulse_width_modulator_datasheet.md @@ -0,0 +1,206 @@ +Introduction +============ + +A heartbeat generator can be used in a digital system to ... + +Features +======== + +Normal rhythm produces four entities – a P wave, a QRS complex, a T wave, and a U wave – that each +have a fairly unique pattern. [[1]](https://en.wikipedia.org/wiki/Electrocardiography) + +For simplicity the existing heartbeat module generates the QRS complex and T wave only. + + * Models QRS-Complex and T-Wave + * Average time values based on 72 bpm + * Enable input for external prescaler + + +General Description +=================== + +{width=40%} + +| **Name** | **Type** | **Direction** | **Polarity** | **Description** | +|-------------|-------------------|:-------------:|:------------:|-----------------| +| clk_i | std_ulogic | IN | HIGH | clock | + +: Heartbeat Generator - Description of I/O Signals + + +Functional Description +====================== + +The shape of an [electrogardiogramm](https://en.wikipedia.org/wiki/Electrocardiography) as a voltage graph over time + + + +{width=20%} + +The important QRS complex and T wave are modelled as digital pulses. + +{width=80%} + + +Design Description +================== + +A conceptional RTL diagram is shown below. + +{width=60%} + +The simulation result shows two full periods based on a clock period of 1 ms + +{width=80%} + +In more detail using cursors to display correct parameters of the QRS complex and T wave. + +{width=80%} + + + +Device Utilization and Performance +================================== + +The following table shows the utilisation of both modules heartbeat_gen and cntdnmodm. + +The following results are extracted from + + ```pure + pnr/de1_heartbeat_gen/de1_heartbeat_gen.fit.rpt + ``` + + +```pure ++--------------------------------------------------------------------------------------+ +; Fitter Summary ; ++------------------------------------+-------------------------------------------------+ +``` + +The following results are extracted from + + ```pure +de1_heartbeat_gen.sta.rpt +``` + +```pure ++----------------------------------------------------------------------------------------+ +; TimeQuest Timing Analyzer Summary ; ++--------------------+-------------------------------------------------------------------+ + +-----------------------------------------+ +; Clocks ; ++------------+------+--------+-----------+ + + ++-----------------------------------------------------------------------------+ +; Multicorner Timing Analysis Summary ; ++------------------+-------+-------+----------+---------+---------------------+ + +``` + +Application Note +================ + +The following test environment on a DE1 prototype board uses a system clock frequency of 50 MHz. +A prescaler is parameterised to generate an output signal with a period of 1 ms. + +{width=70%} + + + +Appendix +======== + +References +---------- + +* [Wiki: Electrocardiography](https://en.wikipedia.org/wiki/Electrocardiography) + +Project Hierarchy +----------------- + +### Module Hierarchy for Verification + +```pure +t_heartbeat_gen(tbench) + heartbeat_gen(rtl) +``` + +### Prototype Environment + +```pure +de1_heartbeat_gen(structure) + heartbeat_gen(rtl) + cntdnmodm(rtl) +``` + +VHDL Sources +------------ + +```vhdl +LIBRARY IEEE; +USE IEEE.std_logic_1164.ALL; + +ENTITY heartbeat_gen IS + PORT (clk_i : IN std_ulogic; + rst_ni : IN std_ulogic; + en_pi : IN std_ulogic; + count_o : OUT std_ulogic_vector; + heartbeat_o : OUT std_ulogic + ); +END heartbeat_gen; +``` + +```vhdl +LIBRARY IEEE; +USE IEEE.std_logic_1164.ALL; +USE IEEE.numeric_std.ALL; + +ARCHITECTURE rtl OF heartbeat_gen IS + + CONSTANT n : natural := 10; + CONSTANT zero : unsigned(n-1 DOWNTO 0) := (OTHERS => '0'); + + CONSTANT heartbeat_period : unsigned(n-1 DOWNTO 0) := to_unsigned(833, n); + CONSTANT qrs_width : unsigned(n-1 DOWNTO 0) := to_unsigned(100, n); + CONSTANT st_width + CONSTANT t_width + CONSTANT qt_width + + SIGNAL next_state, current_state : unsigned(n-1 DOWNTO 0); + + SIGNAL tc_qrs : std_ulogic; -- qrs interval + SIGNAL tc_t : std_ulogic; -- T wave + +BEGIN + + next_state_logic : + + + + state_register : + + + -- output_logic + t_wave : tc_t <= + + + + qrs_complex : tc_qrs <= + + + output_value : heartbeat_o <= + + +END rtl; +``` + +Revision History +---------------- + +| **Date** | **Version** | **Change Summary** | +|:----------|:-------------|:--------------------| +| May 2020 | 0.1 | Initial Release | +| April 2021 | 0.2 | Added parameterisation | + diff --git a/doc/pulse_width_modulator_presentation.md b/doc/pulse_width_modulator_presentation.md new file mode 100644 index 0000000..d742c03 --- /dev/null +++ b/doc/pulse_width_modulator_presentation.md @@ -0,0 +1,106 @@ +--- +title: Heartbeat Generator +subtitle: VLSI-Design Module - Presentation +author: J Färber +date: SS2021 +--- + +Overview +======== + +* Features +* Interface Signals +* Block Diagram +* Functional Description +* Simulation Result +* Device Utilization and Performance +* Demonstration +* Questions + +Features +======== + + * Models QRS-Complex and T-Wave + * Average time values based on 72 bpm + * Enable input for external prescaler + +Interface Signals +================= + +{width=40%} + + +Functional Description +====================== + +Simplification to Digital Pulses +--------- + +{width=20%} + + +{width=80%} + + +Functional Description +====================== + +Conceptional RTL Diagram +--------------- + +{width=60%} + +Simulation Result - Top Level +============================= + +{width=80%} + +Device Utilization and Performance +================================== + +```pure ++------------------------------------------------------------------------------+ +; Fitter Summary ; ++------------------------------------+-----------------------------------------+ +; Fitter Status ; Successful - Wed Mar 31 11:50:15 2021 ; +; Quartus II 32-bit Version ; 13.0.1 Build 232 06/12/2013 SP 1 SJ Web ; +; Revision Name ; de1_heartbeat_gen ; +; Top-level Entity Name ; de1_heartbeat_gen ; +; Family ; Cyclone II ; +; Device ; EP2C20F484C7 ; +; Timing Models ; Final ; +; Total logic elements ; 50 / 18,752 ( < 1 % ) ; +; Total combinational functions ; 50 / 18,752 ( < 1 % ) ; +; Dedicated logic registers ; 26 / 18,752 ( < 1 % ) ; +; Total registers ; 26 ; +; Total pins ; 15 / 315 ( 5 % ) ; +; Total virtual pins ; 0 ; +; Total memory bits ; 0 / 239,616 ( 0 % ) ; +; Embedded Multiplier 9-bit elements ; 0 / 52 ( 0 % ) ; +; Total PLLs ; 0 / 4 ( 0 % ) ; ++------------------------------------+-----------------------------------------+ +``` + +Demonstration +============= + +Prototype Setup +--------------- + +{width=70%} + +Demonstration +============= + +Test Environment +---------------- + + + + + +Questions +========= + +Thank you for your attention ! + diff --git a/doc/pulse_width_modulator_report.md b/doc/pulse_width_modulator_report.md new file mode 100644 index 0000000..67cb4c2 --- /dev/null +++ b/doc/pulse_width_modulator_report.md @@ -0,0 +1,235 @@ +Introduction +============ + +A heartbeat generator can be used in a digital system to display activity of a system. +Based on population studies, a heartrate between 60 and 100 beats per minute (bpm) +is considered as normal for a human adult. + +Features +======== + +Normal rhythm produces four entities – a P wave, a QRS complex, a T wave, and a U wave – that each +have a fairly unique pattern. [[1]](https://en.wikipedia.org/wiki/Electrocardiography) + +For simplicity the existing heartbeat modules generates the QRS complex and T wave only. + + * Models QRS-Complex and T-Wave + * Average time values based on 72 bpm + * Enable input for external prescaler + + +General Description +=================== + +{width=40%} + +| **Name** | **Type** | **Direction** | **Polarity** | **Description** | +|-------------|-------------------|:-------------:|:------------:|-----------------| +| clk_i | std_ulogic | IN | HIGH | clock | +| rst_ni | std_ulogic | IN | LOW | reset | +| en_pi | std_ulogic | IN | HIGH | enable | +| count_o | std_ulogic_vector | OUT | HIGH | count value | +| heartbeat_o | std_ulogic | OUT | HIGH | hearbeat pulse output | + +: Heartbeat Generator - Description of I/O Signals + + +Functional Description +====================== + +The shape of an [electrogardiogramm](https://en.wikipedia.org/wiki/Electrocardiography) as a voltage graph over time + + + +{width=20%} + +The important QRS complex and T wave are modelled as digital pulses. + +{width=80%} + + +Design Description +================== + +A conceptional RTL diagram is shown below. + +{width=60%} + +The simulation result shows two full periods based on a clock period of 1 ms + +{width=80%} + +In more detail using cursors to display correct parameters of the QRS complex and T wave. + +{width=80%} + + + +Device Utilization and Performance +================================== + +The following table shows the utilisation of both modules heartbeat_gen and cntdnmodm. + +```pure ++--------------------------------------------------------------------------------------+ +; Fitter Summary ; ++------------------------------------+-------------------------------------------------+ +; Fitter Status ; Successful - Wed Mar 31 11:50:15 2021 ; +; Quartus II 32-bit Version ; 13.0.1 Build 232 06/12/2013 SP 1 SJ Web Edition ; +; Revision Name ; de1_heartbeat_gen ; +; Top-level Entity Name ; de1_heartbeat_gen ; +; Family ; Cyclone II ; +; Device ; EP2C20F484C7 ; +; Timing Models ; Final ; +; Total logic elements ; 50 / 18,752 ( < 1 % ) ; +; Total combinational functions ; 50 / 18,752 ( < 1 % ) ; +; Dedicated logic registers ; 26 / 18,752 ( < 1 % ) ; +; Total registers ; 26 ; +; Total pins ; 15 / 315 ( 5 % ) ; +; Total virtual pins ; 0 ; +; Total memory bits ; 0 / 239,616 ( 0 % ) ; +; Embedded Multiplier 9-bit elements ; 0 / 52 ( 0 % ) ; +; Total PLLs ; 0 / 4 ( 0 % ) ; ++------------------------------------+-------------------------------------------------+ +``` + +```pure + ++----------------------------------------------------------------------------------------+ +; TimeQuest Timing Analyzer Summary ; ++--------------------+-------------------------------------------------------------------+ +; Quartus II Version ; Version 13.0.1 Build 232 06/12/2013 Service Pack 1 SJ Web Edition ; +; Revision Name ; de1_heartbeat_gen ; +; Device Family ; Cyclone II ; +; Device Name ; EP2C20F484C7 ; +; Timing Models ; Final ; +; Delay Model ; Combined ; +; Rise/Fall Delays ; Unavailable ; ++--------------------+-------------------------------------------------------------------+ + +-----------------------------------------+ +; Clocks ; ++------------+------+--------+-----------+ +; Clock Name ; Type ; Period ; Frequency ; ++------------+------+--------+-----------+ +; CLOCK_50 ; Base ; 20.000 ; 50.0 MHz ; ++------------+------+--------+-----------+ + + ++-----------------------------------------------------------------------------+ +; Multicorner Timing Analysis Summary ; ++------------------+-------+-------+----------+---------+---------------------+ +; Clock ; Setup ; Hold ; Recovery ; Removal ; Minimum Pulse Width ; ++------------------+-------+-------+----------+---------+---------------------+ +; Worst-case Slack ; 3.390 ; 0.241 ; 13.381 ; 3.796 ; 8.889 ; +; CLOCK_50 ; 3.390 ; 0.241 ; 13.381 ; 3.796 ; 8.889 ; +; Design-wide TNS ; 0.0 ; 0.0 ; 0.0 ; 0.0 ; 0.0 ; +; CLOCK_50 ; 0.000 ; 0.000 ; 0.000 ; 0.000 ; 0.000 ; ++------------------+-------+-------+----------+---------+---------------------+ +``` + +Application Note +================ + +The following test environment on a DE1 prototype board uses a system clock frequency of 50 MHz. +A prescaler is parameterised to generate an output signal with a period of 1 ms. + +{width=70%} + + + +Appendix +======== + +References +---------- + +* [Wiki: Electrocardiography](https://en.wikipedia.org/wiki/Electrocardiography) + +Project Hierarchy +----------------- + +### Module Hierarchy for Verification + +```pure +t_heartbeat_gen(tbench) + heartbeat_gen(rtl) +``` + +### Prototype Environment + +```pure +de1_heartbeat_gen(structure) + heartbeat_gen(rtl) + cntdnmodm(rtl) +``` + +VHDL Sources +------------ + +```vhdl +LIBRARY IEEE; +USE IEEE.std_logic_1164.ALL; + +ENTITY heartbeat_gen IS + PORT (clk_i : IN std_ulogic; + rst_ni : IN std_ulogic; + en_pi : IN std_ulogic; + count_o : OUT std_ulogic_vector; + heartbeat_o : OUT std_ulogic + ); +END heartbeat_gen; +``` + +```vhdl +LIBRARY IEEE; +USE IEEE.std_logic_1164.ALL; +USE IEEE.numeric_std.ALL; + +ARCHITECTURE rtl OF heartbeat_gen IS + + CONSTANT n : natural := 10; + CONSTANT zero : unsigned(n-1 DOWNTO 0) := (OTHERS => '0'); + + CONSTANT heartbeat_period : unsigned(n-1 DOWNTO 0) := to_unsigned(833, n); + CONSTANT qrs_width : unsigned(n-1 DOWNTO 0) := to_unsigned(100, n); + CONSTANT st_width + CONSTANT t_width + CONSTANT qt_width + + SIGNAL next_state, current_state : unsigned(n-1 DOWNTO 0); + + SIGNAL tc_qrs : std_ulogic; -- qrs interval + SIGNAL tc_t : std_ulogic; -- T wave + +BEGIN + + next_state_logic : + + + + state_register : + + + -- output_logic + t_wave : tc_t <= + + + + qrs_complex : tc_qrs <= + + + output_value : heartbeat_o <= + + +END rtl; +``` + +Revision History +---------------- + +| **Date** | **Version** | **Change Summary** | +|:----------|:-------------|:--------------------| +| May 2020 | 0.1 | Initial Release | +| April 2021 | 0.2 | Added parameterisation | + diff --git a/doc/report.yaml b/doc/report.yaml new file mode 100644 index 0000000..1989e0a --- /dev/null +++ b/doc/report.yaml @@ -0,0 +1,27 @@ +--- +title: Pulse Width Modulator +subtitle: VLSI-Design Module - Report +author: J Färber +date: SS2022 +lang: en-UK +geometry: a4paper, left=25mm, right=20mm, top=20mm, bottom=25mm +fontsize: 12pt +code-block-font-size: \scriptsize +titlepage: true +logo: images/uasa-logo.pdf +toc: true +lof: true +lot: true +toc-own-page: true +colorlinks: true +secnumdepth: 4 +header-includes: +# 4th level header rendering +# see https://stackoverflow.com/questions/21198025/pandoc-generation-of-pdf-from-markdown-4th-header-is-rendered-differently/21204829#21204829 + - | + ``` {=latex} + \let\originAlParaGraph\paragraph + \renewcommand{\paragraph}[1]{\originAlParaGraph{#1} \hfill} + ``` +--- + diff --git a/doc/uasa_meng_vlsi_template.tex b/doc/uasa_meng_vlsi_template.tex new file mode 100644 index 0000000..7aac2a7 --- /dev/null +++ b/doc/uasa_meng_vlsi_template.tex @@ -0,0 +1,1038 @@ +%% +% Copyright (c) 2017 - 2020, Pascal Wagler; +% Copyright (c) 2014 - 2020, John MacFarlane +% +% All rights reserved. +% +% Redistribution and use in source and binary forms, with or without +% modification, are permitted provided that the following conditions +% are met: +% +% - Redistributions of source code must retain the above copyright +% notice, this list of conditions and the following disclaimer. +% +% - Redistributions in binary form must reproduce the above copyright +% notice, this list of conditions and the following disclaimer in the +% documentation and/or other materials provided with the distribution. +% +% - Neither the name of John MacFarlane nor the names of other +% contributors may be used to endorse or promote products derived +% from this software without specific prior written permission. +% +% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +% "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +% LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +% FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +% COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +% INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +% BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +% LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +% CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +% LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +% ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +% POSSIBILITY OF SUCH DAMAGE. +%% + +%% +% This is the Eisvogel pandoc LaTeX template. +% +% For usage information and examples visit the official GitHub page: +% https://github.com/Wandmalfarbe/pandoc-latex-template +%% + +% Options for packages loaded elsewhere +\PassOptionsToPackage{unicode$for(hyperrefoptions)$,$hyperrefoptions$$endfor$}{hyperref} +\PassOptionsToPackage{hyphens}{url} +\PassOptionsToPackage{dvipsnames,svgnames*,x11names*,table}{xcolor} +$if(dir)$ +$if(latex-dir-rtl)$ +\PassOptionsToPackage{RTLdocument}{bidi} +$endif$ +$endif$ +% +\documentclass[ +$if(fontsize)$ + $fontsize$, +$endif$ +$if(lang)$ + $babel-lang$, +$endif$ +$if(papersize)$ + $papersize$paper, +$else$ + a4paper, +$endif$ +$if(beamer)$ + ignorenonframetext, +$if(handout)$ + handout, +$endif$ +$if(aspectratio)$ + aspectratio=$aspectratio$, +$endif$ +$endif$ +$for(classoption)$ + $classoption$$sep$, +$endfor$ +,tablecaptionabove +]{$if(beamer)$$documentclass$$else$$if(book)$scrbook$else$scrartcl$endif$$endif$} +$if(beamer)$ +$if(background-image)$ +\usebackgroundtemplate{% + \includegraphics[width=\paperwidth]{$background-image$}% +} +$endif$ +\usepackage{pgfpages} +\setbeamertemplate{caption}[numbered] +\setbeamertemplate{caption label separator}{: } +\setbeamercolor{caption name}{fg=normal text.fg} +\beamertemplatenavigationsymbols$if(navigation)$$navigation$$else$empty$endif$ +$for(beameroption)$ +\setbeameroption{$beameroption$} +$endfor$ +% Prevent slide breaks in the middle of a paragraph +\widowpenalties 1 10000 +\raggedbottom +$if(section-titles)$ +\setbeamertemplate{part page}{ + \centering + \begin{beamercolorbox}[sep=16pt,center]{part title} + \usebeamerfont{part title}\insertpart\par + \end{beamercolorbox} +} +\setbeamertemplate{section page}{ + \centering + \begin{beamercolorbox}[sep=12pt,center]{part title} + \usebeamerfont{section title}\insertsection\par + \end{beamercolorbox} +} +\setbeamertemplate{subsection page}{ + \centering + \begin{beamercolorbox}[sep=8pt,center]{part title} + \usebeamerfont{subsection title}\insertsubsection\par + \end{beamercolorbox} +} +\AtBeginPart{ + \frame{\partpage} +} +\AtBeginSection{ + \ifbibliography + \else + \frame{\sectionpage} + \fi +} +\AtBeginSubsection{ + \frame{\subsectionpage} +} +$endif$ +$endif$ +$if(beamerarticle)$ +\usepackage{beamerarticle} % needs to be loaded first +$endif$ +$if(fontfamily)$ +\usepackage[$for(fontfamilyoptions)$$fontfamilyoptions$$sep$,$endfor$]{$fontfamily$} +$else$ +\usepackage{lmodern} +$endif$ +$if(linestretch)$ +\usepackage{setspace} +\setstretch{$linestretch$} +$else$ +\usepackage{setspace} +\setstretch{1.2} +$endif$ +\usepackage{amssymb,amsmath} +\usepackage{ifxetex,ifluatex} +\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex + \usepackage[$if(fontenc)$$fontenc$$else$T1$endif$]{fontenc} + \usepackage[utf8]{inputenc} + \usepackage{textcomp} % provide euro and other symbols +\else % if luatex or xetex +$if(mathspec)$ + \ifxetex + \usepackage{mathspec} + \else + \usepackage{unicode-math} + \fi +$else$ + \usepackage{unicode-math} +$endif$ + \defaultfontfeatures{Scale=MatchLowercase} + \defaultfontfeatures[\rmfamily]{Ligatures=TeX,Scale=1} +$if(mainfont)$ + \setmainfont[$for(mainfontoptions)$$mainfontoptions$$sep$,$endfor$]{$mainfont$} +$endif$ +$if(sansfont)$ + \setsansfont[$for(sansfontoptions)$$sansfontoptions$$sep$,$endfor$]{$sansfont$} +$endif$ +$if(monofont)$ + \setmonofont[$for(monofontoptions)$$monofontoptions$$sep$,$endfor$]{$monofont$} +$endif$ +$for(fontfamilies)$ + \newfontfamily{$fontfamilies.name$}[$for(fontfamilies.options)$$fontfamilies.options$$sep$,$endfor$]{$fontfamilies.font$} +$endfor$ +$if(mathfont)$ +$if(mathspec)$ + \ifxetex + \setmathfont(Digits,Latin,Greek)[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} + \else + \setmathfont[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} + \fi +$else$ + \setmathfont[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} +$endif$ +$endif$ +$if(CJKmainfont)$ + \ifxetex + \usepackage{xeCJK} + \setCJKmainfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$} + \fi +$endif$ +$if(luatexjapresetoptions)$ + \ifluatex + \usepackage[$for(luatexjapresetoptions)$$luatexjapresetoptions$$sep$,$endfor$]{luatexja-preset} + \fi +$endif$ +$if(CJKmainfont)$ + \ifluatex + \usepackage[$for(luatexjafontspecoptions)$$luatexjafontspecoptions$$sep$,$endfor$]{luatexja-fontspec} + \setmainjfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$} + \fi +$endif$ +\fi +$if(beamer)$ +$if(theme)$ +\usetheme[$for(themeoptions)$$themeoptions$$sep$,$endfor$]{$theme$} +$endif$ +$if(colortheme)$ +\usecolortheme{$colortheme$} +$endif$ +$if(fonttheme)$ +\usefonttheme{$fonttheme$} +$endif$ +$if(mainfont)$ +\usefonttheme{serif} % use mainfont rather than sansfont for slide text +$endif$ +$if(innertheme)$ +\useinnertheme{$innertheme$} +$endif$ +$if(outertheme)$ +\useoutertheme{$outertheme$} +$endif$ +$endif$ +% Use upquote if available, for straight quotes in verbatim environments +\IfFileExists{upquote.sty}{\usepackage{upquote}}{} +\IfFileExists{microtype.sty}{% use microtype if available + \usepackage[$for(microtypeoptions)$$microtypeoptions$$sep$,$endfor$]{microtype} + \UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts +}{} +$if(indent)$ +$else$ +\makeatletter +\@ifundefined{KOMAClassName}{% if non-KOMA class + \IfFileExists{parskip.sty}{% + \usepackage{parskip} + }{% else + \setlength{\parindent}{0pt} + \setlength{\parskip}{6pt plus 2pt minus 1pt}} +}{% if KOMA class + \KOMAoptions{parskip=half}} +\makeatother +$endif$ +$if(verbatim-in-note)$ +\usepackage{fancyvrb} +$endif$ +\usepackage{xcolor} +\definecolor{default-linkcolor}{HTML}{A50000} +\definecolor{default-filecolor}{HTML}{A50000} +\definecolor{default-citecolor}{HTML}{4077C0} +\definecolor{default-urlcolor}{HTML}{4077C0} +\IfFileExists{xurl.sty}{\usepackage{xurl}}{} % add URL line breaks if available +$if(footnotes-pretty)$ +% load footmisc in order to customize footnotes (footmisc has to be loaded before hyperref, cf. https://tex.stackexchange.com/a/169124/144087) +\usepackage[hang,flushmargin,bottom,multiple]{footmisc} +\setlength{\footnotemargin}{0.8em} % set space between footnote nr and text +\setlength{\footnotesep}{\baselineskip} % set space between multiple footnotes +\setlength{\skip\footins}{0.3cm} % set space between page content and footnote +\setlength{\footskip}{0.9cm} % set space between footnote and page bottom +$endif$ +\IfFileExists{bookmark.sty}{\usepackage{bookmark}}{\usepackage{hyperref}} +\hypersetup{ +$if(title-meta)$ + pdftitle={$title-meta$}, +$endif$ +$if(author-meta)$ + pdfauthor={$author-meta$}, +$endif$ +$if(lang)$ + pdflang={$lang$}, +$endif$ +$if(subject)$ + pdfsubject={$subject$}, +$endif$ +$if(keywords)$ + pdfkeywords={$for(keywords)$$keywords$$sep$, $endfor$}, +$endif$ +$if(colorlinks)$ + colorlinks=true, + linkcolor=$if(linkcolor)$$linkcolor$$else$default-linkcolor$endif$, + filecolor=$if(filecolor)$$filecolor$$else$default-filecolor$endif$, + citecolor=$if(citecolor)$$citecolor$$else$default-citecolor$endif$, + urlcolor=$if(urlcolor)$$urlcolor$$else$default-urlcolor$endif$, +$else$ + hidelinks, +$endif$ + breaklinks=true, + pdfcreator={LaTeX via pandoc with the Eisvogel template}} +\urlstyle{same} % disable monospaced font for URLs +$if(verbatim-in-note)$ +\VerbatimFootnotes % allow verbatim text in footnotes +$endif$ +$if(geometry)$ +$if(beamer)$ +\geometry{$for(geometry)$$geometry$$sep$,$endfor$} +$else$ +\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry} +$endif$ +$else$ +$if(beamer)$ +$else$ +\usepackage[margin=2.5cm,includehead=true,includefoot=true,centering,$for(geometry)$$geometry$$sep$,$endfor$]{geometry} +$endif$ +$endif$ +$if(logo)$ +\usepackage[export]{adjustbox} +\usepackage{graphicx} +$endif$ +$if(beamer)$ +\newif\ifbibliography +$endif$ +$if(listings)$ +\usepackage{listings} +\newcommand{\passthrough}[1]{#1} +\lstset{defaultdialect=[5.3]Lua} +\lstset{defaultdialect=[x86masm]Assembler} +$endif$ +$if(listings-no-page-break)$ +\usepackage{etoolbox} +\BeforeBeginEnvironment{lstlisting}{\par\noindent\begin{minipage}{\linewidth}} +\AfterEndEnvironment{lstlisting}{\end{minipage}\par\addvspace{\topskip}} +$endif$ +$if(lhs)$ +\lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{} +$endif$ +$if(highlighting-macros)$ +$highlighting-macros$ + +% Workaround/bugfix from jannick0. +% See https://github.com/jgm/pandoc/issues/4302#issuecomment-360669013) +% or https://github.com/Wandmalfarbe/pandoc-latex-template/issues/2 +% +% Redefine the verbatim environment 'Highlighting' to break long lines (with +% the help of fvextra). Redefinition is necessary because it is unlikely that +% pandoc includes fvextra in the default template. +\usepackage{fvextra} +\DefineVerbatimEnvironment{Highlighting}{Verbatim}{breaklines,fontsize=$if(code-block-font-size)$$code-block-font-size$$else$\small$endif$,commandchars=\\\{\}} + +$endif$ +$if(tables)$ +\usepackage{longtable,booktabs} +$if(beamer)$ +\usepackage{caption} +% Make caption package work with longtable +\makeatletter +\def\fnum@table{\tablename~\thetable} +\makeatother +$else$ +% Correct order of tables after \paragraph or \subparagraph +\usepackage{etoolbox} +\makeatletter +\patchcmd\longtable{\par}{\if@noskipsec\mbox{}\fi\par}{}{} +\makeatother +% Allow footnotes in longtable head/foot +\IfFileExists{footnotehyper.sty}{\usepackage{footnotehyper}}{\usepackage{footnote}} +\makesavenoteenv{longtable} +$endif$ +$endif$ +% add backlinks to footnote references, cf. https://tex.stackexchange.com/questions/302266/make-footnote-clickable-both-ways +$if(footnotes-disable-backlinks)$ +$else$ +\usepackage{footnotebackref} +$endif$ +$if(graphics)$ +\usepackage{graphicx,grffile} +\makeatletter +\def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi} +\def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi} +\makeatother +% Scale images if necessary, so that they will not overflow the page +% margins by default, and it is still possible to overwrite the defaults +% using explicit options in \includegraphics[width, height, ...]{} +\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio} +$endif$ +$if(links-as-notes)$ +% Make links footnotes instead of hotlinks: +\DeclareRobustCommand{\href}[2]{#2\footnote{\url{#1}}} +$endif$ +$if(strikeout)$ +\usepackage[normalem]{ulem} +% Avoid problems with \sout in headers with hyperref +\pdfstringdefDisableCommands{\renewcommand{\sout}{}} +$endif$ +\setlength{\emergencystretch}{3em} % prevent overfull lines +\providecommand{\tightlist}{% + \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} +$if(numbersections)$ +\setcounter{secnumdepth}{$if(secnumdepth)$$secnumdepth$$else$3$endif$} +$else$ +\setcounter{secnumdepth}{-\maxdimen} % remove section numbering +$endif$ +$if(beamer)$ +$else$ +$if(block-headings)$ +% Make \paragraph and \subparagraph free-standing +\ifx\paragraph\undefined\else + \let\oldparagraph\paragraph + \renewcommand{\paragraph}[1]{\oldparagraph{#1}\mbox{}} +\fi +\ifx\subparagraph\undefined\else + \let\oldsubparagraph\subparagraph + \renewcommand{\subparagraph}[1]{\oldsubparagraph{#1}\mbox{}} +\fi +$endif$ +$endif$ +$if(pagestyle)$ +\pagestyle{$pagestyle$} +$endif$ + +% Make use of float-package and set default placement for figures to H. +% The option H means 'PUT IT HERE' (as opposed to the standard h option which means 'You may put it here if you like'). +\usepackage{float} +\floatplacement{figure}{$if(float-placement-figure)$$float-placement-figure$$else$H$endif$} + +$for(header-includes)$ +$header-includes$ +$endfor$ +$if(lang)$ +\ifxetex + $if(mainfont)$ + $else$ + % See issue https://github.com/reutenauer/polyglossia/issues/127 + \renewcommand*\familydefault{\sfdefault} + $endif$ + % Load polyglossia as late as possible: uses bidi with RTL langages (e.g. Hebrew, Arabic) + \usepackage{polyglossia} + \setmainlanguage[$polyglossia-lang.options$]{$polyglossia-lang.name$} +$for(polyglossia-otherlangs)$ + \setotherlanguage[$polyglossia-otherlangs.options$]{$polyglossia-otherlangs.name$} +$endfor$ +\else + \usepackage[shorthands=off,$for(babel-otherlangs)$$babel-otherlangs$,$endfor$main=$babel-lang$]{babel} +$if(babel-newcommands)$ + $babel-newcommands$ +$endif$ +\fi +$endif$ +$if(dir)$ +\ifxetex + % Load bidi as late as possible as it modifies e.g. graphicx + \usepackage{bidi} +\fi +\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex + \TeXXeTstate=1 + \newcommand{\RL}[1]{\beginR #1\endR} + \newcommand{\LR}[1]{\beginL #1\endL} + \newenvironment{RTL}{\beginR}{\endR} + \newenvironment{LTR}{\beginL}{\endL} +\fi +$endif$ +$if(natbib)$ +\usepackage[$natbiboptions$]{natbib} +\bibliographystyle{$if(biblio-style)$$biblio-style$$else$plainnat$endif$} +$endif$ +$if(biblatex)$ +\usepackage[$if(biblio-style)$style=$biblio-style$,$endif$$for(biblatexoptions)$$biblatexoptions$$sep$,$endfor$]{biblatex} +$for(bibliography)$ +\addbibresource{$bibliography$} +$endfor$ +$endif$ +$if(csl-refs)$ +\newlength{\cslhangindent} +\setlength{\cslhangindent}{1.5em} +\newenvironment{cslreferences}% + {$if(csl-hanging-indent)$\setlength{\parindent}{0pt}% + \everypar{\setlength{\hangindent}{\cslhangindent}}\ignorespaces$endif$}% + {\par} +$endif$ + +$if(title)$ +\title{$title$$if(thanks)$\thanks{$thanks$}$endif$} +$endif$ +$if(subtitle)$ +$if(beamer)$ +$else$ +\usepackage{etoolbox} +\makeatletter +\providecommand{\subtitle}[1]{% add subtitle to \maketitle + \apptocmd{\@title}{\par {\large #1 \par}}{}{} +} +\makeatother +$endif$ +\subtitle{$subtitle$} +$endif$ +$if(author)$ +\author{$for(author)$$author$$sep$ \and $endfor$} +$endif$ +\date{$date$} +$if(beamer)$ +$if(institute)$ +\institute{$for(institute)$$institute$$sep$ \and $endfor$} +$endif$ +$if(titlegraphic)$ +\titlegraphic{\includegraphics{$titlegraphic$}} +$endif$ +$if(logo)$ +\logo{\includegraphics{$logo$}} +$endif$ +$endif$ + + + +%% +%% added +%% + +% +% language specification +% +% If no language is specified, use English as the default main document language. +% +$if(lang)$$else$ +\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex + \usepackage[shorthands=off,$for(babel-otherlangs)$$babel-otherlangs$,$endfor$main=english]{babel} +$if(babel-newcommands)$ + $babel-newcommands$ +$endif$ +\else + $if(mainfont)$ + $else$ + % Workaround for bug in Polyglossia that breaks `\familydefault` when `\setmainlanguage` is used. + % See https://github.com/Wandmalfarbe/pandoc-latex-template/issues/8 + % See https://github.com/reutenauer/polyglossia/issues/186 + % See https://github.com/reutenauer/polyglossia/issues/127 + \renewcommand*\familydefault{\sfdefault} + $endif$ + % load polyglossia as late as possible as it *could* call bidi if RTL lang (e.g. Hebrew or Arabic) + \usepackage{polyglossia} + \setmainlanguage[]{english} +$for(polyglossia-otherlangs)$ + \setotherlanguage[$polyglossia-otherlangs.options$]{$polyglossia-otherlangs.name$} +$endfor$ +\fi +$endif$ + +$if(page-background)$ +\usepackage[pages=all]{background} +$endif$ + +% +% for the background color of the title page +% +$if(titlepage)$ +\usepackage{pagecolor} +\usepackage{afterpage} +$if(titlepage-background)$ +\usepackage{tikz} +$endif$ +$if(geometry)$ +$else$ +\usepackage[margin=2.5cm,includehead=true,includefoot=true,centering]{geometry} +$endif$ +$endif$ + +% +% break urls +% +\PassOptionsToPackage{hyphens}{url} + +% +% When using babel or polyglossia with biblatex, loading csquotes is recommended +% to ensure that quoted texts are typeset according to the rules of your main language. +% +\usepackage{csquotes} + +% +% captions +% +\definecolor{caption-color}{HTML}{777777} +$if(beamer)$ +$else$ +\usepackage[font={stretch=1.2}, textfont={color=caption-color}, position=top, skip=4mm, labelfont=bf, singlelinecheck=false, justification=$if(caption-justification)$$caption-justification$$else$raggedright$endif$]{caption} +\setcapindent{0em} +$endif$ + +% +% blockquote +% +\definecolor{blockquote-border}{RGB}{221,221,221} +\definecolor{blockquote-text}{RGB}{119,119,119} +\usepackage{mdframed} +\newmdenv[rightline=false,bottomline=false,topline=false,linewidth=3pt,linecolor=blockquote-border,skipabove=\parskip]{customblockquote} +\renewenvironment{quote}{\begin{customblockquote}\list{}{\rightmargin=0em\leftmargin=0em}% +\item\relax\color{blockquote-text}\ignorespaces}{\unskip\unskip\endlist\end{customblockquote}} + +% +% Source Sans Pro as the default font family +% Source Code Pro for monospace text +% +% 'default' option sets the default +% font family to Source Sans Pro, not \sfdefault. +% +\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex + $if(fontfamily)$ + $else$ + \usepackage[default]{sourcesanspro} + \usepackage{sourcecodepro} + $endif$ +\else % if not pdftex + $if(mainfont)$ + $else$ + \usepackage[default]{sourcesanspro} + \usepackage{sourcecodepro} + + % XeLaTeX specific adjustments for straight quotes: https://tex.stackexchange.com/a/354887 + % This issue is already fixed (see https://github.com/silkeh/latex-sourcecodepro/pull/5) but the + % fix is still unreleased. + % TODO: Remove this workaround when the new version of sourcecodepro is released on CTAN. + \ifxetex + \makeatletter + \defaultfontfeatures[\ttfamily] + { Numbers = \sourcecodepro@figurestyle, + Scale = \SourceCodePro@scale, + Extension = .otf } + \setmonofont + [ UprightFont = *-\sourcecodepro@regstyle, + ItalicFont = *-\sourcecodepro@regstyle It, + BoldFont = *-\sourcecodepro@boldstyle, + BoldItalicFont = *-\sourcecodepro@boldstyle It ] + {SourceCodePro} + \makeatother + \fi + $endif$ +\fi + +% +% heading color +% +\definecolor{heading-color}{RGB}{40,40,40} +$if(beamer)$ +$else$ +\addtokomafont{section}{\color{heading-color}} +$endif$ +% When using the classes report, scrreprt, book, +% scrbook or memoir, uncomment the following line. +%\addtokomafont{chapter}{\color{heading-color}} + +% +% variables for title and author +% +$if(beamer)$ +$else$ +\usepackage{titling} +\title{$title$} +\author{$for(author)$$author$$sep$, $endfor$} +$endif$ + +% +% tables +% +$if(tables)$ + +\definecolor{table-row-color}{HTML}{F5F5F5} +\definecolor{table-rule-color}{HTML}{999999} + +%\arrayrulecolor{black!40} +\arrayrulecolor{table-rule-color} % color of \toprule, \midrule, \bottomrule +\setlength\heavyrulewidth{0.3ex} % thickness of \toprule, \bottomrule +\renewcommand{\arraystretch}{1.3} % spacing (padding) + +$if(table-use-row-colors)$ +% TODO: This doesn't work anymore. I don't know why. +% Reset rownum counter so that each table +% starts with the same row colors. +% https://tex.stackexchange.com/questions/170637/restarting-rowcolors +% +% Unfortunately the colored cells extend beyond the edge of the +% table because pandoc uses @-expressions (@{}) like so: +% +% \begin{longtable}[]{@{}ll@{}} +% \end{longtable} +% +% https://en.wikibooks.org/wiki/LaTeX/Tables#.40-expressions +\let\oldlongtable\longtable +\let\endoldlongtable\endlongtable +\renewenvironment{longtable}{ +\rowcolors{3}{}{table-row-color!100} % row color +\oldlongtable} { +\endoldlongtable +\global\rownum=0\relax} +$endif$ +$endif$ + +% +% remove paragraph indention +% +\setlength{\parindent}{0pt} +\setlength{\parskip}{6pt plus 2pt minus 1pt} +\setlength{\emergencystretch}{3em} % prevent overfull lines + +% +% +% Listings +% +% + +$if(listings)$ + +% +% general listing colors +% +\definecolor{listing-background}{HTML}{F7F7F7} +\definecolor{listing-rule}{HTML}{B3B2B3} +\definecolor{listing-numbers}{HTML}{B3B2B3} +\definecolor{listing-text-color}{HTML}{000000} +\definecolor{listing-keyword}{HTML}{435489} +\definecolor{listing-keyword-2}{HTML}{1284CA} % additional keywords +\definecolor{listing-keyword-3}{HTML}{9137CB} % additional keywords +\definecolor{listing-identifier}{HTML}{435489} +\definecolor{listing-string}{HTML}{00999A} +\definecolor{listing-comment}{HTML}{8E8E8E} + +\lstdefinestyle{eisvogel_listing_style}{ + language = java, +$if(listings-disable-line-numbers)$ + xleftmargin = 0.6em, + framexleftmargin = 0.4em, +$else$ + numbers = left, + xleftmargin = 2.7em, + framexleftmargin = 2.5em, +$endif$ + backgroundcolor = \color{listing-background}, + basicstyle = \color{listing-text-color}\linespread{1.0}$if(code-block-font-size)$$code-block-font-size$$else$\small$endif$\ttfamily{}, + breaklines = true, + frame = single, + framesep = 0.19em, + rulecolor = \color{listing-rule}, + frameround = ffff, + tabsize = 4, + numberstyle = \color{listing-numbers}, + aboveskip = 1.0em, + belowskip = 0.1em, + abovecaptionskip = 0em, + belowcaptionskip = 1.0em, + keywordstyle = {\color{listing-keyword}\bfseries}, + keywordstyle = {[2]\color{listing-keyword-2}\bfseries}, + keywordstyle = {[3]\color{listing-keyword-3}\bfseries\itshape}, + sensitive = true, + identifierstyle = \color{listing-identifier}, + commentstyle = \color{listing-comment}, + stringstyle = \color{listing-string}, + showstringspaces = false, + escapeinside = {/*@}{@*/}, % Allow LaTeX inside these special comments + literate = + {á}{{\'a}}1 {é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1 {ú}{{\'u}}1 + {Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ú}{{\'U}}1 + {à}{{\`a}}1 {è}{{\'e}}1 {ì}{{\`i}}1 {ò}{{\`o}}1 {ù}{{\`u}}1 + {À}{{\`A}}1 {È}{{\'E}}1 {Ì}{{\`I}}1 {Ò}{{\`O}}1 {Ù}{{\`U}}1 + {ä}{{\"a}}1 {ë}{{\"e}}1 {ï}{{\"i}}1 {ö}{{\"o}}1 {ü}{{\"u}}1 + {Ä}{{\"A}}1 {Ë}{{\"E}}1 {Ï}{{\"I}}1 {Ö}{{\"O}}1 {Ü}{{\"U}}1 + {â}{{\^a}}1 {ê}{{\^e}}1 {î}{{\^i}}1 {ô}{{\^o}}1 {û}{{\^u}}1 + {Â}{{\^A}}1 {Ê}{{\^E}}1 {Î}{{\^I}}1 {Ô}{{\^O}}1 {Û}{{\^U}}1 + {œ}{{\oe}}1 {Œ}{{\OE}}1 {æ}{{\ae}}1 {Æ}{{\AE}}1 {ß}{{\ss}}1 + {ç}{{\c c}}1 {Ç}{{\c C}}1 {ø}{{\o}}1 {å}{{\r a}}1 {Å}{{\r A}}1 + {€}{{\EUR}}1 {£}{{\pounds}}1 {«}{{\guillemotleft}}1 + {»}{{\guillemotright}}1 {ñ}{{\~n}}1 {Ñ}{{\~N}}1 {¿}{{?`}}1 + {…}{{\ldots}}1 {≥}{{>=}}1 {≤}{{<=}}1 {„}{{\glqq}}1 {“}{{\grqq}}1 + {”}{{''}}1 +} +\lstset{style=eisvogel_listing_style} + +% +% Java (Java SE 12, 2019-06-22) +% +\lstdefinelanguage{Java}{ + morekeywords={ + % normal keywords (without data types) + abstract,assert,break,case,catch,class,continue,default, + do,else,enum,exports,extends,final,finally,for,if,implements, + import,instanceof,interface,module,native,new,package,private, + protected,public,requires,return,static,strictfp,super,switch, + synchronized,this,throw,throws,transient,try,volatile,while, + % var is an identifier + var + }, + morekeywords={[2] % data types + % primitive data types + boolean,byte,char,double,float,int,long,short, + % String + String, + % primitive wrapper types + Boolean,Byte,Character,Double,Float,Integer,Long,Short + % number types + Number,AtomicInteger,AtomicLong,BigDecimal,BigInteger,DoubleAccumulator,DoubleAdder,LongAccumulator,LongAdder,Short, + % other + Object,Void,void + }, + morekeywords={[3] % literals + % reserved words for literal values + null,true,false, + }, + sensitive, + morecomment = [l]//, + morecomment = [s]{/*}{*/}, + morecomment = [s]{/**}{*/}, + morestring = [b]", + morestring = [b]', +} + +\lstdefinelanguage{XML}{ + morestring = [b]", + moredelim = [s][\bfseries\color{listing-keyword}]{<}{\ }, + moredelim = [s][\bfseries\color{listing-keyword}]{</}{>}, + moredelim = [l][\bfseries\color{listing-keyword}]{/>}, + moredelim = [l][\bfseries\color{listing-keyword}]{>}, + morecomment = [s]{<?}{?>}, + morecomment = [s]{<!--}{-->}, + commentstyle = \color{listing-comment}, + stringstyle = \color{listing-string}, + identifierstyle = \color{listing-identifier} +} +$endif$ + +% +% header and footer +% +$if(beamer)$ +$else$ +$if(disable-header-and-footer)$ +$else$ +\usepackage{fancyhdr} + +\fancypagestyle{eisvogel-header-footer}{ + \fancyhead{} + \fancyfoot{} + \lhead[$if(header-right)$$header-right$$else$$date$$endif$]{$if(header-left)$$header-left$$else$$title$$endif$} + \chead[$if(header-center)$$header-center$$else$$endif$]{$if(header-center)$$header-center$$else$$endif$} + \rhead[$if(header-left)$$header-left$$else$$title$$endif$]{$if(header-right)$$header-right$$else$$date$$endif$} + \lfoot[$if(footer-right)$$footer-right$$else$\thepage$endif$]{$if(footer-left)$$footer-left$$else$$for(author)$$author$$sep$, $endfor$$endif$} + \cfoot[$if(footer-center)$$footer-center$$else$$endif$]{$if(footer-center)$$footer-center$$else$$endif$} + \rfoot[$if(footer-left)$$footer-left$$else$$for(author)$$author$$sep$, $endfor$$endif$]{$if(footer-right)$$footer-right$$else$\thepage$endif$} + \renewcommand{\headrulewidth}{0.4pt} + \renewcommand{\footrulewidth}{0.4pt} +} +\pagestyle{eisvogel-header-footer} +$if(page-background)$ +\backgroundsetup{ +scale=1, +color=black, +opacity=$if(page-background-opacity)$$page-background-opacity$$else$0.2$endif$, +angle=0, +contents={% + \includegraphics[width=\paperwidth,height=\paperheight]{$page-background$} + }% +} +$endif$ +$endif$ +$endif$ + +%% +%% end added +%% + +\begin{document} + +%% +%% begin titlepage +%% +$if(beamer)$ +$else$ +$if(titlepage)$ +\begin{titlepage} +$if(titlepage-background)$ +\newgeometry{top=2cm, right=4cm, bottom=3cm, left=4cm} +$else$ +\newgeometry{left=6cm} +$endif$ +$if(titlepage-color)$ +\definecolor{titlepage-color}{HTML}{$titlepage-color$} +\newpagecolor{titlepage-color}\afterpage{\restorepagecolor} +$endif$ +$if(titlepage-background)$ +\tikz[remember picture,overlay] \node[inner sep=0pt] at (current page.center){\includegraphics[width=\paperwidth,height=\paperheight]{$titlepage-background$}}; +$endif$ +\newcommand{\colorRule}[3][black]{\textcolor[HTML]{#1}{\rule{#2}{#3}}} +\begin{flushleft} +\noindent +\\[-1em] +\color[HTML]{$if(titlepage-text-color)$$titlepage-text-color$$else$5F5F5F$endif$} +\makebox[0pt][l]{\colorRule[$if(titlepage-rule-color)$$titlepage-rule-color$$else$435488$endif$]{1.3\textwidth}{$if(titlepage-rule-height)$$titlepage-rule-height$$else$4$endif$pt}} +\par +\noindent + +$if(logo)$ +\noindent +\includegraphics[width=$if(logo-width)$$logo-width$$else$100$endif$pt, right]{$logo$} +$endif$ + + +$if(titlepage-background)$ +% The titlepage with a background image has other text spacing and text size +{ + \setstretch{2} + \vfill + \vskip -8em + \noindent {\huge \textbf{\textsf{$title$}}} + $if(subtitle)$ + \vskip 1em + {\Large \textsf{$subtitle$}} + $endif$ + \vskip 2em + \noindent {\Large \textsf{$for(author)$$author$$sep$, $endfor$} \vskip 0.6em \textsf{$date$}} + \vfill +} +$else$ +{ + \setstretch{1.4} + \vfill + \noindent {\huge \textbf{\textsf{$title$}}} + $if(subtitle)$ + \vskip 1em + {\Large \textsf{$subtitle$}} + $endif$ + \vskip 2em + \noindent {\Large \textsf{$for(author)$$author$$sep$, $endfor$}} + \vfill +} +$endif$ + + +$if(titlepage-background)$ +$else$ +\textsf{$date$} +$endif$ +\end{flushleft} +\end{titlepage} +\restoregeometry +$endif$ +$endif$ + +%% +%% end titlepage +%% + +$if(has-frontmatter)$ +\frontmatter +$endif$ +$if(title)$ +$if(beamer)$ +\frame{\titlepage} +$endif$ +$if(abstract)$ +\begin{abstract} +$abstract$ +\end{abstract} +$endif$ +$endif$ + +$if(first-chapter)$ +\setcounter{chapter}{$first-chapter$} +\addtocounter{chapter}{-1} +$endif$ + +$for(include-before)$ +$include-before$ + +$endfor$ +$if(toc)$ +$if(toc-title)$ +\renewcommand*\contentsname{$toc-title$} +$endif$ +$if(beamer)$ +\begin{frame} +$if(toc-title)$ + \frametitle{$toc-title$} +$endif$ + \tableofcontents[hideallsubsections] +\end{frame} +$if(toc-own-page)$ +\newpage +$endif$ +$else$ +{ +$if(colorlinks)$ +\hypersetup{linkcolor=$if(toccolor)$$toccolor$$else$$endif$} +$endif$ +\setcounter{tocdepth}{$if(toc-depth)$$toc-depth$$else$3$endif$} +\tableofcontents +$if(toc-own-page)$ +\newpage +$endif$ +} +$endif$ +$endif$ +$if(lot)$ +\listoftables +\newpage +$endif$ +$if(lof)$ +\listoffigures +\newpage +$endif$ +$if(linestretch)$ +\setstretch{$linestretch$} +$endif$ +$if(has-frontmatter)$ +\mainmatter +$endif$ +$body$ + +$if(has-frontmatter)$ +\backmatter +$endif$ +$if(natbib)$ +$if(bibliography)$ +$if(biblio-title)$ +$if(has-chapters)$ +\renewcommand\bibname{$biblio-title$} +$else$ +\renewcommand\refname{$biblio-title$} +$endif$ +$endif$ +$if(beamer)$ +\begin{frame}[allowframebreaks]{$biblio-title$} + \bibliographytrue +$endif$ + \bibliography{$for(bibliography)$$bibliography$$sep$,$endfor$} +$if(beamer)$ +\end{frame} +$endif$ + +$endif$ +$endif$ +$if(biblatex)$ +$if(beamer)$ +\begin{frame}[allowframebreaks]{$biblio-title$} + \bibliographytrue + \printbibliography[heading=none] +\end{frame} +$else$ +\printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$ +$endif$ + +$endif$ +$for(include-after)$ +$include-after$ + +$endfor$ +\end{document} diff --git a/doc/vec.conf b/doc/vec.conf new file mode 100644 index 0000000..856e7eb --- /dev/null +++ b/doc/vec.conf @@ -0,0 +1,243 @@ + + +############################################################################# +# Parser keywords +############################################################################# +# Polarity +HIGHActiveSuffix=_pi +LOWActiveSuffix=_ni + +# Special ports +#resetName=rst_n +#clockName=clk +resetName=rst_ni +clockName=clk_i +#resetName=rst_pi +#clockName=clk_i +#resetName=rst_i +#clockName=clk_i +#clockName=CLOCK_50 +#resetName=KEY +#resetName=reset +#clockName=clock + +# Default label to print above entity box. Leave empty if no label is desired +default_label= + + +############################################################################# +# Font settings +############################################################################# +# Label +label.fontFamily=Arial +label.fontSize=10pt +label.fontWeight=normal + +# Entity +entity.fontFamily=Arial +entity.fontSize=12pt +entity.fontWeight=bold + +#Port +port.fontFamily=Arial +port.fontSize=12pt +port.fontWeight=normal + +# Generic signal +genericSignal.fontFamily=Arial +genericSignal.fontSize=10pt +genericSignal.fontWeight=normal + +# Vector +vector.fontFamily=Arial +vector.fontSize=10pt +vector.fontWeight=normal + + +############################################################################# +# Shape settings +############################################################################# +# Margin +vertical_Margin=0.5 +horizontal_Margin=0.5 +fixed_Width=0 + +# Label +label.stroke=none +label.strokeWidth=0.00cm +label.strokeColor=#000000 +label.fill=none +label.fillColor=#FFFFFF + +# Entity +entity.stroke=solid +entity.strokeWidth=0.05cm +entity.strokeColor=#000000 +entity.fill=solid +entity.fillColor=#FFFFFF + +# Port +port.stroke=none +port.strokeWidth=0.00cm +port.strokeColor=#FFF +port.fill=none +port.fillColor=#FFFFFF + +# Connector +connector.stroke=solid +connector.strokeWidth=0.025cm +connector.strokeColor=#000000 +connector.fill=solid +connector.fillColor=#FFFFFF + +# Generics +generics.stroke=solid +generics.strokeWidth=0.02cm +generics.strokeColor=#BFBFBF +generics.fill=solid +generics.fillColor=#F2F2F2 + +# Generic signal +genericSignal.stroke=none +genericSignal.strokeWidth=0.00cm +genericSignal.strokeColor=#C2C2C2 +genericSignal.fill=none +genericSignal.fillColor=#FFFFFF + + +############################################################################# +# Doku Wiki markup settings +############################################################################# +DokuWiki.enableExport=0 + +# If left empty the output files will be placed in the same directory where the executable is located. +# Both absolute and relative path are working +DokuWiki.outputPath=dokuwiki + + +############################################################################# +# Markdown settings +############################################################################# +Markdown.enableExport=0 + +# If left empty the output files will be placed in the same directory where the executable is located. +# Both absolute and relative path are working +Markdown.outputPath=markdown + + +############################################################################# +# LaTeX settings +############################################################################# +LaTeX.enableExport=0 + +# If left empty the output files will be placed in the same directory where the executable is located. +# Both absolute and relative path are working +LaTeX.outputPath=latex + +# VEC can add a 'table' environment to label and place the actual tabular element. +# VEC will use the entity name as caption and label +LaTeX.addTable=1 +LaTeX.centering=1 +LaTeX.caption=1 +LaTeX.label=1 + + +############################################################################# +# Table export settings +############################################################################# +# Set the entity information the table should contain +Table.exportType=1 +Table.exportDirection=1 +Table.exportPolarity=1 +Table.exportDescription=1 +Table.exportBlank1=0 +Table.exportBlank2=0 + +# Export generics. Generate a seperate table for generic signals +Table.exportGenerics=1 + +# Heading formatting +Table.boldHeadings=1 + +# Column alignments +Table.centeredName=0 +Table.centeredType=0 +Table.centeredDirection=1 +Table.centeredPolarity=1 +Table.centeredDescription=0 +Table.centeredBlank=0 +Table.centeredGenericName=0 +Table.centeredGenericType=0 +Table.centeredGenericDefaultValue=0 + +# Column headings +Table.Name_heading=Name +Table.Type_heading=Type +Table.Direction_heading=Direction +Table.Polarity_heading=Polarity +Table.Description_heading=Description +Table.Blank1_heading=Blank1 +Table.Blank2_heading=Blank2 +Table.GenericName=Name +Table.GenericType=Type +Table.GenericDefaultValue=Default value + +# Captions for the port directions +Table.caption_IN=IN +Table.caption_OUT=OUT +Table.caption_INOUT=INOUT +Table.caption_BUFFER=BUFFER +Table.caption_LINKAGE=LINKAGE + +# Polarity labels +Table.caption_HIGHactive=HIGH +Table.caption_LOWactive=LOW + +# Vector settings +Table.combineNameAndType=0 +Table.showArrayLength=1 +Table.arrayNotation=1 + + +############################################################################# +# PATH settings +############################################################################# +# Path to LibreOffice executable. +# e.g. for WINDOWS +# C:\Program Files (x86)\LibreOffice 4.0\program\soffice.exe +# e.g. for UNIX platforms +# /usr/bin/soffice + +#PATH.soffice=C:\Program Files (x86)\LibreOffice 3.6\program\soffice.exe +PATH.soffice=/usr/bin/soffice + + +############################################################################# +# FODG Export +############################################################################# +FODG.enableExport=1 + +# If left empty the output files will be placed in the same directory where the executable is located +#FODG.outputPath=fodg +FODG.outputPath=. + + +############################################################################# +# PNG Export +############################################################################# +PNG.enableExport=1 + +# If left empty the output files will be placed in the same directory where the executable is located +#PNG.outputPath=png +PNG.outputPath=. + + +############################################################################# +# SVG Export +############################################################################# +SVG.enableExport=0 + +# If left empty the output files will be placed in the same directory where the executable is located +#SVG.outputPath=svg +SVG.outputPath=. + diff --git a/matlab/audio/audio_first.slx b/matlab/audio/audio_first.slx Binary files differnew file mode 100644 index 0000000..848e1be --- /dev/null +++ b/matlab/audio/audio_first.slx diff --git a/matlab/audio/audio_tone.slx b/matlab/audio/audio_tone.slx Binary files differnew file mode 100644 index 0000000..5b8586b --- /dev/null +++ b/matlab/audio/audio_tone.slx diff --git a/matlab/audio/makefile b/matlab/audio/makefile new file mode 100644 index 0000000..37ef569 --- /dev/null +++ b/matlab/audio/makefile @@ -0,0 +1,4 @@ +PROJECT=audio_first +TOPLEVEL=$(PROJECT)/ml_audio + +include ../makefile diff --git a/matlab/makefile b/matlab/makefile new file mode 100644 index 0000000..2832597 --- /dev/null +++ b/matlab/makefile @@ -0,0 +1,15 @@ +################################################################### +# Main Targets +################################################################### + +help: + @echo '"make" does intentionally nothing. Type:' + @echo ' "make hdl" - create vhdl files from matlab simulink model' + @echo ' "make clean" - to remove all generated files' + +hdl: $(PROJECT).slx + # create hdl from matlab + matlab -nodisplay -nosplash -nodesktop -r "$(PROJECT); makehdl('$(TOPLEVEL)') ;exit;" + +clean: + rm -rf hdl_prj slprj *~ diff --git a/pnr/de1_and2gate/de1_and2gate_pins.tcl b/pnr/de1_and2gate/de1_and2gate_pins.tcl new file mode 100644 index 0000000..9c70aec --- /dev/null +++ b/pnr/de1_and2gate/de1_and2gate_pins.tcl @@ -0,0 +1,10 @@ +# assign pin locations to a quartus project + +#---------------------------------------------------------------------- +# Pin Assignments +set_location_assignment PIN_L22 -to SW[0] +set_location_assignment PIN_L21 -to SW[1] +set_location_assignment PIN_R20 -to LEDR[0] +set_location_assignment PIN_R19 -to LEDR[1] +set_location_assignment PIN_U19 -to LEDR[2] +# ---------------------------------------------------------------------------- diff --git a/pnr/de1_and2gate/makefile b/pnr/de1_and2gate/makefile new file mode 100644 index 0000000..103b8c1 --- /dev/null +++ b/pnr/de1_and2gate/makefile @@ -0,0 +1,53 @@ +## ---------------------------------------------------------------------------- +## Script : makefile +## ---------------------------------------------------------------------------- +## Author : Johann Faerber, Friedrich Beckmann +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: This makefile allows automating design flow with Quartus, +## it is based on a design directory structure described in +## ../makefile +## ---------------------------------------------------------------------------- + +################################################################### +# Project Configuration: +# +# - assign variable SIM_PROJECT_NAME with the top level project name +# - add additional VHDL sources to SOURCE_FILES, if necessary +# +# Prerequisite: +# - mandatory design directory structure (see end of file) +# - assumes file name of top level entity de1_$(PROJECT)_structure.vhd +################################################################### + +SIM_PROJECT_NAME = and2gate +PROJECT = de1_$(SIM_PROJECT_NAME) + +# Prototype Board FPGA family and device settings +# DE1 +FAMILY = "Cyclone II" +DEVICE = EP2C20F484C7 +PROGFILEEXT = sof +# DEMMK +# FAMILY = "MAX II" +# DEVICE = EPM2210F324C3 +# PROGFILEEXT = pof +# DE2 +#FAMILY = "Cyclone II" +#DEVICE = EP2C35F484C7 +#PROGFILEEXT = sof +# DE0 +#FAMILY = "Cyclone IV E" +#DEVICE = EP4CE22F17C6 +#PROGFILEEXT = sof + +# Here the VHDL files for synthesis are defined. +include ../../sim/$(SIM_PROJECT_NAME)/makefile.sources + +# Add the toplevel fpga vhdl file +SOURCE_FILES = $(SYN_SOURCE_FILES) \ +../../src/$(PROJECT)_structure.vhd + +include ../makefile + + diff --git a/pnr/de1_audio/de1_audio_pins.tcl b/pnr/de1_audio/de1_audio_pins.tcl new file mode 100644 index 0000000..28fe709 --- /dev/null +++ b/pnr/de1_audio/de1_audio_pins.tcl @@ -0,0 +1,23 @@ +# Pin Configuration +set_location_assignment PIN_L1 -to CLOCK_50 +set_location_assignment PIN_R22 -to KEY0 +set_location_assignment PIN_A3 -to I2C_SCLK +set_location_assignment PIN_B3 -to I2C_SDAT +set_location_assignment PIN_A6 -to AUD_ADCLRCK +set_location_assignment PIN_B6 -to AUD_ADCDAT +set_location_assignment PIN_A5 -to AUD_DACLRCK +set_location_assignment PIN_B5 -to AUD_DACDAT +set_location_assignment PIN_B4 -to AUD_XCK +set_location_assignment PIN_A4 -to AUD_BCLK +set_location_assignment PIN_R20 -to LEDR[0] +set_location_assignment PIN_R19 -to LEDR[1] +set_location_assignment PIN_U19 -to LEDR[2] +set_location_assignment PIN_Y19 -to LEDR[3] +set_location_assignment PIN_T18 -to LEDR[4] +set_location_assignment PIN_V19 -to LEDR[5] +set_location_assignment PIN_Y18 -to LEDR[6] +set_location_assignment PIN_U18 -to LEDR[7] +set_location_assignment PIN_R18 -to LEDR[8] +set_location_assignment PIN_R17 -to LEDR[9] + + diff --git a/pnr/de1_audio/makefile b/pnr/de1_audio/makefile new file mode 100644 index 0000000..0a8636c --- /dev/null +++ b/pnr/de1_audio/makefile @@ -0,0 +1,16 @@ +SIM_PROJECT_NAME = de1_audio +PROJECT = $(SIM_PROJECT_NAME) + +# Here the VHDL files for synthesis are defined. +include ../../sim/$(SIM_PROJECT_NAME)/makefile.sources + +# Add the toplevel fpga vhdl file +SOURCE_FILES = $(SYN_SOURCE_FILES) + +FAMILY = "Cyclone II" +DEVICE = EP2C20F484C7 +PROGFILEEXT = sof + +include ../makefile + + diff --git a/pnr/de1_binto7segment/de1_binto7segment_pins.tcl b/pnr/de1_binto7segment/de1_binto7segment_pins.tcl new file mode 100644 index 0000000..ad20fb6 --- /dev/null +++ b/pnr/de1_binto7segment/de1_binto7segment_pins.tcl @@ -0,0 +1,20 @@ +# assign pin locations to a quartus project
+
+#----------------------------------------------------------------------
+# Pin Assignments
+set_location_assignment PIN_L22 -to SW[0]
+set_location_assignment PIN_L21 -to SW[1]
+set_location_assignment PIN_M22 -to SW[2]
+set_location_assignment PIN_V12 -to SW[3]
+set_location_assignment PIN_R20 -to LEDR[0]
+set_location_assignment PIN_R19 -to LEDR[1]
+set_location_assignment PIN_U19 -to LEDR[2]
+set_location_assignment PIN_Y19 -to LEDR[3]
+set_location_assignment PIN_J2 -to HEX0[0]
+set_location_assignment PIN_J1 -to HEX0[1]
+set_location_assignment PIN_H2 -to HEX0[2]
+set_location_assignment PIN_H1 -to HEX0[3]
+set_location_assignment PIN_F2 -to HEX0[4]
+set_location_assignment PIN_F1 -to HEX0[5]
+set_location_assignment PIN_E2 -to HEX0[6]
+# ----------------------------------------------------------------------------
diff --git a/pnr/de1_binto7segment/makefile b/pnr/de1_binto7segment/makefile new file mode 100644 index 0000000..60faed4 --- /dev/null +++ b/pnr/de1_binto7segment/makefile @@ -0,0 +1,53 @@ +## ----------------------------------------------------------------------------
+## Script : makefile
+## ----------------------------------------------------------------------------
+## Author : Johann Faerber, Friedrich Beckmann
+## Company : University of Applied Sciences Augsburg
+## ----------------------------------------------------------------------------
+## Description: This makefile allows automating design flow with Quartus,
+## it is based on a design directory structure described in
+## ../makefile
+## ----------------------------------------------------------------------------
+
+###################################################################
+# Project Configuration:
+#
+# - assign variable SIM_PROJECT_NAME with the top level project name
+# - add additional VHDL sources to SOURCE_FILES, if necessary
+#
+# Prerequisite:
+# - mandatory design directory structure (see end of file)
+# - assumes file name of top level entity de1_$(PROJECT)_structure.vhd
+###################################################################
+
+SIM_PROJECT_NAME = binto7segment
+PROJECT = de1_$(SIM_PROJECT_NAME)
+
+# Prototype Board FPGA family and device settings
+# DE1
+FAMILY = "Cyclone II"
+DEVICE = EP2C20F484C7
+PROGFILEEXT = sof
+# DEMMK
+# FAMILY = "MAX II"
+# DEVICE = EPM2210F324C3
+# PROGFILEEXT = pof
+# DE2
+#FAMILY = "Cyclone II"
+#DEVICE = EP2C35F484C7
+#PROGFILEEXT = sof
+# DE0
+#FAMILY = "Cyclone IV E"
+#DEVICE = EP4CE22F17C6
+#PROGFILEEXT = sof
+
+# Here the VHDL files for synthesis are defined.
+include ../../sim/$(SIM_PROJECT_NAME)/makefile.sources
+
+# Add the toplevel fpga vhdl file
+SOURCE_FILES = $(SYN_SOURCE_FILES) \
+../../src/$(PROJECT)_structure.vhd
+
+include ../makefile
+
+
diff --git a/pnr/de1_cntdn/de1_cntdn_pins.tcl b/pnr/de1_cntdn/de1_cntdn_pins.tcl new file mode 100644 index 0000000..cb02476 --- /dev/null +++ b/pnr/de1_cntdn/de1_cntdn_pins.tcl @@ -0,0 +1,14 @@ +# assign pin locations to a quartus project + +#---------------------------------------------------------------------- +# Pin Assignments +set_location_assignment PIN_L1 -to CLOCK_50 +set_location_assignment PIN_R22 -to KEY[0] +set_location_assignment PIN_R21 -to KEY[1] +set_location_assignment PIN_H12 -to GPO_1[0] +set_location_assignment PIN_H13 -to GPO_1[1] +set_location_assignment PIN_H14 -to GPO_1[2] +set_location_assignment PIN_G15 -to GPO_1[3] +set_location_assignment PIN_E14 -to GPO_1[4] +set_location_assignment PIN_E15 -to GPO_1[5] +# ---------------------------------------------------------------------------- diff --git a/pnr/de1_cntdn/makefile b/pnr/de1_cntdn/makefile new file mode 100644 index 0000000..fc13333 --- /dev/null +++ b/pnr/de1_cntdn/makefile @@ -0,0 +1,53 @@ +## ---------------------------------------------------------------------------- +## Script : makefile +## ---------------------------------------------------------------------------- +## Author : Johann Faerber, Friedrich Beckmann +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: This makefile allows automating design flow with Quartus, +## it is based on a design directory structure described in +## ../makefile +## ---------------------------------------------------------------------------- + +################################################################### +# Project Configuration: +# +# - assign variable SIM_PROJECT_NAME with the top level project name +# - add additional VHDL sources to SOURCE_FILES, if necessary +# +# Prerequisite: +# - mandatory design directory structure (see end of file) +# - assumes file name of top level entity de1_$(PROJECT)_structure.vhd +################################################################### + +SIM_PROJECT_NAME = cntdn +PROJECT = de1_$(SIM_PROJECT_NAME) + +# Prototype Board FPGA family and device settings +# DE1 +FAMILY = "Cyclone II" +DEVICE = EP2C20F484C7 +PROGFILEEXT = sof +# DEMMK +# FAMILY = "MAX II" +# DEVICE = EPM2210F324C3 +# PROGFILEEXT = pof +# DE2 +#FAMILY = "Cyclone II" +#DEVICE = EP2C35F484C7 +#PROGFILEEXT = sof +# DE0 +#FAMILY = "Cyclone IV E" +#DEVICE = EP4CE22F17C6 +#PROGFILEEXT = sof + +# Here the VHDL files for synthesis are defined. +include ../../sim/$(SIM_PROJECT_NAME)/makefile.sources + +# Add the toplevel fpga vhdl file +SOURCE_FILES = $(SYN_SOURCE_FILES) \ +../../src/$(PROJECT)_structure.vhd + +include ../makefile + + diff --git a/pnr/de1_cntdnmodm/de1_cntdnmodm_pins.tcl b/pnr/de1_cntdnmodm/de1_cntdnmodm_pins.tcl new file mode 100644 index 0000000..81d32b6 --- /dev/null +++ b/pnr/de1_cntdnmodm/de1_cntdnmodm_pins.tcl @@ -0,0 +1,16 @@ +# assign pin locations to a quartus project + +#---------------------------------------------------------------------- +# Pin Assignments +set_location_assignment PIN_L1 -to CLOCK_50 +set_location_assignment PIN_R22 -to KEY[0] +set_location_assignment PIN_R21 -to KEY[1] +set_location_assignment PIN_H12 -to GPO_1[0] +set_location_assignment PIN_H13 -to GPO_1[1] +set_location_assignment PIN_H14 -to GPO_1[2] +set_location_assignment PIN_G15 -to GPO_1[3] +set_location_assignment PIN_E14 -to GPO_1[4] +set_location_assignment PIN_E15 -to GPO_1[5] +set_location_assignment PIN_F15 -to GPO_1[6] +set_location_assignment PIN_G16 -to GPO_1[7] +# ---------------------------------------------------------------------------- diff --git a/pnr/de1_cntdnmodm/makefile b/pnr/de1_cntdnmodm/makefile new file mode 100644 index 0000000..72e14e0 --- /dev/null +++ b/pnr/de1_cntdnmodm/makefile @@ -0,0 +1,53 @@ +## ---------------------------------------------------------------------------- +## Script : makefile +## ---------------------------------------------------------------------------- +## Author : Johann Faerber, Friedrich Beckmann +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: This makefile allows automating design flow with Quartus, +## it is based on a design directory structure described in +## ../makefile +## ---------------------------------------------------------------------------- + +################################################################### +# Project Configuration: +# +# - assign variable SIM_PROJECT_NAME with the top level project name +# - add additional VHDL sources to SOURCE_FILES, if necessary +# +# Prerequisite: +# - mandatory design directory structure (see end of file) +# - assumes file name of top level entity de1_$(PROJECT)_structure.vhd +################################################################### + +SIM_PROJECT_NAME = cntdnmodm +PROJECT = de1_$(SIM_PROJECT_NAME) + +# Prototype Board FPGA family and device settings +# DE1 +FAMILY = "Cyclone II" +DEVICE = EP2C20F484C7 +PROGFILEEXT = sof +# DEMMK +# FAMILY = "MAX II" +# DEVICE = EPM2210F324C3 +# PROGFILEEXT = pof +# DE2 +#FAMILY = "Cyclone II" +#DEVICE = EP2C35F484C7 +#PROGFILEEXT = sof +# DE0 +#FAMILY = "Cyclone IV E" +#DEVICE = EP4CE22F17C6 +#PROGFILEEXT = sof + +# Here the VHDL files for synthesis are defined. +include ../../sim/$(SIM_PROJECT_NAME)/makefile.sources + +# Add the toplevel fpga vhdl file +SOURCE_FILES = $(SYN_SOURCE_FILES) \ +../../src/$(PROJECT)_structure.vhd + +include ../makefile + + diff --git a/pnr/de1_incrementer/de1_incrementer_pins.tcl b/pnr/de1_incrementer/de1_incrementer_pins.tcl new file mode 100644 index 0000000..7f21d8a --- /dev/null +++ b/pnr/de1_incrementer/de1_incrementer_pins.tcl @@ -0,0 +1,25 @@ +# assign pin locations to a quartus project + +#---------------------------------------------------------------------- +# Pin Assignments +set_location_assignment PIN_L1 -to CLOCK_50 +set_location_assignment PIN_R22 -to KEY +set_location_assignment PIN_H12 -to GPI_1[0] +set_location_assignment PIN_H13 -to GPI_1[1] +set_location_assignment PIN_U22 -to LEDG[0] +set_location_assignment PIN_U21 -to LEDG[1] +set_location_assignment PIN_J2 -to HEX0[0] +set_location_assignment PIN_J1 -to HEX0[1] +set_location_assignment PIN_H2 -to HEX0[2] +set_location_assignment PIN_H1 -to HEX0[3] +set_location_assignment PIN_F2 -to HEX0[4] +set_location_assignment PIN_F1 -to HEX0[5] +set_location_assignment PIN_E2 -to HEX0[6] +set_location_assignment PIN_E1 -to HEX1[0] +set_location_assignment PIN_H6 -to HEX1[1] +set_location_assignment PIN_H5 -to HEX1[2] +set_location_assignment PIN_H4 -to HEX1[3] +set_location_assignment PIN_G3 -to HEX1[4] +set_location_assignment PIN_D2 -to HEX1[5] +set_location_assignment PIN_D1 -to HEX1[6] +# ---------------------------------------------------------------------------- diff --git a/pnr/de1_incrementer/makefile b/pnr/de1_incrementer/makefile new file mode 100644 index 0000000..2202ce2 --- /dev/null +++ b/pnr/de1_incrementer/makefile @@ -0,0 +1,55 @@ +## ---------------------------------------------------------------------------- +## Script : makefile +## ---------------------------------------------------------------------------- +## Author : Johann Faerber, Friedrich Beckmann +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: This makefile allows automating design flow with Quartus, +## it is based on a design directory structure described in +## ../makefile +## ---------------------------------------------------------------------------- + +################################################################### +# Project Configuration: +# +# - assign variable SIM_PROJECT_NAME with the top level project name +# - add additional VHDL sources to SOURCE_FILES, if necessary +# +# Prerequisite: +# - mandatory design directory structure (see end of file) +# - assumes file name of top level entity de1_$(PROJECT)_structure.vhd +################################################################### + +SIM_PROJECT_NAME = incrementer +PROJECT = de1_$(SIM_PROJECT_NAME) + +# Prototype Board FPGA family and device settings +# DE1 +FAMILY = "Cyclone II" +DEVICE = EP2C20F484C7 +PROGFILEEXT = sof +# DEMMK +# FAMILY = "MAX II" +# DEVICE = EPM2210F324C3 +# PROGFILEEXT = pof +# DE2 +#FAMILY = "Cyclone II" +#DEVICE = EP2C35F484C7 +#PROGFILEEXT = sof +# DE0 +#FAMILY = "Cyclone IV E" +#DEVICE = EP4CE22F17C6 +#PROGFILEEXT = sof + +# Here the VHDL files for synthesis are defined. +include ../../sim/$(SIM_PROJECT_NAME)/makefile.sources + +# Add the toplevel fpga vhdl file +SOURCE_FILES = $(SYN_SOURCE_FILES) \ +../../src/binto7segment_truthtable.vhd \ +../../src/synchroniser_rtl.vhd \ +../../src/$(PROJECT)_structure.vhd + +include ../makefile + + diff --git a/pnr/de1_mux2to1/de1_mux2to1_pins.tcl b/pnr/de1_mux2to1/de1_mux2to1_pins.tcl new file mode 100644 index 0000000..d6984a3 --- /dev/null +++ b/pnr/de1_mux2to1/de1_mux2to1_pins.tcl @@ -0,0 +1,9 @@ +# assign pin locations to a quartus project
+
+#----------------------------------------------------------------------
+# Pin Assignments
+set_location_assignment PIN_L22 -to SW[0]
+set_location_assignment PIN_L21 -to SW[1]
+set_location_assignment PIN_M22 -to SW[2]
+set_location_assignment PIN_R20 -to LEDR
+# ----------------------------------------------------------------------------
diff --git a/pnr/de1_mux2to1/makefile b/pnr/de1_mux2to1/makefile new file mode 100644 index 0000000..b4c830b --- /dev/null +++ b/pnr/de1_mux2to1/makefile @@ -0,0 +1,87 @@ +## ----------------------------------------------------------------------------
+## Script : makefile
+## ----------------------------------------------------------------------------
+## Author : Johann Faerber, Friedrich Beckmann
+## Company : University of Applied Sciences Augsburg
+## ----------------------------------------------------------------------------
+## Description: This makefile allows automating design flow with Quartus,
+## it is based on a design directory structure described in
+## ../makefile
+## ----------------------------------------------------------------------------
+
+###################################################################
+# Project Configuration:
+#
+# - assign variable SIM_PROJECT_NAME with the top level project name
+# - add additional VHDL sources to SOURCE_FILES, if necessary
+#
+# Prerequisite:
+# - mandatory design directory structure (see end of file)
+# - assumes file name of top level entity de1_$(PROJECT)_structure.vhd
+###################################################################
+
+SIM_PROJECT_NAME = mux2to1
+PROJECT = de1_$(SIM_PROJECT_NAME)
+
+# Prototype Board FPGA family and device settings
+# DE1
+FAMILY = "Cyclone II"
+DEVICE = EP2C20F484C7
+PROGFILEEXT = sof
+# DEMMK
+# FAMILY = "MAX II"
+# DEVICE = EPM2210F324C3
+# PROGFILEEXT = pof
+# DE2
+#FAMILY = "Cyclone II"
+#DEVICE = EP2C35F484C7
+#PROGFILEEXT = sof
+# DE0
+#FAMILY = "Cyclone IV E"
+#DEVICE = EP4CE22F17C6
+#PROGFILEEXT = sof
+
+# Here the VHDL files for synthesis are defined.
+include ../../sim/$(SIM_PROJECT_NAME)/makefile.sources
+
+# Add the toplevel fpga vhdl file
+SOURCE_FILES = $(SYN_SOURCE_FILES) \
+../../src/$(PROJECT)_structure.vhd
+
+include ../makefile
+
+## ----------------------------------------------------------------------------
+## Description:
+## ------------
+## assumes the following design directory structure as prerequisite
+##
+## DigitaltechnikPraktikum
+## |
+## +---src
+## | and2gate_equation.vhd
+## | invgate_equation.vhd
+## | mux2to1_structure.vhd
+## | or2gate_equation.vhd
+## | t_mux2to1.vhd
+## | de1_mux2to1_structure.vhd
+## |
+## +---sim
+## | | makefile
+## | |
+## | \---mux2to1
+## | makefile
+## | makefile.sources
+## |
+## +---pnr
+## | | makefile
+## | |
+## | \---de1_mux2to1
+## | de1_mux2to1_pins.tcl
+## | makefile
+## |
+## \---scripts
+## de1_pin_assignments_minimumio.csv
+## de1_pin_assignments_minimumio.tcl
+## modelsim.ini
+## quartus_project_settings.tcl
+## ----------------------------------------------------------------------------
diff --git a/pnr/de1_pwm/de1_pwm_pins.tcl b/pnr/de1_pwm/de1_pwm_pins.tcl new file mode 100644 index 0000000..1d79959 --- /dev/null +++ b/pnr/de1_pwm/de1_pwm_pins.tcl @@ -0,0 +1,27 @@ +# assign pin locations to a quartus project
+
+#----------------------------------------------------------------------
+# Pin Assignments
+set_location_assignment PIN_L1 -to CLOCK_50
+set_location_assignment PIN_R22 -to KEY[0]
+set_location_assignment PIN_R21 -to KEY[1]
+set_location_assignment PIN_L22 -to SW[0]
+set_location_assignment PIN_L21 -to SW[1]
+set_location_assignment PIN_M22 -to SW[2]
+set_location_assignment PIN_V12 -to SW[3]
+set_location_assignment PIN_W12 -to SW[4]
+set_location_assignment PIN_U12 -to SW[5]
+set_location_assignment PIN_U11 -to SW[6]
+set_location_assignment PIN_M2 -to SW[7]
+set_location_assignment PIN_R20 -to LEDR[0]
+set_location_assignment PIN_R19 -to LEDR[1]
+set_location_assignment PIN_U19 -to LEDR[2]
+set_location_assignment PIN_Y19 -to LEDR[3]
+set_location_assignment PIN_T18 -to LEDR[4]
+set_location_assignment PIN_V19 -to LEDR[5]
+set_location_assignment PIN_Y18 -to LEDR[6]
+set_location_assignment PIN_U18 -to LEDR[7]
+set_location_assignment PIN_H12 -to GPO_1[0]
+set_location_assignment PIN_H13 -to GPO_1[1]
+set_location_assignment PIN_H14 -to GPO_1[2]
+# ----------------------------------------------------------------------------
diff --git a/pnr/de1_pwm/makefile b/pnr/de1_pwm/makefile new file mode 100644 index 0000000..5ed5024 --- /dev/null +++ b/pnr/de1_pwm/makefile @@ -0,0 +1,87 @@ +## ----------------------------------------------------------------------------
+## Script : makefile
+## ----------------------------------------------------------------------------
+## Author : Johann Faerber, Friedrich Beckmann
+## Company : University of Applied Sciences Augsburg
+## ----------------------------------------------------------------------------
+## Description: This makefile allows automating design flow with Quartus,
+## it is based on a design directory structure described in
+## ../makefile
+## ----------------------------------------------------------------------------
+
+###################################################################
+# Project Configuration:
+#
+# - assign variable SIM_PROJECT_NAME with the top level project name
+# - add additional VHDL sources to SOURCE_FILES, if necessary
+#
+# Prerequisite:
+# - mandatory design directory structure (see end of file)
+# - assumes file name of top level entity de1_$(PROJECT)_structure.vhd
+###################################################################
+
+SIM_PROJECT_NAME = pwm
+PROJECT = de1_$(SIM_PROJECT_NAME)
+
+# Prototype Board FPGA family and device settings
+# DE1
+FAMILY = "Cyclone II"
+DEVICE = EP2C20F484C7
+PROGFILEEXT = sof
+# DEMMK
+# FAMILY = "MAX II"
+# DEVICE = EPM2210F324C3
+# PROGFILEEXT = pof
+# DE2
+#FAMILY = "Cyclone II"
+#DEVICE = EP2C35F484C7
+#PROGFILEEXT = sof
+# DE0
+#FAMILY = "Cyclone IV E"
+#DEVICE = EP4CE22F17C6
+#PROGFILEEXT = sof
+
+# Here the VHDL files for synthesis are defined.
+include ../../sim/$(SIM_PROJECT_NAME)/makefile.sources
+
+# Add the toplevel fpga vhdl file
+SOURCE_FILES = $(SYN_SOURCE_FILES) \
+../../src/$(PROJECT)_structure.vhd
+
+include ../makefile
+
+## ----------------------------------------------------------------------------
+## Description:
+## ------------
+## assumes the following design directory structure as prerequisite
+##
+## DigitaltechnikPraktikum
+## |
+## +---src
+## | and2gate_equation.vhd
+## | invgate_equation.vhd
+## | mux2to1_structure.vhd
+## | or2gate_equation.vhd
+## | t_mux2to1.vhd
+## | de1_mux2to1_structure.vhd
+## |
+## +---sim
+## | | makefile
+## | |
+## | \---mux2to1
+## | makefile
+## | makefile.sources
+## |
+## +---pnr
+## | | makefile
+## | |
+## | \---de1_mux2to1
+## | de1_mux2to1_pins.tcl
+## | makefile
+## |
+## \---scripts
+## de1_pin_assignments_minimumio.csv
+## de1_pin_assignments_minimumio.tcl
+## modelsim.ini
+## quartus_project_settings.tcl
+## ----------------------------------------------------------------------------
diff --git a/pnr/de1_pwm_incrementer/de1_pwm_incrementer_pins.tcl b/pnr/de1_pwm_incrementer/de1_pwm_incrementer_pins.tcl new file mode 100644 index 0000000..8eba56a --- /dev/null +++ b/pnr/de1_pwm_incrementer/de1_pwm_incrementer_pins.tcl @@ -0,0 +1,36 @@ +# assign pin locations to a quartus project + +#---------------------------------------------------------------------- +# Pin Assignments +set_location_assignment PIN_L1 -to CLOCK_50 +set_location_assignment PIN_R22 -to KEY +set_location_assignment PIN_H12 -to GPI_1[0] +set_location_assignment PIN_H13 -to GPI_1[1] +set_location_assignment PIN_U22 -to LEDG[0] +set_location_assignment PIN_U21 -to LEDG[1] +set_location_assignment PIN_J2 -to HEX0[0] +set_location_assignment PIN_J1 -to HEX0[1] +set_location_assignment PIN_H2 -to HEX0[2] +set_location_assignment PIN_H1 -to HEX0[3] +set_location_assignment PIN_F2 -to HEX0[4] +set_location_assignment PIN_F1 -to HEX0[5] +set_location_assignment PIN_E2 -to HEX0[6] +set_location_assignment PIN_E1 -to HEX1[0] +set_location_assignment PIN_H6 -to HEX1[1] +set_location_assignment PIN_H5 -to HEX1[2] +set_location_assignment PIN_H4 -to HEX1[3] +set_location_assignment PIN_G3 -to HEX1[4] +set_location_assignment PIN_D2 -to HEX1[5] +set_location_assignment PIN_D1 -to HEX1[6] +set_location_assignment PIN_R20 -to LEDR[0] +set_location_assignment PIN_R19 -to LEDR[1] +set_location_assignment PIN_U19 -to LEDR[2] +set_location_assignment PIN_Y19 -to LEDR[3] +set_location_assignment PIN_T18 -to LEDR[4] +set_location_assignment PIN_V19 -to LEDR[5] +set_location_assignment PIN_Y18 -to LEDR[6] +set_location_assignment PIN_U18 -to LEDR[7] +set_location_assignment PIN_H14 -to GPO_1[2] +set_location_assignment PIN_G15 -to GPO_1[3] +set_location_assignment PIN_E14 -to GPO_1[4] +# ---------------------------------------------------------------------------- diff --git a/pnr/de1_pwm_incrementer/makefile b/pnr/de1_pwm_incrementer/makefile new file mode 100644 index 0000000..c894956 --- /dev/null +++ b/pnr/de1_pwm_incrementer/makefile @@ -0,0 +1,55 @@ +## ---------------------------------------------------------------------------- +## Script : makefile +## ---------------------------------------------------------------------------- +## Author : Johann Faerber, Friedrich Beckmann +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: This makefile allows automating design flow with Quartus, +## it is based on a design directory structure described in +## ../makefile +## ---------------------------------------------------------------------------- + +################################################################### +# Project Configuration: +# +# - assign variable SIM_PROJECT_NAME with the top level project name +# - add additional VHDL sources to SOURCE_FILES, if necessary +# +# Prerequisite: +# - mandatory design directory structure (see end of file) +# - assumes file name of top level entity de1_$(PROJECT)_structure.vhd +################################################################### + +SIM_PROJECT_NAME = pwm_incrementer +PROJECT = de1_$(SIM_PROJECT_NAME) + +# Prototype Board FPGA family and device settings +# DE1 +FAMILY = "Cyclone II" +DEVICE = EP2C20F484C7 +PROGFILEEXT = sof +# DEMMK +# FAMILY = "MAX II" +# DEVICE = EPM2210F324C3 +# PROGFILEEXT = pof +# DE2 +#FAMILY = "Cyclone II" +#DEVICE = EP2C35F484C7 +#PROGFILEEXT = sof +# DE0 +#FAMILY = "Cyclone IV E" +#DEVICE = EP4CE22F17C6 +#PROGFILEEXT = sof + +# Here the VHDL files for synthesis are defined. +include ../../sim/$(SIM_PROJECT_NAME)/makefile.sources + +# Add the toplevel fpga vhdl file +SOURCE_FILES = $(SYN_SOURCE_FILES) \ +../../src/binto7segment_truthtable.vhd \ +../../src/synchroniser_rtl.vhd \ +../../src/$(PROJECT)_structure.vhd + +include ../makefile + + diff --git a/pnr/de1_tone/de1_tone_pins.tcl b/pnr/de1_tone/de1_tone_pins.tcl new file mode 100644 index 0000000..e9c32ae --- /dev/null +++ b/pnr/de1_tone/de1_tone_pins.tcl @@ -0,0 +1,33 @@ +# Pin Configuration +set_location_assignment PIN_L1 -to CLOCK_50 +set_location_assignment PIN_R22 -to KEY0 +set_location_assignment PIN_A3 -to I2C_SCLK +set_location_assignment PIN_B3 -to I2C_SDAT +set_location_assignment PIN_A6 -to AUD_ADCLRCK +set_location_assignment PIN_B6 -to AUD_ADCDAT +set_location_assignment PIN_A5 -to AUD_DACLRCK +set_location_assignment PIN_B5 -to AUD_DACDAT +set_location_assignment PIN_B4 -to AUD_XCK +set_location_assignment PIN_A4 -to AUD_BCLK +set_location_assignment PIN_R20 -to LEDR[0] +set_location_assignment PIN_R19 -to LEDR[1] +set_location_assignment PIN_U19 -to LEDR[2] +set_location_assignment PIN_Y19 -to LEDR[3] +set_location_assignment PIN_T18 -to LEDR[4] +set_location_assignment PIN_V19 -to LEDR[5] +set_location_assignment PIN_Y18 -to LEDR[6] +set_location_assignment PIN_U18 -to LEDR[7] +set_location_assignment PIN_R18 -to LEDR[8] +set_location_assignment PIN_R17 -to LEDR[9] +set_location_assignment PIN_L22 -to SW[0] +set_location_assignment PIN_L21 -to SW[1] +set_location_assignment PIN_M22 -to SW[2] +set_location_assignment PIN_V12 -to SW[3] +set_location_assignment PIN_W12 -to SW[4] +set_location_assignment PIN_U12 -to SW[5] +set_location_assignment PIN_U11 -to SW[6] +set_location_assignment PIN_M2 -to SW[7] +set_location_assignment PIN_M1 -to SW[8] +set_location_assignment PIN_L2 -to SW[9] + + diff --git a/pnr/de1_tone/makefile b/pnr/de1_tone/makefile new file mode 100644 index 0000000..e9cf6e6 --- /dev/null +++ b/pnr/de1_tone/makefile @@ -0,0 +1,14 @@ +SIM_PROJECT_NAME = de1_tone +PROJECT = $(SIM_PROJECT_NAME) + +# Here the VHDL files for synthesis are defined. +include ../../sim/$(SIM_PROJECT_NAME)/makefile.sources + +# Add the toplevel fpga vhdl file +SOURCE_FILES = $(SYN_SOURCE_FILES) + +FAMILY = "Cyclone II" +DEVICE = EP2C20F484C7 +PROGFILEEXT = sof + +include ../makefile diff --git a/pnr/makefile b/pnr/makefile new file mode 100644 index 0000000..ffc1cf0 --- /dev/null +++ b/pnr/makefile @@ -0,0 +1,92 @@ +## ---------------------------------------------------------------------------- +## Script : makefile +## ---------------------------------------------------------------------------- +## Author : Johann Faerber, Friedrich Beckmann +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: This makefile allows automating design flow with Quartus, +## it is based on a design directory structure shown at +## the end of this file. +## ---------------------------------------------------------------------------- + +################################################################### +# Main Targets +# +################################################################### + +help: + @echo '"make" does intentionally nothing. Type:' + @echo ' "make qproject" to create quartus project only' + @echo ' "make compile" to synthesize the design' + @echo ' "make prog" to configure programmable device' + @echo ' "make quartus" to start quartus graphical user interface' + @echo ' "make clean" to remove all generated files' + +qproject: $(PROJECT).qpf + +$(PROJECT).sdc: + # create a default timing constraint file assuming CLOCK_50 + echo "create_clock -period 20.000 -name CLOCK_50 [get_ports CLOCK_50]" > $(PROJECT).sdc + echo "set_input_delay -clock CLOCK_50 2 [all_inputs]" >> $(PROJECT).sdc + echo "set_output_delay -clock CLOCK_50 2 [all_outputs]" >> $(PROJECT).sdc + +$(PROJECT).qpf: $(SOURCE_FILES) ../../scripts/create_quartus_project_settings.tcl $(PROJECT)_pins.tcl $(PROJECT).sdc + # assign VHDL design files + rm -rf quartus_vhdl_source_files.tcl + for source_file in $(SOURCE_FILES); do \ + echo set_global_assignment -name VHDL_FILE $$source_file >> quartus_vhdl_source_files.tcl; \ + done + # just create a quartus project + quartus_sh -t ../../scripts/create_quartus_project_settings.tcl -projectname $(PROJECT) -family $(FAMILY) -device $(DEVICE) + +compile: $(PROJECT).qpf flowsummary.log + +flowsummary.log: $(SOURCE_FILES) + quartus_sh -t ../../scripts/quartus_project_flow.tcl -projectname $(PROJECT) -process compile + +prog: $(PROJECT).qpf flowsummary.log + quartus_pgm -c USB-Blaster --mode jtag --operation="p;$(PROJECT).$(PROGFILEEXT)" + +quartus: $(PROJECT).qpf + # start quartus gui + quartus $(PROJECT).qpf & + +clean: + rm -rf *.rpt *.chg *.log quartus_vhdl_source_files.tcl *.htm *.eqn *.pin *.sof *.pof db incremental_db *.qpf *.qsf *.summary $(PROJECT).* *~ + +## ---------------------------------------------------------------------------- +## Description: +## ------------ +## assumes the following design directory structure as prerequisite +## +## DigitaltechnikPraktikum +## | +## +---src +## | and2gate_equation.vhd +## | invgate_equation.vhd +## | mux2to1_structure.vhd +## | or2gate_equation.vhd +## | t_mux2to1.vhd +## | de1_mux2to1_structure.vhd +## | +## +---sim +## | | makefile +## | | +## | \---mux2to1 +## | makefile +## | makefile.sources +## | +## +---pnr +## | | makefile +## | | +## | \---de1_mux2to1 +## | de1_mux2to1_pins.tcl +## | makefile +## | +## \---scripts +## de1_pin_assignments_minimumio.csv +## de1_pin_assignments_minimumio.tcl +## modelsim.ini +## quartus_project_settings.tcl +## ---------------------------------------------------------------------------- + diff --git a/scripts/create_quartus_project_settings.tcl b/scripts/create_quartus_project_settings.tcl new file mode 100644 index 0000000..ab55593 --- /dev/null +++ b/scripts/create_quartus_project_settings.tcl @@ -0,0 +1,84 @@ +## ---------------------------------------------------------------------------- +## Script : create_quartus_project_settings.tcl +## ---------------------------------------------------------------------------- +## Author : Johann Faerber, F. Beckmann +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: create a quartus project with default settings for device, +## unused pins, ... +## expects project name as command line parameter +## e.g. +## quartus_sh -t create_quartus_project_settings.tcl -projectname de1_mux2to1 +## -family "Cyclone II" -device EP2C20F484C7 +## ---------------------------------------------------------------------------- +## Revisions : see end of file +## ---------------------------------------------------------------------------- + +package require cmdline +# Load Quartus II Tcl Project package +package require ::quartus::project + +# ---------------------------------------------------------------------------- +# Declare command line parameters +# ---------------------------------------------------------------------------- +set parameters { + {projectname.arg "" "Project Name"} + {family.arg "" "FPGA Family"} + {device.arg "" "FPGA Device"} +} +array set arg [::cmdline::getoptions argv $parameters] + +# ---------------------------------------------------------------------------- +# Verify required paramters +# ---------------------------------------------------------------------------- +set requiredParameters {projectname family device} +foreach parameter $requiredParameters { + if {$arg($parameter) == ""} { + puts stderr "Missing required parameter: -$parameter" + exit 1 + } +} + + + # ---------------------------------------------------------------------------- + # Create project + # ---------------------------------------------------------------------------- + project_new $arg(projectname) -overwrite + + # ---------------------------------------------------------------------------- + # Assign family, device, and top-level file + # ---------------------------------------------------------------------------- + set_global_assignment -name FAMILY $arg(family) + set_global_assignment -name DEVICE $arg(device) + + # ---------------------------------------------------------------------------- + # Default settings + # ---------------------------------------------------------------------------- + set_global_assignment -name USE_CONFIGURATION_DEVICE ON + set_global_assignment -name RESERVE_ALL_UNUSED_PINS "AS INPUT TRI-STATED" + set_global_assignment -name VHDL_INPUT_VERSION VHDL_2008 + + # ---------------------------------------------------------------------------- + # Design files + # ---------------------------------------------------------------------------- + #set_global_assignment -name VHDL_FILE ../src/e_cntdnmodm.vhd + #set_global_assignment -name VHDL_FILE ../src/a_cntdnmodm_rtl.vhd + source quartus_vhdl_source_files.tcl + + # ---------------------------------------------------------------------------- + # Pin Assignments + # ---------------------------------------------------------------------------- + # set_location_assignment PIN_L1 -to CLOCK_50 + source $arg(projectname)_pins.tcl + + # ---------------------------------------------------------------------------- + # Close project + # ---------------------------------------------------------------------------- + project_close + + +## ---------------------------------------------------------------------------- +## Revisions: +## ---------- +## $Id:$ +## ---------------------------------------------------------------------------- diff --git a/scripts/de1_pin_assignments_minimumio.tcl b/scripts/de1_pin_assignments_minimumio.tcl new file mode 100644 index 0000000..d9d3470 --- /dev/null +++ b/scripts/de1_pin_assignments_minimumio.tcl @@ -0,0 +1,282 @@ +set_location_assignment PIN_D12 -to CLOCK_27[0]
+set_location_assignment PIN_E12 -to CLOCK_27[1]
+set_location_assignment PIN_B12 -to CLOCK_24[0]
+set_location_assignment PIN_A12 -to CLOCK_24[1]
+set_location_assignment PIN_L1 -to CLOCK_50
+set_location_assignment PIN_M21 -to EXT_CLOCK
+set_location_assignment PIN_R22 -to KEY[0]
+set_location_assignment PIN_R21 -to KEY[1]
+set_location_assignment PIN_T22 -to KEY[2]
+set_location_assignment PIN_T21 -to KEY[3]
+set_location_assignment PIN_L22 -to SW[0]
+set_location_assignment PIN_L21 -to SW[1]
+set_location_assignment PIN_M22 -to SW[2]
+set_location_assignment PIN_V12 -to SW[3]
+set_location_assignment PIN_W12 -to SW[4]
+set_location_assignment PIN_U12 -to SW[5]
+set_location_assignment PIN_U11 -to SW[6]
+set_location_assignment PIN_M2 -to SW[7]
+set_location_assignment PIN_M1 -to SW[8]
+set_location_assignment PIN_L2 -to SW[9]
+set_location_assignment PIN_R20 -to LEDR[0]
+set_location_assignment PIN_R19 -to LEDR[1]
+set_location_assignment PIN_U19 -to LEDR[2]
+set_location_assignment PIN_Y19 -to LEDR[3]
+set_location_assignment PIN_T18 -to LEDR[4]
+set_location_assignment PIN_V19 -to LEDR[5]
+set_location_assignment PIN_Y18 -to LEDR[6]
+set_location_assignment PIN_U18 -to LEDR[7]
+set_location_assignment PIN_R18 -to LEDR[8]
+set_location_assignment PIN_R17 -to LEDR[9]
+set_location_assignment PIN_U22 -to LEDG[0]
+set_location_assignment PIN_U21 -to LEDG[1]
+set_location_assignment PIN_V22 -to LEDG[2]
+set_location_assignment PIN_V21 -to LEDG[3]
+set_location_assignment PIN_W22 -to LEDG[4]
+set_location_assignment PIN_W21 -to LEDG[5]
+set_location_assignment PIN_Y22 -to LEDG[6]
+set_location_assignment PIN_Y21 -to LEDG[7]
+set_location_assignment PIN_J2 -to HEX0[0]
+set_location_assignment PIN_J1 -to HEX0[1]
+set_location_assignment PIN_H2 -to HEX0[2]
+set_location_assignment PIN_H1 -to HEX0[3]
+set_location_assignment PIN_F2 -to HEX0[4]
+set_location_assignment PIN_F1 -to HEX0[5]
+set_location_assignment PIN_E2 -to HEX0[6]
+set_location_assignment PIN_E1 -to HEX1[0]
+set_location_assignment PIN_H6 -to HEX1[1]
+set_location_assignment PIN_H5 -to HEX1[2]
+set_location_assignment PIN_H4 -to HEX1[3]
+set_location_assignment PIN_G3 -to HEX1[4]
+set_location_assignment PIN_D2 -to HEX1[5]
+set_location_assignment PIN_D1 -to HEX1[6]
+set_location_assignment PIN_G5 -to HEX2[0]
+set_location_assignment PIN_G6 -to HEX2[1]
+set_location_assignment PIN_C2 -to HEX2[2]
+set_location_assignment PIN_C1 -to HEX2[3]
+set_location_assignment PIN_E3 -to HEX2[4]
+set_location_assignment PIN_E4 -to HEX2[5]
+set_location_assignment PIN_D3 -to HEX2[6]
+set_location_assignment PIN_F4 -to HEX3[0]
+set_location_assignment PIN_D5 -to HEX3[1]
+set_location_assignment PIN_D6 -to HEX3[2]
+set_location_assignment PIN_J4 -to HEX3[3]
+set_location_assignment PIN_L8 -to HEX3[4]
+set_location_assignment PIN_F3 -to HEX3[5]
+set_location_assignment PIN_D4 -to HEX3[6]
+set_location_assignment PIN_A13 -to GPI_0[0]
+set_location_assignment PIN_B13 -to GPI_0[1]
+set_location_assignment PIN_A14 -to GPI_0[2]
+set_location_assignment PIN_B14 -to GPI_0[3]
+set_location_assignment PIN_A15 -to GPI_0[4]
+set_location_assignment PIN_B15 -to GPI_0[5]
+set_location_assignment PIN_A16 -to GPI_0[6]
+set_location_assignment PIN_B16 -to GPI_0[7]
+set_location_assignment PIN_A17 -to GPI_0[8]
+set_location_assignment PIN_B17 -to GPI_0[9]
+set_location_assignment PIN_A18 -to GPI_0[10]
+set_location_assignment PIN_B18 -to GPI_0[11]
+set_location_assignment PIN_A19 -to GPI_0[12]
+set_location_assignment PIN_B19 -to GPI_0[13]
+set_location_assignment PIN_A20 -to GPI_0[14]
+set_location_assignment PIN_B20 -to GPI_0[15]
+set_location_assignment PIN_C21 -to GPI_0[16]
+set_location_assignment PIN_C22 -to GPI_0[17]
+set_location_assignment PIN_D21 -to GPI_0[18]
+set_location_assignment PIN_D22 -to GPI_0[19]
+set_location_assignment PIN_E21 -to GPI_0[20]
+set_location_assignment PIN_E22 -to GPI_0[21]
+set_location_assignment PIN_F21 -to GPI_0[22]
+set_location_assignment PIN_F22 -to GPI_0[23]
+set_location_assignment PIN_G21 -to GPI_0[24]
+set_location_assignment PIN_G22 -to GPI_0[25]
+set_location_assignment PIN_J21 -to GPI_0[26]
+set_location_assignment PIN_J22 -to GPI_0[27]
+set_location_assignment PIN_K21 -to GPI_0[28]
+set_location_assignment PIN_K22 -to GPI_0[29]
+set_location_assignment PIN_J19 -to GPI_0[30]
+set_location_assignment PIN_J20 -to GPI_0[31]
+set_location_assignment PIN_J18 -to GPI_0[32]
+set_location_assignment PIN_K20 -to GPI_0[33]
+set_location_assignment PIN_L19 -to GPI_0[34]
+set_location_assignment PIN_L18 -to GPI_0[35]
+set_location_assignment PIN_H12 -to GPI_1[0]
+set_location_assignment PIN_H13 -to GPI_1[1]
+set_location_assignment PIN_H14 -to GPI_1[2]
+set_location_assignment PIN_G15 -to GPI_1[3]
+set_location_assignment PIN_E14 -to GPI_1[4]
+set_location_assignment PIN_E15 -to GPI_1[5]
+set_location_assignment PIN_F15 -to GPI_1[6]
+set_location_assignment PIN_G16 -to GPI_1[7]
+set_location_assignment PIN_F12 -to GPI_1[8]
+set_location_assignment PIN_F13 -to GPI_1[9]
+set_location_assignment PIN_C14 -to GPI_1[10]
+set_location_assignment PIN_D14 -to GPI_1[11]
+set_location_assignment PIN_D15 -to GPI_1[12]
+set_location_assignment PIN_D16 -to GPI_1[13]
+set_location_assignment PIN_C17 -to GPI_1[14]
+set_location_assignment PIN_C18 -to GPI_1[15]
+set_location_assignment PIN_C19 -to GPI_1[16]
+set_location_assignment PIN_C20 -to GPI_1[17]
+set_location_assignment PIN_D19 -to GPI_1[18]
+set_location_assignment PIN_D20 -to GPI_1[19]
+set_location_assignment PIN_E20 -to GPI_1[20]
+set_location_assignment PIN_F20 -to GPI_1[21]
+set_location_assignment PIN_E19 -to GPI_1[22]
+set_location_assignment PIN_E18 -to GPI_1[23]
+set_location_assignment PIN_G20 -to GPI_1[24]
+set_location_assignment PIN_G18 -to GPI_1[25]
+set_location_assignment PIN_G17 -to GPI_1[26]
+set_location_assignment PIN_H17 -to GPI_1[27]
+set_location_assignment PIN_J15 -to GPI_1[28]
+set_location_assignment PIN_H18 -to GPI_1[29]
+set_location_assignment PIN_N22 -to GPI_1[30]
+set_location_assignment PIN_N21 -to GPI_1[31]
+set_location_assignment PIN_P15 -to GPI_1[32]
+set_location_assignment PIN_N15 -to GPI_1[33]
+set_location_assignment PIN_P17 -to GPI_1[34]
+set_location_assignment PIN_P18 -to GPI_1[35]
+set_location_assignment PIN_A13 -to GPO_0[0]
+set_location_assignment PIN_B13 -to GPO_0[1]
+set_location_assignment PIN_A14 -to GPO_0[2]
+set_location_assignment PIN_B14 -to GPO_0[3]
+set_location_assignment PIN_A15 -to GPO_0[4]
+set_location_assignment PIN_B15 -to GPO_0[5]
+set_location_assignment PIN_A16 -to GPO_0[6]
+set_location_assignment PIN_B16 -to GPO_0[7]
+set_location_assignment PIN_A17 -to GPO_0[8]
+set_location_assignment PIN_B17 -to GPO_0[9]
+set_location_assignment PIN_A18 -to GPO_0[10]
+set_location_assignment PIN_B18 -to GPO_0[11]
+set_location_assignment PIN_A19 -to GPO_0[12]
+set_location_assignment PIN_B19 -to GPO_0[13]
+set_location_assignment PIN_A20 -to GPO_0[14]
+set_location_assignment PIN_B20 -to GPO_0[15]
+set_location_assignment PIN_C21 -to GPO_0[16]
+set_location_assignment PIN_C22 -to GPO_0[17]
+set_location_assignment PIN_D21 -to GPO_0[18]
+set_location_assignment PIN_D22 -to GPO_0[19]
+set_location_assignment PIN_E21 -to GPO_0[20]
+set_location_assignment PIN_E22 -to GPO_0[21]
+set_location_assignment PIN_F21 -to GPO_0[22]
+set_location_assignment PIN_F22 -to GPO_0[23]
+set_location_assignment PIN_G21 -to GPO_0[24]
+set_location_assignment PIN_G22 -to GPO_0[25]
+set_location_assignment PIN_J21 -to GPO_0[26]
+set_location_assignment PIN_J22 -to GPO_0[27]
+set_location_assignment PIN_K21 -to GPO_0[28]
+set_location_assignment PIN_K22 -to GPO_0[29]
+set_location_assignment PIN_J19 -to GPO_0[30]
+set_location_assignment PIN_J20 -to GPO_0[31]
+set_location_assignment PIN_J18 -to GPO_0[32]
+set_location_assignment PIN_K20 -to GPO_0[33]
+set_location_assignment PIN_L19 -to GPO_0[34]
+set_location_assignment PIN_L18 -to GPO_0[35]
+set_location_assignment PIN_H12 -to GPO_1[0]
+set_location_assignment PIN_H13 -to GPO_1[1]
+set_location_assignment PIN_H14 -to GPO_1[2]
+set_location_assignment PIN_G15 -to GPO_1[3]
+set_location_assignment PIN_E14 -to GPO_1[4]
+set_location_assignment PIN_E15 -to GPO_1[5]
+set_location_assignment PIN_F15 -to GPO_1[6]
+set_location_assignment PIN_G16 -to GPO_1[7]
+set_location_assignment PIN_F12 -to GPO_1[8]
+set_location_assignment PIN_F13 -to GPO_1[9]
+set_location_assignment PIN_C14 -to GPO_1[10]
+set_location_assignment PIN_D14 -to GPO_1[11]
+set_location_assignment PIN_D15 -to GPO_1[12]
+set_location_assignment PIN_D16 -to GPO_1[13]
+set_location_assignment PIN_C17 -to GPO_1[14]
+set_location_assignment PIN_C18 -to GPO_1[15]
+set_location_assignment PIN_C19 -to GPO_1[16]
+set_location_assignment PIN_C20 -to GPO_1[17]
+set_location_assignment PIN_D19 -to GPO_1[18]
+set_location_assignment PIN_D20 -to GPO_1[19]
+set_location_assignment PIN_E20 -to GPO_1[20]
+set_location_assignment PIN_F20 -to GPO_1[21]
+set_location_assignment PIN_E19 -to GPO_1[22]
+set_location_assignment PIN_E18 -to GPO_1[23]
+set_location_assignment PIN_G20 -to GPO_1[24]
+set_location_assignment PIN_G18 -to GPO_1[25]
+set_location_assignment PIN_G17 -to GPO_1[26]
+set_location_assignment PIN_H17 -to GPO_1[27]
+set_location_assignment PIN_J15 -to GPO_1[28]
+set_location_assignment PIN_H18 -to GPO_1[29]
+set_location_assignment PIN_N22 -to GPO_1[30]
+set_location_assignment PIN_N21 -to GPO_1[31]
+set_location_assignment PIN_P15 -to GPO_1[32]
+set_location_assignment PIN_N15 -to GPO_1[33]
+set_location_assignment PIN_P17 -to GPO_1[34]
+set_location_assignment PIN_P18 -to GPO_1[35]
+set_location_assignment PIN_A13 -to GPIO_0[0]
+set_location_assignment PIN_B13 -to GPIO_0[1]
+set_location_assignment PIN_A14 -to GPIO_0[2]
+set_location_assignment PIN_B14 -to GPIO_0[3]
+set_location_assignment PIN_A15 -to GPIO_0[4]
+set_location_assignment PIN_B15 -to GPIO_0[5]
+set_location_assignment PIN_A16 -to GPIO_0[6]
+set_location_assignment PIN_B16 -to GPIO_0[7]
+set_location_assignment PIN_A17 -to GPIO_0[8]
+set_location_assignment PIN_B17 -to GPIO_0[9]
+set_location_assignment PIN_A18 -to GPIO_0[10]
+set_location_assignment PIN_B18 -to GPIO_0[11]
+set_location_assignment PIN_A19 -to GPIO_0[12]
+set_location_assignment PIN_B19 -to GPIO_0[13]
+set_location_assignment PIN_A20 -to GPIO_0[14]
+set_location_assignment PIN_B20 -to GPIO_0[15]
+set_location_assignment PIN_C21 -to GPIO_0[16]
+set_location_assignment PIN_C22 -to GPIO_0[17]
+set_location_assignment PIN_D21 -to GPIO_0[18]
+set_location_assignment PIN_D22 -to GPIO_0[19]
+set_location_assignment PIN_E21 -to GPIO_0[20]
+set_location_assignment PIN_E22 -to GPIO_0[21]
+set_location_assignment PIN_F21 -to GPIO_0[22]
+set_location_assignment PIN_F22 -to GPIO_0[23]
+set_location_assignment PIN_G21 -to GPIO_0[24]
+set_location_assignment PIN_G22 -to GPIO_0[25]
+set_location_assignment PIN_J21 -to GPIO_0[26]
+set_location_assignment PIN_J22 -to GPIO_0[27]
+set_location_assignment PIN_K21 -to GPIO_0[28]
+set_location_assignment PIN_K22 -to GPIO_0[29]
+set_location_assignment PIN_J19 -to GPIO_0[30]
+set_location_assignment PIN_J20 -to GPIO_0[31]
+set_location_assignment PIN_J18 -to GPIO_0[32]
+set_location_assignment PIN_K20 -to GPIO_0[33]
+set_location_assignment PIN_L19 -to GPIO_0[34]
+set_location_assignment PIN_L18 -to GPIO_0[35]
+set_location_assignment PIN_H12 -to GPIO_1[0]
+set_location_assignment PIN_H13 -to GPIO_1[1]
+set_location_assignment PIN_H14 -to GPIO_1[2]
+set_location_assignment PIN_G15 -to GPIO_1[3]
+set_location_assignment PIN_E14 -to GPIO_1[4]
+set_location_assignment PIN_E15 -to GPIO_1[5]
+set_location_assignment PIN_F15 -to GPIO_1[6]
+set_location_assignment PIN_G16 -to GPIO_1[7]
+set_location_assignment PIN_F12 -to GPIO_1[8]
+set_location_assignment PIN_F13 -to GPIO_1[9]
+set_location_assignment PIN_C14 -to GPIO_1[10]
+set_location_assignment PIN_D14 -to GPIO_1[11]
+set_location_assignment PIN_D15 -to GPIO_1[12]
+set_location_assignment PIN_D16 -to GPIO_1[13]
+set_location_assignment PIN_C17 -to GPIO_1[14]
+set_location_assignment PIN_C18 -to GPIO_1[15]
+set_location_assignment PIN_C19 -to GPIO_1[16]
+set_location_assignment PIN_C20 -to GPIO_1[17]
+set_location_assignment PIN_D19 -to GPIO_1[18]
+set_location_assignment PIN_D20 -to GPIO_1[19]
+set_location_assignment PIN_E20 -to GPIO_1[20]
+set_location_assignment PIN_F20 -to GPIO_1[21]
+set_location_assignment PIN_E19 -to GPIO_1[22]
+set_location_assignment PIN_E18 -to GPIO_1[23]
+set_location_assignment PIN_G20 -to GPIO_1[24]
+set_location_assignment PIN_G18 -to GPIO_1[25]
+set_location_assignment PIN_G17 -to GPIO_1[26]
+set_location_assignment PIN_H17 -to GPIO_1[27]
+set_location_assignment PIN_J15 -to GPIO_1[28]
+set_location_assignment PIN_H18 -to GPIO_1[29]
+set_location_assignment PIN_N22 -to GPIO_1[30]
+set_location_assignment PIN_N21 -to GPIO_1[31]
+set_location_assignment PIN_P15 -to GPIO_1[32]
+set_location_assignment PIN_N15 -to GPIO_1[33]
+set_location_assignment PIN_P17 -to GPIO_1[34]
+set_location_assignment PIN_P18 -to GPIO_1[35]
\ No newline at end of file diff --git a/scripts/modelsim.ini b/scripts/modelsim.ini new file mode 100644 index 0000000..d3412fe --- /dev/null +++ b/scripts/modelsim.ini @@ -0,0 +1,351 @@ +;; ----------------------------------------------------------------------------
+;; Script : modelsim.ini
+;; ----------------------------------------------------------------------------
+;; Author : Johann Faerber
+;; Company : University of Applied Sciences Augsburg
+;; ----------------------------------------------------------------------------
+;; Description: original version modified
+;; - deleted all VHDL and Verilog device libraries
+;; - modified compiler standard to VHDL93 = 2008
+;; ----------------------------------------------------------------------------
+;; Revisions : see end of file
+;; ----------------------------------------------------------------------------
+
+; Copyright 1991-2009 Mentor Graphics Corporation
+;
+; All Rights Reserved.
+;
+; THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION WHICH IS THE PROPERTY OF
+; MENTOR GRAPHICS CORPORATION OR ITS LICENSORS AND IS SUBJECT TO LICENSE TERMS.
+;
+
+[Library]
+std = $MODEL_TECH/../std
+ieee = $MODEL_TECH/../ieee
+verilog = $MODEL_TECH/../verilog
+vital2000 = $MODEL_TECH/../vital2000
+std_developerskit = $MODEL_TECH/../std_developerskit
+synopsys = $MODEL_TECH/../synopsys
+modelsim_lib = $MODEL_TECH/../modelsim_lib
+sv_std = $MODEL_TECH/../sv_std
+
+; Altera Primitive libraries
+;
+; VHDL Section
+;
+altera_mf = $MODEL_TECH/../altera/vhdl/altera_mf
+altera = $MODEL_TECH/../altera/vhdl/altera
+altera_lnsim = $MODEL_TECH/../altera/vhdl/altera_lnsim
+lpm = $MODEL_TECH/../altera/vhdl/220model
+220model = $MODEL_TECH/../altera/vhdl/220model
+
+[vcom]
+; VHDL93 variable selects language version as the default.
+; Default is VHDL-2002.
+; Value of 0 or 1987 for VHDL-1987.
+; Value of 1 or 1993 for VHDL-1993.
+; Default or value of 2 or 2002 for VHDL-2002.
+; Default or value of 3 or 2008 for VHDL-2008.
+VHDL93 = 2008
+
+; Show source line containing error. Default is off.
+; Show_source = 1
+
+; Turn off unbound-component warnings. Default is on.
+; Show_Warning1 = 0
+
+; Turn off process-without-a-wait-statement warnings. Default is on.
+; Show_Warning2 = 0
+
+; Turn off null-range warnings. Default is on.
+; Show_Warning3 = 0
+
+; Turn off no-space-in-time-literal warnings. Default is on.
+; Show_Warning4 = 0
+
+; Turn off multiple-drivers-on-unresolved-signal warnings. Default is on.
+; Show_Warning5 = 0
+
+; Turn off optimization for IEEE std_logic_1164 package. Default is on.
+; Optimize_1164 = 0
+
+; Turn on resolving of ambiguous function overloading in favor of the
+; "explicit" function declaration (not the one automatically created by
+; the compiler for each type declaration). Default is off.
+; The .ini file has Explicit enabled so that std_logic_signed/unsigned
+; will match the behavior of synthesis tools.
+Explicit = 1
+
+; Turn off acceleration of the VITAL packages. Default is to accelerate.
+; NoVital = 1
+
+; Turn off VITAL compliance checking. Default is checking on.
+; NoVitalCheck = 1
+
+; Ignore VITAL compliance checking errors. Default is to not ignore.
+; IgnoreVitalErrors = 1
+
+; Turn off VITAL compliance checking warnings. Default is to show warnings.
+; Show_VitalChecksWarnings = 0
+
+; Keep silent about case statement static warnings.
+; Default is to give a warning.
+; NoCaseStaticError = 1
+
+; Keep silent about warnings caused by aggregates that are not locally static.
+; Default is to give a warning.
+; NoOthersStaticError = 1
+
+; Turn off inclusion of debugging info within design units.
+; Default is to include debugging info.
+; NoDebug = 1
+
+; Turn off "Loading..." messages. Default is messages on.
+; Quiet = 1
+
+; Turn on some limited synthesis rule compliance checking. Checks only:
+; -- signals used (read) by a process must be in the sensitivity list
+; CheckSynthesis = 1
+
+; Activate optimizations on expressions that do not involve signals,
+; waits, or function/procedure/task invocations. Default is off.
+; ScalarOpts = 1
+
+; Require the user to specify a configuration for all bindings,
+; and do not generate a compile time default binding for the
+; component. This will result in an elaboration error of
+; 'component not bound' if the user fails to do so. Avoids the rare
+; issue of a false dependency upon the unused default binding.
+; RequireConfigForAllDefaultBinding = 1
+
+; Inhibit range checking on subscripts of arrays. Range checking on
+; scalars defined with subtypes is inhibited by default.
+; NoIndexCheck = 1
+
+; Inhibit range checks on all (implicit and explicit) assignments to
+; scalar objects defined with subtypes.
+; NoRangeCheck = 1
+
+[vlog]
+
+; Turn off inclusion of debugging info within design units.
+; Default is to include debugging info.
+; NoDebug = 1
+
+; Turn off "loading..." messages. Default is messages on.
+; Quiet = 1
+
+; Turn on Verilog hazard checking (order-dependent accessing of global vars).
+; Default is off.
+; Hazard = 1
+
+; Turn on converting regular Verilog identifiers to uppercase. Allows case
+; insensitivity for module names. Default is no conversion.
+; UpCase = 1
+
+; Turn on incremental compilation of modules. Default is off.
+; Incremental = 1
+
+; Turns on lint-style checking.
+; Show_Lint = 1
+
+[vsim]
+; Simulator resolution
+; Set to fs, ps, ns, us, ms, or sec with optional prefix of 1, 10, or 100.
+Resolution = ns
+
+; User time unit for run commands
+; Set to default, fs, ps, ns, us, ms, or sec. The default is to use the
+; unit specified for Resolution. For example, if Resolution is 100ps,
+; then UserTimeUnit defaults to ps.
+; Should generally be set to default.
+UserTimeUnit = default
+
+; Default run length
+RunLength = 100
+
+; Maximum iterations that can be run without advancing simulation time
+IterationLimit = 5000
+
+; Directive to license manager:
+; vhdl Immediately reserve a VHDL license
+; vlog Immediately reserve a Verilog license
+; plus Immediately reserve a VHDL and Verilog license
+; nomgc Do not look for Mentor Graphics Licenses
+; nomti Do not look for Model Technology Licenses
+; noqueue Do not wait in the license queue when a license isn't available
+; viewsim Try for viewer license but accept simulator license(s) instead
+; of queuing for viewer license
+; License = plus
+
+; Stop the simulator after a VHDL/Verilog assertion message
+; 0 = Note 1 = Warning 2 = Error 3 = Failure 4 = Fatal
+BreakOnAssertion = 3
+
+; Assertion Message Format
+; %S - Severity Level
+; %R - Report Message
+; %T - Time of assertion
+; %D - Delta
+; %I - Instance or Region pathname (if available)
+; %% - print '%' character
+; AssertionFormat = "** %S: %R\n Time: %T Iteration: %D%I\n"
+
+; Assertion File - alternate file for storing VHDL/Verilog assertion messages
+; AssertFile = assert.log
+
+; Default radix for all windows and commands...
+; Set to symbolic, ascii, binary, octal, decimal, hex, unsigned
+DefaultRadix = symbolic
+
+; VSIM Startup command
+; Startup = do startup.do
+
+; File for saving command transcript
+TranscriptFile = transcript
+
+; File for saving command history
+; CommandHistory = cmdhist.log
+
+; Specify whether paths in simulator commands should be described
+; in VHDL or Verilog format.
+; For VHDL, PathSeparator = /
+; For Verilog, PathSeparator = .
+; Must not be the same character as DatasetSeparator.
+PathSeparator = /
+
+; Specify the dataset separator for fully rooted contexts.
+; The default is ':'. For example, sim:/top
+; Must not be the same character as PathSeparator.
+DatasetSeparator = :
+
+; Disable VHDL assertion messages
+; IgnoreNote = 1
+; IgnoreWarning = 1
+; IgnoreError = 1
+; IgnoreFailure = 1
+
+; Default force kind. May be freeze, drive, deposit, or default
+; or in other terms, fixed, wired, or charged.
+; A value of "default" will use the signal kind to determine the
+; force kind, drive for resolved signals, freeze for unresolved signals
+; DefaultForceKind = freeze
+
+; If zero, open files when elaborated; otherwise, open files on
+; first read or write. Default is 0.
+; DelayFileOpen = 1
+
+; Control VHDL files opened for write.
+; 0 = Buffered, 1 = Unbuffered
+UnbufferedOutput = 0
+
+; Control the number of VHDL files open concurrently.
+; This number should always be less than the current ulimit
+; setting for max file descriptors.
+; 0 = unlimited
+ConcurrentFileLimit = 40
+
+; Control the number of hierarchical regions displayed as
+; part of a signal name shown in the Wave window.
+; A value of zero tells VSIM to display the full name.
+; The default is 0.
+; WaveSignalNameWidth = 0
+
+; Turn off warnings from the std_logic_arith, std_logic_unsigned
+; and std_logic_signed packages.
+; StdArithNoWarnings = 1
+
+; Turn off warnings from the IEEE numeric_std and numeric_bit packages.
+; NumericStdNoWarnings = 1
+
+; Control the format of the (VHDL) FOR generate statement label
+; for each iteration. Do not quote it.
+; The format string here must contain the conversion codes %s and %d,
+; in that order, and no other conversion codes. The %s represents
+; the generate_label; the %d represents the generate parameter value
+; at a particular generate iteration (this is the position number if
+; the generate parameter is of an enumeration type). Embedded whitespace
+; is allowed (but discouraged); leading and trailing whitespace is ignored.
+; Application of the format must result in a unique scope name over all
+; such names in the design so that name lookup can function properly.
+; GenerateFormat = %s__%d
+
+; Specify whether checkpoint files should be compressed.
+; The default is 1 (compressed).
+; CheckpointCompressMode = 0
+
+; List of dynamically loaded objects for Verilog PLI applications
+; Veriuser = veriuser.sl
+
+; Specify default options for the restart command. Options can be one
+; or more of: -force -nobreakpoint -nolist -nolog -nowave
+; DefaultRestartOptions = -force
+
+; HP-UX 10.20 ONLY - Enable memory locking to speed up large designs
+; (> 500 megabyte memory footprint). Default is disabled.
+; Specify number of megabytes to lock.
+; LockedMemory = 1000
+
+; Turn on (1) or off (0) WLF file compression.
+; The default is 1 (compress WLF file).
+; WLFCompress = 0
+
+; Specify whether to save all design hierarchy (1) in the WLF file
+; or only regions containing logged signals (0).
+; The default is 0 (save only regions with logged signals).
+; WLFSaveAllRegions = 1
+
+; WLF file time limit. Limit WLF file by time, as closely as possible,
+; to the specified amount of simulation time. When the limit is exceeded
+; the earliest times get truncated from the file.
+; If both time and size limits are specified the most restrictive is used.
+; UserTimeUnits are used if time units are not specified.
+; The default is 0 (no limit). Example: WLFTimeLimit = {100 ms}
+; WLFTimeLimit = 0
+
+; WLF file size limit. Limit WLF file size, as closely as possible,
+; to the specified number of megabytes. If both time and size limits
+; are specified then the most restrictive is used.
+; The default is 0 (no limit).
+; WLFSizeLimit = 1000
+
+; Specify whether or not a WLF file should be deleted when the
+; simulation ends. A value of 1 will cause the WLF file to be deleted.
+; The default is 0 (do not delete WLF file when simulation ends).
+; WLFDeleteOnQuit = 1
+
+; Automatic SDF compilation
+; Disables automatic compilation of SDF files in flows that support it.
+; Default is on, uncomment to turn off.
+; NoAutoSDFCompile = 1
+
+[lmc]
+
+[msg_system]
+; Change a message severity or suppress a message.
+; The format is: <msg directive> = <msg number>[,<msg number>...]
+; Examples:
+; note = 3009
+; warning = 3033
+; error = 3010,3016
+; fatal = 3016,3033
+; suppress = 3009,3016,3043
+; The command verror <msg number> can be used to get the complete
+; description of a message.
+
+; Control transcripting of elaboration/runtime messages.
+; The default is to have messages appear in the transcript and
+; recorded in the wlf file (messages that are recorded in the
+; wlf file can be viewed in the MsgViewer). The other settings
+; are to send messages only to the transcript or only to the
+; wlf file. The valid values are
+; both {default}
+; tran {transcript only}
+; wlf {wlf file only}
+; msgmode = both
+
+;; ----------------------------------------------------------------------------
+;; Revisions:
+;; ----------
+;; $Id:$
+;; ----------------------------------------------------------------------------
diff --git a/scripts/quartus_project_flow.tcl b/scripts/quartus_project_flow.tcl new file mode 100644 index 0000000..2894685 --- /dev/null +++ b/scripts/quartus_project_flow.tcl @@ -0,0 +1,84 @@ +## ---------------------------------------------------------------------------- +## Script : quartus_project_flow.tcl +## ---------------------------------------------------------------------------- +## Author : Johann Faerber, F. Beckmann +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: executes process steps in a quartus project +## depending on the parameter process +## expects project name as command line parameter +## e.g. +## quartus_sh -t quartus_project_flow.tcl -projectname de1_mux2to1 +## -process compile +## ---------------------------------------------------------------------------- +## Revisions : see end of file +## ---------------------------------------------------------------------------- + +package require cmdline +# Load Quartus II Tcl Project package +package require ::quartus::project + +# ---------------------------------------------------------------------------- +# Declare command line parameters +# ---------------------------------------------------------------------------- +set parameters { + {projectname.arg "" "Project Name"} + {process.arg "" "Process Step"} +} +array set arg [::cmdline::getoptions argv $parameters] + +# ---------------------------------------------------------------------------- +# Verify required paramters +# ---------------------------------------------------------------------------- +set requiredParameters {projectname process} +foreach parameter $requiredParameters { + if {$arg($parameter) == ""} { + puts stderr "Missing required parameter: -$parameter" + exit 1 + } +} + +# ---------------------------------------------------------------------------- +# Check, if project exists +# ---------------------------------------------------------------------------- +if { ![project_exists $arg(projectname)] } { + post_message -type error "Project $arg(projectname) does not exist" + exit +} + # ---------------------------------------------------------------------------- + # Open project + # ---------------------------------------------------------------------------- + project_open $arg(projectname) + + # ---------------------------------------------------------------------------- + # Run specified design flow by parameter -process + # ---------------------------------------------------------------------------- + load_package flow + + if { $arg(process) == "compile" } { + execute_flow -compile + } elseif { $arg(process) == "analysis_and_elaboration" } { + execute_flow -analysis_and_elaboration + } else { + post_message -type error "Process step $arg(process) not allowed !" + exit + } + + # ---------------------------------------------------------------------------- + # Write Reports + # ---------------------------------------------------------------------------- + load_package report + load_report $arg(projectname) + write_report_panel -file flowsummary.log "Flow Summary" + + # ---------------------------------------------------------------------------- + # Close project + # ---------------------------------------------------------------------------- + project_close + + +## ---------------------------------------------------------------------------- +## Revisions: +## ---------- +## $Id:$ +## ---------------------------------------------------------------------------- diff --git a/sim/and2gate/makefile b/sim/and2gate/makefile new file mode 100644 index 0000000..e523dc3 --- /dev/null +++ b/sim/and2gate/makefile @@ -0,0 +1,67 @@ +## ---------------------------------------------------------------------------- +## Script : makefile +## ---------------------------------------------------------------------------- +## Author : Johann Faerber, Friedrich Beckmann +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: This makefile allows automating design flow with ModelSim, +## it is based on a design directory structure described in +## ../makefile +## ---------------------------------------------------------------------------- + +################################################################### +# Project Configuration: +# +# assign variable PROJECT with the top level project name +# +# Prerequisite: +# - mandatory design directory structure (see end of file) +# - assumes file name of testbench t_$(PROJECT).vhd +################################################################### + +PROJECT = and2gate + +include ./makefile.sources + +# Add here the testbench file +SOURCE_FILES = $(SYN_SOURCE_FILES) \ +../../src/t_$(PROJECT).vhd + +include ../makefile + +## ---------------------------------------------------------------------------- +## Description: +## ------------ +## assumes the following design directory structure as prerequisite +## +## DigitaltechnikPraktikum +## | +## +---src +## | and2gate_equation.vhd +## | invgate_equation.vhd +## | mux2to1_structure.vhd +## | or2gate_equation.vhd +## | t_mux2to1.vhd +## | de1_mux2to1_structure.vhd +## | +## +---sim +## | | makefile +## | | +## | \---mux2to1 +## | makefile +## | makefile.sources +## | +## +---pnr +## | | makefile +## | | +## | \---de1_mux2to1 +## | de1_mux2to1_pins.tcl +## | makefile +## | +## \---scripts +## de1_pin_assignments_minimumio.csv +## de1_pin_assignments_minimumio.tcl +## modelsim.ini +## quartus_project_settings.tcl +## ---------------------------------------------------------------------------- + diff --git a/sim/and2gate/makefile.sources b/sim/and2gate/makefile.sources new file mode 100644 index 0000000..cac390c --- /dev/null +++ b/sim/and2gate/makefile.sources @@ -0,0 +1,17 @@ +## ---------------------------------------------------------------------------- +## Script : makefile.sources +## ---------------------------------------------------------------------------- +## Author : Johann Faerber +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: provide all the VHDL source files in the variable SYN_SOURCE_FILES +## Attention !!! +## ------------- +## Do not forget a new line after the final source file ! +## ---------------------------------------------------------------------------- + +SYN_SOURCE_FILES = \ +../../src/and2gate_equation.vhd \ + +# do not delete this line +# ----------------------------------------------------------------------------- diff --git a/sim/cntdn/makefile b/sim/cntdn/makefile new file mode 100644 index 0000000..1be2176 --- /dev/null +++ b/sim/cntdn/makefile @@ -0,0 +1,67 @@ +## ---------------------------------------------------------------------------- +## Script : makefile +## ---------------------------------------------------------------------------- +## Author : Johann Faerber, Friedrich Beckmann +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: This makefile allows automating design flow with ModelSim, +## it is based on a design directory structure described in +## ../makefile +## ---------------------------------------------------------------------------- + +################################################################### +# Project Configuration: +# +# assign variable PROJECT with the top level project name +# +# Prerequisite: +# - mandatory design directory structure (see end of file) +# - assumes file name of testbench t_$(PROJECT).vhd +################################################################### + +PROJECT = cntdn + +include ./makefile.sources + +# Add here the testbench file +SOURCE_FILES = $(SYN_SOURCE_FILES) \ +../../src/t_$(PROJECT).vhd + +include ../makefile + +## ---------------------------------------------------------------------------- +## Description: +## ------------ +## assumes the following design directory structure as prerequisite +## +## DigitaltechnikPraktikum +## | +## +---src +## | and2gate_equation.vhd +## | invgate_equation.vhd +## | mux2to1_structure.vhd +## | or2gate_equation.vhd +## | t_mux2to1.vhd +## | de1_mux2to1_structure.vhd +## | +## +---sim +## | | makefile +## | | +## | \---mux2to1 +## | makefile +## | makefile.sources +## | +## +---pnr +## | | makefile +## | | +## | \---de1_mux2to1 +## | de1_mux2to1_pins.tcl +## | makefile +## | +## \---scripts +## de1_pin_assignments_minimumio.csv +## de1_pin_assignments_minimumio.tcl +## modelsim.ini +## quartus_project_settings.tcl +## ---------------------------------------------------------------------------- + diff --git a/sim/cntdn/makefile.sources b/sim/cntdn/makefile.sources new file mode 100644 index 0000000..af4874d --- /dev/null +++ b/sim/cntdn/makefile.sources @@ -0,0 +1,17 @@ +## ---------------------------------------------------------------------------- +## Script : makefile.sources +## ---------------------------------------------------------------------------- +## Author : Johann Faerber +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: provide all the VHDL source files in the variable SYN_SOURCE_FILES +## Attention !!! +## ------------- +## Do not forget a new line after the final source file ! +## ---------------------------------------------------------------------------- + +SYN_SOURCE_FILES = \ +../../src/cntdn_rtl.vhd \ + +# do not delete this line +# ----------------------------------------------------------------------------- diff --git a/sim/cntdnmodm/makefile b/sim/cntdnmodm/makefile new file mode 100644 index 0000000..060a0ad --- /dev/null +++ b/sim/cntdnmodm/makefile @@ -0,0 +1,67 @@ +## ---------------------------------------------------------------------------- +## Script : makefile +## ---------------------------------------------------------------------------- +## Author : Johann Faerber, Friedrich Beckmann +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: This makefile allows automating design flow with ModelSim, +## it is based on a design directory structure described in +## ../makefile +## ---------------------------------------------------------------------------- + +################################################################### +# Project Configuration: +# +# assign variable PROJECT with the top level project name +# +# Prerequisite: +# - mandatory design directory structure (see end of file) +# - assumes file name of testbench t_$(PROJECT).vhd +################################################################### + +PROJECT = cntdnmodm + +include ./makefile.sources + +# Add here the testbench file +SOURCE_FILES = $(SYN_SOURCE_FILES) \ +../../src/t_$(PROJECT).vhd + +include ../makefile + +## ---------------------------------------------------------------------------- +## Description: +## ------------ +## assumes the following design directory structure as prerequisite +## +## DigitaltechnikPraktikum +## | +## +---src +## | and2gate_equation.vhd +## | invgate_equation.vhd +## | mux2to1_structure.vhd +## | or2gate_equation.vhd +## | t_mux2to1.vhd +## | de1_mux2to1_structure.vhd +## | +## +---sim +## | | makefile +## | | +## | \---mux2to1 +## | makefile +## | makefile.sources +## | +## +---pnr +## | | makefile +## | | +## | \---de1_mux2to1 +## | de1_mux2to1_pins.tcl +## | makefile +## | +## \---scripts +## de1_pin_assignments_minimumio.csv +## de1_pin_assignments_minimumio.tcl +## modelsim.ini +## quartus_project_settings.tcl +## ---------------------------------------------------------------------------- + diff --git a/sim/cntdnmodm/makefile.sources b/sim/cntdnmodm/makefile.sources new file mode 100644 index 0000000..4752d19 --- /dev/null +++ b/sim/cntdnmodm/makefile.sources @@ -0,0 +1,17 @@ +## ---------------------------------------------------------------------------- +## Script : makefile.sources +## ---------------------------------------------------------------------------- +## Author : Johann Faerber +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: provide all the VHDL source files in the variable SYN_SOURCE_FILES +## Attention !!! +## ------------- +## Do not forget a new line after the final source file ! +## ---------------------------------------------------------------------------- + +SYN_SOURCE_FILES = \ +../../src/cntdnmodm_rtl.vhd \ + +# do not delete this line +# ----------------------------------------------------------------------------- diff --git a/sim/de1_audio/makefile b/sim/de1_audio/makefile new file mode 100644 index 0000000..99b022e --- /dev/null +++ b/sim/de1_audio/makefile @@ -0,0 +1,10 @@ +PROJECT = de1_audio + +include ./makefile.sources + +# Add here the testbench file +SOURCE_FILES = $(SYN_SOURCE_FILES) \ +../../src/t_$(PROJECT).vhd + +include ../makefile + diff --git a/sim/de1_audio/makefile.sources b/sim/de1_audio/makefile.sources new file mode 100644 index 0000000..ee901cc --- /dev/null +++ b/sim/de1_audio/makefile.sources @@ -0,0 +1,14 @@ +SYN_SOURCE_FILES = \ +../../src/adcintf.vhd \ +../../src/bclk.vhd \ +../../src/dacintf.vhd \ +../../src/fsgen.vhd \ +../../src/i2c_sub.vhd \ +../../src/i2c.vhd \ +../../src/i2c_write.vhd \ +../../src/mclk.vhd \ +../../src/memory.vhd \ +../../src/ringbuf.vhd \ +../../src/audio.vhd \ +../../src/de1_audio.vhd + diff --git a/sim/de1_tone/makefile b/sim/de1_tone/makefile new file mode 100644 index 0000000..7eb97d3 --- /dev/null +++ b/sim/de1_tone/makefile @@ -0,0 +1,9 @@ +PROJECT = de1_tone + +include ./makefile.sources + +# Add here the testbench file +SOURCE_FILES = $(SYN_SOURCE_FILES) \ +../../src/t_$(PROJECT).vhd + +include ../makefile diff --git a/sim/de1_tone/makefile.sources b/sim/de1_tone/makefile.sources new file mode 100644 index 0000000..46993a5 --- /dev/null +++ b/sim/de1_tone/makefile.sources @@ -0,0 +1,13 @@ +SYN_SOURCE_FILES = \ +../../src/adcintf.vhd \ +../../src/bclk.vhd \ +../../src/dacintf.vhd \ +../../src/fsgen.vhd \ +../../src/i2c_sub.vhd \ +../../src/i2c.vhd \ +../../src/i2c_write.vhd \ +../../src/mclk.vhd \ +../../src/audio.vhd \ +../../src/tone_rtl.vhd \ +../../src/de1_tone.vhd + diff --git a/sim/falling_edge_detector/makefile b/sim/falling_edge_detector/makefile new file mode 100644 index 0000000..48792e4 --- /dev/null +++ b/sim/falling_edge_detector/makefile @@ -0,0 +1,67 @@ +## ---------------------------------------------------------------------------- +## Script : makefile +## ---------------------------------------------------------------------------- +## Author : Johann Faerber, Friedrich Beckmann +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: This makefile allows automating design flow with ModelSim, +## it is based on a design directory structure described in +## ../makefile +## ---------------------------------------------------------------------------- + +################################################################### +# Project Configuration: +# +# assign variable PROJECT with the top level project name +# +# Prerequisite: +# - mandatory design directory structure (see end of file) +# - assumes file name of testbench t_$(PROJECT).vhd +################################################################### + +PROJECT = falling_edge_detector + +include ./makefile.sources + +# Add here the testbench file +SOURCE_FILES = $(SYN_SOURCE_FILES) \ +../../src/t_$(PROJECT).vhd + +include ../makefile + +## ---------------------------------------------------------------------------- +## Description: +## ------------ +## assumes the following design directory structure as prerequisite +## +## DigitaltechnikPraktikum +## | +## +---src +## | and2gate_equation.vhd +## | invgate_equation.vhd +## | mux2to1_structure.vhd +## | or2gate_equation.vhd +## | t_mux2to1.vhd +## | de1_mux2to1_structure.vhd +## | +## +---sim +## | | makefile +## | | +## | \---mux2to1 +## | makefile +## | makefile.sources +## | +## +---pnr +## | | makefile +## | | +## | \---de1_mux2to1 +## | de1_mux2to1_pins.tcl +## | makefile +## | +## \---scripts +## de1_pin_assignments_minimumio.csv +## de1_pin_assignments_minimumio.tcl +## modelsim.ini +## quartus_project_settings.tcl +## ---------------------------------------------------------------------------- + diff --git a/sim/falling_edge_detector/makefile.sources b/sim/falling_edge_detector/makefile.sources new file mode 100644 index 0000000..03b2cd7 --- /dev/null +++ b/sim/falling_edge_detector/makefile.sources @@ -0,0 +1,18 @@ +## ---------------------------------------------------------------------------- +## Script : makefile.sources +## ---------------------------------------------------------------------------- +## Author : Johann Faerber +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: provide all the VHDL source files in the variable SYN_SOURCE_FILES +## Attention !!! +## ------------- +## Do not forget a new line after the final source file ! +## ---------------------------------------------------------------------------- + +SYN_SOURCE_FILES = \ +../../src/e_falling_edge_detector.vhd \ +../../src/a_falling_edge_detector_rtl.vhd \ + +# do not delete this line +# ----------------------------------------------------------------------------- diff --git a/sim/falling_edge_detector/makefile_qfsm.sources b/sim/falling_edge_detector/makefile_qfsm.sources new file mode 100644 index 0000000..5b3eeec --- /dev/null +++ b/sim/falling_edge_detector/makefile_qfsm.sources @@ -0,0 +1,17 @@ +## ---------------------------------------------------------------------------- +## Script : makefile.sources +## ---------------------------------------------------------------------------- +## Author : Johann Faerber +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: provide all the VHDL source files in the variable SYN_SOURCE_FILES +## Attention !!! +## ------------- +## Do not forget a new line after the final source file ! +## ---------------------------------------------------------------------------- + +SYN_SOURCE_FILES = \ +../../src/falling_edge_detector_qfsm.vhd \ + +# do not delete this line +# ----------------------------------------------------------------------------- diff --git a/sim/falling_edge_detector/makefile_rtl.sources b/sim/falling_edge_detector/makefile_rtl.sources new file mode 100644 index 0000000..03b2cd7 --- /dev/null +++ b/sim/falling_edge_detector/makefile_rtl.sources @@ -0,0 +1,18 @@ +## ---------------------------------------------------------------------------- +## Script : makefile.sources +## ---------------------------------------------------------------------------- +## Author : Johann Faerber +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: provide all the VHDL source files in the variable SYN_SOURCE_FILES +## Attention !!! +## ------------- +## Do not forget a new line after the final source file ! +## ---------------------------------------------------------------------------- + +SYN_SOURCE_FILES = \ +../../src/e_falling_edge_detector.vhd \ +../../src/a_falling_edge_detector_rtl.vhd \ + +# do not delete this line +# ----------------------------------------------------------------------------- diff --git a/sim/falling_edge_detector/makefile_structure.sources b/sim/falling_edge_detector/makefile_structure.sources new file mode 100644 index 0000000..f644c26 --- /dev/null +++ b/sim/falling_edge_detector/makefile_structure.sources @@ -0,0 +1,19 @@ +## ---------------------------------------------------------------------------- +## Script : makefile.sources +## ---------------------------------------------------------------------------- +## Author : Johann Faerber +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: provide all the VHDL source files in the variable SYN_SOURCE_FILES +## Attention !!! +## ------------- +## Do not forget a new line after the final source file ! +## ---------------------------------------------------------------------------- + +SYN_SOURCE_FILES = \ +../../src/d_ff_rtl.vhd \ +../../src/e_falling_edge_detector.vhd \ +../../src/a_falling_edge_detector_structure.vhd \ + +# do not delete this line +# ----------------------------------------------------------------------------- diff --git a/sim/incrementer/makefile b/sim/incrementer/makefile new file mode 100644 index 0000000..54e7a63 --- /dev/null +++ b/sim/incrementer/makefile @@ -0,0 +1,67 @@ +## ---------------------------------------------------------------------------- +## Script : makefile +## ---------------------------------------------------------------------------- +## Author : Johann Faerber, Friedrich Beckmann +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: This makefile allows automating design flow with ModelSim, +## it is based on a design directory structure described in +## ../makefile +## ---------------------------------------------------------------------------- + +################################################################### +# Project Configuration: +# +# assign variable PROJECT with the top level project name +# +# Prerequisite: +# - mandatory design directory structure (see end of file) +# - assumes file name of testbench t_$(PROJECT).vhd +################################################################### + +PROJECT = incrementer + +include ./makefile.sources + +# Add here the testbench file +SOURCE_FILES = $(SYN_SOURCE_FILES) \ +../../src/t_$(PROJECT).vhd + +include ../makefile + +## ---------------------------------------------------------------------------- +## Description: +## ------------ +## assumes the following design directory structure as prerequisite +## +## DigitaltechnikPraktikum +## | +## +---src +## | and2gate_equation.vhd +## | invgate_equation.vhd +## | mux2to1_structure.vhd +## | or2gate_equation.vhd +## | t_mux2to1.vhd +## | de1_mux2to1_structure.vhd +## | +## +---sim +## | | makefile +## | | +## | \---mux2to1 +## | makefile +## | makefile.sources +## | +## +---pnr +## | | makefile +## | | +## | \---de1_mux2to1 +## | de1_mux2to1_pins.tcl +## | makefile +## | +## \---scripts +## de1_pin_assignments_minimumio.csv +## de1_pin_assignments_minimumio.tcl +## modelsim.ini +## quartus_project_settings.tcl +## ---------------------------------------------------------------------------- + diff --git a/sim/incrementer/makefile.sources b/sim/incrementer/makefile.sources new file mode 100644 index 0000000..8766f99 --- /dev/null +++ b/sim/incrementer/makefile.sources @@ -0,0 +1,23 @@ +## ---------------------------------------------------------------------------- +## Script : makefile.sources +## ---------------------------------------------------------------------------- +## Author : Johann Faerber +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: provide all the VHDL source files in the variable SYN_SOURCE_FILES +## Attention !!! +## ------------- +## Do not forget a new line after the final source file ! +## ---------------------------------------------------------------------------- + +SYN_SOURCE_FILES = \ +../../src/rising_edge_detector_qfsm.vhd \ +../../src/falling_edge_detector_qfsm.vhd \ +../../src/resolver_master_qfsm.vhd \ +../../src/resolver_structure.vhd \ +../../src/synchroniser_rtl.vhd \ +../../src/cntupdn_rtl.vhd \ +../../src/incrementer_structure.vhd \ + +# do not delete this line +# ----------------------------------------------------------------------------- diff --git a/sim/makefile b/sim/makefile new file mode 100644 index 0000000..6e7bd40 --- /dev/null +++ b/sim/makefile @@ -0,0 +1,87 @@ +## ---------------------------------------------------------------------------- +## Script : makefile +## ---------------------------------------------------------------------------- +## Author(s) : Johann Faerber, Friedrich Beckmann +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: This makefile allows automating design flow with ModelSim, +## it is based on a design directory structure shown at +## the end of this file. +## ---------------------------------------------------------------------------- + +################################################################### +# Main Targets +# +################################################################### + +help: + @echo '"make" does intentionally nothing. Type:' + @echo ' "make mproject" to create a new modelsim project only' + @echo ' "make compile" to compile all VHDL sources in batch mode' + @echo ' "make modelsim" to start modelsim with graphical user interface' + @echo ' "make sim" to start modelsim gui with the top testbench of the project' + @echo ' "make clean" to remove all generated files' + +mproject : mproject_created + +mproject_created : $(SOURCE_FILES) + # create modelsim project + rm -rf ./modelsim_sources.tcl + for source_file in $(SOURCE_FILES); do \ + echo project addfile $$source_file >> modelsim_sources.tcl; \ + done + vsim -modelsimini ../../scripts/modelsim.ini -c -do "project new [pwd] $(PROJECT); source ./modelsim_sources.tcl; quit -f" + touch mproject_created + +compile: ./work/_vmake + +./work/_vmake: mproject_created + vsim -c -do "project open $(PROJECT); project calculateorder; quit -f" + grep Error transcript; if [ $$? -eq 0 ] ; then rm -rf work/_vmake; exit 1; fi + + +modelsim: mproject_created + vsim -i -do "project open $(PROJECT)" & + +sim: ./work/_vmake + vsim -i -do "project open $(PROJECT); vsim work.t_$(PROJECT)(tbench); add wave *; run -a;" & + +clean: + rm -rf *.mpf *.mti *.ini *.wlf wlf* transcript work modelsim_sources.tcl mproject_created + +## ---------------------------------------------------------------------------- +## Description: +## ------------ +## assumes the following design directory structure as prerequisite +## +## DigitaltechnikPraktikum +## | +## +---src +## | and2gate_equation.vhd +## | invgate_equation.vhd +## | mux2to1_structure.vhd +## | or2gate_equation.vhd +## | t_mux2to1.vhd +## | de1_mux2to1_structure.vhd +## | +## +---sim +## | | makefile +## | | +## | \---mux2to1 +## | makefile +## | makefile.sources +## | +## +---pnr +## | | makefile +## | | +## | \---de1_mux2to1 +## | de1_mux2to1_pins.tcl +## | makefile +## | +## \---scripts +## de1_pin_assignments_minimumio.csv +## de1_pin_assignments_minimumio.tcl +## modelsim.ini +## quartus_project_settings.tcl +## ---------------------------------------------------------------------------- + diff --git a/sim/mux2to1/makefile b/sim/mux2to1/makefile new file mode 100644 index 0000000..c655d61 --- /dev/null +++ b/sim/mux2to1/makefile @@ -0,0 +1,67 @@ +## ---------------------------------------------------------------------------- +## Script : makefile +## ---------------------------------------------------------------------------- +## Author : Johann Faerber, Friedrich Beckmann +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: This makefile allows automating design flow with ModelSim, +## it is based on a design directory structure described in +## ../makefile +## ---------------------------------------------------------------------------- + +################################################################### +# Project Configuration: +# +# assign variable PROJECT with the top level project name +# +# Prerequisite: +# - mandatory design directory structure (see end of file) +# - assumes file name of testbench t_$(PROJECT).vhd +################################################################### + +PROJECT = mux2to1 + +include ./makefile.sources + +# Add here the testbench file +SOURCE_FILES = $(SYN_SOURCE_FILES) \ +../../src/t_$(PROJECT).vhd + +include ../makefile + +## ---------------------------------------------------------------------------- +## Description: +## ------------ +## assumes the following design directory structure as prerequisite +## +## DigitaltechnikPraktikum +## | +## +---src +## | and2gate_equation.vhd +## | invgate_equation.vhd +## | mux2to1_structure.vhd +## | or2gate_equation.vhd +## | t_mux2to1.vhd +## | de1_mux2to1_structure.vhd +## | +## +---sim +## | | makefile +## | | +## | \---mux2to1 +## | makefile +## | makefile.sources +## | +## +---pnr +## | | makefile +## | | +## | \---de1_mux2to1 +## | de1_mux2to1_pins.tcl +## | makefile +## | +## \---scripts +## de1_pin_assignments_minimumio.csv +## de1_pin_assignments_minimumio.tcl +## modelsim.ini +## quartus_project_settings.tcl +## ---------------------------------------------------------------------------- + diff --git a/sim/mux2to1/makefile.sources b/sim/mux2to1/makefile.sources new file mode 100644 index 0000000..880fac4 --- /dev/null +++ b/sim/mux2to1/makefile.sources @@ -0,0 +1,17 @@ +## ---------------------------------------------------------------------------- +## Script : makefile.sources +## ---------------------------------------------------------------------------- +## Author : Johann Faerber +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: provide all the VHDL source files in the variable SYN_SOURCE_FILES +## Attention !!! +## ------------- +## Do not forget a new line after the final source file ! +## ---------------------------------------------------------------------------- + +SYN_SOURCE_FILES = \ +../../src/mux2to1_equation.vhd \ + +# do not delete this line +# ----------------------------------------------------------------------------- diff --git a/sim/mux2to1/makefile_equation.sources b/sim/mux2to1/makefile_equation.sources new file mode 100644 index 0000000..880fac4 --- /dev/null +++ b/sim/mux2to1/makefile_equation.sources @@ -0,0 +1,17 @@ +## ---------------------------------------------------------------------------- +## Script : makefile.sources +## ---------------------------------------------------------------------------- +## Author : Johann Faerber +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: provide all the VHDL source files in the variable SYN_SOURCE_FILES +## Attention !!! +## ------------- +## Do not forget a new line after the final source file ! +## ---------------------------------------------------------------------------- + +SYN_SOURCE_FILES = \ +../../src/mux2to1_equation.vhd \ + +# do not delete this line +# ----------------------------------------------------------------------------- diff --git a/sim/mux2to1/makefile_rtl.sources b/sim/mux2to1/makefile_rtl.sources new file mode 100644 index 0000000..7dd9c7d --- /dev/null +++ b/sim/mux2to1/makefile_rtl.sources @@ -0,0 +1,17 @@ +## ---------------------------------------------------------------------------- +## Script : makefile.sources +## ---------------------------------------------------------------------------- +## Author : Johann Faerber +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: provide all the VHDL source files in the variable SYN_SOURCE_FILES +## Attention !!! +## ------------- +## Do not forget a new line after the final source file ! +## ---------------------------------------------------------------------------- + +SYN_SOURCE_FILES = \ +../../src/mux2to1_rtl.vhd \ + +# do not delete this line +# ----------------------------------------------------------------------------- diff --git a/sim/mux2to1/makefile_structure.sources b/sim/mux2to1/makefile_structure.sources new file mode 100644 index 0000000..f797190 --- /dev/null +++ b/sim/mux2to1/makefile_structure.sources @@ -0,0 +1,20 @@ +## ---------------------------------------------------------------------------- +## Script : makefile.sources +## ---------------------------------------------------------------------------- +## Author : Johann Faerber +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: provide all the VHDL source files in the variable SYN_SOURCE_FILES +## Attention !!! +## ------------- +## Do not forget a new line after the final source file ! +## ---------------------------------------------------------------------------- + +SYN_SOURCE_FILES = \ +../../src/and2gate_equation.vhd \ +../../src/or2gate_equation.vhd \ +../../src/invgate_equation.vhd \ +../../src/mux2to1_structure.vhd \ + +# do not delete this line +# -----------------------------------------------------------------------------
\ No newline at end of file diff --git a/sim/mux2to1/makefile_structure_errors.sources b/sim/mux2to1/makefile_structure_errors.sources new file mode 100644 index 0000000..c412baf --- /dev/null +++ b/sim/mux2to1/makefile_structure_errors.sources @@ -0,0 +1,20 @@ +## ---------------------------------------------------------------------------- +## Script : makefile.sources +## ---------------------------------------------------------------------------- +## Author : Johann Faerber +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: provide all the VHDL source files in the variable SYN_SOURCE_FILES +## Attention !!! +## ------------- +## Do not forget a new line after the final source file ! +## ---------------------------------------------------------------------------- + +SYN_SOURCE_FILES = \ +../../src/and2gate_equation.vhd \ +../../src/or2gate_equation.vhd \ +../../src/invgate_equation.vhd \ +../../src/mux2to1_structure_errors.vhd \ + +# do not delete this line +# ----------------------------------------------------------------------------- diff --git a/sim/mux2to1/makefile_truthtable.sources b/sim/mux2to1/makefile_truthtable.sources new file mode 100644 index 0000000..e815b55 --- /dev/null +++ b/sim/mux2to1/makefile_truthtable.sources @@ -0,0 +1,17 @@ +## ---------------------------------------------------------------------------- +## Script : makefile.sources +## ---------------------------------------------------------------------------- +## Author : Johann Faerber +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: provide all the VHDL source files in the variable SYN_SOURCE_FILES +## Attention !!! +## ------------- +## Do not forget a new line after the final source file ! +## ---------------------------------------------------------------------------- + +SYN_SOURCE_FILES = \ +../../src/mux2to1_truthtable.vhd \ + +# do not delete this line +# ----------------------------------------------------------------------------- diff --git a/sim/pwm/makefile b/sim/pwm/makefile new file mode 100644 index 0000000..962c45a --- /dev/null +++ b/sim/pwm/makefile @@ -0,0 +1,67 @@ +## ---------------------------------------------------------------------------- +## Script : makefile +## ---------------------------------------------------------------------------- +## Author : Johann Faerber, Friedrich Beckmann +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: This makefile allows automating design flow with ModelSim, +## it is based on a design directory structure described in +## ../makefile +## ---------------------------------------------------------------------------- + +################################################################### +# Project Configuration: +# +# assign variable PROJECT with the top level project name +# +# Prerequisite: +# - mandatory design directory structure (see end of file) +# - assumes file name of testbench t_$(PROJECT).vhd +################################################################### + +PROJECT = pwm + +include ./makefile.sources + +# Add here the testbench file +SOURCE_FILES = $(SYN_SOURCE_FILES) \ +../../src/t_$(PROJECT).vhd + +include ../makefile + +## ---------------------------------------------------------------------------- +## Description: +## ------------ +## assumes the following design directory structure as prerequisite +## +## DigitaltechnikPraktikum +## | +## +---src +## | and2gate_equation.vhd +## | invgate_equation.vhd +## | mux2to1_structure.vhd +## | or2gate_equation.vhd +## | t_mux2to1.vhd +## | de1_mux2to1_structure.vhd +## | +## +---sim +## | | makefile +## | | +## | \---mux2to1 +## | makefile +## | makefile.sources +## | +## +---pnr +## | | makefile +## | | +## | \---de1_mux2to1 +## | de1_mux2to1_pins.tcl +## | makefile +## | +## \---scripts +## de1_pin_assignments_minimumio.csv +## de1_pin_assignments_minimumio.tcl +## modelsim.ini +## quartus_project_settings.tcl +## ---------------------------------------------------------------------------- + diff --git a/sim/pwm/makefile.sources b/sim/pwm/makefile.sources new file mode 100644 index 0000000..5db2028 --- /dev/null +++ b/sim/pwm/makefile.sources @@ -0,0 +1,17 @@ +## ---------------------------------------------------------------------------- +## Script : makefile.sources +## ---------------------------------------------------------------------------- +## Author : Johann Faerber +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: provide all the VHDL source files in the variable SYN_SOURCE_FILES +## Attention !!! +## ------------- +## Do not forget a new line after the final source file ! +## ---------------------------------------------------------------------------- + +SYN_SOURCE_FILES = \ +../../src/pwm_rtl.vhd \ + +# do not delete this line +# ----------------------------------------------------------------------------- diff --git a/sim/pwm_incrementer/makefile b/sim/pwm_incrementer/makefile new file mode 100644 index 0000000..54e7a63 --- /dev/null +++ b/sim/pwm_incrementer/makefile @@ -0,0 +1,67 @@ +## ---------------------------------------------------------------------------- +## Script : makefile +## ---------------------------------------------------------------------------- +## Author : Johann Faerber, Friedrich Beckmann +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: This makefile allows automating design flow with ModelSim, +## it is based on a design directory structure described in +## ../makefile +## ---------------------------------------------------------------------------- + +################################################################### +# Project Configuration: +# +# assign variable PROJECT with the top level project name +# +# Prerequisite: +# - mandatory design directory structure (see end of file) +# - assumes file name of testbench t_$(PROJECT).vhd +################################################################### + +PROJECT = incrementer + +include ./makefile.sources + +# Add here the testbench file +SOURCE_FILES = $(SYN_SOURCE_FILES) \ +../../src/t_$(PROJECT).vhd + +include ../makefile + +## ---------------------------------------------------------------------------- +## Description: +## ------------ +## assumes the following design directory structure as prerequisite +## +## DigitaltechnikPraktikum +## | +## +---src +## | and2gate_equation.vhd +## | invgate_equation.vhd +## | mux2to1_structure.vhd +## | or2gate_equation.vhd +## | t_mux2to1.vhd +## | de1_mux2to1_structure.vhd +## | +## +---sim +## | | makefile +## | | +## | \---mux2to1 +## | makefile +## | makefile.sources +## | +## +---pnr +## | | makefile +## | | +## | \---de1_mux2to1 +## | de1_mux2to1_pins.tcl +## | makefile +## | +## \---scripts +## de1_pin_assignments_minimumio.csv +## de1_pin_assignments_minimumio.tcl +## modelsim.ini +## quartus_project_settings.tcl +## ---------------------------------------------------------------------------- + diff --git a/sim/pwm_incrementer/makefile.sources b/sim/pwm_incrementer/makefile.sources new file mode 100644 index 0000000..687a731 --- /dev/null +++ b/sim/pwm_incrementer/makefile.sources @@ -0,0 +1,24 @@ +## ---------------------------------------------------------------------------- +## Script : makefile.sources +## ---------------------------------------------------------------------------- +## Author : Johann Faerber +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: provide all the VHDL source files in the variable SYN_SOURCE_FILES +## Attention !!! +## ------------- +## Do not forget a new line after the final source file ! +## ---------------------------------------------------------------------------- + +SYN_SOURCE_FILES = \ +../../src/rising_edge_detector_qfsm.vhd \ +../../src/falling_edge_detector_qfsm.vhd \ +../../src/resolver_master_qfsm.vhd \ +../../src/resolver_structure.vhd \ +../../src/synchroniser_rtl.vhd \ +../../src/cntupdn_rtl.vhd \ +../../src/incrementer_structure.vhd \ +../../src/pwm_rtl.vhd \ + +# do not delete this line +# ----------------------------------------------------------------------------- diff --git a/sim/resolver/makefile b/sim/resolver/makefile new file mode 100644 index 0000000..ac0a168 --- /dev/null +++ b/sim/resolver/makefile @@ -0,0 +1,68 @@ +## ---------------------------------------------------------------------------- +## Script : makefile +## ---------------------------------------------------------------------------- +## Author : Johann Faerber, Friedrich Beckmann +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: This makefile allows automating design flow with ModelSim, +## it is based on a design directory structure described in +## ../makefile +## ---------------------------------------------------------------------------- + +################################################################### +# Project Configuration: +# +# assign variable PROJECT with the top level project name +# +# Prerequisite: +# - mandatory design directory structure (see end of file) +# - assumes file name of testbench t_$(PROJECT).vhd +################################################################### + +PROJECT = resolver + +include ./makefile.sources + +# Add here the testbench file +SOURCE_FILES = $(SYN_SOURCE_FILES) \ +../../src/cntupdn_rtl.vhd \ +../../src/t_$(PROJECT).vhd + +include ../makefile + +## ---------------------------------------------------------------------------- +## Description: +## ------------ +## assumes the following design directory structure as prerequisite +## +## DigitaltechnikPraktikum +## | +## +---src +## | and2gate_equation.vhd +## | invgate_equation.vhd +## | mux2to1_structure.vhd +## | or2gate_equation.vhd +## | t_mux2to1.vhd +## | de1_mux2to1_structure.vhd +## | +## +---sim +## | | makefile +## | | +## | \---mux2to1 +## | makefile +## | makefile.sources +## | +## +---pnr +## | | makefile +## | | +## | \---de1_mux2to1 +## | de1_mux2to1_pins.tcl +## | makefile +## | +## \---scripts +## de1_pin_assignments_minimumio.csv +## de1_pin_assignments_minimumio.tcl +## modelsim.ini +## quartus_project_settings.tcl +## ---------------------------------------------------------------------------- + diff --git a/sim/resolver/makefile.sources b/sim/resolver/makefile.sources new file mode 100644 index 0000000..272943f --- /dev/null +++ b/sim/resolver/makefile.sources @@ -0,0 +1,21 @@ +## ---------------------------------------------------------------------------- +## Script : makefile.sources +## ---------------------------------------------------------------------------- +## Author : Johann Faerber +## Company : University of Applied Sciences Augsburg +## ---------------------------------------------------------------------------- +## Description: provide all the VHDL source files in the variable SYN_SOURCE_FILES +## Attention !!! +## ------------- +## Do not forget a new line after the final source file ! +## ---------------------------------------------------------------------------- + +SYN_SOURCE_FILES = \ +../../src/rising_edge_detector_qfsm.vhd \ +../../src/falling_edge_detector_qfsm.vhd \ +../../src/resolver_master_qfsm.vhd \ +../../src/synchroniser_rtl.vhd \ +../../src/resolver_structure.vhd \ + +# do not delete this line +# ----------------------------------------------------------------------------- diff --git a/src/a_falling_edge_detector_rtl.vhd b/src/a_falling_edge_detector_rtl.vhd new file mode 100644 index 0000000..117c3f1 --- /dev/null +++ b/src/a_falling_edge_detector_rtl.vhd @@ -0,0 +1,42 @@ +------------------------------------------------------------------------------- +-- Module : rtl +------------------------------------------------------------------------------- +-- Author : Johann Faerber +-- Company : University of Applied Sciences Augsburg +------------------------------------------------------------------------------- +-- Description: detects a falling edge of input signal x_i +-- and produces a high-active signal for one clock period at +-- output fall_o +-- clk_i __|--|__|--|__|--|__|--|__|--|__|--|__|--|__|--|__|--| +-- x_i -----|___________________________________|----------- +-- fall_o ________|-----|______________________________________ +-- +-- rtl model based on two flip flops with output logic +------------------------------------------------------------------------------- +-- Revisions : see end of file +------------------------------------------------------------------------------- +LIBRARY IEEE; +USE IEEE.std_logic_1164.ALL; + +ARCHITECTURE rtl OF falling_edge_detector IS + + SIGNAL q0, q1 : std_ulogic; -- D-Type Flip-Flop outputs + +BEGIN + + dflipflop_0 : q0 <= '0' WHEN (rst_ni = '0') ELSE + x_i WHEN rising_edge(clk_i); + + dflipflop_1 : q1 <= '0' WHEN (rst_ni = '0') ELSE + q0 WHEN rising_edge(clk_i); + + output_logic : fall_o <= ; -- fill in the correct equation here + +END rtl; + +------------------------------------------------------------------------------- +-- Revisions: +-- ---------- +-- $Id:$ +------------------------------------------------------------------------------- + diff --git a/src/adcintf.vhd b/src/adcintf.vhd new file mode 100644 index 0000000..c5ae405 --- /dev/null +++ b/src/adcintf.vhd @@ -0,0 +1,98 @@ +--Copyright 2013 Friedrich Beckmann, Hochschule Augsburg +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +-- ADC (Analog to Digital Converter) Interface +-- Shifts in 16 bits and provides the data in parallel +-- When all 16 bits are shifted in, the valid_o output is set to "1" for one clock cycle + +entity adcintf is + port ( + clk_i : in std_ulogic; + reset_ni : in std_ulogic; + en_i : in std_ulogic; + valid_o : out std_ulogic; + data_o : out std_ulogic_vector(15 downto 0); + start_i : in std_ulogic; + ser_dat_i : in std_ulogic); +end; + +architecture rtl of adcintf is + type state_t is (idle_s, shift_s, done_s); + signal state, new_state : state_t; + signal idx : integer range 0 to 15; + signal data : unsigned(15 downto 0); + signal idx_inc : std_ulogic; + signal idx_reset : std_ulogic; + signal data_shift : std_ulogic; +begin + + seq_p : process(clk_i, reset_ni) + begin + if reset_ni = '0' then + idx <= 0; + data <= (others => '0'); + state <= idle_s; + elsif rising_edge(clk_i) then + if data_shift = '1' then + data <= shift_left(data,1); + data(0) <= ser_dat_i; + end if; + if idx_reset = '1' then + idx <= 0; + elsif idx_inc = '1' and idx < 15 then + idx <= idx + 1; + end if; + state <= new_state; + end if; + end process seq_p; + + statem_comb_p : process(state, idx, start_i, en_i) + begin + idx_inc <= '0'; + idx_reset <= '0'; + new_state <= state; + data_shift <= '0'; + valid_o <= '0'; + case state is + when idle_s => + if start_i = '1' and en_i = '1' then + new_state <= shift_s; + idx_reset <= '1'; + end if; + when shift_s => + if en_i = '1' then + idx_inc <= '1'; + data_shift <= '1'; + if idx = 15 then + new_state <= done_s; + end if; + end if; + when done_s => + valid_o <= '1'; + new_state <= idle_s; + when others => + new_state <= idle_s; + end case; + end process statem_comb_p; + + data_o <= std_ulogic_vector(data); + +end; -- architecture + + diff --git a/src/and2gate_equation.vhd b/src/and2gate_equation.vhd new file mode 100644 index 0000000..9c7f0f2 --- /dev/null +++ b/src/and2gate_equation.vhd @@ -0,0 +1,35 @@ +-------------------------------------------------------------------------------
+-- Module : and2gate
+-------------------------------------------------------------------------------
+-- Author : Johann Faerber
+-- Company : University of Applied Sciences Augsburg
+-------------------------------------------------------------------------------
+-- Description: 2-input AND Gate
+-- function modelled by logic equation
+-------------------------------------------------------------------------------
+-- Revisions : see end of file
+-------------------------------------------------------------------------------
+LIBRARY IEEE;
+USE IEEE.std_logic_1164.ALL;
+
+ENTITY and2gate IS
+ PORT (a_i : IN std_ulogic; -- data input a
+ b_i : IN std_ulogic; -- data input b
+ y_o : OUT std_ulogic -- data output y
+ );
+END and2gate;
+
+ARCHITECTURE equation OF and2gate IS
+
+BEGIN
+
+ y_o <= a_i AND b_i;
+
+END equation;
+
+-------------------------------------------------------------------------------
+-- Revisions:
+-- ----------
+-- $Id:$
+-------------------------------------------------------------------------------
+
diff --git a/src/audio.vhd b/src/audio.vhd new file mode 100644 index 0000000..9a6ad17 --- /dev/null +++ b/src/audio.vhd @@ -0,0 +1,156 @@ +--Copyright 2021 Friedrich Beckmann, Hochschule Augsburg +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. + + +library ieee; +use ieee.std_logic_1164.all; + +entity audio is + port ( + clk_i : in std_ulogic; + reset_ni : in std_ulogic; + i2c_sclk_o : out std_ulogic; + i2c_dat_i : in std_ulogic; + i2c_dat_o : out std_ulogic; + aud_adclrck_o : out std_ulogic; + aud_adcdat_i : in std_ulogic; + aud_daclrck_o : out std_ulogic; + aud_dacdat_o : out std_ulogic; + aud_xck_o : out std_ulogic; + aud_bclk_o : out std_ulogic; + adc_data_o : out std_ulogic_vector(15 downto 0); + adc_valid_o : out std_ulogic; + dac_data_i : in std_ulogic_vector(15 downto 0); + dac_strobe_o : out std_ulogic); +end; + +architecture struct of audio is + + component i2c_sub is + port ( + clk_i: in std_ulogic; + reset_ni: in std_ulogic; + i2c_clk_o: out std_ulogic; + i2c_dat_o: out std_ulogic; + i2c_dat_i: in std_ulogic + ); + end component; + + component adcintf is + port ( + clk_i : in std_ulogic; + reset_ni : in std_ulogic; + en_i : in std_ulogic; + valid_o : out std_ulogic; + data_o : out std_ulogic_vector(15 downto 0); + start_i : in std_ulogic; + ser_dat_i : in std_ulogic); + end component; + + component dacintf is + port ( + clk_i : in std_ulogic; + reset_ni : in std_ulogic; + load_i : in std_ulogic; + data_i : in std_ulogic_vector(15 downto 0); + en_i : in std_ulogic; + ser_dat_o : out std_ulogic); + end component; + + component bclk is + port ( + clk_i : in std_ulogic; + reset_ni : in std_ulogic; + bclk_o : out std_ulogic; + bclk_falling_edge_en_o : out std_ulogic); + end component; + + component fsgen is + port ( + clk_i : in std_ulogic; + reset_ni : in std_ulogic; + bclk_falling_edge_en_i : in std_ulogic; + fs_o : out std_ulogic); + end component; + + component mclk is + port ( + clk_i : in std_ulogic; + reset_ni : in std_ulogic; + mclk_o : out std_ulogic); + end component; + + signal framesync : std_ulogic; + signal bclk_falling_edge_en : std_ulogic; + + signal adc_valid : std_ulogic; + signal dac_data, adc_data : std_ulogic_vector(15 downto 0); + +begin + + i2c_sub_i0 : i2c_sub + port map ( + clk_i => clk_i, + reset_ni => reset_ni, + i2c_clk_o => i2c_sclk_o, + i2c_dat_o => i2c_dat_o, + i2c_dat_i => i2c_dat_i); + + mclk_i0 : mclk + port map( + clk_i => clk_i, + reset_ni => reset_ni, + mclk_o => aud_xck_o); + + bclk_i0 : bclk + port map ( + clk_i => clk_i, + reset_ni => reset_ni, + bclk_o => aud_bclk_o, + bclk_falling_edge_en_o => bclk_falling_edge_en); + + fsgen_i0 : fsgen + port map ( + clk_i => clk_i, + reset_ni => reset_ni, + bclk_falling_edge_en_i => bclk_falling_edge_en, + fs_o => framesync); + + dacintf_i0 : dacintf + port map ( + clk_i => clk_i, + reset_ni => reset_ni, + load_i => framesync, + data_i => dac_data_i, + en_i => bclk_falling_edge_en, + ser_dat_o => aud_dacdat_o); + + adcintf_i0 : adcintf + port map ( + clk_i => clk_i, + reset_ni => reset_ni, + valid_o => adc_valid_o, + data_o => adc_data_o, + start_i => framesync, + en_i => bclk_falling_edge_en, + ser_dat_i => aud_adcdat_i); + + aud_daclrck_o <= framesync; + aud_adclrck_o <= framesync; + + dac_strobe_o <= framesync and bclk_falling_edge_en; + +end; -- architecture + + diff --git a/src/bclk.vhd b/src/bclk.vhd new file mode 100644 index 0000000..4d72539 --- /dev/null +++ b/src/bclk.vhd @@ -0,0 +1,79 @@ +--Copyright 2013 Friedrich Beckmann, Hochschule Augsburg +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +-- Bitclock generator + +entity bclk is + port ( + clk_i : in std_ulogic; + reset_ni : in std_ulogic; + bclk_o : out std_ulogic; + bclk_falling_edge_en_o : out std_ulogic); +end; + +architecture rtl of bclk is + constant max_count : integer := 7; + signal clk_counter : integer range 0 to max_count; + signal bclk_rising_edge_en : std_ulogic; + signal bclk_falling_edge_en : std_ulogic; +begin + + bclk_cnt_p : process(clk_i, reset_ni) + begin + if reset_ni = '0' then + clk_counter <= 0; + elsif rising_edge(clk_i) then + if clk_counter = max_count then + clk_counter <= 0; + else + clk_counter <= clk_counter + 1; + end if; + end if; + end process bclk_cnt_p; + + edge_comb_p : process(clk_counter) + begin + bclk_rising_edge_en <= '0'; + bclk_falling_edge_en <= '0'; + if clk_counter = max_count then + bclk_rising_edge_en <= '1'; + end if; + if clk_counter = max_count / 2 then + bclk_falling_edge_en <= '1'; + end if; + end process edge_comb_p; + + bclk_p : process(clk_i, reset_ni) + begin + if reset_ni = '0' then + bclk_o <= '0'; + elsif rising_edge(clk_i) then + if bclk_rising_edge_en = '1' then + bclk_o <= '1'; + elsif bclk_falling_edge_en = '1' then + bclk_o <= '0'; + end if; + end if; + end process bclk_p; + + bclk_falling_edge_en_o <= bclk_falling_edge_en; + +end; -- architecture + + diff --git a/src/binto7segment_truthtable.vhd b/src/binto7segment_truthtable.vhd new file mode 100644 index 0000000..e0be505 --- /dev/null +++ b/src/binto7segment_truthtable.vhd @@ -0,0 +1,63 @@ +------------------------------------------------------------------------------- +-- Module : binto7segment +------------------------------------------------------------------------------- +-- Author : Johann Faerber +-- Company : University of Applied Sciences Augsburg +------------------------------------------------------------------------------- +-- Description: binary-to-7-segment decoder +-- function modelled as a truth table +-- using a selected signal assignment +-- segments get illuminated by a low-active signal +------------------------------------------------------------------------------- +-- Revisions : see end of file +------------------------------------------------------------------------------- +LIBRARY IEEE; +USE IEEE.std_logic_1164.ALL; + +ENTITY binto7segment IS + PORT (bin_i : IN std_ulogic_vector(3 DOWNTO 0); + segments_o : OUT std_ulogic_vector(6 DOWNTO 0) + ); +END binto7segment; + +ARCHITECTURE truthtable OF binto7segment IS + + -- seven-segment positions + -- + -- segment positions input vector index segment name + -- a 0 => a + -- --- 1 => b + -- f | | b 2 => c + -- --- <- g 3 => d + -- e | | c 4 => e + -- --- 5 => f + -- d 6 => g + +BEGIN + + decoder : WITH bin_i SELECT + segments_o <= + -- outputs: | inputs: + -------------------------------------------- + -- index | number displayed + -- 6543210 | + -------------------------------------------- + "1000000" WHEN "0000", -- 0 + "1111001" WHEN "0001", -- 1 + "0100100" WHEN "0010", -- 2 + "0110000" WHEN "0011", -- 3 + "0001001" WHEN "0100", -- 4 + "0010010" WHEN "0101", -- 5 + "0000010" WHEN "0110", -- 6 + "0111000" WHEN "0111", -- 7 + "0000000" WHEN "1000", -- 8 + "0010000" WHEN "1001", -- 9 + "0000110" WHEN OTHERS; -- displays Symbol 'E' for ERROR + +END truthtable; +------------------------------------------------------------------------------- +-- Revisions: +-- ---------- +-- $Id:$ +------------------------------------------------------------------------------- + diff --git a/src/cntdn_rtl.vhd b/src/cntdn_rtl.vhd new file mode 100644 index 0000000..7ce14ea --- /dev/null +++ b/src/cntdn_rtl.vhd @@ -0,0 +1,47 @@ +------------------------------------------------------------------------------- +-- Module : cntdn +------------------------------------------------------------------------------- +-- Author : Johann Faerber +-- Company : University of Applied Sciences Augsburg +------------------------------------------------------------------------------- +-- Description: Down-Counter +-- including a low-active asynchronous reset input rst_ni +-- a high-active enable input en_pi +-- and a terminal count output: tc = 1 when count = 0 +------------------------------------------------------------------------------- +-- Revisions : see end of file +------------------------------------------------------------------------------- +LIBRARY IEEE; +USE IEEE.std_logic_1164.ALL; +USE IEEE.numeric_std.ALL; + +ENTITY cntdn IS + PORT (clk_i : IN std_ulogic; + rst_ni : IN std_ulogic; + en_pi : IN std_ulogic; + count_o : OUT std_ulogic_vector(3 DOWNTO 0); + tc_o : OUT std_ulogic + ); +END cntdn; + +ARCHITECTURE rtl OF cntdn IS + + +BEGIN + + incrementer : + + state_register : + + counter_output : + + terminal_output : + +END rtl; + +------------------------------------------------------------------------------- +-- Revisions: +-- ---------- +-- $Id:$ +------------------------------------------------------------------------------- + diff --git a/src/cntdnmodm_rtl.vhd b/src/cntdnmodm_rtl.vhd new file mode 100644 index 0000000..51809a4 --- /dev/null +++ b/src/cntdnmodm_rtl.vhd @@ -0,0 +1,54 @@ +------------------------------------------------------------------------------- +-- Module : cntdnmodm +------------------------------------------------------------------------------- +-- Author : Johann Faerber +-- Company : University of Applied Sciences Augsburg +------------------------------------------------------------------------------- +-- Description: Modulo-m n-Bit Down-Counter +-- including a low-active asynchronous reset input rst_ni +-- and a high-active enable input en_pi +-- additionally, a high_active output signal tc_o is produced, +-- when the counter reaches it's minimum value +------------------------------------------------------------------------------- +-- Revisions : see end of file +------------------------------------------------------------------------------- +LIBRARY IEEE; +USE IEEE.std_logic_1164.ALL; +USE IEEE.numeric_std.ALL; + +ENTITY cntdnmodm IS + GENERIC ( + n : natural := 4; -- counter width + m : natural := 10); -- modulo value + PORT (clk_i : IN std_ulogic; + rst_ni : IN std_ulogic; + en_pi : IN std_ulogic; + count_o : OUT std_ulogic_vector(n-1 DOWNTO 0); + tc_o : OUT std_ulogic + ); +END cntdnmodm; + +ARCHITECTURE rtl OF cntdnmodm IS + + SIGNAL next_state, current_state : unsigned(n-1 DOWNTO 0); + +BEGIN + + -- includes decrementer and modulo logic + next_state_logic : next_state <= to_unsigned(m-1, n) WHEN current_state = 0 ELSE + current_state - 1; + + state_register : + + counter_output : + + terminal_count : + +END rtl; + +------------------------------------------------------------------------------- +-- Revisions: +-- ---------- +-- $Id:$ +------------------------------------------------------------------------------- + diff --git a/src/cntupdn_rtl.vhd b/src/cntupdn_rtl.vhd new file mode 100644 index 0000000..5f022e3 --- /dev/null +++ b/src/cntupdn_rtl.vhd @@ -0,0 +1,47 @@ +------------------------------------------------------------------------------- +-- Module : cntupdn +------------------------------------------------------------------------------- +-- Author : Johann Faerber +-- Company : University of Applied Sciences Augsburg +------------------------------------------------------------------------------- +-- Description: Up/Down-Counter +-- including a low-active asynchronous reset input rst_ni +-- a high-active enable input en_pi +-- mode_i = 0 -> count down +-- mode_i = 1 -> count up +------------------------------------------------------------------------------- +-- Revisions : see end of file +------------------------------------------------------------------------------- +LIBRARY IEEE; +USE IEEE.std_logic_1164.ALL; +USE IEEE.numeric_std.ALL; + +ENTITY cntupdn IS + PORT (clk_i : IN std_ulogic; + rst_ni : IN std_ulogic; + en_pi : IN std_ulogic; + mode_i : IN std_ulogic; -- mode_i = 0 -> count down + -- mode_i = 1 -> count up + count_o : OUT std_ulogic_vector(3 DOWNTO 0) + ); +END cntupdn; + +ARCHITECTURE rtl OF cntupdn IS + + +BEGIN + + de_incrementer : + + state_register : + + counter_output : + +END rtl; + +------------------------------------------------------------------------------- +-- Revisions: +-- ---------- +-- $Id:$ +------------------------------------------------------------------------------- + diff --git a/src/cntupen_rtl.vhd b/src/cntupen_rtl.vhd new file mode 100644 index 0000000..2c68a73 --- /dev/null +++ b/src/cntupen_rtl.vhd @@ -0,0 +1,52 @@ +------------------------------------------------------------------------------- +-- Module : cntupen +------------------------------------------------------------------------------- +-- Author : Johann Faerber +-- Company : University of Applied Sciences Augsburg +------------------------------------------------------------------------------- +-- Description: Up-Counter +-- including a low-active asynchronous reset input rst_ni +-- and a high-active enable input en_pi +------------------------------------------------------------------------------- +-- Revisions : see end of file +------------------------------------------------------------------------------- +LIBRARY IEEE; +USE IEEE.std_logic_1164.ALL; +USE IEEE.numeric_std.ALL; + +ENTITY cntupen IS + PORT (clk_i : IN std_ulogic; + rst_ni : IN std_ulogic; + en_pi : IN std_ulogic; + count_o : OUT std_ulogic_vector(3 DOWNTO 0) + ); +END cntupen; + +ARCHITECTURE rtl OF cntupen IS + + -- datatype unsigned is defined in package numeric_std + SIGNAL next_state, current_state : unsigned(3 DOWNTO 0); + +BEGIN + + -- package numeric_std overloads operator '+' + -- for arguments of different types, here: unsigned and integer + incrementer : next_state <= current_state + 1; + + + -- synthesisable construct of a d-type register with synchronrous enable + state_register : current_state <= "0000" WHEN rst_ni = '0' ELSE + next_state WHEN rising_edge(clk_i) AND (en_pi = '1'); + + + -- type conversion from unsignd to std_ulogic_vector necessary + counter_output : count_o <= std_ulogic_vector(current_state); + +END rtl; + +------------------------------------------------------------------------------- +-- Revisions: +-- ---------- +-- $Id:$ +------------------------------------------------------------------------------- + diff --git a/src/d_ff_rtl.vhd b/src/d_ff_rtl.vhd new file mode 100644 index 0000000..af06a3e --- /dev/null +++ b/src/d_ff_rtl.vhd @@ -0,0 +1,39 @@ +------------------------------------------------------------------------------- +-- Module : d_ff +------------------------------------------------------------------------------- +-- Author : Johann Faerber +-- Company : University of Applied Sciences Augsburg +------------------------------------------------------------------------------- +-- Description: D-Type Flip-Flop +-- including a low-active asynchronous reset input rst_ni +-- and a high-active enable input en_pi +------------------------------------------------------------------------------- +-- Revisions : see end of file +------------------------------------------------------------------------------- +LIBRARY IEEE; +USE IEEE.std_logic_1164.ALL; + +ENTITY d_ff IS + PORT ( + clk_i : IN std_ulogic; + rst_ni : IN std_ulogic; + d_i : IN std_ulogic; + q_o : OUT std_ulogic + ); +END d_ff; + +ARCHITECTURE rtl OF d_ff IS + +BEGIN + + dflipflop_p : q_o <= '0' WHEN (rst_ni = '0') ELSE + d_i WHEN rising_edge(clk_i); + +END rtl; + +------------------------------------------------------------------------------- +-- Revisions: +-- ---------- +-- $Id:$ +------------------------------------------------------------------------------- + diff --git a/src/dacintf.vhd b/src/dacintf.vhd new file mode 100644 index 0000000..87c48fa --- /dev/null +++ b/src/dacintf.vhd @@ -0,0 +1,60 @@ +--Copyright 2013 Friedrich Beckmann, Hochschule Augsburg +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +-- DAC (Digital to Analog Converter) Interface +-- Loads a word in parallel and shifts it out as serial bit stream +-- The data needs to be shifted out twice. This is required as +-- the audio interface needs stereo data. + +entity dacintf is + port ( + clk_i : in std_ulogic; + reset_ni : in std_ulogic; + load_i : in std_ulogic; + data_i : in std_ulogic_vector(15 downto 0); + en_i : in std_ulogic; + ser_dat_o : out std_ulogic); +end; + +architecture rtl of dacintf is + signal idx : integer range 0 to 31; + signal data : unsigned(15 downto 0); +begin + + load_and_shift_p : process(clk_i, reset_ni) + begin + if reset_ni = '0' then + idx <= 0; + data <= (others => '0'); + elsif rising_edge(clk_i) then + if load_i = '1' and en_i = '1' then + data <= unsigned(data_i); + idx <= 0; + elsif en_i = '1' and idx < 31 then + data <= rotate_left(data,1); + idx <= idx + 1; + end if; + end if; + end process load_and_shift_p; + + ser_dat_o <= data(15); + +end; -- architecture + + diff --git a/src/de1_adc_rtl.vhd b/src/de1_adc_rtl.vhd new file mode 100644 index 0000000..d82c892 --- /dev/null +++ b/src/de1_adc_rtl.vhd @@ -0,0 +1,111 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +-- PLL for 100 MHz speed +library altera_mf; +use altera_mf.all; + +entity de1_adc is + port ( CLOCK_50 : in std_ulogic; + SW : in std_ulogic_vector(9 downto 0); + KEY0 : in std_ulogic; + DAC_MODE : out std_ulogic; --1=dual port, 0=interleaved + DAC_WRT_A : out std_ulogic; + DAC_WRT_B : out std_ulogic; + DAC_CLK_A : out std_ulogic; -- PLL_OUT_DAC0 in User Manual + DAC_CLK_B : out std_ulogic; -- PLL_OUT_DAC1 in User Manual + DAC_DA : out std_ulogic_vector(13 downto 0); + DAC_DB : out std_ulogic_vector(13 downto 0); + ADC_CLK_A : out std_ulogic; + ADC_CLK_B : out std_ulogic; + POWER_ON : out std_ulogic; + ADC_OEB_A : out std_ulogic; + ADC_OEB_B : out std_ulogic; + ADC_DA : in std_ulogic_vector(13 downto 0); + ADC_DB : in std_ulogic_vector(13 downto 0); + ADC_OTR_A : in std_ulogic; + ADC_OTR_B : in std_ulogic; + LEDR : out std_ulogic_vector(9 downto 0)); -- red LEDs +end entity; + +architecture rtl of de1_adc is + + -- Altera PLL + component altpll + generic ( + clk0_divide_by : natural; + clk0_duty_cycle : natural; + clk0_multiply_by : natural; +-- clk0_phase_shift : STRING; +-- compensate_clock : STRING; + inclk0_input_frequency : natural; +-- intended_device_family : STRING; +-- lpm_hint : STRING; +-- lpm_type : STRING; + operation_mode : string; + port_inclk0 : string; + port_clk0 : string + ); + port ( + clk : out std_logic_vector (5 downto 0); + inclk : in std_logic_vector (1 downto 0) + ); + end component; + + signal pll_inclk : std_logic_vector(1 downto 0); + signal pll_outclk : std_logic_vector(5 downto 0); + + signal clk,rst_n : std_ulogic; + signal dac_a_dat, dac_b_dat, adc_a_dat, adc_b_dat : std_ulogic_vector(13 downto 0); + +begin + + pll_i0 : altpll + generic map ( + clk0_divide_by => 10, + clk0_duty_cycle => 50, + clk0_multiply_by => 13, +-- clk0_phase_shift => "0", +-- compensate_clock => "CLK0", + inclk0_input_frequency => 20000, + operation_mode => "NORMAL", + port_inclk0 => "PORT_USED", + port_clk0 => "PORT_USED" + ) + port map ( + inclk => pll_inclk, + clk => pll_outclk + ); + + pll_inclk(0) <= CLOCK_50; + pll_inclk(1) <= '0'; + clk <= pll_outclk(0); + --clk <= CLOCK_50; + + rst_n <= KEY0; + LEDR <= "00000000" & ADC_OTR_A & ADC_OTR_B when rising_edge(clk); + + DAC_MODE <= '1'; --dual port + DAC_CLK_A <= clk; + DAC_CLK_B <= clk; + DAC_WRT_A <= clk; + DAC_WRT_B <= clk; + + dac_a_dat <= (others => '0') when rst_n = '0' else adc_a_dat when falling_edge(clk); + dac_b_dat <= (others => '0') when rst_n = '0' else adc_b_dat when falling_edge(clk); + + DAC_DA <= dac_a_dat; + DAC_DB <= dac_b_dat; + + -- ADC Section + ADC_CLK_A <= clk; + ADC_CLK_B <= clk; + ADC_OEB_A <= '0'; + ADC_OEB_B <= '0'; + POWER_ON <= '1'; + + adc_a_dat <= (others => '0') when rst_n = '0' else ADC_DA when rising_edge(clk); + adc_b_dat <= (others => '0') when rst_n = '0' else ADC_DB when rising_edge(clk); + +end architecture rtl; diff --git a/src/de1_add1_structure.vhd b/src/de1_add1_structure.vhd new file mode 100644 index 0000000..5c12d59 --- /dev/null +++ b/src/de1_add1_structure.vhd @@ -0,0 +1,51 @@ +------------------------------------------------------------------------------- +-- Module : de1_add1 +------------------------------------------------------------------------------- +-- Author : Johann Faerber +-- Company : University of Applied Sciences Augsburg +------------------------------------------------------------------------------- +-- Description: test the module add1 on a DE1 prototype board +-- connecting device under test (DUT) add1 +-- to input/output signals of the DE1 prototype board +------------------------------------------------------------------------------- +-- Revisions : see end of file +------------------------------------------------------------------------------- +LIBRARY IEEE; +USE IEEE.std_logic_1164.ALL; + +ENTITY de1_add1 IS + PORT ( + SW : IN std_ulogic_vector(2 DOWNTO 0); -- Toggle Switch[2:0] + LEDR : OUT std_ulogic_vector(1 DOWNTO 0) -- LED Red[1:0] + ); +END de1_add1; + +ARCHITECTURE structure OF de1_add1 IS + + COMPONENT add1 + PORT ( + a_i : IN std_ulogic; + b_i : IN std_ulogic; + ci_i : IN std_ulogic; + sum_o : OUT std_ulogic; + co_o : OUT std_ulogic); + END COMPONENT; + +BEGIN + + -- connecting device under test with peripheral elements + DUT : add1 + PORT MAP ( + a_i => SW(0), + b_i => SW(1), + ci_i => SW(2), + sum_o => LEDR(0), + co_o => LEDR(1) + ); + +END structure; +------------------------------------------------------------------------------- +-- Revisions: +-- ---------- +-- $Id:$ +------------------------------------------------------------------------------- diff --git a/src/de1_add4_structure.vhd b/src/de1_add4_structure.vhd new file mode 100644 index 0000000..bbd75ab --- /dev/null +++ b/src/de1_add4_structure.vhd @@ -0,0 +1,103 @@ +------------------------------------------------------------------------------- +-- Module : de1_add4 +------------------------------------------------------------------------------- +-- Author : Johann Faerber +-- Company : University of Applied Sciences Augsburg +------------------------------------------------------------------------------- +-- Description: test the module add4 on a DE1 prototype board +-- connecting device under test (DUT) add4 +-- to input/output signals of the DE1 prototype board +------------------------------------------------------------------------------- +-- Revisions : see end of file +------------------------------------------------------------------------------- +LIBRARY IEEE; +USE IEEE.std_logic_1164.ALL; + +ENTITY de1_add4 IS + PORT ( + SW : IN std_ulogic_vector(8 DOWNTO 0); -- Toggle Switch[8:0] + LEDR : OUT std_ulogic_vector(8 DOWNTO 0); -- LED Red[8:0] + LEDG : OUT std_ulogic_vector(4 DOWNTO 0); -- LED Green[3:0] + HEX0 : OUT std_ulogic_vector(6 DOWNTO 0); -- Seven Segment Digit 0 + HEX1 : OUT std_ulogic_vector(6 DOWNTO 0); -- Seven Segment Digit 1 + HEX2 : OUT std_ulogic_vector(6 DOWNTO 0); -- Seven Segment Digit 2 + + -- Ports for measurement of longest path through module + CLOCK_50 : IN std_ulogic; -- 50 MHz Clock + GPO_1 : OUT std_ulogic_vector(1 DOWNTO 0) -- Output Connector GPIO_1 + -- GPO_1[0] = CLOCK_50 + -- GPO_1[1] = co_o + + ); +END de1_add4; + +ARCHITECTURE structure OF de1_add4 IS + + COMPONENT binto7segment + PORT ( + bin_i : IN std_ulogic_vector(3 DOWNTO 0); + segments_o : OUT std_ulogic_vector(6 DOWNTO 0)); + END COMPONENT; + + COMPONENT add4 + PORT ( + a_i : IN std_ulogic_vector(3 DOWNTO 0); + b_i : IN std_ulogic_vector(3 DOWNTO 0); + ci_i : IN std_ulogic; + sum_o : OUT std_ulogic_vector(3 DOWNTO 0); + co_o : OUT std_ulogic); + END COMPONENT; + + SIGNAL a : std_ulogic_vector(3 DOWNTO 0); + SIGNAL b : std_ulogic_vector(3 DOWNTO 0); + SIGNAL ci : std_ulogic; + SIGNAL sum : std_ulogic_vector(3 DOWNTO 0); + SIGNAL co : std_ulogic; + +BEGIN + + -- Modifications for measurement of longest path through module + GPO_1(0) <= CLOCK_50; + GPO_1(1) <= co; + -- use the following line for Tpd measurement + -- ci <= CLOCK_50; -- tpd of add4 module only + + -- connecting switches to operands + ci <= SW(0); -- use this line, if connected by SW(0) + a <= SW(4 DOWNTO 1); + b <= SW(8 DOWNTO 5); + + -- connecting operands to LEDs + LEDR(0) <= SW(0); + LEDR(4 DOWNTO 1) <= SW(4 DOWNTO 1); + LEDR(8 DOWNTO 5) <= SW(8 DOWNTO 5); + + -- connecting device under test with peripheral elements + DUT : add4 + PORT MAP ( + a_i => a, + b_i => b, + ci_i => ci, + sum_o => sum, + co_o => co); + + -- connecting results to LEDs and HEX displays + LEDG(3 DOWNTO 0) <= sum; + LEDG(4) <= co; + + operand_a : binto7segment + PORT MAP ( + bin_i => a, + segments_o => HEX0); + + operand_b : binto7segment + PORT MAP ( -- fill in the missing components here ... + + + +END structure; +------------------------------------------------------------------------------- +-- Revisions: +-- ---------- +-- $Id:$ +------------------------------------------------------------------------------- diff --git a/src/de1_audio.vhd b/src/de1_audio.vhd new file mode 100644 index 0000000..f01a9a7 --- /dev/null +++ b/src/de1_audio.vhd @@ -0,0 +1,118 @@ +--Copyright 2013,2021 Friedrich Beckmann, Hochschule Augsburg +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library altera; +use altera.altera_primitives_components.all; + +entity de1_audio is + port ( + CLOCK_50: in std_ulogic; + KEY0: in std_ulogic; + I2C_SCLK: out std_ulogic; + I2C_SDAT: inout std_logic; + AUD_ADCLRCK: out std_ulogic; + AUD_ADCDAT: in std_ulogic; + AUD_DACLRCK: out std_ulogic; + AUD_DACDAT: out std_ulogic; + AUD_XCK: out std_ulogic; + AUD_BCLK: out std_ulogic; + LEDR: out std_ulogic_vector(9 downto 0)); +end; + +architecture struct of de1_audio is + + component audio is + port ( + clk_i : in std_ulogic; + reset_ni : in std_ulogic; + i2c_sclk_o : out std_ulogic; + i2c_dat_i : in std_ulogic; + i2c_dat_o : out std_ulogic; + aud_adclrck_o : out std_ulogic; + aud_adcdat_i : in std_ulogic; + aud_daclrck_o : out std_ulogic; + aud_dacdat_o : out std_ulogic; + aud_xck_o : out std_ulogic; + aud_bclk_o : out std_ulogic; + adc_data_o : out std_ulogic_vector(15 downto 0); + adc_valid_o : out std_ulogic; + dac_data_i : in std_ulogic_vector(15 downto 0); + dac_strobe_o : out std_ulogic); + end component; + + component ringbuf is + port ( + clk_i : in std_ulogic; + reset_ni : in std_ulogic; + en_i : in std_ulogic; + data_i : in std_ulogic_vector(15 downto 0); + data_o : out std_ulogic_vector(15 downto 0)); + end component; + + signal clk, reset_n : std_ulogic; + + signal i2c_dat_o : std_ulogic; + signal i2c_dat_i : std_ulogic; + + + signal adc_valid : std_ulogic; + signal dac_strobe : std_ulogic; + signal dac_data, adc_data : std_ulogic_vector(15 downto 0); + +begin + + reset_n <= KEY0; + clk <= CLOCK_50; + + audio_i0 : audio + port map ( + clk_i => clk, + reset_ni => reset_n, + i2c_sclk_o => I2C_SCLK, + i2c_dat_i => i2c_dat_i, + i2c_dat_o => i2c_dat_o, + aud_adclrck_o => AUD_ADCLRCK, + aud_adcdat_i => AUD_ADCDAT, + aud_daclrck_o => AUD_DACLRCK, + aud_dacdat_o => AUD_DACDAT, + aud_xck_o => AUD_XCK, + aud_bclk_o => AUD_BCLK, + adc_data_o => adc_data, + adc_valid_o => adc_valid, + dac_data_i => dac_data, + dac_strobe_o => dac_strobe); + + ringbuf_i0 : ringbuf + port map ( + clk_i => clk, + reset_ni => reset_n, + en_i => adc_valid, + data_i => adc_data, + data_o => dac_data); + + LEDR(9 downto 0) <= std_ulogic_vector(abs(signed(dac_data(15 downto 6)))); + + -- i2c has an open-drain ouput + i2c_dat_i <= I2C_SDAT; + i2c_data_buffer_i : OPNDRN + port map (a_in => i2c_dat_o, a_out => I2C_SDAT); + +end; -- architecture + + diff --git a/src/de1_binto7segment_structure.vhd b/src/de1_binto7segment_structure.vhd new file mode 100644 index 0000000..b4fbd79 --- /dev/null +++ b/src/de1_binto7segment_structure.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- Module : de1_binto7segment +------------------------------------------------------------------------------- +-- Author : Johann Faerber +-- Company : University of Applied Sciences Augsburg +------------------------------------------------------------------------------- +-- Description: test the module binto7segment on a DE1 prototype board +-- connecting device under test (DUT) binto7segment +-- to input/output signals of the DE1 prototype board +------------------------------------------------------------------------------- +-- Revisions : see end of file +------------------------------------------------------------------------------- +LIBRARY IEEE; +USE IEEE.std_logic_1164.ALL; + +ENTITY de1_binto7segment IS + PORT ( + SW : IN std_ulogic_vector(3 DOWNTO 0); -- Toggle Switch[3:0] + LEDR : OUT std_ulogic_vector(3 DOWNTO 0); -- LED Red[3:0] + HEX0 : OUT std_ulogic_vector(6 DOWNTO 0) -- Seven Segment Digit 0 + ); +END de1_binto7segment; + +ARCHITECTURE structure OF de1_binto7segment IS + + COMPONENT binto7segment + PORT ( + bin_i : IN std_ulogic_vector(3 DOWNTO 0); + segments_o : OUT std_ulogic_vector(6 DOWNTO 0)); + END COMPONENT; + +BEGIN + + -- connecting device under test with peripheral elements + DUT : binto7segment + PORT MAP ( + bin_i => SW, + segments_o => HEX0); + + -- connect switches to red LEDs + LEDR <= SW; + +END structure; +------------------------------------------------------------------------------- +-- Revisions: +-- ---------- +-- $Id:$ +------------------------------------------------------------------------------- diff --git a/src/de1_cntdn_structure.vhd b/src/de1_cntdn_structure.vhd new file mode 100644 index 0000000..d420996 --- /dev/null +++ b/src/de1_cntdn_structure.vhd @@ -0,0 +1,78 @@ +------------------------------------------------------------------------------- +-- Module : de1_cntdn +------------------------------------------------------------------------------- +-- Author : Johann Faerber +-- Company : University of Applied Sciences Augsburg +------------------------------------------------------------------------------- +-- Description: test the module cntdn on a DE1 prototype board +-- connecting device under test (DUT) cntdn +-- to input/output signals of the DE1 prototype board +------------------------------------------------------------------------------- +-- Revisions : see end of file +------------------------------------------------------------------------------- +LIBRARY IEEE; +USE IEEE.std_logic_1164.ALL; + +ENTITY de1_cntdn IS + PORT ( + CLOCK_50 : IN std_ulogic; -- 50 MHz Clock + KEY : IN std_ulogic_vector(1 DOWNTO 0); -- KEY[1:0] + -- KEY[0] = rst_ni + -- KEY[1] = en_pi + GPO_1 : OUT std_ulogic_vector(5 DOWNTO 0) -- Output Connector GPIO_1 + -- GPO_1[3:0] = count_o + -- GPO_1[4] = tc_o + -- GPO_1[5] = clk_i + ); +END de1_cntdn; + +ARCHITECTURE structure OF de1_cntdn IS + + COMPONENT cntdn + PORT ( + clk_i : IN std_ulogic; + rst_ni : IN std_ulogic; + en_pi : IN std_ulogic; + count_o : OUT std_ulogic_vector(3 DOWNTO 0); + tc_o : OUT std_ulogic); + END COMPONENT; + + SIGNAL clk_i : std_ulogic; + SIGNAL rst_ni : std_ulogic; + SIGNAL en_pi : std_ulogic; + SIGNAL count_o : std_ulogic_vector(3 DOWNTO 0); + SIGNAL tc_o : std_ulogic; + +BEGIN + + -- connecting clock generator master clock of synchronous system + clk_i <= CLOCK_50; + GPO_1(5) <= clk_i; -- to measure clk signal + + -- connecting asynchronous system reset to digital system + rst_ni <= KEY(0); + + -- count enable input is high-active, KEY(1) ist low-aktive, therefore ... + -- ... if KEY1 is released, high signal is produced + en_pi <= KEY(1); + + + -- connecting device under test with peripheral elements + DUT : ENTITY work.cntdn(rtl) + PORT MAP ( + clk_i => clk_i, + rst_ni => rst_ni, + en_pi => en_pi, + count_o => count_o, + tc_o => tc_o); + + -- connecting count value to GPIO1 + GPO_1(3 DOWNTO 0) <= count_o; + GPO_1(4) <= tc_o; + +END structure; +------------------------------------------------------------------------------- +-- Revisions: +-- ---------- +-- $Id:$ +------------------------------------------------------------------------------- diff --git a/src/de1_cntdnmodm_structure.vhd b/src/de1_cntdnmodm_structure.vhd new file mode 100644 index 0000000..d76c5f3 --- /dev/null +++ b/src/de1_cntdnmodm_structure.vhd @@ -0,0 +1,111 @@ +------------------------------------------------------------------------------- +-- Module : de1_cntdnmodm +------------------------------------------------------------------------------- +-- Author : Johann Faerber +-- Company : University of Applied Sciences Augsburg +------------------------------------------------------------------------------- +-- Description: test the module cntdnmodm on a DE1 prototype board +-- connecting device under test (DUT) cntdnmodm +-- to input/output signals of the DE1 prototype board +------------------------------------------------------------------------------- +-- Revisions : see end of file +------------------------------------------------------------------------------- +LIBRARY IEEE; +USE IEEE.std_logic_1164.ALL; + +ENTITY de1_cntdnmodm IS + PORT ( + CLOCK_50 : IN std_ulogic; -- 50 MHz Clock + KEY : IN std_ulogic_vector(1 DOWNTO 0); -- KEY[1:0] + -- KEY[0] = rst_ni + -- KEY[1] = en_pi + GPO_1 : OUT std_ulogic_vector(7 DOWNTO 0) -- Output Connector GPIO_1 + -- GPO_1[3:0] = count_o + -- GPO_1[4] = tc_o + -- GPO_1[5] = clk_i + -- GPO_1[6] = tc_mod6_o + -- GPO_1[7] = tc_100hz_o + ); +END de1_cntdnmodm; + +ARCHITECTURE structure OF de1_cntdnmodm IS + + COMPONENT cntdn + PORT ( + clk_i : IN std_ulogic; + rst_ni : IN std_ulogic; + en_pi : IN std_ulogic; + count_o : OUT std_ulogic_vector(3 DOWNTO 0); + tc_o : OUT std_ulogic); + END COMPONENT; + + SIGNAL clk_i : std_ulogic; + SIGNAL rst_ni : std_ulogic; + SIGNAL en_pi : std_ulogic; + SIGNAL count_o : std_ulogic_vector(3 DOWNTO 0); + SIGNAL tc_o : std_ulogic; + + SIGNAL tc_mod6_o : std_ulogic; + SIGNAL tc_100hz_o : std_ulogic; + +BEGIN + + -- connecting clock generator master clock of synchronous system + clk_i <= CLOCK_50; + GPO_1(5) <= clk_i; -- to measure clk signal + + -- connecting asynchronous system reset to digital system + rst_ni <= KEY(0); + + -- count enable input is high-active, KEY(1) ist low-aktive, therefore ... + -- ... if KEY1 is released, high signal is produced + en_pi <= KEY(1); + + + -- connecting device under test with peripheral elements + DUT : ENTITY work.cntdnmodm + GENERIC MAP ( + n => 4, + m => 10) + PORT MAP ( + clk_i => clk_i, + rst_ni => rst_ni, + en_pi => en_pi, + count_o => count_o, + tc_o => tc_o); + + -- 3-bit modulo-6 down counter + mod6_count : ENTITY work.cntdnmodm + GENERIC MAP ( + n => 3, + m => 6) + PORT MAP ( + clk_i => clk_i, + rst_ni => rst_ni, + en_pi => en_pi, + count_o => OPEN, + tc_o => tc_mod6_o); + + -- instantiate and parameterise the generics to + -- create a frequency of 100 Hz at its output signal tc_100hz_o + -- declare the necessary signals count_modxxx_o and tc_100hz_o + ----------------------------------------------------------------------------- +-- prescaler : cntdnmodm +-- GENERIC MAP ( +-- n => +-- m => ) +-- PORT MAP ( + ----------------------------------------------------------------------------- + + -- connecting count value to GPIO1 + GPO_1(3 DOWNTO 0) <= count_o; + GPO_1(4) <= tc_o; + GPO_1(6) <= tc_mod6_o; + GPO_1(7) <= tc_100hz_o; + +END structure; +------------------------------------------------------------------------------- +-- Revisions: +-- ---------- +-- $Id:$ +------------------------------------------------------------------------------- diff --git a/src/de1_dac_rtl.vhd b/src/de1_dac_rtl.vhd new file mode 100644 index 0000000..c1c90bf --- /dev/null +++ b/src/de1_dac_rtl.vhd @@ -0,0 +1,109 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +-- PLL for 100 MHz speed +library altera_mf; +use altera_mf.all; + +entity de1_dac is + port ( CLOCK_50 : in std_ulogic; + SW : in std_ulogic_vector(9 downto 0); + KEY0 : in std_ulogic; + DAC_MODE : out std_ulogic; --1=dual port, 0=interleaved + DAC_WRT_A : out std_ulogic; + DAC_WRT_B : out std_ulogic; + DAC_CLK_A : out std_ulogic; -- PLL_OUT_DAC0 in User Manual + DAC_CLK_B : out std_ulogic; -- PLL_OUT_DAC1 in User Manual + DAC_DA : out std_ulogic_vector(13 downto 0); + DAC_DB : out std_ulogic_vector(13 downto 0); + ADC_CLK_A : out std_ulogic; + ADC_CLK_B : out std_ulogic; + POWER_ON : out std_ulogic; + ADC_OEB_A : out std_ulogic; + ADC_OEB_B : out std_ulogic; + LEDR : out std_ulogic_vector(9 downto 0)); -- red LEDs +end entity; + +architecture rtl of de1_dac is + + -- Altera PLL + component altpll + generic ( + clk0_divide_by : natural; + clk0_duty_cycle : natural; + clk0_multiply_by : natural; +-- clk0_phase_shift : STRING; +-- compensate_clock : STRING; + inclk0_input_frequency : natural; +-- intended_device_family : STRING; +-- lpm_hint : STRING; +-- lpm_type : STRING; + operation_mode : string; + port_inclk0 : string; + port_clk0 : string + ); + port ( + clk : out std_logic_vector (5 downto 0); + inclk : in std_logic_vector (1 downto 0) + ); + end component; + + signal pll_inclk : std_logic_vector(1 downto 0); + signal pll_outclk : std_logic_vector(5 downto 0); + + signal clk,rst_n : std_ulogic; + signal cnt : unsigned(13 downto 0); + signal phase_inc : unsigned(9 downto 0); + signal dac_a_reg, dac_a_next, dac_b_reg : unsigned(13 downto 0); + +begin + + pll_i0 : altpll + generic map ( + clk0_divide_by => 1, + clk0_duty_cycle => 50, + clk0_multiply_by => 2, +-- clk0_phase_shift => "0", +-- compensate_clock => "CLK0", + inclk0_input_frequency => 20000, + operation_mode => "NORMAL", + port_inclk0 => "PORT_USED", + port_clk0 => "PORT_USED" + ) + port map ( + inclk => pll_inclk, + clk => pll_outclk + ); + + pll_inclk(0) <= CLOCK_50; + pll_inclk(1) <= '0'; + + clk <= pll_outclk(0); + rst_n <= '0' when KEY0 = '0' else '1' when rising_edge (clk); + LEDR <= SW; + + DAC_MODE <= '1'; --dual port + DAC_CLK_A <= clk; + DAC_CLK_B <= clk; + DAC_WRT_A <= clk; + DAC_WRT_B <= clk; + + phase_inc <= unsigned(SW(9 downto 1) & '0'); + + cnt <= (others => '0') when rst_n = '0' else cnt+phase_inc when rising_edge(clk); + + dac_a_next <= (others => '1') when cnt = 0 else (others => '0'); + dac_a_reg <= (others => '0') when rst_n = '0' else dac_a_next when falling_edge(clk); + dac_b_reg <= (others => '0') when rst_n = '0' else cnt when falling_edge(clk); + DAC_DA <= std_ulogic_vector(dac_a_reg); + DAC_DB <= std_ulogic_vector(dac_b_reg); + + -- ADC Section - switch off everything + ADC_CLK_A <= '0'; + ADC_CLK_B <= '0'; + ADC_OEB_A <= '1'; + ADC_OEB_B <= '1'; + POWER_ON <= '1'; + +end architecture rtl; diff --git a/src/de1_matlab_audio.vhd b/src/de1_matlab_audio.vhd new file mode 100644 index 0000000..4d7e613 --- /dev/null +++ b/src/de1_matlab_audio.vhd @@ -0,0 +1,126 @@ +--Copyright 2013,2021 Friedrich Beckmann, Hochschule Augsburg +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library altera; +use altera.altera_primitives_components.all; + +entity de1_matlab_audio is + port ( + CLOCK_50: in std_ulogic; + KEY0: in std_ulogic; + SW: in std_ulogic_vector(9 downto 0); + I2C_SCLK: out std_ulogic; + I2C_SDAT: inout std_logic; + AUD_ADCLRCK: out std_ulogic; + AUD_ADCDAT: in std_ulogic; + AUD_DACLRCK: out std_ulogic; + AUD_DACDAT: out std_ulogic; + AUD_XCK: out std_ulogic; + AUD_BCLK: out std_ulogic; + LEDR: out std_ulogic_vector(9 downto 0)); +end; + +architecture struct of de1_matlab_audio is + + -- Matlab generated toplevel + component ml_audio is + port (clk : in std_logic; + rst_n : in std_logic; + clk_enable : in std_logic; + ce_out : out std_logic; + switches_i : in std_logic_vector(9 downto 0); + audio_i : in std_logic_vector(15 downto 0); + audio_o : out std_logic_vector(15 downto 0)); + end component; + + -- Wolfson AudioCodec Interface block + component audio is + port ( + clk_i : in std_ulogic; + reset_ni : in std_ulogic; + i2c_sclk_o : out std_ulogic; + i2c_dat_i : in std_ulogic; + i2c_dat_o : out std_ulogic; + aud_adclrck_o : out std_ulogic; + aud_adcdat_i : in std_ulogic; + aud_daclrck_o : out std_ulogic; + aud_dacdat_o : out std_ulogic; + aud_xck_o : out std_ulogic; + aud_bclk_o : out std_ulogic; + adc_data_o : out std_ulogic_vector(15 downto 0); + adc_valid_o : out std_ulogic; + dac_data_i : in std_ulogic_vector(15 downto 0); + dac_strobe_o : out std_ulogic); + end component; + + signal clk, reset_n : std_ulogic; + + signal i2c_dat_o : std_ulogic; + signal i2c_dat_i : std_ulogic; + + signal adc_valid : std_ulogic; + signal dac_strobe : std_ulogic; + signal dac_data : std_logic_vector(15 downto 0); + signal adc_data, dac_data_reg : std_ulogic_vector(15 downto 0); + signal ml_audio_out_valid : std_ulogic; + +begin + + reset_n <= KEY0; + clk <= CLOCK_50; + + ml_audio_i0 : ml_audio + port map ( + clk => clk, + rst_n => reset_n, + clk_enable => adc_valid, + ce_out => ml_audio_out_valid, + switches_i => std_logic_vector(SW), + audio_i => std_logic_vector(adc_data), + audio_o => dac_data); + + dac_data_reg <= std_ulogic_vector(dac_data) when rising_edge(clk) and ml_audio_out_valid = '1'; + + -- Wolfson Audio Codec + audio_i0 : audio + port map ( + clk_i => clk, + reset_ni => reset_n, + i2c_sclk_o => I2C_SCLK, + i2c_dat_i => i2c_dat_i, + i2c_dat_o => i2c_dat_o, + aud_adclrck_o => AUD_ADCLRCK, + aud_adcdat_i => AUD_ADCDAT, + aud_daclrck_o => AUD_DACLRCK, + aud_dacdat_o => AUD_DACDAT, + aud_xck_o => AUD_XCK, + aud_bclk_o => AUD_BCLK, + adc_data_o => adc_data, + adc_valid_o => adc_valid, + dac_data_i => dac_data_reg, + dac_strobe_o => dac_strobe); + + LEDR <= SW; + + -- i2c has an open-drain ouput + i2c_dat_i <= I2C_SDAT; + i2c_data_buffer_i : OPNDRN + port map (a_in => i2c_dat_o, a_out => I2C_SDAT); + +end; -- architecture diff --git a/src/de1_mux2to1_structure.vhd b/src/de1_mux2to1_structure.vhd new file mode 100644 index 0000000..33c1257 --- /dev/null +++ b/src/de1_mux2to1_structure.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- Module : de1_mux2to1 +------------------------------------------------------------------------------- +-- Author : Johann Faerber +-- Company : University of Applied Sciences Augsburg +------------------------------------------------------------------------------- +-- Description: test the module add1 on a DE1 prototype board +-- connecting device under test (DUT) add1 +-- to input/output signals of the DE1 prototype board +------------------------------------------------------------------------------- +-- Revisions : see end of file +------------------------------------------------------------------------------- +LIBRARY IEEE; +USE IEEE.std_logic_1164.ALL; + +ENTITY de1_mux2to1 IS + PORT ( + SW : IN std_ulogic_vector(2 DOWNTO 0); -- Toggle Switch[2:0] + LEDR : OUT std_ulogic -- LED Red[0] + ); +END de1_mux2to1; + +ARCHITECTURE structure OF de1_mux2to1 IS + + COMPONENT mux2to1 + PORT ( + a_i : IN std_ulogic; + b_i : IN std_ulogic; + sel_i : IN std_ulogic; + y_o : OUT std_ulogic); + END COMPONENT; + +BEGIN + + -- connecting device under test with peripheral elements + DUT : mux2to1 + PORT MAP ( + a_i => SW(0), + b_i => SW(1), + sel_i => SW(2), + y_o => LEDR); + +END structure; +------------------------------------------------------------------------------- +-- Revisions: +-- ---------- +-- $Id:$ +------------------------------------------------------------------------------- diff --git a/src/de1_sta.vhd b/src/de1_sta.vhd new file mode 100644 index 0000000..91a93aa --- /dev/null +++ b/src/de1_sta.vhd @@ -0,0 +1,32 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity de1_sta is + port ( + CLOCK_50 : in std_ulogic; + x_i : in unsigned(7 downto 0); + y_o : out unsigned(x_i'range) + ); +end de1_sta; + +architecture rtl of de1_sta is + +signal a,b,c,d : unsigned(x_i'range); +signal sum : unsigned(x_i'range); +signal clk : std_ulogic; + +begin + +clk <= CLOCK_50; + +sum <= a + b + c + d; + +y_o <= sum when rising_edge(clk); + +a <= x_i when rising_edge(clk); +b <= a when rising_edge(clk); +c <= b when rising_edge(clk); +d <= c when rising_edge(clk); + +end architecture; diff --git a/src/de1_tone.vhd b/src/de1_tone.vhd new file mode 100644 index 0000000..eff30f9 --- /dev/null +++ b/src/de1_tone.vhd @@ -0,0 +1,119 @@ +--Copyright 2013,2021 Friedrich Beckmann, Hochschule Augsburg +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library altera; +use altera.altera_primitives_components.all; + +entity de1_tone is + port ( + CLOCK_50 : in std_ulogic; + KEY0 : in std_ulogic; + I2C_SCLK : out std_ulogic; + I2C_SDAT : inout std_logic; + AUD_ADCLRCK : out std_ulogic; + AUD_ADCDAT : in std_ulogic; + AUD_DACLRCK : out std_ulogic; + AUD_DACDAT : out std_ulogic; + AUD_XCK : out std_ulogic; + AUD_BCLK : out std_ulogic; + SW : in std_ulogic_vector(9 downto 0); + LEDR : out std_ulogic_vector(9 downto 0)); +end; + +architecture struct of de1_tone is + + component audio is + port ( + clk_i : in std_ulogic; + reset_ni : in std_ulogic; + i2c_sclk_o : out std_ulogic; + i2c_dat_i : in std_ulogic; + i2c_dat_o : out std_ulogic; + aud_adclrck_o : out std_ulogic; + aud_adcdat_i : in std_ulogic; + aud_daclrck_o : out std_ulogic; + aud_dacdat_o : out std_ulogic; + aud_xck_o : out std_ulogic; + aud_bclk_o : out std_ulogic; + adc_data_o : out std_ulogic_vector(15 downto 0); + adc_valid_o : out std_ulogic; + dac_data_i : in std_ulogic_vector(15 downto 0); + dac_strobe_o : out std_ulogic); + end component; + + component tone is + port (clk : in std_ulogic; + rst_n : in std_ulogic; + switches_i : in std_ulogic_vector(9 downto 0); + dv_i : in std_ulogic; + audio_i : in std_ulogic_vector(15 downto 0); + audio_o : out std_ulogic_vector(15 downto 0)); + end component; + + signal clk, reset_n : std_ulogic; + + signal i2c_dat_o : std_ulogic; + signal i2c_dat_i : std_ulogic; + + signal adc_valid : std_ulogic; + signal dac_strobe : std_ulogic; + signal dac_data, adc_data : std_ulogic_vector(15 downto 0); + +begin + + reset_n <= KEY0; + clk <= CLOCK_50; + + audio_i0 : audio + port map ( + clk_i => clk, + reset_ni => reset_n, + i2c_sclk_o => I2C_SCLK, + i2c_dat_i => i2c_dat_i, + i2c_dat_o => i2c_dat_o, + aud_adclrck_o => AUD_ADCLRCK, + aud_adcdat_i => AUD_ADCDAT, + aud_daclrck_o => AUD_DACLRCK, + aud_dacdat_o => AUD_DACDAT, + aud_xck_o => AUD_XCK, + aud_bclk_o => AUD_BCLK, + adc_data_o => adc_data, + adc_valid_o => adc_valid, + dac_data_i => dac_data, + dac_strobe_o => dac_strobe); + + tone_i0 : tone + port map ( + clk => clk, + rst_n => reset_n, + dv_i => adc_valid, + audio_i => adc_data, + audio_o => dac_data, + switches_i => SW); + + LEDR(9 downto 0) <= SW; + + -- i2c has an open-drain ouput + i2c_dat_i <= I2C_SDAT; + i2c_data_buffer_i : OPNDRN + port map (a_in => i2c_dat_o, a_out => I2C_SDAT); + +end; -- architecture + + diff --git a/src/e_falling_edge_detector.vhd b/src/e_falling_edge_detector.vhd new file mode 100644 index 0000000..db0cb16 --- /dev/null +++ b/src/e_falling_edge_detector.vhd @@ -0,0 +1,34 @@ +------------------------------------------------------------------------------- +-- Module : falling_edge_detector +------------------------------------------------------------------------------- +-- Author : Johann Faerber +-- Company : University of Applied Sciences Augsburg +------------------------------------------------------------------------------- +-- Description: detects a falling edge of input signal x_i +-- and produces a high-active signal for one clock period at +-- output fall_o +-- clk_i __|--|__|--|__|--|__|--|__|--|__|--|__|--|__|--|__|--| +-- x_i -----|___________________________________|----------- +-- fall_o ________|-----|______________________________________ +------------------------------------------------------------------------------- +-- Revisions : see end of file +------------------------------------------------------------------------------- +LIBRARY IEEE; +USE IEEE.std_logic_1164.ALL; + +ENTITY falling_edge_detector IS + PORT ( + clk_i : IN std_ulogic; + rst_ni : IN std_ulogic; + x_i : IN std_ulogic; + fall_o : OUT std_ulogic + ); +END falling_edge_detector; + + +------------------------------------------------------------------------------- +-- Revisions: +-- ---------- +-- $Id:$ +------------------------------------------------------------------------------- + diff --git a/src/fsgen.vhd b/src/fsgen.vhd new file mode 100644 index 0000000..e15deca --- /dev/null +++ b/src/fsgen.vhd @@ -0,0 +1,56 @@ +--Copyright 2013 Friedrich Beckmann, Hochschule Augsburg +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +-- Frame Sync Generator +-- The framesync is active for one bitclock cycle + +entity fsgen is + port ( + clk_i : in std_ulogic; + reset_ni : in std_ulogic; + bclk_falling_edge_en_i : in std_ulogic; + fs_o : out std_ulogic); +end; + +architecture rtl of fsgen is + constant max_count : integer := 127; + signal counter : integer range 0 to max_count; +begin + + fs_cnt_p : process(clk_i, reset_ni) + begin + if reset_ni = '0' then + counter <= 0; + fs_o <= '0'; + elsif rising_edge(clk_i) then + if bclk_falling_edge_en_i = '1' then + fs_o <= '0'; + if counter = max_count then + counter <= 0; + fs_o <= '1'; + else + counter <= counter + 1; + end if; + end if; + end if; + end process fs_cnt_p; + +end; -- architecture + + diff --git a/src/i2c.vhd b/src/i2c.vhd new file mode 100644 index 0000000..f60cdbe --- /dev/null +++ b/src/i2c.vhd @@ -0,0 +1,245 @@ +--Copyright 2013 Friedrich Beckmann, Hochschule Augsburg +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +-- I2C or 2-Wire Bus +-- To start a transaction, pull the data line to 'L' while the clock is still 'H' +-- 7 Bits Address +-- 1 Bit R/W (0 = Write, 1 = Read) +-- 1 Bit ACK (from Slave 0 if o.k.) +-- 8 Bits Data 15..8 +-- 1 Bit Ack from slave (0 if o.k.) +-- 8 Bits Data 7..0 +-- 1 Bit Ack from slave (0 if o.k.) + + +entity i2c is + port ( + clk_i: in std_ulogic; + reset_ni: in std_ulogic; + load_i: in std_ulogic; + data_i: in std_ulogic_vector(23 downto 0); + i2c_clk_o: out std_ulogic; + i2c_dat_o: out std_ulogic; + i2c_dat_i: in std_ulogic; + busy_o: out std_ulogic + ); +end; + +architecture rtl of i2c is + + -- Clock divider section + constant fd_c : integer := 50000000/20000/2; -- 50 MHz system clock, 20 kHz I2C clock + signal clk_cnt : integer range 0 to fd_c; + signal clk_cnt_reset, clk_cnt_done : std_ulogic; + + -- i2c data register index + signal idx : integer range 0 to 27; + signal idx_inc : std_ulogic; + signal idx_reset : std_ulogic; + + -- i2c registers with and without data for the acknowledgment section + -- In cycle 8, 17 and 26 there is an i2c acknowledgement cycle where the master + -- drives Z and the slave will drive "0" when everything is o.k. + -- The input data from the interface is without these acknowledgement bits + signal load_i2c_reg_without_ack : std_ulogic; + signal i2c_reg_without_ack : std_ulogic_vector(23 downto 0); + signal i2c_reg_with_ack : std_ulogic_vector(0 to 27); + + -- Statemachine + type state_t is (idle_s, start_s, data_hold_s, data_s, clock_high_s, stop_s); + signal state, next_state : state_t; + + -- Selection for the i2c output data + type i2c_dat_sel_t is (sel_old, sel_reg, sel_one, sel_zero); + signal i2c_dat_sel : i2c_dat_sel_t; + + type i2c_clk_sel_t is (sel_old, sel_one, sel_zero); + signal i2c_clk_sel : i2c_clk_sel_t; + + signal i2c_clk : std_ulogic; + signal i2c_clk_new : std_ulogic; + signal i2c_dat : std_ulogic; + signal i2c_dat_new : std_ulogic; + +begin + + -- i2c register with ack build from i2c without ack + -- i2c data is transmitted msb first, so bus direction is changed also + i2c_reg_with_ack(0 to 7) <= i2c_reg_without_ack(23 downto 16); + i2c_reg_with_ack(8) <= '1'; + i2c_reg_with_ack(9 to 16) <= i2c_reg_without_ack(15 downto 8); + i2c_reg_with_ack(17) <= '1'; + i2c_reg_with_ack(18 to 25) <= i2c_reg_without_ack(7 downto 0); + i2c_reg_with_ack(26) <= '1'; + i2c_reg_with_ack(27) <= '0'; + + -- This process counts the clocks for reducing the clock speed + -- of the i2c clock + clk_cnt_p : process(clk_i, reset_ni) + begin + if reset_ni = '0' then + clk_cnt <= 0; + elsif rising_edge(clk_i) then + if clk_cnt < fd_c then + clk_cnt <= clk_cnt + 1; + end if; + if clk_cnt_reset = '1' then + clk_cnt <= 0; + end if; + end if; + end process clk_cnt_p; + + clk_cnt_done <= '1' when clk_cnt = fd_c else '0'; + + -- This is the index for the i2c register. + i2c_idx_p : process(clk_i, reset_ni) + begin + if reset_ni = '0' then + idx <= 0; + elsif rising_edge(clk_i) then + if idx_inc = '1' and idx < 27 then + idx <= idx + 1; + end if; + if idx_reset = '1' then + idx <= 0; + end if; + end if; + end process i2c_idx_p; + + -- This are the registered outputs for the i2c clock and data + i2c_out_p : process(clk_i, reset_ni) + begin + if reset_ni = '0' then + i2c_clk <= '1'; + i2c_dat <= '1'; + elsif rising_edge(clk_i) then + i2c_dat <= i2c_dat_new; + i2c_clk <= i2c_clk_new; + end if; + end process i2c_out_p; + + -- The i2c register without ack data + i2c_data_p : process(clk_i, reset_ni) + begin + if reset_ni = '0' then + i2c_reg_without_ack <= (others => '0'); + elsif rising_edge(clk_i) then + if load_i2c_reg_without_ack = '1' then + i2c_reg_without_ack <= data_i; + end if; + end if; + end process i2c_data_p; + + -- i2c data selection process + i2c_dat_sel_p : process(i2c_dat_sel, i2c_reg_with_ack, i2c_dat, idx) + begin + case i2c_dat_sel is + when sel_old => i2c_dat_new <= i2c_dat; + when sel_reg => i2c_dat_new <= i2c_reg_with_ack(idx); + when sel_one => i2c_dat_new <= '1'; + when sel_zero => i2c_dat_new <= '0'; + when others => i2c_dat_new <= '0'; + end case; + end process i2c_dat_sel_p; + + -- i2c clock selection process + i2c_clk_sel_p : process(i2c_clk, i2c_clk_sel) + begin + case i2c_clk_sel is + when sel_old => i2c_clk_new <= i2c_clk; + when sel_one => i2c_clk_new <= '1'; + when sel_zero => i2c_clk_new <= '0'; + when others => i2c_clk_new <= '0'; + end case; + end process i2c_clk_sel_p; + + -- Sequential process for the statemachine + statem_seq_p : process(clk_i, reset_ni) + begin + if reset_ni = '0' then + state <= idle_s; + elsif rising_edge(clk_i) then + state <= next_state; + end if; + end process statem_seq_p; + + statem_comb_p: process(state, load_i, idx, clk_cnt_done) + begin + load_i2c_reg_without_ack<= '0'; + idx_inc <= '0'; + idx_reset <= '0'; + clk_cnt_reset <= '0'; + busy_o <= '1'; + i2c_dat_sel <= sel_old; + i2c_clk_sel <= sel_old; + next_state <= state; + case state is + when idle_s => + busy_o <= '0'; + i2c_clk_sel <= sel_one; + i2c_dat_sel <= sel_one; + if load_i = '1' then + load_i2c_reg_without_ack <= '1'; + clk_cnt_reset <= '1'; + idx_reset <= '1'; + next_state <= start_s; + i2c_dat_sel <= sel_zero; + end if; + when start_s => + if clk_cnt_done = '1' then + next_state <= data_hold_s; + clk_cnt_reset <= '1'; + i2c_clk_sel <= sel_zero; + end if; + when data_hold_s => + next_state <= data_s; + i2c_dat_sel <= sel_reg; + when data_s => + if clk_cnt_done = '1' then + next_state <= clock_high_s; + i2c_clk_sel <= sel_one; + clk_cnt_reset <= '1'; + end if; + when clock_high_s => + if clk_cnt_done = '1' then + if idx = 27 then -- last bit transmitted + i2c_dat_sel <= sel_one; + next_state <= stop_s; + else + idx_inc <= '1'; + i2c_clk_sel <= sel_zero; + next_state <= data_hold_s; + end if; + clk_cnt_reset <= '1'; + end if; + when stop_s => + if clk_cnt_done = '1' then + next_state <= idle_s; + end if; + when others => + next_state <= idle_s; + end case; + end process statem_comb_p; + + i2c_clk_o <= i2c_clk; + i2c_dat_o <= i2c_dat; + +end; -- architecture + + diff --git a/src/i2c_sub.vhd b/src/i2c_sub.vhd new file mode 100644 index 0000000..e71ff39 --- /dev/null +++ b/src/i2c_sub.vhd @@ -0,0 +1,79 @@ +--Copyright 2013 Friedrich Beckmann, Hochschule Augsburg +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity i2c_sub is + port ( + clk_i: in std_ulogic; + reset_ni: in std_ulogic; + i2c_dat_o: out std_ulogic; + i2c_dat_i: in std_ulogic; + i2c_clk_o: out std_ulogic); +end; + +architecture struct of i2c_sub is + +component i2c is + port ( + clk_i: in std_ulogic; + reset_ni: in std_ulogic; + load_i: in std_ulogic; + data_i: in std_ulogic_vector(23 downto 0); + i2c_clk_o: out std_ulogic; + i2c_dat_o: out std_ulogic; + i2c_dat_i: in std_ulogic; + busy_o: out std_ulogic + ); +end component; + +component i2c_write is + port ( + clk_i: in std_ulogic; + reset_ni: in std_ulogic; + load_o: out std_ulogic; + data_o: out std_ulogic_vector(23 downto 0); + busy_i: in std_ulogic); +end component; + + signal load, busy : std_ulogic; + signal data : std_ulogic_vector(23 downto 0); + +begin + + i2c_i0 : i2c + port map ( + clk_i => clk_i, + reset_ni => reset_ni, + load_i => load, + data_i => data, + i2c_clk_o => i2c_clk_o, + i2c_dat_o => i2c_dat_o, + i2c_dat_i => i2c_dat_i, + busy_o => busy); + + i2_write_i0 : i2c_write + port map ( + clk_i => clk_i, + reset_ni => reset_ni, + load_o => load, + data_o => data, + busy_i => busy); + +end; -- architecture + + diff --git a/src/i2c_write.vhd b/src/i2c_write.vhd new file mode 100644 index 0000000..338a3a7 --- /dev/null +++ b/src/i2c_write.vhd @@ -0,0 +1,98 @@ +--Copyright 2013 Friedrich Beckmann, Hochschule Augsburg +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity i2c_write is + port ( + clk_i: in std_ulogic; + reset_ni: in std_ulogic; + load_o: out std_ulogic; + data_o: out std_ulogic_vector(23 downto 0); + busy_i: in std_ulogic); +end; + +architecture rtl of i2c_write is + constant num_regs_c : integer := 12; + type state_t is (start_s, wait_s, done_s); + signal state, next_state : state_t; + signal counter : integer range 0 to num_regs_c-1; + signal counter_enable : std_ulogic; + type data_array_t is array(0 to num_regs_c-1) of std_ulogic_vector(23 downto 0); + + constant data_array : data_array_t := ( + X"341200", -- Set Inactive + X"341E00", -- Reset the Device + X"34001A", -- Left Line In / Mute off / Volume + X"34021A", -- Right Line In + X"34046F", -- Headphone Left + X"34066F", -- Headphone Right + X"340815", -- Analog path control (MIC to ADC, DAC to output, MIC Boost) + X"340A00", -- Digital path control + X"340C61", -- Power Down Control (Everything switched on) + X"340E13", -- Digital Audio Interface Format (Slave Mode, DSP Mode, 16 Bit) + X"341000", -- Sampling Control (48 kHz Sampling frequency, Normal Mode) + X"341201"); -- Active Control (Activate) + +begin + + seq_p : process(clk_i, reset_ni) + begin + if reset_ni = '0' then + state <= start_s; + counter <= 0; + elsif rising_edge(clk_i) then + state <= next_state; + if counter_enable = '1' then + if counter < num_regs_c - 1 then + counter <= counter + 1; + else + counter <= 0; + end if; + end if; + end if; + end process seq_p; + + data_o <= data_array(counter); + + process(state, counter, busy_i) + begin + load_o <= '0'; + counter_enable <= '0'; + next_state <= state; + case state is + when start_s => + load_o <= '1'; + next_state <= wait_s; + when wait_s => + if busy_i = '0' then + if counter = num_regs_c-1 then + next_state <= done_s; + --counter_enable <= '1'; + else + next_state <= start_s; + counter_enable <= '1'; + end if; + end if; + when others => + next_state <= state; + end case; + end process; + +end; -- architecture + + diff --git a/src/invgate_equation.vhd b/src/invgate_equation.vhd new file mode 100644 index 0000000..69e920e --- /dev/null +++ b/src/invgate_equation.vhd @@ -0,0 +1,34 @@ +-------------------------------------------------------------------------------
+-- Module : invgate
+-------------------------------------------------------------------------------
+-- Author : Johann Faerber
+-- Company : University of Applied Sciences Augsburg
+-------------------------------------------------------------------------------
+-- Description: Inverter Gate
+-- function modelled by logic equation
+-------------------------------------------------------------------------------
+-- Revisions : see end of file
+-------------------------------------------------------------------------------
+LIBRARY IEEE;
+USE IEEE.std_logic_1164.ALL;
+
+ENTITY invgate IS
+ PORT (a_i : IN std_ulogic; -- data input a
+ y_o : OUT std_ulogic -- data output y
+ );
+END invgate;
+
+ARCHITECTURE equation OF invgate IS
+
+BEGIN
+
+ y_o <= NOT a_i;
+
+END equation;
+
+-------------------------------------------------------------------------------
+-- Revisions:
+-- ----------
+-- $Id:$
+-------------------------------------------------------------------------------
+
diff --git a/src/mclk.vhd b/src/mclk.vhd new file mode 100644 index 0000000..5da923d --- /dev/null +++ b/src/mclk.vhd @@ -0,0 +1,48 @@ +--Copyright 2013 Friedrich Beckmann, Hochschule Augsburg +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +-- Master Clock Generator +-- Generate 12.5 MHz from 50 MHz by dividing by 4 +-- Audio Codec expects 12.288 MHz, so we are slightly higher + +entity mclk is + port ( + clk_i : in std_ulogic; + reset_ni : in std_ulogic; + mclk_o : out std_ulogic); +end; + +architecture rtl of mclk is + signal mclk : unsigned(1 downto 0); +begin + + mclk_p : process(clk_i, reset_ni) + begin + if reset_ni = '0' then + mclk <= to_unsigned(0, mclk'length); + elsif rising_edge(clk_i) then + mclk <= mclk + 1; + end if; + end process mclk_p; + + mclk_o <= mclk(1); + +end; -- architecture + + diff --git a/src/memory.vhd b/src/memory.vhd new file mode 100644 index 0000000..e50d687 --- /dev/null +++ b/src/memory.vhd @@ -0,0 +1,54 @@ +--Copyright 2013 Friedrich Beckmann, Hochschule Augsburg +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +-- This VHDL memory description will result in FPGA memory usage. +-- The EPC2C20 series provides a total of 52 M4K memory blocks +-- Each M4K memory block contains 4608 Bits. The following configurations are supported: +-- 4K 1, 2K 2, 1K 4, 512 8, 512 9, 256 16, 256 18 +-- The maximum is therefore 52 x 256 = 13312 samples. + +entity memory is + port ( + clk_i : in std_ulogic; + we_i : in std_ulogic; + waddr_i : in unsigned(12 downto 0); + raddr_i : in unsigned(12 downto 0); + wdata_i : in std_ulogic_vector(15 downto 0); + rdata_o : out std_ulogic_vector(15 downto 0) + ); +end; + +architecture rtl of memory is + type ram_t is array(0 to 2 ** 13 - 1) of std_ulogic_vector(15 downto 0); + signal ram : ram_t; +begin + + mem_p : process(clk_i) + begin + if rising_edge(clk_i) then + if we_i = '1' then + ram(to_integer(waddr_i)) <= wdata_i; + end if; + rdata_o <= ram(to_integer(raddr_i)); + end if; + end process mem_p; + +end; -- architecture + + diff --git a/src/mux2to1_equation.vhd b/src/mux2to1_equation.vhd new file mode 100644 index 0000000..0fddb6a --- /dev/null +++ b/src/mux2to1_equation.vhd @@ -0,0 +1,40 @@ +-------------------------------------------------------------------------------
+-- Module : mux2to1
+-------------------------------------------------------------------------------
+-- Author : Johann Faerber
+-- Company : University of Applied Sciences Augsburg
+-------------------------------------------------------------------------------
+-- Description: 2-to-1 multiplexer
+-- function modelled by boolean equation
+-- sel = '1': a -> y
+-- sel = '0': b -> y
+-------------------------------------------------------------------------------
+-- Revisions : see end of file
+-------------------------------------------------------------------------------
+LIBRARY IEEE;
+USE IEEE.std_logic_1164.ALL;
+
+ENTITY mux2to1 IS
+ PORT (a_i : IN std_ulogic; -- data input a
+ b_i : IN std_ulogic; -- data input b
+ sel_i : IN std_ulogic; -- select which input is connected to y
+ -- sel = '1': a -> y
+ -- sel = '0': b -> y
+ y_o : OUT std_ulogic -- data output y
+ );
+END mux2to1;
+
+ARCHITECTURE equation OF mux2to1 IS
+
+BEGIN
+
+ y_o <= (sel_i AND a_i) OR (NOT sel_i AND b_i);
+
+END equation;
+
+-------------------------------------------------------------------------------
+-- Revisions:
+-- ----------
+-- $Id:$
+-------------------------------------------------------------------------------
+
diff --git a/src/mux2to1_rtl.vhd b/src/mux2to1_rtl.vhd new file mode 100644 index 0000000..c6447dd --- /dev/null +++ b/src/mux2to1_rtl.vhd @@ -0,0 +1,42 @@ +-------------------------------------------------------------------------------
+-- Module : mux2to1
+-------------------------------------------------------------------------------
+-- Author : Johann Faerber
+-- Company : University of Applied Sciences Augsburg
+-------------------------------------------------------------------------------
+-- Description: 2-to-1 multiplexer
+-- function modelled by a conditional signal assignment
+-- sel = '1': a -> y
+-- sel = '0': b -> y
+-------------------------------------------------------------------------------
+-- Revisions : see end of file
+-------------------------------------------------------------------------------
+LIBRARY IEEE;
+USE IEEE.std_logic_1164.ALL;
+
+ENTITY mux2to1 IS
+ PORT (a_i : IN std_ulogic; -- data input a
+ b_i : IN std_ulogic; -- data input b
+ sel_i : IN std_ulogic; -- select which input is connected to y
+ -- sel = '1': a -> y
+ -- sel = '0': b -> y
+ y_o : OUT std_ulogic -- data output y
+ );
+END mux2to1;
+
+ARCHITECTURE rtl OF mux2to1 IS
+
+BEGIN
+
+ y_o <= a_i WHEN sel_i = '1' ELSE
+ b_i WHEN sel_i = '0' ELSE
+ 'X';
+
+END rtl;
+
+-------------------------------------------------------------------------------
+-- Revisions:
+-- ----------
+-- $Id:$
+-------------------------------------------------------------------------------
+
diff --git a/src/mux2to1_structure.vhd b/src/mux2to1_structure.vhd new file mode 100644 index 0000000..3ff0c97 --- /dev/null +++ b/src/mux2to1_structure.vhd @@ -0,0 +1,90 @@ +-------------------------------------------------------------------------------
+-- Module : mux2to1
+-------------------------------------------------------------------------------
+-- Author : Johann Faerber
+-- Company : University of Applied Sciences Augsburg
+-------------------------------------------------------------------------------
+-- Description: 2-to-1 multiplexer
+-- function modelled as structure of basic logic gates
+-------------------------------------------------------------------------------
+-- Revisions : see end of file
+-------------------------------------------------------------------------------
+LIBRARY IEEE;
+USE IEEE.std_logic_1164.ALL;
+
+ENTITY mux2to1 IS
+ PORT (a_i : IN std_ulogic; -- data input a
+ b_i : IN std_ulogic; -- data input b
+ sel_i : IN std_ulogic; -- select which input is connected to y
+ -- sel = '1': a -> y
+ -- sel = '0': b -> y
+ y_o : OUT std_ulogic -- data output y
+ );
+END mux2to1;
+
+ARCHITECTURE structure OF mux2to1 IS
+
+ COMPONENT invgate
+ PORT (
+ a_i : IN std_ulogic;
+ y_o : OUT std_ulogic);
+ END COMPONENT;
+
+ COMPONENT and2gate
+ PORT (
+ a_i : IN std_ulogic;
+ b_i : IN std_ulogic;
+ y_o : OUT std_ulogic);
+ END COMPONENT;
+
+ COMPONENT or2gate
+ PORT (
+ a_i : IN std_ulogic;
+ b_i : IN std_ulogic;
+ y_o : OUT std_ulogic);
+ END COMPONENT;
+
+ SIGNAL p0, p1 : std_ulogic;
+ SIGNAL p2 : std_ulogic;
+
+BEGIN
+
+ inv_gate_1 : invgate
+ PORT MAP (
+ a_i => sel_i,
+ y_o => p2);
+
+ and2_gate_1 : and2gate
+ PORT MAP (
+ a_i => a_i,
+ b_i => sel_i,
+ y_o => p0);
+
+ and2_gate_2 : and2gate
+ PORT MAP (
+ a_i => b_i,
+ b_i => p2,
+ y_o => p1);
+
+ or2_gate_1 : or2gate
+ PORT MAP (
+ a_i => p0,
+ b_i => p1,
+ y_o => y_o);
+
+-- inv_gate_1 : invgate PORT MAP (sel_i, p2);
+
+-- and2_gate_1 : and2gate PORT MAP (a_i, sel_i, p0);
+
+-- and2_gate_2 : and2gate PORT MAP (b_i, p2, p1);
+
+-- or2_gate_1 : or2gate PORT MAP (p0, p1, y_o);
+
+END structure;
+
+-------------------------------------------------------------------------------
+-- Revisions:
+-- ----------
+-- $Id:$
+-------------------------------------------------------------------------------
+
diff --git a/src/mux2to1_structure_errors.vhd b/src/mux2to1_structure_errors.vhd new file mode 100644 index 0000000..0b33968 --- /dev/null +++ b/src/mux2to1_structure_errors.vhd @@ -0,0 +1,79 @@ +-------------------------------------------------------------------------------
+-- Module : mux2to1
+-------------------------------------------------------------------------------
+-- Author : Johann Faerber
+-- Company : University of Applied Sciences Augsburg
+-------------------------------------------------------------------------------
+-- Description: 2-to-1 multiplexer
+-- function modelled as structure of basic logic gates
+-------------------------------------------------------------------------------
+-- Revisions : see end of file
+-------------------------------------------------------------------------------
+LIBRARY IEEE;
+USE IEEE.std_logic_1164.ALL;
+
+ENTITY mux2to1 IS
+ PORT (a_i : IN std_ulogic;
+ b_i : IN std_ulogic;
+ sel_i : IN std_ulogic;
+-- y_o : OUT std_ulogic; -- kein ; nach letztem Signal
+ y_o : OUT std_ulogic
+ );
+END mux21;
+
+
+ARCHITECTURE structure OF mux2to1 IS
+
+ COMPONENT invgate
+ PORT (
+ a_i : IN std_ulogic;
+ y_o : OUT std_ulogic);
+ END COMPONENT;
+
+ COMPONENT or2gate
+ PORT (
+ a_i : IN std_ulogic;
+ b_i : IN std_ulogic;
+ y_o : std_ulogic);
+ END COMPONENT;
+
+ SIGNAL p1 : std_ulogic;
+ SIGNAL p2 : std_ulogic;
+ SIGNAL p3 : std_ulogic;
+
+BEGIN
+
+ inv_gate_1 : invgate
+ PORT MAP (
+ a_i => sel_i,
+ y_o <= p2);
+
+
+ and2_gate_1 : and2gate
+ PORT MAP (
+ a_i => a_i,
+ b_i => p2
+ y_o => p0);
+
+ and2_gate_2 : and2gate
+ PORT MAP (
+ a_i => b_i,
+ b_i => sel_i,
+ y_o => p1);
+
+ or2_gate_1 : or2gate
+ PORT MAP (
+ a_i => p0,
+ b_i => p1,
+ y_o => p3);
+
+
+END struct
+
+
+-------------------------------------------------------------------------------
+-- Revisions:
+-- ----------
+-- $Id:$
+-------------------------------------------------------------------------------
+
diff --git a/src/mux2to1_truthtable.vhd b/src/mux2to1_truthtable.vhd new file mode 100644 index 0000000..ff84c61 --- /dev/null +++ b/src/mux2to1_truthtable.vhd @@ -0,0 +1,54 @@ +-------------------------------------------------------------------------------
+-- Module : mux2to1
+-------------------------------------------------------------------------------
+-- Author : Johann Faerber
+-- Company : University of Applied Sciences Augsburg
+-------------------------------------------------------------------------------
+-- Description: 2-to-1 multiplexer
+-- function modelled by a truth table
+-- sel = '1': a -> y
+-- sel = '0': b -> y
+-------------------------------------------------------------------------------
+-- Revisions : see end of file
+-------------------------------------------------------------------------------
+LIBRARY IEEE;
+USE IEEE.std_logic_1164.ALL;
+
+ENTITY mux2to1 IS
+ PORT (a_i : IN std_ulogic; -- data input a
+ b_i : IN std_ulogic; -- data input b
+ sel_i : IN std_ulogic; -- select which input is connected to y
+ -- sel = '1': a -> y
+ -- sel = '0': b -> y
+ y_o : OUT std_ulogic -- data output y
+ );
+END mux2to1;
+
+ARCHITECTURE truthtable OF mux2to1 IS
+
+ SIGNAL inputs_s : std_ulogic_vector(2 DOWNTO 0); -- temp input vector
+
+BEGIN
+
+ inputs_s <= (sel_i, b_i, a_i); -- concatenate single signals to a vector
+
+ tt : WITH inputs_s SELECT -- truthtable
+ y_o <=
+ '0' WHEN "000",
+ '0' WHEN "001",
+ '1' WHEN "010",
+ '1' WHEN "011",
+ '0' WHEN "100",
+ '1' WHEN "101",
+ '0' WHEN "110",
+ '1' WHEN "111",
+ 'X' WHEN OTHERS;
+
+END truthtable;
+
+-------------------------------------------------------------------------------
+-- Revisions:
+-- ----------
+-- $Id:$
+-------------------------------------------------------------------------------
+
diff --git a/src/or2gate_equation.vhd b/src/or2gate_equation.vhd new file mode 100644 index 0000000..13795fb --- /dev/null +++ b/src/or2gate_equation.vhd @@ -0,0 +1,18 @@ +-------------------------------------------------------------------------------
+-- Module : or2gate
+-------------------------------------------------------------------------------
+-- Author : Johann Faerber
+-- Company : University of Applied Sciences Augsburg
+-------------------------------------------------------------------------------
+-- Description: 2-input OR Gate
+-- function modelled by logic equation
+-------------------------------------------------------------------------------
+-- Revisions : see end of file
+-------------------------------------------------------------------------------
+
+
+-------------------------------------------------------------------------------
+-- Revisions:
+-- ----------
+-- $Id:$
+-------------------------------------------------------------------------------
diff --git a/src/play_rtl.vhd b/src/play_rtl.vhd new file mode 100644 index 0000000..8452236 --- /dev/null +++ b/src/play_rtl.vhd @@ -0,0 +1,101 @@ +------------------------------------------------------------------ +-- module : play +------------------------------------------------------------------ +-- author : Friedrich Beckmann +-- company : university of applied sciences augsburg +------------------------------------------------------------------ +-- description: Statemachine for LED game +-- +------------------------------------------------------------------ +-- revisions : 0.1 - +------------------------------------------------------------------ + +-- 5 LED outputs +-- One one-second enable input +-- KEY input with preceding rising_edge detector + +-- step LED4 LED3 LED2 LED1 LED0 +-- 1 x - - - - +-- 2 - x - - - +-- 3 - - x - - +-- 4 - - - x - +-- 5 - - - - x +-- 6 x - - - - +-- ... this pattern continues +-- If LED2 is on and KEY is pressed then the pattern continues as follows +-- 1 x - - - - +-- 2 - - - - x +-- ... this pattern continues until +-- KEY is pressed again. Then the previous pattern restarts from LED 2 + +library ieee; +use ieee.std_logic_1164.all; + +entity play is + port (clk : in std_ulogic; + rst_n : in std_ulogic; + onesec_i : in std_ulogic; + key_i : in std_ulogic; + led_o : out std_ulogic_vector(4 downto 0)); +end play; + +architecture rtl of play is + + type state_t is (start_s,one_s,chance_s,four_s,last_s,hit0_s,hit1_s); + signal current_state,next_state : state_t; + +begin + + current_state <= start_s when rst_n = '0' else next_state when rising_edge(clk); + + next_p : process(current_state, onesec_i, key_i) + begin + next_state <= current_state; + led_o <= "00000"; + case current_state is + when start_s => + led_o <= "10000"; + if onesec_i = '1' then + next_state <= one_s; + end if; + when one_s => + led_o <= "01000"; + if onesec_i = '1' then + next_state <= chance_s; + end if; + when chance_s => + led_o <= "00100"; + if key_i = '1' then + next_state <= hit0_s; + elsif onesec_i = '1' then + next_state <= four_s; + end if; + when four_s => + led_o <= "00010"; + if onesec_i = '1' then + next_state <= last_s; + end if; + when last_s => + led_o <= "00001"; + if onesec_i = '1' then + next_state <= start_s; + end if; + when hit0_s => + led_o <= "10000"; + if key_i = '1' then + next_state <= chance_s; + elsif onesec_i = '1' then + next_state <= hit1_s; + end if; + when hit1_s => + led_o <= "00001"; + if key_i = '1' then + next_state <= chance_s; + elsif onesec_i = '1' then + next_state <= hit0_s; + end if; + when others => null; + end case; + end process; + +end architecture rtl; diff --git a/src/ringbuf.vhd b/src/ringbuf.vhd new file mode 100644 index 0000000..7c45815 --- /dev/null +++ b/src/ringbuf.vhd @@ -0,0 +1,74 @@ +--Copyright 2013 Friedrich Beckmann, Hochschule Augsburg +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +-- Ring Buffer stores samples in a circular buffer +-- The read buffer pointer is one buffer entry ahead +-- of the write buffer pointer. + +entity ringbuf is + port ( + clk_i : in std_ulogic; + reset_ni : in std_ulogic; + en_i : in std_ulogic; + data_i : in std_ulogic_vector(15 downto 0); + data_o : out std_ulogic_vector(15 downto 0)); +end; + +architecture rtl of ringbuf is + +component memory is + port ( + clk_i : in std_ulogic; + we_i : in std_ulogic; + waddr_i : in unsigned(12 downto 0); + raddr_i : in unsigned(12 downto 0); + wdata_i : in std_ulogic_vector(15 downto 0); + rdata_o : out std_ulogic_vector(15 downto 0) + ); +end component; + + signal raddr, waddr : unsigned(12 downto 0); + +begin + + mem_i0 : memory + port map ( + clk_i => clk_i, + we_i => en_i, + raddr_i => raddr, + waddr_i => waddr, + rdata_o => data_o, + wdata_i => data_i); + + buffer_pointer_p : process(clk_i, reset_ni) + begin + if reset_ni = '0' then + waddr <= to_unsigned(0, 13); + raddr <= to_unsigned(1, 13); + elsif rising_edge(clk_i) then + if en_i = '1' then + raddr <= raddr + 1; + waddr <= waddr + 1; + end if; + end if; + end process buffer_pointer_p; + +end; -- architecture + + diff --git a/src/t_cntdn.vhd b/src/t_cntdn.vhd new file mode 100644 index 0000000..42888c6 --- /dev/null +++ b/src/t_cntdn.vhd @@ -0,0 +1,123 @@ +------------------------------------------------------------------------------- +-- Module : t_cntdn +------------------------------------------------------------------------------- +-- Author : <haf@fh-augsburg.de> +-- Company : University of Applied Sciences Augsburg +-- Copyright (c) 2011 <haf@fh-augsburg.de> +------------------------------------------------------------------------------- +-- Description: Testbench for design "cntdn" +------------------------------------------------------------------------------- +-- Revisions : see end of file +------------------------------------------------------------------------------- + +LIBRARY ieee; +USE ieee.std_logic_1164.ALL; + +ENTITY t_cntdn IS +END t_cntdn; + +ARCHITECTURE tbench OF t_cntdn IS + + COMPONENT cntdn + PORT ( + clk_i : IN std_ulogic; + rst_ni : IN std_ulogic; + en_pi : IN std_ulogic; + count_o : OUT std_ulogic_vector(3 DOWNTO 0); + tc_o : OUT std_ulogic); + END COMPONENT; + + -- definition of a clock period + CONSTANT period : time := 10 ns; + -- switch for clock generator + SIGNAL clken_p : boolean := true; + + -- component ports + SIGNAL clk_i : std_ulogic; + SIGNAL rst_ni : std_ulogic; + SIGNAL en_pi : std_ulogic; + SIGNAL count_o : std_ulogic_vector(3 DOWNTO 0); + SIGNAL tc_o : std_ulogic; + +BEGIN -- tbench + + -- component instantiation + DUT : cntdn + PORT MAP ( + clk_i => clk_i, + rst_ni => rst_ni, + en_pi => en_pi, + count_o => count_o, + tc_o => tc_o); + + -- clock generation + clock_proc : PROCESS + BEGIN + WHILE clken_p LOOP + clk_i <= '0'; WAIT FOR period/2; + clk_i <= '1'; WAIT FOR period/2; + END LOOP; + WAIT; + END PROCESS; + + -- initial reset, always necessary at the beginning of a simulation + -- initial reset, always necessary at the beginning of a simulation + ----------------------------------------------------------------------------- + -- Following a verification plan: + -- ------------------------------ + -- 1. t = 0 ns: activate asynchronous reset + -- 2. t = 10 ns: deactivate asynchronous reset + ----------------------------------------------------------------------------- + reset : rst_ni <= '0', '1' AFTER period; + + stimuli_p : PROCESS + + BEGIN + + --------------------------------------------------------------------------- + -- ... continuing with the verification plan: + --------------------------------------------------------------------------- + WAIT UNTIL rising_edge(rst_ni); -- wait for reset + -- ... is deactivated + --------------------------------------------------------------------------- + + --------------------------------------------------------------------------- + -- 2. activate enable + -- 3. Wait for a full counting cycle + --------------------------------------------------------------------------- + + --------------------------------------------------------------------------- + + + --------------------------------------------------------------------------- + -- 4. After another five periods: Deactivate Enable + --------------------------------------------------------------------------- + + --------------------------------------------------------------------------- + + --------------------------------------------------------------------------- + -- 5. After another three periods: Activate Enable + -- 6. Simulate another complete counting cycle + --------------------------------------------------------------------------- + + --------------------------------------------------------------------------- + + --------------------------------------------------------------------------- + -- 7. Simulate until tc_o = 1 again + --------------------------------------------------------------------------- + + --------------------------------------------------------------------------- + + + clken_p <= false; -- switch clock generator off + + WAIT; -- suspend proces + END PROCESS; + +END tbench; + +------------------------------------------------------------------------------- +-- Revisions: +-- ---------- +-- $Id:$ +------------------------------------------------------------------------------- diff --git a/src/t_cntdnmodm.vhd b/src/t_cntdnmodm.vhd new file mode 100644 index 0000000..5b3b9e3 --- /dev/null +++ b/src/t_cntdnmodm.vhd @@ -0,0 +1,157 @@ +------------------------------------------------------------------------------- +-- Module : t_cntdnmodm +------------------------------------------------------------------------------- +-- Author : <johann.faerber@hs-augsburg.de> +-- Company : University of Applied Sciences Augsburg +-- Copyright (c) 2013 <johann.faerber@hs-augsburg.de> +------------------------------------------------------------------------------- +-- Description: Testbench for design "cntdnmodm" +------------------------------------------------------------------------------- +-- Revisions : see end of file +------------------------------------------------------------------------------- + +LIBRARY ieee; +USE ieee.std_logic_1164.ALL; + +ENTITY t_cntdnmodm IS +END t_cntdnmodm; + +ARCHITECTURE tbench OF t_cntdnmodm IS + + COMPONENT cntdnmodm + GENERIC ( + n : natural; + m : natural); + PORT ( + clk_i : IN std_ulogic; + rst_ni : IN std_ulogic; + en_pi : IN std_ulogic; + count_o : OUT std_ulogic_vector(n-1 DOWNTO 0); + tc_o : OUT std_ulogic); + END COMPONENT; + + -- component generics + CONSTANT n : natural := 4; + CONSTANT m : natural := 10; + + -- component ports + SIGNAL clk_i : std_ulogic; + SIGNAL rst_ni : std_ulogic; + SIGNAL en_pi : std_ulogic; + SIGNAL count_o : std_ulogic_vector(n-1 DOWNTO 0); + SIGNAL tc_o : std_ulogic; + + SIGNAL count_mod6_o : std_ulogic_vector(2 DOWNTO 0); + SIGNAL tc_mod6_o : std_ulogic; + + SIGNAL count_mod500e3_o : std_ulogic_vector(18 DOWNTO 0); + SIGNAL tc_100hz_o : std_ulogic; + + + -- definition of a clock period + CONSTANT period : time := 20 ns; + -- switch for clock generator + SIGNAL clken_p : boolean := true; + +BEGIN -- tbench + + -- component instantiation + MUV : cntdnmodm + GENERIC MAP ( + n => n, + m => m) + PORT MAP ( + clk_i => clk_i, + rst_ni => rst_ni, + en_pi => en_pi, + count_o => count_o, + tc_o => tc_o); + + mod6_count : cntdnmodm + GENERIC MAP ( + n => 3, + m => 6) + PORT MAP ( + clk_i => clk_i, + rst_ni => rst_ni, + en_pi => en_pi, + count_o => count_mod6_o, + tc_o => tc_mod6_o); + + -- instantiate and parameterise the generics to + -- create a frequency of 100 Hz at its output signal tc_100hz_o + -- declare the necessary signals count_modxxx_o and tc_100hz_o + ----------------------------------------------------------------------------- +-- prescaler : cntdnmodm +-- GENERIC MAP ( +-- n => +-- m => ) +-- PORT MAP ( + ----------------------------------------------------------------------------- + + + -- clock generation + clock_p : PROCESS + BEGIN + WHILE clken_p LOOP + clk_i <= '0'; WAIT FOR period/2; + clk_i <= '1'; WAIT FOR period/2; + END LOOP; + WAIT; + END PROCESS; + + -- initial reset + reset : rst_ni <= '1', '0' AFTER period, + '1' AFTER 2 * period; + + -- process for stimuli generation + stimuli_p : PROCESS + + BEGIN + + WAIT UNTIL rising_edge(rst_ni); -- wait for reset + + en_pi <= '1'; -- activate counter + + + -- wait for a period of tc_o ---------------------------------------------- + WAIT UNTIL rising_edge(tc_o); + WAIT UNTIL falling_edge(tc_o); + + WAIT UNTIL count_o = X"5"; + + en_pi <= '0'; -- stop counter ... + WAIT FOR 3* period; -- ... for 3 periods + + en_pi <= '1'; -- activate counter + + -- wait for a period of tc_mod6_o ----------------------------------------- + WAIT UNTIL rising_edge(tc_mod6_o); + WAIT UNTIL falling_edge(tc_mod6_o); + --------------------------------------------------------------------------- + + + -- wait for a period of tc_100hz_o ---------------------------------------- + + --------------------------------------------------------------------------- + + + -- wait for a period of tc_100hz_o ---------------------------------------- + + --------------------------------------------------------------------------- + + + clken_p <= false; -- switch clock generator off + + WAIT; + END PROCESS; + + + +END tbench; + +------------------------------------------------------------------------------- +-- Revisions: +-- ---------- +-- $Id:$ +------------------------------------------------------------------------------- diff --git a/src/t_de1_audio.vhd b/src/t_de1_audio.vhd new file mode 100644 index 0000000..bfa0f1f --- /dev/null +++ b/src/t_de1_audio.vhd @@ -0,0 +1,88 @@ +--Copyright 2013 Friedrich Beckmann, Hochschule Augsburg +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity t_de1_audio is +end; + +architecture tbench of t_de1_audio is + +component de1_audio is + port ( + CLOCK_50: in std_ulogic; + KEY0: in std_ulogic; + I2C_SCLK: out std_ulogic; + I2C_SDAT: inout std_ulogic; + AUD_ADCLRCK: out std_ulogic; + AUD_ADCDAT: in std_ulogic; + AUD_DACLRCK: out std_ulogic; + AUD_DACDAT: out std_ulogic; + AUD_XCK: out std_ulogic; + AUD_BCLK: out std_ulogic; + LEDR: out std_ulogic_vector(9 downto 0) + ); +end component; + + signal clk, reset_n : std_ulogic; + signal ledr : std_ulogic_vector(9 downto 0); + signal i2c_clk, i2c_dat : std_ulogic; + signal key0 : std_ulogic; + + signal aud_adclrck, aud_adcdat, aud_daclrck, aud_dacdat, aud_xck, aud_bclk : std_ulogic; + + signal simrun : boolean := true; + +begin + + de1_audio_i0 : de1_audio + port map ( + CLOCK_50 => clk, + KEY0 => reset_n, + I2C_SCLK => i2c_clk, + I2C_SDAT => i2c_dat, + AUD_ADCLRCK => aud_adclrck, + AUD_ADCDAT => aud_adcdat, + AUD_DACLRCK => aud_daclrck, + AUD_DACDAT => aud_dacdat, + AUD_XCK => aud_xck, + AUD_BCLK => aud_bclk, + LEDR => ledr); + + clock_p : process + begin + clk <= '0'; + wait for 10 ns; + clk <= '1'; + wait for 10 ns; + if not simrun then + wait; + end if; + end process clock_p; + + simrun <= false after 1 ms; + + reset_p : process + begin + reset_n <= '0'; + wait for 15 us; + reset_n <= '1'; + wait; + end process reset_p; + + aud_adcdat <= '1'; + +end; -- architecture diff --git a/src/t_de1_play.vhd b/src/t_de1_play.vhd new file mode 100644 index 0000000..8a2b739 --- /dev/null +++ b/src/t_de1_play.vhd @@ -0,0 +1,100 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +use ieee.math_real.all; + +entity t_de1_play is +end t_de1_play; + +architecture tbench of t_de1_play is + +component de1_play is + port ( + CLOCK_50 : in std_ulogic; -- 50 mhz clock + KEY : in std_ulogic_vector(1 downto 0); -- key(1..0) + I2C_SCLK : out std_ulogic; + I2C_SDAT : inout std_logic; + AUD_ADCLRCK : out std_ulogic; + AUD_ADCDAT : in std_ulogic; + AUD_DACLRCK : out std_ulogic; + AUD_DACDAT : out std_ulogic; + AUD_XCK : out std_ulogic; + AUD_BCLK : out std_ulogic; + LEDR : out std_ulogic_vector(4 downto 0); -- red LED(4..0) + LEDG : out std_ulogic_vector(1 downto 0) -- green LED(1..0) + ); +end component; + + -- definition of a clock period + constant period : time := 10 ns; + -- switch for clock generator + signal clken_p : boolean := true; + + + signal clk_i : std_ulogic; + signal rst_ni : std_ulogic; + signal key : std_ulogic; + signal ledr : std_ulogic_vector(4 downto 0); + + signal i2c_clk, i2c_dat : std_ulogic; + signal aud_adclrck, aud_adcdat, aud_daclrck, aud_dacdat, aud_xck, aud_bclk : std_ulogic; + signal phase : real := 0.0; + signal test_tone : real; + signal test_tone_quantized : signed(15 downto 0); + signal bit_count : integer range 0 to 31; + +begin + + -- clock generation + clock_proc : process + begin + while clken_p loop + clk_i <= '0'; wait for period/2; + clk_i <= '1'; wait for period/2; + end loop; + wait; + end process; + + -- initial reset, always necessary at the beginning of a simulation + reset : rst_ni <= '0', '1' AFTER period; + + stimuli_p : process + begin + key <= '1'; + wait until rst_ni = '1'; + wait for 20*period; + key <= '0'; + wait for 10*period; + key <= '1'; + wait for 30*period; + clken_p <= false; + wait; + end process stimuli_p; + + + de1_play_i0 : de1_play + port map ( + CLOCK_50 => clk_i, + KEY(0) => rst_ni, + KEY(1) => key, + I2C_SCLK => i2c_clk, + I2C_SDAT => i2c_dat, + AUD_ADCLRCK => aud_adclrck, + AUD_ADCDAT => aud_adcdat, + AUD_DACLRCK => aud_daclrck, + AUD_DACDAT => aud_dacdat, + AUD_XCK => aud_xck, + AUD_BCLK => aud_bclk, + LEDR => ledr); + + aud_adcdat <= test_tone_quantized(bit_count mod 16); + + -- Test tone generator for simulating the ADC from the audio codec + phase <= phase + 1.0/48.0 when rising_edge(aud_daclrck); + test_tone <= sin(2*3.14*phase); + test_tone_quantized <= to_signed(integer(test_tone * real(2**15-1)), 16); + bit_count <= 31 when falling_edge(aud_daclrck) else + 0 when bit_count = 0 else + bit_count - 1 when falling_edge(aud_bclk); + +end tbench; diff --git a/src/t_de1_tone.vhd b/src/t_de1_tone.vhd new file mode 100644 index 0000000..37d9e6b --- /dev/null +++ b/src/t_de1_tone.vhd @@ -0,0 +1,108 @@ +--Copyright 2013 Friedrich Beckmann, Hochschule Augsburg +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +use ieee.math_real.all; + +entity t_de1_tone is +end; + +architecture tbench of t_de1_tone is + + component de1_tone is + port ( + CLOCK_50 : in std_ulogic; + KEY0 : in std_ulogic; + I2C_SCLK : out std_ulogic; + I2C_SDAT : inout std_ulogic; + AUD_ADCLRCK : out std_ulogic; + AUD_ADCDAT : in std_ulogic; + AUD_DACLRCK : out std_ulogic; + AUD_DACDAT : out std_ulogic; + AUD_XCK : out std_ulogic; + AUD_BCLK : out std_ulogic; + SW : in std_ulogic_vector(9 downto 0); + LEDR : out std_ulogic_vector(9 downto 0) + ); + end component; + + signal clk, reset_n : std_ulogic; + signal ledr : std_ulogic_vector(9 downto 0); + signal i2c_clk, i2c_dat : std_ulogic; + signal key0 : std_ulogic; + + signal aud_adclrck, aud_adcdat, aud_daclrck, aud_dacdat, aud_xck, aud_bclk : std_ulogic; + + signal simrun : boolean := true; + + signal phase : real := 0.0; + signal test_tone : real; + signal test_tone_quantized : signed(15 downto 0); + signal bit_count : integer range 0 to 31; + signal switches : std_ulogic_vector(9 downto 0); + +begin + + de1_tone_i0 : de1_tone + port map ( + CLOCK_50 => clk, + KEY0 => reset_n, + I2C_SCLK => i2c_clk, + I2C_SDAT => i2c_dat, + AUD_ADCLRCK => aud_adclrck, + AUD_ADCDAT => aud_adcdat, + AUD_DACLRCK => aud_daclrck, + AUD_DACDAT => aud_dacdat, + AUD_XCK => aud_xck, + AUD_BCLK => aud_bclk, + SW => switches, + LEDR => ledr); + + clock_p : process + begin + clk <= '0'; + wait for 10 ns; + clk <= '1'; + wait for 10 ns; + if not simrun then + wait; + end if; + end process clock_p; + + simrun <= false after 5 ms; + + reset_p : process + begin + reset_n <= '0'; + wait for 15 us; + reset_n <= '1'; + wait; + end process reset_p; + + aud_adcdat <= test_tone_quantized(bit_count mod 16); + + -- Test tone generator for simulating the ADC from the audio codec + phase <= phase + 1.0/48.0 when rising_edge(aud_daclrck); + test_tone <= sin(2*3.14*phase); + test_tone_quantized <= to_signed(integer(test_tone * real(2**15-1)), 16); + bit_count <= 31 when falling_edge(aud_daclrck) else + 0 when bit_count = 0 else + bit_count - 1 when falling_edge(aud_bclk); + + + +end; -- architecture diff --git a/src/t_falling_edge_detector.vhd b/src/t_falling_edge_detector.vhd new file mode 100644 index 0000000..9fda089 --- /dev/null +++ b/src/t_falling_edge_detector.vhd @@ -0,0 +1,116 @@ +------------------------------------------------------------------------------- +-- Module : t_falling_edge_detector +------------------------------------------------------------------------------- +-- Author : <haf@fh-augsburg.de> +-- Company : University of Applied Sciences Augsburg +-- Copyright (c) 2011 <haf@fh-augsburg.de> +------------------------------------------------------------------------------- +-- Description: Testbench for design "falling_edge_detector" +------------------------------------------------------------------------------- +-- Revisions : see end of file +------------------------------------------------------------------------------- + +LIBRARY ieee; +USE ieee.std_logic_1164.ALL; + +------------------------------------------------------------------------------- + +ENTITY t_falling_edge_detector IS +END t_falling_edge_detector; + +------------------------------------------------------------------------------- + +ARCHITECTURE tbench OF t_falling_edge_detector IS + + COMPONENT falling_edge_detector + PORT ( + clk_i : IN std_ulogic; + rst_ni : IN std_ulogic; + x_i : IN std_ulogic; + fall_o : OUT std_ulogic); + END COMPONENT; + + -- definition of a clock period + CONSTANT period : time := 10 ns; + -- switch for clock generator + SIGNAL clken_p : boolean := true; + + -- component ports + SIGNAL clk_i : std_ulogic; + SIGNAL rst_ni : std_ulogic; + SIGNAL x_i : std_ulogic; + SIGNAL fall_o : std_ulogic; + +BEGIN -- tbench + + -- component instantiation + MUV : falling_edge_detector + PORT MAP ( + clk_i => clk_i, + rst_ni => rst_ni, + x_i => x_i, + fall_o => fall_o); + + -- clock generation + clock_p : PROCESS + BEGIN + WHILE clken_p LOOP + clk_i <= '0'; WAIT FOR period/2; + clk_i <= '1'; WAIT FOR period/2; + END LOOP; + WAIT; + END PROCESS; + + -- initial reset, always necessary at the beginning of a simulation + reset : rst_ni <= '0', '1' AFTER period; + + + stimuli_p : PROCESS + BEGIN + + WAIT UNTIL rst_ni = '1'; -- wait until asynchronous reset ... + -- ... is deactivated + --------------------------------------------------------------------------- + + -- create a low-active pulse over a no. of clock periods + --------------------------------------------------------------------------- + x_i <= '1'; -- assign a '1' to x_i + WAIT FOR period; + + x_i <= '0'; -- set input to '0' ... + WAIT UNTIL rising_edge(clk_i); + WAIT UNTIL falling_edge(clk_i); + -- Observer: check, if fall_o is assigned to '1' for one clock period + ASSERT fall_o = '1' REPORT "Error: Expected fall_o = '1' !" SEVERITY failure; + WAIT UNTIL falling_edge(clk_i); + ASSERT fall_o = '0' REPORT "Error: Expected fall_o = '0' !" SEVERITY failure; + WAIT FOR 6 * period; -- ... for a no. of periods + + x_i <= '1'; -- assign a '1' to form a + WAIT FOR 3 * period; -- low active input pulse + --------------------------------------------------------------------------- + + + -- add another low-active input pulse here ... + + + + + + + + + + clken_p <= false; -- switch clock generator off + + WAIT; -- suspend proces + END PROCESS; + + +END tbench; + +------------------------------------------------------------------------------- +-- Revisions: +-- ---------- +-- $Id:$ +------------------------------------------------------------------------------- diff --git a/src/t_mux2to1.vhd b/src/t_mux2to1.vhd new file mode 100644 index 0000000..4d4d118 --- /dev/null +++ b/src/t_mux2to1.vhd @@ -0,0 +1,81 @@ +------------------------------------------------------------------------------- +-- Module : t_mux2to1 +------------------------------------------------------------------------------- +-- Author : <haf@fh-augsburg.de> +-- Company : University of Applied Sciences Augsburg +-- Copyright (c) 2011 <haf@fh-augsburg.de> +------------------------------------------------------------------------------- +-- Description: Testbench for design "mux2to1" +------------------------------------------------------------------------------- +-- Revisions : see end of file +------------------------------------------------------------------------------- + +LIBRARY ieee; +USE ieee.std_logic_1164.ALL; + +------------------------------------------------------------------------------- + +ENTITY t_mux2to1 IS +END t_mux2to1; + +------------------------------------------------------------------------------- + +ARCHITECTURE tbench OF t_mux2to1 IS + + COMPONENT mux2to1 + PORT ( + a_i : IN std_ulogic; + b_i : IN std_ulogic; + sel_i : IN std_ulogic; + y_o : OUT std_ulogic); + END COMPONENT; + + -- definition of a clock period + CONSTANT period : time := 10 ns; + + -- component ports + SIGNAL a_i : std_ulogic; + SIGNAL b_i : std_ulogic; + SIGNAL sel_i : std_ulogic; + SIGNAL y_o : std_ulogic; + +BEGIN -- tbench + + -- component instantiation + MUV : mux2to1 + PORT MAP ( + a_i => a_i, + b_i => b_i, + sel_i => sel_i, + y_o => y_o); + + stimuli_p : PROCESS + + BEGIN + a_i <= '0'; -- set a value to input a_i + b_i <= '0'; -- set a value to input b_i + sel_i <= '0'; -- set a value to input ci_i + WAIT FOR period; -- values are assigned here + + a_i <= '1'; -- change value of a_i + WAIT FOR period; + + a_i <= '0'; -- change value of a_i + b_i <= '1'; -- change value of b_i + WAIT FOR period; + + + -- add the missing stimuli here ... + + + + WAIT; + END PROCESS; + +END tbench; + +------------------------------------------------------------------------------- +-- Revisions: +-- ---------- +-- $Id:$ +------------------------------------------------------------------------------- diff --git a/src/tone_rtl.vhd b/src/tone_rtl.vhd new file mode 100644 index 0000000..815ebb8 --- /dev/null +++ b/src/tone_rtl.vhd @@ -0,0 +1,19 @@ +library ieee; +use ieee.std_logic_1164.all; + +entity tone is + port (clk : in std_ulogic; + rst_n : in std_ulogic; + switches_i : in std_ulogic_vector(9 downto 0); + dv_i : in std_ulogic; + audio_i : in std_ulogic_vector(15 downto 0); + audio_o : out std_ulogic_vector(15 downto 0)); +end entity; + +architecture rtl of tone is + +begin + +audio_o <= audio_i when rising_edge(clk) and dv_i = '1'; + +end architecture rtl; |