From fb613bb70e9c98febf791f1209cc34b096f9cb25 Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Thu, 18 May 2017 13:09:18 -0700 Subject: [PATCH] deflation seems to work --- pitfall/pdfkit/lib/document.js | 247 ------------------------ pitfall/pdfkit/lib/reference.coffee | 11 +- pitfall/pdfkit/lib/reference.js | 117 ----------- pitfall/pitfall/param.rkt | 3 +- pitfall/pitfall/reference.rkt | 69 ++++--- pitfall/pitfall/test/test.pdf | Bin 610175 -> 645078 bytes pitfall/pitfall/test/test0.pdf | Bin 1163 -> 693 bytes pitfall/pitfall/test/test0.rkt | 2 +- pitfall/pitfall/test/test0c.coffee | 10 + pitfall/pitfall/test/test0c.pdf | Bin 0 -> 693 bytes pitfall/pitfall/test/test0c.rkt | 10 + pitfall/pitfall/test/test0crkt copy.pdf | Bin 0 -> 701 bytes pitfall/pitfall/test/test0crkt.pdf | Bin 0 -> 701 bytes pitfall/pitfall/test/test1.pdf | 57 +++--- pitfall/pitfall/test/test1c.coffee | 18 ++ pitfall/pitfall/test/test1c.pdf | 76 ++++++++ pitfall/pitfall/test/test1c.rkt | 22 +++ pitfall/pitfall/test/test1crkt copy.pdf | 76 ++++++++ pitfall/pitfall/test/test1crkt.pdf | 76 ++++++++ pitfall/pitfall/test/test2.rkt | 2 +- pitfall/pitfall/test/test2c.rkt | 77 ++++++++ pitfall/pitfall/test/test2crkt copy.pdf | Bin 0 -> 1243 bytes pitfall/pitfall/test/test2crkt.pdf | Bin 0 -> 1243 bytes pitfall/pitfall/test/test3.rkt | 2 +- pitfall/pitfall/test/test3c.rkt | 10 + pitfall/pitfall/test/test3crkt copy.pdf | Bin 0 -> 922 bytes pitfall/pitfall/test/test3crkt.pdf | Bin 0 -> 922 bytes pitfall/pitfall/test/test4c.rkt | 68 +++++++ pitfall/pitfall/test/test4crkt copy.pdf | Bin 0 -> 2818 bytes pitfall/pitfall/test/test4crkt.pdf | Bin 0 -> 2818 bytes pitfall/pitfall/test/test5c.rkt | 20 ++ pitfall/pitfall/test/test5crkt.pdf | 0 32 files changed, 546 insertions(+), 427 deletions(-) delete mode 100644 pitfall/pdfkit/lib/document.js delete mode 100644 pitfall/pdfkit/lib/reference.js create mode 100644 pitfall/pitfall/test/test0c.coffee create mode 100644 pitfall/pitfall/test/test0c.pdf create mode 100644 pitfall/pitfall/test/test0c.rkt create mode 100644 pitfall/pitfall/test/test0crkt copy.pdf create mode 100644 pitfall/pitfall/test/test0crkt.pdf create mode 100644 pitfall/pitfall/test/test1c.coffee create mode 100644 pitfall/pitfall/test/test1c.pdf create mode 100644 pitfall/pitfall/test/test1c.rkt create mode 100644 pitfall/pitfall/test/test1crkt copy.pdf create mode 100644 pitfall/pitfall/test/test1crkt.pdf create mode 100644 pitfall/pitfall/test/test2c.rkt create mode 100644 pitfall/pitfall/test/test2crkt copy.pdf create mode 100644 pitfall/pitfall/test/test2crkt.pdf create mode 100644 pitfall/pitfall/test/test3c.rkt create mode 100644 pitfall/pitfall/test/test3crkt copy.pdf create mode 100644 pitfall/pitfall/test/test3crkt.pdf create mode 100644 pitfall/pitfall/test/test4c.rkt create mode 100644 pitfall/pitfall/test/test4crkt copy.pdf create mode 100644 pitfall/pitfall/test/test4crkt.pdf create mode 100644 pitfall/pitfall/test/test5c.rkt create mode 100644 pitfall/pitfall/test/test5crkt.pdf diff --git a/pitfall/pdfkit/lib/document.js b/pitfall/pdfkit/lib/document.js deleted file mode 100644 index 691a56f7..00000000 --- a/pitfall/pdfkit/lib/document.js +++ /dev/null @@ -1,247 +0,0 @@ -// Generated by CoffeeScript 1.12.5 - -/* -PDFDocument - represents an entire PDF document -By Devon Govett - */ - -(function() { - var PDFDocument, PDFObject, PDFPage, PDFReference, fs, stream, - extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - hasProp = {}.hasOwnProperty; - - stream = require('stream'); - - fs = require('fs'); - - PDFObject = require('./object'); - - PDFReference = require('./reference'); - - PDFPage = require('./page'); - - PDFDocument = (function(superClass) { - var mixin; - - extend(PDFDocument, superClass); - - function PDFDocument(options1) { - var key, ref1, ref2, val; - this.options = options1 != null ? options1 : {}; - PDFDocument.__super__.constructor.apply(this, arguments); - this.version = 1.3; - this.compress = (ref1 = this.options.compress) != null ? ref1 : true; - this._pageBuffer = []; - this._pageBufferStart = 0; - this._offsets = []; - this._waiting = 0; - this._ended = false; - this._offset = 0; - this._root = this.ref({ - Type: 'Catalog', - Pages: this.ref({ - Type: 'Pages', - Count: 0, - Kids: [] - }) - }); - this.page = null; - this.initColor(); - this.initVector(); - this.initFonts(); - this.initText(); - this.initImages(); - this.info = { - Producer: 'PDFKit', - Creator: 'PDFKit', - CreationDate: new Date() - }; - if (this.options.info) { - ref2 = this.options.info; - for (key in ref2) { - val = ref2[key]; - this.info[key] = val; - } - } - this._write("%PDF-" + this.version); - this._write("%\xFF\xFF\xFF\xFF"); - if (this.options.autoFirstPage !== false) { - this.addPage(); - } - } - - mixin = function(methods) { - var method, name, results; - results = []; - for (name in methods) { - method = methods[name]; - results.push(PDFDocument.prototype[name] = method); - } - return results; - }; - - mixin(require('./mixins/color')); - - mixin(require('./mixins/vector')); - - mixin(require('./mixins/fonts')); - - mixin(require('./mixins/text')); - - mixin(require('./mixins/images')); - - mixin(require('./mixins/annotations')); - - PDFDocument.prototype.addPage = function(options) { - var pages; - if (options == null) { - options = this.options; - } - if (!this.options.bufferPages) { - this.flushPages(); - } - this.page = new PDFPage(this, options); - this._pageBuffer.push(this.page); - pages = this._root.data.Pages.data; - pages.Kids.push(this.page.dictionary); - pages.Count++; - this.x = this.page.margins.left; - this.y = this.page.margins.top; - this._ctm = [1, 0, 0, 1, 0, 0]; - this.transform(1, 0, 0, -1, 0, this.page.height); - this.emit('pageAdded'); - return this; - }; - - PDFDocument.prototype.bufferedPageRange = function() { - return { - start: this._pageBufferStart, - count: this._pageBuffer.length - }; - }; - - PDFDocument.prototype.switchToPage = function(n) { - var page; - if (!(page = this._pageBuffer[n - this._pageBufferStart])) { - throw new Error("switchToPage(" + n + ") out of bounds, current buffer covers pages " + this._pageBufferStart + " to " + (this._pageBufferStart + this._pageBuffer.length - 1)); - } - return this.page = page; - }; - - PDFDocument.prototype.flushPages = function() { - var i, len, page, pages; - pages = this._pageBuffer; - this._pageBuffer = []; - this._pageBufferStart += pages.length; - for (i = 0, len = pages.length; i < len; i++) { - page = pages[i]; - page.end(); - } - }; - - PDFDocument.prototype.ref = function(data) { - var ref; - ref = new PDFReference(this, this._offsets.length + 1, data); - this._offsets.push(null); - this._waiting++; - return ref; - }; - - PDFDocument.prototype._read = function() {}; - - PDFDocument.prototype._write = function(data) { - if (!Buffer.isBuffer(data)) { - data = new Buffer(data + '\n', 'binary'); - } - this.push(data); - return this._offset += data.length; - }; - - PDFDocument.prototype.addContent = function(data) { - this.page.write(data); - return this; - }; - - PDFDocument.prototype._refEnd = function(ref) { - this._offsets[ref.id - 1] = ref.offset; - if (--this._waiting === 0 && this._ended) { - this._finalize(); - return this._ended = false; - } - }; - - PDFDocument.prototype.write = function(filename, fn) { - var err; - err = new Error('PDFDocument#write is deprecated, and will be removed in a future version of PDFKit. Please pipe the document into a Node stream.'); - console.warn(err.stack); - this.pipe(fs.createWriteStream(filename)); - this.end(); - return this.once('end', fn); - }; - - PDFDocument.prototype.output = function(fn) { - throw new Error('PDFDocument#output is deprecated, and has been removed from PDFKit. Please pipe the document into a Node stream.'); - }; - - PDFDocument.prototype.end = function() { - var font, key, name, ref1, ref2, val; - this.flushPages(); - this._info = this.ref(); - ref1 = this.info; - for (key in ref1) { - val = ref1[key]; - if (typeof val === 'string') { - val = new String(val); - } - this._info.data[key] = val; - } - this._info.end(); - ref2 = this._fontFamilies; - for (name in ref2) { - font = ref2[name]; - font.finalize(); - } - this._root.end(); - this._root.data.Pages.end(); - if (this._waiting === 0) { - return this._finalize(); - } else { - return this._ended = true; - } - }; - - PDFDocument.prototype._finalize = function(fn) { - var i, len, offset, ref1, xRefOffset; - xRefOffset = this._offset; - this._write("xref"); - this._write("0 " + (this._offsets.length + 1)); - this._write("0000000000 65535 f "); - ref1 = this._offsets; - for (i = 0, len = ref1.length; i < len; i++) { - offset = ref1[i]; - offset = ('0000000000' + offset).slice(-10); - this._write(offset + ' 00000 n '); - } - this._write('trailer'); - this._write(PDFObject.convert({ - Size: this._offsets.length + 1, - Root: this._root, - Info: this._info - })); - this._write('startxref'); - this._write("" + xRefOffset); - this._write('%%EOF'); - return this.push(null); - }; - - PDFDocument.prototype.toString = function() { - return "[object PDFDocument]"; - }; - - return PDFDocument; - - })(stream.Readable); - - module.exports = PDFDocument; - -}).call(this); diff --git a/pitfall/pdfkit/lib/reference.coffee b/pitfall/pdfkit/lib/reference.coffee index 8afe447f..0f0d4acb 100644 --- a/pitfall/pdfkit/lib/reference.coffee +++ b/pitfall/pdfkit/lib/reference.coffee @@ -11,7 +11,7 @@ class PDFReference extends stream.Writable super decodeStrings: no @gen = 0 @deflate = null - @compress = no + @compress = @document.compress and not @data.Filter @uncompressedLength = 0 @chunks = [] @@ -38,9 +38,7 @@ class PDFReference extends stream.Writable if @compress @initDeflate() if not @deflate - console.log("chunk = " + chunk) @deflate.write chunk - console.log("wrote chunk") else @chunks.push chunk @data.Length += chunk.length @@ -50,12 +48,19 @@ class PDFReference extends stream.Writable end: (chunk) -> super + console.log("end! " + @id) + console.log(@chunks) if @deflate @deflate.end() else @finalize() finalize: => + + + console.log("finalize! " + @id) + console.log(@chunks) + @offset = @document._offset @document._write "#{@id} #{@gen} obj" diff --git a/pitfall/pdfkit/lib/reference.js b/pitfall/pdfkit/lib/reference.js deleted file mode 100644 index cf745f25..00000000 --- a/pitfall/pdfkit/lib/reference.js +++ /dev/null @@ -1,117 +0,0 @@ -// Generated by CoffeeScript 1.12.5 - -/* -PDFReference - represents a reference to another object in the PDF object heirarchy -By Devon Govett - */ - -(function() { - var PDFObject, PDFReference, stream, zlib, - bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - hasProp = {}.hasOwnProperty; - - zlib = require('zlib'); - - stream = require('stream'); - - PDFReference = (function(superClass) { - extend(PDFReference, superClass); - - function PDFReference(document, id, data) { - this.document = document; - this.id = id; - this.data = data != null ? data : {}; - this.finalize = bind(this.finalize, this); - PDFReference.__super__.constructor.call(this, { - decodeStrings: false - }); - this.gen = 0; - this.deflate = null; - this.compress = false; - this.uncompressedLength = 0; - this.chunks = []; - } - - PDFReference.prototype.initDeflate = function() { - this.data.Filter = 'FlateDecode'; - this.deflate = zlib.createDeflate(); - this.deflate.on('data', (function(_this) { - return function(chunk) { - console.log("got data event for ref " + _this.id + " from " + _this.toString()); - _this.chunks.push(chunk); - return _this.data.Length += chunk.length; - }; - })(this)); - return this.deflate.on('end', (function(_this) { - return function() { - console.log("got end event for ref " + _this.id + " from " + _this.toString()); - return _this.finalize(); - }; - })(this)); - }; - - PDFReference.prototype._write = function(chunk, encoding, callback) { - var base; - if (!Buffer.isBuffer(chunk)) { - chunk = new Buffer(chunk + '\n', 'binary'); - } - this.uncompressedLength += chunk.length; - if ((base = this.data).Length == null) { - base.Length = 0; - } - if (this.compress) { - if (!this.deflate) { - this.initDeflate(); - } - console.log("chunk = " + chunk); - this.deflate.write(chunk); - console.log("wrote chunk"); - } else { - this.chunks.push(chunk); - this.data.Length += chunk.length; - } - return callback(); - }; - - PDFReference.prototype.end = function(chunk) { - PDFReference.__super__.end.apply(this, arguments); - if (this.deflate) { - return this.deflate.end(); - } else { - return this.finalize(); - } - }; - - PDFReference.prototype.finalize = function() { - var chunk, i, len, ref; - this.offset = this.document._offset; - this.document._write(this.id + " " + this.gen + " obj"); - this.document._write(PDFObject.convert(this.data)); - if (this.chunks.length) { - this.document._write('stream'); - ref = this.chunks; - for (i = 0, len = ref.length; i < len; i++) { - chunk = ref[i]; - this.document._write(chunk); - } - this.chunks.length = 0; - this.document._write('\nendstream'); - } - this.document._write('endobj'); - return this.document._refEnd(this); - }; - - PDFReference.prototype.toString = function() { - return this.id + " " + this.gen + " R"; - }; - - return PDFReference; - - })(stream.Writable); - - module.exports = PDFReference; - - PDFObject = require('./object'); - -}).call(this); diff --git a/pitfall/pitfall/param.rkt b/pitfall/pitfall/param.rkt index 5dd7a2e0..f6ec2c38 100644 --- a/pitfall/pitfall/param.rkt +++ b/pitfall/pitfall/param.rkt @@ -1,4 +1,3 @@ #lang racket/base (provide (all-defined-out)) -(define test-mode (make-parameter #f)) -(define compression-enabled (make-parameter #f)) \ No newline at end of file +(define test-mode (make-parameter #f)) \ No newline at end of file diff --git a/pitfall/pitfall/reference.rkt b/pitfall/pitfall/reference.rkt index b7e1289f..e83fb26a 100644 --- a/pitfall/pitfall/reference.rkt +++ b/pitfall/pitfall/reference.rkt @@ -1,31 +1,36 @@ #lang pitfall/racket -(require "object.rkt") +(require "object.rkt" "zlib.rkt") (provide PDFReference) -(define PDFReference - (class object% - (super-new) - (init-field document id [data (mhash)]) - (field [gen 0] - [deflate #f] - [compress (and (compression-enabled) - (· document compress) - (not (hash-ref data 'Filter #f)))] - [uncompressedLength 0] - [chunks empty] - [offset #f]) - - (as-methods - initDeflate - write - _write - end - finalize - toString))) +#| +(when (· this deflate) + (define compressed-chunks (map deflate (· this chunks))) + (set-field! chunks this compressed-chunks) + (hash-set! (· this data) 'Length (apply + (map bytes-length compressed-chunks)))) +|# + +(define-subclass object% (PDFReference document id [data (mhash)]) + (super-new) + (field [gen 0] + [deflate #f] + [compress (and (· document compress) + (not (hash-ref data 'Filter #f)))] + [uncompressedLength 0] + [chunks empty] + [offset #f]) + + (as-methods + initDeflate + write + _write + end + finalize + toString)) (define/contract (initDeflate this) (->m void?) - (hash-ref! (· this data) 'Filter "FlateDecode")) + (hash-ref! (· this data) 'Filter "FlateDecode") + (set-field! deflate this #t)) (define/contract (write this data) (any/c . ->m . void?) @@ -38,24 +43,28 @@ (newBuffer (string-append chunk-in "\n")))) (increment-field! uncompressedLength this (buffer-length chunk)) (hash-ref! (· this data) 'Length 0) - (cond - #;[(· this compress) (when (not (· this deflate)) (initDeflate)) - (send deflater write chunk)] ; todo: implement compression - [else (push-end-field! chunks this chunk) - (hash-update! (· this data) 'Length (λ (len) (+ len (buffer-length chunk))))]) + + (when (· this compress) (send this initDeflate)) + + (push-end-field! chunks this chunk) + (hash-update! (· this data) 'Length (curry + (buffer-length chunk))) (callback)) (define/contract (end this [chunk #f]) (() ((or/c any/c #f)) . ->*m . void?) ; (super) ; todo - (if (· this deflate) - (void) ; todo (deflate-end) - (send this finalize))) + (when (· this deflate) + (set-field! chunks this (list (deflate (apply bytes-append (· this chunks))))) + (hash-set! (· this data) 'Length (apply + (map buffer-length (· this chunks))))) + #;(report* 'end! (· this id) (· this chunks)) + (send this finalize)) (define/contract (finalize this) (->m void?) + #;(report* 'finalize! (· this id) (· this chunks)) + (set-field! offset this (· this document _offset)) (define this-doc (· this document)) diff --git a/pitfall/pitfall/test/test.pdf b/pitfall/pitfall/test/test.pdf index 50ed9ca006deb33229b791a994f30f0a41367839..e26206f092583d73390c35f34133dda22633de4b 100644 GIT binary patch delta 42610 zcma&Nb9g1)wlCaq#~s_Y?R0G0wyg>}HabQp>DadIq+{E*liTk;ci+3e`~7jw^Q^I+ zT4N3VM$MX4qvrg~CR?bYsQz=ENOq5cDC*%NuIysyVhY1xY)HtID07FOaLtCnMaW2~ z1jC?Y>TK`oWNhk8$i(;$C(+>FcbdEv(i7-|8F$R|D^EmXp{*VRFx!Q{`n%Lv~Y28;AUVjx3@R9F{L-Qw`HLE zPd%pp)N?g*`6m%I1{q5`YZwM0!hf0li`9SSCuC=5@A40D#x8`~OpJ_#?CebRY;1(g zY|Qi=gzQ|*x-bmF_D&|IPK4V3#KWljAD)=F5-+dB*qJ!~mGOU~&-q`Re_3}X)MoxC zB&Gk4DrchlH5bMI5S7H3YYe#mK!!PS@>U#*lZlg&k%==A_l^gYnKe=Kjs{XuNJvyz zEHUCP0)_d%D)S#&Y>5>2oc|Uvy*K_xY4qM+mym;nlaPgznUIx>m5`N{osf->-ZnYSP0qwvBAWl z`%l7&K2O~L_Syc#gvQMFUr;cp*sI!E8rz$g{#8u`ebxt9VHl(>P5z?wF9|}Xe_=+* z^uK@o>kR)-1eyQyWR)?sGk38dWMSrlVGy&lars*=1~Hqz!$idN9~b}B%-O}s)X)~j zBU4vN);@?4uH%-*=L`XjZr?cZ+n+gIPT=gjF^?>tpi!v=iAVtc(<7{>CJ!Al@3P-i zjPcOWOUZ&&;nPG+-gcT-LBYOdyGGC4wdS!!PMnGnLh@&1E}P<6{{-^{?_4WE2`x$9 z(|T~xGJU;glJSsx+2y=cqg0ONt*1?UQ48kn1lVbso1$v`-bR79-Gnp`F^Topoer(UTqSbLVm(>=nMqCm6xbnuCge@yMPzIxU|%BSzH>(|p>9VlA*h1TVl zikt7cLnW;G7*kPZs?V2DQo9Y4|6DizH?032>;DXee~;P!T@)sE_W!;prgFdxOfMsx z&y@Ne)LKGyB|?9wEZ!60(F-|$vy!MoAnM(t>@v8Ju=8S@G>+Jx^cr?;=ogS1RgZNa z&U&_&uOp^WA0VDMSXD^bUEzfp$hvjX(2~$S9E>H@x8;nS{+J_Yk6xh&4=*sE?>cRg zCNjIGmMlSX94lWVYGH9PM0Dto6mvcBBBm*m7@D8=H~y#;bUBF30y@Da@IyBdd5)`hup+mN`H%7~Gms1~QX7t?g=hz8qd2I;M%(gEa%kgE1 zC~#DUSG+)W6p9*DoA&=A0AmXL*R1ic3(fyib2d&crvDzA3N3FB+LF<#ZsOR47_<{3;%jtPlIJ-l&4x!)EXKn{4 zb!fgd=KJ!JAANebWqtG1K)_25WOa#1oaI#Ud+y5ac)ne3o%Ytu4#`IxW`%BL<9rP! z5|_9qa(3vddFv7(@rJMZ5PZ1%<>7O1{_@eP`cZwh>QLI_?dT+IGBrQ(W4H@e9dVez z?6&?h#c0z#A!pW`i{-5?!ds1o&h%W2QuPmJcEV)?)jxaBu zGS#O2RJ;`_j?i5gPElT1UNGRvzvpb{hj2t$?kX2X9AA2p0eqkB&uX_*ODM{Fn2PbX zBJ_M+U_U`BwjwnoInqGWO6a=-^@+4D{EQCt$WI_Z)hGM#k{s6Wc-ycb<$DdlsCpZ| z)O2r_w2dS>?9;Y{oDseQq{I=EC|HW$R5@gjaXa?055KM{RqE&2JIBW1dVUg5Lb#8% zVMrp2Sz%^Tn6YBn)6;!(KHX_Y%y*0S3b(IS%~FW7%dVjOtn4@F#izX-l|P@viWaWqwu{*#?lmFBT6g%RlN!zI z40gE`hv)*qYv$ZcLm(Sv+OffKacJ8osy=tgoF2Hn=iubLF@*#DU8(#7;T_%=g%*>z z`oX~}09>irWRBSe&>|d+ypqgyqO*mj77r^ev4w)+R?zXW1N2NoX6dP zTYCC!-h};IF@IYfa=40{DYFOeQX1ZpRixQFSYqPc#L`u^(Ps9xg^Pzg0e+i2zLY(k zhde&FN5u9D;xK*BOWj_Js1aCjyA8un#y@pPXUNBa@x`*2z`*U7Ui!Qr?=}{F+dD1n zw#<~n_0X)8(-J4S-Ql3-8H6E$m@wbOQ3b>0=lntD#!J!h@XW<55EzXE?APTafk0kYHA0YvE1=2Rx!lhJOlD+ zZOW5M)0r=hKzfcG;_Wd8%-d45uo*L_P*=O*smS>uxhQKXqoOQ-UxrmI+hj~=`YuX< z#SBKA!wu@vGMJX1Nx)aCxo2o2BTk}fJCKE{kbLaQR0ErU8i+xw>6L{LJU%U{O*0)V z7?ZqXBLi+&maOp~kcBDJ? z|Fz6vKII6q64V+~&%|(!===yYUf<@(XrMrQpdcu*?kE5|61}F^3Erj!eJQ7$&N}i6 z?oJek9?&1Yt=zs?Iuxj44PEQeFbS$k_yyoxo%6+)cATC%oz62=uxAzFU{1PTxkBd| z`TO|DGN|MWu9Gw7bvL8i8G0sZY9Ks*Gc!b^Z3Dy8)8g(%*|M+o(k+BL5t?m)j%Am-ho)Q#T(fe^0ukwvyU&oqXCVW&YVSFk!(po1 zl5)=_Sg%yJAv4<$p_UpW1P+(@F+8m&6+q4}Mzq-tnqSV?us4a1Y5QThB0gt3qZ(6| zT($9gA-h>&3%TQ~E<^WSd|woLBM<7wS}$!Ln_;pL-u;yfg%58rO{}85Xp#;(MpyDW zIxarbcac5smp`h`FreED87(Q+0(X$BeFjYHQ9f%(tf1n^_nUtf2`@wmDL>~yC4r)E zp$_0Ql-tizyd2@zS=Cqlw8R5WWD>0_Zqq^OUi3Jxq(YbwhBN3|)4ZdMAf1A|#9)>e zPMBgu?7a$UHo>AG`9@4rQ3i=}83*xLCQ844Cmx^A+(?+b&HYda8xZ#l;^2s1X`IRY zboTYL9!&eD1J?UuU{Q`bcY3)el1$g1K58mX-&4Cdu$+K_8=2R|RxMGVLR&^T*ruK195(Orqd=YBPvB zb@Tp`VBvuEdBHby&a*b2WQaOraIJKvnCLZ#wH}h_jI|U1!^wbs>I1;qZuY+$2R`&N z%v%>I}oNN;HT#sYCWF2k&aB%D_+lh&Rxm5Bn4IrCp5iQ7)_Hb>9g-!Sy}ya=mP) ziz{&P!$UI7V)M?rT$O=RH$>2sd61&h%Q*F1@)LhwEFJJL$MGg?8ucCFpSJh#v7mZu zOgdzqioa`DFmgM?hY3$iSlG*?7Lr4=<-AP?@@PYk2aym2gze#528U$Bwa})%$AxU= z(rZLPPzzun4TlE67fl~-FGZ2&HJxG}aE5CWk1ps~M&8mA^BMp%7RKfo(MY{2Fss83 zdk#@yYJ;qs<+?wb;m@tFl}DnHyLqH}1@7vut;K{j0<*dkH$?=X|AtLp1v()UP((SRa3P|o?X3qDZ>z4Ea+U$sn zb{r|dTtTA)h{C2S$(?6iVV$zEo>$yy*)i=2z2f7=3)w}af16$TK+r@fyb%mIRy6Lz@W(&pysQ0$E1(z(7kH{SQvhw@c7H@B?I z56wC~g3Y&1c;h09wmS^NLs5GDE)fiaF1$UMnOTu6RmR$;=S-E9#(L|jTCVVRBQ9dK z74(|9ut>l=P!6i^3tG?UB0H_>(=LaK*lT78f*xOI_A831dC?z**FU;VJOr((Q;wHB zlChEA$e_GphQ9na!J^|DanpNI))7c{NKqpo7V&At+my^Gt}xOjF>Kr-PhqNC=@R#O z-82_ybJ$<3*J$jOtCIDJTY8~O_Hri4VZJwOB54EYV>GzeM7Y7zRMK}vzL0$k_^d9! zmGDBKN+!DxlasMOo{qBy$@&U0hN2r5WyA^mn^!e4I6>dYL|;bGZ&Jg$k!RUq^W_TZ z605llWw7buYLbrP4@U^sewx+_#XYCdLW*l^+g%D3c&{+$h(M#AhoRN^q(#FpBEtq@ z;=%$pFZk6m>6(zoTh*yIHb@JMCxucH_SNUiGO)-5w5Z!czft#iu*pP#<;sy@=>tyE~$^8JZ9*jLff2o{&M4YqVDB zJg|NjT5=&%oaC^A=ajWlT>He`u~Ex{iBAUhwv zjuf(Pshh`>Hq!>7?rPz-7y`$~Y=+X?)2w<~`|`?ex9GOkIJ=Bf<8iK5(ImjqzC7u4 z2{POvFc3pQSzDnB8)3Ogc}=-Gz;?Q|FG}Yz8Ci_X3W&&^1Die zkMmB%Iw#t5t)_Sg#kxPRhzMO|*jNFW{oNlyL499dt$bv{&yZM($H$|rXV*bDm9k=) zLVQ_4~6}y4AOL1!r*e;)dQ?%g!72 zkfiKCbtGwioj)|$^sv?dyzR%rB|EU5Gsf#N0VFYiLugsR&dA5AJv zXScu4GyPJWmCscNUo77Fp1cqp%!%7RuCo6ymu@Tw%~aSBv9*y!tA*2M1N2qipPH`Q zH6P-yA6h4Iyh20R>quu&ga<}|g0lb|JA6U~ag|zwsp#=@1%#w!0^Qd!P^daW3N*08 z8d3`G1(|57)r=6Mkfcn!45zzonkLhtm!SC3i?^rWo9ER$I^TI7WYnNgPV>IkmA~sq zaQhD8g;+mc@?{U_UUC!K4=;bX$5(wR_;MN6O);bP%$@$z-b8huhIn8V5Q#|IQ700e zK`lSy8dVpBD)A>2Dhm2)JB`GX;D>&I8y(`9D{4>XMneXsM#`;0)^7XTn)WmjZUQ}+ zSl{<{!-W?;_%|5x8JHejk+7xt{{U(Wd zH&}1QQDY!Rm`CqUE}eugpaY{|u7w0`qX%Gg9yEs%8flCiMU-kbCP1@%*G!+#EKlb$ zqZ}B391E5(bPVel3tMWZ)iTkQg!TnFl?DvxTw= z+EsS+A?%c4+47JF%PuqQymZRxPP(>z;Bp8AN68ir^};0#8-K%PwX4+KDA_i&_H~rz zN7!D6s8&qKteoJM$r3BqU5$5Ou4#$3#EJJTde;TR5RPZI7MXk7Sh$>ty_lWj1ZU>R zK^Qei`YY)(@^T3QSplgg#$=DowAIzaykXXLHr|Q9_c2zI_3MQxw1b;+HofW$=sSqm zUNtHhZZ^dctnReoFX}Uj&qbqC;+y5QGHS}R z?npST12N7S(HCaGc(~&g1wEIqITE%?X zhD~kPl1YXTVs&dMSiIeCO08d`yzFNdIU)<@djd?FMm7$^TpsuxJZ{cx$bBwr^G03P z^_daaz`Y*;?p+1`KW$;<;FyZAcopq#_{oPswl)d{`>2wQPS!ZQmV0w?%>yG5(>qeq zK#fxq&LwH6VONleA<|}Cjk|cH!f99--_!<0+Dd7ls-h66v$TOwz<#Z)v*b5HA%lwA z4Pvxwuaa<+!A{hqN4aB|PBZJZU3*xzY_v7#>48BYpjK1hZ7tZIU!Zsv{==(zH)UOb z1(9{kSH2?XL;hDZha;E&dQCw}_1Td7-{;|9_B}WGdv-ptVK5voVKt5Jp;{$?MLhQ@ zytgD>lv;AqN^k|OrC@*%t9+StaX<@PIYzkJOb@(aVNKnA9`o2Qo@E6}0 zmcvZ|bFT@3bjZ2$>FGKbM0Avc%X>hhSVsR!bYA*%bSz(y>$Ae*D^4hsxDmv8L+Aq@ zd+lRHN^>Y?4u7y^co6RTkvq8Bu4)Frz_3kZQpbA>~oxvk@LonCc=!5_g= z!BLm_EjqTupeRw*h_4hk-zDU0kpYR#8W0Ol6;L+n96zmSrP+rMf7nT7vACaWyGuWe z_w#5N@-;`NUu3Qhu5Y%T$~XDic5T@d*WF2Ce~hmi>2s?9DLhbKza<4c9RiYsVvS(J z@lO;(hRC;TM&>-HX-76PjDirWDzw`^bkJl9=s{L%acR7eYG61IFpcOY76IyFKL(tA znJ2in+$qrG;A=0;N0xh#Wa_p)hM><^oDR_^g6H~*iW{5GXplZ|`;YETn+Mk;Hmjd2 z7ne7dUcw|qbrZ#^?#;$&)eELu(p^UE&K{_BZIvr22N#3Mjt5!?nZ0Pj@A@o`j@7v0O#&+4b zQ><8%9}1w&MbUt1%DV|6zM+}pHjie{4TS0xN16MC`sM4Am-7ikc;-B4EM~RD+guwA z(OpFqp>n?4G^ylhW@x_&Ng+z4*FHJR3-UiyCn2VuA;*0wd{FyA z(Iw>sxmWn#F$>(MXo2Y$JXn+dAwT1KKpzqO(u9%IYhsv}?+b+vGI;p6D3g(`K~GJa z-I(KH83%gKrsH892ji=gAn}8JCbu83;)iBRJ)X>LzVJT!TzKhKlOE}P`7A7_hWK2Q zB<8o{6WwqWzp>=1u?zyqnkC~izfO+*IGdCld$+WTgx;@xQm;_7*?hMPbx=M zAp_9>HBTB4!#G+#Kl`&RF&q>qL5UpbIvLen$2JmPa;&IfX;FCi2{MW`|Ms7~_kUXN ziDS12z`tLza56Fe4;t>+x{-VAXTE*|ycm<#V=;UI`}i@9P`=j7O@BgV%^K-kU`=zo zx*Cm_lMBXWf8jchEGLxPkBp|(#Q^+iPwJ`L?VULvTv&|{`vtV=bu%w#fUm;r^ZxtY z9Z4opXGfNw@50KsmNiCB)vB`mHO8XM(#9>y&Qzms9cm^U|9fN3^=vl7CDNeI?rp=g zHiyR7sEXj=?RDt*9GqPkI29r4Nc%FXSGZ+Ms;EB;?XWDTC9ejx9}R|c6Ifu;I34M5 z3{Pzn3K@)V;Y>lPo(g*|*uvU-#QOL*qi6}8NOnW` z3N!o4S`o+T;f< zzO?c9ep2~uhIBG8JxH7>N|Xs%e7<2;@!|G4ktH!5PNzFFClYm07L<{B*ft;3e-2Y3 zSzsXda7nr-nUeep%n7x(@LHxMRz`$nrzh>DB0NBB)vXu`qHPXR9&qi$p=mWJEG#F<)MD9k}PAMEZ%n-7tz4NOl`oRFWX zy_(1N(RL!7%%Rd`Z4+iskf17a*6>^P7*422vJIEIeuPh=0pXVN%ZV^f=Qq=`O`69b zB8{wVu;(6WZ|)6!#9+fY<^6S1D^k3k{)6*KOE4l|w6u#jny7DH0&3?3=kQ=UCkaybIoj}EbLJqqZWE@-l5atGrwsn)nlf{nqUZPVK(Ss0NW zNJTW#RE>}361*%qD&TvaIE0pR4VZ2tE=Wf;Tyi4cz$?6NF}PBuhAf-P1w)2(h{7&$ zS>|Z68qrVzl-WL7*>s94WvOFsWC@If3FIrPwvx= z<6J^{Ld$WyGnbxW2Jf|ofhF^va)X=6Up)`nd-w^gawg&r>Vej;)kKFWG8J6rvFJ#H zWFcx7`u$dUVmH|U zr+yG5zYq~g-4G5@J&XEo67zen7wq zcS(`E;BL6VYyd)RLu^Hpb;lUbu!Jbi`6EOx^c zg)X9qSrI3!WNG6;HwNagtkh4;ju5TBO_0dbL%NOz{tWlCP9#!6i|sR=p!#MCzVJt? zYQqk6_FRR5c(4I;Jfk3j;tN#nfiddCzd9fJ^akq zw|x1P^8K0BtXx-9A{Al9VFyHeo?>iB1_x)5Q93`R!!S4a8x3XJ8@zPv8b1}xr;nnl zNcXR@AVPe-svYacekN7AW7OaYU97JRn0d@Av_i=a_PErzgAvRiJZ3v<`g~HxDIM77 z?H2-HYiUDEvi*BjC~)P-TtH&y-uRzL+;A22R%L#7YNsuR+SP&Y3z^Qhhahx)i!%-x zd)TPKd1cNU`nu_;1ur@yH+@n4ruYp$ar0e+l$2f&C@$zXb7@ zApa87U;5glKm%PzoGA8y3a~IUar_UKqMUV%#gMfnkg-oyEeUM3W!fWuV=Yc@1%U^b z&}9({QY+R%b`TcK_rKW0Sky9eX%)wHJ?NlN#6Hs7gXXXUt_)eRqs_*8PcuISdf()6 zuJ5m(cLmI0)6*E!{k?Y*9zR<@TnFGW)XpI7#~G?QhYPrJag{UpoB<)P=n^QG~} ztGRCIC*vo=&tUG)qMV<3Qjj?P}`dvdcH?^Yk?5 zBb4CtUEuvGM{UB0SO3cU{>c&)hX;)03Km zNI1qbd7Vv{N>+fF9L2>iF0s3A|e)tm^}#7pA?GE&{AF|9B2#sq%60K z)A@`Hr460_V(I)LjNGTUICOy5V4SAx+L7 zalqnxBN-|~qkQ9AGHj3Jgk`{XfJhjIqzYJ;qQECL#GKC-I=d)z9ixs$KmI4-pWIx_i3{LN_8mJtO^^8 zyym@c?=s5b(>9){jysPnzwVc9XULb-!Z&9e!jd$_Em_?7s#e-M4~+WeeHOOaSk;uL zCwLBE{9ENl9;hj*4l(7(P6mhpoLSK+vmH@fzt3KK%Mp|55-iy?IOx0Qf<1pux?{Fr zOTIR2EGEHkn%Lc%9nLX*4(L_s8MpHI9z7}sg-Kp)!tVmbIZXvU*y~ecY|xzZ}X{N)NWwNkF7KIIqMkv)EeUnXH!p%kafD%3D~6 z8`3tDliBG~2w0DLp__j$mS@9V`OBzw6}~fN6gGdATuUzIo6veF&MwZBtu)(!K`38| zUr|r`!?oDbLOnI}xcUg1P^Uen)2Jh!C7y-1fEoU|!Pj!I_VB-VJnryZ#lcWF~9Gc;9i{)azAYUiR`F3+1bz({H1n<%21G zMS)`?UrurQI26Rc)6TK%tQ?yNy&cIviw+K%kh#5U|Z~SJejEJ=07e* z^HZPBp3(g5U{wFI8;0YH>Q{iH`uwxzM4^ZGSY|_<@?{4-WuHguE#Tx&|Jb)!LwmcjKJAeX26RkcY>w&HtitO?rnKPHPm-^)!XxG06ad3ZL;$C=CYfi$< ziD%y{>#Qn0quqw&*;&7Be68xz)pabEV0_3f2JUStJAng0cck!%1y&6gv2BUTtplBo zQabH52+UG7FYCi41{8_E=~hzatT}2Of8%&@cVf>WGG?SZk*scovcV(~Q#GDOV=PZg zCp^j8_-Vb{nH;)|7}?Adlb)vIaJlltSgOe1_fTYJuDLSA72{_GXX!Y41=*4AJxtr+ z{pmbNp0NU6D321gTOqSY6*LG^n>Jv7wJe^`oxd z__mW8r+sXW7i24Nc_0rVnoONFRhoB{0RzGEG9{B#9Lrw;qPqFmDP+p>mk`-gYW#M! zFmp)@D{R|K*96u_tkt zZNZO`L#DBL|Kq?TDxtH6i$Orzs9uZh7~N40XQuOpUwS8L*{9Y$(P$E7qm5}9lcV7- zmVim0B%zBgpi|+Trrh(Pv8w3>1 zn*q2A5WR!sIWexLkR4>!#cL!3`=wU|q^?9*U+UAUohN;aewKguBne8FEJ!;Rjae<{ zlg1dq#?SZumZPm?;g>dQ+F*HxITvG@KfI~yZvgT6F29soaO2bKGIaz>ZDF?KJ^^vr zVJ_+Pj12z4@LBi31%QBEL@Ae5z#XP5`bYmP0^xO!(Iz63GR?+tYTJ5* z?;kAzm$`oGbr>JI{qvtFo+O9o3k_=DWX=dusj53z%Sc(}sHvJjm&{DiB#z>?FMHjz zURK4FUHLfo|GrSiOU1*Uj*MuHDWAA1d)^-`Qq8XNE~Ouc5#N%H%e_VXL;((_B-PV? zu9T3BB7~hElNx;R=3lgikzC{C8=>%VXw+kws~I9V975jZ#YEYzfS~y=-gZ@-{KN^4 zetTm;fA^H_GeMI+pHnnd3u~O<=cHUQ;VGzi?J05W-pF~!@8U1M3i6E|C91Ajqr#L# z$OQc}9QZNw^RcXr}2$?8(vi+J|m2tSv(c*qmo za;fSZwbZ8`#H@4M`F^=qmd?p)m2x&x>c@6tG*o#uBO z7>IN|uYNy=ZuTHD} zNALExl_!1ew(k((gUD0q2S~yDzsl_=1in~R&RT*xb-Vd!4G@a)FtWrzOkOh*^27S z*J$F(h)#O&^%vjCg&mlTIwg2S4Ll%vZ0;H1_D@ZY)siTWAX#50eXyd4Su)tL>eWZ8 zszx7R;U0Hc$lDm)ou2GMRRny8J)u2!d=GZ`$+j293w>s0i~}fv8Dx%es&s=N#>0?4 zB?(p;-tZV+xXHCVkBF=egtJ7k-{G1qYIyI0>G0Cj>HDs=9F^tWaX4K8q@hLu^sFJ< z8gI8y@?_QPsq*UhxU5gWu%kh(M!qaum+#fGh%-`l)+%B>Lwu@tyYOw|MO5lDSdj{t zfLpuSWvI(VHEHs$av(R^HN^qyxEeV(AEE27s-RHla?_+9L zA4{EyD(8AcKu%z$IB`(GxY|Fv!6j-%r4M^n-6lH|0<8CHGL~%w7u}Vv1oaoM136{C zNZGm3{w}Ggq>rhyi&o>FUh5}gzT-lhhoagJFdPcEW{1>O8VYAHHLegc8=WNP zqz`aiuvWb)v}sVnbLJq2h8LGkoeihMy%dt{$!=k~bHDM+%+IkL&$2jYYm6FkW}vF0 z+`05S1ey}fBYu?3O>lut_MWBj=7U}@pqeRXOj|O`pIB-i#1i=MLS|p~$iucdDg>iW z>XNf9MofO+*sfmgkLV(xg5l@7-$UNDvp+nKeVT6mOk zhAY|VevE2UbTPP60Xlb@8r^fbHW**&)qZ2!3;=Q#sF_{_3o+nSOuypT+q^YMm?F8` zqYqX%y#AC2xP#H6(*e1@=wvNaTZyTni9|QFrKRAFSlBTmsB}KLwg`sc+xt-0`Gx~V zQC@t*Tn@3DhT9@32yT{`FP`@fylifqdKnO@>{xovwz8$s{j}*M{VZ!pJmxcm8QsgY zfECn_D%0H>qRP>c78n|?C7UDna{eb@g>+BdG0S%3YC18YtuG-|EzdR7_HjI+08dtL z=Gp4XZQxNS9q%zj(a5S)(rVLe$)D}73EmMBG8CD{-wo5guTfHNpMu~h$3u<3AvtA$ z&J*OISVS6L0E;QQlHrlB06kL6Z&L$VvdxG&Qe?^g6F=Dwh5~1wnxA?9rC&V%5o(ij zzyBx+8?VwK4xg@K(NfB=_m82NGNr?@AfE7(@N1G$IQ9S)8(N{}+&JtvWlHjvEr8AH zC>GQkzK|$prH>W{8y|Pkne~!1>iKcg{4<}%(B=!*)on93HqSe13Bs>0vlig^dkUbN zk`tvP*$RmA5#bUC*cu$w3A>nnB9kb7c#{-_S%%fb0kE};a+8h&R^~tHW;`Ih?3F=6 zn8ppMjm{JGGC1Tu-LwW)X?yESQvvbEU}_(p=mQNhJ9z0(L_Ag#=8HY+^ff}HgK-1k zk0hJ`!pBn$e$EOLe$@>N8%&XZVxRz)eKve|pYtI<1T038h<(yS@XOPT3hYbb1gHkl zm2=VWF6G;Sm(q<$V^i*PVLUQE?=~wy!-J>3L%~!|Wa8J^am*;suaZ-E3ShH%_ljA% zaI{xl*mwfZ{3pEkpMysVYpO$}yTULIjERgT7g)4W^MEN*bXUJ%7E3q7S!7D{)Zb{R zp;d-HbX(T72Uj{XJ8!d`Uz_81Jt<7JR)A2`ZyT}kzBnO+k0(}`Jt+Hl;(-T$LOesm zZwMzEzkZ~CS21XgUP2~Irv$3q`uq@U!&ZsMH^X`8%hoe{JovrOA zHZ!P%vLB(wADqupkV@s{hUlynr^=MVx>;omddV~x0Qa|<6Ru|1G=Q3~K#G`+r_v|a zLq?A6Nu}ou>5W%zG>7N@`n$fZ7sGfk7JgQd3M{SqPZzTa#;U?{14+XPge6u<_l*G0 zLJsgwMeiM|)@soM8kRSD9xYua>-0_i@`6839qx66;43_b0>Cwu{y;cf?V2} zax#$@w(BiD=QlaJ9tRm%GOa9a`?pbyLBFMG`nbU&` zj=qWy%04zJqMO8;n=tuYZ!Pr61t>ko~4X-HV2e6^s(D{i%!-!2rQt*F3(RSztO*PS_@0 zT}bqI#oU9i@rzRTB59=)NH4V1LJ4I;@hG2!%uj6)jg~2-;P9xXNFg=-TNzA}4K`GV z(ny#2P;%#dm-dLF47G3LG<@(`AT+2k>g1ZW^K`)V;tp;Q8q6643VAyC1Ws3(o!VcXWjKa-Sl+JzNwdB99*ZstHQr_p1xYLsc&gn*nbV0rB-$g zs1&{Zf({3_Y7$F3^!ZFP={F1;1(6P+s}>Ql)gl8$V@qK;8!+$BAOd zA4s7!km%qx#B8vJX>E$>YRxTZ^bzT5OE02n`^0cjXhou>t5grvlT5{M%}n0w$TZ3- z9933WgRBa0p)eNS0hS8mz6tHuFHN&n90E}&v!%`>FIB6UTG-8mE`9)N z`^@$y{HNOhwy@Lqabh!y*%cNoZ!n!dM-%14(1`mKS8m4kWu&N#_dy;-2?;M1H>=X$ zO%%h(%isUvb!!H*SNXW(Q#UQS`FPnUYyfE;9By)gtU|lSq>gmBCEU7-gS|Yk`junAae}mr&w!ym4b|l?KN#4YWNT;ifd8{8SLmC2GM%} z|Itzc&{e1P!;`d6R_BDR6qBi52=#hjsC{uKgd;A8Yko%!EuReej^r&Mv6CIInCN_b zu<$6CF0Mwibcx^#Td4#G1coJ9E*#pwQpjh#k{CH{-8Z*HT-sRKrEllIk&{v>oQNIm` zTfrrtQZY~h3ii`WLnq@P;E2ly3n*2#_PB|W3|pN_&6N_0_lL;h}=?&RU+jKbfH9+f6Er24Jj}G#RSQqIVE20_(%C*H9{5mM*7Mzxdg6 z=zX}Y@XER`E%+@n*h-_4Ykaz`pkiNcOK8{QyW)!o?%m#z_ELWmlR#E}D3~7j92YE& z_w;Tk?D@p$^f41GH2`D9e>3xwT*f^{^s{+N9j^<{wT(V>8iLx!JL6Qk?Xma z%9)Quw8%BzOez*@1Cbvr_#O|T8dz!wR>0$O;mO$F<&3T7Z4^{lj8`1W)X5R?tg*r$J>Q%Pk^bfFq`8d{Ty1TrSYW-BP1g2uLJ=Rw-gUOq^@Yfjy)=2bALY{-#m}&v8r_DOs}yzWecdUYfV( zMgP6MHwVzCHY`NlLeQ2a?OPl9z4DQAv0D1-EtHi~>el55mdIv(s7t?b_UB78NKMAj zfT!q%h-lW(V@DnSMEuA<;5f&^?bd1dKtk|iViHzPb_YdbY+wE5c>u~G|Utv?yLWv z?-0@U!gnj%1`h6vflWqb!y*n(R6qVB5{ee2Od5}ebV0Im{{sQLq~I4Z0KvN)4K*5` z83Ps3f8ElDLF?;5z)wfXnXClkY^dUKNv;$b#Htl4**%LaPlZ~0dzo*DOkTtEy7tOW zR)BrUiACUHEL60yCzs4%bVON-#$ug^!gX}W;ATSLvX#soZ^ro23JeXo^NYpW(1F{^nl?fehu0hBp9Z*x_zo9zieI1S%{j1na(wtaUw0UsX~}%*w@#-1 zHfDzrplXaB;dB1(D~-{4>|cu*d3>_#BnR}snr5L~Y=Dc09{q~WR+ZW9Td^8vx=x*a zYX}&Oe!++Z@L*?mr&+75XtQR2fo9-1rH!|gVIjgfKdbimYuQ-@1K6w};6g5mm=rMI z8~q2xwPx$SK);HEBBSCo2l3@A&V{f~H3M7VKxcYAzAXc(f4#^`G=K5swq%3pC$Ph? zD4^&+PnKC{)O!c$QUbZN)GtG{h$p$miT;J*%t`4TCuS;%ZmViM+pibQ^O%B`Li z{w64L-DJq%ltjgNO2mP)+l88uhr-iboz;6NB)cP z24$G$X%t)7FI|--x?(6@x#bQzlt7!hjor=_WmrR8ApHB~4kRq0E6|;O*FDj+6Gj`&0hpw?d{<)V_l@hr$*$rx&GAYo zw52WeXxY5>ZD08eY4zrOatf;B*eecIRncbJ?cw1JDB6O>RT1`ZwASN5=Id2MpXNOKGQ z3b-zNivC%N^*WJ}O~cL8J|01#VQxXV)mw+Cbdx_$QiF67!&J!a@T&>$M?rf}5p_9L6f$P&cH4dRGwy#~XHQ<&F4u8T@J<{novI_?zCu zscm2l^MEVy><$2cLBDK3%7VM5f~5xb@b{YB$RZUidiZW%`)ERsz+{1qB7ow0wvNaS z6O#Ew+c)l{R2U0fubX=M@vQrI(&igKoAAx~W_sAa^0#}vO{4w1lSd+6lx>_i%Tm6r zvPK@9H-=7g_?F7;02^sHx~|24+2$eYHGxCa+M z0w3U0`71$ByNgU^&Hl_KW_|ZYB7~(CK9$CJF%I@>$J_`C2>~FTQWBH6M~h(cIuDV{ahCfn4aZG?8>yD9XItK-+OFvJ2p80z~ewTwicchanXYQDo_m!69O zD2akwci6}^{dXiY?!4_bc8%F)gj(kJg=8{Xd*>TzyLrPb;QQCG+(`Ia4n5a$el1nr zMAlByQlY1WDz-opq+Zx4wQAw!aV^Aak)~M1+8ZTL;3}XYqfQN|QO9VZ{n+3_XxXgI zV(z!@{yNa%`v|}4SZ#069Fz1`EjQC<*MxPr!>$7lJZfy`IV)+&k@u|-JT#q&IRAdO-+@sDu zv;7P#IKbzIs|OBxsvOFnyix_SS|W|&JmfaTZIr*6UmmkH$n_9^4x@CKI2o7?141$| z;CqRVD|+=kOXkt2)nO-bT;J8Ps%rOMX2h+N4N@qw0;gg!_8$AQ9dW!fc#`2^l@tjbE7OtCII%o$uuG`ON|GS6TgCkonH&pAXuM z7HgUog7(-H*{H*RR#V?LOKZN2WL%M43DxSlAT;k2@2{RuFc74=5Rg8f1#}ART>D2= zL%KA6*DG!XM^%6jHab9A1;(mc*1e@gSeB&*{~7LBf=u7P{2ST|_p80BHyT3q+*&%v z>ekR3jp%6Xg$rVEsmq01JL|2P`qi6x`|59KWmKmI*ClR$GzO?subYZC)cwjfi4kuk zLbVfHI8u7eshkCBmAh`mYpj9xBRn_Iz}pA^`UWQTZQ#c~@8rp*od~(*<^hc_^Mz~|NVyecJI`=Wkn0NDG{?9iyl zB{vS%O&|Q%?TM7u4&rksV0f`DL6mKOt^ZVY?Vuum?#pP9J;hBSH!`@LN??ebylw?v zgf=a<(8>T`*M>%K^Ucm;xvkEB{UpJO>zW}OQBFHmrF}1L*n$7Lqd8f)aF4B(=0;+n zMc*Iqb_Nr+~zF+TH8@89sBfjSIO9^4?NSC<-sPv(NQ#xJ7)hX~>0~^5Ct?+@I1P(%Elm{(ui2EJU==x4b z>4Y^P8JZUJt-!a8!AOj46sjH_T(PkaqW4PwmX6vFvNlQs?`D57#dQcEmbrc{7RJqRj{Vm!#OV*~)V-QVoy*&uo}I(D+dTYR4vUZvK*Mb7!%h?Ws>t4S z$}q+Qs$pvz3gGH%NmGuPX?p38Yx?$oY`+A)Wx4B|dWWCR9t`2+?e71f7Q27IRlncB zmSDH8Hb$i(d6WQ#vNuIV=gDrMksFG?X9ud>OF)NHj#r~+VxabFbd5IU2d5hh5CE{W zcqV{H@QHgJen-0_kF)TF5;EI;FM(~fbvbA?P9TJdXbNRzFL{)Z4yyIp2Z8HkE-t(jFynWhqJCWueHI1)!0b?_I&v_Y%-& z*9#)UZsu%B)@sULD71&= zXgI)?r8oRRz2VgPyPS~Qo4k1vu=+uM{P^ZZ1 zG6>K(VcRmzp3(G8zm=2~;SXxAHO26j8PIa4X`!XjeM%IAC4hS?J@|L>0Q`i!TPw0n z?oIqj7lFU6H!+_()4S4SXUaQHraEIUV1t`A%*1@`OrHvCtGuskmfg7#=&nSqc=b+v z{D7lG*2bw4GEBMxGLpW3h!+)@7l?tqFjrzhiHzJVnXcAzGl$$UR?f2*;6WpdF}~D) zJZWpNQbPe^4QUppk7yTktQjY0CJg$nKJ{6gN@`}b#I{>nYX7ak|iyS^LB9u$j*llM8(CUXn!4oagqp#=q$q*U;814bzjp($K8ewXO=&T7vL`ivZw7{FQM^I#3ip?L8j(v* zN>3?Q8cKW-V~59U6o~9y^2%I@%$l?}g045E z5d9bKP&n*=s}w+4U?tcHQ<)nYOiY;hEXIP#kg(pwx$X_2)E-zMz#|AYCY0ex#si*T z6{1LdQp^U0m~ISaK+tNIAcvNDG7|ug5&@M@+#tk#HU?viDcZ3Oh?yjU7vTkw*N^n& zjaaX-DQ2{)$u=O+z3v_SJzUIf7Gf~leG<}}>L>7j&BWE*Cui6|20Mlhje$uD&=&5q zL*bSvAnKA4#W32yF^=oI?#w6iuHFdwBS#`_qsI`ToRDBmxz#1QlX7*^zXrVw+_cFe zL$bCLwQx?;fWgDbF2)C7!Wb|0G-Bm3nIaE<@09t%4uPEwI_>ey6Zi*H+Ccx0(&tmu zSTc-%9=pFe$B-AhYdeXi1H>+_9}N#Na&Vb@J5c6hEH$!w2Y(N(@MYxsV;Z99fld6K zI>Ve~2-WusM+xGYQPOQkcgV`w<`Zs$Gp1xJUzAr*% zDFXz%iXhh9EpnaB_6vL~*lAVD1yST)JfyaN3cba5QGOQ;Or-@yKL^@%tA5Pq`a9Wc zcA?)XjJ0~=8pImW@TE7a<`p4$aWA_3Ps{&-!}xrjMTyf0OM z?L@=bn;2G|`3^NIY=1%kykF6e4o9B~4Y157*L9Tz_?_)afcUxwJN3ejH7-;JkFJCS zWMO*Hz58ox@z2}P0B%>!YLW%TWHfM$fIb(QZosIh$~kpXsj}w)Ake2~(fmp=4S?nm z4FfuH%(-7Qis?z%9iS)_#><|wnp|~%{PuXoIO418@3-5Vgmsolmp*ZJSmk|Rgi7f?0VUFurxHE`cm1!LMrp1A4zqh!^oKmQ(6?nd(`JEY_ZzPkD5_=Io zX}5ZQ*XVR_tYC4!X|R}la7J9$C5X$4oxh^mx}ux+oTt~lKQAv7GuUWM`NR@`H+ZB= z8pq%86`oqqy4GBBN`^Um3U!%<3i;GEPtM2s1+E@-J!O==(I|ck&v+fS`u&2DxzJM% z6Y+B=6vcTksYOu^Buk33QP`tY=}+9#LUW?kVO<{#Bs#KE1~CCpR_+gl3Ts8NcOoQ# z_7+++X_@hBOX-7j*G)iHdMT(U^6n$a+R1*PtqEMPGEiu1-jl^HP$vy}O zK@2#vpgYB*DUNwj?xqyg7oNT8qHQSQ-y;J0502HvAv=8#Xq{W4A$z-j(l^PJR=A}D zer&4in;Dx4G6J6GlD`o|Kks&keGpQOzKW;Y=15aX|KmYpM92fqC7H*%Y~N1e)Uv6u zIB-*nEE;gcM^1qoP+@UhVZRma+Ha)a7uf~GxPwU3ef$P2P-K~lI&f}An+9qwwgLXG z9T7(Oy&=nkokHTqAv2MG59rU!HVhK>yinYO9WVshzky_fcP7r|XcM$EVBcn_2#iZ* zLNb_c(eYgnsXBmg8ul$4n2TnXE}OqahsJVRAZpG|9t5!F(4b1a(((_b+b8fv<3JfZ zW(Z04I`-P{(Co%V`h9@BA%RWH+(+7co&$(ooXu#bFsE_o59q>wYgV5=t#MQ|wTV>7 z)m`8yoYuVvjFarYkr+iD2*0s`wJwJ>)}`)6V z>ZVf*r|Vk@L2fjEMoLJcN%$p^{F9BH772DLCh|3h%~;@bc##MF=;f9J?%}5A9h~bH z>Gwr8u;W;fAVoIUu}yvpa(AOJ*E>~5CcIOC%UkDgbROe+Uz)P(0d`o+axj~i7{sZg zYW7YsS65dD+Zf+zuty~)B@siCRif@jA4NhM8jUu5Yk0qZ2af&%%hc|?MeE`dW$=4O z;@KN#yf_KxTKII}>^fzY8AAJl6wkpp$p~-~#0>J@NH!HE1(XnT8fgTKl`i^F4pB0e zWYd|*J;9i1kzl4E%>t`A0v!rg3d!u9Wa2;!J0)6qBUxB6sK1@``(}%W6p@DQKrm*S zlOr3p-$sFdndp4L882pvw%%4@p(9n7i5#lvMM6GN7A=9ZNHA2Q&vqHB$032MX$BV! zE>W}qKog1fA2K((3<31{bjs;Gi%*!6k}HuUD3QznKG&6+o4B7K>e|Du=?`1{z@FX zzE3B*bvj@;u3*I+4F5tstg0@LWGvHs58 zde_~Y^zfYCu4p5%_tGAg^ZLseLD6ltxx%gXOTEYuZ2HUFL;v3G z8gKHPuDmap$J`e}SZ{hg=cil=8OFI?^9Y%t1ut{R1!r%U^M+&w(C9E6?SA>;W^A5+ zqj0?NNe7-39-}9&C$^%RprqL91KG=hx%PHt+>;-{gTP(pW5Dq}E$2K{ik*=61Op%} z2`hgBTkh99p&*6%U}qPMJ2kj4p41pVC0#AeEm0Yz>}t*o@k^F%`7LYab~W!1ggn4g zphT{}h8M&6*plCWU2#rkA@Nim2DICM6;CFsO#bwOX6bc>S!-XWAi4hXXc$P~%w(rL z(AO2~W%hdEOTa95U6D29{f?fqshYPd$_oytn#~dOzw|^AIJ#hVI47?wVi+LXE7M=R z=yA(b@%F2-?pj=ait8_ra8BiI>L*Wp(@7Z#lP*p`=k66221Wzl=^*b0=!BVn$BUcT z{`qAJ(0qnmfYtLx!h6e*;^InRd{|1~J58@8P;e(>(l|NH8y4z~4mORkArVxZp((zV zByy*5ucO&y;?4*aLCJLOxQ?0U|9H@dLlP(!N3K|Y`zmfh?1t*gdo3HY+7jJaH(0Xt zM*&cktd9mmm%Pi;$v1B#!uKqH>OL??$vaf1Vmpb*- zd*c}O+JOcAS%ScrAetL5h8!v*n`x=f5`;?AGnlC-74+5^aV#1`b1xx|KYhaj{X8NZ zH{>gp-aOBLmLMF7-et^V^+HY!c2$#42AAJ-t8eLf`XI9TD&)vNMeGLp_>@Esglari* z5Kv=?+)CcO-dN?(!R|(X+nzo2oyz(hjL*-NeLqUESwak4e10uLC4ojkjO(5hUs#7m zB-Cz$w3lG|5;O^70Z8i@kUH8`pfS1?5tE<3Q!t&NcMyapNcBYj5{=QV2xC+kqu+RN z%IVa#1<2XPXe+=N(f1B9X-N};oHEC#44)Bni}yF8`Sf;0T7dL_`qDq&jZuF2zwi1y zzKu0UsO<4u0p=Y01zta0@#(4nOlcunf8UDG;hITE;cyC8r78!d3arETB6Q7A;&IIS z%nrvg%HEY{*q0*UuF(GwyX&f%MF-XvOoCh1K2O6TX)}z@Wmn#)6_;9rMkLT*z;eC(Bt&*W+LjMaPFGY zRbV~77a^KC=%K=$HV{e~L7^OOeCSz(9;atn>x>!UJR$CcS#KW&=<$dtQ7b*e*y9*N zz{toq5XM*vCVL|~pwg_%>@r_^=vQqHctI$($VKb(tpFc?l-hvQCXDO1)!ux6?gi*; zi>Rb3YjE;LT0d{Ur*(UI3#!?W)OC3LC_w*e!5oGtCA>08kBdUTN>O5+vuP;Jl(TYL zsoc1F8OD$K^TWrN!D>y(Ie9_2t-{SRV%nqlZy%g)K*d@Od;x#T9T4&b%@?u=XAJ-*p<+YkCd!^OUFHz~jZFkTw`b)E~ zwgZe7(>;n5GXhvo)Qx#AM&G-a9g>Mq9ATBeKv64IKVB-PFRN`UufV!w!|^N~Jj@J{ z0DoY3kkul8gmjz9%CrFdm|6|Jk`5)BMgCQ#zmlTJIvc;A8y zejmU7o$ai{)r2W=?Fw-p!qNk{DN#XDSGx)w=L`zQBmCq``9E}RR}K8ExBaq&f_?!L zGlbKBy2ehT5N3i&u?VoJ^jUrl1Vh655!|5=eU#a}^2z!jrA8w-ZMj`T?sem~9B~1MGkdX>Ti0;7#TFwD;T`hVbsfj)ZCP*pWpHw66a8dwUe`=h z?RCn0w{j${YhadPM0o|FiC^sss(9q@ArYg0h@7meK%63^qVaG2dQV~;@r}>z8n84) zX)b|OffjHPI2G?fr5uUl$+K9`k>GH0Z?rzWDCAke_3YdA_FwK*TVfpc=JQKQuyxcS zK0I_Ei;>}p*p3{#CIJ%%v+g0=&uJxEK4V;niI0+K7F+_3lD2dbW5LYX9^8X}qZvYf z9sl-8gFl~l7<}-M_0U)8Fcyf)qXZjcL8ur)N-|sJaPWj@33dw%(1m|mmSsWaVMnuw zmbJ!#bumY(-4VZ`G4mgHL<2oe!=BI>d8!aRaW8@TLfYVMV69;tqQiE%vH^8SwKB6b ztt?61F!FnCcupnBSvpIX-lVn-Q?hn{(ya!xM|uVNX*X^pK24y@vVFSR8+Q_Kq$#y* zDqE4s@J0d>hLEX}sf7Nq5AP&Kn`1>oRLXwxaNWju@;~mR_lERB8>zT8DyRxh?3epZ zvbs=dYzFxx<9pr)^fZGD17Q(67qmax9pvvclR$#9Cia!y zP#1Ehmi6xVn3r*|$Z5Nn$?;qUBbgOx!gFJrYILK}(%Y}Drbj{jIS7C@Ogp`_WqRyG z%r3wHzICV9=0ID6=J3HXpll>T(oTjbz${eEMy(yrMS&|5Mr7_Fv5uSdGnl!vh+7zn zyAjS|8tvk^z|K00L^}<*S4cO120pKCdULWe)qx?z<~woSSS>4;Aw~dL{Ykprl)9=v z*K8!41#e`r%T9W;tJkw@>g)3xiNP?D5s5@4$Q$FT8|@%_!N6~QbYKj1aq5%SL|bu` zc@vJsL}9(esd&NRH?i@KCXo4!8lOv#FM_ARYgL1pw+t;ls90!hSt!?kJG<3_g4hq9 ztX-a*N9`6Sx6X?2P11%x?A#vHdg4*yW_5=bc9^~kx%OG&c5X)+@@2xYsU$}C5*Jr^ zgXpjp6z|=8iHk%>BU^M{kw^E z_3Y=Z<-w0In8NS#LEEY8q3nOd7ot-q#C=?}POQ!N!Qd%B&FS1hZ4{;)Z|pjy3JY?H zci!j)(n9~AV8ZKYZQXm(>l?LSa5F`_*gNg%0_Q?RL?bOx-8Qs;JMF`HaI3yfzRXv_ z2mj!n8mDCE`t?rf4DF(s2U%YsPK~1!$vU#rIPmjRGJyi=jLdt>MyM+-o`y~^89F_a zUE@x#1bRaN6V~Ek2mj65JlF$%rijD!OkkesWZzhmHmyiWW)`u*yiUdv!*qjN0Ys@E z;xVCP^e3;Bjym;!td3@;__^Xv3`yVxkAmPSo2Uw3x&4Cqy*vuS@H!^}ggN?LJnfk8 zR)CSTV?ahbc%mz&%w&(;3c@;XWagUSM!#T(tB-A}hTA>rsI2J6*&G`Ow9PNy1x!Cr^=P_lL+=F+N{=+>ug56=#o8e;& z(BMS_bct#;8g#2`rvRf+QVEfRP(C}KNr`kC_Q+I{$c_l5?$QwkQ4>1TA*-Rb-YdGL z0RP5VxcM`6Knt($pzq9k0DppT3LS}8`T^jfL=Y9d7jRd=`n*1bsj?E;7I7&-&-{1^ z{yETpHjB3>(>gYrUeqZmYb{9zI)ozB1-qzW_nepwC{Rrr!%y)Lf&wfF_f!*@dAKL@ zXJEJFeDQ|Z9Dy^*m<8TEL~yARlP3dokq*AApy@kvNzuXSl$7X$lnhuN90^C%DW{XX zIx?eN@yuzUOTiGJri3hKlUz&zs$27_07HR)y%3p$o{S&hR*F4;8!9*f%oXA4T2)Zg za}eLdd>u-Y)hMj#gPwyKDcD=0T7+%-u*3IMqv?@WfD?0i+oY_5K9niXkk6LteCov{3E(2YRw>v+806FS45=)C zJjApE`p#N}r3@kJgWbz`C^Wk98NSM-7olSaUTF6q9~LDy>mG49$~niwca>CtG_I7* ze92(Jl8I6>@_QhLgu{ji38450T5G-)%!YzycldbDrIqn*$S99sQFtR+`vN1akoDE(AQ@n|%{)B{j* zvb`kAI~m4Z`wrdorp^_z`v75#Verx&aNN<+#NaS!?x1gBB(rBubQ?FZc7or3i_}=a z`Pj7WKoo@I;c4#;%?g}e(k-0!4Dne@CJ>Pdc>LkK<6hK2gW<6tXpvXb29M4wjRrnu1R$5?G}M4S|Qpfgvt`&9d1A8u%*` z>2U8rT&r2sMa|FiUV=OZf_%|=nQxMVHQvN2nCMCfC{GR!AFj+<#DyrS6Ihj#3!Y`G zhC@{_8rWOF!5sE8LmXjU82*5=v7i0`;Ep?hO6>{h$^dp8R>wKkbkz1bmQp~gyRoI@ z5h7#a_(WuLfWejQi79)3=5|-UZjh-A6&*QTcl}}W?3_YqtaVgDx3JP^)yzcb9nN}DAfvE|Rr@_Q8?M<6YXD%)3@WPTHA`;_pjQ>!fR(Jk1!|4ZDk{-NGIc~~ zLi963ZWB%}hK@6=L5n>h&@$oJG>m~+%!pr-n%$vTCao;kB2Mn7=lT)+)<(G%C1!wU zNA)BM<$}g!cQI9UiaeL)bV>-5UhRnvoS1rD6O=Nfy8lXls7yY6Rt6Si;~?E#)Ktnk z>>`G}x(tBsFaw*tjFoAWSbPBl^coGq!I5smX$qoQGIG2cG)MHjRiDmHTLXp(_Ureo z`!gr0VzHg#{nnu<;r+MnDd+xn1m5m%#|g>aJwjLU?!m#^u-XC68v0GMcaH`KsoC1$ zgNfmVKY#Ln9<0RDq2-CJ5C}eHD=*waUxI*gc7&rZOzfu5*2Z({wDvgMUm;hX=sZ7E zJ41*y--eF0rJ%it8fSVgJ>0OQ8qrA>`>kn3J&8xh5`aqr_fLyVBVtEBofGz-J zX@edFk5Nn?G;MTYOGZV60O@pAAEKpUH%Y+Pz?k|;7YUAY=x2ZzQH}(XgAP7`F~YWq z5eJC?sX@0_p*syI)5Nzm%+(65s};&{9z!L?EhAQvv!pGy407cjl|F4*&i8nZRHHi{ zZ!Oe+2jI(zeR>gh;m0y`UaNE$dMUkWvH78ET&soxjgTU|1F_7_Boa1V%w5>=^EpH^ zl=9xof3@jJCRR*1V)I}_n~ImvOgpMgaG;Na&NfA}1x-wa!-N`kb=WpFo1#?4-@b&J zA!v@5t)W2m!nV@Zmp(tFl>AuMYrRvu5;V9nAv77r_udZjcE0WX3#gnJ+3;v*HVZ5cj_fjgQwQUk3kT#{$WJ zxqnggG`|#{7nC^yn6i{d7aC$dN52so_!-K041{-8t&&oj`2jF_-b?~`U2c50u(S4|HO@{ZKI_Txg zBbm(iRp*3@GQ0;m6(8!;VxG(!buci0B?%CzT1o+49Sl(^LL@ajGo@Z~%6O(}p<^q% zv+YG44oya)>p1Yb7HFA5zBwdz6mSv3NE=CbawwAr)*@oHiDBWV$EfCKvk3b9W0d_c zXlPro5sV4M1Q6#^g;h!c|}oijy~g;?UQ) zS{!2hVne@CM~Q;2D+G44==z<~>G1(gwu+4md~Tx*z>W}n24j~EZD^wu6KZcQ8qEB5 zybz~|Gi%9Zjw0k#hu*s=MVk^3PitMwZ-*0cN(c;x&I)zyzV{?3c;KA#O6G&_(0s&_ zeMiHt!q?`0WxXHR^4;3W0i)u7>iB?4<&!x{D${le>Q7Hcf~P7|&{2qooRu&hzb-;y zt_S-|Eh<;z3V$ZD$ZEb%#YI>L3Cz%Bpam8{Z;lFg=z{L%pj2BE*1V6KL@-d6ZW*Z8 zDuHByjG(xvgO2*TkF!5n#KO8Jq9ISr6^}s(9DAozM-s+JH_26nzoxZ+$JvL+?1cEb zT}!&HU!wJ>OTc0$$s1+0De9GTU87Ft_KTz?B~%s&FaeZQJMc1wTblyV=kiIcc%=aOYaimWEEhOWuiJ%79|X;o$J1ui8t{b>8O~sYa%EWxxFQ+`+$~jrsYuLpxK1kxWD$GRs%)9TG+}B`2 zX>5X}&x7*|MsX~Ul}NwcOF{ej815o;23T0^igLS3gLrvJyIs+Ll5Sy6=d0Sn^f#n& z{F0yX`_we-VR$DZ$Y5QQ10=$<|1|i}i%?!NF){nInM=iQtSaUL5z_pMflksaEJ(}K zz8i6H9ft{tleu)0;ER}Y+FHyNqnQioZ)^m^-xA$9u4_nDiYYXP0VsCC`A=^f0)X4X zd=Uq^UfKrNgWP|Adkd6$fWaC~t$;NH<3O8VmNV~l#WRSyy#5N2O*k&=3Z|e}7nV0T zj6g)|%96xVxKMX!_bb8-bs9ZhL=>QYbzRL#jtX=_bW?{!r(IXHhR8+AvE_p~<~~T; z!s(V9nmHMpo36p`JZUJV<~|$@zvnc38q31_r16BkBYB>G&vJ{bc+xt46?&247ti%2 zJ%6WpVpA80Pjl???TY6v0NQ_1C1=@nWyuEu&GPf9Idb-2gL&yuK4hJ^=j&=&?Z@&! z!=`*)>GYjp9CVwCa;O@@DcT6NIC~8o0ZIF+V7|LyWjqZQO|XW*ynoT<=Qs5AdY)_B zU*2KI%TF4AJ3EW^sOH_9?3*42^`PaMkk8A{oM%|4JY4!WG!DP5R+i>AcuKpT=_G$N^uMu2##IVAv@;9_xB^2Z})`XS6x%J(DgN7G}d)OO-*XbVJ$%Mn5z96u& zK4Gly$%h~05;oB?^qN<7wA7#m%M)AO>ZAMfnhze2kiVgs3dp0ooITue{ySPu4!2HP z?)~}3f==U!zDmUI*2-jq|Dd5XTDN*P*0MVO{D#&seLOFR|Mdp{=7X01S~V6Eu#_{Y z4dsJ>-X=!1C+fN48RIv!+|aU3$8M95cbX&NlfHbkm5Go60L`bg4QY2V)4!$RS!hDS zf>VN_s(JXzlZOAatsdqJz2YQ`g;P9egf`eaiUoB9tA&S8JZL;&K{?r@HS-dz^&5J7 zB6`fCi`?`rtr%Dr?;aV-S_Y5Sbey;qYU0siG z3-dQu#@>n^@SsVtFy5ZGKmy*h5myWkVGI3B$L$jH$DFlQH+Q0^CGbX}8Sb9k8M(E^ zOx`F#sPU!BC+y)cNV>9JUlBmEqO7VgHO-yczD^vo6^fA+sIgOe@Aj*Q)iCMLor2i1 zdjx?$tMcNMn@#lX}>#v->>E6tZ?gO->61qt~v^?Hm~(yQ%q^#gE0|Nv+oq{ z^;n5!?~O*)2PGe1c|$43md7%DrQ|biAshHLc^Jg~T2uP8Z(#bL>n%@84)4_jEzUnZ zdQc~bJ0*YmD=-^EMnaLotGF0WZw~-r9pKmP2u$#b-mX#8vGH<9&Mypq0=ZEiMEMox zRcl8#ktZKv2|N?R7SJk#=Ms5@YVz%)pXje=X`XbgNv2xpY1OD`TTkP>rA;$l(Ssb! z_#RfcI~R=V3lF)sdEkvqOwdU!@`ekMX;SBt_*h7y3e&S}z=-X+F14tVP^vU>7jsUp zOMR0B5BDrs5C|&QrB*V35{$Aj%nWttPJ9rFC!Q9O9&GE>gkZW69}C{JDT-5lOBs42 zK32RZJvs0a1+MRxc$?wS@&&e>Dt4^E&-8}UJ)6K?m)3jZB?W+OgU zY*_Es#WbpLY1sD&_A!G&9D_Ou%S*_%5dO-rUcF4t-s>Tq3J zbk52BY-f!~bgSMXR6lMd$vqZ|rwIR@(6YPzrZqsI0cImD_C{NuwS%&$OU)YuZmb@w zBoSD)}+KHEIt4+BP%5^f}ntU^L*#e+-deW{H zcfYm(1OG+5PaT>Hdc%ySUlKJVo(eOL7+M7IlnA zFJU-eLMEjmD0}X{t}A+bWvLnTe&f09b!ErSJivl~AXUnW>&l*|_Lb_3ZdLx5j$%=x zORog(@2)GpyY#`+N8~9&#GddQ;jnZ&TKk1;CFzxw=GU*x*DcFf;yZgDdomkiS5n>U z>f^^&iVZt=gG^CjNA27<2*~oCg-p3F=5YBX#D?6DtSaC6OMZLQ_+82x=$3<-9Zsgk zf|0d<(e*1ACB+Fye*JEALgV?mj(At5mdxy9gu+~ZKbX^He))xT?sCAb9bP|-kcB&L z!&}Q3cJD>Q;eyd{`3)z}M-~6x{4Lw-vb8wS3wRb3W&;a!@b2>OuFBf%Esl>Cr}x;d z_EyJRtNX3h`O)e;-8}`wyLsK^cUtPAA`sGPd@=?Ul+Td zchcfoS8f*iGy1vaY{89|?$&cKnzr?5 z*WSW@rLXe(emKLbv~ffxXG)=$#=T5?vezvi5)`b1uCK$qlix-_d|A=oe};E2kQ0Qa z7O|ATY?4QG%8Mg;P411lxA@*0U;1kA$6F6S`~NXI`?x*F^giM{FWk5U4i#0Ki;UP3 z+O{g^=U`Sr#NZVM_#@z z%2KflOhqvGv8un?n22!?#KPK#V^yQEirt>ORT!1(EU?es8X%T%x%rI_^_9K8Dj3g_ z@0V6{eLC0Tx)oS(%}^`~BUZ*jrCJp4V#Y0Dx@ z!LQhfRMdu~+7zEeBF|){`2xdMrj8;H675|vJk8=*{6YfC%7{V6GbFm&C2Pt>9JGN( zdHA=N0UxbPISV6HmPa0i8LnI%m|EdrsGuR`DHs70DY{0w2z`gp@JF+Rfn0Fm-AFff z9`wnZTm53boIJQwumVqigDe?jpW8cNc?c@f5)h-u_K-FQ*FjH02UpuiPMj1ka6(EBISd&Uw5f=~!Fws?WZzoVx7Ge#LM+37fj;Js- zq}$1biKnBGI21;Ucw(d+n+3$q8$5&T15~!;$lQNoCPW2)WTJ+|8&c2;#W;h?0gl3L z6tKPmojicw0>uY0JaeE!VT%!_HL0eMek2}K*b6Wtrd(~nb|LmiVvY^OkRynaamopa zu!oM1JAJJg;LgRJPzS_qNis&s%*DD)rW+LBL=B(C1w!1~jI0sGEnk4lNP#up;VLNfslfiqknt?*&RqSpC4{NF8kdFU1~ z%0&s=17)KeO~c+hgG2^dXp+p`1{fEDR3w6zLF=)s&_J3%-MJFK6C?iNVFsfCQ$53+ zia<~3g84-_94w;@)@G#OKnP7HuL6~%z^o4}kVs#D4B6MCEKuj0IPApA$~0sE@?yRg zh;{u6BQSz62sBv&IjAzOAHU5hP7DS703e3>h9CNU za06a{MU?0p;4<*@0Xk7))^?07<{-1olTT>Z%LFO{1A&`?q5}erIF$Wv-a44Sy@=HY z`3k2dQZ{m6WMC454B{p+iG5QTg@UhOmfgh7&+n2G61xwwT&*x-;c$&0S84!$rz~j% z0l}}tnP|)a%^;>gD2hf1MWR(loz9H>B1~F;*1-;Q2>@B2&^A-EOZr{sK0S~Uc2GC4 zrBoQoPbk&N1CRyD;wRDL)Gni(4)7c10(Q)tS-BU%;dhd!!i@zA#KRTIqOO4?4pLGm ze-f$$WBi6y8d+N?EfCKI=(<5!(xX_%`LU6s-r(vVfG&M5*v1Z zdsi@fMlyjRd?8>mk>Io0`VanNtXpFLLO})u0-`M%DKcattOQ?8PzDU*NmG6S3_}vU zCGs%><_GVr76m>4Nr)~@{5Zu6(Yfl2tFn9Kpkh@Zw^doQ#07(E48F^O1dx|iBn4Za zsMe<-p6jvdZk_O1PRcp`l2{OO4c|h4o1s}qbP4pUSO&sjpkPH)?KFTtkQ}Vk{O%wz zI0zPkC4l@bm>%p3UXR)E^V4X++!`qOfz`7=te8NiOBle9nAnR|@eUKsuBZWwkCzQ)*Cu^qL+V zgZaK?;_zXdQ)$A-1v|ngz6@gNqFWh^n*;|5Tr9B>5GoirP%QiviG{JhsTMO$YXNtf zRWabh?|{g`nho!!NjIBdO)#BIEs*F9G`K(np>F^HDX85t?pj~~XBhHrHL93_LI0gv zio=5ytzj5A%o*5B3X!jX7FKkB&^2{XuI^>>66fmFgbCUNTg;S-h|nrB@?}7SodRrP zIz6{EanLDR z((laR=}xe|`8xseFt~FD%%?||9@kE*N;xH6&yeT=6eP2tz6(5uC=VxoN7Iwk{5k3sK(g&72f-3=uWG>`QKIs65Ko(&FEfpzFbJ+{DfFN@f zDG&rI!mY&i=+p_1L|v1ADMj&Cyd0h_Qn(_K`H+OOQ2(0mhLwQ)J3G1(s|cS!ccG08 zu;HUPH-M99o?nif~=&3fi~NmZJreBGmThj$Sp>ot3gqGa%vp} zp>4VwAb*t9$h)WzePmiq%=nbF1WNRwn!K3@Gw>Ni>+v(rb?aIzVV}nW2OYN2CIgcV zMQmoAX^Xm9;HB_?@WJ2#JWqpA?6Z*laQ$ssOS(E4GBB|q6e3uj*abkq4{YNJZ!#YW zgrsZ&Nty*be}qP(pOMLuMkp>z&EVVSFA(aj>cAN0G#o!x4h2b8xf$FTR~b4dW>J7h z!(nVzm!H|=Go=&)gO6z30$2e6=M(^3?4bifJBD8c!M-|w0qfwEK`1ncmqeU0n540M zQ~1vUE&r-9%y?0%M4Tf6kJPC3J#ZgU=WDvO0Sp41S%S7$=j89|8?a3LPEJ0GBcAmP zx=|R3b4QS@TUIV_pnFGc=dcHl^uSTgC;$)Vb+04 zff1n#LWBT!Q=cHv8Bi)K@zPF+6Ffb+mN0CBsu?uw0sKh#AFy4(i74n{=uALdu0k70 zjMK?~gZ35_Abl}BZK6J2V14gA`{C`x?E=naGh7isX&Rm?+`R@N+Gx1KTew3-Z(=XS zx)P|0xQFvTSQKCqDk8&au#{M3iOQ1c=*0CbC%5Y8>Bvny?I{5ZWd>JpCw)>;>;$y~ z>ot*i;bTTweE_hEuS3$}T)**10x8Ksh9aAP8;v)Hx}7tj;bE5o;G~!?n@J2^fXWV9 z+bZYa>_AKM>R#*M3Qj2GfewVZjG98gYzC%fHIo#3x)ZDz(`1VOqDtath$47*nLSI8 zWqnmxTuaa`GC0A51PKsahhc!h9fG?BcQ^rpOCW6A-QC?K5Zv9}-3h@$2o9J3zu&zN z=j^B6)vLbh?uUM;UbU*mC~PP-a&1MKq}Io=n4X=5QK6-N7L^O+n)3awUs1)VU=Kv zs)>X5*NigL1r4xCJ4V_%CjQPX8|i|1kGWr!CK|L%)+Et}B?nTAhZmv$G$vCwLhRsG zpEey%u9d%?B-N6(jj23!<5Y=G=@0e_%@F(|OuMlCac+)kg!poxbeIN-I$AKIlAFF2 zzj>c())+$J{HgT|qqjFRbr)-s@cq1TMRZGpRR(hxqc1SdOS^77;V6%f(F5J;(i19 zlG9%+Mz{K|#M)ZePnY7}m+zwZ&CyB&bS2xBLL$AAqki~DfL&Tm5Zk_oZMrjjA%ZFY zkaMsg8Zn+Cxpk@R$dE7Nq+qINm%i|Ft40v+rUgVoqEb(Ba@N2^`s6EyTAe%ibP>=$ zJBN`oCdZ3dzv+<^Lq$J2dRMk*-lT&!`e^$J;OhMz_XG~EzBq|#FV_@65l>oZQ{b7$v@@$er8U0 z)B%}v0z5%A{Y`CxM|%_j8sjCV<1{UNrK{SJM=9UuH~s&Sj;CtT^%oau{^NSoWM=ST z14TG`rs%@(Yq|GXz&pCggbAgN5IxX(xeYKfD@mKZ5U#JtKks9o`*I(sr(40&5l{j< z5~#L3ey3I`jAlo1BX@(X!Q0COs`AiyBElOt4{kd?5b;w^7|;_g#%qRC%rY?ZUeJW?!GQPYUiYG$*iG>oCB^LQIinXz9g)5F(>GUuHDV;|J z<4)U@xcdTL*Bg3#tYt*#$>jSoI}s%+dhNt;T>{4459iWp>}HCj=(hhr@3r#wTf@ol zi@Vpx`2&=(K@~BC2yJnzH4xu^)wpT84$cDC?-~*2p(&3 zLU&#@jox1^TKc8uywhbPuA_VqK@ypKQ$HBv7u2719xaw?ExCz^%zxB2Ic=jMms~2yjoQyqgNc z(fdYcQHLszlrt9O`|#;L2$>KrE@L}ea^g5tokVtsksg#(liq3&FpB~EfEZsf+JFvh zNn4RbQe!tCt>iPbaT05b&fa{AM@e?TRb}NOj2X4>wWgSlq=}+G9yiqZ@QZ5ChnpZK zWQb(Lo=HVtHjTbpjhD6q2RMwD+0d6fo{ck6bql@JSa?iLPEw74FqYE1`TN)_aBh1a zLAB|*z``q#Hb|TgvZh05H$XohBJ7XWC+aj(vLXtKvrxJvU(ebitrJhK{Ngh@EgW<4 zkrSC>%rW4N8HYP_y70L@94retk9*h;jzdf*OW<~$qv4S>{;D+(7f@RmBZ zG>o832!iAFz+?F6r)kvWD)Vie`fQZ2CVz?oW8XZ)${9tT8!|BZBY|z*mHG2q@*g|; zJod6kgq}1=4_?)Wn)(Oh zbF=2rgqK>hpXo#mMSvTcW>!mugqvF90O_0A0>b((_eQ6s8A~)jxxydtkVBDfF{WZs zVV<$Wf_#U@cg>u9xQr-%KjnqC`u&IXnTpsW3_i6nVKm zWj+V8qTTX_PYZpSi@m21$8De;4xe^S<9EfT6#fwce`=eFPBFu>*UAcF2zhYPC8P?D zp=LMjto_(SfW6x>1%%}t3EavNOA)54dkI}eu8FZ${{w`qmkg8MxN~$LRk%hlTTq|X zvSt9ytl6JMM{YBZS5FMHJjX=oQlzEQH>^IvatL?!q(#XcR9qN#} z9QRf8A4<1(+@oc_d4C71!ar3Ie9j2q0%dX^e-EmaOI&h98#bhTCSIHTNQA`M{T9F2 zZ$u)}NzM%LpeW+Kyj{p4-a;iadnTxm$Sb8d)OLQQGT~z(6&@(}E03`JL<=N6p6*?c zGTW4tG(yX`B4~E~en2g!5Eru}Dn*azre<)I-6eiE_b z*2|QKL!gzkl_O=LtG0rCzmyj)xmewP?*5%HEYVVJ)4hUkpZ-(XaZla171yr*n%?pgFn^lG|y?vMKi!itu7=_xyYh9JsL z_AaP4uq%%Z8E)M#-3*O>Ui&BYJ;)CP zURNKbPmpF_ z^v!cmA4^^07@Kv)R=!V@UnosRLI{HHvSlb24eV}9R+E~uyx%Ct<688az~<9c11Nl} zTl?7d>5k>&Zv>4v%_2P$9M-t0`XrgsV8r$rjEwrp9HWbRp_1ssR-hvZJmyxIz6clz zqaRsQtuo9yOJymF3r<`0;)Q+cd2h53_gC1O(<$V9Zt!Yd*if$d*z`P4cEcKTxs<$U zC$2vhY;WBbuZ^cUsxz2dZy#Rt;wUdAws!kAzMc31p4VzfEGBftG)d$XVSVeA4f9gmhyHiw1uZ%k2_u^c&ljDN?|CSrA?KOra>a@yaPAP^~p1v5ik@fLz(@rv8DV_CV6bI5Y} zN07>9?PwP?Aj%%Udh$`+BA9|f9q_s(S>vmX)$|2qoLN|#Ir#W~K@zj2pe$JxX-9?9 znEX5xhrv`Ai!mi`<1?dapsJe!wK(cy{KdDU9e$aV+IWNT6?+fg z>T6T4C*6tFynQB<%?67|1mefrE3vm0S!PWd213d2#k5CUO9aDwDTfuZr=dCF0&;12 zf!i#I*yMIN_1Ym5g}y(wnv00dL|RxVwGs&Q4H z=|N_6)gnR@*^swE>sbV5eR~^AOxPY_5k@-wE#BuN5njXif`ap|@3A5001>Y$o_`0DYWH8rYtiP4`)|K7)MkWqb&&WhNI@j&m8 zy|4*$RF($ZB-F4xft%rieVDW=vIq=3`W8byT|S$*(K=r@wq1!*C6-<^b|Wvx$}*e( z*5)Q})xL*uLaf7y1wou~C}ChtY!g~ERwR|}Nm)*nM>~C)PQH*9!7P-AdM2V?IFL<@ zAwbsqC4&GKh`Wdg!hr6wg2RzBH~6IMuVUgSURi%Z`%`T|eGA2wr?`<3HWg`@SMOGP zA$<@MjTy2=*0~XzRliwi&*$=a@3urxJA@#}Xi&kM4Cek#w#l%@7Rn2+5x+zf_&LxJ zu2cs694s<-@*59E46H3_Mdjf>QT1EyoxZ*b8vL_t{6<{veGbQbS4Q;SCO1j|T{PvR zw2Z>4%keqD!<6dpf6uU9)sSb{S#r+*%>P;JMqz%gY8t=yeB-rT?`!H*V3Ex&mlsc$ zVevkkaNr-yEmFlU0RG^&T3ptq5*vPvMAG8l5tqP`T;s_IbHnI33X;)h8c`Cy&MoKQ z(e*=rDSB#m?+K}|l!(O^6O>1xkl=IZqdr5UV%9!jY;Bu>t}2u2juYdFdDINN3M^hL zWJIEtpti{gzlRE15>Mw&@xs!;kPw}*@vA*1$}rU$RF-jj7E>9~rI_4{45GG;D{=no zWF9;<=H1f}se7-fj7|++CMpe-pBPU&f@{79dDsXd^`QzLGtv?m@xx8={EcOahtH{` z*IED%ZWHd(1FqZeE5#jwRB-b(O&4e#MxD>^vLqo*e7`c5s>zUlJU=CX6Y(l$tF>}e zk@MdDN=i&a&+u_nmx!cCezAX&G_jWY3R9$nP=oc2K(@GIok)bzcVy-yO}X20BTY$i z3|yxjMf{8OaZ%9E=kCrHYuKAZwy)5dgGeAi7awa29Ue!7i{dRo7Qtpk0Ed_k zy@n{Em9D|TBluk@B8p^O;MfN>f4gM=@+w%Ym8pwS?`8ufu)3hg!#+YlxkehrjJDfS z4vbgq6QZFg>1r^pvkh$JpUY7Tipms2mG2g%d-i-;F`P*FlRs{8yvgW9Ry`Vf8OU2!2yxX8zoF9l|pE&BrYzk?CQ$Y?mVvLBQ93 z<+Ug*?M=6GKzm1^28P^+T@;!=m@C8WfS`C{yn#s+|-N9Azf(Pp~|tRlq7#CpBv``({PO7h;>I1mKW z;NiT_mVwi_*^eS@QdnD{^}VMtgMvB283$`QUIM{ZTe*Z>m@R3U{Tot#^FWE z_*w=wI8VWQxFTeBGRxlZIiSJ9%eKka0nJxUYI(p*1BpJd>k&+8H$q}`e(SGF3g_^ zFT|TbjIh|E(PT#fVo-rf2B7LwGq7P7$6szx+;^>O|FM#QnA^4{1rY53c<gsMGQble0BUksB*5!LkJ3%1k3scD(}u_3hy^|&CL$dlOXeuPIq zM=q@drSB;`{qqWb`Nq+WPv}t{7ScOup~jJWb&ceUY_d^zmQ3mZl)3Nga?>_MXg~

~)3rLzuc0VC}J-GYnL_&}6 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 delta 7946 zcmZ`;Yj7Lab-ud*0T6tE3*tq902ai9BnT33fRG@F;zN`~iIPc4CL_@jMS>D-^AU>9 zSkA<&+O;!f($)!`Dv6!CGf^gS{lj$KNodiT*b_IM{BbmH?94PCC+@U~GoDT-^+W2k zBKw`Y00~JkIT!cbvv=>F@0@ebId}J+7hAXfHn{fIAC;sWlNZk2Z_MY7(Zj|0^UD|H zR61iU6pR;_mx_~f#yBR#@KYErpg=@RKPGvL!l=z8fu98c(7p-Z`|X5=}SLBGYI@7fY>7)BG7U zdKle!c5eJSqmX4DMm7U*JFziF6kp znT?Y%0SHf#<2l$1J)fCSXBvz1(aewGv}$CIlc-aKQ98>2(B(--AaY4XE~)%*V2p_IZ^CYeZA z_}cQ)Lq%52Vr+n&y-=K-X6oOw=rR|;D2?AjA9!$KsyzM_b!;9*5A&g$0`ogkY z8XrRMTwE%auTL|DvElO%UYaRQ_y@+UkqdLn536I_d+4WU7SGSAV|y=S!bK)vBr?|X zeY1SVl>dZPYd)asZ)#rOtM+evv~_07qJ3WTQ;e%=F8*+r=9gP$#Bng*-@tDBgTv*AwH$2TIxlAOQ9_G3iD4wXPymoxIA$ZLW{z1% zctjOYmq>u^Dp0P4kWiOAQSkcE1w~_jEV) z9dqYmM>5TG=O*XLP|O3L%>hA@{c?j@0jZhWQwOS!Q!o^32L*J%({=qCi(;&UNz3LF zNqVsYPJ$ST5FGs&)bApRKbHoFxd)XyDGmAbAJ~4CoEG(g3;K4KXyT@`6xaBUhdVw>g+1d`#O=!|M1htOHZsNWpr+-=g{xX{cGy`>Yn) zS=m-nQoX283a@pZi6usM`C1Am5+mn?%~ww!4jt|oPbVD_zfJso(&GvAoXX}V`hpiG z3?@U(XF< z&N_nwQ%{55g@(nE9J-EwHXa0kD)@lCSsT>eDyZxg?xyv(6JVC7}v2L zavRZ1B)h^LR)SMnwkMQb*9efF>#=yF)g;)nQ6ZfKQS#JQeTe}34_#HqPZ?tW*!}0L z`M1MW6Eju0ALpKWa*yzSP-lGna-A+1G`{$bAsEyfzVWqMeK2Tv{iiiSVBOk8{?TZF z*v7v4nTV?hAOih%JgOl^O$FmF6_{y;xulc3RB#QMs;mr!G*Jim(l*Olg6tBKE`g)g zYy35WU(=fYRl4@nlY71}W5~SJ{nv#{UoJdBAhivf8^WWTj|l?}T7cU;EPQeE3E_vj zAa)gUm7o>hfVd7evH?FA;c1kJEEI4gvw}=y!8WU_*gy>=eFI5<4Q`=h8e}j#%xL58 z*#JByZZ$IrioIdck*B3H_U*WVQ1NX?ON#?-mpSu(TH1e6d;>$D&(Y+2Z*#O12(b4l z|I?0SVhb{|k3FlV2^01;1ynb*fFMWG6LmP*`oE z8BOY5l5xM6X%&P~EtYKLPAcI3M((6F;2Al}I*8yva}ipJ;@=(d^0o;1a`LF$+iyl} zlsda(J?1Dv;*m$h-){b*S*{F-*_avw6@*7|+8dyB8Q%II;R8fKKXS<5t+N<(z|dmQ zgAM}dXbhTSJ*7beO{9L}P+Zr6(_Udj7h!c(Xk#Y|;wI8Y3(ZhkRCUxq9Rcnb$au`f zb>PC1s-;^%`M5SHY9axl(%=CSW-o}@G(|+cm3slz8zlv4>NTa1DGbMs1@is=1M@?n zOt5u8s&7sWMUU<`rsFbxs(zoWye45H~?dS5I3=F8UXikgi7eZj^=>?wRm_f^dPA|f)SO7 z<$Y7Tvu_ljEP2LV0ghK2Z~$Z&sy4{yqxxfC@<>4=e?9JM9r$>ewBT5tY#s_|1{&@1SC&ce~1Gk2SGZ*fgHUON+ z0$Vr4Mj&irtrQvBfUX*-v>a6%aFU`W;)144O1)b3++IW5$dI;*-B3%6TBcF9qq?3r zdezo+AfU>9o#_Ek$8B8;3e^K_U5y)q+}7k=Ztze@p*T{*UuE53Pg}c?hU=jclnz-T z@kmIDJsmm}Zr`8sg!<3q+LX96Vh-)?Y#QlLcXRyX@b;9~)3WDeI)833RP*Y88Vv5t z;po`3A5ytt^Dl`XUB&G=56eFn0v!b^~%jv8Hv}PNpn{c{SoI2D$uqCbF z1{Bq)by&lOH8ki+r{vJh+m5WBC@ARbTXk-f9DWYloi_LMcrrr~e}~m_YTsABDi!`f z4*Z~OswqtM2Ye2*t19n#^k8)JX#m8dAo=3f4Tb$1j!Q<^X72|43}_%tS#}+Xs;fBp zNW_pxb_#e9?OnCNt$7zGAHN3CD4DQY^qPvK^m?pWlg(;UlzZ$gEiVX<`kD?LXb5li z(AcLSDdDL&c*4=1Lmy%|lC;95WVBX1Lk%eyLqWCN@u<+If|FeBGezC0f;PxSAT?>( zQK4n>V?il}aH@H2VXZ0bw zH28m4ZN8e5Z{s?xTrZfde0C)j|*@gCMqv- z)ZYabzPVHvDr2SthWR$kpNY3rb?=-~?+T_n8rku*R}_ANr9EZlrzSOYnRq=|=8yy0 zcl2Tvq*5&?`32Sa_L$8*uL>v3`M2`s-p$9&`G09QG>Tp*plOo{@0hFG+N#aBu8Q58 zwT*^$ay}fPwmuf05tSEkmcm(Gh7+hKIs_L)8!{HzgQBTl_XR^}6_ZA1+dm@g+ z#1o^ZiruFA=59}JqQ@WTJF~m1TN)I4Ve$X+x7qg{Jsm%K`BdEf+$nQiUF)F-`UV$= z+v~2w`W$sFUQn#V|5U279L@Ie9ZZt%`ZWb@6g#9)V1BM4_BJzXA-4?V zV|~?jTPRm|PcE=0;%Khfw=37%o6GfXey&bQ`67AA6S7*IlCg?wAdD9g=V6L4#Rb|I zL9PfBC^t6)Wnn5L;Sx|Z+!e~VW0s!t?BG>KiZ)VtTZPIi17n-A?Pe4zsJud8@VBC# zCKZ+5)nPk@u%GOz%IL)&G>KBnE{w$ut^T%-j<7S^6goE^>UG9y!yS=Coio(bv+vZ& zzJxG6XbrWG`4u^QuJCmdb=#%7zPrg?Wl={;m42<+_E4fY#)ISMF8cMghb z8DN6jQ)y-0&Ubgc7pO!<0b7UEY(`&;)LeN;tfZfFhLn)g84Nm|A>Iq`2V6wD0-N6m zx}3p)%Y~Q;0mTT*i+D4n8DbuoCP+MCm^BGESgl60wJA85Urez^;eT0J>}DR!HHc{z z5cV;*Fv1qaF4iReoH@lGvJT-@Rx9=}pIF1%1m!6f7WT5Us3jsp0C{ZeB|-SB@pWPA ziFMZR=C9?>+}82ahK0053Id*Y;5hdewS~29J6%WqC#YPF|7)%htRq(t{c=< zM#t8AT*?|7Us<6=N5}lWwaY6jt`#6Djn~<0cQ6EYC!?ptfG)5GbTP0lTt0@y(D{8X zV)%W29|Rrm$HS{5L!)B@5Y;!{iEk+S@<)`#kE~yFd4KdDF5$-xF`oMJ)s%oHqG`~y zXjN!BG(DQ(M^{tTFSk@byo4`X_)eI3^r%f92)3 zt2^wO#GMnenN)Y?$|rAE`|-IcMIRsUxW7A-y_1(nr|~8E_IZhH`mTA&SSoYJylgCy z!q=bjy~|6Jvkw-R_=oFVqqC3TQ&HL&9a&gd##cLhBfCyvL90M{Issd_3MNw)Rmw|%$^cE(2L3I-sckf*=}W*8V4nOk6p8C#fO zh#4AA7GqIkHncFCY|kQXXwIb{l%HRsV5DH65X7bLnU|KYU3eY%sLhQU8t5Td~1`wzIk2mj^IPmBKJ!OfN~aTfeEK?x5JVDmNG1Xs3; zWJ_j?q_nw1N!Ky>pY1wJ#>D|wf)t@tXh!N4{7I2JGOJKGcCoFB_cFB=4r|3R51%_s zi?T?U*5S%0+~~j9gF}D5r@Z5KpS1g&a`f1d>zP#&xxScdIELr^UHDHn-?}#(s=Cg~ zl{VP}7b5VEH-e7o9)5uo0%ahOZb?!k?LhUCKefNJ)W)+hrWN~pikz!7Z$NA-*nraH zM;`lHl16zt3QVXeSTAx06*ZYs(874394c+<)S3dExbczWksV8_w>@!VoE(q$6iyP= z7w2vrz7*czydL54MC3(1!sFi3*Y4D&rg0L7hT5koFX=dw38-qVG-@HKZ&FK?Axk8J2lxt1%648YJq>~B=1R0#zo)ju8=}o~=5C39G+S3(X|f`p64~)) z`cVmKL_p|9Y9z(C+Y`?4IJ?-*GnphV*%e!6|CTt+C~KazVEBCQP}}h{c;~kQ{&Tjj zaK&#bem%)_DD4IWMj-lyVG!s5H`wVSL*aR0e$*+#c%f54bfuHTxJx?`jIMQ(pk2f> z#F$>^$|T#_vi@@{v%i)g`*Be?}DB5 diff --git a/pitfall/pitfall/test/test0.rkt b/pitfall/pitfall/test/test0.rkt index 100f481e..8e24c70b 100644 --- a/pitfall/pitfall/test/test0.rkt +++ b/pitfall/pitfall/test/test0.rkt @@ -7,4 +7,4 @@ (send doc pipe (open-output-file this #:exists 'replace)) (send doc end))) -;(check-copy-equal? this) \ No newline at end of file +(check-copy-equal? this) \ No newline at end of file diff --git a/pitfall/pitfall/test/test0c.coffee b/pitfall/pitfall/test/test0c.coffee new file mode 100644 index 00000000..8b03a710 --- /dev/null +++ b/pitfall/pitfall/test/test0c.coffee @@ -0,0 +1,10 @@ +PDFDocument = require 'pdfkit' +fs = require 'fs' + +# Create a new PDFDocument +# uncompressed obj order: 5 4 3 6 2 1 +# compressed obj order: 5 4 6 2 1 3 +doc = new PDFDocument({compress: yes}) +doc.pipe(fs.createWriteStream('test0c.pdf')) + +doc.end() \ No newline at end of file diff --git a/pitfall/pitfall/test/test0c.pdf b/pitfall/pitfall/test/test0c.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ea9f7a6a2354fcf564edc23e1ba502152fe1dc6a GIT binary patch literal 693 zcmZWn%T59@6g4q!`VS^|L!t|9JL5bsh6NxAQ6m{xi7YB}!7(s3osytm;Rm?%Z~Q2| z9T-5li)ng#=k%O&TkEwuXY$-HRt@YX+u`NaTmm*z^(ZC5&++_BYv=~%Y?;)Aa+sY!Gv@bm&BN510)&nWR zhtnNyZ-;voLrYmT(^Hqkl>DrM*otxc%Fi~p!bP%hxiNl|r3DOKzR9i&msIuRE#_1E z44%(;C!1Na!#gt)+s3g@(a9?;xtg=(r#}z}%~1D6-3o`Md`vMlVX&{$Z@5@DL6ov+=fHJ zIQ@mJZcOHO9 z<=5xt`@D29ID4|Pb`d*)^#Xf9sYa@_M~qPE-MFoW+zEDJVI%xjHHQ0k_@FG zbfi_Z3Q5c#_-KMxsA2ud_Fiu-3xpAgS`=Egqu94Rlu-sVJFhXB9H^BYRnhINkhsvh+&Uay%yxhkRC9W3F`c= m4boVF_1xYxr3_ea=zAhRkYtl*nGxFLeN>xuRxaN@^w}@%@Vs~c literal 0 HcmV?d00001 diff --git a/pitfall/pitfall/test/test0crkt.pdf b/pitfall/pitfall/test/test0crkt.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b41c79cab83b5ef8c230c6b29b40d2308dd45157 GIT binary patch literal 701 zcmZWnOHRWu5UqsR_zp<3sZD6-3o`Md`vMlVX&{$Z@5@DL6ov+=fHJ zIQ@mJZcOHO9 z<=5xt`@D29ID4|Pb`d*)^#Xf9sYa@_M~qPE-MFoW+zEDJVI%xjHHQ0k_@FG zbfi_Z3Q5c#_-KMxsA2ud_Fiu-3xpAgS`=Egqu94Rlu-sVJFhXB9H^BYRnhINkhsvh+&Uay%yxhkRC9W3F`c= m4boVF_1xYxr3_ea=zAhRkYtl*nGxFLeN>xuRxaN@^w}@%@Vs~c literal 0 HcmV?d00001 diff --git a/pitfall/pitfall/test/test1.pdf b/pitfall/pitfall/test/test1.pdf index d0d18255..f05b02e9 100644 --- a/pitfall/pitfall/test/test1.pdf +++ b/pitfall/pitfall/test/test1.pdf @@ -1,5 +1,11 @@ %PDF-1.3 % +6 0 obj +<< +/Type /ExtGState +/ca 1 +>> +endobj 5 0 obj << /Type /Page @@ -12,28 +18,16 @@ endobj 4 0 obj << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/ExtGState << +/Gs1 6 0 R >> -endobj -3 0 obj -<< -/Length 90 >> -stream -1 0 0 -1 0 792 cm -0 20 m -100 160 l -130 200 150 120 v -190 -40 200 200 300 150 c -400 90 l -S - -endstream endobj -6 0 obj +7 0 obj << /Producer (PDFKit) /Creator (PDFKit) -/CreationDate (D:20170515171502Z) +/CreationDate (D:20170518183426Z) >> endobj 2 0 obj @@ -49,21 +43,34 @@ endobj /Kids [5 0 R] >> endobj +3 0 obj +<< +/Length 151 +/Filter /FlateDecode +>> +stream +x]] +0@Z + +@-@&C2 #Įp3}It`MNWnDpj$NPss&d%^.j*sS${i<>+|Yz71<ަ|caaE= +endstream +endobj xref -0 7 +0 8 0000000000 65535 f -0000000467 00000 n -0000000418 00000 n -0000000186 00000 n -0000000119 00000 n +0000000399 00000 n +0000000350 00000 n +0000000456 00000 n +0000000163 00000 n +0000000059 00000 n 0000000015 00000 n -0000000326 00000 n +0000000258 00000 n trailer << -/Size 7 +/Size 8 /Root 2 0 R -/Info 6 0 R +/Info 7 0 R >> startxref -524 +679 %%EOF diff --git a/pitfall/pitfall/test/test1c.coffee b/pitfall/pitfall/test/test1c.coffee new file mode 100644 index 00000000..54405e4b --- /dev/null +++ b/pitfall/pitfall/test/test1c.coffee @@ -0,0 +1,18 @@ +PDFDocument = require 'pdfkit' +fs = require 'fs' + +# Create a new PDFDocument +doc = new PDFDocument({compress: no}) +doc.pipe(fs.createWriteStream('test1c.pdf')) + +# Draw a triangle and a circle +doc.save() + .moveTo(100, 150) + .lineTo(100, 250) + .lineTo(200, 250) + .fill("#FF3300") + +doc.circle(280, 200, 50) + .fill("#6600FF") + +doc.end() \ No newline at end of file diff --git a/pitfall/pitfall/test/test1c.pdf b/pitfall/pitfall/test/test1c.pdf new file mode 100644 index 00000000..e9008427 --- /dev/null +++ b/pitfall/pitfall/test/test1c.pdf @@ -0,0 +1,76 @@ +%PDF-1.3 +% +6 0 obj +<< +/Type /ExtGState +/ca 1 +>> +endobj +5 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [0 0 612 792] +/Contents 3 0 R +/Resources 4 0 R +>> +endobj +4 0 obj +<< +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/ExtGState << +/Gs1 6 0 R +>> +>> +endobj +7 0 obj +<< +/Producer (PDFKit) +/Creator (PDFKit) +/CreationDate (D:20170518193351Z) +>> +endobj +2 0 obj +<< +/Type /Catalog +/Pages 1 0 R +>> +endobj +1 0 obj +<< +/Type /Pages +/Count 1 +/Kids [5 0 R] +>> +endobj +3 0 obj +<< +/Length 151 +/Filter /FlateDecode +>> +stream +x]] +0@Z + +@-@&C2 #Įp3}It`MNWnDpj$NPss&d%^.j*sS${i<>+|Yz71<ަ|caaE= +endstream +endobj +xref +0 8 +0000000000 65535 f +0000000399 00000 n +0000000350 00000 n +0000000456 00000 n +0000000163 00000 n +0000000059 00000 n +0000000015 00000 n +0000000258 00000 n +trailer +<< +/Size 8 +/Root 2 0 R +/Info 7 0 R +>> +startxref +679 +%%EOF diff --git a/pitfall/pitfall/test/test1c.rkt b/pitfall/pitfall/test/test1c.rkt new file mode 100644 index 00000000..0d809fc7 --- /dev/null +++ b/pitfall/pitfall/test/test1c.rkt @@ -0,0 +1,22 @@ +#lang pitfall/pdftest +(define-runtime-path this "test1crkt.pdf") + +(check-true + (let ([doc (make-object PDFDocument (hash 'compress #t))]) + (send doc pipe (open-output-file this #:exists 'replace)) + + ;; Draw a triangle and a circle + (send* doc + [save] + [moveTo 100 150] + [lineTo 100 250] + [lineTo 200 250] + [fill "#FF3300"]) + + (send* doc + [circle 280 200 50] + [fill "#6600FF"]) + + (send doc end))) + +(check-copy-equal? this) \ No newline at end of file diff --git a/pitfall/pitfall/test/test1crkt copy.pdf b/pitfall/pitfall/test/test1crkt copy.pdf new file mode 100644 index 00000000..508dd601 --- /dev/null +++ b/pitfall/pitfall/test/test1crkt copy.pdf @@ -0,0 +1,76 @@ +%PDF-1.3 +% +6 0 obj +<< +/ca 1 +/Type /ExtGState +>> +endobj +5 0 obj +<< +/Parent 1 0 R +/Resources 4 0 R +/Contents 3 0 R +/MediaBox [0 0 612 792] +/Type /Page +>> +endobj +4 0 obj +<< +/ExtGState << +/Gs1 6 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +endobj +3 0 obj +<< +/Length 151 +/Filter /FlateDecode +>> +stream +x]] +0@Z + +@-@&C2 #Įp3}It`MNWnDpj$NPss&d%^.j*sS${i<>+|Yz71<ަ|caaE= +endstream +endobj +7 0 obj +<< +/CreationDate (D:19700101000000Z) +/Creator (PitfallKit) +/Producer (PitfallKit) +>> +endobj +2 0 obj +<< +/Pages 1 0 R +/Type /Catalog +>> +endobj +1 0 obj +<< +/Kids [5 0 R] +/Count 1 +/Type /Pages +>> +endobj +xref +0 8 +0000000000 65535 f +0000000630 00000 n +0000000581 00000 n +0000000258 00000 n +0000000163 00000 n +0000000059 00000 n +0000000015 00000 n +0000000481 00000 n +trailer +<< +/Info 7 0 R +/Root 2 0 R +/Size 8 +>> +startxref +687 +%%EOF diff --git a/pitfall/pitfall/test/test1crkt.pdf b/pitfall/pitfall/test/test1crkt.pdf new file mode 100644 index 00000000..508dd601 --- /dev/null +++ b/pitfall/pitfall/test/test1crkt.pdf @@ -0,0 +1,76 @@ +%PDF-1.3 +% +6 0 obj +<< +/ca 1 +/Type /ExtGState +>> +endobj +5 0 obj +<< +/Parent 1 0 R +/Resources 4 0 R +/Contents 3 0 R +/MediaBox [0 0 612 792] +/Type /Page +>> +endobj +4 0 obj +<< +/ExtGState << +/Gs1 6 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +endobj +3 0 obj +<< +/Length 151 +/Filter /FlateDecode +>> +stream +x]] +0@Z + +@-@&C2 #Įp3}It`MNWnDpj$NPss&d%^.j*sS${i<>+|Yz71<ަ|caaE= +endstream +endobj +7 0 obj +<< +/CreationDate (D:19700101000000Z) +/Creator (PitfallKit) +/Producer (PitfallKit) +>> +endobj +2 0 obj +<< +/Pages 1 0 R +/Type /Catalog +>> +endobj +1 0 obj +<< +/Kids [5 0 R] +/Count 1 +/Type /Pages +>> +endobj +xref +0 8 +0000000000 65535 f +0000000630 00000 n +0000000581 00000 n +0000000258 00000 n +0000000163 00000 n +0000000059 00000 n +0000000015 00000 n +0000000481 00000 n +trailer +<< +/Info 7 0 R +/Root 2 0 R +/Size 8 +>> +startxref +687 +%%EOF diff --git a/pitfall/pitfall/test/test2.rkt b/pitfall/pitfall/test/test2.rkt index 50dab79b..7325924c 100644 --- a/pitfall/pitfall/test/test2.rkt +++ b/pitfall/pitfall/test/test2.rkt @@ -2,7 +2,7 @@ (define-runtime-path this "test2rkt.pdf") (check-true - (let ([doc (new PDFDocument)]) + (let ([doc (make-object PDFDocument (hash 'compress #f))]) (send doc pipe (open-output-file this #:exists 'replace)) ;; curved path as bezier diff --git a/pitfall/pitfall/test/test2c.rkt b/pitfall/pitfall/test/test2c.rkt new file mode 100644 index 00000000..61f7fab0 --- /dev/null +++ b/pitfall/pitfall/test/test2c.rkt @@ -0,0 +1,77 @@ +#lang pitfall/pdftest +(define-runtime-path this "test2crkt.pdf") + +(check-true + (let ([doc (make-object PDFDocument (hash 'compress #t))]) + (send doc pipe (open-output-file this #:exists 'replace)) + + ;; curved path as bezier + (send* doc + [moveTo 0 20] + [lineTo 100 160] + [quadraticCurveTo 130 200 150 120] + [bezierCurveTo 190 -40 200 200 300 150] + [lineTo 400 90] + [stroke]) + + (send* doc [translate 0 200]) + + ;; triangle + (send* doc + [polygon '(100 0) '(50 100) '(150 100)] + [stroke]) + + ;; dashed circle + (send* doc + [save] + [translate 200 0] + [circle 100 50 50] + [dash 5 (hash 'space 10)] + [stroke] + [restore]) + + ;; filled circle + (send* doc + [save] + [translate 400 0] + [circle 100 50 50] + [lineWidth 3] + [fillOpacity 0.8] + [fillAndStroke "red" "#900"] + [restore]) + + (send* doc [translate 0 200]) + + ;; these examples are easier to see with a large line width + (send* doc [lineWidth 25]) + + ;; line cap settings + (send* doc [lineCap 'butt] + [moveTo 50 20] + [lineTo 100 20] + [stroke] + [lineCap 'round] + [moveTo 150 20] + [lineTo 200 20] + [stroke]) + + ;; square line cap shown with a circle instead of a line so you can see it + (send* doc [lineCap 'square] + [moveTo 250 20] + [circle 275 30 15] + [stroke]) + + ;; line join settings + (send* doc [lineJoin 'miter] + [rect 50 100 50 50] + [stroke] + [lineJoin 'round] + [rect 150 100 50 50] + [stroke] + [lineJoin 'bevel] + [rect 250 100 50 50] + [stroke]) + + (send doc end))) + +(check-copy-equal? this) \ No newline at end of file diff --git a/pitfall/pitfall/test/test2crkt copy.pdf b/pitfall/pitfall/test/test2crkt copy.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b94236de0c31c48d7c2d61223c97c035ab44a71b GIT binary patch literal 1243 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 literal 0 HcmV?d00001 diff --git a/pitfall/pitfall/test/test4crkt.pdf b/pitfall/pitfall/test/test4crkt.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dad42ba2784ea6202e45006b975443e50d725a85 GIT binary patch literal 2818 zcmb_eTWB0r7`DWgI#du*EEM&BXlRVYnKOHxZ3uODvox0`Yc49;hB&)>cAa!~rkOd3 zn>0zO{SrC(|g$)9TLOp`mgKcxv%3vG(B_L)R zgs$7*E4}Z+Sxt?aMMy~$2qGCmiaaQYedBvEP+@s2w6qA=$TIm%hRc(nf`AbwkPlF} zBrOpJDuFX6f`FJvszkyM?z#*?2cwIK>CM&=0lPP3C(XxB?;qN8{g;79&mTTHKl!CSUhLoh z<5=VKhk_G-eN*h}-ulrOUmZO*ck%Y!XHO+BF4fHp&YYQQ-yy$}dg9toWZU$|-^O>( z)J<#KZ)}|HXlOjY$$0&94Cq5k+Iv3b^WKaL&3wiju zvE#9b@^9oyY@+kP-&eQp`ryB=srg&)x4fG?a`xPY+2KDn9!lLq2R=Oh_T=JJ`#;Lb zYX@(9_uKB=z8}Qz-}rg%k)y*_-Nba~missNZGLe7t@W4Ioj&|rBg+@ZB~IqZEEQab z#;CK1W*TwoLuiOckP?z4M1TAmctH^P4%32$q(*Y8u6JmJqBNG-(F}Ee1-z1;JONyi zsA^-LqvC+NHy788d|D;8AhsGbX!H%l*EHj0!`56t5PL_{gr_}Ae&p5w6H=BLJiomp zJFz~7iI!2Dy3@KgGK#BbVin;fiqU%3u+t%%;b(-` zo)SkJQFSd-1CsKtwbD?QgI=rDWha~0mP(r1MQ824vQmq+@*W!mT&vh1VY@>~X|{-| zG)iW^ytS5n(4l2*Nbv!IP9wAm*i7TLWG=1j!=i!)3h0QZ*f0d|GWYawhQM jfDNmrNx&H&d$kG70!mMJo2VAyA(nke5$fw(yA#6yG96V9 literal 0 HcmV?d00001 diff --git a/pitfall/pitfall/test/test5c.rkt b/pitfall/pitfall/test/test5c.rkt new file mode 100644 index 00000000..3428c4ad --- /dev/null +++ b/pitfall/pitfall/test/test5c.rkt @@ -0,0 +1,20 @@ +#lang pitfall/pdftest +(define-runtime-path this "test5crkt.pdf") + +(check-true + (let ([doc (make-object PDFDocument (hash 'compress #t))]) + (send doc pipe (open-output-file this #:exists 'replace)) + + ;; # Set the font, draw some text, and embed an image +(send* doc + [font "Times-Italic"] + [fontSize 25] + [text "Some text with an embedded font!" 100 100 (hash 'lineBreak #f)] + [image "assets/test.png" 100 160 (hash 'width 412)] + [image "assets/test.jpeg" 190 400 (hash 'height 300)] + ) + + + (send doc end))) + +;(check-copy-equal? this) \ No newline at end of file diff --git a/pitfall/pitfall/test/test5crkt.pdf b/pitfall/pitfall/test/test5crkt.pdf new file mode 100644 index 00000000..e69de29b