Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » EMF » ID problems: blanks in ID and unset int fields
ID problems: blanks in ID and unset int fields [message #415756] Fri, 04 January 2008 20:53 Go to next message
Philipp Kutter is currently offline Philipp KutterFriend
Messages: 306
Registered: July 2009
Senior Member
This is a multi-part message in MIME format.
--------------090501090205020300070704
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Hi.
I had a 2 day modeling session with a client, and to my surprise, the
fact that one can define an ID, and have the references look nice was
one of the most important things for them. It seems business oriented
clients like easy to read XML formats.


I thus started to use the feature with them, and we run into problems.

These are the problems I detected:

- spaces in String-ID attributes let the editor crash

- an int-ID attribute which is unset (but which displays as 0 in the
editor...) create not a reference to 0, but the usual positional reference.

- ID attributes which are many do crash too.



Last but not least, I do not understand why I can select a set of
features for the eKeys() but only one ID. The main purpose of the ID
feature in my opinion is to create clean unique business keys. Such
keys are typically composed from several fields, not only one.

I attach an example project, where all that I told can be repeated. Its
standard EMF usage, EMF 2.4, Eclipse 3.4M4. I attach as well a screenshot
of the model.

Best, Philipp

--------------090501090205020300070704
Content-Type: image/jpeg;
name="IdProblems.jpg"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="IdProblems.jpg"

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgIC AgUEBAMEBgUG
BgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgIC AgUDAwUKBwYH
CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgr/wAAR
CAFjAugDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcI CQoL/8QAtRAA
AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS 0fAkM2JyggkK
FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1 dnd4eXqDhIWG
h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW 19jZ2uHi4+Tl
5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcI CQoL/8QAtREA
AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMz UvAVYnLRChYk
NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0 dXZ3eHl6goOE
hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU 1dbX2Nna4uPk
5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9/KKKKACiiigAooooAKKK KACiiigAoooo
AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigAorxz4/ftp+BP2ffEuq6FrHw8 8Va9a+E/CsXi
n4ja14fisfs3g7QZHu1j1K8W6uoZrmMjT9RfyrCO7uAtjJmENJAs3qvifxDY eEfDWo+K9Vt7
6W10uxmu7mLS9Lnvrl440LssNtbI81xIQpCxRI8jthVVmIB9CvlWYYalSqVK bSq/D1b2drLV
NqUZJNJuMoyV4yTcKcG2k9i9RXlX7K37Z3wB/bO0DWvE37P/AIt/tux0HXL7 S7++tVWe0Mtv
f3dmDHdwNJbS+atoLpI1lMotbyynkjjW6h3+q1nmGX47KsbPCYynKnVg7SjJ NNPzT+/zWq0H
CcZxUou6YUUUVxlBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUU
UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFAB
RRRQAUUUUAFcr8avi/4a+Bfw7ufiJ4osb68jS+sdO0/TNLiRrnUtRvryGxsb KHzHSJZJ7u4t
4FeWSOFGlDSyRRq8i/HP7QH7MHjvXYf2qPih4O+HN8fE2ufGPwjFZX+raDfa rbXvg+DTfBUm
uxwaYksZ1Gzngsr+G8s7MrLqa2K2TGZ4YI4/ONK/Y30D4lfCPxHp/wDwoHQ9 c8H3XxV+FEmn
+CdG/ZTv/AehWtxbeLFGtahFomrXNxcy3D6TeeTe3/2eGB7KKOHzZxDcpB+q ZTwNw/XoUMXi
cwfI50IygqTv+8VCUlzqbhHlVaSTk4uXsptJNWOGpiaqbjGHR637X6b9PxR+ m9Ffmt4e/Z++
KFz+1hJd+K/DNjZfEMfH+61mLxbp37LGsXXiZvDi+KJL22tz4+fUYtMWzfQR FayQ5LxWDvpi
28twgtXv/EL9lPxXpP7PC+KbX4Tf8hv9qrxvq3xZtvGPwx1Xxrb6j4a/tfxe NJSfw9bzx3Wp
af8Aa73Tby3tbX9zFPdf2p5Z/wBInaKnh9lFKdODzPWbilajLW8Zy5oXknUh JQcaUqamqs3G
MbXuNYuo7+5+Pp92+t9kfo1RX55/DH9kubxz4W+FfgzxV8Pb7U/h7fftN32s t4b0n4Q6l4E0
HStDHw/1Wzkt49CnvJ7mw0ufUlkW4hvRBFfXGo3Qe3lt71Hur1r8JdA0bTfA Gn/tdfs1a54t
+D/hnXPi1pNr4JuvhXf+KbTTbg+MoR4VePRLa0uZI7eLQ7a/hs7pbcQW9rKs KSRpdRJLz1+B
csp140qWOdSTvdRo+98NdqKhKpGTqc1DkdOSi1KcVdvdrFTau42+fp5ba7+R 9/UV+a3x8+C2
j6p8UNH164/ZzsbP4Rt8OLC2+Gnhf4sfsneIfiiukXKaxrct79j03TbzzfDE clpPozLbXMcL
G2WytFhtzpclrb9zc/Biw8NeJfCGnftrfAr4j/Fq6s/gB4L0X4d6rJ4Rn1fX LTxhavqo1m5j
1CynuYfDOqTmXRGfU5NQt4mlhikW/dbFp4bq8BZfToQqLGylKSvyKj7z1V1B uoqdSVO/75Rq
NUuWXM3ysFipt25fx/PS6v001PcdA/4KAaH8R/DXhHXfgN+zd8R/iDdeKfhx onji50Xw++h2
lzoWk6ukzac142qapaQtJMbW8TZbSXBRrSTzNivC0vo/wd+Ouk/G7QNL8T+E /BWuQWN5/a1t
q0+oC1T+w9V02/8A7Pu9KuVSdi9wt0l3GJLYT2rfYZmE5V7dp/jn4ReGvC/w 3/Zr+BGjfHz4
P/HHwL4i0X9nLwXZ6T49+FGjeKLrUhqtvZyLcaZqumaLaTxt/ZsnkTRQ6zDP ayPqd3GkDBb1
Ho/tL+Ev2o/jX8B9R1rxX8NfFWtaxd/sj/HPQdLuh4Vliv8AVI7nUNDj8PG7 tYok+z6pqGnW
sVy9n5UEnn/aUW2gMTQRevieDMkxOPjhMOlRpurKCqzbldKFWV4tVPZ1YpwS vF05UpWp1YVJ
NszjiKqhzPV22+7yuvxvurH6GVyvxk+L/hr4IeEbPxn4rsb64tb3xVoXh+KP TokeQXOrataa
VbOQ7qPLWe8iaQ5LCNXKq7AKfkf4z/s0at8M/EXxX+HXwV+EeuJ8O7zQ/hVr HiTS9Osbq8i8
TLH4u1STxfLODvk1zULrQ7eGO+VvtF7qERghlFw00SP5xpngH4d6t8c/iXov 7J37Nnirwl4Z
+3fs+6jpvhmbwdeaPGLa2+I2qT317Z6NMqTaVZoILmSVHtrRWkgu7wxslx9r n8zK+BsqxK+s
yxUpUoyo39yMU4VJYZNTl7V+zlbESskp39lN3STcbniZx93l1169r+Wu3luj 9KaK/Nbw9+z9
8ULn9rCS78V+GbGy+IY+P91rMXi3Tv2WNYuvEzeHF8USXttbnx8+oxaYtm+g iK1khyXisHfT
Ft5bhBav+lNfM8T8O4Th+dGNHE+2502/clC1rWlFy0qU5a8lSPuys7G1CtKr e8bW8/6s/IKK
KK+VNwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA+ K/2/PCXjubxL
+0J4U0f4a+KtXuvjh+zJp/gT4cy+H/Ct9qNtda9E/ipJLa8ubWKSHSYwda04 /ab97e3KzSMJ
SsE5i+qvE+t/DvxtDqPwo8Z+Dr7V9P1e+m8OatpuqeDby4069WXTTdyxzNJA YJLN7Zmiadib
ZpmNqXM58muqor6THcQf2hhMPSnTcZUlpKMre8oUqcXbldkoUYXV7ublJSim orGNLlk3ff8A
zb/U5X4dfAn4IfB+/vtV+Evwb8K+FrrVLHT7LUrnw54etrGS7trCD7NYwStC imSO3g/dQo2V
ij+RAq8V1VFFeDiMRiMVVdSvNzk7K8m27JJLV66JJLskkapKKsgooorEYUUU UAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQ
AUUUUAUfE/h6w8XeGtR8KarcX0VrqljNaXMul6pPY3KRyIUZobm2dJreQBiV lidJEbDKysAR
8c/s5fsneLrn9oH9oFfhv+2p8Y/CFr4f+I+l+HbGGPVNJ8RXLWEfhbRNSSKT UfE2nanqDxrd
atfyJAbnyImuZTHGjSys/wBqV4d+yb/yXr9p3/suOn/+oJ4Tr7DhrNMbgMsz KNKScfYxfLKM
Zwv9YoLm5JqUXJJtJ2uk3Z6nPWhGc4X7+nR9g/4ZN+PX/STr44/+CDwJ/wDM zR/wyb8ev+kn
Xxx/8EHgT/5ma9xorz/9Zcx/590f/CbD/wDyov2MO7+9/wCZ4d/wyb8ev+kn Xxx/8EHgT/5m
aP8Ahk349f8ASTr44/8Agg8Cf/MzXuNFH+suY/8APuj/AOE2H/8AlQexh3f3 v/M8O/4ZN+PX
/STr44/+CDwJ/wDMzR/wyb8ev+knXxx/8EHgT/5ma9xoo/1lzH/n3R/8JsP/ APKg9jDu/vf+
Z4d/wyb8ev8ApJ18cf8AwQeBP/mZo/4ZN+PX/STr44/+CDwJ/wDMzXuNFH+s uY/8+6P/AITY
f/5UHsYd397/AMzw7/hk349f9JOvjj/4IPAn/wAzNH/DJvx6/wCknXxx/wDB B4E/+ZmvcaKP
9Zcx/wCfdH/wmw//AMqD2MO7+9/5ngH7OU3xi8E/tc/En4B/EL9o/wAVfEXR 9I+HHg/xBo9z
4v0vRbe5srm/v/EltcoraTp9kjxsmmWpAkV2VlbDAMRXv9eHeAf+Uk/xZ/7I d8Pf/Tx40r3G
q4pcZ5qpqEY81LDyajGMI3lQpttRglFXbbdkrttvVhQ0p28359WFFFFfOmoU UUUAFFFFABRR
RQAUUV4B/wAFMfDHhrxt+zBYeDPGfh6x1fR9X+Mfw2stW0nVLRLi2vbaXxxo ccsE0UgKSRuj
MrIwKsrEEEGvSybAQzXN8PgpT5FVqQg5JczipSUb2vG9r3tdX2utyKknCm5d ke/0V4d/w7F/
4Jsf9I9fgd/4abR//kaj/h2L/wAE2P8ApHr8Dv8Aw02j/wDyNXd9W4V/6Cq3 /giH/wA0k3r/
AMq+9/5HuNFeHf8ADsX/AIJsf9I9fgd/4abR/wD5Go/4di/8E2P+kevwO/8A DTaP/wDI1H1b
hX/oKrf+CIf/ADSF6/8AKvvf+R7jRXh3/DsX/gmx/wBI9fgd/wCGm0f/AORq P+HYv/BNj/pH
r8Dv/DTaP/8AI1H1bhX/AKCq3/giH/zSF6/8q+9/5HuNFeHf8Oxf+CbH/SPX 4Hf+Gm0f/wCR
qP8Ah2L/AME2P+kevwO/8NNo/wD8jUfVuFf+gqt/4Ih/80hev/Kvvf8Ake40 V4d/w7F/4Jsf
9I9fgd/4abR//kaj/h2L/wAE2P8ApHr8Dv8Aw02j/wDyNR9W4V/6Cq3/AIIh /wDNIXr/AMq+
9/5HuNFeHf8ADsX/AIJsf9I9fgd/4abR/wD5Go/4di/8E2P+kevwO/8ADTaP /wDI1H1bhX/o
Krf+CIf/ADSF6/8AKvvf+R7jRXh3/BMX/lGx+z1/2Q7wn/6Z7Wvca8/NsD/Z ea18Hzc3spyh
e1r8snG9ru17Xtd27lU589NS7q4UUUV55YUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRR
QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV4d+yb/wAl6/ad/wCy46f/AOoJ 4Tr3GvDv2Tf+
S9ftO/8AZcdP/wDUE8J19Bk3/IuzL/rzH/1Iw5lU+OHr+jPcaKKK+fNQoooo AKKK4f4zftF/
Cz4C/wBm2/j261y4vtY85tN0Twp4P1PX9Snih2Ca4FlpdvcXP2eJpYEkuDH5 Ub3MCO6tNEr9
GFwmKx1dUMNTlOb2jFOTdld2Su3ZJv0FKUYq7dkdxRVHwx4n8NeNvDWneM/B niGx1fR9XsYb
3SdW0u7S4tr22lQSRTwyxkpJG6MrK6kqysCCQa5X4cftL/AH4w/Erxd8IPhR 8XND8SeIvAX2
ZfGenaHfLdf2NLPNdwJb3EkeY47gSWN0r25bzY/LBkRBJGWqOBxs4VZxpSap azfK7QTkormd
vdvJqOtveaW7FzRTSvvsdxRRRXKUeHeAf+Uk/wAWf+yHfD3/ANPHjSvca8O8 A/8AKSf4s/8A
ZDvh7/6ePGle419BxN/yMaf/AF5w3/qPSMqPwP1f5sKKKK+fNQooooAKKKKA CiiigArw7/go
V/yQXQP+y4/DH/1O9Br3GvDv+ChX/JBdA/7Lj8Mf/U70GvoOE/8AkqsB/wBf qX/pcTKv/Al6
P8j3GiiivnzUKKKKACiiqPh7xP4a8XWEmq+FPENjqlrFfXVlLc6ddpPGlzbT yW1zAWQkCSKe
KWKRPvJJG6MAykClCbg5W0Wl+l3e332f3MC9RVG48Q2Ft4ltPCklvfG6vbG4 u4ZY9Lne2WOB
4EdZLlUMMUhNxGUid1klVZWjV1hlKXqJQnFJtWvqvNXtp8016oAoorD0/wCJ HgvVPiVq3wgs
dZ8zxFoeh6drGq6d9mkHkWV9NewWsvmFfLbfJp14u1WLL5OWCh0LVCjVqRlK EW1FXbS2V0rv
srtK76tLdoTaRuUUUVmM8O/4Ji/8o2P2ev8Ash3hP/0z2te414d/wTF/5Rsf s9f9kO8J/wDp
nta9xr6Diz/kqcf/ANfqv/pcjHD/AMCHovyCiiivnzYKKKKACiiigAooooAK KKKACiiigAoo
ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK8O/ZN/5L1+07/wBl x0//ANQTwnXu
NeHfsm/8l6/ad/7Ljp//AKgnhOvoMm/5F2Zf9eY/+pGHMqnxw9f0Z7jRRRXz 5qFFFFABXzl+
0r8Tvhr8B/23vhV8Zvjj8Q9D8GeD4fhV440WbxX4r1aHTtNTUrrUvCk9tZG6 uGSIXE0Nleyx
wlt7paTsoIicr9G0V6mT4+lluO9tVg5xcakGlLldqlOVN2k4ySaUrq8XtsRU g5xsn2/B3PAP
2BvE/hr4S/sJfBL4XfFTxDY+GfE3h74OeBrLX/DviC7Syv8ATLm8tIdPtILi 3mKyQyT3sMtr
EjqGknieJQXUqL3gH/lJP8Wf+yHfD3/08eNK9xoruxWewxGIx9b2VpYq9/e0 i3Vp1Xb3ddYN
b7SWt4vmiNLljFX+H/JoKKKK+dNjw7wD/wApJ/iz/wBkO+Hv/p48aV7jXh3g H/lJP8Wf+yHf
D3/08eNK9xr6Dib/AJGNP/rzhv8A1HpGVH4H6v8ANhRRRXz5qFFFFABRRRQA UUUUAFeHf8FC
v+SC6B/2XH4Y/wDqd6DXuNeHf8FCv+SC6B/2XH4Y/wDqd6DX0HCf/JVYD/r9 S/8AS4mVf+BL
0f5HuNFFFfPmp8j/ALU3jn4D2X7XOqeFP21v2nL74aeBbb4caDd/DuWT4z6h 4FttT1aa/wBa
TWVjubK+sjqUkUEGiF4pHmFqs8TKsX2tjL478dvjLoGn+HfjLrHjH9rTxzp/ xm0DQ7aT9mHw
3r/jy/8AC2seKv8AikdLutOmHhWF7G31m4uPEEuoxPDNp0nm3Cy2DRbLcWsX 6NUV+hZVxvhs
u9k5YecuSEY8qqpQXK6bk4R9lJw9ryNV0pNVeeV91bknhnO+v4evn06dj4d+ IWr/ABK0b40f
F742Wfxx8ci48JftVfDnwl4W8Of8JNMui6bpurW3gi21SP7CpEVz9ph1W6G2 5EyW8h+0Wq21
xJNNL44NA0f4RfDOw+AepftX33wb0FPjH8Vb7xP4u+JnxO8Qx2FrqKeJUfR9 MubiLW9Mv47y
90i+XU7eM6kkNzALq+ks72W4S9t/1ForswHiPPBYalR+r6Q5NYzjF/u6HsYa OnKPuzlUrpOM
l7Sbk7tyc5ng1KTd+/4u/f0Xoj8utX/aV+N7fsp65DB+03fazrHhb9mT4/lN e8M65cwLM2ma
poZ8N6qpN1POZDo13ZXdpdzzz3MltqMdz9pnN0biX1X9o7X/AI3/ALPKfGj4 T/DH4t+Ktetd
O8K/C/xBq2p+MvG9zDJGur+K9VsPE1/LqcUUj6BZvpWn75ZLCKG20uOKa6tI LZlY194UVVXx
Ewc6kGsvjyqpKpKPNG0nLEQr292nG0UoypJL7M/KzFhJJP3+lvwt3+Z+cvw4 +LnxBb4HfE/X
fAHx50O8+HcGufD+11LUPh/+0Fr/AMQotDsrjxEYfFd5J4p1K0gksMaG8TyR W9yW0yK3+35s
2uUnl9U/YD1f4L6x+298Z5f2efjjrnxB8HxfCrwDHo+u6t4mudet1/4mXi5p YbLV7kyS6pbr
M0hMzXN15U73FqJUFqLW3+xqK48z45w2Py/G4WnhZQ+scv8Ay95krfV3efNT 5qkv3DtPnjJe
1ndyvLmqGGlCcW5Xt5evnpv+CCiiivzs6zw7/gmL/wAo2P2ev+yHeE//AEz2 te414d/wTF/5
Rsfs9f8AZDvCf/pnta9xr6Diz/kqcf8A9fqv/pcjHD/wIei/IKKKK+fNgooo oAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC iiigAooooAKK
KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArw7 9k3/AJL1+07/
ANlx0/8A9QTwnXuNeHfsm/8AJev2nf8AsuOn/wDqCeE6+gyb/kXZl/15j/6k YcyqfHD1/Rnu
NFFFfPmoUUUUAFFFFABRRRQAVyvxq+L/AIa+A/w7ufij4zsb6XR7C+sYtWub GJGXTra4vIba
XULhpHRIbO1SVrq5nZgsNtbzynITB6qqPifwx4a8beGtR8GeM/D1jq+j6vYz WWraTqlolxbX
ttKhjlgmikBSSN0ZlZGBVlYggg10YSWGhiqcsRFypqS5knZuN9Un0bWzFK/K 7bngGofEjwX8
G/23vj18X/iRrP8AZvh3wp+zl4I1jX9R+zSTfZbK21LxvPPL5cStI+2NGbai sxxgAkgV7/4Y
1a/1/wANadruq+GL7RLq9sYZ7nRdUkge5sJHQM1vM1tLLC0iElGMUkkZZTtd 1wx/PP4BfDf4
/fEP/gpP4h/Za+Luja5e+FfhL4G8BT+J/HmuXLSv4yi0XWPEt94VBmmZLm6u JWvLC+vdQhCx
f2l4a1C0aNoLoZ/RqvtuPcuweVY2jRjUVSpKlQlzRd4+z+r0o09N1KdpTalf 3HSaabkjmws5
VIt2srv77u/+XrcKKKK+BOoKKKKACiiigAooooAK+ZP2sfi/4a+MH7OsdzoV jfWF14c/ab8B
eH9a0nVokiu7S5tPiFocavJErsY47iDyL23LYaW0vbWbaFmWvpuvg/8A4K3W 3xZ/Z8TTfjP8
BfhBfeNo/iN8R/h9Y6x4O025FrHL4p0zxXpV3pF7LOyiCxjvLaCfS7rULjzG MkXh+FVEcTkf
ceHmBoZlxVhcO2o1fa0pQbkoxvGcXKMnJqKThzNSbXvRS2kzmxcnChJ9LO/3 H2N4L+L/AIa8
f/ETxl8O/DVjfSyeBL6z07XtTkiRLZdRuLOK+NlHl/NeSO0ubGd38sQ7b6JU kkkS4jh6quH/
AGbvgz/woD4L6N8MbvxJ/bmqW/2m+8TeIfsf2b+2tavbmW91PUfIDutt9pvr i5uPIRvLh87y
4wqIqjuK+VzKOBhjpwwbvTjopa+9ZJOdnZx52nJResU+W7td7w5nFc2/9fkF FFFcJQUUUUAF
FFFABRRRQAUUUUAeHf8ABMX/AJRsfs9f9kO8J/8Apnta9xrw7/gmL/yjY/Z6 /wCyHeE//TPa
17jX0HFn/JU4/wD6/Vf/AEuRjh/4EPRfkFFFFfPmwUUUUAFFFFABRRRQAUUU UAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV4BN+zl+1z4J+MXxI+I XwD/AGk/hxpG
j/EXxVa+ILnR/F/wgv8AV7myuYtF0zSWRbm21+yR42TTI5ADCGVpWG5gAa9/ or0stzbG5TKo
8Py/vI8slKEKiceaM7WqRkvijF3Svpa9m7xOnGpa/Tza/I8O/wCEB/4KT/8A R2XwO/8AEetY
/wDmto/4QH/gpP8A9HZfA7/xHrWP/mtr3Giu7/WXMf8An3R/8JsP/wDKifYw 7v73/meHf8ID
/wAFJ/8Ao7L4Hf8AiPWsf/NbR/wgP/BSf/o7L4Hf+I9ax/8ANbXuNFH+suY/ 8+6P/hNh/wD5
UHsYd397/wAzw7/hAf8AgpP/ANHZfA7/AMR61j/5raP+EB/4KT/9HZfA7/xH rWP/AJra9xoo
/wBZcx/590f/AAmw/wD8qD2MO7+9/wCZ4d/wgP8AwUn/AOjsvgd/4j1rH/zW 14Z/wUg+GP7S
mufsmT+F/wBq74nfCrx54P1n4p/DXT7zw3ofwhvNL+0+b4/8Oo63DXmt6hFP btCZo3gMI3+Y
CXAUo/3JXzh/wVY/5NL0/wD7Lh8Lf/U/8P1M8+x2KXspwpJSsnahQi/lKNNS XqmmRUpRjTk0
3s+r/wAzx/8A4dlf8E3P+kfPwP8A/DT6P/8AI1H/AA7K/wCCbn/SPn4H/wDh p9H/APkavb6K
9r2VL+VfcfD+2rfzP7zxD/h2V/wTc/6R8/A//wANPo//AMjUf8Oyv+Cbn/SP n4H/APhp9H/+
Rq9voo9lS/lX3B7at/M/vPEP+HZX/BNz/pHz8D//AA0+j/8AyNVLxF/wTq/4 Jg+EtAvfFHiT
9gv4F2en6dayXN7dzfCnRwkMSKWZz/o3QAE175Xl/wC2h4A8Y/E79mHxd4O+ H6SPrM1jFcWE
MGPMmeCeO48pM8F3ERRQeCWGSOtY4lRo4adSEE2k2lbdpaImeIrxg2m20trn z/Z/smfsp+Id
BX4k+Cv+CHHwy1Hwa8RuIdVl+HOiQXs1uOsqWhsiOQGIDSrwBu2HIX0P4afs I/8ABLD4t+CL
D4geCv2BvgnPp+oRkx+d8ItIjlidWKPFIjW2UkR1ZGU8hlIrzzxz8avh38Z7 3wX8aF/bo8Qf
Dmx8N+AY9G8TeE9M064i1SK9t4pI5Ps5MZi2yOQrb2TaqHdg8L6t/wAE5vA3 jfwd+z2+o+PG
vRc+ItfuNVtYtRjCTpbvHFFGXUAbd4hMoGAcSjIByB8pkOZYvGY50qtpRs3e 0dNuy0Tvazu/
PczWLm6yjTm5K2/Mn21stUtbWevnozwzxb4G/wCCYHhaw8S+P4P+CNXhXVPh x4OvtVg8T/FT
T/hV4LGk6fHpU81vq1wbaa7j1OSOzmtbtJBFZPJKbVzbpcK8TSe/f8Oyv+Cb n/SPn4H/APhp
9H/+Rq8P+KfiO98A6r411j9n/wCHPxw8C/G1Nc1p/D3gzQfD3iPWvA3im7N1 cSaeLl5LKXw/
YW+rOLO9vbq2ksrq3e8uVmvoJftkjHx40j4k6H8SfiN8L7H4H+ONZvPHf7U/ wy8Z6XqWieGp
rjTbbw9ZTeCre61C4vQBAnlXGkXkb2qu14iKLlrdbQPdJ9QuSKbcU/kvPy/B 7HotVJNJSa+b
8vPzvdaPsj3D/h2V/wAE3P8ApHz8D/8Aw0+j/wDyNR/w7K/4Juf9I+fgf/4a fR//AJGr5J+D
vgL4eeI7q8n8Afs3eKh8aR+1rrt7o/xKm8H3l1HH4ct/iddy6ulnr6rLbaRZ nTYtWgl017i0
e4ke7xaynUUkvDw9+z/8T7n9q2S78V+GrGy+IQ+Pt1rEXizT/wBlvWLrxK3h xfFEl5bwHx8+
oxaYtm+hCK1khyXisHfTVt5bhBbOlODSaprX0+7bfyDkqJu9R6ev377eZ9bf 8Oyv+Cbn/SPn
4H/+Gn0f/wCRqP8Ah2V/wTc/6R8/A/8A8NPo/wD8jVR/4J+fBGw+Fvgnxz4v 1XwLfaV4m8V/
GLx1d6pdawk/2m4sf+Ev1uXT1jE5JiszBcG5hiiCwM17NcKpe6lkk99rohTp ygm4pHPOpVjN
pTbseIf8Oyv+Cbn/AEj5+B//AIafR/8A5Go/4dlf8E3P+kfPwP8A/DT6P/8A I1e30VXsqX8q
+4j21b+Z/eeIf8Oyv+Cbn/SPn4H/APhp9H/+RqP+HZX/AATc/wCkfPwP/wDD T6P/API1e30U
eypfyr7g9tW/mf3nk3/BPD4F/BL9n39v/wCOfgz4C/B3wr4I0e5+Dvw5vbnS vCHh62022luW
1XxojTtFboitIUjjUuRuKxqM4UY+2a+UP2Tf+Ukfxs/7If8ADf8A9PHjevq+ vkscksXNLufa
Ze28HBvsFFFFch2BRRRQAUUUUAeHf8Exf+UbH7PX/ZDvCf8A6Z7Wvca8O/4J i/8AKNj9nr/s
h3hP/wBM9rXuNfQcWf8AJU4//r9V/wDS5GOH/gQ9F+QUUUV8+bBRRRQAUUUU AFFFFABRRRQA
UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFF
FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRXnH7Rf7 RcP7PkPhG1tf
hH4q8cax448VN4f8PeHvCD6alzLcrpt9qTuz6leWkCRrbadcsSZdxYKqqS3H VgsFiMwxCoUF
eTu9WkrJOTbcmkkkm220kk22TKSgrs9Horw7/hrL49f9Ixfjj/4P/An/AM01 H/DWXx6/6Ri/
HH/wf+BP/mmr1v8AVrMf+flH/wAKcP8A/LSPbQ7P7n/ke40V4d/w1l8ev+kY vxx/8H/gT/5p
qP8AhrL49f8ASMX44/8Ag/8AAn/zTUf6tZj/AM/KP/hTh/8A5aHtodn9z/yP caK8O/4ay+PX
/SMX44/+D/wJ/wDNNR/w1l8ev+kYvxx/8H/gT/5pqP8AVrMf+flH/wAKcP8A /LQ9tDs/uf8A
ke4184f8FWP+TS9P/wCy4fC3/wBT/wAP1vf8NZfHr/pGL8cf/B/4E/8Ammrx r9vr43/Ez4lf
s4WuheM/2O/iP8PbWL4w/C+ePWvF+qeGp7aaQfELw4ot1XStYvJhIQzOC0ax 7Y2y4YqrTLIc
dhl7Wc6TSt8NehJ79IxqOT9EmyKlWMqckr7Po/8AIxv+GUPjz/0k1+OH/gg8 C/8AzNUf8Mof
Hn/pJr8cP/BB4F/+Zqj/AIT7/gpH/wBGofA//wASD1j/AOZOj/hPv+Ckf/Rq HwP/APEg9Y/+
ZOvX/d/3v/Jj4v8Ae/3f/JQ/4ZQ+PP8A0k1+OH/gg8C//M1R/wAMofHn/pJr 8cP/AAQeBf8A
5mqP+E+/4KR/9GofA/8A8SD1j/5k6P8AhPv+Ckf/AEah8D//ABIPWP8A5k6P 3f8Ae/8AJg/e
/wB3/wAlD/hlD48/9JNfjh/4IPAv/wAzVH/DKHx5/wCkmvxw/wDBB4F/+Zqj /hPv+Ckf/RqH
wP8A/Eg9Y/8AmTo/4T7/AIKR/wDRqHwP/wDEg9Y/+ZOj93/e/wDJg/e/3f8A yU5u/wD+Cd2u
6r4pHjjVP24/iZc60sqSLrFx4F+Hr3QdQAreafC+/IwMHORiuk/4ZQ+PP/ST X44f+CDwL/8A
M1R/wn3/AAUj/wCjUPgf/wCJB6x/8ydH/Cff8FI/+jUPgf8A+JB6x/8AMnUR p4eDbimr/wCI
Eqi25f8AyUP+GUPjz/0k1+OH/gg8C/8AzNUf8MofHn/pJr8cP/BB4F/+Zqj/ AIT7/gpH/wBG
ofA//wASD1j/AOZOj/hPv+Ckf/RqHwP/APEg9Y/+ZOr/AHf97/yYP3v93/yU w/h7+wR8RfhX
oNx4Y8Bf8FHPjhYWN1rmp6xPB/ZPgmXde6jfz6heS7pPDjEeZdXM8m0Hau/a oVQqjc/4ZQ+P
P/STX44f+CDwL/8AM1R/wn3/AAUj/wCjUPgf/wCJB6x/8ydH/Cff8FI/+jUP gf8A+JB6x/8A
MnSSpJWV/wDyYbdVu75f/JQ/4ZQ+PP8A0k1+OH/gg8C//M1R/wAMofHn/pJr 8cP/AAQeBf8A
5mqP+E+/4KR/9GofA/8A8SD1j/5k6P8AhPv+Ckf/AEah8D//ABIPWP8A5k6f 7v8Avf8Akwv3
v93/AMlD/hlD48/9JNfjh/4IPAv/AMzVH/DKHx5/6Sa/HD/wQeBf/mao/wCE +/4KR/8ARqHw
P/8AEg9Y/wDmTo/4T7/gpH/0ah8D/wDxIPWP/mTo/d/3v/Jg/e/3f/JQ/wCG UPjz/wBJNfjh
/wCCDwL/APM1R/wyh8ef+kmvxw/8EHgX/wCZqj/hPv8AgpH/ANGofA//AMSD 1j/5k6P+E+/4
KR/9GofA/wD8SD1j/wCZOj93/e/8mD97/d/8lOk/YG8J694H/bw+L/hbxP8A E3XPGV9a/A/4
d+f4k8SW9hFe3m7XPHTr5i6fbW1uNisI18uFPlRS25tzt9l1+RXx5/4KB/tj /sG/Fz4w/G3w
5+wp/wAJv4wufgf4HTX4/B/iK41fQPBsUOoeP5otRvZvsdteXFuFjjkcC2t4 lCzI91CfIaf8
ef2vf+Csv7fn7bfxKsfiR8Zv2idct/7D1yLVvCmgeGLyTTNN8PXcM00trPaQ QMMXEHnukd3I
ZLoIFVpm2g1+seGP0deKfFiNTMaOIpYfCJtc8mpzclpb2UXzLX/n44ae9HmR 7f8Aa9HAYWEG
m5W6aL79vuuf190V+AX/AARu/wCDgr/gph4q+JWhfssePPgNrn7R9i32WD7d odsI/Euj2Rms
rP7XcXeBbXFvEpYvLfeUzzXIae/jWv2M/wCGsvj1/wBIxfjj/wCD/wACf/NN XxPH3g3xb4d5
3/Z2ZToNtXjJYilFSj35ak4TX/b0V5XWp6eFzGhi6fPBP7n+l0e40V4d/wAN ZfHr/pGL8cf/
AAf+BP8A5pqP+Gsvj1/0jF+OP/g/8Cf/ADTV8R/q1mP/AD8o/wDhTh//AJad Ptodn9z/AMj3
GivDv+Gsvj1/0jF+OP8A4P8AwJ/801H/AA1l8ev+kYvxx/8AB/4E/wDmmo/1 azH/AJ+Uf/Cn
D/8Ay0PbQ7P7n/kH/BMX/lGx+z1/2Q7wn/6Z7Wvca8q/YU+G/jT4N/sRfBv4 QfEjRv7N8ReF
PhV4e0fX9O+0xzfZb22023gni8yJmjfbIjLuRmU4yCQQa9VrPiarSxHEmNq0 pKUZVqjTTumn
OTTTWjTWqaCgmqMU+y/IKKKK8M1CiiigAooooAKKKKACiiigAooooAKKKKAC iiigAooooAKK
KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAOH/aL/aA8 F/sxfCyX4v8A
xB0nXL7S4Nc0fS5Lbw3o8moXrS6lqdrpsBjtocyz4mu42aOJXlZQwjjkfbG3 nHjL/goBofge
HxBrWr/s3fEeTQfAVjDP8WfEdu+hm28CSHTbfVLm3vYzqguLuS1sLq3uZTps V7Gyy7IHnlVo
19H/AGhfgz/wvjwFp/gj/hJP7K+w+OfDHiL7V9j8/f8A2Pr1hq3kbd6Y877F 5O/J2ebv2vt2
N8//AB7/AOCU/gT4z/Hjxb8Xjo/wcvI/H99a3fia/wDiH8BrHxP4hsJItPtd NK6TqN1crBZx
i2soZIormyvY47p55XWaOX7Ov3nCtPgapQSzqbhO87u1SSsnQ5ElC1m0675r ytKMOaPLdT5a
7xKf7tdu3nff5fiX/Cn7dXj2y+OPxi8NeOfgr45vG0P4q6d4A+Fng3SBoIbx DcL4dXXbiaGW
S/UJcNavdXjteXFtB9ihsIokW+N3C/Vat/wUL8CaDoelrrHwN+I6eLNR+I7e BJvh5aaVY3mr
WGvNoc2uW9tO9reSWflzWKQSC5S5e3gF5GbmW2SK6e3w/j3/AME3PDXxyfxb qmu654V1e61v
4x2vxC0XR/HvgBNd0GC5i8KWvhprW/09rmE6hH5EM9zGyzW7R3D27fOsDLNe +Df/AAT90n4T
2Xw+bTtU8DaLN4N+Kt543v8ASfhv8LbXw1ot3LP4b1DQRb29nBNJJB+7vI7h 57ie7leSKRA0
cLQxW3r4ip4cYjAwxDaVVUo3pxjVj+9jQSsp+9HklNe9ePO6jlP2vs/deaWM UrdL76bX/O3y
tpa5uf8ADdXhT/hK/L/4Ur45/wCEG/4Tn/hD/wDha2NK/sX+2v7V/sX7L9n+ 3/2p/wAhf/iX
+Z9h8vzP3u/7N/pNHwx/b1+GvxR+JVv8P7H4aeOdKs77xzr/AIL0rxXrmjQw abqPiLR5tRW6
0+3InaebNvpd5dJdLCbMpEYWuEu1e0Xzjw9/wSn8CeGP2hJPizpuj/ByXT5f iPdeNG1rUfgN
Y3njgX9xqkmrSRjxBPcvEsYu5GijcWAniswkUcqTol6vo/hP9jL/AIRf/hAP +Lkef/wg3xx8
X/ET/kD7ftv9uf8ACS/6D/rj5fkf8JD/AK75vM+x/wCrTzf3fLmFHw5p4WX1 Wq5zcWo6VY2/
d1HHmT5lKp7RU4zlFxptSvGnBRk3UHjHL3l+Xdfha/n5lHw9/wAFC/AmpeBJ Pjj4q+BvxH8O
fCuXwrdeJdI+K+o6VY3mk6lpMNjJqC3gg068udRtI5bKKSeM3tpbHISBwlzL DbyXrb9urwp4
X/t3/ho74K+OfhH/AGH4G1bxh/xWY0q++26LpXkf2ndQ/wBh3+oY+zfa7PdH J5ckn2lPJSbZ
L5fK+Hv2DPiy37Pcn7FHjz9pyxm+DVt8OLrwPpek+GPAQsPEM2ktpcmlW632 p3V5dwTyR20g
lZ7aytDJdQwuNkHm2kuF8N/+CU/gTSfDXxA8KeOdH+Dmg2vj34car4LvZfgL 8BrHwZcmw1JF
S5kmuZrnUZppEEaGFEeKBWaRporlvIMHTLDeGj9rz17LmsuRV3Jwv7rjKaUY 1LXdVThUhLRU
nTbbS5sZpp99t/l07bPvc5X9rT9vX9ofw1/wmdj4X+Gnjn4T6p4e/ZV+JvjS 30rxno2kXfm6
lpv9hjStQhurKe+s5vKa4v1a188uu5GuLcJLavJuftk/8FFfGnw9/wCCXOt/ tLfC3wh/ZnxS
1PQ9a0fSfC/9oRzf2D4n0y11B9bi+0zW5trr+yV0nWLjcyCG9/svy4S32mHf u/Fb9gX4/ftF
f8JRqf7QH7WWh3t9r/wO8Y/DawtPCnwxbTdN0yLXv7NJ1IQz6ldXMtxG1gRI jXPlSp5AjS2a
OaS53Pjh/wAE6vBfxh1/41eJ7Pxf/ZF98XvhVqXhOKf+z5Lj+xr3UrCHT9S1 PabhRcefa6Z4
dj+z4jWP+xN0bK15cs3q4XMPDSkstWKhTbozc6ns4VXGa9pG1KXPGM505KXN JtucYU5U4Pmm
mZuGMfPyt66K9u2+ml/wu79Cj+1P/wAFX/2Zf2PPizN8K/jPDfWC2FjBe6vr d34g0HTo7W2c
F2ngstR1K21LVY0jBJfTbS8WSRZLeIy3UM1vH1Wrft6/DXRvjRr/AMH7z4ae ORb+EvHOkeEv
FPjT+xoV0XTdS1a202XS4/NacS3P2mbVbW1220Uz28h33S21vJDcS4fxq/Yj +JXxIufir4L8
G/HTQ9F8A/HPf/ws7R9T8DTX+sHz9GtNDuv7L1BNRghst1hY2/l+fZ3fl3Bl lbzY2W3S9L+x
V4l13w14utfGfxesbjWPGnxj8FfELVr/AEvws9tbRXOhJ4ZEtrDBJdyusdy/ h1mVmlZoFvQp
84w7pfEp0/Dh4LDc8mqnJFVLOq/elKhzTt7NJSpxeIsoylBuNJtS96EtW8Zz O219NvPz66fj
6nVaR+178Ndb+C/gb4zWOh643/Cfa5pmi6V4U+zQnWrXUrm5EF1ZXFqJTsuN O2Xkt/CrM9pH
pl8zA/ZnFeq18yfs0/Bqw8d/tG69+0xpWieKtL+HkN9dan8PPC/jDRZ9JaHx DqMMUOt6rDpN
3BHNYRkWwEEsscF09zrHiWZllt9Rglk+m6+V4kweWZfi1Qwl7/FJPeDlqqT/ AL1ONoze/PzR
aXKbUZTnG8v+H8/n08gr5H/Yj+Pfx48ceJfgvrvxL+LV94ktfjx8AL34jalo uoaVp8Ft4Wv4
X8OstlpTWltDN9jI164Qi9kvJ9trbYmDCZpvrivnL4E/sR/Er4H/APCP/Zfj poeo/wDCsPhV
e+APgx5ngaaL+zdNn/s7bNrWNRP9r3C/2NpuWtv7NRsXXyL50f2fs4exOS0s sxdLGuCnK3Lz
Qcn/AA6y92ShJwtUlSlJ3i3GLXvfC5rRqucXH+tV+ly9+3d40/b28KWHhe3/ AGFvg1Y+Lrqa
+a88TLqOsWOmxxW1lPa3ptBdXUkhWTUIILvTI1SzlVZNQS5e6s1tMXHsfwxv vGmqfDXw9qfx
I077H4iudDtJdftPsUdt5F60KGdPJiuruOLEhYbEublVxgTzACRr2k2/iWG/ 1STXdWsbm1lv
lfRYbTTngktbbyIVaOd2mcXEhnWeQSKsSiOSOPyy0bSy3q8nFZnTq5VRwEaF KLptydWMZe0n
za2nKUrNQ+FKMYrS/vfE9IwaqOV3r06L0CvDv2sv+S9fsxf9lx1D/wBQTxZX uNeHftZf8l6/
Zi/7LjqH/qCeLK6OGv8AkYz/AOvOJ/8AUeqTX+BesfzR7jRRRXz5sFFFFABR RRQAV8xf8Ff/
ABP4b8E/sT/8Jn4z8Q2OkaPpHxi+GV7quq6ndpb21lbRePNAeWeWVyFjjRFZ mdiFVVJJAFfT
tFVGXLJS7EyjzRce58If8PNf+Cbn/SQb4H/+HY0f/wCSaP8Ah5r/AME3P+kg 3wP/APDsaP8A
/JNfd9fFf/BbDxP4l8e/sjfEv9mX4d+Ib7TpB8HPEvjL4hatpF28M2naHp9h cSWlmZYifJk1
LUY4YBFMnlXen2euorrJCK+24YjiOJM9oZcmqaqSSlNptQjfWVrq9ltG65pW indo+erZNRo0
nPmbsYn/AA81/wCCbn/SQb4H/wDh2NH/APkmj/h5r/wTc/6SDfA//wAOxo// AMk19NfshfEj
xp4z+Gt94B+Lus/2j4++G+uS+E/Hmo/Zo4f7SvbeGGe31Py4VEMP9oWFzYal 9nhLrbf2h9mZ
jJBIB6rXm5hjcVl2MnhqkYtxe6b5ZLdSi2leMlaUZW96LTWjLhklGcVJTf3I +EP+Hmv/AATc
/wCkg3wP/wDDsaP/APJNH/DzX/gm5/0kG+B//h2NH/8Akmvu+iuP+2qv8iK/ sGj/ADs+EP8A
h5r/AME3P+kg3wP/APDsaP8A/JNH/DzX/gm5/wBJBvgf/wCHY0f/AOSa+76K P7aq/wAiD+wa
P87PhD/h5r/wTc/6SDfA/wD8Oxo//wAk0f8ADzX/AIJuf9JBvgf/AOHY0f8A +Sa+n/2yfjX4
q+AP7PGseOvh5p+n3Piu/wBQ0rw34Ij1qJ304a/rOpWukaU98InST7Ct9fWz 3JiJlFuspjV3
Co3mH7LHgD/hib9o4fsWWHjXxB4m8MeN/h/J4y8Kap4l1L7bqUeq6S2maZ4i kvJQsUY+3S3+
kanujjZ7jUr7X7md0M0Ksf21V/kQf2DR/nZ5f/w81/4Juf8ASQb4H/8Ah2NH /wDkmj/h5r/w
Tc/6SDfA/wD8Oxo//wAk1930Uf21V/kQf2DR/nZ8If8ADzX/AIJuf9JBvgf/ AOHY0f8A+SaP
+Hmv/BNz/pIN8D//AA7Gj/8AyTX3fRR/bVX+RB/YNH+dnwh/w81/4Juf9JBv gf8A+HY0f/5J
o/4ea/8ABNz/AKSDfA//AMOxo/8A8k1930Uf21V/kQf2DR/nZ8If8PNf+Cbn /SQb4H/+HY0f
/wCSaP8Ah5r/AME3P+kg3wP/APDsaP8A/JNfd9FH9tVf5EH9g0f52fE3/BPD 46fBL9oL9v8A
+OfjP4C/GLwr430e2+Dvw5srnVfCHiG21K2iuV1Xxo7QNLbu6rIEkjYoTuCy KcYYZ0/2vf8A
gg1/wTP/AG0fiVY/F/4kfAz+w/EUeuRajr+o+CLw6V/wkiiaaeeDUI4h5cv2 iSdmmukWO9ba
gFyoUCvsait8n4r4i4czKWPyjFVMNVejlTnKDafR2auvJ+p6kcHR+rxozSkl 3Rw/7PP7NHwB
/ZO+Gtr8IP2bvhHofg3w7a7G/s7Q7FYvtEqwxwfaLiTmS5uGjhiV7iZnlk2A u7Hmu4oorxsX
i8Vj8TPEYmpKpUm7ylJuUpN7tt3bfmzpjGMVaKsgooornGFFFFABRRRQAUUU UAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFeAftya3N4
J8b/AAD+Kd14O8Vavo/hX4x3N74hbwh4N1LXbmytpfCHiSySdrXTYJ5zGbm7 toi4jKq0y7iA
c17/AEV6WU4+GW43204c0XGcGk+VuNSEoSs7Ss7SbTaava6a0IqQ5429Pwdz w7/h4V8Bf+hB
+OP/AIjF47/+U1H/AA8K+Av/AEIPxx/8Ri8d/wDymr3Giu76zwr/ANAtb/wf D/5mJtX/AJl9
z/zPDv8Ah4V8Bf8AoQfjj/4jF47/APlNR/w8K+Av/Qg/HH/xGLx3/wDKavca KPrPCv8A0C1v
/B8P/mYLV/5l9z/zPDv+HhXwF/6EH44/+IxeO/8A5TUf8PCvgL/0IPxx/wDE YvHf/wApq9xo
o+s8K/8AQLW/8Hw/+ZgtX/mX3P8AzPDv+HhXwF/6EH44/wDiMXjv/wCU1H/D wr4C/wDQg/HH
/wARi8d//KavcaKPrPCv/QLW/wDB8P8A5mC1f+Zfc/8AM8O/4eFfAX/oQfjj /wCIxeO//lNX
gH7W/wAY/gp4u/Zl/aWsvhZ8Nfj/AOIPHXxg+HGq6Zp9vqX7N/jQMkg0F7Cx 0q2mk0VBb2Yn
aa4WKSTy0udSvZty+e+PvCivSyrPshybGRxOHw1a6cW068LS5JxqJO2HTtzQ i3Zp6bkTpVak
bOS+5+ncw9P+G/gvS/iVq3xfsdG8vxFrmh6do+q6j9pkPn2VjNez2sXllvLX ZJqN425VDN52
GLBEC7lFFfI1a1WvLmqScnZK7d9IpJLXokkkuiSS0N0ktgooorMYUUUUAfMH 7U2p/tAW/wC2
T8PvFmn/ALGPxA+JHgL4eeH7vW9BuPAut+GYvM8WXqXOm+dOuraxp00P2LS3 volVRcQXX/CQ
OzCKXT4Wfy/4vftX/Hn9rz4Z6L8Uv2af+CZPxwl8V/DH4oXd94O1LVtf8C21 r/bOj3t9oms6
ZMW8SsY4rm3/ALZ0lrryLgQLeG8gimeGAn7vrwD/AIJp/wDJuviP/s4D4sf+ rD8Q0Ae/0UUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABR
RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRXyB4t/ZO/ZY/ag/4Km/FD/hpf9mn4f8AxE/s P9n/AOHf9if8
J14NsdX/ALP87XPG/neR9qik8rzPKi3bcbvKTOdox6B/w6d/4JZf9I0/2f8A /wAM3of/AMi0
Ae/0V4B/w6d/4JZf9I0/2f8A/wAM3of/AMi0f8Onf+CWX/SNP9n/AP8ADN6H /wDItAHv9FeA
f8Onf+CWX/SNP9n/AP8ADN6H/wDItH/Dp3/gll/0jT/Z/wD/AAzeh/8AyLQB 7/RXgH/Dp3/g
ll/0jT/Z/wD/AAzeh/8AyLR/w6d/4JZf9I0/2f8A/wAM3of/AMi0Ae/0V4B/ w6d/4JZf9I0/
2f8A/wAM3of/AMi0f8Onf+CWX/SNP9n/AP8ADN6H/wDItAHv9FeAf8Onf+CW X/SNP9n/AP8A
DN6H/wDItH/Dp3/gll/0jT/Z/wD/AAzeh/8AyLQB7/RXgH/Dp3/gll/0jT/Z /wD/AAzeh/8A
yLR/w6d/4JZf9I0/2f8A/wAM3of/AMi0Ae/0V4B/w6d/4JZf9I0/2f8A/wAM 3of/AMi0f8On
f+CWX/SNP9n/AP8ADN6H/wDItAHv9FeAf8Onf+CWX/SNP9n/AP8ADN6H/wDI tH/Dp3/gll/0
jT/Z/wD/AAzeh/8AyLQB7/RXgH/Dp3/gll/0jT/Z/wD/AAzeh/8AyLR/w6d/ 4JZf9I0/2f8A
/wAM3of/AMi0Ae/0V4B/w6d/4JZf9I0/2f8A/wAM3of/AMi0f8Onf+CWX/SN P9n/AP8ADN6H
/wDItAHv9FfCHgH/AIJk/wDBNu8/4KSfFjwLef8ABPn4Hy6Jp3wP+Ht/p+jS fCfR2tbW6udY
8aR3FxHEbbYksqWtqjuoDOttCGJEa49w/wCHTv8AwSy/6Rp/s/8A/hm9D/8A kWgD3+ivAP8A
h07/AMEsv+kaf7P/AP4ZvQ//AJFo/wCHTv8AwSy/6Rp/s/8A/hm9D/8AkWgD 3+ivAP8Ah07/
AMEsv+kaf7P/AP4ZvQ//AJFo/wCHTv8AwSy/6Rp/s/8A/hm9D/8AkWgD3+vA P+Caf/JuviP/
ALOA+LH/AKsPxDR/w6d/4JZf9I0/2f8A/wAM3of/AMi0f8Onf+CWX/SNP9n/ AP8ADN6H/wDI
tAHv9FeAf8Onf+CWX/SNP9n/AP8ADN6H/wDItH/Dp3/gll/0jT/Z/wD/AAze h/8AyLQB7/RX
gH/Dp3/gll/0jT/Z/wD/AAzeh/8AyLR/w6d/4JZf9I0/2f8A/wAM3of/AMi0 Ae/0V4B/w6d/
4JZf9I0/2f8A/wAM3of/AMi0f8Onf+CWX/SNP9n/AP8ADN6H/wDItAHv9FeA f8Onf+CWX/SN
P9n/AP8ADN6H/wDItH/Dp3/gll/0jT/Z/wD/AAzeh/8AyLQB7/RXgH/Dp3/g ll/0jT/Z/wD/
AAzeh/8AyLR/w6d/4JZf9I0/2f8A/wAM3of/AMi0Ae/0V4B/w6d/4JZf9I0/ 2f8A/wAM3of/
AMi0f8Onf+CWX/SNP9n/AP8ADN6H/wDItAHv9FeAf8Onf+CWX/SNP9n/AP8A DN6H/wDItH/D
p3/gll/0jT/Z/wD/AAzeh/8AyLQB7/RXwh4B/wCCZP8AwTbvP+CknxY8C3n/ AAT5+B8uiad8
D/h7f6fo0nwn0drW1urnWPGkdxcRxG22JLKlrao7qAzrbQhiRGuPcP8Ah07/ AMEsv+kaf7P/
AP4ZvQ//AJFoA9/orwD/AIdO/wDBLL/pGn+z/wD+Gb0P/wCRaP8Ah07/AMEs v+kaf7P/AP4Z
vQ//AJFoA9/orwD/AIdO/wDBLL/pGn+z/wD+Gb0P/wCRaP8Ah07/AMEsv+ka f7P/AP4ZvQ//
AJFoA9/orwD/AIdO/wDBLL/pGn+z/wD+Gb0P/wCRaP8Ah07/AMEsv+kaf7P/ AP4ZvQ//AJFo
A9/orwD/AIdO/wDBLL/pGn+z/wD+Gb0P/wCRaP8Ah07/AMEsv+kaf7P/AP4Z vQ//AJFoA9/o
rwD/AIdO/wDBLL/pGn+z/wD+Gb0P/wCRaP8Ah07/AMEsv+kaf7P/AP4ZvQ// AJFoA9/orwD/
AIdO/wDBLL/pGn+z/wD+Gb0P/wCRaP8Ah07/AMEsv+kaf7P/AP4ZvQ//AJFo A9/orwD/AIdO
/wDBLL/pGn+z/wD+Gb0P/wCRaP8Ah07/AMEsv+kaf7P/AP4ZvQ//AJFoA9/o rwD/AIdO/wDB
LL/pGn+z/wD+Gb0P/wCRaP8Ah07/AMEsv+kaf7P/AP4ZvQ//AJFoA9/orwD/ AIdO/wDBLL/p
Gn+z/wD+Gb0P/wCRaP8Ah07/AMEsv+kaf7P/AP4ZvQ//AJFoA9/orwD/AIdO /wDBLL/pGn+z
/wD+Gb0P/wCRaP8Ah07/AMEsv+kaf7P/AP4ZvQ//AJFoA9/or5w/4JT+E/Cv gL9kvUPAvgXw
zp+i6Jovxw+KVho2jaTZJbWthaw+P/EEcVvDFGAkUSIqoqKAqqoAAAr6PoAK KKKACiiigAoo
ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPAPh z/ylN+Mn/Zv/
AMNP/T547r3+vAPhz/ylN+Mn/Zv/AMNP/T547r3+gAooooAKKKKACiiigAoo ooAKKKKACiii
gAooooAKKKKACiiigAooooA8A+HP/KU34yf9m/8Aw0/9Pnjuvf68A+HP/KU3 4yf9m/8Aw0/9
Pnjuvf6ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gDwD4c/8pTfj
J/2b/wDDT/0+eO69/rwD4c/8pTfjJ/2b/wDDT/0+eO69/oAKKKKACiiigAoo ooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKAPAP+Caf/ACbr4j/7OA+LH/qw/ENe/wBe Af8ABNP/AJN1
8R/9nAfFj/1YfiGvf6ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo oAKKKKACiiig
AooooAKKKKACiiigDwD4c/8AKU34yf8AZv8A8NP/AE+eO69/rwD4c/8AKU34 yf8AZv8A8NP/
AE+eO69/oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKAPAPhz/wAp
TfjJ/wBm/wDw0/8AT547r3+vAPhz/wApTfjJ/wBm/wDw0/8AT547r3+gAooo oAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooooA8A+HP/AClN+Mn/AGb/APDT /wBPnjuvf68A
+HP/AClN+Mn/AGb/APDT/wBPnjuvf6ACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooo
oAKKKKACiiigDwD/AIJp/wDJuviP/s4D4sf+rD8Q17/XgH/BNP8A5N18R/8A ZwHxY/8AVh+I
a9/oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKK
KAPAPhz/AMpTfjJ/2b/8NP8A0+eO69/rwD4c/wDKU34yf9m//DT/ANPnjuvf 6ACiiigAoooo
AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDwD4c/wDKU34yf9m/ /DT/ANPnjuvf
68A+HP8AylN+Mn/Zv/w0/wDT547r3+gAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKK
KACiiigAooooA8A+HP8AylN+Mn/Zv/w0/wDT547r3+vAPhz/AMpTfjJ/2b/8 NP8A0+eO69/o
AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPAP+Ca f/JuviP/ALOA
+LH/AKsPxDXv9eAf8E0/+TdfEf8A2cB8WP8A1YfiGvf6ACiiigAooooAKKKK ACiiigAooooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDwD4c/8pTfjJ/2b/8A DT/0+eO69/rw
D4c/8pTfjJ/2b/8ADT/0+eO69/oAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAo
oooAKKKKAPAPhz/ylN+Mn/Zv/wANP/T547r3+vAPhz/ylN+Mn/Zv/wANP/T5 47r3+gAooooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA8A+HP/KU34yf 9m//AA0/9Pnj
uvf68A+HP/KU34yf9m//AA0/9Pnjuvf6ACiiigAooooAKKKKACiiigAooooA KKKKACiiigAo
oooAKKKKACiiigDwD/gmn/ybr4j/AOzgPix/6sPxDXv9eAf8E0/+TdfEf/Zw HxY/9WH4hr3+
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooA8
A+HP/KU34yf9m/8Aw0/9Pnjuvf68A+HP/KU34yf9m/8Aw0/9Pnjuvf6ACiii gAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigDwD4c/8pTfjJ/2b/wDDT/0+ eO69/rwD4c/8
pTfjJ/2b/wDDT/0+eO69/oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAK
KKKAPAPhz/ylN+Mn/Zv/AMNP/T547r3+vAPhz/ylN+Mn/Zv/AMNP/T547r3+ gAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA8A/4Jp/8AJuviP/s4 D4sf+rD8Q17/
AF4B/wAE0/8Ak3XxH/2cB8WP/Vh+Ia9/oAKKKKACiiigAooooAKKKKACiiig AooooAKKKKAC
iiigAooooAKKKKACiiigAooooAKKKKAPAPhz/wApTfjJ/wBm/wDw0/8AT547 r3+vAPhz/wAp
TfjJ/wBm/wDw0/8AT547r3+gAooooAKKKKACiiigAooooAKKKKACiiigAooo oAKKKKACiiig
AooooA8A+HP/AClN+Mn/AGb/APDT/wBPnjuvf68A+HP/AClN+Mn/AGb/APDT /wBPnjuvf6AC
iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDwD4c/8A KU34yf8AZv8A
8NP/AE+eO69/rwD4c/8AKU34yf8AZv8A8NP/AE+eO69/oAKKKKACiiigAooo oAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKAPAP8Agmn/AMm6+I/+zgPix/6sPxDXv9eA f8E0/wDk3XxH
/wBnAfFj/wBWH4hr3+gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAoooo
AKKKKACiiigAooooA8A+HP8AylN+Mn/Zv/w0/wDT547r3+vAPhz/AMpTfjJ/ 2b/8NP8A0+eO
69/oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPA Phz/AMpTfjJ/
2b/8NP8A0+eO69/rwD4c/wDKU34yf9m//DT/ANPnjuvf6ACiiigAooooAKKK KACiiigAoooo
AKKKKACiiigAooooAKKKKACiiigDwD4c/wDKU34yf9m//DT/ANPnjuvf68A+ HP8AylN+Mn/Z
v/w0/wDT547r3+gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooA8A/
4Jp/8m6+I/8As4D4sf8Aqw/ENe/14B/wTT/5N18R/wDZwHxY/wDVh+Ia9/oA KKKKACiiigAo
oooAKKKKACiiigAooooAKKKKACiiigArwD/h7F/wSy/6SWfs/wD/AIeTQ/8A 5Kr3+vhD/gmV
/wAo3P2fP+yH+E//AEz2tduCwf1ybjzWt5XODH476jCMuW9/O36M9w/4exf8 Esv+kln7P/8A
4eTQ/wD5Ko/4exf8Esv+kln7P/8A4eTQ/wD5KpKK9H+xP+nn4f8ABPM/t/8A 6d/j/wAAX/h7
F/wSy/6SWfs//wDh5ND/APkqj/h7F/wSy/6SWfs//wDh5ND/APkqkoo/sT/p 5+H/AAQ/t/8A
6d/j/wAAX/h7F/wSy/6SWfs//wDh5ND/APkqj/h7F/wSy/6SWfs//wDh5ND/ APkqkrgPit8W
PFOh+L9E+Dnwi8Hp4h8a+JFkksbKefy7axtkzuu7lhyIweFUYLlW+ZQrMOfE 5bRwdF1atWyX
l9yWurYf2/8A9Ovx/wCAegf8PYv+CWX/AEks/Z//APDyaH/8lUf8PYv+CWX/ AEks/Z//APDy
aH/8lV4vd/GT48fBq/0nVP2hdG8H6h4W1rVxpn/CUeB78tFpV0TgLco80uUy VDMGUx/eKldx
Tr/2ifjL/wAKG+Fsvj238N/2vfXGuaPoWi6a959min1LVdTtdLslnmCSGC3+ 1XkJmlWOV44h
I6RTMqxPhgsNhMfTlOlV+HdONmvlfr0HHPZOfI6LT7N2326HEeAf+Cm3/BNu z/4KSfFjx1ef
8FBvgfFomo/A/wCHthp+syfFjR1tbq6ttY8aSXFvHKbnY8sSXVq7opLItzCW AEi59w/4exf8
Esv+kln7P/8A4eTQ/wD5Krxzwh8fPjb4W8SXmlftb/Brwr4H0eHwrqGvr408 MePbnWNE0+2s
HtxdJqd5e6Zpy2EhS6SWEfvVlitb12aIW48zc+Pn7Rnhv4J6PHJapY6zrA8V eENKvtAj1dIr
mzttf8QW+iwX0iBXZYw8lxImVCzNZyxh1IZk7P7Hja/tP/Jf+CV/bc+ZL2W/ 97/gHo//AA9i
/wCCWX/SSz9n/wD8PJof/wAlUf8AD2L/AIJZf9JLP2f/APw8mh//ACVXnGk/ tQfDD4k/CfU/
i3+y9qtj8aLXTL5bJrH4W+KdHvZJrnMReBZ572G0SSOOZJmSSdG8vBAZmRWv fsyfGX/hoz9m
34e/tCf8I3/Y3/Cd+B9J8Rf2R9s+0fYfttnFc+R5uxPN2ebt37F3bc7VzgNZ PFuyqfh/wRPP
JJXdL/yb/gHc/wDD2L/gll/0ks/Z/wD/AA8mh/8AyVR/w9i/4JZf9JLP2f8A /wAPJof/AMlU
lFV/Yn/Tz8P+CT/b/wD07/H/AIAv/D2L/gll/wBJLP2f/wDw8mh//JVH/D2L /gll/wBJLP2f
/wDw8mh//JVJRR/Yn/Tz8P8Agh/b/wD07/H/AIAv/D2L/gll/wBJLP2f/wDw 8mh//JVb/wAL
f+ChP7Avxx8d2Pwt+Cn7cPwf8YeJ9U83+zPDnhb4l6VqF/d+XE80nlW8Fw8k myKOSRtqnaqM
xwATXP15h8Xf+TtP2Vv+y4ap/wCoB4urHEZT7CjKpz3t5f8ABNsPnP1ivGn7 O1/P/gH2fRRR
XjnuBXgH/D2L/gll/wBJLP2f/wDw8mh//JVe/wBfCH/BMr/lG5+z5/2Q/wAJ /wDpnta7cFg/
rk3HmtbyucGPx31GEZct7+dv0Z7h/wAPYv8Agll/0ks/Z/8A/DyaH/8AJVH/ AA9i/wCCWX/S
Sz9n/wD8PJof/wAlUlFej/Yn/Tz8P+CeZ/b/AP07/H/gC/8AD2L/AIJZf9JL P2f/APw8mh//
ACVR/wAPYv8Agll/0ks/Z/8A/DyaH/8AJVJRR/Yn/Tz8P+CH9v8A/Tv8f+AL /wAPYv8Agll/
0ks/Z/8A/DyaH/8AJVH/AA9i/wCCWX/SSz9n/wD8PJof/wAlUlcB8Vvix4p0 Pxfonwc+EXg9
PEPjXxIskljZTz+XbWNsmd13csORGDwqjBcq3zKFZhz4nLaODourVq2S8vuS 11bD+3/+nX4/
8A9A/wCHsX/BLL/pJZ+z/wD+Hk0P/wCSqP8Ah7F/wSy/6SWfs/8A/h5ND/8A kqvF7v4yfHj4
NX+k6p+0Lo3g/UPC2tauNM/4SjwPflotKuicBblHmlymSoZgymP7xUruKdf+ 0T8Zf+FDfC2X
x7b+G/7XvrjXNH0LRdNe8+zRT6lqup2ul2SzzBJDBb/aryEzSrHK8cQkdIpm VYnwwWGwmPpy
nSq/DunGzXyv16DjnsnPkdFp9m7b7dDiPAP/AAU2/wCCbdn/AMFJPix46vP+ Cg3wPi0TUfgf
8PbDT9Zk+LGjra3V1bax40kuLeOU3Ox5YkurV3RSWRbmEsAJFz7h/wAPYv8A gll/0ks/Z/8A
/DyaH/8AJVeOeEPj58bfC3iS80r9rf4NeFfA+jw+FdQ19fGnhjx7c6xomn21 g9uLpNTvL3TN
OWwkKXSSwj96ssVreuzRC3Hmbnx8/aM8N/BPR45LVLHWdYHirwhpV9oEerpF c2dtr/iC30WC
+kQK7LGHkuJEyoWZrOWMOpDMnZ/Y8bX9p/5L/wAEr+258yXst/73/APR/wDh 7F/wSy/6SWfs
/wD/AIeTQ/8A5Ko/4exf8Esv+kln7P8A/wCHk0P/AOSq8qu/2svht43+DGof Fr9lLXtD+MPk
65Z6FZReA/EUOoWg1K6uba3Rbq5sxP8AZbeH7XDcXUoSR7e1Ekwik2hGvfs7 fG3xJ8XYfFvh
v4g+BrHw94s8BeKl0DxVp2ja4+p6d9pk02x1OJ7S7kt7aWeM2mpWu4yW8LLM JkCuiJLILJ4N
pKpv5f8ABD+25pN+y2/vf8A9H/4exf8ABLL/AKSWfs//APh5ND/+SqP+HsX/ AASy/wCkln7P
/wD4eTQ//kqkoq/7E/6efh/wSP7f/wCnf4/8AX/h7F/wSy/6SWfs/wD/AIeT Q/8A5Ko/4exf
8Esv+kln7P8A/wCHk0P/AOSqSij+xP8Ap5+H/BD+3/8Ap3+P/AF/4exf8Esv +kln7P8A/wCH
k0P/AOSq3/hb/wAFCf2Bfjj47sfhb8FP24fg/wCMPE+qeb/Znhzwt8S9K1C/ u/LieaTyreC4
eSTZFHJI21TtVGY4AJrn68w+Lv8Aydp+yt/2XDVP/UA8XVjiMp9hRlU5728v +CbYfOfrFeNP
2dr+f/APs+iiivHPcCvAP+HsX/BLL/pJZ+z/AP8Ah5ND/wDkqvf6+EP+CZX/ ACjc/Z8/7If4
T/8ATPa124LB/XJuPNa3lc4MfjvqMIy5b387foz3D/h7F/wSy/6SWfs//wDh 5ND/APkqj/h7
F/wSy/6SWfs//wDh5ND/APkqkor0f7E/6efh/wAE8z+3/wDp3+P/AABf+HsX /BLL/pJZ+z//
AOHk0P8A+SqP+HsX/BLL/pJZ+z//AOHk0P8A+SqSij+xP+nn4f8ABD+3/wDp 3+P/AABf+HsX
/BLL/pJZ+z//AOHk0P8A+SqP+HsX/BLL/pJZ+z//AOHk0P8A+SqSuA+K3xY8 U6H4v0T4OfCL
weniHxr4kWSSxsp5/LtrG2TO67uWHIjB4VRguVb5lCsw58TltHB0XVq1bJeX 3Ja6th/b/wD0
6/H/AIB6B/w9i/4JZf8ASSz9n/8A8PJof/yVR/w9i/4JZf8ASSz9n/8A8PJo f/yVXi938ZPj
x8Gr/SdU/aF0bwfqHhbWtXGmf8JR4Hvy0WlXROAtyjzS5TJUMwZTH94qV3FO v/aJ+Mv/AAob
4Wy+Pbfw3/a99ca5o+haLpr3n2aKfUtV1O10uyWeYJIYLf7VeQmaVY5XjiEj pFMyrE+GCw2E
x9OU6VX4d042a+V+vQcc9k58jotPs3bfbocR4B/4Kbf8E27P/gpJ8WPHV5/w UG+B8Wiaj8D/
AIe2Gn6zJ8WNHW1urq21jxpJcW8cpudjyxJdWruiksi3MJYASLn3D/h7F/wS y/6SWfs//wDh
5ND/APkqvHPCHx8+NvhbxJeaV+1v8GvCvgfR4fCuoa+vjTwx49udY0TT7awe 3F0mp3l7pmnL
YSFLpJYR+9WWK1vXZohbjzNz4+ftGeG/gno8clqljrOsDxV4Q0q+0CPV0iub O21/xBb6LBfS
IFdljDyXEiZULM1nLGHUhmTs/seNr+0/8l/4JX9tz5kvZb/3v+Aej/8AD2L/ AIJZf9JLP2f/
APw8mh//ACVR/wAPYv8Agll/0ks/Z/8A/DyaH/8AJVecaT+0l4F+Lvwn1P4k fsg+JvCvxdkt
L5dNtE8J+NbKWx+3MYgUub2JpVt44knjnm2rLOsGWignkMcMh+zt8bfEnxdh 8W+G/iD4GsfD
3izwF4qXQPFWnaNrj6np32mTTbHU4ntLuS3tpZ4zaala7jJbwsswmQK6Iksj /seLaXtN/L/g
h/bckm/Zbf3v0sej/wDD2L/gll/0ks/Z/wD/AA8mh/8AyVR/w9i/4JZf9JLP 2f8A/wAPJof/
AMlUlFV/Yn/Tz8P+CR/b/wD07/H/AIAv/D2L/gll/wBJLP2f/wDw8mh//JVH /D2L/gll/wBJ
LP2f/wDw8mh//JVJRR/Yn/Tz8P8Agh/b/wD07/H/AIAv/D2L/gll/wBJLP2f /wDw8mh//JVb
/wALf+ChP7Avxx8d2Pwt+Cn7cPwf8YeJ9U83+zPDnhb4l6VqF/d+XE80nlW8 Fw8kmyKOSRtq
naqMxwATXP15h8Xf+TtP2Vv+y4ap/wCoB4urHEZT7CjKpz3t5f8ABNsPnP1i vGn7O1/P/gH2
fRRRXjnuHP8AxS+LHws+B3gS++KXxr+Jfh/wf4Y0vyv7T8R+KdZg0+wtPMlS GPzbid0jj3yy
RxruYbmdVGSQK8g/4exf8Esv+kln7P8A/wCHk0P/AOSqz/8Agqx/yaXp/wD2 XD4W/wDqf+H6
v16OCwH1yDlzWt5X/U8zH5j9RnGPLe/nb9GL/wAPYv8Agll/0ks/Z/8A/Dya H/8AJVH/AA9i
/wCCWX/SSz9n/wD8PJof/wAlUlFdv9if9PPw/wCCcH9v/wDTv8f+AL/w9i/4 JZf9JLP2f/8A
w8mh/wDyVR/w9i/4JZf9JLP2f/8Aw8mh/wDyVSUUf2J/08/D/gh/b/8A07/H /gC/8PYv+CWX
/SSz9n//AMPJof8A8lUf8PYv+CWX/SSz9n//AMPJof8A8lUleUeIPi38X/Hv jPxB4K/Z08P+
HvsvhAIvifxh4vuymm21w3/LsgWSMu65G5i4CsCgDEMV48bgsNgKXPWq76K0 bt+iuH9vttJU
rt9E/wDgHrH/AA9i/wCCWX/SSz9n/wD8PJof/wAlUf8AD2L/AIJZf9JLP2f/ APw8mh//ACVX
mHw8+MPxCsfiefgV8fPC2m6Z4in0saloeq6HdiXTtZtup8rLM0cirhthZgy5 YN8rqsPx0+On
xJ8F/Enwv8D/AIH/AAw0PxP4w8T6Hq2uxReK/Fs2iabBpumzafb3LG5t7G+l NwZtVsxHEINj
IJ2aVDGiSvC4HDYyh7alVutvh1T7NXvccc9lKXL7LXzdret0Yn/BPn/gpt/w Tb8F/AbX9H8Y
/wDBQb4H6TdzfHD4m38NrqfxY0eCR7W68da7dWtwFe5BMU1vNFNG4+V45UdS VYE+4f8AD2L/
AIJZf9JLP2f/APw8mh//ACVXnHwi+NviTxBDP4b+PXgax8CeLLfxU2gW2nJr j3ena9c/2amp
q+j3dxb2kuoxi0aTzCLeNkmsb5NrJbGVsP4i/ts/BL4W/E/RPC/jPx/4V03w nqPhXxNquq+P
tT8W21tp2k3Ojaxo+ky2Msj4iEjXerNC26RWimtTEUZ3wnR/ZEFG7qfh/wAE pZ3NysqX/k3/
AAD2P/h7F/wSy/6SWfs//wDh5ND/APkqj/h7F/wSy/6SWfs//wDh5ND/APkq uG+IX7Qnw28B
fBi3+O1pqf8Awkeh6p/Zkfhp/DE0N1/b1xqdzBa6ZDaSmRYG+1XF1bRRzPKk A89XkljiDSKf
syfGX/hoz9m34e/tCf8ACN/2N/wnfgfSfEX9kfbPtH2H7bZxXPkebsTzdnm7 d+xd23O1c4D/
ALGjzcvtNd9v+CL+3JcvN7LTbf8A4B3P/D2L/gll/wBJLP2f/wDw8mh//JVH /D2L/gll/wBJ
LP2f/wDw8mh//JVJRVf2J/08/D/gk/2//wBO/wAf+AL/AMPYv+CWX/SSz9n/ AP8ADyaH/wDJ
VH/D2L/gll/0ks/Z/wD/AA8mh/8AyVSUUf2J/wBPPw/4If2//wBO/wAf+AL/ AMPYv+CWX/SS
z9n/AP8ADyaH/wDJVd/8C/2sf2WP2oP7U/4Zo/aW+H/xE/sPyP7b/wCEF8ZW Or/2f53meT5/
2WWTyvM8qXbuxu8p8Z2nHn9ch+yb/wApI/jZ/wBkP+G//p48b1zYvLPqtH2n Pf5f8E68Fmv1
yv7Pkt87/ofV9FFFeUeuFFFFABRRRQAUUUUAFfCH/BMr/lG5+z5/2Q/wn/6Z 7Wvu+vyw/Yx/
Zc+Anin/AIJ8/A74ufFD4l/EfQxP8D/Bv26bS/j94p0DTINuiWMKbbay1SC1 gzhAdiLvdix3
O7E+vlM1TlOTskldtuyS73PEzqKnCnHXV9Fc+z6K+ZdO/Zw/YW1jUINJ0n9q L4i3V1dTLDbW
1t+154xeSaRiFVFVdcJZiSAAOSTXV/8ADvn4Df8AQ/fHD/xJvx1/8ua9uhiq eJTdGUZJdpX/
ACR89UoexdqikvWNv1Pb6K8Q/wCHfPwG/wCh++OH/iTfjr/5c1R8T/sP/sxe CfDeoeM/Gfxe
+MWkaPpFjLe6rqup/tTeN7e2sraJC8s8sr60FjjRFZmdiFVVJJAFbXq9l9// AADPlpPq/u/4
J77Xz5+0MfFXwJ/aj8J/tjWvhHVfEPhmy8NXXh7xfp+jOfPs7aQylboL3Uec 5Z+NnlrkgMWX
U/4d8/Ab/ofvjh/4k346/wDlzR/w75+A3/Q/fHD/AMSb8df/AC5rizDBzx+G dJ6bNO+zWq0t
qTKFJtNSaaaadlo079z5Q0T9nv4D/GNNO+FX7L+p/EfxPqN34jE+v+MPENwb ay0fSSuDC0cc
skbygZYMSrSMNqqBkp9zftH6d401f4MazpPgf4b6H4ymuvs8Or+EPEMEctvr mjtcxLqliiTS
RwvcTWBu4oFuHS3M7xCdlh8wjzrw9+w/+zF4usJNV8KfF74xanaxX11ZS3On /tTeN5o0ubae
S3uICya0QJIp4pYpE+8kkbowDKQDw9+w/wDsxeLrCTVfCnxe+MWp2sV9dWUt zp/7U3jeaNLm
2nkt7iAsmtECSKeKWKRPvJJG6MAykDiyjKP7KpzUWm52u1potrKz7vW5GHw+ Hw8nJb6bRstP
+3m/xueO337KnxS+KPw2+KvwX/Z+/Zm1z4CeCvGfwP8AFHhmTwT418Q6YdFm 1/UIYYdLutNs
NGv9Rt9Jt4VOqNefZ47U3El/FK0V5IpeGj+0P8Bf2qv2qtT+KXjPVf2M7G20 /wAU2PwhsvD/
AIH8f+LtLkXWLbQ/Guoalq0GrfZTeQWsf2e4LMkRvVktpIyoknaWyh9+/wCH fPwG/wCh++OH
/iTfjr/5c0f8O+fgN/0P3xw/8Sb8df8Ay5r03Qk1b9fJr+XzO5YiKd/080/5 vIP2e9D+KXjD
9pLx9+0v49+DOueALHX/AAP4Y8M6b4d8V6hpk+pPLpl5rt1NdH+y7u8t1t3X WII48z+aXgn3
RIoieXb/AGF/hv40+Dn7Evwd+EXxH0b+zvEXhX4V+HtH17T/ALRHN9lvbbTb eGeLzImZH2yI
y7kZlOMgkEGsT/h3z8Bv+h++OH/iTfjr/wCXNH/Dvn4Df9D98cP/ABJvx1/8 ua0jCpFp279e
+vYylOnK+r6dOyt3Pb6K8Q/4d8/Ab/ofvjh/4k346/8AlzR/w75+A3/Q/fHD /wASb8df/Lmr
vV7L7/8AgGdqPd/d/wAE9vorxD/h3z8Bv+h++OH/AIk346/+XNH/AA75+A3/ AEP3xw/8Sb8d
f/Lmi9Xsvv8A+AFqPd/d/wAE9vrzD4u/8nafsrf9lw1T/wBQDxdXP/8ADvn4 Df8AQ/fHD/xJ
vx1/8uax7f8AZ88B/Aj9rT9mj/hCNf8AHF9/avxwvvtX/CZ/E3XfEezyvAHj Lb5P9rXtz9nz
5jbvK2b8Jv3bE28uOdT6pO6W3f8A4B2YBU/rkLN79v8Agn6D0UUV8ifaBXwh /wAEyv8AlG5+
z5/2Q/wn/wCme1r7vr8sP2Mf2XPgJ4p/4J8/A74ufFD4l/EfQxP8D/Bv26bS /j94p0DTINui
WMKbbay1SC1gzhAdiLvdix3O7E+vlM1TlOTskldtuyS73PEzqKnCnHXV9Fc+ z6K+ZdO/Zw/Y
W1jUINJ0n9qL4i3V1dTLDbW1t+154xeSaRiFVFVdcJZiSAAOSTXV/wDDvn4D f9D98cP/ABJv
x1/8ua9uhiqeJTdGUZJdpX/JHz1Sh7F2qKS9Y2/U9vorwLw9+w/+zF4usJNV 8KfF74xanaxX
11ZS3On/ALU3jeaNLm2nkt7iAsmtECSKeKWKRPvJJG6MAykA8Q/sP/sxeEbC PVfFfxe+MWmW
st9a2UVzqH7U3jeGN7m5njt7eAM+tAGSWeWKKNPvPJIiKCzAHbmqWvZff/wC OWle1393/BPf
a+fP2hj4q+BP7UfhP9sa18I6r4h8M2Xhq68PeL9P0Zz59nbSGUrdBe6jznLP xs8tckBiyzeI
f2H/ANmLwjYR6r4r+L3xi0y1lvrWyiudQ/am8bwxvc3M8dvbwBn1oAySzyxR Rp955JERQWYA
3v8Ah3z8Bv8Aofvjh/4k346/+XNcWYYOWPwzovR6NO+zW2ltSZQpuzUmmmmn ZbrXufKGifs9
/Af4xpp3wq/Zf1P4j+J9Ru/EYn1/xh4huDbWWj6SVwYWjjlkjeUDLBiVaRht VQMlPub9o/Tv
Gmr/AAY1nSfA/wAN9D8ZTXX2eHV/CHiGCOW31zR2uYl1SxRJpI4XuJrA3cUC 3Dpbmd4hOyw+
YRxH/Dvn4Df9D98cP/Em/HX/AMuaP+HfPwG/6H744f8AiTfjr/5c1x5Tk/8A ZVOaTTcrXe22
2ln3fUyw9DD4eXMt9No2Wn/bzf43PD779lT4pfFH4bfFX4L/ALP37M2ufATw V4z+B/ijwzJ4
J8a+IdMOiza/qEMMOl3Wm2GjX+o2+k28KnVGvPs8dqbiS/ilaK8kUvDR/aH+ Av7VX7VWp/FL
xnqv7Gdjbaf4psfhDZeH/A/j/wAXaXIusW2h+NdQ1LVoNW+ym8gtY/s9wWZI jerJbSRlRJO0
tlD79/w75+A3/Q/fHD/xJvx1/wDLmj/h3z8Bv+h++OH/AIk346/+XNek6Emr fr5Nfy+Z3rER
Tv8Ap5p/zeR5z4sh/bI1bXPin+1F8Kv2cvFXhfXvEXhXwN4R0fwlquqeHJfE ItrHXNVm1fUr
TbqE+lCRNP1t3tBdXBVrqycT25i2LP7f+y1DDpvwnh8OWX7OXir4YWumX00V voXjLVNNvb68
ZyJ5tQkuLDUL8XEk880zyzzzm5mn86WXc0nmPy3/AA75+A3/AEP3xw/8Sb8d f/Lmj/h3z8Bv
+h++OH/iTfjr/wCXNXGFWMr/AK/P+UznUpTjb9PK38x7fRXiH/Dvn4Df9D98 cP8AxJvx1/8A
Lmj/AId8/Ab/AKH744f+JN+Ov/lzWl6vZff/AMAytR7v7v8Agnt9FeIf8O+f gN/0P3xw/wDE
m/HX/wAuaP8Ah3z8Bv8Aofvjh/4k346/+XNF6vZff/wAtR7v7v8Agnt9eYfF 3/k7T9lb/suG
qf8AqAeLq5//AId8/Ab/AKH744f+JN+Ov/lzWPb/ALPngP4Eftafs0f8IRr/ AI4vv7V+OF99
q/4TP4m674j2eV4A8ZbfJ/ta9ufs+fMbd5WzfhN+7Ym3lxzqfVJ3S27/APAO zAKn9chZvft/
wT9B6KKK+RPtAr4Q/wCCZX/KNz9nz/sh/hP/ANM9rX3fX5YfsY/sufATxT/w T5+B3xc+KHxL
+I+hif4H+Dft02l/H7xToGmQbdEsYU221lqkFrBnCA7EXe7Fjud2J9fKZqnK cnZJK7bdkl3u
eJnUVOFOOur6K59n0V8y6d+zh+wtrGoQaTpP7UXxFurq6mWG2trb9rzxi8k0 jEKqKq64SzEk
AAckmur/AOHfPwG/6H744f8AiTfjr/5c17dDFU8Sm6MoyS7Sv+SPnqlD2LtU Ul6xt+p7fRXi
H/Dvn4Df9D98cP8AxJvx1/8ALmqPif8AYf8A2YvBPhvUPGfjP4vfGLSNH0ix lvdV1XU/2pvG
9vbWVtEheWeWV9aCxxoiszOxCqqkkgCtr1ey+/8A4Bny0n1f3f8ABPfa+fP2 hj4q+BP7UfhP
9sa18I6r4h8M2Xhq68PeL9P0Zz59nbSGUrdBe6jznLPxs8tckBiy6n/Dvn4D f9D98cP/ABJv
x1/8uaP+HfPwG/6H744f+JN+Ov8A5c1xZhg54/DOk9NmnfZrVaW1JlCk2mpN NNNOy0ad+58o
aJ+z38B/jGmnfCr9l/U/iP4n1G78RifX/GHiG4NtZaPpJXBhaOOWSN5QMsGJ VpGG1VAyU+5v
2j9O8aav8GNZ0nwP8N9D8ZTXX2eHV/CHiGCOW31zR2uYl1SxRJpI4XuJrA3c UC3Dpbmd4hOy
w+YR514e/Yf/AGYvF1hJqvhT4vfGLU7WK+urKW50/wDam8bzRpc208lvcQFk 1ogSRTxSxSJ9
5JI3RgGUgUdG/ZG/Y98R6rBoPh74/wDxUv766/tL7NZWX7WPjSWWb+zrpLPU NqLrZLfZrqSO
3nwP3MrrG+1iBXFlOULKqc0mm52u9tFtZWffuRh8PQw8nJb6bRstP+3m+/W5 5XffsqfFL4o/
Db4q/Bf9n79mbXPgJ4K8Z/A/xR4Zk8E+NfEOmHRZtf1CGGHS7rTbDRr/AFG3 0m3hU6o159nj
tTcSX8UrRXkil4aP7Q/wF/aq/aq1P4peM9V/YzsbbT/FNj8IbLw/4H8f+LtL kXWLbQ/Guoal
q0GrfZTeQWsf2e4LMkRvVktpIyoknaWyh9wuP2H/ANmK08SWngy6+L3xii1i /sbi9sdKk/am
8brc3NtbvCk88cR1rc8cb3NuruAVRriIEguub3/Dvn4Df9D98cP/ABJvx1/8 ua9L2Emrfr5f
4fM7liIp3/TzT/m8jD8Bt+0LcfF74lftbp+y5rmkTap4H8KeHdJ+H3ijxJpE Wsah/ZWoa3d3
s8Uljd3lku+DWES2Sa5i824tnjna0hZbo7n7DHwn174U+FPGgf4Pf8K28Ma9 44OpeA/hhmwT
/hFNNGladay23kabNNY23nahbahfeXayyI32/wA1ys8syIf8O+fgN/0P3xw/ 8Sb8df8Ay5o/
4d8/Ab/ofvjh/wCJN+Ov/lzWihUTT7eff5GcqlKSavvbp2/7ePb6K8Q/4d8/ Ab/ofvjh/wCJ
N+Ov/lzR/wAO+fgN/wBD98cP/Em/HX/y5rS9Xsvv/wCAZWo9393/AAT2+ivE P+HfPwG/6H74
4f8AiTfjr/5c0f8ADvn4Df8AQ/fHD/xJvx1/8uaL1ey+/wD4AWo9393/AAT2 +vMPi7/ydp+y
t/2XDVP/AFAPF1c//wAO+fgN/wBD98cP/Em/HX/y5rHt/wBnzwH8CP2tP2aP +EI1/wAcX39q
/HC++1f8Jn8Tdd8R7PK8AeMtvk/2te3P2fPmNu8rZvwm/dsTby451Pqk7pbd /wDgHZgFT+uQ
s3v2/wCCfoPRRRXyJ9ofOH/BVj/k0vT/APsuHwt/9T/w/V+qH/BVj/k0vT/+ y4fC3/1P/D9e
DeLP2Pf2RvAP2f8A4Tr47/FfRfte/wCy/wBrftXeNbbztuN2zzNbG7G5c46b h617mWVoUMNO
c2lFPVt2S+Z89nNP2uIhFXbs9Ern0RRXzj4W/ZO/Y28c6g+k+Cf2hvijrF1H CZpLbSv2s/Gl
xIsYIUuVj1skKCyjPTLD1rR8T/sP/sxeCfDeoeM/Gfxe+MWkaPpFjLe6rqup /tTeN7e2sraJ
C8s8sr60FjjRFZmdiFVVJJAFevSxEcRDnpOMl3Urr70jxJ0VSlyz5k+zjb9T 32ivEP8Ah3z8
Bv8Aofvjh/4k346/+XNUbj9h/wDZitPElp4Muvi98YotYv7G4vbHSpP2pvG6 3NzbW7wpPPHE
da3PHG9zbq7gFUa4iBILrnW9Xsvv/wCAZ8tLu/u/4J77Xxf8UtO0b4H3Hxi+ CP7QKeLNP8D/
ABY8RQeIPD/jzw0gl+wXazGdrZ1d0AO8svl71LIm5fvHZ6L4u/ZG/Y9+H/m/ 8J78f/ipon2f
Q77Wp/7X/ax8aW3l6bZeV9svW8zWxi3g8+DzZT8kfnR7iu9c3vE/7D/7MXgn w3qHjPxn8Xvj
FpGj6RYy3uq6rqf7U3je3trK2iQvLPLK+tBY40RWZnYhVVSSQBXl5rlzzOio NqLj133VndWW
680ROjTnZpu+q23TVmt+qfr2Z5X+yF8DfBXiH9ozQ/i58ENH8YW/gfwloDwn XvF167Pr+pvD
JbvLDEWZVjKyux2MVQxquSWIT2L9srwbc+OP+Ec0nxn+xTofx48Ax/bJtX8I XGlaNealZ6wP
IWwvoE1u7trIW6QNqcUzbzcb7i1EamM3BU/4d8/Ab/ofvjh/4k346/8AlzR/ w75+A3/Q/fHD
/wASb8df/LmnluWPLcJ7CNnd3b2106WemnmGGp0MNrF+e1l8ve0PK9D+EX7T eh+HfBnxTb4U
eONU0v4f/HC48TeFPhj4k8b2Wq+LrbQJ/CV7oklrJqN7qUttdXH9rajd36+f qcgSxkWNZVeO
OyTlfhr8Bf2qvhT8RvhV8evHX7Gdj4t1LwlffGW91zRfD3i7S7i70S58R+Mb a90+fSJtQNrH
cySWZuAXkayZbSS58wpMUsp/fv8Ah3z8Bv8Aofvjh/4k346/+XNH/Dvn4Df9 D98cP/Em/HX/
AMua7PYT/p+n93yOv28P6Xk1/N5vzOH+G/7DHjzxP4D8JeKvFXxp8cfDLxPo fjjx34o03TfC
50K++xf8JJrt7qMa3Ueo2GoWo1C2tLs2hntSfL+038UU80FwzSep/sL/AA38 afBz9iX4O/CL
4j6N/Z3iLwr8K/D2j69p/wBojm+y3ttptvDPF5kTMj7ZEZdyMynGQSCDWJ/w 75+A3/Q/fHD/
AMSb8df/AC5o/wCHfPwG/wCh++OH/iTfjr/5c1cKcoNNLy39PLyInUhNWbe9 9l5+fme30V4h
/wAO+fgN/wBD98cP/Em/HX/y5o/4d8/Ab/ofvjh/4k346/8AlzWl6vZff/wD K1Hu/u/4J7fR
XiH/AA75+A3/AEP3xw/8Sb8df/Lmj/h3z8Bv+h++OH/iTfjr/wCXNF6vZff/ AMALUe7+7/gn
t9ch+yb/AMpI/jZ/2Q/4b/8Ap48b15//AMO+fgN/0P3xw/8AEm/HX/y5rpP2 Bvh7oPwr/bw+
L/gLwxf65dWNh8D/AId+RP4k8T3+s3rb9c8dSN5l5qE01xNhnIXzJG2qFRcK qqPOzRz+qO66
rr/wD1MnUFjVyt7Pp/wT7Looor5g+sCiiigAooooAKKKKACvzw/YV8J674y/ 4Jafs8aZ4Y8Q
W2l6ja/CjwDqVje3unNdwpLZ2unXarJCssTOjGAIQJEOGJB4r9D6/Lz9hH9o P4t+B/2D/gR4
W8MfsL/FTxlY2vwP8H+R4k8N6v4Tisrzdodk7eWuoa5bXA2MxjbzIU+ZGK7l 2u3qZdSo141a
VVXjKNmtdU9HtrseNm8qlP2U6btKLutt16nult8Rfix+0rBqvgxP2g/h3rGm eEvHdjaeKk8N
fD+9gmh1DT7iz1F7JbiTVpYw4/cpIQkgQs6ECRGVfT6+W/hf8Sfjp8MPGXjf xlF+wd+0frL+
OdfTV72x1fXPhwILCdLaK1Vbb7PrkThPs9vbRYleU4tkbO9pXk7X/hq/48/9 Iyvjh/4P/Av/
AM0tevg8uyzK+aODg4qVr/E9befzPCxOJxuNadeSdttYr8jznwz8Ufj/AK1+ 0Zc+FfHXx28V
aLo/jTxV4k8LeEtV8N6b4W1PwrJNbQ6k9vb6VKnmaraa5awac8t2+qxT6eLq w1S2WEiWy2fO
fwA+Lf7VXwp/YAnuvAX7St9baP8ACr/gnt4X8eaHY3PhbS5rmTW7zSvE5tw0 5twv2O2SxtAI
TE0sjWFmzz4+2rffVGk+O7vQfixqfx60L/gjP8RrLxzrditlrPjS0X4eR6tf 2yiILBNeL4iE
0sYFvAAjMVAhj4+RcC+O7tLDX9KX/gjP8Rha+K7Gey8U2wX4eeXrFtNPd3E0 F0v/AAkWLiOS
fUL+V0k3K0l7cuQWmkLW4tu931/m6/8ABGpxStZdP5en/AOV8bfHH9pvw98Z /ib4+t/jf/xS
vgb9ovwL4F0LwEvhqyFvc2Wu23hGC+a8uihuJfKbW57m1EL27Rzh/Pe7gaO2 hw/G/wC0F+0L
p/g/SP2jof2tv7C/4SL9qe3+G1v8NtR0HSH027023+IDaDJDprtAl8NQl0+y luJpJbi6QI1+
0VvB+4ls/VLv4xeML/8AtD7d/wAEiPipN/a2uWetap5tz8P2+2alafZvst7L nxH+8uIfsVn5
crZeP7JBtI8pNvh/xN+H3x5+J/7SVx8ZL7/gmZrmlaXfa5oGpapf6J4A8Cwe NNQ/si80/UbW
2uPEJ8bMstub7S7MvG1kc20QhUo6pcK586vy3d/X7/l2CnyO3MkrW/l120+e 9zc/Z81z4peM
NZ0D9mjwF8Ztc8AWOv8Ajj46eJtS8ReFNP0yfUnl0z4jfZYbUf2paXlutu66 xPJJiDzS8EG2
VFEqS+qf8Eq9f/4Sv9j1fFP/AAm+h+Jv7S+KnxCuv+Ek8MReXpuq+Z401t/t dovnz7beXPmR
jzpcI6jzJPvnD8e6ro3xU8Fp8OPif/wRH8ceJPDseuT61HoOvWXw5vLJdSnk nlmvRBL4hZBc
SSXNy7y43s1xKxJMjE9V4e/aJ+KnhGwk0rwp/wAEqfjFplrLfXV7LbafqngK GN7m5nkuLicq
niQAySzyyyyP955JHdiWYk1TXJNN30Vtn5eXkRUfPBpW1d94+fn5/gcr+1l4 q/4TH/gk/wDt
J6v/AMLW/wCEy8nwP8UrH+1/7C/s77P9ll1m2/s7ysDf9i8r7D5//Lx9k8/J 83J8PsPBH/BN
yf8AZt1bT9L/AGvf2INI8nxxp9xrt74L8D6Pp3gvWv8AQ71LHS/EOkjW5P7U 27tRvLZHvIdt
zaQToh+ySCX6o/4av+PP/SMr44f+D/wL/wDNLR/w1f8AHn/pGV8cP/B/4F/+ aWiUYyab7W2k
OE5wjZd7/FE+ILX4pXPwR0H4o/HT4TeOND+C82n/ALLGpf8ACpvC3gnw/o2n eG/iJe6Jf+Pp
jq+l2d3azPNbiN7LXUhsp2VIdXt2uJbyGVJJfYfidr/7Smift5eGP2b4P2m7 7SNS8W2PhG38
VeO/CngfQbfUZ45bH4nam9rB9tsbwR2aT6VZRwQzm4khhjf98809zcT+/f8A DV/x5/6RlfHD
/wAH/gX/AOaWj/hq/wCPP/SMr44f+D/wL/8ANLUxppJLmf3P5/eVKo5XfKvv j5W+4+O/j3+3
x8cPCvwP+JurePP22v8AhVWqfDrwP4sX4Xas9p4etZfibr+keIfFOkm3nTVL KaK8uEh0XRJZ
rfTEtSsusyEoiT2kcP6Z18sfGXxN4n+P/wDZtv8AFT/gmB+0XfWOnecr6LZ/ E7wxY6bqcUuw
S2+o2Vr4ujt9Ut3WMI1veRzRFHkQptlkVu4/4av+PP8A0jK+OH/g/wDAv/zS 1dJuDfM29ujM
6qjOK5Uk9esfI9vorxD/AIav+PP/AEjK+OH/AIP/AAL/APNLR/w1f8ef+kZX xw/8H/gX/wCa
WtvaR8/uf+Rh7KXl96/zPb68w+Lv/J2n7K3/AGXDVP8A1APF1c//AMNX/Hn/ AKRlfHD/AMH/
AIF/+aWse3+LHjz4n/tafs0f8Jv+zJ44+HP2H44X32X/AITO/wBCn/tDf4A8 ZbvJ/snU73b5
exd3m+XnzU2b8Pt5cdOLwk1rt2Z2YCnKOMg9N+6/zP0Hooor5E+0Cvzw/YV8 J674y/4Jafs8
aZ4Y8QW2l6ja/CjwDqVje3unNdwpLZ2unXarJCssTOjGAIQJEOGJB4r9D6/L z9hH9oP4t+B/
2D/gR4W8MfsL/FTxlY2vwP8AB/keJPDer+E4rK83aHZO3lrqGuW1wNjMY28y FPmRiu5drt6m
XUqNeNWlVV4yjZrXVPR7a7HjZvKpT9lOm7Si7rbdep7pbfEX4sftKwar4MT9 oP4d6xpnhLx3
Y2nipPDXw/vYJodQ0+4s9ReyW4k1aWMOP3KSEJIELOhAkRlX0+vlv4X/ABJ+ Onww8ZeN/GUX
7B37R+sv4519NXvbHV9c+HAgsJ0torVVtvs+uROE+z29tFiV5Ti2Rs72leTt f+Gr/jz/ANIy
vjh/4P8AwL/80tevg8uyzK+aODg4qVr/ABPW3n8zwsTicbjWnXknbbWK/I8d 8DfFv9qr4/8A
xc8HfCTSv2lb7whp+r33xpfxBqmjeFtLuNRe28P+O7HStJjtHureWC3kit5x C0ksFwssLTBo
zO8V1B4fB4y+Ifx28Uad+1H46+IF99q8ffDn9lvX9R8JWdnZx6TZXOoeP5Jn S3/cG7EcUkVw
8YkuJGzqFwJGkVbZbf620b4xeMPDmqwa94e/4JEfFSwvrX+0vs17ZXPw/ilh /tG6S81Da6+I
wV+03UcdxPg/vpUWR9zAGqLeO7t7DQNKb/gjP8Rja+FLGCy8LWxX4eeXo9tD PaXEMFqv/CRY
t4459PsJUSPaqyWVs4AaGMrbg5LVv7pdrf5sqM1F6JffHvf/ACXkeO/Hjx38 UviJ8MdA+M/j
f9p37DY6x+2Hong7T/hhqOk6Yum3MWj/ABPisbcabIsUd/8A2g0OkLeTNLc3 URQX+y2iUxPa
fYf7Qfir/hDvAdhq/wDwtb/hDfO8ceGLH+1/7C/tH7R9q12wtv7O8rB2fbfN +w+f/wAu/wBr
8/I8rI8Qu9V0a/8AiTqHxlvv+CI/jibxhq32P+1PFctl8OW1K8+yTW09r5t0 fEPmyeTNZWck
e5j5b2kDLgxIV7j/AIav+PP/AEjK+OH/AIP/AAL/APNLWkPdve+vlL+vuMp+ 9a1tHfePl/V2
eA/8FVtI+CWtftbfBO1+PXxC+AXhrR1+HPjt7a+/aM8HW2t6JJc/b/CoWOCC 41GxVLwoZCsg
lZhEs6+WQxZOH+InjL9mfwT+2H8Qbr9iP4gfDnwr4s1f4c/AvQNI8QfDez0G 41Gy0TU/GUum
3b2iPBPEY/7JutDALRPEsLaU20oLavrb/hq/48/9Iyvjh/4P/Av/AM0tH/DV /wAef+kZXxw/
8H/gX/5pamUIym5Lr/dfaxpCpKMFFpO395W3v/wD5z03xZ48i/4KL+GPC3xj /au1zStL+Geu
eJPBGk+PdVttCs7jxjd6jafD3W7Tw/fO9gtm1xdNdahHFFYw2t1JBpoMbF4r iWT77rxD/hq/
48/9Iyvjh/4P/Av/AM0tH/DV/wAef+kZXxw/8H/gX/5pa0puMG93fyZjUUqi WiVl3R7fRXiH
/DV/x5/6RlfHD/wf+Bf/AJpaP+Gr/jz/ANIyvjh/4P8AwL/80tae0j5/c/8A Iy9lLy+9f5nt
9FeIf8NX/Hn/AKRlfHD/AMH/AIF/+aWj/hq/48/9Iyvjh/4P/Av/AM0tHtI+ f3P/ACD2UvL7
1/me30V4h/w1f8ef+kZXxw/8H/gX/wCaWj/hq/48/wDSMr44f+D/AMC//NLR 7SPn9z/yD2Uv
L71/me315h8Xf+TtP2Vv+y4ap/6gHi6uf/4av+PP/SMr44f+D/wL/wDNLWPb /Fjx58T/ANrT
9mj/AITf9mTxx8OfsPxwvvsv/CZ3+hT/ANob/AHjLd5P9k6ne7fL2Lu83y8+ amzfh9vLjpxe
EmtduzOzAU5RxkHpv3X+Z+g9FFFfIn2gV+YP7NPxL8FeB/8Aglp+zZpniD4h xeHdRf4R+CNZ
029m8N3eqw20emWulXct1dw2pVorKMrEk1zJJFDEJ0LyJuXP6fV+PPwH0/xT 8R/2D/gB4WH7
HHxt1+xs/wBnbQNEuvEngPXfBkFlruj6loelvf6eV1bV4rhIpGt4Y3kWGCdW gJhlVW3v6+U0
cLiJVKOJTdOUWpWvs9HtqeLnM6tNU50naUXdbbr1PrX49fEn4raP4Q09/wBo 39oT4eaJ4T/4
SfS7jUNTg+H19ZJG1rdx3saS3kurSwWaSPbLEJZl2F5UjXMksat6NoOtWXiT Q7LxFp0V0lvf
2kdzAl9Yy2s6o6hlEkMyrJC+CMxyKrqchgCCK+O/jt4W1f8Aags7fRv2h/8A gmZ8e/FunWt3
JNaWWo6n8NontkeWeRoYbq31yO6t0PmWqMYpkd00y2V2fddfafQPhX8ZPib8 Hfh5pPwz8Ef8
EtvjNaabpFoIYY7O8+HdmkjklpJjDaeIIoEeSRnkcRRohd2IVc4r1sFl2U5X RawkWnJ6/E15
au7PDxWJxuNknWknbbWK/KxzPhn4o/H/AFr9oy58K+Ovjt4q0XR/GnirxJ4W 8Jar4b03wtqf
hWSa2h1J7e30qVPM1W01y1g055bt9Vin08XVhqlssJEtls+c/gB8W/2qvhT+ wBPdeAv2lb62
0f4Vf8E9vC/jzQ7G58LaXNcya3eaV4nNuGnNuF+x2yWNoBCYmlkaws2efH21 b76o0nx3d6D8
WNT+PWhf8EZ/iNZeOdbsVstZ8aWi/DyPVr+2URBYJrxfEQmljAt4AEZioEMf HyLgXx3dpYa/
pS/8EZ/iMLXxXYz2Xim2C/Dzy9Ytpp7u4mgul/4SLFxHJPqF/K6SblaS9uXI LTSFm4tu931/
m6/8EanFK1l0/l6f8A5Xxt8cf2m/D3xn+Jvj63+N/wDxSvgb9ovwL4F0LwEv hqyFvc2Wu23h
GC+a8uihuJfKbW57m1EL27Rzh/Pe7gaO2hw/G/7QX7Qun+D9I/aOh/a2/sL/ AISL9qe3+G1v
8NtR0HSH027023+IDaDJDprtAl8NQl0+yluJpJbi6QI1+0VvB+4ls/VLv4xe ML/+0Pt3/BIj
4qTf2trlnrWqebc/D9vtmpWn2b7Ley58R/vLiH7FZ+XK2Xj+yQbSPKTb4f8A E34ffHn4n/tJ
XHxkvv8AgmZrmlaXfa5oGpapf6J4A8CweNNQ/si80/UbW2uPEJ8bMstub7S7 MvG1kc20QhUo
6pcK586vy3d/X7/l2CnyO3MkrW/l120+e9zc/Z81z4peMNZ0D9mjwF8Ztc8A WOv+OPjp4m1L
xF4U0/TJ9SeXTPiN9lhtR/alpeW627rrE8kmIPNLwQbZUUSpL4h8JNf+JN1r PwY/aO+FPjf/
AITTVPBf/C//ABfdQfD2KY2Hj3TR8RtMj1G3s7OGeZrvz7G6urjT7Y3Dob+P TWeZ0Rmb6n8e
6ro3xU8Fp8OPif8A8ER/HHiTw7Hrk+tR6Dr1l8ObyyXUp5J5Zr0QS+IWQXEk lzcu8uN7NcSs
STIxO5o3xi8YeHNVg17w9/wSI+KlhfWv9pfZr2yufh/FLD/aN0l5qG118Rgr 9puo47ifB/fS
osj7mANT7Nu2r6dH5eXkNVLbJat9Y9b+d+v4HgPjX4+eJNP/AGtte/4KET+K b6PwnY/szfFG
X4b6eLV7+zbRNBv/AAzINbWx+0wRXUl/dvezxywXUUV7pkejnzIH3uD4ifGz /gpN+yf4b+J+
hfGn4n2N/dSfszePvG/g7WZPEum67c6Vq2gppqwNGtt4X0SFIydU3uk8d4JW hi2+QqSLce/a
B8YvGHhT+xP+EW/4JEfFTTf+EZ0N9F8N/wBn3Pw/h/srTX+z7rK22eIx5Fuf slrmJNqH7NDx
+7THD+FvA3wd8D6Vf6D4K/4IC65o9jquf7TstL8OfDO3ivM2t1ZnzUj18CTN rfXtudwP7q8u
I/uyuGHCerTevk/8v+GCM4aXitPNf5/53Dxv8cf2m/2dPiT4wg8e/G//AIS7 w78LtD8KfEP4
iTyeGrKx36Hqk3iPT9ZtrVYUZ4NP02PToNYt4j9r1GX7DLZtdXJuUaP2/wCA XxI8afGP4k/E
Tx7DrOPAOma4PCfg7T/s8f8ApV7pU1zDrGp+ZtWZN1+8um/Z5QVH9hfaYmeO 9Bryz4rfGP8A
as8R+Zq3wZ/4J9/FTwV4i1b7LYeJPF8mneANR1KbR4ftTLb2rv4rjSK4ikup ZbeW5S7t4Xkl
LWkwlcVufDL40fEX4OfDbw98Ivhx/wAEsfjhp3h3wrodpo+g6f8A8JP4Jm+y 2VtCkMEXmS+J
2d9saKu52ZjjJJJJrWEnGXW3o/62/rcynFSholf1Xl+v4Nnqfwn8Vf8ACQ+P PibpH/C1v+Ei
/sLxxb2P9kf2F9k/4RfdoWk3P9nebgfbd/2j7d5/O3+0fIz+4wPzb/4J6eEP 2ALz/gnvZW3i
D9qf9krw14mvPg74Wl8Qar4T8MaVpGraZbJJp73Wn+LZW1aSTVrO6vPsNlfw P9hW6E00LbHu
U8r7t/4av+PP/SMr44f+D/wL/wDNLR/w1f8AHn/pGV8cP/B/4F/+aWicYzkm +l+j6/1/ww6c
p04tLrb7Uen9f53Pkn9nR/hhpH7UPws1jwD41+HPwy8DaVfeL/D+l/EX4IeF 9H0Hwf8AFTVL
2XwPdQWFtHdLfQmS5MV7p7R2t1JeTS+HboxTxeVLBDRf4+ftc3Xwk/Zg+Ini n9o7zfGvxe+F
el32p+MdK8B6JBd6NFq/iz4aadNDYi4tLgR7rXUrp5Q/mRTXUxm8mOOGztrT 7E/4av8Ajz/0
jK+OH/g/8C//ADS0f8NX/Hn/AKRlfHD/AMH/AIF/+aWs/ZKzSk18n5f5F+1f Mm4p/OPn/meA
+Jf2m/iX4J+MOt/s5fHf9ui++HXgbwd4q1fTZfjprMPhvT9R1G+TRfCWqWGl XdxfaedIWSZd
f1llihs4Z5IdGhZW/cXbz+lfs6fEjxp8Y/DH/BPT4u/EfWf7R8ReKtcstY17 UPs8cP2q9ufh
d4nmnl8uJVRN0js21FVRnAAAAq18Xfib8S/jd4bg8KeM/wDgnD+0zZWtvfLd xy+EPiz4b8P3
JkVHQK1xpfi+3mePEjExM5jLBWKlkUiTwj4x1jWv2j/2V/Bkn7Inir4RaP4a +MVzZaBpWvye
HxbSWy/D3xgiQWkWjaleLDHAkaLscRKFdBGGAbZhi1JUKmrtbz8u50YNxeIp 2STuuq/TU/RW
iiivmD60+cP+CrH/ACaXp/8A2XD4W/8Aqf8Ah+vOfE3xXSH9pPR9C+FXxa0f SfFum6XqGjXF
n4g8D3+pafPJdR2eoG1FzDcW0CXq29mtwLYzNMbeRpfLCAPXo3/BVj/k0vT/ APsuHwt/9T/w
/Xyjrt58U9X+J158U9P/AGCP2lNLvLq/k1aCzsPEPw4a3tNabSTpA1aMTa5I 5uEsSIRFI72v
Adrdny59vLsJgcdgqtDFpuDtor7pprbXdX6HgZrWxGHxdOrRdpJPt10e/ke0 eIvitrGl/tBe
G7T9oL40eGZtcfQ7nT/C3h3w94Ev7CXUzfXdp5kkTSXl19q8j7CrTLEP9Fil 864McTI5X9uj
4keNPg5+xL8Yvi78ONZ/s7xF4V+FfiHWNB1D7PHN9lvbbTbiaCXy5VZH2yIr bXVlOMEEEivm
/wCJHwb8P/GH4qQ/Gn4q/wDBJz4z+IPEVvdLLHe6k/wyZZU89maG4jGthL5D bGKyU3QmeGC2
jaForgyXD+z+J/2ifip428N6h4M8Z/8ABKn4xavo+r2MtlqulanqngK4tr22 lQpLBLE/iQrJ
G6MysjAqysQQQa9XD4LLcuwqo4NOKd29Jbvs3dnj1q2JxVdVa7Unp1jt8tDz nxt8cf2m/D3x
n+Jvj63+N/8AxSvgb9ovwL4F0LwEvhqyFvc2Wu23hGC+a8uihuJfKbW57m1E L27Rzh/Pe7ga
O2h8B+HfjL4h/sneHtc+NOm/EC+8Z694K+HP7Uev6RN4ys7MRvc6f450hlSR NOgtA0c09q1x
KBhvMupljaKIQxRfW138YvGF/wD2h9u/4JEfFSb+1tcs9a1Tzbn4ft9s1K0+ zfZb2XPiP95c
Q/YrPy5Wy8f2SDaR5SbSx+MXjDS/Glx8R9M/4JEfFS38RXnnfa9egufh+l7P 50dnFLvnHiPe
2+PTtPRsn5lsbZTkQxhVKDlK939z73/yKjNRVrL749rfq2fMv/BQbw54t+H3 iT4kfDrxn+1X
ffEi6g/YS+L+pR2vifTtJg1vSo538PxB5TpcFpC1nMbVhButVkEtveZnnUrH bH7eHif4263+
wB8V/wBgLUvEPipdY+HHw58U3vjf4gS3dyLnV/COl6UbrRJzfElri81R5bC0 vHliS3vG0zxZ
FCVNtGT7h4Q03wF8PvDd54M8Bf8ABCbxVoej6jY6hZahpWj6P8Nra2ura/S3 S+gkij8QBXju
EtLRZkIKyrawhwwjTHVa/wDGLxh4r/tv/hKf+CRHxU1L/hJtDTRfEn9oXPw/ m/tXTU+0bbK5
3+Iz59uPtd1iJ9yD7TNx+8fMunfm1evk/wDIpVeXl0Wmu8V+p47+2v8AHr9v Lw7rHxx+OP7M
/j6xj8J/AGxkfVfD2p6zY6dbXdzaeH7PXpY5baTQdSudSjkivYlaSHUtJZlJ t0jt3h/tC56r
xt8cf2m/D3xn+Jvj63+N/wDxSvgb9ovwL4F0LwEvhqyFvc2Wu23hGC+a8uih uJfKbW57m1EL
27Rzh/Pe7gaO2h3PG+q6N8TPiTpHxl+JH/BEfxx4g8YeH/s/9g+K9bsvhzd6 lpvkTNPB9nup
fELSw+XM7SJsYbXYsMEk1e0Px3d+GPDY8GeG/wDgjP8AEbT9HF9p16NKsV+H kVsLnT0tUsJ/
KTxEF8y2SxsVhfG6JbO3CFREm2rScm7v8fPy8/wITgopcq++Pl5+T+8o+Af2 j/jP4q/4Qj9k
SXxln4v6J44l0v4peIf7Otvm0XQfsF7eax5Hli1H9r2moaCn2W3kMlj/AMJT uQyPps6r7f8A
FjxV/wAI948+GWkf8LW/4R3+3fHFxY/2R/YX2v8A4SjboWrXP9nebg/Ytn2f 7d5/G7+zvIz+
/wAHwL4JfEP9p3wN4k134t/Fv9gP4xeKPH/iixsdO1rWtGfwRpWnRadYvdPZ WVpZP4uuWijj
e9vJmeWeeaSa8mJkWFbe3t/Rv+Gr/jz/ANIyvjh/4P8AwL/80taQk+XW/wBz 2/z7/wCRnOC5
vdt963f6dv8AM+Zf2y9I/ZJ1H/gqRqV1+1v8Qv2ZtG0e2+Dvgp1sf2hPB1hq VzqVt/bfig3U
ekT3uo2q2UmwIJJPKuV3SWzNHiMLJR8Fa58P/wDhsr4o/DD9kb4zaH4E1zx3 +2HFo/xE134Z
6foFxrH2KL4ZT6k0Uwu7S7jTdren6lvaSIt9oXUQCsrTmvqj/hq/48/9Iyvj h/4P/Av/AM0t
H/DV/wAef+kZXxw/8H/gX/5pazdOLldX3vs7/eaqpLltZbW+KNumtvkeA/sd fELxb4z/AG9t
T8U/GH9oe+0fULjwrN4M8O6RPFpNpH8TZPDfi7x5p00jrJa+bPeWtpHZX1wm mNbRxyXweSJY
JIoV+7a8Q/4av+PP/SMr44f+D/wL/wDNLR/w1f8AHn/pGV8cP/B/4F/+aWta TVONnd/JmNVS
qyurL5o9vorxD/hq/wCPP/SMr44f+D/wL/8ANLR/w1f8ef8ApGV8cP8Awf8A gX/5pa09pHz+
5/5GXspeX3r/ADPb65D9k3/lJH8bP+yH/Df/ANPHjevP/wDhq/48/wDSMr44 f+D/AMC//NLX
SfsDeLNe8cft4fF/xT4n+GWueDb66+B/w78/w34kuLCW9s9uueOkXzG0+5ub c71USL5cz/K6
htrbkXzs0mpYR27roz1Mng441N22fVH2XRRRXzB9YFFFFABRRRQAUUUUAFfC H/BMr/lG5+z5
/wBkP8J/+me1r7vrwD/h07/wSy/6Rp/s/wD/AIZvQ/8A5FrtwWM+pzcuW9/O xwY/A/XoRjzW
t5X/AFQlFL/w6d/4JZf9I0/2f/8Awzeh/wDyLR/w6d/4JZf9I0/2f/8Awzeh /wDyLXo/23/0
7/H/AIB5n9gf9PPw/wCCJRS/8Onf+CWX/SNP9n//AMM3of8A8i0f8Onf+CWX /SNP9n//AMM3
of8A8i0f23/07/H/AIAf2B/08/D/AIIlFL/w6d/4JZf9I0/2f/8Awzeh/wDy LR/w6d/4JZf9
I0/2f/8Awzeh/wDyLR/bf/Tv8f8AgB/YH/Tz8P8AgiUUv/Dp3/gll/0jT/Z/ /wDDN6H/APIt
H/Dp3/gll/0jT/Z//wDDN6H/APItH9t/9O/x/wCAH9gf9PPw/wCCJRS/8Onf +CWX/SNP9n//
AMM3of8A8i0f8Onf+CWX/SNP9n//AMM3of8A8i0f23/07/H/AIAf2B/08/D/ AIIlFL/w6d/4
JZf9I0/2f/8Awzeh/wDyLR/w6d/4JZf9I0/2f/8Awzeh/wDyLR/bf/Tv8f8A gB/YH/Tz8P8A
giUUv/Dp3/gll/0jT/Z//wDDN6H/APItH/Dp3/gll/0jT/Z//wDDN6H/APIt H9t/9O/x/wCA
H9gf9PPw/wCCJRS/8Onf+CWX/SNP9n//AMM3of8A8i0f8Onf+CWX/SNP9n// AMM3of8A8i0f
23/07/H/AIAf2B/08/D/AIIleYfF3/k7T9lb/suGqf8AqAeLq9Q/4dO/8Esv +kaf7P8A/wCG
b0P/AORa3/hb/wAE9v2Bfgd47sfil8FP2Hvg/wCD/E+l+b/ZniPwt8NNK0+/ tPMieGTyriC3
SSPfFJJG21huV2U5BIrHEZt7ejKnyWv5/wDANsPk31evGp7S9vL/AIJ7BRRR XjnuBXwh/wAE
yv8AlG5+z5/2Q/wn/wCme1r7vrwD/h07/wAEsv8ApGn+z/8A+Gb0P/5FrtwW M+pzcuW9/Oxw
Y/A/XoRjzWt5X/VCUUv/AA6d/wCCWX/SNP8AZ/8A/DN6H/8AItH/AA6d/wCC WX/SNP8AZ/8A
/DN6H/8AItej/bf/AE7/AB/4B5n9gf8ATz8P+CJRS/8ADp3/AIJZf9I0/wBn /wD8M3of/wAi
0f8ADp3/AIJZf9I0/wBn/wD8M3of/wAi0f23/wBO/wAf+AH9gf8ATz8P+CJR S/8ADp3/AIJZ
f9I0/wBn/wD8M3of/wAi0f8ADp3/AIJZf9I0/wBn/wD8M3of/wAi0f23/wBO /wAf+AH9gf8A
Tz8P+CJRS/8ADp3/AIJZf9I0/wBn/wD8M3of/wAi0f8ADp3/AIJZf9I0/wBn /wD8M3of/wAi
0f23/wBO/wAf+AH9gf8ATz8P+CJRS/8ADp3/AIJZf9I0/wBn/wD8M3of/wAi 0f8ADp3/AIJZ
f9I0/wBn/wD8M3of/wAi0f23/wBO/wAf+AH9gf8ATz8P+CJRS/8ADp3/AIJZ f9I0/wBn/wD8
M3of/wAi0f8ADp3/AIJZf9I0/wBn/wD8M3of/wAi0f23/wBO/wAf+AH9gf8A Tz8P+CJRS/8A
Dp3/AIJZf9I0/wBn/wD8M3of/wAi0f8ADp3/AIJZf9I0/wBn/wD8M3of/wAi 0f23/wBO/wAf
+AH9gf8ATz8P+CJRS/8ADp3/AIJZf9I0/wBn/wD8M3of/wAi0f8ADp3/AIJZ f9I0/wBn/wD8
M3of/wAi0f23/wBO/wAf+AH9gf8ATz8P+CJXmHxd/wCTtP2Vv+y4ap/6gHi6 vUP+HTv/AASy
/wCkaf7P/wD4ZvQ//kWt/wCFv/BPb9gX4HeO7H4pfBT9h74P+D/E+l+b/Zni Pwt8NNK0+/tP
MieGTyriC3SSPfFJJG21huV2U5BIrHEZt7ejKnyWv5/8A2w+TfV68antL28v +CewUUUV457g
V8If8Eyv+Ubn7Pn/AGQ/wn/6Z7Wvu+vAP+HTv/BLL/pGn+z/AP8Ahm9D/wDk Wu3BYz6nNy5b
387HBj8D9ehGPNa3lf8AVCUUv/Dp3/gll/0jT/Z//wDDN6H/APItH/Dp3/gl l/0jT/Z//wDD
N6H/APItej/bf/Tv8f8AgHmf2B/08/D/AIIlFL/w6d/4JZf9I0/2f/8Awzeh /wDyLR/w6d/4
JZf9I0/2f/8Awzeh/wDyLR/bf/Tv8f8AgB/YH/Tz8P8AgiUUv/Dp3/gll/0j T/Z//wDDN6H/
APItH/Dp3/gll/0jT/Z//wDDN6H/APItH9t/9O/x/wCAH9gf9PPw/wCCJRS/ 8Onf+CWX/SNP
9n//AMM3of8A8i0f8Onf+CWX/SNP9n//AMM3of8A8i0f23/07/H/AIAf2B/0 8/D/AIIlFL/w
6d/4JZf9I0/2f/8Awzeh/wDyLR/w6d/4JZf9I0/2f/8Awzeh/wDyLR/bf/Tv 8f8AgB/YH/Tz
8P8AgiUUv/Dp3/gll/0jT/Z//wDDN6H/APItH/Dp3/gll/0jT/Z//wDDN6H/ APItH9t/9O/x
/wCAH9gf9PPw/wCCJRS/8Onf+CWX/SNP9n//AMM3of8A8i0f8Onf+CWX/SNP 9n//AMM3of8A
8i0f23/07/H/AIAf2B/08/D/AIIlFL/w6d/4JZf9I0/2f/8Awzeh/wDyLR/w 6d/4JZf9I0/2
f/8Awzeh/wDyLR/bf/Tv8f8AgB/YH/Tz8P8AgiV5h8Xf+TtP2Vv+y4ap/wCo B4ur1D/h07/w
Sy/6Rp/s/wD/AIZvQ/8A5Frf+Fv/AAT2/YF+B3jux+KXwU/Ye+D/AIP8T6X5 v9meI/C3w00r
T7+08yJ4ZPKuILdJI98UkkbbWG5XZTkEiscRm3t6MqfJa/n/AMA2w+TfV68a ntL28v8AgnsF
FFFeOe4fOH/BVj/k0vT/APsuHwt/9T/w/V+vYPil8J/hZ8cfAl98LfjX8NPD /jDwxqnlf2n4
c8U6NBqFhd+XKk0fm286PHJsljjkXcp2sisMEA15B/w6d/4JZf8ASNP9n/8A 8M3of/yLXo4L
H/U4OPLe/nb9DzMfl316cZc1reV/1QlFL/w6d/4JZf8ASNP9n/8A8M3of/yL R/w6d/4JZf8A
SNP9n/8A8M3of/yLXb/bf/Tv8f8AgHB/YH/Tz8P+CJRS/wDDp3/gll/0jT/Z /wD/AAzeh/8A
yLR/w6d/4JZf9I0/2f8A/wAM3of/AMi0f23/ANO/x/4Af2B/08/D/giUUv8A w6d/4JZf9I0/
2f8A/wAM3of/AMi0f8Onf+CWX/SNP9n/AP8ADN6H/wDItH9t/wDTv8f+AH9g f9PPw/4IlFL/
AMOnf+CWX/SNP9n/AP8ADN6H/wDItH/Dp3/gll/0jT/Z/wD/AAzeh/8AyLR/ bf8A07/H/gB/
YH/Tz8P+CJRS/wDDp3/gll/0jT/Z/wD/AAzeh/8AyLR/w6d/4JZf9I0/2f8A /wAM3of/AMi0
f23/ANO/x/4Af2B/08/D/giUUv8Aw6d/4JZf9I0/2f8A/wAM3of/AMi0f8On f+CWX/SNP9n/
AP8ADN6H/wDItH9t/wDTv8f+AH9gf9PPw/4IlFL/AMOnf+CWX/SNP9n/AP8A DN6H/wDItH/D
p3/gll/0jT/Z/wD/AAzeh/8AyLR/bf8A07/H/gB/YH/Tz8P+CJRS/wDDp3/g ll/0jT/Z/wD/
AAzeh/8AyLR/w6d/4JZf9I0/2f8A/wAM3of/AMi0f23/ANO/x/4Af2B/08/D /giVyH7Jv/KS
P42f9kP+G/8A6ePG9dh/w6d/4JZf9I0/2f8A/wAM3of/AMi13/wL/ZO/ZY/Z f/tT/hmj9mn4
f/Dv+3PI/tv/AIQXwbY6R/aHk+Z5Pn/ZYo/N8vzZdu7O3zXxjcc82LzP61R9 nyW+f/AOvBZV
9Tr+057/ACt+p6BRRRXlHrhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABR
RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABR
RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAf/Z
--------------090501090205020300070704
Content-Type: application/x-zip-compressed;
name="IdProblems.zip"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="IdProblems.zip"

Re: ID problems: blanks in ID and unset int fields [message #415761 is a reply to message #415756] Fri, 04 January 2008 21:38 Go to previous messageGo to next message
Ed Merks is currently offline Ed MerksFriend
Messages: 33216
Registered: July 2009
Senior Member
This is a multi-part message in MIME format.
--------------080201050904000408060105
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Philipp,

Comments below.

Philipp W. Kutter wrote:
> Hi.
> I had a 2 day modeling session with a client, and to my surprise, the
> fact that one can define an ID, and have the references look nice was
> one of the most important things for them. It seems business oriented
> clients like easy to read XML formats.
I'm not surprised at all. Some folks are obsessed with the prettiness
of XML, which seems almost an oxymoron... You say my blog about
improvements for substitution group handling to avoid those frightening
xsi:type attributes?

http://ed-merks.blogspot.com/2007/12/winters-icy-grip.html

>
>
> I thus started to use the feature with them, and we run into problems.
>
> These are the problems I detected:
>
> - spaces in String-ID attributes let the editor crash
Yep. XML Schema doesn't allow spaces in attributes. If you serialize
using hrefs, EMF tolerates the, but their best avoided. Note that you
could define an EDataType that wraps java.lang.String and encode spaces
some other way (and of course decode them as well) to allow you to use a
value with spaces as an ID...
>
> - an int-ID attribute which is unset (but which displays as 0 in the
> editor...) create not a reference to 0, but the usual positional
> reference.
Well, int's aren't valid XML Schema IDs either. Again, they are
tolerated. In any case, when an ID isn't set, it won't be used, so be
sure to set them.
>
> - ID attributes which are many do crash too.
I'm not sure what such a thing would mean...
>
>
>
> Last but not least, I do not understand why I can select a set of
> features for the eKeys() but only one ID.
Because a key specifies that the indicated features much unique identify
the object with regard to this particular reference only. That's why
they are specified for the reference and not directly on the type.
> The main purpose of the ID
> feature in my opinion is to create clean unique business keys. Such
> keys are typically composed from several fields, not only one.
Yes and you can define a derived ID that's computed by composing other
values. But in XML Schema as well, you'll find it only allows you to
defined one attribute of type ID. That's the design we are mirroring.
>
> I attach an example project, where all that I told can be repeated. Its
> standard EMF usage, EMF 2.4, Eclipse 3.4M4. I attach as well a screenshot
> of the model.
The only one that I'd consider defining a constraint for is a
multi-valued ID. I don't think that make sense.
>
> Best, Philipp
>
> ------------------------------------------------------------ ------------
>


--------------080201050904000408060105
Content-Type: multipart/related;
boundary="------------070707030809070201040100"


--------------070707030809070201040100
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Philipp,<br>
<br>
Comments below.<br>
<br>
Philipp W. Kutter wrote:
<blockquote cite="mid:flm6c2$566$1@build.eclipse.org" type="cite">Hi.
<br>
I had a 2 day modeling session with a client, and to my surprise, the
<br>
fact that one can define an ID, and have the references look nice was
<br>
one of the most important things for them. It seems business oriented
<br>
clients like easy to read XML formats.
<br>
</blockquote>
I'm not surprised at all.&nbsp; Some folks are obsessed with the prettiness
of XML, which seems almost an oxymoron...&nbsp; You say my blog about
improvements for substitution group handling to avoid those frightening
xsi:type attributes?<br>
<blockquote><a
href="http://ed-merks.blogspot.com/2007/12/winters-icy-grip.html">http://ed-merks.blogspot.com/2007/12/winters-icy-grip.html</a><br>
</blockquote>
<blockquote cite="mid:flm6c2$566$1@build.eclipse.org" type="cite"><br>
<br>
I thus started to use the feature with them, and we run into problems.
<br>
<br>
These are the problems I detected:
<br>
<br>
- spaces in String-ID attributes let the editor crash
<br>
</blockquote>
Yep.&nbsp; XML Schema doesn't allow spaces in attributes.&nbsp; If you serialize
using hrefs, EMF tolerates the, but their best avoided.&nbsp; Note that you
could define an EDataType that wraps java.lang.String and encode spaces
some other way (and of course decode them as well) to allow you to use
a value with spaces as an ID...<br>
<blockquote cite="mid:flm6c2$566$1@build.eclipse.org" type="cite"><br>
- an int-ID attribute which is unset (but which displays as 0 in the
editor...) create not a reference to 0, but the usual positional
reference.
<br>
</blockquote>
Well, int's aren't valid XML Schema IDs either.&nbsp; Again, they are
tolerated.&nbsp; In any case, when an ID isn't set, it won't be used, so be
sure to set them.<br>
<blockquote cite="mid:flm6c2$566$1@build.eclipse.org" type="cite"><br>
- ID attributes which are many do crash too.
<br>
</blockquote>
I'm not sure what such a thing would mean...<br>
<blockquote cite="mid:flm6c2$566$1@build.eclipse.org" type="cite"><br>
<br>
<br>
Last but not least, I do not understand why I can select a set of
features for the eKeys() but only one ID. </blockquote>
Because a key specifies that the indicated features much unique
identify the object with regard to this particular reference only.&nbsp;&nbsp;
That's why they are specified for the reference and not directly on the
type.<br>
<blockquote cite="mid:flm6c2$566$1@build.eclipse.org" type="cite">The
main purpose of the ID
<br>
feature in my opinion is to create clean unique business keys. Such
<br>
keys are typically composed from several fields, not only one.
<br>
</blockquote>
Yes and you can define a derived ID that's computed by composing other
values.&nbsp; But in XML Schema as well, you'll find it only allows you to
defined one attribute of type ID.&nbsp; That's the design we are mirroring.<br>
<blockquote cite="mid:flm6c2$566$1@build.eclipse.org" type="cite"><br>
I attach an example project, where all that I told can be repeated. Its
<br>
standard EMF usage, EMF 2.4, Eclipse 3.4M4. I attach as well a
screenshot
<br>
of the model.
<br>
</blockquote>
The only one that I'd consider defining a constraint for is a
multi-valued ID.&nbsp; I don't think that make sense.<br>
<blockquote cite="mid:flm6c2$566$1@build.eclipse.org" type="cite"><br>
Best, Philipp
<br>
<br>
<hr size="4" width="90%"><br>
<center><img src="cid:part1.05070208.09020308@ca.ibm.com"></center>
</blockquote>
<br>
</body>
</html>

--------------070707030809070201040100
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-ID: <part1.05070208.09020308@ca.ibm.com>

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgIC AgUEBAMEBgUG
BgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgIC AgUDAwUKBwYH
CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgr/wAAR
CAFjAugDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcI CQoL/8QAtRAA
AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS 0fAkM2JyggkK
FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1 dnd4eXqDhIWG
h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW 19jZ2uHi4+Tl
5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcI CQoL/8QAtREA
AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMz UvAVYnLRChYk
NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0 dXZ3eHl6goOE
hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU 1dbX2Nna4uPk
5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9/KKKKACiiigAooooAKKK KACiiigAoooo
AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigAorxz4/ftp+BP2ffEuq6FrHw8 8Va9a+E/CsXi
n4ja14fisfs3g7QZHu1j1K8W6uoZrmMjT9RfyrCO7uAtjJmENJAs3qvifxDY eEfDWo+K9Vt7
6W10uxmu7mLS9Lnvrl440LssNtbI81xIQpCxRI8jthVVmIB9CvlWYYalSqVK bSq/D1b2drLV
NqUZJNJuMoyV4yTcKcG2k9i9RXlX7K37Z3wB/bO0DWvE37P/AIt/tux0HXL7 S7++tVWe0Mtv
f3dmDHdwNJbS+atoLpI1lMotbyynkjjW6h3+q1nmGX47KsbPCYynKnVg7SjJ NNPzT+/zWq0H
CcZxUou6YUUUVxlBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUU
UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFAB
RRRQAUUUUAFcr8avi/4a+Bfw7ufiJ4osb68jS+sdO0/TNLiRrnUtRvryGxsb KHzHSJZJ7u4t
4FeWSOFGlDSyRRq8i/HP7QH7MHjvXYf2qPih4O+HN8fE2ufGPwjFZX+raDfa rbXvg+DTfBUm
uxwaYksZ1Gzngsr+G8s7MrLqa2K2TGZ4YI4/ONK/Y30D4lfCPxHp/wDwoHQ9 c8H3XxV+FEmn
+CdG/ZTv/AehWtxbeLFGtahFomrXNxcy3D6TeeTe3/2eGB7KKOHzZxDcpB+q ZTwNw/XoUMXi
cwfI50IygqTv+8VCUlzqbhHlVaSTk4uXsptJNWOGpiaqbjGHR637X6b9PxR+ m9Ffmt4e/Z++
KFz+1hJd+K/DNjZfEMfH+61mLxbp37LGsXXiZvDi+KJL22tz4+fUYtMWzfQR FayQ5LxWDvpi
28twgtXv/EL9lPxXpP7PC+KbX4Tf8hv9qrxvq3xZtvGPwx1Xxrb6j4a/tfxe NJSfw9bzx3Wp
af8Aa73Tby3tbX9zFPdf2p5Z/wBInaKnh9lFKdODzPWbilajLW8Zy5oXknUh JQcaUqamqs3G
MbXuNYuo7+5+Pp92+t9kfo1RX55/DH9kubxz4W+FfgzxV8Pb7U/h7fftN32s t4b0n4Q6l4E0
HStDHw/1Wzkt49CnvJ7mw0ufUlkW4hvRBFfXGo3Qe3lt71Hur1r8JdA0bTfA Gn/tdfs1a54t
+D/hnXPi1pNr4JuvhXf+KbTTbg+MoR4VePRLa0uZI7eLQ7a/hs7pbcQW9rKs KSRpdRJLz1+B
csp140qWOdSTvdRo+98NdqKhKpGTqc1DkdOSi1KcVdvdrFTau42+fp5ba7+R 9/UV+a3x8+C2
j6p8UNH164/ZzsbP4Rt8OLC2+Gnhf4sfsneIfiiukXKaxrct79j03TbzzfDE clpPozLbXMcL
G2WytFhtzpclrb9zc/Biw8NeJfCGnftrfAr4j/Fq6s/gB4L0X4d6rJ4Rn1fX LTxhavqo1m5j
1CynuYfDOqTmXRGfU5NQt4mlhikW/dbFp4bq8BZfToQqLGylKSvyKj7z1V1B uoqdSVO/75Rq
NUuWXM3ysFipt25fx/PS6v001PcdA/4KAaH8R/DXhHXfgN+zd8R/iDdeKfhx onji50Xw++h2
lzoWk6ukzac142qapaQtJMbW8TZbSXBRrSTzNivC0vo/wd+Ouk/G7QNL8T+E /BWuQWN5/a1t
q0+oC1T+w9V02/8A7Pu9KuVSdi9wt0l3GJLYT2rfYZmE5V7dp/jn4ReGvC/w 3/Zr+BGjfHz4
P/HHwL4i0X9nLwXZ6T49+FGjeKLrUhqtvZyLcaZqumaLaTxt/ZsnkTRQ6zDP ayPqd3GkDBb1
Ho/tL+Ev2o/jX8B9R1rxX8NfFWtaxd/sj/HPQdLuh4Vliv8AVI7nUNDj8PG7 tYok+z6pqGnW
sVy9n5UEnn/aUW2gMTQRevieDMkxOPjhMOlRpurKCqzbldKFWV4tVPZ1YpwS vF05UpWp1YVJ
NszjiKqhzPV22+7yuvxvurH6GVyvxk+L/hr4IeEbPxn4rsb64tb3xVoXh+KP TokeQXOrataa
VbOQ7qPLWe8iaQ5LCNXKq7AKfkf4z/s0at8M/EXxX+HXwV+EeuJ8O7zQ/hVr HiTS9Osbq8i8
TLH4u1STxfLODvk1zULrQ7eGO+VvtF7qERghlFw00SP5xpngH4d6t8c/iXov 7J37Nnirwl4Z
+3fs+6jpvhmbwdeaPGLa2+I2qT317Z6NMqTaVZoILmSVHtrRWkgu7wxslx9r n8zK+BsqxK+s
yxUpUoyo39yMU4VJYZNTl7V+zlbESskp39lN3STcbniZx93l1169r+Wu3luj 9KaK/Nbw9+z9
8ULn9rCS78V+GbGy+IY+P91rMXi3Tv2WNYuvEzeHF8USXttbnx8+oxaYtm+g iK1khyXisHfT
Ft5bhBav+lNfM8T8O4Th+dGNHE+2502/clC1rWlFy0qU5a8lSPuys7G1CtKr e8bW8/6s/IKK
KK+VNwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA+ K/2/PCXjubxL
+0J4U0f4a+KtXuvjh+zJp/gT4cy+H/Ct9qNtda9E/ipJLa8ubWKSHSYwda04 /ab97e3KzSMJ
SsE5i+qvE+t/DvxtDqPwo8Z+Dr7V9P1e+m8OatpuqeDby4069WXTTdyxzNJA YJLN7Zmiadib
ZpmNqXM58muqor6THcQf2hhMPSnTcZUlpKMre8oUqcXbldkoUYXV7ublJSim orGNLlk3ff8A
zb/U5X4dfAn4IfB+/vtV+Evwb8K+FrrVLHT7LUrnw54etrGS7trCD7NYwStC imSO3g/dQo2V
ij+RAq8V1VFFeDiMRiMVVdSvNzk7K8m27JJLV66JJLskkapKKsgooorEYUUU UAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQ
AUUUUAUfE/h6w8XeGtR8KarcX0VrqljNaXMul6pPY3KRyIUZobm2dJreQBiV lidJEbDKysAR
8c/s5fsneLrn9oH9oFfhv+2p8Y/CFr4f+I+l+HbGGPVNJ8RXLWEfhbRNSSKT UfE2nanqDxrd
atfyJAbnyImuZTHGjSys/wBqV4d+yb/yXr9p3/suOn/+oJ4Tr7DhrNMbgMsz KNKScfYxfLKM
Zwv9YoLm5JqUXJJtJ2uk3Z6nPWhGc4X7+nR9g/4ZN+PX/STr44/+CDwJ/wDM zR/wyb8ev+kn
Xxx/8EHgT/5ma9xorz/9Zcx/590f/CbD/wDyov2MO7+9/wCZ4d/wyb8ev+kn Xxx/8EHgT/5m
aP8Ahk349f8ASTr44/8Agg8Cf/MzXuNFH+suY/8APuj/AOE2H/8AlQexh3f3 v/M8O/4ZN+PX
/STr44/+CDwJ/wDMzR/wyb8ev+knXxx/8EHgT/5ma9xoo/1lzH/n3R/8JsP/ APKg9jDu/vf+
Z4d/wyb8ev8ApJ18cf8AwQeBP/mZo/4ZN+PX/STr44/+CDwJ/wDMzXuNFH+s uY/8+6P/AITY
f/5UHsYd397/AMzw7/hk349f9JOvjj/4IPAn/wAzNH/DJvx6/wCknXxx/wDB B4E/+ZmvcaKP
9Zcx/wCfdH/wmw//AMqD2MO7+9/5ngH7OU3xi8E/tc/En4B/EL9o/wAVfEXR 9I+HHg/xBo9z
4v0vRbe5srm/v/EltcoraTp9kjxsmmWpAkV2VlbDAMRXv9eHeAf+Uk/xZ/7I d8Pf/Tx40r3G
q4pcZ5qpqEY81LDyajGMI3lQpttRglFXbbdkrttvVhQ0p28359WFFFFfOmoU UUUAFFFFABRR
RQAUUV4B/wAFMfDHhrxt+zBYeDPGfh6x1fR9X+Mfw2stW0nVLRLi2vbaXxxo ccsE0UgKSRuj
MrIwKsrEEEGvSybAQzXN8PgpT5FVqQg5JczipSUb2vG9r3tdX2utyKknCm5d ke/0V4d/w7F/
4Jsf9I9fgd/4abR//kaj/h2L/wAE2P8ApHr8Dv8Aw02j/wDyNXd9W4V/6Cq3 /giH/wA0k3r/
AMq+9/5HuNFeHf8ADsX/AIJsf9I9fgd/4abR/wD5Go/4di/8E2P+kevwO/8A DTaP/wDI1H1b
hX/oKrf+CIf/ADSF6/8AKvvf+R7jRXh3/DsX/gmx/wBI9fgd/wCGm0f/AORq P+HYv/BNj/pH
r8Dv/DTaP/8AI1H1bhX/AKCq3/giH/zSF6/8q+9/5HuNFeHf8Oxf+CbH/SPX 4Hf+Gm0f/wCR
qP8Ah2L/AME2P+kevwO/8NNo/wD8jUfVuFf+gqt/4Ih/80hev/Kvvf8Ake40 V4d/w7F/4Jsf
9I9fgd/4abR//kaj/h2L/wAE2P8ApHr8Dv8Aw02j/wDyNR9W4V/6Cq3/AIIh /wDNIXr/AMq+
9/5HuNFeHf8ADsX/AIJsf9I9fgd/4abR/wD5Go/4di/8E2P+kevwO/8ADTaP /wDI1H1bhX/o
Krf+CIf/ADSF6/8AKvvf+R7jRXh3/BMX/lGx+z1/2Q7wn/6Z7Wvca8/NsD/Z ea18Hzc3spyh
e1r8snG9ru17Xtd27lU589NS7q4UUUV55YUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRR
QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV4d+yb/wAl6/ad/wCy46f/AOoJ 4Tr3GvDv2Tf+
S9ftO/8AZcdP/wDUE8J19Bk3/IuzL/rzH/1Iw5lU+OHr+jPcaKKK+fNQoooo AKKK4f4zftF/
Cz4C/wBm2/j261y4vtY85tN0Twp4P1PX9Snih2Ca4FlpdvcXP2eJpYEkuDH5 Ub3MCO6tNEr9
GFwmKx1dUMNTlOb2jFOTdld2Su3ZJv0FKUYq7dkdxRVHwx4n8NeNvDWneM/B niGx1fR9XsYb
3SdW0u7S4tr22lQSRTwyxkpJG6MrK6kqysCCQa5X4cftL/AH4w/Erxd8IPhR 8XND8SeIvAX2
ZfGenaHfLdf2NLPNdwJb3EkeY47gSWN0r25bzY/LBkRBJGWqOBxs4VZxpSap azfK7QTkormd
vdvJqOtveaW7FzRTSvvsdxRRRXKUeHeAf+Uk/wAWf+yHfD3/ANPHjSvca8O8 A/8AKSf4s/8A
ZDvh7/6ePGle419BxN/yMaf/AF5w3/qPSMqPwP1f5sKKKK+fNQooooAKKKKA CiiigArw7/go
V/yQXQP+y4/DH/1O9Br3GvDv+ChX/JBdA/7Lj8Mf/U70GvoOE/8AkqsB/wBf qX/pcTKv/Al6
P8j3GiiivnzUKKKKACiiqPh7xP4a8XWEmq+FPENjqlrFfXVlLc6ddpPGlzbT yW1zAWQkCSKe
KWKRPvJJG6MAykClCbg5W0Wl+l3e332f3MC9RVG48Q2Ft4ltPCklvfG6vbG4 u4ZY9Lne2WOB
4EdZLlUMMUhNxGUid1klVZWjV1hlKXqJQnFJtWvqvNXtp8016oAoorD0/wCJ HgvVPiVq3wgs
dZ8zxFoeh6drGq6d9mkHkWV9NewWsvmFfLbfJp14u1WLL5OWCh0LVCjVqRlK EW1FXbS2V0rv
srtK76tLdoTaRuUUUVmM8O/4Ji/8o2P2ev8Ash3hP/0z2te414d/wTF/5Rsf s9f9kO8J/wDp
nta9xr6Diz/kqcf/ANfqv/pcjHD/AMCHovyCiiivnzYKKKKACiiigAooooAK KKKACiiigAoo
ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK8O/ZN/5L1+07/wBl x0//ANQTwnXu
NeHfsm/8l6/ad/7Ljp//AKgnhOvoMm/5F2Zf9eY/+pGHMqnxw9f0Z7jRRRXz 5qFFFFABXzl+
0r8Tvhr8B/23vhV8Zvjj8Q9D8GeD4fhV440WbxX4r1aHTtNTUrrUvCk9tZG6 uGSIXE0Nleyx
wlt7paTsoIicr9G0V6mT4+lluO9tVg5xcakGlLldqlOVN2k4ySaUrq8XtsRU g5xsn2/B3PAP
2BvE/hr4S/sJfBL4XfFTxDY+GfE3h74OeBrLX/DviC7Syv8ATLm8tIdPtILi 3mKyQyT3sMtr
EjqGknieJQXUqL3gH/lJP8Wf+yHfD3/08eNK9xoruxWewxGIx9b2VpYq9/e0 i3Vp1Xb3ddYN
b7SWt4vmiNLljFX+H/JoKKKK+dNjw7wD/wApJ/iz/wBkO+Hv/p48aV7jXh3g H/lJP8Wf+yHf
D3/08eNK9xr6Dib/AJGNP/rzhv8A1HpGVH4H6v8ANhRRRXz5qFFFFABRRRQA UUUUAFeHf8FC
v+SC6B/2XH4Y/wDqd6DXuNeHf8FCv+SC6B/2XH4Y/wDqd6DX0HCf/JVYD/r9 S/8AS4mVf+BL
0f5HuNFFFfPmp8j/ALU3jn4D2X7XOqeFP21v2nL74aeBbb4caDd/DuWT4z6h 4FttT1aa/wBa
TWVjubK+sjqUkUEGiF4pHmFqs8TKsX2tjL478dvjLoGn+HfjLrHjH9rTxzp/ xm0DQ7aT9mHw
3r/jy/8AC2seKv8AikdLutOmHhWF7G31m4uPEEuoxPDNp0nm3Cy2DRbLcWsX 6NUV+hZVxvhs
u9k5YecuSEY8qqpQXK6bk4R9lJw9ryNV0pNVeeV91bknhnO+v4evn06dj4d+ IWr/ABK0b40f
F742Wfxx8ci48JftVfDnwl4W8Of8JNMui6bpurW3gi21SP7CpEVz9ph1W6G2 5EyW8h+0Wq21
xJNNL44NA0f4RfDOw+AepftX33wb0FPjH8Vb7xP4u+JnxO8Qx2FrqKeJUfR9 MubiLW9Mv47y
90i+XU7eM6kkNzALq+ks72W4S9t/1ForswHiPPBYalR+r6Q5NYzjF/u6HsYa OnKPuzlUrpOM
l7Sbk7tyc5ng1KTd+/4u/f0Xoj8utX/aV+N7fsp65DB+03fazrHhb9mT4/lN e8M65cwLM2ma
poZ8N6qpN1POZDo13ZXdpdzzz3MltqMdz9pnN0biX1X9o7X/AI3/ALPKfGj4 T/DH4t+Ktetd
O8K/C/xBq2p+MvG9zDJGur+K9VsPE1/LqcUUj6BZvpWn75ZLCKG20uOKa6tI LZlY194UVVXx
Ewc6kGsvjyqpKpKPNG0nLEQr292nG0UoypJL7M/KzFhJJP3+lvwt3+Z+cvw4 +LnxBb4HfE/X
fAHx50O8+HcGufD+11LUPh/+0Fr/AMQotDsrjxEYfFd5J4p1K0gksMaG8TyR W9yW0yK3+35s
2uUnl9U/YD1f4L6x+298Z5f2efjjrnxB8HxfCrwDHo+u6t4mudet1/4mXi5p YbLV7kyS6pbr
M0hMzXN15U73FqJUFqLW3+xqK48z45w2Py/G4WnhZQ+scv8Ay95krfV3efNT 5qkv3DtPnjJe
1ndyvLmqGGlCcW5Xt5evnpv+CCiiivzs6zw7/gmL/wAo2P2ev+yHeE//AEz2 te414d/wTF/5
Rsfs9f8AZDvCf/pnta9xr6Diz/kqcf8A9fqv/pcjHD/wIei/IKKKK+fNgooo oAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC iiigAooooAKK
KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArw7 9k3/AJL1+07/
ANlx0/8A9QTwnXuNeHfsm/8AJev2nf8AsuOn/wDqCeE6+gyb/kXZl/15j/6k YcyqfHD1/Rnu
NFFFfPmoUUUUAFFFFABRRRQAVyvxq+L/AIa+A/w7ufij4zsb6XR7C+sYtWub GJGXTra4vIba
XULhpHRIbO1SVrq5nZgsNtbzynITB6qqPifwx4a8beGtR8GeM/D1jq+j6vYz WWraTqlolxbX
ttKhjlgmikBSSN0ZlZGBVlYggg10YSWGhiqcsRFypqS5knZuN9Un0bWzFK/K 7bngGofEjwX8
G/23vj18X/iRrP8AZvh3wp+zl4I1jX9R+zSTfZbK21LxvPPL5cStI+2NGbai sxxgAkgV7/4Y
1a/1/wANadruq+GL7RLq9sYZ7nRdUkge5sJHQM1vM1tLLC0iElGMUkkZZTtd 1wx/PP4BfDf4
/fEP/gpP4h/Za+Luja5e+FfhL4G8BT+J/HmuXLSv4yi0XWPEt94VBmmZLm6u JWvLC+vdQhCx
f2l4a1C0aNoLoZ/RqvtuPcuweVY2jRjUVSpKlQlzRd4+z+r0o09N1KdpTalf 3HSaabkjmws5
VIt2srv77u/+XrcKKKK+BOoKKKKACiiigAooooAK+ZP2sfi/4a+MH7OsdzoV jfWF14c/ab8B
eH9a0nVokiu7S5tPiFocavJErsY47iDyL23LYaW0vbWbaFmWvpuvg/8A4K3W 3xZ/Z8TTfjP8
BfhBfeNo/iN8R/h9Y6x4O025FrHL4p0zxXpV3pF7LOyiCxjvLaCfS7rULjzG MkXh+FVEcTkf
ceHmBoZlxVhcO2o1fa0pQbkoxvGcXKMnJqKThzNSbXvRS2kzmxcnChJ9LO/3 H2N4L+L/AIa8
f/ETxl8O/DVjfSyeBL6z07XtTkiRLZdRuLOK+NlHl/NeSO0ubGd38sQ7b6JU kkkS4jh6quH/
AGbvgz/woD4L6N8MbvxJ/bmqW/2m+8TeIfsf2b+2tavbmW91PUfIDutt9pvr i5uPIRvLh87y
4wqIqjuK+VzKOBhjpwwbvTjopa+9ZJOdnZx52nJResU+W7td7w5nFc2/9fkF FFFcJQUUUUAF
FFFABRRRQAUUUUAeHf8ABMX/AJRsfs9f9kO8J/8Apnta9xrw7/gmL/yjY/Z6 /wCyHeE//TPa
17jX0HFn/JU4/wD6/Vf/AEuRjh/4EPRfkFFFFfPmwUUUUAFFFFABRRRQAUUU UAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV4BN+zl+1z4J+MXxI+I XwD/AGk/hxpG
j/EXxVa+ILnR/F/wgv8AV7myuYtF0zSWRbm21+yR42TTI5ADCGVpWG5gAa9/ or0stzbG5TKo
8Py/vI8slKEKiceaM7WqRkvijF3Svpa9m7xOnGpa/Tza/I8O/wCEB/4KT/8A R2XwO/8AEetY
/wDmto/4QH/gpP8A9HZfA7/xHrWP/mtr3Giu7/WXMf8An3R/8JsP/wDKifYw 7v73/meHf8ID
/wAFJ/8Ao7L4Hf8AiPWsf/NbR/wgP/BSf/o7L4Hf+I9ax/8ANbXuNFH+suY/ 8+6P/hNh/wD5
UHsYd397/wAzw7/hAf8AgpP/ANHZfA7/AMR61j/5raP+EB/4KT/9HZfA7/xH rWP/AJra9xoo
/wBZcx/590f/AAmw/wD8qD2MO7+9/wCZ4d/wgP8AwUn/AOjsvgd/4j1rH/zW 14Z/wUg+GP7S
mufsmT+F/wBq74nfCrx54P1n4p/DXT7zw3ofwhvNL+0+b4/8Oo63DXmt6hFP btCZo3gMI3+Y
CXAUo/3JXzh/wVY/5NL0/wD7Lh8Lf/U/8P1M8+x2KXspwpJSsnahQi/lKNNS XqmmRUpRjTk0
3s+r/wAzx/8A4dlf8E3P+kfPwP8A/DT6P/8AI1H/AA7K/wCCbn/SPn4H/wDh p9H/APkavb6K
9r2VL+VfcfD+2rfzP7zxD/h2V/wTc/6R8/A//wANPo//AMjUf8Oyv+Cbn/SP n4H/APhp9H/+
Rq9voo9lS/lX3B7at/M/vPEP+HZX/BNz/pHz8D//AA0+j/8AyNVLxF/wTq/4 Jg+EtAvfFHiT
9gv4F2en6dayXN7dzfCnRwkMSKWZz/o3QAE175Xl/wC2h4A8Y/E79mHxd4O+ H6SPrM1jFcWE
MGPMmeCeO48pM8F3ERRQeCWGSOtY4lRo4adSEE2k2lbdpaImeIrxg2m20trn z/Z/smfsp+Id
BX4k+Cv+CHHwy1Hwa8RuIdVl+HOiQXs1uOsqWhsiOQGIDSrwBu2HIX0P4afs I/8ABLD4t+CL
D4geCv2BvgnPp+oRkx+d8ItIjlidWKPFIjW2UkR1ZGU8hlIrzzxz8avh38Z7 3wX8aF/bo8Qf
Dmx8N+AY9G8TeE9M064i1SK9t4pI5Ps5MZi2yOQrb2TaqHdg8L6t/wAE5vA3 jfwd+z2+o+PG
vRc+ItfuNVtYtRjCTpbvHFFGXUAbd4hMoGAcSjIByB8pkOZYvGY50qtpRs3e 0dNuy0Tvazu/
PczWLm6yjTm5K2/Mn21stUtbWevnozwzxb4G/wCCYHhaw8S+P4P+CNXhXVPh x4OvtVg8T/FT
T/hV4LGk6fHpU81vq1wbaa7j1OSOzmtbtJBFZPJKbVzbpcK8TSe/f8Oyv+Cb n/SPn4H/APhp
9H/+Rq8P+KfiO98A6r411j9n/wCHPxw8C/G1Nc1p/D3gzQfD3iPWvA3im7N1 cSaeLl5LKXw/
YW+rOLO9vbq2ksrq3e8uVmvoJftkjHx40j4k6H8SfiN8L7H4H+ONZvPHf7U/ wy8Z6XqWieGp
rjTbbw9ZTeCre61C4vQBAnlXGkXkb2qu14iKLlrdbQPdJ9QuSKbcU/kvPy/B 7HotVJNJSa+b
8vPzvdaPsj3D/h2V/wAE3P8ApHz8D/8Aw0+j/wDyNR/w7K/4Juf9I+fgf/4a fR//AJGr5J+D
vgL4eeI7q8n8Afs3eKh8aR+1rrt7o/xKm8H3l1HH4ct/iddy6ulnr6rLbaRZ nTYtWgl017i0
e4ke7xaynUUkvDw9+z/8T7n9q2S78V+GrGy+IQ+Pt1rEXizT/wBlvWLrxK3h xfFEl5bwHx8+
oxaYtm+hCK1khyXisHfTVt5bhBbOlODSaprX0+7bfyDkqJu9R6ev377eZ9bf 8Oyv+Cbn/SPn
4H/+Gn0f/wCRqP8Ah2V/wTc/6R8/A/8A8NPo/wD8jVR/4J+fBGw+Fvgnxz4v 1XwLfaV4m8V/
GLx1d6pdawk/2m4sf+Ev1uXT1jE5JiszBcG5hiiCwM17NcKpe6lkk99rohTp ygm4pHPOpVjN
pTbseIf8Oyv+Cbn/AEj5+B//AIafR/8A5Go/4dlf8E3P+kfPwP8A/DT6P/8A I1e30VXsqX8q
+4j21b+Z/eeIf8Oyv+Cbn/SPn4H/APhp9H/+RqP+HZX/AATc/wCkfPwP/wDD T6P/API1e30U
eypfyr7g9tW/mf3nk3/BPD4F/BL9n39v/wCOfgz4C/B3wr4I0e5+Dvw5vbnS vCHh62022luW
1XxojTtFboitIUjjUuRuKxqM4UY+2a+UP2Tf+Ukfxs/7If8ADf8A9PHjevq+ vkscksXNLufa
Ze28HBvsFFFFch2BRRRQAUUUUAeHf8Exf+UbH7PX/ZDvCf8A6Z7Wvca8O/4J i/8AKNj9nr/s
h3hP/wBM9rXuNfQcWf8AJU4//r9V/wDS5GOH/gQ9F+QUUUV8+bBRRRQAUUUU AFFFFABRRRQA
UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFF
FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRXnH7Rf7 RcP7PkPhG1tf
hH4q8cax448VN4f8PeHvCD6alzLcrpt9qTuz6leWkCRrbadcsSZdxYKqqS3H VgsFiMwxCoUF
eTu9WkrJOTbcmkkkm220kk22TKSgrs9Horw7/hrL49f9Ixfjj/4P/An/AM01 H/DWXx6/6Ri/
HH/wf+BP/mmr1v8AVrMf+flH/wAKcP8A/LSPbQ7P7n/ke40V4d/w1l8ev+kY vxx/8H/gT/5p
qP8AhrL49f8ASMX44/8Ag/8AAn/zTUf6tZj/AM/KP/hTh/8A5aHtodn9z/yP caK8O/4ay+PX
/SMX44/+D/wJ/wDNNR/w1l8ev+kYvxx/8H/gT/5pqP8AVrMf+flH/wAKcP8A /LQ9tDs/uf8A
ke4184f8FWP+TS9P/wCy4fC3/wBT/wAP1vf8NZfHr/pGL8cf/B/4E/8Ammrx r9vr43/Ez4lf
s4WuheM/2O/iP8PbWL4w/C+ePWvF+qeGp7aaQfELw4ot1XStYvJhIQzOC0ax 7Y2y4YqrTLIc
dhl7Wc6TSt8NehJ79IxqOT9EmyKlWMqckr7Po/8AIxv+GUPjz/0k1+OH/gg8 C/8AzNUf8Mof
Hn/pJr8cP/BB4F/+Zqj/AIT7/gpH/wBGofA//wASD1j/AOZOj/hPv+Ckf/Rq HwP/APEg9Y/+
ZOvX/d/3v/Jj4v8Ae/3f/JQ/4ZQ+PP8A0k1+OH/gg8C//M1R/wAMofHn/pJr 8cP/AAQeBf8A
5mqP+E+/4KR/9GofA/8A8SD1j/5k6P8AhPv+Ckf/AEah8D//ABIPWP8A5k6P 3f8Ae/8AJg/e
/wB3/wAlD/hlD48/9JNfjh/4IPAv/wAzVH/DKHx5/wCkmvxw/wDBB4F/+Zqj /hPv+Ckf/RqH
wP8A/Eg9Y/8AmTo/4T7/AIKR/wDRqHwP/wDEg9Y/+ZOj93/e/wDJg/e/3f8A yU5u/wD+Cd2u
6r4pHjjVP24/iZc60sqSLrFx4F+Hr3QdQAreafC+/IwMHORiuk/4ZQ+PP/ST X44f+CDwL/8A
M1R/wn3/AAUj/wCjUPgf/wCJB6x/8ydH/Cff8FI/+jUPgf8A+JB6x/8AMnUR p4eDbimr/wCI
Eqi25f8AyUP+GUPjz/0k1+OH/gg8C/8AzNUf8MofHn/pJr8cP/BB4F/+Zqj/ AIT7/gpH/wBG
ofA//wASD1j/AOZOj/hPv+Ckf/RqHwP/APEg9Y/+ZOr/AHf97/yYP3v93/yU w/h7+wR8RfhX
oNx4Y8Bf8FHPjhYWN1rmp6xPB/ZPgmXde6jfz6heS7pPDjEeZdXM8m0Hau/a oVQqjc/4ZQ+P
P/STX44f+CDwL/8AM1R/wn3/AAUj/wCjUPgf/wCJB6x/8ydH/Cff8FI/+jUP gf8A+JB6x/8A
MnSSpJWV/wDyYbdVu75f/JQ/4ZQ+PP8A0k1+OH/gg8C//M1R/wAMofHn/pJr 8cP/AAQeBf8A
5mqP+E+/4KR/9GofA/8A8SD1j/5k6P8AhPv+Ckf/AEah8D//ABIPWP8A5k6f 7v8Avf8Akwv3
v93/AMlD/hlD48/9JNfjh/4IPAv/AMzVH/DKHx5/6Sa/HD/wQeBf/mao/wCE +/4KR/8ARqHw
P/8AEg9Y/wDmTo/4T7/gpH/0ah8D/wDxIPWP/mTo/d/3v/Jg/e/3f/JQ/wCG UPjz/wBJNfjh
/wCCDwL/APM1R/wyh8ef+kmvxw/8EHgX/wCZqj/hPv8AgpH/ANGofA//AMSD 1j/5k6P+E+/4
KR/9GofA/wD8SD1j/wCZOj93/e/8mD97/d/8lOk/YG8J694H/bw+L/hbxP8A E3XPGV9a/A/4
d+f4k8SW9hFe3m7XPHTr5i6fbW1uNisI18uFPlRS25tzt9l1+RXx5/4KB/tj /sG/Fz4w/G3w
5+wp/wAJv4wufgf4HTX4/B/iK41fQPBsUOoeP5otRvZvsdteXFuFjjkcC2t4 lCzI91CfIaf8
ef2vf+Csv7fn7bfxKsfiR8Zv2idct/7D1yLVvCmgeGLyTTNN8PXcM00trPaQ QMMXEHnukd3I
ZLoIFVpm2g1+seGP0deKfFiNTMaOIpYfCJtc8mpzclpb2UXzLX/n44ae9HmR 7f8Aa9HAYWEG
m5W6aL79vuuf190V+AX/AARu/wCDgr/gph4q+JWhfssePPgNrn7R9i32WD7d odsI/Euj2Rms
rP7XcXeBbXFvEpYvLfeUzzXIae/jWv2M/wCGsvj1/wBIxfjj/wCD/wACf/NN XxPH3g3xb4d5
3/Z2ZToNtXjJYilFSj35ak4TX/b0V5XWp6eFzGhi6fPBP7n+l0e40V4d/wAN ZfHr/pGL8cf/
AAf+BP8A5pqP+Gsvj1/0jF+OP/g/8Cf/ADTV8R/q1mP/AD8o/wDhTh//AJad Ptodn9z/AMj3
GivDv+Gsvj1/0jF+OP8A4P8AwJ/801H/AA1l8ev+kYvxx/8AB/4E/wDmmo/1 azH/AJ+Uf/Cn
D/8Ay0PbQ7P7n/kH/BMX/lGx+z1/2Q7wn/6Z7Wvca8q/YU+G/jT4N/sRfBv4 QfEjRv7N8ReF
PhV4e0fX9O+0xzfZb22023gni8yJmjfbIjLuRmU4yCQQa9VrPiarSxHEmNq0 pKUZVqjTTumn
OTTTWjTWqaCgmqMU+y/IKKKK8M1CiiigAooooAKKKKACiiigAooooAKKKKAC iiigAooooAKK
KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAOH/aL/aA8 F/sxfCyX4v8A
xB0nXL7S4Nc0fS5Lbw3o8moXrS6lqdrpsBjtocyz4mu42aOJXlZQwjjkfbG3 nHjL/goBofge
HxBrWr/s3fEeTQfAVjDP8WfEdu+hm28CSHTbfVLm3vYzqguLuS1sLq3uZTps V7Gyy7IHnlVo
19H/AGhfgz/wvjwFp/gj/hJP7K+w+OfDHiL7V9j8/f8A2Pr1hq3kbd6Y877F 5O/J2ebv2vt2
N8//AB7/AOCU/gT4z/Hjxb8Xjo/wcvI/H99a3fia/wDiH8BrHxP4hsJItPtd NK6TqN1crBZx
i2soZIormyvY47p55XWaOX7Ov3nCtPgapQSzqbhO87u1SSsnQ5ElC1m0675r ytKMOaPLdT5a
7xKf7tdu3nff5fiX/Cn7dXj2y+OPxi8NeOfgr45vG0P4q6d4A+Fng3SBoIbx DcL4dXXbiaGW
S/UJcNavdXjteXFtB9ihsIokW+N3C/Vat/wUL8CaDoelrrHwN+I6eLNR+I7e BJvh5aaVY3mr
WGvNoc2uW9tO9reSWflzWKQSC5S5e3gF5GbmW2SK6e3w/j3/AME3PDXxyfxb qmu654V1e61v
4x2vxC0XR/HvgBNd0GC5i8KWvhprW/09rmE6hH5EM9zGyzW7R3D27fOsDLNe +Df/AAT90n4T
2Xw+bTtU8DaLN4N+Kt543v8ASfhv8LbXw1ot3LP4b1DQRb29nBNJJB+7vI7h 57ie7leSKRA0
cLQxW3r4ip4cYjAwxDaVVUo3pxjVj+9jQSsp+9HklNe9ePO6jlP2vs/deaWM UrdL76bX/O3y
tpa5uf8ADdXhT/hK/L/4Ur45/wCEG/4Tn/hD/wDha2NK/sX+2v7V/sX7L9n+ 3/2p/wAhf/iX
+Z9h8vzP3u/7N/pNHwx/b1+GvxR+JVv8P7H4aeOdKs77xzr/AIL0rxXrmjQw abqPiLR5tRW6
0+3InaebNvpd5dJdLCbMpEYWuEu1e0Xzjw9/wSn8CeGP2hJPizpuj/ByXT5f iPdeNG1rUfgN
Y3njgX9xqkmrSRjxBPcvEsYu5GijcWAniswkUcqTol6vo/hP9jL/AIRf/hAP +Lkef/wg3xx8
X/ET/kD7ftv9uf8ACS/6D/rj5fkf8JD/AK75vM+x/wCrTzf3fLmFHw5p4WX1 Wq5zcWo6VY2/
d1HHmT5lKp7RU4zlFxptSvGnBRk3UHjHL3l+Xdfha/n5lHw9/wAFC/AmpeBJ Pjj4q+BvxH8O
fCuXwrdeJdI+K+o6VY3mk6lpMNjJqC3gg068udRtI5bKKSeM3tpbHISBwlzL DbyXrb9urwp4
X/t3/ho74K+OfhH/AGH4G1bxh/xWY0q++26LpXkf2ndQ/wBh3+oY+zfa7PdH J5ckn2lPJSbZ
L5fK+Hv2DPiy37Pcn7FHjz9pyxm+DVt8OLrwPpek+GPAQsPEM2ktpcmlW632 p3V5dwTyR20g
lZ7aytDJdQwuNkHm2kuF8N/+CU/gTSfDXxA8KeOdH+Dmg2vj34car4LvZfgL 8BrHwZcmw1JF
S5kmuZrnUZppEEaGFEeKBWaRporlvIMHTLDeGj9rz17LmsuRV3Jwv7rjKaUY 1LXdVThUhLRU
nTbbS5sZpp99t/l07bPvc5X9rT9vX9ofw1/wmdj4X+Gnjn4T6p4e/ZV+JvjS 30rxno2kXfm6
lpv9hjStQhurKe+s5vKa4v1a188uu5GuLcJLavJuftk/8FFfGnw9/wCCXOt/ tLfC3wh/ZnxS
1PQ9a0fSfC/9oRzf2D4n0y11B9bi+0zW5trr+yV0nWLjcyCG9/svy4S32mHf u/Fb9gX4/ftF
f8JRqf7QH7WWh3t9r/wO8Y/DawtPCnwxbTdN0yLXv7NJ1IQz6ldXMtxG1gRI jXPlSp5AjS2a
OaS53Pjh/wAE6vBfxh1/41eJ7Pxf/ZF98XvhVqXhOKf+z5Lj+xr3UrCHT9S1 PabhRcefa6Z4
dj+z4jWP+xN0bK15cs3q4XMPDSkstWKhTbozc6ns4VXGa9pG1KXPGM505KXN JtucYU5U4Pmm
mZuGMfPyt66K9u2+ml/wu79Cj+1P/wAFX/2Zf2PPizN8K/jPDfWC2FjBe6vr d34g0HTo7W2c
F2ngstR1K21LVY0jBJfTbS8WSRZLeIy3UM1vH1Wrft6/DXRvjRr/AMH7z4ae ORb+EvHOkeEv
FPjT+xoV0XTdS1a202XS4/NacS3P2mbVbW1220Uz28h33S21vJDcS4fxq/Yj +JXxIufir4L8
G/HTQ9F8A/HPf/ws7R9T8DTX+sHz9GtNDuv7L1BNRghst1hY2/l+fZ3fl3Bl lbzY2W3S9L+x
V4l13w14utfGfxesbjWPGnxj8FfELVr/AEvws9tbRXOhJ4ZEtrDBJdyusdy/ h1mVmlZoFvQp
84w7pfEp0/Dh4LDc8mqnJFVLOq/elKhzTt7NJSpxeIsoylBuNJtS96EtW8Zz O219NvPz66fj
6nVaR+178Ndb+C/gb4zWOh643/Cfa5pmi6V4U+zQnWrXUrm5EF1ZXFqJTsuN O2Xkt/CrM9pH
pl8zA/ZnFeq18yfs0/Bqw8d/tG69+0xpWieKtL+HkN9dan8PPC/jDRZ9JaHx DqMMUOt6rDpN
3BHNYRkWwEEsscF09zrHiWZllt9Rglk+m6+V4kweWZfi1Qwl7/FJPeDlqqT/ AL1ONoze/PzR
aXKbUZTnG8v+H8/n08gr5H/Yj+Pfx48ceJfgvrvxL+LV94ktfjx8AL34jalo uoaVp8Ft4Wv4
X8OstlpTWltDN9jI164Qi9kvJ9trbYmDCZpvrivnL4E/sR/Er4H/APCP/Zfj poeo/wDCsPhV
e+APgx5ngaaL+zdNn/s7bNrWNRP9r3C/2NpuWtv7NRsXXyL50f2fs4exOS0s sxdLGuCnK3Lz
Qcn/AA6y92ShJwtUlSlJ3i3GLXvfC5rRqucXH+tV+ly9+3d40/b28KWHhe3/ AGFvg1Y+Lrqa
+a88TLqOsWOmxxW1lPa3ptBdXUkhWTUIILvTI1SzlVZNQS5e6s1tMXHsfwxv vGmqfDXw9qfx
I077H4iudDtJdftPsUdt5F60KGdPJiuruOLEhYbEublVxgTzACRr2k2/iWG/ 1STXdWsbm1lv
lfRYbTTngktbbyIVaOd2mcXEhnWeQSKsSiOSOPyy0bSy3q8nFZnTq5VRwEaF KLptydWMZe0n
za2nKUrNQ+FKMYrS/vfE9IwaqOV3r06L0CvDv2sv+S9fsxf9lx1D/wBQTxZX uNeHftZf8l6/
Zi/7LjqH/qCeLK6OGv8AkYz/AOvOJ/8AUeqTX+BesfzR7jRRRXz5sFFFFABR RRQAV8xf8Ff/
ABP4b8E/sT/8Jn4z8Q2OkaPpHxi+GV7quq6ndpb21lbRePNAeWeWVyFjjRFZ mdiFVVJJAFfT
tFVGXLJS7EyjzRce58If8PNf+Cbn/SQb4H/+HY0f/wCSaP8Ah5r/AME3P+kg 3wP/APDsaP8A
/JNfd9fFf/BbDxP4l8e/sjfEv9mX4d+Ib7TpB8HPEvjL4hatpF28M2naHp9h cSWlmZYifJk1
LUY4YBFMnlXen2euorrJCK+24YjiOJM9oZcmqaqSSlNptQjfWVrq9ltG65pW indo+erZNRo0
nPmbsYn/AA81/wCCbn/SQb4H/wDh2NH/APkmj/h5r/wTc/6SDfA//wAOxo// AMk19NfshfEj
xp4z+Gt94B+Lus/2j4++G+uS+E/Hmo/Zo4f7SvbeGGe31Py4VEMP9oWFzYal 9nhLrbf2h9mZ
jJBIB6rXm5hjcVl2MnhqkYtxe6b5ZLdSi2leMlaUZW96LTWjLhklGcVJTf3I +EP+Hmv/AATc
/wCkg3wP/wDDsaP/APJNH/DzX/gm5/0kG+B//h2NH/8Akmvu+iuP+2qv8iK/ sGj/ADs+EP8A
h5r/AME3P+kg3wP/APDsaP8A/JNH/DzX/gm5/wBJBvgf/wCHY0f/AOSa+76K P7aq/wAiD+wa
P87PhD/h5r/wTc/6SDfA/wD8Oxo//wAk0f8ADzX/AIJuf9JBvgf/AOHY0f8A +Sa+n/2yfjX4
q+AP7PGseOvh5p+n3Piu/wBQ0rw34Ij1qJ304a/rOpWukaU98InST7Ct9fWz 3JiJlFuspjV3
Co3mH7LHgD/hib9o4fsWWHjXxB4m8MeN/h/J4y8Kap4l1L7bqUeq6S2maZ4i kvJQsUY+3S3+
kanujjZ7jUr7X7md0M0Ksf21V/kQf2DR/nZ5f/w81/4Juf8ASQb4H/8Ah2NH /wDkmj/h5r/w
Tc/6SDfA/wD8Oxo//wAk1930Uf21V/kQf2DR/nZ8If8ADzX/AIJuf9JBvgf/ AOHY0f8A+SaP
+Hmv/BNz/pIN8D//AA7Gj/8AyTX3fRR/bVX+RB/YNH+dnwh/w81/4Juf9JBv gf8A+HY0f/5J
o/4ea/8ABNz/AKSDfA//AMOxo/8A8k1930Uf21V/kQf2DR/nZ8If8PNf+Cbn /SQb4H/+HY0f
/wCSaP8Ah5r/AME3P+kg3wP/APDsaP8A/JNfd9FH9tVf5EH9g0f52fE3/BPD 46fBL9oL9v8A
+OfjP4C/GLwr430e2+Dvw5srnVfCHiG21K2iuV1Xxo7QNLbu6rIEkjYoTuCy KcYYZ0/2vf8A
gg1/wTP/AG0fiVY/F/4kfAz+w/EUeuRajr+o+CLw6V/wkiiaaeeDUI4h5cv2 iSdmmukWO9ba
gFyoUCvsait8n4r4i4czKWPyjFVMNVejlTnKDafR2auvJ+p6kcHR+rxozSkl 3Rw/7PP7NHwB
/ZO+Gtr8IP2bvhHofg3w7a7G/s7Q7FYvtEqwxwfaLiTmS5uGjhiV7iZnlk2A u7Hmu4oorxsX
i8Vj8TPEYmpKpUm7ylJuUpN7tt3bfmzpjGMVaKsgooornGFFFFABRRRQAUUU UAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFeAftya3N4
J8b/AAD+Kd14O8Vavo/hX4x3N74hbwh4N1LXbmytpfCHiSySdrXTYJ5zGbm7 toi4jKq0y7iA
c17/AEV6WU4+GW43204c0XGcGk+VuNSEoSs7Ss7SbTaava6a0IqQ5429Pwdz w7/h4V8Bf+hB
+OP/AIjF47/+U1H/AA8K+Av/AEIPxx/8Ri8d/wDymr3Giu76zwr/ANAtb/wf D/5mJtX/AJl9
z/zPDv8Ah4V8Bf8AoQfjj/4jF47/APlNR/w8K+Av/Qg/HH/xGLx3/wDKavca KPrPCv8A0C1v
/B8P/mYLV/5l9z/zPDv+HhXwF/6EH44/+IxeO/8A5TUf8PCvgL/0IPxx/wDE YvHf/wApq9xo
o+s8K/8AQLW/8Hw/+ZgtX/mX3P8AzPDv+HhXwF/6EH44/wDiMXjv/wCU1H/D wr4C/wDQg/HH
/wARi8d//KavcaKPrPCv/QLW/wDB8P8A5mC1f+Zfc/8AM8O/4eFfAX/oQfjj /wCIxeO//lNX
gH7W/wAY/gp4u/Zl/aWsvhZ8Nfj/AOIPHXxg+HGq6Zp9vqX7N/jQMkg0F7Cx 0q2mk0VBb2Yn
aa4WKSTy0udSvZty+e+PvCivSyrPshybGRxOHw1a6cW068LS5JxqJO2HTtzQ i3Zp6bkTpVak
bOS+5+ncw9P+G/gvS/iVq3xfsdG8vxFrmh6do+q6j9pkPn2VjNez2sXllvLX ZJqN425VDN52
GLBEC7lFFfI1a1WvLmqScnZK7d9IpJLXokkkuiSS0N0ktgooorMYUUUUAfMH 7U2p/tAW/wC2
T8PvFmn/ALGPxA+JHgL4eeH7vW9BuPAut+GYvM8WXqXOm+dOuraxp00P2LS3 volVRcQXX/CQ
OzCKXT4Wfy/4vftX/Hn9rz4Z6L8Uv2af+CZPxwl8V/DH4oXd94O1LVtf8C21 r/bOj3t9oms6
ZMW8SsY4rm3/ALZ0lrryLgQLeG8gimeGAn7vrwD/AIJp/wDJuviP/s4D4sf+ rD8Q0Ae/0UUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABR
RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRXyB4t/ZO/ZY/ag/4Km/FD/hpf9mn4f8AxE/s P9n/AOHf9if8
J14NsdX/ALP87XPG/neR9qik8rzPKi3bcbvKTOdox6B/w6d/4JZf9I0/2f8A /wAM3of/AMi0
Ae/0V4B/w6d/4JZf9I0/2f8A/wAM3of/AMi0f8Onf+CWX/SNP9n/AP8ADN6H /wDItAHv9FeA
f8Onf+CWX/SNP9n/AP8ADN6H/wDItH/Dp3/gll/0jT/Z/wD/AAzeh/8AyLQB 7/RXgH/Dp3/g
ll/0jT/Z/wD/AAzeh/8AyLR/w6d/4JZf9I0/2f8A/wAM3of/AMi0Ae/0V4B/ w6d/4JZf9I0/
2f8A/wAM3of/AMi0f8Onf+CWX/SNP9n/AP8ADN6H/wDItAHv9FeAf8Onf+CW X/SNP9n/AP8A
DN6H/wDItH/Dp3/gll/0jT/Z/wD/AAzeh/8AyLQB7/RXgH/Dp3/gll/0jT/Z /wD/AAzeh/8A
yLR/w6d/4JZf9I0/2f8A/wAM3of/AMi0Ae/0V4B/w6d/4JZf9I0/2f8A/wAM 3of/AMi0f8On
f+CWX/SNP9n/AP8ADN6H/wDItAHv9FeAf8Onf+CWX/SNP9n/AP8ADN6H/wDI tH/Dp3/gll/0
jT/Z/wD/AAzeh/8AyLQB7/RXgH/Dp3/gll/0jT/Z/wD/AAzeh/8AyLR/w6d/ 4JZf9I0/2f8A
/wAM3of/AMi0Ae/0V4B/w6d/4JZf9I0/2f8A/wAM3of/AMi0f8Onf+CWX/SN P9n/AP8ADN6H
/wDItAHv9FfCHgH/AIJk/wDBNu8/4KSfFjwLef8ABPn4Hy6Jp3wP+Ht/p+jS fCfR2tbW6udY
8aR3FxHEbbYksqWtqjuoDOttCGJEa49w/wCHTv8AwSy/6Rp/s/8A/hm9D/8A kWgD3+ivAP8A
h07/AMEsv+kaf7P/AP4ZvQ//AJFo/wCHTv8AwSy/6Rp/s/8A/hm9D/8AkWgD 3+ivAP8Ah07/
AMEsv+kaf7P/AP4ZvQ//AJFo/wCHTv8AwSy/6Rp/s/8A/hm9D/8AkWgD3+vA P+Caf/JuviP/
ALOA+LH/AKsPxDR/w6d/4JZf9I0/2f8A/wAM3of/AMi0f8Onf+CWX/SNP9n/ AP8ADN6H/wDI
tAHv9FeAf8Onf+CWX/SNP9n/AP8ADN6H/wDItH/Dp3/gll/0jT/Z/wD/AAze h/8AyLQB7/RX
gH/Dp3/gll/0jT/Z/wD/AAzeh/8AyLR/w6d/4JZf9I0/2f8A/wAM3of/AMi0 Ae/0V4B/w6d/
4JZf9I0/2f8A/wAM3of/AMi0f8Onf+CWX/SNP9n/AP8ADN6H/wDItAHv9FeA f8Onf+CWX/SN
P9n/AP8ADN6H/wDItH/Dp3/gll/0jT/Z/wD/AAzeh/8AyLQB7/RXgH/Dp3/g ll/0jT/Z/wD/
AAzeh/8AyLR/w6d/4JZf9I0/2f8A/wAM3of/AMi0Ae/0V4B/w6d/4JZf9I0/ 2f8A/wAM3of/
AMi0f8Onf+CWX/SNP9n/AP8ADN6H/wDItAHv9FeAf8Onf+CWX/SNP9n/AP8A DN6H/wDItH/D
p3/gll/0jT/Z/wD/AAzeh/8AyLQB7/RXwh4B/wCCZP8AwTbvP+CknxY8C3n/ AAT5+B8uiad8
D/h7f6fo0nwn0drW1urnWPGkdxcRxG22JLKlrao7qAzrbQhiRGuPcP8Ah07/ AMEsv+kaf7P/
AP4ZvQ//AJFoA9/orwD/AIdO/wDBLL/pGn+z/wD+Gb0P/wCRaP8Ah07/AMEs v+kaf7P/AP4Z
vQ//AJFoA9/orwD/AIdO/wDBLL/pGn+z/wD+Gb0P/wCRaP8Ah07/AMEsv+ka f7P/AP4ZvQ//
AJFoA9/orwD/AIdO/wDBLL/pGn+z/wD+Gb0P/wCRaP8Ah07/AMEsv+kaf7P/ AP4ZvQ//AJFo
A9/orwD/AIdO/wDBLL/pGn+z/wD+Gb0P/wCRaP8Ah07/AMEsv+kaf7P/AP4Z vQ//AJFoA9/o
rwD/AIdO/wDBLL/pGn+z/wD+Gb0P/wCRaP8Ah07/AMEsv+kaf7P/AP4ZvQ// AJFoA9/orwD/
AIdO/wDBLL/pGn+z/wD+Gb0P/wCRaP8Ah07/AMEsv+kaf7P/AP4ZvQ//AJFo A9/orwD/AIdO
/wDBLL/pGn+z/wD+Gb0P/wCRaP8Ah07/AMEsv+kaf7P/AP4ZvQ//AJFoA9/o rwD/AIdO/wDB
LL/pGn+z/wD+Gb0P/wCRaP8Ah07/AMEsv+kaf7P/AP4ZvQ//AJFoA9/orwD/ AIdO/wDBLL/p
Gn+z/wD+Gb0P/wCRaP8Ah07/AMEsv+kaf7P/AP4ZvQ//AJFoA9/orwD/AIdO /wDBLL/pGn+z
/wD+Gb0P/wCRaP8Ah07/AMEsv+kaf7P/AP4ZvQ//AJFoA9/or5w/4JT+E/Cv gL9kvUPAvgXw
zp+i6Jovxw+KVho2jaTZJbWthaw+P/EEcVvDFGAkUSIqoqKAqqoAAAr6PoAK KKKACiiigAoo
ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPAPh z/ylN+Mn/Zv/
AMNP/T547r3+vAPhz/ylN+Mn/Zv/AMNP/T547r3+gAooooAKKKKACiiigAoo ooAKKKKACiii
gAooooAKKKKACiiigAooooA8A+HP/KU34yf9m/8Aw0/9Pnjuvf68A+HP/KU3 4yf9m/8Aw0/9
Pnjuvf6ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gDwD4c/8pTfj
J/2b/wDDT/0+eO69/rwD4c/8pTfjJ/2b/wDDT/0+eO69/oAKKKKACiiigAoo ooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKAPAP+Caf/ACbr4j/7OA+LH/qw/ENe/wBe Af8ABNP/AJN1
8R/9nAfFj/1YfiGvf6ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo oAKKKKACiiig
AooooAKKKKACiiigDwD4c/8AKU34yf8AZv8A8NP/AE+eO69/rwD4c/8AKU34 yf8AZv8A8NP/
AE+eO69/oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKAPAPhz/wAp
TfjJ/wBm/wDw0/8AT547r3+vAPhz/wApTfjJ/wBm/wDw0/8AT547r3+gAooo oAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooooA8A+HP/AClN+Mn/AGb/APDT /wBPnjuvf68A
+HP/AClN+Mn/AGb/APDT/wBPnjuvf6ACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooo
oAKKKKACiiigDwD/AIJp/wDJuviP/s4D4sf+rD8Q17/XgH/BNP8A5N18R/8A ZwHxY/8AVh+I
a9/oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKK
KAPAPhz/AMpTfjJ/2b/8NP8A0+eO69/rwD4c/wDKU34yf9m//DT/ANPnjuvf 6ACiiigAoooo
AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDwD4c/wDKU34yf9m/ /DT/ANPnjuvf
68A+HP8AylN+Mn/Zv/w0/wDT547r3+gAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKK
KACiiigAooooA8A+HP8AylN+Mn/Zv/w0/wDT547r3+vAPhz/AMpTfjJ/2b/8 NP8A0+eO69/o
AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPAP+Ca f/JuviP/ALOA
+LH/AKsPxDXv9eAf8E0/+TdfEf8A2cB8WP8A1YfiGvf6ACiiigAooooAKKKK ACiiigAooooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDwD4c/8pTfjJ/2b/8A DT/0+eO69/rw
D4c/8pTfjJ/2b/8ADT/0+eO69/oAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAo
oooAKKKKAPAPhz/ylN+Mn/Zv/wANP/T547r3+vAPhz/ylN+Mn/Zv/wANP/T5 47r3+gAooooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA8A+HP/KU34yf 9m//AA0/9Pnj
uvf68A+HP/KU34yf9m//AA0/9Pnjuvf6ACiiigAooooAKKKKACiiigAooooA KKKKACiiigAo
oooAKKKKACiiigDwD/gmn/ybr4j/AOzgPix/6sPxDXv9eAf8E0/+TdfEf/Zw HxY/9WH4hr3+
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooA8
A+HP/KU34yf9m/8Aw0/9Pnjuvf68A+HP/KU34yf9m/8Aw0/9Pnjuvf6ACiii gAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigDwD4c/8pTfjJ/2b/wDDT/0+ eO69/rwD4c/8
pTfjJ/2b/wDDT/0+eO69/oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAK
KKKAPAPhz/ylN+Mn/Zv/AMNP/T547r3+vAPhz/ylN+Mn/Zv/AMNP/T547r3+ gAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA8A/4Jp/8AJuviP/s4 D4sf+rD8Q17/
AF4B/wAE0/8Ak3XxH/2cB8WP/Vh+Ia9/oAKKKKACiiigAooooAKKKKACiiig AooooAKKKKAC
iiigAooooAKKKKACiiigAooooAKKKKAPAPhz/wApTfjJ/wBm/wDw0/8AT547 r3+vAPhz/wAp
TfjJ/wBm/wDw0/8AT547r3+gAooooAKKKKACiiigAooooAKKKKACiiigAooo oAKKKKACiiig
AooooA8A+HP/AClN+Mn/AGb/APDT/wBPnjuvf68A+HP/AClN+Mn/AGb/APDT /wBPnjuvf6AC
iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDwD4c/8A KU34yf8AZv8A
8NP/AE+eO69/rwD4c/8AKU34yf8AZv8A8NP/AE+eO69/oAKKKKACiiigAooo oAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKAPAP8Agmn/AMm6+I/+zgPix/6sPxDXv9eA f8E0/wDk3XxH
/wBnAfFj/wBWH4hr3+gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAoooo
AKKKKACiiigAooooA8A+HP8AylN+Mn/Zv/w0/wDT547r3+vAPhz/AMpTfjJ/ 2b/8NP8A0+eO
69/oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPA Phz/AMpTfjJ/
2b/8NP8A0+eO69/rwD4c/wDKU34yf9m//DT/ANPnjuvf6ACiiigAooooAKKK KACiiigAoooo
AKKKKACiiigAooooAKKKKACiiigDwD4c/wDKU34yf9m//DT/ANPnjuvf68A+ HP8AylN+Mn/Z
v/w0/wDT547r3+gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooA8A/
4Jp/8m6+I/8As4D4sf8Aqw/ENe/14B/wTT/5N18R/wDZwHxY/wDVh+Ia9/oA KKKKACiiigAo
oooAKKKKACiiigAooooAKKKKACiiigArwD/h7F/wSy/6SWfs/wD/AIeTQ/8A 5Kr3+vhD/gmV
/wAo3P2fP+yH+E//AEz2tduCwf1ybjzWt5XODH476jCMuW9/O36M9w/4exf8 Esv+kln7P/8A
4eTQ/wD5Ko/4exf8Esv+kln7P/8A4eTQ/wD5KpKK9H+xP+nn4f8ABPM/t/8A 6d/j/wAAX/h7
F/wSy/6SWfs//wDh5ND/APkqj/h7F/wSy/6SWfs//wDh5ND/APkqkoo/sT/p 5+H/AAQ/t/8A
6d/j/wAAX/h7F/wSy/6SWfs//wDh5ND/APkqj/h7F/wSy/6SWfs//wDh5ND/ APkqkrgPit8W
PFOh+L9E+Dnwi8Hp4h8a+JFkksbKefy7axtkzuu7lhyIweFUYLlW+ZQrMOfE 5bRwdF1atWyX
l9yWurYf2/8A9Ovx/wCAegf8PYv+CWX/AEks/Z//APDyaH/8lUf8PYv+CWX/ AEks/Z//APDy
aH/8lV4vd/GT48fBq/0nVP2hdG8H6h4W1rVxpn/CUeB78tFpV0TgLco80uUy VDMGUx/eKldx
Tr/2ifjL/wAKG+Fsvj238N/2vfXGuaPoWi6a959min1LVdTtdLslnmCSGC3+ 1XkJmlWOV44h
I6RTMqxPhgsNhMfTlOlV+HdONmvlfr0HHPZOfI6LT7N2326HEeAf+Cm3/BNu z/4KSfFjx1ef
8FBvgfFomo/A/wCHthp+syfFjR1tbq6ttY8aSXFvHKbnY8sSXVq7opLItzCW AEi59w/4exf8
Esv+kln7P/8A4eTQ/wD5Krxzwh8fPjb4W8SXmlftb/Brwr4H0eHwrqGvr408 MePbnWNE0+2s
HtxdJqd5e6Zpy2EhS6SWEfvVlitb12aIW48zc+Pn7Rnhv4J6PHJapY6zrA8V eENKvtAj1dIr
mzttf8QW+iwX0iBXZYw8lxImVCzNZyxh1IZk7P7Hja/tP/Jf+CV/bc+ZL2W/ 97/gHo//AA9i
/wCCWX/SSz9n/wD8PJof/wAlUf8AD2L/AIJZf9JLP2f/APw8mh//ACVXnGk/ tQfDD4k/CfU/
i3+y9qtj8aLXTL5bJrH4W+KdHvZJrnMReBZ572G0SSOOZJmSSdG8vBAZmRWv fsyfGX/hoz9m
34e/tCf8I3/Y3/Cd+B9J8Rf2R9s+0fYfttnFc+R5uxPN2ebt37F3bc7VzgNZ PFuyqfh/wRPP
JJXdL/yb/gHc/wDD2L/gll/0ks/Z/wD/AA8mh/8AyVR/w9i/4JZf9JLP2f8A /wAPJof/AMlU
lFV/Yn/Tz8P+CT/b/wD07/H/AIAv/D2L/gll/wBJLP2f/wDw8mh//JVH/D2L /gll/wBJLP2f
/wDw8mh//JVJRR/Yn/Tz8P8Agh/b/wD07/H/AIAv/D2L/gll/wBJLP2f/wDw 8mh//JVb/wAL
f+ChP7Avxx8d2Pwt+Cn7cPwf8YeJ9U83+zPDnhb4l6VqF/d+XE80nlW8Fw8k myKOSRtqnaqM
xwATXP15h8Xf+TtP2Vv+y4ap/wCoB4urHEZT7CjKpz3t5f8ABNsPnP1ivGn7 O1/P/gH2fRRR
XjnuBXgH/D2L/gll/wBJLP2f/wDw8mh//JVe/wBfCH/BMr/lG5+z5/2Q/wAJ /wDpnta7cFg/
rk3HmtbyucGPx31GEZct7+dv0Z7h/wAPYv8Agll/0ks/Z/8A/DyaH/8AJVH/ AA9i/wCCWX/S
Sz9n/wD8PJof/wAlUlFej/Yn/Tz8P+CeZ/b/AP07/H/gC/8AD2L/AIJZf9JL P2f/APw8mh//
ACVR/wAPYv8Agll/0ks/Z/8A/DyaH/8AJVJRR/Yn/Tz8P+CH9v8A/Tv8f+AL /wAPYv8Agll/
0ks/Z/8A/DyaH/8AJVH/AA9i/wCCWX/SSz9n/wD8PJof/wAlUlcB8Vvix4p0 Pxfonwc+EXg9
PEPjXxIskljZTz+XbWNsmd13csORGDwqjBcq3zKFZhz4nLaODourVq2S8vuS 11bD+3/+nX4/
8A9A/wCHsX/BLL/pJZ+z/wD+Hk0P/wCSqP8Ah7F/wSy/6SWfs/8A/h5ND/8A kqvF7v4yfHj4
NX+k6p+0Lo3g/UPC2tauNM/4SjwPflotKuicBblHmlymSoZgymP7xUruKdf+ 0T8Zf+FDfC2X
x7b+G/7XvrjXNH0LRdNe8+zRT6lqup2ul2SzzBJDBb/aryEzSrHK8cQkdIpm VYnwwWGwmPpy
nSq/DunGzXyv16DjnsnPkdFp9m7b7dDiPAP/AAU2/wCCbdn/AMFJPix46vP+ Cg3wPi0TUfgf
8PbDT9Zk+LGjra3V1bax40kuLeOU3Ox5YkurV3RSWRbmEsAJFz7h/wAPYv8A gll/0ks/Z/8A
/DyaH/8AJVeOeEPj58bfC3iS80r9rf4NeFfA+jw+FdQ19fGnhjx7c6xomn21 g9uLpNTvL3TN
OWwkKXSSwj96ssVreuzRC3Hmbnx8/aM8N/BPR45LVLHWdYHirwhpV9oEerpF c2dtr/iC30WC
+kQK7LGHkuJEyoWZrOWMOpDMnZ/Y8bX9p/5L/wAEr+258yXst/73/APR/wDh 7F/wSy/6SWfs
/wD/AIeTQ/8A5Ko/4exf8Esv+kln7P8A/wCHk0P/AOSq8qu/2svht43+DGof Fr9lLXtD+MPk
65Z6FZReA/EUOoWg1K6uba3Rbq5sxP8AZbeH7XDcXUoSR7e1Ekwik2hGvfs7 fG3xJ8XYfFvh
v4g+BrHw94s8BeKl0DxVp2ja4+p6d9pk02x1OJ7S7kt7aWeM2mpWu4yW8LLM JkCuiJLILJ4N
pKpv5f8ABD+25pN+y2/vf8A9H/4exf8ABLL/AKSWfs//APh5ND/+SqP+HsX/ AASy/wCkln7P
/wD4eTQ//kqkoq/7E/6efh/wSP7f/wCnf4/8AX/h7F/wSy/6SWfs/wD/AIeT Q/8A5Ko/4exf
8Esv+kln7P8A/wCHk0P/AOSqSij+xP8Ap5+H/BD+3/8Ap3+P/AF/4exf8Esv +kln7P8A/wCH
k0P/AOSq3/hb/wAFCf2Bfjj47sfhb8FP24fg/wCMPE+qeb/Znhzwt8S9K1C/ u/LieaTyreC4
eSTZFHJI21TtVGY4AJrn68w+Lv8Aydp+yt/2XDVP/UA8XVjiMp9hRlU5728v +CbYfOfrFeNP
2dr+f/APs+iiivHPcCvAP+HsX/BLL/pJZ+z/AP8Ah5ND/wDkqvf6+EP+CZX/ ACjc/Z8/7If4
T/8ATPa124LB/XJuPNa3lc4MfjvqMIy5b387foz3D/h7F/wSy/6SWfs//wDh 5ND/APkqj/h7
F/wSy/6SWfs//wDh5ND/APkqkor0f7E/6efh/wAE8z+3/wDp3+P/AABf+HsX /BLL/pJZ+z//
AOHk0P8A+SqP+HsX/BLL/pJZ+z//AOHk0P8A+SqSij+xP+nn4f8ABD+3/wDp 3+P/AABf+HsX
/BLL/pJZ+z//AOHk0P8A+SqP+HsX/BLL/pJZ+z//AOHk0P8A+SqSuA+K3xY8 U6H4v0T4OfCL
weniHxr4kWSSxsp5/LtrG2TO67uWHIjB4VRguVb5lCsw58TltHB0XVq1bJeX 3Ja6th/b/wD0
6/H/AIB6B/w9i/4JZf8ASSz9n/8A8PJof/yVR/w9i/4JZf8ASSz9n/8A8PJo f/yVXi938ZPj
x8Gr/SdU/aF0bwfqHhbWtXGmf8JR4Hvy0WlXROAtyjzS5TJUMwZTH94qV3FO v/aJ+Mv/AAob
4Wy+Pbfw3/a99ca5o+haLpr3n2aKfUtV1O10uyWeYJIYLf7VeQmaVY5XjiEj pFMyrE+GCw2E
x9OU6VX4d042a+V+vQcc9k58jotPs3bfbocR4B/4Kbf8E27P/gpJ8WPHV5/w UG+B8Wiaj8D/
AIe2Gn6zJ8WNHW1urq21jxpJcW8cpudjyxJdWruiksi3MJYASLn3D/h7F/wS y/6SWfs//wDh
5ND/APkqvHPCHx8+NvhbxJeaV+1v8GvCvgfR4fCuoa+vjTwx49udY0TT7awe 3F0mp3l7pmnL
YSFLpJYR+9WWK1vXZohbjzNz4+ftGeG/gno8clqljrOsDxV4Q0q+0CPV0iub O21/xBb6LBfS
IFdljDyXEiZULM1nLGHUhmTs/seNr+0/8l/4JX9tz5kvZb/3v+Aej/8AD2L/ AIJZf9JLP2f/
APw8mh//ACVR/wAPYv8Agll/0ks/Z/8A/DyaH/8AJVecaT+0l4F+Lvwn1P4k fsg+JvCvxdkt
L5dNtE8J+NbKWx+3MYgUub2JpVt44knjnm2rLOsGWignkMcMh+zt8bfEnxdh 8W+G/iD4GsfD
3izwF4qXQPFWnaNrj6np32mTTbHU4ntLuS3tpZ4zaala7jJbwsswmQK6Iksj /seLaXtN/L/g
h/bckm/Zbf3v0sej/wDD2L/gll/0ks/Z/wD/AA8mh/8AyVR/w9i/4JZf9JLP 2f8A/wAPJof/
AMlUlFV/Yn/Tz8P+CR/b/wD07/H/AIAv/D2L/gll/wBJLP2f/wDw8mh//JVH /D2L/gll/wBJ
LP2f/wDw8mh//JVJRR/Yn/Tz8P8Agh/b/wD07/H/AIAv/D2L/gll/wBJLP2f /wDw8mh//JVb
/wALf+ChP7Avxx8d2Pwt+Cn7cPwf8YeJ9U83+zPDnhb4l6VqF/d+XE80nlW8 Fw8kmyKOSRtq
naqMxwATXP15h8Xf+TtP2Vv+y4ap/wCoB4urHEZT7CjKpz3t5f8ABNsPnP1i vGn7O1/P/gH2
fRRRXjnuHP8AxS+LHws+B3gS++KXxr+Jfh/wf4Y0vyv7T8R+KdZg0+wtPMlS GPzbid0jj3yy
RxruYbmdVGSQK8g/4exf8Esv+kln7P8A/wCHk0P/AOSqz/8Agqx/yaXp/wD2 XD4W/wDqf+H6
v16OCwH1yDlzWt5X/U8zH5j9RnGPLe/nb9GL/wAPYv8Agll/0ks/Z/8A/Dya H/8AJVH/AA9i
/wCCWX/SSz9n/wD8PJof/wAlUlFdv9if9PPw/wCCcH9v/wDTv8f+AL/w9i/4 JZf9JLP2f/8A
w8mh/wDyVR/w9i/4JZf9JLP2f/8Aw8mh/wDyVSUUf2J/08/D/gh/b/8A07/H /gC/8PYv+CWX
/SSz9n//AMPJof8A8lUf8PYv+CWX/SSz9n//AMPJof8A8lUleUeIPi38X/Hv jPxB4K/Z08P+
HvsvhAIvifxh4vuymm21w3/LsgWSMu65G5i4CsCgDEMV48bgsNgKXPWq76K0 bt+iuH9vttJU
rt9E/wDgHrH/AA9i/wCCWX/SSz9n/wD8PJof/wAlUf8AD2L/AIJZf9JLP2f/ APw8mh//ACVX
mHw8+MPxCsfiefgV8fPC2m6Z4in0saloeq6HdiXTtZtup8rLM0cirhthZgy5 YN8rqsPx0+On
xJ8F/Enwv8D/AIH/AAw0PxP4w8T6Hq2uxReK/Fs2iabBpumzafb3LG5t7G+l NwZtVsxHEINj
IJ2aVDGiSvC4HDYyh7alVutvh1T7NXvccc9lKXL7LXzdret0Yn/BPn/gpt/w Tb8F/AbX9H8Y
/wDBQb4H6TdzfHD4m38NrqfxY0eCR7W68da7dWtwFe5BMU1vNFNG4+V45UdS VYE+4f8AD2L/
AIJZf9JLP2f/APw8mh//ACVXnHwi+NviTxBDP4b+PXgax8CeLLfxU2gW2nJr j3ena9c/2amp
q+j3dxb2kuoxi0aTzCLeNkmsb5NrJbGVsP4i/ts/BL4W/E/RPC/jPx/4V03w nqPhXxNquq+P
tT8W21tp2k3Ojaxo+ky2Msj4iEjXerNC26RWimtTEUZ3wnR/ZEFG7qfh/wAE pZ3NysqX/k3/
AAD2P/h7F/wSy/6SWfs//wDh5ND/APkqj/h7F/wSy/6SWfs//wDh5ND/APkq uG+IX7Qnw28B
fBi3+O1pqf8Awkeh6p/Zkfhp/DE0N1/b1xqdzBa6ZDaSmRYG+1XF1bRRzPKk A89XkljiDSKf
syfGX/hoz9m34e/tCf8ACN/2N/wnfgfSfEX9kfbPtH2H7bZxXPkebsTzdnm7 d+xd23O1c4D/
ALGjzcvtNd9v+CL+3JcvN7LTbf8A4B3P/D2L/gll/wBJLP2f/wDw8mh//JVH /D2L/gll/wBJ
LP2f/wDw8mh//JVJRVf2J/08/D/gk/2//wBO/wAf+AL/AMPYv+CWX/SSz9n/ AP8ADyaH/wDJ
VH/D2L/gll/0ks/Z/wD/AA8mh/8AyVSUUf2J/wBPPw/4If2//wBO/wAf+AL/ AMPYv+CWX/SS
z9n/AP8ADyaH/wDJVd/8C/2sf2WP2oP7U/4Zo/aW+H/xE/sPyP7b/wCEF8ZW Or/2f53meT5/
2WWTyvM8qXbuxu8p8Z2nHn9ch+yb/wApI/jZ/wBkP+G//p48b1zYvLPqtH2n Pf5f8E68Fmv1
yv7Pkt87/ofV9FFFeUeuFFFFABRRRQAUUUUAFfCH/BMr/lG5+z5/2Q/wn/6Z 7Wvu+vyw/Yx/
Zc+Anin/AIJ8/A74ufFD4l/EfQxP8D/Bv26bS/j94p0DTINuiWMKbbay1SC1 gzhAdiLvdix3
O7E+vlM1TlOTskldtuyS73PEzqKnCnHXV9Fc+z6K+ZdO/Zw/YW1jUINJ0n9q L4i3V1dTLDbW
1t+154xeSaRiFVFVdcJZiSAAOSTXV/8ADvn4Df8AQ/fHD/xJvx1/8ua9uhiq eJTdGUZJdpX/
ACR89UoexdqikvWNv1Pb6K8Q/wCHfPwG/wCh++OH/iTfjr/5c1R8T/sP/sxe CfDeoeM/Gfxe
+MWkaPpFjLe6rqup/tTeN7e2sraJC8s8sr60FjjRFZmdiFVVJJAFbXq9l9// AADPlpPq/u/4
J77Xz5+0MfFXwJ/aj8J/tjWvhHVfEPhmy8NXXh7xfp+jOfPs7aQylboL3Uec 5Z+NnlrkgMWX
U/4d8/Ab/ofvjh/4k346/wDlzR/w75+A3/Q/fHD/AMSb8df/AC5rizDBzx+G dJ6bNO+zWq0t
qTKFJtNSaaaadlo079z5Q0T9nv4D/GNNO+FX7L+p/EfxPqN34jE+v+MPENwb ay0fSSuDC0cc
skbygZYMSrSMNqqBkp9zftH6d401f4MazpPgf4b6H4ymuvs8Or+EPEMEctvr mjtcxLqliiTS
RwvcTWBu4oFuHS3M7xCdlh8wjzrw9+w/+zF4usJNV8KfF74xanaxX11ZS3On /tTeN5o0ubae
S3uICya0QJIp4pYpE+8kkbowDKQDw9+w/wDsxeLrCTVfCnxe+MWp2sV9dWUt zp/7U3jeaNLm
2nkt7iAsmtECSKeKWKRPvJJG6MAykDiyjKP7KpzUWm52u1potrKz7vW5GHw+ Hw8nJb6bRstP
+3m/xueO337KnxS+KPw2+KvwX/Z+/Zm1z4CeCvGfwP8AFHhmTwT418Q6YdFm 1/UIYYdLutNs
NGv9Rt9Jt4VOqNefZ47U3El/FK0V5IpeGj+0P8Bf2qv2qtT+KXjPVf2M7G20 /wAU2PwhsvD/
AIH8f+LtLkXWLbQ/Guoalq0GrfZTeQWsf2e4LMkRvVktpIyoknaWyh9+/wCH fPwG/wCh++OH
/iTfjr/5c0f8O+fgN/0P3xw/8Sb8df8Ay5r03Qk1b9fJr+XzO5YiKd/080/5 vIP2e9D+KXjD
9pLx9+0v49+DOueALHX/AAP4Y8M6b4d8V6hpk+pPLpl5rt1NdH+y7u8t1t3X WII48z+aXgn3
RIoieXb/AGF/hv40+Dn7Evwd+EXxH0b+zvEXhX4V+HtH17T/ALRHN9lvbbTb eGeLzImZH2yI
y7kZlOMgkEGsT/h3z8Bv+h++OH/iTfjr/wCXNH/Dvn4Df9D98cP/ABJvx1/8 ua0jCpFp279e
+vYylOnK+r6dOyt3Pb6K8Q/4d8/Ab/ofvjh/4k346/8AlzR/w75+A3/Q/fHD /wASb8df/Lmr
vV7L7/8AgGdqPd/d/wAE9vorxD/h3z8Bv+h++OH/AIk346/+XNH/AA75+A3/ AEP3xw/8Sb8d
f/Lmi9Xsvv8A+AFqPd/d/wAE9vrzD4u/8nafsrf9lw1T/wBQDxdXP/8ADvn4 Df8AQ/fHD/xJ
vx1/8uax7f8AZ88B/Aj9rT9mj/hCNf8AHF9/avxwvvtX/CZ/E3XfEezyvAHj Lb5P9rXtz9nz
5jbvK2b8Jv3bE28uOdT6pO6W3f8A4B2YBU/rkLN79v8Agn6D0UUV8ifaBXwh /wAEyv8AlG5+
z5/2Q/wn/wCme1r7vr8sP2Mf2XPgJ4p/4J8/A74ufFD4l/EfQxP8D/Bv26bS /j94p0DTINui
WMKbbay1SC1gzhAdiLvdix3O7E+vlM1TlOTskldtuyS73PEzqKnCnHXV9Fc+ z6K+ZdO/Zw/Y
W1jUINJ0n9qL4i3V1dTLDbW1t+154xeSaRiFVFVdcJZiSAAOSTXV/wDDvn4D f9D98cP/ABJv
x1/8ua9uhiqeJTdGUZJdpX/JHz1Sh7F2qKS9Y2/U9vorwLw9+w/+zF4usJNV 8KfF74xanaxX
11ZS3On/ALU3jeaNLm2nkt7iAsmtECSKeKWKRPvJJG6MAykA8Q/sP/sxeEbC PVfFfxe+MWmW
st9a2UVzqH7U3jeGN7m5njt7eAM+tAGSWeWKKNPvPJIiKCzAHbmqWvZff/wC OWle1393/BPf
a+fP2hj4q+BP7UfhP9sa18I6r4h8M2Xhq68PeL9P0Zz59nbSGUrdBe6jznLP xs8tckBiyzeI
f2H/ANmLwjYR6r4r+L3xi0y1lvrWyiudQ/am8bwxvc3M8dvbwBn1oAySzyxR Rp955JERQWYA
3v8Ah3z8Bv8Aofvjh/4k346/+XNcWYYOWPwzovR6NO+zW2ltSZQpuzUmmmmn ZbrXufKGifs9
/Af4xpp3wq/Zf1P4j+J9Ru/EYn1/xh4huDbWWj6SVwYWjjlkjeUDLBiVaRht VQMlPub9o/Tv
Gmr/AAY1nSfA/wAN9D8ZTXX2eHV/CHiGCOW31zR2uYl1SxRJpI4XuJrA3cUC 3Dpbmd4hOyw+
YRxH/Dvn4Df9D98cP/Em/HX/AMuaP+HfPwG/6H744f8AiTfjr/5c1x5Tk/8A ZVOaTTcrXe22
2ln3fUyw9DD4eXMt9No2Wn/bzf43PD779lT4pfFH4bfFX4L/ALP37M2ufATw V4z+B/ijwzJ4
J8a+IdMOiza/qEMMOl3Wm2GjX+o2+k28KnVGvPs8dqbiS/ilaK8kUvDR/aH+ Av7VX7VWp/FL
xnqv7Gdjbaf4psfhDZeH/A/j/wAXaXIusW2h+NdQ1LVoNW+ym8gtY/s9wWZI jerJbSRlRJO0
tlD79/w75+A3/Q/fHD/xJvx1/wDLmj/h3z8Bv+h++OH/AIk346/+XNek6Emr fr5Nfy+Z3rER
Tv8Ap5p/zeR5z4sh/bI1bXPin+1F8Kv2cvFXhfXvEXhXwN4R0fwlquqeHJfE ItrHXNVm1fUr
TbqE+lCRNP1t3tBdXBVrqycT25i2LP7f+y1DDpvwnh8OWX7OXir4YWumX00V voXjLVNNvb68
ZyJ5tQkuLDUL8XEk880zyzzzm5mn86WXc0nmPy3/AA75+A3/AEP3xw/8Sb8d f/Lmj/h3z8Bv
+h++OH/iTfjr/wCXNXGFWMr/AK/P+UznUpTjb9PK38x7fRXiH/Dvn4Df9D98 cP8AxJvx1/8A
Lmj/AId8/Ab/AKH744f+JN+Ov/lzWl6vZff/AMAytR7v7v8Agnt9FeIf8O+f gN/0P3xw/wDE
m/HX/wAuaP8Ah3z8Bv8Aofvjh/4k346/+XNF6vZff/wAtR7v7v8Agnt9eYfF 3/k7T9lb/suG
qf8AqAeLq5//AId8/Ab/AKH744f+JN+Ov/lzWPb/ALPngP4Eftafs0f8IRr/ AI4vv7V+OF99
q/4TP4m674j2eV4A8ZbfJ/ta9ufs+fMbd5WzfhN+7Ym3lxzqfVJ3S27/APAO zAKn9chZvft/
wT9B6KKK+RPtAr4Q/wCCZX/KNz9nz/sh/hP/ANM9rX3fX5YfsY/sufATxT/w T5+B3xc+KHxL
+I+hif4H+Dft02l/H7xToGmQbdEsYU221lqkFrBnCA7EXe7Fjud2J9fKZqnK cnZJK7bdkl3u
eJnUVOFOOur6K59n0V8y6d+zh+wtrGoQaTpP7UXxFurq6mWG2trb9rzxi8k0 jEKqKq64SzEk
AAckmur/AOHfPwG/6H744f8AiTfjr/5c17dDFU8Sm6MoyS7Sv+SPnqlD2LtU Ul6xt+p7fRXi
H/Dvn4Df9D98cP8AxJvx1/8ALmqPif8AYf8A2YvBPhvUPGfjP4vfGLSNH0ix lvdV1XU/2pvG
9vbWVtEheWeWV9aCxxoiszOxCqqkkgCtr1ey+/8A4Bny0n1f3f8ABPfa+fP2 hj4q+BP7UfhP
9sa18I6r4h8M2Xhq68PeL9P0Zz59nbSGUrdBe6jznLPxs8tckBiy6n/Dvn4D f9D98cP/ABJv
x1/8uaP+HfPwG/6H744f+JN+Ov8A5c1xZhg54/DOk9NmnfZrVaW1JlCk2mpN NNNOy0ad+58o
aJ+z38B/jGmnfCr9l/U/iP4n1G78RifX/GHiG4NtZaPpJXBhaOOWSN5QMsGJ VpGG1VAyU+5v
2j9O8aav8GNZ0nwP8N9D8ZTXX2eHV/CHiGCOW31zR2uYl1SxRJpI4XuJrA3c UC3Dpbmd4hOy
w+YR514e/Yf/AGYvF1hJqvhT4vfGLU7WK+urKW50/wDam8bzRpc208lvcQFk 1ogSRTxSxSJ9
5JI3RgGUgUdG/ZG/Y98R6rBoPh74/wDxUv766/tL7NZWX7WPjSWWb+zrpLPU NqLrZLfZrqSO
3nwP3MrrG+1iBXFlOULKqc0mm52u9tFtZWffuRh8PQw8nJb6bRstP+3m+/W5 5XffsqfFL4o/
Db4q/Bf9n79mbXPgJ4K8Z/A/xR4Zk8E+NfEOmHRZtf1CGGHS7rTbDRr/AFG3 0m3hU6o159nj
tTcSX8UrRXkil4aP7Q/wF/aq/aq1P4peM9V/YzsbbT/FNj8IbLw/4H8f+LtL kXWLbQ/Guoal
q0GrfZTeQWsf2e4LMkRvVktpIyoknaWyh9wuP2H/ANmK08SWngy6+L3xii1i /sbi9sdKk/am
8brc3NtbvCk88cR1rc8cb3NuruAVRriIEguub3/Dvn4Df9D98cP/ABJvx1/8 ua9L2Emrfr5f
4fM7liIp3/TzT/m8jD8Bt+0LcfF74lftbp+y5rmkTap4H8KeHdJ+H3ijxJpE Wsah/ZWoa3d3
s8Uljd3lku+DWES2Sa5i824tnjna0hZbo7n7DHwn174U+FPGgf4Pf8K28Ma9 44OpeA/hhmwT
/hFNNGladay23kabNNY23nahbahfeXayyI32/wA1ys8syIf8O+fgN/0P3xw/ 8Sb8df8Ay5o/
4d8/Ab/ofvjh/wCJN+Ov/lzWihUTT7eff5GcqlKSavvbp2/7ePb6K8Q/4d8/ Ab/ofvjh/wCJ
N+Ov/lzR/wAO+fgN/wBD98cP/Em/HX/y5rS9Xsvv/wCAZWo9393/AAT2+ivE P+HfPwG/6H74
4f8AiTfjr/5c0f8ADvn4Df8AQ/fHD/xJvx1/8uaL1ey+/wD4AWo9393/AAT2 +vMPi7/ydp+y
t/2XDVP/AFAPF1c//wAO+fgN/wBD98cP/Em/HX/y5rHt/wBnzwH8CP2tP2aP +EI1/wAcX39q
/HC++1f8Jn8Tdd8R7PK8AeMtvk/2te3P2fPmNu8rZvwm/dsTby451Pqk7pbd /wDgHZgFT+uQ
s3v2/wCCfoPRRRXyJ9ofOH/BVj/k0vT/APsuHwt/9T/w/V+qH/BVj/k0vT/+ y4fC3/1P/D9e
DeLP2Pf2RvAP2f8A4Tr47/FfRfte/wCy/wBrftXeNbbztuN2zzNbG7G5c46b h617mWVoUMNO
c2lFPVt2S+Z89nNP2uIhFXbs9Ern0RRXzj4W/ZO/Y28c6g+k+Cf2hvijrF1H CZpLbSv2s/Gl
xIsYIUuVj1skKCyjPTLD1rR8T/sP/sxeCfDeoeM/Gfxe+MWkaPpFjLe6rqup /tTeN7e2sraJ
C8s8sr60FjjRFZmdiFVVJJAFevSxEcRDnpOMl3Urr70jxJ0VSlyz5k+zjb9T 32ivEP8Ah3z8
Bv8Aofvjh/4k346/+XNUbj9h/wDZitPElp4Muvi98YotYv7G4vbHSpP2pvG6 3NzbW7wpPPHE
da3PHG9zbq7gFUa4iBILrnW9Xsvv/wCAZ8tLu/u/4J77Xxf8UtO0b4H3Hxi+ CP7QKeLNP8D/
ABY8RQeIPD/jzw0gl+wXazGdrZ1d0AO8svl71LIm5fvHZ6L4u/ZG/Y9+H/m/ 8J78f/ipon2f
Q77Wp/7X/ax8aW3l6bZeV9svW8zWxi3g8+DzZT8kfnR7iu9c3vE/7D/7MXgn w3qHjPxn8Xvj
FpGj6RYy3uq6rqf7U3je3trK2iQvLPLK+tBY40RWZnYhVVSSQBXl5rlzzOio NqLj133VndWW
680ROjTnZpu+q23TVmt+qfr2Z5X+yF8DfBXiH9ozQ/i58ENH8YW/gfwloDwn XvF167Pr+pvD
JbvLDEWZVjKyux2MVQxquSWIT2L9srwbc+OP+Ec0nxn+xTofx48Ax/bJtX8I XGlaNealZ6wP
IWwvoE1u7trIW6QNqcUzbzcb7i1EamM3BU/4d8/Ab/ofvjh/4k346/8AlzR/ w75+A3/Q/fHD
/wASb8df/LmnluWPLcJ7CNnd3b2106WemnmGGp0MNrF+e1l8ve0PK9D+EX7T eh+HfBnxTb4U
eONU0v4f/HC48TeFPhj4k8b2Wq+LrbQJ/CV7oklrJqN7qUttdXH9rajd36+f qcgSxkWNZVeO
OyTlfhr8Bf2qvhT8RvhV8evHX7Gdj4t1LwlffGW91zRfD3i7S7i70S58R+Mb a90+fSJtQNrH
cySWZuAXkayZbSS58wpMUsp/fv8Ah3z8Bv8Aofvjh/4k346/+XNH/Dvn4Df9 D98cP/Em/HX/
AMua7PYT/p+n93yOv28P6Xk1/N5vzOH+G/7DHjzxP4D8JeKvFXxp8cfDLxPo fjjx34o03TfC
50K++xf8JJrt7qMa3Ueo2GoWo1C2tLs2hntSfL+038UU80FwzSep/sL/AA38 afBz9iX4O/CL
4j6N/Z3iLwr8K/D2j69p/wBojm+y3ttptvDPF5kTMj7ZEZdyMynGQSCDWJ/w 75+A3/Q/fHD/
AMSb8df/AC5o/wCHfPwG/wCh++OH/iTfjr/5c1cKcoNNLy39PLyInUhNWbe9 9l5+fme30V4h
/wAO+fgN/wBD98cP/Em/HX/y5o/4d8/Ab/ofvjh/4k346/8AlzWl6vZff/wD K1Hu/u/4J7fR
XiH/AA75+A3/AEP3xw/8Sb8df/Lmj/h3z8Bv+h++OH/iTfjr/wCXNF6vZff/ AMALUe7+7/gn
t9ch+yb/AMpI/jZ/2Q/4b/8Ap48b15//AMO+fgN/0P3xw/8AEm/HX/y5rpP2 Bvh7oPwr/bw+
L/gLwxf65dWNh8D/AId+RP4k8T3+s3rb9c8dSN5l5qE01xNhnIXzJG2qFRcK qqPOzRz+qO66
rr/wD1MnUFjVyt7Pp/wT7Looor5g+sCiiigAooooAKKKKACvzw/YV8J674y/ 4Jafs8aZ4Y8Q
W2l6ja/CjwDqVje3unNdwpLZ2unXarJCssTOjGAIQJEOGJB4r9D6/Lz9hH9o P4t+B/2D/gR4
W8MfsL/FTxlY2vwP8H+R4k8N6v4Tisrzdodk7eWuoa5bXA2MxjbzIU+ZGK7l 2u3qZdSo141a
VVXjKNmtdU9HtrseNm8qlP2U6btKLutt16nult8Rfix+0rBqvgxP2g/h3rGm eEvHdjaeKk8N
fD+9gmh1DT7iz1F7JbiTVpYw4/cpIQkgQs6ECRGVfT6+W/hf8Sfjp8MPGXjf xlF+wd+0frL+
OdfTV72x1fXPhwILCdLaK1Vbb7PrkThPs9vbRYleU4tkbO9pXk7X/hq/48/9 Iyvjh/4P/Av/
AM0tevg8uyzK+aODg4qVr/E9befzPCxOJxuNadeSdttYr8jznwz8Ufj/AK1+ 0Zc+FfHXx28V
aLo/jTxV4k8LeEtV8N6b4W1PwrJNbQ6k9vb6VKnmaraa5awac8t2+qxT6eLq w1S2WEiWy2fO
fwA+Lf7VXwp/YAnuvAX7St9baP8ACr/gnt4X8eaHY3PhbS5rmTW7zSvE5tw0 5twv2O2SxtAI
TE0sjWFmzz4+2rffVGk+O7vQfixqfx60L/gjP8RrLxzrditlrPjS0X4eR6tf 2yiILBNeL4iE
0sYFvAAjMVAhj4+RcC+O7tLDX9KX/gjP8Rha+K7Gey8U2wX4eeXrFtNPd3E0 F0v/AAkWLiOS
fUL+V0k3K0l7cuQWmkLW4tu931/m6/8ABGpxStZdP5en/AOV8bfHH9pvw98Z /ib4+t/jf/xS
vgb9ovwL4F0LwEvhqyFvc2Wu23hGC+a8uihuJfKbW57m1EL27Rzh/Pe7gaO2 hw/G/wC0F+0L
p/g/SP2jof2tv7C/4SL9qe3+G1v8NtR0HSH027023+IDaDJDprtAl8NQl0+y luJpJbi6QI1+
0VvB+4ls/VLv4xeML/8AtD7d/wAEiPipN/a2uWetap5tz8P2+2alafZvst7L nxH+8uIfsVn5
crZeP7JBtI8pNvh/xN+H3x5+J/7SVx8ZL7/gmZrmlaXfa5oGpapf6J4A8Cwe NNQ/si80/UbW
2uPEJ8bMstub7S7MvG1kc20QhUo6pcK586vy3d/X7/l2CnyO3MkrW/l120+e 9zc/Z81z4peM
NZ0D9mjwF8Ztc8AWOv8Ajj46eJtS8ReFNP0yfUnl0z4jfZYbUf2paXlutu66 xPJJiDzS8EG2
VFEqS+qf8Eq9f/4Sv9j1fFP/AAm+h+Jv7S+KnxCuv+Ek8MReXpuq+Z401t/t dovnz7beXPmR
jzpcI6jzJPvnD8e6ro3xU8Fp8OPif/wRH8ceJPDseuT61HoOvWXw5vLJdSnk nlmvRBL4hZBc
SSXNy7y43s1xKxJMjE9V4e/aJ+KnhGwk0rwp/wAEqfjFplrLfXV7LbafqngK GN7m5nkuLicq
niQAySzyyyyP955JHdiWYk1TXJNN30Vtn5eXkRUfPBpW1d94+fn5/gcr+1l4 q/4TH/gk/wDt
J6v/AMLW/wCEy8nwP8UrH+1/7C/s77P9ll1m2/s7ysDf9i8r7D5//Lx9k8/J 83J8PsPBH/BN
yf8AZt1bT9L/AGvf2INI8nxxp9xrt74L8D6Pp3gvWv8AQ71LHS/EOkjW5P7U 27tRvLZHvIdt
zaQToh+ySCX6o/4av+PP/SMr44f+D/wL/wDNLR/w1f8AHn/pGV8cP/B/4F/+ aWiUYyab7W2k
OE5wjZd7/FE+ILX4pXPwR0H4o/HT4TeOND+C82n/ALLGpf8ACpvC3gnw/o2n eG/iJe6Jf+Pp
jq+l2d3azPNbiN7LXUhsp2VIdXt2uJbyGVJJfYfidr/7Smift5eGP2b4P2m7 7SNS8W2PhG38
VeO/CngfQbfUZ45bH4nam9rB9tsbwR2aT6VZRwQzm4khhjf98809zcT+/f8A DV/x5/6RlfHD
/wAH/gX/AOaWj/hq/wCPP/SMr44f+D/wL/8ANLUxppJLmf3P5/eVKo5XfKvv j5W+4+O/j3+3
x8cPCvwP+JurePP22v8AhVWqfDrwP4sX4Xas9p4etZfibr+keIfFOkm3nTVL KaK8uEh0XRJZ
rfTEtSsusyEoiT2kcP6Z18sfGXxN4n+P/wDZtv8AFT/gmB+0XfWOnecr6LZ/ E7wxY6bqcUuw
S2+o2Vr4ujt9Ut3WMI1veRzRFHkQptlkVu4/4av+PP8A0jK+OH/g/wDAv/zS 1dJuDfM29ujM
6qjOK5Uk9esfI9vorxD/AIav+PP/AEjK+OH/AIP/AAL/APNLR/w1f8ef+kZX xw/8H/gX/wCa
WtvaR8/uf+Rh7KXl96/zPb68w+Lv/J2n7K3/AGXDVP8A1APF1c//AMNX/Hn/ AKRlfHD/AMH/
AIF/+aWse3+LHjz4n/tafs0f8Jv+zJ44+HP2H44X32X/AITO/wBCn/tDf4A8 ZbvJ/snU73b5
exd3m+XnzU2b8Pt5cdOLwk1rt2Z2YCnKOMg9N+6/zP0Hooor5E+0Cvzw/YV8 J674y/4Jafs8
aZ4Y8QW2l6ja/CjwDqVje3unNdwpLZ2unXarJCssTOjGAIQJEOGJB4r9D6/L z9hH9oP4t+B/
2D/gR4W8MfsL/FTxlY2vwP8AB/keJPDer+E4rK83aHZO3lrqGuW1wNjMY28y FPmRiu5drt6m
XUqNeNWlVV4yjZrXVPR7a7HjZvKpT9lOm7Si7rbdep7pbfEX4sftKwar4MT9 oP4d6xpnhLx3
Y2nipPDXw/vYJodQ0+4s9ReyW4k1aWMOP3KSEJIELOhAkRlX0+vlv4X/ABJ+ Onww8ZeN/GUX
7B37R+sv4519NXvbHV9c+HAgsJ0torVVtvs+uROE+z29tFiV5Ti2Rs72leTt f+Gr/jz/ANIy
vjh/4P8AwL/80tevg8uyzK+aODg4qVr/ABPW3n8zwsTicbjWnXknbbWK/I8d 8DfFv9qr4/8A
xc8HfCTSv2lb7whp+r33xpfxBqmjeFtLuNRe28P+O7HStJjtHureWC3kit5x C0ksFwssLTBo
zO8V1B4fB4y+Ifx28Uad+1H46+IF99q8ffDn9lvX9R8JWdnZx6TZXOoeP5Jn S3/cG7EcUkVw
8YkuJGzqFwJGkVbZbf620b4xeMPDmqwa94e/4JEfFSwvrX+0vs17ZXPw/ilh /tG6S81Da6+I
wV+03UcdxPg/vpUWR9zAGqLeO7t7DQNKb/gjP8Rja+FLGCy8LWxX4eeXo9tD PaXEMFqv/CRY
t4459PsJUSPaqyWVs4AaGMrbg5LVv7pdrf5sqM1F6JffHvf/ACXkeO/Hjx38 UviJ8MdA+M/j
f9p37DY6x+2Hong7T/hhqOk6Yum3MWj/ABPisbcabIsUd/8A2g0OkLeTNLc3 URQX+y2iUxPa
fYf7Qfir/hDvAdhq/wDwtb/hDfO8ceGLH+1/7C/tH7R9q12wtv7O8rB2fbfN +w+f/wAu/wBr
8/I8rI8Qu9V0a/8AiTqHxlvv+CI/jibxhq32P+1PFctl8OW1K8+yTW09r5t0 fEPmyeTNZWck
e5j5b2kDLgxIV7j/AIav+PP/AEjK+OH/AIP/AAL/APNLWkPdve+vlL+vuMp+ 9a1tHfePl/V2
eA/8FVtI+CWtftbfBO1+PXxC+AXhrR1+HPjt7a+/aM8HW2t6JJc/b/CoWOCC 41GxVLwoZCsg
lZhEs6+WQxZOH+InjL9mfwT+2H8Qbr9iP4gfDnwr4s1f4c/AvQNI8QfDez0G 41Gy0TU/GUum
3b2iPBPEY/7JutDALRPEsLaU20oLavrb/hq/48/9Iyvjh/4P/Av/AM0tH/DV /wAef+kZXxw/
8H/gX/5pamUIym5Lr/dfaxpCpKMFFpO395W3v/wD5z03xZ48i/4KL+GPC3xj /au1zStL+Geu
eJPBGk+PdVttCs7jxjd6jafD3W7Tw/fO9gtm1xdNdahHFFYw2t1JBpoMbF4r iWT77rxD/hq/
48/9Iyvjh/4P/Av/AM0tH/DV/wAef+kZXxw/8H/gX/5pa0puMG93fyZjUUqi WiVl3R7fRXiH
/DV/x5/6RlfHD/wf+Bf/AJpaP+Gr/jz/ANIyvjh/4P8AwL/80tae0j5/c/8A Iy9lLy+9f5nt
9FeIf8NX/Hn/AKRlfHD/AMH/AIF/+aWj/hq/48/9Iyvjh/4P/Av/AM0tHtI+ f3P/ACD2UvL7
1/me30V4h/w1f8ef+kZXxw/8H/gX/wCaWj/hq/48/wDSMr44f+D/AMC//NLR 7SPn9z/yD2Uv
L71/me315h8Xf+TtP2Vv+y4ap/6gHi6uf/4av+PP/SMr44f+D/wL/wDNLWPb /Fjx58T/ANrT
9mj/AITf9mTxx8OfsPxwvvsv/CZ3+hT/ANob/AHjLd5P9k6ne7fL2Lu83y8+ amzfh9vLjpxe
EmtduzOzAU5RxkHpv3X+Z+g9FFFfIn2gV+YP7NPxL8FeB/8Aglp+zZpniD4h xeHdRf4R+CNZ
029m8N3eqw20emWulXct1dw2pVorKMrEk1zJJFDEJ0LyJuXP6fV+PPwH0/xT 8R/2D/gB4WH7
HHxt1+xs/wBnbQNEuvEngPXfBkFlruj6loelvf6eV1bV4rhIpGt4Y3kWGCdW gJhlVW3v6+U0
cLiJVKOJTdOUWpWvs9HtqeLnM6tNU50naUXdbbr1PrX49fEn4raP4Q09/wBo 39oT4eaJ4T/4
SfS7jUNTg+H19ZJG1rdx3saS3kurSwWaSPbLEJZl2F5UjXMksat6NoOtWXiT Q7LxFp0V0lvf
2kdzAl9Yy2s6o6hlEkMyrJC+CMxyKrqchgCCK+O/jt4W1f8Aags7fRv2h/8A gmZ8e/FunWt3
JNaWWo6n8NontkeWeRoYbq31yO6t0PmWqMYpkd00y2V2fddfafQPhX8ZPib8 Hfh5pPwz8Ef8
EtvjNaabpFoIYY7O8+HdmkjklpJjDaeIIoEeSRnkcRRohd2IVc4r1sFl2U5X RawkWnJ6/E15
au7PDxWJxuNknWknbbWK/KxzPhn4o/H/AFr9oy58K+Ovjt4q0XR/GnirxJ4W 8Jar4b03wtqf
hWSa2h1J7e30qVPM1W01y1g055bt9Vin08XVhqlssJEtls+c/gB8W/2qvhT+ wBPdeAv2lb62
0f4Vf8E9vC/jzQ7G58LaXNcya3eaV4nNuGnNuF+x2yWNoBCYmlkaws2efH21 b76o0nx3d6D8
WNT+PWhf8EZ/iNZeOdbsVstZ8aWi/DyPVr+2URBYJrxfEQmljAt4AEZioEMf HyLgXx3dpYa/
pS/8EZ/iMLXxXYz2Xim2C/Dzy9Ytpp7u4mgul/4SLFxHJPqF/K6SblaS9uXI LTSFm4tu931/
m6/8EanFK1l0/l6f8A5Xxt8cf2m/D3xn+Jvj63+N/wDxSvgb9ovwL4F0LwEv hqyFvc2Wu23h
GC+a8uihuJfKbW57m1EL27Rzh/Pe7gaO2hw/G/7QX7Qun+D9I/aOh/a2/sL/ AISL9qe3+G1v
8NtR0HSH027023+IDaDJDprtAl8NQl0+yluJpJbi6QI1+0VvB+4ls/VLv4xe ML/+0Pt3/BIj
4qTf2trlnrWqebc/D9vtmpWn2b7Ley58R/vLiH7FZ+XK2Xj+yQbSPKTb4f8A E34ffHn4n/tJ
XHxkvv8AgmZrmlaXfa5oGpapf6J4A8CweNNQ/si80/UbW2uPEJ8bMstub7S7 MvG1kc20QhUo
6pcK586vy3d/X7/l2CnyO3MkrW/l120+e9zc/Z81z4peMNZ0D9mjwF8Ztc8A WOv+OPjp4m1L
xF4U0/TJ9SeXTPiN9lhtR/alpeW627rrE8kmIPNLwQbZUUSpL4h8JNf+JN1r PwY/aO+FPjf/
AITTVPBf/C//ABfdQfD2KY2Hj3TR8RtMj1G3s7OGeZrvz7G6urjT7Y3Dob+P TWeZ0Rmb6n8e
6ro3xU8Fp8OPif8A8ER/HHiTw7Hrk+tR6Dr1l8ObyyXUp5J5Zr0QS+IWQXEk lzcu8uN7NcSs
STIxO5o3xi8YeHNVg17w9/wSI+KlhfWv9pfZr2yufh/FLD/aN0l5qG118Rgr 9puo47ifB/fS
osj7mANT7Nu2r6dH5eXkNVLbJat9Y9b+d+v4HgPjX4+eJNP/AGtte/4KET+K b6PwnY/szfFG
X4b6eLV7+zbRNBv/AAzINbWx+0wRXUl/dvezxywXUUV7pkejnzIH3uD4ifGz /gpN+yf4b+J+
hfGn4n2N/dSfszePvG/g7WZPEum67c6Vq2gppqwNGtt4X0SFIydU3uk8d4JW hi2+QqSLce/a
B8YvGHhT+xP+EW/4JEfFTTf+EZ0N9F8N/wBn3Pw/h/srTX+z7rK22eIx5Fuf slrmJNqH7NDx
+7THD+FvA3wd8D6Vf6D4K/4IC65o9jquf7TstL8OfDO3ivM2t1ZnzUj18CTN rfXtudwP7q8u
I/uyuGHCerTevk/8v+GCM4aXitPNf5/53Dxv8cf2m/2dPiT4wg8e/G//AIS7 w78LtD8KfEP4
iTyeGrKx36Hqk3iPT9ZtrVYUZ4NP02PToNYt4j9r1GX7DLZtdXJuUaP2/wCA XxI8afGP4k/E
Tx7DrOPAOma4PCfg7T/s8f8ApV7pU1zDrGp+ZtWZN1+8um/Z5QVH9hfaYmeO 9Bryz4rfGP8A
as8R+Zq3wZ/4J9/FTwV4i1b7LYeJPF8mneANR1KbR4ftTLb2rv4rjSK4ikup ZbeW5S7t4Xkl
LWkwlcVufDL40fEX4OfDbw98Ivhx/wAEsfjhp3h3wrodpo+g6f8A8JP4Jm+y 2VtCkMEXmS+J
2d9saKu52ZjjJJJJrWEnGXW3o/62/rcynFSholf1Xl+v4Nnqfwn8Vf8ACQ+P PibpH/C1v+Ei
/sLxxb2P9kf2F9k/4RfdoWk3P9nebgfbd/2j7d5/O3+0fIz+4wPzb/4J6eEP 2ALz/gnvZW3i
D9qf9krw14mvPg74Wl8Qar4T8MaVpGraZbJJp73Wn+LZW1aSTVrO6vPsNlfw P9hW6E00LbHu
U8r7t/4av+PP/SMr44f+D/wL/wDNLR/w1f8AHn/pGV8cP/B/4F/+aWicYzkm +l+j6/1/ww6c
p04tLrb7Uen9f53Pkn9nR/hhpH7UPws1jwD41+HPwy8DaVfeL/D+l/EX4IeF 9H0Hwf8AFTVL
2XwPdQWFtHdLfQmS5MV7p7R2t1JeTS+HboxTxeVLBDRf4+ftc3Xwk/Zg+Ini n9o7zfGvxe+F
el32p+MdK8B6JBd6NFq/iz4aadNDYi4tLgR7rXUrp5Q/mRTXUxm8mOOGztrT 7E/4av8Ajz/0
jK+OH/g/8C//ADS0f8NX/Hn/AKRlfHD/AMH/AIF/+aWs/ZKzSk18n5f5F+1f Mm4p/OPn/meA
+Jf2m/iX4J+MOt/s5fHf9ui++HXgbwd4q1fTZfjprMPhvT9R1G+TRfCWqWGl XdxfaedIWSZd
f1llihs4Z5IdGhZW/cXbz+lfs6fEjxp8Y/DH/BPT4u/EfWf7R8ReKtcstY17 UPs8cP2q9ufh
d4nmnl8uJVRN0js21FVR


Ed Merks
Professional Support: https://www.macromodeling.com/
Re: ID problems: blanks in ID and unset int fields [message #415766 is a reply to message #415761] Fri, 04 January 2008 22:35 Go to previous messageGo to next message
Philipp Kutter is currently offline Philipp KutterFriend
Messages: 306
Registered: July 2009
Senior Member
>> I had a 2 day modeling session with a client, and to my surprise, the
>> fact that one can define an ID, and have the references look nice was
>> one of the most important things for them. It seems business oriented
>> clients like easy to read XML formats.
> I'm not surprised at all. Some folks are obsessed with the prettiness
> of XML, which seems almost an oxymoron...

My client invested a huge amount of money in an XML based Cobol
framework.. thus XML is all they have ;-)

> You say my blog about
> improvements for substitution group handling to avoid those frightening
> xsi:type attributes?
>
> http://ed-merks.blogspot.com/2007/12/winters-icy-grip.html
>
I looked through it, and I want to use it. From the text I read that I
have to change the code. I'd prefer to have an option in the genmodel,
but I will go through it again and change my templates.

By the way, do you have an idea how references in the generated XML
Schema can be made typed? This would be very beautiful. The currend
anyURI together with the ECore annotation just does not show up in an
XSD editor..

>> I thus started to use the feature with them, and we run into problems.
>>
>> These are the problems I detected:
>>
>> - spaces in String-ID attributes let the editor crash
> Yep. XML Schema doesn't allow spaces in attributes. If you serialize
> using hrefs, EMF tolerates the, but their best avoided. Note that you
> could define an EDataType that wraps java.lang.String and encode spaces
> some other way (and of course decode them as well) to allow you to use a
> value with spaces as an ID...

Hmm, but where is the relation to XML Schema? In my example project, I
just define a string as ID, and then stuff crashes.

Would we not need an EDataType that wraps String and disalows spaces,
and then only string-attributes with this EDataType can be implemented
as XML attributes, the others need an element?

>> - an int-ID attribute which is unset (but which displays as 0 in the
>> editor...) create not a reference to 0, but the usual positional
>> reference.
> Well, int's aren't valid XML Schema IDs either. Again, they are
> tolerated. In any case, when an ID isn't set, it won't be used, so be
> sure to set them.

Hmmm.

>>
>> - ID attributes which are many do crash too.
> I'm not sure what such a thing would mean...

Just that the unique ID of your class is a list of strings or integers.



>> Last but not least, I do not understand why I can select a set of
>> features for the eKeys() but only one ID.
> Because a key specifies that the indicated features much unique identify
> the object with regard to this particular reference only. That's why
> they are specified for the reference and not directly on the type.

Agree, you explained this before. But this does not mean we cannot have
several ID features. Their combination makes the ID.

>> The main purpose of the ID
>> feature in my opinion is to create clean unique business keys. Such
>> keys are typically composed from several fields, not only one.
> Yes and you can define a derived ID that's computed by composing other
> values. But in XML Schema as well, you'll find it only allows you to
> defined one attribute of type ID. That's the design we are mirroring.

I see, thus ID is an XML Schema ID, and not a primary key.

Would it not make much more sense to use the ID feature to define
primary keys, and then if they do not follow all the restrictions of
XML, they are just not declared as XML ID??

>> I attach an example project, where all that I told can be repeated. Its
>> standard EMF usage, EMF 2.4, Eclipse 3.4M4. I attach as well a screenshot
>> of the model.
> The only one that I'd consider defining a constraint for is a
> multi-valued ID. I don't think that make sense.

I think the question is, whether ID means an XML Schema ID (thus
something platform specific), or whether it means the concept of id,
like a primary key.

In the first case, all you tell me is true and understandable. But, you
have an option, which is platform specific in the .ecore

The eKeys() for
instance is not platform specific, its conceptually clear, it gives the
keys for a reference, and only all the objects reached by this reference
must have unique keys. It corresponds somehow to a map.

Your ID feature on the otherhand, although it seems to be a clear
concept (primary key), it is just a way how to tweak the XML
serialization. As it is now, it could as well go into an annotation,
like the numerous XSD annotations that already exist.


Are you strictly against making the features with ID=true to a real
primary key?

Having the option to define primary keys would be a great benefit for
all frameworks connecting with a DB and for the integration with DTP.

Best, Philipp

>>
>> Best, Philipp
>>
>> ------------------------------------------------------------ ------------
>>
>
Re: ID problems: blanks in ID and unset int fields [message #415768 is a reply to message #415756] Sat, 05 January 2008 08:45 Go to previous messageGo to next message
Eike Stepper is currently offline Eike StepperFriend
Messages: 6690
Registered: July 2009
Senior Member
Hi Philipp,

I stumbled across your words "clean unique business keys". I'm not sure
if I should really dare to start a discussion about the best nature of
primary keys here. I believe this discussion is ongoing in the database
area for over 25 years now with many articles like the following:
-
http://www.smart-it-consulting.com/database/progress-databas e-design-guide/
- http://tonymarston.co.uk/php-mysql/technicalkeys.html
- http://www.agiledata.org/essays/keys.html

Personally I believe that in many situations a technical primary key is
better. But without knowing details about a concrete scenario this is
only "my general strategy". And of course most customers have their own
key religion anyway ;-)

At least with a read-only (derived, generated) technical primary key you
can easily guarantee that a business user doesn't change the primary key
by changing business data.

Regards,
Eike Stepper
----
http://wiki.eclipse.org/CDO
http://wiki.eclipse.org/Net4j



Philipp W. Kutter schrieb:
> Hi.
> I had a 2 day modeling session with a client, and to my surprise, the
> fact that one can define an ID, and have the references look nice was
> one of the most important things for them. It seems business oriented
> clients like easy to read XML formats.
>
>
> I thus started to use the feature with them, and we run into problems.
>
> These are the problems I detected:
>
> - spaces in String-ID attributes let the editor crash
>
> - an int-ID attribute which is unset (but which displays as 0 in the
> editor...) create not a reference to 0, but the usual positional
> reference.
>
> - ID attributes which are many do crash too.
>
>
>
> Last but not least, I do not understand why I can select a set of
> features for the eKeys() but only one ID. The main purpose of the ID
> feature in my opinion is to create clean unique business keys. Such
> keys are typically composed from several fields, not only one.
>
> I attach an example project, where all that I told can be repeated. Its
> standard EMF usage, EMF 2.4, Eclipse 3.4M4. I attach as well a screenshot
> of the model.
>
> Best, Philipp


Re: ID problems: blanks in ID and unset int fields [message #415769 is a reply to message #415766] Sat, 05 January 2008 12:15 Go to previous messageGo to next message
Ed Merks is currently offline Ed MerksFriend
Messages: 33216
Registered: July 2009
Senior Member
This is a multi-part message in MIME format.
--------------080506070701080102010200
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Philipp,

Comments below.


Philipp W. Kutter wrote:
>
>>> I had a 2 day modeling session with a client, and to my surprise, the
>>> fact that one can define an ID, and have the references look nice was
>>> one of the most important things for them. It seems business oriented
>>> clients like easy to read XML formats.
>> I'm not surprised at all. Some folks are obsessed with the
>> prettiness of XML, which seems almost an oxymoron...
>
> My client invested a huge amount of money in an XML based Cobol
> framework.. thus XML is all they have ;-)
I wonder if your clients who apparently have a huge amount of money know
they can donate huge or small amounts of it to Eclipse. :-P
<http://www.eclipse.org/donate/donorlist.php>

http://www.eclipse.org/donate/donorlist.php

>
>
> > You say my blog about
>> improvements for substitution group handling to avoid those
>> frightening xsi:type attributes?
>>
>> http://ed-merks.blogspot.com/2007/12/winters-icy-grip.html
>>
> I looked through it, and I want to use it. From the text I read that I
> have to change the code. I'd prefer to have an option in the genmodel,
> but I will go through it again and change my templates.
Mostly it's just annotations in the XSD. I suppose you mean adding the
save option to the generated factory, but there are just so many options
for the load and save support that starting to provide individual
generator control over them seems too big an undertaking...
>
> By the way, do you have an idea how references in the generated XML
> Schema can be made typed? This would be very beautiful. The currend
> anyURI together with the ECore annotation just does not show up in an
> XSD editor..
You mean a nice XSD editor for editing annotations? I suppose every
editor should support that, but annotations are entirely free form so
it's most just DOM editing. I imagine an Eclipse editor could support
an extension support with nice wizards or some other mechanism for
defining specific types of well structured annotations (kind of like
what we want to do for Ecore itself but didn't get around to yet).
>
>>> I thus started to use the feature with them, and we run into problems.
>>>
>>> These are the problems I detected:
>>>
>>> - spaces in String-ID attributes let the editor crash
>> Yep. XML Schema doesn't allow spaces in attributes. If you
>> serialize using hrefs, EMF tolerates the, but their best avoided.
>> Note that you could define an EDataType that wraps java.lang.String
>> and encode spaces some other way (and of course decode them as well)
>> to allow you to use a value with spaces as an ID...
>
> Hmm, but where is the relation to XML Schema? In my example project, I
> just define a string as ID, and then stuff crashes.
The EAttribute's ID support was added purely as an analog to XML
Schema's xsd:ID and from an XML serialization perspective, the same
types of restrictions apply. But of course XML is not necessarily the
only form of serialization and not in all cases will spaces in the ID
cause a problem for the reference, so I'd be reluctant to try to treat
such things purely as an error during validation. If you use the
XMLTypePackage's ID type, then the constraint that it must be a well
formed XML Schema ID will be enforced.
>
> Would we not need an EDataType that wraps String and disalows spaces,
> and then only string-attributes with this EDataType can be implemented
> as XML attributes, the others need an element?
That's one way yes, and the XMLTypePackage has such a type. But if your
client wants to use a field who's values can contain spaces and still
wants to use those to create IDREFS then the approach of encode and
decode would work quite nicely.
>
>>> - an int-ID attribute which is unset (but which displays as 0 in the
>>> editor...) create not a reference to 0, but the usual positional
>>> reference.
>> Well, int's aren't valid XML Schema IDs either. Again, they are
>> tolerated. In any case, when an ID isn't set, it won't be used, so
>> be sure to set them.
>
> Hmmm.
The rules for ID are the same as NCName, i.e., if you can't use it as an
element name you can't use it as an ID.
>
>>>
>>> - ID attributes which are many do crash too.
>> I'm not sure what such a thing would mean...
>
> Just that the unique ID of your class is a list of strings or integers.
Yes, more of a composed thing yet again. The problem is representing
such thing as a string, which you'd normally do with a space separated
list, but of course that's not going to work nicely.
>
>
>
>>> Last but not least, I do not understand why I can select a set of
>>> features for the eKeys() but only one ID.
>> Because a key specifies that the indicated features much unique
>> identify the object with regard to this particular reference only.
>> That's why they are specified for the reference and not directly on
>> the type.
>
> Agree, you explained this before. But this does not mean we cannot have
> several ID features. Their combination makes the ID.
XML Schema doesn't allow that an I'm not keen on introducing such
additional complexity. You'll have to define a derived feature and
compose the value in whatever way is appropriate for the data types
involved.
>
>>> The main purpose of the ID
>>> feature in my opinion is to create clean unique business keys. Such
>>> keys are typically composed from several fields, not only one.
>> Yes and you can define a derived ID that's computed by composing
>> other values. But in XML Schema as well, you'll find it only allows
>> you to defined one attribute of type ID. That's the design we are
>> mirroring.
>
> I see, thus ID is an XML Schema ID, and not a primary key.
I'm not so database literate. I understand that a primary key is one or
more columns in a table that uniquely identify a row in the table. Thus
different tables could have the same primary key, if such a statement
makes sense since columns are not shared across tables. In that sense,
the name of the table along with the primary key within the tabl does
act very much like a unique ID within the database.
>
> Would it not make much more sense to use the ID feature to define
> primary keys, and then if they do not follow all the restrictions of
> XML, they are just not declared as XML ID??
Primary key is a database concept. I'm not sure what you are
proposing. The use of IDs in EMF is very much like that in XML. I.e.,
the value of the ID must uniquely define the object within the
resource. I.e., if EcoreUtil.getID(x) != null and x.eResource() != null
then x.eResource().getEObject(EcoreUtil.getID(x)) == x.
>
>>> I attach an example project, where all that I told can be repeated. Its
>>> standard EMF usage, EMF 2.4, Eclipse 3.4M4. I attach as well a
>>> screenshot
>>> of the model.
>> The only one that I'd consider defining a constraint for is a
>> multi-valued ID. I don't think that make sense.
>
> I think the question is, whether ID means an XML Schema ID (thus
> something platform specific), or whether it means the concept of id,
> like a primary key.
The above statement is the intended meaning. I.e., the value of the ID
attribute, converted to a string as defined by the data type of that
feature must uniquely identify the object within it's containing resource.
>
> In the first case, all you tell me is true and understandable. But,
> you have an option, which is platform specific in the .ecore
>
> The eKeys() for
> instance is not platform specific, its conceptually clear, it gives
> the keys for a reference, and only all the objects reached by this
> reference
> must have unique keys. It corresponds somehow to a map.
It's also very similar to a database table if you consider each
reference to be like a table. An in fact, if the referenced type is
stored in a table, then all references to that type can use the same
eKeys because not only are they unique with respect to that reference
but they are unique for all instances of the type.
>
> Your ID feature on the otherhand, although it seems to be a clear
> concept (primary key), it is just a way how to tweak the XML
> serialization. As it is now, it could as well go into an annotation,
> like the numerous XSD annotations that already exist.
No, I don't really see it that way. Certainly the XML concepts are the
analog, but from a purely Ecore perspective, it's only about uniquely
identifying the object within its containing resource. The same concept
could be used to serialize in a form other than XML.
>
>
> Are you strictly against making the features with ID=true to a real
> primary key?
Yes, though mostly that's because I don't really understand what you are
proposing. I see database concepts as quite different. Databases have
the luxury to taking what I call a closed universe model. I.e., they
have bounds on all possible data that exists. EMF is more like REST
where the universe of all data instances is effectively unbounded...
>
> Having the option to define primary keys would be a great benefit for
> all frameworks connecting with a DB and for the integration with DTP.
I don't understand what the implication is though. It seems to me that
the combination of table name and the primary key values would act as an
ID and hence already provides what's needed.

If course I haven't thrown the whole issue of intrinsic and extrinsic
IDs at you. So far all this stuff has been about intrinsic IDs which
are stored as data on the instances. Resources can also maintain
extrinsic IDs that are maintained as a separate two-way map by the
resource. That's another approach that could be used (and is how xmi:id
is supported).
>
> Best, Philipp
>
>>>
>>> Best, Philipp
>>>
>>> ------------------------------------------------------------ ------------
>>>
>>>
>>


--------------080506070701080102010200
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Philipp,<br>
<br>
Comments below.<br>
<br>
<br>
Philipp W. Kutter wrote:
<blockquote cite="mid:flmc9k$d11$1@build.eclipse.org" type="cite"><br>
<blockquote type="cite">
<blockquote type="cite">I had a 2 day modeling session with a
client, and to my surprise, the
<br>
fact that one can define an ID, and have the references look nice was
<br>
one of the most important things for them. It seems business oriented
<br>
clients like easy to read XML formats.
<br>
</blockquote>
I'm not surprised at all.&nbsp; Some folks are obsessed with the prettiness
of XML, which seems almost an oxymoron...&nbsp; </blockquote>
<br>
My client invested a huge amount of money in an XML based Cobol
framework.. thus XML is all they have ;-)</blockquote>
I wonder if your clients who apparently have a huge amount of money
know they can donate huge or small amounts of it to Eclipse.&nbsp; :-P<a
href="http://www.eclipse.org/donate/donorlist.php"><br>
</a>
<blockquote><a href="http://www.eclipse.org/donate/donorlist.php">http://www.eclipse.org/donate/donorlist.php</a><br>
</blockquote>
<blockquote cite="mid:flmc9k$d11$1@build.eclipse.org" type="cite"><br>
<br>
&gt; You say my blog about
<br>
<blockquote type="cite">improvements for substitution group handling
to avoid those frightening xsi:type attributes?
<br>
<br>
&nbsp;&nbsp;&nbsp; <a class="moz-txt-link-freetext" href="http://ed-merks.blogspot.com/2007/12/winters-icy-grip.html">http://ed-merks.blogspot.com/2007/12/winters-icy-grip.html</a>
<br>
<br>
</blockquote>
I looked through it, and I want to use it. From the text I read that I
have to change the code. I'd prefer to have an option in the genmodel,
but I will go through it again and change my templates.
<br>
</blockquote>
Mostly it's just annotations in the XSD.&nbsp; I suppose you mean adding the
save option to the generated factory, but there are just so many
options for the load and save support that starting to provide
individual generator control over them seems too big an undertaking...<br>
<blockquote cite="mid:flmc9k$d11$1@build.eclipse.org" type="cite"><br>
By the way, do you have an idea how references in the generated XML
Schema can be made typed? This would be very beautiful. The currend
anyURI together with the ECore annotation just does not show up in an
XSD editor..
<br>
</blockquote>
You mean a nice XSD editor for editing annotations?&nbsp; I suppose every
editor should support that, but annotations are entirely free form so
it's most just DOM editing.&nbsp; I imagine an Eclipse editor could support
an extension support with nice wizards or some other mechanism for
defining specific types of well structured annotations (kind of like
what we want to do for Ecore itself but didn't get around to yet).<br>
<blockquote cite="mid:flmc9k$d11$1@build.eclipse.org" type="cite"><br>
<blockquote type="cite">
<blockquote type="cite">I thus started to use the feature with
them, and we run into problems.
<br>
<br>
These are the problems I detected:
<br>
<br>
- spaces in String-ID attributes let the editor crash
<br>
</blockquote>
Yep.&nbsp; XML Schema doesn't allow spaces in attributes.&nbsp; If you serialize
using hrefs, EMF tolerates the, but their best avoided.&nbsp; Note that you
could define an EDataType that wraps java.lang.String and encode spaces
some other way (and of course decode them as well) to allow you to use
a value with spaces as an ID...
<br>
</blockquote>
<br>
Hmm, but where is the relation to XML Schema? In my example project, I
just define a string as ID, and then stuff crashes.
<br>
</blockquote>
The EAttribute's ID support was added purely as an analog to XML
Schema's xsd:ID and from an XML serialization perspective, the same
types of restrictions apply.&nbsp; But of course XML is not necessarily the
only form of serialization and not in all cases will spaces in the ID
cause a problem for the reference, so I'd be reluctant to try to treat
such things purely as an error during validation.&nbsp; If you use the
XMLTypePackage's ID type, then the constraint that it must be a well
formed XML Schema ID will be enforced.<br>
<blockquote cite="mid:flmc9k$d11$1@build.eclipse.org" type="cite"><br>
Would we not need an EDataType that wraps String and disalows spaces,
and then only string-attributes with this EDataType can be implemented
as XML attributes, the others need an element?
<br>
</blockquote>
That's one way yes, and the XMLTypePackage has such a type.&nbsp; But if
your client wants to use a field who's values can contain spaces and
still wants to use those to create IDREFS then the approach of encode
and decode would work quite nicely.<br>
<blockquote cite="mid:flmc9k$d11$1@build.eclipse.org" type="cite"><br>
<blockquote type="cite">
<blockquote type="cite">- an int-ID attribute which is unset (but
which displays as 0 in the editor...) create not a reference to 0, but
the usual positional reference.
<br>
</blockquote>
Well, int's aren't valid XML Schema IDs either.&nbsp; Again, they are
tolerated.&nbsp; In any case, when an ID isn't set, it won't be used, so be
sure to set them.
<br>
</blockquote>
<br>
Hmmm.
<br>
</blockquote>
The rules for ID are the same as NCName, i.e., if you can't use it as
an element name you can't use it as an ID.<br>
<blockquote cite="mid:flmc9k$d11$1@build.eclipse.org" type="cite"><br>
<blockquote type="cite">
<blockquote type="cite"><br>
- ID attributes which are many do crash too.
<br>
</blockquote>
I'm not sure what such a thing would mean...
<br>
</blockquote>
<br>
Just that the unique ID of your class is a list of strings or integers.
<br>
</blockquote>
Yes, more of a composed thing yet again.&nbsp; The problem is representing
such thing as a string, which you'd normally do with a space separated
list, but of course that's not going to work nicely.<br>
<blockquote cite="mid:flmc9k$d11$1@build.eclipse.org" type="cite"><br>
<br>
<br>
<blockquote type="cite">
<blockquote type="cite">Last but not least, I do not understand why
I can select a set of features for the eKeys() but only one ID. </blockquote>
Because a key specifies that the indicated features much unique
identify the object with regard to this particular reference only.&nbsp;&nbsp;
That's why they are specified for the reference and not directly on the
type.
<br>
</blockquote>
<br>
Agree, you explained this before. But this does not mean we cannot have
<br>
several ID features. Their combination makes the ID.
<br>
</blockquote>
XML Schema doesn't allow that an I'm not keen on introducing such
additional complexity.&nbsp; You'll have to define a derived feature and
compose the value in whatever way is appropriate for the data types
involved.<br>
<blockquote cite="mid:flmc9k$d11$1@build.eclipse.org" type="cite"><br>
<blockquote type="cite">
<blockquote type="cite">The main purpose of the ID
<br>
feature in my opinion is to create clean unique business keys. Such
<br>
keys are typically composed from several fields, not only one.
<br>
</blockquote>
Yes and you can define a derived ID that's computed by composing other
values.&nbsp; But in XML Schema as well, you'll find it only allows you to
defined one attribute of type ID.&nbsp; That's the design we are mirroring.
<br>
</blockquote>
<br>
I see, thus ID is an XML Schema ID, and not a primary key.
<br>
</blockquote>
I'm not so database literate.&nbsp; I understand that a primary key is one
or more columns in a table that uniquely identify a row in the table.&nbsp;
Thus different tables could have the same primary key, if such a
statement makes sense since columns are not shared across tables.&nbsp;&nbsp; In
that sense, the name of the table along with the primary key within the
tabl does act very much like a unique ID within the database.<br>
<blockquote cite="mid:flmc9k$d11$1@build.eclipse.org" type="cite"><br>
Would it not make much more sense to use the ID feature to define
primary keys, and then if they do not follow all the restrictions of
XML, they are just not declared as XML ID??
<br>
</blockquote>
Primary key is a database concept.&nbsp; I'm not sure what you are
proposing.&nbsp; The use of IDs in EMF is very much like that in XML.&nbsp; I.e.,
the value of the ID must uniquely define the object within the
resource.&nbsp; I.e., if EcoreUtil.getID(x) != null and x.eResource() !=
null then x.eResource().getEObject(EcoreUtil.getID(x)) == x.<br>
<blockquote cite="mid:flmc9k$d11$1@build.eclipse.org" type="cite"><br>
<blockquote type="cite">
<blockquote type="cite">I attach an example project, where all that
I told can be repeated. Its
<br>
standard EMF usage, EMF 2.4, Eclipse 3.4M4. I attach as well a
screenshot
<br>
of the model.
<br>
</blockquote>
The only one that I'd consider defining a constraint for is a
multi-valued ID.&nbsp; I don't think that make sense.
<br>
</blockquote>
<br>
I think the question is, whether ID means an XML Schema ID (thus
something platform specific), or whether it means the concept of id,
like a primary key.
<br>
</blockquote>
The above statement is the intended meaning.&nbsp; I.e., the value of the ID
attribute, converted to a string as defined by the data type of that
feature must uniquely identify the object within it's containing
resource.<br>
<blockquote cite="mid:flmc9k$d11$1@build.eclipse.org" type="cite"><br>
In the first case, all you tell me is true and understandable. But, you
have an option, which is platform specific in the .ecore
<br>
<br>
The eKeys() for
<br>
instance is not platform specific, its conceptually clear, it gives the
keys for a reference, and only all the objects reached by this
reference
<br>
must have unique keys. It corresponds somehow to a map.
<br>
</blockquote>
It's also very similar to a database table if you consider each
reference to be like a table.&nbsp; An in fact, if the referenced type is
stored in a table, then all references to that type can use the same
eKeys because not only are they unique with respect to that reference
but they are unique for all instances of the type.<br>
<blockquote cite="mid:flmc9k$d11$1@build.eclipse.org" type="cite"><br>
Your ID feature on the otherhand, although it seems to be a clear
concept (primary key), it is just a way how to tweak the XML
serialization. As it is now, it could as well go into an annotation,
like the numerous XSD annotations that already exist.
<br>
</blockquote>
No, I don't really see it that way.&nbsp; Certainly the XML concepts are the
analog, but from a purely Ecore perspective, it's only about uniquely
identifying the object within its containing resource.&nbsp; The same
concept could be used to serialize in a form other than XML.<br>
<blockquote cite="mid:flmc9k$d11$1@build.eclipse.org" type="cite"><br>
<br>
Are you strictly against making the features with ID=true to a real
<br>
primary key?
<br>
</blockquote>
Yes, though mostly that's because I don't really understand what you
are proposing.&nbsp; I see database concepts as quite different.&nbsp; Databases
have the luxury to taking what I call a closed universe model.&nbsp; I.e.,
they have bounds on all possible data that exists.&nbsp; EMF is more like
REST where the universe of all data instances is effectively
unbounded...<br>
<blockquote cite="mid:flmc9k$d11$1@build.eclipse.org" type="cite"><br>
Having the option to define primary keys would be a great benefit for
all frameworks connecting with a DB and for the integration with DTP.
<br>
</blockquote>
I don't understand what the implication is though.&nbsp; It seems to me that
the combination of table name and the primary key values would act as
an ID and hence already provides what's needed.<br>
<br>
If course I haven't thrown the whole issue of intrinsic and extrinsic
IDs at you.&nbsp; So far all this stuff has been about intrinsic IDs which
are stored as data on the instances.&nbsp; Resources can also maintain
extrinsic IDs that are maintained as a separate two-way map by the
resource.&nbsp; That's another approach that could be used (and is how
xmi:id is supported).<br>
<blockquote cite="mid:flmc9k$d11$1@build.eclipse.org" type="cite"><br>
Best, Philipp
<br>
<br>
<blockquote type="cite">
<blockquote type="cite"><br>
Best, Philipp
<br>
<br>
------------------------------------------------------------ ------------
<br>
<br>
</blockquote>
<br>
</blockquote>
</blockquote>
<br>
</body>
</html>

--------------080506070701080102010200--


Ed Merks
Professional Support: https://www.macromodeling.com/
Re: ID problems: blanks in ID and unset int fields [message #415770 is a reply to message #415769] Sat, 05 January 2008 18:25 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: cdamus.ca.ibm.com

Hi, Ed, Philipp,

It might help also to add that the "ID attribute" is a EMOF concept, and not
just an XML Schema concept. MOF 2.x defines, in EMOF, an "isID" attribute
on the Property metaclass (actually merged from Identifiers capability
package). MOF specifies this constraint on Identifiers::Property :

[1] Property.isID can only be true for one Property of a Class.

Regarding the XML representation of IDs: as Ed mentions, xs:ID is derived
from xs:NCName, which values cannot start with a digit. This is why UUIDs
generated by EMF often (always?) start with an underscore. This is also
why whitespace isn't permitted, besides the practical problem of the IDREFS
data type being a space-delimited list of IDREF.

HTH,

Christian
Re: ID problems: blanks in ID and unset int fields [message #415773 is a reply to message #415769] Sun, 06 January 2008 13:15 Go to previous messageGo to next message
Philipp Kutter is currently offline Philipp KutterFriend
Messages: 306
Registered: July 2009
Senior Member
> I wonder if your clients who apparently have a huge amount of money know
> they can donate huge or small amounts of it to Eclipse. :-P
> <http://www.eclipse.org/donate/donorlist.php>
>
> http://www.eclipse.org/donate/donorlist.php
>
I just put you in contact with my main person there. Hope we get through.



>> By the way, do you have an idea how references in the generated XML
>> Schema can be made typed? This would be very beautiful. The currend
>> anyURI together with the ECore annotation just does not show up in an
>> XSD editor..
> You mean a nice XSD editor for editing annotations? I suppose every
> editor should support that, but annotations are entirely free form so
> it's most just DOM editing. I imagine an Eclipse editor could support
> an extension support with nice wizards or some other mechanism for
> defining specific types of well structured annotations (kind of like
> what we want to do for Ecore itself but didn't get around to yet).

No, I mean to find a way where we define an XSD type T and then an
attribute with type="T". But my own experiments showed, that this is not
possible in XSD.


>> Hmm, but where is the relation to XML Schema? In my example project, I
>> just define a string as ID, and then stuff crashes.
> The EAttribute's ID support was added purely as an analog to XML
> Schema's xsd:ID and from an XML serialization perspective, the same
> types of restrictions apply. But of course XML is not necessarily the
> only form of serialization and not in all cases will spaces in the ID
> cause a problem for the reference, so I'd be reluctant to try to treat
> such things purely as an error during validation. If you use the
> XMLTypePackage's ID type, then the constraint that it must be a well
> formed XML Schema ID will be enforced.

Ok, thanks for that hint. Your advice on the ID feature is very useful.

By the way, it would be cool, if one of the tutorial shows how to
introduce new DataTypes, restrict their value range (for instance using
regexp) and then use them in the model.

Do conflicts with the DataType be reported by the validation framework?

This leads me to another question: with the validation of values, it
would be possible to validate the result of applying a setter, and if as
a result there is a validation error, the value would be rejected. Does
it make sense if I add a feature request like this?

>> Would we not need an EDataType that wraps String and disalows spaces,
>> and then only string-attributes with this EDataType can be implemented
>> as XML attributes, the others need an element?
> That's one way yes, and the XMLTypePackage has such a type. But if your
> client wants to use a field who's values can contain spaces and still
> wants to use those to create IDREFS then the approach of encode and
> decode would work quite nicely.
I understand. We will program this and donate it back. Maybe you could
then consider using this datatype rather than String, if ID=true is set?

>>>> - an int-ID attribute which is unset (but which displays as 0 in the
>>>> editor...) create not a reference to 0, but the usual positional
>>>> reference.
>>> Well, int's aren't valid XML Schema IDs either. Again, they are
>>> tolerated. In any case, when an ID isn't set, it won't be used, so
>>> be sure to set them.
>>
>> Hmmm.
> The rules for ID are the same as NCName, i.e., if you can't use it as an
> element name you can't use it as an ID.

I understand. Would not everything be much more stable if you have a
bullet proof String <-> NCName conversion, and you apply this conversion
both for element names and for String-values of features with ID=true?


>>>> - ID attributes which are many do crash too.
>>> I'm not sure what such a thing would mean...
>>
>> Just that the unique ID of your class is a list of strings or integers.
> Yes, more of a composed thing yet again. The problem is representing
> such thing as a string, which you'd normally do with a space separated
> list, but of course that's not going to work nicely.
It will work for numbers, booleans and chars, but not for strings. Thus
for strings a list of separate XML-elements would be better.

As I noted in other posts, I think its a fundamental advantage of EMF to
treat things as having a type and an arity. This is more the MOF
abstraction level, while having just a type is more Java.

It would be cool if this advantage would carry over to ID's too.

>> Agree, you explained this before. But this does not mean we cannot have
>> several ID features. Their combination makes the ID.
> XML Schema doesn't allow that an I'm not keen on introducing such
> additional complexity. You'll have to define a derived feature and
> compose the value in whatever way is appropriate for the data types
> involved.

I agree. But the framework could easily introduce such a feature, and
then use this for the references. Like this the String<->NCName
conversion could be done on this derived feature only. Maybe we need
to have our own annotation for primary (and maybe as well foreign) keys.

>>>> The main purpose of the ID
>>>> feature in my opinion is to create clean unique business keys. Such
>>>> keys are typically composed from several fields, not only one.
>>> Yes and you can define a derived ID that's computed by composing
>>> other values. But in XML Schema as well, you'll find it only allows
>>> you to defined one attribute of type ID. That's the design we are
>>> mirroring.
>>
>> I see, thus ID is an XML Schema ID, and not a primary key.
> I'm not so database literate.
I wasn't until the market exposed me to DataWarehouse projects. It seems
there is a huge universe of opportunities for EMF there. Immagine for
instance, that the DataType feature of EMF could be reused for
data-managament initiatives in large institutions.

> I understand that a primary key is one or
> more columns in a table that uniquely identify a row in the table.
Exactly. In contrast to this, objects of a OO class have their own
identity, thus there can be two objects with the same feature-values,
but never two entries in such a table

> Thus
> different tables could have the same primary key, if such a statement
> makes sense since columns are not shared across tables. In that sense,
> the name of the table along with the primary key within the tabl does
> act very much like a unique ID within the database.

Agree completly.

>> Would it not make much more sense to use the ID feature to define
>> primary keys, and then if they do not follow all the restrictions of
>> XML, they are just not declared as XML ID??
> Primary key is a database concept. I'm not sure what you are
> proposing.
It's rather an Information Modeling concept, which is enforced by
relational databases, and one of the few differences between a UML class
model, and a conceptual data model. As well, it can be though of as a
standard constraint telling that for all instances, there are not
two instances with the same primary key.

A model with this information is just richer than one where I do not
know this. In the financial industry must applications are CRUD
applications. Most of the inteligence is in the data-model. And primary
keys are an important part of that models. I'd like to see EMF being
usable as a replacement for conceptual data models.

> The use of IDs in EMF is very much like that in XML. I.e.,
> the value of the ID must uniquely define the object within the
> resource. I.e., if EcoreUtil.getID(x) != null and x.eResource() != null
> then x.eResource().getEObject(EcoreUtil.getID(x)) == x.
I understand. It's very clear now, thanks a lot.

>>>> I attach an example project, where all that I told can be repeated. Its
>>>> standard EMF usage, EMF 2.4, Eclipse 3.4M4. I attach as well a
>>>> screenshot
>>>> of the model.
>>> The only one that I'd consider defining a constraint for is a
>>> multi-valued ID. I don't think that make sense.
>>
>> I think the question is, whether ID means an XML Schema ID (thus
>> something platform specific), or whether it means the concept of id,
>> like a primary key.
> The above statement is the intended meaning. I.e., the value of the ID
> attribute, converted to a string as defined by the data type of that
> feature must uniquely identify the object within it's containing resource.

What you define is exactly the concept of a primary key. At the moment,
the conversion into a String for this id is not done by EMF
automatically in a way that is conforming with NCName, and I cannot have
combined and multi-valued ID's.

All I try to understand is whether we need to solve these problems on
our own, or whether we can hope to push EMF towards supporting ID's in
a most generic way, similar or superior to the way conceptual data
models do this.

By the way, in information modeling it works like this:

In the conceptual model, you define an entity/table/class (I use class
for the reminder) X with attributes/columns/references (I use reference
for the reminder) a, b, c. You mark a and b to bee the primary keys.

Then in a second class Y, you create a reference to X with name x.

This conceptual model corresponds to ECore, in my opinion.

Now, you generate from the conceptual model a physical model. In this
model, the reference from Y to X is implemented with two attributes in
Y. Since the reference was called x, these attributes need a combined
name made of x and the two primary keys a, b. Thus there will be two
attributes in Y, one called xA and one called xB. Their type is the type
of attributes a and b of X.

If the pattern for the physical model would be used in EMF too, this
would be huge. It would accelerate the speed in which we can move DB
projects over to EMF.

By the way2: Thus this not already work by introducing features x, xA,
and xB in Y, making a derived feature primaryKey in X, which combines a
and b to a NCName? I would make primaryKey, and x transient, so only
xA, xB, a, and b appear in the XML. And then I would derive primaryKey
from a,b, and x would derive from the values of xA and xB.

It would be nice if I could as well make xA and xB volatile, and having
just one instance variable x holding the primaryKey.

The reason I insist is, that I feel we are just very near to make EMF
useful in the data modeling and data management space. This is a huge
area, much larger than the OO space.

>> In the first case, all you tell me is true and understandable. But,
>> you have an option, which is platform specific in the .ecore
>>
>> The eKeys() for
>> instance is not platform specific, its conceptually clear, it gives
>> the keys for a reference, and only all the objects reached by this
>> reference
>> must have unique keys. It corresponds somehow to a map.
> It's also very similar to a database table if you consider each
> reference to be like a table. An in fact, if the referenced type is
> stored in a table, then all references to that type can use the same
> eKeys because not only are they unique with respect to that reference
> but they are unique for all instances of the type.

I agree. In addition, the eKeys() feature somehow tells, that I store
values of these features, to reference objects.

If the feature is multi-valued, this means, selecting an object in this
reference, will return all objects with those values of these features.
Thus it is very different to the OO view.

If the feature is not multi-valued, the eKeys() should be the same as
the primary key.

I would personally restrict the meaning of eKeys() to containment features.

>> Your ID feature on the otherhand, although it seems to be a clear
>> concept (primary key), it is just a way how to tweak the XML
>> serialization. As it is now, it could as well go into an annotation,
>> like the numerous XSD annotations that already exist.
> No, I don't really see it that way. Certainly the XML concepts are the
> analog, but from a purely Ecore perspective, it's only about uniquely
> identifying the object within its containing resource. The same concept
> could be used to serialize in a form other than XML.
Ok, I agree.

>> Are you strictly against making the features with ID=true to a real
>> primary key?
> Yes, though mostly that's because I don't really understand what you are
> proposing. I see database concepts as quite different. Databases have
> the luxury to taking what I call a closed universe model. I.e., they
> have bounds on all possible data that exists. EMF is more like REST
> where the universe of all data instances is effectively unbounded...
But within a resource, or within containment, you hava a closed universe
too. Thus resource+primaryKey would fit well EMF.


>> Having the option to define primary keys would be a great benefit for
>> all frameworks connecting with a DB and for the integration with DTP.
> I don't understand what the implication is though. It seems to me that
> the combination of table name and the primary key values would act as an
> ID and hence already provides what's needed.
I agree. As you see in my example above, it seems we get everything with
a few derived and transient features.

> If course I haven't thrown the whole issue of intrinsic and extrinsic
> IDs at you. So far all this stuff has been about intrinsic IDs which
> are stored as data on the instances. Resources can also maintain
> extrinsic IDs that are maintained as a separate two-way map by the
> resource. That's another approach that could be used (and is how xmi:id
> is supported).
Can you give me a pointer to a modesl with such a seperate two-way map?
I would be interested to learn about this.
Best, Philipp
>>
>> Best, Philipp
>>
>>>>
>>>> Best, Philipp
>>>>
Re: ID problems: blanks in ID and unset int fields [message #415774 is a reply to message #415770] Sun, 06 January 2008 13:18 Go to previous messageGo to next message
Philipp Kutter is currently offline Philipp KutterFriend
Messages: 306
Registered: July 2009
Senior Member
Ok, in this case I take back all proposals to use ID
to define combined primary keys.

But it would makes sense to have a conversion to NCName for
all features declared as ID. Not?

My example project shows that this is not done.

Best, Philipp

Christian W. Damus wrote:
> Hi, Ed, Philipp,
>
> It might help also to add that the "ID attribute" is a EMOF concept, and not
> just an XML Schema concept. MOF 2.x defines, in EMOF, an "isID" attribute
> on the Property metaclass (actually merged from Identifiers capability
> package). MOF specifies this constraint on Identifiers::Property :
>
> [1] Property.isID can only be true for one Property of a Class.
>
> Regarding the XML representation of IDs: as Ed mentions, xs:ID is derived
> from xs:NCName, which values cannot start with a digit. This is why UUIDs
> generated by EMF often (always?) start with an underscore. This is also
> why whitespace isn't permitted, besides the practical problem of the IDREFS
> data type being a space-delimited list of IDREF.
>
> HTH,
>
> Christian
Re: ID problems: blanks in ID and unset int fields [message #415775 is a reply to message #415768] Sun, 06 January 2008 13:28 Go to previous messageGo to next message
Philipp Kutter is currently offline Philipp KutterFriend
Messages: 306
Registered: July 2009
Senior Member
Hi, Eike.
I agree completely with what you say.

Actual implementations on the DB in fact have always technical keys,
bitemporality, e.t.c. This is needed, since there are always errors,
corrections, e.t.c. Unfortunatly people as well tend to not modeling
relations in real DBs, at least in the Data Warehouse Area.

But if business models are designed and validated, the business knows
very well what makes a real object unique. And they will always discuss
on this level.

What people who do discuss about primary keys in DB design forget is,
that after the DB Design come the reporting engines BO, Cognos, Birt,
e.t.c. And there people define their own business primary keys. And
decisions are made based on these reports.

Thus, we want to capture the abstract view of the business, and then
generate or connect the various technical platforms (XML, DB, Reporting
Engine, Z/OS, e.t.c.)

EMF has the chance to be the hub for all this. In the business view,
technical fields do not appear, and the EMF model may have the primary
key defined by business.

In the DB view, these primary keys do not exist, and are replaced by
technical keys. There exist two EMF models: one where the records are
loaded, and OO identity is used. Thus the DB simulates technical keys
(or has technical keys) but they are irrelevant. Thus this EMF model has
no primary key. Or I have an EMF model which includes the technical
keys, but there I can build the primary key again, using technical
attributes.

Best, Philipp



Eike Stepper wrote:
> Hi Philipp,
>
> I stumbled across your words "clean unique business keys". I'm not sure
> if I should really dare to start a discussion about the best nature of
> primary keys here. I believe this discussion is ongoing in the database
> area for over 25 years now with many articles like the following:
> -
> http://www.smart-it-consulting.com/database/progress-databas e-design-guide/
> - http://tonymarston.co.uk/php-mysql/technicalkeys.html
> - http://www.agiledata.org/essays/keys.html
>
> Personally I believe that in many situations a technical primary key is
> better. But without knowing details about a concrete scenario this is
> only "my general strategy". And of course most customers have their own
> key religion anyway ;-)
>
> At least with a read-only (derived, generated) technical primary key you
> can easily guarantee that a business user doesn't change the primary key
> by changing business data.
>
> Regards,
> Eike Stepper
> ----
> http://wiki.eclipse.org/CDO
> http://wiki.eclipse.org/Net4j
>
>
>
> Philipp W. Kutter schrieb:
>> Hi.
>> I had a 2 day modeling session with a client, and to my surprise, the
>> fact that one can define an ID, and have the references look nice was
>> one of the most important things for them. It seems business oriented
>> clients like easy to read XML formats.
>>
>>
>> I thus started to use the feature with them, and we run into problems.
>>
>> These are the problems I detected:
>>
>> - spaces in String-ID attributes let the editor crash
>>
>> - an int-ID attribute which is unset (but which displays as 0 in the
>> editor...) create not a reference to 0, but the usual positional
>> reference.
>>
>> - ID attributes which are many do crash too.
>>
>>
>>
>> Last but not least, I do not understand why I can select a set of
>> features for the eKeys() but only one ID. The main purpose of the ID
>> feature in my opinion is to create clean unique business keys. Such
>> keys are typically composed from several fields, not only one.
>>
>> I attach an example project, where all that I told can be repeated. Its
>> standard EMF usage, EMF 2.4, Eclipse 3.4M4. I attach as well a screenshot
>> of the model.
>>
>> Best, Philipp
Re: ID problems: blanks in ID and unset int fields [message #415778 is a reply to message #415773] Sun, 06 January 2008 13:55 Go to previous message
Ed Merks is currently offline Ed MerksFriend
Messages: 33216
Registered: July 2009
Senior Member
This is a multi-part message in MIME format.
--------------060603060407030806080403
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Philipp,

Comments below.

Philipp W. Kutter wrote:
>
>> I wonder if your clients who apparently have a huge amount of money
>> know they can donate huge or small amounts of it to Eclipse. :-P
>> <http://www.eclipse.org/donate/donorlist.php>
>>
>> http://www.eclipse.org/donate/donorlist.php
>>
> I just put you in contact with my main person there. Hope we get through.
I feel like a beggar now!
>
>
>
>>> By the way, do you have an idea how references in the generated XML
>>> Schema can be made typed? This would be very beautiful. The currend
>>> anyURI together with the ECore annotation just does not show up in
>>> an XSD editor..
>> You mean a nice XSD editor for editing annotations? I suppose every
>> editor should support that, but annotations are entirely free form so
>> it's most just DOM editing. I imagine an Eclipse editor could
>> support an extension support with nice wizards or some other
>> mechanism for defining specific types of well structured annotations
>> (kind of like what we want to do for Ecore itself but didn't get
>> around to yet).
>
> No, I mean to find a way where we define an XSD type T and then an
> attribute with type="T". But my own experiments showed, that this is not
> possible in XSD.
You mean you'd like a way to exploit generics with XSD?

http://ed-merks.blogspot.com/2007/06/modeling-generics-with- xml-schema.html

Of course you know that you can use ecore:reference to specify the type
of a reference, so I'm slightly confused about what you mean by "T"
>
>
>>> Hmm, but where is the relation to XML Schema? In my example project,
>>> I just define a string as ID, and then stuff crashes.
>> The EAttribute's ID support was added purely as an analog to XML
>> Schema's xsd:ID and from an XML serialization perspective, the same
>> types of restrictions apply. But of course XML is not necessarily
>> the only form of serialization and not in all cases will spaces in
>> the ID cause a problem for the reference, so I'd be reluctant to try
>> to treat such things purely as an error during validation. If you
>> use the XMLTypePackage's ID type, then the constraint that it must be
>> a well formed XML Schema ID will be enforced.
>
> Ok, thanks for that hint. Your advice on the ID feature is very useful.
>
> By the way, it would be cool, if one of the tutorial shows how to
> introduce new DataTypes, restrict their value range (for instance
> using regexp) and then use them in the model.
You mean without reference to XML Schema's way of doing this? It's hard
to keep up with all the work without nice tutorials that perhaps could
be contributed by the community as easily as by us...
>
> Do conflicts with the DataType be reported by the validation framework?
Yes, all simple type constraints (facets constraints) are reported.
>
> This leads me to another question: with the validation of values, it
> would be possible to validate the result of applying a setter, and if
> as a result there is a validation error, the value would be rejected.
> Does
> it make sense if I add a feature request like this?
There is support for live validation in the extended validation
framework and in the transaction framework there is support for rollback
if constraints aren't satisfied. Doing this immediately at all times
(such as when deserializing) doesn't seem so good.
>
>>> Would we not need an EDataType that wraps String and disalows
>>> spaces, and then only string-attributes with this EDataType can be
>>> implemented as XML attributes, the others need an element?
>> That's one way yes, and the XMLTypePackage has such a type. But if
>> your client wants to use a field who's values can contain spaces and
>> still wants to use those to create IDREFS then the approach of encode
>> and decode would work quite nicely.
> I understand. We will program this and donate it back. Maybe you could
> then consider using this datatype rather than String, if ID=true is set?
I'll always use the data type of the feature itself for doing the
conversion, but having a useful EDataType in Ecore that folks could use
seems reasonable.
>
>>>>> - an int-ID attribute which is unset (but which displays as 0 in
>>>>> the editor...) create not a reference to 0, but the usual
>>>>> positional reference.
>>>> Well, int's aren't valid XML Schema IDs either. Again, they are
>>>> tolerated. In any case, when an ID isn't set, it won't be used, so
>>>> be sure to set them.
>>>
>>> Hmmm.
>> The rules for ID are the same as NCName, i.e., if you can't use it as
>> an element name you can't use it as an ID.
>
> I understand. Would not everything be much more stable if you have a
> bullet proof String <-> NCName conversion, and you apply this
> conversion both for element names and for String-values of features
> with ID=true?
You always get into the kinds of issues of double encoding since there
will always be some special "normal" character used to escape an
encoding that then can't be used in it's unencoded form.
>
>
>>>>> - ID attributes which are many do crash too.
>>>> I'm not sure what such a thing would mean...
>>>
>>> Just that the unique ID of your class is a list of strings or integers.
>> Yes, more of a composed thing yet again. The problem is representing
>> such thing as a string, which you'd normally do with a space
>> separated list, but of course that's not going to work nicely.
> It will work for numbers, booleans and chars, but not for strings.
> Thus for strings a list of separate XML-elements would be better.
Oddly enough, XML Schema does let you have list of string and doesn't
really care that when you read it back in you might have more strings
than when you wrote it out...
>
> As I noted in other posts, I think its a fundamental advantage of EMF to
> treat things as having a type and an arity. This is more the MOF
> abstraction level, while having just a type is more Java.
In XML Schema, a list of ID is no longer an ID...
>
> It would be cool if this advantage would carry over to ID's too.
It's often the case that making things more general makes them more
complex and more generally expensive to process, so I'd rather stick to
what's simple as long as there are ways for folks to do more complex
things if they like, e.g., a derived ID feature that's derived from a
many-valued feature is sufficient.
>
>>> Agree, you explained this before. But this does not mean we cannot have
>>> several ID features. Their combination makes the ID.
>> XML Schema doesn't allow that an I'm not keen on introducing such
>> additional complexity. You'll have to define a derived feature and
>> compose the value in whatever way is appropriate for the data types
>> involved.
>
> I agree. But the framework could easily introduce such a feature, and
> then use this for the references. Like this the String<->NCName
> conversion could be done on this derived feature only. Maybe we need
> to have our own annotation for primary (and maybe as well foreign) keys.
I don't see a compelling use case. Generally "normal" features will not
induce an ID that's unique within the containing resource. I think
you're making a big assumption to say that a primary key in a database
table is equivalent to an ID.
>
>>>>> The main purpose of the ID
>>>>> feature in my opinion is to create clean unique business keys. Such
>>>>> keys are typically composed from several fields, not only one.
>>>> Yes and you can define a derived ID that's computed by composing
>>>> other values. But in XML Schema as well, you'll find it only
>>>> allows you to defined one attribute of type ID. That's the design
>>>> we are mirroring.
>>>
>>> I see, thus ID is an XML Schema ID, and not a primary key.
>> I'm not so database literate.
> I wasn't until the market exposed me to DataWarehouse projects. It
> seems there is a huge universe of opportunities for EMF there.
> Immagine for instance, that the DataType feature of EMF could be
> reused for data-managament initiatives in large institutions.
I keep telling people that the opportunities for modeling are pervasive
and massively overlooked. It's really a much better XML so at some
point the obsession with XML will wear off and folks will look a little
farther...
>
>> I understand that a primary key is one or more columns in a table
>> that uniquely identify a row in the table.
> Exactly. In contrast to this, objects of a OO class have their own
> identity, thus there can be two objects with the same feature-values,
> but never two entries in such a table
>
>> Thus different tables could have the same primary key, if such a
>> statement makes sense since columns are not shared across tables.
>> In that sense, the name of the table along with the primary key
>> within the tabl does act very much like a unique ID within the database.
>
> Agree completly.
>
>>> Would it not make much more sense to use the ID feature to define
>>> primary keys, and then if they do not follow all the restrictions of
>>> XML, they are just not declared as XML ID??
>> Primary key is a database concept. I'm not sure what you are
>> proposing.
> It's rather an Information Modeling concept, which is enforced by
> relational databases, and one of the few differences between a UML
> class model, and a conceptual data model. As well, it can be though of
> as a
> standard constraint telling that for all instances, there are not
> two instances with the same primary key.
The problem is that you might have name be a primary key and you might
find another type of object also has a primary key whose string value is
the same. I terms of uniquely identifying the object via just the
string and no additional information, this doesn't work well.
>
> A model with this information is just richer than one where I do not
> know this. In the financial industry must applications are CRUD
> applications. Most of the inteligence is in the data-model. And primary
> keys are an important part of that models. I'd like to see EMF being
> usable as a replacement for conceptual data models.
I think the concepts have to match exactly and they don't.
>
>> The use of IDs in EMF is very much like that in XML. I.e., the value
>> of the ID must uniquely define the object within the resource. I.e.,
>> if EcoreUtil.getID(x) != null and x.eResource() != null then
>> x.eResource().getEObject(EcoreUtil.getID(x)) == x.
> I understand. It's very clear now, thanks a lot.
>
>>>>> I attach an example project, where all that I told can be
>>>>> repeated. Its
>>>>> standard EMF usage, EMF 2.4, Eclipse 3.4M4. I attach as well a
>>>>> screenshot
>>>>> of the model.
>>>> The only one that I'd consider defining a constraint for is a
>>>> multi-valued ID. I don't think that make sense.
>>>
>>> I think the question is, whether ID means an XML Schema ID (thus
>>> something platform specific), or whether it means the concept of id,
>>> like a primary key.
>> The above statement is the intended meaning. I.e., the value of the
>> ID attribute, converted to a string as defined by the data type of
>> that feature must uniquely identify the object within it's containing
>> resource.
>
> What you define is exactly the concept of a primary key. At the moment,
> the conversion into a String for this id is not done by EMF
> automatically in a way that is conforming with NCName, and I cannot have
> combined and multi-valued ID's.
I don't believe it is exactly the same concept. A resource containing
different types of object could still find that two different types of
objects have primary key values that happen to be the same which of
course has no significance from a database point of view, but does from
the point of view of building a map from strings to objects. Note that
string conversion is based on the normal conversion done for the data
type. E.g., you could have a the ID be byte[] and use base64Binary as a
data type.
>
> All I try to understand is whether we need to solve these problems on
> our own, or whether we can hope to push EMF towards supporting ID's in
> a most generic way, similar or superior to the way conceptual data
> models do this.
At this point, I don't see the concepts as being the same, so we'd need
to get beyond that point...
>
> By the way, in information modeling it works like this:
>
> In the conceptual model, you define an entity/table/class (I use class
> for the reminder) X with attributes/columns/references (I use
> reference for the reminder) a, b, c. You mark a and b to bee the
> primary keys.
This is much more closely related to EReference.eKeys where you consider
a table to be special EClass that contains all possible instances of the
associated item type.
>
> Then in a second class Y, you create a reference to X with name x.
>
> This conceptual model corresponds to ECore, in my opinion.
>
> Now, you generate from the conceptual model a physical model. In this
> model, the reference from Y to X is implemented with two attributes in
> Y. Since the reference was called x, these attributes need a combined
> name made of x and the two primary keys a, b. Thus there will be two
> attributes in Y, one called xA and one called xB. Their type is the
> type of attributes a and b of X.
I'll keep pointing back at the fact that different types of object can
accidentally have the same string value as their derived ID...
>
> If the pattern for the physical model would be used in EMF too, this
> would be huge. It would accelerate the speed in which we can move DB
> projects over to EMF.
The whole DB/relational to object mapping is a big problem that's not so
easily solved because of all kinds of additional complexities with
inheritance being an important example of that.
>
> By the way2: Thus this not already work by introducing features x, xA,
> and xB in Y, making a derived feature primaryKey in X, which combines
> a and b to a NCName? I would make primaryKey, and x transient, so only
> xA, xB, a, and b appear in the XML. And then I would derive primaryKey
> from a,b, and x would derive from the values of xA and xB.
You could certainly annotate features directly as DB-like keys and then
specialize the resource implementation's getURIFragment to compute an
ID-like value based on that (and of course specialized getEObject to do
the inverse). All that could then be done reflectively and wouldn't
actually require anything basic changes to Ecore...
>
> It would be nice if I could as well make xA and xB volatile, and
> having just one instance variable x holding the primaryKey.
>
> The reason I insist is, that I feel we are just very near to make EMF
> useful in the data modeling and data management space. This is a huge
> area, much larger than the OO space.
I can imagine doing all this without any modifications to Ecore. Teneo
and CDO are both doing similar types of things in this space...
>
>>> In the first case, all you tell me is true and understandable. But,
>>> you have an option, which is platform specific in the .ecore
>>>
>>> The eKeys() for
>>> instance is not platform specific, its conceptually clear, it gives
>>> the keys for a reference, and only all the objects reached by this
>>> reference
>>> must have unique keys. It corresponds somehow to a map.
>> It's also very similar to a database table if you consider each
>> reference to be like a table. An in fact, if the referenced type is
>> stored in a table, then all references to that type can use the same
>> eKeys because not only are they unique with respect to that reference
>> but they are unique for all instances of the type.
>
> I agree. In addition, the eKeys() feature somehow tells, that I store
> values of these features, to reference objects.
>
> If the feature is multi-valued, this means, selecting an object in
> this reference, will return all objects with those values of these
> features. Thus it is very different to the OO view.
>
> If the feature is not multi-valued, the eKeys() should be the same as
> the primary key.
A primary key is something intrinsic to the type itself whereas keys are
much more like the XML Schema concept and represent a constraint about
where it's used.
>
> I would personally restrict the meaning of eKeys() to containment
> features.
It's generally just a constraint and there's no reason this constraint
couldn't apply to any type of reference.
>
>>> Your ID feature on the otherhand, although it seems to be a clear
>>> concept (primary key), it is just a way how to tweak the XML
>>> serialization. As it is now, it could as well go into an annotation,
>>> like the numerous XSD annotations that already exist.
>> No, I don't really see it that way. Certainly the XML concepts are
>> the analog, but from a purely Ecore perspective, it's only about
>> uniquely identifying the object within its containing resource. The
>> same concept could be used to serialize in a form other than XML.
> Ok, I agree.
>
>>> Are you strictly against making the features with ID=true to a real
>>> primary key?
>> Yes, though mostly that's because I don't really understand what you
>> are proposing. I see database concepts as quite different.
>> Databases have the luxury to taking what I call a closed universe
>> model. I.e., they have bounds on all possible data that exists. EMF
>> is more like REST where the universe of all data instances is
>> effectively unbounded...
> But within a resource, or within containment, you hava a closed universe
> too. Thus resource+primaryKey would fit well EMF.
You have to ask yourself though why MOF and UML haven't done this. It's
very hard to assert in an open universe data model that something is
absolutely unique. Even with UUIDs, you might make a copy of a resource
and end up with two objects that have the same UUID...
>
>
>>> Having the option to define primary keys would be a great benefit
>>> for all frameworks connecting with a DB and for the integration with
>>> DTP.
>> I don't understand what the implication is though. It seems to me
>> that the combination of table name and the primary key values would
>> act as an ID and hence already provides what's needed.
> I agree. As you see in my example above, it seems we get everything with
> a few derived and transient features.
I could imagine defining an annotation on a volatile feature that, in
combination with a specialized template would generate the code needed
to compute an ID in whatever way would be useful...
>
>> If course I haven't thrown the whole issue of intrinsic and extrinsic
>> IDs at you. So far all this stuff has been about intrinsic IDs which
>> are stored as data on the instances. Resources can also maintain
>> extrinsic IDs that are maintained as a separate two-way map by the
>> resource. That's another approach that could be used (and is how
>> xmi:id is supported).
> Can you give me a pointer to a modesl with such a seperate two-way map?
> I would be interested to learn about this.
UML2's resources always make use of this.
> Best, Philipp
>>>
>>> Best, Philipp
>>>
>>>>>
>>>>> Best, Philipp
>>>>>


--------------060603060407030806080403
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Philipp,<br>
<br>
Comments below.<br>
<br>
Philipp W. Kutter wrote:
<blockquote cite="mid:flqk81$n7c$1@build.eclipse.org" type="cite"><br>
<blockquote type="cite">I wonder if your clients who apparently have
a huge amount of money know they can donate huge or small amounts of it
to Eclipse.&nbsp; :-P
<br>
<a class="moz-txt-link-rfc2396E" href="http://www.eclipse.org/donate/donorlist.php">&lt;http://www.eclipse.org/donate/donorlist.php&gt;</a>
<br>
<br>
&nbsp;&nbsp;&nbsp; <a class="moz-txt-link-freetext" href="http://www.eclipse.org/donate/donorlist.php">http://www.eclipse.org/donate/donorlist.php</a>
<br>
<br>
</blockquote>
I just put you in contact with my main person there. Hope we get
through.
<br>
</blockquote>
I feel like a beggar now!<br>
<blockquote cite="mid:flqk81$n7c$1@build.eclipse.org" type="cite"><br>
<br>
<br>
<blockquote type="cite">
<blockquote type="cite">By the way, do you have an idea how
references in the generated XML Schema can be made typed? This would be
very beautiful. The currend anyURI together with the ECore annotation
just does not show up in an XSD editor..
<br>
</blockquote>
You mean a nice XSD editor for editing annotations?&nbsp; I suppose every
editor should support that, but annotations are entirely free form so
it's most just DOM editing.&nbsp; I imagine an Eclipse editor could support
an extension support with nice wizards or some other mechanism for
defining specific types of well structured annotations (kind of like
what we want to do for Ecore itself but didn't get around to yet).
<br>
</blockquote>
<br>
No, I mean to find a way where we define an XSD type T and then an
attribute with type="T". But my own experiments showed, that this is
not
<br>
possible in XSD.
<br>
</blockquote>
You mean you'd like a way to exploit generics with XSD?<br>
<blockquote><a
href=" http://ed-merks.blogspot.com/2007/06/modeling-generics-with- xml-schema.html"> http://ed-merks.blogspot.com/2007/06/modeling-generics-with- xml-schema.html</a><br>
</blockquote>
Of course you know that you can use ecore:reference to specify the type
of a reference, so I'm slightly confused about what you mean by "T"<br>
<blockquote cite="mid:flqk81$n7c$1@build.eclipse.org" type="cite"><br>
<br>
<blockquote type="cite">
<blockquote type="cite">Hmm, but where is the relation to XML
Schema? In my example project, I just define a string as ID, and then
stuff crashes.
<br>
</blockquote>
The EAttribute's ID support was added purely as an analog to XML
Schema's xsd:ID and from an XML serialization perspective, the same
types of restrictions apply.&nbsp; But of course XML is not necessarily the
only form of serialization and not in all cases will spaces in the ID
cause a problem for the reference, so I'd be reluctant to try to treat
such things purely as an error during validation.&nbsp; If you use the
XMLTypePackage's ID type, then the constraint that it must be a well
formed XML Schema ID will be enforced.
<br>
</blockquote>
<br>
Ok, thanks for that hint. Your advice on the ID feature is very useful.
<br>
<br>
By the way, it would be cool, if one of the tutorial shows how to
introduce new DataTypes, restrict their value range (for instance using
regexp) and then use them in the model.
<br>
</blockquote>
You mean without reference to XML Schema's way of doing this?&nbsp; It's
hard to keep up with all the work without nice tutorials that perhaps
could be contributed by the community as easily as by us...<br>
<blockquote cite="mid:flqk81$n7c$1@build.eclipse.org" type="cite"><br>
Do conflicts with the DataType be reported by the validation framework?
<br>
</blockquote>
Yes, all simple type constraints (facets constraints) are reported.<br>
<blockquote cite="mid:flqk81$n7c$1@build.eclipse.org" type="cite"><br>
This leads me to another question: with the validation of values, it
would be possible to validate the result of applying a setter, and if
as a result there is a validation error, the value would be rejected.
Does
<br>
it make sense if I add a feature request like this?
<br>
</blockquote>
There is support for live validation in the extended validation
framework and in the transaction framework there is support for
rollback if constraints aren't satisfied.&nbsp; Doing this immediately at
all times (such as when deserializing) doesn't seem so good.&nbsp; <br>
<blockquote cite="mid:flqk81$n7c$1@build.eclipse.org" type="cite"><br>
<blockquote type="cite">
<blockquote type="cite">Would we not need an EDataType that wraps
String and disalows spaces, and then only string-attributes with this
EDataType can be implemented as XML attributes, the others need an
element?
<br>
</blockquote>
That's one way yes, and the XMLTypePackage has such a type.&nbsp; But if
your client wants to use a field who's values can contain spaces and
still wants to use those to create IDREFS then the approach of encode
and decode would work quite nicely.
<br>
</blockquote>
I understand. We will program this and donate it back. Maybe you could
then consider using this datatype rather than String, if ID=true is
set?
<br>
</blockquote>
I'll always use the data type of the feature itself for doing the
conversion, but having a useful EDataType in Ecore that folks could use
seems reasonable.<br>
<blockquote cite="mid:flqk81$n7c$1@build.eclipse.org" type="cite"><br>
<blockquote type="cite">
<blockquote type="cite">
<blockquote type="cite">
<blockquote type="cite">- an int-ID attribute which is unset
(but which displays as 0 in the editor...) create not a reference to 0,
but the usual positional reference.
<br>
</blockquote>
Well, int's aren't valid XML Schema IDs either.&nbsp; Again, they are
tolerated.&nbsp; In any case, when an ID isn't set, it won't be used, so be
sure to set them.
<br>
</blockquote>
<br>
Hmmm.
<br>
</blockquote>
The rules for ID are the same as NCName, i.e., if you can't use it as
an element name you can't use it as an ID.
<br>
</blockquote>
<br>
I understand. Would not everything be much more stable if you have a
bullet proof String &lt;-&gt; NCName conversion, and you apply this
conversion both for element names and for String-values of features
with ID=true?
<br>
</blockquote>
You always get into the kinds of issues of double encoding since there
will always be some special "normal" character used to escape an
encoding that then can't be used in it's unencoded form.<br>
<blockquote cite="mid:flqk81$n7c$1@build.eclipse.org" type="cite"><br>
<br>
<blockquote type="cite">
<blockquote type="cite">
<blockquote type="cite">
<blockquote type="cite">- ID attributes which are many do crash
too.
<br>
</blockquote>
I'm not sure what such a thing would mean...
<br>
</blockquote>
<br>
Just that the unique ID of your class is a list of strings or integers.
<br>
</blockquote>
Yes, more of a composed thing yet again.&nbsp; The problem is representing
such thing as a string, which you'd normally do with a space separated
list, but of course that's not going to work nicely.
<br>
</blockquote>
It will work for numbers, booleans and chars, but not for strings. Thus
for strings a list of separate XML-elements would be better.
<br>
</blockquote>
Oddly enough, XML Schema does let you have list of string and doesn't
really care that when you read it back in you might have more strings
than when you wrote it out...<br>
<blockquote cite="mid:flqk81$n7c$1@build.eclipse.org" type="cite"><br>
As I noted in other posts, I think its a fundamental advantage of EMF
to
<br>
treat things as having a type and an arity. This is more the MOF
abstraction level, while having just a type is more Java.
<br>
</blockquote>
In XML Schema, a list of ID is no longer an ID...<br>
<blockquote cite="mid:flqk81$n7c$1@build.eclipse.org" type="cite"><br>
It would be cool if this advantage would carry over to ID's too.
<br>
</blockquote>
It's often the case that making things more general makes them more
complex and more generally expensive to process, so I'd rather stick to
what's simple as long as there are ways for folks to do more complex
things if they like, e.g., a derived ID feature that's derived from a
many-valued feature is sufficient.<br>
<blockquote cite="mid:flqk81$n7c$1@build.eclipse.org" type="cite"><br>
<blockquote type="cite">
<blockquote type="cite">Agree, you explained this before. But this
does not mean we cannot have
<br>
several ID features. Their combination makes the ID.
<br>
</blockquote>
XML Schema doesn't allow that an I'm not keen on introducing such
additional complexity.&nbsp; You'll have to define a derived feature and
compose the value in whatever way is appropriate for the data types
involved.
<br>
</blockquote>
<br>
I agree. But the framework could easily introduce such a feature, and
then use this for the references. Like this the String&lt;-&gt;NCName
conversion could be done on this derived feature only. Maybe we need
<br>
to have our own annotation for primary (and maybe as well foreign)
keys.
<br>
</blockquote>
I don't see a compelling use case.&nbsp; Generally "normal" features will
not induce an ID that's unique within the containing resource.&nbsp; I think
you're making a big assumption to say that a primary key in a database
table is equivalent to an ID.<br>
<blockquote cite="mid:flqk81$n7c$1@build.eclipse.org" type="cite"><br>
<blockquote type="cite">
<blockquote type="cite">
<blockquote type="cite">
<blockquote type="cite">The main purpose of the ID
<br>
feature in my opinion is to create clean unique business keys. Such
<br>
keys are typically composed from several fields, not only one.
<br>
</blockquote>
Yes and you can define a derived ID that's computed by composing other
values.&nbsp; But in XML Schema as well, you'll find it only allows you to
defined one attribute of type ID.&nbsp; That's the design we are mirroring.
<br>
</blockquote>
<br>
I see, thus ID is an XML Schema ID, and not a primary key.
<br>
</blockquote>
I'm not so database literate.
<br>
</blockquote>
I wasn't until the market exposed me to DataWarehouse projects. It
seems there is a huge universe of opportunities for EMF there. Immagine
for instance, that the DataType feature of EMF could be reused for
data-managament initiatives in large institutions.
<br>
</blockquote>
I keep telling people that the opportunities for modeling are pervasive
and massively overlooked.&nbsp; It's really a much better XML so at some
point the obsession with XML will wear off and folks will look a little
farther...<br>
<blockquote cite="mid:flqk81$n7c$1@build.eclipse.org" type="cite"><br>
<blockquote type="cite">&nbsp;I understand that a primary key is one or
more columns in a table that uniquely identify a row in the table. </blockquote>
Exactly. In contrast to this, objects of a OO class have their own
<br>
identity, thus there can be two objects with the same feature-values,
<br>
but never two entries in such a table
<br>
<br>
<blockquote type="cite">&nbsp;Thus different tables could have the same
primary key, if such a statement makes sense since columns are not
shared across tables.&nbsp;&nbsp; In that sense, the name of the table along with
the primary key within the tabl does act very much like a unique ID
within the database.
<br>
</blockquote>
<br>
Agree completly.
<br>
<br>
<blockquote type="cite">
<blockquote type="cite">Would it not make much more sense to use
the ID feature to define primary keys, and then if they do not follow
all the restrictions of XML, they are just not declared as XML ID??
<br>
</blockquote>
Primary key is a database concept.&nbsp; I'm not sure what you are
proposing.&nbsp; </blockquote>
It's rather an Information Modeling concept, which is enforced by
relational databases, and one of the few differences between a UML
class model, and a conceptual data model. As well, it can be though of
as a
<br>
standard constraint telling that for all instances, there are not
<br>
two instances with the same primary key.
<br>
</blockquote>
The problem is that you might have name be a primary key and you might
find another type of object also has a primary key whose string value
is the same.&nbsp;&nbsp; I terms of uniquely identifying the object via just the
string and no additional information, this doesn't work well.<br>
<blockquote cite="mid:flqk81$n7c$1@build.eclipse.org" type="cite"><br>
A model with this information is just richer than one where I do not
know this. In the financial industry must applications are CRUD
applications. Most of the inteligence is in the data-model. And primary
<br>
keys are an important part of that models. I'd like to see EMF being
usable as a replacement for conceptual data models.
<br>
</blockquote>
I think the concepts have to match exactly and they don't.<br>
<blockquote cite="mid:flqk81$n7c$1@build.eclipse.org" type="cite"><br>
<blockquote type="cite">The use of IDs in EMF is very much like that
in XML.&nbsp; I.e., the value of the ID must uniquely define the object
within the resource.&nbsp; I.e., if EcoreUtil.getID(x) != null and
x.eResource() != null then x.eResource().getEObject(EcoreUtil.getID(x))
== x.
<br>
</blockquote>
I understand. It's very clear now, thanks a lot.
<br>
<br>
<blockquote type="cite">
<blockquote type="cite">
<blockquote type="cite">
<blockquote type="cite">I attach an example project, where all
that I told can be repeated. Its
<br>
standard EMF usage, EMF 2.4, Eclipse 3.4M4. I attach as well a
screenshot
<br>
of the model.
<br>
</blockquote>
The only one that I'd consider defining a constraint for is a
multi-valued ID.&nbsp; I don't think that make sense.
<br>
</blockquote>
<br>
I think the question is, whether ID means an XML Schema ID (thus
something platform specific), or whether it means the concept of id,
like a primary key.
<br>
</blockquote>
The above statement is the intended meaning.&nbsp; I.e., the value of the ID
attribute, converted to a string as defined by the data type of that
feature must uniquely identify the object within it's containing
resource.
<br>
</blockquote>
<br>
What you define is exactly the concept of a primary key. At the moment,
<br>
the conversion into a String for this id is not done by EMF
automatically in a way that is conforming with NCName, and I cannot
have
<br>
combined and multi-valued ID's.
<br>
</blockquote>
I don't believe it is exactly the same concept.&nbsp; A resource containing
different types of object could still find that two different types of
objects have primary key values that happen to be the same which of
course has no significance from a database point of view, but does from
the point of view of building a map from strings to objects.&nbsp; Note that
string conversion is based on the normal conversion done for the data
type.&nbsp; E.g., you could have a the ID be byte[] and use base64Binary as
a data type.<br>
<blockquote cite="mid:flqk81$n7c$1@build.eclipse.org" type="cite"><br>
All I try to understand is whether we need to solve these problems on
<br>
our own, or whether we can hope to push EMF towards supporting ID's in
<br>
a most generic way, similar or superior to the way conceptual data
models do this.
<br>
</blockquote>
At this point, I don't see the concepts as being the same, so we'd need
to get beyond that point...<br>
<blockquote cite="mid:flqk81$n7c$1@build.eclipse.org" type="cite"><br>
By the way, in information modeling it works like this:
<br>
<br>
In the conceptual model, you define an entity/table/class (I use class
for the reminder) X with attributes/columns/references (I use reference
for the reminder) a, b, c. You mark a and b to bee the primary keys.
<br>
</blockquote>
This is much more closely related to EReference.eKeys where you
consider a table to be special EClass that contains all possible
instances of the associated item type.<br>
<blockquote cite="mid:flqk81$n7c$1@build.eclipse.org" type="cite"><br>
Then in a second class Y, you create a reference to X with name x.
<br>
<br>
This conceptual model corresponds to ECore, in my opinion.
<br>
<br>
Now, you generate from the conceptual model a physical model. In this
model, the reference from Y to X is implemented with two attributes in
Y. Since the reference was called x, these attributes need a combined
name made of x and the two primary keys a, b. Thus there will be two
<br>
attributes in Y, one called xA and one called xB. Their type is the
type of attributes a and b of X.
<br>
</blockquote>
I'll keep pointing back at the fact that different types of object can
accidentally have the same string value as their derived ID...<br>
<blockquote cite="mid:flqk81$n7c$1@build.eclipse.org" type="cite"><br>
If the pattern for the physical model would be used in EMF too, this
would be huge. It would accelerate the speed in which we can move DB
<br>
projects over to EMF.
<br>
</blockquote>
The whole DB/relational to object mapping is a big problem that's not
so easily solved because of all kinds of additional complexities with
inheritance being an important example of that.<br>
<blockquote cite="mid:flqk81$n7c$1@build.eclipse.org" type="cite"><br>
By the way2: Thus this not already work by introducing features x, xA,
<br>
and xB in Y, making a derived feature primaryKey in X, which combines a
and b to a NCName? I would make primaryKey, and x transient, so only
<br>
xA, xB, a, and b appear in the XML. And then I would derive primaryKey
<br>
from a,b, and x would derive from the values of xA and xB.
<br>
</blockquote>
You could certainly annotate features directly as DB-like keys and then
specialize the resource implementation's getURIFragment to compute an
ID-like value based on that (and of course specialized getEObject to do
the inverse).&nbsp; All that could then be done reflectively and wouldn't
actually require anything basic changes to Ecore...<br>
<blockquote cite="mid:flqk81$n7c$1@build.eclipse.org" type="cite"><br>
It would be nice if I could as well make xA and xB volatile, and having
just one instance variable x holding the primaryKey.
<br>
<br>
The reason I insist is, that I feel we are just very near to make EMF
<br>
useful in the data modeling and data management space. This is a huge
<br>
area, much larger than the OO space.
<br>
</blockquote>
I can imagine doing all this without any modifications to Ecore.&nbsp; Teneo
and CDO are both doing similar types of things in this space...<br>
<blockquote cite="mid:flqk81$n7c$1@build.eclipse.org" type="cite"><br>
<blockquote type="cite">
<blockquote type="cite">In the first case, all you tell me is true
and understandable. But, you have an option, which is platform specific
in the .ecore
<br>
<br>
The eKeys() for
<br>
instance is not platform specific, its conceptually clear, it gives the
keys for a reference, and only all the objects reached by this
reference
<br>
must have unique keys. It corresponds somehow to a map.
<br>
</blockquote>
It's also very similar to a database table if you consider each
reference to be like a table.&nbsp; An in fact, if the referenced type is
stored in a table, then all references to that type can use the same
eKeys because not only are they unique with respect to that reference
but they are unique for all instances of the type.
<br>
</blockquote>
<br>
I agree. In addition, the eKeys() feature somehow tells, that I store
<br>
values of these features, to reference objects.
<br>
<br>
If the feature is multi-valued, this means, selecting an object in this
reference, will return all objects with those values of these features.
Thus it is very different to the OO view.
<br>
<br>
If the feature is not multi-valued, the eKeys() should be the same as
the primary key.
<br>
</blockquote>
A primary key is something intrinsic to the type itself whereas keys
are much more like the XML Schema concept and represent a constraint
about where it's used.<br>
<blockquote cite="mid:flqk81$n7c$1@build.eclipse.org" type="cite"><br>
I would personally restrict the meaning of eKeys() to containment
features.
<br>
</blockquote>
It's generally just a constraint and there's no reason this constraint
couldn't apply to any type of reference.<br>
<blockquote cite="mid:flqk81$n7c$1@build.eclipse.org" type="cite"><br>
<blockquote type="cite">
<blockquote type="cite">Your ID feature on the otherhand, although
it seems to be a clear concept (primary key), it is just a way how to
tweak the XML serialization. As it is now, it could as well go into an
annotation, like the numerous XSD annotations that already exist.
<br>
</blockquote>
No, I don't really see it that way.&nbsp; Certainly the XML concepts are the
analog, but from a purely Ecore perspective, it's only about uniquely
identifying the object within its containing resource.&nbsp; The same
concept could be used to serialize in a form other than XML.
<br>
</blockquote>
Ok, I agree.
<br>
<br>
<blockquote type="cite">
<blockquote type="cite">Are you strictly against making the
features with ID=true to a real
<br>
primary key?
<br>
</blockquote>
Yes, though mostly that's because I don't really understand what you
are proposing.&nbsp; I see database concepts as quite different.&nbsp; Databases
have the luxury to taking what I call a closed universe model.&nbsp; I.e.,
they have bounds on all possible data that exists.&nbsp; EMF is more like
REST where the universe of all data instances is effectively
unbounded...
<br>
</blockquote>
But within a resource, or within containment, you hava a closed
universe
<br>
too. Thus resource+primaryKey would fit well EMF.
<br>
</blockquote>
You have to ask yourself though why MOF and UML haven't done this.&nbsp;
It's very hard to assert in an open universe data model that something
is absolutely unique.&nbsp; Even with UUIDs, you might make a copy of a
resource and end up with two objects that have the same UUID...<br>
<blockquote cite="mid:flqk81$n7c$1@build.eclipse.org" type="cite"><br>
<br>
<blockquote type="cite">
<blockquote type="cite">Having the option to define primary keys
would be a great benefit for all frameworks connecting with a DB and
for the integration with DTP.
<br>
</blockquote>
I don't understand what the implication is though.&nbsp; It seems to me that
the combination of table name and the primary key values would act as
an ID and hence already provides what's needed.
<br>
</blockquote>
I agree. As you see in my example above, it seems we get everything
with
<br>
a few derived and transient features.
<br>
</blockquote>
I could imagine defining an annotation on a volatile feature that, in
combination with a specialized template would generate the code needed
to compute an ID in whatever way would be useful...<br>
<blockquote cite="mid:flqk81$n7c$1@build.eclipse.org" type="cite"><br>
<blockquote type="cite">If course I haven't thrown the whole issue of
intrinsic and extrinsic IDs at you.&nbsp; So far all this stuff has been
about intrinsic IDs which are stored as data on the instances.&nbsp;
Resources can also maintain extrinsic IDs that are maintained as a
separate two-way map by the resource.&nbsp; That's another approach that
could be used (and is how xmi:id is supported).
<br>
</blockquote>
Can you give me a pointer to a modesl with such a seperate two-way map?
<br>
I would be interested to learn about this.
<br>
</blockquote>
UML2's resources always make use of this.<br>
<blockquote cite="mid:flqk81$n7c$1@build.eclipse.org" type="cite">Best,
Philipp
<br>
<blockquote type="cite">
<blockquote type="cite"><br>
Best, Philipp
<br>
<br>
<blockquote type="cite">
<blockquote type="cite"><br>
Best, Philipp
<br>
<br>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
<br>
</body>
</html>

--------------060603060407030806080403--


Ed Merks
Professional Support: https://www.macromodeling.com/
Previous Topic:avoiding xsi:type attributes
Next Topic:instance class name not deletable
Goto Forum:
  


Current Time: Thu Sep 19 20:09:13 GMT 2024

Powered by FUDForum. Page generated in 0.04499 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top