Subject: new iconv/mb<->wc module for UTF-7
To: None <tech-userlevel@NetBSD.ORG>
From: Takehiko NOZAKI <sigsegv@s25.xrea.com>
List: tech-userlevel
Date: 09/26/2004 02:42:25
--Multipart_Sun_Sep_26_02:42:25_2004-1
Content-Type: text/plain; charset=US-ASCII

Hello, all.

here is iconv/multibyte<->wide-character
conversion module for UTF-7(RFC2152).

To support this CES, I temporary modified
src/lib/libc/citrus/citrus_ctype_template.h, because of following reason:

UTF-7 multibyte <-> wide-character conversion using modified-base64.

    wchar_t wc = 0;
    wc = wc << 6 | 0xc;	/* 'M' - 'A' */
    wc = wc << 6 | 0x4;	/* 'E' - 'A' */
    wc = wc << 6 | 0x8;	/* 'I' - 'A' */
    wc >>= 2;  /* 6 * 3 = 18bit, 2byte is used for next UCS2 */
    wc == L'\u3042'

so last one-byte may changes with UCS2/UTF-16 which next appears.

    [UCS2/UTF-16]	[UTF-7]
    L"\u3042\u3044" ->	"+MEIwRA-"
                  	    ^
    L"\u3042\uFE30" ->	"+MEL+MA-"
                  	    ^
hence we have to consider following case:

    wchar_t wc = L'\u3042';
    char mb[MB_LEN_MAX];
    mbstate_t st;
    size_t n;

    (void)mbrtowc(NULL, NULL, &st);
    n = wcrtomb(wc, mb, &st);

if this wcrtomb call returns:
    n  = 3
    mb = "+ME"
    and left 2bit in mbstate for next multibyte conversion
this case, we can't re-convert multibyte -> wide-character.

    n = mbrtowc(&wc, "+ME", 3, &st);
    /* n = (size_t)-2 (insufficient multibyte, feed more to restart) */

so that it should be
    n  = 5
    mb = "+MEI-"
    and force reset mbstate_t
this case, re-convert multibyte -> wide-character is ok.

    n = mbrtowc(&wc, "+MEI-", 5, &st);
    /* n = 5 and wc = L'\u3042' */

but this causes verbose conversion wide-string -> multibyte
in wcs(r)tombs(and iconv too).

     n = wcstombs(mb, L"\u3042\3044");
     /* n = 10, mb = "+MEI-+MEQ-",
        but we prefer to n = 8, mb = "+MEIwRA-" */

in this point, _ENCODING_FORCE_RESET_STATE macro I added,
solves such annoyance.

but this modification will induce another trouble, such as:

    FILE fp = ...;
    char mb[MB_LEN_MAX+1];
    wchar_t wc;
    size_t n;
    mbstate_t st;

    (void)mbrtowc(NULL, NULL, &st);
    do {
        wc = fgetwc(fp);
        n = wcrtomb(wc, mb, &st);
        if (n == (size_t)-1)
             goto err;
        PRINT(mb, n);
    } while (wc != L'\0');
    ...

will easily produce verbose string, so we need rewrite such code...

I'm not sure ISO-C99/SUSv3 allows wcrtomb to return
insufficient multibyte for wide-char re-convertion.
if this permitted, I want remove _ENCODING_FORCE_RESET_STATE
macro (I think it's kludge).

any idea?

very truly yours.    
--
Takehiko NOZAKI <tnozaki@NetBSD.ORG>


--Multipart_Sun_Sep_26_02:42:25_2004-1
Content-Type: application/octet-stream; type=gzip
Content-Disposition: attachment; filename="citrus_utf7-20040822.patch.gz"
Content-Transfer-Encoding: base64

H4sICCf4J0EAA2NpdHJ1c191dGY3LTIwMDQwODIyLnBhdGNoAO29aXsct7Eo/Jn6FW0n1xJNUpxG
ozfK8jHFxWZCLUekstzEl6cXtDjRcIZnZihbSXx/+wVQVT0NdM1wGefked5Xepxg2IUuVBUKhUKh
gD4Z1+rnvaAezubTYbk7U/PZ7kj/Mdsti5nanV2OnqpR8+j5+v8evT04C5rhSO0Fu5eTK7VbfZzt
vlLzF2eHu7NptXsLCdsfH02VrqA+Dsfvg6kuZsPJOAifZvmjetg0wc5NsDM1fwZE9M7Ozm2MbYQi
2L95H4jBQAZhsjdI9X/BzkD/27Cot7a2bsUhOjgG4Z5I9kQMOB59912wE+XbSbCl/z8LvvvuUfB0
92Y21WjK3WGYjc2Pl2e/L8Z/Gz6dTZ7KjY0Ng3vHwHZ0A8OSe+Pd+XGYREK/cd/6bAtb7Bspj355
5XtQn92H9OweuIfVZPzxYjwZK76Fk9v1/Wr471b3q+FSbRepq+767wCJvk3dr4YbWUdR070o34tk
q+wG823arlH0lT0OO8oeWmXX/58uUfaTs9diIEAVn0Z36tPu+LjjK12F515ZpcSm/r00864vOLp5
Z1bgrdm8XvrScp2uJlfXu/82fcbWl+pyKoSjy/rvYLkeI7aNMO8oYL4Xy71B0iqxQblEiel9X4HT
vdBR4FgIq8KmvE2JC93xBi/0xi3qe6fKpLj9ystU9q5os7vV7CjpPeob9exXR8Wk6hdXk/pmpHYN
2bsviw/KqNOvrJur2wJte3VLLaOAu7X6uDu+GY02wuB3hdbWPB0Eg8Ge/Q/VxSjaSky+rkVyT0Qd
XRtsD7SibUujZVu/2fgtDKffPtp6tHX29uDN26Pn1XA+vZld6M4fjqvRTa2Cb8pZ/VS3+vTqw7dd
Aev/VbtQHYuLav7pWl3M1dX1qJirp5f/E2bgjqQsn99id3qLg2XMmF66Y2sbwvah7QYR7kk978WL
eS9uO/JOqNwuDVN3/ouTeDuUwZYpRWLNx4bm9GY6Di6O3706eLX/8ujJVTmf/FRdXE+HHzefqOF2
cP1TtR3MtoOx/jlTY/3HeKpmN6P55rNHwS+PAq0dwya4OHp18Prw5NX3FydnF2fn++dHF4dHb45e
HR69Otc1aq1zYxVcvD06OzoHuEWu8c7+3iKemt9qOt0Oimq+qYfsXx9t1ZPgHxv0T/+9sfu17hNt
O4PZXHMdfL27AOlXg+cdXq5v5he21oV9Y5Np8ivd5uYz+7bm4onGsNlpa0PT8azz9yzYem6odJ79
PdjxH/4S/HSp9TB4svv1wetXZ+f6/w6/3h1sakmosdYhPYos+cMqGI7njzokQ5/+VE3nk6ty88nH
ybAOvg4uDANaJat5UI22g+qymLpPNVM/macXc11u637d2Aj6717PTLdq/od/13rjwqhTHwX/0K8v
utP2VfC1FZfu8A3bdnnT/OXli4vTo1cXL/f/9OMzIwbAOZ6CeI08dG3NXQC9Mnj2aIcqWZhp5fBk
//v9s7Ojt+dPqlHwxfPg1bvTU6NXoK9Zti20viaDwbaABYqR9vOOsmkiDt69NUQ8uTg4Ork4f31x
dPLEFPovjXNz02C7VUED2/k/VcHz58Hp478OHm9qKexsEL2WGf1nT/XMw1uVbglhRhPN++ZfXyMN
hBTS1no/mU+C/74Zzi2oVUT7R6uBRmWdMbasbVNxY9nga5systvQQxyVNujxinqK1mIFo6YhYDaw
/4xN6VmTLRb+1Xh6pz70zNDx67cHR11Z4Aj/wkhU9+4WCnE8tQ2DDPGPX1eEut542vbXlhYoWQFb
Y68jX+xxo4ZH4sXJ95tmJIPQj05e/WH/1HSIoe58/+255vWQemA76NC23Q50S5cl4WsUcwBMBgvT
r9FbQ25GXBKn2q/cStII3cvVtqDTH6+OXwdfq2FnkIMluKNpWGkNLGWp3BahJi0fGJvw/1tbALR0
u3MntBWc7tR//3IfM7FqKn6oNejg7I3mnS4DT7QmbNqR9//FMb4FY7wd8u5YNCL8D92Fwd5CDO3I
HKCDtcSTBq++9QZv5k36tPoXLFlub7O7dLm99n2XMLdi7C2bxV6U9pcycRrZxYweubiaMaN2yzzY
ebSlvaGDyfWn6fD95Tx4Um1aZAe2meDNdPI3Vc23ba390SiwtWbWAEw/qvqpAVjgW4Wr+5u5WTMU
4zq4mSnt5AWzyc20UvZJORwX009BM5leGb9tOL8MJlNbTm7mFo1mc9gMq8Ig0c7wVAXXano1nM9V
HVxPJx+Htf4xvyzm+v+URjQaTX4yixW93q2H5qWZRWNevFJG+/Qf4VOPulkwaYisaqKXb1c3M23f
1LzQ5Bq8RTn5aEAoFYtF/xtPtN+qtnWV4Sww8QuDZ9GyZdElS7dajYrhlZpaSQWiT4pusiMWIkXz
Wt9o8v5F1ATAKKGqJ9XNlRrPC+q7Xd0tE11hGlxpGz4dFqPZQvy23wzmLiMLTTj/4eQsOHt9fP7H
/bdHgf795u3rP5wcHh0GL/6sgUfB/rvzH16/DfZfHQZ6eXD+9uTFu/PXb8+C//qv/TNd//FjAwKN
e/Xn4OhPesl9dhboN05evjk90Xg04rf7r85Pjs62g5NXB6fvjE3cDjSa4NXr8+D05OXJua52/nrb
tGcx9V8NXh8HL4/eHvyg/9x/cXJ6cv5nS9Lxyfkr096xITF4o92Nk4N3p/tvgzfv3r55fQboDGeH
J2cHp/snL48OnwaaDN10cPQHbauDsx/2T0+7nOr/HEZfHGka91+cAi7bkGb08OTt0cG54Wjx6+DE
WP/90+3g7M3RwYn5cfSnI83L/ts/byPes6P/fKcraaBFd7j/cv97zd6TWySje0U7DUcvDcVaFGfv
Xpydn5y/027O969fH55ZXLoB7ZT84eTg6OxZcPr6zArt3dnRtm7lfN8SoNFoiWmw/v3i3dmJld3J
q/Ojt2/fvTk/ef1q02L64fUftXA0vfv69UMr6NevLNtaTq/f/tkgNjKx/bAd/PGHI/38rRGrldy+
EceZluDBuUXXqarb1UI97/AbvDr6/vTkez1ZHhnoa4PpjydnR5u6207OTIUTaPqP+38GNt9ZEZge
09TBz44Ob9t+DU6Og/3DP5wY8rGyVoezE1Sd18cW1dm7gx+wC9oRoU2tjRVQrGj2SZvxWjWzp5ff
wsQOQYL6yenJi4uzg4OzzeCrr4Iv6OnIzI+Pti4u9Ox0cvjkS4pIfWmmX5hdg10jE3jZDnxtHALz
Hhp6t3Gz0qbG6Xkx0xZ97j3Uk/R44j0zQ378vvewHvYr1pqA/kMTJus91Lx6D0dDbfZ9Ku1S3z7r
PP0S58RxcaVm10Wlnl5+yYCRaw4EkysPs3EJHqTp1p4RD7MTtIHYaXfnV/lnNcz4mMbvns1vmmZm
Jlk9r34KKBg2Q417tGXo1mLVFac31dw6hTcXukfC5GK+UanR6C+Dn7OBCWFQkEq7gmB6Np4Mfh6E
g8G7TQf42g5oCxQ94Nmb/YMjC5MA+yW4MHHXo7GeYrXGnIybybNldI1nw/da1U1MaKO6HKnxXhBt
m5XGWJn5fhJcTkZ1oP2jQFrutHOq+0y7aaGt9dOlspOV2YNJpHEiFFUrtRLtBZJHFsZUrSqqS41O
CFtRu1XPgxf7Z0eJvHhxch5sBXYHwP7GF2Y30+nkvRa4T0MLCK6L4dT4N2Ys4lvXRW1kod951gro
zCyT3uheXSod02uRuEDRPDOt/elPf9oLZkq7LuVsOB7On0SbWnjXI7WYxm2TZrxo7i7/In+07yFT
J6+2g0grU6L5DLPtNgBxNZmZQNtkBoJyue7Su4zWXpdvmKWxXgkvqhgytKsTNDfa1ze+12g+3BlN
qmKkfZWiGo6G808or0V7G3qQloZ55vF02XMTz+UAy57P7BuzPgjXdxxgZiHsO/TKL7BSni26/OBc
S64dEDiINrprsUoNLzY3Np58hT93vlXDzX5VXMSZKtvBRXMzrvRb7SvQ7NPZxW9+AzCntUXg2wR+
L9BuGfJ0/atORSfWsbHR7+MuXed/fnPkVGx55TBa+je6kuNqdeMbVi6LCCxLZm/5vLERchV7q2i3
HiB5dXR0eHahvdDTk4OTc83ayfmTi+uZpmJgxInB7As9RkfGEprYszH5+2+/PzOujlFkR7ZmtEJo
5ElPkG5gWg1hYC6E44W+tUL8A/YF1DAorq9VMZ2ZYVuq4GZsJwY7jLrhpVknuqSp37hSVzM1f4Lh
9k29KhtAlHzSPPl6ZuJGW788iE09D3+4H5tAQj9oD/ZZr2jmwd0koc3i1S1iANRdWdwmper60xMK
Lj4BahYy+zUEdjO+v8iC5RKhCl1S+zsi95XbbKnI+hJdyK2jXd2NGF5iQDBsttjp/C8/Bs+1U6P/
fbn/4uDw6Pj7H05+9/vTl69ev/nPt2fn7/7wxz/9+X8XpfGo318O//ZhdDWeXP/3VPtHH3/6+dPf
v8R3B6GIZJykWb61++Uzrrl6OFXV/Fdv7snm9s7T3b3/4BudXJvJ2jQafPnFX7/8zW//11ePn33z
/Nvv/vLj/7n4r3/88xf+NevnzuC14K/zv07/Ov7SmUwW3svGk6Qzc7RT+saT0DzvvaGNqvHiouN3
vbcQdKz/eUDtnSBwoP1GqtDDffJq4/HW495jvf7aeLzzuPvCyVmqaXxS6dnsiye6CL4K/u/g51Sj
3exWwlWxrWdqPX8emMB18M9/Bvhn23KXHr3If3WoZxAbqjXvYnP6nc3gP4In+rmePq2PrB/9qBs3
XL/bNC5jsBfshJsureA1+9gqu4x70qXSEKaGiLoyiO1m68aT1vUO/rnwtOG3daw3N70mz/aPj37F
BrlGzt5cGOltQLea9YDj9G/oNTLW0BUOMxd4+roLPHCBJ2fm3bbXvn0etLgsB/rZN8+1zA9fuJp2
cmbQdt9rm3Hf6yngwQ9HB7/Xr87mVmL+Djvtgn+hKxjHiXz4TVvBisyAkW6jJpv4eMN7wzjUsKv+
S6BGMwUttBi+QBYcFBj11n1yenb0n7gpzyAePIM3frl9t721GWaXfcv6vHpFGiZ3m1nadaILvAmT
7a4R+trfiaf9rm1aCTAzE+4mrNyJ3/qHg8Asjja+Nl03M4ukjQUJ+unAPDHrxg09GOrJWG0HsB4I
vBlKz3C3zvdGi75eNclp2r05bjbQPfO1XQDMPpqfut/M3o5Lvp79vrJv66FoFnH4slkHPRmargXa
bSfjL/tzuLWF+zldOoZGzWfzDi7QrqF5a/EcXrSQ8c5O8E0Q0iNnFwq6YnNH4Ea0FoDGMsC/Zh+f
WmxBB3Nb0bwPfdJR4wHuaP8CS17i+i/t61tbP1qZDba2bM1fOqMD7LCJeC1eHP5oDBOlAgz1qPrv
luUvDFaz4O9ya56ZhX/wrV7mawtoWzYrfPNg06UWtpeRZPNyt113BiHhUZN2rAOrONYBjqx0ZoVl
DPVY0kLVo8z0SjsGnfewEuoKtm4GxHw4vlEduTsUrWDLxD610i8kZPSO43SwlL5WQHcmbgP0qTsL
9yW06BFT+5sOVW4XdyM1JFW2czluWjTPuyJowT3BfdEVXEvQvXq83+V363Nfrr8wmtfl4cnij2++
6cpIz/iLMTz7aTivLhfybHmqtPMdDPYCWwosJZYJltke0tbKcavbHUR5OVXFh2cdvCEhDglzKHuo
dp53AlA7DFoSW2d4fxu0jGAl441/FbQOLL3bdQgMns0lUnZo185EoY3m3kot+6UzCGFDHJ2L1v5p
KzS05DEIFpVQCxlL/eQJcG5H6n9oE7enzbWWkF5N2Tda+63/cIzyoy2rdns82h3Ls++MuKszcCe6
61aMs9nch7t5F5Sv57oFJlXi3+hbPHMCrTeRaB/YePmlHtKjySKnx2bFtJ6HTT3ZWu1v6DW25jG4
Kj6ZBbbJALjf8rrveRidMn2ND9FNWBJrsgmtbVIU1/2rAmjPutoK8zvo9V18nWcd/e961p1Z37rV
l8PeYBab3bGLJpQbdpoHGjBdi4iJOgv314jhq8vh0rzerTbhyPgNCyl13SSXCpNxA2kwxmDRGx2i
uo9+oXUGJwutdO0kYLRw83J4N35Gk38FP131w1XLaAI7ky71trbuvJ3OMs4+G03Ms3aJ9qzDpK6u
J6VwYOYijXQr6NZpydSTCQ4zEpwZQjQKbFXz4LnJWrM2ZRMGrm/32IgcmDIrRhOpv+/KyC6GVhqi
lbbG2g0zT20Hw1ttx61rkHuOQphgNI7WO0Zv2fOkmJHWnTdx2kTEnZiEAXQG+G0ueutzoCfW2Xnb
aakjj6zn2YDX8lWwiF9h1aUrD4wrtp7Vaifwl5ZmnHQ7nrOWXteJNXwbh5TWGEspWKCANnqe6S9d
2VnavmjRcvZvaUtPzMDY1IS1tsDlwgbG7k5q1xjdafm1arV1W5u0ouitt6x0lvu6rddoXF1iHTt4
4VFuuarVUQJb/C/f4cRQyxPyTbse9bedRVN/FlumoXdU0IUXudSo9d2ybkrq3Uwbe7ai9bo6pyx0
+a9wwmYftSd+qyOmu/Mv4seu52XjPWBFW+dsfLs/9kC/y4G2E5VrjnsTuZXZs4D27a3fZ4eirvjN
846Dg46A5nHwo7sgREHgyjnsjEUXEUTiOx6F1lRn/l3g1kCtnOHATL/uxG0qhW0lE/0eRDb+veXN
5kCN8C3D0sUFs7ogR/J+sTOTdIy2chFDexZor8KubTtxM3SZFvM8Gmo9uhyPmBbCiwxqXAE7Zg1m
Ti3qMRq2zvLQDYdBu0/gNMOzFh8wDkiXi2n36+P909PzH96+fvf9D5AL4aw9e87aL60H6gbpcAdu
hqwa0LYfObSLdvc1SOl2n/VWpqZN73TF7UZq1yRPwhZo0N80dk8N3H0bVP9bbb4W9VabrUW9+9qv
YOHYBeDXXU9m/yNWiDdC/wKfkAAL1593EjtYO67BMq+vG572nIXF2LmDa6jFfWff8LaZV+P68W4+
iuPCLXUiW4el6+T90pGT6+Ix3pIvpZ6MfKUwPok70Blz44xwP0ZFPXQnG8IYh7uvwlakRUCOpc2m
qmb3MAgX1WxY++PXPFvUGJrTJX6VYf1z19e5b4KEaWHpQNW4vUH6ta1PkT4DN2MWCdu0WWq/phSr
mQnV3UOKbKjup6onZSvYhUQ1I/cV3E9cdIuk6Y+K1nf42l3963ZvkditaTgKxYI5wRc3Y5teyYjM
JuS5PDLZV7Zxfwq8c+vL2ua6a0Wyz8di2s6FeozqP5H0bsD1lslqAzjV7/ZimI/aPDLjW3USyLSI
oDcXeRenp9rGaGqaUfF+01Dd24e3/hyYUe0zw26sSep4Fsy0U4d75m1Og4Yb/zQ9/jH453OL9dlt
O+Mblgqw9NumqR00+8a/Da1e2RqQD7S9SItegCBrZ3uRqrEAQWbO9iKpYplG/spp4TflCBRMTRtN
gU2xtbnrbUL4xcHJ+dt3Z5ijeXh0cHr2xKiWociHHWu+FtBlafGdKxj+FZnuHEtgyXo8nZ0fHr06
WMJUC7yVK7STXbbucQbx177L425t3ucM4uWvfgaxf/fG4h6P7hnEKP18BPHzEcTPRxA/H0H8fATx
f/YIIh4AbMbmqA5Nidbb/OGic0GRDzAHDl8cfX/yCiZV30X4/uhcz6X2EMmy+ZatYu7uIIzt3QA4
x860H6rgDjM1q0tzbVd7a5e5aut/4qqs22hYekdW5FyRFQUO4WbWvQ3zhgiD19pZ15NfZBJkzHn+
sL0QK7Iz8u04Vl+E1V4ECZcK6dd3InF6tKO9+ucbej6PxPZIz3Qjta1ngkpBjWxHT4nPTZp3Rg+o
fvZoyzxI2xopPaAaqbnh5Knx3IbG4v/2Hxp8YUzaL4Drt8OnWux75rf5sUoVTJViNCxm/y49aAlY
flGae09asCB5mQa0NTbCJPjdzQi6fxDvaQ0Q+eI+tKXdv0BwW99vx8YRg+vPfkNu2F7Q4cpwYAnY
HaS7mp6WjPnscjj5e/EhOPr5Ovitucsj3TC9u6O7N4NfWjfCBH7qN2+q2Y4wT06P6JlejdmnI3Vb
J18X0/m/s49N+0u7OHS6OAxaglf1sKmwIVLdwWPs4GxPDvbiRQeHKzsY3n94/wJHhnrs3mRXU9MS
wXSv7lfTfeZ/L47cDoOzmrt2Bbirxhfvzp7aMW/H76/bbXdokJY/d6h6n7XP7eh690iKPZn0Fz5C
SuEtfX7brn3shG0xBngCdl6UI1jpvr3R0/Kpfdo6tt+rsZoWczjy/cMntXN2OfwQHFwWWke/0cuU
D5++O54qpdt4Opm+/xZcC+2ya+9+FHxUU6vDJ4d75HWTjixYywxrVlUiw5mwliAOwsioyiAJ/nYz
/jS50c1pVSEs2KQeZXrVMLkqxrvT3bEZa4tBdvUBRem2YdVR7mqNBHUMpf4vmP9tSugdOR0cPnk3
HtrlkmZ5WlR6XRAcFlpkxUxtBud6mWbXVe9mC4kdtguOxepArxuW4wmGnXVGMTN/alljfe0Qj6un
watJYJF2VnqFRlbY+F8znI/VbGb7sBh/CszYG1Y3o2IaXN9MryczZRH8VEynxXg+VJZkU/HDcFy3
CNXP13qFa6KIZuq8uh4N9VLXkj5V1fB6qJdKQfFeC962Wau5WaNqhSmuddWqKOEY9aSxCIdjs7CD
pRXx9jQ4aWDhZoZacKmJL5UaGxor/YdpeKzZej9WJnA5gZNqugthjaxXkEXQTCdXrmS27aJsNhkZ
MnWlT60UrLz0uk0v4EvDXWV0VhGB2gnVa/zhR4WYzfpOewv5IKiLT1ZAmms1vJ531niG9O5yctby
jgOo0G3BCrLWfWvZ1HUqcxuupsiYdVp/LteGbc3MlSHTxBOrSy0mTaOVk0GjMcLlCwuNwmDGeDbR
vX5ztW3XwMtwzG6ubccaHEAphARmCzZPzTUYBYYMxsFbCH7oLu8s4hUIw9DcCYaQlmjIe6NpCtbi
EGTRCK6032iW9EYDh2PbSXb5b301E3MbY2f3oipGybXmjT7Z+IpB2lWwlimMZFRTBQDsa4graCZM
RSMl6AgS4PnL4GyuWymmqO/Qb4jMkXJ/7FbaopdG9xayseRqbZrWMBLNeMPIgsWi7WQxHv4dRfyE
rnEwUtCU6sGMVzhsmuE9mmhizTA38oboBwU5SFSkjwSdKgzr2CHXkRPSqn6eWy5qGE4aE1gv0leI
YllpujESIFB3rQlkObSpqbVixRisSVfjkSptaWyEC0UPWte9sObRFmUDB/jvS+Pdf/lo6w96BWsC
B/Rc1zIH6J/bWQw2O8heb5m5MNixP9LjYC94Ucy0LTk1Dbft7J+++WHfYnq8/1hXfvy/H+ufhf35
98ePtuzi+/WphttTiAafPWXawINUK9Xhyfcn54BiYN/L9Xvfv91/84N9aKqZlRTU18I9ff1HvbC3
9RftvNHL1PN+fYHtRAU+kAN4EJf4IMEHadlpwob+W2yDHEGDGtFrJ+PdmzdEBTH+aOtPLS8tKy38
eCGYRld9cbr/6vfdJqAsFy28eXvyqsPSoEvfH08Oz38IOdCjrZf7b5C4bxYS0t1n6PjWglGC33T6
bM9W1eDz18TDNx0m9qj7/Botb3smHfjbRZMNPeopVUZKdWyUyqrTThicGbtj7z9hdMs0XhRQljGW
+HdF3NcJPKgzfNAkPo6mBTW+amaEJm987SvCzlsL7VtFVN20NDAtu8raoi9QCQpSxTJErBLLhACZ
j6RExSlR4esU2019bc6Q1MJR4tWSNCbbVdiip6DFoMMhBhuJOIFlhCUyWlbET0+nHWyuTqO8TVZb
XqFGO0A1WAh/jzhj6i36RGE9zTBXrzFFmGb+8PGFtkfNM/U6ssR6TeaPJpTVDgkLR51g6+UADPsj
LCSzHabtCNMe+VzpZWC9s8+Pr5Bsc5j6A8AFOQMgHIRYRljGWKZY5liWWNY9DKCxYYiYQsQUIqYQ
MYWIKSx9DGGNJWISiEkgJoGYBGISuY9BIHUCMeG0EUaIKUJMEWKKEFOU+ZiiAssKSwUlzjuhFFhK
LBMfg8ywRH4l0iaRNom0xUhbHPkYYqQyRipjxBQjphgxxYgpCX0MCfKbIKYEMSWIKUFMCWJKenqR
InUpYkoRU4qYUpRTinJKUU5GwxyrZJQPSpTcACU3SLBEeQ0Q46DqYUDcIWIKEVOImELEFCKmsPAx
hEhliJgEYhKISSAmgZhE5mMQSJ1ATAIxRYgpQkwRYooSH0OEso9Q9hHKPsJelChxiRKXsY9Bouwl
0iKRFom0xEhLjLTE0scQI38xSipGTDFiihETOlVhInwMCfKXIKYEMSWIKUFMCemDP0uFKVKXIqYU
MaWIKUU5pSintPZmKtecOdOOC+rNBMbaYa3+NGFMIOopB4xJeTlgShrNAXNScw5Yku5zwBoHBAts
aGwwwDCkAcMBIxpFHDCmocUBUxpvHDCnQcgBSxyZLLCmQcoBGxq5DFCENJw5YERjnAPGNPA5YErW
gAPmaCJYYEnWggPWZEI4YEN2hQHqeezxyWMWEpH54YAx2SQOmKKhYoEF2SwOWJEh44CKrBsD1LMo
mjwOKMgOckBJxpEDJmgxWWBGxpMDlmRROWBNZpYDNmR7GWAckkHmgBFZaQ4Yo+lmgSlZcQ6Yk2nn
gCXZew5Y0yTAARuaGRhgEtJ0wQEjnENYYEzTCQdMaY7hgDlNPBywpNmIA9Y0RXHAhuYtBpiGOJmx
wIjmNQ4Y02THAVOaATlgQdMhB6xojuSACidOFtgEj896gQScFXGO5ICC5kgOKGmO5IAJzZEcMKM5
kgMWNEdywIrmSA6oaI5kgOGA5kgOKGiO5ICS5kgOmNAcyQEzmiM5YEFzJAesaI7kgIrmSAYoBjRH
ckBBcyQHlDRHcsCE5kgOmNEcyQELmiM5YEVzJAdUNEcyQO2CPx6yGh0JmiM5oKQ5kgMmNEdywJzm
SA5Y0hzJAWuaIzlgQ3MkA5QhzZEcMKI5kgPGNEdywJTmSA5Y0BzJASuaIzmgojmSAcYDmiM5oKA5
kgNKmiM5YEJzJAfMaI7kgAXNkRywojmSAyqaIxlgMqA5kgMKmiM5oKQ5kgMmNEdywIzmSA5Y0BzJ
ASuaIzmgojmSAaYDmiM5oKA5kgNKmiM5YEJzJAe0fJrIHgfMaQLlgCVNoBywpgm0H5SjsLeQTFDu
xZKgHEWlQwwshxQyDTHQG1YSHgiMSQiBAUQRRX4cj7Dxdd0AToZL+AzDCRg2DjNcZme4UM8wDJEL
H0OOb+S4fRLmuCLPcW1fYMSiwCaK2EdRYGMYZg8LxFBgoyUSiQHysOxF0zDUvJBf7csPwwcVVqwq
H0WF5NbYWC2wxEYxWh7WSGxd+BhqlFWNZNfYtkIBKBSAQomp1MegkDqFAlCISSGmBmlrEFPTE2WD
GBrE0CCGBjAIDOQKDOSKgY9BYEhXYEhXYEhX4K6YwECuwECuCH2dEhjSFRjSFRjSFSFiwkCuwECu
ED0MGMoVGMoVAjFgAFdgAFdgAFdEfmjTarobUMqwFzLs1wz7NcN+zTBslpEeZ2UPhSIVR1w59kOO
uPKEKqCS5KgSee3jyrFLC+zSAskqEFWBZBVIVpH7GArEXdA4Q4xlSLqP1OGuVVgiqrIXtiyr1spA
iTUrHE4ValGFTdShj6HGtmpsCzemwhr1sUZ9rJFY1Qv4KRSAQhoUCkChKBXSopBWpXwMDfZKgxga
6o0GUTSIokEUjY9CYBRaYBRaYBRaYBRaYBRaYBRa9KLQAqPQAqPQAqPQAqPQAqPQAqPQoheFFhiF
FhiF7lpxKBETRqFFLwotMAotMAotMAotMAotIuHHSldPGW7wdHXd/lIyi2jcMevMLKbByAEzGpkc
sMJRygFzQeOUA8akHhwwpwHMARUxzgCLkAY0B4xolHPAmIY+B8zIDnDAmkwBAywHZBc4oCQbwQET
MhwcMEcrwgJrMigcEJYuDctKFZMJ4oDJKmBGRosD5quAJZk5DlitAioyjAywHpC15IACTSgLlGRN
OWBCJpYDZmR3OWBBxpgDVmShOSD0Z8bGu+qGbDoDVCEaehYYkc3ngDFNBBwwpdmBA+Y0ZXDAkuYR
DljT5MIBG5xxOGAjaPLhgNEqINohls8GWGlYVhpgpWFZaYCVhmUFkxwajhUB+16C3fcSsO8l2H0v
Aftegt33ErDvJdh9LwH7XoLd9xKw7yXYfS8B+16C3fcSsO8l2H0vAftegt33ErDvJdh9LwH7XoLd
9xKw7yXYfS8B+16C3fcSsO8l2H0vAftegt33ErDvJdh9LwFbW4Ld2hKwtSXYrS0BW1uC3doSsLUl
2K0tAVtbgt3aErC1JditLQFbW4Ld2tIePhRsl8HulojYqFcGb/KhogwGb8YDwRhnbNwhSwAtG0zL
wEhlbLxsscAoIPVHxGzQLYNBnrEhiEyReeaAIEk+jJUPAMiGd3Iw2jkryRzEnLCRx1wCkJVkDsLi
40056FrCCiuHaS3n36zgTTa8k4OupTwrICE+pFSg38RGqgrQmILlswCNKXi0IISMFV8BGlOwQihg
wPFaWsD0XbCaUIDDyitiAXNByRK0WEUK1NKMDZSVMMOV7DiA/D3jTnJA6Hde10ro95Lt9xJYLlmW
K+iDim2TnEweCH1QsW2Sk8kDwb+q2KFKTiYPhMm6YkP9FfpXbAfVMFRrVnw19ErN9koNQqhZIdQg
hJrVmBqckprVhBr4rFk+a7RX7FBVMOAUO+AUDDjFKr+CzlbsgFPgLys2NKygPxXbnwr6U7E2UoH2
KVb7FPCpWD4b6LKGZYX8SB4IfDYsnw3wmfNA6M+SJwiE0LBCaEAIDSuEBoTQsEJoQAhs2F3A/rFg
948F7B8Ldv9YwP6xYPePBewfC3b/WMD+sWD3jwXsHwt2/1jA/rFg948F7B8Ldv9YwP6xYPePBewf
C3b/WMD+sWD3jwXsHwt2/1jA/rFg948F7B8Ldv9YwP6xYPePBewfC3b/WOD+cc5ZMAH7x4LdPxaw
fyzY/WMB+8eC3T8WsH8s2P1jAfvHgt0/FrB/LNj9YyEwvMPyGUF/Rmx/whaygC1kd0dIxLQjtG92
hE7e7MN+0IwuoenvB8Er5kdRe5s7LsiNeTsgJ77ngpxwngvq+9aYhpRxK1iBO60Zu0yIMfwq4hQ8
COP5cvVgUsm4aInAjKSc9ftx6zTnoiUC84pydn2DG6A5Fy0RmDqUs1xhAhB7JEHgNmbORYUE5vjk
LJ8Z+pxsmxhBLVjxYZC0YJdNGR6IEnoxAX1Qsh2J8dIyZfT3BemvPchzdl1U5kTaS3sBk5oGp2o+
V9OFJrvqWpJ2mXC9c5ZF4J6dwD07UVEYGXcZRE0PcCNN6GkekfUU3GnHVXAH5PIW0RGKKDG8HUyu
yuHYcHc4LKrp0B6lDV4W0w9L2IsokTjCdP0ooQcmV94h8Za6Ds231O31XyTxoEze778oJR5t/30/
VeqDPbB4YM8K8xYowl2xKMPzLFFW4IMKS9wLi3B7N9IrInhQKR9ZTcSb/UpXgJjeHeHBgQgPDER4
UCDKZK99H8UqSvz2/Y3jKB/gO1X/HSgRaY26F9X+rm2Ee1wR7nFFuP8bodpGuP8b4f5vpPw910il
WCIm3P+NcP83Ug0xgCiMIJ3R1BfkQoBQ4nPc5rSicHaN7tTlUCJfedgK3sfVdkFBMhEkPqQHt9Gj
Ghup/Z20CLcKI4U9gRuEEW4QRrhBGOEGYaT8nbQItwojhZga6Y/JB6mfi+Ke6ueO8we176K4Z/t9
2wEBhIidxKOiJuwNTCBRxoX9IgoXRFWI9di9t6gSRCMHbCnH2WpZvYr0kgPWC/b3SEJMPdikiXIu
OBrB4jpidwEjWD9H7FwdwSZNxO4CRrB+jtjzhxGsn6Oai5xGsA8T1SzLsA8TsfswEezDROw+TAT7
MBG7DxPBPkzE7sNEsA8TsfswEezDROw+TAT7MBG7DxPBPkzE7sNEsA8TsfswUYP9yaKFlXdUsDrZ
rNLJBmdWbpESZQmNIA7YsaN7NJi4ehUpNQek0Z3R+KtYJB1bjPVKbqHiGOY9GnRMPdhOjGpuhRXB
dmJUcyusCLYTIzYyHUEYKGLDQBGEgSI2DBRBGChiw0ARhIEiNgwUQRgoYsNAEYSBIjYMFEEYKGLD
QBGEgSI2DBRBGChiw0ARBHMi2EB3nTVJDqm0ztrBp+lwNFrmpEnyEiXmNkly9yWafkmmXzYwwUhM
hZFN7rlRHWQJIsvug8xxaGREVfHwqUyQQjxyKvHIqcQjpzLpocDDpxIPn8oEMeGRU4lHTiVOnTL1
/TKJRwQlHhGUKWJKEVMrNYRn/opaoqcjMd9LYr6XxJxHmSP1ObaU+4eWZY5tYrqXxElaYjKkLBAT
pnnJoicH9KAkJkNKTPOSeGuAxCwviVlesuzJARdaEi8PkCViwtxIWQksJZa+lywr7GjMB5NVFbia
gbRgFpisfQ9XYj6YRF9Zoq8s0VeW6CtL9JWl8nMCJWZNSvSVJfrKEn1lib6yxFxJ2fg5gRKd54X6
5p4TLTP/IOtiVAhS5AGWKDQ86SrxpKtM/GwsiWdeJZ55lXjmVaaICU+6SvQFZep75hLPvEr0DiWe
ppboJUpM4pXoJMrM96Uluu4SlzsyxzYxcVHmSD3mLcrc96UlZjJKzOqVmLcoMW9RYt6ixLxFWfTk
gNm9EvMWJeYtSszulXh9hMQsX1n25FAidRgxkJi2KEvEVCGmCpWo8pNAZYVdjwmOEtOBZYVKVJE6
Iqa6pxC4fpGYDixxHSNxHSMxCVji6kX2Eh0lrmMkrmMkrmMkrmMkJjpKXL3IXqKjxDRg2SAmTHiU
5qZPZ3GyrlF3VhrrIuv5VotZQqJzI9mUDBl3ZpM9IoWpB+cMJXvOUEI8ULLnDCWcM5TsOUMJ5wwl
e85QQrBQsucMJZwzlOw5QwnnDCV7zlBCmFGy5wwlnDOU7DlDCecMJXvOUEIMUrLnDCWcM5TsOUMJ
pyVkyvIJpyVkyvIJpyVkyvKZNmTJGCCkbsiM5RPSI2TGtpnVaAhZYEM2kQFCBoRkA84SMiAku2aU
kFYq2YCzhCQHycaUJeScSna1qX0KtMgssCbjzAEbstgMELJVJbtOlZCtKtlsVQnZqpLNVpWQxyDZ
tbGEPAZZsHwWJc0SHBD4ZPNcJeQxSDYCbtwkW7B8QvKCmXk4IPBZsnxC8oIsWT4hQ1ayGbLGC7MF
yyekz0o2fVZC+qyZ7RggBFbM1McBJRTcCldCbq2ZGjlgBgW3USIh7UFW3L6EhCCNmVk5oIKC2yiR
EHyRNdtlkNkga7bLIDIja7bLILNB1myXQWRGspEZCZEZyUZmJERmJBuZkRCZkWxkRkJkRrKRGQmR
GclGZiREZiQbmZEQmZFsZEZCZEaykRkJkRnJRmYkRGYkG5mREJmRbGRGQvDFeC0cEPhsWD4h+CLZ
DFkJGbKy4TJVFr7KgFyGmMuiMQ5H699DvYitB1uNkj2lKeGUpmRz3ySc0pTsKU0JpzQle0pTwial
ZLPmJJzSlOwpTQmnNCV7SlPCKU3JZs1JOKUp2VOaErY3JXtKU8IpTcmm1Ek4pSnZU5oSTmnKlOUT
7jeQKcsn3G8gU5ZPuN/AeBgMEPZbZcbymUGbGdsmhOuMh8EBoc2MbRMyL2XOtgk7sDJnZQvJlZIN
QkpIrpQ5K1vIn5Rs/qTxKWzB8gnJlTJn+YSDMDJn+YT8ScnmT0rIn5Rs/qSE/EnJ5k9KyJ+UBcsn
nJKRBctnAXwWLJ+w/SHZ2KyE/ElZsHzC+RrJBlqNT2ELlk84fCNLlk84fCNLlk/Ii5RsXqTxKWzB
8glJk5JNmjQ+hS1YPiuw3xWXaWh8CltwmYYS0i0lm24pId3SeBgcEIx7xWUaSsiolGzEXEJGpWQz
KiVs+sia7TI4mSNrtsvgZI6s2S6DTR9Zs10GoXTJhtIlhNIlG0qXEEqXbChdQihdsqF0CaF0yYbS
JYTSJRtKlxBKl2woXUIoXbKhdAmhdMmG0iWE0iUbSpcQSpdsKF1CKF2yoXQJmz6yYflsgE82o1JC
EF6yGZUS8iJlw6RTxBShj0U3Qt+52LaYfuLj9TE5JfHAv3vTBTlhyxiPbMd4ZDvGuzdjPKgd40Ht
GA9qx727Ny1OJ4IU4znXGM+5xnjONcZzrjGec43xnGvcO+caD5QXa3JZcCJHLqjnycVw7ihmgzox
nDuK2XNHMZw7itlzRzGcO4rZc0cxnDuK2XNHMZw7itlzRzGcO4rZc0cxnDuKB5z1iSH1NWZTX2NI
fY3Z1NcYUl9jNvU1htTXmE19jSH1NWZTX2NIfY3Z1NcYUl9jNvU1htTXGFJfvRES0QjJzAjZn+pB
MSy4u8QNhgg3LmO8dDJO6EGW+oOkVzfO6UHTexkeZDg4Mv+2BrcdZxsgjgsPbReLOww6JPnjYU1q
3RG0JrK+oi6q44XGMZvZ6jS8R2/2+zynPrf7lj+ocqp+4nPmYtqqjnEvLKY96Rg3quISb8aOcUcq
prhybHJ8XGwNgWxyj9ONuC0Q47ZAXKEBbaj004HWJs3F5pDmdue6DbnYnIbcjkloukqOYTAWZWc7
2bkbPanr7i395gllHSZ4I3BCLSW9/eNkANsVCd7ykeDtHgld0p/gncmJJByxnw24aA93UZIa0x8S
3N3rEODnky4lICmICcSBWziJ8vf/koZa8Se3B3Ln4rgnd04fP5AAF8c9CejdRu7ow7JvBXhq4tRz
dTMl3UztXUln2pUqluhm2vOYUvIpUryYJqVQTorXXqS0vZTKwuvo7steL90XryPh+77syYPujkpf
GHmcXxbFuOCNaEqXcKRl6DPggFzyHJDbeE6dkdvb5A/VR934+2I6bAlwTEOeYHZ/nvg9kw9QJXP0
WPMB5s7meLl1HmG2bY63nee0w5eby6hdbDFuMubmjminF3Pce88xmQRqdGWxNikuNocUR7JrN+Ri
cxrqDa+u7FcMr5zUKbem/4Uavy9Gy7pTEUrV686MWMM7wvKMWMPE4BzTZHLMLshznMxykwTgIivQ
GOe465/jrn9OH73IcQLMcXM/L9FG5VVPNXAXP8f0lLwqqSqKGLNOcrR3ee0fp8npCx45JmcvBNH4
RiNvkFT0H6CGoyBrispFtqaoXGQPEpWLYrWonE+B5I0kkJ9FsK6MXGRryshF9iAZuShWy6g/kjvD
bsVI3ifbvG9t8/c306ubD5dLhnJB1qHoWeYCl/sFGacC1/cFXupW4K1VRYgiL4Q/gguBIi/wNqkC
v2lQ4NczCvx6RhElWGZY+i5jgV/PKCLskwI/m1HgJwwK/EhGIUuq4A/ggtZBBX6coMCPEyzEkPqD
4YFicHGsJQYX1cPE4OK4mxgcZX2gGFwca4nBRfUwMbg47iaG3jjsjplV45Bm1H04SnXzt2JazJeN
QxrbRW9KLcgGFmgDC7KBBeaiFnjfZpGhQSny0EdCZrHA6zMLMoYFGsMCjWGBKaJFSa2UvaFIF44W
mCFXaGOID3J8QFJHa1jUAx8JntRxOXf19IGcu0jW5NxF9kDOXSQs565qPpBzF8manLvIHsi5i4Tl
vD/AOuAVA+wFTXQv7ET3ejr8VPCjq6QRW/ZmuZJ88RJ98ZIMXImL6BINXIkGriQDV/amu5IMXIkG
rkQDV6KBKyMiBB39khz9Uvo385ZoyUq0ZCVZshLXBCVG90r8plOJZqyM/XmvjBviP/QE0lsnlb11
0boicpGtKSIX2VoiclGtFpGjxusKxEW2pkBcZGsJxEW1WiC9QdsdY6sGLc2KL+yseF5cDUdLBq1C
A1P2psQSr+Ut0TqWZB1LTGov6SRUicuCMhf0wI8jlngeo8zxXUxeLzF5vcTTGCWewigLf2lZFrgC
LzFrvSyoeTxnUZbEC64wSlpZlJXwsVUkSFxalBVpCBrWEpcWCwk1/h2t60rIRfYQCbkY1pWQi+2B
EnJWnSWFHQHkqP6awnORPUR4LoZ1hedie6Dw+gO+Mz5pwDObPQc0Sx/YWfpcjW7e3/AjviITUvWm
6YpMboUmtyKTW6HJrQbIcoU2twqxT6rePF2Rza3QxlYRYUMbW9G6osKPMlaSaJM9bJKwoZGt8GOL
FRrbCo8BVWhJXT4d1V6bTxfbuny62Nbj09HCtfl0sa3Lp4ttPT57A6ULXjEzHtDMeGBnxt8X43FR
L3FoK/KQq97cWKHxqtB4VWS8KoyYVWS8KjReFRmvqheBrWjFUOEKoaIVQoWWpiJLU+HWY0X2pap6
2MjSVGhpKrwAvsLzURWeg6pwnVApfx3rMu6q55qMu8jWZdzF9iDGXRQO466+rsm4i2xdxl1sD2Lc
ReEw3h9cHfCKwXVIs9ChnYVeFqPik/7fFT+8ahqxdW8iqjEOVqPdqslu1Wi3arJbNdqtmuxW3ZuH
arJbNZqpmsxUjV9srclM1ejR12Sc6l50s0afvkbzVKN5crlxtGpdblxk63LjYrsTN46qrMuNi2xd
blxsd+Kmp91d8CrtpqnjEG7dGo4vtXLzm8E1WosarUVN1qLGY711TlzgofG6jOhB6SPD0+E1ffG8
xk/n1Hj4u65wFVljHkVdJz4O+gp6jce664Y6pZelU/eycNZlx0X2MHZcHKvZcbViTeJdZA8j3sWx
mnhX647Iph6lmIGwJLitaPNaxX4oWZEfqDAjRUUN1S29zlf4VWuF15wp/NI01Oz2wS1YHZZvqdsb
kl1mVgzJIxqSR8fwaa/JEtlQppaqe7LBKycUaonC27kU5uwp/OyWwlWpyvwZQeW4s6rw7glF391S
uOpUBXGPy09V+PERhbdNKFx9KrxjQtFtTwodA0VZaKrsEUI6qdBnUKibqsoIUN8qD9xJVb3d5gdJ
ysXwQEm5SB4mKRfHAyXlIulKytX2h0jKxfBASblIHiYpF8cDJeUi6UqqP9Y7L64Y68dkCI8hpjks
1byTwuyM90Ygykb4+t1QPliDUdxGomQbvBWkSVGyDe4CNTm9kvv5zw11S4PJDA357Q1eyNJUjWdh
G7KFDX6NrQkLegB920QSywTLzMcR0SsRSL/BywQ77eMD2kFqzPf1XCSV76muLRwX292E4wQMG9Ey
ZvYhfnj96rUW+EskztOrtcl1sd2N3J7+dpVtuf6GA9TfcJDbxdGnYnxVTFn9DQeYMap/ePqLaMwP
EcIDEdGDFB/kWBZYVlghEj4y3PXQP3Kv4djLxNWggmjy1GZtmlxkq2nqdtnaDbvIVjfs97vTSav6
fZ/6HTIU1GT6ftnZi3BQEM4q9vuqA4IHNT2AK110Wfp91ngfTPQacAV/twZcmd3tHVciIY2EEE4m
FOP3N6Pgd8XVhF1MYX3zI4aOCXHXLMRPNIYhBu/DsPFm6Xu/7LAXJoPb64rlDfmcC+I8ss780fxy
OLnuJP87RiBKwB7pyl6ADvHYHwk+QLqExAewWtZlQYDaRxITkhjfifGdmN6Ja3hAYhBZ4iPJ8J2M
3snwnZzegUulQgHpELoUCCh9FRclcVHiOxW+U9E7qGaioprmamMXCWmgqJGtmuoqxIqbUmEEX4YM
o9DLm9FPsMEIvpyqy4we4DuCkKDEI0k14sLHhid7dE96c3AHlHiRngd3sovkgZ3sIlmzk11kD+xk
F8kDO9lBsnYnu9icTu46NfqJ6PZ/x6l5eCc7SB7ayQ6SdTvZQfbQTnaQPLSTu0jW7mRnQnhod7lI
HthdLpI1u8tF9sDucpE8sLscJL9ud7ljsufBdWfY5ZvrYUQeHFzXf3CpppMP5gpAzlmJyCPqXW3u
gVxCHZDbPF1AGybWaXg3Nh95qIODYlzU2pEM9svJdPh+OC5Gwdmn0cicJuS/jaAxoTgSc6GlMw/h
STxd+qbWe6k7thYguEhTl02nrsOhi8blMMmIQ7s0ev3+srNn5HCQZIQl92fSBD5yD5CzN/sHR4uX
tJa9ON1/9XvnicNlguew8PUu5S7Io5xUA85yvr0Zd7w5l3Lq4aQZ+JSrEkH+RzS8t5xJJVGqC3Io
dt5yKaYTfmEaQmrY+2I0ec/TTGfn9I8KH2Cbaegr9y11HfpuqesRLIjgCFcLN+PJkpVCSrYhjXwF
TyHrHSEO5c5LLqEOyKNLEl2xPct1czmsl1BFC8U0jvy2HZDbtgPy2k6o7RQ7sSzGP/F7UVjZ/kBp
JyRtuO9WlwLLHn33e9dl4H7vehySSUghT+PySi2JlaSKmlF+rIQOV4ZpXTF1Xf2oJdVN8EFGD0pf
KqvxulJYXbc3J3XBK6IKGQ3jzH7C6uVk/H4y6oYVumd1dW3lSS3DU7D6hy+1jEZnBidmnbrwgIZF
lkKUJSMms8KXaweb7zGv3ZAj6LWx9brCQbC8K2iHLqRNqPlwDN8Tq/U0vV/Xw/lwomdnPuKjiGyF
85ci4638A/231e1ephEquKNGlxGWMZYpljmWiMq/o0Y/aaAMEVOImNAzUyFiQvGqsPQxhDWWiAmj
dEogJoGYMFinRI8LgdQJxCQQU4SYIsSE1l1FqY8Bg3kqQkwRYooQk0RMEjHJ2McgkTqJmCRikohJ
IqYYMcWRjyFG6mLEhBEiFSMmdPdVjJiS0MeQIHUJYkoQU4KYEsSEbpxKGh9DitSliClFTDgWVIqY
UsSU9vQhReoyxJQhpgwxZYgpQ0xZTx9wiaIyxJQjphwx5bGv3z1BFFi1wEYLbLTARgt6E5sqeoIo
sdESMZWIqURMJWIqEVPZE0SJ5FeIqUJMuEZSFWKqEFPVE0SF1FWIqUZMNWKqEVONmOrewKiRuhox
1YhJISaFmBRiUr2BoZA6hZgUYlKIqUFMDWJqegOjQeqM8XGizAous9KlwFJimWCZYVlgWfUwKDQd
iClETCFiChFTiJjCwscQVlgiJoGYBGISiEkgJpH5GHDPQAnEJBBThJgixBQhpijxMURIXYSYIsQU
ISaJmCRiktLHgItchWEFJRGTREwSMcWIKRY+hhipw2CDwmADJnboEjHFiCkZ+BgSpC5BTAliShBT
gpjQz1OJ8jGgw6fQ4VMpYkoRU4qYUsSU9vQhReoyxJQhpgwxZYgJwyLKvxdKP0HqMsSUI6YcMeWI
qcDnRU+SBdXAtgpsq0CqC2wBAy+q7EmyxLZKxFQiphIxlYipRExlT5IYmFEVYqoQU4WYKsRUIaaq
J8kKqasRU42YasSE/q+qEVPdkyR6sqpGTAoxKcSkEJNCTKo3shRSpxATBohUg5gaxNQgJv/TePqJ
Hy6/xTlyfMVb6vpXc1lnCl/rXTBnPSxbMNfhWbfLFsx1eNYXswVzHZ510GzBXIdnvTZbMNfhGVcO
CuY6POvV2YK5F9q6erZg+QyBz5DlMwQ+Q5bPEPgMWT5D4DNk+QyBz5DlMwQ+Q5bPEPgMWT4F8ClY
PgXwKVg+BfApWD4F8ClYPgXwKVg+BfApWD4F8ClYPgXwKVg+I+AzYvmMgM+I5TMCPiOWzwj4jFg+
I+AzYvmMgM+I5TMCPiOWzwj4jFg+JfApWT4l8ClZPiXwKVk+JfApWT4l8ClZPiXwKVk+JfApWT4l
8ClZPmPgM2b5jIHPmOUzBj5jls8Y+IxZPmPgM2b5jIHPmOUzBj5jls8Y+IxZPhPgk/tsjF0L2YLl
MwE+uc/G2FWTLVg+E+CT+2yMXV/ZguUzAT65z8aYlRgULJ8p8Ml9Nsau1GzB8pkCn9xnY+yazhYs
nynwyX02xq7+bMHymQKf3Gdj7OrQFiyfGfDJfTbGriNtwfKZAZ8Zy2cGfHLfSbXLUFuwfGbAJ/ep
GrtMtQXLZwZ8cp+qsQtaW7B85sAn96kau/S1BctnXq4YDgW0yX02xi6XbcG2WUCb3Gdj7MLaFqxs
C5At99kYuwS3BSvbAmTLfTbGLNahYGVbAp/cZ2PsYt4WLJ8l8Ml9NsYu+23B8lkCn9xnY2yAwBYs
nyXwyX02xgYQbMHyWQGfFctnBXxWLJ8V8FmxfFbAZ8XyWQGfFctnBXxWLJ8V8FmxfFbAZ8XyWQOf
3DdlbCDEFiyfNfDJfVPGhkxswfJZA5/cN2VsSMUWLJ818Ml9U8YGX2zB8qmAT+6bMjZMYwuWTwV8
ct+UMQEdKFg+FfDJfVPGBnxswfKpgE/umzI2NGQLls8G+OS+KWODSLZg+WyAT+6bMjbIZAuWzwb4
5D44Y1drtmAuUbarNVswd3vb1ZotmLu97WrNFszd3na1Zgvmbm+7WrMFc7e3Xa3Zgrnb267WbMHc
uG9Xa7Zg+QyBz5DlMwQ+Q5bPEPgMWT5D4DNk+QyBz5DlMwQ+Q5bPEPgMWT4F8ClYPgXwKVg+BfAp
WD4F8ClYPgXwKVg+BfApWD4F8ClYPgXwKVg+I+CTu/zbrtZswfIZAZ8Ry2cEfEYsnxHwGbF8RsBn
xPIZAZ8Ry2cEfEYsnxL4lCyfEviULJ8S+JQsnxL4lCyfEviULJ8S+JQsnxL4lCyfEviULJ8x8Bmz
fMbAZ8zyGQOfMctnDHzGLJ8x8BmzfMbAZ8zyGQOfMctnDHzGLJ8J8Ml9kMuu1mzB8pkAn9wHuexq
zRYsnwnwyX2Qy67WbMHymQCf3Ae57GrNFiyfKfDJfZDLrtZswfKZAp/cB7nsas0WLJ8p8Ml9kMuu
1mzB8pkCn9wHuexqzRYsnxnwyX2Qy67WbMHymQGfGctnBnxmLJ8Z8JmxfGbAJ/cRMLtaswXLZwZ8
ch8Bs6s1W7B85sAn9xEwu1qzBctnAWi5b27ZBZktWLQFoOW+uWUXZLZgxVeA+LhvbtkFmS1Y8RUg
Pu6bW3ZBZgtWfCXwyX1zyy7IbMHyWQKf3De37ILMFiyfJfDJfXPLLshswfJZAp/cN7fsgswWLJ8V
8FmxfFbAZ8XyWQGfFctnBXxWLJ8V8FmxfFbAZ8XyWQGfFctnBXxWLJ818Ml9kMsuyGzB8lkDn9wH
ueyCzBYsnzXwyX2Qyy7IbMHyWQOf3Ae57ILMFiyfCvjkPshlF2S2YPlUwCf3QS67ILMFy6cCPrkP
ctkFmS1YPhXwyX2Qyy7IbMHy2QCf3Ae57ILMFiyfDfDJfZDLLshswfLZAJ/M17pCOscbwjne76dK
fWjTpfgcKTrnGTaYetRQUniDGUZ0BjNsJNagpPDGpN+72Cj9vsF0nAbTcRpMx2kwHaehk2JN2sNB
mWMN7uQ2eLt5iIdHwwYz6RvKoG/M7eYukoreqfAdyqBvMA+kqakGpns0lB3YqMrH1lBDuGnaNPRy
U3mJZGsL1MX2MIG6OJYLFHe4F9JihONjq2sSU3OrcJSX1rIQDqbKNaEvrVY4mLjWRPSgl3/WSF+Q
PWlRnmyDSV1NOuiIycXWigmTreg8s/6BD2gnu8HMqKZcSNbHhukHTUlV+zrbyh7KHnucykKZ+hqb
9rrCR9bgu433/S9NGWpQSRqEuVdNRT2NqVSLrq8bH4nqaQVibfw0i4aO9TSYBMkMEHqAKYlNRA+i
xsfWGTu3DhDQBHoh6eGiozoN5qc1dCKnqfABJS4vjAY9UH4ySNMQqPGTnNe2ES62h9kIF8e6NsLF
dk8b4SSQrC0cF9vDhOPiWFc4LrZ7CqcXmXWM6B4NqX4E17GteyRJpl7X5O7RAGTqdSwx1mMTERyz
vEf9w9SDHfemDaS4wIh6iQPG1HUcMKX+ZIDdCWGP7AFTbzFPhFiP3Ytq6PhpkxKv7EZPk1KXptQu
uxfSpKTJaY71Gh5fQfVKrMfuOTRp1Wo14WPrdSc/qMdu7jpzItTL2XrdqRLqsRuanRm0lTNfD9SB
3fNr4HvOUc4qEmzrNewuWmeKpebZ/avOTEv12P2fBraVGnaLp4GNGu0yMm69Myvu0TBn6nWN4R4N
c6Zedw7do2HO1OtMrTSo2XrdeXaPhjlTD1JaGjYi20BKS8NGZBtIaWnYiGwDKS0NG5HtTuk0qFna
MqqXUb2MrZdTvZzq5Ww9urGiKahewdZb+BU0qEu+Hg3qkgZ1yteraEwwwK7Pskc2iqtX0fBggAs/
hyiuWUpqorhuG2O+ft51kwifYvEpwqdafMw30e0Aw+HGABeOFzWWcpuYxhKSg0b12KHZVDR8/RW3
oJuHxCCBG2jGalqMgjc342p+U5jDSeypMf0e2GX9o4EHeDmT/qHgAc5U+keED6iGf6erGIRUFxZN
YhDRg1jAg9hz++/6Tve0r6A7gfSPEqnOsMyxRG7M/SzdY8Hcq52qXe+RqbogddEMw56DJPYuV30w
WhdJ7+IZMUhJBewJ67ObazWdVdPh9XwWFONaPyjxTzYCo98Psex1K6T2d2pIpC/zFtYuErefU1Kb
FBUrKzpYXKGtbLB7RLpTlaqkKMSMpJrlvvBWovfPCNrqgyUfXXXbxQOEkqvXIWf5QUNBN0mJwYG9
h+BmOlXj6lNw9umqnIz4M/+CbmgSA/tZUkfqLsgRsgNyBeSAPAoPiUK4KWFyVQ7Hw/H74HBYaPWa
Dyttd14W0w+zoJlMbyG8pnb8zzh7IJc6B+RSR/dOidB+3PZUzedqOhp+UD1CHN0P4RCTLlMsUTdD
OBCpyxjLnAC1jwMOG+kywTLDknDBAUdd4vAOo9DHEWFzEeKCk426rOkVsFahjPGBf3ucoEuqdN3C
e1l6h9Qsn1AqLBE9sY3GsUOPjyFCpvAOZyDI0cEQTorpMsQywqoDlNQAJTVAbkPpowgJe4hVQ0VC
JUqxg3AWCUWPDJzQwgj7msQjSV4SmZQE8G5WY9SkJE5QCmTKw1CQ3vg4Ohp0Z73xcUQo0Sj01IZY
bLXEG1a3KIczzm6p6/snlgGz/OF2siw3jz88ZiGlNYfgQ3nDOabhnJnh/OrmqlTT4HgyvVpiUcKY
dCuLfNYdkDOJeCBHCA7IX0uJMCUZpeB6i5Bz+QXdMqd/UL2UMf9hTvzid+Onk5+WcZoTxsafaj2Q
IwQH5HLqgFy66FI7IY7h1v/5pboqwNa/1n5GMZ9Ml9BJ1ykJ0aPTA3XpdEEOnS7IpTMiOuEan5fD
WaVGo2KsJjez4FxVl2NDMk9oRHijyvvIvQ/qEuqCHEIXIBzRkSh7dQXWRdcvEr0pje4GEjKCCXc8
n060az/Unv1ULZG6pLal8G5J8UFdZlyQw4wL8iiURKG9JuX1NSjGwWUxLSo9/wZvVTV5Px46yxCX
XLLB0v9ovA9yyHVALrkOyCM3IXKtkhyNq9FkZq5xGF1fFuObKzVddrsSvmp+NL6OyBxXUlLlPp3O
W47lWYDglKJ+u+jWdXhy0PRMkSS3SOLaVsiSWQPbp1CvQlMka8YUxaR2sb1/5sXk5+BwWvykPT1e
NDEpSNxz/T1QVzQuyGHXBXnEZUScXeu8GE2qD8HRSF2p8XxJ18XkgMd5jz4X5NDngFz6HJBHH7nx
MV0Ie6XmWq2Cs8vietmYjcnrjnuW0gM5FDogl0IH5FKYUPcmjKVc6bQn1C8JOokJnNPXZYolejhJ
Ch4O3a6lf/hO2drIuqJYF5kjvHWRueKmK7lE+sKI+1APo7JYpqop3qOmf0h8kNCDHB+gsUnR3U0F
EpPK0scGG5K6xGVHilGFFG4L0GVGAHAf04Taz6WPLKe6BbiYaUl1S98irs2Gi20NNtLYR5bLO7HT
1a712XGwrdkrLrLVbDgzTpoS1bnv667NoYttTQ5dZKs59AbbAQ22o75tc3xXNHQ7+0sGIk2pqeqp
owtyesMBuWw4II/qY6L6GON31zChaTphIbCUzIaw9iYOD+SQ6YBcMh2QSybdSiYyS+aLaTEcjVTw
pjCRlvESi0YXd4msR6EH6lLoghwKXZBLYU4U5ukyQb7gycwJa97zYTxQl0wX5JDpgjwyyYfJmRmY
1dJlVNO8k/eE64Ecqh2QS7UDcqneJ+Hu97X0PsvCgiRT9Ij2QF2iXZBDtAtyiaZvCAm4vu3gd78P
3ha1IXPW4YAnVJEwFHx/VpiTuvCgiTzKb6vbZeWWus7q8Ja6LrOUfCmOD/Hzl+9/Hrb88kxSKodo
an+q9EBdFlyQQ7EL8ggkQwfZoSe1mryfFteX2j0+VLBFoReKi+XjMprJSDX+NxF8kEOzA3JpdkAO
zRHtr0WDiDQIR6XdW+H22brERgOcWvX7nrp3QDDr6jLDB3CdVTSIqEywTH0cGJkD9N29MkO5uwUG
T7pCiWhLCl4/OTyC638BlLgOhH6SQimIbohd6JeJ7shbjiNZHWF3m/Tn72ggSdh2dffDcFq8L8b8
1ae6MpGRo3TwGy/6R0/UsMjWZeVL4BYsnSuRubo97laj89jdJ3bxe7Xz4sNydguSm283LQggpc+d
+5LDTEGUNkXQVnGZcd52aaf9ligUECW4nlxNGv7qXl0ZNi10ZV/+Lshp3gV5zUfUfNb5zMjB5Opa
j8VyOBrOPy3/6EhkwueA2d+B9EFdiS1AsCGuy7hT16XdQePRnhPtOdrp8maJ9aDQrP7hd3oIV5zp
MsQy6VZ1eHKwOGM6xO/Y6h+xz4LzlscCaW74otv7/VR/lxvSp7BMfRIdkEuHA/LoOCY6nBEUvLmc
jJV2R4CgmbbO/FwShQ0h910OH+RoggNyqXVALrUUTI+EG380kwpsWMKk8nIynl8uIZiC4JGAKxAj
IegBXHIaiRhVT8Btn7ps8EFV+thqetkPa3INFV5DyaDXkI8ko3fgOwWRqAYtLRwF3Q5Ym1UXm9OQ
MwgWeHFCW+CFnG3NB9XIsEZJNUpfA9Ym28XmkO3qE216RFHr3ToWkNcg2p2IIrigUZclPoD7RqNI
UY2eVtz75W4X3PdlRxD3fdkVFe2lyMMXJCr61kLrhs4W1iLgF9wRbYbI2v/0jQdyXCkX5HDlghya
Jd09nR8fL6eZpVPSHYh5439i0wN16fRAXTo9kEPnPrnI+9LOxX8e4qcqRkvi3QW5gIXMPHfAB3WM
rgfqUueBXOpkTtQdIHUrV0SFzAlX5W2g+aAu3S7IIc4FucQdoOgO0/2OG3OL+Crktk4Lb23pg7ri
c0EOhS7IofCQoj6HL1Jwyd9f6pXzdDp5X8w7BHapqClGU5d+XMQDuU29yKip47apN9PhR91Q8G6m
bm22zAi3HyPwQG6zbR/AMDud/HRrS63Aml5LLshp6YgGyjFE0Lq87U8V7/cr0u2mFybzQF0yPJBD
xjGFyY73+WnjNuvSUHCrKSCxqSkiepB4W7W31e3an9vqdnX2trouxy+I4xc2Oczu95bWP3wzVTMT
w7KBBze9pJuf1ZTUXAmpS00ZRvgg9L4bu7ouPqjxQYQ1cAWtf1Q+NkjtaUq4TlqXIZYRlhLLBFFI
71b024jv2rimFN7m2vrsuNgexE5Xt9cnyMX2III8/cJspeNDzN4x32lidGtJHL8pY+KoxMZr5KiG
hK6mphp1hg9w4dbUla9/dUN1G+87ShqdChy0Ta9/1iXFweaS4sp93YYcbG5Dbu+QH6V/mN75QzEd
Qp+cqZGqlkaqG/J59A/P8noghxIX5FEiiBLhptD+UIwayJ1dQoogpCLySXFALikOyCMlIlIkPwks
z7VrFJlavMC+UfhpZv3DWwHeWtdhZXVdx/7fUtdjlsbnkT0kcXZVjEaWQVCGZakjjSINVLCD2ZhL
m+BBgq3iyR/9o/Q5v+/Ljiju+bIrm3u+7AkrJWHdYswWu1LdkyWNahpfjCnRA58GaBRuReu6vv25
pa6r36vrumzR7sjx8RG42qPmp2E9v7QRl+Ob0Qj+WuEDNBj3bhpIi20aSQ/Mxwm7n2Bq6Oir/uGl
aTf0ifgGT+Q3dCK/aeDbIros6AEYvqamGrVv7OkAlP5RwQNFLcMN/Q0dfdI/vEMbHgOO9i6oHCAN
ITUEmxNaCiU+wJnTHK6DB0nsY1tNVDfH2RGzpxxri87Fdk/RdZdTmseEmMWGUqItB4e0KVYQ62Nb
RXaPWG8YNMmaUnGx9aXSFYJjaBb9kQx6EuxnKjr6ZjMQbWf3MhXdkbZHb/bO1jijbPnZmmPadzyG
Fd7ZtaqG3fW/Y77MmT3A2ZT+WGtQIk3t67cDcZSsC3EF3YU4BIcDiuyZL9nbzNpRHZzMi9GyD1AO
KDqmf+EncQbtt1T1L//Tf3eo73yPsgd0vhN/OzKfvahlz3of30/ml8tZi1pUfiJwD+gR7WcH9+p7
dLVfYx1IS9ehnvOmas5OB1Tb/sJvnekfGT3q3aRzh/rOhSk+0Lnbw0XmS+X2llyp3F6/d5bcrQCn
Vy2e/vFVD/1e+3rv+qhDipDoX5Bk9Onv2jsbjlXw8mbWTYnhdaWmsIf+1XhzUB/YFZkPdOTjAz2i
w5Zo2IVaRqrz1cY6TCPEGab+N+XrsG0QDweZH0VbXxCKkh7Vtc/tahT4tSf9Y/HI/+huHeJH4PQP
qp5VVB2/yaZ/KIcIR6oP4sOV/YNQeD3UjuvDtH+MpZv9v/KwYFi3ilxL/PCW/pHQo7zCR7miH00P
QyHoR0w/EvqRE6aCMLWylWXeQ4V3BOkfNdXCD0jpH9QMfr5O/8DP7+lVdeyjigdpCyzoESGN8ats
+kfSPvIvKNOPiNQYP8qof5TtI5RITDez6F/+jWn6UUI/qH9j/PKZ/oHXnNQJfiRQ/8joUTXwcSVV
W79GjpKadDdp6FFDj+y3iV0Uactuit+A0z/aR/hptjql633q1HwZzUORtkD8dJn+QbylBT0q2keV
6KGoZAv0Pxn6IH30MKyjjx6qdfTRRfUgffRQPEQfPRQP1Uemp9KKyLGZtc5EX8uQ8MuIxCPVip5N
/JvaapmJttvbbkgWnbWqi3q4VnSWxJvYajquZHrG/ySqI/zUF1iMnzOt46ztv7wnk7hs8eONVnVM
H0WvE7y8r05E2w2R/x3OOmkFliRIddKOvkW3dS1FD8XCZuC3N12b0bMUvc/k3mIz8OOxrqXooVjY
DPy4qmszWEvhTuVJReTjvXGaj5KoJxoi+uFH8Yxxo4bxA7CaAvpRRZ5z2rVLIaleRNRJvCdPqzEN
GJmFPRSc9Vphs3rvr7Ze9GLdEqr875xqxSZDg59XvtUu9TB0LRQZoYx+cGaph6FroO5glhJSzjiL
e7iKFhcZhJg+jK4HF/ZKMminVdHrlSRqxwNpbtJqbkKq4c3MHgrVjjeahtOwHVLtTNuO3bT3wdE6
zdvBUvhfinzQnOhhWGdO9FCtMye6qB40J3ooHjIneijWmhNdXN6c6Lr9D+lGD8M63eihWqcbXVQP
6kYPxUO60UOxVje6uLxudFP+B+39VPvJ4Z0yr5acdRm0tycVSe0fX/eB3ayCHtBJ/feB3oGF9szT
8X54W67ErQdKmvbsUlOE3lK5B3RY8IHu6QUP2Ms5ARb0L5vBc16850MSJmckxB8YvdO/emk6xy3G
Y4qnLo4CTT/1slqW7Xm3km+YqKkPdAKnPtAL4rX0hYO7EchrXIvI/OyTyIDdmJoPPhnX6ue9YHZZ
TNXuaFIVI7VbzT9dq101vnh39vTd+fFO9nQ2rR49X//fo7cHZ0EzHKm9YPdycqVb+jjbfaXmL84O
d3UTu7dTsf3x0dScXFcfzf70VBd2dIZPo0f1sGmCnZtgZ6r/Cnzqd3Z27sDkhnY6f3czCvQAFEEY
7cnBnjlyaoS2YdrY2tq6Cxbt/u/fvDdYZDAI96LBnonvGiyPvvsu2Am3ZbAVbsfBd989Cna/3vgt
iGDPJ3r7o2HMErM7SHc1bS1Jf7sZf5rcaBEc/Xwd/HbD6IlBdDxVymLanarryVUx3p3ujo2QF9K9
+oCku82EltrdQbRrPiic7YVS/xfM/zZdtBAYYh8FRp/NqwHgCeYmJ9DerfX2ZqyCU/vU8ilEmm5H
wZYus21zOsHwu3SDIli6QRF83qD4vEGxqv7nDYrPGxTw6PMGxecNis8bFJ83KD5vUHzeoPi8QYGP
Pm9QfN6gWGazPm9QwNj6vEHxeYOCNO7zBsWDu/HzBsWKbvy8QfF5g+LzBsU9Nyj+H/YLgnhgnQEA


--Multipart_Sun_Sep_26_02:42:25_2004-1--