From a193bccc86732a7bb1f7c96a654920e3da302f39 Mon Sep 17 00:00:00 2001 From: Scott Date: Tue, 12 Jan 2016 12:50:34 -0800 Subject: [PATCH] setup test file with phantomjs, no luck though --- .../homebrew/pageContainer/pageContainer.jsx | 4 +- client/homebrew/phb/phbPage/phbPage.jsx | 14 + client/homebrew/phb/phbPage/phbPage.less | 366 ++++++++++++++++++ .../homebrew/phb/phb_style.less | 0 client/homebrew/phbStyle/phb.backup.less | 5 +- gulpfile.js | 2 +- package.json | 1 + server/businesscard.pdf | Bin 0 -> 6889 bytes server/pdfConvert.js | 26 ++ server/pdfs/businesscard.pdf | Bin 0 -> 10253 bytes 10 files changed, 415 insertions(+), 3 deletions(-) create mode 100644 client/homebrew/phb/phbPage/phbPage.jsx create mode 100644 client/homebrew/phb/phbPage/phbPage.less rename server/Server files go here => client/homebrew/phb/phb_style.less (100%) create mode 100644 server/businesscard.pdf create mode 100644 server/pdfConvert.js create mode 100644 server/pdfs/businesscard.pdf diff --git a/client/homebrew/pageContainer/pageContainer.jsx b/client/homebrew/pageContainer/pageContainer.jsx index 5a79390..c876907 100644 --- a/client/homebrew/pageContainer/pageContainer.jsx +++ b/client/homebrew/pageContainer/pageContainer.jsx @@ -2,6 +2,8 @@ var React = require('react'); var _ = require('lodash'); var cx = require('classnames'); +var PHBPage = require('./phbPage/phbPage.jsx'); + var Markdown = require('marked'); var PageContainer = React.createClass({ @@ -13,7 +15,7 @@ var PageContainer = React.createClass({ renderPages : function(){ return _.map(this.props.text.split('\\page'), (pageText, index) => { - return
+ return }) }, diff --git a/client/homebrew/phb/phbPage/phbPage.jsx b/client/homebrew/phb/phbPage/phbPage.jsx new file mode 100644 index 0000000..bf2b5e7 --- /dev/null +++ b/client/homebrew/phb/phbPage/phbPage.jsx @@ -0,0 +1,14 @@ +var React = require('react'); + +var PhbPage = React.createClass({ + getDefaultProps: function() { + return { + content : "" + }; + }, + render : function(){ + return
+ } +}); + +module.exports = PhbPage; diff --git a/client/homebrew/phb/phbPage/phbPage.less b/client/homebrew/phb/phbPage/phbPage.less new file mode 100644 index 0000000..7d42f7b --- /dev/null +++ b/client/homebrew/phb/phbPage/phbPage.less @@ -0,0 +1,366 @@ +@font-face { + font-family : BookInsanity; + src : url('/assets/homebrew/assets/Bookinsanity.otf'); +} +@font-face { + font-family : BookInsanityBold; + src : url('/assets/homebrew/assets/Bookinsanity Bold.otf'); +} +@font-face { + font-family : BookInsanityItalic; + src : url('/assets/homebrew/assets/Bookinsanity Italic.otf'); +} +@font-face { + font-family : BookInsanityBoldItalic; + src : url('/assets/homebrew/assets/Bookinsanity Bold Italic.otf'); +} +@font-face { + font-family : ScalaSans; + src : url('/assets/homebrew/assets/Scaly Sans.otf'); +} +/* +@font-face { + font-family : ScalaSansBold; + src : url('/assets/homebrew/assets/Scala Sans Bold.ttf'); +} +*/ +@font-face { + font-family : ScalaSansSmallCaps; + src : url('/assets/homebrew/assets/Scala Sans SmallCaps.ttf'); +} +@font-face { + font-family : Solbera; + src : url('/assets/homebrew/assets/Solbera Imitation.otf'); +} +@font-face { + font-family : MrEaves; + src : url('/assets/homebrew/assets/MrsEavesSmallCaps_Regular.ttf') format('truetype'), + url('/assets/homebrew/assets/Mr Eaves Small Caps.otf') format('otf'); +} +.phb{ + @background : #f2ece4; + @green : #e0e5c1; + @headerUnderline : #c9ad6a; + @horizontalRule : #9c2b1b; + @header : #58180D; + box-sizing : border-box; + height : 27.5cm; + width : 21cm; + padding : 1.0cm 1.7cm; + column-count : 2; + column-fill : auto; + column-gap : 1cm; + column-width : 8cm; + background-color: #EEE5CE; + background-image : url('/assets/homebrew/assets/PHB-background.png'); + -webkit-column-count : 2; + -moz-column-count : 2; + -webkit-column-width : 8cm; + -moz-column-width : 8cm; + -webkit-column-gap : 1cm; + text-rendering : optimizeLegibility; + position : relative; + overflow: hidden; + z-index : 15; + + + img{ + z-index : -1; + } + + //Page Accents + &:after{ + content : ""; + position: absolute; + height: 50px; + width: 100%; + bottom : 0px; + left: 0px; + background-size: cover; + width : 100%; + background-image : url('/assets/homebrew/assets/accent.png'); + } + + //Avoid breaking up + p,ul,blockquote,table{ + -webkit-column-break-inside : avoid; + -moz-column-break-inside : avoid; + -o-column-break-inside : avoid; + -ms-column-break-inside : avoid; + column-break-inside : avoid; + z-index : 15; + } + + p,ul{ + strong{ + font-family : BookInsanityBold; + em{ + font-family : BookInsanityBoldItalic; + } + } + em{ + font-family : BookInsanityItalic; + } + } + p { + padding-bottom : 0.8em; + font-family : BookInsanity; + font-size : 9pt; + line-height : 1.3em; + &+p{ + margin-top : -0.8em; + text-indent : 1em; + } + } + ul{ + margin-bottom : 0.8em; + font-family : BookInsanity; + font-size : 9pt; + line-height : 1.3em; + list-style-position : inside; + list-style-type : disc; + } + + + //Full Spell casting table + h5+hr+table{ + -webkit-column-span : all; + column-span : all; + background-color: white; + border-image-source: url('/assets/homebrew/assets/frame_border.png'); + border-image-slice: 150 200 150 200; + border-image-width: 47px; + border-image-outset: 37px 17px; + border-image-repeat: round; + margin-bottom: 50px; + border-collapse: separate; + border: initial; + padding-top: 10px; + margin-top: -5px; + + } + + + table{ + width : 100%; + margin-bottom : 1em; + font-family : ScalaSans; + font-size : 10pt; + thead{ + font-weight : 800; + th{ + padding-bottom : 0.3em; + } + } + tbody{ + tr{ + td{ + padding : 0.2em 0em; + } + &:nth-child(odd){ + background-color : @green; + } + } + } + } + hr{ + visibility: hidden; + //border : none; + margin: 0px; + } + + //Fancy List of things + hr+ul{ + list-style-type: none; + text-indent: -1em; + padding-left: 1em; + + //margin-top: -0.5em; + margin-bottom: 0.5em; + } + + //Column Break + pre{ + visibility: hidden; + -webkit-column-break-after: always; + } + + //Monster Stat block + hr+blockquote{ + position : relative; + background-color: #FDF1DC; + border : none; + + h2{ + margin-bottom: 0px; + &+p{ + padding-bottom: 0px; + } + } + h3{ + font-family: ScalaSans; + font-weight: 400; + border-bottom: 1px solid @header; + } + + ul{ + list-style-type: none; + font-family: ScalaSans; + color : @header; + font-size: 10pt; + text-indent: -1em; + padding-left: 1em; + strong{ + font-family: ScalaSans; + font-weight: 800; + } + } + + // Monster Ability table + hr+table{ + -webkit-column-span : 1; + column-span : 1; + background-color: transparent; + border-image: none; + margin: 0; + thead{ + tr{ + //background-color: transparent; + } + } + tbody{ + tr:nth-child(odd), tr:nth-child(even){ + background-color: transparent; + } + } + } + table{ + color : @header; + } + + p+p{ + margin-top : 0em; + text-indent : 0em; + padding-bottom: 0.5em; + } + + + + //Maybe move this to be built in + hr{ + visibility: visible; + margin: 8px 0px; + + border-color : transparent; + position: relative; + @height : 3px; + &:after, &:before{ + content : ""; + position: absolute; + width: 100%; + height: @height; + left: 0px; + } + &:before{ + top : -@height; + background: linear-gradient(to right top, @horizontalRule 40%, transparent 50%) + } + &:after{ + top: 0px; + background: linear-gradient(to right bottom, @horizontalRule 40%, transparent 50%) + } + + } + + //Borders + &:after, &:before{ + content : ""; + position: absolute; + background-color : #E69A28; + border: 1px solid black; + height : 4px; + width : 100%; + padding : 0px 3px; + } + &:before{ + top : 0px; + left : -3px; + } + &:after{ + bottom : 0px; + left : -3px; + } + } + + + //Note + blockquote{ + box-sizing : border-box; + margin-bottom : 1em; + padding : 5px 10px; + background-color : @green; + font-family : ScalaSans; + border-top : 2px black solid; + border-bottom : 2px black solid; + box-shadow : 1px 4px 14px #888; + + p, ul{ + font-family : ScalaSans; + font-size : 10pt; + line-height : 1.1em; + em{ + font-family : ScalaSans; + font-style : italic; + } + strong{ + font-weight : 800; + font-family : ScalaSans; + em{ + font-style : italic; + font-weight : 800; + } + } + } + } + pre{ + } + h1,h2,h3,h4{ + margin-top : 0.2em; + margin-bottom : 0.2em; + font-family : MrEaves; + font-weight : 800; + color : @header; + } + h1{ + column-span : all; + font-size : 28pt; + -webkit-column-span : all; + &+p{ + &::first-letter{ + float: left; + margin-top: 0.4em; + margin-bottom: 0.4em; + font-family: Solbera; + font-size: 10em; + color : #222; + } + } + } + h2{ + font-size : 20pt; + } + h3{ + font-size : 15pt; + border-bottom : 2px solid @headerUnderline; + } + h4{ + margin-bottom : 0.00em; + font-size : 12pt; + } + h5{ + margin-bottom : 0.2em; + font-family : ScalaSansSmallCaps; + font-size : 13pt; + font-weight : 900; + } +} \ No newline at end of file diff --git a/server/Server files go here b/client/homebrew/phb/phb_style.less similarity index 100% rename from server/Server files go here rename to client/homebrew/phb/phb_style.less diff --git a/client/homebrew/phbStyle/phb.backup.less b/client/homebrew/phbStyle/phb.backup.less index ce3a56d..2bab0c6 100644 --- a/client/homebrew/phbStyle/phb.backup.less +++ b/client/homebrew/phbStyle/phb.backup.less @@ -9,6 +9,7 @@ margin-bottom: 30px; } } +<<<<<<< HEAD:client/homebrew/phbStyle/phb.backup.less @font-face { font-family : BookInsanity; src : url('/assets/homebrew/assets/Bookinsanity.otf'); @@ -390,4 +391,6 @@ font-size : 13pt; font-weight : 900; } -} \ No newline at end of file +} +======= +>>>>>>> setup test file with phantomjs, no luck though:client/homebrew/phb/phb.less diff --git a/gulpfile.js b/gulpfile.js index ded4eaf..39db0b1 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -5,7 +5,7 @@ var gulp = require("gulp"); var gulp = vitreumTasks(gulp, { - entryPoints: ["./client/naturalCrit", "./client/homebrew", "./client/admin"], + entryPoints: ["./client/naturalCrit", "./client/homebrew", "./client/admin", "./client/homebrew/phb/phbPage"], DEV: true, diff --git a/package.json b/package.json index 29b6291..8c60bd1 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "classnames": "^2.2.0", "express": "^4.13.3", "gulp": "^3.9.0", + "html-pdf": "^1.4.0", "jsoneditor": "^4.2.1", "lodash": "^3.10.1", "marked": "^0.3.5", diff --git a/server/businesscard.pdf b/server/businesscard.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3f6db6b31a2de076b3a955a278150e31945f4164 GIT binary patch literal 6889 zcmb7}c{r5a`@l(wp%;Z#JV+tTK8!W{mc&T*3^T@v8D_>#LMV!ow4jotvaeAQBD5H7 zC~Ni#$&wiKduHVA?fZVO>wEp4x#l_N+|PZVbKm#5&-2IUkvn8yqzqRe~c;GGOUW82fXg4ru5g99Qcc2Zb#k4&W);2EID2I>eH90P;H5pWbz4TV&Oq4&aI zdlews+7Kdzz>W|3&p3m9i2&3vh+&Llfc6k5P8VR%{Mj7~0Hy*%K%nk;0ImW9)1bTB z>YCyJ54<;>ql2d(1E2?~6yopcQNN~lgdV~(7(^NcfEo}3$nHdIV?F0JA5{P4gFc>t z_ok8{pcRQo2N0lw^*@|O|I2`_$JVA1DU4t0P<<+e0S@Va8pj-JO{7!(Y3|^BaM-Fu zmqMX}&*ALNwuV40hy*fTj~WCxvY(@|Xh02xaQ?@-9J{ru(5HG+X*gfJI}upT?&N(L>wwI2;-zjFNV9oIZL<))F31C-!H6nY1`vO3XyumFuAi7ftMD|>C z23Y7mkf8K(>sMa&FwyYGNBypCtT4Tb5+ewSi-ifB@q}&*Jr}>TB))NDL|v4p zQN>~aEK*GcrHVmg5a1?5O~KbY-p18+gm5@`#Z+*dPY%dQ>FD6HBk{FY4{6MI&o>*}e}Bz|e9}b!sx_b9w~#?+%8BXmODhjap64^YO@a!I zcX!8K+1kIH5Zd@;scPA>ENbcNNfYQ+QS7A)m}e)0bT-iwHeB{(9q8WzTiJ7_NkHz) zd*f?4)Vd#WFb_kmeW7vLxhGM<_+9cX%+wZz65c`Gnt~QN;Dz^uy~ zfp`AueYD_9L6WFrcZ@^ z(m5KDQM2;&r_JNv zX@v!^pY#it!JtE)p$UXOs}7f-O?>|-P{K7%6i<5?0KU) zolzLL=%B8#_ilue@Yu15!W#Ic15d@9TCGDuU?@aH!5qUERq3?MN<{KVgd<;@!GyP| z2bM1i%xVmdK5+ODR^!^%)qec;VDWrSc+i||O3C@V^yuZ3?~FqsBj=N<$6m!UlPXwU z*y-9=mRj0h{WlLST>q-k)gy36&2I+d$5p`^ub1(->Jr47h>ZMp{^Q4jQt#k}&kJ`y z?T0R3tcqEfsov82pfM*DzamWgl9Xd)}xIG%MO{5&3pXLJiMl$ zwa)mdW5k~9zK~-C1})6@T*<3igWFz)%)bKs^%dp9UeY3)+_RDWxaCM&vMkVq@0EMZl!9y z51;1yQ{f7zWVwh$iZa&z4zZ~eUFLEqqVq!o1>^! zlRMZbS(Q+exY0sydl^+N=!cSy>^BCyT0gy>Ya{kx1Fp6lx5$Zcl98zBHal*yqm=kK zLT@oX`t0Jv8q)I=M!?T#mR1-%u-=Hbc}d~Pqxc=jqRo2@gW$!KG*Yab3;H8WoclV2ZU$NAtOiO2xN~>Ncvy3pHFYR@v75TG7C! z!G8M{&ofq?uO>{khup385+5AS((KeeQO($@7<9mY|U)IfE3cmB%(GD$GEa7(XRGve**~=_L0eXEC@l56VT=7Q+7UKghIrnZ7 zb}q#@qxzh{3C zFR4%#(b73RUeoMPm=Q+i>v{B){{);qgjeXOnNMCA9(rFJUo0G4VOzb|82YF$=~!bU zcalMaTc*ya)3%@;Lg%$4esmP^v75B0{!k88uAaSO})v5ekwm`sj`sNZb@~+xF6Z{6W~{ z(9ycIGS9xPqN(b8LmkWMt`8pEx&yU>$4^j&_Tfq`&G`l~~S=PE_|@_JIwc0Pey-_oxnSaKxD|)Vm^z~+wVIq4gMlc zoJk9^jz}eLxOU-jWCGQwwc2X5xhn0mW);h9P-P1%rn#d) zg4J^W&eDmz9cbPIELLg^sqz%xj|Z&8m7>G_HD56OU0XU#lKr<$)ZV`%+S=fnsH$naAu-Eql`PGE2xiur$W#k*D!(59(BChNY^=;)%PXB^=4Wl(E)6+y)p`H-Z{f~5k+1Fz_XW#;5{AchI z?S@KL2DMtu&SHpGD|1t5%;>4XgeSR@hqqxn_oMt*WTvV%G*>MjE4o^jCd04M0eg)q z*;567Q68nK&@vvoP8*&y&*N_xr1z=Mx{%~=5H|*r1e+K2TTaE zQCWf`@rAMDPPbu+gD!zZo3rkSJw5fN9Ae+}S!^uhv#55m%IsPxK->k{;u(yRu?FbVZ9D%+p?#US@f6 zcXFdUM)VB=P`~kPShAwSJ0FNr5PM{2c6zk_P~EYEI&JX}#seTXh}>fF>j&P|iD~Y$ z-5#%;Gft=J=G+i{-Xt@9f1xX=eI}&%j=RdZBBa>){rde6Y;)CfYHmYP54&8;I9zsx zXD-pfmUd4wYiDR_7)szOvvUqB;YO=+vdMI-)lj8RN2-4Umh$sOMt6MmRiS?2N^dG0 z-)E?{yO}(AelQHZOI@;8oEdpqjz5eW4jJ!45&&SUTQEI>%aL=rj+{ zfxeimEI$W==69!=(S&IIWD6Yg9s(Mjel0)cM38;@!E(Ot1AYmczLk`PPxf6gGQe&S zyeG3|@8@EkcZyTwBZp(g?+uJ)4Bvzd%ZJe&W5>e!GwYG9vVz6Q*KjjSI9nhDYGuBE%hm7$k=q(I>(pdk!OLwAR(Wm;nQA)+jg8N zX5Rg4S){nzwj>qjHfI*QgLyZoCN%?bDR3^l@m+1^_HU(;r+$zXJB~HFAOsK%<+-R` zR`12`)p1{LyRRgcygtV!eJsujIM`#9l6~RJl?-3SXKv(*i)Ov2@(nvW32K`LTZFq# z6EVqM+j)1~^_8I~$aUDO`6W0f$+hb#h0ynjS>)Iw8r{+yzuAe7xSci$3sp|7d}@n7 zD#Nd8DA+2y?d9(6fu3pchHtt%Jy2rrPvC>l;z>kGOlOGFg?>y&o#$nr7~B=R^&y_| zK0Y}W$)DsakMfkBwsX_k;BqtVm4OHEqxxM5y(hTMsV4{h7-GG=vkDDcO({KQjRii0 zP9sE(cudPXc|f4>X;!`1da=`S?rG8$;=O`L69x))+nHuwJxd|U#^d^-fgg>A9GGn?BL{(DmsW9`($%;|dVI8zw&(@6E?D|`&@%2JVQ>&88k_umo~=6>PQB(NY6d7JlO?Xfv-IBYtPW(8f}mY$i9@Vb8f|H z(LCs}LbY7=NQvAa(}A?a^mHUoWuxr$LwiNOrq4f^zdEm|S$LvCP^bNe6knrd-n#JU z<1R8kE{tK>f2mu=+pkS)#zwyc%H`LVpCtd+Tq`w=3LtFGs z4cNeijb0ECs2-k9+FXfdw8Ue{1#- z=n*zbbi`m)0SrnNK%vwC1Of#hv1+S*6c#{$eP_rYknuO&1lBML3Pdfxp&WZPQwo^@ zKtcZOjw3Pv4>E;7`-L|FH!w5`1oVtR2I=7Hh;w)M!TWMt{eR@*us-hJX#faB4{#zd z*j2#ANulyu*vg>IZw(F{1APH4;H%EC5hI<=O=)-vNNqJ?;H3>{8i5xFOaI4n#Hy8> z$DiuItT+v44mdamI8xOH9KjZ4#2I4LI1Pfm01Spfa~f6bYJ*yB5ZbGpbZrH&L^+xI zJ3e=R8k;L~(#eUM9Sxa6{5#{mR9|-GuKoX{hin4&Z&LV=Qf6leMC$*mh7BoTV%YWh zcYP_FtWiAzp2A?)KOJy{a~L$p1Z}8?DP(po0XVy&tbYUI-|Q09;+!T9W`{t{$pkt8 zafER6!J-5ax<6R?aFA~QDm0Me8yJB{k{AS5pQ#T>-SvL8`v0uqAR4&cFaWL!VeilC z1z^xZD(Dgq?rf9kFy%3x^Jzt(`M!v2db2Hb`}ZQ)3er~Zcwjb_98KlRY6n1AH} zjlzPTB-Zp8G&~4oX`F9UIC2QM!KxqvX202feaNt;QW*gIs|x390-b@UF*rK{zJ%Zq LIXOd1Bgp>&2BJtd literal 0 HcmV?d00001 diff --git a/server/pdfConvert.js b/server/pdfConvert.js new file mode 100644 index 0000000..2878878 --- /dev/null +++ b/server/pdfConvert.js @@ -0,0 +1,26 @@ +var pdf = require('html-pdf'); +var Markdown = require('marked'); + +var style = require('fs').readFileSync('../build/phbPage/bundle.css', 'utf8'); + +style = ""; + + function replaceAll(str, find, replace) { + return str.replace(new RegExp(find, 'g'), replace); + } + +style = replaceAll(style, '/assets/homebrew/assets/', 'http://www.naturalcrit.com/assets/homebrew/assets/'); + +var content = Markdown('# oh hey \n welcome! ##### test'); + + +var html = "" + style + "
"+ content +"
" + +console.log(html); + + +pdf.create(html).toFile('./pdfs/businesscard.pdf', function(err, res){ + console.log(err); + console.log(res.filename); +}); \ No newline at end of file diff --git a/server/pdfs/businesscard.pdf b/server/pdfs/businesscard.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3f2105d1f7a43c10a217da9898734d7376703b3d GIT binary patch literal 10253 zcmeHtcU%)&w>F5v5u}SqlSq*w5JCz?iqwEe@7(~QLx6-XC{>WIV5L{-0@9lv5ELoW z1*AwX0#c+%yOVf4dS2i6-uwM=|NADtOj)zn+I#I;GxI!a4Y#I(k|0C~Mh*c9gD{p3 zCpp(@(;&?GFLc9p!^J`E#BL>PQ_F2!AaIZvH)4fMI-7 zCBPFxDj2|vsN4wbK>_8B_ zyTGuO?45v11Oh8L0asrEZH2K$we1U51_JgT+Ln*1#+@k5k z2lK0K@9uwCrF&D3ISxS{k8NxtCHGPL?=04*>--soynXET&5Erh{UI`Jdc}I~U2NVG zGP6^+%#RKVR**9JQ`~CTO7^ve=2JVgC zw5g*A+gK%{*eIXM^<;)>6T-D_mgyE`T6+}EIB+je!+ksi>@NMNU4}C=KnZzx{pPA; z|3W76mW0w_RLr-9p4396rW>)+(SDcH@}WQJ=)%zeY=)eJDPH< zNv+d%B&Dg|Zmcm7RW(21+@$2k*EF1R?7BC$nJ4JY2oDhRzu6zRGi<)e8TyVouY`Jf zC%baykoN*l0f(96{4`rvF2&*TSInoKwaUDG|A`v|qSaFUrQZIRN<6v9w5hVhEM+RP zBsiw8j?k)KzV6 z8WvRhB&r|r{7-=aW;<;G_F%hiN~J-ySqXRT;F>j|myQ}{SdQ_qsKJB+?x(NJ6$;wZ zjEhYD+Ko*pVD_bQOtaT~B&=I0k!qRQ;}H(}jrVv#l3NvnzVwDCL`0&T#BnV2$M~=B|#^lOfy6s6O}pi67flvsSxd z1%D4rCgXCwPi2&WO~wPq9*OXn{QQOvyM=z{t@sn*jHPqJ41$top*eNRB;;Mw9!Zi@ z9Unv^4c|N;#|AFmo*vpo9`(h*qZ3H8&yEzIMn9B(>5lwVal?CKlX9B!1jBt43Y?D3 zzG;&DdSyV*guj?p%&N#rU_oWb%ul1Un+K4T3ciSrB%;$n36!+u)NfTM8vq)$ox1phN z=4m(PP^t9GSkeKl8|u?b=GO-1?xj1kz2MO*q?~vgPW6XKT@)L}^L4k6bTxzLf>1PvFgzn zXh)Y%Ot&SQn|ks!EHse5(7d+PwP$7$R=8$&f}$=77rA9jul-2yfn8K=+Oc6FV(jqw z`WX5(Cdqr9v^Y+&no8381#>C=I8W%?RBxrStLk2?D3*Fo<2cIBX$)M!;v_$^zyr&q z>Dbf3GFDP4-d1g$kQPrCSF4o-@?<_iT&A{e+Dn_V|0Nvb+GwuqYjZ(CMon6|F#}(1Sj+QXY}>aA@g}W%tfdke>>8B&&O7&3 zj>7VssFyim@VNCbg(wM!G6oq3ktxIe9b@P2RRyhUxhB*!i9{TH(;rf3V`^Wy?fN|5 z*S}B8#_I~}gd3$9J{@}E)JlueWTs>bXf(S!zaMlyHb)?f*NIJ%)b3`C%S1i{Bk-nnOebVZXwbk-D#BNAaZF}Zh zj_5;NO!V{!jlkAf7V6lRnA6dBt>+Q^qBHa|$!@lzhon5r7g=W7oz6!f9$jVCgM?EZ z^A;*w7hB7RolgRDNZg}|St+0;(d;eCmA4wan-$O)$zkv&oR1u1&aH2tu63e9+JO-X zJy1Ug`(rb6<>-}XcH*az;K^%OGRov|ffkBpDMsBM$ez!JOv_1juQBs}pTzFCph}o{ z5<~ePlehG^>}zbaRx3+wJYMF_&+Vr(&sC zJ}o77)L&*+v%;38(D3H(J!_oXhf&>hD*3dEr7D{6wXWfuXH7E1b_F)uWM`UcRBgH` z&qkFyJ^1M0JKGPEbWS@NMDOy-?`-#C5_nQ-+_7jcqx`}O#7ko1byU~h)Jp?t8q7IQ zv0b9GCSgZZ(l4t}ftPF#Ki#y83Ua(t$siz0;aV2OvF*C*HrE{0?Ro1N>AJZEd0XA{ z4T+0Xtbx^?^p+Whmm%@BYvY0Ewu1H5Q>a;cGFSb-NncdbT5e8Bm_H5Cdhr|`O_%WM zF>}3FM85)U=kBFt)1ng$`is8#PvXr;>$Tgptw_+~E@l1G^tJs#6amY9W+Lr7j}ped z;bh2swWYkElJNWyYt`;oEE|V+voYz?{0z>yE=pohwfuJ>A68BvdCRsI|AavMFXu`p z7idv28u7HaAPwKOOJ1B)i5u53y3`UNU7+@GRciGEaTQwb`q?&`J|8*B%!1;G<{R%q z#NG=*#B0^U*-n)>71B@L@nMU)!%$|&zZ~+&``rTAI)#SpxV5@7$V%?B(`)$MZyr3Nk-6Dc?Qf;- z{8@kksr@{C$2n$)POLp{Mvp>^$}Q7YvAA`ZL~;0$4vy%Vu4f(Oat7Not=CL44xbBX z-}+T@uhJ>Du~u~Gx)I&+tv=~}!bieNLi0;$AIsz&r;?{D&wLYc9rp6AF`~h-FD>EL zAcXLry8=vF22C?v#)mwH(0E=ksY0}oN)&a_eQ03$=>AJ4%y7xyQIOa z)pS90CcwYsosIwVr`9?z97^1M<6%Wllyp%;23?-SU0K!z3{s>6;Z%2C2XZ8Dg|d5L zCe?(=c?^0UNppzZuIXf&#W>77^9y0nb8*|hOW(48BAj1hBtuquYG%>X-GWW(>_)V3 z@any3Dfq7J+trJk;x0X3b7Vi$!Rdnd$uMqycH>^GB#VQbJ5nr{a1Dp`Pde14+n#a< zzsfl0b5j~Q?XOy}oJUR7Et=G0#12(o`Rd;$U*>4sJzqVH-sv4<+910Uc;P*jdaDdn3Ba>;fXH-3KbF+6BkB^05bfb@Ipa|C`1S1ZK_I|SI)$tz(&{@@@%MIYScP1?iiUxcyf_Y}#zF>mZY7&}y;}Slf zxZQ=s>Wv(~IKd{EcE@zpFE{?~S z?ql9YP6R#RthSb(_t}82uTCuce7jHK&Y!G&@TV%*svjrEYL(6{eaDRuuGvcErJQ|8 z#u%pv#M{nw_x)u0=xUo+(=yeBKXtd%^6GQ08KS{4_hJ?HdROWBNsOi4AGcPEsLl7@ zC9~h!UFsg+f0bO&RdHN+>DYTM3%fF|u#sal%;X;d$&22cEA$lXgig)vBqiX($%Y zE)ct3+i^VrElRPnUrfGq$lV+J@=d_wQk>kkdlRKN?d?lLf-7%IXBbrLXdfp?#^3Dh zm5N`N>b=&8UVOothV=V4utgp{8&{ddTn>@c==a^4N5YGlS!x2Q zJpRUuxRzsFi@t?*JvbaKyHs}ZAs1Lrv!GXfD-yh{eZOgXsbe-P)K=|oHAcCoW~u(u z!Qh@$vBi}pH}i)U8Alp#AmT#wX>-{er``-?M>tYCN2$ zSb8r3GQ>4My*TZ|w8O!*KdWU9oiq?{I#r{%u$69aG?FFxIQR(h0@GXEs+S>ip;*Ft zgjUsjVGrUPAU4y;o0(P~)ktha?a4qqpcNOXzr8%!etuwB&3pJvrg5uxXuPi1SKDYi zZ+GScej6N2LtqNREakzHhrImsk)ZH6(X`;45)$#4FSXX>OS7%I&8PbrI-hEpd!$}} zmFB)V-Bpg2P-)tn@d<77$*F5f>b@D`rnLd|B{&x(C~>`tyk~ zCzYU5!Oh^o0rkifyKVg%M7Y;A{kZ+>Tqdus2d6Ngvad!naMUZBoYFs1_oTG=6!WZX zJ9^+8*9$saBg%22yrKC+z9HqQf_L*~J5g1F?upOtF~6$iEae~TEEz$JQO9cIsGsF% ze~2*Ns;ALE?CN1z9zB#`cy*N%Qu@LUyb!_iQPerZfb0mqefOX^o;hn1qT88LGFlhW z{{Cs9YF}{w=sQmgnXhhHd;2ZTn4k;wPV3s3{4MO|mdoRCr3kkaT#pUT&tPd4#%Xrt zt*wC`3*)fg%{iV}NOVO@gUwuPQ5R#a#2Bq_#+5=@N9i6|DcSe|*!Hdbw#(X$hcPu* z@9gLrK3qNz4JX^%@mbPy?q2I(4DQNIYxI=4AM{x;bU%%0F)yd_`s>}nl*McCIuj+P zoiHhI5S5Y5$^)n3;QT^2|K@FHE7=L*jy+9^0&Z|Jwx$kw%)UXJkzo7zu36~e$28NK zHP~3QpLA2-B ze4_o;fxAx@V|uDdnx@ulFNJlw#*&G%qIZh>+Ku1r$CLL6S&Q_CRQ7y%A#7gK%g8x= zhI{(3WybZRP5s+sZA$+?wms_~T(~e06AEfysG%)cq@pv~mYV6Cg)FRm(>Ex8)6(5n z`$)8bN@zKbS3x~!ki@raaavJ{Cds1Pd3nyquBd$T^Fguc^kcdt7PhFM^1NW37bPtQ z@L}-vMt$ecS5hCnCa5~|SECG##SdHyksq=q5IO9^>y=hPR*56d~PIZHln##!7J zGP}Y(krvHo_fAVhb!_u|ax=EQeeteJRN-xdZvu7crB%1}=2mVEro^`Pp`-jzA#No$ z_K+`57fjE6v;FKuT5Fr9acHpLm&GV2lUtO_WSR9uZ$8VPy3-wZs+;@Gtes5rqv$G% zC=~PNr3ZYzX%E_*3YFB?#cge2$fXI^#^h%rEjPl(abKRcU{9wM9F;#Zn^P$bPqaO6 zAG4rl)Bzh2cTawHJ?9crbVmO9Bx0%9Wv6hn2VT>vhz!A)F`q84tm`+K{8G8xBWJE7 zF1;0m8c1Amz&=K^j_G%o)8+CeqFQR6%jFm~wC<-#L`T04=V?uuLoBIk4vdp*hxgER zlzh03X;akdrlJ3OnbCM$ZPRe3DpImL{B{$G(6_oU_WiFxO%^S4>p4@>D;K;{y}D~H zULU@LsKE;@Zhu5KMm#mwS3lr)8>8JGJi{fr%U(4ScYLCs$RXu-tc6Dnc&sHN3={nu zYyHgf|BAJMVuXh!jsU&nRTS`O1&_l-$iZ?bESiug2mcG=0-EXgU;(6~;$njV(&!+d z5@2f&pgkWDuPjgmLGyvY8t&F;cY7CG5U+|g0GjM^K7dfi!`0OZ?TiOe!k`~{_@7u0 zL_mW;-W=#a7lTw$P(uM}{~!9~U;}&|!9+|%1cU&B{`WLI=m&O!0*LQt zx*cy-#l;>60s}=RD;+crWMl7Q?fzE{17r!f;6e`IMQeK?@&EmZu(onWxe|u-|KPKp zyw30Lf~?UtfFZ!C?{JndRf0d<69jaAwje-ZU@U+JR8Rzl0O$sO0f~tSgGAv_At+(_Z#c&a1IfKI6z_umi|5G z5cy#m`cKaBy;k=N=lH!|1pz_CpopKG1GvHdSLLf@T?;22^jVqQs$0(%CizWFYC}r| z>#7n<+rNQ1*@&yo>E?$pJdEQt9jU7Q@4?yHbH~|+jlAXLJUw;eo2O5>N#}#t zQL&_{n)DXu=r2TFayZd7h&^_qI>WrznDlXC&wu{PyjSD?7{wn%qmzP@MCMG}I|Bw} ztStg@4M}f@lvXPAsXwg|ogphPOHe;N%3!ov^^ufUXZG|q zR`#^7{kd<*WAS!KKkic7EAopQGN4q3?4UErH5PB06!kNh$8Kaqe1xp3+^x=&qCAsv zKJXS3a$|s;m2|s2ux_kgw#H=|l|dPIQg|Frsp)m@HqqLYVp-OD!;A!mx%!wpU8d`@ zn^h5el>X}3&$p$B>?$8Amh*;$D2u(fU4DL2Q5I*?v0`I_Oas#)jNLo~W+Q8il2T2K z9;ce!ZSXzx6$vZ-l)a!7;Z=@==kMN{7xIydxCQEq{rg@WSYDF$Db1&gixWlA-Ms#skqviE9iN*u)RNGeDW zvCr(jejyH}{Bj|5=NUg`;T-)QPfPMGB@bfJfH6MfRL`|kU+n&<&_hu57S`26UCuPn4KO#{( zF1ZSK-VggYzNrGou!pgE9w!#WROWt>Y>!Ae?4JH|`jD$W`s7HjP!(^+fP?M&6|a-I z!D~tzV}9NI2IO!Gzwv5s8|0SgET@n6i`AYYEf>ZhpZi%-A5Ay0+>I3@#_(}Hs56_5 z&e?mdA~VrLH%`iA?n*?t8YC8@80(3K>;fXqYDu9d7Xw^)eZ5~~qUbf`a5}*(jlHGB zBa=LA*tk}6HkNd1ncmXVRG+?uNw~6@j}$VD6-K^n=8-_WAKJ={5nl-QU}Jd|Xn=DH zlG<&E>3qpTrOm}$RI5(uC;=~A?0=r4)BNQ7!4j)L^iX@v^~(18U}?{^CYcV)P}3ZN z@=Ub7d@ z2x|_p)YKe$2fFW-kV3c8PWLc~e2Yd@;W7g}N10cxL%h9x5_bLNSw+UT=UENBqGb8B zid(WM+|kvb+0Ecy?^ARMFXTeGs?&0qbMDd2*i+@d=I5F1P%!6jRx$3<9F*)q&!!p_ zJonBs6htSu%!*KKg`M9=5?7WU|FKf29mvcSEcVrct0~Jf*MpnhatpJR-2}_rOYP;I zBi4%*I%?99DtnbCv#>@jqa-T(r9cU@4H-XiaB6t$#-G2T7Q%A}{|<);i;4e0Ex=>* z=ZpQ{zBc|7YWdF(?EgCegMY95PXGo169>WJK%xhLCn7*j2nL0NU@&|d>Q_J`^7Dh4 zpMXYO{Qm=*{~e%#OM^@RV1rO1;2VS(VIzV^On?wL32a2grGYsIqVWF+@BF~vc!2zG z1NS$)^PeO3e+hjEH_Jbv4q{~Ed8?f_~P28lq)@i6oI0z$yy zK$zQre#!tGf?q%`KV;$v2ry;;lnIN#fcxNIWKaOC{HqLxe|Y?}ohU@~_dZ~V-}``y z0$J#P>I#cOfm`{XG8jbo_kQ89-})8CCx(C175S}S7*y;x-w<%F z-iIjk-^k#I-|UHr{w@<2{(bJnL}9=9fpbRzNo;q*_j@|_zG(dQ1rrG1U*CRdV=y?- a_vashbfMgFgh&t