From 7519287fa8510cfff6a7243250a537aae75d0dbe Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Tue, 24 Mar 2015 02:26:56 -0400
Subject: [PATCH 01/44] Fix JS version declaration for test support scripts

---
 test/content/runtests.html | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/test/content/runtests.html b/test/content/runtests.html
index 85294a22d..a2291f173 100644
--- a/test/content/runtests.html
+++ b/test/content/runtests.html
@@ -8,7 +8,7 @@
 	<script src="chrome://zotero/content/include.js"></script>
 	<script src="resource://zotero-unit/chai/chai.js"></script>
 	<script src="resource://zotero-unit/mocha/mocha.js"></script>
-	<script src="support.js" version="application/javascript;version=1.8"></script>
-	<script src="runtests.js" version="application/javascript;version=1.8"></script>
+	<script src="support.js" type="application/javascript;version=1.8"></script>
+	<script src="runtests.js" type="application/javascript;version=1.8"></script>
 </body>
 </html>
\ No newline at end of file

From 9624f6fac36ff0bd98db450b1a043dd9d978b4a9 Mon Sep 17 00:00:00 2001
From: Aurimas Vinckevicius <aurimas.dev@gmail.com>
Date: Tue, 24 Mar 2015 01:58:43 -0500
Subject: [PATCH 02/44] Fix runtests.sh to work with cygwin

---
 test/runtests.sh | 25 ++++++++++++++++++++++---
 1 file changed, 22 insertions(+), 3 deletions(-)

diff --git a/test/runtests.sh b/test/runtests.sh
index 7ef72c07c..90f831001 100755
--- a/test/runtests.sh
+++ b/test/runtests.sh
@@ -1,6 +1,19 @@
 #!/bin/bash
 CWD="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
 
+case "$(uname -s)" in
+   CYGWIN*) IS_CYGWIN=1 ;;
+esac
+
+function makePath {
+	local __assignTo=$1
+	local __path=$2
+	if [ ! -z $IS_CYGWIN ]; then
+		__path="`cygpath -aw \"$__path\"`"
+	fi
+	eval $__assignTo="'$__path'"
+}
+
 DEBUG=false
 if [ "`uname`" == "Darwin" ]; then
 	FX_EXECUTABLE="/Applications/Firefox.app/Contents/MacOS/firefox"
@@ -50,8 +63,13 @@ fi
 # Set up profile directory
 PROFILE="`mktemp -d 2>/dev/null || mktemp -d -t 'zotero-unit'`"
 mkdir "$PROFILE/extensions"
-echo "$CWD" > "$PROFILE/extensions/zotero-unit@zotero.org"
-echo "`dirname "$CWD"`" > "$PROFILE/extensions/zotero@chnm.gmu.edu"
+
+makePath ZOTERO_UNIT_PATH "$CWD"
+echo "$ZOTERO_UNIT_PATH" > "$PROFILE/extensions/zotero-unit@zotero.org"
+
+makePath ZOTERO_PATH "`dirname "$CWD"`"
+echo "$ZOTERO_PATH" > "$PROFILE/extensions/zotero@chnm.gmu.edu"
+
 cat <<EOF > "$PROFILE/prefs.js"
 user_pref("extensions.autoDisableScopes", 0);
 user_pref("extensions.zotero.debug.log", $DEBUG);
@@ -59,7 +77,8 @@ 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" \
+makePath FX_PROFILE "$PROFILE"
+MOZ_NO_REMOTE=1 NO_EM_RESTART=1 "$FX_EXECUTABLE" -profile "$FX_PROFILE" \
     -chrome chrome://zotero-unit/content/runtests.html -test "$TESTS" $FX_ARGS
 
 # Check for success

From e732d6350be6a8d0589878113163b09b2ec5442c Mon Sep 17 00:00:00 2001
From: Aurimas Vinckevicius <aurimas.dev@gmail.com>
Date: Tue, 24 Mar 2015 02:04:54 -0500
Subject: [PATCH 03/44] Allow setting item field value via base field

---
 chrome/content/zotero/xpcom/data/item.js | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/chrome/content/zotero/xpcom/data/item.js b/chrome/content/zotero/xpcom/data/item.js
index 2563840a9..68e488bc5 100644
--- a/chrome/content/zotero/xpcom/data/item.js
+++ b/chrome/content/zotero/xpcom/data/item.js
@@ -804,6 +804,9 @@ Zotero.Item.prototype.setField = function(field, value, loadIn) {
 		value = false;
 	}
 	
+	// Make sure to use type-specific field ID if available
+	fieldID = Zotero.ItemFields.getFieldIDFromTypeAndBase(this.itemTypeID, fieldID) || fieldID;
+	
 	if (value !== false && !Zotero.ItemFields.isValidForType(fieldID, this.itemTypeID)) {
 		var msg = "'" + field + "' is not a valid field for type " + this.itemTypeID;
 		

From 827eb9b32ea2d8dc200b4ea021c8040a96917ae1 Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Tue, 24 Mar 2015 03:38:11 -0400
Subject: [PATCH 04/44] Change command-line debug flag to -ZoteroDebug for
 consistency

From -zoterodebug
---
 components/zotero-service.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/components/zotero-service.js b/components/zotero-service.js
index 736a35db1..389185bc5 100644
--- a/components/zotero-service.js
+++ b/components/zotero-service.js
@@ -364,7 +364,7 @@ ZoteroCommandLineHandler.prototype = {
 	/* nsICommandLineHandler */
 	handle : function(cmdLine) {
 		// Force debug output
-		if (cmdLine.handleFlag("zoterodebug", false)) {
+		if (cmdLine.handleFlag("ZoteroDebug", false)) {
 			zInitOptions.forceDebugLog = true;
 		}
 		

From d1ca5e272940b24804bb8fa3e70a6359b82dc3ec Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Tue, 24 Mar 2015 03:40:07 -0400
Subject: [PATCH 05/44] Restore use of dump() on Windows if debug pref is
 enabled

It turns out that the Cygwin console, unlike -console, is actually
usable, so developers on Windows can use that. Since we sometimes need
real-time debug output from end users (who won't have Cygwin installed),
keep logging to the Browser Console if only the -ZoteroDebug flag is
passed.
---
 chrome/content/zotero/xpcom/debug.js | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/chrome/content/zotero/xpcom/debug.js b/chrome/content/zotero/xpcom/debug.js
index a635045c2..7b506e32b 100644
--- a/chrome/content/zotero/xpcom/debug.js
+++ b/chrome/content/zotero/xpcom/debug.js
@@ -25,10 +25,11 @@
 
 
 Zotero.Debug = new function () {
-	var _console, _stackTrace, _store, _level, _time, _lastTime, _output = [];
+	var _console, _consolePref, _stackTrace, _store, _level, _time, _lastTime, _output = [];
 	
 	this.init = function (forceDebugLog) {
-		_console = forceDebugLog || Zotero.Prefs.get('debug.log');
+		_consolePref = Zotero.Prefs.get('debug.log');
+		_console = _consolePref || forceDebugLog;
 		_store = Zotero.Prefs.get('debug.store');
 		if (_store) {
 			Zotero.Prefs.set('debug.store', false);
@@ -89,11 +90,12 @@ Zotero.Debug = new function () {
 		if (_console) {
 			var output = 'zotero(' + level + ')' + (_time ? deltaStr : '') + ': ' + message;
 			if(Zotero.isFx && !Zotero.isBookmarklet) {
-				// On Windows, where the text console is inexplicably glacial,
-				// log to the Browser Console instead
+				// On Windows, where the text console (-console) is inexplicably glacial,
+				// log to the Browser Console instead if only the -ZoteroDebug flag is used.
+				// Developers can use the debug.log/debug.time prefs and the Cygwin text console.
 				//
 				// TODO: Get rid of the filename and line number
-				if (Zotero.isWin && !Zotero.isStandalone) {
+				if (!_consolePref && Zotero.isWin && !Zotero.isStandalone) {
 					var console = Components.utils.import("resource://gre/modules/devtools/Console.jsm", {}).console;
 					console.log(output);
 				}

From a6e9f0aea0143a6b51f741b37d57c5feb1c8a240 Mon Sep 17 00:00:00 2001
From: Aurimas Vinckevicius <aurimas.dev@gmail.com>
Date: Tue, 24 Mar 2015 17:54:32 -0500
Subject: [PATCH 06/44] Add tests for ISSN/ISBN-related Zotero.Utilities
 functions

---
 test/tests/utilities.js | 155 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 155 insertions(+)

diff --git a/test/tests/utilities.js b/test/tests/utilities.js
index b71dcb517..e21aa6b9a 100644
--- a/test/tests/utilities.js
+++ b/test/tests/utilities.js
@@ -17,4 +17,159 @@ describe("Zotero.Utilities", function() {
 			}
 		});
 	});
+	describe("cleanISBN", function() {
+		let cleanISBN = Zotero.Utilities.cleanISBN;
+		it("should return false for non-ISBN string", function() {
+			assert.isFalse(cleanISBN(''), 'returned false for empty string');
+			assert.isFalse(cleanISBN('Random String 123'), 'returned false for non-ISBN string');
+			assert.isFalse(cleanISBN('1234X67890'), 'returned false for ISBN10-looking string with X in the middle');
+			assert.isFalse(cleanISBN('987123456789X'), 'returned false for ISBN13-looking string with X as check-digit');
+		});
+		it("should return false for invalid ISBN string", function() {
+			assert.isFalse(cleanISBN('1234567890'), 'returned false for invalid ISBN10');
+			assert.isFalse(cleanISBN('9871234567890'), 'returned false for invalid ISBN13');
+		});
+		it("should return valid ISBN string given clean, valid ISBN string", function() {
+			assert.equal(cleanISBN('123456789X'), '123456789X', 'passed through valid ISBN10');
+			assert.equal(cleanISBN('123456789x'), '123456789X', 'passed through valid ISBN10 with lower case input');
+			assert.equal(cleanISBN('9781234567897'), '9781234567897', 'passed through valid ISBN13');
+			assert.equal(cleanISBN('9791843123391'), '9791843123391', 'passed through valid ISBN13 in 979 range');
+		});
+		it("should strip off internal characters in ISBN string", function() {
+			let ignoredChars = '\x2D\xAD\u2010\u2011\u2012\u2013\u2014\u2015\u2043\u2212' // Dashes
+				+ ' \xA0\r\n\t\x0B\x0C\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005' // Spaces
+				+ '\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF';
+			for (let i=0; i<ignoredChars.length; i++) {
+				let charCode = '\\u' + Zotero.Utilities.lpad(ignoredChars.charCodeAt(i).toString(16).toUpperCase(), '0', 4);
+				assert.equal(cleanISBN('9781' + ignoredChars.charAt(i) + '234567897'), '9781234567897', 'stripped off ' + charCode);
+			}
+			assert.equal(cleanISBN('9781' + ignoredChars + '234567897'), '9781234567897', 'stripped off all ignored characters');
+			
+			let isbnChars = ignoredChars + '1234567890';
+			for (let i=1; i<65536; i++) {
+				let c = String.fromCharCode(i);
+				if (isbnChars.indexOf(c) != -1) continue;
+				
+				let charCode = '\\u' + Zotero.Utilities.lpad(i.toString(16).toUpperCase(), '0', 4);
+				assert.isFalse(cleanISBN('9781' + c + '234567897'), 'did not ignore internal character ' + charCode);
+			}
+		});
+		it("should strip off surrounding non-ISBN string", function() {
+			assert.equal(cleanISBN('ISBN 9781234567897'), '9781234567897', 'stripped off preceding string (with space)');
+			assert.equal(cleanISBN('ISBN:9781234567897'), '9781234567897', 'stripped off preceding string (without space)');
+			assert.equal(cleanISBN('9781234567897 ISBN13'), '9781234567897', 'stripped off trailing string (with space)');
+			assert.equal(cleanISBN('9781234567897(ISBN13)'), '9781234567897', 'stripped off trailing string (without space)');
+			assert.equal(cleanISBN('ISBN13:9781234567897 (print)'), '9781234567897', 'stripped off surrounding string');
+			assert.equal(cleanISBN('978 9781234567 897'), '9781234567897', 'stripped off pseudo-ISBN prefix');
+		});
+		it("should return the first valid ISBN from a string with multiple ISBNs", function() {
+			assert.equal(cleanISBN('9781234567897, 9791843123391'), '9781234567897', 'returned first valid ISBN13 from list of valid ISBN13s');
+			assert.equal(cleanISBN('123456789X, 0199535922'), '123456789X', 'returned first valid ISBN13 from list of valid ISBN13s');
+			assert.equal(cleanISBN('123456789X 9781234567897'), '123456789X', 'returned first valid ISBN (10) from a list of mixed-length ISBNs');
+			assert.equal(cleanISBN('9781234567897 123456789X'), '9781234567897', 'returned first valid ISBN (13) from a list of mixed-length ISBNs');
+			assert.equal(cleanISBN('1234567890 9781234567897'), '9781234567897', 'returned first valid ISBN in the list with valid and invalid ISBNs');
+		});
+		it("should not return an ISBN from a middle of a longer number string", function() {
+			assert.isFalse(cleanISBN('1239781234567897'), 'did not ignore number prefix');
+			assert.isFalse(cleanISBN('9781234567897123'), 'did not ignore number suffix');
+			assert.isFalse(cleanISBN('1239781234567897123'), 'did not ignore surrounding numbers');
+		});
+		it("should return valid ISBN from a dirty string", function() {
+			assert.equal(cleanISBN('<b>ISBN</b>:978-1 234\xA056789 - 7(print)\n<b>ISBN-10</b>:123\x2D456789X (print)'), '9781234567897');
+		});
+		it("should not validate check digit when dontValidate is set", function() {
+			assert.equal(cleanISBN('9781234567890', true), '9781234567890', 'plain ISBN13 with wrong check digit');
+			assert.equal(cleanISBN('1234567890', true), '1234567890', 'plain ISBN10 with wrong check digit');
+			assert.equal(cleanISBN('1234567890 9781234567897', true), '1234567890', 'returned first ISBN10 (invalid) in the list with valid and invalid ISBNs');
+			assert.equal(cleanISBN('9781234567890 123456789X', true), '9781234567890', 'returned first ISBN13 (invalid) in the list with valid and invalid ISBNs');
+		});
+		it("should not pass non-ISBN strings if dontValidate is set", function() {
+			assert.isFalse(cleanISBN('', true), 'returned false for empty string');
+			assert.isFalse(cleanISBN('Random String 123', true), 'returned false for non-ISBN string');
+			assert.isFalse(cleanISBN('1234X67890', true), 'returned false for ISBN10-looking string with X in the middle');
+			assert.isFalse(cleanISBN('123456789Y', true), 'returned false for ISBN10-looking string with Y as check digit');
+			assert.isFalse(cleanISBN('987123456789X', true), 'returned false for ISBN13-looking string with X as check-digit');
+			assert.isFalse(cleanISBN('1239781234567897', true), 'did not ignore number prefix');
+			assert.isFalse(cleanISBN('9781234567897123', true), 'did not ignore number suffix');
+			assert.isFalse(cleanISBN('1239781234567897123', true), 'did not ignore surrounding numbers');
+		});
+	});
+	describe("toISBN13", function() {
+		let toISBN13 = Zotero.Utilities.toISBN13;
+		it("should throw on invalid ISBN", function() {
+			let errorMsg = 'ISBN not found in "',
+				invalidStrings = ['', 'random string', '1234567890123'];
+			for (let i=0; i<invalidStrings.length; i++) {
+				assert.throws(toISBN13.bind(null,invalidStrings[i]), errorMsg + invalidStrings[i] + '"');
+			}
+		});
+		it("should convert to ISBN13", function() {
+			assert.equal(toISBN13('123456789X'), '9781234567897', 'converts ISBN10 to ISBN13');
+			assert.equal(toISBN13('9781234567897'), '9781234567897', 'ISBN13 stays the same');
+			assert.equal(toISBN13('9791843123391'), '9791843123391', '979 ISBN13 stays the same');
+			assert.equal(toISBN13('978-1234567897'), '9781234567897', 'accepts hyphenated ISBN');
+		});
+		it("should ignore invalid check digit", function() {
+			assert.equal(toISBN13('1234567890'), '9781234567897', 'converts ISBN10 with invalid check digit to ISBN13');
+			assert.equal(toISBN13('9781234567890'), '9781234567897', 'corrects invalid ISBN13 check digit');
+		});
+	});
+	describe("cleanISSN", function() {
+		let cleanISSN = Zotero.Utilities.cleanISSN;
+		it("should return false for non-ISSN string", function() {
+			assert.isFalse(cleanISSN(''), 'returned false for empty string');
+			assert.isFalse(cleanISSN('Random String 123'), 'returned false for non-ISSN string');
+			assert.isFalse(cleanISSN('123X-5679'), 'returned false for ISSN-looking string with X in the middle');
+		});
+		it("should return false for invalid ISSN string", function() {
+			assert.isFalse(cleanISSN('12345678'), 'returned false for invalid ISSN');
+			assert.isFalse(cleanISSN('1234-5678'), 'returned false for invalid ISSN with hyphen');
+		});
+		it("should return valid ISSN string given clean, valid ISSN string", function() {
+			assert.equal(cleanISSN('1234-5679'), '1234-5679', 'passed through valid ISSN');
+			assert.equal(cleanISSN('2090-424X'), '2090-424X', 'passed through valid ISSN with X check digit');
+		});
+		it("should hyphenate valid ISSN", function() {
+			assert.equal(cleanISSN('12345679'), '1234-5679', 'hyphenated valid ISSN');
+		});
+		it("should strip off internal characters in ISSN string", function() {
+			let ignoredChars = '\x2D\xAD\u2010\u2011\u2012\u2013\u2014\u2015\u2043\u2212' // Dashes
+				+ ' \xA0\r\n\t\x0B\x0C\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005' // Spaces
+				+ '\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF';
+			for (let i=0; i<ignoredChars.length; i++) {
+				let charCode = '\\u' + Zotero.Utilities.lpad(ignoredChars.charCodeAt(i).toString(16).toUpperCase(), '0', 4);
+				assert.equal(cleanISSN('1' + ignoredChars.charAt(i) + '2345679'), '1234-5679', 'stripped off ' + charCode);
+			}
+			assert.equal(cleanISSN('1' + ignoredChars + '2345679'), '1234-5679', 'stripped off all ignored characters');
+			
+			let isbnChars = ignoredChars + '1234567890';
+			for (let i=1; i<65536; i++) {
+				let c = String.fromCharCode(i);
+				if (isbnChars.indexOf(c) != -1) continue;
+				
+				let charCode = '\\u' + Zotero.Utilities.lpad(i.toString(16).toUpperCase(), '0', 4);
+				assert.isFalse(cleanISSN('1' + c + '2345679'), 'did not ignore internal character ' + charCode);
+			}
+		});
+		it("should strip off surrounding non-ISSN string", function() {
+			assert.equal(cleanISSN('ISSN 1234-5679'), '1234-5679', 'stripped off preceding string (with space)');
+			assert.equal(cleanISSN('ISSN:1234-5679'), '1234-5679', 'stripped off preceding string (without space)');
+			assert.equal(cleanISSN('1234-5679 ISSN'), '1234-5679', 'stripped off trailing string (with space)');
+			assert.equal(cleanISSN('1234-5679(ISSN)'), '1234-5679', 'stripped off trailing string (without space)');
+			assert.equal(cleanISSN('ISSN:1234-5679 (print)'), '1234-5679', 'stripped off surrounding string');
+			assert.equal(cleanISSN('123 12345 679'), '1234-5679', 'stripped off pseudo-ISSN prefix');
+		});
+		it("should return the first valid ISSN from a string with multiple ISSNs", function() {
+			assert.equal(cleanISSN('1234-5679, 0028-0836'), '1234-5679', 'returned first valid ISSN from list of valid ISSNs');
+			assert.equal(cleanISSN('1234-5678, 0028-0836'), '0028-0836', 'returned first valid ISSN in the list with valid and invalid ISSNs');
+		});
+		it("should not return an ISSN from a middle of a longer number string", function() {
+			assert.isFalse(cleanISSN('12312345679'), 'did not ignore number prefix');
+			assert.isFalse(cleanISSN('12345679123'), 'did not ignore number suffix');
+			assert.isFalse(cleanISSN('12312345679123'), 'did not ignore surrounding numbers');
+		});
+		it("should return valid ISSN from a dirty string", function() {
+			assert.equal(cleanISSN('<b>ISSN</b>:1234\xA0-\t5679(print)\n<b>eISSN (electronic)</b>:0028-0836'), '1234-5679');
+		});
+	});
 });

From 48810f23e04229ace477713a4023ac3ccad49283 Mon Sep 17 00:00:00 2001
From: Aurimas Vinckevicius <aurimas.dev@gmail.com>
Date: Mon, 2 Mar 2015 01:05:15 -0600
Subject: [PATCH 07/44] Tweak cleanISBN, cleanISSN, toISBN13 to match tests
 Fixes regression from 37921b09100cd35697173be39f272837ec7c1f95 cleanISBN/ISSN
 now return first valid ISBN/ISSN from a list of valid/invalid ISBNs/ISSNs,
 even if invalid ISBN/ISSN comes first toISBN13 now corrects the check digit
 for ISBN13 input

---
 chrome/content/zotero/xpcom/utilities.js | 119 +++++++++++++----------
 1 file changed, 65 insertions(+), 54 deletions(-)

diff --git a/chrome/content/zotero/xpcom/utilities.js b/chrome/content/zotero/xpcom/utilities.js
index acc5f2006..eec16d1bb 100644
--- a/chrome/content/zotero/xpcom/utilities.js
+++ b/chrome/content/zotero/xpcom/utilities.js
@@ -282,39 +282,41 @@ Zotero.Utilities = {
 	 * @param {Boolean} [dontValidate=false] Do not validate check digit
 	 * @return {String|Boolean} Valid ISBN or false
 	 */
-	"cleanISBN":function(isbn, dontValidate) {
-		isbn = isbn.replace(/[^0-9a-z]+/ig, '').toUpperCase()	//we only want to ignore punctuation, spaces
-						.match(/\b(?:97[89][0-9]{10}|[0-9]{9}[0-9X])\b/);	//13 digit or 10 digit
-		if(!isbn) return false;
-		isbn = isbn[0];
-		
-		if (dontValidate && (isbn.length == 10 || isbn.length == 13)) {
-			return isbn;
-		}
-		
-		if(isbn.length == 10) {
-			// Verify ISBN-10 checksum
-			var sum = 0;
-			for (var i = 0; i < 9; i++) {
-				if(isbn[i] == 'X') return false;	//X can only be a check digit
-				sum += isbn[i] * (10-i);
+	"cleanISBN":function(isbnStr, dontValidate) {
+		isbnStr = isbnStr.toUpperCase()
+			.replace(/[\x2D\xAD\u2010-\u2015\u2043\u2212]+/g, ''); // Ignore dashes
+		var isbnRE = /\b(?:97[89]\s*(?:\d\s*){9}\d|(?:\d\s*){9}[\dX])\b/g,
+			isbnMatch;
+		while(isbnMatch = isbnRE.exec(isbnStr)) {
+			var isbn = isbnMatch[0].replace(/\s+/g, '');
+			
+			if (dontValidate) {
+				return isbn;
 			}
-			//check digit might be 'X'
-			sum += (isbn[9] == 'X')? 10 : isbn[9]*1;
-
-			return (sum % 11 == 0) ? isbn : false;
+			
+			if(isbn.length == 10) {
+				// Verify ISBN-10 checksum
+				var sum = 0;
+				for (var i = 0; i < 9; i++) {
+					sum += isbn[i] * (10-i);
+				}
+				//check digit might be 'X'
+				sum += (isbn[9] == 'X')? 10 : isbn[9]*1;
+	
+				if (sum % 11 == 0) return isbn;
+			} else {
+				// Verify ISBN 13 checksum
+				var sum = 0;
+				for (var i = 0; i < 12; i+=2) sum += isbn[i]*1;	//to make sure it's int
+				for (var i = 1; i < 12; i+=2) sum += isbn[i]*3;
+				sum += isbn[12]*1; //add the check digit
+	
+				if (sum % 10 == 0 ) return isbn;
+			}
+			
+			isbnRE.lastIndex = isbnMatch.index + 1; // Retry the same spot + 1
 		}
-
-		if(isbn.length == 13) {
-			// Verify checksum
-			var sum = 0;
-			for (var i = 0; i < 12; i+=2) sum += isbn[i]*1;	//to make sure it's int
-			for (var i = 1; i < 12; i+=2) sum += isbn[i]*3;
-			sum += isbn[12]*1; //add the check digit
-
-			return (sum % 10 == 0 )? isbn : false;
-		}
-
+		
 		return false;
 	},
 	
@@ -324,16 +326,17 @@ Zotero.Utilities = {
 	 *   cleanISBN
 	 * @return {String} ISBN-13
 	 */
-	"toISBN13": function(isbn) {
-		if (!/^(?:97[89])?\d{9}[\dxX]$/.test(isbn)
-			&& !(isbn = Zotero.Utilities.cleanISBN(isbn))
-		) {
-			throw new Error('Invalid ISBN: ' + isbn);
+	"toISBN13": function(isbnStr) {
+		var isbn;
+		if (!(isbn = Zotero.Utilities.cleanISBN(isbnStr, true))) {
+			throw new Error('ISBN not found in "' + isbnStr + '"');
 		}
 		
-		if (isbn.length == 13) return isbn; // Recalculate check digit?
-		
-		isbn = '978' + isbn.substr(0,9);
+		if (isbn.length == 13) {
+			isbn = isbn.substr(0,12); // Strip off check digit and re-calculate it
+		} else {
+			isbn = '978' + isbn.substr(0,9);
+		}
 		
 		var sum = 0;
 		for (var i = 0; i < 12; i++) {
@@ -350,22 +353,30 @@ Zotero.Utilities = {
 	 * Clean and validate ISSN.
 	 * Return issn if valid, otherwise return false
 	 */
-	"cleanISSN":function(/**String*/ issn) {
-		issn = issn.replace(/[^0-9a-z]+/ig, '').toUpperCase()	//we only want to ignore punctuation, spaces
-						.match(/[0-9]{7}[0-9X]/);
-		if(!issn) return false;
-		issn = issn[0];
-
-		// Verify ISSN checksum
-		var sum = 0;
-		for (var i = 0; i < 7; i++) {
-			if(issn[i] == 'X') return false;	//X can only be a check digit
-			sum += issn[i] * (8-i);
+	"cleanISSN":function(/**String*/ issnStr) {
+		issnStr = issnStr.toUpperCase()
+			.replace(/[\x2D\xAD\u2010-\u2015\u2043\u2212]+/g, ''); // Ignore dashes
+		var issnRE = /\b(?:\d\s*){7}[\dX]\b/g,
+			issnMatch;
+		while (issnMatch = issnRE.exec(issnStr)) {
+			var issn = issnMatch[0].replace(/\s+/g, '');
+			
+			// Verify ISSN checksum
+			var sum = 0;
+			for (var i = 0; i < 7; i++) {
+				sum += issn[i] * (8-i);
+			}
+			//check digit might be 'X'
+			sum += (issn[7] == 'X')? 10 : issn[7]*1;
+	
+			if (sum % 11 == 0) {
+				return issn.substring(0,4) + '-' + issn.substring(4);
+			}
+			
+			issnRE.lastIndex = issnMatch.index + 1; // Retry same spot + 1
 		}
-		//check digit might be 'X'
-		sum += (issn[7] == 'X')? 10 : issn[7]*1;
-
-		return (sum % 11 == 0) ? issn.substring(0,4) + '-' + issn.substring(4) : false;
+		
+		return false;
 	},
 	
 	/**

From 4625b7081e11afae6c55b76cc0d933e2b593905d Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Thu, 26 Mar 2015 18:53:56 -0400
Subject: [PATCH 08/44] Add checkbox to use one side for all remaining
 conflicts

This should be rewritten in a way that allows it to be unit tested, but
it seems to work.
---
 chrome/content/zotero/bindings/merge.xml     |   6 +
 chrome/content/zotero/merge.js               | 148 +++++++++++++------
 chrome/content/zotero/merge.xul              |  16 +-
 chrome/locale/en-US/zotero/zotero.properties |   3 +
 chrome/skin/default/zotero/merge.css         |   5 +-
 5 files changed, 129 insertions(+), 49 deletions(-)

diff --git a/chrome/content/zotero/bindings/merge.xml b/chrome/content/zotero/bindings/merge.xml
index 2fe1e3020..4483e49d4 100644
--- a/chrome/content/zotero/bindings/merge.xml
+++ b/chrome/content/zotero/bindings/merge.xml
@@ -124,6 +124,8 @@
 			<property name="rightpane" onget="return this._rightpane"/>
 			<property name="mergepane" onget="return this._mergepane"/>
 			
+			<property name="onSelectionChange"/>
+			
 			<field name="_leftpane"/>
 			<field name="_rightpane"/>
 			<field name="_mergepane"/>
@@ -397,6 +399,10 @@
 					else {
 						mergepane.ref = pane.original;
 					}
+					
+					if (mergegroup.onSelectionChange) {
+						mergegroup.onSelectionChange();
+					}
 				]]>
 				</body>
 			</method>
diff --git a/chrome/content/zotero/merge.js b/chrome/content/zotero/merge.js
index 1939454a8..5af038222 100644
--- a/chrome/content/zotero/merge.js
+++ b/chrome/content/zotero/merge.js
@@ -62,6 +62,7 @@ var Zotero_Merge_Window = new function () {
 		}
 		
 		_mergeGroup.type = _io.dataIn.type;
+		_mergeGroup.onSelectionChange = _updateResolveAllCheckbox;
 		
 		switch (_mergeGroup.type) {
 			case 'item':
@@ -78,6 +79,8 @@ var Zotero_Merge_Window = new function () {
 		_mergeGroup.rightCaption = _io.dataIn.captions[1];
 		_mergeGroup.mergeCaption = _io.dataIn.captions[2];
 		
+		_resolveAllCheckbox = document.getElementById('resolve-all');
+		
 		_numObjects = document.getElementById('zotero-merge-num-objects');
 		document.getElementById('zotero-merge-total-objects').value = _objects.length;
 		
@@ -101,8 +104,15 @@ var Zotero_Merge_Window = new function () {
 		
 		// Restore previously merged object into merge pane
 		_mergeGroup.merge = _merged[_pos].ref;
-		_mergeGroup.leftpane.removeAttribute("selected");
-		_mergeGroup.rightpane.removeAttribute("selected");
+		if (_merged[_pos].id == _mergeGroup.left.id) {
+			_mergeGroup.leftpane.setAttribute("selected", "true");
+			_mergeGroup.rightpane.removeAttribute("selected");
+		}
+		else {
+			_mergeGroup.leftpane.removeAttribute("selected");
+			_mergeGroup.rightpane.setAttribute("selected", "true");
+		}
+		_updateResolveAllCheckbox();
 		
 		if (_mergeGroup.type == 'item') {
 			_updateChangedCreators();
@@ -125,7 +135,7 @@ var Zotero_Merge_Window = new function () {
 	
 	
 	function onNext() {
-		if (_pos + 1 == _objects.length) {
+		if (_pos + 1 == _objects.length || _resolveAllCheckbox.checked) {
 			return true;
 		}
 		
@@ -160,43 +170,17 @@ var Zotero_Merge_Window = new function () {
 			return;
 		}
 		
+		_updateResolveAllCheckbox();
+		
 		if (_mergeGroup.type == 'item') {
 			_updateChangedCreators();
 		}
 		
-		// On Windows the buttons don't move when one is hidden
-		if ((_pos + 1) != _objects.length) {
-			var nextButton = _wizard.getButton("next");
-			
-			if (Zotero.isMac) {
-				nextButton.setAttribute("hidden", "false");
-				_wizard.getButton("finish").setAttribute("hidden", "true");
-			}
-			else {
-				var buttons = document.getAnonymousElementByAttribute(_wizard, "anonid", "Buttons");
-				var deck = document.getAnonymousElementByAttribute(buttons, "anonid", "WizardButtonDeck");
-				deck.selectedIndex = 1;
-			}
-			
-			_setInstructionsString(nextButton.label);
+		if (_isLastConflict()) {
+			_showFinishButton();
 		}
-		// Last object
 		else {
-			var finishButton = _wizard.getButton("finish");
-			
-			if (Zotero.isMac) {
-				_wizard.getButton("next").setAttribute("hidden", "true");
-				finishButton.setAttribute("hidden", "false");
-			}
-			// Windows uses a deck to switch between the Next and Finish buttons
-			// TODO: check Linux
-			else {
-				var buttons = document.getAnonymousElementByAttribute(_wizard, "anonid", "Buttons");
-				var deck = document.getAnonymousElementByAttribute(buttons, "anonid", "WizardButtonDeck");
-				deck.selectedIndex = 0;
-			}
-			
-			_setInstructionsString(finishButton.label);
+			_showNextButton();
 		}
 		
 		return false;
@@ -204,7 +188,20 @@ var Zotero_Merge_Window = new function () {
 	
 	
 	function onFinish() {
-		_merged[_pos] = _getCurrentMergeObject();
+		// If using one side for all remaining, update merge object
+		if (!_isLastConflict() && _resolveAllCheckbox.checked) {
+			let useRemote = _mergeGroup.rightpane.getAttribute("selected") == "true";
+			for (let i = _pos; i < _objects.length; i++) {
+				_merged[i] = _getMergeObject(
+					_objects[i][useRemote ? 1 : 0],
+					_objects[i][0],
+					_objects[i][1]
+				);
+			}
+		}
+		else {
+			_merged[_pos] = _getCurrentMergeObject();
+		}
 		
 		_io.dataOut = _merged;
 		return true;
@@ -216,21 +213,86 @@ var Zotero_Merge_Window = new function () {
 	}
 	
 	
-	function _getCurrentMergeObject() {
-		var id = _mergeGroup.merge == 'deleted' ?
-			(_mergeGroup.left == 'deleted'
-				? _mergeGroup.right.id : _mergeGroup.left.id)
-			: _mergeGroup.merge.id;
+	this.onResolveAllChange = function (resolveAll) {
+		if (resolveAll || _isLastConflict()) {
+			_showFinishButton();
+		}
+		else {
+			_showNextButton();
+		}
+	}
+	
+	function _updateResolveAllCheckbox() {
+		if (_mergeGroup.rightpane.getAttribute("selected") == 'true') {
+			var label = 'sync.merge.resolveAllRemote';
+		}
+		else {
+			var label = 'sync.merge.resolveAllLocal';
+		}
+		_resolveAllCheckbox.label = Zotero.getString(label);
+	}
+	
+	
+	function _isLastConflict() {
+		return (_pos + 1) == _objects.length;
+	}
+	
+	
+	function _showNextButton() {
+		var nextButton = _wizard.getButton("next");
+		
+		if (Zotero.isMac) {
+			nextButton.setAttribute("hidden", "false");
+			_wizard.getButton("finish").setAttribute("hidden", "true");
+		}
+		else {
+			var buttons = document.getAnonymousElementByAttribute(_wizard, "anonid", "Buttons");
+			var deck = document.getAnonymousElementByAttribute(buttons, "anonid", "WizardButtonDeck");
+			deck.selectedIndex = 1;
+		}
+		
+		_setInstructionsString(nextButton.label);
+	}
+	
+	
+	function _showFinishButton() {
+		var finishButton = _wizard.getButton("finish");
+		
+		if (Zotero.isMac) {
+			_wizard.getButton("next").setAttribute("hidden", "true");
+			finishButton.setAttribute("hidden", "false");
+		}
+		// Windows uses a deck to switch between the Next and Finish buttons
+		// TODO: check Linux
+		else {
+			var buttons = document.getAnonymousElementByAttribute(_wizard, "anonid", "Buttons");
+			var deck = document.getAnonymousElementByAttribute(buttons, "anonid", "WizardButtonDeck");
+			deck.selectedIndex = 0;
+		}
+		
+		_setInstructionsString(finishButton.label);
+	}
+	
+	
+	function _getMergeObject(ref, left, right) {
+		var id = ref == 'deleted'
+			? (left == 'deleted' ? right.id : left.id)
+			: ref.id;
 		
 		return {
 			id: id,
-			ref: _mergeGroup.merge,
-			left: _mergeGroup.left,
-			right: _mergeGroup.right
+			ref: ref,
+			left: left,
+			right: right
 		};
 	}
 	
 	
+	function _getCurrentMergeObject() {
+		return _getMergeObject(_mergeGroup.merge, _mergeGroup.left, _mergeGroup.right);
+	}
+	
+	
 	// Hack to support creator reconciliation via item view
 	function _updateChangedCreators() {
 		if (_mergeGroup.type != 'item') {
diff --git a/chrome/content/zotero/merge.xul b/chrome/content/zotero/merge.xul
index 608f33fba..f15dffb64 100644
--- a/chrome/content/zotero/merge.xul
+++ b/chrome/content/zotero/merge.xul
@@ -48,10 +48,18 @@
 		<description id="zotero-merge-instructions"/>
 		<zoteromergegroup flex="1"/>
 		<separator class="thin"/>
-		<hbox id="zotero-step-count">
-			<label id="zotero-merge-num-objects"/>
-			<label value="&zotero.merge.of;"/>
-			<label id="zotero-merge-total-objects"/>
+		<hbox align="center">
+			<separator orient="vertical" flex="1"/>
+			<hbox>
+				<checkbox id="resolve-all"
+					oncommand="Zotero_Merge_Window.onResolveAllChange(this.checked)"/>
+			</hbox>
+			<separator orient="vertical"/>
+			<hbox id="zotero-step-count">
+				<label id="zotero-merge-num-objects"/>
+				<label value="&zotero.merge.of;"/>
+				<label id="zotero-merge-total-objects"/>
+			</hbox>
 		</hbox>
 	</wizardpage>
 </wizard>
diff --git a/chrome/locale/en-US/zotero/zotero.properties b/chrome/locale/en-US/zotero/zotero.properties
index b18704d1d..670bc5e82 100644
--- a/chrome/locale/en-US/zotero/zotero.properties
+++ b/chrome/locale/en-US/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync			= Remove Groups and Sync
 sync.localObject					= Local Object
 sync.remoteObject					= Remote Object
 sync.mergedObject					= Merged Object
+sync.merge.resolveAllLocal         = Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote        = Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet			= Username not set
 sync.error.usernameNotSet.text		= You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/skin/default/zotero/merge.css b/chrome/skin/default/zotero/merge.css
index ff0e7efed..b54fb52a4 100644
--- a/chrome/skin/default/zotero/merge.css
+++ b/chrome/skin/default/zotero/merge.css
@@ -40,8 +40,9 @@ wizard > deck {
 	padding: 0;
 }
 
-#zotero-step-count {
-	-moz-box-pack: end;
+
+#resolve-all {
+	font-size: 1.1em;
 }
 
 #zotero-step-count label:first-child {

From 52e735b0355ccf6f4eeac867f99f106cc6135118 Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Thu, 26 Mar 2015 20:29:33 -0400
Subject: [PATCH 09/44] Merge locales from Transifex

---
 chrome/locale/af-ZA/zotero/zotero.properties |  3 ++
 chrome/locale/ar/zotero/zotero.properties    |  3 ++
 chrome/locale/bg-BG/zotero/zotero.properties |  3 ++
 chrome/locale/ca-AD/zotero/zotero.properties |  3 ++
 chrome/locale/cs-CZ/zotero/zotero.properties |  3 ++
 chrome/locale/da-DK/zotero/zotero.properties |  3 ++
 chrome/locale/de/zotero/zotero.properties    |  3 ++
 chrome/locale/el-GR/zotero/zotero.properties |  3 ++
 chrome/locale/es-ES/zotero/preferences.dtd   | 10 ++--
 chrome/locale/es-ES/zotero/zotero.properties | 35 ++++++++------
 chrome/locale/et-EE/zotero/zotero.properties |  3 ++
 chrome/locale/eu-ES/zotero/zotero.properties |  3 ++
 chrome/locale/fa/zotero/zotero.properties    |  3 ++
 chrome/locale/fi-FI/zotero/zotero.properties |  3 ++
 chrome/locale/fr-FR/zotero/zotero.properties |  3 ++
 chrome/locale/gl-ES/zotero/zotero.properties |  3 ++
 chrome/locale/he-IL/zotero/zotero.properties |  3 ++
 chrome/locale/hr-HR/zotero/zotero.properties |  3 ++
 chrome/locale/hu-HU/zotero/zotero.properties | 31 ++++++------
 chrome/locale/id-ID/zotero/zotero.properties |  3 ++
 chrome/locale/is-IS/zotero/zotero.properties |  3 ++
 chrome/locale/it-IT/zotero/zotero.properties |  3 ++
 chrome/locale/ja-JP/zotero/zotero.properties |  3 ++
 chrome/locale/km/zotero/zotero.properties    |  3 ++
 chrome/locale/ko-KR/zotero/zotero.properties |  3 ++
 chrome/locale/lt-LT/zotero/zotero.properties |  3 ++
 chrome/locale/mn-MN/zotero/zotero.properties |  3 ++
 chrome/locale/nb-NO/zotero/zotero.properties |  3 ++
 chrome/locale/nl-NL/zotero/zotero.properties |  3 ++
 chrome/locale/nn-NO/zotero/zotero.properties |  3 ++
 chrome/locale/pl-PL/zotero/zotero.properties |  3 ++
 chrome/locale/pt-BR/zotero/zotero.properties |  3 ++
 chrome/locale/pt-PT/zotero/zotero.properties |  3 ++
 chrome/locale/ro-RO/zotero/zotero.properties |  3 ++
 chrome/locale/ru-RU/zotero/zotero.properties |  3 ++
 chrome/locale/sk-SK/zotero/zotero.properties |  3 ++
 chrome/locale/sl-SI/zotero/zotero.properties |  3 ++
 chrome/locale/sr-RS/zotero/zotero.properties |  3 ++
 chrome/locale/sv-SE/zotero/zotero.properties |  3 ++
 chrome/locale/th-TH/zotero/zotero.properties |  3 ++
 chrome/locale/tr-TR/zotero/preferences.dtd   |  4 +-
 chrome/locale/tr-TR/zotero/zotero.dtd        |  2 +-
 chrome/locale/tr-TR/zotero/zotero.properties | 51 +++++++++++---------
 chrome/locale/uk-UA/zotero/zotero.properties |  3 ++
 chrome/locale/vi-VN/zotero/zotero.properties |  3 ++
 chrome/locale/zh-CN/zotero/zotero.properties |  3 ++
 chrome/locale/zh-TW/zotero/zotero.properties |  3 ++
 47 files changed, 194 insertions(+), 62 deletions(-)

diff --git a/chrome/locale/af-ZA/zotero/zotero.properties b/chrome/locale/af-ZA/zotero/zotero.properties
index f42d73143..184cd38e5 100644
--- a/chrome/locale/af-ZA/zotero/zotero.properties
+++ b/chrome/locale/af-ZA/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync
 sync.localObject=Local Object
 sync.remoteObject=Remote Object
 sync.mergedObject=Merged Object
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Username not set
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/ar/zotero/zotero.properties b/chrome/locale/ar/zotero/zotero.properties
index 4aef0e044..ad9810662 100644
--- a/chrome/locale/ar/zotero/zotero.properties
+++ b/chrome/locale/ar/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=حذف مجموعات المشاركة و المزام
 sync.localObject=كائن محلي
 sync.remoteObject=كائن عن بعد
 sync.mergedObject=كائن مدمج
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=لم يتم تعيين اسم المستخدم
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/bg-BG/zotero/zotero.properties b/chrome/locale/bg-BG/zotero/zotero.properties
index 15ad29293..b89861172 100644
--- a/chrome/locale/bg-BG/zotero/zotero.properties
+++ b/chrome/locale/bg-BG/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Отстранява групите и синхрони
 sync.localObject=Локален запис
 sync.remoteObject=Делечен запис
 sync.mergedObject=Слят запис
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Потребителското име не е въведено
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/ca-AD/zotero/zotero.properties b/chrome/locale/ca-AD/zotero/zotero.properties
index 0a7bfaede..3c3a0b974 100644
--- a/chrome/locale/ca-AD/zotero/zotero.properties
+++ b/chrome/locale/ca-AD/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Elimina el grup i sincronitza
 sync.localObject=Objecte local
 sync.remoteObject=Objecte remot
 sync.mergedObject=Objecte fusionat
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=No s'ha establit un nom d'usuari
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/cs-CZ/zotero/zotero.properties b/chrome/locale/cs-CZ/zotero/zotero.properties
index a5bfc99c8..2ebde2695 100644
--- a/chrome/locale/cs-CZ/zotero/zotero.properties
+++ b/chrome/locale/cs-CZ/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Odstranit skupinu a synchronizovat
 sync.localObject=Lokální objekt
 sync.remoteObject=Vzdálený objekt
 sync.mergedObject=Sloučený objekt
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Uživatelské jméno není nastaveno
 sync.error.usernameNotSet.text=Musíte zadat své uživatelské jméno a heslo ze zotero.org v Nastavení Zotera, pokud chcete provést synchronizaci s Zotero serverem.
diff --git a/chrome/locale/da-DK/zotero/zotero.properties b/chrome/locale/da-DK/zotero/zotero.properties
index 0b160efbf..111ea0a2d 100644
--- a/chrome/locale/da-DK/zotero/zotero.properties
+++ b/chrome/locale/da-DK/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Fjern grupper og synkronisering
 sync.localObject=Lokalt objekt
 sync.remoteObject=Eksternt objekt
 sync.mergedObject=Sammenflettet objekt
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Brugernavn ikke angivet
 sync.error.usernameNotSet.text=Du skal indtaste dit zotero.org brugernavn og adgangskode i Zotero-indstillingerne for at synkronisere med Zotero-serveren.
diff --git a/chrome/locale/de/zotero/zotero.properties b/chrome/locale/de/zotero/zotero.properties
index 7ebe46d60..f119d92f1 100644
--- a/chrome/locale/de/zotero/zotero.properties
+++ b/chrome/locale/de/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Gruppen entfernen und synchronisieren
 sync.localObject=Lokales Objekt
 sync.remoteObject=Remote-Objekt
 sync.mergedObject=Zusammengeführtes Objekt
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Benutzername nicht definiert
 sync.error.usernameNotSet.text=Sie müssen Ihren zotero.org Benutzernamen und Passwort in den Zotero Einstellungen eingeben, um mit dem Zotero Server zu synchronisieren.
diff --git a/chrome/locale/el-GR/zotero/zotero.properties b/chrome/locale/el-GR/zotero/zotero.properties
index ecc153f89..0e7ba7a0c 100644
--- a/chrome/locale/el-GR/zotero/zotero.properties
+++ b/chrome/locale/el-GR/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync
 sync.localObject=Local Object
 sync.remoteObject=Remote Object
 sync.mergedObject=Merged Object
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Username not set
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/es-ES/zotero/preferences.dtd b/chrome/locale/es-ES/zotero/preferences.dtd
index bb0ca42f2..0f0b6c5f7 100644
--- a/chrome/locale/es-ES/zotero/preferences.dtd
+++ b/chrome/locale/es-ES/zotero/preferences.dtd
@@ -1,6 +1,6 @@
 <!ENTITY zotero.preferences.title "Preferencias de Zotero">
 
-<!ENTITY zotero.preferences.default "Inicial:">
+<!ENTITY zotero.preferences.default "Predeterminado:">
 <!ENTITY zotero.preferences.items "elementos">
 <!ENTITY zotero.preferences.period ",">
 <!ENTITY zotero.preferences.settings "Preferencias">
@@ -48,7 +48,7 @@
 
 <!ENTITY zotero.preferences.prefpane.sync "Sincronizar">
 <!ENTITY zotero.preferences.sync.username "Usuario:">
-<!ENTITY zotero.preferences.sync.password "Clave:">
+<!ENTITY zotero.preferences.sync.password "Contraseña:">
 <!ENTITY zotero.preferences.sync.syncServer "Servidor de sincronización Zotero">
 <!ENTITY zotero.preferences.sync.createAccount "Crear cuenta">
 <!ENTITY zotero.preferences.sync.lostPassword "¿Olvidó su contraseña?">
@@ -130,7 +130,7 @@
 <!ENTITY zotero.preferences.keys.quicksearch "Búsqueda rápida">
 <!ENTITY zotero.preferences.keys.newItem "Crear un nuevo elemento">
 <!ENTITY zotero.preferences.keys.newNote "Crear una Nueva nota">
-<!ENTITY zotero.preferences.keys.toggleTagSelector "Conmutar el selector de marcas">
+<!ENTITY zotero.preferences.keys.toggleTagSelector "Conmutar el selector de etiquetas">
 <!ENTITY zotero.preferences.keys.copySelectedItemCitationsToClipboard "Copiar las citas para los elementos seleccionados al portapapeles">
 <!ENTITY zotero.preferences.keys.copySelectedItemsToClipboard "Copiar los elementos seleccionados al portapapeles">
 <!ENTITY zotero.preferences.keys.importFromClipboard "Importar desde el portapapeles">
@@ -160,7 +160,7 @@
 
 <!ENTITY zotero.preferences.prefpane.advanced "Avanzadas">
 <!ENTITY zotero.preferences.advanced.filesAndFolders "Archivos y carpetas">
-<!ENTITY zotero.preferences.advanced.keys "Shortcuts">
+<!ENTITY zotero.preferences.advanced.keys "Atajos">
 
 <!ENTITY zotero.preferences.prefpane.locate "Localizar">
 <!ENTITY zotero.preferences.locate.locateEngineManager "Administrador de motor de búsqueda de artículo">
@@ -194,7 +194,7 @@
 
 <!ENTITY zotero.preferences.debugOutputLogging "Registro de emisión de depuración">
 <!ENTITY zotero.preferences.debugOutputLogging.message "La emisión de depuración puede ayudar a los desarrolladores de Zotero a diagnosticar problemas. Como el registro de depuración enlentece a Zotero, deberías dejarlo desactivado normalmente a menos que algún desarrollador de Zotero te pida la salida de depuración.">
-<!ENTITY zotero.preferences.debugOutputLogging.linesLogged "líneas en el registro">
+<!ENTITY zotero.preferences.debugOutputLogging.linesLogged "líneas registradas">
 <!ENTITY zotero.preferences.debugOutputLogging.enableAfterRestart "Activar tras el reinicio">
 <!ENTITY zotero.preferences.debugOutputLogging.viewOutput "Ver salida">
 <!ENTITY zotero.preferences.debugOutputLogging.clearOutput "Limpiar salida">
diff --git a/chrome/locale/es-ES/zotero/zotero.properties b/chrome/locale/es-ES/zotero/zotero.properties
index 5e9876446..4bb73516f 100644
--- a/chrome/locale/es-ES/zotero/zotero.properties
+++ b/chrome/locale/es-ES/zotero/zotero.properties
@@ -42,7 +42,7 @@ general.create=Crear
 general.delete=Borrar
 general.moreInformation=Más información
 general.seeForMoreInformation=Mira en %S para más información
-general.open=Open %S
+general.open=Abrir %S
 general.enable=Activar
 general.disable=Desactivar
 general.remove=Eliminar
@@ -204,11 +204,11 @@ pane.items.trash.multiple=¿Seguro que quieres enviar los ítems a la papelera?
 pane.items.delete.title=Borrar
 pane.items.delete=¿Seguro que quieres borrar el ítem asociado?
 pane.items.delete.multiple=¿Seguro que quieres borrar los ítems seleccionados?
-pane.items.remove.title=Remove from Collection
-pane.items.remove=Are you sure you want to remove the selected item from this collection?
-pane.items.remove.multiple=Are you sure you want to remove the selected items from this collection?
-pane.items.menu.remove=Remove Item from Collection…
-pane.items.menu.remove.multiple=Remove Items from Collection…
+pane.items.remove.title=Quitar de la colección
+pane.items.remove=¿Seguro que quiere eliminar el elemento seleccionado de esta colección?
+pane.items.remove.multiple=¿Está seguro que quiere eliminar estos elementos seleccionados de esta colección?
+pane.items.menu.remove=Quitar ítem de la colección...
+pane.items.menu.remove.multiple=Quitar ítems de la colección...
 pane.items.menu.moveToTrash=Mover ítem a la papelera...
 pane.items.menu.moveToTrash.multiple=Mover ítems a la papelera...
 pane.items.menu.export=Exportar el ítem seleccionado...
@@ -566,15 +566,15 @@ zotero.preferences.export.quickCopy.exportFormats=Formatos de exportación
 zotero.preferences.export.quickCopy.instructions=La copia rápida te permite copiar referencias seleccionadas al portapapeles pulsando un atajo (%S) o arrastrando ítems a una casilla de texto en una página web.
 zotero.preferences.export.quickCopy.citationInstructions=Para estilos bibliográficos, puedes copiar las citas o pies de página presionando %S o manteniendo pulsada la tecla Mayúsculas antes de arrastrar los ítems.
 
-zotero.preferences.wordProcessors.installationSuccess=Installation was successful.
-zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S.
-zotero.preferences.wordProcessors.installed=The %S add-in is currently installed.
-zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed.
-zotero.preferences.wordProcessors.install=Install %S Add-in
-zotero.preferences.wordProcessors.reinstall=Reinstall %S Add-in
-zotero.preferences.wordProcessors.installing=Installing %S…
-zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S is incompatible with versions of %3$S before %4$S. Please remove %3$S, or download the latest version from %5$S.
-zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requires %3$S %4$S or later to run. Please download the latest version of %3$S from %5$S.
+zotero.preferences.wordProcessors.installationSuccess=Instalación fue exitosa.
+zotero.preferences.wordProcessors.installationError=Instalación no pudo ser completada debido a que un error ocurrió. Por favor asegúrese que %1$S está cerrado, posteriormente reinicie %2$S.
+zotero.preferences.wordProcessors.installed=El complemento %S está actualmente instalado.
+zotero.preferences.wordProcessors.notInstalled=El complemento %S no está actualmente instalado.
+zotero.preferences.wordProcessors.install=Instalar complemento %S
+zotero.preferences.wordProcessors.reinstall=Reinstalar complemento %S
+zotero.preferences.wordProcessors.installing=Instalado %S...
+zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S es incompatible con las versiones de %3$S anteriores %4$S. Por favor quite %3$S, o descargue la última versión desde %5$S.
+zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requiere %3$S %4$S o posteriores para funcionar. Por favor descargue la última versión de %3$S desde %5$S.
 
 zotero.preferences.styles.addStyle=Agregar estilo
 
@@ -738,7 +738,7 @@ integration.missingItem.multiple=El ítem %1$S en esta cita ya no existe en tu b
 integration.missingItem.description=Al pulsar "No" borrarás los códigos de campo para citas conteniendo este ítem, manteniendo el texto de la cita pero borrándolo de tu bibliografía.
 integration.removeCodesWarning=Quitando los códigos de campo impedirás que Zotero de actualice citas y bibliografías en este documento. ¿Estás seguro de que deseas continuar?
 integration.upgradeWarning=Tu documento debe ser actualizado de versión de manera permanente para poder funcionar con Zotero 2.1 o posterior. Se recomienda hacer una copia de seguridad antes de proceder. ¿Seguro que quieres continuar?
-integration.error.newerDocumentVersion=Your document was created with a newer version of Zotero (%1$S) than the currently installed version (%2$S). Please upgrade Zotero before editing this document.
+integration.error.newerDocumentVersion=Su documento fue creado con una versión más reciente de Zotero (%1$S) que la actual versión instalada (%2$S). Por favor actualice Zotero antes de editar este documento.
 integration.corruptField=El código de campo Zotero correspondiente a esta cita, el cual señala a Zotero qué ítem en su biblioteca esta cita representa, se ha dañado. ¿Te gustaría volver a seleccionar este ítem?
 integration.corruptField.description=Al pulsar "No" borrarás los códigos de campo para las citas conteniendo este ítem, preservando este texto de cita pero potencialmente borrándolo de tu bibliografía.
 integration.corruptBibliography=El código de campo Zotero en tu bibliografía está corrupto. ¿Debería Zotero borrar este código de campo y generar una nueva bibliografía?
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Quitar grupos y sincronizar
 sync.localObject=Objeto local
 sync.remoteObject=Objeto remoto
 sync.mergedObject=Unir objeto
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Nombre de usuario no provisto
 sync.error.usernameNotSet.text=Debes introducir tu usuario y contraseña de zotero.org en las preferencias de Zotero para sincronizar con el servidor de Zotero.
diff --git a/chrome/locale/et-EE/zotero/zotero.properties b/chrome/locale/et-EE/zotero/zotero.properties
index 7dd48ee29..6feae0d6f 100644
--- a/chrome/locale/et-EE/zotero/zotero.properties
+++ b/chrome/locale/et-EE/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Eemalda Grupid ja Sync
 sync.localObject=Kohalik objekt
 sync.remoteObject=Serveri objekt
 sync.mergedObject=Liidetud objekt
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Kasutajanimi ei ole määratud
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/eu-ES/zotero/zotero.properties b/chrome/locale/eu-ES/zotero/zotero.properties
index 73c763c17..daab73d9e 100644
--- a/chrome/locale/eu-ES/zotero/zotero.properties
+++ b/chrome/locale/eu-ES/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Ezabatu Groups eta Sync
 sync.localObject=item lokala
 sync.remoteObject=serbidoreko itema
 sync.mergedObject=proposamen automatikoa
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Erabiltzaile izena ezarri gabe
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/fa/zotero/zotero.properties b/chrome/locale/fa/zotero/zotero.properties
index 11a0a78ed..817b1eae0 100644
--- a/chrome/locale/fa/zotero/zotero.properties
+++ b/chrome/locale/fa/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=حذف گروه‌ها و همزمان‌‌سازی
 sync.localObject=شیء محلی
 sync.remoteObject=شیء دور
 sync.mergedObject=شیء تلفیقی
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=نام کاربری وارد نشده است
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/fi-FI/zotero/zotero.properties b/chrome/locale/fi-FI/zotero/zotero.properties
index b5e8b0475..969febb14 100644
--- a/chrome/locale/fi-FI/zotero/zotero.properties
+++ b/chrome/locale/fi-FI/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Poista ryhmät ja synkronointi
 sync.localObject=Paikallinen objekti
 sync.remoteObject=Etäobjekti
 sync.mergedObject=Yhdistetty objekti
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Käyttäjänimeä ei määritetty
 sync.error.usernameNotSet.text=Syötä zotero.orgin käyttäjätunnus ja salasana Zoteron asetuksissa, jotta voit synkronoida tiedot Zotero-palvelimen kanssa.
diff --git a/chrome/locale/fr-FR/zotero/zotero.properties b/chrome/locale/fr-FR/zotero/zotero.properties
index 6d9bf15b4..481126775 100644
--- a/chrome/locale/fr-FR/zotero/zotero.properties
+++ b/chrome/locale/fr-FR/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Retirer les groupes et synchroniser
 sync.localObject=Objet local
 sync.remoteObject=Objet distant
 sync.mergedObject=Objet fusionné
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Identifiant non défini
 sync.error.usernameNotSet.text=Vous devez saisir vos nom d'utilisateur et  mot de passe, propres à zotero.org, dans les Préférences de Zotero pour synchroniser avec le serveur Zotero.
diff --git a/chrome/locale/gl-ES/zotero/zotero.properties b/chrome/locale/gl-ES/zotero/zotero.properties
index ac2e4724e..bd97e6c81 100644
--- a/chrome/locale/gl-ES/zotero/zotero.properties
+++ b/chrome/locale/gl-ES/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Borrar o grupo e a sincronización
 sync.localObject=Obxecto local
 sync.remoteObject=Obxecto remoto
 sync.mergedObject=Obxecto unido
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Nome de usuario sen definir
 sync.error.usernameNotSet.text=Tes que introducir o teu nome de usuario de zotero.org e o contrasinal nas preferencias de Zotero e con iso poder sincronizar co servidor de Zotero.
diff --git a/chrome/locale/he-IL/zotero/zotero.properties b/chrome/locale/he-IL/zotero/zotero.properties
index 030378a8d..7fb3d6752 100644
--- a/chrome/locale/he-IL/zotero/zotero.properties
+++ b/chrome/locale/he-IL/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync
 sync.localObject=Local Object
 sync.remoteObject=Remote Object
 sync.mergedObject=Merged Object
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Username not set
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/hr-HR/zotero/zotero.properties b/chrome/locale/hr-HR/zotero/zotero.properties
index f42d73143..184cd38e5 100644
--- a/chrome/locale/hr-HR/zotero/zotero.properties
+++ b/chrome/locale/hr-HR/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync
 sync.localObject=Local Object
 sync.remoteObject=Remote Object
 sync.mergedObject=Merged Object
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Username not set
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/hu-HU/zotero/zotero.properties b/chrome/locale/hu-HU/zotero/zotero.properties
index cb5d9b460..c113c7392 100644
--- a/chrome/locale/hu-HU/zotero/zotero.properties
+++ b/chrome/locale/hu-HU/zotero/zotero.properties
@@ -42,7 +42,7 @@ general.create=Új
 general.delete=Törlés
 general.moreInformation=További információ
 general.seeForMoreInformation=A %S bővebb információkat tartalmaz.
-general.open=Open %S
+general.open=Megnyitás %S
 general.enable=Bekapcsolás
 general.disable=Kikapcsolás
 general.remove=Eltávolítás
@@ -194,7 +194,7 @@ tagColorChooser.numberKeyInstructions=You can add this tag to selected items by
 tagColorChooser.maxTags=Up to %S tags in each library can have colors assigned.
 
 pane.items.loading=Elemek listájának betöltése...
-pane.items.columnChooser.moreColumns=More Columns
+pane.items.columnChooser.moreColumns=Több oszlop
 pane.items.columnChooser.secondarySort=Másodlagos adatrendezés (%S)
 pane.items.attach.link.uri.unrecognized=A Zotero nem ismerte fel a beírt URI-t. Kérem ellenőrizze a címet és próbálja újra.
 pane.items.attach.link.uri.file=Ha linket szeretne csatolni egy fájlhoz, kérem használja a “%S”-t.
@@ -204,11 +204,11 @@ pane.items.trash.multiple=A Kukába helyezés megerősítése?
 pane.items.delete.title=Törlés
 pane.items.delete=A kijelölt elem törlésének megerősítése?
 pane.items.delete.multiple=A kijelölt elemek törlésének megerősítése?
-pane.items.remove.title=Remove from Collection
-pane.items.remove=Are you sure you want to remove the selected item from this collection?
-pane.items.remove.multiple=Are you sure you want to remove the selected items from this collection?
-pane.items.menu.remove=Remove Item from Collection…
-pane.items.menu.remove.multiple=Remove Items from Collection…
+pane.items.remove.title=Gyűjtemény törlése...
+pane.items.remove=Biztos, hogy el akarja távolítani a kijelölt elemet a gyűjteményből?
+pane.items.remove.multiple=Biztos, hogy el akarja távolítani a kijelölt elemeket a gyűjteményből?
+pane.items.menu.remove=Kijelölt elem törlése
+pane.items.menu.remove.multiple=Kijelölt elemek törlése
 pane.items.menu.moveToTrash=Elem mozgatása a Kukába…
 pane.items.menu.moveToTrash.multiple=Elem mozgatása a Kukába…
 pane.items.menu.export=Kiválasztott elem exportálása...
@@ -225,7 +225,7 @@ pane.items.menu.createParent=Szülőelem létrehozása a kijelölt elem alapján
 pane.items.menu.createParent.multiple=Szülőelemek létrehozása a kijelölt elemek alapján
 pane.items.menu.renameAttachments=A fájl átnevezése a szülő metaadata alapján
 pane.items.menu.renameAttachments.multiple=A fájlok átnevezése a szülők metaadata alapján
-pane.items.showItemInLibrary=Show Item in Library
+pane.items.showItemInLibrary=Az elem megjelenítése könyvtárban
 
 pane.items.letter.oneParticipant=Levél (címzett: %S)
 pane.items.letter.twoParticipants=Levél (címzett: %S és %S)
@@ -566,13 +566,13 @@ zotero.preferences.export.quickCopy.exportFormats=Exportálási formátumok
 zotero.preferences.export.quickCopy.instructions=A Gyorsmásolás segítségével a kiválasztott hivatkozásokat a vágólapra lehet másolni a %S gyorsbillentyű lenyomásával. A hivatkozást egy tetszőleges weboldal szövegmezőjébe is be lehet másolni, ha a kijelölt hivatkozást a szövegmezőbe húzzuk.
 zotero.preferences.export.quickCopy.citationInstructions=Bibliográfia-stílusokhoz, %S megnyomásával másolhat hivatkozásokat vagy lábjegyzeteket, vagy tartsa lenyomva a Shift-et az elemek áthúzáshoz.
 
-zotero.preferences.wordProcessors.installationSuccess=Installation was successful.
+zotero.preferences.wordProcessors.installationSuccess=A telepítés sikeresen befejeződött.
 zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S.
 zotero.preferences.wordProcessors.installed=The %S add-in is currently installed.
 zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed.
 zotero.preferences.wordProcessors.install=Install %S Add-in
 zotero.preferences.wordProcessors.reinstall=Reinstall %S Add-in
-zotero.preferences.wordProcessors.installing=Installing %S…
+zotero.preferences.wordProcessors.installing=Telepítés %S…
 zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S is incompatible with versions of %3$S before %4$S. Please remove %3$S, or download the latest version from %5$S.
 zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requires %3$S %4$S or later to run. Please download the latest version of %3$S from %5$S.
 
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Csoport és szinkronizáció eltávolítása
 sync.localObject=Helyi objektum
 sync.remoteObject=Távoli objektum
 sync.mergedObject=Összefésült objektum
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Felhasználónév nincs megadva
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
@@ -985,11 +988,11 @@ firstRunGuidance.quickFormatMac=Type a title or author to search for a reference
 firstRunGuidance.toolbarButton.new=A Zotero megnyitásához kattintásához kattintson ide, vagy használja a %S billentyűparancsot.
 firstRunGuidance.toolbarButton.upgrade=A Zotero ikon mostantól a Firefox eszköztárán található. A Zotero megnyitásához kattintson az ikonra, vagy használja a %S gyorsbillentyűt.
 
-styles.bibliography=Bibliography
-styles.editor.save=Save Citation Style
-styles.editor.warning.noItems=No items selected in Zotero.
+styles.bibliography=Bibliográfia
+styles.editor.save=Hivatkozási stílus mentése
+styles.editor.warning.noItems=Nincs kiválasztott elem a Zoteroban.
 styles.editor.warning.parseError=Error parsing style:
-styles.editor.warning.renderError=Error generating citations and bibliography:
+styles.editor.warning.renderError=Hiba a hivatkozások és a bibliográfia generálása közben:
 styles.editor.output.individualCitations=Individual Citations
 styles.editor.output.singleCitation=Single Citation (with position "first")
 styles.preview.instructions=Select one or more items in Zotero and click the "Refresh" button to see how these items are rendered by the installed CSL citation styles.
diff --git a/chrome/locale/id-ID/zotero/zotero.properties b/chrome/locale/id-ID/zotero/zotero.properties
index 7fc8cfca7..c32b67e5d 100644
--- a/chrome/locale/id-ID/zotero/zotero.properties
+++ b/chrome/locale/id-ID/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Hapus Grup dan Sinkronisasi
 sync.localObject=Objek Lokal
 sync.remoteObject=Objek Jauh
 sync.mergedObject=Objek Gabungan
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Nama pengguna belum diset
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/is-IS/zotero/zotero.properties b/chrome/locale/is-IS/zotero/zotero.properties
index cbfb0fff2..b78819e7f 100644
--- a/chrome/locale/is-IS/zotero/zotero.properties
+++ b/chrome/locale/is-IS/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Fjarlægja hópa og samhæfa
 sync.localObject=Staðbundinn hlutur
 sync.remoteObject=Fjartengdur hlutur
 sync.mergedObject=Sameinaður hlutur
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Notandanafn ekki tilgreint
 sync.error.usernameNotSet.text=Þú verður að færa inn zotero.org notandanafn og lykilorð í Zotero kjörstillingum til að samhæfa Zotero þjóni.
diff --git a/chrome/locale/it-IT/zotero/zotero.properties b/chrome/locale/it-IT/zotero/zotero.properties
index 8a3317d6a..5bf41139e 100644
--- a/chrome/locale/it-IT/zotero/zotero.properties
+++ b/chrome/locale/it-IT/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Rimuovere i Gruppi e la Sincronizzazione
 sync.localObject=Oggetto locale
 sync.remoteObject=Oggetto remoto
 sync.mergedObject=Oggetto unificato
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Nome utente non impostato
 sync.error.usernameNotSet.text=È necessario inserire le proprie credenziali di zotero.org nelle impostazioni di Zotero per attivare la sincronizzazione con il server Zotero.
diff --git a/chrome/locale/ja-JP/zotero/zotero.properties b/chrome/locale/ja-JP/zotero/zotero.properties
index c1657a4e6..4f0ddc86f 100644
--- a/chrome/locale/ja-JP/zotero/zotero.properties
+++ b/chrome/locale/ja-JP/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=グループと同期を取り除く
 sync.localObject=ローカル(手元)のオブジェクト
 sync.remoteObject=リモート(サーバ側)のオブジェクト
 sync.mergedObject=統合されたオブジェクト
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=ユーザーネームが指定されていません
 sync.error.usernameNotSet.text=Zotero サーバーと同期するためには、Zotero 環境設定において、zotero.org のユーザー名とパスワードを入力する必要があります。
diff --git a/chrome/locale/km/zotero/zotero.properties b/chrome/locale/km/zotero/zotero.properties
index fb05361ed..fd6a8005e 100644
--- a/chrome/locale/km/zotero/zotero.properties
+++ b/chrome/locale/km/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=លុបក្រុម និង សមកាលក
 sync.localObject=វត្ថុមូលដ្ឋាន
 sync.remoteObject=វត្ថុឆ្ងាយ
 sync.mergedObject=វត្ថុរួម
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=មិនបានដាក់ឈ្មោះអ្នកប្រើ
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/ko-KR/zotero/zotero.properties b/chrome/locale/ko-KR/zotero/zotero.properties
index d2f2f10f3..3b5e3b8f9 100644
--- a/chrome/locale/ko-KR/zotero/zotero.properties
+++ b/chrome/locale/ko-KR/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=그룹 및 동기화 제거
 sync.localObject=지역 개체
 sync.remoteObject=원격 개체
 sync.mergedObject=병합된 개체
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=사용자명 설정되지 않음
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/lt-LT/zotero/zotero.properties b/chrome/locale/lt-LT/zotero/zotero.properties
index 0bc7421d1..c3c2be77e 100644
--- a/chrome/locale/lt-LT/zotero/zotero.properties
+++ b/chrome/locale/lt-LT/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Pašalinti grupes ir sinchronizuoti
 sync.localObject=Vietinis objektas
 sync.remoteObject=Nutolęs objektas
 sync.mergedObject=Apjungtas objektas
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Nenurodytas naudotojo vardas
 sync.error.usernameNotSet.text=Norėdami duomenis sinchronizuoti su Zotero serveriu, įveskite savo zotero.org naudotojo vardą ir slaptažodį.
diff --git a/chrome/locale/mn-MN/zotero/zotero.properties b/chrome/locale/mn-MN/zotero/zotero.properties
index 2cf0f811a..44bfb24b1 100644
--- a/chrome/locale/mn-MN/zotero/zotero.properties
+++ b/chrome/locale/mn-MN/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync
 sync.localObject=Local Object
 sync.remoteObject=Remote Object
 sync.mergedObject=Merged Object
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Username not set
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/nb-NO/zotero/zotero.properties b/chrome/locale/nb-NO/zotero/zotero.properties
index 15c3cb60e..c3bf28fae 100644
--- a/chrome/locale/nb-NO/zotero/zotero.properties
+++ b/chrome/locale/nb-NO/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync
 sync.localObject=Local Object
 sync.remoteObject=Remote Object
 sync.mergedObject=Merged Object
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Username not set
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/nl-NL/zotero/zotero.properties b/chrome/locale/nl-NL/zotero/zotero.properties
index 74fd49f43..19caf1d7d 100644
--- a/chrome/locale/nl-NL/zotero/zotero.properties
+++ b/chrome/locale/nl-NL/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Groepen en synchronisatie verwijderen
 sync.localObject=Lokaal item
 sync.remoteObject=Item van server
 sync.mergedObject=Samengevoegd item
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Gebruikersnaam niet ingesteld
 sync.error.usernameNotSet.text=U moet uw zotero.org gebruikersnaam en wachtwoord in de Zotero-voorkeuren invoeren om te kunnen synchroniseren met de Zotero-server.
diff --git a/chrome/locale/nn-NO/zotero/zotero.properties b/chrome/locale/nn-NO/zotero/zotero.properties
index cfa7f47b8..511a5f796 100644
--- a/chrome/locale/nn-NO/zotero/zotero.properties
+++ b/chrome/locale/nn-NO/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync
 sync.localObject=Local Object
 sync.remoteObject=Remote Object
 sync.mergedObject=Merged Object
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Username not set
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/pl-PL/zotero/zotero.properties b/chrome/locale/pl-PL/zotero/zotero.properties
index 7c6e337b5..a00ee0f13 100644
--- a/chrome/locale/pl-PL/zotero/zotero.properties
+++ b/chrome/locale/pl-PL/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Usuń grupy i synchronizuj
 sync.localObject=Obiekt lokalny
 sync.remoteObject=Obiekt zdalny
 sync.mergedObject=Złączony obiekt
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Nie podano nazwy użytkownika
 sync.error.usernameNotSet.text=W celu synchronizacji z serwerem Zotero musisz podać w ustawieniach Zotero swoją nazwę użytkownika i hasło używane w serwisie zotero.org.
diff --git a/chrome/locale/pt-BR/zotero/zotero.properties b/chrome/locale/pt-BR/zotero/zotero.properties
index b8e45a449..356a132e2 100644
--- a/chrome/locale/pt-BR/zotero/zotero.properties
+++ b/chrome/locale/pt-BR/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remover grupos e sincronização
 sync.localObject=Objeto local
 sync.remoteObject=Objeto remoto
 sync.mergedObject=Objeto mesclado
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Nome de usuário não configurado
 sync.error.usernameNotSet.text=Você deve inserir seu nome de usuário e senha do zotero.org nas preferências do Zotero para sincronizar os dados com o servidor Zotero.
diff --git a/chrome/locale/pt-PT/zotero/zotero.properties b/chrome/locale/pt-PT/zotero/zotero.properties
index 5f8dd5e6c..1c416af7a 100644
--- a/chrome/locale/pt-PT/zotero/zotero.properties
+++ b/chrome/locale/pt-PT/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remover Grupos e Sincronização
 sync.localObject=Objecto Local
 sync.remoteObject=Objecto Remoto
 sync.mergedObject=Objecto Integrado
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Nome de utilizador por indicar
 sync.error.usernameNotSet.text=Tem de introduzir o seu nome de utilizador e a sua palavra-passe do zotero.org nas preferências Zotero para sincronizar com o servidor Zotero.
diff --git a/chrome/locale/ro-RO/zotero/zotero.properties b/chrome/locale/ro-RO/zotero/zotero.properties
index bbe895dae..ae949aec2 100644
--- a/chrome/locale/ro-RO/zotero/zotero.properties
+++ b/chrome/locale/ro-RO/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Șterge Grupuri și Sincronizare
 sync.localObject=Obiect local
 sync.remoteObject=Obiect la distanță
 sync.mergedObject=Obiect unificat
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Nume de utilizator neconfigurat
 sync.error.usernameNotSet.text=Trebuie să introduci numele de utilizator zotero.org și parola în preferințele Zotero pentru a sincroniza cu serverul Zotero.
diff --git a/chrome/locale/ru-RU/zotero/zotero.properties b/chrome/locale/ru-RU/zotero/zotero.properties
index 878a22c73..bf01e5e0e 100644
--- a/chrome/locale/ru-RU/zotero/zotero.properties
+++ b/chrome/locale/ru-RU/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Обнулить группы и синхронизир
 sync.localObject=Локальный объект
 sync.remoteObject=Удаленный объект
 sync.mergedObject=Объединенный объект
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Имя пользователя не установлено
 sync.error.usernameNotSet.text=Для выполнения синхронизации с сервером Zotero необходимо указать имя и пароль пользователя для zotero.org в настройках Zotero.
diff --git a/chrome/locale/sk-SK/zotero/zotero.properties b/chrome/locale/sk-SK/zotero/zotero.properties
index b13606bcc..480a019c8 100644
--- a/chrome/locale/sk-SK/zotero/zotero.properties
+++ b/chrome/locale/sk-SK/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Odstrániť skupiny a synchronizovať
 sync.localObject=Miestny objekt
 sync.remoteObject=Vzdialený objekt
 sync.mergedObject=Zlúčený objekt
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Nie je nastavené meno používateľa
 sync.error.usernameNotSet.text=Pre synchronizáciu so serverom Zotero musíte zadať vaše užívateľské meno a heslo pre zotero.org v predvoľbách Zotera.
diff --git a/chrome/locale/sl-SI/zotero/zotero.properties b/chrome/locale/sl-SI/zotero/zotero.properties
index 542ba7c59..8f3f640ba 100644
--- a/chrome/locale/sl-SI/zotero/zotero.properties
+++ b/chrome/locale/sl-SI/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Odstrani skupine in usklajevanje
 sync.localObject=Krajevni predmet
 sync.remoteObject=Oddaljeni predmet
 sync.mergedObject=Spojeni predmet
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Uporabniško ime ni določeno
 sync.error.usernameNotSet.text=Za usklajevanje s strežnikom Zotero morate v nastavitvah Zotero vnesti svoje uporabniško ime in geslo za zotero.org.
diff --git a/chrome/locale/sr-RS/zotero/zotero.properties b/chrome/locale/sr-RS/zotero/zotero.properties
index ea801d86b..b44d57ef7 100644
--- a/chrome/locale/sr-RS/zotero/zotero.properties
+++ b/chrome/locale/sr-RS/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync
 sync.localObject=Local Object
 sync.remoteObject=Remote Object
 sync.mergedObject=Merged Object
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Username not set
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/sv-SE/zotero/zotero.properties b/chrome/locale/sv-SE/zotero/zotero.properties
index 4c73f4ea3..015a16c87 100644
--- a/chrome/locale/sv-SE/zotero/zotero.properties
+++ b/chrome/locale/sv-SE/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Ta bort grupp och synkronisering
 sync.localObject=Lokalt objekt
 sync.remoteObject=Fjärrobjekt
 sync.mergedObject=Ihopsatt objekt
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Användarnamn är inte valt
 sync.error.usernameNotSet.text=Du måste ange ditt zotero.org-användarnamn och lösenord i Zoteros egenskaper för att synkronisera med Zotero-servern.
diff --git a/chrome/locale/th-TH/zotero/zotero.properties b/chrome/locale/th-TH/zotero/zotero.properties
index 791710cdc..491942eb9 100644
--- a/chrome/locale/th-TH/zotero/zotero.properties
+++ b/chrome/locale/th-TH/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=ลบกลุ่มและการเชื่อ
 sync.localObject=อ็อบเจกต์ในเครื่อง
 sync.remoteObject=อ็อบเจกต์ทางไกล
 sync.mergedObject=รวมอ็อบเจกต์
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=ไม่ได้ตั้งชื่อผู้ใช้ั
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/tr-TR/zotero/preferences.dtd b/chrome/locale/tr-TR/zotero/preferences.dtd
index c16f9c7b6..7223e057f 100644
--- a/chrome/locale/tr-TR/zotero/preferences.dtd
+++ b/chrome/locale/tr-TR/zotero/preferences.dtd
@@ -29,7 +29,7 @@
 <!ENTITY zotero.preferences.automaticSnapshots "Web sayfalarından eserler yaratılırken sayfa görünümü otomatik olarak kaydet">
 <!ENTITY zotero.preferences.downloadAssociatedFiles "Eserleri kaydederken ilişkilendirilen PDF ve diğer dosyaları da otomatik olarak ekle">
 <!ENTITY zotero.preferences.automaticTags "Anahtar kelimeler ve konu başlıkları ile eserleri otomatik olarak etiketle">
-<!ENTITY zotero.preferences.trashAutoEmptyDaysPre "Bu kadar zaman önce çöpe gönderilmiş eserleri otomatik olarak sil:">
+<!ENTITY zotero.preferences.trashAutoEmptyDaysPre "Bu kadar zaman önce Çöp Sepetine gönderilmiş eserleri otomatik olarak sil:">
 <!ENTITY zotero.preferences.trashAutoEmptyDaysPost "gün">
 
 <!ENTITY zotero.preferences.groups "Gruplar">
@@ -160,7 +160,7 @@
 
 <!ENTITY zotero.preferences.prefpane.advanced "Gelişmiş">
 <!ENTITY zotero.preferences.advanced.filesAndFolders "Dosyalar ve Klasörler">
-<!ENTITY zotero.preferences.advanced.keys "Shortcuts">
+<!ENTITY zotero.preferences.advanced.keys "Kısayollar">
 
 <!ENTITY zotero.preferences.prefpane.locate "Yerini Belirle">
 <!ENTITY zotero.preferences.locate.locateEngineManager "Makale Bakma Motoru Yöneticisi">
diff --git a/chrome/locale/tr-TR/zotero/zotero.dtd b/chrome/locale/tr-TR/zotero/zotero.dtd
index 26a5b93f8..3d11fe53d 100644
--- a/chrome/locale/tr-TR/zotero/zotero.dtd
+++ b/chrome/locale/tr-TR/zotero/zotero.dtd
@@ -104,7 +104,7 @@
 <!ENTITY zotero.toolbar.newGroup "Yeni Grup...">
 <!ENTITY zotero.toolbar.newSubcollection.label "Yeni Alt Derme...">
 <!ENTITY zotero.toolbar.newSavedSearch.label "Yeni Kaydedilen Arama...">
-<!ENTITY zotero.toolbar.emptyTrash.label "Çöpü Boşalt">
+<!ENTITY zotero.toolbar.emptyTrash.label "Çöp Sepetini Boşalt">
 <!ENTITY zotero.toolbar.tagSelector.label "Etiket Seçiciyi Göster/Gizle">
 <!ENTITY zotero.toolbar.actions.label "Eylemler">
 <!ENTITY zotero.toolbar.import.label "İçeri Aktar...">
diff --git a/chrome/locale/tr-TR/zotero/zotero.properties b/chrome/locale/tr-TR/zotero/zotero.properties
index 804cd8087..644e8d8e4 100644
--- a/chrome/locale/tr-TR/zotero/zotero.properties
+++ b/chrome/locale/tr-TR/zotero/zotero.properties
@@ -42,7 +42,7 @@ general.create=Oluştur
 general.delete=Sil
 general.moreInformation=Daha Bilgi
 general.seeForMoreInformation=Daha fazla bilgi için bakınız: %S
-general.open=Open %S
+general.open=%S'u aç
 general.enable=Etkinleştir:
 general.disable=Seçilemez Kıl
 general.remove=Kaldır
@@ -151,11 +151,11 @@ pane.collections.delete.title=Dermeyi Sil
 pane.collections.delete=Seçili dermeyi silmek istediğinize emin misiniz?
 pane.collections.delete.keepItems=Derme içerisindeki eserler silinmeyecektir.
 pane.collections.deleteWithItems.title=Dermeyi ve Eserleri Sil
-pane.collections.deleteWithItems=Seçili derme ile birlikte tüm eserleri silmek istediğinizden emin misiniz?
+pane.collections.deleteWithItems=Seçili dermeyi silip, içindeki tüm eserleri Çöp Sepetine taşımak istediğinize emin misiniz?
 
 pane.collections.deleteSearch.title=Aramayı Sil
 pane.collections.deleteSearch=Seçili aramayı silmek istediğinize emin misiniz?
-pane.collections.emptyTrash=Çöp kutusundaki tüm eserleri kalıcı olarak silmek istediğinize emin misiniz?
+pane.collections.emptyTrash=Çöp Sepetindeki tüm eserleri kalıcı olarak silmek istediğinize emin misiniz?
 pane.collections.newCollection=Yeni Derme
 pane.collections.name=Bu derme için bir isim girin:
 pane.collections.newSavedSeach=Yeni Kaydedilen Arama
@@ -163,7 +163,7 @@ pane.collections.savedSearchName=Bu kayıtlı arama için bir isim giriniz:
 pane.collections.rename=Dermeyi yeniden adlandır:
 pane.collections.library=Kitaplığım
 pane.collections.groupLibraries=Grup Kitaplıkları
-pane.collections.trash=Çöp
+pane.collections.trash=Çöp Sepeti
 pane.collections.untitled=İsimsiz
 pane.collections.unfiled=Dosyalanmamış Eserler
 pane.collections.duplicate=Yinelenen Öğeler
@@ -198,19 +198,19 @@ pane.items.columnChooser.moreColumns=Başka Sütun
 pane.items.columnChooser.secondarySort=İkincil Sıralama (%S)
 pane.items.attach.link.uri.unrecognized=Zotero girdiğiniz URI'yi tanımadı. Adresi kontrol edip tekrar deneyiniz.
 pane.items.attach.link.uri.file=Bir dosyaya bağlantı iliştirmek için lütfen “%S”'u kullanınız.
-pane.items.trash.title=Çöpe Gönder
-pane.items.trash=Seçili eseri çöpe göndermeyi istediğinize emin misiniz?
-pane.items.trash.multiple=Seçili eserleri çöpe göndermeyi istediğinize emin misiniz?
+pane.items.trash.title=Çöp Sepetine Gönder
+pane.items.trash=Seçili eseri Çöp Sepetine göndermeyi istediğinize emin misiniz?
+pane.items.trash.multiple=Seçili eserleri Çöp Sepetine göndermeyi istediğinize emin misiniz?
 pane.items.delete.title=Sil
 pane.items.delete=Seçili olan bu eseri silmek istediğinize emin misiniz?
 pane.items.delete.multiple=Seçili olan bu eserleri silmek istediğinize emin misiniz?
-pane.items.remove.title=Remove from Collection
-pane.items.remove=Are you sure you want to remove the selected item from this collection?
-pane.items.remove.multiple=Are you sure you want to remove the selected items from this collection?
-pane.items.menu.remove=Remove Item from Collection…
-pane.items.menu.remove.multiple=Remove Items from Collection…
-pane.items.menu.moveToTrash=Eseri sil...
-pane.items.menu.moveToTrash.multiple=Eserleri sil
+pane.items.remove.title=Dermeden Sil
+pane.items.remove=Seçili eseri, bu dermeden kaldırmak istediğinize emin misiniz?
+pane.items.remove.multiple=Seçili eserleri bu dermeden kaldırmak istediğinize emin misiniz?
+pane.items.menu.remove=Eseri Dermeden Sil...
+pane.items.menu.remove.multiple=Eserleri Dermeden Sil...
+pane.items.menu.moveToTrash=Eseri Çöp Sepetine Gönder...
+pane.items.menu.moveToTrash.multiple=Eserleri Çöp Sepetine Gönder...
 pane.items.menu.export=Seçili Eseri Dışarı Aktar...
 pane.items.menu.export.multiple=Seçili Eserleri Dışarı Aktar...
 pane.items.menu.createBib=Seçili Eserden Bibliyografya Yarat...
@@ -566,15 +566,15 @@ zotero.preferences.export.quickCopy.exportFormats=Dışarı Aktarım Biçimleri
 zotero.preferences.export.quickCopy.instructions=Çabuk Kopyala, bir kısayol tuşuna (%S) basarak seçilen kaynakların panoya kopyalanmasını ya da eserlerin bir web sayfasındaki bir metin kutusuna sürüklenebilmesini sağlar.
 zotero.preferences.export.quickCopy.citationInstructions=Bibliyografik stiller için, gönderme ve dipnotları, %S tuşuna basarak veya Shift/ÜstKarakter tuşuna basarken eserleri sürükleyerek kopyalayabilirsiniz.
 
-zotero.preferences.wordProcessors.installationSuccess=Installation was successful.
-zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S.
-zotero.preferences.wordProcessors.installed=The %S add-in is currently installed.
-zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed.
-zotero.preferences.wordProcessors.install=Install %S Add-in
-zotero.preferences.wordProcessors.reinstall=Reinstall %S Add-in
-zotero.preferences.wordProcessors.installing=Installing %S…
-zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S is incompatible with versions of %3$S before %4$S. Please remove %3$S, or download the latest version from %5$S.
-zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requires %3$S %4$S or later to run. Please download the latest version of %3$S from %5$S.
+zotero.preferences.wordProcessors.installationSuccess=Kurulum başarıyla sonuçlandı.
+zotero.preferences.wordProcessors.installationError=Bir hata oluştuğu için kurulum tamamlanamadı. %1$S'ün kapalı olduğuna emin olduktan sonra %2$S'u yeniden başlatın.
+zotero.preferences.wordProcessors.installed=%S eklentisi kurulu.
+zotero.preferences.wordProcessors.notInstalled=%S eklentisi kurulu değil.
+zotero.preferences.wordProcessors.install=%S Eklentisini Kur
+zotero.preferences.wordProcessors.reinstall=%S Eklentisini Tekrar Kur
+zotero.preferences.wordProcessors.installing=%S Kuruluyor...
+zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S, %3$S uygulamasının %4$S sürümünden önceki sürümleri ile uyumsuz. Lütfen %3$S uygulamasını kaldırınız, ya da en yeni sürümü %5$S adresinden indiriniz.
+zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S doğru çalışabilmek için, %3$S uygulamasının %4$S sürümünü ya da sonraki sürümlerini gerektirmektedir. Lütfen %3$S uygulamasının en yeni sürümünü %5$S adresinden indiriniz.
 
 zotero.preferences.styles.addStyle=Stil Ekle
 
@@ -738,7 +738,7 @@ integration.missingItem.multiple=Zotero veritabanınızda, bu göndermedeki %1$S
 integration.missingItem.description="Hayır"ı tıklamak bu eseri içeren göndermelerin alan kodlarını silecek, gönderme metnini koruyacak, ama kaynakçanızdan silecektir.
 integration.removeCodesWarning=Alan kodlarının silinmesi Zotero'nun bu belgedeki göndermeleri ve kaynakçaları güncellemesini engelleyecektir. Devam etmek istediğinize emin misiniz?
 integration.upgradeWarning=Belgeniz Zotero 2.0b7 ve sonrası ile birlikte çalışabilmesi için kalıcı olarak yükseltilmelidir. İşlemi gerçekleştirmeden önce yedek almanız önerilir. Devam etmek istediğinize emin misiniz?
-integration.error.newerDocumentVersion=Your document was created with a newer version of Zotero (%1$S) than the currently installed version (%2$S). Please upgrade Zotero before editing this document.
+integration.error.newerDocumentVersion=Belgeniz şu an kurulu olan Zotero sürümünden (%2$S) daha yeni bir sürümle (%1$S) yaratılmış. Lütfen bu belgeyi değiştirmeden önce Zotero'yu yükseltiniz.
 integration.corruptField=Kitaplığınızdaki hangi eserde bu göndermenin temsil edildiğini Zotero'ya söyleyen bu göndermeye ilişkin Zotero alan kodu bozulmuştur. Eseri tekrar seçmek ister misiniz?
 integration.corruptField.description="Hayır"ı tıklamak bu eseri içeren göndermelerin alan kodlarını silecek, gönderme metnini koruyacak, ama bir olasılıkla kaynakçanızdan silecektir.
 integration.corruptBibliography=Kaynakçanızın Zotero alan kodu bozulmuştur. Zotero bu alan kodunu silerek yeni bir kaynakça oluştursun mu?
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Grubu Kaldır ve Eşitle
 sync.localObject=Yerel Nesne
 sync.remoteObject=Uzak Nesne
 sync.mergedObject=Nesneyi Birleştir
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Kullanıcı adı yok
 sync.error.usernameNotSet.text=Zotero sunucusu ile eşitlenebilmek için Zotero tercihleri altında zotero.org kullanıcı adı ve parolanızı girmelisiniz.
diff --git a/chrome/locale/uk-UA/zotero/zotero.properties b/chrome/locale/uk-UA/zotero/zotero.properties
index 1f8e0c16b..ce3eb44e4 100644
--- a/chrome/locale/uk-UA/zotero/zotero.properties
+++ b/chrome/locale/uk-UA/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Обнулити групи і синхронізува
 sync.localObject=Локальний об'єкт
 sync.remoteObject=Видалений об'єкт
 sync.mergedObject=Об'єднаний об'єкт
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Ім'я користувача не встановлено
 sync.error.usernameNotSet.text=Для синхронізації з сервером Zotero ви повинні ввести ім'я користувача та пароль для zotero.org в налаштуваннях Zotero.
diff --git a/chrome/locale/vi-VN/zotero/zotero.properties b/chrome/locale/vi-VN/zotero/zotero.properties
index f00b5df7d..0f7bb9b75 100644
--- a/chrome/locale/vi-VN/zotero/zotero.properties
+++ b/chrome/locale/vi-VN/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync
 sync.localObject=Local Object
 sync.remoteObject=Remote Object
 sync.mergedObject=Merged Object
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Username not set
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/zh-CN/zotero/zotero.properties b/chrome/locale/zh-CN/zotero/zotero.properties
index 9b7002d84..6a178b798 100644
--- a/chrome/locale/zh-CN/zotero/zotero.properties
+++ b/chrome/locale/zh-CN/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=移除群组和同步
 sync.localObject=本地对象
 sync.remoteObject=远程对象
 sync.mergedObject=合并的对象
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=未设置用户名
 sync.error.usernameNotSet.text=要与Zotero服务器同步, 您需要在Zotero首选项面板中输入zotero.org的用户名及密码.
diff --git a/chrome/locale/zh-TW/zotero/zotero.properties b/chrome/locale/zh-TW/zotero/zotero.properties
index bb70b4e3b..583cb0145 100644
--- a/chrome/locale/zh-TW/zotero/zotero.properties
+++ b/chrome/locale/zh-TW/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=移除群組與同步
 sync.localObject=本機的物件
 sync.remoteObject=遠端的物件
 sync.mergedObject=合併的物件
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=沒有設定使用者名稱
 sync.error.usernameNotSet.text=於 Zotero 偏好設定中一定得輸入 zotero.org 使用者名稱與密碼才能與 Zotero 伺服器同步。

From c9a787c7bdd9a1a14833fe9c220ffdd86fa3808b Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Thu, 26 Mar 2015 20:34:31 -0400
Subject: [PATCH 10/44] Maybe show some sync errors that weren't being shown

(This might end up showing some twice, but better than not at all.)
---
 chrome/content/zotero/xpcom/sync.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/chrome/content/zotero/xpcom/sync.js b/chrome/content/zotero/xpcom/sync.js
index 4b2e301d3..eb2f59751 100644
--- a/chrome/content/zotero/xpcom/sync.js
+++ b/chrome/content/zotero/xpcom/sync.js
@@ -2558,6 +2558,7 @@ Zotero.Sync.Server = new function () {
 		}
 		
 		Zotero.debug(e, 1);
+		Components.utils.reportError(e);
 		
 		_syncInProgress = false;
 		Zotero.DB.rollbackAllTransactions();

From 40b349edcae23fc816bab8bf0e350861c96ccd76 Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Fri, 27 Mar 2015 18:43:39 -0400
Subject: [PATCH 11/44] Handle gzip encoding via saveURI()

---
 chrome/content/zotero/xpcom/utilities_internal.js | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/chrome/content/zotero/xpcom/utilities_internal.js b/chrome/content/zotero/xpcom/utilities_internal.js
index 2b9014399..8ca85b457 100644
--- a/chrome/content/zotero/xpcom/utilities_internal.js
+++ b/chrome/content/zotero/xpcom/utilities_internal.js
@@ -274,6 +274,9 @@ Zotero.Utilities.Internal = {
 	 * @param {nsISupports} target file
 	 */
 	saveURI: function (wbp, source, target) {
+		// Handle gzip encoding
+		wbp.persistFlags |= Ci.nsIWebBrowserPersist.PERSIST_FLAGS_AUTODETECT_APPLY_CONVERSION;
+		
 		// Firefox 35 and below
 		try {
 			wbp.saveURI(source, null, null, null, null, target, null);

From 4b83b1a6304d2a2b95558d0a126f9652ba12a910 Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Fri, 27 Mar 2015 19:00:25 -0400
Subject: [PATCH 12/44] Bump version and maxVersion

---
 install.rdf        | 4 ++--
 resource/config.js | 2 +-
 update.rdf         | 4 ++--
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/install.rdf b/install.rdf
index e31cba70e..4ad3e2cbb 100644
--- a/install.rdf
+++ b/install.rdf
@@ -6,7 +6,7 @@
   
     <em:id>zotero@chnm.gmu.edu</em:id>
     <em:name>Zotero</em:name>
-    <em:version>4.0.26.1.SOURCE</em:version>
+    <em:version>4.0.27.SOURCE</em:version>
     <em:creator>Center for History and New Media<br/>George Mason University</em:creator>
     <em:contributor>Dan Cohen</em:contributor>
     <em:contributor>Sean Takats</em:contributor>
@@ -25,7 +25,7 @@
       <Description>
         <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
         <em:minVersion>31.0</em:minVersion>
-        <em:maxVersion>36.*</em:maxVersion>
+        <em:maxVersion>37.*</em:maxVersion>
       </Description>
     </em:targetApplication>
     
diff --git a/resource/config.js b/resource/config.js
index 19b8fc88a..795b91236 100644
--- a/resource/config.js
+++ b/resource/config.js
@@ -14,7 +14,7 @@ var ZOTERO_CONFIG = {
 	BOOKMARKLET_ORIGIN: 'https://www.zotero.org',
 	HTTP_BOOKMARKLET_ORIGIN: 'http://www.zotero.org',
 	BOOKMARKLET_URL: 'https://www.zotero.org/bookmarklet/',
-	VERSION: '4.0.26.1.SOURCE'
+	VERSION: '4.0.27.SOURCE'
 };
 
 EXPORTED_SYMBOLS = ["ZOTERO_CONFIG"];
diff --git a/update.rdf b/update.rdf
index 7bb8ebefc..96fa57ff3 100644
--- a/update.rdf
+++ b/update.rdf
@@ -7,12 +7,12 @@
     <RDF:Seq>
       <RDF:li>
         <RDF:Description>
-          <version>4.0.26.1.SOURCE</version>
+          <version>4.0.27.SOURCE</version>
           <targetApplication>
             <RDF:Description>
               <id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</id>
               <minVersion>31.0</minVersion>
-              <maxVersion>36.*</maxVersion>
+              <maxVersion>37.*</maxVersion>
               <updateLink>http://download.zotero.org/extension/zotero.xpi</updateLink>
               <updateHash>sha1:</updateHash>
             </RDF:Description>

From d6e19a9f25cb779dd486d0c6c1a69d545dde5712 Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Sat, 28 Mar 2015 18:37:55 -0400
Subject: [PATCH 13/44] Automatic PDF tool upgrading

If automatic translator/style updates are enabled, at least one of the
PDF tools is installed, and the repo returns a more recent version
number than what's installed, automatically upgrade the tools. (Version
3.02 counts as lower, since Poppler's version numbers are lower.)

If an error occurs, wait increasing amounts of time to try the downloads
again, up to one week.
---
 .../zotero/preferences/preferences_search.js  | 180 +++++-------------
 chrome/content/zotero/xpcom/fulltext.js       |  72 +++++++
 chrome/content/zotero/xpcom/schema.js         |  82 ++++++++
 3 files changed, 200 insertions(+), 134 deletions(-)

diff --git a/chrome/content/zotero/preferences/preferences_search.js b/chrome/content/zotero/preferences/preferences_search.js
index 5f7743c05..591cec7ac 100644
--- a/chrome/content/zotero/preferences/preferences_search.js
+++ b/chrome/content/zotero/preferences/preferences_search.js
@@ -177,14 +177,18 @@ Zotero_Preferences.Search = {
 					var converterVersion = xmlhttp.responseText.split(/\s/)[0];
 					var infoVersion = xmlhttp.responseText.split(/\s/)[1];
 					
+					// Install if not installed, version unknown, Xpdf 3.02 (to upgrade to Poppler),
+					// or outdated
 					var converterVersionAvailable = converterVersion &&
 						(!converterIsRegistered ||
-							Zotero.Fulltext.pdfConverterVersion == 'UNKNOWN' ||
-							converterVersion > Zotero.Fulltext.pdfConverterVersion);
+							Zotero.Fulltext.pdfConverterVersion == 'UNKNOWN'
+								|| (converterVersion != '3.02' && Zotero.Fulltext.pdfConverterVersion == '3.02')
+								||  converterVersion > Zotero.Fulltext.pdfConverterVersion);
 					var infoVersionAvailable = infoVersion &&
 						(!infoIsRegistered ||
-							Zotero.Fulltext.pdfInfoVersion == 'UNKNOWN' ||
-							infoVersion > Zotero.Fulltext.pdfInfoVersion);
+							Zotero.Fulltext.pdfInfoVersion == 'UNKNOWN'
+								|| (infoVersion != '3.02' && Zotero.Fulltext.pdfInfoVersion == '3.02')
+								|| infoVersion > Zotero.Fulltext.pdfInfoVersion);
 					var bothAvailable = converterVersionAvailable && infoVersionAvailable;
 					
 					/*
@@ -246,7 +250,44 @@ Zotero_Preferences.Search = {
 								info: infoVersionAvailable ?
 									infoVersion : null
 							};
-							self.installPDFTools(installVersions);
+							
+							document.getElementById('pdftools-update-button').disabled = true;
+							var str = Zotero.getString('zotero.preferences.search.pdf.downloading');
+							document.getElementById('pdftools-update-button').setAttribute('label', str);
+							
+							if (converterVersionAvailable && infoVersionAvailable) {
+								Zotero.Fulltext.downloadPDFTool('converter', converterVersion, function (success) {
+									if (!success) {
+										self.onPDFToolsDownloadError("Error downloading pdftotext");
+										return;
+									}
+									Zotero.Fulltext.downloadPDFTool('info', infoVersion, function (success) {
+										if (!success) {
+											self.onPDFToolsDownloadError("Error downloading pdfinfo");
+											return;
+										}
+										self.updatePDFToolsStatus();
+									});
+								});
+							}
+							else if (converterVersionAvailable) {
+								Zotero.Fulltext.downloadPDFTool('converter', converterVersion, function (success) {
+									if (!success) {
+										self.onPDFToolsDownloadError("Error downloading pdftotext");
+										return;
+									}
+									self.updatePDFToolsStatus();
+								});
+							}
+							else {
+								Zotero.Fulltext.downloadPDFTool('info', infoVersion, function (success) {
+									if (!success) {
+										self.onPDFToolsDownloadError("Error downloading pdfinfo");
+										return;
+									}
+									self.updatePDFToolsStatus();
+								});
+							}
 						}
 					}
 				}
@@ -267,135 +308,6 @@ Zotero_Preferences.Search = {
 	},
 	
 	
-	/*
-	 * Begin installation of specified PDF tools from server -- does a HEAD call to
-	 * make sure file exists and then calls downloadPDFTool() if so
-	 */
-	installPDFTools: function (installVersions) {
-		if (!installVersions) {
-			installVersions = {
-				converter: true,
-				info: true
-			};
-		}
-		
-		// We install the converter first if it's available
-		var url = Zotero.Fulltext.pdfToolsDownloadBaseURL;
-		if (installVersions.converter) {
-			var tool = 'converter';
-			var version = installVersions.converter;
-			url += Zotero.Fulltext.pdfConverterFileName + '-' + installVersions.converter;
-		}
-		else if (installVersions.info) {
-			var tool = 'info';
-			var version = installVersions.info;
-			url += Zotero.Fulltext.pdfInfoFileName + '-' + installVersions.info;
-		}
-		else {
-			return; 
-		}
-		
-		// Find latest version for this platform
-		var self = this;
-		var sent = Zotero.HTTP.doHead(url, function (xmlhttp) {
-			try {
-				if (xmlhttp.status == 200) {
-					// If doing both and on converter, chain pdfinfo
-					if (installVersions.converter && installVersions.info) {
-						self.downloadPDFTool(tool, version, function () {
-							return self.installPDFTools({ info: installVersions.info });
-						});
-					}
-					else {
-						self.downloadPDFTool(tool, version);
-					}
-				}
-				// Version not found for platform
-				else if (xmlhttp.status == 404) {
-					self.onPDFToolsDownloadError(404);
-				}
-			}
-			catch (e) {
-				self.onPDFToolsDownloadError(e);
-			}
-		});
-		
-		// Browser is offline
-		if (!sent) {
-			self.onPDFToolsDownloadError();
-		}
-	},
-	
-	
-	/*
-	 * Download and install specified PDF tool
-	 */
-	downloadPDFTool: function (tool, version, callback) {
-		var ioService = Components.classes["@mozilla.org/network/io-service;1"]
-							.getService(Components.interfaces.nsIIOService);
-		
-		if (tool == 'converter') {
-			var fileName = Zotero.Fulltext.pdfConverterFileName; 
-		}
-		else {
-			var fileName = Zotero.Fulltext.pdfInfoFileName;
-		}
-		
-		
-		var url = Zotero.Fulltext.pdfToolsDownloadBaseURL + fileName + '-' + version;
-		var uri = ioService.newURI(url, null, null);
-		
-		var file = Zotero.getZoteroDirectory();
-		file.append(fileName);
-		var fileURL = ioService.newFileURI(file);
-		
-		const nsIWBP = Components.interfaces.nsIWebBrowserPersist;
-		var wbp = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"]
-					.createInstance(nsIWBP);
-		
-		var self = this;
-		var progressListener = new Zotero.WebProgressFinishListener(function () {
-			// Set permissions to 755
-			if (Zotero.isMac) {
-				file.permissions = 33261;
-			}
-			else if (Zotero.isLinux) {
-				file.permissions = 493;
-			}
-			
-			// Write the version number to a file
-			var versionFile = Zotero.getZoteroDirectory();
-			versionFile.append(fileName + '.version');
-			Zotero.File.putContents(versionFile, version + '');
-			
-			Zotero.Fulltext.registerPDFTool(tool);
-			
-			// Used to install info tool after converter
-			if (callback) {
-				callback();
-			}
-			// If done
-			else {
-				self.updatePDFToolsStatus();
-			}
-		});
-		
-		/*
-		var tr = Components.classes["@mozilla.org/transfer;1"].
-			createInstance(Components.interfaces.nsITransfer);
-		tr.init(uri, fileURL, "", null, null, null, wbp);
-		*/
-		
-		document.getElementById('pdftools-update-button').disabled = true;
-		var str = Zotero.getString('zotero.preferences.search.pdf.downloading');
-		document.getElementById('pdftools-update-button').setAttribute('label', str);
-		
-		wbp.progressListener = progressListener;
-		Zotero.debug("Saving " + uri.spec + " to " + fileURL.spec);
-		Zotero.Utilities.Internal.saveURI(wbp, uri, fileURL);
-	},
-	
-	
 	onPDFToolsDownloadError: function (e) {
 		if (e == 404) {
 			var str = Zotero.getString('zotero.preferences.search.pdf.toolDownloadsNotAvailable',
diff --git a/chrome/content/zotero/xpcom/fulltext.js b/chrome/content/zotero/xpcom/fulltext.js
index 7be7f087a..ea1d5b359 100644
--- a/chrome/content/zotero/xpcom/fulltext.js
+++ b/chrome/content/zotero/xpcom/fulltext.js
@@ -164,6 +164,78 @@ Zotero.Fulltext = new function(){
 	}
 	
 	
+	/*
+	 * Download and install latest PDF tool
+	 */
+	this.downloadPDFTool = function (tool, version, callback) {
+		try {
+			var ioService = Components.classes["@mozilla.org/network/io-service;1"]
+				.getService(Components.interfaces.nsIIOService);
+			
+			if (tool == 'converter') {
+				var fileName = this.pdfConverterFileName;
+			}
+			else {
+				var fileName = this.pdfInfoFileName;
+			}
+			
+			var spec = this.pdfToolsDownloadBaseURL + fileName + '-' + version;
+			var uri = ioService.newURI(spec, null, null);
+			
+			var file = Zotero.getTempDirectory();
+			file.append(fileName);
+			
+			Components.utils.import("resource://gre/modules/NetUtil.jsm");
+			Components.utils.import("resource://gre/modules/FileUtils.jsm");
+			
+			Zotero.debug("Saving " + uri.spec + " to " + file.path);
+			var output = FileUtils.openSafeFileOutputStream(file);
+			NetUtil.asyncFetch(uri, function (is, status) {
+				if (!Components.isSuccessCode(status)) {
+					Zotero.debug(status, 1);
+					Components.utils.reportError(status);
+					if (callback) {
+						callback(false);
+					}
+					return;
+				}
+				
+				Zotero.File.putContentsAsync(file, is)
+				.then(function () {
+					// Set permissions to 755
+					if (Zotero.isMac) {
+						file.permissions = 33261;
+					}
+					else if (Zotero.isLinux) {
+						file.permissions = 493;
+					}
+					
+					var destDir = Zotero.getZoteroDirectory()
+					file.moveTo(destDir, null);
+					
+					// Write the version number to a file
+					var versionFile = destDir.clone();
+					versionFile.append(fileName + '.version');
+					Zotero.File.putContents(versionFile, version + '');
+					
+					Zotero.Fulltext.registerPDFTool(tool);
+					
+					if (callback) {
+						callback(true);
+					}
+				});
+			});
+		}
+		catch (e) {
+			Zotero.debug(e, 1);
+			Components.utils.reportError(e);
+			if (callback) {
+				callback(false);
+			}
+		}
+	};
+	
+	
 	/*
 	 * Looks for pdftotext-{platform}[.exe] in the Zotero data directory
 	 *
diff --git a/chrome/content/zotero/xpcom/schema.js b/chrome/content/zotero/xpcom/schema.js
index b46a0bfc0..8376e733d 100644
--- a/chrome/content/zotero/xpcom/schema.js
+++ b/chrome/content/zotero/xpcom/schema.js
@@ -1589,6 +1589,78 @@ Zotero.Schema = new function(){
 		var translatorUpdates = xmlhttp.responseXML.getElementsByTagName('translator');
 		var styleUpdates = xmlhttp.responseXML.getElementsByTagName('style');
 		
+		var updatePDFTools = function () {
+			let pdfToolsUpdates = xmlhttp.responseXML.getElementsByTagName('pdftools');
+			if (pdfToolsUpdates.length) {
+				let availableVersion = pdfToolsUpdates[0].getAttribute('version');
+				let installInfo = false;
+				let installConverter = false;
+				
+				// Don't auto-install if not installed
+				if (!Zotero.Fulltext.pdfInfoIsRegistered() && !Zotero.Fulltext.pdfConverterIsRegistered()) {
+					return;
+				}
+				
+				if (Zotero.Fulltext.pdfInfoIsRegistered()) {
+					let currentVersion = Zotero.Fulltext.pdfInfoVersion;
+					if (currentVersion < availableVersion || currentVersion == '3.02'
+							|| currentVersion == 'UNKNOWN') {
+						installInfo = true;
+					}
+				}
+				if (Zotero.Fulltext.pdfConverterIsRegistered()) {
+					let currentVersion = Zotero.Fulltext.pdfConverterVersion;
+					if (currentVersion < availableVersion || currentVersion == '3.02'
+							|| currentVersion == 'UNKNOWN') {
+						installConverter = true;
+					}
+				}
+				
+				let prefKey = 'pdfToolsInstallError';
+				let lastTry = 0, delay = 43200000; // half a day, so doubles to a day initially
+				try {
+					[lastTry, delay] = Zotero.Prefs.get(prefKey).split(';');
+				}
+				catch (e) {}
+				
+				// Allow an additional minute, since repo updates might not be exact
+				if (Date.now() < (parseInt(lastTry) + parseInt(delay) - 60000)) {
+					Zotero.debug("Now enough time since last PDF tools installation failure -- skipping", 2);
+					return;
+				}
+				
+				var checkResult = function (success) {
+					if (success) {
+						try {
+							Zotero.Prefs.clear(prefKey);
+						}
+						catch (e) {}
+					}
+					else {
+						// Keep doubling delay, to a max of 1 week
+						Zotero.Prefs.set(prefKey, Date.now() + ";" + Math.min(delay * 2, 7*24*60*60*1000));
+						
+						let msg = "Error downloading PDF tool";
+						Zotero.debug(msg, 1);
+						throw new Error(msg);
+					}
+				};
+				
+				if (installConverter && installInfo) {
+					Zotero.Fulltext.downloadPDFTool('converter', availableVersion, function (success) {
+						checkResult(success);
+						Zotero.Fulltext.downloadPDFTool('info', availableVersion, checkResult);
+					});
+				}
+				else if (installConverter) {
+					Zotero.Fulltext.downloadPDFTool('converter', availableVersion, checkResult);
+				}
+				else {
+					Zotero.Fulltext.downloadPDFTool('info', availableVersion, checkResult);
+				}
+			}
+		};
+		
 		Zotero.DB.beginTransaction();
 		
 		// TODO: clear DB version 'sync' from removed _updateDBVersion()
@@ -1609,6 +1681,11 @@ Zotero.Schema = new function(){
 				_setRepositoryTimer(ZOTERO_CONFIG['REPOSITORY_CHECK_INTERVAL']);
 			}
 			_remoteUpdateInProgress = false;
+			
+			setTimeout(function () {
+				updatePDFTools();
+			});
+			
 			return -1;
 		}
 		
@@ -1640,6 +1717,11 @@ Zotero.Schema = new function(){
 			_setRepositoryTimer(ZOTERO_CONFIG['REPOSITORY_CHECK_INTERVAL']);
 		}
 		_remoteUpdateInProgress = false;
+		
+		setTimeout(function () {
+			updatePDFTools();
+		});
+		
 		return true;
 	}
 	

From aab21f68ad8e15556ea6bff050919c8445ffe500 Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Sun, 29 Mar 2015 15:22:07 -0400
Subject: [PATCH 14/44] Blacklist "bad script XDR magic number" message

---
 chrome/content/zotero/xpcom/zotero.js | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/chrome/content/zotero/xpcom/zotero.js b/chrome/content/zotero/xpcom/zotero.js
index 431fdd5aa..f352a0af4 100644
--- a/chrome/content/zotero/xpcom/zotero.js
+++ b/chrome/content/zotero/xpcom/zotero.js
@@ -2083,7 +2083,8 @@ Components.utils.import("resource://gre/modules/Services.jsm");
 			'nsLivemarkService.js',
 			'Sync.Engine.Tabs',
 			'content-sessionStore.js',
-			'org.mozilla.appSessions'
+			'org.mozilla.appSessions',
+			'bad script XDR magic number'
 		];
 		
 		for (var i=0; i<blacklist.length; i++) {

From e1c1803ce2307e1a8da88a6856cad75303a07574 Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Mon, 30 Mar 2015 14:45:53 -0400
Subject: [PATCH 15/44] Add DB version info to newer-DB-version error

---
 chrome/content/zotero/xpcom/schema.js |  3 ++-
 chrome/content/zotero/xpcom/zotero.js | 14 +++++++-------
 2 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/chrome/content/zotero/xpcom/schema.js b/chrome/content/zotero/xpcom/schema.js
index 8376e733d..1ea3154b3 100644
--- a/chrome/content/zotero/xpcom/schema.js
+++ b/chrome/content/zotero/xpcom/schema.js
@@ -1899,7 +1899,8 @@ Zotero.Schema = new function(){
 			return false;
 		}
 		else if (fromVersion > toVersion) {
-			throw("Zotero user data DB version is newer than SQL file");
+			throw new Error("Zotero user data DB version is newer than SQL file "
+				+ "(" + toVersion + " < " + fromVersion + ")");
 		}
 		
 		Zotero.debug('Updating user data tables from version ' + fromVersion + ' to ' + toVersion);
diff --git a/chrome/content/zotero/xpcom/zotero.js b/chrome/content/zotero/xpcom/zotero.js
index f352a0af4..799156335 100644
--- a/chrome/content/zotero/xpcom/zotero.js
+++ b/chrome/content/zotero/xpcom/zotero.js
@@ -608,13 +608,13 @@ Components.utils.import("resource://gre/modules/Services.jsm");
 				var updated = Zotero.Schema.updateSchema();
 			}
 			catch (e) {
-				if (typeof e == 'string' && e.match('newer than SQL file')) {
-					var kbURL = "http://zotero.org/support/kb/newer_db_version";
-					var msg = Zotero.localeJoin([
-							Zotero.getString('startupError.zoteroVersionIsOlder'),
-							Zotero.getString('startupError.zoteroVersionIsOlder.upgrade')
-						]) + "\n\n"
-						+ Zotero.getString('startupError.zoteroVersionIsOlder.current', Zotero.version) + "\n\n"
+				if (e.toString().match('newer than SQL file')) {
+					let versions = e.toString().match(/\((\d+) < \d+\)/);
+					let kbURL = "https://www.zotero.org/support/kb/newer_db_version";
+					let msg = Zotero.getString('startupError.zoteroVersionIsOlder') + " "
+						+ Zotero.getString('startupError.zoteroVersionIsOlder.upgrade') + "\n\n"
+						+ Zotero.getString('startupError.zoteroVersionIsOlder.current', Zotero.version) + "\n"
+						+ (versions ? "DB: " + versions[1] + "\n\n" : "\n")
 						+ Zotero.getString('general.seeForMoreInformation', kbURL);
 					Zotero.startupError = msg;
 					_startupErrorHandler = function() {

From cc173ff1e51a4009bf5646354d6a36078e731d1c Mon Sep 17 00:00:00 2001
From: Aurimas Vinckevicius <aurimas.dev@gmail.com>
Date: Mon, 30 Mar 2015 16:28:12 -0500
Subject: [PATCH 16/44] Trim down ISSN/ISBN test for characters that should not
 be ignored

---
 test/tests/utilities.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/test/tests/utilities.js b/test/tests/utilities.js
index e21aa6b9a..a779b1a9b 100644
--- a/test/tests/utilities.js
+++ b/test/tests/utilities.js
@@ -46,7 +46,7 @@ describe("Zotero.Utilities", function() {
 			assert.equal(cleanISBN('9781' + ignoredChars + '234567897'), '9781234567897', 'stripped off all ignored characters');
 			
 			let isbnChars = ignoredChars + '1234567890';
-			for (let i=1; i<65536; i++) {
+			for (let i=1; i<1327; i++) { // More common characters through Cyrillic letters
 				let c = String.fromCharCode(i);
 				if (isbnChars.indexOf(c) != -1) continue;
 				
@@ -143,7 +143,7 @@ describe("Zotero.Utilities", function() {
 			assert.equal(cleanISSN('1' + ignoredChars + '2345679'), '1234-5679', 'stripped off all ignored characters');
 			
 			let isbnChars = ignoredChars + '1234567890';
-			for (let i=1; i<65536; i++) {
+			for (let i=1; i<1327; i++) { // More common characters through Cyrillic letters
 				let c = String.fromCharCode(i);
 				if (isbnChars.indexOf(c) != -1) continue;
 				

From c05025f4b18b5fe3cfcff2c357941441f423465b Mon Sep 17 00:00:00 2001
From: Aurimas Vinckevicius <aurimas.dev@gmail.com>
Date: Tue, 31 Mar 2015 13:30:05 -0500
Subject: [PATCH 17/44] Log translatorID and lastUpdated timestamp when parsing
 translators

---
 chrome/content/zotero/xpcom/translation/translate.js | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/chrome/content/zotero/xpcom/translation/translate.js b/chrome/content/zotero/xpcom/translation/translate.js
index 0608d549f..78e18b3ac 100644
--- a/chrome/content/zotero/xpcom/translation/translate.js
+++ b/chrome/content/zotero/xpcom/translation/translate.js
@@ -1528,7 +1528,8 @@ Zotero.Translate.Base.prototype = {
 		this._aborted = false;
 		this.saveQueue = [];
 		
-		Zotero.debug("Translate: Parsing code for "+translator.label, 4);
+		Zotero.debug("Translate: Parsing code for " + translator.label + " "
+			+ "(" + translator.translatorID + ", " + translator.lastUpdated + ")", 4);
 		
 		try {
 			this._sandboxManager.eval("var exports = {}, ZOTERO_TRANSLATOR_INFO = "+translator.code,

From 49a0b02b060b38a739c1ddab2bc41867d2eb4f67 Mon Sep 17 00:00:00 2001
From: Aurimas Vinckevicius <aurimas.dev@gmail.com>
Date: Tue, 31 Mar 2015 13:40:43 -0500
Subject: [PATCH 18/44] Log a list of translators that were found during
 detect*

---
 chrome/content/zotero/xpcom/translation/translate.js | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/chrome/content/zotero/xpcom/translation/translate.js b/chrome/content/zotero/xpcom/translation/translate.js
index 78e18b3ac..88027e9ab 100644
--- a/chrome/content/zotero/xpcom/translation/translate.js
+++ b/chrome/content/zotero/xpcom/translation/translate.js
@@ -1505,8 +1505,15 @@ Zotero.Translate.Base.prototype = {
 	 * Called when all translators have been collected for detection
 	 */
 	"_detectTranslatorsCollected":function() {
-		Zotero.debug("Translate: All translator detect calls and RPC calls complete");
+		Zotero.debug("Translate: All translator detect calls and RPC calls complete:");
 		this._foundTranslators.sort(function(a, b) { return a.priority-b.priority });
+		if (this._foundTranslators.length) {
+			this._foundTranslators.forEach(function(t) {
+				Zotero.debug("\t" + t.label + ": " + t.priority);
+			});
+		} else {
+			Zotero.debug("\tNo suitable translators found");
+		}
 		this._runHandler("translators", this._foundTranslators);
 	},
 	

From a9ca6e0857928d8d2fe9de451567e5ff3027f64d Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Wed, 1 Apr 2015 02:03:57 -0400
Subject: [PATCH 19/44] Support unmodified Xpdf binaries

Use stdout redirection scripts for pdfinfo and, on Windows, a script to
run pdftotext hidden, which together allow for all unmodified binaries
(including, probably, symlinked system ones, though I didn't test that).

On Windows, using a .vbs does cause a brief wait cursor. The stock
pdfinfo needs the redirection script anyway, so that's unavoidable, but
on the async branch I think we'll be able to switch to pdf.js for the
page count, at which point maybe I'll try to remember how I modified the
Windows binaries to be hidden and use a modified version of pdftotext to
avoid VBScript. (We use the stock pdftotext elsewhere already.)
---
 .../zotero/preferences/preferences_search.js  | 212 ++++++++----------
 chrome/content/zotero/xpcom/fulltext.js       | 122 ++++++++--
 chrome/content/zotero/xpcom/schema.js         |   3 +
 resource/hide.vbs                             |  24 ++
 resource/redirect.sh                          |   6 +
 resource/redirect.vbs                         |  33 +++
 6 files changed, 267 insertions(+), 133 deletions(-)
 create mode 100644 resource/hide.vbs
 create mode 100644 resource/redirect.sh
 create mode 100644 resource/redirect.vbs

diff --git a/chrome/content/zotero/preferences/preferences_search.js b/chrome/content/zotero/preferences/preferences_search.js
index 591cec7ac..6dfe00021 100644
--- a/chrome/content/zotero/preferences/preferences_search.js
+++ b/chrome/content/zotero/preferences/preferences_search.js
@@ -162,139 +162,121 @@ Zotero_Preferences.Search = {
 	 * if a newer version is available
 	 */
 	checkPDFToolsDownloadVersion: function () {
-		var url = Zotero.Fulltext.pdfToolsDownloadBaseURL
-					+ Zotero.platform.replace(' ', '-') + '.latest';
+		var url = Zotero.Fulltext.pdfToolsDownloadBaseURL + 'latest.json';
 		
 		// Find latest version for this platform
 		var self = this;
 		var sent = Zotero.HTTP.doGet(url, function (xmlhttp) {
 			try {
-				if (xmlhttp.status == 200) {
-					var converterIsRegistered = Zotero.Fulltext.pdfConverterIsRegistered();
-					var infoIsRegistered = Zotero.Fulltext.pdfInfoIsRegistered();
-					var bothRegistered = converterIsRegistered && infoIsRegistered;
+				if (xmlhttp.status != 200) {
+					throw new Error("Unexpected response code " + xmlhttp.status);
+				}
+				
+				var platform = Zotero.platform.replace(/\s/g, '-');
+				var json = JSON.parse(xmlhttp.responseText);
+				var latestVersion = json[platform] || json['default'];
+				
+				Zotero.debug("Latest PDF tools version for " + platform + " is " + latestVersion);
+				
+				var converterIsRegistered = Zotero.Fulltext.pdfConverterIsRegistered();
+				var infoIsRegistered = Zotero.Fulltext.pdfInfoIsRegistered();
+				var bothRegistered = converterIsRegistered && infoIsRegistered;
+				
+				// Install if not installed, version unknown, outdated, or
+				// Xpdf 3.02/3.04 (to upgrade to Poppler),
+				var converterVersionAvailable = (!converterIsRegistered ||
+						Zotero.Fulltext.pdfConverterVersion == 'UNKNOWN'
+							|| latestVersion > Zotero.Fulltext.pdfConverterVersion
+							|| (latestVersion != '3.02' && Zotero.Fulltext.pdfConverterVersion == '3.02')
+							|| (latestVersion != '3.02' && latestVersion != '3.04' && Zotero.Fulltext.pdfConverterVersion == '3.04'));
+				var infoVersionAvailable = (!infoIsRegistered ||
+						Zotero.Fulltext.pdfInfoVersion == 'UNKNOWN'
+							|| latestVersion > Zotero.Fulltext.pdfInfoVersion
+							|| (latestVersion != '3.02' && Zotero.Fulltext.pdfInfoVersion == '3.02')
+							|| (latestVersion != '3.02' && latestVersion != '3.04' && Zotero.Fulltext.pdfInfoVersion == '3.04'));
+				var bothAvailable = converterVersionAvailable && infoVersionAvailable;
+				
+				// Up to date -- disable update button
+				if (!converterVersionAvailable && !infoVersionAvailable) {
+					var button = document.getElementById('pdftools-update-button');
+					button.setAttribute('label', Zotero.getString('zotero.preferences.update.upToDate'));
+					button.setAttribute('disabled', true);
+				}
+				// New version available -- display update prompt
+				else {
+					var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].
+							createInstance(Components.interfaces.nsIPromptService);
+					var buttonFlags = (ps.BUTTON_POS_0) * (ps.BUTTON_TITLE_IS_STRING)
+						+ (ps.BUTTON_POS_1) * (ps.BUTTON_TITLE_CANCEL);
 					
-					var converterVersion = xmlhttp.responseText.split(/\s/)[0];
-					var infoVersion = xmlhttp.responseText.split(/\s/)[1];
+					var msg = Zotero.getString('zotero.preferences.search.pdf.available'
+						+ ((converterIsRegistered || infoIsRegistered) ? 'Updates' : 'Downloads'),
+						[Zotero.platform, 'zotero.org']) + '\n\n';
 					
-					// Install if not installed, version unknown, Xpdf 3.02 (to upgrade to Poppler),
-					// or outdated
-					var converterVersionAvailable = converterVersion &&
-						(!converterIsRegistered ||
-							Zotero.Fulltext.pdfConverterVersion == 'UNKNOWN'
-								|| (converterVersion != '3.02' && Zotero.Fulltext.pdfConverterVersion == '3.02')
-								||  converterVersion > Zotero.Fulltext.pdfConverterVersion);
-					var infoVersionAvailable = infoVersion &&
-						(!infoIsRegistered ||
-							Zotero.Fulltext.pdfInfoVersion == 'UNKNOWN'
-								|| (infoVersion != '3.02' && Zotero.Fulltext.pdfInfoVersion == '3.02')
-								|| infoVersion > Zotero.Fulltext.pdfInfoVersion);
-					var bothAvailable = converterVersionAvailable && infoVersionAvailable;
-					
-					/*
-					Zotero.debug(converterIsRegistered);
-					Zotero.debug(infoIsRegistered);
-					Zotero.debug(converterVersion);
-					Zotero.debug(infoVersion);
-					Zotero.debug(Zotero.Fulltext.pdfConverterVersion);
-					Zotero.debug(Zotero.Fulltext.pdfInfoVersion);
-					Zotero.debug(converterVersionAvailable);
-					Zotero.debug(infoVersionAvailable);
-					*/
-					
-					// Up to date -- disable update button
-					if (!converterVersionAvailable && !infoVersionAvailable) {
-						var button = document.getElementById('pdftools-update-button');
-						button.setAttribute('label', Zotero.getString('zotero.preferences.update.upToDate'));
-						button.setAttribute('disabled', true);
+					if (converterVersionAvailable) {
+						let tvp = Zotero.getString('zotero.preferences.search.pdf.toolVersionPlatform',
+							[Zotero.Fulltext.pdfConverterName, latestVersion]);
+						msg += '- ' + tvp + '\n';
 					}
-					// New version available -- display update prompt
-					else {
-						var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].
-								createInstance(Components.interfaces.nsIPromptService);
-						var buttonFlags = (ps.BUTTON_POS_0) * (ps.BUTTON_TITLE_IS_STRING)
-							+ (ps.BUTTON_POS_1) * (ps.BUTTON_TITLE_CANCEL);
+					if (infoVersionAvailable) {
+						let tvp = Zotero.getString('zotero.preferences.search.pdf.toolVersionPlatform',
+							[Zotero.Fulltext.pdfInfoName, latestVersion]);
+						msg += '- ' + tvp + '\n';
+					}
+					msg += '\n';
+					msg += Zotero.getString('zotero.preferences.search.pdf.zoteroCanInstallVersion'
+							+ (bothAvailable ? 's' : ''));
+					
+					var index = ps.confirmEx(null,
+						converterIsRegistered ?
+							Zotero.getString('general.updateAvailable') : '',
+						msg,
+						buttonFlags,
+						converterIsRegistered ?
+							Zotero.getString('general.upgrade') :
+							Zotero.getString('general.install'),
+						null, null, null, {});
+					
+					if (index == 0) {
+						document.getElementById('pdftools-update-button').disabled = true;
+						var str = Zotero.getString('zotero.preferences.search.pdf.downloading');
+						document.getElementById('pdftools-update-button').setAttribute('label', str);
 						
-						var msg = Zotero.getString('zotero.preferences.search.pdf.available'
-							+ ((converterIsRegistered || infoIsRegistered) ? 'Updates' : 'Downloads'),
-							[Zotero.platform, 'zotero.org']) + '\n\n';
-						
-						if (converterVersionAvailable) {
-							let tvp = Zotero.getString('zotero.preferences.search.pdf.toolVersionPlatform',
-								[Zotero.Fulltext.pdfConverterName, converterVersion]);
-							msg += '- ' + tvp + '\n';
-						}
-						if (infoVersionAvailable) {
-							let tvp = Zotero.getString('zotero.preferences.search.pdf.toolVersionPlatform',
-								[Zotero.Fulltext.pdfInfoName, infoVersion]);
-							msg += '- ' + tvp + '\n';
-						}
-						msg += '\n';
-						msg += Zotero.getString('zotero.preferences.search.pdf.zoteroCanInstallVersion'
-								+ (bothAvailable ? 's' : ''));
-						
-						var index = ps.confirmEx(null,
-							converterIsRegistered ?
-								Zotero.getString('general.updateAvailable') : '',
-							msg,
-							buttonFlags,
-							converterIsRegistered ?
-								Zotero.getString('general.upgrade') :
-								Zotero.getString('general.install'),
-							null, null, null, {});
-						
-						if (index == 0) {
-							var installVersions = {
-								converter: converterVersionAvailable ?
-									converterVersion : null,
-								info: infoVersionAvailable ?
-									infoVersion : null
-							};
-							
-							document.getElementById('pdftools-update-button').disabled = true;
-							var str = Zotero.getString('zotero.preferences.search.pdf.downloading');
-							document.getElementById('pdftools-update-button').setAttribute('label', str);
-							
-							if (converterVersionAvailable && infoVersionAvailable) {
-								Zotero.Fulltext.downloadPDFTool('converter', converterVersion, function (success) {
-									if (!success) {
-										self.onPDFToolsDownloadError("Error downloading pdftotext");
-										return;
-									}
-									Zotero.Fulltext.downloadPDFTool('info', infoVersion, function (success) {
-										if (!success) {
-											self.onPDFToolsDownloadError("Error downloading pdfinfo");
-											return;
-										}
-										self.updatePDFToolsStatus();
-									});
-								});
-							}
-							else if (converterVersionAvailable) {
-								Zotero.Fulltext.downloadPDFTool('converter', converterVersion, function (success) {
-									if (!success) {
-										self.onPDFToolsDownloadError("Error downloading pdftotext");
-										return;
-									}
-									self.updatePDFToolsStatus();
-								});
-							}
-							else {
-								Zotero.Fulltext.downloadPDFTool('info', infoVersion, function (success) {
+						if (converterVersionAvailable && infoVersionAvailable) {
+							Zotero.Fulltext.downloadPDFTool('converter', latestVersion, function (success) {
+								if (!success) {
+									self.onPDFToolsDownloadError("Error downloading pdftotext");
+									return;
+								}
+								Zotero.Fulltext.downloadPDFTool('info', latestVersion, function (success) {
 									if (!success) {
 										self.onPDFToolsDownloadError("Error downloading pdfinfo");
 										return;
 									}
 									self.updatePDFToolsStatus();
 								});
-							}
+							});
+						}
+						else if (converterVersionAvailable) {
+							Zotero.Fulltext.downloadPDFTool('converter', latestVersion, function (success) {
+								if (!success) {
+									self.onPDFToolsDownloadError("Error downloading pdftotext");
+									return;
+								}
+								self.updatePDFToolsStatus();
+							});
+						}
+						else {
+							Zotero.Fulltext.downloadPDFTool('info', latestVersion, function (success) {
+								if (!success) {
+									self.onPDFToolsDownloadError("Error downloading pdfinfo");
+									return;
+								}
+								self.updatePDFToolsStatus();
+							});
 						}
 					}
 				}
-				// Version not found for platform
-				else if (xmlhttp.status == 404) {
-					self.onPDFToolsDownloadError(404);
-				}
 			}
 			catch (e) {
 				self.onPDFToolsDownloadError(e);
diff --git a/chrome/content/zotero/xpcom/fulltext.js b/chrome/content/zotero/xpcom/fulltext.js
index ea1d5b359..ee433cb8a 100644
--- a/chrome/content/zotero/xpcom/fulltext.js
+++ b/chrome/content/zotero/xpcom/fulltext.js
@@ -55,7 +55,7 @@ Zotero.Fulltext = new function(){
 	//this.clearItemContent = clearItemContent;
 	this.purgeUnusedWords = purgeUnusedWords;
 	
-	this.__defineGetter__("pdfToolsDownloadBaseURL", function() { return 'http://www.zotero.org/download/xpdf/'; });
+	this.__defineGetter__("pdfToolsDownloadBaseURL", function() { return 'https://www.zotero.org/download/xpdf/'; });
 	this.__defineGetter__("pdfToolsName", function() { return 'Xpdf'; });
 	this.__defineGetter__("pdfToolsURL", function() { return 'http://www.foolabs.com/xpdf/'; });
 	this.__defineGetter__("pdfConverterName", function() { return 'pdftotext'; });
@@ -82,9 +82,11 @@ Zotero.Fulltext = new function(){
 
 	var _pdfConverterVersion = null;
 	var _pdfConverterFileName = null;
+	var _pdfConverterScript = null; // nsIFile of hidden window script on Windows
 	var _pdfConverter = null; // nsIFile to executable
 	var _pdfInfoVersion = null;
 	var _pdfInfoFileName = null;
+	var _pdfInfoScript = null; // nsIFile of redirection script
 	var _pdfInfo = null; // nsIFile to executable
 	
 	var _idleObserverIsRegistered = false;
@@ -179,7 +181,7 @@ Zotero.Fulltext = new function(){
 				var fileName = this.pdfInfoFileName;
 			}
 			
-			var spec = this.pdfToolsDownloadBaseURL + fileName + '-' + version;
+			var spec = this.pdfToolsDownloadBaseURL + version + "/" + fileName;
 			var uri = ioService.newURI(spec, null, null);
 			
 			var file = Zotero.getTempDirectory();
@@ -202,15 +204,43 @@ Zotero.Fulltext = new function(){
 				
 				Zotero.File.putContentsAsync(file, is)
 				.then(function () {
+					var scriptExt = _getScriptExtension();
+					// On Windows, write out script to hide pdftotext console window
+					if (tool == 'converter') {
+						if (Zotero.isWin) {
+							var content = Zotero.File.getContentsFromURL('resource://zotero/hide.' + scriptExt);
+							var scriptFile = Zotero.getTempDirectory();
+							scriptFile.append('pdftotext.' + scriptExt);
+							Zotero.File.putContents(scriptFile, content);
+						}
+					}
+					// Write out output redirection script for pdfinfo
+					else if (tool == 'info') {
+						var content = Zotero.File.getContentsFromURL('resource://zotero/redirect.' + scriptExt);
+						var scriptFile = Zotero.getTempDirectory();
+						scriptFile.append('pdfinfo.' + scriptExt);
+						Zotero.File.putContents(scriptFile, content);
+					}
+					
 					// Set permissions to 755
 					if (Zotero.isMac) {
 						file.permissions = 33261;
+						if (scriptFile) {
+							scriptFile.permissions = 33261;
+						}
 					}
 					else if (Zotero.isLinux) {
 						file.permissions = 493;
+						if (scriptFile) {
+							scriptFile.permissions = 493;
+						}
 					}
 					
 					var destDir = Zotero.getZoteroDirectory()
+					// Move redirect script and executable into data dir
+					if (scriptFile) {
+						scriptFile.moveTo(destDir, null);
+					}
 					file.moveTo(destDir, null);
 					
 					// Write the version number to a file
@@ -223,6 +253,11 @@ Zotero.Fulltext = new function(){
 					if (callback) {
 						callback(true);
 					}
+				})
+				.catch(function (e) {
+					Zotero.debug(e, 1);
+					Components.utils.reportError(e);
+					callback(false);
 				});
 			});
 		}
@@ -274,10 +309,42 @@ Zotero.Fulltext = new function(){
 			return false;
 		}
 		
+		// If scripts exist, use those instead
+		switch (tool) {
+		case 'converter':
+			if (Zotero.isWin) {
+				var script = Zotero.getZoteroDirectory();
+				script.append('pdftotext.' + _getScriptExtension())
+				if (script.exists()) {
+					Zotero.debug(script.leafName + " registered");
+					_pdfConverterScript = script;
+				}
+			}
+			break;
+		
+		case 'info':
+			var script = Zotero.getZoteroDirectory();
+			script.append('pdfinfo.' + _getScriptExtension())
+			// The redirection script is necessary to run pdfinfo
+			if (!script.exists()) {
+				Zotero.debug(script.leafName + " not found -- PDF statistics disabled");
+				return false;
+			}
+			Zotero.debug(toolName + " redirection script registered");
+			_pdfInfoScript = script;
+			break;
+		}
+		
 		var versionFile = exec.parent;
 		versionFile.append(fileName + '.version');
 		if (versionFile.exists()) {
-			var version = Zotero.File.getSample(versionFile).split(/[\r\n\s]/)[0];
+			try {
+				var version = Zotero.File.getSample(versionFile).split(/[\r\n\s]/)[0];
+			}
+			catch (e) {
+				Zotero.debug(e, 1);
+				Components.utils.reportError(e);
+			}
 		}
 		if (!version) {
 			var version = 'UNKNOWN';
@@ -295,7 +362,7 @@ Zotero.Fulltext = new function(){
 				break;
 		}
 		
-		Zotero.debug(toolName + ' version ' + version + ' registered at ' + exec.path);
+		Zotero.debug(toolName + ' version ' + version + ' registered');
 		
 		return true;
 	}
@@ -529,16 +596,19 @@ Zotero.Fulltext = new function(){
 		}
 		cacheFile.append(this.pdfConverterCacheFile);
 		
-		if (_pdfInfo) {
+		if (_pdfInfoScript) {
 			var infoFile = cacheFile.parent;
 			infoFile.append(this.pdfInfoCacheFile);
-			Zotero.debug('Running pdfinfo "' + file.path + '" "' + infoFile.path + '"');
 			
-			var proc = Components.classes["@mozilla.org/process/util;1"].
-					createInstance(Components.interfaces.nsIProcess);
-			proc.init(_pdfInfo);
+			var args = [_pdfInfo.path, file.path, infoFile.path];
+			
+			Zotero.debug("Running " + _pdfInfoScript.path + ' '
+				+ args.map(arg => "'" + arg + "'").join(' '));
+			
+			var proc = Components.classes["@mozilla.org/process/util;1"]
+				.createInstance(Components.interfaces.nsIProcess);
+			proc.init(_pdfInfoScript);
 			
-			var args = [file.path, infoFile.path];
 			try {
 				proc.runw(true, args, args.length);
 				var totalPages = this.getTotalPagesFromFile(itemID);
@@ -551,15 +621,12 @@ Zotero.Fulltext = new function(){
 			Zotero.debug(this.pdfInfoName + " is not available");
 		}
 		
-		Zotero.debug('Running pdftotext -enc UTF-8 -nopgbrk '
-			+ (allPages ? '' : '-l ' + maxPages) + ' "' + file.path + '" "'
-			+ cacheFile.path + '"');
+		var args = []
+		if (_pdfConverterScript) {
+			args.push(_pdfConverter.path);
+		}
+		args.push('-enc', 'UTF-8', '-nopgbrk');
 		
-		var proc = Components.classes["@mozilla.org/process/util;1"].
-				createInstance(Components.interfaces.nsIProcess);
-		proc.init(_pdfConverter);
-		
-		var args = ['-enc', 'UTF-8', '-nopgbrk'];
 		if (allPages) {
 			if (totalPages) {
 				var pagesIndexed = totalPages;
@@ -570,6 +637,20 @@ Zotero.Fulltext = new function(){
 			var pagesIndexed = Math.min(maxPages, totalPages);
 		}
 		args.push(file.path, cacheFile.path);
+		
+		var proc = Components.classes["@mozilla.org/process/util;1"]
+			.createInstance(Components.interfaces.nsIProcess);
+		if (_pdfConverterScript) {
+			Zotero.debug("Running " + _pdfConverterScript.path + ' '
+				+ args.map(arg => "'" + arg + "'").join(' '));
+			proc.init(_pdfConverterScript);
+		}
+		else {
+			Zotero.debug("Running " + _pdfConverter.path + ' '
+				+ args.map(arg => "'" + arg + "'").join(' '));
+			proc.init(_pdfConverter);
+		}
+		
 		try {
 			proc.runw(true, args, args.length);
 		}
@@ -1679,4 +1760,9 @@ Zotero.Fulltext = new function(){
 			return w;
 		});
 	}
+	
+	function _getScriptExtension() {
+		return Zotero.isWin ? 'vbs' : 'sh';
+	}
+
 }
diff --git a/chrome/content/zotero/xpcom/schema.js b/chrome/content/zotero/xpcom/schema.js
index 1ea3154b3..c512936e2 100644
--- a/chrome/content/zotero/xpcom/schema.js
+++ b/chrome/content/zotero/xpcom/schema.js
@@ -1590,6 +1590,9 @@ Zotero.Schema = new function(){
 		var styleUpdates = xmlhttp.responseXML.getElementsByTagName('style');
 		
 		var updatePDFTools = function () {
+			// No updates for PPC
+			if (Zotero.platform == 'MacPPC') return;
+			
 			let pdfToolsUpdates = xmlhttp.responseXML.getElementsByTagName('pdftools');
 			if (pdfToolsUpdates.length) {
 				let availableVersion = pdfToolsUpdates[0].getAttribute('version');
diff --git a/resource/hide.vbs b/resource/hide.vbs
new file mode 100644
index 000000000..9f233e2bd
--- /dev/null
+++ b/resource/hide.vbs
@@ -0,0 +1,24 @@
+Option Explicit
+
+Dim WshShell, fso, exe, args, I
+
+Set WshShell = Wscript.CreateObject("Wscript.Shell")
+Set fso = WScript.CreateObject("Scripting.FileSystemObject")
+
+If WScript.Arguments.Count = 0 Then
+  WScript.Echo "Usage: hidden.vbs program.exe [args...]"
+  WScript.Quit 1
+End If
+
+exe = WScript.Arguments(0)
+If Not(fso.FileExists(exe)) Then
+  WScript.Echo "Executable not found: " & exe
+  WScript.Quit 1
+End If
+
+args = ""
+For I = 1 to WScript.Arguments.Count - 1
+  args = args & " " & chr(34) & WScript.Arguments(I) & chr(34)
+Next
+
+WshShell.Run exe & args, 0, true
diff --git a/resource/redirect.sh b/resource/redirect.sh
new file mode 100644
index 000000000..05342e273
--- /dev/null
+++ b/resource/redirect.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+if [ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ]; then
+    echo "Usage: $0 cmd source output.txt"
+    exit 1
+fi
+"$1" "$2" > "$3"
diff --git a/resource/redirect.vbs b/resource/redirect.vbs
new file mode 100644
index 000000000..4f1e7a3f2
--- /dev/null
+++ b/resource/redirect.vbs
@@ -0,0 +1,33 @@
+Option Explicit
+
+Dim WshShell
+Dim fso
+Dim exe, src, dest
+
+Set WshShell = Wscript.CreateObject("Wscript.Shell")
+Set fso = WScript.CreateObject("Scripting.FileSystemObject")
+
+If Not(Wscript.Arguments.Count = 3) Then
+  Wscript.Echo "Usage: redirect.vbs <.exe file> <source file> <text file>"
+  WScript.Quit 1
+End If
+
+exe = WScript.Arguments(0)
+src = WScript.Arguments(1)
+dest = WScript.Arguments(2)
+If Not(fso.FileExists(exe)) Then
+  WScript.Echo "Executable not found: " & exe
+  WScript.Quit 1
+End If
+
+If Not(fso.FileExists(src)) Then
+  WScript.Echo "Source file not found: " & src
+  WScript.Quit 1
+End If
+
+If Not(fso.FolderExists(Left(dest, InstrRev(dest, "\")))) Then
+  WScript.Echo "Destination folder not found: " & Left(dest, InstrRev(dest, "\"))
+  WScript.Quit 1
+End If
+
+WshShell.Run "%comspec% /c " & exe & " " & chr(34) & src & chr(34) & " > " & chr(34) & dest & chr(34), 0, true

From 1a47d79716db73f114fa844a9caaa14227d35a85 Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Wed, 1 Apr 2015 13:20:34 -0400
Subject: [PATCH 20/44] Restore support for modified pdfinfo 3.02

---
 chrome/content/zotero/xpcom/fulltext.js | 58 ++++++++++++++++++-------
 1 file changed, 42 insertions(+), 16 deletions(-)

diff --git a/chrome/content/zotero/xpcom/fulltext.js b/chrome/content/zotero/xpcom/fulltext.js
index ee433cb8a..a58247b8c 100644
--- a/chrome/content/zotero/xpcom/fulltext.js
+++ b/chrome/content/zotero/xpcom/fulltext.js
@@ -309,6 +309,21 @@ Zotero.Fulltext = new function(){
 			return false;
 		}
 		
+		var versionFile = exec.parent;
+		versionFile.append(fileName + '.version');
+		if (versionFile.exists()) {
+			try {
+				var version = Zotero.File.getSample(versionFile).split(/[\r\n\s]/)[0];
+			}
+			catch (e) {
+				Zotero.debug(e, 1);
+				Components.utils.reportError(e);
+			}
+		}
+		if (!version) {
+			var version = 'UNKNOWN';
+		}
+		
 		// If scripts exist, use those instead
 		switch (tool) {
 		case 'converter':
@@ -323,6 +338,9 @@ Zotero.Fulltext = new function(){
 			break;
 		
 		case 'info':
+			// Modified 3.02 version doesn't use redirection script
+			if (version == '3.02') break;
+			
 			var script = Zotero.getZoteroDirectory();
 			script.append('pdfinfo.' + _getScriptExtension())
 			// The redirection script is necessary to run pdfinfo
@@ -335,21 +353,6 @@ Zotero.Fulltext = new function(){
 			break;
 		}
 		
-		var versionFile = exec.parent;
-		versionFile.append(fileName + '.version');
-		if (versionFile.exists()) {
-			try {
-				var version = Zotero.File.getSample(versionFile).split(/[\r\n\s]/)[0];
-			}
-			catch (e) {
-				Zotero.debug(e, 1);
-				Components.utils.reportError(e);
-			}
-		}
-		if (!version) {
-			var version = 'UNKNOWN';
-		}
-		
 		switch (tool) {
 			case 'converter':
 				_pdfConverter = exec;
@@ -596,7 +599,30 @@ Zotero.Fulltext = new function(){
 		}
 		cacheFile.append(this.pdfConverterCacheFile);
 		
-		if (_pdfInfoScript) {
+		// Modified 3.02 version that can output a text file directly
+		if (_pdfInfo && _pdfInfoVersion == '3.02') {
+			var infoFile = cacheFile.parent;
+			infoFile.append(this.pdfInfoCacheFile);
+			
+			var args = [file.path, infoFile.path];
+			
+			Zotero.debug("Running " + _pdfInfo.path + ' '
+				+ args.map(arg => "'" + arg + "'").join(' '));
+			
+			var proc = Components.classes["@mozilla.org/process/util;1"]
+				.createInstance(Components.interfaces.nsIProcess);
+			proc.init(_pdfInfo);
+			
+			try {
+				proc.runw(true, args, args.length);
+				var totalPages = this.getTotalPagesFromFile(itemID);
+			}
+			catch (e) {
+				Zotero.debug("Error running pdfinfo");
+			}
+		}
+		// Use redirection script
+		else if (_pdfInfoScript) {
 			var infoFile = cacheFile.parent;
 			infoFile.append(this.pdfInfoCacheFile);
 			

From e567ad25aa1d32ede8f752f24dcbeaece905fedd Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Wed, 1 Apr 2015 16:23:12 -0400
Subject: [PATCH 21/44] More PDF tools tweaks

- If one tool is missing, reinstall it automatically during translator
  update check
- Account for pdfinfo 3.02pl1 on Linux
---
 .../content/zotero/preferences/preferences_search.js | 12 ++++++++----
 chrome/content/zotero/xpcom/fulltext.js              |  4 ++--
 chrome/content/zotero/xpcom/schema.js                | 12 ++++++++++--
 3 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/chrome/content/zotero/preferences/preferences_search.js b/chrome/content/zotero/preferences/preferences_search.js
index 6dfe00021..51930fd72 100644
--- a/chrome/content/zotero/preferences/preferences_search.js
+++ b/chrome/content/zotero/preferences/preferences_search.js
@@ -187,13 +187,17 @@ Zotero_Preferences.Search = {
 				var converterVersionAvailable = (!converterIsRegistered ||
 						Zotero.Fulltext.pdfConverterVersion == 'UNKNOWN'
 							|| latestVersion > Zotero.Fulltext.pdfConverterVersion
-							|| (latestVersion != '3.02' && Zotero.Fulltext.pdfConverterVersion == '3.02')
-							|| (latestVersion != '3.02' && latestVersion != '3.04' && Zotero.Fulltext.pdfConverterVersion == '3.04'));
+							|| (!latestVersion.startsWith('3.02')
+								&& Zotero.Fulltext.pdfConverterVersion.startsWith('3.02'))
+							|| (!latestVersion.startsWith('3.02') && latestVersion != '3.04'
+								&& Zotero.Fulltext.pdfConverterVersion == '3.04'));
 				var infoVersionAvailable = (!infoIsRegistered ||
 						Zotero.Fulltext.pdfInfoVersion == 'UNKNOWN'
 							|| latestVersion > Zotero.Fulltext.pdfInfoVersion
-							|| (latestVersion != '3.02' && Zotero.Fulltext.pdfInfoVersion == '3.02')
-							|| (latestVersion != '3.02' && latestVersion != '3.04' && Zotero.Fulltext.pdfInfoVersion == '3.04'));
+							|| (!latestVersion.startsWith('3.02')
+								&& Zotero.Fulltext.pdfInfoVersion.startsWith('3.02'))
+							|| (!latestVersion.startsWith('3.02') && latestVersion != '3.04'
+								&& Zotero.Fulltext.pdfInfoVersion == '3.04'));
 				var bothAvailable = converterVersionAvailable && infoVersionAvailable;
 				
 				// Up to date -- disable update button
diff --git a/chrome/content/zotero/xpcom/fulltext.js b/chrome/content/zotero/xpcom/fulltext.js
index a58247b8c..fc7976ecf 100644
--- a/chrome/content/zotero/xpcom/fulltext.js
+++ b/chrome/content/zotero/xpcom/fulltext.js
@@ -339,7 +339,7 @@ Zotero.Fulltext = new function(){
 		
 		case 'info':
 			// Modified 3.02 version doesn't use redirection script
-			if (version == '3.02') break;
+			if (version.startsWith('3.02')) break;
 			
 			var script = Zotero.getZoteroDirectory();
 			script.append('pdfinfo.' + _getScriptExtension())
@@ -600,7 +600,7 @@ Zotero.Fulltext = new function(){
 		cacheFile.append(this.pdfConverterCacheFile);
 		
 		// Modified 3.02 version that can output a text file directly
-		if (_pdfInfo && _pdfInfoVersion == '3.02') {
+		if (_pdfInfo && _pdfInfoVersion.startsWith('3.02')) {
 			var infoFile = cacheFile.parent;
 			infoFile.append(this.pdfInfoCacheFile);
 			
diff --git a/chrome/content/zotero/xpcom/schema.js b/chrome/content/zotero/xpcom/schema.js
index c512936e2..a9917aea8 100644
--- a/chrome/content/zotero/xpcom/schema.js
+++ b/chrome/content/zotero/xpcom/schema.js
@@ -1606,18 +1606,26 @@ Zotero.Schema = new function(){
 				
 				if (Zotero.Fulltext.pdfInfoIsRegistered()) {
 					let currentVersion = Zotero.Fulltext.pdfInfoVersion;
-					if (currentVersion < availableVersion || currentVersion == '3.02'
+					if (currentVersion < availableVersion || currentVersion.startsWith('3.02')
 							|| currentVersion == 'UNKNOWN') {
 						installInfo = true;
 					}
 				}
+				// Install missing component if one is installed
+				else if (Zotero.Fulltext.pdfConverterIsRegistered()) {
+					installInfo = true;
+				}
 				if (Zotero.Fulltext.pdfConverterIsRegistered()) {
 					let currentVersion = Zotero.Fulltext.pdfConverterVersion;
-					if (currentVersion < availableVersion || currentVersion == '3.02'
+					if (currentVersion < availableVersion || currentVersion.startsWith('3.02')
 							|| currentVersion == 'UNKNOWN') {
 						installConverter = true;
 					}
 				}
+				// Install missing component if one is installed
+				else if (Zotero.Fulltext.pdfInfoIsRegistered()) {
+					installConverter = true;
+				}
 				
 				let prefKey = 'pdfToolsInstallError';
 				let lastTry = 0, delay = 43200000; // half a day, so doubles to a day initially

From 4613f9593c340dc65b23b28ca247e5116c520419 Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Wed, 1 Apr 2015 16:43:37 -0400
Subject: [PATCH 22/44] Don't update pdfinfo unnecesarily

---
 chrome/content/zotero/xpcom/schema.js | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/chrome/content/zotero/xpcom/schema.js b/chrome/content/zotero/xpcom/schema.js
index a9917aea8..1ec995ecc 100644
--- a/chrome/content/zotero/xpcom/schema.js
+++ b/chrome/content/zotero/xpcom/schema.js
@@ -1666,9 +1666,12 @@ Zotero.Schema = new function(){
 				else if (installConverter) {
 					Zotero.Fulltext.downloadPDFTool('converter', availableVersion, checkResult);
 				}
-				else {
+				else if (installInfo) {
 					Zotero.Fulltext.downloadPDFTool('info', availableVersion, checkResult);
 				}
+				else {
+					Zotero.debug("PDF tools are up to date");
+				}
 			}
 		};
 		

From 788f92bc8b85d9d5b4ebc8e4cc5863ea93f57885 Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Fri, 3 Apr 2015 23:54:37 -0400
Subject: [PATCH 23/44] Fix sync error panel positioning (at least on OS X)

After 88be88661
---
 chrome/content/zotero/xpcom/sync.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/chrome/content/zotero/xpcom/sync.js b/chrome/content/zotero/xpcom/sync.js
index eb2f59751..c5c264d98 100644
--- a/chrome/content/zotero/xpcom/sync.js
+++ b/chrome/content/zotero/xpcom/sync.js
@@ -956,7 +956,7 @@ Zotero.Sync.Runner = new function () {
 			
 			var panel = Zotero.Sync.Runner.updateErrorPanel(doc, errors);
 			
-			panel.openPopup(this, "after_end", 4, 0, false, false);
+			panel.openPopup(this, "after_end", 15, 0, false, false);
 		}
 	}
 	

From 58b56abbc7c2e7d11861164c5be439fe08966c12 Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Fri, 3 Apr 2015 23:59:32 -0400
Subject: [PATCH 24/44] Fix file sync errors with symlinked files/directories

nsIFile seems to have figured out symlinks since Firefox 3.0.1
---
 chrome/content/zotero/xpcom/storage.js | 23 +----------------------
 1 file changed, 1 insertion(+), 22 deletions(-)

diff --git a/chrome/content/zotero/xpcom/storage.js b/chrome/content/zotero/xpcom/storage.js
index 24a6a4c18..eb259f84e 100644
--- a/chrome/content/zotero/xpcom/storage.js
+++ b/chrome/content/zotero/xpcom/storage.js
@@ -1734,16 +1734,6 @@ Zotero.Sync.Storage = new function () {
 				Zotero.File.checkFileAccessError(e, destFile, 'create');
 			}
 			
-			var origPath = destFile.path;
-			var origFileName = destFile.leafName;
-			destFile.normalize();
-			if (origPath != destFile.path) {
-				var msg = "ZIP file " + zipFile.leafName + " contained symlink '"
-					+ origFileName + "'";
-				Zotero.debug(msg, 1);
-				Components.utils.reportError(msg + " in " + funcName);
-				continue;
-			}
 			destFile.permissions = 0644;
 			
 			// If we're renaming the main file, processDownload() needs to know
@@ -1773,18 +1763,7 @@ Zotero.Sync.Storage = new function () {
 				continue;
 			}
 			
-			// Firefox (as of 3.0.1) can't detect symlinks (at least on OS X),
-			// so use pre/post-normalized path to check
-			var origPath = file.path;
-			var origFileName = file.leafName;
-			file.normalize();
-			if (origPath != file.path) {
-				var msg = "Not deleting symlink '" + origFileName + "'";
-				Zotero.debug(msg, 2);
-				Components.utils.reportError(msg + " in " + funcName);
-				continue;
-			}
-			// This should be redundant with above check, but let's do it anyway
+			// Check symlink awareness, just to be safe
 			if (!parentDir.contains(file, false)) {
 				var msg = "Storage directory doesn't contain '" + file.leafName + "'";
 				Zotero.debug(msg, 2);

From af871a3fd53a47561ed590f044bb82176faecf9f Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Mon, 6 Apr 2015 16:40:52 -0400
Subject: [PATCH 25/44] Add 2x versions of many icons

Courtesy of Pastel SVG (2x famfamfam)

I didn't add 2x versions for any composite icons or any Fugue icons.

Also:

- Removed some unused/redundant images
- Switched to shadowless versions for a couple Fugue icons
---
 .../content/zotero-platform/mac/overlay.css   |  16 +++++++
 .../content/zotero-platform/unix/overlay.css  |  10 +++++
 .../unix/treesource-collection.png            | Bin 537 -> 0 bytes
 .../unix/treesource-search.png                | Bin 679 -> 0 bytes
 .../content/zotero-platform/win/overlay.css   |  10 +++++
 .../win/treesource-collection.png             | Bin 537 -> 0 bytes
 .../zotero-platform/win/treesource-search.png | Bin 679 -> 0 bytes
 chrome/content/zotero/about.xul               |   1 +
 chrome/content/zotero/browser.js              |   2 +-
 .../zotero/xpcom/collectionTreeView.js        |   9 +++-
 .../content/zotero/xpcom/data/cachedTypes.js  |  41 +++++++++++-------
 chrome/content/zotero/xpcom/data/tags.js      |  14 +++---
 .../skin/default/zotero/arrow_refresh@2x.png  | Bin 0 -> 1234 bytes
 .../default/zotero/arrow_rotate_error.png     | Bin 843 -> 0 bytes
 chrome/skin/default/zotero/attach@2x.png      | Bin 0 -> 884 bytes
 .../default/zotero/bindings/attachmentbox.css |   7 +++
 chrome/skin/default/zotero/cog@2x.png         | Bin 0 -> 1341 bytes
 .../default/zotero/control_stop_blue@2x.png   | Bin 0 -> 1962 bytes
 chrome/skin/default/zotero/error@2x.png       | Bin 0 -> 1254 bytes
 chrome/skin/default/zotero/exclamation@2x.png | Bin 0 -> 1366 bytes
 .../zotero/locate-external-viewer@2x.png      | Bin 0 -> 901 bytes
 .../default/zotero/locate-view-online@2x.png  | Bin 0 -> 2340 bytes
 .../zotero/mac/toolbar-advanced-search@2x.png | Bin 0 -> 2573 bytes
 .../zotero/mac/toolbar-note-add@2x.png        | Bin 0 -> 2664 bytes
 chrome/skin/default/zotero/overlay.css        |  40 ++++++++++++++---
 .../skin/default/zotero/page-white-add@2x.png | Bin 0 -> 896 bytes
 .../skin/default/zotero/tag-automatic@2x.png  | Bin 0 -> 832 bytes
 .../default/zotero/tag-selector-menu@2x.png   | Bin 0 -> 171 bytes
 chrome/skin/default/zotero/tag-selector.png   | Bin 877 -> 0 bytes
 chrome/skin/default/zotero/tag@2x.png         | Bin 0 -> 821 bytes
 .../zotero/toolbar-advanced-search@2x.png     | Bin 0 -> 1247 bytes
 .../zotero/toolbar-collection-add@2x.png      | Bin 0 -> 999 bytes
 .../zotero/toolbar-collection-delete@2x.png   | Bin 0 -> 985 bytes
 .../zotero/toolbar-collection-edit@2x.png     | Bin 0 -> 1251 bytes
 .../zotero/toolbar-fullscreen-top@2x.png      | Bin 0 -> 911 bytes
 .../default/zotero/toolbar-go-arrow@2x.png    | Bin 0 -> 591 bytes
 .../default/zotero/toolbar-item-add@2x.png    | Bin 0 -> 1506 bytes
 .../default/zotero/toolbar-item-from-page.png | Bin 739 -> 0 bytes
 .../default/zotero/toolbar-link-add@2x.png    | Bin 0 -> 1224 bytes
 .../default/zotero/toolbar-note-add@2x.png    | Bin 0 -> 1062 bytes
 .../default/zotero/treeitem-artwork@2x.png    | Bin 0 -> 1031 bytes
 .../zotero/treeitem-attachment-file.png       | Bin 294 -> 0 bytes
 .../zotero/treeitem-attachment-link@2x.png    | Bin 0 -> 944 bytes
 .../treeitem-attachment-web-link@2x.png       | Bin 0 -> 1471 bytes
 .../zotero/treeitem-audioRecording.png        | Bin 738 -> 685 bytes
 .../zotero/treeitem-audioRecording@2x.png     | Bin 0 -> 1016 bytes
 .../skin/default/zotero/treeitem-bill@2x.png  | Bin 0 -> 1295 bytes
 .../skin/default/zotero/treeitem-book@2x.png  | Bin 0 -> 828 bytes
 .../zotero/treeitem-bookSection@2x.png        | Bin 0 -> 861 bytes
 chrome/skin/default/zotero/treeitem-case.png  | Bin 753 -> 723 bytes
 .../zotero/treeitem-computerProgram@2x.png    | Bin 0 -> 886 bytes
 .../skin/default/zotero/treeitem-document.png | Bin 373 -> 0 bytes
 .../skin/default/zotero/treeitem-film@2x.png  | Bin 0 -> 830 bytes
 .../zotero/treeitem-instantMessage@2x.png     | Bin 0 -> 667 bytes
 .../default/zotero/treeitem-interview@2x.png  | Bin 0 -> 786 bytes
 .../zotero/treeitem-journalArticle@2x.png     | Bin 0 -> 560 bytes
 .../default/zotero/treeitem-letter@2x.png     | Bin 0 -> 1338 bytes
 .../zotero/treeitem-magazineArticle@2x.png    | Bin 0 -> 589 bytes
 .../zotero/treeitem-newspaperArticle@2x.png   | Bin 0 -> 1456 bytes
 .../skin/default/zotero/treeitem-note@2x.png  | Bin 0 -> 714 bytes
 .../default/zotero/treeitem-report@2x.png     | Bin 0 -> 1005 bytes
 .../default/zotero/treeitem-webpage@2x.png    | Bin 2058 -> 965 bytes
 chrome/skin/default/zotero/treeitem@2x.png    | Bin 0 -> 390 bytes
 .../zotero/treesource-collection@2x.png       | Bin 0 -> 628 bytes
 .../zotero/treesource-duplicates@2x.png       | Bin 0 -> 520 bytes
 .../default/zotero/treesource-library@2x.png  | Bin 0 -> 792 bytes
 .../default/zotero/treesource-search@2x.png   | Bin 0 -> 1128 bytes
 .../zotero/treesource-trash-full@2x.png       | Bin 0 -> 1069 bytes
 .../default/zotero/treesource-trash@2x.png    | Bin 0 -> 1150 bytes
 .../default/zotero/treesource-unfiled@2x.png  | Bin 0 -> 429 bytes
 chrome/skin/default/zotero/zotero.css         |  18 ++++----
 71 files changed, 128 insertions(+), 40 deletions(-)
 delete mode 100644 chrome/content/zotero-platform/unix/treesource-collection.png
 delete mode 100644 chrome/content/zotero-platform/unix/treesource-search.png
 delete mode 100644 chrome/content/zotero-platform/win/treesource-collection.png
 delete mode 100644 chrome/content/zotero-platform/win/treesource-search.png
 create mode 100644 chrome/skin/default/zotero/arrow_refresh@2x.png
 delete mode 100644 chrome/skin/default/zotero/arrow_rotate_error.png
 create mode 100644 chrome/skin/default/zotero/attach@2x.png
 create mode 100644 chrome/skin/default/zotero/cog@2x.png
 create mode 100644 chrome/skin/default/zotero/control_stop_blue@2x.png
 create mode 100644 chrome/skin/default/zotero/error@2x.png
 create mode 100644 chrome/skin/default/zotero/exclamation@2x.png
 create mode 100644 chrome/skin/default/zotero/locate-external-viewer@2x.png
 create mode 100644 chrome/skin/default/zotero/locate-view-online@2x.png
 create mode 100644 chrome/skin/default/zotero/mac/toolbar-advanced-search@2x.png
 create mode 100644 chrome/skin/default/zotero/mac/toolbar-note-add@2x.png
 create mode 100644 chrome/skin/default/zotero/page-white-add@2x.png
 create mode 100644 chrome/skin/default/zotero/tag-automatic@2x.png
 create mode 100644 chrome/skin/default/zotero/tag-selector-menu@2x.png
 delete mode 100644 chrome/skin/default/zotero/tag-selector.png
 create mode 100644 chrome/skin/default/zotero/tag@2x.png
 create mode 100644 chrome/skin/default/zotero/toolbar-advanced-search@2x.png
 create mode 100644 chrome/skin/default/zotero/toolbar-collection-add@2x.png
 create mode 100644 chrome/skin/default/zotero/toolbar-collection-delete@2x.png
 create mode 100644 chrome/skin/default/zotero/toolbar-collection-edit@2x.png
 create mode 100644 chrome/skin/default/zotero/toolbar-fullscreen-top@2x.png
 create mode 100644 chrome/skin/default/zotero/toolbar-go-arrow@2x.png
 create mode 100644 chrome/skin/default/zotero/toolbar-item-add@2x.png
 delete mode 100644 chrome/skin/default/zotero/toolbar-item-from-page.png
 create mode 100644 chrome/skin/default/zotero/toolbar-link-add@2x.png
 create mode 100644 chrome/skin/default/zotero/toolbar-note-add@2x.png
 create mode 100644 chrome/skin/default/zotero/treeitem-artwork@2x.png
 delete mode 100755 chrome/skin/default/zotero/treeitem-attachment-file.png
 create mode 100644 chrome/skin/default/zotero/treeitem-attachment-link@2x.png
 create mode 100644 chrome/skin/default/zotero/treeitem-attachment-web-link@2x.png
 mode change 100644 => 100755 chrome/skin/default/zotero/treeitem-audioRecording.png
 create mode 100755 chrome/skin/default/zotero/treeitem-audioRecording@2x.png
 create mode 100644 chrome/skin/default/zotero/treeitem-bill@2x.png
 create mode 100644 chrome/skin/default/zotero/treeitem-book@2x.png
 create mode 100644 chrome/skin/default/zotero/treeitem-bookSection@2x.png
 mode change 100644 => 100755 chrome/skin/default/zotero/treeitem-case.png
 create mode 100644 chrome/skin/default/zotero/treeitem-computerProgram@2x.png
 delete mode 100644 chrome/skin/default/zotero/treeitem-document.png
 create mode 100644 chrome/skin/default/zotero/treeitem-film@2x.png
 create mode 100644 chrome/skin/default/zotero/treeitem-instantMessage@2x.png
 create mode 100644 chrome/skin/default/zotero/treeitem-interview@2x.png
 create mode 100644 chrome/skin/default/zotero/treeitem-journalArticle@2x.png
 create mode 100644 chrome/skin/default/zotero/treeitem-letter@2x.png
 create mode 100644 chrome/skin/default/zotero/treeitem-magazineArticle@2x.png
 create mode 100644 chrome/skin/default/zotero/treeitem-newspaperArticle@2x.png
 create mode 100644 chrome/skin/default/zotero/treeitem-note@2x.png
 create mode 100644 chrome/skin/default/zotero/treeitem-report@2x.png
 create mode 100644 chrome/skin/default/zotero/treeitem@2x.png
 create mode 100644 chrome/skin/default/zotero/treesource-collection@2x.png
 create mode 100644 chrome/skin/default/zotero/treesource-duplicates@2x.png
 create mode 100644 chrome/skin/default/zotero/treesource-library@2x.png
 create mode 100644 chrome/skin/default/zotero/treesource-search@2x.png
 create mode 100644 chrome/skin/default/zotero/treesource-trash-full@2x.png
 create mode 100644 chrome/skin/default/zotero/treesource-trash@2x.png
 create mode 100644 chrome/skin/default/zotero/treesource-unfiled@2x.png

diff --git a/chrome/content/zotero-platform/mac/overlay.css b/chrome/content/zotero-platform/mac/overlay.css
index ee9a7839d..fc2911e58 100644
--- a/chrome/content/zotero-platform/mac/overlay.css
+++ b/chrome/content/zotero-platform/mac/overlay.css
@@ -107,6 +107,12 @@
 	margin-left: 7px;
 }
 
+@media (min-resolution: 1.5dppx) {
+	.zotero-tb-button > .toolbarbutton-icon {
+		max-width: 28px;
+	}
+}
+
 .zotero-tb-button, .zotero-tb-button:first-child, .zotero-tb-button:last-child {
   -moz-margin-start: 0 !important;
   -moz-margin-end: 3px !important;
@@ -467,6 +473,16 @@ treechildren::-moz-tree-image {
 	list-style-image: url('chrome://zotero/skin/mac/toolbar-note-add.png');
 }
 
+@media (min-resolution: 1.5dppx) {
+	#zotero-tb-advanced-search {
+		list-style-image: url('chrome://zotero/skin/mac/toolbar-advanced-search@2x.png');
+	}
+	
+	#zotero-tb-note-add {
+		list-style-image: url('chrome://zotero/skin/mac/toolbar-note-add@2x.png');
+	}
+}
+
 #zotero-tb-actions-menu
 {
 	list-style-image: url('chrome://zotero/skin/mac/cog.png');
diff --git a/chrome/content/zotero-platform/unix/overlay.css b/chrome/content/zotero-platform/unix/overlay.css
index 5518adfb4..25561b683 100644
--- a/chrome/content/zotero-platform/unix/overlay.css
+++ b/chrome/content/zotero-platform/unix/overlay.css
@@ -93,6 +93,16 @@
 /* End toolbar buttons */
 
 
+@media (min-resolution: 1dppx) {
+	#zotero-toolbar .toolbarbutton-icon {
+		width: 16px;
+	}
+	
+	#zotero-tb-sync > .toolbarbutton-icon {
+		width: 20px;
+	}
+}
+
 .zotero-tb-button:not([type=menu]) {
 	margin-right: 4px;
 }
diff --git a/chrome/content/zotero-platform/unix/treesource-collection.png b/chrome/content/zotero-platform/unix/treesource-collection.png
deleted file mode 100644
index 784e8fa48234f4f64b6922a6758f254ee0ca08ec..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 537
zcmV+!0_OdRP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzt4TybR5;7U
zle>x(K@^6+>g^d@v4;gkbWsEoXE%32*i1tcpTNXd5CcIl)ECgqz|2rE6EW}s7R?kl
za1q`0GCkMruC6-2LANtwVlsgzsp4?{@7$`KBv!G66>Vie3h?3OmEEkjwdLG0PgLVi
z`!N((f$A@n17Ldj#`};0I3@iHJ5M{#IZz|UIYRm4(!uV7eYIYIwQf&}_2J~}>pQ^n
z6o8--^T(=hkBNQ_k{-_GWE<Dm*nZeW0t{q;aLLKDA7AX;UjS;C$UM<^kqJBcOg%kd
za`=W$b`Dg7d87aY^8Vc}vWxQ>;FMW7!p}f{N<AKt_ivG%+H4#CQ-PWa(shVQx&YJ(
z>G3nHZ{D5<3d8&tLh%a4AqqnjMkr3m&fkMdECD3N5}Unig5wy40;>lo4j~k+e}v)`
zR6)J8Mk*u=SpB`p6o)7j?S0T@9?bz#m@l>gc*zk__|*!FMcHwP!gwLJvS~9c0px8E
zW<O8VlWvaXiPQnhL8noy0FRR9bV($ZrR1$z0Ltpo-jkc#i0e4=f4*G-?ybl4tXbgy
b{*Au@zK9=x;oF){00000NkvXXu0mjfJ%;Z&

diff --git a/chrome/content/zotero-platform/unix/treesource-search.png b/chrome/content/zotero-platform/unix/treesource-search.png
deleted file mode 100644
index 0ba939184d5e2257e380004ed799f00f66a49277..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 679
zcmV;Y0$BZtP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!IY~r8R2Uhh
z!97S-VF1VB-+S(Rk5}`Uq1M$1(Z$;rv?K@)K|xS0ZB5lsEzZ%_$5?YvQxP;Z1`!cO
zGzNjxU>|B!lwB?F)%&66ocFx{jBe!85I&EQ#75Y65B5(Mx_0d{Cg3j-*JeIvt~v(9
ztY`S8F>>s+V~sTmN;}4H=Z!HS)(DKjt$rUaPhR;f5G}c|OUlyu`rOm=z&+MjoL2Ek
zTm0<?S(1aG3u7V*0|yxxy&56`9^?UGg3jXm`{NgZd#tgfCXi3ak`Q^}S3Z$8%GBqd
zkuUUvQt%0q0~}H5LWukzEf%AKcPk`KP|_f+EfbYaQRvwT7(jpr2@uA1Ll#(CENOsk
z-%9t+Gk^yP;ql2AT=fali@khU9%NyqNPAnJo=tTI+!jNNC6$z|;+wBfwuG`8a#eg<
zVY*V}V|swnP$zrxIp&uVDz%u|&eL``zXild-r>^)e6oN~%J`&=(gmjK2N~YhK_xcK
zEoV5BWBb;K=H{^+EtW(wWXLTdS4FOhvL)n}sIMf1VICJdydZX>U~@QG{;*1X#WjC)
zr1dbuM}d?FAAx%5Xv>qN8EFR2i(h1**=X>G)oOfg_U7?X#32k3>qH~N`C9QvE@}^n
zGhqY6++vD;yw#&i6Q>Sed3?u6;$N;m{5aHRIk}}XyzB+bjo7>Llo{{)Y8o@oYqL`?
z&lySlkNcO8o-Otluk{V>>wfd%Vbe(Bf8CuZo#-Fld&_&*ZX~f0KLJ#yHcZ$RnzjG{
N002ovPDHLkV1g<!GM4}V

diff --git a/chrome/content/zotero-platform/win/overlay.css b/chrome/content/zotero-platform/win/overlay.css
index 73eb1ff8b..ea5c06a21 100644
--- a/chrome/content/zotero-platform/win/overlay.css
+++ b/chrome/content/zotero-platform/win/overlay.css
@@ -100,6 +100,16 @@
 }
 /* End toolbar buttons */
 
+@media (min-resolution: 1dppx) {
+	#zotero-toolbar .toolbarbutton-icon {
+		width: 16px;
+	}
+	
+	#zotero-tb-sync > .toolbarbutton-icon {
+		width: 20px;
+	}
+}
+
 #zotero-tb-search-menu-button {
 	margin: 0 -1px 0 -4px;
 	border: 0;
diff --git a/chrome/content/zotero-platform/win/treesource-collection.png b/chrome/content/zotero-platform/win/treesource-collection.png
deleted file mode 100644
index 784e8fa48234f4f64b6922a6758f254ee0ca08ec..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 537
zcmV+!0_OdRP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzt4TybR5;7U
zle>x(K@^6+>g^d@v4;gkbWsEoXE%32*i1tcpTNXd5CcIl)ECgqz|2rE6EW}s7R?kl
za1q`0GCkMruC6-2LANtwVlsgzsp4?{@7$`KBv!G66>Vie3h?3OmEEkjwdLG0PgLVi
z`!N((f$A@n17Ldj#`};0I3@iHJ5M{#IZz|UIYRm4(!uV7eYIYIwQf&}_2J~}>pQ^n
z6o8--^T(=hkBNQ_k{-_GWE<Dm*nZeW0t{q;aLLKDA7AX;UjS;C$UM<^kqJBcOg%kd
za`=W$b`Dg7d87aY^8Vc}vWxQ>;FMW7!p}f{N<AKt_ivG%+H4#CQ-PWa(shVQx&YJ(
z>G3nHZ{D5<3d8&tLh%a4AqqnjMkr3m&fkMdECD3N5}Unig5wy40;>lo4j~k+e}v)`
zR6)J8Mk*u=SpB`p6o)7j?S0T@9?bz#m@l>gc*zk__|*!FMcHwP!gwLJvS~9c0px8E
zW<O8VlWvaXiPQnhL8noy0FRR9bV($ZrR1$z0Ltpo-jkc#i0e4=f4*G-?ybl4tXbgy
b{*Au@zK9=x;oF){00000NkvXXu0mjfJ%;Z&

diff --git a/chrome/content/zotero-platform/win/treesource-search.png b/chrome/content/zotero-platform/win/treesource-search.png
deleted file mode 100644
index 0ba939184d5e2257e380004ed799f00f66a49277..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 679
zcmV;Y0$BZtP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!IY~r8R2Uhh
z!97S-VF1VB-+S(Rk5}`Uq1M$1(Z$;rv?K@)K|xS0ZB5lsEzZ%_$5?YvQxP;Z1`!cO
zGzNjxU>|B!lwB?F)%&66ocFx{jBe!85I&EQ#75Y65B5(Mx_0d{Cg3j-*JeIvt~v(9
ztY`S8F>>s+V~sTmN;}4H=Z!HS)(DKjt$rUaPhR;f5G}c|OUlyu`rOm=z&+MjoL2Ek
zTm0<?S(1aG3u7V*0|yxxy&56`9^?UGg3jXm`{NgZd#tgfCXi3ak`Q^}S3Z$8%GBqd
zkuUUvQt%0q0~}H5LWukzEf%AKcPk`KP|_f+EfbYaQRvwT7(jpr2@uA1Ll#(CENOsk
z-%9t+Gk^yP;ql2AT=fali@khU9%NyqNPAnJo=tTI+!jNNC6$z|;+wBfwuG`8a#eg<
zVY*V}V|swnP$zrxIp&uVDz%u|&eL``zXild-r>^)e6oN~%J`&=(gmjK2N~YhK_xcK
zEoV5BWBb;K=H{^+EtW(wWXLTdS4FOhvL)n}sIMf1VICJdydZX>U~@QG{;*1X#WjC)
zr1dbuM}d?FAAx%5Xv>qN8EFR2i(h1**=X>G)oOfg_U7?X#32k3>qH~N`C9QvE@}^n
zGhqY6++vD;yw#&i6Q>Sed3?u6;$N;m{5aHRIk}}XyzB+bjo7>Llo{{)Y8o@oYqL`?
z&lySlkNcO8o-Otluk{V>>wfd%Vbe(Bf8CuZo#-Fld&_&*ZX~f0KLJ#yHcZ$RnzjG{
N002ovPDHLkV1g<!GM4}V

diff --git a/chrome/content/zotero/about.xul b/chrome/content/zotero/about.xul
index 08906ccd8..6f63f2e12 100644
--- a/chrome/content/zotero/about.xul
+++ b/chrome/content/zotero/about.xul
@@ -61,6 +61,7 @@
 					<label class="zotero-text-link" href="http://p.yusukekamiyamane.com/" value="Fugue icons (by Yusuke Kamiyamane)"/>
 					<label class="zotero-text-link" href="http://www.davidashen.net/rnv.html" value="RNV (CSL validation)"/>
 					<label class="zotero-text-link" href="http://documentup.com/kriskowal/q/" value="Q (by Kristopher Michael Kowal)"/>
+					<label class="zotero-text-link" href="https://codefisher.org/pastel-svg/" value="Pastel SVG icons (by Michael Buckley)"/>
 					<label class="zotero-text-link" href="http://www.famfamfam.com/lab/icons/silk/" value="Silk icons (by Mark James)"/>
 					<label class="zotero-text-link" href="http://simile.mit.edu/timeline/" value="SIMILE Project (Timeline)"/>
 					<label class="zotero-text-link" href="http://www.w3.org/2005/ajar/tab" value="Tabulator (RDF parser)"/>
diff --git a/chrome/content/zotero/browser.js b/chrome/content/zotero/browser.js
index 59e3859ea..518f21b0d 100644
--- a/chrome/content/zotero/browser.js
+++ b/chrome/content/zotero/browser.js
@@ -907,7 +907,7 @@ Zotero_Browser.Tab.prototype.getCaptureIcon = function (hiDPI) {
 	case this.CAPTURE_STATE_TRANSLATABLE:
 		var itemType = this.page.translators[0].itemType;
 		return (itemType === "multiple"
-				? "chrome://zotero/skin/treesource-collection.png"
+				? "chrome://zotero/skin/treesource-collection" + suffix + ".png"
 				: Zotero.ItemTypes.getImageSrc(itemType));
 	
 	// TODO: Show icons for images, PDFs, etc.?
diff --git a/chrome/content/zotero/xpcom/collectionTreeView.js b/chrome/content/zotero/xpcom/collectionTreeView.js
index 860a1b154..6e26a863e 100644
--- a/chrome/content/zotero/xpcom/collectionTreeView.js
+++ b/chrome/content/zotero/xpcom/collectionTreeView.js
@@ -421,6 +421,8 @@ Zotero.CollectionTreeView.prototype.getCellText = function(row, column)
 
 Zotero.CollectionTreeView.prototype.getImageSrc = function(row, col)
 {
+	var suffix = Zotero.hiDPI ? "@2x" : "";
+	
 	var itemGroup = this._getItemAtRow(row);
 	var collectionType = itemGroup.type;
 	
@@ -458,10 +460,13 @@ Zotero.CollectionTreeView.prototype.getImageSrc = function(row, col)
 		
 		case 'collection':
 		case 'search':
-			return "chrome://zotero-platform/content/treesource-" + collectionType + ".png";
+			if (Zotero.isMac) {
+				return "chrome://zotero-platform/content/treesource-" + collectionType + ".png";
+			}
+			break;
 	}
 	
-	return "chrome://zotero/skin/treesource-" + collectionType + ".png";
+	return "chrome://zotero/skin/treesource-" + collectionType + suffix + ".png";
 }
 
 Zotero.CollectionTreeView.prototype.isContainer = function(row)
diff --git a/chrome/content/zotero/xpcom/data/cachedTypes.js b/chrome/content/zotero/xpcom/data/cachedTypes.js
index 43c1f7f06..774ec6019 100644
--- a/chrome/content/zotero/xpcom/data/cachedTypes.js
+++ b/chrome/content/zotero/xpcom/data/cachedTypes.js
@@ -323,6 +323,8 @@ Zotero.ItemTypes = new function() {
 	}
 	
 	function getImageSrc(itemType) {
+		var suffix = Zotero.hiDPI ? "@2x" : "";
+		
 		if (this.isCustom(itemType)) {
 			var id = this.getID(itemType) - this.customIDOffset;
 			if (_customImages[id]) {
@@ -337,50 +339,57 @@ Zotero.ItemTypes = new function() {
 		}
 		
 		switch (itemType) {
+			// Use treeitem.png
 			case 'attachment-file':
+			case 'document':
+				break;
+			
+			// HiDPI images available
 			case 'attachment-link':
-			case 'attachment-snapshot':
 			case 'attachment-web-link':
-			case 'attachment-pdf':
 			case 'artwork':
 			case 'audioRecording':
 			case 'bill':
-			case 'blogPost':
 			case 'book':
 			case 'bookSection':
-			case 'case':
 			case 'computerProgram':
-			case 'conferencePaper':
-			case 'dictionaryEntry':
-			case 'document':
-			case 'email':
-			case 'encyclopediaArticle':
 			case 'film':
-			case 'forumPost':
-			case 'hearing':
 			case 'instantMessage':
 			case 'interview':
 			case 'journalArticle':
 			case 'letter':
 			case 'magazineArticle':
-			case 'manuscript':
-			case 'map':
 			case 'newspaperArticle':
 			case 'note':
+			case 'report':
+			case 'webpage':
+				return "chrome://zotero/skin/treeitem-" + itemType + suffix + ".png";
+			
+			// No HiDPI images available
+			case 'attachment-snapshot':
+			case 'attachment-pdf':
+			case 'blogPost':
+			case 'case':
+			case 'conferencePaper':
+			case 'dictionaryEntry':
+			case 'email':
+			case 'encyclopediaArticle':
+			case 'forumPost':
+			case 'hearing':
+			case 'manuscript':
+			case 'map':
 			case 'patent':
 			case 'podcast':
 			case 'presentation':
 			case 'radioBroadcast':
-			case 'report':
 			case 'statute':
 			case 'thesis':
 			case 'tvBroadcast':
 			case 'videoRecording':
-			case 'webpage':
 				return "chrome://zotero/skin/treeitem-" + itemType + ".png";
 		}
 		
-		return "chrome://zotero/skin/treeitem.png";
+		return "chrome://zotero/skin/treeitem" + suffix + ".png";
 	}
 }
 
diff --git a/chrome/content/zotero/xpcom/data/tags.js b/chrome/content/zotero/xpcom/data/tags.js
index a8b8949cc..790b4b880 100644
--- a/chrome/content/zotero/xpcom/data/tags.js
+++ b/chrome/content/zotero/xpcom/data/tags.js
@@ -667,12 +667,14 @@ Zotero.Tags = new function() {
 	 * @return {Q Promise} A Q promise for a data: URL for a PNG
 	 */
 	this.generateItemsListImage = function (colors, extraImage) {
-		var swatchWidth = 8;
-		var separator = 3;
-		var extraImageSeparator = 1;
-		var extraImageWidth = 16;
-		var canvasHeight = 16;
-		var swatchHeight = 8;
+		var multiplier = (extraImage && extraImage.indexOf('2x') != -1) ? 2 : 1;
+		
+		var swatchWidth = 8 * multiplier;
+		var separator = 3 * multiplier;
+		var extraImageSeparator = 1 * multiplier;
+		var extraImageWidth = 16 * multiplier;
+		var canvasHeight = 16 * multiplier;
+		var swatchHeight = 8 * multiplier;
 		var prependExtraImage = true;
 		
 		var hash = colors.join("") + (extraImage ? extraImage : "");
diff --git a/chrome/skin/default/zotero/arrow_refresh@2x.png b/chrome/skin/default/zotero/arrow_refresh@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..b1a811509c5279a907f870ebb490e0c9273c2caa
GIT binary patch
literal 1234
zcmV;@1TFiCP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60
z0RN!9r;`8x1cymPK~z|U#g<=8TXhu2zxUn_h6vaWCM<Miqf=*O?tw_Q_+a=mgKo@a
zi`nKhChGhXUobJ?gQL7S79C>Z_Fy!|7-M`eZo>_?MMjo5WQJskn`D$0vhin=4ip$L
z%I|!AfLq(r-WG!Kmo(|U_jk|dd(J(-a}KafYyUU9YL@bzzFYzbHthYn%JcsT5CO@$
z=fB*(C=tsifP{0E3j)^d`Qn+RMQBzJ4}O0jPZ_~oN@OPqCxtl_W|M>nLDKXbB1CCX
z8GN^V@DKW+h}x3}TaGMAz$+&YxB>M6DZ44ug#=~(7Y9xfrJKq?5WYb_d;>ioS%2!y
zbC%IqAmFuA`*sWQ6)EXD4CJJ*h9lj9jFlMx0mHD(!9joofzUNUkN`pS^moHQ;D=CZ
zPruz7Hxfn!ym{X{LVOM~B|p=Njk%8@`~GaCtw@8e8PIh7Ul<95!$Tqfkg#Vupp?Ss
z*l4-?Y1eemPkq0{5?~93y?NhrBKT0(H0{v`Hz6x6E6mF%PZPk+dp5%c3L%8u@)Nvz
z=7oF)<qwb<MR|`SbEP$W?im)q=Y-AO>mBUH^}g#6^2pihw%T|CYyiNZ93~~hWiJT9
zO=Hu+d*~bP!^rp@+`TsumVli1&P+~0d2vMqoMipk>NZb2H~`pQ{$XzcDf?56RODwl
zBjCg10bConirHW=D*G40%@Y#kxg{I`Y=+LAqNwND*8rLp3hCI?7_Q#@9ZJoD<PD{y
zdc}->@!Qvb48$_@?5AZ+HtZ1sL|7>#9QS2M953JPo)FwHWb=0~ogTF^MB$?0rhxSn
zqQl=Fv&bkV)rsJyfW^WAK&LR*s>02PaXuMCOMwFkdO^Ik<9J0)^IPW=*7-_LN#>+Y
z`#V;`&R>r&x*P5|UQr_=4aw}CGO*184hjctiOnp8Q<!k?7S9%kP#T4VJ<EZT;wM6d
zZQ||(S}$AxNq^D;Ot>r8h2H+&xce$SC7IJUR49>;g>>qghK&zB98sc&hHjZTb|$GD
z2#33!8*uK@*|;q^yhs_kfz3smk-aJ#W{FlZi=SIBU~+Ow8Nzi5BT#j$+@nP5Ot{rN
zV8T;UQ?Ytg4hq*5A|)j?1Sbfu*N4f;DG>bZx5leCEh7-^d3dv#{};bGh3zrJKO6|)
zQhPfn9MhG0q_e4ODDEk!I#%w9hDRG-(2lL(!^7z4xC{zs3ALxQscQ%bn+KwoB34oe
zn;v5Vih=?0XM>s9AiBG|(c|-hLLt?=R~oxQ#m({)R5q11kW%Ab>qfzvf{2kT+|%$3
z7Yb%(f*AR01b^PXjsE@t%*=Ju2`csCm8Px};f#c*VB68BJfzfZSnEbX{yGpuOIu6a
zmK<Y%ou<eqx)%JX^Jw>iPHM!0hA-c_zP9xh&a}X2;7O9OKVXN~@3n&8qwogE%On~N
zP2T7{dhNte`<=;H_LJ@frH8jR2w79;DumbP#l=G%OX?%hE9qX)`rf5lDAs#@UI-JH
w;$;^A0B!I8>JhR&nO^XpuC0fPJ<Db5A3ei!<_lBf(EtDd07*qoM6N<$f>-EEod5s;

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/arrow_rotate_error.png b/chrome/skin/default/zotero/arrow_rotate_error.png
deleted file mode 100644
index dce1f80083beb75965b03fdbe50b5401b21c14bb..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 843
zcmV-R1GM~!P)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%00001b5ch_0Itp)
z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOK4
z5g#jYJ>Pc#00PTNL_t(I%k7lOOVn`~#-H!|UB=0AoT(;DMaL~S%yv6SBt;ukL`BhZ
zsGy>tg$P=RJoFzFM9`r_K?|Z1deSZi9ik$Tq;<5hanyb_mCg2BzFjgRY^F=Mp6mNQ
zA6|H$_XYkdo0guL|7FS9M&F<6lnu~utcDhxYWUg5B{y?&T%VR*Sm2(jpJjp-uba&S
z^)vT#;)l4Tc|^oYN=ivdfl*^rM?z86fBA*=SHOnjwMBySwqRMXsXQ2j*P9Ox0uhHK
zj@RKgh{i@zVjB0i?deWT`ovVQ{Q5j5h3KfQtyxrEH5X|+4MhS(9K<*j7m!Lq2<~!w
zT+XlFDS_qdN{>}klrO5Ts%D%Bx!i+Sp_dr>5J72SDU_6m#-adYGjD8ePi0+-l;TKb
zStTrOLfa1RKkT(fjL7ZbrxEUoM;ta01{3hM?dvjr_f9#XP@>Z3^?@;9aClHlB`<a#
z?QI?JX%4<~RZ!5SdeUPLJ$HexS!1*Q`bv^YLJ)@}2_>Z#ivJiru)D5mn|2kfSk>he
z4({#T{`o-nZX+YmjHO8_`8<(Kz|jtZbIM2vajx~&+RK)w?v!K47~>XJ2Wr&Hf;unf
z^f4n)YiOy&rT62*@Tgqms%co$*dm%|6&>*vFZUV)9WVykF{8K%fzKiBCVe#{u;)ad
z?Jvu_7X38xXlQ&0oH%CNF)S`z0^;8Q$AFVIKomx!zg{04?0=GV%QrW6TGB1IgvQ@K
z36BjpmF7p}7B<12c!0bDFLHctIPu5GFR3B$=_enZ_xZEl@|`{R!aH_tSiCS9>MSa1
z(N6Liv^fSdo&aMS+Wrb8`Y?Uo))poMJ2J**Qk&R*9qrj!E6B~Pgn||u;4T0h%ZBCH
zFyk6v%uUjN7{HaRKmbS?{U;OA)3Y4QhHcug(-zE$B+~H|tZylpNfUP39Q$Yg@;kMl
V0B0o*;p6}S002ovPDHLkV1j)Ld#C^a

diff --git a/chrome/skin/default/zotero/attach@2x.png b/chrome/skin/default/zotero/attach@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..a54f95b4ec6b34204ed59d571dcfbd6987bcbad8
GIT binary patch
literal 884
zcmX|9Ye<t}7@ZBlM)Q)HON~rH10hmNGB9sjHC;n=7u@Ey=KSVmx_O!A<;PH`csEVL
zKX#j#5JG~OA)!c4Q*cfcOQ)2iGEl3{(wx@GfiHZ|_q^vh=RD8*eqUV@`!1E@Lm`n!
zROUT;GT#3G9~UwrU0**=B004su{aED3knKSQ&SO<bGh8SygZRel$n_+kw_dRjYgA|
zl?9GaC{!wyz){W3%@rRn&hbi5PnSxi1VMmMTwKiK@sNWLRd#l^OeTW^2rvhZDq6_p
zav<pF=!Gquv4tO>&j$z<2x)0)kRV4y4lQ!{pd%tiKm@4OYB8-!rGf)yfIku-s3O7*
zOgO03>YSV$hanu$6k2c~$<NOR4jP2uC=`m5888M6F_;4f`NRZ$1p)zlFcs#99H#~!
zIZgp{xFJDAYvAz2g#f|L;5cXvA>=1_`@MkJ!j~v5N@k~!F77Wok&oDV``7z{PwaxD
zy>6X|`KYql#f|INaly29O&9*zMyb*C->kO=?rpg>yzOl=)*O~OCsb7)RKMp>w73{e
z?D^DI^@{nUz%(Ae;8W+<wtl&Fk>0)->EE+H67#rIza4VWa;k{1|1$lInfk=@3iIWM
zOorkYp)u*PoQL8MMh2f8damY6qBD(CKcJ&nwvSg^BWHhgxyH;2imIjV1T`prm_7G|
zj3u*d@NDhGT=IleH{$tPz9_MHl<w;TN_ge0C>qyt-Zw7eYN1LqT6R!U+Z(*(QA`&1
z1&0|dfw!N>cPs?hI1RTv3?Y$SUe-RJ^#Re$oA^t)$~aZTQS^4t(z7OFBZGM5Oo(Z#
z<;L>egF^k&Ew`ksE0ZspH!F%78ztkz)d?w^a}nl|Go6|c>$JDgy6c)4`@4U*|J|K#
zk&Rk4MifmAdAc6{>6(2YiPVn0Tx(CUg*T54Rg8*lvaYdt&EELw!IJ4AbF|UWqi8bE
l?0mc7KD)9KYcy<l+xgM<>nyXoMEn;Yio|5F>3wn1%6}9pgVg{4

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/bindings/attachmentbox.css b/chrome/skin/default/zotero/bindings/attachmentbox.css
index 71cbe9a98..22093505b 100644
--- a/chrome/skin/default/zotero/bindings/attachmentbox.css
+++ b/chrome/skin/default/zotero/bindings/attachmentbox.css
@@ -24,6 +24,13 @@
 	list-style-image: url(chrome://zotero/skin/arrow_refresh.png);
 }
 
+@media (min-resolution: 1.5dppx) {
+	#reindex {
+		list-style-image: url(chrome://zotero/skin/arrow_refresh@2x.png);
+		width: 20px;
+	}
+}
+
 #index-box > button
 {
 	font-size: .95em;
diff --git a/chrome/skin/default/zotero/cog@2x.png b/chrome/skin/default/zotero/cog@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..9c07e6cdc552ceff7b100b3893b26212093bcfcc
GIT binary patch
literal 1341
zcmV-D1;YA?P)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU$-$_J4RCwC7Rb5P*WfVUBhgQ0l(lQ7m
z8Ot<_*)&mRf{JE9iZonI9b8N!;ci5#(W?<6fsp8hQ7ndRSF%kBXmlYY9UUz(M!4EC
zm={ZdVa8Zk_-QMD?bkx<dEW2)x{he#jbC#5o}QoQyzhC>Ij<&@$<Y7#>G9Lp*hm_U
zhIBfepxjTZ)na*z$<Aa}#JfyUrW@&W`YHSU{e3~$_}JK(9N@tBGSf>;lWaJz$jS!?
z2YbzCvrVAy?#5bLS~^ug-qdks&oJF)y7kls4}e#)L*?-B@FiYr`Ty}$Dg_X2JRUDv
zSXj`5z(WQdY+$SSR08AQ0-T1y(9qC8I2<Od{J)Nm+QzE}V7UaDqN_XLg8-*hP#94|
zLj(8^2L=ZEqtR$KVnsy-_48L>U;k!FNy$k`l7!r3GSSM)${*w7<G;4^x45{N^|9OS
z)YjJ4&g{2-zh4gEcDtc_mdV}U@AIiaj7AeV9EE~67>wBhK;BcSq~JF;B9u%@S@8CD
zub0^X(_A1BkT02Y%3#Jhoan-ZwvYSzzV6%E*<nyUp-MJ4H)&~UiPXRVDlac5tJNxO
zBq>1_i-q9J)p!%&$z<}$9biWY!YK%IezjMxUK@aeMx&+s_ZR8Tof#3RxVTslc*vlG
z4Q$~9Utj<WnAtwyG`-EsQB_!7{rVf*+uI@y%gYa`pr9Z*Iy(B>#6<8O^mTQ$Cp;cc
zHS3H9gHEImK2uXuxQtJg>-dxD7ZG4@Z?DMb`{p9=#G$4P7rL_YSnSU4zcDd5c;!3v
z2K3CI;hjtM^==PrN=r*|vga>fzVs#ZoZbzu_oI$%iuh<&-i2*$Zk|Bv>+7Nv<M9OF
zO&*0pAv8}=>0VF}GU#9fTllE{zyfAAMSKD+@~XCdI-MbmD2xe{$;_*6|KQAmOx8t(
zEqtE%rv+y23Ap=r|FYW)36!62VMjf$W^q|fP3K==vnmc^1%ZbQI@rjz7E=9z1<dRT
z_)ny@wY5*(U3Yiy`6EZlpK~}|w6?ZN&CTz5I31ahk!vTRZ*G3S^6c4nJ>l>yIh`(?
zh8{gy3U_sN{*ZIXNVb#Fv1+;U*Hu;Z+EK6flMnLp%oK^N)7I7&9Xob{3JYDbXJnO2
z^d72<Wkr-o?2^y-)s^Y#-%&Z;YD1#KMS!xhGD2hM_4-rXDDU|F!Ou_~Hk(5^@(!Qm
zF^(=Ad8+cx5A$l_=8I4)wm~H&hk4}G_AuVhod3JrxLo4Pasa2(iTB_X`<@GhraRTy
zVm3cRE|-fhI$wb5^#+oQA|--JQk+&-SDD|=&aRr8s$OP)V%)oHYisf)<JLJnP1mpA
z?0oRxA<rCxAb|GtbbLQMdwV_>iwZChc*vlGjcN~HU;s<4C~*RtO}ryD%+~}0(-$#w
zFmK%Ms?XIMQ|0O``X`+#=WK*n9E!za@(IwjoVO51ovf{W<%^;sCt>CPKXT9x%zm9t
zPr0PL2OY3E;4=v<b+n5zO(YWH58r-}FIrPw{i2qgN7!&i9@PeIA|b^N9kLh5_R<z!
zG{tX*eMs>Ecu<{b*%WCo5{WEKXrcn;ao4Cu9N<;9u_`uV+_2v!_s>*L-6QEcOq&YD
z*(Rd~0GJVvm9iRg1N_GivjmTTq|hD${4Kx$$#4lKJWhri00000NkvXXu0mjfQ|Xk6

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/control_stop_blue@2x.png b/chrome/skin/default/zotero/control_stop_blue@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..6e7409a4ace02da5114adbb5908c0c565089860b
GIT binary patch
literal 1962
zcmV;b2UYlqP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000MZNkl<ZcwU{C
zU2I%O703TGckajT-Sw`$j@OP|f8<L}8@WnC+9FDEOP>f;Kzs-Zo)HqXJR$K=spbLk
z5Kv3is)z?(kw6p?3RSBFMFi3+#7XKTBzE088{6^sZoD6N_kPR_JEN>ti{nk>k*<#J
zow@TnGjq<Fa|j;Pq$J}%gW-3;3<6m3I4nV65&_06PymPm2uTr9iO};9SQY}ii16$y
z;2=b{1GG_~4xWIKcVVY&#3e_P0Ugpnk{ED7;6Q@in<auoO>$HyP~-$f>Z6pGsCHH0
zpPc{)i2UpdOh`HmSUufv;{=@|LJu>LJ<`2#^iXE=$!@E<&muw6W;`xsog7lH%8k-$
z)tS9n%6vFg*fkjmtPp}VPol88j>;_{zyuKwR^SiP7|X$N4Wu0hy@tfl@!`c2N4hp%
zaLuq&0fi7ya=WJ-vizld&tK21?mdMFxf;iEh2!qj5Nh}~;oB*o;p1zF)dF-|CI%nR
zY(D+<k%gC1rk_;+#u!qm6goRQVObVT)6~EyicqW7u(7d$wY4?)zOTO*d~5l=wb5Ts
zmoxtk1#Vje8)tW+s+73zwvU~Z?)a;6_)BlfXHUMf{F@6GF9(y8lk)1-t1_R@%g@q;
z5OQT@MV>!@UY<UETE6@Knc$V*&%QPOmK=ZX4LPJ3iq*OUkYsoQc3%fFriH!F53GIT
z_~7D?AO%gQ(-<Be2Bj1dfFE$wLV+;4x8-^g0>%hpmI242dQ#3gu3fu^)zwvS0dZ!1
z|LYewhyN4`e7d-S{H+Q20FgxVzc0<B2at-H7<!`j?pMCEFZZ$mZuRu^U|?VX05r5*
zjlhKhLpLp?lFdd5kaC$)Mk_coGlRLgIfR1xr&b@In66~s_krAnDHQQr5)wd?v6F~*
z#nH!rv7a8k{zj+m_o;Ip85z-_QXTC1901zEHL%f_a2V1q)9+WVT)~|?cTfmpi@#fV
z_Qfi})ryCush_~3%GXmN;xs}}-P*sV;L5lL2M2cyhlJj(yOmJ)9XfPK8*R#{^go@x
zal(?=Wz?Cdv#E-3B#8uN=sl9jA6FCY-n|=!VZaZ?j^GVZ@;Iu2(B3mTI;zKwy7ONp
z6xn2*IZ$U)6<#St>R5K;n9G7LrD-OUQ9!l&9m1RA3guA$-{0R4$8ivYmwD95ea?{R
z=w~pQj_viAgQ>z(QcCUT0MzR5Yj8h!^&bs%i%9o8qUF!OyB`ouCBsOd8gRsI1HHYy
zn4O))h;!%j*K0%XSrKd+MX(r!+wIi$2qDl^fVWwB3%unk1yQo4yK#)ltJEUXq_`Ix
z2|-{oVu4ACm_x!2)oI(dMg)<3Xt<WGN7L9%E#vVxG=qj6AaIDO%tL|#V73vts#AG@
zYC_8Uz_ATnZr81QIM@A%#bR0kCjA5`7!#lrO^x*fv^BW4@aCAUySE*OMg#%`kr&d6
z0t7*z0R|yk;b;$Ul3L-0K{TvdtwJ-TRfa$mQ3xgjM8v80aaxKSGOcbkwN=a@2)W$i
zY7J{|MK@vcJ}b8js%5!c)^k<4Q6vOa#iooQ;6QoVi_IudKA+bB$1>Xc`Br$tc3R--
z)phh-IvgucEAZ5e%AQOM0Sf>>9-(-1v-^XC9qV6SUth<bJ$v-6rWB8OEBqJVJJ1BQ
zDyZR7w8FKIJBA*&u&|)zTsUx^0!7b9z*dq72FoaZRM>Ut`Rr^y&Z}KZOG`Q&r{WCj
zr4W!U7To}}HQGj3SCT2A15l+>fhU}ePyFG_DsNm#AfUH$h$=ox99X`1xA)Il!?`(d
z&h;@Q9o7PP7<f9tbOa2;P~`^tpBw(Zw<X1jVk$Pp1UQoLLV?wPu8zD@2<#<gh*MKj
z3Zn1!M9gRf01txe|GE;UhMqfj4xZ<sB;19Mg0a5`5!O(Kr`QxAa&ifQj8F&(a_=sW
z{;I}}s<H)@Oz4%kCNdqS@{BfquHkx2Hf<r3)NowBd>QIUePLG4)xPk{FhWkTCV`-t
z5kZoDufxg`WK4lQPj=t>=6Gi2MMy!j*(}D!#`N_prH<?Ra`7YO$l4w>)MgYh+kjht
z2!T#i>v<vO=jU}wcA<9owg38$z8yvQbjd(|_NAr*&7{;tEJ4t1*%&#Jo<IIf=kyOv
z62wf?RGy(TBuXjTG;KT6)6=+d<A%<Z17Ujq@ejXwGu;2TFvMKd!TRJ9YN|%qnwEb{
z8jn4OSgIQti{O#{?#dUR>%9Ks1og6wi%RWCUtb?w*VO^55#dUu5*8O1ar^e|M#Mvj
z$Cp2-9(!#*9QapgVZK<z#?%GW@JGV8D@?Q!V^7>GObqmbVd$Ck^%Do<3oqEHcD5@>
z8U>3doWjTc$f=9r;lF?*=SwV?YS?VRcU+nsaB@dSoTaC_*ycW)1St!CQUQHol`5QV
z7I^C8T-5*JC$*7F%B^*2wu!=Ou%$HHd2vcjbVwla|HY|_?GUI)fz6Pk#5jsOEKb{(
w=e7Y`CSb-mSR_FKfDwqQfry0&9=1IH9|aBh>iaitp#T5?07*qoM6N<$f>9&5X8-^I

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/error@2x.png b/chrome/skin/default/zotero/error@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..354aa99b264cb30ea83cbb2a707ee6803886a221
GIT binary patch
literal 1254
zcmV<C1R48@P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60
z0RN!9r;`8x1e-}jK~z|U)t75*6jc<*fA`MpgLbyC+m`JX3lz$$1zJiBk5Xu(Mhuz&
znh1$XjX+{bq={NV6KFyufJ7ylXd)j3P4Ek-NqJ}>)h`lIi6DsD@KPhMSo+xFPIu;B
zKWr`3cIgXH&zG4w^S}S|J0~-9Gw^?oAGVF!bMlRx-GlLv11|p7=!L){VDX8q*$eL~
zKz&V_i4Yrw=|`G=1oGAT8qB)}5DEXXLcpX@;gh5nJq76e;E>4jfq04jE;zn(YO24j
ztwDIwBDqWJKnognJb)9uc2P@rT;YqC+xp|z?+N(r*lHjWDta2}wJ>}Z8Pk`e(GeV;
z>#twG08a0im@c%gHmxj%O<vNOPcM7|PauNUymVyai1a%KU^;3oFf>%W5@Gl{^TPBo
zd{!mEP_JXJxg!8)b{32TQRy8vhO}{y0HEv(DEk5c!Ggv3Lt_y_tU6j7%DL?TXtf^j
zhl-yCVF2JXenPzQV*rFO2$xo&!7m-T{<Z=%yq{lyW|=>83aO*Y0Z`XZq3p9L`z-GD
zQveJdKcCd>A_ThPSWPIuFW!Cnct|O0QLYgzuI$KY4!^VNCPgK4p05W4S!LC<ez3$)
zidtZCuim{0&hMH$Tc8*EBQqHiE(XAje$!3oM2`VrjhsQ+m{LG5I<ht}YtR5%i%keg
zXj(_d+QDhs+Z~{(4zvS6q`Vr0KuEc1PypvYn(~m)l&0jA;|=Bk;6}efJB{5zokpDK
zVE|IHCKJqG05JFHnzZ=?0?;)`f!Hjh$*`#_6FFt$G#yB4<}`f<$_602>;;73L8CY8
zn&fqo-uSJcXelryHTPjWR^qjGTfacN(WC&{ZN+K%5&&O%E*aAv2gKB)(bOf$*7OL_
zurJT21+~KTlQyZM!@Lc*<xtY%e}~(A2<;~JqwKOOq{ojI)Sjxr+h>3jJ8cD;(bm|<
zFot9R;Ite>t5~l9TE%di4+7u`gbB}n1`xT;Eh#H{(s$dAuYOt*u-!k;U|5;q`*$Hd
z7TRqh_WK5ej)P9NG;u97AUybTUO|{a+*k|8Uz<sLYvWaAULQMW3$3@DfK99l$PDBy
zMS3g%;>`y@$9wJm#u(zbO`ii`_|wRmTM3XUZ2#(8PT<m>*~49<{fzXaTbbn_A`CAo
zehK^HCO{>`9TWI=_xD|lraxMEV*(w$`R-YR@P<)NjPJITVE^%JE4G<e@^17>&l51?
zYXQp|zYJj{o*AckFQEF~eP<|~Yx@&LOg|&;s{#mUZ`bX*a{`y^?j57FI4x6hycu)0
zgODiuJoe?+yNdhr40MLXJE98d8--Rb$G6U-?c$H^O3R7!-j1D1C_1&qI>2j<s{oNm
z$D8YJt~h|uIF0)fVA3Gx!D;}nQ1NwLu&?efnc!;oq#2lC24`&Rp}U?_iFDE%J@9Bw
zyg8qib6-0m?i7^1$IlW#OEv(el~<9x((MQ#7`fnO0MnIn1Aw?vKP!)R@so0u)UHA)
zg?1InO&qnW6X)vY+>P_@di4*zPNrAdQ4^$a%yI_ti#CXmLQ?)O)cudeUnIZSy1(>>
QzW@LL07*qoM6N<$f@hOhL;wH)

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/exclamation@2x.png b/chrome/skin/default/zotero/exclamation@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..e0574d61b7e25f992058c110998fe88bfe41e007
GIT binary patch
literal 1366
zcmV-c1*!UpP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000FYNkl<ZcwX(7
zOKeot8^C|(&hybh3w=H)Ev6NbqC6^KK|%~GqA50w2#IThV)$?Vi7tS!aAyJ=*2aht
zArgoyBNz#URuFBWDAGcqkC{?RaY|>}>AmN(oV2mc?X^Q#>X%Hu#mPOt-+9bA-{D^$
ziX1~g-T&W?H6qd|N^b#G04%};L%<-4vzC%m1)m<jqCj#I$OW9-+uWq!An*dYMTbK6
z6&*Tp(nBOSf#e6x)#BqANIigxL<p5t5-2Ih7mK4pApm5296g#Mo9JUa(Su|%Ohqfo
zzoYcfSKUu6(6^`Q4W&2=#I0zI=(0M(OKQOSM`uK9#=AR7|K5(yqybWvQoBkHpZGRs
zfyAEen>Fe?AQ-A#N__POl+OoR<J{}V8R$ok3?o?^1SH_Y%6k@naT)&73a~81aTvLB
zk@35?0J6$rYuVv%&dn>(^I=nsa&#+@AE{kV-paKA=t;1Bv%`!E5k$bi5lj}7Ard3B
zY{jHVIRKB^E|IzU8^8k*XWil>r#n3b1XS<t##W#{Tv^S6wG9B+UDt7XZW-t_{FzTa
zV`dEh|J_;bfvV>SFRue2_0xIAdb<H>sW@`#)tMX9Vn+17_vTI!skb6g;xDfQV50My
z3y$E5+3mu_?M}uz+5w2KT89cp5n+AL?#3MeE&(}kz|zQm5l!rcm1fQLU;^FS?ShNT
zU^bkol)c@Bo$N>X{p2mLLqsFm+5ed361dZMX}yTlSm6kfiYl-j?9S_R!@Xx<_H1Y&
zbF~ezZNlZ%Q?nq?cMtshic3H%wuuO#vc&-Cp#*v?<FVnq4BSiMjHa=Z36z3xX@&V#
z*|N<gfXF5zP*i3B&ftJI+|75vXNqSN{RSK?Dm7W-Y-B3@GX%;7@I~XG1^wtxPq;|#
za5I?UhoA+2G;Rcd3YUP06boPlLm2z9tS8)U;0;H>nOaIK9GVs=aS3QWy@=ZUKs@1Y
zKAvzvP^L|TqY*6z=l&aNNt*Q;OJg9xpeNjI;0;GGmlh&8W9jL(q+0-;5D_L)DbRuy
ziRTUnPq+y9<IjK=>{JRdqPidVCghADo6?D1!bPQ63kzT{>4s0G`+IkJPdl^4{l&!w
zoKEzZEXY}xfDNZDkpt=eyX4oc!k1rwIXKdza~?7UhmJBc2Ht;XPPi4zBUn_3Xq(YQ
zuMx0BpLQ+5^3T8jRkU<WOae!`Zh}By@lqGuV-wB^7Zj12S`bKe-M}`3k*l>|{Lt<a
zP#~h@V-d~pjdpZ)9AEw-0%euJy!*fn7l>3<5iBe)eLcK!4G|5<M+(IAI_}uHxdnJ7
zQdmOihSyOFvfW)|`+IU-bCW}rmBeamjY#6+88U-O6kJ^X<&O=X*RcZeYkRwh^ri15
zxPR?3h$gsXDdE}|%^@`(T!kaV>*|Qr)PQJ)u3qMGUyu7#mTofe`AV|(=1rTiFeO>E
zsFafWjaY#oqBZu=5ccp8dSnF0R7V)7FE5UN;X(q1g(%BHPh?46I&a`W7ExPQetqs-
z&P8e4+YRdxbrLA?M`J9iT|s=wQk1ghDM}quce;4+M+bH$je>+IdF!QP7h0aUEN^Rm
zty*x70rdd>aD-S%1$o8g1mX(_gku0qWJZ~Il;Y7qAEU`$?6JSga`8DkR(;jd{ZtQ=
zUz%TSQksLPCwZ8teJ`E3@Kg^Iw@6dN8ih0pvIVFFiZH=F;10rB@##~mkGJOhH2W|9
Y0y}xiCs@v8;s5{u07*qoM6N<$f`}u9aR2}S

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/locate-external-viewer@2x.png b/chrome/skin/default/zotero/locate-external-viewer@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..26d913b0ac63038ac3c8d00f744a19c872014bc4
GIT binary patch
literal 901
zcmV;01A6?4P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60
z0RN!9r;`8x13F1WK~z|UwU*6m6iFDyf88<TpcunMjUREnEwaldfy5yJ^(=T0FP>yq
zBvDuJBCPA)_NE8Dh@z4p9z3Wh;z9fa{7PcRL;{h$?3y?s!bpfZiD=UAyNBuO^vrb6
zN6+{SMSXTXPd)Wk)mW^c8Q1}=rha$_%$6F^;4AN}GdaL|K!9u|gOfl~>x6VVooQ-n
z>T&1Y5=Ls*Wt{=AENjE$<mBT-BC!hC4r~h?=PM@xRCU-is460omxq;2o=7AB$Ye4s
zEiIv{^X={J`{(B7mVp^Jc_`_CWm#UbZ9A`Cm`uMxEEXdci(%V#^Tfo&BiD&-g-(>+
zf>LBb$)K^Z(My(Pg^GwIpp=*(0U;s)SXEAd5dmP^HX@SOR@h%Cpa9KoEO@9$fS;tC
zm}*h607Dc+>~G6vvw<h4rKP2I0fw}iEiwIJs9HcJWI_GkT|gyb>L#ERS^upbM3sXb
zzq9YB!)3RjrneyIP7qZb74D8*=HbL((fv?}$PV~L_*dzuAS#F`_s6awA{^{E7W#c%
zUPHeNhWy9Y4n&o^V^_I1em(TtsvYRRnaq*6R*R}v7g?$Q(v}3v;&pn2JFl*=Ccc(K
z-6v`nASyV1(g1Qt6-D`ZYZs0<jHgE!czTX6ON&MGmHa;tgd;b)5ETw|9z_+D+)d~G
z3fmN3O+VvxdK6J5JNs=gbulvlj6j4KFe_dm@Z|;M3tvB@D4pATX>Z$ws1R>$=<7V4
z=r{94*aG*C&$-3S{C_3KD@wd^Egfx192HViFIc^)p|AVghMCd7KKxz101+?vK+BF-
zaXd$C%l6_&MdA>_0Yh%A-n{+?mw=*eS^WBmcx)YtlA0P~box1>%EIjO;G0Vy&qfkp
zBHd3$NbnVri?Z;3dGO7pj{|1DNXJlAx&88L&Q6iyBdNk~y{AxB#%EqKI+a^_-|jy+
zvG?qNf4)ekz)`^w2_<*jQ<9n<V))-D9{KS-e-_PGwF3`M{!_Al&xNgs3aRNKZ{@%C
zoC+k5B%mD3TaY6c`gWfQC5QZ*uoH;YDxl~5#$oeLEWUU00?vnTz&PZ`z+1PYCR9lN
b)>QrnyGg&&oa#+%00000NkvXXu0mjf8%(L6

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/locate-view-online@2x.png b/chrome/skin/default/zotero/locate-view-online@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..850172c0766429e70884a1c7d9a2f40f9775b73b
GIT binary patch
literal 2340
zcmV+<3ETFGP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000Q<Nkl<ZcwU{C
zdyHLG6~=%2oO|!wnLE>Yc3yU-kLdtIAGRQo#0LeN))WzhwxBeM#Yfbj;U7eU3C4t=
z{-KHS4-z7Y#8(LxB^0D3L?u;-H3boD2RfZjJDtw^b?-g*Joe|g=hS8*RT{GMWv!ii
z_Wr)L_S*aIZQ#<{UHk89a&z8ILR*CfWYsH?lNAy^vcnd=X{`>0Hv9AwyPueYcW>`1
z;ET_FdL7a?t=J_gFNqY8k}n0RwepO#&k{ZSn>(I)^F0ap>WjPT126NC&{ri~Nwn9s
z(BIO_iiQpfnOf>{c_dNv%gk3woSHq$v5AwMTbLvjL@4Q}WNW__XQX^F9_M1@UwL-V
z<v}I$iqJjCxC5<g_|oQ`e15~N477ffAiRq4;zo{7UCH3oy4Zg|R#&sW<2vsCz)rq$
z?QRCz*MP`K`iAw2f4uea?Om6YfiFL|=lz!Gc}eZf`9^MDyM^Zba*mHTF}l!%>t@Kf
z4zA<i7!VLeHiq!RkkI$(YM7?KW0uL{7*D=-kg4K4l12!l9s9rV{OkWS19v~SXRRgr
zLzR4OQxAJL-ppdLo8KK>&fs`G)*4(O;}~)=vaUn6Y7H2K6IsGg96M8B|I2OUV&Px-
z;7<D6dXdy)9dlsEV>>!8D&U?2cP?{?4oK?gUDnO5mv3b_SY+7D6GkBlBaF2;K*ks{
z4rEP&BpWW^R3Tw7)HXy6M>9-XpIw``(c9dWh;XCmz_y=nE4)L1XY`<?{?>dmx5eax
zm1#~^=E>Ghvu53KRt+4dt$iBDK*lJBlL&DWC_y5?7;5scx^Em~4WoXU(MplqH*cq<
zwh>voIp^8?mkMBSTy(-#3yvH6KFnlPW+*0iFbUEYkuRL1r6m?Ynt@D`ev=4sFsV2f
z`ufjejCW!D*`Q2O5jStV9t76v-tCX1Md<*zCcIA~Gtj!4*7_D+E1$!lrFEK$0CKex
zWZf|Fvra0+0gMr@3q7kQFs8V)xR4bmyg9lWmow0{8i|4v1>XU1swbSad<MaXdNy&~
zn<TIihy+WU04XAq_ppL6vN1$tEv^&M)iV;?IZ%O8shjb!K92o!J+J<4BY*$<I$j^m
zv!(wUkdSoO)<?EBX55^&LsGu0zKxcA6Mvb118}ei07<0HCWsJzkU@%l3)Wiv*lBK^
z!m7gbY&WB$HB<tN7le3~kT8fS2k@tV)bX`#O>{16V{~S`*7f}Dj?fK~=x<)hSU8{T
zWl11mWl;*OL?nxB4W&vAL8OGZ5=MA_gxq-+7n&J8ox}G6Dit5E9NXCUD<RhU6dFBd
zf`BVJRv`&1=Y|Z@CP}=np`EeHJfNgmosT(fL_`=I=H|NzEm$LLvhO2&Ka8!z=-C`W
zSfQ=ENTGfKIg3P;32lIHt2T@U)YH@2i3AwC*@>i;5;WxMC|WOBPiv!;RuNH*Fow03
zQgH=~<pQBBL6ta-p0Xcu?07Tvjf-5qeu(Dg)0oT@mRLYk!OBNU=PgG*%W4W~2CP;&
zh-I>(kgcUu{g^0Cx2;-BB%Ao2*Tu|id(scA@MBcMWC@b>ZfGvi(0GP0CJYs(<82bg
z1z)OuA5h5GA*qT+M^+~7h)6;<O}7%FbfPe5V|-!-kwhTyBT<RrTbuZPXlZDgNKzf9
zV~DC&skLeJsURXGkpdja&PigyFHvLM3(*HLY%)PTXHNAIR*4d%83?L2f<O=gk@YSJ
z2%~^VVFH_oiAcqWoXId>UPJ<GHJ3r0kkmHs6{*YS64eIMlEdZfiOX;V#<9p4go9&5
zTE$=iISwVifa}a(sGS&T_EMWhuaKN^nJ<-)6-aNp8+Q*}D{)n0zMfUhT@04TF#>}j
zEO&BtWI4hBAOjLe1}h;_5s}2)Y%L8<(?lvSiP$dj)Bf7}<-9R6$k4<YgbuhHZXc+Z
zbX(c4@R1dpc%w8*B#Qy&COVlMuT4oYsZE6dV5^W4>)Q<DlWk<O;AAUUTS?cyN*<*m
zvVzMRyLjg4pIP)uApOwY^ogDmk(>E?sZ!3Z>*ynw$uj28fuOG7QCh5}Ty%)6gB*h~
z1`JpXs#-w`5y@d{rh!u<ZM=1&gZ7RE&_WWBjUraX(FdN-3;+Bpk`_u{@TJV-pMAb~
z$FDxQ&!WAD-g=o&ZTJ|+N@G-_0GOxuilewVxF(OSbaUq9I;>;J3f$O&NteOI79}Ea
zUC6o&4t3MF@+?+SQhdFIR(^T-0Fn^=`pAPvN)ABe@&k$R*!W4t=O?+QVKqQ{2t{Fn
zAS^-V1j|<p;wSrG_~}+8kO*xIz#4<xRK&TNCS)=g3j=ZLPfw5WuQNkP_%?9950C+P
zV)yTl?fk`!KSA8P@907He(+OlD)jK`;s`>C5XoXOWV5I7qbsmRME`ZG3?)Jgava>8
zOP(x2*v^&90%~yi+2Log5{Mrk{?6gIF9-lI*}D59uXxpLdEvSzUp>g4t8XN<mNyp9
zfItW(1QCI?$QrB+7=r)+iKOpjTylow*3_Ntq`R=dV}E>#xl$2HFM6%v1Mj$!#rJk!
zs<}<l+e1@l_}R-(u`1ilwT*q`O$G!;5Jt^OAy%7~kOP=1oU}F?a$?67<E&XW!J{w!
zmZ9-cB)t`&T}QrrB)I6Uc>m}2PZ379NIEq#Gsa_o{T*(_^6|C}3>3PlF&SoN*WftL
z#h*0BP?rh0rh9@<uYZdgj`PS1PjYH<3`xU;_Lf(^{mRt4zKnJ~y1k_={RU|(f-AfG
zxW4}bwA3{+vQWqHT!F<(mQs`fpf(f45eM`%EYMjfGPN+n!Fa2^ergaaA?cto+1p?G
z)=M*&{50FOZ&$83J#(KSc^B3r(b>?(WgWe&Z0k<`QXA_Uki=|hf!X2$LldWYb99K&
znF%Bz;aTj%m6qtCB<=6zaaz5-x{?1qEAEt4e(59h|2$MZ!LMxSeE0AJhlk(u>v$=)
z{Af#4jiZ}n*lMi?B-<;|CV?VN3JptoQ?iF@2%kQ5|B*|2p8p%e#7HV@ZW-MG0000<
KMNUMnLSTYJH*qEa

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/mac/toolbar-advanced-search@2x.png b/chrome/skin/default/zotero/mac/toolbar-advanced-search@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..8a0791b68b9681b2314a450b106875e4335aa6ea
GIT binary patch
literal 2573
zcmZ`*3piBi8=pijB|<jkUt^fE*36k1q?yJDGZ>o;p{XQ;LsK(z#>~iQ*^pb>T$AJy
zNv#UGmi%4HTCpLjMXXfRvhq)^m9l3>m-&0@JkPm&@B90GzxVfk=R40i&e&n6s<KuE
zfk3Fz?Wr#C9Vt1Lmcduykt37vZHdsu&KgnFraKG|l==3%g$TrQP06_gaW-=e0wHg}
zc4dl~j@wB-5Eskxg}gzmn9GOJ2n1P7f*-k{h=mk$IXodrY=M#@Nbs{H44{xwi0F_7
zis{He+CTyjX@)h$;!qS7Boav$`1+AtsJ0*J@W=vnKqTUm03awR2peRAg#`Wpo=7AD
zI08T*U|<AB7|au~#2B7Xe_@hO^H4#dkATe=u^}E(GB3*;3KUtOP!gff$3mSVw%->e
zp75hB*dQRu0C+48_!<oqv%f);WWGuB_4(|IA1L5RJ^A_oAP3}vJdqIQ;lC;e_x3aK
z|B4i|_zPmvCN6j*ODZS1fI^59C~1Kkk1e7Q$WlX#!(TeGz_Nk3d;usF!ZeE6M~ZB0
zF`oHFhGPCnLpHdW;3QzfPFa$=DEN;8va!YZ-Cq-s4ayKCttT<qVvxh6vf+kGU6{aC
zeKoO|XajK|!A?HQ2b2^hrO1R9qop#tza=A+kRkf|kc5HW2SFc^%xb}FCVls<S^j`b
zm<)UsO@`kDk|X5H_6w%6L?DHL!<%7nrWo92SG)-cXG${1k%2`RnF=Hs8v)1?K>}9@
z;!vb6xRN2#1Z#qYeJ@6QB$ENjK9bp23!7FNg?BAQ1!jKw0#H<1Zxi1j5DF1=s+B8K
z`K9~b10J+BAKC)j{mOb;d7a%S*cta6GA;uS-`BbpBBSi{x%U*g`kstyw2@;8!Hf{b
zDlMbff&B9~*cE09xk^@s7|-<wdkghaPjB2fe6hM`bZWFJem=96XU;yXSrVJmKqxbr
zXb*WDGBH1|J5c8tX)Cv4KltduZ{3ux)rZ4#n*#gP<-@DC-%&a*-f{X=UV+Ev!(K0z
z<#kX_J|EH8LI@e^aVeOMb|bjk$Ei3cKOrpZ0=@1kyhp}r7(6sDYN@q(uU4$Xk#~j0
zwB?pAZFv2A%uP#?ZgpMaAJ&m41FyK}<XNn6(};~c5y3+duRKfeT^V&=neLu5I~S8z
zRkSoTG-9V3rz9Zw$-us?H!TIamF)yoQE_}u*|9LQbN;q+V%mLEs<jnL`&R04E!!qP
zuQShoL{FKguE_pjFQz#AQhm~fBC_hPS*^L-T@`v7lSzGHylTTe29{YTh3f3ojmuyC
zaK7tYW_F{Ke#$jWMnUQHU~X-7-JbR2eLjt^%Jvs4{#H&onEvNw%sTfx3&Vzu<=Z>L
zX)|p}Tf{Vl{uU9M<%rtvb%T`NSk<A-yhsFl8;im}DE^pQv#!D$>~t8M&WJ8C>K?UQ
z7oL)!m)E8E!q+&4WqZ9D2&)Jx&#6G)`A=ZJld7e2Pf$Un!!|7@F!L%k$qzcoBdB?m
zqzL(*Yntone{WP%9%zf#j&oUcnmdNwYrJol^1W8x^U~<EtD)6(Gx_zzRkgO)TPiye
zZRHIZ@_&_?ih9mRhpDgj)%n?NdUN2NB}Rz8Q%lDwz}#Sk@U*@-w9Y9Sd7QkfJQb5x
z1Zk+tYb0s67ZxZSkf%Ux`b|Pw)X0A1z)gExoJq><lR%pIs&l&Hwyeh3W-Wyf4}f@$
zJ9cU``np)h&27n}rxEn#P3igNJF3~_-wTG;O_VaGNBS}`=9vydthMOcG4J4qol}l-
za<u`?c}<$TfvcvpFb_A@c#4owq~&DqG5xqHc`$6H0d4nmH3L0Rc{sF<$}&!E^FrnS
zWT*BHjdFGmKX)eWQOX4M!P><Cj{otDZQ$R@DAcJrG}u~Pa|?8JlLPuTF()tA*y=@2
zq-{!SN%xFC#7$P8q%)MR3O1-@-Hf_JW5=H`&B8uSn>BNIxbjZ}r?(AfDB3@P8Ao+y
z&36Vg&c1&(J|oJTB-G5@NOKWvLVwpDr*%d%x6dWUzy8WjojKhNb_IzIrw2@}^<#z|
z2Yw#N6mY>^kE{LZZEy2ON6aQl)}&l4?`UWYnGP<yps&HE1^FwwN4~#TE{HeO!gx3h
z@iETZl8f#dJ}<#1*2hnwyWbi=y_C@KU}Cbhen)tLD!tD-=l0M`pS0|jHiQ0-DeJ9i
z?#ZE(#^zQRu3K(3c}dI|QM1<krSt5t=AIa{h-}3ptCT8o&p1BoOxMIs>dvI=;eE%3
z*TrU})*R}+toC5#>-plb{tyG**M$$y+9<kVW-U}5N20D~wO_>abeZ<+@+|wcR{ZZD
zS7y15<vd!rUGBa1n{@fPaO7rguQF{)bIJ9tv#Vo9-ca``XlopNkf1vGt9S0O;ZU5X
zvwI2qpFE}Va;x@B0poYozfXF>A`PB+s*N5ox~If{qMO#Gsx`x};_kGY8>J84S3clq
zHOWDvL&!*GaX>?8=#xji)?v`dU*p|xo9Iyhr{&l24RtnpDJYHBZqdBHr&1Mv|1U3T
z#DKf_Dy}?P<JhtIHKlKx-^Cc`#V)@<#R`v==2H`NL+K{5X-6vCtEYprh%QH~pHNsA
zarVk{_-s=$|H#YOTTSmQZ_I7S)N|c(O7V3o&EjeXgQ2Rs%_d!#B%^a%qQ%#|ClV?e
omi7*H_pkp@_2KB7Afs2C+#~NdmlO_GO8(L4v>ntUYp;lZ0s8P4iU0rr

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/mac/toolbar-note-add@2x.png b/chrome/skin/default/zotero/mac/toolbar-note-add@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..b128af16760240799a5d8d80675686b838b8b87c
GIT binary patch
literal 2664
zcmZ`*2UJtp7JUhcQbf8)afqP_l8!(^2rUQ+9Ya%8LI@fONq%0Cz>MgqAc%_MAY!9@
zR762xXo^aa^5L^6j-r4-MsP$BMDeQ#jFW&RpQUfDSME7`-+lJE@4od?{e0Y2mGzYY
z08piQPy?iQgzQvYCcT0Q32&u02pHh*0+e(ZzK{--1RkLv0H|omP6%-3+-d-TnQ#~(
zq7ZK{5{n;$W=8TO*l2N#K#B$cvX~@&jA4tI2yqOT2a?1N$OQyR`Ya1$kcb6{DB1xT
z;_ZiU<qO$}4QOjL7D-V?AP{6>WE3fYy74nzI&whn6o~{R3??ov4jo58^MyMwI3kgV
z!QwG^JW7f{f$=;MQ;gz)#*34DnTN^-SwfCL#NqQ0vU!;i{8*6#5-Ah<dMwr{;zWH@
z;(?!SNeyCT84M1M#e9#(7IS_;lVyHLi)4LuC5RPr7d%C>Fl;V6hRqX!QXcNRa?;*@
zCH`NLVy0kGY@vyZ-pI1bNdat-&yAI}AdtrqQSjsiLrcToI<m-e<;MtwY!H;vC>uUg
z<YP<mA>U*uwqG>lgG&j%LXOlaQ&txR_gO$bwiF-wJpuWk96{E4k{?IR=7vx?(uOX$
zAV{nFZel6XmCxl1Hwl<5wydxPid<+ZdO;@iM>28=IbtM>1ja_}VzWeYt0i5tg?HbD
zxdS5?CS$&fCQIK0k~cq+6BSQoir5r97PkR~wMJoW7&rn6YfZvilQBy$auvuju0l3b
z#1}I7d@g0dMT~5SAfO3osqdwT&tx)2wvXiY)#9dIh)Q=YMOn)H@&%wMr#9`r008g-
z8r7K*qBIfY%?)(Zrhv19SKrmHI^5M4)X&(m{;>ycr$^%rtXXq7*Cl16cbASQD?d4<
zJ6Gl3xI&fv>veZxR|nrx&kRyL0V}_x{n0ZOS>abY@$<xZjbq}_%{cn(WZH=W`}4a8
zv$O39LveS(s7alf+POzM*coWG`OwO__VN$CdJp22gws!-g(=-OEHeL9Z9L)W^1F(&
zbJJnCWj+6Dgh4K(uC52k_kf;*r{*`*_@eK5jc6&>JBOo-VRK1vF5t8e_UqN$yDi=j
zAI%$13U-MeEB0AIQdSSArCXS2y_@c)K81}E>-dS>TAm@gw4k`cATP&J+o-Em%ZTT%
zx%*-TT(SM?bAi83xt81Et`&D`D61+WOx{F|f+a_<r)z|_TiBO(^q<F>rWX3Wd7PZo
zoIj&TQ%`E)IU5*Do*j=o!smkSjio=$DRkW*$f_*u!Rk%Zj{t--O6HUaqcZGk;%RgB
zQ1SI`27WB@4ZViOZB7-|k&IM?e?vrvcXW>K<!YZpDi%Q1DP2v8zrt2>-CvJ=GykxQ
zAX&BAHEXm$ELdI7b8KE~m8i75jA&CUGszBqs$8Ao*ijX*veU2nccjxsk_Sd_Q(!}a
zcbWf|hq;#Bl+!dppk=xf1TNU^z-<(xdXGOpUA<Yc<RI49A*utg+Qq_MVzwWL^}#OB
z+Y%)NNHO%cvuSD7YpJG6As<T+Z~bh|iN{Kfdi+!?i5<_Abk?au)g@-({L!ZT_Q+w0
zo(;=Tygt7e4BVyC0i*V3_-`l#n#Iw7W!gck6xC<9JNB*h!CUxPnwn+1*e68;^GGw~
zE)kMW8h6E;c&Zm8bTx7{>1Wz3OP{TXfc+-}c{MBLO8Qa5jE3$AC9z>P;QSkf;Zn~;
zLEz~hZHs`lZ;O+?>9*X=H^<zal5G)p%nGA&y!OnS^{qpw4=TK+m=Nq=wW$s3y{J8x
zd9}A{$^{=V*+YxQq6TL5gN+g|#^J-lBxVKW$$a~{i?hd|ohQp`Xiy2ovcsVjR$Umv
z&>JVdeBr4#Q;tDRi<71^CuXbrn3v}Yj=&$<t^0fD`*F2N(p=x`&T7g}&_dt(qX*Iy
zB-wwnB#{LLF$R|or54)Mv77QGc~2ZaQOtABW$UOh!#35>^?6&&pP8B>B&`+M9KD|m
zvOKfQ+m7oVs(dxkwx{&{1C3p`u3>MBD!KDE>P+Yi-d^B!UtuWs{838^BX?g>?&bQE
zy<DG__2B-Y*d4!%2LC`;F@ik&8=O%YV@32{G5=6`g^jCDr{wI@;Ry`CC{-i3kj&B9
z+DQ*>3Hos4`kDtfr-xdfNUFriYTArnEZs5(Ywm+gAG}IQ!XRV&A!2U&t>L@D?B~r6
zY4iOC;{}zK%S`5qu7y5cW1OqeOx&@W{>ag?>1fqh=}7Vm(18wnHO^L^^1Py^<nGkQ
ztM9E!in%iqepY`h7Cm??y#?Ioj`^5OXw|>+i^Prgey^$C!F}$0-VI$K@6nUn;sKQp
zs*(8Vm3K1Q%I>>$qU<IJ?`!i04zz5~I4m52yTAibIA}um3-1=jz2QcEi~cD?bY6fu
z5o)EN=^*wf4$p{w_@>Ms^JiYSZqmw@#FvJf)ehd<ddlnUhj4=SNM<TE+|)QRWy)x5
zv<8x<p+IgRw_n`TS)Ap$&BZ1zmL3=gZ*DLQ8M_J3xt$Q0;Cl}Gr^L%@d5Sh^Iko(M
z#?ZCQAjt~%+@6h()_ar>XRNK0j3&7W+PG<O^V0e}-1+gD$t)cF<$i;Tf!WGyHYF<*
z3iB&&(l$@-toAVpI3U^4srui#E-WZHbJDwf>e$v3!gr%hUj44B#z4IAO`Fd2qqj#2
z0%){Lnkg0QH*MNW-~K6HZ%wVo6!3cQ*zCOP<zO$!c$3!8HWSoDqq@{}fxQ~ZUCBhq
zR49xW+*xCspmY5+^i-WwC%?Ab@%C7F$4TpqY?C5qv*oiVU&SvE3%)S9XYYu+{U`pa
WV;VWeLKa2#`$u#0p_aIW@BatWULza;

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/overlay.css b/chrome/skin/default/zotero/overlay.css
index 5f730f8a1..faf9df941 100644
--- a/chrome/skin/default/zotero/overlay.css
+++ b/chrome/skin/default/zotero/overlay.css
@@ -287,11 +287,6 @@
 }
 
 
-#zotero-tb-tag-selector
-{
-	list-style-image: url(chrome://zotero/skin/tag-selector.png);
-}
-
 #zotero-collections-tree, #zotero-items-tree, #zotero-item-pane > groupbox
 {
 	margin: 0;
@@ -408,7 +403,7 @@
 
 .zotero-menuitem-attachments-file
 {
-	list-style-image: url('chrome://zotero/skin/treeitem-attachment-file.png');
+	list-style-image: url('chrome://zotero/skin/treeitem.png');
 }
 
 .zotero-menuitem-attachments-link
@@ -668,4 +663,35 @@
 
 .zotero-box-label {
 	margin-left: 3px !important;
-}
\ No newline at end of file
+}
+
+
+/* BEGIN 2X BLOCK -- DO NOT EDIT MANUALLY -- USE 2XIZE */
+@media (min-resolution: 1.5dppx) {
+	#zotero-tb-collection-add { list-style-image: url('chrome://zotero/skin/toolbar-collection-add@2x.png'); }
+	#zotero-tb-actions-menu { list-style-image: url('chrome://zotero/skin/cog@2x.png'); }
+	#zotero-tb-add { list-style-image: url('chrome://zotero/skin/toolbar-item-add@2x.png'); }
+	#zotero-tb-attachment-add { list-style-image: url('chrome://zotero/skin/attach@2x.png'); }
+	#zotero-tb-note-add { list-style-image: url('chrome://zotero/skin/toolbar-note-add@2x.png'); }
+	#zotero-menuitem-note { list-style-image: url('chrome://zotero/skin/treeitem-note@2x.png'); }
+	.zotero-menuitem-new-saved-search { list-style-image: url('chrome://zotero/skin/treesource-search@2x.png'); }
+	.zotero-menuitem-show-duplicates { list-style-image: url('chrome://zotero/skin/treesource-duplicates@2x.png'); }
+	.zotero-menuitem-show-unfiled { list-style-image: url('chrome://zotero/skin/treesource-unfiled@2x.png'); }
+	.zotero-menuitem-new-collection { list-style-image: url('chrome://zotero/skin/toolbar-collection-add@2x.png'); }
+	.zotero-menuitem-edit-collection { list-style-image: url('chrome://zotero/skin/toolbar-collection-edit@2x.png'); }
+	.zotero-menuitem-delete-collection { list-style-image: url('chrome://zotero/skin/toolbar-collection-delete@2x.png'); }
+	.zotero-menuitem-show-in-library { list-style-image: url('chrome://zotero/skin/treesource-library@2x.png'); }
+	.zotero-menuitem-move-to-trash { list-style-image: url('chrome://zotero/skin/treesource-trash-full@2x.png'); }
+	.zotero-menuitem-attach-note { list-style-image: url('chrome://zotero/skin/toolbar-note-add@2x.png'); }
+	.zotero-menuitem-attach { list-style-image: url('chrome://zotero/skin/attach@2x.png'); }
+	.zotero-menuitem-attachments-file { list-style-image: url('chrome://zotero/skin/treeitem@2x.png'); }
+	.zotero-menuitem-attachments-link { list-style-image: url('chrome://zotero/skin/treeitem-attachment-link@2x.png'); }
+	.zotero-menuitem-attachments-web-link { list-style-image: url('chrome://zotero/skin/treeitem-attachment-web-link@2x.png'); }
+	.zotero-menuitem-create-report { list-style-image: url('chrome://zotero/skin/treeitem-report@2x.png'); }
+	#zotero-tb-advanced-search { list-style-image: url('chrome://zotero/skin/toolbar-advanced-search@2x.png'); }
+	#zotero-tb-locate { list-style-image: url('chrome://zotero/skin/toolbar-go-arrow@2x.png'); }
+	#zotero-tb-sync-storage-cancel { list-style-image: url(chrome://zotero/skin/control_stop_blue@2x.png); margin-right: 0; }
+	#zotero-tb-sync-error, #zotero-tb-sync-error[mode=warning] { list-style-image: url(chrome://zotero/skin/error@2x.png); }
+	#zotero-tb-sync-error[mode=error] { list-style-image: url(chrome://zotero/skin/exclamation@2x.png); }
+	#zotero-pane-stack[fullscreenmode="true"] #zotero-tb-fullscreen { list-style-image: url('chrome://zotero/skin/toolbar-fullscreen-top@2x.png'); }
+}
diff --git a/chrome/skin/default/zotero/page-white-add@2x.png b/chrome/skin/default/zotero/page-white-add@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..d7dfbb3008af88cad93efd6338de3f819edd008d
GIT binary patch
literal 896
zcmV-`1AqL9P)<h;3K|Lk000e1NJLTq001BW001Be0{{R3M5Kzw0004@P)t-s00000
z000sa5&!@I0002x<>deX00000<mBWI4i4nx<UCs`87L9}0032iJW+r(N_sF)eKb*d
zHc5CbM|UezfH_2UDMNH9KyoBOawJ1*C_!>0K5!yCS|?9@G(d49EmRsAC=NYkC`EEB
zMs_MhbSOV=B{f|h6eA4(|Nr{>`tb1ZVv9;cbSG_-S6+xlT7^NK#dlzeNJVuiNq8+(
zfjdWcD|w+_QGPa9gg;GtGW`7f^z`)o{r&g%_ww@c@$vDOzIg8L?x)OzqRD=KplhDS
zc}sdQpvZig!*liZ_3iELrOSf&`1t$#`|t1Xo5XdO!g2HS^IV5S`T6<&{{Hs%_M^&x
zWsOdizi*1NZLPzhW{yv!$${$X>XW{0ufwD5@auV<W|O*dhq7gYuU_oz?0u(RtHGXa
zm{NkGZ(NE!Ymrr?$b#|p?_Y^XdZb%ynM<O_f0DX!XOL0I*1&6$Ri?^==H}*Slu4@2
zi1POF<>lq;>+7k_hRoT-u*IZqnNpU)Z-cL1RDe2YluC%QWtPEl#?`)*z;0fRKiT^j
zZvX%QDRfd!Q#JrP8!+z>8Sgmjdq*$!Qh)Cg&hq~9&VTO{{!)GR_IF2`)%W++nL)Dg
zVTJ$z0cA-<K~#8NebZHQ-7pY<Q8{qK%*<_NxXjGV7-nW>PWe|yj$=<EYqGC8JG0+|
z07WSpfPAW`_d%cn0HTlp08loyHAs8~ZmY{c`6p1YCG!bq)Sh)S-WY`QqL2V|@S+&C
zyO4m8xx1_sgair>8_kQX%bkKSDhUZ7k)-oZUN8{S??MEUNH~l3tV?VGAAxWv{dOoB
z;3?}kz*Ay4z*D?9z*AB<z*86;;3;k#$Wm}1OCbO$WodC+xf__NmjEWt&RMN0r?xcK
zk-@_xYx3+JpF9~lnn>VA$xdJ2`{E`4hPkDc03KNrdWX;-4qjQC2_T^LpnV9#LCtEY
zjQ~zn7e0Zer}XUvFq@l;3m~#!>?D9?^-9SfM*ES>ny!lgHZ5D|KD3{C-r>3lVE@2y
z7}TWE`w`dEO91fiPxG(efBwDv=lc4|pLbx;8qyne+|V$^1BG0SjE;>@eEa@GK~b;X
WWSYW<d=?=90000<MNUMnLSTZC`ms;|

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/tag-automatic@2x.png b/chrome/skin/default/zotero/tag-automatic@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..e355ab21452460d7156814e272ba7dc7e6e72edf
GIT binary patch
literal 832
zcmV-G1Hb%<P)<h;3K|Lk000e1NJLTq001BW001Be0{{R3M5Kzw0003~P)t-s00021
ztE;oKv%S5&!^6YJ$H%+7ySKNuzrVk=wY9mqxv#IU#l^*~t*x@MvcbW@zrVl9$;rXN
z!K<sQ$H&L9v9bUE|NX&}&CSio$jH*t($Ue;(9qD#%*^8A;>*j+{lb&s;o-{4%KqHK
z&d$#Lyo&wZ#Lv&q$;rvw+}!2m<=5BO+1c6s-NWDC-?Ou`{I!0ywYB})zx~0Ix3{<Z
zx`_O}jIFJ${I`PG*x3ENi`LfGyu7@<y}kY1!^FhI{Iq?zxVXW=!N0%1{Jo9)xP-2*
zuCTDM!^6YI#>V`%fc(CV{oBB-tgQRFh2GxY{I-AN<Kx@g+x)nL{oKOZ+S;<RvirJ+
zy1Kgl{{H*BiTu5b$H&Li)YSgn#NgoI{k@F++rj<WzWlz9`@D+%*}eV3l>Oeu{JV$!
zyNUd~iv7EY)6>)a*Sh?>h~3@Y`@4t)6o%gb000(rQchC<fPjF2fPjF2fPjF2fOm*@
zh=7Q9fK?63&j0`chDk(0RCr!>&(*TrFc3vi55mQu%rMN%OqZFN8I$}!#_k?h?6`bh
z_fkosE<ZSq7vd3y5#><g2W6S5v#iGgIF1+=T%EB1o){<f-TwhzAmlW~@w=xeax34=
zK!_8P((acCZhPc6fp~-vUZyCPA(LH?zZgM84MNBWNV4lP07ebF>i;f+Y6^!@bi4*2
zs*jWyF{nQBZcr$J*gKh`^ocUTY5nEb4vOT^rvo{p_weAoOh?zQP*egF5K8<zU#4mL
zt+9c(6rBhXtlri0+FJX!AP(~=zOpF*pM_T%rkpQ6gJ>Vkf$*$KAWAz?=!#O?IsnmJ
zo(3_~529F8g`#cYxCbJ=Gz-GLf?}i5QgG|lEQ-1V#QaD?v3~>o>Hg1IOaqzC?-a~G
z&VhJbtWElZ_LcUggPP3M-3D>6wSYZl=qNhBQ5>&ZI?j8N1ktNnJ8o)-B5UdTe3d;A
zF}+(BC?0~)yLHZd#=fICYT9<(&*e0B+f6T}q1$h^j@^C^bN>tOnOu1nk2i4u0000<
KMNUMnLSTYz!{m_w

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/tag-selector-menu@2x.png b/chrome/skin/default/zotero/tag-selector-menu@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..138de1e6e753d1024b1e83767c218c7b8abce482
GIT binary patch
literal 171
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvxd5LKS0Mc_Kl}fx;tyBTFTCCq
za3(il!|RBu4L4`s{a?N@;)Kn9pbEy4AirP+hi5m^fE;U27srr_xV<MXGB6l$I2>F)
z!HG+A350kn@NIM1{NvI}O{<d9x(lDbb77geQ=&Z7wcOa)`r~OvKRMIW9L2@fKw}s@
MUHx3vIVCg!01SpbTL1t6

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/tag-selector.png b/chrome/skin/default/zotero/tag-selector.png
deleted file mode 100644
index d4c1613e955a0edee60147adcd92d5660b1cb644..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 877
zcmV-z1CsoSP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#4@pEpRCwBCQ%!HvSQI_)+1QEmO&Vy`
z&=d$I%7{%_j98#*7EBAOSd28%tU5^j18i6h<>$Zx*dcX+5DSDDXer6ik2smqOlhkU
zH@1`5v19wqb3h2nl`QMsci%nd-g_=#jNx0`+1X*aTn?V+K@bF(ris11y=B*R=Lds<
z7y9`h{5*`IIA)S0q2KSb?d|R7wrx9OV`C`f$7d;}k2#ofJpP9SAtT3em|++%HLaz2
zJ_AdQqHrcZ&lx>Do`f7Pq1kM*d_Ip3r%tHgztH2tmQL{7Ss>E+59_u1vTgV0z0dX|
z1CHEwT?eUj8n2AFu+}0t!K0ou0VjC|rQ*3+Q53$GLpC-xTCyxh2_XoA0Nrj^U_l^F
zO<f?W9mBJa3{jEaeIYtG0SN66c)z~6Y+2SV${)ujCMJ|vET-^=DdlommSmZ1ZPidx
zdbnNy>_GrZ0Mi9t9x&uaa)?GFvmCHMIdY(B8a6jK?=%{Xswh$@ih^V+h1Io+Tab8?
zNeaUWFvdyGWV?7*sXCf=^am&Onud)?BofGGvv=Z&=%{w+z;!%?<Ks-EmDLIx7drU8
zNb$=l3w!E6_|$6M=jabYaLNV2<79B^rxKCz+|x&ga0d=T-}Lk}&X13fwKsnwX&>M~
zt>9$#BnoHG{~3?RZ-+e*78VvxaAnP;GbyaEn!`_y@|xuylIaYTRuz%mSE%k=$lEF=
zMID*qW%RvZuGj18!s6oMvv#{py@59~RUSp)1NDl}S@b}q4l<KJAre?n^g2e95{S7E
zYJSAXr5WhDIVXnW<1$_1J3s>F|8?bBaX7B^6$Z=F;q&<wOTXeY<#TMVARt^6(G0Ys
zHoxyx#jlbi<Zh$>FY`U`?v-mL_*}w*kcMOLVymX2ba58M4;M_t{>aa$ti6428v2cI
z6AYQCYJ+*czjXC_IqWtnmBX5C^`H2@f4f|s$Kj_|__${1M>i-HcE#@&<8zXGb+v(R
zr?<paS=HOdO|FX%jk;>|x}BlV(Azf&q0KP<e*p#nguR;6(p5|i00000NkvXXu0mjf
D#5kV<

diff --git a/chrome/skin/default/zotero/tag@2x.png b/chrome/skin/default/zotero/tag@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..8e66dde3c564741814bf3695acae2ca52e212875
GIT binary patch
literal 821
zcmV-51Iqk~P)<h;3K|Lk000e1NJLTq001BW001Be0{{R3M5Kzw0003>P)t-s00021
ztE;oKv%S5&zrVl7$H%p`wZ+B7xw*N+!^69~yRWaWx3{;gt*ybq!LqWl!NI}F$;rRJ
zzpJaO$H&L9v9bUE|IpCT;^N|!(*4cN&C=4+$jHdi(b3Gz%!thU{{H^T%F2bz{maYC
z&(F`v$;svA<(1R@mec*0)c(W6!-mZLwY9a0%=)3&|FW{Oip=?k%>2&I&ezx1;o;%N
z#>U0v{JOfj#Kgp|uCBeky|c5kquKwZ+W*19!Q<oO*x1;ut*yMgyu#)Fu&}V)+}x<!
z|G2ogtgNis+S=aU-rL*TzrVlP+1bYD|BKA|-{0TE<^96t{kONbsoej><@}b^{-@jj
z*4Ea?=l-PH|Gwn@#O3{&)c&H`|J~i)#^?UQ<on>@;Kk+p$H&Li)YO&I{GizX$mjj0
z+W(f*{-4+X)6>(y<ozYn)iwYC02XvoPE!DYfPjF2fPjF2fPjF2fOm+9cZhd@&EOb*
z0004mNkl<ZcwTkR)pp!K5Jgc9nJH9a7-nW>Gc!BP`Ttj2RZ^l!FWuL(8@MmOWm)AT
zB}vl4!RT9#*-TfI00U$h9II648K8o5LSykipz;7lOji2_iR0ATEZ`#mG4p)^XuCcC
z42YBf)G)^>5?K4V|Jn&kFM$s_0Zdyy2asMuKdLC7D*$l#p2TR$0W<(ZkhF>cFb;*r
zDE8_Le}NVTn%OTe)2DRD)`|_nLAxJ@lINSr;th$jIST}%|IVLpUR}kDC-h3jOCYM)
zJ!$qI-GokJr%mFO5<_qodcfYj74`2ZuJh|C0#$*oNGGv(I`QlUios+V#eAcJ;<We^
z`(sYDM7g<&VlhSHq?o{-`z97FG4!C==m{kB1omHF3r95*9BjYgaQ^*c6o2%%)sH@y
z-`w_a)_kp96!%$?`X@&xF?vFAkrkOvTdGe<6xdE%*s=uE?X8^cp{UuN*<5A^h27bC
z+XwEQM1J7fY40Xw>aJUEma)5Ubx7TPp4t8kp$1|MQ`<_+00000NkvXXu0mjf19IRr

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/toolbar-advanced-search@2x.png b/chrome/skin/default/zotero/toolbar-advanced-search@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..9d8b23d95be90de10b6062751d64983ada98a2bf
GIT binary patch
literal 1247
zcmV<51R(o~P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60
z0RN!9r;`8x1e8fcK~z|U?UqewTxAr7pL_58Cux#Sg#HL^!D?$ZLX}e76hV++YYI)!
zU3DW;s0xa>%R<~#sxHKh;15_~+S2Nj7K+e~w79U<wuwcni8gK8hRh_BnYo#{bI<Ey
zGNFH|GbOsw!-aeA`Ofe@-?`^IbKt*j&b=0o{i=9SDh!x8J0yEdrtT17q4G#)!%&B(
z3eyMo^sTQfIY9QO*_|fsm1(U>n2E++vif`7H>#Swx$CJ_hn55&laZHvq`1$dJu(rG
zI;2w`?MauY=O9Ei5cyJ#iRlU@zlJ12vky9_R=+Vg=!C5RL~eH^HxxfK({3bIcSq@I
z_ZBdvI<pstWXxklSDdT4IWA3<ka%sXYup81z3&WU&lUR3IE=))o*2uLE)w`PqZ|ke
zL4fN(BI1yYx(LY4R{3#snlLoUcy4#!nrzDeCr6bi%*_5Q)7l4@*LPkM%#=d{6V$Ky
zEY$B2&!H>f;ke@Rq|e36Gni>qPHkheh3PgP3WZ|7Ol#v&hjhD#0W<#M;sSzD<op^Y
zSe;Iiig}o{&H`_Hvl&<bP-y)ok#6$<@T(#S7Z<NT*JJ#ufdi}3Da=Huu)k%1P}*cB
z+7oq`U$egzZ>;%2J$CuB*!(forq(lHT456Lh=T-SO-+dd1fhd~M9gdSh*d2EnB<rV
zYlt){e#;sxG_2MEOjjhM8q@_m*J)Zj;@18CT-fNAS6T*;?5vr{6$20?qHc3LpN~aw
zJzuUDq1l=H$N)#o#I<|{6C|Pzk%cTQF7CPYhGY_B*Jd#Z2adE1P>lB+GTAT1xf)k<
zb0FwSdPLks>S4YSb<ZE$->wuWl&eH5lf{QG4jpe9;N{1iz(TzxiAxhDa>W4072PS1
zj<`qEa~8fw)OA>v^hl>XTnBFC%Ul@Cq0m@y`K$JbKYl3l`j%uf0C)Twe)8@3y9RGd
z;-QsotWKxuQMXk)0uzi*%y91a92Odn#z%>rd5>z<M+#3^E!sc${%OA@fJ{c-RM+@E
zneCB8Djs1~I!U@CMj{bGg0f%Z#<b7awOM9L6=Y(4Y>X#YOi?N382;`ERlkT#Cs6F3
z5Q`2ZA07K+r(}CWX>DWpSQtcZ8c@8-bb00Ym#Oa3c{Xf$mbT6w%7r{5r@p4*&mxg^
zJF7bfhlZ<n({b<S1lZlT=Ab#X4Pj_6nCT12M$9y4(wvz_O!^$-`Q`r91D*LF_Sb?6
zBd5Nhn7dB0t%HqQ`iRDoNVYAQcC(As#64%iW-T++8*@vkgOawnkr*2{KSSHH9{ggS
z3#YPF{30f0<7w{5#G)B!#Ri9ltJYTDDUq#JeTGjTrI^1?BGp0f=02kFB%p1TNqgt^
z-!2J21A;%-?U1y;R;@7n{c%b&QzTODY<%MB`l-QQ$qeBABLDz{2M&a8XYis-*`QM9
z{OP02&P?LD9)=;|j`VK5<+CqI4cu;-q25?^iUUI1=XZ|GK>Bpo$G^UGbL^64pkaeU
z!_`=t0Ze;MVNqstGJO_S+?FQhC9#u3TO*l)-q^n`{J%A8e*u&tJ7h-Awb}px002ov
JPDHLkV1oYWTfhJS

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/toolbar-collection-add@2x.png b/chrome/skin/default/zotero/toolbar-collection-add@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..7df8496c430fbf07488670acee02a3b1aa6bab93
GIT binary patch
literal 999
zcmV<D0~q{?P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000B7Nkl<ZcwX&Q
zOK6-`6#niQqBhASnszLinvQ8qT9gv#^o0#n1UFLK)D)x}Hwp?$T?tZ(6~Tpqh=PLH
zjV?4Br9|8aifP^0lpv&S>`X?b=0UB^q)FzLx!=*=`Jepr$i&&%Z#bNDnEUg6=W+iZ
z|9jlQ9Vk1vIvW2$fP-~D{(b+U3r{pez^`X_3D$!U2Kx_PJpbPXd|eXIcjN*f0zd%J
zcrm%hJb7aDany+vlzOHA$oRJa&;%Q_ywD~JlAD<RoTwK)fP4fX<`+OQ&L+!U`v5{h
zD8@UnF2&&;ubOiYKmDB}T6{vw3r~&?0l-#R2zCI3h()Ry6roEoK!;4qj)$H&*s-7h
zZJg6`>XHCB)q6z=ZjQeLbyo-~6!Lgw=K<fm@tKk+4G)4Na2HQ&2qn-3SR(2NArObB
z(g@tPYH!Q^BJPgFu^~FRww6PjAB4UURJ{eR0RIl$vw1)6?b_#@Lyg4~|9?IKRc}Gt
z_7iqoam$&T1~Zo+QUolk6gO{v0jM?t3BCuaZaK44(3#8CiQU{SVyzu0-a22Vl2vbB
zF<#E)aW3^YCg+xLV<iugxWD~f?2PR|PZ4MdNv$O$z+An=#x7n<<I9Qb$gZw}LXb3m
zA(KL4Hi;%_#o@LrY=oSMmI+JKW)5K1m@sGMxk|CIi9c`Rv+;RD{y=0S_QnVB<iP{~
z+GE(adjOG5oybuzl5WP(>D@=mjlh~W4RP&?-F!J;z!wuYpsBIFe;Z<3q7W%nuLQWS
zqaE>qN0CUiV)DuqC~{`#^*ukj9ni+?`&^^qU_LgTMy6mY_mMxl>m-iHPdWKRTce0X
zIzh4{uL>^*MqqDwZDN1?%Us3~bU)Z-lNqyNa%v+a*1g5#LVY+ef~BQfMnGX{5hB{O
z*l)VbNHngm6hRX0tu0RFUOcz=E#p7^={1DgHW)D!_EvrsGrtyM=az_et5%{=2^2b}
zN#ECS1`5&nGs9R9+N2XJR9IMCL`O#$pa1*@DD+lt6Pq(6AtFg<2ZZt>h*?mu9_wS)
z5L`|D?(P6}pmMo=Ch?oqf#O+(2I1J-gPT+lNeaV#+hXYL>9&RV$S+SNaV3!isnel+
zQ?Eh;G5qF%V<LKl)XH4P?kK|Tt)OTuEToZ0{ehXed5~H(IXw1$>MMl?<LIe9$2Ir~
z$rgJICGU)7Swo&5dvAIK02CSz44vK?$rnN|3H4JHK4OtyqSoIOi}?85hsnQS;UB_C
VJDczXKTZGu002ovPDHLkV1lpN&42&^

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/toolbar-collection-delete@2x.png b/chrome/skin/default/zotero/toolbar-collection-delete@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..302015f217aacf42fc44b05f86ab3a7d32d98c55
GIT binary patch
literal 985
zcmV;~119{5P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000A^Nkl<ZcwX(4
z&2N-t6vcnf*mMe|Uqh*dN(57=1W5#m)CI<m7!r_=B5X7<E--3>(Z9eyz{HIUjVA2e
zus}m<M5ESdFf3X_noz9Ls!`CU(9+JdGt-%Q?=jB2nI}`;8Qa>OoXO2SH?uhBempP#
zd)&ocI70l~zxNx#6D$jEpy%-5)2m|Or}K}9l_19cp2I&}{O<-nDH+&)Y!D<sfB{0K
z+J~>X*8e2S#4kAade5<;&j9KOfrVLCAto&rw#wRAE*=2A2W(knKmcX2>>uwUGh_;L
z$b%AZ-ti_NwjKGhY+4mYqm7UC_W|4w5Iq45DHILtP7^_igO$Y;xgPVp#>BjV0D$ty
zEhrhlcaJwErib3f-4nybV)*QQy(rhWKL;2DctotgA6^jnk$VFWnpi#zA+J+?1p<Y_
ze&iJ<;vIWg+qHjbBS+;QGB7-9y#jBb@&+0@A7jm?UjJHZA0Ar#pW#vK6*N8gMwwT;
za?6fm=@Fy?gi(#xcfJg@R-lOQK&>mc%qT(nYHeX(`zDq;fkN_PL?`(gVxAXLb4*?u
zWoGmS3)6Feh;JAs@o+De4T#mp{_O}2EV~S0&!;Yr^ZU6$3c0*LLWz9xDyi`iTnt(s
zN)Q5X#lnywge(h|DTXW?*4bzt#`N$wzn;BR6i;;TWXJIr+4ItAcE50nZ3mvEwQDn0
zFm4auV&F*Y@yHbj0ag-LVaYo#%+2%Lxglg?%i{;>*tHwwGgvNzb7Ea<3v2g1%9`dz
z{=71Rq%&XjHGS(R5QKq&RJ-Gddh+{g1le4%b1z;B{gd;h+`hS!rVVW%wYt1cN31}A
zmMHA`?H~UFiF<eLsVZ){bdj&$*p3i_qj#(zl}Z94mzqTiK!rsSM64uWVJZ!XHEpd$
z;l@L65rxTjo+2K1AR(!{`lr|ymL%+7i6IGF$lz3<3c|@`kpvjtK)?+gT@z<cuoAdB
z2Mc0;;yR6OEzErMO2ycVJd8|o77&QBvH_W1b<TYN+QbUb&=My#pJU?6Ww!S2t17O1
zhN+1ekU%=`SS5USvU7vwb7LkoclK<jW9xm9;y15PaceS-%w}SR`fkT6;_D-clg{ZZ
zl56Tnuzq8LhIp*F^Ym<z>4_Oq$ps|IVJDvXJom9<l`(L%?RlAfh}0-Vc<tc%oSdCH
za3OaVz_I$^i@tRob$MQsxkJKshT<bapBAWl|KNqWn}qlqTJQ*DstHhV00000NkvXX
Hu0mjfLmbW+

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/toolbar-collection-edit@2x.png b/chrome/skin/default/zotero/toolbar-collection-edit@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..c69654396a6f8906d97fa728e618376bd092079b
GIT binary patch
literal 1251
zcmV<91RVQ`P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000E4Nkl<ZcwX(6
zUu=`r8^=HAZM&{r%YF=g0|wh*hHWrFKp0>`fEfP~K*Ehz##_7~8e`(EF)<;UXkv^B
z7v8BiTo45zN(9Vsu)l1;{<N?^Y%FDCtnJ!$E$w@b?Q7rEwrMxOJNYJ0p6A^3^F7aV
z&Uwp!UeEPh!YsUJcU)GmpC^*I)Nr`tm4C&6=cktxPa}=J4Trm~KD&W4h5_o2c7RfV
z0;G|Zxi%xS=FZszJfVgW;zYyI&hr3POv!XsG7F|uE?8!-CB>y%k;xE3A*?YF)PedI
zSes)&0hlnN<6onsOomG3OsyL=OE!D}DApgjXqralbZDyQ6psd5P|}8!DH9qt#}u0N
zaV<cOflQ%P8mh~D6S`4nI-yK(HvCclclhu8fzT{e?|cu7wG97AD-VaS<8aTAZ$QV8
z*>b5H20-SR(2bgz&d(7R4WVgdvM_Qq;9=G`glk0;A>T+6?m!c;tac|d5yL;$P3xC?
z94~)(ZC=Y7fi!2F0_g@&>RFLCp;Jh)kcX(hpCvW>sNA{_i;x8GT?IXkN=8N1=42MQ
z?9Pu0j3C`sJ*(weU9eZ~z`1&F&W(_SMt>kWbDOeNuTs9g8GUYm^6E1DLoLX7jQ>?_
zBM}XNP{@R~vFI(x7|1>Yr7QQ~sM?)(Tf$?f2@U^<b43ciCk0Q&AnwX2BwPeWIth$+
zqm)3C0*g}ZMQ?$-@qM!{c*<pT2pQ>P?qMf$6CHVQ8S|mpS5dL4k)>N|nCiSp;O+yg
zmIzHJTE5CMpz_~=qNiNW528o<iA;7d_n-&os)Lljup<v{DQir|1|HqGK=|$$HftPF
zG6z7>4kTu;f=U>n(is)cT1Te3lJJ`g!e?&$LZD|b*@-s^+&v8vQ)rlyMr2wpqo{Ns
z=Z(m$qXZ|e6ZZ8k5<Wo1*264sKAPbG1rMP@8KB%9oAvZ)JK;$$73&Ty3hr9Bgr(aL
z0m|eQ9DxA`335IcY~%?~8$sV)R@5J1S^dt1;cH#E*ICV%)8rI>2|<D~I*_;fp__m5
zaD0rlTi#-2Q}ZI=&Lmtjx@mscOirOQV4m{Kywka_?FvJEBUqB4>KAtvg!^y)iUF@J
zO&TEc8!8PjQjrmaLbHJ4aVUsVy0P<t_EyI3KA^U48<FrR@lYRX-kS%X?!7>;>o)c(
z8~i^`IF#vNA{@@*02F_UWz2y0w_V5EKgp);Z?L{`H&@P`<WAcq>KZIr@CV)JneOPt
zRc)iBDvpu{7|;z9h5kPXvlu+N`96Zx<mj?*79rs6cfWu{j1f-@Ue9GVZmXt#*8!~V
zCdNC?;cM@q424}JScJwKKfYCy^Af7#LWonKs>leb6dD5gID(3WSmUrE>Y5qs?&7}p
zXB?#$hzG+|STyWf0u&2rLMU-O(}4x_&50T%G}yoUAj?YxT8R^3FGsgI85-)rH`0mQ
zX8-=RPkP_sDWtK0Jolq03A4kk`2CYm;zl^ixi>M4ci<X!i}lRY!p#vB)pRfcM1cTe
zvI}vm3k?AXDqW?&9s2b4F@R?>uvilfYf1ru1S-o)e?Ruw!0SAt{sIApl^6uzhNA!g
N002ovPDHLkV1kl~NxJ|5

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/toolbar-fullscreen-top@2x.png b/chrome/skin/default/zotero/toolbar-fullscreen-top@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..b2b090b20d5317c9fa8b26dac8bd73594d38817f
GIT binary patch
literal 911
zcmV;A191F_P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60
z0RN!9r;`8x14KzgK~z|U<(AKH3}G0@zwhjpR4GkJ)6lXUBoZM~Bo&m##hnWmanQt#
zL_{RE;z#137wLb%p%ND^M1nZzg-RsoY*kbUx^yEXy50BrI?OvWZ+B*QXX(0llG&a2
z$GqR~`+1&uGr<2I3IMXhZ@L`lK?-+)SWXgg7l_#YB;z3SLOvF8P7R&t84nC(hu?HL
z)Xzz_)n4Rp445%+nj)KqPVRmW0BHw$kYrm^I*sN<%}Ax3hM=A;&f@c@FZl8OXPb~$
z0UQ7Thr)d%(cIEFaR6vq(1iAmcAv&Rzdudk5|WtyS|~@=m=t)|($K)4E>fq#^0A14
z^M^My48I-6t~`i0@UMbWfq)-{A4P)~AOJAD_omrx?>VpS^}`x7(?Jkx+LxHQH4G>P
zfC^BAB0!~l?@-n+04OL=)SC#UJTZi$!OVa_Z3DiHG7mGd9H5M5B{AD<fUbf8i4us2
z`MA9;La8cZAQTm-jIi=oNKC+=sm%H`1Vi+Z`ydVe0`@#u?F0rK826RX!_RX<8gtt9
z5Qr%vMH;lGNF!oa-O#Hi1_Touu(4T16q^Phl9nJ1Wo!67wax)Qg>&7Pp$9@bhQ{ef
zM<H56Yk_Dn{~EgFwQnA|lbk>VecUVN7pXz7wT6@|;W8t2q@V&`pN1uDqnDB=x@Y}f
zXbOY^5y8EuccHaZF;JEhN16SaT!sfubsF02-WJ!?(1u2G0wIPfr<>_z_{#c1wzyCN
zV|ApUf>@1n-zzpfM_edDZPa1F)Vy^b#KrK7>$v^$R<!7Bago5-p36Pn_(DNTaeHM0
zN#o$gLr5Wo;n5pd*S-#2D^^Fug@V4GK8Og$-%Vi5eT9~p9cV4>1aK`d@PXvY<Aaau
z{;VRGA=TQA*TpCJRh&VlBQr-_(@Tl_HV1dy#bP5);=R8ShhRU!kJUalt6k|rH`0Zz
z$W6L%C*7#{L=JAw7Uu_0_g7EwAH@E_z1foJb8A;+u%<H;ijR*$gaacNo@L{nOU;*o
z+}*biGku+E>RY~7G?AaqV=U)_ngb&j<HhII002zfpM2QWyHe%9PW4XZ^PtuPBbP=i
liZ?8J&Th$WJF_{F@NfNthcXks2d)4B002ovPDHLkV1nbRsdxYY

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/toolbar-go-arrow@2x.png b/chrome/skin/default/zotero/toolbar-go-arrow@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..e22b0cd26e279cf7efe3174dbedf4b8a39d9fac8
GIT binary patch
literal 591
zcmV-V0<iswP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60
z0RN!9r;`8x0t87!K~z|U?Uu1?6hRop-yKm7B-n_?a}^5-qA_<6FA@<88^J~qOF<Be
zG=hx~xngsbIf9@BVqszHzhJ8nquvFBy?P<B3W+F25}fxeZf;$Z>}>WH(zvhLompmn
zZ{9b<ERZQvrvF{JZU^3cRuUzU8hbJNvEJ=G`ECbNf)QcBi5pK(jqkbvBZ4AG!qE8F
zruw@wks<+t6#5U9KncG=|H_jSiB0rGeYo?yB8oxOl+bCDZ8$}o@rHq14)creK+wPZ
z`1r4v_rC0SPedj_5he<5+eU&QoGuPwpg7bqJ8|ieH=a5HV<A_|w;=(7APa22|Jyfk
zq=F5zf%(M-DESvBi+FYaYpfAx0#pbZer|&QT>k+<C?6fcpjWZ!&_7>47;7Lhflk~4
zAPGy~K07B8gu<SED0#y$BATr?pyZ!@cmRzD%aKN+4Uj?o0mUr@q6reo=kh@bMHXD+
z9DBf)z((D-|Cj|}OIg;|zoW3X7lP1i&7!d|V-r+uuDTkzdZ&TTP7lMd&E}J^6;6Rt
zZLYfFgaeMd;QI7Qg^yeN_-#6pB5sY`g(Q4fdXKlCUfcei!DA8#gS9Q(*i+J6m_?&C
zlNjzyAWj!14~rto-njrSvEHn%jwP8V^<B`06O?L6;eewAu?G0}o{*3z_OMd_52S%-
d%9IHJ{s8(t_#(h|xDNmT002ovPDHLkV1k4C1up;q

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/toolbar-item-add@2x.png b/chrome/skin/default/zotero/toolbar-item-add@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..6813812f30c51c4f9b72e1c02936e6ba8ff1f3ff
GIT binary patch
literal 1506
zcmV<81s(c{P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000H4Nkl<ZcwX&S
zT}+&18a*Gw2m>=PLkn0~ED<`wfKU*sZBf$;qq|KL6-!&=&1NrF_rl%mURb@T(L_y6
z%x<>b3*&_sW@%QJrJK?;rrRId%J!E^Ed!O(v;#v6BW0Lj`03319Q6&<uYThQ+PmG8
zJbAzOX3m*&p6`3!7yt7xumm(8Y^W1*6GfUR#tKnVKmsBhqu{zI92X|`9c=0S{O$=L
zjOUIvY@zTCQS?$YAt;3TSrnjGy~iaH>^Snm#ZO>>KUu(*<7>R4WRED;iz1xqZdBzq
zz~@<woD2^fHWx@iWG;-Gv*YL;>&6$O-H6PFwGfhL<8!vHUBA6JxMTq>M;kW@*-D`^
z&t8D1inpN3^N^M-6bK3GRToG?AP`BQXY?EnTxv%sItB`(O5yqczSQ4=BuGn6{?G;?
z+bDEa=QQFE)$gD>uMq-;Yg1RyHP(s!!)<5_w4(i++CTg+bcK!}5WRu~1=R)hc=?gn
zP+3p|5x79Mt=qlou|+x1e7Ld7NMjcjbD9c%g^eZKKoY^}Yv`Fchsdo-C@LhF07#IW
zU!m75TQ;iPt5KL$1SJX`{x%%Hd>A5_FqnAw)bFnhSOu6HuCw7J71z|b*J4}Q?;s+$
z5bnl6#E*m|Qj*go=zf<M6`mR$OY4~r(KFNyrP$T|$IDGHz@!m0cQ$POmfU5_Lv!hG
zG{J?5bBiX2sRk$e(L3I)_s`U}AlvQ&1nX*dmT!g$>E?fr!`vZ?_~m^qu&3RFk(nV3
zMEjDGzumYSW^C_z(IiT*xEi?(PsVcOI|}inZzKM3x)mT_2k^1QfoBgjHi%+{+n$fw
zWse|%I6l95<_B&69xUVpKnnch=aCSF+LAitX6AwdU(H)9>n#E(>S+q#bJy$62*v`b
z8_p`=yE5&k<1viJf|{eUs0t#4O5o`v0=Q0u@a9%SC>V-eOPRR^W@kuqVQe}GfnZgk
z7t{ib^_CtGK{18M%gBe27@rMUGEaqfAN>Gk{OQQAZwrsiPUzL0?SUvQusE3mD=0vg
zJx6CZm6)<*zDQVHm`TiNSF<ym3-hAL;=saS0jMJY#ccahVT$a#-z0AjD_9&5;RuBY
z&)(DmGHnh^=1YOuy?fF!wX5M+Sd&vpFo^@aE(+ez^q78k-RT}g<|c2)@JiQ<=15Xy
zZfRPl-38rO(VNf_5F^$eP&i5<{Gsy@2=2}Lg^AEoDKfXthh<rX+SR^*e?9`^s6~LH
z+ABizjrHh}y24S6Y(4L3t>l@5Nyr`PPIw#zP?CT@(61wilY1=!4sP!45kdd>^jA0;
zJORLf&r@Tub%D%+B;+7a>hS^waq7|;grk!X1^@7$hrh7S0s}NYQm-m8+W#}K4-e+o
zq0mu;@|+3`g#CAtlPNP_*q7v%!IQNdGjlUIeEtYT5fpC!!2`*m7yAB9!Rd+E1U~A1
zUq|6}SEJNbZpm3!3i9Hdl_+tS=~?pkLwhh8je^3iz^;)FivY6=am5x2NBc+n(Ba<;
zfuJ(47OR)9(XS>+Q(4I~Y?-LcuS02G1%!eFr#{7(LxZ4VkhE<Ez#lymu7Cf54WjTV
zg?3-zYCKoB4R%|)o@zH@!w5}Z*Pqwv_>?BiOwWeP?t<HquN%%VfZ1EK__*_*xOk-x
z6yBoniJ`w;Kep&Y>AKzJYZH>zPGO<LmW8JB4Om;Y9=0@_c7>$rKq`>=eO%qbiQdm}
z?80Z5ip4<T4F%(w;I81wB_GSzyjS5>NbI4YUW9OFxZqn+g^D5{JlP&NGhOpvxJiU2
zL+}UuxOlY}k=WEi!<{8;TZeWH4gRc)N!`w}EkeFQfj9X@<j!YNyhLJ0;IF|?0PwC|
z&3tdJtTSM2QgJ*EqC`aQn<ozl8K5#cDYEbCUxJIin*ASN17(*5!ZHpq=Kufz07*qo
IM6N<$g6Hwpa{vGU

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/toolbar-item-from-page.png b/chrome/skin/default/zotero/toolbar-item-from-page.png
deleted file mode 100644
index d5bfa0719bc3a2ce4fc529403f0acd6b6057c956..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 739
zcmV<90v!E`P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!bxA})R2Ufr
z!A*#jRTu!^=RMz<JELQhSp)+?Az2yNpGYc3MHr-Rf?BmHs+G2is8zIz7A;GmjgS#k
zn{udySz>BG67=JY6c|L1R-#TR>fC$3^Y%QEnYO<A)ziynCZ8%{J*E&KkU=)%)_z+&
zmtVwx7hXEDXU7mAGSjx#j~&_f!uqwP#LA?T0AxZsduinT?-%{`$I|7K^S`V*x@X4{
zR485CKB(Qwg@1G<f*>1xHsf)+GU`3F<{J0kR(;pbF3)zyg$H+idfnl-wl5Wkh!vUH
z4Z32YP=l_}1rZd1W_D&^$A($A+&a0e&P?xx0!ctY2}*<#p+qPVN*B(YzvAW<BX_O}
z&u_Y3H_<%_6(Ez^5kf|2eNsa07-VtkTpG5q)`lKfJt=A#LxoHdHHwrHQ9>Xa*%bzq
z7Fz41LKILT(GWohi9|LgIzSZBhb*Zf6R6O}WYQ4GOi&71s9lmll0x6;8&ILOl$j(c
z0Z1T(6Tg09{?wd{moFHNN6PS?$|e>1MxSJ(0Z7o2<MSUneerV-Z`t6cRcjnt_}Jz7
zxw>)J-Zv|>acY@f`(Y@g7GwsEj5NLQo+q|HsxQ5}XSX_d@*^A9ZT9=A{W~j+$GyI1
zc4oqTHx@1FlRjw4XWyPN5i2~l_F3@aBk!0yu^aoRDvXy}8@HCjUVQUsuSH4$T5|r<
zzZOn^?Wfa6y|Q($Hx4{ws+)wX6-HP4zo!S?4KJ@7PG@G3G{CjXs(p*kIrj6rHs7_y
z+=<-=Q62s9FuWa^X~WKgJIAAZJR<H*xg0=}NNJ+`pw{kC<the!YpV|&-~Hvb{{bf<
VF=qYo>&XBB002ovPDHLkV1jCMPILeO

diff --git a/chrome/skin/default/zotero/toolbar-link-add@2x.png b/chrome/skin/default/zotero/toolbar-link-add@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..b7c2b3e4815fbf9f4864ecad702b2010ec6ae28e
GIT binary patch
literal 1224
zcmWks2~bm46pdC<K&K20YHMAPSYZ%Lse&7j!~p(~?S}*ihOejr0wkC;0TM9FPY5x{
zSb?$>D@u`oEI}+YG{_bpfe5jbDs+@eTem7pC5WYt(C3|b@11w%zI)HT?_Qu&BR9Hy
z>Vm;wHbTdV3~=uJu-1PBc4Cd*g2Aj#q?4K9;7TTwWipvSAP|einVFetwHh!G1j*&{
zsHiA_fsteZfR{?86bc0Zkw^r?aJ2Fec$k`+s!%AjS}ovd=lAF2<OqdAfPsN%u<}4!
zS{j{BPf1AuZm={+sZ@d|z@J8=0UpZsKUr`*Jv|+eky(C-E+P#@h!S5;J`qGXCiaQX
z!{bC)mNp~?4Z(}B$I^V5s-pmep4-JZ9|SUfz#?y0xetT_5yB<D$HaT^LTm^ho0OCU
z@XE>xNCXN50!|l@fOsyK3v?0)grT7!JRV;?Bp)0c%*e=?n3%X~kxC>IAj4v@bai!I
z8_Wg5+S}Xv`}<8MlhJ4dCEvMo$1tqv>FI&xK_DH-n~;#eX0t2%C1$g^qVH=Uqs%NE
z8yf>vWM^lWb!DH@A1^L09vK;FX=%9u>@FIo2}?{&B#}rz*p&Qo#z_?!w2P@a!eX(a
zWC4ABebVd5_XAn^`T3v&91cgNQt@~^(Ds;^7z9B;$9R{b^{xDxAr&Pju(*qFwOY^U
zDUFSdHG?Qu%0`VywN+7M5|-6mN+}@~n?&gqQMpQ)tmZ^%ZwB~<fq{Xu8kow7IB!5Q
zFQ#(zAz%RFP@K(XOAx^*iq_TD)sJYCOQ5{GJYpn4*UByJ6_)e})J6m;3=>o^nwpxp
zh1BFiIJ5jrek)g_(VW(i4F*H4O?}g@`?foSFHHZ%F|`{E8A;5bMq_4|ZJQR*X>V3b
z^PFPd)61?HU5@|zwTELaR{na_!3h1CFz3NI>N!4Pci`U4I~wLk6?RnN`FhTSwakcL
zaKvu1y?JAkdw$;RRe-^)8it5?W;QZ&nH9~!yG5+i;mk$5-LN=aM@I)zCdu0TXmWDW
ze|C0uiAAQ|pDp@xzSMeUd`?Vx8$4AtUls1>?cOdj8U>vP1Doy7{hzz<V#I3ZSp{sH
zZjERu(A_ygPoX(Kf&Vy=dttIZnC&a#ZGqSnnW0l-bbh?S?Su#aiyPs3r_TB~NE=?v
zyaheJ=2IlU%_kGg?%$0+jeD^eL#`Nq@aR#gp+Ej%23sU>Ea0(?*IikR!ppCw%_erC
zcE(~leCV$}>rKMpP0n8~e04vd&6O!WTP|_QvtJp7R|U~`u)<#K$6~z`UB7`=qeQ0%
zUS7|Pd(L_xg}*N?FWr6r>XvHv$T?_l$>VLOU4Hz@pL=O>tv&bf`g<D|1C}oEhIf2Y
z^)G#EcP16?-M+jK(Aj<U2+8m1TTVl;GxNQMr#XZl-1u_y`|7FWnFw=`@X6v!H1{CQ
z%}Fvg{@=D!p-0-nwyiO*JiHx=o2YykOWGN@u65CM{kr&Czo$+It13dCg<^Mpwyyzw
z*Sj=b`SCyAtIeZl+Jb+j$jk3dS!tM6R7*!K(k*>A8zO(X-|flpZ_6@T>DI8U?R$IH
hjt)eX89AL!YIajX>y|d$#b_`s7$}@dY$lvS{|9Q=K8^qY

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/toolbar-note-add@2x.png b/chrome/skin/default/zotero/toolbar-note-add@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..9b296d2a30a2ec92bfeb334ebf894473e5273c2d
GIT binary patch
literal 1062
zcmV+>1ljwEP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000B+Nkl<ZcwX&R
zO=w(I6#m|H`ZJmQEt+bRG>Pq)iWQ;6D%z%-A}(A=YXd5RP>LXk;Kqd_t*8}2RB$1P
z3!#e|BJ~Hs=%Ut%bz#9`F{a6kX|ga$jWIu_lfIdI&u4PE?+)*!k7Qt6=?9m?_vXQO
z&Nt`0bMc?Y|L_oj&VNR#BB*`P#G;Gw&wW4?NC8BHq5-Z%u~EC&bnIM6Gl2;HO>s~V
zMKZ#j$i};#L^bi}M-PFb*G#}w1`<_-bztoToV|dcst^sb0tX19nlR!b6*xcv^*q#k
z7Gz+bi69kFe&&962jzD*-+By*P0dEU0tbBi7f6g)l$YNjqR9vVD=vEdQveX4R3yg0
zrBKo|r{W#}#U2$e1{LO^cNFNjRNezFb0;1rW_dIr#{&nXLI)tOnPS8uyj(dQue=A`
z=XK_b=dm8t>}@ro;RY=yO=Ev0J>V9L!aCr@qSFG)D|Wyw7AmAV4<WVl0o)9K^}p&8
zAi|X|-ca~{ynw+eA2a?N5b;o_TF}V_^qgvM>U(iuI(8k;_B~FBMv=bZsoT4e${bvs
zz*n!EnC{vUnvS0)3i$Z)b=)W^2n8ZyqYn5YDaZRxT<DE)z^+b|3|$&I2S^F2OgBPc
z$;PtXKTj^<^rb~;(YR&XR<!MCMqNz}gc@^yFCc$)91~O5YDqbB_~gFQrzbC-^;T7O
z=23zg$<Bi)4EG~IDsy1jjr}M)@TQ5i_p}@FMZbjC&d;MzRJddJE_AfEfD}mi7@iv)
z!!JWuR`^^(B{ES5++`xY=Lkq2OT*v5IFb7nKoMIq`@;^{>a$}@Mtr&QkoaR=FByT;
zKb|oBw)PhMF*A*c$!m=zPd%GJ1nwpSqGtCYY--sKiZZ7#{2i7?&I3{mp4quqxIE<>
zfo0o6m0P$zAO#(5t%g(dBQXw`@qw3YKwZ~!*pTi=Vd!hy6IoD7w&Q`#%})a$rVDSG
zhHI!zhbj;7)O}`Z@Zp6QP+wOQG-W0kdvhTHY=D>CiuB6$%-e$NgP+*HBZ~mu#_cAO
zbX9xw5Q9)pXc2g;?`{t=xImgH+AR_?p1-47F`<*Vf8Sm-Hr59{5UM;7o}QV(zz-K8
z<fQ~62#Iq|aTo98f)N-Q9RpdOeT&c}jO4Cb2h`^ts)U|X-A$fCUMTgQyE>5B*>=-0
z{Pjv6L%BRe^jyMEW;|38M_)P6L+V};?U`|GYe9WOErc4gvvbIej^p>qDTrulk)zpn
zN6&hwGLF1_?-LsGfrz9dpI}(NsKMjew}0!kyP*0weDdyXelhV3ML#T*Jyv{BwEj{l
gyg%?>-Yuhl0FhUI?Z>o$Bme*a07*qoM6N<$f_*&fi~s-t

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/treeitem-artwork@2x.png b/chrome/skin/default/zotero/treeitem-artwork@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..1f61cc722a009c311729c6e03647327620064d8f
GIT binary patch
literal 1031
zcmV+i1o-=jP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60
z0RN!9r;`8x1H4H@K~z|U?Up@k990m<fAe<lBe`>8*+~onCkjM>5FZf|4G0OSC@APq
zM1v?$Bt(^-jus(`l(cjdAn0f)D3FL;fdmqUIDtq8+ws@!-n}<Nv3vV*duLlnb_26o
z>FwK@_y52Dycs?CubYeqpMJ6Ox~P4ka2W$5d$Y08oXgCtK3Ds1Hf4@q)%5)vZ$1At
zfGen|-aG+t3?312H^;E?cwopf2JgIa^<T?*6#MwITOeE-f0qhWc6O{LmAq3^pibbU
z&wtA#9!qJ48HjjJ&#!W-_a{-50^og@y`3fQZ(Kq{l>3)4hVkLsPmJ+vRwGbjP%ss8
zWLlj~=9g{}MG0kGAa(=h&)w(D{2KS}JV!d1%Y!9b)atNO`J70BRh%*gBH6gr+F{{=
z?+b9R1JbZX;x|ab21(c?xOJ8u{*HEMAEAt`0?LF06$R>tKyq)x5MXZcN5px+80roq
z-NS2w+7QEV5)ny<SW@OMtgwFP#ay|j@Kevg<RKI(rH@+Mw7P!*Fw#ASVTY0KGO|5_
z4lxubF|l+}H=^BLrPX<sQQEJNsBUbk0+R%CPcvGbO#swJcpczvKUZNuP{jZz9(AKU
zHm2QO#}E6(8dU}}tDu$wDI=U476gK&cunw{FbV;$0W~9XE+;Y|vMw&#&s4-}Tb@}3
zjT9gt*^F5`BS6SskD3uo(R_D7l}HqI9y5<>r#MHG9Y$uQpy6a037?)TNEMIdBr7|U
zVr3yD50=;!#F<r)?X*gutYOnWK0S}L6P(02Y2(BZJD0~9&N(7+MAE^MD`=R@!I~|0
z`Wa|c!Pqq;G1z{F-r@$4>=VnW{J`zvMDsFq#I8lmB7W=DN($>KDAO`Y0BH7sl7#s_
zgUuJ{_P#{p9$+|$32q3ch{SY85$X1un9kKwSg%8wuE6X*P?8A41=>G+!<ok(Cs{np
zZo7p_;B=bM-`b`7`)z)@c)paLDv7524FzWPfm&bpBj(mtxxCe*9Y+B8pzI71c0#B%
zuo{W#+Or5$8T_*GF4OF=+rqu{y%~SLD#53f;baQ-_6LVRO}9hi4(@~{g=?>TFg1R6
zbp?L@w)vyeqx;lrTw8wnF#MWT6tG4!nr8jWSK;E5q<`PWr`rH%_be<d(~8<hSmA(9
zc;qWt)W%=9f<LPN3~;DiNE$byW3(gnftMbA`S`%6UCB;Nfmv06ao6CX{N7$TjdLaw
z!S(sFy&mjW%&(1M3k6iUF7U?*fZxT*b^f>9{sH*-+{~CWXvY8m002ovPDHLkV1l3T
B=uZFu

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/treeitem-attachment-file.png b/chrome/skin/default/zotero/treeitem-attachment-file.png
deleted file mode 100755
index 8b8b1ca0000bc8fa8d0379926736029f8fabe364..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 294
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg
z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-&H;pyTSqH(@-Vl>|&1p(LP>kg~E
zYiz5X^`c$+%8#zC{u)<aJH%g`Hs@ixWul%W)5U2lC+*9&Fj~fNPMviv$?4$+d6Do-
zTUfo$OY6r(?tE}V+eOf`TWXenuZ(7%PKZW9QmV+7<<H#Oep_^HcG;Wor}g2>yfe-5
zmgid={Z3k(ERKCKrE7DF;=x4^O+<x7did8|V|kn@Au2X&;sJfNy4LeHuKwPeZo4k>
pzO8rLO8p|Ip=x)jHOtWj`bJBmKdh_V<`47(gQu&X%Q~loCIFbEay|e6

diff --git a/chrome/skin/default/zotero/treeitem-attachment-link@2x.png b/chrome/skin/default/zotero/treeitem-attachment-link@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..821bfbde3a7614db66fc015a547431ebe55555ea
GIT binary patch
literal 944
zcmV;h15f;kP)<h;3K|Lk000e1NJLTq001BW001Be0{{R3M5Kzw0004uP)t-s00000
z000C81ONa400000000000OaK4MMXt)baZEDXXWMPdU|?*fPjXEh9o2;KtMo)gM(*h
zXM=--etv!u5)xEYQ~&?~4h|0F<m7{cgIHKtb8~ZAT3TIQT~}9EgM))zU0o+9C;$Kd
zbaZsp)zyA}e!#%MQBhG^T3Y)0`k9%T!^6XRdU|YZY;|>Y^Yiod_4RLWZ$UvpUS3{Z
zU0wP4`TYF+^z`)o{ry!{RrmMzw6wJH^75ddplNAoYHDin@$vBR@Mvgg(9qEM`1pK$
ze8t7ZV`F3O?d^+;i;9Yh_V)J1#>VgO@0**O`}_Ou?(U<bqfSmv*4Ea9goL)Xw#UcE
zdwY9fVPU(wyPlq&qN1W=Vq*UO{>#hDf`Wq1&dzahagdOZ>+9=<g@u=wmsnU>mX?;L
zrlzE%q>qn}Qc_aF!otYN$Yo_^)YR0Nn3#x&h^eWm+uPf7b91@5x!T&=>gwv*+1a6?
zp{lB?iHV6{UtgM<n&su?+}zyk?CiL>xaQ{OUvFqE0000ZbW%=JHUK&s5E(G<p!U`8
z{!$Z1pw9Py?>g=;IP39!_IH|l@|i&^2?xRe00FQ`L_t(|UVYPLQyf7MfZ<&@0vt&W
zNl=N*x}3YaAMWn%7WY3+FU)0k=P3H~Q#Ji|)lf8T>7yE_g~kKm1w}n008kWan1Ox}
z&w*d9Z>eSzSPM+}a}ih2nMzNV5c-UT4p2xFRaY<u0-^NIzYY*auoenPnsCNaV+gsh
zFaQt}l0Tw}G(r*<I=~_qsRo@fgoiQ%SQLb|=+l5q`9lISr9=WUWs(GB$`}dAlr#y*
zloSaXQb^E{LIUUCvZLq~lT(s^B_Vo?O!>}c1lffxdj>#Q_!<|&05bNi;deT?Sa57d
zd46e57JhhzpL0t*AKiAmd{qaoUG-aby#`=h@cM*t0JZh(wfg2Y20SOToAUW$lF83r
z&E}cpqVHDTWG}fM3}jAWm+d}rHQ{C)j61O^iW&Pdd&+fT@SU4s)lXB?6{RqLHeXOG
z(<^~5D$8<%M({iC*}!1K6A#^J;JxXIut%R0^AkL`2TSf7fg6@Q;Cl4TL&!AV0Wyyu
z({w1scn2kV42RM`?@)XF)SaFGPd!3w!15?;qt<Q!y=_fRZM^`xtsg#GX!;%q(wzUz
SpSQ{Y0000<MNUMnLSTZLu+MY=

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/treeitem-attachment-web-link@2x.png b/chrome/skin/default/zotero/treeitem-attachment-web-link@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..aca80be95fda162339f0d1b54e8ac4d35a700878
GIT binary patch
literal 1471
zcmV;w1wi_VP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000GsNkl<ZcwUuP
zZ){Ul6#u=~fAUYt8i7PMA}j;8bu5F$5RJ@iAO;DEnEey<gNe~-MpRI;FWUzt12I8E
zj9->z8V4F+agGlbw{ApO6f-t9G2j%-CT7z@UE9&Feee0sNt^r1quu&@yYJk4&pG$~
z&bjxVW)c$Eb@a#QBuV{5)9@HHK$ieClGOM`0zBq<0{4^ltWWBAtR3oof9nxsfQ$t6
zkAIr|#{pq)`Z&p!ipKu;kO5W*-(2!JwZ9w;iT@ZZc`TWA+z~pfg(bSK2JrFMBSfmD
z;!r>OS|}44GQfmcXvQ%^NTCzNh0chWCgZJYH)NS~M8eygIRj!fCgJm2plVv80jmB|
zG|e<8#;nKo4U0jr+hj!Jz}wX&_~_JCD5}=<)Vp3>IQn$6iGbKY5+bcKb&R=EIrZEC
zjSN^og$WL;h3z77;GNnM96LFjAkm|fsBAW8z?4=a2~tW-LVPeuMvzM-AR}qTB<eTf
z*q1s9MQVETKo5R6MkE9QLBb3sAtHx?NP-x>WxWZ1-U8!cos9zrUfhTezZim|pb3DH
zK<agqV1~pAkmiV7U`wtI4?>HofgaNqq}+AEz)XT(s$ovnAZa`|Cq&^&dke%M9f+GO
zn?H!e77Y9zHQW|}rQWG1SjYizfMx=s%F)9+j?5%1vTl_;kYeLZx5Zd(jKOEV1tzof
zhcg+uL`2dYQV9@&B?2{P0H!)He-hl`!;^-H2#h|SJ_DNQ&ktD^ES|`82I!R)=3lT_
z!x=`pTR>VtbPi-+u&65nO?L}K9mpP;3s!2N8E=8P4n$@`xHfbVH-8(&UH=rO19uRM
z#So9jv1o}Cg{50ixw8g@o^xO6wgU(U1F%}Hu-R;Qcxev2E0?3#?S>sHqM8kiRBoaU
z81d(gVVrI|g2783Ox^b3UN{IN0(btw1<zTW|Mnz2T^-ctIV0}P1aa$@59dAKq1<r+
zD{WJPfVo79JsSVx7hL-OG~%&YtX{nuJ9g|qZEY>~?c2v~@7}$rs;UBEaG;kPVcWKC
zq)Xb75Bc&MR!M<-;WacjH$QLAfMF}5kr`a>?_y%*<>jcTsKAO9D`2<VVT3HprtC?n
zg@k;_m)F?5c{7Kos%q=u!-rjRx;pTA|4)d`MwxX{Q4u*{aBvW9ZEa|8Z%1cmCwhB(
z;q&>hY11Z@xC>FVVIA9EzkVIv-QDQu=s;_0E6$ubL%zI5ad9#7^6~({sVK^uNdl%4
zx%lo4mW73dEQf}MFfuZNNF;)2G|Dm@4kH*0A`l3`@As3WG0!LM^pDV(e0dGACS$kA
z06*da*rNZjbh%tC$HvC6W_JTzW!n)7g|L48deqm~qq@2pd-m)}HX74B>Dexnza9Qv
z$MNdxZ}1voO~zV72DoJ`MiyCyrYIC8N0<SmXFF9@s6gpWh8d6yb%2^66LTzu6bW-`
zb8>Q!pP!Gx&f}PzoCLw^^>UjF_G{;`?BC1y%xXnhSs4hlW&&gP(Gn*);#$XYbaa$u
zX=y3kZZ|9z3$lg7;UHgLL#)a8##jgRCTQ$`wiI@|1LNc47#<#`>&6i@G&G>8sR@mZ
zjW~GlAm4GP(}~>NT&!BPiu-kSb)+L3wy&wFAzxnO%9Sgan3&)irU!GvKp<5*7A!#J
zGdt-{vr}JRAElp8b(%WB?Ll>be8`u!jDrCr@_R)m=(j@PFFgy7zVN|-fsBSnq#~@r
zRl4tVimCq7?*O-CpPkjUZ12P{JRT4K1|)wAjD1)f_;tF#-+kicvmAh6sl5hGx_$q@
z-BZd+{H$!n1PU-CErSY6YIO2L2rel@aOvaRrWcj*oB`|;(ww+Cn~#grPy9U*S^g3d
Z_#ca;NRR>a<_Z7+002ovPDHLkV1gc?vjhMD

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/treeitem-audioRecording.png b/chrome/skin/default/zotero/treeitem-audioRecording.png
old mode 100644
new mode 100755
index 3f23ad9ec4b65a544a3802c692c6b28008d37b88..6b02f1a39586ef49129f44517f4f7f8a1d710817
GIT binary patch
delta 623
zcmV-#0+9XU1+4{;Nq<jCL_t(|+H_OTYZ_4y9<#gFsFCQpN+k3Uq%DFX6q14>#6nAv
zf|p)$spe90_0Q-nr;>{{B?qB5L7|nBLjsn97mLt}k_u`qt1T+x&)x0J!Uj<@FueEX
z``*l(nKwE`QGg^8iKr{XFre4#ALw*CA0BzsE^<oK>9itAl7Gs{X0xCP3rm9JhZc+F
zRU(mi-D<VmPN%badU|>;isDCve=hSkw9RBPQFSyLJ&s1B@k*uQ4hDlztJU22x;WW2
z&RPc?$H8zoB;DzBI(t5!57Oy0csw5H^?G|`C!Ba|9hl8#u-om>@AvPyTrS9DG7t`j
zA(zYD+G!=;T7L&9FAWC6n|8ZxDijLf_xmB0N`cqwg<`P?WG9?>%SBTa^FG0Rm3%(0
z)a!KxBPy~iEBI`s(P*f4!ilHdA!Qee$lTogf@CrYp->30`d~B~)w+mc2d=NLAQp?O
zyu}CHIv9_~49Dr!{qF94u-U9&G8wTeW7yoJysv<8;(y)cfSpby(cy3k&E{{l+OjO6
zg9$X7Ef53;5Kg?i9Q-Sn%ij+Ug5grBh`*78tt}G_21EP{71-Yo0O7=2+l9ekP`bD{
z|7Nuc^*|tu(Pij%J20EgfX>_7_B!FjTXdk)W&wN5%;)pxg5Z35e0=ic@bK9qo)>K0
zuK4%z@@VsqWb)ltQT+3TW!X>o(WI3&@;r}4Gg0nt)EE-qo}GPAXr(jR2`AoS8#iE8
zstCNNjn%rN1)+0w4R>`KNiY?_an2qcy#O5HEJa$L0Zsl3FaVD}Odww(dME$@002ov
JPDHLkV1g@KGrIr)

delta 677
zcmV;W0$Tm81>yyeNq>Y%L_t(|+H_ORYZ_4ypN*?EnuM&n+DPa@#1=sj0!hUW&_a8V
zf|s6aaw+XG-ufpLJa}ozMM=p)=*@#rq2!Q&rQpRPv=U8o(578AeqiHARy(s@#Wdu>
z?D*#Qo1bsy&0{8$3Ao*E(CKtQOQBGJN~N+f4CBPD9<70#!hdi$EQz8hahlC0<Z?Ob
zH%p&sGA$(EUs+jsw!6FgyjH7OO(xSxJRaW{1mOe1-~Z<?&}T3h%<S^=aw8lLZ<k6X
ztJmv=a=B~`g+kjDpXXf@U|ANFN+tAqJ+ifWy>4+josdeUz;3rgyWO@>oN(e1|C+$k
z(voBbg8@37&VL=V*$nA)8iK(fWHOmqocxq~O+a2x)oS&N^Ye2pHOS?1K{A;Hhr<E+
zd>$xHIPvCk{xwnV?s_a1dt0egz-F@n$8it{1gIxc89txywZ&qAXf*ojhJf4@#p&q}
zNF);A_xl064;qa|>Wd)M;rRFnB9U$4DsBk$`+Z43see>S!S(ffcvT!|wHiD@9~Kv>
z<|7~+xwi_i!=We`jV8WY{V8>OJQh)40M%*@c-{zvBbU8R;G$S8e%;#g1`CBePNNc*
zm$lIC_HY(Tu(|00!jXG1FCg6l)!FTK3kL`LUpS6G^LT>z?_+2*>M$COfcC4ahBLy6
zNBrqx=zlHH{ZbFEuCAW&yy?--&dY~^z~cvcJ+Estgy!L4_FE$H?z15L`h-LD5qV;(
z)tb$|<f&$SMC7e#5hT9Z+j~DDPkV~X_$-fX+K>f2ss_Cl?GIWO6YU(gCV_}$W!_yG
zry9gr3HWqLi0UxXVI+WItoXDyaLDq=Igte@NghD^jj<60{t7SvWxYQ^ORw=&00000
LNkvXXu0mjfFfdIo

diff --git a/chrome/skin/default/zotero/treeitem-audioRecording@2x.png b/chrome/skin/default/zotero/treeitem-audioRecording@2x.png
new file mode 100755
index 0000000000000000000000000000000000000000..b37179fd5c2365a4170e069925808a133bcee13e
GIT binary patch
literal 1016
zcmV<U0|)$xP)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#nn^@KRCwC7R!d7;K@>i@i8Y$sNQ_oe
z5Zh`HEfQlDOoi5{h>v!mo1zPMVmJK(?%WCe2jb4+qZ^B0OoD<NUldGqQD_OqpthJq
zlbVO-#-z9BOpKM7;_bqLkI9_*&U`a-&Y2sTD2i~OO_6Qr?d`q(otKvf3WY)|lgW%Y
ze1uRTVu+u(vE5`c8M?f@yyjc2*1H9=+EbqAdrT%%&%nSygVX8MH8eDw&d$y{T`t#B
zC=^;kj_1ElkV>UkkGs|?mCD!c?d|VdTU)EPwzi<Fs|)OQds%;fe|K?lv0-s>krM>r
zBc3MoF99ywkVqsL(6O<$wzjvXrlx9reI3kZGtAG=v!2Fer+MOKd?X3P<M9k0*VWaT
zc6N5aXf(pY!UEuFSWjcJ(>(DqK9U4fDivH@ToAMe2M0QX!2k}211uH`Oixd<p2lRS
zdEybD{3HozwOY{Y^?(6XmY0`vYin!J)YJrXb92zy*~xkulbz;?M||>=B!KOWTCE-l
z27^k>6sWGQ2Aj<WEiElDGc&__8k3#oiAQ|$%c($xb`yPleed@6_Qd7oWpRIhUpziO
z79){}h&eA(!(fWxaG2S>UN7SjpZv1dBHTIwF2rmek4I9aW_TIDJL`amxN}%tUB%20
zK%?OSi;V?QE|;@(jKyMrr-EoS2Ai83P+3_iT>wj;<G8dLa~%o_l!yYrqN8Vn7Gf!x
z&a^laAU^p?7EmbiM66_)ASBS4L&&kRIacM#WD3ZhhQQ{DFIfPuAf8J74)eUGC>RWZ
zPN$=1BTZJwnLxU*5|}~1@cJ}BeDaej5DWxPe^gXFDLOhj!n;?))%rIC1ct-I13(@S
zpZui0MPKc9>t=KFOY!6+0Diw81DX!%U&O%Y^WnmNARh6_PtpmZ(WrZ6#qq^#er2>+
zx*DC%O^izd)M^!eALRHu1!reryq;5NYwMvj-6lR}m^+t%Ec=UAT3Sj4@{s3?Mn*@+
z`s(W&O<wOeI6sfz;sOhHVW9?7^BL^!Zo9_E$390QXA>AFe;^Q$CP3MOX;_AHZ#z1=
zUknWmKQ|bv%hYOK6^%w>ZufWJ)YK&I+_r%Wf5J5OQH|shxK-LEB_-_P%FoZIPv!&6
zeG_6B@nK?ON~Hd3Y@&JM5uf}dJr&t8N4OA^>6ccYu}@yv6aW3u&()}U@hYr?gWYs}
mR@xa=wUj2i@4qd71Q-C9`csg4;^eCU0000<MNUMnLSTYd&D?bW

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/treeitem-bill@2x.png b/chrome/skin/default/zotero/treeitem-bill@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..c0856a9bfcfd2770f522dfa39ad5b78692cdd8c7
GIT binary patch
literal 1295
zcmV+q1@QWbP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000EmNkl<ZcwViR
zUuaxa7sY?)&Sa99gcP)>&;*M`Y(WsDQc&9>2vzV!>Vqv*5$&T7^+6H!O%X)f?}HZe
zp?=^Wu!=}YA8J7eZ4uN|3)-Y5)FxJ&r2jIROlBrC_wHp$@8vMLGwGCe!C_zaxtG0I
zd!2o*qX~9=eWssU@VZQo0Cytg5FnvACcu(hvMle!oJ3Jl5iyQ5BF9Kr?K$?%uD&uc
z8WPz4#n`G0*<Xb2$_0*$gG$Yi)fZ0@s*9i`hu@PZA`L3iYhS(kz`2G5p8xXf|4n)!
zgX8TjceDETc3MHHYLu(SLd_Nl&z3_9rI4BVkckTwPEVG|7i%#&n+h!4kRq^i;QVdn
zuF4dmXY-nFUfi&fTLlS@oyzms(0S%cH6$CzvILc`>Lx@F5)but0WdXZT%I=~1Lxue
z1kT~Omdgg$Rwm=fWgMMt(B1BEcsK`-tzEJB-tNJ(nAyf4O*2}HgcGb;*+ID`CJRO_
z^6ezCfRwbB&|o2ga#a*6#)Ua?sVIo|x9vH}`v)cfSl8E$%s{p(MZn-b1YNmcam`j#
zXF9ROYfW=vzA6ArLNb0IF8~lmhGdwTQUn6A3W*h+82~CZ#f8+gP&x+)B8v$a$c$<j
zaiv&e;QR4Jfx{^RGWAL%1XzfKFX*3rtZPL|DS$}AWJFQK&b=o%J~o47S4_2CX#%1b
ziH^1afH1tC)c!;2-t#aMvP5<(Abo49J$T^FP3N+t8T0~+P6mh)3pig0=Wssf_kGSk
zdk-Kp`|gbmy?79iMhAlSm_TUty$8Tcp7uk1uFeCJg#gPF5CIa|n1E^N(W6CEdIf5+
z>t!tva8e-ojb??G&j|o00H{<WWQMh(fW-><R)V;m`x_4_7kC2Jsscy>!V@qrZDR$R
z52*kLK)D*-kOwke0kCC{-tuh<0woG09;n>70=}rXwa+a(qym?;AWRgPZNY>D2oL$_
z3$<p-wwS@}d^H|IEfA0hw4?>;LQ3aIkL0!t0L&B@Ff&Y6Xn{c70td8u^aN6RBq!4}
zKevEnxTpmM5COyrq$E!dBHym`UT4k$aHUv5W*BynCCCEo7&zG<hQV&cMv$vBp#Ue4
zOOpN`kWeDklKY@N>&V9XUYse#gGdu81>)i-5YK?_NHjftzQo}0B`kIHTJVElMTb}A
zuj#qOged}U+uqS{<Khi}vvX|@nJxBHGIDJJn32mloat%|kVI!LgCshxMkH3RZ0EVn
ztGSpjv+bS3i3!&a?cO?E-vaSOv*MCbsTd}sWXXl%qs37^VsY$$d<_79P8O0}t!KV{
zB;|pm=L0X@M|Veto5lX2GkkjJRC1g0>(~V(!y@}_@PAL2QXWA18;Q|>=D8Kvvc8X(
zpSqtXAMOX>=g}!-2G}vuAduWq2|oE@lAp#3+$?&#a%|mr?_wN2J<a%J9?5WF^m$_f
zk$V?ux=;$)b8v!JJ|1P?p$QHSPjhtSG9%~aI6FPhbiP8d5+czO#-|E=u>W}Ck0V3-
zwx1vk9Kf^xIoY2HqxU3x+GO3jLBq)!<b0eZ(E20)-9FZYfXA~R{@6*a?NO7~DYA8v
z-6KWahPoA5kFXVrQiVEY*3qDN9<w1AhHnjhwBrw&;9nBB;CwfqFtPvu002ovPDHLk
FV1m(kRT}^R

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/treeitem-book@2x.png b/chrome/skin/default/zotero/treeitem-book@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..b5556a44bb7ee3cbb9b2c32106a2e1e7ac2a69f0
GIT binary patch
literal 828
zcmV-C1H=4@P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800096Nkl<ZcwUuP
zy^0h;7_43l6f{-*LD{=RFfkF<Q#cGv_RK^CO*C6P+&AzgJP=_uJWc}<lT9uVLBTgL
zQIlf@BT;t4u21HsXX=_}W_lWy>Ytge-KzSUUWd5h&h~6fxE%m%1_P{|ulfd*7#6Gm
zt%bR;Rt^H<C*0ua$5)d%)G&Y=#@n;obnabmax{}`fHgD!0&&B!fY_S8zGdVG7>-wL
zSJuybdUAhb(>Vv{fJ21CzyWYE9<Jy)A<F*stw*5erN%D++6?ASRN`K}eD2Hi!OhL~
zjWstY1_i=ZUrNuzNx3Ek%&=bIbTS4Fc>Z#J<MFe%sh5&Ip!(2SYFA30X28NmW)^#E
zXe3Xp7P*@GEeZq{T1oQo?lmm`{=?ae!!TzhvOt3wgw!~G4%mCMFMexNzyj2p0t72^
zAyBC#)O+cin41-l3fkcJpCwky6>xF|AAU7ieNc?c`Faf?t$ucR`jl)6*p>kWP4dEf
z$!aw*0%4F_<g$Q4F_^;JQ3Z-nMc_S1UvGAAG(=9@nSYBd0y3+>0C@??9zvGeq=ZgI
zS<zMnLdobQ^X}&#ASJ*2hO$vxqCl!9(R~gm?SQ9;4;C0@jflcrN*q^?$h#~sl_8Y)
z9-*t%FeVl#gsoKo)Y8$j{6x~0YZ^-li)=_jm}>zPLJ~9<<Fx!FwMcb<#UZr%kZ(H)
zb;iqU!h8K1V=A>QF^E`7XwMu46hwuK%nlu6VyT&LLHwfk9wd8&&cMV1g)3mI1yVqM
zXNQhNWQoC41rT;wpc?iB>2pITV%ep0K-g6Ul8$8G&`AlJ{1<7L1r}Q%ne#%&R2^B+
zs|plCPiBWM4X6$xb#e|On7k&lLq|rXDg`V<0m-BnjReWe(8U3@`V$*qu!Cj=;(HuO
z_6nVzg;a}gLkkd-<UY_;h8v?%AQZ7=&%Gt<qVxUh`wQI`n5uvYYAwO$wO+U4g~876
z?(M@2vLz`~$kC2JubRL?cL*IP2K+)BIeL(*zW_KvL;DZB;?hfBH&%-P0000<MNUMn
GLSTYgc5eOv

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/treeitem-bookSection@2x.png b/chrome/skin/default/zotero/treeitem-bookSection@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..70dcd528c0bd008d353f51ce5d6f75ec60202d31
GIT binary patch
literal 861
zcmV-j1ETziP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80009dNkl<ZcwX&S
z%}Z2K6hH6HI7u~yF&mo?C2$c$Rw7O=q+l9!Vd6d_i$Ii!7DecyR<-F1F|_`H=nKN2
z$Ts4H4bngaZA3Bp79<MiiSzWFlfCYn%k{mP$BSC!4=!`gz4zR6_?_RqGXwuU)}h(P
z@mnvMh=7TJ#3=gw%jVxc(mXL{cm>XlT<n;JRirN7OK2ut2cQ;0iio|=vsl`>+o!DD
zK@cEBJCQR`JtRUzodk3s-T$bbDojl`=`|5mDSKIob(~v7*U$?-c5|GM4vzDYfid>N
z52L{EzkcI0!_T?3@9zCWeRm%A3_Rg?U*`FHeu=%X_rwjZ@4ChfCkJ@ns;%1<q4@N|
zmW?6UwmAf+Tk9YmsqCn&syuwQeJ4c1m9TZw2Jix+%5G57#7Y6VTn?Doc8hjnW1~0-
zp>uatg{FZLm(6CC{fmo>mYqtaET0IiT)KwVe2~yGWC3bIM-d841C$x(en*VdmS(M~
z46rPqy1E*?V44NTTr3t-{CqyI_++<0Ct$k;<kEs@Gzx!$cs#E73kwTt7(kIvR|`PF
zgpJ9`Nmojf$t0A+#KeRWV;F{Iq|<4k9l?0O7NK?j*`}ssFTLQc9hHFq>OevRmO(_G
zEnsF}EnsHBfGR>cWD6t%ikSQ(kw}!+016ER0<r)(l>6*TV{>yeltU(yaeW8c+S<x9
zfP}!l-T?t$?|>Ac(4G{bdkg%Fu%@QQaSPn9q1pm_q11i$Q-FsC2#7sI_%{&_hus+v
zLw7LnZy}Q-st=JR4kk$U4i`5uafx3?1no_AQu(tvcrf+`$llKcyf)713lWxFRDI{y
zwkl36nTTaUE+c3M*41tYKN!uu1rS%40N`NDe(-~lk*BH#{2~^Qf>Bro!(0){_XiYt
zwPerGM`n)79<xoCMX_UE*bRGjK`2yVC0Ht$kj=jGik0)y{-6_KHz9qtCOrm98>VMw
z!8DhlP%vR?YDQ6ZIU9>Me<EDz*1#urbY8ejOy^zMVY)Q;>}tQyKPLVWZ}0B_qFx4W
nB4R+sED#LNjb3>SKCzCUc=Wl}k4ei}00000NkvXXu0mjfAIFH~

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/treeitem-case.png b/chrome/skin/default/zotero/treeitem-case.png
old mode 100644
new mode 100755
index e213cd5b4af378b1e85f28f678e5d979cf4a258d..a7d1a2f4a8fc36541916a02813a9cb1d9806c86a
GIT binary patch
delta 662
zcmV;H0%`s61=9tPNq==oL_t(|+H_MpOjJP>J@a-RZ(+gZFA@zOD@7BPSZgc{g@uJ3
ziCSq$h{m8X7GgqSLyWO7#KsUM6c)z9R$Hy?6bdAuWDx}R$9~?t&v@o7@{x6toBPh4
zGiUC*_l}slWx=c(SuwL3Y6XPAkN}Qq;JenC$d`1qr~HbUHGlXlK;`s5tLOqv-DfYJ
zA9^+7dgwFwe@pKAJ{*L&On)W_H5Pw|T_;=@3#(yIds4jI;(VdKqb+R<FtJgl*jM%<
z{MizCM8DZttKSB`k3?K-mJ~)9tEcW2`X`3SU;IipCV6;FdHNv13)*yzEmr&h@O*7+
zZgS7DERmKmq<{H6P0l&mO~W%nmMM-3Fz5xCG2UR;)A0RJdddakw!zhSkpQ#opq=Ke
z4<b+OnM%8EEVHr9Okf*ajaLx}F;MG>4=1}U7;i9dfl^AA@@pmoX>c`ORK&&vj`9C`
zS;T(MK?m`?*$4t(O5yRKwp$y730378_2btbPF`C5F@KAA_!Dm?r{0&?cc)2P@tTlA
zkhvmw>waD&kS*xN@w-<){p~B;xX5-vL&xHd24^EyW)V4k`*@K6$-^vCC;cG?ms=V{
zYAt6Jv~X-73}LAdXgwf?*YkRtXG^4ZPhzUh5vlHW3++iDQvmWpgT01n)~TKt_|I6)
zBE`u}m4B7q8Rf==fUyX~aBs7WUV5ZAa_Za6!unQxf^p;LkF<($&LJ<Uh{&=6er+r2
zf!mKKFK`B6hG=DJ7T0fdw<POze}XUc`P0`QNgChtn6ky4bc#jHjo!K6*4)<NB%7KY
w3EvL9LRc*1R5p`!vuQn7SGV^y{t;jR=LllI+7F+rdjJ3c07*qoM6N<$f`7h1PXGV_

delta 692
zcmV;l0!#hV1@Q%tNq>_`L_t(|+H_M(NR&|&{_a2j?~M7Fw8_*8AGI+HdJwcLT11N$
zE!-Ko3_%L9s1_BtXd@vlLfV9txQK`rEwioCA_%FGDABYLZG6m(<M=;s-}%QZ(k>j%
zJ@<b1yXT(sT{U#ofQ%BeXfi5F6_i4!0uE^4o7Nb}6?C}gcz;Ec(f-g!@$^4q%?7F(
zPo6u|`K-rw(JJx(hWXcgpC8~N{c%6gnEn|w9JXytEd)(9arI;a^MUr7HoHl{#O^Z1
z)^#_G#|(vg^sDuy`jzi_D2u7pf`cBem6NxP{(%7b#7}g+CJ*;IuHM7oF>ScSQuCe<
zxSqB&H@O!z41cw3MzGBJFfpfTR|F?Sh7`x~(eC<4ikH}SH9RjcUB?F3Es3|og#^s9
zmUfJ{-VQxuS1N7Wk(H%6W&%s%?Qlhc0Ow1iYUD_R0r3*^7C4S$7IJCHz?679Tv)`N
zWoY61npwmX)IlxdN!jpy&oq_GgW5_|C|TMTC+vqh?tctkSol7HSTKVZgF|l$?0d9I
z8?lmrL@={!;H_J6Awedur~9s79{t@{wsD&6f`*R7q8ijjWSvE%`nKRg0)o3(q<Z=~
zF3#<$P^olQ7_^F7KoG!i0w7VTx)yVK6K9!7g#;tx!2SeMEqhg}vBp4699YQ%Ii<l~
zLz;E8DSraK84DStsLWLIhsI1AxFrN{$BQYoodOQl;l}DZnprF?FJ+z2$*INgmIwy8
zE`IX;SM<Fc`=fs;Z$xBD+tJ^lhOXToJWCBgL^MA;L9OQyFV`sJ4}H}C{9X4`eM$bC
z$el{{<ul2TtfVDIlX`x!`{sD{?%HU)syb@Ivn_l#AFSoGPG%)zfBd3FzIC+p28sVm
afB^s>?r!9PztaW)0000<MNUMnLSTYWA6J0@

diff --git a/chrome/skin/default/zotero/treeitem-computerProgram@2x.png b/chrome/skin/default/zotero/treeitem-computerProgram@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..a24d7edd17b38395557f56b76edf3b755ccc0d9a
GIT binary patch
literal 886
zcmV-+1Bv{JP)<h;3K|Lk000e1NJLTq001BW001Be0{{R3M5Kzw0004oP)t-s00000
z0000001^@s00000000000OjT7<mBW=mE+{(<T`!4N0#FN002dj;|>lEM3Lb-d%Q%C
z;W>D|HgmZD|NlUT-b9h&L5kl*lHx#!-$s?=MU><4@bE#2-}?Ic?d|PGmg7W_;raRb
z`1tss#P33k;6aPvLyzG<h2EgX@BaS&K!)D;_xEI{=tY&|W~}RCrswnX^Zfk$^z`&U
zhTih>^6~NUMU&$7_4V%V?(gsKLyqB@zU}?}{rmg-gu(D<tm|Q<=47bpW2for>gq#~
z;pOG!p2F>Ct?Q}I^7i)jpTX{i!tp|l;AN=kh{W<ji{R_)>tUnjrpWMz!}4IG=VGMi
zW2NU|r00Ua?w`W$Wvc0)#qNQ>?qQ<lr^@l6#_;Cm=7z)ZWU1+$!tIL2^oqvwi^ue1
zsp@B}>YK#xg~IS+rRRgd?}5JVsLSz-#`J2h>zl;zn!)a5rs$x>@1e->rN{4Ps_JR3
z>xsqlXszpIsp*@=@TSV|?Ck7<zwaq(xl{lE02OpnPE$4jFghC<5by7R>zj8kh&X_o
zfT5dEoLmh600D|gL_t(|UaitaliV;A1Ypf1nay(O8DW^2nHQOv8N$r;&(|Q?v*mK-
zlD@w0psp6O$#D!La~{~#sKAbpg}?wIFlAs=71m(#;XQQ!4v1!(USGVN%M`_m3t$`z
z13*I&v*lbt769VPNuMlwL9~%|Dk4)TRsqUb5TJ>s(;HWW2;jtm0A2Xvv$;$Ga8NJM
z9_mydY63HEJ_%4_>EAt7{up4;%?knmOM50FMirM19=lUlLJ5HOEREIn^(qwthWOOm
zccotd&qFus>A)9KrHVm6|Kp;~eg-+mweEZ(IEAZ-8t6~zcYsLXV=FD4YgLLG5T-BN
z?0dlZz`T65$>Ay*D1G~WO}`;vP1^XoMd4L6Fv5Oa+6x_#`}WRitd3W~EgpG(o}Mj4
z6yR6x`CYOKsre+-eUS)!lJ8vS;84DkRrD>ME-bc!3;;*H?u6^cDmp;VmV=B0KvDVd
zoUxnN0Lafs96*fR@dq={O@cp|B_P5Q5b-Yn{}I@cW$Y?&SPHx27CM<~pWSq+N&o-=
M07*qoM6N<$f|Uc{X8-^I

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/treeitem-document.png b/chrome/skin/default/zotero/treeitem-document.png
deleted file mode 100644
index 0212ba5627a631112c6257b8fb49b44652e7fb0a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 373
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G}
zXKrG8YEWuoN@d~6R2!h8gaDrq*Kgmxef|3N{{8#kzkmPx_wT1qpFV&7{OZ-Kj~_q2
zfB*i`qerJtpZ@aY%i+U^U%q_#`t|EKZ{9q9{P_9v=SPnoefI3xhYug#zI}V>(4ikc
ze*F6N>*vp(zkmNedGh3$GiUz%`Sbt(|C5`Xnt^sHlmz(&1G)GBLrjeHTcFx{PZ!6K
zid!M)ZVDY%;BW}+F|GdY>-g~hf1?*mdheN^?_oG$dvxzR6(xm}!qfklb9*egDq-v=
zUN<LH<i?_{f2$KB=EpL+Y<aNmXSB`&;}f$#n(Zk&v2w@D;6|=5>)7}>E-)zmV(!pj
yx$kh|YP8o`o`1629(+8u#6bUJ{H#>r1cnrMi5q5X0-ge$!r<xZ=d#Wzp$P!jAJRww

diff --git a/chrome/skin/default/zotero/treeitem-film@2x.png b/chrome/skin/default/zotero/treeitem-film@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..d763fc5c4629ab0d766483eccf06d115685a7774
GIT binary patch
literal 830
zcmV-E1Ht@>P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60
z0RN!9r;`8x0`o~kK~z|U<(EBZ6hRn<pV`eNQ8-UD3h@U?EDkNTurr;FjUtMmD2Ro|
zsOfA}kRaFu6aoQj5er2@L99eOJIh=W1o7vTLnBD`ayL8kS-5L<?{;r@5p4Wm*qOO+
zo_Y73Wxrea-$QjyOioT7R7%|zk&$5Po$I=nr>Cc%7Xjzx^mQ(@*3O8?_Q=$zwRQ&B
zSwuiyPL}}R_rpaGg6nZ$$N2cTUqpcK|4EN=I`fhoNLu(e(Ua39z!(#DpG4=^pSkN=
z0SOzceJgNt+c^eQ3ujFgC~@I>%_MO;!$}g5)NEukD`4$vUj!DKy8)2)XAnP?lj%U@
z2x3upC-96xnLP}13`Z(4H=ZsXWpr?!wfscP94VMW4x9`c#u)mY66;HYnEsc{Ij31+
zG3G|SJ<P3-H+Z|emlYXI<zzY#CMl&31BeI!Zt#1>*?{NNsXJHL(w@b!n|~h-@J(;z
zZhZm)j5(3W$rKPdf+I-_6wt50QA_+7xI(!(g=4qH9?F)<=43jM7Aq`KaulutrQXwA
zcZ!k><1Syqw)Ww*!E3|X3{D;auY&6sfEAyXd`I(zl7c=3t`l6<7u@n48b9u{90(Xl
z;baPkSob=*aMy-LFx-@KFP72D>bvI6!(>jTfXKsgEjnNBtE6n493o#6Ihg{|-UBZ#
z*7F@|!RY0{KZ)D|c3*u~s1_VP`!bhfU2j5bE!J9$F;m8vsc>Ah7Nl{CIIurDE?NuH
zIJq6L){X@YYi;3Lkj5$EKw{*r1tJG}a#9@-k+3}qT1?cRTHySy1zLS1_HYWc{A^CD
z1EEbysmFn!STV_43$i$=0z#D{axW&VU@hoR;baPEx7&${MQg#c*<?<p0MGLh6N}aY
z&zsMc*Y#yotyX;irPLt+5$XA_HgkgxPOVmp-E@}&&1N&~{_XcbE>4#NLqkLFfvvG5
zr9LzojgijWUXhpM(j5z0>oKi$S!<2f`jgiByw-ZLh=9DDUocm|kuveGi2wiq07*qo
IM6N<$g3v5@JOBUy

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/treeitem-instantMessage@2x.png b/chrome/skin/default/zotero/treeitem-instantMessage@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..cb22703d2790b8dd2956079e474b17f6ad16d396
GIT binary patch
literal 667
zcmV;M0%ZM(P)<h;3K|Lk000e1NJLTq001BW001Be0{{R3M5Kzw0003XP)t-s00013
zhqzdWxLAa_Scte)h`U*Zyjh31SckY+h__dWxK)R^SckY+hqzdWxmkv}ScbS*hqzaV
zxLJm|SckV*g|}FTxmbs}SBkb-hq+jXw^xU^SckYyiLqFRxL1g{Re-8lh`9j&|5%5(
z|NsBu?*8BG{^9NZ=J5XK@&4NB{nzOI*y#P>?f&HN{@LjL?eh2I?*88F{{8;{-s}F`
z>iym8{^jug?D6;d`~BDF{fev2>F@T8t<L%T|KsoeXOh0w=l%Qq|FOs3Wsttx>HYQj
z{><9x{QdsC&*N*A!0z?_+3Ef6^Z1gn(Z|>4a+<^7?EdKT{^jrf{{H`RnZw-c{rCF+
zh^o!<_W9`X{@m*R>+tsc{r|Pf;AWA&R;Gb>0000ZbW%=J0PF4@tsWQh@vCnn^RTWc
z?eMHnxkL7mBdUN^;|<ha22BB)Ie)<b009R{L_t(|Ufq$^asn{`MY9V93e?@@CRtzH
zsk^(||NlidOdA$b`rPSxJ?Bm`3HdYhMKyGx4W>d~hYIwF45DZ>X&22$^vfWQDph#J
zhztNqub(Z`toZ&$jv0o>Ii)~HU|D7*@Hxf|&*S-`5(M*`ulW@(mS5DMH5Z->Us8hB
zoQZk99C%v^gqL&M&M1Mro$#lwqXhDHr9C_2*0(x>G_v%Y!rMM`>&^+SA|ZnTG|p(7
zTj&0PX2VZCq$9-Ix?iZhe_%Kg{_eQ+n@`)don0hGg;yEF!Qs&{Fg`(kB&MBTTw-!+
zn)F}>chF~Jq!)9*d~%^J)B_fmmdP(9S60dY<P#uDLXcitt!)4R002ovPDHLkV1ns!
Bdout4

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/treeitem-interview@2x.png b/chrome/skin/default/zotero/treeitem-interview@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..654d4c119709cb2a719b2cd0cd8a85c253b05f28
GIT binary patch
literal 786
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U~~!a32_B-BieWT|NsB~n}5$f
z{Co2L-@VuWo`3q+wffwv_uqh0f!#a9+jmB`?F6zTT6TtZ?7sEtACMi{zVi;4@!;LR
z+pqpTeg_oXp3tyAqGLNy{iApPLV@brLAoN_cf9!YFR%f~-d?@v^qWuLPu=@mv*`4v
zZ@*%@cOSq0Jay8(cb|X6_3Y_bbq=ULynPo$V?yuV(3Z`S?b|{dR-L@_IihVxL<h*U
z*B?L*3kR7GLmfNbefka(>;Q=Xy#sUr#5-N9&jP)6<Hg^%pT0kQ`|tV3e{Vj1fBF7f
z$Evew6Zc(t_6KMh&?C2B{RO%K=$J3xe@)$d>DJ4?SD*d8`SS164<N5Sc>C|;*Pj#C
zUjPQq_2++IeEfIq`QN**|6P9i=hD+ZGalaD1`J2Hk|4iehW#+mB(_OogRI>CcU$*=
z1d7e%Sbb@~%DUGr`^6ew?LYo%{~w^>@BQ1|=6?PqUCeg;?b=WKx2*Y|@nPHkFL4E1
zz7+#w$lTM#F{C1H>qXb%!v+Fv52qeFlbV*67Sq1+%$fiH<JKF6DOrDA`~GXS%J~xv
zjP)~Sa{Zp}D8{i#jg?*XgYo+Q*`LmCQsflMX^Fm-bX&;a*w2RJk4vm#*KNz&E7smz
zd`x7)xxDSHD~dN=Wx8T1wwb}OzfX7J%6<3dNiDdXZG2-%g$u*38j0f2vmswutXUW2
z`zN?=F6sMSaDdOUbw#H9(;~IcGtSyAy}a~NvEBO2jtl4aTxJV+zFnVj(WCUM4Oa0n
zLJRKCHE6K9Z!2JMFKJGLl{gn~LQz+P)&BZxjdF~o`|PtBia)bl`T2V}pV*=e9j<4C
zSc93?tYK;~EKg-~t;$*)AoG>u&YeX$woIE|99zb4eR+}JTNejUcK!7`cC&kNUFa`w
tJ;0{0t-L|j!isJ8i>ljSUjJVhzw|}j1J8@oc!80^;OXk;vd$@?2>`6R#v}j$

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/treeitem-journalArticle@2x.png b/chrome/skin/default/zotero/treeitem-journalArticle@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..c07b11a327f723619511bbf53bdae3f434cbd02f
GIT binary patch
literal 560
zcmV-00?+-4P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60
z0RN!9r;`8x0p&?VK~z|U#g{RU+AtV~AG=3xDn+47bvkuns2C7a+65t4Z{o*R-I?gZ
zf?#2(RH_b0r~^ZFRCbp*=cG=YINbG>toVyR<$LVci50<<dcb?&mh0&|@Utr6mDT@n
z<>CNu00o@uBqu<kucX7_aO`%wpVH^PD=R9mGEawu5N~(8-Iq9yZ-9H?&Y5TR69BFC
zS93#ajZ!LiE$f?W9LE40k4G+-3tH=6qtWQ$bUOV3exxl^<q8NPvL>a>#l>dEjiM+b
ziXx<xz0GFxIbDgn;!1ces4C`aMx9P4YeI-ph#-I}7#BbZ1OPWafaP+DQYz<lRlHa%
zasUPO(!G$$3t(mmpp^2)P2~lcOeVS5_hy{WXXkjo-wy*Q%Jy1Hna$ev-!)z)FTiTG
zs_nlkp3mp)0GjykitUvN0!Wgibgb-a=;{XpRLRV)?w$w&Sg+T?{wt-J&1RV`K>%h}
zA^sQ7haiCQc<f67p7ui%|7!u%Rhj3lS75u{2K%p+Vmh6+1F%m$X#PF$eGR<;!{N}E
z;*`A?TD^v$DxMj^0Q>zu*nh3{Kc{J9fHwY{xD~))Fz}_c(zE>+*s5BE7Xhf!e+RJl
yz#|X|AwIr9-AB{0|BinHuM78{tN6FH9)AG^{WoOepS02d0000<MNUMnLSTZeCkZG3

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/treeitem-letter@2x.png b/chrome/skin/default/zotero/treeitem-letter@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..412bdfbac8220fabb249e5ca560596a088175be7
GIT binary patch
literal 1338
zcmV-A1;zS_P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000F6Nkl<ZcwWVp
zeQZ-z7{;G-@9l>xZ0*KiFxHLnQO4YKP7zU@iTpvLf1n1HU^0{_#1Q|%NKDiaG>9KC
z{1$`&#uxz=!iOd#kZ6L75sXfUAe6SS@-YT$CxdnLp2xN~<>ubGISS}6IXQ3A^PcxP
z=Xvk#MXoI094vTi>#+^Xw+7dzW8{c}9C&+2Xr|&6e@d_s#9XQJ@UkzD&O{CfTm`T1
zjQAWnS4+xSngZNkI}9YT`_~R6E=z#iqFwHp|Kgn5&g(9qX<Kl*6v{fC^p_U8@L>IL
z<mYKf6Tg_mwjWO;a`qx5c$`u^wRCo1&vg;-!RGcM33vAjNjwb!anD3ACXe$%*fL3A
z-{JGv`&$Q+x}=2s#Gzu*l1HmA<Sbz2_D}<X^(4j=<Y{=Iz8E8YE(}E5xgKn3j-sQh
z7bHVch`Ddfne_ct33&ILBd(;by-8vr38iYZ2h(ed;M5chf=oYb-+u}Rf-#Vg0N=k9
zbHDK3bK?{LDq!WV<F|uyBPA!fGzHUdDMDbB2f5G^>B3jdQFJGgAaRgVG&aqv+5e9M
zmTYcydh>=XmE<ClT6eq~Bp^x9IEFDZJJa|bw5}sS^j(+daf4(M#0p=&<CRoz^j;Cr
zv@3M0fY>M{YJ~u%2E6#T`GmcgF~d^KoMEoB%rN4|8^&PQfz!CGOOR|KMB|6g)cun3
zJ3MFA&d7z8JHlMIr;Vr1_b|=N8(R3%`W9X*^WJIZldGDUCfwf5C114i*)>0N!RiBl
z&HwnP*@~26tt35Fr5-$S??{wny4+B&lekuN!v>@&FV4f_hXR;9-UpIHNUYT)=_ZL8
zb;GQQk|0bz`UCxvlt5QPBHklYGc)n$Gt7fXnh9>FipKjY@WY`FNFq<8;g=12V(#d&
zzx@G{(6Y^v<<-wxk?+liZWA`Utk=G=Idnp1Vsil28(8*r2;r0MShMg>0A_P**^bWQ
za5-`ATnqvNNh#4Esv^?ED5w}k6`fEG0T!W}svy+X4qv{<a>FE`*e#eip$v+uLQ@0=
z#uVbz6k|9PIMO2(XAuH$stQ~#2d37ILlznqK(SenNv@vg2O%=b&&Cru2}yIhvj=WX
zg(4J8s~c|$8^D6h$@4uf1S(6=a<~mm+YaIRhpRBS3o)(f=t^MerWPb6aaWBW-l1-o
zm=<WXb-QYaMA=9mI=e0+812Aon|{Y*)BG4)G8CFRu#%)s9Ex^f!`>jedy=S09c1ii
z^AWdOph?1Z1GvI%Ri(I;=tbmA3~P4>LEC$tu)c~(TGmt)7hq~lIV{*Mpv?mN2^;Dw
z@!kGo2)D<O)b+kauZS_P)v2lol=|S&oH%tRj<Qi+Sg~6G*lxfi5{<zjRLp9qLQ%m@
z)>HKJpRN;-G;$*+<C*>`FZK3g0gS-f0|wzXV}tst5hyHhW3VW~5Kvj>&BURoA);cm
zcMujB?T%w7VwuFr)g`IoE?g}t08(I_-v>nq1lwYn`3`@PX#uhp*qZR@@mMBd%FRac
zoDqZyfeGctO&m!bYG13s-PMI4vKH9hgyCpBvv5ky2o!tWxE>Hdpu!6YV&B0|Lx5?4
zwFd$zwE=$tZUi-zg?MDjFw+9EuLTo^E4cBPkFsJ~@Lytn4~WH|wzf&iQp<;=J%$<g
w`7$0%jBISpCwW4VlnW$z@_#5EO-d~I8@?1apz(+5O8@`>07*qoM6N<$f~t#qN&o-=

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/treeitem-magazineArticle@2x.png b/chrome/skin/default/zotero/treeitem-magazineArticle@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..f637971bcfa913b975e9bc4555f9710e644ac97c
GIT binary patch
literal 589
zcmV-T0<!&yP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60
z0RN!9r;`8x0s=`yK~z|U<yXH;!$25)k%GH}i;5_Uu7aDJLkDpX9IA_p4n+|E0S62I
z1tP`8!ATKZD|YB6PGUg^i{hYG(80a7z0V={BbQt*O-u{o8`|%3mwR8|`|{-q{C7Aa
zSUb2`1fzWr#y|uD0R)(1J_dmTF#$kGOaS4Th_=plvn2rNlc_KiyG`ycr*Q`;3fhcJ
zfM^6nINqL3Q{ez|g)$gnRE(7Z;um%q#1#{e3P`Crj;_AaA>`j1a|7xM84?gar%7s_
z<n<Cvz-+<fV1F!f$I-{NkA{z5=Lof+Q-VZ@W5MHRLtBytc`OUkel8*`P?PJjYP$dr
zkJblz&<1Q4$PWO(!cN(Ee`zlZ09ZX;j>UVja?be)#zrLjIY+a_tQ#_xR4!d<RRcZ?
znr%0M`I%t=K;`yL--g`z>8S}T-9zmu$lr+t-z_(8^TlE;z!+1BTOih{#A8~};!^u9
z5f((fz=Bp;E$}43Ef5Nbv0BgMem2N;9{!L{sPEL~nKOR9&HNT5RKVBpGWuNSm7P=p
zf5Qv4APT=xz*qxu&jLxG0=EWZSa5OuV%%6rTdm$lXRGn2Y(Z?;El@LehfCIdE;lO)
z6VNT_^UkDnB#ht>wE%U1hH{0nIy!q_oyM3vz1{o=#vIeD;FStE#PT3|?*Vz85zD76
b>>tJtptk$cJ$h7p00000NkvXXu0mjf*5>~$

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/treeitem-newspaperArticle@2x.png b/chrome/skin/default/zotero/treeitem-newspaperArticle@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..46b372441b4d74df2e9f9305a2c6937e72c4fa8a
GIT binary patch
literal 1456
zcmX|A2~5*x6z}GA9s_m8Eny<=Ff?-k6X$_jL=XgKsd#RpL$@GcBG)u91?SYM6GW~e
zN7Dm23Y4-QAgmN8Q0~*lgIESFEl|)NwxvS*|Cjy5WH0UeUVrcV-ur#O_w`m7J;-Ib
z+j0tp;t~=Za1iT;H{Yd;-~&q2+9{NG8^UOZ1M#z^rKPN_ti8Rxy1F_mD~rWq)hrmB
z&6dmM3<jgEt?k~udpS8dOeV9UqCz5(WMpKtwzg(wX5PJfH#ax8pr8QTDl04V7fdV`
zS5;LtH8qJuBB@l`*Vl(qd3kxgy}czRC1`<zC@2&PIUG)7W1~PIK#U{B#l_%&puWDo
zyu2KZkWwfV0MQqukOGK;$O7!?=>Y=Y-Q8VVTZ`h@gA}gA<MB`v@!M2gT^%}t4^r5P
zMlkRM=jP^S!~nTmE{+Tg41g8tfOBbSDPpuh3|T-1WkCQspcH&jQPG_{ci{PaK0FK{
z)PRRF;8R#wi2a?Noe&1S0K(809=bs^umVY$OokW|0mL?R1c*30I~%h1_xHm?H{fcu
z`t6LMA)3O20LJmZ-Ci(&Skuzd($mv58VycOPEKmITBp;A%aSBHHa4bGsdPHs#KeTr
zXdE9OpPHJA5@>K=P%@cJBO@cDqoW3c0fIo`>FH^V5_5q{QB|YAh&5oPP^#l4lb|s(
zGt<z}@K~v898`5aRbfEShez~!z1?od<6$+A#8f<YI2;(+8U84w9vT{o66y$ofUx3$
zaR{r?YCE23qD4B$_3G6t>40i@c$h6$V|<DCU(C+VN(Qvi0!>#}7v=>$w<|8F@OF#O
zAEY0mkOYZZ1Z^kjLx#SI2-0U^@h52hNID5Wk_aM*@VEO;m_7Y%bIv)-+~H92g^m2g
zNfNf>p|(A97UyTDY;*C}=eA>3(qgjMoJO0H*gb31+laXYn{nqd9gQ&io7Y)i61$yd
z^O0H795UlelEz>wTEIJv)@4qE(MlTjS`G9W!sJUm_36g7(**u-OF{zt4*wc)>5(O6
zogbw`?Nk5kh3MuNE=pnIA?5v8e9kpRcT~nIiS0X^`V0}`d<S9gPi9|Wztdu0Nqz58
zxQ|qsm2^Osm`&#~ePnSQ)(&wQH8Cv8JtF=rJ*BZ{s~2y7R3wKR^W91BR$*iybA5K|
z#ck)kj~Qx{yW+CFO^e;jSXuQE3XA=(HAc_aBaVPnzqs!kZbnSVS4SQ(Fz#=?6ngs)
z3x8=w+RuB>yILj$bzio}kIj~J)F0rVtopYr#rU8xulgTH__4W{=N@|N6aKWYo8(L4
z=AHRUeU0>W;8*K=FSZ&gKm1xdzJva`udhs&<QYsom@nD2`Pyq=4}p$p9OT4oxpCAX
z{C4f+%8>n{tqGfg!*XN?n0t0zpdG!cpSpb6^>ryv?q(YGq@I2{Yv1r#&IqYdY>Jrp
zO+4nMxxuJ>;#%Gn&5)km$aeF}@i^_?tB4`CeXz+jIWMaJ#KUdz4+_jbC3&WvY>U^K
zE_Gi||7cOo4-#UH`r5q3#jq!Cv-hpVsr&NV1Vi)PS2kEzv<D{gnZKK!)@*TmHlHv^
z)hugwxowFZjuf5!dv#<g|Mc-iVU7B4XyreyTvw3EEh@C_{<t=o6V3`)HTdLxZV*+^
zr6m<`b0UM>u5^~U@7wO_vER2@D$M0sFOp|QuCshn48-D9g7kc^6>1Ncj^)j)q3RoW
PzLbzadO(f;sjL41M@E1T

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/treeitem-note@2x.png b/chrome/skin/default/zotero/treeitem-note@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..1998973787b65dd642e61138224e2ca90fdbeef2
GIT binary patch
literal 714
zcmV;*0yX`KP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60
z0RN!9r;`8x0)I(FK~z|U?N+;P6G0R`o7hPl3(<feAq7GP3euo-AZP-jr%siE5-HyR
zACeECKvW5Z1O5jDS@?v2l!CR^p1Fr&9_!s1$GgN-_*$#+%+AiabMCow2UytuZb@}O
z|9DTT5vX&Rc2sF&<2fJ-qyVBp(Ev3lVq5Lo>-+r@=2F#xe+dpsz(6Z-z=E{5_by3p
z+0G7M7$;^rV0Q*`t`0aRW;<Z%1wy(mWun1a4!GE2&J0ikQcDAt0Sc(kq0R^9V`>0a
zP*kRG$Nc-!n3=PBb0149n}A3Y26C7X$i-m3U(6w@&bW0nP)me13jmt5X#hsg(xlTg
zPg4yTaPf=9!Bhm?J!;|``3ns=&pr5butFo%Im)Ipn`*$Np%v2wU{!&Fs_bBM4VdHg
z=ZAw}a?I8rZW(q;0xg^-1!N-)xU*f=a-aY&XNwP6QwDrtp+e{0E;@G}MR9)}z3~nZ
z;m!*k2z(aQ5}~VVRLH&^gE~W}_cYwN7=}0@Jg1HF!DO<@RmU0(*wTqH0AQH*0U4vy
zds6XWY}-k?V>+-5xRPA4@IGLxR_E?BP!uQ%S$cvj?SssV$G$7l)9S`OP6ti{b*rJf
zOmrW-1es%a`q41){RF@WYrV%62C4^DnGHG?7}r3A0XrGQ`u$z3+}bFZIQ@)a`U#Lx
ziGkA2y$&1`G{4#!@Uapkt*f}Q^BT+DBV=EX4HM}Al(AhLSlxUDxYBJ;J<~J)llBc0
zhAA2dv%tlQ1h9;xbq(F^Js?@b?=SCcI0k-x(%uLb4Q{&RR1E}k&kmo{T_7pCIKiYi
wOyd36MKtW+emk0RE1m@Be8FQ3ENo$a0I?v%1{C>;*8l(j07*qoM6N<$g54fCZvX%Q

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/treeitem-report@2x.png b/chrome/skin/default/zotero/treeitem-report@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..9653b35523492b1d51c4dc599f4892f05fd7ed2f
GIT binary patch
literal 1005
zcmV<J0}}j+P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60
z0RN!9r;`8x1ENVpK~z|UwU^IpBt;a*Kh@o{yBelrf)Wv;8x$`FFBuX<5D`SslOpI@
z7)21lKVU%@|AO4at0#pW{DB^$EdJQV;6cH|9vmeB!5n(JV^3yws>(xmS66q}OwVHW
z3qwuURQ3D5_rC8<m7s=iUPLPiT7o^k{5^a1wf_?n;7`x_lP*8H_<sJl2s{!193CFN
zskQ#dwd&}-UdBo58|P_V2(brTbVtBO5rw;iARm7RJ_Z>7Jm_l$eiyVVQ!t%QGd^0I
z&%EaXLWqhnAp|QcE7iF=qpx4cM0n{k$Qh)!G9kY7-K5oUn{mJp$WuV82GVzXXkGQJ
zZfsfOF0^aFLYvojY8+e|xH;%+oom1<!@98#2mfUA=zL8!>TEJ!50LG<`uaoj3GD3b
zTnDZLeDyqiE#cBurh$4Dlu;;No~NflMrZBAtaV4DRRe#$WBNcf+_`}#9$s;6Gx+6J
zgw}d)Dgx)M1v>>c5#wR&{>6=?p@H;f)(3(x>jO}B;)($C=U@Lw8sXMCYdbv)3D_F=
z@;UlS!aa|c8n7c!A>t65(EwD|EF`c<1H-p_#sfP7S6+FbwdC4L&=6P#%hbD+5-DY4
zZ?V?*eP**6p6Ai+cKswtWJ3f0-Wc@J5OhJ=f5|lx?|=HYBi!?Q!If9<M+kxM`vgJ2
z#>U2lBuT~%4Sexzu7Sru&D;?XLd+H0yvCHKDM1hr1Ob!DgoA^FZ#OqL_gXb@`c|m{
zJDeZ9_Mmy5PNz&J6UO5)TU%SM*BB&8!e}%?sjS4>HDIM+k;s%%&iq%LIXz`G8X=`*
zI2>NH36vW6DenWTWgj>X6rM{d3B!>6{ryi20b2u~KVxY?mYr~!5}Q}=Ns<sn5lSh-
zFl23Q4bSt0A+S&b{a&My&8u(MyvsO%QcA-z=YiU(c$wx>AdX|AC^BI$j00$$CAg`9
zAG7m7p#fcxm;)h%Ar%CrrsFs^IbU5}tr!P5J3A{0*cuo-ot+2neH^4DuWh&Y_OtK%
zbUK}i=k>7LNYiv?2rSgV8@*N$dY*^x`v@T##@E-^U9TmM<EbIA2+REEd!9$9(=kTF
zFl^m(a&mIpCSWvh`oo})s-6eYaD0565po<zi|<M)j*gDZ2}mhr#$sL8#x+qC-3G_K
z;M!B@;zDXJr!#o+v)>w*k2@LbbGy5{<-MSSn&(9hwzs#>`*sX4brtn}z-8dVT`*WN
b4h;VT3|$C^aUAdy00000NkvXXu0mjf7Fy3)

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/treeitem-webpage@2x.png b/chrome/skin/default/zotero/treeitem-webpage@2x.png
index ba7bc2ef7ec2fb2da60cff2e720c0dd1a09cd73a..87c1f8cff4668a55f023c21c63e9cacd6bd8c09c 100644
GIT binary patch
delta 943
zcmV;g15o^m5XA?OB!32COGiWi{{a60|De66lK=n%dPzh<R9J<rS3PS~K@>grzTGT{
z|3EEl1PhZ!3sGWhQfVha^be#HHN;@E76xO$LJR+bVrj35f&|-WD=3n5f~C>yI~H#~
z?#!FFY@!2i-|XC(chCJgGb3>A>iWkkBK0#8CqaM&0D`_x!ha2cq?0#&KfjSX83BST
zZy#QIj4@4pN2Gp!aOFUp-%<_`YjgMC-5Uo$q6fAJ0xxf!3lg!D1Q0)BWnrl4^s46l
zdiy7yzWRi^CP1ugu9ZCzJOJlHXKVQHy6(+%0MUBdK>&ZKxV>-&ssO>Yxs{CvB>+96
zKYWcKzWu0BlYj03>Y5mZ|8cA~V<Qstr;h>vruvG#ec;Z*G@iWN#;E3Sc6kHu*DohP
zj0a52y-*}RDySqrDu8M;?&nkzB8ow;!l0-41;yR#(@+tR7|t%gDFa}^tq}wQ2(K^!
zV?aazim6_OL9c2++?au?psr<jaVdg`9>^3YC=<&q5Pu`n=J9Q+uNd?dgPvm0tMHqO
zrJFO2Cu$k`c`*k}xe3}$1W+dtKSu%7WzgqO^o!$bHIsx50FqiSA@CqX5~ZSqP&$F+
z%@bD(0K*S}j!*!N<*EgR3J8I%FMFn1(7bD6?$nWnGqOZC9&juNM#32bqEdkn4u}by
z3yZ*nQh&YmZQIfu2w29rz#82o284iEkEp{`H^9VwQy{_6768lrGTs4g5CEV}@|1x@
z!<dy?Rt2VifM)Bz9RdO>NtC*CU_#e-gK%0h%Y%fep$P!DeRlG|q##<!7jhw1S_co9
z{r#{AFov*#nl2u&-amXKB8ZHzLUMQV04C>wiGM(#O;~ZaErh^Q<i8|i4#E?bH7wa}
z?E+@P|J8h%1|I0l0mB22KJSNqJaf|YbI?o-uo+JPFXsE99<7b7y`YFXObOHyMk8)X
z&W?7CpCev*iHiLq&jbE!ap8DBT2y$K4zISq`E@THGspUt2mC{c9;n1D?gB9epk^CO
zo_}LW4$!Qw9DRS-9R({bTZT2EU(OFT{4Zno0=LAMi;6_0!J-(?kaS^XSAIkf*qc_t
z1Ln#FV)blO1=fT4EvQ>2=6~}O&jTsTw2tNZO{a8RFUfKeOLD=;G9pYuutW0LwbiZU
z=9^tMof{2+?6Mke%ZM_2*>&Ie-txd`#3)5jcJpg@t{jPS99%hMM}&)B?_d9?fEX$x
R%Gv+`002ovPDHLkV1lPst~>w$

literal 2058
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}oCO|{#S9GG
z!XV7ZFl&wk0|SdnW=KRygs+cPa(=E}VoH8es$NBI0Z=sqgH44MkeQoWlBiITo0C^;
zRbi_HR$&EXgM{^!6u?SKvTc<jd;=7m^NUgyO!Z9k43zA+6ciL}ic-?7f?V97+JQV<
zrHqo20xNy}^73-Ma$~*xqI7*jOG`_A10#JSBVC{h-Qvo;lEez#ykcdDAuw}XQj3#|
zG7CyF^Yauy<|ZcPmzLNnDS<441Bg3IGSd(?<rPD{1@xdkNJigK&p;oWw$zGD9NIuK
zIJKoD!+ljyT9gC!Q%bUaYEEiyYF<e(P@f@I>wsYk*NEcCio^nlW#B-B_{|37a;u=!
z;{2RaP!NRXWtP|(*?>KSE{q5fh%V>++=8Oi;$omSJ5#6@WHEI05eRGS%wcvQ3!-cA
zFUkb^G!f)3J42`i$YSW~Be7Y4EQq856!caBnH8xy5iXg)00sNP80adj66hM8^K<fx
zf(sIpQ$Y>`Ye5o1R}Ho%5|=ed5=a_TlC6qMld@8iOORp<7-!(L@06IXk0flPk5#n|
zFeO;|=BH$)Rk|dWq}mx77@F!D80i{XgculD85mg^0o{(K2FV2=8Rw$Z#FG4?ko^1{
zJFqWuL0ko6J!3tnUSt(e%{Ka=e1w#*Aej~{3e2^3TtHi4C4e0lr`nan3=GWmo-U3d
z5u8WEZ8Jn1Md~(h-o0~z_l5w@XDUtt^&DNEi*H0|8cw@5tK&w;(zR22OQjrn!*AT^
z=un7Qy1CbdL&Hmo+f~t!v&w$=<L_zt-}Q=(cb6+pI<C9h`u*PbweQc)o@u+NRxI(z
z_vfp!*K4dgA9Tee<mY;xB{y8Ex~9~`?ydb}b?+B*<KYi?Hv6xN?^Iek%QvR5Xm4a>
z|8x2Ed*;mBCv33X<|A*a=Gi|-+j)h&CJLlYEUVfO7vSTl@bXosQKi$xr<0XK!XFzO
z?fCxZ!>0qi+qt>7&W(F(KG{L6SNkQi6wj?|>(o^<E`)Ch?Ows7bbtHolDa)Ap*3Gl
zSr?Z7ys`9baklr>{buEp9nyro_-}p@lMgd_P#x0Wk)>d#(E1~`|F5w-+i5MiwJs(9
zA75VjO0&Uy6T@2e^D-XyRpnG9eynh~c(klhMC9lUBLNP_G=mQ<>aBY$0_A4SUDb2H
zX45ax39+_`D;wUWeyVkpYcO2ex+vXKLHy4HSH&C3HXfR{*10~qm2#8+NrbCT-OsSS
zriN?>)(D;BQm}ie^<nRWOTALeW@1ZraBbjstWyy&DN|sObTnRm`hq#%!K@X=%HFI(
zrqic37HUsf;*sHG(#VqC8JA$bZUKLis!!)3FG0i2OEw5!@H~(&_(E~tvE&!=(T2Hy
z7&-mVvkD!U$6|CQt!PUN`<iU$IV=(_j8&=&3KQiOU0Qr9^DNDTt_PpE%oHj<XL7@N
zUWVUs%NlfZ52;)bvs%S{+;_p#i>^1tG}Co>&-7+YmSKu9x|g<l+1a+qJuh=^H(p>|
zD}3thBbA1;KJ95-dpjJ?7fhR%=kU$3LdWwRyG))RhkD}@_BnN8t#L^ltD^NUf0jFB
zX|lsw_mRp1SzW%}vPD}M_-xug+{=4D$3n%m%p$t&a+*n~AJZPLsoiEJf7VV|ZqEF5
zKUc-?C(j;+=pJhKTW8l^qdsRdlf~tUie-oA@abJDXDhO`_II9sIIjP_HRE#;o2aS3
zsu#@f`RRN_mH*r=Q!ysb>kHXU8LxlZc+m3K)wEf?ksK;kHMb_VpY^rSHR^feDEg20
z<+6-J@;(>87@kt$at!95^MCgXjmZbji})#4vmH_YAIGi!Q<>G2GvU$Xh3&yBPtLo)
zSw-@uN`SilojLJ;Y<vu}=9f!+Iq7}$wF;B%;jez-n-Bas{?KXp!TO3i{xfgt588W$
V^Lu%uZtwtA(4MY-F6*2UngA(i@sR)k

diff --git a/chrome/skin/default/zotero/treeitem@2x.png b/chrome/skin/default/zotero/treeitem@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..b57a3361822cec7e607425911cc0d11a78e32b2f
GIT binary patch
literal 390
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyIRQQ)u0R?BgoK1(OopdVpFVl=
zgpZF8C<0{s|NsBPhY!Dg{rdj>`=?KzK7Rc8`Sa(0|Ni~{{rl_JuRnhLc>DJ4-@kvq
zeEIV8=g)87zP*3{{?DI3@7}$8{rdH*SFfHudj>S{&6_v1Y5^cScuIo&g3TBVtfVCc
z-oLldf33sAECCeX>*?YcQW3ZIygMJWqJYaqw%d=d7+A6||9$@=o8rQiV%FDx>AspA
zbhGz~pVk|8lRzgHha*YfSBqzU*eCO12lLlkKC$=uLNm9``zh(dVq;;rJ^7>XnP(rZ
zss$Zw*Iesdr6K;ztb=1t#+xbDi8FEq1X(UV{Tv}G<7WM!KdRn@QQ>JbLvR(#j7^FM
zrm!+DlVF(<q$Hrp;ljl<vB_bH0t%C134;PF!%ll9-;<gAo0eRd85IBIocdBn?RW8@
OK=gF=b6Mw<&;$U^8?RCT

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/treesource-collection@2x.png b/chrome/skin/default/zotero/treesource-collection@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..5bc379d1342f5f7710f3763ab34570e71da842ca
GIT binary patch
literal 628
zcmV-)0*n2LP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60
z0RN!9r;`8x0x3yEK~z|U?Uqez6hRP%pV>(K06mEWbBG8UJtqeRg{Wskg8l^|Afms+
zqX%#P1`i8f1ic6zlB<$v;w3~p3CS+Ws@qi_`eQ!Zongm=xCKR5&Cvb6{Z@6)z{Do@
zzgyyiPu<103QG;AznQ<gerFs49UrLZ5~4J7xxLk0xG@fapupD41qHagvJR?%0s<%+
za_5=+bN5zL%r7L#qxqGMR{+PtV{xNO4lD<*DXEYPP3<D+bKpXOfO-aiGT42FilCxy
zbg{AVnX69#<<j!&Kw2vlDiYuBt^&+?*s=l$st(jhnS`-%P(m}nIdG{aQcx@<VBG%Q
zBr%o%QXpY${C(po$yA4=)5(lUAy3EYv-d116C)5x;N&zWC%GqpBhlQ%Div@_1bpCR
zHF?RiB#xh3<kaj<YDw;TLs8o+(GnC+K}sOs11Dy#bMpMP(rJk`o)+K53FJ?~=_`*j
zi&b~I40e#i52y~oc`TludEf{{N}!Q@AlBt_w23+VI1)I`-6rZPFg$oyvEZ*if>i@M
z4<)G8gaR^X1vtdMN$WJBqNoho0S<A^CRBf<<ftWJr=Y(%qa_G8l$FXV&;qc}{f8}n
z6Z#Uk%fk^E8#ui43XCX0uXg|_KYRPAnjEloQ?a-y0Gkr2VZWcli7VjGzWitf7)&U^
zsITE33A5i`+^2n;qW}J3_Q9?Xvj2o@2w$837dH02#IW`kb~&+s)P4h&^_@MnCzZqi
O0000<MNUMnLSTX%=^2{<

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/treesource-duplicates@2x.png b/chrome/skin/default/zotero/treesource-duplicates@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..61730634f17779f1eba5d228cec2d5e849e79e93
GIT binary patch
literal 520
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dydjotzT!AzkT)lb~&IU3rT)2SD
zg|I6tE32!ki;9XCE?l@`#fs(2mw)~G^~;wp-@bkO@#Dw$@83Uv{`~*{|M&0TfBN)k
z{`~n}U0pRbHC0tr6%`d79UZf0&u(jLtE;P9x^yYfgkQgYm6es1l$3n<@S&%tXYu02
zO-)TRXU^>J?{8^oX=rGeIB{ZDR#r+%N>WnN^y$;5PMtb=^5mSHoHuXY%$+;8_g}vQ
z&{<+7L4Lsu#xW8z`So;lCRs^^yG3|--F@)L=idEo6<>iWo_M-AhE&AOy>#90u!Bg;
z!#{0z9h~&bvKD^7_xiWJn3M`%Xa8QOGgm!+&)qxgSpFd<uHxQVCW^WV3v|4e97vG6
zwRM60l!mAY{a@UfO1irHRbD*(n<!LL{ZoU}Z}(g!&ME(!Ib`DJ_B5ucatPY-=fx?s
z3EjALZK)iqzWVR>^6TH-UuUzK?U#?gFPF#qWyj{-<z@R49j4p8?++_|`T0xCtw7h=
zcLPIb-@LdfUuc{1rqKHt{%<u-*EFw`<(wjYqmQMA`S!$y`~+*E54<_<Oi$As1Pk8!
pD}0(fRrUIowF!%^e$s8zS5eXVJ16JaW}tr=JYD@<);T3K0RT;A>d62A

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/treesource-library@2x.png b/chrome/skin/default/zotero/treesource-library@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..3955181a3882cac4e6356aff8bb02f9d8415116e
GIT binary patch
literal 792
zcmV+z1LypSP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60
z0RN!9r;`8x0?kQ8K~z|U?NvQ*6G0GtOI$^Spx6-k0!E1)A%#eE(1wo+BpM1@m-z<)
zQQ$~OK#8EHNP!UlfsY?Sgn|G^u@lQ+M~-7U?+nH6?CqV;#F2beIN7@0*_nBBZ{N-W
z|DTios3ha-a$${u=gel#VAx;y2Ef)~(C(r_yHXF=-qv5lu_oe%SLH&58BfE+!$6J!
zZtS;jEl;TrUk*PHWx#?zk;K{A0?uDpbn84ABK1X5`liOt7JltkO;HR$Vg1p&y~+Rs
zQE)~szkqXdixyDX#0rt@VvGDe7gjhuodW>$4)$ej<>r+s^>NcMp@xCyf+BjYU36R9
zU^bL9iyk<%A-Wd#%?2f$ot;Os_8raoH-B5!AHUzLOuQ@?DiCmHWP=6d@<nui@1WDH
zLTiTB1WgQ0WagASCmmbYgu_l74A`wy=yhA7kChwCXVk=<tJ9xEY}ufQY`%m}a~u1O
z>al<Z<`m9*ofa4hvllM|0R9}bT@e{MVlzPzGx;LgjVjuWA4V|$pf+g>z&zBq_Hz?`
zA_SL~z^u@$ZGiz~WKZtizh{#yxn!`3;1wgKC;1He#_SST3h-uQ3jibI&MS#?ECEJH
z>@zTOoMA8Hx*eHHX#cCBj~F2HW{!@TC^k>>rNp(#`D^YZm@ROu8VAyp3b30C3l=!z
zz{%3mr*wdQU;Fu1grSnb0BcGGILsyO&V0BNp;Shi(g9{K-WQ=0gq(uDP6b%joXuVr
z8SiL25vBngWxyAqGzedWDF92ZK@nO(Fd1uj495%X7@#-<B0}lieVq!h^K~6@hzR42
zXl%fC91)=~z+PXMMl^2Vh_75q@I(kQMNAg2Ctn^w#D3JJG(1iOkR(EJ#0ZI#)?M7u
zH>S9&XAgopfH^NdLeXgU@N46C5t|)G-{9IQhFWD{Z|vaq>pjuCv0<He6=M}A{`m`>
WAS~3p0<}K?0000<MNUMnLSTZIw`6Ys

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/treesource-search@2x.png b/chrome/skin/default/zotero/treesource-search@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..c36e3d27eff4426fd0cf868235c45ea3d003366e
GIT binary patch
literal 1128
zcmV-u1eg1XP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000CpNkl<ZcwX(6
z+iz556vcn%%%w9^+9I}=O9ewfu8APT76b9ZlX!^|eb5A76#^RL|6uf0j1d!4jSnU~
z7?tRQHy$982qXgK)^ICQN=v3pXF4-yrsvyRvNP!kZHK04`XVb?*?XTenYF%e?Ma6J
zJ?`T^ymJRO90Z<bX83*Oi^sSAHwM1jp!eil*s@~#@x%Y#z_(_AM_>LEP$Oz}idn|z
z-UH7vLtOI2+q2@;V?PmrIHCX(#AL!8^;+u@WrkR)=%>IV6AWNLO_bo;UJyY=P^VTS
zDov~2H6zPk`eka9$oQ<$doCP!1z-ul)CN$aI%h%}nTQO@RPo4^ap}b9ga}hdAT<M#
zm{pr2L&L{E!t;H+m_J_qXr5FPZQCbBRwn`_GEm>d3=zdM{S7D}h!dz|prL&unT4At
zU3ta9mEj~e@;=3q;uIQUAq$#9mW35kahd)GKtLz&fb~vDFX+0>O_Q?j&nGxJkfIt2
zB7zfeP8b!Rp?sX4>mHqpD<Di4fuKZN4qA81rF;=rI>TV4gTHcHa3Zv%ecGCnq~bmb
z6oZidY`|d7aj-YR>f|O`gCq4LP!yPc%U$U_QaVf3#poI7GVzYN3EEoX=2L6AH)rBB
zrRR`o@agR@aC+`;o*Xzeg#l-ET-@akfjU$}&@rsH8s5?OmDf{oF*~`53yh8lK~>C1
zGVals^yz5LkS$cXk#$^2Zvze!0el3EY7HtCRLUR$YAl0Pi249D;6||6GH+|Plbd+4
zB7_2CqKsCA!fh(h@n8lg%3xw66X7F@5#zMNs`j2@waLCTowUp;*G?{~sA4SEo;77+
zW;XA)PyZ`0vFNIe5Te!_t#>LoX99pu5*Gyzt-Zs{`k?^Si$DRbdt&T))HjetL@Aa-
z6ljQhk+@YQmGEsIDUKmdNQVP=i$IKb7moV*@sl_au4V&Nv4zVde85g_+uu}+=fdA3
z_SyNRqxB;w<O_gO86B|*(C`kbJ&S%BZSpg|baFG7;&Q@c$wQ4arhF5IS`@(ft2wR@
z7a=UsI{53|Z$J@SJR}&WO2vqjiROT$W?7x+M#OP(V3ZS=bKELaZ8t(uviS-}&kb?5
z@0R7?)p(9v;IaR`b#L7HkLbg-*YH@xJ!0^Ir#Q1{4`Z4%ArZl<6N^a0fG1KttZJ=N
zDr7l*_<OCCio0I__{3*s;Oqx$U+_F{ALv5v5!HALee<4UDDybE#KVYF8Y_LY7mv}N
z{f(ibu(I=c8k^@)$`8}?#}68m3p;o0J+sea7O?;Q^*dtmRQIZ`ZL!Rp7DjV7IeFwq
z7nVy~J!T2tyz|(OSVOXVP3N{)`nHMwOFdjXb?9@CS;W_S*1Q={Cc8V9uJebk^^(gC
u?q;^})vguKe7SSkCttj^{O$d(5&H)mh_ANJv@3o90000<MNUMnLSTYKt{F7|

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/treesource-trash-full@2x.png b/chrome/skin/default/zotero/treesource-trash-full@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..081ac96f263e90f31699d5a957d517ac4d373685
GIT binary patch
literal 1069
zcmV+|1k(G7P)<h;3K|Lk000e1NJLTq001BW001Be1ONa4*>kdg000B@Nkl<ZcwV)Y
zeN0tl9LGP;bI!eRxx9^OP12YmI#91fEfDLrAT_nEX0w;so3&=vvbRlgwKiATU#^Wx
zTiTi|6(h-(rZB9WBcm-dQ2_-Sq8K7_fqUVc%RT4m?yS2z#>@Dp&u_myJAXW%efN9L
zo`<QUma1aLpfhExj{rYY$I)j~%G10_*~VRAD{OtZg*;qSOW<Y!KD@Ya<3@jNxh>$)
z4ez)ap@Dh~90cQ&fuD3&;@X9GF80k$PIc*dZULY^t9$!YL=m8hs}l>nEF<}+7xIcd
zE={<BFbWNTplZ0euXcYc!+cKPM1s4S^IpkA>*s5U0*43+Pzd0XJ*2)qva^xDr~=7&
z+=?t+6A|ZaQ`tldf#s|UL5|E6&)tt?{=`G{AccSt+EtFgL7;FzBU27(2)q*uB(mnv
z>SqwQ2%8u-AOJ-`mH&){$pqq9)AilYKH*J|3p#B<mh4qmf_qQabjAd7q6FI>`Ld~W
z+n$=1?q1VS78VKC>1zj?Uq0yHwX=ESJxJu(1Sw3zjS0y7qF+)r|FG!<zoO&Dg+$?y
zoA&yBGiOr=qXlzWOa?K+_1_de{N3i(wv(;D-?$L^JA%wg%t`f4FPMGXEK?XDNB@a_
z^5EW#m2*-PdqP#0E(D>#Q@$o^i4G{I!NlMOT};Pd^$rBD#uE5gl;Ns=%vYp@jm-wT
z`Rw)|k97I>f6~5iT{_9Q5kQDGF5_W3fJ8V8;HFsWN7pZ2;%vu8$(;O8%f48J>y<x#
ztL~#86NSRS7&YjaAP3K;ym>wwlOO^586u3*N>)`qDfM?xbu};^@lzlZZN(y+FvA!`
zoB|IC6cp|lc&T>Fp>G%B9V>`0$!KXAHY0RX$3Kq7pq~(e<)tfTcF6j}6DN>>jW%T3
z1ZiN14rjZGg~<p~zVQIs?u(NPdeK_CZMrc@BAYM<HVQD1<mTR<e9rFgnoQ7%R@q{a
zhD9G;C?vvZu+Zh|EVRpGGl;mLgPSJ<jV&4YuxX-~1lkFqqdA&sDQF>MvIJ0%R(9Ml
zbMc{Zkw&gXTjFvQePJ}09>48o0fWOxf^orVuAB|N|9!;H=Pq;xNTkp?NF8M#??%hc
z76`n|BcBu$2hSmCj0+Td2<+|LS{)AiSV>W|XOV;l!Kw32!*^(zvju|0XhC0Sdwtbq
z2B{o<E6-p9X$w+5@E6RLA~wb|t!s}BL@IJhRwxF|tD&aA(XQI-7WD8jZH$I=-lClH
z1z&AFQQds_QpK6a4-)-mD;4acGFk_ms$d;SFy6x=SjsY{5oefIW<)C$!7x3vafUxJ
nnFPT+9^`pm<SB|t;Q!`dX9Ie#O0>zm00000NkvXXu0mjf-Np94

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/treesource-trash@2x.png b/chrome/skin/default/zotero/treesource-trash@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..d7eca38b00a554ac2eceb698ec69a0cbc24c9503
GIT binary patch
literal 1150
zcmV-^1cCdBP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60
z0RN!9r;`8x1T#rQK~z|U?UzqT99JC2Kkv=V&Q5o;iq<Bn5z(*{DH@AHuBjo^Lr$@$
z+CzyTQ7<JB$Tg?jN{I(c;w9*<f>nCS77sR+79(jlU_HcWCAe63Ev|0%Uw3w=hnd~3
zB+!g{C^TPK9=zS(?|pv1_j_-D5B~2GN3d0aW}pRlA7}tHKms<f3&emmU==7F7l03F
z2hIZlcTu1FsRp2G{0mqF7J%GQ0P28?K&`Ip{^8-_4%0L*#N+X1Ddh<%r4&M7+jbF1
zheDyvXf(P!F){JGWm)B{e1nr2&j117V<33@_U#J;0|TELhEYE~Jxw~DcEYu7gb*l-
zf}$t{0s(q^d)eRLPmYd`M#jd*o&y=+YZnH^13(whaR2`Op25Mv>zby$Q!15s`t&J6
z2(DheifNjdrb$~{8|&-q*tU&nniz)R@9F7j_xt_(j~+cry21Pg&VIeAP6D#8ukRD8
zGAE@(QC^LsoQ1N45DW|qTy)nwSDsfr02r?Efo<#S>%+1vipAoAANTh5BIUvOgb>2D
z4^{&303ZQ5H8u4u|5W!I%eHOC$H#vx`zg<Rsew*F+1lF5Y;SLGw70jnXqsk}N+n9A
z61HtqDwP~kDUnhlgg{D3GMU`FbLY;(nVFfbWHMR6$-?(u0X_uO2M->6HZ(LeKQ=b@
z^WNTGOjXr_Tm6cZQnPKFY&M&T$K!uSqtW$y_wM~PGBWbRlP6D-w{G3KG&eW5?gB)>
z+cEqc(6+a?$DciWwtVyE&F>Z$7hmFBKq{}lhyZA7YYW}DapR*iXU?=-xpHOHo&Ey6
z6=7xX!r^fH%*@OOtE;PP3kwUYOG`^T%gf8@jg1Wpkj>4_e$zBV9UUDFU0q$Rjg5^>
z`FvjFa=Egfio5`bYGcc?WJ^m+I2;a#uU)%_Z974i$9z6dE|+6xXNS$rO&S^+s{K?l
zf2a%q6pKX?i3FKUhT7U%g25m@pAYAxK{}mgZEcMgFJ536Mm4~JqkL$9vU0f`ySuv-
zi$y}A5W22c=G~OP&d>1y976vIfQsG%cm+603wJC4$B}{Kxd)D*1DW*VFb{}SD)kaT
z(=;?q`&XktAV5=769B1HD(kNKvi!Z5f5Vf&>AJeQLU(ufIVmN<V33-c8gyMp(=>cO
zABv*jHm20n)Ntz5DHKJaP$)1tIr;0#%E}(F1U&W%@CR^yetv#GlgaFKc6K%zhM}vf
zieVV&x{j(kJ1T^zT*;PYkw_%cckkYPJUcrZ1NMQhfGl{g>PDa+cu&(bt-rs&_44J*
zXIooa->t8&KM@QD{kCnBN~Q9#SS-D=vXYEMBC$v$5_em+1n?!!V}-*2fYTdZ!g(JA
zae4r?YAn}PweLLe5SYek%PTs{xvqX8odr$<A=hUXC)(#g6!^u3c&k_RHv)chZ;=N8
Qs{jB107*qoM6N<$f<Ac~WB>pF

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/treesource-unfiled@2x.png b/chrome/skin/default/zotero/treesource-unfiled@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..887c69985bcf9e6d381ac6d4e05ae0927ec2bd2d
GIT binary patch
literal 429
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyT>(BJu0R?Mynp{5D6(nOrdO|C
zL8MNeJo*3s|8L*E{rmUt^XJch{`@&`;J}wJUp{^M^x?yYU%!6+`0?ZS@893Qe?NNk
z=&@tRPMtb+@Zdq9IY1N6o;~~V<HzI2kN^Dn^Y7okZ{ECl_wL=EJ$v@<-FxWJp|4-R
z9zJ~d#EBF8_U&V}pWy(skEbNaFW8JB(Lhq*tn`gz-ufxYFMk2Wk9oQ{hE&8Yz2v^h
zNl~Enq1cfx51yr*ySe@U+swcq_N9`Q$Kp%>HmiMg|MzR}`iUw%!Y(O$dKD`Y*j$|1
zp1eM~^@siI>uydyF`N#&X5O8C)OA0rWn<g%Il7D&toN}v9QR`QA=D7T$q>)fFlm|Z
zrnjd$1(sAA?@ishTaamT+3(CqNo%ng&ezpaWfUHtU{0A+(a<xC{lp3-21&sN9_}Ts
zP7Df%nN;^P8tD||GdA>aIJB_`JmThG@FbZ*<0r2NmzsS8S4)Wh<yER%YVzfMK_Tnu
L>gTe~DWM4fZ34}v

literal 0
HcmV?d00001

diff --git a/chrome/skin/default/zotero/zotero.css b/chrome/skin/default/zotero/zotero.css
index 146af6ea9..9d496e9cb 100644
--- a/chrome/skin/default/zotero/zotero.css
+++ b/chrome/skin/default/zotero/zotero.css
@@ -43,13 +43,6 @@ toolbarpaletteitem[place="palette"] #zotero-toolbar-save-button-single {
 	list-style-image: url("chrome://zotero/skin/treeitem-webpage@2x.png");
 }
 
-@media (min-resolution: 1.5dppx) {
-	#zotero-toolbar-save-button[cui-areatype="toolbar"],
-	#zotero-toolbar-save-button-single[cui-areatype="toolbar"] {
-		list-style-image: url("chrome://zotero/skin/treeitem-webpage@2x.png");
-	}
-}
-
 /* Show single icon for combo buttons in palette */
 toolbarpaletteitem[place="palette"] #zotero-toolbar-main-button {
 	list-style-image: url("chrome://zotero/skin/zotero-z-32px-australis.svg");
@@ -369,4 +362,13 @@ label.zotero-text-link {
 {
 	width: 29.5em;
 	max-width: 29.5em;
-}
\ No newline at end of file
+}
+
+
+/* BEGIN 2X BLOCK -- DO NOT EDIT MANUALLY -- USE 2XIZE */
+@media (min-resolution: 1.5dppx) {
+	#zotero-toolbar-save-button,#zotero-toolbar-save-button-single  { list-style-image: url("chrome://zotero/skin/treeitem-webpage@2x.png"); }
+	#zotero-toolbar-save-button[cui-areatype="menu-panel"],#zotero-toolbar-save-button-single[cui-areatype="menu-panel"],toolbarpaletteitem[place="palette"] #zotero-toolbar-save-button,toolbarpaletteitem[place="palette"] #zotero-toolbar-save-button-single  { list-style-image: url("chrome://zotero/skin/treeitem-webpage@2x.png"); }
+	.zotero-scrape-popup-library { list-style-image: url('chrome://zotero/skin/treesource-library@2x.png'); }
+	.zotero-scrape-popup-collection { list-style-image: url('chrome://zotero/skin/treesource-collection@2x.png'); }
+}

From bfbf3d871c4373f5263d99e6957bf62acfb6044c Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Mon, 6 Apr 2015 17:39:21 -0400
Subject: [PATCH 26/44] Fix display of sync error icon (2x and spacing)

---
 chrome/content/zotero-platform/mac/overlay.css  | 6 +++++-
 chrome/content/zotero-platform/unix/overlay.css | 2 +-
 chrome/content/zotero-platform/win/overlay.css  | 2 +-
 3 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/chrome/content/zotero-platform/mac/overlay.css b/chrome/content/zotero-platform/mac/overlay.css
index fc2911e58..0d3ef0981 100644
--- a/chrome/content/zotero-platform/mac/overlay.css
+++ b/chrome/content/zotero-platform/mac/overlay.css
@@ -108,9 +108,13 @@
 }
 
 @media (min-resolution: 1.5dppx) {
-	.zotero-tb-button > .toolbarbutton-icon {
+	#zotero-pane .toolbarbutton-icon {
 		max-width: 28px;
 	}
+	
+	#zotero-tb-sync-error .toolbarbutton-icon {
+		width: 16px;
+	}
 }
 
 .zotero-tb-button, .zotero-tb-button:first-child, .zotero-tb-button:last-child {
diff --git a/chrome/content/zotero-platform/unix/overlay.css b/chrome/content/zotero-platform/unix/overlay.css
index 25561b683..5dad77db1 100644
--- a/chrome/content/zotero-platform/unix/overlay.css
+++ b/chrome/content/zotero-platform/unix/overlay.css
@@ -93,7 +93,7 @@
 /* End toolbar buttons */
 
 
-@media (min-resolution: 1dppx) {
+@media (min-resolution: 1.5dppx) {
 	#zotero-toolbar .toolbarbutton-icon {
 		width: 16px;
 	}
diff --git a/chrome/content/zotero-platform/win/overlay.css b/chrome/content/zotero-platform/win/overlay.css
index ea5c06a21..19fa5e9e9 100644
--- a/chrome/content/zotero-platform/win/overlay.css
+++ b/chrome/content/zotero-platform/win/overlay.css
@@ -100,7 +100,7 @@
 }
 /* End toolbar buttons */
 
-@media (min-resolution: 1dppx) {
+@media (min-resolution: 1.5dppx) {
 	#zotero-toolbar .toolbarbutton-icon {
 		width: 16px;
 	}

From 2f3d865f11a5db3dd77f355bcda88a86e287108d Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Mon, 6 Apr 2015 23:14:32 -0400
Subject: [PATCH 27/44] Favor left-bound name matches in QuickFormat bar

https://forums.zotero.org/discussion/48047/
---
 .../content/zotero/integration/quickFormat.js | 28 +++++++++++++++----
 1 file changed, 22 insertions(+), 6 deletions(-)

diff --git a/chrome/content/zotero/integration/quickFormat.js b/chrome/content/zotero/integration/quickFormat.js
index f3c0962a1..430036761 100644
--- a/chrome/content/zotero/integration/quickFormat.js
+++ b/chrome/content/zotero/integration/quickFormat.js
@@ -318,21 +318,21 @@ var Zotero_QuickFormat = new function () {
 					Zotero.debug("Searched cited items");
 				}
 				
-				_updateItemList(citedItems, citedItemsMatchingSearch, searchResultIDs, isAsync);
+				_updateItemList(citedItems, citedItemsMatchingSearch, str, searchResultIDs, isAsync);
 			}).done();
 			
 			if(!completed) {
 				// We are going to have to wait until items have been retrieved from the document.
 				// Until then, show item list without cited items.
 				Zotero.debug("Getting cited items asynchronously");
-				_updateItemList(false, false, searchResultIDs);
+				_updateItemList(false, false, str, searchResultIDs);
 				isAsync = true;
 			} else {
 				Zotero.debug("Got cited items synchronously");
 			}
 		} else {
 			// No search conditions, so just clear the box
-			_updateItemList([], [], []);
+			_updateItemList([], [], "", []);
 		}
 	}
 	
@@ -353,7 +353,7 @@ var Zotero_QuickFormat = new function () {
 	/**
 	 * Updates the item list
 	 */
-	function _updateItemList(citedItems, citedItemsMatchingSearch, searchResultIDs, preserveSelection) {
+	function _updateItemList(citedItems, citedItemsMatchingSearch, searchString, searchResultIDs, preserveSelection) {
 		var selectedIndex = 1, previousItemID;
 		
 		// Do this so we can preserve the selected item after cited items have been loaded
@@ -411,7 +411,25 @@ var Zotero_QuickFormat = new function () {
 		if(searchResultIDs.length && (!citedItemsMatchingSearch || citedItemsMatchingSearch.length < 50)) {
 			var items = Zotero.Items.get(searchResultIDs);
 			
+			searchString = searchString.toLowerCase();
+			
 			items.sort(function _itemSort(a, b) {
+				var creatorsA = a.getCreators(), creatorsB = b.getCreators(),
+					caExists = creatorsA.length ? 1 : 0, cbExists = creatorsB.length ? 1 : 0;
+				
+				// Favor left-bound name matches (e.g., "Baum" < "Appelbaum"),
+				// using last name of first author
+				if (caExists && cbExists) {
+					let caStartsWith = creatorsA[0].ref.lastName.toLowerCase().indexOf(searchString) == 0;
+					let cbStartsWith = creatorsB[0].ref.lastName.toLowerCase().indexOf(searchString) == 0;
+					if (caStartsWith && !cbStartsWith) {
+						return -1;
+					}
+					else if (!caStartsWith && cbStartsWith) {
+						return 1;
+					}
+				}
+				
 				var libA = a.libraryID ? a.libraryID : 0, libB = b.libraryID ? b.libraryID : 0;
 				if(libA !== libB) {
 					// Sort by number of cites for library
@@ -430,8 +448,6 @@ var Zotero_QuickFormat = new function () {
 				}
 			
 				// Sort by last name of first author
-				var creatorsA = a.getCreators(), creatorsB = b.getCreators(),
-					caExists = creatorsA.length ? 1 : 0, cbExists = creatorsB.length ? 1 : 0;
 				if(caExists !== cbExists) {
 					return cbExists-caExists;
 				} else if(caExists) {

From 796a1a2898d52617b3841468fd63934b31078663 Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Mon, 6 Apr 2015 23:32:15 -0400
Subject: [PATCH 28/44] Use firstCreator instead of creators[0] for QuickFormat
 sort

Previously, if an editor was entered before an author, it would sort by
the editor. Now, as long as there's an author, it will sort by that
first (and, with 2f3d865f, favor left-bound matches).

Addresses the second issue on
https://forums.zotero.org/discussion/48047/
---
 .../content/zotero/integration/quickFormat.js | 20 ++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

diff --git a/chrome/content/zotero/integration/quickFormat.js b/chrome/content/zotero/integration/quickFormat.js
index 430036761..1272d4e5f 100644
--- a/chrome/content/zotero/integration/quickFormat.js
+++ b/chrome/content/zotero/integration/quickFormat.js
@@ -412,16 +412,16 @@ var Zotero_QuickFormat = new function () {
 			var items = Zotero.Items.get(searchResultIDs);
 			
 			searchString = searchString.toLowerCase();
+			var collation = Zotero.getLocaleCollation();
 			
 			items.sort(function _itemSort(a, b) {
-				var creatorsA = a.getCreators(), creatorsB = b.getCreators(),
-					caExists = creatorsA.length ? 1 : 0, cbExists = creatorsB.length ? 1 : 0;
+				var firstCreatorA = a.firstCreator, firstCreatorB = b.firstCreator;
 				
 				// Favor left-bound name matches (e.g., "Baum" < "Appelbaum"),
 				// using last name of first author
-				if (caExists && cbExists) {
-					let caStartsWith = creatorsA[0].ref.lastName.toLowerCase().indexOf(searchString) == 0;
-					let cbStartsWith = creatorsB[0].ref.lastName.toLowerCase().indexOf(searchString) == 0;
+				if (firstCreatorA && firstCreatorB) {
+					let caStartsWith = firstCreatorA.toLowerCase().indexOf(searchString) == 0;
+					let cbStartsWith = firstCreatorB.toLowerCase().indexOf(searchString) == 0;
 					if (caStartsWith && !cbStartsWith) {
 						return -1;
 					}
@@ -448,10 +448,12 @@ var Zotero_QuickFormat = new function () {
 				}
 			
 				// Sort by last name of first author
-				if(caExists !== cbExists) {
-					return cbExists-caExists;
-				} else if(caExists) {
-					return creatorsA[0].ref.lastName.localeCompare(creatorsB[0].ref.lastName);
+				if (firstCreatorA !== "" && firstCreatorB === "") {
+					return -1;
+				} else if (firstCreatorA === "" && firstCreatorB !== "") {
+					return 1
+				} else if (firstCreatorA) {
+					return collation.compareString(1, firstCreatorA, firstCreatorB);
 				}
 				
 				// Sort by date

From ac363101fc0f3d1cc600197fe3909827d0a7dc02 Mon Sep 17 00:00:00 2001
From: Aurimas Vinckevicius <aurimas.dev@gmail.com>
Date: Mon, 30 Mar 2015 23:09:14 -0500
Subject: [PATCH 29/44] Always use latest Firefox version and echo it for tests
 Don't echo version on Windows, because it hangs Firefox Also add testing with
 Firefox Beta (and prior ESR, but commented out for now, since we don't
 support it and we know it breaks)

---
 .travis.yml      | 19 +++++++++++++------
 test/runtests.sh |  5 +++++
 2 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 4e0365777..84c005e71 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,15 +2,22 @@ language: cpp
 compiler:
     - gcc
 env:
-    matrix:
-        - FIREFOXVERSION="36.0.1"
-        - FIREFOXVERSION="31.5.0esr"
+    - FX_PATH_SUFFIX=""
+    - FX_PATH_SUFFIX="-esr"
+    - FX_PATH_SUFFIX="-beta"
+#    - FX_PATH_SUFFIX="-prior-esr"
+matrix:
+    fast_finish: true
+    allow_failures:
+        - env: FX_PATH_SUFFIX="-beta"
+        - env: FX_PATH_SUFFIX="-prior-esr"
 notifications:
     email: false
-before_install:
+install:
+    - wget -r -l1 -np -nd -R "index.html*" "http://ftp.mozilla.org/pub/mozilla.org/firefox/releases/latest${FX_PATH_SUFFIX}/linux-x86_64/en-US/?F=0&P=*.tar.*"
+    - tar -xf firefox-*.tar.*
+before_script:
     - 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/runtests.sh b/test/runtests.sh
index 90f831001..27cf5b633 100755
--- a/test/runtests.sh
+++ b/test/runtests.sh
@@ -77,6 +77,11 @@ user_pref("extensions.zotero.firstRunGuidance", false);
 user_pref("extensions.zotero.firstRun2", false);
 EOF
 
+
+if [ -z $IS_CYGWIN ]; then
+	echo "`MOZ_NO_REMOTE=1 NO_EM_RESTART=1 \"$FX_EXECUTABLE\" -v`"
+fi
+
 makePath FX_PROFILE "$PROFILE"
 MOZ_NO_REMOTE=1 NO_EM_RESTART=1 "$FX_EXECUTABLE" -profile "$FX_PROFILE" \
     -chrome chrome://zotero-unit/content/runtests.html -test "$TESTS" $FX_ARGS

From f6510419cbe32832a76a556564deb0457199d53c Mon Sep 17 00:00:00 2001
From: Aurimas Vinckevicius <aurimas.dev@gmail.com>
Date: Mon, 30 Mar 2015 23:52:38 -0500
Subject: [PATCH 30/44] Skip test for "recognizePDF without DOI" on Travis-CI
 Breaks due to CAPTCHA when tests are run frequently

---
 chrome/content/zotero/xpcom/zotero.js | 1 +
 components/zotero-service.js          | 4 ++++
 test/runtests.sh                      | 6 +++++-
 test/tests/recognizePDF.js            | 2 ++
 4 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/chrome/content/zotero/xpcom/zotero.js b/chrome/content/zotero/xpcom/zotero.js
index 799156335..221765c0a 100644
--- a/chrome/content/zotero/xpcom/zotero.js
+++ b/chrome/content/zotero/xpcom/zotero.js
@@ -210,6 +210,7 @@ Components.utils.import("resource://gre/modules/Services.jsm");
 		
 		if (options) {
 			if (options.openPane) this.openPane = true;
+			if (options.noUserInput) this.noUserInput = true;
 		}
 		
 		this.mainThread = Components.classes["@mozilla.org/thread-manager;1"].getService().mainThread;
diff --git a/components/zotero-service.js b/components/zotero-service.js
index 389185bc5..111005c64 100644
--- a/components/zotero-service.js
+++ b/components/zotero-service.js
@@ -447,6 +447,10 @@ ZoteroCommandLineHandler.prototype = {
 				}
 			}
 		}
+		
+		if (cmdLine.handleFlag("ZoteroNoUserInput", false)) {
+			zInitOptions.noUserInput = true;
+		}
 	},
 	
 	contractID: "@mozilla.org/commandlinehandler/general-startup;1?type=zotero",
diff --git a/test/runtests.sh b/test/runtests.sh
index 27cf5b633..6da6f8796 100755
--- a/test/runtests.sh
+++ b/test/runtests.sh
@@ -77,11 +77,15 @@ user_pref("extensions.zotero.firstRunGuidance", false);
 user_pref("extensions.zotero.firstRun2", false);
 EOF
 
-
+# -v flag on Windows makes Firefox process hang
 if [ -z $IS_CYGWIN ]; then
 	echo "`MOZ_NO_REMOTE=1 NO_EM_RESTART=1 \"$FX_EXECUTABLE\" -v`"
 fi
 
+if [ "$TRAVIS" = true ]; then
+	FX_ARGS="$FX_ARGS --ZoteroNoUserInput"
+fi
+
 makePath FX_PROFILE "$PROFILE"
 MOZ_NO_REMOTE=1 NO_EM_RESTART=1 "$FX_EXECUTABLE" -profile "$FX_PROFILE" \
     -chrome chrome://zotero-unit/content/runtests.html -test "$TESTS" $FX_ARGS
diff --git a/test/tests/recognizePDF.js b/test/tests/recognizePDF.js
index 670422748..2bbb07368 100644
--- a/test/tests/recognizePDF.js
+++ b/test/tests/recognizePDF.js
@@ -38,6 +38,8 @@ describe("PDF Recognition", function() {
 	});
 
 	it("should recognize a PDF without a DOI", function() {
+		if (Zotero.noUserInput) this.skip(); // CAPTCHAs make this fail
+		
 		this.timeout(30000);
 		// Import the PDF
 		var testdir = getTestDataDirectory();

From 31941c079871af1eeae717105e9da343c8af70d8 Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Tue, 7 Apr 2015 01:14:18 -0400
Subject: [PATCH 31/44] Fix flashing console window for Retrieve Metadata on
 Windows

---
 chrome/content/zotero/recognizePDF.js   |  9 ++---
 chrome/content/zotero/xpcom/fulltext.js | 48 +++++++++++++++----------
 2 files changed, 33 insertions(+), 24 deletions(-)

diff --git a/chrome/content/zotero/recognizePDF.js b/chrome/content/zotero/recognizePDF.js
index 71bab85e4..2dc988449 100644
--- a/chrome/content/zotero/recognizePDF.js
+++ b/chrome/content/zotero/recognizePDF.js
@@ -139,13 +139,10 @@ var Zotero_RecognizePDF = new function() {
 			cacheFile.remove(false);
 		}
 		
-		var exec = Zotero.getZoteroDirectory();
-		exec.append(Zotero.Fulltext.pdfConverterFileName);
+		var {exec, args} = Zotero.Fulltext.getPDFConverterExecAndArgs();
+		args.push('-enc', 'UTF-8', '-nopgbrk', '-layout', '-l', pages, file.path, cacheFile.path);
 		
-		var args = ['-enc', 'UTF-8', '-nopgbrk', '-layout', '-l', pages];
-		args.push(file.path, cacheFile.path);
-		
-		Zotero.debug('RecognizePDF: Running pdftotext '+args.join(" "));
+		Zotero.debug("RecognizePDF: Running " + exec + " " + args.map(arg => "'" + arg + "'").join(" "));
 		
 		return Zotero.Utilities.Internal.exec(exec, args).then(function() {
 			if(!cacheFile.exists()) {
diff --git a/chrome/content/zotero/xpcom/fulltext.js b/chrome/content/zotero/xpcom/fulltext.js
index fc7976ecf..3da6d83a3 100644
--- a/chrome/content/zotero/xpcom/fulltext.js
+++ b/chrome/content/zotero/xpcom/fulltext.js
@@ -381,6 +381,25 @@ Zotero.Fulltext = new function(){
 	}
 	
 	
+	this.getPDFConverterExecAndArgs = function () {
+		if (!this.pdfConverterIsRegistered()) {
+			throw new Error("PDF converter is not registered");
+		}
+		
+		if (_pdfConverterScript) {
+			return {
+				exec: _pdfConverterScript,
+				args: [_pdfConverter.path]
+			}
+		}
+		
+		return {
+			exec: _pdfConverter,
+			args: []
+		}
+	}
+	
+	
 	/*
 	 * Returns true if MIME type is converted to text and cached before indexing
 	 *   (e.g. application/pdf is run through pdftotext)
@@ -640,17 +659,18 @@ Zotero.Fulltext = new function(){
 				var totalPages = this.getTotalPagesFromFile(itemID);
 			}
 			catch (e) {
-				Zotero.debug("Error running pdfinfo");
+				Components.utils.reportError(e);
+				Zotero.debug("Error running pdfinfo", 1);
+				Zotero.debug(e, 1);
 			}
 		}
 		else {
 			Zotero.debug(this.pdfInfoName + " is not available");
 		}
 		
-		var args = []
-		if (_pdfConverterScript) {
-			args.push(_pdfConverter.path);
-		}
+		var proc = Components.classes["@mozilla.org/process/util;1"]
+			.createInstance(Components.interfaces.nsIProcess);
+		var {exec, args} = this.getPDFConverterExecAndArgs();
 		args.push('-enc', 'UTF-8', '-nopgbrk');
 		
 		if (allPages) {
@@ -664,24 +684,16 @@ Zotero.Fulltext = new function(){
 		}
 		args.push(file.path, cacheFile.path);
 		
-		var proc = Components.classes["@mozilla.org/process/util;1"]
-			.createInstance(Components.interfaces.nsIProcess);
-		if (_pdfConverterScript) {
-			Zotero.debug("Running " + _pdfConverterScript.path + ' '
-				+ args.map(arg => "'" + arg + "'").join(' '));
-			proc.init(_pdfConverterScript);
-		}
-		else {
-			Zotero.debug("Running " + _pdfConverter.path + ' '
-				+ args.map(arg => "'" + arg + "'").join(' '));
-			proc.init(_pdfConverter);
-		}
+		Zotero.debug("Running " + exec.path + " " + args.map(arg => "'" + arg + "'").join(" "));
 		
 		try {
+			proc.init(exec);
 			proc.runw(true, args, args.length);
 		}
 		catch (e) {
-			Zotero.debug("Error running pdftotext");
+			Components.utils.reportError(e);
+			Zotero.debug("Error running pdftotext", 1);
+			Zotero.debug(e, 1);
 			return false;
 		}
 		

From adadc9e03a061ab7c4be8492680a8414c5805f0b Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Tue, 7 Apr 2015 01:15:13 -0400
Subject: [PATCH 32/44] Accept a string path in
 Zotero.Utilities.Internal.exec()

---
 chrome/content/zotero/xpcom/utilities_internal.js | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/chrome/content/zotero/xpcom/utilities_internal.js b/chrome/content/zotero/xpcom/utilities_internal.js
index 8ca85b457..eab37ea3d 100644
--- a/chrome/content/zotero/xpcom/utilities_internal.js
+++ b/chrome/content/zotero/xpcom/utilities_internal.js
@@ -290,11 +290,16 @@ Zotero.Utilities.Internal = {
 	
 	/**
 	 * Launch a process
-	 * @param {nsIFile} cmd Path to command to launch
+	 * @param {nsIFile|String} cmd Path to command to launch
 	 * @param {String[]} args Arguments given
 	 * @return {Promise} Promise resolved to true if command succeeds, or an error otherwise
 	 */
 	"exec":function(cmd, args) {
+		if (typeof cmd == 'string') {
+			Components.utils.import("resource://gre/modules/FileUtils.jsm");
+			cmd = new FileUtils.File(cmd);
+		}
+		
 		if(!cmd.isExecutable()) {
 			return Q.reject(cmd.path+" is not an executable");
 		}

From 61e11f9afa476a93c96b527867e54a0a6d8b1136 Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Tue, 7 Apr 2015 03:03:52 -0400
Subject: [PATCH 33/44] Fix main toolbar icons in 2x mode on Win/Linux

---
 .../content/zotero-platform/mac/overlay.css   |  2 +-
 .../content/zotero-platform/unix/overlay.css  | 37 +++++++++++--------
 .../content/zotero-platform/win/overlay.css   | 20 +++++++---
 3 files changed, 36 insertions(+), 23 deletions(-)

diff --git a/chrome/content/zotero-platform/mac/overlay.css b/chrome/content/zotero-platform/mac/overlay.css
index 0d3ef0981..ace263648 100644
--- a/chrome/content/zotero-platform/mac/overlay.css
+++ b/chrome/content/zotero-platform/mac/overlay.css
@@ -179,7 +179,7 @@
 	background-size: 14px;
 }
 
-@media (min-resolution: 2dppx) {
+@media (min-resolution: 1.5dppx) {
 	#zotero-pane-stack[oldsearchfield] textbox[type=search] > .textbox-input-box {
 		background: url("chrome://zotero/skin/mac/moz/Search@2x.png") left no-repeat;
 		background-size: 14px;
diff --git a/chrome/content/zotero-platform/unix/overlay.css b/chrome/content/zotero-platform/unix/overlay.css
index 5dad77db1..3500fe859 100644
--- a/chrome/content/zotero-platform/unix/overlay.css
+++ b/chrome/content/zotero-platform/unix/overlay.css
@@ -1,12 +1,21 @@
-/*
+/*
  As of Fx36, the built-in styles don't properly handle a menu-button within combined buttons.
 */
+#zotero-toolbar-main-button-single[cui-areatype="toolbar"] .toolbarbutton-icon,
+#zotero-toolbar-save-button-single[cui-areatype="toolbar"] .toolbarbutton-icon {
+	width: 32px;
+}
+
+#zotero-toolbar-main-button[cui-areatype="toolbar"] .toolbarbutton-icon,
+#zotero-toolbar-save-button[cui-areatype="toolbar"] .toolbarbutton-icon {
+	width: 28px;
+}
+
 #zotero-toolbar-main-button[cui-areatype="toolbar"] {
 	margin-right: -1px;
 }
 
 #zotero-toolbar-main-button[cui-areatype="toolbar"] .toolbarbutton-icon {
-	width: 28px !important;
 	margin-left: 2px;
 	margin-right: -3px;
 	padding-left: 5px !important;
@@ -26,16 +35,6 @@
 	padding-right: 6px !important;
 }
 
-#zotero-toolbar-save-button[cui-areatype="toolbar"] > .toolbarbutton-menubutton-dropmarker {
-	margin-top: 2px;
-	margin-bottom: 2px;
-}
-
-#zotero-toolbar-save-button[cui-areatype="toolbar"] > .toolbarbutton-menubutton-dropmarker .dropmarker-icon {
-	padding-left: 14px !important;
-	padding-right: 3px !important;
-}
-
 #zotero-toolbar-save-button[cui-areatype="toolbar"] > .toolbarbutton-menubutton-dropmarker {
 	margin-top: 6px;
 	margin-bottom: 6px;
@@ -47,6 +46,16 @@
 	margin-bottom: 0;
 }
 
+#zotero-toolbar-save-button[cui-areatype="toolbar"] > .toolbarbutton-menubutton-dropmarker .dropmarker-icon {
+	padding-left: 14px !important;
+	padding-right: 3px !important;
+}
+
+#zotero-toolbar-save-button-single[cui-areatype="toolbar"] > .toolbarbutton-menubutton-dropmarker > .dropmarker-icon {
+	margin-top: 3px;
+	margin-bottom: 3px;
+}
+
 #zotero-toolbar-buttons[cui-areatype="toolbar"] > separator {
 	/* Copied from .toolbarbutton-menubutton-dropmarker::before */
 	display: -moz-box;
@@ -86,10 +95,6 @@
 	box-shadow: var(--toolbarbutton-active-boxshadow);
 	transition-duration: 10ms;
 }
-
-#zotero-toolbar-main-button-single[cui-areatype="toolbar"] .toolbarbutton-icon {
-	width: 32px;
-}
 /* End toolbar buttons */
 
 
diff --git a/chrome/content/zotero-platform/win/overlay.css b/chrome/content/zotero-platform/win/overlay.css
index 19fa5e9e9..756291aee 100644
--- a/chrome/content/zotero-platform/win/overlay.css
+++ b/chrome/content/zotero-platform/win/overlay.css
@@ -1,12 +1,24 @@
-/*
+/*
  As of Fx36, the built-in styles don't properly handle a menu-button within combined buttons.
 */
+#zotero-toolbar-main-button-single[cui-areatype="toolbar"] .toolbarbutton-icon {
+	width: 32px;
+}
+
+#zotero-toolbar-save-button-single[cui-areatype="toolbar"] .toolbarbutton-icon {
+	width: 30px;
+}
+
+#zotero-toolbar-main-button[cui-areatype="toolbar"] .toolbarbutton-icon,
+#zotero-toolbar-save-button[cui-areatype="toolbar"] .toolbarbutton-icon {
+	width: 28px;
+}
+
 #zotero-toolbar-main-button[cui-areatype="toolbar"] {
 	margin-right: -1px !important;
 }
 
 #zotero-toolbar-main-button[cui-areatype="toolbar"] .toolbarbutton-icon {
-	width: 28px;
 	margin-left: 2px;
 	margin-right: -1px;
 	padding-left: 5px !important;
@@ -94,10 +106,6 @@
 #zotero-toolbar-save-button[cui-areatype="toolbar"] > menupopup {
 	margin-top: -5px;
 }
-
-#zotero-toolbar-main-button-single[cui-areatype="toolbar"] .toolbarbutton-icon {
-	width: 32px;
-}
 /* End toolbar buttons */
 
 @media (min-resolution: 1.5dppx) {

From fe79954b964857cf27e8aec409aed3713d44b6fa Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Tue, 7 Apr 2015 14:25:24 -0400
Subject: [PATCH 34/44] Fix HiDPI icons in trees on Linux

---
 chrome/content/zotero-platform/unix/overlay.css | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/chrome/content/zotero-platform/unix/overlay.css b/chrome/content/zotero-platform/unix/overlay.css
index 3500fe859..ca2f342dc 100644
--- a/chrome/content/zotero-platform/unix/overlay.css
+++ b/chrome/content/zotero-platform/unix/overlay.css
@@ -124,4 +124,10 @@
 
 #zotero-tb-search .textbox-search-icon {
 	visibility: hidden;
+}
+
+/* As of Fx37, the tree doesn't scale HiDPI images properly on Linux */
+#zotero-collections-tree treechildren::-moz-tree-image,
+#zotero-items-tree treechildren::-moz-tree-image {
+	height: 16px;
 }
\ No newline at end of file

From c398353d5d52982b31771fccc6398bef8b693758 Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Tue, 7 Apr 2015 14:26:49 -0400
Subject: [PATCH 35/44] Remove obsolete CSS include

---
 chrome/content/zotero/itemPane.xul | 1 -
 1 file changed, 1 deletion(-)

diff --git a/chrome/content/zotero/itemPane.xul b/chrome/content/zotero/itemPane.xul
index b36d50ba0..4b6c35a5a 100644
--- a/chrome/content/zotero/itemPane.xul
+++ b/chrome/content/zotero/itemPane.xul
@@ -24,7 +24,6 @@
     ***** END LICENSE BLOCK *****
 -->
 <?xml-stylesheet href="chrome://zotero/skin/itemPane.css" type="text/css"?>
-<?xml-stylesheet href="chrome://zotero-platform/content/itemPane.css" type="text/css"?>
 
 <!DOCTYPE window SYSTEM "chrome://zotero/locale/zotero.dtd">
 

From 2afebc79d0da8ba655c36d37856c2f3c28506d1e Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Tue, 7 Apr 2015 14:37:13 -0400
Subject: [PATCH 36/44] Set tree image height to 16px everywhere

Windows maybe also doesn't handle HiDPI tree images correctly otherwise
---
 chrome/content/zotero-platform/unix/overlay.css | 6 ------
 chrome/skin/default/zotero/overlay.css          | 6 ++++++
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/chrome/content/zotero-platform/unix/overlay.css b/chrome/content/zotero-platform/unix/overlay.css
index ca2f342dc..3500fe859 100644
--- a/chrome/content/zotero-platform/unix/overlay.css
+++ b/chrome/content/zotero-platform/unix/overlay.css
@@ -124,10 +124,4 @@
 
 #zotero-tb-search .textbox-search-icon {
 	visibility: hidden;
-}
-
-/* As of Fx37, the tree doesn't scale HiDPI images properly on Linux */
-#zotero-collections-tree treechildren::-moz-tree-image,
-#zotero-items-tree treechildren::-moz-tree-image {
-	height: 16px;
 }
\ No newline at end of file
diff --git a/chrome/skin/default/zotero/overlay.css b/chrome/skin/default/zotero/overlay.css
index faf9df941..22e882884 100644
--- a/chrome/skin/default/zotero/overlay.css
+++ b/chrome/skin/default/zotero/overlay.css
@@ -24,6 +24,12 @@
 	min-height: 5.2em;
 }
 
+/* As of Fx37, the tree doesn't scale HiDPI images properly on Windows and Linux */
+#zotero-collections-tree treechildren::-moz-tree-image,
+#zotero-items-tree treechildren::-moz-tree-image {
+	height: 16px;
+}
+
 #zotero-collections-tree treechildren::-moz-tree-image(primary)
 {
 	margin-right: 5px;

From b2d561252641aad1b7aa45c13104678dc73d460f Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Tue, 7 Apr 2015 16:59:33 -0400
Subject: [PATCH 37/44] Fix sync and debug output submission in Nightly

(sendAsBinary() removal)
---
 .../content/zotero/preferences/preferences_advanced.js   | 9 ++++++++-
 chrome/content/zotero/xpcom/sync.js                      | 7 ++++++-
 2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/chrome/content/zotero/preferences/preferences_advanced.js b/chrome/content/zotero/preferences/preferences_advanced.js
index ea54b5af6..97ccefe46 100644
--- a/chrome/content/zotero/preferences/preferences_advanced.js
+++ b/chrome/content/zotero/preferences/preferences_advanced.js
@@ -730,9 +730,16 @@ Zotero_Preferences.Debug_Output = {
 				}
 			};
 			try {
-				req.sendAsBinary(data);
+				// Send binary data
+				let numBytes = data.length, ui8Data = new Uint8Array(numBytes);
+				for (let i = 0; i < numBytes; i++) {
+					ui8Data[i] = data.charCodeAt(i) & 0xff;
+				}
+				req.send(ui8Data);
 			}
 			catch (e) {
+				Zotero.debug(e, 1);
+				Components.utils.reportError(e);
 				ps.alert(
 					null,
 					Zotero.getString('general.error'),
diff --git a/chrome/content/zotero/xpcom/sync.js b/chrome/content/zotero/xpcom/sync.js
index c5c264d98..f2a9fc324 100644
--- a/chrome/content/zotero/xpcom/sync.js
+++ b/chrome/content/zotero/xpcom/sync.js
@@ -1804,7 +1804,12 @@ Zotero.Sync.Server = new function () {
 									}
 								};
 								try {
-									req.sendAsBinary(data);
+									// Send binary data
+									let numBytes = data.length, ui8Data = new Uint8Array(numBytes);
+									for (let i = 0; i < numBytes; i++) {
+										ui8Data[i] = data.charCodeAt(i) & 0xff;
+									}
+									req.send(ui8Data);
 								}
 								catch (e) {
 									_error(e);

From 1e2346eba14b7d818714df1555407a9207aaac4e Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Wed, 8 Apr 2015 14:40:31 -0400
Subject: [PATCH 38/44] Revert to modified 3.02 binaries on Windows

To deal with issues running .vbs scripts on some systems. If the 3.02
binaries haven't been reinstalled since this version, reinstall them as
3.02a automatically or on manual upgrade to fix corrupted binaries from
previous gzip issue.

Other platforms unchanged
---
 .../zotero/preferences/preferences_search.js  | 41 +++++++++-----
 chrome/content/zotero/recognizePDF.js         |  2 +-
 chrome/content/zotero/xpcom/fulltext.js       | 32 +++++++++--
 chrome/content/zotero/xpcom/schema.js         | 56 +++++++++++++------
 4 files changed, 95 insertions(+), 36 deletions(-)

diff --git a/chrome/content/zotero/preferences/preferences_search.js b/chrome/content/zotero/preferences/preferences_search.js
index 51930fd72..50202bbc9 100644
--- a/chrome/content/zotero/preferences/preferences_search.js
+++ b/chrome/content/zotero/preferences/preferences_search.js
@@ -182,23 +182,34 @@ Zotero_Preferences.Search = {
 				var infoIsRegistered = Zotero.Fulltext.pdfInfoIsRegistered();
 				var bothRegistered = converterIsRegistered && infoIsRegistered;
 				
+				// On Windows, install if not installed or anything other than 3.02a
+				if (Zotero.isWin) {
+					var converterVersionAvailable = !converterIsRegistered
+						|| Zotero.Fulltext.pdfConverterVersion != '3.02a';
+					var infoVersionAvailable = !infoIsRegistered
+						|| Zotero.Fulltext.pdfInfoVersion != '3.02a';
+					var bothAvailable = converterVersionAvailable && infoVersionAvailable;
+					latestVersion = "3.02a";
+				}
 				// Install if not installed, version unknown, outdated, or
 				// Xpdf 3.02/3.04 (to upgrade to Poppler),
-				var converterVersionAvailable = (!converterIsRegistered ||
-						Zotero.Fulltext.pdfConverterVersion == 'UNKNOWN'
-							|| latestVersion > Zotero.Fulltext.pdfConverterVersion
-							|| (!latestVersion.startsWith('3.02')
-								&& Zotero.Fulltext.pdfConverterVersion.startsWith('3.02'))
-							|| (!latestVersion.startsWith('3.02') && latestVersion != '3.04'
-								&& Zotero.Fulltext.pdfConverterVersion == '3.04'));
-				var infoVersionAvailable = (!infoIsRegistered ||
-						Zotero.Fulltext.pdfInfoVersion == 'UNKNOWN'
-							|| latestVersion > Zotero.Fulltext.pdfInfoVersion
-							|| (!latestVersion.startsWith('3.02')
-								&& Zotero.Fulltext.pdfInfoVersion.startsWith('3.02'))
-							|| (!latestVersion.startsWith('3.02') && latestVersion != '3.04'
-								&& Zotero.Fulltext.pdfInfoVersion == '3.04'));
-				var bothAvailable = converterVersionAvailable && infoVersionAvailable;
+				else {
+					var converterVersionAvailable = (!converterIsRegistered ||
+							Zotero.Fulltext.pdfConverterVersion == 'UNKNOWN'
+								|| latestVersion > Zotero.Fulltext.pdfConverterVersion
+								|| (!latestVersion.startsWith('3.02')
+									&& Zotero.Fulltext.pdfConverterVersion.startsWith('3.02'))
+								|| (!latestVersion.startsWith('3.02') && latestVersion != '3.04'
+									&& Zotero.Fulltext.pdfConverterVersion == '3.04'));
+					var infoVersionAvailable = (!infoIsRegistered ||
+							Zotero.Fulltext.pdfInfoVersion == 'UNKNOWN'
+								|| latestVersion > Zotero.Fulltext.pdfInfoVersion
+								|| (!latestVersion.startsWith('3.02')
+									&& Zotero.Fulltext.pdfInfoVersion.startsWith('3.02'))
+								|| (!latestVersion.startsWith('3.02') && latestVersion != '3.04'
+									&& Zotero.Fulltext.pdfInfoVersion == '3.04'));
+					var bothAvailable = converterVersionAvailable && infoVersionAvailable;
+				}
 				
 				// Up to date -- disable update button
 				if (!converterVersionAvailable && !infoVersionAvailable) {
diff --git a/chrome/content/zotero/recognizePDF.js b/chrome/content/zotero/recognizePDF.js
index 2dc988449..819761caa 100644
--- a/chrome/content/zotero/recognizePDF.js
+++ b/chrome/content/zotero/recognizePDF.js
@@ -142,7 +142,7 @@ var Zotero_RecognizePDF = new function() {
 		var {exec, args} = Zotero.Fulltext.getPDFConverterExecAndArgs();
 		args.push('-enc', 'UTF-8', '-nopgbrk', '-layout', '-l', pages, file.path, cacheFile.path);
 		
-		Zotero.debug("RecognizePDF: Running " + exec + " " + args.map(arg => "'" + arg + "'").join(" "));
+		Zotero.debug("RecognizePDF: Running " + exec.path + " " + args.map(arg => "'" + arg + "'").join(" "));
 		
 		return Zotero.Utilities.Internal.exec(exec, args).then(function() {
 			if(!cacheFile.exists()) {
diff --git a/chrome/content/zotero/xpcom/fulltext.js b/chrome/content/zotero/xpcom/fulltext.js
index 3da6d83a3..09654e246 100644
--- a/chrome/content/zotero/xpcom/fulltext.js
+++ b/chrome/content/zotero/xpcom/fulltext.js
@@ -191,7 +191,6 @@ Zotero.Fulltext = new function(){
 			Components.utils.import("resource://gre/modules/FileUtils.jsm");
 			
 			Zotero.debug("Saving " + uri.spec + " to " + file.path);
-			var output = FileUtils.openSafeFileOutputStream(file);
 			NetUtil.asyncFetch(uri, function (is, status) {
 				if (!Components.isSuccessCode(status)) {
 					Zotero.debug(status, 1);
@@ -204,9 +203,28 @@ Zotero.Fulltext = new function(){
 				
 				Zotero.File.putContentsAsync(file, is)
 				.then(function () {
+					// Delete if too small, since a 404 might not be detected above
+					if (file.fileSize < 50000) {
+						var msg = file.path + " is too small -- deleting";
+						Zotero.debug(msg, 1);
+						Components.utils.reportError(msg);
+						try {
+							file.remove(false);
+						}
+						catch (e) {
+							Zotero.debug(e, 1);
+							Components.utils.reportError(e);
+						}
+						if (callback) {
+							callback(false);
+						}
+						return;
+					}
+					
 					var scriptExt = _getScriptExtension();
 					// On Windows, write out script to hide pdftotext console window
-					if (tool == 'converter') {
+					// TEMP: disabled
+					if (false && tool == 'converter') {
 						if (Zotero.isWin) {
 							var content = Zotero.File.getContentsFromURL('resource://zotero/hide.' + scriptExt);
 							var scriptFile = Zotero.getTempDirectory();
@@ -215,7 +233,8 @@ Zotero.Fulltext = new function(){
 						}
 					}
 					// Write out output redirection script for pdfinfo
-					else if (tool == 'info') {
+					// TEMP: disabled on Windows
+					else if (!Zotero.isWin && tool == 'info') {
 						var content = Zotero.File.getContentsFromURL('resource://zotero/redirect.' + scriptExt);
 						var scriptFile = Zotero.getTempDirectory();
 						scriptFile.append('pdfinfo.' + scriptExt);
@@ -246,6 +265,10 @@ Zotero.Fulltext = new function(){
 					// Write the version number to a file
 					var versionFile = destDir.clone();
 					versionFile.append(fileName + '.version');
+					// TEMP
+					if (Zotero.isWin) {
+						version = '3.02a';
+					}
 					Zotero.File.putContents(versionFile, version + '');
 					
 					Zotero.Fulltext.registerPDFTool(tool);
@@ -327,7 +350,8 @@ Zotero.Fulltext = new function(){
 		// If scripts exist, use those instead
 		switch (tool) {
 		case 'converter':
-			if (Zotero.isWin) {
+			// TEMP: disabled
+			if (false && Zotero.isWin) {
 				var script = Zotero.getZoteroDirectory();
 				script.append('pdftotext.' + _getScriptExtension())
 				if (script.exists()) {
diff --git a/chrome/content/zotero/xpcom/schema.js b/chrome/content/zotero/xpcom/schema.js
index 1ec995ecc..71ea7ad84 100644
--- a/chrome/content/zotero/xpcom/schema.js
+++ b/chrome/content/zotero/xpcom/schema.js
@@ -1604,27 +1604,51 @@ Zotero.Schema = new function(){
 					return;
 				}
 				
-				if (Zotero.Fulltext.pdfInfoIsRegistered()) {
-					let currentVersion = Zotero.Fulltext.pdfInfoVersion;
-					if (currentVersion < availableVersion || currentVersion.startsWith('3.02')
-							|| currentVersion == 'UNKNOWN') {
+				// TEMP
+				if (Zotero.isWin) {
+					if (Zotero.Fulltext.pdfInfoIsRegistered()) {
+						if (Zotero.Fulltext.pdfInfoVersion != '3.02a') {
+							installInfo = true;
+						}
+					}
+					// Install missing component if one is installed
+					else if (Zotero.Fulltext.pdfConverterIsRegistered()) {
 						installInfo = true;
 					}
-				}
-				// Install missing component if one is installed
-				else if (Zotero.Fulltext.pdfConverterIsRegistered()) {
-					installInfo = true;
-				}
-				if (Zotero.Fulltext.pdfConverterIsRegistered()) {
-					let currentVersion = Zotero.Fulltext.pdfConverterVersion;
-					if (currentVersion < availableVersion || currentVersion.startsWith('3.02')
-							|| currentVersion == 'UNKNOWN') {
+					if (Zotero.Fulltext.pdfConverterIsRegistered()) {
+						if (Zotero.Fulltext.pdfConverterVersion != '3.02a') {
+							installConverter = true;
+						}
+					}
+					// Install missing component if one is installed
+					else if (Zotero.Fulltext.pdfInfoIsRegistered()) {
 						installConverter = true;
 					}
+					availableVersion = '3.02';
 				}
-				// Install missing component if one is installed
-				else if (Zotero.Fulltext.pdfInfoIsRegistered()) {
-					installConverter = true;
+				else {
+					if (Zotero.Fulltext.pdfInfoIsRegistered()) {
+						let currentVersion = Zotero.Fulltext.pdfInfoVersion;
+						if (currentVersion < availableVersion || currentVersion.startsWith('3.02')
+								|| currentVersion == 'UNKNOWN') {
+							installInfo = true;
+						}
+					}
+					// Install missing component if one is installed
+					else if (Zotero.Fulltext.pdfConverterIsRegistered()) {
+						installInfo = true;
+					}
+					if (Zotero.Fulltext.pdfConverterIsRegistered()) {
+						let currentVersion = Zotero.Fulltext.pdfConverterVersion;
+						if (currentVersion < availableVersion || currentVersion.startsWith('3.02')
+								|| currentVersion == 'UNKNOWN') {
+							installConverter = true;
+						}
+					}
+					// Install missing component if one is installed
+					else if (Zotero.Fulltext.pdfInfoIsRegistered()) {
+						installConverter = true;
+					}
 				}
 				
 				let prefKey = 'pdfToolsInstallError';

From c1a581168abe5f43bc7533f7d203f63a1d8aaae0 Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Thu, 9 Apr 2015 00:26:12 -0400
Subject: [PATCH 39/44] Merge locales from Transifex

---
 chrome/locale/cs-CZ/zotero/preferences.dtd   |  6 +-
 chrome/locale/cs-CZ/zotero/zotero.dtd        |  6 +-
 chrome/locale/cs-CZ/zotero/zotero.properties | 50 ++++++-------
 chrome/locale/el-GR/zotero/about.dtd         |  4 +-
 chrome/locale/el-GR/zotero/zotero.dtd        | 78 ++++++++++----------
 chrome/locale/fa/zotero/zotero.properties    | 40 +++++-----
 chrome/locale/sl-SI/zotero/preferences.dtd   |  2 +-
 chrome/locale/sl-SI/zotero/zotero.properties | 32 ++++----
 chrome/locale/zh-CN/zotero/preferences.dtd   |  2 +-
 chrome/locale/zh-CN/zotero/zotero.properties | 28 +++----
 10 files changed, 124 insertions(+), 124 deletions(-)

diff --git a/chrome/locale/cs-CZ/zotero/preferences.dtd b/chrome/locale/cs-CZ/zotero/preferences.dtd
index 431604a0f..ab4e5c3fb 100644
--- a/chrome/locale/cs-CZ/zotero/preferences.dtd
+++ b/chrome/locale/cs-CZ/zotero/preferences.dtd
@@ -160,7 +160,7 @@
 
 <!ENTITY zotero.preferences.prefpane.advanced "Pokročilé">
 <!ENTITY zotero.preferences.advanced.filesAndFolders "Soubory a Složky">
-<!ENTITY zotero.preferences.advanced.keys "Shortcuts">
+<!ENTITY zotero.preferences.advanced.keys "Klávesové zkratky">
 
 <!ENTITY zotero.preferences.prefpane.locate "Najít">
 <!ENTITY zotero.preferences.locate.locateEngineManager "Správce mechanismu pro vyhledávání článků">
@@ -201,6 +201,6 @@
 <!ENTITY zotero.preferences.debugOutputLogging.submitToServer "Odeslat na Zotero Server">
 
 <!ENTITY zotero.preferences.openAboutConfig "Otevřít about:config">
-<!ENTITY zotero.preferences.openCSLEdit "Open Style Editor">
-<!ENTITY zotero.preferences.openCSLPreview "Open Style Preview">
+<!ENTITY zotero.preferences.openCSLEdit "Otevřít Editor stylů">
+<!ENTITY zotero.preferences.openCSLPreview "Otevřít Náhled stylů">
 <!ENTITY zotero.preferences.openAboutMemory "Otevřít about:memory">
diff --git a/chrome/locale/cs-CZ/zotero/zotero.dtd b/chrome/locale/cs-CZ/zotero/zotero.dtd
index 99c0a63a1..29e503abd 100644
--- a/chrome/locale/cs-CZ/zotero/zotero.dtd
+++ b/chrome/locale/cs-CZ/zotero/zotero.dtd
@@ -6,8 +6,8 @@
 <!ENTITY zotero.general.delete "Smazat">
 <!ENTITY zotero.general.ok "OK">
 <!ENTITY zotero.general.cancel "Zrušit">
-<!ENTITY zotero.general.refresh "Refresh">
-<!ENTITY zotero.general.saveAs "Save As…">
+<!ENTITY zotero.general.refresh "Obnovit">
+<!ENTITY zotero.general.saveAs "Uložit jako...">
 
 <!ENTITY zotero.errorReport.title "Chybová zpráva Zotera">
 <!ENTITY zotero.errorReport.unrelatedMessages "Může obsahovat zprávy nesouvisející se Zoterem.">
@@ -125,7 +125,7 @@
 <!ENTITY zotero.item.textTransform "Převést text">
 <!ENTITY zotero.item.textTransform.titlecase "Velká Písmena">
 <!ENTITY zotero.item.textTransform.sentencecase "Velké první písmeno">
-<!ENTITY zotero.item.creatorTransform.nameSwap "Swap First/Last Names">
+<!ENTITY zotero.item.creatorTransform.nameSwap "Zaměnit křestní jména / přijmení">
 
 <!ENTITY zotero.toolbar.newNote "Nová poznámka">
 <!ENTITY zotero.toolbar.note.standalone "Nová samostatná poznámka">
diff --git a/chrome/locale/cs-CZ/zotero/zotero.properties b/chrome/locale/cs-CZ/zotero/zotero.properties
index 2ebde2695..21d427ff7 100644
--- a/chrome/locale/cs-CZ/zotero/zotero.properties
+++ b/chrome/locale/cs-CZ/zotero/zotero.properties
@@ -42,7 +42,7 @@ general.create=Vytvořit
 general.delete=Smazat
 general.moreInformation=Více informací
 general.seeForMoreInformation=Pro více informací se podívejte na %S
-general.open=Open %S
+general.open=Otevřít %S
 general.enable=Povolit
 general.disable=Zakázat
 general.remove=Odstranit
@@ -204,11 +204,11 @@ pane.items.trash.multiple=Jste si jisti, že chcete přesunout vybranou položku
 pane.items.delete.title=Smazat
 pane.items.delete=Jste si jisti, že chcete smazat zvolenou položku?
 pane.items.delete.multiple=Jste si jisti, že chcete smazat zvolené položky?
-pane.items.remove.title=Remove from Collection
-pane.items.remove=Are you sure you want to remove the selected item from this collection?
-pane.items.remove.multiple=Are you sure you want to remove the selected items from this collection?
-pane.items.menu.remove=Remove Item from Collection…
-pane.items.menu.remove.multiple=Remove Items from Collection…
+pane.items.remove.title=Odstranit z kolekce
+pane.items.remove=Opravdu chcete odstranit zvolenou položku z kolekce?
+pane.items.remove.multiple=Opravdu chcete odstranit vybrané položky z této kolekce?
+pane.items.menu.remove=Odebrat položku z kolekce...
+pane.items.menu.remove.multiple=Odebrat položky z kolekce...
 pane.items.menu.moveToTrash=Přesunout položku do Koše...
 pane.items.menu.moveToTrash.multiple=Přesunout položky do Koše...
 pane.items.menu.export=Exportovat vybranou položku...
@@ -225,7 +225,7 @@ pane.items.menu.createParent=Vytvořit rodičovskou položku z vybrané položky
 pane.items.menu.createParent.multiple=Vytvořit rodičovské položky z vybraných položek
 pane.items.menu.renameAttachments=Přejmenovat soubor z rodičovských metadat
 pane.items.menu.renameAttachments.multiple=Přejmenovat soubory z rodičovských metadat
-pane.items.showItemInLibrary=Show Item in Library
+pane.items.showItemInLibrary=Zobrazit položku v Knihovně.
 
 pane.items.letter.oneParticipant=Dopis pro %S
 pane.items.letter.twoParticipants=Dopis pro %S a %S
@@ -566,15 +566,15 @@ zotero.preferences.export.quickCopy.exportFormats=Formáty exportu
 zotero.preferences.export.quickCopy.instructions=Rychlé kopírování Vám umožňuje kopírovat vybrané reference do schránky zmáčknutím klávesové zkratky (%S) nebo přetažením položek do textového pole na webové stránce.
 zotero.preferences.export.quickCopy.citationInstructions=Pro citování můžete citace či poznámky pod čarou kopírovat při stisknutí %S nebo stisknutím a držením klávesy Shift při přetahování položky.
 
-zotero.preferences.wordProcessors.installationSuccess=Installation was successful.
-zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S.
-zotero.preferences.wordProcessors.installed=The %S add-in is currently installed.
-zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed.
-zotero.preferences.wordProcessors.install=Install %S Add-in
-zotero.preferences.wordProcessors.reinstall=Reinstall %S Add-in
-zotero.preferences.wordProcessors.installing=Installing %S…
-zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S is incompatible with versions of %3$S before %4$S. Please remove %3$S, or download the latest version from %5$S.
-zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requires %3$S %4$S or later to run. Please download the latest version of %3$S from %5$S.
+zotero.preferences.wordProcessors.installationSuccess=Instalace proběhla úspěšně.
+zotero.preferences.wordProcessors.installationError=Instalace nemohla být dokončena, protože došlo k chybě. Prosím ujistěte se, že je %1$S zavřený a poté restartujte %2$S.
+zotero.preferences.wordProcessors.installed=Add-in %S je v současnosti nainstalován.
+zotero.preferences.wordProcessors.notInstalled=Add-in %S není v současnosti nainstalován.
+zotero.preferences.wordProcessors.install=Nainstalovat add-in %S
+zotero.preferences.wordProcessors.reinstall=Přeinstalovat add-in %S
+zotero.preferences.wordProcessors.installing=Instaluje se %S...
+zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S je nekompatibilní s verzemi %3$S před %4$S. Odstraňte prosím %3$S, nebo stáhněte nejnovější verzi z %5$S.
+zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S vyžaduje ke svému běhu %3$S %4$S. Stáhněte prosím  nejnovější verzi %3$S z %5$S.
 
 zotero.preferences.styles.addStyle=Přidat styl
 
@@ -738,7 +738,7 @@ integration.missingItem.multiple=Položka %1$S v této citaci už dále neexistu
 integration.missingItem.description=Kliknutím na "Ne" smažete kódy pole pro citace obsahujících tuto položku, text citace bude zachován, ale bude smazána z vaší bibliografie.
 integration.removeCodesWarning=Odstranění kódů polí neumožní Zoteru aktualizaci citací a bibliografií v tomto dokumentu. Jste si jistí, že chcete pokračovat?
 integration.upgradeWarning=Váš dokument musí být permanentně aktualizován, abyste mohli pracovat se Zoterem 2.0b7 a vyšším. Před pokračováním je doporučeno vytvoření záložní kopie dokumentu. Jste si jisti, že chcete pokračovat?
-integration.error.newerDocumentVersion=Your document was created with a newer version of Zotero (%1$S) than the currently installed version (%2$S). Please upgrade Zotero before editing this document.
+integration.error.newerDocumentVersion=Váš dokument byl vytvořen v novější verzi Zotera (%1$S), než je ta současně nainstalovaná (%2$S). Před úpravami tohoto dokumentu prosím aktualizujte Zotero. 
 integration.corruptField=Kód pole Zotera odpovídající této citaci, který označuje, které položky ve vaší knihovně tato citace reprezentuje, byl poškozen. Přejete si znovu vybrat položku?
 integration.corruptField.description=Kliknutím na "Ne" smažete kódy pole pro citace obsahující tuto položku, text citace bude zachován, ale citace může být smazána z vaší bibliografie.
 integration.corruptBibliography=Kód pole Zotera pro vaší bibliografii byl poškozen. Má Zotero vymazat tento kód pole a vygenerovat novou bibliografii?
@@ -988,11 +988,11 @@ firstRunGuidance.quickFormatMac=Napište název, nebo autora k nimž hledáte ci
 firstRunGuidance.toolbarButton.new=Zotero otevřete kliknutím sem, nebo použitím klávesové zkratky %S
 firstRunGuidance.toolbarButton.upgrade=Ikona Zotero se nyní nachází v Panelu nástrojů Firefoxu. Zotero otevřete kliknutím na ikonu, nebo stisknutím %S.
 
-styles.bibliography=Bibliography
-styles.editor.save=Save Citation Style
-styles.editor.warning.noItems=No items selected in Zotero.
-styles.editor.warning.parseError=Error parsing style:
-styles.editor.warning.renderError=Error generating citations and bibliography:
-styles.editor.output.individualCitations=Individual Citations
-styles.editor.output.singleCitation=Single Citation (with position "first")
-styles.preview.instructions=Select one or more items in Zotero and click the "Refresh" button to see how these items are rendered by the installed CSL citation styles.
+styles.bibliography=Bibliografie
+styles.editor.save=Uložit citační styl.
+styles.editor.warning.noItems=V Zoteru nejsou vybrány žádné položky.
+styles.editor.warning.parseError=Chyba při parsovaní stylu:
+styles.editor.warning.renderError=Chyba při generování citací a bibliografie:
+styles.editor.output.individualCitations=Jednotlivé citace
+styles.editor.output.singleCitation=Jednotlivá citace (s pozicí "první")
+styles.preview.instructions=Pro náhled těchto položek pomocí nainstalovaných citačních stylů CSL vyberte v Zoteru jednu nebo více položek a klikněte tlačítko "Obnovit".
diff --git a/chrome/locale/el-GR/zotero/about.dtd b/chrome/locale/el-GR/zotero/about.dtd
index 40a016b3f..08cd1590e 100644
--- a/chrome/locale/el-GR/zotero/about.dtd
+++ b/chrome/locale/el-GR/zotero/about.dtd
@@ -9,5 +9,5 @@
 <!ENTITY zotero.executiveProducer "Εκτελεστικός Παραγωγός:">
 <!ENTITY zotero.thanks "Ειδικές Ευχαριστίες:">
 <!ENTITY zotero.about.close "Κλείσιμο">
-<!ENTITY zotero.moreCreditsAndAcknowledgements "More Credits &amp; Acknowledgements">
-<!ENTITY zotero.citationProcessing "Citation &amp; Bibliography Processing">
+<!ENTITY zotero.moreCreditsAndAcknowledgements "Συντελεστές και ευχαριστίες">
+<!ENTITY zotero.citationProcessing "Παραμπομπές &amp; Βιβλιογραφική επεξεργασία">
diff --git a/chrome/locale/el-GR/zotero/zotero.dtd b/chrome/locale/el-GR/zotero/zotero.dtd
index 1a7da7d30..549fe5900 100644
--- a/chrome/locale/el-GR/zotero/zotero.dtd
+++ b/chrome/locale/el-GR/zotero/zotero.dtd
@@ -6,8 +6,8 @@
 <!ENTITY zotero.general.delete "Διαγραφή">
 <!ENTITY zotero.general.ok "ΟΚ">
 <!ENTITY zotero.general.cancel "Ακύρωση">
-<!ENTITY zotero.general.refresh "Refresh">
-<!ENTITY zotero.general.saveAs "Save As…">
+<!ENTITY zotero.general.refresh "Ανανέωση">
+<!ENTITY zotero.general.saveAs "Αποθήκευση ως...">
 
 <!ENTITY zotero.errorReport.title "Αναφορά σφάλματος Zotero">
 <!ENTITY zotero.errorReport.unrelatedMessages "Πιθανόν να συμπεριληφθούν μηνύματα άσχετα με το Zotero.">
@@ -15,7 +15,7 @@
 <!ENTITY zotero.errorReport.submitted "Η αναφορά σας σφάλματος υποβλήθηκε.">
 <!ENTITY zotero.errorReport.reportID "Ταυτότητα αναφοράς:">
 <!ENTITY zotero.errorReport.postToForums "Παρακαλώ, στείλτε ένα μήνυμα στο φόρουμ του Zotero (forums.zotero.org) με αυτή την Ταυτότητα Σφάλματος, μια περιγραφή του προβλήματος και τα απαραίτητα βήματα για την αναπαραγωγή του.">
-<!ENTITY zotero.errorReport.notReviewed "Error reports are generally not reviewed unless referred to in the forums.">
+<!ENTITY zotero.errorReport.notReviewed "Οι αναφορές σφαλμάτων δεν εξετάζονται αν πρώτα δεν αναφερθούν στα φόρα.">
 
 <!ENTITY zotero.upgrade.title "Μάγος Αναβάθμισης Zotero">
 <!ENTITY zotero.upgrade.newVersionInstalled "Εγκαταστήσατε μια νέα έκδοση του Zotero.">
@@ -99,20 +99,20 @@
 <!ENTITY zotero.toolbar.moreItemTypes.label "Περισσότερα">
 <!ENTITY zotero.toolbar.newItemFromPage.label "Δημιουργία Στοιχείου Ιστοσελίδας από την Τρέχουσα Σελίδα">
 <!ENTITY zotero.toolbar.lookup.label "Προσθήκη στοιχείου/ων μέσω Ταυτότητας">
-<!ENTITY zotero.toolbar.removeItem.label "Remove Item...">
-<!ENTITY zotero.toolbar.newCollection.label "New Collection...">
-<!ENTITY zotero.toolbar.newGroup "New Group...">
-<!ENTITY zotero.toolbar.newSubcollection.label "New Subcollection...">
-<!ENTITY zotero.toolbar.newSavedSearch.label "New Saved Search...">
-<!ENTITY zotero.toolbar.emptyTrash.label "Εκκένωση κάδου απορριμάτων">
-<!ENTITY zotero.toolbar.tagSelector.label "Εμφάνιση/Απόκρυψη Επιλογέα ετικετών">
+<!ENTITY zotero.toolbar.removeItem.label "Απομάκρυνση στοιχείου...">
+<!ENTITY zotero.toolbar.newCollection.label "Νέα συλλογή...">
+<!ENTITY zotero.toolbar.newGroup "Νέα ομάδα...">
+<!ENTITY zotero.toolbar.newSubcollection.label "Νέα δευτερεύουσα συλλογή...">
+<!ENTITY zotero.toolbar.newSavedSearch.label "Νέα αποθηκευμένη αναζήτηση...">
+<!ENTITY zotero.toolbar.emptyTrash.label "Άδειασμα κάδου ανακύκλωσης...">
+<!ENTITY zotero.toolbar.tagSelector.label "Εμφάνιση/Απόκρυψη επιλογέα ετικετών">
 <!ENTITY zotero.toolbar.actions.label "Ενέργειες">
-<!ENTITY zotero.toolbar.import.label "Import...">
+<!ENTITY zotero.toolbar.import.label "Εισαγωγή">
 <!ENTITY zotero.toolbar.importFromClipboard "Εισαγωγή από την προσωρινή μνήμη">
 <!ENTITY zotero.toolbar.export.label "Export Library...">
 <!ENTITY zotero.toolbar.rtfScan.label "RTF Scan...">
 <!ENTITY zotero.toolbar.timeline.label "Δημιουργία χρονοδιαγράμματος">
-<!ENTITY zotero.toolbar.preferences.label "Preferences...">
+<!ENTITY zotero.toolbar.preferences.label "Προτιμήσεις...">
 <!ENTITY zotero.toolbar.supportAndDocumentation "Υποστήριξη και Τεκμηρίωση">
 <!ENTITY zotero.toolbar.about.label "Σχετικά με το Zotero">
 <!ENTITY zotero.toolbar.advancedSearch "Προχωρημένη αναζήτηση">
@@ -125,24 +125,24 @@
 <!ENTITY zotero.item.textTransform "Μετασχηματισμός κειμένου">
 <!ENTITY zotero.item.textTransform.titlecase "Μορφή γραμμάτων τίτλου">
 <!ENTITY zotero.item.textTransform.sentencecase "Μορφή γραμμάτων πρότασης">
-<!ENTITY zotero.item.creatorTransform.nameSwap "Swap First/Last Names">
+<!ENTITY zotero.item.creatorTransform.nameSwap "Εναλλαγή πρώτου ονόματος/επιθέτου">
 
 <!ENTITY zotero.toolbar.newNote "Νέα σημείωση">
 <!ENTITY zotero.toolbar.note.standalone "Νέα αυτόνομη σημείωση">
 <!ENTITY zotero.toolbar.note.child "Προσθήκη θυγατρικής σημείωσης">
-<!ENTITY zotero.toolbar.lookup "Lookup by Identifier...">
+<!ENTITY zotero.toolbar.lookup "Εντοπισμός μέσω ταυτοποιητή...">
 <!ENTITY zotero.toolbar.attachment.linked "Link to File...">
-<!ENTITY zotero.toolbar.attachment.add "Store Copy of File...">
+<!ENTITY zotero.toolbar.attachment.add "Αποθήκευση αντιγράφου του αρχείου...">
 <!ENTITY zotero.toolbar.attachment.weblink "Αποθήκευση Συνδέσμου στην Τρέχουσα Σελίδα">
 <!ENTITY zotero.toolbar.attachment.snapshot "Λήψη Στιγμιότυπου της Τρέχουσας Σελίδας">
 
 <!ENTITY zotero.tagSelector.noTagsToDisplay "Δεν υπάρχουν ετικέτες προς εμφάνιση">
 <!ENTITY zotero.tagSelector.filter "Φίλτρο">
-<!ENTITY zotero.tagSelector.showAutomatic "Show automatic">
-<!ENTITY zotero.tagSelector.displayAllInLibrary "Display all tags in this library">
-<!ENTITY zotero.tagSelector.selectVisible "Select visible">
-<!ENTITY zotero.tagSelector.clearVisible "Deselect visible">
-<!ENTITY zotero.tagSelector.clearAll "Deselect all">
+<!ENTITY zotero.tagSelector.showAutomatic "Αυτόματη προβολή">
+<!ENTITY zotero.tagSelector.displayAllInLibrary "Εμφάνιση όλων των ετικετών αυτής της βιβλιοθήκης">
+<!ENTITY zotero.tagSelector.selectVisible "Επιλογή ορατών">
+<!ENTITY zotero.tagSelector.clearVisible "Αποεπιλογή ορατών">
+<!ENTITY zotero.tagSelector.clearAll "Αποεπιλογή όλων">
 <!ENTITY zotero.tagSelector.assignColor "Απόδοση χρώματος...">
 <!ENTITY zotero.tagSelector.renameTag "Rename Tag...">
 <!ENTITY zotero.tagSelector.deleteTag "Delete Tag...">
@@ -205,7 +205,7 @@
 <!ENTITY zotero.annotate.toolbar.collapse.label "Σύμπτυξη όλων των σχολιασμών">
 <!ENTITY zotero.annotate.toolbar.expand.label "Ανάπτυξη όλων των σχολιασμών">
 <!ENTITY zotero.annotate.toolbar.highlight.label "Υπογράμμιση κειμένου">
-<!ENTITY zotero.annotate.toolbar.unhighlight.label "Unhighlight Text">
+<!ENTITY zotero.annotate.toolbar.unhighlight.label "Αναίρεση υπογράμμισης κειμένου">
 
 <!ENTITY zotero.integration.prefs.displayAs.label "Προβολή παραπομπών ως:">
 <!ENTITY zotero.integration.prefs.footnotes.label "Σημειώσεις υποσέλιδου">
@@ -213,7 +213,7 @@
 
 <!ENTITY zotero.integration.prefs.formatUsing.label "Χρήση μορφής:">
 <!ENTITY zotero.integration.prefs.bookmarks.label "Σελιδοδείκτες">
-<!ENTITY zotero.integration.prefs.bookmarks.caption "Bookmarks are preserved across Microsoft Word and OpenOffice, but may be accidentally modified.">
+<!ENTITY zotero.integration.prefs.bookmarks.caption "Στα Microsoft Word και LibreOffice οι σελιδοδείκτες διατηρούνται αλλά ίσως τροποποιηθούν κατά λάθος. Για &#xA;λόγους συμβατότητας, όταν η λειτουργία αυτή είναι επιλεγμένη οι παραθέσεις/παραπομπές δεν μπορούν να εισαχθούν σε υποσέλιδες σημειώσεις ή σε σημειώσεις τέλους.">
 
 
 <!ENTITY zotero.integration.prefs.automaticJournalAbbeviations.label "Αυτόματη συντομογράφηση τίτλων περιοδικών">
@@ -253,7 +253,7 @@
 <!ENTITY zotero.proxy.recognized.disable.label "Να μην γίνεται αυτόματη ανακατεύθυνση των αιτήσεων μέσω προηγουμένως αναγνωρισμένων διαμεσολαβητών.">
 <!ENTITY zotero.proxy.recognized.ignore.label "Αγνόηση">
 
-<!ENTITY zotero.recognizePDF.recognizing.label "Retrieving Metadata...">
+<!ENTITY zotero.recognizePDF.recognizing.label "Ανάκτηση μεταδεδομένων...">
 <!ENTITY zotero.recognizePDF.cancel.label "Ακύρωση">
 <!ENTITY zotero.recognizePDF.pdfName.label "Όνομα PDF">
 <!ENTITY zotero.recognizePDF.itemName.label "Όνομα στοιχείου">
@@ -266,27 +266,27 @@
 <!ENTITY zotero.rtfScan.ambiguousCitations.label "Ασαφής παραπομπή">
 <!ENTITY zotero.rtfScan.mappedCitations.label "Χαρτογραφημένες παραπομπές">
 <!ENTITY zotero.rtfScan.introPage.label "Εισαγωγή">
-<!ENTITY zotero.rtfScan.introPage.description "Zotero can automatically extract and reformat citations and insert a bibliography into RTF files. To get started, choose an RTF file below.">
+<!ENTITY zotero.rtfScan.introPage.description "Το Zotero μπορεί αυτόματα να εξάγει και να αναδιαμορφώσει τις παραπομπές/παραθέσεις και να εισάγει βιβλιογραφία μέσα σε αρχεία τύπου RTF. Η λειτουργία Σάρωσης RTF υποστηρίζει τις παρακάτω μορφές παραπομπών/παραθέσεων: ">
 <!ENTITY zotero.rtfScan.introPage.description2 "Για να ξεκινήσετε, πιο κάτω επιλέξτε ένα αρχείο εισόδου RTF και ένα αρχείο εξόδου:">
 <!ENTITY zotero.rtfScan.scanPage.label "Σάρωση για παραπομπές">
 <!ENTITY zotero.rtfScan.scanPage.description "Το Zotero σαρώνει τα έγγραφά σας για παραπομπές. Παρακαλώ περιμένετε.">
 <!ENTITY zotero.rtfScan.citationsPage.label "Εξακρίβωση παρατιθέμενων στοιχείων">
 <!ENTITY zotero.rtfScan.citationsPage.description "Παρακαλώ, εξετάστε τον κατάλογο των αναγνωρισμένων παραπομπών που ακολουθεί για να βεβαιωθείτε ότι το Zotero έχει επιλέξει τα αντίστοιχα στοιχεία σωστά. Κάθε αχαρτογράφητη ή ασαφής παραπομπή πρέπει να αντιμετωπιστεί πριν προχωρήσετε στο επόμενο βήμα.">
-<!ENTITY zotero.rtfScan.stylePage.label "Document Formatting">
-<!ENTITY zotero.rtfScan.formatPage.label "Formatting Citations">
-<!ENTITY zotero.rtfScan.formatPage.description "Zotero is processing and formatting your RTF file. Please be patient.">
-<!ENTITY zotero.rtfScan.completePage.label "RTF Scan Complete">
-<!ENTITY zotero.rtfScan.completePage.description "Your document has now been scanned and processed. Please ensure that it is formatted correctly.">
-<!ENTITY zotero.rtfScan.inputFile.label "Input File">
-<!ENTITY zotero.rtfScan.outputFile.label "Output File">
+<!ENTITY zotero.rtfScan.stylePage.label "Μορφοποίηση εγγράφου">
+<!ENTITY zotero.rtfScan.formatPage.label "Μορφοποίηση παπομπών/παραθέσεων">
+<!ENTITY zotero.rtfScan.formatPage.description "Το Zotero επεξεργάζεται και μορφοποιεί τα αρχεία σας RTF. Παρακαλώ δείξτε υπομονή.">
+<!ENTITY zotero.rtfScan.completePage.label "Η Σάρωση RTF ολοκληρώθηκε">
+<!ENTITY zotero.rtfScan.completePage.description "Το έγγραφό σας σαρώθηκε και επεξεργάστηκε. Παρααλώ βεβαιωθείτε ότι μοφροποιήθηκε σωστά.">
+<!ENTITY zotero.rtfScan.inputFile.label "Αρχείο εισαγωγής">
+<!ENTITY zotero.rtfScan.outputFile.label "Αρχείο εξαγωγής">
 
-<!ENTITY zotero.file.choose.label "Choose File...">
-<!ENTITY zotero.file.noneSelected.label "No file selected">
+<!ENTITY zotero.file.choose.label "Επιλέξτε αρχείο...">
+<!ENTITY zotero.file.noneSelected.label "Δεν επιλέχθηκε αρχείο">
 
-<!ENTITY zotero.downloadManager.label "Save to Zotero">
-<!ENTITY zotero.downloadManager.saveToLibrary.description "Attachments cannot be saved to the currently selected library. This item will be saved to your library instead.">
-<!ENTITY zotero.downloadManager.noPDFTools.description "To use this feature, you must first install the PDF tools in the Search pane of the Zotero preferences.">
+<!ENTITY zotero.downloadManager.label "Αποθήκευση στο Zotero">
+<!ENTITY zotero.downloadManager.saveToLibrary.description "Στην επιλεγμένη βιβλιοθήκη δεν μπορούν να αποθηκευτούν προσαρτήματα. Αντ' αυτής, το στοιχείο θα αποθηκευτεί στην βιβλιοθήκη σας.">
+<!ENTITY zotero.downloadManager.noPDFTools.description "Για να χρησιμοποιήσετε τη λειτουργία αυτή πρώτα πρέπει να εγκαταστήσετε τα εργαλεία PDF στο πλαίσιο Αναζήτησης των Προτιμήσεων του Zotero.">
 
-<!ENTITY zotero.attachLink.title "Attach Link to URI">
-<!ENTITY zotero.attachLink.label.link "Link:">
-<!ENTITY zotero.attachLink.label.title "Title:">
+<!ENTITY zotero.attachLink.title "Προσάρτηση συνδέσμου στο URI">
+<!ENTITY zotero.attachLink.label.link "Σύνδεσμος:">
+<!ENTITY zotero.attachLink.label.title "Τίτλος:">
diff --git a/chrome/locale/fa/zotero/zotero.properties b/chrome/locale/fa/zotero/zotero.properties
index 817b1eae0..3aa141d50 100644
--- a/chrome/locale/fa/zotero/zotero.properties
+++ b/chrome/locale/fa/zotero/zotero.properties
@@ -48,8 +48,8 @@ general.disable=غیرفعال
 general.remove=حذف
 general.reset=تنظیم مجدد
 general.hide=پنهان‌کردن
-general.quit=Quit
-general.useDefault=Use Default
+general.quit=خروج
+general.useDefault=استفاده از پیش‌فرض
 general.openDocumentation=Open Documentation
 general.numMore=%S more…
 general.openPreferences=بازکردن تنظیمات
@@ -166,7 +166,7 @@ pane.collections.groupLibraries=Group Libraries
 pane.collections.trash=سطل بازیافت
 pane.collections.untitled=بدون عنوان
 pane.collections.unfiled=آیتم‌های دسته‌بندی نشده
-pane.collections.duplicate=Duplicate Items
+pane.collections.duplicate=موارد تکراری
 
 pane.collections.menu.rename.collection=تغییر نام مجموعه...
 pane.collections.menu.edit.savedSearch=ویرایش جستجوی ذخیره شده
@@ -204,11 +204,11 @@ pane.items.trash.multiple=آیتم‌‌های انتخاب شده به سطل 
 pane.items.delete.title=حذف
 pane.items.delete=آیتم‌ انتخاب شده حذف شود؟
 pane.items.delete.multiple=آیتم‌‌های انتخاب شده حذف شوند؟
-pane.items.remove.title=Remove from Collection
-pane.items.remove=Are you sure you want to remove the selected item from this collection?
-pane.items.remove.multiple=Are you sure you want to remove the selected items from this collection?
-pane.items.menu.remove=Remove Item from Collection…
-pane.items.menu.remove.multiple=Remove Items from Collection…
+pane.items.remove.title=حذف از مجموعه
+pane.items.remove=آیا اطمینان دارید  که می‌خواهید مورد انتخاب شده از این مجموعه را حذف کنید؟
+pane.items.remove.multiple=آیا اطمینان دارید  که می خواهید موارد انتخاب شده از این مجموعه را می‌خواهید حذف کنید؟
+pane.items.menu.remove=حذف ایتم از مجموعه
+pane.items.menu.remove.multiple=حذف آیتم‌ها از مجموعه
 pane.items.menu.moveToTrash=انتقال به سطل بازیافت...
 pane.items.menu.moveToTrash.multiple=انتقال به سطل بازیافت...
 pane.items.menu.export=صدور این آیتم...
@@ -225,7 +225,7 @@ pane.items.menu.createParent=ساخت آیتم‌ مادر از این آیتم
 pane.items.menu.createParent.multiple=ساخت آیتم‌های مادر از آیتم‌های انتخاب شده
 pane.items.menu.renameAttachments=تغییر نام پرونده با توجه به فراداده‌های مادر
 pane.items.menu.renameAttachments.multiple=تغییر نام پرونده‌ها با توجه به فراداده‌های مادر
-pane.items.showItemInLibrary=Show Item in Library
+pane.items.showItemInLibrary=نمایش آیتم در کتابخانه
 
 pane.items.letter.oneParticipant=نامه به %S
 pane.items.letter.twoParticipants=نامه به %S و %S
@@ -255,8 +255,8 @@ pane.item.defaultLastName=نام خانوادگی
 pane.item.defaultFullName=نام کامل
 pane.item.switchFieldMode.one=تعویض به تک فیلدی
 pane.item.switchFieldMode.two=تعویض به دو فیلدی
-pane.item.creator.moveUp=Move Up
-pane.item.creator.moveDown=Move Down
+pane.item.creator.moveUp=حرکت به بالا
+pane.item.creator.moveDown=حرکت به پایین
 pane.item.notes.untitled=یادداشت بی‌عنوان
 pane.item.notes.delete.confirm=آیا واقعا می‌خواهید این یادداشت را حذف کنید؟
 pane.item.notes.count.zero=بدون یادداشت:
@@ -477,12 +477,12 @@ fileTypes.document=سند
 
 save.attachment=در حال ذخیره تصویر لحظه‌ای...
 save.link=در حال ذخیره پیوند...
-save.link.error=An error occurred while saving this link.
-save.error.cannotMakeChangesToCollection=You cannot make changes to the currently selected collection.
-save.error.cannotAddFilesToCollection=You cannot add files to the currently selected collection.
+save.link.error=هنگام ذخیره لینک خطایی رخ داد.
+save.error.cannotMakeChangesToCollection=شما نمی‌توانید تغییراتی در مجموعه انتخاب‌شده بدهید.
+save.error.cannotAddFilesToCollection=شما نمی‌توانید به مجموعه انتخاب‌شده، فایل‌ها را اضافه کنید.
 
 ingester.saveToZotero=ذخیره در زوترو
-ingester.saveToZoteroUsing=Save to Zotero using "%S"
+ingester.saveToZoteroUsing=ذخیره در زوترور از طریق  "%S"
 ingester.scraping=در حال ذخیره...
 ingester.scrapingTo=Saving to
 ingester.scrapeComplete=ذخیره شد
@@ -495,7 +495,7 @@ ingester.importReferRISDialog.title=درون‌برد RIS/Refer زوترو
 ingester.importReferRISDialog.text=آیا می‌خواهید آیتم‌ها از "%1$S" به زوترو، درون‌برد شوند؟\n\nشما می‌توانید درون‌برد خودکار RIS/Refer را در تنظیمات زوترو، غیرفعال کنید.
 ingester.importReferRISDialog.checkMsg=همیشه برای این وب‌گاه، اجازه داده شود
 
-ingester.importFile.title=Import File
+ingester.importFile.title=واردکردن فایل
 ingester.importFile.text=Do you want to import the file "%S"?
 ingester.importFile.intoNewCollection=Import into new collection
 
@@ -566,7 +566,7 @@ zotero.preferences.export.quickCopy.exportFormats=قالب‌های صدور
 zotero.preferences.export.quickCopy.instructions=با استفاده از "رونوشت سریع" می‌توان مرجع‌های انتخاب شده را با فشردن کلید میان‌بر (%S) یا کشیدن آیتم‌ها به درون جعبه متن روی صفحه وب، رونوشت‌برداری کرد.
 zotero.preferences.export.quickCopy.citationInstructions=For bibliography styles, you can copy citations or footnotes by pressing %S or holding down Shift before dragging items.
 
-zotero.preferences.wordProcessors.installationSuccess=Installation was successful.
+zotero.preferences.wordProcessors.installationSuccess=با موفقیت نصب شد.
 zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S.
 zotero.preferences.wordProcessors.installed=The %S add-in is currently installed.
 zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed.
@@ -713,7 +713,7 @@ integration.removeBibEntry.body=آیا واقعا می‌خواهید آن را
 
 integration.cited=Cited
 integration.cited.loading=Loading Cited Items…
-integration.ibid=ibid
+integration.ibid=همان
 integration.emptyCitationWarning.title=یادکرد خالی
 integration.emptyCitationWarning.body=یادکرد تعیین شده در شیوه فعلی خالی خواهد بود. آیا واقعا می‌خواهید آن را بیفزایید؟
 integration.openInLibrary=Open in %S
@@ -918,7 +918,7 @@ proxies.recognized.add=افزودن پیشکار
 recognizePDF.noOCR=PDF دارای متن OCR نیست.
 recognizePDF.couldNotRead=خواندن متن از PDF امکان‌پذیر نبود.
 recognizePDF.noMatches=No matching references found
-recognizePDF.fileNotFound=File not found
+recognizePDF.fileNotFound=فایل پیدا نشد
 recognizePDF.limit=Google Scholar query limit reached. Try again later.
 recognizePDF.error=An unexpected error occurred.
 recognizePDF.stopped=لغو شده
@@ -988,7 +988,7 @@ firstRunGuidance.quickFormatMac=Type a title or author to search for a reference
 firstRunGuidance.toolbarButton.new=Click here to open Zotero, or use the %S keyboard shortcut.
 firstRunGuidance.toolbarButton.upgrade=The Zotero icon can now be found in the Firefox toolbar. Click the icon to open Zotero, or use the %S keyboard shortcut.
 
-styles.bibliography=Bibliography
+styles.bibliography=کتابنامه
 styles.editor.save=Save Citation Style
 styles.editor.warning.noItems=No items selected in Zotero.
 styles.editor.warning.parseError=Error parsing style:
diff --git a/chrome/locale/sl-SI/zotero/preferences.dtd b/chrome/locale/sl-SI/zotero/preferences.dtd
index fc2610e01..701fab826 100644
--- a/chrome/locale/sl-SI/zotero/preferences.dtd
+++ b/chrome/locale/sl-SI/zotero/preferences.dtd
@@ -160,7 +160,7 @@
 
 <!ENTITY zotero.preferences.prefpane.advanced "Napredno">
 <!ENTITY zotero.preferences.advanced.filesAndFolders "Datoteke in mape">
-<!ENTITY zotero.preferences.advanced.keys "Shortcuts">
+<!ENTITY zotero.preferences.advanced.keys "Tipke za bližnjice">
 
 <!ENTITY zotero.preferences.prefpane.locate "Lociraj">
 <!ENTITY zotero.preferences.locate.locateEngineManager "Upravitelj pogona iskanja člankov">
diff --git a/chrome/locale/sl-SI/zotero/zotero.properties b/chrome/locale/sl-SI/zotero/zotero.properties
index 8f3f640ba..284c72351 100644
--- a/chrome/locale/sl-SI/zotero/zotero.properties
+++ b/chrome/locale/sl-SI/zotero/zotero.properties
@@ -42,7 +42,7 @@ general.create=Ustvari
 general.delete=Izbriši
 general.moreInformation=Podrobnosti
 general.seeForMoreInformation=Oglejte si %S za več informacij.
-general.open=Open %S
+general.open=Odpri %S
 general.enable=Omogoči
 general.disable=Onemogoči
 general.remove=Odstrani
@@ -204,11 +204,11 @@ pane.items.trash.multiple=Ste prepričani, da želite izbrane vnose vreči v ko
 pane.items.delete.title=Izbriši
 pane.items.delete=Ste prepričani, da želite izbrisati izbrani vnos?
 pane.items.delete.multiple=Ste prepričani, da želite izbrisati izbrane vnose?
-pane.items.remove.title=Remove from Collection
-pane.items.remove=Are you sure you want to remove the selected item from this collection?
-pane.items.remove.multiple=Are you sure you want to remove the selected items from this collection?
-pane.items.menu.remove=Remove Item from Collection…
-pane.items.menu.remove.multiple=Remove Items from Collection…
+pane.items.remove.title=Odstrani iz zbirke
+pane.items.remove=Ste prepričani, da želite izbrani vnos izbrisati iz te zbirke?
+pane.items.remove.multiple=Ste prepričani, da želite izbrane vnose izbrisati iz te zbirke?
+pane.items.menu.remove=Odstrani vnos iz zbirke ...
+pane.items.menu.remove.multiple=Odstrani vnose iz zbirke ...
 pane.items.menu.moveToTrash=Premakni vnos v koš ...
 pane.items.menu.moveToTrash.multiple=Premakni vnose v koš ...
 pane.items.menu.export=Izvozi vnos ...
@@ -566,15 +566,15 @@ zotero.preferences.export.quickCopy.exportFormats=Vrste izvoza
 zotero.preferences.export.quickCopy.instructions=Hitro kopiranje omogoča kopiranje izbranih sklicev na odložišče s pritiskom na tipko za bližnjico (%S) ali vleko vnosov v besedilno polje na spletni strani.
 zotero.preferences.export.quickCopy.citationInstructions=Za sloge bibliografije lahko kopirate citate ali sprotne opombe s pritiskom %S ali s pritisnjeno dvigalko pred vleko vnosov.
 
-zotero.preferences.wordProcessors.installationSuccess=Installation was successful.
-zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S.
-zotero.preferences.wordProcessors.installed=The %S add-in is currently installed.
-zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed.
-zotero.preferences.wordProcessors.install=Install %S Add-in
-zotero.preferences.wordProcessors.reinstall=Reinstall %S Add-in
-zotero.preferences.wordProcessors.installing=Installing %S…
-zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S is incompatible with versions of %3$S before %4$S. Please remove %3$S, or download the latest version from %5$S.
-zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requires %3$S %4$S or later to run. Please download the latest version of %3$S from %5$S.
+zotero.preferences.wordProcessors.installationSuccess=Namestitev je uspela.
+zotero.preferences.wordProcessors.installationError=Nameščanja ni mogoče zaključiti, ker je prišlo do napake. Zagotovite, da je %1$S zaprt, nato ponovno zaženite %2$S.
+zotero.preferences.wordProcessors.installed=Dodatek %S je trenutno nameščen.
+zotero.preferences.wordProcessors.notInstalled=Dodatek %S trenutno ni nameščen.
+zotero.preferences.wordProcessors.install=Namesti dodatek %S
+zotero.preferences.wordProcessors.reinstall=Ponovno namesti dodatek %S
+zotero.preferences.wordProcessors.installing=Nameščanje %S ...
+zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S ni združljiv z različicami %3$S pred %4$S. Odstranite %3$S ali prenesite najnovejšo različico z %5$S.
+zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S zahteva %3$S %4$S ali novejšega. Prenesite najnovejšo različico %3$S z %5$S.
 
 zotero.preferences.styles.addStyle=Dodaj slog
 
@@ -738,7 +738,7 @@ integration.missingItem.multiple=Vnos %1$S iz tega citata ne obstaja več v vaš
 integration.missingItem.description=Z »Ne« boste izbrisali kode polj za citate, ki vsebujejo ta vnos, s čimer boste obdržali besedilo citata, vendar ga boste izbrisali iz bibliografije.
 integration.removeCodesWarning=Odstranitev kod polj bo preprečila Zoteru posodabljanje citatov in bibliografij v tem dokumentu. Ste prepričani, da želite nadaljevati?
 integration.upgradeWarning=Vaš dokument mora biti trajno posodobljen, da bi deloval z Zoterom 2.1 ali novejšim. Priporočamo, da pred nadaljevanjem naredite varnostno kopijo. Ste prepričani, da želite nadaljevati?
-integration.error.newerDocumentVersion=Your document was created with a newer version of Zotero (%1$S) than the currently installed version (%2$S). Please upgrade Zotero before editing this document.
+integration.error.newerDocumentVersion=Vaš dokument je nastal z novejšo različico Zotera (%1$S) od trenutno nameščene (%2$S). Pred urejanjem tega dokumenta raje nadgradite Zotero.
 integration.corruptField=Koda polja Zotero, ki ustreza temu citatu, ki pove Zoteru, kateri vnos iz vaše knjižnice citat predstavlja, je bila okvarjena. Želite ponovno izbrati vnos?
 integration.corruptField.description=Z »Ne« boste izbrisali kode polj za citate, ki vsebujejo ta vnos, s čimer boste ohranili besedilo citata in ga morebiti izbrisali iz bibliografije.
 integration.corruptBibliography=Koda polja Zotero za bibliografijo je okvarjena. Naj Zotero pobriše to kodo polja in ustvari novo bibliografijo?
diff --git a/chrome/locale/zh-CN/zotero/preferences.dtd b/chrome/locale/zh-CN/zotero/preferences.dtd
index eb14d8b3a..47c9a4038 100644
--- a/chrome/locale/zh-CN/zotero/preferences.dtd
+++ b/chrome/locale/zh-CN/zotero/preferences.dtd
@@ -160,7 +160,7 @@
 
 <!ENTITY zotero.preferences.prefpane.advanced "高级">
 <!ENTITY zotero.preferences.advanced.filesAndFolders "文件和文件夹">
-<!ENTITY zotero.preferences.advanced.keys "Shortcuts">
+<!ENTITY zotero.preferences.advanced.keys "快捷键">
 
 <!ENTITY zotero.preferences.prefpane.locate "定位">
 <!ENTITY zotero.preferences.locate.locateEngineManager "文章检索引擎管理器">
diff --git a/chrome/locale/zh-CN/zotero/zotero.properties b/chrome/locale/zh-CN/zotero/zotero.properties
index 6a178b798..edda5fd31 100644
--- a/chrome/locale/zh-CN/zotero/zotero.properties
+++ b/chrome/locale/zh-CN/zotero/zotero.properties
@@ -42,7 +42,7 @@ general.create=创建
 general.delete=删除
 general.moreInformation=更多信息
 general.seeForMoreInformation=查阅 %S 获取更多信息.
-general.open=Open %S
+general.open=打开 %S
 general.enable=启用
 general.disable=禁用
 general.remove=移除
@@ -204,11 +204,11 @@ pane.items.trash.multiple=您确定要将选中的条目移动到回收站吗?
 pane.items.delete.title=删除
 pane.items.delete=您确定要删除所选的条目吗?
 pane.items.delete.multiple=您确定要删除所选的条目吗?
-pane.items.remove.title=Remove from Collection
-pane.items.remove=Are you sure you want to remove the selected item from this collection?
-pane.items.remove.multiple=Are you sure you want to remove the selected items from this collection?
-pane.items.menu.remove=Remove Item from Collection…
-pane.items.menu.remove.multiple=Remove Items from Collection…
+pane.items.remove.title=从分类中移除
+pane.items.remove=您确定要从分类中移除所选的条目吗?
+pane.items.remove.multiple=您确定要从分类中移除所选的多个条目吗?
+pane.items.menu.remove=从分类中移除条目…
+pane.items.menu.remove.multiple=从分类中移除多个条目…
 pane.items.menu.moveToTrash=删除条目…
 pane.items.menu.moveToTrash.multiple=删除条目…
 pane.items.menu.export=导出条目...
@@ -566,13 +566,13 @@ zotero.preferences.export.quickCopy.exportFormats=导出格式
 zotero.preferences.export.quickCopy.instructions=便捷复制是通过快捷键 %S 将所选的条目复制到剪贴板上或通过鼠标拖放将条目粘贴到网页上的文本框中.
 zotero.preferences.export.quickCopy.citationInstructions=要复制文献的引用样式, 在复制引文或脚注前按快捷键%S或按住Shift键然后拖放条目.
 
-zotero.preferences.wordProcessors.installationSuccess=Installation was successful.
-zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S.
-zotero.preferences.wordProcessors.installed=The %S add-in is currently installed.
-zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed.
-zotero.preferences.wordProcessors.install=Install %S Add-in
-zotero.preferences.wordProcessors.reinstall=Reinstall %S Add-in
-zotero.preferences.wordProcessors.installing=Installing %S…
+zotero.preferences.wordProcessors.installationSuccess=安装成功。
+zotero.preferences.wordProcessors.installationError=由于发生错误,无法完成安装。请确保 %1$S 关闭,然后重新启动t %2$S。
+zotero.preferences.wordProcessors.installed=加载项 %S 现在已安装。
+zotero.preferences.wordProcessors.notInstalled=加载项 %S 现在未安装。
+zotero.preferences.wordProcessors.install=安装加载项 %S
+zotero.preferences.wordProcessors.reinstall=重新安装加载项 %S
+zotero.preferences.wordProcessors.installing=安装 %S…
 zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S is incompatible with versions of %3$S before %4$S. Please remove %3$S, or download the latest version from %5$S.
 zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requires %3$S %4$S or later to run. Please download the latest version of %3$S from %5$S.
 
@@ -738,7 +738,7 @@ integration.missingItem.multiple=高亮的引文中的条目 %1$S 已经不在
 integration.missingItem.description=点击“取消”将删除包含此条目的引文的域代码, 保留引用文本并从引文目录中删除.
 integration.removeCodesWarning=移除域代码将使 Zotero 无法更新本文档的引文及引文目录, 您确定要继续吗?
 integration.upgradeWarning=为使您的文档可以在 Zotero 2.1 或更新的版本中工作, 我们需要您永久升级您的文档. 在继续进行前, 我们建议您做一个备份. 您确定要继续吗?
-integration.error.newerDocumentVersion=Your document was created with a newer version of Zotero (%1$S) than the currently installed version (%2$S). Please upgrade Zotero before editing this document.
+integration.error.newerDocumentVersion=创建本文档的 Zotero 版本 (%1$S) 比当前安装的 Zotero 版本 (%2$S)新。编辑本文档前,请先升级 Zotero。
 integration.corruptField=本引文的域代码--负责通知 Zotero 本引文在文献库里所指向的条目--已经损坏. 您要重新选择该条目吗?
 integration.corruptField.description=点击“取消”将删除包含此条目的引文的域代码, 保留引用文本, 但可能将它从您的引文目录中删除.
 integration.corruptBibliography=引文目录的 Zotero 域代码已经损坏, 要 Zotero 清理域代码并重新生成引文目录吗?

From f5ce2d238eb20dcf39f1d3ef8712a45a343c65d0 Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Thu, 9 Apr 2015 02:57:29 -0400
Subject: [PATCH 40/44] Fixes #546, Advanced search : match "any" is broken

---
 chrome/content/zotero/advancedSearch.js       | 20 +----------------
 .../zotero/xpcom/collectionTreeView.js        | 15 -------------
 chrome/content/zotero/xpcom/search.js         | 22 +++++++++++++++++--
 3 files changed, 21 insertions(+), 36 deletions(-)

diff --git a/chrome/content/zotero/advancedSearch.js b/chrome/content/zotero/advancedSearch.js
index 896829686..4a921b51f 100644
--- a/chrome/content/zotero/advancedSearch.js
+++ b/chrome/content/zotero/advancedSearch.js
@@ -62,25 +62,7 @@ var ZoteroAdvancedSearch = new function() {
 			isSearchMode: function() { return true; },
 			getItems: function () {
 				var search = _searchBox.search.clone();
-				
-				// Hack to create a condition for the search's library --
-				// this logic should really go in the search itself instead of here
-				// and in collectionTreeView.js
-				var conditions = search.getSearchConditions();
-				if (!conditions.some(function (condition) condition.condition == 'libraryID')) {
-					let libraryID = _searchBox.search.libraryID;
-					// TEMP: libraryIDInt
-					if (libraryID) {
-						search.addCondition('libraryID', 'is', libraryID);
-					}
-					else {
-						let groups = Zotero.Groups.getAll();
-						for (let i=0; i<groups.length; i++) {
-							search.addCondition('libraryID', 'isNot', groups[i].libraryID);
-						}
-					}
-				}
-				
+				search.libraryID = _libraryID;
 				return Zotero.Items.get(search.search());
 			},
 			isLibrary: function () { return false; },
diff --git a/chrome/content/zotero/xpcom/collectionTreeView.js b/chrome/content/zotero/xpcom/collectionTreeView.js
index 6e26a863e..b84447934 100644
--- a/chrome/content/zotero/xpcom/collectionTreeView.js
+++ b/chrome/content/zotero/xpcom/collectionTreeView.js
@@ -2148,21 +2148,6 @@ Zotero.ItemGroup.prototype.getSearchResults = function(asTempTable) {
 	
 	if(!Zotero.ItemGroupCache.lastResults) {
 		var s = this.getSearchObject();
-	
-		// FIXME: Hack to exclude group libraries for now
-		if (this.isSearch()) {
-			var currentLibraryID = this.ref.libraryID;
-			if (currentLibraryID) {
-				s.addCondition('libraryID', 'is', currentLibraryID);
-			}
-			else {
-				var groups = Zotero.Groups.getAll();
-				for each(var group in groups) {
-					s.addCondition('libraryID', 'isNot', group.libraryID);
-				}
-			}
-		}
-		
 		Zotero.ItemGroupCache.lastResults = s.search();
 		Zotero.ItemGroupCache.lastItemGroup = this;
 	}
diff --git a/chrome/content/zotero/xpcom/search.js b/chrome/content/zotero/xpcom/search.js
index 03c24fdeb..7eb233364 100644
--- a/chrome/content/zotero/xpcom/search.js
+++ b/chrome/content/zotero/xpcom/search.js
@@ -36,7 +36,7 @@ Zotero.Search = function() {
 Zotero.Search.prototype._init = function () {
 	// Public members for access by public methods -- do not access directly
 	this._id = null;
-	this._libraryID = null;
+	this._libraryID; // TEMP: libraryIDInt
 	this._key = null;
 	this._name = null;
 	this._dateAdded = null;
@@ -290,7 +290,7 @@ Zotero.Search.prototype.save = function(fixGaps) {
 			this._changed.dateModified ?
 				this.dateModified : Zotero.DB.transactionDateTime,
 			Zotero.DB.transactionDateTime,
-			this.libraryID ? this.libraryID : this.libraryID,
+			this.libraryID ? this.libraryID : null,
 			key
 		];
 		
@@ -1139,6 +1139,23 @@ Zotero.Search.prototype._buildQuery = function(){
 			+ ")";
 	}
 	
+	// Limit to library search belongs to
+	//
+	// This is equivalent to adding libraryID as a search condition,
+	// but it works with ANY
+	if (this.libraryID !== undefined) {
+		sql += " AND (itemID IN (SELECT itemID FROM items WHERE libraryID";
+		// TEMP: libraryIDInt
+		if (this.libraryID) {
+			sql += "=?";
+			sqlParams.push(this.libraryID);
+		}
+		else {
+			sql += " IS NULL";
+		}
+		sql += "))";
+	}
+	
 	if (this._hasPrimaryConditions) {
 		sql += " AND ";
 		
@@ -1755,6 +1772,7 @@ Zotero.Searches = new function(){
 		for each(var row in rows) {
 			var search = new Zotero.Search;
 			search.id = row.id;
+			search.libraryID = libraryID;
 			searches.push(search);
 		}
 		return searches;

From 1c2b2575f744226639652767cc39acddcd3a7afd Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Thu, 9 Apr 2015 03:47:43 -0400
Subject: [PATCH 41/44] Fix excessive file sync mtime updates/checks
 (probably?)

---
 chrome/content/zotero/xpcom/storage.js | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/chrome/content/zotero/xpcom/storage.js b/chrome/content/zotero/xpcom/storage.js
index eb259f84e..ac1940457 100644
--- a/chrome/content/zotero/xpcom/storage.js
+++ b/chrome/content/zotero/xpcom/storage.js
@@ -864,13 +864,14 @@ Zotero.Sync.Storage = new function () {
 						Zotero.debug("Remote mod time for item " + lk + " is " + itemModTimes[item.id]);
 						
 						// Ignore attachments whose stored mod times haven't changed
-						if (row.storageModTime == itemModTimes[id]) {
+						if (row.storageModTime == itemModTimes[item.id]) {
 							Zotero.debug("Storage mod time (" + row.storageModTime + ") "
 								+ "hasn't changed for item " + lk);
 							continue;
 						}
 						
-						Zotero.debug("Marking attachment " + lk + " for download");
+						Zotero.debug("Marking attachment " + lk + " for download "
+							+ "(stored mtime: " + itemModTimes[item.id] + ")");
 						updatedStates[item.id] = Zotero.Sync.Storage.SYNC_STATE_FORCE_DOWNLOAD;
 					}
 					

From b599aed8eda595ee5c7f4cc54df4c11f2eed886c Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Fri, 10 Apr 2015 12:58:46 -0400
Subject: [PATCH 42/44] Fix pasting of non-HTTP URLs into notes from non-note
 sources

Copying zotero:// and other non-HTTP links from a note itself was fixed
in #452, but copying such links from other sources still stripped the
hrefs. This removes the patch in #452 and just gets the HTML directly
from the clipboard. I'm not sure why TinyMCE doesn't try to do this by
default (it only tries for plaintext), so maybe there's a problem with
this approach, but it seems to work for me (strips bad HTML, etc.).

Fixes #697
---
 resource/tinymce/plugins/paste/editor_plugin.js | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/resource/tinymce/plugins/paste/editor_plugin.js b/resource/tinymce/plugins/paste/editor_plugin.js
index 848abfdd8..36b85c2af 100644
--- a/resource/tinymce/plugins/paste/editor_plugin.js
+++ b/resource/tinymce/plugins/paste/editor_plugin.js
@@ -152,6 +152,15 @@
 
 				// Check if browser supports direct plaintext access
 				if (e.clipboardData || dom.doc.dataTransfer) {
+					// Added by Zotero
+					// Get HTML from the clipboard directly
+					var html = e.clipboardData && e.clipboardData.getData('text/html');
+					if (html) {
+						e.preventDefault();
+						process({content : html});
+						return;
+					}
+
 					textContent = (e.clipboardData || dom.doc.dataTransfer).getData('Text');
 
 					if (ed.pasteAsPlainText) {
@@ -248,14 +257,6 @@
 							each(nl, function(n) {
 								var child = n.firstChild;
 
-								// Added by Zotero
-								// fix copy/paste of non-http links
-								var links = n.querySelectorAll('a');
-								for (var i = 0; i < links.length; i++) {
-									if (!links[i].href && links[i].getAttribute('data-mce-href'))
-										links[i].setAttribute('href', links[i].getAttribute('data-mce-href'));
-								}
-
 								// WebKit inserts a DIV container with lots of odd styles
 								if (child && child.nodeName == 'DIV' && child.style.marginTop && child.style.backgroundColor) {
 									dom.remove(child, 1);

From 164f4e4321c57609f3c3aba3408abfe0c3531189 Mon Sep 17 00:00:00 2001
From: Aurimas Vinckevicius <aurimas.dev@gmail.com>
Date: Fri, 10 Apr 2015 19:46:57 -0500
Subject: [PATCH 43/44] More informative error messages for failed file loads

---
 components/zotero-service.js | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/components/zotero-service.js b/components/zotero-service.js
index 111005c64..6671661f5 100644
--- a/components/zotero-service.js
+++ b/components/zotero-service.js
@@ -328,8 +328,10 @@ function ZoteroService() {
 		
 		zContext.Zotero.debug("Initialized in "+(Date.now() - start)+" ms");
 	} catch(e) {
-		var msg = typeof e == 'string' ? e : e.name;
-		dump(e + "\n\n");
+		var msg = e instanceof Error
+			? e.name + ': ' + e.message + '\n' + e.fileName + ':' + e.lineNumber + '\n' + e.stack
+			: '' + e;
+		dump(msg + '\n');
 		Components.utils.reportError(e);
 		throw e;
 	}
@@ -475,4 +477,4 @@ if (XPCOMUtils.generateNSGetFactory) {
 	var NSGetFactory = XPCOMUtils.generateNSGetFactory([ZoteroService, ZoteroCommandLineHandler]);
 } else {
 	var NSGetModule = XPCOMUtils.generateNSGetModule([ZoteroService, ZoteroCommandLineHandler]);
-}
\ No newline at end of file
+}

From 9511c434329645cc44ae2ca37efbdd0b757d6377 Mon Sep 17 00:00:00 2001
From: Dan Stillman <dstillman@zotero.org>
Date: Sun, 12 Apr 2015 20:28:50 -0400
Subject: [PATCH 44/44] Create empty data directory in test profile

This prevents the data directory migration prompt from showing up if
there's an existing data directory inside the Standalone profile.
---
 test/runtests.sh | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/test/runtests.sh b/test/runtests.sh
index 6da6f8796..ee9ee850a 100755
--- a/test/runtests.sh
+++ b/test/runtests.sh
@@ -70,6 +70,9 @@ echo "$ZOTERO_UNIT_PATH" > "$PROFILE/extensions/zotero-unit@zotero.org"
 makePath ZOTERO_PATH "`dirname "$CWD"`"
 echo "$ZOTERO_PATH" > "$PROFILE/extensions/zotero@chnm.gmu.edu"
 
+# Create data directory
+mkdir "$PROFILE/zotero"
+
 cat <<EOF > "$PROFILE/prefs.js"
 user_pref("extensions.autoDisableScopes", 0);
 user_pref("extensions.zotero.debug.log", $DEBUG);