From f553efa69e83fdf296154ab1b7b49aa08957c04e Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 23 Sep 2015 16:45:20 +0200 Subject: [PATCH] Named map mapconfig provider takes care of template modifications If a template changes it will flush the provider so it recreates the mapconfig --- lib/cartodb/cache/named_map_provider_cache.js | 24 ++- .../models/mapconfig/named_map_provider.js | 11 ++ test/acceptance/named_maps_cache.js | 140 ++++++++++++++++++ .../populated_places_simple_reduced-black.png | Bin 0 -> 10654 bytes .../populated_places_simple_reduced-blue.png | Bin 0 -> 10886 bytes .../populated_places_simple_reduced-green.png | Bin 0 -> 12391 bytes .../populated_places_simple_reduced-red.png | Bin 0 -> 11322 bytes 7 files changed, 174 insertions(+), 1 deletion(-) create mode 100644 test/acceptance/named_maps_cache.js create mode 100644 test/fixtures/provider/populated_places_simple_reduced-black.png create mode 100644 test/fixtures/provider/populated_places_simple_reduced-blue.png create mode 100644 test/fixtures/provider/populated_places_simple_reduced-green.png create mode 100644 test/fixtures/provider/populated_places_simple_reduced-red.png diff --git a/lib/cartodb/cache/named_map_provider_cache.js b/lib/cartodb/cache/named_map_provider_cache.js index 44afc98e..1da6cf15 100644 --- a/lib/cartodb/cache/named_map_provider_cache.js +++ b/lib/cartodb/cache/named_map_provider_cache.js @@ -2,6 +2,7 @@ var _ = require('underscore'); var dot = require('dot'); var NamedMapMapConfigProvider = require('../models/mapconfig/named_map_provider'); var templateName = require('../backends/template_maps').templateName; +var queue = require('queue-async'); var LruCache = require("lru-cache"); @@ -34,9 +35,30 @@ NamedMapProviderCache.prototype.get = function(user, templateId, config, authTok params ); this.providerCache.set(namedMapKey, namedMapProviders); + + // early exit, if provider did not exist we just return it + return callback(null, namedMapProviders[providerKey]); } - return callback(null, namedMapProviders[providerKey]); + var namedMapProvider = namedMapProviders[providerKey]; + + var self = this; + queue(2) + .defer(namedMapProvider.getTemplate.bind(namedMapProvider)) + .defer(this.templateMaps.getTemplate.bind(this.templateMaps), user, templateId) + .awaitAll(function templatesQueueDone(err, results) { + if (err) { + return callback(err); + } + + // We want to reset provider its template has changed + // Ideally this should be done in a passive mode where this cache gets notified of template changes + var uniqueFingerprints = _.uniq(results.map(self.templateMaps.fingerPrint)).length; + if (uniqueFingerprints > 1) { + namedMapProvider.reset(); + } + return callback(null, namedMapProvider); + }); }; NamedMapProviderCache.prototype.invalidate = function(user, templateId) { diff --git a/lib/cartodb/models/mapconfig/named_map_provider.js b/lib/cartodb/models/mapconfig/named_map_provider.js index f1565c66..cea4ff39 100644 --- a/lib/cartodb/models/mapconfig/named_map_provider.js +++ b/lib/cartodb/models/mapconfig/named_map_provider.js @@ -152,6 +152,17 @@ NamedMapMapConfigProvider.prototype.getCacheBuster = function() { return this.cacheBuster; }; +NamedMapMapConfigProvider.prototype.reset = function() { + this.template = null; + + this.affectedTablesAndLastUpdate = null; + + this.err = null; + this.mapConfig = null; + + this.cacheBuster = Date.now(); +}; + NamedMapMapConfigProvider.prototype.filter = function(key) { var regex = new RegExp('^' + this.createKey(true) + '.*'); return key && key.match(regex); diff --git a/test/acceptance/named_maps_cache.js b/test/acceptance/named_maps_cache.js new file mode 100644 index 00000000..a2f2295e --- /dev/null +++ b/test/acceptance/named_maps_cache.js @@ -0,0 +1,140 @@ +require('../support/test_helper'); +var RedisPool = require('redis-mpool'); + +var assert = require('../support/assert'); +var mapnik = require('windshaft').mapnik; +var CartodbWindshaft = require('../../lib/cartodb/server'); +var serverOptions = require('../../lib/cartodb/server_options'); +var server = new CartodbWindshaft(serverOptions); +var TemplateMaps = require('../../lib/cartodb/backends/template_maps.js'); + +describe('named maps provider cache', function() { + // configure redis pool instance to use in tests + var redisPool = new RedisPool(global.environment.redis); + + var templateMaps = new TemplateMaps(redisPool, { + max_user_templates: global.environment.maxUserTemplates + }); + + var username = 'localhost'; + var templateName = 'template_with_color'; + + var IMAGE_TOLERANCE = 20; + + function createTemplate(color) { + return { + version: '0.0.1', + name: templateName, + auth: { + method: 'open' + }, + placeholders: { + color: { + type: "css_color", + default: color + } + }, + layergroup: { + layers: [ + { + type: 'mapnik', + options: { + sql: 'select * from populated_places_simple_reduced', + cartocss: '#layer { marker-fill: <%= color %>; marker-line-color: <%= color %>; }', + cartocss_version: '2.3.0' + } + } + ] + } + }; + } + + afterEach(function (done) { + templateMaps.delTemplate(username, templateName, done); + }); + + function getNamedTile(options, callback) { + if (!callback) { + callback = options; + options = {}; + } + + var url = '/api/v1/map/named/' + templateName + '/all/' + [0,0,0].join('/') + '.png'; + + var requestOptions = { + url: url, + method: 'GET', + headers: { + host: username + }, + encoding: 'binary' + }; + + var statusCode = options.statusCode || 200; + + var expectedResponse = { + status: statusCode, + headers: { + 'Content-Type': statusCode === 200 ? 'image/png' : 'application/json; charset=utf-8' + } + }; + + assert.response(server, requestOptions, expectedResponse, function (res, err) { + var img; + if (statusCode === 200) { + img = mapnik.Image.fromBytes(new Buffer(res.body, 'binary')); + } + return callback(err, res, img); + }); + } + + function previewFixture(color) { + return './test/fixtures/provider/populated_places_simple_reduced-' + color + '.png'; + } + + var colors = ['red', 'red', 'green', 'blue']; + colors.forEach(function(color) { + it('should return an image estimating its bounds based on dataset', function (done) { + templateMaps.addTemplate(username, createTemplate(color), function (err) { + if (err) { + return done(err); + } + getNamedTile(function(err, res, img) { + assert.ok(!err); + assert.imageIsSimilarToFile(img, previewFixture(color), IMAGE_TOLERANCE, done); + }); + }); + }); + }); + + it('should fail to use template from named map provider after template deletion', function (done) { + var color = 'black'; + templateMaps.addTemplate(username, createTemplate(color), function (err) { + if (err) { + return done(err); + } + getNamedTile(function(err, res, img) { + assert.ok(!err); + assert.imageIsSimilarToFile(img, previewFixture(color), IMAGE_TOLERANCE, function(err) { + assert.ok(!err); + + templateMaps.delTemplate(username, templateName, function (err) { + assert.ok(!err); + + getNamedTile({ statusCode: 404 }, function(err, res) { + assert.ok(!err); + assert.deepEqual( + JSON.parse(res.body), + { errors: ["Template 'template_with_color' of user 'localhost' not found"] } + ); + + // add template again so it's clean in afterEach + templateMaps.addTemplate(username, createTemplate(color), done); + }); + }); + }); + }); + }); + }); + +}); diff --git a/test/fixtures/provider/populated_places_simple_reduced-black.png b/test/fixtures/provider/populated_places_simple_reduced-black.png new file mode 100644 index 0000000000000000000000000000000000000000..e3cf10c3a7d33b5f121c7ad49fdf426e347e7984 GIT binary patch literal 10654 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 bCt3? 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 U4-=z*d?`RqN>Q>}!Z7fE0FjZ0a{vGU literal 0 HcmV?d00001 diff --git a/test/fixtures/provider/populated_places_simple_reduced-green.png b/test/fixtures/provider/populated_places_simple_reduced-green.png new file mode 100644 index 0000000000000000000000000000000000000000..b7e5cc69eb9e24fd4b873ae4c3116b6947488255 GIT binary patch literal 12391 zcmai*RZtsT(D#D{3)VhBaA|?!?(P&X?gVdfcc(=P1=`|J99rBxxCGbY?oRLkLEgT1 z-_`eC?arBVarW%ae`j`n8>6YNh=)Ut0{{T<-Ydyz0RSlfToeEn@Sibp|6>aPaB;ks zlh*OgIt>zyqlEo%5^=zCkO&>HWUsg(aX9o3XA7HaFBTixzVQ_w{u#&EAJsqeli31q z_|@l{0eW;Jt0`~H5)=&&aDYk2&@+BU1a^2miUm-d6@ydW zIsbD#wvW>G?D*mC==RR~(t#YL_$}&;jQifD)VJ%!?L}fpTq(|CFI#6`>ZBV+SLxEk z^pdud@$ca=D8A}sfJNZw%J0`}vctHBX+&J$;+{7M@fM6U4fm&XWY|~f(G|O&ChHI( z`^SxEm0zK*V;YPt&$2%9;GEr4@kgPd8@$K@Ow=&pH?G3(rPRZNvk-K!k*O*dF0eg> zl@_I0UYt4grc<&?>x*{oC;*zhLk)_I2$h?*c@nu{O0k&=vU9%M)n&X1h!;4&vpq3BmyfO*SBj2A6 zA2Bl2(n-*=DBYTP+K{8S-Cy^_vzepmEv}Q6vi_PE=uyxZ>kh0iLm&< zAWYyQZ-F}p{MndxOc#nZBrtkp-YiljSZ9xD?X z=9c1NmpS=iRa)!Zn?fs-&5N*e!U`|WDSw1fzsKwsZc;PSX^o1)nXCx0FVd^w5^Lx> z&y$w;!?m{~bQ{A-XwRFQu@%sN6P;x#>>zZHgSe>F{ zSn*Hv%}~~eusBX@L0YHC#l!xce+Zk+dF}sQ=tsA!D?}Wi8s0mMbw1Hi&o;#^yCQjx zUFrPtBpdV?Oc>Dn1Kd?fs+ue#BI*X**vpN`jRaXw78q3@Gjf(G)wo_Fs6-6y-4flc zpbNvBev&{`!WZ8n(2w3fy&*fnWjRG{moXMXCfR+XPj!gV8kfLmvcw1=I5em7W|O+b zC0c7Mb6ANIwJ&kVnlu3ucHfQJnMg7oAjyLd3P7DSG#9Cw$CQB`FNZvPb+rV)DcDv) zNS>K9`jYoDhH_tZye2RZdTq4GI~Xk1p33f$O&1x#3y2+(lg7)8D8HtsirO|V!(U~> z3NfBP<6N%F#H=6 zdN6YSp*`i1>eE|_vn$S~5Q(yo<1Zg8%P<`F>xidyWKGP4-%htOk9;{mehL!H(>1JS zfySNSlFshrWQ-pofy$hyl-n1uZbzs`V#}xUujcwuItMiyv1xNvR)q9qF0Sgw>w(l{ zv16w_bq#QbSG2=^W*U?<=jSP`RM$TUn9Es&BUJ^U)f{ge4A*;^gQ%1Ivj2+sFhyj9 zrpPdMKyz*}bM%pay($yFHpKed82*KCJHAnSpGi3J9<-81odotiEI%n~rd|6Q{4I`d zV@o3T!@(#|w(#m_o7K=;bz;`(#zIkjTgv>k!_2cv$Fye7qtw;EI-+@aC}!skmvlaL zZ?zeHIi9&F(&B&k%0EE2L5_H7g{x~g6D)97syp~Ej=rh&bT%E~emm9b^|{sw#>;J9 zaL|Fq+8g1wfkyss5);bW^kQ|^SH)9-*Zq!7$MkS#7YC_F=F@A|^wNMDQWUT6@amL$ z&|Y(1O^@lVY2`6RXLeR1em||eW5wq#(`LOx8d>X@%t=NEY~OmQ{%0Q7S76L3AHOn^ zY=9<_L@9~4)R>$2nHylkP?SddfJ__y(sxwa^p<98u^NTHGvjFg>eEu)k<`hbQCT9{ z?S#jM;23fgXjz$V91xLD0q|2erIKkq;o%-9nO!KFeEtw}6UsUP6j8?kzVIL|Z+?vK zeUCq|>^w0~a&Zp3llHizQy@&>$Eqtww@ef&Fk~zpQX>>Do;p!H*9~Bdi@5X%kx$4h zK@9R>Rs+~5U?Ywzz^gtO#|~lb)Kf|mN{N@PNuUn=!_}}|x!~N(g)VDtLK21@psPKk z9RHQet~+w}N7fk|5oi?NYvcY>=dahUtx2X2ctrE&-#*B<5k9M}z`*r0U%6Q)&OuHo z0i{TYxvrl7;FoN%UeyLBN!(V><4(q4=40aRw))i&_q|T*zcA`7N!vY08LW*U`;=)u zD4kCbOs4eUM>56sSrt6ydY}8&$o!Lnt#n)B0e2VP-YaDmMUfUaZSINUe7)_JM-tiw zR|s-Xe`8Pd*?KRR8dO)&kU(8MYsy2Hqmz7!VJe z8nZL4hcjhU2$GoL`**nhGB@q?1{_)xM}tZn_e2S)Z6Bjjf8hpewS`=y@;VgeY?Ruw z!oOMFBT5+Y>SiGcRl|YI=lKwu?f2vhip6UYP?%3YI<+_zvgUwVB}}TOk#O*Z2~D&8 zYJV;LMehQ;$2Zo95C?c6U%$A8XndoPs960vsi*;x zogY3pEER6x{E2;8fNWZN?K_`VetCXR?G!l7(6Ao+w90fOE*K`YmwxO{*C&K$LrdTP zz`^rjM|hm6=*Pns+6LwAP7mg_|7f?i(lehE?b=lLW!~OKd{Ti_M3)vtwb%;N6T51_nc%rMlsU!Y#F$o#b_DT#+qv z?h^+JkGmiLTJ;$}yG8?Zv?{lS=AZa1Lig~s4!2zicl>rJhVwoNUM`PAiC`qL7l7!E zCGya`G3}El%PixCKL+w4JWxH(@t)Vjgvn3pPl?SrIx0s+te=LX!-nNda&#-5vPV%I zT3NFK%vGm@<7dhh`2-+^45tikVOJHUJC`L#MI+e$J%4ztBJ~rua-c?u;y`e<1(td@TrB`jnZN@(M!OtrB%rrx-&tZ>aXR<* z3TiI_39sn#a@t7Y_-`_+NhjdDWUyukR;OK5!+P@2M0D1$$5{b6_YvT6=gL@;1`U#y zEy)U3=y+n~_l;7WD;sPPv+`c4Ac0ydSjLY?owDCasrzXNoRoB!C3EjLPv5oW%!R2g zzRv!uEV(O=&PSWe)IBOVn`a0QMp1t}*n`?=Mm3MwdLH%VKCoyy&GzF2e@{oJM1kp- z4YW5O=Xd?;bJ!pr7S3toD05*uA6;y5@63K++di14o4Z|okhYMkCF;s>Coqu_&Q@DU z!HKvi-?v2q_6*8c+xr`bO<-N+vM*Xd$=imB6v zwQ%n&x0z*ensVBpIlp3a5}UU}EqYk3^?)~wMkU8YG~TV;Xd85@U-GDkOsfxJV1D7- zk2&X#zUHqtP|R6PmuR8;nI7uCE^2^SOBdD7?6ms}!CFD*|4Y^t^ zTdOILZWFl>rzZLCe|8(3ke>^E;2+e+_@weT0FfyJ^s#?>Plz_}WhXLpD#b9?t{ShG zfr=_Y8B>6aUlikKJn-qO+c_M|D;FJ)g`cVP=N@o>z2#p-guNN->P>m$D_Tb!0%_u> z*`;zfUKjEpSxdQnP6?Ez(A)Bf8KME&3G&2o9?DRchj*7JxHO_!Aph=71^&o66Utk=vTI4Q)!MP-y1r_eO_M|*4@UyH=F$^xWN<%51 zclce^T|2ioHHy~9BPlmd7t&#b{pAu!YxcAItNxwO2TQ=)v?cVoE!RAvVB%2+rEsf@ zxi63sJHeD2!gHBwuDNUsWX)QBA7YEPu%T&H!sZw5!sVDfwh@Cs%s2O=>J0@JWb;~YV$A14Ay{cd1%tn3ZjSifXY63!w0KOp2+zyU=^m{g&;M;7wuW>mn^k10B>V=n%^Pseg?0C# z?`Ta0R;HDv=L|rs*Vb3pZZ@Rv)&*n7rVo2vS8qUoH`U$Fbe=AZ*ZJVm`qj@IS+N1X zXXagL(sSjM6WF}P%B(O(H#T;gz%ixg(=B|11)zW7*n`CV)**b}zgj3{r*S{^rlt>l zXPW0SO|-jda+1(rV~wK_Q0**pL(-er z?U9f7L#>5YD7EBQ$iqt!%%qE3re>GXO-zoJrg@5j#ab*cLJJ;$26|gaSEz|x2k*)? zWj|@RvN^^>Zd2;)jCs-DRWTH1QqbO;L%$MUiHHFzvrhpIp=JK-_laMCDF?i1lmHp?>a5qGdIinKDkIv(RqQsz!GATrC&hO>lTqoabYX{J!ez zu;9{xnkt?Xe^RK4kHp=G2e|>6i1747{FXdV?JnQrkg@~^P$Ay=EA4AmE4kmSdh?RH zX!cgRS2f-FUZOkYxMsLvE)@cd8xOqQ%L)CTdH$0K+D^26F1~%0sjQ{4-$b_7Zc7$t zDaOY&Jd{VTD+s9JQ1Df7IqA7|ON4w|k8SiwQ3~MV0HaEp4R$FylQvjj5!uR#rT_6X zOvEc2id}0FCo3uRGzgiK1cubBg;Pv&p`Na<8tR@W|A0spq_B-+VrKW$6>i!LX%-c& zKOOIA1qhCh^xzWyQD?VSfdOs34qf6dUKO1(ioqG=CpZL-2=q}hJCaec!5QdGii{h!>efUpKu8a1=Oy*|I$JzOS6M9!} zORIO;lAPQC**0cg@<+3rDaj~KbO*bXN%e9z>WgGtBjB@7HVB{lNv5wO@3egd{ojx$x$Pv^Ta*QC|JEYyy2|$DC=@aCJaI^X_8@yLp>9zcR}x zVO&7=>cFm^#R1vJB~Q~I)2Z>Rs386=**f)e9h!OLDA-N@Z3HeVH&(v=_K@Ja3r9Wc zo^Wg9nCV7LOK#P~8mYR(x}I(Q_3qinQgz`0|5wl1-0JsF;QSg=4oAgD>hpf13qT4B z+iUyG4U7*pG9JwJ!6Nn_qsV>nG9F%EGe?DwiR@iy0sbz>_6v``UC2lG7YFgJm|cDZtCA+yNYCHhuMTqPD=lt$+VSRzpA{E7v~D8LQBj1G|G*R6&dcZ{*;pS z>T0_GPj7*D$u}ttzuooT|@m+FIR8)WInCW66Ne4AmH7;@h*+u?yV3d>ssX%Gqs27RmW5qBeC z!S3PxrpH#cy8rJBMDF;EKEW-Gm5JA87S{+kuxiF&57~P6sjqt;j0W1ujula1iqDX9JWI2GFDr zCn!vCX)x{mX*OHS86m3URNZZeVRQu)O`L?Ug=>;7CT)QM0smpigG&fns5Qib)$~Bb z&Tk8I8rZso&N|H~zB|uG>RvB3#Ht0V`7aSBd7cbm{HcZo{b~-WW)ja;Ja=Hlhz&u^ zdj6iJYakih-(`JyP}5xa>&B6-O@G4yM}yy%H~^d5r6(|&6M(IZ;vySyc;W~OEN%ng zH925{z9rRf+GrxJPjl%_IZR`}m7WIB$WR0ne>p6A$v|h!j}U&z=}Mmps@TEZv)uV!F{jGIewH`nH7nQ*}aQ-Iyjk%LtpNfRm3NPWG#vIpO}{78bL78*QdJ?P4jE{iixQ9j`{ zYUZi5y9<@)YHN3iTXI<5@dPNXQL#^9z#|A>wm0V5<*J*zQNZebkcVRh*kW9Cwhgi+ z7ya}R2v`lAlQ(?nd!qmT4G0qP#+@wo0k%KWmeN+H3J`AnrzM$(L=j+rCrH5$7z~g* zMGW2oM^o#pI3K`TP|Mdt+MMMwGT_es%j=PRz~UZG$X?W0oyi-w>Z({$1MD& zn`4v2MUq`s1N4t)io4q(o*np%mcB8orddbpM7mS-vOI?<4QL=&*rQRMZ>jD zL`e=6I7p+7G0y?(ZQe6RE;|FPH+$MCiZocGRn@0YXM#t7a4v;_21_*4I)!ii>tbH* zA{UI8i`dq3trNvReW9C^rbmHNL?0fnUHA!XH)Ue^RspKa&8Qtc^W%bqF(u&L(9syX z>;Zln*vR*@&vQNzghPkF2$KpKy95>pilFzUCSb6TH)@4eHUR9JYK7A z+4D`;J#OaWoP2Cr(k304TZEx#Kg>gSjQh^Qocyf@bLC{Y6o8xg6HXX(?M~j3?*tjD zaoQ8aV(l0PRz1qIs{DV#s#}O<}fr+)?P{{e*tIEQIU6T z?d#z~`iwgO4g~T525T{MalDB_2`nHlOjFMr=;-a*{UR)YCs8F~Ce?`Df%TD$7;Q0t z_Q>x@23a6v? zs%&3n>+uqi?R=8n%j+t=QZr<@`JiYIAnX$=!wmB2>C2Q-{YFbq26P}i2&`0Bp7am# z%4<3JRCWR`d)}VqeRu~21%e|)jTd`s?w>n+8O!|JT#cj&Eb%irZFaxqQ2O0K61GdvzN&g-Tc-D)s_gbHO3gUtLpvikxdAB?T|NgGl5{@f!OHmQkshR_``ILZpnK}* zVANZR%v<;`cA4WQr3j`in^`aVL?Cx_N3PR;mq+^V7-&4kV!qUH%i_0&38#HDwPoz< zu2qf+R7n4fJ;zz)D4Fb}E6 z&4BrG#Zc5MN$;pPnsa<^g8bt$bF{M_XN4C&i%M0Xcs{0JWza4P`h(M>c;5p`F&{F_hP`rQo<=t^*D3EJ3$MWccUC>+A zD10Zd#ehrLS*_OVGbv1FV>V^I5y7y%Zwdpn<&V6*gy>;9`ZdBYy4nuEx<2$|{w!x@ zzQC93*%vPm^jPChAT1SR;{mMyScj-%PG$`E)`{pIW2mIrRy_6yNR(-Eezp&WQGFz& zuhbp(TJicI+Z^*C<#bz5FwwRQ)VOl4ciH|T>;cEzKY+Wm@XTjEz#rwvVhsz!dB6Op z-|ZotCI+2@y9s<~O;mG;!Vh2)!B%<5o_E^ewI(=v-+UfA=hGECC1Q$ z7}V&hk6aJp?~g6WA?wnUsq#=H-Vhg*Q`Z+q>Uc&BdqIjGv8BEg{)@^pbEp zFeY^%eR8`_vWVf3DfP~=As!bg@7d#xc=uP;>b~9AxEVb=w6S9P3%4?PTHg_|jK}!G zt@K$Nw9J+H&ZX%-yevY_NRmsk3!}p+nX=`HmUNa%1KF+$lUy5&NPT547mWON?ED>y z5?uksT54A=55%3{!QJT+AnGSN23^bDw~O^&m(NWm&_9hw#glRg1%;@I)B67hAZ|qV z1aWJ>$jg!+#~e3R_|JKabU9lAcblgtR&cTz*`&SWTHyP?)^~GA-G1DeQAci1W6b8K z_6MA5>Hac}@g)&X-zDvcHRe-UYMK!v)j)7ULlG-0yGM&nBLNjaYj~1j9sTuF?ZT5W} z&AS5i*TG#laW=z`pW`t{WL=-262av47}A;o2*+hs$TE3X+VOt#lcIWZ+$}?m6>OIU z(m$>ITj_WQClxICDqEe+d-Kia>H3w<;UTI)^FF~a`q^(uLp7zo&s!D!k*gD~RpA&( z`3)}aa_yMaiXEC}!#!S$fzV8_eMi$S${iBp&7}U$eJNC5zLLL>L+19$yJ_BJ7;h*}eailzeCq?ZYGZV*q7g<3WR-%*;^*8xFH$S>OsPL*gZA@mHD%LUb zh=O>K?G5EeD;?LS`$jy6eE~uq2mC@%Y+x5ZThotD-I2Z=enFwP-&ybb^Ji1u!#d4v+J)EN!4-#|-$6dhKH)lF zPTZ5spPry({5%o^vGj*oH!b z0Gu{+`z;P6#8WpG{DjcroV5XmOh7xLevMPmIQ6OHXXOiFbj^5G`PGu>Iosq40;=AT z`l?}DCr*}x%#`^sv~U8gMPGf9~ExEmIluHftoi!oC zA&yd|4gp)=AQ|;j1I9KN+|)6)?qPAC4nYy;Ez5nCKou0=LOQNEfZD|=VfaU+w=^CQ zJr(m?l8&G5n`R8|#nV-9mBp^La(b}}#k%D6x|02=0jG{64zx{`_ zHk=x#YQ0!lKfKmuCPaxZTNn;@`Pd=B@R7*6d7zA(GCc6y!7xCp6=mmRlTCS>8p;ki zV}pRY^(yXsG5!6qr&Ukj%XG!ZgTSwB*(35eySi|U%?NWlG-@QOsbYwDY+UHK)WS>5 z-*$owp82ESMrJ?w-c^dWqAX;$y5r~3IX;WWrC0WgUa{XTogPH`ey+LF4W$h~TN6{& z#M}h#g_9g6!8$@ytBtCfVP&kRILHJzU7CK_p0=^Os}UeGlChv;JZOae(BZc2r?DkF z*3K#wl=#{#c)s9IZrNj`Zsq!-{4sD_A2#NbK!qFV)_=KS$?#xSe}8i51mHAy1@CTR z1>7uNQ9&cSkt|D+Z}HK4@0R!-ZrjKE4BTiqZ^;AJi4ETGgRii@kd6Wt6U4khgy^gA zS%-I0SElQL4HLgv)3};bOffRrH{s7{y%QJdwbf9X{@0^^<~QHCG7eNo%SvoTOXG;C zR)Geq!eZNJTHaBi$>+AdIIT+k&f3{9bTNANVp1pybxacR|~RvRa(z2EnkHT#kakX4EYqu_#Zr1UhSb-MCK^74ij%^DE@XQ84uvf zTw{J#}v|PfH~`aDwEzdw3dKC#kn>XEW`L9+jSJR z>S)!zy`c@KTonwd5QU_;}sEv`NY|(9@!8BMGRpt&-L`zd)s#LRPPW4^W-H0&t%!Vf=W{Jf3f=u6Vt*1jf zEqJ?n5(NQPe1ATnQkSO!X%+##gQXh@veFs79iB!T2~|f+W)5z>T!X`LMcm8;>Nka-L;FlY$Ou}lnboCx|By8b56SF@wCEE{n-E@}U_Fg#EjD-gsE=?)`&9;8g^+Ww0*Nqa72(bar?h z3oCsP@r&yu#iKuA-6R+N@WZM2@l*CGbEwotd_zz??Z=mXin0?+qKW??X>|;EkUWhk z-7netaHCqzNcOz)3+pWGD7G+;hnC}ht;ydZ1>pMr4Ts;y`17<~M4 zT$+OSxPfG!S}OyZa}OB15!I58MTWj#Mt3^hRG)Aai*gc3bX?}R7Dyrh=<3&~DU^Ab zv!C}HGFSeygH~$sA_39iToJ)RM@N-bYy`RG`+choXJl-D&5d>A>a31%x&FiQFZv?d zE`{b(IYGV^ha}$FbdZoq=#%X?;083BQjx^LBH;5dXG`4lFaVB$#PzLx+T(rz|M#f; z^36kwP6Bq^P}vF8q-vC+J==x$;2+;s!AhZLfi(}bbau$Ccb5(RWh@~kjz~Sha7qG* zLZeKS&yaP@Wf1x$B3<8-hcFa3x$f^(J7J9hX|BI<6Ip^+dZ-Z0qX)|b@3yo)7zjlD zu{DD%H+4n|Fk$-Q?Tf$JKvRJwqEb?vqpm439XfvQm!I+Ed$(}|5N?7K0-AXE^uABe z$tFB%#MqkmM|rjIH>+PfeXKE|Wd)kvvQ{GvH4c19)sVp6V%a45O@ zJe~x;xM*)M-TX{Xu9O4b+8Qclus~OJPU4SSDH&X8V>A>w3x2fo;3|0yyeI;6%8=4+ zyx$Qm7>bxBr*jz62~1BmT$EIV_Z_Zz92-pP?^3BD6R4W84JU>2e9B=%C{4iKH1MPCbq!2@57ceLiO)gh!Zy^*( z2Y2EE<8+ra4R;@+{ln(O!<2ZA8vuEXT@Wrx@SGE&B^US>Ou%|7p!RyBcsiQ*e-Sz* zAqTUr@FN`Dl0A57IZ9zeuq3%KcZ7utiqm5fk%7)PYCbWeh6Vd#1A3&OT!ATCtu6bMGeOA2ecj@$;7g(e&hmsQ+9Oc!;dIjE}*U-lfOKNWI^wG z3j0BkL8x)k9sRswn8mnpF|p*JfG_DtChi*2cqe{mYx)QajnGC5)tOP@dxSF^K7{K8 z*S74B1aFP7EFH6AM0YhNp%b73hU8_yr48B7PZs`%dy0Y%V_=QGk+tVDpNT?;tI_|% zYs0Po8sLZgwf5KW7hDx{YauN8m%|0ym~5f7@7~&6r{Uc97jr#k`Q9@W@!K^8sCdrN z(?1gN;{r*a4JIb7Gx}RJ!hiSIA}AZf4-$Q@|Iiz*mc^@)t8gz7tUB}$n(P1a0V$$x zJ|dq1TO`BiQR1L6spy5oSd4MR%7_pXulYgPhSo6s%mpbx0NfHj zWQFH9qf>M*km4EL{-fodGFJ2k`)om747sE0TSU|eCXfY54MoOHO0>{V)s3=P}c zLD+Ekm@{UjMNpg*;B81%NLw&>N|rGwqLH`;$c+iodHhtn@$B1px@?Nei}17QTYBwy zCH958381uF(*S--Hc_sx0rZX67$gT$;DeRqxyz=WQ?8U5-!v(%SqEB;($bpOGr(*v zDJ`*jWoY*U?74HS!a#fqq+ALQi%$|!DTmg7cDF&bzW4O3tv2mkL`r!%q<6lozPpO^BxLrWZ` zxZKY+z&gUBiB>nd71>dKc_bX2nutK%A>XI)XNl;RLNP**JFe6)yB3UgV%XDl?7kfo zd29Un)n46$P(|ZMZJ9={+9K(b{ma`44OPe<81RM8_R{JVuTuG8Ja_RvUi3~O2i#AZB1$*!pMr(tnz^zpjRNUc}dKoyc#gqIYV68}`dh z0sn0vrP$cDtqf>d^Cz0wcx0*b{rkQ>u7_EnW>$12DGy>l0jrnTGXSD0Tk3G%5?d|74JB(o?=qkmFd^^X}PWxyeQd zJrwmsMP#?R(jJwq$&rgvNUlxXOp@cpsm`ex57-O*4i8AE&q>0-rCI%7?bmD@s~#=? zRMhRNDV5_NZ|B_42<#1`yI!~YQ#{ca)b=k~s^_yIBP?(J5%l;V6Gii%D7;|&SJNd7 zoOJDfG6Mg%%X~@tKCtB1&6Q=0GYJv$R8jz(wyo)4?qsP!dj4=9RL9MUkU`^VEq?N-OKF&0A8T7 zqMV*r&Y>9(j6#|0iH|nQw8fp>eMeBfz}nNy z73}a-j6Pm!Jpj?w?7DWmwBq0P_iDeh!$W=@>O|doYrDld{T0WwTIy{?Z!O>mbnO~8 z?y4RT*mh;eKsY$oyf**yGDUy{-~jTa9!1<=HHmJhr6I4olu|&6d%mLJrNbuTT6TdnxoUfXf`W<4t&SZ z$EbR749$6c1e!hW!y-p>Yt(w4W5eE5c^6^*qMW5h5u;O};G6D3-iCCse`Z@?L~ntX z_PWN>Pg&+`Z@Go8Fo2(#6+Yo0M}D@l=&6ZwV7%8r^8J+#IArerTbmgMREz@+-c}7? zEZ96yv3Y11GzcN(dHdqV@32;!9vfRe=7|jZXf#l!b2Q`?)A5zvq0s*;TTUwzJOw%? zG+c-$EGVmYQ(_Eyz zKhuuFzus|0C0sL++6? z0E4(NOkG{YMVKri#txM-YTt@1j+&@28r;qx*;an65v0v)^Ogy+#vBo6bd*7+>`c!^ z#S(={uw(ECQ~^&~p0gG_i=}|@ep4E@xi289#5CPbdFXaig2%x$}FCZ_Hxo5QKYDm!k*2<%@h%NrlB!%_mVnwH2aal;+NQC447quE*aBepehw zL^jHadDj~J{4skx(3C2_eteX?<#Ny+b8{Ygc!$0Vk!^+`k?VZkXBYe*v_^;l>b5TdMLatR(e}t#gCj>R?7Fd z2U&t%M*m4vX=Ux)b)yBr>tuyrr@Xa@yQ}-+Tfp%QRz;S9r|#_RSOnKr?47k(ki-g6 zY?%Dwxan3l=AD~k)n98E`AA)cq|)n#zq;rhIePHr9sA%2QZ+kEQ;>AiTfO{8evVlb zwF;)P683O@!rZHlwaLXrxk2ZFob@nl$*M;QIUvJ`9 zEz9rX`=}k4g$Co;UE1TZR^$QFulb*5zBbOol1F4yVgld!4jtfXxD+RUC=}VPDWlop zUle0hFNE~^3PlMQKT@9_P@;X?fnNBIyp@>aDD%Kew>7@|W2$*Z1N@No z(^z{W?VBP2!=dOMlDV6k-$$%YjPItUpI-5}6+BYy1iprnHrSWo1l2zmI!;6qx?Zw2 zYMpIvVyEZc+3$hZi>`E}ms|GD%LX!0OWTOW^Q@UqiEEa%PH)z6O6n^UC%ag3`RHtz z#0vwsSO0c0dQBXTW?bXldFL5^DHSMxDZE~3G6xCGPW#tWniBqBZ(&A+6vvo$7c@afq99s8*RX@-}t>blpMYqCKFm0|;c9 z>)AFXx~u+0&_4H8BGQtGzFW3*78ux9eP8HD%#0rhnVTJZujjySb~1C!^Vr>JRQYDH zJKNO#%=~);H+tY4go1}jMo&iVHdB=9)YnwaEF-mZhv`N?lXaxe1f{TTbH0qfWC6## zu8$-#I>Kp>xBd%5t$PA41+T}#UwK~*58EN@lSl=2F*)(dKMu$Zc7Cu1W%l~|yZ!6( zaS!>@Di|_A9Iai|5bs?NvO#7FE0v<|46}c?{gsVXVs0 zSSYgJ+gG^uKO$d+^PasiqT}#O=O2kYvUw$S?54}Z{OTVqAxn?FZQ@Zsg_m+ZnVY$z zZ$GhFJ-G63^JJEP$M+IfOdl##&Oaf#^Fqf5p1b-(XKbLjzDfO0frYpRaxGBL{MY(d zYUX<$TTG=f&_WnV2Vu2Tv(L$Ta?VRL9nuwyyc(XX%!f%YA7uM!RAR8<5kD=yBoZF%6ke%yzr7}aGC=3wUO_VdUoB+O<%_DA~o_pl0DYF^lBxE)#{hV zfYA?j0$1+^|AFyV!7=BS(@|C4?+NNo^F5xtE1mUTutOmHDS_#c}%naCNNaudP2JE9XG5ts201C@7! zh3~6NptKnRQxZ6t`cKz=$8`X{%w8iub?A@V<=uI`tg}#ohXuWNYSInW6LPJR4U^VSMGsg3 zb&w&Kc&D1%a*(z2{X+p?PLo|1y`LD2Ghf|B47}SiT%iUV2f;sYKn5X#$I{{@uNQTc zIs3~kg3VByRGBgp!$a;O!(&3!8&pK*2h>AFd$-mtF`i)F|?!e%+Mj z1P1k$kh0z1FrmfzaFT#i0)Ik9kqeH|sXZH0^~9j$eL+<~H|Cty8bi+6`@VWk>P!cT zy`O3C{tirl5y3>e4T@jK`tTq&9rLJ2i4(5xs6M(^ZA6oW+HV&U?t4_-N~KklMN9H@ z>=@FTbCvwlnt!obDl`EZ9Rc~j(Upr}Vi~W{f()L7y?MFHUYgmfXEx&b(*k35S0YtR z_@YNRzFmDw4f8W{aNn$L#S~{3zF7=ZpCG<-(bsX7!H z*vduQy4KhEjiKUh)5W;XK~>8|INq5yR(y4;cjvE@KU9g~pSuPW*_piDDyT6d8zs~9 zTiZpEY2$2i)4!f^BkqEQ*4BDH@>!M7ly_BJF@%M$#rAk5;mzm_68snsm5s`8 z4!X;EIwCK)w&>b+z(13R(`*O?17Qfl<<%NlrHG(2J@#Ik+czhRS>jOWe@7 z0C`hc>vEyZqMb~8#cc1mQgf=7ziei`$W0L2Kps+KS_;QP0v9+fMeGI2pG{`<34wc}dKB!gBa8_oK*_?~tk(wQPW+Bjw7_j;?T zVTIGLPvqIs3Xvf@so7&`$uU`yQc~P z|D6f8ugH;J(kQ7ho0T@T9jjWht*slK0pt;161LMFb$<#6mr#DR>^-<{BZh)`ZxM@+{(vMk283*?e*qF zCbsBKZyql6JrsKj&DEUNmQr!$cbq;YAHkmm$i_Egt5a;F48dA?g3owO;p&~wjMEL8 z(-P)FB|Dr(@NN(7qL!5WpHyMBBh=>qJd@qAx5a--Ips&0(h|f7S6kE*Eu7KZ{h~OP zG@Bvo!bbhVz2vjQy^mZSj)Lz8^OsvDQ|!_)FbkTg=b+0C+yL9I9!>Q8NV?O7CwCMq zteM|}Gcg})W`#B~=9htMds5fv7Uob_BfDuzgD2M3F9JyR!~GV1HKSL@TVcNMrU>jh zuWAjpP|@uf2o-0ae)iz0y%1YqRvTwyX{NUzFx{7{kb&1 zDZpIz)BXq&0E~C{cu~c&#hvs~F;M*do4yE)i!w* gPmaeaWhY1MEg3RI}LPOCt+ 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 C&Jbe& literal 0 HcmV?d00001