gnome-packagekit r433 - in trunk: data/icons/16x16/animations data/icons/22x22/animations data/icons/24x24/animations data/icons/48x48/animations docs help/C/figures po python python/packagekit src



Author: rhughes
Date: Fri Nov 21 11:13:32 2008
New Revision: 433
URL: http://svn.gnome.org/viewvc/gnome-packagekit?rev=433&view=rev

Log:
add missing files

Added:
   trunk/data/icons/16x16/animations/
   trunk/data/icons/16x16/animations/Makefile.am
   trunk/data/icons/16x16/animations/pk-action-cleanup.png   (contents, props changed)
   trunk/data/icons/16x16/animations/pk-action-download.png   (contents, props changed)
   trunk/data/icons/16x16/animations/pk-action-installing.png   (contents, props changed)
   trunk/data/icons/16x16/animations/pk-action-refresh-cache.png   (contents, props changed)
   trunk/data/icons/16x16/animations/pk-action-removing.png   (contents, props changed)
   trunk/data/icons/16x16/animations/pk-action-searching.png   (contents, props changed)
   trunk/data/icons/16x16/animations/pk-action-testing.png   (contents, props changed)
   trunk/data/icons/16x16/animations/pk-action-waiting.png   (contents, props changed)
   trunk/data/icons/22x22/animations/
   trunk/data/icons/22x22/animations/Makefile.am
   trunk/data/icons/22x22/animations/pk-action-cleanup.png   (contents, props changed)
   trunk/data/icons/22x22/animations/pk-action-download.png   (contents, props changed)
   trunk/data/icons/22x22/animations/pk-action-installing.png   (contents, props changed)
   trunk/data/icons/22x22/animations/pk-action-refresh-cache.png   (contents, props changed)
   trunk/data/icons/22x22/animations/pk-action-removing.png   (contents, props changed)
   trunk/data/icons/22x22/animations/pk-action-searching.png   (contents, props changed)
   trunk/data/icons/22x22/animations/pk-action-testing.png   (contents, props changed)
   trunk/data/icons/22x22/animations/pk-action-waiting.png   (contents, props changed)
   trunk/data/icons/24x24/animations/
   trunk/data/icons/24x24/animations/Makefile.am
   trunk/data/icons/24x24/animations/pk-action-cleanup.png   (contents, props changed)
   trunk/data/icons/24x24/animations/pk-action-download.png   (contents, props changed)
   trunk/data/icons/24x24/animations/pk-action-installing.png   (contents, props changed)
   trunk/data/icons/24x24/animations/pk-action-refresh-cache.png   (contents, props changed)
   trunk/data/icons/24x24/animations/pk-action-removing.png   (contents, props changed)
   trunk/data/icons/24x24/animations/pk-action-searching.png   (contents, props changed)
   trunk/data/icons/24x24/animations/pk-action-testing.png   (contents, props changed)
   trunk/data/icons/24x24/animations/pk-action-waiting.png   (contents, props changed)
   trunk/data/icons/48x48/animations/
   trunk/data/icons/48x48/animations/Makefile.am
   trunk/data/icons/48x48/animations/pk-action-cleanup.png   (contents, props changed)
   trunk/data/icons/48x48/animations/pk-action-download.png   (contents, props changed)
   trunk/data/icons/48x48/animations/pk-action-installing.png   (contents, props changed)
   trunk/data/icons/48x48/animations/pk-action-refresh-cache.png   (contents, props changed)
   trunk/data/icons/48x48/animations/pk-action-removing.png   (contents, props changed)
   trunk/data/icons/48x48/animations/pk-action-searching.png   (contents, props changed)
   trunk/data/icons/48x48/animations/pk-action-testing.png   (contents, props changed)
   trunk/data/icons/48x48/animations/pk-action-waiting.png   (contents, props changed)
   trunk/docs/
   trunk/docs/.gitignore
   trunk/docs/Makefile.am
   trunk/docs/pk-test-install.py   (contents, props changed)
   trunk/help/C/figures/gpk-log.png   (contents, props changed)
   trunk/help/C/figures/gpk-service-pack-example.png   (contents, props changed)
   trunk/help/C/figures/gpk-service-pack-example.svg
   trunk/help/C/figures/gpk-service-pack.png   (contents, props changed)
   trunk/python/
   trunk/python/Makefile.am
   trunk/python/enum-convertor.py
   trunk/python/packagekit/
   trunk/python/packagekit/Makefile.am
   trunk/python/packagekit/gtkwidgets.py
Removed:
   trunk/po/Makefile.in.in
   trunk/src/gpk-interface.xml
Modified:
   trunk/po/POTFILES.in
   trunk/po/POTFILES.skip

Added: trunk/data/icons/16x16/animations/Makefile.am
==============================================================================
--- (empty file)
+++ trunk/data/icons/16x16/animations/Makefile.am	Fri Nov 21 11:13:32 2008
@@ -0,0 +1,21 @@
+themedir = $(pkgdatadir)/icons/hicolor
+size = 16x16
+context = animations
+
+iconsdir = $(themedir)/$(size)/$(context)
+
+icons_DATA = 				\
+	pk-action-cleanup.png		\
+	pk-action-removing.png		\
+	pk-action-testing.png		\
+	pk-action-download.png		\
+	pk-action-refresh-cache.png	\
+	pk-action-searching.png		\
+	pk-action-installing.png	\
+	pk-action-waiting.png
+
+noinst_DATA =
+
+EXTRA_DIST =				\
+	$(icons_DATA)			\
+	$(noinst_DATA)

Added: trunk/data/icons/16x16/animations/pk-action-cleanup.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/16x16/animations/pk-action-download.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/16x16/animations/pk-action-installing.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/16x16/animations/pk-action-refresh-cache.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/16x16/animations/pk-action-removing.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/16x16/animations/pk-action-searching.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/16x16/animations/pk-action-testing.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/16x16/animations/pk-action-waiting.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/22x22/animations/Makefile.am
==============================================================================
--- (empty file)
+++ trunk/data/icons/22x22/animations/Makefile.am	Fri Nov 21 11:13:32 2008
@@ -0,0 +1,21 @@
+themedir = $(pkgdatadir)/icons/hicolor
+size = 22x22
+context = animations
+
+iconsdir = $(themedir)/$(size)/$(context)
+
+icons_DATA = 				\
+	pk-action-cleanup.png		\
+	pk-action-removing.png		\
+	pk-action-testing.png		\
+	pk-action-download.png		\
+	pk-action-refresh-cache.png	\
+	pk-action-searching.png		\
+	pk-action-installing.png	\
+	pk-action-waiting.png
+
+noinst_DATA =
+
+EXTRA_DIST =				\
+	$(icons_DATA)			\
+	$(noinst_DATA)

Added: trunk/data/icons/22x22/animations/pk-action-cleanup.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/22x22/animations/pk-action-download.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/22x22/animations/pk-action-installing.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/22x22/animations/pk-action-refresh-cache.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/22x22/animations/pk-action-removing.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/22x22/animations/pk-action-searching.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/22x22/animations/pk-action-testing.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/22x22/animations/pk-action-waiting.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/24x24/animations/Makefile.am
==============================================================================
--- (empty file)
+++ trunk/data/icons/24x24/animations/Makefile.am	Fri Nov 21 11:13:32 2008
@@ -0,0 +1,21 @@
+themedir = $(pkgdatadir)/icons/hicolor
+size = 24x24
+context = animations
+
+iconsdir = $(themedir)/$(size)/$(context)
+
+icons_DATA = 				\
+	pk-action-cleanup.png		\
+	pk-action-removing.png		\
+	pk-action-testing.png		\
+	pk-action-download.png		\
+	pk-action-refresh-cache.png	\
+	pk-action-searching.png		\
+	pk-action-installing.png	\
+	pk-action-waiting.png
+
+noinst_DATA =
+
+EXTRA_DIST =				\
+	$(icons_DATA)			\
+	$(noinst_DATA)

Added: trunk/data/icons/24x24/animations/pk-action-cleanup.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/24x24/animations/pk-action-download.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/24x24/animations/pk-action-installing.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/24x24/animations/pk-action-refresh-cache.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/24x24/animations/pk-action-removing.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/24x24/animations/pk-action-searching.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/24x24/animations/pk-action-testing.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/24x24/animations/pk-action-waiting.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/48x48/animations/Makefile.am
==============================================================================
--- (empty file)
+++ trunk/data/icons/48x48/animations/Makefile.am	Fri Nov 21 11:13:32 2008
@@ -0,0 +1,22 @@
+themedir = $(pkgdatadir)/icons/hicolor
+size = 48x48
+context = animations
+
+iconsdir = $(themedir)/$(size)/$(context)
+
+icons_DATA = 				\
+	pk-action-cleanup.png		\
+	pk-action-removing.png		\
+	pk-action-testing.png		\
+	pk-action-download.png		\
+	pk-action-refresh-cache.png	\
+	pk-action-searching.png		\
+	pk-action-installing.png	\
+	pk-action-waiting.png
+
+noinst_DATA =
+
+EXTRA_DIST =				\
+	$(icons_DATA)			\
+	$(noinst_DATA)
+

Added: trunk/data/icons/48x48/animations/pk-action-cleanup.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/48x48/animations/pk-action-download.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/48x48/animations/pk-action-installing.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/48x48/animations/pk-action-refresh-cache.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/48x48/animations/pk-action-removing.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/48x48/animations/pk-action-searching.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/48x48/animations/pk-action-testing.png
==============================================================================
Binary file. No diff available.

Added: trunk/data/icons/48x48/animations/pk-action-waiting.png
==============================================================================
Binary file. No diff available.

Added: trunk/docs/.gitignore
==============================================================================
--- (empty file)
+++ trunk/docs/.gitignore	Fri Nov 21 11:13:32 2008
@@ -0,0 +1,3 @@
+Makefile.in
+Makefile
+

Added: trunk/docs/Makefile.am
==============================================================================
--- (empty file)
+++ trunk/docs/Makefile.am	Fri Nov 21 11:13:32 2008
@@ -0,0 +1 @@
+

Added: trunk/docs/pk-test-install.py
==============================================================================
--- (empty file)
+++ trunk/docs/pk-test-install.py	Fri Nov 21 11:13:32 2008
@@ -0,0 +1,112 @@
+#!/usr/bin/python
+# Licensed under the GNU General Public License Version 2
+#
+# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+import os
+import dbus
+import pygtk
+pygtk.require('2.0')
+import gtk
+
+class SessionInstall:
+
+    def install_codec(self, widget, data=None):
+        xid = widget.window.xid
+        timespec = gtk.get_current_event_time()
+        try:
+            bus = dbus.SessionBus()
+            proxy = bus.get_object('org.freedesktop.PackageKit','/org/freedesktop/PackageKit')
+            iface = dbus.Interface(proxy, 'org.freedesktop.PackageKit')
+            video = ("Windows Media Video 9 decoder", "gstreamer0.10(decoder-video/x-wma)(wmaversion=3)")
+            audio = ("Windows Media Audio 9 decoder", "gstreamer0.10(decoder-audio/x-wma)(wmaversion=3)")
+            codecs = (video, audio)
+            iface.InstallGStreamerCodecs(xid,timespec,codecs)
+        except Exception, e:
+            print "Unable to install: %s" % str(e)
+
+    def install_font(self, widget, data=None):
+        xid = widget.window.xid
+        timespec = gtk.get_current_event_time()
+        try:
+            bus = dbus.SessionBus()
+            proxy = bus.get_object('org.freedesktop.PackageKit','/org/freedesktop/PackageKit')
+            iface = dbus.Interface(proxy, 'org.freedesktop.PackageKit')
+            iface.InstallFont(xid,timespec,"arial;example")
+        except Exception, e:
+            print "Unable to install: %s" % str(e)
+
+    def install_mime_type(self, widget, data=None):
+        xid = widget.window.xid
+        timespec = gtk.get_current_event_time()
+        try:
+            bus = dbus.SessionBus()
+            proxy = bus.get_object('org.freedesktop.PackageKit','/org/freedesktop/PackageKit')
+            iface = dbus.Interface(proxy, 'org.freedesktop.PackageKit')
+            iface.InstallMimeType(xid,timespec,"text/plain")
+        except Exception, e:
+            print "Unable to install: %s" % str(e)
+
+    def use_helper(self, widget, data=None):
+        xid = widget.window.xid
+
+        codecs = ""
+        codecs = codecs + "\"" + "gstreamer|0.10|totem|Windows Media Video 9 decoder|decoder-video/x-wmv, wmvversion=(int)3, fourcc=(fourcc)WVC1, format=(fourcc)WVC1" + "\""
+        codecs = codecs + "\"" + "gstreamer|0.10|totem|Windows Media Audio 9 decoder|decoder-audio/x-wma, wmaversion=(int)3, bitrate=(int)192000, depth=(int)16" + "\""
+        codecs = codecs + "\"" + "gstreamer|0.10|totem|FOOBAR protocol source|urisource-foobar (FOOBAR protocol source)" + "\""
+        os.system("/home/hughsie/Desktop/gst-rpm-install --transient-for=%i %s" % (xid, codecs));
+
+    def delete_event(self, widget, event, data=None):
+        return False
+
+    def destroy(self, widget, data=None):
+        gtk.main_quit()
+
+    def __init__(self):
+        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
+        window.connect("delete_event", self.delete_event)
+        window.connect("destroy", self.destroy)
+        window.set_border_width(10)
+        window.set_title("PackageKit Session Interface Tester")
+        window.set_icon_name("help")
+
+        hbox = gtk.VBox(homogeneous=True, spacing=9)
+
+        button = gtk.Button("Install Codec")
+        button.connect("clicked", self.install_codec, None)
+        hbox.add(button)
+
+        button = gtk.Button("Install Font")
+        button.connect("clicked", self.install_font, None)
+        hbox.add(button)
+
+        button = gtk.Button("Install Mime Type")
+        button.connect("clicked", self.install_mime_type, None)
+        hbox.add(button)
+
+        button = gtk.Button("Use helper")
+        button.connect("clicked", self.use_helper, None)
+        hbox.add(button)
+
+        window.add(hbox);
+        window.show_all()
+
+    def main(self):
+        gtk.main()
+
+if __name__ == "__main__":
+    install = SessionInstall()
+    install.main()
+

Added: trunk/help/C/figures/gpk-log.png
==============================================================================
Binary file. No diff available.

Added: trunk/help/C/figures/gpk-service-pack-example.png
==============================================================================
Binary file. No diff available.

Added: trunk/help/C/figures/gpk-service-pack-example.svg
==============================================================================
--- (empty file)
+++ trunk/help/C/figures/gpk-service-pack-example.svg	Fri Nov 21 11:13:32 2008
@@ -0,0 +1,1133 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/";
+   xmlns:cc="http://creativecommons.org/ns#";
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+   xmlns:svg="http://www.w3.org/2000/svg";
+   xmlns="http://www.w3.org/2000/svg";
+   xmlns:xlink="http://www.w3.org/1999/xlink";
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd";
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape";
+   width="744.09448819"
+   height="1052.3622047"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docname="gpk-service-pack-example.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   inkscape:export-filename="/home/hughsie/Code/gnome-packagekit/help/C/figures/gpk-service-pack-example.png"
+   inkscape:export-xdpi="91.800003"
+   inkscape:export-ydpi="91.800003">
+  <defs
+     id="defs4"><inkscape:perspective
+   sodipodi:type="inkscape:persp3d"
+   inkscape:vp_x="0 : 526.18109 : 1"
+   inkscape:vp_y="0 : 1000 : 0"
+   inkscape:vp_z="744.09448 : 526.18109 : 1"
+   inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+   id="perspective10" />
+<inkscape:perspective
+   id="perspective2416"
+   inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+   inkscape:vp_z="744.09448 : 526.18109 : 1"
+   inkscape:vp_y="0 : 1000 : 0"
+   inkscape:vp_x="0 : 526.18109 : 1"
+   sodipodi:type="inkscape:persp3d" />
+<linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#linearGradient2796"
+   id="linearGradient2806"
+   y2="15.742812"
+   x2="33.129124"
+   y1="12.426562"
+   x1="33.129124" />
+<linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#linearGradient2796"
+   id="linearGradient2804"
+   y2="12.644369"
+   x2="33.305901"
+   y1="3.7170186"
+   x1="33.305901" />
+<linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#linearGradient2796"
+   id="linearGradient2802"
+   y2="41.193676"
+   x2="21.678997"
+   y1="18.389484"
+   x1="23.936737" />
+<radialGradient
+   gradientTransform="matrix(2.140448,-1.450766e-6,0,0.93766,-24.37707,2.17114)"
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#linearGradient3052"
+   id="radialGradient3082"
+   fy="3.6835504"
+   fx="25.640675"
+   r="17.994564"
+   cy="3.6835504"
+   cx="25.640675" />
+<radialGradient
+   gradientTransform="matrix(2.140448,-1.450766e-6,0,0.93766,-24.37707,2.17114)"
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#linearGradient3052"
+   id="radialGradient3079"
+   fy="4.3500967"
+   fx="21.494347"
+   r="17.994564"
+   cy="4.3500967"
+   cx="21.494347" />
+<radialGradient
+   gradientTransform="matrix(2.140448,-1.450766e-6,0,0.93766,-24.37707,2.17114)"
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#linearGradient3052"
+   id="radialGradient3076"
+   fy="13.681828"
+   fx="14.95366"
+   r="17.994564"
+   cy="13.681828"
+   cx="14.95366" />
+<radialGradient
+   gradientTransform="matrix(2.140448,-1.450766e-6,0,0.93766,-24.37707,2.17114)"
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#linearGradient3052"
+   id="radialGradient3073"
+   fy="8.0827875"
+   fx="18.107206"
+   r="17.994564"
+   cy="8.0827875"
+   cx="18.107206" />
+<radialGradient
+   gradientTransform="matrix(1.987042,-0.338101,0.124071,0.729175,-24.09973,13.29516)"
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#linearGradient3052"
+   id="radialGradient3070"
+   fy="21.81378"
+   fx="19.450382"
+   r="17.994564"
+   cy="21.81378"
+   cx="19.450382" />
+<linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#linearGradient3013"
+   id="linearGradient3043"
+   y2="19.071247"
+   x2="8.3526993"
+   y1="11.509477"
+   x1="8.3526993" />
+<linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#linearGradient3013"
+   id="linearGradient3035"
+   y2="14.586771"
+   x2="15.202796"
+   y1="6.2158523"
+   x1="15.202796" />
+<linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#linearGradient3013"
+   id="linearGradient3027"
+   y2="12.78336"
+   x2="23.113552"
+   y1="3.2925007"
+   x1="23.113552" />
+<linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#linearGradient3013"
+   id="linearGradient3019"
+   y2="14.403073"
+   x2="35.222755"
+   y1="1.5140598"
+   x1="35.222755" />
+<linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#linearGradient3013"
+   id="linearGradient3011"
+   y2="42.721909"
+   x2="23.625"
+   y1="15.6875"
+   x1="22.625" />
+<radialGradient
+   gradientTransform="matrix(0.551865,-7.423106e-2,5.764729e-2,0.428573,10.8571,24.32541)"
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#linearGradient2985"
+   id="radialGradient2991"
+   fy="33.735012"
+   fx="23.801941"
+   r="12.990843"
+   cy="33.735012"
+   cx="23.801941" />
+<linearGradient
+   id="linearGradient2985">
+  <stop
+     id="stop2987"
+     offset="0"
+     style="stop-color:#555753;stop-opacity:1" />
+  <stop
+     id="stop2989"
+     offset="1"
+     style="stop-color:#555753;stop-opacity:0" />
+</linearGradient>
+<linearGradient
+   id="linearGradient3013">
+  <stop
+     id="stop3015"
+     offset="0"
+     style="stop-color:#2d2d2d;stop-opacity:1" />
+  <stop
+     id="stop3017"
+     offset="1"
+     style="stop-color:#ffffff;stop-opacity:1" />
+</linearGradient>
+<linearGradient
+   id="linearGradient3052">
+  <stop
+     id="stop3054"
+     offset="0"
+     style="stop-color:#555753;stop-opacity:1" />
+  <stop
+     id="stop3056"
+     offset="1"
+     style="stop-color:#2e3436;stop-opacity:1" />
+</linearGradient>
+<linearGradient
+   id="linearGradient2796">
+  <stop
+     id="stop2798"
+     offset="0"
+     style="stop-color:#2e3436;stop-opacity:1" />
+  <stop
+     id="stop2800"
+     offset="1"
+     style="stop-color:#2e3436;stop-opacity:0" />
+</linearGradient>
+<inkscape:perspective
+   id="perspective2473"
+   inkscape:persp3d-origin="24 : 16 : 1"
+   inkscape:vp_z="48 : 24 : 1"
+   inkscape:vp_y="0 : 1000 : 0"
+   inkscape:vp_x="0 : 24 : 1"
+   sodipodi:type="inkscape:persp3d" />
+<linearGradient
+   inkscape:collect="always"
+   xlink:href="#linearGradient2796"
+   id="linearGradient2525"
+   gradientUnits="userSpaceOnUse"
+   x1="33.305901"
+   y1="3.7170186"
+   x2="33.305901"
+   y2="12.644369" />
+<linearGradient
+   inkscape:collect="always"
+   xlink:href="#linearGradient2796"
+   id="linearGradient2527"
+   gradientUnits="userSpaceOnUse"
+   x1="33.305901"
+   y1="3.7170186"
+   x2="33.305901"
+   y2="12.644369" />
+
+
+<linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#XMLID_6_"
+   id="linearGradient3302"
+   y2="-5.3456044"
+   x2="223.05583"
+   y1="107.75011"
+   x1="103.71875" />
+
+
+<linearGradient
+   gradientUnits="userSpaceOnUse"
+   xlink:href="#XMLID_6_"
+   id="linearGradient3301"
+   y2="216.77003"
+   x2="-35.710068"
+   y1="109.93223"
+   x1="92.049637" />
+
+
+
+
+					
+
+				<linearGradient
+   gradientUnits="userSpaceOnUse"
+   id="XMLID_6_"
+   y2="172.18639"
+   x2="56.763809"
+   y1="112.93164"
+   x1="116.01855">
+						<stop
+   id="stop277"
+   offset="0.44999999"
+   style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+
+
+
+
+						
+
+						
+
+						
+
+						<stop
+   id="stop285"
+   offset="1.0000000"
+   style="stop-color:#a4cdec;stop-opacity:1.0000000;" />
+
+
+
+
+						<midPointStop
+   id="midPointStop287"
+   style="stop-color:#FFFFFF"
+   offset="0.45" />
+
+
+
+
+						<midPointStop
+   id="midPointStop289"
+   style="stop-color:#FFFFFF"
+   offset="0.75" />
+
+
+
+
+						<midPointStop
+   id="midPointStop291"
+   style="stop-color:#D4EEFF"
+   offset="1" />
+
+
+
+
+					</linearGradient>
+
+
+
+
+					
+
+					
+
+					<linearGradient
+   gradientUnits="userSpaceOnUse"
+   id="XMLID_5_"
+   y2="177.46597"
+   x2="51.483250"
+   y1="102.09082"
+   x1="126.85840">
+						<stop
+   id="stop260"
+   offset="0.0000000"
+   style="stop-color:#63b5e8;stop-opacity:1.0000000;" />
+
+
+
+
+						<stop
+   id="stop262"
+   offset="1.0000000"
+   style="stop-color:#001b7b;stop-opacity:1.0000000;" />
+
+
+
+
+						<midPointStop
+   id="midPointStop264"
+   style="stop-color:#57ADFF"
+   offset="0" />
+
+
+
+
+						<midPointStop
+   id="midPointStop266"
+   style="stop-color:#57ADFF"
+   offset="0.5" />
+
+
+
+
+						<midPointStop
+   id="midPointStop268"
+   style="stop-color:#003399"
+   offset="1" />
+
+
+
+
+					</linearGradient>
+
+
+
+
+					
+
+					<linearGradient
+   gradientUnits="userSpaceOnUse"
+   id="XMLID_4_"
+   y2="43.456532"
+   x2="184.72461"
+   y1="133.65625"
+   x1="94.524902">
+						<stop
+   id="stop239"
+   offset="0.0000000"
+   style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+
+
+
+
+						<stop
+   id="stop241"
+   offset="0.31658000"
+   style="stop-color:#fcfeff;stop-opacity:1.0000000;" />
+
+
+
+
+						<stop
+   id="stop243"
+   offset="0.57076001"
+   style="stop-color:#f2faff;stop-opacity:1.0000000;" />
+
+
+
+
+						<stop
+   id="stop245"
+   offset="0.80255997"
+   style="stop-color:#e1f3ff;stop-opacity:1.0000000;" />
+
+
+
+
+						<stop
+   id="stop247"
+   offset="1.0000000"
+   style="stop-color:#ccebff;stop-opacity:1.0000000;" />
+
+
+
+
+						<midPointStop
+   id="midPointStop249"
+   style="stop-color:#FFFFFF"
+   offset="0" />
+
+
+
+
+						<midPointStop
+   id="midPointStop251"
+   style="stop-color:#FFFFFF"
+   offset="0.75" />
+
+
+
+
+						<midPointStop
+   id="midPointStop253"
+   style="stop-color:#CCEBFF"
+   offset="1" />
+
+
+
+
+					</linearGradient>
+
+
+
+
+					
+
+					
+
+					<linearGradient
+   gradientUnits="userSpaceOnUse"
+   id="XMLID_3_"
+   y2="35.580940"
+   x2="193.38390"
+   y1="141.65430"
+   x1="87.310547">
+						<stop
+   id="stop210"
+   offset="0.0056200000"
+   style="stop-color:#001b7b;stop-opacity:1.0000000;" />
+
+
+
+
+						
+
+						
+
+						
+
+						
+
+						
+
+						
+
+						<stop
+   id="stop224"
+   offset="1.0000000"
+   style="stop-color:#0093dd;stop-opacity:1.0000000;" />
+
+
+
+
+						<midPointStop
+   id="midPointStop226"
+   style="stop-color:#003399"
+   offset="0.00562" />
+
+
+
+
+						<midPointStop
+   id="midPointStop228"
+   style="stop-color:#003399"
+   offset="0.25" />
+
+
+
+
+						<midPointStop
+   id="midPointStop230"
+   style="stop-color:#57ADFF"
+   offset="1" />
+
+
+
+
+					</linearGradient>
+
+
+
+
+				
+				
+			
+					<linearGradient
+   gradientUnits="userSpaceOnUse"
+   id="path1082_2_"
+   y2="129.34680"
+   x2="112.49853"
+   y1="6.1372099"
+   x1="112.49854">
+					<stop
+   id="stop193"
+   offset="0.0000000"
+   style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+
+
+
+
+					<stop
+   id="stop195"
+   offset="1.0000000"
+   style="stop-color:#0093dd;stop-opacity:0.0000000;" />
+
+
+
+
+					<midPointStop
+   id="midPointStop197"
+   style="stop-color:#FFFFFF"
+   offset="0" />
+
+
+
+
+					<midPointStop
+   id="midPointStop199"
+   style="stop-color:#FFFFFF"
+   offset="0.5" />
+
+
+
+
+					<midPointStop
+   id="midPointStop201"
+   style="stop-color:#000000"
+   offset="1" />
+
+
+
+
+				</linearGradient>
+
+
+
+
+				
+				<radialGradient
+   gradientUnits="userSpaceOnUse"
+   id="XMLID_2_"
+   fy="223.93457"
+   fx="-1.3662100"
+   r="299.15564"
+   cy="223.93457"
+   cx="-1.3662100">
+					<stop
+   id="stop166"
+   offset="0.0000000"
+   style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+
+
+
+
+					<stop
+   id="stop168"
+   offset="0.44999999"
+   style="stop-color:#418ade;stop-opacity:1.0000000;" />
+
+
+
+
+					<stop
+   id="stop170"
+   offset="0.75000000"
+   style="stop-color:#3c5cb2;stop-opacity:1.0000000;" />
+
+
+
+
+					<stop
+   id="stop172"
+   offset="1.0000000"
+   style="stop-color:#0068c6;stop-opacity:1.0000000;" />
+
+
+
+
+					<midPointStop
+   id="midPointStop174"
+   style="stop-color:#FFFFFF"
+   offset="0" />
+
+
+
+
+					<midPointStop
+   id="midPointStop176"
+   style="stop-color:#FFFFFF"
+   offset="0.5" />
+
+
+
+
+					<midPointStop
+   id="midPointStop178"
+   style="stop-color:#0083D7"
+   offset="0.45" />
+
+
+
+
+					<midPointStop
+   id="midPointStop180"
+   style="stop-color:#0083D7"
+   offset="0.5" />
+
+
+
+
+					<midPointStop
+   id="midPointStop182"
+   style="stop-color:#0053BD"
+   offset="0.75" />
+
+
+
+
+					<midPointStop
+   id="midPointStop184"
+   style="stop-color:#0053BD"
+   offset="0.5" />
+
+
+
+
+					<midPointStop
+   id="midPointStop186"
+   style="stop-color:#0066CC"
+   offset="1" />
+
+
+
+
+				</radialGradient>
+
+
+
+
+				
+				
+					<linearGradient
+   gradientUnits="userSpaceOnUse"
+   id="path1067_2_"
+   y2="12.813960"
+   x2="112.50048"
+   y1="211.02246"
+   x1="112.50049">
+					<stop
+   id="stop117"
+   offset="0.0000000"
+   style="stop-color:#418ade;stop-opacity:1.0000000;" />
+
+
+
+
+					
+
+					
+
+					
+
+					
+
+					
+
+					
+
+					
+
+					<stop
+   id="stop133"
+   offset="0.50000000"
+   style="stop-color:#a4cdec;stop-opacity:1.0000000;" />
+
+
+
+
+					
+
+					
+
+					
+
+					
+
+					
+
+					
+
+					
+
+					<stop
+   id="stop149"
+   offset="1.0000000"
+   style="stop-color:#003399;stop-opacity:1.0000000;" />
+
+
+
+
+					<midPointStop
+   id="midPointStop151"
+   style="stop-color:#0099FF"
+   offset="0" />
+
+
+
+
+					<midPointStop
+   id="midPointStop153"
+   style="stop-color:#0099FF"
+   offset="0.25" />
+
+
+
+
+					<midPointStop
+   id="midPointStop155"
+   style="stop-color:#B0D9FF"
+   offset="0.5" />
+
+
+
+
+					<midPointStop
+   id="midPointStop157"
+   style="stop-color:#B0D9FF"
+   offset="0.75" />
+
+
+
+
+					<midPointStop
+   id="midPointStop159"
+   style="stop-color:#003399"
+   offset="1" />
+
+
+
+
+				</linearGradient>
+
+
+
+
+				
+				
+				<linearGradient
+   gradientUnits="userSpaceOnUse"
+   id="XMLID_1_"
+   y2="10.168220"
+   x2="10.727790"
+   y1="213.71484"
+   x1="214.27441">
+					<stop
+   id="stop100"
+   offset="0.0000000"
+   style="stop-color:#0068c6;stop-opacity:1.0000000;" />
+
+
+
+
+					<stop
+   id="stop102"
+   offset="1.0000000"
+   style="stop-color:#3c5cb2;stop-opacity:1.0000000;" />
+
+
+
+
+					<midPointStop
+   id="midPointStop104"
+   style="stop-color:#0066CC"
+   offset="0" />
+
+
+
+
+					<midPointStop
+   id="midPointStop106"
+   style="stop-color:#0066CC"
+   offset="0.5" />
+
+
+
+
+					<midPointStop
+   id="midPointStop108"
+   style="stop-color:#0053BD"
+   offset="1" />
+
+
+
+
+				</linearGradient>
+
+
+
+
+				
+				<linearGradient
+   gradientUnits="userSpaceOnUse"
+   id="path1065_2_"
+   y2="6.5542202"
+   x2="7.1352701"
+   y1="217.28516"
+   x1="217.86621">
+					<stop
+   id="stop85"
+   offset="0.0000000"
+   style="stop-color:#3c5c82;stop-opacity:1.0000000;" />
+
+
+
+
+					<stop
+   id="stop87"
+   offset="1.0000000"
+   style="stop-color:#001b7b;stop-opacity:1.0000000;" />
+
+
+
+
+					<midPointStop
+   id="midPointStop89"
+   style="stop-color:#0053BD"
+   offset="0" />
+
+
+
+
+					<midPointStop
+   id="midPointStop91"
+   style="stop-color:#0053BD"
+   offset="0.5" />
+
+
+
+
+					<midPointStop
+   id="midPointStop93"
+   style="stop-color:#00008D"
+   offset="1" />
+
+
+
+
+				</linearGradient>
+
+			
+		
+				<inkscape:perspective
+   id="perspective2613"
+   inkscape:persp3d-origin="112.5 : 74.612305 : 1"
+   inkscape:vp_z="225 : 111.91846 : 1"
+   inkscape:vp_y="0 : 1000 : 0"
+   inkscape:vp_x="0 : 111.91846 : 1"
+   sodipodi:type="inkscape:persp3d" />
+</defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.4"
+     inkscape:cx="172.02889"
+     inkscape:cy="826.11495"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:snap-center="true"
+     inkscape:window-width="1680"
+     inkscape:window-height="977"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     showguides="true"
+     inkscape:guide-bbox="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid2383"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage"; />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <path
+       style="opacity:1;fill:#1a1a1a;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 90 72.375 C 84.46 72.375 80 76.835 80 82.375 L 80 202.375 C 80 207.915 84.46 212.375 90 212.375 L 160.71875 212.375 C 160.30191 212.6248 160 213.07047 160 213.59375 L 160 230.78125 C 160 231.57456 160.64418 232.21875 161.4375 232.21875 L 218.5 232.21875 C 219.29331 232.21875 219.9375 231.57455 219.9375 230.78125 L 219.9375 213.59375 C 219.9375 213.07047 219.6356 212.6248 219.21875 212.375 L 290 212.375 C 295.54 212.375 300 207.915 300 202.375 L 300 82.375 C 300 76.835 295.54 72.375 290 72.375 L 90 72.375 z "
+       id="rect2385" />
+    <rect
+       style="opacity:1;fill:#e9c6af;fill-opacity:1;stroke:#000000;stroke-width:0.44135845;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect2698"
+       width="200.01318"
+       height="119.98721"
+       x="89.97068"
+       y="82.332863" />
+    <g
+       id="g2502"
+       transform="matrix(2.328597,0,0,2.328597,132.44749,86.385486)">
+      <g
+         id="layer2"
+         style="display:inline">
+        <g
+           id="g3045"
+           style="opacity:0.5"
+           transform="translate(0,1)">
+          <path
+             id="path2997"
+             style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3019);stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="M 37.84375,0.5625 C 32.937667,0.5625 29.926498,4.1974996 28.9375,7.75 C 28.443001,9.5262502 28.416155,11.31354 28.90625,12.78125 C 29.396345,14.24896 30.61967,15.4375 32.28125,15.4375 C 33.942709,15.4375 35.582624,14.48396 37.125,13.1875 C 38.667376,11.89104 40.09201,10.203617 41.09375,8.46875 C 42.09549,6.7338829 42.728692,4.9559671 42.34375,3.3125 C 42.151279,2.4907665 41.629001,1.7294453 40.84375,1.25 C 40.058499,0.77055466 39.070311,0.5625 37.84375,0.5625 z" />
+          <path
+             id="path2995"
+             style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3011);stroke-width:0.99999994;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="M 27.5,15.53125 C 23.819995,15.47058 19.677609,16.333022 16.125,18.125 C 12.575638,19.91534 9.6229376,22.691517 8.75,26.5 C 7.7853218,30.705708 9.7015374,35.342237 12.96875,39.03125 C 16.227435,42.710634 20.862972,45.46875 25.8125,45.46875 C 28.382906,45.46875 30.92027,44.338258 33.03125,42.625 C 35.14223,40.911742 36.863141,38.554721 37.40625,35.75 C 37.506953,35.230764 37.385929,34.320108 37.125,33.875 C 36.710187,33.167389 36.230739,32.972714 35.8125,32.78125 C 34.667559,32.257114 33.611559,32.220831 32.34375,32.34375 C 31.123915,32.462018 29.972434,32.734345 28.9375,33.28125 C 28.377274,33.577298 27.999772,33.859812 27.65625,34.28125 C 27.591088,34.361192 27.542063,34.425289 27.46875,34.53125 C 27.432093,34.58423 27.416414,34.613815 27.3125,34.84375 C 27.208586,35.073685 27.156227,35.90608 27.15625,35.90625 C 27.312258,37.066982 26.855887,37.77254 26.3125,38.0625 C 25.738196,38.368957 24.856757,38.360283 23.78125,37.5625 C 22.826143,36.854054 22.433064,36
 .302635 22.3125,35.875 C 22.217663,35.53862 22.292508,35.128317 22.59375,34.6875 C 23.323696,33.619346 25.124686,32.442183 27.3125,31.125 C 29.481924,29.818889 31.855077,28.433407 33.71875,26.75 C 34.631518,25.925521 35.425376,25.05557 35.96875,24 C 36.512124,22.94443 36.747141,21.656052 36.53125,20.40625 C 36.248228,18.767843 34.958131,17.46276 33.375,16.71875 C 31.757017,15.958361 29.730697,15.568026 27.5,15.53125 z" />
+          <path
+             id="path2999"
+             style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3027);stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="M 23.5625,2.59375 C 22.04759,2.7779966 20.907689,3.6091831 20.28125,4.6875 C 19.654811,5.7658169 19.475654,7.0365166 19.5625,8.25 C 19.649346,9.4634834 20.008218,10.642553 20.5625,11.59375 C 21.116782,12.544947 21.921418,13.372232 23.0625,13.4375 C 24.308222,13.508783 25.18784,12.604822 25.84375,11.59375 C 26.49966,10.582678 26.978531,9.2903666 27.21875,8 C 27.458969,6.7096334 27.470563,5.3998619 26.9375,4.28125 C 26.404437,3.1626381 25.106931,2.4059809 23.5625,2.59375 z" />
+          <path
+             id="path3001"
+             style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3043);stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="M 8.84375,10.96875 C 8.2326827,10.94736 7.647776,11.187005 7.125,11.5625 C 6.0807177,12.313036 5.5564729,13.445414 5.53125,14.53125 C 5.5060271,15.617086 5.8804909,16.654222 6.40625,17.5625 C 6.9320091,18.470778 7.6368772,19.239284 8.40625,19.78125 C 9.1756228,20.323216 10.130388,20.72215 11.09375,20.28125 C 12.032054,19.851632 12.291902,18.942072 12.40625,18.0625 C 12.520598,17.182928 12.454069,16.191707 12.25,15.21875 C 12.045931,14.245793 11.705034,13.291412 11.1875,12.5 C 10.669966,11.708588 9.8932255,11.005487 8.84375,10.96875 z" />
+          <path
+             id="path3003"
+             style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3035);stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="M 15.9375,5.625 C 15.319047,5.4756575 14.662873,5.5627442 14.03125,5.8125 C 12.761729,6.3145115 11.968151,7.3431338 11.6875,8.4375 C 11.406849,9.5318662 11.57594,10.656406 11.9375,11.6875 C 12.29906,12.718594 12.8628,13.66803 13.5625,14.375 C 14.2622,15.08197 15.157389,15.645352 16.21875,15.4375 C 17.244742,15.23705 17.764385,14.361298 18.09375,13.5 C 18.423115,12.638702 18.590593,11.65157 18.59375,10.625 C 18.596907,9.5984297 18.442591,8.5368008 18.0625,7.625 C 17.682409,6.7131992 16.99497,5.8803552 15.9375,5.625 z" />
+        </g>
+      </g>
+      <g
+         id="g2511"
+         style="display:inline">
+        <path
+           id="path4490"
+           style="fill:url(#radialGradient3082);fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1.00000048;stroke-miterlimit:4;stroke-dasharray:none"
+           d="M 37.836287,2.5000004 C 28.951188,2.5000004 27.284464,15.500003 32.282829,15.500003 C 37.280472,15.500003 46.721748,2.5000004 37.836287,2.5000004 z" />
+        <path
+           id="path4492"
+           style="fill:url(#radialGradient3079);fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1.00000036;stroke-miterlimit:4;stroke-dasharray:none"
+           d="M 23.118531,13.498207 C 25.798304,13.651549 28.738452,3.9153808 23.701833,4.527724 C 18.667033,5.1400672 20.437668,13.344866 23.118531,13.498207 z" />
+        <path
+           id="path4494"
+           style="fill:url(#radialGradient3076);fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none"
+           d="M 10.673889,20.408945 C 12.579804,19.536291 10.919357,11.000759 7.6784646,13.328597 C 4.4390281,15.656813 8.7679735,21.281222 10.673889,20.408945 z" />
+        <path
+           id="path4496"
+           style="fill:url(#radialGradient3073);fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none"
+           d="M 16.043979,15.478633 C 18.31282,15.035365 18.437191,6.1170517 14.391167,7.7169262 C 10.344417,9.3171478 13.776954,15.922596 16.043979,15.478633 L 16.043979,15.478633 z" />
+        <path
+           id="path4498"
+           style="fill:url(#radialGradient3070);fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.99999994;stroke-miterlimit:4;stroke-dasharray:none"
+           d="M 28.088174,36.787402 C 28.495029,39.81447 25.808755,41.309385 23.177976,39.357941 C 14.803072,33.145898 37.044509,30.047217 35.578432,21.560039 C 34.361541,14.515499 12.175601,16.68429 9.6492019,27.706556 C 7.9390853,35.162153 16.688501,45.505173 25.817942,45.505173 C 30.309158,45.505173 35.489491,41.554302 36.458666,36.549289 C 37.198873,32.732694 27.748577,34.261981 28.088174,36.787402 L 28.088174,36.787402 z" />
+        <path
+           id="path2981"
+           style="opacity:0.7;fill:url(#radialGradient2991);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;stroke-miterlimit:4;stroke-dasharray:none"
+           transform="translate(0,1)"
+           d="M 27.5,17.03125 C 24.083784,16.974929 20.074223,17.807736 16.78125,19.46875 C 13.488277,21.129764 10.929584,23.606158 10.1875,26.84375 C 9.3900145,30.320547 11.066028,34.612646 14.09375,38.03125 C 17.121472,41.449854 21.453606,43.96875 25.8125,43.96875 C 29.985031,43.96875 35.027413,40.168619 35.9375,35.46875 C 36.009985,35.095006 35.960312,34.855088 35.84375,34.65625 C 35.727188,34.457412 35.503059,34.269458 35.1875,34.125 C 34.556382,33.836084 33.519675,33.741858 32.46875,33.84375 C 31.417825,33.945642 30.364087,34.234433 29.625,34.625 C 29.255456,34.820283 28.969993,35.056784 28.8125,35.25 C 28.655007,35.443216 28.605326,35.572444 28.625,35.71875 C 28.851098,37.400963 28.197182,38.784091 27.03125,39.40625 C 25.865318,40.028409 24.314984,39.849393 22.875,38.78125 C 21.773017,37.96386 21.08759,37.146139 20.84375,36.28125 C 20.59991,35.416361 20.841377,34.578888 21.34375,33.84375 C 22.348496,32.373473 24.359185,31.151451 26.53125,29.84375 C 28.703315,28.536049 
 31.036129,27.176118 32.71875,25.65625 C 34.401371,24.136382 35.388653,22.544361 35.0625,20.65625 C 34.870686,19.545843 34.057148,18.691496 32.71875,18.0625 C 31.380352,17.433504 29.549746,17.065043 27.5,17.03125 z" />
+        <g
+           id="g2836"
+           style="opacity:0.3;stroke:#2e3436">
+          <path
+             id="path2853"
+             style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient2802);stroke-width:0.99999994;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             transform="translate(0,1)"
+             d="M 27.46875,17.5 C 24.13271,17.445001 20.212818,18.254417 17,19.875 C 13.787182,21.495583 11.357566,23.877774 10.65625,26.9375 C 9.9082662,30.198485 11.481937,34.381621 14.4375,37.71875 C 17.393063,41.055879 21.630577,43.5 25.8125,43.5 C 29.711024,43.5 34.609468,39.812504 35.46875,35.375 C 35.524005,35.090099 35.493476,34.970487 35.4375,34.875 C 35.381524,34.779513 35.252848,34.67825 35,34.5625 C 34.494303,34.331 33.527631,34.215897 32.53125,34.3125 C 31.534869,34.409103 30.507193,34.680657 29.84375,35.03125 C 29.512029,35.206546 29.287309,35.408803 29.1875,35.53125 C 29.087691,35.653697 29.093659,35.65557 29.09375,35.65625 C 29.339341,37.483495 28.602819,39.090615 27.25,39.8125 C 25.897181,40.534385 24.140861,40.303857 22.59375,39.15625 C 21.444374,38.303706 20.691185,37.416899 20.40625,36.40625 C 20.121315,35.395601 20.414919,34.372938 20.96875,33.5625 C 22.076412,31.941623 24.103835,30.748422 26.28125,29.4375 C 28.458665,28.126578 30.780403,26.749835 32.406
 25,25.28125 C 34.032097,23.812665 34.885195,22.437189 34.59375,20.75 C 34.433192,19.820534 33.782311,19.08795 32.53125,18.5 C 31.280189,17.91205 29.470405,17.533 27.46875,17.5 z" />
+          <path
+             id="path2920"
+             style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient2525);stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+             transform="translate(0,1)"
+             d="M 37.84375,2.5 C 33.896305,2.5 31.658583,5.3543541 30.84375,8.28125 C 30.436334,9.7446979 30.431832,11.203417 30.75,12.15625 C 31.068168,13.109083 31.471708,13.5 32.28125,13.5 C 33.090548,13.5 34.492571,12.823247 35.84375,11.6875 C 37.194929,10.551753 38.504459,9.0076497 39.375,7.5 C 40.245541,5.9923503 40.616707,4.5151049 40.4375,3.75 C 40.347896,3.3674476 40.209065,3.160548 39.84375,2.9375 C 39.478435,2.714452 38.830661,2.5 37.84375,2.5 z" />
+          <path
+             id="path2922"
+             style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient2527);stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+             transform="translate(0,1)"
+             d="M 23.8125,4.53125 C 22.831737,4.6505324 22.3278,5.0694512 21.96875,5.6875 C 21.6097,6.3055488 21.465329,7.2038998 21.53125,8.125 C 21.597171,9.0461002 21.879196,9.9574168 22.25,10.59375 C 22.620804,11.230083 23.028082,11.459632 23.1875,11.46875 C 23.232836,11.471344 23.70687,11.272131 24.1875,10.53125 C 24.66813,9.7903692 25.119405,8.6934849 25.3125,7.65625 C 25.505595,6.6190151 25.427964,5.6296051 25.1875,5.125 C 24.947036,4.6203949 24.762186,4.4157888 23.8125,4.53125 z" />
+          <path
+             id="path2926"
+             style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient2806);stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+             transform="translate(0,1)"
+             d="M 8.78125,12.9375 C 8.6914294,12.934356 8.5361761,12.950698 8.25,13.15625 C 7.6770962,13.568002 7.5137117,13.972216 7.5,14.5625 C 7.4862883,15.152784 7.7347971,15.919653 8.125,16.59375 C 8.5152029,17.267847 9.0548551,17.851915 9.53125,18.1875 C 10.007645,18.523085 10.296913,18.492831 10.28125,18.5 C 10.171152,18.55041 10.393698,18.389809 10.46875,17.8125 C 10.543802,17.235191 10.508818,16.412009 10.34375,15.625 C 10.178682,14.837991 9.8869629,14.058668 9.5625,13.5625 C 9.2380371,13.066332 8.9585431,12.943706 8.78125,12.9375 z" />
+          <path
+             id="path2924"
+             style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient2804);stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+             transform="translate(0,1)"
+             d="M 15.5,7.5 C 15.359503,7.4660732 15.161228,7.4747497 14.78125,7.625 C 14.027202,7.9231762 13.742067,8.3279067 13.59375,8.90625 C 13.445433,9.4845933 13.514058,10.269275 13.78125,11.03125 C 14.048442,11.793225 14.48758,12.514156 14.9375,12.96875 C 15.38742,13.423344 15.771226,13.514203 15.84375,13.5 C 15.810775,13.506442 16.068097,13.369899 16.28125,12.8125 C 16.494403,12.255101 16.622474,11.415176 16.625,10.59375 C 16.627526,9.7723241 16.487721,8.9765178 16.25,8.40625 C 16.012279,7.8359822 15.770674,7.5653616 15.5,7.5 z" />
+        </g>
+      </g>
+    </g>
+    <path
+       style="opacity:1;fill:#1a1a1a;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 390 72.375 C 384.46 72.375 380 76.835 380 82.375 L 380 202.375 C 380 207.915 384.46 212.375 390 212.375 L 461.0625 212.375 C 460.45557 212.5412 460 213.08891 460 213.75 L 460 230.9375 C 460 231.73081 460.64418 232.375 461.4375 232.375 L 518.46875 232.375 C 519.26206 232.375 519.90626 231.7308 519.90625 230.9375 L 519.90625 213.75 C 519.90625 213.09253 519.47681 212.54451 518.875 212.375 L 590 212.375 C 595.54 212.375 600 207.915 600 202.375 L 600 82.375 C 600 76.835 595.54 72.375 590 72.375 L 390 72.375 z "
+       id="rect2700" />
+    <rect
+       style="opacity:1;fill:#e9c6af;fill-opacity:1;stroke:#000000;stroke-width:0.44135845;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect2702"
+       width="200.01318"
+       height="119.98721"
+       x="389.97067"
+       y="82.33287" />
+    <g
+       id="g2684"
+       transform="matrix(0.4467538,0,0,0.4467538,443.85685,92.362183)">
+      <path
+         id="path1065_1_"
+         style="fill:url(#path1065_2_)"
+         d="M 23.29883,0 L 201.70215,0 C 214.5166,0 225,10.48389 225,23.29736 L 225,200.53906 C 225,213.35351 214.5166,223.83691 201.70215,223.83691 L 23.29883,223.83691 C 10.48389,223.83691 0,213.35352 0,200.53906 L 0,23.29736 C 0,10.48389 10.48389,0 23.29883,0 z" />
+      <path
+         id="path111"
+         style="fill:url(#XMLID_1_)"
+         d="M 22.11377,5.60547 L 202.88672,5.60547 C 211.98828,5.60547 219.41406,13.03369 219.41406,22.1333 L 219.41406,201.70117 C 219.41406,210.80176 211.98828,218.32129 202.88672,218.32129 L 22.11377,218.32129 C 13.01465,218.32129 5.58594,210.80176 5.58594,201.70117 L 5.58594,22.1333 C 5.58496,13.03369 13.01465,5.60547 22.11377,5.60547 z" />
+      <path
+         id="path113"
+         style="fill:#ffffff"
+         d="M 25.26953,9.31934 L 199.73047,9.31934 C 208.5127,9.31934 215.68164,16.4878 215.68164,25.27002 L 215.68164,198.56738 C 215.68164,207.34961 208.51269,214.6084 199.73047,214.6084 L 25.26953,214.6084 C 16.48779,214.6084 9.31982,207.34961 9.31982,198.56738 L 9.31982,25.27002 C 9.31836,16.48779 16.48779,9.31934 25.26953,9.31934 z" />
+      <path
+         id="path1067_1_"
+         style="fill:url(#path1067_2_)"
+         d="M 25.62744,12.81348 L 199.37305,12.81348 C 206.36035,12.81348 212.09571,18.54883 212.09571,25.62744 L 212.09571,198.2998 C 212.09571,205.28808 206.36133,211.02246 199.37305,211.02246 L 25.62744,211.02246 C 18.63867,211.02246 12.90527,205.28808 12.90527,198.2998 L 12.90527,25.62744 C 12.90527,18.54883 18.63867,12.81348 25.62744,12.81348 z" />
+      <path
+         id="path189"
+         style="fill:url(#XMLID_2_)"
+         d="M 25.62744,15.30322 C 19.98437,15.30322 15.39404,19.93457 15.39404,25.62744 L 15.39404,198.2998 C 15.39404,203.9414 19.98437,208.53418 25.62744,208.53418 L 199.37305,208.53418 C 205.01563,208.53418 209.60743,203.94141 209.60743,198.2998 L 209.60743,25.62744 C 209.60743,19.93457 205.01563,15.30322 199.37305,15.30322 L 25.62744,15.30322 z" />
+      <path
+         id="path1082_1_"
+         style="fill:url(#path1082_2_)"
+         d="M 25.62744,18.10547 C 21.53027,18.10547 18.19678,21.47901 18.19678,25.62744 C 18.19678,25.62744 18.19678,130.19433 18.19678,138.14551 C 27.30908,129.61133 57.16065,106.60498 114.41309,106.60498 C 177.06153,106.60498 203.46875,78.82227 206.80079,74.99609 C 206.80079,73.74023 206.80079,25.62841 206.80079,25.62841 C 206.80079,21.48046 203.46876,18.10693 199.3711,18.10693 L 25.62744,18.10693 L 25.62744,18.10547 z" />
+      <path
+         id="path233"
+         style="fill:url(#XMLID_3_)"
+         d="M 124.10938,26.55322 L 95.52247,29.29004 C 94.8838,29.35254 94.39649,29.88867 94.39649,30.53027 L 94.39649,148.22558 C 94.39649,148.58691 94.55469,148.93261 94.8296,149.16796 C 95.1045,149.40526 95.46827,149.50976 95.82618,149.45605 L 124.11134,145.19726 C 124.71876,145.10546 125.17189,144.58203 125.17189,143.96581 C 125.17189,143.96581 125.17189,104.63134 125.17189,97.81542 C 129.18947,103.69774 160.91212,150.1455 160.91212,150.1455 C 161.22071,150.59863 161.792,150.79491 162.31544,150.6289 L 192.11817,141.20117 C 192.49903,141.08008 192.79883,140.7832 192.92383,140.40332 C 192.96582,140.27539 192.98731,140.14355 192.98731,140.01465 C 192.98731,139.75391 192.90528,139.49805 192.74805,139.28223 C 192.74805,139.28223 155.44141,87.98291 154.3711,86.5127 C 155.48731,85.07715 193.03126,36.76807 193.03126,36.76807 C 193.20216,36.54639 193.29103,36.27735 193.29103,36.00391 C 193.29103,35.86377 193.26857,35.72315 193.21974,35.58692 C 193.07716,35.18604 192.74025,34.8867
 2 192.32521,34.79102 L 161.91603,27.79786 C 161.43556,27.68751 160.93458,27.8711 160.63966,28.26563 C 160.63966,28.26563 129.19142,70.36329 125.19044,75.71924 C 125.2295,69.21973 125.47267,27.79541 125.47267,27.79297 C 125.47267,27.44287 125.32619,27.10986 125.06935,26.87451 C 124.80859,26.63721 124.46191,26.52051 124.10938,26.55322 z" />
+      <polygon
+         id="path5692_1_"
+         style="fill:#ffffff"
+         points="95.6416,148.22559 95.6416,30.53027 124.22754,27.79297 123.9248,79.49414 161.63672,29.01074 192.04785,36.00391 152.81543,86.4873 191.74219,140.01465 161.94043,149.44238 123.92676,93.78662 123.92676,143.96582 95.6416,148.22559 " />
+      <path
+         id="path256"
+         style="fill:url(#linearGradient3302);fill-opacity:1"
+         d="M 101.86377,36.18457 C 101.86377,45.77295 101.86377,128.91016 101.86377,140.99512 C 107.84668,140.09473 112.88086,139.33692 117.7041,138.61035 C 117.7041,130.90918 117.7041,104.72461 117.7041,98.21924 C 117.70215,98.22217 117.5918,98.36963 117.5918,98.36963 C 117.5918,98.36963 117.7041,79.26807 117.7041,79.2666 C 117.7041,77.0039 117.7041,73.64306 117.7041,73.64306 L 117.73633,73.69189 C 117.78223,65.9541 117.91309,43.66015 117.9668,34.64404 C 112.09473,35.20508 106.95605,35.69727 101.86377,36.18457 z M 128.90918,83.21777 C 128.90918,83.21777 127.29492,85.3789 126.47168,86.48144 C 127.38574,87.81933 159.94727,135.49121 164.4707,142.11621 C 168.79492,140.74707 174.76465,138.8584 181.62793,136.68652 C 173.94531,126.12304 145.03027,86.36328 145.03027,86.36328 C 145.03027,86.36328 172.55761,50.9414 181.15136,39.8833 C 173.8662,38.2085 168.02929,36.86523 164.19628,35.9834 C 159.94434,41.67236 128.90918,83.21777 128.90918,83.21777 z" />
+      <path
+         id="path271"
+         style="fill:url(#XMLID_5_)"
+         d="M 57.67578,56.01465 C 57.6748,56.01563 46.45947,67.23096 46.45947,67.23096 C 45.93847,67.75244 45.66943,68.4419 45.66943,69.13819 C 45.66943,69.61817 45.79687,70.10157 46.06054,70.53663 C 46.06054,70.53663 58.15527,90.45265 58.83544,91.57569 C 56.74511,95.2002 55.0581,99.04542 53.80517,103.03907 C 52.53271,103.30274 30.36474,107.91407 30.36474,107.91407 C 29.12011,108.17139 28.21826,109.28223 28.21826,110.55323 L 28.21826,126.417 C 28.21826,127.66309 29.06445,128.74122 30.27441,129.03419 C 30.27441,129.03419 51.72216,134.27833 52.99804,134.58888 C 54.20898,139.31251 55.98437,143.80861 58.28466,147.9922 C 57.56152,149.09474 45.12157,168.06837 45.12157,168.06837 C 44.82762,168.51759 44.68407,169.02931 44.68407,169.54103 C 44.68407,170.24025 44.95409,170.93556 45.47411,171.45412 L 56.68798,182.67092 C 57.57177,183.55276 58.93261,183.71584 59.99755,183.06838 C 59.99755,183.06838 79.54491,171.20022 80.64648,170.53225 C 84.54248,172.71291 88.66259,174.42776 92.92529,17
 5.64455 C 93.1958,176.94826 97.73388,198.76564 97.73388,198.76564 C 97.99023,200.0088 99.10009,200.91408 100.37402,200.91408 L 116.23828,200.91408 C 117.4834,200.91408 118.56055,200.0674 118.85644,198.85646 C 118.85644,198.85646 124.22363,176.88869 124.52636,175.6465 C 128.94335,174.39064 133.19531,172.60158 137.20019,170.31837 C 138.32617,171.0586 157.52148,183.64552 157.52148,183.64552 C 158.583,184.34083 160.00586,184.19435 160.90429,183.30079 L 172.12499,172.08009 C 173.00683,171.19923 173.17089,169.83888 172.52245,168.77443 L 164.88378,156.18947 C 164.58495,155.69826 163.99218,155.47463 163.44433,155.64943 C 163.44433,155.64943 161.68554,156.20509 161.25097,156.34377 C 159.91796,154.3926 150.2539,140.24318 150.2539,140.24318 C 150.00585,139.8799 149.58593,139.67482 149.14452,139.70314 C 148.708,139.73048 148.31639,139.9883 148.1162,140.37892 C 140.51171,155.2588 125.42186,164.50197 108.73436,164.50197 C 96.92479,164.50197 85.82225,159.90334 77.47166,151.55177 C 69.12107
 ,143.20118 64.52195,132.09767 64.52195,120.28907 C 64.52195,102.92335 74.76511,87.09376 90.61668,79.95997 C 91.06395,79.7588 91.35057,79.31446 91.35057,78.82423 L 91.35057,67.09863 C 91.35057,66.69482 91.15526,66.31689 90.82616,66.08398 C 90.49755,65.85058 90.07616,65.79052 89.69579,65.92382 C 86.94433,66.8872 84.33983,68.04296 81.89696,69.32763 C 80.80175,68.61034 61.062,55.66454 61.062,55.66454 C 59.99756,54.9668 58.57324,55.11523 57.67578,56.01465 z" />
+      <path
+         id="path273"
+         style="fill:#ffffff"
+         d="M 163.81934,156.83398 L 161.34961,157.61816 C 160.98828,157.72949 160.59961,157.5957 160.38477,157.28125 C 160.38477,157.28125 155.51368,150.15234 149.22461,140.94531 C 141.70313,155.66308 126.40137,165.74511 108.73438,165.74511 C 83.62989,165.74511 63.27735,145.39355 63.27735,120.28906 C 63.27735,101.82275 74.29346,85.94043 90.10645,78.82422 L 90.10645,67.09863 C 87.22852,68.10595 84.44825,69.31884 81.80567,70.7583 C 81.80079,70.75537 81.79688,70.75098 81.792,70.74805 L 60.38037,56.70508 C 59.8042,56.32813 59.04346,56.40625 58.55713,56.89356 L 47.33936,68.11084 C 46.86768,68.58398 46.7793,69.31885 47.12549,69.8916 L 60.25977,91.52246 C 57.92969,95.43945 56.06446,99.6626 54.73243,104.11719 L 30.6172,109.13282 C 29.9463,109.27149 29.46241,109.86573 29.46241,110.55323 L 29.46241,126.417 C 29.46241,127.0879 29.91944,127.66895 30.56886,127.82716 L 53.97023,133.54689 C 55.22023,138.70412 57.15187,143.59669 59.70802,148.09181 L 46.16309,168.75 C 45.78516,169.32617 45.8
 6524,170.08691 46.35254,170.57324 L 57.56787,181.79101 C 58.04101,182.26269 58.77832,182.35253 59.34961,182.00488 L 80.58203,169.11523 C 84.74805,171.5205 89.24756,173.41503 93.99902,174.69824 L 98.95312,198.51172 C 99.09179,199.18457 99.68701,199.66895 100.37402,199.66895 L 116.23828,199.66895 C 116.9043,199.66895 117.48828,199.21192 117.64648,198.56055 L 123.47949,174.69239 C 128.37988,173.3711 133.01269,171.40235 137.28613,168.88673 L 158.2041,182.60548 C 158.78125,182.98146 159.53906,182.90431 160.02832,182.41798 L 171.24512,171.20021 C 171.71973,170.72658 171.80664,169.99318 171.45899,169.42189 L 163.81934,156.83398 z" />
+      <path
+         id="path294"
+         style="fill:url(#linearGradient3301);fill-opacity:1"
+         d="M 54.38721,69.86328 C 57.20459,74.50293 66.2334,89.37109 66.80371,90.30957 C 70.44922,85.2085 74.96582,80.73096 80.29346,77.20654 C 79.38428,76.60986 64.88672,67.10254 60.21387,64.03711 C 58.06104,66.18945 56.49023,67.76123 54.38721,69.86328 z M 55.99902,110.2085 C 55.99902,110.2085 41.0791,113.31348 35.68506,114.4336 C 35.68506,117.4795 35.68506,119.7002 35.68506,122.6709 C 40.88233,123.94043 56.62598,127.78809 57.69287,128.04981 C 57.31006,125.49805 57.05469,122.91602 57.05469,120.28907 C 57.05469,116.68751 57.55664,113.17677 58.28125,109.73438 C 57.21533,109.95557 55.99902,110.2085 55.99902,110.2085 z M 64.91211,151.50293 C 64.91211,151.50293 56.51904,164.30371 53.49512,168.91699 C 55.64893,171.07129 57.21875,172.6416 59.3208,174.74316 C 63.94238,171.9375 78.31055,163.21386 79.2085,162.66796 C 76.73389,160.93749 74.37256,159.01171 72.19239,156.83105 C 69.93897,154.5791 67.94923,152.13964 66.17628,149.57421 C 65.57373,150.49512 64.91211,151.50293 64.91211,151.5
 0293 z M 138.63574,162.33105 C 139.58789,162.95507 153.73926,172.23632 158.37207,175.27343 C 160.52148,173.12499 162.09375,171.55175 164.19629,169.44921 C 162.90527,167.32128 162.22559,166.19823 160.7959,163.84374 C 158.5957,163.75487 156.53418,162.6787 155.24707,160.79101 C 155.24707,160.79101 152.26855,156.43359 149.31543,152.11035 C 146.2334,156.05566 142.64063,159.47656 138.63574,162.33105 z M 108.73438,171.96777 C 105.64014,171.96777 102.59815,171.6582 99.61329,171.12988 C 99.83888,172.21972 103.13868,188.0791 104.25587,193.44629 C 107.29884,193.44629 109.51857,193.44629 112.49073,193.44629 C 113.76661,188.21973 117.71192,172.08106 117.96485,171.04785 C 114.94531,171.58984 111.87793,171.96777 108.73438,171.96777 z" />
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#1a1a1a;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="100"
+       y="192.36218"
+       id="text2778"><tspan
+         sodipodi:role="line"
+         id="tspan2780"
+         x="100"
+         y="192.36218"
+         style="font-weight:bold;fill:#1a1a1a;fill-opacity:1">A</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#1a1a1a;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="395"
+       y="192.36218"
+       id="text2782"><tspan
+         sodipodi:role="line"
+         id="tspan2784"
+         x="395"
+         y="192.36218"
+         style="font-weight:bold;fill:#1a1a1a;fill-opacity:1">B</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#1a1a1a;stroke-width:6.79999999999999982;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="M 295,137.36218 C 335,137.36218 335,137.36218 335,137.36218 L 335,37.362183"
+       id="path2802" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#1a1a1a;stroke-width:6.79999999999999982;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="M 305,37.362183 C 335,67.362183 335,67.362183 335,67.362183 L 365,37.362183"
+       id="path2804" />
+  </g>
+</svg>

Added: trunk/help/C/figures/gpk-service-pack.png
==============================================================================
Binary file. No diff available.

Modified: trunk/po/POTFILES.in
==============================================================================
--- trunk/po/POTFILES.in	(original)
+++ trunk/po/POTFILES.in	Fri Nov 21 11:13:32 2008
@@ -54,6 +54,5 @@
 src/gpk-update-icon.c
 src/gpk-update-viewer.c
 src/gpk-watch.c
-python/packagekit/genums.py
 python/packagekit/gtkwidgets.py
 

Modified: trunk/po/POTFILES.skip
==============================================================================
--- trunk/po/POTFILES.skip	(original)
+++ trunk/po/POTFILES.skip	Fri Nov 21 11:13:32 2008
@@ -1 +1,2 @@
+python/packagekit/genums.py
 

Added: trunk/python/Makefile.am
==============================================================================
--- (empty file)
+++ trunk/python/Makefile.am	Fri Nov 21 11:13:32 2008
@@ -0,0 +1,2 @@
+SUBDIRS = packagekit
+EXTRA_DIST = enum-convertor.py

Added: trunk/python/enum-convertor.py
==============================================================================
--- (empty file)
+++ trunk/python/enum-convertor.py	Fri Nov 21 11:13:32 2008
@@ -0,0 +1,112 @@
+#!/usr/bin/env python
+
+from re import compile,DOTALL,MULTILINE
+
+icons = compile("static const PkEnumMatch enum_([^\]]+)_icon_name\[\] = {(.*?)};", DOTALL|MULTILINE)
+animations = compile("static const PkEnumMatch enum_([^\]]+)_animation\[\] = {(.*?)};", DOTALL|MULTILINE)
+values = compile("PK_([A-Z_]+)_ENUM_([A-Z0-9_]+),\s+\"([^\"]+)\"")
+
+present = compile("gpk_([a-z]+?)_enum_to_localised_present \(Pk[A-Za-z]+? [a-z]+?\)(.*?)}", DOTALL|MULTILINE)
+past = compile("gpk_([a-z]+?)_enum_to_localised_past \(Pk[A-Za-z]+? [a-z]+?\)(.*?)}", DOTALL|MULTILINE)
+descs = compile("gpk_([a-z]+?)_enum_to_localised_message \(Pk[A-Za-z]+? [a-z]+?\)(.*?)}", DOTALL|MULTILINE)
+string_values = compile("case PK_([A-Z_]+?)_ENUM_([A-Z0-9_]+?):\n\s+text = (_\(\".+?\"\));\n", MULTILINE|DOTALL)
+strings = compile("gpk_([a-z]+?)_enum_to_localised_text \(Pk[A-Za-z]+? [a-z]+?\)(.*?)}", DOTALL|MULTILINE)
+string_values = compile("case PK_([A-Z_]+?)_ENUM_([A-Z0-9_]+?):\n\s+text = (_\(\".+?\"\));\n", MULTILINE|DOTALL)
+string_sub_values = compile("case PK_([A-Z_]+?)_ENUM_([A-Z0-9_]+?):\n\s+text = g_strdup_printf\([\\t\\s]*?(_\(\".+?\"\)), ([A-Z_]+?)\);\n", MULTILINE|DOTALL)
+
+inp = open("../src/gpk-enum.c").read()
+
+header = '''"""
+Provides human readable strings, icon names and animations for internal 
+enumerations
+
+This file was autogenerated from src/gpk-enum.c by msg-converter.py
+"""
+
+from packagekit.enums import *
+import gettext
+from gettext import gettext as _
+
+gettext.textdomain("gnome-packagekit")
+
+GPK_BUGZILLA_URL = "https://bugs.freedesktop.org/";
+'''
+print header
+
+# Extract icon names
+for (name, data) in icons.findall(inp):
+    print "ICONS_%s = {" % name.upper()
+    for match in values.findall(data):
+        print "    %s_%s:'%s'," % match
+    print "    }\n"
+    print "def get_%s_icon_name_from_enum(enum):" % name
+    print "   if ICONS_%s.has_key(enum):" % name.upper()
+    print "       return ICONS_%s[enum]" % name.upper()
+    print "   else:"
+    print "       return None\n"
+
+# Extract animations
+for (name, data) in animations.findall(inp):
+    print "ANIMATIONS_%s = {" % name.upper()
+    for match in values.findall(data):
+        print "    %s_%s:'%s'," % match
+    print "    }\n"
+    print "def get_%s_animation_name_from_enum(enum):" % name
+    print "   if ANIMATIONS_%s.has_key(enum):" % name.upper()
+    print "       return ANIMATIONS_%s[enum]" % name.upper()
+    print "   else:"
+    print "       return None\n"
+
+# Extract past messages
+for (name, data) in past.findall(inp):
+    print "PAST_%s = {" % name.upper()
+    for match in string_sub_values.findall(data):
+        print "    %s_%s:%s %% %s," % match
+    for match in string_values.findall(data):
+        print "    %s_%s:%s," % match
+    print "    }\n"
+    print "def get_%s_localised_past_from_enum(enum):" % name
+    print "   if PAST_%s.has_key(enum):" % name.upper()
+    print "       return PAST_%s[enum]" % name.upper()
+    print "   else:"
+    print "       return None\n"
+
+
+# Extract present messages
+for (name, data) in present.findall(inp):
+    print "PRESENT_%s = {" % name.upper()
+    for match in string_sub_values.findall(data):
+        print "    %s_%s:%s %% %s," % match
+    for match in string_values.findall(data):
+        print "    %s_%s:%s," % match
+    print "    }\n"
+    print "def get_%s_localised_present_from_enum(enum):" % name
+    print "   if PRESENT_%s.has_key(enum):" % name.upper()
+    print "       return PRESENT_%s[enum]" % name.upper()
+    print "   else:"
+    print "       return None\n"
+
+# Extract messages
+for (name, data) in descs.findall(inp):
+    print "DESCS_%s = {" % name.upper()
+    for match in string_sub_values.findall(data):
+        print "    %s_%s:%s %% %s," % match
+    for match in string_values.findall(data):
+        print "    %s_%s:%s," % match
+    print "    }\n"
+    print "def get_%s_description_from_enum(enum):" % name
+    print "   if DESCS_%s.has_key(enum):" % name.upper()
+    print "       return DESCS_%s[enum]" % name.upper()
+    print "   else:"
+    print "       return None\n"
+
+for (name, data) in strings.findall(inp):
+    print "STRINGS_%s = {" % name.upper()
+    for match in string_values.findall(data):
+        print "    %s_%s:%s," % match
+    print "    }\n"
+    print "def get_%s_string_from_enum(enum):" % name
+    print "   if STRINGS_%s.has_key(enum):" % name.upper()
+    print "       return STRINGS_%s[enum]" % name.upper()
+    print "   else:"
+    print "       return None\n"

Added: trunk/python/packagekit/Makefile.am
==============================================================================
--- (empty file)
+++ trunk/python/packagekit/Makefile.am	Fri Nov 21 11:13:32 2008
@@ -0,0 +1,17 @@
+BUILT_SOURCES = genums.py
+
+NULL =
+
+genums.py: ../enum-convertor.py ../../src/gpk-enum.c
+	(cd ..; python enum-convertor.py > packagekit/genums.py)
+
+packagekitpythondir = ${PYTHON_PACKAGE_DIR}
+packagekitpython_PYTHON =				\
+	gtkwidgets.py					\
+	genums.py					\
+	$(NULL)
+
+clean-local :
+	rm -f *.pyc
+	rm -f *~
+

Added: trunk/python/packagekit/gtkwidgets.py
==============================================================================
--- (empty file)
+++ trunk/python/packagekit/gtkwidgets.py	Fri Nov 21 11:13:32 2008
@@ -0,0 +1,756 @@
+"""
+This module provides widgets to use PackageKit in a GTK application.
+"""
+#Copyright (C) 2008 Sebastian Heinlein <sevel glatzor de>
+
+#Licensed under the GNU General Public License Version 2
+
+#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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+__author__ = "Sebastian Heinlein <devel glatzor de>"
+
+import gobject
+import gtk
+import pango
+import pygtk
+from gettext import gettext as _
+
+import dbus
+
+import packagekit.client
+from packagekit.misc import PackageKitPackage
+from packagekit.enums import *
+
+
+from genums import *
+
+import dbus.mainloop.glib
+dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
+
+(COLUMN_ID,
+ COLUMN_PACKAGE) = range(2)
+
+
+class PackageKitStatusIcon(gtk.Image):
+    """
+    Provides a gtk.Image which shows an icon representing the status of a
+    PackageKit transaction
+    """
+    def __init__(self, transaction=None, size=gtk.ICON_SIZE_DIALOG):
+        gtk.Image.__init__(self)
+        self.icon_size = size
+        self.icon_name = None
+        self._transaction = None
+        self._signals = []
+        self.set_alignment(0, 0)
+        if transaction != None:
+            self.set_transaction(transaction)
+
+    def set_transaction(self, transaction):
+        """Connect to the given transaction"""
+        for s in self._signals: s.remove
+        self._signals = []
+        self._signals.append(
+            transaction.connect_to_signal("StatusChanged",
+                                          self._on_status_changed))
+        self._transaction = transaction
+
+    def set_icon_size(self, size):
+        """Set the icon size to gtk stock icon size value"""
+        self.icon_size = size
+
+    def _on_status_changed(self, status):
+        """Set the status icon according to the changed status"""
+        icon_name = get_status_icon_name_from_enum(status)
+        if icon_name != self.icon_name:
+            self.set_from_icon_name(icon_name, self.icon_size)
+            self.icon_name = icon_name
+
+
+class PackageKitStatusAnimation(PackageKitStatusIcon):
+    """
+    Provides a gtk.Image which shows an animation representing the 
+    transaction status
+    """
+    def __init__(self, transaction=None):
+        PackageKitStatusIcon.__init__(self, transaction)
+        self.animation = []
+        self.ticker = 0
+        self.animation_name = None
+        self.frame_counter = 0
+        self.iter = 0
+
+    def set_animation(self, name, size=None, fallback=None):
+        """Show and start the animation of the given name and size"""
+        if name == self.animation_name:
+            return
+        if size != None:
+            self.icon_size = size
+        self.stop_animation()
+        animation = []
+        (width, height) = gtk.icon_size_lookup(self.icon_size)
+        theme = gtk.icon_theme_get_default()
+        theme.append_search_path("/usr/share/gnome-packagekit/icons")
+        if theme.has_icon(name):
+            pixbuf = theme.load_icon(name, width, 0)
+            rows = pixbuf.get_height() / height
+            cols = pixbuf.get_width() / width
+            for r in range(rows):
+                for c in range(cols):
+                    animation.append(pixbuf.subpixbuf(c * width, r * height, 
+                                                      width, height))
+            if len(animation) > 0:
+                self.animation = animation
+                self.iter = 0
+                self.set_from_pixbuf(self.animation[0])
+                self.start_animation()
+            else:
+                self.set_from_pixbuf(pixbuf)
+            self.icon_name = name
+        else:
+            self.set_from_icon_name(fallback, self.icon_size)
+            self.icon_name = fallback
+
+    def start_animation(self):
+        """Start the animation"""
+        if self.ticker == 0:
+            self.ticker = gobject.timeout_add(200, self._advance)
+
+    def stop_animation(self):
+        """Stop the animation"""
+        if self.ticker != 0:
+            gobject.source_remove(self.ticker)
+            self.ticker = 0
+
+    def _advance(self):
+        """
+        Show the next frame of the animation and stop the animation if the
+        widget is no longer visible
+        """
+        if self.get_property("visible") == False:
+            self.ticker = 0
+            return False
+        self.iter = self.iter + 1
+        if self.iter >= len(self.animation):
+            self.iter = 0
+        self.set_from_pixbuf(self.animation[self.iter])
+        return True
+
+    def _on_status_changed(self, status):
+        """
+        Set the animation according to the changed status
+        """
+        self.set_animation(name=get_status_animation_name_from_enum(status),
+                           fallback=get_status_icon_name_from_enum(status))
+
+
+class PackageKitStatusLabel(gtk.Label):
+    """
+    Status label for the running PackageKit transaction
+    """
+    def __init__(self, transaction=None):
+        gtk.Label.__init__(self)
+        self.set_alignment(0, 0)
+        self.set_ellipsize(pango.ELLIPSIZE_END)
+        self._transaction = None
+        self._signals = []
+        if transaction != None:
+            self.set_transaction(transaction)
+
+    def set_transaction(self, transaction):
+        """Connect the status label to the given PackageKit transaction"""
+        for h in self._signals:
+            h.remove()
+        self._signals = []
+        self._signals.append(
+            transaction.connect_to_signal("StatusChanged",
+                                          self._on_status_changed))
+        self._transaction = transaction
+
+    def _on_status_changed(self, status):
+        """Set the status text according to the changed status"""
+        self.set_markup("<i>%s</i>" % get_status_string_from_enum(status))
+
+
+class PackageKitProgressBar(gtk.ProgressBar):
+    """
+    Provides a gtk.Progress which represents the progress of a PackageKit
+    transactions
+    """
+    def __init__(self, transaction=None):
+        gtk.ProgressBar.__init__(self)
+        self._show_time = False
+        self._transaction = None
+        self._signals = []
+        if transaction != None:
+            self.set_transaction(transaction)
+
+    def set_transaction(self, transaction):
+        """Connect the progress bar to the given PackageKit transaction"""
+        for h in self._signals:
+            h.remove()
+        self._signals = []
+        self._signals.append(
+            transaction.connect_to_signal("Finished",
+                                          self._on_finished))
+        self._signals.append(
+            transaction.connect_to_signal("ProgressChanged",
+                                          self._on_progress_changed))
+        self._transaction = transaction
+
+    def set_show_time(self, enabled):
+        """Show the elapsed and remaining time on the progress bar"""
+        self._show_time = enabled
+        if time == False:
+            self.set_text("")
+
+    def get_show_time(self):
+        """
+        Return True if the elapsed and remaining time are shown in the
+        progress bar
+        """
+        return self._show_time
+
+    def _on_progress_changed(self, progress, subprogress, elapsed, estimated):
+        """
+        Update the progress according to the latest progress information
+        """
+        if progress > 100:
+            self.pulse()
+        else:
+            self.set_fraction(progress/100.0)
+        if self._show_time:
+            #FIXME: should be nicer
+            self.set_text("elapsed: %s - estimated: %s" % (elapsed, estimated))
+
+    def _on_finished(self, exit, runtime):
+        """Set the progress to 100% when the transaction is complete"""
+        self.set_fraction(1)
+
+
+class PackageKitCancelButton(gtk.Button):
+    """
+    Provides a gtk.Button which allows to cancel a running PackageKit 
+    transaction
+    """
+    def __init__(self, transaction):
+        gtk.Button.__init__(self, stock=gtk.STOCK_CANCEL)
+        self.set_sensitive(False)
+        self._transaction = None
+        self._signals = []
+        if transaction != None:
+            self.set_transaction(transaction)
+
+    def set_transaction(self, transaction):
+        """Connect the status label to the given PackageKit transaction"""
+        for h in self._signals:
+            h.remove()
+        self._signals = []
+        self._signals.append(
+                transaction.connect_to_signal("Finished",
+                                              self._on_finished))
+        self._signals.append(
+                transaction.connect_to_signal("AllowCancel",
+                                              self._on_allow_cancel_changed))
+        self._transaction = transaction
+        self.connect("clicked", self._on_clicked, transaction)
+
+    def _on_allow_cancel_changed(self, allow_cancel):
+        """
+        Enable the button if cancel is allowed and disable it in the other case
+        """
+        self.set_sensitive(allow_cancel)
+
+    def _on_finished(self, transaction, status):
+        self.set_sensitive(False)
+
+    def _on_clicked(self, button, transaction):
+        transaction.cancel()
+
+
+class PackageKitProgressDialog(gtk.Dialog):
+    """
+    Complete progress dialog for long taking PackageKit transactions, which
+    features a progress bar, cancel button, status icon and label
+    """
+    def __init__(self, transaction=None, parent=None):
+        gtk.Dialog.__init__(self, buttons=None, parent=parent)
+        # Setup the dialog
+        self.set_border_width(6)
+        self.set_has_separator(False)
+        self.set_resizable(False)
+        self.vbox.set_spacing(6)
+        # Setup the cancel button
+        self.button_cancel = PackageKitCancelButton(transaction)
+        self.add_action_widget(self.button_cancel, gtk.RESPONSE_CANCEL)
+        # Setup the status icon, label and progressbar
+        hbox = gtk.HBox()
+        hbox.set_spacing(12)
+        hbox.set_border_width(6)
+        self.icon = PackageKitStatusAnimation()
+        self.icon._on_status_changed(STATUS_WAIT)
+        hbox.pack_start(self.icon, False, True, 0)
+        vbox = gtk.VBox()
+        vbox.set_spacing(12)
+        self.label_role = gtk.Label()
+        self.label_role.set_alignment(0, 0)
+        vbox.pack_start(self.label_role, False, True, 0)
+        vbox_progress = gtk.VBox()
+        vbox_progress.set_spacing(6)
+        self.progress = PackageKitProgressBar()
+        vbox_progress.pack_start(self.progress, False, True, 0)
+        self.label = PackageKitStatusLabel()
+        self.label._on_status_changed(STATUS_WAIT)
+        vbox_progress.pack_start(self.label, False, True, 0)
+        vbox.pack_start(vbox_progress, False, True, 0)
+        hbox.pack_start(vbox, True, True, 0)
+        self.vbox.pack_start(hbox, True, True, 0)
+        self._transaction = None
+        self._signals = []
+        self.set_title("")
+        self.realize()
+        self.progress.set_size_request(250, -1)
+        self.window.set_functions(gtk.gdk.FUNC_MOVE)
+
+        if transaction != None:
+            self.set_transaction(transaction)
+
+    def run(self):
+        """Run the transaction"""
+        parent = self.get_transient_for()
+        self._transaction.run()
+        role_enum = self._transaction._iface.GetRole()[0]
+        role = get_role_localised_present_from_enum(role_enum)
+        self.set_title(role)
+        self.label_role.set_markup("<big><b>%s</b></big>" % role)
+        self.show_all()
+        gtk.Dialog.run(self)
+        return self._transaction._exit
+
+    def set_transaction(self, transaction):
+        """Connect the dialog to the given PackageKit transaction"""
+        for h in self._signals:
+            h.remove()
+        self._signals = []
+        self._signals.append(
+            transaction.connect_to_signal("Finished",self._on_finished))
+        self.progress.set_transaction(transaction)
+        self.icon.set_transaction(transaction)
+        self.label.set_transaction(transaction)
+        self._transaction = transaction
+
+    def _on_finished(self, status, runtime):
+        self.response(gtk.RESPONSE_CLOSE)
+
+class PackageKitPackageDialog(gtk.MessageDialog):
+    """Dialog for showing a list of packages"""
+    def __init__(self, packages=[], parent=None, type=gtk.MESSAGE_QUESTION,
+                 buttons=gtk.BUTTONS_CLOSE):
+        gtk.MessageDialog.__init__(self, parent=parent, type=type,
+                                   buttons=buttons)
+        self.model = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_PYOBJECT)
+        scrolled = gtk.ScrolledWindow()
+        scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        scrolled.set_shadow_type(gtk.SHADOW_ETCHED_IN)
+        self.listview = PackageListView(status_column=False)
+        self.listview.set_model(self.model)
+        self.listview.set_headers_visible(False)
+        scrolled.add(self.listview)
+        box = self.label.get_parent()
+        box.add(scrolled)
+        scrolled.show_all()
+        if packages:
+            self.set_packages(packages)
+
+    def get_model(self):
+        '''Get the model of the PackageListView of the dialog'''
+        return self.listview.get_model()
+
+    def set_model(self):
+        '''Set the model of the PackageListView of the dialog'''
+        return self.listview.set_model()
+
+    def set_packages(self, packages):
+        '''Show the given packages in the dialog'''
+        model = self.get_model()
+        for pkg in packages:
+            model.append((pkg.id, pkg))
+
+    def clear_packages(self):
+        '''Clear the shown packages'''
+        model = self.get_model()
+        model.clear()
+
+
+class PackageKitMessageDialog(gtk.MessageDialog):
+    """
+    Dialog for PackageKit messages with details in an expandable text view
+    """
+    def __init__(self, enum, details=None, parent=None):
+        gtk.MessageDialog.__init__(self, parent=parent,
+                                   type=gtk.MESSAGE_INFO,
+                                   buttons=gtk.BUTTONS_CLOSE)
+        text = get_message_string_from_enum(enum)
+        self.set_markup("<big><b>%s</b></big>" % text)
+        self.set_details(details)
+
+    def set_details(self, details):
+        if details == None:
+            return
+        #TRANSLATORS: expander label in the error dialog
+        expander = gtk.expander_new_with_mnemonic(_("_Details"))
+        expander.set_spacing(6)
+        scrolled = gtk.ScrolledWindow()
+        scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        scrolled.set_shadow_type(gtk.SHADOW_ETCHED_IN)
+        textview = gtk.TextView()
+        buffer = textview.get_buffer()
+        buffer.insert_at_cursor(details)
+        scrolled.add(textview)
+        expander.add(scrolled)
+        box = self.label.get_parent()
+        box.add(expander)
+        expander.show_all()
+
+
+class PackageKitErrorDialog(PackageKitMessageDialog):
+    """
+    Dialog for PackageKit errors with details in an expandable text view
+    """
+    def __init__(self, error=None, parent=None):
+        gtk.MessageDialog.__init__(self, parent=parent,
+                                   type=gtk.MESSAGE_ERROR,
+                                   buttons=gtk.BUTTONS_CLOSE)
+        text = get_error_string_from_enum(error.code)
+        desc = get_error_description_from_enum(error.code)
+        self.set_markup("<big><b>%s</b></big>\n\n%s" % (text, desc))
+        self.set_details(error.details)
+
+
+class PackageListStore(gtk.ListStore):
+    """
+    Provides a gtk.ListStore which can handle packages returned by a
+    PackageKit transaction.
+
+    The first column contains the package id and the second one contains
+    the corresponding package object.
+    """
+    def __init__(self, transaction=None):
+        gtk.ListStore.__init__(self,
+                               gobject.TYPE_STRING,
+                               gobject.TYPE_PYOBJECT)
+        self._transaction = None
+        self._signals = []
+        if transaction != None:
+            self.set_transaction(transaction)
+
+    def set_transaction(self, transaction):
+        """Connect the store to the given PackageKit transaction"""
+        self.clear()
+        for h in self._signals:
+            h.remove()
+        self._signals = []
+        self._signals.append(
+            transaction.connect_to_signal("Package", self._on_package))
+
+    def _on_package(self, info, package_id, summary):
+        self.append((package_id, PackageKitPackage(info, package_id, summary)))
+
+
+class PackageListView(gtk.TreeView, gobject.GObject):
+    """
+    Provides a gtk.Listview which can show the packages of a PackageListStore
+    """
+    __gsignals__ = {"toggled":(gobject.SIGNAL_RUN_FIRST,
+                               gobject.TYPE_NONE,
+                               (gobject.TYPE_PYOBJECT,))}
+    def __init__(self, status_column=True):
+        self.__gobject_init__()
+        gtk.TreeView.__init__(self)
+        self.set_rules_hint(True)
+        # Add a fake liststore to the packages list, so that the headers
+        # are already seen during start up
+        fake_store = gtk.ListStore(gobject.TYPE_STRING,
+                                   gobject.TYPE_PYOBJECT)
+        fake_store.set_sort_column_id(COLUMN_PACKAGE, gtk.SORT_ASCENDING)
+        self.set_model(fake_store)
+
+        self.theme = gtk.icon_theme_get_default()
+        self.theme.append_search_path("/usr/share/gnome-packagekit/icons")
+
+        if status_column:
+            # check boxes
+            renderer_status = gtk.CellRendererToggle()
+            renderer_status.connect('toggled', self._on_toggled)
+            renderer_status.set_property("xalign", 0.5)
+            renderer_status.set_property("yalign", 0.5)
+            column_status = gtk.TreeViewColumn("")
+            column_status.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
+            column_status.pack_start(renderer_status, False)
+            column_status.set_cell_data_func (renderer_status, 
+                                              self._toggle_cell_func)
+            # FIXME: we need to react on theme changes
+            width = renderer_status.get_size(self)[2] + 8
+            column_status.set_fixed_width(width)
+            self.append_column(column_status)
+
+        # Application column (icon, name, description)
+        column_pkg = gtk.TreeViewColumn(_("Package"))
+        column_pkg.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
+        column_pkg.set_expand(True)
+        column_pkg.set_sort_column_id(COLUMN_ID)
+        # The icon
+        renderer_icon = gtk.CellRendererPixbuf()
+        column_pkg.pack_start(renderer_icon, False)
+        column_pkg.set_cell_data_func(renderer_icon, 
+                                      self._icon_cell_func)
+        # package name and description
+        renderer_desc = gtk.CellRendererText()
+        renderer_desc.set_property("ellipsize", pango.ELLIPSIZE_END)
+        column_pkg.pack_start(renderer_desc, True)
+        column_pkg.set_cell_data_func(renderer_desc, 
+                                      self._package_view_func)
+
+        self.append_column(column_pkg)
+
+        self.set_fixed_height_mode(True)
+
+    def _package_view_func(self, cell_layout, renderer, model, iter):
+        """
+        Render the description of a package
+        """
+        pkg = model.get_value(iter, COLUMN_PACKAGE)
+        text = "%s\n<small>%s</small>" % (pkg.name, pkg.summary)
+        renderer.set_property("markup", text)
+
+    def _toggle_cell_func(self, column, cell, model, iter):
+        """
+        Show a checked checkbox for installed package and disable the
+        checkbox for blocked packages
+        """
+        pkg = model.get_value(iter, COLUMN_PACKAGE)
+        cell.set_property("active", pkg.info == INFO_INSTALLED)
+        cell.set_property("activatable", pkg.info != INFO_BLOCKED)
+
+    def _icon_cell_func(self, column, cell, model, iter):
+        """Render an icon that represents the info about of the package"""
+        pkg = model.get_value(iter, COLUMN_PACKAGE)
+        try:
+            icon = self.theme.load_icon(get_info_icon_name_from_enum(pkg.info),
+                                        24, 0)
+            # work around bug LP #209072 even if we ask for a 24px
+            # icon, we sometimes get outrages big ones - 256x256
+            if icon and (icon.get_height() > 24 or icon.get_width() > 24):
+                #print "WARNING: scaling down ", menuitem.iconname
+                icon = icon.scale_simple(24, 24, gtk.gdk.INTERP_BILINEAR)
+        except gobject.GError:
+            try:
+                icon = self.theme.load_icon("applications-other", 24, 0)
+            except gobject.GError:
+                icon = self.theme.load_icon(gtk.STOCK_MISSING_IMAGE, 24, 0)
+        cell.set_property("pixbuf", icon)
+        cell.set_property("visible", True)
+
+    def _on_toggled(self, widget, path):
+        """Emit the toggled signal with the selected package"""
+        model = self.get_model()
+        (id, pkg) = model[path]
+        self.emit("toggled", pkg)
+
+
+class PackageKitInstaller:
+    '''Provides a complete and easy solution to install and remove packages'''
+    def __init__(self, client=None, parent=None):
+        self._parent = parent
+        if not client:
+            client = packagekit.client.PackageKitClient()
+        self._client = client
+        self._progress = PackageKitProgressDialog(parent=self._parent)
+
+    def _on_exit(self, trans, exit, runtime):
+        '''Callback after a transaction is finished'''
+        if exit == EXIT_FAILED:
+            err = trans.get_error()
+            d = PackageKitErrorDialog(trans.get_error(), parent=self._parent)
+            d.run()
+            d.hide()
+        for msg in trans.messages:
+            dia_msg = PackageKitMessageDialog(msg.code, msg.details,
+                                              parent=self._parent)
+            dia.run()
+            dia.hide()
+
+    def remove(self, packages, confirm=True):
+        '''Remove packages'''
+        if confirm:
+            t_requires = self._client.get_requires(packages,
+                                                   exit_handler=self._on_exit)
+            self._progress.set_transaction(t_requires)
+            ret = self._progress.run()
+            if not ret == EXIT_SUCCESS:
+                self._progress.hide()
+                return False
+            if t_requires.result:
+                dia = PackageKitPackageDialog(t_requires, parent=self._parent,
+                                              buttons=gtk.BUTTONS_CANCEL)
+                dia.set_default_response(gtk.RESPONSE_CANCEL)
+                dia.add_button(_("_Remove"), gtk.RESPONSE_OK)
+                msg = gettext.ngettext("Remove %i additional package?",
+                                       "Remove %i additional packages?",
+                                       len(t_requires.result)) % \
+                      len(t_requires.result)
+                dia.set_markup("<b><big>%s</big></b>" % msg)
+                dia.format_secondary_markup(_("The software which you want to "
+                                              "remove is required to run other "
+                                              "software, which will be removed "
+                                              "too."))
+                ret = dia.run()
+                dia.hide()
+                if ret == gtk.RESPONSE_CANCEL:
+                    self._progress.hide()
+                    return False
+        t_remove = self._client.remove_packages(packages,
+                                                exit_handler=self._on_exit)
+        self._progress.set_transaction(t_remove)
+        ret = self._progress.run()
+        self._progress.hide()
+        return (ret == EXIT_SUCCESS)
+
+    def install(self, packages, confirm=True):
+        '''Install packages'''
+        if confirm:
+            t_depends = self._client.get_depends(packages,
+                                                 exit_handler=self._on_exit)
+            self._progress.set_transaction(t_depends)
+            ret = self._progress.run()
+            if not ret == EXIT_SUCCESS:
+                self._progress.hide()
+                return False
+            if t_depends.result:
+                dia = PackageKitPackageDialog(t_depends.result,
+                                              parent=self._parent,
+                                              buttons=gtk.BUTTONS_CANCEL)
+                dia.set_default_response(gtk.RESPONSE_CANCEL)
+                dia.add_button(_("_Install"), gtk.RESPONSE_OK)
+                msg = gettext.ngettext("Install %i additional package?",
+                                       "Install %i additional packages?",
+                                       len(t_depends.result)) % \
+                      len(t_depends.result)
+                dia.set_markup("<b><big>%s</big></b>" % msg)
+                dia.format_secondary_markup(_("The software that you want to "
+                                              "install requires additional "
+                                              "software to run correctly."))
+                ret = dia.run()
+                dia.hide()
+                if ret == gtk.RESPONSE_CANCEL:
+                    self._progress.hide()
+                    return False
+        t_remove = self._client.install_packages(packages,
+                                                 exit_handler=self._on_exit)
+        self._progress.set_transaction(t_remove)
+        ret = self._progress.run()
+        self._progress.hide()
+        return (ret == EXIT_SUCCESS)
+
+    def install_by_name(self, names, confirm=True):
+        '''Install the packages with the given names'''
+        t_resolve = self._client.resolve(names, exit_handler=self._on_exit)
+        self._progress.set_transaction(t_resolve)
+        ret = self._progress.run()
+        if not ret == EXIT_SUCCESS:
+            self._progress.hide()
+            return False
+        return self.install(t_resolve.result, confirm)
+
+    def remove_by_name(self, names, confirm=True):
+        '''Remove the packages with the given names'''
+        t_resolve = self._client.resolve(names, exit_handler=self._on_exit)
+        self._progress.set_transaction(t_resolve)
+        ret = self._progress.run()
+        if not ret == EXIT_SUCCESS:
+            self.progress.hide()
+            return False
+        return self.remove(t_resolve.result, confirm)
+
+
+def main():
+    """Run a test application"""
+    def on_exit(trans, exit, runtime):
+        if exit == EXIT_FAILED:
+            err = trans.get_error()
+            d = PackageKitErrorDialog(trans.get_error(), parent=win)
+            d.run()
+            d.hide()
+    def refresh(*args):
+        t = pk.update_system(exit_handler=on_exit)
+        dia = PackageKitProgressDialog(t, parent=win)
+        dia.run()
+        dia.hide()
+    def search(*args):
+        t = pk.search_name("xterm", exit_handler=on_exit)
+        label.set_transaction(t)
+        icon.set_transaction(t)
+        pkgstore.set_transaction(t)
+        t.run()
+    def update(*args):
+        t = pk.get_updates(exit_handler=on_exit)
+        label.set_transaction(t)
+        icon.set_transaction(t)
+        pkgstore.set_transaction(t)
+        t.run()
+    def on_toggled(view, pkg):
+        installer = PackageKitInstaller(client=pk, parent=win)
+        if pkg.info == INFO_INSTALLED:
+            print installer.remove_by_name([pkg.name])
+        else:
+            print installer.install_by_name([pkg.name])
+        search()
+    win = gtk.Window()
+    button_refresh = gtk.Button(label="Refresh")
+    button_update = gtk.Button(label="Get Updates")
+    button_search = gtk.Button(label="Search xterm")
+    button_refresh.connect("clicked", refresh)
+    button_update.connect("clicked", update)
+    button_search.connect("clicked", search)
+    vbox = gtk.VBox()
+    vbox.add(button_update)
+    vbox.add(button_refresh)
+    vbox.add(button_search)
+    pkgstore = PackageListStore()
+    listview = PackageListView()
+    listview.set_size_request(400, 200)
+    scrolled = gtk.ScrolledWindow()
+    scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+    scrolled.set_shadow_type(gtk.SHADOW_ETCHED_IN)
+    scrolled.add(listview)
+    vbox.add(scrolled)
+    hbox = gtk.HBox()
+    icon = PackageKitStatusIcon(size=gtk.ICON_SIZE_MENU)
+    label = PackageKitStatusLabel()
+    hbox.add(icon)
+    hbox.add(label)
+    vbox.add(hbox)
+    win.add(vbox)
+    loop = gobject.MainLoop()
+    win.connect("delete-event", lambda w, e: loop.quit())
+    win.show_all()
+    listview.set_model(pkgstore)
+    listview.connect("toggled", on_toggled)
+    pk = packagekit.client.PackageKitClient()
+    print map(lambda p: p.id, pk.resolve("xterm"))
+    loop.run()
+
+if __name__ == "__main__":
+    main()



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]