From 92a8a3d34c545ef341875fcdea35b0be62ba6cbd Mon Sep 17 00:00:00 2001 From: kangax Date: Thu, 19 Jul 2012 13:34:32 +0200 Subject: [PATCH] Add support for specifying which modules to exclude during build. For example: `node build.js modules=ALL exclude=easing` or: `node build.js modules=serialization,easing exclude=image_filters,text` Add support for stripping "use strict" directives during build (for compatibility with Rails 3). --- HEADER.js | 2 +- build.js | 47 +++++++++++++++++++++++++++++++++++++-------- dist/all.js | 2 +- dist/all.min.js | 2 +- dist/all.min.js.gz | Bin 40045 -> 40043 bytes 5 files changed, 42 insertions(+), 11 deletions(-) diff --git a/HEADER.js b/HEADER.js index e2f6dfee..8a3dc986 100644 --- a/HEADER.js +++ b/HEADER.js @@ -1,4 +1,4 @@ -/*! Fabric.js Copyright 2008-2012, Bitsonnet (Juriy Zaytsev, Maxim Chernyak) */ +/*! Fabric.js Copyright 2008-2012, Printio (Juriy Zaytsev, Maxim Chernyak) */ var fabric = fabric || { version: "0.8.34" }; diff --git a/build.js b/build.js index f57bf4c7..84c8ba0a 100644 --- a/build.js +++ b/build.js @@ -1,13 +1,22 @@ var fs = require('fs'), exec = require('child_process').exec; -var modules = process.argv.slice(2)[0]; -modules = modules ? modules.split('=')[1].split(',') : [ ]; +var buildArgs = process.argv.slice(2), + buildArgsAsObject = { }; -var minifier = process.argv.slice(3)[0]; +buildArgs.forEach(function(arg) { + var key = arg.split('=')[0], + value = arg.split('=')[1]; + + buildArgsAsObject[key] = value; +}); + +var modulesToInclude = buildArgsAsObject.modules ? buildArgsAsObject.modules.split(',') : [ ]; +var modulesToExclude = buildArgsAsObject.exclude ? buildArgsAsObject.exclude.split(',') : [ ]; + +var minifier = buildArgsAsObject.minifier || 'yui'; var mininfierCmd; -minifier = minifier ? minifier.split('=')[1] : 'yui'; if (minifier === 'yui') { mininfierCmd = 'java -jar lib/yuicompressor-2.4.2.jar dist/all.js -o dist/all.min.js'; } @@ -15,9 +24,15 @@ else if (minifier === 'closure') { mininfierCmd = 'java -jar lib/google_closure_compiler.jar --js dist/all.js --js_output_file dist/all.min.js'; } -var includeAllModules = modules.length === 1 && modules[0] === 'ALL'; +var includeAllModules = modulesToInclude.length === 1 && modulesToInclude[0] === 'ALL'; +var noStrict = 'no-strict' in buildArgsAsObject; -var distFileContents = '/* build: `node build.js modules=' + modules.join(',') + '` */\n'; +var distFileContents = + '/* build: `node build.js modules=' + + modulesToInclude.join(',') + + (modulesToExclude.length ? (' exclude=' + modulesToExclude.join(',')) : '') + + (noStrict ? ' no-strict' : '') + + '` */\n'; function appendFileContents(fileNames, callback) { @@ -35,6 +50,9 @@ function appendFileContents(fileNames, callback) { fs.readFile(__dirname + '/' + fileName, function (err, data) { if (err) throw err; + if (noStrict) { + data = String(data).replace(/"use strict";?\n?/, ''); + } distFileContents += (data + '\n'); readNextFile(); }); @@ -43,14 +61,27 @@ function appendFileContents(fileNames, callback) { } function ifSpecifiedInclude(moduleName, fileName) { - return (modules.indexOf(moduleName) > -1 || includeAllModules) ? fileName : ''; + var isInIncludedList = modulesToInclude.indexOf(moduleName) > -1; + var isInExcludedList = modulesToExclude.indexOf(moduleName) > -1; + + // excluded list takes precedence over modules=ALL + return ((isInIncludedList || includeAllModules) && !isInExcludedList) ? fileName : ''; } var filesToInclude = [ 'HEADER.js', - ifSpecifiedInclude('serialization', 'lib/json2.js'), + ( + ( + (modulesToInclude.indexOf('serialization') > -1 || includeAllModules) && + (modulesToExclude.indexOf('json') == -1)) + + // only include json if serialization module is specified, AND if json is not explicitly excluded + ? 'lib/json2.js' + : '' + ), + ifSpecifiedInclude('text', 'lib/cufon.js'), 'src/log.js', diff --git a/dist/all.js b/dist/all.js index 301b3eb5..a3220a54 100644 --- a/dist/all.js +++ b/dist/all.js @@ -1,5 +1,5 @@ /* build: `node build.js modules=ALL` */ -/*! Fabric.js Copyright 2008-2012, Bitsonnet (Juriy Zaytsev, Maxim Chernyak) */ +/*! Fabric.js Copyright 2008-2012, Printio (Juriy Zaytsev, Maxim Chernyak) */ var fabric = fabric || { version: "0.8.34" }; diff --git a/dist/all.min.js b/dist/all.min.js index 522a34ef..bea3ce4e 100644 --- a/dist/all.min.js +++ b/dist/all.min.js @@ -1,4 +1,4 @@ -/* Fabric.js Copyright 2008-2012, Bitsonnet (Juriy Zaytsev, Maxim Chernyak) */ +/* Fabric.js Copyright 2008-2012, Printio (Juriy Zaytsev, Maxim Chernyak) */ var fabric=fabric||{version:"0.8.34"};if(typeof exports!="undefined"){exports.fabric=fabric}if(typeof document!="undefined"&&typeof window!="undefined"){fabric.document=document;fabric.window=window}else{fabric.document=require("jsdom").jsdom("");fabric.window=fabric.document.createWindow()}fabric.isTouchSupported="ontouchstart" in fabric.document.documentElement;if(!this.JSON){this.JSON={}}(function(){function f(n){return n<10?"0"+n:n}if(typeof Date.prototype.toJSON!=="function"){Date.prototype.toJSON=function(key){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(key){return this.valueOf()}}var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'"'+string.replace(escapable,function(a){var c=meta[a];return typeof c==="string"?c:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+string+'"'}function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value==="object"&&typeof value.toJSON==="function"){value=value.toJSON(key)}if(typeof rep==="function"){value=rep.call(holder,key,value)}switch(typeof value){case"string":return quote(value);case"number":return isFinite(value)?String(value):"null";case"boolean":case"null":return String(value);case"object":if(!value){return"null"}gap+=indent;partial=[];if(Object.prototype.toString.apply(value)==="[object Array]"){length=value.length;for(i=0;ifgR)sp-y?I9c;xR^w0WAdI6ki*5WVpSeDtGIcLU^~y?Vfi(>#n-%xt3flR( zoPBitY4CWoq*z1GFs-a%$_asFiAT!4h(ALK`PYpba)mua(_qC^ot_H2I_rPx-GBb= zy0(Z{-n%RL%bn?0yQ`*njDu+c9r+*trXFp5w4FW)xfAoh(WIiLa@vjVgUw`dw^<{L z_|#&7ALB?AJ7LUfu3tM|C~I7MoK6gUJc}1@q<^^k^sBnho7O%}mD$FhfUJF!bpa)R z;DTqC#j-^}1Sesve8VMA@?G3$;QDUN6(VlycpLs{rl@M0`g0!t^}aXQc;093go;{c z4OX8irMZv5lm$#&o|r>2V5vI0Kbm+SY{H0UjN|28e-rc5b9a0a_){_W4`%p4RchYF zU^4UPhy8W48uRe^csB?ln zaC7;?_$~c@H{5`MPa5=?;qRLtsq=<9-?ymqJ#=P#hQG5J4#8tKYR)wtO`Nqe_Bd`j z9J1jPZuN9I8$SIogT_y@{|6%G&RPTO0F~BOJa()-8;(IdL-^I$Fs5dVO`n>7J~n66 zoMAJhX2`VH?6vV44)GcWhcpO}R15jq%uV3yCIGF8NUY$Wvg7NX6UDbc!;{rArF4o( zP?>Igjy4dyOcfB@~m_<>JiR-MR{z3MImP8ooV zpyYIbk0)_pT%S0erwE!fJPysMY4qsElZ8^=UENQdh-X|iB*TTk1%OF^06y7n4v@Pj z0n?Ve7CnQZA7BD;ER35Oav7M&7O5Z!XvrZ1y|koH01M0%IA6Df+M7}WmQ5`GM3@yH zBK?rFUVDk$1vzGmO=_JmbdnM9O^8-9TXf7>5GpRHwR+V3~z%Q87UBxoS!6ko?Tgh|2N% zCtM;7oUfFoEK7C=T1F>d%9E3}=X}xEn`og3?OCdIg$`}h;3NhRz6Ecc%IpF*Ut+kH zLM{ZjaH3C-{%>Kh=3$%&O(r01ss8typO())mGasD8}b1hwm&JK^pt#mN|uY(tP6g+ zv*ajGs7@9kQ1C!H&rplj@R0tAc4N#Gc0sLtFM>n)Nds2*h1_XQie2E=EmmVvL?_nB zbwKV!6KRUNmJwzOJ*0M78EK$$)bn%Y#I#h{!{KO7%ImCj5=`F0;IZcO$J%um!m(JD zc}z_u`%!5a)Ao!R#K%;BeI^f(W5iF%f+h+%#QZ4+F>Kv!79SppK>6r+%aY#}^B6t; zgD9c?7e+#KWCOGnoGdR0WTdc{BWo*UJ>?#cc`X}8OOc$DCw(cRAU7=O$FU7={Hc-_ zz}_%Ixd6?B&=3WG@=RdzR7nA(!~f5sJBqdW#U73{W1kMA(Z#EOX0dy|V{!UE;^iQ`t~Rvl;qD$luLxnit>HE=o19 zGEuP(lT-#pCPds=OTGW;qXkILG%=3X-B~0Mt!wSQz?t%?aj8v$)f#o%xD-p1zXnNv zfx33)JX!>g1q$l@SrrYPgL8g`iFtemuF?eZ(usq~ zZBO0*E}fw6NN1o_n58k)7+_~^W;q!tJyMagVkHrY)IIJ=-gDOm%`g&?fAr9va0gO1 z4>Y!ScW3SI+#NUaHIuLhLw{+U0^=f)IGNKuVZH@)J*PfRwKOvo4p>Xiam^mccY88{be{Dslzu1`-?WJs{jFR zG%+6+uE&+c+Ufj>PhcGon2=Cne+#Tj?8{M}A9PYxJMB|C!l#(RzhwXs-SX)>Rd>-h z`>-U;l9)J^8u{0*9a8>4~S_=;7Q;G zPzR)4VWYSVlluvTf53;wXLyXgO~^*}u3jIF0Pqc_`o+Szj;R_gRc1(TQu`FNK*F0gM5LU1$$AmNkZ6d(N9aF_<`{Oyj6g8p7FZ|1z9KA{oD!ObWCdtd?b0W;(DSbGv+;8L@boNa z?}Gh|$H9{xf2}5P@Mkgn8Gv6-QfxXPVP~z+qD32srdV|(uXAePUCbg! z$k^;e6TJRt6w;GJh0vz_IgA`DfaDPxrA6yy?BZUUf9E9*Ivi^sj6L`322|ON9jLmP zCY}b96HKOTP&!o7JM_Fl5kT^#4lJvx&=VRnvN{qUETh1`)&_zK$Z{Z;I2?9%0#9t{ zLW!^?D8ZJbgmXLQ8p*rX;2ms+QDR_O-?bp-4lEqV;?oVrC!q7Du*#c^ zg0tS?aC1e0^@d8V4)ou3Fax|v-wOwNL)Fg!p&;3!HbM-5neX)oQk24`K4`bud6aHj z`S5OVet!FIpte6;-5MX>-5Sb=D;&DQA?U)ef7))qX$yzgx8H-Ef&b2RWL&K4kM>z|NAxsQPgDVV?eVHu%7DTSh!OkzgFZM|=DHADaACpE%sHXRj&+$0p zREJ&>Y8b<^x|&ARVv#OJ*k_}=qw=j}!}$dP9BfJ+yQe}N!P!W|JOfGy^cOi)W?Fe95Mw6HkF$gJUX=oGUhzP31FfGHhZW+|$&X(g?T9V9D zUQCenw#?FjySY@l`eZY6r(l<|W!3A6JW$0ByBYftJCn@~A{_-9g|33RTDKH`d&02* z6P2}j6o0ptjd*>3=S_ANJUp+kcZY2?O8afb;PCUPODzKa9Wd54ljRU*)(6% zO3ZxGoD?_H22zCMa!YXXYuZ*!Fwa8Zl6^;kM_?xkO4km^n%QBo%b)4 z*jW%6gwC95ZB@Ibba7yPkU6Ap-;PueAnpAagwu$TO(f^%5$R0x%P@bExAz}F{|5TT z7k4X+iF^KG^r|vXVHhWim`;}7_~5AerTdw#71E?WbHga6Ma-_* zwII0mt*-84S?WRt<EoB!Reyq@E4o#>|2uUtJQ?<-F8qzhD?}>z`6!)^ewI=|B>Nd~YmIxH`S;(VB8Bm0UEh!PGbW7W2FCKCavZH_a*U6mQj^f|0lq#3~cE{co z_uX>SIp##+HEC9{H>E1lSu|@~kS#u?p_6>QBAh~p~ z!o}?LLd1W?#}4P`<#9|7OHf{^qg3EBpScx5sT4IS>&u*Y{+&ao{CP#k!ZgZze#@Vy z#~}G`A^F}_7bM@yigQewORlqDUb-lwc6#O)AQuB(i5iL=+ykU-JGx&#(o({d8P1Wy zB*f=LEp42MGD2$B?(<%RG2u9JD9}V&8 zkkLy2yy8>WsYQUpeF#|rz8`~A?5jwUZH8c)S?vlQnrnGeVbE=ayX7Xn+jJqZX*l#+ zX5~(&aFDt(Z!=~vQ`~^!E7{BSlSwOyyEt3y(bG3maTe4y~FUdjp9mLE40t99eAc_C}s;bx7B>CpO5AXO`^mJEO_1@Lp zwRl|{0kDsTrvIRaVWyqn5#BqDBI46SCHg!v?`l*x<2^>X=1(4O^3b`a;gH%$#|VA{ zctL*|b3sKAuV0FY%?(G4*aCQno2|1=@xS=Y30^C!j9@W@?U9?vB{{ZX-HdUqv&sD* z35aNDJ-4D+!1xZPz@5MuowQp=rZLl-&Rs_U)M5*iHCx_x@TgD1z^KVIk^*-a zAmhAqbZglqVN|_*Po-R+ZhG;wCLLj#)^KA<*xB5BX?mJ;XsYhhwztAM{KTH7-_O)W z-qU|2=SN?x|EvoKx2XQk$cgjWm(*UOLt|;Ub;cya785RicAYgyVxnho#N?N$VI&%l z?lMC{DorGCOHzqjSYxR9k+;VnZ!ajcB)U6#@SL(1!gxlmJ4QD!9$p&LUeW+y%>!?PT;*f0EK9~T?u~U6U8`K^e28@ z2I8;5&7&_C8vvY^NsbAA_hFlMSWxRfIW777e`FSVZy^#*!lvfzaIGI=8nF;4H6VX2 zV#=#j7}e2@}kU7j~m-o$S*!!eu0x15C4IL$Ud&u-6&KY6L_Y9k;Ox(Qq|e5Xd0zzu0aG8 zGKjJ5LZKnhp|LvyIu8l@)6HzITt_40*8t(HTy1JAe`v2 z9_**i1l|wdW(&Jgkb^Pal+%CA{*(FCsEp)WKQ|hU-V~@Bin>|5C^0@tUo+7gcC+N2I;60uy5s}hESxwGC*EnUTztd56Dry3 z59l%p@NsG<^`e5=w-s#JjdxfD$-*a@c>(9IA8Y3}mH~ z=t#Z)e^>8Ft#Pn6pRIBJgIVRyKd&;3Ll1^gMx|}2b*>@|jQy`v9ZO;k{BrSK?w@pj zR#UzZ1$67XXq%2{uAZpb+KgCZY04&+gimPaI>y}sNaS(q7n+fAx%zH|w2U0{%}pZB zC)U-y7vdEw&T(|bIl+JBq(KCrWjq@?x%$p=WCe_-J&A0IDd1SN=n5Mo*U7>)^hkr1 zDb|F&POgp4u3afri@&~e%q{=d;=5m}?{G)P{PISkv1?Z|VX@R$Q~>}*En^^-U8QFr zs1~ac48OfGaAalqC6?!3Z$&QCo8v)rYuv?ML7ga}cdDYjXq11d4!OpZLeoq;77!8j zCOGwY5BT@w_V;DSM>$CN__SQm*NE{X`8^Zg2g~b0*WH(}{PUXz<`GM#5YHCw!oUol zy$EWE7%J$&?ZVw?X#Bh}p)ulCL|mfvg-`<1*F?k8_nr7YT2CkLp#-I`t_G#=fvn$P z)^+=;diXUpYKMQ{Yl(H#nJ=KSbA?z$+#9$>R7XUiZyk3mGtk#cL(})31f9S*2;4vc z^Y3c|oW~r*#dmMy9l}kK_c)w{We^XWZz;rNIYCz+&*;Iu7y{@ z7E^)l2ECt8Ehc|wt~KlUgXJ7flxRn#Am0vM^@=DGX3KvOT3#Wmwisja%&EuKwl`SfDA)ncfLK7~Q3N=sRlTt?&*?-yGgM zwWaCXo_l}A;$GFrsu{H+ocQm>YXh_!iX721r|`nL!CP2>SKzz@Fu^7`yxW`jaLTV+ zK2&dTOIHB}a$oFjRMv%dX%AUNO_lj2UFMCmz4tm;bo3PG4d&;ab9?F3H||n)#om_T zwawa_+G{qoC-%x=0wF!rX=E$MQCALA8|78DnUsIM)O&}8ea6oDeEH;^qeko*3ahG< z(9x1o@Wp_&pk5y3kmy_V9$ra>MsZ5uC8qSv90_v zZ;2QO0Pi*6-%kRbaKPCFFVIpTA<+Vs%@Utx*r{tY9|b)$=KnkvGv^V{sVuF2U+!a` zdrV7IO4h8hza*@wG>D3oKh9f^R{n_oex!fDC-irp{@!DLb|7FIc}tWVLJoG`%Co*w z(J=ZTZ`Fyyj~05b30AK@2R+z2adNKB?}nO@YQBjHcINF#O$#pDb`BfU`OePkL%wjH zJDSNl+n%eJ{d!K)V zPEXZAZCS(hkMg5+A)IKbPPbf~V81&N_g6F|Eq9Sfp-~2lWikQhh2@^6Cj4!=cZmc( za4h%C`(0=)YUhb(v1{?U5Y5%Q7&k1pLIZcR!Pu6D^j7+zn~`)-4M9w|vNbN($3^Qm zT6~fV^sW*Dy?h^Ap;)ism2Alc4Ih8juCZyYVRa%wJu|A(CeP+v_vR^DxRRx!McOg6 z5S15*p%zjK`KRh@I{V7qXKCI|33*K1^x2)ajBdZmZ6TMo)VK9_<`w-NZRbK+tHyQN zWTT)WSHkMVMmFC@g1Kl!v(=%d5m(+jEb}#ST3dod_8e6!oqzO&2hZE8jI(UmP8)PM_+15V83cWk9JJGoWYVh`C*;Is~daNb&zQ*#`g3NLUN zO#wotH{`Q!A}3og%u2Qh%=>@yB|Bh;a=36|nxzt^S!= zJEK9u=cZTSBkx#y1wN`B$ky8Tj#~$91Di|O(4Z_bzfJh5v}=g5b<*~lX!Itz?oQ;o zy9Xm$o}g0JUm+<5%ws%dfUc%iq;w++y&+p4C?t!g%DJ4V_T7KZj=@VH!&9{KcS3h* zPbbn7uHG)!(L%H~ZFD`gZhMh9h|nwUN}gyg|EqZ@Bu^6J z0t>J7)kYhpkKMtnI|?4BlhLL(xust;F!>maMuX`*c$}e*7R3zE=8f}XNo?&e=k|rN zL9Epz2b(7*ksp5pzBlGa%ivyC!1ryW0{(hu$HrM_h{n<4x#2CnHqY7FCN$!!)hYYP z8Kl$5F@N7PY{WI>&4&;#u}?FWmYl`AyAd%w(C|)$|7#M^w5?Jp*Fv8HcF}q5{XDj-eabN|Cr*J#D zGh&A?}7VRzGuS6@`r6L${N5pfeJQ_82c0jKIFvqeEv=7 z<@hnrHs`q2N#U{!fCB!JOzr8>SlGw5fkFEby6_B*VScmE97FeT=som1b8Q`Sff_|i zTPSfcC}1pY%jRa>5|zPBz27c?-ErPTTWq+x#YKOewheKP7^3_)fX0*pS17=Wyql4t z*xPHoueyV|%kLCXZEC{3IVlbnYu=B@kN~C!F23VhfY@SMSjSy%$xfOfQL&c%0PffG zDT*`xb@q`4`6@1qidK1qI9o*K301yiX4J1hp6WSCtiw-dFsWCZh4L(Feha=)G!ByO zC`Nz7z{BgqPX}NAzBrOQx_#9W!K=2DtG_P|u+_P~aiRulnkIJ)I{~aa1pVAUkgs}d zT+tbB->^_pVntZCQ6n99@_cZox_Cj>pebK%3A=WL1JcJ- z!Kk8fy|!rxZ{=*Y^sy}IQk7(3+Vj8xzT$r)*EsAh4WTONC7fo#EPfQy8=L~+Hx|Gw z-0`+Wb9Yi7A1fG(1lnBgb4}i0)Pqv`5R>invSGE14XdRZR{zOJN*gT8?7^}@oxm0S zn2kNQmCB`MJ<4UnY$@yU@ij#v8)I0PU*^4*^>6aBg08Y&J>WY5|3ZKN zm+mWzQ8tWgP!zLjukh7i)^%T@Lz&%ABsXN}1 zURt*8@w$j~pU_?F+I?xZrJsFU(vu1Tz0`BZur*Z2cQPDdks`!oYHOBIK|eRaZa;7eVWAU&Tyk4&Zo;Y&iULpO$6s@&PV2i}5u(;T5m*D-%EO=Bf) z8hYd6y7Kr~WD*UjnxPGkj*A;)u!8&e|NgI*0t|oI;G0Ccw%RgCclT6=GdUzs25zuL0qe<(?+ChkdeDF9XkZM+T|ncm z15tq-ei@{FA{_|Qfgl|S(m|ZGF&y0YRTE>f zBS)>#5g1RLyR=IL1L*OQhpH$cjc7wYg>rrgx=HP^1hi4$8v~s4?gE}}fwOQIB=S=A zS;Pf}8GyGD7U)JAY`TBRm_MV)w8oi~35qbCkpbFcee;GRfMP^s>U&<;3fi@Pt5+QO zZLeoovG?PUeiSk;#vMD^BqX`7rOB{sEpl*eh#X)yc8j!s!QM_T7;HH!YD5B-i;qD67dB3=3JO>1U8OBUU-f&!G|a~lyy6!&TQ`` zR25Cf$o3RnO*KYydA*o*%q1qBWIPH}wJl`T_VUH_6?G?`_o)(S`cdlR zCx zjJadO##i8BNA)hoZg}j*$?>M=?^(!3Yph|!H0`<&!mNMrJu${YJ;b$8c90A5J|8@T z+w9)w2CN6Nf(+{CuxR9lVLcI1XZ;+a&N>B=j8uq}Ex@EImuM{X?ZorYozY)^Kfh`M z7`7QL-YH|&SQN0|0DjdmyG^nMqWGa`+?vQ8=-kj_wSb62$m3=c|C57^aIJgob@VpY ziEU%o#S?$D{xJ_Ii}P?D-ObFzCpR_Y$mG9dBO@DI$W3#7T{tJ% zz#Jk>JR`r%Q!wbrJj8~+#tVHu z=Le-8a%v^=$XVX?f}NdU*Q@O8Kp6cJ@1mvvceT;AEwjetx6W))viQjv94uHq&?R9& znt$_BIO1AVAwHkHisIHcO#{y>ld50YD98a&=?;8iA7iL4I5&6*53`eSw(&^FhawMaQbc8{d~pwDQrVub(5ooXrj>x zrA*9+rQH*4OxHWA!S%!%%efHkoEKDGR69|7!^C=K-3>F6vhG8u`*3$u8_K%($POt( zn-}&F>pp73Q0u0)J)Zc0Y%Ppd-Zv{BCM$m*K3)0n*~))LW&7LS$e69SjJ8=`gMhXw zAMN7>wAuLB@8(D!!-C#}Aq`DpM)x3kjM2mF8i(u_=XgeX$i|pH$Vwl>ngZ$ltn?8a zs~~-n*@?ADw6TY>vEvChSqX!zguY5Z!+yzrn>^iblmFXok8Y9@`yIumY;?sZcDjGp zYCn<=X6#m(3!h30Qrs`wVzvGoByn0DnCymhlf z^-x}M>b6z3@}c8$Kg4J?zY@z4c*@YX&Jj2+S3~e2M>Uqi_iR6r!*^VDK8hKH&j$%( z?~!ln@;x*#mDS@$&7q~J<74naW+!0VdOpWjXtYJb$}4*%>AVkb4e z8zhPao!^tC>8aB6QcDwfJ$%IXJ^%5sQvDSNj&L{>I=dp|JLt^3`tDt#z#+qbLA=1^ zptZC4bFk>^@^V8^ukE2}M5}-6psi}Y7Yw<6hL0{(Zd9$PgKgv`p%yGT1;|Z@+0ll_ zm|D2|hWiikIWuT@aV8fMIlEHmIS!mj@uPNau3y>q zmH$v-Z?-5a#<;z|^ly{_Qc)xkROA9cPW=kShBN_K2>|~Oby&m;zjc2KVf*2i?V}0< zsvk=O1s?LH)k`_Gb}3O*D7h3nx>Av(gvS89-sEy4T~U2n;+4y&mYNiSkRxG6Of?b1 zWk^`idfTo?uBhL(9T)W{;+5-oT^WodVMBdSz4`W(TJH#|ko%u8DhRY1_TF`(SC-qgw?!ph^M>(Ej!>j=ZZ%V0X{#yR&UnnUQy9 VWJF{fv*<;ARtTCu2lJj00s!PL%mn}d delta 10698 zcmV;*DK*yXxB~6C0tO$82nh7nkp@fwSCLa92(9bJQQ-SLu918qe+Zu?9*4tz%frYG ze1o<0AN6nFvea~EN}Q~DFst#Wbr8nUnZ-8#l+RqBPno)xqk08XTCAD|lg*0zab?;0 zxtx7;{b}%cgi_$pvz1oXFy(|;WQj-0y@)?s67sJbH{=R?h^E1csX9Fsc6HYO)Vu%u z+jVUbue^6x@|Qc)S9e!U@fZiw1Um9T08BmF`e-|S5^^Wzf1^o7P35#3-3Ob=;%>7> z7V)XY0zbx)D0ae_)m*=Jj3{eddz?-Td_0R6Zlr&>`}C{2&zsghO_kZkpTr<7lXL+k ze;~p$%VHT45Wz_pE8lR*lYAF98o0h2bA^c8I^KqVnklN<|6qm>RHf!! z9J>De`C)(Etj0WiKHd!ik30Uq$ek)vf6^3`gj+pb&W2Av%%Jhp?Eis?xwF>5IzXkh6^|Wj&xT_V&k%k!HjJqmW7DUme~--> zHD}lisTnfuHG6HmhC{rD!66O8Bh^B_HggmBx(PsQA`&b3r|kH;=S1->(C}onOevjW z5>zJ6*0f=lx@hZw*>fgb$sx5|%#OMzX7APQ){=8j|5c-~zxTe*m9sHwVaF zlz?eVUW=Z=&<`-Na4d|Q84?XlWJoHD1hnLkfnHkDCxFGu6gXeEgxZ@@0+vlI|3oV* zK1BK*)b$jamEB-3&AoA*`i{Ak1v(sKH4LAbbnnI+fW4Y`(;B zErnbNaN$Is9{u0KV9mog5t>Xu+EV@RH$N?(eJbU%|2O0VYuNsze9}|$e<@imTC*CTd)JfS*Sgh0Uq={!R%TEj#7C)$lMQ`iNy^1TQSRLvaDfE!qWo4v+%2ChHl@rraVGoC+IVrER(n&CR3xmg+&mU{oVF<@! zRpv1@mF!2QVNBaIW)L4!fAyI>K#mbVB@3D;*S>lc!1wARYdH7Tr;-%`f(Fq#65k7>zDoe>IEU^BtSRq0%;N zOm>>%nIFcZ!^UnkesUVKPGd0IzfDz0vDlxX%*mH9`wPPR!*F!L4sp2QhnWM+JD}%3 zG}^;y9dHiy;q*dnBX)j0vg^af2xrtb;v1Fm0mzqwanMv;6{L*XsVk;=o{q zDXflk*O>|hQ#BcqEP|<|0Bw>xYWYKonBY;E$X(*c&QsY?NV6IGMabXHZ<-h1)GkU@ zurg7x5|dK~MJ8Ohv6g!O(?<&yIn%^A#=EmfAX?Yjdx10MQ{z&b1gkabws9#?lfDK? zf3bA!%z3m39*ZTY_h;2*=p3B$^J7AYcXu(=f$F}@!LI!>^SDY<9462Bh_?vPyPJdocqHcW8MsOl$V(>< zCbvCx|GRX8x+9%|Qel?HP-B3dxtZl;DfCE1&I(K-5~+LKlf37y4VqyjBLC>2J>d?d zZXRfC@9xgp-?=+(n}muH^Qcl zX}z&p+8`(98hU-Jm!4AuU2_AXagIY{c zDdPiTBD74%N9y&P^punE2>TDX(vrZFzzd)bNV~#D5e<|2350)G50B6A7<-$LjqF{$ zJ{kew8%*^J#JP^C8lfsPBsZyj3R)m`+7;RCmvBCIh6u7@I(9 z;!NB)DaXBDwmkz(koR^l=`9>W0yLqd?nB3qK%-Vi!8DVny$5%|L%d8fSRDKnJLt`r z=AmQD#&a*nQagVsR4>QQRE(}!z+)r4XfEA{7Th2$n_+#tqlbu;b1zvhA{Y`4G584m zN6{R^&X^Gh2Hb)xN^FKPGim_64ZdO{bcm+JzH&X#Uz;_NIa`rCR&v+a>>Cu1Mb7Lr=qIy%6O21#Z{@;!K zC|%H5q#o}|KbMCu<*@Tqfqs(@SD?S8;neIviZ+cGU>LZt0T0+s>*xz{RvP{+hCc)F z%Snn&2c*?m>$7Ol2BImjj^uSt4ZMq4#wzepaQZS$R!Skot?lF8@f;;Yza!RC265oZvCnU9awv@!g$+iY2(0~ z8b7pJsXYK>ImZUXDOlZy@q9gYqzB$#LWTF!PX>Q3{L^I%)b2fc<(}5TRo!YN?^=U* zuo*^)fn|Nyf|xt7a3G6MHyEFQ&YQw2Z!!wbdWXZ!6$RECDz!S$f7ihb@FsmP9Ow;I zKLdn1iT&>S3-QJFXw)EG&jFF(?hLFhurcvh-UJ zxiSYkzx=+~C&8plq@;aJ8X=*Y-a|geos>Lv&VOqBg>TzewaV#xK<|!{G$a-65>A>AwDqVfDnYmN2OWCsO^+X=1 zVu#&~{kS@l%nc$P#WD(A1#`7-DgO3^V*x6#!1Hv3&EFV zttZ;Ea8m1tOVOQHy>{V*lTZ#Xe*tZpQBXjIiv_-{a64BCl(rr8^hgG> zcL8dfa~3;735!kcM6s=vhW;j!CeYHf9I;B@gCwQ0uv%UM5?NbD-Q?bxf1|7byjVO} ziZuG@Bs=T)iV04%6DLBrE}BFRLIo6BrBxn6D^2r^Ip1{!nfC{6r~QnfQ4nxz{j5hE z+&y@2 z{{V)6BMl!MRljsU)3rjH)MsuO#e~G{nq3QmYv1bXK9;2}WKjOxe;mk5C`@X~b+)jq zZV5xRs6J~>@B&`)2%?JTL=oyFaO?O22AFW8n)zySjRPv+>CWd2ls+lj?@pEeTjo7y zlnhPC(PjNIEs#1s+BZ4NI~r+I0!;2|yVAzu>Z+?xo!BY8$GrL9?aJ#p{?>^;I=(Z< zw}q8Y+^((b((9cNe_y2xeW54U_>zQ`$Pv+V1w>pI6kvitRd#WuA@K`82v6MEiYfGH>a%6j z;2}6a$6s*h0QDT=)vJ?8U%fhw@CE22;N0)frg!qF9nU+t`i~Y#sxyQFi6fCzNU00kQYV<1BfM<>tneT&8}|qylsg893U2)$nH=Scn6kd~N6?;>vB27Mre}v^lKCy(@ z0d836Bm?Uy;~RjPRfN}1stDNI6qPSn!I$qNikDhy3tWM~C0Q{4vUnxWG$ct0qT=Xf1ju9Kq4)T%B2ro)5msFy4qi+MGJ3z=sot4!6diHigVN(}O*#W&}u20wOV=tKC+Zr9qC z8eoS*a~47zhjScaytAZ2-SL{P2=ymEf)?+be>RX%Om3&D*md!T??*&>Y%X+MZqXfS za}q_2md{>Teh*L>8x^Kg{?QPOqAx!h;?p6cmHv6fr>;|rU=8;nWCi$s3{J7HE|P3B z1k=oFSMbnW%bN;=ZX?_+H}T!33yDp`q1Q4icRGcG)RlRgF@u@n1{7b(Uap@^!X)nE zTd+@`a8-z?$)4lIIX#V4uxn&g1W%_4ql-nOWlH2N6NB~4gAlR+inyNwNlv@UrkXtX zvqRwrXTJ~WjHAHY!~ls$kPN0|;E1VfaIRpBMyqz_u24T6KTc2Llh6}$4uo}{wH7aK zzN+AgmjdaNQ4~`ixUC$yC9qf5txD@K$<5Z~%TBI(Dy^D$LBxM^;>DB46hZ}xZn>z^ zvj`O&7=P3MqwYz&+qRYcD>2);qy(*r+gr+vt~becV#kfs*Y?QDJF-Y>w-hawWLy9J z%?wtOqV3$i_u-wKSRgQ%!Hxki3+tO_+vpNL^x8H8U>^-k|3Qy~R6D^#ymuHz#HR;J z^m%CB)u?X9dyHbmA3yf9(7C4JkjhZU2z~>2L4O%@MMV&=Uy6v$4Mz;w9C(QS#@TG~ zzxculUMs5%VKId5k(%Lucx# zK0+xf-HCVk@f|mAN)mbTdx%)FXD&JsF&6ChA;MF8;0zO%e`5}E@6a+iAtbS6V*tfc zkdq=V7JpG|AXkb%%nYMS3e>fR>8C%O^CvZk5?be}b z%(UOSZwY`(Y=N?-i@O#c^+^~QHJOG|;0^<1oOgz9E!!lFs+aGHlF_%BPO&cUJ(K9$=^2^jP5{*Z9nIR#SCK9+Msl+X;G1UCX+hdTm3pZ6^ zA3t!a)-J3oRoErMP4bb3GaZfOgA?u2ZPZ}?O9*jU7gF^+|JTLG(=T7HEN8RDg~+y? zvwziSSpJ9E@^ACS^sERppHGBDtnF;{6@ivJs{~|#OY%1zuZyDej^JjMON{^+ea^~+ z={925NR!Zz)&pwfMI zTJrb*$Sm~UK_r@l-I}w-wSI_c#6qCdfPb`zDX+qj4S)p+4ZfQTYRB`jwni#2I$dE`K`? zms5atEmw9-;Hd^i77w8cWoN&nX%xzt8WB*)AjY(xSg%-8Yyq47Hf>bt4qA4iB+L9@m^cM zQ0!>I`!BZhmbSk8j*>sq-dox{+<(@NO34EX6;<*$HS>3QUy)Abga%WE=znwEMa z(iJsRTI)pk(9_idw43w}ix*cE*6h1@fpDV7da%27Ch&gvHl5q0oE(htrhlBI_MgnB zMr9=5>ZQ?W^rk>nQ`F7cMTzlI8gK8JT?b+x*g0o3PQ6n8*J5e!U((pKP#q`he)U9e z*!6;U?vTQw>XHw1vvB4-o_Xh)V*V}nPN-zBKcLGbz{jbb72fG9Lj1Hvzg?XPp>I^0 zvOg4RN+=Pk67Sl24ocwY$$w$jGpNp;F_0C`q9gU;|6RQ!wZ_3(f3e2d4`!8H|GdgD z4m}t~DV4UN)|rwpF!sMvbu5WF@QeAq%s=V=w5EI|3h36oXq%2`uAZscT8~&`smmso zgwJT_I>p@rNMv#9=jxGhx%_T~w2Ykc%}pZBCf3!1SK<{b&S`YTIe)|Dq(%gwWjq@? zxxD8%vI0iao<+9AE#O$R=n5Mo*U8*1^hk{rDb|F&O|Fg3zFjJm^S|yn=9d3!e(#s^ z9`4APU*1U6_U&>iES4IJDgdCUMGVBUtMn8E<$O7U;kUO2joycW+b3BS} zjr+JOs1qghPFb`Ujek`$@=xCZMUnchhGz;c7OQ2l30hW*&Hf6Q;0>x zgMnK_wL}#9)^SHN1AQ$uG<_dP&@qgIzzq~I|GqWAdCXB2?RG5I@nt!c~eEoN|{L^~=u z`F7~4S45F8U4IPG@(NkC#UQh|QI{N90HK#aWunny%DN=bkwI9%r@fUGkzSnhTQc#0 zDR0RebM5feT%VTgo=dtfBRZdJwm=to8(~vQUCi(97QS|r%``Jbc~W)Ij27BbpUwhx z^*4*a0!?Ag^j_$}=q^1#-%)FCiFZ)?=J3I(EKJ|_+-ogUB0_Poo2{ysu-QL)TQ-0O*p?bYLx(djV`(k&kvd*d4}K!06i=zkly^J@2gapI z7LxWbsU&=v9C!_~%F1oCHqoqrU3D9|Y_ocE<9}x%d~=h>kW)pQf-1qOIu`ptz&AIu zEQ82d=8557NI0Yfdo~D`e>oU;b7SL=ZDki(OT;(;_@Dv*eirbI15U?yfwlz_5-nia zEb(cEovKFjQP4wU{x4%ObDr>=%F^ohp*6uF+l8Q9!f>+)rbaeH*_kT&~^pqXcmNi`eC_h?P!ikpZbj!sF_PY~t ze?>#ma_5N@8fCCpCKGU8Snm1OgugBKK9Rr&j^$o>zYDEJ?L6@!b}c>=qPcn(hrFu0_tEa(Dud+sqg-=fE&Ga-Y5 zqTbbo=>o=a<-5j?GS0El{kv9uOK(D4hhdF_h}%p>W`?n&aS9c!9&H3lK8BA)j>TeyF1O-3s&h2@5nI4c^wkSrxNx?kXz-CeHyjP153wa%Ya-~Q z_W>v3(pvzVMbq~XRZ+2v`P;TbbNO(0_t2~_e~H5cY0xB+44m<{!l|el8bA?(y(hp( zz-Dl7lWxR=1Fa+M#!83>fPaXiKXybG{@QndZ&br^$3Do9g4wKv#+VM|%0O_Yq{~_j znv~~!F=K(dfeHOkdF?WW(+ti!>^QeF}g$|}a&~BqyeASua;B-P3u=tO$L)!XGN zT8PHFiLR$sO)nA$5qia4$`j4?f7OqL*Sw`y<~cjvghqU|I%gj_gLED_<{x^7jkub;`4HkI_Ib+ElCgMq z*CK`oYTmiu-i-fl9BEnj2Osv_XJG93>Egck*OUrnFnwy zxqU@1LA>+WWE1w$Va6RN()gu~11nHGh1;;|?5`zhYc?kKD)d z0~0=$KWr*d)&Rx{RIqNu*ykwlAt$!y^KU{g$B%ioxx}qb3YT306!4E^YEO^G+#$9N z4BC&-g%@ZH^P7F)7`lf8@3GsOY3rDC)F@imLWzq(0b^+!HZ$WEs0?Q6{k8$@p7SQ! zV#CcHE`RE@ZHRNk0Oh{{G^P}|L;+Uh-Ha5)-rnMU)jiBzey50PQ)BMUNpY}P^KL|j z1TZ~v@g3I!#1_-SI__dacG3)qik0LCaKD~SP@M6vi;pzOmvLcKw8|sI*&;GesPZK< zqkaYQR4++l9e=ujNxkGOlxI=%Tkwsdagc0BF@G8c9(ImD9ew%x>O}77_Dw?sZ<Xmh#G6?ubE4@%pI zm~5xl4XZ_LSS{4B`cFpEw!yMUA1rIs30%^T+1Mjnsa#sti)=Nn40!s&e!#ZJma?9n zb|@0r7{j{!BI`A*f0LILbd~ky5#I^;7k~P{bl+HvvSD0}qL@{AgRchDw)+Mh()=tS z5HYiUb|7tIHS_&(?+#r72!~AzAhVAf;d_gvIn4Q)S^GPUqvL}w2MvoYnAL0ov?X1! zP>`cA&@1+KVt3hN>;b?HSY$tNJ8a86x7*{fq)96d}eFTU%uawR%dZZVLi$&G}M5WIV|U zUlMX1>KkgQa%cA*c?;@IbBHEgM}NRHjg+`)=#BEL($iCs4Is3pP=Imer>9|_`zqlk z?O6{2$_UUw7YbN_YbeT0h^uD{TE?HTTW+yw1ZnM%S5od|e zbZOp&CULX|4>OM7x>`OPNj1d2=cgX1#}n8Kd=^6eP&FMY{J1K)eysCXC4bAoIZC>+zKD2)cVZ(0}M?U<}4xK;y0jQGpzODWrWO9SG8aARP$OL7cQP9Q8GG z7_|!%nzqO~!WNm{WCOGpY3d;W`{-v?6JxR?N3GEj7*CwLv`Yj7=;?`v$|xa?XhS}Q zGJXNNN$s%&v{vA21Dx~j0-kPx({Se`@V8>ljw-{Wzo_g^Y`F$4)j0N$y)|GVE51 z9NZcr2iT46Jndhwx04G7+mdF9G4@Sw_NFx?(fBut5t9bN1&r4+#~qFS-gcw3%7_p_ zZ8oMQphv^hj@x1gWq+=Dfylk`d~Wq=?FAbK3#kDV(Q;^UcLl4gpI^dycNA8l$=>c{wZ;$Z&f&H$5E=Fj_xqb3tCtY9 zR$CCsNQFq*0!*rMiN-?TPCO6Y8U6M5%c~}UVVlw7y=BZAivso=z%N^7w@J1@6h9P= zTM@Yfof~?r5)g3+dE9K`e{zr!u61v{mfpr%v2E-&e}9J7KV|`CaUO4@yP28z?51WM znf%vmWMo6q#O}2#(Fk*si*0KH6Kb6;X0ngSF)7;1gRP1bF;hB>CV$UdXXSx0y@W80ho+rDerhXLy89tF ztH>_~hG3T;sxSm)eITxax^NOmA zYA0%Mm{?D(yJ1FB)_nkVAM6h+16lVD*&$_U^THlr-G@yWYVECUk0(ALTM46;_szhZwEqmtr{rPZ|2w zIReM!Y6w2$D93X6p6w@c_>Qa2M=^u&*&t!;J@QRmet-t1(t6yeIkXgYd<;HF?F4LF zFQ~*un(sspbMtY1+FFx9X}tBr1blGcm zb%PBjgyO^t(+C*;^P7o69S&RV!Jpk;?4-tbgG8~Q^E{71dIB+J# zj}CHxG*0?2jFXL89H+tO`eDl}e8t&ay|L{Z|FOj0ZctW?aeIH;zflHAMUg~Mo(lju z)f*HW(ga{70Q^5xVG+;$)_=-{&BtFhPbv(kek}A9c*vJlZ_BB*O^KpH$)(uQm5L-K zJO<$PCYKv&i|W%7uUtko)T9W690@aG%83{*L&Ac_yJj_VMg6YnxTrr7uUyM(%U~o4 z8|r)N&9|qm^^Twlx&IlX(va-Pr<+g+#fDnS`v(hkGht-feJ!o@7G1ffpo-Sar1Oic z5q8`@T1o$(=H7&@jU-7J{ws3reo%!{LSVaRMxxAvvEA*Nw%u#H50+*cY9sw9vA w?Qj3$$h)cpcK6J_JKIK;8F^<$MnuNJa{RD?5ot!V=0$y02!k=om7oy<08B-(F8}}l