From fbc454d060cf2642601875dbf04e35191835d7b0 Mon Sep 17 00:00:00 2001 From: Luigi Pinca Date: Thu, 14 Jun 2012 23:16:15 +0200 Subject: [PATCH] added leaderboard --- app.js | 5 +- lib/room.js | 12 +- lib/stats.js | 2 + package.json | 2 +- public/static/css/style.css | 50 ++++++-- public/static/images/logo.png | Bin 3546 -> 0 bytes public/static/images/sprites.png | Bin 10180 -> 16368 bytes routes/site.js | 27 ++--- routes/user.js | 189 ++++++++++++++++++++----------- views/index.jade | 4 + views/leaderboard.jade | 46 ++++++++ views/room.jade | 4 + 12 files changed, 241 insertions(+), 100 deletions(-) delete mode 100644 public/static/images/logo.png create mode 100644 views/leaderboard.jade diff --git a/app.js b/app.js index bca2c84..c47b4ef 100644 --- a/app.js +++ b/app.js @@ -60,11 +60,12 @@ user.use({db:usersdb}); app.get('/', site.index); app.get('/artworks', site.artworks); -app.get('/signup', site.signup); -app.post('/signup', user.validateSignUp, user.userExists, user.emailExists, user.createAccount); +app.get('/leaderboard', user.leaderboard); app.get('/login', site.login); app.post('/login', user.validateLogin, user.checkUser, user.authenticate); app.get('/logout', user.logout); +app.get('/signup', site.signup); +app.post('/signup', user.validateSignUp, user.userExists, user.emailExists, user.createAccount); app.get('/:room', site.room); app.get('/user/*', user.profile); diff --git a/lib/room.js b/lib/room.js index b096b19..52dea95 100644 --- a/lib/room.js +++ b/lib/room.js @@ -300,13 +300,13 @@ module.exports = function(params) { // Extract a random track from the database and send the load event var sendLoadTrack = function() { songsdb.srandmember(roomname, function(err, res) { - songsdb.hmget(res, 'artistName', 'trackName', 'collectionName', 'previewUrl', + // Check if extracted track is in the list of already played tracks + if (playedtracks.indexOf(res) !== -1) { + return sendLoadTrack(); + } + playedtracks.push(res); + songsdb.hmget('song:'+res, 'artistName', 'trackName', 'collectionName', 'previewUrl', 'artworkUrl60', 'trackViewUrl', function(e, replies) { - // Check if extracted track is in the list of already played tracks - if (playedtracks.indexOf(res) !== -1) { - return sendLoadTrack(); - } - playedtracks.push(res); artistName = replies[0]; artistlcase = artistName.toLowerCase(); trackName = replies[1]; diff --git a/lib/stats.js b/lib/stats.js index c526893..a402005 100644 --- a/lib/stats.js +++ b/lib/stats.js @@ -9,6 +9,8 @@ module.exports = function(db) { if (stats.points) { // Update total points db.hincrby(key, 'totpoints', stats.points); + // Update the score of the member in the sorted set + db.zincrby('users', stats.points, username); } if (stats.userscore) { // Set personal best diff --git a/package.json b/package.json index 1893bc8..2f33062 100644 --- a/package.json +++ b/package.json @@ -17,5 +17,5 @@ "engines": { "node": "0.6.x" }, - "version": "0.3.1-2" + "version": "0.3.1-3" } \ No newline at end of file diff --git a/public/static/css/style.css b/public/static/css/style.css index 935c986..e7a876f 100644 --- a/public/static/css/style.css +++ b/public/static/css/style.css @@ -24,7 +24,7 @@ section { height: 34px; padding-left: 68px; line-height: 40px; - background: url('/static/images/logo.png') no-repeat 0px -54px; + background: url('/static/images/sprites.png') no-repeat 0px -182px; font-size: 25px; } .page-header .logo { @@ -32,13 +32,13 @@ section { height: 54px; padding-left: 109px; line-height: 68px; - background: url('/static/images/logo.png') no-repeat 0 0; + background: url('/static/images/sprites.png') no-repeat 0px -128px; font-size: 34px; color: #0088CC; } .navbar .navbar-text { line-height:19px; - padding: 10px 10px 11px; + padding: 9px 10px 11px; } .form-horizontal .control-group { margin-bottom: 10px; @@ -105,32 +105,62 @@ input { width: 70px; height: 70px; } +.highscores, .profile { + font-weight: bold; +} .profile { font-size: 24px; - font-weight: bold; line-height: 32px; } +.highscores { + font-size: 20px; + line-height: 45px; +} .profile .img { width: 32px; height: 32px; - float: left; margin-right: 5px; background: url('/static/images/sprites.png') no-repeat 0px -56px; } -.stats { +.highscores .img { + width: 80px; + height: 45px; + margin-right:5px; + background: url('/static/images/sprites.png') no-repeat 0px -216px; +} +.leaderboard-wrapper, .stats { border: 1px solid #ccc; border-left: 0; margin-top:8px; } -.stats td { +.leaderboard-wrapper { + height: 349px; + overflow: auto; + margin-bottom:18px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.leaderboard { + margin:0; + border:0; +} +.leaderboard td, .stats td { border-left: 1px solid #ccc; border-top: 1px solid #ccc; vertical-align: middle; } -.stats tbody tr:nth-child(odd) td { +.leaderboard td [class^="icon-"] { + vertical-align: top; + margin-top: 2px; +} +.leaderboard tr:first-child td { + border-top: 0; +} +.leaderboard tbody tr:nth-child(odd) td, .stats tbody tr:nth-child(odd) td { background-color: #ddd; } -.stats tbody tr:hover td { +.leaderboard tbody tr:hover td, .stats tbody tr:hover td { background-color: #dadada; } .room { @@ -555,7 +585,7 @@ input { background: -ms-linear-gradient(center top , #FBFBFB, #F5F5F5); background: linear-gradient(center top , #FBFBFB, #F5F5F5); } -.registered, #users .name, #users .points, .round-rank, .round-points, #users .guess-time, #tracks img.artwork, #tracks .info, #copy, #facebook-button, #twitter-button, #github-button { +.registered, #users .name, #users .points, .round-rank, .round-points, #users .guess-time, #tracks img.artwork, #tracks .info, .highscores .img, .profile .img, #copy, #facebook-button, #twitter-button, #github-button { float:left; } #tracks img.artwork { diff --git a/public/static/images/logo.png b/public/static/images/logo.png deleted file mode 100644 index 2159e70b38172e4e67a5c65d96c90b1ca43920e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3546 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 diff --git a/public/static/images/sprites.png b/public/static/images/sprites.png index 45b1465515dabe2064dd748389b7d081ef5df509..bd671bb1abfd18b3d55aa701fea7027053d2e2e6 100644 GIT binary patch literal 16368 zcmeAS@N?(olHy`uVBq!ia0y~yU`S?QU}WWBV_;zT{xC9)fq{XsILO_JVcj{ImkbOH zY)RhkE)4%caKYZ?lNlHoI14-?iy0WWg+Z8+Vb&Z81_lQ95>H=O_B(8R0wU^xrly(< z3WlDl#!Ure)^ z=6=aTY+Fjqzca@d&s>*2uddGjYH+Ck)yuE8Mz76obZ?kFCGl+klxu$vakThzi(lU` zxh3SZTa5M3s7;w?&mIUoQ1W2*`JA2Sa-ZA(ezW;``lXlg8EgGdrx>LK8%P{6ID6e` z;f1s7_k8kV|No?v+xmxctLx`(F0Q)7na?s?FTT+Gv(bg=c4>Te@6kNJ``tmZ`&*tNiWgaR< zTh^@UiHdi6_3D*`VG_&6h@NN9(q6rOJ-b%H>W94D?;o!+H$Tg-e6uKcc2-*`&sxK1 z%Pq?qLbN<}t~nXqJk)W^#PzUmLz;X?*}uPSJP$G-Sp9#0Q+IZ_;-d2XK`qnHu4YL4 zJwJxiX5!iTe#_I_SkEBH(OYk~S+j0kTr=Bxw$GZ(Rp+bi3;q~KujAhK*?)$? zL0-1z^;4%#735(np9u0mT*X6Hq0S>$j&_TefAEjnzM=U(56j)ANt3ScD>%k!k!$U- zRA^qxk|;^LO>=JMn@z~*^)G$v!~TCu=rqLe0{XrJiu z{?|9ac_4oK{*{``?!Bwwk>L+v7SH=vA@_0z z<0%JC=E)ko-r@`~95OsLd9U7{JM_(Mng9HI2ltn~y~S;wbEBbS!4#&1*VoqW`TOnm zn%Ldjn(Kdkc?mZ2{eyDZ=ZBWQuXo9IYy9*pVYaJI{0_eBg;qb7pPjXT!rz{db^P(W zukO;5(5*~)vU2%_YqOR-yj!_rVM_ukn|@n8J^qx}EESPPlDlvh_)Ub%AR!*Tn6 z6R%ynCjD;57Szo$*YI_|&^Si)rL&=?XbECW$o0WvSch|LJ^qaOL*g>$|f*RNw!7@9BZwnLcc%HwAc2 zJel(2-uHdx+!Y_{|2?lyD>?rEL*(&TzB?TpZU#*ccPSh?oGxq5T~Tmr{{5L7_cv|q zo>lcLzQ1Dx2& z@AyRqPMFrZ*;6f9M6OP#bIONb%=W5Q$6idT-_Q7X<9oj;<_rV_wfAwYJmp_v)|X&PiM@0ZvW*^ee%1eqibR|XHJ)wDld>#mo;xZ zdj5a<_CLq}U+&eZe=DC8yRAn2-z;Udq8IjaPerf4H+^#bex}F&>gCk0-}%RKc6Hk2 zZ7-YWh>P>u&$?u|{KJp6;l-C1dzVjKReN@S{94J}v!4Hop7+|u?34MSoO^b+yW%&~ z|NmIsvOgXC9(Dch4E6iXyLq44J+pUUe{s3|7u%#Kb^pFikKbZ=?rK%~hak}~WnI?ZIyJGiIv@Fgf_0*KRKc1hNxp@!&-);+u z=XO8dZZ41!ZxvU(xly@u;il)47O-YL%y`sHp14iaE}FmP@v5+g7GhkTNefY|7NBzFNAvx}Hmeu3Wn|Ei5eT zTU))j=_(PEEjK%~JH#$j{O|r={_Xd-_eVsfZoMfBHOugM5R-6)rTL(zmu6w?^bjpo zRaI5zhTu;*o7Dt3e1g0>ug&sNQ*Lc--TUzV)@H74$7HvNZF%k4kiC1ywqvC+?^Cm5 zZr^=6Yi;52@YH4tGu9(puUY5ZwmUI@meyRq+Xt4}-0sOckEw zBj&Z4laHlz982lAw#CzkS@QbsV;2uSGh=sN>B!G^z*xTK!@<=I^?zT-UuU#`nY#OY z&8L&<>zQ;SHZ0Kpvs*{%cCua{b04!L`z<52bn!FKCLccc5QN_}-Q1GuWAx9okNI|T z-f<@T83#ES9-lsa`t_xkCZ?vQM=N$0G}ee6)(l?8((v)<(W9l?a*az~Tu6HG10=M} zXXd5b7bljy{$~D2*SdfuC)~sO!Yrd7_b%L5PS$fi7ISLr()vZFOFgXbnf5vCNo9X| z?QQ;p%x#X2Y3l4Bc6g{1U7n!mTvzkqAbbDSsMV`htzx=f+Fu-7-t^caGyZ#eQNw~) zuU_?Ww>p_moigRmj%CZz)^x1cv}qGa+2ttzf>`s|@bK-KcXyS}togk?@!jYA>9SRa zSeO=0)C%&6(rJ4eabU|r;|+fQ{X@RGoSOD$R=tUApKXbWg37l1Wh?70N`I~|{OaqF zyzU=giNQJvyP6+gcJ10#ylVAo@2No?VIX01ep~M9Wy{j;?J9l!>0_5^LVnHf zqm`+`e$wg&Mv1&ns~f8&t?N{t%_u&=rL3!6Sf2CX?SYpTy{j|tZh6*Q{(j%D-v`(f zo^3Z?aiBs?fI}ung6(9=Bp)?rwaJQ8y#%|DdZZR($sLn`xA~B~e0nYEbN_ZV&eVb1aMR#QDuK zTJY}Y?tMRgSh~OLTo|0^d`b77Z;O}5`F*|NVp83D|2}qK=W$bD(=oLv+;o#w!L*lO z_T?_=_oA}1)$Ea>gu(UyD@6PA#+jb#;pgsy;h2+pP8|7tNibf9dEZE-_E-?&FV(xg?0ZY z*YTVxb>z0%DRZm1X=P*?n-+jSK%2^5qT!D`H4_r6hVcY7>aksbj#ZKQzE<*EvG-&Xg zR@qr7eLHHddBX(#Y#Gx5Zv8zU z`Z8x7XMFeV?d|(}Ua#BjhKKgxC38vIJX{^#lc|2|FMzbC-uU+J?mGxy(e z&eUaFb$(Vz-H*xkb3Pn@aU*KYrJ@a4yAB*;Q1vL{^^i)9ve+oHvH$hX$2WiF-}(RP zn0ceFgEn);b^lbx!q%Wy*ZJ-Ld{{ko>eT7qmToM4ea*J|vak7E_L|CLJ(AUvex^T| z+7-%Bx>|n5pOT|97G9lrc$t!4()D-Rta)s6Z}Ln!q+>bj$MN->lF#<(&i}ogfBn5n zb5^o%`}Hc*!MdL9z|HjewoDZnmzH?yhlhpDyM6uGt5>hi%`!+lbXw`t4Oj8lke%#* zFFDBE;8|1m>1>vV?HzQ=cVwbu&Y z|9!9Up5aq)|>g5u(1G1)BS56<;(yhO*BBK6>>|yV<-fOx7 zcbxQnaU`oG%l6j2#*W95dzCt_b(9rOmfoP{X1M3du9kJ%IoOtEuHL$D!?I=1?y}3* ze7Li1+qUgo+}!@JvyM5t{FLH`5ZG1Fq zL#W8ndz)B~IB2%+aLTGxW_Wl@QNy|NrPax^EUWqz0%C;sy=eJ$N&K1VHeN9Uo(FGE z>+R0bO%N3o^$qlz`faP>(vV6MDO*7U{T&aQQk9C%&GR~{8^3C=S%4{*`9{IQ+<+!& zZ=v{Io%i?c_;n6U{J7-1W8;$az@27!Ny?3@0`GiUdMlefIOB-GM8n6&dbQuZZ&UZ3 z6~fbVGnjqDngdqG0hU~zxooU6b=T(nDk%P2XkYVu&20JTuUF3YudRBuLw;ZJwPpO~ z*VDIcX=3usRSU4}+QjtQN5Nu-%HmyHwrtt6Us_LBmzVkQ_YE@x0!<1gElGQ9vR-v( zl6CR@TVJj$yg#qr_3yPSNekpwtiL}is^-P^=kbQ$*ZTUahUXm5jO$*K7A(R$=SlV5 zX0?D7HLI7#dlrdJ{@$0ReJC+JMCaSXZHGeK%xhmi6un=Q>G)Xbeq%Oc&i_k16Rf^3 zm%m&2Z=N?1vl|pAi+6UvTh(-oYCp{m0)HSln69dpybT_V$mzeO^lkuT1=J z^ZoO_(&-=OZh!ml_nW<3()s_D{$6T2cEg)n>ioC4$I{q5=jk>qof5UTj{{BBjvJP5PqaGa3 z|FvqC*^O;`1rnZ}nQ3}p9vg3NeS-9#|Hif!1&`tJBxMvxl7mYdbR56+O=yR*J$o6e|Bc({oBE&zh1emOy=edO z>7pVcGPkE6n>B0Jw6$@2f0?ZP`g3#I*{m1s|7y)%8^_iCd>VfF<(IkP@wKIQZ*9$< z|9($E*NJJre*M~i_4@VyzAoEJ<1Ajkem(#1t?T>D&K1sy25B+>?cG~9?Uiv^VMkom z%cb!#1qWHP^LM>mc7I;&x0~nV>;HaLW@O=Y)!Fj>zwcgVoLB$vC+oD-P^KH( z{{FjLet&P-yE{A68N$!bu`Ev8e{R~EUp%S{riRaNG~2XQWZmlWYv~-n-D{8aNE*-E z`{5Ax^Ru%|Utf#doHo}q^U{);&*v2ToigZIdw`SS>({T|QBhH5=VzH}Z%R1Wbe{1u zQ{#ahbzUAfcza^LN-j$?H(;x-b;}Pb2RBx8yl8;d3ni6S!P`c_d0!Q->o}WzBI2|wQAO;O`GE!(V4;FQ=ShFhW%nU=HzlX$mF8-QvcDC8v zD8rN!XWEV(bFpul$YvyczpgOu=EMIb5fQ0wzFHX%dRD3n^RX3dUAAOPOYUm>W&5r! zEWLf~=KFiKZx^gNe?q#a`FKxfo72Mm{6P&; z4Gq1!>+9?OvaSD|l_tK>kG(r@)8v~*?~hi-Tl`!ySxwGr)2A1m?UOu~Zj^0*bco5! z+-&lVnEfxF&X28EZr)<2yqqD6-~S`M4b8CQP#QDJoQQ|jpxDMl9CdLLUX3DOj+ z{bLxWa3C@H_&mEct6n|o>gxJuk{VNAusuwi?U;P&5eu2)OLZqM)SY;+Fs9EcN#<&6 zLD4zD%a=LsMe>#_fBJXV z7f(-&urJuGw3TB=l<~ig!xBM3E=p4mmhOEfypqS+t4pH(Na8X7x_`5Im+gElW6aBZ zePjKn%d^+ZU-&9n*=V?APfdi1jNEmp?umZOZ`#gTo3WnNXIYTOQaf=jw!exEiE z%AVCI|L28t_=Ih;Tdu`r#5f4VT>rgWbKa{Ji#yeWr-+IcyfPHF{JTRruYJQKHE{C;$$`V*twKFJa+eM!@U;rFdsG$SbOq@*+h>e z3pQ*hu()^8WAD<0J!?z9dHJK1&5I$~Nm;IwA>$&E zX{np)4vRg?UCX@BZt-ze8>!w|t*oraT^3*TUgOYEq13qAbk|?iM~#pBLo8&}o_Ssf zK5)!s(e>|nd%ynD&TsE-(@>U}8xs=Kk~w2WTjRA$f%?jpaSUfSvYZO{Rr>Jo`00wb z=j;D{U0?t2{r1OC@1?OBOSqXxt>tWU3TJgzeDrY#d(-Q8TrKue7n_)7ZOd1m=yPwX z*V0+P5<)W-K409Oue&mS=by6+5A*L+5#mf{_0c)~!Rg7S*Q;e0PMh(42ghZT%-mkX z`h!ksHh+JZr`dhJvAII>Ewh!ht-gWIsFG8i_?xMtGFnInPnN?DuuDV zLJJjy6sG!YD!3?@q`E951|kJou!_)6~=!C&e`m4B7$;5*z{?Y@F?f zr%ao6>CTmwc*&id%_C9%s6kMD0#7GRxhl^0Fjtc}bR{oWJp^ zGKt51b8LRRGXAvZ+`WCt$KRLb+~2oj!GeZKmx7!Y3Op>B5n$n?BC~AG9+}eyH}=*3 zzAv>c|3CNN=@S#hrcH?p3J!I&nYqYxn$o-z6E?=iJNZsAs<9E-=+ZUo6c?Ab7kg~2 z+rGJ_G1qhN?n^#idRtoR(bK0-MMOjddR;o)7K@0921W%PI@T*a-PF{){&+a|-$nEJ z?VlaF^y$*0f=o}tjVWBMWfcD}CkT|!`RWqO9Wnb|H;QBlpcU)7_{^6gBgc?j^Z?fuNSb=jUZJgE{- z9hPm}xN-lQX$dA#1!;FbWKCLW!gx60Y@4sn?-bX+hs*ERJ??8;E6w<9-?vZFm+J~% zH@C}Hop4;7)i&8@=}PH1Uz4Z;wGZ5ECzYRkn$*+z`1thD@X)&fAt5ENI|P;Ww#v4L zSox~WJysZdeo3!e=hkhrSXo)WUJVW9jozO7x}QraNrS@obP4;TbnH}5D*1mnZpGUSZ!10(VpMHmnp-(q&wDhZghOb-We{}z7 zP`?^0ky26mb*4t?+9qyw*(=$@MsNRg@Av!1R(<6%EkQGud2U(IaBG%S(ng8Z z;cHJZ)Qe8E&zLAKt{Zn}xq!>f2@9{@-~D!fc!SoKw?3D-{eAvFd&Gb5WaxZB2Cs%! zobK}G9~Z68uTT)+nAUhCfA7oHi$9e8W|Nm__n#54ddjXi&C;_kE-rTWvw6hP#w&en zmTC5i_|0u!UtfRxtN)&&wui(99W5;_i*GlQSFTu*aC=*>PVAl;uH9ls8zYrIxg6UT zAGxijGJnmQpa%+7>&|CP|D&tH1ww^&bC7uV*r8ymj+TfW_*e5_a6 z-9|3`=&7k!u3w+*wbbfS;7!hBZxbZi8Z&3jSmtRUv1Hx0X%~}^1w=-kZ2S89=ZnMq zk=sgMZa2@p`N=_l&OwHI6D5CMN#Anc{{XwvZoA}wDXeccHB1)~pUy12s-5@oSG&_jdL($XF|GRscyXL%q zaAWVBt8c$bHY+hM^fu7a(h5~JV z%l~h8>Ak+be)*OqEK9G1#LvAUvmj6PaDbPurmn8*mTzf0>@R3(r`!{kxVgT};TCge z>eHu7x8=%n?wP!N)vq&G(={A+u9FV&s$I8c&zuAe7Ym`AJJTp>vJ7Eb^;ln|kM>qt={`W&f_|eU+SbFmnDxAGNy) z1{!^jx6E3W$=n;2eL6nFSI}@uP+P|jL#w5KzQ;xyGiAIty6C03c1qF5bK6TBwp_E4 z%HfrYTLGK*|MWSy8pOwgO;9NSl{Cn2?i@%Tz0PO?$8iCIDOHbg|WvS zHC6vbDSBxd@;DpK>|tSI%*@N1rnh88w1J)W`STl!&c3;J?OI>PTf6>`>9+RHnitkh z*mUr!m}HYi3xnCR*OLnO$~p*sTm3wpXO4j5^5^L{{(Uy~^Zq}T^`&s7`d>>Bb6Zd6 zUU@rvNHbMaJjz(@`s@3LmS_h~UiZZ4uTHMy` zpX_i9ik5j-b3&ln_~`uoU5n1gAI+$?Y`2!5bVW?kFeCep&*QG|_bYy{TYtwS;?VQA z6VEmJ$eus1VgF}K;eit_1sa#7>W&@ZEOqJI$G{|bXYFZ^{OIGqMbjUfty`3PdX~A^ zpYK(=2cP#q+`EHrYdx=kXWnSSA{vK3$&s@<;BxZJjr=YT3RmaRCp=hbu zY4v})Pk(>^tEYBn-WKLdKdu>n&a3Zjt-D zeZ~LRotI#^5;(tb&(@@xmxk#LZx_tIzG(LKrndoAXC!6v*Z%OilKv(%^Y4S>!tb~= zzq9Y)o0Q7axq78kwSe2vg&vC-3-@k~6ylW-Z4Wa2rjUG*Kc(5|OzdOLHqW5h_Lk3{ zceB6$Z2V17RPXQg!rb=1FE~#uDHAK(zJE)1hWOnLCfPB(JqsTPws9_FZQFU-+MI`j zCGy+n)so*gFKvGRQ}XwWre03l-7kMe`)NuV%5)u9NaM(?k7-V^wO7`bd6ZXozk5BW znd^222Kf}wS^#U#l;1&9jP^+JUS5(K%-qXq`{T9ox1%hTCI7x{KkgzMnz=+>yd`&v zq(kIHKYkOz|M~JNtQ~IVI?RV%BpF$neZ61LG)(`xUjN_QRR`neZ|pyF^Ne?Q^t75i z>%N}VbpERPu%UP9qy*6lp-Vqi8_FigYCFpCTvoa&mVWop(my%ZZsq@ZzIryBYwa-y z-g|F8{pl&+Uw`AWvK!ypbr#=pO0@Q6f4@C{{>5#acSOR@rfl2yS7^4mNuK5NiJ{^7 z*_+v~e>P@YQBrax-R67XXW5TF5?yVId2EHbF1tH+yl_#@yDW9YS8-9`(ZilQ1Lyr- z@v|>C_uIeF`GyR0_R6OB=vr-Dk*9NM&q?NkXBAG$zF1bJa__}@d9E!^=D7=2ybCxd z5xwR9we&ZaOV@5XutUYFh9@t_xaxRT$>%DSjm)Z2OL^*bzt3Cva9ggDRSnNn)?;sY>A*Hq=^NY9Y&*Vr-J0TLp05-X;!|;=Z!fCpIvX|-j!vK441b$Dd|E-$I{R?fbjw|f7ZjZ@9nWuMAn z`EhnnoB6z*W?vtim^hVvYS>ig+hSbV{7X%2sspa3^OP7kwN5zf+j82&}zy2x7TzmZA z=IHr`3@?pC=NC5cUD&tyMW-kxMk{T4O7_U9xsg`CJRnThezZIzF&@B6m((Mx{c z@{`JM?l9Z`J-UAD8iOe|RcEfxw|um>T`&8l@V|2TU2nEeUT#}yTfq3?Ps2o>R<8S> z?|+Z@|LJkPrr?i{+xLB4`$*XThs?B8N4b}JwjYYmY*F7|_~)yC-;LmZ-{pV4dd;+6 zX{P)a;s4nOJ~Dgxavr*{aB7cr4wKTNKD$>EhaPfxY06c<*(i7LMW4KbX4{Ug>R-+A zomGJg{obhmD{nl>tS7Un;^d;fnO{z-pXOj;+C3-sws7gu{MM!!vyR6eJ$vt6|0LUo z;*U@APg#*{z5S~Bzx(^SWsDyj$jHuqy+iW$#&S=Y)9t$+m-7@()!1zRBiH%Pg4I2B zkIE$zep|9RM6c=H79p+FGzR9!Z{JssyC0gbO%wQ0SN}o!#7?HqzdGwT z?a$+pF;!LiwEzF_{p*5GnN9ilWB$J{kHYmV-Zvf6G1z4ryMVp!UhR`t^S`tIFEs!2 z&}HpcRgK3Tb&u>tD+(5Px=rj5$y&=j|JUKm_cvUAchflSTu0{GUYo_c?tZ)+|L4}# zgCd4gD~E7 zWW3;>o8;pLmUUGuKbX9DTCVTRKRSc?+Lh(L`=eqwjASds&%_s9c0BEH_P~_Z1@|4V zyj~zPrSLwZ>DQIo%^z4DECtw}tJa0apDlNbKkS<<=PLP}(Y$F-XMx!MRqO9{+Zx+f zPipL8-_~fyxAgq8X!hKfKVIElJl{!DxZrFwBlB_D?~zQ&@)I^SGC8rTB~5w%>FQf= zrj9v%nPRE2yY&wme9Jd5;cj3u>NIam|9SOPv-Lh{AxrKjb{_YcQv!Z1uC;MIyZ7he z>UiJQ+5fm|ngrY|n)7A%O!^&ed;ah0_m7udG#2=o9w00*?}2su7P$#M{*&`&ml4I-o126LQE8g4mK3!%g&wRZ2e%HqY8Maf$Lb%H|uKTvvF_|aC zfa`-#MO&q?E@zggVECm9}+@4k4zAb!=h$5&VCv)V1-U*56r%)8yu;VHKl9&kONQ@>#8 z>~NVM%yGx!_I;^-V7uqgRPo0ChS{GO9=<+sOYYa@e_o9I%v&`OM4Y`L}8WiUXH$ z&(nW!b=v*s=fB+hw~TGx7iGR$rpJa4q$|=pPs{C@)nNQvuqSFyFnsv>+ zZfD5tlXz#p_NzzF=qB|2B{Dz3&nu-aW5e zqa&a4Z()?_n*OY4nf|-E_0Ku?E3bdoc<^KKu62iRzgo|k|EoLWM*NNakG|`Q|2-7X ze*MeEpRrG+*+2hbjsD#r_gGr^IrBk3o2C1H*}$%WYmAq7XC(WDhei1( ztXcAXr}OfkYH`oE$-PyU*#Bx#{`V(0=ilD_pr7$*qm{NB1*D;uLx87y)3V+T5q?w*)!&2T{72e8p^Bu_I;@m|88M=y8RVj$N#&{7WXRm zNxgot2S(J$lzR1jzr|tmq#7f9BSP*Lueu{i>7bUT7K9 zI`!?PYnPe6#Q(j($a`o0;hk3N#dAZR{>Yh_fAj0KXC)g?OipbpUsiSh{jK0EhPuly zHygg)=U$$$=Y2HqUq|C2o;z1;Sr)Iqc*pl{1LMy5N*|8b@yyvb>G9^^O$SdrO+WMg zctc9|a)pH5D`)A8KK-F{@Ay8IUkt~Z>SVgN-?TN)uJNC=ao2q1BlDkh=s)$|sWT%& z{D zOnklK;-R{C4(XwnXIt!lr_^#!yr`OCvElLW2kYdz&%L$0neasDaPzO7%OelK=IdqT@^!5$y}x)Vn$s%8H=#=kvPWV-3dleaSB zckl4q$1(h|IR3m|+969zx~Kk!n7`Rn=IdV$N60YFnd%(7|KiOpe|`C$Wj6?a+ra$4 zZF}K-U+KpE?-eB`+I>?OkKc9qw|a5R=l>rj$^PvFF*y^SqW{K_GZhldE)9*l|MYbMpyAM}~_q|qo-1?CJ-O=}=zc&Bh zrKk4v*Si_-Rm!gzy{*4~`HaN7{}tiY57nPPc&V9HUDfygx0K?K`!cytPl<6}C}r~! zdS5c{m7L0l)fFH2#^ma}(OJ54(v3Vuw~g8NLUu3yB>cd-Zo})+2g&hQ79EJFzp(Gd z*+;*W?-#x1cVBC--Lpn-$w!;|Tx+f44*z$rZ~Fge_TlWm@4Ff`4?O?ax95cG>_3I4 zUhAwCxc4ooKF#${wfX+*)BpA?t(Ey<|0Lt}?z=JZozp|E$3Na+)y}-<_N+^ehI@RZSjO(61bUGx4JL&n@c;wK6h$h4?)nE$ml z_j&hza^aJPloI#-5pj)XaSkVy7o;tIVkM%wMPv1&SR-ZB4o-n;%u7we64sy}gV;ZoYN;D_YKA6q%15AN7L zpYKD^Z)=Ia=}YgJDLSiFS$REDc$!fwIo@OpaB;%8uKj7#0(DZf^BXepIp$FE?T3URr@5x{9O!gShTlO^KfO=`xK1O}U z1%Gc`UHoy|y=MuL`0x#wvrZL)cNYpYVwmB}d`C#)mq zTPqpqy5CNJ7SMnE$NjxGTfKHix*W2+r6oA=zmVYE(!b^Gn`X_L@tEzt;KU668darD z8r{#=y*qG1aMk{$v$yHLE_o~a@A+oy+Pv-)l9hKJn?~Aj3a*sWN!ZeP;zOLr)VH6H z-eP>i)bo0iU3a&KqxoAc!N^Iae>eYoUVoM~XkKltR`>gBjjz&6uFdb)UTXIAX`|*> z!+S5;AEf@Bd;9Fuo2_c{+DjkZ-J<Ax zebc@2@WX~GuWRk5uDhvv;Gs;yA7{<0v!lN9fAq^{o-reLDR0Wj7rA#2cdhxp_|uj< zpDeSK<~5sF`!5M!F81S6*!-*aPBe13IWIq7Rqar)P4sfCQS*~epLQ?I(cG~4%=Ld< zMOMs$J;(eQWGoVEZtoy%jh?COln#=CawbxoC;eEry?)Wj-hvF`bsQqCOHj%HiG=Iu6{-eqPqgeIQ;Ti|N9CCbI`#6`Dt1t)SN=j)zWEWiKE zu7BSx_sMH18Gm}STv^Fp?nQF`lY+i^->zP9zH5=5{UPg6f0)zIpR8tKIW?542W1@7?eBF6yJ%o@5I(t)=gzUL>rLOG_8X zKfTrJ^v_=bnxXa#s=GMefBCCe(K@5IE?yQ~ayHNS<{5VHt@P2T&kv_fV#qU??D;lO zzUd*;$s2txU0%23Y_?j|G4#Y;`1-%YwIuuTQ&z>-*^I%x3^zCbQBTcSt19bnt-n0? z`@Z|JCRKMC4L&W&{ug4uc9TWT`w5#Kc_;|Hm>ylQ)jL|}+_YocBF}ECe7afux*5Nl z!MCherzH1B#|299&It~Q63dvz@G?d2-~1pA5v5B{x3V#Iai3mM^7M!7>us?O(z3?j*%u3=)+S#139< zT3I^%^wfj}u8Hc=k}qpcY;Dh9b|Lq{N7K+X1*-#By-q!MwTb7^t4(`(+T6CdZCNn2 zB*^mA>_>h*1zE!CZsDI=4@XJH1v?%-CgP>JMQno-KgYrJK9jC(e1(_!!56hCJG8}DdTULI6Wn!ceQC=pQC8~ zq2rp59&dZ7<9X%MwQ0}1vQ-Z=uT{{C%63_)_qI@1uj&KWv3u;!f2OCE8w7NHJ$N|s zdQP(NvO6*D7M=@u1=$6AJ;W0<^3PsizY=n(y zpv$fF=<+G-)2bPIY*d}g^fq0Zx@qE?uSZ>t3XkMCZ+RQ-6&vBLlo7u8X@luh@tqai zJG7f#C0;1`os@I@K&InvvnbBH5!*6M4mGmc`0GBcc-@*8Zhp5halzIFZ_~D9x$Wk= zb>VK4V$_9S4Jl8wrRE(~)^n3fzP9F6<>Hqbi}GY&pOsQsvHOdm!@{kvXP#w0aDtip zZN~l%j+cpS(iRqJhU;%mZ){qSnUr;RYyH}c@5bNu7o2#>zc*B&FLpufb@PN@djGgu zCwuNzV7+yh2^)*=8d;I=KSckXZP;n?$_#T+qc4X{)1h&J{3>BBG;hU;Fms!Njaz>W5bFy zE|QgtE*dVdjnQkG?04&=Z1lA@r-xss9TNDq<9u79)ViQo%_&x&lWbD;fBfF==lf37 zpzn|U{_SnOE3B6!<+UjoRD|SsY*iqqmulhg@%cbI~pZ9F1_`-6V80F zw7@u%%SlXCaP#}3iLLvc7RFAG(3zK$*ZqHq>ftXt?^{`ZUAcPYB*m$z6BkrE-<+_i zi$!tLw%OHZYFaiaueh}C*e;0_LB}S>DHYFj=eOA>%!s(CWW-fwVe7Nt?t&o8_2Pnu z8U>uSlqZ&`6?-d5R=5B8wC@{FkB5dpV4LY8MNO5tD$8DZ&DGjswmW0ej4fM_ zT11!^1)F!Z-*AsRA!BXet=r}SUZovt zvbH~d%d=cQ=+usfPtW{JG5-I#PC0Bz!75-N+@rzspzM>Z=!0$VLw22u zo6z%3_u@B)dHiiDl8V_;lXN2Xwzl7o^;ZjMSuJW9{n$cEw}gesHdLM2Meo2BJzcjc zGoxo$YOIS8Uwi0^KnaWb+_o)?EY})NajHI-{5)Z%xVCWbuPNVr%BJ%CZ+F?<5wx2( z?SxTf>f*C&wn|@U)X6At|mp%XsqanPIz{-=B7?yCIfXe9^$kV)qSsuPyuE zYVX)&zDBct?}e!HjhizsOzSAVo7fs-`BTA2a`yZ^yXNfV{!ad(p2 zy}0{67w*`GhjE)MG4Tx4*mb}D#_xt52{UZ;*f+1JH@YtU`vspsrIIrW87jcgK zUwBS)=m{R!x~F5UVrG8*KK9V(z9E5ccul8XRAOAq>&z|juI|T<33u*Q+7%!7-cvU9 z^{y>14=h*N85tsM8vFFt*{Ize`y1qcJkJfyx_;1asnOGEIT5wDr_U*U9sX_ix=r(H zK6#q{ypg=tRD0U=oNVtfo84x6Q%cuVc11?4nj(6`-gV*h!y4O&;x;+-z^XqJ5*jjY7>rjM_p;e3BpKjB%+i!ADx}Hv+>1=C$=k#NN^_$k+ z{hjgswUwCI(|DE0byeker^w8!ttci~;R@!Wh`Ip@m(T(WMY>ahP8lEdwGR#W`9os&iX(3V!`{w57uDImF=*b_ zHMN`X1z4_P`}5u^Dv*oU>;0XS4|Aorp03hix;0xaZs{_n>$hhHL>*wg$g%F*IlV26 z(Jeh~B}bNQHA>3ko~1Rf@Tie*{u!Z8m;I}>SU1%E{&pZbe{bl#b17|B+iZ_Gb?G|0 z=IXk3xCFSkbUcvd5n~Y*DiH`dU>|=Z$ZMvOP=MFWhKI6D>wN?+|CUYVNLu;rl;=}M z)hHgvDM4O)zDRsrCz`ux3j5~i-_*FCI=SBp*nObuxOP-P6sM9>l;kP-oGs@cR6Os{ z2zS}-rRnZs-DYI8s6ZgcdF7Oj8x`zRmrhmU)Jjy~6i-^WVn(9G*@Foi7Oq*d=HrxL zzs~R5XC=fe`Gn-7TUJgna+ujPgDW*dm+`PM5ARdf7@uAVC5^+A{rp=sQaMhs zq$-@UPWH-n)D%B_VbNBhwW3~$T8CL(rabJ*(DmZ<+WF{dWVgmsu3MpP4;M}0-f`>d zx`jN^E<0x|TPwhR@FLf7Bj4MFGRF;k+_!9NK9~?C*(S`%@}}vKQ}vGxiQ8W9%F__J z^tbjvt^e{@62;HYg);eAzEts4o6P35lJ)(bWHu&7p2G%axwmp$77NN8H;jso<~_YB z#6&9eWy!4$7bS_dg;CMbzDuVV`3fI4xDcg%*kH=FTOLb;+^XH&HAI9?e=P(FUvA1pw?X!5q@%P>C_p44$RIX!=B(%YKLa}Q)6h*>ye+bx-!=e5#ayJS15sk=VP z*K+6odF_`}-+AV9>|)H{>my3H-)ow0Q~Bvyg2IP2i4wxi2NiOUCT(1>;?=DgGiFrI zul*LOZMVOqT>GAw_srp=2UkxfU%PtEe2zu-or>VI7oBr{zmm_r!o7*@tE#Oz z|Nncn%#EA5uI1>~mwuXI{&L}rhE-cX`$|q0%LvVWK3i&%(d1y^;NTa=5197sQ#k7z zXOm~&d2^%6Qfme&tYx>(EI1SKr%pbvT-YvN`0r+> zBj1A=rIefV4}SL$dBFVO-HG?5zEj;NUi$HGV$h|KN|A)vC;HnN^0yylXKF09o6oPA z+J0(|pL(OigDn-By`@)EpUOU7x@6ZDG0ooKkG4V^%l2tX-eA4M{KD|#$?W#nVpYa? z+qigzM~sX{o6jvPd2H46uFX^MjrV~W{Hxz>+w!2DPj*$b&a|zbo}Ljp)5_#7+_-T< zeSS^T_1AN^)c^k%R#W%#UD%$iZ7()fJG5h88$!B)uXMHrQ zR(rWHL3>}q*|2hdo(2C>=RVy1*eF%^gWiQD?6uV`vkZ>SlX2G&Q4!!+_*!ezN%!K) zi{1`QA5;o1FJX;(*(YmV^YiD=?8fr!?CjY&X1C>LpEWy{w>^3DO%ER*6-C9y+}qm% zLqfh>dU&`!`eV1azFutQk~`*K@BGVdEML0NJoDfKIYD9TW&MZS#CQaF*bEF-l+Ijf z6Zd)2y4I+Vtl8V9eLE(SaEa-ybpp=>MxWJx^0*oMnVcLsSVgV3w%%q~#`v5;+&^l; z+dRvYkB)Xne^gafy?pA_sR=lK$AE6ym_+_h}$BkpTCcYXCcUcBhfem?u%wj09nr+4NstxJ>NdVBkV-?5w3 zbuUbFDZX@EzWz_%>Z`wQE%BUu;>?*Rf4|>fzH?{gw?nPmix2HDJL_70`_ZGg*#;kL zZ04oyyBp+k;Pvd<^XbvkE}ULe^5wWE_m=C;_tZkXxzw_`cHMW~(##&Qqu}9dUtiw{ z9Wfs@;jLS@x>#2reg zppKbHEW2jq*H;&_8(dlE*Y93r&U+z`tLDRrR_{wm{9-(F{~3K#vG%quw%nJ`6fB4n=-^WjrZ?J1EKl=Ry zgSWiIPa}ipr=s62%KCrYWNQB53rr6yle!c&(`_W3^Pha)ufr5k@|@fHcB~6`-G$Qs z2ao0cwk+DSXzrpt#hWC}t2BO3|NE`yhvD?|4=>zWztXN^g{c;+04{+yruZg%V2JPkoD!`_vOz@ zihd|QsEz5p-|z7M>W_KS3vO=Da4&v2N29QNpLs*Q;lKY&%$XN%D|*>bLoFiFNh#_JCz2!T(=<{k;4S%Y|K84R!~Z51jCL`t-xM zthW;sWaeJG{yV@WddHCo6XxVNOMN)NJH3{Ff8yab=eq_De~xlrGui*Ad-X+=xfx%* z52OU`{O>=1bLPJ%EC)nO6Pf+Je->tFHKNTy)@zNKH+bdrYu>qWFlX?^2PVxCr_RF)Wh5RG^1NddKVYt z)^!3w_A4Lz{939wao3V-qFFQ57OmdtuK zNbGX-Fpl~-YuVhZMdHl| z6F649SjU(ZqiAyWfI!Kr_{%&zlE++<8~SV>Jm?fww_CS%?Nw9X$&C&QJIdeR+cbY) z{HL@N6Ie<+^*PQmiZ0h@Tdv>stf5Pv!!dS}>G!+MrlzLy=4NKEW-U7zpdn&Y^(EtG z8?W@eH}e=-rt0yYo#3+AKE=btIq2o3fR-227#ZyDY|Xwd&JbVsGgb4$ie-(<90Qoc z15%6LSn=`iYdhS$KC$SHRgB}*geMXY4j*pkuV>tldwW~ZgNu3ZFFOT1zxJ}L&bQfW z`@LNrWmg%}5azSL z)mbe5!M2Uhc71J0Kl?JfY55VB#kpp;@7UG;`txf}@wt2x;kpzwrUkG6O8B&x_(w4S&7?e=5a|J)KEpEGxk961u7o|g8^OVc$d zC}_>P*Nb@%ORRcbrC@End(oCHCK9=4H|0Fubk?(3PpZpO&HaWDhlg+OZB{;ij8 z6ZW!|o>1{xD^ug%_PW=bx1VL5Gx3@Ca<&;a*T?Tadh_PZ>nSNI7A*o2ZH>z^zr4Jx zuBND%xZ`TpUNZrX8GLK2>rdC)S-1wX$1$sEZ+gj*|JVQVnJH7I9DVun<#iQx_3e*J zW7Q1}4Ugq*=ieTobG^+;F*q&l*|bZSf^@l8$?D^TfwlL6sN&Fzs|M z%2*x0UO##BPcD<^hO@N$*5ChkCzqcwwPE%&-d&SDJ~$K=70o;R&>{5dwJbl26CBcq z9)EmLVr4sP*<9_p@56<}Z{E6Fz2k{`z14&X6DEj@i?=V*nBk*tK10m;$KN_BX=&SC z>*nuHJlu9FV=sdT)23qiKevl#W)=!xOZg*n`igqyYWppZ%wuBzrk`4U_ch<&k8SOZ zK?@i!EWXROJ~t;v=GvV*HXa;?4jdQNH_5#SI+dpRl=HAb7tdh}hARU09Fi-zq7CZ= z4s6ZaUOnUZV@usQuSy~Ly)Py<7QE;;xA}A5|Nj%+oAoC)1b>zO+x~(3`J&p(|99BD zIygTp>;AqcTmGNjnZi=_lUw4Q?u)JY3$O1J{TKI->71(a3*MErzlFY<%$x8s#>naV z>G%n4)!kRJ?@y|F8~yP8Q+u1KNfy7-c3z1$Psb|~CDHhm+nG)G~& zaA0Fnt2wx>0 zTqgCmf1YXe>&wg6vCHOpo96c@e(gKzv-_X@Z^^d8y#h&66IhqHY!g)vVA2tH(uv>p zV^-GDY1~~+0lsT_d#9Z8 zo2JPv3+M={*Lm>v3Nx48*%L-~l{Iz+?p0O4&ShR+X8HKhqcYq7e?A*C&Z~IT`Bha_ z^;_ubu(K=IuC4v}t2%stn%V!qC;8*{tPy(YT*dFM=d@r(NX=8zD<;_&tClWZ78#v> zdrv{r+IqDa>6|=rKR_6{(iY^*xK6a+!!fuKY1S) zi&Nl4k3Fr&fBtzblxA0N@Jfoo;6Zac`~CW-Eo*+iY2F;T=C7kK(_ste80AByjQNVP zFX~gDeP)km>zhAIYP<1)((AG2{1r9#_Ef%)uX?$3bHfcY9p3cP(o#VOH@9O8JT5MA z{Zs${_x=ChmfQc$oHgas#MJs1zthjYJ^nY=klSAC+0v^|W7h_&F-V5@`^fz}r{BIW z|NPlQPdwOypJg6f-!Q@Be&GbhmaIj+|9;0s#s1?BU^ST^B`cK6W*^M)@zm<|`+m7b zMcwkf8@bop+uMGYb@{uk2mJq6ls@h1{-4Yr+I#Tb94|$mW>3aV{d?#9cRY3A3eW8a zo*rj!|NGR+VA~zAXX+e5_pHBaKd6(snX&e`rLzs@=`?;(v@q{SzwUQ-* z4pNRw7Ah`n6D(NtyHAS0WseulEq-?9=HC4K`=lFHd@n!yZXh$kfnmk|vXD;^-uH_q?BiOpPH`)P zQAGPgT{pJu!`vxLlu{~AZ~P*AV(a2b$CgbuOx~?NGN(}PS&Pr>ui~QCb~hiDly1A>GtV&DjWeOEzh7RzrJ&?{QmeqpvfZ^h z3;gCKB_VcaX$PynYD{UUS$NYtObh=ph@9)e<9SRG# z*8g7+pEGx7VerxFeT%HN91~hnFZ;3V^A3+M<;NB{yM*126TPW;b3^u|sYzR31?{+7 zo%QICn4@ZZhbg1p)abL%)m0e{0VxJsC)PL5 z4XI3hGGp6}3zED7T&>gI-``*Vq+5UAkDEP`#^>(uD13bV?%rGd_WvqQ^P1l=c=2?4 z{J#$m4mKY)^^HE*ALF9J8mF{Whe5(H>Bx3&aXp#4y~V6~d%s>wK700TrC@%=!k>pM z`TyPc$+*npYFVQ|(z6p2m8aW(JR*E~*Y4E4f4|-C{QT@}bX-V?iR1OJ|1VkfyI2d) zZZk>^{Qi?Mm_d5(N9M4#QK5FJr>01Me}Dh~yyK58C8VXR6U*0aTe$GygN@0@)uh@A z?=ng16r-i!Sr@Jh>@YTv{_Vw6O4F_|cFyy{=G&ptC`Xmoh+gPGr^fc3zp)YIE$`YbbP2+-K_dFS(a+BbI;KAw7D?aT80 zo4npT)$jZK?t^Dt!-Rwm1A7MNOl#%~rH@tY9WK?@9q1C(wwq;^duy6$_O&zdo72u- zRd(--DLrd?{fDUQN;W+v4Lv=(3s`Xf=b$eUxZ9TSaGtNGRA)cle0E{ogMv1?R7<4E|qyyifM}`#U>}r3_Z3%Kv++UvDX=!Sqk9 zWyjhtO{`a6NFDxKkRRu@=-v79yoSkt7!(~|O>(%v5b8Mn;pf#(O?fTWhhwkQAG4@D z+9fJF-S+3t`Ip)F{%>BG&B55UYD0FqXtU6)9X6JK4ji+8HCN=P49nI6$@o(*et*8G z!&I6l>&!p>KM&_U1s<;z*^BL0-~MHNcRAD9(k*Y#vzIdGJ3MdN!BzCRNOI0}?|Ez4 z@*UJ~6p8zNdtN;!c*q6nPuVg~56`3X)6_JM@2}A}G%WNy z*TA@0#?y1VxtWQLPJivhmw&2WhF>c_o;mN-;+(&S&sQl2^?qQsyF1D1%_N&8XEL<3BID_q6S05Z+1X~f7ff=0{X2B%Rvgdu=%0+@Heaq4cdo2ekIBQ4!O?4@9Vd8ZQYkMD_i^e+nRrUE25tSZl8Ew(&B=gu<&R5$?J9`tvH&M zdihwdjJDph8yk~FL`5ggo$TyZRaN$~Q&{{(+sE+r*R`uxZxiw?Yz~c{mj83R_px4S zGY$2(O^MAPelfS0^tSAX(3;y@q22v`?Z3OW#V?rb6;>tKs;atfj9gpn_VhXb#~(E^ zRuvNx3_8TP7G_G-?Vn$Jzqb8kPFg|UJJH(9mzOVJvZN#KOOx0nmr}Pml_!2af4VT! zN-tkvx_QU4mvidlVO1S-*cvUHt!I^5=Iy!u)}Ai~pTZ8%XhgrhM) zM8wrmitS(k$LzCW(&FOR^WzJDCQkNz>Jlj`7k;Hxt^4@ZJ$X;BN2@N+>(>hwwvd$C}u3)?_B55-u+-%eNCI`KK`zw=XRa94}F}J?0)m@ zH)-EAW4ZO>cMS}p?1I{Og?3u4zS?E|M)UpNpQpT^HtS0qzjfaJ`PB3};Znhr%l3A+ zb9&z^i*(!C+bPP01_p|f?}mp? zeU@e(z5Q+4QTF`1+g}}CDlhoXq<+1(&Y~NPS6Y7jVB~9m?BRBQ-<2y@TEyKo4~tAW z@h3b)wELz{R+N-GzkJ@Rm1}LSmt^w#E#GW?JJGuCfb#zOr_GMfdCr`WH=JScaZm0# zhFyI392m|Tc=(rX$UI&yB0fFj@6VO)dBvutCFl5Gyy-L99kVq`BP7FUra`ohI{V$U zf2+HkdaiOk%-m?YB=cY%-@c>VQ9l`XZ?D;W;c1a@cDJK>%Io739&l&u*kf06*TKVc z&Doy&&y&AT`^p{b%X{%7^Es7?jv2Go?SK0Hr-z@HlA0RZVnh4?N-?yC5jBI&Pz|UFLMZsx0%NfBqh=2XCQIt={G?RmS}OtOb?rR49uH; zO)^)qx2kj4^7ZGgU%&QWxqkI+e{Zkq#fJ)NYHX{odi7lGI-8}cX(>5*Q9yY3_t4zf zyZ5UPGOT?a60_*>u`^#pZ0zjM=Gn{TPe}0SuUOP2;B|zJY5R5mv?#8^&b}2t80X3v z)Le;R@V)-^*{)x|cE8Tbwmo_Bv9-KP;c8;Wb0`*|(pCDrytncx>R4H@$W- znK`EJt*=gH`A(KUdfRuexc2gn7#EwThlhfh9^dY}erxXfB|9_oe*HRok6k>gK+LCi zMU_9dnt%QAF23%qZ~3z?-pAj5RO~HCxcuhZhqv!)YxWi044%I}=G&F+yT4t0^T{Pi zu%No;$rtbEpR)6JZQfjS{K`$y8*ewJd_SG=G<^1#*XwrN$d@?waMh_(r|-n+i*>91 z+0&OeVa}A6fGH^oJ3g)U-4z+S;dXL$7DM-4x$4le{X8}Q7}8uHRz$M0^NWk_|8=Ly z^6S>CPZ^}IuZxTS@ZpbZGyB}?YYk`We*9tF^gA_S`|&tdo70kU+b^$Vk9b@5Zck;_ zr8m*b?Jum)zwf_!)24T-LcgnR+R!}f2B&lp3S*m-Oww&zw-U}{(JVD_ifuXRX!j-dhdS_xA^g~{Cl_eeP<~Bde-Gj z`6+&Z^c(+O_xJRy7I@^xc-gH_D)sESbIVrknk8#pz9>5?TV}y3t#3CXHW?Wg?!GHy zU1h>iqq+3YYQ?9YYJY#P-fjGAiQP&`e!GwDN&@KUEE=nf+xUewNsiV3@pnOj4x0{xS&sq2HtNmT{ z=SN{zzx?wfox(3BUXQwr7nFEo5ADE*SMOi1ZWmiepIT)rd_}dx0c;A_QwdH;@EI#hpv&Y6pj^EY2 zFCZqS=l=Wr-v77F6r*_-XmG7swP=-=Sa<82H9F_yEGBH(VsgrFPQv?nwlX?8e_UNd zubz(Om~f`$<*th#n4^v*_wnr0wO0_isx)K9gb6%6XJ6c&o^O`3VC70q-^&x)8c(Kh z@!KUe^lfr96%t~e5*`u|8ryp{OV!$X_GWgzCkcrUT@G#886f_XF_v>)Q@U2uylV`a znwp2ww#LnwHgBDrRSCy>^*w86gows+xXj*Nzlwd!=cW$9D<|?}uUi&AV(B~L(jqWf zX`R#~cco?Dd?gI;JuFb*RjyH2ZWhkHbpIUBg>RRWSd`=@Pnq+Eqt!{dA%F24w*Mk^ z4Gb;oUW+LnIqG@xWJFTZhFdx6#s7k1_TNp`dH8ny-H?o*TTJ`TW-axfZ)cI6z5bd> zZupZ$DeAr5^7G^c#Ko6;X!^D#9`V*p-j;Lg$_?Rd86s=fonA6U|Jc!^m3Q*C-}C(V ziTyeIjFMRKw9SzonyHblN8dI$b0kg-+GbO!;wP-%!6&w$ukN&mmR73(<6(nW9L6E8 zF)=cE+pVkW8ic-CWS%fk4w)BnwNE}lz}Ei2^Up8Ex?QtoU0bs%i=#lQEwM`{Y}J$? zK_`u%Qyy|kE>C{H3`^vcczAe;Vv9kGfYrn2?4}9{5^d*`HfHeh^3Gky{GX?;Atx*A z664*+A6XbDPMDxz;wvoH?dqY~y6&}yX6uwm9otJPjC?N(IGs3gXSx%|N{ucaw&qJY zW~YxGbE}lfe`#dDVEaA!gjX;4%*@-hcf_rq&dGh<;K?8Ej1MdVOd+8UciWo2$l`I- z;ZR9)T2a;TQ2CNlYPLsL@52M{V%JpH6s`Zn%oF>FzcFuy-^KO9R}N2IwC)4*6b-Sp zW#`|wE1iGu&r@@9+kuFEyfJ5v9GJeNNo!%A&Hn%Euia0rYlv@uw&0ZQF=>NOVn9*R)>{%$!qKC3bGn+#PeKvMg;nZ(ta6+j)L~D(CcjUVoNu zFDiQ>aCocj4<2F1l@E%-9_idV`D}Um*DDPF&ibF9^;+lF&VACquIJZPUAyDqyCMDV z!%t^Vd&FXVCTv?6F0T?0eCphklP}IK-m$80^IQJyUzO|= zeolMxQ22Ah9F4E*?|*B5aqpjkRSp9Ky9H=1fV_a|)Z*itH?LT^@?hNN*`BY|CLN1m zXVhoeV{y#qDcj}y8?U}uwrp9O?D=zxrn_{PRC$-%SifF4Yu2pNz!&k`AK#4R-8?YR^iJ<14fkmn51@OE8({;BnaSmDjNuU3Dusc1@Kx zI2K~^gy&avyZnaN*PS~BtzJlNI;*5r+Wh6t=71nJ#l2fSZ1?Q*$k+8crEsbEeA4~H zLJL>CO^$Run!ci^Dy=?b>Vw$*a=%J?F37)Yt4qCqc+(q`U-GhF&-{CFPd?y>hg@_0 zS2LEs>Ye4f^3Lv3R&Ke8vx_w~RyrSI4)d;WqdUa4ueZb|>^CKw2;Jf;vW7dt(7-u-;xu2)m75AR&{%=Mb6Qj5^Li>tMK zMYme)4YYSoEv)J-lb)nSckOTbx<$#17jmpF0a{fSmi z2PuiI?2dtgU6P$nu8D@)W-`gYqyz2kQmTrx?>=iR^If9Z_$Tht|5IPg`^tLdHx$(i z-=At`YuUP2yi((C?1}f+rhK@queEE}clPji z`BoodGe4U@4(^q%Uh#k5{kp)5wRH>!zO}PmwpX7zghy(JP+Id=v<*d8lDzD_JlP67*O4G4*%5<*quC4XfmB05=U0t2m zy~=3Es*clAEr)llJN}2EJ#_CX=D$acr^(F>z9pd3|04eX!@2)lEiE(C=PueGT<5Ty ztz+{{!|*(n2VaAW7tPA=H!D0H-?znj*%rkUuIJ?+tl!QqX?wvnYTA4Wf6+p-;{KnE zg=U|31b^9IemcHyk3i&IX{BG%`c?l9oY{X*t|sA&!}T*}zoLII-ZgeucDSkW!Hs)L ze`Xz2);|4X(T0~>j^F<@T{&jz^b_ybeNHyjl=!knZN|$D5xgzGZ`@mCu|LhkX49rO z|Maf+7!D*6z|KFzHfj2 zHo|D}O7$Oaz0>wgjQ?=X_CScM!kY8{A68!8|Nqy0Vbwpsp4WOiHqjJfDPVfFB?BNXy7CC*?Dhc z_=I4UoR_LKb{p=hES*yS`}X}3MHdgjQ_=J5cGXK35w@=S~aP!}--1A@9 z>b|_$-)GA6*sY}~PXD1kvzVsCo+(D>40?8a|M%-)?ZO7T%A>19^9~zK(b#;{_~A?4 zJqx9i9qw&UKB;?d-lNal_jX!NGONGzkRgB9%Vi%mj)`yF_QTG5y584v(^bestguesstime' + , 'get' + , '#' + , 'get' + , 'user:*->bestguesstime' + , 'limit' + , '0' + , '30' +]; + +/** + * Leaderboard helper function. + * Rearrange database results in an object. + */ + +var buildLeaderboard = function(pointsresults, timesresults) { + var obj = { + pointsleaderboard: [], + timesleaderboard: [] + } + for (var i=0; i