From 1c32db68dae445904f562ad7183d829ba56a0451 Mon Sep 17 00:00:00 2001 From: Simon Kornblith Date: Sat, 7 Mar 2015 12:18:27 -0500 Subject: [PATCH 01/11] Unit testing infrastructure Implements the beginnings of unit testing infrastructure using mocha/chai. The unit tests can be run locally using test/runtests.sh, although this will need tweaks to run on Windows. They should also run on commit using Travis-CI. The unit tests themselves live in test/tests. The index.js file specifies separate test sets, which can be run individually by calling test/runtests.sh . Right now there is only a single unit test, but hopefully we'll have more soon... --- .gitmodules | 6 +++ .travis.yml | 16 +++++++ test/chrome.manifest | 7 +++ test/components/zotero-unit.js | 51 ++++++++++++++++++++ test/content/runtests.html | 14 ++++++ test/content/runtests.js | 88 ++++++++++++++++++++++++++++++++++ test/install.rdf | 26 ++++++++++ test/resource/chai | 1 + test/resource/mocha | 1 + test/runtests.sh | 56 ++++++++++++++++++++++ test/tests/index.js | 3 ++ test/tests/utilities.js | 20 ++++++++ 12 files changed, 289 insertions(+) create mode 100644 .travis.yml create mode 100644 test/chrome.manifest create mode 100644 test/components/zotero-unit.js create mode 100644 test/content/runtests.html create mode 100644 test/content/runtests.js create mode 100644 test/install.rdf create mode 160000 test/resource/chai create mode 160000 test/resource/mocha create mode 100755 test/runtests.sh create mode 100644 test/tests/index.js create mode 100644 test/tests/utilities.js diff --git a/.gitmodules b/.gitmodules index 5000d9dc7..4eac6535f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,9 @@ [submodule "styles"] path = styles url = git://github.com/zotero/bundled-styles.git +[submodule "test/resource/chai"] + path = test/resource/chai + url = https://github.com/chaijs/chai.git +[submodule "test/resource/mocha"] + path = test/resource/mocha + url = https://github.com/mochajs/mocha.git diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..4e0365777 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,16 @@ +language: cpp +compiler: + - gcc +env: + matrix: + - FIREFOXVERSION="36.0.1" + - FIREFOXVERSION="31.5.0esr" +notifications: + email: false +before_install: + - export DISPLAY=:99.0 + - sh -e /etc/init.d/xvfb start + - wget http://ftp.mozilla.org/pub/firefox/releases/${FIREFOXVERSION}/linux-x86_64/en-US/firefox-${FIREFOXVERSION}.tar.bz2 + - tar -xjf firefox-${FIREFOXVERSION}.tar.bz2 +script: + - test/runtests.sh -x firefox/firefox diff --git a/test/chrome.manifest b/test/chrome.manifest new file mode 100644 index 000000000..7885787e7 --- /dev/null +++ b/test/chrome.manifest @@ -0,0 +1,7 @@ +content zotero-unit content/ +resource zotero-unit resource/ +resource zotero-unit-tests tests/ + +component {b8570031-be5e-46e8-9785-38cd50a5d911} components/zotero-unit.js +contract @mozilla.org/commandlinehandler/general-startup;1?type=zotero-unit {b8570031-be5e-46e8-9785-38cd50a5d911} +category command-line-handler m-zotero-unit @mozilla.org/commandlinehandler/general-startup;1?type=zotero-unit diff --git a/test/components/zotero-unit.js b/test/components/zotero-unit.js new file mode 100644 index 000000000..6b102c13d --- /dev/null +++ b/test/components/zotero-unit.js @@ -0,0 +1,51 @@ +"use strict"; +/* + ***** BEGIN LICENSE BLOCK ***** + + Copyright © 2012 Center for History and New Media + George Mason University, Fairfax, Virginia, USA + http://zotero.org + + This file is part of Zotero. + + Zotero is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Zotero is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with Zotero. If not, see . + + ***** END LICENSE BLOCK ***** +*/ +Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); + +function ZoteroUnit() { + this.wrappedJSObject = this; +} +ZoteroUnit.prototype = { + /* nsICommandLineHandler */ + handle:function(cmdLine) { + this.tests = cmdLine.handleFlagWithParam("test", false); + }, + + dump:function(x) { + dump(x); + }, + + contractID: "@mozilla.org/commandlinehandler/general-startup;1?type=zotero-unit", + classDescription: "Zotero Unit Command Line Handler", + classID: Components.ID("{b8570031-be5e-46e8-9785-38cd50a5d911}"), + service: true, + _xpcom_categories: [{category:"command-line-handler", entry:"m-zotero-unit"}], + QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsICommandLineHandler, + Components.interfaces.nsISupports]) +}; + + +var NSGetFactory = XPCOMUtils.generateNSGetFactory([ZoteroUnit]); diff --git a/test/content/runtests.html b/test/content/runtests.html new file mode 100644 index 000000000..047e7a5e1 --- /dev/null +++ b/test/content/runtests.html @@ -0,0 +1,14 @@ + + + + Zotero Unit Tests + + + + + + + + + + \ No newline at end of file diff --git a/test/content/runtests.js b/test/content/runtests.js new file mode 100644 index 000000000..aa0d6e848 --- /dev/null +++ b/test/content/runtests.js @@ -0,0 +1,88 @@ +Components.utils.import("resource://gre/modules/FileUtils.jsm"); +Components.utils.import("resource://gre/modules/osfile.jsm") + +var ZoteroUnit = Components.classes["@mozilla.org/commandlinehandler/general-startup;1?type=zotero-unit"]. + getService(Components.interfaces.nsISupports). + wrappedJSObject; +var dump = ZoteroUnit.dump; + +function quit(failed) { + // Quit with exit status + if(!failed) { + OS.File.writeAtomic(FileUtils.getFile("ProfD", ["success"]).path, Uint8Array(0)); + } + Components.classes['@mozilla.org/toolkit/app-startup;1']. + getService(Components.interfaces.nsIAppStartup). + quit(Components.interfaces.nsIAppStartup.eForceQuit); +} + +function Reporter(runner) { + var indents = 0, passed = 0, failed = 0; + + function indent() { + return Array(indents).join(' '); + } + + runner.on('start', function(){}); + + runner.on('suite', function(suite){ + ++indents; + dump(indent()+suite.title+"\n"); + }); + + runner.on('suite end', function(suite){ + --indents; + if (1 == indents) dump("\n"); + }); + + runner.on('pending', function(test){ + dump(indent()+"pending -"+test.title); + }); + + runner.on('pass', function(test){ + passed++; + var msg = "\r"+indent()+Mocha.reporters.Base.symbols.ok+" "+test.title; + if ('fast' != test.speed) { + msg += " ("+Math.round(test.duration)+" ms)"; + } + dump(msg+"\n"); + }); + + runner.on('fail', function(test, err){ + failed++; + dump("\r"+indent()+Mocha.reporters.Base.symbols.err+" "+test.title+"\n"); + }); + + runner.on('end', function() { + dump(passed+"/"+(passed+failed)+" tests passed.\n"); + quit(failed != 0); + }); +} + +// Setup Mocha +mocha.setup({ui:"bdd", reporter:Reporter}); +var assert = chai.assert, + expect = chai.expect; + +// Set up tests to run +if(ZoteroUnit.tests) { + document.body.appendChild(document.createTextNode("Running tests...")); + var torun = ZoteroUnit.tests == "all" ? Object.keys(TESTS) : ZoteroUnit.tests.split(","); + + for(var key of torun) { + if(!TESTS[key]) { + dump("Invalid test set "+torun+"\n"); + quit(true); + } + for(var test of TESTS[key]) { + var el = document.createElement("script"); + el.type = "application/javascript;version=1.8"; + el.src = "resource://zotero-unit-tests/"+test; + document.body.appendChild(el); + } + } +} + +window.onload = function() { + mocha.run(); +}; \ No newline at end of file diff --git a/test/install.rdf b/test/install.rdf new file mode 100644 index 000000000..86dd153a3 --- /dev/null +++ b/test/install.rdf @@ -0,0 +1,26 @@ + + + + + + zotero-unit@zotero.org + Zotero Unit Tests + 1.0 + Center for History and New Media + Simon Kornblith + http://www.zotero.org + chrome://zotero/skin/zotero-new-z-48px.png + 2 + + + + + {ec8030f7-c20a-464f-9b0e-13a3a9e97384} + 31.0 + 38.* + + + + + diff --git a/test/resource/chai b/test/resource/chai new file mode 160000 index 000000000..d7cafca02 --- /dev/null +++ b/test/resource/chai @@ -0,0 +1 @@ +Subproject commit d7cafca0232756f767275bb00e66930a7823b027 diff --git a/test/resource/mocha b/test/resource/mocha new file mode 160000 index 000000000..65fc80ecd --- /dev/null +++ b/test/resource/mocha @@ -0,0 +1 @@ +Subproject commit 65fc80ecd96ca2159a792aff089bbc273d4bd86d diff --git a/test/runtests.sh b/test/runtests.sh new file mode 100755 index 000000000..c31147f01 --- /dev/null +++ b/test/runtests.sh @@ -0,0 +1,56 @@ +#!/bin/bash +CWD="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +if [ "`uname`" == "Darwin" ]; then + FX_EXECUTABLE="/Applications/Firefox.app/Contents/MacOS/firefox" +else + FX_EXECUTABLE="firefox" +fi + +function usage { + cat >&2 < "$PROFILE/extensions/zotero-unit@zotero.org" +echo "`dirname "$CWD"`" > "$PROFILE/extensions/zotero@chnm.gmu.edu" +echo 'user_pref("extensions.autoDisableScopes", 0);' > "$PROFILE/prefs.js" + +MOZ_NO_REMOTE=1 NO_EM_RESTART=1 "$FX_EXECUTABLE" -profile "$PROFILE" \ + -chrome chrome://zotero-unit/content/runtests.html -test "$TESTS" + +# Check for success +test -e "$PROFILE/success" +STATUS=$? + +# Clean up +rm -rf "$PROFILE" +exit $STATUS \ No newline at end of file diff --git a/test/tests/index.js b/test/tests/index.js new file mode 100644 index 000000000..125298956 --- /dev/null +++ b/test/tests/index.js @@ -0,0 +1,3 @@ +var TESTS = { + "utilities":["utilities.js"] +}; diff --git a/test/tests/utilities.js b/test/tests/utilities.js new file mode 100644 index 000000000..b71dcb517 --- /dev/null +++ b/test/tests/utilities.js @@ -0,0 +1,20 @@ +describe("Zotero.Utilities", function() { + describe("cleanAuthor", function() { + it('should parse author names', function() { + for(let useComma of [false, true]) { + for(let first_expected of [["First", "First"], + ["First Middle", "First Middle"], + ["F. R. S.", "F. R. S."], + ["F.R.S.", "F. R. S."], + ["F R S", "F. R. S."], + ["FRS", "F. R. S."]]) { + let [first, expected] = first_expected; + let str = useComma ? "Last, "+first : first+" Last"; + let author = Zotero.Utilities.cleanAuthor(str, "author", useComma); + assert.equal(author.firstName, expected); + assert.equal(author.lastName, "Last"); + } + } + }); + }); +}); From 50cd396918dc56e10a43e860e5f9d969e02e4446 Mon Sep 17 00:00:00 2001 From: Simon Kornblith Date: Sat, 7 Mar 2015 22:17:44 -0500 Subject: [PATCH 02/11] Make debugging tests a bit easier - Add command-line argument to enable debug logging - Add command-line argument to open (and leave open) jsconsole - Try to print error stack traces (although Mocha doesn't seem to like them?) --- test/components/zotero-unit.js | 1 + test/content/runtests.js | 14 +++++++++----- test/runtests.sh | 19 ++++++++++++++++--- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/test/components/zotero-unit.js b/test/components/zotero-unit.js index 6b102c13d..a1d3cc685 100644 --- a/test/components/zotero-unit.js +++ b/test/components/zotero-unit.js @@ -32,6 +32,7 @@ ZoteroUnit.prototype = { /* nsICommandLineHandler */ handle:function(cmdLine) { this.tests = cmdLine.handleFlagWithParam("test", false); + this.noquit = cmdLine.handleFlag("noquit", false); }, dump:function(x) { diff --git a/test/content/runtests.js b/test/content/runtests.js index aa0d6e848..b751b8f85 100644 --- a/test/content/runtests.js +++ b/test/content/runtests.js @@ -1,5 +1,5 @@ Components.utils.import("resource://gre/modules/FileUtils.jsm"); -Components.utils.import("resource://gre/modules/osfile.jsm") +Components.utils.import("resource://gre/modules/osfile.jsm"); var ZoteroUnit = Components.classes["@mozilla.org/commandlinehandler/general-startup;1?type=zotero-unit"]. getService(Components.interfaces.nsISupports). @@ -11,9 +11,11 @@ function quit(failed) { if(!failed) { OS.File.writeAtomic(FileUtils.getFile("ProfD", ["success"]).path, Uint8Array(0)); } - Components.classes['@mozilla.org/toolkit/app-startup;1']. - getService(Components.interfaces.nsIAppStartup). - quit(Components.interfaces.nsIAppStartup.eForceQuit); + if(!ZoteroUnit.noquit) { + Components.classes['@mozilla.org/toolkit/app-startup;1']. + getService(Components.interfaces.nsIAppStartup). + quit(Components.interfaces.nsIAppStartup.eForceQuit); + } } function Reporter(runner) { @@ -50,7 +52,9 @@ function Reporter(runner) { runner.on('fail', function(test, err){ failed++; - dump("\r"+indent()+Mocha.reporters.Base.symbols.err+" "+test.title+"\n"); + dump("\r"+indent()+Mocha.reporters.Base.symbols.err+" "+test.title+"\n"+ + indent()+" "+err.toString()+" at\n"+ + indent()+" "+err.stack.replace("\n", "\n"+indent()+" ", "g")); }); runner.on('end', function() { diff --git a/test/runtests.sh b/test/runtests.sh index c31147f01..17a04f28f 100755 --- a/test/runtests.sh +++ b/test/runtests.sh @@ -1,27 +1,37 @@ #!/bin/bash CWD="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +DEBUG=false if [ "`uname`" == "Darwin" ]; then FX_EXECUTABLE="/Applications/Firefox.app/Contents/MacOS/firefox" else FX_EXECUTABLE="firefox" fi +FX_ARGS="" function usage { cat >&2 < "$PROFILE/extensions/zotero-unit@zotero.org" echo "`dirname "$CWD"`" > "$PROFILE/extensions/zotero@chnm.gmu.edu" -echo 'user_pref("extensions.autoDisableScopes", 0);' > "$PROFILE/prefs.js" +cat < "$PROFILE/prefs.js" +user_pref("extensions.autoDisableScopes", 0); +user_pref("extensions.zotero.debug.log", $DEBUG); +EOF MOZ_NO_REMOTE=1 NO_EM_RESTART=1 "$FX_EXECUTABLE" -profile "$PROFILE" \ - -chrome chrome://zotero-unit/content/runtests.html -test "$TESTS" + -chrome chrome://zotero-unit/content/runtests.html -test "$TESTS" $FX_ARGS # Check for success test -e "$PROFILE/success" From 3f0f7af71ad6957a521c8665b1628ec2bec1cb7d Mon Sep 17 00:00:00 2001 From: Simon Kornblith Date: Sun, 8 Mar 2015 15:59:53 -0400 Subject: [PATCH 03/11] Add unit test for PDF recognition with DOI Also some support code that was useful here and will probably be useful for other tests. This is a pretty complicated thing to test, but it seems to work. --- test/content/runtests.html | 1 + test/content/runtests.js | 1 + test/content/support.js | 111 ++++++++++++++++++++++ test/tests/data/recognizePDF_test_DOI.pdf | Bin 0 -> 183189 bytes test/tests/index.js | 1 + test/tests/recognizePDF.js | 34 +++++++ 6 files changed, 148 insertions(+) create mode 100644 test/content/support.js create mode 100644 test/tests/data/recognizePDF_test_DOI.pdf create mode 100644 test/tests/recognizePDF.js diff --git a/test/content/runtests.html b/test/content/runtests.html index 047e7a5e1..173dff3c5 100644 --- a/test/content/runtests.html +++ b/test/content/runtests.html @@ -9,6 +9,7 @@ + \ No newline at end of file diff --git a/test/content/runtests.js b/test/content/runtests.js index b751b8f85..7e131dfc8 100644 --- a/test/content/runtests.js +++ b/test/content/runtests.js @@ -1,5 +1,6 @@ Components.utils.import("resource://gre/modules/FileUtils.jsm"); Components.utils.import("resource://gre/modules/osfile.jsm"); +Components.utils.import("resource://zotero/q.js"); var ZoteroUnit = Components.classes["@mozilla.org/commandlinehandler/general-startup;1?type=zotero-unit"]. getService(Components.interfaces.nsISupports). diff --git a/test/content/support.js b/test/content/support.js new file mode 100644 index 000000000..9d8fee3a5 --- /dev/null +++ b/test/content/support.js @@ -0,0 +1,111 @@ +/** + * Open a window. Returns a promise for the window. + */ +function loadWindow(winurl, argument) { + var deferred = Q.defer(); + var win = window.openDialog(winurl, "_blank", "chrome", argument); + var func = function() { + win.removeEventListener("load", func, false); + deferred.resolve(win); + }; + win.addEventListener("load", func, false); + return deferred.promise; +} + +/** + * Loads a Zotero pane in a new window. Returns the containing window. + */ +function loadZoteroPane() { + return loadWindow("chrome://browser/content/browser.xul").then(function(win) { + win.ZoteroOverlay.toggleDisplay(true); + + // Hack to wait for pane load to finish. This is the same hack + // we use in ZoteroPane.js, so either it's not good enough + // there or it should be good enough here. + return Q.delay(52).then(function() { + return win; + }); + }); +} + +/** + * Waits for a window with a specific URL to open. Returns a promise for the window. + */ +function waitForWindow(uri) { + var deferred = Q.defer(); + Components.utils.import("resource://gre/modules/Services.jsm"); + var loadobserver = function(ev) { + ev.originalTarget.removeEventListener("load", loadobserver, false); + if(ev.target.location == uri) { + Services.ww.unregisterNotification(winobserver); + deferred.resolve(ev.target.docShell.QueryInterface(Components.interfaces.nsIInterfaceRequestor). + getInterface(Components.interfaces.nsIDOMWindow)); + } + }; + var winobserver = {"observe":function(subject, topic, data) { + if(topic != "domwindowopened") return; + var win = subject.QueryInterface(Components.interfaces.nsIDOMWindow); + win.addEventListener("load", loadobserver, false); + }}; + var enumerator = Services.ww.registerNotification(winobserver); + return deferred.promise; +} + +/** + * Waits for a single item event. Returns a promise for the item ID(s). + */ +function waitForItemEvent(event) { + var deferred = Q.defer(); + var notifierID = Zotero.Notifier.registerObserver({notify:function(ev, type, ids, extraData) { + if(ev == event) { + Zotero.Notifier.unregisterObserver(notifierID); + deferred.resolve(ids); + } + }}, ["item"]); + return deferred.promise; +} + +/** + * Ensures that the PDF tools are installed, or installs them if not. Returns a promise. + */ +function installPDFTools() { + if(Zotero.Fulltext.pdfConverterIsRegistered() && Zotero.Fulltext.pdfInfoIsRegistered()) { + return Q(true); + } + + // Begin install procedure + return loadWindow("chrome://zotero/content/preferences/preferences.xul", { + pane: 'zotero-prefpane-search', + action: 'pdftools-install' + }).then(function(win) { + // Wait for confirmation dialog + return waitForWindow("chrome://global/content/commonDialog.xul").then(function(dlg) { + // Accept confirmation dialog + dlg.document.documentElement.acceptDialog(); + + // Wait for install to finish + var deferred = Q.defer(); + var id = setInterval(function() { + if(Zotero.Fulltext.pdfConverterIsRegistered() && Zotero.Fulltext.pdfInfoIsRegistered()) { + win.close(); + clearInterval(id); + deferred.resolve(true); + } + }, 500); + return deferred.promise; + }); + }); +} + +/** + * Returns a promise for the nsIFile corresponding to the test data + * directory (i.e., test/tests/data) + */ +function getTestDataDirectory() { + Components.utils.import("resource://gre/modules/Services.jsm"); + var resource = Services.io.getProtocolHandler("resource"). + QueryInterface(Components.interfaces.nsIResProtocolHandler), + resURI = Services.io.newURI("resource://zotero-unit-tests/data", null, null); + return Services.io.newURI(resource.resolveURI(resURI), null, null). + QueryInterface(Components.interfaces.nsIFileURL).file; +} \ No newline at end of file diff --git a/test/tests/data/recognizePDF_test_DOI.pdf b/test/tests/data/recognizePDF_test_DOI.pdf new file mode 100644 index 0000000000000000000000000000000000000000..324e83ceee728f544652893db3b087d43f21f9e1 GIT binary patch literal 183189 zcmeFZcU)9WlQ4RQoRO#^Nf40C3^_{%70EdX!vI4Va!x8Jf(il(NEReX5>PUtB1w{D z$&z!F9Pb&7&+fas@7?eB-G8n}PfvAqb$4}jpiftIv8c-{azl9p30Nj3JGu#=jC_oa z7PbTu61+0@ZU`5Yxf_C49^rw6BQ%v{d9Nc-)^0Y8FhNm4-W!bkyoyLP5wD^>NG6Yf zJ6a;7q+H!x5atd9UWrLDp4!^|)FB-;o<7gp_$b-sR%?hEYlL&U>ldc_ZIZf_TwanWy>xO4pcWPVL}vv=oV{rvG|(vhU-ca)g~a}$+CU0U6D z{d}x&qU)buIP$)K;{4StrH(H+`rWvzSK582&L_^^p=lo9z8FJYnmnO}s- z-=<{LQ6_}lYQ2avh39?cSRIcNyIv;r3@N$n-e=ZqERK+u&&9Iw_vyv3O>Py)27Q*a zp^U#15Hebacl}PzD_9#O~NCZKa~p6gBv>)ofsf_zt&9~NTp47s@3Gdn_Gu8~f#QhkPA9d8nj$c?a*@Ya6 z1SB)6e!eJj<^x`H@S|W3S;BGh@r&bBk;>X^gXBS>#uGReRO=$^1kO)(!!OBou~kG` zD9d(vbeVT~cS&|}!k*=+dax=*V^1wlv2G}Az&DKW!-9)~Be0AtYUCfuSABf^kx-@j zMa+u_Qyk3_%~zYFqcEeoHNDs!*oE0Md&F{Ra%ERrgP}Mk=;sM;IHHwxtn~oFm30vbfT^mciSV|Zwq1zExm+2M!gKkGXm#m@M)-MMriosU&ce?_u|{)ciyZS66IgYmo%&~ zbR85MBpWn(E&iI#eahX>ZNn|zoqi$8J;_aPv2Ss-t8NauskynmIPy7UD}OV3({2-& z=q9EeX2JV_AQ`#W&+{*Kyc%`-a^G^w;t8V1UcmM`|F$p>-wI!Vc^Z=3p}6}+|5S9& zQ{+oz&^#vpd497Jj1r!bv9_%?gBih@GOi}-Wa>q3F>X^s8hsZoQvK04Y5Lgu4n+&4 z`!){nwlY*va&hPD(2@ab{?=63opTuvIZJJf^oF)dvmC|-42JNRZhSeiak{2=*SaSJr|Y(Zv$ zU%yblsIYk18`SIwnJ4d##ZCa}`G{%yUit{hUP%hc1WD`ayy`x$q#Z@y1Mk&M`fZJE z^F4vR*4@F~g01Cs=DoZ7ItP;L{X4Sk;~<*yU6yF`c_NL zB5ua=!=2@%tyiohU4=&30?ZDHS{}U#*-Bh)Ex4)XOe->-7>X4Vyb;_iAM(*8R7>TC z%2SnYV_}rw4x-r8#bLwv>djB%Pww{I@97gTHZ&e&PbT8M+aFyJl^iV{CXlK@&N-@jszT4kmA8gS1B0rNS4!p9 zFFw`2bS<12rSp~6X44rfaLz}LWW9DAdRuX{bR>tHNcy^mqd%tSt#p&5S6O>*L5*qE z+l@0b>V40%h{uU*#$az9Y_;vVkcVDzo?cVRO_9m037MJcSCv}g$F0o2^%TXyh2OfK z6qM9wXB0f`GjyS)Jxd?B?LWNZd1E(ePO4dCU?ZrH^kDF^L;bS4FY4gBl4hf_wf5{+ z_A#vylWh|RX_^zS-PeQj@%+WspW4aWsgq4aVm(pYehqu`grR2}D&bWO#t*B#a@oqW zPNK##IAbMw&6eEfB|YoMKh5WQ=&6~&jTg&N{xvlnFAJC1a#IHP^ACn_?Qz5$zl_e& z7>jv%G$H3csO}`hI_?cu2KWvvzZY*=9i|IEPhZjUR@|F+YqaISU}u)W-s^sV{-N@M z#xy*maZ7sfXjsfb(#5LB|MjZMTr@5`uV}W`@_56%dX0S#IUT$p-~D25YM#9#=R$|B z#D&1*b-#ehIlXzaotn@7>vfLpwOeiS?GJ0GYK?bmHlKdTtt;d<^X$NBlM0C5whAcN z&HpgOyn1fcXH2O&C9dQ6){**_#wxs@tyYcnY!@~4F*au0w?hI1%JRo<5roj&PT245 zr?$5ff>&S7!WIE{mW=4Vs-_9Amb--;npVZZ+#10v zi*$2UN4Us2IygC^5GXfB5ner{CAepW@(KLhzVZtQi-_{A#3 zEFc$t!M2dgKWH#O8YlpU04w;qKwzgZB?!lbAOWl&dGo;EF95;8FaWTf`S~jYN(sTJ zZsX|Y=xXEW#He78Z~z+hJQcXeW&#T-Q3FRjEukW{}x0BcXDw98CM6X`7IHy za1ag#VS7(ECp3NygefiT&@cwN^^`6kgCKkk4O@SQxlU=m!&lI-r31rPgeM61fbb=IcLyX0?}9L;1H#-D0I-PAcsB&x288)Qn8-z2 zQx1eBz@bQF{ReFE2keIM0{H|0IY%dNm(ziN8P3iK6%`d>R7QB(Bi!7$)y?5{<}Q|u z=(%H#@&9sQ zX~qMb>7WEKmsUWG700pcfbdz5>(0BCrN*0|yWY z1Q$XKp@5u+FhE!!oDdj91R@1dfLw=YLJS}`A=VHS#2w-X34%O;L_y*q&mlRGB1i?~ zJ){}Z2^oNlL*^kHkbMkH3?d9l3_1)}3|l1T7}^*n7}glh7(N)m7~vRk7-<-J z7^N8RFg#d(O6gj0y~4yO}m z5@!n+7xz3aC$1!}8m>968}2>aXSjK|wYXil)402Mgm?^iFg!&(Lp&7T9lRL4mw0dS zy6|T44)D+5v*3&2tKnPXd*esozre4=@4%nNKOi6@U?Y$u&?c}YxJ?j8P(V;mFih}` zkdTmxP?S)E5J`B8FplsQVH4pv;T{n=5eJbRkui}wQ8-Z+(L166qHn~+#H_?uhz*I| zh{K6C zcgFloz?p`orLCMs}9LOG$y(DWUnY3gZ~E>K<&zW~1wcA@yfAT0(h2dyTpFKs$)EA18?J)IJr6WueqI=Ur#YWgem zw)9Wv-_p-BP%ua_AQ_%8)G{nEQZdRf+B3#6eq>y`NPAKFqWi_?7uzo$FtIV|Fx_D) zWEx>6U>0GvVt&H>fqCr`!zI;AewT7D4YJ^~h_KkO#IiK9?69)2>am8fma)#UonupB z^I^+n8@^0@S^Bc`<+RH^>^STq>~`!)?4LO>I0QLtI1)HII59YdIFX!5oSj_QT%uek zt~9QGZX#|OZV&EU?r|P!p6fh!c*=NIcrWo9@<#GD@*eXE^4asf;2VOHL$5;bKr5je zFb)_TmH_MFC+1h=59BZBUl-sMKnNrYd=aD&R22*n{2+KFBrN12R3J1jd`bAGaH4R( z2&IU+$U~7PQEX9J(Lm8^(LFICF*mVdu~l(yaXays;&T#g5(tSG5|ffllID`nCBI5B zO5K!7mHH}uQQBNOO?u)A^A*c0nOA0I*kx>G@?=(I`D9&W-^lLBiOKoPy_3h3SCS8t zZ&x5!&{2q27*%9av{uYjTvHNM@>P1LjIDf4Ia0Y_g-!*olB2SARrsp^)sNSRu4!G1 zzcz85vQitE$ne!#7xNpl+0@0ct90(P|^=Z0gSHRT?-N>KX|eGn!CMKg~uh z3N16Oms;D}vf2^aLpqmr+;u+alIj}k=IHL|$?HYwebwjH_t$SRpfNxilpEq2>KbMm zZW$>UJvEv(7Bs$R+-JgO;$_loN@HqoT4P3PW^Pt;6Z@v#&6hV1&DG4)%(pC5ED|l& z;BxR-_@d<%%O{re2uVZ~V%AF1D#~ikTGBe&dfrCbCdOt7DTj*NbuP8)b%X!BJ)CdwR&@ShkDQYDEeghV)?>-KlokryX`mbFXR6_01{vk z@F9>nFgS4fmeQ^4+XT1mZnxdxyAyS1Ge|F}GMFy-R`BFqrMtQJNbb4Z>kknRNx6@8 zA9=q$lt1)Y=y8~3*rx}44`Lo1K7>E~^a%PW?$JrORd{=ZP(<=$oX4ogeUZ|U*->Os zK2ej=s?nuS7@vea*?emDv^ho~CMA|2);;!X-1WHfXP2Hmes&md6W^O4n^2fYn;4q7 zlVq9Hm3$?+AcZdFLCStAGWE-IrRSw-tZ6anIO!hgGcR;sG-ilopwEy3I1wNReCfN3-U8udZL%5^-v*_o_PKnO9UD93eyXCtZdQ^H^dT;c0_UZI}={N5G`o;3g z+<^VS`k=?)!O*Q??BTGHGb1shw4-Tb>|=#rg}&B|%a6BCXiW@F!Y3D}T&E7FgJ+0m zVrCg;bLL=k)$@w;pBIc4rWc(S50>sNlPxE%TwZy-dS$hBO@D2A-DUk`fp ze2@Ic5JF5yNK8U}hJ@q{B?$=$B|0FX{GNsE-znha9YBT$SOYeg5GDYF41!4pIT-=> zF1RNjA<`h1*x>d8d_acL4<`62iiM4Xi-%7@2!3$>GZ6w{VE#-z13<7Km>5_X*tj@& z*qB88U?LeN)Gk@jkx2j^F6qB~W&x@v(_ej(FBH9C2 z-n=x{f4CG~2dREQe?3tQQqTO_G$PyIe}{U!znrw)ZsYv4qC4+1GU5I`3h|CS}C^o;xB4vzGmi95|vgTHl|C1i7YYs@GN7 z7pTx8Xh_@ldbu>V>7tL?jRnft$~AtYoi_uuV=?pcbxS)ZbyyFbcO8l`f%Kj%`E zirUHNEp7392OY7-bHwCo@5wBV>{~=?m}UjuGvV$ZMiF??*Yr3pjA-|(^X}}s^$EsO zl%BP|-8nZ`Lq9k~((H@hRJN1EpisN!er!7}m1aSd{OT}k0m{isaj<$s7dW%x+wU18 z4A&o{j@)J6_>_BY4}Jougq*8-Hfk0d^5OhA_hX z38~BhvfuN*o??aB68`LtqVqa8%s*X zxuh(qDHTTQueQo+>T(HF;=jJP0&P8wv-z5nCAhp z|CJLUIKH;+i0x?4eS6U;!fQ-TO!QJohSc;+-)pB4RRH=M_Y$n1$X<73=xk{0Ns%Ak8~}c zeU$VY7bPXEK3{o-*PL6$Kr??3uC(8_>jdh7x7G;bs z7Zeqbj5V1ws?CpxRlaNR7e;QzZ$At7%^Q}ecs7yLa5i<3&GXsr6X-iRe2Qk->HTvj z!0L;=lC>pE6q24XoNSGqyS?7c*;U+6&%c*XOl#4(`Rzj&Y0(ZF=4sBbrq=nM0r)Fk zM8&yiI|vr^fMy4k)3I+9D4L?SBb*T(`-JVh>@>+m|M3$bHJ$Y1^Jt>+nCH=Vt}t{q z&z}GZY_Ik^`=53CAnju>sXXY3 zQn{3M(!He}3w^W|EncwY*PitGE_jyO@8j(+``N6rO({K8ncJ>(DR4e-o3p%ek)BsS zmw}_fYIA7OduzzFg|n#21J)MOy}5++=y|ftb)3`5CziyT7a#O~#alNiHmu*lz4y&f zy}B`Ei*D0)cCRsDLeFY^vgYZSzuN#Z?90xZjK)1;=baZ>9b#F#uig~!%=Z&#g^is6 zQTmSikz4Vx0bx<_Z*g;`_3k~LM)@_%FEjC7N97E0HxgHEgIu5tN`poYsK!U5ubj9d zMz^Hy^{gS&Z74A}| zFbb|TZ@hg1r0oRwkZR1)G3N}J48*nhZ=L{xzSnZ!)b_rO)pI-&q&3T}VWvKS*=97d zF0`rDZ0jEgF|<0AN_OPet|QsUrBaXd=SHq?T`RdPlt_}jW1&kw11oL|kLlHl>j)Se zJURiM8S?gutyhkz?6(CP=9g}rHF1U2s1xSGX;x)3QO6EXDhdaV6b8)Qc!IY4%Vx~G zw-p`SpOKIjy}Kp+wy|i{*Z4>(d1TI;LGNw;tdXZi@hvkO?&jh$sUo<+X2Ro7i47xV zj%zH} z%+%R8&l?Zfik8P54>`d?qcv5yU{4xK4w~<6uBR6Igbv<4q{%DTX@xP&J6eH>hHZVHmjfJW707?_Ik3Y z_exVy?D>j<(ki6?)-r?j<~-`tamv0>z#}gLWgiKT6Cl3aciS#x_5?`Lm^e1u$K15m zs;g{$ITq@`-RQ0@5MoebXW;MgX6sFU!1mx+Clp~mZfPP{jQymK{Ww-3mTa-4ck9A- zh4n&}?FEiw*Pas~%=Ao@=J>>7ul`YoxW@VEKxh5o(8v4Y8sy(a)sR!G;1>sk$0yaIOtbl}nB_bWGDQSNF7lBN1XC%^|E zUaR`AIT!b9sT#-9{pbS5^e8rKd-qM$RH-Vq^fAX?_k3NasE_Fz9B>$$XPEDM-Tx_v zJzbl#M2%&=C9I&WucKFm_o=1={AA!{nepXsB^o~uA0Q&DqKd_G`h9igH2fn#r(rJt zNK-m!0}r7gz>nY4d}uWu0Fa!9r-Ae>P&I)rk@z%4drFDs8r>4~7ck~2 z2JaMumJ^7>xbpq|Q4&3f{c-YtN=t)|Vk&{bcX^?s0Qj{HfCv5ns7i!`hyIR$EBMa= zFb82f5c~668w7tnf8x+Ne=1A=CBaYR4;Il;l)Jq>_=9dJj)kK;sQLz#+n`SIXJwjj zH?&giRAr$J>UQlNQNOCVj<9n3GcN1q=Xpb@Aghyc*4`ya#v--*!}bc%|@sg~ydcKb2iUF@|L^wCPzAH9Ya{y#CQuGWZu zU~tUs-L%cE|A8ZcBfxy1>Qu#5SzGnGg`=ZAx)T$k-#Te@cq z@ADK*0nns?0a|Q7W(`CH0Q~QR_#ogMcm(&SiN#-YfWPJd=ph6AQUe2j%>iUjCGtJ^ zYYy<&9N@1xz+ZEKzvcjc%>n+J1N=1y_-hXE*Bs!lIRI#p@YfvRuQ|Y9bAZ3*0DsK^ z{+a{)H3#@>4)E6;;IBErUvq%J<^cbWIly<_)y2~jc3&_&HMKqm$N-k0V%P#e0F2;G zG#e0hJ5>~;Atw;00N8_R4&aLdQ_z}Ly8qXC7{Pn2d;kylqE%$4y0!0GYFq&CJ0~aO zWQjj6DxzF@%+VKsdEkx?yk6!`yiguKUO+COEF4#iFr9VIUwB38ND3rQLbWMl1!(Ci-9m2 z&CA4iO5$cG$#iNme4qg^?K`;vPz_{Ujd{9OqejX^lr~tnx7bAG*n2#6zAI8lm zA|@ax#?Qz2<6#18bFs7%)09{IQ5P7KWcuUwr6)g+ql+~!cpFuemk-7ZgK>it+^*gz zH*+s;lq>Vk66C>4xGqSi)60tJ63sz9x|<{u$m#bcI5_<(_Fu~CC!r<$7o8KRDn6~; z63&bGahn>HD-_-Q(?XqoUbg;~s;d6$3_ttL!QodGu5Jn*U^D)^ zUUo&ReR(wzuHaQsI6}b#y!6fdvobfN)o*eBgE@4{Klnm`_tyV)Md*}Yq)uXTpbsZE zM;C2S;r+Awe;dsF%UkDYZhquL$b*&ul1%7p=-hn#+%O?+s0jKRI#igOPgsnP?>nig zqb1VH`#+QZxUv2ZQgA$4n!B0*kHnU6F)K$G2Xj!G$WwO!woV9ZCdOZ#BzCGP2Wtk| z=4+@3J z3M%kJp)%k+kb}y}2+G0)pb9dAKl92v!rjqV^?&BIMCXP5dwIW`TA17a@5(?A0x_@% zuyS+s%#mb*GBKVa_0i+W-u*jL7%D2lF9c3u@cEH$@IR#gPS!yoL6O6Lu7fcAo1rrtkUl1oEz$M7f2fk1c2Js^NTrg1~E`B~J7e7=4 zd_}ngVc^RT194zE!hGNh(h8&Ff?zuM@(b|8#Dx?^U?7Eppr{ZGDlelT$j>jsFQf<+ z5mgis7FCpEVnmN{F?FOD!d_n<33i3+cUkZW{F!9%k0fx2oaQLA)UJJB-evkzfdlMVKEH8af2&!B7+(ihz`0h^~tt6d^i9*TN5q79E0l!SFOMC|Cig0GNsn zL2kkDJ4W~v7D0!iAfI4(N+T)=!on~#UKs2IFa*0w030W1yy$6OQ4w@rQ4utas0f-y zRP>Za6nYAyOA|dUO;i+Jqv&awqG(RQ`pFl2yh8;33G{nw?RSCK%rbv7#EbE z3o5_`b}vW-73KoR0t}=DM+i7Tz_B9;4kK_BfCB~`2jcR4{4hmXSvf%&5tuAgMwU-h zK|oGa1{@1QA~G-;DEjZm>5?p_jC2K;HSZsPk+cxbKOlP~1o9u&{Qm=i z{OB*ZjXBC10q%i#nb7UwMei2A_crf;90;drf9x!Nl7rh7H27hQU0$uE(2|)|2i)F>Co)2LN!uXZ&?*f0gDg%9c{dQGG47w^y1KGsE0Nri3sW~MI?*d^P)9Y0T+Vv?>hzA#*(sy z6o2TN*su(8iw;Jlm(+DnvWr-KbLS8hQ&zbOUN5w^LE3tFdU^ZYy%%ynH0;UKnAo^y z@h>tmv$AtuzJ60$R$fv0vA&_Psrge+Z(skHfx)Tinc2Ddh0U$)o!z~Cu=!}`YFL=q zSXfv%IM@y#%VeN)HEbvjz(gUVfeSOIbjFjt%^XRk`P_n z)7o!0Ys&gIUiag&%bUK;?TV@xAiYDMjoqG@Gw<+YG`ZXEmP>aJ zZTIyHN7vgSFk%l< z7p1P2NrF7+uRDbb7s!aO&Jt!$k&uxr%v&#B%1 z@bs`zBfr0PxR;+Hb-><&>T83+3BZvPvi;dV*NRQv_{rrRy)w=^iW|`R;9Nck9X~fR$8N6qD z&R@7@wmL68PI-+(e*Ebeo~ypwf4EhuIG5MBd_4U@^|jqg`pXwMvO2<|^yssQ=;erf z?#pW~b3HnW+`a2v_$AqWx_qX(B%HeiC8N1L6|2snVq?tpM4hAcWs~&%EiRX_YKg2` z6{`G?QTk(|sRr)|R8k=bP0bhams#{r08+i7e!9Y9aV=bxav_u_LtJWJC`-5@M|PH( z{@Xhmp?cI37w9EFOi{7upLzE==p%!yM1*EGWJXHh}MX>hp88~bea zMwr)Dl?+Y3T1sqbckXDtP~Ss#gDmu3yI`c;U9z0si@@htTfJNJsH58T7TfOZp@Rz+ z@Z&EM&ei(*8S!oVt1KoGD}(ug8q!OW69KcUxO}Uw0taQnE3sO_{`c8QAEWV=*q ziBkui0;St3?JY>texRE5Va2Mn$P)RBAyRQvX>rb>Fgev>=fIO=_zUCS9i1s2#G5D* z_;xpSbq4l9+1dTZ*iRaQx@f3i)2`%s1F@CAY4<=II1wQP)fmxneGw~sDi zpW~6{QT+YF$LlF011;jX+^(b&2gq{OH^-}`zM*-jH*JoWkTGXeOk6=6zHb>x)Q0f0ofov+A9)9liOVq)n+PdJok!fY3R9WSwCSC? z<4nexgTMLemHU+bFp+$DS#pKKC_ zD=Fd*Ns6NvZTHoH#gV|1&eMsg;y+tq;}Jg4ilTigtJyg*$B}ExaS7|i8O`@B3i3-Y z31M|u_8$S2GTMV3)5R+($p_ zkCb1M6s@K>I*Jy?E${iFu$RYU>lAQFp>-8|tm?G$>Py75TO|xKhvEa$*a3`=4sSxQ zO7z>!3L#KxWu8+4U$s|Md#S~&V{soQO(h%p$G*0u%bvTbh_A!tqEor>R943CeQQF9 zuw!k_4wHgDmqvf-lYjlzVo3EL>-6_%p}^P*}0N83YG=VZGi`7g!0%v5AWg%iA{ z%(u%{v))0OxuEh2N2e?u%bKT=!Ae34MR>VZs`S!$>w{yN%g41}T^>C98b2Ag7u=*O zRcZ@AKIgNqv0dv}GE`GGMHzOfZ;1Pu2u9Ys8@KHHjv^;*T9;8OZxOeoHPxUPO2v!* zWlTZOqet?*vvE^bnX9e!{XX}+iWKds2)Pt!1fe@hkb%qMDEM6CnW|KI&)|4yc5O6i z*`Zl=@JLcsE+)rJ+Qvb|K#y(bVvI(l39lOK-7Y!9}03$-uU)CSk-Fb~o^vsP9W;|kdxO@67Z9wzwoNs#6J2)LuS zx5rsKlwFa+ku14`1U^$y^YIrQ{qANJK}jshywPcelvv(#+ZgM5_n)UX9`}5{{f+Ua zdu1Elb@wN)bY$PBCtrGs$9RWM=FoWsbHQpst=4^|W_853@TBW>ZsrOcDn0eTgCY8YNJfPjMb%O3Ybt`9O z-Pb+=-q6X@4>_cnw4VST&urHkGgLbK-sE&7-}+G7wP;V$7i?KM<_*7>#v#DM&o1xI1O4r0T7j_Srk|Ek)`q zTg71+hBv;n+31TCzFPW33{t~N|}N;XK_+Oe+_OtgVY+vpkfcFHdsFlFxO&>BShiD)?zZGi!XjpG=11eUL`Tu1{CU49-Wh zklNN1->;>ULTnD7JpwNHIi!>^#dDY>eJLc-R7UnnvSU-8H+=d?8K5-9zI`6@YPc5W z>nJtmIws+yLYmWi*3B%LQZM_OPZ@1(N0I4Jw!W#&bR#irLT#-mtI%lj&}uZIw$jXE zMa96-@7`E_kJ^hd`EHH+OWEEiO<9?#!7($h**dx#PYZnLkAAJ<-KQf}oBQyXwMlNB zlVj7u1f#+6%%yozB3Qx+AoJC`&~a(>_+w&nQ*}oPf4B0J^{vl6$8K32X(Tp8-oEaH z9~-16Tg;|SbD57Ra->+VleUV=#|)>`?`vMf^Ttdn-1gm2Vd;cJ6xv_QX-HjBz15{w z6j%}U%u_X^NXEWy_UQSs*{2#D|F;_SBNdkm(w%A%0;IFYa((qfQCsI|tBJEii+Up; z>$}h-Uy*sWf8ih^^>~n`E532p=lm$cx_HMPI6T(7`&$D`XI|czSZ>l)(he!!X_b+8 z%er62Dg*R1%+Bx8uQ3P6n~b@LsRm@q&CWCy9J^fa7QVcZN<1i3W#}ip`sCZ@fsdT3 zpn(pY`AB;55kod%(Z=8G6Z?`-O$ZR|^eq1xn4&BLmzgr|R>}J}&rh=Dma|M#fx?Y0aZ5 z>W?H z3YyazIf@P-RL45=EJqbpMb)L46%#k5x`?Hd#Cjw4AfDHKd8glQ%@ZYQY08Y%xEh7l z)pIRVlCQ2*zVz=6%3P~zh%k8kk@ZH*g{-rb^_*MC`~*AJyFBf)WlwfOTm#;fcodufjEQbA<3Jx6)BZ?rO3)T# zULF4RrF8H}GV+{f_VJNCb5wt6Ca%&d8L}(riP`QIUc>2*(CJ%jAqI^v3EnNtuF{}Ldp)S7-^Haa38O)w0IAg zQAp26s0J+Js0D>=Dk)x=nCbTkd?HP=K%@v&8x;pi<9SOf!v;exCMPuK+;}kWtLWe& zLx5K{l+dw9>(Yu?pxK~jtyoV7mpax!CZDi?wJKDEMa^L1Wg4Li9Zb@nFHtrQz1vQa zxZU5`f%TNCb0Qo0Mxd8dRqY(;Lwa1h~Rn`H!@{-O^ z&o`LLvxcS*M8fYzxKge3yE@}9+a#yA(y^ubg0+b6olJvYK z>7_u%&%cK%dd+Dxs3?mld{}p>#-kYR@UI~KlAkGBwsW?+-|2R~N0TwvM$m1pwn#^N zyw-@(Lng&$a+eXAr1#Y@1fPx@IgC@MvuBc1Vt2k=FI>x4O(pME^aD;~9LU@3z1ir! zpvQ&B(H5dF=6YO>Z++G}Q(4~ouS!t6VyqmR*D$O~z z9ur?1!#Wn$g*!bHQ<1v1qdS~8RHIYs_p15v;00GsRTdo2l5cKet()3CPl{EDfk^EZ z%@6%ugFd2fmOHA(l<=}&YZ+XaA|>s(wRM1NCOMR}zucD@!2d>;RBLe?bYd^|qIODp ztwVTZWav0?=Z08uy1j!>>@kIj5$!{m0c-9-VzOE@({28qK1F7|EgX!S3W*FB0jS~6 zawOd-o3y*PHZaG{Hd0zrcQ_sLCt4~xG#j4V&8U4Gn_@^YTK=q2FQcTYL~u7eo-$PS z0U^`vciX_6b5AY!?T0>)F+1ryonPpayk6r#*abU`Zj29d9lSP!M@l%(Avs#>-A2%AAsyGLhc*tjP(!-gXBKQK7jv|wzMh)fs zF^Ag4)l%Z5fB*QAo*6QMfry6a$n2NpU?s(3Nmvu)lnsBLHvsVm}Uon$8j~)*z$##nI zee3#q2Rb*_>eonN)~{_wDSQHWt1pi(tsYk`(vEJ15$`00J^!Xt#f#Ei>AU{PoL{_( zN=Oc0CYHfZITcos89wIG*>qiMZ?ft5ldH6ZEB#TcUkAb&-i)kJOQo_*-jQ!5Xvlj$ zUdCuOehWq2hS)2{3%|)j*?QYdlRq>hTbxMOv`Qh@zJw zk`l$qQ|V=mT#Xo`mlAh)R2!bPkl)>PbpKLjwp+_`8@Q%@i_*;}iflAfe=O*gYp%)_ z#%g|^j2aRa?dTm{`epe*;ch{H>6Zr%l_RoBlt_66TAvh^r< z9yUWaXt%t-tsCPTnpj<2MN`60FZvamN&({*K*t=Qw#iUmJv#iU$0N&TQ%yssQ%;An zVtCcULBijJHu7Cb2iBJb!#!JsGgg>s(o>W4n^)(Bw;Q%fmL=*+jqR%%`gpcmZYzc< zyx&CR6I3Rq7rG<{brl%Sgx{RX-*KD?*Bi|o+F4ZWrCoa)Yc`>^YjDoI^SzR$&TX6| z+oLZg73#Kew3Ex~dk+zN934;J?zyxGJu#HReJzR9}4ley?O^PCA6ASFZv; z``S~T`?s)0Ddzh>8%XUZR;{GGGTn0Fl}NB7b6+>XRdu>Ehl-q;GR*#> zEDS2paz;iHDX5>}9^!D|tz6%Bpe4dnYC64RI>%~kBqK3QIW_7|WEa*uhx;E@BGMYv zKc*%9KkR*VTvczjHz=VXqI8HJy5R(e!yzT4q+1Y>ICOV|lF}hv(%lULN=OURDF)pk z9ljg=&5U#BzB6;6j^y)VWF4aq_v37(xRC; z&#H=7qc&f6zmM)cCc4{6H%P=v?mWapazAPya3MJwGwumP)M9LigGGv^^?{2#2+cKX0Y}nE3PTod{~hj&uQCdIH<=3W5qA^efh}XA;ykeCh^Y_P>vn z^P9sTafy^B_DtLxtYf8hFfLttvYj_8V(PzGYox-G|SDoy~&K582U0RPg~C*e9Rtnwk@#XTiZ{58*s{`&~;*)z3GhOEbs&QH;)Ie#^9umV^)A*^jMcOIpMrG4u z$I&lYI}qxAj^UwEHew2uSTw9}3avG|El#V?cQeQ@>9EfOvkg$QUufSZ1ltTR+MY?= zPd)VByMJjw<^L+oS*|B@hCo#XJHKa}|H4RxT>BMyZW{H|0am69If<_ew>{5}HeU%% zcDN|lhyWi)DD(Q#ntbN!FO=QcItYAd=_}_sgSF}BO0uxQJ#!aeGbTGJt$Op83U0*A z?&!na?g~}O5@hLJ>7;Kl-MirLJ#xYz(ph`Vg^W1-5#`{}8o_y%A87gCjV=2QZ6Zeq zY4K_OFH&R$r`^J9qgPw})&)bRk2muslC|#E+44-AxtX~=MG+B|7b=UCcdmw^8{9L` z;p{L)J`0n8^aiYGk)^*RO=D~FyKVZ~6_gL>`%f%&*NygLm>BgCB zkIOIaB3rEymE0Yag3C7^i5rv_3MJGjoxfYZtlb<~uDFyum)ZDGzaf3%Zh$+wJ~0tx1?GP>KZamv#> zyj$>l$3dflx;1-)l*Yx&bf2+jwFJYXhFPg~xn{3inIU>!r@2BZw%}!8B~m;}w>!Xo zYRug-xgj{V?&;rv=u}p;C~1Ck^kH)PWMEz+JgS*tqGK8Q3V!yYfG$?0OX}VSa-W)R zVCfo;ao)zuD0f;?cd?!usXbKt_)eLke`#gz}Z`n}7bu!uF(<-FJd$!69=RQX8BR>&?-R>b{CXQkOA z{n8?xQTL?#-2PHq=w8+-{=OjH%$mMQxmJ&ctO+pXr{>HI(yd zYR@;ah?!!MS}CK}^TQ1g+O*fHsF>o6*sc{^y%3a7j&QI{O%IJhG&z&tn(JjI;keqJ zMQ}#68PKK`3KMe?s4uKBn<|;TlvGjrk{ag22wbFj4DhqR^wK+We!u;^p>*rmdha>! znY-h>*TJ%alQ^qh=R|UCiP1b9*glGUyCviAh-GeLp*`?C&t*+N;HJqkjpCBHlAn8- zqy3rtg0b{7$eec75s(HP$X%~;4yV=Ahs->7bdnorv)1lws*_{9VVe+YHPf@i3`5FX zelG44J{&E7xIfw~qt9hP;|sjf{PB@rcPEawz>D5mcL{l3-gKzD)z$kU?}R;S6Ol3N zr)bn<@N99HY%bGzX#$Sc;%$8b=0b|)hd&|F)b5eza*NH@+iD&k6$qJ2<$S)8)^I%6 zQkk$(_srvYyLCn_@30JiQ=DvPRc$T}5;3l2r>~z~lGC*jY$o$c#S#95I6S~~Ejn5G zO%gs}9Sd*j2aEAL+l#8|gW8L8a|SV=VjqwQC0PN9isRIGts~Ekt>(4!@xh$wCxvda zB%PCIfmW8YeocN~c2$r}l?v+01L5t8%3b%EqFn*MyW1K|f?Im&axQb}>iK-X%FMFl zWG|k5cJ83M>0=WurEv1B_M?hJ@%IC=V>7f?V@uDH%21m+bpy}r%tLds<0xEmI*a{C zMV9B>GvDooSpGl*b0$9M%{!6W;%MBM3jww?*;=@q89k4-B|Owm=TL#W1QOS z>{L`#h}=W&s!FhoC?%M80TE9AwU>!S$>w>9cbcr%m*Z5$9rFcwg-wpbnRK>OJ73P* z-Z|g4WtWE=n#%-t)^@|BHQ5-CrgM36%QD1MDGD+Rq>~mBMy0lzhY0uc5102sFHz}O zLJ6Fmf@M92xuYjXyYA>aA?1zEci}RT)`L+ArEg{u%EEh|L`N5sul3p zY>Pf0v8F*8D^JumB(`N2$Qy%VkE3LUZzSjit>->$&t&Q0O zouf^wx6x^?@OJH~)T)NP6Q+Vv4_yb)W8j-xK+JWyv~-fvqM2|pF=dY9U15y*W% ziQO$KZ&GW8Po_pqHfYbkF?GiDygO)U?-|or7ocs2N|JmYh!Em^ zC(7r6>m?`Won9)Ah=G=X^_HAVqZw!X@yB{fgi)O+Y7pH%U(WUb!Hfz7x*&5BhWJmRA)yI zYRbti2Pd>^s>h-oHNc)(6XXMVt;|fca42;62ihI8hr`HSw|Vu(Bbija^EZNY2PDUz zsB)^^mXV4xd`Eifj$X@~CG*p%b*=7#So^0%S6n+5RlqWlNx@ z0a3f$fvUsc;#rP<8kHH(w3{K!j4dVa=!h9x(z!VLoIO+A+2Eb3uo2G(G{!8vBJhA>g;Yik-pEH=yI`#QrC(*(3P<4+@zdH_f9XL3V{$3h8~Ht+VTMf1J-Qf z^43RQJCif*RlGB#(~|=6bnUDGo9FntR-Q%v8@>FG@bJ!%MsI^{W@@t5Ld-}HzN9+A@yK5flO5dE}SgaO`?PIRDOG>BD(y{Nay-(s- z`kJp28ZAY|IMb_bz+StoA9vl}+=op%06*!@D6X({bcYWbF`W;lymZ!L*rE2tiH<rcExZv2E<5kgOSg zdsjg?gSZ>{KyOg&=#D^5$Kmkmu7Q)X2$`xBR%mtrF&QXQTsTkmtn5Vd9DiPbS#@{b z$$|a8aX$3yeN%az&WPp7G#B2a)-v6@^*VV|;|jh{zIIM=I;O-Lf?tYzZX|K-`t9Z> ze;*X()b-##9vi1}9ZOZN;cW?)^&h4@Os?jQz;3F$y|ZDwK6fVkI3=TVOSUXwL$XoCyt*;3K{2#yT=VQY?5-1yZdKJ*u&otW`2$fUZP9FqLAu{k_^uZ zBfEy)B|SHBUf>;9X740^c!J(^$?2$WuwA;a9=pD|-)!gjr1_o1BqeVizI;G<6RZ5W zmj{-yom5DUpG18qXYv!;C*O(*@tHlT=pIEQ@W_cVC|(E%-*Xe?f@wXbBfZOIpFth_ zTuq7R1>OzX{(Ils>%C)0_xk3vACILHrW}{ln(>C@tglsR+m@Tu<(Yo2-NLn3^QqzM z%?v?rsW45SXUF?0^GRZBuY9CRluAUT6R*)cBc$~QT0CQW#H$PAN?!W~Ar(V+`{L96 ziCXUPolTv^(k^!CCaK$^Hjhd5gtg!7eGlI-U57yzSXTQG!D6G4uZ48?D^ej)zbc(;M@QD&m5>fd_WduLTzDw^UmoIv6 zxa)qxVwBd^>&ag)eSU7;@SG2pElY4onv!zYumTfxvpzg zTd0fuTeWj1!vn*`+V_ti#7(*uUp&$=hu1S#a)mvLC@MA^HQ61_G?_@OJ&IfRdR$N} zKRVgV{>k(lQTIS*uKlnpbD$Nsi=51ZR(nnjonk-?#@_D{dCo zPG)Y%RnCo_2{|s9+m32^<0%HO_p7PjtPQ)XQ8n3<@$nXx=}k)~TTRL!bZbrRQFz}xqxw~CdI5M36x4Gg*Yh-YTHEIa~B+&&#oYbCe3 zjd&g`dDqq^wi#rs9!+W6`xbP5HTBm~-pVbL#v%XGg}!WA%UbZL!~4xfv}8VmV?8{T z;wv+)X^iBKgLuvz)j|!LJ1Hs>gUP6ZnJsKKYh^8MGj|@;OuVe$N6RDbBgnLDN!W6P z-8$PqCOa;9l8Wi&b%QwYVLrJ6J&Ya zC8>?YIl}|YdfS;iyq5Csf!N_R9u9=6WTxY$7`?AWTP!CKq=&{GY9Z?o%uZa}mSW_!o2xXV|#$dS?=AQ-@_wSuc7Y8CDY>kI2`|YQ3@N>!B3e zLGCVWM#VZJRfpwOf1r)b!6*49^ig~?$xh!}1~VoVJ0En1m(A;fU_8Eiocd+1V^$k* zq3(Rv+K|>qwS>y0F_OD^bix(0^G$a3*zU|Y_4O4=G;4)u3_m!cVdl7Tns9En zegKyr8X;pP=WX}R9_Dof?{mT|W^}f#D|+gz;-Q}ioYwQXzkAPBUEJ{hFso+0d*OVG zu3mLVlSKFKb$Ok7@5;V9fEEQX^yc z$NJpr%o7A#w|l3XoJ;Lrk)2iuzk1gxADLNn36WQ5OQo6EVoqbPy>TQ^!8UFlC{oAb zuK86hjyK^zGK7*PmBR;G7erZ&_XAC5<4e<$)_VApCDXbBi`rubDW?eqRD@Mc`1m)G z*`Upw=p`hbJOOi``0fSlHOCX>k#tgLe=p^4ESnr#tA*@Q!IQYcBTdfV2762E+PE4n zA_8Xr@n`Rr-P0oL))_7!6&!NXZh@1 zhn4l^+-yns+^kbGo=;O6yF1CUYxdheVd3YXGAi&SP$ticbIrajU+b z(fb)s0-uJ3wHME^T&&=o<_kFi_pbVPjr+w%<&(NIP1Em6tg@o7>9!M_fRdzgUQC7w zV#xD%Fy(vFE6UAR$SWHE#J>KR!U38&?HvHR56i0~Yke~u7zhly`k$YlQ&bBK`~cDB z6tT85MA`lP39QX24E#w|Ns8$Y$|eIlYkPZ3Jv(!bpGS5mqhFL#rg|3E#+*Wi)}{gw zFhG@sfN+`t1Ws0Z792KK4u%{6)eZ~>2QwI2Tj~MKT{ebB%$&+sf&~RRm4Q!jUU5Fj zm|B?w#7_neT5xVS2mym~fO$aNU?>L{7l<1P*A^7~liFN=QTr!bl z(Qlj|Ai(sz00EStqXEhe;9db9qrRR4NDN?$F}1Kj*@2K8U=A>dN!=9i5NCU4K9J=V zdzC555aeiY3Q(w+UVS7AAVvdoz(7m}%piygOhW}Eq9!6t1Nx1r%+V2`eS)KS^dLq^ z19q?x62;Di2^?6+UO1Q)Aba~s==G;l|HK&v6M=$MtR3_$Knjlf z7N+(lS5{JXwRb>Sf)E^Vh!v+gFh=02KY8hI++J6=fU7_uyf7#)1boFO_orL@4QJT@ z<81U>Dkx-AAkGFBgP51;D61z|0xp4}W4Iwg*A3ien{CS(Krv-rtujY-MHbV6O#%TwMTyK(GGO=2QX- z1P2rd{FfT`=Lvt*-ai%idEwu$zJJzyCe|FLRt}sFhIX7*C}(?4fNm4Y>13gcvM{wY zwfdE?qO3UoUVRPa1`1XvK!6Jc0R*cYP&gb&&w-66C!Z5WxY30Nk{&->UAP zWBH%b7>eZJf^q*;lN-Uo1HCFJKmchj2OJm&6akEbn*+fE42k=9jjx{C9~wV$agb2H zdI-RVhJ-Q%1i9M#Py)6efMVD{8RekGsURlKc~#tMbBY6Q0GuWc1wpR18k9K2VIauW z`~Z%)K#(i%29Dq$$d%6lGXC;Zul(kZ8~!ngkO(Bt-abw*zAjc%?H7*X2h;Cg&{xofGb@QIsVe(k1bZfI&+#zQNEP;1hG8`_K@&qm zLwRg_f}C|dZ+*HKI4Ib9wlNpKoBVlTuHE>gRB~h`jPu6^w8z>J{;;TF@Sf`v<|l=V3(cA{oS57UkFR#k)`k#biR`AK zBCQ5#C^_Y+*WQDAs%{<+EB{l^iQC#j;}iQvluMVTZ&SMpJ3aL7Z|HAdK1uicG#B__ z0UBZ$c6{T0ppF6&=GNB{eC^g+j8d-KqKUKJ*sP1;oHDET7lLJ+h+58|AMrSxY!m1! z-BT7lXSC&1ePg?X8FcyLmd_d;wi6UAHgl36-7l);^WCJwLtH)w=WJ!uDss(+uX_=Bi%1ErGGD9d0(7FP6G^6Gr#GD^`3S3kE4! zJi-;VDfOAeN-R)XiCL1%-`Iskr#osz)G)m_=#0vIGX{=h-REmVwx;*W^`2KKrIXb} zr7Lhds%FR>+F0TfDe(ut32fmjlFJ)9u*b<;IU^j+@9Bf$P&1FT%pDwDi~z?^}MaszO64Eys21 z4F?yRXh+-lGKI3~YwY`Zn@gN|B`tR;&n92;oh-dY&xpJn;{PW6^S0QIa>?KJ9=c9Hd^q2j7hpI@CFT?ks z4X^12Dn>ZbJ}R>D>c$EBmC3PGbDM_-m^x0ym;$o!{N7 z@sC&8&`S-qRlNh)a-T_dp_ebV zR?jIbQ-!CXsnyJuHKKX9j(cKK;Tu$7(I~~+=|+J2Zsxyf9mji%b3NKe!F8x_vS>PM zg9BODcHIv0qT1uQkF?%T^46JVK!`BKcfG>k?0DI!2Srp~!eT9cmM>|1G!G&OoW5_C z47X}@PkcNZT;G~8JFlYA{@NT!8HK|sh$9k5qkn{_c&Dn>du82IO5!?$;-})7&1q;y z$2*B>-`-nZvvnUZ#GibYdG<=A&F|U=w-AQsWG%B1R4G9VLSN=IZeYAnLd+#3V?KXw z6ZA}YU3l*G>}&wocj}ag=*9i>D7S6wWg&8LKk^_J{D_=J2R*DJJLU%ymUM~;JVKDv zO?sSXZyMgH6zelcYoep?&|+PCh1bakZt`cG)Q6?52PnN6y>KK0Els|BDmY$a)k-2> z7)`(3w^Tymem4y0_Iw5*4X|9fL21sdD<-}~cA(|@IoSv|UAXl#);sDWSz`O?jkO93 z;9W`^ReH*RPN;uExm#I2O^XU52rG>0fEUYG$X}3~o>-mrutm9!Cal8oD}PBaS?w!u zny?nf*Zqep-{rnW(hOeHvz!q~(v3DIcRH#p9KGhXcqw*#Q#oP0aSoyG$lHcNCSLkj zQkmy=@5ACB3h44^UEg*Z)!OxhR8gWo0$QA>+SPFk^j;>Uc?+0D*3Q_4fCOMu5QM@QwWy~dC*i&$SB%*Q9;-AzCf6g zy~;9cW=1HD$63ghN6S~&rJ9GWiIFslye(y?!YRr3Y^ooaKh3#MB__;@A-?m%P>y;Z zTZ8%Lwof{j8fd{^mQd&;&*{LETugh4hs;aF6A}9EA+)XGl9;;}AQ#bxAtPjcv%OT1 zeS%OgrPO`{lZqkGv+wLeOM%tG!4<; zRx4N0p1{C1bM1HZJMx(z3c}=Jcgo}9gVv6H$)rf|UM-ElN;^A(`P)`~mWf@O?Q*`- zJ!9Xvk4*M^`w@F1MP~jRR;~RgbzT^U_$*WgGrq^uq8iD^BSc-@pRajWq*OE>Jwm;E z{oNp0+2{RA?^{|&h2qcdX4>)-6;nKX`tYl0#X^Myr$pL!jhjY%D`$gp*yjCdZbL(_ zG-}>;$@OwPG{li~us-6R`|j3slTB&a1wcN!$#|Z}Q!XwywjDtQnV??mTRnvOiJE9bgU$&wJLO3w(>YEK#A;;wNDYm|tze zO{{Oc{@n68JujA9ey*CsW7zi1`3*@D8Wtr|Rz^ah^fyi|+$*2LUIaUM+tl50#?EY? zw1@j-c%h`bMeCl^y%eB*(-V3ZE`oApHMf8djbbyd-R6?k!0qhIcTq$upmo7$;XS^A z_9bM_8nmSCn$P`;^pT?N*#V`3=xpmVvXlvsDnz`}Fg4KYb#}R;lsh*FNBm!( z;z~&HGTos*C+e$s*Uw8vXRIMAa7+D#^HK;Cf=UHhHUsVs8w>ix_FRDNOex0&eo6^k-vc4i#SZ9%vWFlr+2f z+tw}{I8$%0EG3y=q@}mEXXTm#sA;;Ur$ql87H97;@SauE$D|O^4B`IhXQ&#e9tBt7d&kpzeZHGa2V1Z$JJQ-4 z@x8X54+sc9W5XE9B_nWy0%bU7tNQ&h(i>+97|@*BZ!p~%_rF>CtT6p~CNl$i5q2u; z&ep?6OYeNl*1mPBS`C} zYBo|4cX%XMjRVR^m!R|HnqEwyqOX922Hh*VGz`K6Vf_p|uvbe-h7gjrn#OfrJArQ8 zT}JPQ>WdEZ`?l@^^Vh53B$=XH?Op0bKEjxIW8}g(@85>C*)^N012M>u%t0V&392dylPcItz%>)X}@M-et=J5@Hxt8J~Z z*;6Sm2p+~g#AU6nS!_YQBujcJMpf#L2i2p;&{?r4UeacFj)zUmPA@GYHL4{{hNlsG zDc5e#4dC+dbd`?ei}3q`g4z+1WPUA}>~TELaeMEP`O!bVBc0mF_*CSMG{0;!?tro< zv&5P$gP#83^gFSUm&xx9Eie|5-JkXq7{l-4eqamk8C9AMyKW;G;M-n|`|0{oQE2SRXZOqIum znio@s>~6B?A}4nDa=uWm7!yd4XnAcUNp!2obur?M&XJF8aH(o-dXuXhex0!|elpwS zBvMN_cMm)8v}P)5bM}(IzJ9qRU44cwkBeAQR1dWc^O9{>`{eJ_ z^U08U@TG&D*4K)*;XPeTG{#4~^kOWlQrHGHSzZf%5;g>4Pkh_7WTRT0`$@XA7dy!6 zIUS?bBJ>Tm-KnAni-it*gZKKsf$p(8G=*8B_lbp#MjJLbt~^5RDNK){flZ_TIv2!s)s?F+(CORFJgIXvRbhR$acKm z5sx8G?O9c8Rx>aB?5KkW_fP!0@I>V|lJjq~4-Uw<_XfVXjwL@`UKz_k%Do^38{plg zt*4Zsu@9)1ou3*cFgU$mx%QSim<_$_TGpnMXPJu5L4_7mZ1Ao@g1@0IW;kI(BsnS5 zIB6uPr=Kc`gzovBn)SxUiuW(wq?r6)P2E#M4VRg59)YK(m=k-&7Pn>^>D6$2pG4`D z>*-H%hi1B_-j1!1Tbkmecj7_q=%v#aCcb^vg=Z3rb^FP{DtBynvZ0L#dafG*)*@#0 zLOy;!m(0V)IZ&&3qBcc@)J6E|V+68;5vn8?d zMC=l1FepnXUn;bcn3Hh(p*@rlD$I|6mG#;tbEBhdOdTd{sarc?5iD%^-ZO0= zCVY10y?j%cJ>D|}E1yX^0_$3Z{vEIN7wGCVrzCiHz!DVCaOJriSgYh!FamFl z+q`@gGUX}=iO%qgH(C1ZchbxfHPGNg_*FyrCg;2N2_{-Bvdz;qZg4~Gcb}t1SH?Sy`{HNb$ln?5Iu8Al}t+Gt3D2W9KBBKUG|Ow@OylM5E7%6 zfrPIxbOF14#;!~|w5Z)m$JhN}!pTU;VSIPm^pg?RXN}0Ag$)eY@f}gg&LR*(-Kfk) zp`cpMfve0POBR(5E$jaNm_AW*ys$Qah?OF`|780n;nY$FU7}I{EkT?5SJ+Hr)Ruvo z#MVmYu1PSV!gBl8iRBN;_sqwV#$Cs8txEFm5{OC#3BZL97yZ!)Qa(qn=fE;Wv9%NB zi;4_YPw`0D=#Bhx3#`XU-bJES`;sq_Mx|{j`W)vv&xgiEjjn&v&w0aHZ|T=B6B9|G z3bS5ivmg*Y6RNAoWE9afc>V3xzRmQ`&h=%UTa~RqOQQT}*frLCF+uskRByXyrtwcb zwe;Rk6`47iQ|?r#eVB9WF3=s4Pd?_}q=9;6oU-@v@Zq`mSlvULQEEgUJ?0z0)Lz`n zCra(6cSR(X%H%;U1BWmveR zDaCfyZBj`O*vGlNd2+4&_2WSBMB6>$fKXHlW=&|DiH(w0D0hBMpHZvBK!!Vcdjfgs zSmc@8`#X#cyj(nSMI^n2I+gx=jO-Hwac)l}&&qZtepg+sxMUFx{gFancwNIb#dvxlTkH|ABR8+%@ z(wE@FxeHL*o*3CY{q)$G`d&#*0pdu$J$ zF7Y*ZVE3l4Bw;6+?{vyw^Uy(x`4X`!vdn^Y-)nmtH{|)g+~6ZD3AVn;)S~t6^sx$_ z6gr~s#p05;gOK-#6LSE?kEfr{Kin`usC;%VTobaae{K1GBr;;@buwqwfXgk2s9qd< zX7YiZIH6?~BJ5outvr8BXiewZBg_wFS`;N-YA-@Pu|ANa7HMv`Z?WFd?JqRC{$Rxl z;Q#6=C~2eKr-mF2ntQaKp>Y`9H%nL6wb{Y3JCKY>cFVo9ucVCh8+t}RM8c+nt`-P3 z4)4}*!0Y|Wj932t@lhNGE0NCiV1Jy}p)^u0D`fVg8`chC9B4? z$u};k?xagC>`;B@LsnRNw_68w;-6qM|Ex`4x|upOShe<8o7AR!EzO^O&KIXov?QUi zj&77F$tIYYk%w2b{dhxydd=MbcHiK|{O4ZMywIF7#ZUK=!Wu)zFa}Q4?|T4wW*5eNM;8gqtz@nRvKm;uR=r;QKgg>;zFdYfPn)05t} zW^6y6>&iaucT$-gaPc|#e9f7G=YYvrGs@nR{nYk^?z(ln+aLkPo%e>zSn4^YUgg!k zsf7NIimzF2gbFHGHyE^r&3-z^s*#HJO-6?Nr2* zWMCWnv5ZDNrG&j%CCx$0>vnQv16!g&4y8K9XV^Qtm=Brw;b;4IZ!u9ey zF6XT-hbKgr0p?KDlk!hY<#Yj4s&hJ?*CP@I8dfw@L?>f$NY7&0CaqEY46SIL+udxO zJAI}V=<&?9Sxu>$(ykvsx%>|tjc@J2@(4!XoRq4tKw&G(F})tNOF~oKZ4Hv_u@k#1d1-V)=Ya2E z>D%FCT}JKO7a~;nqYj7L_tfiy1F{UCO+U%8LMk!hG%$o_D6AC;4I!6#`6IBT(dJC) zBqVFR`tz=mXVp-aeKKE2wWTq(W!#MkRR{mG*!P!9`~mCCAlZN|W--0D`s~qt(-9j> zLm{hu&w|ZwFE!U6J4cX0efjOnNZVG`j2Tdqrp;2kIkIbd&FUR5?uwM#zpAm|(YW8W zw#%e-neyP7&I-z@s#+A~bT^Sx+KaWrt}?DC_m9!tJaB z=aTG^()fyVOvBEC@y$Ns$HBR65ktf;OhR&RjjGKjXm@HWZ>QH8CuTj+*`yYgw|-lv z-`1P?aU!;Z-#p#AdvjcIWNKifz?{YL7R`xbP1)faljQFzj)W&~vzmz+GLn;sy+n%p zUC=sbm|oMq(9W3|CL+E4$zc^Sf%rPq81OB~Vp=;i%4 zCGPC@tKr1D#N&_fFnTOwqe^}0C0n&t;Hbvydb#N*{tP~?WvAE+)=}BK@oEbG)$h;r zBI#4<8}Vxaip1C z@lCID7^EjDEB1XSdoe$1lAmE7HTZ|(ENjG;j#Z3|FkTv3#(g@*tg+WuNr#_GGm&X7 zvJL}I7_$*r#|f9f6k)m{I+5~Rx*KEaE!gS_+}ih>#Q z2e`tTg~Yv+SNeU#8a3b3lRGu#=h)O4myD6?9Xskh!J!aG_lJWj*vt}0h>E-Fn9A-icy_b6l<6{`&uPcPO6z{t8@@pMmWsdHQU23pZ`7HF>CIE?+BEbgj8ZEdh`Qm z+dZBku4c5zqslvT!?~V@XSPtZeykhQ5_4lEsF=M|o($I# zj#~%nr9e%~u~wyPT$IMHIo#lF3#;{*CX4gS33A#hQXZ(v;WC<%%~3s_WbQWCt-FRl zZ63RZ&RrC;JSd^|SKg2lkAdcH#qm2#$O**7Dx(K3FrXn~TbtM9G% z8NN;UPRt`K75S~#i7aqXliMpwyW~d!JmUGd=x0;+7j(22iL?=nwU0-`v>Dvmsk3D* zW!Wbxtk%5El*eRatTT+)H_pj7%2b{0i2CJ;M(T#$zLem-@FelA(5@UZOcM7C&!LD) z@^rcTSiV^B)qsYk{fGDbn^{BrwDegPrTfk3_j=y2_ULc>=WDvr3dni0vZr?)3bc-4 z(loUzKRX#hBdUS4gYn2dy84fcL+DhSCJ=WOw$IkepJs}_bl1z%(7k8+S&|+{J6@l_ zOj2rH7sqTHaf=M%k;fcYf^Kb@*JhB-RPAveG~EWv?vlgF7P&` zle;N9V>`B_v^y${CEIaXGpcn8gMxTP#hAOcr$y&%O`N2N}@o@Zf$edve6R$bzh^{{%bNRFkfkK=l;2Q2lb?|6#lvkq}1_so*= z7L2V-Y6p;Jv;lXR+Z^+YpM-}wbkD_|*6YnRT)d{17dhCk(}+n8Su8amv~&z25VNj6 z0o_dGh}>p^(!hvipYRe&(|0?@K#2qMbt>+)K07QoVqce4P5Ek4Xe%yvn*+{AI9k49 z#-%Fx{*}hclcI>4(8w^a&FDz-9YVLYS5=m6Mv)=4EZ@KR*5{y&w^4+~&`iW|zgOg~ z|61$oxY?bdw)rAHt$uJ{J*ER*Trn^5nO+HZ(CO_amOD|DQvRT@cZ%bV4j*;-W|HE# z8%^BdbtN9jFZ^)l`*_5f4;aKBf{!v9DpU2&cx9@6qAECub1AvC-^{cx&c+Wk<+9-4 ze)`cslkGxgb6Rd}Fh%GN8P=x)^7Dtxk0=ZA(e-@A#M?>NNDR%O*Gm|4^fKP@S`u%$ zQ;w8p+#AUc#hSjyTLbIpcD5jtMOKBWKi)f#;W>hB5`-;nJ1ncd*5kv`@{pSrh@$T6 zeEG3AQo*?W+7uR9y<65r93(_=5@E7pKU8}w46k2u4&+oHDMhwm`QeUCN?0&8+Ker0 z81^0wOe5B&4^zH|vUbGCN2LCKrT4}J){gKTgTWe>$MZ9l<90pwv{p*y)*W%)HT;G4>I;H{g{t z5gL!1zMB@jYKu(g^rUZsly`|2uY3(@SUpj0kZNAW^GKf$E7QLl#)jvMu%-DV_BvK< zTxws`KibPpIV)tQMT87wb-&NUr7Jj`jDVPb@K*CZ}+;Ux2 zlit2x9hvoJ=)pHZ&qnz4PWj|X-!-4{8a*s5bKRpp`h4#^KFvRq!7ABw9bPZGAxdfb zHfBk&VEmkU<>hAi5AiT5#*s%d`kRmESZdXCw<4(SXA8d$v??Bx2uSZDy(OU}ut4sR zXke=Q#(Lu#%Dmq#<->GCkByK6J!eLU&B()b1S3sESVe9Vg4`#1VFM{B8ml4cp5$bC zIz*l|ne!Ss$j|(p!(G_HMa*64PBNH(wg3V0i`{DaX3DUH9UbZJJ^dQnAQ_royy@lo zIxO<@fGWPt=0Wc(vRi#PeD<)rW=#@W!mHc`xilz#UAd~+=_#dgtk?cQhCKEiwN> zs?`0;K6?1(=G;@lo}-1J*EjDn<|1?{ADA4tTuOJb>YtuwE1=`atgKAzPt#aAnVPcB z4d|+fKAjtndmL0uk&I)Mpa-|3{_w`en~%^HLgP;O;PLRb<8+LpykF@N@RBZh?4uDD zPF75%YZtMmHH0Qu)m7NdbF?+@BW3}i(p1MYlSqxoQmNXI7;Z-X3w`Q?{-9}vSviAY zLn{O6k)efW&l%|aihD-I^DHPw8*izl6AZonA=NlyRt(d{*Ci~VClfs(tQ%|V^|ku2 zkMnAHS5|)??QT^d%nOg>_1IE*Not|e&AZo@XI<+`dllc-M+xJOC@2!})^C2Fdpfry zvnft=ow~JDI>yF56FZo&a|nM)W!4E9IX--?kjJB+f5IrAvK~cHE@@n3=I8f_D>g?? zpAbr`wCi3J#OnyejP&0#U5`3j_;<6oEh#_X}?J|_2fn3&FsIZVX{>Ox99GWYNY0T z>svs-cN#q}q0Nrxx*_xEH6}$Yk_d4p?KopI1V&x!x<)J(%I`VhnsH5F&x|JN35$?s zqk1fET?(e@03|XZMl`-ZV(Bgec~rX0fzD&^TpH;ei=FJZRU<+4J1r?hFo#NdjC0>N zK~oNSAA{O-mDwjRVhMcZLO31cTci4{3v8bsec==`iLqKsVS4FR_MybAx}xs&dduR+ zi7dVE`=7(<@&@F*#|tKXD*TDxaBze5&%PLn8(kYaUXr?rpr;-RUJ`g@8E4HCraG7{bHwOQ(`}TkoY*6tZRhLP!)$1K>Yal zWk`=YXK{GSxFD!%Oy2D#qBajjD&GuXQQ>c+V@|8ACN;uj(0FNJoX1J*6wcJrJe^-V(rYHUq;cI_GS6h zJhj63;L8O^QOI*}ojswdzrhHk6d!kEv*FFkI!)+Y&65qUv9*`ChEuL-jWNZvj`6dY z9ic2YTc*d^D_5T~P%`$`TBMOuJxtHVWRHmd_=xJGn1nx-K_}a}ZO0dNYKT1YfHdXW0* z-&@#f!Uw@yHvQuXqV!J%XDU4IiKffVjST-V1iS~jP8klpS-DIy9pQePXyS6ZjwP_z z(bTnL%~&R=KS26bTxUfTw>z^t2{8$IOnPsrOe;Ohhz_+U^XR>iuTmyA^=HGZ4~k0) z+dmhIfk;j7SKWC>F&(b?E|&9vKWFG`l}p&3&QVB;uGPf{$q}DY43syS=@f5dxliEQx;v67ZTqJ6Kkm7pjMT;MEaP{n| zg&UzmHxONNekq%3fC_wK$qdw zZMl9);rbz5R+UsAY!NrC^80{CGDXncx z4eU7`0HiC>rDUONXljqrvq#x;8Uf#Rw>Lqd9P9yjsIdjmPKh$)L|OekI4FXP1NIA0 z2{c}EAi+FHBmxA5044E=+0oa(Ba*94um(W#0*;v~-=)!e{ZR|`f zbg$sJ9RHxd6#@ryK#>5v77hY>+c=P1a4_JfR~ElQvjWIqE+moz2?56OyTz|O>widL zzyrW=1Q?6}aq(Q)k_SKrgCKzF+(_gV5SI%H;ot#`4f`t#U(JF4pu#}cojr&19}s6# zJ5zg3eN%^D&AXfsFgG`x6F>p;AUPqNNCXcO$_0TVfoBfa1$uq2j4tG;Cjj|-t_}ed z1^fUEbQW_#5rF!Dx&O-WFfI;mZZ5!qez*M9EdF0M5X7H-o(lj$b8`V8Xy~sw`*TQK zP;L%x2p1T__4_!kg4zG#aRBZQz|Vp34?I;4E(G9jfM-E?IN)H!zX?9St!@8V?7YoY zv+l3{PJ2!}6c9b_3`}%^DQsR<{4(!U=wkuVPKs~G`+&=Eje0nb&S{24NTnjePv zQylu;{8y{Tf6)B@7V-aI)cP-81LFq3{s>?m11NUD=fOa81Ox;F`T`JeAZ8+dQ~T%2 z``@Xy3CaR!RB$lSHMKGVmM2qdtAAu{V1Yt%@c`Id6tH(?XKiH(v}yeV zL&E?=bN%uLZZHoA;2b|2o`5bV9xh-(0Tc$@1nEeC_%F1oEbo}B3W{lEIEo~B#21P86+w>Dk4Zyk=rxq zet!SAyZ`RqeeV4qp5dfE=X6(9S69EMstaj+a{>DmvB(2bnmK_60U={xsRp1nfK~jv zC4!ue{Wqog->UO(bmoCVfvN-MH&DiiVG!&B1<1n#Oc4%#uw>0|st!4K{1563H?cCa zH!-s_vOq4C1GjQ9gP5Bcxwtx;LF}yHCXfea#)xAum-BG^r(t{CP*5#iU}AJ1-{;wC4AE|A*t?f3M!Z(HqLg2P_Ow=f8DAC{W+LTp&L4 z_dyUjGygYfZOLt9?hGtCB$Z8oQ2}OUR<3psM`s6XU}nG}oG`Y(?ZcpKpu91#J95-SpJ_OdM=mflpW8RU#z9z? zpxvB&KfZ@PU;RPf>QUeS^FrW+n#PI)M zlKfAH8xR-F_RA7s`_ps*Zf0!Yf`E%S{}-Lk!wCjXUM>!Rfx$o^Fbr6QJp4c@0+fPI$pA`5eyT0gG3G-pC0W2PVlJ2(;*T zN&Ih*|NrfFAV4Bs4lsfupd*Bh0AiG3Ac`A|3jjs>y(RyNVPNTGYh`TeVDdK*#?lE9 zVa@?jmsB+nR|L}mPL6*WZGpmI>>&ObF}lLI`PlgpssM%*BrYysrBlNYIufV??%$1c zB*^-2>i!4+-D>|PHekNV2U-B;Z9JSni=XepfI{cv;o{)=y(c44;eWH+I|hgyHZ%MG4PHc`aWH<+J%Nn;4dnW*`$GR7 z$c03+|8G?P5Ay$pZ6WH<%MGT@piO@V+d`u7|M#l@H%JT013D{!C;+Z#DdKnEYoM^%pu1=vvBFN)DgR{3zL{matc|mD~gFpBJ{r~3=J`2U?0UnGflTT_j&BHH?8hMBTmQM zvviizA9c>qTo)lMPLR1}U_{D4->R8HM#tIStn~gV$;1-vdQt7M$UybV^UF-A(VSLlxRL>mF-*|N=kP*9i?6!F;-6;iKHp-W-V@o`YHPiYU7Y1eNLJIX7!b!ntD+5GVjS*@3Njx64iq1vqT}{mrYidK{6js!qbQC>CC7(NwmtT znXK=M=Uz&2Vy|;Xn_pRS4k~l~kzSuntVefCDz_39(U}H-{XP2w&M*Dk`=T6$cwhE;4A@DL&>PKIoTS6BW;f z4AsXM>~V!kTE0(t$t=>7b58_Dd#&0}C;_`E=)%S6d*PS)KXiX1IttgpWB76N5jh@z z1-taC$0u2kLC*@aVWOs*YVHK#MW)+wA%YyC547l*jTkQ7>lo;b6egv!CtRtl9qMa- zpQcz)9icV<{=Ldh(m+7G)y$=8LEK{~+T;C4y1j{38?x4{6d+-t0 zCQ@3dcxZ+!8%LN*N~=Q;RU}(Q zL_Q$9Y2H9L$3hCV6#PQ&{)UQER(&wIGBt|_EmfrO%4BIG^WOzuol6s zN{2pAG4sxz>-WjUYWFqZ{vD*)SiTw)E3h77m!>l`GRV%^prWc7CCFlH=QBIcV*9-=;tRO!PM#CZbB zztD##_z=r`GxR01ZJST9QaYy2JvEmacbI8C8=1cmjYdfhlTm#db9CqVTIq6%iKtkN zv08sIrCNTjbnc{p-^u{n#?-*RE=Kr9n8Z|aI42LfIL)V7OmUO8y=djfDnm@f1)l~D zCygJinB6@>V=r&03uhsuh~WRUNZA+b*D$Fib-CfBfv|v<3orF(kp0?){129wdb*1x zIftKm#5m=e8+N?A%G}Ifegi&_iK^cz%{uYXF7y#=0I}!|K`}?%Z@HIPAn4-=1{M%ZZx*VupDVEgkThrZVpC3*) zge(vB=R{K!qIkYq7vIFAzAA-ltRu*O_lG5(#FHpXoh}r`&p8=bEMxk2FeuDsRdNm4 zH>jtpVpCdgbw4&gghSEsx+f;41Ka$$7fJk4USGX?iA5-xqxX43dfkBAvJfqo$S&=4 zM9_7MegmTWz0GdxLFpRz%WP3mi6iu$hGRR>k6_TcIws*6l;|FQ*1bw|^Ww#vu&;8K zuf#>wd0~|g#7I=BBm$maa^HG=_2pf~>a~T;SGa;Cbp3-Cl9W=YQ&iU{Z`QVYN|gAU z?6h4_8V|*UiFiem#XcYsardbZNZwmWFIswv?sVhihmif?vJPq8^t;lK8sQ)w({$?! z@pQ#KdVb&GZ`(?`Ja!WV0m{jeviE&!XqK{uGMA)x_Bd2@@@2jp7ag5xo1NijQHb{U zTBlWD4l3j82c${mo=yv0ZnI#l$IMT^%YM*`+kA7Tks$KvKw29w4k{PpU{6SSfS4!V zkzCNhu)(74X;Zp=?OrP1r#yUbQIV-87nOZ)*)G{`=T{08N(wy-0at~h_NmZxny^uPVIU z{;*1+C8B*_Kso4x$HJS#Cyu${Jghe|DlX8GvkmfgzlwFbxM_rrrlq{49OR^Ob7gIO zSrS9;GK3}@kDlk+*7duIYhL&qkI>wIT(MyO7+H|Lt z`(7IDHQ&OjJC@2fE)S`>_eQFHY+334N}sYkFJp^SA!h^z6IE6wG{H-CC#&jgtZ)hU zS|z(cL#=3iwrT(M?oUpw?i#e@fuTKLghc1y>lc&J^%fcewIxCQ^E|WY$}Z70$!zH%xhFINlG?5K zv2Wt|hqihp%qP__+;R{$raCcvOIDHkL0}X{QDs5t!*r!BF=zaQ!%H{v zWpMzTj9$oecOsKJ{wW@V=(|HYug*JnF??$E-hBLbsBEw*EaF_jAgL%0euP%)#+ z_ewREj`Dt`2Cix6qD))YzSnE!~=IgQG_PTwFpc}CqpGBRaZP+>v5i^Jz# zVD=O%sPaX*d)s|a2&q!sMbCQ^6qJr+@$j3>g|HXLjE090u8wAZyHTpJ!YH1n<GNgKTSNwxri7L-e6{LRSuTSfjN_`bP|fhE!t6(*s29E+~W*nY3GwLWc5t43vH{1q1+Y{ zYp9u2Wet&ZFU2Uj)#j?_Iw$)`WAKiYbTj31CIJ(*BGUGkv1~rHUvO(%8ocDgrn&W< z_qhvl4y%{t95>yQM_W;Hn%IeI%b`{?fzL;k8;cc=88;VLV|1*Q-=?b6aB3HjXboWyzKZ%>|HLaL7K_z)zI0(BS<5rT zlBYoR0{_}0ER3L!O1h=b?Ic}OBzO#mPIPrA$U2)7N$hHvbq8md&8*gbs-HHz z`ABGzrZsCgXmNdgw9SRp%rfE&)Hsk~StaBv*LqhNc~R)_UT{|47gDF|%GUO(T@^+b zwI5T*PBPEEinZo&?)c8AQW5X%HQPJKi9o5-Q=!%P)Pw%Bq4wzdVl;|bQlSrp_>jX7Rx4uQbXlc_dxl#mDseVjTGac7({Y;PkA~kWm zqEK*#bB?sTyUTg9sx7W#vL~=lQkhMFmwJdKu>p%=kxURP3mWqw`bcR$POs{2HA|P3 zE4EUut9D}V-gmyBS#Nfn42e!xW?}K7c1BbkD0v!J?$W+~+mvk65=z{x3m2b`p7*8F zExtsy=(-ujc40Zf&o{;4II?wq-};v?JQToe-e#@%v>s(9ip%WJc_`zQ@lLp>#p_qtO*8}_(8)>KFSM0LT9U50$Hl5DE19{Jf z;mUqgiOM7lsvZIlX3!lQI6vw-$9*zwsc_%~LiO0{v zGCr#%7^kE>pGQ{dNA=S6x|Irc1Ouz z*1npY7bhYXg{{JHWZml3Ln=2NW0Y8RfyDLJ(93n`z3kbi-1mk`@{3pF>Mnj{7bqZh z<`M|L*S%vg5Md=dYPi>Y1ZKCdTdxolcknS^ z?gPZtsm-0VN`LL?I2BRcYK5+1T4QVWd%MPFYCJTjg^R~~ZZwv!>WG?t@Y%n-P~uQ; z5YtDqV6^_WpMN&`XrN$Si(G}-Rcx*6ey=d^m5LsmkTaT08z$A6%{7!@2TWys>p`+K zCr>;4oo_v!Z?SeO4QT0tuLl`+7wgITM*2_+w(jbglbD%cCoROq8Y?P{U zPmav_-a8WACsRDJ+E{B8PBa;6&j>!_!&8gJZs1R88Jd&tv%H-(v(S=L^SRi?72jKe zj`=`kL6^HTPW{y~3iVP5hMQoJXMo$6_G@3`K5D_oy07N3LA>USV5Q=t)}MzR&yH6l z6jhd4`y-FlMZ>K($O>x#J!7tGl_^!1}22Nbr zpq*NhmfI|ZZUvY3P1v*!)4Y3?8=Xi=_W?B!mMXa}&RXmk>r4{+5f*A8p&q`?F_@&f zZM%7U`XMuh*Q|tL6{Wrhe7>b9}}D2n#^^g*uLAphiY-38`i z#q?$oqB-8JRcmb*imvshk)*W4tK+F zLqrjZ`MR#cdz&Ur|F*Wyr`gJlxA%DE=|4t{2wkJ1;i^zy`rtwM*ziW~R5~-Bg|Pb3 z_4Y9mE%U4WGdwJP=y(w>{1HxHUW}&myq|<+s)alvxcV$TLVF~stL)91ehmqW4z0a2 zv^9${6JGy3cQ0!MYPOBFN@0Oolae%9E^E$mFOPf)M=@`6*ibK0?pyxm1q>VrUdQF( zR^52a1>xX@d-cVW31JURlr8EfD_b1*p9}L7wy45VD_1LS5LR6#D&=cW=B#ug$$(Qa zF)2I_(LJ2^yXrRYFX>}Re(}{oO0Xk(M~ru*O7r{M#K!uK_O`Dfj%EEszI=|-`VdX3 zl{DP92bL7Ej0=M=QM_X=tEO9QX?W22SIeK7KH~Q%%~oV2!(mGgw~O<)T$D;wY#XP~ z-Szt%2=DA-jjH+4by3H3-@&smlas`e>1LSRtt{PBhs1b%Rm399dM%ibD3es}0c7<;wn&f_vIu&7V?8oQ%5WckTjK!-@#24TO+ zF4+OW`%)w8jnM#12Wxypy(DU{SqZ>+;F8;6s}-@89ER!;D?%}cjp)EYLv z!e*!G!;}b1U~!M-ER7h>-L4}FU&Gz=V7q17;;mcie!a+MeRwX_=2cFLF{$pHc{;RE z;h`2!k~`Y9D>#b1>P2=QolfNMWMShUm`q$0x;qw2y#}pBpZCZHYMa`+^{+MYy&k0G zePTyQlDDYtvdH^{I)pJ!X?{o>J4Ru-|CPs$W$b31CgP=olI$v<`+a-O-|or9@TlFC zma9LgX0tAv34#UiC#Klu|6obI{?g&Y8%_HMJqxfjN`(;y&7rVns;{r8yzHyYMnnk9 zaC(9a+N@sAP3}M5w)QjY+?DOtDSuIT@{)V&ezvZ-z$Dv%6g%f$u<(a#ifuA|X~{yY z*CHciaWlQ+=v>kFv~o!Fr%U)aZeO^`xTbBfV0+>$Ro$6n_L zJMFyQk(Y>aV)7|&rYynR_>aHa(6IT&!fPf_clx|cqN<&vq+%`b+jEA|`DE+&8L;Y! zFz;{OjK%eSdl*bA!sWoCiR;4xCEasQz8be_Mp8gl|2u@yhJS))|)zLZk$7T>16?@gH( zU|rt#m)^{V5Y*1n7)RCf(X}wKoh_DkbZ=zg;t0EC<+Lvwtw^De+4WMUdnS9H2-XYd zFy#kxbl*!HbKmf)F7QW9P?OEZF3@ATYbqG}GLgPz6Xyl?`s)?%A=$TZd)v2FX-l-) z%Mu2@DYB{PnX>820x@HH&h7aJ#>#sf^iJd$RPPiBScA7;R8&S0srGeAJbf|c-*38H z!2B^QUj^lHNE9Bv??@8=Gr7v|)bVXKm@CJRE+k6dKT*NK$}2i;T{72sHwOu0?y#if z*wFc*UQ(Ir>*>>*J}b9m(Bys1S>fCGe1k7n@w1BV$AP}ujogwq8FF(@r)udN!@kQr z7Fs$PYCF|8JDhvSutT8jLH%0n{$gXvMOmXBiWvp!J1@}3KW4Rb6VXLvJuN9qZEQU> zz<5fV(lZs~+w0f_?^0Q9n>je9z4PSA>z2OeL1@}BcWd)bdqQUcW@Z!S%o|gzGhXcV zvGB*Kcw}B7`)?TE^3~H7lumU~;5<~eopgfGUC#L^zwbP5YvePmtNYaA6V|BU1LoUu zx%#t^jaT$DjN2 zUu5&dfM!a)az~>Xc)4`Hbkdkj?LgsHSCjEU7#7Nfchg*I5%N#hXgk8*kas(C+Pa)P zvXuyW-W;vnKWqs(6!xVJgmQdE69UU2cLs(#_iMeR!er_(GWI`Ajr`y)_L*esb=s4J z76|G+w&%$lb9KI-9V~JJ<~0SQ8r7 z_7@JAtCveu#=n=a3uFrEm$*i9|1>=qg&eiaY-f0#yE#9 zyx3k6DMQ^lUX033RThrlxf60#wB7LcpqNoFbJ(8v+P@vSoZ11^T8|?Prb^eZvudd? zHGRN{`_6}Da$W=8DrXogLDstTt-`OX{qXeNI=c~_NUHlS#?`8E0QuK*wv+8onR;D1 zF`VNV77fAaKMDCBZB-`*JrZTw-L_PlOk>h|TaPV2Rm|jF{vwf&ZEhQrvebhkKuqrz zzdsF?u-#f|W2PhigHL>Jt%Wzc9!j`hQAzJqepy((cwe40nIh`rUcBie4iWPBR}B)x z^tQ6@?xk;89D0tF(`Z^TSZ1v(8~uXg{G81h6^&A4RD>EcBy_o7E?)HGS$tbJ(fcm= zgotW&oX$bLGI%rop05uhC9cN895%^ufwD5j;oZcvUK!LzRX*8Z_H^PZxE=H$A8N?ofc80Zee5g zpbrlFvXg8#8o|#@-aC&MWg^0L-`bA;ox8`uhci?X6i!Y}zQ0BZ|K=hlr>>=b6PeeM z`Hze!aF7zk6(maGhA3E>!gYDh!(q?=BO{Dee{(qF`R!@Quq+89kQNc-1^t!zkQx~r z3zDx`n8D9;ul$iY1NrEm-|_!n$1Cgp48J{(*M*(O>%z|Cbz$f6y0G(jT^O=T)F9y~ zBKQ}E@V5XP#D5UAYX%27Oij$-AQ#9#bYaj^F-Eu-gCbg19Ms5X|B+OL8ktpu8ktsv z8X^aLz|F*eZY6$h<@5oGZ5^D|9F0s6xk)78z%LF-VDOkiikS>t0_q!(ulYi z#2x2#aWn(I(8zWuNpOPLnDZ;(+P|LAhWDI$yyw(I67TQDH6x4tWaGaYnr8x1(z;l= zf%HOlcEE2N>A?j2nau1FQA@@i5a81D&s~^+lO7ioIO&0yRD^>faFIubBm8n<;sh~- zoQU|b-`)9<4f+4LqQIl-R~8%Ks|g&U5utV8B6#_ETirK@hemgdGv4raa=UyPyfBeCC5uNDw zKOSVy2hr@*z;*LaSN?ni0wBRvCYj<$Yeu*Ar}|tpUEZllU$ro z7^l>KOfKL;461nkA5@heH1y~1cVhgy{_7ks!ucD-B*B29#vMJDtzE2_KOiv=x>ZbT>J|o z_&ELtBV>Nbtr!&eMuIET0sQ5tB` zzcGRjxkv`M_BYm^zYz-D84-j=_7+4x0QVr+gJ2$_EYNt!w;|qx*yjUFb|B6pf8f6J zz6BglL0HK76~q$}Z2&2vk+lOJ%%Bva#(%W&|IOZ?srBb4{Sx3`XTkAb1qW#y{4O}Z zCv`(y{EOg#+;@Lccv7U;LZ|~i zgw6y~z(EbdUyw3|s43zu#4$f|VHM=FfpP$0C7|5-e?(2s8z>KiR3YUN@hngl@kWG%A*Bl`S-*Jwzi)rN^SmT@ z(_du+X}A3*8{DuzlnTNAOnHfY5;tII~v4BWI+#t3PM+h9E1~CV>+k*DkLBt`75HZLD zhzv8bQXqq*88^tih-k+j!v4pQ2wDpVrk)F^H0TX#AZz+PY7U6j&!zz>Mrm_1ng=J$MyyuWqLe?&T<_|8ek3C0f~#D5_j zuwejM;5L9h4uEoYfPP>N9za2JKqyH-yK@>^0)jXKf>{CbAP8j-C@uqt^#I}t0h~9p zw>2|&Ip1?ea1dhY;b;kRHflhW0dXY&hv2qGa7&0LAf^pO7NP<;;tG)mtk6L+!_&;! z0m(9RU^N3`|Kyb-#NGnY6mY`>@Xs31^(XOv5>X6E;d8oa06v;J*xCYG zJ%AWH8=2Ucf$Z#nb%^fr^Z1;B>JTI=&WUagW{nUekN#k`B1HRlhRXrIDgpi?czXxP zjgzYbLb4FD0Jm}nEOG*3AOplj{3p|ZMU9Y%^G=2=jjV_=kQF4;;bwML=NF}a3Xdxy zG6Zho0K$xo>_Fq-M)sx%NkMcr@IEs*QvaAaxf9(Jj;jg^Hy`ih-x8TD(+=$l$?+rE8k`Pl`wIH(Q8*nG+~RUsx+E&a9YxHo6%t{t|T=)U_j1Wx^95lM=MoG zF5>Z`RCX0KbFhv;Zz%s`O71|?@eyA=!6%8gymngm`}f*IDjS|M=f#P8Tc>`zbAt0t zs3N;mQ)@=@iAwWFH{a>tD*``!e(clViWMijj!iO|bD?%Pv=2(|=!(B2=+wykfS5aO zg?41dE_WL@urRitDyRJG^di-E?;>dMLzOm}>rB^^kvmScgt zW`9-I6OYR-_pv7;=4O(m@^zA9w8sZ-k6t^oMCQWjbrShOO}(o{6njk+TzT>9n_+Hq z@nOTm(zl$?42(|Z>mZg4W&$}Kq4&_9Yw~X8p~}kisNTycB!01^DKTTK%Ewc@v`S;w z$yk4{1O5!R7~i7k3wrI_l>wzO`<|WTN_DsF?Y?hbwpda%iyHDJCkGbpc13fSweD63 zIC;ffZFMj#A3Gv5G^ks3^WyBIw{sd3-SOcreD*=VUzS!P);R4BIBFl7T}C zs>^WEs@SRT^W7@UFKlA+tlD)>O9IjDgAdBb#I^(tz6Hk)3~uJkb`78H+DWmnt7N?h zrBk&r5v3&>4Bk3?aWYfxUp|SCA9-pfW5@Z@YOhMUwKiFf;JJ&KX@aGkmf`8y_Jb!Y z;TdBYtwrscx!c=lLIowN@h@ea+bfe@8}oOj7WAOcnYc~GsEGv+1I+|0=39x22}x<9 zY3&SrPj?Rs$bYDZ-m3i4_u_44nXk>v)n?O{zSPPez6Z14qWsr5)0yv7E!>Pw{vOt8 zMD@}6Qnu>wTQSOogLg?9QPFuJ%Uy2zlZ!Ib!TCW!gt_~X&8*$eI49^|@G0}i#I@L7 zEeS?7$RNC9Y$`y1{QBx1{egqeJUk&6g?hN(iZ*x6V~bDe>MOsom84WM^N2fzDXt+W z*_WTS*F4dsYtL*>mY{>_HiDonXbIxe<+fM7Y=-rrY(IvxwedHY?m1 zZ74Q-0lz10!1%+rtY_WZLc*eW3fal|jNfkA(v*0Jitk&XE?F>V$choK4jEKPvNSw> zb)&k{v#d5vD_wCWF-=q^1OA*J#aY+aq!*5su+=Pa&zZfzf8mZs)xgtFrLvcAm=-4L zw^3QhZkJ7eyd~|E)DEY+znmZ6f6Heo@icrj{|1%hJKnf`&zD{P4A_IrR!Bytpt@M ztu|Y}!sI7J*mIN2#*;g`0mPbm{ltkn0Uygeo(f;-ugjV}p15iIo?Sli3U6;>EIt|; zBU`#oabuTuVG{O+VnN7c<@8$%iHSNt-C!t8zD+f5eH_P1)Fiul_Xm4p{A;Gq<4;Z) zt6v@Q90ncM7-)X}nv5b$Cuc2_of$*VWAi+P%#%m9Nw0O1Qdf#|=?8O7emO}VWDM#P z+1HzNdRg@bc5Q3Y2G^)~8^Mv*_cCL{Jbzp1Mi){wwYMFaCR6lzx){q#4uMlRmiz=< zT$yW`EMHWroDb~YJ4MHLu4o5(Q56icPL9dmHRw3letlN;&66|Z9rIPjfT%oHZi3UHNzLiw&&{(I zxL$i{WbtO;fy6CxeBW`=y^Hyk*XqsCMT|o&BR<3u+~u!!cYN@GJ?Z%iaSW?SJzDkn zk29KtDomUSepk{^Z^vs5Ke|)<-siS%yW0-oGlL!T^*N^JSh6|H(_{$}xICXR2PnIz z8EQA|R?FI<4uxX!PVZr}?k!PIheaBH3_tVf7XN%qUDQZ;DGf7RyzQ78gLQ9M(d@$g zhx4w!jfJApd_e>UW7>LM8(g@txo+3@Y~qaBcbfevbIANoUmbK4MZY%Kkh}60p&7bjZ&0tdyu0kLJT;1#g(q^o9H) zx(iWNylQhsBrzQrBqk~QS*!`FZD|s73y~$Oil)Y^LZ|#+USj!+$s}*JU7BU?iiBv0 zkkMUl_-6mQu$AjwkIdMhWYOWATl@{#*pF4l!dP7LW-+zdHMmMzU(uENi~`rg8|+1c zMBKjPLE2-}vP&fAS5u@+UZ4r{z?_8fV$7UL`-XCk>eVUlx_^E6HFDJbwQXuyR6bP= zo39XwlZAop)9^$Stro`YiSkmRD41n_l+g4F`W?NP{zxWzD?k0SPtFRLjJoy*`Ceo& z7b^L~a>N>(+$V1`wDR*x^piKne1)64@7y7yW;apcA#6;zEm%j}DN@T@a^s;j^Yh57 z1>bjgm1>q=>SV;b3zc8Z8R^t)+^>3zGIspbjKI_{X|C4FSn z`!1%*OHY*SZCJJJ`{mc#WUmXz@J&;vo9N8J{l~{2nwj26H?hU?A%4iP<+VaXp7ZIn z`TnarGPh{!aPSr%Wa6J?HO?i>2Kn8bS-+*l5{Ul@MYiEfH$ed$d`*>;xLZCDfX@>^ z=_Jx-koKx^L4x~BVU}zt%AwQI+(%NhSmT}1H&Za`dS|k>6b#QDW$3uaO0v4GvhXb) zld?*zbaoooDRnGn;b$AK6J#J$_#;>6vc2|U?PlSr@ZlMfy1eB@jE_!4pD3-8DM|4) z<2~myEUua5uF}d}cM>+^{i10a{fW(h=En8pi^+AzS!U1_exC`LQa$jB!$=?S;&i$! zuahDB;+97oogGh@W)rCZR_W&V_S|rS`NLtm>B0%iTjNlOf1~JxqX@0iv9;%3GQT(W z#O>YN)1hSJ>{}g}y2K%SlBakvmxwTFiQYfV#YjI~#T?jR9l)2$beFsOY~yJtqf#y_ zVUKx~hsWh2Z++|dh>eYZ&xkuZn0M8ZVK`)NOj`}%hH{EkTNW*1f|^Q)zSr-I{2dk zt!$UC%NL%AJf6!g%WkFd=lXQ*vf@(N>nx4s-PQt3&(=F*7ETmbjLb06uQ@;SQjTfY zj}x#=Wh8vms7|WQWInXof^zZe?a>GP@hdUPzLH@?iS^c}-$PhmUX=7YxO2OUS`U_$ z9(D#5RwyV(&0ZlSOp)Au98>M0b9Z>Ki-L#$p4zjU*HE#Y`8?k%t?sC{xsY~P8JDZ0 zUy+r;@t3J)R*j&>RjM`_MY*a^DAeV9@d)2AKFjPm$(+9eX-(D*+v_(P9NN^VhSF@K z&k_%2Q+q7kahal0da0RSFc64E_IRuLbiN^S^>ZwA{*#3;RVH7b=l$#Jrd;%| ztv9`9yZ7V!usbEyYC1(=P09S|aj1myTnDq7wis8(mkyrW^Bq}=4GJ4<`(2_Kn&&8P z+r3AI-{`5(eAO?gd`<24nA?lhtRK8A5RA79%V)|z{7lkk>W`fZz!7_G#%((ve#>4+-$WvMl33*CMNb_<3=U6!c&HDqVL*UeZ909!V=jVrC z=a8s2zzcpI^8%b4fl8hqpMQ)%;E})n{wKEm>-_l^fww{d3W@l<0Nw@uBWi;@3$C1h zC_!9D>>=KScpBmuQR0vCh^y!C0k!)JehAhrL|`z#eU$j^>k#sL?$7z~-#(^s{h7=% z@(41kgXKs6n7Bj!{&zG0#Uo#)X@&fJ1_<-l>io}-RliNNkyZUWU=82zU=4tg*$^$} zL0T4|L05y&Pl(YqqngxJni~)qB_6wYm0qBkFPfSZ3pk(Jz zhbusJ9zbmV1Y01u^S{AZynhF_-~kZD|Aeu){s)ZpXDR*%xCOw-|L724U1AqYASrx+ zF8>UIaMA3GUGBWr^hvY-nhRFFC~royTw^TNV)TtsKJTfC3#h4*Hex6j9^HugA?`JN zBv5sgp3mfKt0i8(^di#~M}M_-;g&xTXb>lYf|-=F$J;_ML9JU2GzK z#%kAoh02Wp?Z*`Eyf&|-yYHdetFNoZHpTPS>FuyxJD!)$E6wzwhJ`{&&CGSppT{uk zOpjm8!V`v{*rXgl+(4;geA^c9^YXD|#V}erV9QecG%|GoZxDw=~Mk>wqml-VN8ycCG_Ke!DT=>Mi!TW-#$Gfl2 z?T-a}AG`F1=uBVgh&^8OK({D}EFqc8f2K%p)X92Z?rDK4>GS)gWxHB;`|}-#>jd8leiy|#CSKt4(t0D1 zG4fKPrmg3bJY}tN#Q0^>B9Pw@^hMo@w?5ej!%zcbQ%nd2rlWh-oGf%#WI*h zFNzUBlNv{BJt823EidVh$~R4Lcbj}V;qq*1Ec*k&d-3wVIJk9?87x(X3rW(rA!>{! z9xpVK%uAD{&=a3LqE6Sj&P6cV-L7%r;hS~;+1=1i8rA#qX^9z)i^oZD5alU3Kdk_Zx>NiZ zy}1%_|zwNLjrcp)z}=j@La#_TY{Vo)r!b|pu5!vwLy z+hmQ)rG5xJ=Fp*6;^;Gy%&om?Px~@%=ts33wH_9YQkeFv+Ggf^l)fNbep+rL)0b;v znU%M*H(4dPxM`iXi~WuO7+UZ zNFQj66S~-38>c`St)+faZ&}2)f$`KGq7h0-*O9cF)>&teds;5oc=#c>tYZ$^b4N0! zY*<|Eb7~^gEukf*HHLmF>H4k_w>+kkq-jYD;nY%_^chU-WAEj$Wr2a@!EO2z#!m+r zudb$w_cr^s2K4TJu9Gt$ypWeMjlGY_XVraQ$9Tc2=6S&=wgn#TBNFqIOVZ7SH%Ctj zr)g5*gCj6nHlAB}fey1ftaPn8wBDPQ$?^QFIW`TAaUF}R+4t2i#j^!$+zFd;T4}mg zIJ?BiqB_S|PuThPh0cNYE;H9_Tl>LYrBaI?Nei~MS7RKqnw5#N=$LGtR~RM2XX0|y zh=Ls*%}2ibWrnv^T%QPFoC`(mn8TJ?%!*hy7tJ}D>u}IZlz#CZ(e+OSiCh^3HN>SA+74@J^6Ja zMfV~(8rH?Orf{%~SWze?ehVsT6|Ra*+QA~~<+0PAx+^5%p(hU-+q?y4uP?Vtwl6-S zuU$!XAnsB!Wyk(7{$ldG>~g_tc^(^WMJiHawpBmru4_vY1vr-BWbLJqPrreuMZEpNt3_9*!aBF*0lla-hGh1uyRI#V6X z$qQl!W!?}6Hx}q=r=)9jG_{GOOLB)PwaQV^>q&jE+F)yVW=eYZprM`Sc&IXK!S;-N zB%I*Y=<}7mgFok#dL@O=yZJ#YAQr=pTuL z&u(OJixEzfCs;!3^ngi8S>+i=6p^f;850L%2*c&=XH#ztftS(oGu3EUk@hq7vc zCm+mug!;1sn;&1k^w}u%!hT+5P)BUAz_dc|h5kE59XjNkmJgoxWz8of9eO28wAE=U z6r_){+NPr74f4C2RY`do>+Q1Q6I_O0qaq^`dVRfTr0DBck0`lY*^a#lZz^;2Y+@e3 zE(}JbGTeIKI}oB&Xc6{guccn>D6|kxxQzBOd3LIhyp=sk4F{F^3MwhODO$*JCHmC6 zdqLl}WrV3;z4@vf>ltMDPPJ9bXr}Ne^F!sf>X~4mC?j1pt{lqDmAd}7wR*j!V^_Kz zAsef2=3~(JY3)ebk5k7T-sn7oWfkG(SqD4hjnZyid>6>&tdA+fdnQViTQNj)_8I;l zTP%|PYr=>do%rzJ_Z#*so~5tk#fD=0)b0k$^=FsPBx6}q@!Qmp+)=1V_Ib!*|NzpcTsa0{l;THmm4K&;?Aw<5w7!C+SoY6zeT1 zDsqh9nD{<1_&xmWru1sdX=qilt*&x+tw#gTFj|knAf|fwop=Mj<|E-`JkvDxmAj4C z$-J-c1n~wkvdH<6YK1PNjS#AgGp5uNC|ludGC4cTPmS_h{J139MNbl#D;=2CMId{% z@#^}AN@Kp@^}G>74Mta#iTgHsS!lb)xla;EAhHeDs-*ISDaWB}okAFy?hu9<%d*@q~xuVjD~fAcHHC-^oBsw#@B1qEXUOmPjwtaUWPZ( zTOq<_*<++gAec@YbGE$Yb*GJ(e>Eg8)ktp$uW{n$H@0%Tl02Dbn4Lt`+FIT%^wkE# z*iFkekX^W{R|`HDX~6Xon+1RJ+EZ6GqgY{%Z1&OCx-Twd`HpafBLTCgCxlFHW@1e^ z#*ZtLvhgxXgA94u=hm1jsk=Y39x0RSxC(5Oy?-Hwy{ppk;1!t>`~JIpoiJSkyhCLY zSX#A=ya|(4T8jGD@@bvG}M_Uii6VJAuMeV8Ne5olI8s;#{PQ!rKXJJb+ zo{BpkOm-wq==GDm3ptpGqC7oheBxHz9>kc3;P%bM4a^s*ulPy4D0;QtL0v<1seiC_ zQ7G!E;pNf^YwfbTFW?*lsn}gQ<+e9EPZE;y7noua?9sj?y`uFY7pJ3B9hgZ*$zXdq zukOL5<@03=?{bziCS8I_+kQ>qm-(ZF5Rq9zqGyR`8SxpRYnR!f%%Zy2 z`x6wbiNd)Tf|cY&2u>j4XH@vB^mOlvc&~mG_Rg{_t0eldN0$NP==*hbeIXhEY{%vq z{+}6%|LpVre*@+JCjk3rdH>g?@IM7$L+ZM<*rTwZA7%RWv6X!rQ?H@9Si5Vs(M__p zfS^{VhP2nsEAdV2)Z;PVogctn5;GGCS9~C%+8AwQ=H?PJ`-GttDYNF2_GYyg@Y`$C z=w$CBEAZDGs~wQfh}4>_^>`;0J>n)o2}z8>*AH`4>kUo(cAlmYxp1R+FA`z z+_$0ey1cqGzUi2W*yh5;iIzfl%XTN-)=|9lHl?7s*ts}Q=VKoGx68gIR3EPg@XWfr zwJy&!R^DODp;DC>v&)sacecErp!gQ4H8Xm`R!OqUR-^c?%;2?Tpktfslk2;8x8qJP z*UW*;lb@OvPD6GZT0=$LN>?(?`@2rl`kNy{N@R3I<7 z7L9h9lm+%6B zkpqupIVVJ^KSvt!zSxhGSUDM13)i^~a=2a})NcOxtj5xQLbIColMG1H_1qTWz=B#) z%}s@Zd!XiQESqt}!wcO?&+TvcqkS5)Cs3Q$U25`IjVzXmKddjychHKS zqagi^8eZ|kCQ0ibBHR+@3r8@ailGR*CAP?N8xHo(kp-`yeB*~gHw8a^PZw4nb{`n{n7+t$D> zMOZ_AODao|LiHefQB1?NMgTJ+XiC8*BbG8PFcp*A>|R>Co4ZE8hN@2C12wYY#`{El zW*~B@S^eJUco|Er+0BaS3#kNY+ENBH>OM&j=}%6PESBXjhjW@6`i+X?6q+b}k!}gq4 z*lTqm4aGW746!<#TFo!fi*Q=Mlgbz9hG<3!%0_tSWDA7Rx$3lbw>i%JK#BklkkJXA zM?)}J(4Ch?`olb&c5MObTJSWTjebm|e+eqn9C|}>8(L`oEAQ-{N5&fL$$^K59;uuj zfZ88KpPvtw-0z_3JOihkx#_TW{VCUAp(tBP+n}m+K3OH0%7p$_O=lz=(CAPVRMJ-s z%)F(<>DC+2dpwyv$60XdKgv6 zNew8k^ImS4?}kxacWZsWrX?cHu%NTOQ9k7c>z!7KZ_LkbL5(FB40}f3(HXVWxgc(k z$S56lJ{+1G8Ded;Mnt*cyAm;Qtz6`)mS_Z7q|aJbGEYYDN7t}T!gm2cOTtM&WcZ!X zvcIyy!_m@^5fcerRQ1?DsDn@@2(?pkNGup@q%wyx6%p8qkphbIg-_NBKzhJM0;Pcl zsaol&>33ntBs@DzscSOaS*6t?;1Uo$+8v3w%uTFOa)i-Q22K^ZkiNh!fi()yvP4pK z@FtKn@`1njp-bY-0*cv^osyv-;VyKE%q&Qo$B0H5sm!PXcwP(?N7SjoA1lnJ3W!w1 zJPRV@&}0DAy)|91&rG~C$&p6kN`g5&#IMnSJVMw+1nu0jfHlHiW-zS{Ij6C!Bf{DX zy7JUT6b7Ae6k4ObhZF5f$PjTkw5pg$$>ku31*N_e+6jXO4JZNTt}Tg$7%MJi_OJjsU5RFM!vymOQZMdOyY)yP7ss;Jw%0UWvx3LNtg~WO{VaZ(32a{XR&Lu2t*LPg!Sz^{ykUoX^riw6ABG6PvQu^-}nYgT& zxD=f%Valw6sHk0Og7HGjoDBiVxn~@1aH z6C;Li4&v!-mOek=&fnTROD(`?zcI7$h}`tFxEP%exzWwV^)Gx~i-PpUIe zcE~CX56bQ_>Kee(N%Sc(3~R*(%LG7glOvH~h-!`zkkGxTcqw3u0vUu-EktD{xYHf)Xx0n_g12ac&|lQGo87r(ir9<0wGD^Wbj$FgLYAQNA9jYNw| zFDyNxSe=$Cb4&pbCeu46MM$0xJ^>4-R81Di5~$I{2Ej2r3_(PX2#BThA;ivSx=%$C z_>(jDbUDJN5X?LbdBdVuRBg|g!mTFuBnzapfpqv5D+882f5#NxA5p~ETmZvwWRq*$ z@5Z|o~nLBnz{C@j3;oHE!J>f}^d78q7XZTy@47-=#Z>wKzjx`Q`yG!b-(gkgUbXpDQyqfw4Xvl}MXW zDAVQ<;vn~E7b2NYU$lF0lck%H5Yi#8sV3iyZ$*7f_gZOkF`Ox&l<%QDm<;=a6bfBT zdwQowJ1tIGjK-hZklvwH{D^7AOq^sqS(^NLj>=&4r&fN)-of!XG_UvBz4Wj-rGKKY z3fzNS95iOiqAH^Kn5X4QQrpn=eioNhlbzj4lt~1AN2QR-_2K2|i>?oVlaosGzX9?8 zC};f_5dYV=`#*#Dmb$jx5gWo+uJRd>@ZC3u*bIXN0>O*8({HSbY9iLSHRsOrjl4nM zBB`QDW9LV+?dzT=)FyAo7MR~enD?5{R{UhQee7mX&D#`e;R|is#eIEczRbI$Gixn+ ze=rAISG96irwY;vjY#m)jz2W2ApgCoG&g6>J zAI6jG`wH}0_TF|5sGfy&S#$56X2Q@FQ%IvIV-yuyx)YUx#4ypuv#-tup4&aI3NA47y?sZ*wz{pJNy4xFBbLR$G;2kt85cY2Bx}nql~+ST??vgxKbhE$zn)EIpBEvR)@LtgTCfQQ7dC7m z*pSBHQ*;8{&Uz{0`%rC_ZT{cqUU+I#xen$8aSJsb)s+u1*rJ{35eymj0Va_Jka+^r zotUhbDPMGEv@%BtkK-x_KHh_gMLzjr5aDI;6xd3MQPC+|9Z9+n{Ah8K@kFg;8hn}h z9vHGl@%Lmf%-&o3>{~EcSH6R^Osjj&*+isn0tuGZfi5>+@=A_^<;o|;%9x+nhx)fB z4MfAsNlg=%K7fn7*CCac=u2K;ta2)SaQb;iB6qYZ;CY<^FN4IxvZ?F)TMY;hq{@lR zsuZu}0fAixl^r4M38ddsw_!9X)*HKG($oyD+kbHi706u7@W@c&QP6V|=-}Hw=}^0j zm?^-~^k~APZBwV8X4O+FEuvedaROnDS_UO8d5%`v)Jq-3;){uD@R|{?awd`t>38^M zkONxec;(lRGiWQXa^6x@aNYdau|*j3!P9#NTBFQET(2Y4Isn;K!E7U%ld;3nV4c<) zN9vBO-usj+(U}K}Vv&TbnF&cE>-xUH@KVSNc7=N35)!h-@838TnQ97(@B)f(0!V&4 z2qX_tNY7D7_fbf%aYzp_NWTXuDD|Tf9AFY1q7v_@fs1uOr9M6W4xE6u>an_#qea@X z8kJu}l>Jp*-TC!Uo)#y>w6Sa20H~A-(y`8QVw_ZTf}~UHR6SxCYy(0N8g1-zucn1^ceglY1GYx+oca)D|3x&)%t zQ!Dh2Xmn=9I_0p=jcue?D`bIl6ssH6#0uq*UUf|2!#02ZgjV`g%38kgX4Nu9$r!A2 zBu6Z1ZRcM);x%Sar$j`@iUQwZb?Zwoji4rjx!(}=G0u2sngP*DP}yOnbihY;RC%%G zJuPoCXRysu$&a{5XCzowdK;9L2aYWUY*FpXkfgC>X{^Xu&0`1jQp8~0@Ew7^Vk`!? zB0n5gP%$0mC9%3tDz)-=Sz6*a#bgu=VF7rSzJ_j>M8tFfZICz;!bJ}M79=t2KvXYi zwvx}P647K_xIo1P!)S?ZG&GZ|0FKv`=PcJdE=oZReIJx;<|ki%3oNwy*o~_Awo=ih z4=73YQNb-${DUL5?7~|?=j?-gVJnabXrC|lE?jm=lv8N7KZh>UP?b-o94~mO$uK7V zB5jtkLe^o;*W4@(=S)MwB-{so0fX8~ZcdzQm6$TMn$iMc4)5e4#Z%1pLHqGF)e zuiRX7mnMF?ZZgD!=;cJpnoGL4%N>?1%L}QbN=E}}Nj@nz9*jUPwMU9QNJ+ybi(){b5c__*fYZv8@CJi}(jJF}=Krs;Lz3 zhoWYm_~}9nyA))(21x~<*wu<_;;U>e?ah@*60^KjnwG58?Hl}G(ej_>C^*X`zS)kLiK=&Jd1J|~@<3(Pz zyRrbCugc?I=kcKaWSM@Y%SH3?q5h;8-dc}ixyzx(W8ceK&ugX2wZh|C;ql?mwDt*; ze!gW*cC@8gA%@X-hc5Bg<=*&BKFdbx#j-<==WbTTea|!d*ewzYWqP#H!SI?40hn0Y z!(qq`MQV5ioq>LuOm3!&yj7jP9cs6WJM=eQeS=d2jwtx_BFTalOQ3%)b@vQMW2^ZV zYx!;{?~EH=b~4@O+tI0s#)DA9pKN9$#XgYT6*sUhMSmi^S*m-K_dIf z-DQlPTjfKig*49CDF_!JUXQO?o5e{X4<fsw~%G#0Ud_X)MDSZS@lGW#Uz#AK+TqUm>e!FJZ1wycs^Oxb8Wo_$# z%VrbSzcSaeWObu72MoM3IkQZ~!RdrBtYa5EJ!Cf)y%)DDgPpP+IFS!Pf{k%+!W_

86EWkB2v4`XGj(IAA#%ndedgc9C{M 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 Date: Sun, 8 Mar 2015 16:20:57 -0400 Subject: [PATCH 04/11] Add unit test for PDF recognition without DOI --- test/tests/data/recognizePDF_test_GS.pdf | Bin 0 -> 91250 bytes test/tests/recognizePDF.js | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 test/tests/data/recognizePDF_test_GS.pdf diff --git a/test/tests/data/recognizePDF_test_GS.pdf b/test/tests/data/recognizePDF_test_GS.pdf new file mode 100644 index 0000000000000000000000000000000000000000..28d78b5ca9ee7e83aa6ced5a1221293c0c26f7ae GIT binary patch literal 91250 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%0Ay`|!QIShpB2_%k)SnrxETXd2y^)!(7~C@m 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

JJcG|32HaSd&%fZ!@|te;jIkN zm~Zp=QoFGf@}ARLu;~QP$E~6Y2y_n%!2tHzgl4w^A7cP5R6(5?7*Ex<;euVfxF6{D z>|f2UAqU&q^sX@mOWOvW9q~&ptvpP1G&W{`FnK{XHU5C~!Z$DAU+$V~8sd-hdS6Tx zKtE|t$C_4jx0!$@h|^YS0KgE7DJ27}nblDY0Wg_;ui%Bqojp>41&nuhQZn+@=nO0u z^Yw8bD>rVrzkjRx)?D&sY0>S9~u zp+>a%&YX4PyXB``t4~{tx0$SYUsmhu#Z;3ws4oFiv}|ZEB&af`Uy6qsP*yvtj|9tH z=J==5XQQN&6kWn{Pk@t@;ujmkRyFO*!Gr9*KUIlW`%8H~4tp-kr zfR0{zC3_!fna3sE8mp;tN^m*st_(^jIi#zEB^kLJZXy>C?U-I=C_L{FVlj=EsjenV zbfjtNIHWc+xZFz*E39jED7O>#hO6cbhZud-@QO>#Y-n+(oFVq84HxH5(NaVe(@gWK zImPOY0epDhu&TnW|*(B`?36d6o~t^nwm) zJ$82l`BiNEyQW(zX!G)~byW=e68v|nQy?9n3AEk^_Ml(d4~M|faC(pTejc$vGE&|+Bx4!+D7c6eiUe$gM*}w(#b)N2OEZTpea-$VzfUl=pm{#aw(t_iItJ% zuZ_Ht?S*|1{e3(;L|?3WLO)lXh+Pe{^lNBg<#VYE;!!W{f62EOuE<*K`YFP*!RH2lFx{%(@Q5t5Squk-&;aI zUhX})f6IxzW(M8W9`-R)3f1ZjZj1>v>rFDt*ty*z=XI|3V9#UT}VRtX&QLc=)k5nqi#z#yqPd3LNbk?5C!mm^uZ%Bn_OOFp`v4VUq zIFPq%H7vA%_Cr?+>rTVY-AQ&0gb6;324=b^Q(u=+Y=@>4>RNi!x_&IX>Ha^(eFa>U zP1iTJVmJ1hU=Z625(1KfBA~S70!vFbiYN$*qJngHNl14I(%s$Njleg%h_Zn9<9ol) z_kG?!Z}*yO;>?-o(J~ zuZvY5OhVb2aLc^{#~0NXPI)Li%$)9Goba)}Gd+?W_!%-k(;8UiIX|-NlAmXudVLzT-O%O`VfQ|T#B z;<6Z?!&Ce%Mo1{qE@kZ_nG|Y?IB{pGCQQ0z3lqatX`?M@hG-VbXJPI&EYF|4cJE*{ zi+!DXhvi@lbE^JJOnrG;=)vc)CX0o8=PGo^w7B!iVv!!y+m|Ir8Q9Gahp8OAqrs^7h{&7OO=av7CV=`e-tc!UV8fD@gnyU(?aWyrKSA~%0D6(8|J5f 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 DsUy3A literal 0 HcmV?d00001 diff --git a/test/tests/recognizePDF.js b/test/tests/recognizePDF.js index df0dedf70..8451150c3 100644 --- a/test/tests/recognizePDF.js +++ b/test/tests/recognizePDF.js @@ -31,4 +31,22 @@ describe("PDF Recognition", function() { assert.equal(item.getField("libraryCatalog"), "CrossRef"); }); }); + + it("should recognize a PDF without a DOI", function() { + this.timeout(30000); + // Import the PDF + var testdir = getTestDataDirectory(); + testdir.append("recognizePDF_test_GS.pdf"); + var id = Zotero.Attachments.importFromFile(testdir); + + // Recognize the PDF + win.ZoteroPane.selectItem(id); + win.Zotero_RecognizePDF.recognizeSelected(); + + return waitForItemEvent("add").then(function(ids) { + var item = Zotero.Items.get(ids[0]); + assert.equal(item.getField("title"), "Scaling study of an improved fermion action on quenched lattices"); + assert.equal(item.getField("libraryCatalog"), "Google Scholar"); + }); + }); }); \ No newline at end of file From 299009dcd5c21e0a47d25d0c8fddfa1068894f30 Mon Sep 17 00:00:00 2001 From: Simon Kornblith Date: Sun, 8 Mar 2015 18:39:42 -0400 Subject: [PATCH 05/11] Add unit tests for add item by identifier and some support refactoring Also adds EventUtils from MozMill to simplify UI automation. --- test/content/runtests.js | 1 + test/content/support.js | 92 +++- test/resource/EventUtils.jsm | 829 +++++++++++++++++++++++++++++++++++ test/tests/index.js | 1 + test/tests/lookup.js | 57 +++ 5 files changed, 962 insertions(+), 18 deletions(-) create mode 100644 test/resource/EventUtils.jsm create mode 100644 test/tests/lookup.js diff --git a/test/content/runtests.js b/test/content/runtests.js index 7e131dfc8..3d124f910 100644 --- a/test/content/runtests.js +++ b/test/content/runtests.js @@ -1,6 +1,7 @@ Components.utils.import("resource://gre/modules/FileUtils.jsm"); Components.utils.import("resource://gre/modules/osfile.jsm"); Components.utils.import("resource://zotero/q.js"); +var EventUtils = Components.utils.import("resource://zotero-unit/EventUtils.jsm"); var ZoteroUnit = Components.classes["@mozilla.org/commandlinehandler/general-startup;1?type=zotero-unit"]. getService(Components.interfaces.nsISupports). diff --git a/test/content/support.js b/test/content/support.js index 9d8fee3a5..fabf535f8 100644 --- a/test/content/support.js +++ b/test/content/support.js @@ -1,15 +1,25 @@ +/** + * Waits for a DOM event on the specified node. Returns a promise + * resolved with the event. + */ +function waitForDOMEvent(target, event, capture) { + var deferred = Q.defer(); + var func = function(ev) { + target.removeEventListener("event", func, capture); + deferred.resolve(ev); + } + target.addEventListener(event, func, capture); + return deferred.promise; +} + /** * Open a window. Returns a promise for the window. */ function loadWindow(winurl, argument) { - var deferred = Q.defer(); var win = window.openDialog(winurl, "_blank", "chrome", argument); - var func = function() { - win.removeEventListener("load", func, false); - deferred.resolve(win); - }; - win.addEventListener("load", func, false); - return deferred.promise; + return waitForDOMEvent(win, "load").then(function() { + return win; + }); } /** @@ -47,7 +57,7 @@ function waitForWindow(uri) { var win = subject.QueryInterface(Components.interfaces.nsIDOMWindow); win.addEventListener("load", loadobserver, false); }}; - var enumerator = Services.ww.registerNotification(winobserver); + Services.ww.registerNotification(winobserver); return deferred.promise; } @@ -66,7 +76,57 @@ function waitForItemEvent(event) { } /** - * Ensures that the PDF tools are installed, or installs them if not. Returns a promise. + * Looks for windows with a specific URL. + */ +function getWindows(uri) { + Components.utils.import("resource://gre/modules/Services.jsm"); + var enumerator = Services.wm.getEnumerator(null); + var wins = []; + while(enumerator.hasMoreElements()) { + var win = enumerator.getNext(); + if(win.location == uri) { + wins.push(win); + } + } + return wins; +} + +/** + * Resolve a promise when a specified callback returns true. interval + * specifies the interval between checks. timeout specifies when we + * should assume failure. + */ +function waitForCallback(cb, interval, timeout) { + var deferred = Q.defer(); + if(interval === undefined) interval = 100; + if(timeout === undefined) timeout = 10000; + var start = Date.now(); + var id = setInterval(function() { + var success = cb(); + if(success) { + clearInterval(id); + deferred.resolve(success); + } else if(Date.now() - start > timeout*1000) { + clearInterval(id); + deferred.reject(new Error("Promise timed out")); + } + }, interval); + return deferred.promise; +} + +/** + * Returns a promise that is resolved once the translators are loaded. + */ +function waitForTranslators() { + return waitForCallback(function() { + // Just wait for the zotero.org translator to load + return !!Zotero.Translators.get("c82c574d-7fe8-49ca-a360-a05d6e34fec0"); + }); +} + +/** + * Ensures that the PDF tools are installed, or installs them if not. + * Returns a promise. */ function installPDFTools() { if(Zotero.Fulltext.pdfConverterIsRegistered() && Zotero.Fulltext.pdfInfoIsRegistered()) { @@ -84,15 +144,11 @@ function installPDFTools() { dlg.document.documentElement.acceptDialog(); // Wait for install to finish - var deferred = Q.defer(); - var id = setInterval(function() { - if(Zotero.Fulltext.pdfConverterIsRegistered() && Zotero.Fulltext.pdfInfoIsRegistered()) { - win.close(); - clearInterval(id); - deferred.resolve(true); - } - }, 500); - return deferred.promise; + return waitForCallback(function() { + return Zotero.Fulltext.pdfConverterIsRegistered() && Zotero.Fulltext.pdfInfoIsRegistered(); + }, 500, 30000).finally(function() { + win.close(); + }); }); }); } diff --git a/test/resource/EventUtils.jsm b/test/resource/EventUtils.jsm new file mode 100644 index 000000000..d7c3aca1c --- /dev/null +++ b/test/resource/EventUtils.jsm @@ -0,0 +1,829 @@ +// Export all available functions for Mozmill +var EXPORTED_SYMBOLS = ["disableNonTestMouseEvents","sendMouseEvent", "sendChar", + "sendString", "sendKey", "synthesizeMouse", "synthesizeTouch", + "synthesizeMouseAtPoint", "synthesizeTouchAtPoint", + "synthesizeMouseAtCenter", "synthesizeTouchAtCenter", + "synthesizeWheel", "synthesizeKey", + "synthesizeMouseExpectEvent", "synthesizeKeyExpectEvent", + "synthesizeText", + "synthesizeComposition", "synthesizeQuerySelectedText"]; + +const Ci = Components.interfaces; +const Cc = Components.classes; + +var window = Cc["@mozilla.org/appshell/appShellService;1"] + .getService(Ci.nsIAppShellService).hiddenDOMWindow; + +var _EU_Ci = Ci; +var navigator = window.navigator; +var KeyEvent = window.KeyEvent; +var parent = window.parent; + +function is(aExpression1, aExpression2, aMessage) { + if (aExpression1 !== aExpression2) { + throw new Error(aMessage); + } +} + +/** + * EventUtils provides some utility methods for creating and sending DOM events. + * Current methods: + * sendMouseEvent + * sendChar + * sendString + * sendKey + * synthesizeMouse + * synthesizeMouseAtCenter + * synthesizeWheel + * synthesizeKey + * synthesizeMouseExpectEvent + * synthesizeKeyExpectEvent + * + * When adding methods to this file, please add a performance test for it. + */ + +/** + * Send a mouse event to the node aTarget (aTarget can be an id, or an + * actual node) . The "event" passed in to aEvent is just a JavaScript + * object with the properties set that the real mouse event object should + * have. This includes the type of the mouse event. + * E.g. to send an click event to the node with id 'node' you might do this: + * + * sendMouseEvent({type:'click'}, 'node'); + */ +function getElement(id) { + return ((typeof(id) == "string") ? + document.getElementById(id) : id); +}; + +this.$ = this.getElement; + +function sendMouseEvent(aEvent, aTarget, aWindow) { + if (['click', 'dblclick', 'mousedown', 'mouseup', 'mouseover', 'mouseout'].indexOf(aEvent.type) == -1) { + throw new Error("sendMouseEvent doesn't know about event type '" + aEvent.type + "'"); + } + + if (!aWindow) { + aWindow = window; + } + + if (!(aTarget instanceof aWindow.Element)) { + aTarget = aWindow.document.getElementById(aTarget); + } + + var event = aWindow.document.createEvent('MouseEvent'); + + var typeArg = aEvent.type; + var canBubbleArg = true; + var cancelableArg = true; + var viewArg = aWindow; + var detailArg = aEvent.detail || (aEvent.type == 'click' || + aEvent.type == 'mousedown' || + aEvent.type == 'mouseup' ? 1 : + aEvent.type == 'dblclick'? 2 : 0); + var screenXArg = aEvent.screenX || 0; + var screenYArg = aEvent.screenY || 0; + var clientXArg = aEvent.clientX || 0; + var clientYArg = aEvent.clientY || 0; + var ctrlKeyArg = aEvent.ctrlKey || false; + var altKeyArg = aEvent.altKey || false; + var shiftKeyArg = aEvent.shiftKey || false; + var metaKeyArg = aEvent.metaKey || false; + var buttonArg = aEvent.button || 0; + var relatedTargetArg = aEvent.relatedTarget || null; + + event.initMouseEvent(typeArg, canBubbleArg, cancelableArg, viewArg, detailArg, + screenXArg, screenYArg, clientXArg, clientYArg, + ctrlKeyArg, altKeyArg, shiftKeyArg, metaKeyArg, + buttonArg, relatedTargetArg); + + aTarget.dispatchEvent(event); +} + +/** + * Send the char aChar to the focused element. This method handles casing of + * chars (sends the right charcode, and sends a shift key for uppercase chars). + * No other modifiers are handled at this point. + * + * For now this method only works for ASCII characters and emulates the shift + * key state on US keyboard layout. + */ +function sendChar(aChar, aWindow) { + var hasShift; + // Emulate US keyboard layout for the shiftKey state. + switch (aChar) { + case "!": + case "@": + case "#": + case "$": + case "%": + case "^": + case "&": + case "*": + case "(": + case ")": + case "_": + case "+": + case "{": + case "}": + case ":": + case "\"": + case "|": + case "<": + case ">": + case "?": + hasShift = true; + break; + default: + hasShift = (aChar == aChar.toUpperCase()); + break; + } + synthesizeKey(aChar, { shiftKey: hasShift }, aWindow); +} + +/** + * Send the string aStr to the focused element. + * + * For now this method only works for ASCII characters and emulates the shift + * key state on US keyboard layout. + */ +function sendString(aStr, aWindow) { + for (var i = 0; i < aStr.length; ++i) { + sendChar(aStr.charAt(i), aWindow); + } +} + +/** + * Send the non-character key aKey to the focused node. + * The name of the key should be the part that comes after "DOM_VK_" in the + * KeyEvent constant name for this key. + * No modifiers are handled at this point. + */ +function sendKey(aKey, aWindow) { + var keyName = "VK_" + aKey.toUpperCase(); + synthesizeKey(keyName, { shiftKey: false }, aWindow); +} + +/** + * Parse the key modifier flags from aEvent. Used to share code between + * synthesizeMouse and synthesizeKey. + */ +function _parseModifiers(aEvent) +{ + const nsIDOMWindowUtils = _EU_Ci.nsIDOMWindowUtils; + var mval = 0; + if (aEvent.shiftKey) { + mval |= nsIDOMWindowUtils.MODIFIER_SHIFT; + } + if (aEvent.ctrlKey) { + mval |= nsIDOMWindowUtils.MODIFIER_CONTROL; + } + if (aEvent.altKey) { + mval |= nsIDOMWindowUtils.MODIFIER_ALT; + } + if (aEvent.metaKey) { + mval |= nsIDOMWindowUtils.MODIFIER_META; + } + if (aEvent.accelKey) { + mval |= (navigator.platform.indexOf("Mac") >= 0) ? + nsIDOMWindowUtils.MODIFIER_META : nsIDOMWindowUtils.MODIFIER_CONTROL; + } + if (aEvent.altGrKey) { + mval |= nsIDOMWindowUtils.MODIFIER_ALTGRAPH; + } + if (aEvent.capsLockKey) { + mval |= nsIDOMWindowUtils.MODIFIER_CAPSLOCK; + } + if (aEvent.fnKey) { + mval |= nsIDOMWindowUtils.MODIFIER_FN; + } + if (aEvent.numLockKey) { + mval |= nsIDOMWindowUtils.MODIFIER_NUMLOCK; + } + if (aEvent.scrollLockKey) { + mval |= nsIDOMWindowUtils.MODIFIER_SCROLLLOCK; + } + if (aEvent.symbolLockKey) { + mval |= nsIDOMWindowUtils.MODIFIER_SYMBOLLOCK; + } + if (aEvent.osKey) { + mval |= nsIDOMWindowUtils.MODIFIER_OS; + } + + return mval; +} + +/** + * Synthesize a mouse event on a target. The actual client point is determined + * by taking the aTarget's client box and offseting it by aOffsetX and + * aOffsetY. This allows mouse clicks to be simulated by calling this method. + * + * aEvent is an object which may contain the properties: + * shiftKey, ctrlKey, altKey, metaKey, accessKey, clickCount, button, type + * + * If the type is specified, an mouse event of that type is fired. Otherwise, + * a mousedown followed by a mouse up is performed. + * + * aWindow is optional, and defaults to the current window object. + * + * Returns whether the event had preventDefault() called on it. + */ +function synthesizeMouse(aTarget, aOffsetX, aOffsetY, aEvent, aWindow) +{ + var rect = aTarget.getBoundingClientRect(); + return synthesizeMouseAtPoint(rect.left + aOffsetX, rect.top + aOffsetY, + aEvent, aWindow); +} +function synthesizeTouch(aTarget, aOffsetX, aOffsetY, aEvent, aWindow) +{ + var rect = aTarget.getBoundingClientRect(); + synthesizeTouchAtPoint(rect.left + aOffsetX, rect.top + aOffsetY, + aEvent, aWindow); +} + +/* + * Synthesize a mouse event at a particular point in aWindow. + * + * aEvent is an object which may contain the properties: + * shiftKey, ctrlKey, altKey, metaKey, accessKey, clickCount, button, type + * + * If the type is specified, an mouse event of that type is fired. Otherwise, + * a mousedown followed by a mouse up is performed. + * + * aWindow is optional, and defaults to the current window object. + */ +function synthesizeMouseAtPoint(left, top, aEvent, aWindow) +{ + var utils = _getDOMWindowUtils(aWindow); + var defaultPrevented = false; + + if (utils) { + var button = aEvent.button || 0; + var clickCount = aEvent.clickCount || 1; + var modifiers = _parseModifiers(aEvent); + var pressure = ("pressure" in aEvent) ? aEvent.pressure : 0; + var inputSource = ("inputSource" in aEvent) ? aEvent.inputSource : 0; + + if (("type" in aEvent) && aEvent.type) { + defaultPrevented = utils.sendMouseEvent(aEvent.type, left, top, button, clickCount, modifiers, false, pressure, inputSource); + } + else { + utils.sendMouseEvent("mousedown", left, top, button, clickCount, modifiers, false, pressure, inputSource); + utils.sendMouseEvent("mouseup", left, top, button, clickCount, modifiers, false, pressure, inputSource); + } + } + + return defaultPrevented; +} +function synthesizeTouchAtPoint(left, top, aEvent, aWindow) +{ + var utils = _getDOMWindowUtils(aWindow); + + if (utils) { + var id = aEvent.id || 0; + var rx = aEvent.rx || 1; + var ry = aEvent.rx || 1; + var angle = aEvent.angle || 0; + var force = aEvent.force || 1; + var modifiers = _parseModifiers(aEvent); + + if (("type" in aEvent) && aEvent.type) { + utils.sendTouchEvent(aEvent.type, [id], [left], [top], [rx], [ry], [angle], [force], 1, modifiers); + } + else { + utils.sendTouchEvent("touchstart", [id], [left], [top], [rx], [ry], [angle], [force], 1, modifiers); + utils.sendTouchEvent("touchend", [id], [left], [top], [rx], [ry], [angle], [force], 1, modifiers); + } + } +} +// Call synthesizeMouse with coordinates at the center of aTarget. +function synthesizeMouseAtCenter(aTarget, aEvent, aWindow) +{ + var rect = aTarget.getBoundingClientRect(); + synthesizeMouse(aTarget, rect.width / 2, rect.height / 2, aEvent, + aWindow); +} +function synthesizeTouchAtCenter(aTarget, aEvent, aWindow) +{ + var rect = aTarget.getBoundingClientRect(); + synthesizeTouch(aTarget, rect.width / 2, rect.height / 2, aEvent, + aWindow); +} + +/** + * Synthesize a wheel event on a target. The actual client point is determined + * by taking the aTarget's client box and offseting it by aOffsetX and + * aOffsetY. + * + * aEvent is an object which may contain the properties: + * shiftKey, ctrlKey, altKey, metaKey, accessKey, deltaX, deltaY, deltaZ, + * deltaMode, lineOrPageDeltaX, lineOrPageDeltaY, isMomentum, isPixelOnlyDevice, + * isCustomizedByPrefs, expectedOverflowDeltaX, expectedOverflowDeltaY + * + * deltaMode must be defined, others are ok even if undefined. + * + * expectedOverflowDeltaX and expectedOverflowDeltaY take integer value. The + * value is just checked as 0 or positive or negative. + * + * aWindow is optional, and defaults to the current window object. + */ +function synthesizeWheel(aTarget, aOffsetX, aOffsetY, aEvent, aWindow) +{ + var utils = _getDOMWindowUtils(aWindow); + if (!utils) { + return; + } + + var modifiers = _parseModifiers(aEvent); + var options = 0; + if (aEvent.isPixelOnlyDevice && + (aEvent.deltaMode == WheelEvent.DOM_DELTA_PIXEL)) { + options |= utils.WHEEL_EVENT_CAUSED_BY_PIXEL_ONLY_DEVICE; + } + if (aEvent.isMomentum) { + options |= utils.WHEEL_EVENT_CAUSED_BY_MOMENTUM; + } + if (aEvent.isCustomizedByPrefs) { + options |= utils.WHEEL_EVENT_CUSTOMIZED_BY_USER_PREFS; + } + if (typeof aEvent.expectedOverflowDeltaX !== "undefined") { + if (aEvent.expectedOverflowDeltaX === 0) { + options |= utils.WHEEL_EVENT_EXPECTED_OVERFLOW_DELTA_X_ZERO; + } else if (aEvent.expectedOverflowDeltaX > 0) { + options |= utils.WHEEL_EVENT_EXPECTED_OVERFLOW_DELTA_X_POSITIVE; + } else { + options |= utils.WHEEL_EVENT_EXPECTED_OVERFLOW_DELTA_X_NEGATIVE; + } + } + if (typeof aEvent.expectedOverflowDeltaY !== "undefined") { + if (aEvent.expectedOverflowDeltaY === 0) { + options |= utils.WHEEL_EVENT_EXPECTED_OVERFLOW_DELTA_Y_ZERO; + } else if (aEvent.expectedOverflowDeltaY > 0) { + options |= utils.WHEEL_EVENT_EXPECTED_OVERFLOW_DELTA_Y_POSITIVE; + } else { + options |= utils.WHEEL_EVENT_EXPECTED_OVERFLOW_DELTA_Y_NEGATIVE; + } + } + var isPixelOnlyDevice = + aEvent.isPixelOnlyDevice && aEvent.deltaMode == WheelEvent.DOM_DELTA_PIXEL; + + // Avoid the JS warnings "reference to undefined property" + if (!aEvent.deltaX) { + aEvent.deltaX = 0; + } + if (!aEvent.deltaY) { + aEvent.deltaY = 0; + } + if (!aEvent.deltaZ) { + aEvent.deltaZ = 0; + } + + var lineOrPageDeltaX = + aEvent.lineOrPageDeltaX != null ? aEvent.lineOrPageDeltaX : + aEvent.deltaX > 0 ? Math.floor(aEvent.deltaX) : + Math.ceil(aEvent.deltaX); + var lineOrPageDeltaY = + aEvent.lineOrPageDeltaY != null ? aEvent.lineOrPageDeltaY : + aEvent.deltaY > 0 ? Math.floor(aEvent.deltaY) : + Math.ceil(aEvent.deltaY); + + var rect = aTarget.getBoundingClientRect(); + utils.sendWheelEvent(rect.left + aOffsetX, rect.top + aOffsetY, + aEvent.deltaX, aEvent.deltaY, aEvent.deltaZ, + aEvent.deltaMode, modifiers, + lineOrPageDeltaX, lineOrPageDeltaY, options); +} + +function _computeKeyCodeFromChar(aChar) +{ + if (aChar.length != 1) { + return 0; + } + const nsIDOMKeyEvent = _EU_Ci.nsIDOMKeyEvent; + if (aChar >= 'a' && aChar <= 'z') { + return nsIDOMKeyEvent.DOM_VK_A + aChar.charCodeAt(0) - 'a'.charCodeAt(0); + } + if (aChar >= 'A' && aChar <= 'Z') { + return nsIDOMKeyEvent.DOM_VK_A + aChar.charCodeAt(0) - 'A'.charCodeAt(0); + } + if (aChar >= '0' && aChar <= '9') { + return nsIDOMKeyEvent.DOM_VK_0 + aChar.charCodeAt(0) - '0'.charCodeAt(0); + } + // returns US keyboard layout's keycode + switch (aChar) { + case '~': + case '`': + return nsIDOMKeyEvent.DOM_VK_BACK_QUOTE; + case '!': + return nsIDOMKeyEvent.DOM_VK_1; + case '@': + return nsIDOMKeyEvent.DOM_VK_2; + case '#': + return nsIDOMKeyEvent.DOM_VK_3; + case '$': + return nsIDOMKeyEvent.DOM_VK_4; + case '%': + return nsIDOMKeyEvent.DOM_VK_5; + case '^': + return nsIDOMKeyEvent.DOM_VK_6; + case '&': + return nsIDOMKeyEvent.DOM_VK_7; + case '*': + return nsIDOMKeyEvent.DOM_VK_8; + case '(': + return nsIDOMKeyEvent.DOM_VK_9; + case ')': + return nsIDOMKeyEvent.DOM_VK_0; + case '-': + case '_': + return nsIDOMKeyEvent.DOM_VK_SUBTRACT; + case '+': + case '=': + return nsIDOMKeyEvent.DOM_VK_EQUALS; + case '{': + case '[': + return nsIDOMKeyEvent.DOM_VK_OPEN_BRACKET; + case '}': + case ']': + return nsIDOMKeyEvent.DOM_VK_CLOSE_BRACKET; + case '|': + case '\\': + return nsIDOMKeyEvent.DOM_VK_BACK_SLASH; + case ':': + case ';': + return nsIDOMKeyEvent.DOM_VK_SEMICOLON; + case '\'': + case '"': + return nsIDOMKeyEvent.DOM_VK_QUOTE; + case '<': + case ',': + return nsIDOMKeyEvent.DOM_VK_COMMA; + case '>': + case '.': + return nsIDOMKeyEvent.DOM_VK_PERIOD; + case '?': + case '/': + return nsIDOMKeyEvent.DOM_VK_SLASH; + default: + return 0; + } +} + +/** + * isKeypressFiredKey() returns TRUE if the given key should cause keypress + * event when widget handles the native key event. Otherwise, FALSE. + * + * aDOMKeyCode should be one of consts of nsIDOMKeyEvent::DOM_VK_*, or a key + * name begins with "VK_", or a character. + */ +function isKeypressFiredKey(aDOMKeyCode) +{ + if (typeof(aDOMKeyCode) == "string") { + if (aDOMKeyCode.indexOf("VK_") == 0) { + aDOMKeyCode = KeyEvent["DOM_" + aDOMKeyCode]; + if (!aDOMKeyCode) { + throw "Unknown key: " + aDOMKeyCode; + } + } else { + // If the key generates a character, it must cause a keypress event. + return true; + } + } + switch (aDOMKeyCode) { + case KeyEvent.DOM_VK_SHIFT: + case KeyEvent.DOM_VK_CONTROL: + case KeyEvent.DOM_VK_ALT: + case KeyEvent.DOM_VK_CAPS_LOCK: + case KeyEvent.DOM_VK_NUM_LOCK: + case KeyEvent.DOM_VK_SCROLL_LOCK: + case KeyEvent.DOM_VK_META: + return false; + default: + return true; + } +} + +/** + * Synthesize a key event. It is targeted at whatever would be targeted by an + * actual keypress by the user, typically the focused element. + * + * aKey should be either a character or a keycode starting with VK_ such as + * VK_ENTER. + * + * aEvent is an object which may contain the properties: + * shiftKey, ctrlKey, altKey, metaKey, accessKey, type, location + * + * Sets one of KeyboardEvent.DOM_KEY_LOCATION_* to location. Otherwise, + * DOMWindowUtils will choose good location from the keycode. + * + * If the type is specified, a key event of that type is fired. Otherwise, + * a keydown, a keypress and then a keyup event are fired in sequence. + * + * aWindow is optional, and defaults to the current window object. + */ +function synthesizeKey(aKey, aEvent, aWindow) +{ + var utils = _getDOMWindowUtils(aWindow); + if (utils) { + var keyCode = 0, charCode = 0; + if (aKey.indexOf("VK_") == 0) { + keyCode = KeyEvent["DOM_" + aKey]; + if (!keyCode) { + throw "Unknown key: " + aKey; + } + } else { + charCode = aKey.charCodeAt(0); + keyCode = _computeKeyCodeFromChar(aKey.charAt(0)); + } + + var modifiers = _parseModifiers(aEvent); + var flags = 0; + if (aEvent.location != undefined) { + switch (aEvent.location) { + case KeyboardEvent.DOM_KEY_LOCATION_STANDARD: + flags |= utils.KEY_FLAG_LOCATION_STANDARD; + break; + case KeyboardEvent.DOM_KEY_LOCATION_LEFT: + flags |= utils.KEY_FLAG_LOCATION_LEFT; + break; + case KeyboardEvent.DOM_KEY_LOCATION_RIGHT: + flags |= utils.KEY_FLAG_LOCATION_RIGHT; + break; + case KeyboardEvent.DOM_KEY_LOCATION_NUMPAD: + flags |= utils.KEY_FLAG_LOCATION_NUMPAD; + break; + case KeyboardEvent.DOM_KEY_LOCATION_MOBILE: + flags |= utils.KEY_FLAG_LOCATION_MOBILE; + break; + case KeyboardEvent.DOM_KEY_LOCATION_JOYSTICK: + flags |= utils.KEY_FLAG_LOCATION_JOYSTICK; + break; + } + } + + if (!("type" in aEvent) || !aEvent.type) { + // Send keydown + (optional) keypress + keyup events. + var keyDownDefaultHappened = + utils.sendKeyEvent("keydown", keyCode, 0, modifiers, flags); + if (isKeypressFiredKey(keyCode)) { + if (!keyDownDefaultHappened) { + flags |= utils.KEY_FLAG_PREVENT_DEFAULT; + } + utils.sendKeyEvent("keypress", keyCode, charCode, modifiers, flags); + } + utils.sendKeyEvent("keyup", keyCode, 0, modifiers, flags); + } else if (aEvent.type == "keypress") { + // Send standalone keypress event. + utils.sendKeyEvent(aEvent.type, keyCode, charCode, modifiers, flags); + } else { + // Send other standalone event than keypress. + utils.sendKeyEvent(aEvent.type, keyCode, 0, modifiers, flags); + } + } +} + +var _gSeenEvent = false; + +/** + * Indicate that an event with an original target of aExpectedTarget and + * a type of aExpectedEvent is expected to be fired, or not expected to + * be fired. + */ +function _expectEvent(aExpectedTarget, aExpectedEvent, aTestName) +{ + if (!aExpectedTarget || !aExpectedEvent) + return null; + + _gSeenEvent = false; + + var type = (aExpectedEvent.charAt(0) == "!") ? + aExpectedEvent.substring(1) : aExpectedEvent; + var eventHandler = function(event) { + var epassed = (!_gSeenEvent && event.originalTarget == aExpectedTarget && + event.type == type); + is(epassed, true, aTestName + " " + type + " event target " + (_gSeenEvent ? "twice" : "")); + _gSeenEvent = true; + }; + + aExpectedTarget.addEventListener(type, eventHandler, false); + return eventHandler; +} + +/** + * Check if the event was fired or not. The event handler aEventHandler + * will be removed. + */ +function _checkExpectedEvent(aExpectedTarget, aExpectedEvent, aEventHandler, aTestName) +{ + if (aEventHandler) { + var expectEvent = (aExpectedEvent.charAt(0) != "!"); + var type = expectEvent ? aExpectedEvent : aExpectedEvent.substring(1); + aExpectedTarget.removeEventListener(type, aEventHandler, false); + var desc = type + " event"; + if (!expectEvent) + desc += " not"; + is(_gSeenEvent, expectEvent, aTestName + " " + desc + " fired"); + } + + _gSeenEvent = false; +} + +/** + * Similar to synthesizeMouse except that a test is performed to see if an + * event is fired at the right target as a result. + * + * aExpectedTarget - the expected originalTarget of the event. + * aExpectedEvent - the expected type of the event, such as 'select'. + * aTestName - the test name when outputing results + * + * To test that an event is not fired, use an expected type preceded by an + * exclamation mark, such as '!select'. This might be used to test that a + * click on a disabled element doesn't fire certain events for instance. + * + * aWindow is optional, and defaults to the current window object. + */ +function synthesizeMouseExpectEvent(aTarget, aOffsetX, aOffsetY, aEvent, + aExpectedTarget, aExpectedEvent, aTestName, + aWindow) +{ + var eventHandler = _expectEvent(aExpectedTarget, aExpectedEvent, aTestName); + synthesizeMouse(aTarget, aOffsetX, aOffsetY, aEvent, aWindow); + _checkExpectedEvent(aExpectedTarget, aExpectedEvent, eventHandler, aTestName); +} + +/** + * Similar to synthesizeKey except that a test is performed to see if an + * event is fired at the right target as a result. + * + * aExpectedTarget - the expected originalTarget of the event. + * aExpectedEvent - the expected type of the event, such as 'select'. + * aTestName - the test name when outputing results + * + * To test that an event is not fired, use an expected type preceded by an + * exclamation mark, such as '!select'. + * + * aWindow is optional, and defaults to the current window object. + */ +function synthesizeKeyExpectEvent(key, aEvent, aExpectedTarget, aExpectedEvent, + aTestName, aWindow) +{ + var eventHandler = _expectEvent(aExpectedTarget, aExpectedEvent, aTestName); + synthesizeKey(key, aEvent, aWindow); + _checkExpectedEvent(aExpectedTarget, aExpectedEvent, eventHandler, aTestName); +} + +function disableNonTestMouseEvents(aDisable) +{ + var domutils = _getDOMWindowUtils(); + domutils.disableNonTestMouseEvents(aDisable); +} + +function _getDOMWindowUtils(aWindow) +{ + if (!aWindow) { + aWindow = window; + } + + // we need parent.SpecialPowers for: + // layout/base/tests/test_reftests_with_caret.html + // chrome: toolkit/content/tests/chrome/test_findbar.xul + // chrome: toolkit/content/tests/chrome/test_popup_anchor.xul + if ("SpecialPowers" in window && window.SpecialPowers != undefined) { + return SpecialPowers.getDOMWindowUtils(aWindow); + } + if ("SpecialPowers" in parent && parent.SpecialPowers != undefined) { + return parent.SpecialPowers.getDOMWindowUtils(aWindow); + } + + //TODO: this is assuming we are in chrome space + return aWindow.QueryInterface(_EU_Ci.nsIInterfaceRequestor). + getInterface(_EU_Ci.nsIDOMWindowUtils); +} + +// Must be synchronized with nsIDOMWindowUtils. +const COMPOSITION_ATTR_RAWINPUT = 0x02; +const COMPOSITION_ATTR_SELECTEDRAWTEXT = 0x03; +const COMPOSITION_ATTR_CONVERTEDTEXT = 0x04; +const COMPOSITION_ATTR_SELECTEDCONVERTEDTEXT = 0x05; + +/** + * Synthesize a composition event. + * + * @param aEvent The composition event information. This must + * have |type| member. The value must be + * "compositionstart", "compositionend" or + * "compositionupdate". + * And also this may have |data| and |locale| which + * would be used for the value of each property of + * the composition event. Note that the data would + * be ignored if the event type were + * "compositionstart". + * @param aWindow Optional (If null, current |window| will be used) + */ +function synthesizeComposition(aEvent, aWindow) +{ + var utils = _getDOMWindowUtils(aWindow); + if (!utils) { + return; + } + + utils.sendCompositionEvent(aEvent.type, aEvent.data ? aEvent.data : "", + aEvent.locale ? aEvent.locale : ""); +} +/** + * Synthesize a text event. + * + * @param aEvent The text event's information, this has |composition| + * and |caret| members. |composition| has |string| and + * |clauses| members. |clauses| must be array object. Each + * object has |length| and |attr|. And |caret| has |start| and + * |length|. See the following tree image. + * + * aEvent + * +-- composition + * | +-- string + * | +-- clauses[] + * | +-- length + * | +-- attr + * +-- caret + * +-- start + * +-- length + * + * Set the composition string to |composition.string|. Set its + * clauses information to the |clauses| array. + * + * When it's composing, set the each clauses' length to the + * |composition.clauses[n].length|. The sum of the all length + * values must be same as the length of |composition.string|. + * Set nsIDOMWindowUtils.COMPOSITION_ATTR_* to the + * |composition.clauses[n].attr|. + * + * When it's not composing, set 0 to the + * |composition.clauses[0].length| and + * |composition.clauses[0].attr|. + * + * Set caret position to the |caret.start|. It's offset from + * the start of the composition string. Set caret length to + * |caret.length|. If it's larger than 0, it should be wide + * caret. However, current nsEditor doesn't support wide + * caret, therefore, you should always set 0 now. + * + * @param aWindow Optional (If null, current |window| will be used) + */ +function synthesizeText(aEvent, aWindow) +{ + var utils = _getDOMWindowUtils(aWindow); + if (!utils) { + return; + } + + if (!aEvent.composition || !aEvent.composition.clauses || + !aEvent.composition.clauses[0]) { + return; + } + + var firstClauseLength = aEvent.composition.clauses[0].length; + var firstClauseAttr = aEvent.composition.clauses[0].attr; + var secondClauseLength = 0; + var secondClauseAttr = 0; + var thirdClauseLength = 0; + var thirdClauseAttr = 0; + if (aEvent.composition.clauses[1]) { + secondClauseLength = aEvent.composition.clauses[1].length; + secondClauseAttr = aEvent.composition.clauses[1].attr; + if (aEvent.composition.clauses[2]) { + thirdClauseLength = aEvent.composition.clauses[2].length; + thirdClauseAttr = aEvent.composition.clauses[2].attr; + } + } + + var caretStart = -1; + var caretLength = 0; + if (aEvent.caret) { + caretStart = aEvent.caret.start; + caretLength = aEvent.caret.length; + } + + utils.sendTextEvent(aEvent.composition.string, + firstClauseLength, firstClauseAttr, + secondClauseLength, secondClauseAttr, + thirdClauseLength, thirdClauseAttr, + caretStart, caretLength); +} + +/** + * Synthesize a query selected text event. + * + * @param aWindow Optional (If null, current |window| will be used) + * @return An nsIQueryContentEventResult object. If this failed, + * the result might be null. + */ +function synthesizeQuerySelectedText(aWindow) +{ + var utils = _getDOMWindowUtils(aWindow); + if (!utils) { + return null; + } + + return utils.sendQueryContentEvent(utils.QUERY_SELECTED_TEXT, 0, 0, 0, 0); +} diff --git a/test/tests/index.js b/test/tests/index.js index 4b5b947cc..8af1a146d 100644 --- a/test/tests/index.js +++ b/test/tests/index.js @@ -1,4 +1,5 @@ var TESTS = { "recognizePDF":["recognizePDF.js"], + "lookup":["lookup.js"], "utilities":["utilities.js"] }; diff --git a/test/tests/lookup.js b/test/tests/lookup.js new file mode 100644 index 000000000..c17786c94 --- /dev/null +++ b/test/tests/lookup.js @@ -0,0 +1,57 @@ +function lookupIdentifier(win, identifier) { + var tbbutton = win.document.getElementById("zotero-tb-lookup"); + tbbutton.open = true; + return waitForDOMEvent(win.document.getElementById("zotero-lookup-panel"), "popupshown").then(function() { + tbbutton.open = true; // Shouldn't be necessary, but seems to be on Fx ESR under Xvfb + var textbox = win.document.getElementById("zotero-lookup-textbox"); + textbox.value = identifier; + textbox.focus(); + EventUtils.synthesizeKey("VK_RETURN", {}, win); + var closePromise = waitForDOMEvent(win.document.getElementById("zotero-lookup-panel"), "popuphidden"); + return waitForItemEvent("add"); + }); +} + +describe("Add Item by Identifier", function() { + var win; + before(function() { + this.timeout(5000); + return loadZoteroPane().then(function(w) { + win = w; + }).then(function() { + return waitForTranslators(); + }); + }); + after(function() { + win.close(); + }); + + it("should add an ISBN-10", function() { + this.timeout(10000); + return lookupIdentifier(win, "0838985890").then(function(ids) { + var item = Zotero.Items.get(ids[0]); + assert.equal(item.getField("title"), "Zotero: a guide for librarians, researchers, and educators"); + }); + }); + it("should add an ISBN-13", function() { + this.timeout(10000); + return lookupIdentifier(win, "978-0838985892").then(function(ids) { + var item = Zotero.Items.get(ids[0]); + assert.equal(item.getField("title"), "Zotero: a guide for librarians, researchers, and educators"); + }); + }); + it("should add a DOI", function() { + this.timeout(10000); + return lookupIdentifier(win, "10.4103/0976-500X.85940").then(function(ids) { + var item = Zotero.Items.get(ids[0]); + assert.equal(item.getField("title"), "Zotero: A bibliographic assistant to researcher"); + }); + }); + it("should add a PMID", function() { + this.timeout(10000); + return lookupIdentifier(win, "24297125").then(function(ids) { + var item = Zotero.Items.get(ids[0]); + assert.equal(item.getField("title"), "Taking control of your digital library: how modern citation managers do more than just referencing"); + }); + }); +}); \ No newline at end of file From b6673511f748be5e1d8b7a826a97ed115066df5e Mon Sep 17 00:00:00 2001 From: Simon Kornblith Date: Sun, 8 Mar 2015 18:40:29 -0400 Subject: [PATCH 06/11] Close recognizePDF windows when tests finish --- test/tests/recognizePDF.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/tests/recognizePDF.js b/test/tests/recognizePDF.js index 8451150c3..d06f761ed 100644 --- a/test/tests/recognizePDF.js +++ b/test/tests/recognizePDF.js @@ -10,6 +10,11 @@ describe("PDF Recognition", function() { win = w; }); }); + afterEach(function() { + for(let win of getWindows("chrome://zotero/content/pdfProgress.xul")) { + win.close(); + } + }); after(function() { win.close(); }); From c7c58f83438acd959afa0d9d33102102088dd5ec Mon Sep 17 00:00:00 2001 From: Simon Kornblith Date: Mon, 9 Mar 2015 14:25:49 -0400 Subject: [PATCH 07/11] Add support function to reset the DB and a test that it works. --- chrome/content/zotero/xpcom/zotero.js | 1 + components/zotero-service.js | 15 +++++++++++++++ test/content/support.js | 11 +++++++++++ test/tests/index.js | 5 +++-- test/tests/support.js | 11 +++++++++++ 5 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 test/tests/support.js diff --git a/chrome/content/zotero/xpcom/zotero.js b/chrome/content/zotero/xpcom/zotero.js index 4b8f1a384..431fdd5aa 100644 --- a/chrome/content/zotero/xpcom/zotero.js +++ b/chrome/content/zotero/xpcom/zotero.js @@ -54,6 +54,7 @@ Components.utils.import("resource://gre/modules/Services.jsm"); this.join = join; this.randomString = randomString; this.moveToUnique = moveToUnique; + this.reinit = reinit; // defined in zotero-service.js // Public properties this.initialized = false; diff --git a/components/zotero-service.js b/components/zotero-service.js index e80bb0e7e..736a35db1 100644 --- a/components/zotero-service.js +++ b/components/zotero-service.js @@ -177,6 +177,21 @@ ZoteroContext.prototype = { } return zContext; + }, + + /** + * Shuts down Zotero, calls a callback (that may return a promise), + * then reinitializes Zotero. Returns a promise that is resolved + * when this process completes. + */ + "reinit":function(cb, isConnector) { + Services.obs.notifyObservers(zContext.Zotero, "zotero-before-reload", isConnector ? "connector" : "full"); + return zContext.Zotero.shutdown().then(function() { + return cb ? cb() : false; + }).finally(function() { + makeZoteroContext(isConnector); + zContext.Zotero.init(zInitOptions); + }); } }; diff --git a/test/content/support.js b/test/content/support.js index fabf535f8..8e6b801ca 100644 --- a/test/content/support.js +++ b/test/content/support.js @@ -164,4 +164,15 @@ function getTestDataDirectory() { resURI = Services.io.newURI("resource://zotero-unit-tests/data", null, null); return Services.io.newURI(resource.resolveURI(resURI), null, null). QueryInterface(Components.interfaces.nsIFileURL).file; +} + +/** + * Resets the Zotero DB and restarts Zotero. Returns a promise resolved + * when this finishes. + */ +function resetDB() { + var db = Zotero.getZoteroDatabase(); + return Zotero.reinit(function() { + db.remove(false); + }); } \ No newline at end of file diff --git a/test/tests/index.js b/test/tests/index.js index 8af1a146d..9ea8d06ba 100644 --- a/test/tests/index.js +++ b/test/tests/index.js @@ -1,5 +1,6 @@ var TESTS = { - "recognizePDF":["recognizePDF.js"], + "support":["support.js"], + "utilities":["utilities.js"], "lookup":["lookup.js"], - "utilities":["utilities.js"] + "recognizePDF":["recognizePDF.js"] }; diff --git a/test/tests/support.js b/test/tests/support.js new file mode 100644 index 000000000..f8c91f6f3 --- /dev/null +++ b/test/tests/support.js @@ -0,0 +1,11 @@ +describe("Support Functions for Unit Testing", function() { + describe("resetDB", function() { + it("should restore the DB to factory settings", function() { + var quickstart = Zotero.Items.erase(1); + assert.equal(Zotero.Items.get(1), false); + return resetDB().then(function() { + assert.equal(Zotero.Items.get(1).getField("url"), "http://zotero.org/support/quick_start_guide"); + }); + }); + }); +}); From c2d32c2e271114c41785226eb46f41332a66077c Mon Sep 17 00:00:00 2001 From: Simon Kornblith Date: Mon, 9 Mar 2015 14:39:04 -0400 Subject: [PATCH 08/11] Just give up on trying to automate the panel itself --- chrome/content/zotero/bindings/guidancepanel.xml | 1 + defaults/preferences/zotero.js | 1 + test/runtests.sh | 2 ++ test/tests/lookup.js | 15 ++++----------- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/chrome/content/zotero/bindings/guidancepanel.xml b/chrome/content/zotero/bindings/guidancepanel.xml index 41560f908..12f40106a 100644 --- a/chrome/content/zotero/bindings/guidancepanel.xml +++ b/chrome/content/zotero/bindings/guidancepanel.xml @@ -36,6 +36,7 @@ "$PROFILE/extensions/zotero@chnm.gmu.edu" cat < "$PROFILE/prefs.js" user_pref("extensions.autoDisableScopes", 0); user_pref("extensions.zotero.debug.log", $DEBUG); +user_pref("extensions.zotero.firstRunGuidance", false); +user_pref("extensions.zotero.firstRun2", false); EOF MOZ_NO_REMOTE=1 NO_EM_RESTART=1 "$FX_EXECUTABLE" -profile "$PROFILE" \ diff --git a/test/tests/lookup.js b/test/tests/lookup.js index c17786c94..769fcd2a5 100644 --- a/test/tests/lookup.js +++ b/test/tests/lookup.js @@ -1,15 +1,8 @@ function lookupIdentifier(win, identifier) { - var tbbutton = win.document.getElementById("zotero-tb-lookup"); - tbbutton.open = true; - return waitForDOMEvent(win.document.getElementById("zotero-lookup-panel"), "popupshown").then(function() { - tbbutton.open = true; // Shouldn't be necessary, but seems to be on Fx ESR under Xvfb - var textbox = win.document.getElementById("zotero-lookup-textbox"); - textbox.value = identifier; - textbox.focus(); - EventUtils.synthesizeKey("VK_RETURN", {}, win); - var closePromise = waitForDOMEvent(win.document.getElementById("zotero-lookup-panel"), "popuphidden"); - return waitForItemEvent("add"); - }); + var textbox = win.document.getElementById("zotero-lookup-textbox"); + textbox.value = identifier; + win.Zotero_Lookup.accept(textbox); + return waitForItemEvent("add"); } describe("Add Item by Identifier", function() { From 4a4073652f26094822003e4dd29f3cb873e9d16e Mon Sep 17 00:00:00 2001 From: Simon Kornblith Date: Mon, 9 Mar 2015 17:06:01 -0400 Subject: [PATCH 09/11] updateBundledFiles before using translators and wait for completion --- test/content/support.js | 10 ---------- test/tests/lookup.js | 5 +++-- test/tests/recognizePDF.js | 9 +++++---- 3 files changed, 8 insertions(+), 16 deletions(-) diff --git a/test/content/support.js b/test/content/support.js index 8e6b801ca..8ff21269c 100644 --- a/test/content/support.js +++ b/test/content/support.js @@ -114,16 +114,6 @@ function waitForCallback(cb, interval, timeout) { return deferred.promise; } -/** - * Returns a promise that is resolved once the translators are loaded. - */ -function waitForTranslators() { - return waitForCallback(function() { - // Just wait for the zotero.org translator to load - return !!Zotero.Translators.get("c82c574d-7fe8-49ca-a360-a05d6e34fec0"); - }); -} - /** * Ensures that the PDF tools are installed, or installs them if not. * Returns a promise. diff --git a/test/tests/lookup.js b/test/tests/lookup.js index 769fcd2a5..f49bef575 100644 --- a/test/tests/lookup.js +++ b/test/tests/lookup.js @@ -9,10 +9,11 @@ describe("Add Item by Identifier", function() { var win; before(function() { this.timeout(5000); + // Load a Zotero pane and update the translators (needed to + // make sure they're available before we run the tests) return loadZoteroPane().then(function(w) { win = w; - }).then(function() { - return waitForTranslators(); + return Zotero.Schema.updateBundledFiles('translators', null, false); }); }); after(function() { diff --git a/test/tests/recognizePDF.js b/test/tests/recognizePDF.js index d06f761ed..efba88d3a 100644 --- a/test/tests/recognizePDF.js +++ b/test/tests/recognizePDF.js @@ -4,11 +4,12 @@ describe("PDF Recognition", function() { var win; before(function() { this.timeout(60000); - return installPDFTools().then(function() { - return loadZoteroPane(); - }).then(function(w) { + // Load Zotero pane, install PDF tools, and load the + // translators + return Q.all([loadZoteroPane().then(function(w) { win = w; - }); + return Zotero.Schema.updateBundledFiles('translators', null, false); + }), installPDFTools()]); }); afterEach(function() { for(let win of getWindows("chrome://zotero/content/pdfProgress.xul")) { From 4c456853316312755815f35a66daf621653bdd12 Mon Sep 17 00:00:00 2001 From: Simon Kornblith Date: Mon, 9 Mar 2015 17:40:58 -0400 Subject: [PATCH 10/11] Add header to EventUtils.jsm --- test/resource/EventUtils.jsm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/test/resource/EventUtils.jsm b/test/resource/EventUtils.jsm index d7c3aca1c..566c7dde7 100644 --- a/test/resource/EventUtils.jsm +++ b/test/resource/EventUtils.jsm @@ -1,4 +1,10 @@ -// Export all available functions for Mozmill +/* Taken from MozMill 6c0948d80eebcbb104ce7a776c65aeae634970dd + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, you can obtain one at http://mozilla.org/MPL/2.0/. */ + + // Export all available functions for Mozmill var EXPORTED_SYMBOLS = ["disableNonTestMouseEvents","sendMouseEvent", "sendChar", "sendString", "sendKey", "synthesizeMouse", "synthesizeTouch", "synthesizeMouseAtPoint", "synthesizeTouchAtPoint", From 8253b981341c2a1aa21fa953e36c384bb29bb78d Mon Sep 17 00:00:00 2001 From: Simon Kornblith Date: Mon, 9 Mar 2015 17:41:17 -0400 Subject: [PATCH 11/11] Remove index.js and just enumerate the files in the test directory --- test/content/runtests.html | 1 - test/content/runtests.js | 51 ++++++++++++++++++++++++++------------ test/tests/index.js | 6 ----- 3 files changed, 35 insertions(+), 23 deletions(-) delete mode 100644 test/tests/index.js diff --git a/test/content/runtests.html b/test/content/runtests.html index 173dff3c5..85294a22d 100644 --- a/test/content/runtests.html +++ b/test/content/runtests.html @@ -8,7 +8,6 @@ - diff --git a/test/content/runtests.js b/test/content/runtests.js index 3d124f910..ae4adbd62 100644 --- a/test/content/runtests.js +++ b/test/content/runtests.js @@ -71,24 +71,43 @@ var assert = chai.assert, expect = chai.expect; // Set up tests to run +var run = true; if(ZoteroUnit.tests) { - document.body.appendChild(document.createTextNode("Running tests...")); - var torun = ZoteroUnit.tests == "all" ? Object.keys(TESTS) : ZoteroUnit.tests.split(","); + var testDirectory = getTestDataDirectory().parent, + testFiles = []; + if(ZoteroUnit.tests == "all") { + var enumerator = testDirectory.directoryEntries; + while(enumerator.hasMoreElements()) { + var file = enumerator.getNext().QueryInterface(Components.interfaces.nsIFile); + if(file.leafName.endsWith(".js")) { + testFiles.push(file.leafName); + } + } + } else { + var specifiedTests = ZoteroUnit.tests.split(","); + for(var test of specifiedTests) { + var fname = test+".js", + file = testDirectory.clone(); + file.append(fname); + if(!file.exists()) { + dump("Invalid test file "+test+"\n"); + run = false; + quit(true); + } + testFiles.push(fname); + } + } - for(var key of torun) { - if(!TESTS[key]) { - dump("Invalid test set "+torun+"\n"); - quit(true); - } - for(var test of TESTS[key]) { - var el = document.createElement("script"); - el.type = "application/javascript;version=1.8"; - el.src = "resource://zotero-unit-tests/"+test; - document.body.appendChild(el); - } + for(var fname of testFiles) { + var el = document.createElement("script"); + el.type = "application/javascript;version=1.8"; + el.src = "resource://zotero-unit-tests/"+fname; + document.body.appendChild(el); } } -window.onload = function() { - mocha.run(); -}; \ No newline at end of file +if(run) { + window.onload = function() { + mocha.run(); + }; +} \ No newline at end of file diff --git a/test/tests/index.js b/test/tests/index.js deleted file mode 100644 index 9ea8d06ba..000000000 --- a/test/tests/index.js +++ /dev/null @@ -1,6 +0,0 @@ -var TESTS = { - "support":["support.js"], - "utilities":["utilities.js"], - "lookup":["lookup.js"], - "recognizePDF":["recognizePDF.js"] -};