← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~tomasgroth/openlp/packaging-win-fix into lp:openlp

 

Tomas Groth has proposed merging lp:~tomasgroth/openlp/packaging-win-fix into lp:openlp.

Requested reviews:
  OpenLP Core (openlp-core)

For more details, see:
https://code.launchpad.net/~tomasgroth/openlp/packaging-win-fix/+merge/281484

Update windows building for qt5.
-- 
Your team OpenLP Core is requested to review the proposed merge of lp:~tomasgroth/openlp/packaging-win-fix into lp:openlp.
=== added file '.bzrignore'
--- .bzrignore	1970-01-01 00:00:00 +0000
+++ .bzrignore	2016-01-03 21:12:58 +0000
@@ -0,0 +1,36 @@
+*.pyc
+*.*~
+\#*\#
+*.eric4project
+*.eric5project
+*.ropeproject
+*.e4*
+.eric4project
+.komodotools
+*.komodoproject
+list
+openlp.org 2.0.e4*
+documentation/build/html
+documentation/build/doctrees
+*.log*
+dist
+OpenLP.egg-info
+build
+resources/innosetup/Output
+_eric4project
+.pylint.d
+*.qm
+openlp/core/resources.py.old
+*.qm
+resources/windows/warnOpenLP.txt
+openlp.cfg
+.idea
+openlp.pro
+.kdev4
+tests.kdev4
+*.nja
+*.orig
+__pycache__
+*.dll
+*.DS_Store
+config.ini

=== renamed file '.bzrignore' => '.bzrignore.moved'
=== added directory 'gentoo'
=== added file 'gentoo/openlp-1.9.4.ebuild'
--- gentoo/openlp-1.9.4.ebuild	1970-01-01 00:00:00 +0000
+++ gentoo/openlp-1.9.4.ebuild	2016-01-03 21:12:58 +0000
@@ -0,0 +1,31 @@
+# Copyright 1999-2009 Gentoo Foundation
+# Copyright 2010 Jaak Ristioja
+# Copyright 2015 OpenLP Developers
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=2
+RESTRICT_PYTHON_ABIS="3.*"
+inherit python
+
+DESCRIPTION="Free church presentation software"
+HOMEPAGE="http://openlp.org/";
+SRC_URI="mirror://sourceforge/${PN}/${PV}/OpenLP-${PV}-src.tar.gz"
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="alpha amd64 arm hppa ia64 ppc ppc64 sparc x86 x86-fbsd x86-freebsd amd64-linux x86-linux x86-macos x86-solaris"
+
+RDEPEND=">=dev-lang/python-3.4.0
+         dev-python/beautifulsoup
+         dev-python/chardet
+         dev-python/lxml
+         dev-python/pyenchant
+         dev-python/PyQt4[X,multimedia]
+         dev-python/sqlalchemy"
+DEPEND="${RDEPEND}"
+
+PYTHON_DEPEND="3:3.4"
+PYTHON_MODNAME="openlp"
+
+S=${WORKDIR}/OpenLP-${PV}-src

=== added directory 'launchpad-ppa'
=== added file 'launchpad-ppa/Makefile'
--- launchpad-ppa/Makefile	1970-01-01 00:00:00 +0000
+++ launchpad-ppa/Makefile	2016-01-03 21:12:58 +0000
@@ -0,0 +1,17 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+
+build:
+	mkdir -p resources/i18n/qm
+	for TSFILE in resources/i18n/*.ts; do\
+		lrelease-qt4 $$TSFILE -qm resources/i18n/qm/`basename $$TSFILE .ts`.qm;\
+	done
+
+install:
+	mkdir -p $(DESTDIR)/usr/share/openlp/i18n
+	cd resources/i18n/qm && for QMFILE in*.qm; do\
+		mv $QMFILE $(DESTDIR)/usr/share/openlp/i18n;\
+	done
+
+clean:
+	rm -fR resources/i18n/qm

=== added directory 'launchpad-ppa/debian'
=== added file 'launchpad-ppa/debian/changelog'
--- launchpad-ppa/debian/changelog	1970-01-01 00:00:00 +0000
+++ launchpad-ppa/debian/changelog	2016-01-03 21:12:58 +0000
@@ -0,0 +1,389 @@
+openlp (1.9.4+bzr1355-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sun, 06 Mar 2011 00:10:03 -0500
+
+openlp (1.9.4+bzr1355-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sun, 06 Mar 2011 00:07:03 -0500
+
+openlp (1.9.4+bzr1355-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sun, 06 Mar 2011 00:05:27 -0500
+
+openlp (1.9.4+bzr1355-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sun, 06 Mar 2011 00:03:17 -0500
+
+openlp (1.9.4+bzr1350-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 05 Mar 2011 00:08:15 -0500
+
+openlp (1.9.4+bzr1350-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 05 Mar 2011 00:06:40 -0500
+
+openlp (1.9.4+bzr1350-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 05 Mar 2011 00:05:09 -0500
+
+openlp (1.9.4+bzr1350-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 05 Mar 2011 00:03:14 -0500
+
+openlp (1.9.4+bzr1347-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Fri, 04 Mar 2011 00:04:49 -0500
+
+openlp (1.9.4+bzr1347-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Fri, 04 Mar 2011 00:04:15 -0500
+
+openlp (1.9.4+bzr1347-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Fri, 04 Mar 2011 00:03:34 -0500
+
+openlp (1.9.4+bzr1347-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Fri, 04 Mar 2011 00:02:43 -0500
+
+openlp (1.9.4+bzr1344-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Thu, 03 Mar 2011 00:03:56 -0500
+
+openlp (1.9.4+bzr1344-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Thu, 03 Mar 2011 00:03:30 -0500
+
+openlp (1.9.4+bzr1344-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Thu, 03 Mar 2011 00:03:05 -0500
+
+openlp (1.9.4+bzr1344-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Thu, 03 Mar 2011 00:02:26 -0500
+
+openlp (1.9.4+bzr1342-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Tue, 01 Mar 2011 00:03:44 -0500
+
+openlp (1.9.4+bzr1342-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Tue, 01 Mar 2011 00:03:28 -0500
+
+openlp (1.9.4+bzr1342-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Tue, 01 Mar 2011 00:03:03 -0500
+
+openlp (1.9.4+bzr1342-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Tue, 01 Mar 2011 00:02:28 -0500
+
+openlp (1.9.4+bzr1341-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sun, 27 Feb 2011 00:04:05 -0500
+
+openlp (1.9.4+bzr1341-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sun, 27 Feb 2011 00:03:48 -0500
+
+openlp (1.9.4+bzr1341-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sun, 27 Feb 2011 00:03:20 -0500
+
+openlp (1.9.4+bzr1341-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sun, 27 Feb 2011 00:02:34 -0500
+
+openlp (1.9.4+bzr1337-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 26 Feb 2011 00:04:02 -0500
+
+openlp (1.9.4+bzr1337-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 26 Feb 2011 00:03:44 -0500
+
+openlp (1.9.4+bzr1337-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 26 Feb 2011 00:03:18 -0500
+
+openlp (1.9.4+bzr1337-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 26 Feb 2011 00:02:32 -0500
+
+openlp (1.9.4+bzr1332-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Fri, 25 Feb 2011 00:04:00 -0500
+
+openlp (1.9.4+bzr1332-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Fri, 25 Feb 2011 00:03:41 -0500
+
+openlp (1.9.4+bzr1332-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Fri, 25 Feb 2011 00:03:16 -0500
+
+openlp (1.9.4+bzr1332-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Fri, 25 Feb 2011 00:02:36 -0500
+
+openlp (1.9.4+bzr1328-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Thu, 24 Feb 2011 00:03:47 -0500
+
+openlp (1.9.4+bzr1328-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Thu, 24 Feb 2011 00:03:31 -0500
+
+openlp (1.9.4+bzr1328-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Thu, 24 Feb 2011 00:03:07 -0500
+
+openlp (1.9.4+bzr1328-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Thu, 24 Feb 2011 00:02:28 -0500
+
+openlp (1.9.4+bzr1324-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Wed, 23 Feb 2011 00:03:48 -0500
+
+openlp (1.9.4+bzr1324-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Wed, 23 Feb 2011 00:03:33 -0500
+
+openlp (1.9.4+bzr1324-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Wed, 23 Feb 2011 00:03:08 -0500
+
+openlp (1.9.4+bzr1324-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Wed, 23 Feb 2011 00:02:28 -0500
+
+openlp (1.9.4+bzr1322-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Tue, 22 Feb 2011 00:04:06 -0500
+
+openlp (1.9.4+bzr1322-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Tue, 22 Feb 2011 00:03:52 -0500
+
+openlp (1.9.4+bzr1322-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Tue, 22 Feb 2011 00:03:28 -0500
+
+openlp (1.9.4+bzr1322-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Tue, 22 Feb 2011 00:02:42 -0500
+
+openlp (1.9.4+bzr1320-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Mon, 21 Feb 2011 00:03:59 -0500
+
+openlp (1.9.4+bzr1320-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Mon, 21 Feb 2011 00:03:45 -0500
+
+openlp (1.9.4+bzr1320-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Mon, 21 Feb 2011 00:03:21 -0500
+
+openlp (1.9.4+bzr1320-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Mon, 21 Feb 2011 00:02:41 -0500
+
+openlp (1.9.4+bzr1316-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sun, 20 Feb 2011 05:32:08 -0500
+
+openlp (1.9.4+bzr1316-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sun, 20 Feb 2011 05:31:51 -0500
+
+openlp (1.9.4+bzr1316-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sun, 20 Feb 2011 05:31:28 -0500
+
+openlp (1.9.4+bzr1316-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sun, 20 Feb 2011 05:30:49 -0500
+
+openlp (1.9.4+bzr1315-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 19 Feb 2011 16:24:12 -0500
+
+openlp (1.9.4+bzr1315-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 19 Feb 2011 16:23:51 -0500
+
+openlp (1.9.4+bzr1315-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 19 Feb 2011 16:23:28 -0500
+
+openlp (1.9.4+bzr1315-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 19 Feb 2011 16:22:49 -0500
+
+openlp (1.9.4+bzr1314-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 19 Feb 2011 15:35:36 -0500
+
+openlp (1.9.4+bzr1314-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 19 Feb 2011 15:35:21 -0500
+
+openlp (1.9.4+bzr1314-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 19 Feb 2011 15:34:53 -0500
+
+openlp (1.9.4+bzr1314-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 19 Feb 2011 15:34:10 -0500
+
+openlp (1.9.4+bzr1313-0ubuntu1~natty1) natty; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 19 Feb 2011 13:58:14 -0500
+
+openlp (1.9.4+bzr1313-0ubuntu1~maverick1) maverick; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 19 Feb 2011 13:57:40 -0500
+
+openlp (1.9.4+bzr1313-0ubuntu1~lucid1) lucid; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 19 Feb 2011 13:57:11 -0500
+
+openlp (1.9.4+bzr1313-0ubuntu1~karmic1) karmic; urgency=low
+
+  * Autobuild
+
+ --  <openlp@xxxxxxxxxxxxx>  Sat, 19 Feb 2011 13:56:17 -0500
+
+openlp (0.0.0+bzr664-0ubuntu1) karmic; urgency=low
+
+  * Initial release
+
+ -- Michael Gorven <michael@xxxxxxxxxxxxx>  Fri, 06 Nov 2009 09:46:40 +0200

=== added file 'launchpad-ppa/debian/compat'
--- launchpad-ppa/debian/compat	1970-01-01 00:00:00 +0000
+++ launchpad-ppa/debian/compat	2016-01-03 21:12:58 +0000
@@ -0,0 +1,1 @@
+5

=== added file 'launchpad-ppa/debian/control'
--- launchpad-ppa/debian/control	1970-01-01 00:00:00 +0000
+++ launchpad-ppa/debian/control	2016-01-03 21:12:58 +0000
@@ -0,0 +1,20 @@
+Source: openlp
+Section: python
+Priority: extra
+Maintainer: OpenLP Developers <openlp-dev@xxxxxxxxxxxxxxxxxxx>
+Build-Depends: cdbs, debhelper (>= 5), python-setuptools, python-support,
+ python, qt4-dev-tools
+Standards-Version: 3.8.3
+Homepage: http://openlp.org/
+
+Package: openlp
+Architecture: all
+Depends: ${shlibs:Depends}, ${misc:Depends}, ${python:Depends}, python-qt4,
+ python-qt4-phonon, python-qt4-gl, python-sqlalchemy, python-chardet,
+ python-beautifulsoup, python-lxml, python-sqlite, python-enchant,
+ python-mako, python-migrate
+Conflicts: python-openlp
+Description: Church lyrics projection application
+ OpenLP is free church presentation software, or lyrics projection software,
+ used to display slides of songs, Bible verses, videos, images, and even
+ presentations for church worship using a computer and a data projector.

=== added file 'launchpad-ppa/debian/copyright'
--- launchpad-ppa/debian/copyright	1970-01-01 00:00:00 +0000
+++ launchpad-ppa/debian/copyright	2016-01-03 21:12:58 +0000
@@ -0,0 +1,10 @@
+Format-Specification: http://wiki.debian.org/Proposals/CopyrightFormat
+Upstream-Name: OpenLP
+Upstream-Maintainer: OpenLP Developers <openlp-dev@xxxxxxxxxxxxxxxxxxx>
+Upstream-Source: http://openlp.org/
+
+Files: *
+Copyright: (c) 2008-2015 OpenLP Developers
+License: GPL-2
+X-Comment: On Debian GNU/Linux systems, the complete text of the
+ GPL-2 License can be found in /usr/share/common-licenses/GPL-2

=== added file 'launchpad-ppa/debian/docs'
--- launchpad-ppa/debian/docs	1970-01-01 00:00:00 +0000
+++ launchpad-ppa/debian/docs	2016-01-03 21:12:58 +0000
@@ -0,0 +1,1 @@
+documentation

=== added file 'launchpad-ppa/debian/openlp.install'
--- launchpad-ppa/debian/openlp.install	1970-01-01 00:00:00 +0000
+++ launchpad-ppa/debian/openlp.install	2016-01-03 21:12:58 +0000
@@ -0,0 +1,1 @@
+resources/openlp.desktop /usr/share/applications

=== added file 'launchpad-ppa/debian/pycompat'
--- launchpad-ppa/debian/pycompat	1970-01-01 00:00:00 +0000
+++ launchpad-ppa/debian/pycompat	2016-01-03 21:12:58 +0000
@@ -0,0 +1,1 @@
+2

=== added file 'launchpad-ppa/debian/pyversions'
--- launchpad-ppa/debian/pyversions	1970-01-01 00:00:00 +0000
+++ launchpad-ppa/debian/pyversions	2016-01-03 21:12:58 +0000
@@ -0,0 +1,1 @@
+2.5-

=== added file 'launchpad-ppa/debian/rules'
--- launchpad-ppa/debian/rules	1970-01-01 00:00:00 +0000
+++ launchpad-ppa/debian/rules	2016-01-03 21:12:58 +0000
@@ -0,0 +1,21 @@
+#!/usr/bin/make -f
+
+DEB_PYTHON_SYSTEM := pysupport
+DEB_MAKE_BUILD_TARGET := build
+DEB_MAKE_INSTALL_TARGET := install
+DEB_MAKE_CLEAN_TARGET := clean
+
+include /usr/share/cdbs/1/rules/debhelper.mk
+include /usr/share/cdbs/1/class/python-distutils.mk
+include /usr/share/cdbs/1/class/makefile.mk
+
+binary-post-install/openlp::
+	for SIZE in 16x16 32x32 48x48 64x64 128x128 256x256; do \
+		mkdir -p debian/openlp/usr/share/icons/hicolor/$$SIZE/apps && \
+		cp resources/images/openlp-logo-$$SIZE.png debian/openlp/usr/share/icons/hicolor/$$SIZE/apps/openlp.png; \
+	done
+
+	mkdir -p debian/openlp/usr/share/icons/hicolor/scalable/apps && \
+	cp resources/images/openlp-logo.svg debian/openlp/usr/share/icons/hicolor/scalable/apps/openlp.svg
+
+	cd debian/openlp/usr/bin/ && mv openlp.pyw openlp

=== added directory 'osx'
=== added file 'osx/DmgImageIcon.png'
Binary files osx/DmgImageIcon.png	1970-01-01 00:00:00 +0000 and osx/DmgImageIcon.png	2016-01-03 21:12:58 +0000 differ
=== added file 'osx/DmgImageInstallBackground.png'
Binary files osx/DmgImageInstallBackground.png	1970-01-01 00:00:00 +0000 and osx/DmgImageInstallBackground.png	2016-01-03 21:12:58 +0000 differ
=== added file 'osx/DmgImageInstallBackgroundClean.png'
Binary files osx/DmgImageInstallBackgroundClean.png	1970-01-01 00:00:00 +0000 and osx/DmgImageInstallBackgroundClean.png	2016-01-03 21:12:58 +0000 differ
=== added file 'osx/Info.plist'
--- osx/Info.plist	1970-01-01 00:00:00 +0000
+++ osx/Info.plist	2016-01-03 21:12:58 +0000
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd";>
+<plist version="1.0">
+<dict>
+	<key>CFBundleDocumentTypes</key>
+	<array>
+		<dict>
+			<key>CFBundleTypeExtension</key>
+			<array>
+				<string>osz</string>
+			</array>
+			<key>CFBundleTypeIconFiles</key>
+			<array>
+				<string>OpenLP.icns</string>
+			</array>
+			<key>CFBundleTypeName</key>
+			<string>OpenLP Service</string>
+			<key>CFBundleTypeRole</key>
+			<string>Viewer</string>
+			<key>LSHandlerRank</key>
+			<string>Owner</string>
+			<key>LSItemContentTypes</key>
+			<array>
+				<string>org.openlp.osz</string>
+			</array>
+		</dict>
+		<dict>
+			<key>CFBundleTypeExtension</key>
+			<array>
+				<string>otz</string>
+			</array>
+			<key>CFBundleTypeIconFiles</key>
+			<array>
+				<string>OpenLP.icns</string>
+			</array>
+			<key>CFBundleTypeName</key>
+			<string>OpenLP Theme</string>
+			<key>CFBundleTypeRole</key>
+			<string>Viewer</string>
+			<key>LSHandlerRank</key>
+			<string>Owner</string>
+			<key>LSItemContentTypes</key>
+			<array>
+				<string>org.openlp.otz</string>
+			</array>
+		</dict>
+	</array>
+	<key>UTExportedTypeDeclarations</key>
+	<array>
+		<dict>
+			<key>UTTypeIdentifier</key>
+			<string>org.openlp.osz</string>
+			<key>UTTypeDescription</key>
+			<string>OpenLP Service</string>
+			<key>UTTypeConformsTo</key>
+			<array>
+				<string>public.data</string>
+				<string>public.content</string>
+			</array>
+			<key>UTTypeTagSpecification</key>
+			<dict>
+				<key>public.filename-extension</key>
+				<array>
+					<string>osz</string>
+				</array>
+				<key>public.mime-type</key>
+				<array>
+					<string>application/x-openlp-service</string>
+				</array>
+			</dict>
+		</dict>
+		<dict>
+			<key>UTTypeIdentifier</key>
+			<string>org.openlp.otz</string>
+			<key>UTTypeDescription</key>
+			<string>OpenLP Theme</string>
+			<key>UTTypeConformsTo</key>
+			<array>
+				<string>public.data</string>
+				<string>public.content</string>
+			</array>
+			<key>UTTypeTagSpecification</key>
+			<dict>
+				<key>public.filename-extension</key>
+				<array>
+					<string>otz</string>
+				</array>
+				<key>public.mime-type</key>
+				<array>
+					<string>application/x-openlp-theme</string>
+				</array>
+			</dict>
+		</dict>
+	</array>
+	<key>CFBundleIdentifier</key>
+	<string>org.openlp.OpenLP</string>
+	<key>CFBundleShortVersionString</key>
+	<string>%(openlp_version)s</string>
+	<key>CFBundleVersion</key>
+	<string>%(openlp_version)s</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleDisplayName</key>
+	<string>OpenLP</string>
+	<key>CFBundleIconFile</key>
+	<string>OpenLP.icns</string>
+	<key>CFBundleExecutable</key>
+	<string>MacOS/OpenLP</string>
+	<key>CFBundleName</key>
+	<string>OpenLP</string>
+	<key>CFBundleGetInfoString</key>
+	<string>OpenLP %(openlp_version)s</string>
+	<key>LSHasLocalizedDisplayName</key>
+	<false/>
+	<key>NSAppleScriptEnabled</key>
+	<false/>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>NSHighResolutionCapable</key>
+	<true/>
+	<key>CFBundleHelpBookFolder</key>
+	<string>OpenLP.help</string>
+	<key>CFBundleHelpBookName</key>
+	<string>org.openlp.OpenLP.help</string>
+</dict>
+</plist>

=== added file 'osx/LICENSE.txt'
--- osx/LICENSE.txt	1970-01-01 00:00:00 +0000
+++ osx/LICENSE.txt	2016-01-03 21:12:58 +0000
@@ -0,0 +1,339 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.

=== added file 'osx/OpenLP.icns'
Binary files osx/OpenLP.icns	1970-01-01 00:00:00 +0000 and osx/OpenLP.icns	2016-01-03 21:12:58 +0000 differ
=== added file 'osx/applescript-adjust-dmg-view.master'
--- osx/applescript-adjust-dmg-view.master	1970-01-01 00:00:00 +0000
+++ osx/applescript-adjust-dmg-view.master	2016-01-03 21:12:58 +0000
@@ -0,0 +1,31 @@
+on run
+	-- wait for virus scanner
+	delay 2
+
+	tell application "Finder"
+		tell disk "%s"
+			open
+			set current view of container window to icon view
+			set toolbar visible of container window to false
+			set statusbar visible of container window to false
+			set the bounds of container window to {400, 100, 1100, 500}
+			set theViewOptions to the icon view options of container window
+			set arrangement of theViewOptions to not arranged
+			set icon size of theViewOptions to 128
+			set background picture of theViewOptions to file ".background:installer-background.png"
+			set position of item "%s" of container window to {160, 200}
+			set position of item "Applications" of container window to {550, 200}
+			set position of item ".background" of container window to {100, 500}
+			set position of item ".DS_Store" of container window to {200, 500}
+			set position of item ".fseventsd" of container window to {300, 500}
+			set position of item ".Trashes" of container window to {400, 500}
+            set position of item ".VolumeIcon.icns" of container window to {500, 500}
+			open
+			close
+			update without registering applications
+			-- wait until the virus scan completes
+			delay 5
+			-- eject
+		end tell
+	end tell
+end run

=== added file 'osx/config.ini.default'
--- osx/config.ini.default	1970-01-01 00:00:00 +0000
+++ osx/config.ini.default	2016-01-03 21:12:58 +0000
@@ -0,0 +1,23 @@
+[executables]
+sphinx = sphinx-build-3.4
+pyinstaller = %(projects)s/pyinstaller/pyinstaller.py
+lrelease = lrelease
+diskutil = diskutil
+hdiutil = hdiutil
+osascript = osascript
+mudrawbin = mudraw
+
+[paths]
+branch = %(projects)s/trunk
+documentation = %(projects)s/documentation
+macicon = %(here)s/OpenLP.icns
+bundleinfo = %(here)s/Info.plist
+hooks = %(here)s/../pyinstaller-hooks
+dmg_background = %(here)s/DmgImageInstallBackground.png
+
+[transifex]
+username =
+password =
+
+[codesigning]
+certificate = OpenLP

=== added file 'osx/macosx-builder.py'
--- osx/macosx-builder.py	1970-01-01 00:00:00 +0000
+++ osx/macosx-builder.py	2016-01-03 21:12:58 +0000
@@ -0,0 +1,768 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2015 OpenLP Developers                                   #
+# --------------------------------------------------------------------------- #
+# This program is free software; you can redistribute it and/or modify it     #
+# under the terms of the GNU General Public License as published by the Free  #
+# Software Foundation; version 2 of the License.                              #
+#                                                                             #
+# This program is distributed in the hope that it will be useful, but WITHOUT #
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
+# more details.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+
+"""
+Mac OS X Build Script
+--------------------
+
+This script is used to build the Mac OS X app bundle and pack it into dmg file.
+For this script to work out of the box, it depends on a number of things:
+
+Python 3.3/3.4
+
+PyQt4
+    You should already have this installed, OpenLP doesn't work without it. The
+    version the script expects is the packaged one available from River Bank
+    Computing.
+
+PyEnchant
+    This script expects the precompiled, installable version of PyEnchant to be
+    installed. You can find this on the PyEnchant site.
+
+Sphinx
+    This is used to build the documentation.  The documentation trunk must be at
+    the same directory level as OpenLP trunk and named "documentation".
+
+PyInstaller
+    PyInstaller should be a git clone of either
+    https://github.com/matysek/pyinstaller branch python3 or
+    https://github.com/pyinstaller/pyinstaller branch python3
+
+Bazaar
+    You need the command line "bzr" client installed.
+
+OpenLP
+    A checkout of the latest code, in a branch directory, which is in a Bazaar
+    shared repository directory. This means your code should be in a directory
+    structure like this: "openlp\branch-name".
+
+macosx-builder.py
+    This script, of course. It should be in the "osx-package" directory
+    at the same level as OpenLP trunk.
+
+Mako
+    Mako Templates for Python.  This package is required for building the
+    remote plugin.
+
+Alembic
+    Required for upgrading the databases used in OpenLP.
+
+MuPDF
+    Required for PDF support in OpenLP. Install using macports, or use the
+    mudrawbin option in the config file to point to the mudraw binary.
+
+MachOLib
+    Python library to analyze and edit Mach-O headers, the executable format
+    used by Mac OS X. Used to relink the mudraw binary from MuPDF to the bundled
+    libraries. Install using macports or pip.
+
+config.ini.default
+    The configuration file contains settings of the version string to include
+    in the bundle as well as directory and file settings for different
+    purposes (e.g. PyInstaller location or installer background image)
+
+To install everything you need to install MacPorts. Once MacPorts is installed
+and up-to-date, run the following command::
+
+    $ sudo port install python34 py34-pyqt4 py34-sphinx py34-sqlalchemy \
+                        py34-macholib py34-mako py34-alembic py34-enchant \
+                        py34-beautifulsoup4 py34-lxml py34-nose
+
+You may need to install chardet via pip::
+
+    $ sudo pip install chardet
+
+"""
+
+import os
+import plistlib
+import signal
+import subprocess
+import sys
+from shutil import copy, copytree, rmtree
+from subprocess import Popen, PIPE
+from configparser import ConfigParser
+from argparse import ArgumentParser
+
+from macholib.MachO import MachO
+from macholib.util import flipwritable, in_system_path
+
+
+def _which(command):
+    """
+    Return absolute path to a command found on system PATH.
+    """
+    for path in os.environ["PATH"].split(os.pathsep):
+        if os.access(os.path.join(path, command), os.X_OK):
+            print("%s/%s" % (path, command))
+            return "%s/%s" % (path, command)
+
+
+class MacosxBuilder(object):
+    """
+    The :class:`MacosxBuilder` class encapsulates everything that is needed
+    to build a Mac OS X .dmg file.
+    """
+
+    def __init__(self):
+        self.setup_args()
+        self.setup_system_paths()
+        self.read_config()
+        self.setup_executables()
+        self.setup_paths()
+
+    def _print(self, text, *args):
+        """
+        Print stuff out. Later we might want to use a log file.
+        """
+        if len(args) > 0:
+            text = text % tuple(args)
+        print(text)
+
+    def _print_verbose(self, text, *args):
+        """
+        Print output, obeying "verbose" mode.
+        """
+        if self.args.verbose:
+            self._print(text, *args)
+
+    def _run_command(self, cmd, err_msg):
+        """
+        Run command in subprocess and print error message in case of Exception.
+
+        Return text from stdout.
+        """
+        proc = Popen(cmd, stdout=PIPE, stderr=PIPE)
+        output, error = proc.communicate()
+        code = proc.wait()
+        if code != 0:
+            self._print(output)
+            self._print(error)
+            raise Exception(err_msg)
+        return output
+
+    def _get_directory_size(self, directory):
+        """
+        Return directory size - size of everything in the dir.
+        """
+        dir_size = 0
+        for (path, dirs, files) in os.walk(directory):
+            for file in files:
+                filename = os.path.join(path, file)
+                dir_size += os.path.getsize(filename)
+        return dir_size
+
+    def _get_mountpoints(self):
+        """
+        Return list of mounted disks on Mac.
+        """
+        # Get the output in plist format.
+        paths = []
+        output = self._run_command([self.hdiutil, 'info', '-plist'], 'Detecting mount points failed.')
+        pl = plistlib.readPlistFromBytes(output)
+        for image in pl['images']:
+            for se in image['system-entities']:
+                if se.get('mount-point'):
+                    paths.append(se.get('mount-point'))
+
+        return paths
+
+    def setup_args(self):
+        """
+        Set up an argument parser and parse the command line arguments.
+        """
+        parser = ArgumentParser()
+        parser.add_argument('-b', '--branch', metavar='BRANCH', dest='branch',
+                            help='Specify the path to the branch you wish to build.')
+        parser.add_argument('--devel', dest='devel', action='store_true', default=False,
+                            help='Development build does not have set icons for .dmg file '
+                                 'and .dmg filename contains bzr revision number.')
+        parser.add_argument('--release', dest='release', metavar='VERSION',
+                            help='Build a release version of OpenLP with the version specified')
+        parser.add_argument('-d', '--documentation', metavar='DOCS', dest='docs',
+                            help='Specify the path to the documentation branch.')
+        parser.add_argument('-c', '--config', metavar='CONFIG', dest='config',
+                            help='Specify the path to the configuration file.',
+                            default=os.path.abspath(os.path.join('.', 'config.ini.default')))
+        parser.add_argument('-u', '--skip-update', dest='skip_update', action='store_true', default=False,
+                            help='Do NOT update the branch before building.')
+        parser.add_argument('-t', '--skip-translations', dest='skip_translations', action='store_true', default=False,
+                            help='Do NOT update the language translation files.')
+        parser.add_argument('--transifex', dest='update_translations', action='store_true', default=False,
+                            help='Update the language translation from Transifex.')
+        parser.add_argument('--transifex-user', dest='transifex_user', help='Transifex username.')
+        parser.add_argument('--transifex-pass', dest='transifex_pass', help='Transifex password.')
+        parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', default=False,
+                            help='Print out additional information.')
+        self.args = parser.parse_args()
+
+    def read_config(self):
+        """
+        Read the configuration from the configuration file.
+        """
+        self.config = ConfigParser(defaults={
+            'here': self.script_path,
+            'projects': os.path.abspath(os.path.join(self.script_path, '..', '..')), })
+        self.config.read(os.path.abspath(self.args.config))
+
+    def setup_system_paths(self):
+        """
+        Set up some system paths.
+        """
+        self.script_path = os.path.dirname(os.path.abspath(__file__))
+        self.python = sys.executable
+
+    def setup_executables(self):
+        """
+        Set up the paths to the executables we use.
+        """
+        self.sphinx = _which(self.config.get('executables', 'sphinx'))
+        self.pyinstaller = os.path.abspath(self.config.get('executables', 'pyinstaller'))
+        self.lrelease = _which(self.config.get('executables', 'lrelease'))
+        self.diskutil = _which(self.config.get('executables', 'diskutil'))
+        self.hdiutil = _which(self.config.get('executables', 'hdiutil'))
+        self.osascript = _which(self.config.get('executables', 'osascript'))
+        self.mudraw_bin = _which(self.config.get('executables', 'mudrawbin'))
+
+    def setup_paths(self):
+        """
+        Set up a variety of paths that we use throughout the build process.
+        """
+        if self.args.branch:
+            self.branch_path = os.path.abspath(self.args.branch)
+        else:
+            self.branch_path = self.config.get('paths', 'branch')
+        if self.args.docs:
+            self.docs_path = os.path.abspath(self.args.docs)
+        else:
+            self.docs_path = self.config.get('paths', 'documentation')
+        if self.args.release:
+            self.version_number = self.args.release
+            self.work_path = os.path.abspath(os.path.join(self.branch_path, '..', 'OpenLP-' + self.version_number))
+        else:
+            self.version_number = None
+            self.work_path = self.branch_path
+        self.openlp_script = os.path.abspath(os.path.join(self.work_path, 'openlp.py'))
+        self.hooks_path = os.path.abspath(os.path.join(self.work_path, self.config.get('paths', 'hooks')))
+        self.mac_icon = os.path.abspath(self.config.get('paths', 'macicon'))
+        self.bundle_info = os.path.abspath(self.config.get('paths', 'bundleinfo'))
+        self.dmg_background_img = os.path.abspath(self.config.get('paths', 'dmg_background'))
+        self.i18n_utils = os.path.join(self.work_path, 'scripts', 'translation_utils.py')
+        self.source_path = os.path.join(self.work_path, 'openlp')
+        self.manual_path = os.path.join(self.docs_path, 'manual')
+        self.manual_build_path = os.path.join(self.manual_path, 'build')
+        self.i18n_path = os.path.join(self.work_path, 'resources', 'i18n')
+        self.build_path = os.path.join(self.branch_path, 'build')
+        self.dist_app_path = os.path.join(self.branch_path, 'dist', 'OpenLP.app')
+        self.dist_path = os.path.join(self.branch_path, 'dist', 'OpenLP.app', 'Contents', 'MacOS')
+
+        # Path to Qt translation files.
+        from PyQt4.QtCore import QCoreApplication
+
+        qt_plug_dir = str(list(QCoreApplication.libraryPaths())[0])
+        self.qt_translat_path = os.path.join(os.path.dirname(qt_plug_dir), 'translations')
+
+    def update_code(self):
+        """
+        Update the code in the branch.
+        """
+        os.chdir(self.branch_path)
+        self._print('Reverting any changes to the code...')
+        bzr = Popen(('bzr', 'revert'), stdout=PIPE)
+        output = bzr.communicate()[0]
+        code = bzr.wait()
+        if code != 0:
+            self._print(output)
+            raise Exception('Error reverting the code')
+        self._print('Updating the code...')
+        bzr = Popen(('bzr', 'update'), stdout=PIPE)
+        output = bzr.communicate()[0]
+        code = bzr.wait()
+        if code != 0:
+            self._print(output)
+            raise Exception('Error updating the code')
+
+    def export_release(self):
+        """
+        Export a particular release
+        """
+        if os.path.exists(self.work_path):
+            rmtree(self.work_path)
+        os.chdir(self.branch_path)
+        self._print('Exporting the release version...')
+        bzr = Popen(('bzr', 'export', '-r', 'tag:' + self.version_number, self.work_path), stdout=PIPE)
+        output = bzr.communicate()[0]
+        code = bzr.wait()
+        if code != 0:
+            self._print(output)
+            raise Exception('Error exporting the code')
+
+    def run_pyinstaller(self):
+        """
+        Run PyInstaller on the branch to build an executable.
+        """
+        self._print('Running PyInstaller...')
+        os.chdir(self.work_path)
+        cmd = [self.python,
+               self.pyinstaller,
+               '--clean',
+               '--noconfirm',
+               '--windowed',
+               '--noupx',
+               '--additional-hooks-dir', self.hooks_path,
+               '--runtime-hook', os.path.join(self.hooks_path, 'rthook_ssl.py'),
+               '-i', self.mac_icon,
+               '-p', self.work_path,
+               '-n', 'OpenLP',
+               self.openlp_script]
+        if not self.args.verbose:
+            cmd.append('--log-level=ERROR')
+        else:
+            cmd.append('--log-level=DEBUG')
+        if self.args.devel:
+            cmd.append('-d')
+        pyinstaller = Popen(cmd)
+        code = pyinstaller.wait()
+        if code != 0:
+            raise Exception('Error running PyInstaller')
+
+    def write_version_file(self):
+        """
+        Write the version number to a file for reading once installed.
+        """
+        self._print('Writing version file...')
+        os.chdir(self.branch_path)
+        bzr = Popen(('bzr', 'tags'), stdout=PIPE)
+        output = bzr.communicate()[0]
+        code = bzr.wait()
+        if code != 0:
+            raise Exception('Error running bzr tags')
+        lines = output.splitlines()
+        if len(lines) == 0:
+            tag = '0.0.0'
+            revision = '0'
+        else:
+            tag, revision = lines[-1].decode('utf-8').split()
+        bzr = Popen(('bzr', 'log', '--line', '-r', '-1'), stdout=PIPE)
+        output, error = bzr.communicate()
+        code = bzr.wait()
+        if code != 0:
+            raise Exception('Error running bzr log')
+        latest = output.decode('utf-8').split(':')[0]
+        self.version_string = '%s-bzr%s' % (tag, latest)
+        self.version_tag = tag
+        version_file = open(os.path.join(self.dist_path, '.version'), 'w')
+        # Release version does not contain revision in .dmg name.
+        if self.args.devel:
+            version_file.write(str(self.version_string))
+        else:
+            version_file.write(str(self.version_tag))
+        version_file.close()
+
+    def copy_default_theme(self):
+        """
+        Copy the default theme to the correct directory for OpenLP.
+        """
+        self._print('Copying default theme...')
+        source = os.path.join(self.source_path, 'core', 'lib', 'json')
+        dest = os.path.join(self.dist_path, 'core', 'lib', 'json')
+        for root, dirs, files in os.walk(source):
+            for filename in files:
+                if filename.endswith('.json'):
+                    dest_path = os.path.join(dest, root[len(source) + 1:])
+                    if not os.path.exists(dest_path):
+                        os.makedirs(dest_path)
+                    self._print_verbose('... %s', filename)
+                    copy(os.path.join(root, filename), os.path.join(dest_path, filename))
+
+    def copy_plugins(self):
+        """
+        Copy all the plugins to the correct directory so that OpenLP sees that
+        it has plugins.
+        """
+        self._print('Copying plugins...')
+        source = os.path.join(self.source_path, 'plugins')
+        dest = os.path.join(self.dist_path, 'plugins')
+        for root, dirs, files in os.walk(source):
+            for filename in files:
+                if not filename.endswith('.pyc'):
+                    dest_path = os.path.join(dest, root[len(source) + 1:])
+                    if not os.path.exists(dest_path):
+                        os.makedirs(dest_path)
+                    self._print_verbose('... %s', filename)
+                    copy(os.path.join(root, filename), os.path.join(dest_path, filename))
+
+    def copy_media_player(self):
+        """
+        Copy the media players to the correct directory for OpenLP.
+        """
+        self._print('Copying media player...')
+        source = os.path.join(self.source_path, 'core', 'ui', 'media')
+        dest = os.path.join(self.dist_path, 'core', 'ui', 'media')
+        for root, dirs, files in os.walk(source):
+            for filename in files:
+                if not filename.endswith('.pyc'):
+                    dest_path = os.path.join(dest, root[len(source) + 1:])
+                    if not os.path.exists(dest_path):
+                        os.makedirs(dest_path)
+                    self._print_verbose('... %s', filename)
+                    copy(os.path.join(root, filename), os.path.join(dest_path, filename))
+
+    def copy_mac_bundle_files(self):
+        """
+        Copy Info.plist and OpenLP.icns to app bundle.
+        """
+        copy(self.mac_icon, os.path.join(self.dist_app_path, 'Contents', 'Resources', os.path.basename(self.mac_icon)))
+        # Add OpenLP version to Info.plist and put it to app bundle.
+        fr = open(self.bundle_info, 'r')
+        fw = open(os.path.join(self.dist_app_path, 'Contents', os.path.basename(self.bundle_info)), 'w')
+        text = fr.read()
+        if self.args.devel:
+            text = text % {'openlp_version': self.version_string}
+        else:
+            text = text % {'openlp_version': self.version_tag}
+        fw.write(text)
+        fr.close()
+        fw.close()
+
+    def copy_macosx_files(self):
+        """
+        Copy all the OSX-specific files.
+        """
+        self._print('Copying extra files for Mac OS X...')
+        self._print_verbose('... LICENSE.txt')
+        copy(os.path.join(self.script_path, 'LICENSE.txt'), os.path.join(self.dist_path, 'LICENSE.txt'))
+        self._print_verbose('... mudraw')
+        if self.mudraw_bin and os.path.isfile(self.mudraw_bin):
+            copy(os.path.join(self.mudraw_bin), os.path.join(self.dist_path, 'mudraw'))
+            self.relink_mudraw()
+        else:
+            self._print('... WARNING: mudraw not found')
+
+    def relink_mudraw(self):
+        """
+        Relink mudraw to bundled libraries
+        """
+        self._print('Linking mudraw with bundled libraries...')
+        libname = os.path.join(self.dist_path, 'mudraw')
+        distname = os.path.relpath(self.dist_path, libname)
+        self._print_verbose('... mudraw path %s', libname)
+
+        # Determine how many directories up is the directory with shared
+        # dynamic libraries. '../'
+        # E.g.  ./qt4_plugins/images/ -> ./../../
+        parent_dir = ''
+        # Check if distname is not only base filename.
+        if os.path.dirname(distname):
+            parent_level = len(os.path.dirname(distname).split(os.sep))
+            parent_dir = parent_level * (os.pardir + os.sep)
+
+        def match_func(pth):
+            """
+            For system libraries leave path unchanged.
+            """
+            # Match non system dynamic libraries.
+            if not in_system_path(pth):
+                # Use relative path to dependend dynamic libraries bases on
+                # location of the executable.
+                pth = os.path.join('@loader_path', parent_dir, os.path.basename(pth))
+                self._print_verbose('... %s', pth)
+                return pth
+
+        # Rewrite mach headers with @loader_path.
+        dll = MachO(libname)
+        dll.rewriteLoadCommands(match_func)
+
+        # Write changes into file.
+        # Write code is based on macholib example.
+        try:
+            self._print_verbose('... writing new library paths')
+            f = open(dll.filename, 'rb+')
+            for header in dll.headers:
+                f.seek(0)
+                dll.write(f)
+            f.seek(0, 2)
+            f.flush()
+            f.close()
+        except Exception:
+            pass
+
+    def update_translations(self):
+        """
+        Update the translations.
+        """
+        self._print('Updating translations...')
+        if not self.config.has_section('transifex'):
+            raise Exception('No section named "transifex" found.')
+        if not self.config.has_option('transifex', 'username'):
+            raise Exception('No option named "username" found.')
+        if not self.config.has_option('transifex', 'password'):
+            raise Exception('No option named "password" found.')
+        if self.args.transifex_user:
+            username = self.args.transifex_user
+        else:
+            username = self.config.get('transifex', 'username')
+        if self.args.transifex_pass:
+            password = self.args.transifex_pass
+        else:
+            password = self.config.get('transifex', 'password')
+        os.chdir(os.path.split(self.i18n_utils)[0])
+        translation_utils = Popen([self.python, self.i18n_utils, '-qdpu', '-U', username, '-P', password])
+        code = translation_utils.wait()
+        if code != 0:
+            raise Exception('Error running translation_utils.py')
+
+    def compile_translations(self):
+        """
+        Compile the translations for Qt.
+        """
+        self._print('Compiling translations...')
+        files = os.listdir(self.i18n_path)
+        if not os.path.exists(os.path.join(self.dist_path, 'i18n')):
+            os.makedirs(os.path.join(self.dist_path, 'i18n'))
+        for file in files:
+            if file.endswith('.ts'):
+                self._print_verbose('... %s', file)
+                source_path = os.path.join(self.i18n_path, file)
+                dest_path = os.path.join(self.dist_path, 'i18n', file.replace('.ts', '.qm'))
+                lconvert = Popen((self.lrelease, '-compress', '-silent', source_path, '-qm', dest_path))
+                code = lconvert.wait()
+                if code != 0:
+                    raise Exception('Error running lconvert on %s' % source_path)
+        self._print('Copying qm files...')
+        source = self.qt_translat_path
+        files = os.listdir(source)
+        for filename in files:
+            if filename.startswith('qt_') and filename.endswith('.qm') and len(filename) == 8:
+                self._print_verbose('... %s', filename)
+                copy(os.path.join(source, filename), os.path.join(self.dist_path, 'i18n', filename))
+
+    def run_sphinx(self):
+        """
+        Run Sphinx to build an HTML Help project.
+        """
+        self._print('Deleting previous manual build... %s', self.manual_build_path)
+        if os.path.exists(self.manual_build_path):
+            rmtree(self.manual_build_path)
+        self._print('Running Sphinx...')
+        os.chdir(self.manual_path)
+        sphinx = Popen((self.sphinx, '-b', 'applehelp', '-d', 'build/doctrees', 'source', 'build/applehelp'),
+                       stdout=PIPE)
+        output, error = sphinx.communicate()
+        code = sphinx.wait()
+        if code != 0:
+            self._print(output)
+            raise Exception('Error running Sphinx')
+        self._print('Copying help file...')
+        source = os.path.join(self.manual_build_path, 'applehelp')
+        files = os.listdir(source)
+        for filename in files:
+            if filename.endswith('.help'):
+                self._print_verbose('... %s', filename)
+                copytree(os.path.join(source, filename),
+                         os.path.join(self.dist_app_path, 'Contents', 'Resources', filename))
+
+    def code_sign(self):
+        certificate = self.config.get('codesigning', 'certificate')
+        self._print('Checking for certificate...')
+        security = Popen(('security', 'find-certificate', '-c', certificate),
+                         stdout=PIPE)
+        output, error = security.communicate()
+        code = security.wait()
+        if code != 0:
+            self._print('Could not find certificate \"%s\" in Keychain...', certificate)
+            self._print('Codesigning will not work without a certificate!!')
+            self._print(output)
+        else:
+            self._print('Codesigning app...')
+            codesign = Popen(('codesign', '--deep', '-s', certificate, self.dist_app_path))
+            output, error = codesign.communicate()
+            code = codesign.wait()
+            if code != 0:
+                self._print(output)
+                raise Exception('Error running codesign')
+
+    def create_dmg_file(self):
+        """
+        Create .dmg file.
+        """
+        self._print('Creating dmg file...')
+
+        # Release version does not contain revision in .dmg name.
+        if self.args.devel:
+            dmg_name = 'OpenLP-' + str(self.version_string) + '.dmg'
+        else:
+            dmg_name = 'OpenLP-' + str(self.version_tag) + '.dmg'
+
+        dmg_file = os.path.join(self.branch_path, 'build', dmg_name)
+        # Remove dmg if it exists.
+        if os.path.exists(dmg_file):
+            os.remove(dmg_file)
+        # Create empty dmg file.
+        size = self._get_directory_size(self.dist_app_path)  # in bytes.
+        size = size / (1000 * 1000)  # Convert to megabytes.
+        size += 10  # Additional space in .dmg for other files.
+        self._print('... dmg disk size: %s' % size)
+        self._run_command([self.hdiutil, 'create', dmg_file, '-ov', '-megabytes', str(size), '-fs', 'HFS+', '-volname',
+                           'OpenLP'], 'Could not create dmg file.')
+
+        # Mount empty dmg file.
+        old_mounts = self._get_mountpoints()
+        self._print('... mounting the dmg file: %s' % dmg_file)
+        self._run_command([self.hdiutil, 'attach', dmg_file], 'Could not mount dmg file, cannot continue.')
+        new_mounts = self._get_mountpoints()
+        # Get the mount point from difference between paths
+        # after mounting and before mounting the dmg file.
+        dmg_volume_path = list(set(new_mounts) - set(old_mounts))[0]
+
+        # Copy OpenLP.app and other files to .dmg
+        # TODO more reliable way to determine dmg_volume_path
+        self._print('... Copying the app to the dmg: ' + dmg_volume_path)
+        self._run_command(['cp', '-R', self.dist_app_path, dmg_volume_path],
+                          'Could not copy app bundle, dmg creation failed.')
+
+        # Set icon for dmg file.
+        # http://endrift.com/blog/2010/06/14/dmg-files-volume-icons-cli/
+        self._print('... Setting the dmg icon.')
+        dmg_icon = os.path.join(dmg_volume_path, '.VolumeIcon.icns')
+        self._run_command(['cp', self.mac_icon, dmg_icon], 'Could not copy the dmg icon file, dmg creation failed.')
+        # Set proper dmg icon attributes.
+        self._run_command(['SetFile', '-c', 'icnC', dmg_icon], 'Could not set dmg icon attributes.')
+        # Ensures dmg icon will be used while mounted.
+        self._run_command(['SetFile', '-a', 'C', dmg_volume_path], 'Could not set dmg icon attributes.')
+
+        # Create symlink in dmg pointing to the /Applications directory on OS X.
+        self._print('... Creating symlink to /Applications.')
+        os.symlink('/Applications', os.path.join(dmg_volume_path, 'Applications'))
+
+        # Set dmg background. Requires running Mac OS X gui.
+        # TODO: better formatting and code refactoring
+        if not self.args.devel:
+            self._print('... Setting the background image.')
+
+            os.mkdir(os.path.join(dmg_volume_path, '.background'))
+            self._run_command(['cp', self.dmg_background_img, os.path.join(dmg_volume_path,
+                                                                           '.background/installer-background.png')],
+                              'Could not copy the background image, dmg creation failed.')
+
+            self.adjust_dmg_view(os.path.basename(dmg_volume_path))
+
+        # Unmount dmg file.
+        self._print('... unmounting the dmg.')
+        # Sometimes it could happen that OSX Finder is blocking umount.
+        # We need to find this process and kill it.
+        try:
+            output = subprocess.check_output(['fuser', dmg_volume_path]).strip()
+            if output:
+                blocking_proc_pid = int(output.split()[0])
+                os.kill(int(blocking_proc_pid), signal.SIGKILL)
+        except Exception as e:
+            print(str(e))
+            self._print('... failed to kill process using %s' % dmg_volume_path)
+        # Unmount dmg file.
+        self._run_command([self.hdiutil, 'detach', dmg_volume_path],
+                          'Could not unmount the dmg file, dmg creation failed.')
+
+        # Compress dmg file.
+        self._print('... compressing the dmg file')
+        compressed_dmg = os.path.join(self.branch_path, 'dist', os.path.basename(dmg_file))  # Put dmg to 'dist' dir.
+        # Remove dmg if it exists.
+        if os.path.exists(compressed_dmg):
+            os.remove(compressed_dmg)
+        self._run_command([self.hdiutil, 'convert', dmg_file, '-format', 'UDZO', '-imagekey', 'zlib-level=9', '-o',
+                           compressed_dmg], 'Could not compress the dmg file, dmg creation failed.')
+
+        # Jenkins integration.
+        # Continuous integration server needs to know the filename of dmg.
+        # Write java property file. For uploading dmg to openlp.
+        if self.args.devel:
+            fpath = os.path.join(self.branch_path, 'openlp.properties')
+            self._print('... writing property file for jenkins: %s' % fpath)
+            f = open(fpath, 'w')
+            f.write('OPENLP_DMGNAME=' + os.path.basename(dmg_file) + '\n')
+            f.close()
+
+        # Dmg done.
+        self._print('Finished creating dmg file, resulting file: %s' % compressed_dmg)
+
+        self.dmg_file = compressed_dmg
+
+    def adjust_dmg_view(self, dmg_volume_name):
+        try:
+            # TODO: Use only one applescript file. Remove one for osx 10.5.
+            f = open(os.path.join(self.script_path, 'applescript-adjust-dmg-view.master'))
+            p = Popen([self.osascript], stdin=PIPE)
+            p.communicate(bytes(f.read() % (dmg_volume_name, 'OpenLP'), 'utf-8'))
+            f.close()
+            result = p.returncode
+            if (result != 0):
+                self._print('Adjusting dmg view failed (non-zero exit code).')
+        except (IOError, OSError):
+            self._print('Adjusting dmg view failed.')
+
+    def main(self):
+        """
+        The main function to run the Mac OS X builder.
+        """
+        self._print_verbose('OpenLP main script: ......%s', self.openlp_script)
+        self._print_verbose('Script path: .............%s', os.path.split(os.path.abspath(__file__))[0])
+        self._print_verbose('Branch path: .............%s', self.branch_path)
+        self._print_verbose('Source path: .............%s', self.source_path)
+        self._print_verbose('"dist.app" path: .........%s', self.dist_app_path)
+        self._print_verbose('"dist" path: .............%s', self.dist_path)
+        self._print_verbose('"hooks" path: ............%s', self.hooks_path)
+        self._print_verbose('PyInstaller: .............%s', self.pyinstaller)
+        self._print_verbose('Documentation branch path:%s', self.docs_path)
+        self._print_verbose('Mudraw binary ............%s', self.mudraw_bin)
+        self._print_verbose('')
+        if not self.args.skip_update:
+            self.update_code()
+        if self.args.release:
+            self.export_release()
+        self.run_pyinstaller()
+        self.write_version_file()
+        self.copy_mac_bundle_files()
+        self.copy_default_theme()
+        self.copy_plugins()
+        self.copy_media_player()
+        # TODO creating help on Mac
+        if os.path.exists(self.manual_path):
+            self.run_sphinx()
+        else:
+            self._print('')
+            self._print('WARNING: Documentation trunk not found. Mac OS X')
+            self._print('         Help file will not be included in build')
+            self._print('')
+        self.copy_macosx_files()
+        if not self.args.skip_translations:
+            if self.args.update_translations:
+                self.update_translations()
+            self.compile_translations()
+        self.code_sign()
+        self.create_dmg_file()
+
+        self._print('Done.')
+        raise SystemExit()
+
+
+if __name__ == '__main__':
+    MacosxBuilder().main()

=== added directory 'pyinstaller-hooks'
=== added file 'pyinstaller-hooks/hook-mysql.connector.py'
--- pyinstaller-hooks/hook-mysql.connector.py	1970-01-01 00:00:00 +0000
+++ pyinstaller-hooks/hook-mysql.connector.py	2016-01-03 21:12:58 +0000
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2015 OpenLP Developers                                   #
+# --------------------------------------------------------------------------- #
+# This program is free software; you can redistribute it and/or modify it     #
+# under the terms of the GNU General Public License as published by the Free  #
+# Software Foundation; version 2 of the License.                              #
+#                                                                             #
+# This program is distributed in the hope that it will be useful, but WITHOUT #
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
+# more details.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+
+hiddenimports = ['mysql.connector']

=== added file 'pyinstaller-hooks/hook-openlp.core.ui.media.py'
--- pyinstaller-hooks/hook-openlp.core.ui.media.py	1970-01-01 00:00:00 +0000
+++ pyinstaller-hooks/hook-openlp.core.ui.media.py	2016-01-03 21:12:58 +0000
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2015 OpenLP Developers                                   #
+# --------------------------------------------------------------------------- #
+# This program is free software; you can redistribute it and/or modify it     #
+# under the terms of the GNU General Public License as published by the Free  #
+# Software Foundation; version 2 of the License.                              #
+#                                                                             #
+# This program is distributed in the hope that it will be useful, but WITHOUT #
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
+# more details.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+
+hiddenimports = ['openlp.core.ui.media.systemplayer',
+                 'openlp.core.ui.media.vlcplayer',
+                 'openlp.core.ui.media.webkitplayer']

=== added file 'pyinstaller-hooks/hook-openlp.plugins.presentations.presentationplugin.py'
--- pyinstaller-hooks/hook-openlp.plugins.presentations.presentationplugin.py	1970-01-01 00:00:00 +0000
+++ pyinstaller-hooks/hook-openlp.plugins.presentations.presentationplugin.py	2016-01-03 21:12:58 +0000
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2015 OpenLP Developers                                   #
+# --------------------------------------------------------------------------- #
+# This program is free software; you can redistribute it and/or modify it     #
+# under the terms of the GNU General Public License as published by the Free  #
+# Software Foundation; version 2 of the License.                              #
+#                                                                             #
+# This program is distributed in the hope that it will be useful, but WITHOUT #
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
+# more details.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+
+hiddenimports = ['openlp.plugins.presentations.lib.impresscontroller',
+                 'openlp.plugins.presentations.lib.pdfcontroller',
+                 'openlp.plugins.presentations.lib.powerpointcontroller',
+                 'openlp.plugins.presentations.lib.pptviewcontroller']

=== added file 'pyinstaller-hooks/hook-openlp.py'
--- pyinstaller-hooks/hook-openlp.py	1970-01-01 00:00:00 +0000
+++ pyinstaller-hooks/hook-openlp.py	2016-01-03 21:12:58 +0000
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2015 OpenLP Developers                                   #
+# --------------------------------------------------------------------------- #
+# This program is free software; you can redistribute it and/or modify it     #
+# under the terms of the GNU General Public License as published by the Free  #
+# Software Foundation; version 2 of the License.                              #
+#                                                                             #
+# This program is distributed in the hope that it will be useful, but WITHOUT #
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
+# more details.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+
+hiddenimports = ['openlp.plugins.songs.songsplugin',
+                 'openlp.plugins.bibles.bibleplugin',
+                 'openlp.plugins.presentations.presentationplugin',
+                 'openlp.plugins.media.mediaplugin',
+                 'openlp.plugins.images.imageplugin',
+                 'openlp.plugins.custom.customplugin',
+                 'openlp.plugins.songusage.songusageplugin',
+                 'openlp.plugins.remotes.remoteplugin',
+                 'openlp.plugins.alerts.alertsplugin']

=== added file 'pyinstaller-hooks/hook-ssl.py'
--- pyinstaller-hooks/hook-ssl.py	1970-01-01 00:00:00 +0000
+++ pyinstaller-hooks/hook-ssl.py	2016-01-03 21:12:58 +0000
@@ -0,0 +1,10 @@
+from PyInstaller.compat import is_darwin
+from PyInstaller.utils.hooks import exec_statement
+
+if is_darwin:  # TODO check if this is needed on linux
+    datas = []
+    files = exec_statement("""
+import ssl
+print(ssl.get_default_verify_paths().cafile)""").strip().split()
+    for file in files:
+        datas.append((file, 'lib'))  # TODO find a way to make sure the bundled cafile is always named 'cert.pem'

=== added file 'pyinstaller-hooks/rthook_ssl.py'
--- pyinstaller-hooks/rthook_ssl.py	1970-01-01 00:00:00 +0000
+++ pyinstaller-hooks/rthook_ssl.py	2016-01-03 21:12:58 +0000
@@ -0,0 +1,5 @@
+import os
+import sys
+
+if sys.platform == 'darwin':  # TODO check if this is needed on linux
+    os.environ['SSL_CERT_FILE'] = os.path.join(sys._MEIPASS, 'lib', 'cert.pem')

=== added directory 'scripts'
=== renamed directory 'scripts' => 'scripts.moved'
=== added file 'scripts/backup_georss.sh'
--- scripts/backup_georss.sh	1970-01-01 00:00:00 +0000
+++ scripts/backup_georss.sh	2016-01-03 21:12:58 +0000
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+FILENAME=`date +%Y%m%d-%H%M%S`.rss
+BACKUPDIR=~/georss
+BACKUPDAYS=14
+
+# Delete files older than $BACKUPDAYS days ago
+find $BACKUPDIR -mtime $BACKUPDAYS -exec rm -f {} \;
+
+# Get the latest GeoRSS from our map
+wget -c -O $BACKUPDIR/$FILENAME 'http://maps.google.com/maps/ms?ie=UTF8&source=embed&msa=0&output=georss&msid=113314234297482809599.00047e88b1985e07ad495'
+

=== added file 'scripts/build_dev_deb.sh'
--- scripts/build_dev_deb.sh	1970-01-01 00:00:00 +0000
+++ scripts/build_dev_deb.sh	2016-01-03 21:12:58 +0000
@@ -0,0 +1,46 @@
+#!/bin/bash
+###############################################################################
+# PPA Build Script for OpenLP                                                 #
+###############################################################################
+
+OPENLP_VERSION=$1
+RELEASE_NAME=$2
+PROJECT_DIR=$HOME/Projects/OpenLP
+UPLOADS_DIR=$PROJECT_DIR/Uploads
+PACKAGING_DIR=$HOME/Packaging
+UBUNTU_DIR=$PACKAGING_DIR/debian-package
+TARGT_TARBALL=$PACKAGING_DIR/Tarballs/openlp_${OPENLP_VERSION}.orig.tar.gz
+
+export DEBFULLNAME="Raoul Snyman"
+export DEBEMAIL="raoul@xxxxxxxxxxx"
+
+echo -n "Copying source tarball..."
+cd $UPLOADS_DIR
+if [[ ! -f "$UPLOADS_DIR/OpenLP-${OPENLP_VERSION}.tar.gz" ]]; then
+	echo "$UPLOADS_DIR/OpenLP-${OPENLP_VERSION}.tar.gz NOT FOUND, exiting."
+	exit 1
+fi
+cp $UPLOADS_DIR/OpenLP-${OPENLP_VERSION}.tar.gz $TARGT_TARBALL
+echo done.
+echo -n "Backing up changelog..."
+cd $UBUNTU_DIR
+cp $UBUNTU_DIR/debian/changelog $PACKAGING_DIR/changelog.bak
+echo done.
+echo "Building package..."
+dch --force-distribution -D $RELEASE_NAME -v $OPENLP_VERSION-0ubuntu1~${RELEASE_NAME}1 Autobuild
+bzr bd --builder='debuild -S -m"Raoul Snyman <raoulsnyman@xxxxxxxxxx>"' --orig-dir="$PACKAGING_DIR/Tarballs" --build-dir="$PACKAGING_DIR/Builds"
+if [[ $? -ne 0 ]]; then
+	echo "Failed to build package, exiting..."
+	exit 1
+fi
+echo "Uploading package source..."
+cd $PACKAGING_DIR/Builds
+dput openlp-dev openlp_$OPENLP_VERSION-0ubuntu1~${RELEASE_NAME}1_source.changes
+echo -n "Removing generated files..."
+rm $PACKAGING_DIR/Tarballs/*
+rm -r $PACKAGING_DIR/Builds/*
+echo done.
+echo -n "Restoring changelog..."
+cd $UBUNTU_DIR
+cp $PACKAGING_DIR/changelog.bak $UBUNTU_DIR/debian/changelog
+echo "done."

=== added file 'scripts/build_docs.sh'
--- scripts/build_docs.sh	1970-01-01 00:00:00 +0000
+++ scripts/build_docs.sh	2016-01-03 21:12:58 +0000
@@ -0,0 +1,39 @@
+#!/bin/bash
+
+DOCSTYPE=$1
+OLD_PATH=$PATH
+PATH=/usr/local/bin:$PATH
+
+if [[ "$DOCSTYPE" == "api" ]]; then
+    DOCSTITLE="API"
+    DOCSDIR="api"
+    TARBALL="docs"
+else
+    if [[ "$DOCSTYPE" == "manual" ]]; then
+        DOCSTITLE="Manual"
+        DOCSDIR="manual"
+        TARBALL="manual"
+    else
+        DOCSTITLE="User Guide"
+        DOCSDIR="user-guide"
+        TARBALL="user-guide"
+    fi
+fi
+
+echo "Building $DOCSTITLE documentation..."
+cd /home/openlp/Projects/documentation/trunk
+bzr up
+cd $DOCSDIR
+echo $DOCSDIR
+pwd
+rm -fR build
+make html
+echo "Creating tarball..."
+cd build
+cp -R html $TARBALL
+tar -czvf ${TARBALL}.tar.gz $TARBALL
+echo "Uploading tarball..."
+scp ${TARBALL}.tar.gz openlp@xxxxxxxxxx:public_html/
+ssh openlp@xxxxxxxxxx "cd ~/public_html && tar -xzvf ${TARBALL}.tar.gz"
+echo "Finished $DOCSTITLE run."
+PATH=$OLD_PATH

=== added file 'scripts/build_nightly_deb.sh'
--- scripts/build_nightly_deb.sh	1970-01-01 00:00:00 +0000
+++ scripts/build_nightly_deb.sh	2016-01-03 21:12:58 +0000
@@ -0,0 +1,47 @@
+#!/bin/bash
+###############################################################################
+# PPA Build Script for OpenLP                                                 #
+###############################################################################
+
+RELEASE_NAME=$1
+PROJECT_DIR=$HOME/Projects/OpenLP
+SOURCE_DIR=$PROJECT_DIR/trunk
+UPLOADS_DIR=$PROJECT_DIR/Uploads
+OPENLP_VERSION=`~/bin/openlp_version.py $SOURCE_DIR`
+PACKAGING_DIR=$HOME/Packaging
+UBUNTU_DIR=$PACKAGING_DIR/debian-package
+TARGT_TARBALL=$PACKAGING_DIR/Tarballs/openlp_${OPENLP_VERSION}.orig.tar.gz
+
+export DEBFULLNAME="Raoul Snyman"
+export DEBEMAIL="raoul@xxxxxxxxxxx"
+
+echo -n "Copying source tarball..."
+cd $UPLOADS_DIR
+if [[ ! -f "$UPLOADS_DIR/OpenLP-${OPENLP_VERSION}.tar.gz" ]]; then
+	echo "$UPLOADS_DIR/OpenLP-${OPENLP_VERSION}.tar.gz NOT FOUND, exiting."
+	exit 1
+fi
+cp $UPLOADS_DIR/OpenLP-${OPENLP_VERSION}.tar.gz $TARGT_TARBALL
+echo done.
+echo -n "Backing up changelog..."
+cd $UBUNTU_DIR
+cp $UBUNTU_DIR/debian/changelog $PACKAGING_DIR/changelog.bak
+echo done.
+echo "Building package..."
+dch --force-distribution -D $RELEASE_NAME -v $OPENLP_VERSION-0ubuntu1~${RELEASE_NAME}1 Autobuild
+bzr bd --builder='debuild -S -m"Raoul Snyman <raoulsnyman@xxxxxxxxxx>"' --orig-dir="$PACKAGING_DIR/Tarballs" --build-dir="$PACKAGING_DIR/Builds"
+if [[ $? -ne 0 ]]; then
+	echo "Failed to build package, exiting..."
+	exit 1
+fi
+echo "Uploading package source..."
+cd $PACKAGING_DIR/Builds
+dput openlp-nightly openlp_$OPENLP_VERSION-0ubuntu1~${RELEASE_NAME}1_source.changes
+#echo -n "Removing generated files..."
+rm $PACKAGING_DIR/Tarballs/*
+rm -r $PACKAGING_DIR/Builds/*
+#echo done.
+echo -n "Restoring changelog..."
+cd $UBUNTU_DIR
+cp $PACKAGING_DIR/changelog.bak $UBUNTU_DIR/debian/changelog
+echo "done."

=== added file 'scripts/build_release_deb.sh'
--- scripts/build_release_deb.sh	1970-01-01 00:00:00 +0000
+++ scripts/build_release_deb.sh	2016-01-03 21:12:58 +0000
@@ -0,0 +1,19 @@
+#!/bin/bash
+###############################################################################
+# Debian Build Script for OpenLP                                              #
+###############################################################################
+DEB_VERSION=$1
+RELEASE_NAME=$2
+export RELEASE_NAME
+ROOT_DIR=~/Projects/OpenLP
+SDIST_TARBALL=$ROOT_DIR/release-${DEB_VERSION}/dist/OpenLP-$DEB_VERSION.tar.gz
+TARGT_TARBALL=$ROOT_DIR/tarballs/openlp_$DEB_VERSION.orig.tar.gz
+echo "Copying $SDIST_TARBALL to $TARGT_TARBALL"
+cp $SDIST_TARBALL $TARGT_TARBALL
+cd $ROOT_DIR/debian-package
+dch --force-distribution -D $RELEASE_NAME -v $DEB_VERSION-0ubuntu1~${RELEASE_NAME}1 Autobuild -b
+bzr bd --builder='debuild -S -sa -m"Raoul Snyman <raoul.snyman@xxxxxxxxxxxxxxxxxxxxxxxx>"' --orig-dir="$ROOT_DIR/tarballs"
+cd $ROOT_DIR/build-area
+dput openlp-release openlp_$DEB_VERSION-0ubuntu1~${RELEASE_NAME}1_source.changes
+cd $ROOT_DIR/debian-package
+bzr revert

=== added file 'scripts/deb_version.py'
--- scripts/deb_version.py	1970-01-01 00:00:00 +0000
+++ scripts/deb_version.py	2016-01-03 21:12:58 +0000
@@ -0,0 +1,40 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2015 OpenLP Developers                                   #
+# --------------------------------------------------------------------------- #
+# This program is free software; you can redistribute it and/or modify it     #
+# under the terms of the GNU General Public License as published by the Free  #
+# Software Foundation; version 2 of the License.                              #
+#                                                                             #
+# This program is distributed in the hope that it will be useful, but WITHOUT #
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
+# more details.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+
+from bzrlib.branch import Branch
+from natsort import nsorted
+
+b = Branch.open_containing('.')[0]
+b.lock_read()
+try:
+    # Get the branch's latest revision number.
+    revno = b.revno()
+    # Convert said revision number into a bzr revision id.
+    revision_id = b.dotted_revno_to_revision_id((revno,))
+    # Get a dict of tags, with the revision id as the key.
+    tags = b.tags.get_reverse_tag_dict()
+    # Check if the latest
+    if revision_id in tags:
+        print tags[revision_id][0]
+    else:
+        print '%s+bzr%s' % (nsorted(b.tags.get_tag_dict().keys())[-1], revno)
+finally:
+    b.unlock()

=== added file 'scripts/dev_build.sh'
--- scripts/dev_build.sh	1970-01-01 00:00:00 +0000
+++ scripts/dev_build.sh	2016-01-03 21:12:58 +0000
@@ -0,0 +1,42 @@
+#!/bin/bash
+
+VERSION=$1
+PROJECTS_DIR=/home/openlp/Projects
+SOURCE_DIR=$PROJECTS_DIR/OpenLP/trunk
+RELEASE_DIR=release-$VERSION
+UPLOADS_DIR=/home/openlp/Projects/OpenLP/Uploads
+FILENAME=OpenLP-$VERSION.tar.gz
+#TSDIR=$RELEASE/resources/i18n
+#QMDIR=$RELEASE/openlp/i18n
+
+echo Starting the OpenLP Development Build Script
+echo --------------------------------------------
+echo -ne "Updating trunk...\r"
+cd $SOURCE_DIR
+bzr update -q
+echo "Updating trunk...done."
+echo -ne "Branching release tag (${VERSION})...\r"
+cd ..
+bzr branch trunk $RELEASE_DIR -r tag:$VERSION -q
+echo "Branching release tag (${VERSION})...done."
+echo -n "Creating source distribution..."
+cd /home/openlp/Projects/OpenLP/$RELEASE_DIR
+python setup.py sdist
+echo "done."
+echo -n "Copying release tarball..."
+cp dist/$FILENAME $UPLOADS_DIR/
+echo "done."
+echo -n "Updating Version File..."
+echo "$VERSION" > dev_version.txt
+scp dev_version.txt openlp@xxxxxxxxxx:public_html/files/dev_version.txt
+rm dev_version.txt
+echo "Building sources for PPA..."
+~/bin/build_dev_deb.sh $VERSION trusty
+~/bin/build_dev_deb.sh $VERSION utopic
+~/bin/build_dev_deb.sh $VERSION vivid
+echo -n "Cleaning up..."
+cd /home/openlp/Projects/OpenLP
+rm -r $RELEASE_DIR
+echo "done."
+echo --------------------------------------------
+echo Finished the OpenLP Development Build Script

=== added file 'scripts/fix_bzr.py'
--- scripts/fix_bzr.py	1970-01-01 00:00:00 +0000
+++ scripts/fix_bzr.py	2016-01-03 21:12:58 +0000
@@ -0,0 +1,29 @@
+#!/usr/bin/python
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2015 OpenLP Developers                                   #
+# --------------------------------------------------------------------------- #
+# This program is free software; you can redistribute it and/or modify it     #
+# under the terms of the GNU General Public License as published by the Free  #
+# Software Foundation; version 2 of the License.                              #
+#                                                                             #
+# This program is distributed in the hope that it will be useful, but WITHOUT #
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
+# more details.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+
+import sys
+
+from bzrlib import initialize
+from bzrlib.plugin import load_plugins
+from bzrlib.upgrade import Convert
+
+initialize()
+load_plugins()
+Convert(sys.argv[1])

=== added file 'scripts/natsort.py'
--- scripts/natsort.py	1970-01-01 00:00:00 +0000
+++ scripts/natsort.py	2016-01-03 21:12:58 +0000
@@ -0,0 +1,35 @@
+# ---------------------------------------------------------
+# natsort.py: Natural string sorting.
+# ---------------------------------------------------------
+
+# By Seo Sanghyeon.  Some changes by Connelly Barnes.
+
+def try_int(s):
+    "Convert to integer if possible."
+    try: return int(s)
+    except: return s
+
+def natsort_key(s):
+    "Used internally to get a tuple by which s is sorted."
+    import re
+    return map(try_int, re.findall(r'(\d+|\D+)', s))
+
+def natcmp(a, b):
+    "Natural string comparison, case sensitive."
+    return cmp(natsort_key(a), natsort_key(b))
+
+def natcasecmp(a, b):
+    "Natural string comparison, ignores case."
+    return natcmp(a.lower(), b.lower())
+
+def natsort(seq, cmp=natcmp):
+    "In-place natural string sort."
+    seq.sort(cmp)
+    
+def natsorted(seq, cmp=natcmp):
+    "Returns a copy of seq, sorted by natural string sort."
+    import copy
+    temp = copy.copy(seq)
+    natsort(temp, cmp)
+    return temp
+

=== added file 'scripts/nightly_build.sh'
--- scripts/nightly_build.sh	1970-01-01 00:00:00 +0000
+++ scripts/nightly_build.sh	2016-01-03 21:12:58 +0000
@@ -0,0 +1,78 @@
+#!/bin/bash
+###############################################################################
+# Nightly Build Script for OpenLP                                             #
+###############################################################################
+
+REGEX='OpenLP-([0-9]\.[0-9]\.[0-9])-bzr([0-9]+)[.|-]'
+PROJECT_DIR=/home/openlp/Projects/OpenLP
+SOURCE_DIR=$PROJECT_DIR/trunk
+VERSION_FILE=$SOURCE_DIR/openlp/.version
+PACKAGING_DIR=/home/openlp/Packaging
+UPLOADS_DIR=$PROJECT_DIR/Uploads
+
+echo Starting the OpenLP 2.2 Nightly Build Script
+echo --------------------------------------------
+echo -ne "Updating code...\r"
+cd $SOURCE_DIR
+bzr update -q
+echo "Updating code...done."
+
+# We can't get the version number until after updating the code
+# otherwise the version number we get is out-of-date
+OPENLP_VERSION=`~/bin/openlp_version.py $SOURCE_DIR`
+UPLOAD_TARBALL=OpenLP-${OPENLP_VERSION}.tar.gz
+PACKAGE_TARBALL=$PACKAGING_DIR/Tarballs/openlp_${OPENLP_VERSION}.orig.tar.gz
+
+echo -n "Checking revision..."
+if [[ -f "$VERSION_FILE" && "`bzr revno`" -eq "`cat $VERSION_FILE`" ]]; then
+    echo done.
+    echo OpenLP is already at the latest revision, aborting build.
+    echo --------------------------------------------
+    echo Finished OpenLP 2.2 Nightly Build Script
+    exit
+fi
+echo done.
+echo -n "Writing version number..."
+bzr revno > $VERSION_FILE
+echo done.
+echo -n "Exporting source for $OPENLP_VERSION ..."
+if [[ -d "../OpenLP-$OPENLP_VERSION" ]]; then
+	rm -r ../OpenLP-$OPENLP_VERSION
+fi
+bzr export ../OpenLP-$OPENLP_VERSION
+echo done.
+echo -n "Creating source tarball $UPLOADS_DIR/$UPLOAD_TARBALL ..."
+cd $PROJECT_DIR
+tar -czf $UPLOADS_DIR/$UPLOAD_TARBALL OpenLP-$OPENLP_VERSION
+echo done.
+echo -n "Uploading tarball to download location..."
+cd $UPLOADS_DIR
+scp -q $UPLOADS_DIR/$UPLOAD_TARBALL openlp@xxxxxxxxxx:public_html/files/
+ssh -q openlp@xxxxxxxxxx "python update_builds.py source $UPLOAD_TARBALL"
+echo done.
+echo -n "Updating Version File..."
+echo "$VERSION" > nightly_version.txt
+scp -q nightly_version.txt openlp@xxxxxxxxxx:public_html/files/nightly_version.txt
+rm nightly_version.txt
+echo done.
+echo -n "Notifying Twitter..."
+if [[ $UPLOAD_TARBALL =~ $REGEX ]]; then
+        VERSION_STRING="version ${BASH_REMATCH[1]}, build ${BASH_REMATCH[2]}"
+else
+	VERSION_STRING="version ${OPENLP_VERSION}"
+fi
+~/bin/openlp_tweeter.py openlp_dev "Latest nightly source tarball of OpenLP 2.2 available at http://openlp.org/files/latest.tar.gz - ${VERSION_STRING}."
+echo done.
+echo Building sources for PPA...
+~/bin/build_nightly_deb.sh trusty
+~/bin/build_nightly_deb.sh utopic
+~/bin/build_nightly_deb.sh vivid
+echo -n "Notifying Twitter..."
+~/bin/openlp_tweeter.py openlp_dev "Latest Ubuntu nightly package of OpenLP 2.2 queued for building in the Nightly PPA (ppa:openlp-core/nightly) - ${VERSION_STRING}."
+echo done.
+echo -n "Cleaning up..."
+rm -r $UPLOADS_DIR/*
+rm $PACKAGE_TARBALL
+echo done.
+echo --------------------------------------------
+echo Finished OpenLP 2.2 Nightly Build Script

=== added file 'scripts/notify_build.sh'
--- scripts/notify_build.sh	1970-01-01 00:00:00 +0000
+++ scripts/notify_build.sh	2016-01-03 21:12:58 +0000
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+if [ $# -lt 2 ]
+then
+  echo "Usage: `basename $0` {filename} {windows|osx|portable} [delete]"
+  exit 5
+fi
+
+FILENAME=$1
+BASEFILE=`basename $FILENAME`
+BUILDTYPE=$2
+REGEX='(OpenLP-|OpenLPPortable_)([0-9]\.[0-9]\.[0-9]+)(-bzr|\.)([0-9]+)[.|-]'
+
+if [ $# -eq 3 -a "$3" == "delete" ]; then
+    AUTODELETE=1
+else
+    AUTODELETE=0
+fi
+
+if [ "${BUILDTYPE}x" == "x" ]; then
+    $BUILDTYPE=windows
+fi
+if [[ $BASEFILE =~ $REGEX ]]; then
+    if [ "$BUILDTYPE" == "windows" ]; then
+        PLATFORM="Windows"
+        EXT=".exe"
+    elif [ "$BUILDTYPE" == "osx" ]; then
+        PLATFORM="Mac OS X"
+        EXT=".dmg"
+    elif [ "$BUILDTYPE" == "portable" ]; then
+        PLATFORM="PortableApps"
+        EXT="-portable.exe"
+    fi
+    echo "Notifying Twitter..."
+    /home/openlp/bin/openlp_tweeter.py openlp_dev "Latest $PLATFORM development build of OpenLP 2.0 available at http://openlp.org/files/latest$EXT - version ${BASH_REMATCH[2]} build ${BASH_REMATCH[4]}."
+    if [ $? -ne 0 ]; then
+        exit 4
+    fi
+fi
+

=== added file 'scripts/openlp_tweeter.py'
--- scripts/openlp_tweeter.py	1970-01-01 00:00:00 +0000
+++ scripts/openlp_tweeter.py	2016-01-03 21:12:58 +0000
@@ -0,0 +1,60 @@
+#!/home/openlp/VirtualEnv/stats/bin/python
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2015 OpenLP Developers                                   #
+# --------------------------------------------------------------------------- #
+# This program is free software; you can redistribute it and/or modify it     #
+# under the terms of the GNU General Public License as published by the Free  #
+# Software Foundation; version 2 of the License.                              #
+#                                                                             #
+# This program is distributed in the hope that it will be useful, but WITHOUT #
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
+# more details.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+
+import sys
+import tweepy
+
+CONSUMER_KEY = 'MYPnldPBzlbueaSvD1rnw'
+CONSUMER_SECRET = 'yyDJ4TTADxv7MELAju0dtrNSEGnKa88zplDFoPiw'
+AUTH_TOKENS = {
+    'openlp_dev': {
+        'key': '703540082-qTYyENzdhoDNMDP9kc95BL0yd98rz0EaVRiirya4',
+        'secret': 'sm9uSck8yoXUBvPkPT3fISiM5Z46KREskgmxTZ8B0'
+    },
+    'openlp': {
+        'key': '72314330-rUzaA2hRQAaEum6KIhFnOWNUPFqt1nkwgIC0ZS7IG',
+        'secret': 'UGMGO6oAcjHKADM8TZnMAos5cK11HL1Jd7CTQVWpJc8'
+    }
+}
+
+ACCESS_KEY = '72314330-rUzaA2hRQAaEum6KIhFnOWNUPFqt1nkwgIC0ZS7IG'
+ACCESS_SECRET = 'UGMGO6oAcjHKADM8TZnMAos5cK11HL1Jd7CTQVWpJc8'
+
+if __name__ == u'__main__':
+    # Don't bother to do anything if there's nothing to tweet.
+    if len(sys.argv) == 1:
+        print 'Nothing to tweet!'
+        sys.exit(1)
+    try:
+        if len(sys.argv) == 2:
+            account = 'openlp_dev'
+            message = sys.argv[1]
+        else:
+            account = sys.argv[1]
+            message = sys.argv[2]
+        auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
+        auth.set_access_token(AUTH_TOKENS[account]['key'], AUTH_TOKENS[account]['secret'])
+        api = tweepy.API(auth)
+        api.update_status(message)
+        print 'Successfully sent tweet.'
+        sys.exit()
+    except tweepy.error.TweepError as error:
+        print error
+        sys.exit(2)

=== added file 'scripts/openlp_version.py'
--- scripts/openlp_version.py	1970-01-01 00:00:00 +0000
+++ scripts/openlp_version.py	2016-01-03 21:12:58 +0000
@@ -0,0 +1,57 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2015 OpenLP Developers                                   #
+# --------------------------------------------------------------------------- #
+# This program is free software; you can redistribute it and/or modify it     #
+# under the terms of the GNU General Public License as published by the Free  #
+# Software Foundation; version 2 of the License.                              #
+#                                                                             #
+# This program is distributed in the hope that it will be useful, but WITHOUT #
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
+# more details.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+
+import sys
+import os
+
+from bzrlib.branch import Branch
+from natsort import natsorted
+
+def get_version(path):
+    b = Branch.open_containing(path)[0]
+    b.lock_read()
+    result = '0.0.0'
+    try:
+        # Get the branch's latest revision number.
+        revno = b.revno()
+        # Convert said revision number into a bzr revision id.
+        revision_id = b.dotted_revno_to_revision_id((revno,))
+        # Get a dict of tags, with the revision id as the key.
+        tags = b.tags.get_reverse_tag_dict()
+        # Check if the latest
+        if revision_id in tags:
+            result = tags[revision_id][0]
+        else:
+            result = '%s-bzr%s' % (natsorted(b.tags.get_tag_dict().keys())[-1], revno)
+    finally:
+        b.unlock()
+        return result
+
+def get_path():
+    if len(sys.argv) > 1:
+        return os.path.abspath(sys.argv[1])
+    else:
+        return os.path.abspath('.')
+
+if __name__ == u'__main__':
+    path = get_path()
+    print get_version(path)
+

=== added file 'scripts/openlptweet.py'
--- scripts/openlptweet.py	1970-01-01 00:00:00 +0000
+++ scripts/openlptweet.py	2016-01-03 21:12:58 +0000
@@ -0,0 +1,48 @@
+#!/usr/bin/env python2
+# -*- coding: utf-8 -*-
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2015 OpenLP Developers                                   #
+# --------------------------------------------------------------------------- #
+# This program is free software; you can redistribute it and/or modify it     #
+# under the terms of the GNU General Public License as published by the Free  #
+# Software Foundation; version 2 of the License.                              #
+#                                                                             #
+# This program is distributed in the hope that it will be useful, but WITHOUT #
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
+# more details.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+
+from optparse import OptionParser
+
+from twitter import Api, Status
+
+def main():
+    parser = OptionParser()
+    #parser.add_option("-m", "--message", dest="message", metavar="MESSAGE",
+    #                  help="Status message to post to Twitter", metavar="MESSAGE")
+    parser.add_option("-u", "--username", dest="username", metavar="USERNAME",
+                      help="The username to post as, required for authentication.")
+    parser.add_option("-p", "--password", dest="password", metavar="PASSWORD",
+                      help="The password for the username, required for authentication.")
+    (options, args) = parser.parse_args()
+    if len(args) == 0:
+        parser.error("You haven't provided a message.")
+    if not options.username or not options.password:
+        parser.error("You need to supply a username and a password.")
+    message = args[0]
+    api = Api(username=options.username, password=options.password)
+    status = api.PostUpdate(message)
+    if not status:
+        print "There was a problem posting your status."
+    else:
+        print "Successfully posted your status!"
+
+if __name__ == "__main__":
+    main()

=== added file 'scripts/release_build.sh'
--- scripts/release_build.sh	1970-01-01 00:00:00 +0000
+++ scripts/release_build.sh	2016-01-03 21:12:58 +0000
@@ -0,0 +1,34 @@
+#!/bin/bash
+
+VERSION=$1
+RELEASE=release-$VERSION
+FILENAME=OpenLP-$VERSION.tar.gz
+#TSDIR=$RELEASE/resources/i18n
+#QMDIR=$RELEASE/openlp/i18n
+
+echo Starting the OpenLP 2.0 Release Build Script
+echo --------------------------------------------
+echo -ne "Updating trunk-2.0...\r"
+cd /home/openlp/Projects/OpenLP/trunk-2.0
+bzr update -q
+echo "Updating trunk-2.0...done."
+echo -ne "Branching release tag...\r"
+cd /home/openlp/Projects/OpenLP
+bzr branch trunk-2.0 $RELEASE -r tag:$VERSION -q
+echo "Branching release tag...done."
+echo -n "Creating source distribution..."
+cd /home/openlp/Projects/OpenLP/$RELEASE
+python setup.py sdist
+echo "done."
+#echo -n "Updating Version File..."
+#echo "$VERSION" > version.txt
+#scp version.txt openlp@xxxxxxxxxx:public_html/files/version.txt
+#rm version.txt
+echo "Building sources for PPA..."
+~/bin/build_release_deb.sh $VERSION utopic
+echo -n "Cleaning up..."
+cd /home/openlp/Projects/OpenLP
+rm -fR $RELEASE
+echo "done."
+echo --------------------------------------------
+echo Finished OpenLP 2.0 Release Build Script

=== added file 'scripts/upload_build.sh'
--- scripts/upload_build.sh	1970-01-01 00:00:00 +0000
+++ scripts/upload_build.sh	2016-01-03 21:12:58 +0000
@@ -0,0 +1,59 @@
+#!/bin/bash
+
+if [ $# -lt 2 ]
+then
+  echo "Usage: `basename $0` {filename} {windows|osx|portable} [delete]"
+  exit 5
+fi
+
+FILENAME=$1
+BASEFILE=`basename $FILENAME`
+BUILDTYPE=$2
+REGEX='(OpenLP-|OpenLPPortable_)([0-9]\.[0-9]\.[0-9]+)(-bzr|\.)([0-9]+)[.|-]'
+
+if [ $# -eq 3 -a "$3" == "delete" ]; then
+    AUTODELETE=1
+else
+    AUTODELETE=0
+fi
+
+if [ ! -f $FILENAME ]; then
+    echo "$FILENAME does not exist, exiting."
+    exit 1
+fi
+if [ "${BUILDTYPE}x" == "x" ]; then
+    $BUILDTYPE=windows
+fi
+echo "Uploading file..."
+scp $FILENAME openlp@xxxxxxxxxx:public_html/files/
+if [ $? -ne 0 ]; then
+    echo "Failed to upload ${FILENAME}."
+    exit 2
+fi
+echo "Updating build information on server..."
+ssh openlp@xxxxxxxxxx "python update_builds.py $BUILDTYPE $BASEFILE"
+if [ $? -ne 0 ]; then
+    echo "Failed to update build ${BUILDTYPE} ${BASEFILE}."
+    exit 3
+fi
+if [ $AUTODELETE -eq 1 ]; then
+    rm $FILENAME
+fi
+if [[ $BASEFILE =~ $REGEX ]]; then
+    if [ "$BUILDTYPE" == "windows" ]; then
+        PLATFORM="Windows"
+        EXT=".exe"
+    elif [ "$BUILDTYPE" == "osx" ]; then
+        PLATFORM="Mac OS X"
+        EXT=".dmg"
+    elif [ "$BUILDTYPE" == "portable" ]; then
+        PLATFORM="PortableApps"
+        EXT="-portable.exe"
+    fi
+    echo "Notifying Twitter..."
+    /home/openlp/bin/openlp_tweeter.py openlp_dev "Latest $PLATFORM development build of OpenLP 2.2 available at http://openlp.org/files/latest$EXT - version ${BASH_REMATCH[2]} build ${BASH_REMATCH[4]}."
+    if [ $? -ne 0 ]; then
+        exit 4
+    fi
+fi
+

=== added directory 'windows'
=== added file 'windows/LICENSE.txt'
--- windows/LICENSE.txt	1970-01-01 00:00:00 +0000
+++ windows/LICENSE.txt	2016-01-03 21:12:58 +0000
@@ -0,0 +1,339 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.

=== added file 'windows/OpenLP.ico'
Binary files windows/OpenLP.ico	1970-01-01 00:00:00 +0000 and windows/OpenLP.ico	2016-01-03 21:12:58 +0000 differ
=== added file 'windows/OpenLP.iss.default'
--- windows/OpenLP.iss.default	1970-01-01 00:00:00 +0000
+++ windows/OpenLP.iss.default	2016-01-03 21:12:58 +0000
@@ -0,0 +1,185 @@
+; Script generated by the Inno Setup Script Wizard.
+; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
+
+#define AppName "OpenLP"
+#define AppVerName "OpenLP %(display_version)s"
+#define AppVersion "%(display_version)s"
+#define AppPublisher "OpenLP Developers"
+#define AppURL "http://openlp.org/";
+#define AppExeName "OpenLP.exe"
+
+#define FileHandle FileOpen("%(branch)s\dist\OpenLP\.version")
+#define FileLine FileRead(FileHandle)
+#define RealVersion FileLine
+#expr FileClose(FileHandle)
+
+[Setup]
+; NOTE: The value of AppId uniquely identifies this application.
+; Do not use the same AppId value in installers for other applications.
+; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
+AppID={{AA7699FA-B2D2-43F4-8A70-D497D03C9485}
+AppName={#AppName}
+AppVerName={cm:NameAndVersion,{#AppName},{#AppVersion}}
+AppVersion={#AppVersion}
+AppPublisher={#AppPublisher}
+AppPublisherURL={#AppURL}
+AppSupportURL={#AppURL}
+AppUpdatesURL={#AppURL}
+DefaultDirName={pf}\{#AppName}
+DefaultGroupName={#AppName}
+AllowNoIcons=true
+LicenseFile=LICENSE.txt
+OutputDir=%(branch)s\dist\
+OutputBaseFilename=OpenLP-{#RealVersion}-setup
+Compression=lzma/Max
+SolidCompression=true
+SetupIconFile=OpenLP.ico
+VersionInfoVersion={#AppVersion}
+WizardImageFile=WizImageBig.bmp
+WizardSmallImageFile=WizImageSmall.bmp
+ChangesAssociations=true
+
+[Languages]
+Name: english; MessagesFile: compiler:Default.isl
+Name: brazilianportuguese; MessagesFile: compiler:Languages\BrazilianPortuguese.isl
+Name: catalan; MessagesFile: compiler:Languages\Catalan.isl
+Name: czech; MessagesFile: compiler:Languages\Czech.isl
+Name: danish; MessagesFile: compiler:Languages\Danish.isl
+Name: dutch; MessagesFile: compiler:Languages\Dutch.isl
+Name: finnish; MessagesFile: compiler:Languages\Finnish.isl
+Name: french; MessagesFile: compiler:Languages\French.isl
+Name: german; MessagesFile: compiler:Languages\German.isl
+Name: hebrew; MessagesFile: compiler:Languages\Hebrew.isl
+Name: hungarian; MessagesFile: compiler:Languages\Hungarian.isl
+Name: italian; MessagesFile: compiler:Languages\Italian.isl
+Name: japanese; MessagesFile: compiler:Languages\Japanese.isl
+Name: norwegian; MessagesFile: compiler:Languages\Norwegian.isl
+Name: polish; MessagesFile: compiler:Languages\Polish.isl
+Name: portuguese; MessagesFile: compiler:Languages\Portuguese.isl
+Name: russian; MessagesFile: compiler:Languages\Russian.isl
+Name: slovenian; MessagesFile: compiler:Languages\Slovenian.isl
+Name: spanish; MessagesFile: compiler:Languages\Spanish.isl
+
+[Tasks]
+Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}
+Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; OnlyBelowVersion: 0, 6.1
+
+[Files]
+Source: %(branch)s\dist\OpenLP\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
+; DLL used to check if the target program is running at install time
+Source: psvince.dll; flags: dontcopy
+; psvince is installed in {app} folder, so it will be loaded at
+; uninstall time to check if the target program is running
+Source: psvince.dll; DestDir: {app}
+
+[Icons]
+Name: {group}\{#AppName}; Filename: {app}\{#AppExeName}
+Name: {group}\{#AppName} (Debug); Filename: {app}\{#AppExeName}; Parameters: -l debug
+Name: {group}\{#AppName} Help; Filename: {app}\{#AppName}.chm; Check: FileExists(ExpandConstant('{app}\{#AppName}.chm'))
+Name: {group}\{cm:ProgramOnTheWeb,{#AppName}}; Filename: {#AppURL}
+Name: {group}\{cm:UninstallProgram,{#AppName}}; Filename: {uninstallexe}
+Name: {commondesktop}\{#AppName}; Filename: {app}\{#AppExeName}; Tasks: desktopicon
+Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AppName}; Filename: {app}\{#AppExeName}; Tasks: quicklaunchicon
+
+[Run]
+Filename: {app}\{#AppExeName}; Description: {cm:LaunchProgram,{#AppName}}; Flags: nowait postinstall skipifsilent
+
+[Registry]
+Root: HKCR; Subkey: .osz; ValueType: string; ValueName: ; ValueData: OpenLP; Flags: uninsdeletevalue
+Root: HKCR; Subkey: OpenLP; ValueType: string; ValueName: ; ValueData: OpenLP Service; Flags: uninsdeletekey
+Root: HKCR; Subkey: OpenLP\DefaultIcon; ValueType: string; ValueName: ; ValueData: {app}\OpenLP.exe,0
+Root: HKCR; Subkey: OpenLP\shell\open\command; ValueType: string; ValueName: ; ValueData: """{app}\OpenLP.exe"" ""%1"""
+
+[UninstallDelete]
+; Remove support directory created when program is run:
+Type: filesandordirs; Name: {app}\support
+; Remove program directory if empty:
+Name: {app}; Type: dirifempty
+
+[Code]
+// Function to call psvince.dll at install time
+function IsModuleLoadedInstall(modulename: AnsiString ):  Boolean;
+external 'IsModuleLoaded@files:psvince.dll stdcall setuponly';
+
+// Function to call psvince.dll at uninstall time
+function IsModuleLoadedUninstall(modulename: AnsiString ):  Boolean;
+external 'IsModuleLoaded@{app}\psvince.dll stdcall uninstallonly' ;
+
+function GetUninstallString(): String;
+var
+  sUnInstPath: String;
+  sUnInstallString: String;
+begin
+  sUnInstPath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#emit SetupSetting("AppId")}_is1');
+  sUnInstallString := '';
+  if not RegQueryStringValue(HKLM, sUnInstPath, 'UninstallString', sUnInstallString) then
+    RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString);
+  Result := sUnInstallString;
+end;
+
+function IsUpgrade(): Boolean;
+begin
+  Result := (GetUninstallString() <> '');
+end;
+
+// Return Values:
+// 1 - uninstall string is empty
+// 2 - error executing the UnInstallString
+// 3 - successfully executed the UnInstallString
+function UnInstallOldVersion(): Integer;
+var
+  sUnInstallString: String;
+  iResultCode: Integer;
+begin
+  Result := 0;
+  sUnInstallString := GetUninstallString();
+  if sUnInstallString <> '' then
+  begin
+    sUnInstallString := RemoveQuotes(sUnInstallString);
+    if Exec(sUnInstallString, '/SILENT /NORESTART /SUPPRESSMSGBOXES','', SW_HIDE, ewWaitUntilTerminated, iResultCode) then
+      Result := 3
+    else
+      Result := 2;
+  end
+  else
+    Result := 1;
+end;
+
+function InitializeSetup(): Boolean;
+begin
+  Result := true;
+  while IsModuleLoadedInstall( 'OpenLP.exe' ) and Result do
+  begin
+    if MsgBox( 'Openlp is currently running, please close it to continue the install.',
+      mbError, MB_OKCANCEL ) =  IDCANCEL then
+	begin
+	  Result := false;
+	end;
+  end;
+end;
+
+procedure CurStepChanged(CurStep: TSetupStep);
+begin
+  if (CurStep=ssInstall) then
+  begin
+    if (IsUpgrade()) then
+    begin
+      UnInstallOldVersion();
+    end;
+  end;
+end;
+
+function InitializeUninstall(): Boolean;
+begin
+  Result := true;
+  while IsModuleLoadedUninstall( 'OpenLP.exe' ) and Result do
+  begin
+    if MsgBox( 'Openlp is currently running, please close it to continue the uninstall.',
+      mbError, MB_OKCANCEL ) =  IDCANCEL then
+	begin
+	  Result := false;
+	end;
+  end;
+// Unload psvince.dll, otherwise it is not deleted
+  UnloadDLL(ExpandConstant('{app}\psvince.dll'));
+end;

=== added file 'windows/OpenLP.reg'
Binary files windows/OpenLP.reg	1970-01-01 00:00:00 +0000 and windows/OpenLP.reg	2016-01-03 21:12:58 +0000 differ
=== added directory 'windows/OpenLPPortable'
=== added directory 'windows/OpenLPPortable/App'
=== added directory 'windows/OpenLPPortable/App/Appinfo'
=== added directory 'windows/OpenLPPortable/App/Appinfo/Launcher'
=== added file 'windows/OpenLPPortable/App/Appinfo/Launcher/OpenLPPortable.ini'
--- windows/OpenLPPortable/App/Appinfo/Launcher/OpenLPPortable.ini	1970-01-01 00:00:00 +0000
+++ windows/OpenLPPortable/App/Appinfo/Launcher/OpenLPPortable.ini	2016-01-03 21:12:58 +0000
@@ -0,0 +1,10 @@
+[Launch]
+ProgramExecutable=OpenLP\OpenLP.exe
+CommandLineArguments="-p"
+WaitForProgram=False
+WorkingDirectory=%PAL:AppDir%\AppName
+SinglePortableAppInstance=True
+DirectoryMoveOK=Yes
+
+[Environment]
+PATH=%PATH%;%PAL:Drive%\VLCPortable\App\vlc

=== added file 'windows/OpenLPPortable/App/Appinfo/appicon.ico'
Binary files windows/OpenLPPortable/App/Appinfo/appicon.ico	1970-01-01 00:00:00 +0000 and windows/OpenLPPortable/App/Appinfo/appicon.ico	2016-01-03 21:12:58 +0000 differ
=== added file 'windows/OpenLPPortable/App/Appinfo/appicon_16.png'
Binary files windows/OpenLPPortable/App/Appinfo/appicon_16.png	1970-01-01 00:00:00 +0000 and windows/OpenLPPortable/App/Appinfo/appicon_16.png	2016-01-03 21:12:58 +0000 differ
=== added file 'windows/OpenLPPortable/App/Appinfo/appicon_32.png'
Binary files windows/OpenLPPortable/App/Appinfo/appicon_32.png	1970-01-01 00:00:00 +0000 and windows/OpenLPPortable/App/Appinfo/appicon_32.png	2016-01-03 21:12:58 +0000 differ
=== added file 'windows/OpenLPPortable/App/Readme.txt'
--- windows/OpenLPPortable/App/Readme.txt	1970-01-01 00:00:00 +0000
+++ windows/OpenLPPortable/App/Readme.txt	2016-01-03 21:12:58 +0000
@@ -0,0 +1,3 @@
+The files in this directory are necessary for the portable application to
+function.  There is normally no need to directly access or alter any of
+the files within these directories.

=== added directory 'windows/OpenLPPortable/Other'
=== added directory 'windows/OpenLPPortable/Other/Help'
=== added directory 'windows/OpenLPPortable/Other/Help/Images'
=== added file 'windows/OpenLPPortable/Other/Help/Images/Donation_Button.png'
Binary files windows/OpenLPPortable/Other/Help/Images/Donation_Button.png	1970-01-01 00:00:00 +0000 and windows/OpenLPPortable/Other/Help/Images/Donation_Button.png	2016-01-03 21:12:58 +0000 differ
=== added file 'windows/OpenLPPortable/Other/Help/Images/Favicon.ico'
Binary files windows/OpenLPPortable/Other/Help/Images/Favicon.ico	1970-01-01 00:00:00 +0000 and windows/OpenLPPortable/Other/Help/Images/Favicon.ico	2016-01-03 21:12:58 +0000 differ
=== added file 'windows/OpenLPPortable/Other/Help/Images/Help_Background_Footer.png'
Binary files windows/OpenLPPortable/Other/Help/Images/Help_Background_Footer.png	1970-01-01 00:00:00 +0000 and windows/OpenLPPortable/Other/Help/Images/Help_Background_Footer.png	2016-01-03 21:12:58 +0000 differ
=== added file 'windows/OpenLPPortable/Other/Help/Images/Help_Background_Header.png'
Binary files windows/OpenLPPortable/Other/Help/Images/Help_Background_Header.png	1970-01-01 00:00:00 +0000 and windows/OpenLPPortable/Other/Help/Images/Help_Background_Header.png	2016-01-03 21:12:58 +0000 differ
=== added file 'windows/OpenLPPortable/Other/Help/Images/Help_Logo_Top.png'
Binary files windows/OpenLPPortable/Other/Help/Images/Help_Logo_Top.png	1970-01-01 00:00:00 +0000 and windows/OpenLPPortable/Other/Help/Images/Help_Logo_Top.png	2016-01-03 21:12:58 +0000 differ
=== added directory 'windows/OpenLPPortable/Other/Source'
=== added file 'windows/OpenLPPortable/Other/Source/LauncherLicense.txt'
--- windows/OpenLPPortable/Other/Source/LauncherLicense.txt	1970-01-01 00:00:00 +0000
+++ windows/OpenLPPortable/Other/Source/LauncherLicense.txt	2016-01-03 21:12:58 +0000
@@ -0,0 +1,339 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.

=== added file 'windows/OpenLPPortable/Other/Source/OpenLPPortable.ini'
--- windows/OpenLPPortable/Other/Source/OpenLPPortable.ini	1970-01-01 00:00:00 +0000
+++ windows/OpenLPPortable/Other/Source/OpenLPPortable.ini	2016-01-03 21:12:58 +0000
@@ -0,0 +1,6 @@
+AdditionalParameters=
+DisableSplashScreen=false
+RunLocally=false
+
+# The above options are explained in the included readme.txt
+# This INI file is an example only and is not used unless it is placed as described in the included readme.txt

=== added file 'windows/OpenLPPortable/Other/Source/Readme.txt'
--- windows/OpenLPPortable/Other/Source/Readme.txt	1970-01-01 00:00:00 +0000
+++ windows/OpenLPPortable/Other/Source/Readme.txt	2016-01-03 21:12:58 +0000
@@ -0,0 +1,47 @@
+The base application's source code is available from the portable app's
+homepage listed in the help.html file (if applicable).
+
+Details of most other things are available there as well.
+
+LICENSE
+=======
+
+This package's installer and launcher are released under the GPL. The launcher
+is the PortableApps.com Launcher, available with full source and documentation
+from http://portableapps.com/development. We request that developers using the
+PortableApps.com Launcher please leave this directory intact and unchanged.
+
+USER CONFIGURATION
+==================
+
+Some configuration in the PortableApps.com Launcher can be overridden by the
+user in an INI file next to OpenLPPortable.exe called OpenLPPortablePortable.ini.
+If you are happy with the default options, it is not necessary, though.  There
+is an example INI included with this package to get you started.  To use it,
+copy AppNamePortable.ini from this directory to OpenLPPortable.ini next to
+OpenLPPortable.exe. The options in the INI file are as follows:
+
+   AdditionalParameters=
+   DisableSplashScreen=false
+   RunLocally=false
+
+(There is no need for an INI header in this file; if you have one, though, it
+won't damage anything.)
+
+The AdditionalParameters entry allows you to pass additional command-line
+parameters to the application.
+
+The DisableSplashScreen entry allows you to run the launcher without the splash
+screen showing up.  The default is false.
+
+The RunLocally entry allows you to run the portable application from a read-
+only medium. This is known as Live mode. It copies what it needs to to a
+temporary directory on the host computer, runs the application, and then
+deletes it afterwards, leaving nothing behind. This can be useful for running
+the application from a CD or if you work on a computer that may have spyware or
+viruses and you'd like to keep your device set to read-only. As a consequence
+of this technique, any changes you make during the Live mode session aren't
+saved back to your device.  The default is false.
+
+There may be other values also permitted in the user configuration file by the
+portable application; refer to help.html for any details of them.

=== added file 'windows/OpenLPPortable/help.html'
--- windows/OpenLPPortable/help.html	1970-01-01 00:00:00 +0000
+++ windows/OpenLPPortable/help.html	2016-01-03 21:12:58 +0000
@@ -0,0 +1,160 @@
+<!DOCTYPE html>
+<html lang="en-US">
+<head>
+    <meta charset="UTF-8">
+    <title>OpenLP Portable Help</title>
+    <link rel="alternate" href="http://portableapps.com/feeds/general"; type="application/rss+xml" title="PortableApps.com">
+    <link rel="shortcut icon" href="Other/Help/Images/Favicon.ico">
+    <style type="text/css">
+        body {
+            font-family : Verdana,Arial,Helvetica,sans-serif;
+            font-size   : 76%;
+            color       : black;
+            margin      : 20px;
+            background  : #e6e8ea;
+            text-align  : center;
+        }
+        a {
+            color       : #b31616;
+            font-weight : bold;
+        }
+        a:link, a:visited, a:active {}
+        a:hover {
+            color : red;
+        }
+        h1, h2, h3, h4, h5, h6 {
+            font-family : Arial, sans-serif;
+            font-weight : normal;
+        }
+        h1 {
+            color          : #b31616;
+            font-weight    : bold;
+            letter-spacing : -2px;
+            font-size      : 2.2em;
+            border-bottom  : 1px solid silver;
+            padding-bottom : 5px;
+        }
+        h2 {
+            font-size      : 1.5em;
+            border-bottom  : 1px solid silver;
+            padding-bottom : 3px;
+            clear          : both;
+        }
+        h3 { font-size : 1.2em; }
+        h4 { font-size : 1.1em; }
+        h5 { font-size : 1.0em; }
+        h6 { font-size : 0.8em; }
+        img { border : 0; }
+        ol, ul, li, p, pre, table, tr, td, th { font-size : 1.0em; }
+        pre { font-family : monospace; }
+        strong, b { font-weight : bold; }
+        td, th {
+            border          : 1px solid #aaaaaa;
+            border-collapse : collapse;
+            padding         : 3px;
+        }
+        th {
+            background : #3667a8;
+            color      : white;
+        }
+        ol ol { list-style-type : lower-alpha; }
+        .content {
+            text-align       : left;
+            margin-left      : auto;
+            margin-right     : auto;
+            width            : 780px;
+            background-color : white;
+            border-left      : 1px solid black;
+            border-right     : 1px solid black;
+            padding          : 12px 30px;
+            line-height      : 150%;
+        }
+        .logo {
+            background   : white url("Other/Help/Images/Help_Background_Header.png") repeat-x;
+            width        : 840px;
+            margin-top   : 20px;
+            margin-left  : auto;
+            margin-right : auto;
+            text-align   : left;
+            border-right : 1px solid black;
+            border-left  : 1px solid black;
+        }
+        .footer {
+            background   : white url("Other/Help/Images/Help_Background_Footer.png") repeat-x;
+            width        : 840px;
+            height       : 16px;
+            margin-left  : auto;
+            margin-right : auto;
+            text-align   : left;
+            border-right : 1px solid black;
+            border-left  : 1px solid black;
+        }
+        .logo img {
+            padding-left : 0px;
+            border       : none;
+            position     : relative;
+            top          : -4px;
+        }
+        * html .content { width : 760px; }
+        * html .logo, * html .footer { width : 820px; }
+        .content h1 { margin : 0px; }
+        h1.hastagline { border : 0; }
+        h2.tagline {
+            color      : #747673;
+            clear      : none;
+            margin-top : 0em;
+        }
+
+            /* printer styles */
+        @media print {
+            body, .content {
+                margin  : 0;
+                padding : 0;
+            }
+            .navigation, .locator, .footer a, .message, .footer-links { display : none; }
+            .footer, .content, .header { border : none; }
+            a {
+                text-decoration : none;
+                font-weight     : normal;
+                color           : black;
+            }
+        }
+    </style>
+</head>
+
+<body>
+<div class="logo"><a href="http://portableapps.com/";><img src="Other/Help/Images/Help_Logo_Top.png" alt="PortableApps.com - Your Digital Life, Anywhere"></a></div>
+<div class="content">
+    <h1 class="hastagline">OpenLP Portable Help</h1>
+    <h2 class="tagline">Open Lyrics Projection</h2>
+    <p>OpenLP Portable is the OpenLP Lyrics Presentation program packaged with a PortableApps.com launcher as a <a href="http://portableapps.com/about/what_is_a_portable_app";>portable app</a>, so you can manage your services on your iPod, USB flash drive, portable hard drive, etc. It has all the same features as OpenLP, plus, it leaves no personal information behind on the machine you run it on, so you can take it with you wherever you go. <a href="http://openlp.org";>Learn more about OpenLP...</a></p>
+
+    <p><a href="http://portableapps.com/donate";><img src="Other/Help/Images/Donation_Button.png" style="vertical-align:middle" alt="Make a Donation"></a> - Support PortableApps.com's Hosting and Development</p>
+
+    <p><a href="http://portableapps.com/node/32795";>Go to the OpenLP Portable Homepage &gt;&gt;</a></p>
+    <p><a href="http://portableapps.com/";>Get more portable apps at PortableApps.com</a></p>
+
+    <p>This software is OSI Certified Open Source Software. OSI Certified is a certification mark of the Open Source Initiative.</p>
+
+    <h2>Portable App Issues</h2>
+    <ul>
+        <li><a href="http://portableapps.com/support/portable_app#downloading";>Downloading a Portable App</a></li>
+        <li><a href="http://portableapps.com/support/portable_app#installing";>Installing a Portable App</a></li>
+        <li><a href="http://portableapps.com/support/portable_app#using";>Using a Portable App</a></li>
+        <li><a href="http://portableapps.com/support/portable_app#upgrading";>Upgrading a Portable App</a></li>
+    </ul>
+    <p>You can read about advanced configuration options for the PortableApps.com Launcher in its <a href="Other/Source/Readme.txt">readme file</a>.</p>
+
+    <h2>OpenLP Help</h2>
+    <p>You can access help from within OpenLP by navigating to Help -> User Guide</p>
+    <p>Also, the following Help options are available:</p>
+    <ul>
+        <li><a href="http://openlp.org/"; target="_blank">OpenLP.org</a> - Visit the Main website for OpenLP.</li>
+        <li><a href="http://openlp.org/manual/"; target="_blank">Online Help</a> - Visit the online manual for OpenLP. (Most up-to-date documentation, internet connection required.)</li>
+        <li><a href="file:App/OpenLP/help/index.html" target="_blank">Local OpenLP Help</a> - Use the local help files (no internet connection required.)</li>
+    </ul>
+</div>
+<div class="footer"></div>
+</body>
+</html>
+

=== added file 'windows/WizImageBig.bmp'
Binary files windows/WizImageBig.bmp	1970-01-01 00:00:00 +0000 and windows/WizImageBig.bmp	2016-01-03 21:12:58 +0000 differ
=== added file 'windows/WizImageSmall.bmp'
Binary files windows/WizImageSmall.bmp	1970-01-01 00:00:00 +0000 and windows/WizImageSmall.bmp	2016-01-03 21:12:58 +0000 differ
=== added file 'windows/appinfo.ini.default'
--- windows/appinfo.ini.default	1970-01-01 00:00:00 +0000
+++ windows/appinfo.ini.default	2016-01-03 21:12:58 +0000
@@ -0,0 +1,32 @@
+[Format]
+Type=PortableApps.comFormat
+Version=3.0
+
+[Details]
+Name=OpenLP Portable
+AppID=OpenLPPortable
+Publisher=OpenLP.org
+Homepage=openlp.org
+Category=Utilities
+Description=Lyrics Projection
+Language=Multilingual
+
+[License]
+Shareable=true
+OpenSource=true
+Freeware=true
+CommercialUse=true
+
+[Version]
+DisplayVersion=%(display_version)s
+PackageVersion=%(package_version)s
+
+[Control]
+Icons=1
+Start=OpenLPPortable.exe
+
+[Associations]
+FileType=osz
+
+[FileTypeIcons]
+osz=app

=== added file 'windows/config.ini.default'
--- windows/config.ini.default	1970-01-01 00:00:00 +0000
+++ windows/config.ini.default	2016-01-03 21:12:58 +0000
@@ -0,0 +1,22 @@
+[executables]
+innosetup = %(progfiles)s\Inno Setup 5\ISCC.exe
+sphinx = %(pyroot)s\Scripts\sphinx-build.exe
+pyinstaller = %(here)s\..\pyinstaller\pyinstaller.py
+vcbuild = %(progfiles)s\Microsoft Visual Studio 9.0\VC\vcpackages\vcbuild.exe
+htmlhelp = %(progfiles)s\HTML Help Workshop\hhc.exe
+psvince = %(here)s\psvince.dll
+lrelease = %(sitepackages)s\PyQt5\bin\lrelease.exe
+portablelauncher = %(progfiles)s\PortableApps.comLauncher\PortableApps.comLauncherGenerator.exe
+portableinstaller = %(progfiles)s\PortableApps.comInstaller\PortableApps.comInstaller.exe
+mudrawbin = %(here)s\..\mupdf-1.8-windows\mudraw.exe
+
+[paths]
+branch = %(projects)s\trunk
+documentation = %(projects)s\documentation
+win32icon = %(here)s\OpenLP.ico
+hooks = %(here)s\..\pyinstaller-hooks
+portable = %(projects)s\OpenLPPortable
+
+[transifex]
+username =
+password =

=== added file 'windows/openlp.conf'
--- windows/openlp.conf	1970-01-01 00:00:00 +0000
+++ windows/openlp.conf	2016-01-03 21:12:58 +0000
@@ -0,0 +1,26 @@
+[bibles]
+status = 1
+
+[media]
+status = 1
+
+[alerts]
+status = 1
+
+[presentations]
+status = 1
+
+[custom]
+status = 1
+
+[remotes]
+status = 0
+
+[images]
+status = 1
+
+[songusage]
+status = 1
+
+[songs]
+status = 1

=== added file 'windows/psvince.dll'
Binary files windows/psvince.dll	1970-01-01 00:00:00 +0000 and windows/psvince.dll	2016-01-03 21:12:58 +0000 differ
=== added file 'windows/windows-builder.py'
--- windows/windows-builder.py	1970-01-01 00:00:00 +0000
+++ windows/windows-builder.py	2016-01-03 21:12:58 +0000
@@ -0,0 +1,649 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2015 OpenLP Developers                                   #
+# --------------------------------------------------------------------------- #
+# This program is free software; you can redistribute it and/or modify it     #
+# under the terms of the GNU General Public License as published by the Free  #
+# Software Foundation; version 2 of the License.                              #
+#                                                                             #
+# This program is distributed in the hope that it will be useful, but WITHOUT #
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
+# more details.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+
+"""
+Windows Build Script
+--------------------
+
+This script is used to build the Windows binary and the accompanying installer.
+For this script to work out of the box, it depends on a number of things:
+
+Python 3.4
+
+PyQt5
+    You should already have this installed, OpenLP doesn't work without it. The
+    version the script expects is the packaged one available from River Bank
+    Computing.
+
+PyEnchant
+    This script expects the precompiled, installable version of PyEnchant to be
+    installed. You can find this on the PyEnchant site.
+
+Inno Setup 5
+    Inno Setup should be installed into "C:\%PROGRAMFILES%\Inno Setup 5"
+
+Sphinx
+    This is used to build the documentation.  The documentation trunk must be at
+    the same directory level as OpenLP trunk and named "documentation".
+
+HTML Help Workshop
+    This is used to create the help file.
+
+PyInstaller
+    PyInstaller should be a git clone of either
+    https://github.com/matysek/pyinstaller branch python3 or
+    https://github.com/pyinstaller/pyinstaller branch python3
+
+Bazaar
+    You need the command line "bzr" client installed.
+
+OpenLP
+    A checkout of the latest code, in a branch directory, which is in a Bazaar
+    shared repository directory. This means your code should be in a directory
+    structure like this: "openlp\branch-name".
+
+Visual C++ 2008 Express Edition
+    This is to build pptviewlib.dll, the library for controlling the
+    PowerPointViewer.
+
+windows-builder.py
+    This script, of course. It should be in the "windows-installer" directory
+    at the same level as OpenLP trunk.
+
+psvince.dll
+    This dll is used during the actual install of OpenLP to check if OpenLP is
+    running on the users machine prior to the setup.  If OpenLP is running,
+    the install will fail.  The dll can be obtained from here:
+
+        http://www.vincenzo.net/isxkb/index.php?title=PSVince)
+
+    The dll is presently included with this script.
+
+Mako
+    Mako Templates for Python.  This package is required for building the
+    remote plugin.  It can be installed by going to your
+    python_directory\scripts\.. and running "easy_install Mako".  If you do not
+    have easy_install, the Mako package can be obtained here:
+
+        http://www.makotemplates.org/download.html
+
+SQLAlchemy Migrate
+    Required for the databases used in OpenLP.  The package can be
+    obtained here:
+
+        http://code.google.com/p/sqlalchemy-migrate/
+
+MuPDF
+    Required for PDF support in OpenLP. Download the windows build from
+    mupdf.com, extract it, and set the mudrawbin option in the config file to
+    point to mudraw.exe
+
+Portable App Builds
+    The following are required if you are planning to make a portable build of
+    OpenLP.  The portable build conforms to the standards published by
+    PortableApps.com:
+
+        http://portableapps.com/development/portableapps.com_format
+
+    PortableApps.com Installer:
+
+        http://portableapps.com/apps/development/portableapps.com_installer
+
+    PortableApps.com Launcher:
+
+        http://portableapps.com/apps/development/portableapps.com_launcher
+
+    NSIS Portable (Unicode version):
+
+        http://portableapps.com/apps/development/nsis_portable
+"""
+
+import os
+import sys
+from shutil import copy, rmtree, move
+from distutils import dir_util
+from subprocess import Popen, PIPE
+from configparser import ConfigParser
+from argparse import ArgumentParser
+
+
+class WindowsBuilder(object):
+    """
+    The :class:`WindowsBuilder` class encapsulates everything that is needed
+    to build a Windows installer.
+    """
+
+    def __init__(self):
+        self.setup_args()
+        self.setup_system_paths()
+        self.read_config()
+        self.setup_executables()
+        self.setup_paths()
+        self.version = ''
+
+    def _print(self, text, *args):
+        """
+        Print stuff out. Later we might want to use a log file.
+        """
+        if len(args) > 0:
+            text = text % tuple(args)
+        print(text)
+
+    def _print_verbose(self, text, *args):
+        """
+        Print output, obeying "verbose" mode.
+        """
+        if self.args.verbose:
+            self._print(text, *args)
+
+    def setup_args(self):
+        """
+        Set up an argument parser and parse the command line arguments.
+        """
+        parser = ArgumentParser()
+        parser.add_argument('-b', '--branch', metavar='BRANCH', dest='branch',
+                            help='Specify the path to the branch you wish to build.', default=None)
+        parser.add_argument('-d', '--documentation', metavar='DOCS', dest='docs', default=None,
+                            help='Specify the path to the documentation branch.')
+        parser.add_argument('-c', '--config', metavar='CONFIG', dest='config',
+                            help='Specify the path to the configuration file.',
+                            default=os.path.abspath(os.path.join('.', 'config.ini')))
+        parser.add_argument('-u', '--skip-update', dest='skip_update', action='store_true', default=False,
+                            help='Do NOT update the branch before building.')
+        parser.add_argument('-p', '--portable', metavar='PORTABLE', dest='portable', default=None,
+                            help='Specify the path to build the portable installation.')
+        parser.add_argument('-t', '--skip-translations', dest='skip_translations', action='store_true', default=False,
+                            help='Do NOT update the language translation files.')
+        parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', default=False,
+                            help='Print out additional information.')
+        self.args = parser.parse_args()
+
+    def read_config(self):
+        """
+        Read the configuration from the configuration file.
+        """
+        self.config = ConfigParser(defaults={
+            'pyroot': self.python_root,
+            'progfiles': self.program_files,
+            'sitepackages': self.site_packages,
+            'here': self.script_path,
+            'projects': os.path.abspath(os.path.join(self.script_path, '..', '..')),
+        })
+        self.config.read(os.path.abspath(self.args.config))
+
+    def setup_system_paths(self):
+        """
+        Set up some system paths.
+        """
+        self.script_path = os.path.dirname(os.path.abspath(__file__))
+        self.python = sys.executable
+        self.python_root = os.path.dirname(self.python)
+        self.site_packages = os.path.join(self.python_root, 'Lib', 'site-packages')
+        self.program_files = os.getenv('PROGRAMFILES')
+
+    def setup_executables(self):
+        """
+        Set up the paths to the executables we use.
+        """
+        self.innosetup = os.path.abspath(self.config.get('executables', 'innosetup'))
+        self.sphinx = os.path.abspath(self.config.get('executables', 'sphinx'))
+        self.pyinstaller = os.path.abspath(self.config.get('executables', 'pyinstaller'))
+        self.vcbuild = os.path.abspath(self.config.get('executables', 'vcbuild'))
+        self.hhc = os.path.abspath(self.config.get('executables', 'htmlhelp'))
+        self.psvince = os.path.abspath(self.config.get('executables', 'psvince'))
+        self.portableinstaller = os.path.abspath(self.config.get('executables', 'portableinstaller'))
+        self.portablelauncher = os.path.abspath(self.config.get('executables', 'portablelauncher'))
+        self.mudraw_bin = os.path.abspath(self.config.get('executables', 'mudrawbin'))
+        if os.path.exists(os.path.join(self.site_packages, 'PyQt5', 'bin')):
+            # Older versions of the PyQt5 Windows installer put their binaries
+            # in the "bin" directory
+            self.lrelease = os.path.join(self.site_packages, 'PyQt5', 'bin', 'lrelease.exe')
+        else:
+            # Newer versions of the PyQt5 Windows installer put their binaries
+            # in the base directory of the installation
+            self.lrelease = os.path.join(self.site_packages, 'PyQt5', 'lrelease.exe')
+
+    def setup_paths(self):
+        """
+        Set up a variety of paths that we use throughout the build process.
+        """
+        if self.args.branch:
+            branch_path = self.args.branch
+        else:
+            branch_path = self.config.get('paths', 'branch')
+        self.branch_path = os.path.abspath(branch_path)
+        if self.args.docs:
+            docs_path = self.args.docs
+        else:
+            docs_path = self.config.get('paths', 'documentation')
+        self.docs_path = os.path.abspath(docs_path)
+        if self.args.portable:
+            portable_path = self.args.portable
+        else:
+            try:
+                portable_path = self.config.get('paths', 'portable')
+            except:
+                portable_path = ''
+        if portable_path:
+            self.portable_path = os.path.abspath(portable_path)
+            self.args.portable = self.portable_path
+        else:
+            self.portable_path = ''
+        self.openlp_script = os.path.abspath(os.path.join(branch_path, 'openlp.py'))
+        self.hooks_path = os.path.abspath(self.config.get('paths', 'hooks'))
+        self.win32_icon = os.path.abspath(self.config.get('paths', 'win32icon'))
+        self.i18n_utils = os.path.join(self.branch_path, 'scripts', 'translation_utils.py')
+        self.source_path = os.path.join(self.branch_path, 'openlp')
+        self.manual_path = os.path.join(self.docs_path, 'manual')
+        self.manual_build_path = os.path.join(self.manual_path, 'build')
+        self.helpfile_path = os.path.join(self.manual_build_path, 'htmlhelp')
+        self.i18n_path = os.path.join(self.branch_path, 'resources', 'i18n')
+        self.winres_path = os.path.join(self.branch_path, 'resources', 'windows')
+        self.build_path = os.path.join(self.branch_path, 'build')
+        self.dist_path = os.path.join(self.branch_path, 'dist', 'OpenLP')
+        self.dist_path_pyinst_arg = os.path.join(self.branch_path, 'dist')
+        self.pptviewlib_path = os.path.join(self.source_path, 'plugins', 'presentations', 'lib', 'pptviewlib')
+
+    def update_code(self):
+        """
+        Update the code in the branch.
+        """
+        os.chdir(self.branch_path)
+        self._print('Reverting any changes to the code...')
+        bzr = Popen(('bzr', 'revert'), stdout=PIPE)
+        output = bzr.communicate()[0]
+        code = bzr.wait()
+        if code != 0:
+            self._print(output)
+            raise Exception('Error reverting the code')
+        self._print('Updating the code...')
+        bzr = Popen(('bzr', 'update'), stdout=PIPE)
+        output = bzr.communicate()[0]
+        code = bzr.wait()
+        if code != 0:
+            self._print(output)
+            raise Exception('Error updating the code')
+
+    def run_pyinstaller(self):
+        """
+        Run PyInstaller on the branch to build an executable.
+        """
+        self._print('Running PyInstaller...')
+        os.chdir(self.branch_path)
+        cmd = [self.python,
+               self.pyinstaller,
+               '--clean',
+               '--noconfirm',
+               '--windowed',
+               '--noupx',
+               '--additional-hooks-dir', self.hooks_path,
+               '--distpath', self.dist_path_pyinst_arg,
+               '-i', self.win32_icon,
+               '-p', self.branch_path,
+               '-n', 'OpenLP',
+               self.openlp_script]
+        if not self.args.verbose:
+            cmd.append('--log-level=ERROR')
+        else:
+            cmd.append('--log-level=DEBUG')
+        pyinstaller = Popen(cmd)
+        code = pyinstaller.wait()
+        if code != 0:
+            raise Exception('Error running PyInstaller')
+
+    def write_version_file(self):
+        """
+        Write the version number to a file for reading once installed.
+        """
+        self._print('Writing version file...')
+        os.chdir(self.branch_path)
+        bzr = Popen(('bzr', 'tags'), stdout=PIPE)
+        output = bzr.communicate()[0]
+        code = bzr.wait()
+        if code != 0:
+            raise Exception('Error running bzr tags')
+        lines = output.splitlines()
+        if len(lines) == 0:
+            tag = '0.0.0'
+            revision = '0'
+        else:
+            tag, revision = lines[-1].decode('utf-8').split()
+        bzr = Popen(('bzr', 'log', '--line', '-r', '-1'), stdout=PIPE)
+        output, error = bzr.communicate()
+        code = bzr.wait()
+        if code != 0:
+            raise Exception('Error running bzr log')
+        latest = output.decode('utf-8').split(':')[0]
+        version_string = latest == revision and tag or '%s-bzr%s' % (tag, latest)
+        # Save decimal version in case we need to do a portable build.
+        self.version = latest == revision and tag or '%s.%s' % (tag, latest)
+        version_file = open(os.path.join(self.dist_path, '.version'), 'w')
+        version_file.write(str(version_string))
+        version_file.close()
+
+    def copy_default_theme(self):
+        """
+        Copy the default theme to the correct directory for OpenLP.
+        """
+        self._print('Copying default theme...')
+        source = os.path.join(self.source_path, 'core', 'lib', 'json')
+        dest = os.path.join(self.dist_path, 'core', 'lib', 'json')
+        for root, dirs, files in os.walk(source):
+            for filename in files:
+                if filename.endswith('.json'):
+                    dest_path = os.path.join(dest, root[len(source) + 1:])
+                    if not os.path.exists(dest_path):
+                        os.makedirs(dest_path)
+                    self._print_verbose('... %s', filename)
+                    copy(os.path.join(root, filename), os.path.join(dest_path, filename))
+
+    def copy_plugins(self):
+        """
+        Copy all the plugins to the correct directory so that OpenLP sees that
+        it has plugins.
+        """
+        self._print('Copying plugins...')
+        source = os.path.join(self.source_path, 'plugins')
+        dest = os.path.join(self.dist_path, 'plugins')
+        for root, dirs, files in os.walk(source):
+            for filename in files:
+                if not filename.endswith('.pyc'):
+                    dest_path = os.path.join(dest, root[len(source) + 1:])
+                    if not os.path.exists(dest_path):
+                        os.makedirs(dest_path)
+                    self._print_verbose('... %s', filename)
+                    copy(os.path.join(root, filename), os.path.join(dest_path, filename))
+
+    def copy_media_player(self):
+        """
+        Copy the media players to the correct directory for OpenLP.
+        """
+        self._print('Copying media player...')
+        source = os.path.join(self.source_path, 'core', 'ui', 'media')
+        dest = os.path.join(self.dist_path, 'core', 'ui', 'media')
+        for root, dirs, files in os.walk(source):
+            for filename in files:
+                if not filename.endswith('.pyc'):
+                    dest_path = os.path.join(dest, root[len(source) + 1:])
+                    if not os.path.exists(dest_path):
+                        os.makedirs(dest_path)
+                    self._print_verbose('... %s', filename)
+                    copy(os.path.join(root, filename), os.path.join(dest_path, filename))
+
+    def copy_windows_files(self):
+        """
+        Copy all the Windows-specific files.
+        """
+        self._print('Copying extra files for Windows...')
+        self._print_verbose('... OpenLP.ico')
+        copy(os.path.join(self.script_path, 'OpenLP.ico'), os.path.join(self.dist_path, 'OpenLP.ico'))
+        self._print_verbose('... LICENSE.txt')
+        copy(os.path.join(self.script_path, 'LICENSE.txt'), os.path.join(self.dist_path, 'LICENSE.txt'))
+        self._print_verbose('... psvince.dll')
+        copy(self.psvince, os.path.join(self.dist_path, 'psvince.dll'))
+        if os.path.isfile(os.path.join(self.helpfile_path, 'OpenLP.chm')):
+            self._print_verbose('... OpenLP.chm')
+            copy(os.path.join(self.helpfile_path, 'OpenLP.chm'), os.path.join(self.dist_path, 'OpenLP.chm'))
+        else:
+            self._print('... WARNING: Windows help file not found')
+        self._print_verbose('... mudraw.exe')
+        if self.mudraw_bin and os.path.isfile(self.mudraw_bin):
+            copy(os.path.join(self.mudraw_bin), os.path.join(self.dist_path, 'mudraw.exe'))
+        else:
+            self._print('... WARNING: mudraw.exe not found')
+
+    def update_translations(self):
+        """
+        Update the translations.
+        """
+        self._print('Updating translations...')
+        if not self.config.has_section('transifex'):
+            raise Exception('No section named "transifex" found.')
+        if not self.config.has_option('transifex', 'username'):
+            raise Exception('No option named "username" found.')
+        if not self.config.has_option('transifex', 'password'):
+            raise Exception('No option named "password" found.')
+        username = self.config.get('transifex', 'username')
+        password = self.config.get('transifex', 'password')
+        os.chdir(os.path.dirname(self.i18n_utils))
+        translation_utils = Popen([self.python, self.i18n_utils, '-qdpu', '-U', username, '-P', password])
+        code = translation_utils.wait()
+        if code != 0:
+            raise Exception('Error running translation_utils.py')
+
+    def compile_translations(self):
+        """
+        Compile the translations for Qt.
+        """
+        self._print('Compiling translations...')
+        files = os.listdir(self.i18n_path)
+        if not os.path.exists(os.path.join(self.dist_path, 'i18n')):
+            os.makedirs(os.path.join(self.dist_path, 'i18n'))
+        for file in files:
+            if file.endswith('.ts'):
+                self._print_verbose('... %s', file)
+                source_path = os.path.join(self.i18n_path, file)
+                dest_path = os.path.join(self.dist_path, 'i18n', file.replace('.ts', '.qm'))
+                lconvert = Popen((self.lrelease, '-compress', '-silent', source_path, '-qm', dest_path))
+                code = lconvert.wait()
+                if code != 0:
+                    raise Exception('Error running lconvert on %s' % source_path)
+        self._print('Copying qm files...')
+        source = os.path.join(self.site_packages, 'PyQt5', 'translations')
+        files = os.listdir(source)
+        for filename in files:
+            if filename.startswith('qt_') and filename.endswith('.qm') and len(filename) == 8:
+                self._print_verbose('... %s', filename)
+                copy(os.path.join(source, filename), os.path.join(self.dist_path, 'i18n', filename))
+
+    def run_sphinx(self):
+        """
+        Run Sphinx to build an HTML Help project.
+        """
+        self._print('Deleting previous help manual build... %s', self.manual_build_path)
+        if os.path.exists(self.manual_build_path):
+            rmtree(self.manual_build_path)
+        self._print('Running Sphinx...')
+        os.chdir(self.manual_path)
+        sphinx = Popen((self.sphinx, '-b', 'htmlhelp', '-d', 'build/doctrees', 'source', 'build/htmlhelp'), stdout=PIPE)
+        output, error = sphinx.communicate()
+        code = sphinx.wait()
+        if code != 0:
+            self._print(output)
+            raise Exception('Error running Sphinx')
+
+    def run_htmlhelp(self):
+        """
+        Run HTML Help Workshop to convert the Sphinx output into a manual.
+        """
+        self._print('Running HTML Help Workshop...')
+        os.chdir(os.path.join(self.manual_build_path, 'htmlhelp'))
+        hhc = Popen((self.hhc, 'OpenLP.chm'), stdout=PIPE)
+        output, error = hhc.communicate()
+        code = hhc.wait()
+        if code != 1:
+            self._print('Exit code:', code)
+            self._print(output)
+            raise Exception('Error running HTML Help Workshop')
+
+    def create_innosetup_file(self):
+        """
+        Create an InnoSetup file pointing to the branch being built.
+        """
+        self._print('Creating Inno Setup file...')
+        input = open(os.path.join(self.script_path, 'OpenLP.iss.default'), 'r').read()
+        output = input.replace('%(branch)s', self.branch_path)
+        output = output.replace('%(display_version)s', self.version)
+        outfile = open(os.path.join(self.script_path, 'OpenLP.iss'), 'w')
+        outfile.write(output)
+        outfile.close()
+
+    def check_portableapp_directory(self):
+        """
+        Checks the PortableApp directory structure amd creates
+        missing subdirs
+        """
+        self._print('  Checking PortableApps directory structure...')
+        launcher_path = os.path.join(self.portable_path, 'App', 'Appinfo', 'Launcher')
+        if not os.path.exists(launcher_path):
+            os.makedirs(launcher_path)
+        settings_path = os.path.join(self.portable_path, 'Data', 'Settings')
+        if not os.path.exists(settings_path):
+            os.makedirs(settings_path)
+
+    def create_portableapps_appinfo_file(self):
+        """
+        Create a Portabbleapps appinfo.ini file.
+        """
+        self._print('  Creating PortableApps appinfo file ...')
+        portable_version = self.version + '.0' * (3 - self.version.count('.'))
+        input = open(os.path.join(self.script_path, 'appinfo.ini.default'), 'r').read()
+        output = input.replace('%(display_version)s', self.version)
+        output = output.replace('%(package_version)s', portable_version)
+        outfile = open(os.path.join(self.portable_path, 'App', 'Appinfo', 'appinfo.ini'), 'w')
+        outfile.write(output)
+        outfile.close()
+
+    def run_innosetup(self):
+        """
+        Run InnoSetup to create an installer.
+        """
+        self._print('Running Inno Setup...')
+        os.chdir(self.script_path)
+        innosetup = Popen((self.innosetup, os.path.join(self.script_path, 'OpenLP.iss'), '/q'))
+        code = innosetup.wait()
+        if code != 0:
+            raise Exception('Error running Inno Setup')
+
+    def run_portableapp_builder(self):
+        """
+        Creates a portable installer.
+        1  Copies the distribution to the portable apps directory
+        2  Builds the PortableApps Launcher
+        3  Builds the PortableApps Install
+        """
+        self._print('Running PortableApps Builder...')
+        self._print('  Clearing old files')
+        # Remove previous contents of portableapp build directory.
+        if os.path.exists(self.portable_path):
+            rmtree(self.portable_path)
+        self._print('  Creating PortableApps build directory')
+        # Copy the contents of the OpenLPPortable directory to the portable
+        # build directory.
+        dir_util.copy_tree(os.path.join(self.script_path, 'OpenLPPortable'), self.portable_path)
+        self.check_portableapp_directory()
+        self.create_portableapps_appinfo_file()
+        # Copy distribution files to portableapp build directory.
+        self._print('  Copying distribution files')
+        portable_app_path = os.path.join(self.portable_path, 'App', 'OpenLP')
+        dir_util.copy_tree(self.dist_path, portable_app_path)
+        # Copy help files to portableapp build directory.
+        if os.path.isfile(os.path.join(self.helpfile_path, 'OpenLP.chm')):
+            self._print('  Copying help files')
+            dir_util.copy_tree(self.helpfile_path, os.path.join(portable_app_path, 'help'))
+        else:
+            self._print('... WARNING: Windows help file not found')
+        # Build the launcher.
+        self._print('  Building PortableApps Launcher')
+        portableapps = Popen((self.portablelauncher, self.portable_path), stdout=PIPE)
+        code = portableapps.wait()
+        if code != 0:
+            raise Exception('Error creating PortableAppa Launcher')
+        # Build the portable installer.
+        self._print('  Building PortableApps Installer')
+        portableapps = Popen((self.portableinstaller, self.portable_path), stdout=PIPE)
+        code = portableapps.wait()
+        if code != 0:
+            raise Exception('Error running PortableApps Installer')
+        portable_app = os.path.abspath(os.path.join(self.portable_path, '..',
+                                                    'OpenLPPortable_%s.paf.exe' % self.version))
+        if os.path.exists(portable_app):
+            move(portable_app, os.path.abspath(os.path.join(self.dist_path, '..')))
+            self._print('  PortableApp build complete')
+        else:
+            raise Exception('PortableApp failed to build')
+
+    def build_pptviewlib(self):
+        """
+        Build the PowerPoint Viewer DLL using Visual Studio.
+        """
+        self._print('Building PPTVIEWLIB.DLL...')
+        if not os.path.exists(self.vcbuild):
+            self._print('... WARNING: vcbuild.exe was not found, skipping building pptviewlib.dll')
+            return
+        vcbuild = Popen((self.vcbuild, '/rebuild', os.path.join(self.pptviewlib_path, 'pptviewlib.vcproj'),
+                         'Release|Win32'))
+        code = vcbuild.wait()
+        if code != 0:
+            raise Exception('Error building pptviewlib.dll')
+        copy(os.path.join(self.pptviewlib_path, 'Release', 'pptviewlib.dll'), self.pptviewlib_path)
+
+    def main(self):
+        """
+        The main function to run the Windows builder.
+        """
+        self._print_verbose('OpenLP main script: ......%s', self.openlp_script)
+        self._print_verbose('Script path: .............%s', os.path.dirname(os.path.abspath(__file__)))
+        self._print_verbose('Branch path: .............%s', self.branch_path)
+        self._print_verbose('Source path: .............%s', self.source_path)
+        self._print_verbose('Dist path: ...............%s', self.dist_path)
+        self._print_verbose('Portable path: ...........%s', self.portable_path)
+        self._print_verbose('PyInstaller: .............%s', self.pyinstaller)
+        self._print_verbose('Documentation branch path:%s', self.docs_path)
+        self._print_verbose('Help file build path: ....%s', self.helpfile_path)
+        self._print_verbose('Inno Setup path: .........%s', self.innosetup)
+        self._print_verbose('PortableApp Launcher......%s', self.portablelauncher)
+        self._print_verbose('PortableApp Installer.....%s', self.portableinstaller)
+        self._print_verbose('Windows resources: .......%s', self.winres_path)
+        self._print_verbose('VCBuild path: ............%s', self.vcbuild)
+        self._print_verbose('PPTVIEWLIB path: .........%s', self.pptviewlib_path)
+        self._print_verbose('Mudraw binary ............%s', self.mudraw_bin)
+        self._print_verbose('')
+        if not self.args.skip_update:
+            self.update_code()
+        self.build_pptviewlib()
+        self.run_pyinstaller()
+        self.write_version_file()
+        self.copy_default_theme()
+        self.copy_plugins()
+        self.copy_media_player()
+        if os.path.exists(self.manual_path):
+            self.run_sphinx()
+            self.run_htmlhelp()
+        else:
+            self._print('')
+            self._print('WARNING: Documentation trunk not found. Windows')
+            self._print('         Help file will not be included in build')
+            self._print('')
+        self.copy_windows_files()
+        if not self.args.skip_translations:
+            self.update_translations()
+        self.compile_translations()
+        self.create_innosetup_file()
+        self.run_innosetup()
+        if self.args.portable:
+            self.run_portableapp_builder()
+        self._print('Done.')
+
+
+if __name__ == '__main__':
+    WindowsBuilder().main()


Follow ups