UNPKG

camedit

Version:

Small JS image editor wrapped around cropperjs

350 lines (244 loc) 146 kB
/** |-------------------------------------------------------------------------- | Camedit Editor |-------------------------------------------------------------------------- | | A basic vanilla Javascript image editor. It is a wrapper around the | [cropperjs](https://github.com/fengyuanchen/cropperjs) library of | [fengyuanchen](https://github.com/fengyuanchen). | | This project was initiated by | * [R.J. Design Management](https://www.rjdesignmanagement.ch) | | and developed by | * [Christopher Christensen](https://github.com/christopherchristensen) | | @author Christopher J. Christensen | @version 1.0.0 | | @param EditorID | @param defaultSettings (optional) | **/ import Cropper from 'cropperjs'; import * as blobUtil from 'blob-util'; import ImageFilters from 'canvas-filters'; export default class { /** * Constructor of the Editor. * * By omitting the defaultSettings parameter the * constructor will register the regular events * of the object (such as click on close button, * etc.) * * @param EditorID * @param defaultSettings * */ constructor (EditorID, defaultSettings = true) { this.editorElement = document.querySelector(EditorID); this.onAfterSaveCallback = (image) => {}; this.imageElement = ""; this.cropper = ""; this.options = { saveType: 'dataurl', saveFormat: 'png', imageQuality: 1.0 }; if (!this.editorElement) { return console.error(`[ Camedit ] Couldn't find editor in DOM with matching id: ${EditorID}`); } // Create DOM elements this.buildEditor(); // Register events if (defaultSettings) { this.registerCloseClick(); this.registerResetClick(); this.registerSaveClick(); } this.registerFilterChange(); this.registerRotateClick(); this.hasBeenEdited = false; } /** * Retrieve relevant data from the editor. * * @return object * */ get data () { return { 'dataset': { 'brightness': this.elements.sourceImage.dataset['brightness'], 'contrast': this.elements.sourceImage.dataset['contrast'], 'saturation': this.elements.sourceImage.dataset['saturation'], 'rotation': this.elements.sourceImage.dataset['rotation'], 'width': this.elements.sourceImage.dataset['width'], 'height': this.elements.sourceImage.dataset['height'], 'top': this.elements.sourceImage.dataset['top'], 'left': this.elements.sourceImage.dataset['left'] }, 'input': { 'brightness': (() => { let input = this.elements.brightnessInput; if (!input) { return undefined; } return (parseInt(input.value) + 100); })(), 'contrast': (() => { let input = this.elements.contrastInput; if (!input) { return undefined; } return (parseInt(input.value) + 100); })(), 'saturation': (() => { let input = this.elements.saturationInput; if (!input) { return undefined; } return (parseInt(input.value) + 100); })() } } } /** * Retrieve relevant DOM elements from the editor. * * @return object * */ get elements () { return { 'brightnessInput': this.editorElement.querySelector('#camedit-brightness'), 'closeButton': this.editorElement.querySelector('.close'), 'contrastInput': this.editorElement.querySelector('#camedit-contrast'), 'cropperContainer': this.editorElement.querySelector('.cropper-container'), 'cropperViewBox': this.editorElement.querySelector('.cropper-view-box'), 'cropperBackgroundImage': this.editorElement.querySelector('.cropper-hide'), 'cropperBoxImage': (() => { let cropperViewBox = this.editorElement.querySelector('.cropper-view-box'); if (!cropperViewBox) { return undefined; } return cropperViewBox.getElementsByTagName('IMG')[0]; })(), 'tempHiddenImage': this.editorElement.querySelector('.camedit-image'), 'editor': this.editorElement, 'sourceImage': this.imageElement, 'imageView': this.editorElement.querySelector('.image-view'), 'loadingGIF': this.editorElement.querySelector('.loading-view'), 'resetButton': this.editorElement.querySelector('button[name="reset"]'), 'rotationButtons': this.editorElement.querySelectorAll('.rotate'), 'saturationInput': this.editorElement.querySelector('#camedit-saturation'), 'saveButton': this.editorElement.querySelector('button[name="save"]') } } /** * Retrieve relevant values from editor * * @return object * */ get values () { return { 'imageSource': (this.imageElement) ? this.imageElement.src : undefined, 'originalImageSource': (this.imageElement) ? this.imageElement.dataset['originalSrc'] : undefined } } /** * Adds given image as DOM elements to the editor. * * In the process the image object gets cloned, so * there is no reference between the given image * and the returned image. * * @param image (DOM element of type IMG) * * @return newImage ( * */ appendImageToEditor (image) { let newImage; // Append here this.elements.imageView.appendChild(image); // Add Camedit specific class as reference image.classList.add('camedit-image'); newImage = this.elements.editor.querySelector('.camedit-image'); if (this.hasBeenEdited) { newImage.src = image.dataset['originalSrc']; } return newImage; } /** * Apply contrast to image data **/ applyContrast (imgData, contrast){ let data = imgData.data; contrast = (contrast/100) + 1; //convert to decimal & shift range: [0..2] let intercept = 128 * (1 - contrast); for(let i = 0; i < data.length; i += 4){ //r,g,b,a data[i] = data[i] * contrast + intercept; data[i+1] = data[i+1] * contrast + intercept; data[i+2] = data[i+2] * contrast + intercept; } return imgData; } /** * Apply filters to the cropper box canvas before saving. * * This method is asynchronous since it is necessary to * wait for the image to load properly before it can be * returned with applied filters. For this it uses * Promises and the image is returned as the resolve * parameter. * * @param canvas * * @return Promise * */ async applyFiltersToCanvas (canvas) { let context = canvas.getContext('2d'); let tmpImage = new Image(); let brightness = this.elements.sourceImage.dataset['brightness'] - 100; let contrast = this.elements.sourceImage.dataset['contrast'] - 100; let saturate = this.elements.sourceImage.dataset['saturation'] - 100; let imageData = context.getImageData(0, 0, canvas.width, canvas.height); let filtered; filtered = ImageFilters.Brightness(imageData, brightness); filtered = this.applyContrast(filtered, contrast); filtered = ImageFilters.HSLAdjustment(filtered, 0, saturate, 0); context.putImageData(filtered, 0, 0); context.drawImage(canvas, 0, 0, canvas.width, canvas.height); return new Promise(resolve => { switch (this.options.saveType) { case 'binary': blobUtil.canvasToBlob(canvas, `image/${ this.options.saveFormat }`) .then((blob) => { blobUtil.blobToBinaryString(blob).then((binary) => { tmpImage.onload = () => { resolve([binary, tmpImage]); }; tmpImage.src = canvas.toDataURL(`image/${ this.options.saveFormat }`); }); }); break; case 'blob': blobUtil.canvasToBlob(canvas, `image/${ this.options.saveFormat }`) .then((blob) => { tmpImage.onload = () => { resolve(tmpImage); }; tmpImage.src = blobUtil.createObjectURL(blob); }); break; default: tmpImage.onload = () => { resolve(tmpImage); }; tmpImage.src = canvas.toDataURL(`image/${ this.options.saveFormat }`); break; } }); } /** * Add required DOM elements into the editor's container. * * This method overwrites the existing elements in it's * container. It is used maily on initiation of the * object. * * @return void * */ buildEditor () { this.editorElement.innerHTML = ` <div class="loading-view"><img src="data:image/gif;base64,R0lGODlhyADIAPcAAAAAANbW1v39/f39/f39/f39/f39/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAwAfACwAAAAAyADIAAAI/gA/CBxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZs2jTql3Ltq3bt3Djyp1Lt67du3jz6t3Lt6/fv4ADCx5MuLDhw4gTK17MuLHjx5AjS55MubLly5gza97MubPnz6BDix5NurTp06hTq17NurXr17Bjy55Nu7bt27hz697Nu7fv38CDCx9OvLjx48iTK1/OvLnz59CjS59Ovbr169iza1d7gGX3zN+3/osnGL5yeZXnJ6dHuT5y+5PvG8c3OX9xfZL3E+cfub9wf5H/DRYgSAcM+FeBMyH4mIIyGdgXgzEV6GBeEtIEIWMXwlShfRlG6NiEIUkI4lwi4tShgCOGuKFhJZp4ImAr3tSify82GCOMN7pIY4r01YhXjjmJyKNZQgIFJIU+ypgkXUfqVOReTwYV5V1TGlkliVf+JOSQW22JVJZtgSmlmGt5+eWMcJmpFJpusZmUmmWSSdSWS3ZFJ5cJ0onWnVHxWZaffeo5FqBTwQmWoYUK6hWhVd2Jp5aMWuWoVpPaqWijl3JVKVWbLuroozZ2+tWnoL5E6p+fMnXqWasa1eqeYq9amWqYse5EaqmB3urkrbhKxWuTK/1aJ6y/aigsksIOm1GywGLJbKnPKitXtIgyRK2cUF6rLbWKbestrwt+K660KI57LXjmHvtZupmOZq5syY4n77z01mvvvfjmq+++BgUEACH5BAkDAB8ALAAAAADIAMgAhwAAAN3d3f39/f39/f39/f39/f39/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AD8IHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNr3sy5s+fPoEOLHk26tOnTqFOrXs26tevXsGPLnk27tu3buHPr3s27t+/fwIMLH068uPHjyJMrr3tgufPn0KNLP93cePXi14lnH75dePfgB77+Axf/m3zv8MfRYzfPOzz73e/hx8/tfn36+bfd47etfv3+2v1xFyB4AxL4H236+addggIWWJ6DhB14kn4S2lWhSfUhdmFJFG4Yl4ccZhghTx2O6BOFg4GIYYmAqYgSg39BmBOKMQrVoYtj4ZjSjXqJGBSPeME4FI0W+jgki3MZSdSNOmKlZFFIwvXkkkxKOSWUUa51pVFMNumUkE11mRaRUFVpVpZfmpkjmVGJuaaMabr5FZtTdeklUEBmZSdXdF5l55065cnnnlWhudWfgM4k6JyIJtqSmmQhyhSkkTaKlJxnNQrnjJSqpamjHRFqpaaBYjrqp6BGZGmRqKaq0KpEebUKpkifxijrrBm1muKtnTLEq6ti/Srsr4oNa6ykjx2r7JbFLktsZs7WClq0ho52LG69Tqftttx26+234IYr7riJBQQAIfkECQMAIAAsAAAAAMgAyACHAAAA29vb/f39/f39/f39/f39/f39/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CP4AQQgcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gw4odS7as2bNo06pdy7at27dw48qdS7eu3bt48+rdy7ev37+AAwseTLiw4cOIEytezLix48eQI0ueTLmy5cuYM2vezLmz58+gQ4seTbq06dOoU6tezbq169ewY8ueTbu27du4c+vezfIA79/AP/oOfnA48YLGjw9MrhwEc+XPj0cnPj149d8HrvPO3ny59t3cu/47/647fHfzzdFDJ59bvXT2uN1Tlw88O/zb9Ovft50fe3/w/5UXYHsDErgfbfaJl+B5C65XIH4P8hdhbfYdKFuFCjb43oSzYZiehw5aGFuFIr5GIoMaWgfihhyOeCKLLcJGYomtzfjhivq9OB+O/umooo858gigjTsKSReNL80YY1lIwqRkk19B6aSSRQL5lpQxPYnlVVtm+SRcXcqkpVthijnmWmXOpGWaSS3505pnuQnUmmwOJWdQdIp1p1B5epUil3By9SdWdNaJ06BZFQqooXMqOhWiXRW6501GRilpU1aOJemkSVZK1qaMhkRkW6CGytGoYJbKE5VHlmpqRElf4uUqpxadqdeskIoUqF+4epqRo4L1impFoCIm7LG4NobssrY+xuyzmD2brGfS9klatbRW5qp43Hbr7bfghivuuOSWa+65OAUEACH5BAkDACAALAAAAADIAMgAhwAAANbW1v39/f39/f39/f39/f39/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AEEIHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNr3sy5s+fPoEOLHk26tOnTqFP7PKC6dU7WrjXCjn1xNm2Ltm9TzK07Iu/eEH8Ddyh8+MIDxY0nTK4cIfPmBp9DH4h8OnHp1rFnt96wOvfj2qH+e/++PHzz8eSjo09PELl54+vZU38Pn/7w+PJB4Je/n737/O39B6BA7tmnW4EDEijggAgm2CCDCwL4IIQGHhhhfhNieCF/G/rXYXoZcvjhdwVWGFuJCeoXIogrkocihf1xV6KJrr0oYYsk2ijiiDLq6CGO2fn4I4/TzQgjkeIJ6aKRGiqZo5NBQhklkEkyuSOSys0YY5VSnqfljVay+OWVVGapJY2nnYlmmmeSWeZ9arqJJXBqrllanUOOuWScYvL5pJ9i2clTnVtiJWhPhB4KWqJ9AnqVokIlCqlOk0YqaVWFZnVpVJluJWmlLnXK1aegpiTqV6QedWpYpJYK0pxSZrX6E6xotboqSm+6ZeutIXVJ1668yubrXcAGO5GehBWb60N4KqasowfJCtmz1CI7WbXPeobtp6ZtS6to3KYo7rjklmvuueimq+667Lbrrk8BAQAh+QQJAwAgACwAAAAAyADIAIcAAADR0dH9/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8I/gBBCBxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZs2jTql3Ltq3bt3Djyp1Lt67du3jz6t3Lt6/fv4ADCx5MuLDhw4gTK17MuLHjx5AjS55MeeGByjEvY94MVjNnlp4/qwwtOiXp0iZPoy6perXI1q5BHoAd2yPt2hxn42a9m6Tu3q+Bv74t3OLv4h2PI89NfHlE5c4zQo9+cTp1itavT8yuHeLs5t0V/n4Pbxw8+YPjz2/nrl48+/YI38M3mH6+w/r2GeLPn/C7+fn+8afffgLSJ5+ABBZYUIIKChRgg+gx2OCDEC4ooYIUVjhQhhqCwKGGH0Lo33/tjdjhhiFOmCKGKxZo4okevtjhiCSeRyOMN56Yo44tIigjiD9WuCOQPeY3pJBHqhikiEsqeSF/NNYYXpQ4NsmilT5iCSWVMyZ5ZZEAckkkmPBFKaV2ZvLoZZZa2mfmmdelOWabYYrpJJ1lysmknXeSaeObc/r5J58uAoqknl8SuiWiieKp3ptwOgdppMtNeiijbCpqJKSXauqmpX2uWaehjYqaJ6iFopopqat6WuKkWgdOCSulwM0aK5q2pjorULSGZeutLfVK1q/ApibsWcQWK9uxaiWrLEaC6uXsk+VRO9i0jvZn6mLYduuqZN46K1y43yKXK4zopqvuuuy26+678MYr77z01itVQAAh+QQJAwAgACwAAAAAyADIAIcAAADHx8f9/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8I/gBBCBxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZs2jTql3Ltq3bt3Djyp1Lt67du3jz6t3Lt6/fv4ADCx4s8ABhoYYPA02s2CfjxjwfQ9YpeTLOypZtHsCceebmzjk/g74perRm06Q5o25ZenXM1q5fblYdOyXs2ixv41Y5e7ds2r5J9g6+cjhx3rqPjzSu/CTz5sKTQ/84G/j0jc+vg6yuPbr17he5/oMPKX68x/LmO6JPjz07+/Du31tcL38+/foU7+OfqH8/xOrf+acQgALaJ12BDBGIIH/9LThggw4ipGCEDk1IYUMWXrhQhhomxGGHB30IIkEABnhhiSM+CCGIKKYooYgutuiiQTLOOFCJJkaIo40F7cjjjTXy6OOPIAz5o5FCBmkjkksqOSOTTzoZJYwjQhmjlClamSWWVXLJopZfetkhmGFSOSaZGuKY44JqElkYmifCSWGbbtJ5pJw62pmkmHHiyaaeTfI5J6BTmpkmoVv6+aeiBap54KGMNopol5EK6CiRjq4paaX+XXrnpGUK6qCne3KKX6aYkhqoqfWh+imrX/K5Wqqoi8L6nqyr0opgppp2iuuVqgIbbKKgQjospcX2eWyotqbHa6+nPjtrsnny+uqyxv6KrLW5anvmsyuGGO5u4JZrqHnmQuvmuuy26+678MYr77z01mvvvfjmO1VAACH5BAkDACAALAAAAADIAMgAhwAAALe3t/39/f39/f39/f39/f39/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AEEIHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt2TB+46PZBXL9O+fpXyDbwUMOGjgw8jTay4KF/DjYU+juwYMmWgjC8Hzaz5J+fOPT+D1jl5tM/Spnk+tpz6JurWOV/Ddi169szVtnHizm1zN2+avn/fli38ZfDixokjb3l8OcvmzlWuZh0dL/Tq1pVjLzl9+/Pr3kX+dg+fcjx5k+bPcwevvuN06u3ds4+v8T39kenve7SvHyT//vvNByBF/w24UYEGZoRgghYtyGBFDj44UYQSQvQefBU6RGGGGubHYUQbfqjQhSJOGGKJB5GIooUerjjiiS4OpGKMDM1I44st3liQjTqmCCONPPa4448xBimkjESueCGGOi55pI9Joujkk0NGWeKUVCJp5ZVbiohlliB8maWYVJL5pJlHoimkmj0uyeSNbDZpZJpzrhknnHW2maecewJ5p59dcugmmAINSmiYfQIaaIWGEvpnkY+6GKmSk0qZKKSXSpoppZtauiijlXLZqag52jmql6d+2CiYq44ZKqpon0rYapmvqlqroLdmmKuuqdoaq6y94vrrg7OeuSuwwYKarLKlmjpsgsUa+yy0xyLbrLMC4jkttdsaWK212fJ5rZ7derssr+WaOy6d6ar7rbDtHirvvPTWa++9+Oar77789uvvvwBfFRAAIfkECQMAIAAsAAAAAMgAyACHAAAAwMDA/f39/f39/f39/f39/f39/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CP4AQQgcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gw4odS7as2bNoJR44kFbr2rZZ38K9upbtXKt17+LNq3cq375S/wKGWtfuYKeF5R5umngx4saOmRaOzBgyZaWWLxtNrFhz0cyeN08O/Zkz6dKgT//kbFg1UNauhcKOHTQ17Z2mb6/OrZsn69a9c84Ojts2cZq8j+P8rXz58OY1k0OPLn06TObWZz7PHnM7d5fev/63xC7+ZfXyKsmjZ6l+fcr27lGGj18SPv365++P/A1cP8n5/n1kX4AhAUhgRwYeyFGCCmY0YIMbPQihg/lNSCGDFk4kYYYVYcihWhV+SNGGIkZEYokPnYhiQx6uuJCKLirEX4wWwUjjQTbeWFCOOg7EY48gtAikj0IOGWSRQ/7Yo5I6MnmjkzRCGaOULlK5opUoYlmiliJy+aGXHIIZJpJAimmhmROi2SB//RmZkJprklmmnE/CqeCMbrJIZ5Mh5rnjnlHaSaCgBxIaIJ5+yghooH0meuSiVTaaKKKOvimpn5RWalCmmhIJ6ZWfZmnooaF2Oap/p96XKn2cdipQq3+drsqqrPHRul6pW9p666WT8ponrrn6aiSssepaHrGaIlupso4y2yuwphrn6qOCTUuQscdCG2211r6q7ZjSuvrtl+FOW664o3WLY7rq/sluu562Ce+78HrbWb3x4uuuvPXSq6+///Kr78AEF2zwwQgnrPDCDDfs8MMQRywxUQEBACH5BAkDAB8ALAAAAADIAMgAhwAAAMjIyP39/f39/f39/f39/f39/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AD8IHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUvW5IGzZ8tiRZtW7Vq2bt/CjWuVbVu6VO0ewFtVL9++dv/mDSw4qt67hZ0e3pv4qd/Gjh9DZnp4smLJlpEuZpxZ8+LOSTeDPip6tNHSpomiTi10NWugrl/7jC2bJ+3aOm/jxql7t83evmkCDy5zM2fivIcjd2l8ee7KznMqj76yOfWa1q9jh65dOPfuxb/+g4eZfTzzz+bDY07Psjz76ujft58u/yP9+h3v488vfn9J/f5pBGCAFsVHoFn9HSiSgQoumGCDHrkHoX0PTrgRgxbyh2GGF1bI4UUDfsjQhiKCGGKJCZGIYkUqrihRiy5GBGOMD81IY0M23rhQjjqm6GGPI/4IpI/rDVmjkEYexGOSAy3J5AdOMhllklMaWeWQVwKZZY9b6till0U+uWOYYhI5V5k4kommQUiu+SWNb8YYp5xqrknQnCu2iaaeZeKZZ512QsmnmIMSSligZp6JqJKFSnnoomw2SiWggUo66aOQFmSplpQi2qmbm3KKaaZNjkqqQJ/uGaqoaJ0aqal7ma7KZap90lorrKTa+qSuhuIKqaxgturqq4gNK6iviwJ7I6+7Ipuss55CW6m0djLrqKLGWnvtccYeK2y3pRabLbbjilvut+B6m2643HZLLrjopmsuvO3KWy+962qa77789uvvvwAHLPDABBds8MEIJ6zwwgw37PDDrgYEACH5BAkDAB8ALAAAAADIAMgAhwAAAKioqP39/f39/f39/f39/f39/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AD8IHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKRXmgrNmzZsdCRcu2rduyaoe+RRs36ly4daXezTt1L1+9b/8Cdit4cNvCdgMjfjp3MWPFjpk2jix5MmWlli8nhawZaebORj+Dlst5NFHRpoOiTv1zNeuerl/vjC07J+3aN2/jrql798zevmMCD/5yOHGXpY/jTK7cJvPmNI1DT/l8unDC1nNXz44cO/fo3r/+/w4vHub28tTPoz+pfn3J9u5Jwo8vkjx9lfPvf7Svnz3//u8dBiB+/w1Yn4AGkoVgggEuyOBIBT7oUYQSbpRfhRRRiGFGGm54UYceVgRiiBKNSGJEJp74UIoqNsRiiws5COOHMs4oYo02TvRijgbtyCNBPv4oEI5CrshWkRYRiSRDSi6pUJNOIgRllD0eSSVEU145UJZafsClll9eGSaVY0ZZppNnoklXlw5ZySaTa74ZY5xyJuRmnVLSiedBd+5ZUJ9+bqlnoEMOSqiXZx1aZVqKAmlooIAe+iikiTYqaKWWIspoppNSilemmn5qaad+YsqpqaNueqqqqYra6gFtoF4Ka6yovhprobPSymqrt4baa62N7hqssIoSW6yrq/aKqLLGSoosr7/meuuzqSq7LLPS6mottcNumy2o3AZrrZfjfktrueOmS6667Lbr7rvwxivvvPTWa++9+Oar77789uvvvwAHLPDABLcYEAAh+QQJAwAfACwAAAAAyADIAIcAAACzs7P9/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8I/gA/CBxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDig15oKzZs2jTmh17VK3bt3APsO0ZNy5DuHNp1lWrEW3elnvPkhT8d3BguSvXFvZ4eCbixRcbQ2YqebLSwJab7s1MuS7npZs/X/YsGmno0m3tojaterVR0q6Jwo49dDbtoLZv/2ytGzfe3kJ5A/cpfDjP4sZ1Ik+e8zdzum+fE48u/Tj16sqvY2+ufbtN596//ncPr9cteZzgzzs2r77m+PYv08OPz36+zPr2Yb7Pn5gvf/34/cdSgAKqtF+BJhGIIEoKLlhSgw4allaEBkJIIUgWXvhRhhp25F+HD34I4kgcjpiRiCaSNWGKIpXIYkUovujhijJuSGONM/qFI2M67shRjD5GdmOQGAFJJEVGHinRkErC2GOTFjEJ5ZJPTjmRlFY+hGWWDW3J5UJefplQmGIeVGWZXRKGppZqrpmmYm6+WVacDp1Jp5lt3omQnXoWxGefAv0JqKB9EqqnoYfCCSiecy66p6KOEpRnpIFCSmmljV460KSUctpppppi+lionkZq6aWnfjpqqB+kaiqobazCSqqsqNJa66qauvoqq5La+imvm/q6K7CVEtsqrrMaK+ywxCKbq7OoGhuotK1KC2201lJ7ranadkvtt+CGK+645JZr7rnopqvuuuy26+678MYr77z01mvvvfjmq+++/Pbr778AByzwwARDFBAAIfkECQMAIAAsAAAAAMgAyACHAAAA29vb/f39/f39/f39/f39/f39/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CP4AQQgcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gNx4YS7as2bNkwypFy7atW7VA3cqd2xbuTbp487K1+1Kv3Ilv+aL0a/bjXsEhCac1eRZxR8V9Fzu2SLhm2cmA9eqUjHmh5p8HOiv8LDS06IJ5kZoWnXrpasd4TzOlK9s17dpJb+NWPXd37r++eQcObrQ38eLAjxNNrnwo8+ZBn0MHPXx63OrWqR/Ofn07d5/Yv/7vDC9+c93yPcmjv+t9fc7z7s2jjc8TPn328++/z68ff+P+/l0GoE3tDShTgQZG9l+CMyHIIEsOPrhShBKmxF+FLlGIIWMLbtjShR6qBGKIFnZIYokCniiiiSpyWFiLKHIGo4syzkgSizYm9mKOJeHIo2E7/ihSkELqWGORHhGJ5GNKLilWk05mBGWUGE1JJWUpXvnkkVpiyWWXFGUJZpVfjimRmGZWhGaamY3FJpluvunla3KeWWadnt2JZ0Jr7slQn36OpmegqA1KKEGGHipQoooyeqijhEIaqKST0qlonpc+FGemf27KKZ+efopQqKIaRGqpiFqK6kCU+nnqqnEgvLqqrLPCOqqqtuIKq66z8oqqr6UCG6ytBwn7qbHHEmuqsssyy6qziEK7qLTTUmststZmq+223Hbr7bfghivuuOSWa+656Kar7rrstuvuu/DGK++89NZr77345qvvvvz26++/AAcs8MAEF2zwwfAGBAAh+QQJAwAmACwAAAAAyADIAIcAAADOzs79/f39/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8I/gBNCBxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtatXiQjCih1LtqzYr0zNql3LFq1QtnDjrnWrU67du2bpysTLt+9YvSz9Ch4M2OTgvxnlFg55mGTbxRsFB84L2aLfvWUrg+WLM7Nmhn15ev58kDNQxKQJ3jWK+jPepK0Xr04btrLdqLULK5561u1tq7m97sYafOtwrQi4xkWbPOty382rPtcbXSpc21QfY8c9l3R12mpT/nMPL/6p9vJNu6NPT349+NHul7aPr3Q+faTq7+OnrH8//P6s/QcgUfYNOBR/BhIoYIJBIchggws+6FOEEopGYYV1kYXhgRpueFqHHv50YYg2gUiihbGdmJOJKmbYW4suFgdjZynOWBOLNtKEY44z7chjTDX+COSLQvYYZJEtHYnkZDIu+ZKSTqYEZZQnEUmlS1ZeudKUWo7EZZeMZQlmlU2OSeZ3Zp6Z5pZlrullm26GiWacIolJJ0hw3ulRnnpyxGefGv0JKEaCDmrZnIZGhmiiiS3K6EWFPhpRpJJC5GilFF2KKVib+tlpZJ8GqmmooI1K6kKmnppQqqqW1mpFaay+qpqsmdLKqa2W4pqrrrzu2WtDsf4q7LDEFmvsscgmq+yyzDbr7LPQRivttNRWa+212Gar7bbcduvtt+CGK+645JZr7rnopqvuuuy26+678MYr77z01mvvvfjmq+++/Pbr778AB8xgQAAh+QQJAwAmACwAAAAAyADIAIcAAAC8vLz9/f39/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8I/gBNCBxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3K9SCCr2DDih2LoCtUsmjTpjVrVK3bt2TZ9oRLt+5YuTbt6t1bFu9LvoD5+lUZuLDgwSQNh6V4GLFHxR/rOt4YOOXbyRYB/1WLWaLevGs7M/ysE61ohZJ/mj5NMPXQu6xN0E0KuzPcpmJtuz272PFlqbnx/q7a2+xwq8W37lYOluvyrs2zchb+Fet0v9GJr0acHfj2ydW9/sc9Hf5paNblcY+PLbsv0+/s0yNdz761+6Pw6wu837a2/oL8vebffwD2FxyBCAWo2oEIekXUgA0apCBPEEZYIFAVWlhUhhq2tmB3HSY0IWgghrhhciaKSGGJKQrIYotBoQijUAzOSOOLNs4lY44+7cijjiP+WBqOQubkY5FGyofkTkcuSaKTH0LZY5BSzkRklTJdiSVMWm7ZUpdesgRmmIQpSWZMZp7JJZVqrpRmm2KyCSdKb85Zpp1ZyolnYnruKVKffoYEaKCREerSoIZyhGiiGdXJKEiOPvrYopJWRGmljGF60qWadurpp6CGKuqopJZq6qmopqrqqqy26uqrXbDGKuustNZq66245qrrrrz26uuvwAYr7LDEFmvsscgmq+yyzDbr7LPQRivttNRWa+212Gar7bbcduvtt+CGK+645JZr7rnopqvuuuy26+678MYr77z01mvvvZgGBAAh+QQJAwAmACwAAAAAyADIAIcAAADQ0ND9/f39/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8I/gBNCBxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izWkXAtavXr1qzfh1LtizXsEzNql1LFi1RtnDjgnW7U67du2fp0sTLl6/el30D+/2LUrDhvoRLHu4a8XBikIY9Dn6cEbHJu5QvYnYZN7PEzTLlenYoGifb0QpL9zyNmmBnoWtbD2RdVG1r2kjNesat1HZi3k3LEo5NVThd4lWNh9W9fK5W382db2Xutu1V5cO9Tpf+WPtU6pTH/krFnln8U/K7uSdFP9p8b+uyZ3t/Pz9+QcZL3dt3Xf+t/v384VebegDKl9eABxaYUIKwCahgagj45+CDB/W3GoEUBhghUBhmqCGHE3q44E8dingfgzlZaGKFKNpU4oon8hQijAjNuFeLNI6ok405spgijz0atOFNOAapY01AGimki0UqWSOTTkI0ZExJRllXk1beNxOWWf44ZZc+fQlmmGKOuWOZZpqGZppqsnmhm6vB+aacO9JZp50p4pmnnkTy6ed+a/7JUqCCqkRooYgmquiijDbq6KOQRirppJRWaumlmGaq6aacdurpp6CGKuqopJZq6qmopqrqqqy26uqrVLDGKuustNZq66245qrrrrz26uuvwAYr7LDEFmvsscgmq+yyzDbr7LPQRivttNRWa+212Gar7bbcduvtt+CGK+645JZr7rnopqvuuuy26+678FIYEAAh+QQJAwAeACwAAAAAyADIAIcAAADd3d39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8I/gA9CBxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izZjXAtavXr1qxfh1LtizXsE3Nql1LFu1QtnDjgnW7U67du2fp0sTLl6/el30D+/2bUrDhvoRJHo54uGtikIM5Gn688e5JxJQtxgVsN7NEuXs7e27INifo0QlL+zyNeuDat3BbC1R7NDZqs0tVU6ad9nXislJ10wVO1bdb4lWNa20bFvfyscedX2UeHXlxr7upT52bWTtU6J6l/jsFP9o6U/K3vSdF39o8Uu6yZ6s36jj+QfZF4dt3rZ9o//3y/QcUdgAihF9QeRWoEIH+GaAgafUJxeCDBk64WoQUVmhhXRhmqGGCq3no0IamgSjigiTa1OGJH/ZkIosorliTjDDe96KKNUJEo0w35qihTg76OOKOgAnJWJA4GvkQkSwhqeSQTsYU5ZML9UjlT1auNOWVqWXJJYdfSuhlmDcxSeaMW54JZJpq4jRmm1KyCSeac7pYJ09y3imlnnXxaZqfbgJapqCE7pdnoYUhOtOhijbq6KOQRirppJRWaumlmGaq6aacdurpp6CGKuqopJZq6qmopqrqqqy26uqrWbDGKuustNZq66245qrrrrz26uuvwAYr7LDEFmvsscgmq+yyzDbr7LPQRivttNRWa+212Gar7bbcduvtt+CGK+645JZr7rnopqvuuuy26+678MYr77z0ohYQACH5BAkDAB8ALAAAAADIAMgAhwAAAN/f3/39/f39/f39/f39/f39/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AD8IHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cr14YGvYMOKHXug61OyaNOmNVtUrdu3ZNn2hEu37li5Nu3q3VsW70u+gPn6VRm4sODBJA9LNBwWMci6Hxk71gg3ZeDJFt3+VYzZodq8djt7jqtTr+iEaIFCPk2Q9NDVp+8ipRu7MdPKmMVCfetYt1Tefm1XBW5WuFXiW41j1Zz8K1vmy53LhT5cevC11fsixj7V+mTuu7X+dwbf1Lto8krN15Z9WzxrgamXqn8Pn/1s+gjjH3WPv7V9ovz1559vAAq4kGtCBWjggGAVuOCBBP6k4IMMzlcahQ39t9OEGFbIIU0fdjhQhCLOphxOIZZYX4Mqpsdiiya+CKNRJ86YYI02qiZjjjfuyKOOFv7IE45CDuljkUYGiWRORy5ZWpNOoqhklDVBSWWVU145k5VaysRllzB9CeZmYz6ZYpkriYlmmmeuaVmbbp6UZZxvwklnYnbeKdKcepbEZ58j/QnonoOGWehfh7qUZ6IbLcpoRoI+SpmjklYUaaUYUYrpRJpuGlGnnoYq6qiklmrqqaimquqqrLbq6qthsMYq66y01mrrrbjmquuuvPbq66/ABivssMQWa+yxyCar7LLMNuvss9BGK+201FZr7bXYZqvtttx26+234IYr7rjklmvuueimq+667Lbr7rvwxivvvPTWa++9+Oarr74BAQAh+QQJAwAfACwAAAAAyADIAIcAAADd3d39/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8I/gA/CBxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtatXjgfCih1LtqzYr0zNql3LFq1QtnDjrnWbU67du2bpysTLt+9YvSv9Ch4M2KRcjYP/FgbZdmTixWDzBvYL+aJkmJQrRyyLs6/mhpx3ev6MUPFPvqQLmh56N/WH1UXxfj6b1m7lsFFtA6Yt9TBd3FZ1ewWO1TfXA12NF0f+NW5W4s3hXmWu1zlV6oWl9549N3fqxk6x/nNX67p39/JPwaNven49e/Luw8OPXzs0/aXt7yPNr9/o/P77XQbgUQIOGFuBBrJmX4IHksWgfws++FaEEgJFYYU+IYhhTxduKJqDHgbVYYidgUhihrCdqNOIKtZkYosrpgjjTS/OSKOMNs5UY44u4sgjZj7++FKQQrZEZJGT8YbkXkouCSR0Tg7ZZJRGTkklS1ZeqVKWWqJ0ZJcifQkmY1yOSVKZZoYJZZqGrcnmmW6+qaZ4cjoWZ50foYlnZHu22WdJd/65UaCCZkRooZbRieigii5qaKOOJhqpR4dOupmlHUGK6USabnqpp4aCilGloipEaqmloWpRp6qa2ipFbay+elCsshJEa60D3Yrra7s+pGuvwC70a63DBmvsscgmq+yyzDbr7LPQRivttNRWa+212Gar7bbcduvtt+CGK+645JZr7rnopqvuuuy26+678MYr77z01mvvvfjmq+++/Pbr778AByzwwASjGxAAIfkECQMAHwAsAAAAAMgAyACHAAAA1tbW/f39/f39/f39/f39/f39/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CP4APwgcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gSx4YS7as2bNkwypFy7atW7VA3cqd2xbuTbp487K1+/KtRL1y+aLc6xGwWcEjz540nBYxx7J9DTu+CJmm5MkRG+MEjPnhgbh5Oyv8PFSv6IKkjYY+nTrp6tNM8cJuKnt2bLq2bwfOvXYu76W+f7veLfxo8OKqiSMvqnx5ab/OiTaPDrou9efWrweFrr062u5Cuf6D7yl+vM7y5nOiT3+XMHue2d+fdy9/M/367b/jV69/f37F/v1XWYA23UdgTAYeCFOCCrbEYIMsPQhhShJOOBiAFkaGYYYObsjhSv19GKGHIl54WIkjDogihSeuyGKLLi4GY4xizUhjYjbeKBKJOoLEY4+F5QhkkJoNGZKQRm6EZJIZ/cgkRk4+SZmKUipJZZVNXonllEVuCaWWXlYEZpgTjUlmZl2eSZGZajrEZpsMvQnnaGnO6VmddjYkZ54G7cknQX7+KVCgghL6J56CJoRoogctyihqYz3qZqSSxklppXRiaqmmdLbGKaSefjqQo5heKiqkpzYa6qmmpjroqmyswipqq67K+imtqdp6q6uo8jqqr4ACO6iwwxKrq6bHImsssR8kW6mzzD4b7bLTVmvttdhmq+223Hbr7bfghivuuOSWa+656Kar7rrstuvuu/DGK++89NZr77345qvvvvz26++/AAcs8MA3BQQAIfkECQMAHwAsAAAAAMgAyACHAAAAw8PD/f39/f39/f39/f39/f39/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CP4APwgcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gw4pNeaCs2bNo05odi1St27dwD7DlCZdh3LhzaaLVeFdtXpZnSfYN/FdwWcCD5Rb2qDhm4sVTH0OGKnmy08qWm/bNTPku56ebPzMNLXop6dJJPaNWqnp1W7yuU8OObbQ1baK2bw+drXt33d64fwMXynv4z+LGeyJPvlM4c5/On9N9K/049erKr2PXGX37ze7ea/6CDz9TO3mb48/DNK9er9v26NnDX/9+fvn69mXKz98SP/+X+/2nkn8CIuZXgS4RiCBZBy5o4F4OrqRghCVNSKFhaV3IYIYaotRghxV+CKJIFo7IGIcmjiRiih+VyCJfKL7YYowydrRijTBCiOOJhO1oI40+YnRjkBUNSeRERh4pEZBKUsRkk0vqCGWRUk6JZJVWRvRklg1tyeVCXn6ZUJhiIoRlmXb1iKZDZ645pppugglnnG+uRWeadt6pUJt6CsRnnx/82aegehJ6p6F0zgkoQYou6meejhbUqKOTAlqppZBGOtClgx6mqaSZfsppoZ5+ymippgYaqqarsoqqqWutRhorpa+KWqutjaWqqq6b3uoqr4/mmqqvsgo7rLG2AvuossTKquyuzD6LrKjPBirttdFiC+y01Xbr7bfghivuuOSWa+656Kar7rrstuvuu/DGK++89NZr77345qvvvvz26++/AAcsMHYBAQAh+QQJAwAeACwAAAAAyADIAIcAAAC8vLz9/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8I/gA9CBxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDim15oKzZs2bHQkXLtq3btGq1vkUbd+vcsnXlzs2b9S5frHv/Xg0smCrhwlIPI177dvFUxY6bQo6s1C9lp5MvI22sWTLnzpU/g06aebTQ0qaBok7tczVrnq5f64wtGyft2jZv46ape7fM3r5hAg/uUjRx2G6P/zSu3Dbz5rmfQ+edfPrs6tZvDs9eUjp34di//s/0Lp5s+PLgz6Mvrn69+bbuY5KPf7I9/ZTz75O0r99k/v4h8QfgSP8N2FGBBnIkYIIfIchgRgs+qCB8EnZHYYX7XYhhgBpu2GCHHh4IYogTskUiSBGeOFGKKkbEYosQjQijRS/OyFCNNiqEY44I7cijQT7+WJCMQj5EZJENHYnkQkoumVCTTh4EZZRDmkhljFZe6dCUWnrApZZfXhkmlWNGWaaTZy6ZZZc30sVmkm6+yWSccj5JZ51S3oknQWvuWeVZfvaoZ6BeDhqooYcCSuifcC06UJ+LIuqnpHhCSiillSrq6KONblpop5tiWqemnooqJ6mhouqoqquC2ipeaZ5yCmusrEY6K62uvhqrrLsKVOult5YarLAH9Pqpsbm2auyxvSYLbLHIQtustLsOm+qy1iobLbbU4sottst6GW63pY4brrnnpqvuuuy26+678MYr77z01mvvvfjmq+++/Pbr778AB+xhQAAh+QQJAwAfACwAAAAAyADIAIcAAADHx8f9/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8I/gA/CBxIsKDBgwgTKlzIsK