diff --git a/include/pcp/key.h b/include/pcp/key.h index 0846e9d..cc4e372 100644 --- a/include/pcp/key.h +++ b/include/pcp/key.h @@ -100,10 +100,10 @@ struct _pcp_pubkey_t { char owner[255]; char mail[255]; char id[17]; + uint8_t type; uint64_t ctime; uint32_t version; uint32_t serial; - uint8_t type; UT_hash_handle hh; }; diff --git a/libpcp/key.c b/libpcp/key.c index 9867fbd..c8e0f78 100644 --- a/libpcp/key.c +++ b/libpcp/key.c @@ -199,7 +199,8 @@ pcp_pubkey_t *pcpkey_pub_from_secret(pcp_key_t *key) { memcpy(pub->id, key->id, 17); pub->version = key->version; pub->type = PCP_KEY_TYPE_PUBLIC; - pub->ctime = key->ctime; + pub->ctime = key->ctime; + pub->serial = key->serial; return pub; } diff --git a/libpcp/vault.c b/libpcp/vault.c index 1b2ffb8..0db3154 100644 --- a/libpcp/vault.c +++ b/libpcp/vault.c @@ -161,6 +161,7 @@ int pcpvault_addkey(vault_t *vault, void *item, uint8_t type) { saveitem = ucmalloc(sizeof(pcp_pubkey_t)); memcpy(saveitem, item, sizeof(pcp_pubkey_t)); pubkey2be((pcp_pubkey_t *)item); + //pcp_dumppubkey((pcp_pubkey_t *)saveitem); } else { itemsize = PCP_RAW_KEYSIZE; @@ -171,6 +172,10 @@ int pcpvault_addkey(vault_t *vault, void *item, uint8_t type) { void *blob = pcp_keyblob(item, type); + // scip + //printf("BLOB (%d):\n", (int)itemsize); + //pcpprint_bin(stdout, saveitem, itemsize); printf("\n"); + if(tmp != NULL) { if(pcpvault_copy(vault, tmp) != 0) goto errak1; @@ -277,13 +282,15 @@ unsigned char *pcpvault_create_checksum(vault_t *vault) { pcp_pubkey_t *p = NULL; pcphash_iteratepub(p) { + //pcp_dumppubkey(p); pubkey2be(p); memcpy(&data[datapos], p, PCP_RAW_PUBKEYSIZE); pubkey2native(p); datapos += PCP_RAW_PUBKEYSIZE; } - //printf("DATA (%d) (s: %d, p: %d): ", (int)datasize, numskeys, numpkeys); + // scip + //printf("DATA (%d) (s: %d, p: %d):\n", (int)datasize, numskeys, numpkeys); //pcpprint_bin(stdout, data, datasize); printf("\n"); crypto_hash_sha256(checksum, data, datasize); diff --git a/src/keymgmt.c b/src/keymgmt.c index 7ffeb76..6dc4dee 100644 --- a/src/keymgmt.c +++ b/src/keymgmt.c @@ -246,6 +246,9 @@ void pcp_exportsecretkey(pcp_key_t *key, char *outfile) { pcp_dumpkey(key); else pcpkey_print(key, out); + // scip + //printf("EXPORT:\n"); + // pcpprint_bin(stdout, key, PCP_RAW_KEYSIZE); printf("\n"); } } @@ -335,6 +338,9 @@ void pcp_exportpublic(char *keyid, char *recipient, char *passwd, char *outfile) } if(out != NULL) { + // scip + //printf("EXPORT:\n"); + //pcpprint_bin(stdout, key, PCP_RAW_PUBKEYSIZE); printf("\n"); pcppubkey_print(key, out); fprintf(stderr, "public key exported.\n"); } @@ -414,7 +420,7 @@ int pcp_importpublic (vault_t *vault, FILE *in) { } if(clen != PCP_RAW_PUBKEYSIZE) { - fatal("Error: decoded input didn't result to a proper sized key!\n", clen); + fatal("Error: decoded input didn't result to a proper sized key (got %d, expected %d)!\n", clen, PCP_RAW_PUBKEYSIZE); free(z85decoded); return 1; } diff --git a/tests/bart.pub b/tests/bart.pub index 06d4913..f8273b4 100644 --- a/tests/bart.pub +++ b/tests/bart.pub @@ -3,33 +3,33 @@ Cipher: CURVE25519-ED25519-SALSA20-POLY1305 Owner: Bart Mail: bart@local - Key-ID: 0x5038DB2889942E86 - Public-Key: 14vvqWi-tUP2:MCB8E:$53nW3JRzzE}Ypz](ku(JC(N*A - Creation Time: 2013-11-18T21:36:22 - Checksum: 02:0C:DA:7D:8C:FC:91:BE:52:0C:6B:12:A0:52:5C:3D - BB:44:0E:C3:E5:6D:FB:EF:B1:15:45:6D:48:5B:7B:7B - Serial Number: 0xD84BE474 + Key-ID: 0x7AEFC16D88E43C2B + Public-Key: 1e2fw+W4a9:aMM[Z0fQ)4Vn!i}+SRl75j-AHe?mf2MK&8 + Creation Time: 2013-11-19T09:54:59 + Checksum: 55:DC:88:01:EE:69:EA:C5:02:B6:A8:22:36:50:A1:CC + EB:73:3E:EC:2D:74:FC:D9:B2:10:D3:B5:D9:16:72:32 + Serial Number: 0x91FEE742 Key Version: 0x00000004 Random Art ID: +----------------+ - | ..o.o+| - | . o ..=| - | + . o | - | o . | - | o . | - | o | | | | | + | | + | o| + | . o .o.| + | . o*.. | + | =..+ | + | +o | +----------------+ -14vvqWi-tUP2:MCB8E:$53nW3JRzzE}Ypz](ku(JD5eDiD(sd1g]?ntCT:EOG44zo3pCXa[ -VuUU.RtW%xNT08Elb0^ -n/Na-[P?m5L.-(ti}#)YdqRM66TG0iPx@KX6VU&TH1.XUCI&^Dj2W}3b4UIIl?jc0?n[1A= -?h#kY[k}}doDp4s=IHG=^0pEUkt(.-JMh7@uGadO8]>R0vQTq0kX$vGvqC}[ugqW/o-S#M2 -kH!v[^2+vp8DkEiJx!O/o5c>2g7cKj9Q9^Qv(1R*Tq0Ne1r -k:H9n9 -tS)?H4//j-:Q321G.Tn%^e?J/@w}:@]y$33!SalNQ+e8(OXA-EAyhA5Ay3?JANnIMvskt.{KaJoNwHTHep%D2F -Dk9u)?CZ.lf3oACxnaseq+#cXwmxVJnT*84.L[5OLiq7JQTA:&U[p.d5Y}g]Pb:EA*0TzS3dbD +@!Z-l>ahp2fW!JLt=TVm7Pcf.arNYOK[bqdNQUe4J8>D6B/?P(CQ[>&^:ZNxHf22 +bVe>-IO?]/mQy2cOOZJjZTIW!CdX-NbXKsK+pmxm.y<:-ArM]@&c/wHBCX[s +KYObJC34eS+tPTc:Kiu%)!N)G6(9dA^W4NasM9Ks<0q>?vQTq0kX$vGvqC]z-v<%rEB.&ny +P:=z)T>0!ruz&gJX.h&+{MH>@XO2WPj[kd:]c&aKAaK]upf*v)QHy]OjPQ$WwvI^5W2TnRCyG +sGO4TEK8tLXrW!uNi?DG/jL5le<:ib:acObU.ukvS/@.]Kqf4i(ktCy*saPQsfoT=3Cx@be +e3U9$)IN37k$amgf/zAVi7kUWlOZ$d0@@r308!.5v/MGe1D&YDli3#= ------ END PCP PUBLICKEY ------ diff --git a/tests/key-alicia-pub b/tests/key-alicia-pub index 0f22a4c..5ee46ad 100644 --- a/tests/key-alicia-pub +++ b/tests/key-alicia-pub @@ -3,33 +3,33 @@ Cipher: CURVE25519-ED25519-SALSA20-POLY1305 Owner: Alicia Mail: alicia@local - Key-ID: 0x6494DC65B785F33A - Public-Key: 1kwxk+d&8&L4Pk&7ny7.X]d9j}297{2hc+L{3i]ViSGcW - Creation Time: 2013-11-18T21:36:21 - Checksum: CC:62:16:89:3E:B4:F8:DB:FD:D1:B0:27:06:8C:25:FA - 37:FC:57:84:D8:CB:59:55:BF:F4:AE:C6:CE:E4:09:80 - Serial Number: 0x76DDB355 + Key-ID: 0x7BDF786564A94A60 + Public-Key: 1d10ok&9wTrr(Qb7}b$E3%Xzt0oCfQ)6Q$byko!{iSGcW + Creation Time: 2013-11-19T09:54:59 + Checksum: C0:18:A5:2A:A4:55:D0:CB:EA:7C:83:5E:D0:54:40:79 + FB:0C:06:5D:18:CA:5B:03:E5:C7:96:7A:B8:50:01:33 + Serial Number: 0x96DA9F38 Key Version: 0x00000004 Random Art ID: +----------------+ + | ..o...... | + | o . o | + | o o | + | . . | + | * . | + | . + . | + | . | | | - | | - | | - | . | - | o o | - | o = .o.. | - | = ..o+ | - | .o. .. | +----------------+ -1kwxk+d&8&L4Pk&7ny7.X]d9j}297{2hc+L{3i]Vi&8n{?]HDi}%RP9!#G%5*yUq=5h8Q@6rFEM&Lh8xPu&[t0.-0d!RY3$6wNU*Cj*F>*eJNoG!GQZno2? -yA}9:]n!KX!EmP%lJx)(n60+RutFaapaRE[&H31F*?(A>@I64AX92@WWA:.V2N>kLNppf#F -CQaNG/Q$q{WLglM)fv}Y{dedr*8E(7=5VY{^62z{?=.B-Gb5OLvqGT/x<{@0}A8dl!eO?R{M4y3]n.lPcsEBA+]RWIW%m)A] -h96}A@Ce4T7EM]a!QN2O>g6Z-^7t*1zJ$?lhI$6WR^L3BOAkVCb0H7b/:S.kRjySo:5NSGB -dVH:W2mthYL62xa!GN]aDj.cqtKC&pOzy#MH06W-5VV>IFK)sFN-i)1B{E-UK-DFO.#*/}f -6!Hy(aQp9dc84{.4CBeO@2jxGPDhQpNJ%#@5({NFA6rws3B5lZT/E@aYtS^]sK[v2Qd6bt5 -1wed6hxBIfg=WxXlPc!*h-JV:gC.q%X=qZg08!Y2mf0q/1A@RcrrBaN7iZGEK]LEZ +1d10ok&9wTrr(Qb7}b$E3%Xzt0oCfQ)6Q$byko!{i)2/AJJ=bY7!p$vpJ7^aTd7dB1GOYNR +/on#Dp{rWjZZ>Fz*LLy$R.o +oV5/L9*Z=0i!C0S2[qh.mR^mgmQ&)![&<+&%vyM^JI{sd^{Gj5FkdqQ?ZMz=?X}&r[.2rcHd&4UhkuyBwEC=V{$JaWa>M-fSHlfliGBuweJ[trfsi!ZbLh]. +Kh@hc77XVWHvax<3>V=a!}&^fxKsegwbDH+Xml[g:lze?jDLh>>&LFbykFXJc%y(+5-@]:y+6Htc>T02)oy^pF)V&RA1=EWRXBv-eQF-rh)68A1fs +d2##CpoN5e=L4X47G6SZ?D3C&OC -YBS?wmaOJF#4[=?]HDi}%RP9!#G%5*yUq=5h(TMyANxy..5q#3=c6smOKIb0UuNdUJ^+)m(v6{+8 -vyDH:ULXJya{&1Kk)z/M[4oGb%$*VzhKfeqv{+Ea*1x%QE]iKX7-q5IB]0N7ydigVuI&]Lv -iL*.?)hre]d@Rq[[c&g*$tizsodvz$]ebv!lTko%51)AR2@xUmlv}/uKv?z2YZ$=n8]R0(P -y2Cz1IZnP2.=l&VbG(fbPbq!Z.*ZPyJ$qHrH/IOJiR.jlSF1o]g4nq*>8Q@6rFEM&Lh8xPu -&[t0.-0d!RY3$6wNU*Cj*F>*eJNoG!GQZno2?yA}9:]n!KX!EmP%lJx)(n60+RutFaapaRE -[&H31F*?(A>@I64AX92@WWA:.V2N>kLNppf#FCQaNG/Q$q{WLglM)fv}Y{dedr*8E(7=5VY{^62z -{?=.B-Gb5OLvqGT/x<{@ -0}A8dl!eO?R{M4y3]n.lPcsEBA+]RWIW%m)A]h96}A@Ce4T7EM]a!QN2O>g6Z-^7t*1zJ$? -lhI$6WR^L3BOAkVCb0H7b/:S.kRjySo:5NSGBdVH:W2mthYL62xa!GN]aDj.cqtKC&pOzy# -MH06W-5VV>IFK)sFN-i)1B{E-UK-DFO.#*/}f6!Hy(aQp9dc84{.4CBeO@2jxGPDhQpNJ%# -@5({NFA6rws3B5lZT/E@aYtS^]sK[v2Qd6bt51wed6hxBIfg=WxXlPc!*h-JV:gC.q%0rr9 -108!Y2mf0q/1tTjQn=O?> +1d10ok&9wTrr(Qb7}b$E3%Xzt0oCfQ)6Q$byko!{iSN>e40u+@Y+LkP!yO?I([uuJveWh-y +sA![o?0&+I]<rWjZZ>Fz*LLy$R.ooV5/L9*Z=0i!C0S2[qh.mR^mgmQ&)![&<+ +&%vyM^JI +{sd^{Gj5FkdqQ?ZMz=?X}&r[.2rcHd&4UhkuyBwEC +=V{$JaWa>M-fSHlfliGBuweJ[trfsi!ZbLh].Kh@hc77XVWHvax<3>V=a!}&^fxKsegwbDH ++Xml[g:lze?jDLh>>&LFbykFXJc%y(+5-@]:y+6Htc +>T02)oy^pF)V&RA1=EWRXBv-eQF-rh)68A1fs%pR(p1:b*Ezo!d=%zvt]T1]$T# -(6=PO-RnSd4MrRm(&]CZnSlQbb}=ONqIudARgqtoiv7dHwCe6.bdVz7ma* -4slrL6835izT4*ZfKR1c{44?(5WT6eZnYQAX-yQ.5xU-hvSbZ+C%Dg:v{%fNg[RLGsahQ48 -U.012]G*{@+[UeZUQP?x:h:e)y2AINJw%CrgMUh}&f*=H/bJfJ)CgiqwB$<<$+i2h97zZ!: -xaVmXlFmw)Xzh23MOa}Gs>Vwfqv()U&)K-[vkaYA+QhC{#J@xj@GmnBvl/HtmC:Ea0Nh7&5 -vV5wZK(Uz](0{R)qgcaF/}b4GrInh3u4*JeLG}YEL(bw!@0FbRcAq6U30(!&1EQRffnh^XI --a7#l(OwpLt?5Mxg]w81=qQzSY-PORekTdVYOCRzg@DT2mot^baTtlad/#!r*L4ZwaGYyH5 -U.B@8dw1puk$i*Vi5roCgC?M3f8$$L08!Y2mGrz*1DT1:uiv7:.[99!zVx+q +0#1e35=WR)p92aZYm/h$byX2/UCCE[rqXzSe/:L.bej(AY9}pIWv4P#w/%ei]HbEQ$HCyIcqF&bN*x7<)>ND0FsZUUj^LH +sum?.7wI)=R>}I1IB)G]1j-S(/Ds$4lYo8%*N8JvmTM@Z]HZh?QPULNUoa[k}O8fvSbZ+C%Dg:v{%fN{]pZsiv-g@: +.j4zL99S&M}l2jb/]Yk8xk/5X7y@Hj{BjPUq15l[t[B&sh){^4d+^c8XalUGG-SKASh1lm5 +H}ziJXTF:-SH[ih.TiqHCj62N&JD5kfgLe8rFsjNFuEKyQhfLDn6pVS34SooYD#1xFRX{HwWYF*@ElqhnZ>BzO +U!#K:((j!Jmme:{mNGg8fHW=Sg=mh(0@@r308!.5v/MGe1OjolqucW% ------ END PCP PUBLICKEY ------ diff --git a/tests/key-bobby-sec b/tests/key-bobby-sec index 2f4927a..c4cc114 100644 --- a/tests/key-bobby-sec +++ b/tests/key-bobby-sec @@ -1,24 +1,24 @@ ----- BEGIN PCP SECRET KEY ----- Generated by: Pretty Curved Privacy Version 0.1.5 Cipher: CURVE25519-ED25519-SALSA20-POLY1305 - Key-ID: 0xAAF84B782831434F - Creation Time: 2013-11-18T21:36:22 - Serial Number: 0x9FE8C4BE + Key-ID: 0xFEC0AFC9E0E38457 + Creation Time: 2013-11-19T09:54:59 + Serial Number: 0xF32F4352 Key Version: 0x00000004 -1co+[V0TNaBx$N]iyAE/QpW1y].?KhZ?k=:n6CL^i@?ngJfYLs*#>#NX$WrU(k:pmIV)H7s -VjRhiUCebZC*c[kPSo0:0Z-ZWOCNr+B6.{B&1owE[V1bZ-][oZw}Hb:PCUjGz1}.gR0G>XG -ZpDJSBb2y$drg4pLT9u)E/SZ9zQP3XbyqEpq%4^#PJFf/x{i9DX%31ts9Kgo}1::%2NYt8j -wDsh&)Hk}CWHXVbL$ognZaFoz$9UPjKP^ip^YY@B@7++((FUvaqCRp>OW>hWIzM^Bk&yk%Q -&bmO.fF0%pR(p1:b*Ezo!d=%zvt]T1]$T#(6=PO-RnSd4MrRm(&]CZn -SlQbb}=ONqIudARgqtoiv7dHwCe6.bdVz7ma*4slrL6835izT4*ZfKR1c{44?(5WT6eZnYQ -AX-yQ.5xU-hvSbZ+C%Dg:v{%fNg[RLGsahQ48U.012]G*{@+[UeZUQP?x:h:e)y2AINJw%C -rgMUh}&f*=H/bJfJ)CgiqwB$<<$+i2h97zZ!:xaVmXlFmw)Xzh23MOa}Gs>Vwfqv()U&)K- -[vkaYA+QhC{#J@xj@GmnBvl/HtmC:Ea0Nh7&5vV5wZK(Uz](0{R)qgcaF/}b4GrInh3u4*J -eLG}YEL(bw!@0FbRcAq6U30(!&1EQRffnh^XI-a7#l(OwpLt?5Mxg]w81=qQzSY-PORekTd -VYOCRzg@DT2mot^baTtlad/#!r*L4ZwaGYyH5U.B@8dw1puk$i*Vi5roCgC?M30SSi -208!Y2mGrz*1Fs[@Z5Ock +0#1e35=WR)p92aZYm/h$byX2/UCCE[rqXzSe/:L.a])M(*Z#nGM3zR%pjJX:[=CXgt[h]{B +!jK4C+9/ct!.39Y9}pIWv4]8t-l/O%m(nF#wtlMbGbP!j/?cqDzz3/$HIL5b[KKBKe4lyPH5jyy3a2hnSt +CP2:BHc[j>T}$h3KRXkK#M/+v>qAEN0}N7t%1eM4cgp64j[J}e6vTd%87&wSL:C=w[JA0u{ +U5rBeScCR1n61U%?Q9&gxmkeH-{ag]=IR<3ARQg-&*aqFb4mMOiXGoBP#w/ +%ei]HbEQ$HCyIcqF&bN*x7<)>ND0FsZUUj^LHsum?.7wI)=R>}I1IB)G]1j-S(/Ds$4lYo8 +%*N8JvmTM@Z]HZh?QPU +LNUoa[k}O8fvSbZ+C%Dg:v{%fN{]pZsiv-g@:.j4zL99S&M}l2jb/]Yk8xk/5X7y@Hj{BjP +Uq15l[t[B&sh){^4d+^c8XalUGG-SKASh1lm5H}ziJXTF:-SH[ih.Tiq +HCj62N&JD5kfgLe8rFsjNFuEKyQhfLDn6pVS34SooYD#1xFRX{HwWYF*@ElqhnZ>BzOU!#K:((j!Jmme:{mNGg8fHW=Sg=mh(0SSi +208!.5v/MGe1OjolqucW% ------ END PCP SECRET KEY ------ diff --git a/tests/keys.cfg b/tests/keys.cfg index 06fb19b..7d7e367 100644 --- a/tests/keys.cfg +++ b/tests/keys.cfg @@ -1,6 +1,6 @@ -bartid = 0x5038DB2889942E86 -bartserial = 0xD84BE474 -idbobby = 0xAAF84B782831434F -idalicia = 0x6494DC65B785F33A +bartid = 0x7AEFC16D88E43C2B +bartserial = 0x91FEE742 +idbobby = 0xFEC0AFC9E0E38457 +idalicia = 0x7BDF786564A94A60 mailbobby = bobby@local mailalicia = alicia@local diff --git a/tests/unknown1 b/tests/unknown1 index 9066b50..7cfc206 100644 --- a/tests/unknown1 +++ b/tests/unknown1 @@ -1,11 +1,11 @@ -1hv[h(cF<1&n-@rc/*XVY+IH!(51i<7U))yEo&jZDMdA8D)e1m6sISL{DMf&KyMPH8sMJ6MWFNaE>PDtGZZ-7nmBP0]G/u!zSX>>B[Jyo<3.5ft%v[ocNz -w]G})*Y<]fc^]<1:*Ed!qkGnXS$qd9ubBaR)%!^jDL7{SH.iFRc7Gif*xU$T^/MfOs[rX]Z9=PngVNOHzz -3*T@vb5VxRttwp--hUz-B9pc#*Hm[Bhw7-#Xfz.K]?UIXeG[A1P#br>kO{Lzp -80iQLFU!SQQeqspa72t2[5JxXj-}W!lJ*v.89pLi*Ncm!mEJDU@ABW]MdqUH#x5QT6%&-xJ^K9%Fh.FQjWPBFYS(DJJLLnNVYJ?/&&#IitIYm>L^U[PQoWmcVqk6p +tIf-F:1SJX{%fp}1AG!rp.}YO2WxCg5$ogL-d:Ft.a[030WFR/?.10JpCDEGO.{C*QOC?Sl +^)KkvlGN6sj>]tUcY?T=oJmd>>ZQ(lladd=t1h6GW1(q?]qmr4{O4sSq/XD)e1m6sISL{DMf&KyMPH8s^Gg/N)(%!vii?X=Aj3B(+oC$PREbK*D57YXjX -Sw@9:TuP%Pf#Z(do$ptL8a!D(7{4A4KFR)r1Eb[FyEd&M7+4V!rxGGw[eftE#KK>n!!bOS$ -MJ6MWFNaE>PDtG -ZZ-7nmBP0]G/u!zSX>>B[Jyo<3.5ft%v[ocNzw]G})*Y<]fc^]<1:*Ed!qkGnXS$qd9ubBaR)%!^jDL7{S -H.iFRc7Gif*xU$T^/MfOs[rX]Z9=PngVNOHzz3*T@vb5VxRttwp--hUz-B9pc#*Hm[Bhw -7-#Xfz.K]?UIXeG[A1P#br>kO{Lzp80iQLFU!SQQeqspa72t2[5EiLe3XC2+ZEXP$^.LcU[T6m5J1&Xn.Lq +kCg%Rf7uQj}37$dDZ{Hdt!rYCIKU2PiLopVHGX-jEYVwKWf/Eaz!^^LJxXj-}W!lJ*v.89pLi*Ncm!mE +JDU@ABW]MdqUH# +x5QT6%&-xJ^K9%Fh.FQjWPBFYS( +DJJLLnNVYJ?/&&#IitIYm>L^U[PQoWmcVqk6ptIf-F:1SJX{%fp}1AG!rp.}YO2WxCg5$og +L-d:Ft.a[030WFR/?.10JpCDEGO.{C*QOC?Sl^)KkvlGN6sj>]tUcY?T=oJmd>>ZQ(lladd +=t1h6GW1(q?]qmrt111{MfEM4H9(3Z^vKYtQ%q}XCapcW[efNF@gJd@V?qZJ?10@/4-bEnW:Zwzg^xtHLxVPRE{rV/ +0yzGIvaO]*=f%2j{IN3RyjMVfDkqOCCWa%iGKjQA4svdGG=bZ$PTcEbuuu9g}o#Q3< -vFm>a}M)G(WXDIg!fAVpaD39Wrqo)Y0@MOa6QR?UDBT.x)X?$9n?Ic1onA4000000000000 +12&LmmMip+h8WoSiw:2WfAq7M000000000008!.5wb(Pf0yj1r?y^{}ZAt{nLMo443Ht[22 ++B]Zw9l8C8u&*uVXnJ>]pFu>N95pAc<).Ll5X12&Gj%0UH3rJE]GES2lj-7000000000000 000000000000000000000000000000000