ubuntu-gnome-default-settings/0000775000000000000000000000000012310475506013656 5ustar ubuntu-gnome-default-settings/debian/0000775000000000000000000000000012310476003015071 5ustar ubuntu-gnome-default-settings/debian/changelog0000664000000000000000000001375012310476003016751 0ustar ubuntu-gnome-default-settings (14.04.1) trusty; urgency=medium * Change default background to Adwaita-timed -- Tim Lunn Fri, 14 Mar 2014 14:47:23 +1100 ubuntu-gnome-default-settings (14.04.0) trusty; urgency=medium * debian/60-gnome.conf: * debian/ubuntu-gnome-default-settings.install: * debian/ubuntu-gnome-default-settings.maintscript: - Move 20-gnome.conf from /etc to /usr/share and rename it to 60-gnome.conf to have higher priority than 50-ubuntu.conf -- Robert Ancell Wed, 05 Feb 2014 10:45:21 +0000 ubuntu-gnome-default-settings (13.10.11) saucy; urgency=low * Update text colours in plymouth theme to avoid contrast issue -- Tim Lunn Wed, 11 Sep 2013 23:46:42 +1000 ubuntu-gnome-default-settings (13.10.10) saucy; urgency=low * Actually drop idle-dim-time override -- Jeremy Bicha Mon, 09 Sep 2013 23:25:13 -0400 ubuntu-gnome-default-settings (13.10.9) saucy; urgency=low * Drop idle-dim-time override no longer needed with gnome-settings-daemon 3.8 (LP: #1168838) -- Jeremy Bicha Mon, 09 Sep 2013 21:52:23 -0400 ubuntu-gnome-default-settings (13.10.8) saucy; urgency=low [ Tim Lunn ] * clean up gsettings override, we don't use g-s-d background plugin now * Change default background to FootFall -- Evan Dandrea Tue, 03 Sep 2013 12:52:45 +0100 ubuntu-gnome-default-settings (13.10.7) saucy; urgency=low * Update to new plymouth theme, Thanks Alfredo Hernández * Add noise texture to plymouth theme * Revert renaming of plymouth text theme moduleName to fix text theme * Use Ubuntu GNOME logo for gdm -- Tim Lunn Thu, 29 Aug 2013 12:29:17 +1000 ubuntu-gnome-default-settings (13.10.6) saucy; urgency=low * Adjust GNOME Shell "favorites" for ubiquity.desktop rename * debian/20-gnome.conf, debian/ubuntu-gnome-default-settings.postinst, debian/ubuntu-gnome-default-settings.postrm: - Use new lightdm.conf.d/ method to set the default login session instead of lightdm-set-defaults -- Jeremy Bicha Fri, 02 Aug 2013 10:02:10 -0400 ubuntu-gnome-default-settings (13.10.5) saucy; urgency=low [ Tim Lunn ] * Override ubufox homepage setting and use about:home instead of about:startpage (LP: #1195367). [ Jeremy Bicha ] * Undo the changes from 13.10.1 since we're setting the Firefox homepage a different way -- Tim Lunn Tue, 23 Jul 2013 11:41:31 +1000 ubuntu-gnome-default-settings (13.10.4) saucy; urgency=low * Undo change from 13.10.2 to explicitly hide Hibernate from user menu now that gnome-shell-extensions is fixed -- Jeremy Bicha Sun, 21 Jul 2013 18:57:54 -0400 ubuntu-gnome-default-settings (13.10.3) saucy; urgency=low * Copy change from ubuntu-settings to add zeitgiest to gedit's default plugins -- Jeremy Bicha Wed, 26 Jun 2013 16:37:12 -0400 ubuntu-gnome-default-settings (13.10.2) saucy; urgency=low * Don't show Hibernate in user menu since hibernate is disabled by default in Ubuntu (LP: #1191181) -- Jeremy Bicha Tue, 25 Jun 2013 13:21:57 -0400 ubuntu-gnome-default-settings (13.10.1) saucy; urgency=low * Use ubuntu-defaults-builder to set Firefox homepage to upstream default -- Jeremy Bicha Tue, 25 Jun 2013 08:51:22 -0400 ubuntu-gnome-default-settings (13.10.0) saucy; urgency=low * Drop gdm fallback logo since gdm fallback mode is gone * Re-activate rhythmbox's 'artsearch' by default (merged from ubuntu-settings) -- Jeremy Bicha Thu, 06 Jun 2013 10:59:37 -0400 ubuntu-gnome-default-settings (13.04.3) raring; urgency=low * Set the Installer as a favorite in GNOME Shell's Activities Overview. This fixes a regression caused by 13.04.1. (LP: #1171789) -- Jeremy Bicha Tue, 23 Apr 2013 10:55:41 -0400 ubuntu-gnome-default-settings (13.04.2) raring; urgency=low * Disable the Ubuntu overlay scrollbars since they cause black backgrounds in some GTK+ widgets with the Adwaita theme (LP: #1167079, #1102096) -- Jeremy Bicha Sun, 21 Apr 2013 20:31:22 -0400 ubuntu-gnome-default-settings (13.04.1) raring; urgency=low * Since Firefox is our default browser, set it as a default "favorite" in GNOME Shell's Activities Overview instead of GNOME Web. This matches the default GNOME Shell behavior in Ubuntu 12.04 LTS. -- Jeremy Bicha Sat, 06 Apr 2013 12:41:03 -0400 ubuntu-gnome-default-settings (13.04.0) raring; urgency=low * Copy settings from ubuntu-settings and explicitly override back to GNOME defaults. This is much better than recommending users uninstall ubuntu-settings which is a required dependency of ubuntu-desktop. -- Jeremy Bicha Tue, 19 Feb 2013 20:46:26 -0500 ubuntu-gnome-default-settings (12.10.3) quantal; urgency=low [ Tim Lunn ] * Add ubuntu logo to gdm greeter screen. [ Everaldo Canuto ] * Fix missing password prompt for encrypted partitions (LP: #1060123) * Hide xterm, uxterm, and imagemagick from applications overview (LP: #129041) -- Tim Lunn Thu, 04 Oct 2012 07:44:18 +1000 ubuntu-gnome-default-settings (12.10.2) quantal; urgency=low * Add plymouth theme (LP: #1058434) -- Everaldo Canuto Sat, 29 Sep 2012 00:33:02 -0300 ubuntu-gnome-default-settings (12.10.1) quantal; urgency=low * Copy Ubuntu override for Alt as mouse-button-modifier * Drop nautilus, gnome-session, totem, and org.gnome.background overrides -- Jeremy Bicha Tue, 11 Sep 2012 23:29:14 -0400 ubuntu-gnome-default-settings (12.10.0) quantal; urgency=low * Initial release. (LP #1043610) - Copy some Ubuntu settings - Use GNOME default background - Use GNOME session as default login session -- Jeremy Bicha Thu, 30 Aug 2012 17:01:33 -0400 ubuntu-gnome-default-settings/debian/source/0000775000000000000000000000000012310475506016400 5ustar ubuntu-gnome-default-settings/debian/source/format0000664000000000000000000000001512310475506017607 0ustar 3.0 (native) ubuntu-gnome-default-settings/debian/plymouth-theme-ubuntu-gnome-logo.postrm0000664000000000000000000000231212310475506024706 0ustar #!/bin/sh -e # This script can be called in the following ways: # # After the package was removed: # remove # # After the package was purged: # purge # # After the package was upgraded: # upgrade # if that fails: # failed-upgrade # # # After all of the packages files have been replaced: # disappear # # # If preinst fails during install: # abort-install # # If preinst fails during upgrade of removed package: # abort-install # # If preinst fails during upgrade: # abort-upgrade case "$1" in remove) update-alternatives \ --remove default.plymouth /lib/plymouth/themes/ubuntu-gnome-logo/ubuntu-gnome-logo.plymouth if which update-initramfs >/dev/null 2>&1 then update-initramfs -u fi if [ -e /boot/grub/grub.cfg ] && which update-grub2 >/dev/null 2>&1 then update-grub2 fi ;; purge) ;; upgrade|failed-upgrade|disappear) ;; abort-install|abort-upgrade) ;; *) echo "$0 called with unknown argument \`$1'" 1>&2 exit 1 ;; esac #DEBHELPER# exit 0 ubuntu-gnome-default-settings/debian/plymouth-theme-ubuntu-gnome-text.prerm0000664000000000000000000000037412310475506024541 0ustar #!/bin/sh set -e if [ "x$1" = xremove ]; then update-alternatives \ --remove text.plymouth /lib/plymouth/themes/ubuntu-gnome-text/ubuntu-gnome-text.plymouth rm -f /lib/plymouth/themes/ubuntu-gnome-text/ubuntu-gnome-text.plymouth fi #DEBHELPER# ubuntu-gnome-default-settings/debian/ubuntu-gnome-default-settings.gsettings-override0000664000000000000000000000657112310475671026567 0ustar [org.gnome.crypto.pgp] keyservers=['hkp://keyserver.ubuntu.com:11371', 'hkp://pool.sks-keyservers.net', 'ldap://keyserver.pgp.com'] [org.gnome.desktop.background] show-desktop-icons=false picture-uri='file:///usr/share/themes/Adwaita/backgrounds/adwaita-timed.xml' [org.gnome.desktop.interface] gtk-theme="Adwaita" icon-theme="gnome" cursor-theme="Adwaita" font-name="Cantarell 11" monospace-font-name="Ubuntu Mono 13" [org.gnome.desktop.sound] theme-name = 'freedesktop' [org.gnome.desktop.session] session-name="gnome" [org.gnome.desktop.wm.keybindings] maximize = ['Up','Up','KP_5'] minimize = ['KP_0'] move-to-corner-ne = ['KP_Prior'] move-to-corner-nw = ['KP_Home'] move-to-corner-se = ['KP_Next'] move-to-corner-sw = ['KP_End'] move-to-side-e = ['KP_Right'] move-to-side-n = ['KP_Up'] move-to-side-s = ['KP_Down'] move-to-side-w = ['KP_Left'] toggle-maximized = ['KP_5'] toggle-shaded = ['s'] unmaximize = ['Down','Down','F5'] show-desktop = ['d','d','d'] [org.gnome.desktop.wm.preferences] button-layout=':minimize,maximize,close' mouse-button-modifier='' theme="Adwaita" titlebar-font='Cantarell Bold 11' [org.gnome.eog.ui] external-editor='shotwell-viewer.desktop' sidebar=false [org.gnome.Empathy.conversation] theme="Classic" theme-variant="" adium-path="" [org.gnome.Empathy.notifications] notifications-focus=true [org.gnome.Epiphany] keyword-search-url='http://www.google.com/search?client=ubuntu&channel=es&q=%s&ie=UTF-8&oe=UTF-8' [org.gnome.gedit.plugins] active-plugins = ['docinfo', 'modelines', 'filebrowser', 'spell', 'time', 'zeitgeistplugin'] [org.gnome.login-screen] logo='/lib/plymouth/ubuntu-gnome_logo.png' [org.gnome.mutter.keybindings] toggle-tiled-left = ['Left','Left'] toggle-tiled-right = ['Right','Right'] [org.gnome.nautilus.desktop] home-icon-visible=false trash-icon-visible=false volumes-visible=false [org.gnome.nautilus.preferences] sort-directories-first=false [org.gnome.rhythmbox.rhythmdb] monitor-library=true [org.gnome.rhythmbox.plugins] active-plugins=['artsearch', 'audiocd','audioscrobbler','cd-recorder','daap','dbus-media-server','generic-player','ipod','iradio','mmkeys','mpris','mtpdevice','notification','power-manager'] [org.gnome.settings-daemon.peripherals.touchpad] disable-while-typing = true tap-to-click = true [org.gnome.settings-daemon.plugins.power] button-power = 'interactive' button-sleep = 'suspend' critical-battery-action = 'suspend' [org.gnome.settings-daemon.plugins.xsettings] antialiasing = 'rgba' hinting = 'slight' [org.gnome.settings-daemon.plugins.print-notifications] active = true [org.gnome.settings-daemon.plugins.updates] active = false [org.gnome.shell] favorite-apps=[ 'ubiquity.desktop', 'firefox.desktop', 'evolution.desktop', 'empathy.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'libreoffice-writer.desktop', 'nautilus.desktop', 'yelp.desktop' ] [org.gnome.sushi] client-decoration = true [org.gnome.Totem] active-plugins = ['skipto','chapters','screenshot','media_player_keys','screensaver','movie-properties','save-file','youtube','totem-zeitgeist-dp-plugin'] [com.canonical.desktop.interface] scrollbar-mode = 'normal' ubuntu-gnome-default-settings/debian/bzr-builddeb.conf0000664000000000000000000000003112310475506020306 0ustar [BUILDDEB] native = True ubuntu-gnome-default-settings/debian/plymouth-theme-ubuntu-gnome-logo.install0000664000000000000000000000011212310475506025024 0ustar lib/plymouth/themes/ubuntu-gnome-logo/ lib/plymouth/ubuntu-gnome_logo.png ubuntu-gnome-default-settings/debian/ubuntu-gnome-default-settings.install0000664000000000000000000000014112310475506024371 0ustar usr/share/gnome usr/share/xul-ext/ubufox debian/60-gnome.conf /usr/share/lightdm/lightdm.conf.d/ ubuntu-gnome-default-settings/debian/ubuntu-gnome-default-settings.maintscript0000664000000000000000000000007712310475506025270 0ustar rm_conffile /etc/lightdm/lightdm.conf.d/20-gnome.conf 13.10.11 ubuntu-gnome-default-settings/debian/control0000664000000000000000000000314012310475506016501 0ustar Source: ubuntu-gnome-default-settings Section: x11 Priority: optional Maintainer: Ubuntu Developers Build-Depends: debhelper (>= 9) Standards-Version: 3.9.4 Vcs-Bzr: https://code.launchpad.net/~ubuntu-gnome-dev/ubuntu-default-settings/ubuntu Package: ubuntu-gnome-default-settings Architecture: all Depends: ${misc:Depends}, gnome-themes-standard, libglib2.0-bin, Description: default settings for the Ubuntu GNOME desktop This package contains the default settings used by Ubuntu GNOME. Package: plymouth-theme-ubuntu-gnome-logo Architecture: all Depends: ${misc:Depends}, plymouth, plymouth-label Provides: plymouth-theme Description: graphical boot animation and logger - ubuntu-gnome-logo theme Plymouth is an application that runs very early in the boot process (even before the root filesystem is mounted!) that provides a graphical boot animation while the boot process happens in the background. . This package contains the default ubuntu-gnome-logo theme. Package: plymouth-theme-ubuntu-gnome-text Architecture: all Depends: ${misc:Depends}, plymouth, plymouth-theme-ubuntu-text Provides: plymouth-theme Replaces: plymouth (<< 0.8.1-1~) Description: graphical boot animation and logger - ubuntu-gnome-text theme Plymouth is an application that runs very early in the boot process (even before the root filesystem is mounted!) that provides a graphical boot animation while the boot process happens in the background. . This package contains the default ubuntu-gnome-text text theme used when no support for a graphical theme is found on your system. ubuntu-gnome-default-settings/debian/rules0000775000000000000000000000014012310475506016153 0ustar #!/usr/bin/make -f override_dh_installgsettings: dh_installgsettings --priority=20 %: dh $@ ubuntu-gnome-default-settings/debian/plymouth-theme-ubuntu-gnome-text.install0000664000000000000000000000004712310475506025057 0ustar lib/plymouth/themes/ubuntu-gnome-text/ ubuntu-gnome-default-settings/debian/compat0000664000000000000000000000000212310475506016276 0ustar 9 ubuntu-gnome-default-settings/debian/plymouth-theme-ubuntu-gnome-text.postinst0000664000000000000000000000231612310475506025275 0ustar #!/bin/sh -e # This script can be called in the following ways: # # After the package was installed: # configure # # # If prerm fails during upgrade or fails on failed upgrade: # abort-upgrade # # If prerm fails during deconfiguration of a package: # abort-deconfigure in-favour # removing # # If prerm fails during replacement due to conflict: # abort-remove in-favour case "$1" in configure|triggered) sed -re \ "/\[ubuntu-text\]/ { N; s/(title=Ubuntu GNOME ).*\$/\1$(lsb_release -rs)/ }" /lib/plymouth/themes/ubuntu-gnome-text/ubuntu-gnome-text.plymouth.in \ > /lib/plymouth/themes/ubuntu-gnome-text/ubuntu-gnome-text.plymouth update-alternatives \ --install /lib/plymouth/themes/text.plymouth text.plymouth \ /lib/plymouth/themes/ubuntu-gnome-text/ubuntu-gnome-text.plymouth 60 if which update-initramfs >/dev/null 2>&1 then update-initramfs -u fi ;; abort-upgrade|abort-deconfigure|abort-remove) ;; *) echo "$0 called with unknown argument \`$1'" 1>&2 exit 1 ;; esac #DEBHELPER# exit 0 ubuntu-gnome-default-settings/debian/copyright0000664000000000000000000000177212310475506017042 0ustar Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: ubuntu-gnome-default-settings Source: https://launchpad.net/ubuntu/+source/ubuntu-gnome-default-settings Files: * Copyright: Jeremy Bicha License: GPL-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, see . . On Debian systems, the complete text of the GNU General Public License can be found in `/usr/share/common-licenses/GPL-2'. ubuntu-gnome-default-settings/debian/60-gnome.conf0000664000000000000000000000004212310475506017273 0ustar [SeatDefaults] user-session=gnome ubuntu-gnome-default-settings/debian/plymouth-theme-ubuntu-gnome-logo.postinst0000664000000000000000000000230412310475506025246 0ustar #!/bin/sh -e # This script can be called in the following ways: # # After the package was installed: # configure # # # If prerm fails during upgrade or fails on failed upgrade: # abort-upgrade # # If prerm fails during deconfiguration of a package: # abort-deconfigure in-favour # removing # # If prerm fails during replacement due to conflict: # abort-remove in-favour case "$1" in configure) update-alternatives \ --install /lib/plymouth/themes/default.plymouth default.plymouth \ /lib/plymouth/themes/ubuntu-gnome-logo/ubuntu-gnome-logo.plymouth 150 \ --slave /lib/plymouth/themes/default.grub default.plymouth.grub \ /lib/plymouth/themes/ubuntu-gnome-logo/ubuntu-gnome-logo.grub if which update-initramfs >/dev/null 2>&1 then update-initramfs -u fi if [ -e /boot/grub/grub.cfg ] && which update-grub2 >/dev/null 2>&1 then update-grub2 fi ;; abort-upgrade|abort-deconfigure|abort-remove) ;; *) echo "$0 called with unknown argument \`$1'" 1>&2 exit 1 ;; esac #DEBHELPER# exit 0 ubuntu-gnome-default-settings/debian/plymouth-theme-ubuntu-gnome-text.postrm0000664000000000000000000000021312310475506024730 0ustar #!/bin/sh set -e if [ "x$1" = xremove ]; then if which update-initramfs >/dev/null 2>&1 then update-initramfs -u fi fi #DEBHELPER# ubuntu-gnome-default-settings/debian/plymouth-theme-ubuntu-gnome-text.triggers0000664000000000000000000000003212310475506025231 0ustar interest /etc/lsb-release ubuntu-gnome-default-settings/webbrowser/0000775000000000000000000000000012310475506016037 5ustar ubuntu-gnome-default-settings/usr/0000775000000000000000000000000012310475506014467 5ustar ubuntu-gnome-default-settings/usr/share/0000775000000000000000000000000012310475506015571 5ustar ubuntu-gnome-default-settings/usr/share/gnome/0000775000000000000000000000000012310475506016676 5ustar ubuntu-gnome-default-settings/usr/share/gnome/applications/0000775000000000000000000000000012310475506021364 5ustar ubuntu-gnome-default-settings/usr/share/gnome/applications/display.im6.desktop0000664000000000000000000000011512310475506025113 0ustar [Desktop Entry] Exec=/usr/bin/display.im6 %f Type=Application NoDisplay=true ubuntu-gnome-default-settings/usr/share/gnome/applications/debian-uxterm.desktop0000664000000000000000000000007412310475506025524 0ustar [Desktop Entry] Exec=uxterm Type=Application NoDisplay=true ubuntu-gnome-default-settings/usr/share/gnome/applications/debian-xterm.desktop0000664000000000000000000000007312310475506025336 0ustar [Desktop Entry] Exec=xterm Type=Application NoDisplay=true ubuntu-gnome-default-settings/usr/share/xul-ext/0000775000000000000000000000000012310475506017177 5ustar ubuntu-gnome-default-settings/usr/share/xul-ext/ubufox/0000775000000000000000000000000012310475506020507 5ustar ubuntu-gnome-default-settings/usr/share/xul-ext/ubufox/defaults/0000775000000000000000000000000012310475506022316 5ustar ubuntu-gnome-default-settings/usr/share/xul-ext/ubufox/defaults/preferences/0000775000000000000000000000000012310475506024617 5ustar ubuntu-gnome-default-settings/usr/share/xul-ext/ubufox/defaults/preferences/001ubuntu-gnome-mods.js0000664000000000000000000000050412310475506030762 0ustar // Place your global Firefox preferences in this file if you are using // ubufox. Especially those preferences defined in ubufox need to be configured // here to become effective. // Example: Homepage pref("browser.startup.homepage", "file:/usr/share/xul-ext/ubufox/defaults/preferences/ubuntu-gnome-homepage.properties"); ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootubuntu-gnome-default-settings/usr/share/xul-ext/ubufox/defaults/preferences/ubuntu-gnome-homepage.propertiesubuntu-gnome-default-settings/usr/share/xul-ext/ubufox/defaults/preferences/ubuntu-gnome-homepage.pr0000664000000000000000000000015712310475506031375 0ustar # to test, just enable the example homepage pref in /etc/xul-ext/ubufox.js browser.startup.homepage=about:home ubuntu-gnome-default-settings/lib/0000775000000000000000000000000012310475506014424 5ustar ubuntu-gnome-default-settings/lib/plymouth/0000775000000000000000000000000012310475506016305 5ustar ubuntu-gnome-default-settings/lib/plymouth/ubuntu-gnome_logo.png0000664000000000000000000002335012310475506022463 0ustar PNG  IHDR{:QMvsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATx{eGUs}\sW9ӻ>gUfU}5kYz~ &` scT` &` O0L0 O0L0 O09` &^滑O>/dF &`;UЙLŸ` F4TBrBXvŸ` VxZ&qљH^" xXLRD ~:Tys%HPwg 8Υ1A;G[|W#Qɪg$׵my,wf]%<-VHۏjęL"u\ O{ZbG}qTwgfo"a$զ-ٔJzس캔k~mwAE3kI3lq}XuWbo'?Ⱦ.O?Pݷ 4NHx9&ӕKu9JE϶i/kS륿 -o m*ߔ_.\.D" uf c>t3,F귵l:wP?} T9b}/d2Qv%@,/W-rdWk W*O'RMdٔ_E.>:Tb|= `}!p>OYt%3l V_CrLȾQ$Zn.+Ȗ:.Wt-Qww"p(?c҄AAD"In&\]}WT=꓋/,uy\9Ճ|~]|^ !/_o]ƽ']/o=go~ e˘iׁorόQ:8w\xpkH_RnA6<xf{2YDI;ۀjgga{7(Yc])0pz"&H MP!Ped5\"TO8|s0R lڇX;cQWY[Ŕ#wQz4:LcD._Bʣ<}YaL}X?]y_ 3up= ˕89;逮&6[  D?n^XHN 23F$rl{ uq7"uߓp i Ÿ"T-_q;/ vP1FIMq'f1_Mts3päIOZm&u) ?Y=bm*vw9a(&)Ҟ"ƕ̦+MۆbՔkc2P^\W)߬sv-CJK4`r=_ Ո˫0{ID#zM&uVnd8Fjax5?0`lH-x-p|. CdCہhue]0]=Km=rwOa53}?ҸClbתo=_!`~q!ΫQ z>wބtNP=jFìruϿy,1 0ۨ}!y^G:2d2O(}>K *uK2{ q=ɿ߮%\ |/F2c&ߨDH.^ـ~fV TsZ LO7 Q"/E<`&v$ۋ3a74˘'3ܔV=ԉ>Wӭ E-zuKHD?]R獡V-z-J,/KCz2=y4#OH<6:YL*$o41j?1d<3Ml7i?NrBia`6OaŅDޏip4> %bM ^&WafXȿ`>ӱOiH0:6Z,f,I+eڿE^`Ԇo4>L Vo^.cZ|AM͖C}iv^uux7䬺lK<| 4Oaiv~UnQ̮('7c˹$Bۍ5O? dk~i>b}%UrZvTm>`SU#(hӝ$"Ŵ N6{{lrf9e F~5KM8/ O—`8mwQ_AJ l=f욨z=~Ɔ_ʼn!%\E41q)?3l}),rF,?Fbk^gRgS] f‰8}=QRý1x,.W&3,ehgCF&EN$Vc{k7?@} ǥdr>X'R2;N^apаr "X ~QUx?=kIA4Dq2yҘLj ހQ\;U>BPi>vTux݈8;ļSI]CXul3K|.i'js</a?3}6!յ#XW4 WbqgaJ&έ4DZS_V׾pVO%\G~,P؀9&h`mU!Mv>HRi8fۗ%80߅j^[q'ih1Ndu'RnQZQSb丁:DV*o{BL;ݎiszwpf%x_9`2 \Kݘ}d񚻶Mgܴ˰ȓX{H~z%$:L| ." r>Dd+|^q? 5 *1 U>PZ+`lnH]~Y;unpyrL;dGxM2vP\ ?iaZ!W c0$<6$;d45E<9-Y1RGi޾svl}ڨE#s>- {%&Y)HNm"kIlKg1Y܌8r-1% F]t$t656P})8pOVT/s`&UzG6OIv>vc`S\P,O`EIr2svN*'f,!c{u0=G4?ЊɎ>Ky5&w\+Y oQ_Y>cys٧Yv 60Ue f؅I|vc 3 ]Aڴsvj#$_Gy#U)c++fRUkrYD!PC*ܳns_'"Ɖ셦myfX>`.+wǖScZ`K2!"gwd[>L4*},"@8eNlPݣՃ_nzRE^sXi[8O&'El誯svaʾbLV34>J 7 zg.V(O}2c G\Eh%[5D(Bo[+C:9hLrҦ="2u3zAx yc{o8i2nmGoBejҟ %Q$ ^_ d5X}N$HX)s%Ml=G,{4=:ttm\ }Rd6_弩чOUW~iR6pvgGSB$ʸcKad*'{1e&GH{wqbMXƇEzާ=a 5 zoF̌sR,cʓ?Hi W<{QBΟ:`6OQ0R?ǽ>ڄd5xL^-ѯ޾>,2aC}e~fmObK [_ƧyL; o6W3%a7ׄ֓&Mr%?fp֓0g:" 'U9'{u /> w`cNƽxNMU9`۾{S[1m ̚bKAa1|}loe;F]/ b,Eެw [4w)7='y? wT}2# F٩VX`L&jD u >ba`o0glk cqҠa.3==H<p.~fz4ɜ'p9l.I2m=<7~mywj)}#Q?at ƈ_a铖˘f9rhIW(;2x,v,ٟYGݱtnR#F77Gj)E ,Kڃ -k:iq"D.yI?G>NA& كzW8+yް4mmi%1*"6HLUeq>!,4n=u#w-x2am~05 1oGܾwStbEK<J UֽdXՆGC}tYw=ԧGfC߽s//-acV}]^y#$:ZrUf ҏ7vΣLe[XhtSd$g/a *wܮtl"9D:N J4iu#Ԓ6~Q)TdWmcGW]W%Hq${u̜e4[=p y|#xpRof\8<|[E6zM< 7%:O`!{%L߄oo mF!_-=|2vlr[GZ̑NhJ&>l ًHom`/vw2onOʞ0|O0Ndcr.&9jxߨ-9|QH?ٟ3D|}F]Q j'0_2q?ѶMVQ.m7I=/|dM%2(#=bV.P>1bl:XDzɍ&$\@{ >cQ{4G 2ɶJYjmV2b }b6SA~_EO杪~(ܦH;\aIu܂#@ңLoR^k4u;&)]7꿍$S>.7w":_9]aW۰EM焴AB횕32s.y{3ϻOMFzԈwbCg =#M!9|%fw)?$ӆlN,# muhsXAb&e},h`oFLI)R7ފ^ɠd9TDZxQl ^cƪ.&,2H[{ 알%9lOEE F^9uoqVDs$jNk: l9kITA9S(86vS]>#\=E5-yF~61"qxh`<ؠ}`g҄IQoҹT2=ئ!-$SJNCՠzxMTmsDnS,v,{0Mq P_ fc:`nƔkizV\bj ф#{ƪ40jνUb5c>Eގi`Z4F0SO\b*o!З`X'K8N߻Ɂoä(a+`/f_Ӕa0WJ"v%p-qrf-*ziʼ2 ? I67)k@grS~9J!ӄ)q[G,!?>y '1W} f/z_ va{w-Q!u[4o+A$?"z#]wJ1.d卷{Ix+vΐf-|rg>T>1GM2bx#ſG"LcڍK@hf ܽMG2k .O9 ISXv_r9-}߈٣c<^!xd1+EӢړB^VH3Xz-?$*M{ <_]J-v^eYIDAT#C2*J0c$ߪ%ꌙJd jEDv;731]Xj b_Rغ^L+'fogنs,tYB\-󚣶G7 nks4·qc Dn95C6w(W܃$ӆRhƀ9Gxs!/.wfa؃iWZ pQu|$!v#OF ,:Ꮛfڽ4-R/(M3G݂w`NSkG0M /?8/nlz Q|Iۛ =ބE;B_BA}03WL6ciZ}Cx/^?adc&zG($*T3eeIi;>5J<ފɯ".l~X΅KI"9}]}vfAN\>a%l+ A ~!B7/)ZlO&#i:J )R1zW*}ؒcAtVBFwV:wN3uipMUh/ ݽ&]/;g\z-O9]aN'bAl@=Lz=v|/9.l96i~8N"R,b K$Y#wDr-i~ɷB5v6{GEEo̤ ~co7.o#)R.P/cԯ֒Yegy>ꢉԏ QqU a\^qǪHڇqf+1Ey{S)%RQYy״E>o */ o$bH/pʥnWoe.AmewvMԎs>wF N^V9y!^VZ%/0>?M1ǘ/ָ]^Wzc8BMVj*J(ʯc5g^c=.G;L~_"l=mgx;'Ψ ^1jT/(\Qţ!Te%[$(K_bȳTV/6'ә+G^ш9IO#=ryrR=c~gWVl3Vz2h\]`14u1ڭK;W y';"C.'h. 6 5R9sʥ/#sΎZUd˒S4|ϧJe͍\6mQMȵO@H뒓Ok.D.8;$ oHĎ6~aϊߥg{^|Jimj#ݰvsd#ær符b^]XMڦsRiJiۦQt {!\Ktl[ .y&09]F!8Y} t)jڼ)}俚^m ;NXDL0!ř?KIENDB`ubuntu-gnome-default-settings/lib/plymouth/themes/0000775000000000000000000000000012310475506017572 5ustar ubuntu-gnome-default-settings/lib/plymouth/themes/ubuntu-gnome-logo/0000775000000000000000000000000012310475506023155 5ustar ubuntu-gnome-default-settings/lib/plymouth/themes/ubuntu-gnome-logo/progress_dot_on16.png0000664000000000000000000000023512310475506027240 0ustar PNG  IHDR7PLTE-35?CbKGDH pHYs B(xtIME;?_IDATc`000c``A '`MIENDB`ubuntu-gnome-default-settings/lib/plymouth/themes/ubuntu-gnome-logo/ubuntu-gnome-logo.plymouth0000664000000000000000000000040412310475506030341 0ustar [Plymouth Theme] Name=Ubuntu GNOME Logo Description=A theme that features a blue blinds animated background. ModuleName=script [script] ImageDir=/lib/plymouth/themes/ubuntu-gnome-logo ScriptFile=/lib/plymouth/themes/ubuntu-gnome-logo/ubuntu-gnome-logo.script ubuntu-gnome-default-settings/lib/plymouth/themes/ubuntu-gnome-logo/progress_dot_on.png0000664000000000000000000000045612310475506027076 0ustar PNG  IHDRsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8Ք 0E,2xXa-)qp($Orc{AGs9x*Ցit Z!vIIҢw|jׄk4m_$>sw 8-VzsSX[i#oIߔ@X9j9-ٽnDʭ ,2IENDB`ubuntu-gnome-default-settings/lib/plymouth/themes/ubuntu-gnome-logo/ubuntu_gnome_logo16.png0000664000000000000000000000221512310475506027561 0ustar PNG  IHDRdd̈g0PLTE/46:?ADIKQUW]bdglnty{^bKGDH pHYs B(xtIME-'WIDATXåXkAަMLjb=+j%4oJC82gF ^N4vRv2ą(.\zV#?D_/!8i@O RFϝ0bSM iDK!y`#~|Zt5U` 5 v9>HDɦ@?gߗQ(LY wɺ-30"JNP9k2/E 92)oB_i;P6P{Cu,3VI fPIAU`-c>㱧nڴ{,K bwL?Ti6t|',f*xxDUJ`pu۷ƈ2ƥ0i&. A{n"F⫲t}AP!"%I;);6Q, JO%UArK+9yAP#ҟxhynU4j-Q[#VT,D1(Zi%,MZBJ_bmwG񽷽;;seL)mLoVBU@Q \CX<:7<2ZAG^;y@-g97B!V`>08u!yXEp)-2Mn`1 ]\|uf[2d-+Yfu׀UYe@&gxX ^N;,2#gvM3r'S#-ѷ~4;VhF2WV +4>Y\I*ᕂMH?bz0&GsDžqNM n ^s뮨i!-5߅aם(iT?6?b;k*ZYm?̬lmޢcV͚3{̮6yft6!¦@dfb}˺8?66!FY0mf;c"K3_SlOO69fwna>8Q+i ̻-ugK#\IҸRL_>!QRO %4i撗uY" $S.ܜzP~'kp{.lK̏W. (zsgݞn qm6>lNIP w g|x'4D+Z/94~iE:X^緵>w29D} |)~܎~[zx~9Az7+/c^[Q]+Ȣ% ؅hϏyy C+;=1 v-]wz{iڼfvO|f<ތP|n'|3{#Bzi1|!32wSL-[x?MsU<^w~| .+< !8\U#=o<71Cc`.Je;y.#!ԲXU ~cå/9#M'eP2XS}eeջ /%yH_q, *2h'n[ZɻPڈ~rIA78? =S;M (m*SQo $@6IǕD34SHaƓuI(HuZKgʍ%,>vkGLҨQBFg?%0l>I1MߋLx 5Ꮣ?_h1oFټ/v_qO,-g0xh\xNyW9*!MJ6oXsο%ridfgy-BwI}JּzX^>Mq2S4xcE }7.Sq<(hwAjnBWlCF\/$ygQH `w95ҊЯϱ 캅%+0:] ub({(yYF*M2(0'噔MRG~#΍q]`)1v%dHZF/ kģ^y6YqqiF(YOv ! LJ9 օ/GV,2]Qn ^is=/eQ"}HK8 =(NLq((H3s91'a'¹གྷ>+?|)!ϬV/҃c>qZYAESu 3!;\Dm5#\@p~UU^,G.,RQ: ^ŝH5"vGL/k 7 ޿ALm|Jj܃'"fu1 yQ ߪ.؍~Fc\C#9 w4\gzn5>i6T~i[7C`xzƯExAHqmF$Q ɈH }<]OԥM})t8Cn~_rX.<; H%7i`+hdJ9.uryGX*FSî{ e`4e¥dn50/\/[Fa^o(t+aDuYM:FʽG 0xvY ^~:V*6,Z&3uPHUD]Lj"^TNiKe߃J i~,C T-u"kpގ؀ˑ / NѴJep z ^P6:Y7N]=ʄ,Cuѕ$4p{PO:Z AbS9VV>}sT,p*8d%T4ց ꭘvS)Ѳ ifi."wY|C܎cY,QҊVJ:21Zc<Re0yR!V [$[|26y fd4*߁F؏qCQRK u)WnoB`).TQ ^PvoGVA.\w^L?}$xpCIENDB`ubuntu-gnome-default-settings/lib/plymouth/themes/ubuntu-gnome-logo/ubuntu-gnome-logo.script0000664000000000000000000011307612310475506027776 0ustar # ubuntu-gnome-logo.script - boot splash plugin # # Copyright (C) 2013 Canonical Ltd. # # 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, 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. # # Written by: Alberto Milone # Adapted to Ubuntu GNOME by: Alfredo Hernández # # Based on the example provided with the "script plugin" written by: # Charlie Brej # # Question stuff written by: Markus Waas # # Set the text colour in (RGB / 256) text_colour.red = 1.0; text_colour.green = 1.0; text_colour.blue = 1.0; # Tinted text #ffffff tinted_text_colour.red = 1.0; tinted_text_colour.green = 1.0; tinted_text_colour.blue = 1.0; # Action Text - #ffffff action_text_colour.red = 1.0; action_text_colour.green = 1.0; action_text_colour.blue = 1.0; # Blue - #0087ed debugsprite = Sprite(); debugsprite_bottom = Sprite(); debugsprite_medium = Sprite(); # Are we currently prompting for a password? prompt_active = 0; # General purpose function to create text fun WriteText (text, colour) { image = Image.Text (text, colour.red, colour.green, colour.blue); return image; } fun ImageToText (text) { image = WriteText (text, text_colour); return image; } fun ImageToTintedText (text) { image = WriteText (text, tinted_text_colour); return image; } fun ImageToActionText (text) { image = WriteText (text, action_text_colour); return image; } fun Debug(text) { debugsprite.SetImage(ImageToText (text)); } fun DebugBottom(text) { debugsprite_bottom.SetImage(ImageToText (text)); debugsprite_bottom.SetPosition(0, (Window.GetHeight (0) - 20), 1); } fun DebugMedium(text) { debugsprite_medium.SetImage(ImageToText (text)); debugsprite_medium.SetPosition(0, (Window.GetHeight (0) - 60), 1); } fun TextYOffset() { local.y; local.text_height; local.min_height; # Put the 1st line below the logo + some spacing y = logo.y + logo.height + (progress_indicator.bullet_height * 7); # + logo_spacing; text_height = first_line_height * 7.5; min_height = Window.GetHeight(); if (y + text_height > min_height) y = min_height - text_height; if (y < progress_indicator.y + progress_indicator.height) return progress_indicator.y + progress_indicator.height; return y; } #------------------------------String functions------------------------------- # This is the equivalent for strstr() fun StringString(string, substring) { start = 0; while (String(string).CharAt (start)) { walk = 0; while (String(substring).CharAt (walk) == String(string).CharAt (start + walk) ) { walk++; if (!String(substring).CharAt (walk)) return start; } start++; } return NULL; } fun StringLength (string) { index = 0; while (String(string).CharAt(index)) index++; return index; } fun StringCopy (source, beginning, end) { local.destination = ""; for (index = beginning; ( ( (end == NULL) || (index <= end) ) && (String(source).CharAt(index)) ); index++) { local.destination += String(source).CharAt(index); } return local.destination; } fun StringReplace (source, pattern, replacement) { local.found = StringString(source, pattern); if (local.found == NULL) return source; local.new_string = StringCopy (source, 0, local.found - 1) + replacement + StringCopy (source, local.found + StringLength(pattern), NULL); return local.new_string; } # it makes sense to use it only for # numbers up to 100 fun StringToInteger (str) { int = -1; for (i=0; i<=100; i++) { if (i+"" == str) { int = i; break; } } return int; } #--------------------------------------Background functions -------------------------- noise.image = Image ("noise-texture.png"); fun draw_bg () { noise.i = 0; noise.j = 0; while (noise.j*256 < Window.GetHeight ()) { while (noise.i*256 < Window.GetWidth ()) { noise.sprite[noise.i][noise.j] = Sprite (); noise.sprite[noise.i][noise.j].SetImage (noise.image); noise.sprite[noise.i][noise.j].SetX (noise.i*256); noise.sprite[noise.i][noise.j].SetY (noise.j*256); noise.i++; } noise.i = 0; noise.j++; } } Window.SetBackgroundTopColor (0.18, 0.20, 0.21); # Nice colour on top of the screen fading to Window.SetBackgroundBottomColor (0.18, 0.20, 0.21); # an equally nice colour on the bottom #----------------------------------------------------------------------------- bits_per_pixel = Window.GetBitsPerPixel (); if (bits_per_pixel == 4) { logo_filename = "ubuntu_gnome_logo16.png"; progress_dot_off_filename = "progress_dot_off16.png"; progress_dot_on_filename = "progress_dot_on16.png"; password_field_filename = "password_field16.png"; question_field_filename = "password_field16.png"; } else { logo_filename = "ubuntu_gnome_logo.png"; progress_dot_off_filename = "progress_dot_off.png"; progress_dot_on_filename = "progress_dot_on.png"; password_field_filename = "password_field.png"; question_field_filename = "password_field.png"; } logo.image = Image (logo_filename); logo.sprite = Sprite (); logo.sprite.SetImage (logo.image); logo.width = logo.image.GetWidth (); logo.height = logo.image.GetHeight (); logo.x = Window.GetX () + Window.GetWidth () / 2 - logo.width / 2; logo.y = Window.GetY () + Window.GetHeight () / 2 - logo.height; logo.z = 1000; logo.sprite.SetX (logo.x); logo.sprite.SetY (logo.y); logo.sprite.SetZ (logo.z); logo.sprite.SetOpacity (1); draw_bg (); # Spacing below the logo - in pixels logo_spacing = logo.height * 4; message_notification[0].image = ImageToTintedText (""); message_notification[1].image = ImageToTintedText (""); fsck_notification.image = ImageToActionText (""); status = "normal"; progress_indicator.bullet_off = Image (progress_dot_off_filename); progress_indicator.bullet_on = Image (progress_dot_on_filename); progress_indicator.bullet_width = progress_indicator.bullet_off.GetWidth (); progress_indicator.bullet_height = progress_indicator.bullet_off.GetHeight (); progress_indicator.bullet_hspacing = progress_indicator.bullet_width * 1.35; progress_indicator.width = progress_indicator.bullet_width * 3.6; progress_indicator.height = progress_indicator.bullet_height; progress_indicator.y = logo.y + logo.height + (logo.height / 3); progress_indicator.x = Window.GetX () + Window.GetWidth () / 2 - progress_indicator.width / 2; # logo.x + 26; # use a fixed string with ascending and descending stems to calibrate the # bounding box for the first message, so the messages below don't move up # and down according to *their* height. first_line_height = ImageToTintedText ("AfpqtM").GetHeight(); # if the user has a 640x480 or 800x600 display, we can't quite fit everything # (including passphrase prompts) with the target spacing, so scoot the text up # a bit if needed. top_of_the_text = TextYOffset(); #-----------------------------------------Logo functions------------------------------ # Call this when updating the screen fun draw_logo () { logo.sprite.SetX (logo.x); logo.sprite.SetY (logo.y); logo.sprite.SetZ (logo.z); logo.sprite.SetOpacity (1); } #-----------------------------------------Progress Indicator-------------------------- fun set_progress_indicator () { # Here we assume that we can store half bullets on each half of the screen # together with some spacing local.x = progress_indicator.x; for (index = 0; index <= 2; index++) { # Set the "off" bullets progress_indicator.bullets_off[index].sprite = Sprite (progress_indicator.bullet_off); progress_indicator.bullets_off[index].sprite.SetPosition (local.x, progress_indicator.y, 1000); progress_indicator.bullets_off[index].x = local.x; progress_indicator.bullets_off[index].y = progress_indicator.y; progress_indicator.bullets_off[index].sprite.SetOpacity (1); #local.debug_medium_string = "Progress indicator " + index + ": x = " + progress_indicator.bullets_off[index].x + # ", y = " + progress_indicator.bullets_off[index].y + ", logo width = " + logo.width + # ", logo height = " + logo.height + " " + screen_width + " " + screen_height; # #(index % 2) && DebugMedium (local.debug_medium_string) || DebugBottom (local.debug_medium_string); # Set the "on" bullets on top of the "off" bullets and make them transparent progress_indicator.bullets_on[index].sprite = Sprite (progress_indicator.bullet_on); progress_indicator.bullets_on[index].x = progress_indicator.bullets_off[index].x; progress_indicator.bullets_on[index].y = progress_indicator.bullets_off[index].y; progress_indicator.bullets_on[index].sprite.SetPosition (progress_indicator.bullets_on[index].x, progress_indicator.bullets_on[index].y, 10000); progress_indicator.bullets_on[index].sprite.SetOpacity (0); local.x += progress_indicator.bullet_hspacing; } #local.debug_string = "Progress indicator: x1 = " + progress_indicator.x + ", x2 = " + local.x + ", y = " + progress_indicator.y + # ", x logo = " + logo.x + ", y logo = " + logo.y + ", indicator width = " + progress_indicator.width; #Debug(progress_indicator.bullets_off[0].x); } # We have 2 bullets, one on top of the other: # The white one is on top of the red one and the former should # slowly fade so as to get a nice transition effect. fun switch_on_bullet (bullets_off, bullets_on, bullet_number, opacity) { local.x = bullets_on[bullet_number].x; local.y = bullets_on[bullet_number].y; local.z = bullets_on[bullet_number].z; # Hide the bullets which are off bullets_off[bullet_number].sprite.SetOpacity (0); # Show the bullets which are on bullets_on[bullet_number].sprite.SetPosition (local.x, local.y, local.z); bullets_on[bullet_number].sprite.SetOpacity (opacity); # Bump the number of times we have switched on bullets global.times_bullets_switched++; } fun switch_off_bullets () { # Debug("Switching off progress indicator"); set_progress_indicator (); global.times_bullets_switched = 0; global.on_off = 1; } # This is something that we can call when we exit fun switch_on_bullets () { # Debug("Switching off progress indicator"); if (!global.progress_indicator.bullets_on) set_progress_indicator (); local = global.progress_indicator; for (index = 0; bullets_on[index]; index++) { switch_on_bullet (bullets_off, bullets_on, index, 1.0); } } # Implement in boot progress callback fun animate_progress_indicator (progress, time) { if (global.progress_time == NULL) { global.progress_time = progress; #time; switch_off_bullets (); } # Debug ("progress = " + progress + ", time = " + time + " times switched = " + global.times_bullets_switched + " on_off " + global.on_off); # if (global.times_bullets_switched == NULL) # global.times_bullets_switched = 3; # if (global.on_off == NULL) # global.on_off = 0; if ((progress - global.progress_time) >= 1.0) { global.progress_time = progress; if (global.times_bullets_switched == 3) { # Change which bullets are switched on # and which ones are switched off global.on_off = !global.on_off; global.times_bullets_switched = 0; } if (global.on_off) { switch_on_bullet (progress_indicator.bullets_off, progress_indicator.bullets_on, global.times_bullets_switched, 1.0); } else { switch_on_bullet (progress_indicator.bullets_on, progress_indicator.bullets_off, global.times_bullets_switched, 1.0); } } # Start setting bullets to "on" with translucency # for (index = 0; index <= 5; index++) { # opacity = 0.0; # while (opacity <= 1.0) { # switch_on_bullet (progress_indicator.bullets_off, progress_indicator.bullets_on, # index, opacity); # opacity += 0.1; # } # } } #-----------------------------------------Label utility functions--------------------- # label should be either a string or NULL # Images for n lines will be created and returned as items of the # message_label array # fun get_message_label (label, is_fake, is_action_line) { # Debug("Get Label position"); local.message_label; if (is_fake) # Create a fake label so as to get the y coordinate of # a standard-length label. local.message_image = ImageToTintedText ("This is a fake message"); else local.message_image = (is_action_line) && ImageToActionText (label) || ImageToTintedText (label); message_label.width = message_image.GetWidth (); message_label.height = message_image.GetHeight (); # Center the line horizontally message_label.x = Window.GetX () + Window.GetWidth () / 2 - message_label.width / 2; message_label.y = top_of_the_text; # Put the 2nd line below the fsck line if (is_action_line) { local.fsck_label.y = message_label.y + (first_line_height + first_line_height / 2); message_label.y = local.fsck_label.y + (first_line_height * 2); } # Debug("action label x = " + message_label.x + " y = " + message_label.y); # message_debug = "msg_x = " + message_label.x + " msg_y = " + message_label.y + # "msg_width = " + message_label.width + " msg_height = " + # message_label.height + " message = " + label; # Debug(message_debug); return message_label; } # Create an fsck label and/or get its position fun get_fsck_label (label, is_fake) { # Debug("Get Label position"); local.fsck_label = global.progress_label; if (is_fake) fsck_label.image = ImageToTintedText ("This is a fake message"); else fsck_label.image = ImageToTintedText (label); fsck_label.width = fsck_label.image.GetWidth (); fsck_label.height = fsck_label.image.GetHeight (); # Centre the label horizontally fsck_label.x = Window.GetX () + Window.GetWidth () / 2 - fsck_label.width / 2; local.first_label = get_message_label (label, 1, 0); # Place the label below the 1st message line fsck_label.y = local.first_label.y + local.first_label.height + (local.first_label.height / 2); # message_debug = "msg_x = " + fsck_label.x + " msg_y = " + fsck_label.y + # "msg_width = " + fsck_label.width + " msg_height = " + # fsck_label.height + " message = " + label; # Debug(message_debug); return fsck_label; } #-----------------------------------------Message stuff -------------------------------- # # Set up a message label # # NOTE: this is called when doing something like 'plymouth message "hello world"' # fun setup_message (message_text, x, y, z, index) { # Debug("Message setup"); global.message_notification[index].image = (index) && ImageToActionText (message_text) || ImageToTintedText (message_text); # Set up the text message, if any message_notification[index].x = x; message_notification[index].y = y; message_notification[index].z = z; message_notification[index].sprite = Sprite (); message_notification[index].sprite.SetImage (message_notification[index].image); message_notification[index].sprite.SetX (message_notification[index].x); message_notification[index].sprite.SetY (message_notification[index].y); message_notification[index].sprite.SetZ (message_notification[index].z); } fun show_message (index) { if (global.message_notification[index].sprite) global.message_notification[index].sprite.SetOpacity(1); } fun hide_message (index) { if (global.message_notification[index].sprite) global.message_notification[index].sprite.SetOpacity(0); } # the callback function is called when new message should be displayed. # First arg is message to display. fun message_callback (message) { # Debug("Message callback"); is_fake = 0; if (!message || (message == "")) is_fake = 1; local.substring = "keys:"; # Look for the "keys:" prefix local.keys = StringString(message, local.substring); local.is_action_line = (keys != NULL); #Debug("keys " + local.keys + " substring length = " + StringLength(local.substring)); # Get the message without the "keys:" prefix if (keys != NULL) message = StringCopy (message, keys + StringLength(local.substring), NULL); local.label.is_fake = is_fake; label = get_message_label(message, is_fake, is_action_line); label.z = 10000; setup_message (message, label.x, label.y, label.z, is_action_line); if (prompt_active && local.is_action_line) hide_message (is_action_line); else show_message (is_action_line); } #-----------------------------------------Display Password stuff ----------------------- # fun password_dialogue_setup (message_label) { # Debug("Password dialog setup"); local.entry; local.bullet_image; bullet_image = Image (progress_dot_off_filename); entry.image = Image (password_field_filename); # Hide the normal labels prompt_active = 1; if (message_notification[1].sprite) hide_message (1); # Set the prompt label label = get_message_label(message_label, 0, 1); label.z = 10000; setup_message (message_label, label.x, label.y, label.z, 2); show_message (2); # Set up the text entry which contains the bullets entry.sprite = Sprite (); entry.sprite.SetImage (entry.image); # Centre the box horizontally entry.x = Window.GetX () + Window.GetWidth () / 2 - entry.image.GetWidth () / 2; # Put the entry below the second label. entry.y = message_notification[2].y + label.height; #Debug ("entry x = " + entry.x + ", y = " + entry.y); entry.z = 10000; entry.sprite.SetX (entry.x); entry.sprite.SetY (entry.y); entry.sprite.SetZ (entry.z); global.password_dialogue = local; } fun password_dialogue_opacity (opacity) { # Debug("Password dialog opacity"); global.password_dialogue.opacity = opacity; local = global.password_dialogue; # You can make the box translucent with a float # entry.sprite.SetOpacity (0.3); entry.sprite.SetOpacity (opacity); label.sprite.SetOpacity (opacity); if (bullets) { for (index = 0; bullets[index]; index++) { bullets[index].sprite.SetOpacity (opacity); } } } # The callback function is called when the display should display a password dialogue. # First arg is prompt string, the second is the number of bullets. fun display_password_callback (prompt, bullets) { # Debug("Password dialog setup"); global.status = "password"; if (!global.password_dialogue) password_dialogue_setup(prompt); password_dialogue_opacity (1); bullet_width = password_dialogue.bullet_image.GetWidth(); bullet_y = password_dialogue.entry.y + password_dialogue.entry.image.GetHeight () / 2 - password_dialogue.bullet_image.GetHeight () / 2; margin = bullet_width; spaces = Math.Int( (password_dialogue.entry.image.GetWidth () - (margin * 2) ) / (2 * bullet_width / 3) ); #Debug ("spaces = " + spaces + ", bullets = " + bullets); bullets_area.width = margin + spaces * (2 * bullet_width / 3); bullets_area.x = Window.GetX () + Window.GetWidth () / 2 - bullets_area.width / 2; #DebugBottom ("pwd_entry x = " + password_dialogue.entry.x + ", bullets_area.x = " + bullets_area.x + ", bullets_area.width = " + bullets_area.width); if (bullets > spaces) bullets = spaces; for (index = 0; password_dialogue.bullets[index] || index < spaces ; index++){ if (!password_dialogue.bullets[index]) { password_dialogue.bullets[index].sprite = Sprite (); password_dialogue.bullets[index].sprite.SetImage (password_dialogue.bullet_image); password_dialogue.bullets[index].x = bullets_area.x + # password_dialogue.entry.x + margin + index * (2 * bullet_width / 3) ; password_dialogue.bullets[index].sprite.SetX (password_dialogue.bullets[index].x); password_dialogue.bullets[index].y = bullet_y; password_dialogue.bullets[index].sprite.SetY (password_dialogue.bullets[index].y); password_dialogue.bullets[index].z = password_dialogue.entry.z + 100 - index; password_dialogue.bullets[index].sprite.SetZ (password_dialogue.bullets[index].z); } password_dialogue.bullets[index].sprite.SetOpacity (0); if (index < bullets) { password_dialogue.bullets[index].sprite.SetOpacity (1); } } } Plymouth.SetDisplayPasswordFunction (display_password_callback); Plymouth.SetMessageFunction (message_callback); Plymouth.SetBootProgressFunction (animate_progress_indicator); # Plymouth.SetBootProgressFunction: the callback function is called with two numbers, the progress (between 0 and 1) and the time spent booting so far # Plymouth.SetRootMountedFunction: the callback function is called when a new root is mounted # Plymouth.SetKeyboardInputFunction: the callback function is called with a string containing a new character entered on the keyboard #----------------------------------------- FSCK Counter -------------------------------- # Initialise the counter fun init_fsck_count () { # The number of fsck checks in this cycle global.counter.total = 0; # The number of fsck checks already performed + the current one global.counter.current = 1; # The previous fsck global.counter.last = 0; } # Increase the total counter fun increase_fsck_count () { global.counter.total++; } fun increase_current_fsck_count () { global.counter.last = global.counter.current++; } # Clear the counter fun clear_fsck_count () { global.counter = NULL; init_fsck_count (); } #----------------------------------------- Progress Label ------------------------------ # Change the opacity level of a progress label # # opacity = 1 -> show # opacity = 0 -> hide # opacity = 0.3 (or any other float) -> translucent # fun set_progress_label_opacity (opacity) { # the label progress_label.sprite.SetOpacity (opacity); # Make the slot available again when hiding the bar # So that another bar can take its place if (opacity == 0) { progress_label.is_available = 1; progress_label.device = ""; } } # Set up a new Progress Bar # # TODO: Make it possible to reuse (rather than recreate) a bar # if .is_available = 1. Ideally this would just reset the # label, the associated # device and the image size of the sprite. fun init_progress_label (device, status_string) { # Make the slot unavailable global.progress_label.is_available = 0; progress_label.progress = 0; progress_label.device = device; progress_label.status_string = status_string; } # See if the progress label is keeping track of the fsck # of "device" # fun device_has_progress_label (device) { #DebugBottom ("label device = " + progress_label.device + " checking device " + device); return (progress_label.device == device); } # Update the Progress bar which corresponds to index # fun update_progress_label (progress) { # If progress is NULL then we just refresh the label. # This happens when only counter.total has changed. if (progress != NULL) { progress_label.progress = progress; #Debug("device " + progress_label.device + " progress " + progress); # If progress >= 100% hide the label and make it available again if (progress >= 100) { set_progress_label_opacity (0); # See if we any other fsck check is complete # and, if so, hide the progress bars and the labels on_fsck_completed (); return 0; } } # Update progress label here # # FIXME: the queue logic from this theme should really be moved into mountall # instead of using string replacement to deal with localised strings. label = StringReplace (progress_label.status_string[0], "%1$d", global.counter.current); label = StringReplace (label, "%2$d", global.counter.total); label = StringReplace (label, "%3$d", progress_label.progress); label = StringReplace (label, "%%", "%"); progress_label = get_fsck_label (label, 0); #progress_label.progress = progress; progress_label.sprite = Sprite (progress_label.image); # Set up the bar progress_label.sprite.SetPosition(progress_label.x, progress_label.y, 1); set_progress_label_opacity (1); } # Refresh the label so as to update counters fun refresh_progress_label () { update_progress_label (NULL); } #----------------------------------------- FSCK Queue ---------------------------------- # Initialise the fsck queue fun init_queue () { global.fsck_queue[0].device; global.fsck_queue[0].progress; global.fsck_queue.counter = 0; global.fsck_queue.biggest_item = 0; } fun clear_queue () { global.fsck_queue = NULL; init_queue (); } # Return either the device index in the queue or -1 fun queue_look_up_by_device (device) { for (i=0; i <= fsck_queue.biggest_item; i++) { if ((fsck_queue[i]) && (fsck_queue[i].device == device)) return i; } return -1; } # Keep track of an fsck process in the queue fun add_fsck_to_queue (device, progress) { # Look for an empty slot in the queue for (i=0; global.fsck_queue[i].device; i++) { continue; } local.index = i; # Set device and progress global.fsck_queue[local.index].device = device; global.fsck_queue[local.index].progress = progress; # Increase the queue counter global.fsck_queue.counter++; # Update the max index of the array for iterations if (local.index > global.fsck_queue.biggest_item) global.fsck_queue.biggest_item = local.index; #DebugMedium ("Adding " + device + " at " + local.index); } fun is_queue_empty () { return (fsck_queue.counter == 0); } fun is_progress_label_available () { return (progress_label.is_available == 1); } # This should cover the case in which the fsck checks in # the queue are completed before the ones showed in the # progress label fun on_queued_fsck_completed () { if (!is_queue_empty ()) return; # Hide the extra label, if any #if (progress_bar.extra_label.sprite) # progress_bar.extra_label.sprite.SetOpacity(0); } fun remove_fsck_from_queue (index) { # Free memory which was previously allocated for # device and progress global.fsck_queue[index].device = NULL; global.fsck_queue[index].progress = NULL; # Decrease the queue counter global.fsck_queue.counter--; # See if there are other processes in the queue # if not, clear the extra_label on_queued_fsck_completed (); } fun on_fsck_completed () { # We have moved on to tracking the next fsck increase_current_fsck_count (); if (!is_progress_label_available ()) return; if (!is_queue_empty ()) return; # Hide the progress label if (progress_label.sprite) progress_label.sprite.SetOpacity (0); # Clear the queue clear_queue (); # Clear the fsck counter clear_fsck_count (); } # Update an fsck process that we keep track of in the queue fun update_progress_in_queue (index, device, progress) { # If the fsck is complete, remove it from the queue if (progress >= 100) { remove_fsck_from_queue (index); on_queued_fsck_completed (); return; } global.fsck_queue[index].device = device; global.fsck_queue[index].progress = progress; } # TODO: Move it to some function # Create an empty queue #init_queue (); #----------------------------------------- FSCK Functions ------------------------------ # Either add a new bar for fsck checks or update an existing bar # # NOTE: no more than "progress_bar.max_number" bars are allowed # fun fsck_check (device, progress, status_string) { # The 1st time this will take place if (!global.progress_label) { # Increase the fsck counter increase_fsck_count (); # Set up a new label for the check init_progress_label (device, status_string); update_progress_label (progress); return; } if (device_has_progress_label (device)) { # Update the progress of the existing label update_progress_label (progress); } else { # See if there's already a slot in the queue for the device local.queue_device_index = queue_look_up_by_device(device); # See if the progress_label is available if (progress_label.is_available) { # local.my_string = "available index " + local.available_index + " progress_bar counter is " + progress_bar.counter; # Debug(local.my_string); # If the fsck check for the device was in the queue, then # remove it from the queue if (local.queue_device_index >= 0) { remove_fsck_from_queue (index); } else { # Increase the fsck counter increase_fsck_count (); } # local.my_string += local.message; #Debug("setting new label for device " + device + " progress " + progress); # Set up a new label for the check init_progress_label (device, status_string); update_progress_label (progress); } # If the progress_label is not available else { # If the fsck check for the device is already in the queue # just update its progress in the queue if (local.queue_device_index >= 0) { #DebugMedium("Updating queue at " + local.queue_device_index + " for device " + device); update_progress_in_queue (local.queue_device_index, device, progress); } # Otherwise add the check to the queue else { #DebugMedium("Adding device " + device + " to queue at " + local.queue_device_index); add_fsck_to_queue (device, progress); # Increase the fsck counter increase_fsck_count (); refresh_progress_label (); } } } # if (!is_queue_empty ()) { # DebugBottom("Extra label for "+ device); #} # else { # DebugBottom("No extra label for " + device + ". 1st Device in the queue "+ fsck_queue[0].device + " counter = " + global.fsck_queue.counter); # } } #-----------------------------------------Update Status stuff -------------------------- # # The update_status_callback is what we can use to pass plymouth whatever we want so # as to make use of features which are available only in this program (as opposed to # being available for any theme for the script plugin). # # Example: # # Thanks to the current implementation, some scripts can call "plymouth --update=fsck:sda1:40" # and this program will know that 1) we're performing and fsck check, 2) we're checking sda1, # 3) the program should set the label progress to 40% # # Other features can be easily added by parsing the string that we pass plymouth with "--update" # fun update_status_callback (status) { # Debug(status); if (!status) return; string_it = 0; update_strings[string_it] = ""; for (i=0; (String(status).CharAt(i) != ""); i++) { local.temp_char = String(status).CharAt(i); if (temp_char != ":") update_strings[string_it] += temp_char; else update_strings[++string_it] = ""; } # my_string = update_strings[0] + " " + update_strings[1] + " " + update_strings[2]; # Debug(my_string); # Let's assume that we're dealing with these strings fsck:sda1:40 if ((string_it >= 2) && (update_strings[0] == "fsck")) { device = update_strings[1]; progress = update_strings[2]; status_string[0] = update_strings[3]; # "Checking disk %1$d of %2$d (%3$d %% complete)" if (!status_string[0]) status_string[0] = "Checking disk %1$d of %2$d (%3$d %% complete)"; if ((device != "") && (progress != "")) { progress = StringToInteger (progress); # Make sure that the fsck_queue is initialised if (!global.fsck_queue) init_queue (); # Make sure that the fsck counter is initialised if (!global.counter) init_fsck_count (); # if (!global.progress_bar.extra_label.sprite) # create_extra_fsck_label (); # Keep track of the fsck check fsck_check (device, progress, status_string); } } } Plymouth.SetUpdateStatusFunction (update_status_callback); #-----------------------------------------Display Question stuff ----------------------- fun question_dialogue_setup (message_label, text_image) { #Debug("Question dialog setup"); local.field; local.content; local.margin; field.image = Image (question_field_filename); content = Sprite (); bullet_image = Image (progress_dot_off_filename); margin = bullet_image.GetWidth() / 2; # Hide the normal labels prompt_active = 1; if (message_notification[1].sprite) hide_message (1); # Set the prompt label label = get_message_label(message_label, 0, 1); label.z = 10000; setup_message (message_label, label.x, label.y, label.z, 2); show_message (2); # Set up the text field which contains the contents field.sprite = Sprite (); field.sprite.SetImage (field.image); # Centre the box horizontally field.x = Window.GetX () + Window.GetWidth () / 2 - field.image.GetWidth () / 2; content_x = field.x + margin; # Put the field below the second label. field.y = message_notification[2].y + label.height; content_y = field.y + field.image.GetHeight () / 2 - text_image.GetHeight () / 2; #Debug ("field x = " + field.x + ", y = " + field.y); field.z = 10000; field.sprite.SetX (field.x); field.sprite.SetY (field.y); field.sprite.SetZ (field.z); #Debug ("content_x = " + content_x + " content_y = " + content_y); content_z = field.z + 1; content.SetPosition (content_x, content_y, content_z); global.question_dialogue = local; } # The callback function is called when the display should display a question dialogue. # First arg is prompt string, the second is the field contents. fun display_question_callback (prompt, contents) { global.status = "question"; #Debug ("Reply: " + contents); textImage = ImageToText(contents); if (!global.question_dialogue) { question_dialogue_setup(prompt, textImage); } margin = global.question_dialogue.margin; fieldWidth = global.question_dialogue.field.image.GetWidth (); for (i = 0; ( (textImage.GetWidth () + 2 * margin) > fieldWidth); i++) { textImage = ImageToText(StringCopy (contents, i, StringLength (contents))); } global.question_dialogue.content.SetImage (textImage); } Plymouth.SetDisplayQuestionFunction (display_question_callback); #-----------------------------------------Refresh stuff -------------------------------- # # Calling Plymouth.SetRefreshFunction with a function will set that function to be # called up to 50 times every second, e.g. # # NOTE: if a refresh function is not set, Plymouth doesn't seem to be able to update # the screen correctly # fun refresh_callback () { draw_logo (); } Plymouth.SetRefreshFunction (refresh_callback); #-----------------------------------------Display Normal stuff ----------------------- # # The callback function is called when the display should return to normal fun display_normal_callback () { global.status = "normal"; if (global.password_dialogue) { password_dialogue_opacity (0); global.password_dialogue = NULL; if (message_notification[2].sprite) hide_message(2); prompt_active = 0; } if (global.question_dialogue) { question_dialogue_opacity (0); global.question_dialogue = NULL; if (message_notification[2].sprite) hide_message(2); prompt_active = 0; } if (message_notification[1].sprite) show_message (1); } Plymouth.SetDisplayNormalFunction (display_normal_callback); #----------------------------------------- Quit -------------------------------- # TODO: Maybe we should also hide any other dialog # Show the logo and make the progress indicator look full when on exit fun quit_callback () { logo.sprite.SetOpacity (1); switch_on_bullets (); } Plymouth.SetQuitFunction(quit_callback); ubuntu-gnome-default-settings/lib/plymouth/themes/ubuntu-gnome-logo/password_field16.png0000664000000000000000000000026012310475506027035 0ustar PNG  IHDR .gPLTE-35$bKGDH pHYs B(xtIME-4b-0IDAT8c`D?~ zjE&FeEfU{z*v@b޾,v~5 F3@AMzO.]l# 6Aкu ̭4XXusOyWIENDB`ubuntu-gnome-default-settings/lib/plymouth/themes/ubuntu-gnome-logo/noise-texture.png0000664000000000000000000023315012310475506026502 0ustar PNG  IHDR\rfbKGD pHYs  tIME'y9KiTXtCommentCreated with GIMPd.e IDATx|ۋ=U]ݭ%cI1mيp(KNck,;PD(XQܼ78A d. & ƈ1c20ah1!.׫UJ_C҇z>TJD$TD<i'w|UU5XD2I?TUC^KD͛m EDvvvr{Z""bU|͂SDCܞȉ'b{~+"e?x_U{wgD.]JU;}t^?H^"jH#o놴{ ";Hޫ:y3OE$~}W\)yuT5H~?pϷ5E'_D8 "xyNlsNKD7,DDΝ;V>:usn9h{8O& 6NDDل.N~,"8x6έg <}s^]]H / ^3MIyFGmHb?NHt.6.gdDnݺ%s|yfz-J*"s͉Hs2dh4 PrWCUh8ۧKF6#.]JU5_͛xȍ7x<9[UUŴbR… M3%}}}=OIEO~g(2;OchO]V`l7n=JHUC {P Wfek M-3< ,~|@#D%hR jzҥ_O?,R3իW3gMqk׮v9Uշ0RT䋈!E$6"hUD䡇bM9Ҹxba/dBZCgp}N8'ÖĶ!css3.fUU>]D>G h*BT M&RDz+++s/^,DDvwwCZRDd232 :á﫪 +O]w}7H2@_mY;Ѱ99,e{{h_p }CJ veeE֮m/RUii)SU͛ijooog Pmoow/_Y*yF'UUpa3PuتJ=t.Cu(gTge*0_tm`H rӝ֦F7MCD:8Hepl6E `De8 smN:~uFS_EٳgsU-젗""oV)"E7hv&\9}|lO{8yݰ>R׫WfnzdVv,5cb3^Z@DD&U# U Ɍ0(ώ9h FxgN9cP cYUU3rU@&"'ՈU5 CM& y?R 6wCKrԹ"ː8"~0\ruVӭd;wMu1ƕO]H uED|ÝY W>={3g9#Dr7|%SPwܛo9gg"3(HIDg"#+D$?vSL1<3[kss3r;ȭ3U-E\X]]M, s9Ƨ~f;F쩪h4z< {-Jt`y:M']D@{ Y8 9.=N{ z[W^aRFM|IjNJT5pxiooog.]Jn 9_D:v}߶d >裌rួanyH̖_Dի]cǎ9Rf9 ^W>[~x{ÈYF7‹Ȃ9q0Ǟcoo/RHi K's5>-Z\!ə3g ONea]hnnn("ӡ_zU-pr.jȍTH"x"Dv^ CH~(B\̻<;U'DU|vlTtyir%|{hRU("/ܠWPPW>9r`lO&Ҹ9Ѥ*gIUyͻ%~- ΁;S{3gQY԰|ßQ?|Ao] O /uN|ގ/BoX.f۩ryx[jU SD?936|i\Ŀ? BD|+'3D.]j:؅̜}$_Aڳ O{%aH3,z$^[[+ V9 ]~^Zs6*pNJNj(q2?뭷,q3|Cw1UMϝ;׶, D2[DPy:p*q 8mla @kyȑ Ab0Th4v'J /tRn5*GR+DUcǎ\E"y+UFկ~{7:~%j\)08cUmښ oP7 AB8 CFs/+"=Kܭ@DRB"a,..;{>S b8Rp)fd{{;G2VBR9vST#U\`oiH#˲8S TշR;3g zʬ$~#b>KzIs[U cĄ6x :̡x.y^!"7D!sxs eNH $Q>ku(|}}='NYM;PUĉN ȢmF.DZcb^@"͜WdJ'*5 ]0rLry)v Hj=X}. %/.Ot"y… bf<fHrԩFN0Tʬ4'ؚ0Vڹ(";9yddM)g6(  YyN'!D8TZi1G#gf.x衇X|`/lFp`c扈>}d úzFỀ!bj߈*`f"F-T&o*/RП8׏]>;y1K~3Y$Pr ై"O$0Kf|DTM PVFL2w{~H_1rCoF6 ґ^ٴp.*B2jJZ,4nEB) 5R \|pyBUQA=<= pnܡ l[Ypr+h4v*"d2AXc5g̟A}ٞm/"b)0F}-觀墪 ]V0d$"M=E&u.GL0 M*D /D$36uUU15@ftli"P:@ĺu_|qў}@dk'PTUq" )ǟl-"fc@ƾ.ѪjKyOTNVrDD^z饎sY>f͠w,~ ")rMBs(gTzզ)`jdj裏6~`WUgWWWӦ{EX_~E#֡y.J["hT߼y}NFmFtCܝJk9ŋh M\t*[2cAgSJxqɤsѬB:e4{{{+WJ;kֈ/k]ֶCdUa5w*G,zۜ?s =ؐUUG]{bD*T Kܐ"/,,VA,"VܹsmvD"飯ꫯ6'۴ ttᰑ7dTC83w^jt:t*5A GS>JJeY uƟ=ڙ[YҌ]׾e\1/"}m7mf<>oᎋȖDT$ws.E-+W-3=g}ܘ.Sܭ.]jEZ4ôc`ۡ4.""PDzrj=27K}FYkn1pe*]|зQ޳u 9T54@sBXDԻsˀoll T?z(j]""^ (Y7ȫ>;.1.4d[%U \$" M]_c)ML;9م9 'fcgg'ַ]MqPD}wDDcJ^G[XH]3,|K89S,rrr>J˞l{;taB'b.s-q Y'p7)ijOR[ 4U#OPX0˲E"gqhV*L5CD ~)f#~Jx<46@W7d[n4oPtYfئW^yoV&Ncχ׌WWWgϞZ^Lcn Y* '6e:L)r p6ߐO?o>h{{;17V+g<<#y.N-ČP;WU׿u<>ydL1˽zp ˷]9rH\;O5yl\ {>$96kOk|:Е<=3t<~Z{4n{O>hK'X!sL{:Re rMIz/`UUH)r U(Qv4jJS=hL eaB=oȤӅZk a$j 17U k )v=j11%FYbmm-F)S_{" _y6IA9W*va@=SGv)Au5Y&{XSq+"GBǁz'KKK 'ϡQ ꍣ4UY@h 8-Q2 TUID|faeeXR դiA Jsz ktXl3xfx0Wg JU3kq+]SSH%"ہnoogvZ?~mulf< Z'oll$^oo[)"666jCYmqqe?栘7wͭ|a9c"`A("b {5&IVUUg"E4O6tpvf~F"p)x8\r~#T0/H/.rV~UUM3S+d:N,"+WshFin 2d2L," |IGeѨmGV5sQ gp#{m#kgw#T48 Vn5jc<|xlʮ˝H#46Hvvvx9O4䜢\UŃD+qi%x<H/ۤcn IDAT5P(ǁ ǹK4&9ם;=n} c rj>(y3OD2 hSquC(-RI֕{\eYWH^|FUUm'Dmrh j;f "1 }sx#XڪVU3יa50[Ԍq""y1xjU-J .+CE?w\߻"s}(D 6ئqT3񐖐\pIs B+eii=aO"ё*"b8L$u4dF΂YǿpB>H`ؔJN^joo/"KUo}Jq>i 0U4 9)rX.+ǝ 쩈uŹ&\JUF.MσQ0 jDD~E#^& yM18@F*5j8J۪/U煲 j׾eǃg3Ӏxi9$/>jw:8 z< {"24 n=n8Ӈ57t;tAA=2>3Pcʁzpɧty\BCsϨg=$Q&v {f#-}RU_{Z n<P!Kjh7}-x`DTDP%Fbl>)Ά"vnĭ%K"R|ߟH۫9t'qg"h_ytnll4=ssY?""(Tїu[nj:/gB ;RUx Y4lT}n!>Cogߋ25u]2aMр<""NsP4˱qq(*r,Bw)(Š/ƾOvSaF>@5~xJx/u"|;9@H`cGi&6""E82 S=f4@D.7\NkZje徉"}BG?9qa+-39(Ʈ]>嘁;ILJT Ag5uV\D1L]c!"2s( [#_~T6"U=č*q~jC:US<;:)w@QпSR9ɝIi871R:/ ׫"W2>0|Jr$S}MPy-HT5|B[Z]VDƒ~+.7 *u_U=UM 3t^ӂr9Tj?#+5AiW G,/"TU:4LEcE$=qDۢ&<ӧO/>U0kՇ~~~~`ѹsځJKFHUg}wܹ=5SIU <]" GQiժ5]67z(%#a[Ns*b9-U <_jh{{ړf!{]g\t—y>%"-4=M?NǬ/%kl6F@j sQapdVĈ‘U ^ڥF?"+"؃SxssڴJhs9"M)bMqrE3VUsi;(8yt6EB!h=eϳ`jwP"^^^NӟAIȾgчBUapX]0 ebV6f8/~ackk+1rjnA:y5tusF3H=Hp81\{AF_.wke K3N܆Iyfd\@Ӕpx1ZTͮ^ZZ]~Y:'R.)ɭh[oVjV?S_P??mFw%#t9*o޼ m "BvWN2W_]zP&g+>>.w"]rP"~$"s=7Gjh^U&M _xᅞK<[ S$rpe5fI ь @3Trb<eF /(9{A4 SLPU?aC̠UlZu:`|_Dkgax$.'Rgg؛9Tr:Č`j`= >-" 4jG ^ 5RD7Mj*?UU&FbE›:tJ;h^QD<%dH0=x`Fz<fLmt=SP:ZZ^~垅9<FisB@^SDHa\&Q-h4 94Ej9D0%;N nӌ̜1k}Uϝ;waܑZYP#΃o[/&X7oLfC嶤U. y<m@b^TU_x~ {|P‌0j.mB\U#d3`ұg ][ aDiIY؞;h}U l=)|M89BD-M( e="\d9J^zHǡ];b2 J y U2!6֬5;>UJJiat]!ΆN5ro|~ҩ3Z9 M>}z[̍pz^i sbUMCGĉ9pBK_AbKɳ'BsM a7qFQ]Y|~ީ)FD@E3鰡CN)H O3+l?ӥrG޸ ["Є?.~baa!___o^qґ.mX:Qx [e4;T"7Cw5baq,"J.IK.(=G.bhɿ¸x.r[WG9h3*pB*Qf,HsF @SNCDZ,T;b{yy9%: 0y8;՛1-s#'RVžbDL J([`ֆWUd71cKf'SbتrVd#4lu ge..1dG^tf(d|U#T:ztb' &d^eޞU]{9{xgg'2Q J0dWDBe"ҴI@1ʕ+ M†!z d#ah;wC&N 7:."ַ{[TU+9"מjb*|6Vq%![otN})#!ie\̾c@Hut%8cwRM L&S)4O 7Vs:ra}va(0=+!"KKTph8]Tw; j;@X"p '`Ȟ}Ä"O>ij@CBNUx% *!D[.${Xn+\F{:%wss@p uDg3]X8??O&^xv ވKKyOgDѱc b:o:h^G]io݇M; mCu\D2( }X@:']xyA˗TGJ8.n)01k,4wr.]z| J!KHi%6$ܼ;s܉'櫪jN&hŞ BaUL _b H~z""W^=@RZ%j:*%8qbjg8M/|?<%O6|Y76 FS+aPI/֠Ӝih;tf_wЕ2#6:[7nhVU;ݢ.Ewj"9z=["ȿ˿eƐN?͜;Hs32R?ш5aTc Yf_2lv||.3j0 txB7ɀ ZVͪbLK:%7M5eZ)qL$8vڜѝtfY+/?Z33{Ӟ$ }5H2b)brUU&=Stmmm%杀s@(wKը0Ez-;v@<"W<[.D1\\r}W"o"D3JUU>b؈@{GE a=0{(vSZsGZtgXENGMZ6aV# P> /la#U M*03/ߏpx ]iRgz.0%\pR HZo2L {%F9zhhxn!_*owwx]~21-k,#;$ِ=jL>%R7nKwwwSX'tc>s .Y?Ln5{aa!7P&ƽxZ[[˲[P@ 1*s5H*L',0\ fr,o>z-U{TE.0:Yݣi%.sRn(r03SG@UC $l$~;Xb6ctdVJw͛i(ZϜ$ɠٜ9Xǟ1߇\4ܺu׽tR4:t=H*r!9Ra\ʅ.DgNiL.Whl!õuyB(gLqS߯ ̉Yj<EpN*GС1}׵p#r'IR5^`5:1Pi5,dh~~~)ܲ<+g?Yk}}=e*JC.otd_ti+կ1LZb/9w\{{{n5ܙvNS._ 84J"2)<@LVӅÝe~O(~("+9 ˳~\kkkl3*1vmD;&C""hIvρ$(YD:uԢLE3;kCBq@Ҝ44穴 u9`sP#AIm2D;vXA@n:83hl31~9{{{BnA9FmC:d})(J1H DZ;%p@D, 'z6 鿉GB#t~Ж=1) ـg2oV >VxǺqssܑtVKu/~p"L3t%)mrau,9uFtu=]8{!$b-B`,[9lҠF߉wl#_$rGCVe OBoȪ,-b7zt#2u伵$ihwx TNjp'V1FY6yfrGR#jtiٶ (ǃ;;;|:Ο??$P5Rx3p3RJ _AF+---evXTH~С9UV\o`OC!PU_2i1s mO'\~<JZ"9ؼxFOU31?'#"%'LcrBnKgܦ?Cor`þ9|FKgj:iYNj8QGCC 1\yp,.,// γ lBKDzz.b 6VWWLk嵵E mEoa6Òb5;P,NY GTmDe["/ߘw 9.SkiL2Ћ0SxTU= !R; % m/;c.eª#z!,//X:&N " `EҫHݮHn7!"b{TEGo+^LV厼J^$q (LBτy f@Sоc ϝHB1-"]t՞J`HZU՜愐0Y"ɥ1OU}`I?~xRs:06QWPDeuo޼4;ydf]xB$-y]^+VFVVFQJ믿>tqpT5S9{졧zj~kk+1yuP0=ڀ=` (h23E("x̜g< 3nwMZZZʦ:-wf2^ieRsuhڧs0ܥ Z>(MBnUg裏.=]̜vC&JLNx0oY O]_88剪&"SQ\T5k^8$.?x7gm ׫90Dw͔8E1|Gw}ȋE0Dg]_0/ -rmy йoޞuD5c?cBH{G]H1hBj3ooog6|SٳU5fp2<?72xvfxJytyVf2vvݦ|"ruΜ9s?bv<<P7 P&VBΟ??Dn[yJAŕ~衇fBЍ)|.uT0R\O>$l c6y; GAnA"Bm LIsJxFS/FlB8Pz{SP͛mknH+3;,O^tSɤKsɌ]q W ?~>g^7 #N)u8=cʶ.o~ƍ믿>/2\ .4 p T50 =;g(wB9VA  `?w1肶Z8ΥR=K_A æ_qz|YrXU#{HyzX,~""!93ej=[MTU} z Rjjz- ]ᨥp#t85|^R74Fja?4 |!"uot]2fQ쭯8Ե9*LusS\{3f@I$<B!ˉ0DDz%"͛7! },~m?K^PXfH -7Q+NE&-ohO h(F%-_ MqI,váp0-wvvrl[:N6=r*"?> .y4a,GQ?[1@ISf|7}]eQP1F.&XKv,"]°"=[#[%anZtHl6ԑ?󝵵C"_Q( %tj :MEnO=:B 8Ȼ1)"0l)g![~3GV_:dѦMUpas7tT E{WڷnP7ե=EfǼ+ΔD/ l&?vJ:Q98[8R$o;an3⯾jssi9(U,g3gއy395NeWUZ3Ӕ8?]Ɔdd6v"J |#e>[~LS>L7Fn'M[L@s;{ "]9Ih<&zoUΞ= %cMvwԬJ<ؼ;M Sm@gϜ9>=K$XZt0%H==UQAƯ7LZ<*ڼqFzDTi; J&m170 LÈ&tY" wA% QUʄaփfa?hr]х41!3e9ճg RڄR]tNF Ɔ f9p^BU lO=i[9%QMYHc#dI7ߜ鮰.C`:oɉR ϩjd<1ZgΜL&1!w\{<FPA<_~zK6gN6-VSKOEe9[wqԉ'/&y0ƅ}ڶ j+ l[M_|'JjB|xAđX~\9j׼1sFHp SdooEF10jpҥӦ"a f K,f8 Nw(Sa 2 WD(4%,M`P4S4Y!ƌ[ό 2!igg'A$ r+AlQ๛j"fnKj` =}7 2 9A}F,甋>gjf: 3 nUٳgw}0DDɦ 8'uF*5-C\7ꭌzܗ=USZL& n&he,*#8Qj2@7h2z4&φ@ihԳZn(US0;6ԹsfsShD5dڛUp9hIdŧ~ he""4e+hoӧO725njBd & ʁ )JI=0[^eEid);́JH"ԣH3oܸyi &">!V# yfJ#m(Ei*c+ȁNUtGRU汬?o8+W*^'۔@9ikFRً'J DDV-`0T:d:2(ƽxX<ZTHa{ak(HszZ:7BC(iRt6+Җ;Dp0*a"i(RƌLW1 :JYc!9'O6v"Bڄs.3y4k!xE)& x },ËWY @N*d4EW\jwԞǫ/22o'\L+Sz&*k1ף#uwկ>D;_d2IAZGJq 5Z!믳3ED!2% l4hv9(|G^v', L&R2 n =ztR@D䷿mnUG%\U,O>/,C+ŋ;>ن+S9d k!H@WC'Oi[0SiPƓ[)6U8甸=/ٕ!`~3t-\ÍE<,efSL(v=~&n݂L9!ԅJNWVVr`ι@0!ٰXۊ9ELE&I-1(.!"YCӫ/}ikW0"%"R̔҇P鉃qL)F8IC $'NSRV2Z?k*}UHv*Pdg.#mRKdJ(KC ف}B~]1xb 8 \棡ܽhd2X,E"r#wᦦNM+z?.=ab/*cPj{<픵 i32aM\ .diTp4'9C'eyΝsǕs.xg?K/d!jQԚh#&յcM OSia @'}S'by990eGY!|b\]RI;]V4=&tۜ`s)æ Hp&94E{90w,3M1e"T6L93cSZ0l< ޳."jvFst(uj:7l[Ν;b[-Zr2m&5$Pp+tznqg?|Pyrx9,@/PMC"Չf>d-%S6nPlKdtTt3m tZ7F#fmT>u ! KSKXjvr9<y?O7s)s.x뭷D4|%ئ*b9U}A"5ϊPO;;;KzLYQ,"-V-a$`>}zAd:;STS5(# a> { АnT 0ts70%i%@o2S(%rp{TRJx)Ƙh4JK,)>t >'B9)H(}\zuކgϞmSPQҶv3P_sz>sRldaSPه?u<̌́ňEYz5<7Ip ms#"ㄫ7|sO.+^0G3 *}s5 ɤ@tf3ҍ5ڠ1ȔTvSTvqYHD^eI#ovEjeι` HDkJbP"$H]ei*GƵyLo1BȫEHlM[޴$r8|mpG߈ ֌bL݃r"=f׾=B%r%C+wΕeYΛk`O5 cv25CY j`UcS*e.G%?~QА a ';;;X.!9Ez |#JPj.P`rƍc$hsĉ}:KF/~ټ_ "J|dss3Wn31Ru</lxZ;X{2i;ι:G!aSҿ%5{P 0㛪*K677cnPM Eo10@sgz^hbzs-i34JCӥhԘ^d& F9=zt dܹs~rIۄ],7of}Q -tcVSIA3&@ c ^sPL&d2w1DVۄG xMXԛ 0$sZzmSNu>0wAFǏ7U~.}Sivh6V^vpNN䚥L"EBi&3/Ma?qA"܎qImD+++3g0---An $0{m2ya Y=ypBqH7/~ ֭[p,Ii<=# :Cpk s0si`yKwww^xš&r4rHfOƍ@!m;<5z3Ȣݤk ݂s܊ Cy~Dyd<Zc#Sdأ>: Vh4f Nz9n3 m4(M[ yJ۸zrd+6 =e("!߼y3uV|fNܸqGH۴@Q siEz%b@Ÿp!h,AD{ѤT zo jF37ڑ{S7Acggb'zeM ;~>7 SJWo:rdCꪄ+NsѥKKKK=c/mHuYڔYh0i-q[KCYwIՏXQ'1""},r UY~etR~gg"'mLDb^KyYs^(_g3U}$ 0[mSS`%OsιB7F0 kJ%AThd1S7lcw}+"ֵG}ۋU?4_ N| vvv!,#$*=A#-TFk\~egY]]]2(mjij$-FǺd RpEzTUNWA^~ ^¼#j[eA Ve*ݭ)gm6Iqǽ<ȝsfdQc?Rn p~| }*3NWvoϩQ$"9cł>Mm ӋP{њßnN0b sĈ$ZKUlqssP\39BEy^B"\LA)sN##ιO>iڅ` mA6VCzi{t̙!ɥoooIh2E[[[K{^KRM  oܸQ(ݹ2$ :PyԩSxǍhj'mHf >st4#f4wpYW˲:"OXE PO Ů@+iP64$6yʕ+r"*nZo#eιPs%{2qqt6$;wW_~eoImȸd!U7]e~v n{ִ2%ڰ Tlz7ԜQI@jFAdkyyy^gMSi7W7ձ|P8 .xG鍍BP<!cb r{o(DD2qWQ6zYh*8=}\5%Q?s}Xx͛nrĉyQe߁eYmnM~srpP(2A蓇XqTz򉒊g}R}X}>%)w"&RnsJs-5)5f5Jѩ9M3t/iasg._Q`$K)]8x3ņ}QntpX.NƋ+"%L䥺`YdDtZY[['/S-. kȔHm6fHǧ@;=Uc-O~D : b}*Af2Íp f-Yo|C@3 VLA)m޽>}􂎅>pE*m!q$[T'5j("!MYt3r:ՎTzccbS(Qx3HT"FjuM3Griv"ۢE*tatQaՄiމs.&{qfg6 G(5͉_k+>7 ݻw3g5Ư""Mt(+2'5z(KJCTDJ-NDS"`&SJuh%3d!rXO-@D{nFҥKͽ5>77Bl/]utmZz{1%`իWg4}7}PMQJ(VU5rjjOiq e6R{L0H#!ͲLkjhR樶Vwqb jh"PC4 `zyRN~&!}]-:L&;)p54tKNb::eg.2mSi#muaAS3" +E$_RA|lJA%?cǎ{ dpӁ6gt+H$w~eL)Eܴ`Hɓ3*)=|XX\)"m]fmԘwhɓ3gϞm+P ,Z4VfVl=c55D8ӓ=xWF !DNЛD8G!D<̄7#M%Z z̋H5/~~?5B4{Uvm9:r@TՠcrLw P9Q ,⒡D7i4@DU(DkP9%ƄxBg EA6!O?":/`<#8#u o|cq  IDAT;Ix"e}  omm-˯D:F_ںxb̘M׽7<@v;6j2F t V2 RdkkS fιzZ:vHls*p&܈cI`#8U#!W4Q 0:vT?9R= sn%nSv@*|.{8Kb/R5777v倲%N/7_f4>MY_+t/\Vl[ X`DN"{{nf;p -\i!_D3ӟ5 y7/(l[[~Ji;;;NSexqY U& $rh4X 3Z-\~%GH}ԩSu5/opSo'm`Bd&׼09s:J7eZ180>բ6]p3WBA\=zi}`(sɵkךT6H Q2@Cֲ E[U]_= B ov-!{9}vBDҵtuuhEr0!3LR(6iȾ| "}PPm;st:Oj(1Ztiʄ6;L}W=gcL{+WzҖι&ciy,޽{9FE@w'Y9";" L75a$*(А{F}v`.~ssT7쥿2dHWd`YgIYh!P _VD䮉sRp_fTxأ-d_qW{2'ɍ (3ϊ4+0C\ۆs.|Gtb }s.OŸ/{rq:ιH)&gyGՋN0ʁpY}/O?-}}裏'Ig"?UIpXvH;R Ieh!q QTcLAy#%8S!TKuRBtPò#FQij;"eFΐNj("R-J\rlڵkMŒB(QLqc@#EJC 4S0ڠ{=T+poo/'W$"ɭ[Z5`"ѧ~ZЀsQK|`{i"fyCsZמ_-V<<;RivޡZ~JN {G'Wq5?.tsDf#!*"chkwwt@5?&"s8y%y0cr ]Sp]=ђ'*e08pZgLP4cf71sD3c&焄àudggb2SPIJ?aL޽۪: j{8Ȕ&;d`D}ΝTl<J;E25 "j=5$gľ ܊J(l?W_[ ~ 5iX5wDzMS456C, Ō)r]Xh4Jwwwǿo8E\_%zι< DeN/2-"<żכ ZP Z[~sEIUc )P#sD^~{#":)fOdf 3A3Ї9(CaN;0%0@ ,JoS✋ [n&e *K0TS>47e71zꩧtZDf!%n~E{ gg YQv De1}rPF;v YBtѣGg͉Xj)GF(u";$ZYrnb+)3q@dH\ƀ>G"5OeMc)lк\Ii˿ 4d6Am܄r9J(y9B2dMJ~lmmm9 )ӊ%g>cڞi[5!LO&;zιLcI0W_{[z)"Qk:NBι(%"qDtϔ4c0rJt%"w"OZ4>C OA0܃i1P[w@{3gFAV8$]XSqDKk!:;60TE]؈Au8O~,0*8-SfiZ|JT3/@T}iP@'21S#,Pc1}tT70}^7Nߋj,M r#l;ƹvZȑ# AW677E7 IE$?z}}}΁AkK[m#'Ѩд:EEV)8]޸q :rЉ\}6*Nַps]YKHiMHFikrk[}fS;5N_z饆[7Lpg H,VC7$#\rl8༧2ԣwܩH4|ZcMquh(={l 43kһ&ߣ.daa[J^`ZZ/PGU}J;@٦sb!m`4ۿoڪ,]T:O+t<I#ƹsjKS)zXϏq{#t7 |n0?~j˴aDv"b\9'|=kptݐ`hy #dIHbEbva*jn;PP5k&RbPQrD>"ܹs'M+._aVe R@-j@xnnn ;q x,YT%, ϟ/W?w617W6tRڲ: h9GXq%ċD)'Soƺ^ܢ`AmAaŅknsA.`+Ƙc@ݤj㔦Bhցb) 3^qG />'5`N1únu<&ggg(q5x4ޞ\51 !cQZ9s\s ;Spb2i36GgcE9cWb)~>,yZ╜1bO,"!R8{6|NwyF~NZ̉Zfx,'%}9}. 33Y\^b>*yM? .%R5)|Ti*c 40Np͵ %MO5{#*! Uuz֭l<ڸsNb&]j_9P(7LGSYZ(2 <Ν;n3Q|09%\/)Evh:Mb~Cnfs!g)®B/f\LBȓ/Ŵ.7еiZ=.mgDtH(scB9"e5Ct //yfc+L&^qhNłX|sɯb"Rj9ߺu+>Q͂ 6 2iXj CPX #SUa8!Bi5H5ĺ(*ӏ@?9/,)`hC*3")/?MJeK2(NQdpBk0kk/L3nPRld22\=5Y/RCm]ju껻%QEChޞSPT_yw* Sk1QSˋ/؅6X’r:vqp@SF^1Q@U2Qioll2Ot }SODP`,޹y2T_5u̝s%(U Ne)*" @XG3[ivD2ZǖWL@Z Lp*=@U_pEbf|"vZscc@B8N,IgA !Fs Ax^Sʀ>b*=96v˳,;*J/B 6=b3 .5/:??4hHwi-Ze(bsA HHKy< SѣwIZEQ``I*qy脐CwC)0ATflgȧY#4TMakܧ΃kx5}i(>h)8IUmN9-~۱0677sa"tEA0uE 'Fѝ;wO?VP@uH3}To߾0 .J\R9W`t3Tf mrU_m"R`jR^x ~ܹs]׾7YoW ѣ {^8'+9GydN␲XDCiH,i8LӧO7ϝ;`5(uE39|95r 8"4Dιdccf CpJ(b飔uv#x0Ѫdy~DM Ä4ՠY|ldz^9C+2P 9 yBPpgniRM}OS tRSXwI5#jc~t<Wʾ hB(:I=$H|'W zSI:3L~έk׮51i)"uj ]sO )V(e<$R9xV4>a Y  e`4W15ÀC7oH._[[9bdvW ^qT oN%=ZJD6f)mK @"!ժ9:"`ӈ7;WĢM >dTw#q": q$6R2ՁVOH܂f {0ޯ:o6u'hX0AϜDL'( 65*]'{Mhu9FOTK@3wSA}3]x© _|9{ꩧιaVĄMFM[><?0z, T͔ݻ Z~L,34' 0!Es""S[f@Ȑ_ӯn%M̷{n^g BKCtJ=q㥥boo/U2[N1"ty%pbVwdg?*Cj%ЭRP-5GgMN:b!H!8kkk썙qUN Y4S-7-iM:$X*Yƛ_DmHmqMO?DN^$#!A]'Afx~~vfȔ29pYJ ґ4/LɁIbPv m֏iUGDZjlr9:s.79/}L"h \>mz9f~p [[[>+07nrʕTιRPD9v}ĄVVVn&s.Z__O677QCh4IS g JDj1`2D5zG= Mj<!+7u}D_Tv@{N6z6uspXiPR<m,-S2#r PPEܾ}Tz.KuդvE4˴H!Pa'8()jCAs][[9rd7]GČȑ&,(ٟPN4A %|Weq8`%64B'B>~m*"ܼYœ%5s.AX wNRf;믿!O;(F)ϗJNRƙR EE=s! 4T_t}%ܹSٹČ,~A,֟"0gz(hutSfYۿ[Ő~\10P9 f̩UvNgJ7 IDATInd-}?,*m3B#`A:Gͦ CR "-EcJs@Dr<mam}**2(]eS 9J؂s:Kvu[-S\٩HJ%A"R*oM^(:{l.!(pK.5[[[h fb*"yM5-%"R;vl?Re2WX$5d7L&>93UK%R'Rnmme5V $]1 xh!PVY,R#.acf!$$*67n(lK& 睾s.}WzOZj5f}۞m, &y-tbryԇ֕SuiͤnNd6 $?ʴ-Q,rfoա;“'O6cMVfDce#{Ji5)Xwuũz&pZP\Ŧ|)LbzFKw- 9 -nkvЧi֟ {{{%ə͜ԽD38^{ 7j-~IJ>ST'`7;Q`,x)m1n!:]#8 *Q@y'ऀ1( seNۿ!hR,ٳm:cOͽx{{{.#U;7BTF1 T(i:1˩/v"RhT5s~[O0NAP\A'>gwfG!>nx}}MW `-SMN!IS&f$5<^rʕ+Xjv0k4تl̠1P=IɃwϝ;wL+d1mX*5րiuzRvH rƍg?YO)'^yk-L[k (3D$uVvҥj1tZ'fN#Pbow!2(ۋ)Q*5jL(znsB/) tDDtg~w@.`!\n1';ʴ˔ZMy951S0_5Vx,L9㜫d<,hΥjP #葹s."`B3_YYbSǑɤuD6}T|sÈFf܇S?<~wW^!#!qK]fJX!"p,o<"`,n"dzE$裏J=+O?Բ53XMoȾ++ V3u[tJ%].^zE^Q5W9W1uyʪF9Tf P/k&PD&g.&.AʷwH P^~@KC{n6}%7+Rmk>OuUገ"\byKy䑅x6$dT{:D* 7sr@kEۋ2dXPSPDDtHEA# h1p92%&fx{Hӣ amءCAmcÓ'O64 *f~~~YD2- GQ9]A4,3Kx[HB=ӐBDr` N#>0MA-Qf5$_#^aɋT NG{Y4kLk/7FhggM)YtLQauɍ_̳lLkڀtQ0aPeP<>0_<} ڈHpܹ@˲PJk{ Ph{, }g?فs.tEr!-M`"f0q X{P:ꙉO4G]GDD#s.~zC}W UNlM7:}MMhd‹kA4eZbpyimi`ndj_{-AHM/M#b]B@@{ꩧJ+ý5uKZ ^S7w}w5 SS3Ocس 75/19~xŋcI4VVWW3 q B>haװr\]cMG"} DKX ʕ+=MU"+vhT8S#\E㛺,h3ZʳΉ]hDA%D23e&ⴶԿSQJ_⬶9-TP?,([aN3͚҈Ԙl ӓ]mZ~)#tYV<ۯVӌ娈ǚ"2w.,: v]/3N QmD0Ζ+1XUr s܊BC?ܛe9/hxZ;&G hY`D0y7n[{RYİ=3Ce2=HA@D8<^{Qe؜jm(;h"928B\ / O $'_l V\Hn@D׮]4K.5YOdP{mщѐTEd_[YvPrXyW0hFNhPPg?ҕ!. .\h盕:~SK \A*6 HzرnALEDtaiBO>@4`YrQ<l)|-Nf9FWWW[[.zduc]^fs2F9APUޓ X>js<ϵU׳YDe:PfaL ex%M47eF E-HRA}C:{ヲNUnާ ƈfHAS1M†d^QoJ*E˗3%I(қyrҠO7L7% ihOsEZp1 zN9~G%->FءԂr26c!߻)z=3Ohω.Z`'m `S k׮5*='PN4=tj}Ar΅kC|6 n,ԒAM7 jٳ xX냍$/F\ Y6`$-7 {L LtOj2ݕN9,...4vI(rxɆIMTujti*] a&Y'/J)uBfPeQK!s4|O!1BSdTjsg oF1e@YIM:s.m@)$thШYHpyȳd 4:uTԅxohW`Rx2bj79jUF9 FJ.b!RmΨtd;4p4Ĥ D41U</.aH+ep1!|sp3#Wb5o+m\rGE [Ik0ƞzF6WLJqȊsV( oܸQCZ RPB D7d*Ʉι(% E/Q(&top(᥶/ #YRF 2SΝkm8 ѩl&9~S0b_H*P36!mR_~9kz]5)_mэEJ2E$j)Zhcɡs. ܌</4+t FQKrF;HIO>S2s!+7&"P女U*D5 yc VA9v´D̰4hY%^>*_^y啮NETEt3r"T+D?~S8qbސ2H 7[i5ބ;&514Dw{{;( 3 ڰFvY$Uxޯm94ܿ,`Pd-=J,氩pk/+ԲE  JŒmQ^1%S F iᇾxWڶ@'R@Dݓ'O]|egsNe>dϜ9q*}f Q[׻=3dѣƪV~:tĉ 8T:y,ZnYOtk\ςpr-.'NdJ+60T':(❏557US6{^JFÚ "xl Pi㵵50o[ /pe~i|љ3gzIg _ll677VE Ak:v׆D>@`H B)NDr8^v-C8>sE!؄Ӣ>[J{|c5YIb9{U[Ż0:Q<'jMqJS:|9Gfj Ҝ/JNt2ۀFPDVJD VjCçr&\@Z0Q`K%@-)O:%D)p+:bu}aFdBzeBRG&I?/4jɴUbDD.-zKw_]Yd?]hVHH7_ DDbp-0\$#"Hd.f E|IѰ#5$i*S> 9L=Z6&{_5`veeF_^Q3rutIE#9 BU^Cj'`>r=J:zr{Bm.]TMΞ=qIT?Cce/kDxCHD)#0qαJ-h 촄q0#Obr-\Cw]D677oC%iaz6jii~>Ix8$;HaYQ\nZPVtVBBˣWB ߇~bE ZOHU7xQCW~9c ]:\T->DѣD=ȨPjǔJgLH1#|0 Л=hc,MA,9wE6vvv2cbKFZ~qU<>mrT%e^xKjCP5;T{߀HWk͉<}g҉M`#'ι{]ywFhzi3b nZ z$B[+W$z9 >۫YuHT,"+o8T+Lafh?ړ9N@|<6essZ9 ~Aݠ0y!1q>I |U'`D59U8L$L9Wo윃ǜY[Jwc@36i[fN@~탓'Or)]v BAι@+ ,zÆmԱqڮ>㼽LmMEf^ moou .߇`ss3 j AiUgS&0-B3)c-L=;2F^H[Y56* TE^Ђ[-m~22LAHlvݏn`Ti3jt ;PfebJD4B?4z <9LlB7H{KH߹;h&YpY@6^@#jŅBsc'4i4mڪ1'(u:n]rBSVzv&%jogg'S裏(VM) }C]>:|E>(j9R} Qi|x*jgg'*%dแ},iAX/X]1*' H/͎JC2򨸎 @#~I.;I'?9F?mB¤C 6n y|@E&vŇp7 L&wȼ/tZ:ιDE&(ñAڔs"UB0T=%o(TZc>Lꕕĉ?-Mm6Eywd2fXޠatD trx'U-H-hJʭAj `Dvmι`4LqP&8?BHťm Yi[~\ Ԏu@y!сٍ"\CO8h WBBa;'Ln#̟ o@]3b:\7G}].PFh@(PP[7_㰸SP!8L)ss&mȦ | nsF@N%j㩎Qu<kacc#Uw@c2ؑBPuʎ4^,&S9RS!o+ܮaY0E-ը,bTxoH|x:^[[ (d c=^GM RT5sۆ 3P~ev#.[֠!4o~6v`{^OҥKu T\v-?3-b'O @ј-8);D԰\$%I*1nO!5jB=U.p2$y1Gfd,<͈ QA듲, (Kb&s. ^Bj9W(rƢǚh;pArh.h`>X̙3mGܓx!QG|*& 9me!0 x5"qG&~wyK%0zD$x뭷ZL6Ѿ|&ny$"R7qgB9RGdH$馛ncB_"N,:H䂶1@AXcjBmG!"9}[[[\+̙3Kr$!nmmmQ1 bKhE$Tl$5+xx"Xq%IL%,u-8b1 erJ7~`/MQ& h05 1 AOɧ)KWaUe!ƘG_ d,M iqnw2i8.e 0%lyGtܹL9W =63t]\uXAr]4\7E[Ho,Eؐϝs )pB.f)Ts kCfx㍑AJfX 8 ?ICi쯐115Gk=eq:Fo&Rhۄ.Ly$"VAM8S;Pñn}qy:A鋌ΛKT>G7zQs.RRU&n ex 0F"ԣ 0>ژxcc-Ho;S1` F7ly7]?Ò^z! 怤"WAUD(9K܈l3 Œe750zGTh{Շ+ˍz</( Ӆܲaum._+tN\Ȟu9aVN4MQŕnQ\.DDxfT+Tι@)y@ق6ιR6"a#& M/ޠZquИ0q@d2l:߻M{У$b|LڠS11Z,U؅EC,{mr;X e%" tgLj{BR2N%D$9lhr2 7P\h .?qEt D$NMJ~s̾gyf裊3nMǟE(]D5ԥ̴ГiZD ibx p񢬻kSO=5ݍMoIAاTF>}iK" D矗h7">rHڏD}=$x,r[LD"c-"ɧ~e~ sd2+)R\ %WLc//mlf67795Z yG?AS~@#m$/qMs &Tc<[ -"PC'E)}ӧƷe٬$MnJbkLys.p%"!}Zxҗ}'ܹsK4ߎ[>T͈a,?d20i+GIdʼmanIR\ ܚG^6𳊌JtiX2ƹ ݆^s.Ѓ>7-~K6/#YLܵXc5} e\2[-"=LrWZ$AfbZD$S4no///{='Z ,7ys =$d2BxHˌ0*/\P V',D$ΰSC(VD)"ާ-qZJ s$F7'WN_D7uLUB{ʈ{u3h贙Hha0iQ5&z pH7u%" OdZޘ!my Uy @?1Se1C!S \q`%LPQ|`Ԗ-4 ; ) 5R6tPf'$th >|P_#!YJ7Q@xCe]'WzRȬ2fR0LpH'Z1ޙP`w70(-4`pb3z e]pɐ4/ι~D%P~A(+ߧpGկ~I"x/#቟8`h؁=TfWYFKT hkF!~{{/fC%8a+J-ei:05NjvO †TV+9oPVFu먉^S%(' /"C%d?I:VD'xbt=ذA&FV#/&`!utǢZ姼d<3-[v.BUmm:ۧO^Xi766b\r|W:j\R,͖,g.ҟY?ԔB9\xgtMNjK|PZ|= teιTGx)r\|\&]n8q"$[0O?ob8ܐ|%\'0u$_/b1N Nrz~s7.3Iƾ"{!V#-w[ƈ?yה'2vac?|ͺgyI8Q`ʉzw&W/?{L P!XD\EP-z6()Y:-"R\r%77Bopc8q"{7 媘nL}%hsvG{a1|_M&U[@DjdѳV!\9Wy]+9R0E|Uv%ǏoĀ%UNhVL>zR} 1\D5 D*d}ڎznm>|x<Iw}2UhO>P?:FM \6N ULSPAMƟ}C0*6x&WY vty>$7¦ģp^N;cm ;ga 㫯#0 5op;b}&Ҙ>c)LO6".R=۴BzC*>Qt0L6jUɫ3:tBpU.]=6@ewru+UIjIs.zsFbhp:X5Qn.|uu#e",~.nLD""R)K#!%nt@dI6GVMR&2Sl h{0j efYOZݭϜ9$`}}=[ZZ* 3T IDAT F=RM2ZYq({)5DwYxf:\yz]ގc%[yŞ ZaפR=Lh&m@oN 66=L}ZH @fSwe$c҇9'a k׮e[[[ i@-=nI@PT"R+1 gf"÷}i\St4ϦMTl׮]h E.!2"k[A"^h ms"wCt@7eIv |9ժƋd^q)T:gԩы/ J E$0b&j+%)[ȨqhE[6Za=)YLẴTXvEO?tگs#9*s BR$\r CViFܹsܪ K*^œ* M_.=!'%r}0\Rmݶl(`gyfa-A%^hAD\1L xC@#ݴx6eSAr2ZVtǖ92 T SbLMƗ]T(VFD'uE6U(?lpCz^BS7~62Okh [ڠπ ->cm): u4U])`K/BpYtWΊ'<[$Exĉ, 0 m2[z%5"(י5n]A">|EJ,lV?EQ`ً/X\x,{mN nL'|RhiZVU@KUB7T>җL`šlɇ ^ޮiXa"%ZL.BnW^f 3 7E0Fl| okj {xc{ s9Z-hL9Gv\m dҥ6o) occ\sT΀ Kˡl\`6n'Zpؙn袡d(X{Ɋ uh*_=cQ<# #M\QG⑙~ *h B$g.4! 6QDzZ.r+7GZL_֐X q`&C&Q }@9J#ӌZ!T:,pww_콇"h" ܧ2X Tȳ0@D:6ŝn`j튈O̹:)J/EREo]C6O~򓁱YN&xEyK=d"' q+ݭ] 4c\`HmMRkzab >I3K6Rn[ݕLD}|3"|1*Rmo-w-i=H`Z-=[-?O~{A-L}cX+E,Q"PIrȑyw1[Mw)_;T7\7`W=}t…,%UQ1o8BwE6cJNU)JF`$@Z - ,಑Q+o|@ F8҅d :tI.uƼXҊ<&x~O;4prbr #O-+LpoFL+>SaoQuiTҥKѣG!WR B̧vz%$b,ߛjM~>{luj{{;҇1ZlD' ԋNH7bG z#b!߼5LxG0e[ -ihC8hJ]!I|Z` @F4xA~7)1sd/^&M7gz1 ?s{gw~zyammm% i?,K2c>w\[IT6B84rΕ;;;q+sVKADUP=<&Q=zRƛ>JxLbj/Z -Y~{J"ɇ=)TP܁e sXDZN'NA%X[[ }c\aʱcǖ AŋP>ui:ڄ@˙PQȞbVwEER#J6Nk;sh-iiP8h|ovvv&_0nrqt vœɤ"s%eY.%z("=_FJH`Em,; ɦ<bU2꫃>}/Px\Uc]haZ98 TzLs.z`׵[Bͅ!AjZlJ`_='I ƈ͆/7F(fFƉi)3R4XpFI' 9vΕ tX`i H Eei7Vd>pB=uc@tc$ET*rCkm"O!l#a_. KXĢf_={ Jʚ({ccVN@yлcXK`an ԉ #WM˒00}TfZA^gSώy"Hs."󛊱 Z dDPgMڶ~a3mh'Ҳcpcc6˗sAF!qSO (ZkzIi2B WWW{C>8>s Q%3"?iM@)˗/wu(0!܉;!mAH\9N lmVϞ=$1-A DFx,"O~bCۑ?~RBPr*bv.1=B HߏUFdꈒ Zk^{,--Y*}ss${wy̸ݎan.\r2 6Ek4xR*Թ&! g24UZFuIpÇ F]~!TMؤGs.R%sltZKiض*pg:r.``0hR12MZU>QKCsdZPQDD>7%ݮҘA@B)"=Hb?LB_8 Vx3v!H%"m#19t:(Pw*"CuH)[[[Cϝ;VEe"I^U<AollV!n{{1U3#@^ ǎloo`iM&ɓiѣG+Q4)DlI"#"4@,HjTArJFBJ{r}w̆D${,FY[[˩H}_]Q`ZJU袮PoDSf01X t#mDDΜ9b߅6 \9s60G]+ i]/܃B7M] E Dd?e  g8J|P=Fz.ݪAv 9'H9WZ 6~2xmm gW_iiePm%ƪD,RJ~(":!5&BŪã>>-DDn&d2~dsєE+ ĖhK@ 0ąވLT~nH5~.0dd4(LPMyl)) ? F&)1o Bfoa&,&Ixd#ٖ DO[!ݮ1P mJٷxv Co!2n \3%;C0.ѧȾd2Pt$S) N/Fw1|$d{[vU$ He!C}|gE~`FD^|Tne,rkETdt?_?~RuHoպJXeW6sVvZU"hy_CK;x<mZZ`+W$VLt3rCr?7և~[.We_+#Ms#\$Z$¿'"i&I?䦣kJS\ґFIY?""}kkk9Fιԏ=X.Vi)2xj`+ HLJegY!Jj cjQS=pٳ7Sf>nH]ľ____z*o9rdE.Qz;吏[z[Kߌ-S;K.:Fx =ad\k }8;&Zׅs)ދBwΕ/J"$n=ji0C`,g:@e38 YdL$2! sxx#x0OͲ즦~* Ru}"M{`昋@mCdD`ɓ {"R)-5+ncydo'])#/h;o g(T r(.r"# 1-tBj꜋ дV[-Z+ۏx[P;k 6xN=uʷGQkN!3&]<k1@r`iOb.Q>3-l+iA@HG : =KMH8ɜ}Bթܳn)e|p *'2-Sּ j*Q"#7ee߄fmSJ6b`ݱa ȱ:+s~!aszsq kq,UAS`CKsf:,=~~ԩ1E1O _#n `~v7'!zm;485… Ņ  3gC࿠DcQib8Ɉx~>Eߧ%>+heCu ٰ&w+DIO?4Os髵ЊިJ (=1 %ZG^}s`;kv/kGoܒ=a%rob_:x/ml56fyI?yaQ`SY5 {D*8k׮ery1ԉŀL%"\[ؽ-8}\s.Cf%|`*f]l67P (zw]e*+{iK:g U LNVs8]%%Iʮ0m0DT(|r~M7TkME%d2˗/ޚii\_?<Ѓ"cЍ:+rݠ=VDQ ,&-Ҧ+z*z;C 7Ɗ.Po -Vw_mnٳy]RexҎ[A_F*J8KD(啕ƮrMnD$D6inoow `oC\IX>XBP_1uJD,9Ks0 Q_>{zιQsC/ IDAThRg)"=Z& D6xbxp˱:z7ythιB d$'+s"/BW+)|"g]$d:dzTݔΓZT[`4w|ڗ'E"2PQa؃ƃ*EUD`w6w` '<ޔ$s]DS&PkPI󗌙6xi? os%lc=@Zhh6C=ӹ#`눯lʾ[԰~l+ua"'׊{ʌ>+mXʞrf~U&9Pf}y;nnn"/te& `_\dlT*ɾB7TbfrE#?!+6lg}.][g}%csjY+wZ397)P)($0a$9[őqGwvv2;TNsF_Q1[*{㺮KVBʹ5w6)y+MBÏ5>Mc}1ї z ?$EnrbO(TQj~#BT5ȽS[ׅsLZ j)ʗ_~epDgE#12膏JJALƬSZ*jaS̴ڵkG}Tf.0U$"R++P5ys7s£oƹ̈<H2[/}r8=a#ΛKշJCT`C\Vfm/*"vC64(Ve;Rv+Л"#Mb%QfY|C**h`]X?TFe@ 1d:1nPSr=A7aSzG2[죏>i _G9h9l69%@NsNGd7< (&+z`CѨc"I"3Ei8""#RZ&q;gՁ::Bn 631q/֜MN5Sz sxy(j$rQ^@Qf Y`m{m(xf (m&^+9҃֍ (pRLfnl P|#ҟ0HXιH4,yMta&Ci:NC LT[hgϞr42`k&vB~)d33\|g>?lfիh$ιڵk*@9)怜JHUw䴢6}!|'SG_l1(#saJ]Ȟ_C>n}8Js%٘ys4O$ċ#(-| % u]sP~")W >ڀSDn^4顗"h8r${)!-fιX@Q+?_f,qL?tn>R900QcDx LO1_|Q),si]ԼghdD³駟ΑN7v„@LY@8tMR9rdklTH t\J(￿ rhd&M-{s5掍ڜ$ͦr*};Lte=и* ~zڌ"t>}zAP\! ,?s :Vkk%?;%tСʆCG K }Zɏ:P_ R0Vox5ɥ2;~(摑 uQM}ڤsI٬;'4!+8Ce.E[6SećLDҦ2̕S{$>$\fRFR4qNsw\?Uz.]J>%C߭54@,띷4[E!\K|A۰p{F^jDMϙu6hdNyҥD[ ;ߜUϡs.1>ZB3Ys@FҿWPޡs,LT_*k9 ^|B aib__Fbl젷B?}ކ9j#q3ZȞ1*OB-:pz]Oq"ع*ѱiк""ַFږb•<5{iL[˞TzpʕDd˜ޛ')_NK ! +N0cu͜s!!8VY`gLb݆_•޽/՟? -1ӃB5 |"GH}d}}O` .Pia¥rss3V6XtST9.VDhBء2.6|ʙZs.ŭ/0 pX,g 2숌Uհis#P/x\(/xNpKY)$Pln(#x0,!zjb(2B!麶m >bK⹩s"Sq%:R8bŒye@ш?%* 62LhM,ٔVD%[<°d<Wd?aHYL't:=Vli̝& X+W:ꑑRHc">L3>Q@*wIc8ښ& EW/}iMdڇ€)4BOxwwf[y{~cǾHw$bNkɾ,:yd7D$zF1}uz}4!@6ۘtmA:mРԫy2£JoKBu=r2}efH~(\3b럝ccAH;ۀ썔nll[RX+CT|5!} &>'8 e$:rxl B[,Jr]#:7U荈 dĐVjm OWfI-g۵\L|ֻk8M6j,U(ΥWœ\toƟf1Y$ :,A)JtmI9QJ4,0Uo\pUØ 8@e\>Fe^H[oʑ`*LwҐK.;xb[o`-9cgKg,TFNkL=M-$ʱpjþ1M2V4 "'QBwݺ )F _S _?`6*NDt:] cgɗ"ҽvZ,@>4o,8޷%"5(JȈ~ GDi(Z0ԯVWW{0@0j}a;ɤV f#xWP7\j}7<,|ml<[!rȂ gU[֥KJ%6,f9Kh.͇(z+-z* P{;{  UpV8l d*"Çog=W<!PEk6Ե#X?oecc#0ŚӁLi$]^a$@DzF4n -~4bD$rJI4^(ca}_39e#Vh-,mnp *Li4^x NQI֋j(r7UJep+F/BWZ*0r_W<>+"]}^|y8V1ʄ,^|ł&[i~|?ˤgG`|vLEl6 a$%9X*>uw}g wq\{dvQuL^}Rۅn 6@b`ړ@,{9kHzĉIʣ>foK&-ݪaqlxM/ 2aB@wKD9>3!;9?:L @ZfnLe m"$D~>кι tڙf2 -gN)%Ś | ^Qh7yP5 )1ώh  pιTG֊hd C6 +3zw՗.]j7fRaT Z D7Tّ&ʬ gcZm VtJX`zz"`io4`n>sj"LR8%?盕E^eϊ+9eHIC6Y,]c~]4Pd[s2a됷v i$&D'Z:ѣGoVChs'yé70R%D2(윋Cx/Y[[˩u mMs/_Χig ~ ?e 0K)մ~{4n6Hxы/[`guӬ'tٌ>X9l42E/Ut̙v_: h )>Kabz'd=!+n1ڠmʊ}2蜋Mx jБHh( DA䶈%jhڵc?Mps9G"փologN툳OjccX9?q@PD<0eS_\|9oZ_g#* P&RM&3x}fq֪@@w#XH 7p KNJLXf*:4FEGPԩ^ c|#y晖9x‘+ҡV#6#؂8YK/4Dӟ:sL7wʄe̩9G=x+Z aCpV0 q{4hR7$f+ZL':zhŴm%GX|7?@Y__o ձ`z*׉O<dFNMձs.Q1(z\W0 4M/7|s$c}Qӂ`` -&y![S)FJF:o$eڈj U^5+XL?ޅ551 6mSN-?TjTPUUt:]¶F}ƒJjR^4 "tIqC+d!lAT:"TE^Rt/ǔFw;lH6L5*^FpӪQAü+kE3efcp0odW*,8SDWz񈣊|~PeO1݌Cb! bXiσb$$I I?#l[]%7^f]s]w52Î|+vҙs.3*J@qgb24: YG>KA.^駟R}Mߣa`yfHZ>3 aSq9@̗_~is.6e~fHo錞*EWEVp뭷Pc+@+U(@<%&bVfLH67~{sXn YȎ!Muxhdx"{׸zjPJ 4Tom64XTo(!H uƹB8MD AlW+ŚH 3SXDySQ |LfL b X}SAKġ\DF{=p8@A "6\,Q;7BO[u-uUg[NzricZ-BAmBДXCe" H'(AAtPPp XAgoN>Gj/9gz}.(m[fźJD䐮uc,J#.nSuiXoEl E9x%v'2 `@]R;_}b" z61GiCM=Cm3Ɓq6"E a+wXDҭDy3) r-O<9M_)U:zQB5\fX %GPyUs"sz`IDAT;IW7vOqRa3U Vf(p3flJ ͬ2%ι$5N? RGJdLRU4۴Lvߟ`~~>!1BᑐLNNRh\n!+qYcnwU("gd>==],..FL&+aÆ|aa!{OpPo.\t399٧=u7qFJ&]#`kc";bZXX)w/Uļ!pKB܀T'=E9gffgg+,3<7g6776l35d7X!J9DAݛ ?VYl("kȸ$Na}k0y=Py$p(I>|g00Huȕ<6jA ŗzD%I.ÇJ81vgT٪3gL< )ɢk:HB":ιBl<'jc% 32EqSι_~i~Gȡ޾ S#l!?SBNˮ?]] "3g4'teW! H 1#0xG\46WjlVYHGQDǎS LEDRE"F4٠[J2Si (riii@JMWSN8@DIo0DS#r1`Psx#}7ι`ff%sXC4b\׶U;r(Lݻ66-",k#һGqh[W?  nn`\0ɓDs!}@vu@#A\~gBYwXt(a pbbb p23iUHWYwvR:u A6 !&zZ~Gy`Ɓg@5?w^ Rŋ[aLhv_Μ& (njM1kuVn|^KR>}nnnVMCs.9xम}>%&#p8q&zykkkҢ -sŚ%)'Ivb}:Ta,1~}kMgԼp"!$KKKQYsW%#ew?5YS ʍSD$^[[M 4mNy,6[b2(Sa($&p)pY"NneG3kkkʼn'%_* ?9}U)B[+fp ۃwsRuMc2ڌQhL&;0:oǦxh0©OR՘ڇ#gM=4 gv:zh_wsʖ"$5BO,5Иil.h[+cWVVJs fg„z2e?%U+8aJ@,ϵFm X |k`T={vdb?tȑ:ό₃ P$t@wEpI-@wED EA/N%!nbI0vJlB׫u 2Ƃ YqZ{d*h1ˮ5oAxqÁsxESMz(9psss)T0ƌ"\Dn~1bC#C i֬m]^] 䙡Ęrq`ڃO>MlQF 2)=6$LU5—'<AxD.AȈbϺY&$5(ݐq5u=@qiIFa~M !8b 4LZE￯ $Lq%xED?>b!2z"։LG4jL'pľ(F0қKu ^:kIlkM HahXѣGbDF}`ׁuٳ{";u̐@""&Y6G01Z7S3uVC_dbZz(dPj5H#s;W.3Qd4Ve\~oPKC*aSQkzyAe1Etܐl-Yt5DdHxSDRKplzftC6tB\ldU4`^hp48˕ Rvcr*zj*OTz!Ȏ縺cdTZs`0 ggg3"/E`)ͺ:~ cJF*bV|^*&XiΪ-4>NP#Б~TD*}+\J)q]F_2%!bS{pš5p]# N۱qܹ!om8%04==]spBX>4hָG&0)÷΁#-R:/^hqުDb'|>&kr!a]M|Jx FlAOD$/mx." [$"VtEfKH dGXΝ;8:""̝QXi E S%#IpThD'6Zcf}]ODM!b*޽{) I'w~6]ryEoXVĞs.U9SҞ_ p3}Ji ?N)0M EH $drYqƍs.~W^6-ASG>n*{e+ڂrSDKBsss)p}8{BV+ܼy8X3i-)m9@(#"cz0C3t͘V JC'KKKŕ+WH?DDDbdԫkzƤιTْG\ܿ'" `5R!ESHs'OTkj2Oh:اC87>NDICUY-̇ϪX&z{elUoʀyO;P׆+}D)U!_XɎxS#K|ZٷR^>ؑ`zÆιmIx-H666ZËЎM /{;*󺸅W6,IP&LYuCVͥ.8j7g [E$ꫯZ"w (KCl=Lي>7,o9(-9"K0L*m7c[۰LRBd'W2XBZ{nѣG1RgZݏO YYGDT/@)ؕY, s pXj~aN#MX#/Q۷[;lO! ڵk=zAmg)bCng9㊰g"=SrL՘װ d tz JHѣG΄ π^%ΠtS+V_l~Z'+WLHόF @.'#U᫯t9ͶKfgga=-aA#ԵO{Jg쵤c&6:һwﶶS?c%r%tWFLSѯy@/"J.z}MK>ַ~;/"t? ADkSς(v8)?0f,-"+էje|\W.Ȫ={3 B5FEd0==]ͥ06d䜘~!b)X7ݻ׹}vK7@ " $>2PtrLVw* 5=\rmŰi<}4]^^N ͬ}; _dJYWNm";&'|ak3WUH1bBSMcZTX)%"^ ?CZ333v52 GM Vq3 -RkkFr# @pKv&TA{*͘~&& `ɓէ~:9 $ YJZPXYYPd.ඇ!ZF )b!| .B_@I"l8cbm!ƭ Hgϩ̑5Г'O%uղ Y @?{wwۮtZpvv6xpvv TQ6xcRݏb`qq1 Ԡנd2 Xɶ~rDGB/~fuQ:uJI1tq?40;q4z,2^zkux=(wO)%ADڟA2ȁ8ZNq>}D#x)6LDtRn7 ГnV!]bl1\pȑҐzqhW$' $^@;v%27C0 qUq/|+eL Ќc\7SSD--(^dY믿ZM5&o޺u}ܹ|BO朋[ PGD L:)89um)T*VzdnV5իWݍq5tI"" jT>IENDB`ubuntu-gnome-default-settings/lib/plymouth/themes/ubuntu-gnome-logo/password_field.png0000664000000000000000000000227712310475506026700 0ustar PNG  IHDR .2]L$bKGD pHYs B(xtIME&#0LIDATxݱoW$,ۢV"g@CՉ3RZ T!S#@moTQ.#)T0b1Ν}KDžuN7|{ `p}Q=k7F@PFH3,z/<,mm>%P~D02L-4Ba9 jY{+ [<Qsxvff:KRGR2zHղnW*[x&A/ގ8H$WtWElnfU&!J)x: fX9^jeu өLIKpP(\D?9?@,ÏKaw'&N]H*)vHyCrGlLvA#F˗ å Ͽ]Zf`PnPt^(h-MMɡD<~^#bw>CПJܿɕ#?K%$(