changeset 1562:948bafd61d96 draft

merge
author Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
date Tue, 12 Mar 2013 17:06:42 +0900
parents e8c9a7099bcc (current diff) 3df1868130cb (diff)
children 4fd1e2ce7d30 4e1899c693f0
files include/TaskManager/CellTaskManagerImpl.h include/TaskManager/CpuThreads.h include/TaskManager/FifoTaskManagerImpl.h include/TaskManager/GpuScheduler.h include/TaskManager/GpuThreads.h include/TaskManager/SchedTask.h include/TaskManager/SpeTaskManagerImpl.h include/TaskManager/TaskManager.h include/TaskManager/TaskManagerImpl.h include/TaskManager/Threads.h
diffstat 89 files changed, 3734 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/Prime/ppe/Prime.cc.orig	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,37 @@
+#include <stdio.h>
+#include <math.h>
+#include "SchedTask.h"
+#include "Prime.h"
+#include "Func.h"
+
+SchedDefineTask1(Prime, prime);
+
+static int
+prime(SchedTask *smanager, void *rbuf, void *wbuf)
+{
+    long start = (long)smanager->get_param(0);	/* 素数判定の開始地点 */
+	long end   = (long)smanager->get_param(1);	/* 素数判定の終了地点 */
+	long range = end - start;					/* 判定する範囲		  */
+
+	/* 判定結果を収める配列を受け取る */
+	bool *output = (bool*)smanager->get_output(wbuf, 0);
+
+	/* 初期化 */
+	for (int i = 0; i < range; i++){
+		output[i] = true;
+	}
+
+
+
+	for (long i = start, index = 0; i < end; i++, index++) {
+		long limit = (long)sqrt((double) i);		/* 割る数の最大値を求める */
+		for (long j = 2; j <= limit; j++) {
+			/* 割り切れた場合、0を代入し素数じゃないという判定を下す */
+			if (i % j == 0) {
+				output[index] = false;
+				break;
+			}
+		}
+	}
+	return 0;
+}
--- a/example/fft/Makefile.macosx	Tue Mar 12 16:52:49 2013 +0900
+++ b/example/fft/Makefile.macosx	Tue Mar 12 17:06:42 2013 +0900
@@ -2,13 +2,13 @@
 
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE = sort-compat.cc sort_test.cc # 除外するファイルを書く
+SRCS_EXCLUDE = # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
 TASK_DIR  = ppe
 TASK_SRCS_TMP = $(wildcard $(TASK_DIR)/*.cc)
-TASK_SRCS_EXCLUDE = sort_test.cc
+TASK_SRCS_EXCLUDE =
 TASK_SRCS = $(filter-out $(TASK_DIR)/$(TASK_SRCS_EXCLUDE),$(TASK_SRCS_TMP))
 TASK_OBJS = $(TASK_SRCS:.cc=.o)
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/fft/Makefile.macosx.orig	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,43 @@
+include ./Makefile.def
+
+
+SRCS_TMP = $(wildcard *.cc)
+SRCS_EXCLUDE = # 除外するファイルを書く
+SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
+OBJS = $(SRCS:.cc=.o)
+
+TASK_DIR  = ppe
+TASK_SRCS_TMP = $(wildcard $(TASK_DIR)/*.cc)
+TASK_SRCS_EXCLUDE =
+TASK_SRCS = $(filter-out $(TASK_DIR)/$(TASK_SRCS_EXCLUDE),$(TASK_SRCS_TMP))
+TASK_OBJS = $(TASK_SRCS:.cc=.o)
+
+CC      = clang++
+CC += $(ABI)
+# CFLAGS  = -g -Wall# -O9 #-DDEBUG
+
+INCLUDE = -I${CERIUM}/include/TaskManager -I. -I..
+LIBS = -L${CERIUM}/TaskManager -lFifoManager `sdl-config --libs`
+
+.SUFFIXES: .cc .o
+
+.cc.o:
+	$(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@
+
+all: $(TARGET)
+
+$(TARGET): $(OBJS) $(TASK_OBJS)
+	$(CC) -o $@ $(OBJS) $(TASK_OBJS) $(LIBS)
+
+link:
+	$(CC) -o $(TARGET) $(OBJS) $(TASK_OBJS) $(LIBS)
+
+debug: $(TARGET)
+	sudo gdb ./$(TARGET)
+
+clean:
+	rm -f $(TARGET) $(OBJS) $(TASK_OBJS)
+	rm -f *~ \#*
+	rm -f ppe/*~ ppe/\#*
+	rm -f spe/*~ spe/\#*
+	rm -f gpu/*~ gpu/\#*
--- a/example/fft/main.cc	Tue Mar 12 16:52:49 2013 +0900
+++ b/example/fft/main.cc	Tue Mar 12 17:06:42 2013 +0900
@@ -6,6 +6,7 @@
 #include <sys/time.h>
 #include "TaskManager.h"
 #include "GpuScheduler.h"
+#include "SchedTask.h"
 #include "Func.h"
 #ifdef __APPLE__
 #include <OpenCL/opencl.h>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/fft/output.pgm	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,4 @@
+P5
+512 512
+255
+{zndf`_\ckbkhlmmmlrrpomlqqrpoopsqpqqrrplnnpqtxrvz~{u~}~~|~~}~{~}{ywtvwmklltxz~dz~nmiklsluxy|z{z}}{y|}z~}{z|{~}}~zz{}}{v}x{yw|{zndf`_[djckilmmmlrrpomlqqrpooqsqorqrsomnnpqrzruz}{t~}~~}~}}z}{ywtuwmkkltxz~dz~nmikmrnuxyzz{{|}{y||z}~{{}~z~}}~z{z~}{v}x{yw|{zmfda_[ckclhknmmlrrppllqqropoqrroqqsqpkonorsyqvz}{t~~~~}}~{}|{zwtuwlklltxz~dz~nmijlslvxy{zz{}}|x{}z~~||z||~}|}yzz}}{w}x{zv{{zncf`_\djdkhlmmmkrrpnmkqprpooptqpqrqrolonqqtyrwz~zs|~}~~}}{~~{yxtvwmkkltwz~Ƴ~nljklsntxx|z{z}|{y{}z}{z|||~~~zzz~}{u~w{zw|{zndfb^Zdlckiklnlmrrpnmlrqrpooosqnqqrrqlnnprryrvz|{t~~~}~}~|~}{zwttwmkklsyy}Ǵnmiklsmuxzz{{y~}{x}}y}|{z|{~~|~zzz}}{w|x|zw|}{sqkb_b]bcchifhommnmopnhmmppinlnonjplskmoslqsru|xz{|~||}~}~}~{xwyyrslnliso}~rjdkjnuss|yzyz|~}~x~~~}z{x}y~|~~|{z|}{wv~~~kPnpcf]`^g_hdccjlqsmjgojnkmjgllpoqiolnoljjwlooru}{v|y|{~|~~~|xxtsrrkkljjwz}̹pnfkkpmuywx|zw}}z}~~{|{}}}z~}~}{~~}~{{{s_RB;}wr`a]WXY[`_hdgmrnqnlkifmopjlkgnkmokkommmomqstsuwy{~~}{~|yz~{x{vuxsomqgivw¯~jdjlspvuzwz|vx{y{|}x{z}~~{~~|z}}~z}|vbVHE39/|svd`]Z[^`bajfmllkjmrollippkknnplqljrwknokvrvruqu|y{|}{}~~}~}{~xvvvqsutnjkonwy}̻sljqpntsxuxz{z|~x}z|{{z{y|}z~~|pcJB15/03}}uocb^_]^\^d`iifgikpimkfmntmlponljkgnlhhrlqrpnvuyxvyw|z|}{x{||xwussvksnkipsyzƳrmllprusxyzzz}~x}|||{{|~}y}~~~~~~x~}{mdU>6/30/-uld]\]]_bflcfhjgmlliklllfkjpsmijlhkliinrqrtprqux|w|}~~|{~uyzztwyuornromgqv|ξsnhhnmpqsvszy~z{zy~}y~~z|||{y{|{{~|}z}~}~wo_P?3360/45xpoc_]]YZYbg`fjbiljjjmmlmqoolkmilokkslgillouruvsvxyxz|~~z|~}yvvyoqrrmompmnvzƶolnllnttwsvy}~{}~y~~|~|y}|~{|{y{{||{|~~~{mZI;8,/+1/.1ypjhbW][Zfa\adgilomkknnlrppploijdlljjlkjgmqvvqwuwvz{|y|~~~~}~}|}|~}wxsvuvrtounkkls}|пxmlnknprtt{vx{~{~z|}~~|}|xwy~z}~}}~{{}}~}|}sbM>35+/-1014wrmk^Z^c__\afhikfommmsroorpupkmjkoljhklmjnruttuwv{~}yx}}{{}~|~yw}toqquvutokhknz~ͺojomrxxpwxtxv}y{|y|~|}||}|~z|~z}xqbI<=D1+).-335uog^a\[ccabggljfmlkpopkprnmwokigknqjjdjgmotmtvvvv{y{z|~}~}{}~}~{zzxoxssxmqpoklquz{ƶ~knppnnqtttzzuwyv}z}y~~|~~z|{w|zx|~}}~~uk\D9/5H63418635}yqui_`[___^^flkmhlkooslponmhonkllmkpojhimnpsrrssvyuxz{|}~}~|xzyqwyostkmmmmsu|«tmmqmrqpotyzvxy~yx|{|}{|~~}|}~}~}shXB75+,400.-7.91~qlg`]V]Z`^_bjlkibdmusnqksqgnjknjriimklhhmkotssuvuww|~{wy~y}{vvw{rmrpnikpv{}ɻumlhnvpow~yxvvw{}~}|{~z|w}}z|{}{}}}taU@111+(3-441-*37tqlb[^]W[aaZbmhthhirkjlmlnspmongmrniljhimlkpttsuxu}yyy~z~}}~~xuwvuvy|ssqxnpnmjtv}°{iktolmsuwzxw{|}{|z|~{}}~~}~vbS?1,4,./)35/1.)-7xqhaiaZa\`dcflndiijhohlrlmmkkqkkojmgdlijkqrpqwsv|v}z{zz|~}~|}xxytuzxqspujjnjksw|ιmjklqposuxsv||x{|}|~{~}~|r`V;4,)05..-4/401104ubg[YZ\acbgbgogigmpromwponklnlqkmpkrmjjmosvyrywww~|~|z~}~~{}z}wvxvptpuppjhlqvv~ƴykkjlmnquvvytwzy|~}{|}~|~~|~}qdOC1'.44/5/3>46.+.-6xkafXZ^\bbbidjnnkmorllrpnjkkjlkjinoimljhmputtvwtv~yy|{||}x~}|}}|xsywpsnmrmiiquz~ugtsrouzvvqy|y{w~|~|}~~}}yyx|||tgVA65,,:D73//;511.7/7}tnh`fZZ`afg_igkmki{onnhknqknrmchkfkqgjiklosttuxtxv|vz~}|~}|}~~ustwtsnrntoolrtswͶ|kmpvoluwtrzzy|x{v|xw|rbJ>5/..**4373-),101084}}mf]`[\fccbifggkdlnklmlifjkqkdhmhoklljlmrrrywtsy}w{yy|{|y~~~~|||}~xvytsqtxpnnjkmrquªqmkmnqsxxr}u{{xyzvwu~|{}|y}}yw^I738**.-.96@057,133968yigcY\Z[abcgjggoolnkijkmokikkkosqkgionlnnlnmppruuwux|y~z}||{||zvwvupqsvnopmqutv}ɻupjpwpqruxvx|vy}w|z~{~}}}y}|}udI:4<</8A53185/0/111000?{ung`\\\Y_ad`agjikorjnlmlkgisnolilmnfjllonsooqyotsx|}{}}}y}}{}}|zxyrsrsposmnops{yyǰxjnlrptvszzz}~x{~z~|}}|~zz~{}{uaM=NA01,.1-3*-6.-,9169988}wkcdZXV\]ib`dfbimomqkrnnlhlnqjllkkglnflkrottsqvswu|{~~}{~|~}~~}~}~ywusoprqnnmmqtt{|nignnrov{vz}~{}z~}}~xz}sbJ:@NK41)/,/1)(//-+/34697<}yqg_X[YPVWd`bdhilkhmiphnllkmnhmihjmpkjimlqmrrqotvuv{~~z|{z}}}~}}}}{zupvtponlnnrpwuzzɺ}glnpqrtvuyw~}{~y}{|~|{scU64(1>6/'(&)0+*/./0094=>00~vsfdZ]`WXWXcadljhoklmnlonyploopilkimgjlkpoqqpootxyyy}}{x~z}~~~}z{~}w{oququnqkmlrw{~ȫqjmkuswxxps}{}~|wy~z}~vaG9,1./80/(-)-///.550,4<66/1{sjcX[VYVYbbfchijimkfokmplloqnimpgmkkgnmkpqppsrwxvxx}||{||{}{~y}~u~{xrwssrnoqpvt|μjjoopqrzwxy}}|{{~}~~|}}|}}~}xs]K8+(*)3101+-,//0.1/018;908;Pwsjl^][VY``clbgfmmnkjplmmmnopiomljnonkikonrnslqwuwzwyz{{}}~~}~|~{~~~~}}u{|vztoutvttqppsux{ȱrklootuvzxwwz}~}|~|{z{|p\I610)',/.,066+-+;43648/74145Axvic[`^ZX]_agijcmjnppllvlhkmpkjlklilojhkoisnronqsuyx{z{}}}~~{}~|}}|}}x{|{z|yxwvpuqroplowx{kgnvrvu{zuxyyyzyx{}|}|ubM0,)-./30.40*/17*00175574/6;<;vukda^ZYZbcdffjhgimrpssqulipqqhjijpmpklmpoonprssxwzy~{~}{}x~}~}}~}~~tz|w}yz{vtputuqoqwqϴyononmrsvwyz~z{}y}}z{|~o^J8),(+33+/.40./7/3674416/3/77:5~qni_]ZY__hfbafijikklsmpqqoppqhhijglldhklmmnoruyuuuyzy~{||~|z|~~{|~}|zz}~~{~|{zxyuyqsptqlpmonyоomrixrux{}{xx|{y~|{~|rWA0-3&&*<80131-,0116975536055@<<zujd[a\a[cc`ddmgcilnmmllpmnoshkkjjhgnknmrnnostptsw{yyz|~~}||~}}y{{~~~~}{}}}|~}}vysurpsvplnorrwwromlqptywvyyx{y~}}}obH:6(&14()866686,0<<96734031344=9:wqkbcTZ__c]`jggcgmkkonnmmplgllhlljhicmjjjmksrswqwxwuzxzw}}{}~}}{z|{~|{~~~~{yw~vutvoxrskqttzzzɸwnmllprlxutx|yz|~~}|}~~vgN</,)'+-,,.59>5661;8.45>41744:=66:vrgb`Z^[\\`ffhjfllsklkmlmmmmjokpkkklkiahnllppqvrxvyz{y{~~yz|~~~~~}~}~~~z}}~z{~|||}zx{v|vsruvp}tmrrtwy~{ūnkohtntuuuxvy{|{~{}xdH7/-,)-,%-03.8=38E65764:545518:741/zopd\\ZXbZ`jdfliggjhomhjjkkkjhmliglimomolojqpssxtrx{|yz{~}{|~z~}|{}}~~~}||~|||~z~~}y{zyv|}utwzvuqknrrtz{~кmgnmjpvxxxtv{|}{|~o_N=+,+)+*1/0885:<;9:75/39351-7199704.|oj`\VVVU`\j\^hgmkklmihldkiiokmjkgldimolnnosppuvutv}ytyx|~u}~|~~}|}{z}{|zy~z}}~~}~{~~zzv|vuvtstprmrp|wǯvcclksptszxyux|{n_D:.(+.,-+/,.043,4457779.=6<5440864,.,zsh`WSV[VY_]baggmflqljlggjhimijkjkmjpjmhhllmqpusxxwvz{v}|{{{x}~}}|{~}||}z~{{||x{z}{~|~{}~xzy|yxrsmnmkootwjgfgonrrstwwuz|{y}}zq_N:.+14-)),++-7174799@<:?8:664960,40057zqcZ^[VVVY_hfhgjhjiikqsijnjijikhnmkhmojfhlkltuqutzyxzyz|zy~yw|z~~~|~~~~~|}}}z~~~yxyy||~x{{}~}~}}{w{vxwywwztsuoqrqwz{ͷyfdhurtprtvwz|}u{}|p`N7-(.).3-33.(0=CENFAABB;?5583465/3-.//<~ymhb\VRTW_h_^ifnokkmikgimkojjjijhhqigmjojnmnrytwxzvv||y}z~|}}|{}}}{{~}}~|zw~|~}~|~}z{|{||{~~{}~~~~|y}vxxy{zwrzuuwxqqsvv~ɧohkllvlossrvxw{}~}~s^N;3-'-4-*+.7-)-045973:346730300161..0-/4}wijb\VTV[^\gY\qkkumjqigghijiljhhnijgnfkjjglklortrvv{~}}z{}}||~{{{~|~|~~~~~}~~|yxz||zx}z|}}}~z|x~|}~|~~~|~}}~vyuyuzwr{zrtpqwrtw~ͷ|iflrornsuytvstw}~tfT69/-,-.+/*,/605<775;4>64/79933/03./.,0+,tni`Y\TTV\a[ggmljglkgokmlimknnpfhohgdmiljlnmorusvwwv~{}}}y|||~}}|~}~||{x{{~{~|xy{{}yvwz|{||~~}|zu}zvxv}wu|wruqorux||pgmjrknqnvsuoyv}~yvaT?1.,.*)+-/,-71/878;=?76671<3553074-1/..)3}qdaZXQ]Z[db_bkfhkmhjnkoqomjirogjonjmggpmimqrpupuvuw}}~|yyzz~~}}~|{}~z~~}vyzv||uyyzw~{}w}z~~~}z{z||yzyuxvwuusrrqroqqvv{λ|hdknpqpnspyvz{~}{vbKB.3-)++,/.0101;:7>;G??<;37854:55//-..16/+-yndc`VS[Y^a_ggildgqnfhloihnijmulhjkjhnihikoqnpptvv{zx}y|~}}~}~|}z||~zx~xyxx|{{||}y||}~yz}uuswxzxtxroposusvwȮofnjqomrtvwtx}}}ofQ;4-,*,01.)33355819>;7=;6@:;664575.,-//131+3vncc\VQUWc_`cdggggimkpinjfnfkgkpljhpilkolkpwqnsry|zy{||}wz~z~}{}~}~}~~z}{x{}z{z}}}}~~}~x||uxztxzwsstkorotxsx~к|ihmjnqpt|tsv}|jbS=0-303+.,-+05-33794;<;@><7556198>31+.-051/3.xmk_ZZQXV`^\]cbhhnhlkpmlqlqmmipmoijjiljjompyrtp{zxvy||z~}}~|~~~~}~}|~~°v{{zzx{~{z|}~}{zx{xuyusz|utruronstzwz~ȳrdkzlnqzy{y}wnZVB0.+,,533-++3//3678<=8<:>69:9@6+=406././/5--/pid_]TYV`]gfdidjjlkoljpruojhljijipjknhlnjpvntsuuuwz|~}||~z~~~|õŶ|yuxzu{zuy~~~}}{}|{{xyytyzvusspnukpuvx{{Ħspttstysw{|n\E1.0-0,-330/*/4374598::;B?>;::555.0,+3,.00,010.ql_b\VTX_]ab_ablhikpolomnriikjpiljjnjklmnptrvwstvqt{z|~|~~ǿȻʽ~vyyyxxz}}~}~}~{}}}{zuutsxsvvtpqorptv{}ηxmpmjryvw~wrfP>-(0)'+*-.+*11455<?55>99?;>;:5573/++,//31*/.117}rib_^WU[Z^_dclfhhigjhkmjknhokkpknkjfjiimontuvuxsttv|||{~}yy{~|»¹µ~z}v{}wx{w|~}z|}}}|zyqxuvtvsqponrptt~{ïpskot|y|zn`O5,(*,.3+.*3.-,34949:668J=B;;9BA:5./',-,+1714840.~pg\aTW[\_^a]hhghfojnmkmonhjjjiklpjjikklkrqtrvsvyrxy~}}~}}~~}³³zyvutx}~{}~~~zx~z~{{rtrwstutonrqttx{ѽrppz|~wl`J;1,%***+/,+,-/+048:4<8998:7=8759;.00*+-,,.,0-3,04ynh`YYTVW\]`adZcggikqkjkmjkkfljmmnlsrklkqotrrvwtuyz{y~~~y{{{||~¿¸wurrx}|{~}||{{x}y~}{wvyzwwrutssronlrlstwx~ǰ}tu{v{~k`O6.+,*+-+*/.-.+/0/0:738456966498:5610(,,/+01.,.3)+0{qicXYVVT[\ba]]jjjjimlkmkjnkfqnjiikmpjlfrkqporxvxyx{y|}{y{~|~}}~}~½ƽýzxw{{wyw{z~~y||~|}y|y|utwuttqrnqlorqu{zƭytxz{{xiN<3++)(,./,*,001+/-56<9645;78541741115,.0105-.1,)4,/{lkbWXTR][Yb`_ajfihkqlokjnofqpjimmjioloptsooqpyuy{wz{{}}|}}žorxwyz|x}|~}{z|{}}|zsuvyvtvvutwpnnmprwsyѾ{}}{wlQ=0..)%'*-0,.,/03..37<6<94;.177637358.1-5643375+.+,.*~zqd`ZUW[[Y^fc_flckfjkolkgcpijnlilhmqmkfmlpqpxux~zxxx}~||~~|~~~~~}³ñ»żǺzvvxxyyyz|~{~{~~z}~yx{qtxzsrrtvwvrmnjntqv~и|}rdTB1('.3+/*./6310781:;;97;;3:/9:36.5*+.6757073013044,/5{tf^WNQV[[^][_acb`gijjljcfkkigkmjlktlkknjjtsru|}yyx}{z}y}{}~~|ƽǷƿõttvywxzx~~|z~~}y{zz}tvvywytuwpupppnppxzƫ~tf]?5/7',*')89.3175553979:7:<566769.0+,.158;>033-1/+,,-/5}ob_XSRQUZX[[`dgbailiijogiihkollmkinklmnmksrorvvyx|||{z|}{{}~}}¿ö¹Ⱦǿ}utxv{~wy~~}}~~}|z{|~x{zoxwuwsuxupqtoniuqwԽ|lVD-)+/*.++%37*+/068759566971868550/,+3997331/-+*8)+0/90-|p`]YPSQUY[Vb]`gffab`dfhhbjmiihiifjjlltrkjmpqqvwxuv{xy||}~}{~~~}}~}~~}~}¹Ĺ̺uttpztx}}}~z|~wwtuytwvuxutstynqvqronstt~{Ϭ}[B5.*/()-'+(/*/36<;;=9=57?8;583576151-3189=;1/1;.*,-./4//}y||vmg[XPPPZXX[]dbbg_ffidgjfolgcjfmjhfchospqonmtruvw{uxx~zz}~|}~z~|{~||{|~zx|°ů{urqxy~~z{{}|}||xzxywwustspsvsqoqomjmpmrtxtwP0./**,'/5(,*40),879;3399;338@4>?645;//18=460/14,+-1..4/5~v{zx{vng]XPQPOQZij]gigadabhihgflhfjgghhhhkomknnnooqytrzv~zyx{yy}z|}}{}|z||{|yw}~ºŽ͸rqqv{{|yy|z~||}~|}|z}~z}vvwu{y|wvysvvsrsrlnklolqtoxyxD+,)+-().1,07,1+0/89787149866775-./70065/31-03/;1;5-,*108|wtqmu}{nc\XSQUYYbg^`_cbhlnggfhjgbfikgdhhhhkrjnrpnnqrtusvo|vuwx|vz}|}{y}~{}~}~|~}}{}|Ƽtss|}|uw~{{|y}{|xz|~}|}~wzvxvsvt{uuptmnpnpijgmnprwx}߼s0##*')%**.1/144*/5;7845045676401./-3041P:5470/-97:0-/;55:}qmoiqytf`X\VMNOX]TYX^a_hcjsmd`hghgdkcjcpjmjkgplkpsrsssuuxyv~{y~{}|~|}}|{}z{z~ĿǺξowxyoyxvuzt}}~}~z|}{}{x{~~}~z{{ywzxxywxstutpurppmklktntszyu*%#.))+./.*05).486:;>886:6??=4+0./+,37548748.(+459+/-1943zrigikw|uh[[UMPRUV_\YXa\_bccfffb_gdicjhbjnlfgjjllnvpxqrtxyxwzuty{}}~y~w|}}}}z~}y|||~}}ưļǾɿ}vvxsutu}y}y}xz{|y~||x}w|{{yzzzwwwttuulpoqrqjnijglmstv|}ʊ;$(+)*,*0++0136374:;7856:5778-.--*/+44;=161./1,,./0.,5;;:5}vlk^_lvwpf^WQMVQXXYW][a\`dfacbffbgidhdidkkgmfklkmhlmrnvtswv|szxxt{}~yw~|}}||}}~}}ǻȾ̿omotttuv|zzxyy|~|~{|{|}~{}yx|xxvurxvtslqnnlmpncfqqnsy|Ԯ^%)())-,,+.4+(0/18567::599;781.0,.0.,46:9531,--.1/-40578><6}zmm]_^hu{{ofaTTINQNSTYY\b_gacbhb^cbliiggghhfjkkonknmnnqqlpsry~w{|uu}v~|~|~x~}{|{~~}Βsu~{z}~{}}Ƽ¾ȿ̿tnrnpstruwxwz~{v||w}~zyzz{yzuwzywvtpxrspqtnnprklhjnqtux|ٿ~7#(+)$&(+.,44,6606:87340=?77:5*//./,/5785:11-,*.,0*469:9651}rj`VT[gu}ypb\QMNKSXZSXYX[]acbbacabfjdanhgjjcllkhmmmmoktrlpxusxwywv~{}uzw|zw}{~}~mjrx~|{yy}z}~|y}¼¾Ƿpnqpqtnwyyyvy{zw|wz{zzzx|w{|vwxtxuyuuutlpnpjnkmilqrr}‘F('#++,&)+,/-3014:=?89876<8;4.-),,**33/:5409/0,-1*0133954.(%ymcYTS[mq}yubYSRKIPUTX[\\_b```_g_fddfbbgfgiqdjkgjrnlkhqjmnhqsqwyuzww}|yvvz}y~|}~~~}~~z}Ůq^[mr||z}t~~w}~}~zu·ùþĸrnlqlqnvrwvtwt{wxwxz{yuyzvrxttxopqtosonomgkhfioqtuƞY1%,$'.,,++*,/9.5;7>;49?9;6=:78-.0+0.56774.*0-00/1/0:8:=8.("!tj`\JR]jv~{rh]UUMHQMSTW[_^d^``bfdabffdklfgfggckmhhkgirlnmjnpxvutw{tvuwvxxvzzz}}~xy~ׯkf]sv}|~|}zw~||{{x{~ɿĺǯ{jhdomosputuwqwtuwsxywxywyyxssstprosoqqpnokmhjlowv}ƛ[4+*-&,,+1/0(.-541<:9<3:5=<96861*(+/53564:7/+*.1+10;98=:9-)$zq]SMNRYhs{zpgYYSJGOYTWX]bb_aicdhbkffcghhklbfkkmkfgiglimqoqsttusxvwtwpv}xv{{xx}~{|x{|~|}~}ncjrwywx{x{z}}x}wy}¿¸ǾĿqhjlmtnmkoqqwsxxswzvxvvwuzyttpsqurnlpnospimknknywzŢd3-''*//1*-.,0--37416418<9986:/-.0./.34836,0--*+1+.5<7=@<>*$!pbVQPMT\hu|wobVZJKGTQY\\]Y_^]faahididhcgfhfhjgmkihliiroqmstquqtyvstwzuvzyx||~yy{|}|{z|~~~~xquytx}{{yzy{}t~ŹóujksqmmnnnnmntvwusxwswvuuwptottspnoslnmlmdjkqtswzԿ^9(+,+,----+++1-4.>6/3937598:;134.3561:96<80,.41,3107=>C6;,  "yziXTPJMU[kw~xqgUXSGGMRSWaX_c\_hdnojmoqlfmikgkfchkhinpnkppopkout{ww}qtuwx{xzyyzzx~y{z|{|{}vqpruyqpx|z}w}w~||xy}{yþÿʳtdhhdflplkpornmtvutvrwxrsqurtqvnnpoornkjfclnrut~ɵV3.(10,.10*-/.-0948116730789574--3.<399;B;7965,1/4347>BAH>3)#&znbUJMOU[alu{yraUTIKMOT[Y[ZW_^abimnddhdpcdkmdighnhiidndkooppsqqts|{{oqqsv{yv{z}{|{{}}z~}}|}|~~~vpsxvvrvz|{zur}v}{}õλpfbfhhilkiqoosvuuzztuutvrwmtmqmmplsqpnrmdgoksu~ĿV7/-,.5-*,*-+/4--41)64133@>53840/.35B6;86/6/44*,563/46GEOB>/&$8wj^TMPIR[djs|~xncUOSJIQSVYXb^[`bajjfgchrvkghhadcjkgijaffnimlsttqttwvtv~yww{ytvuy~}y~uz~|}|}~{x}rwvsuy{x}wyvqpp~~{{y}|}~{Ӽwf[`afg`hikhppmuwtruvvnrqqnonpqtvtnqkkihhonrs{xM44**.45.*+--/4473158341<983?<44***04?@:48.5,-1.,<80;AGMJF84+!"#6d{qcWWNMJT[giq|~}paXPOJHJRTY`Y[ahdgjblgk`ajddjhfafjcgijcimjkqnpnqqpypuru{xzuxyzwy}z|z}{~}}~}~}~~}}xzos{sv}zzuswprtyvv{wz~y|x~Ŀƿʼtaa_ba_`ifhjmopxtpmrttrplmjqspptrmpjkliilnrz|rS65-/34(,/0(0603,17786594873-33/-,(-08=<844.?6..11979;CFCH=+'& %6a}uh]SPPPQQ\hly|}r_XKSNJQVUZ[Y\ad^`afdafijjhinij`jildgggiomnonnrrtrwvwtxt{xtxuwvx|{{|}}z~|}}}}~~qssuxzuvprtorpuutzx}{~u~x}~|źўusqoh]\fbhdlliupppuursqpnnppninvklkkkdkimsqv~uS>0/03.-((0*/(**147>>G;9345035-.+(**0977;:;;>3/8636786>EEF:1'#  )5Y~xp_WRQSOOZW^m{}vkfXPMIOOUVV\iZdccghjjgdmljhflkkfilhcifjjhhkomnsprlwqvuyvwsrvsx}yz}|zy}y{x~~{~ϰyvutuxvvxstokvxtz}{{y{}r|~|¾ŸĿ³m\\`aclktrtqpvonknrqolnjnmomihfhgckpuw{|{zZD/0.+*)0+-7*'*,+135877968806.--//)+01584:8911..4/386B@EDI>43&$$1UtzrcYTPV\PTUYaoxvk`WJPJJRUTWYYWfhajjibadcjdgfkdigigiikkhioislgpluooouvrwzy|syzzz{}~z|t{{{vz~{~|}zsvxyztmnrknqqvsx|z||wz~}{x~źſľƥtaWZbdfjqnopshupnkniknklqosllikfivqtxx{~{v{z|}nI-.-.,--*73*.(*037759474<?7961..-,1.997:F763-/-341488?EID:0)(%$)4Ns{i`STsSRQKS^gjv~vlaZRMPMNVSXYZ[ac`_ohdfiagbgdgkgjihjghjdphjniosmputpwxtw|z{uzuswv}xz~x~z}zy~xuxuvwnrrtnlpuws~zy|u~{u{~}y¾žƽӨoX[^^jjpsqmrosjmmigmmppklijkiidflpqz{|}yvrvzuztY8.0)*11)*)-),)-46:168:::83141+,.0117>5<<5340803630699CPQA9,&(#%,Jg~qaUQSSXYXSU\]k}}~xtc]THMRROYb[W]^adlvhhifgmdncfifnhffmiiihrkmhnusstvrzzvxvvwurwzu~u||~|y}x|}}~~~|y~~utsqoprolsorsyzx}xvwwzxn}xz}z~|ķʸżνĿҗ^\[][`inkkmpqljjhjjllmmnilhnfbpnktq{y}npptvsyz[>45*+004/'+-;((,.34376768404-,1,0,51=;7::871//08417<;;IRKA9'&*-3<]z}ul]TS[XZ]WUM[dksxlcZSMOKUVV[]Z[bijfnfakchhjnf`jjgfgjlhjiljjoolmwrws}vyusvywxt}vws|{|y|}||zzwutroqhkmyumu|}zyw}up~~~{}~|{½ºɼĸ~XVVW]dcimmmhihjhjgigmklilhd`hilqpq{{wqjdjmkls}^B;0..,,---&'04./466476645545-+)/,+-81:A<0.4:033/0/18<CJRXP=6*%&3@ZpxrcbSPWWXYY[TZcpyvo`[YONEOPWUU\^c`cc`dc^fdgjlhgiadgjkmijfkkmlqpplusruptwz{s|}uyz~|}||z}{~z{{{~ysmtmrrmntsrrwywvswzws|{~|{ȿĽȿ¾ݨfVPSY`dhgmlkfjlkkhjklgilijbjimkpvxw{tpk`f]hilv}qI.,.3--.1*++177.3.3;>/34>164659/.)+056;9<11.40//-3357@FN]UK?6,.1E\u|vn]VSTVVXSWYV\gnv|wl]ZSNNEORX][_^`\`icfdlja^afnimdklkdnjgflklomqstuortswwwutswt~{~v~~|}{~|}|{zyyosukqqvqrtq|vy{uwusz~||v{x{~ŸξǿſüŠ]MW]^_hcijlipihglljjhidijb`^fisruy~tjcb__X[fsr{tQ8.+46)-;'-.%=,3.53<;84486:990/1.(+08C7>=93.)341+-439?EQTTRH?0(4=[svjcQTVVUTXV[U[Zamrxl^ZUQOOOSZ\[^a`cd``gkmuagdklakbhfhhgjglkpllqjnsqqssssuxzuzxwztyz}|}{|y}~w{v}yspwrntmxrwty{x|zy}vs~yx}~|||zvz}{}ýĻǿֱxTNX\\`hgmggmiinihfglkhkjgfccnlqtu{m][UYUZ\cpu~xZ9++*1*))*/*-0*5/36174<60749744+03,-37=:;<6..9/60/089<D>PIPOC;01>Xp|vfbWRVSW_YUNWXXbnw}{ro`UTINQKUX\][bfbddccgnjckigbaklgcibhillljnknpsvq}myvwusuuwuuw|zy{|{~~~|}~|}wsonopuwottsx{}wyzxp|sy}zxx}pr~ʺɾĺժkPSVY]^gidhigjjiidghfficf_]_jnuuwypaXQSTSUZiuwkC6/3**)'%%),*+,041:;679@7563/0*+--(15<8?34,(.4+3.117=CCGMDOI<31FUrxjc\RNYU[XXYW][^grwzqulVVKKNKPYZ^^^hdbchifgj`jglddhnnnjhcgkhglkggjsstsrt{ysuwuyvw|v||}~zw}||vsqspisrtsps{z~zv{wvy~~|}wu|~wwr{y~z}þɽҗ\VZSZY_adg_iifdfjagfdfifd^dhrrtzyn]XUCFEHV^ozpU43+/$%%$',19--37836978.3;11143.,/6-3374:51/.03018569>FKJNDCD?@HUj|zn`ZSRWZ\ZX]V\XY_bkv{yvli`ZWMQUWYWZ[``agb`fhgkdk`fjajnsllmiklifnrjloqqtsutwzzuxsy{xywxzw{~|}~|}||qjprsnuulqrqpxw}|zqy|~|v}xp½{XQTYYZ_c^`_jffgfijigdbfggdfnnvu}maWI;B@?Q]iq|xX8,+%++.(*)*-,./>96?88:91899650/&+/546;>;44*-/,/05565?@GQVSDC:=N^n{xrh[RSYXYZ[cZZVT_^\ku{|vod]WSOXNTZ^[^_Z`_^ddjfdjhdjghkplkiikifijkkmonnnntwrtutxvvyywwywz{{~{~}z}~|~xxnmnjrqnupuut|yvsxw{|w~y}|z|yws~̽ƽ»گpZMRSYYd]`hbfabbfmjadd`f\chkvswzjgRC7;;=DY`wsa:+*&%'),(*'&/*0/647A5D7:6;974-)('01796=:.10*7:-4<DPK>ABHU]?I>>JSj|wm[VUUY][^\^a\YV]agpxxqf]WQOVTUV`[\^c^daffhcijihibgqiokighffjiikipqrosprxsxwuuwy|sw~yz{~~}y|w~z}vtnnmiqkowwt{yu~zor{|w~{|~woyxry|~}{Ż±ͨqPNTSW[^^afjfddgib^gdaa^dhjpvypcTE>:05;R\hs{rK6-3'((,*))+)-407==6:3/8:45<63//))3:48>69.1./,-1/:>IGSECEXJCGEN]m{vnb\YRTZ\Z]^\_VVRX^hnqvnc\ZPQKOQTVY_b]bad_caddjikllmmljgjlkfkljngntoppsvlotsyvwxyyvt|y{~~~y|~~z|}{yxqspupnsnmvsuxqs|tq|~v|vx~yvv|xsyz{~ΠlTOPWYT___fdfcbdg`ifca_diloxytj[H>5/:;CU[izzuT6)-'',15)/*,3/16>=>67<7:::8463+3(/4=;@831+-&)-/.6FBA>HHDNXMNDT^nvh\XQX[Y[^Y^\ZVY[X_botxunbYXQNKPV[XY_]\dfgfbaicfhridjiqjknhikdkgjioqstnsrmszt{}uwy{zxx|~|{~}|z}~~~{qqwukrjlwqstwyw{otq~x{|y{txrt~pwysuz{x~xȴ͚_KTPRX[Z[_fbb`_b_baccfjcjrux}~qpVKB6007=J[cqx{]?46.(3*))-/,107=?<58;3=689530.1/,+7??=<663..5351?8;<=@CHDMSMKP[lxvg_[WVV[X]\Y^]_ZX\X\dpt~xtob]SSJKQV[_\a_acbdda_hmfjljconlklfjjckifjmqossomptrvv}vvyysz{w~{~~|}w|~|xxkspkmtmosooyruxtpy~}|uyzvqz{svwvr|~z|uôǸtWSQTWW]^]\\_jhdibddabdbimswwh`T;4),.6EN`iqu~jH1+(=@KH>*-+*.6=8B87799<=1959//5./.:9;>5805,,.1.*9A;=<?FPPMRSS]hx|sf^VXUU_\aY]^]YY[[UYfjtx~wqf`QMJPPTYZ_[d_gjfgcdhobimkbjikmkbigdlkgkplnmpnttmtwpvv}w{wwy}~}}}~|~zw|}rorwomosstvqqtvzumw~|xuyvv}{}vjo}y}~}}w~ŴԤjSNSSTWUZX\Y^``[a_a^Z_iklt{vk]R:.)(3.?NXhouypJ4+13UY=@;=0,-467587453889<910-//+368:<:74-4.1:70/<@;ADEMONMEU_it|xjaRW[^Y\``]Y`^UV^X[\`lvthd`SPPINW[WX\bg`fcca`gg`fldggggkgkgbhcngjonnnopmrrnyoxyxxywxz{}y}}y~z|~}}xnostklsruvruwxupy}z~|xyxyz~zo|ohjxxwzȓ\NOPNXUVX[^Z]W[\]^`c`gmkyz|jaQB1.+-.<IVdhnwzz\@-46,*4/.3-0*/30584491695;9:11,/-06=;=51001060585477>>KAGRMWS[gq~{ohZYXWT`_`f^Y^^_Z_[VZ\ir}|thbaXQJPTX[]^_cfdchlga^jaghdccjjg^gighhmjmqmkinmrytuxt}wyywzx|z~{v~x|~~z~}|wqsoorrsqwqxrt{stpzzy~xw~z{xwwwzrmqzys~{ňQJNPRRPWWXX]X[b^^\^cdjmvz|n`M83*%-3;<WffkpziC+)1'+/'5.'+,1+9658696/69741/..1.356<?FE./447<4611407C?DJKSTVZht~~}rfXVUWXU\mg__^^^Z]UYWYgguz~oodZVROXQTW_a`idghhigifjcalfgckkl`cojhfdknpqlkprnrs|{qxuvxwxw~z{{|{~}~|z|tnpnmsvvwsqswvyy}zuxxy|uhtyvnstur|~z{}ޮdXUNMIMTSZQ[[Yb]][[bbjluzuc[Q>0&&&-8?MSjkv~~uT;()%(&-0,*--4336::9537A>7813/.$*-.78?>C;0,3344:31794:;BDTOPRaku}xxmaWZS\\\[b`^\^[[`ZTZY]dfpwuhc]VOHOQQZW[fbhdbdughdhcgjifjjhflniikhfklpkiommppvsqxxv|~{zvxxzzxv{yv}|{vvwvrpnqpy{stwor{svz{{vzy}}tpqxpgjqstx|v||}½͊m\QQOIUTUQXWWXXZ\\cckmv|}riYP@1&&,.38FShdjy}gA+**'#*1+--33449=46<9:5;7773'/*&).1:>7=43*,+6115611<7>9=AMMS_lv~oojYRWV^[Y]\]\`]^^Y]ZR\Wajt|{vp{\UJISZYa\[bbbi\aflik_gdhgfjbhdjolhjldjnkgiimprssxquy{~~}tvxxyx{}{~|{}zy}wwrov~spyzuuzqtxxy|x}{uuwxsrtvvw~{z~y~|}޿~bYUSOKUPPW[Wa\VVYadotywg[N=0(0B7-,=T_dnpxqN:8.'$'&,0,-403=898A@844;63-.-,'%337;>>5.,,4:7571889BJ=?9BHRXgx~gh_WXZZVY[]b`^b^``ZYVV]_^io~rof[TRNRSOVa`Zagddigidl]khhigfaklchgghmjnmknmlpqnwsutwx~wy|ww}y{{{}{|{yvw~xsytr}plsutwtpt}wx~xt{smqvuq~u~wy}~}zֿnXPIMMMPPXW^\Z_dcmqygZN=3.+$*;DA=X]`gsxx]6*,-%&*(')(-/;5<=:>>7.75840--60*+4=@=:;4-../8689>;>>AADB<@HUgpdcYUXY\X[\_c_c^_]`^[X\Y[ljq|smd]VQONQPR[[caccddhlcnfjhkdfghdhggkkmhqlllnotnkqsqxww~zx{wzxu~z}~{|}~|suuvvx|{sqsruptuussw{svyntu{v~|ovq}{~|}սcIFEJMOKZZVZXZ_ghs{wh\W95+.)-?=53?S`dk~}k@'*&**&)*(134/?G999877;594:4.00,3.49@;:601+,5:;46:65:::<?>IG\k|\^WVW^W\^Z[``d^]\c^]YXUZ_pn|~|undcUMJNMROWcY_cbi`fbfficgmdbhdahghdhjdlfqlokjoppuppvuzzwuv~swu}xxz{~}|{snxorpv{yyvtqsrwtzyvy|~yzwu}}{}|zz||w}~~ʗbQUPFIOWPVQVZddlrzuh[V=5/../*$,34BY\gp{oN:-/.&,&'*)-3.<5;=?9<<:9:9710+*&/.34<@>61,3-3136;7819:<B>EAEUgt[ZQ\Ua`a[[]a[\]Y^faZY\W]`hn{}ypb[SONORQTZX^c_bhgcjohhngjfjkjfgkggjinjjkkkpmsqrrprsvx{vxvu}~}|yz{wy{|rnpvpqsryxyntoootqwvtxxwsq}{}zu~u~~vɖrpW@FKPSUUY[`dkov}qi\WA0)+&(-,(43@HT`iwzy[3+&,)&(&*0+,,3?847=9F;;8545;8,,&13;B<<73-+3<0-<99?488==ACDJT]q\]WYX]\\_]^\]]^_b\]YV\Z]chvy}vpf_VSNOMOY\]Y]g_ca]jjidficcjkifgilbimptijhjnkoqtsqstvw}vzxwzz{xyy~xyy{ytnmormrrx}}uq{wtsrrrqswx~uwtzxt~sywu~}΢|XEHIKKQUQWXcksx~|vn\RB8?54+*$+,76@QZflycB.&#('*-')-..-0/9><;98::78957..,./49:885,/553//<858A<1=5=;AT_o][^TU_\_c`[d]a`]ab_ZYZ[]`jtxutgbZPMKORVYY_`adcdjgbgfc`gdfjjdfhhhklkfhlliispqpuusuzy{yz}y{z{y}z~{~|~xosxtknstsvxvsyrwtryumtwuquwyx{wuz}|u|}ʾ̝dBBFEIMQQY\_dow}qi_SD5/+3,)#*,/1:HZ]olzvJ.5(%*',,(++807/8C;9;5619;;7105/408<;BH=80-.;?3684859638;:@P]u~]]Z\Zb`b]_^\_^f^X[`ZX]^`fjqwrpgh[QKHOUTZU^__b^agiagjgnjikiklfjghkfmcikhknmosvsrtwywyyxw}|y~}wwxy{|}|zonvtokhmqrzz{wru{tstwy{vmuus{zvp|uzy}~yȿʂO?D>FHNPX\ajnz}tj`RD6,74*-')/3+7AP]_bsyY6,)*%.+++,5-4-37=::539587;951-,+806;8573)/.5;:674695871;7ARWnWX_Zba]`a_]af]d`\]c_\YZffjr{upahVQMPQTU\[[bad_cbcb_admikhfikcjifhkkfboikklmouqlouuyyxzxy{}~|zyzyvxwusmbkhhkokpyxz{uwssw}wy}z~sxswv~}ur~||޼v@77AHHOV\\iqwzui]RH5/-),,&''.*07<O[bm|hB.-,(*./1++-.7/44;5?97/568J6503,5367>45..++00354@B7615545<HXj~XXZXS`_ab^c`[``]a_Y\Z[aacix}rl_a^PORJNUU_`_d_cbgdi`hblhpnlhhbhdhfghphfkilunpsqpwsswyw{x~|z{xurwwuĠvij`qnjgpphottvwyx|qnxsnxtwx|yprzvzz{y}Ⱦݭ^=;>DHOSZ`brv}{ob^D>/./*-,+'+)/19DN]ivyV0+,+-*,4,/51373=76759<66<98364..-6?=@03-.-(374504H93046/<?Oi|WWWWZ^\b`b`d`cbbaa]bY^]dkntxzvob[ZSNRMSVYVY`f`fcb_aijcdijjlcfgchhc`ihhjljoolpqstszrrvu{|{yvzqxyvv̒qhhnimolhnmpstutwtxrssotvnwvrowyvn}||y~wz÷ŻǺ͎G>DBFIRT\couwnaWE:1+.*15(-)*)-3@MXacwzzZ9(.,.*(,.)*9)0687;4789AC6@995.-,/,5A<85:,./6.?6711473.79<=G_t}[\_V]d`f]`X_\_bb_b[^]`\\fluz{und\WQOONNX[Zc_^^cbbddafafnjkfjkjibgdhljikkilonpqotypwuzvv|uvwwvtuoswÿ|khkklorniunsvvovxqwrtzvvvzwrtuuqt|u|xy~x{½ȸYA=CDEOU]_hqzwoaUC=40.3./0(0+(/,0CJW\qzzlE9)+1--./+4*)3/783<;63>;584957/5/6355:441+31876=95006/,.;>KXma_][``_\b]^_\]W[\b_]][]Zhiw|~sshc[OSORWRZ[_^b_\bdcjdjbcjijfjigjggghbjjnimimmpsqrzwwy}vuxrswx|uvqwwίzhgfgkkquiltwyupvttpuwrv}yotzyvuu{|~ryzx~y||Ǿſ¶vW]ZIDHQXdmqxwo`WF>8,,/-,/-%(%'*1:DR\guzvO4)1(+,*+),->5044=4:97=:<194B30*165?::>55/47776??<817+)-/8PZm{\]\[[]ci\_ba^^`]\^]ZX[YXdjt}}|tmda\PGHSXWUZ][\a^agickjdgfdifhoiididlhkdjionlpnosuywzryxwwyw|wurswpϯsg]knnowqhpwsulq{umwsxtwuqruv{u~v~|~y|x|yt{ɿʺګcT:HMNV[aq{una[C<4//./-/0+-((.//7HQ\dmw{}c:.+*+/+-3-3.6346;941/387457<4/1./8668<718--7/98=:1:40**0;;Pi~__\c^]__b[]]\^cb[_YYU][Wbju{zpiXYPPOPT[ZUY[^db^bcfdjffkjihgjgjjgfihkdkipqmvturswwtwzsxzx{zwtpnttϰkflihuyfkmoopootypp{qxwxtt{|{~}xy{z}~xukvuq}ŹĽƷիrK9AJMUYfq}}tm^VI<:0/.043*/)%**(,59FQ`fpu{mD4,,**,3),.514606A?:356:::<7065+788;::;0,31/89:=>333.&")/5G^xaa`]^[_ab\[^a^]aa`\[Z^`Y^ipuvng_UQJMSTRZ]UXYdcadfhfccgfkhhjlmjoijijinjqprstqqppwrsuvpwvytqromos|ƪyhoddikklqqpsnrtpqvmlsyvwxu|~{y~|z{|~||spsusʾȻĿըd;:GIR\dstpbVOC371-1+,5.-+*'*(*/>ES^akqètM3,+03-+64-,.14:<<>C7433>67<;783:531<46;4.07:95=;:64/*+%%1=^m[ZiaYa`Z``bfa^c`_aY`UW[Y`gnzzxrb^STKITXSZ[Z[]idbcada^dhgffgpnkgikdgfmmlrrojopuvsppyyxw|surutrpru׾vhikmnionnprltolvvvnryst}ttzzz~}tw|~~yooykĻȽͽžȽώ@8@EO[dryupgTG?:5.-)*01+-'3,&)&).7ERXhʰ̱v`8,,)(,0.+<57509819=7941/:5:;>:60;13=:68-./897?6394473.((.=Sj~df\c^`[`a[^]^`^_]Y]_XRTZ_gox~xri]TQQMOSWY[Yaba`g]^d_afciidjkqjfilijrkkrsqnritnrvpuszxxyvtprntkp~е|dgkulolgknnlwrqnsvuuwvtpq}{rzxzx~rllp¾þƹþ;[8AEMVbmu{k`TAA4+10/4/(3,+,')*$*.0@Qmɯ\C00-.++.303/)438:5:6::89:=CD<<93>:761/9/-0034;:><11/.0.-.;Odv^]ch^[^^_\\_YZ]XZYXYWWVZ_jp{rla[VHSNVTU\_a\cd`b_]ffjblpdigmgjfbdimmm}usnqnonksoussrxvssuvponnʬxifgrsngmnnqrqxqlsyuwzrmpprhuyxxz~yxr}xqouɼʻƾl54FM^`oq|gbXI<75(*-1//,/-'"'$%$'4JuطtH0*+.+5+)9D8+44?=<759757;9:@DD:653>:7=5/3./5748>9931-,,/9=P^w^`cY[b[[_]YZXX_`WZVWXXVX\fmy~tj]USKMTTTRUZ]^a_`^bcdbfhdfbcadbgdbcdjlkflkknwopsspst{nsuttpqqohoƧnbdmliolkiogpmvzvvyxtpqttljt~~us}qho|utuqzŵͼۚF=@PU]o{xmaTM58111+03,--()%&$#(3CҚA*,)+-/*,*-.+..6;=53878563476::13986:81-7.7397?80/,(#(49;P]p\[\_]a[\bWaYX]X_Xb]ZU[[W]gmt}}yqfcXJHIPRSRXZ]X^Za]agZh```dgdbchbdjkkcaikghkmrmquqqv{urtqvsrnkph}Ҿyp_hkpiofpmmrkpvzw{zrun~zopt|zr|~}ywrs}}uuts¹ư¿ǿW5@HT^lu~rpkUH<04..01./()*)'5'(.H¿ڿS#$%*/,3.337+3;8@B?5;:;@03:186/?7::8<=75/054=8G@6/,(')-.AZm}YZ\\[Ya`]^]]\`_a_f`WXRYTZdox~|wjd_SIDFKSRUVY]]X\Z^cb`baaf_cddbdabidibjmqlkkiolmnsmnqpsqstnnifhgҭpjckpoihkqqrsvpt|uksryu|wsmy~xrm~y|rs~}swrwuyɾ|A?JO\dq{}qpdYK>4,0+.**)'&&'!&)/RѾt''+0..)10/03468:96916CDP:5.5647867995743/79G:>C;8+3*..4Hazdd^[^Z``^[V[W\]\^\[YXU]SWiluztpcWRGFNMTWXTXZ`YZ`d^d]ffacafgcdaccigkdidnjiojmmnplpnussnqqqihhmoŠ}qnbiofhpmmkwronuxytqytuv}ytt{q~}}xuot{qfclpпƽ֤Q:DOV`s}zshgRA:4.+)-,(,&%'(#.8oź3*))--5,/.157?@688093?9A;:<<4555196=70341:96:5961.',*/FZsbcY]_\[X\Y]\^_]\[]\YXYX[Zdlx~wlbWTGKFQKTQ\UW\Xa^bacdjdcfc`fafba]faihihkpmlpopnnlnnpxnrswpmkkq}Ծslh`bojnoovulsxpor|yvwzyyy}w{w}w~|x~}{qhnntžƽſúwDEQYfnu{qf^PF<3.,+**(#")&*,C|ʳQ"+/*/'-8/,0=9>?:3718?94<344/56:5941/.<5?/99888>-3),,?OmZY\a\X^^]a`aZ_]a_aa`Z\SW^htw|}vo`RROGGJKQOSU[]`^^baggcfggdhgiiacfkjfkicpkkjiqonqnssrtswposmjho̺vmfbkmoojmquusllwxzuu~trxtv{~zw~~|rn|}zoqomuķǾĺ½֦`AC[]qy}siaVE6-/'*()5%#%(0Pֿ܃++/*,4/,-31/6:;697<86:5843//.841940,5618=463@84.,+?ENlyZZX[Z_^\_ab`ab`fca^[[^W\^gpxxn`\QFDJNNQVUWYZa\a^gbfddfcdghgidfhfddclcijrkqinnnnsqxtxrrptnggpʳujklfnigorvsvpgo{yxwqvzx|vy{|}uu~|}xiv}tnsojzôøýŅOIMWnv{olaXE15-+&)"&'&(4dϳ7)+,)*.0,433157=898<44/1,130<.84/41,0/<6;A7;/6.1144GZt]\X[^\X^]\\\]ba\ccbX^]][`fn{yi\YQMDFKHNSRT[]`dc]bajfflggfmfdgbhhhlgbiijmgpokmlnmvwwsstlmnikǹ{ngndgibmfmspilmszvsor|{so}|qsrxquo_yvssoo|ƻºĿɿ۹mOOXmttl^J:,'()!%$'$/EpC(++.-+*.6//4844;=I0-13:5,.47=?<10.</147457818.073HZl]]b\_^\hd]ac`^ifcf_Z]`[V^drz|{ri_[TGIMGOMKOSY[aia^^fbggfchildjihgghgiifgnnnnmjopntvuruvp|nkinɾxojjifdmoknummrpt~|prqxtxxwpq{zsxxfsz}vmtvjmĴʳ»ȿ¾О[K[cu}s^ZF5+-'$"'$*0Jѻb,+.&(-,/58>6<B46:9/5<54.55=871))-31644977:;44//;?Hm}]]bXbcc``]^b__cbca^_\][][jss}{rmdWRWIKMNNGRZVV_d_`fgdhkfccfgngcjhgilhgfjkjmjkntklrsvuwtz|mijnʨ{jchdgijmlkjoqqowzuummu|vwlv{w~rs~|}xopso]kŸùŻſȹOU`s~ylbSI0,%#%"%'1Vȱw--*,*3+/9//4373<6=76:16/5.5,.-+%,8/14:;;<<8:6:/:F\tfd_\YbY^b\bac`gjc`^`]XR_^gms~|uj^TNSPMRTROOYY`^fccjlhdqghfihgmahhfkiidglklknoooosptvvw~wxnolsôxhda`mlnqimmonsyvlw~q`l{{mo|~|y~~tly~|}vnsxvjjžĹĿÿְmP]u|tpf\A//$%"#+9bՓ,++.,.,/03359:/:3445/-/55153/&,0/<71;?<9;4391//APn\]a]c^_cf]``adccg`gcaYY\`lpq}wp`WQKOPOKRTP\W_]b`g`iidgfgclkjmfihidilmjijjikrouwuwxqywuu~rnouƿvab_gcrmhknnjtw{rywi[gtunq~}wzzwwz|zv~zuszsmmĹüöʎVZk|zrmdf=,&"),Euһܙ/.-,*,.*.113::44>==3000-014-0')435471>88577005:Ffsbb]`]c^_``dccf`bbdcagb\^^hpvyupcZPHGKIQRWS[[`_`dfigdgidgighmhihlmhhgkjjnknlosqqtqoswqrsppikèo`]dagggjhpqtopuvsb\cqyzrxz|wrlvyu{wuxokox¼ȼʷٯpbr{vu_XH4-*&(/Pȳݙ.)))(+1/45/45138:703..5337+0+/&106.1/4::77.0-0@Ys``b[faffbagci_dacg`coaggfdrzzslaWROMPQUGTY\^ab`bdfcbgffgcijojhggkcmhpojrrlmnpuspttt{srngmfm̴ri_clkgdqntushoou_Zkwu~{}y}}|t~~sus~y~w{rknķżÿɿ͟tozun]TA6,)+AiǮޚ(+'+*,..598A7;90/6*,,/060/,-(1,-3315?8753/++58Oi__bbi\cf`cnckfcddicfdh`]dgq|uqg_XKOQPTTVUY]Z__ccfdfgfkkimhigjgifikjkolpokppppnqruvqv{pmjdhôuk`dgnqkoksmpmqfVdoxtwyxz~u{wkx~upqiu¼ƺŸû̩}zwpgcZJ0.<Zݗ*('+*47538;;5>+3+0)/()-960-438-13=3959.-&(,36C[tbbd``afdg`gfkigdckafdbfccjpvzumfXWPQNNQQXYZ`\afblblcbghhbphkhdnjkhdbiornnskrqoowrvvtsrnrliq}sncimmmdgulohjdUZqwxu|sv|}{}{{~}~zv}{rjgm|ÿŽŻÿƸùʿϯ|obUI;?Kw̼ۓ&'%),-//39==C@554/3/1.,+.0+*84-:636149*+&#':9Njbbbibgbfggahjgficigbfb```gut~uoi[WYMPTWWT[\_dad_fgkihklhlcfgqimckjhlkjookmmquttpruvvusppiivб{ylghkmgbpomjmk]coy|~}wzs{z}~zwu~~|srdgmžǺǻǼ»ŻƼǣ|i]SEOcȿۋ*)%**/8784;89;:)545*/-/.-**..373:46630*%!!&/I\{abidfhdaffjqhfffgdf`dbdabkpv~spgZWRMORPXT]^bf`^ffhkfdfnkglgjojullkhiikkqrpppsrotuttyvulkkg{Фks^fdbhglimlfalpuyzvvz~vvxw}{mku~}~}{~}s__t´þ¯žÿſƾʧ}ui[Y_{Ƹف'1),54-33569>:91075330110,*,919A38;?1* $!%*BWpgghchg`ihgffigcifdcaia[_dknu}voc[XRMRTTRY[^gca`iiljghjlpmphkljqlnkdkinirrsvtoptsx{uxwsrnhhɜ|vpia_chcfkidaptquv~zpwvqszsju||~zzk`ch¾ĹDZĽȣytcivźǿq(,**334466476H303551/.5/9-49;9:<8;<71-$!&3Nggffghhighghgkihgdddcbfccgint}vnc[RQORSTT^WY]c`fbgbhfjjjlgklnjomohjghhhlklumpqvpxsq|syumolkֹ{{tii``gahlldkrrruusuruzvnco|yvin{zzvv}qjdsƹ¼ü͵zu{Ƽƺ],1)('-.3/00.6@8;D8870450/81615.863;6-(#!#,<_zffcgghfndijghggoghnb``dg_knvwnf^YPMURWRYVXZcab_idififfiflignoofniihhhilsvopqsstuqwutwqhjmѽzxwyjcf[^hchmvsuzwpjnu}oc_kzxylm{{uqt|}{nfjs·ƾø̹Ӱ̾þA*1.+,-54.41585996::40-,+..17>3897765)%&(6Vojjfggfgjfifggjhghndcggacihsx{si\VKMQTPSZ[YY`a`dljifdlikjjfmkignkgdg^lippolnrpprssxupsjc`oúzo{xkha^iiampplq~uhgtyshfmz~zzvz~}|}wv|~||wpkow½ſ½ʽŜпǸ7+0,3/665-05/875;850/11*0/+0743799;95) #&,>bxjkmbfdbmnkgfgijhgcgdhd_ggmsy~|zuk\RSMKQUVZ[W_b^fjhmqiljhkjjjndbmoilbicjjhlolqsmustqtrpnldbm¤}zrni^hijnqkptomdcrrjbjrw{yyx~|{}y~}tvyxrppvøŴſϽӯ̾,(**080<>311053151680(++.+,.540:606),.((-ATtffmfkhjhjfdfdhgcmdfggfdihmrzwtg]OSPQVRXY\\a]a`dchijjdjjijmgddlhmhclfllngjjpsonqzpqmljfacuȹzxsfnldfpjnrmjfhmkb]i{{y|y|~ytqzysrvz~uumny­¹¼ľÿûſɱ݆0+/+,.653313./1818<535/3/1&-45985315/*.6:Of~ihddnllkjihmgifhljbgfgdlnru~{qd\QPSOTSXWX^g]fc_gg`chhqiinmhjbkmghdjcifkgqpnlprpqrrrpng`f΢{}|rhpfgnmimlj]iyl]\otwrux~zrgjp~woox~zzwxw{nz{~ż¼Ľ̟ȼ»n(*,(*377/;<//54/5;.45)/+0---37/8/815411;Mawddkgaldjflj`jflgkg``ck`hors}yqgbRNOPOQVY[^g\_abhbldhfknhhhikgkidhhfgjjkgnnkqqpomnouqfddh̡{nonkpijrmfakkmc_mvkdlyxtl^iv~z|}~vro|wuxuxuøɿûȾƾͥȶV.*045F88767181;31:-,7++*)(.057766938798HWnkkijhgdbgbidkfhbklfbgddkitvyyrc`NRPNKP]_\]gZcfjfmgfggdjmhckjnljmkcnjchmfmornnrplmqknc\ikʫ~zmikprjrpfimrd]]stsibvumibqz}{y|xtukq~{zzuq~ż÷ĿÿȾļ´ƽиźпD)+00315;4:733:333/0,-)(,.8446984;@89AAHOb{ggifkgijchfdlaffjkdaib`kjqr{xkc\SURROQXZ\]d]c`bikcgfdhjkkkgkgkb`dkfjfililosnspsnmlnobb]oҾofpsnlpomstshjlnmjlsyuqfvy~~{}osux||sqŽ¿ź½ľɿ·ƾļþħƽ17004635588<4-99,31,+*'*/67,54713:8=EDFK[nkkkficdhdffdghhjjnfhfbdkkrwyyqbcPRRSTYX^`c]^dfakidjcihjcfjkhhjhcckdhklmilmqlqpqllojfda]z~sdjkpkgkssupqtqfgoovttl{{utw{~tput~zvqx}öǾúƵſƾƿξŽޔ7.1/-3391<68756:534//()4/66/5<65<:<A<HIXjxhhlffgfkmfjddgfdkihihcbiimu~vjf`UUKRSTZ_qja[_bfdghffjdifgjgghkfcfkdjnihljokjojmtnnjf\ad̤worgiohdkoklsrrkkqwmdmvtvvrt~~}uopw~~tnm|¾ɽýʯƼ؄,(.39598:B86-7>;85/55.+0054/-.5101AABGK]shhljijhgfhmgmjkgjhfgdkdgiruy~wti^UMOUMRWXZg]^]_`cgijjihlggfghghf^ibihjfhmijlnnokjmigc^\_Ҿ{zkioigmslookkkrzyihs~vpmp~tsq~|wonzw}¾ʽ¿ǽþ¼­ƻh#&)/3133-747070881-+/,+6,630569:C:?CGN`nfggdkdinnlff``gjdfcdjgcllqu}yrl^WTKJNQQWWW_^`^g`hdffdjjkdjhdgfhfgdjjffhnjlhmkmmlmijgZ\hϼ~znthhnrnspoicfprotqvzywwux|ysp|}wqn|¾¾ļľʿN%%-++)4-(.057I9@;046*)*61/,.183:C@GQJ[o}igfihigkkciddfibpihgfajkmrxzztf[VMQRNWRZ[^]abdd]`igkgkkfchdhfhbahikbajfcfgnjqwkokif`b]qǻ{tqrginxvqlrdhllosnuvxxy~yv{wtzxoojz}{yľ¼ɾ6).%-1+-583--5:43907.(0*.96>50<=?C>CKW`sfghadgkfmm`ikajdkichhkkhjqzx{uxhZZRKRPQSV\]`^dbbbcbgcfmnjmfhgdakgbfghjhbgffnomlhikhfd_`xӿw~slyrprjmhjmjqqptpqtx|{y{|rmds{zƴƽſ¿ƽµŽ¿ݑ(%#)++,37/.-.8460/1,+,++0735?37715:@K^jznnhdiggigaYbfblbichiilgjnnt{vvd_UUMIOXRWY^\cg]`agb`gifhbhgfdbigghdgcmbkfkgpqoloiikd^\dzгàqxornflwfgornypuwzuuqw||~~~pkv{¼»Ĺ¾ÿʼ¾m*)'$4,//400+7660/-/*/(@1148;?95=/8;QQmzmnkcagbibgggdffdddddgbgiokuuysg\UMHPNPOZ_]Y]afg`jjhaaghchiafghifgbblcjjfijptplmijpca[a{{{wpusppllroplsxsmgmv~}yx~}}umt~¾½ĵƾ¿D*%!',01+,3/5.35939-)*0---6<978-5(0=T_rjjfcfagmjjdiadffccacfkcgiovzwsl]SQKMOUYWY`\f^bcchkbighcafggifjbfihb_hjikijllrkkglmi^_bѹȽ~uyuw}llorufksqrsdVkzz~ut}vwwnz|~ƿ¼¿Ǻŷޙ80%%--.*9//=6/9:<847,30-0,;7?97.+(6=Nd{abf`affjdigcfcgdcgdjfkd^gnwt|zvg_XRQNTUWX[a_a_cbbdfhhghdfdhkfkbkbhhlffhhllmjkjnonggc^]_åxw|t{xlkqsjissqjgdktwzuw{xxrmw|tv¹¿ÿ½Ʒq50$',))+)+015145AJ:-+-3/59=3@49+,&1BZuhhbcfhbkbrmhddcggcic_cddfjjx}xh\TORMORQUZ^_hbgdccfhgfhjbgfgkfdgahcifghfilmhgljniilhb_bȺx}yqnlhlmjk}unosuunu{v{uqmusl~yozü¿Ͻ@.+*&++.0.1-5633<C<3'-/8.3588?:63+*6Id}ccggkidg_dabfd_kicjg`bajhjuy~}xf_YOOPSVY]^[_`b`acdjgifilibbfiiggdchh_ifdkmljmlopknhcbYbѺmnwhjomlpojoxyqivwicjir}}qu|¿þżӿۜ+/.&+0-../3;30-083/85,.03/31438511.@Uqbbkhgkbfbdggggfiibmfffbdimvyyvg]YVURSWXa`^ab`b_hajjkhmggjbcifimddkighgfmllkinmmgigfa]bɾú{lutmrslhghiyyvqr{wpkfhhuwr¸ƾ±ƻĴɴb)&)+5+3--6/084.1403*,.300/1,535;;4@KiyggbdfdcihchmcdcffakabgffolqxxpfXZQTPQT[]\dbcffbfhfgmjiclkdffdjhggdghfihgifnhdkklhgd\][ӽ̾~xtvwsurdVXmsvllq||yvmnjlvuxyzü¼½ƽϻ£ܨ@).**>4998/-73967<0.-+(,1./.,06<=KCG\ucbhcf`di_c_^cbff`gffafbcklszzscZTSPPQUX\[c_dcg^dfhghoiihbcjhgggdcghdgkigijlkkljhkjiZ^`v~{xsgZV`vrqgn||{|z|skbwvmr}}ÿýŶv..',-3C;009046@514,1**0051*)*/5FNURWm~aad`_cikd_bdbdaibh``_fjgkkn|zoj^TXNSPWV\[fc`cb`fhgidbcdihdgibififgcfgnjdfjjjohlkfjac^bʳʼ|um^\fmccjjwzxsywic}xssuίĿ޿B-4.$(=:G.3/40831/4(5*+119.-405=CHQRkxiigicdao]agbicdabchdcilcgiozyqd\]QTRROS\W`bddidlnmhkbaihiiggjghhdfjdhhiikkimphbihgb^W_μ̶|mjhiqc[Sguytruuuloxrv}ĹںŚۙ0('0((*0?65M=731-/+,+.4049,-3/;@OXYcudf`id`d__bd_]adddhaafifjfku{zpi\ZNOPPOX[]ac_^gccfrcihggbfggfgdidhafdighhldhhnnchchb[Zbſ{tnlhmd`Wcoyunsumch|q{zu~ýϪŞ\&'(%'*)+611JB=7/-+)*5.485/-064:DMS_pffgb_^b``b[c_af][bfa_bffhjt}znk^\PNPUPTUZ`]`ciafdhdfjfhfgaobafiggfbfcdjjkljjljdidc`XZj̿~zqhpji^`bulkonpp_]z~g{~ϻ¾ٹ>&+(*&,*+63;I;51./&,,//:737.-,7ABGWdu_ailc]bbdbcdgbcdcdabdlachnw}yqfaTKQSQPVY_``d`hcbdhmhmhijdcacfggbiijbfigjkgipfbdfbc^]YfǪ~nnokfhporqmwqkadr|mzvyz{Ʒýȥߢ/$$(*('+035650915/+-33<1035-/0>GIK]pdcqndbkb_afhcg_^b_gb`^digowzzqi]YQRMTWW\`bd`cfcigfgadbhigabcchfcfcfjhghmli`fajch_][XSlʱ¿~xnyxjdqmpprsqjqlx~}p|yyϿ¾ׯr((',)0*+11415701'.'+//6;71/-37:GTRfddcih`_a_bfdd_a_c`bfkbdcdrzzypj_[SNQTVVXX```fi^fgggghfoaldhkmbifjflknogjiifocidaa_\_YyϾľ~y|t|qorinkwrj`xdzƼǢA''/'+,1*338/357G,',0,-6870.-86EIHcuaaadhaacc`_a]jb``^]c_achilry}pgd[UQPWVX_`[a`aclfgafbgagdiaggdijhdfgillcfjgfjhicb``]WVû|wzyssglklhdcpn|z̽±ժ0)*/4,6-310/:60+?B,+,/47417613?DINc}bcall_]a]a`dgcfbd_fa_djgnsu|qk]WVIOYTV]^`b_ggdggghjcfgjbdikgblbbfggcifddbggkijb]^XU[}̷Ȱ}y}wpmtphcg|}nrzz}yƵ׼b.,(&*4:)54318+0+.079456>;1-307I=IXqgfgdihcg[]bbb`fb`]bc_dlgprz|skaRTJHRSZ\\[_]agcclbhfacchfggbfdaba_ffdfgdhabghk_d]`XUWоȶ}sqpnod^gtvqv}ztŻþ̤:+)&,*,1/4581/5A6**3I6:<696/55EGGSi~bcdckdgicccblbccgahbhighnvx~xqhVQNIXQW\]^^a_dcbdjdcdbcgmabhfgfggfgjbgigighnji`b]^XU[ʷǸ|mmrnf__}z}nw~|z}pw~пõױ}x݂)%*+-,1/7876540<</65IG@87@.::/3=MYrba`ag`hfjiba`agadfdbigkhkp{}vfhWNMPTNWXX\_gab_``kdcbff_baabcckijihfff_afhjagc`^`ZVSZӿжzpopg]\o~rz|}|}yul]\`sǻ»ϟrjqu|T&'&),.3-3;:966?8=06:4DF:>315771AKfvabcdfaffhcibdaa`fdhfmlport~}oa_TNKNKQPTW_ag`f_c_cggdcidf`bkdigghdcmffgbfdbhfb`bbXQRUƸ£}qg^Wh|uly|}|yyndOHŻر|riXcpz9$**#&./378=A3/4:05//;MD7;44.38ABZnfgcgfbiihcfbc`bcdhlghlolmvx{r__VSNKJO[X]]^_dhibdckihbcc]caidgdd_bfcifhfhggcfbd_ZWTP[ʧuf\`w}jp{{}xqionqvzz}o\>͵Ǜ{a`khcas~+.#$&(/.706-407000,/1>@>748CI9>BFfkicfgfaccah`ihadiddijpomqsw}|qf^XRKJKVPVY\^g\jiffbcfffca_`_gggcjccgafffkmhgnfdc_YVWRYůƼijkdik}lm|xrs~th_honsmk^\`^mtzv{lSsf~ѪjUSUZ``jF' !##',-..,39,.8-0.-69=;549657>PXrgh_fihfg_aghihifbjggomlloqy|o`_VMGNMUTXW]\\^gdiicadcbabdchjacfaijhdgafdfgggb`d`\XPNSͷ£vgyuu}|gl|w~~pWh{}yqpsfXaaiocuj`r|oiV9AǴԷi[SVTXfgir*$%$$'$/-04576-))10195:=65.3;4<9Kb|ddijdfijaghghaigfdigiloontxyrh\ZUJFKKQY\]b]fgkdgccdjccdjchcbkfabffdchfhdh`d_faba[SSSʾŪ|}}{|}anv{||za^b|zyzzsdjZPgshYvkgdcltyqm{{X7:QϸۼzZSKZV]Zfpt^'(%)&'*/.64,035+...5;189515348>BSmhhidfgggaachggcglgdkinmlov|~}uh]RRGFJRS\]\]\dg`idchchckfnchbgjjjhdhafhlghidcbdbb^WROWʻҴrw{t~}~fpp{tqu~|_\s}|}zuvqUMOTPwvyvpc^dtml{vitpJ/5[Ͼ¬~aRNSZZf^clv~ە0""'#+()1-8/094.-6,/3558@@?18::BOawggfgddfkfhdcadigldafihhnotysi^SNFORQYVUZ[\`affglcd_djjbiahfjfghkjfjgghfgbifg_[\VPQSѾӻ¶{zu{zz~s}vi~zzwxr}ok{}|kqmsj_UP;W~{svzxkh[m}ril_ETg^BCsuc5$1ͻűqYOW[Z^]odcqzD)"((0>,.030.055-,+)/988?9:61-7;MXlgfhddchfhiidcgfflgdggljnyrz|ug^SPGGRNVRUVa]ffcambabhfigkhcgjkjbclghcdkjhfdk`c]^ZZQTSĹξ«}{tw}xvtwmoq|xzsz|~v}uttnpl`a\Y]^fO=GvxlXGDFU_skfvkZcdbZ[53:BH46WaH,"-]įɳl[\SQW_fY`bak|l+.+%%+/1016/.09.++,++557606.0338Gizgghdjddffcjp`hhopjimklkouyxrfYXNJMMSQVX[^f_^_babggaphlphcbjmpgfkchgdfidggkgfa[\XUUYҾķ|srukpywv|vbjwqv{wukhijnfUMG@=BKE4B}|xqdc^WSZxcSGIVUT[EIDS=0-896+.C4'%+IʻмwfVTZVWZZaZchirם4'%"'&&551/67+-:+*+**./8:8810-/7R[lgfkhhhkcdbikgdcgjcmkknqutzskdWMRGFPRXVV]b^jacb^hcckijghabjdibfdhgjdifgkgcf``^dYRSRþ̼{wjqvr}||r]ns}u}}tx}q_|~o_]kpgqZSRVSMG<AJJ}tjYVfiWB>STbwqVADOC@A?H9<G8-+40/0,(((,+JзϹq_^\WS[X[Z]a[fsvT))+$.*1.48/51,39+-140/:6A43+*-43Nf{jjkgghjhjgjcdkdihgmmqlnnn}ztj]VMOHNQSXTUafb^bifabffcjghlcdklhccf_hbfgfkdfgb_fb__XWOsǰ~uzlqnnsyu{|s`by~{||u}zh|vl_fhlshf\YbmodWJ[[drQF@MEKF@;Qf}h9<C\BC:56389,+/0+,/(&%$,U{ȴϴpi`^^_ZYYZ\]a\a^fy؈.,*,(*/4-/5133-.5'.7=8567;..-+)39OsggbffpmjighcggcgkgiloqruqyxwjWUTRDNOUWSYaf``cachbifcpncgadmjnfcdgihcfiifhhbhfdb[YTPgſη~qzniruqvxxo^dm{{||z{x}nht[ctz{{i\_uy{~rjckaklszl]\QNK>57>JUojA<=<bRC8.0-)/(%+/6-)*-09aɺƶvh^V^W`c_`U][V^dgjfvܬG&k(/'/.1:/95:5543:,-//:;:41.0%(/A_{ggfkgljlfjgfgko^cnhgorqusu}~wi\TOHEMTUWWY]^dj^`fkijicbd`jjbhgffcjfkjkbifgkpgcbcaZ\XS`վδo}{yxrvtrst}s`lqswzoy}t]qwnnxysky}oRMHZgn^[awz_VNUkK:F:8Cp{cG<??:E]YK--0*%&$&*II*&4gaqŹrf\^XZX^aa\[bW\]Ygkru{ݻ[.'3.1&*-4187.;67/-1,+/1=66/-,9'.;PabbjhgimloifdchbfimiilprrqyzzhXSHJMPTTVZY``_^g^bdggbbc_hgfhkindgjgdfibmllghhdc`f][UQ\Ťyyt|xvz|wv|qvw}ncu}wuzru~xdy{{kl{ncmn{{vYBVVMhcRObxs_SVIYX11HBJpqC1=JRPT>GXB;0*+1'!$(*&#&Kïκzc]\Y]XV\[[`iZ_`ca`hlsХZ.&*,*&,5494:5-0058>80,64>::3/,%'-9Wnfhghjjnrpkhgdgdafkrnmmlspw~t``SUOKQWWWR___diaddcggfdjchdimhfhgafgiihimddchfc^ga^WTUQpԻysrkww|tuq}{ukpu|z|ro|vhqpjwkopprz^gWEFO^QSRFWswtcfoiKTH=OYXn|X?BMbaRNFKMb49J+*'&%% #"&.XȻұoc^X\ZV]ZY[ZddaZ_acfdgw͝fA1&((*(*306:/64164:,5765;1?=7/)*&+0Ag{iijjkjhhkcjikbgadhpmsrsqxy~rc]TRKFMWPXZ`^ccdhcbcfigmcflcbfjjioddfiigjjfagbjcd`^^YURUnҾ~vnyv~|~xyxocmxzvvq}zxokvqau}{~sjiUMCQB?5<6DCHHVfsl]|[dd`aims@CW_jT;95/R`h1007/()!" '4aʼ»”h_Z``U\\\WZVXZ_`da`cnluvȅ>31.))'1'/6136536/,1+/.9037?7<35.+**4Xvfdhiqjhkmikii_h`dihsiqorqx}tj]TQKHRTTVY]g^c`c`ac`gf`kdkbdhkdlncfhnlbkhlaigbbgc]a\TVRbͶ}mnrttj^hs{yzux~~gqvlny}|iUQ>H<>:@:9;;>DGMang_g]ytlkpI^ss:08>-+:i{<1+.&8-! '?mǸxwѴxj_Y^]h\\a]]ZZY]idihvnq|͆9*-+(),+0306:7014.,,18*+9:58:>8:3-,15F^vkkimdknlkjfjgcc`cjipmmoqywyodbQMNNPVUOVZb_g`c`cgjkjcgigfalgkldhccbjfifdgchca___aZVSQZԾ̩|ozvtuoast{v~~xxrds}qixyxrdlgTF<;D94=;9=8;;<N`pj`lQor[Ok~kG^z@9:RF=CMj7& " %+%,4?{¾ynÿȥf_`^aaf`_]_]YU`^_hoxؤ6'+,++.5+./164918--1133(-/-54:=990/.4:Spmmnonkoklkigfhhffifqlpqqsxyrd]XSMOTNPWUZ_ad^b_]ghjgggfbighgfqfcdbgjiifhf^a`c^fgc`WUVU||{wohkkq|wzrv}}{fgjbtvibRPQOIHQRHB47;AAD<@FZqp^}pVidS9Opi_Ezzk3HJSV<-4s|;%!%"$$-IYzur{ļľ}s\a]^``_\]_[[_^^kz}ڻX+%**40+,--/7816::/-031,01553=D:;>877=Eaxponijkkjjkgicachgagmlrsqnv|taaVVUMJWQXYa]aa]cdj`cbccgaficfhdjkh_cddgngmbghbhahd^chSTTu«}l`cxtwrtu{~}pZwiidcI?@=NaRPQRD?=9<=:6<GYngavT^Z@;6B^cT_a^MOahdR1&-}(&#"!&B[ȻwwºülgbcajcY[[[^ackrg.,05313.63358564561/-**+/5:?A@CBP3/036Kn}onmooujijjdakdibhhikgompqtqh\\MGJJOXTZi[_`ddfbahf`gfachdiokhhhfacjgnidabfiifigdbaVORb|fbkvzs{xu}yoH|gfSOZB=>JIfdUV]G580.5905@Nnx^v~_jO9.6?5K[jpSNRS`oRA7"//wn%$%  "*_ƴuwĿ}^X{zkgdgcY`]blvyֱa6()-//6.1.084597=443+,3+,,,/5155.<JP16FWxkkmnksknlofahiijkifkjiomqr~vgaYWIGQKS\U]^`cbbg]chcbfgcidhhjidkfjgdcakdhggffcghhc\ZYPPVԽ̭|ucqyvvp|syzx}iNzlZaWP>3CKXfml^G@8=535776,;MbanjcN3.*400]uzC:Q]pg\?7="+/I+* $5\¤|}ɾǽ¥smkfaxqfackdiq{նW3/)(+4/4-:/6;@=76<?/+0*.0--.7?FJ>5=<4=>Vlnnnlopnkljkinimfmfkhjkomswzuo]YQOPMRYVVX^Wb]cd`_ddhcimb]ichicnfablgffoiffhghdhgfa^[TPOtٷ̹tzwqd]sz|{xdsz~|}xynYsg\UU=75;Mcsu_DCD796;-/9>3*;gxvyiO*,+-5/D|W:@Tm}a=+&-#$KBX/$<lĨ~ľľij\Nfprd|qqv~~׮V.-)+-/-10./90;743::=3353,(*.16;>EM:9185;[trrninoomhlkmpmnaifldgmjotu~wm\YQJNMPSVXV]]d^a_b_fahk`ff_kdkdddhjdhhdjiiihmkjflfg`_^XROgȦt~ypoho}zyqs~{sN~gf`SE9;7;NtwcQ5133967:0/9>4.Oyzw|j`U/1;+'-Cu`AH\ajbP-,%'$,b~ak,)Dvý½ǽnTJRjrplxշZ-+(-0*)6/466D;7::3896/.803+**,6A<7750761Dirsmiimjipmmlmhichjjfioimuw{rh_WPHMKNRWUVW[`adgicfcdmcfkidhgddddigidcdccchfighikif`^XWRSԽԻ}mtoxw~vgo~zzyv|wUyt^WI@88:IiqtU;410/,4;>8+358+.a|o~pXP/13:0,CtnS?MY[`S4$"11&'qnCo5J}|yÿȶXFlcSQ_tppo~ܾc0&()/%-0446=::D88>6360-47149/549>3..(.676\qqqpkgvkiojcllklbgibjihlnuuuvm]ZRIKPMWSX[_bc_cbbcfd`hhnbflfgkhlhaiig`h`abcciijglfgf\USRYqѾƨ~{|oluzuvwkdvx~~y~|{lr|bn}YE<<>:>OlrU;</33/5-8@0+-1100?gXch`665989Dn}\J?RdbG1%"+1*$1W,K\~ĿĿſc96F_kh][gqi`uw7%')%-.01.7:7?7:465.391-18+463718<8/*+/14Eh{sropnllilhponiggimiqkhonqqxsj[VQFIPO[Z[X^bacgd^facffifiggflifkhdj`ddfchh`dghkglgmc]YUTSfŨxhbmuzjgg{w}wtx}yd[\q|v[YucF@C;A:WljU65:5,).8<F8+''5:06fyhASYE/--5<Irk^NP\mB&'%1M-#-6I1g|xĽȦ`_E/3=m~yscc|ocl{:/),-&+)-.53593:?:/49>95/10-171348633(0@33Slopornmklmkpgmqajidcljkmqoxvvp^]WHGQOU[Z\]bZ^cafh`]cahhhfiikifjgidglglhcfbkjifhiigb`bWWV_ƻΰl_kp~odfv|}|}~~|zzytg\RUyt]Y[A6IUCBUgXF;7CE1.//?GH3,#,6;/Hx~P6OK441/9Msxl^`lk[("$3dU !JObz¼Żȼ~C:RdA5Ffziiu~lfu/*%()'$,01681774:;?8:>9:4,.+..*/6>9:@84+95;[snmnorknklpmingdlhmkmgijnnv}wn]^NGJTNV\V[``_ac[faaiaifbkbdbjcbiabg`cijfbhfkhjiifhnf`\^VRYͽʸqciy|ju}y~~||zzw|rhTN\{~x]XC<?ARZYWOCCAC:8</0@RQ0'%$*.7Jjox_==?8+463:guSP^~|t_4#(*c{K"_u~~Ƚúøũ]34?\j`@CZxjx}{i{ɂ.())%*+.0-11319<04<8567863--/.1433:535-4/85Mj{ppnrnmoljilkihhkdmdokgikpqx{m]ZPIMMNT\[]cb_bcagajf_dgdcddhilbaac`ajdghidgjlhoppkjdi`^[VXlκkfjs~oq}{{}|w|ooZYRhsqQ=:DADGOYKFQ@;<=<6;>TS9/)+)(66bgPpH,1=9F:5?h|hMBb|xhE+,-Zz#!0|{z|¿G/#+Iavt_>J{}mnzhn‡='&,;)-/5/0519776=8860396670+,/:-559<04<4=5?[mkkmlkomolljklhhikgjihgqgiqvyyh`TICODSTVV_Z_[a^a`cafa_``babimngcafcb_hadd`inmnoookgkhdac\\[zçmf\dy|{}zjd~~x|~utzsmlbvs_RPKUQMKIEBMXaVRPAAB:34?_gM.(%((->?iJcv?/8=6<=8PdMEWs{`VG-'4OT (H~rzŽ[90//;bpvkO?atn~xsǠd;.%')+++0.105755476;55<6@9-3...+6+875443/.94Jdtnnomnlmlpjkjhfifohhggqinnowyn]WQJDJHSST[`]]a^bdgc``gdfjbfchffhcddffhhgbdghijjqjinjjcf^Y]Wcűq\\l~xmgo~~~|~|v}w|sY?9K``IFER^ZUHFPgjUHAGB@.-4;a|f/*(%&)(JPr>d[//,.,,-5BcUMFWYbaT?('O+ .sxx¿ɼwXPJH<39JnqxqUIgmx~so=4++8#&(*+-/138:76678<==?6:33683.-/54518044;8<Wh|onrnmpuqpklklhhhndghlikafuw|{j_VKBFNK[WZ[\\\[`aa^]cff^bhda`fdadgmbcbchdgcikonklqopinkhb`ZW\Ưķxbdmxotx|~~|||}ufQ:56?D?PUVUBHPZYfZIE@D?,%)/WvnC*)))-+1T[p7_H*+'0/9=>Z_SH5@Jhl=4(/ip" +Hu}|¾Ľt]UJS_Y@GVkryjbRyqhxմj7'+.(%!%+3.-.43557:A>85GE96C93171-115:3:;6333CGYpyyornsshqmonqmhhdfdghhjigsw||k^QRNFKORXWV_bbhcc``lddcgcfddcb]afhmhbfdhlffiioglikqkliikdb]XYcɾƫohq|yrot}}~~~z}w~yrn_jhm^YPIAAEXIMGCDc]QJF?>?8/+.3>cw8*&&,',5Vcc0i:,016?SMAAD4//:Zn`+(&8:$+Hn}cq|ƿ{`PJ_laT?ImjjihNrs{pkΠa6)*++09**,./4611.046=9?;:F7330.7+.*-*15694414BBM[tkkqqqrsmvmtonnkgdfggjgjdjow{zgZZPNMHPSVVW\_\ac_``giihkddhgddf`dam_d`ifgfchjjkonpqnijjggfbYXYoƽƷxl}nnzz}}{}kmlnnyxomr^[VVWOE>>DYf]K<D006--+.Davo+#$%++*;Tdi1`/-,@==87<67-3(AixQ($$Dq&A^iyxdk½ƿĿõjTNK[rqTP\cabdZ^uyzmhƔM8,,,8)4&-(../049437.<:86A8;16+-.;1+-/,7493;36DFETk{ononmortmnmiogliicffda_gdos|yiYTMMKNRXXZQXZ]^```da`ggdghlbafbgjfffdbaghdhkkpmllomiqrmjikfa\V[o|yvsu}~z~uw~{{{}{vvhjki\_XC;@GT]]R<80,*&($1EC]qm.+*%*1/6Zfa3i0+.;?:14>=8843@r|C.#-N\EtUgvftþŸ|cWOHMsygOUhd[h\uxpjʾB.-(+,/,+1'+33579;9843<78<A8:33.1+*140.0;=8?44;JGF]v}rrrnpnjsmhmkmjjigihi_hahgitw{n\TKHJJPRUX[W^_``]Zigfbfdcdfbgcighfcabcfijbjngnlknplnmlmijdbd^WWgпm`xyxzw~~x~xqsy}yabhg[RN@IHZfaaX@<-/(')*,HEjuQ+'1*11*/YN\>[:'-.>=4,1<8+*)@ttE+&8shrDZsvƿľs`_R>Fpn_mk]c|j|w|ĢvE1,1)%.+.1*,5609:9=;7443?5898<54401.8/--61;<3;6=FJSgw|rrrqpqoqmiikklkiligkdfbhcjpv}ym[TMNFMOSOSZZ[__b\aggfahfgfbdbgihhhkifgh_mjjmmlnorpnmlsoonjffc]S]w;¬{[lxx|}}syz~~~}}smTIMPY[QHOKKVUj`ljD<63/,,)')4HoB'%'&8;CCJA@AM=40HO@=458?/1/QtYM3,Om|pHl¼Ž~j`b\HGuztmqjsp~|г\8...3/+,,00+-357;;5734607;5=:59;0/.133,.3;8;;0.:>=M^r|ppoosnmpmimnnkjhdfhifabdcmrw}vm^VOHIMPUUV^VZ[^^^cfgh`__bdd^dbhjdcihhmkiggijlinnopoptrosrjlj`Y[X_ġtlxty|nz~|~w|vuiawzuiZG@F`\KCT[Va\cckUG853.4.+%1;U|pt8#$)-4`f,<8==79;B>PZ^TWS\Q;1`|XIH5c|_~nW|¾ý½½ƿsd\\`NKxoog`__~ȸm=46*3/-//.,+**097>5<=:6904:666;933,1,,050/4589758=?DKdy{qonqproqilnjhkhhgfnfcfbc`kms}}j][PNIIGTRUUX_Z`f`^lbgddicgcghdddcafchjffhjhnnminprottsrnpmlk`_Z\Vxȟqz}u{tz}vvor{z~~yrrty|}~|xruoih\_TI@ISNIV^[P]hdh\AE;7<;8+)34?]rcqC(/3D7Y^+/41057A?BR_[f`bf]VQd|\SQMGxXdlozƿ½ƿúj^]]UEN}oP_HV@m\C61,)*+.1//60,*.65;9:D:;88B<;8<;77;/)'+.5-095?6038EKESq{{ooopouplllihpknkikh`caabadluxg\SOGDGNROXV_\Z]`ab`dadbaffbdfhdjgdcdfhhddfnmqkpmoyrpvpnpqlpdhc]\Ygʠ}wyx{uhiqvys{unitsrq^DA=DSWOFK[^JPbldhJEG9A6D93*+9DTYKjH+/8;DnH,.3784/53C:=AKC>6H;?Xn<MOCAroVYg}nugZZ[S>Bk\UXVHCqU7),,-(,0-*15454/11;;6:4988=:?<;?;1.+++/11437467-+4@CO]nrrpruoqqimkkkmklijdhfda`bbnvxndUPCGNITXXWX]`[]]^gad_hfcf_dcabfhggig`gfhfjlljrnqopuvtrsqqpllb`\W^ȡ~}|x|wrgoy|~{rpototw|ulYFBCGOA@=IUTDK_gY`IHK?;96140.@EKZTgS3AIIHJ/,0./14434:1.3:=>,--0Dc9OOAFphG`zɸ~laWUUG08XVV^B]vu\<)*&**06.*0-,017376:9<?>69=@8:8:;6/-(+73074=31839??KUh}popnppknlnokiigmhbcff_^a`hns{{q^WQGHJKPQSPU[_^Zcf`cgbg`dcbicc`dbgfligfhgijhmlsoltqqxrtmogqffhbbZ\ǩx||limtxwupmw}}`_xq\RJCWI=<7=IICDZ_b]JJG:701.1-=DHCHBabD[QE3,*07.3..//1437301-)&%,=Y=CN^N`\:T}x|yȽsg]NCSA->}}YfZGByp];(%++./.'-.0,580:79=;<><687:9?7:4/+0')/35;<7;330:DCNdq|{mnutsmokllomjkciljcid^]c^`lu|}ocVJECKJVQZ[U_\YZ_dicdifdcfaghcb_afbcfcggighhmkmpmovoww~n{psnlgbZZbı|vcbmxwyyxwsu`Q|~u[BBD?IH>:;9<9B[dQWSEE?G3/886AGQE6A`j`[bO448/..01//45395/3*34'+)8SHTnpVV\9Okny}ȿxjg`OMK:*@r]`VS8axlV;3*%).+**.,1.69=9;6:7;==@::8=741/8//+'+135;54330AEDRf|~{znnmplmnmokinniijhjhif`^\Yhmrxzq`SOFGNRWMSVW`caa_fdkhifgjkigkbdccdchfahikjhjnnklptxwtpsptntllicXY\ż{~~~pos~}}{}toyzg]|zxqghYERHC@=8<?/.9?ZgFUHEJPVB:@66<IX>(6jnsk[J*')-05130510.7>4,-0.-+,Ba\k|kYYaB^»~gajYD>@,'>nX_QECvylM553,(++')01.5:@@;:888=;C>;A:FB9608)6$*0//09441-:8?I\r~|qpnlrmknnkmljhjfckhcg_^[[iitzn]QPGFKPTPRVV\`^[]_hgfgchj^ffiickjfigfagfimgmmngkrwtwtvsqroqqpfb^^XĨ{t{z{{{u}z~xvxux|ys`^un\ZXKMTPN?@=40*+:<HOJQDBFGXTH?='7NU9&7t^}|b[4*--/</-.11831<0)+-*(*,Dbpp[W[dRvþļn_gQTB:3(1ZnfMQPkzc=0-0&-*'),-./-3;::9;889>9:K=C<63.04/-+-,)1.:34.897IKfx{~rsrlpnkoiimllmfbhfchd\\_`gls{oaQMIGQNSR[Y[ab\[ccd_chgajdgigbfgcfi_acaggjiilrknpuuwruvqvsmnijdc]\Ëwrnx}vv}~zljpy|ni[Rjf`RJ?FY]RD56.0//,37>KWSGXFIXbO?:&:MRA)-`\pa7*./5-11361-*35,0"(-'8>VrzYKV`piþſvf\SPI91-(7pfXIYO`?5-5'-,**3-5/4.1@;79==::=5=D9:8446G/0)-),34:53.00<NZq{nnhoiklpomrlpkdfhfgb``Z\_`ovy{qbTQJICQSUZZ``_^`ghfhhffgmhgnfkfhdgihgbgacghjkmntxquuvtyuqomollf`[\ìzninyxx}x|ytlkj|}pbYEMVF506Mk[JC/55**1,/54HfM>GE\X^\G+.9IT9%0=]ztO*,,1.3;1,***,.(,$$$(7^ms~oRRbsýÿ~hbTK>:/1,5QbWOVItuT76--.+0.030010657>87G398;==<6=>3.4/,3,*/18968,,309Vdxooqklhqpqootiljikbigc^c^\ajrzn^VRJJNKNZ[Wbc_a`hhgjchkhkmgigffldjgingigjjmmmjpnrrxxy{vutsvklsga[^зxjgtz}zx~}}~smhuwzxz{`E76>;0-9QaM87,.53*4/558Kd\K@GIVWc=+/8KYE)'/Izxf;+*-//136+0,.%##%'*9czqy`P^{~¾ſxl_UVF1043-8PVRJK`cI.<7/.833/71,/36658>??;=?ICCA@A961+0)54*1/:613)-5:=\m|mlspllnmknlkmlpdcigcd[\^[`fmxsr`TQJMOIOTWRa^da_i_ffdfddaldfdidlbhhccjfjjfknqjlptvxxxvzuwqvqopfc^^}ٯ|ghdnv}|suv{|{rnt{|}|zU/'+3=6->WS@;3-,/0170/+0@ZbZD<CYZcP,(0BZR(,,<^k^G?8/.*/+*'+$"#%*&0c~mmc_z{ýɾzo^[YD6+0-**F[WSCT\:49=69.-,4,,540=:<6<:8>;=DH><E<75/53--)08/600,,38<E]o}jknojlmqisnjqfjcfccic^`][^gy||rcXOQEOQOTWY[]gbcaahfiklhblmihfffdjgckiiaigosnpkrqstxussvvtuqpogfaas̑uillmtzwwswty~|vvtuz{zv{|w`6.')/>6F]IB510,.1/34:/05G_RV;@NR\N>-/<gW%$+93Wuolbb_K7%$%,%"&%&!4^z]Vjz{¼ý·paYWJ5-*1(&7]UO>KY7/4.*)3-1/041543;8?6C;8;C?@A>@=-5/+..-.1/:50.1107ATk{noomnrlqiofhjgiihihddda^_inp|ykfYVMEONPUUSZbi`^hhahdigcijjklljcfhcfdhmmqjinjnqtrqqsttxvuurpsrkhabhִ}pkkomjmtwuy{uzrlkt~~riwsw~|lZ1+',8@^a8.0,,6*,+,/1/-8DNWSR=AJYWF9);lV%$-:,<ggYThrfZ5&")$# #)0Sjah~ƽŻpi__N6(&03-3SVPBGv|N51///6-*,.5-7115449;48<DA:@A=69/08.3/*0+647/84<99JZuhhpnprkmlkcljhgiikjg`f]__hmw{jhQJJKHVUUVX^`^^_dbd`kfkkihigmoifcjfffghkllklnlprpswqw|{{stqtspnakfgҟponlnollnt{yv{}zqyoZ{~vuuw}srylJ-(,.?ZcY-/(0(+087.+41-34:MYQG=BINEC3Gf\,->?-4TZ4?BMC?/)($$$"*Xwql|ƾøµwm]\P?0'+/0.DKWO?jP.-053+,04.4-4593787<4B<?9BAGI=60,-,303.04?3+.-18@Qbzijkhhnglmmlfjhnchkgkgd_[]djr{~rnXTKHDRPRWUY^d]c_jihdbkbdijckdilggjjhihininjkkornntsw{{}vusstqomgab{Ўpltturwnmuytqrztx}y[iwvrusjXZSZ@0/45TbcQ4,+*(.39403=437.5:VWJJFEECE<BdZ,.A@9>Z])(,,,*%%*#"&Mtowŭ»¼»~occUA.*',.08DNKAZzP4+300+*4:3..666:<B7=8:89:AD@8/50-/)-))./95/-//8;FRumlmkmlokoklnkkkkgfijcic^_hot{{pdTTEEIQSTTY^^b`^^ffblfgbdjdijnhihmhhihjgimlklhmnuoswywtvtxuttnifao†vqrswuuwrrzwopfs|{r\Zf]bQOC;CEDF66//WdfA.+(-+.6=//9@331635BTNNB@E;CPH\R*,N=7-[a(*'%/($$"'CxulxƵƽĵ»pf_UH3'#'.01AGPH?xP/0439//3DF9:B97:;678:=?BF:AD<715,30,3444<93(.,68Pcygggqlhqkohmlnjjffcfdca^^]\grz~wd\TPKRTNSTXXbc`cfdjlmgphfmpmflggjjkijhmiilkidgkrptyv{suzvrtqkidck޽~uynux{yxuqskdn~{qglSCA>IYSUKOQ__]E</9Vm_6.++.&.BE9-D;4-.6-0==CN=;C76KX_S39d<,-Bst-/*$''"#!" &8txkvƹ¼¾|jd\I;1'(''-;HOT:XU1:=9;0<+7546B9777=4>:9>CCAB?550.0013168::9:-+/39Sn}igjrqnigrknpillgifgfhbg^bbisy{qi\WJHOORPWWZ^Z\agfclmfinjjopinohhjmdgjhdidhjmnpvrrwywzrwxosooqiflܬxyvnxy{yxvkihnbN_]ST=I_\R;9:RVI6,.7kqM6.+*-/8HI<=><+-/0/>736E@D;86F^ci=Dn9-16S9*.+'&!%"!$6o|omſ¾ǹ~qfZO93/.+(++8IUADi<5BA84,6>803=89:;:8;==AF>FE@9:6.,,+16398A91+/+.<Utllojjlillhihjgjgmgdhb`b`\cmmzzsdZSKHTJPRXS\`\`_bhfjlldnljkmgnogmfghmchhhgdkjt|pswr}xxutwuxrtrjonsݩwqyuvz||wqgdvz~~vo~okcMJSVF0/5A8/+,->mrO/4-,+1?IA46=755398E/-/=@A;43:Qgql`~A9.3>H&%(#$)$*,fxv«ƽsdTP<>4-(((,19OH-{pC555:/+0.4644:=;>@;=G;>DD?>:74/.00-401;6683+*./Gbxonmpkpnogljjngkfhgjbcd`^_fgv{{rj^UIOQHUPW\\c`g`glgijhlnnkqmklmfljdgjhkidhgip|uvs|}vtxxuwzxxzuquhu޳|rzvvy|z}~xhl|~~xstlgX[G5/.04,3%17:nqD(**//BOH;-7?1,474D79*/8D>9:63AdvnzSA+87l[+!& %$%8`z¼wfVQ>61+#$**68OU3kvN911;>01486669::8<><>?ADIA@6955.,+15.:9=7:+,++7Nf}kkptoklonjijhlkjghkhdb_^]bkuztph]VKGJVXVXXac_amiigkkjkllpnphmllhkfhgjcfkliksvvtvyuwuvv{wwzxwxsrqqpxÃsuyzrutxxxwv{znkooc]W:7778;(*&/:5]mC')(10IS@1:CD+*-9698+-.<I=.;:5IKknt}\O==.amB% !'.]vưĺijwlYTI9/&" $+.3M]>NkI8>58K</5<549=7>=??;:?>CE>>>1/6-+0.1164:77*+37?]nnokpookhikjbihmcdcggd^a\[fns{pi\WPJOWVXY[^^agbkmjmimmhjrhjikhfjhgggdgknhmqp|pvsw{vz~{yyxzswyzzvrnjtђu{zvurjrv{{zvmlkhW@A:8986D.)((.),ZrA(,0);AA079D5-059?9343/G?1.3=OYK[_Gjj`VV@ls7#"*U|vȾƶŶyhX[H=.*%$#)'4D[GAh];;346E;9>=459:>;;@?@E@DDD:?63.5-3/1568701,04;Tczkjnlnjmkjigbhhfghhfa]]^_niklytvc]UPRUZXVXX_gifgikgigglhjihjjjlhhindiijnkkmnqx{uxvvzwwz|wz~yyxxxxsumnx֝{~{yvvnmu}~}xojfhbK/3305BRA,(&-**1QsK/48:@5/-7?H1.494:D338=J?7'%.Im]Qg>O\b`XYya(!*H|||Ž½ʽƺka[Q@6-(#**)3<XR9f]B;8<+,.8;>3>76CC7B@==D@FE<;1-,/14.1437:3,+(0:Vvoonplopoiidcibmnadj\baa`cchpw~qc\XPVRW^\Z__`_f_gjdijjkimciiikndliohfpgionhqtt{yvywquzz}z||yx|wz{xwwrrr٤{{xsyqm{|ldbkcP;==01CW_0&(*$.*0Gm[6HOQ7,-0<E3310996841;KN<:''-:o^>jFDUI856RT+!"C|}t{ÿŻôʿmf`S@8-(#((+)4Ja8igsQ-04/.55;B9=6<;??@:8?GF=@8870,.5741999>:/+.6Ni~mlkollniijdfjhhddc_a__aY]_kpyypfZTMQQUUZcc_chb_cdfijgkifojmjlofkgmhmikmmkiqpzqsuts|y|}z}{z||yvvvtu᱄{}vrgz|~{|{`^_YC0815:W`^Q,+),,**,5^qPB>?60ABKM3/,49H03-1?UA::0)-9kd.NTNJ0(#%.rl0"7l|uǹ¿ð|p]PM:/*,)-/.,=[;TaxU//631788:;=;8<8<@<<?<>M>>E744/31679;831.065Uqllmojmnkighijbjdbabfaba]YZgpw{qh]SNPTNV^_[_`ffbjfjgiihgjkikkoonhklfikkjhllkouywyxuw}{}|zyzzvu{{{zڰumkurnSI/.1?5,Vu_l:'$*)/*+,8Jpc=3-015Q^H7.,79<../5MW04=)0.5UY+5OUC,($!+HK!-j~{¿ɽî|ja]Q@301*)*+4:XEJ^u@/)36979>86<<B:=86>8:AC;;43:50,0-4<:973+1-/=Vxhiqklkncgohjkdof`d__\a[[Z_csylc[NNPQRUYc]``bacahfiipjjjliljmnhnlphkofmmmqomqyqszyy~{~z||||z~{}|xtz}{|}xlsqa`E5-3C:*'DRik5-)&99(*+-6MmM9$4/@YP76.=6/<+1+8\N4?Q/391/E.5QWA##  '5w]3Xs{}{žȷidZQE:,.1'+%.3W`?`r?4090&18:9>7C@EB<<;>?A>5;6:7/530.77654/(++4Hdyklhlllgjgkjfggibhfga]aaX\^ns}xnhWOKNON[Z^`\fff`llgihkifnknkmqngijllimmjlkprnswy|qzuv{xx}{|~|~y~uw{rzcWJ4-:MF4((-AqH4*(4F5(0-(+7Mb</*<X[K;/,091;+-,>bC+G`6-:(-0@8Rh@%"!!-Slavxs~wƼ̺t`cZQ@51).+((1IdDnm\C5E>4->74>::;<C=C?=?>@=:9.1486404<985-,+17E^wihjnglfigkkidjg_di`hca]]\chrxznaXXTNPQU\Z\`bcb`cgljhklhmiignlqiiljfkijjnqqnpstww|xuuutvquoxsqutnik|urutxt~pc[O:1/G[:,#%'GzB:+(MW43?+'&*6UJ@;]fV?4')*1:9+*)Aj;)<]373&(4H6Q~V!!#!3fknx¿̿xhg[R?4,-+'**1IjSlr\J3F:-*/9@B:<>A<:BCCBAJA:703613::589<8-,+5HOp|ihmnhjknniggijddhjmdf^]\_dfp{xjcYTOTPUVUV[babcbjkcimlfjojlkmsolopiiikmmnopnowpvzz|xvrqvpsqpripngikv|Y_Y~kmwvf^PJ0*.Y]0)"($RF1,<f5*);)'&).8@QglgA89)*0;=0,-.Tg.&.M>@:*36/.gd*!"*?pvrŴ¹ľdzyi^\TB5*&&+*+39_K\[Y.:>0/,1;:65?:9?F@CBDB=:10+,4145:5945.*.5<Wu~jjipjgnnkgfnhibbdabkba^^Ydhn}~{oiZRMOJRWYVVX`caflghgkkfkmnmnkjkpmgjjhkpkopmooruux}{z~}zzxyxzwuuru{yu\^Xc}{ct}|pjZG-,?f]-('#&RUB0BR-$49?05/0:DoliH8=+&",;8-&)8\i*&+IU[:BF/)?{uC1$!!4Vuypfożκ{jdfPF5,((+))/8_I[i[00;15>:>7<;5<@<?EHB>=A964/46414766;0-+63E\zkkjrliimfijajiadgcdli`Z^]_ikzwkc[WRIOTUZ_V[c`bfhghhklichpfmmlkkflmmjnojnnoprqrtv||{|{}}|y|y||~{|PNfvkv~|{xslX=/4`rP(&#$(Y]AA85&)@,<A>>4IruD;H76&(/-=:*')9oO(*-?``<==),ay@)-)%!*,J|yi_i|·þþϻ|gc^XB6,'*+,'/6TKP}c^87C4;<@K>>A@=>=<GFDC;>:83/1:4/079704--.6Nl~jikkkjkkkggdfg`dcdccd]\Y\`hlxvriYRKKNRPUY\^]f`hhfliklidkkjhklmmnkllhmlkomotvrvouzuxy}}~y~{z|}yy|dszr}yuu~yoX:06D[}O+%#&-N_TG(*+68$6JOERm{YJRI83'*/):@0'*Fv5+(+Bav@7+.B<*%-7."#@zmZ\t¿͸ocXQ=5''()/-59WQIzp]9:M58=BK@7<EA=<E>?CCA8/145C64848:5-5+,8CVn~hijqhdgbkchdicdc__daab`\\ail{zphTWRIQSRUZZabbafjkdlbchlfqlmnligjkkmklhkkpoovruwuw|xt|{w|z}}}}}v{{zɛyyx|z~wzp^=.1<A]{B$' %.Qcg8&#&9%)0:HWjqYRYE@1---.3?;4,,Is0'*(9hy>*'-aj+,1:4(%/hwa[lþμncVJ>10(&(+-)7FF<|yQJCK8A?UMFD34;=BC>EA@=7331650@59C::3.*7>Mcxballiigjjbdilfghfdlfa`a\_^mmrzpcYUMJORRVW[a]cahihghknikmrkilgihgkinfffijmmotvwuuuyzvu|zz|{z\r{|xv|kC..9VMmu-"(%-/Jk]*#)05*+4B]cbSEG<<3,(.*+,679*1]\.#&'>mg?&%<mB.6A9/0+[d_gɶohk~;jXA<9.+)*)(+*/BT4qSDOJ85AAB<=8A<9BH;H?9:345/5=0096:90-+/5CWlymmlirhfmgddjdcdii`cc``_bYbkmuymaXVKIVVVYZUZ\`dccdhkgnpjlmhljmmjjglinhnqlnmtutsxr{{}xy}{z|y|{x:5@EEQ]fy}upua6/5PaI{Z#$*%0;^n;%(#3937JOIA=4@E-)-(&*)-433<40YI%%',Vip=$%MqBGR=(",Gx^h¾rPJUjyr}~ĺ~hI?8513+)*).'.I\.acDED97BB=GMC@B?GEPV@@9:01-863869A:0.336HZvjlhdjgjiiachhhhdgfihi_d[\]anx{og[TSFNUT[Z]dd]ccgklmmmjhdkd]kihhlhajfkllqnoppyvzyyyz|}zy}{|z~ūH%'&&'(,@r~qmwu`WG/?AdH\qA&%%,6Ryv,$$(?54;A=73/05B4*1++,6./7641-I9+*)1iYp;+4_]85.*%<}|bhuRFIX\`inrkx}´sUC=913,'&'#',0Bb.S`B:7@BG;:7;??<>IMIHJ?7455/53311854304,4Jawffjjifkdihifghkijgfcc_c^^ailxof[[JMURX[ZW[]\^cdjjinlkomlqilhknldicknhjogkmpxsws}~vzzz{}y}{{ҒsxX:&""'&*&KtmixoR:18B\kBob)#),(;an! ',D,-/:54<,58<1+0+-7<9/3:97/MH0,+:bMo@/5cD,&"$,qg`pɱôư}XWZ[cdcjg^dkhhYjrx~ϺtiNA=8.,&))()+,0Hb:Aû|U575=IOE17D:;D@GGG=;/7/41344987;7/+46>Vh}ggkgihhihlkhmdghljidf`__b_gkz}paYTMPKQ\VZU[_^hadhbdlijmjkmnklckmgmjmmllnmqqqquy{||zyz~~|}}|o`677-)).();dÀznXToZI406>_F\K*(3*-Ict#"*)60(110;9:6@M:5*108;/,'0KGR]U4??6Y5kQ'0_8(&!+Op_hŴïȥzjlqz||{xpjckh^VPZX`kovȿxdbI?:736+(())(&3C_87];<->>ME@<@<<ABO@D777/0/3709;39663,,5DXnfgjfjihhlhjknigdhhhgaaa^[]fkvxnbVSMQSSR\YX[did`gkjjjlimiimjlqpnkkklllhcknlmnrw}wxz}y}}}~ڵi5860.')3=X„s\KFWQB95ACdJ},).(*?\h|v("%,6%+67>[E5=6IH;0,-<904+10-DckQH4?c/_V&.W3!'%$@yr^cͼ|z~}yroh^TAAGIMP\ot~Ŀô~smaYE@<:0,(*((,*,1>R84±b3<05<GO9;EC<@A>=:5:<38-;:517>>631,4/Hcphhmmgmkfjijdlgfiggcjf`b]X^_qxzqaVVNINRXWXV_adaabbiisjgkggghmlikhjojjfjlmmpjtswyvwu|y{vsKM=@.'(*0YyqZC@[VD??8X_]I-)/%6Z\^Ys*""))%+=PDQO=7+=RJ70,?-)((+'*.Kqc4*Qg*K^,9R+!/<rig}Ʒ÷~yl^NE<H??GN[auukhbc^SJHA?F:5)(-(,+01<E<.|Įf6>.;9<KAJE>=HB@><95:=53--31<?89683-:Oazonjpjokjlkcfghknjhj^f``aZbcmxrgZPMOOWS[`[]]f`bbcigrkgpilggifbkilhfkjghijnrsputwzqz{y~{aG81/%(-1Sr_drbB?JbZ@89C_RqW/1/8.FdaX>/#&()(5PAD;-BU+6NW6+7@,)$,(!'+6Si\>lf&6`<0C#*&*Twivŭ̻øz}pc`UHPDCA;HR\lºvo[SVDNXZ]b[YYZI70.3.-+10:B</yyC?797<Q?ERGDDIC?97-.64404-/5;<:3393<Rplljmjgjhlnklmdggmihhcbba]]cjqn`UTQXXUVU[ZbX`fgghflpniljlkhdgfi`hjgojgjkprpqntsvyyw|wzyJB;1,#(*'Ul][_fK?O_U<6EbbT\71++(Fb`lA1A!(%/5GdOI>8?hHA^_E(8<**)+($)$.5RbjzW%.^Z0+"&;yrlʴƱʱx{~wcgYWJJF@ACQ_~rc[\YQ[TXWqtzsmmpfWA5/7*.'&,3HB0}yG@?646YDAFC>FE>>961-8418606:7E;890:=Yskkgginggmkqikhfjkdhfgf_^Z^cjx}k`VRPRYVSYXWa_hdchchimonflkgijjfj`gligillnjlopunqmsuu{vD13?>B,#+ThUUQulRJM<>AHkab>3-347`vbS(+r`+$*4&4I=A90+,6:^`f>93%%%*))'*13\VcU%+K_("!1fvʾ®ǥss~x`m]bXXRNQIRQb{ĺzdX[VdbZpjvj}ttibX@<97,+()+.CF4nwZ>95;8HV:?>??EE?9=5-040381<:;9:=:47C`ughjhlklijpoqjmllihbghaUY]\cnw|uk\QQQSVWZ^^agbdcgiyokkigkjijhjhd\affcfhrdmiimnnlquvwtw`N<bxvD+&IzaS:Y\A5?57JRmgn=5958Q~pU0$4V:)%,*7NA:,)(1(;YjiP7)$"-,++0)(+57EpqB-3/#!"Kvƽěpsu}xR~tz_rjni`Z`]T]_grzǿr^Y]bkxplw}~q~vfhd^NA9;:*+*3)6FD*iw^;3508CO3;E>@K@G57;//D76>7176>889@?Ml}ggmgjlhmnphnkoffjfhbf[]ZUYaovuf[SPIJYU[[]]kaafklmikhgikighiihkghllflggghliqsqirqpuu}|YpiSIkzY=]U93,5<IVp|iIDAFM\g9$%'AtE01*+=WS6(&**13Xhm\.(*)%),1/))+)1.9Vc@)"&""7vq{ʮóѾhgqtuv|x{|xr[5]yd{^\vvumirg`hfkq~¿úspmknu{}firlvzspcTRVUI??Q;-90,*4GN,`t]S8167:O7;D>AIC;51:13540474;79.5;@GUugghmklkmnmcpjkihkjd_a\X_[^flx}tc^SMOOQWVT[]\`jfdmhjmhfmmljhlmgidcoiighknjnmqnmqropxwʹ||~myr>8=@)5<IPT]~t?HEPJSiwd,##$8^nZ.-3+1^Z70,&$$3Pkng5),%)(+35/.'-+&).>W(#.fxkoȷԹyXiclqojabfjjnpnZ@0GsUGitKlqobyxsqutkr|~~sr{tbGZOF]bX`QNPTME@CP:+*'..;DO.hµrgb/.049a=@FBCA<>46-..69896::61/46@Ja|bchfhgkqloipfjibhgdaa^XZV]bkw|mhWSRMPR_XWWZ`ia_dhhimdjjiggcdlcfglngadgimifhnklmtv}ûjYUX_J<->C*)4DTYi}I,MZUY@h|c&!$#3VUq11..>Ua31.(%)5@abpZ6&1,++/,5*/+++/((F@$BomνǼҵiWXcfchkhcNNKETJS<809TmbO0/FFCYs~Zi{~zwyy|}ž|]T[K999;<BJBBHAGOHDFKC0/,%'/8JN/_xskZ1308=W>?ECE>:706/6/3/9158=81,,6@[pmlnjnifqhighhgginf_aa`WZT\ahxrlYOJKKOPWX\X^cckghghgjmmiihghhkihddaabgchhlfnlr{S4E;0/-01>Z_:MOT_vd1-AK\XNkyR)#!"7`AlB)*.8]`-)''%+/1D`xc<+*-/3.*1-/5*1'%$)@!")s|irխaTUR`[PFH[WBBD@9=:74,57>990,031:W~id|}|~»jqcI<;8546356;:>>B@IIDBHQ5)-1*%,.JU+YuzwWF640=`C:>G=:9460440444/5366,(+7=UsffkgiiifjhfkddgjjhcbdW\XUV`nztjXSTVKMPQVY\_`__fghlgikmilkhhjddh`ahmkgbibffhum~Q-3,)")%)?;OKTZYpzI5=DToSOowN,,*,;d:TZ0-+0ah/*'$$&1/<J|iC0)%*+-;001)($%( %#)RrjƬ½ѥ\KQYQRJJ>7;C99;84934757743/,.,*)-7HOn}ȾwhcEI944989434130<9?8;@BKDI=/.4+$'(.JW.OwtWSF14<UF?CBE:?41043;3//3-9;7/*'/=bzggmmkikggfgjhhgh^_jf_X_\TWZkw}sd[^PKMMUWZYU[b_bgijnijkjghigijgdhdicagc``afbnË|cgj}aF,*."" +CZlbPS_`lX>?GamHXw}T+)'+3g77MH-13dk/+)-$)&(,1^}rR4-+/'-*0/-&%+5  ;pӼУSEJIJEFA;758655734031/3=3;;7D-/)'0,,:ayZ<?64844656110/579<89;:9?GI6,*4+*(&/NQ1MqmYRD7.:PJ<=<G:>.1-5060.><<:95.'(1@h}ggmkidbgdkhgc`d`aafa`[YUUXTfr~qg\]SMINYVWW]\aZZhgaimnhldifihahjcchfab^a]\bh|ƂpUH=QniF*&%$*Aiwl^QS\o`\hSHNqTMcX&&/(1b?)9Y</3]v0)*)&($&"07t}uudB'&%',156+!'+']zlʭΩ[HCCN>99;84666<6/55.0.0+69AWJ840)/()1(8Ztù^Q=:=18<:1;@;41164499>C879AB54/61-.%-1HG0GtjaHIM35N@B>BC761-1/471.<;:4;7-,(,Nk``dfggb``habbb^b`a]^VSUQQX\gqx~shVPIGHRKTYYZV\X]g^abmjhkgibgfaahgcdbf`_Z\`d֩|zmR51MUM7(&$#)C\yykQF?hg4BkWPRjFRqxQ$ /*8[=$+BW@.`;-/+('&%*&+Cm}}vkH'$*('/0%+'#"%GigζέaNCBEE<75/16647858.++/.01QDd{s`H;/+'1)'/>YxzN>:7=546=46IY^M@=5.14:B>;>;=873-//+&,-6FG.GfdaMCAA8XH==?<610/056519/34@73/)+7Vr`__`fd_\^`_d`^^`b^bX\VSOQRV`qwvgXPHNJNQVWZ\[Z__b`cbbgkgdabcgcbdidac[Y[YVXqȶ͍}xZ96HQ=0)"""'6{q^H50WbG::\[Q`]GRtP*$&4>TA,/=TX7_J%.65,%,*,+1?r~tpiU<+().+#"'#"4nubĭͬ\ENKA=E510611109141/-.0.49H]lR:++*-)*0Eiyĥj98=5/4973;A5Xn]E3-,.665=9;>40.866,)-04QM-Dc^[I3C7@PMA==:83.0-10034:9:457004Da~ggi`bgcccaff___b^]_V^UTPNQTdm}rgXMMNCKSWXZ]\ia^cgcakbigdfbika``g_][f[YVWXӿֵ{lm^AZT1*+)+&!5fc7/)E}j3).1G[ZiYQcf1(%$03KG*1/:B6RW+0.-0+)**',5IjcK\Voa0*+)$'#!%Vkjϱ϶gFJSNNH<+03031770-734)/0N@G`ȵzf<,(')+-5TsέtC145./+1<<Tu_NwbA/(*+19:8<89/*154/+%./RB.CcVjODC=AYS>A><513.154614185134,48Nnbbfcdfa`a]cc^^]\]_\XRY]NORT_mwuh\TMKOOTVY[\`^_bchcffdkggcgkf`hhbca]]Z[[WZκֽi_sRPX9.$#11-+\wd7(/9q{F%& +@Xmvg`g}K9/.',,A>*-1-/1Hj+3/33/,40,.14>=.4?R\Y4+(#! "4vnc}Ѹ̶mPSZYOG>3,*+57?PE,0@>.)$)ZZCZ}ŷdH.,=OM@Rq~|z}ս~S853,,1--98^GoS8,,,+7:7:<705113/&'-/RB+8b\g[GBBA[D??G>73..53569:703//-,1A`uccinl``af^_f`ad]][\TTSTQKMVan{|ufUJMQJQU[\\_^ghgiddhibbhbhkgcghg```^_^[\XXɶ΢aqmDAI6%&+:56SyfQ?'%5buP5'%,.J`|g`\zt90*+)I0/1((:0(-?}A,7,-*+,+4104/0*+-BJC:<&')"&UdpŪԿoTU[XPG;18-+-5CU]T4>SR1&%'9]C1KoJ@@lpXNh{{~Ȕ_F447=60,,=;MN~bE:.+.3434:53/441.'(6@SH.8jiXpBAK=bC?A=98.0/30,8?4=5/0101;Md{ffgfbk_cfbdc^`b^][XVUVTMKOSat}ob]OMOQTYZVbcdch_ahfhjc_if_gfjcjcdaa_`]Y[UMaǼνkI.OT,-&'DJXp_?/1%:PjJB0*%*4TZ|[]Uu667/+0--&$)8+--6iN4?8*(*).00-;44**+6=5+*0JM:=xk_ѻ~S^a[TF:;76,/6:H^k]5;a`O/)+FtO;CȳgHG`rW]y}zxuwԣtYF95CDA8.'?=FfmIfN>713H.14>76.08.4'(*7a@,5u[[iRBFIXB@<<863-/9?3/179.+-046DSpjkhdch`hacbgag__aYY[VVRMIOZapzugWQHKNQXYY]_hj^ighglkhhdfgihpjjhhhd``_^WE;Oɸ|nj3)+,&'+.Ntm`F+'/1P\?8G<-1,<K[cDd^wC6910,.3*)7*1'(.VW8G11$%'/&09:/,)(594,%).7HNfxbzű½ɒ`doicYUB8544.0DIbwoI6`g\JCD]rM6[ưZH[|a^p{wuux{ņiQQR5=WSA+/JVIVOGoUF9)17,,1/06,/*5MB,4?c=+>IXlZHFZZ:=E78541511/51414,.19;B\v~gggfgm`chgaia]`_]YZ\YXRRMKUcqztk_SKIKRXZVdf_mhijfkgkfholijknfdfjj`cccZH44NXVqͽaqwXD&(),(#/;x}^O9+(;QZJ6:OQ1/3<CidRTgu;000.,013+:.,(+4F}}GC,+*-+/.*1<0+'()*+&)#'&0MmvYpǮϚmglxrn_WUQE=0,-GM`y}gF;WgXW^VI;DqOHqo_cttquy~~Ӯ]Xkc?@`h\NFZmXN<[xQ@=.,,(,.0403*-4+),,>f=-6RSj`PD[Y5=F?3,.15455676757094:Jfxiidgjiccgdf_jc___[\`USQPGNR_m{vf\RRUSS[T\]gihahonlmofmnhlmnjkjhipmgg[O=-3<xZDXrɹlS/8683-&&++3D\sdN/4./NW;E7<O\9+4BM}o]Yt<0++.84/-':)'((-AlS703)8+*1-3?.*,&-,)#-($(/]|wU_ɞlqix|zridcYP806GU]pv[=?QY]SO:CuҾ`Wgzifosrzwz}͠ral||a:Ydh`XY]YIB~sYGA0..-*)11*,8,+/,-3Gk6.3wVJc_PKY\==7@650.5569<976/-.3.8Ukmmbigiccfcfikb`_^_\XUSQMFIRZk|~wh_YQKXUZU^]cf_fiimpohdjopoajpkqmv~nYIJC<1*,Busνq:,(+*-3$%'11?_cTF:951?ET@M:>EY<:@JXzdZyA-(1,06108B/-*,)<WyP--537,.,-661+0,'(,(0)&,CkUi¿ʞpfuv~xy}sidN4,5F_out]?<8>;BPoƷwdjyjsv{xuȋllq{TBXkhbgTFJsqUG?088*/-//)/0)-)(-6Ti3/7nZB^ZOMYR:7893/A<0801@>74-1//37\qiihgbhffgidbbc]Y^aY`UPPKGNY]nv~ul`ZTSPVX]^^dmkhijnmmmmlkjqihkpkxoR;4:<4.63H}AD+-*0+**'*36Vc_A:9GF>9>XJ?;@@JXRYS\zl[TyJ8%(.<114;>7(.+/6HR?+*3;4..)-.8:)''$"%+156@qVYʦqkvzzzxpZC/0Kguuy}tcU@CN[é|nyttv|z~|ؽgsvt]QM\[XMPvnRC7431/1535)//,-,+.5Sb;5<k`?Y`\V_S<>8:8/1/9755A<71..,,1>dwhhmkf`fhaghdi`aW]]]WURQOGFV_oz|wn]YMSWSZ]^adjmhldopmsmkokqgknohpp=:7A919;KXxǾؙ:=P1&)0)$'(/5ViTSJVW[J54BYXHHWVRgb^GblmMYrQ8**97-.*B-,8-0+7?=:.)9A3(')-017'%/."%"+7>Zg[j̴Ǣmnw|~v{{gVEEUfx{|{pjjxϷuq}xu}x׵icovm[RRWimSF<983/014:84(+77.05W[366_i?SbYVbNI66/565943+/8;=544,/4VgdfhgimhffffhccdX``^[WUPMMGU_gw~vjcYU\T[_\agghimkktnqnosrqpmnfSF?E064bhZPb|v>6GhE())**)*5Jkspd\MG44+-8XRV^b[ZW[IBikw;Uu]M/=B3*'0A3-(($*1<;4/9F@/081,138($(%$"!;*PgjϤ×inv~xna^`bbr{Ͼwt|wz}ҭj]\d}|uy|gVG309?66198481/5:453][84;]ƩkGMhQcWQJ:3.34.4,-169<;/-40,5Pkggdhjjfgcgidh]^`_Z]_YRKMMMV\pvlaYUVXU[__\gidjnnqsqmtqopvoB:0++,8<M{|ñĈV?-5<r[+('.0/C^}woY0,0'$(Eh9@\dWPCYPKk{|3Qyl]JN3//'/;.($(+16.4,1>B<8/-04E=06+$($#-(>qccƤÕbgz}xogmUNuyz|z~~ӫwjc`p{i_P7.7DC@;96<:13394458^Z:9:_ŶsVX`VjHA@56./)0-.,408790+(11E\ylllkkkicggfddg\\a]^W`SONKBT\l|ujf\YV[W]^_dgmgjqspsunsrvk}X/1-,/3=FdƫսV84/106XfA05<Nkl_p4&!+!$4Pp)9]^RQJQ`Sg}9WywuKC4HT%4+(%',%.073414:5/;030+:0''-# $-UrYpԶŚd_p{tqvmq{usxù}{}w|}үz}yuaN;-0ANE@:;=:51/3M95:<^X137[ütXOZ]pE8FBI0.,0<.,36=7;<5,8COgyookmgfkfdlngc`^_^ZYTWTOMIJR_jwtmaXUTSX_ccdbjmoontuqrutnq?&/%*9AQf̼O060+,'1JucScmyqVJIaX*%'&)*7a|.6d\TNSPQ``}UhttwB:<cM,0/1)$),/-8/1/11,+,4-;.;)%&$$$"#<{bdȏabmy{|zpqord}xкxg]PC40:WUOI=87@;5*3J:76:VN-/7V^OQ\jM8FC5-34400*)3<=:3.9;[o}lllmiolipojcba\[_[ZTTSUUHKN^lwjaYVZX]]^chfjmojuttpzuuspD*,(5OgsxF54><9//:Ivrnm]ZH6<Dhl5(#&%,3@b~)7\g]I6HGYitkiqPsGHpb7&/.-(+..*10,.03/1145;6/,3%&!%"*as\kɨɜddmqy|}ql|h[ymnwj{{ּ~uyu\AD?@ABDAE[_WH9;8;60/19687EVS634W`XGXfUB;?./4/91815=>E5448CP`xĿjkkllrmjdfmc_cZ^]^XXRTVMFJN]hwzldXPTVUa``gikmjnvvussrsmsY+/7GnfA<BMHB593:<N|}T=B/6Ji~J'$%,+1:8]~9;Sok^/5O\l{mvvgM_`N+$(.),.(-+..-156,*0;:00-%&($"#!&Id`̴Ȝ\Vmoxq|~p^us~j}|~־nsqvsdy_E=P>EXYVSZXWB>63>5*$-50;<NYU06=PşiXE_hU;7700.445/*6:;87718F\okjkbgpmligmd^c`\WXYWPRGIEKQZis½ykgYQS[Z^chnfkhpkpsqnrtror~i;CK_yuaUGBJI<,+/43+3Su\F:No}A7/0,.43-Tw6PJ_da;(6Uls|ktwuhg{|l*&(.4/35E**,11/0.+--1486.(''$!#"3orfm½Π]Sblqz{vrpz}s|w|zv}pXC`RNS_ZYVYWG788=5.)4?64>SPW5-8Rs]<^gQ?4=555793(08@B1..86Git¿kklnkpnhbfkf^\\YWYZYVUNKIIIXjwûzoiZOSYXX^^chkoqmqtuvxqqtrtdsy{uwQCMZXT]\K<:3(+-1/&(=uaQnoQRUK-7=))RuC=NWomQ-7_tift}y}x{s3$&4<5.+.3065+/51//-/6757.'(&$&\gjw̤\TUcoq{z~ƻ{pUnbNUgfd]`UH<1;:0'$56-1;QIT5,9Rƪzc;TlC;/8;.-61+).>?:570,1Rg~ſjinhiigccgfcb`[`VUXVTPPKHFKUluvl`WROUVZ\`ciakikprsznqnmjxrXHHDEGGdnU;31)*-,6()69Et}wktyS*9;$)<jFEHDpw`C1nnTUv{}8)*-.8<5*.65430(/955/797-31)" !"=zrfuШ`QU`guy~~ʼqYjlPamcf^d]QA7A8/(*53.5<?NR4,9Qǰf>DiDD7*;1+1).+5GJ>.*&/9Qfiilhhhhcbh__aZ]ZXUX[UOKHAFPWhr}zndTRKUT[\abfhlkoqppmoqoohr}rcGNTO:CWiXT7,/1&+?8+&969Aj~}uH683'*3[ZPFAhxoYHnZRHawyw}}x]F6A/.*),6/.+033./8,/0+0*1(),'"")bpkǮүcNXafqyxwhmmaimik`d_R?8C<.)(5794;<OI./5JëdB>_O8>-:34:4,16EE9+.,05Rwihjjfihi_acb\[WVYVVTQPII?>OWhuxjdXPSVV`f`afhkksnqspqqnrmps{scROGCFFVcZSC=-%%)5U11-@;4;Vv}wzcPA3:/),6QPNH7A}td_NBNBdqcfYXaaK]QO.+0-0344.)/3:8510./-(#&%#%@}wosɹԽcIS`akrv~¿{wtxplqsqliXTA>F=0*+;7->>@GW476Gìc:<aD9<-;<095.35B<8-()*DXwlmfhgf`da`]^\]ZWVVWNPHB?99AP_t}l_SUXRV__a_cdjompqtqslqosrq|{x{tdJA?<DQnh\P84*''<?_>4=HD8RcfloxlobiG<5(*-$)=@NKG79RyziM[ddkcZ[n=A]a>O6603.*+.//,./+57/05,04+&'$0ihm³t>RX`jrty}|·}{q{t{uqngdV?<C77&.871=A:OT316IĵhCDbQ0:+.;33+.38;:3,*5,Eh{ihdhd\a^`]\VTXTVWWUOPGF>;:FRcsyk^ZPST][Z]adjkmdpnrsorppqptvvupu|nX@>;@WmkV;@A9*&//Q[<9CY_[qixREKJBikTK0-,$#8:7AXU614Rv{~yuMMorBBaJ&,33.,.-1.',5(,,179-51511'((,HnhoȇAGVckussv|}y{t{{vwobYM@K;6%.983B>?WN6,5An?D[`.0;4>.+()43=,.-*01Ojjj`d_^\`_aW[XWTPSWVSKIHB@ADN\pxl\^SNRU_`abhdlsnttqpqmwoqqrzysqkwrpOA=MJS`scE10>4+,3?ZUI>QkoxorH=44SpgV5('+(4A/:?c]H838Ic>>vMKv+,(+3.5,040.10(3-43@113/4-++-9nsfhyϏBCP]cnutzy{þ~{uwwsqrhdX>@B::+595;B>>JD4,9B·g;@VY0/73;40(-4586+-,+8Sogg`ca\^[Y_\WSUSSVVQNGH?A?=EQ_p{ld_RPXXX^]`hbklomwrtusvppwy|tqpywkRF\f{}|_P;5:55+6/>a^UH`z{rkiJ76Hny\G(%$'06.4QVltUD:+5iUD<EjV~\.0)./5513561(,--*,38387566+..RkhrԫBAHT^bxtx{Ľ}|~wsolk]E?<;8,804<E>>IB6$/=p7=TJ+'35F++),7880,,,0@[yddaba_[^`\XXZWRWWSTSGEE?A@JY]k}zmfZROUV[_gdidiljmsrnprtwruy}tcrw~rju{_?::;43309RqdQRlwayma@CIppT0'%'(04/;RfvmYS@>JORqpV>`kwu;359464353599/+1.)/3075-/14('<swomŦԸO;ENZbhttz~}}~wuohWGC=>6*/56><8>SJ-#+<{rA;HR($385-7/19963++.5Fix^]^_ZaZ^VUWYTYSOTKPOJFD=>=HN[r{paYQSSSX]Z]bfkhpmpurqrstzxzvkoz|aSG;?<=CC><SziQHvms_[VOjyaC$#')-*6,9?TfhXZZRGHgy~z=CIMECDA0,..8400,-*13-638-,3-+UlktǺ^99GTUfouut}}~ÿ~vurhaMC1:6*/9AC3AATE3,+<y:9OM,%3C;31+,553/.1.=Yq~[[___^Z]XVXYXUWQWJQKDA=>=@DU[mzsi`]VSQTY^aaadicjnjoqpsuuzzgNKH>A@DHHD:Ac}[IUr|y\_sck}v`M+(%)+&*3/35;G\ryXfqpfZ^Q_zGEnfcUTXPD($)766*)0-+)1../,*).C{qbnzƭȀ94?INYjrvty}~ǽ|zxrp`QI9?8447=84G:\?*$'7}{H6I>)&+C6,+,4:;3,./+=]ub`a`nh`\Z^YYYWZRPORNODF?>>DR_l}tlaSTRRZ^]_\fdd_hhosty}gUNNPZUC79::?EH@5KinWK_m|uVVd~t{fF*)$*+(",:44/-7OUnks{}tobYkmA3cyjUY\V/(048..31-071++,)().Wjjtºљ646AOVbcswy~{~~ǿz}vp^I;;=1.1:D87K=W90,(0x}M4C7##)E?.$3:7:70/0*Fiz]]`_lhY[VUXRVUVOMNKGHC@=;<GPfq~xnaWRRRZ[_\^affjkkowP>F6;JdX?9<=@@BDHG<SqiZNY{vQTfy~fYA0-*4*-)))/+*01@XSDJryzoP=7104avgdbK3.4760;/0-01.-1))*'3ssjrxdzԯ@,+8DMX]kuxyy~ʿ~yyrl\I<:?6,6BK8<G?W<,3,-kT/FB//+=<-).5;5+//.6Um}ZZW\][ZXYVSYNQURPQNJMAA=6;BPdxyl_SNQRPUV\\^dlolytE16/?TVVA77=@EAF:=BFVjcTS`^Tq^I>64697//(,)/+3/38>SQANnzvsO(%#**:gxnY@70/0./0-030-/031,-8UwtxZ*&16FPZclt|x{}̿{ulaN;@?1,>=D@6FFX:-,)1bg<E8++,64-49::,1*+.6Zs\\WV\b[WTSKQT`POPRJJIEA;=>ES_p}vj]YORMXSX\\ajky|yycWH:84D]^OO@BAB@;K?6@KXg\HV`z|fsy;7717871+034.7-)1.46Ib[C8@AVnP/&%)15FdyjH:;*.04//..//+05*)*1=pvwzxîҁ.!(/:IXcfqt{~Ͻ|~yn^G;BC0.1C?76RCZ<4-,3`p4=4-+..8++3516**.,E]yWWX[V]ZTRQTPRYRPMIIEFJA>9;AQ`o~yh\ZRVSUZ]^bcno||xyunz|w_cZOGNRMQ\N<=?B;8@<JTVrY>Hdll|{wlB5..950-313+//.304939<bf>--I`S4) '7Yfzs]HS<0/'3+15,.00*(')*4_m}{՟7%(14>CWdjsv~{oo[>689107D@76TOW5+)*,a|?/4'(%)/6+0;:0,+*/CdxSSYSQWWTORMORTTSNKJEH@>;@<@N]o|üxpb]QKQVZYYcchqozrqttwvy}lnjn_mdbYXW\^_@<EE70<@ENfst?9OUwzPK>ZZ105?50-100,0./517:+,/D[c@*CaA.''#$1afoo]ja:1+$*,0-((451'"+,>|zqyջڶC*)/;99IZdmry|~|~~~~о{tgW?5;;.3=<94:JXT64+*-TE,9$"+,0?5/650+4-/RlZZYRWMROPWJMPRROMMMJDB>=>8AF[ptld[MMST^]__fmmrjiprstvu}`\aQI]d\X\lbKS>IR969DKXdtw[8>JYqd;:;Qm7475/0/,013..*.;88+7/K9S[=9\M7,% (-]iqn|X01947&,-*)4+'(#$5bwzwոd*(*-18FJXblyx~}|}}usfVA>@<+0@666<IaO7.+(.OW)0$',,0M8791.3/-:YtWWTPRVTPQMPINQSJJPNGFDN9:AGJ\o~zkaZPRP]\]aadgfrmksrqr{xrQ`^IITXO`jhPB]_RN64>GXbuz[>1>Fnp`dmCGAIq4<:1-*.+0<8435144:.-7D14;<3WU8*#! *XpnE35.)()**'(3',!#;{ux|yѕ7%&-,19HP\fkxx}y}ƾӼymbO>;>:+6B664;H`J4()$0MZ+/*+,(5P<6885,/+C\wSSTPQQQSPRQRIKIHKKKHD@:=>9AI`m}sl_[QOWSZX]dhddnnrspvsvzxoSS[V\RMj{u]Dbj\E>=JZpy~a>3:=Rrw^jwR7CqK?;().+8089486.189.1-5K95654NZ;'"-:Rist]?(&%)-)$#(4&##*^ytswִ;1,.9.59BR\ipvvxyԿ~vlfG?=93)3;948<JcN5+((-Jd-0%,<*4>A55..,,1Jd}~VUXUONIUINMJOIJHJBCJB@@::7DO\lzm`VNJQSYZ]]amokjmqqqvwvuyxjBC\zjl`KHalbJJK_qzoQ<1,7<YSk_\qoC@P=D<++,,7@658573/4345..K*0.(3B^>)##3O\jsqq{Z/%% $%%&%#"! %:wwutwn41*.;098>P]ipux}z|ŵ~zpZE;H9/-77463<P`J5)*'+>s;-%**'6CF8=5/-04YnSSNSKQGJJJSJEJNDFOFD?BB:6<EIWkw~lcURRYUXYa^[bfmmlnmotsvvxrY;S~}]AD`hscXGKgvoH995<;:=8[p_au>4:C?74,8/5A/55,@4/6413?:6.;D/11MG*%#<Cdjvl]F*#,0*%#"*("&,W|xx{~Ϳ՝4**+7G,4=>OXairy}z|}yï{~vjVF?=6*(>43006G_K.,*&,B}=,*#%$3EEA.1:56@[yΫKKPNOOIOKNOSNNHIFEGGC@<9:@DHXk{zk_SKP\V[c\fc`dilknopswvvwlUXz\IEWqmtd@H_vpO<;;C:E4:5Iv~bT~O5<?B<:3541D;0.,740,/3%00,C[m6+&9D0*(++TqwrdQ]pF-*+'#%%#!*(5ulux{ٹF,#%)/?15?ERSilqt~~|ƴ}~qdR?B1-(1:/538;NcO1''($7{J'4)*&.B?=716.4Hd|PQONKPPJTOMMONNGFBEF?;8736BKXn|yi`UNKKP\[lurfdigjnmsnrsss{yvcCNGRulnH=`a=<8;JQ:U745CaoPf94:H>;6981G850.04/*030*-.Job1&%1H7+/)4PurvYMytK.%""'(%+,+P|hsy7)#'(AF419?IUhmps{}}ʱ|{rcTAA*)05<07;@@OZH3('*%<wZ;?%"&69A<07437NjMMOSVQPNNNRPQUKHMIKE<B>885<I\l{xp\RTERWS]xjbhgmpkokr}xWK0BMZtnSBY[=579=iKAXJ@8Pvx[G)4D<D;B75J;5.49,-*,+5)(0PKX4)/5?;..-@crzlRR}r4!0#&.,)(1cphu}ۭ0$&&(0;J9:>JTWairq|x~~Ѱz{o_I>7111975?:;BR^I+"%#%4pj6G%4)/=5>-.)+>]|RRPNHJNIHMNMRKGIDFDD@@8597?J[o{ynXXGKKQS`}lbdcmmkv~fE<=83IVp~ZA_c:0,/7dxKIY8:=vVp[?:9:96=;3AE3+*/()5+,<+((@IFCHH@<3+6>TdjwW;YbT)$%)&!*$=}qss_'!'$$&BQ=3;BRW_fipur|}~Ե|~n[E?75-17;4@;8=NdR/)&%'5kl?;!$.;A7:94,.?a}WXQSJRONNMSJKNMOGBCD=;5531CN`p|zq`SNPPNOaw`]aamn{sH+.9<7TpzJT~_4950,=wqKOZ88Z_]t4758<9U@9E9-,&/'(+&)3)+,CWQNEIO<0:KQ^_|d>7Vxm& "&$(^qpwѐ4#((%+(FX93:;PY\ijruwz|~}}ؼzhSE90*(/999F<7@NZZ3$'%.-dsO7+$/::;64.)1QkSSMJMQJURSQNJIIEHFAIC=8335BNbm|vi\NMIRFU^cd`hy|{iB'.;3Atdc~|J>3>=.4ThFn]5<dxcF~N65=8=J@5=@.-'(*()&,0-3@T^^TPXS3.JfZRgyJ5Efc' % $=xrtӬ@'#$%"#*CZ>96>HR_hhqsxz}{|§~ztcQF8*',1:4@H<@CNY\.&)*.5a~xT0!-<864-.)@[pVWNTPQQNQRRNPSNHC@F?<:515,;SXk{|g[QMKMJOYwq_i|ru\1,98?cUU~}J<@:@;39gs`QoCP}ivuDrf9>EA>M75<=-)&('"""-7FMdpjYWOJ1/VbMgR*6Ti{Z%(\ustvּG)""$+&"+H[A>;>GXXnkntz{|̢zkbNK6*7-6758OBERIXa-')()5XU*$(<;35/(&>`vNMWPNQMRRYITPMJDE@E@E=7985@GVi|vhZSHOSKNYhspyosuW85AJp_?g{VC>@D68C]mfJiW=Qyjy|H\|?>?3;>94=91*#(,%&&)8.>EsjYE=61PZja*5>`zI% $8tqzyh)"#&'! '.OZE7>FMTZlmots{~ҥ~sj]I=.(,/33.9E?FQEQ\-*"#5KV,!+:1)--.4Ji{RRRPORMMKRJHMKJGGC?A<=:4.17DYkyf]TIHIMNO`o|rxry\?<IR~{tmEQo_RlgC57Wn_NO}O<Zyzgz[^M;:+.=878;1)&$**%)?J6:@ausR@:<BIiz~|zl-'3OxO' ! &S}s~z|Ԏ3&'&(#$*(*K_K8?GKP]fjqvxz~|z||֮{ok[G3)),-<1-=EFBPIFZ6%%"$6J[-%.=,*/1+1TiSSTQRTMKMNMKHIHEFAC@8883-)7D\i|vk[SKNUKKRY`syrimoovyzhJ9E?rpuSDmd[JNcY7@Kbd^SulN<gtkp}_E`J&.)+9<A9=/.'*-*&(1:1G>AWonR:=Quiry}kP}?$/?Q7$! "0owtx{թ:&%'*&'(#%%PjQ>DIGNZdkpvu}~~|~ڶ}wpgXF0-+0864/ACA?QFTW.'$ &6Otb-#&98-)6.6;[vTTYSZQOGPKHGNIOKEEE69440314AVl{vlYSKNHHQP]_lsu}z{~ytvjK486fzrmPOfVZWaN3:X][ZP`}gW?^}g\tc<FU#*)+.)31:1,.(-$#+708]KJS\bV>KntsvXBUq7$&490-""#Fuzw׿J'$*').%%&#)VfW>CNNW`fjouy{}{~yz™~zh`N=-*,.,656?KB?NKOR5'#"#3Orq.'$01(+)/=>auSRSQWQPPNQHKMHNEFGC95644*,/FSj{viYSKORPSRX]^`ahnzZH79Krlk`MdlaZma:;QpdWKHxWa`Ga_Rsn<7{r%&&+/-/1=43,3/.*;435lakPN_MI^uyr[C=?]RCF/+%+<4"$1#.)`y}{}͂0"#(,+#))'*1Xg]C;KGVZ_ciuy{z~~}y~ÛqhYH3),*1.74CFCKGIJFK78$!"3H`w7:-./)'.-PFfWWTTSNKPONOJRKPED@A>:7150%5HZiwzjaXQMMNVVX]_`kppoyyZB;?JbXVPZhpcbiC;[bfXMBN}HHQ?^vWHlpA4d8%'.0/6+,-740;5100*3UiMAGQJUgzdg\F4F[aJ=3+&3-9/ $/RNqyvѱ>(# &(,(','&+]oa>FHPV\[joqyxzzv}~ȗrkT9+)+,/-4-.<ECGUCDFF.)##0G[G++0+'$%1GRmSTRSSPSVTMSQUMNPBAB::5/7+)0?Qd|zr^RIHKMPUZbcmy|okrv~{m<=PXf^\?Eiwwi`B>Ul`OFE=hs<04Clx[AiuH7HW')&0C-(/+K?>1-&(%+,=f6.USQc}{gSJCHrxQ</)#$10,$*Timpqvv̫5$$!$*%#+&*+_p^D;JJRY`klqvzy|~zwy}ϝ~uxhM3--)/.69/1<FEQVDKB:.!"$5=Wb97))$*$-N[yUTQOQQRRRQTMNQGJD;=8770-,&4?Wfz~zm_QKFDMVZ\l~pororwxwrW8EHYYZY4Io|fOAZ_RIFAAI\54?QuZ=gP:>q-%'+3-,9NPC*(%%'9=9Y<8vuDSukdjqj^F1&$&&3'#"O}|~~jjpq[G.$#,',))#$/]r]ECNQTVbcnyuy{|urvʗ{vp`?3..(*5<0,/G@IKNHIG35#$$01Ja)@,!#/,+TmzWXZTVSQSTKSMIIEEC=A<>:10.(0?Qc{~o^RIIGOZcztllnpq|xzvkMGQPJ^f`?`w|RHO^SBPJ=;h~N0)8[|c=WW39k?,/+36>MF=8--.##&JRA]]p\HWarbO>H50*'#&1-!"&I{nqg{q8*''#$(/%0F&/Zu^RHDFP\Zgpzu|}wpqyɗyvkN1/,+14-960:EDIPPCPE58%$#30@b5>9&#!(1ZuYZXXUWQTQSRONNHBCAA;87/0-)/BSl}i\QNDMVbtmngoromuyzrlQFK?A_aIV{yrDS``KCUJ0:|aP5'9VsgAKX43SH,13;JO76/-'8<$!$7;DSlmB7BR\lujA3+.)(#(%'1) "+|z{Ĺi4$%&)'4'$(*%-`uh]GHMO_^nqry|||lty}ŗ~}w]B.&***&1-51:@?BNIKO=0:+##5*9{pC44$")$/^yWV[YXQSQTKMONKJNKIAC=<-3*)6HWm{xo]XOYcrxicmmolw{|ywu`GQIH=]\Wq}y{XN]RF?HET1HTN/-4PxhIBic37=j.4?MHF10).<K?$')*0>JDoUQ>,*7>O`xrS3,% #" &('=aC&"! '7)/)+))6^nj]IF?V[bntvyz{~ypv||{~׿ulR<.)+0-(74409BCFFCMN?/8/&*:17vsS5+% $'6V[[YVVPPZRMNSOJJCFDCBAA.-,,<Q[ny{uf^[q}rkabfhikpuy|}{n\HP@>D^ccsj{qYZRJF80:OBhmRA5.1;niNCUn:/@D1,:?9,0,4=SE+!!),9K;900-))*4AnvtH-&%%(#/+!fĴ{P7)$''(-*340'(4[m_[@<IX^cirywzypx{{z~Ӭ|r\F3**,-+*7<447A?JU?HR>-10*'6)+k}vS4/,%&&@_^\URVPR_UOUUIJRJDEC=@A=3.,;N[iqfimckh__\`abciiiot{zh\VO37M`fkfjon[PCN0%4Tp\V?D/+8csVJYzE78b3).5,/1/5<bI&!(+,<PDB;,*$+5ENufQH5)'(('&-)!"&O.)'!###1/,'**%5dsh_KPOY^`kqxs~~upvzsx~~~}Ÿ~zmK1-++.-//16458=<JI<>N?)08*$3*,ZzY)$0#"*DiY[]TSSWOTRQMPTPHGADE=<;753?R`n|~qml]UOQTZU^^aciggmqzx_`TMEAO[haas{hUNFA"#:ZrdU>T7.5[rbZWw^A:pw:,33-5O=;4_Q("%(4.;@M@6,15WwF)'$&+%+,,&  9ǻ^?7''!!!'+.00&'*&/`r\_JTNYafin|w||~}x|}Z<9:K[kww{|}ƫv`<4(-(010-9=:5@EDPP9BQ<1153%+('[c3*4*,1WqPPWTTPRVTKSJJPMHFEE=EC:=16CWfstmdUGQORWZ_]bfnmmnptwvm`RRVOCWi\Tj}gYSP7'%8la[=Aa@,;U}r`g[on6.U=(.338JPC@R>&#$)""!+0=QD06l5$%#&-*0,-'&" ![̺ƽw1)+%!&%'''-;-,/,+.ZngcOKUcadfpsuz}|}}}{~iC413BO\d]gvx~}дznN1-(/4/.*1;786>EGTG8ES?0163/-()K|c8&18'=dVVVQYQVIKSQVSWKIGAECE@;9:@FYkxuh\MNKQQZ__^_fkkolvqusoR>U_V;`aXWrz`OP?(!0>uUA5OsD.KKzr`f]uC7J>$,7(<Ei\4J>.&$$'#&'-1KbPDgz?*.+*.,05,#""0ͽĵi6$")()&&&,,6460-'(/]rumHSW_fhimsxv}|y}m[H=HTd`_ZX\`v|zðzd<.1/1-1,0.<606=DINBBKT954167+'%B~d8%)B4Ch~QQXNSKRPNSMRTQKMICG?BHI??BP^l|rdWOJFQWTU]^fbggkmtrssnXKidR?`aaXqj\PI+#(0kkC8>ktG/QDqy`X\~W3CR$%3%,EGB4IAI=("$%%&%++IXRy~Z8,/345:8''!"!$S§>$&$''*('),,0./1.*%*bnujPQWbignpss|y{}}{~|xqicio{wtnch[du||ŷqX145+-11,/,>509@IHV<8GVA3-.:?&%"=ya?*(8JNtRRXUTRPQQQRQPRMICHNJGGADDGV^r~p]ZPNPWWUb_]djkjspsqwxqQMjjMCb^XUQSq]JSJ($9[uqC6JopW40Nx}igZ}}zj>F`! .$%.439[h{b33*,)$!#*3\kV7-*5A@85.%-0-;Im*&''%+0)-50-.04)1-31ctriQQSgikqy{uyy{x|ztsifr~|}ļwdB1/319:,*.+D45>;HJX=<ENH0./9C*)#4ioK1")QZyQQZSRPQSPOQROHHKMFFHJFEIFGUfs}p_ZNIHRX[^cckdjmoqt|}}uV[bYE?f]URCSfT<?3-(FzfXP<YchS>4@{tdUsyv|GRso#"'+4*0qE1-)&$%!#,Z~X4+&!3D51Q?=XVObgtuc9('!%)/:>-3/,+,3'/0*3gxxmUMSbjplxsuy{~}{{{wu|zúzq^605.1:63,,1B97B;MPWDBKOE1-,::+&$.a}^V+&/RhQQTRMIUSQJMEMKOJGCCDFMEPOPXkt~siZRKNSRW`Y`dhglir~vui[gW<;@W`ZX@QYG5,$+MuwnQF`I\YUME7GznMHiv[\~4"(-98(1sOS8&'#%4tqO,0$#M]GNimaiqcsqq~g3($#%'+=TKNHH--..(5=6-Zw~n`UU_dnos{{xz~~~xz{~º|lB0-06/;6.05.?3=;:QaPC:STG4,.=3)($,Ri[>((TsRRWUWPUPSJMRQRPHBC@IHNHMRV]iyq`WPHHUVY^_bg`hioz~}z{l\U/68@Xd\ZDOGD3&%9i~mJB@_XWFRI[?Aoc[WgugsfQ# !+?8+/w{u1 (X}bGaQ)%(Kdcgmyswzdnxopuxע.)&,%),3:EP]673+(1#+,06gyhhST\mtusuz|}~~z}zY7.0.,33,1./3=59?>M_dJ@MGA8..>/+0#-Kff9-)V}MNRRTPVNKIUQXNMPHEBGJPONWU]m~{ucUQQKPWX[a\gdcimy{twzofF-+)4PdZ\JO?=3&6]}bJ41BJg`DHTnEJrtdYY{nX~fg3#%.@0*3l9 ! ;}d69XH04H]aoql{vhxkgpvU&'+($'*/48?B601303(&*'0k{}bhMY^jpwwwyyy~|p?7/30063-1+46@:<A=U[PRNVDG<64C+3,#%A|Xg?/1ZTTTTQKIQKHOTRPOKDIHKFHJPWYap}}paYVNKUU[Y]_g`ciosxvvxJ--&,SYSOGF?;-/\fB;03@IVZ?>^}R_wi_g~~jKki{6*$'3:-1[;*# $*[f9)=<NVVhgcisvdinaiz{3*+*/,0+435.IB667354)+.1h{~ZkQY^crqxw~|~~ǼzY43410*0614-35==@>Gb`GEGTDD;4?Q-.3**A{xZiG/?hPOOTMKKFWTRSTRPMGOJFFJKTX`gr}t`]MNSO[Z]gXb`ghilnt}[,))5Q^ZBDIBA,QrQ4--3>SQVBASzYuknot~lVJWt]3/)6B07Rv~wjJ:%*0FZ@07QMdpituosz_gscn{ܧ=4/-5:665<;<@@<:5<671/30:b{blTW_iqquy}}}}~}xK74805+00+548+9DA:C`fF?T`Q=83?P*0/'#8tsXcN<MhUUVYTRSVUSUWRROKIHJECBIPWagosfZQMRSTWZ]]_bdkmjt}S:,-1JZVH@SKJI|tZD:6-/AHNQOAU^_muglwpqZDSossI.*0B58NnhK->'0FH7#"-7Zzt~Źi[sngwN0.1015611.674A998844/--16_wycmYWhfmus{zǸʿ|c=3666101-+-/47DK=9AgaN>H\F;C5DC/8*)#3lsSaWA_oUUQONIHNTTUMREKNGJD=@AHP[dhqqgXSMQOXX`dcgdfnlryvYA47<Ng^PIVSdq]>=4486CMMXQGGP_ktm\wszmNMn`]N@AAPNIqnstE8E@NQ<++*19VĕTcg]d{x;6987CB@995;;6@A:95-/4(,-3^ru`rYYchntxz||}®yD141665/9361585GI@8Ed`JCH[F@A:HB7>-)#0\T\_FkyQQUPFIJRPKOSNMJKHEE;>>FNYgkuomUQOJJU\V\badfkkwtfY<->;EaO<H^tydD<B0.315BCEJAFDUbaSHiur{wOHw|YjU@JO_SHY^WjKKD;CG,$!/6K{_QmXT]m΃;('-,+14::=;A@CDNCCE><;0;<<_vxkuf`goosw|Ǹɶ_901305054001/5<UJ<7UcZB=HOI;<>C95<-./0Q[_hPuNOOMFHJNMMIMQNNMGCA=??DKWYiwrd\QQPOUYZ[^afbdnwpiZC3=?O[BDdyvg68;-.3/19NHDNOH>UbVMD[{^rwXSO_r}xXFDYcaZcfaaP@30@C,&%6M÷V_n[]fiϗ9-3'.4)71/44/.373C?>=/40-,)'MtssjjWdppuutz~}~~ȾǵzD8/8135.-1,.1/4;NF=:U^WJ>KSDA9AG704'("1E{YZtZnGGONNGKPJIGQOHMNAD@=>DJPVamz{tcZTKKWSOUY_cf_lvyukTFTE;RVJd\H@6EI11C414KN=[NCCNVJTFail^ZXJhrb~|c@@ZmtdYQNTM,&'8I5)0BWób\f\[bc{ӯB)&%*53/--367039>=OB?E=54-10.N}nsflUbdmwvwx}¹{l7/*4464/131-/03AGE9;\[XG>NRO8ACE6.,*%!->}\SvjxQRQFGJPJIIINQMMHEE@>:BGO]blu~pj]NHHMNU`Yb`hkxwm{~mQ5;CAUMZ{k//69HF16=579RG:OUA?K^QHN`czpQGTS\m|k<8MxpQJ:BF) '>8FOZtŒVob]]\tƺ`/'&-.46/1*-54,.153OE;81373*'0OwdoltYagnrtw{~|zĺ̿zI/131/944364/07=AEI>AWR[J=C[H6HF<14/#(#,=wfKosyJJPNHINOKHEKMMFA>CF?EBGOX^iw~sg_JEPNPUXS_]blvot|cA8ED:TWj}P'++.]h5=G:1:JH7HcC?DRWDPZPt9BMcjv|{J4MfC>-04=0))8H^]k}Ħ_`rb\`is1,'),+,@A33114+/6?0QF@>3.81&'*Hpim_{[^gituuvy~ȼm8./.1-01406..+38CJD;MS]SIEBTD9DF;734+,&0@t{jQs{KJIKJJJEHIEADFGED?H?EDIQR]fu}ucVSHJRPXaYXZj|wtk|{i?ED?Farnu?(157=`>UF?:@KD=:^WC@EPIIDT}t=4OZxsi9nU1:-(-AM48EZjrinwŸi_^Y\]cvț<,),-;608F95/475-5?9MC?D-050.)*Cghkd~]Uamyrq|{|θĶQ0/9.3/-90/930-5>GD:9VU]NJEGS?7HD4D16(-('HrujSyMNGMJJIOANEGIJKGJCE@@JOSOYct|~sbZKKERTTUS_a|uuppzb6@CAZtqtm7*0;=6<VVJEFBSC83VcNK;KRGASjyW6IFS}mxq~W<%1>)",D[_gicpdj|zZkg^^\sǣ@*.+&+8815;98,4=11/C6FOPD891/1,(EndjbhM`fmq{xzǴĺt@6-/,401430.,6975AC@HNRSUOEOM:0E<8@54+,(*AtxlJxPPMGGNBJGFIHFEDHC>?ACFQQUWat{wfWKGGRVXX]`qjjjqz[8@FWikbp}|[<,:=73A[Q@EPIHF@=DbOQHBOFCJaliD;56Rwxns}0"-B, (UxvolbcbtǕUfcZZ`j¾B*+')'.DV:5;4<1/:791;8ENTA<90.'-)@nmi_uhW_fkovtzŸǻP6*,///,=9644..4E:@==EJSOPHDJF:9D:==+3+(((9rtyGuEEHCGDANDIHFEJHC?AC?JIFMQ^bnqfVGHIPMUTZnonlitzY7MY^MHR{lgF.98>1:FG@=GSG>FQPGX[OF<AGIHWb`g<.1?Uxzt= ))3KmtqmwǭX]wY[gjzu+'*%')9PTC6300),:19179IJJIC3/4',)8ilc`sbNT^dj}sx~}}ǽ|>+*0,/5.;F656-/1:6@CHOMTOZDCOOBCC?I;00-'''0ozNwMMB>=BAHAFBHGKMDEEBBGHEIRWamwkTMIJKRUWaqdhjitzoW=M[F6;WkZF+9>75JSC;A@VF>BTcQK_MQC>IKOVTXua@.5=[r^)&$3Yqʺk[pj^go{Ţ;)1,-&+CWgH8<47,-A/4,66DDVSJ14)-+):c_fbrh_\]hk{tu{}~\>/+1*,-78N70015<:5@GHJNVRUGBMNEMG=I@1/%%('+a|QIHE=AC?CDGNKKDDC?E@BAFKHVYamyqjUGIMIOPYyrachhnt{mM<JF9'6o{l[=49D4APHD=<>_MAWSokMb_WUJMNUQIN`uV:96Mb{}vzp5,,*(Ef}ļͽ|QauZ_pxF.0/*&*,CboO5051(+<7996BFFYRP1*-/++=^oZYkkVR^adtvy}zǻ}?1/,10,479;01331:57GH@JKXT]IDH[SEC=KG1/%'(&*VyaHG>=>@@>EGAGFNEEGCCCCGGOVYcopgUMMMMRXjyfaaaigvmSD@=*)>w{rG<;E5>@IB=:9OGAABfzXVdcYZQSSSHBJqwVB=<DX[Zqa+ !(VwgiqϺZbr]U`vy+)).%)+*BcuV6--4+*=76:8?@JIIF6.7-)+;XkS\mg_JYahpux~z[104,5117<5834658<6ACKG=AWO^JEHTSDC>GJ8/''&&/Ex{gGH?A>=;DC>FDBHEFGE<:BCPRMV\r~scRSGFMR\ypb^_dgmxqF71*)3Yobn=31D:<AEE9;5:BHDCbcUdmkaZW[MSED^{pN64;Nb]jW6*<tmasX^mi^^hϖ/ &(')+.(9MhK.*-7-(6:777DMTIJO810.*->dtRZh`WKW[anutwvjlz|<0.5*03,353/:1684;0;HMF@HXI[NKT]CC@9>J6-&'.-1BwtjA@B=?8=A@>@>FKDJBB<>=DJNRX_m~qaWKIERVpr^][aknvhF670+3aW4nmP57I?BBDD3>=6:;=CfxW^qihfYSIKHCFY~qSB=Npahwwcm\fyyĨ[`mr[\h|ļC*"'!+/*-*0EWK/3./0)870>=F>P?JQ>**-//1c{Q^afVIV_hispxw}wkno{|~|zzv~wiqw~wh_fmz_5700+0.0;9.3-9/-:948ST;9D]BYEQT]@D56EHD/(#+*+At|nt7769?=9=>9?CDCGC?A@AAHJMQY^lx}rdQBFEZm{iZZb`ivbC8,.5J`7*DZKB??;>DSRC:8449AJnifingngRTSKBAJ`~sYHcsZT_{|fXZvzzȰiYmxi]dp΂/)/1+-61.($@TQ1&*330/14>?F6HDMVG.,-+04Y~HUZoPQM\chpr{y{}w`HIR\jqsv}~|~{yytyrvuroooutqrxwZPE[bgnrmgpwF-/0.-1.798.3/4/4>4;AKK4@JW?RAKVUBI54;GE3/"'(*9jq;:<9<B>@@=BBKDBB>>>=GHPNV]cqqcUJGJpm_XY\bubG?0:>fX9*8FE>=AF8JQSC?@34>8Qrkrp`jmj]OQQA?Q[~|d|}R;HdvcM<cwǻ~Pcsof^iѵ>%(1144=4'$-8MQ>1*,8-*4/9;B4FCORN-+((.8Xu?O[oZPGV[jnuzz|zv^XWZOKJOY`dmlooonutwkfb_c]^VU\]]gktz{|}yf`]V^gitxuuwf6)70.&006?5/753/8>8=HOP9IPVANHSWUHC-/AXI>3%*-,7g{==8?797CBDCEEEB@BBCB@NRRTfivyr`YOE\p_SYW`kz]=86D\YE/%*3/8BQP7ENX39K9=;7Ixpoi\kswiZaXD=BP`JH@`OCCBUs}{ǪZZlu[dhzc'')1-1341.+/5AKI0(,+3-76::B9DAOUQ0&'+)4UpBUTg[NKTaipl{||}yniqhf\]VT[WUY`\ajfptnljkbgcZ\]fbjsuw{yywqsqlhpx|{B.+.1-3/3694-+)/6=54CND?1=VZBSIRTR?<,,<[QB3(/4,8\~<<987<6==:AAH@CBB=AC@ITSX_iv{ubSPWx`YTX]]xy[B0:TR=C/1(,;@NO]8EPI86[@>:9Eyvsfh^`lhjsnd[PSQ\k|A98QH.;F^yҿP_mZYbz͉4.3-,9504-+++1;KF6-79.0779<B77?MSV:+,0)6WkETVf\VPV`[jmw~}|~|xsofacadcopmuwwwrttrptnoopsqptv}|}X6+-4-+.345=/,.+-0956IMC;8?ZPJS@MVUF<,39RS@4&&1,4U46;;8?<=A>>CFJBAC@BECN\\Z]ku~|u[Y]yudXQVU_isW>3@W<;A:4',E=>;;=FYJ68\YA???rhgghha[mzqmg^WaqyZMHDT:KVt¢o`nbWgxϥ?-*1,40/64.5)*36F??.-1+6?8<9>B:ADIRA+,513Vs;VZYYKPP_chjtuz|z|~}~wxspqtvyx{z:1/005/319=60/0344><<IJ:9:F_JOMOMVXJ:39@`dA1*.0,6T~}888<9:>=<B<=D@D@=?;EFM_^bXozxm_h_SOQX_bv~~k`F9JK=CG9+-=909>/7BXH9=Mj;:4<pORhch`cYidosldbhV]Vpi=?hJjkǬ[ms^cvϾX)+03<57833/.'+<<D<?/*035?:B:BB4=GMSC.-(,6QlEMT\YORTXdghvvz|}~~~||}P4-+00/03.:>..10315>?ARC5=;HcNGNUMVXQH/5=Qc?434/+/Po~:97>@<?7?:??C?A=@>=KKRYWcckwzspiSNQSXZqyzyh`N@GE9NS>/:;-$60.1AdO86GfE:3AsR=XXfjljrdfbXZdZ@;Al|X<ha~}xԴaarjisł;3.51:<8776/1((5D:=:4,/05>C=B;D7<>HQG04339YcCFMWVSRVRfgjsxvzx|}{~ͻi=..-1/4,8534803.,-5?5:D7::>O^NERJM\OBD>8;UcG6&)1.5Vn;;<;@;;==A?=EIAH?<:GEQYTbahr~}|bQOMWTZ_tswyvfgWGHAAWhM>E5+)6-+0HfM=?<b_07>kN;>Nbqqmpn_SQYhX=<>UwvVys|w}qankr~ĥC6-85-596:1/,))'/4=89:+,-53@B17D>9=DM?4*.4<Q`MAYVRVOJO[cdovvzyuy{z}{}}{}ĶȻ̹|E/,,*,0165568.))+*85;379/5;CMjMEKQPVN;8/9GI^O5&)5,4Qi~77:8=9:C;?BFF<CAC6=BKPUXa_du~hMJIPUUWhyjkxojhABB3BtC@>/''4*)5SlT>:<al5.IqI@5KT^qp{zo_W^aN=@9Qbugpx|Ӡp^nvnïZ//9;7<974848).1.//8@1>8,-/49<7@D7AEFPJ;//3:IZG:YTTTEDJVZclrttxsyz}~~|y~~ȼ_6-11.+./073780+,)-:7>;@1857GQpP?QQRTN@96CO?]X;-,./0Rk77<<98=?<>:B;>@BB88>GXY^_fhr|_MJJJNPW_pollpglXCMN9SHD.((04'+DhfGH=:ToA/DqR1/DTZ\]p}{o``fJ<V<D]ccn{ylXpxvs4075,186457741-0)1,5>87;3,-18=::E@AAHODA/*+:DTJ7]TZT=FQ[]imntuyuz}z{{y~z~~{y?*,1'/,/-0E406--++)3-=J>.-+9:UtOEXSZYJJ@9F>M\\:01.-5Rc|<<:86788==;CBBD=<6=AGVW[^`cqfMHCEIOSVmplroc[ECOZAizS;)*&.-)5Ujh9QH7BsR=Z~jF:=]SUNG[ym_ZTVOIS]Tjxz׎Pgx{£t>,0493-078?<754,.*/*091:7451/1;D:9:?AGGHF9.19?IO7XQQQ<NSU^gcnqnwt|xxyzz{|~~W/5,*)1+001<0/1,1/'07/8N<3/+=BUqQ@TO`aHB>AI<C_X336084Ua}<<:46<5=;:5@=9?=988>IST]babo|}mUC@BGGSR]xsmjnpqQ:>AWHfI?54701*.Vnb<GfM5nc@gt[7;NX]ZBBYu\nwWaOkhgo}s_byÝ}65.7300.376:9>;41.-446;7?8:6114<KE=;=@FBJ=31.9MW[=QWXJ;EJQ^aglposszuwvzu|||~~~m?0*1401...5?01535/087,:G6000:FSqH>JIdXJDAGJ?:Wa<-3.84Nc~==94;8;=<:5<><:9<99CEQY\\^^lwtbSCCFINR[rojgjsxfH59;9R\7-+17,1+:\qU4Cm[:d`EwsnvB<RTahD4Nbm|QwnxrcwqԤar޹T5;8<=:<7>::A;;8;14.4:9745.997653=E8;9DKIP=3/7<MUZBX[QF=FHIQ^cmrmrtrtvvxv|y|~f?+40031,..;A/1/55..@40<G949-<FXjD@MHdVMRGGB=;b`4.:./0Hp}56015<998:=:>:;89;9CMVU[bo_gx~l`MHMGOPSfkdhqyxjN8C54h`5(%/84,<GksK09\]OY_JqpY[NQbqwQ?<VWz|VTrvp͓jÖj6/1;9.76517>779A7=/67<756016857985AF@;IHBH>87-7CTZBFYGM?ACPSS_ijmmqporxw{x{~~~gQ3(,01-8414?;578B607=51;D;700<IYiF=PIg[GPEF?<=_d;,8:74Dt}105055849697<8;8979;HT[^^][luvo[ONDGJNRssgkiut[J074AtU.,668/,3UrlH.9;]R[ZUvlEt|^\j|~`GA?=[pfjd~xwϕϕ\?889::98759>@A89P<8668:7<;51=?A>>?7ADB9AGNNKA?63BG[DC\RTH?HTPQ[dgkikmmrxs|t~~y}~}z|_NQ6&(5/.+00,;4(.9B3.<937A<>63.=NY_HBRI`Y>QR><:@XmB06,5,;jwCC55.1617:AA:<>6796BJVbb[VYku|o^UHGECI]tifhiw}jM=9=8O{N&&36.#";as`E861VW[WXd<\sou{hGKDB9fyotiNqz{ћɗi@<858:8:66:=:>>D=A:5.8=A996707??@F87@HG=9?HEF<<36>GQJ;]XTE9IJMIWZdipnmnlptxt}yxy{}xyzxy||z{}zxv~s=XC9-*-.,')+16/+4;:9==3479<;403ATc\HKWC_WATGB89GTb@11/07@m}{x;<65577433>5:8<3>99AR[_a[ZYfu{pYWFCAHMclacomsr[A41>;OvI-&446*&>k_E:3,*8RcZyZ:MpfsjEAEN4Eda[}w7|n}ɮ{<6078/037:>:85497:1-//*38=1160-:@>>D<7:CE=E@AF8608;AVR;OTN?<ADHIWVZgiqpkjjrqss}z{~z~yxwyw|{swww{{G8]?(,1.)&,/001.09>8<G:07;159<0-?[q^FHVGgaIRFAAF>X[A17676=i~~x{31135:7;189/550056:HS\d`_Z\drzr]SEAAFNhi_gqroiG4*7A>\wxB0/070/(Jh`B=73*,@ScµjF?^xw|sJONW9O{}ncyj<s~Y~yٴϓ>1//031-1810758<>9C<;.**4:95895H7;9<FJ84F>=?:CA:5648BNM@K\VB;=HNQSTX`fmmmlnrmpnx{|zz~|zz}zd3;X<-,.-5(/,..807:65OE96@96;7B+/<Nx^@HQDakNJGB?AAQ^E/?J9:>hzty885437:<6.376100168M[cbda_`hv½}s]WGBCMPbwdbgmvlZ?:65:D^^G/,1*,'6Qf\AD@55-0?hœ_<ZvtW]\_Wmryif[QpUjqxأЏE6-563:>=:57098<::8@;3,5-8990)51834::9=75<8=?8;B?8<189HE9ESXDC5JGRVQX^]]cigjslpmuvvy~}C/>Z830-0,.0,16A:;:3;RC;4<696;C+1<QxbMRRHg`NBN9=JCQhH7B0655d~{x.-03487565756334/1?XrggidcjrwqdMEBCGRcxcbcmaRMDM765I[}D:653,%(1R[P97C>;,%6oďW?k|yddmuxiXf{zmWMX|okos֫U78595777738647;@:=>C?97578:>:6;?6:49>B@=?<?BD<@DHD=398EE9CRVI@9@IYYQ[^`[filkprptuv}|a./AS8/1.,,,50,.?:1;68BG76633-3?+.9Jv^GPNG`cKCJ?@@;PbT031644_y}@?60875716306615/7BWjflfnbjq{s]YI@FAMf|i[cgY[WPJ<=EGNvi8=474-$+9UcV87CG8/3C{wPJ~oldy_STUzvI9>rtl}~€:4316/07-/5-4/0;;;61=>61,13==655844:46=;8:;;5;=<C>A?-04?C=:OFI;99?IMHUW\Z^\lihjmsvsx||B)/OG3@3++-(34/4<64@898?936::169,,<SwaJUSMa\JKIDDDFQZR544;7/\|~xy7765059401413331,5IZhmpkjdlsv}raRJAMFO^}q_hd\c\MD<IRMPjZ.99../(+5ZfN5:CI7:DDmÌbyyVokpkqDI[Xx~C8:`jvռɄT:,+).-7:70371-/1@;71==54'45C50/55943308:<>@;>9><D>B90+88AA;DDNA<7=GNIIQX]_[dnkjpqusxw}|]4-5WE64#(,+16015793E;9<>C4579-6A,3=UxdFOEDbZWNQDHHDRYP:61=:*Uwzz6617593406/0.+./49Q]jllnkjlpvcXK@DKGXuvlvf]bYICFZ]SGgF7@;//)**@]]O.4@F>;-6Q~^f{n^qsxwu\JPf__uzYTInuKzzآK983/406678/33/3869A<<B<;.(/19;409:<4.1955??>=8=@<F@B<,/4;?A9?>Q?<8;IHF=OW]Z\`hlllnqrruy=/+5QF1-/,3..5146338N8:;BC43@:,59*4=[{cFPSJfVONRHGMWVRHC13A>.T~~w|x1330-568704010557BSajkigkglp}}qh\PKHDQWhz}qms]PPIBM`o[R`B786+)()*BZ_I+-1GA945Jppzgyj|}`xnt{micPQ[WYc~cfgwm4kfz٧U735/35786==?571-77:<=:@83/,06A94789?5150.-3>=:86B;AK;86135>A@=>KK:54FEH<EEUZUagfgmnqputu{i-()5J95/,...30-.1>8?E6CJ<<04;30070/Bd}dIKTKiOMMMFFPE[YDI:6>@4N}y}zv1115-1.3616568516EUdiinklhkr~~oc[OFBEMS_s{vlkmYGDQFRic\Zh?>7..+),/FfdG3)0>BA99CmilYv{vvcmxt}qgi]YSJOYwtk=WhiץJ95;56/365979<3885;19A8:C;68*179@/809::0-.0.19?;;7:;FE>83338<DD><DG935?KQE==BMT[]^afjonquv{E&(.9J8/+3+1441079;<I?<BO5455A193983AdwdKRSOmQXPHFGSO[P@M<=;8.J~~ztz..334//6;49045518>Q]jhljhakv}}tbXOD@IPU`krqhgphJKRF[_ccdX=7>6.*()0Kg^C++05?BD@BcbhWjt|}tmtq}snq`QKPTtlj7Slr}~664@51455<53-45/8.+:>D97D930+18?A/163:@0-.1431;9;89<<G>95143=?A8C:G861;IRG;39DIQ][_adijmqqxzv0',*@P5.*1*-6-01>7=B==@?<33=CHA1.660G_uiHSTQmW[OBFGOO^P5PCA9=/V}}{u../4.305503013<68CS^kqooncku|{odXODEOQY\dro^hoaKGINPIM_dZB5D<11(#.Ci^G10669@IMR|^kr^O`mvq|}{{so_NINzcip/Frbx^1/AD3/,-/30065370307JJA697.-./8:=6.363=44-41361<:94;68=B:7:47A?:>>>=97DIPN;45:@HXNVXddfalprtzyc64..OS33*00/36,5>6>G;57CC/0;GG(4.0;:Mb|mHQRMpTZKAIEOOVG3SSA475P|vx~00//,/-304.07/3.5CY\ivonmjdoy}r`SMCCFWW\kxnamrX:8GU@9Kdwa:/C977'&/BhWB-'0;9@NRQsYprI7DFG`r}|ynXGSxfcq/<c^X48^C3-466867<4.::198dC@==9/)'39:?54015A751/07315<7=A9?=C55?75E?<8ECB9/9HRO@6/69=FGQY]dbahkqsxyD*--4UF.1/3<863.7;5>J;;<C9,39Y?+607>8Oa}oH_OOrQXKDOJFNRD7Q[>043H|ww004506904/.433116N]\_hmjidio~u`WKBBKRQ\hnh__mK9;SK;0FrS609<>>-4)@fZD0+=D66DVZ|UmkC0;>>FV{v}xk`Qnrl{UGNRoTD:S`:41818967764460.?@C<<;:51-4;<D1.)03:?7..0.63/16::>38<:6;:<=9;;=@BC3;HIRI;1.45=FKOT[^^hcosz{p:''15QB..-5156114;6;@C@?C6.17N90<019:PfoSPONtMZRBTORPVC5K\@39-@xxy./..3;15..,--58,8GWXZ_cbccjs~tbVKJFJTX\dgdhZNK?=IF6/J}U04A?@6.06A]XF-47@9.=T^YfhH;5<85MXpnu}mhh{raNI}`DYT<BoG455:85B<441387:/;D?>?<?-0/3:@;15;704@84.4/8467=<6E<:8::;<9<=<8<DCD87>PKNC36/.049EKT\Z[``ltzy{~\6*/-9N9564;685408@59B?K953+46A:,14798E_}mUSUPxPPPBR[MTZG/MZ>:C+Cyzv10/478;73)-/3<3:CCTS\_dcdhit}}u_RFCCJQS\ngxzZ8:89=;94Qx\10=1@:340>RQD0-0C4-?Pdht|S01CC9BTWqyysoxto{\\ujOmxP9:<NJ?575177C=61-83856=FBBE@7/3.78J?.43793:>4+./11/4=;7=>63::7;7<I>58FAG;4=MDN=5/-1.1:ACNMWU]fjqyv{}}W1.,6BC75:8=:75;76678D8T85503<<<,37-?;NjxlDUWRsMVSFWUONPF5Z[I<G-I}vxĽ33--087405/00/.3A<MQUb`dhhjvo_QPFEHOS[bh}o;797;=8,7PqgC)6<CF<1.;XGD5*0@//*?ixZ85<H@A]`^op{unuuzmProZyU9:EJ:66;0-89:;=74051157B=>AB13,0<:J>745663DC891,510060<=@>1<E746<@<;6BH=;36MEJIC133.+77?@HTVY\`oqv}~tU-&,4GB3785;==77679;<>DN:6439:3936:0<APlykIMSPsEPIBSZRHPN9IZJ5?-G|xy~ü54.087775030330,57EOW^dcjlw{r]SI=BEPQZ`u|R=436:4>.1^ciK15:>ID43FUDF3&08.-">_}n;48JJCanZsrmt}umu~w_XZOco]C>G=7A;5541156311-01.;=C<AE>70/.66IB0.439.5>:/,34:./539@@:49=;561:?E?=I@:59BOFQN<41.,**18ABHVS`gntyuy{x{rV.*+0@;55:>?9<::86;8:>BUC3/;:53:;371?JSkxiSPTQnKSJKO[QQ[K6N]F58-Dzyyſvf5854033/--.,.88055>NUYahgkq~}o^TB=>FEEXlbF?53.33D9;jmWbE03@?GJ<1NJDE4..:7.**N{wP:0PVMTj_c[g|rvSDJY`Y`QA787>4808:<8998345=:@GEHOB44.,-:F@//47<765:6/.09561/49>=8:@@E<6;>?>?G;94>KTHNNAA:576/06>9ARTY\fhjhntv|rZ/-35E:56;==9;;>:9:<38HQ>:7:C3.5<;;98GXhulS[[NjKWNQR]VXYQ@ScJ?80H}|yzƾxfU?=300.-../0/,(-,1779;EN\bcllszp[QGAECFOgvVB:;:,.7EKJlVD[G73;D<BEBIFGD5)*974(.@|^@;G`QMTZ_|q_r^p~|v}`HQoso}^:4519146473374:85;:;?DEJTC:;11:<MA9056A5<;><55749:9747<=<@?CC;;6:;?;A;;:6>MGHIN8550050,68@BRKMO_Y`[^cotztwyumX1-,8B>?B<8=>8;>7:@=8BWK;<6=J59>57/4>?WfskK\WUfQ]OMRdTYWMAU_I@<1S~{wxxdPD;531..-80034741,+,5813;?OXbdimpv~|m]TF89CKhzfZH[i4-,+FSbpP@PQ@4;CH=@CX?;G4*,97<%"0}|ZC:BSPIGCYo}ku_`itt}zw~{usD141.047>65655:3489::GDQQ;033/5AN@6;3853;6::6144:0,04-968:A=>:88?AC<FA;6;;CUKIKH?>7>/6,6:<A=DHIHGFCHPX]aajsu|t}}ydC,.00;;48:;8595=:993;8NB6569;6715:8AAAXdvjSZXPfP^KQXcU`]K:P_H>?.Zyzy{oYD6533/+,**,*04/3./++,*+4-56=GZcgcfcnx|oaK<87Jdcb\v15+1;OcaM?CJC<>B@::KE>:;5(,8/8,/.cJBD][PFBS_~v|hY^|zWriA/*,++-.0364;;7557DFMGQT5,)**7BV=6./1037;>83.//73-+168769;A@=@;BIFBECC6>@@PJIQQI??=?F>;BA?:E<;@>EMMTR_\cafjn}}z}t[I55-;3/79>66:>==;=<6;=TG79:;;6<8.5==CFWcvsUaaRdSXGUQ]R_aNDNXR@?3\|{||{vy»jM<6.-+,//,,001-..31,0+,1+7,*4ABCXabba^hwti\E:CMpВahw|3-+*3ITXK?=>D;?:5:GM>-/A8,-4/5+$*g\RUhcTC:C`xupSPir]pO78/0/138:16;;3965DKMGSQ;4+,,.@[>361=6319<;6/366607508639;=ADC<DI?I@FB;7>7JKEU\MDH=>>:@AC=DBGFKPUa^]bchk`jqv|}x{m`B;56:678=9:96<3B97:;8;P@59<80-56.0;CAAV_vqSWZWfVZOYK[S[aHCFNTEQ6Xut{}~~{yv{|ſxbN>7,*%(+)+++.00.-0@510*--3(+'+/3AHN[gf\`hp~vdWG?N{ۧ]j]j3)+.1ATP]B78>K@A;BJI16375+06+6,.7_idraOE:<cluT?Ymvlqs}tH>796856454455388EUVFWU:36./.@O>41/96//5<99-101:7+/65;4<>??A@;:;?==BB8/98>HDQ[\MBBD@IJ[`c_djicoqrvv}y|~z{{}}~pcB431:5:>9D9AE3=8B>;-:;SM;<<>07?:4/8F9BRbwkQZ`^cYYJVQTT\ZN=NKV@H7\vvrwtuxzwyxýycJB9..70%)'//106/0/033,3))**-+*((06AKNZ``[`bly~q_XJZ}ޥUONIf8.(''<Nb]F338HE:9>KC>)68/,.1,0('-\uT[XQG88E\z}ECXkjRd{UHguvV?60,)-..5514474BTPHZP:3)+(1GK8955460.5:;=6-86880,775489==C?BA;BB9>>>:97BIMTWSIGNMUY_rqqorqw~tMC@=9779?C==><98=:98;;CA6:A70-=08.8I7=Q`vuXV_ZfU\PVOZXW[BBQMMBO>c|rwtpruwy~|wvyv½|gR?57.,*&%)%+739870083666351+++-,+,.5?IQ^Y]YSYhw}rdZaTG>?QH4,,'+5NcUEA<<BHB;GK954;:6++1*5,*0`ylNIWRK=:;Ja|}lFE`x\Jkc8HQWqgC*)+&-/(067+/3>TJGZQ9-'*+5>H<01.73345561.)51843-5:7015<?>?695>8<>?;9.14=FDFRRW\S`hispwx}|wiUG=5;?A63;=877;:78>>C897711::60:M<<V_pqUUSZnXWOMO\Z_]J?HKIMG<gwjzpmquwtx{y~y{~ywyzſtbI<1.%**,*+)433>=>@35=@956:1.)),'(.-*6AEKQYTNQ[m}zrhpK[[CA`NA9C4)0H`^NHAEDE;ER846<BF4,08/56*:l~{}scNO\S?;4AIXj]NUrfKWzIAB8BxvF,)*,1,0.4539@NJSZH3.')/4NS545.3..09596:-33313.,37446;:<=<87BD:<6634136MFIU]ZUZjnpqs|z~ɼv\FC9;6984:?96755=8??465+)5:606K?=Q[upVVSZgT\PTVXUafPMMTII@Ejxj|{wmmqtppuu~}w}{}~vz~~{}rwø{fS=/-+3/-*;',-6@HGDH;:689<=7/.1*,,)+,)5?FHNUROKUfyzyuݝPFzjK=OjK7,9*+(DjYGM@;B=MUI:475UQ40*331//Dt{mlNST>10:<FliYmdY\PzzdJ.0W~öq>,),/1131948;MJO[H51*+(:VW7.14358-06=98019539,54914=;=8<E=4:I>77651106KKTPRRZakovuy÷nP93>7669773443:660:4*67H;13;JAM\oqWUWbdT_QPUOO`bJGUSAM?Bornyyuivqrpuwvswy{zwtzx{xyz~~~}szýrYD6.0('(&*3358BJQSNK99899AG4=36,/(+'*):=@DJOMQJTdwءQAWUHD:TyZ4)*-#)1=hdZM@:;APV?::=5]Y<3050970@p}uf_JGA+*-<TzhqtpXTbu|m`M=CYxA-104/7-96<FFRYUC98+5,<Ya4/13674934;<:4//1/53491536:<;;?755;G=7;/17..BHMUTYcjotv{~}̽nN?<6;8<56.85;:6/50)*/1-817VBR[nvUOWXZQhIUPIR]aKMOSCJJBs~wm~r}rjtquwtqzvswuwwwz|txzyxxz~zztwv_G913(%')*/4<>GJPRNSJ;<@C?D8:63/1541(('/<8EKSSHMVbvƂM>HVA719qM4)+.(0*Ab^XHK>7<BH4:<;<OpP39E79/38QkotyY;6*.:OczZ_n[Vtpst`c|];7Ko>.345619>?BHQ]U@41.7.BIV:65048;.134699./1651,/576969>@CB<==B:3;59<58?MTWTY`buwz|~ƬzYKAA=69=797?<704.63?6?8@XSU^kvZJUU[XgPWVOUb_NSUWJP?Hs~~yy~}uuwvrs|yuwrtxtrvtrtuwwxyz~}}|vzxž}bMB3-/+,//67?@GRXUXTQMB@BGKDC<:75644.'+).9>BMMHCNP\nzմpH8BSYM41Xz7*&')&#';W`\NFG9?AF@0::;Dy^@=>-<71>FXkjozN*.4<^[rtCRdjYZggzuTiqaP7Omk3,,.-07<MEGOcT<81,.6:AW9::/?:77//163<;:611;48>?::/4=@@CF::9947A7148>PVZVYakr|~~|~űvZG>=:788;;8;;5477=46<@H][\twbNXQ_WaHTVOQc^OMQTRUEJy|yyx}|uwvwwpttssvtsorpqnsprxsw{||}z~}~|wyvÿ{kN<./'00.49;>@DNQXOVQMKNNEJ>@E?>9;6897.301:CFEDDDFN_huҩnQE?U`M@7Es5)/..))/5Nj[Q<518JM4:::<CrnPA=7;719KFMlx\dzWVVYXcuWPEIlpYW_hsIMHgcUwz}|S/./838@AFEM[P>;6,.0:HYBA5/:>71.3+97<A34.5:577:5414:;B><8;>@<78=739?KTV]Zcmwvz~ɶ{bH@756338>3,15'0.4=?D]YZgv\K\SaRXHPSJYbWOGFXXR=Mw~z{|~xxwwrqvumrnnlpnpnorlrmlsuuwuwzu}x~y|~}{z}yurvſjW9/,*'0.8>==DNSQY\]\PVWbbUTKGMC=>497;803/6DH?IA;B=IU_o|զzWHB:PKJ9CiW4)&*)%#$6K_\R?--6G=068;8E|nXHC@PA;8A7;IuhT_|{~}_IURRX{s[d^oYE@axz{zZ[K;,.478>;DKWG4,(+++<P_@70/6;74546,6;?6307:986.7;548?=><;<;<>85;;055HIU\^hnyt{}ʹ~_A613+17,()5+-'359AT\Nc{_HOPZSWMMSGUbUSHER]N9M~~~}xuvvkmrollqqgoojnmkqpvuszzwvtxqxvv|yxw||usrrtwudK7'+(,019@@ACIKPUZZR[S^_sshkZZNDIC@79610476DFBD=6<?DNYnxǟj[H@BCM[Ac9'"(&+-(#-3IZRM1+;@=.360;JoumT<=FE>@@*+1Qx^]nwsypADWg`N^wobdhy|hSOhU7~s?*,,1<86BKZI=.3-409WX?740;;4-4+1/6=8977.15/50751,18A@@;>9C=96?;/6:HMXY`al|yv~zӽ|cC0/14.+'$''&*7<FX^KZz]HTOaNZKRXEY_STFEGHF8O{||}ywyuonnmonjkgclaknnmmrykqlmmrrtostnqssqlkjo¿iTC69/++,3=;;>BHOSVX\ZWSV\\}}xugg_USNKAC:956;9C>6:>714>CO^rzwkYPDHDcfXY1,%3.4)')..;PXXB1JW,%..7.=\pjW?JN@:PT-#%>r|w_Z?=Q^m}vWAIQjm`NZvzqimryfggy͠c<BY4*0/:59DN[O9..*36;X^<010;73/45/*14:7653.56630666;>D@H9><B669:>347?SJ\Ygqy~~~~t~к~Z:50)($*'%%*93DTQNUwdFMR]PYJRTBT_PKBMNBK7V{zwysvqomqmlgjgiilfh]dgpiqhhiihnmimpoumhfcjbdȾ~fH50.,0138@E>CBHEMWUUUTUXZW_}vsl\YRSOKA=:7=HDB::@839;FR_kwɻzl^NFJW~aa@0*)+%)'*,0.5?J`SM\W% ',63?VujcSPNH>\V*"4H~|fJ6?EP\JXJI`[^bpf[bdtvl{qkp|taU_PBH5,.3>@>GH[I113.*/;V_A03.78/0+65-1?@96351811.3-69<;A>?8@>??B;;;/.3<QTW^ansy}x~|ѻnJ4+'(+%$$)43ERK_XpbBIS[R\RPRESXHKCRD;S3_|yy~wvqoflmjighikdcbcigdbi`ggdhrrqrrg`][W\|¹bG5/-5448?=GDIEEKPKYZXTUXZY\\~unb]XWSCG<?AJG@=7:615=DOYmtı|q^RDQsxvc@/*%%'+*)&'./,/C[fdsP! $33;:OypfXPNCToD&'!):O|lYMOWdNS|9Cisdcg]gkifszrxtprwbTEYMSQNmh507<73@O^B7//(&-<Sc<3-/:43-.70007@9::<4631..3>9;88@?9<GKB97=:4/46JPT`_opsxxy~~}}̯`93,&&''%35JKN_UpkERN\MXMNOCUWMJGJNCT3_}}|~sruomsnnfigffdd`gcbg]`bi`lrnvrkh`YQP]oɽmO.).,/6D@CDJGFINQSSYWWVV\XVVV|pd`YZRHEDAPO=A9;4709DGYkw}n_TUdmը=4/&&/')))&*1*++6Pbz|I #'*5;Fz}mVKROduC%"%%*9Uy{i\o`B]mA5W{jkimxoW\rwst|p]mF7VaS[58869GHVD531-(,:UQ77/,8501.1.),789?84565/-417;==8@?AAOKD:9:84119?HTbgkkxxw{~|~~|ƟrM,,*"%'97QIJZUlcGJNYHRHJM>USFNJRO=O5c~z{uwuwqkkpifgbf^ffd]\]f]dlszurrobSOKRmÿwV;0(15AMRNPMMOKPISXT[UT]V__YYYwrpf^[VQJHQTIB=:6413BO_ctvm^Wh\ڄ7./,-,),1),4-*(-7GSG"$('/7C{tQNPPz|D4./%(8>Wlh^\yIEH:Z~qgkv`Irys~zR60Akgf:8958BMR=:/*(&)>YQ8854:=3./85,-9@;>;:<1=744769;95:?GEJOD?8@>147<COWijmosxrryw}|γX5-&%'7:OH9ZZjjFDJUHVKFKCKUCJOTG:I8jzwvtsrrjmffh^`cc[]^]bhs{~x}umbWPIUhvWD4..:BENRRQTMIPQKUWV\XUaV]]^\Z}znb`XTTUVPJF>>0957AO[ls~raaoif`(,5+)(0*.+-,))8A?KHxD&"%$$5<NxJJQdzf9.9*))6IT[ZOo~fhGDSC@Touq~pOU|{|pmpk801[gZ6/8<HKP64,/(&*?gZA:5.9>>537..-6@96;RI444417571=7;<@=CHOE;C9<609AQT\bhqrrtzzy~~|g;/#',.@>1C_jgDAMNNTCKPEPVOIIN@<E=v~|}vzuxrmrmk_ig_X]Ycbnz~~{zuj[SOOfĸcS=0.51BHJOQXTMSPUVVYW[\]`\TW\\WY}{rkc]XVVVRGI941,1BJXksxs~sYoȣ>/-(',-)/-'++.&Bmg`\zmC(!%*CtgCMWsgF/4<0"+Gh[`C;H[yqn}dODCVWG@_u{tydYqx~bivd6)4RhqD4;;GN@59,.)//;bKG145:;785<03.47<7<HF75:47-487839?@>GOVO;:;;54:EWT[fjm|y{wxxy~}~~ʦwD1/3/=<6;`gcHBOPQSJFTK^WMBJNA5I?x}}~~zttvnkjppi`]X\lnmwvpnZKHSmʸ}[B00*58@FPRTTKSRXQVUYZ\bZfa\YVWZUY{svgg_c^USH?1-+4BNXju}}cxx/1-+*0*)(%'*!%-8pyq[F/.+5NtxI=K\\M?B8-.*>jufPD8<FjpX@;;IKTSAEcyuniz~hQqguN&.1Qui:67A?@74-0.,3?]RJ<46=65:4835473>99AOF75:6<56=@?5DC:@PTUF>;4;49<TRc^joqyxw}{{~}ϳ}K/.9931;[jcJAQHISDCTFSVEFGH69H<}~}{wyrtssvjhj]fgpx|vsfVQGYyƳoY>1(,+4?PSSXYUORMRRZ[]^^a]b``VYQUZ^xvmdbd\VRO>1,,4<EYhw|rb~]7'//.--.)&)$!%%+=jula^lrM@IETFHS\1(.<b{zQ>==FT{rPSO>=RTQZVGOlyxvz=DB>{;.55mjD58CAE>:764,4E_NI>7:B>89370.3<9>:;BB@:8796168@B@?F;9MRQJ968>:4?[U^ggvvywx||yx|~ҸO1/90,0Q_[C?HFGH>BGAQVIGGJ54K>|{{zzywpmomlb_cvrzsc[TRdsW=B(')6=P]WWZURNQQPPU^]__bh_ZYYYQUVY~xjnj]\NEC80,78DZjwWbqx\:-,-+,03,#'*( ")0A]nthGIPT@GDJZE*.>jaB:=AKj}fI?QI=>=H\X_THXuy}~Z000?o7'0Skr43B@:864-/14@cR@<81>87</7400:3;:;D;<?:8655/5=E9FHD:JZRU78:9:1DZRZakquz|z{|~}}վP53++4J_XB9@BMGC>MGYPANIH44:@||{z}xuxuqnjiir{}|sl[VXoɻ^F1,8.5>NWa][XQQQWORV\`dagjdccbVXUV\^wunb]UNF94+.7HYgzԥHxbtXF;;3(((*+))/-&,(4?EF>HWbo|zfJMUV]?<=AG8=Kjl@./3AN~YP;;GF:=;@QjgbOOd~vq5+'9d.,B_aD0A=;1/(1*107`NFD30C767974+.3/6C?B=?;;:6456/>E<COC=QXZ`D;<0:3BXTU]ppwyx{{xĿS8/+0EYW>4;?J@=;KNWKCTBG,08H~~}x{}rolmrvy|pi]Ya~|X<,++<=R]_^a]]ZXTURT^dbhbigfdb]XRVS^`zti]TIE>0*'6HYk|rFiIZQOC<1--&/+''+()0.5BJ>(*.9JX]PPC?<EHN>:@ERYnu}pO0,&,=f<8<<=PG;;;B\il[Z`cpvM%"'pP,6XS_8478;.-/*,+7[QB<45854<?9:37@74@AG?C504;7859:R7AE@AXYahK>510*9ZVZ]twvvv{}vqzW3(8CSXC4A:D99BMIRF@N;F)/7O{z}}|yxroqu~{umc]hƹkH1%-19IS_^a]ZXY[YTSV_ddjhsic__\_^UZ`cxogYID=;,(8JYjtg]iH];<?B:50--3)0*(*16DTU;"&%5HQD@DBE<>5:=KX`mpvnp`J;."(/Wz8-8B@CX?C?BOjmkVY_[guwl3$&>Ê;7bZf89901/(5,0.;XS=<68>7191<48546/>9G@C9-475;49=UBO=BIU\ac[E:.151PYMbsvywvy}~wvux|O77HQZECFCG@AMRSXMONAK/9<Y~}}~{~wutxxzvsifr\<-%/8IPX^aZ][XWU[VY`fljnjimb_^]bU[bij{lbWKB8/.9OWfrt|mY.3-784367A959<0<BDNQ9.--:O\OIDC<>77/3?@EHJDB=B<6%&&?fwA/1G@C[KGG?BNlwlY[U^ktK)(.aǺf@uYOI140*+,1-,47YJG565:7086:86.68:>AFDF59647;6;=W=FE;SQbgkkO93-.+EOQVt{u{x|{}vtv}ټyF.;CSA0=6>79JRUUGNEGI*4:`{{yzvx|xtjn}uS</.3BNY]^Xad^`\\TZYbfdopmnfba[[_\W`ja~vd[PC:++;BUgvٌ~b&$)9',16<?<>868E>DOHC5-,;\cUE?:;A:@CC59:=36,0@540)/;YvR4);<FUSPJJCGXsq\^SY_m_wI7:Jϝ[}X@o:<7:04664:=[KE:A8?8=>>>98:=<>BAHDK;894:5<=B]JIA;NYflnh]@84/.AXQ]v~x{zz~~wjs}׺t=:9JC037@97AFRH=PMQI)1:c||x|{usrŻlJ860<HY]\_Z_`bd_][W[hmnzroml`baZYUYbcb|}y}q^\G4..@KUaqy_xm$'"(#'13::?>==:DJASOH81&<UJB>:55<ECBEB8?.,,041>E:00<Qtntk?*-9IUMPVJRNRc}liiVYj{byq_VGwdC;^B50-,.1955>fMG=?<H7@8><;4;699>>BGJ<;D?@C8<DaKKFCQ]ilml_B:87-AUSc{z{wyxpx|ضj;-@D/6/>/7IHJB@JQR>+1>m}{||yz}ytt¶aD53:ES_cb_]]aba^][]jospwrmicf_YTW`bdckknttiSE6,08J[itkRPR$*%/+..-5581-73BOIHDDC4378:<6-36JX_KIC;94%*,*-AO8-.56JUjy]706<HE@JGXKKNrzjcYQ`yilyrh}~~_14AZ/1441/6-4<aIAC?9I688463./057?>DJC3<<;7964:JGGF?NckpslaM>0,-?PJhx}{~zywtsب_03>'+.4/9BPK?EJHM8.4Eq}|~yzŹwYH8?KSYddc\ZY`^_^]_bkryyvsomgbb`X\`ggki\[ak}ziRD9..3NYixÿq^Ek<'&'%,4+-3070)/10FJ:;FJ?30.86-,*9GhgUA9984&+*+,BgR3%():G_vl^901D@?BKXPCF^vk^YV{tkfQnaS}4.7y8/,.*.*).AfFA;A<A16/195/+3=8@<>V@;9;033/5:EGEEAN^nzzkhR8*1,8TOZt}{xvupqýіI3<3+(-54AMD>>D;G1'3B|~ɿ~jUC?BNSbbc_b[\^a]_^diqnussplkb_g__dainkjIIQas{s[J4*-9GZdtuhBP\)'&&410/(,/44//.9IF65;CA1++3-.&/4RkjaC8B?:'&*.-;r`>-''/>TrpjZ0+;CNPMRI?IOfzwiZSvvp=mS:hɷX/6uۧ8%)&%-('/>fK<>78F74/5;*..3457CFKD:75.05-09EMDN;Q`myoo_B,4+1QY^p~tvnrp}ȃ><1/*,64>GD6:?@>-(1D}~ƽs]MECOQYdgc]\\_^^_adhntrnrrrnhbaa^W]ffkll>?FZnwwdK50-8BUgyy|{EX8++()&*7((&,8/1(.GaD3/:=;;500,,++Acrhh<9MMC.*0,*8hiC(&-.=Rgg[cK//DDQINJGNWHr|h]Zy~zZ~R.>Ό:6gP*#(,3&&,9_D<>7:A55147/+07658;DQA/035-.'-6KM?CD_jw|smbC/1*0KTZ`~wij|{»ܷqA9-*)5.<CE67AF@''3Kǹ~gWGIHP^bgg`V^_cfbdhghnqytsqnhif^b[bcgfkll54;Rbmy|kX8+)6CW_q}PWB,(+(,)5++,,8./0=bR6/3<>7:73+.0*1Kbrn\6,SUH/'*+(5UzY3*1+3V_PV^hE1:CRQONMGXF_xla[}{~wzt|xm@,;iȴ]=Xj-)%',(+/9\D?B8<F89:8:5-395<7@CF=7<>751,19KM>AGWmt||wnbK5/,1SWYgvlwlyעW81.-13>D<158FB-*7UįnZKGHJUafa`\\`haa_hgnotuyxwmgbc`a^^gkliiki))6IXgy}o\>-+5CWdyqvJPT90(,**--('+<,3+FkD3-6>0.5<3-+/(.TgymK+*R]O8),($)PziF5'*+NgQKO_hM;>H]ZaMBO@Fqna]kgtoq{c/%)8ŃDTu'"#&)&&'1[=>E4@D13776-6+3709;@F89@:654*.5DK>7P\syzunhN6/).KQZhpcyq~ĿDžM,)+150?7./6BB%+7c~ybTRPVSX]ibbZ_gfifhhmquzy{rnda[``b_dcmnmlnl&'/;R`qxtZ=+%0CU`vߣtgH^g0$.&)//,++391/3Vk8346.0G?5850,+3TlpN4+=[A=-$+$(?drX>/'*>mSA;VsdI4C`icVVHC=\^gby_Uozu{}zT-&'*SPRڐ'&# $!&$9S?MF6CI616:4*+*-,09IOF<8:9.@@/0.C=99Qcly}utnT3'*)RKVkfo~{ۻj3((//3?<0-5H8&(;cźnYKKSTWV_baY[bggdbgjnsvvwsqda\Zd^b_fjglkqhk''+7EVgryva@.(1<Obv“wK) (!++3'()70&-HjU4,+54+3B0;43300XwtT-+<Q@=(%*$"-MffE5&/>oYH=?[ffO=Pugc[TF@GMb`taUqvoyS-%%&6gmR3%&'%%',5S><;0GE55/69..-646=FTUB06<;@@+-:?<?;Udsxy|ypcW:.)(>NTjky{}Ӝ@$')/:q=(/9D5%'8p|~ĵx`ONNR[Yabc[ZZdkihfijpvxrtmcd_Za]`aiklmmonng$%'-6DSivbF*(.3PdvuM|4"%$/7+0),53-7]UC6,-*465641/7./6OrwN*&6N=K/',%#+:HcdM4%0dZG;:Nhl\RPjiikh^OBEVcx}_Vvmm|h:)!+KP7#5$*%+&;SG@>6JE4-170--+64699N]<0<9;4<//9A;>I[ixz{}{nhU9,+(AFdmlx~vo)+(+138*/9?,'';q~z~©r]OOTVY[`gYZ^_ammgopnruuljh`[[\a``ililljnjnj#",+4:Jjs|a>-+*6DVtj}ɦN]N-&",17..+.-77FV>63+-0/5=3)4-5314\svY9.9VGG>&,(#).1ChdH8+U^D89J_kbXO\nlsu|l]GA\nl\Tvl|`iX6'$9OcH&,,)#'(8SK;>@QR48707.0586/4;MW<4/:8:0+1:=9=Q_kwtsuyqaR/)(&DM\lnztuٟF=%.,540+51(!)>~|ɷnZRSY[^c_^Y^_chkpmpsvvtrmbbd\[V[]bjkmlkmbfkg! &17>]mf;("',DVwoԛIH@-))+3.,(.1A5;NA71-..06406.+3+131UwxF,.0JVO@)()$'0%.Mfg\@@lM:0<RP^^[OawyuzqqPAU^aZSi}}`@>P?"(:QP)!((%'&=VM5>>OK96/750-1614;?OH8639061,.5:5?Ycbomnxog^75**=Ndho|u}¾k,**/13)-0,$ ,F~|{fVSW]_cda^\__jkilorsvwwplda\[Z^[[dilknmhjmfl#$ $+4>fxgD)$#+A^sqoPX<))031,/))=56BC3=1.-5+3;./*).)/0;[|{;)(<J]J9+"(#+4#$=KgnVHj\E,6QBP`dONoprwrZ@PX^ZKg{m6)8F6-@Gwɢ߾@-,+*!()EYE6=GRR50686-061;6=:IE8+40/465-969>Qbcsnyts`i^:3,-BSigj~vz}ء;$-&14)'-++),Mz}~w͹q^V[[Y^ccg_Y]fhkjkrsruuqli`a^VU\\dbllmlpkcgoi''(%.7;Sq{[5"*(.A]umljwx0'(*/53+++44<H>8<31,554,6+*/0/.,<bv/+/0>aP8/%#*+I(,8@O]mdmbF.3PA<YlYMvwpqiocQTT]UK\y=$)<WK6<oʳܴ;#!! "*IQ?17O[R354/91)5/?988FE84-36=HA8:::N[dpquoljgg_A8&;>Tgbt~|~g+)+/3'(+/!-P}~|}~ói\\aZ`ffc^\\bkjhmnptttpqkia^_Zac]dkrgmiikajmm#"&*(9;Vk~T, *'5H[qrpkr4*,,65.0*+00?A186/6/0,/4:-;10*.5Oqu8%(+<WQ41*'*383+998BRXX^M<4\R8J^gZcwnn^`WRT^`RS^zW'%._Q44nûإ/%)%'"&)MGN36Rm\3.0:.,,54.+89R?57//1;145=;?WbmwvsncaiqhG;(-:Vb[x|{{Ŀב:*)-(&%(, ,^~|~|Ƚt_\]a^^`kb_cbjoijpprtwtomfd^\[`\\fdkpikhh_jlkk!)(+49Tb~qS1'&'0J^sx|m~o0745310..3;AB</69436/46.030.55(6Rp8''(.N\D7$%(@>1$3<:989?J=/.R`@<[l]XiuhUfWIU`\OYfz}o(!3D8-4k½̕1!#*)*&)QSQ0;Jk`6.::6.3>,0/=>S>8.+)49..>?6G[fqvnhcgkrshD5-4CW_\ox{¿V'&(*"%+& "/c~õ~j_aXb`^gaZ^chdoknoruuyuoic_ZY\\b`hfkqjnfbfjids&%*3,36MczuY8'$(.H]oüG+,3=;)+,/1<?<036=74,/107:9;1../<\h=-%#,I]KA%)1I@3'6@G:*$5?401:hS7QjicYoo^\^MO\TUTguqvzP*-/.1;^v**#),,.;YWY59IbR<:7;6879763?=E<9.-+.13.9<9PZdnogccrwxxbE03+Ad^gju}Ҏ3 $($$')#$5q~|Ǻxh]_Zb]^ba]`hhmopprtuyvpmhb]a__a`alfntgkcc`pipm"""%/8CJcyvT7"! -C\r~u91,7<0&)/1<B@131-9+++&--5631/4-5Boh:$%%)B[P:-(4NC<18?D:,%+49@86\[?Bgpj[wzgZh`EUI?[hspuovr4&0$,3VY+&#%&*:[XZ+=KYP0/;=78;14359CJ?B5.,0-3==7?U^_fagikz~xgJ8/5>hacqwݳG!'($"$) &4||~¯ma[_a_a`^bZ`jjkmorutx{trga`__^\abdnhmodhhfhvlsi  !&%/FD^zz[:& %,?\r}v90,7>*(*/:KD671*-@1,(%/5;<+,,/'6Pz\8%.*+4BF;+!;PB5++AM@-()4=119Qb?;Vk[cn|vdf_[RJ:YmnokO/1,+3Wr?6<)#$(+5YUJ,<QTO11;>03,.45/:BC>C>-/-03;;7?[Z^kgnsw}{uiM5)1A_^fuu{n'03$#&("";~z}|{Ǹ~ic\^_`_^_[]fkoolwvtw{wur_b[__]Z\ghmkjoihglflqml"""$!*.G]wz^;&!$1BXrvyu5)-<51,*8DB780+.38-46+,:6)(''**:hsY6&*1,*:E8.'>X=78167;>--0516/>RJ6WkIcrxvh^QUYN5Of|wo}}F6/08l³YCom*#*"&AVSQ6CMNN649;,6356/0?:47C:85048>>9GRUfppv||}}uhO1+/Oa\orv|٣>++%##& #@||°sf`Z_aa`^]\fihiiouvttxuvjib\\\_bdfmoknmlhdailnjf ! !&/?YyuV9"#'1AUnlJH,/<1&11>F=358+(4+--+(/:7' %%/.Wr]?11.157C4-)HX9977643B5(6:-.-:RN?YfD\vzoQFNGH=ATy}\v{_S@I?t0& &M\RO4GOCB45<83@>0-569;5907E764:E>>KXaoxv{z|~wiR.+3T^hmot|Y"!&#'J}~~}Ⱦqcb_]ca^bbdajjjpzzwyzvztfc_[X]^^chomlnhjmhfkifba  #&$&-=[myZ9#$'09[oI.*'-:7+67?<6..)-*-0.))&:3.)$)%'Aw~pg>$,%()0769+GO84>9).49.-8@/,33IG9JcDOs|x^=8;>9@Ok6Du{r}uZɮE'(-,BRNI1BI??:6>54DA-681497565><3>7<?MS_mwyz}}}{zjP1.6\Y^luwz&   )X{|}wlbcba_`^\]cadknqrxtvwxukdd\_[Z\fhjlkprokkljkhmfY #+<Ou~`9$$$*5Vn{D+&-39;9;C;6./3-''40%1313/+ ' ':gniS3*(,-*,7A04HA0794$+/1+3;<540)BED?HC;gi>6;<BIYT7~AXϯI$$%(HP?@3@H9FC<:39ED6//74;40617@80=9=QXou~z|{{gU/,>WYfjty}۝6! .d||Ƽqfcdi^`Z^[Z]_bpmqspwvstmgafa[]\afhqmjnmbgobdoolb_!$!"#+8KjbA&%+9Rq=4)/469;EA:**,:&-*4.-0+4-/$(&-8UyQw{VA6%-*(,*08:HO?(+<5"'')0*9J8:+'@K@D646HqqG/CGWRazMWE=t~0(/*.HP@71=>5@F?>67BI85179650494A0D@>OVcq}w}~~waG60N\aaqt{R""!!.d~{yz~ó}jgddg`]`ZU_ii`kqquzxxrljbha`\[agfnnmllklinrdophZR#!!! (&8Nj~gD+%();VrG14/=E>A8:+%(,/,--/-.316+(%/*?[~vK@ruC94*/)+0/,;?KMB*0?:#)%).8@J=>)$?X@;IH6Ck}t[>AQjdf{c^fzQTaP=)-0*6HN>9/A?3QFA443A=6;9A@4-37/4/6KC@TUiv}|~t^G5.E]]cnszx$ $!6p{~{̽zjlkcgba\aZ^c]fnpttvuvrpgb_cb\aadilnkmklodgjffa\ZV!%!-,>Ni}kK*!&*:RkxI918DH>6/6,,,0.?/)4+*/1,(&(-6d~aC:ArN@43.,*)449GSI9()5<+'1(009G<8(!/VJ74>?hsxsocVWo]c}ñB.'.)*&=Q0<RO815@D9@:F4.4A<838A<54634:5>PCMS[q~~}z{xs^:3/S^`cmu~؟/!&7||~z}÷upnlkli`bg`dfdkmoyy{vmnjdb]`__afkmmnpkmllbafgcXU\`! !#,6Mn{nI*&'*8SjxF><>GG6341-+,3.*,-60.)363604G}Z@//QdKXK0-*/059>NTJ80'::-&%$-3<FH7**Rb=B:?`|sms{~{mulvyFAwƸb;*%%!$6dE,8P?419?@1>:B:,:>=330A<8;4479;EHCNP]u|~}~viS=1-R_^`jtܵG (A}|~ʽurmpojjib`ddbgdrv{zzrnokj`bZ^]bfjmoppkkchaa_a^]UVS###)8R_sH.'$)5Sh}~zoVE==FI9,,,+,+10/,,//8/'.+:==M\O/(+7aXSV?730-301AWSF:0(,80/-(,67DO>(#+VdJ1;69N[Rav}~utU@T|ZB)&(5]X4*EJ@65?Q?,?<CB1;A=4-7?>3046337EHHR[hs|~zqO=0/W`[cmr~n!?}ö|urnnognjfdkffcgqxuxywsnnmdc__bcddlmpinllfm^dbZYTWQ#! %)4KqrX6(',@QgxxiN>B8<7/'/..144.,/3++>-.DKOVK=13*0=s~S\W?011.,$0I[><=3'*1+-*)*7:ID8)#+QfY<70+4?@Bjq}rb\Qd}_I>]x8)5DM:30>K83B>BE=8E6:3<@?313491>NINQZks}}~oJ:01U\aknvԊ# #I~}Ƚ|xxorkkihfdfdgjinouvtstmgc_^\aa^hmklikmk``cc_[_WTTP""#$$(/Bkx_8*&0@Rg~~{I=-1<0-/3.01,/+/6863/0;Vba@940*,>;h]P\^V:,9,&*5OU3BE6)+61+&/14@K1.6)/R`[C8000:89Dd|vppYVilr|}wvB7?UR:407D35B?JWR8=;41G=<503+16COGPU]kv{z}s@;19W`fpq|ګA #Q~Ƴ}{z}wnllf^fhcfkfgirvvrtukd__Y]`cgknkjkopc^abh]]^XZST!"#(.Hgy|[5-(,8Ehz~FA<086)0.4.1,-.34A1/13DZlN.+-3050?`OP_\N/'936.>C736G;-.(35-455BU;&8?<U^T@D3,.(6=B\|}t|fqmGA47Skv]nup{ykUC;HJ/:DJ`^K;=546::9015107KKKMT`mv}||{aH9,<Wbfhp޽Z %aʼ~|yulmkbbbghrnpmkqrworkch^b_]^^akplkflphffmgVTX`YTT&"%5B^qy`5&#.8Ncvu=JP./.+-.5,+-.,,.95:-.9OJ6+/03545=dX\[ZR=)5/19?5*/4?<)76/11/70.UN)8=G`iH/D7$$',5BNxtz}c_vJ&#'&4c[3<AUKHtwkmxlP_nhb=@<<-+/6<85/311@JNQXZjqz~~~|_N@3IWgplv~~#!%b~ij~{v|}wnnojcjhg`fimptppsqd]_]_^\bdaqpllmgkfaaibWXZ_\^Z  $%/K\vyY3%)*=Ng|o9HQ-+)+1.*;.-0+-7;9.,43K0<037<67-6_ZYRHA97-/@CO:419E?,.9>,:5/,5PC&1:ZkvD%>A'##*0E_nlnsPpa) $$,Vn-)(**6iJ6=KvxUC0?I3::53>801838CGGU`_pu{~y`Q8/K_bfiuל)")pz{xyqknjgibi`flllnusrncff`_Z[Y`binnlli_cd_f`Z[Y__aaW   &(/GUqz[;(,/=Og~of=?H-,96.(.=./-6.641-.+115657?89036R[WRIB8B8)CB74)0/FA.9:3,,#&)9B>3):Wtm:'7J7!(:7CUfzXvr^ogfxS+"%+H4%./+PR*!#.ON\KFJ|qqmH?EF893A996+897=JKOX]`ox~yUH9:VZkmkyݸK"0}Ƚ}xutyzvllmln_bbjmoontlnjhb^[[XV^cikmnpll^[`fdbXZYca_]`$$ $$$-;Rlu[=&*+:Kg}}h];9@,18355+;;/1/146/*,800*.9>E71.(:MMJH@?0538AE550-4EG7-,)0+/$8:G>:/3\vj6!$@U.,7CF^axvPhv`Z}`y:&,.>D$.+5Z0"!&0FED77<Ri[@KjmWR?656:;?5*675IFNXZYiny}hRI,=PWkap{b7yó|{yu{|opkjjg__ckfjojsjhhf`]XXYZ`kgmmllmnb^_`f_[_Zb`Zc^  ""&!#1/QguZG')+JIbyoX68/)/46:5,-00-/.4/05-/:41;C@713,<DINIC;<7-78>30-0=8FH9+1(.)#%1>@)+.8^uhD&%,ZY?DJU^dd}dk{i\~|]*&,6~S&*'MH'"%?BH>795JEO4>MjvcE=:;71;.-0.ANFO\Yfjq|{~lVA4OWcihw҈"!6¯~}z{wwwwrolmdd`ZbjklgnlfcYX\VX\`cjkpqnlgjf^idbd\\Z]cdag"!!#"),5Gj~`H''6=Jl|q]99:.,6>D-)1**)0*;83/31/6;@@A71.439FSDI:=36>>5-18/1EHNF-1,%()'8J8+(.AZnIU;$"@p`BOS^dk}|}|xczylvF)0?sc(**I8%.+-DJJD3-4OF46A=@ImCA:/0/4.35:EINV[_`nv}~}dU60SYijjyס*">}ʼ|}yxvuutqnnjf^^]bfjjgmkdZXW^Z\`ghngokllhhb^di_^b\^d^`fh'(#'')+.0Om||c7+.4IHg{{qc5<8,518F+)1.---*;3*,3.5>KOE?1*7343BE?E<K:@C1++-.,+9;KY-(*)//*<O-*(;T`Q@``7&.XpZIPcvdozx~hnmctyy~n4,3nz)+1<*''0>F@@A=06N@/>A>?1QWIC9-3/++.-<EKRY[cipy{xZP95UYmkl}ܺG!?~Ƹ~zzy|vtqoltlkd]fbaffmoa^`WOU[Ykfimmmfggmc_`cib`c^]`[_`db'(&*##')4Fby~aF0.6BQc{um8=9>5(66-,,/*)+5:4/,50<GFF?E0*0916BH?=;?BCB.++363445N]8+)*,,4@D/$)@a_@8XqV>>AWljVPhQDXkjsm`N]vX/7\v,-80+(1/>F?58B)7H?<B8:+0=@8E764*,.-6;PQXXXhmou||pVJ79Y^krol$G~´{vxuvtxtiqofdc`\fjiojaYOMNQXagknnlpjhhg`]Xfg]adai`\`ifg"!$&# #-4Cax~gM816>M^z~x>8:?,.:33(-(')-7?/)->HVYJD<10.6+/3EB=86BBA893755380;=N:&),-(-BG5+1RrY5=?cpT633anDHY\C`vmfD?CgvT7[q8=6)$&(EF8D3/,%<K=F>5:756<9E6407+636:GQRYanrlv{y~lS=/AS`gjt}ח1P}îxvussvpojlg_cb\^cjjjc\SHCOT_hlllmkijcj^_Z_``b[`d^h`bhb^&&# ''#'5>\yqJ0.=AKa}}93HH0(?4++/&'(+;6569WhiZ=:80-..,5AF<=?=A8313B01>57)53FZ*%,0.6?@6'-YgHB8EOjfC($>mk`vr[TF8AXv{qT\c/;I?$'&5D>=98/*>@8K<8736344D40'7-/6>BNSZZ_qmqvz|zbK76JVfjowٵJV}swpotrmmhhfZf`_djjmfa^VQHPW^gjrrlifjlb[^Z^a`b]hg_dcfdcW,,('*#&$0:XpjW667CQ_vn95ZR83=+*'/'--035;JUg\J;443-+.+8;EG@@N<171.4>?6=:90-:Fl7*+4970;C7=\J>F;HNlwP'(&Ip{\xpf]=DCvnfpv<az,",=>C:7=30E>?G;7.16738;6-%0-39CJRWS]csprzz~|z]G7@P\bhs}o_}ƻ~ssmqnmlpffd[^`bimffb`\TQHV[fjqtnkfijg]^Y[c^`cbi\_dhjb\X,-./''$),8Skq[D87FR`zaD;hY6-9%&&*.$*<9AXb`R;/4(*/,/(,8?DC?=@43.;35=FA<>:,5/:`E'6<>7+4OOUK8;;>=<Srl:&%Qyqmv^hYI<DFlu{{P'#,06=<7417A3@A85/:711559-0-.47BNXYXYiqvzy}~zqZ<1BWcfkqюj}xʷ{uuutpiikab]WacfkhbbaXPNNWV`gjsqolkdbf\`[Y^[_i`hcbacc^TN++(!% %'3Rkx`D=<FK_ufA?cZ:54&)(+*,AQQ]_Q@B30/1+,*(-+3DK7:J>33/88=GBEHJ=5*,-IB37?4/*.Wcd@00778:Gi\6$',JgtYsxsZWN>1A5a~wx[&&8-3<5+0)4?9513135904-*361(03<ANS]`dmqzz~~}vfS8-DWcgvzձq{}uz|ytqqosidad\^_i_hdgh]YURKRUYclppsnid_a\[^\[]_afgdb]fl^XTJ()*()(!(37Kiw{aI;<BN_umBK__/>33,*1+1GRSQF805404045/3,5;GD;DQB=95=B;G>FGA<=3.1CJ<K;)++6Nrl9*,.4:1Ealb@E*+3@<;TbqwnUG=-;5KYv;%.44=;3.*,=?9166/43/<,0/40/3/:?EJSacnqvy{z}~sXF69QbbdwŃ~moqx}v||ǽzwvxqqk`fjf_][\diccbYRXNMU\Zlmkkpjhbaa^[ZWaX`_c`b`ffk]WOG*)&##"/)+6G^vvgG4=@Q[to<P`d39:++3,149?9>656:6.4.171-33;E99RIE9611=EC99A:G@?5;DIB60(%1@XsY7-+(,97InofBES*"30/8:GdqU;-04AGJn*,546=?03+7B8<A5835:///-6.1*1.:BNTSWisqrszx~~~|lU90FVd[pwҝ~~zdfkoxkstxx{ƹ|vqtqpnni_cWa^ajgjcZWZTORW]_hlmngicc_a[T[`Z[`ccb_\bh]^WIA&&+#($',%-Rj{^G;=?P`td;IbG><0**4*4-9545/363033*->.+/7=?5?M=C:=4D?Q<>/:>45;9A<A0'.$%,=^kC90)*.7OZz}s]6TP&.C54**9Tw_=.9>UQ6[uz~6").10>1.)(4G:694-3543+)(+37/74<BQMR]lsvw|xy~~|t_C44EZbbqٴ{s_Y\csbjnsouy{yyytupmdib^_Uaajmgc\SMQKRW^acfmnkhmikbc^Zba]dficb__a\\SJF<((%,(!#)&1OmzdKD??OZr`=K_B4A6.+**).0/4-1591/,.-8A6,4>N8;EB;9669AOSE;.-6;36BG9.,*''*+JkS3593,,8Jn|zsE8a?,?>4))$@``5/7DY\G^CZ^&"351;9/('*:B8556+*:0,-&0)0<1+4>HMTXforrtyz||{~~}pSD65P_]nxŒvnlZPVdk]__finjrr{|ȼxutqrkffb^Z`]`chhdhTQOTPW\\ikjljidgac_ZXXb_bgdkhb^bh`PPI8='((! $*)4Rlu]H=ADP`sgEVcCCK46-3)0//453>6/3/,.+/9/,=MA,BH>65?<<GcWN=5,)3,105035/,'(-T^9-:871/7Hh}xk:FX?071%108G|y=6/@ipqkMNWN*)117G=1()(46135/,(1.).,.,17;>9GIOV\gnruwy|x~~}{mI96:T[amџj]_ONRZkVT[aaaifrsszw|{ȵ}utlkgb[V[RXYadij_YSQEHMX^gprliid`bcg]XY]bbiolkaa^]]XOIC@7'%(!%"%$+7Fixv_G??CS`odJOdK?G,')./-54476/9001,4-3154?J93GM?60/7;HSUJ>/,+4+)0:94--),'6T[3(3CC809>R|J3GOC-) )/9>K^fH3)?_{|^\V<%)55>>7'7,5501505./.*%)&*+4:@?EHIQXbmttv|wwz|~uYF74?T]dq۵x]TSQHRPfOOVZXYcdfgkkmrusx{~~µysnkj^YPTPRX\bkif]VQIHNVQ^driidgb^fgb^`\b^dlimg^aaYZVOB@C7$$% ")*$)/G_s|fDAEDMZq{dUR`TM?-%)+*05<=C70381<,00,=8>HC59GA<4769<OCKQ:93)0)*9811-)*')=PG).0@MQ@7>Ihnw67;@H=**.:BPF;C4+BYq_flay0(,50693*/,/6,-083;*+%'&,6-6;EGFHPS`ksvtxy|y}yfN4/7QZ`g{hTUTO>@KPGESTST]\`\Ycdiflrrwyyuyƹ}yrii\][PN[Sa`cgbaZNKIKPXVgoonibcbifa`b_Y_alnmmfba`V_RQF>8=%%'&$$#'*/>XmoP@><FWqsqTGTWW<,&')45<D56..-0.00-05?AFE64:FBA0443<D;CY=7313.0+/(.9.+));<59*<:Cmdcc`Z|wV630B\M*);C4<51-;<TUF[rjV)&1/546-#(1774,35-+*//%(.441<NDJKSW^nsyvu|xwwz}~~rX3)3JT\_r̈]KMPRMMXODEHNPNRT^SX\\ibbddonljrryyx|{}|rld]ZUUHUST^hfi`\ZKDIPV^cilkf`bbf__`]`^b_`irnjg`aZ_SOH;<<;$$)" #"-54OosR<==GUspjZQV^hE+'/+,1C</.-(,4.,0046@JJ71.BGA57897DC;ET<987/.-+-'(73)+)?/.55UH+Jz~rn_hyE;38KgP,1I6:A>-=JoP>\lvA'.+4;53(',88/+33))4),(&*./04?IMNQY_jywz}|uzyyxyy~t`J3-;NY]hv¿וYFQVVG\dQIMHGGFJOVQTQY[aY]``acchilqrrrtwĸvnbY^WVTHPTX[^dabWSGGRXYicnwjcb`\c_adc[^bddhmogbfccRNO?8:7;##""&'3*8Fgya=6=KYovmbKO_aG&)+(.?E5313/00.900-7DN9;3.EG@5,48@>HAEJ?=354..1*/1747554/-0MzB"0I~ytddl~Y=1<JXK6DKGMN9EmB-?FX_54,)635)&'1<31,-.403*,()*+::76JQQTX`orvz|}|y|x{z|kN8'+@ZZcs}ݫaKTW[I[bWKTSTQOSIUMKOUTYVVUVR[W[`_hbjghirr~|oc_YXUKNHPV]dgca]VJJFS\djhlrj``b`cc`_]Ybchgniic_hbZONH<:49>"" $$'(#'%7Gr|c>8?OXmpo^FU\c:)/,-0A>(*,-,,0,-//5;JJ6.4/GG<19314DM?BI77<;68./0-3-::<33&31Iw0"%1bx^R`nsytXS:10COF]Yd^U`fx-*75=999694/++%)3C0)),0./+/,/-1*=<<BJVQV_gwv{w}~~x{x|z|ywa;/-1G[gjxfHTX]W\bVVSUUQTVMUVOMKMHQJJPPQRUUVXQaa^bipquƺ}ofbXRMJGNSWYad\Y[SSMNSWahmokfidb]bf_\]^^k_jmqmbkff\[RGND<.66('&&"! !(0GtoE=BHZk}vctcF^^b;($$,59/((0/,).-.0/BGIB5+/0?HC13347AFBEHB9?7D>-+*(//347550;4DX'!#(FidJWhhmu[+39Zk]qvg@@[@.01.00971A34-*'0173+-,-8-.)-7*,//<;@MRRYbowz~|}~zxx~{|xwhD0+'3Hamn|¾}QNWXTddY^`\WZUVQYOSEJCNIMCBFINJNINJSSMNVYdiy}sg\TOI>@@GMSX\^^VXRMOOT^fgorbZ_^ac`bgaX^\_cikmh[`fb_TSRA9<557'('##!#")7JjpG7?NVoxaUuhV\`b;'%+4>6*-30//*.+/1KIJA81066ON:/.654;IB=JD=:HC>7**%:4645=;683-6%&&(/QYaRcxuc}EAOXkf^mB87)(:1*,/699IC5.,-5;/0*-*&*(').--,69><FXWS`jlu{{w|{z{~{x}nR9&'.HUnou֔MHR]Vh`cbfa]XT[SaTRRPIKE=@EGAF?ABE@DEBDCWZZ_o|~ƹwnaWQMC<@>HNPXYVPPSSNWUZfknqraY]X_]`^a`Z]\cgklkjdb_a[ZNF>><9:?+*$)" !$"*1Fj}G:<HVi{uNU}iUT\^5(#1=;0+3,6,)(+/4?\A?<7,+./SP:930,;DD>>HABHE?5<6**/9>,:69740%$-#.40*=ck]iumNvZmZjw`J3'%/-./396<7,/)..43+**''/*-(*,*+059><H[[Zdkux{vvy|zz|||xpR8(%06O[jr}ܴ[HP^\hacfbd[aadZYV[OXPPFNFAEA=?7;:946186=DNR^ilux{ŷocVRHB@;=CZRT\\OMGMTPX_[qqsmjc^``]_[_c[^_\`hjinkcg_^[RG@B;<876,,*++(-.*(3IhsJ?;N_g~hDbzzaVVTX9(..::)(')--&*-1<QW74=8/+04KH71*38=IE<:OC8@=A;9>8*+4@,.<@@<:-*07=;-%-Ipnas~wnvciaRQgt`J0)/(,0158?4..-*,83/+''+(*((*,(,-4>EHN[\^kjo{sxxy|v~w{|xbE-%(0I\blvnNV\\d^ogfhd`cbb_\\WZZSIKKCBB6;7597,-5443:;BPShgkz·ʾs`\SNB?:5;GTPSXVRPTOX`adlmqlng_^^ZY^ZX[_b`^giljkffd_`TO?<?:57654400..84986RlpO@>R[kiP^{]HEHF1)*7?4*)',1-(-0:MHA;06@70/1CB7.,+1FRGA5;A8;9A97?;6445.(*/;@?6,-3:00%)-Ogqou|hzoquSZb:ErtYG+()(10:=3/,93-5./+++.0,)#*+.,+,5:DFRX^amotvv{r{{w|}wulI4,%,8S_kvԎQTW`cbijhjjnb]f_^^[\WTQPHEAA?<<6;0.1/3.--36=C_ZrĺƸ}oZPNG=;<A?KSPVVPRNKQ]bglhuoumib^^[X[YV\__^difnmfffc\WPK>;>;56141111;8=?8;9NppR>?J^h{c\]bF@?=3''85*0.0/;-,4C6<7>00:D<-45?C=3//6BHC@9>A>?>91+=>E@30-).)3@@<>/493,)'.-D^njs}kvi]dOf\NfaQM.*(+-794,*,.06@<=<-/,4(&$*++))/?ENIW[fmmuq}wwzz}}zzoQ7,))6CWhq۫]QY_cfhrmmjjijjd`a]_\SRQIKMMA><7061()-,$'+758Eb¼´n\UHMC<<>NMNPU[QRPMHN[]^bgppjjab[Y]`TV^WY[]djfrjmhaaWXKJ;A@;65570/:IDIGECDFVk}lX?CM]m|ý_a[lIE=3?+-49&-)+(53<A9/,344/9A.)-.48@9-)8JEJ:A@:<<8@B:3:D70')-$$(1BJ<(+8;60/.,%=_jluzJ\d`}ysXB)&(85993*(&3),+.-+(%&/'&())051<HNHNX^foqtzwxzzyx}~oY:-*,1?OaoxܿjUY`bghnojlhkkjklcc^\[XTUTJNH>?9575//'(##''/8Biųȿ|cRHA=;A;DHQNXUWUHBFMV]]kitpqjg_\ZXWUT^RSb]cdnqkkkh_`YTG==D97=75;==QSQOOMFJHXkv\H<R]oz~clYpKC679((5C-,546;FD954,+416><..40/9HB31<IA@8FB57=;=B3653,*(*6+')/>M<1'9T<1/133'1ViuTTiwpnT.*!)499*&(.+.+$)*/,.)&(,'1*.07=MMJTZdhmpwxwv{y{w{{tdB1+*+6Pbh|҆WY\adinnlpukllkbhg\da[[XVNUIC;@;/31*6%&&3'$*GwƱ_XNK7>>E<JHPSURRNKCGM[^cstrnga^\WRXWZW[UTZ^ghmrsvkgb_ZMHE@I<7568?KKVZSVRWSQV\jzü~fKEVWlypsgbvKG4:0'788-/8.HSJB1**.-0.6@?80/977@A69@F=97CN;8Q9DA45100*1)65.(%,6>;/7_G7>531&&5Pm{|k_c}iAa}p-*--5:.06*4,.*.)+*/''%-+3**./>NSQN\\jlvzu{zux{~xyfN6--*,DVgu}՝[Y[^cidlqnmpqlthjifhf]XZYSSSHMA:81*.0--&#"$-GwͻȽfNMCA84@?AJJQOQSSHFOOV\bktvtv^^V]TXTYTWYU[[_ikptuohbY[YKKJGBA?66>A]]`Z[[UV[[_ct{hMFK]mxĻsv_pn`N1/-%534198=CR981547*,1:54>5:/.5?70>HH<1=EI9:9>FD5/31000).4*-0'(7H:6NO?7+0*-)+?Jq{wntnf`Zsz5+34683'-+,)/'(#-,&'&303+.+.7GRQPR]cirvxy~ywz}x|bF00((,:P\q~ܷjTVaajgipmomtmrhlhdbbf]^a[YPJMC?G<1,1/+))'$)FpɳɽtT?@98>9:AFJJPRPJKHKMU_aknnxkh`XWSMVWXTTVXRWbjoqxyjjc]\YRMRPGC?@:8=bbaa[XU]^X]kv}nREUZnz¿udq~cWY0''+35(<D@;>:39..6../6/3.6+5/:,::7DHD47>FP;<F<B?10-1103*.798,&#9NJ6=R=543,34+FFEuv^hWiw~x80.7..)1-++./1+*0-*%!(((*-,3@KSJOSWfmuwzu{v{y}wlA.+*@/<SZi{}{RWX[flmrpjopppikljaf`W^`YXQNTJF?>=701(,&).+EpƳĬx]D8B68=CANFNMPDFFIDNWZgjnorkf^_YXTUOPTWRX[\_goytwsmjha\VNKSKF?@<:=D\\]c``]^hf_l{~tWOZfiw¾vtdtga^<--'(7,4@40571.-5514331.5515335144FB:,0@KS=AJ>@CD,-/1)+,*3:;8-)(=RF7H?9=60-77FBEH`xiJ[j|N3,78/3(/,,.,,,+/)%()$%)30009AOPPNU`lkzwxtzy{~{fN,)$+.QQ^fx}яPTX]fdnprnpqppmlgfam`Z]_^X[TMUMDDB=1/)/+*,/KuȻȿzWI;7785<?E@GSWDBFEGOSUdfkqqrod]TRWPSORRQR[[cdkntzyjfbb\WSVSWFD@:>=FEVV\]\X\^gdhow\GUfjujqfvy_YU@.,+4640-,00378-./1-+:96EA3645+.+/<130;@DQ>6B93?>=<-+0.4+-8DA:3%/?M<KC?>8<DCB;@JQ@IMhzaf{[OC50370+,+,).-).13)$#&$&+/8./6<GKPSUWonny}wzt}wyj@,&%$-@OYisרfNT\bbkokrooqqtnolff\h]b\YPTUTMI@H?670-81;;Jp̼}]C=:97389=FHHRPGDBHPKW[dompmf`[UQJQMMQMNRWZbggiovtwnfb`XVWYYTOA?=<<FDYY_`^\^ffjqv~{`ISckxhrjw{\[U69.3:.*.5/-711.-4)5,.678C>6316011*1,.5<JGU=0<94?DID-+133&'8:BG=%/1=AKM-833BDY=<CMX<=KwNm|~@61*114054*087*,'5*))%!)(438/8>KJNW^Z_lltt{}wys^?1$#$,6QZjoyݼpPVZbckormrqoqlikfnf`gb``ZUX[XPHID?=966-39:Mgȵ\G@8646588CIOEPCAFFQQW]agopoagkUUPMOSUUPPUSY\gnouuwlklh_YVTUVJH<=AAAEBXY`^Zdgfgqrz{aJ\_iy^\r|u^[M.--/:0/,0/4,3;0.4/0.383:A=/.<49911*.+4>=AF<8;0/IIUU84481,&0E=XN:+/.;J[55<06Jk^:1GW]GP{HIh{o6,-/37.-+3,09,,,0--)&##),-578DRNJHYaglkr{}{yx{v]<-"%-3?O`flx}эRTY[]`hknruupqlnkjfffb_bZXZ[SPNNNFDDA5=8<@M]ƻ{nSHA468:7<BHGNG@CDII[Wfdfjkkkd`a[WNGSNNQUWUY]cllpvypmdb_bWUUOSFG?==IJIHUU[\ccdmlqw{}iNPcjxZRuyr\VB.(-A0,-6;10-6/-0393-+5/6C>;04.710456.:P>>H91,56NS\Z.*698*"*>BZdJ/-17AaN-<0/A`sN1;ClalSDWi}wB4550/.-41043/+(+/+(,+,3..0:<JNGPTbkjhru|~{uwkR+)"(-4COUiju}եdTWY]d`kjmqpsmlmko_`diafa\fXWUNJWNJJDEFPMMRbͿxcXO=8466;8BBDKP@DCBCOW[bdqmlmj`\]RRRNUOQOURT\ifquwwslif`afZ\TKFFB6A@FMJGKKYafgoopw|jNUckx¿]P{l_P5+)(:43170,.35)6.=<6-,:37C91.056.+005>DSBFWA,469T^ZZ4-013.'$7J[s[F5064Tf-1>:;Zqb8:Giza8HUV`qlS=-/7.+3+0-,-4++-()&&1&0B15?KQRSRdgjlfpq{xvjZ:(%) (6K[`ilow~ܸnOWY`^cjgkonpkmrkjdc`khg^_^^VSSRVQKQNHQNKTYpw]OMH>9887F@HGJJKFC=IOTT[gnrsjiidXYPXOIONPORT]frmtwtrpjk`]`b\UQNPDC@CDKC=>GFTZgkutwvw}}fTV^lugQ|wp_S6)6*=7+/577.3:,38B97-746;D84*.1,6//7H?STDQO?-,<?MY[X@,(-98,&0WI\lS?8;:@rD+:N<E[ZRDRZ}zB;R17HfgA+3/,//*+336.-,&+##&%-504=GIPOU\lfkqnnowiR8(#/#-/=Qbgintyy{}́QQZ^cjcggmmnkjjqhmb^`glccfgbVXUWQQOXRYSSY_wôdaWP?B:767CAENUNJHFDENTY\dkonqinc^XKKNINKRVOZ^]glosyurgkfb[f\\TSKF=?GHHD@:=AATc^juvyuxxypUTblwpOm{ylU,,-.63+1A;/.A9-/;C83+8437:?9430),.1*9G^U?ba?41@<HUY_V<,.+./,+E^QIVIA<J4_f3/EH;6SSPHT_pP[;&4PlI-61)5/-.86.)+('+'$$%+(+38HNPTW_iiqjhkWQ=,$!(.=MXbjjosxzz~~ҔTXS]^bbjlgpniikonhfihhjahbf[[U[XTZW][]WUUazȷu_XNMEA>9>=9MGEMPN?GEFPYZ[jgtnmlha_WQNHJCMOSOSZ`abquwwvoiml`Z_b\KXK;=C>IQQGD:99T[`itqwvwty{zm\^amrrHd}pqkO-(',4'+04=4:BB+)<D<</33;H:IA7+('.,7+5IUHC}W=7.CA]f_\XK.(0)3,-Dd[C3DG56-HyS+=DP31^UMB[oJ_M'7J[^6))%''.-36/'('%0(%&&)*.<BTTWUbfibb]P?-1-'/0-BJWfinksv{|{|֧]QUXfafhjhildllrrfkcbcg_ffd]]\YW\`aZa`\_[]|ʽnXTFCA?D>7=@@MBQHMHECOIR]`hmmpmjdc]gWNIIIHGFVTW]``mruvwrmhmjka_aSJJB8CFBHKGNB;97QX`ltsuxpms{{fX[dkqsFYzqnd?.'&*1*/-1@/.A<05=E;/,5/1+GOIF51).50.8RTC>dB3-:>RWhXW]@'+5/7/1_aI+-:3/0N~{@3AFE;\RXEIfIQI);MDV;)+'$).31.*',%&.0'.),,8IJSSZU`]UE<;K+'/(%4>EW`chhmqt{|zz}ۺlKRW]cdadlhhjflhkkjfbmhdgkihX[ZZ^[g_bcb^Z^v~d^QQOOBCG<>DKMPWPMRMHKG[Ydkporummi_][MNIACMAFPUY`abouvunurkihb``VOMB:;@NGGIHH<801DUZ_imhjkhjy|l\ZdnuzSXsjr]5-,),0:14@63388(7=H:<,+1165OJI70-/65+=XWC@c>/1<CZ[ncTbO/'.96,+GrZ>"%+97<c_(6E9+MOV^Rp~rZF9AT7HD1,+%3804+&*,.*/64,,37<DFKSUH<950-5'&-.9<MVW^gjhlqwz}njUQTU]gdkigjcqjkmlgghkkfjibf``fbggdkh`a^afrf\UJSXOJHH@HPKHOOOJMENOTY_fpwrtwkbdUQOROIBAB>KPT_fchputtsommlffc[SGE:DAKGFEMIBA;+,?JR]b[g`dflwn[Yafw`Xfbb^7(,/)*+905<0<;/+-MG?60-6010PT8*/047./4NX>?dA*);FYRqmRna@1(01-+7_jV'',?D3FE/O,9;SInkqwY*4G(6X/'%$/*--))/A)(.-+-1479;69871,())&)*-4FSS[`afioosvxz|~եZOZ]]\_dggijiopopljjphonhkdb`ikhkmrmjkga`pcYWW_YaTQFHNQQQPPORKMHOO_a`kmytmod^]QSRVTJHBE@KQZdhlmr}utusllkgfcZSDE>>GPMDBCB>>8..9GKSXb\\dbpzq^ZamtcQO\`M-+350.53/::5;=5(1AD@>1-656.R]8&-73113CJJ4DyU7."1MWTn}jkp\E9/500,Pt],)*6BF3[r3DF98EIgusvrlE0:33K0#-((3A/,7/3./(64/113410(/.6(%+-:@FSU]fllqqsptwz|~}ڵcQTW\]]fbfaibmlpmnhkknhjfibcgfkiqmmqqnhmhovtb]SVKWQPFSKQNOPITUQNJGKVW\gkmvwuff][YTJMPGBBBDISVajpop{zvw{umjli_ZSGDABE=FG?FF?490--9DAMRY`Zg^msyd\bjsjGKZO:+355*&-//061.6<;9GAJ6051671Sh8*'658/;9GG6MpP?*'6PgXm{jzbM:>D83.:nkC'G#-C;8xQ5[75>Vb}tspiA=$-G8$",0.-&'5614/-4,..-%,.)*)*(8<<CEQWQV`d\frtwz~uKSV\X]^_gcdfgkrosiooonoiiimgmmmorvsspjoljs|k\XWRJOKNRNQSXUXROPNHJQTRWdajpnssi^^[HOGGGHC>BCKRdklwnuwx}{uwlifn]XKJFDD@>BBD@F;;31--57?DZS_]b`cs|l^cptľn>BSN7*)4-1-,3(409.;1/:A=?08<6:84Vm3-.95/38/@?:^sN81)6:afnx{gpjM6-0+6F/dtc1%-#(P7C}CPO<@KXq~}ftdO75M)++*,(.**,3.6;**,4)'%()+;68AOOQUXY]`aihhmtwy|}{~̌MOUVWZ]fbhkhhioknnruqmiggjhkqrpxxsvptnorotw{tj[ZYTQTVSQXWWY]^TWRUPCIJW]fiskkmmja^TSNDFCK;?>EGVVgljsswzwxvvshikc]WMMI<EC@:;>B99:3.554=@<EX\T\]]nw}z_gqw}sBAPO/$.:*/'-4/45.03/=;>A?6B/0F93VnB(-::066FHM=cpD8%-34`amsyphnP8.($3]BVtM &.?R6Puj:DR76RzmhMirpl;+<**.4.4++.-*+$'-%*''/144=B?AHTVX^`Z[bgmqp|wy}}~~ե\HZUZYb_\gffkimprmqossnmlmkhvsvw}tvurqwutrutvzurlgb\WX[WUXWY`_YYUXYTQENGRWZaiglnw]jVTKQIHFGAE@CCQT`noorqtv{~x{topm_\RKHGD@?B;?C>6784000:77<DJRS[W\hx|rdcmzr@<IU/,16+5.:MI3--*;38BGE<:?::BA4NzR.(04+41?>HM]a<5(,-9N\kgpr}g4(/%/RcKmq3%'4UXB^`0QQ3J~~b{A8czntP4<0.,7;<?D;;0(**((,'*5=?CMGMWQ\WY]gcajsvvvx|}}~}ٵkJTRSW`]_hcbdiipqnvurupinopso|uxxx|t|utwqrnutrsmjf\Y[]]b^Z_hfbY_\\SGMHRPR[`blrpgd^[dVSIQKOH>EC=KS^hpjwsovz}wrqmqic_WQONDA>>=?=@B885A:44;:8/CDPUY[Vhy}}hhow~nBARG44;0.+/;;769+,/49DEJM;A79C?,Aq_8&:/)11;BV`bW:0-,(6K`t^N|m4%0&!4\^cxQ*!(=;\M<{}<3YP=i}ff:CsudZ88/.,./3+*)&!+'#-.7<;CHKOPX[[Zafjigmqtxw|yz}z|}|~āQQNWZUW_`cffijooplvrrsomspwvywxxuxtvvy{upmqjkljfcc^^^\dddblfc]YX[RQQUTTY\akkkjgiXR^RRXNMMBECA?RW`kmpry||~uunmlidVVGNID?9;?AD?<::9=3<;>9==?BJRTTU[rywjgqsaG=KK:84:0<(05/3=$)053<G99=N14>88<Sh?/40-734<NboC-1/*(0@ht^>p{P,'* $Gqlri="(>QKXyc07HFIvmr~lNVmS_F5&'%,)R:#(%(-/*.579<7EGSXY^\[ikqropszvyz~|~~ΒVMJQ][`^`jdaimkptpwtoqptstxu~y{zvwrvxptxurpllkja^`a^_djmlihmc\Y`XRKXWSXZafpngba\TXNPRNVNQ?NIFGV_hj~xsz~{zronmifaWGJD?@@@<8A=9;45<6554D<@AB?EPPSO^qz~rdpsy]H=GJ>MG30*)38+/81-8:7<EA;7==@?>45BiT35.).*0@Ejf:/*.+)3Fhtn@M|~n7#)($4hriqF-%!+?fXx|J$1EKjvp{}vnWPFKI*)&'-&8/+*)01>/.16:=<FQQYX^gdpvtussttsuzz}գYHJVW]^aagfhlkkvrrporxtzvvw{y}}}xuxyuuzqoniomjkjgdd`koponkgfa\ZVPVWWYXadghdYRXSTNGGNOQFSOJODRY\dotxvy~}yoospc`VPIJ><;=9C;7564:58-.77:<GC=>C@DKMXkwľzkgoyüxQH=.DKB?68+1095.630,>:3>E::8697AG=37_b90,/1'*DKrh60$&,*+>dtuB:m~R3++03GlizSK+ <[]dj5&+AMimvupXRGA8J/+.3%/1/+/40-079068BHMV]_bhdpuvuzzwv~wz|}~~ضdFFJUV\\ahgglmonpttvutszx{{wx}wzuvu}qrtqkollfljcchgolsupppdf^YWPNSTZab`hiaURORJHKHOJKKKJCMQU]gjq{xwx}|vokkh`]WNCG:>9><8<84691-11966:=;=5?D<=GEJjynlty^FA39<?9-==3.9@=-.1//;48BD78;;69?D@43OiY1).17*>Zs=F'63.*<ln{D0Wj=;5((Tvh|zIO@"&#1DWMZ,%+8YUap}oC3/(@5(-5))5'76+./5540<>RTV^`hgkqqquxwzxwuy{{|~|HEPZSWg_ajlonmnqtrqrvwz~||y}}ztyzytyuvtupsoklhfgghqutuvooha_^^WYS_^]fiff`_YXOPFDBMJOHETDJRPZinsv|vywzzumgdX]ZVHGAA>8=<<C:7<9;3985446:8658FACDAJc|ĸlhu{kVM<8AA:3630(,=7/*9//54:GC=45:?@=A?1,DYm;,*+*,@nqE4$0036Hyq|E7A|VA9+-IXiiQKQ0!"$?XCU~O3#/@JT`ylC,*:H/+&).:0;:0354835?OOW_alfnnwtxvxxvvwxx{{{͍MBTXT]WUfkmiqonukppuwuw~z{~xwxxvtwwyytsvvpllpkhknsv}y|rnkdg\YXV_fffbjfgY\SSEBJFMIHKIFdGOYUfkrwz~~~{wsrrgc^[UNBE?>8:=6;A368695:CC11:A?549>@@?MNjǽtjsywl`B>;:7-6<@3,630.-1.907??6<;6:<JC@56<HmQ&',-3HvgD3)357+AymN@Bjr?5+%&;Tly\.PC$#$3YTAph:&*>YFQlscQ+8V4&,!-(&*315918<?MQZ\c`klkpuvuyzx|xxwxxz}}|~ӧWPPSSW[Y__YY\krrojpnv|}}|~~|wz|yztxwwxxqwoonoolrrvyvzyutnmgaa[Y[`fcchihi[XVRFFMEESDCJNIITc]kmry~~~z{spqmb^\RRHK<B6=:A;<958>;:9<IT3389;3068==@>Jm̿wmxtwqPG@63)1?Q:*<15*16+BD868>6@ABE=CQ;+56]b'(0./UYH3,16/*IwoCDKVxQ-+))-Adqj/>N;'),PRGIpZ,,<\=YfwVUb_K[3+4!$''+(174;@GIR[[^]jjpppqrvuvy|{y||uz~~~ÿ۷jBKQVU]gdahhhmmjonssx}{{zz||z~{}uvxxuxpwmnspsss||~~|xuunmffdb`cccgfg^bc]TQPTKIMNONZOHPSV[jwvx}zypnrg\_XJQ>A<;;14?E@773/3A=FN_11737;57=B;;<Klºjxx~{YI;900/;B319A30/A3UE;?99:87C@>B@E(13Wv>)5(+VSA5-0,3-Wzt:CYMmW1*()+4UhxO,<P@)(<SZDJrs=$3bKI[}n@cwsg-$'$&*+-56>EJRSYZcjnslqrtusqv{{|x{{v~~~ƄEJMST\_pokjdolchrunz~v{~~|y~}{{xxwwuyqvrotuuuwzy~{wqmib`]bdclkgddV__WRUVXNORT_MJIVYW\ips}|xjopaaXUNI<@6:636:;;>N;5?IHIPY0/973965:>89>HnkqzuaA>67,-9@)(496.-E14AEA8?:E;BQDIJS60-EnJ:600flRO=,41::_yx0>ZMPatA.,6).Yi~k//@R:-4O^IHRd[-/JR=Y{Yhs|T3&%%$&)-/5@AMPV__[ghnmljqn|sru|{{}x}y{~}͐NRSHXY\Y]ohjjdhnlkuzx|}}yzy|z{|w{zxxptvzvty|~{{upmd`acaagjlf]_XW[V]YZP[XKRQGPORR\fmt{}zynnnfZ[SVC=;64/-/565:5G<?IRUU_`13;5884;@59;CHlſmqy~ja55443-/:,*8=6+M836?<.=C8B>OZFYDUC<:=CPI:+6j]MN9/16<ASno~'4aPVGa3-%3;ZgS5/KJ99=`_?ABZ6(8PQTtIYbzzS0#)&',+39<@JRS\Y`adjjmomtzxwzv~{|}}x|||~~ը_FRPTUXVZ\agmfhnlnuwtv{~y{~x~xyyxux|{|}w{}yunl`a_`\bbg`Y]Z[ORYRU^XQZTMVMNS[]amxy~ysrmca\RMGA=C9--0=989;EE<COQd][b77017749:>58:Ac|ümwz{{mlYZ56;91)8,/,59=1,8=>;E7<J;C@PWK\KRI139@BU?3>O?G@/57@@Osv}*,Z`MJtwF,$1=Thi6554EJ<Qb_BC>A)68POUnT@T`b1$*+)1>BGNNQQ]]`alsimpr{wuzr|}}{}~~۸mJJQXX[^_`]dhddkkontwzwxuy{|v|ywuz}}z~|wujjg^bj\cbg^ZTXPVOPXXYZTWUXQNV\[dsry{zqplcWUUC;:17;067477<69BFQU\]``]//445345::;68FZ{ſhprxhcYQ6:<E-)-&'/<A;0,<J>5P?:F8FANQB`GOQ6.87@VG6QC4G@14F@;U{zy,*MbNNPji@*,;Q|l:1($);=Q]ZN>7F-++::?b^NPZj_43819KKRRcVU]__doqqqtwx}{|wz|}z~|~ȀXOTVZ^``c\ZaZ_josmyvxwpx}|~|{~|}~{yyulb_faa^X`[TTMVRNR]Z\XY\YUUWPPZjbms{~sicYSQJ==739.536377:?@INT\_hkfc++4/9/51>5.8:AUtlr||K[]A/;J>3'/*,/AC>))8P37B:EH9ABPI>NINX:787>XYGl{>/>J;&JA7J{wx,$@^KWHRa|]=9.Ihf5'0*)4@@^FUNAEB/*5-:VsF;MSooiv]::6?RUTRW\V[]jgnmmsutywz|zw{}~~Ύi^baV\[aa^W[^idisolrqzuy|~~}}}vvmgc__f\\S[UORJNORY`bbY[]VYTXRW_ajnxz{ymc[SQHA<646//1.16/67=HGRT_fgkid--:58036<6/377Rqƾ|nqzQabF;7I3,',('8@H=$'8J-.MGAW9DAKG<IJGWC;7=JkdG^<78OE'4==Ivvu5(0TQMFJ@z{`=3B`X-&474*15GDRUECI1(776Kxd.*@aiKV}]=;NVSVUXa\]^bkhpoprrtvt~z}z}~{}Ԥzqtjba\_^^[_f`fdolomk|}|{zphcY^]]YTQJPMJQGTY]^]a[_]WZUSW[dait{{uibXM?==<;55-*+4/58=FJNVa`dmimlp--958045<4-476SpǾ|mr{RbaG97I1,',((8@H>#'8M,/MH@X:CAKH:HJGWB;7;KjdH_<78OE%6<=Jvwu4(1TQNFJBzz`;3A`X/%374)14GDRUEDI0)875Mxc.*@aiKU~]<:NVUUUWa^^^bjhpoprrtutz~z}||~ԣzqtiba[`^^\_dacfolnnj|}}{zpibY_]\XUQIPMJQGSZ[_]`\_]WZVSV\bajt{{uhdWN@==<;55-*,3/68=FIOVa^fmilmp
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/fft/ppe/bitReverse.cc	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,32 @@
+#include "bitReverse.h"
+#ifdef __APPLE__
+#include <OpenCL/opencl.h>
+#else
+#include <CL/cl.h>
+#endif
+
+SchedDefineTask1(bitReverse,bitReverse);
+
+static int
+bitReverse(SchedTask* s, void* rbuf, void* wbuf)
+{
+    cl_float2* src = (cl_float2*)s->get_input(rbuf,0);
+    int* m = (int*)s->get_input(rbuf,1);
+    int* n = (int*)s->get_input(rbuf,2);
+    cl_float2* dst = (cl_float2*)s->get_output(wbuf,0);
+    unsigned int* gid = (unsigned int*)s->global_get(0);
+    unsigned int* nid = (unsigned int*)s->global_get(1);
+    unsigned int j = gid[0];
+    
+    j = (j & 0x55555555) << 1 | (j & 0xAAAAAAAA) >> 1;
+    j = (j & 0x33333333) << 2 | (j & 0xCCCCCCCC) >> 2;
+    j = (j & 0x0F0F0F0F) << 4 | (j & 0xF0F0F0F0) >> 4;
+    j = (j & 0x00FF00FF) << 8 | (j & 0xFF00FF00) >> 8;
+    j = (j & 0x0000FFFF) << 16 | (j & 0xFFFF0000) >> 16;
+
+    j >>= (32-m[0]);
+
+    dst[nid[0]*n[0]+j] = src[nid[0]*n[0]+gid[0]];
+
+    return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/fft/ppe/bitReverse.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,8 @@
+#ifndef INCLUDED_TASK_BITREVERSE
+#define INCLUDED_TASK_BITREVERSE
+
+#ifndef INCLUDED_SCHED_TASK
+#include "SchedTask.h"
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/fft/ppe/butterfly.cc	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,59 @@
+#include "butterfly.h"
+#ifdef __APPLE__
+#include <OpenCL/opencl.h>
+#else
+#include <CL/cl.h>
+#endif
+
+SchedDefineTask1(butterfly,butterfly);
+
+static int
+butterfly(SchedTask* s,void* rbuf,void* wbuf)
+{
+    cl_float2* x = (cl_float2*)s->get_input(rbuf,0);
+    cl_float2* w = (cl_float2*)s->get_input(rbuf,1);
+    int* n = (int*)s->get_input(rbuf,3);
+    int* iter = (int*)s->get_input(rbuf,4);
+    cl_uint* flag = (cl_uint*)s->get_input(rbuf,5);
+    
+    unsigned int* gid = (unsigned int*)s->global_get(0);
+    unsigned int* nid = (unsigned int*)s->global_get(1);
+
+    int butterflySize = 1 << (iter[0]-1);
+    int butterflyGrpDist = 1 << iter[0];
+    int butterflyGrpNum = n[0] >> iter[0];
+    int butterflyGrpBase = (gid[0] >> (iter[0]-1))*(butterflyGrpDist);
+    int butterflyGrpOffset = gid[0] & (butterflySize-1);
+
+    int a = nid[0] * n[0] + butterflyGrpBase + butterflyGrpOffset;
+    int b = a + butterflySize;
+
+    int l = butterflyGrpNum * butterflyGrpOffset;
+
+    cl_float2 xa, xb, xbxx, xbyy, wab, wayx, wbyx, resa, resb;
+
+    xa = x[a];
+    xb = x[b];
+    xbxx.x = xbxx.y = xb.x;
+    xbyy.x = xbyy.y = xb.y;
+    
+    wab.x = (cl_float)((cl_uint)w[l].x ^ 0x0);
+    wab.y = (cl_float)((cl_uint)w[l].y ^ flag[0]);
+
+    wayx.x = (cl_float)((cl_uint)wab.y ^ 0x80000000);
+    wayx.y = (cl_float)((cl_uint)wab.x ^ 0x0);
+
+    wbyx.x = (cl_float)((cl_uint)wab.y ^ 0x0);
+    wbyx.y = (cl_float)((cl_uint)wab.x ^ 0x80000000);
+
+    resa.x = xa.x + xbxx.x*wab.x + xbyy.x*wayx.x;
+    resa.y = xa.y + xbxx.y*wab.y + xbyy.y*wayx.y;
+
+    resb.x = xa.x - xbxx.x*wab.x + xbyy.x*wbyx.x;
+    resb.y = xa.y - xbxx.y*wab.y + xbyy.y*wbyx.y;
+
+    x[a] = resa;
+    x[b] = resb;
+
+    return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/fft/ppe/butterfly.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,8 @@
+#ifndef INCUDED_TASK_BUTTERFLY
+#define INCUDED_TASK_BUTTERFLY
+
+#ifndef INCLUDED_SCHED_TASK
+#include "SchedTask.h"
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/fft/ppe/highPassFilter.cc	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,50 @@
+#include "highPassFilter.h"
+#ifdef __APPLE__
+#include <OpenCL/opencl.h>
+#else
+#include <CL/cl.h>
+#endif
+
+SchedDefineTask1(highPassFilter,highPassFilter);
+
+static int
+highPassFilter(SchedTask* s,void* rbuf,void* wbuf)
+{
+    int* n = (int*)s->get_input(rbuf,0);
+    int* radius = (int*)s->get_input(rbuf,1);
+    cl_float2* image = (cl_float2*)s->get_output(wbuf,0);
+    unsigned int* xgid = (unsigned int*)s->global_get(0);
+    unsigned int* ygid = (unsigned int*)s->global_get(1);
+
+    cl_int2 n_2;
+    n_2.x = n_2.y = n[0]>>1;
+    
+    cl_int2 mask;
+    mask.x = mask.y = n[0]-1;
+
+    cl_int2 gid;
+    gid.x = (xgid[0] + n_2.x) & mask.x;
+    gid.y = (ygid[0] + n_2.y) & mask.y;
+
+    cl_int2 diff;
+    diff.x = n_2.x - gid.x;
+    diff.y = n_2.y - gid.y;
+    
+    cl_int2 diff2;
+    diff2.x = diff.x * diff.x;
+    diff2.y = diff.y * diff.y;
+
+    int dist2 = diff2.x + diff2.y;
+
+    cl_int2 window;
+
+    if (dist2 < radius[0]*radius[0]) {
+        window.x = window.y = (int)0L;
+    } else {
+        window.x = window.y = (int)-1L;
+    }
+    image[ygid[0]*n[0]+xgid[0]].x = (float)((int)image[ygid[0]*n[0]+xgid[0]].x & window.x);
+    image[ygid[0]*n[0]+xgid[0]].y = (float)((int)image[ygid[0]*n[0]+xgid[0]].y & window.y);
+
+    return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/fft/ppe/highPassFilter.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,8 @@
+#ifndef INCLUDED_TASK_HIGHPASSFILTER
+#define INCLUDED_TASK_HIGHPASSFILTER
+
+#ifndef INCLUDED_SCHED_TASK
+#include "SchedTask.h"
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/fft/ppe/norm.cc	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,22 @@
+#include "norm.h"
+#ifdef __APPLE__
+#include <OpenCL/opencl.h>
+#else
+#include <CL/cl.h>
+#endif
+
+SchedDefineTask1(norm,norm);
+
+static int
+norm(SchedTask* s, void* rbuf,void* wbuf)
+{
+    cl_float2* x = (cl_float2*)s->get_input(rbuf,0);
+    int* n = (int*)s->get_input(rbuf,1);
+    unsigned int* gid = (unsigned int*)s->global_get(0);
+    unsigned int* nid = (unsigned int*)s->global_get(1);
+    
+    x[nid[0]*n[0]+gid[0]].x = x[nid[0]*n[0]+gid[0]].x / (float)n[0];
+    x[nid[0]*n[0]+gid[0]].y = x[nid[0]*n[0]+gid[0]].y / (float)n[0];
+
+    return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/fft/ppe/norm.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,8 @@
+#ifndef INCLUDED_TASK_NORM
+#define INCLUDED_TASK_NORM
+
+#ifndef INCLUDED_SCHED_TASK
+#include "SchedTask.h"
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/fft/ppe/spinFact.cc	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,28 @@
+#include <math.h>
+#include "spinFact.h"
+#ifdef __APPLE__
+#include <OpenCL/opencl.h>
+#else
+#include <CL/cl.h>
+#endif
+
+#define PI 3.14159265358979323846
+#define PI_2 1.57079632679489661923
+
+SchedDefineTask1(spinFact,spinFact);
+
+static int
+spinFact(SchedTask* s,void* rbuf,void* wbuf)
+{
+    int* n = (int*)s->get_input(rbuf,0);
+    cl_float2* w = (cl_float2*)s->get_output(wbuf,0);
+    unsigned int* i = (unsigned int*)s->global_get(0);
+    cl_float2 angle;
+    angle.x = (float)(2*i[0]*PI/(float)n[0]);
+    angle.y = (float)((2*i[0]*PI/(float)n[0]) + PI_2);
+
+    w[i[0]].x = cos(angle.x);
+    w[i[0]].y = cos(angle.y);
+
+    return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/fft/ppe/spinFact.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,8 @@
+#ifndef INCLUDED_TASK_SPINFACT
+#define INCLUDED_TASK_SPINFACT
+
+#ifndef INCLUDED_SCHED_TASK
+#include "SchedTask.h"
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/fft/ppe/transpose.cc	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,25 @@
+#include "transpose.h"
+#ifdef __APPLE__
+#include <OpenCL/opencl.h>
+#else
+#include <CL/cl.h>
+#endif
+
+SchedDefineTask1(transpose,transpose);
+
+static int
+transpose(SchedTask* s,void* rbuf,void* wbuf)
+{
+    cl_float2* src = (cl_float2*)s->get_input(rbuf,0);
+    int* n = (int*)s->get_input(rbuf,1);
+    cl_float2* dst = (cl_float2*)s->get_output(wbuf,0);
+    unsigned int* xgid = (unsigned int*)s->global_get(0);
+    unsigned int* ygid = (unsigned int*)s->global_get(1);
+
+    unsigned int iid = ygid[0] * n[0] + xgid[0];
+    unsigned int oid = xgid[0] * n[0] + ygid[0];
+
+    dst[oid] = src[iid];
+
+    return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/fft/ppe/transpose.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,8 @@
+#ifndef INCLUDED_TASK_TRANSPOSE
+#define INCLUDED_TASK_TRANSPOSE
+
+#ifndef INCLUDED_SCHED_TASK
+#include "SchedTask.h"
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/fft/spe/bitReverse.cc	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,34 @@
+#include "bitReverse.h"
+#ifdef __APPLE__
+#include <OpenCL/opencl.h>
+#else
+#include <CL/cl.h>
+#endif
+
+SchedDefineTask1(bitReverse,bitReverse);
+
+static int
+bitReverse(SchedTask* s, void* rbuf, void* wbuf)
+{
+    cl_float2* src = (cl_float2*)s->get_input(rbuf,0);
+    int* m = (int*)s->get_input(rbuf,1);
+    int* n = (int*)s->get_input(rbuf,2);
+    cl_float2* dst = (cl_float2*)s->get_output(wbuf,0);
+    //    unsigned int gid = (unsigned int)s->get_param(2);
+    unsigned int gid = (unsigned int)s->get_cpuid();
+    //    unsigned int nid = (unsigned int)s->get_param(3);
+    unsigned int nid = (unsigned int)s->get_cpuid();
+    unsigned int j = gid;
+    
+    j = (j & 0x55555555) << 1 | (j & 0xAAAAAAAA) >> 1;
+    j = (j & 0x33333333) << 2 | (j & 0xCCCCCCCC) >> 2;
+    j = (j & 0x0F0F0F0F) << 4 | (j & 0xF0F0F0F0) >> 4;
+    j = (j & 0x00FF00FF) << 8 | (j & 0xFF00FF00) >> 8;
+    j = (j & 0x0000FFFF) << 16 | (j & 0xFFFF0000) >> 16;
+
+    j >>= (32-m[0]);
+
+    dst[nid*n[0]+j] = src[nid*n[0]+gid];
+
+    return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/fft/spe/bitReverse.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,8 @@
+#ifndef INCLUDED_TASK_BITREVERSE
+#define INCLUDED_TASK_BITREVERSE
+
+#ifndef INCLUDED_SCHED_TASK
+#include "SchedTask.h"
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/fft/spe/butterfly.cc	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,60 @@
+#include "butterfly.h"
+#ifdef __APPLE__
+#include <OpenCL/opencl.h>
+#else
+#include <CL/cl.h>
+#endif
+
+SchedDefineTask1(butterfly,butterfly);
+
+static int
+butterfly(SchedTask* s,void* rbuf,void* wbuf)
+{
+    cl_float2* x = (cl_float2*)s->get_input(rbuf,0);
+    cl_float2* w = (cl_float2*)s->get_input(rbuf,1);
+    int* m = (int*)s->get_input(rbuf,2);
+    int* n = (int*)s->get_input(rbuf,3);
+    int* iter = (int*)s->get_input(rbuf,4);
+    cl_uint* flag = (cl_uint*)s->get_input(rbuf,5);
+    
+    unsigned int gid = (unsigned int)s->get_cpuid();
+    unsigned int nid = (unsigned int)s->get_cpuid();
+
+    int butterflySize = 1 << (iter[0]-1);
+    int butterflyGrpDist = 1 << iter[0];
+    int butterflyGrpNum = n[0] >> iter[0];
+    int butterflyGrpBase = (gid >> (iter[0]-1))*(butterflyGrpDist);
+    int butterflyGrpOffset = gid & (butterflySize-1);
+
+    int a = nid * n[0] + butterflyGrpBase + butterflyGrpOffset;
+    int b = a + butterflySize;
+
+    int l = butterflyGrpNum * butterflyGrpOffset;
+
+    cl_float2 xa, xb, xbxx, xbyy, wab, wayx, wbyx, resa, resb;
+
+    xa = x[a];
+    xb = x[b];
+    xbxx.hi = xbxx.lo = xb.hi;
+    xbyy.hi = xbyy.lo = xb.lo;
+    
+    wab.hi = (cl_float)((cl_uint)w[l].hi ^ 0x0);
+    wab.lo = (cl_float)((cl_uint)w[l].lo ^ flag[0]);
+
+    wayx.hi = (cl_float)((cl_uint)wab.lo ^ 0x80000000);
+    wayx.lo = (cl_float)((cl_uint)wab.hi ^ 0x0);
+
+    wbyx.hi = (cl_float)((cl_uint)wab.lo ^ 0x0);
+    wbyx.lo = (cl_float)((cl_uint)wab.hi ^ 0x80000000);
+
+    resa.hi = xa.hi + xbxx.hi*wab.hi + xbyy.hi*wayx.hi;
+    resa.lo = xa.lo + xbxx.lo*wab.lo + xbyy.lo*wayx.lo;
+
+    resb.hi = xa.hi - xbxx.hi*wab.hi + xbyy.hi*wbyx.hi;
+    resb.lo = xa.lo - xbxx.lo*wab.lo + xbyy.lo*wbyx.lo;
+
+    x[a] = resa;
+    x[b] = resb;
+
+    return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/fft/spe/butterfly.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,8 @@
+#ifndef INCUDED_TASK_BUTTERFLY
+#define INCUDED_TASK_BUTTERFLY
+
+#ifndef INCLUDED_SCHED_TASK
+#include "SchedTask.h"
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/fft/spe/highPassFilter.cc	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,50 @@
+#include "highPassFilter.h"
+#ifdef __APPLE__
+#include <OpenCL/opencl.h>
+#else
+#include <CL/cl.h>
+#endif
+
+SchedDefineTask1(highPassFilter,highPassFilter);
+
+static int
+highPassFilter(SchedTask* s,void* rbuf,void* wbuf)
+{
+    int* n = (int*)s->get_input(rbuf,0);
+    int* radius = (int*)s->get_input(rbuf,1);
+    cl_float2* image = (cl_float2*)s->get_output(wbuf,0);
+    unsigned int xgid = (unsigned int)s->get_cpuid();
+    unsigned int ygid = (unsigned int)s->get_cpuid();
+
+    cl_int2 n_2;
+    n_2.hi = n_2.lo = n[0]>>1;
+    
+    cl_int2 mask;
+    mask.hi = mask.lo = n[0]-1;
+
+    cl_int2 gid;
+    gid.hi = (xgid + n_2.hi) & mask.hi;
+    gid.lo = (ygid + n_2.lo) & mask.lo;
+
+    cl_int2 diff;
+    diff.hi = n_2.hi - gid.hi;
+    diff.lo = n_2.lo - gid.lo;
+    
+    cl_int2 diff2;
+    diff2.hi = diff.hi * diff.hi;
+    diff2.lo = diff.lo * diff.lo;
+
+    int dist2 = diff2.hi + diff2.lo;
+
+    cl_int2 window;
+
+    if (dist2 < radius[0]*radius[0]) {
+        window.hi = window.lo = (int)0L;
+    } else {
+        window.hi = window.lo = (int)-1L;
+    }
+    image[ygid*n[0]+xgid].hi = (float)((int)image[ygid*n[0]+xgid].hi & window.hi);
+    image[ygid*n[0]+xgid].lo = (float)((int)image[ygid*n[0]+xgid].lo & window.lo);
+
+    return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/fft/spe/highPassFilter.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,8 @@
+#ifndef INCLUDED_TASK_HIGHPASSFILTER
+#define INCLUDED_TASK_HIGHPASSFILTER
+
+#ifndef INCLUDED_SCHED_TASK
+#include "SchedTask.h"
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/fft/spe/norm.cc	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,22 @@
+#include "norm.h"
+#ifdef __APPLE__
+#include <OpenCL/opencl.h>
+#else
+#include <CL/cl.h>
+#endif
+
+SchedDefineTask1(norm,norm);
+
+static int
+norm(SchedTask* s, void* rbuf,void* wbuf)
+{
+    cl_float2* x = (cl_float2*)s->get_input(rbuf,0);
+    int* n = (int*)s->get_input(rbuf,1);
+    unsigned int gid = (unsigned int)s->get_cpuid();
+    unsigned int nid = (unsigned int)s->get_cpuid();
+    
+    x[nid*n[0]+gid].hi = x[nid*n[0]+gid].hi / (float)n[0];
+    x[nid*n[0]+gid].lo = x[nid*n[0]+gid].lo / (float)n[0];
+
+    return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/fft/spe/norm.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,8 @@
+#ifndef INCLUDED_TASK_NORM
+#define INCLUDED_TASK_NORM
+
+#ifndef INCLUDED_SCHED_TASK
+#include "SchedTask.h"
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/fft/spe/spinFact.cc	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,28 @@
+#include <math.h>
+#include "spinFact.h"
+#ifdef __APPLE__
+#include <OpenCL/opencl.h>
+#else
+#include <CL/cl.h>
+#endif
+
+#define PI 3.14159265358979323846
+#define PI_2 1.57079632679489661923
+
+SchedDefineTask1(spinFact,spinFact);
+
+static int
+spinFact(SchedTask* s,void* rbuf,void* wbuf)
+{
+    int* n = (int*)s->get_input(rbuf,0);
+    cl_float2* w = (cl_float2*)s->get_output(wbuf,0);
+    unsigned int i = (unsigned int)s->get_cpuid();
+    cl_float2 angle;
+    angle.hi = (float)(2*i*PI/(float)n[0]);
+    angle.lo = (float)((2*i*PI/(float)n[0]) + PI_2);
+
+    w[i].hi = cos(angle.hi);
+    w[i].lo = cos(angle.lo);
+
+    return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/fft/spe/spinFact.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,8 @@
+#ifndef INCLUDED_TASK_SPINFACT
+#define INCLUDED_TASK_SPINFACT
+
+#ifndef INCLUDED_SCHED_TASK
+#include "SchedTask.h"
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/fft/spe/transpose.cc	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,25 @@
+#include "transpose.h"
+#ifdef __APPLE__
+#include <OpenCL/opencl.h>
+#else
+#include <CL/cl.h>
+#endif
+
+SchedDefineTask1(transpose,transpose);
+
+static int
+transpose(SchedTask* s,void* rbuf,void* wbuf)
+{
+    cl_float2* src = (cl_float2*)s->get_input(rbuf,0);
+    int* n = (int*)s->get_input(rbuf,1);
+    cl_float2* dst = (cl_float2*)s->get_output(wbuf,0);
+    unsigned int xgid = (unsigned int)s->get_cpuid();
+    unsigned int ygid = (unsigned int)s->get_cpuid();
+
+    unsigned int iid = ygid * n[0] + xgid;
+    unsigned int oid = xgid * n[0] + ygid;
+
+    dst[oid] = src[iid];
+
+    return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/fft/spe/transpose.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,8 @@
+#ifndef INCLUDED_TASK_TRANSPOSE
+#define INCLUDED_TASK_TRANSPOSE
+
+#ifndef INCLUDED_SCHED_TASK
+#include "SchedTask.h"
+#endif
+
+#endif
--- a/example/fft/task_init.cc	Tue Mar 12 16:52:49 2013 +0900
+++ b/example/fft/task_init.cc	Tue Mar 12 17:06:42 2013 +0900
@@ -3,29 +3,28 @@
 #include "GpuScheduler.h"
 
 #ifndef __CERIUM_GPU__
-SchedExternTask(spinfact);
-SchedExternTask(bitreverse);
-SchedExternTask(normalization);
+SchedExternTask(spinFact);
+SchedExternTask(bitReverse);
+SchedExternTask(norm);
 SchedExternTask(butterfly);
 SchedExternTask(transpose);
-SchedExternTask(highpassfilter);
+SchedExternTask(highPassFilter);
 #endif // not __CERIUM_GPU__
 
 void
 task_init(void)
 {
 #ifdef __CERIUM_GPU__
-    GpuSchedRegister(SPIN_FACT, "gpu/spinFact.cl", "spinFact");
-    GpuSchedRegister(BIT_REVERSE, "gpu/bitReverse.cl", "bitReverse");
-    GpuSchedRegister(NORMALIZATION, "gpu/norm.cl", "norm");
-    GpuSchedRegister(BUTTERFLY, "gpu/butterfly.cl", "butterfly");
-    GpuSchedRegister(TRANSEPOSE, "gpu/transpose.cl", "transpose");
-    GpuSchedRegister(HIGH_PASS_FILTER, "gpu/passFilter.cl", "highPassFilter");
+    GpuSchedRegister(SPIN_FACT, "gpu/fft.cl", "spinFact");
+    GpuSchedRegister(BIT_REVERSE, "gpu/fft.cl", "bitReverse");
+    GpuSchedRegister(NORMALIZATION, "gpu/fft.cl", "norm");
+    GpuSchedRegister(BUTTERFLY, "gpu/fft.cl", "butterfly");
+    GpuSchedRegister(TRANSEPOSE, "gpu/fft.cl", "transpose");
+    GpuSchedRegister(HIGH_PASS_FILTER, "gpu/fft.cl", "highPassFilter");
 #else
-    SchedRegisterTask(QUICK_SORT, QuickSort);
     SchedRegisterTask(SPIN_FACT,spinFact);
+    SchedRegisterTask(NORMALIZATION, norm);
     SchedRegisterTask(BIT_REVERSE, bitReverse);
-    SchedRegisterTask(NORMALIZATION, norm);
     SchedRegisterTask(BUTTERFLY, butterfly);
     SchedRegisterTask(TRANSEPOSE, transpose);
     SchedRegisterTask(HIGH_PASS_FILTER, highPassFilter);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/fft/task_init.cc.orig	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,32 @@
+#include "Func.h"
+#include "Scheduler.h"
+#include "GpuScheduler.h"
+
+#ifndef __CERIUM_GPU__
+SchedExternTask(spinFact);
+SchedExternTask(bitReverse);
+SchedExternTask(norm);
+SchedExternTask(butterfly);
+SchedExternTask(transpose);
+SchedExternTask(highPassFilter);
+#endif // not __CERIUM_GPU__
+
+void
+task_init(void)
+{
+#ifdef __CERIUM_GPU__
+    GpuSchedRegister(SPIN_FACT, "gpu/fft.cl", "spinFact");
+    GpuSchedRegister(BIT_REVERSE, "gpu/fft.cl", "bitReverse");
+    GpuSchedRegister(NORMALIZATION, "gpu/fft.cl", "norm");
+    GpuSchedRegister(BUTTERFLY, "gpu/fft.cl", "butterfly");
+    GpuSchedRegister(TRANSEPOSE, "gpu/fft.cl", "transpose");
+    GpuSchedRegister(HIGH_PASS_FILTER, "gpu/fft.cl", "highPassFilter");
+#else
+    SchedRegisterTask(SPIN_FACT,spinFact);
+    SchedRegisterTask(NORMALIZATION, norm);
+    SchedRegisterTask(BIT_REVERSE, bitReverse);
+    SchedRegisterTask(BUTTERFLY, butterfly);
+    SchedRegisterTask(TRANSEPOSE, transpose);
+    SchedRegisterTask(HIGH_PASS_FILTER, highPassFilter);
+#endif
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/many_task/spe/QuickSort.cc.orig	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,75 @@
+#include "QuickSort.h"
+#include <stdio.h>
+#include <string.h>
+
+SchedDefineTask(QuickSort);
+
+static void quick_sort( Data *data, int begin, int end ) ;
+
+static void
+swap( Data *data, int left, int right )
+{
+    Data tmp	      = data[left];
+    data[left]  = data[right];
+    data[right] = tmp;
+}
+
+// #define USE_MEMCPY
+
+static int
+run(SchedTask *s, void* rbuff, void* wbuff) {
+    // copy value
+    int begin	= 0;
+#if USE_SIMPLE_TASK
+    int end = s->read_size()/sizeof(Data);
+    Data *r_data = (Data*)rbuff;
+#ifdef USE_MEMCPY
+    Data *w_data = (Data*)wbuff;
+#endif
+#else
+    int end = s->get_inputSize(0)/sizeof(Data);
+    DataPtr r_data = (DataPtr)s->get_input(0);
+#ifdef USE_MEMCPY
+    DataPtr w_data = (DataPtr)s->get_output(0);
+#endif
+#endif
+
+    //printf("[SPE] Quick: length:%d addr->%x \n",end, (int)rbuff);
+    //printf("[PPE] Quick: data[0]: %d addr->%x\n",sizeof(r_data),r_data); 
+
+    //show_data(r_data, end);
+    quick_sort(r_data, begin, end-1);
+#ifdef USE_MEMCPY
+    memcpy(w_data, r_data, sizeof(Data)*end);
+#else
+    s->swap();
+#endif
+
+    return 0;
+}
+
+static void 
+quick_sort( Data *data, int begin, int end ) {
+
+  if (begin < end) {
+	int where = (begin + end) / 2;
+	int pivot = data[where].index;
+	data[where].index = data[begin].index;
+	int p = begin;
+	int i;
+	for (i=begin+1; i<=end; i++) {
+	    if (data[i].index < pivot) { 
+		p++; 
+		swap(data, p, i); 
+	    }
+	}
+	data[begin].index = data[p].index;
+	data[p].index = pivot;
+	
+	quick_sort(data, begin, p-1);
+	quick_sort(data, p+1, end); // tail call
+    }
+}
+
+
+/* end */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/word_count/ppe/Exec.cc.orig	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,45 @@
+#include <stdio.h>
+#include <string.h>
+#include "Exec.h"
+#include "Func.h"
+
+/* これは必須 */
+SchedDefineTask(Exec);
+
+static int
+run(SchedTask *s, void *rbuf, void *wbuf)
+{
+    char *i_data = (char *)s->get_input(rbuf,0);
+    unsigned long long *o_data = (unsigned long long*)s->get_output(wbuf,0);
+    unsigned long long *head_tail_flag = o_data +2;
+    int length = (int)s->get_inputSize(0);
+    int word_flag = 0;
+    int word_num = 0;
+    int line_num = 0;
+    int i = 0;
+
+    head_tail_flag[0] = (i_data[0] != 0x20) && (i_data[0] != 0x0A);
+    word_num -= 1-head_tail_flag[0];
+
+    for (; i < length; i++) {
+        if (i_data[i] == 0x20) { // 空白
+            word_flag = 1;
+        } else if (i_data[i] == 0x0A) { // 改行
+            line_num += 1;
+            word_flag = 1;
+        } else {
+            word_num += word_flag;
+            word_flag = 0;
+        }
+    }
+
+    word_num += word_flag;
+    head_tail_flag[1] = (i_data[i-1] != 0x20) && (i_data[i-1] != 0x0A);
+
+    // s->printf("SPE word %d line %d\n",word_num,line_num);
+
+    o_data[0] = (unsigned long long)word_num;
+    o_data[1] = (unsigned long long)line_num;
+
+    return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/AddrList.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,20 @@
+#ifndef INCLUDED_ADDR_LIST
+#define INCLUDED_ADDR_LIST
+
+#include "types.h"
+
+/*
+
+  MainMemory 側の MemorySegment に近いかも?
+  Iterator で使う、MainMemory 側の アドレスリスト
+
+ */
+
+typedef struct AddrList {
+
+  memaddr addr;
+  AddrList *next;
+
+}AddrList, *AddrListPtr; // 8
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/CellDmaManager.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,78 @@
+#ifndef INCLUDED_CELL_DMA_MANAGER
+#define INCLUDED_CELL_DMA_MANAGER
+
+#include "base.h"
+#include "types.h"
+#include "DmaManager.h"
+#include "MailManager.h"
+#include "TaskManagerImpl.h"
+
+#include <spu_mfcio.h>
+#include <spu_intrinsics.h>
+
+#define SPU_PROFILE 1
+
+class Scheduler;
+
+class CellDmaManager : public DmaManager {
+public:
+    BASE_NEW_DELETE(CellDmaManager);
+
+    typedef struct dma_list {
+	uint32 addr;  // should be memaddr, but in Cell's specification...
+	uint32 size;
+    }  __attribute__ ((aligned (DEFAULT_ALIGNMENT))) DmaList, *DmaListPtr;
+
+
+    CellDmaManager() ;
+
+    /* variables */
+    unsigned int wait_time, busy_time, alloc_busy_time;
+    unsigned long long global_busy_time, global_wait_time, global_mail_time, mainMemalloc_time;
+    unsigned long long task_list_mail_time;
+    unsigned long long mail_read_time, mail_write_time;
+    unsigned long long task_list_mail_read_time, finish_mail_write_time;
+    int task_list_read_count;
+
+    /* functions */
+    void *dma_load(Scheduler *s, memaddr addr, uint32 size, uint32 mask);
+    void *dma_load1(void *buf, memaddr addr, uint32 size, uint32 mask);
+    void *dma_store(Scheduler *s,void *buf, memaddr addr, uint32 size, uint32 mask);
+
+    void *get_writebuf(Scheduler *s, memaddr addr, uint32 size);
+
+    void dma_wait(uint32 mask) ;
+    void dma_wait(uint32 mask, int cmd) ;
+    void (CellDmaManager::*start_dmawait_profile)();
+    void (CellDmaManager::*end_dmawait_profile)(unsigned long long *counter);
+    void start_profile();
+    void stop_profile();
+
+
+    void show_dma_wait(Scheduler *s, int cpu);
+
+    void mail_write(memaddr data);
+    void mail_write_finish_list(memaddr data);
+    memaddr mail_read();
+    memaddr task_list_mail_read();
+    void *dma_loadList(Scheduler *s,ListDataPtr list, uint32 mask);
+    void dma_storeList(ListDataPtr, void *buff, uint32 mask);
+    uint32 get_tag();
+    void bound(ListData *);
+    void *get_writebuf(Scheduler *s, ListDataPtr, uint32 size) ;
+
+
+    private:
+
+    void do_start_dmawait_profile();
+    void do_end_dmawait_profile(unsigned long long *counter);
+    void null_start_dmawait_profile();
+    void null_end_dmawait_profile(unsigned long long *counter);
+
+    MailManagerPtr mail_queue;
+
+
+/* end */
+}  ;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/CellScheduler.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,22 @@
+#ifndef INCLUDED_CELL_SCHEDULER
+#define INCLUDED_CELL_SCHEDULER
+
+#include "base.h"
+#include "Scheduler.h"
+
+class CellScheduler : public Scheduler {
+public:
+    BASE_NEW_DELETE(CellScheduler);
+
+    void init_impl(int useRefDma);
+
+    void *allocate(int size);
+    void mainMem_alloc(int id, int size);
+    void mainMem_wait(void);
+    uint32 get_tag();
+
+private:
+    int mainMemNum;
+} ;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/CellTaskManagerImpl.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,53 @@
+#ifndef INCLUDED_CELL_TASK_MANAGER_IMPL
+#define INCLUDED_CELL_TASK_MANAGER_IMPL
+
+#include "TaskManagerImpl.h"
+#include "FifoTaskManagerImpl.h"
+#ifdef __CERIUM_CELL__
+#include "SpeThreads.h"
+#else
+#include "CpuThreads.h"
+#endif
+
+class CellTaskManagerImpl : public TaskManagerImpl {
+public:
+    /* constructor */
+    CellTaskManagerImpl(int num, Threads *cpus) : TaskManagerImpl(num) {speThreads = cpus;}
+    ~CellTaskManagerImpl();
+
+    /* variables */
+    QueueInfo<TaskList> **taskListInfo;
+    QueueInfo<TaskList> **speTaskList;  // running task
+
+    Threads *speThreads;
+    FifoTaskManagerImpl *ppeManager;
+    int spe_running;
+    int spuIdle;
+    /* functions */
+    // system
+    void init(int spuIdle,int useRefDma, int export_task_log);
+    void run();
+    void poll();
+    void poll1(int spu_limit);
+    void poll2(int spu_limit);
+    void mail_check(int id);
+    TaskListPtr createTaskList();
+    //void set_runTaskList(*QueueInfo<HTask>);
+    void set_runTaskList(QueueInfo<HTask>* activeTaskQueue);
+    void set_NDRange(void* ndr);
+    void sendTaskList();
+    void append_activeTask(HTaskPtr);
+    void show_profile() ;
+    void start_profile() ;
+    void export_task_log() ;
+    void polling();
+    void debug_check_spe_idle(QueueInfo<HTask> * activeTaskQueue, int spe_running_);
+    void print_arch();
+
+private:
+    void send_taskList(int id);
+    void show_dead_lock_info();
+
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/CpuThreads.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,49 @@
+#ifndef INCLUDED_CPU_THREADS
+#define INCLUDED_CPU_THREADS
+
+#include <pthread.h>
+#include "Threads.h"
+#include "GpuThreads.h"
+#include "TaskManagerImpl.h"
+#include "MainScheduler.h"
+#include "Sem.h"
+
+typedef struct cpu_arg {
+    int cpuid;
+    // should be syncrhonized
+    MainScheduler *scheduler;
+    TaskManagerImpl *manager;
+    SemPtr wait;
+	int useRefDma;
+    
+} cpu_thread_arg_t;
+
+//class GpuThreads;
+
+class CpuThreads : public Threads {
+ public:
+    /* constructor */
+    CpuThreads(int num = 1, int useRefDma = 0, int start_id = 0);
+    ~CpuThreads();
+    static void *cpu_thread_run(void *args);
+    
+    /* functions */
+    virtual void init();
+    virtual int get_mail(int speid, int count, memaddr *ret); // BLOCKING
+    virtual int has_mail(int speid, int count, memaddr *ret); // NONBLOCK
+    virtual void send_mail(int speid, int num, memaddr *data); // BLOCKING
+    virtual void add_output_tasklist(int command, memaddr buff, int alloc_size);
+    virtual int is_gpu(int cpuid);
+    virtual void set_NDRange(void *ndr);
+private:
+    /* variables */
+    pthread_t *threads;
+    cpu_thread_arg_t *args;
+    SemPtr wait; //スレッド生成時の待ち用
+    int cpu_num;
+    int use_refdma;
+    int id_offset;
+    GpuThreads *gpu;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/DmaManager.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,48 @@
+#ifndef INCLUDED_DMA_MANAGER
+#define INCLUDED_DMA_MANAGER
+
+#include "base.h"
+#include "ListData.h"
+#include "types.h"
+
+enum dma_tag {
+    DMA_READ  = 25,
+    DMA_READ2  = 26,
+    DMA_WRITE = 27,
+//    DMA_READ_IN_LIST  = 29,
+//    DMA_READ_OUT_LIST = 30,
+    DMA_READ_TASKLIST = 31,
+};
+
+class Scheduler;
+
+class DmaManager {
+public:
+    virtual ~DmaManager() {};
+
+    BASE_NEW_DELETE(DmaManager);
+
+    // API for DMA transfer
+    virtual void *dma_load(Scheduler *s, memaddr addr, uint32 size, uint32 mask) { return 0; }
+    virtual void *dma_load1(void *buf, memaddr addr, uint32 size, uint32 mask) { return 0; }
+    virtual void *dma_store(void *buf,memaddr addr, uint32 size, uint32 mask) { return 0; }
+    virtual void free_(void *buf) { free(buf); }
+    virtual void *get_writebuf(Scheduler *s, memaddr addr, uint32 size) { return 0; }
+    virtual void dma_wait(uint32 mask) {}
+    virtual void show_dma_wait(Scheduler *s, int cpu) {}
+    virtual void start_profile() {}
+
+    // API for SPU inbound/outbound mailbox
+    virtual void mail_write(memaddr data) {}
+    virtual void mail_write_finish_list(memaddr data) {}
+    virtual memaddr mail_read() { return 0; }
+    virtual memaddr task_list_mail_read() { return 0; }
+    
+    // API for MFC list DMA transfer
+    virtual void *dma_loadList(Scheduler *s, ListDataPtr list, uint32 mask) { return 0; }
+    virtual void dma_storeList(ListDataPtr, void *buff, uint32 mask) {}
+    virtual uint32 get_tag() { return 0;}
+    virtual void bound(ListData *) {}
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/ExportTaskLog.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,28 @@
+#ifndef included_exporttasklog
+#define included_exporttasklog
+
+#include <stdio.h>
+#include "TaskLog.h"
+#include "QueueInfo.h"
+
+class ExportTaskLog {
+public:
+    ExportTaskLog(QueueInfo<TaskLog> *_tasklog);
+    virtual ~ExportTaskLog();
+
+public:
+    void open();
+    void printOut();
+    void close();
+
+private:
+    QueueInfo<TaskLog> *tasklog;
+    FILE *fp;
+
+    static const char* const FILENAME;
+
+};
+
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/FifoDmaManager.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,85 @@
+#ifndef INCLUDED_FIFO_DMA_MANAGER
+#define INCLUDED_FIFO_DMA_MANAGER
+
+#include "base.h"
+#include "DmaManager.h"
+
+#ifdef __CERIUM_PARALLEL__
+#include "SynchronizedMailManager.h"
+#else
+#include "MailManager.h"
+#endif
+
+class FifoDmaManager : public DmaManager {
+
+protected:
+    /* variables */
+    MailManagerPtr mail_queue1;
+    MailManagerPtr mail_queue2;
+
+public:
+    BASE_NEW_DELETE(FifoDmaManager);
+
+    FifoDmaManager() {
+#ifdef __CERIUM_PARALLEL__
+        mail_queue1 = new SynchronizedMailManager();
+        mail_queue2 = new SynchronizedMailManager();
+#else
+        mail_queue1 = new MailManager();
+        mail_queue2 = new MailManager();
+#endif
+        start_dmawait_profile = &FifoDmaManager::null_start_dmawait_profile;
+        end_dmawait_profile = &FifoDmaManager::null_end_dmawait_profile;
+    }
+
+    ~FifoDmaManager() {
+	delete mail_queue1;
+	delete mail_queue2;
+    }
+
+	/* variables */
+protected:
+    unsigned long long start_time, stop_time;
+    unsigned long long global_busy_time, global_load_time, global_store_time, global_mail_time;
+    unsigned long long dma_load_time, dma_store_time, dma_loadList_time, dma_storeList_time;
+    unsigned long long mail_read_time, mail_write_time;
+    unsigned long long mail_read_from_host_time, mail_write_from_host_time;
+
+    /* functions */
+public:
+    virtual void *dma_load(Scheduler *s, memaddr addr, uint32 size, uint32 mask);
+    virtual void *dma_load1(void *buf, memaddr addr, uint32 size, uint32 mask);
+    virtual void *dma_store(void *buf, memaddr addr, uint32 size, uint32 mask);
+    virtual void dma_wait(uint32 mask) ;
+    virtual void *get_writebuf(Scheduler *s, memaddr addr, uint32 size) ;
+    void (FifoDmaManager::*start_dmawait_profile)();
+    void (FifoDmaManager::*end_dmawait_profile)(unsigned long long *counter);
+    void start_profile();
+    void stop_profile();
+
+    void show_dma_wait(Scheduler *s, int cpu);
+
+    void mail_write(memaddr data);
+    void mail_write_finish_list(memaddr data);
+    memaddr mail_read();
+    memaddr task_list_mail_read();
+
+    void mail_write_from_host(memaddr data); 
+    memaddr mail_read_from_host();
+    int has_mail_from_host();
+
+    virtual void *dma_loadList(Scheduler *s, ListDataPtr list, uint32 mask);
+    virtual void dma_storeList(ListDataPtr, void *buff, uint32 mask);
+
+    uint32 get_tag();
+    virtual void bound(ListData *);
+
+private:
+    void do_start_dmawait_profile();
+    void do_end_dmawait_profile(unsigned long long *counter);
+    void null_start_dmawait_profile();
+    void null_end_dmawait_profile(unsigned long long *counter);
+
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/FifoTaskManagerImpl.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,52 @@
+#ifndef INCLUDED_FIFO_TASK_MANAGER_IMPL
+#define INCLUDED_FIFO_TASK_MANAGER_IMPL
+
+#include "TaskManagerImpl.h"
+#include "MainScheduler.h"
+#include "Scheduler.h"
+#include "CpuThreads.h"
+
+class FifoTaskManagerImpl : public TaskManagerImpl {
+public:
+    /* constructor */
+    FifoTaskManagerImpl(int num) : TaskManagerImpl(num) {}
+    ~FifoTaskManagerImpl(void);
+
+    /* variables */
+    int machineNum;
+    QueueInfo<TaskList> *taskListInfo;  
+    QueueInfo<TaskList> *ppeTaskList;  // running task
+
+    MailManager *mailManager;
+    MainScheduler *mainScheduler;
+
+    /* functions */
+    // call by system
+    void init(int spuIdle, int useRefDma, int export_task_log);
+    void init(MainScheduler*, TaskManagerImpl*, int);
+    void poll();  // called from CellTaskManagerImpl
+    void poll1();  // single CPU run called from CellTaskManagerImpl
+    void run();
+    void show_profile();
+    void start_profile();
+    void export_task_log();
+    void polling();
+    TaskListPtr createTaskList();
+
+    void mail_check();
+
+    void set_runTaskList(QueueInfo<HTask>* activeTaskQueue);
+    //void set_runTaskList();
+    void sendTaskList();
+
+    void print_arch();
+    void set_NDRange(void* ndr);
+
+    // call by user
+private:
+    void set_runTaskList1(QueueInfo<HTask>* activeTaskQueue);
+
+};
+
+
+#endif /* INCLUDED_FIFO_TASK_MANAGER_IMPL */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/Finish.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,7 @@
+#ifndef INCLUDED_SYSTASK_FINISH
+#define INCLUDED_SYSTASK_FINISH
+
+#include "SchedTask.h"
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/GpuError.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,62 @@
+const char* convert_error_status(cl_uint status){
+    static const struct {
+        const cl_uint status;
+        const char *status_string;
+    } Error_Status[] = {
+        {CL_SUCCESS,                         "CL_SUCCESS"}
+        ,{CL_DEVICE_NOT_FOUND,                "CL_DEVICE_NOT_FOUND"}
+        ,{CL_DEVICE_NOT_AVAILABLE,            "CL_DEVICE_NOT_AVAILABLE"}
+        ,{CL_COMPILER_NOT_AVAILABLE,          "CL_COMPILER_NOT_AVAILABLE"}
+        ,{CL_MEM_OBJECT_ALLOCATION_FAILURE,   "CL_MEM_OBJECT_ALLOCATION_FAILURE"}
+        ,{CL_OUT_OF_RESOURCES,                "CL_OUT_OF_RESOURCES"}
+        ,{CL_OUT_OF_HOST_MEMORY,              "CL_OUT_OF_HOST_MEMORY"}
+        ,{CL_PROFILING_INFO_NOT_AVAILABLE,    "CL_PROFILING_INFO_NOT_AVAILABLE"}
+        ,{CL_MEM_COPY_OVERLAP,                "CL_MEM_COPY_OVERLAP"}
+        ,{CL_IMAGE_FORMAT_MISMATCH,           "CL_IMAGE_FORMAT_MISMATCH"}
+        ,{CL_IMAGE_FORMAT_NOT_SUPPORTED,      "CL_IMAGE_FORMAT_NOT_SUPPORTED"}
+        ,{CL_BUILD_PROGRAM_FAILURE,           "CL_BUILD_PROGRAM_FAILURE"}
+        ,{CL_MAP_FAILURE,                     "CL_MAP_FAILURE"}
+        ,{CL_INVALID_VALUE,                   "CL_INVALID_VALUE"}
+        ,{CL_INVALID_DEVICE_TYPE,             "CL_INVALID_DEVICE_TYPE"}
+        ,{CL_INVALID_PLATFORM,                "CL_INVALID_PLATFORM"}
+        ,{CL_INVALID_DEVICE,                  "CL_INVALID_DEVICE"}
+        ,{CL_INVALID_CONTEXT,                 "CL_INVALID_CONTEXT"}
+        ,{CL_INVALID_QUEUE_PROPERTIES,        "CL_INVALID_QUEUE_PROPERTIES"}
+        ,{CL_INVALID_COMMAND_QUEUE,           "CL_INVALID_COMMAND_QUEUE"}
+        ,{CL_INVALID_HOST_PTR,                "CL_INVALID_HOST_PTR"}
+        ,{CL_INVALID_MEM_OBJECT,              "CL_INVALID_MEM_OBJECT"}
+        ,{CL_INVALID_IMAGE_FORMAT_DESCRIPTOR, "CL_INVALID_IMAGE_FORMAT_DESCRIPTOR"}
+        ,{CL_INVALID_IMAGE_SIZE,              "CL_INVALID_IMAGE_SIZE"}
+        ,{CL_INVALID_SAMPLER,                 "CL_INVALID_SAMPLER"}
+        ,{CL_INVALID_BINARY,                  "CL_INVALID_BINARY"}
+        ,{CL_INVALID_BUILD_OPTIONS,           "CL_INVALID_BUILD_OPTIONS"}
+        ,{CL_INVALID_PROGRAM,                 "CL_INVALID_PROGRAM"}
+        ,{CL_INVALID_PROGRAM_EXECUTABLE,      "CL_INVALID_PROGRAM_EXECUTABLE"}
+        ,{CL_INVALID_KERNEL_NAME,             "CL_INVALID_KERNEL_NAME"}
+        ,{CL_INVALID_KERNEL_DEFINITION,       "CL_INVALID_KERNEL_DEFINITION"}
+        ,{CL_INVALID_KERNEL,                  "CL_INVALID_KERNEL"}
+        ,{CL_INVALID_ARG_INDEX,               "CL_INVALID_ARG_INDEX"}
+        ,{CL_INVALID_ARG_VALUE,               "CL_INVALID_ARG_VALUE"}
+        ,{CL_INVALID_ARG_SIZE,                "CL_INVALID_ARG_SIZE"}
+        ,{CL_INVALID_KERNEL_ARGS,             "CL_INVALID_KERNEL_ARGS"}
+        ,{CL_INVALID_WORK_DIMENSION,          "CL_INVALID_WORK_DIMENSION"}
+        ,{CL_INVALID_WORK_GROUP_SIZE,         "CL_INVALID_WORK_GROUP_SIZE"}
+        ,{CL_INVALID_WORK_ITEM_SIZE,          "CL_INVALID_WORK_ITEM_SIZE"}
+        ,{CL_INVALID_GLOBAL_OFFSET,           "CL_INVALID_GLOBAL_OFFSET"}
+        ,{CL_INVALID_EVENT_WAIT_LIST,         "CL_INVALID_EVENT_WAIT_LIST"}
+        ,{CL_INVALID_EVENT,                   "CL_INVALID_EVENT"}
+        ,{CL_INVALID_OPERATION,               "CL_INVALID_OPERATION"}
+        ,{CL_INVALID_GL_OBJECT,               "CL_INVALID_GL_OBJECT"}
+        ,{CL_INVALID_BUFFER_SIZE,             "CL_INVALID_BUFFER_SIZE"}
+        ,{CL_INVALID_MIP_LEVEL,               "CL_INVALID_MIP_LEVEL"}
+        ,{0, NULL}
+    };
+    const char* message;
+
+    for(int i=0; Error_Status[i].status_string !=NULL; i++){
+        if (Error_Status[i].status == status) {
+            message = Error_Status[i].status_string;
+        }
+    }
+    return message;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/GpuFunc.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,7 @@
+
+enum {
+#include "SysTasks.h"
+    mogyo,
+    Twice,
+    //    Func1,
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/GpuScheduler.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,56 @@
+#ifndef INCLUDED_GPU_SCHEDULER
+#define INCLUDED_GPU_SCHEDULER
+
+#include "Scheduler.h"
+#include "FifoDmaManager.h"
+#include "GpuThreads.h"
+#include "HTask.h"
+#include "TaskManager.h"
+
+#ifdef __APPLE__
+#include <OpenCL/opencl.h>
+#else
+#include <CL/cl.h>
+#endif
+
+class GpuScheduler : public Scheduler {
+ public:
+    GpuScheduler();
+    virtual ~GpuScheduler();
+    void init_impl(int useRefDma);
+    void init_gpu();
+    void run();
+    void set_NDRange(void* ndr_);
+    
+    void mail_write_from_host(memaddr data) {
+        fifoDmaManager->mail_write_from_host(data);
+    }
+
+    memaddr mail_read_from_host() {
+        return fifoDmaManager->mail_read_from_host();
+    }
+
+    int has_mail_from_host() {
+        return fifoDmaManager->has_mail_from_host();
+    }
+
+    cl_platform_id platform_id;
+    cl_device_id device_id;
+    cl_uint ret_num_platforms;
+    cl_uint ret_num_devices;
+    cl_context context;
+    cl_command_queue command_queue;
+    cl_int ret;
+    ND_RANGE_T_PTR ndr;
+private:
+    FifoDmaManager *fifoDmaManager;
+    void load_kernel(int cmd);
+
+};
+
+#define GpuSchedRegister(str, filename, functionname)   \
+    gpu_register_task(str, filename, functionname);
+#endif
+
+extern void gpu_register_task(int cmd,const char* filename,const char* functionname);
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/GpuThreads.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,52 @@
+#ifndef INCLUDED_GPU_THREADS
+#define INCLUDED_GPU_THREADS
+
+#include <pthread.h>
+#include "Threads.h"
+#include "GpuScheduler.h"
+#include "Sem.h"
+
+#ifdef __APPLE__
+#include <OpenCL/opencl.h>
+#else
+#include <CL/cl.h>
+#endif
+
+class GpuScheduler;
+
+typedef struct gpu_arg {
+    int cpuid;
+    // should be syncrhonized
+    GpuScheduler *scheduler;
+    TaskManagerImpl *manager;
+    SemPtr wait;
+	int useRefDma;
+} gpu_thread_arg_t;
+
+class GpuThreads : public Threads {
+ public:
+    /*
+      static GpuThreads* getInstance() {
+      static GpuThreads singleton;
+      return &singleton;
+      }*/
+    GpuThreads(int useRefDma);
+    ~GpuThreads();
+    
+    void init();
+    static void *gpu_thread_run(void *args);
+
+    int get_mail(int speid, int count, memaddr *ret);
+    int has_mail(int speid, int count, memaddr *ret);
+    void send_mail(int speid, int num, memaddr *data);
+    void add_output_tasklist(int command, memaddr buff, int alloc_size);
+    void set_wait(SemPtr);
+    void set_NDRange(void* ndr);
+    
+  private:
+    gpu_thread_arg_t *args;
+    pthread_t *threads;
+    int use_refdma;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/HTask.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,164 @@
+#ifndef INCLUDED_HTASK
+#define INCLUDED_HTASK
+
+#include "base.h"
+#include "types.h"
+#include "Task.h"
+#include "TaskList.h"
+#include "TaskQueue.h"
+#include "QueueInfo.h"
+#include "TaskLog.h"
+//#include <stdio.h>
+
+class TaskManagerImpl;
+class SchedTask;
+
+typedef void (*PostFunction)(SchedTask *s, void *read, void *write);
+
+extern QueueInfo<TaskQueue>* taskQueuePool;
+
+/*!
+  @class
+
+  @brief
+
+  Cerium の Task で、spawn() でキューに格納されて順次実行される。
+  cpu の指定があれば並列に実行される。
+  特定の Task を待ち合わせる事が可能。
+  Task の入出力は dma などで copy される。
+ */
+
+#include "SimpleTask.h"
+
+class HTask : public SimpleTask {
+public:
+    BASE_NEW_DELETE(HTask);
+
+    QueueInfo<TaskQueue> *wait_me;  // List of task waiting for me
+    QueueInfo<TaskQueue> *wait_i;   // List of task for which I am waiting
+    PostFunction post_func;
+    void *post_arg1;
+    void *post_arg2;
+    CPU_TYPE cpu_type;
+    TaskManagerImpl *mimpl;
+    TaskPtr last;
+
+    int export_task_log;
+    TaskLog *tasklog;
+
+    HTask *waiter;
+    HTask *next;
+    HTask *prev;
+
+    struct htask_flag {
+        unsigned no_auto_free:1;        //      bit 0    auto free flag (0 .. auto, 1 manual)
+        unsigned flip:1;                //      use read write buffers for all
+        unsigned nd_range:1;            //      openCL nd_range
+    } flag;
+
+    void spawn();
+    void wait_for(HTask *);
+    void set_cpu(CPU_TYPE type);
+    void set_post(PostFunction func, void *read, void *write);
+    Task *create_task_array(int task_id, int num_task, int num_param, int num_inData, int num_outData);
+    Task *next_task_array(int task_id, Task *t);
+    Task *next_task_array(int id, Task *t, int param_count, int inData_count, int outData_count);
+    void spawn_task_array(Task *t);
+
+    HTask *init(int cmd, memaddr rbuf, int rs, memaddr wbuf, int ws) {
+        init(cmd);
+        set_input(rbuf, rs);
+        set_output(wbuf, ws);
+        return this;
+    }
+
+    void initOnce() {
+       wait_me = new QueueInfo<TaskQueue>(taskQueuePool);
+       wait_i = new QueueInfo<TaskQueue>(taskQueuePool);
+    }
+
+    void freeOnce() {
+       delete wait_me;
+       delete wait_i;
+    }
+
+    private:
+
+// compatibility
+    public: // functions
+    void set_inData_t(int index, memaddr addr, int size) {
+#ifdef EARLY_TOUCH
+        if ((unsigned long)addr&0xf) {
+          printf("inData is not aligned. command = %d, index = %d, addr = 0x%lx, size = %d\n",
+                 command, index, (unsigned long)addr, size);
+        }
+        char *p = (char *)addr; char b = *p;
+        p = (char *)(addr+size-1); b += *p;
+#endif
+        Task *t = ((TaskList*)rbuf)->tasks;
+        t->set_inData_t(index, addr,size);
+    }
+    void set_outData_t(int index, memaddr addr, int size) {
+#ifdef EARLY_TOUCH
+        if ((unsigned long)addr&0xf) {
+          printf("inData is not aligned. command = %d, index = %d, addr = 0x%lx, size = %d\n",
+                 command, index, (unsigned long)addr, size);
+        }
+        char *p = (char *)addr; char b = *p;
+        p = (char *)(addr+size-1); b += *p;
+#endif
+        Task *t = ((TaskList*)rbuf)->tasks;
+        t->set_outData_t(index, addr,size);
+    }
+    void set_param_t(int index, memaddr param) {
+        Task *t = ((TaskList*)rbuf)->tasks;
+        t->set_param_t(index, param);
+    }
+
+    void no_auto_free() {
+        flag.no_auto_free = 1;
+    }
+    void auto_free() {
+        flag.no_auto_free = 0;
+    }
+
+    void flip() {
+        flag.flip = 1;
+    }
+    void no_flip() {
+        flag.flip = 0;
+    }
+    void nd_range() {
+        flag.nd_range = 1;
+    }
+
+    htask_flag get_flag(){
+        return flag;
+    }
+
+    void init() {
+        next = prev = NULL;
+        waiter = NULL;
+    }
+
+    void init(int cmd) {
+        command  = cmd;
+        flag.no_auto_free = 0;
+        flag.flip = 0;
+        flag.nd_range = 0;
+        self = (memaddr) this;
+
+        post_func = NULL;
+        mimpl     = NULL;
+        cpu_type  = CPU_PPE;
+
+        post_arg1 = NULL;
+        post_arg2 = NULL;
+    }
+#define set_param(index,param) set_param_t(index, (memaddr) (param))
+
+}  __attribute__ ((aligned (DEFAULT_ALIGNMENT)));
+
+typedef HTask* HTaskPtr;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/ListData.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,50 @@
+#ifndef INCLUDED_LIST_DATA
+#define INCLUDED_LIST_DATA
+
+#include "base.h"
+#include "types.h"
+
+#define MAX_LIST_DMA_SIZE 8
+
+class ListElement {
+public:
+    BASE_NEW_DELETE(ListElement);
+
+    int size;
+#ifdef __CERIUM_CELL__
+    uint32 addr;  // Cell の仕様なんでどうしようもない...
+    //     PowerPC 64bit だと動かない可能性も高いんだが...
+#else
+    memaddr addr;
+#endif
+};
+
+typedef ListElement* ListElementPtr;
+
+class ListData {
+public:
+    BASE_NEW_DELETE(ListData);
+
+    int length; // The number of data (4)
+    int size;   // Total size of data (4)
+    int *bound;
+    ListElement *element;
+
+    void clear(void) {
+	length = 0;
+	size = 0;
+    }
+
+/*
+    void print(Scheduler *s) {
+	s->printf("inList length %d size %d\n",length, size);
+	for(int i=0;i<length;i++) {
+	    s->printf("inList element[%d] size %d addr %lx\n",i, element[i].size, (unsigned long)element[i].addr);
+	}
+    }
+*/
+};
+
+typedef ListData* ListDataPtr;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/MailManager.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,32 @@
+#ifndef INCLUDED_MAIL_MANAGER
+#define INCLUDED_MAIL_MANAGER
+
+#include "types.h"
+
+class MailManager {
+public:
+    /* constructor */
+    MailManager(unsigned int qsize = 32) ;
+
+    virtual ~MailManager();
+
+    /* functions */
+    virtual void send(memaddr data);
+    virtual memaddr recv();
+    virtual int count();
+
+private:
+    /* variables */
+    memaddr *queue;
+    unsigned int size;
+    unsigned int read;
+    unsigned int write;
+    unsigned int mask;
+
+    void calc_mask(unsigned int qsize);
+    void extend();
+}  ;
+
+typedef MailManager *MailManagerPtr;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/MainScheduler.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,29 @@
+#ifndef INCLUDED_MAIN_SCHEDULER
+#define INCLUDED_MAIN_SCHEDULER
+
+#include "Scheduler.h"
+#include "FifoDmaManager.h"
+
+class MainScheduler : public Scheduler {
+protected:
+    FifoDmaManager *fifoDmaManager;
+public:
+    ~MainScheduler(void) {}
+    void init_impl(int useRefDma);
+    void mainMem_alloc(int id, int size);
+
+    void mail_write_from_host(memaddr data) {
+	fifoDmaManager->mail_write_from_host(data);
+    }
+
+    memaddr mail_read_from_host() {
+	return fifoDmaManager->mail_read_from_host();
+    }
+
+    int has_mail_from_host() {
+	return fifoDmaManager->has_mail_from_host();
+    }
+
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/MemHash.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,31 @@
+#ifndef INCLUDED_MEM_HASH
+#define INCLUDED_MEM_HASH
+
+#include "MemorySegment.h"
+
+class MemHash {
+public:
+    MemHash(void);
+
+private:
+    MemorySegmentPtr *table;
+
+public:
+    void clear(void);
+    unsigned int hash(memaddr data);
+    int put(memaddr addr, MemorySegmentPtr ms);
+    MemorySegmentPtr get(memaddr addr);
+    void remove(memaddr addr);
+};
+
+typedef MemHash* MemHashPtr;
+
+const int hashSize = 263;
+//const int hashSize = 1;
+
+const int tableSize = sizeof(MemorySegmentPtr)*hashSize;
+
+#endif
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/MemIterator.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,53 @@
+#ifndef INCLUDED_MEMORY_ITERATOR
+#define INCLUDED_MEMORY_ITERATOR
+
+#include "MemList.h"
+#include "MemorySegment.h"
+#include "AddrList.h"
+#include "SchedTask.h"
+
+enum {
+
+  READ_WRITE,
+  READ,
+  WRITE,
+
+};
+
+class MemIterator {
+public:
+
+    // 走査する アドレスリスト
+    AddrListPtr addr_list;
+
+    // 扱う MemorySegment のリスト
+    MemList *mem_list;
+
+    // ms の stage
+    MemorySegmentPtr read_ms;
+    MemorySegmentPtr exec_ms;
+    MemorySegmentPtr write_ms;
+    MemorySegmentPtr free_ms;
+
+    SchedTask *smanager;
+
+    MemIterator(AddrListPtr add_list, MemList *mem_list, int cmd, SchedTask *smanager);
+    ~MemIterator();
+
+
+    MemorySegmentPtr (MemIterator::*get_ms)(void);
+
+    int hasNext(void);
+
+    MemorySegmentPtr get_read_write_ms(void);
+    MemorySegmentPtr get_read_ms(void);
+    MemorySegmentPtr get_write_ms(void);
+
+    void collect_ms(void);
+    void overwrite_list(AddrListPtr list);
+
+};
+
+typedef MemIterator *MemIteratorPtr;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/MemList.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,36 @@
+#ifndef MEMLIST
+#define MEMLIST
+
+#include <stdlib.h>
+#include "MemorySegment.h"
+
+class MemList : public MemorySegment {
+public:
+    MemorySegment* pool;
+    MemorySegment* first;
+    MemorySegment* last;
+
+    // TaskManager 側で create する
+    //MemList* createMemList(uint32 size, uint32 count);
+
+    MemList(MemorySegment* ms) {
+        first = last = this;
+        next = prev = this;
+        pool = ms;
+    }
+
+    ~MemList() {
+        free(pool);
+    }
+
+    void addFirst(MemorySegment* e);
+    void addLast(MemorySegment* e);
+    MemorySegment* getFirst();
+    MemorySegment* getLast();
+    int remove(MemorySegment* e);
+    MemorySegment* poll();
+    void moveToFirst(MemorySegment* e); // or use();
+    MemorySegment* get(int index);
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/MemorySegment.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,17 @@
+#ifndef MEMLSEG
+#define MEMLSEG
+#include "types.h"
+
+class MemorySegment {
+public:
+    MemorySegment* next;
+    MemorySegment* prev;
+    uint16 tag;
+    uint16 size;
+    memaddr address;
+    void* data;
+};
+
+typedef MemorySegment *MemorySegmentPtr;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/PreRefDmaManager.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,14 @@
+#ifndef INCLUDED_PRE_REFERENCED_DMA_MANAGER
+#define INCLUDED_PRE_REFERENCED_DMA_MANAGER
+
+#include "ReferencedDmaManager.h"
+
+class PreRefDmaManager : public ReferencedDmaManager {
+
+public:
+	/* functions */
+    virtual void *dma_load(Scheduler *s, memaddr addr, uint32 size, uint32 mask);
+    virtual void free_(void *buf);
+} ;
+
+#endif/* PRE_REFERENCED_DMA_MANAGER */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/QueueInfo.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,335 @@
+#ifndef INCLUDED_QUEUE_INFO
+#define INCLUDED_QUEUE_INFO
+
+#include "base.h"
+#include "types.h"
+
+#if 0
+template <typename T> class Queue : T {
+public:
+
+    T();
+
+    T *waiter;
+    T *next;
+    T *prev;
+
+    void initOnce();  // to initialize object in pool
+    void freeOnce();  // to destroy object in pool
+
+    // virual void init();
+};
+#endif
+
+template <typename T> class QueueInfo : public T {
+
+public:
+    /* constructor */
+
+    /** 
+	singleton queuePool constructor 
+	Do not use this as a Queue
+    */
+    QueueInfo<T>(){
+	queueInfoInit();
+    }
+    /** 
+	normal constructor requires
+    */
+    QueueInfo<T>(QueueInfo<T> *p) {
+	queueInfoInit();
+	queuePool = p;
+    }
+
+    BASE_NEW_DELETE(QueueInfo);
+
+    /* functions */
+    T *create();
+
+    void free_(T *queue);
+
+    void addFirst(T* e);
+    void addLast(T* e);
+    T* getFirst();
+    T* getLast();
+    int remove(T* e);
+    T* poll();
+    void moveToFirst(T* e); // or use();
+    T* get(int index);
+    T* find(T *task);
+    int empty();
+    void freePool() ;
+    void freeAll();
+
+    // Iterator
+    T* getNext(T* q) ;
+    int length();
+
+private:
+    /* variables */
+
+    /* we cannot use static in template */
+    /* static */ QueueInfo<T> *queuePool;
+    T* first;
+    T* last;
+
+    /* functions */
+    int extend_pool(int num);
+    void destroy();  
+    void queueInfoInit();
+}  ;
+
+
+
+#ifdef CHECK
+#include <stdio.h>
+#endif
+#include <stdlib.h>
+
+
+/** 
+    Use singleton queuePool constructor 
+    all queueInfo should share this as a pool.
+
+    exteren QueueInfo<H> pool;
+    QueueInfo<H> pool = new QueueInfo<H>();
+
+    use this in non initialize envrionment is wrong.
+*/
+
+template<typename T>void QueueInfo<T>::queueInfoInit() {
+    // 最初の一つは自分
+    first = last = this;
+    this->next = this->prev = this;
+    this->waiter = NULL;
+}
+
+template<typename T>void
+QueueInfo<T>::freePool() { 
+    for(T * p = queuePool->waiter; p; ) {
+	T * next = p->waiter;
+	p->waiter = NULL;
+	p->freeOnce();
+	free(p);
+	p = next;
+    }
+}
+
+/**
+    all pools are shared among QueueInfo (separated by size and type).
+    it automatically extended by 64.
+ */
+template<typename T>int
+QueueInfo<T>::extend_pool(int num)
+{
+#ifdef CHECK
+    if (queuePool) fprintf(stderr, "don't use queuePool directly");
+#endif
+
+    T* q = (T*)malloc(sizeof(T)*(num+1)+DEFAULT_ALIGNMENT);
+
+    // First Queue is previous pool
+    q->waiter = this->waiter; 
+    this->waiter = q;
+    q = (T*)ROUND_UP_ALIGN((long)q, DEFAULT_ALIGNMENT);
+    q++;
+
+    /* Connect all free queue in the pool */
+    T* p = q;
+    for (; num-- > 0;) {
+        p->waiter = NULL;
+	p->initOnce();
+        addLast(p);
+	p = (T*)ROUND_UP_ALIGN((long)(p+1),DEFAULT_ALIGNMENT);
+    }
+
+    return 0;
+
+}
+
+/**
+ * Task をプールから取って来て返す
+ *
+ * @param [cmd] タスクコマンド
+ */
+template<typename T>T *
+QueueInfo<T>::create()
+{
+    T * q =  queuePool->poll();
+    if (! q)  {
+	queuePool->extend_pool(64);
+	q = queuePool->poll();
+    }
+    q->init();
+    return q;
+}
+
+
+template<typename T>void
+QueueInfo<T>::free_(T * q)
+{
+    q->waiter = NULL;
+    queuePool->addLast(q);
+}
+
+
+/*!
+  QueueInfo<T> は空にならない。最低1個は要素が入っていて
+  1個目は特別扱いする。getFirst すると first->next を返す
+ */
+
+/*!
+  最初の1個は特別扱いなので、それの後に追加していく
+ */
+template<typename T>void
+QueueInfo<T>::addFirst(T* e)
+{
+    e->prev = first;
+    e->next = first->next;
+    first->next->prev = e;
+    first->next = e;
+}
+
+template<typename T>void
+QueueInfo<T>::addLast(T* e)
+{
+#ifdef CHECK
+    if (find(e)) { 
+	fprintf(stderr,"Add duplicate task %0x\n",(int)e);
+	return; 
+       // ...  
+    }
+#endif
+    e->next = first;
+    e->prev = last;
+    last->next = e;
+    last = e;
+}
+
+template<typename T>T*
+QueueInfo<T>::getFirst()
+{
+    if (empty()) return NULL;
+    return first->next;
+}
+
+template<typename T>T*
+QueueInfo<T>::getLast()
+{
+    if (empty()) return NULL;
+    return last;
+}
+
+template<typename T>int
+QueueInfo<T>::remove(T* e)
+{
+#ifdef CHECK
+    if (!find(e)) { 
+	fprintf(stderr,"Remove non existing task %0x\n",(int)e);
+	return 0; 
+       // ...  
+    }
+#endif
+    e->prev->next = e->next;
+    e->next->prev = e->prev;
+
+    if (first->next == e) {
+	first->next = e->next;
+    }
+    if (last == e) {
+	last = e->prev;
+    }
+
+    e->prev = NULL;
+    e->next = NULL;
+
+    return 1;
+}
+
+/*!
+  リストの先頭を取得および削除する。リストが空の場合は NULL を返す。
+ */
+
+template<typename T>T*
+QueueInfo<T>::poll()
+{
+    T* e = first->next;
+    if (e == this) {
+	return NULL;
+    }
+    remove(e);
+    return e;
+}
+
+template<typename T>void
+QueueInfo<T>::moveToFirst(T* e)
+{
+    remove(e);
+    addFirst(e);
+}
+
+/*!
+  リスト内の指定された位置にある要素を返す。
+  要素数を超えた位置を指定した場合 NULL を返す。
+ */
+
+template<typename T>T*
+QueueInfo<T>::get(int index)
+{
+    T* e = first->next;
+    for (int i = 0; i < index; i++) {
+	if (e->next == this) return NULL;
+	e = e->next;
+    }
+    return e;
+}
+
+template<typename T>T*
+QueueInfo<T>::find(T* task)
+{
+    T* e = first->next;
+    for(;;) {
+	if (e == this) return NULL;
+	if (e == task) break;
+	e = e->next;
+    }
+    return e;
+}
+
+template<typename T>int
+QueueInfo<T>::empty()
+{
+    return this->next == this;
+}
+
+template<typename T>T*
+QueueInfo<T>::getNext(T* q) 
+{
+    if (q->next==this) return NULL;
+    return q->next;
+}
+
+template<typename T>int
+QueueInfo<T>::length() 
+{
+    int i = 0;
+    if (empty()) return 0;
+    T* e = first;
+    while((e = e->next) != this ) i++;
+    return i;
+}
+
+template<typename T>void
+QueueInfo<T>::freeAll()
+{
+    T* t;
+    while((t=poll())) free_(t);
+}
+
+
+
+/* end */
+
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/ReferencedDmaManager.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,21 @@
+#ifndef INCLUDED_REFERENCED_DMA_MANAGER
+#define INCLUDED_REFERENCED_DMA_MANAGER
+
+#include "FifoDmaManager.h"
+
+class ReferencedDmaManager : public FifoDmaManager {
+
+public:
+	/* functions */
+    virtual void *dma_load(Scheduler *s, memaddr addr, uint32 size, uint32 mask);
+    virtual void *dma_load1(void *buf, memaddr addr, uint32 size, uint32 mask);
+    virtual void *dma_loadList(Scheduler *s, ListDataPtr list, uint32 mask);
+    virtual void *dma_store(void *buf, memaddr addr, uint32 size, uint32 mask);
+    virtual void dma_storeList(ListDataPtr list, void *buff, uint32 mask);
+    virtual void *get_writebuf(Scheduler *s,memaddr addr, uint32 size);
+
+    virtual void free_(void *buff);
+    virtual void bound(ListData *list);
+} ;
+
+#endif/* REFERENCED_DMA_MANAGER */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/SchedExit.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,18 @@
+#ifndef INCLUDED_SCHED_EXIT
+#define INCLUDED_SCHED_EXIT
+
+#include "base.h"
+#include "Scheduler.h"
+#include "SchedTaskBase.h"
+
+
+class SchedExit : public SchedTaskBase {
+public:
+    BASE_NEW_DELETE(SchedExit);
+    /* functions */
+    SchedTaskBase* next(Scheduler *, SchedTaskBase *);
+    const char * name() { return "Exit" ; };
+    
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/SchedMail.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,22 @@
+#ifndef INCLUDED_SCHED_MAIL
+#define INCLUDED_SCHED_MAIL
+
+#include "base.h"
+#include "Scheduler.h"
+#include "SchedTaskBase.h"
+
+#include "error.h"
+
+class SchedMail : public SchedTaskBase {
+public:
+    /* constructor */
+    BASE_NEW_DELETE(SchedMail);
+
+    /* functions */
+    SchedTaskBase* next(Scheduler *, SchedTaskBase *);
+    const char * name() { return "Mail" ; };
+
+
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/SchedNop.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,20 @@
+#ifndef INCLUDED_SCHED_NOP
+#define INCLUDED_SCHED_NOP
+
+#include "base.h"
+#include "Scheduler.h"
+#include "SchedTaskBase.h"
+
+#include "error.h"
+
+class SchedNop : public SchedTaskBase {
+public:
+    BASE_NEW_DELETE(SchedNop);
+
+    /* functions */
+    SchedTaskBase* next(Scheduler *, SchedTaskBase *);
+    const char * name() { return "Nop" ; };
+
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/SchedNop2Ready.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,34 @@
+#ifndef INCLUDED_SCHED_NOP2READY
+#define INCLUDED_SCHED_NOP2READY
+
+#include "base.h"
+#include "Scheduler.h"
+#include "SchedTaskBase.h"
+#include "SchedNop.h"
+
+#include "error.h"
+
+class SchedNop2Ready : public SchedNop {
+public:
+    /* constructor */
+    SchedNop2Ready(Scheduler*);
+
+    BASE_NEW_DELETE(SchedNop2Ready);
+
+    /* variables */
+    Scheduler* scheduler;
+
+    /* functions */
+    void exec(void);
+    void write(void);
+    SchedTaskBase* next(Scheduler *, SchedTaskBase *);
+    const char * name() { return "Nop2" ; };
+
+
+#if DEBUG
+    void read(void)  { __debug("[SchedNop2Ready:%s]\n", __FUNCTION__); }
+    //void write(void) { __debug("[SchedNop2Ready:%s]\n", __FUNCTION__); }
+#endif
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/SchedTask.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,139 @@
+#ifndef INCLUDED_SCHED_TASK
+#define INCLUDED_SCHED_TASK
+
+#include "base.h"
+#include "Scheduler.h"
+#include "SchedTaskBase.h"
+#include "ListData.h"
+#include "HTask.h"
+#include "MemList.h"
+
+
+class SchedTask : public SchedTaskBase {
+public:
+    /* constructor */
+    SchedTask();
+    virtual ~SchedTask();
+
+    BASE_NEW_DELETE(SchedTask);
+
+    /* variables */
+
+    /* functions */
+
+    // override
+    void read();
+    void exec();
+    void write();
+    SchedTaskBase* next(Scheduler *, SchedTaskBase *);
+    const char * name() { return "SchedTask" ; };
+
+
+    // タスクの処理は、task_list に登録された C の関数によっておこなう
+
+public:
+    /* functions */
+
+    void init(TaskListPtr _list, TaskPtr _task, 
+	      Scheduler* sc, int tag);
+
+    //---  User API ---
+    int read_size() ;
+    int write_size();
+    void setup_outputData();
+
+    void* get_input(void *buff, int index);
+    void* get_output(void *buff, int index);
+    memaddr get_param(int index);
+    memaddr get_inputAddr(int index);
+    memaddr get_outputAddr(int index);
+    // 書き出しを追加する API がない... 
+    int get_inputSize(int index);
+    int get_outputSize(int index);
+
+    void set_outputSize(int index, int size);
+
+    int get_cpuid();
+
+    void* global_alloc(int id, int size);
+    void* global_get(int id);
+    void global_set(int id, void *addr);
+    void global_free(int id);
+    MemList* createMemList(int size, int count);
+
+    void mainMem_alloc(int id, int size);
+    void mainMem_wait();
+    memaddr mainMem_get(int id);
+
+    MemorySegment * get_segment(memaddr addr, MemList *m);
+    MemorySegment * get_free_segment(memaddr addr, MemList *m);
+    void overwrite_segment(MemorySegment *s, memaddr addr);
+    // uint32 get_tag();
+    void put_segment(MemorySegment *s);
+    void wait_segment(MemorySegment *s);
+
+
+
+    void *allocate(int size);
+    void free_(void *p) ;
+    void free_htask(HTask *p) ;
+
+    void polling();
+
+    /* これは禁止するべき */
+    void *dma_load(void *buf, memaddr addr, uint32 size, uint32 mask);
+    void dma_store(void *buf,memaddr addr, uint32 size, uint32 mask);
+    void dma_wait(uint32 mask);
+    void *get_load_buf(uint32 size) ;
+    void free_load_buf(void *buf) ;
+
+    void show_dma_wait();
+    void start_profile();
+
+
+    /*!
+      SPU用の get_input, get_output
+     */
+    void* get_input(int index) {
+      return get_input(readbuf, index);
+    }
+
+    void* get_output(int index) {
+      return get_output(writebuf, index);
+    }
+
+    /**
+     * swap read / write buffer
+     * output が read buffer の書き換えならば、memcpy せずに
+     * swap するだけで良い。size は同じである必要がある。
+     */
+    void swap() {
+        void * tmp = readbuf;
+        readbuf = writebuf;
+        writebuf = tmp;
+    }
+
+
+    // user
+    HTaskPtr create_task(int cmd);
+    HTaskPtr create_task(int cmd, memaddr r, long rs, memaddr w, long ws);
+    HTaskPtr create_task_array(int id, int num_task, int num_param, int num_inData, int num_outData);
+
+    void set_task_depend(HTaskPtr master, HTaskPtr slave);
+    void spawn_task(HTaskPtr);
+    void set_task_cpu(HTaskPtr, CPU_TYPE);
+    void* allocate(int size,int align);
+    Scheduler* get_scheduler();
+    long get_random();
+
+    int printf(const char * format, ...);
+
+
+
+} ;
+
+
+extern void loadSchedTask(Scheduler *scheduler,TaskPtr task);
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/SchedTaskBase.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,125 @@
+#ifndef INCLUDED_SCHED_TASK_BASE
+#define INCLUDED_SCHED_TASK_BASE
+
+#include "base.h"
+//#include <stdio.h>
+#include <stdlib.h>
+
+class TaskManagerImpl;
+class Scheduler;
+class MemorySegment;
+class MemList;
+class HTask;
+
+class SchedTaskBase {
+public:
+    /* constructor */
+    // void *called ;  // for debug
+    SchedTaskBase() {
+	// called = __builtin_return_address(1);
+    }
+    virtual ~SchedTaskBase() {}
+
+    BASE_NEW_DELETE(SchedTaskBase);
+
+    // noaction in default
+    // virtual void load()  {}
+    virtual void read()  {}
+    virtual void exec()  {}
+    virtual void write() {}
+    virtual SchedTaskBase* next(Scheduler *, SchedTaskBase*) {return 0;}
+
+    virtual void setup_outputData() {};
+    virtual const char * name() { return "Base" ; };
+
+    /* functions */
+    virtual void* get_output(void *buff, int index) { return 0; }
+    virtual void* get_input(void *buff, int index) { return 0;}
+    virtual memaddr get_param(int index) { return 0;}
+    virtual int read_size() { return 0;}
+    virtual int printf(const char * format, ...) {return 0;};
+
+    virtual memaddr get_inputAddr(int index) {return 0;}
+    virtual memaddr get_outputAddr(int index) {return 0;}
+    virtual int get_inputSize(int index) {return 0;}
+    virtual int get_outputSize(int index) {return 0;}
+    virtual void set_outputSize(int index, int size) {};
+
+    virtual int get_cpuid() {return 0;}
+
+    virtual void* global_alloc(int id, int size) {return 0;}
+    virtual void* global_get(int id) {return 0;}
+    virtual void global_set(int id, void *addr) {}
+    virtual void global_free(int id) {}
+    virtual MemList* createMemList(int size, int count) {return 0;}
+
+    virtual void mainMem_alloc(int id, int size) {}
+    virtual void mainMem_wait() {}
+    virtual memaddr mainMem_get(int id) {return 0; }
+
+    virtual MemorySegment * get_segment(memaddr addr, MemList *m) {return 0; }
+    virtual void put_segment(MemorySegment *s) {}
+    virtual void wait_segment(MemorySegment *s) {}
+
+    virtual void *allocate(int size) {return 0; }
+    virtual void free_(void *p)  {}
+    // virtual void polling();
+
+    /* これは禁止するべき */
+    virtual void *dma_load(void *buf, memaddr addr, uint32 size, uint32 mask) {return buf;}
+    virtual void dma_store(void *buf,memaddr addr, uint32 size, uint32 mask) {}
+    virtual void dma_wait(uint32 mask) {}
+
+    virtual void show_dma_wait() {}
+    virtual void start_profile() {}
+    virtual void* allocate(int size,int align) {return 0;}
+    virtual Scheduler* get_scheduler() {return 0;}
+    virtual long get_random() {return 0;}
+    virtual void free_htask(HTask *h) {}
+
+    /* variables */
+
+    // SchedTask は、すべて同じ大きさであるべきなので、継承するクラスには、
+    // 変数を置かない。ここに、すべて置く。virtual も含めて。
+
+    // Task を実行するスケジューラ自身
+    Scheduler *scheduler;
+    // Task を作成管理するマネージャー
+    TaskManagerImpl *manager;
+    DmaManager* connector;
+
+    TaskPtr atask;
+
+    // 現在スケジューラが実行している TaskList と、このタスクに対応する Task
+    TaskListPtr list;
+    // Task の、Tasklist での位置
+    TaskPtr cur_index;
+
+    int tag;
+
+    memaddr waiter;
+
+    /**
+     * read データ、write 用のバッファ
+     * readbuf には タスク登録時に設定した入力データが入っている。
+     * writebuf にデータを描き込んでおくと、
+     * タスク登録時に設定した出力先に書き込む
+     */
+    void *readbuf;
+    void *writebuf;
+#define DefaultBoundSize (8)
+    int din[DefaultBoundSize];
+    int dout[DefaultBoundSize];
+
+    /* system call */
+
+    FILE *stdout_;
+    FILE *stderr_;
+    FILE *stdin_;
+
+    ListData inListData;
+    ListData outListData;
+
+}  ;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/SchedTaskList.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,30 @@
+#ifndef INCLUDED_SCHED_TASKLIST
+#define INCLUDED_SCHED_TASKLIST
+
+#include "base.h"
+#include "Scheduler.h"
+#include "SchedTask.h"
+#include "TaskList.h"
+
+#include "error.h"
+
+class SchedTaskList : public SchedTask {
+public:
+    /* constructor */
+    SchedTaskList(memaddr addr, Scheduler *sched, int tag);
+
+    BASE_NEW_DELETE(SchedTaskList);
+
+    /* override functions */
+    void read();
+    void exec();
+    void write();
+    const char * name() { return "TaskList" ; };
+
+
+
+};
+
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/Scheduler.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,240 @@
+#ifndef INCLUDED_SCHEDULER
+#define INCLUDED_SCHEDULER
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include "base.h"
+#include "TaskList.h"
+#include "ListData.h"
+#include "DmaManager.h"
+#include "SchedTaskBase.h"
+#include "MemList.h"
+#include "MemHash.h"
+#include "types.h"
+
+#ifdef __CERIUM_GPU__
+#ifdef __APPLE__
+#include <OpenCL/opencl.h>
+#else
+#include <CL/cl.h>
+#endif
+#endif
+
+#define MAX_USER_TASK 100
+#define MAX_SYSTEM_TASK 2
+#define MAX_TASK_OBJECT MAX_USER_TASK + MAX_SYSTEM_TASK
+#define MAX_GLOBAL_AREA 32
+#define MAX_MAINMEM_AREA 32
+
+class SchedTaskBase;
+class SchedTask;
+class SchedTaskList;
+class TaskManagerImpl;
+class HTask;
+
+typedef int (*TaskObjectRun)(SchedTask* smanager, void* r, void *w);
+
+typedef struct gpu_task_object {
+#ifdef __CERIUM_GPU__
+    cl_program *program;
+#endif
+} GpuTaskObject;
+
+// Task Object Table
+//  this is named TaskObjectRun but it is not an object.
+//  It is a pointer to an object creation function
+//  大きいので、SPEには置かない方が本当は良い...
+//  get_segment で取って来るのが、おそらくは正しい。
+typedef struct task_object {
+    CPU_TYPE cpu_type;
+    TaskObjectRun run;
+    memaddr location;            // location address in a.out
+    memaddr end;
+    uint32 entry_offset;        // offset for create();
+    MemorySegment *segment;
+    const char *name;
+    void (*load)(Scheduler *,int);
+    void (*wait)(Scheduler *,int);
+
+    GpuTaskObject *gputask;
+
+}  __attribute__ ((aligned (DEFAULT_ALIGNMENT))) //sizeはどれくらい?
+      TaskObject, *TaskObjectPtr;
+
+extern "C" {
+    extern long random();
+}
+
+class Scheduler {
+private:
+    TaskManagerImpl* manager_tmp;
+
+public:
+    virtual ~Scheduler();
+    BASE_NEW_DELETE(Scheduler);
+
+    /* variables */
+    int id;
+    MemHash *hash;
+
+    // double buffering
+    TaskListPtr buff_taskList[2];
+
+    int buffFlag_taskList;
+
+    /* GlobalMemoryList */
+    /* global among Tasks in the same CPU */
+    void* globalList[MAX_GLOBAL_AREA];
+
+    /* MainMemory Allocate Command List */
+    memaddr mainMemList[MAX_MAINMEM_AREA];
+
+    /* Code Area */
+    MemList *code_segment_pool;
+
+    DmaManager* connector;
+    TaskManagerImpl* manager;
+
+
+    /* functions */
+    void init(TaskManagerImpl *m, int useRefDma=0, int export_task_log=0);
+    virtual void run(){};
+    void run(SchedTaskBase* task1);
+
+    virtual void init_impl(int useRefDma) {};
+    void finish();
+
+    TaskListPtr get_curListBuf();
+    TaskListPtr get_renewListBuf();
+
+    void set_backupTaskList(TaskListPtr cur_taskList);
+    void set_backupTaskListIndex(int cur_index);
+    SchedTaskList* get_nextRenewTaskList();
+    TaskListPtr get_backupTaskList();
+    int get_backupTaskListIndex();
+
+
+    /* GlobalMemory */
+    void* global_alloc(int id, int size);
+    void* global_get(int id);
+    void global_set(int id, void *addr);
+    void global_free(int id);
+    //MemList* createMemList(int size, int count);
+    MemList* createMemList(int size, int count);
+    void free_(void *p) { free(p); }
+
+    virtual void mainMem_alloc(int id, int size) {};
+    virtual void mainMem_wait() {};
+    memaddr mainMem_get(int id);
+
+    MemorySegment * get_segment(memaddr addr, MemList *m);
+    MemorySegment * get_segment(memaddr addr, MemList *m, int size);
+    MemorySegment * get_free_segment(memaddr addr, MemList *m);
+    void overwrite_segment(MemorySegment *s, memaddr addr);
+
+    void allocate_code_segment(int size, int count,struct tbl *table);
+
+    void put_segment(MemorySegment *s);
+    void wait_segment(MemorySegment *s);
+
+    /* manager */
+
+    void set_manager(TaskManagerImpl *m) {
+      manager = m;
+    };
+
+    /* user */
+
+    long get_random() ;
+    Scheduler *get_scheduler() { return this; };
+    int printf(const char *format, ...);
+    int vprintf0(const char *format, va_list ap);
+
+}  ;
+
+extern void register_task(int cmd, TaskObjectRun run, const char *str);
+extern void register_dynamic_task(int cmd,
+    memaddr start, int size, TaskObjectRun run,
+        int entry_offset,
+        const char *str);
+
+struct tbl {
+    unsigned int vma;
+    unsigned int size;
+    unsigned int file_offset;
+    unsigned int buf;
+};
+
+extern TaskObject task_list[MAX_TASK_OBJECT];
+
+int null_run(SchedTask* smanager, void* r, void *w);
+void null_loader(Scheduler *m, int task_id);
+
+extern int entry_cmd[MAX_TASK_OBJECT];
+
+inline void
+loadSchedTask(Scheduler *scheduler,int command)
+{
+    task_list[command].load(scheduler,command);
+}
+
+#endif
+
+
+
+#define SchedConstructor(str)                                           \
+    str() {}                                                            \
+    BASE_NEW_DELETE(str)                                                \
+
+#define SchedDefineTask(str)  SchedDefineTask1(str,run)                                            \
+
+#define SchedDefineTask1(str,run)                                            \
+    static int run(SchedTask *smanager, void *rbuf, void *wbuf); \
+    extern "C" { \
+    int runTask_##str(SchedTask *smanager, void *rbuf, void *wbuf) \
+    {                                                                   \
+        return run(smanager, rbuf, wbuf); \
+    } \
+    }
+
+#define SchedExternTask(str)                                            \
+    extern "C" { \
+        extern int runTask_##str(SchedTask *manager, void *rbuf, void *wbuf)   ; \
+    }
+
+#define SchedRegisterTask(cmd, str)             \
+    register_task(cmd, runTask_##str, #str);
+
+#define SchedRegister(str)             \
+    register_task(str, runTask_##str, #str);
+
+#define SchedDefineDynamicTask(str,segment)                             \
+    SchedDefineTask(str)
+
+#ifndef NO_OVERLAY
+#define SchedExternDynamicTask(str,segment)                             \
+    extern "C" { \
+        extern unsigned long long _EAR_; \
+        extern struct tbl _ovly_table[]; \
+        extern int runTask_##str(SchedTask *manager, void *rbuf, void *wbuf)   ; \
+    }
+#else
+#define SchedExternDynamicTask(str,segment) SchedExternTask(str)
+#endif
+
+
+#ifndef NO_OVERLAY
+#define SchedRegisterDynamicTask(cmd, str, segment)                    \
+    register_dynamic_task(cmd,  (memaddr)(_EAR_+_ovly_table[segment].file_offset), \
+                     _ovly_table[segment].size, \
+                    runTask_##str, \
+                                                  runTask_##str##_offset, \
+                #str);
+#define SchedRegisterDynamic(str, segment) SchedRegisterDynamicTask(str, str, segment)
+#else
+#define SchedRegisterDynamicTask(cmd, str, segment) SchedRegisterTask(cmd, str)
+#define SchedRegisterDynamic(str, segment) SchedRegisterDynamicTask(str, str, segment)
+#endif
+
+
+/* end */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/Sem.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,27 @@
+#ifndef INCLUDED_SEM
+#define INCLUDED_SEM
+
+#include <pthread.h>
+
+typedef struct sem_t {
+	volatile int value;		//セマフォ変数
+	pthread_mutex_t mutex;	//セマフォ操作用のロック
+	pthread_cond_t cond;	//待ち合わせ用の条件変数
+} sem_t, *sem_ptr;
+
+class Sem {
+public:
+	/* constructor */
+	Sem(int value);
+	~Sem();
+	void sem_p();
+	void sem_v();
+	int  count();
+	/* variables */
+private:
+	sem_t *sem;
+};
+
+typedef Sem *SemPtr;
+
+#endif /* INCLUDED_SEM */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/SemMailManager.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,37 @@
+#ifndef INCLUDED_SEM_MAIL_MANAGER
+#define INCLUDED_SEM_MAIL_MANAGER
+
+#include <pthread.h>
+#include "MailManager.h"
+#include "types.h"
+#include "Sem.h"
+
+class SemMailManager : public MailManager {
+public:
+    /* constructor */
+    SemMailManager(unsigned int qsize = 32) ;
+
+    ~SemMailManager();
+
+    /* functions */
+    void send(memaddr data);
+    memaddr recv();
+    int count();
+
+private:
+    /* variables */
+    memaddr *queue;
+    SemPtr queue_remain;
+    SemPtr queue_count;
+    unsigned int size;
+    unsigned int read;
+    unsigned int write;
+    unsigned int mask;
+
+    void calc_mask(unsigned int qsize);
+    void extend();
+}  ;
+
+typedef SemMailManager *SemMailManagerPtr;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/ShowTime.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,7 @@
+#ifndef INCLUDED_TASK_SHOW_TIME
+#define INCLUDED_TASK_SHOW_TIME
+
+#include "SchedTask.h"
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/SimpleTask.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,42 @@
+#ifndef INCLUDED_SIPMLE_TASK
+#define INCLUDED_SIPMLE_TASK
+
+#include "base.h"
+#include "types.h"
+
+#define MAX_PARAMS 8
+
+class SimpleTask {
+public: // variables
+
+    BASE_NEW_DELETE(SimpleTask);
+    int command;         // 4 byte
+    memaddr self;         // 4 byte (or 8byte on 64bit mode)
+
+    memaddr rbuf;
+    memaddr wbuf;
+    int  r_size;
+    int  w_size;
+    memaddr from;
+    memaddr param;       //  sizeof(SimpleTask)==32
+
+
+public: // functions
+    SimpleTask() {};
+
+    SimpleTask(int r, memaddr read, int w, memaddr write) {
+	r_size = r; rbuf = read;
+	w_size = w; wbuf = write;
+    };
+
+    void set_input(memaddr i,int size) { r_size = size; rbuf= i; }
+    void set_output(memaddr o,int size) { w_size = size; wbuf= o; } 
+    void set_param(memaddr data) { param = data; }
+    memaddr get_param() { return param; }
+
+} __attribute__ ((aligned (DEFAULT_ALIGNMENT)));
+
+typedef SimpleTask *SimpleTaskPtr;
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/SpeTaskManagerImpl.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,46 @@
+#ifndef INCLUDED_SPE_TASK_MANAGER_IMPL
+#define INCLUDED_SPE_TASK_MANAGER_IMPL
+
+#include "TaskManagerImpl.h"
+#include "MainScheduler.h"
+#include "Scheduler.h"
+#include "TaskList.h"
+
+class SpeTaskManagerImpl : public TaskManagerImpl {
+public:
+    /* constructor */
+    BASE_NEW_DELETE(SpeTaskManagerImpl);
+
+    SpeTaskManagerImpl() ;
+    ~SpeTaskManagerImpl();
+
+    /* functions */
+    // call by system
+    void init(int spuIdle,int useRefDma, int export_task_log);
+    void run();
+    void start_profile();
+    void show_profile();
+    void export_task_log();
+    HTaskPtr create_task(int cmd,void *from);
+    HTaskPtr create_task(int cmd, memaddr rbuf, long r_size, memaddr wbuf, long w_size,void *from);
+    HTaskPtr create_task_array(int id, int num_task, int num_param, int num_inData, int num_outData,void *from);
+
+    TaskListPtr createTaskList() { return 0; }
+    void set_task_depend(HTaskPtr master, HTaskPtr slave);
+    void spawn_task(HTaskPtr);
+    void set_task_cpu(HTaskPtr, CPU_TYPE);
+    void polling() {}
+    void free_htask(HTaskPtr htask) {}
+    void print_arch();
+    void set_NDRange(void* ndr){}
+#ifdef __CERIUM_GPU__
+    
+    SpeTaskManagerImpl(int i);
+    void append_activeTask(HTask* p);
+    void append_waitTask(HTask* p);
+    
+#endif
+}  ;
+
+
+#endif /* INCLUDED_SPE_TASK_MANAGER_IMPL */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/SpeThreads.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,40 @@
+#ifndef INCLUDED_SPE_THREADS
+#define INCLUDED_SPE_THREADS
+
+#include <libspe2.h>
+#include <pthread.h>
+#include "Threads.h"
+
+#define SPE_ELF "spe-main"
+
+typedef struct arg {
+    int speid;
+    spe_context_ptr_t ctx;
+} thread_arg_t;
+
+
+class SpeThreads : public Threads {
+public:
+    /* constructor */
+    SpeThreads(int num = 1);
+    ~SpeThreads(void);
+
+    /* functions */
+    void init(void);
+    int get_mail(int speid, int count, memaddr *ret); // BLOCKING
+    int has_mail(int speid, int count, memaddr *ret); // NONBLOCK
+    void send_mail(int speid, int num, memaddr *data); // BLOCKING
+    static void *spe_thread_run(void *arg);
+    static void *frontend_thread_run(void *arg);
+    void add_output_tasklist(int command, memaddr buff, int alloc_size);
+
+private:
+    /* variables */
+    spe_program_handle_t *spe_handle;
+    spe_context_ptr_t *spe_ctx;
+    pthread_t *threads;
+    thread_arg_t *args;
+    int cpu_num;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/Start.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,7 @@
+#ifndef INCLUDED_SYSTASK_START
+#define INCLUDED_SYSTASK_START
+
+#include "SchedTask.h"
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/SynchronizedMailManager.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,37 @@
+#ifndef INCLUDED_SYNC_MAIL_MANAGER
+#define INCLUDED_SYNC_MAIL_MANAGER
+
+#include <pthread.h>
+#include "MailManager.h"
+#include "types.h"
+#include "Sem.h"
+
+class SynchronizedMailManager : public MailManager {
+public:
+    /* constructor */
+    SynchronizedMailManager(unsigned int qsize = 32) ;
+
+    ~SynchronizedMailManager();
+
+    /* functions */
+    void send(memaddr data);
+    memaddr recv();
+    int count();
+
+private:
+    /* variables */
+    memaddr *queue;
+    SemPtr queue_remain;
+    SemPtr queue_count;
+    unsigned int size;
+    unsigned int read;
+    unsigned int write;
+    unsigned int mask;
+
+    void calc_mask(unsigned int qsize);
+    void extend();
+}  ;
+
+typedef SynchronizedMailManager *SynchronizedMailManagerPtr;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/SysFunc.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,8 @@
+#ifndef SYSFUNCH
+#define SYSFUNCH
+
+enum systask {
+#include "SysTasks.h"
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/SysTask.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,1 @@
+extern void systask_register();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/SysTasks.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,5 @@
+StartTask,
+FinishTask,
+ShowTime,
+StartProfile,
+#define Dummy StartTask
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/Task.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,149 @@
+#ifndef INCLUDED_TASK
+#define INCLUDED_TASK
+
+#include "base.h"
+#include "types.h"
+#include "ListData.h"
+#include "SimpleTask.h"
+
+class SchedTask;
+class Scheduler;
+
+class Task {
+ public: // variables
+    int task_size;
+    int command;
+    int param_count;
+    int inData_count;
+    int outData_count;
+    int inData_offset;
+    int outData_offset;
+    void *data[] __attribute__ ((aligned (DEFAULT_ALIGNMENT))); 
+
+ public: // functions
+
+    void print(Scheduler *s);
+
+    memaddr *param(int index) {
+        memaddr p =  (memaddr)data + sizeof(memaddr)*index;
+        return (memaddr *)p;
+    }
+
+    ListElement *inData(int index) {
+        memaddr p = (memaddr)data + inData_offset;
+        p += sizeof(ListElement)*index;
+        return (ListElement*)p;
+    }
+
+    ListElement *outData(int index) {
+        memaddr p = (memaddr)data + outData_offset;
+        p += sizeof(ListElement)* index;
+        return (ListElement*)p;
+    }
+
+    static int calc_size(int params, int ins, int outs) {
+        int size = round_up16(sizeof(Task))
+            + round_up16(sizeof(memaddr)*params)
+            + round_up16(sizeof(ListElement)*ins)
+            + round_up16(sizeof(ListElement)*outs);
+        return size;
+    }
+
+    void init(int task_id, int params, int ins, int outs) {
+        set_task_id(task_id);
+        param_count = params;
+        inData_count = ins;
+        outData_count = outs;
+        inData_offset = round_up16(sizeof(memaddr)*params);
+        outData_offset = round_up16(inData_offset+sizeof(ListElement)*ins);
+        //task_size = round_up16(sizeof(Task)+outData_offset+sizeof(ListElement)*outs);
+
+        task_size = round_up16(sizeof(Task))
+            + round_up16(sizeof(memaddr)*params)
+            + round_up16(sizeof(ListElement)*ins)
+            + round_up16(sizeof(ListElement)*outs);
+
+    }
+
+    int size() {
+        return task_size;
+    }
+
+    int inData_total_size() {
+        int size = 0;
+        ListElement *in= inData(0);
+        for(int i=0; i< inData_count; i++) {
+            size += in[i].size;
+        }
+        return size;
+    }
+    int outData_total_size() {
+        int size = 0;
+        ListElement *out= outData(0);
+        for(int i=0; i< outData_count; i++) {
+            size += out[i].size;
+        }
+        return size;
+    }
+
+    void set_inData_t( int index, memaddr addr, int size) {
+        ListElement *list = inData(index);
+#ifdef EARLY_TOUCH
+        if ((unsigned long)addr&0xf) {
+            printf("inData is not aligned. command = %d, index = %d, addr = 0x%lx, size = %d\n",
+                   command, index, (unsigned long)addr, size);
+        }
+        char *p = (char *)addr; int b = *p;
+        p = (char *)(addr+size-1); b += *p;
+#endif
+
+#ifdef __CERIUM_CELL__
+        list->addr = (uint32)addr;
+#else
+        list->addr = addr;
+#endif
+        list->size = size;
+    }
+
+    void set_outData_t(int index, memaddr addr, int size) {
+        ListElement *list = outData(index);
+#ifdef EARLY_TOUCH
+        if ((unsigned long)addr&0xf) {
+            printf("inData is not aligned. command = %d, index = %d, addr = 0x%lx, size = %d\n",
+                   command, index, (unsigned long)addr, size);
+        }
+        char *p = (char *)addr; int b = *p;
+        p = (char *)(addr+size-1); b += *p;
+#endif
+#ifdef __CERIUM_CELL__
+        list->addr = (uint32)addr;
+#else
+        list->addr = addr;
+#endif
+        list->size = size;
+    }
+    void set_task_id(int id) { command = id; }
+    void set_param_t(int index, memaddr param) {
+        memaddr *p = (memaddr*)this->param(index);
+        *p = param;
+    }
+
+    Task * next()
+    {
+        char *p = (char*)this;
+        p += size();
+        return (Task*)p;
+    }
+
+
+#define set_param(index,param) set_param_t(index, (memaddr) (param))
+
+#define set_inData(index, addr, size)               \
+    set_inData_t(index, (memaddr)(addr), (size));
+#define set_outData(index, addr, size)              \
+    set_outData_t(index, (memaddr)(addr), (size));
+} __attribute__ ((aligned (DEFAULT_ALIGNMENT))) ;
+
+typedef Task* TaskPtr;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/TaskList.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,34 @@
+#ifndef INCLUDED_TASKLIST
+#define INCLUDED_TASKLIST
+
+#include "base.h"
+#include "Task.h"
+
+class HTask;
+
+#define TASK_MAX_SIZE 31
+
+class TaskList { // 1024 byte 
+public:
+    BASE_NEW_DELETE(TaskList);
+
+    long lastTask; // 4 byte
+    TaskList *next; // 4 byte
+    TaskList *prev; // 4 byte
+    TaskList *waiter; // 4 byte
+    HTask *self; // 4 byte
+    long dummy[3]; // 16 byte
+    Task tasks[TASK_MAX_SIZE]; // 32*TASK_MAX_SIZE
+    
+
+    TaskPtr last() { return (TaskPtr)(((memaddr)tasks)+lastTask); }
+    void set_last(Task *t) { lastTask = ((memaddr)t) - ((memaddr)tasks); }
+    void init() { lastTask = ((memaddr)&tasks[TASK_MAX_SIZE])-(memaddr)(tasks); waiter=this; }
+    void initOnce() { }
+    void freeOnce() {}
+
+} ;
+
+typedef TaskList* TaskListPtr;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/TaskLog.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,51 @@
+#ifndef INCLUDED_TASKLOG
+#define INCLUDED_TASKLOG
+
+#include "QueueInfo.h"
+
+struct waitTask {
+    int task_id;
+    int cmd;
+
+    waitTask *next;
+    waitTask *prev;
+    waitTask *waiter;
+};
+
+static int task_id;
+
+class TaskLog {
+public:
+    /* variables */
+    int mtask_id;
+    int cmd;
+    QueueInfo<waitTask> wait_for_list;
+    unsigned long long create_time;
+    unsigned long long execute_time;
+    unsigned long long finish_time;
+
+    TaskLog *next;
+    TaskLog *prev;
+    TaskLog *waiter;
+
+    /* constructor */
+    TaskLog() {
+        mtask_id = task_id;
+        task_id++;
+        create_time = 0;
+        execute_time = 0;
+        finish_time = 0;
+    }
+
+    void set_cmd(int _cmd) {
+        cmd = _cmd;
+    }
+
+
+private:
+    // Unique id
+
+
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/TaskManager.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,59 @@
+#ifndef INCLUDED_TASK_MANAGER
+#define INCLUDED_TASK_MANAGER
+
+#include "TaskManagerImpl.h"
+#include "MemList.h"
+#include "HTask.h"
+
+class Scheduler;
+class MemList;
+
+typedef struct nd_range {
+    cl_uint dimension;
+    size_t gws[3];
+    size_t lws[3];
+} ND_RANGE_T, *ND_RANGE_T_PTR;
+
+class TaskManager {
+public:
+    /* constructor */
+    TaskManager(int num); // The number of threads
+    ~TaskManager();
+
+    /* variables */
+    TaskManagerImpl *m_impl;
+    void (*tm_end)(TaskManager *manager);
+    ND_RANGE_T_PTR ndr;
+
+    /* user function */
+    HTaskPtr create_task(int cmd);
+    HTaskPtr create_task(int cmd, memaddr r, long rs, memaddr w, long ws);
+    HTaskPtr create_task_array(int id, int num_task, int num_param, int num_inData, int num_outData);
+
+    void run();
+    void *allocate(int size);
+    void set_TMend(void (*endf)(TaskManager *manager));
+    int get_cpuNum();
+    int get_random();
+    Scheduler *get_scheduler();
+    void set_NDRange(ND_RANGE_T_PTR ndr) ;
+    MemList* createMemList(int size, int count);
+
+    void start_profile() { m_impl->start_profile(); }
+    void show_profile() { m_impl->show_profile(); }
+    void export_task_log() { m_impl->export_task_log(); }
+
+    SchedTask *get_schedTask() {
+    return m_impl->schedTaskManager;
+    }
+
+    /* functions */
+    void init(int spuIdle, int export_task_log, int useRefDma);
+    void finish();
+    void error(const char* str);
+private:
+    int machineNum;
+}  ;
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/TaskManagerImpl.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,119 @@
+#ifndef INCLUDED_TASK_MANAGER_IMPL
+#define INCLUDED_TASK_MANAGER_IMPL
+
+#include "MailManager.h"
+#include "ListData.h"
+#include "QueueInfo.h"
+#include "TaskQueue.h"
+#include "HTask.h"
+#include "Scheduler.h"
+#include "TaskLog.h"
+#include <OpenCL/opencl.h>
+class MemList;
+
+extern QueueInfo<TaskQueue> *taskQueuePool ;
+extern QueueInfo<HTask> *htaskPool ;
+extern QueueInfo<TaskList> *taskListPool;
+extern QueueInfo<TaskLog> *taskLogQueue;
+
+class TaskManagerImpl {
+ public:
+
+    /* variables */
+    int machineNum;
+    QueueInfo<HTask> *activeTaskQueue;
+    QueueInfo<HTask> *waitTaskQueue;
+
+    QueueInfo<TaskQueue> *taskQueueImpl;
+    QueueInfo<HTask> *htaskImpl;
+
+    SchedTask *schedTaskManager;
+    Scheduler *scheduler;
+    TaskManagerImpl *others;
+    int _export_task_log;
+
+    /* constructor */
+    TaskManagerImpl(int num = 0) ;
+
+    virtual ~TaskManagerImpl() { }
+
+    /* functions */
+    // system
+    virtual void init(int,int,int) = 0;
+    virtual void run() = 0;
+    virtual void start_profile() = 0;
+    virtual void show_profile() = 0;
+    virtual void export_task_log(){}
+    virtual void append_activeTask(HTaskPtr);
+    virtual void append_waitTask(HTaskPtr);
+    virtual void polling() = 0;
+    virtual void print_arch() = 0;
+    virtual void set_NDRange(void*) = 0;
+    void check_task_finish(HTaskPtr task, QueueInfo<HTask> *wait_queue);
+    void check_task_list_finish(SchedTask *s, TaskListPtr list, QueueInfo<HTask> *wait_queue);
+
+    void systask_init();
+
+    // user
+    virtual HTaskPtr create_task(int cmd,void *from);
+    virtual HTaskPtr create_task(int cmd, memaddr rbuf, long r_size, memaddr wbuf, long w_size,void *from);
+    virtual HTaskPtr create_task_array(int id, int num_task, int num_param, int num_inData, int num_outData,void *from);
+    virtual TaskListPtr createTaskList() = 0;
+
+    const char *get_task_name(int cmd);
+    const char *get_task_name(TaskPtr task);
+    const char *get_task_name(SimpleTaskPtr simpletask);
+    const char *get_task_name(SchedTaskBase *schedtask);
+    const char *get_task_name(HTaskPtr htask);
+    const char *get_task_name(HTaskPtr htask, int index);
+    virtual void set_task_depend(HTaskPtr master, HTaskPtr slave);
+    virtual void spawn_task(HTaskPtr);
+    virtual void set_task_cpu(HTaskPtr, CPU_TYPE);
+    void set_taskList(HTaskPtr htask, QueueInfo<TaskList> * taskList);
+    
+    void free_htask(HTaskPtr htask) {
+#if !defined(__SPU__)
+        if (htask->self) {
+            htask->flag.no_auto_free = 0;
+            return;
+        }
+        htaskImpl->free_(htask);
+#endif
+    }
+
+    void* allocate(int size, int alignment)
+    {
+
+        void *buff = 0;
+        if (size==0) return 0;
+#if defined(__SPU__) || ! defined(HAS_POSIX_MEMALIGN)
+        buff =  malloc(size);
+#else
+        posix_memalign(&buff, alignment, size);
+#endif
+        if (buff==0)
+            get_scheduler()->printf("Can't allocate memory\n");
+        return buff;
+    }
+    
+    void* allocate(int size)
+    {
+        
+        void *buff = 0;
+        if (size==0) return 0;
+#if defined(__SPU__) || ! defined(HAS_POSIX_MEMALIGN)
+        buff =  malloc(size);
+#else
+        posix_memalign(&buff, DEFAULT_ALIGNMENT, size);
+#endif
+        if (buff==0)
+            get_scheduler()->printf("Can't allocate memory\n");
+        return buff;
+    }
+
+    Scheduler* get_scheduler() { return scheduler; }
+    void set_scheduler(Scheduler *s) {  scheduler = s; }
+    
+}  __attribute__ ((aligned (DEFAULT_ALIGNMENT)));
+extern void error(const char* error_message);
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/TaskQueue.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,38 @@
+#ifndef INCLUDED_TASK_QUEUE
+#define INCLUDED_TASK_QUEUE
+
+#include "base.h"
+#include "types.h"
+
+class HTask;
+
+class TaskQueue {
+
+  /**
+     HTask 間の dependency を表すリスト。HTask の wait_me と wait_i がこれ。
+   */
+public:
+    TaskQueue(HTask *q = NULL);
+
+    BASE_NEW_DELETE(TaskQueue);
+
+    HTask *task;
+    TaskQueue *waiter;
+
+    TaskQueue *next;
+    TaskQueue *prev;
+
+    void init() { }
+    void initOnce() { }
+    void freeOnce() {}
+
+    TaskQueue *init(HTask *task) {
+	this->task = task;
+	return this;
+    }
+
+}  ;
+
+typedef TaskQueue* TaskQueuePtr;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/Threads.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,30 @@
+#ifndef INCLUDED_THREADS
+#define INCLUDED_THREADS
+
+#include <pthread.h>
+#include "base.h"
+#include "types.h"
+
+
+class Threads {
+public:
+    BASE_NEW_DELETE(Threads);
+
+    /* constructor */
+    Threads(int num = 1) {};
+    virtual ~Threads() {};
+
+    /* functions */
+    virtual void init() = 0;
+    virtual int get_mail(int speid, int count, memaddr *ret) = 0; // BLOCKING
+    virtual int has_mail(int speid, int count, memaddr *ret) = 0; // NONBLOCK
+    virtual void send_mail(int speid, int num, memaddr *data) = 0; // BLOCKING
+    virtual void add_output_tasklist(int command, memaddr buff, int alloc_size) = 0;
+    virtual int is_gpu(int cpuid) { return 0; }
+    virtual void set_NDRange(void* ndr)=0;
+    /* variables */
+    pthread_t *threads;
+    int cpu_num;
+}  ;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/base.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,27 @@
+#ifndef INCLUDED_BASE_H_
+
+#include <new>
+#include <stdlib.h>
+#include <stdio.h>
+
+
+#ifdef __SPU__
+#  define BASE_NEW_DELETE(T)						\
+    /* override new/detele */                                           \
+    static void* operator new(size_t size) {                            \
+	if ((int)size == 0) {						\
+            size = 1;                                                   \
+	}                                                               \
+									\
+	void *ptr = malloc(size);					\
+	return ptr;							\
+    }                                                                   \
+    static void operator delete(void* rawMemory, size_t size) {         \
+	free(rawMemory);                                                \
+    }                                                                   \
+
+#else
+# define BASE_NEW_DELETE(T)
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/error.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,30 @@
+#ifndef CERIUM_ERR
+#define CERIUM_ERR
+
+#ifdef DEBUG
+#  include <stdio.h>
+#  define __debugs(s, ...) do { \
+	s->printf(__VA_ARGS__);		\
+    } while (0)
+#else /* DEBUG */
+#  define __debug(...)
+#endif
+
+#ifdef DEBUG
+#  include <stdio.h>
+#  define __debugs_ppe(s, ...) do { \
+	s->printf("[PPE] ", __VA_ARGS__);	\
+    } while (0)
+#else /* DEBUG */
+#  define __debug_ppe(...)
+#endif
+
+#ifdef DEBUG
+#  include <stdio.h>
+#  define __debugs_spe(s, ...) do { \
+	s->printf("[SPE] ", __VA_ARGS__);	\
+    } while (0)
+#else /* DEBUG */
+#  define __debug_spe(...)
+#endif
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/gettime.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,32 @@
+#ifndef GETTIME_H_
+#define GETTIME_H_
+
+#include <time.h>
+#ifdef __APPLE__
+#include <sys/time.h>
+#endif
+/**
+ *  Mac OS X側には、clock_gettimeがないので、gettimeofdayを使う
+ */
+inline unsigned long long gettime() {
+
+	unsigned long long time = 0;
+#ifdef __CERIUM_FIFO__  // ??
+	struct timespec ts;
+
+#ifndef __APPLE__
+	clock_gettime(CLOCK_REALTIME, &ts);
+#else
+	struct timeval tv;
+	gettimeofday(&tv, NULL);
+	ts.tv_sec = tv.tv_sec;
+	ts.tv_nsec = tv.tv_usec * 1000;
+#endif
+
+	time = ((ts.tv_sec << 32) | ts.tv_nsec );
+#endif // __CERIUM_FIFO__
+	return time;
+
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/rdtsc.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,16 @@
+#ifndef RDTSC_H_
+#define RDTSC_H_
+
+/*
+ *  rdtsc is Read Time Stamp Counter
+ */
+
+inline unsigned long long rdtsc() {
+	unsigned long long ret = 0;
+#ifdef __CERIUM_FIFO__ // ??
+	__asm__ volatile ("rdtsc" : "=A" (ret));
+#endif // __CERIUM_FIFO__
+	return ret;
+}
+
+#endif /* RDTSC_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/types.h	Tue Mar 12 17:06:42 2013 +0900
@@ -0,0 +1,82 @@
+#ifndef INCLUDED_TYPES
+#define INCLUDED_TYPES
+
+#include <stdint.h>
+
+typedef uint16_t uint16;
+typedef uint32_t uint32;
+typedef uint64_t uint64;
+
+//  HOST main memory address 
+//       SPU's (void *) is always 32bit (actually 18bit (256kbyte))
+//       memaddr is different from (void *) in SPU.
+//
+#ifdef __SPU__
+#if ABIBIT>32
+typedef uint64_t memaddr;
+#else
+typedef uint32_t memaddr;
+#endif
+#else
+typedef char* memaddr;
+#endif
+
+
+#define Newq(Type,Count) ((Type *)malloc(sizeof(Type)*Count))
+#define ReAlloc(Pointer,Type,Count) ((Type *)realloc((void*)Pointer,sizeof(Type)*Count))
+
+
+#define SPE_ALIGNMENT 16
+#define SPE_ALIGNMENT_FULL 128
+#define SPE_ALIGN __attribute__((aligned(SPE_ALIGNMENT)))
+#define SPE_ALIGN_FULL __attribute__((aligned(SPE_ALIGNMENT_FULL))
+#define ROUND_UP_ALIGN(value, alignment) \
+    (((value) + ((alignment) - 1))&(~((alignment)-1)))
+#define DEFAULT_ALIGNMENT SPE_ALIGNMENT
+//#define DEFAULT_ALIGNMENT SPE_ALIGNMENT_FULL
+
+#define DMA_MAX_SIZE 16384
+
+#define round_up16(value)  ROUND_UP_ALIGN(value, 16)
+#define round_up128(value) ROUND_UP_ALIGN(value, 128)
+
+#define TaskArray (-1)
+#define TaskArray1 (-2)
+
+// SPU 依存 (よろしくないが...)
+
+// ここも typedef しとくか?
+enum {
+// どの方向かで enum 分けるだろjk...
+// PPE -> SPE 
+    MY_SPE_NOP = 0,
+    MY_SPE_COMMAND_EXIT,
+    MY_SPE_COMMAND_GO,
+
+// SPE -> PPE
+    MY_SPE_STATUS_BUSY,
+    MY_SPE_STATUS_READY,
+    MY_SPE_COMMAND_MALLOC,
+};
+
+#define MAX_USE_SPE_NUM 32
+
+typedef enum {
+    CPU_PPE = 0, // default
+    GPU_0 = 1,
+    GPU_1 = 2,
+    GPU_2 = 3,
+    GPU_3 = 4,
+    CPU_SPE = 5,
+    SPE_ANY = CPU_SPE,
+    SPE_0 = 6,
+    SPE_1 = 7,
+    SPE_2 = 8,
+    SPE_3 = 9,
+    SPE_4 = 10,
+    SPE_5 = 11,
+
+
+} CPU_TYPE;
+
+#endif