tcos-0.89.93ubuntu2/0000775000000000000000000000000012260610427011071 5ustar tcos-0.89.93ubuntu2/dbus/0000775000000000000000000000000012260610427012026 5ustar tcos-0.89.93ubuntu2/dbus/Makefile0000664000000000000000000000032012260610261013455 0ustar DESTDIR:=/ all: @echo " dbus: make all empty" include ../common.mk install: install -d $(DESTDIR)$(DBUS_CONF)/ install -m 644 tcosmonitor.conf $(DESTDIR)$(DBUS_CONF)/ clean: $(QUIET_CL)rm -f *~ tcos-0.89.93ubuntu2/dbus/tcosmonitor.conf0000664000000000000000000000212312260610261015247 0ustar tcos-0.89.93ubuntu2/tcos-standalone/0000775000000000000000000000000012260610427014167 5ustar tcos-0.89.93ubuntu2/tcos-standalone/tcos-standalone.glade0000664000000000000000000006320012260610261020260 0ustar 400 True TCOS Standalone GTK_WINDOW_TOPLEVEL GTK_WIN_POS_CENTER False True False True False False GDK_WINDOW_TYPE_HINT_NORMAL GDK_GRAVITY_NORTH_WEST True False True False 0 True <span size="x-large">Configure TCOS standalone mode</span> False True GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False True 0 True True 10 True 5 2 False 0 0 True True 0 True True GTK_RELIEF_NORMAL True True 0.5 0.5 0 0 0 0 0 0 True False 2 True gtk-stop 4 0.5 0.5 0 0 0 False False True Stop True False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False 0 True False True True GTK_RELIEF_NORMAL True True 0.5 0.5 0 0 0 0 0 0 True False 2 True gtk-ok 4 0.5 0.5 0 0 0 False False True Start True False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False 0 True False True True GTK_RELIEF_NORMAL True True 0.5 0.5 0 0 0 0 0 0 True False 2 True gtk-apply 4 0.5 0.5 0 0 0 False False True Apply True False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False 0 False False 0 2 4 5 fill True True True 0 True 5 2 True 0 0 True True Enable tcos-standalone daemon True GTK_RELIEF_NORMAL True False False True 0 2 0 1 fill True Username (root): False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 1 2 3 fill True True True True 0 True False 1 2 2 3 True Password (not visible): False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 1 3 4 fill True True True False 0 True * False 1 2 3 4 True 0 2 4 5 fill True True GTK_RELIEF_NORMAL True False False True True 0.5 0.5 0 0 0 0 0 0 True False 2 True gtk-dialog-authentication 4 0.5 0.5 0 0 0 False False True Enable SSL over XMLRPC True False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False 0 2 1 2 fill True Options False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 label_item 0 2 3 4 True False False GTK_JUSTIFY_LEFT False False 0.5 0.5 10 10 PANGO_ELLIPSIZE_NONE -1 False 0 0 2 2 3 fill True False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 2 1 2 fill True 0.5 0.5 0 0 0 1 0 1 fill True 0.5 0.5 0 0 1 2 0 1 fill fill 0 True True tcos-0.89.93ubuntu2/tcos-standalone/tcos-standalone.service0000664000000000000000000000051512260610261020644 0ustar tcos-standalone-%h _workstation._tcp _http._tcp 8998 tcos-0.89.93ubuntu2/tcos-standalone/po/0000775000000000000000000000000012260610427014605 5ustar tcos-0.89.93ubuntu2/tcos-standalone/po/FILES0000664000000000000000000000005112260610261015362 0ustar tcos-standalone.glade tcos-standalone.py tcos-0.89.93ubuntu2/tcos-standalone/po/tcos-standalone.pot0000664000000000000000000000302512260610261020423 0ustar # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-06-30 10:10+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: tcos-standalone.glade:9 msgid "TCOS Standalone" msgstr "" #: tcos-standalone.glade:32 msgid "Configure TCOS standalone mode" msgstr "" #: tcos-standalone.glade:126 msgid "Stop" msgstr "" #: tcos-standalone.glade:204 msgid "Start" msgstr "" #: tcos-standalone.glade:282 msgid "Apply" msgstr "" #: tcos-standalone.glade:344 msgid "Enable tcos-standalone daemon" msgstr "" #: tcos-standalone.glade:365 msgid "Username (root):" msgstr "" #: tcos-standalone.glade:414 msgid "Password (not visible):" msgstr "" #: tcos-standalone.glade:521 msgid "Enable SSL over XMLRPC" msgstr "" #: tcos-standalone.glade:562 msgid "Options" msgstr "" #: tcos-standalone.py:170 msgid "" "Not user and password configured.\n" "Using root system user." msgstr "" #: tcos-standalone.py:246 msgid "New username and password used.\n" msgstr "" #: tcos-standalone.py:269 msgid "tcosxmlrpc running" msgstr "" #: tcos-standalone.py:274 msgid "tcosxmlrpc stopped" msgstr "" tcos-0.89.93ubuntu2/tcos-standalone/po/pt_BR.po0000775000000000000000000000371412260610261016157 0ustar # translation of initramfs-tools-tcos. # Copyright (C) 2009 THE initramfs-tools-tcos'S COPYRIGHT HOLDER # This file is distributed under the same license as the initramfs-tools-tcos package. # <>, 2009. # , fuzzy # <>, 2009. # # msgid "" msgstr "" "Project-Id-Version: initramfs-tools-tcos 0.89.19\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-06-30 10:10+0200\n" "PO-Revision-Date: 2009-01-14 08:52-0300\n" "Last-Translator: Aécio dos Santos Pires \n" "Language-Team: Portuguese/Brazil\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit" #: tcos-standalone.glade:9 msgid "TCOS Standalone" msgstr "TCOS Standalone" #: tcos-standalone.glade:32 msgid "Configure TCOS standalone mode" msgstr "Configure o Modo Autonômo\n do TCOS" #: tcos-standalone.glade:126 msgid "Stop" msgstr "Parar" #: tcos-standalone.glade:204 msgid "Start" msgstr "Iniciar" #: tcos-standalone.glade:282 msgid "Apply" msgstr "Aplicar" #: tcos-standalone.glade:344 msgid "Enable tcos-standalone daemon" msgstr "Habilitar o daemon tcos-standalone" #: tcos-standalone.glade:365 msgid "Username (root):" msgstr "Usuário (root)" #: tcos-standalone.glade:414 msgid "Password (not visible):" msgstr "Senha (não exibida):" #: tcos-standalone.glade:521 msgid "Enable SSL over XMLRPC" msgstr "Habilitar o uso de SSL sobre o XMLRPC" #: tcos-standalone.glade:562 msgid "Options" msgstr "Opções" #: tcos-standalone.py:170 msgid "" "Not user and password configured.\n" "Using root system user." msgstr "Usuário e senha não configurados.\n" "Usando os dados do usuário root do sistema." #: tcos-standalone.py:246 msgid "New username and password used.\n" msgstr "Usando o novo usuário.\n" #: tcos-standalone.py:269 msgid "tcosxmlrpc running" msgstr "O tcosxmlrpc está funcionando." #: tcos-standalone.py:274 msgid "tcosxmlrpc stopped" msgstr "O tcosxmlrpc está parado." tcos-0.89.93ubuntu2/tcos-standalone/po/qcv.po0000664000000000000000000000413212260610261015732 0ustar # Valencian translation of qcv. # Copyright (C) 2008 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Pilar Embid Giner , 2008. # msgid "" msgstr "" "Project-Id-Version: qcv\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-05-10 18:16+0200\n" "PO-Revision-Date: 2008-07-01 14:36+0200\n" "Last-Translator: Pilar Embid Giner \n" "Language-Team: Valencian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit" #: tcos-standalone.glade:9 msgid "TCOS Standalone" msgstr "Sistema autònom del TCOS" #: tcos-standalone.glade:32 msgid "Configure TCOS standalone mode" msgstr "Configura el mode de sistema autònom del TCOS" #: tcos-standalone.glade:126 msgid "Stop" msgstr "Para" #: tcos-standalone.glade:204 msgid "Start" msgstr "Inici" #: tcos-standalone.glade:282 msgid "Apply" msgstr "Aplica" #: tcos-standalone.glade:344 msgid "Enable tcos-standalone daemon" msgstr "Habilita el dimoni del sistema autònom del Tcos" #: tcos-standalone.glade:365 msgid "Username (root):" msgstr "Nom d'usuari (superusuari):" #: tcos-standalone.glade:414 msgid "Password (not visible):" msgstr "Contrasenya (no visible):" #: tcos-standalone.glade:521 msgid "Enable SSL over XMLRPC" msgstr "Habilita el SSL damunt d'XMLRPC" #: tcos-standalone.glade:562 msgid "Options" msgstr "Opcions" #: tcos-standalone.py:170 msgid "" "Not user and password configured.\n" "Using root system user." msgstr "" "No s'ha configurat l'usuari i la contrasenya.\n" "S'utilitzarà l'usuari root del sistema. " #: tcos-standalone.py:246 msgid "New username and password used.\n" msgstr "S'ha utilitzat un nom d'usuari i contrasenya nous.\n" #: tcos-standalone.py:269 msgid "tcosxmlrpc running" msgstr "executant-se el tcosxmlrpc" #: tcos-standalone.py:274 msgid "tcosxmlrpc stopped" msgstr "el tcosxmlrpc està parat" #~ msgid "busybox running" #~ msgstr "execució del busybox" #~ msgid "busybox stopped" #~ msgstr "el busybox està parat" tcos-0.89.93ubuntu2/tcos-standalone/po/es.po0000664000000000000000000000445712260610261015562 0ustar # Spanish translations for tcos-standalone package # Traducciones al español para el paquete tcos-standalone. # Copyright (C) 2007 Mario Izquierdo # This file is distributed under the same license as the TCOS package. # , 2007. # , 2007. # # msgid "" msgstr "" "Project-Id-Version: tcos-standalone 0.0.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-05-10 18:16+0200\n" "PO-Revision-Date: 2008-05-10 18:16+0200\n" "Last-Translator: Mario Izquierdo (mariodebian) \n" "Language-Team: Spanish/Spain \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);" #: tcos-standalone.glade:9 msgid "TCOS Standalone" msgstr "TCOS autónomo" #: tcos-standalone.glade:32 msgid "Configure TCOS standalone mode" msgstr "Configurar modo autónomo de TCOS" #: tcos-standalone.glade:126 msgid "Stop" msgstr "Parar" #: tcos-standalone.glade:204 msgid "Start" msgstr "Arrancar" #: tcos-standalone.glade:282 msgid "Apply" msgstr "Aplicar" #: tcos-standalone.glade:344 msgid "Enable tcos-standalone daemon" msgstr "Activar modo autónomo de TCOS" #: tcos-standalone.glade:365 msgid "Username (root):" msgstr "Usuario (root):" #: tcos-standalone.glade:414 msgid "Password (not visible):" msgstr "Contraseña (no visible):" #: tcos-standalone.glade:521 msgid "Enable SSL over XMLRPC" msgstr "Activar SSL sobre XMLRPC" #: tcos-standalone.glade:562 msgid "Options" msgstr "Opciones" #: tcos-standalone.py:170 msgid "" "Not user and password configured.\n" "Using root system user." msgstr "" "No se ha configurado el usuario y la contraseña.\n" "Se usará el usuario root del sistema." #: tcos-standalone.py:246 msgid "New username and password used.\n" msgstr "Se usará el nuevo usuario y contraseña.\n" #: tcos-standalone.py:269 msgid "tcosxmlrpc running" msgstr "tcosxmlrpc ejecutándose" #: tcos-standalone.py:274 msgid "tcosxmlrpc stopped" msgstr "tcosxmlrpc parado" #~ msgid "busybox running" #~ msgstr "busybox ejecutándose" #~ msgid "busybox stopped" #~ msgstr "busybox parado" #~ msgid "Password:" #~ msgstr "Contraseña:" #~ msgid "Cancel" #~ msgstr "Cancelar" #~ msgid "Exiting" #~ msgstr "Saliendo" tcos-0.89.93ubuntu2/tcos-standalone/po/fr.po0000664000000000000000000000400512260610261015547 0ustar # Translation of tcosfr to french. # Copyright (C) Julien Patriarca 2012 # This file is distributed under the same license as the tcosfr package. # Julien Patriarca , 2012. # msgid "" msgstr "" "Project-Id-Version: tcosfr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-06-30 10:10+0200\n" "PO-Revision-Date: 2012-04-26 08:36+0100\n" "Last-Translator: Julien Patriarca \n" "Language-Team: FRENCH \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: tcos-standalone.glade:9 msgid "TCOS Standalone" msgstr "TCOS Standalone" #: tcos-standalone.glade:32 msgid "Configure TCOS standalone mode" msgstr " Configurer le mode autonome de TCOS" #: tcos-standalone.glade:126 msgid "Stop" msgstr "Arrêter" #: tcos-standalone.glade:204 msgid "Start" msgstr "Démarrer" #: tcos-standalone.glade:282 msgid "Apply" msgstr "Appliquer" #: tcos-standalone.glade:344 msgid "Enable tcos-standalone daemon" msgstr "Activer le démon tcos-standalone" #: tcos-standalone.glade:365 msgid "Username (root):" msgstr "Nom d'utilisateur (root) :" #: tcos-standalone.glade:414 msgid "Password (not visible):" msgstr "Mot de passe (non visible) :" #: tcos-standalone.glade:521 msgid "Enable SSL over XMLRPC" msgstr "Activer le mode SSL au travers de XMLRPC" #: tcos-standalone.glade:562 msgid "Options" msgstr "Options" #: tcos-standalone.py:170 msgid "" "Not user and password configured.\n" "Using root system user." msgstr "" "Le mot de passe et l'utilisateur ne sont pas configurés.\n" "L'utilisateur root du système sera utilisé." #: tcos-standalone.py:246 msgid "New username and password used.\n" msgstr "Les nouveaux nom d'utilisateur et mot de passe seront utilisés.\n" #: tcos-standalone.py:269 msgid "tcosxmlrpc running" msgstr "tcosxmlrpc est train de s'exécuter" #: tcos-standalone.py:274 msgid "tcosxmlrpc stopped" msgstr "tcosxmlrpc est arrêté" tcos-0.89.93ubuntu2/tcos-standalone/po/ca@valencia.po0000664000000000000000000000413212260610261017327 0ustar # Valencian translation of qcv. # Copyright (C) 2008 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Pilar Embid Giner , 2008. # msgid "" msgstr "" "Project-Id-Version: qcv\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-05-10 18:16+0200\n" "PO-Revision-Date: 2008-07-01 14:36+0200\n" "Last-Translator: Pilar Embid Giner \n" "Language-Team: Valencian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit" #: tcos-standalone.glade:9 msgid "TCOS Standalone" msgstr "Sistema autònom del TCOS" #: tcos-standalone.glade:32 msgid "Configure TCOS standalone mode" msgstr "Configura el mode de sistema autònom del TCOS" #: tcos-standalone.glade:126 msgid "Stop" msgstr "Para" #: tcos-standalone.glade:204 msgid "Start" msgstr "Inici" #: tcos-standalone.glade:282 msgid "Apply" msgstr "Aplica" #: tcos-standalone.glade:344 msgid "Enable tcos-standalone daemon" msgstr "Habilita el dimoni del sistema autònom del Tcos" #: tcos-standalone.glade:365 msgid "Username (root):" msgstr "Nom d'usuari (superusuari):" #: tcos-standalone.glade:414 msgid "Password (not visible):" msgstr "Contrasenya (no visible):" #: tcos-standalone.glade:521 msgid "Enable SSL over XMLRPC" msgstr "Habilita el SSL damunt d'XMLRPC" #: tcos-standalone.glade:562 msgid "Options" msgstr "Opcions" #: tcos-standalone.py:170 msgid "" "Not user and password configured.\n" "Using root system user." msgstr "" "No s'ha configurat l'usuari i la contrasenya.\n" "S'utilitzarà l'usuari root del sistema. " #: tcos-standalone.py:246 msgid "New username and password used.\n" msgstr "S'ha utilitzat un nom d'usuari i contrasenya nous.\n" #: tcos-standalone.py:269 msgid "tcosxmlrpc running" msgstr "executant-se el tcosxmlrpc" #: tcos-standalone.py:274 msgid "tcosxmlrpc stopped" msgstr "el tcosxmlrpc està parat" #~ msgid "busybox running" #~ msgstr "execució del busybox" #~ msgid "busybox stopped" #~ msgstr "el busybox està parat" tcos-0.89.93ubuntu2/tcos-standalone/Makefile0000664000000000000000000000336112260610261015626 0ustar LANGUAGES=es ca@valencia pt_BR fr all: gmo include ../common.mk clean: $(QUIET_CL)rm -f *~ *glade.* *gladep* @for lang in $(LANGUAGES); do \ echo " **CLEANDIR** po/$$lang"; \ rm -rf po/$$lang;\ done install: install -d $(DESTDIR)/$(PREFIX)/sbin install -m 755 tcos-standalone.py $(DESTDIR)/$(PREFIX)/sbin/tcos-standalone install -d $(DESTDIR)/$(PREFIX)/share/tcos-standalone install -d $(DESTDIR)/$(PREFIX)/share/tcos-standalone/images install -m 644 tcos-standalone.glade $(DESTDIR)/$(PREFIX)/share/tcos-standalone install -m 644 images/tcos-icon-32x32.png $(DESTDIR)/$(PREFIX)/share/tcos-standalone/images install -d $(DESTDIR)/$(PREFIX)/share/applications install -m 644 tcos-standalone.desktop $(DESTDIR)/$(PREFIX)/share/applications/ install -d $(DESTDIR)/etc/avahi/services install -m 644 tcos-standalone.service $(DESTDIR)/etc/avahi/services/ # locales @for lang in $(LANGUAGES); do \ install -d $(DESTDIR)/$(PREFIX)/share/locale/$$lang/LC_MESSAGES/; \ install -m 644 po/$$lang/LC_MESSAGES/tcos-standalone.mo $(DESTDIR)/$(PREFIX)/share/locale/$$lang/LC_MESSAGES/tcos-standalone.mo; \ done pot: xgettext -o po/tcos-standalone.pot --files-from=po/FILES po: @for lang in $(LANGUAGES); do \ echo " **PO** po/$$lang"; \ if [ ! -f po/$$lang.po ]; then \ msginit --input po/tcos-standalone.pot -o po/$$lang-old.po;\ else \ mv po/$$lang.po po/$$lang-old.po; \ fi ; \ msgmerge -o po/$$lang.po po/$$lang-old.po po/tcos-standalone.pot; \ rm -f po/$$lang-old.po; \ done gmo: @echo " **COMPILING** languages: $(LANGUAGES)" @for lang in $(LANGUAGES); do \ echo " **COMPILEMO** po/$$lang" ; \ mkdir -p po/$$lang/LC_MESSAGES/; \ msgfmt --verbose -o po/$$lang/LC_MESSAGES/tcos-standalone.mo po/$$lang.po; \ done tcos-0.89.93ubuntu2/tcos-standalone/images/0000775000000000000000000000000012260610427015434 5ustar tcos-0.89.93ubuntu2/tcos-standalone/images/tcos-icon-32x32.png0000664000000000000000000000320712260610261020615 0ustar PNG  IHDR szzbKGD pHYsg tIME bIDATX[lT}Ιm &&C87(8i8"Z!%jC/(}DJڦJ(!.RF !(m2F{f90 "Rڪ>{_Z{5pnPy)J pQX~zj༠o,s Tź[umZ 1Ta~oi@=) huǣ1!/_r7W?Un__־q6oѼ5/x`j~De> @&BLdLJ)CJ +I͍Tҵpʱczש;;t۟X܌`;00!+Fݧm;s L?c&ÛiڡwŅUTcT'#'$C U/PIҶ h*ڲoJe'Z/@ϪMKy6F, /r 8n 4ÕZ/ |~[ꅔ4u喆7|3c cYS m4N ܆d{+P>Olx3Zwot6 WIsז>Zg+ D0c'ԥG#/֥SktVg-ʑKK .M]ffxZP:VcA9Y8VR.V sE=K L 5,)Ej|Bѫ~Q[|!:::x< X,uxt!i:eYP(Dҁ@ JvmܹSkih:ZMIENDB`tcos-0.89.93ubuntu2/tcos-standalone/tcos-standalone.py0000664000000000000000000003040712260610261017637 0ustar #!/usr/bin/env python # -*- coding: UTF-8 -*- ########################################################################## # TcosStandalone writen by MarioDebian # # TcosStandalone version __VERSION__ # # Copyright (c) 2007 Mario Izquierdo # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # ########################################################################### import sys import os import pygtk pygtk.require('2.0') from gtk import * import gtk.glade from time import time, sleep import getopt from gettext import gettext as _ from gettext import bindtextdomain, textdomain from locale import setlocale, LC_ALL from subprocess import Popen, PIPE, STDOUT #import popen2 from threading import Thread #import threading gtk.gdk.threads_init() import gobject debug=False PACKAGE="tcos-standalone" tcos_standalone_file="/etc/default/tcos-standalone" tcos_standalone_pass="/etc/tcospasswd" daemon_cmd="/etc/init.d/tcos-standalone" # if exec from svn or sources dir if os.path.isdir('../debian'): LOCALE_DIR = "./po/" GLADE_DIR = "./" IMG_DIR = "./images/" print "exec in sources dir" else: GLADE_DIR = "/usr/share/tcos-standalone/" IMG_DIR = "/usr/share/tcos-standalone/images/" LOCALE_DIR = "/usr/share/locale" def print_debug(txt): if debug: print "%s::%s" %("tcos-standalone", txt) return def usage(): print "tcos-standalone help:" print "" print " tcos-standalone -d [--debug] (write debug data to stdout)" print " tcos-standalone -h [--help] (this help)" try: opts, args = getopt.getopt(sys.argv[1:], ":hd", ["help", "debug"]) except getopt.error, msg: print msg print "for command line options use tcosconfig --help" sys.exit(2) # process options for o, a in opts: if o in ("-d", "--debug"): print "DEBUG ACTIVE" debug = True if o in ("-h", "--help"): usage() sys.exit() class TcosStandalone: def __init__(self): print_debug("__init__()") # vars self.v={} self.v["daemon_enabled"]=None self.v["daemon_running"]={} self.v["username"]=None self.v["password"]=None self.v["newconfig"]=False self.v["newpass"]=False gtk.glade.bindtextdomain(PACKAGE, LOCALE_DIR) gtk.glade.textdomain(PACKAGE) # gettext support setlocale( LC_ALL ) bindtextdomain( PACKAGE, LOCALE_DIR ) textdomain( PACKAGE ) # Widgets self.ui = gtk.glade.XML(GLADE_DIR + 'tcos-standalone.glade') self.mainwindow = self.ui.get_widget('mainwindow') self.mainwindow.set_icon_from_file(IMG_DIR +'tcos-icon-32x32.png') # close windows signals self.mainwindow.connect('destroy', self.quitapp ) self.mainwindow.connect("delete_event", self.quitapp) # read vars self.v["daemon_enabled"]=self.read_conf(tcos_standalone_file, "TCOS_STANDALONE_START", 1, '=') self.v["ssl_enabled"]=self.read_conf(tcos_standalone_file, "TCOS_XMLRPC_SSL", 0, '=') self.v["username"]=self.read_conf(tcos_standalone_pass, "root", 0, ':') daemons=self.exe_cmd(daemon_cmd + " status") self.v['daemon_running'][daemons.split(' ')[0]]=daemons.split(' ')[1] #for daemon in daemons: # print_debug("daemon %s"%daemon) # #self.v["daemon_running"][daemon.split(' ')[0]]=daemon.split(' ')[1] # widgets self.w={} self.w["txt_username"] = self.ui.get_widget('txt_username') self.w["txt_password"] = self.ui.get_widget('txt_password') self.w["lb_status"] = self.ui.get_widget('lb_status') self.w["ck_standalone_start"] = self.ui.get_widget('ck_standalone_start') self.w["ck_enable_ssl"] = self.ui.get_widget('ck_enable_ssl') self.w["lb_tcosxmlrpc"] = self.ui.get_widget('lb_tcosxmlrpc') #self.w["lb_busybox"] = self.ui.get_widget('lb_busybox') self.w["img_tcosxmlrpc"] = self.ui.get_widget('img_tcosxmlrpc') #self.w["img_busybox"] = self.ui.get_widget('img_busybox') self.w["bt_apply"] = self.ui.get_widget('bt_apply') self.w["bt_stop"] = self.ui.get_widget('bt_stop') self.w["bt_start"] = self.ui.get_widget('bt_start') self.w["ck_standalone_start"].connect('toggled', self.ck_change ) self.w["ck_enable_ssl"].connect('toggled', self.ck_change ) if self.v["daemon_enabled"] == '1': self.w["ck_standalone_start"].set_active(True) else: self.w["ck_standalone_start"].set_active(False) if self.v["ssl_enabled"] == '1': self.w["ck_enable_ssl"].set_active(True) else: self.w["ck_enable_ssl"].set_active(False) self.w["txt_username"].connect('changed', self.pass_change ) self.w["txt_password"].connect('changed', self.pass_change ) if not self.v["username"]: self.w["lb_status"].set_text( _("Not user and password configured.\nUsing root system user.") ) else: self.w["txt_username"].set_text(self.v["username"]) self.w["bt_apply"].connect('clicked', self.apply_changes) self.w["bt_stop"].connect('clicked', self.stop_daemon) self.w["bt_start"].connect('clicked', self.start_daemon) print_debug ( self.v ) self.v["newconfig"]=False self.v["newpass"]=False self.update_images() self.refresh_buttons() def ck_change(self, *args): self.v["newconfig"]=True self.refresh_buttons() def pass_change(self, *args): self.v["newpass"]=True self.refresh_buttons() def refresh_buttons(self): print_debug("refresh_buttons() newconfig=%s newpass=%s" %(self.v["newconfig"], self.v["newpass"])) if self.v["newconfig"] or self.v["newpass"]: # configure buttons self.w["bt_apply"].set_sensitive(True) else: # configure buttons self.w["bt_apply"].set_sensitive(False) def apply_changes(self, *args): if self.v["newconfig"]: print_debug("apply_changes() newconfig") # daemon enabled when open app if self.w["ck_enable_ssl"].get_active() != 1: self.save_conf(tcos_standalone_file, "TCOS_XMLRPC_SSL", 0, '=') if self.v["daemon_enabled"] != '0': self.exe_cmd(daemon_cmd + " stop") self.exe_cmd(daemon_cmd + " start") print_debug("apply_changes() disabling SSL") else: self.save_conf(tcos_standalone_file, "TCOS_XMLRPC_SSL", 1, '=') if self.v["daemon_enabled"] != '0': self.exe_cmd(daemon_cmd + " stop") self.exe_cmd(daemon_cmd + " start") print_debug("apply_changes() enabling SSL") if self.v["daemon_enabled"] != '0': if self.w["ck_standalone_start"].get_active() != 1: # disable daemon self.exe_cmd(daemon_cmd + " stop") self.save_conf(tcos_standalone_file, "TCOS_STANDALONE_START", 0, '=') self.v["daemon_enabled"]='0' # daemon disabled when open app else: if self.w["ck_standalone_start"].get_active() == 1: # enable daemon self.save_conf(tcos_standalone_file, "TCOS_STANDALONE_START", 1, '=') self.exe_cmd(daemon_cmd + " stop") self.exe_cmd(daemon_cmd + " start") self.v["daemon_enabled"]='1' self.v["newconfig"]=False if self.v["newpass"]: tmp=self.exe_cmd("/usr/sbin/tcospasswd %s" %(self.w["txt_password"].get_text() ) ) fw=file(tcos_standalone_pass, 'w') fw.write("%s:%s\n" %(self.w["txt_username"].get_text(), tmp) ) fw.close() self.w["lb_status"].set_text( _("New username and password used.\n") ) self.v["newpass"]=False self.refresh_buttons() self.update_images() def stop_daemon(self, *args): self.exe_cmd(daemon_cmd + " stop") self.update_images() def start_daemon(self, *args): self.exe_cmd(daemon_cmd + " start") self.update_images() def update_images(self): daemons=self.exe_cmd(daemon_cmd + " status") self.v['daemon_running'][daemons.split(' ')[0]]=daemons.split(' ')[1] #for daemon in daemons: # self.v["daemon_running"][daemon.split(' ')[0]]=daemon.split(' ')[1] if self.v["daemon_running"]["tcosxmlrpc"] == "running": self.w["img_tcosxmlrpc"].set_from_stock(gtk.STOCK_YES, 4) self.w["lb_tcosxmlrpc"].set_text( _("tcosxmlrpc running") ) self.w["bt_stop"].set_sensitive(True) self.w["bt_start"].set_sensitive(False) else: self.w["img_tcosxmlrpc"].set_from_stock(gtk.STOCK_NO, 4) self.w["lb_tcosxmlrpc"].set_text( _("tcosxmlrpc stopped") ) self.w["bt_stop"].set_sensitive(False) self.w["bt_start"].set_sensitive(True) #if self.v["daemon_running"]["busybox"] == "running": # self.w["img_busybox"].set_from_stock(gtk.STOCK_YES, 4) # self.w["lb_busybox"].set_text( _("busybox running") ) #else: # self.w["img_busybox"].set_from_stock(gtk.STOCK_NO, 4) # self.w["lb_busybox"].set_text( _("busybox stopped") ) def read_conf(self, fname, fvar, item=0, sep='='): if not os.path.isfile(fname): return None f=open(fname, 'r') data=f.readlines() f.close() for line in data: if line.startswith(fvar): return line.replace('\n','').split(sep)[item] def save_conf(self, fname, fvar, value, sep='='): if not os.path.isfile(fname): return None f=open(fname, 'r') data=f.readlines() f.close() print_debug("save_conf() fname=%s fvar=%s value=%s" %(fname, fvar, value)) fw=file(fname, 'w') for i in range(len(data)): if data[i].startswith(fvar): print_debug("save_conf() line=%s%s%s" %(fvar, sep, value) ) fw.write( "%s%s%s\n" %(fvar, sep, value) ) else: fw.write(data[i]) print_debug("save_conf() line=%s" %(data[i].replace('\n','')) ) fw.close() def exe_cmd(self, cmd, verbose=1): print_debug("exe_cmd() cmd=%s" %cmd) output=[] p=Popen(cmd, shell=True, bufsize=0, stdout=PIPE, stderr=STDOUT, close_fds=True) stdout = p.stdout #(stdout, stdin) = popen2.popen2(cmd) #stdin.close() for line in stdout: if line != '\n': line=line.replace('\n', '') output.append(line) if len(output) == 1: return output[0] elif len(output) > 1: if verbose==1: print_debug ( "exe_cmd(%s) %s" %(cmd, output) ) return output else: if verbose == 1: print_debug ( "exe_cmd(%s)=None" %(cmd) ) return [] def quitapp(self,*args): print_debug ( "Exiting" ) self.mainloop.quit() def run (self): self.mainloop = gobject.MainLoop() try: self.mainloop.run() except KeyboardInterrupt: # Press Ctrl+C self.quitapp() if __name__ == '__main__': app = TcosStandalone () # Run app app.run () tcos-0.89.93ubuntu2/tcos-standalone/tcos-standalone.10000664000000000000000000000125312260610261017344 0ustar .TH tcos-standalone 1 "Nov 29, 2007" "tcos-standalone man page" .SH NAME tcos-standalone \- Python GTK2 gui that allow to enable or disable tcos-standalone mode. .SH DESCRIPTION .PP \fBtcos-standalone\fP is a small python GUI to enable or disable tcos-standalone mode tcos-standalone edit /etc/default/tcos-standalone and creates /etc/tcospasswd .SH OPTIONS .B [no options] With no options will run in normal mode. .B --help Some usage help about tcos-standalone .B --debug Show verbose output when running .SH BUGS Contact Mario Izquierdo Homepage: http://www.tcosproject.org .SH AUTHOR Mario Izquierdo (mariodebian) tcos-0.89.93ubuntu2/tcos-standalone/tcos-standalone.desktop0000664000000000000000000000072412260610261020657 0ustar [Desktop Entry] Version=1.0 Name=TCOS Standalone Name[en_GB]=TCOS Standalone Name[es]=TCOS Autónomo GenericName[es_ES]=TCOS Autónomo Comment=Configure standalone mode of TCOS Comment[en_GB]=Configure standalone mode of TCOS Comment[es]=Configurar modo autónomo de TCOS Exec=su-to-root -X -c /usr/sbin/tcos-standalone Terminal=false Type=Application Icon=/usr/share/tcos-standalone/images/tcos-icon-32x32.png Categories=GNOME;Settings;System;DesktopSettings;Monitor tcos-0.89.93ubuntu2/README.freenx0000664000000000000000000000230312260610261013231 0ustar ========================================= FREENX support in TCOS ========================================= If you want to exec FREENX client in TCOS you must do next jobs: 1.- Download FREENX from www.nomachine.com, need 3 files: For server: nxnode_2.1.0-15_i386.deb nxserver_2.1.0-18_i386.deb (free version) For clients: nxclient_2.1.0-17_i386.deb nxclient-2.1.0-17.i386.tar.gz (version number can change in future) 2.- Install FREENX server packages. 3.- Prepare squashfs image for TCOS: # mkdir /tmp/freenx # tar -zxf nxclient-2.1.0-17.i386.tar.gz -C /tmp/freenx # ( cd /tmp/freenx/NX && mksquashfs . ../nxclient.squashfs ) Move nxclient.squashfs to /var/lib/tcos/tftp/ # mv /tmp/freenx/nxclient.squashfs /var/lib/tcos/tftp/ IMPORTANT: ( make sure that file rights are 644 ) 4.- Rebuild TCOS images with TCOS_FREENX_SQUASHFS=1 5.- Append this to thin client cmdline: freenx=nxclient.squashfs 6.- Optionally you can create this files: nxclient.cfg server.nxs And put into /var/lib/tcos/tftp/ (this files are the nxclient config and one server config) tcos-0.89.93ubuntu2/openvpn/0000775000000000000000000000000012260610427012556 5ustar tcos-0.89.93ubuntu2/openvpn/openssl.conf0000664000000000000000000002005512260610261015106 0ustar # For use with easy-rsa version 2.0 # # OpenSSL example configuration file. # This is mostly being used for generation of certificate requests. # # This definition stops the following lines choking if HOME isn't # defined. HOME = . RANDFILE = $ENV::HOME/.rnd openssl_conf = openssl_init [ openssl_init ] # Extra OBJECT IDENTIFIER info: #oid_file = $ENV::HOME/.oid oid_section = new_oids engines = engine_section # To use this configuration file with the "-extfile" option of the # "openssl x509" utility, name here the section containing the # X.509v3 extensions to use: # extensions = # (Alternatively, use a configuration file that has only # X.509v3 extensions in its main [= default] section.) [ new_oids ] # We can add new OIDs in here for use by 'ca' and 'req'. # Add a simple OID like this: # testoid1=1.2.3.4 # Or use config file substitution like this: # testoid2=${testoid1}.5.6 #################################################################### [ ca ] default_ca = CA_default # The default ca section #################################################################### [ CA_default ] dir = $ENV::KEY_DIR # Where everything is kept certs = $dir # Where the issued certs are kept crl_dir = $dir # Where the issued crl are kept database = $dir/index.txt # database index file. new_certs_dir = $dir # default place for new certs. certificate = $dir/ca.crt # The CA certificate serial = $dir/serial # The current serial number crl = $dir/crl.pem # The current CRL private_key = $dir/ca.key # The private key RANDFILE = $dir/.rand # private random number file x509_extensions = usr_cert # The extentions to add to the cert # Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs # so this is commented out by default to leave a V1 CRL. # crl_extensions = crl_ext default_days = 3650 # how long to certify for default_crl_days= 30 # how long before next CRL default_md = md5 # which md to use. preserve = no # keep passed DN ordering # A few difference way of specifying how similar the request should look # For type CA, the listed attributes must be the same, and the optional # and supplied fields are just that :-) policy = policy_anything # For the CA policy [ policy_match ] countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional # For the 'anything' policy # At this point in time, you must list all acceptable 'object' # types. [ policy_anything ] countryName = optional stateOrProvinceName = optional localityName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional #################################################################### [ req ] default_bits = $ENV::KEY_SIZE default_keyfile = privkey.pem distinguished_name = req_distinguished_name attributes = req_attributes x509_extensions = v3_ca # The extentions to add to the self signed cert # Passwords for private keys if not present they will be prompted for # input_password = secret # output_password = secret # This sets a mask for permitted string types. There are several options. # default: PrintableString, T61String, BMPString. # pkix : PrintableString, BMPString. # utf8only: only UTF8Strings. # nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). # MASK:XXXX a literal mask value. # WARNING: current versions of Netscape crash on BMPStrings or UTF8Strings # so use this option with caution! string_mask = nombstr # req_extensions = v3_req # The extensions to add to a certificate request [ req_distinguished_name ] countryName = Country Name (2 letter code) countryName_default = $ENV::KEY_COUNTRY countryName_min = 2 countryName_max = 2 stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = $ENV::KEY_PROVINCE localityName = Locality Name (eg, city) localityName_default = $ENV::KEY_CITY 0.organizationName = Organization Name (eg, company) 0.organizationName_default = $ENV::KEY_ORG # we can do this but it is not needed normally :-) #1.organizationName = Second Organization Name (eg, company) #1.organizationName_default = World Wide Web Pty Ltd organizationalUnitName = Organizational Unit Name (eg, section) #organizationalUnitName_default = commonName = Common Name (eg, your name or your server\'s hostname) commonName_max = 64 emailAddress = Email Address emailAddress_default = $ENV::KEY_EMAIL emailAddress_max = 40 # JY -- added for batch mode organizationalUnitName_default = $ENV::KEY_OU commonName_default = $ENV::KEY_CN # SET-ex3 = SET extension number 3 [ req_attributes ] challengePassword = A challenge password challengePassword_min = 4 challengePassword_max = 20 unstructuredName = An optional company name [ usr_cert ] # These extensions are added when 'ca' signs a request. # This goes against PKIX guidelines but some CAs do it and some software # requires this to avoid interpreting an end user certificate as a CA. basicConstraints=CA:FALSE # Here are some examples of the usage of nsCertType. If it is omitted # the certificate can be used for anything *except* object signing. # This is OK for an SSL server. # nsCertType = server # For an object signing certificate this would be used. # nsCertType = objsign # For normal client use this is typical # nsCertType = client, email # and for everything including object signing: # nsCertType = client, email, objsign # This is typical in keyUsage for a client certificate. # keyUsage = nonRepudiation, digitalSignature, keyEncipherment # This will be displayed in Netscape's comment listbox. nsComment = "Easy-RSA Generated Certificate" # PKIX recommendations harmless if included in all certificates. subjectKeyIdentifier=hash authorityKeyIdentifier=keyid,issuer:always extendedKeyUsage=clientAuth keyUsage = digitalSignature # This stuff is for subjectAltName and issuerAltname. # Import the email address. # subjectAltName=email:copy # Copy subject details # issuerAltName=issuer:copy #nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem #nsBaseUrl #nsRevocationUrl #nsRenewalUrl #nsCaPolicyUrl #nsSslServerName [ server ] # JY ADDED -- Make a cert with nsCertType set to "server" basicConstraints=CA:FALSE nsCertType = server nsComment = "Easy-RSA Generated Server Certificate" subjectKeyIdentifier=hash authorityKeyIdentifier=keyid,issuer:always extendedKeyUsage=serverAuth keyUsage = digitalSignature, keyEncipherment [ v3_req ] # Extensions to add to a certificate request basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment [ v3_ca ] # Extensions for a typical CA # PKIX recommendation. subjectKeyIdentifier=hash authorityKeyIdentifier=keyid:always,issuer:always # This is what PKIX recommends but some broken software chokes on critical # extensions. #basicConstraints = critical,CA:true # So we do this instead. basicConstraints = CA:true # Key usage: this is typical for a CA certificate. However since it will # prevent it being used as an test self-signed certificate it is best # left out by default. # keyUsage = cRLSign, keyCertSign # Some might want this also # nsCertType = sslCA, emailCA # Include email address in subject alt name: another PKIX recommendation # subjectAltName=email:copy # Copy issuer details # issuerAltName=issuer:copy # DER hex encoding of an extension: beware experts only! # obj=DER:02:03 # Where 'obj' is a standard or added object # You can even override a supported extension: # basicConstraints= critical, DER:30:03:01:01:FF [ crl_ext ] # CRL extensions. # Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. # issuerAltName=issuer:copy authorityKeyIdentifier=keyid:always,issuer:always [ engine_section ] # # If you are using PKCS#11 # Install engine_pkcs11 of opensc (www.opensc.org) # And uncomment the following # verify that dynamic_path points to the correct location # #pkcs11 = pkcs11_section #[ pkcs11_section ] #engine_id = pkcs11 #dynamic_path = /usr/lib/engines/engine_pkcs11.so #MODULE_PATH = $ENV::PKCS11_MODULE_PATH #PIN = $ENV::PKCS11_PIN #init = 0 tcos-0.89.93ubuntu2/openvpn/Makefile0000664000000000000000000000040712260610261014213 0ustar all: include ../common.mk install: install -d $(DESTDIR)$(OPENVPN_CONF) install -m 644 openssl.conf $(DESTDIR)$(OPENVPN_CONF)/ install -m 644 tcosserver.conf $(DESTDIR)$(OPENVPN_CONF)/ install -m 755 tcos-init-openvpn $(DESTDIR)/usr/sbin/ tcos-0.89.93ubuntu2/openvpn/tcosserver.conf0000664000000000000000000000072712260610261015626 0ustar #Tcos Server VPN port 2194 proto udp dev tap ca /var/lib/tcos/openvpn/keys/ca.crt cert /var/lib/tcos/openvpn/keys/tcosserver.crt key /var/lib/tcos/openvpn/keys/tcosserver.key dh /var/lib/tcos/openvpn/keys/dh1024.pem server 10.1.1.0 255.255.255.0 duplicate-cn keepalive 10 120 comp-lzo ;max-clients 100 #user nobody #group nogroup persist-key #persist-tun ;ifconfig-pool-persist ./ipp.txt ;status ./openvpn-status.log ;log-append ./openvpn.log ;verb 3 ;mute 20 tcos-0.89.93ubuntu2/openvpn/tcos-init-openvpn0000775000000000000000000000454412260610261016103 0ustar #!/bin/sh set -e BASEDIR=/var/lib/tcos/openvpn if [ -d /var/lib/tcos/chroot/var/lib/tcos/ ]; then # tcos chroot gen keys in chroot and link in / BASEDIR=/var/lib/tcos/chroot/var/lib/tcos/openvpn echo " * Deleting keys in chroot..." rm -rf /var/lib/tcos/openvpn/keys rm -rf $BASEDIR/keys mkdir -p $BASEDIR/keys /var/lib/tcos/openvpn ln -s $BASEDIR/keys /var/lib/tcos/openvpn/keys else echo " * Deleting keys..." rm -rf $BASEDIR/keys mkdir -p $BASEDIR/keys fi export KEY_DIR="$BASEDIR/keys" export KEY_SIZE="1024" export CA_EXPIRE="3650" export KEY_EXPIRE="3650" export KEY_COUNTRY="" export KEY_PROVINCE="" export KEY_CITY="" export KEY_ORG="TcosProject" export KEY_EMAIL="admin@tcosserver" export KEY_OU="TcosProject" export KEY_CN="TcosServer" export CONFIG="$BASEDIR/openssl.conf" touch $KEY_DIR/index.txt echo "01" > $KEY_DIR/serial # gen dh echo " * Generating dh1024.pem..." openssl dhparam -out $KEY_DIR/dh1024.pem 1024 # build CA echo " * Generating ca..." openssl req -batch -days 3650 -nodes -new -newkey rsa:1024 -sha1 -x509 \ -keyout $KEY_DIR/ca.key -out $KEY_DIR/ca.crt -config $CONFIG # server key echo " * Generating server keys..." openssl req -batch -days 3650 -nodes -new -newkey rsa:1024 \ -keyout $KEY_DIR/tcosserver.key -out $KEY_DIR/tcosserver.csr \ -extensions server -config $CONFIG openssl ca -batch -days 3650 -out $KEY_DIR/tcosserver.crt \ -in $KEY_DIR/tcosserver.csr \ -extensions server -md sha1 -config $CONFIG export KEY_CN="TcosClient" # clients without passwd echo " * Generating clients keys..." openssl req -batch -days 3650 -nodes -new -newkey rsa:1024 \ -keyout $KEY_DIR/client.key -out $KEY_DIR/client.csr \ -config $CONFIG openssl ca -batch -days 3650 -out $KEY_DIR/client.crt \ -in $KEY_DIR/client.csr -md sha1 -config $CONFIG chmod 600 $KEY_DIR/*.key rm -f /etc/openvpn/tcosserver.conf ln -s /var/lib/tcos/openvpn/tcosserver.conf /etc/openvpn/tcosserver.conf if ! grep -q ^AUTOSTART /etc/default/openvpn; then echo '# added by tcos-init-openvpn' >> /etc/default/openvpn echo 'AUTOSTART="tcosserver"' >> /etc/default/openvpn fi echo " * Restaring openvpn..." /etc/init.d/openvpn restart #invoke-rc.d openvpn cond-restart || invoke-rc.d openvpn restart echo "" echo " * REMEMBER to rebuild TCOS images !!!" echo "" tcos-0.89.93ubuntu2/hooks/0000775000000000000000000000000012260610427012214 5ustar tcos-0.89.93ubuntu2/hooks/tcosmain0000775000000000000000000000157012260610261013756 0ustar #!/bin/bash # new header not using prereqs if [ "$1" = "prereqs" ]; then echo "" exit 0 fi . /usr/share/initramfs-tools/hook-functions . /usr/share/initramfs-tools/scripts/functions . $CONFDIR/initramfs.conf # read from env vars TCOS_BOOT TCOS_BOOT=$(env| awk -F "=" '/^TCOS_BOOT=/ {print $2}') if [ "${TCOS_BOOT}" != "" ]; then BOOT=$TCOS_BOOT fi if [ "${BOOT}" = "tcos" -o "${BOOT}" = "tcos-nfs" ]; then . $CONFDIR/tcos.conf . $TCOS_DIR/tcos-generation-functions.sh #for tpl in $(tcos_get_templates); do # _verbose "(tcosmain) loading template $(basename $tpl)" # . $tpl #done # load forced settings for derivatives if [ -d $CONFDIR/conf.d/ ]; then for file in $CONFDIR/conf.d/tcos*conf; do [ -e $file ] && . $file done fi # copy scripts into image cp -ra ${TCOS_DIR}/scripts/* ${DESTDIR}/scripts/ run_scripts ${TCOS_DIR}/hooks fi tcos-0.89.93ubuntu2/hooks/tcosnfs0000775000000000000000000000254312260610261013621 0ustar #!/bin/bash # new header not using prereqs if [ "$1" = "prereqs" ]; then echo "" exit 0 fi # Hooks for install binaries for tcos boot # . /usr/share/initramfs-tools/hook-functions # read conf file => /etc/tcos/initramfs.conf . $CONFDIR/initramfs.conf # read from env vars TCOS_BOOT TCOS_BOOT=$(env| awk -F "=" '/^TCOS_BOOT=/ {print $2}') if [ "${TCOS_BOOT}" != "" ]; then BOOT=$TCOS_BOOT fi if [ "${BOOT}" = "tcos-nfs" ]; then . $CONFDIR/tcos.conf . $TCOS_DIR/tcos-generation-functions.sh for tpl in $(tcos_get_templates); do _verbose "(tcosnfs) loading template $(basename $tpl)" . $tpl done # load forced settings for derivatives if [ -d $CONFDIR/conf.d/ ]; then for file in $CONFDIR/conf.d/tcos*conf; do [ -e $file ] && . $file done fi # load some hook-addons (not all needed here, we need a minimal image) TCOS_INCLUDE_INIT=1 . ${TCOS_DIR}/hooks-addons/00init . ${TCOS_DIR}/hooks-addons/00main . ${TCOS_DIR}/hooks-addons/00users . ${TCOS_DIR}/hooks-addons/01dhclient . ${TCOS_DIR}/hooks-addons/01busybox . ${TCOS_DIR}/hooks-addons/02hex2ascii . ${TCOS_DIR}/hooks-addons/03udev2 . ${TCOS_DIR}/hooks-addons/03wireless . ${TCOS_DIR}/hooks-addons/05compcache . ${TCOS_DIR}/hooks-addons/23bootchart . ${TCOS_DIR}/hooks-addons/99clean_nfs_image unset TCOS_INCLUDE_INIT manual_add_modules unionfs manual_add_modules aufs manual_add_modules loop fi tcos-0.89.93ubuntu2/hooks/tcosbin0000775000000000000000000002006012260610261013575 0ustar #!/bin/bash # new header not using prereqs if [ "$1" = "prereqs" ]; then echo "" exit 0 fi # Hooks for install binaries for tcos boot # . /usr/share/initramfs-tools/hook-functions # read conf file => /etc/tcos/initramfs.conf . $CONFDIR/initramfs.conf # read from env vars TCOS_BOOT TCOS_BOOT=$(env| awk -F "=" '/^TCOS_BOOT=/ {print $2}') if [ "${TCOS_BOOT}" != "" ]; then BOOT=$TCOS_BOOT fi if [ "${BOOT}" = "tcos" ]; then . $CONFDIR/tcos.conf [ -f /var/lib/tcos/version.conf ] && . /var/lib/tcos/version.conf . $TCOS_DIR/tcos-generation-functions.sh for tpl in $(tcos_get_templates); do _verbose "(tcosbin) loading template $(basename $tpl)" . $tpl done # load forced settings for derivatives if [ -d $CONFDIR/conf.d/ ]; then for file in $CONFDIR/conf.d/tcos*conf; do [ -e $file ] && . $file done fi # load hooks-addons (small files with group of packages inside) _files=$(ls -1 ${TCOS_DIR}/hooks-addons/ | grep -v -e .dpkg -e .svn) for addon in $_files ; do _verbose "(tcosbin) LOADING: system addon: ${addon}" . ${TCOS_DIR}/hooks-addons/${addon} done # load hooks-addons in /etc/tcos (small files with group of packages inside) _files=$(ls -1 ${TCOS_CONF}/hooks-addons/ | grep -v -e dpkg -e .svn) for addon in $_files ; do _echo " LOADING: personal addon: ${TCOS_CONF}/hooks-addons/${addon}" . ${TCOS_CONF}/hooks-addons/${addon} done # read all files in ${TCOS_CONF}/hacking/ and load it ( personal files ) _files=$(ls -1 ${TCOS_CONF}/hacking/ | grep -v -e dpkg -e .svn) for hack in $_files ; do if [ "${hack}" != "template" ]; then _echo " LOADING: hack: ${TCOS_CONF}/hacking/${hack}" fi . ${TCOS_CONF}/hacking/${hack} done # to be sure that /usr have files and not links # we search links delete them and put file instead convert_links2files # multiarch clean #tree "${DESTDIR}/usr/lib/" # if [ -d "${DESTDIR}/usr/lib/$TCOS_MULTIARCH" ]; then # _verbose "(tcosbin) Moving all multiarch ($TCOS_MULTIARCH) to /usr/lib/" # mv "${DESTDIR}/usr/lib/$TCOS_MULTIARCH/"* "${DESTDIR}/usr/lib/" # rmdir "${DESTDIR}/usr/lib/$TCOS_MULTIARCH/" # #tree "${DESTDIR}/usr/lib/" # fi # read from env vars TCOS_BOOT TCOS_ENV_DISABLE_SQUASHFS=$(env| awk -F "=" '/^TCOS_ENV_DISABLE_SQUASHFS=/ {print $2}') if [ "${TCOS_ENV_DISABLE_SQUASHFS}" != "" ]; then TCOS_DISABLE_SQUASHFS=$TCOS_ENV_DISABLE_SQUASHFS fi MKSQUASHFS=mksquashfs [ -x /usr/bin/mksquashfs ] && MKSQUASHFS=/usr/bin/mksquashfs [ -x /usr/sbin/mksquashfs ] && MKSQUASHFS=/usr/sbin/mksquashfs if [ -z $TCOS_DISABLE_SQUASHFS ]; then # create usr.squashfs if env | grep -q ^TCOS_SUFFIX ; then TCOS_SUFFIX=$(env | grep ^TCOS_SUFFIX | awk -F "=" '{print $2}') echo "SQUASHFS_FILE=\"usr${TCOS_SUFFIX}-${version}.squashfs\"" >> $DESTDIR/conf/tcos.conf fi SQUASHFS_FILE="usr${TCOS_SUFFIX}-${version}.squashfs" _echo " Creating ${SQUASHFS_FILE} of /usr" mksquashfs_log="$(mktemp -t gentcos-mksquashfs_XXXXXX)" mkdir -p $DESTDIR/mnt/tmp $MKSQUASHFS $DESTDIR/usr/ $DESTDIR/mnt/tmp/${SQUASHFS_FILE} > $mksquashfs_log 2>&1 # check for mksquashfs errors if [ $? != 0 ]; then _echo " ERROR:" _echo " mksquashfs error" _echo "#############################################" cat $mksquashfs_log _echo "#############################################" fi rm -f $mksquashfs_log # mksquashfs create files with 700 rights, change to 644 chmod 644 $DESTDIR/mnt/tmp/${SQUASHFS_FILE} rm -rf $DESTDIR/usr/ && mkdir $DESTDIR/usr # overwrite TCOS_SQUASHFS from shell env var # this allow to create cdrom with usr.squashfs embedded if env | grep -q ^TCOS_SQUASHFS ; then TCOS_SQUASHFS=$(env | grep ^TCOS_SQUASHFS | awk -F "=" '{print $2}') _echo "DEBUG: overwrite TCOS_SQUASHFS=$TCOS_SQUASHFS" else if [ "${TCOS_SQUASHFS}" = "1" ] ; then _echo " Moving ${SQUASHFS_FILE} to ${TFTP_DIR}" mv $DESTDIR/mnt/tmp/${SQUASHFS_FILE} ${TFTP_DIR} fi fi # end of TCOS_SQUASHFS fi # end of TCOS_DISABLE_SQUASHFS TCOS_INCLUDE_INIT=1 . ${TCOS_DIR}/hooks-addons/00init unset TCOS_INCLUDE_INIT # clean /lib/tls if needed if [ -d $DESTDIR/lib/tls ]; then _echo " * WARNING: /lib/tls exists in image" for lib in ${DESTDIR}/lib/tls/*; do tlslib=$lib notlslib=$(echo $lib | sed 's/tls\///g') notlslib1=$(basename $lib) notlslib2=$(basename $lib | awk -F "." '{print $1}') if [ -f $notlslib ]; then _echo "WARNING rm -f $lib" elif [ -f /lib/${notlslib1} ]; then _echo "WARNING cp -a /lib/${notlslib} $DESTDIR/lib" else _echo "$tlslib not found" fi done fi # end of /lib/tls dir exists # clean /lib/i686 if needed if [ -d $DESTDIR/lib/i686 ]; then # convert symlinks to files into lib/i686 dir convert_links2files "lib/i686" for lib in $(find ${DESTDIR}/lib/i686 -type f); do i686lib=$lib noi686lib=$(echo $lib | sed 's/i686\/cmov\///g') noi686lib1=$(basename $lib) if [ -f $noi686lib ]; then rm -f $lib elif [ -f /lib/${noi686lib1} ]; then cp -f /lib/${noi686lib1} $DESTDIR/lib/ rm -f $lib else _echo "WARNING equivalent to $i686lib not found" fi done (rmdir ${DESTDIR}/lib/i686/cmov && rmdir ${DESTDIR}/lib/i686) || _echo " * WARNING can't delete /lib/i686 from image (not empty)" fi # end of /lib/i686 dir exists # clean /usr/lib/i686 if needed if [ -d $DESTDIR/usr/lib/i686 ]; then # convert symlinks to files into usr/lib/i686 dir convert_links2files "usr/lib/i686" for lib in $(find ${DESTDIR}/usr/lib/i686 -type f); do i686lib=$lib noi686lib=$(echo $lib | sed 's/i686\/cmov\///g') noi686lib1=$(basename $lib) if [ -f $noi686lib ]; then rm -f $lib elif [ -f /usr/lib/${noi686lib1} ]; then cp -f /usr/lib/${noi686lib1} $DESTDIR/usr/lib/ rm -f $lib else _echo "WARNING equivalent to $i686lib not found" fi done (rmdir ${DESTDIR}/usr/lib/i686/cmov && rmdir ${DESTDIR}/usr/lib/i686) || _echo " * WARNING can't delete /usr/lib/i686 from image (not empty)" fi # end of /usr/lib/i686 dir exists # multiarch clean #tree "${DESTDIR}/lib/" # if [ -d "${DESTDIR}/lib/$TCOS_MULTIARCH" ]; then # _verbose "(tcosbin) Moving all multiarch ($TCOS_MULTIARCH) to /lib/" # mv "${DESTDIR}/lib/$TCOS_MULTIARCH/"* "${DESTDIR}/lib/" # rmdir "${DESTDIR}/lib/$TCOS_MULTIARCH/" # #tree "${DESTDIR}/lib/" # fi if [ $TCOS_DISABLE_ACPI ]; then stat_before rm -rf $DESTDIR/lib/modules/*/drivers/md/ rm -rf $DESTDIR/lib/modules/*/drivers/acpi/ rm -rf $DESTDIR/scripts/usb* rm -rf $DESTDIR/scripts/live* rm -rf $DESTDIR/scripts/local* rm -rf $DESTDIR/scripts/casper* rm -rf $DESTDIR/scripts/init-premount/thermal rm -rf $DESTDIR/sbin/mdadm rm -rf $DESTDIR/scripts/init-premount/mdadm rm -rf $DESTDIR/sbin/mdrun rm -rf $DESTDIR/sbin/vgchange rm -rf $DESTDIR/sbin/cryptsetup rm -rf $DESTDIR/sbin/dmsetup rm -rf $DESTDIR/lib/lvm* rm -rf ${DESTDIR}/lib/modules/${version}/kernel/drivers/md/ rm -rf ${DESTDIR}/lib/modules/${version}/kernel/drivers/scsi manual_add_modules scsi_mod manual_add_modules sd_mod manual_add_modules sr_mod stat_after "Disable ACPI and RAID support" else _verbose "(tcosbin)TCOS_DISABLE_ACPI not set" fi # read shell env variables to search TCOS_ALL_MODULES if env | grep -q ^TCOS_ALL_MODULES ; then TCOS_ALL_MODULES=$(env | grep ^TCOS_ALL_MODULES | awk -F "=" '{print $2}') fi # create allmodules.squashfs if [ $TCOS_ALL_MODULES ]; then _echo "Running depmod of kernel ${version}" DEPMOD_ARGS="-a -F /boot/System.map-${TCOS_KERNEL}" if depmod -h 2>&1|grep -q map; then DEPMOD_ARGS="-am -F /boot/System.map-${TCOS_KERNEL}" fi depmod $DEPMOD_ARGS ${version} _echo " Creating allmodules-${version}.squashfs file" mkdir -p $DESTDIR/mnt/tmp > /dev/null 2>&1 $MKSQUASHFS /lib/modules/${version}/ $DESTDIR/mnt/tmp/allmodules-${version}.squashfs -e volatile -noappend > /dev/null 2>&1 # mksquashfs create files with 700 rights, change to 644 chmod 644 ${DESTDIR}/mnt/tmp/allmodules-${version}.squashfs _echo " Moving allmodules-${version}.squashfs to ${TFTP_DIR}" mv ${DESTDIR}/mnt/tmp/allmodules-${version}.squashfs ${TFTP_DIR} fi fi tcos-0.89.93ubuntu2/hooks/tcosmods0000775000000000000000000001331312260610261013772 0ustar #!/bin/bash # new header not using prereqs if [ "$1" = "prereqs" ]; then echo "" exit 0 fi # Hooks for loading necesary modules for the tcos system into the initramfs # . /usr/share/initramfs-tools/hook-functions . $CONFDIR/initramfs.conf # read from env vars TCOS_BOOT TCOS_BOOT=$(env| awk -F "=" '/^TCOS_BOOT=/ {print $2}') if [ "${TCOS_BOOT}" != "" ]; then BOOT=$TCOS_BOOT fi if [ "${BOOT}" = "tcos" ]; then . $CONFDIR/tcos.conf . $TCOS_DIR/tcos-modules.conf . $TCOS_DIR/tcos-generation-functions.sh for tpl in $(tcos_get_templates); do _verbose "(tcosmods) loading template $(basename $tpl)" . $tpl done # load forced settings for derivatives if [ -d $CONFDIR/conf.d/ ]; then for file in $CONFDIR/conf.d/tcos*conf; do [ -e $file ] && . $file done fi TCOS_USB=$(read_env_var "TCOS_USB" "$TCOS_USB") TCOS_XORG=$(read_env_var "TCOS_XORG" "$TCOS_XORG") TCOS_SOUND=$(read_env_var "TCOS_SOUND" "$TCOS_SOUND") TCOS_DISABLE_USB=$(read_env_var "TCOS_DISABLE_USB" "$TCOS_DISABLE_USB") TCOS_DISABLE_IDE=$(read_env_var "TCOS_DISABLE_IDE" "$TCOS_DISABLE_IDE") if [ "$TCOS_USB" != "1" ] ;then _echo " * Not USB support" USB_MODULES="" TCOS_DISABLE_USB=1 fi if [ "$TCOS_XORG" != "1" ]; then _echo " * Not Xorg support" XORG_MODULES="" fi if [ "$TCOS_SOUND" != "1" ]; then _echo " * Not Sound support" SOUND_MODULES="" fi if [ "$TCOS_SOUND_ISA" != "1" ]; then _echo " * Not Sound ISA modules" SOUNDISA_MODULES="" else #ISADIR=$(find /lib/modules/${TCOS_KERNEL}/ -type d -name isa) #SOUNDISA_MODULES=$(find ${ISADIR} -type f -exec basename '{}' \; | sed s/".ko"//g) SOUNDISA_MODULES="snd-gusmax snd-gusclassic snd-gusextreme snd-gus-synth snd-gus-lib snd-interwave-stb snd-interwave snd-opl3sa2 snd-als100 snd-miro snd-opti93x snd-opti92x-ad1848 snd-opti92x-cs4231 snd-adlib snd-es18xx snd-dt019x snd-sb8 snd-sb16 snd-es968 snd-sb16-csp snd-sb8-dsp snd-sbawe snd-sb16-dsp snd-sb-common snd-emu8000-synth snd-sgalaxy snd-cs4236-lib snd-cs4231 snd-cs4231-lib snd-cs4236 snd-cs4232 snd-es1688 snd-es1688-lib snd-sscape snd-ad1848-lib snd-ad1848 snd-cmi8330 snd-azt2320 snd-ad1816a snd-wavefront" fi MODULES="${CORE_MODULES} ${USB_MODULES} ${LIVE_MODULES} ${NETWORK_MODULES}" MODULES="${MODULES} ${XORG_MODULES} ${SOUND_MODULES} ${SOUNDISA_MODULES} ${MYTCOS_MODULES} " for x in ${MODULES} ; do _verbose "(tcosmods) Adding module ${x}" #manual_add_modules ${x} tcos_manual_add_modules ${x} #force_add_module ${x} done BLACKLIST_MODULES="${BLACKLIST_MODULES}" for x in ${BLACKLIST_MODULES} ; do _verbose "(tcosmods) blacklist module ${x}" echo "blacklist ${x}" >> ${DESTDIR}/etc/modprobe.d/blacklist-tcos.conf done # put floppy outside /lib/modules mkdir -p $DESTDIR/lib/extramodules if tcos_find_module "floppy"; then FLOPPY_MOD=$(find /lib/modules/${TCOS_KERNEL} -name floppy.ko | tail -1) fi if tcos_find_module "ide-floppy"; then FLOPPY_IDE_MOD=$(find /lib/modules/${TCOS_KERNEL} -name ide-floppy.ko | tail -1) fi if [ "${FLOPPY_MOD}" != "" ]; then # don't use cpifexists cp -a "${FLOPPY_MOD}" $DESTDIR/lib/extramodules # delete floppy kernel rm -f ${DESTDIR}/${FLOPPY_MOD} fi if [ "${FLOPPY_IDE_MOD}" != "" ]; then # don't use cpifexists cp -a "${FLOPPY_IDE_MOD}" $DESTDIR/lib/extramodules # delete floppy kernel rm -f ${DESTDIR}/${FLOPPY_IDE_MOD} fi if [ "$TCOS_EXTRA_MODULES" != "" ]; then TCOS_EXTRA_MODULES=$(echo ${TCOS_EXTRA_MODULES} | sed s/","/" "/g) for module in ${TCOS_EXTRA_MODULES}; do _echo " TCOS extra module: adding ${module}" tcos_manual_add_modules ${module} done fi if [ "$TCOS_BLACKLIST_MODULES" != "" ]; then TCOS_BLACKLIST_MODULES=$(echo ${TCOS_BLACKLIST_MODULES} | sed s/","/" "/g) for module in ${TCOS_BLACKLIST_MODULES}; do _echo " TCOS blacklist module: adding ${module}" echo "blacklist ${module}" >> ${DESTDIR}/etc/modprobe.d/blacklist-tcos.conf done fi if [ "$TCOS_DISABLE_USB" = "1" ] ;then # delete some SCSI and USB stuff because we boot from network _echo " * DISABLE USB : deleting some SCSI and USB kernel modules..." rm -rf ${DESTDIR}/lib/modules/${version}/kernel/drivers/usb/ rm -rf ${DESTDIR}/lib/modules/${version}/kernel/drivers/scsi/ rm -rf ${DESTDIR}/lib/modules/${version}/kernel/drivers/ieee1394/ rm -rf ${DESTDIR}/lib/modules/${version}/kernel/drivers/md/ rm -rf ${DESTDIR}/lib/modules/${version}/kernel/drivers/cdrom/ rm -rf ${DESTDIR}/lib/modules/${version}/kernel/drivers/block/ # restore deleted loop module tcos_manual_add_modules loop fi if [ "$TCOS_DISABLE_IDE" = "1" ] ;then # delete some IDE and filesystem modules _echo " * DISABLE IDE : deleting some IDE and FS kernel modules..." rm -rf ${DESTDIR}/lib/modules/${version}/kernel/fs/reiserfs/ rm -rf ${DESTDIR}/lib/modules/${version}/kernel/fs/xfs/ rm -rf ${DESTDIR}/lib/modules/${version}/kernel/fs/ext3/ rm -rf ${DESTDIR}/lib/modules/${version}/kernel/fs/isofs/ rm -rf ${DESTDIR}/lib/modules/${version}/kernel/fs/isofs/ rm -rf ${DESTDIR}/lib/modules/${version}/kernel/drivers/ide/ rm -rf ${DESTDIR}/lib/modules/${version}/kernel/drivers/ata/ rm -f ${DESTDIR}/sbin/vgchange rm -f ${DESTDIR}/lib/libdevmapper* fi if [ "$TCOS_CPUFREQ" = "1" ]; then for _mod in $(find /lib/modules/${TCOS_KERNEL} | grep cpufreq| grep ko$); do tcos_manual_add_modules $(basename $_mod .ko) done fi fi tcos-0.89.93ubuntu2/xmlrpc/0000775000000000000000000000000012260610427012376 5ustar tcos-0.89.93ubuntu2/xmlrpc/vnc.c0000664000000000000000000000500312260610261013322 0ustar /* * vnc.c part of tcosxmlrpc * => method to start/stop vnc server and client * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "common.h" #include "debug.h" #include "lockcontroller.h" #include "validate.h" #include "vnc.h" #if NEWAPI xmlrpc_value *tcos_vnc(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_vnc(xmlrpc_env *env, xmlrpc_value *in, void *ud) #endif { FILE *fp; char line[BIG_BUFFER]; char *action; char *args; char *user; char *pass; char *login_ok; char cmd[BIG_BUFFER]; char *fret; UNUSED(fret); /* read what info search */ xmlrpc_parse_value(env, in, "(ssss)", &action, &args, &user, &pass); if (env->fault_occurred) return xmlrpc_build_value(env, "s", "params error"); /* need login first */ login_ok=validate_login(user,pass); if( strcmp(login_ok, LOGIN_OK ) != 0 ) return xmlrpc_build_value(env, "s", login_ok ); dbgtcos("tcosxmlrpc::tcos_vnc() login ok, action=%s, args=%s, user=%s, pass=**notshow**\n", action, args, user); #ifdef IS_STANDALONE dbgtcos("tcosxmlrpc::tcos_vnc() standalone\n"); #else dbgtcos("tcosxmlrpc::tcos_vnc() thin client\n"); #endif /* prepare action */ sprintf( cmd , "%s %s %s %s:%s", VNC_CONTROLLER, action, args, user, pass ); dbgtcos("tcosxmlrpc::tcos_vnc() cmd=\"%s %s %s %s:****\"\n", VNC_CONTROLLER, action, args, user); fp=(FILE*)popen(cmd, "r"); /* put error in line */ strncpy(line, VNC_ERROR, BIG_BUFFER); fret=fgets( line, sizeof line, fp); remove_line_break(line); pclose(fp); dbgtcos("tcosxmlrpc::tcos_vnc() line=\"%s\"\n", line); if( strcmp(action, "startclient" ) == 0 ) lockcontroller_exe("lockvnc"); else if( strcmp(action, "stopclient" ) == 0 ) lockcontroller_kill("lockvnc"); return xmlrpc_build_value(env, "s", line ); } tcos-0.89.93ubuntu2/xmlrpc/devices.h0000664000000000000000000000244512260610261014172 0ustar /* * devices.h part of tcosxmlrpc * => common headers of devices.c * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #define DEVICES_WRAPPER TCOS_PATH"/devicesctl.sh " #define DEVICES_OK "ok: device action done." #define DEVICES_ERROR "error: device action error." #define DEVICES_READING_ERROR "error: reading devices settings." #define DEVICES_UNKNOW_ERROR "error: unknow option passed." #if NEWAPI xmlrpc_value *tcos_devices(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_devices(xmlrpc_env *env, xmlrpc_value *in, void *ud); #endif tcos-0.89.93ubuntu2/xmlrpc/tcospasswd.c0000664000000000000000000000237412260610261014736 0ustar /* * tcospasswd.c part of tcosxmlrpc * => return an crypt passwd * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include "common.h" #include "validate.h" void usage(); int main( int argc, char **argv) { char *pass; if (argc==2) { printf("%s\n", crypt(argv[1], PASS_ID) ); return 0; } if (argc != 2) { pass=getpass("TCOS Password: "); printf("%s\n", crypt(pass, PASS_ID) ); return 1; } usage(); return 1; } void usage() { printf("Usage:\n\t\t tcospasswd pass\n"); } tcos-0.89.93ubuntu2/xmlrpc/devices.c0000664000000000000000000000526512260610261014170 0ustar /* * devices.c part of tcosxmlrpc * => return all block devices and set/get actions * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "common.h" #include "debug.h" #include "devices.h" #include "xauth.h" #if NEWAPI xmlrpc_value *tcos_devices(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_devices(xmlrpc_env *env, xmlrpc_value *in, void *ud) #endif { FILE *fp; char line[BSIZE]; char *option; char *cmdline; char mycmd[BSIZE]; char *cookie; char *hostname; int xauth_ok; char *fret; UNUSED(fret); dbgtcos("tcosxmlrpc::tcos_devices() Init \n"); /* read what option and cmdline params need */ xmlrpc_parse_value(env, in, "(ssss)", &option, &cmdline, &cookie, &hostname); if (env->fault_occurred) return xmlrpc_build_value(env, "s", "params error"); dbgtcos("tcosxmlrpc::tcos_devices() option=%s cmdline=%s \n", option, cmdline); if (strcmp(option, "--getxdrivers") == 0 ) { dbgtcos("tcosxmlrpc::tcos_devices() --getxdrivers no xauth\n"); } else { /* need XAUTH first */ xauth_ok=handle_xauth(cookie,hostname); if( xauth_ok != XAUTH_OK ) { dbgtcos("tcos_devices() error: xauth access denied :::::: err number: %d\n", xauth_ok); return xmlrpc_build_value(env, "s", "error: xauth access denied" ); } } /*dbgtcos("tcosxmlrpc::tcos_devices() exec=%s %s %s \n", DEVICES_WRAPPER, option, cmdline);*/ snprintf( (char*) mycmd, BSIZE, "%s %s %s", DEVICES_WRAPPER, option, cmdline); fp=(FILE*)popen( mycmd , "r"); if (fp == NULL) return xmlrpc_build_value(env, "s", DEVICES_READING_ERROR ); /* put error msg into line var */ strncpy(line, DEVICES_ERROR, BSIZE); fret=fgets( line, sizeof line, fp); remove_line_break(line); pclose(fp); dbgtcos("tcosxmlrpc::tcos_devices(%s) = %s \n", mycmd, line); if (env->fault_occurred) { return xmlrpc_build_value(env, "s", DEVICES_READING_ERROR); } return xmlrpc_build_value(env, "s", line ); } tcos-0.89.93ubuntu2/xmlrpc/debug.h0000664000000000000000000000215312260610261013632 0ustar /* * debug.h part of tcosxmlrpc * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include /* variable argument list */ #include /* getenv */ #include /* strcmp */ #include #ifndef HAVE_DEBUG #define dbgtcos(s, ...) __dbgtcos(__FILE__, __LINE__, s, ##__VA_ARGS__) #define HAVE_DEBUG 1 #endif void __dbgtcos(const char *file, int line, const char *format_str, ... ); tcos-0.89.93ubuntu2/xmlrpc/info.c0000664000000000000000000001045712260610261013500 0ustar /* * info.c part of tcosxmlrpc * => method that get system info based on /proc * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "common.h" #include "debug.h" #include "info.h" #if NEWAPI xmlrpc_value *tcos_info(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_info(xmlrpc_env *env, xmlrpc_value *in, void *ud) #endif { FILE *fp; char line[BIG_BUFFER]; char *info; size_t *len; char *fret; UNUSED(fret); /* read what info search */ xmlrpc_parse_value(env, in, "(s#)", &info, &len); dbgtcos("tcosxmlrpc::tcos_info() searching for info=\"%s\"\n", info); if ( strcmp(info, "get_client") == 0 ) fp=(FILE*)popen(GET_CLIENT, "r"); else if ( strcmp(info, "get_process") == 0 ) fp=(FILE*)popen(GET_PROCESS, "r"); /* CPU METHODS */ else if ( strcmp(info, "cpu_model") == 0 ) fp=(FILE*)popen(CPU_MODEL, "r"); else if ( strcmp(info, "cpu_speed" ) == 0) fp=(FILE*)popen(CPU_SPEED, "r"); else if ( strcmp(info, "cpu_vendor" ) == 0) fp=(FILE*)popen(CPU_VENDOR, "r"); /* RAM METHODS */ else if ( strcmp(info, "ram_total" ) == 0) fp=(FILE*)popen(RAM_TOTAL, "r"); else if ( strcmp(info, "ram_active" ) == 0) fp=(FILE*)popen(RAM_ACTIVE, "r"); else if ( strcmp(info, "ram_free" ) == 0) fp=(FILE*)popen(RAM_FREE, "r"); else if ( strcmp(info, "ram_used" ) == 0) fp=(FILE*)popen(RAM_USED, "r"); /* SWAP METHODS */ else if ( strcmp(info, "swap_avalaible" ) == 0) fp=(FILE*)popen(SWAP_AVALAIBLE, "r"); else if ( strcmp(info, "swap_total" ) == 0) fp=(FILE*)popen(SWAP_TOTAL, "r"); else if ( strcmp(info, "swap_used" ) == 0) fp=(FILE*)popen(SWAP_USED, "r"); else if ( strcmp(info, "swap_free" ) == 0) fp=(FILE*)popen(SWAP_FREE, "r"); /* TCOS METHODS */ else if ( strcmp(info, "tcos_date" ) == 0) fp=(FILE*)popen(TCOS_DATE, "r"); else if ( strcmp(info, "tcos_generation_date" ) == 0) fp=(FILE*)popen(TCOS_GENERATION_DATE, "r"); else if ( strcmp(info, "tcos_version" ) == 0) fp=(FILE*)popen(TCOS_VERSION, "r"); else if ( strcmp(info, "tcos_uptime" ) == 0) fp=(FILE*)popen(TCOS_UPTIME, "r"); /* KERNEL METHODS*/ else if ( strcmp(info, "kernel_version" ) == 0) fp=(FILE*)popen(KERNEL_VERSION, "r"); else if ( strcmp(info, "kernel_complete_version" ) == 0) fp=(FILE*)popen(KERNEL_COMPLETE_VERSION, "r"); /* NETWORK METHODS */ else if ( strcmp(info, "network_hostname" ) == 0) fp=(FILE*)popen(NETWORK_HOSTNAME, "r"); else if ( strcmp(info, "network_ip" ) == 0) fp=(FILE*)popen(NETWORK_IP, "r"); else if ( strcmp(info, "network_mac" ) == 0) fp=(FILE*)popen(NETWORK_MAC, "r"); else if ( strcmp(info, "network_mask" ) == 0) fp=(FILE*)popen(NETWORK_MASK, "r"); else if ( strcmp(info, "network_rx" ) == 0) fp=(FILE*)popen(NETWORK_RX, "r"); else if ( strcmp(info, "network_tx" ) == 0) fp=(FILE*)popen(NETWORK_TX, "r"); /* MODULES METHODS */ else if ( strcmp(info, "modules_loaded" ) == 0) fp=(FILE*)popen(MODULES_LOADED, "r"); else if ( strcmp(info, "modules_notfound" ) == 0) fp=(FILE*)popen(MODULES_NOTFOUND, "r"); /* MODULES METHODS */ else if ( strcmp(info, "screensize" ) == 0) fp=(FILE*)popen(SCREENSIZE, "r"); /* default method = error */ else return xmlrpc_build_value(env, "s", INFO_UNKNOW ); if (fp == NULL) return xmlrpc_build_value(env, "s", INFO_UNKNOW ); /* put error into line var */ strncpy(line, INFO_ERROR, BSIZE); fret=fgets( line, sizeof line, fp); remove_line_break(line); pclose(fp); dbgtcos("tcosxmlrpc::tcos_info() line=\"%s\"\n", line); return xmlrpc_build_value(env, "s", line ); } tcos-0.89.93ubuntu2/xmlrpc/standalone.c0000664000000000000000000000720112260610261014666 0ustar /* * standalone.c part of tcosxmlrpc * => methods that get standalone info * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "common.h" #include "debug.h" #include "validate.h" #include "standalone.h" #if NEWAPI xmlrpc_value *tcos_standalone(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_standalone(xmlrpc_env *env, xmlrpc_value *in, void *ud) #endif { FILE *fp; char line[BIG_BUFFER]; char *info; char *group; size_t *len; char *fret; UNUSED(fret); /* read what info search */ xmlrpc_parse_value(env, in, "(ss#)", &info, &group, &len); dbgtcos("tcosxmlrpc::tcos_standalone() searching for standalone=\"%s\"\n", info); if ( strcmp(info, "get_user") == 0 ) fp=(FILE*)popen(STANDALONE_USER, "r"); else if ( strcmp(info, "get_exclude") == 0 ) { snprintf( line, BSIZE, "%s=%s 2>/dev/null", STANDALONE_EXCLUDE, group); fp=(FILE*)popen(line, "r"); } else if ( strcmp(info, "get_process") == 0 ) fp=(FILE*)popen(STANDALONE_PROCESS, "r"); else if ( strcmp(info, "get_server") == 0 ) { snprintf( line, BSIZE, "%s %s 2>/dev/null", STANDALONE_SERVER, group); fp=(FILE*)popen(line, "r"); } else if ( strcmp(info, "get_multiseat") == 0 ) { snprintf( line, BSIZE, "%s %s 2>/dev/null", STANDALONE_MULTISEAT, group); fp=(FILE*)popen(line, "r"); } else if ( strcmp(info, "get_time") == 0 ) fp=(FILE*)popen(STANDALONE_TIME, "r"); /* default method = error */ else return xmlrpc_build_value(env, "s", STANDALONE_UNKNOW ); if (fp == NULL) return xmlrpc_build_value(env, "s", STANDALONE_UNKNOW ); /* put error into line */ strncpy(line, STANDALONE_ERROR, BIG_BUFFER); fret=fgets( line, sizeof line, fp); remove_line_break(line); pclose(fp); dbgtcos("tcosxmlrpc::tcos_standalone() line=\"%s\"\n", line); return xmlrpc_build_value(env, "s", line ); } #if NEWAPI xmlrpc_value *tcos_dbus(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_dbus(xmlrpc_env *env, xmlrpc_value *in, void *ud) #endif { FILE *fp; char cmd[BIG_BUFFER]; char line[BIG_BUFFER]; char *dbus; char *user; char *pass; char *login_ok; char *fret; UNUSED(fret); /* read what dbus search */ xmlrpc_parse_value(env, in, "(sss)", &dbus, &user, &pass); /* need login first */ login_ok=validate_login(user,pass); if( strcmp(login_ok, LOGIN_OK ) != 0 ) return xmlrpc_build_value(env, "s", login_ok ); dbgtcos("tcosxmlrpc::tcos_dbus() searching for dbus=\"%s\"\n", dbus); snprintf( cmd, BSIZE, "%s %s", DBUS_HANDLER, dbus); dbgtcos("tcosxmlrpc::tcosdbus() exe=\"%s\"\n", cmd); fp=(FILE*)popen(cmd, "r"); if (fp == NULL) return xmlrpc_build_value(env, "s", DBUS_ERROR ); /* put error into line var */ strncpy(line, DBUS_ERROR, BIG_BUFFER); fret=fgets( line, sizeof line, fp); remove_line_break(line); pclose(fp); return xmlrpc_build_value(env, "s", line ); } tcos-0.89.93ubuntu2/xmlrpc/pci.c0000664000000000000000000000550612260610261013317 0ustar /* * pci.c part of tcosxmlrpc * => return all pci buses info * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "common.h" #include "debug.h" #include "validate.h" #include "pci.h" #if NEWAPI xmlrpc_value *tcos_pci(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_pci(xmlrpc_env *env, xmlrpc_value *in, void *ud) #endif { FILE *fp; char line[BSIZE]; char *pci; char allpci[BSIZE]; char pci_cmd[BSIZE]; size_t *len; char *fret; UNUSED(fret); /* put error msg into line var */ strncpy(line, PCI_ERROR, BSIZE); /* read what info search */ xmlrpc_parse_value(env, in, "(s#)", &pci, &len); dbgtcos("tcosxmlrpc::tcos_pci() searching for pci=\"%s\"\n", pci); if (strcmp(pci, "") == 0 ) { return xmlrpc_build_value(env, "s", PCI_NEED_ID ); } /* list all pci ids */ else if ( strcmp(pci, "pci_all") == 0 ) { fp=(FILE*)popen(PCI_ALL, "r"); dbgtcos("tcosxmlrpc::tcos_pci() reading pipe\n"); if (fp == NULL) return xmlrpc_build_value(env, "s", PCI_FP_ERROR ); fret=fgets( line, sizeof line, fp); remove_line_break(line); pclose(fp); dbgtcos("tcosxmlrpc::tcos_pci() line=\"%s\"\n", line); return xmlrpc_build_value(env, "s", line ); } /* default method */ else { /* read all PCI ids and store in allpci */ fp=(FILE*)popen(PCI_ALL, "r"); fret=fgets( allpci, sizeof allpci, fp); remove_line_break(line); pclose(fp); /* search pci in allpci */ dbgtcos("tcosxmlrpc::tcos_pci() compare=\"%d\"\n", strstr( allpci, pci)); if ( strstr( allpci, pci ) == 0 ) { return xmlrpc_build_value(env, "s", PCI_UNKNOW ); } else { /* return info about pci bus id */ snprintf ( (char*) pci_cmd, BSIZE, "lspci |grep \"%s\" | sed s/\"%s \"//g", pci, pci); dbgtcos("tcosxmlrpc::tcos_pci() pci_cmd=\"%s\"\n", pci_cmd); fp=(FILE*)popen(pci_cmd, "r"); fret=fgets( line, sizeof line, fp); remove_line_break(line); pclose(fp); return xmlrpc_build_value(env, "s", line ); } } /* never here */ return xmlrpc_build_value(env, "s", PCI_UNKNOW ); } tcos-0.89.93ubuntu2/xmlrpc/var/0000775000000000000000000000000012260610427013166 5ustar tcos-0.89.93ubuntu2/xmlrpc/var/www/0000775000000000000000000000000012260610427014012 5ustar tcos-0.89.93ubuntu2/xmlrpc/var/www/index.htm0000664000000000000000000000122012260610261015622 0ustar ABYSS is working !!!

Congratulations, ABYSS is working !!!


ABYSS Web Server is working correctly on your system. You should now change this page with yours.
Please include in your web pages (at least the first), the 'Powered by ABYSS' banner to promote the use of ABYSS.


Copyright 2000 Moez Mahfoudh. All rights reserved.

tcos-0.89.93ubuntu2/xmlrpc/var/www/pwrabyss.gif0000664000000000000000000000422612260610261016353 0ustar GIF89a-!!!!!)))))1111199999BBBBBJJJJJRRRZZZZZccccckkkkksssss{{{{{,-MH*\ȰÇ#64!ŋ3jhǏ CIɓ(S<CEbʔɱ&8s /yjcϣH*ae РCэ:)Prי&cL%I8pc_~t 7L?^0SU:#ݸ<Ψ `A^pxGl" 11g ,bG3STc1Tގgާ`EjV䃙?.nq9J:9h<>5/|S[JfqɁ~́V w9xC&z `R{$iЗ}DNeLxJqс1!^#u!PL 5@ GV@tt%^fD  >tTzމUfրd"m'(%h%^@mwQRH^JR҃Ux+LܝM% ET)5s)L L }Wede IaXRH\Fbfj*2NViF(fHkז-Ob)n#q h]y<!6Ydh`LLYՔ` K!C"1H #AF0߀Rb D*A(䞓I G:j|%K/&lWms5$7I (#P9 kDI p@E3эzT hH?*Ғ#MIUҕ0hf:д7MoS5jR ԥ:P%*S;tcos-0.89.93ubuntu2/xmlrpc/var/etc/0000775000000000000000000000000012260610427013741 5ustar tcos-0.89.93ubuntu2/xmlrpc/var/etc/abyss.conf0000664000000000000000000000340212260610261015724 0ustar # ABYSS Web Server configuration file # (C) Moez Mahfoudh - 2000 # Cases in option names are ignored, # that means that PORT=port=PoRT=.. # When writing paths, do not worry about / or \ use. # ABYSS will substitute / with \ on Win32 systems. # Options which are system specific (such as User) are # ignored on systems which do not handle them. # The Port option tells the server on which TCP port to listen. # default is 80 Port 8998 # The name or #number of the user to run the server as if it is # launched as root (UNIX specific) User root # The Server Root (UNIX systems style) ServerRoot __TCOS_ROOT__ # The Server Root (Win32 systems style) # ServerRoot G:\XML\xmlrpc-c-0.9.5\conf\abyss_root # The Path option specifies the web files path. Path __TCOS_WWW__ # The Default option contains the name of the files the server should # look for when only a path is given (e.g. http://myserver/info/). Default index.html index.htm INDEX.HTM INDEX.HTML # The KeepAlive option is used to set the maximum number of requests # served using the same persistent connection. KeepAlive 10 # The TimeOut option tells the server how much seconds to wait for # an idle connection before closing it. TimeOut 10 # The MimeTypes option specifies the location of the file # containing the mapping of MIME types and files extensions MimeTypes __TCOS_ETC__/mime.types # The path of the log file LogFile __TCOS_LOG__/access.log # The file where the pid of the server is logged (UNIX specific) PidFile __TCOS_LOG__/abyss.pid # If AdvertiseServer if set to no, then no server field would be # appended to the responses. This is the way to make the server # identity unknown to some malicious people which can profit from # well known security holes in the software to crash it. AdvertiseServer yes tcos-0.89.93ubuntu2/xmlrpc/var/etc/httpd2.conf0000664000000000000000000000002412260610261016005 0ustar ip:* /:* /cgi-bin:* tcos-0.89.93ubuntu2/xmlrpc/var/etc/stunnel/0000775000000000000000000000000012260610427015431 5ustar tcos-0.89.93ubuntu2/xmlrpc/var/etc/stunnel/stunnel-custom.conf0000664000000000000000000000054112260610261021274 0ustar cert=/etc/tcos/ssl/tcos-custom.pem sslVersion=all syslog=no session=1 delay=no chroot=/var/lib/tcos/standalone/lib/stunnel4/ setuid=stunnel4 setgid=stunnel4 pid=/stunnel4.pid socket=l:TCP_NODELAY=1 socket=r:TCP_NODELAY=1 ;compression = rle ;debug = 7 output=/var/lib/tcos/standalone/log/stunnel.log [tcosxmlrpc] accept=8999 connect=8998 TIMEOUTclose=0 tcos-0.89.93ubuntu2/xmlrpc/var/etc/stunnel/stunnel.conf0000664000000000000000000000056112260610261017766 0ustar cert=/var/lib/tcos/standalone/etc/stunnel/tcos.pem sslVersion=all syslog=no session=1 delay=no chroot=/var/lib/tcos/standalone/lib/stunnel4/ setuid=stunnel4 setgid=stunnel4 pid=/stunnel4.pid socket=l:TCP_NODELAY=1 socket=r:TCP_NODELAY=1 ;compression = rle ;debug = 7 output=/var/lib/tcos/standalone/log/stunnel.log [tcosxmlrpc] accept=8999 connect=8998 TIMEOUTclose=0 tcos-0.89.93ubuntu2/xmlrpc/var/etc/mime.types0000664000000000000000000001627212260610261015762 0ustar # This is a comment. I love comments. # This file controls what Internet media types are sent to the client for # given file extension(s). Sending the correct media type to the client # is important so they know how to handle the content of the file. # Extra types can either be added here or by using an AddType directive # in your config files. For more information about Internet media types, # please read RFC 2045, 2046, 2047, 2048, and 2077. The Internet media type # registry is at . # MIME type Extension application/EDI-Consent application/EDI-X12 application/EDIFACT application/activemessage application/andrew-inset ez application/applefile application/atomicmail application/cals-1840 application/commonground application/cybercash application/dca-rft application/dec-dx application/eshop application/hyperstudio application/iges application/mac-binhex40 hqx application/mac-compactpro cpt application/macwriteii application/marc application/mathematica application/msword doc application/news-message-id application/news-transmission application/octet-stream bin dms lha lzh exe class application/oda oda application/pdf pdf application/pgp-encrypted application/pgp-keys application/pgp-signature application/pkcs10 application/pkcs7-mime application/pkcs7-signature application/postscript ai eps ps application/prs.alvestrand.titrax-sheet application/prs.cww application/prs.nprend application/remote-printing application/riscos application/rtf rtf application/set-payment application/set-payment-initiation application/set-registration application/set-registration-initiation application/sgml application/sgml-open-catalog application/slate application/smil smi smil application/vemmi application/vnd.3M.Post-it-Notes application/vnd.FloGraphIt application/vnd.acucobol application/vnd.anser-web-certificate-issue-initiation application/vnd.anser-web-funds-transfer-initiation application/vnd.audiograph application/vnd.businessobjects application/vnd.claymore application/vnd.comsocaller application/vnd.dna application/vnd.dxr application/vnd.ecdis-update application/vnd.ecowin.chart application/vnd.ecowin.filerequest application/vnd.ecowin.fileupdate application/vnd.ecowin.series application/vnd.ecowin.seriesrequest application/vnd.ecowin.seriesupdate application/vnd.enliven application/vnd.epson.salt application/vnd.fdf application/vnd.ffsns application/vnd.framemaker application/vnd.fujitsu.oasys application/vnd.fujitsu.oasys2 application/vnd.fujitsu.oasys3 application/vnd.fujitsu.oasysgp application/vnd.fujitsu.oasysprs application/vnd.fujixerox.docuworks application/vnd.hp-HPGL application/vnd.hp-PCL application/vnd.hp-PCLXL application/vnd.hp-hps application/vnd.ibm.MiniPay application/vnd.ibm.modcap application/vnd.intercon.formnet application/vnd.intertrust.digibox application/vnd.intertrust.nncp application/vnd.is-xpr application/vnd.japannet-directory-service application/vnd.japannet-jpnstore-wakeup application/vnd.japannet-payment-wakeup application/vnd.japannet-registration application/vnd.japannet-registration-wakeup application/vnd.japannet-setstore-wakeup application/vnd.japannet-verification application/vnd.japannet-verification-wakeup application/vnd.koan application/vnd.lotus-1-2-3 application/vnd.lotus-approach application/vnd.lotus-freelance application/vnd.lotus-organizer application/vnd.lotus-screencam application/vnd.lotus-wordpro application/vnd.meridian-slingshot application/vnd.mif mif application/vnd.minisoft-hp3000-save application/vnd.mitsubishi.misty-guard.trustweb application/vnd.ms-artgalry application/vnd.ms-asf application/vnd.ms-excel xls application/vnd.ms-powerpoint ppt application/vnd.ms-project application/vnd.ms-tnef application/vnd.ms-works application/vnd.music-niff application/vnd.musician application/vnd.netfpx application/vnd.noblenet-directory application/vnd.noblenet-sealer application/vnd.noblenet-web application/vnd.novadigm.EDM application/vnd.novadigm.EDX application/vnd.novadigm.EXT application/vnd.osa.netdeploy application/vnd.powerbuilder6 application/vnd.powerbuilder6-s application/vnd.rapid application/vnd.seemail application/vnd.shana.informed.formtemplate application/vnd.shana.informed.interchange application/vnd.shana.informed.package application/vnd.street-stream application/vnd.svd application/vnd.swiftview-ics application/vnd.truedoc application/vnd.visio application/vnd.webturbo application/vnd.wrq-hp3000-labelled application/vnd.wt.stf application/vnd.xara application/vnd.yellowriver-custom-menu application/wita application/wordperfect5.1 application/x-bcpio bcpio application/x-cdlink vcd application/x-chess-pgn pgn application/x-compress application/x-cpio cpio application/x-csh csh application/x-director dcr dir dxr application/x-dvi dvi application/x-futuresplash spl application/x-gtar gtar application/x-gzip application/x-hdf hdf application/x-javascript js application/x-koan skp skd skt skm application/x-latex latex application/x-netcdf nc cdf application/x-sh sh application/x-shar shar application/x-shockwave-flash swf application/x-stuffit sit application/x-sv4cpio sv4cpio application/x-sv4crc sv4crc application/x-tar tar application/x-tcl tcl application/x-tex tex application/x-texinfo texinfo texi application/x-troff t tr roff application/x-troff-man man application/x-troff-me me application/x-troff-ms ms application/x-ustar ustar application/x-wais-source src application/x400-bp application/xml application/zip zip audio/32kadpcm audio/basic au snd audio/midi mid midi kar audio/mpeg mpga mp2 mp3 audio/vnd.qcelp audio/x-aiff aif aiff aifc audio/x-pn-realaudio ram rm audio/x-pn-realaudio-plugin rpm audio/x-realaudio ra audio/x-wav wav chemical/x-pdb pdb xyz image/bmp bmp image/cgm image/g3fax image/gif gif image/ief ief image/jpeg jpeg jpg jpe image/naplps image/png png image/prs.btif image/tiff tiff tif image/vnd.dwg image/vnd.dxf image/vnd.fpx image/vnd.net-fpx image/vnd.svf image/vnd.xiff image/x-cmu-raster ras image/x-portable-anymap pnm image/x-portable-bitmap pbm image/x-portable-graymap pgm image/x-portable-pixmap ppm image/x-rgb rgb image/x-xbitmap xbm image/x-xpixmap xpm image/x-xwindowdump xwd message/delivery-status message/disposition-notification message/external-body message/http message/news message/partial message/rfc822 model/iges igs iges model/mesh msh mesh silo model/vnd.dwf model/vrml wrl vrml multipart/alternative multipart/appledouble multipart/byteranges multipart/digest multipart/encrypted multipart/form-data multipart/header-set multipart/mixed multipart/parallel multipart/related multipart/report multipart/signed multipart/voice-message text/css css text/directory text/enriched text/html html htm text/plain asc txt text/prs.lines.tag text/rfc822-headers text/richtext rtx text/rtf rtf text/sgml sgml sgm text/tab-separated-values tsv text/uri-list text/vnd.abc text/vnd.flatland.3dml text/vnd.fmi.flexstor text/vnd.in3d.3dml text/vnd.in3d.spot text/vnd.latex-z text/x-setext etx text/xml xml video/mpeg mpeg mpg mpe video/quicktime qt mov video/vnd.motorola.video video/vnd.motorola.videop video/vnd.vivo video/x-msvideo avi video/x-sgi-movie movie x-conference/x-cooltalk ice tcos-0.89.93ubuntu2/xmlrpc/var/exec.sh0000775000000000000000000000143112260610261014444 0ustar #!/bin/sh # Copyright (C) 2006,2007,2008 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # exec "$@" & exit 0 tcos-0.89.93ubuntu2/xmlrpc/dpms.h0000664000000000000000000000214512260610261013510 0ustar /* * dpmsg.h part of tcosxmlrpc * => common headers of dpms.c * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #define DPMS_CONTROLLER DISPLAY" /usr/bin/xset" #define DPMS_CMD_ERROR "error: dpms command error" #if NEWAPI xmlrpc_value *tcos_dpms(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_dpms(xmlrpc_env *env, xmlrpc_value *in, void *ud); #endif tcos-0.89.93ubuntu2/xmlrpc/vlc.c0000664000000000000000000000413412260610261013324 0ustar /* * vlc.c part of tcosxmlrpc * => methods for vlc difussion * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "common.h" #include "debug.h" #include "validate.h" #include "lockcontroller.h" #include "vlc.h" #if NEWAPI xmlrpc_value *tcos_vlc(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_vlc(xmlrpc_env *env, xmlrpc_value *in, void *ud) #endif { FILE *fp; char *volume; char *lock; char *user; char *pass; char *login_ok; char cmd[BIG_BUFFER]; /* read what info search */ xmlrpc_parse_value(env, in, "(ssss)", &volume, &lock, &user, &pass); if (env->fault_occurred) return xmlrpc_build_value(env, "s", "params error"); /* need login first */ login_ok=validate_login(user,pass); if( strcmp(login_ok, LOGIN_OK ) != 0 ) return xmlrpc_build_value(env, "s", login_ok ); dbgtcos("tcosxmlrpc::tcos_vlc() login ok, volume=%s, lock=%s, user=%s, pass=**notshow**\n", volume, lock, user); #ifdef IS_STANDALONE dbgtcos("tcosxmlrpc::tcos_vlc() standalone\n"); #else dbgtcos("tcosxmlrpc::tcos_vlc() thin client\n"); #endif /* prepare action */ sprintf( cmd , "%s %s", VLC_CONTROLLER, volume); dbgtcos("tcosxmlrpc::tcos_vlc() cmd=\"%s\"\n", cmd); fp=(FILE*)popen(cmd, "r"); pclose(fp); if ( strcmp(lock, "enable" ) == 0 ) lockcontroller_exe("lockvlc"); return xmlrpc_build_value(env, "s", "OK" ); } tcos-0.89.93ubuntu2/xmlrpc/pam-usb.c0000664000000000000000000001102412260610261014100 0ustar /* * pam-usb.c part of tcosxmlrpc * => allow to login from GDM server using pam-usb * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "common.h" #include "debug.h" #include "validate.h" #include "pam-usb.h" #include "xauth.h" #if NEWAPI xmlrpc_value *tcos_pam_usb(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_pam_usb(xmlrpc_env *env, xmlrpc_value *in, void *ud) #endif { FILE *fp; char line[BSIZE]; char *option; char *cmdline; char mycmd[BSIZE]; char *cookie; char *hostname; int xauth_ok; char *fret; UNUSED(fret); unsigned char *buf, *e; size_t len, elen;/*, fwret;*/ static xmlrpc_value *result; dbgtcos("tcosxmlrpc::tcos_pam_usb() Init \n"); /* read what option and cmdline params need */ xmlrpc_parse_value(env, in, "(ssss)", &option, &cmdline, &cookie, &hostname); if (env->fault_occurred) return xmlrpc_build_value(env, "s", "params error"); dbgtcos("tcosxmlrpc::tcos_pam_usb() option=%s cmdline=%s \n", option, cmdline); /* need XAUTH first (only if not initusb) */ if ( strncmp(option, "initusb", 7) != 0 ) { dbgtcos("tcos_pam_usb() trying to read auth info\n"); xauth_ok=handle_xauth(cookie,hostname); if( xauth_ok != XAUTH_OK ) { dbgtcos("tcos_pam_usb() error: xauth access denied :::::: err number: %d\n", xauth_ok); return xmlrpc_build_value(env, "s", "error: xauth access denied" ); } } /* if option == getpad use base64 to read file */ if ( strcmp(option, "getpad") == 0 ) { dbgtcos("tcos_pam_usb() option getpad, read base64 file\n"); /* file is /mnt/__UUID__/.pamusb/__USER__.__SERVERHOSTNAME__.pad */ buf = readfile(cmdline, &len); if (buf == NULL) return xmlrpc_build_value(env, "s", PAM_USB_EMPTY ); e = base64_encode(buf, len, &elen); result = xmlrpc_build_value(env, "s", e ); free(e); dbgtcos("tcos_pam_usb() option getpad, ok, returning base64 code (%d bytes)...\n", len); return result; } /* if option == savepad use base64 to write file */ if ( strncmp(option, "/mnt/", 5) == 0 ) { dbgtcos("tcos_pam_usb() option savepad, save base64 file\n"); /* file is /mnt/__UUID__/.pamusb/__USER__.__SERVERHOSTNAME__.pad */ e = base64_encode( (const unsigned char *) cmdline, len, &elen); fp = fopen(option, "w"); if (fp == NULL) return xmlrpc_build_value(env, "s", PAM_USB_READING_ERROR ); (void)fwrite(e, 1, elen, fp); fclose(fp); free(e); dbgtcos("tcos_pam_usb() option savepad, ok, saving base64 code into '%s'...\n", option); return xmlrpc_build_value(env, "s", PAM_USB_OK ); } /* if option == getpad use base64 to read file */ if ( strncmp(option, "//mnt/", 6) == 0 ) { dbgtcos("tcos_pam_usb() option newpad, save base64 text into file in binary format\n"); /* file is /mnt/__UUID__/.pamusb/__USER__.__SERVERHOSTNAME__.pad */ len=(strlen(cmdline)); e = base64_decode( (const unsigned char *) cmdline, len, &elen); fp = fopen(option, "w+"); if (fp == NULL) return xmlrpc_build_value(env, "s", PAM_USB_READING_ERROR ); (void)fwrite(e, 1, elen, fp); fclose(fp); free(e); dbgtcos("tcos_pam_usb() option newpad, ok, saving base64 code into '%s'...\n", option); return xmlrpc_build_value(env, "s", PAM_USB_OK ); } snprintf( (char*) mycmd, BSIZE, "%s %s '%s'", PAM_USB_WRAPPER, option, cmdline); fp=(FILE*)popen( mycmd , "r"); if (fp == NULL) return xmlrpc_build_value(env, "s", PAM_USB_READING_ERROR ); /* put error msg into line var */ strncpy(line, PAM_USB_ERROR, BSIZE); fret=fgets( line, sizeof line, fp); remove_line_break(line); pclose(fp); dbgtcos("tcosxmlrpc::tcos_pam_usb(%s) = %s \n", mycmd, line); if (env->fault_occurred) { return xmlrpc_build_value(env, "s", PAM_USB_READING_ERROR); } return xmlrpc_build_value(env, "s", line ); } tcos-0.89.93ubuntu2/xmlrpc/pci.h0000664000000000000000000000266012260610261013322 0ustar /* * pci.h part of tcosxmlrpc * => common headers of pci.c * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* xmlrpc methods to export thin client info */ /* extract pci info */ /*#define PCI_ALL "for id in $(lspci| awk '{print $1}'); do echo -n \"$id \"; done; echo"*/ #define PCI_ALL "lspci | awk '{printf $1\" \"}'; echo" /* messages */ #define PCI_UNKNOW "error: Unknow pci id" #define PCI_FP_ERROR "error: Error opening pointer" #define PCI_NEED_ID "error: Need PCI id (example 00:10.1)" #define PCI_ERROR "error: pci command failure" #if NEWAPI xmlrpc_value *tcos_pci(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_pci(xmlrpc_env *env, xmlrpc_value *in, void *ud); #endif tcos-0.89.93ubuntu2/xmlrpc/config.c0000664000000000000000000000564312260610261014013 0ustar /* * config.c part of tcosxmlrpc * => get TCOS config vars * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "common.h" #include "debug.h" #include "validate.h" #include "xauth.h" #include "config.h" #if NEWAPI xmlrpc_value *tcos_config(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_config(xmlrpc_env *env, xmlrpc_value *in, void *ud) #endif { FILE *fp; char line[BSIZE]; char *option; char *cmdline; char mycmd[BSIZE]; char *user; char *pass; char *login_ok; char hostname[BSIZE]; int xauth_ok; struct ip_address ip; char ip_string[BSIZE]; char *fret; UNUSED(fret); dbgtcos("tcosxmlrpc::tcos_config() Init \n"); /* read what option and cmdline params need */ xmlrpc_parse_value(env, in, "(ssss)", &option, &cmdline, &user, &pass); if (env->fault_occurred) return xmlrpc_build_value(env, "s", "params error"); gethostname(hostname,BSIZE); fp=(FILE*)popen(MY_IP_ADDRESS, "r"); fret=fgets( ip_string, sizeof ip_string, fp); remove_line_break(ip_string); pclose(fp); ip=check_ip_address(ip_string); dbgtcos("tcosxmlrpc::tcos_config() option=%s cmdline=%s user=%s pass=**notshow**\n", option, cmdline, user); if ( (strcmp(pass, hostname ) == 0) || (strcmp(pass, ip.ipstr) == 0) ) { /* need XAUTH first */ xauth_ok=handle_xauth(user,pass); if( xauth_ok != XAUTH_OK ) return xmlrpc_build_value(env, "s", "error: xauth access denied" ); } else { /* need login first */ login_ok=validate_login(user,pass); if( strcmp(login_ok, LOGIN_OK ) != 0 ) return xmlrpc_build_value(env, "s", login_ok ); } dbgtcos("tcosxmlrpc::tcos_config() exec=\"%s %s %s\"\n", CONFIG_WRAPPER, option, cmdline); snprintf( (char*) mycmd, BSIZE, "%s %s %s", CONFIG_WRAPPER, option, cmdline); fp=(FILE*)popen( mycmd , "r"); if (fp == NULL) return xmlrpc_build_value(env, "s", CONFIG_READING_ERROR ); /* put -1 into line var */ strncpy(line, CONFIG_ERROR, BSIZE); fret=fgets( line, sizeof line, fp); remove_line_break(line); pclose(fp); if (env->fault_occurred) { return xmlrpc_build_value(env, "s", CONFIG_READING_ERROR); } return xmlrpc_build_value(env, "s", line ); } tcos-0.89.93ubuntu2/xmlrpc/validate.h0000664000000000000000000000360012260610261014333 0ustar /* * validate.h part of tcosxmlrpc * => common headers of validate.c * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __VALIDATE_H__ /* crypt salt */ #define PASS_ID "$1$id2trA1q" #define LOGIN_OK "ok" #define LOGIN_NOUSER "error: User not allowed" #define LOGIN_NOPASS "error: Password not valid" #define LOGIN_NOPERMS "error: cant read shadow" #define LOGIN_EXPIRED "error: user expired" #define LOGIN_ERROR "error: unknow error" #define LOGIN_SHADOW_ERROR "error: can't read /etc/shadow" /* USE_XOPEN makes crypt available from unistd.h. */ #define __USE_XOPEN #include char *crypt(const char *key, const char *salt); typedef struct info { char line[BSIZE]; char *user; char *pass; int logged; } login ; #define __VALIDATE_H__ /* The longest allowable length of a username */ #define MAX_USERNAME_LENGTH 100 /* The longest allowable length of the plaintext password*/ #define MAX_PW_LENGTH 100 /* How many seconds to sleep on a failed validation */ #define SLEEP_SECONDS (0) /* Whether or not to record failed attempts in the system log defined=yes, not defined=no */ #define LOG_FAILED_ATTEMPTS char *validate_login(char *user, char*pw); #endif tcos-0.89.93ubuntu2/xmlrpc/screenshot.c0000664000000000000000000000371112260610261014715 0ustar /* * screenshot.c part of tcosxmlrpc * => method exec scrot to make an screenshot * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "common.h" #include "debug.h" #include "validate.h" #include "screenshot.h" #if NEWAPI xmlrpc_value *tcos_screenshot(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_screenshot(xmlrpc_env *env, xmlrpc_value *in, void *ud) #endif { char line[BIG_BUFFER]; char response[BSIZE]; FILE *fp; char *size; char *user; char *pass; char *login_ok; char *fret; /* read what info search */ xmlrpc_parse_value(env, in, "(sss)", &size, &user, &pass); if (env->fault_occurred) return xmlrpc_build_value(env, "s", "params error"); /* need login first */ login_ok=validate_login(user,pass); if( strcmp(login_ok, LOGIN_OK ) != 0 ) return xmlrpc_build_value(env, "s", login_ok ); if ( strlen(size) > 0) snprintf( (char*) line, BSIZE, "%s %s", SCROT_CMD, size); else snprintf( (char*) line, BSIZE, "%s", SCROT_CMD); dbgtcos("tcosxmlrpc::screenshot() exe=%s\n", line); fp=(FILE*)popen(line, "r"); fret= fgets( response, sizeof(response), fp); remove_line_break(response); pclose(fp); return xmlrpc_build_value(env, "s", response ); } tcos-0.89.93ubuntu2/xmlrpc/login.c0000664000000000000000000000456512260610261013660 0ustar /* * login.c part of tcosxmlrpc * => method that AUTH remote XMLRPC * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "common.h" #include "debug.h" #include "validate.h" #include "login.h" #if NEWAPI xmlrpc_value *tcos_login(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_login(xmlrpc_env *env, xmlrpc_value *in, void *ud) #endif { char *login_ok; char *user; char *pass; xmlrpc_parse_value(env, in, "(ss)", &user, &pass); dbgtcos("tcosxmlrpc::tcos_login() user=\"%s\" pass=\"******\"\n"); login_ok=validate_login(user, pass); /* if ( login_ok == LOGIN_OK )*/ if ( strcmp(login_ok, LOGIN_OK ) == 0 ) return xmlrpc_build_value(env, "s", LOGIN_OK_MSG); /* else if ( login_ok == LOGIN_NOUSER) */ else if ( strcmp(login_ok, LOGIN_NOUSER ) == 0 ) return xmlrpc_build_value(env, "s", LOGIN_NOUSER_MSG); /* else if ( login_ok == LOGIN_NOPASS) */ else if ( strcmp(login_ok, LOGIN_NOPASS ) == 0 ) return xmlrpc_build_value(env, "s", LOGIN_NOPASS_MSG); /* else if ( login_ok == LOGIN_NOPERMS) */ else if ( strcmp(login_ok, LOGIN_NOPERMS ) == 0 ) return xmlrpc_build_value(env, "s", LOGIN_NOPERMS_MSG); /* else if ( login_ok == LOGIN_EXPIRED) */ else if ( strcmp(login_ok, LOGIN_EXPIRED ) == 0 ) return xmlrpc_build_value(env, "s", LOGIN_EXPIRED_MSG); return xmlrpc_build_value(env, "s", LOGIN_ERROR); } #if NEWAPI xmlrpc_value *tcos_logout(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_logout(xmlrpc_env *env, xmlrpc_value *in, void *ud) #endif { /* dummy method */ return xmlrpc_build_value(env, "s", 1 ); } tcos-0.89.93ubuntu2/xmlrpc/tnc.c0000664000000000000000000000522112260610261013322 0ustar /* * tnc.c part of tcosxmlrpc * => method to lock/unlock internet with iptables rules * Copyright (C) 2006,2007,2008 mariodebian at gmail * Copyright (C) 2006,2007,2008 vidal_joshur at gva.es * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "common.h" #include "debug.h" #include "validate.h" #include "tnc.h" #if NEWAPI xmlrpc_value *tcos_tnc(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_tnc(xmlrpc_env *env, xmlrpc_value *in, void *ud) #endif { FILE *fp; char line[BIG_BUFFER]; char *action; char *ports; char *onlyports; char *username; char *user; char *pass; char *login_ok; char cmd[BIG_BUFFER]; char *fret; UNUSED(fret); /* read what info search */ xmlrpc_parse_value(env, in, "(ssssss)", &action, &onlyports, &ports, &username, &user, &pass); if (env->fault_occurred) return xmlrpc_build_value(env, "s", "params error"); /* need login first */ login_ok=validate_login(user,pass); if( strcmp(login_ok, LOGIN_OK ) != 0 ) return xmlrpc_build_value(env, "s", login_ok ); dbgtcos("tcosxmlrpc::tcos_tnc() login ok, action=%s, only-ports=%s, ports=%s, username=%s, user=%s, pass=**notshow**\n", action, onlyports, ports, username, user); /* prepare action */ if( strcmp(action, "disable-internet" ) == 0 ) { if ((fp=(FILE*)popen(NETWORK_IFACE, "r")) != NULL) { fret=fgets( line, sizeof line, fp); remove_line_break(line); pclose(fp); sprintf( cmd , "%s %s %s %s %s %s", TNC_CONTROLLER, action, onlyports, ports, line, username); } } else { sprintf( cmd , "%s %s %s %s %s", TNC_CONTROLLER, action, onlyports, ports, username); } dbgtcos("tcosxmlrpc::tcos_tnc() cmd=\"%s\"\n", cmd); fp=(FILE*)popen(cmd, "r"); /* put error in line */ strncpy(line, TNC_ERROR, BIG_BUFFER); fret=fgets( line, sizeof line, fp); remove_line_break(line); pclose(fp); dbgtcos("tcosxmlrpc::tcos_tnc() line=\"%s\"\n", line); return xmlrpc_build_value(env, "s", line ); } tcos-0.89.93ubuntu2/xmlrpc/xauth.h0000664000000000000000000000230712260610261013676 0ustar /* * xauth.h part of tcosxmlrpc * => common headers of xauth.c * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #define XAUTH_OK 0 #define XAUTH_ERROR 1 #define XAUTH_FAIL 2 #define XAUTH_TIMEOUT 3 #define XAUTH_BAD_HOSTNAME 4 #define XAUTH_BAD_FDTEMP 5 int handle_xauth( char *cookie , char *servername); #if NEWAPI xmlrpc_value *tcos_xauth(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_xauth(xmlrpc_env *env, xmlrpc_value *in, void *ud); #endif tcos-0.89.93ubuntu2/xmlrpc/debug.c0000664000000000000000000000234012260610261013623 0ustar /* * debug.c part of tcosxmlrpc * => dbgtcos function * Copyright (C) 2006,2007,2008 mariodebian at gmail * Copyright (C) 2006,2007,2008 vidal_joshur at gva.es * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "common.h" #include "debug.h" void __dbgtcos(const char *file, int line, const char *format_str, ... ) { if ( getenv("TCOS_DEBUG") == NULL) return; if ( strcmp(getenv("TCOS_DEBUG"), "1" ) == 0 ) { va_list ap; fprintf(stderr, "[%s:%03d] ", file, line); va_start( ap, format_str ); va_end( ap ); vfprintf(stderr, format_str , ap); } } tcos-0.89.93ubuntu2/xmlrpc/xorg.c0000664000000000000000000000657512260610261013532 0ustar /* * xorg.c part of tcosxmlrpc * => througt configurexorg script make some actions and get info * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "common.h" #include "validate.h" #include "debug.h" #include "xorg.h" #if NEWAPI xmlrpc_value *tcos_xorg(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_xorg(xmlrpc_env *env, xmlrpc_value *in, void *ud) #endif { FILE *fp; char line[BSIZE]; char *option; char *cmdline; char *user; char *pass; char *login_ok; char *fret; UNUSED(fret); /* read what option and cmdline params need */ xmlrpc_parse_value(env, in, "(ssss)", &option, &cmdline, &user, &pass); if (env->fault_occurred) return xmlrpc_build_value(env, "s", "params error"); /* need login first */ login_ok=validate_login(user,pass); if( strcmp(login_ok, LOGIN_OK ) != 0 ) return xmlrpc_build_value(env, "s", login_ok ); dbgtcos("tcosxmlrpc::tcos_xorg() option=\"%s\" cmdline=\"%s\"\n", option, cmdline); /* generate new xorg.conf */ if ( strcmp(option, "new") == 0 ) { snprintf( (char*) line, BSIZE, "%s %s", XORG_NEW_CONF, cmdline ); dbgtcos("tcosxmlrpc::tcos_xorg() new exec=\"%s\"\n", line); if (system(line) != 0 ) return xmlrpc_build_value(env, "s", XORG_ERROR ); else return xmlrpc_build_value(env, "s", XORG_OK ); } /* change xorg.conf */ else if ( strcmp(option, "change") == 0 ) { snprintf( (char*) line, BSIZE, "%s %s", XORG_CHANGE_CONF, cmdline ); dbgtcos("tcosxmlrpc::tcos_xorg() change exec=\"%s\"\n", line); if (system(line) != 0 ) return xmlrpc_build_value(env, "s", XORG_ERROR ); else return xmlrpc_build_value(env, "s", XORG_OK ); } /* rebuild xorg.conf */ else if ( strcmp(option, "rebuild") == 0 ) { snprintf( (char*) line, BSIZE, "%s %s", XORG_REBUILD_CONF, cmdline ); dbgtcos("tcosxmlrpc::tcos_xorg() rebuild exec=\"%s\"\n", line); if (system(line) != 0 ) return xmlrpc_build_value(env, "s", XORG_ERROR ); else return xmlrpc_build_value(env, "s", XORG_OK ); } else if ( strcmp(option, "get") == 0 ) { dbgtcos("tcosxmlrpc::tcos_xorg() get xorg.conf exec=\"%s\"\n", XORG_GET_CONF); fp=(FILE*)popen(XORG_GET_CONF, "r"); if (fp == NULL) return xmlrpc_build_value(env, "s", XORG_READING_ERROR ); /* put error msg into line var */ strncpy(line, XORG_ERROR, BSIZE); fret=fgets( line, sizeof line, fp); remove_line_break(line); pclose(fp); if (env->fault_occurred) { return xmlrpc_build_value(env, "s", XORG_READING_ERROR); } return xmlrpc_build_value(env, "s", line ); } else { return xmlrpc_build_value(env, "s", XORG_UNKNOW_OPTION ); } } tcos-0.89.93ubuntu2/xmlrpc/reboot_poweroff.c0000664000000000000000000000614412260610261015744 0ustar /* * reboot_poweroff.c part of tcosxmlrpc * => reboot or poweroff thin client using Xorg auth * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "common.h" #include "debug.h" #include "validate.h" #include "xauth.h" #include "exe.h" #include "reboot_poweroff.h" #if NEWAPI xmlrpc_value *tcos_reboot_poweroff(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_reboot_poweroff(xmlrpc_env *env, xmlrpc_value *in, void *ud) #endif { FILE *fp; char *option; char *timeout; char *user; char *pass; char *login_ok; char hostname[BSIZE]; int xauth_ok; struct ip_address ip; char ip_string[BSIZE]; char cmd[BIG_BUFFER]; char *fret; UNUSED(fret); dbgtcos("tcosxmlrpc::tcos_reboot_poweroff() Init \n"); /* read what option and cmdline params need */ xmlrpc_parse_value(env, in, "(ssss)", &option, &timeout, &user, &pass); if (env->fault_occurred) return xmlrpc_build_value(env, "s", "params error"); gethostname(hostname,BSIZE); fp=(FILE*)popen(MY_IP_ADDRESS, "r"); fret=fgets( ip_string, sizeof ip_string, fp); remove_line_break(ip_string); pclose(fp); ip=check_ip_address(ip_string); /*dbgtcos("tcosxmlrpc::tcos_reboot_poweroff() option=%s user=%s pass=%s hostname=%s ip=%s\n", option, user, pass, hostname, ip.ipstr); dbgtcos("tcosxmlrpc::tcos_reboot_poweroff() (strcmp(pass, hostname)=%d\n",strcmp(pass,hostname) ); dbgtcos("tcosxmlrpc::tcos_reboot_poweroff() (strcmp(pass, ip.ipstr)=%d\n",strcmp(pass,ip.ipstr) );*/ if ( (strcmp(pass, hostname ) == 0) || (strcmp(pass, ip.ipstr) == 0) ) { dbgtcos("tcosxmlrpc::tcos_reboot_poweroff() using xauth\n"); /* need XAUTH first */ xauth_ok=handle_xauth(user,pass); if( xauth_ok != XAUTH_OK ) return xmlrpc_build_value(env, "s", "error: xauth access denied" ); } else { dbgtcos("tcosxmlrpc::tcos_reboot_poweroff() using login\n"); /* need login first */ login_ok=validate_login(user,pass); if( strcmp(login_ok, LOGIN_OK ) != 0 ) return xmlrpc_build_value(env, "s", login_ok ); } /* prepare action */ sprintf( cmd , "down-controller %s %s", option, timeout); dbgtcos("tcosxmlrpc::tcos_reboot_poweroff() exec=\"%s\"\n", cmd); if ( (strcmp(option, "reboot") == 0) || (strcmp(option, "poweroff") == 0) ) job_exe(cmd); else return xmlrpc_build_value(env, "s", RP_UNKNOW ); return xmlrpc_build_value(env, "s", RP_OK ); } tcos-0.89.93ubuntu2/xmlrpc/vnc.h0000664000000000000000000000224312260610261013332 0ustar /* * vnc.h part of tcosxmlrpc * => common headers of vnc.c * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* xmlrpc methods of VNC server and client */ #define VNC_CONTROLLER TCOS_PATH"/vnc-controller.sh " #define VNC_ERROR "error: vnc command error" #define VNC_OK "ok" #if NEWAPI xmlrpc_value *tcos_vnc(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_vnc(xmlrpc_env *env, xmlrpc_value *in, void *ud); #endif tcos-0.89.93ubuntu2/xmlrpc/dpms.c0000664000000000000000000000461512260610261013507 0ustar /* * dpms.c part of tcosxmlrpc * => method to set dpms monitor status * Copyright (C) 2006,2007,2008 mariodebian at gmail * Copyright (C) 2006,2007,2008 vidal_joshur at gva.es * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "common.h" #include "debug.h" #include "validate.h" #include "exe.h" #include "dpms.h" #if NEWAPI xmlrpc_value *tcos_dpms(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_dpms(xmlrpc_env *env, xmlrpc_value *in, void *ud) #endif { FILE *fp; char line[BIG_BUFFER]; char *action; char *user; char *pass; char *login_ok; char cmd[BIG_BUFFER]; char *fret; UNUSED(fret); /* read what info search */ xmlrpc_parse_value(env, in, "(sss)", &action, &user, &pass); if (env->fault_occurred) return xmlrpc_build_value(env, "s", "params error"); /* need login first */ login_ok=validate_login(user,pass); if( strcmp(login_ok, LOGIN_OK ) != 0 ) return xmlrpc_build_value(env, "s", login_ok ); dbgtcos("tcosxmlrpc::tcos_dpms() login ok, action=%s \n", action); /* read action */ if( strcmp(action, "off" ) == 0 ) { sprintf( cmd , "%s dpms force off; echo $?", DPMS_CONTROLLER); } else if( strcmp(action, "on" ) == 0 ) { sprintf( cmd , "%s dpms force on; echo $?", DPMS_CONTROLLER); } else { /* show status */ sprintf( cmd , "%s q| awk '/Monitor/ {print $3}'", DPMS_CONTROLLER); } dbgtcos("tcosxmlrpc::tcos_dpms() cmd=\"%s\"\n", cmd); /* put error in line */ strncpy(line, DPMS_CMD_ERROR, BIG_BUFFER); fp=(FILE*)popen(cmd, "r"); fret=fgets( line, sizeof line, fp); remove_line_break(line); pclose(fp); dbgtcos("tcosxmlrpc::tcos_dpms() line=\"%s\"\n", line); return xmlrpc_build_value(env, "s", line ); } tcos-0.89.93ubuntu2/xmlrpc/validate-passwd.c0000664000000000000000000000325312260610261015631 0ustar /* * validate-passwd.c part of tcosxmlrpc * => validate throught /etc/passwd * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "common.h" #include "debug.h" #include "validate.h" #include #include char *get_passwd( char *username ) { struct passwd *pwd; dbgtcos("get_passwd() getting passwd from user=%s\n", username); pwd=getpwnam(username); if (pwd == NULL) { fprintf(stderr, "error get_passwd(): user not found.\n"); return ""; } else if ( strcmp(pwd->pw_passwd, "x") == 0 ) { fprintf(stderr, "info get_passwd(): shadow passwords.\n"); return pwd->pw_passwd; } else return (pwd->pw_passwd); } char *validate_passwd(char *user, char *pass) { char *cryptpass; cryptpass=get_passwd(user); #ifdef VISIBLE_PASSWD dbgtcos( "info validate_passwd(): pass=%s crypt=%s.\n", crypt (pass, PASS_ID), cryptpass); #endif if ( strcmp(crypt (pass, PASS_ID), cryptpass) == 0 ) return LOGIN_OK; return LOGIN_NOPASS; } tcos-0.89.93ubuntu2/xmlrpc/man/0000775000000000000000000000000012260610427013151 5ustar tcos-0.89.93ubuntu2/xmlrpc/man/update-tcospasswd.10000664000000000000000000000107012260610261016677 0ustar .TH update-tcospasswd 1 "Jun 21, 2006" "update-tcospasswd man page" .SH NAME update-tcospasswd \- TCOS util to generate crypt TCOS passwords files .SH SYNOPSIS .B update-tcospasswd .br .SH DESCRIPTION This manpage show options for .B update-tcospasswd script. .PP \fBupdate-tcospasswd\fP is a small shell script that create TCOS crypt password files with some questions. .SH BUGS Contact Mario Izquierdo Homepage: http://www.tcosproject.org .SH SEE ALSO tcos.conf(5) .SH AUTHOR Mario Izquierdo (mariodebian) tcos-0.89.93ubuntu2/xmlrpc/man/tcosmd5.10000664000000000000000000000104512260610261014605 0ustar .TH tcosmd5 1 "Jun 21, 2006" "tcosmd5 man page" .SH NAME tcosmd5 \- TCOS util to show md5 of a passed string .SH SYNOPSIS .B tcosmd5 .RI [ options ] .br .SH DESCRIPTION This manpage show options for .B tcosmd5 server. .PP \fBtcosmd5\fP is a small C app that create md5 of an string passed from cmdline. .SH OPTIONS .B .IP string string to show his md5 .SH BUGS Contact Mario Izquierdo Homepage: http://www.tcosproject.org .SH SEE ALSO tcos.conf(5) .SH AUTHOR Mario Izquierdo (mariodebian) tcos-0.89.93ubuntu2/xmlrpc/man/tcospasswd.10000664000000000000000000000125412260610261015423 0ustar .TH tcosmd5 1 "Jun 21, 2006" "tcosmd5 man page" .SH NAME tcospasswd \- TCOS util to generate crytp TCOS passwords .SH SYNOPSIS .B tcospasswd .RI [ options ] .br .SH DESCRIPTION This manpage show options for .B tcospasswd app. .PP \fBtcospasswd\fP is a small C app that create TCOS crypt of an string passed from cmdline. .SH OPTIONS .B .IP clear_password string to crypt (to shell scripts) .B .IP [NO_ARGUMENTS] interactive mode .SH EXAMPLES .B $ tcospasswd my_password $ tcospasswd .SH BUGS Contact Mario Izquierdo Homepage: http://www.tcosproject.org .SH SEE ALSO tcos.conf(5) .SH AUTHOR Mario Izquierdo (mariodebian) tcos-0.89.93ubuntu2/xmlrpc/man/tcosxmlrpc.10000664000000000000000000000130712260610261015426 0ustar .TH tcosxmlrpc 1 "Jun 19, 2006" "tcosxmlrpc man page" .SH NAME tcosxmlrpc \- TCOS XML-RPC server .SH SYNOPSIS .B tcosxmlrpc .RI [ options ] .br .SH DESCRIPTION This manpage show options for .B tcosxmlrpc server. .PP \fBtcosxmlrpc\fP is a small xmlrpc server that listen xmlrpc connections from TcosMonitor and allow to exec, or scan status of thin clients. .SH OPTIONS .B .IP /path/to/abyss.conf Path (relative or absolute) to a well formated abyss.conf file .B .IP TCOS_DEBUG Set TCOS_DEBUG=1 to see debug output .SH BUGS Contact Mario Izquierdo Homepage: http://www.tcosproject.org .SH SEE ALSO tcos.conf(5) .SH AUTHOR Mario Izquierdo (mariodebian) tcos-0.89.93ubuntu2/xmlrpc/validate-tcos.c0000664000000000000000000000563212260610261015303 0ustar /* * validate-tcos.c part of tcosxmlrpc * => validate throught /etc/tcospasswd * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "common.h" #include "debug.h" #include "validate.h" #define _GNU_SOURCE #include #include #include void free_tokens( char **tokens) { int i=0; for(i = 0; tokens[i] != NULL; i++) { free(tokens[i]); } free(tokens); } char *validate_tcos(char *user, char *pass) { /*struct passwd *pwd;*/ char *cryptpass; FILE *fp; char line[BSIZE]; char **tokens = NULL; int i=0; char *fret; UNUSED(fret); struct info *login=malloc(sizeof(struct info)); fp = fopen ("/etc/tcospasswd", "r" ); if (fp == NULL) { dbgtcos("error validate_tcos(): file /etc/tcospasswd not exists.\n"); return (char*) LOGIN_ERROR; } fret=fgets( line, sizeof line, fp); /*remove_line_break(line);*/ fclose(fp); strncpy(login->line, line, BSIZE); /* split using ':' */ tokens = split(login->line, ":"); for(i = 0; tokens[i] != NULL; i++){ if (i==0) { login->user=tokens[i]; dbgtcos("split_login() USER FOUND tokens[%d]='%s' user='%s'\n",i,tokens[i], login->user); } if (i == 1) { login->pass=tokens[i]; login->pass[strlen(login->pass)-1]='\0'; #ifdef VISIBLE_PASSWD dbgtcos("split_login() PASSWD FOUND tokens[%d]='%s', pass='%s'\n",i,tokens[i], login->pass); #endif } } #ifdef VISIBLE_PASSWD dbgtcos( "validate_tcos() login->user=\"%s\" login->pass=\"%s\"\n", login->user, login->pass); #endif dbgtcos( "validate_tcos() check users user=\"%s\" my_user=\"%s\"\n", user, login->user); if ( strcmp(login->user, user) != 0 ) { dbgtcos("error validate_passwd(): BAD USER.\n"); free_tokens(tokens); return LOGIN_NOUSER; } cryptpass=crypt(pass, PASS_ID ); #ifdef VISIBLE_PASSWD dbgtcos("info validate_passwd(): the_pass=%s my_pass=%s \n", login->pass, cryptpass); #endif if ( strcmp(login->pass, cryptpass) == 0 ) { dbgtcos("info validate_passwd(): LOGIN OK.\n"); free(login); free_tokens(tokens); return LOGIN_OK; } dbgtcos("info validate_passwd(): BAD PASSWORD.\n"); free(login); free_tokens(tokens); return LOGIN_NOPASS; } tcos-0.89.93ubuntu2/xmlrpc/Makefile0000664000000000000000000001316612260610261014041 0ustar SERVER=tcosxmlrpc STANDALONE=tcosxmlrpc-standalone TCOSPASSWD=tcospasswd all: message $(SERVER) $(STANDALONE) $(TCOSPASSWD) include ../common.mk TCOS_PATH:=/sbin IS_STANDALONE:=0 ifneq ($(findstring $(IS_STANDALONE),1),1) TXT = else TXT = STANDALONE endif ifndef V QUIET_CC = @echo ' $(TXT)' CC $@; QUIET_CL = @echo ' $(TXT)' CLEAN $@ `basename $(CURDIR)`; QUIET_LN = @echo ' $(TXT)' LINK $@; endif XMLRPC_INC=$(shell xmlrpc-c-config --version) XMLRPC_VERSION_MAYOR=$(shell xmlrpc-c-config --version| awk -F"." '{print $$1}') XMLRPC_VERSION_MINOR=$(shell xmlrpc-c-config --version| awk -F"." '{print $$2$$3}'| cut -c-4| awk '{print int($$1)}') CFLAGS+=-Wall -O2 $(shell xmlrpc-c-config abyss-server --cflags) #LDFLAGS+=-Wl,-z,defs -Wl,-O1 -Wl,--as-needed ## OLD gcc (lenny) don't work with -Wl,--as-needed LDFLAGS+=-Wl,-z,defs -Wl,-O1 LIBS+=$(shell xmlrpc-c-config abyss-server --libs) -lcrypt -lX11 DEFINES:= -DVERSION=\"$(VERSION)\" -DXMLRPC_VERSION_MAYOR=$(XMLRPC_VERSION_MAYOR) -DXMLRPC_VERSION_MINOR=$(XMLRPC_VERSION_MINOR) #TEST_DEFINES=-DDEBUG -DVERSION=\"$(VERSION)\" -DBSIZE=512 -DVISIBLE_PASSWD -DXMLRPC_INC=$(XMLRPC_INC) -DXMLRPC_VERSION_MAYOR=$(XMLRPC_VERSION_MAYOR) -DXMLRPC_VERSION_MINOR=$(XMLRPC_VERSION_MINOR) SRCS := common.c \ debug.c \ devices.c \ dpms.c \ exe.c \ get_screenshot.c \ info.c \ lockcontroller.c \ lockscreen.c \ login.c \ pam-usb.c \ pci.c \ reboot_poweroff.c \ rtp.c \ simple-methods.c \ sound.c \ standalone.c \ tnc.c \ validate.c \ vlc.c \ vnc.c \ xauth.c \ xorg.c \ config.c \ tcosxmlrpc.c # deleted parts # screenshot.c \ # OBJS := $(SRCS:.c=.o) message: @echo " * Building tcosxmlrpc" cleanobjs: $(QUIET_CL)rm -f $(OBJS) %.o: %.c $(QUIET_CC)$(GCC) -c ${CFLAGS} -Wno-unused-function ${DEFINES} -DTCOS_PATH=\"$(TCOS_PATH)\" $< -o $@ $(SERVER): $(OBJS) $(QUIET_LN)$(GCC) $(LDFLAGS) $(DEFINES) -o $(SERVER) $(CFLAGS) $(OBJS) $(LIBS) $(MAKE) cleanobjs $(STANDALONE): $(MAKE) $(OBJS) TCOS_PATH=$(TCOS_BINS) IS_STANDALONE=1 CFLAGS+='-DIS_STANDALONE=1' $(QUIET_LN)$(GCC) $(LDFLAGS) $(DEFINES) -o $(STANDALONE) $(CFLAGS) $(LDFLAGS) $(OBJS) $(LIBS) $(MAKE) cleanobjs $(TCOSPASSWD): $(QUIET_CC)$(GCC) $(DEFINES) $(CFLAGS) $(LDFLAGS) -o $(TCOSPASSWD) $(TCOSPASSWD).c -lcrypt test2: @echo XMLRPC_INC=$(XMLRPC_INC) @echo XMLRPC_VERSION_MAYOR=$(XMLRPC_VERSION_MAYOR) @echo XMLRPC_VERSION_MINOR=$(XMLRPC_VERSION_MINOR) clean: $(QUIET_CL)rm -f $(OBJS) $(SERVER) $(STANDALONE) $(TCOSPASSWD) var/log.txt var/log/* *~ image*.jpg image*png base64 sh/*~ install: install -d $(DESTDIR)/$(TCOS_BINS) install -d $(DESTDIR)/$(TCOS_DIR)/xmlrpc/ install -d $(DESTDIR)/$(PREFIX)/sbin install -m 755 $(SERVER) $(DESTDIR)/$(TCOS_BINS)/ install -m 755 $(STANDALONE) $(DESTDIR)/$(TCOS_BINS)/ install -m 755 $(TCOSPASSWD) $(DESTDIR)/$(PREFIX)/sbin/$(TCOSPASSWD) install -m 755 sh/update-tcospasswd.sh $(DESTDIR)/$(PREFIX)/sbin/update-tcospasswd # Install tcosxmlrpc utils install -m 755 sh/screenshot.sh $(DESTDIR)/$(TCOS_BINS)/ install -m 755 sh/soundctl.sh $(DESTDIR)/$(TCOS_BINS)/ install -m 755 sh/configctl.sh $(DESTDIR)/$(TCOS_BINS)/ install -m 755 sh/getinfo.sh $(DESTDIR)/$(TCOS_BINS)/ install -m 755 sh/useallmodules.sh $(DESTDIR)/$(TCOS_BINS)/ install -m 755 sh/devicesctl.sh $(DESTDIR)/$(TCOS_BINS)/ install -m 755 sh/tcos-dbus.py $(DESTDIR)/$(TCOS_BINS)/tcos-dbus-helper install -m 755 sh/vnc-controller.sh $(DESTDIR)/$(TCOS_BINS)/ install -m 755 sh/vlc-controller.sh $(DESTDIR)/$(TCOS_BINS)/ install -m 755 sh/rtp-controller.sh $(DESTDIR)/$(TCOS_BINS)/ #install -m 755 sh/clone-controller.sh $(DESTDIR)/$(TCOS_BINS)/ #install -m 755 sh/clonerecv $(DESTDIR)/$(TCOS_BINS)/ #install -m 755 sh/clonesend $(DESTDIR)/$(TCOS_BINS)/ install -m 755 sh/tcos-last $(DESTDIR)/$(TCOS_BINS)/ install -m 755 sh/tcos-ftpclient $(DESTDIR)/$(TCOS_BINS)/ install -m 755 sh/pactl-controller.sh $(DESTDIR)/$(TCOS_BINS)/ install -m 755 sh/tcos-pam-usb.sh $(DESTDIR)/$(TCOS_BINS)/ install -m 644 var/etc/mime.types $(DESTDIR)/$(TCOS_DIR)/xmlrpc/ install -m 644 var/etc/abyss.conf $(DESTDIR)/$(TCOS_DIR)/xmlrpc/ sed -i 's|__TCOS_ROOT__|/|g' $(DESTDIR)/$(TCOS_DIR)/xmlrpc/abyss.conf sed -i 's|__TCOS_WWW__|/var/www|g' $(DESTDIR)/$(TCOS_DIR)/xmlrpc/abyss.conf sed -i 's|__TCOS_LOG__|/var/log|g' $(DESTDIR)/$(TCOS_DIR)/xmlrpc/abyss.conf sed -i 's|__TCOS_ETC__|/etc|g' $(DESTDIR)/$(TCOS_DIR)/xmlrpc/abyss.conf # standalone package install -d $(DESTDIR)/$(TCOS_STANDALONE_DIR) install -d $(DESTDIR)/$(TCOS_STANDALONE_DIR)/etc install -d $(DESTDIR)/$(TCOS_STANDALONE_DIR)/www install -d $(DESTDIR)/$(TCOS_STANDALONE_DIR)/log install -m 644 var/etc/abyss.conf $(DESTDIR)/$(TCOS_STANDALONE_DIR)/etc/abyss-standalone.conf sed -i 's|__TCOS_ROOT__|$(TCOS_STANDALONE_DIR)|g' $(DESTDIR)/$(TCOS_STANDALONE_DIR)/etc/abyss-standalone.conf sed -i 's|__TCOS_WWW__|$(TCOS_STANDALONE_DIR)/www|g' $(DESTDIR)/$(TCOS_STANDALONE_DIR)/etc/abyss-standalone.conf sed -i 's|__TCOS_LOG__|$(TCOS_STANDALONE_DIR)/log|g' $(DESTDIR)/$(TCOS_STANDALONE_DIR)/etc/abyss-standalone.conf sed -i 's|__TCOS_ETC__|$(TCOS_STANDALONE_DIR)/etc|g' $(DESTDIR)/$(TCOS_STANDALONE_DIR)/etc/abyss-standalone.conf install -m 644 var/etc/mime.types $(DESTDIR)/$(TCOS_STANDALONE_DIR)/etc/ # stunnel4 install -d $(DESTDIR)/$(TCOS_STANDALONE_DIR)/etc/stunnel install -d $(DESTDIR)/$(TCOS_STANDALONE_DIR)/lib/stunnel4/ install -m 644 var/etc/stunnel/stunnel.conf $(DESTDIR)/$(TCOS_STANDALONE_DIR)/etc/stunnel install -m 644 var/etc/stunnel/stunnel-custom.conf $(DESTDIR)/$(TCOS_STANDALONE_DIR)/etc/stunnel tcos-0.89.93ubuntu2/xmlrpc/lockcontroller.c0000664000000000000000000000551612260610261015601 0ustar /* * lock-controller.c part of tcosxmlrpc * => method that lock unlock and get status of screen * Copyright (C) 2008 vidal_joshur at gva.es * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "common.h" #include "debug.h" #include "validate.h" #include "exe.h" void lockcontroller_exe( char *action ) { char cmd[BIG_BUFFER]; dbgtcos("tcosxmlrpc::lockcontroller_exe() action=> \"%s\"\n", action); if ( strcmp(TCOS_PATH, "/sbin" ) ) sprintf( cmd , "%s/%s", TCOS_PATH, action ); else sprintf( cmd , "%s", action ); job_exe(cmd); return; } void lockcontroller_kill( char *action ) { dbgtcos("tcosxmlrpc::lockcontroller_kill() action=> \"%s\"\n", action); kill_exe(action); return; } #if NEWAPI xmlrpc_value *tcos_lockcontroller(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_lockcontroller(xmlrpc_env *env, xmlrpc_value *in, void *ud) #endif { char *user; char *pass; char *action; char *login_ok; char cmd[BIG_BUFFER]; /* Parse app string */ xmlrpc_parse_value(env, in, "(sss)", &action, &user, &pass); if (env->fault_occurred) return xmlrpc_build_value(env, "s", "params error"); /* need login first */ login_ok=validate_login(user,pass); if( strcmp(login_ok, LOGIN_OK ) != 0 ) return xmlrpc_build_value(env, "s", login_ok ); if ( strcmp(TCOS_PATH, "/sbin" ) ) sprintf( cmd , "%s/%s", TCOS_PATH, action ); else sprintf( cmd , "%s", action ); job_exe(cmd); return xmlrpc_build_value(env, "s", "OK" ); } #if NEWAPI xmlrpc_value *tcos_unlockcontroller(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_unlockcontroller(xmlrpc_env *env, xmlrpc_value *in, void *ud) #endif { char *user; char *pass; char *action; char *login_ok; /* Parse app string */ xmlrpc_parse_value(env, in, "(sss)", &action, &user, &pass); if (env->fault_occurred) return xmlrpc_build_value(env, "s", "params error"); /* need login first */ login_ok=validate_login(user,pass); if( strcmp(login_ok, LOGIN_OK ) != 0 ) return xmlrpc_build_value(env, "s", login_ok ); kill_exe(action); return xmlrpc_build_value(env, "s", "OK" ); } tcos-0.89.93ubuntu2/xmlrpc/xorg.h0000664000000000000000000000330512260610261013523 0ustar /* * xorg.h part of tcosxmlrpc * => common headers of xorg.c * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #define XORGCFG TCOS_PATH"/configurexorg" #define XORG_CONF "/etc/X11/xorg.conf" #define XORG_NEW_CONF XORGCFG" --newsettings --outputfile="XORG_CONF #define XORG_CHANGE_CONF XORGCFG" --changesettings --outputfile="XORG_CONF" " #define XORG_GET_CONF XORGCFG" --getsettings " #define XORG_REBUILD_CONF XORGCFG" --newsettings --downloadagain --restartxorg --outputfile="XORG_CONF" " /* FIXME */ #define XORG_MONITOR_NAME "grep \"Monitor name\" /var/log/Xorg.0.log | awk -F \": \" '{print $3}'" /* messages */ #define XORG_OK "ok" #define XORG_ERROR "error: Command return error" #define XORG_UNKNOW_OPTION "error: Unknow option for "XORGCFG #define XORG_READING_ERROR "error: Error reading pipe" #if NEWAPI xmlrpc_value *tcos_xorg(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_xorg(xmlrpc_env *env, xmlrpc_value *in, void *ud); #endif tcos-0.89.93ubuntu2/xmlrpc/pam-usb.h0000664000000000000000000000245512260610261014115 0ustar /* * pam-usb.h part of tcosxmlrpc * => common headers of pam-usb.c * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #define PAM_USB_WRAPPER TCOS_PATH"/tcos-pam-usb.sh " #define PAM_USB_OK "ok" #define PAM_USB_ERROR "error: device action error." #define PAM_USB_READING_ERROR "error: reading devices settings." #define PAM_USB_UNKNOW_ERROR "error: unknow option passed." #define PAM_USB_EMPTY "" #if NEWAPI xmlrpc_value *tcos_pam_usb(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_pam_usb(xmlrpc_env *env, xmlrpc_value *in, void *ud); #endif tcos-0.89.93ubuntu2/xmlrpc/xauth.c0000664000000000000000000000733112260610261013673 0ustar /* * xauth.c part of tcosxmlrpc * => validate with Xorg MIT MAGIC COOKIE * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "common.h" #include "debug.h" #include "validate.h" #include "xauth.h" #include #include int handle_xauth( char *cookie , char *servername) { char host[BSIZE]; char displayname[BSIZE]; Display* displ; int found = 0; char cmd[BSIZE]; struct ip_address ip; char xauth_file[]="/tmp/.tmpxauthXXXXXX"; int fd; FILE *fp; dbgtcos("tcosxmlrpc::handle_auth() cookie=%s server=%s\n" ,cookie, servername); /* read my hostname */ gethostname(host, BSIZE); /*dbgtcos("tcosxmlrpc::handle_xauth() gethostname=%s\n", host);*/ /* check if servername is an IP address (see common.h for struct) */ ip=check_ip_address(servername); /* compare with cookie hostname */ if (ip.is_ip == 0) { if ( strcmp (servername, host) != 0 ) { dbgtcos("tcosxmlrpc::handle_xauth() ERROR servername != hostname\n"); return(XAUTH_BAD_HOSTNAME); } dbgtcos("tcosxmlrpc::handle_xauth() not ip using hostname\n"); } else { dbgtcos("tcosxmlrpc::handle_xauth() ip True\n"); snprintf(host, BSIZE, "%s", ip.ipstr); } fd = mkstemp(xauth_file); if (fd < 0) { unlink(xauth_file); close(fd); return(XAUTH_BAD_FDTEMP); } /*dbgtcos("tcosxmlrpc::handle_xauth() xauth_file=%s\n", xauth_file);*/ snprintf ( (char*) cmd, BSIZE, "xauth -q -f %s add %s:0 MIT-MAGIC-COOKIE-1 %s >/dev/null 2>&1", xauth_file, host, cookie); dbgtcos("tcosxmlrpc::handle_xauth() cmd=\"%s\"\n", cmd); /*unlink(xauth_file);*/ fp=(FILE*)popen(cmd, "r"); pclose(fp); setenv("XAUTHORITY", xauth_file, 1); /* for XOpenDisplay */ /*dbgtcos("tcosxmlrpc::handle_xauth() XAUTHORITY=%s \n", getenv("XAUTHORITY"));*/ snprintf(displayname, BSIZE, "%s:0", host); /* displayify it */ displ = XOpenDisplay(displayname); if (displ) { found++; XCloseDisplay(displ); /* close display */ } unlink(xauth_file); /* delete XAUTHORITY temp file */ close(fd); unsetenv("XAUTHORITY"); /* unset environment XAUTH */ if (!found) { dbgtcos("error openning DISPLAY to server %s\n", displayname); return(XAUTH_ERROR); } /*dbgtcos("tcosxmlrpc::handle_xauth() connect to %s AUTH ok.\n", displayname);*/ return(XAUTH_OK); } #if NEWAPI xmlrpc_value *tcos_xauth(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_xauth(xmlrpc_env *env, xmlrpc_value *in, void *ud) #endif { char *cookie; char *hostname; int xauth_ok; /* read what option and cmdline params need */ xmlrpc_parse_value(env, in, "(ss)", &cookie, &hostname); if (env->fault_occurred) return xmlrpc_build_value(env, "s", "params error"); /* need login first */ xauth_ok=handle_xauth(cookie,hostname); if( xauth_ok != XAUTH_OK ) return xmlrpc_build_value(env, "s", "xauth: error access denied" ); return xmlrpc_build_value(env, "s", "xauth: access OK" ); } tcos-0.89.93ubuntu2/xmlrpc/lockcontroller.h0000664000000000000000000000252512260610261015603 0ustar /* * lockcontroller.h part of tcosxmlrpc * => common headers of lockcontroller.c * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ void lockcontroller_exe( char *action ); void lockcontroller_kill( char *action ); #if NEWAPI xmlrpc_value *tcos_lockcontroller(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_lockcontroller(xmlrpc_env *env, xmlrpc_value *in, void *ud); #endif #if NEWAPI xmlrpc_value *tcos_unlockcontroller(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_unlockcontroller(xmlrpc_env *env, xmlrpc_value *in, void *ud); #endif tcos-0.89.93ubuntu2/xmlrpc/validate-shadow.c0000664000000000000000000000702712260610261015620 0ustar /* * validate-shadow.c part of tcosxmlrpc * => Validate a username/pw combination, using the /etc/shadow file * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "common.h" #include "debug.h" #include "validate.h" #include #include char *validate_shadow(char *user, char *pw) { FILE* fptemp; struct spwd *ret = NULL; char *cryptpw; long int secs, days; #ifdef VISIBLE_PASSWD dbgtcos( "info validate_shadow(): user=%s pass=%s\n", user, pw); #else dbgtcos( "info validate_shadow(): user=%s pass=**NOT-SHOW**\n", user); #endif ret = getspnam(user); if (!ret) { /* Did the user not exist? Or can we not read /etc/shadow? * Print a helpful message if the latter... */ fptemp = fopen("/etc/shadow","r"); if (!fptemp) { fprintf(stderr, "error validate_sadow(): No read access to /etc/shadow. no running as root?.\n"); return( (char*) LOGIN_NOPERMS); } fclose(fptemp); fprintf(stderr,"error validate_shadow(): Couldn't find user '%s'\n",user); if ( (SLEEP_SECONDS>0) && (sleep(SLEEP_SECONDS)!=0)) fprintf(stderr,"error validate_shadow(): Error sleeping for %d seconds.\n", SLEEP_SECONDS); return( (char*) LOGIN_NOUSER); } cryptpw = (char*) crypt(pw,ret->sp_pwdp); if (strcmp(cryptpw,ret->sp_pwdp)!=0){ if ( (SLEEP_SECONDS>0) && (sleep(SLEEP_SECONDS)!=0)) fprintf(stderr,"error validate_shadow(): Error sleeping for %d seconds.\n", SLEEP_SECONDS); fprintf(stderr,"error validate_shadow(): User %s: authentication failure\n",user); return((char*) LOGIN_NOPASS); } /* * Check password expiration information. See shadow(5) */ secs = (long int) time(NULL); days = secs / (24L * 60L * 60L); /* * An account is considered to be inactive and is disabled if the * password is not changed within the specified number of days after the * password expires. */ if ( ret->sp_max > 0 && ret->sp_inact > 0 && days > ret->sp_lstchg + ret->sp_max + ret->sp_inact) { if ( (SLEEP_SECONDS>0) && (sleep(SLEEP_SECONDS)!=0)) fprintf(stderr,"error validate_shadow(): Error sleeping for %d seconds.\n", SLEEP_SECONDS); fprintf(stderr,"error validate_shadow(): User %s: account inactivity period expired\n",user); return((char*) LOGIN_EXPIRED); } /* * An account will also be disabled on the specified day regardless of * other password expiration information. */ if (ret->sp_expire > 0 && days > ret->sp_expire) { if ( (SLEEP_SECONDS>0) && (sleep(SLEEP_SECONDS)!=0)) fprintf(stderr,"error validate_shadow(): Error sleeping for %d seconds.\n", SLEEP_SECONDS); fprintf(stderr,"error validate_shadow(): User %s: account expired\n",user); return((char*) LOGIN_EXPIRED); } dbgtcos("info validate_shadow(): login correct\n"); return((char*) LOGIN_OK); } tcos-0.89.93ubuntu2/xmlrpc/lockscreen.h0000664000000000000000000000235212260610261014675 0ustar /* * lockscreen.h part of tcosxmlrpc * => common headers of lockscreen.c * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #if NEWAPI xmlrpc_value *tcos_lockscreen(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_lockscreen(xmlrpc_env *env, xmlrpc_value *in, void *ud); #endif #if NEWAPI xmlrpc_value *tcos_unlockscreen(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_unlockscreen(xmlrpc_env *env, xmlrpc_value *in, void *ud); #endif tcos-0.89.93ubuntu2/xmlrpc/get_screenshot.c0000664000000000000000000000445312260610261015560 0ustar /* * screenshot.c part of tcosxmlrpc * => method exec scrot to make an screenshot * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "common.h" #include "debug.h" #include "validate.h" #include "screenshot.h" #if NEWAPI xmlrpc_value *tcos_get_screenshot(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_get_screenshot(xmlrpc_env *env, xmlrpc_value *in, void *ud) #endif { FILE *fp; char line[BIG_BUFFER]; char *size; char *user; char *pass; char *login_ok; size_t len, elen; unsigned char *buf, *e; static xmlrpc_value *result; /* read what info search */ xmlrpc_parse_value(env, in, "(sss)", &size, &user, &pass); if (env->fault_occurred) return xmlrpc_build_value(env, "(ss)", "error: params error", SCROT_EMPTY); /* need login first */ login_ok=validate_login(user,pass); if( strcmp(login_ok, LOGIN_OK ) != 0 ) return xmlrpc_build_value(env, "(ss)", login_ok, SCROT_EMPTY ); if ( strlen(size) > 0) snprintf( (char*) line, BSIZE, "%s %s", SCROT_CMD, size); else snprintf( (char*) line, BSIZE, "%s", SCROT_CMD); dbgtcos("tcosxmlrpc::getscreenshot() exe=%s\n", line); /* exe screenshot */ fp=(FILE*)popen(line, "r"); fclose(fp); /* convert base64 string */ dbgtcos("tcosxmlrpc::getscreenshot() reading file=%s\n", SCREENSHOT_FILE); buf = readfile(SCREENSHOT_FILE, &len); if (buf == NULL) return xmlrpc_build_value(env, "(ss)", SCROT_ERROR, SCROT_EMPTY ); e = base64_encode(buf, len, &elen); result = xmlrpc_build_value(env, "(ss)", SCROT_OK, e ); free(e); return result; } tcos-0.89.93ubuntu2/xmlrpc/lockscreen.c0000664000000000000000000000443012260610261014667 0ustar /* * lockscreen.c part of tcosxmlrpc * => method that lock unlock and get status of screen * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "common.h" #include "debug.h" #include "validate.h" #include "exe.h" #if NEWAPI xmlrpc_value *tcos_lockscreen(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_lockscreen(xmlrpc_env *env, xmlrpc_value *in, void *ud) #endif { char *user; char *pass; char *login_ok; /* Parse app string */ xmlrpc_parse_value(env, in, "(ss)", &user, &pass); if (env->fault_occurred) return xmlrpc_build_value(env, "s", "params error"); /* need login first */ login_ok=validate_login(user,pass); if( strcmp(login_ok, LOGIN_OK ) != 0 ) return xmlrpc_build_value(env, "s", login_ok ); if ( strcmp(TCOS_PATH, "/sbin" ) ) job_exe(TCOS_PATH"/lockscreen"); else job_exe("lockscreen"); return xmlrpc_build_value(env, "s", "OK" ); } #if NEWAPI xmlrpc_value *tcos_unlockscreen(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_unlockscreen(xmlrpc_env *env, xmlrpc_value *in, void *ud) #endif { char *user; char *pass; char *login_ok; /* Parse app string */ xmlrpc_parse_value(env, in, "(ss)", &user, &pass); if (env->fault_occurred) return xmlrpc_build_value(env, "s", "params error"); /* need login first */ login_ok=validate_login(user,pass); if( strcmp(login_ok, LOGIN_OK ) != 0 ) return xmlrpc_build_value(env, "s", login_ok ); kill_exe("lockscreen"); return xmlrpc_build_value(env, "s", "OK" ); } tcos-0.89.93ubuntu2/xmlrpc/sound.h0000664000000000000000000000316212260610261013675 0ustar /* * sound.h part of tcosxmlrpc * => common headers of sound.c * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #define SOUND_WRAPPER TCOS_PATH"/soundctl.sh " #define SOUND_GET_CONTROLS SOUND_WRAPPER " --showcontrols" #define SOUND_GET_LEVEL SOUND_WRAPPER " --getlevel " #define SOUND_SET_LEVEL SOUND_WRAPPER " --setlevel " #define SOUND_GET_MUTE SOUND_WRAPPER " --getmute " #define SOUND_SET_MUTE SOUND_WRAPPER " --setmute " #define SOUND_SET_UNMUTE SOUND_WRAPPER " --setunmute " #define SOUND_OK "ok: sound action done." #define SOUND_ERROR "error: sound action error." #define SOUND_READING_ERROR "error: reading sound settings." #define SOUND_UNKNOW_ERROR "error: unknow option passed." #if NEWAPI xmlrpc_value *tcos_sound(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_sound(xmlrpc_env *env, xmlrpc_value *in, void *ud); #endif tcos-0.89.93ubuntu2/xmlrpc/info.h0000664000000000000000000000615212260610261013502 0ustar /* * info.h part of tcosxmlrpc * => common headers of info.c * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* xmlrpc methods to export thin client info */ /* type of thin client (tcos, pxes, ltsp, unknow) */ #define GET_CLIENT TCOS_PATH"/getinfo.sh -t" #define GET_PROCESS TCOS_PATH"/getinfo.sh -p" /* CPU methods */ #define CPU_MODEL TCOS_PATH"/getinfo.sh -i CPU_MODEL" #define CPU_SPEED TCOS_PATH"/getinfo.sh -i CPU_SPEED" #define CPU_VENDOR TCOS_PATH"/getinfo.sh -i CPU_VENDOR" /* RAM methods */ #define RAM_TOTAL TCOS_PATH"/getinfo.sh -i RAM_TOTAL" #define RAM_ACTIVE TCOS_PATH"/getinfo.sh -i RAM_ACTIVE" #define RAM_FREE TCOS_PATH"/getinfo.sh -i RAM_FREE" #define RAM_USED TCOS_PATH"/getinfo.sh -i RAM_USED" /* SWAP methods*/ #define SWAP_AVALAIBLE TCOS_PATH"/getinfo.sh -i SWAP_AVALAIBLE" #define SWAP_TOTAL TCOS_PATH"/getinfo.sh -i SWAP_TOTAL" #define SWAP_USED TCOS_PATH"/getinfo.sh -i SWAP_USED" #define SWAP_FREE TCOS_PATH"/getinfo.sh -i SWAP_FREE" /* DATE and version methods */ #define TCOS_DATE TCOS_PATH"/getinfo.sh -i TCOS_DATE" #define TCOS_GENERATION_DATE TCOS_PATH"/getinfo.sh -i TCOS_GENERATION_DATE" #define TCOS_VERSION TCOS_PATH"/getinfo.sh -i TCOS_VERSION" #define TCOS_UPTIME TCOS_PATH"/getinfo.sh -i TCOS_UPTIME" /* KERNEL methods*/ #define KERNEL_VERSION TCOS_PATH"/getinfo.sh -i KERNEL_VERSION" #define KERNEL_COMPLETE_VERSION TCOS_PATH"/getinfo.sh -i KERNEL_COMPLETE_VERSION" /* NETWORK methods */ #define NETWORK_HOSTNAME TCOS_PATH"/getinfo.sh -i NETWORK_HOSTNAME" #define NETWORK_IP TCOS_PATH"/getinfo.sh -i NETWORK_IP" #define NETWORK_MAC TCOS_PATH"/getinfo.sh -i NETWORK_MAC" #define NETWORK_MASK TCOS_PATH"/getinfo.sh -i NETWORK_MASK" #define NETWORK_RX TCOS_PATH"/getinfo.sh -i NETWORK_RX" #define NETWORK_TX TCOS_PATH"/getinfo.sh -i NETWORK_TX" /* MODULES methods */ #define MODULES_LOADED TCOS_PATH"/getinfo.sh -i MODULES_LOADED" #define MODULES_NOTFOUND TCOS_PATH"/getinfo.sh -i MODULES_NOTFOUND" /* get screensize */ #define SCREENSIZE TCOS_PATH"/getinfo.sh -i SCREENSIZE" #define BIG_BUFFER 5000 /* messages */ #define INFO_UNKNOW "error: Unknow info request" #define INFO_ERROR "error: info command failure" #if NEWAPI xmlrpc_value *tcos_info(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_info(xmlrpc_env *env, xmlrpc_value *in, void *ud); #endif tcos-0.89.93ubuntu2/xmlrpc/common.h0000664000000000000000000000401112260610261014027 0ustar /* * common.h part of tcosxmlrpc * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __COMMON_H__ #define __COMMON_H__ #define IP_LENGHT 1024 #ifndef BSIZE #define BSIZE 500 #endif #define BUFF_SIZE 1000 #define BIG_BUFFER 5000 #define MY_IP_ADDRESS TCOS_PATH"/getinfo.sh -i NETWORK_IP" #define FILE_CONTENT_ERROR_MEM "error: unable to malloc memory" #define FILE_CONTENT_ERROR_FILE "error: file not found" /* for split function */ #define MAXTOKENS 256 #define UNUSED(x) ((void)(x)) typedef struct ip_address { int data[4] ; int is_ip; char ipstr[IP_LENGHT]; } ip ; /* common.c */ void remove_line_break( char *s ); #include unsigned char *readfile( const char *name, size_t *len ); unsigned char * base64_encode( const unsigned char *src, size_t len, size_t *out_len ); unsigned char * base64_decode(const unsigned char *src, size_t len, size_t *out_len); struct ip_address check_ip_address(char *data); char **split(char *string, char *delim); int check_for_file(char *fname); #include #include #define OLD_VERSION_MAYOR 0 #define OLD_VERSION_MINOR 920 #if XMLRPC_VERSION_MAYOR > OLD_VERSION_MAYOR || ( (XMLRPC_VERSION_MAYOR == OLD_VERSION_MAYOR) && (XMLRPC_VERSION_MINOR > OLD_VERSION_MINOR) ) #define NEWAPI 1 #include #endif #endif tcos-0.89.93ubuntu2/xmlrpc/validate.c0000664000000000000000000000404712260610261014334 0ustar /* * validate.c part of tcosxmlrpc * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* * validate.c * * Validate a username/pw combination, using the /etc/shadow * file. * * Two lines are read from stdin. The first is the user, and * the second is the (unencrypted) password. * * We exit with 0 if they match, 1 otherwise. * Errors are written to either stderr or the error log, or both. */ #include "common.h" #include "debug.h" #include "validate.h" #include #include "validate-passwd.c" #include "validate-shadow.c" #include "validate-tcos.c" char *validate_login(char *user, char*pw) { /* check for files in order */ if ( check_for_file("/etc/tcospasswd") == 1 ) { dbgtcos("info validate_login(): /etc/tcospasswd exists.\n"); return validate_tcos(user, pw); } #ifndef IS_STANDALONE /* only use /etc/shadow or /etc/passwd in thin clients environments */ else if ( check_for_file("/etc/shadow") == 1 ) { dbgtcos("info validate_login(): /etc/shadow exists.\n"); return validate_shadow(user, pw); } else if ( check_for_file("/etc/passwd") == 1 ) { dbgtcos("info validate_login(): /etc/passwd exists.\n"); return validate_passwd(user, pw); } #endif else { dbgtcos("error validate_login(): no files found.\n"); return (char*) LOGIN_ERROR; } return (char*) LOGIN_ERROR; } tcos-0.89.93ubuntu2/xmlrpc/screenshot.h0000664000000000000000000000306612260610261014725 0ustar /* * screenshot.h part of tcosxmlrpc * => common headers of screenshot.c * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* xmlrpc methods to screenshot thin client display */ #define SCROT_CMD TCOS_PATH"/screenshot.sh" #ifdef IS_STANDALONE #define SCREENSHOT_FILE "/var/lib/tcos/standalone/www/capture-thumb.jpg" #else #define SCREENSHOT_FILE "/var/www/capture-thumb.jpg" #endif #define SCROT_ERROR "error: screenshot command error" #define SCROT_ERROR_FILE "error: screenshot file not found" #define SCROT_ERROR_MEM "error: screenshot memory error" #define SCROT_ERROR_BUF "error: screenshot buffer error" #define SCROT_OK "ok" #define SCROT_EMPTY "" #if NEWAPI xmlrpc_value *tcos_screenshot(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_screenshot(xmlrpc_env *env, xmlrpc_value *in, void *ud); #endif tcos-0.89.93ubuntu2/xmlrpc/get_screenshot.h0000664000000000000000000000205012260610261015554 0ustar /* * get_screenshot.h part of tcosxmlrpc * => common headers of get_screenshot.c * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #if NEWAPI xmlrpc_value *tcos_get_screenshot(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_get_screenshot(xmlrpc_env *env, xmlrpc_value *in, void *ud); #endif tcos-0.89.93ubuntu2/xmlrpc/exe.c0000664000000000000000000000551212260610261013322 0ustar /* * exe.c part of tcosxmlrpc * => method that exec an app * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "common.h" #include "debug.h" #include "validate.h" #include "exe.h" void job_exe( char *cmd ) { FILE *fp; char job[BUFF_SIZE]; dbgtcos("tcosxmlrpc::job_exe() exec=> \"%s\"\n", cmd); snprintf( (char*) &job, BUFF_SIZE, "%s %s", CMD_WRAPPER, cmd ); fp=(FILE*)popen(job, "r"); pclose(fp); dbgtcos("tcosxmlrpc::job_exe() EXEC cmd=\"%s\"\n", job); return; } void kill_exe( char *cmd ) { FILE *fp; char job[BUFF_SIZE]; snprintf( (char*) &job, BUFF_SIZE, "killall %s", cmd ); dbgtcos("tcosxmlrpc::kill_exe() exec=> \"%s\"\n", job); fp=(FILE*)popen(job, "r"); pclose(fp); } #if NEWAPI xmlrpc_value *tcos_exe(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_exe(xmlrpc_env *env, xmlrpc_value *in, void *ud) #endif { char *s; char *user; char *pass; char *login_ok; dbgtcos("tcosxmlrpc::tcos_exe() Init \n"); xmlrpc_parse_value(env, in, "(sss)", &s, &user, &pass); if (env->fault_occurred) return xmlrpc_build_value(env, "s", "error: params error"); /* need login first */ login_ok=validate_login(user,pass); if( strcmp(login_ok, LOGIN_OK ) != 0 ) return xmlrpc_build_value(env, "s", login_ok ); dbgtcos("tcosxmlrpc::tcos_exe s=\"%s\" \n", s); job_exe(s); return xmlrpc_build_value(env, "s", s); } #if NEWAPI xmlrpc_value *tcos_kill(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_kill(xmlrpc_env *env, xmlrpc_value *in, void *ud) #endif { char *s; char *user; char *pass; char *login_ok; dbgtcos("tcosxmlrpc::tcos_kill() Init \n"); xmlrpc_parse_value(env, in, "(sss)", &s, &user, &pass); if (env->fault_occurred) return xmlrpc_build_value(env, "s", "error: params error");; /* need login first */ login_ok=validate_login(user,pass); if( strcmp(login_ok, LOGIN_OK ) != 0 ) return xmlrpc_build_value(env, "s", login_ok ); dbgtcos("tcosxmlrpc::tcos_kill s=\"%s\" \n", s); kill_exe(s); return xmlrpc_build_value(env, "s", s); } tcos-0.89.93ubuntu2/xmlrpc/test/0000775000000000000000000000000012260610427013355 5ustar tcos-0.89.93ubuntu2/xmlrpc/test/client.py0000664000000000000000000000653312260610261015210 0ustar #!/usr/bin/env python # Copyright (C) 2006,2007,2008 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # import xmlrpclib from time import time, sleep import sys import threading import base64 import popen2 import urllib2 # Create an object to represent our server. #server_url = 'http://192.168.0.10:8998/RPC2'; #server_url = 'http://192.168.0.11:8998/RPC2'; #server_url = 'http://192.168.0.6:8998/RPC2'; #server_url = 'http://localhost:8998/RPC2'; server_url = 'http://192.168.0.21:8998/RPC2'; server = xmlrpclib.ServerProxy(server_url, verbose=0); result = server.tcos.version("") print "PYTHON::version is=%s" %(result) #result = server.tcos.info("get_client") #print "PYTHON::get_client is=%s" %(result) #result = server.tcos.standalone("get_server") #print "PYTHON::get_server is=%s" %(result) #result = server.tcos.info("get_user") #print "PYTHON::get_user is=%s" %(result) #result = server.tcos.standalone("get_process") #print "PYTHON::get_process is=%s" %(result) #result = server.tcos.dbus("--auth='root:root' --type='exec' --text='xterm' --username='mario'", "root", "root") #print "PYTHON::dbus is=%s" %(result) #result=server.tcos.exe("uname", "root", "root") #print "PYTHON::exe uname is=%s" %(result) #print "PYTHON devicesctl.sh =%s" %(server.tcos.sound("soundctl.sh --showcontrols", "root", "root")) #print server.tcos.screenshot("10", "root", "root") def get_url(): start=time() result=server.tcos.screenshot("65", "root", "root") #print "\nPYTHON::exe screenshot is=%s" %(result) # download with urllib2 mem = urllib2.urlopen("http://192.168.0.21:8081/capture-thumb.jpg").read() f=open("image-urllib.jpg", "w") f.write(mem) f.close() #print "Take screenshot using screenshot() and urllib2 %f secs"%(time() - start) return "%.4f" %(time() - start) def get_base64(): start=time() result=server.tcos.getscreenshot("65", "root", "root") #print "PYTHON::exe getscreenshot is=%s" %(result[0]) f=open("image-base64.jpg", "w") f.write(base64.decodestring(result[1])) f.close() #print "Take screenshot using base64 and getscreenshot() %f secs"%(time() - start) return "%.4f" %(time() - start) itime1=[] itime2=[] if len(sys.argv) > 1: iters=int(sys.argv[1]) else: iters=20 print "Taking %d screenshots...."%iters for i in range(iters): if i % 2 == 0: itime1.append (get_url()) else: itime2.append (get_base64()) print "using urllib ", itime1 print "using base64 ", itime2 print "Comparing..." better1=0 better2=0 for i in range(iters/2): if float(itime1[i]) < float(itime2[i]): better1+=1 else: better2+=1 print "better with urllib2 %d"%better1 print "better with base64 %d"%better2 #p = popen2.Popen3("display image.jpg") sys.exit(0) tcos-0.89.93ubuntu2/xmlrpc/reboot_poweroff.h0000664000000000000000000000231412260610261015744 0ustar /* * reboot_poweroff.h part of tcosxmlrpc * => common headers of reboot_poweroff.c * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #define RP_OK "ok: reboot_poweroff action done." #define RP_ERROR "error: reboot_poweroff action error." #define RP_UNKNOW "error: unknow option passed." #if NEWAPI xmlrpc_value *tcos_reboot_poweroff(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_reboot_poweroff(xmlrpc_env *env, xmlrpc_value *in, void *ud); #endif tcos-0.89.93ubuntu2/xmlrpc/rtp.h0000664000000000000000000000222312260610261013347 0ustar /* * rtp.h part of tcosxmlrpc * => common headers of rtp.c * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* xmlrpc methods of rtp */ #define RTP_CONTROLLER TCOS_PATH"/rtp-controller.sh " #define RTP_ERROR "error: rtp command error" #define RTP_OK "ok" #if NEWAPI xmlrpc_value *tcos_rtp(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_rtp(xmlrpc_env *env, xmlrpc_value *in, void *ud); #endif tcos-0.89.93ubuntu2/xmlrpc/login.h0000664000000000000000000000302312260610261013651 0ustar /* * login.h part of tcosxmlrpc * => common headers of login.c * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #define NO_ALLOWED "error: access denied" #define LOGIN_OK_MSG "ok" #define LOGIN_NOUSER_MSG "error: User not allowed" #define LOGIN_NOPASS_MSG "error: Password not valid" #define LOGIN_NOPERMS_MSG "error: cant read shadow" #define LOGIN_EXPIRED_MSG "error: user expired" #define LOGIN_ERROR "error: unknow error" #if NEWAPI xmlrpc_value *tcos_login(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_login(xmlrpc_env *env, xmlrpc_value *in, void *ud); #endif #if NEWAPI xmlrpc_value *tcos_logout(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_logout(xmlrpc_env *env, xmlrpc_value *in, void *ud); #endif tcos-0.89.93ubuntu2/xmlrpc/tnc.h0000664000000000000000000000230212260610261013324 0ustar /* * tnc.h part of tcosxmlrpc * => common headers of tnc.c * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* xmlrpc methods of rtp */ #define TNC_CONTROLLER TCOS_PATH"/tnc " #define NETWORK_IFACE TCOS_PATH"/getinfo.sh -i NETWORK_IFACE" #define TNC_ERROR "error: tnc command error" #define TNC_OK "ok" #if NEWAPI xmlrpc_value *tcos_tnc(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_tnc(xmlrpc_env *env, xmlrpc_value *in, void *ud); #endif tcos-0.89.93ubuntu2/xmlrpc/simple-methods.h0000664000000000000000000000265012260610261015500 0ustar /* * simple-methods.h part of tcosxmlrpc * => common headers of simple-methods.c * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #if NEWAPI xmlrpc_value *tcos_version(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_version(xmlrpc_env *env, xmlrpc_value *in, void *ud); #endif #if NEWAPI xmlrpc_value *tcos_echo(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_echo(xmlrpc_env *env, xmlrpc_value *in, void *ud); #endif #if NEWAPI xmlrpc_value *tcos_status(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_status (xmlrpc_env *env, xmlrpc_value *in, void *user_data); #endif tcos-0.89.93ubuntu2/xmlrpc/exe.h0000664000000000000000000000311212260610261013321 0ustar /* * exe.h part of tcosxmlrpc * => common headers of exe.c * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef IS_STANDALONE #define XAUTHORITY "/usr/lib/tcos/get_xauth" #define DISPLAY "DISPLAY=:0 XAUTHORITY=$("XAUTHORITY")" #define CMD_WRAPPER DISPLAY" /usr/lib/tcos/daemonize.sh " #else #define XAUTHORITY "/root/.Xauthority" #define DISPLAY "DISPLAY=:0 XAUTHORITY="XAUTHORITY #define CMD_WRAPPER DISPLAY" /sbin/daemonize.sh " #endif #if NEWAPI xmlrpc_value *tcos_exe(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_exe(xmlrpc_env *env, xmlrpc_value *in, void *ud); #endif #if NEWAPI xmlrpc_value *tcos_kill(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_kill(xmlrpc_env *env, xmlrpc_value *in, void *ud); #endif void job_exe( char *cmd ); void kill_exe( char *cmd ); tcos-0.89.93ubuntu2/xmlrpc/tcosxmlrpc.c0000664000000000000000000002252212260610261014737 0ustar /* * tcosxmlrpc.c standalone XML-RPC server written in C * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #define HAVE_MAIN /* My TCOS includes */ #include "common.h" #include "debug.h" #include "login.h" #include "xauth.h" #include "info.h" #include "standalone.h" #include "pci.h" #include "exe.h" /*#include "screenshot.h"*/ #include "xorg.h" #include "sound.h" #include "devices.h" #include "lockscreen.h" #include "lockcontroller.h" #include "vnc.h" #include "vlc.h" #include "rtp.h" #include "tnc.h" #include "get_screenshot.h" #include "reboot_poweroff.h" #include "dpms.h" #include "pam-usb.h" #include "simple-methods.h" #include "config.h" int main (int argc, char **argv) { #ifdef NEWAPI xmlrpc_server_abyss_parms serverparm; xmlrpc_registry * registryP; xmlrpc_env envP; #endif /* check command line config file */ if (argc != 2) { fprintf(stderr, "Usage:\n\t tcosxmlrpc /path/of/abyss.conf\n"); return(1); } /* initialize server */ #ifdef NEWAPI xmlrpc_env_init(&envP); registryP = xmlrpc_registry_new(&envP); #else xmlrpc_server_abyss_init(XMLRPC_SERVER_ABYSS_NO_FLAGS, argv[1]); #endif /* add methods */ #ifdef NEWAPI xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.version", &tcos_version, NULL); xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.echo", &tcos_echo, NULL); xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.status", &tcos_status, NULL); xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.login", &tcos_login, NULL); xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.logout", &tcos_logout, NULL); xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.xauth", &tcos_xauth, NULL); xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.standalone", &tcos_standalone, NULL); xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.dbus", &tcos_dbus, NULL); xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.pci", &tcos_pci, NULL); xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.exe", &tcos_exe, NULL); xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.kill", &tcos_kill, NULL); /*xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.screenshot", &tcos_screenshot, NULL);*/ xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.xorg", &tcos_xorg, NULL); xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.sound", &tcos_sound, NULL); xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.devices", &tcos_devices, NULL); xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.lockscreen", &tcos_lockscreen, NULL); xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.unlockscreen", &tcos_unlockscreen, NULL); xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.lockcontroller", &tcos_lockcontroller, NULL); xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.unlockcontroller", &tcos_unlockcontroller, NULL); xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.info", &tcos_info, NULL); xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.vnc", &tcos_vnc, NULL); xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.getscreenshot", &tcos_get_screenshot, NULL); xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.vlc", &tcos_vlc, NULL); xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.rtp", &tcos_rtp, NULL); xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.tnc", &tcos_tnc, NULL); xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.rebootpoweroff", &tcos_reboot_poweroff, NULL); xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.dpms", &tcos_dpms, NULL); xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.pamusb", &tcos_pam_usb, NULL); xmlrpc_registry_add_method(&envP, registryP, NULL, "tcos.config", &tcos_config, NULL); #else xmlrpc_server_abyss_add_method_w_doc("tcos.version", &tcos_version, NULL, ":s", "Tcos, Returns tcosxmlrpc version. (no auth needed)"); xmlrpc_server_abyss_add_method_w_doc("tcos.echo", &tcos_echo, NULL, "s:s", "Tcos, debug class, returns string passed. (no auth needed)"); xmlrpc_server_abyss_add_method_w_doc("tcos.status", &tcos_status, NULL, "s:s", "Tcos, returns 1 if app running 0 if not or error string. (no auth needed)"); xmlrpc_server_abyss_add_method_w_doc("tcos.login", &tcos_login, NULL, "ss:s", "Tcos, Basic auth system."); xmlrpc_server_abyss_add_method_w_doc("tcos.logout", &tcos_logout, NULL, ":s", "Tcos, Basic auth system."); xmlrpc_server_abyss_add_method_w_doc("tcos.xauth", &tcos_xauth, NULL, "ss:s", "Tcos, authenticate with X cookies."); xmlrpc_server_abyss_add_method_w_doc("tcos.standalone", &tcos_standalone, NULL, "ss:s", "Tcos, Standalone. Return standalone values (no auth needed)"); xmlrpc_server_abyss_add_method_w_doc("tcos.dbus", &tcos_dbus, NULL, "s:s", "Tcos, DBus. Exe with a wrapper some dbus events (auth needed)"); xmlrpc_server_abyss_add_method_w_doc("tcos.pci", &tcos_pci, NULL, "s:s", "Tcos, PCI data stuff. Send pci_all to get pci bus ids. (no auth needed)"); xmlrpc_server_abyss_add_method_w_doc("tcos.exe", &tcos_exe, NULL, "sss:s", "Tcos, Exec a command passed as string. (need login first)"); xmlrpc_server_abyss_add_method_w_doc("tcos.kill", &tcos_kill, NULL, "sss:s", "Tcos, killall command passed as string. (need login first)"); /*xmlrpc_server_abyss_add_method_w_doc("tcos.screenshot", &tcos_screenshot, NULL, "ss:s", "Tcos, make a screenshot and return files. (need login first)");*/ xmlrpc_server_abyss_add_method_w_doc("tcos.xorg", &tcos_xorg, NULL, "ssss:s", "Tcos, configure, change or get xorg.conf settings. (need login first)"); xmlrpc_server_abyss_add_method_w_doc("tcos.sound", &tcos_sound, NULL, "ssss:s", "Tcos, configure, change or get sound settings."); xmlrpc_server_abyss_add_method_w_doc("tcos.devices", &tcos_devices, NULL, "ssss:s", "Tcos, configure, change or get devices settings."); xmlrpc_server_abyss_add_method_w_doc("tcos.lockscreen", &tcos_lockscreen, NULL, "ss:s", "Tcos, exec lockscreen to block thin client."); xmlrpc_server_abyss_add_method_w_doc("tcos.unlockscreen", &tcos_unlockscreen, NULL, "ss:s", "Tcos, kill lockscreen to unblock thin client."); xmlrpc_server_abyss_add_method_w_doc("tcos.lockcontroller", &tcos_lockcontroller, NULL, "sss:s", "Tcos, exec lockvnc or lockvlc to block thin client."); xmlrpc_server_abyss_add_method_w_doc("tcos.unlockcontroller", &tcos_unlockcontroller, NULL, "sss:s", "Tcos, kill lockvlc or lockvnc to unblock thin client."); xmlrpc_server_abyss_add_method_w_doc("tcos.info", &tcos_info, NULL, "s:s", "Tcos, return passed info string. (no auth needed)\n\ Info methods:\n\ * cpu_model\n\ * cpu_speed\n\ * cpu_vendor\n\ * ram_total\n\ * ram_active\n\ * ram_free\n\ * ram_used\n\ * swap_avalaible\n\ * swap_total\n\ * swap_used\n\ * swap_free\n\ * tcos_date\n\ * tcos_generation_date\n\ * tcos_version\n\ * network_hostname\n\ * network_ip\n\ * network_mak\n\ * network_mask\n\ * network_rx\n\ * network_tx\n\ * modules_loaded"); xmlrpc_server_abyss_add_method_w_doc("tcos.vnc", &tcos_vnc, NULL, "ssss:s", "Tcos, manage vnc server and client."); xmlrpc_server_abyss_add_method_w_doc("tcos.getscreenshot", &tcos_get_screenshot, NULL, "ssss:ss", "Tcos, make screenshot and return in base64."); xmlrpc_server_abyss_add_method_w_doc("tcos.vlc", &tcos_vlc, NULL, "ssss:s", "Tcos, manage vlc params."); xmlrpc_server_abyss_add_method_w_doc("tcos.rtp", &tcos_rtp, NULL, "ssss:s", "Tcos, manage rtp params."); xmlrpc_server_abyss_add_method_w_doc("tcos.tnc", &tcos_tnc, NULL, "ssssss:s", "Tcos, net controller params."); xmlrpc_server_abyss_add_method_w_doc("tcos.rebootpoweroff", &tcos_reboot_poweroff, NULL, "ssss:s", "Tcos, Reboot or Poweroff using Xorg cookie."); xmlrpc_server_abyss_add_method_w_doc("tcos.dpms", &tcos_dpms, NULL, "sss:s", "Tcos, manage DPMS Monitor options."); xmlrpc_server_abyss_add_method_w_doc("tcos.pamusb", &tcos_pam_usb, NULL, "ssss:s", "Tcos, manage pam-usb auth."); xmlrpc_server_abyss_add_method_w_doc("tcos.config", &tcos_config, NULL, "ssss:s", "Tcos, get TCOS config vars."); #endif /* end of add methods */ dbgtcos("tcosxmlrpc::main() switching to background.\n"); #ifdef NEWAPI serverparm.config_file_name = argv[1]; serverparm.registryP = registryP; xmlrpc_server_abyss(&envP, &serverparm, XMLRPC_APSIZE(registryP)); #else xmlrpc_server_abyss_run(); #endif /* We never reach this point. */ return 0; } tcos-0.89.93ubuntu2/xmlrpc/standalone.h0000664000000000000000000000503712260610261014700 0ustar /* * standalone.h part of tcosxmlrpc * => common headers of standalone.c * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* xmlrpc methods to export thin client info */ /*#define STANDALONE_USER "w | awk '{ if ($3 == \":0\" || $2 == \":0\") print $1 }' |head -1"*/ #define STANDALONE_USER "/usr/lib/tcos/tcos-last --user 2>/dev/null" #define STANDALONE_HOME "getent passwd $("STANDALONE_USER") | head -1 | awk -F\":\" '{print $6}'" #define STANDALONE_PROCESS "ps U $("STANDALONE_USER") -o pid | sed 's/[[:blank:]]//g' | grep -c ^[0-9]" /*#define STANDALONE_TIME "LC_ALL=C LC_MESSAGES=C last| grep \"[[:blank:]]:0[[:blank:]].*still\" | awk '{print $(NF-5)\" \"$(NF-4)\" \"$(NF-3)}'"*/ #define STANDALONE_TIME "/usr/lib/tcos/tcos-last --time 2>/dev/null" #define STANDALONE_EXCLUDE "/usr/lib/tcos/tcos-last --ingroup" /* stunnel4 break STANDALONE_SERVER #define STANDALONE_SERVER grep "tcosxmlrpc accepted connection" /var/log/stunnel.log |tail -1 | awk '{print $NF}'| awk -F ":" '{print $1}' */ #ifdef IS_STANDALONE #define STANDALONE_SERVER "/usr/lib/tcos/get_server" #else #define STANDALONE_SERVER "/usr/bin/get_server" #endif #define STANDALONE_MULTISEAT "/usr/lib/tcos/get_multiseat" /* messages */ #define STANDALONE_UNKNOW "error: Unknow user" #define STANDALONE_ERROR "error: tcos-last returned error" /* dbus */ #define DBUS_HANDLER TCOS_PATH "/tcos-dbus-helper" #define DBUS_ERROR "error: dbus error" #define DBUS_OK "ok" #if NEWAPI xmlrpc_value *tcos_standalone(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_standalone(xmlrpc_env *env, xmlrpc_value *in, void *ud); #endif #if NEWAPI xmlrpc_value *tcos_dbus(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_dbus(xmlrpc_env *env, xmlrpc_value *in, void *ud); #endif tcos-0.89.93ubuntu2/xmlrpc/vlc.h0000664000000000000000000000221712260610261013331 0ustar /* * vlc.h part of tcosxmlrpc * => common headers of vlc.c * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* xmlrpc methods of VLC */ #define VLC_CONTROLLER TCOS_PATH"/vlc-controller.sh" #define VLC_ERROR "error: vlc command error" #define VLC_OK "ok" #if NEWAPI xmlrpc_value *tcos_vlc(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_vlc(xmlrpc_env *env, xmlrpc_value *in, void *ud); #endif tcos-0.89.93ubuntu2/xmlrpc/config.h0000664000000000000000000000237512260610261014017 0ustar /* * config.h part of tcosxmlrpc * => common headers of config.c * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #define CONFIG_WRAPPER TCOS_PATH"/configctl.sh " #define CONFIG_OK "ok: config action done." #define CONFIG_ERROR "-1" #define CONFIG_READING_ERROR "error: reading config settings." #define CONFIG_UNKNOW_ERROR "error: unknow option passed." #if NEWAPI xmlrpc_value *tcos_config(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext); #else xmlrpc_value *tcos_config(xmlrpc_env *env, xmlrpc_value *in, void *ud); #endif tcos-0.89.93ubuntu2/xmlrpc/sh/0000775000000000000000000000000012260610427013010 5ustar tcos-0.89.93ubuntu2/xmlrpc/sh/devicesctl.sh0000664000000000000000000001723412260610261015474 0ustar #!/bin/sh # # devices.ctl.sh Devices remote control # Copyright (C) 2006-2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # if [ -e /conf/tcos-run-functions ]; then . /conf/tcos-run-functions else echo -n "error running in standalone" exit 1 fi tmp_file=/tmp/devicesctl output="" need_parse="0" LANG=C FDISK="/sbin/fdisk" UDEVINFO="/usr/bin/udevinfo" [ -x /sbin/udevadm ] && UDEVINFO="/sbin/udevadm info" read_line() { head -$1 $tmp_file | tail -1 } get_fs_type() { output=$(get_filesystem "$1" --only) echo $output } is_cdrom() { # receive hdc hda (without /dev/) cdrom=$(head -3 /proc/sys/dev/cdrom/info 2>/dev/null | tail -1 | cut -f 3- | grep -c $1) echo $cdrom } if [ "$1" = "--showlocaldisks" ]; then #output=$($FDISK -l | awk '/^\/dev/ {print $1}') output=$(ls /sys/block/|grep -v ram|grep -v loop) need_parse="1" fi if [ "$1" = "--getsize" ]; then if [ "$2" != "" ]; then output=$($FDISK -l /dev/$2 | grep "/dev/$2:" | awk '{print $3" "$4}' | sed s/,//g) else output="error: need a device!!" fi fi if [ "$1" = "--getparts" ]; then if [ "$2" != "" ]; then allparts=$(echo /sys/block/$2/$2*) for part in $allparts; do echo $(basename $part) >> $tmp_file ;done need_parse=1 output="tmp_file" else output="error: need a device!!" fi fi if [ "$1" = "--gettype" ]; then if [ "$2" != "" ]; then output=$(get_fs_type $2) else output="error: need a device!!" fi fi if [ "$1" = "--getdmesg" ]; then output=$(dmesg|tail) need_parse=1 fi if [ "$1" = "--getudev" ]; then # if [ -e /tmp/gnetic.log ]; then # if [ "$(pidof gnetic | sed '/^$/d')" = "" ]; then # if [ "$(cat /tmp/gnetic.log | grep -c Error)" != "0" -o "$(cat /tmp/gnetic.log | grep -c Killed)" != "0" -o "$(cat /tmp/gnetic.log | grep -c #Terminated)" != "0" ]; then # output="clone-failed" # elif [ "$(cat /tmp/gnetic.log | grep -c FINISH)" != "0" ]; then # output="cloned" # fi # else # output="cloning" # fi # need_parse="0" # else output=$(cat /tmp/tcos-udevd.log 2>/dev/null) cat /dev/null > /tmp/tcos-udevd.log need_parse=1 # fi fi if [ "$1" = "--mount" ]; then export DISPLAY=:0 if ! xprop -root | grep -q LTSPFS ; then [ -x /bin/ltspfs-set-xprop ] && /bin/ltspfs-set-xprop now >> /tmp/initramfs.debug 2>&1 fi if [ "$2" != "" ]; then mnt=$(basename $2) if grep -q /mnt/$mnt /proc/mounts ; then echo -n "/mnt/$mnt" return fi cdrom=$(is_cdrom $mnt) fs="" if [ "$3" != "" ]; then fs=" -t $3 " else fs=" -t $(get_fs_type $2) " fi mkdir -p /mnt/$mnt if [ "$cdrom" = 1 ]; then mount -t $(cd_type /dev/$mnt) -o ro $2 /mnt/$mnt 2> /dev/null if [ $? = 0 ]; then output="/mnt/$mnt" else output="error: mounting device" fi echo -n $output return fi ############### count=0 if [ "$(get_fs_type $2)" = "ntfs-3g" ]; then /sbin/mount.ntfs-3g $2 /mnt/$mnt ln -s /sbin/mount.ntfs-3g /sbin/mount.ntfs-3g.$mnt 2>/dev/null /sbin/start-stop-daemon --quiet --background --start --startas /sbin/mount.ntfs-3g.$mnt --name /sbin/mount.ntfs-3g.$mnt -- $2 /mnt/$mnt while [ $(grep -c "^$2" /proc/mounts) -eq 0 -a $count -lt 5 ];do sleep 1 count=$(($count+1)) done else mount $fs $2 /mnt/$mnt 2>/dev/null fi if [ $? = 0 -a $count -ne 5 ]; then output="/mnt/$mnt" else output="error: mounting device" fi else output="error: need a device" fi fi if [ "$1" = "--umount" ]; then if [ "$2" != "" ]; then mnt=$(basename $2) umount /mnt/$mnt 2>/dev/null if [ $? = 0 ]; then [ -e /sbin/mount.ntfs-3g.$mnt ] && rm -f /sbin/mount.ntfs-3g.$mnt 2>/dev/null output="/mnt/$mnt" else output="error: umounting device" fi else output="error: need something to umount" fi fi if [ "$1" = "--getstatus" ]; then if [ "$2" != "" ]; then output=$(grep -c "^$2 " /proc/mounts) else output="error: need a device" fi fi if [ "$1" = "--eject" ]; then if [ "$2" != "" ]; then eject /dev/$2 else eject fi echo "ok" fi if [ "$1" = "--getcdrom" ]; then cdrom=$(head -3 /proc/sys/dev/cdrom/info 2>/dev/null | tail -1 | cut -f 3-) for item in $cdrom; do output="$output$item|"; done need_parse=0 fi if [ "$1" = "--cdaudio" ]; then type=$(cd_type $2) if [ "$type" = "cdfs" ]; then output=1 else output=0 fi need_parse=0 fi if [ "$1" = "--getxdrivers" ]; then if [ -d /usr/lib/xorg/modules/drivers/ ]; then output=$(ls /usr/lib/xorg/modules/drivers/|grep "_drv.so"|sed s/'_drv.so'//g) fi need_parse=1 fi if [ "$1" = "--exists" ]; then if [ -e "$2" ]; then output=1 else output=0 fi need_parse=0 fi if [ "$1" = "--gethdd" ]; then hdd=$(grep ^/dev /etc/fstab | grep -v -e swap -e iso9660 | awk '{print $1}' | sed 's/\/dev\///g') for item in $hdd; do output="$output$item|"; done need_parse=0 fi if [ "$1" = "--getid" ]; then output=$($UDEVINFO --query=env --name=$2| grep -e "^ID_VENDOR=" -e "^ID_MODEL="| sed 's/[[:blank:]]/_/g' | awk -F"=" '{print $2}' 2>/dev/null) need_parse=1 fi if [ "$1" = "--getusbip" ]; then output=$(/usr/bin/usbip_list 2>/dev/null) need_parse=1 fi usage() { echo "Usage:" echo " $0 --help ( this help text )" echo " $0 --showlocaldisks ( return all devices )" echo " $0 --getsize DEVICE ( return size of DEVICE )" echo " $0 --getparts DEVICE ( return partittions of DEVICE )" echo " $0 --gettype DEVICE ( return DEVICE type )" echo " $0 --getudev ( return udev block events log )" echo " $0 --getdmesg ( return last lines of dmesg )" echo " $0 --mount DEVICE ( mount DEVICE )" echo " $0 --umount DEVICE ( umount DEVICE )" echo " $0 --getstatus DEVICE ( return 1 if mounted or 0 if not mounted )" echo " $0 --eject ( eject cdrom device )" echo " $0 --getcdrom ( return all cdrom devices )" echo " $0 --cdaudio DEVICE ( return 1 if cdaudio, 0 if not )" echo " $0 --getxdrivers ( return all xorg drivers found )" echo " $0 --exists ARG ( return 1 if exists 0 if not )" echo " $0 --gethdd ( return all hard disk partitions )" echo " $0 --getid DEVICE ( return device info )" echo " $0 --getusbip ( return USBIP exportable devices)" } if [ "$1" = "" -o "$1" = "--help" ]; then usage exit 1 fi if [ "$output" = "" ]; then output="unknow" fi if [ "$need_parse" = "1" ]; then if [ "$output" != "tmp_file" ]; then echo "$output" > $tmp_file fi num_lines=$(cat $tmp_file | wc -l) for i in $(seq 1 $num_lines); do line=$(read_line $i) echo -n "$line|" done rm $tmp_file else echo -n $output fi exit 0 tcos-0.89.93ubuntu2/xmlrpc/sh/soundctl.sh0000664000000000000000000001013212260610261015170 0ustar #!/bin/sh # TCOS Sound volume control # # soundctl.sh part of tcosxmlrpc # => get and configure sound channels # Copyright (C) 2006-2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # if [ ! -e /dev/dsp ] && [ ! -d /proc/asound ]; then echo "error: not soundcard" exit 1 fi output="" tmpfile=/tmp/soundinfo-$$ read_line() { head -$1 $tmpfile | tail -1 } ##################### #export TMIXER_FORCE=oss #export TMIXER_OSSMUTELEVEL=85 if [ -x /usr/lib/tcos/tmixer ]; then MIXER="/usr/lib/tcos/tmixer -c 0 " else MIXER="tmixer -c 0 " fi get_controls() { $MIXER scontrols } get_contents() { $MIXER scontents > $tmpfile num_lines=$(cat $tmpfile | wc -l) for i in $(seq 1 $num_lines); do line=$(read_line $i) echo -n "$line#" done rm $tmpfile } get_level() { if [ "$1" = "" ]; then echo "soundctl error, need a control to retrieve data" exit 1 fi $MIXER sget "$1" | awk -F"," '{print $3}' } set_level() { if [ "$1" = "" ]; then echo "soundctl error, need a control to retrieve data" exit 1 fi if [ "$2" = "" ]; then echo "soundctl error, need a xxx% level or 1-31 int" exit 1 fi $MIXER sset "$1" "$2" } get_mute() { if [ "$1" = "" ]; then echo "soundctl error, need a control to retrieve data" exit 1 fi $MIXER sget "$1" | awk -F"," '{print $4}' } set_mute() { if [ "$1" = "" ]; then echo "soundctl error, need a control to retrieve data" exit 1 fi $MIXER sset "$1" "off" } set_unmute() { if [ "$1" = "" ]; then echo "soundctl error, need a control to retrieve data" exit 1 fi $MIXER sset "$1" "on" } get_serverinfo() { if [ "$(pidof pulseaudio | sed '/^$/d')" = "" ]; then echo "error: pulseaudio not running" exit 1 fi #pactl -s 127.0.0.1 stat > $tmpfile pactl stat > $tmpfile num_lines=$(cat $tmpfile | wc -l) for i in $(seq 1 $num_lines); do line=$(read_line $i) echo -n "$line|" done rm $tmpfile exit 0 } usage() { echo "Usage:" echo " $0 --help ( this help text )" echo " $0 --showcontrols ( return all mixer channels )" echo " $0 --showcontents ( return all mixer channels with data )" echo " $0 --getlevel CHANNEL ( return CHANNEL level xx% xx% left and right )" echo " $0 --setlevel CHANNEL xx% ( change and return CHANNEL level xx% xx% left and right )" echo " $0 --getmute CHANNEL ( return off if mute or on if unmute CHANNEL )" echo " $0 --setmute CHANNEL ( mute CHANNEL and return off if succesfull )" echo " $0 --setunmute CHANNEL ( unmute CHANNEL and return on if succesfull )" echo " $0 --getserverinfo ( show stats of PulseAudio server with pactl)" echo " $0 --restartpulse ( restart PulseAudio daemon)" } for x in $1; do case $x in --showcontrols) output=$(get_controls); ;; --showcontents) output=$(get_contents); ;; --getlevel) output=$(get_level "$2") ;; --setlevel) output=$(set_level "$2" "$3") ;; --getmute) output=$(get_mute "$2") ;; --setmute) output=$(set_mute "$2") ;; --setunmute) output=$(set_unmute "$2") ;; --getserverinfo) get_serverinfo ;; --restartpulse) killall -9 pulseaudio; /bin/daemonize.sh /sbin/startpulseaudio ;; --help) usage exit 1 ;; esac done if [ "$1" = "" ]; then usage exit 1 fi if [ "$output" = "" ]; then output="unknow" fi echo -n $output exit 0 tcos-0.89.93ubuntu2/xmlrpc/sh/screenshot.sh0000664000000000000000000000252212260610261015516 0ustar #!/bin/sh # # screenshot.sh shell script to make and screenshot with scrot # and save it in /var/www # Copyright (C) 2006-2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # export DISPLAY=:0 beepoff="" beepon="" if [ -e /conf/tcos-run-functions ]; then _www=/var/www export XAUTHORITY=/root/.Xauthority else _www=/var/lib/tcos/standalone/www export XAUTHORITY=$(get_xauth) export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/lib/tcos beepoff="xset b off" beepon="xset b on" fi _thumb_size=65 if [ "$1" != "" ]; then _thumb_size=$1 fi mkdir -p $_www rm -rf $_www/* cd $_www $($beepoff) scrot 'capture.jpg' -t $_thumb_size $($beepon) exit 0 tcos-0.89.93ubuntu2/xmlrpc/sh/tcos-last0000664000000000000000000002501112260610261014637 0ustar #!/usr/bin/env python # -*- coding: UTF-8 -*- ########################################################################## # TcosMonitor writen by MarioDebian # # TcosMonitor version __VERSION__ # # Copyright (c) 2006 Mario Izquierdo # # 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. ########################################################################### import sys, os import getopt import socket from time import time, ctime, localtime from subprocess import Popen, PIPE, STDOUT import pwd,grp import re import ipaddr import binascii import IPy import utmp from UTMPCONST import * """ ACCOUNTING = 9 BOOT_TIME = 2 DEAD_PROCESS = 8 EMPTY = 0 INIT_PROCESS = 5 LOGIN_PROCESS = 6 NEW_TIME = 3 OLD_TIME = 4 RUN_LVL = 1 USER_PROCESS = 7 UT_HOSTSIZE = 256 UT_IDSIZE = 4 UT_LINESIZE = 32 UT_NAMESIZE = 32 UT_UNKNOWN = 0 """ debug=False def print_debug(txt): if debug: print >> sys.stderr, "tcos-last DEBUG: %s"%(txt) def is_bin(txt): if txt in ['3a', '2e', '61', '62', '63', '64', '65', '66']: # txt is ':' or '.' or a letter between a-f return False try: txt=int(txt) except ValueError: # can't convert txt to int, txt is hexadecimal aka binary return True if txt >= 30 and txt <= 39: # txt is between 0(0x30) and 9(0x39) return False # return binary by default return True def parseIPAddress(ipstr, return_ipv4=True): """ pass an string or binary IP and return IPV4 """ newip=[] isBin=False if ipstr == "::1": # localhost in IPV6 return "127.0.0.1" # GDM when change username use a $DISPLAY like this "::12" if re.match("::([0-9]{1,9})$", ipstr): return "" # XEPHYR NAME ':20.0' if re.match(":([0-9]{1,9}|[0-9]{1,9}.[0-9]{1,9})$", ipstr): return "" # match x.x.x.x:0 or x.x.x.x:0.0 if re.match(".*:([0-9]{1,9}|[0-9{1-9}].[0-9{1-9}])$", ipstr): #print_debug("delete display from IP\n\n") ipstr=ipstr.rsplit(":", 1)[0] # match "localhost:10" if re.match("[a-zA-Z].*:([0-9]{1,9})", ipstr): ipstr=ipstr.rsplit(":", 1)[0] return ipstr # hostname must start with letter and contain letters numbers and '-' or '.' if re.match("^[a-zA-Z][a-zA-Z0-9.-]+$", ipstr): # ipstr is a hostname return ipstr for it in ipstr: eol=is_bin(binascii.hexlify(it)) if eol: isBin=True #print_debug("%s => %s string=%s"%(it, binascii.hexlify(it), eol) ) newip.append(binascii.hexlify(it)) if ipstr == '': return '' if isBin: try: ip=ipaddr.IPAddress(IPy.parseAddress("0x" + "".join(newip) )[0]) except: return ipstr else: try: ip=ipaddr.IPAddress(ipstr) #except Exception: except Exception, err: print_debug(" parseIPAddress() Exception, error=%s"%err) return ipstr ipv4=ip if return_ipv4 and ip.version == 6 and ip.ipv4_mapped: #print_debug(" IPV6 found %s"%ip) ipv4=ip.ipv4_mapped.exploded return str(ipv4) try: opts, args = getopt.getopt(sys.argv[1:], ":hd", ["host=", "debug", "tcosdisplay", "user", "userid", "time", "pid", "ingroup="]) except getopt.error, msg: print msg print "for command line options use tcos-last --help" sys.exit(2) ACTION=None HOST="" INGROUP="" # process options for o, a in opts: if o == "--debug": debug=True if o == "--host": HOST=a if o == "--tcosdisplay": HOST=parseIPAddress(os.environ["DISPLAY"]) if o == "--user": ACTION="user" elif o == "--ingroup": ACTION="ingroup" INGROUP=a elif o == "--userid": ACTION="userid" elif o == "--time": ACTION="time" elif o == "--pid": ACTION="pid" def ipValid(ip): # ip is XXX.XXX.XXX.XXX # http://mail.python.org/pipermail/python-list/2006-March/333963.html try: xip=ip.split('.') if len(xip) != 4: return False for block in xip: if int(block) < 0 or int(block) >= 255: return False return True except: return False def GetIpAddress(hostname): print_debug("GetIpAddress() hostname=%s "%(hostname) ) try: return socket.getaddrinfo(hostname, None)[0][4][0] except: return None def GetHostname(ip): print_debug("GetHostname() ip=%s "%(ip) ) try: hostname = socket.gethostbyaddr(ip)[0] return hostname except: return None def GetLast(ip): last=[] data={} if ip != "" and not ipValid(ip): ip=GetIpAddress(ip) hostname=GetHostname(ip) print_debug("GetLast() ip=%s hostname=%s "%(ip,hostname)) # try to connect with GDM througth dbus to read all # sessions & display info, better than read wtmp try: os.environ['TCOSMONITOR_NO_EXTENSIONS']='1' import tcosmonitor.Sessions app=tcosmonitor.Sessions.Sessions() for session in app.sessions: if session.remote_host_name == ip: print_debug("GetLast() session=%s"%session) data= {"pid":0, "user":session.user, "host":parseIPAddress(session.remote_host_name), "time":session.since, "timelogged":session.diff} return data except Exception, err: print_debug("GetLast() Exception, no DBUS Session support, old GDM, err='%s'"%err) #import traceback #traceback.print_exc(file=sys.stderr) for i in range(10): last_file=WTMP_FILE if i != 0: last_file=WTMP_FILE+".%d" %i if os.path.isfile(last_file): print_debug("GetLast() Searching in %s" %last_file) a = utmp.UtmpRecord(last_file) while 1: b = a.getutent() if not b: break if b[0] == USER_PROCESS: uthost=str(parseIPAddress(b.ut_host)) utline=str(parseIPAddress(b.ut_line)) half1="%s" %(uthost[:(len(uthost)/2)]) half2="%s" %(uthost[(len(uthost)/2):]) if half1 == half2 and str(parseIPAddress(half1)) == utline: b.ut_host = half1 else: b.ut_host = uthost #print_debug(" => Searching for host \"%s:0\", hostname=%s found host=%s ut_line=%s user=%s"%(ip, hostname, b.ut_host,b.ut_line, b.ut_user)) # print_debug(" ==> '%s' != '%s' ut_line=%s" %(parseIPAddress(b.ut_host), ip, b.ut_line) ) #parseIPAddress(b.ut_line) == "%s:0"%(ip) or \ if parseIPAddress(b.ut_host) == "%s"%(ip) or \ parseIPAddress(b.ut_host) == "%s"%hostname : # found line ??? print_debug(" => found line ?? user=%s"%b.ut_user) if b.ut_line.startswith("pts/") or not \ os.path.isdir("/proc/%s"%b.ut_pid): continue print_debug(" Ip \"%s:0\" => found host=%s hostname=%s ut_line=%s user=%s pid=%s"%(ip, hostname, b.ut_host,b.ut_line, b.ut_user, b.ut_pid)) last=b a.endutent() if last and os.path.isdir("/proc/%s"%last.ut_pid): break if last and os.path.isdir("/proc/%s"%last.ut_pid): print_debug ("diff times now %s - old %s"%(ctime(time()), ctime(last.ut_tv[0]))) # take diff between now and login time diff=time()-last.ut_tv[0] # get days and set diff to rest days=int(diff/(3600*24)) diff=diff-days*3600*24 # get hours and set diff to rest hours=int(diff/3600) diff=diff-hours*3600 # get minutes and set seconds to rest minutes=int(diff/60) seconds=int(diff-minutes*60) print_debug ("days=%s hours=%s minutes=%s seconds=%s"%(days, hours, minutes, diff)) # only print days if > 0 if days == 0: timelogged="%02dh:%02dm"%(hours,minutes) else: timelogged="%dd %02dh:%02dm"%(days,hours,minutes) uid=pwd.getpwnam(last.ut_user)[2] print_debug("username %s uid=%s"%(last.ut_user, uid)) data={"pid":last.ut_pid, "fulltime":"%dd %02d:%02d:%02d"%(days,hours,minutes,seconds), "userid":uid, "user":last.ut_user, "host":last.ut_host.split(":")[0], "time":last.ut_tv[0], "timelogged":timelogged} print_debug(data) return data data=GetLast(HOST) # print data if not data: print_debug("Error: no data") sys.exit(1) elif not ACTION: print_debug("Error need something to retrieve: --user, --uid, --time or --pid") sys.exit(1) elif ACTION == "user": print data['user'] elif ACTION == "userid": print data['userid'] elif ACTION == "time": print data['timelogged'] elif ACTION == "pid": print data['pid'] elif ACTION == "ingroup": usersingroup=[] try: # grp not work well with ldap users. cmd="groups %s 2>/dev/null" %data['user'] output=[] p = Popen(cmd, shell=True, bufsize=0, stdout=PIPE, stderr=STDOUT, close_fds=True).stdout for line in p.readlines(): if line != '\n': line=line.replace('\n', '') output.append(line) print_debug("cmd %s: %s" %(cmd,output)) usersingroup=output[0].split() #usersingroup=grp.getgrnam(INGROUP)[3] except Exception, err: usersingroup=[] if len(usersingroup) == 0: try: usersingroup=grp.getgrnam(INGROUP)[3] except: pass exclude="noexclude" for group in usersingroup: if INGROUP == group: exclude="exclude" print exclude tcos-0.89.93ubuntu2/xmlrpc/sh/configctl.sh0000664000000000000000000000310612260610261015310 0ustar #!/bin/sh # TCOS parse config vars # # configctl.sh part of tcosxmlrpc # => get TCOS config vars # Copyright (C) 2006-2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # get_varname() { if [ -e /conf/tcos.conf ]; then # don't allow to ask for root passwd if [ "$1" = "TCOS_ROOT_PASSWD" ]; then echo "*secret*" return fi line=$(grep "^${1}=" /conf/tcos.conf | tail -1) if [ "$line" != "" ]; then echo $line | awk -F"=" '{print $2}' else echo "-1" fi fi } usage() { echo "Usage:" echo " $0 --help ( this help text )" echo " $0 --get [VARNAME] ( return 0/1 if found )" } for x in $1; do case $x in --get) output=$(get_varname "$2") ;; --help) usage exit 1 ;; esac done if [ "$1" = "" ]; then usage exit 1 fi if [ "$output" = "" ]; then output="0" fi echo -n $output exit 0 tcos-0.89.93ubuntu2/xmlrpc/sh/rtp-controller.sh0000664000000000000000000001721312260610261016332 0ustar #!/bin/sh # # rtp-controller.sh # Copyright (C) 2006,2007,2008 vidal_joshur at gva.es # Copyright (C) 2006-2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # # rtp controller script for TCOS # export DISPLAY=:0 VOLUME=85 VOLUME_MIC=75 if [ -e /conf/tcos-run-functions ]; then # running in thin client STANDALONE=0 export XAUTHORITY=/root/.Xauthority DAEMONIZE="/sbin/daemonize.sh" PACTL="/sbin/pactl-controller.sh" MASTER=$(/sbin/soundctl.sh --getlevel Master 2>/dev/null | sed 's/%//g') MASTER_FRONT=$(/sbin/soundctl.sh --getlevel "Master Front" 2>/dev/null | sed 's/%//g') PCM=$(/sbin/soundctl.sh --getlevel PCM 2>/dev/null | sed 's/%//g') FRONT=$(/sbin/soundctl.sh --getlevel Front 2>/dev/null | sed 's/%//g') MIC=$(/sbin/soundctl.sh --getlevel Mic 2>/dev/null | sed 's/%//g') FRONT_MIC=$(/sbin/soundctl.sh --getlevel "Front Mic" 2>/dev/null | sed 's/%//g') REAR_MIC=$(/sbin/soundctl.sh --getlevel "Rear Mic" 2>/dev/null | sed 's/%//g') MIXER="tmixer -c 0 " else STANDALONE=1 #STANDALONE_USER=$(w | awk '{ if ($3 == ":0" || $2 == ":0") print $1 }' |head -1) STANDALONE_USER=$(/usr/lib/tcos/tcos-last --user 2>/dev/null) if [ "${STANDALONE_USER}" = "" ]; then echo "error: no standalone user connected"; exit 1; fi DBUS_HANDLER="/usr/lib/tcos/tcos-dbus-helper --username=${STANDALONE_USER} " DAEMONIZE="/usr/lib/tcos/daemonize.sh" PACTL="/usr/lib/tcos/pactl-controller.sh" MASTER=$(/usr/lib/tcos/soundctl.sh --getlevel Master 2>/dev/null | sed 's/%//g') MASTER_FRONT=$(/usr/lib/tcos/soundctl.sh --getlevel "Master Front" 2>/dev/null | sed 's/%//g') PCM=$(/usr/lib/tcos/soundctl.sh --getlevel PCM 2>/dev/null | sed 's/%//g') FRONT=$(/usr/lib/tcos/soundctl.sh --getlevel Front 2>/dev/null | sed 's/%//g') MIC=$(/usr/lib/tcos/soundctl.sh --getlevel Mic 2>/dev/null | sed 's/%//g') FRONT_MIC=$(/usr/lib/tcos/soundctl.sh --getlevel "Front Mic" 2>/dev/null | sed 's/%//g') REAR_MIC=$(/usr/lib/tcos/soundctl.sh --getlevel "Rear Mic" 2>/dev/null | sed 's/%//g') MIXER="/usr/lib/tcos/tmixer -c 0 " fi set_volume() { [ "$MASTER" = "unknow" ] && MASTER=$VOLUME [ "$MASTER_FRONT" = "unknow" ] && MASTER_FRONT=$VOLUME [ "$PCM" = "unknow" ] && PCM=$VOLUME [ "$FRONT" = "unknow" ] && FRONT=$VOLUME $MIXER sset 'PCM' 'on' >/dev/null 2>&1 $MIXER sset 'Master' 'on' >/dev/null 2>&1 $MIXER sset 'Master Front' 'on' >/dev/null 2>&1 $MIXER sset 'Front' 'on' >/dev/null 2>&1 [ $PCM -lt $VOLUME ] && $MIXER sset 'PCM' $VOLUME >/dev/null 2>&1 [ $MASTER -lt $VOLUME ] && $MIXER sset 'Master' $VOLUME >/dev/null 2>&1 [ $MASTER_FRONT -lt $VOLUME ] && $MIXER sset 'Master Front' $VOLUME >/dev/null 2>&1 [ $FRONT -lt $VOLUME ] && $MIXER sset 'Front' $VOLUME >/dev/null 2>&1 } set_mic() { [ "$MIC" = "unknow" ] && MIC=$VOLUME_MIC [ "$FRONT_MIC" = "unknow" ] && FRONT_MIC=$VOLUME_MIC [ "$REAR_MIC" = "unknow" ] && REAR_MIC=$VOLUME_MIC $MIXER sset 'Mic' 'on' >/dev/null 2>&1 $MIXER sset 'Front Mic' 'on' >/dev/null 2>&1 $MIXER sset 'Rear Mic' 'on' >/dev/null 2>&1 $MIXER sset 'Mic Boost (+20dB)' 'off' >/dev/null 2>&1 $MIXER sset 'Mic Boost' 'off' >/dev/null 2>&1 $MIXER sset 'Front Mic Boost' 'off' >/dev/null 2>&1 $MIXER sset 'Rear Mic Boost' 'off' >/dev/null 2>&1 $MIXER sset 'Mic Boost (+20dB)' 0% >/dev/null 2>&1 $MIXER sset 'Mic Boost' 0% >/dev/null 2>&1 $MIXER sset 'Front Mic Boost' 0% >/dev/null 2>&1 $MIXER sset 'Rear Mic Boost' 0% >/dev/null 2>&1 $MIXER sset 'Mic' $VOLUME_MIC >/dev/null 2>&1 $MIXER sset 'Front Mic' $VOLUME_MIC >/dev/null 2>&1 $MIXER sset 'Rear Mic' $VOLUME_MIC >/dev/null 2>&1 $MIXER sset 'Capture' cap >/dev/null 2>&1 $MIXER sset 'Capture,0' cap >/dev/null 2>&1 $MIXER sset 'Capture,1' cap >/dev/null 2>&1 $MIXER sset 'Capture,2' cap >/dev/null 2>&1 $MIXER sset 'Capture,3' cap >/dev/null 2>&1 $MIXER sset 'Capture' 90% >/dev/null 2>&1 $MIXER sset 'Capture,0' 90% >/dev/null 2>&1 $MIXER sset 'Capture,1' 90% >/dev/null 2>&1 $MIXER sset 'Capture,2' 90% >/dev/null 2>&1 $MIXER sset 'Capture,3' 90% >/dev/null 2>&1 } set_mute_mic() { $MIXER sset 'Mic' 'off' >/dev/null 2>&1 $MIXER sset 'Front Mic' 'off' >/dev/null 2>&1 $MIXER sset 'Rear Mic' 'off' >/dev/null 2>&1 $MIXER sset 'Capture' nocap >/dev/null 2>&1 $MIXER sset 'Capture,0' nocap >/dev/null 2>&1 $MIXER sset 'Capture,1' nocap >/dev/null 2>&1 $MIXER sset 'Capture,2' nocap >/dev/null 2>&1 $MIXER sset 'Capture,3' nocap >/dev/null 2>&1 } # version must be > 0.9.10 or 1.0 version=$(pulseaudio --version 2>/dev/null | awk '{print $2}' | awk -F"." '{if ((int($2) >= 9) && (int($3) >= 10) || (int($1)>=1)) printf "yes"}') for arg in $1; do case $arg in startrtp-recv) set_volume set_mute_mic if [ ! -z $version ]; then $DAEMONIZE "$PACTL" "start-recv $2" if [ $? = 0 ]; then echo "ok"; else echo "error: starting pulse recv module"; fi else echo "error: pulseaudio version not supported" fi ;; stoprtp-recv) if [ ! -z $version ]; then index=$(pactl list | grep -B1 "module-rtp-recv" | head -1 | awk '{printf $3}' | sed 's/#//g') $DAEMONIZE "$PACTL" "stop-recv $index" if [ $? = 0 ]; then echo "ok"; else echo "error: stopping pulse recv module"; fi else echo "error: pulseaudio version not supported" fi ;; startrtp-send) set_volume set_mic if [ ! -z $version ]; then $DAEMONIZE "$PACTL" "start-send $2" if [ $? = 0 ]; then echo "ok"; else echo "error: starting pulse send module"; fi else echo "error: starting pulse send module, incorrect pulseaudio version" fi ;; stoprtp-send) set_mute_mic if [ ! -z $version ]; then index=$(pactl list | grep -B1 "module-rtp-send" | head -1 | awk '{printf $3}' | sed 's/#//g') $DAEMONIZE "$PACTL" "stop-send $index" if [ $? = 0 ]; then echo "ok"; else echo "error: stopping pulse send module"; fi else echo "error: stopping pulse send module, incorrect pulseaudio version" fi ;; startrtp-chat) set_volume set_mic if [ ! -z $version ]; then $DAEMONIZE "$PACTL" "start-chat $2" if [ $? = 0 ]; then echo "ok"; else echo "error: starting pulse chat mode"; fi else echo "error: starting pulse chat mode, incorrect pulseaudio version" fi ;; stoprtp-chat) set_mute_mic if [ ! -z $version ]; then index_send=$(pactl list | grep -B1 "module-rtp-send" | head -1 | awk '{printf $3}' | sed 's/#//g') index_recv=$(pactl list | grep -B1 "module-rtp-recv" | head -1 | awk '{printf $3}' | sed 's/#//g') $DAEMONIZE "$PACTL" "stop-chat $index_send $index_recv" if [ $? = 0 ]; then echo "ok"; else echo "error: stopping pulse chat mode"; fi else echo "error: stopping pulse chat mode, incorrect pulseaudio version" fi ;; *) echo "error" ;; esac done tcos-0.89.93ubuntu2/xmlrpc/sh/useallmodules.sh0000664000000000000000000000333412260610261016221 0ustar #!/bin/sh # # useallmodules.sh shell script to download allmodules-$(uname -r).squashfs # and mount in /lib/modules/$(uname -r)/ # Copyright (C) 2006-2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # if [ ! -e /conf/tcos.conf ]; then echo -n "error running in standalone" exit 1 fi if [ -f /tmp/allmodules_done ];then echo "OK" exit 0 fi . /scripts/functions . /conf/tcos.conf . /conf/tcos-run-functions allmodules=/mnt/tmp/allmodules.squashfs download_file /tcos/allmodules-$(uname -r).squashfs ${allmodules} if [ "$(if_is_zero ${allmodules})" = "0" ]; then echo "error: allmodules-$(uname -r).squashfs not found, generate it with gentcos -tftp -allmodules" exit 0 fi touch /tmp/allmodules_done # mount mount -r -o loop -t squashfs ${allmodules} /lib/modules/$(uname -r)/ # remount mount_unionfs /mnt/.ram-modules /mnt/.modules /lib/modules/$(uname -r) # FIXME discover is not avalaible anymore # reload modules.... if [ -x /usr/bin/discover-modprobe ]; then discover-modprobe -nv >/dev/null 2>&1 fi echo "OK" exit 0 tcos-0.89.93ubuntu2/xmlrpc/sh/tcos-pam-usb.sh0000664000000000000000000001055412260610261015657 0ustar #!/bin/sh # # tcos-pam-usb.sh # Copyright (C) 2006-2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # # TCOS pam-usb helper # ALLOW_NOT_REMOVABLE=1 UDEVINFO="/usr/bin/udevinfo" [ -x /sbin/udevadm ] && UDEVINFO="/sbin/udevadm info" export DISPLAY=:0 if [ -e /conf/tcos-run-functions ]; then # running in thin client STANDALONE=0 export XAUTHORITY=/root/.Xauthority else echo "error: tcos-pam-usb not allowed in standalone" exit 1 fi mount_uuid() { if [ ! -e /dev/disk/by-uuid/$1 ]; then echo "error: device UUID=$1 not found" return fi # create mount dir [ ! -d /mnt/$1 ] && mkdir /mnt/$1 # umount if mounted grep -q /mnt/$1 /proc/mounts && umount /mnt/$1 mount -t$(get_filesystem /dev/disk/by-uuid/$1 --only) /dev/disk/by-uuid/$1 /mnt/$1 if [ $? = 0 ]; then echo "ok" else echo "error: mounting device UUID=$1" fi #cat /dev/null > /tmp/tcos-udevd.log } umount_uuid() { grep -q "$1" /proc/mounts || return umount /mnt/$1 >> /tmp/initramfs.debug 2>&1 #cat /dev/null > /tmp/tcos-udevd.log } for arg in $1; do case $arg in initusb) if [ -x /bin/ltspfs-set-xprop ]; then /bin/ltspfs-set-xprop now 2>&1 >> /tmp/initramfs.debug fi echo "ok" ;; mountusb) mount_uuid $2 ;; checkdevice) UUID="" # receive something like this: UUID=C0C3-B657#MODEL=Flash Disk#VENDOR=ORP#SERIAL=ORP_Flash_Disk_293424206251-0:0 data=$(echo "$2" | sed 's/#/\n/g' | sed 's/ /_/g') for line in $data; do export $line done if [ "$UUID" = "" ]; then echo "error: UUID not set" exit 0 fi DEVICE=$(basename $(readlink /dev/disk/by-uuid/$UUID)) if [ "$MODEL" != "$($UDEVINFO --query=env --name=$DEVICE| awk -F"=" '/^ID_MODEL=/ {print $2}')" ]; then echo "error: MODEL not match" exit 0 fi if [ "$VENDOR" != "$($UDEVINFO --query=env --name=$DEVICE| awk -F"=" '/^ID_VENDOR=/ {print $2}')" ]; then echo "error: VENDOR not match" exit 0 fi if [ "$SERIAL" != "$($UDEVINFO --query=env --name=$DEVICE| awk -F"=" '/^ID_SERIAL=/ {print $2}')" ]; then echo "error: SERIAL not match" exit 0 fi echo "ok" ;; readdevices) data="" for dev in $(find /sys/block/ -name "[sh]d?" -exec basename {} \;);do if ( $UDEVINFO --query=env --name=$dev 2>/dev/null | grep -q "ID_TYPE=disk" ) && \ ( $UDEVINFO --query=env --name=$dev 2>/dev/null | grep -q "ID_BUS=usb" ) ; then # we have a USB disk search por partitions for part in $(find /dev/${dev}* -not -name "${dev}" -exec basename {} \;); do # read udev data and put in data var vendor=$($UDEVINFO --query=env --name=$part | awk -F"=" '/ID_VENDOR=/ {print $2}') model=$($UDEVINFO --query=env --name=$part | awk -F"=" '/ID_MODEL=/ {print $2}') serial=$($UDEVINFO --query=env --name=$part | awk -F"=" '/ID_SERIAL=/ {print $2}') uuid=$($UDEVINFO --query=env --name=$part | awk -F"=" '/ID_FS_UUID=/ {print $2}') data="$data|UUID=$uuid#MODEL=$model#VENDOR=$vendor#SERIAL=$serial#DEVICE=/dev/${part}" done fi done echo -n "$data" ;; umountusb) umount_uuid $2 echo "ok" ;; checkuuid) if [ ! -e "/dev/disk/by-uuid/$2" ]; then echo "off" else echo "on" fi ;; *) echo "error: arguments error" ;; esac done tcos-0.89.93ubuntu2/xmlrpc/sh/tcos-ftpclient0000664000000000000000000001061712260610261015672 0ustar #!/usr/bin/env python # -*- coding: UTF-8 -*- ########################################################################## # TcosMonitor writen by MarioDebian # # TcosMonitor version __VERSION__ # # Copyright (c) 2006 Mario Izquierdo # # """Demo taken from M2Crypto.ftpslib's FTP/TLS client. # # This client interoperates with M2Crypto's Medusa-based FTP/TLS # server as well as Peter Runestig's patched-for-TLS OpenBSD FTP # server. # # Copyright (c) 1999-2004 Ng Pheng Siong. All rights reserved.""" # # 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. ########################################################################### import M2Crypto import os import sys import xml.sax.saxutils import getopt import subprocess, threading debug=False def print_debug(txt): if debug: print >> sys.stderr, "tcos-ftpclient DEBUG: %s"%(txt) try: opts, args = getopt.getopt(sys.argv[1:], ":hd", ["dir=", "server=", "open=", "debug"]) except getopt.error, msg: print msg print "for command line options use tcos-ftpclient --help" sys.exit(2) listOfFiles = [] SERVER = None LOCAL_DIR = None OPEN = False #TIME_FORMAT = "%y%m%d" # YYMMDD, like 030522 for o, a in opts: if o == "--dir": LOCAL_DIR=a if o == "--server": SERVER=a if o == "--open": if a == "True": OPEN=True else: OPEN=False if o == "--debug": debug=True def __escape__(self, txt): return xml.sax.saxutils.escape(txt, self.__dic__) def makeListOfFiles(remoteFileName): # Strips the file name from a line of a # directory listing, and gets file from the # server. Depends on filenames # with no embedded spaces or extra dots. listOfFiles.append(remoteFileName) def cleanproc(proc): try: os.waitpid(proc.pid, os.WCONTINUED) except os.error, err: print_debug("OSError exception: %s" %err) def open_files(filename): if os.path.isfile("/usr/bin/gnome-open"): cmd="/usr/bin/gnome-open %s" %filename elif os.path.isfile("/usr/bin/xdg-open"): cmd="/usr/bin/xdg-open %s" %filename else: return print_debug ( "open_files() %s" %(cmd) ) p = subprocess.Popen(cmd, shell=True, close_fds=True) try: th=threading.Thread(target=cleanproc, args=(p,) ) th.start() print_debug("Threads count: %s" %threading.activeCount()) except Exception, err: print_debug ( "open_files() error, error=%s" %(err) ) return def active(): ctx = M2Crypto.SSL.Context('sslv23') try: f = M2Crypto.ftpslib.FTP_TLS(ssl_ctx=ctx) f.connect(SERVER, 8997) except Exception: sys.exit(2) f.auth_tls() f.set_pasv(0) f.login('anonymous', '') f.prot_p() #f.retrlines('LIST') f.retrlines('NLST', makeListOfFiles) if LOCAL_DIR == None: print "Incorrect path to download files" sys.exit(2) if not os.path.isdir(LOCAL_DIR): os.mkdir(LOCAL_DIR) for remoteFileName in listOfFiles: filename=os.path.join(LOCAL_DIR,remoteFileName) if os.path.isfile(filename): print_debug("TCOS-FTPCLIENT: filename=%s already exists." %(remoteFileName)) continue localFile=file(filename, 'wb') print_debug("TCOS-FTPCLIENT: Getting filename=%s to dir=%s" %(remoteFileName, LOCAL_DIR)) try: f.retrbinary('RETR %s' % remoteFileName, localFile.write) localFile.flush() localFile.close() except Exception: pass if OPEN: open_files(filename) f.quit() if __name__ == '__main__': M2Crypto.threading.init() active() M2Crypto.threading.cleanup() tcos-0.89.93ubuntu2/xmlrpc/sh/pactl-controller.sh0000664000000000000000000001154212260610261016627 0ustar #!/bin/sh # # pactl-controller.sh # Copyright (C) 2006,2007,2008 mariodebian at gmail # Copyright (C) 2006,2007,2008 vidal_joshur at gva.es # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # # pactl controller script for TCOS # MIXER="/usr/lib/tcos/tmixer -c 0 " VOLUME=85 VOLUME_MIC=75 case $1 in start-server) MASTER=$(/usr/lib/tcos/soundctl.sh --getlevel Master 2>/dev/null | sed 's/%//g') MASTER_FRONT=$(/usr/lib/tcos/soundctl.sh --getlevel "Master Front" 2>/dev/null | sed 's/%//g') PCM=$(/usr/lib/tcos/soundctl.sh --getlevel PCM 2>/dev/null | sed 's/%//g') FRONT=$(/usr/lib/tcos/soundctl.sh --getlevel Front 2>/dev/null | sed 's/%//g') MIC=$(/usr/lib/tcos/soundctl.sh --getlevel Mic 2>/dev/null | sed 's/%//g') FRONT_MIC=$(/usr/lib/tcos/soundctl.sh --getlevel "Front Mic" 2>/dev/null | sed 's/%//g') REAR_MIC=$(/usr/lib/tcos/soundctl.sh --getlevel "Rear Mic" 2>/dev/null | sed 's/%//g') [ "$MASTER" = "unknow" ] && MASTER=$VOLUME [ "$MASTER_FRONT" = "unknow" ] && MASTER_FRONT=$VOLUME [ "$PCM" = "unknow" ] && PCM=$VOLUME [ "$FRONT" = "unknow" ] && FRONT=$VOLUME [ "$MIC" = "unknow" ] && MIC=$VOLUME_MIC [ "$FRONT_MIC" = "unknow" ] && FRONT_MIC=$VOLUME_MIC [ "$REAR_MIC" = "unknow" ] && REAR_MIC=$VOLUME_MIC $MIXER sset 'PCM' 'on' >/dev/null 2>&1 $MIXER sset 'Master' 'on' >/dev/null 2>&1 $MIXER sset 'Master Front' 'on' >/dev/null 2>&1 $MIXER sset 'Front' 'on' >/dev/null 2>&1 [ $PCM -lt $VOLUME ] && $MIXER sset 'PCM' $VOLUME >/dev/null 2>&1 [ $MASTER -lt $VOLUME ] && $MIXER sset 'Master' $VOLUME >/dev/null 2>&1 [ $MASTER_FRONT -lt $VOLUME ] && $MIXER sset 'Master Front' $VOLUME >/dev/null 2>&1 [ $FRONT -lt $VOLUME ] && $MIXER sset 'Front' $VOLUME >/dev/null 2>&1 $MIXER sset 'Mic' 'on' >/dev/null 2>&1 $MIXER sset 'Front Mic' 'on' >/dev/null 2>&1 $MIXER sset 'Rear Mic' 'on' >/dev/null 2>&1 $MIXER sset 'Mic Boost (+20dB)' 'off' >/dev/null 2>&1 $MIXER sset 'Mic Boost' 'off' >/dev/null 2>&1 $MIXER sset 'Front Mic Boost' 'off' >/dev/null 2>&1 $MIXER sset 'Rear Mic Boost' 'off' >/dev/null 2>&1 $MIXER sset 'Mic Boost (+20dB)' 0% >/dev/null 2>&1 $MIXER sset 'Mic Boost' 0% >/dev/null 2>&1 $MIXER sset 'Front Mic Boost' 0% >/dev/null 2>&1 $MIXER sset 'Rear Mic Boost' 0% >/dev/null 2>&1 $MIXER sset 'Mic' $VOLUME_MIC >/dev/null 2>&1 $MIXER sset 'Front Mic' $VOLUME_MIC >/dev/null 2>&1 $MIXER sset 'Rear Mic' $VOLUME_MIC >/dev/null 2>&1 $MIXER sset 'Capture' cap >/dev/null 2>&1 $MIXER sset 'Capture,0' cap >/dev/null 2>&1 $MIXER sset 'Capture,1' cap >/dev/null 2>&1 $MIXER sset 'Capture,2' cap >/dev/null 2>&1 $MIXER sset 'Capture,3' cap >/dev/null 2>&1 $MIXER sset 'Capture' 90% >/dev/null 2>&1 $MIXER sset 'Capture,0' 90% >/dev/null 2>&1 $MIXER sset 'Capture,1' 90% >/dev/null 2>&1 $MIXER sset 'Capture,2' 90% >/dev/null 2>&1 $MIXER sset 'Capture,3' 90% >/dev/null 2>&1 ;; stop-server) $MIXER sset 'Mic' 'off' >/dev/null 2>&1 $MIXER sset 'Front Mic' 'off' >/dev/null 2>&1 $MIXER sset 'Rear Mic' 'off' >/dev/null 2>&1 $MIXER sset 'Capture' nocap >/dev/null 2>&1 $MIXER sset 'Capture,0' nocap >/dev/null 2>&1 $MIXER sset 'Capture,1' nocap >/dev/null 2>&1 $MIXER sset 'Capture,2' nocap >/dev/null 2>&1 $MIXER sset 'Capture,3' nocap >/dev/null 2>&1 ;; start-recv) pactl load-module module-rtp-recv sap_address=$2 >/dev/null 2>&1 ;; stop-recv) pactl unload-module $2 >/dev/null 2>&1 ;; start-send) pactl load-module module-rtp-send format=s16be channels=2 rate=44100 source=@DEFAULT_SOURCE@ loop=0 destination=$2 >/dev/null 2>&1 ;; stop-send) pactl unload-module $2 >/dev/null 2>&1 ;; start-chat) pactl load-module module-rtp-send format=s16be channels=2 rate=44100 source=@DEFAULT_SOURCE@ loop=0 destination=$2 >/dev/null 2>&1 pactl load-module module-rtp-recv sap_address=$2 >/dev/null 2>&1 ;; stop-chat) pactl unload-module $2 >/dev/null 2>&1 pactl unload-module $3 >/dev/null 2>&1 ;; esac exit 0 tcos-0.89.93ubuntu2/xmlrpc/sh/tcos-dbus.py0000775000000000000000000000431712260610261015271 0ustar #!/usr/bin/python # # Based on StudentControlPanel of Ubuntu # # tcos-dbus.py # => shell script t return some /proc info # Copyright (C) 2006,2007 StudentControlPanel # Copyright (C) 2006-2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # import signal import dbus import dbus.service import dbus.glib import getopt import sys class TcosObject(dbus.service.Object): def __init__(self, bus_name, object_path="/TCOSObject"): dbus.service.Object.__init__(self, bus_name, object_path) @dbus.service.signal("com.consoltux.TcosMonitor.Comm", signature="aas") def GotSignal(self, message): pass system_bus = dbus.SystemBus() name = dbus.service.BusName("com.consoltux.TcosMonitor", bus=system_bus) dbus_iface = TcosObject(name) try: opts, args = getopt.getopt(sys.argv[1:], ":hd", ["help", "debug", "auth=", "username=", "type=", "text="]) except getopt.error, msg: print msg sys.exit(2) username=None # process options for o, a in opts: if o in ("-d", "--debug"): debug = True if o == "--username": username = a if o == "--type": type = a if o == "--text": text = a if o == "--auth": try: admin, passwd = a.split(":") except: print "error: bad username or password" sys.exit(1) if username and (type in ["mess", "exec", "kill", "killall", "sendfiles"]) and text : response=dbus_iface.GotSignal([ [admin, passwd], [username] , [type] , [text] ]) print "ok" else: print "error: need more arguments..." tcos-0.89.93ubuntu2/xmlrpc/sh/update-tcospasswd.sh0000664000000000000000000000670712260610261017024 0ustar #!/bin/bash # # update-tcospasswd.sh shell script to generate tcospasswd # to PXES, LTSP, TCOS or STANDALONE # Copyright (C) 2006-2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # if [ "$(whoami)" != "root" ]; then echo "Error: Need to exec as root user." exit 1 fi _is_ltsp=$(echo /opt/ltsp*) _is_pxes=$(echo /opt/pxes*) _is_tcos=$(echo /etc/tcos) _username="" _passwd="" _arq="" _fpass="" _silent=0 _noencrypted=0 _secret=0 if [ -d ${_is_ltsp} ]; then ltsp=1 fi if [ -d ${_is_pxes} ]; then pxes=1 fi if [ -d ${_is_tcos} ]; then tcos=1 fi for x in $@; do case $x in --user=*) _username="${x#--user=}" ;; --passwd=*) _passwd="${x#--passwd=}" ;; --arq=*) _arq="${x#--arq=}" ;; --file=*) _fpass=${x#--file=} ;; --silent) _silent=1 ;; --noencrypted) _noencrypted=1 ;; --tcosmonitor-secret) _secret=1 ;; esac done make_passwd(){ $(which tcospasswd) $1 } if [ -z $_arq ] && [ -z $_fpass ] && [ $_secret -eq 0 ]; then echo "Arquitecture to update password:" echo "" if [ ${ltsp} ]; then echo " * LTSP" fi if [ ${pxes} ]; then echo " * PXES" fi if [ ${tcos} ]; then echo " * TCOS" fi echo " * STANDALONE" echo -n " : " read _arq if [ "$_arq" = "LTSP" ]; then _fpass=/opt/ltsp/i386/etc/tcospasswd elif [ "$_arq" = "PXES" ]; then _fpass=$(echo /opt/pxes*)/stock/dist/etc/tcospasswd elif [ "$_arq" = "TCOS" ]; then _fpass=/etc/tcospasswd elif [ "$_arq" = "STANDALONE" ]; then _fpass=/etc/tcospasswd else echo "Error: Arquitecture: ${_arq} not supported, please write LTSP, PXES, TCOS or STANDALONE" exit 1 fi fi if [ -z $_username ];then echo -n "Username (usually root): " read _username fi if [ -z $_passwd ];then echo -n "TCOS Password: " read _passwd fi if [ $_secret -eq 1 ];then _fpass=/etc/tcos/secrets/tcosmonitor-secret [ ! -d $(dirname ${_fpass}) ] && exit 0 echo "$_username:$_passwd" > ${_fpass} chown -f root:tcos ${_fpass} chmod -f 640 ${_fpass} exit 0 fi if [ $_noencrypted -eq 0 ];then _passwd="$(make_passwd $_passwd)" fi string="$_username:$_passwd" if [ $_silent -eq 0 ];then if [ ! -d $(dirname ${_fpass}) ]; then echo "Error: $(dirname ${_fpass}) don't exists." exit 1 fi echo -n "I will write this file: ${_fpass} Continue? [Y/n] " read _ans if [ "${_ans}" != "n" ]; then echo ${string} > ${_fpass} chown -f root:tcos ${_fpass} chmod -f 640 ${_fpass} echo "" echo "In case of PXES or TCOS (not STANDALONE), please update the" echo "boot image with pxesconfig or gentcos." echo "Done." exit 0 fi else echo ${string} > ${_fpass} chown -f root:tcos ${_fpass} chmod -f 640 ${_fpass} exit 0 fi echo "Aborted." exit 1 tcos-0.89.93ubuntu2/xmlrpc/sh/restartx.sh0000664000000000000000000000150712260610261015217 0ustar #!/bin/sh # restartx.sh shell script to restart # Copyright (C) 2006-2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # $(which restartxorg) & exit 0 tcos-0.89.93ubuntu2/xmlrpc/sh/vnc-controller.sh0000664000000000000000000001117712260610261016316 0ustar #!/bin/sh # # vnc-controller.sh # Copyright (C) 2006-2011 mariodebian at gmail # Copyright (C) 2006,2007,2008 vidal_joshur at gva.es # # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # # VNC controller script for TCOS # # examples: # vnc-controller.sh startserver "authfile" # vnc-controller.sh startserver "authfile" "user:pass" # # vnc-controller.sh startscale "authfile" "__scaleX__x__scaleY__" # vnc-controller.sh startscale "authfile" "__scaleX__x__scaleY__" "user:pass" # # vnc-controller.sh stopserver # vnc-controller.sh stopserver "user:pass" # # vnc-controller.sh startclient "ip" "authfile" # vnc-controller.sh startclient "ip" "authfile" "user:pass" # # vnc-controller.sh stopclient # # vnc-controller.sh genpass "pass" "file" # vnc-controller.sh genpass "pass" "file" "user:pass" export DISPLAY=:0 if [ -e /conf/tcos-run-functions ]; then # running in thin client STANDALONE=0 export XAUTHORITY=/root/.Xauthority else STANDALONE=1 #STANDALONE_USER=$(w | awk '{ if ($3 == ":0" || $2 == ":0") print $1 }' |head -1) STANDALONE_USER=$(/usr/lib/tcos/tcos-last --user 2>/dev/null) if [ "${STANDALONE_USER}" = "" ]; then echo "error: no standalone user connected"; exit 1; fi DBUS_HANDLER="/usr/lib/tcos/tcos-dbus-helper --username=${STANDALONE_USER} " fi REOPEN="" if x11vnc --help| grep -q "^\-reopen"; then REOPEN=" -reopen " fi for arg in $1; do case $arg in startserver) cmd=" -shared -noshm -forever $REOPEN -rfbauth $2" if [ $STANDALONE = 0 ]; then killall -SIGKILL x11vnc /sbin/daemonize.sh "x11vnc" "$cmd" if [ $? = 0 ]; then echo "ok"; else echo "error: starting vnc server"; fi else $DBUS_HANDLER --auth=$3 --type=exec --text="killall -s KILL x11vnc" 2>/dev/null # this returns ok if can send dbus msg, no need to parse $DBUS_HANDLER --auth=$3 --type=exec --text="x11vnc $cmd" 2>/dev/null fi ;; startscale) cmd=" -shared -noshm -forever $REOPEN -rfbauth $2 -scale $3" if [ $STANDALONE = 0 ]; then killall -SIGKILL x11vnc /sbin/daemonize.sh "x11vnc" "$cmd" if [ $? = 0 ]; then echo "ok"; else echo "error: starting vnc server"; fi else $DBUS_HANDLER --auth=$4 --type=exec --text="killall -s KILL x11vnc" 2>/dev/null # this returns ok if can send dbus msg, no need to parse $DBUS_HANDLER --auth=$4 --type=exec --text="x11vnc $cmd" 2>/dev/null fi ;; stopserver) if [ $STANDALONE = 0 ]; then killall -SIGKILL x11vnc # killall return != 0 if no proccess killed #if [ $? = 0 ]; then echo "ok"; else echo "error: killing vnc server"; fi echo "ok" else $DBUS_HANDLER --auth=$2 --type=exec --text="killall -s KILL x11vnc" fi ;; startclient) # exit if pass file not exists if [ ! -f "$3" ]; then echo "error: no passwd file"; exit 1; fi if [ $STANDALONE = 0 ]; then /sbin/daemonize.sh "xtightvncviewer" "$2 -viewonly -fullscreen -passwd $3" if [ $? = 0 ]; then echo "ok"; else echo "error: starting xtightvncviewer"; fi else $DBUS_HANDLER --auth=$4 --type=exec --text="xtightvncviewer $2 -viewonly -fullscreen -passwd $3" fi ;; stopclient) if [ $STANDALONE = 0 ]; then killall -SIGKILL xtightvncviewer # killall return != 0 if no proccess killed #if [ $? = 0 ]; then echo "ok"; else echo "error: killing vnc server"; fi echo "ok" else $DBUS_HANDLER --auth=$2 --type=exec --text="killall -s KILL xtightvncviewer" fi ;; genpass) # create passwd file x11vnc -storepasswd "$2" "$3" > /dev/null 2>&1 if [ $? = 0 ]; then echo "ok"; else echo "error"; fi # set read to all chmod go+r "$3" ;; *) echo "error: unknow action" ;; esac done tcos-0.89.93ubuntu2/xmlrpc/sh/getinfo.sh0000664000000000000000000001524212260610261014777 0ustar #!/bin/sh # # getinfo.sh part of tcosxmlrpc # => shell script t return some /proc info # Copyright (C) 2006-2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # IFCONFIG="busybox ifconfig" # not DHCP try with static ip for dev in $(ls /sys/class/net/|grep -v lo|grep -v sit0|grep -v vmnet|grep -v wmaster|grep -v vbox); do LINK=$(cat /sys/class/net/$dev/carrier 2>/dev/null) if [ "$LINK" = "1" ] && \ [ "$(busybox ifconfig $dev | grep 'inet addr:'| awk '{print $2}'| awk -F ":" '{print $2}')" != "" ]; then IFDEV=$dev break fi done if [ "$IFDEV" = "" ]; then IFDEV="eth0" fi if [ -d "/sys/class/net/tun0" ]; then # use tun0 if openvpn is running IFDEV="tun0" fi if [ -d "/sys/class/net/tap0" ]; then # use tun0 if openvpn is running IFDEV="tap0" fi KVER=$(uname -r) TCOS_CONF=/conf/tcos.conf STANDALONE=0 if [ ! -e ${TCOS_CONF} ]; then TCOS_CONF=/var/lib/tcos/standalone/etc/tcos.conf STANDALONE=1 export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/lib/tcos fi usage() { echo "getinfo.sh help" echo " -i VARNAME - show value of VARNAME" echo " -l - show list of all vars" echo " -d NET_DEVICE - change net device, default(${IFDEV})" echo " -t - get thin client type (tcos, pxes, ltsp, unknow)" echo " -p - list all process running" echo " -h (this help)" } if [ $# -lt 1 ]; then usage exit 0 fi show_vars() { awk '/^CPU/ { gsub("\)", "", $1) ; print $1}' $0 2>/dev/null awk '/^RAM/ { gsub("\)", "", $1) ; print $1}' $0 2>/dev/null awk '/^SWAP/ { gsub("\)", "", $1) ; print $1}' $0 2>/dev/null awk '/^TCOS/ { gsub("\)", "", $1) ; print $1}' $0 2>/dev/null awk '/^KERNEL/ { gsub("\)", "", $1) ; print $1}' $0 2>/dev/null awk '/^NET/ { gsub("\)", "", $1) ; print $1}' $0 2>/dev/null awk '/^MODULES/ { gsub("\)", "", $1) ; print $1}' $0 2>/dev/null } get_type() { if [ -f ${TCOS_CONF} ]; then if [ "${STANDALONE}" = "0" ]; then echo "tcos" else if [ -d /dev/usbseat ]; then echo "multiseat" else echo "standalone" fi fi elif [ -f /var/run/pxes/env ]; then echo "pxes" elif [ -f /etc/lts.conf ]; then echo "ltsp" else echo "unknow" fi } modules_notfound() { #discover_modules=$(grep Discover /tmp/initramfs.debug 2>/dev/null | awk -F ":" '{print $2}') discover_modules=$(/bin/pcimodules 2> /dev/null | grep -E -v '^ *$') loaded_modules=$(lsmod| grep -v ^Module| awk '{print $1}'| sed s/'\n'/''/g) loaded="" not_found="" for mod in ${loaded_modules}; do loaded="${loaded} ${mod}" done for mod in ${discover_modules}; do #mod2=$(echo ${mod} | sed s/"-"/"_"/g) #if [ $(grep -c ${mod2} /proc/modules) = 0 ]; then # not_found="${not_found} ${mod2}" #fi if [ ! -f "$(find /lib/modules/${KVER}/ -name "$mod.ko")" ]; then not_found="${not_found} ${mod}" fi done if [ "${not_found}" != "" ]; then echo "${not_found}" else echo "OK" fi } get_line() { echo $(head -$1 /tmp/ps.aux | tail -1) } get_process() { if [ "$STANDALONE" = "1" ]; then #user=$(w | awk '{ if ($3 == ":0" || $2 == ":0") print $1 }') user=$(/usr/lib/tcos/tcos-last --userid 2>/dev/null) if [ "$user" = "root" ]; then echo "PID COMMAND" > /tmp/ps.aux echo "66000 User root not allowed to show process" >> /tmp/ps.aux else LANG=C ps U ${user} -o pid,command | /usr/lib/tcos/clean_string.sh > /tmp/ps.aux fi else # FIXME Thin client need clean_string.sh??? ps aux > /tmp/ps.aux fi num_lines=$(cat /tmp/ps.aux | wc -l) for i in $(seq 1 $num_lines); do echo -n "$(get_line $i)|" done echo rm -f /tmp/ps.aux } #while getopts "d:i:hv:o:p:m:" options while getopts "tpld:i:h" options do case $options in h) usage exit 0 ;; i) VARNAME=$OPTARG ;; d) IFDEV=$OPTARG ;; l) show_vars ;; t) get_type ;; p) get_process ;; *) usage exit 0 ;; esac done IFCMD="${IFCONFIG} ${IFDEV} " case $VARNAME in # CPU methods CPU_MODEL) grep "^model name" /proc/cpuinfo | awk -F ": " '{print $2}' |head -1 ;; CPU_SPEED) grep "^cpu MHz" /proc/cpuinfo | awk -F ": " '{print $2" MHz"}' | head -1 ;; CPU_VENDOR) grep "^vendor_id" /proc/cpuinfo | awk -F ": " '{print $2}' | head -1 ;; # RAM methods RAM_TOTAL) grep ^MemTotal /proc/meminfo | awk '{print $2" "$3}' ;; RAM_ACTIVE) grep ^Active /proc/meminfo | awk '{print $2" "$3}' ;; RAM_FREE) busybox free| grep "Mem:"| awk '{print $4" kB"}' ;; RAM_USED) busybox free| grep "Mem:"| awk '{print $3" kB"}' ;; # SWAP methods SWAP_AVALAIBLE) grep -c ^/ /proc/swaps ;; SWAP_TOTAL) busybox free| grep "Swap:"| awk '{print $2" kB"}' ;; SWAP_USED) busybox free| grep "Swap:"| awk '{print $3" kB"}' ;; SWAP_FREE) busybox free| grep "Swap:"| awk '{print $4" kB"}' ;; # DATE and version methods TCOS_DATE) LANG=C date ;; TCOS_GENERATION_DATE) grep ^TCOS_DATE ${TCOS_CONF}| awk -F "=" '{print $2}' | sed s/'"'//g ;; TCOS_VERSION) grep ^TCOS_VERSION ${TCOS_CONF}| awk -F "=" '{print $2}' |sed s/'"'//g ;; TCOS_UPTIME) uptime ;; # KERNEL methods KERNEL_VERSION) busybox uname -r ;; KERNEL_COMPLETE_VERSION) busybox uname -a ;; # NETWORK methods NETWORK_HOSTNAME) hostname ;; NETWORK_IP) ${IFCMD} | grep "inet addr:"| awk '{print $2}'| awk -F ":" '{print $2}' ;; NETWORK_IFACE) echo ${IFDEV} ;; NETWORK_MAC) ${IFCMD} | grep "HWaddr"| awk '{print $5}' ;; NETWORK_MASK) ${IFCMD} | grep "inet addr:"| awk '{print $4}'| awk -F ":" '{print $2}' ;; NETWORK_RX) ${IFCMD} |grep "RX bytes"| awk '{print $3" "$4}'| sed s/'('//g | sed s/')'//g ;; NETWORK_TX) ${IFCMD} |grep "TX bytes"| awk '{print $7" "$8}'| sed s/'('//g | sed s/')'//g ;; # MODULES methods MODULES_LOADED) for module in $(cat /proc/modules| awk '{print $1}'); do echo -n "$module " done echo ;; MODULES_NOTFOUND) modules_notfound ;; SCREENSIZE) DISPLAY=:0 screensize ;; esac tcos-0.89.93ubuntu2/xmlrpc/sh/vlc-controller.sh0000664000000000000000000000460312260610261016310 0ustar #!/bin/sh # # vnc-controller.sh # Copyright (C) 2006,2007,2008 vidal_joshur at gva.es # Copyright (C) 2006-2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # # VLC controller script for TCOS # # if [ ! -e /dev/dsp ] && [ ! -d /proc/asound ]; then echo "error: not soundcard" exit 1 fi export DISPLAY=:0 if [ -e /conf/tcos-run-functions ]; then # running in thin client STANDALONE=0 export XAUTHORITY=/root/.Xauthority MASTER=$(/sbin/soundctl.sh --getlevel Master 2>/dev/null | sed 's/%//g') MASTER_FRONT=$(/sbin/soundctl.sh --getlevel "Master Front" 2>/dev/null | sed 's/%//g') PCM=$(/sbin/soundctl.sh --getlevel PCM 2>/dev/null | sed 's/%//g') FRONT=$(/sbin/soundctl.sh --getlevel Front 2>/dev/null | sed 's/%//g') MIXER="tmixer -c 0 " else MASTER=$(/usr/lib/tcos/soundctl.sh --getlevel Master 2>/dev/null | sed 's/%//g') MASTER_FRONT=$(/usr/lib/tcos/soundctl.sh --getlevel "Master Front" 2>/dev/null | sed 's/%//g') PCM=$(/usr/lib/tcos/soundctl.sh --getlevel PCM 2>/dev/null | sed 's/%//g') FRONT=$(/usr/lib/tcos/soundctl.sh --getlevel Front 2>/dev/null | sed 's/%//g') MIXER="/usr/lib/tcos/tmixer -c 0 " fi [ "$MASTER" = "unknow" ] && MASTER=100 [ "$MASTER_FRONT" = "unknow" ] && MASTER_FRONT=100 [ "$PCM" = "unknow" ] && PCM=100 [ "$FRONT" = "unknow" ] && FRONT=100 $MIXER sset 'PCM' 'on' >/dev/null 2>&1 $MIXER sset 'Master' 'on' >/dev/null 2>&1 $MIXER sset 'Master Front' 'on' >/dev/null 2>&1 $MIXER sset 'Front' 'on' >/dev/null 2>&1 [ $PCM -lt ${1} ] && $MIXER sset 'PCM' ${1} >/dev/null 2>&1 [ $MASTER -lt ${1} ] && $MIXER sset 'Master' ${1} >/dev/null 2>&1 [ $MASTER_FRONT -lt ${1} ] && $MIXER sset 'Master Front' ${1} >/dev/null 2>&1 [ $FRONT -lt ${1} ] && $MIXER sset 'Front' ${1} >/dev/null 2>&1 tcos-0.89.93ubuntu2/xmlrpc/rtp.c0000664000000000000000000000454212260610261013350 0ustar /* * rtp.c part of tcosxmlrpc * => method to start/stop rtp sound receive * Copyright (C) 2006,2007,2008 mariodebian at gmail * Copyright (C) 2006,2007,2008 vidal_joshur at gva.es * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "common.h" #include "debug.h" #include "validate.h" #include "rtp.h" #if NEWAPI xmlrpc_value *tcos_rtp(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_rtp(xmlrpc_env *env, xmlrpc_value *in, void *ud) #endif { FILE *fp; char line[BIG_BUFFER]; char *action; char *broadcast; char *user; char *pass; char *login_ok; char cmd[BIG_BUFFER]; char *fret; UNUSED(fret); /* read what info search */ xmlrpc_parse_value(env, in, "(ssss)", &action, &broadcast, &user, &pass); if (env->fault_occurred) return xmlrpc_build_value(env, "s", "params error"); /* need login first */ login_ok=validate_login(user,pass); if( strcmp(login_ok, LOGIN_OK ) != 0 ) return xmlrpc_build_value(env, "s", login_ok ); dbgtcos("tcosxmlrpc::tcos_rtp() login ok, action=%s, broadcast=%s, user=%s, pass=**notshow**\n", action, broadcast, user); #ifdef IS_STANDALONE dbgtcos("tcosxmlrpc::tcos_rtp() standalone\n"); #else dbgtcos("tcosxmlrpc::tcos_rtp() thin client\n"); #endif /* prepare action */ sprintf( cmd , "%s %s %s %s:%s", RTP_CONTROLLER, action, broadcast, user, pass ); dbgtcos("tcosxmlrpc::tcos_rtp() cmd=\"%s\"\n", cmd); fp=(FILE*)popen(cmd, "r"); /* put error in line */ strncpy(line, RTP_ERROR, BIG_BUFFER); fret=fgets( line, sizeof line, fp); remove_line_break(line); pclose(fp); dbgtcos("tcosxmlrpc::tcos_rtp() line=\"%s\"\n", line); return xmlrpc_build_value(env, "s", line ); } tcos-0.89.93ubuntu2/xmlrpc/simple-methods.c0000664000000000000000000000525312260610261015475 0ustar /* * simple-methods.c part of tcosxmlrpc * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* tcosxmlrpc simple methods */ #include "common.h" #include "debug.h" #include "validate.h" #if NEWAPI xmlrpc_value *tcos_version(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_version(xmlrpc_env *env, xmlrpc_value *in, void *ud) #endif { dbgtcos("tcosxmlrpc::tcos_version() %s\n", VERSION); return xmlrpc_build_value(env, "s", VERSION); } #if NEWAPI xmlrpc_value *tcos_echo(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_echo(xmlrpc_env *env, xmlrpc_value *in, void *ud) #endif { char *s; size_t *len; xmlrpc_parse_value(env, in, "(s#)", &s, &len); dbgtcos("tcosxmlrpc::tcos_echo() %s\n", s); return xmlrpc_build_value(env, "s", s); } #if NEWAPI xmlrpc_value *tcos_status(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_status (xmlrpc_env *env, xmlrpc_value *in, void *user_data) #endif { FILE *fp=NULL; char *app=NULL; char cmd[BUFF_SIZE]; char ret[BUFF_SIZE]; int fret; UNUSED(fret); dbgtcos("tcosxmlrpc::tcos_status() Init \n"); /* Parse app string */ xmlrpc_parse_value(env, in, "(s)", &app); if (env->fault_occurred) return xmlrpc_build_value(env, "s", "params error"); dbgtcos("tcosxmlrpc::tcos_status() pidof %s\n", app); snprintf( (char*) &cmd, BUFF_SIZE, "pidof %s| grep -c \"[1234567890]\"",app); dbgtcos("tcosxmlrpc::tcos_status() exec cmd=\"%s\"\n", cmd); fp=(FILE*)popen(cmd, "r"); if (env->fault_occurred) { pclose(fp); return xmlrpc_build_value(env, "s", "exec error"); } dbgtcos("tcosxmlrpc::tcos_status() reading from fp pointer\n"); fret=fscanf(fp, "%s", ret); dbgtcos( "tcosxmlrpc::tcos_status() ret value=%s\n", ret); pclose(fp); if (ret != NULL) return xmlrpc_build_value(env, "s", ret); else return xmlrpc_build_value(env, "s", "error"); } tcos-0.89.93ubuntu2/xmlrpc/sound.c0000664000000000000000000000566512260610261013702 0ustar /* * sound.c part of tcosxmlrpc * => return all sound channels and set/get levels * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "common.h" #include "debug.h" #include "validate.h" #include "xauth.h" #include "sound.h" #if NEWAPI xmlrpc_value *tcos_sound(xmlrpc_env *const env, xmlrpc_value *const in, void *const serverContext) #else xmlrpc_value *tcos_sound(xmlrpc_env *env, xmlrpc_value *in, void *ud) #endif { FILE *fp; char line[BSIZE]; char *option; char *cmdline; char mycmd[BSIZE]; char *user; char *pass; char *login_ok; char hostname[BSIZE]; int xauth_ok; struct ip_address ip; char ip_string[BSIZE]; char *fret; UNUSED(fret); dbgtcos("tcosxmlrpc::tcos_sound() Init \n"); /* read what option and cmdline params need */ xmlrpc_parse_value(env, in, "(ssss)", &option, &cmdline, &user, &pass); if (env->fault_occurred) return xmlrpc_build_value(env, "s", "params error"); gethostname(hostname,BSIZE); fp=(FILE*)popen(MY_IP_ADDRESS, "r"); fret=fgets( ip_string, sizeof ip_string, fp); remove_line_break(ip_string); pclose(fp); ip=check_ip_address(ip_string); dbgtcos("tcosxmlrpc::tcos_sound() option=%s cmdline=%s user=%s pass=**notshow**\n", option, cmdline, user); if ( (strcmp(pass, hostname ) == 0) || (strcmp(pass, ip.ipstr) == 0) ) { /* need XAUTH first */ xauth_ok=handle_xauth(user,pass); if( xauth_ok != XAUTH_OK ) return xmlrpc_build_value(env, "s", "error: xauth access denied" ); } else { /* need login first */ login_ok=validate_login(user,pass); if( strcmp(login_ok, LOGIN_OK ) != 0 ) return xmlrpc_build_value(env, "s", login_ok ); } dbgtcos("tcosxmlrpc::tcos_sound() exec=\"%s %s %s\"\n", SOUND_WRAPPER, option, cmdline); snprintf( (char*) mycmd, BSIZE, "%s %s %s", SOUND_WRAPPER, option, cmdline); fp=(FILE*)popen( mycmd , "r"); if (fp == NULL) return xmlrpc_build_value(env, "s", SOUND_READING_ERROR ); /* put error msg into line var */ strncpy(line, SOUND_ERROR, BSIZE); fret=fgets( line, sizeof line, fp); remove_line_break(line); pclose(fp); if (env->fault_occurred) { return xmlrpc_build_value(env, "s", SOUND_READING_ERROR); } return xmlrpc_build_value(env, "s", line ); } tcos-0.89.93ubuntu2/xmlrpc/common.c0000664000000000000000000001707412260610261014037 0ustar /* * common.c part of tcosxmlrpc * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include "common.h" #include "debug.h" struct ip_address check_ip_address(char *data) { struct ip_address ip; /* * split ip address with 4 dots * join ip address in ip.ipstr * and compare with original data * */ sscanf(data, "%d.%d.%d.%d", &ip.data[0], &ip.data[1], &ip.data[2], &ip.data[3]); snprintf(ip.ipstr, IP_LENGHT, "%d.%d.%d.%d", ip.data[0], ip.data[1], ip.data[2], ip.data[3]); dbgtcos("tcosxmlrpc::is_ip() comparing %s with %s ...\n", data, ip.ipstr); if ( strcmp(data, ip.ipstr) == 0 ) { ip.is_ip=1; } else { ip.is_ip=0; } return ip; } int check_for_file(char *fname) { /* return 0 if not found or cant read or 1 if found */ FILE *fptemp; if ((fptemp = fopen(fname,"r"))) { fclose(fptemp); dbgtcos("info check_for_file(): File \"%s\" found.\n", fname); return 1; } dbgtcos("info check_for_file(): File \"%s\" not found or cant read.\n", fname); return 0; } unsigned int getfilesize(char *fname) { struct stat infobuf; /* place to store info */ if ( stat( fname, &infobuf) == -1 ) /* get info */ return -1; else return infobuf.st_size; } /* * Base64 encoding/decoding (RFC1341) * Copyright (c) 2005, Jouni Malinen * Adapted to TCOS by Mario Izquierdo (no line breaks output to stdout) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * Alternatively, this software may be distributed under the terms of BSD * license. * * See README and COPYING for more details. */ unsigned char *readfile(const char *name, size_t *len) { FILE *f; unsigned char *buf; size_t fret; UNUSED(fret); f = fopen(name, "rb"); if (f == NULL) return NULL; fseek(f, 0, SEEK_END); *len = ftell(f); fseek(f, 0, SEEK_SET); buf = malloc(*len); if (buf == NULL) { fclose(f); return NULL; } fret=fread(buf, 1, *len, f); fclose(f); return buf; } #if 0 void *memset(void *s, int c, size_t n) { char *p = s; while (n--) *p++ = c; return s; } #endif /* * Base64 code taken from wpasupplicant package * http://www.koders.com/c/fidC4909D9B4301A6E931115BCFD347E5DB79620A7D.aspx?s=base64_table#L20 * */ static const unsigned char base64_table[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /** * base64_encode - Base64 encode * @src: Data to be encoded * @len: Length of the data to be encoded * @out_len: Pointer to output length variable, or %NULL if not used * Returns: Allocated buffer of out_len bytes of encoded data, * or %NULL on failure * * Caller is responsible for freeing the returned buffer. Returned buffer is * nul terminated to make it easier to use as a C string. The nul terminator is * not included in out_len. */ unsigned char * base64_encode(const unsigned char *src, size_t len, size_t *out_len) { unsigned char *out, *pos; const unsigned char *end, *in; size_t olen; olen = len * 4 / 3 + 4; /* 3-byte blocks to 4-byte */ olen += olen / 72; /* line feeds */ olen++; /* nul termination */ out = malloc(olen); if (out == NULL) return NULL; end = src + len; in = src; pos = out; /*line_len = 0;*/ while (end - in >= 3) { *pos++ = base64_table[in[0] >> 2]; *pos++ = base64_table[((in[0] & 0x03) << 4) | (in[1] >> 4)]; *pos++ = base64_table[((in[1] & 0x0f) << 2) | (in[2] >> 6)]; *pos++ = base64_table[in[2] & 0x3f]; in += 3; } if (end - in) { *pos++ = base64_table[in[0] >> 2]; if (end - in == 1) { *pos++ = base64_table[(in[0] & 0x03) << 4]; *pos++ = '='; } else { *pos++ = base64_table[((in[0] & 0x03) << 4) | (in[1] >> 4)]; *pos++ = base64_table[(in[1] & 0x0f) << 2]; } *pos++ = '='; } *pos = '\0'; if (out_len) *out_len = pos - out; return out; } /** * base64_decode - Base64 decode * @src: Data to be decoded * @len: Length of the data to be decoded * @out_len: Pointer to output length variable * Returns: Allocated buffer of out_len bytes of decoded data, * or %NULL on failure * * Caller is responsible for freeing the returned buffer. */ unsigned char * base64_decode(const unsigned char *src, size_t len, size_t *out_len) { unsigned char dtable[256], *out, *pos, in[4], block[4], tmp; size_t i, count, olen; memset(dtable, 0x80, 256); for (i = 0; i < sizeof(base64_table) - 1; i++) dtable[base64_table[i]] = (unsigned char) i; dtable['='] = 0; count = 0; for (i = 0; i < len; i++) { if (dtable[src[i]] != 0x80) count++; } if (count % 4) return NULL; olen = count / 4 * 3; pos = out = malloc(olen); if (out == NULL) return NULL; count = 0; for (i = 0; i < len; i++) { tmp = dtable[src[i]]; if (tmp == 0x80) continue; in[count] = src[i]; block[count] = tmp; count++; if (count == 4) { *pos++ = (block[0] << 2) | (block[1] >> 4); *pos++ = (block[1] << 4) | (block[2] >> 2); *pos++ = (block[2] << 6) | block[3]; count = 0; } } if (pos > out) { if (in[2] == '=') pos -= 2; else if (in[3] == '=') pos--; } *out_len = pos - out; return out; } /* split string into tokens, return token array */ /* http://www.c.happycodings.com/Miscellaneous/code37.html */ char **split(char *string, char *delim) { char **tokens = NULL; char *working = NULL; char *token = NULL; int idx = 0; tokens = malloc(sizeof(char *) * MAXTOKENS); if(tokens == NULL) return NULL; working = malloc(sizeof(char) * strlen(string) + 1); if(working == NULL) return NULL; /* to make sure, copy string to a safe place */ strcpy(working, string); for(idx = 0; idx < MAXTOKENS; idx++) tokens[idx] = NULL; token = strtok(working, delim); idx = 0; /* always keep the last entry NULL termindated */ while((idx < (MAXTOKENS - 1)) && (token != NULL)) { tokens[idx] = malloc(sizeof(char) * strlen(token) + 1); if(tokens[idx] != NULL) { strcpy(tokens[idx], token); idx++; token = strtok(NULL, delim); } } free(working); return tokens; } /* replace \n in command output */ void remove_line_break( char *s ) { s[strcspn ( s, "\n" )] = '\0'; } #ifdef TEST_MAIN int main(int argc, char *argv[]) { FILE *f; size_t len, elen; unsigned char *buf, *e; if (argc != 4) { printf("Usage: base64 \n"); return -1; } buf = readfile(argv[2], &len); if (buf == NULL) return -1; if (strcmp(argv[1], "encode") == 0) e = base64_encode(buf, len, &elen); else e = base64_decode(buf, len, &elen); if (e == NULL) return -2; f = fopen(argv[3], "w"); if (f == NULL) return -3; fwrite(e, 1, elen, f); fclose(f); free(e); return 0; } #endif tcos-0.89.93ubuntu2/session-cmd/0000775000000000000000000000000012260610427013315 5ustar tcos-0.89.93ubuntu2/session-cmd/session-cmd-common.sh0000664000000000000000000000340212260610261017356 0ustar # ------- # File: session-cmd-common.sh # Description: common functions for session-cmd scripts # Author: Luis Garcia Gisbert # Copyright (C) Luis Garcia Gisbert # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin St, Fifth Floor, Boston MA 02110-1301 USA # -------- UNIX_SOCKET_DIR="/tmp/session-cmd" socket_basename(){ echo "$(id -un)" } create_socket(){ local i MAX_TRY UNIX_SOCKET i=0 MAX_TRY=99 while [ $i -lt $MAX_TRY ] ; do UNIX_SOCKET="${UNIX_SOCKET_DIR}-$(socket_basename)/$(socket_basename)-${i}" [ -S "${UNIX_SOCKET}.sock" ] || break if [ -r "${UNIX_SOCKET}.pid" ] ; then kill -9 "$(cat "${UNIX_SOCKET}.pid")" >/dev/null 2>/dev/null || true break fi i=$(($i + 1)) done [ $i -lt $MAX_TRY ] || return 1 mkdir -p "${UNIX_SOCKET_DIR}-$(socket_basename)" [ -d "${UNIX_SOCKET_DIR}-$(socket_basename)" ] || return 1 echo "$UNIX_SOCKET" return 0 } list_sockets(){ [ -d "${UNIX_SOCKET_DIR}-$(socket_basename)" ] || return 0 find "${UNIX_SOCKET_DIR}-$(socket_basename)" -type s -name "$(socket_basename)-*.sock" 2>/dev/null return 0 } tcos-0.89.93ubuntu2/session-cmd/session-cmd-script0000775000000000000000000000344712260610261016775 0ustar #!/bin/sh # ------- # File: session-cmd-script # Description: session-cmd session script # Author: Luis Garcia Gisbert # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin St, Fifth Floor, Boston MA 02110-1301 USA # -------- ######### changed by mariodebian ######## [ -e /etc/default/tcos-standalone ] && . /etc/default/tcos-standalone if [ -f /usr/share/pyshared/tcosmonitor/shared.py ]; then DISPLAY_HOST=$(python /usr/share/pyshared/tcosmonitor/shared.py "$DISPLAY" 2>/dev/null) else DISPLAY_HOST=$(python -c 'import os; import tcosmonitor.shared; print tcosmonitor.shared.parseIPAddress(os.environ["DISPLAY"])') fi if [ -z ${DISPLAY_HOST} ] && [ "${TCOS_STANDALONE_START}" != "1" ]; then exit 0 fi ################# end #################### LIB_FILE="/usr/lib/tcos/session-cmd-common.sh" [ -r "$LIB_FILE" ] || exit 1 . ${LIB_FILE} EXEC_SCRIPT="/usr/lib/tcos/session-cmd-exec" # kill before launching again killall -w faucet >/dev/null 2>&1 sleep 2 UNIX_SOCKET="$(create_socket)" || exit 0 rm -f "${UNIX_SOCKET}.sock" "${UNIX_SOCKET}.pid" cd /tmp umask 0177 faucet "${UNIX_SOCKET}.sock" --unix --pidfile "${UNIX_SOCKET}.pid" --in xargs ${EXEC_SCRIPT} >/dev/null 2>&1 exit 0 tcos-0.89.93ubuntu2/session-cmd/session-cmd-send0000775000000000000000000000213412260610261016412 0ustar #!/bin/sh # ------- # File: session-cmd-send # Description: session-cmd frontend # Author: Luis Garcia Gisbert # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin St, Fifth Floor, Boston MA 02110-1301 USA # -------- LIB_FILE="/usr/lib/tcos/session-cmd-common.sh" [ -r "$LIB_FILE" ] || exit 1 . ${LIB_FILE} DATA="$@" if [ "$1" ] ; then for SOCKET in $(list_sockets) ; do hose localhost "$SOCKET" --unix --out /bin/echo "$DATA" 2>/dev/null || true done fi exit 0 tcos-0.89.93ubuntu2/session-cmd/Makefile0000664000000000000000000000073512260610261014756 0ustar all: @echo " session-cmd: make all empty" include ../common.mk clean: $(QUIET_CL)rm -f *~ install: install -m 755 session-cmd-send $(DESTDIR)/${TCOS_BINS}/ install -m 755 session-cmd-exec $(DESTDIR)/${TCOS_BINS}/ install -m 755 session-cmd-script $(DESTDIR)/${TCOS_BINS}/ install -m 644 session-cmd-common.sh $(DESTDIR)/${TCOS_BINS}/ mkdir -p $(DESTDIR)/etc/xdg/autostart/ install -m 644 session-cmd.desktop $(DESTDIR)/etc/xdg/autostart/ tcos-0.89.93ubuntu2/session-cmd/session-cmd.desktop0000664000000000000000000000027012260610261017127 0ustar [Desktop Entry] Encoding=UTF-8 Name=Session Cmd Comment=Session cmd user agent Exec=/usr/lib/tcos/session-cmd-script Terminal=false Type=Application Categories= OnlyShowIn=GNOME;XFCE; tcos-0.89.93ubuntu2/session-cmd/session-cmd-exec0000775000000000000000000000564212260610261016414 0ustar #!/bin/sh # ------- # File: session-cmd-exec # Description: session-cmd backend # Author: Luis Garcia Gisbert # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin St, Fifth Floor, Boston MA 02110-1301 USA # -------- set -e [ -r /etc/tcos/tcos.conf ] && . /etc/tcos/tcos.conf # title of popup TITLE="TCOS" # icon to show in popup ICON_FILE="/usr/share/pixmaps/tcos-icon-32x32.png" MODE=$1 shift # timeout for popup (in seconds) LOGOUT_TIMEOUT=20 [ $# -gt 1 ] && LOGOUT_TIMEOUT=$1 && shift # message to show in popup LOGOUT_MESSAGE="Session will close in $LOGOUT_TIMEOUT seconds" POWEROFF_MESSAGE="Pc will shutdown in $LOGOUT_TIMEOUT seconds" REBOOT_MESSAGE="Pc will reboot in $LOGOUT_TIMEOUT seconds" case ${MODE} in POWEROFF) POWEROFF_MESSAGE="$*" ;; REBOOT) REBOOT_MESSAGE="$*" ;; LOGOUT) LOGOUT_MESSAGE="$*" ;; esac if [ -d /etc/tcos/conf.d/ ]; then for file in /etc/tcos/conf.d/session-cmd*; do [ -e $file ] && . $file done fi MESSAGE_CMD="notify-send -u normal -t $(($LOGOUT_TIMEOUT * 1000)) -i ${ICON_FILE} ${TITLE}" message(){ $MESSAGE_CMD "$1" 2>/dev/null } socket_basename(){ echo "$(id -un)" } case ${MODE} in MESSAGE) if [ "$*" ] ; then message "$*" fi ;; POWEROFF) message "$POWEROFF_MESSAGE" ;; REBOOT) message "$REBOOT_MESSAGE" ;; LOGOUT) message "$LOGOUT_MESSAGE" sleep $LOGOUT_TIMEOUT if [ `ps -U $(socket_basename) | grep -c -e "ksmserver" -e "start_kdeinit"` -eq 2 ];then dcop ksmserver default logout 0 -1 -1 else if [ $(gnome-session-save --help | grep -c force-logout) -ge 1 ]; then gnome-session-save --force-logout else gnome-session-save --kill --silent fi fi ;; NOSCREENSAVER) if [ `ps -U $(socket_basename) | grep -c -e "ksmserver" -e "start_kdeinit"` -eq 2 ];then dcop kdesktop KScreensaverIface quit fi if [ -f /usr/bin/gnome-screensaver-command ];then gnome-screensaver-command -d elif [ -f /usr/bin/xscreensaver-command ];then xscreensaver-command --deactivate fi ;; OPEN) if [ "$*" ] ; then [ -x /usr/bin/gnome-open ] && gnome-open "$*" 2>/dev/null fi ;; esac exit 0 tcos-0.89.93ubuntu2/hooks-addons/0000775000000000000000000000000012260610427013462 5ustar tcos-0.89.93ubuntu2/hooks-addons/15inetd0000664000000000000000000000077712260610261014665 0ustar # hooks addon of inetd # need inetd package if [ ! $TCOS_INETD ]; then _verbose "(15inetd) TCOS_INETD disabled" else stat_before # inetd and telnet #copy_exec /usr/sbin/in.telnetd /usr/bin #copy_exec /usr/bin/telnet /usr/bin cpifexists /usr/sbin/tcpd /usr/bin/ cpifexists /usr/sbin/inetd /usr/bin/ #echo "telnet stream tcp nowait root /sbin/tcpd telnetd" > $DESTDIR/etc/inetd.conf #copy_exec /usr/lib/telnetlogin /usr/lib/ stat_after "Inetd daemon" fi # end of TCOS_INETD tcos-0.89.93ubuntu2/hooks-addons/clean_initramfs0000775000000000000000000001357212260610261016552 0ustar # this hook is called before mkinitramfs is called . /etc/tcos/tcos.conf . /usr/share/initramfs-tools/hook-functions . $TCOS_DIR/tcos-generation-functions.sh _verbose "(clean_initramfs) Cleaning initramfs..." if [ "${DESTDIR}" = "" ] || [ "$DESTDIR" = "/" ] || [ ! -d "$DESTDIR/scripts" ]; then _echo " * ERROR: DESTDIR var not set. not cleaning initramfs..." exit 1 fi find $DESTDIR/etc/ -name "*dpkg-old" | xargs rm -f # clean ORDER files, TCOS use numbers rm -f $DESTDIR/scripts/*/ORDER cat << EOF >> $DESTDIR/scripts/functions cache_run_scripts() { return } EOF # replace /bin/sh => /bin/busybox rm -f $DESTDIR/bin/sh (cd $DESTDIR/bin && ln -s busybox sh) create_links() { ( cd $DESTDIR/bin && rm -f $1 ; ln -s busybox $1) } # Some scripts without correct permissions chmod -R a+x ${DESTDIR}/scripts/panic/ 2>/dev/null chmod -R a+x ${DESTDIR}/scripts/init-*/ chmod -R a+x ${DESTDIR}/scripts/tcos-*/ create_links "date" create_links "bash" create_links "tftp" create_links "awk" create_links "dirname" create_links "chown" create_links "wc" create_links "head" create_links "whoami" create_links "swapon" create_links "swapoff" create_links "dmesg" create_links "route" create_links "run-parts" create_links "killall" create_links "which" create_links "pidof" create_links "syslogd" create_links "logger" create_links "ulimit" create_links "ifconfig" create_links "grep" # needed by a udev rule create_links "udhcpc" # use busybox mount/umount instead of klibc utils create_links "mount" create_links "umount" # link creator mkdir -p $DESTDIR/scripts/tcos-bottom cat << EOF > $DESTDIR/scripts/tcos-bottom/00linkcreator #!/bin/sh if [ "\$1" = "prereqs" ]; then exit 0 fi [ ! -e /conf/links ] && exit cat /conf/links | while read line ; do ln -s \$line >> /tmp/initramfs.debug 2>&1 echo "[linkcreator] ln -s \$line" >> /tmp/initramfs.debug done EOF chmod +x $DESTDIR/scripts/tcos-bottom/00linkcreator create_link() { if [ -e $DESTDIR/$1 ] && [ -e $DESTDIR/$2 ]; then if cmp $DESTDIR/$1 $DESTDIR/$2; then rm -f $DESTDIR/$1 echo "$2 $1" >> $DESTDIR/conf/links fi fi } # mtools create_link /usr/bin/mcopy /usr/bin/mattrib create_link /usr/bin/mcopy /usr/bin/mcat create_link /usr/bin/mcopy /usr/bin/mcopy create_link /usr/bin/mcopy /usr/bin/mdel create_link /usr/bin/mcopy /usr/bin/mformat create_link /usr/bin/mcopy /usr/bin/minfo create_link /usr/bin/mcopy /usr/bin/mlabel create_link /usr/bin/mcopy /usr/bin/mmove create_link /usr/bin/mcopy /usr/bin/mmount create_link /usr/bin/mcopy /usr/bin/mtype create_link "$LIB_MULTIARCH/libpci.so.3" /lib/libpci.so.3 create_link /usr/lib/libz.so.1 /lib/libz.so.1 create_link /etc/console/boottime.kmap.gz /etc/boottime.kmap.gz create_link /usr/share/X11/xkb/symbols/sun_vndr/cz /usr/share/X11/xkb/symbols/sun_vndr/cs create_link /usr/lib/xorg/modules/drivers/i810_drv.so /usr/lib/xorg/modules/drivers/intel_drv.so create_link /usr/share/X11/xkb/rules/evdev.lst /usr/share/X11/xkb/rules/base.lst create_link /sbin/mke2fs /sbin/mkfs.ext3 create_link /sbin/mke2fs /sbin/mkfs.ext4 #( cd $DESTDIR/bin && rm -f zcat ; ln -s gunzip zcat ) if [ -d $DESTDIR/lib/cmds ]; then ( cd $DESTDIR/lib/cmds && rm -f poweroff && ln -s reboot poweroff ) fi ( cd $DESTDIR/sbin && rm -f udevsettle ; ln -s udevadm udevsettle ) # zattoo provides libasound.so.2 link in /usr/lib/zattoo that breaks sound support # move to their site if [ -e $DESTDIR/usr/lib/zattoo/libasound.so.2 ]; then mv $DESTDIR/usr/lib/zattoo/libasound.so.2 $DESTDIR/usr/lib/libasound.so.2 rmdir $DESTDIR/usr/lib/zattoo/ fi if [ $TCOS_DISABLE_ACPI ] ; then #rm -rf $DESTDIR/bin/sh* #( cd ${DESTDIR}/bin/ && ln -s busybox sh ) rm -rf $DESTDIR/scripts/usb* rm -rf $DESTDIR/scripts/live* rm -rf $DESTDIR/scripts/local* rm -rf $DESTDIR/scripts/casper* rm -rf $DESTDIR/scripts/nfs* rm -rf $DESTDIR/scripts/init-premount/thermal rm -rf $DESTDIR/sbin/mdadm rm -rf $DESTDIR/scripts/init-premount/mdadm rm -rf $DESTDIR/sbin/mdrun rm -rf $DESTDIR/sbin/vgchange rm -rf $DESTDIR/sbin/cryptsetup rm -rf $DESTDIR/sbin/dmsetup rm -rf $DESTDIR/lib/lvm* rm -rf ${DESTDIR}/lib/modules/${TCOS_KERNEL}/kernel/drivers/md/ rm -rf ${DESTDIR}/lib/modules/${TCOS_KERNEL}/drivers/md/ rm -rf ${DESTDIR}/lib/modules/${TCOS_KERNEL}/drivers/acpi/ # rm -rf $(find ${DESTDIR}/lib/modules/${TCOS_KERNEL}/kernel/drivers/scsi/ \ # -not -name "sd_mod.ko" -not -name "sr_mod.ko" \ # -not -name "scsi_mod.ko" -not -name "sg.ko" ) fi if [ "$TCOS_DISABLE_USPLASH" = "1" ]; then #_echo " * Remove usplash" rm -f ${DESTDIR}/lib/usplash 2>/dev/null rm -f ${DESTDIR}/sbin/usplash 2>/dev/null rm -f ${DESTDIR}/sbin/usplash_write 2>/dev/null rm -f ${DESTDIR}/scripts/init-top/*usplash* 2>/dev/null fi if [ "$TCOS_DISABLE_PLYMOUTH" = "1" ]; then rm -f ${DESTDIR}/scripts/*/plymouth 2>/dev/null rm -rf ${DESTDIR}/lib/plymouth 2>/dev/null rm -f ${DESTDIR}/sbin/plymouthd 2>/dev/null rm -f ${DESTDIR}/bin/plymouth 2>/dev/null fi # experimental delete, not needed LIBS rm -f ${DESTDIR}/sbin/resume #rm -f ${DESTDIR}/usr/lib/libgcrypt.so.11 #rm -f ${DESTDIR}/usr/lib/libpcre.so.3 #rm -f ${DESTDIR}/usr/lib/libgpg-error.so.0 rm -f ${DESTDIR}/usr/lib/libGL.so.1.2 rm -f ${DESTDIR}/usr/lib/libGLU.so.1 #rm -f ${DESTDIR}/usr/lib/libkrb5support.so.0 #rm -f ${DESTDIR}/usr/lib/libfusion-1.0.so.0 #rm -f ${DESTDIR}/usr/lib/libdrm.so.2 #rm -f ${DESTDIR}/usr/lib/libdirectfb-1.0.so.0 rm -f ${DESTDIR}/usr/lib/libnvidia-tls.so.1 #rm -f ${DESTDIR}/usr/lib/libdirect-1.0.so.0 #rm -f ${DESTDIR}/usr/lib/libk5crypto.so.3 #rm -f ${DESTDIR}/usr/lib/libkrb5.so.3 #rm -f ${DESTDIR}/usr/lib/libXxf86vm.so.1 #rm -f ${DESTDIR}/usr/lib/libglib-2.0.so.0 # no remove, needed for new lockscreen (imlib2) #rm -f ${DESTDIR}/usr/lib/imlib2/loaders/png.so #rm -f ${DESTDIR}/usr/lib/libgssapi_krb5.so.2 #rm -f ${DESTDIR}/lib/libsplashycnf.so.1 #rm -f ${DESTDIR}/lib/libkeyutils.so.1 #rm -f ${DESTDIR}/lib/libsplashy.so.1 rm -rf ${DESTDIR}/etc/dhcp3/gadmin-dhcpd tcos-0.89.93ubuntu2/hooks-addons/96modules0000664000000000000000000000373112260610261015234 0ustar # hook addon for blacklist or add kernel modules options on startup stat_before cat << EOF > ${DESTDIR}/scripts/init-top/tcos_modules #!/bin/sh # # new header not using prereqs if [ "\$1" = "prereqs" ]; then echo "" exit 0 fi quiet=n FORCE_MODULES="" BLACKLIST_MODULES="" for x in \$(cat /proc/cmdline); do case \$x in force_modules=*) FORCE_MODULES="\$(echo \${x#force_modules=}|tr "," " ")" ;; blacklist_modules=*) BLACKLIST_MODULES="\$(echo \${x#blacklist_modules=}|tr "," " ")" ;; esac done if [ "\$FORCE_MODULES" != "" ] ; then for x in \$FORCE_MODULES ; do modprobe -Q \$x 2>/dev/null || true done fi if [ "\$BLACKLIST_MODULES" != "" ] ; then for x in \$BLACKLIST_MODULES ; do echo "blacklist \$x" >> /etc/modprobe.d/blacklist-tcos.conf 2>/dev/null || true done fi # Fix corruption MAC address in Realtek PCI Express RTL810xE with kernel module r8169.ko if [ "\$(pcimodules | grep -c r8101)" != "0" ]; then if [ "\$(modprobe -l | grep -c r8101)" != "0" ]; then modprobe -Q r8101 2>/dev/null || true if [ "\$(dmesg | grep -c -i rtl*810.e)" != "0" ]; then echo "blacklist r8169" >> /etc/modprobe.d/blacklist-tcos.conf 2>/dev/null || true else modprobe -Q -r -f r8101 2>/dev/null || true fi else echo -n -e "WARNING!!! Your computer has an Ethernet Realtek 810xE PCI Express does not work correctly with kernel module r8169. Please regenerate TCOS images, adding the extra kernel module r8101 and blacklisting r8169 kernel modules." fi fi EOF chmod +x ${DESTDIR}/scripts/init-top/tcos_modules # add options to snd-hda-intel if ! grep -q snd-hda-intel ${DESTDIR}/etc/modprobe.d/alsa-base* ; then [ -e ${DESTDIR}/etc/modprobe.d/alsa-base ] && \ mv ${DESTDIR}/etc/modprobe.d/alsa-base ${DESTDIR}/etc/modprobe.d/alsa-base.conf echo "options snd-hda-intel model=auto" >> ${DESTDIR}/etc/modprobe.d/alsa-base.conf fi stat_after "Tcos Kernel modules support" tcos-0.89.93ubuntu2/hooks-addons/55vnc0000664000000000000000000000210312260610261014335 0ustar # hooks addon to use X11VNC # need x11vnc package if [ ! ${TCOS_X11VNC} ]; then _verbose "(55vnc) TCOS_X11VNC disabled" else if [ ! -d /usr/share/doc/x11vnc ]; then echo "WARNING:" echo "" echo "x11vnc not found, install x11vnc or disable TCOS_X11VNC." echo " => # apt-get install x11vnc" echo "" else stat_before cpifexists /usr/bin/x11vnc /usr/bin/ cat < $DESTDIR/sbin/startvnc #!/bin/sh # kill all x11vnc process killall x11vnc >/dev/null 2>&1 sleep 1 DISPLAY=:0 x11vnc -o /tmp/vnc.log -forever -shared -noshm -rfbauth /tmp/.tcosvnc #FIXME (daemonize ??) EOF chmod +x $DESTDIR/sbin/startvnc stat_after "x11vnc" # FIXME use inetd for launching (man x11vnc) #-inetd # Launched by inetd(8): stdio instead of listening socket. Note: if you are not redirecting stderr to a log # file (via shell 2> or -o option) you MUST also specify the -q option, otherwise the stderr goes to the # viewer which will cause it to abort. Specifying both -inetd and -q and no -o will automatically close the stderr. fi fi #end of TCOS_X11VNC tcos-0.89.93ubuntu2/hooks-addons/59freenx0000664000000000000000000000747512260610261015063 0ustar # hooks addon of FreeNX # need nxclient installed if [ ! ${TCOS_FREENX} ]; then _verbose "(59freenx) TCOS_FREENX disabled" else stat_before mkdir -p $DESTDIR/usr/NX/bin mkdir -p $DESTDIR/usr/NX/lib mkdir -p $DESTDIR/usr/NX/share mkdir -p $DESTDIR/usr/NX/share/keys # mkdir -p $DESTDIR/etc/nxserver/ #cat << EOF > $DESTDIR/etc/nxserver/node.conf #COMMAND_XAUTH=/usr/bin/xauth #ENABLE_SSH_AUTHENTICATION="1" #EOF #FIXME # to work sound need esddsp and this vars ##ENABLE_ESD_PRELOAD="0" ##ESD_BIN_PRELOAD="esddsp" # not know if needed # ssh ssh-keygen md5sum # AGENT_EXTRA_OPTIONS_X commented as Antonio Quesada said # firewalled freenx (by Antonio Quesada) # $ssh -l pepito -C -2 -L 5000:serverNX:22 dominio.com # #pepito= cuenta de usuario registrado en el fw #serverNX= hostname del servidor NX al que queremos acceder #dominio.com= el fw, claro está. #5000= Puerto local al que queremos redirigir, puedes escoger el que quieras #22= Salvo que redirijas a otro puerto, el NX está a la escucha en el ssh #-C -2= utilizar ssh 2 y comprimido #ahora llamamos al NXclient y le decimos que el servidor es localhost y que se #conecte al puerto 5000 o al que hayamos decidido en la opción -L xxxx: cpifexists /usr/NX/bin/nxclient /usr/NX/bin/ cpifexists /usr/NX/bin/nxesd /usr/NX/bin/ cpifexists /usr/NX/bin/nxssh /usr/NX/bin/ # firewalled connection cpifexists /usr/bin/ssh /usr/bin/ cpifexists /usr/bin/ssh-keygen /usr/bin/ # expect runs on server # cpifexists /usr/bin/expect /usr/bin/ #copydir /usr/NX/share/keyboards/ /usr/NX/share/ cpifexists /usr/NX/share/keyboards /usr/NX/share/ cpifexists /usr/NX/share/keys/server.id_dsa.key /usr/NX/share/keys/ copydir /usr/NX/share/images /usr/NX/share/ cpifexists /lib/libpthread.so.0 /lib/ if [ ! -d /usr/share/doc/libstdc++2.10-glibc2.2/ ]; then _echo " ** ERROR: need to install libstdc++2.10-glibc2.2 package for FreeNX" else cpifexists /usr/lib/libstdc++-libc6.2-2.so.3 /usr/lib/ fi cpifexists /usr/NX/lib/libcrypto.so /usr/NX/lib/ cpifexists /usr/NX/lib/libjpeg.so /usr/NX/lib/ cpifexists /usr/NX/lib/libpng12.so /usr/NX/lib/ cpifexists /usr/NX/lib/libXcomp.so /usr/NX/lib/ cpifexists /usr/NX/lib/libz.so /usr/NX/lib/ # not know if necesary cpifexists /usr/lib/libXcomp.so.1 /usr/lib/ cpifexists /usr/lib/libXcompext.so.1 /usr/lib/ cpifexists /usr/lib/libaudiofile.so.0 /usr/lib/ #echo "/usr/NX/lib" >> $DESTDIR/etc/ld.so.conf stat_after "FreeNX" fi # end of TCOS_FREENX if [ ${TCOS_FREENX_SQUASHFS} ]; then stat_before cat << EOF > ${DESTDIR}/scripts/tcos-premount/60freenx #!/bin/sh # # new header not using prereqs if [ "\$1" = "prereqs" ]; then echo "" exit 0 fi quiet=n . /scripts/functions . /conf/tcos.conf . /conf/tcos-run-functions TCOS_FREENX_SQUASHFS_FILE=\$(read_cmdline_var "freenx" "") if [ "\$TCOS_FREENX_SQUASHFS_FILE" = "" ]; then exit 0 fi # load modules modprobe -q loop >> /tmp/initramfs.debug 2>&1 modprobe -q squashfs >> /tmp/initramfs.debug 2>&1 modprobe -q unionfs >> /tmp/initramfs.debug 2>&1 value=0 log_begin_msg "Downloading FREENX squashfs" download_file /tcos/\${TCOS_FREENX_SQUASHFS_FILE} /mnt/tmp/nxclient.squashfs || value=1 sync sleep 1 log_end_msg \$value # Mount squashfs filesystems log_begin_msg "Mounting FREENX filesystem" mkdir -p /usr/NX mount -r -o loop -t squashfs /mnt/tmp/\${TCOS_FREENX_SQUASHFS_FILE} /usr/NX >> /tmp/initramfs.debug 2>&1 log_end_msg \$? # download settings mkdir -p /root/.nx/config download_file /tcos/nxclient.cfg /root/.nx/config/nxclient.cfg download_file /tcos/servidor.nxs /root/.nx/config/servidor.nxs echo "TCOS_XORG_TYPE=\"F\"" >> /conf/tcos.conf EOF chmod +x ${DESTDIR}/scripts/tcos-premount/60freenx # needed libs (libstdc++2.10-glibc2.2 package) cpifexists /usr/lib/libstdc++-libc6.2-2.so.3 /usr/lib/ stat_after "FreeNX squashfs" fi tcos-0.89.93ubuntu2/hooks-addons/60italc0000664000000000000000000000640512260610261014650 0ustar # hooks addon to use iTALC vnc MasterEye # need italc-client # also copy xmessage instead of messageviewer # that don't need qt libs if [ ! ${TCOS_ITALC} ]; then _verbose "(60italc) TCOS_ITALC disabled" else if [ -x /usr/bin/ica ]; then # new italc 1.0.0 version stat_before if [ ! -d /etc/italc/keys/public ]; then echo "" echo "ERROR:" echo " You must create public/private iTALC keys:" echo "" echo " # ica -role teacher -createkeypair " echo "" else cpifexists /usr/bin/ica /usr/bin/ mkdir -p $DESTDIR/etc/italc/keys cp -ra /etc/italc/keys/public $DESTDIR/etc/italc/keys/ cat < $DESTDIR/sbin/startica #!/bin/sh # kill killall ica >/dev/null 2>&1 sleep 4 export DISPLAY=:0 while [ 1 ]; do killall ica ica >/dev/null 2>&1 done EOF chmod +x $DESTDIR/sbin/startica fi stat_after "iTalc 1.0.0" elif [ -x /usr/bin/ivs ]; then stat_before cpifexists /usr/bin/ivs /usr/bin/ cpifexists /usr/bin/demoviewer /usr/bin/ cpifexists /usr/bin/screenlocker /usr/bin/ #cpifexists /usr/bin/messageviewer /usr/bin/ # messageviewer need qt libs # ugly wrapper less ram cpifexists /usr/bin/xmessage /usr/bin/ # overwrite, not link rm $DESTDIR/usr/bin/xmessage cp $(pathof xmessage) $DESTDIR/usr/bin/ mv $DESTDIR/usr/bin/xmessage $DESTDIR/usr/bin/messageviewer if [ ${TCOS_ADMIN_USER} ]; then # search public italc key if [ ! -f /etc/italc-client/public-keys/${TCOS_ADMIN_USER}.public ]; then # try to find in $HOME dir if [ "${TCOS_ADMIN_USER}" = "root" ]; then key=/root/.italc/id_rsa.public else home=$(getent passwd | grep "^${TCOS_ADMIN_USER}:" | awk -F":" '{print $6}') key=${home}/.italc/id_rsa.public fi else key=/etc/italc-client/public-keys/${TCOS_ADMIN_USER}.public fi if [ ! -f ${key} ]; then _echo "WARNING:" _echo " ${key} not found" _echo " You can generate running italc as ${TCOS_ADMIN_USER} for first time" _echo " or running italc-keygen" else mkdir -p $DESTDIR/etc/italc-client/public-keys/ cp ${key} $DESTDIR/etc/italc-client/public-keys/ 2>&1 > /dev/null mv $DESTDIR/etc/italc-client/public-keys/id_rsa.public $DESTDIR/etc/italc-client/public-keys/${TCOS_ADMIN_USER}.public 2>&1 > /dev/null cp $DESTDIR/etc/italc-client/public-keys/${TCOS_ADMIN_USER}.public $DESTDIR/etc/italc-client/public-keys/root.public 2>&1 > /dev/null fi else _echo "WARNING: Unknow TCOS_ADMIN_USER, iTALC need public user key to allow connections" _echo " Please fill TCOS_ADMIN_USER value" fi cat < $DESTDIR/sbin/startivs #!/bin/sh # kill and wait until Xorg is started killall ivs >/dev/null 2>&1 sleep 1 DISPLAY=:0 ivs -o /tmp/ivs.log -noshm -forever -shared #(start again if italc kill it ??) #while [ 1 ] ; do # killall -9 ivs >/dev/null 2>&1 # sleep 1 # DISPLAY=:0 ivs -o /tmp/ivs.log -noshm -forever -shared # sleep 2 #done exit 0 EOF chmod +x $DESTDIR/sbin/startivs stat_after "iTALC" else echo "WARNING:" echo "" echo "italc-client not found, install italc-client or disable TCOS_ITALC." echo " => # apt-get install italc-client" echo "" fi fi #end of TCOS_ITALC tcos-0.89.93ubuntu2/hooks-addons/09printer0000664000000000000000000000144112260610261015235 0ustar # hooks addon for printer support add_lp_modules() { force_load parport_pc force_load usblp force_load lp } if [ ! $TCOS_PRINTER ] ;then _verbose "(09printer) TCOS_PRINTER disabled" else stat_before if [ -e /usr/sbin/p910nd ]; then #/var/run/p9100d.pid, /var/lock/subsys/p9100d, /etc/hosts.allow, /etc/hosts.deny mkdir -p $DESTDIR/var/run mkdir -p $DESTDIR/var/lock/subsys cpifexists /usr/sbin/p910nd /usr/bin/ stat_after "Print server [p910nd]" else _echo "WARNING:" _echo "" _echo " TCOS_PRINTER enabled but not found p910nd package" _echo " Please install p910nd, or disable TCOS_PRINTER support" _echo "" _echo "" fi add_lp_modules fi # end of TCOS_PRINTER tcos-0.89.93ubuntu2/hooks-addons/21pulseaudio0000664000000000000000000001470312260610261015723 0ustar # pulseaudio hook # # clients must connect in two ways: # # connecting to server: tcp:thin_client_ip:4713 # or # importing X11 cookie with: $ pax11publish -i # or # using this env var PULSE_SERVER="thin_client_hostname" if [ ${TCOS_PULSEAUDIO} ] && [ ${TCOS_SOUND} ]; then # check for apps check1=0 [ -x /usr/bin/pulseaudio ] && check1=1 #check2=0 #[ -e /usr/lib/pulse*/modules/module-esound-protocol-tcp.so ] && check2=1 #[ -d ${TCOS_PKG_CACHE}/pulseaudio-esound-compat/usr/lib ] && check2=1 if [ $check1 = 0 ]; then echo " WARNING:" echo " pulseaudio is not installed, disable it from tcos.conf!!!" #elif [ $check2 = 0 ]; then # echo " WARNING:" # echo " pulseaudio-esound-compat is not installed, need some esound modules" # echo " install this package or disable PulseAudio in /etc/tcos/tcos.conf" # echo " You can install a cached package with:" # echo " # gentcos -instpkg pulseaudio-esound-compat" # echo "" # echo " See /usr/share/doc/initramfs-tools-tcos/README.cache" # echo "" else stat_before cpifexists /usr/bin/pulseaudio /usr/bin/ cpifexists /usr/bin/pax11publish /usr/bin/ cpifexists /usr/bin/pactl /usr/bin/ mkdir -p ${DESTDIR}/usr/lib copydir /usr/lib/pulse-* /usr/lib/ mkdir -p ${DESTDIR}/var/lib/pulse # clean unneeded modules rm -f ${DESTDIR}/usr/lib/pulse-*/modules/*.la rm -f ${DESTDIR}/usr/lib/pulse-*/modules/*jack* # rm -f ${DESTDIR}/usr/lib/pulse-*/modules/*rtp* rm -f ${DESTDIR}/usr/lib/pulse-*/modules/*lirc* rm -f ${DESTDIR}/usr/lib/pulse-*/modules/*evdev* rm -f ${DESTDIR}/usr/lib/pulse-*/modules/*sine* rm -f ${DESTDIR}/usr/lib/pulse-*/modules/*x11-bell* rm -f ${DESTDIR}/usr/lib/pulse-*/modules/*zeroconf* rm -f ${DESTDIR}/usr/lib/pulse-*/modules/*avahi* rm -f ${DESTDIR}/usr/lib/pulse-*/modules/*gconf* rm -f ${DESTDIR}/usr/lib/pulse-*/modules/*hal* rm -f ${DESTDIR}/usr/lib/pulse-*/modules/*pipe* rm -f ${DESTDIR}/usr/lib/pulse-*/modules/*tunel* rm -f ${DESTDIR}/usr/lib/pulse-*/modules/*volume-restore* rm -f ${DESTDIR}/usr/lib/pulse-*/modules/*cli* rm -f ${DESTDIR}/usr/lib/pulse-*/modules/*http* rm -f ${DESTDIR}/usr/lib/pulse-*/modules/*console-kit* rm -f ${DESTDIR}/usr/lib/pulse-*/modules/*ladspa* rm -f ${DESTDIR}/usr/lib/pulse-*/modules/*bluetooth* rm -f ${DESTDIR}/usr/lib/pulse-*/modules/*augment* rm -f ${DESTDIR}/usr/lib/pulse-*/modules/*phone* rm -f ${DESTDIR}/usr/lib/pulse-*/modules/*position-event* rm -f ${DESTDIR}/usr/lib/pulse-*/modules/*filter* rm -f ${DESTDIR}/usr/lib/pulse-*/modules/*equalizer* rm -f ${DESTDIR}/usr/lib/pulse-*/modules/*rygel* # don't use suspend-idle (we don't use dbus yet to reload pulseaudio) rm -f ${DESTDIR}/usr/lib/pulse-*/modules/*idle* # don't copy x11 modules rm -f ${DESTDIR}/usr/lib/pulse-*/modules/*x11* # copy channel configuration files if exists if [ -d /usr/share/pulseaudio/ ]; then copydir /usr/share/pulseaudio /usr/share/ fi # needed for pulse -> esound -> OSS [ -e /usr/lib/pulse-*/modules/libsocket-client.so ] && \ cpifexists /usr/lib/pulse-*/modules/libsocket-client.so /usr/lib/pulse-*/modules/ # delete modules and copy again to put linked libs for _lib in $DESTDIR/usr/lib/pulse-*/modules/*so; do librel=$(basename $_lib) rm -f $_lib cpifexists /usr/lib/pulse-*/modules/${librel} /usr/lib/pulse-*/modules/ done echo "pulse:x:111:120:PulseAudio daemon,,,:/var/run/pulse:/bin/false" >> $DESTDIR/etc/passwd echo "pulse:x:120:" >> $DESTDIR/etc/group #copydir /etc/pulse /etc/ mkdir -p $DESTDIR/etc/pulse cp /etc/pulse/client.conf $DESTDIR/etc/pulse/ cp /etc/pulse/daemon.conf $DESTDIR/etc/pulse/ if [ "$TCOS_SOUND_REMOTE_ESD" ]; then _SERVER=";\$(read_server "xdmcp-server")" else _SERVER="" fi if [ -e /usr/lib/pulse-*/modules/module-udev-detect.so ]; then _MODULE="module-udev-detect" else _MODULE="module-detect" fi cat << EOF >> ${DESTDIR}/sbin/startpulseaudio #!/bin/sh . /scripts/functions . /conf/tcos.conf . /conf/tcos-run-functions # limit PulseAudio SHM memory in low memory systems (<96MiB = 98304) if [ "\$(awk '/MemTotal/ {print \$2}' /proc/meminfo)" -lt 98305 ]; then if grep -q shm-size-bytes /etc/pulse/daemon.conf; then echo "shm-size-bytes = 16" >> /etc/pulse/daemon.conf fi if grep -q enable-shm /etc/pulse/daemon.conf; then echo "enable-shm = no" >> /etc/pulse/daemon.conf fi fi # don't allow to exit_idle (by default 20 seconds) if grep -q exit-idle-time /etc/pulse/daemon.conf; then echo "exit-idle-time = -1" >> /etc/pulse/daemon.conf fi # generate conf rm -f /etc/pulse/default.pa if [ "\$(pidof esd | sed '/^\$/d')" != "" ]; then cat << FIN > /etc/pulse/default.pa #!/usr/bin/pulseaudio -nF load-module module-esound-sink server=127.0.0.1 load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;\$(read_server "xdmcp-server") #.ifexists module-x11-publish.so #.nofail #load-module module-x11-publish #.fail #.endif FIN else cat << FIN > /etc/pulse/default.pa #!/usr/bin/pulseaudio -nF load-module $_MODULE load-module module-esound-protocol-tcp auth-ip-acl=127.0.0.1$_SERVER load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;\$(read_server "xdmcp-server") load-module module-esound-protocol-unix #.ifexists module-x11-publish.so #.nofail #load-module module-x11-publish #.fail #.endif .nofail load-module module-device-restore load-module module-stream-restore load-module module-card-restore load-module module-always-sink .fail FIN fi DISPLAY=:0 export DISPLAY cpu=\$(grep MHz /proc/cpuinfo | tail -1 | awk -F":" '{if(int(\$2) < 1024) printf "low"}') realtime=\$(pulseaudio --help 2>&1 | grep -c realtime) OPTS="--log-target=stderr " if [ \${TCOS_PULSEAUDIO_RESAMPLE_METHOD} ]; then OPTS="\${OPTS} --resample-method=\${TCOS_PULSEAUDIO_RESAMPLE_METHOD}" fi OPTS="--no-cpu-limit \${OPTS}" if [ "\$cpu" = "low" ]; then #OPTS="--no-cpu-limit \${OPTS}" # old versions of pulseaudio don't have realtime switch (Etch) if [ "\$realtime" != "0" ]; then OPTS="\${OPTS} --realtime " fi fi _log "STARTPULSEAUDIO starting pulseaudio server..." pulseaudio \${OPTS} & sleep 4 # # wait for Xorg is started # waitforX || exit sleep 2 # DISPLAY=:0 pax11publish -e # exit 0 EOF chmod +x ${DESTDIR}/sbin/startpulseaudio stat_after "PulseAudio (sound server)" fi # end of else of /usr/bin/pulseaudio else _verbose "(21pulseaudio) TCOS_PULSEAUDIO && sound disabled" fi # end of TCOS_PULSEAUDIO tcos-0.89.93ubuntu2/hooks-addons/19usbip0000664000000000000000000000256512260610261014705 0ustar # hooks addon to export USB devices with USB/IP # need usbip-tools and modules if [ $TCOS_USBIP ] && [ -x /usr/sbin/usbip ]; then stat_before cpifexists /usr/sbin/usbip /usr/sbin cpifexists /usr/sbin/usbipd /usr/sbin cpifexists /usr/sbin/usbip_bind_driver /usr/sbin cpifexists /usr/lib/libusbip.so.0 /usr/lib cpifexists /usr/bin/lsusb /usr/bin mkdir -p $DESTDIR/usr/share/misc [ -e /usr/share/misc/usb.ids ] && \ cpifexists /usr/share/misc/usb.ids /usr/share/misc manual_add_modules usbip_common_mod manual_add_modules usbip manual_add_modules vhci-hcd cat << EOF > $DESTDIR/scripts/tcos-bottom/70usbip #!/bin/sh # # new header not using prereqs if [ "\$1" = "prereqs" ]; then echo "" exit 0 fi quiet=n . /scripts/functions . /conf/tcos.conf . /conf/tcos-run-functions log_begin_msg "Starting USB/IP" mkdir -p /usr/share/usbip mkdir -p /usr/share/hwdata mkdir -p /var/lib/usbutils ln -s /usr/share/misc/usb.ids /usr/share/usbip 2>/dev/null ln -s /usr/share/usbip/usb.ids /usr/share/hwdata 2>/dev/null ln -s /usr/share/usbip/usb.ids /var/lib/usbutils 2>/dev/null modprobe usbip_common_mod modprobe usbip usbipd -D > /var/log/usbipd.log 2>&1 log_end_msg \$? exit 0 EOF chmod +x $DESTDIR/scripts/tcos-bottom/70usbip stat_after "** EXPERIMENTAL ** USB/IP support" fi tcos-0.89.93ubuntu2/hooks-addons/06funionfs0000664000000000000000000000036412260610261015401 0ustar # hook-addon for funionfs # # not support / unionfs at this moment, disabled by default # #if [ -e /usr/bin/funionfs ]; then # # cpifexists /usr/bin/funionfs /usr/bin/ # manual_add_modules fuse # echo "fuse" >> $DESTDIR/etc/modules # #fi tcos-0.89.93ubuntu2/hooks-addons/91splashy0000664000000000000000000000275512260610261015247 0ustar # # # # splashy_update commands # #cmd = "progress", #cmd = "PROGRESS", #cmd = "print", #cmd = "TEXT", #cmd = "scroll", #cmd = "SCROLL", #cmd = "CLEAR", #cmd = "clear", #cmd = "chvt", #cmd = "allowchvt", #cmd = "exit", #cmd = "QUIT", #cmd = "getstring", #cmd = "getpass", #cmd = "chroot", if [ -x /sbin/splashy_update ]; then rm -rf $DESTDIR/etc/splashy mkdir -p $DESTDIR/etc/splashy/themes cat << EOF > $DESTDIR/etc/splashy/config.xml /etc/splashy/themes tcos /etc/splashy/themes/default /etc/splashy/splashy.pid EOF cp -ra /etc/splashy/themes/tcos $DESTDIR/etc/splashy/themes cpifexists /sbin/splashy /sbin cpifexists /sbin/splashy_chvt /sbin cpifexists /sbin/splashy_update /sbin mv $DESTDIR/usr/lib/directfb-1.0-0/ $DESTDIR/lib/directfb-1.0-0/ cat << EOF > $DESTDIR/scripts/init-top/00_splashy #!/bin/sh # new header not using prereqs if [ "\$1" = "prereqs" ]; then echo "" exit 0 fi mkdir -p /usr/lib ln -s /lib/directfb-1.0-0 /usr/lib/directfb-1.0-0 EOF chmod +x $DESTDIR/scripts/init-top/00_splashy fi tcos-0.89.93ubuntu2/hooks-addons/90usplash0000664000000000000000000000077712260610261015244 0ustar # hook-addon for disable usplash support if [ $TCOS_DISABLE_UPLASH ]; then rm -f ${DESTDIR}/lib/usplash rm -f ${DESTDIR}/sbin/usplash rm -f ${DESTDIR}/sbin/usplash_write rm -f $DESTDIR/usr/lib/usplash/*.so cat << EOF > ${DESTDIR}/sbin/usplash #!/bin/sh exit 0 EOF chmod +x ${DESTDIR}/sbin/usplash cat << EOF > ${DESTDIR}/sbin/usplash_write #!/bin/sh exit 0 EOF chmod +x ${DESTDIR}/sbin/usplash_write _verbose "(90usplash) TCOS_DISABLE_USPLASH enabled !!!" fi # end if TCOS_DISABLE_USPLASH tcos-0.89.93ubuntu2/hooks-addons/10ssl_tunnel0000664000000000000000000000521012260610261015726 0ustar # hooks addon for stunnel4 # need stunnel4 package if [ ! $TCOS_ENABLE_SSL ]; then _verbose "(10ssl_tunnel) TCOS_ENABLE_SSL disabled" else stat_before [ -x /usr/bin/stunnel4 ] && cpifexists /usr/bin/stunnel4 /usr/bin/ [ -x /usr/sbin/stunnel4 ] && cpifexists /usr/sbin/stunnel4 /usr/bin/ [ -x /usr/bin/openssl ] && cpifexists /usr/bin/openssl /usr/bin/ mkdir -p $DESTDIR/etc/stunnel mkdir -p $DESTDIR/usr/lib/ssl cpifexists /usr/lib/ssl/openssl.cnf /usr/lib/ssl #cpifexists /usr/lib/libcrypto.so.0.9.8 /usr/lib/ #cpifexists /usr/lib/libssl.so.0.9.8 /usr/lib/ [ -e ${DESTDIR}/usr/lib/i686/cmov/libcrypto.so.0.9.8 ] && mv -f ${DESTDIR}/usr/lib/i686/cmov/libcrypto.so.0.9.8 ${DESTDIR}/usr/lib/libcrypto.so.0.9.8 2>/dev/null [ -e ${DESTDIR}/usr/lib/i686/cmov/libssl.so.0.9.8 ] && mv -f ${DESTDIR}/usr/lib/i686/cmov/libssl.so.0.9.8 ${DESTDIR}/usr/lib/libssl.so.0.9.8 2>/dev/null cat << EOF > ${DESTDIR}/etc/stunnel/stunnel.conf cert = /etc/stunnel/tcos.pem sslVersion=all foreground=yes syslog=no session=1 delay=no chroot=/var/lib/stunnel4/ setuid=root setgid=root pid=/stunnel4.pid socket=l:TCP_NODELAY=1 socket=r:TCP_NODELAY=1 ;socket=a:SO_REUSEADDR=0 ;compression=rle ;debug=7 output=/var/log/stunnel.log pty=no ;transparent=yes ;verify=1 [tcosxmlrpc] accept=8999 connect=8998 TIMEOUTclose=0 TIMEOUTconnect=2 TIMEOUTidle=2 EOF #if [ -e /etc/tcos/ssl/tcos-custom.pem ]; then # cp /etc/tcos/ssl/tcos-custom.pem ${DESTDIR}/etc/stunnel/tcos.pem #else # cp /etc/tcos/ssl/tcos.pem ${DESTDIR}/etc/stunnel/tcos.pem #fi #chmod 600 $DESTDIR/etc/stunnel/tcos.pem mkdir -p $DESTDIR/var/lib/stunnel4/ cat << EOF > ${DESTDIR}/scripts/tcos-bottom/60stunnel #!/bin/sh # # new header not using prereqs if [ "\$1" = "prereqs" ]; then echo "" exit 0 fi quiet=n . /scripts/functions . /conf/tcos.conf . /conf/tcos-run-functions nosslxmlrpc=\$(read_cmdline_var "nosslxmlrpc" "0") if [ "\${nosslxmlrpc}" = "1" ]; then _log "SSL XMLRPC disabled from cmdline" exit 0 fi [ -e /etc/stunnel/tcos.pem ] && rm -f /etc/stunnel/tcos.pem 2>/dev/null openssl req -new -x509 -nodes -days 365 -out /etc/stunnel/tcos.pem -keyout /etc/stunnel/tcos.pem -subj "/C=/ST=/L=/CN=localhost/emailAddress=root@localhost" 2>/dev/null dd if=/dev/urandom of=/tmp/temp_file_ssl count=2 2>/dev/null openssl dhparam -rand /tmp/temp_file_ssl 256 >> /etc/stunnel/tcos.pem 2>/dev/null chmod 600 /etc/stunnel/tcos.pem 2>/dev/null rm -f /tmp/temp_file_ssl 2>/dev/null stunnel4 >/dev/null 2>&1 & exit 0 EOF chmod +x ${DESTDIR}/scripts/tcos-bottom/60stunnel stat_after "SSL secure XMLRPC connection" fi # end of TCOS_ENABLE_SSL tcos-0.89.93ubuntu2/hooks-addons/00users0000664000000000000000000000313512260610261014704 0ustar # Hook addon for user password stuff cpifexists /etc/login.defs /etc cpifexists /usr/sbin/tcospasswd /usr/sbin # the root password by default is "root" root_shadow="root:$(/usr/sbin/tcospasswd root):13562:0:99999:7:::" if [ "${TCOS_ROOT_PASSWD}" != "" ]; then # generate shadow hash root_shadow="root:$(/usr/sbin/tcospasswd ${TCOS_ROOT_PASSWD}):13562:0:99999:7:::" fi # create /etc/tcospasswd if exists tcosmonitor secret passwd if [ -e /etc/tcos/secrets/tcosmonitor-secret ]; then secret1="$(cat /etc/tcos/secrets/tcosmonitor-secret | awk -F":" '{print $1}')" secret2="$(cat /etc/tcos/secrets/tcosmonitor-secret | awk -F":" '{print $2}')" secret2_passwd="$(/usr/sbin/tcospasswd $secret2)" echo "$secret1:$secret2_passwd" > $DESTDIR/etc/tcospasswd root_shadow="root:${secret2_passwd}:13562:0:99999:7:::" fi # create /etc/passwd /etc/shadow and /etc/group cat << EOF >> $DESTDIR/etc/passwd root:x:0:0:root:/root:/bin/sh daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh lp:x:7:7:lp:/var/spool/lpd:/bin/sh proxy:x:13:13:proxy:/bin:/bin/sh nobody:x:65534:65534:nobody:/nonexistent:/bin/sh sshd:x:105:65534::/var/run/sshd:/bin/false EOF # default password for root user is "root" cat << EOF >> $DESTDIR/etc/shadow ${root_shadow} daemon:*:13250:0:99999:7::: bin:*:13250:0:99999:7::: sys:*:13250:0:99999:7::: lp:*:13250:0:99999:7::: nobody:*:13250:0:99999:7::: sshd:!:13250:0:99999:7::: EOF cat << EOF >> $DESTDIR/etc/group root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4: tty:x:5: disk:x:6: lp:x:7: kmem:x:15: audio:x:29:pulse users:x:100: ssh:x:109: EOF tcos-0.89.93ubuntu2/hooks-addons/54devices0000664000000000000000000000307012260610261015174 0ustar # hooks addon to use terminal devices # need ltspfs # ltspfs # TCOS_REMOTEFS = shfs ltspfs mkdir -p $DESTDIR/etc/X11/PreRun/ cat << EOF > $DESTDIR/etc/X11/PreRun/15ltspfs-set-xprop #!/bin/sh /bin/ltspfs-set-xprop >> /tmp/initramfs.debug 2>&1 & EOF chmod +x $DESTDIR/etc/X11/PreRun/15ltspfs-set-xprop create_launcher() { cat << EOF > $DESTDIR/bin/ltspfs-set-xprop #!/bin/sh # wait for Xorg export DISPLAY=:0 export XAUTHORITY=/root/.Xauthority if [ "\$1" != "now" ]; then sleep 2 fi echo "ltspfs-set-xprop::waitforX" waitforX || exit # wait until Xorg is complety started if [ "\$1" != "now" ]; then sleep 5 fi echo "ltspfs-set-xprop::setting xprop value" echo "xprop -root -f LTSPFS_TOKEN 8s -set LTSPFS_TOKEN \$(cat /var/run/ltspfs_token)" xprop -root -f LTSPFS_TOKEN 8s -set LTSPFS_TOKEN \$(cat /var/run/ltspfs_token) exit 0 EOF chmod +x $DESTDIR/bin/ltspfs-set-xprop } if [ "$TCOS_REMOTEFS" = "ltspfs" ]; then create_launcher cpifexists /usr/bin/xprop /usr/bin/ if [ -e /usr/bin/ltspfsd ]; then stat_before cpifexists /usr/bin/ltspfsd /usr/bin stat_after "ltspfsd" else echo "ERROR:" echo "" echo "Not LTSPFS support, please install ltspfsd-core." echo "" echo "" fi fi if [ $TCOS_NTFS_3G ] && [ ! -e /usr/share/initramfs-tools/hooks/ntfs_3g ]; then stat_before # copy ntfs-3g bin and force load fuse cpifexists /usr/bin/ntfs-3g /usr/bin/ echo "/usr/bin/ntfs-3g /sbin/mount.ntfs-3g" >> $DESTDIR/conf/links manual_add_modules fuse echo "fuse" >> $DESTDIR/etc/modules stat_after "NTFS-3G tools" fi tcos-0.89.93ubuntu2/hooks-addons/00main0000664000000000000000000001211412260610261014464 0ustar # Hook addon for common utils # copy internal tcos conf cp $TCOS_DIR/tcos-run-functions.sh $DESTDIR/conf/tcos-run-functions cp $CONFDIR/tcos.conf $DESTDIR/conf/ for tpl in $(tcos_get_templates); do _verbose "(00main) cat $tpl >> $DESTDIR/conf/tcos.conf" cat $tpl >> $DESTDIR/conf/tcos.conf done # load forced settings for derivatives if [ -d $CONFDIR/conf.d/ ]; then for file in $CONFDIR/conf.d/tcos*conf; do [ -e $file ] && cat $file >> $DESTDIR/conf/tcos.conf done fi # clean tcos.conf file (delete empty lines and comments) grep -v "^#" $DESTDIR/conf/tcos.conf | grep "=" | grep -v "^TEMPLATE" > $DESTDIR/conf/tcos.conf.tmp mv $DESTDIR/conf/tcos.conf.tmp $DESTDIR/conf/tcos.conf # make some dirs [ -d $DESTDIR/dev ] || mkdir -m 0755 $DESTDIR/dev [ -d $DESTDIR/root ] || mkdir --mode=0700 $DESTDIR/root [ -d $DESTDIR/ram ] || mkdir $DESTDIR/ram [ -d $DESTDIR/nfs ] || mkdir $DESTDIR/nfs mkdir -p $DESTDIR/usr/bin mkdir -p $DESTDIR/usr/sbin mkdir -p $DESTDIR/lib/lsb/ cp /lib/lsb/init-functions ${DESTDIR}/lib/lsb/ cpifexists /etc/debian_version /etc/ cpifexists $TCOS_DIR/tcos-modules.conf /conf/ # seq script cpifexists ${TCOS_BINS}/seq /bin # get_filesystem cpifexists ${TCOS_BINS}/get_filesystem /bin # limits cpifexists ${TCOS_BINS}/set-limits /bin # exec and daemonize cpifexists ${TCOS_BINS}/daemonize.sh /sbin # tcos-pam-usb.sh (tcosxmlrpc helper) cpifexists ${TCOS_BINS}/tcos-pam-usb.sh /sbin rm -f $DESTDIR/sbin/start-stop-daemon # in tcos-buildchroot we save this exe file in start-stop-daemon.original if [ -e /sbin/start-stop-daemon.original ]; then copy_exec /sbin/start-stop-daemon.original /sbin/ rm -f $DESTDIR/sbin/start-stop-daemon.original cp -a /sbin/start-stop-daemon.original $DESTDIR/sbin/start-stop-daemon if ! file ${DESTDIR}/sbin/start-stop-daemon | grep -q ELF ; then _echo " * WARNING:" _echo " /sbin/start-stop-daemon is not a ELF (binary) file" _echo " Some apps will not work." fi elif [ -e /sbin/start-stop-daemon.REAL ]; then copy_exec /sbin/start-stop-daemon.REAL /sbin/ rm -f $DESTDIR/sbin/start-stop-daemon.REAL rm -f $DESTDIR/sbin/start-stop-daemon cp -a /sbin/start-stop-daemon.REAL $DESTDIR/sbin/start-stop-daemon if ! file ${DESTDIR}/sbin/start-stop-daemon | grep -q ELF ; then _echo " * WARNING:" _echo " /sbin/start-stop-daemon is not a ELF (binary) file" _echo " Some apps will not work." fi else copy_exec /sbin/start-stop-daemon /sbin/ rm -f $DESTDIR/sbin/start-stop-daemon cp -a /sbin/start-stop-daemon $DESTDIR/sbin/start-stop-daemon fi # exec and daemonize cpifexists ${TCOS_BINS}/clear-logs /bin if [ "${TCOS_INCLUDE_INIT}" != "1" ]; then # only include ldconfig in no NFS image # ubuntu hack for ldconfig if [ -e /sbin/ldconfig.real ]; then cpifexists /sbin/ldconfig.real /usr/sbin/ # rename rm -f $DESTDIR/usr/sbin/ldconfig.real cp -a /sbin/ldconfig.real $DESTDIR/usr/sbin/ldconfig else cpifexists /sbin/ldconfig /usr/sbin/ fi fi [ -f /etc/ld.so.conf ] && cpifexists /etc/ld.so.conf /etc/ [ ! -f /etc/ld.so.conf ] && echo "/usr/lib" >> $DESTDIR/etc/ld.so.conf # multiarch support mkdir -p $DESTDIR/etc/ld.so.conf.d/ MULTIARCH=$(basename $LIB_MULTIARCH) [ -f "/etc/ld.so.conf.d/${MULTIARCH}.conf" ] && cpifexists "/etc/ld.so.conf.d/${MULTIARCH}.conf" /etc/ld.so.conf.d/ cpifexists /sbin/depmod /sbin/ cpifexists /etc/localtime /etc/ [ -f /etc/adjtime ] && cpifexists /etc/adjtime /etc/ cpifexists /etc/securetty /etc cpifexists /etc/services /etc/ # create (if not exists) empty modules file touch $DESTDIR/etc/modules mkdir -p $DESTDIR/usr/lib mkdir -p $DESTDIR/${USRLIB_MULTIARCH} $DESTDIR/${LIB_MULTIARCH} # multiarch support LIB_DIR=/lib/ [ -e $LIB_MULTIARCH/libresolv.so.2 ] && LIB_DIR=$LIB_MULTIARCH cpifexists ${LIB_DIR}/libresolv.so.2 ${LIB_DIR}/ cpifexists ${USRLIB_MULTIARCH}/libgssapi_krb5.so.2 ${USRLIB_MULTIARCH}/ # need to copy this libs to support usernames with busybox cpifexists ${LIB_DIR}/libnss_compat.so.2 ${LIB_DIR}/ cpifexists ${LIB_DIR}/libnss_files.so.2 ${LIB_DIR}/ cpifexists ${LIB_DIR}/libnss_nis.so.2 ${LIB_DIR}/ cpifexists ${LIB_DIR}/libnss_dns.so.2 ${LIB_DIR}/ [ -e ${LIB_DIR}/libnss_db.so.2 ] && cpifexists ${LIB_DIR}/libnss_db.so.2 /usr/lib/ # new lib (needed for DNS calls) [ -e /lib/libnss_mdns4_minimal.so.2 ] && cpifexists /lib/libnss_mdns4_minimal.so.2 /lib/ [ -e ${LIB_DIR}/libnss_mdns4_minimal.so.2 ] && cpifexists ${LIB_DIR}/libnss_mdns4_minimal.so.2 ${LIB_DIR}/ # needed for NFS [ -x /sbin/portmap ] && cpifexists /sbin/portmap /sbin [ -x /sbin/rpcbind ] && cpifexists /sbin/rpcbind /sbin # create some dirs mkdir -p $DESTDIR/var/log touch $DESTDIR/var/log/lastlog mkdir -p ${DESTDIR}/var/run # hack run_scripts... TCOS use numbered cat << EOF >> $DESTDIR/scripts/functions # TCOS hacked ;) run_scripts() { initdir=\${1} [ ! -d \${1} ] && return for sc in \$(ls -t1 \${1}); do \${1}/\${sc} done } EOF tcos-0.89.93ubuntu2/hooks-addons/49xfbdev0000664000000000000000000000535112260610261015040 0ustar if [ -n "$TCOS_XFBDEV" ] && [ -x /usr/bin/Xfbdev ]; then stat_before _echo " * Using Xfbdev as Xserver" cpifexists /usr/bin/Xfbdev /usr/bin/ cat << EOF > $DESTDIR/usr/bin/Xorg #!/bin/sh echo "ARGS=\$@" > /tmp/xorg.args if [ "\$1" = "-version" ]; then echo "7.1" exit fi /usr/bin/Xfbdev \$@ -screen 1024x768x16 -mouse mouse,2 -3button -keybd keyboard # example # Xfbdev vt7 -query 192.168.0.3 -auth /root/.Xauthority -screen 1024x768x16 -mouse mouse,2 -3button EOF chmod +x $DESTDIR/usr/bin/Xorg install -m 755 ${TCOS_BINS}/tryXorg.sh ${DESTDIR}/sbin/tryXorg cpifexists /usr/bin/xauth /usr/bin cpifexists /usr/bin/mcookie /usr/bin # some xutils cpifexists /usr/bin/xset /usr/bin cpifexists /usr/bin/xsetroot /usr/bin cpifexists /usr/bin/xkbcomp /usr/bin XORG_XKB_DIR=/usr/share/X11/xkb/ [ ! -d "${XORG_XKB_DIR}" ] && XORG_XKB_DIR=/etc/X11/xkb/ mkdir -p ${DESTDIR}/usr/share/X11 # copy all dir (some files not needed) cp -ra ${XORG_XKB_DIR} ${DESTDIR}/usr/share/X11 # delete symlinks find ${DESTDIR}/usr/share/X11/ -type l | xargs rm -f -- # keymap DB cpifexists /usr/share/X11/XKeysymDB /usr/share/X11/ mkdir -p $DESTDIR/var/log mkdir -p $DESTDIR/etc/X11/xserver mkdir -p $DESTDIR/etc/X11/PreRun if [ -d /usr/share/fonts/X11 ]; then TCOS_FONTS_PATH="/usr/share/fonts/X11" TCOS_FONT_EXTENSION=".gz" elif [ ! -L /usr/lib/X11/fonts ]; then TCOS_FONTS_PATH="/usr/lib/X11/fonts" TCOS_FONT_EXTENSION="" else _echo "" _echo "ERROR: Cant' locate fonts dir, XFS is deprecated, BUG!!!" _echo "" TCOS_FONTS_PATH="" exit fi # end of -d /usr/share/fonts/X11 cat << EOF > ${DESTDIR}/sbin/configurexorg #!/bin/sh exit 0 EOF if [ "$TCOS_FONTS_PATH" != "" ]; then mkdir -p $DESTDIR/$TCOS_FONTS_PATH/misc mkdir -p $DESTDIR/$TCOS_FONTS_PATH/100dpi cat << EOF > $DESTDIR/$TCOS_FONTS_PATH/misc/fonts.alias fixed -misc-fixed-medium-r-semicondensed--13-120-75-75-c-60-iso8859-1 7x14 -misc-fixed-medium-r-semicondensed--14-120-75-75-c-60-iso8859-1 EOF cpifexists $TCOS_FONTS_PATH/misc/6x13-ISO8859-1.pcf${TCOS_FONT_EXTENSION} $TCOS_FONTS_PATH/misc cpifexists $TCOS_FONTS_PATH/misc/cursor.pcf${TCOS_FONT_EXTENSION} $TCOS_FONTS_PATH/misc mkfontdir $DESTDIR/$TCOS_FONTS_PATH/misc cpifexists $TCOS_FONTS_PATH/100dpi/helvB24-ISO8859-1.pcf${TCOS_FONT_EXTENSION} $TCOS_FONTS_PATH/100dpi cpifexists $TCOS_FONTS_PATH/100dpi/helvB08-ISO8859-1.pcf${TCOS_FONT_EXTENSION} $TCOS_FONTS_PATH/100dpi mkfontdir $DESTDIR/$TCOS_FONTS_PATH/100dpi fi # end of $TCOS_FONTS_PATH stat_after "Xfbdev" fi tcos-0.89.93ubuntu2/hooks-addons/50xorg0000664000000000000000000002651512260610261014536 0ustar # hooks addon of Xorg # compatible with Xorg 7.x if [ -z "$TCOS_XFBDEV" ] && [ $TCOS_XORG ]; then # Xorg stuff stat_before if [ "$(pathof Xorg)" = /usr/bin/Xorg ]; then XORG=7 #_echo " USING Xorg 7.X dirs" XORG_PATH=/usr/bin else _echo " **ERROR** Xorg not found" exit fi cpifexists $XORG_PATH/Xorg /usr/bin cpifexists $XORG_PATH/xauth /usr/bin cpifexists $XORG_PATH/mcookie /usr/bin cpifexists $XORG_PATH/xhost /usr/bin cpifexists $XORG_PATH/xterm /usr/bin if [ -e $XORG_PATH/twm ]; then cpifexists $XORG_PATH/twm /usr/bin else _echo " WARNING: twm package not found" fi # some xutils cpifexists $XORG_PATH/xset /usr/bin cpifexists $XORG_PATH/xsetroot /usr/bin cpifexists $XORG_PATH/sessreg /usr/bin cpifexists $XORG_PATH/xkbcomp /usr/bin # bin to wait until Xorg is started cpifexists ${TCOS_BINS}/waitforX /usr/bin/ cpifexists ${TCOS_BINS}/get_vga_vendor /usr/bin/ mkdir -p $DESTDIR/var/log mkdir -p $DESTDIR/etc/X11/xserver mkdir -p $DESTDIR/etc/X11/PreRun mkdir -p $DESTDIR/etc/X11/xserver/ # copy xorg.conf template and generator cp ${TCOS_CONF}/xorg.conf.tpl ${DESTDIR}/conf/xorg.conf.tpl install -m 755 ${TCOS_BINS}/configurexorg ${DESTDIR}/sbin/configurexorg install -m 755 ${TCOS_BINS}/tryXorg.sh ${DESTDIR}/sbin/tryXorg # new xorg.conf.d configuration files XORG_CONF_PATH=/usr/lib/X11/xorg.conf.d/ [ -d /usr/share/X11/xorg.conf.d ] && XORG_CONF_PATH=/usr/share/X11/xorg.conf.d/ for f in $(find $XORG_CONF_PATH -type f 2>/dev/null); do mkdir -p $DESTDIR/$XORG_CONF_PATH cp $f $DESTDIR/$XORG_CONF_PATH done # include xorg PCI IDS file mkdir -p ${DESTDIR}/usr/share/xserver-xorg/pci/ cpifexists ${TCOS_DIR}/inc/xorg.pciids /usr/share/xserver-xorg/pci/ mkdir -p $DESTDIR/usr/lib/xorg/modules/ # new in xorg 1.5 [ -e /usr/lib/xorg/protocol.txt ] && cpifexists /usr/lib/xorg/protocol.txt /usr/lib/xorg/ # FONTS modules [ -d /usr/lib/xorg/modules/fonts ] && copydir /usr/lib/xorg/modules/fonts /usr/lib/xorg/modules/ if [ -d /usr/share/fonts/X11 ]; then TCOS_FONTS_PATH="/usr/share/fonts/X11" TCOS_FONT_EXTENSION=".gz" elif [ ! -L /usr/lib/X11/fonts ]; then TCOS_FONTS_PATH="/usr/lib/X11/fonts" TCOS_FONT_EXTENSION="" else _echo "" _echo "ERROR: Cant' locate fonts dir, XFS is deprecated, BUG!!!" _echo "" TCOS_FONTS_PATH="" exit fi if [ "$TCOS_FONTS_PATH" != "" ]; then mkdir -p $DESTDIR/$TCOS_FONTS_PATH/misc mkdir -p $DESTDIR/$TCOS_FONTS_PATH/100dpi cat << EOF > $DESTDIR/$TCOS_FONTS_PATH/misc/fonts.alias fixed -misc-fixed-medium-r-semicondensed--13-120-75-75-c-60-iso8859-1 7x14 -misc-fixed-medium-r-semicondensed--14-120-75-75-c-60-iso8859-1 EOF cpifexists $TCOS_FONTS_PATH/misc/6x13-ISO8859-1.pcf${TCOS_FONT_EXTENSION} $TCOS_FONTS_PATH/misc cpifexists $TCOS_FONTS_PATH/misc/cursor.pcf${TCOS_FONT_EXTENSION} $TCOS_FONTS_PATH/misc mkfontdir $DESTDIR/$TCOS_FONTS_PATH/misc cpifexists $TCOS_FONTS_PATH/100dpi/helvB24-ISO8859-1.pcf${TCOS_FONT_EXTENSION} $TCOS_FONTS_PATH/100dpi cpifexists $TCOS_FONTS_PATH/100dpi/helvB08-ISO8859-1.pcf${TCOS_FONT_EXTENSION} $TCOS_FONTS_PATH/100dpi mkfontdir $DESTDIR/$TCOS_FONTS_PATH/100dpi fi # PCIIDS if [ -d /usr/share/xserver-xorg/pci ] ; then mkdir -p $DESTDIR/usr/share/xserver-xorg/ copydir /usr/share/xserver-xorg/pci /usr/share/xserver-xorg/ fi # MODULES mkdir -p $DESTDIR/usr/lib/xorg/modules/input/ for _ext in $(ls /usr/lib/xorg/modules/lib*so); do cpifexists $_ext /usr/lib/xorg/modules/ done for _inp in $(ls /usr/lib/xorg/modules/input/*); do cpifexists $_inp /usr/lib/xorg/modules/input/ done if [ -d /usr/lib/xorg/modules/linux ]; then mkdir -p $DESTDIR/usr/lib/xorg/modules/linux for _lnx in $(ls /usr/lib/xorg/modules/linux/lib*so); do cpifexists $_lnx /usr/lib/xorg/modules/linux/ done fi # DRIVERS and EXTENSIONS mkdir -p $DESTDIR/usr/lib/xorg/modules/drivers # essential xorg driver cpifexists /usr/lib/xorg/modules/drivers/vesa_drv.so /usr/lib/xorg/modules/drivers/ if [ $TCOS_XORG_ALLDRIVERS ]; then driver_dir=/usr/lib/xorg/modules/drivers _echo " Xorg: installing all drivers..." for _drv in $(ls ${driver_dir}/*so|grep -v -e nvidia -e vmware -e vbox); do cpifexists $_drv ${driver_dir}/ done rm -f $DESTDIR/${driver_dir}/nvidia_drv.so fi mkdir -p $DESTDIR/usr/lib/xorg/modules/extensions # copy linked libs for _file in $(ls /usr/lib/xorg/modules/extensions/lib*.so| grep -v glx); do cpifexists $_file /usr/lib/xorg/modules/extensions/ done # delete nvidia/ati glx module rm -f $DESTDIR/usr/lib/xorg/modules/extensions/libglx.so* rm -f $DESTDIR/usr/lib/xorg/modules/libwfb.so rm -f $DESTDIR/usr/lib/xorg/modules/libnvidia-wfb.so.* rm -f $DESTDIR/usr/lib/xorg/modules/extensions/libGLcore.so rm -f $DESTDIR/usr/lib/libnvidia-* rm -f ${DESTDIR}/etc/modprobe.d/nvidia* # for multiarch rm -rf $DESTDIR/usr/lib/*/libnvidia-* # delete linked nvidia driver (10Mb) rm -f $DESTDIR/usr/lib/libGL* LIBGL_PATH=/usr/lib/ if [ -e /usr/lib/mesa/libGL.so.1 ]; then LIBGL_PATH=/usr/lib/mesa/ fi MULTIARCH=$(basename $LIB_MULTIARCH) # multiarch support [ -e $USRLIB_MULTIARCH/libGL.so.1 ] && LIBGL_PATH=$USRLIB_MULTIARCH [ -e $USRLIB_MULTIARCH/mesa/libGL.so.1 ] && LIBGL_PATH=$USRLIB_MULTIARCH/mesa/ [ -e "/usr/lib/mesa-diverted/$MULTIARCH/libGL.so.1" ] && LIBGL_PATH="/usr/lib/mesa-diverted/$MULTIARCH/" # delete vnc extension rm -f $DESTDIR/usr/lib/xorg/modules/extensions/libvnc.so if [ $TCOS_XORG_OPENGL ]; then _echo " * OpenGL support is ENABLED" if [ "$(strings $LIBGL_PATH/libGL.so.1|grep -c NVIDIA)" != 0 ] || \ [ "$(strings /usr/lib/xorg/modules/extensions/libglx.so 2>&1 |grep -c NVIDIA)" != 0 ] || \ [ "$(strings $LIBGL_PATH/libGL.so.1|grep -c -i fgl)" != 0 ]; then if [ -d ${TCOS_PKG_CACHE}/fix-nvidia-ati ]; then rm -rf $DESTDIR/usr/lib/xorg/modules/libglx.so* rm -f $DESTDIR/usr/lib/xorg/modules/libnvidia-wfb.so.* [ -e ${TCOS_PKG_CACHE}/fix-nvidia-ati/libGLcore.so ] && \ cpifexists ${TCOS_PKG_CACHE}/fix-nvidia-ati/libGLcore.so /usr/lib/xorg/modules/extensions/ cpifexists ${TCOS_PKG_CACHE}/fix-nvidia-ati/libglx.so /usr/lib/xorg/modules/extensions/ cpifexists ${TCOS_PKG_CACHE}/fix-nvidia-ati/libGL.so.1.2 /usr/lib/ [ -e /usr/lib/libGLU.so.1 ] && cpifexists /usr/lib/libGLU.so.1 /usr/lib/ [ -f ${TCOS_PKG_CACHE}/fix-nvidia-ati/libwfb.so ] && \ cpifexists ${TCOS_PKG_CACHE}/fix-nvidia-ati/libwfb.so /usr/lib/xorg/modules/ _echo " * OpenGL use cached fix-nvidia-ati libs" else _echo " ********************************************** " _echo " WARNING: NVIDIA/ATI libs found !!!!!! " _echo " " _echo " Please fix with: gentcos -fix-nvidia-ati " _echo " or uninstall nvidia/ati drivers " _echo " " _echo " OpenGL support will not work on thin clients " _echo " ********************************************** " fi else cpifexists /usr/lib/xorg/modules/extensions/libglx.so /usr/lib/xorg/modules/extensions/ [ -e /usr/lib/xorg/modules/extensions/libGLcore.so ] && \ cpifexists /usr/lib/xorg/modules/extensions/libGLcore.so /usr/lib/xorg/modules/extensions/ cpifexists $LIBGL_PATH/libGL.so.1 /usr/lib/ [ -e /usr/lib/libGLcore.so.1 ] && cpifexists /usr/lib/libGLcore.so.1 /usr/lib/ [ -e /usr/lib/libGLU.so.1 ] && cpifexists /usr/lib/libGLU.so.1 /usr/lib/ fi # end of NVIDIA/ATI strings if [ -e $DESTDIR/usr/lib/libGL.so.1 ];then if [ "$(strings $DESTDIR/usr/lib/libGL.so.1|grep -c NVIDIA)" != 0 ] || \ [ "$(strings $DESTDIR/usr/lib/libGL.so.1|grep -c -i fgl)" != 0 ]; then rm -rf $DESTDIR/usr/lib/libGL.so.1 fi fi if [ -e $DESTDIR/usr/lib/libGLcore.so.1 ];then if [ "$(strings $DESTDIR/usr/lib/libGLcore.so.1|grep -c NVIDIA)" != 0 ] || \ [ "$(strings $DESTDIR/usr/lib/libGLcore.so.1|grep -c -i fgl)" != 0 ]; then rm -rf $DESTDIR/usr/lib/libGLcore.so.1 fi fi else _echo " * OpenGL support is not enabled!!" fi # end of $TCOS_XORG_OPENGL # keyboard and keymap XORG_XKB_DIR=/usr/share/X11/xkb/ [ ! -d "${XORG_XKB_DIR}" ] && XORG_XKB_DIR=/etc/X11/xkb/ mkdir -p ${DESTDIR}/usr/share/X11 # copy all dir (some files not needed) cp -ra ${XORG_XKB_DIR} ${DESTDIR}/usr/share/X11 # delete symlinks find ${DESTDIR}/usr/share/X11/ -type l | xargs rm -f -- # keymap DB [ -e /usr/share/X11/XKeysymDB ] && cpifexists /usr/share/X11/XKeysymDB /usr/share/X11/ # xorg locale mkdir -p $DESTDIR/usr/share/locale mkdir -p $DESTDIR/usr/lib/X11 [ -d /usr/lib/X11/locale ] && copydir /usr/lib/X11/locale/ /usr/lib/X11/ #copydir /usr/lib/X11/config/ /usr/lib/X11/ [ -e /etc/X11/rgb.txt ] && cpifexists /etc/X11/rgb.txt /etc/X11/ stat_after "Xorg" fi # end of TCOS_XORG ############### XORG SCRIPTS #################### cat < $DESTDIR/sbin/killX #!/bin/sh echo \"killing xorg process...\" killall Xorg 2>/dev/null EOF chmod +x $DESTDIR/sbin/killX cat < $DESTDIR/sbin/restartxorg #!/bin/sh killall Xorg 2>/dev/null EOF chmod +x $DESTDIR/sbin/restartxorg cat < $DESTDIR/sbin/startlocalx #!/bin/sh export DISPLAY=:0 export HOME=/root if [ -f \$XAUTHORITY ]; then TCOS_XORG_OPTS="\$TCOS_XORG_OPTS -auth \$XAUTHORITY" fi /sbin/tryXorg --xorgopts="\${TCOS_XORG_OPTS}" & waitforX || exit sleep 1 xterm >> /tmp/initramfs.debug 2>&1 & twm >> /tmp/initramfs.debug 2>&1 & # set background color xsetroot -cursor_name left_ptr -solid "#338899" EOF chmod +x $DESTDIR/sbin/startlocalx cat < $DESTDIR/sbin/startnx #!/bin/sh . /conf/tcos.conf . /conf/tcos-run-functions SERVER=\$(read_server "xdmcp-server") export DISPLAY=:0 export HOME=/root export USER_NX_DIR=/root/.nx if [ -x /usr/bin/ssh ]; then ssh -N -p 2022 -l mario -C -2 -L 5000:localhost:2022 ${SERVER} fi if [ -f $\XAUTHORITY ]; then TCOS_XORG_OPTS="\$TCOS_XORG_OPTS -auth \$XAUTHORITY" fi /sbin/tryXorg --xorgopts="\${TCOS_XORG_OPTS}" & waitforX || exit sleep 1 # no window manager for freenx #twm >> /tmp/initramfs.debug 2>&1 & sleep 2 # set background color xsetroot -cursor_name left_ptr -solid "#338899" /usr/NX/bin/nxclient >> /tmp/initramfs.debug 2>&1 xterm EOF chmod +x $DESTDIR/sbin/startnx cat < $DESTDIR/sbin/startremotex #!/bin/sh . /conf/tcos.conf . /conf/tcos-run-functions SERVER=\$(read_server "xdmcp-server") export DISPLAY=:0 if [ -f \$XAUTHORITY ]; then TCOS_XORG_OPTS="\$TCOS_XORG_OPTS -auth \$XAUTHORITY" fi /sbin/tryXorg --server=\${SERVER} --xorgopts="\${TCOS_XORG_OPTS} -query \${SERVER}" & EOF chmod +x $DESTDIR/sbin/startremotex # FIXME, not documented cat < $DESTDIR/sbin/startsshx #!/bin/sh . /conf/tcos.conf . /conf/tcos-run-functions SERVER=\$(read_server "xdmcp-server") export DISPLAY=:0 export HOME=/root if [ -f \$XAUTHORITY ]; then TCOS_XORG_OPTS="\$TCOS_XORG_OPTS -auth \$XAUTHORITY" fi /sbin/tryXorg --xorgopts="\${TCOS_XORG_OPTS}" & waitforX || exit sleep 1 remoteuser=\$(read_cmdline_var "sshuser" "root") remotesshhost=\$(read_cmdline_var "sshhost" "\${SERVER}") remotesshport=\$(read_cmdline_var "sshport" "2022") # gnome-session, startkde , startxfce4 remotesshdesktop=\$(read_cmdline_var "sshdesktop" "startxfce4") while [ 1 ]; do xterm -e "echo \"SSH \${remoteuser}@\${remotesshhost} -p \${remotesshport}...\" ; ssh -X -C -f -l \${remoteuser} \${remotesshhost} -p \${remotesshport} \${remotesshdesktop}" done EOF chmod +x $DESTDIR/sbin/startsshx tcos-0.89.93ubuntu2/hooks-addons/14ssh0000664000000000000000000000171712260610261014351 0ustar # hooks addon to have a SSH daemon in terminal # need dropbear SSH package if [ ! $TCOS_SSH ] ;then _verbose "(14ssh) TCOS_SSH disabled" else stat_before if [ ! -d /usr/share/doc/dropbear ]; then echo "WARNING" echo "" echo "Please install dropbear package or disable SSH support." echo " => apt-get install dropbear" echo "" else mkdir -p $DESTDIR/etc mkdir -p $DESTDIR/usr/lib/dropbear mkdir -p $DESTDIR/var/log/dropbear mkdir -p $DESTDIR/var/run/dropbear copydir /etc/dropbear/ /etc/ rm -f $DESTDIR/etc/dropbear/supervise rm -f $DESTDIR/etc/dropbear/log/supervise rm -f $DESTDIR/etc/dropbear/log/main cpifexists /usr/sbin/dropbear /usr/bin/ # ssh server cpifexists /usr/bin/dbclient /usr/bin/ # ssh client ( no have ssh -X support ) cpifexists /usr/lib/dropbear/dropbearconvert /usr/lib/dropbear/ fi stat_after "Dropbear ssh server" fi # end of TCOS_SSH tcos-0.89.93ubuntu2/hooks-addons/51dri0000664000000000000000000000302312260610261014323 0ustar # hook addon for enable direct rendering #TCOS_XORG_DRI= #TCOS_XORG_DRI_INTEL= #TCOS_XORG_DRI_ATI= #TCOS_XORG_DRI_SAVAGE= #TCOS_XORG_DRI_SIS= #TCOS_XORG_DRI_TRIDENT= #TCOS_XORG_DRI_UNICHROME= #TCOS_XORG_DRI_MATROX= DRI_DIR=/usr/lib/dri/ [ -d $USRLIB_MULTIARCH/dri ] && DRI_DIR=$USRLIB_MULTIARCH/dri/ mkdir -p ${DESTDIR}/${DRI_DIR} copy_dri() { [ -e "${DRI_DIR}/$1" ] && cpifexists ${DRI_DIR}/$1 ${DRI_DIR} } if [ $TCOS_XORG_DRI_INTEL ]; then stat_before copy_dri i810_dri.so copy_dri i915_dri.so copy_dri i965_dri.so stat_after "Intel DRI" fi if [ $TCOS_XORG_DRI_ATI ]; then stat_before copy_dri r128_dri.so copy_dri r200_dri.so copy_dri r300_dri.so copy_dri r600_dri.so copy_dri radeon_dri.so stat_after "ATI DRI" fi if [ $TCOS_XORG_DRI_SAVAGE ]; then stat_before copy_dri s3v_dri.so copy_dri savage_dri.so stat_after "Savage DRI" fi if [ $TCOS_XORG_DRI_SIS ]; then stat_before copy_dri sis_dri.so stat_after "SiS DRI" fi if [ $TCOS_XORG_DRI_TRIDENT ]; then stat_before copy_dri trident_dri.so copy_dri tdfx_dri.so stat_after "Trident DRI" fi if [ $TCOS_XORG_DRI_UNICHROME ]; then stat_before copy_dri unichrome_dri.so stat_after "Unichrome DRI" fi if [ $TCOS_XORG_DRI_MATROX ]; then stat_before copy_dri mach64_dri.so copy_dri mga_dri.so stat_after "Matrox DRI" fi if [ $TCOS_XORG_DRI ]; then _echo " ** WARNING: TCOS_XORG_DRI is deprecated, generate new config." fi # Software Rendering DRI extension (always copy) copy_dri swrast_dri.so tcos-0.89.93ubuntu2/hooks-addons/04debug0000664000000000000000000000170612260610261014637 0ustar # hooks addon DEBUG support # need strace, lsmod and ldd wrapper # for debug purposes if [ ! $TCOS_DEBUG_TOOLS ]; then _verbose "(04debug) TCOS_DEBUG_TOOLS disabled" else stat_before mkdir -p $DESTDIR/lib/terminfo/l/ mkdir -p $DESTDIR/lib/terminfo/x/ cp -a /lib/terminfo/l/linux $DESTDIR/lib/terminfo/l/ cp -a /lib/terminfo/x/xterm* $DESTDIR/lib/terminfo/x/ [ -e /usr/sbin/iftop ] && cpifexists /usr/sbin/iftop /usr/bin/ cpifexists /bin/lsmod /usr/bin/ [ -e /usr/bin/strace ] && cpifexists /usr/bin/strace /usr/bin/ cpifexists /sbin/mkfs /sbin/ cpifexists /sbin/mkfs.vfat /sbin/ cpifexists /sbin/mke2fs /sbin/ stat_after "Debug tools" fi # end of TCOS_DEBUG_TOOLS cat < $DESTDIR/bin/ldd #!/bin/sh file=\$1 if [ ! -f /\$file ]; then file=\$(which \$file) fi if [ ! -e \${file} ]; then echo "\${file} not found" exit 1 fi `ldd /sbin/mkfs | awk '/ld-linux/{print $1}'` --list \$file EOF chmod +x $DESTDIR/bin/ldd tcos-0.89.93ubuntu2/hooks-addons/13kbmap0000664000000000000000000000207012260610261014636 0ustar # hook addon for keymap if [ -e $DESTDIR/bin/loadkeys ]; then if [ -e $DESTDIR/etc/console/boottime.kmap.gz ] || [ -e /etc/console-setup/cached.kmap.gz ] ; then # don't copy again if exists _verbose "(13kbmap) No copy keymaps again" fi else # server kbmap cpifexists /bin/loadkeys /bin if [ -f /etc/console/boottime.kmap.gz ]; then mkdir -p $DESTDIR/etc/console cp -ra /etc/console/boottime.kmap.gz $DESTDIR/etc/console/ fi # for ubuntu if [ -f /etc/console-setup/boottime.kmap.gz ]; then mkdir -p $DESTDIR/etc/console cp -ra /etc/console-setup/boottime.kmap.gz $DESTDIR/etc/console/ fi # for new console-setup if [ -f /etc/console-setup/cached.kmap.gz ]; then mkdir -p $DESTDIR/etc/console-setup cp -ra /etc/console-setup/cached.kmap.gz $DESTDIR/etc/console-setup/cached.kmap.gz fi # for new console-setup if [ -f /etc/console-setup/cached_UTF-8_del.kmap.gz ]; then mkdir -p $DESTDIR/etc/console-setup cp -ra /etc/console-setup/cached_UTF-8_del.kmap.gz $DESTDIR/etc/console-setup/cached.kmap.gz fi fi tcos-0.89.93ubuntu2/hooks-addons/45wakeonlan0000664000000000000000000000073512260610261015536 0ustar # WAKEONLAN support # need to copy ethtool to image # if [ $TCOS_WAKEONLAN ]; then if [ -x /sbin/ethtool ]; then cpifexists /sbin/ethtool /sbin elif [ -x /usr/sbin/ethtool ]; then cpifexists /usr/sbin/ethtool /sbin else _echo " WARNING:" _echo " WAKEONLAN enabled but ethtool package not found !!!" _echo " Please install ethtool or disable WAKEONLAN" _echo "" fi else _verbose "(45wakeonlan) TCOS_WAKEONLAN disabled" fi tcos-0.89.93ubuntu2/hooks-addons/00init0000664000000000000000000000230412260610261014503 0ustar # create reboot && poweroff scripts if [ "${TCOS_INCLUDE_INIT}" = "1" ]; then # now copy reboot and poweroff in /usr/sbin outside of # usr.squashfs, because reboot -f is exec after umount /usr stat_before mkdir -p $DESTDIR/usr/sbin >/dev/null 2>&1 mkdir -p $DESTDIR/lib/cmds >/dev/null 2>&1 # init reboot poweroff cpifexists /sbin/reboot /lib/cmds/ cpifexists /sbin/poweroff /lib/cmds/ cpifexists ${TCOS_BINS}/down-controller /sbin/ rm -f $DESTDIR/bin/reboot rm -f $DESTDIR/bin/poweroff rm -f $DESTDIR/bin/halt # reboot script cat < ${DESTDIR}/sbin/reboot #!/bin/sh # reboot wrapper . /scripts/functions . /conf/tcos-run-functions kill_xorg clear log_begin_msg "Rebooting" log_end_msg 0 kill_all umount_swap umount_all /lib/cmds/reboot -f EOF chmod +x ${DESTDIR}/sbin/reboot # poweroff script cat < ${DESTDIR}/sbin/poweroff #!/bin/sh # poweroff wrapper . /scripts/functions . /conf/tcos-run-functions kill_xorg clear log_begin_msg "Poweroff system" log_end_msg 0 kill_all umount_swap umount_all /lib/cmds/poweroff -f EOF chmod +x $DESTDIR/sbin/poweroff stat_after "Init binaries" fi tcos-0.89.93ubuntu2/hooks-addons/57ntpdate0000664000000000000000000000043312260610261015214 0ustar # hook to update date/time in thin clients if [ ! $TCOS_NTPDATE ]; then _verbose "(57ntpdate) TCOS_NTPDATE" else if [ ! -e /usr/sbin/ntpdate ]; then _echo " * ntpdate not installed" fi stat_before cpifexists /usr/sbin/ntpdate /usr/bin/ stat_after "ntpdate" fi tcos-0.89.93ubuntu2/hooks-addons/53mga0000664000000000000000000000130312260610261014312 0ustar # hook addon for thin clients with chip Matrox MGA* cat << EOF > ${DESTDIR}/scripts/tcos-bottom/15mga #!/bin/sh # if [ "\$1" = "prereqs" ]; then exit 0 fi quiet=n . /scripts/functions . /conf/tcos.conf . /conf/tcos-run-functions #ids="2064w 1064sg 2164w g100 g200 g400 g550" test1=\$(get_vga_vendor "102B") if [ "\$test1" != "1" ]; then # not in client with chip Matrox mga exit 0 else if [ -f /usr/lib/xorg/modules/drivers/mga_drv.so ]; then log_begin_msg "Loading support Matrox MGA driver" configurexorg --newsettings --xdriver=mga --outputfile=/etc/X11/xorg.conf 2>> /tmp/initramfs.debug log_end_msg \$? fi fi EOF chmod +x ${DESTDIR}/scripts/tcos-bottom/15mga tcos-0.89.93ubuntu2/hooks-addons/01dhclient0000664000000000000000000000157312260610261015342 0ustar # hook addon DHCLIENT # necessary busybox package # some network stuff touch $DESTDIR/etc/hosts.allow touch $DESTDIR/etc/hosts.deny cpifexists /etc/host.conf /etc/ sed '/hosts:/ chosts: files dns' /etc/nsswitch.conf > $DESTDIR/etc/nsswitch.conf # put DNS server dns1=$(grep ^nameserver /etc/resolv.conf 2>/dev/null | grep -v "127.0.0.1" | head -1 | awk '{print $2}') echo "TCOS_DNS_SERVER=${dns1}" >> ${DESTDIR}/conf/tcos.conf BUSYBOX=/bin/busybox [ -e ${DESTDIR}/bin/busybox ] && BUSYBOX=${DESTDIR}/bin/busybox cpifexists ${TCOS_BINS}/udhcpc-script /bin/ check=$(${BUSYBOX} udhcpc -O 290 2>&1| grep -c swapsrv) if [ -e ${TCOS_BINS}/busybox ] || [ "${check}" != "0" ]; then echo " * busybox udhcpc support 'swapsrv' option" >/dev/null else echo "ERROR" echo "" echo "NO UDHCP support, please install a recent busybox/udhcpc (>= 1:1.13.3) package." echo "" fi tcos-0.89.93ubuntu2/hooks-addons/06nbd_filesystem0000664000000000000000000000022712260610261016557 0ustar #if [ -e /sbin/nbd-client ]; then # # stat_before # manual_add_modules nbd # cpifexists /sbin/nbd-client /sbin # stat_after "NBD client" # # #fi tcos-0.89.93ubuntu2/hooks-addons/99clean_nfs_image0000664000000000000000000000375612260610261016670 0ustar # addon to clean initramfs-$(uname -r)-nfs # only exec in tcos-nfs boot if [ "${BOOT}" = "tcos-nfs" ]; then stat_before # not delete ide and ata #rm -rf ${DESTDIR}/lib/modules/${version}/kernel/drivers/ide #rm -rf ${DESTDIR}/lib/modules/${version}/kernel/drivers/ata #rm -rf ${DESTDIR}/lib/modules/${version}/kernel/drivers/scsi #rm -rf ${DESTDIR}/lib/modules/${version}/kernel/drivers/cdrom # delete fstab #rm -f ${DESTDIR}/scripts/tcos-top/*fstab # delete some kernel modules rm -rf ${DESTDIR}/lib/modules/${version}/kernel/drivers/usb rm -rf ${DESTDIR}/lib/modules/${version}/kernel/drivers/ieee1394 rm -rf ${DESTDIR}/lib/modules/${version}/kernel/drivers/firewire rm -rf ${DESTDIR}/lib/modules/${version}/kernel/drivers/pcmcia rm -rf ${DESTDIR}/lib/modules/${version}/kernel/drivers/md rm -rf ${DESTDIR}/lib/modules/${version}/kernel/drivers/message # filesystems rm -rf ${DESTDIR}/lib/modules/${version}/kernel/fs/xfs rm -rf ${DESTDIR}/lib/modules/${version}/kernel/fs/reiserfs rm -rf ${DESTDIR}/lib/modules/${version}/kernel/fs/jfs rm -rf ${DESTDIR}/lib/modules/${version}/kernel/fs/ext3 rm -rf ${DESTDIR}/lib/modules/${version}/kernel/fs/jbd rm -rf ${DESTDIR}/lib/modules/${version}/kernel/fs/isofs/ # delete some bins rm -rf ${DESTDIR}/scripts/local* rm -rf ${DESTDIR}/scripts/nfs* rm -rf ${DESTDIR}/scripts/tcos-bottom rm -rf ${DESTDIR}/scripts/tcos-premount rm -rf ${DESTDIR}/sbin/vgchange rm -rf ${DESTDIR}/lib/libdevmapper* rm -f ${DESTDIR}/sbin/usplash* rm -rf ${DESTDIR}/usr/lib/usplash* rm -f ${DESTDIR}/lib*splash* rm -f ${DESTDIR}/scripts/init-top/*usplash* rm -f ${DESTDIR}/scripts/init-top/*framebuffer* rm -f ${DESTDIR}/sbin/resume rm -f ${DESTDIR}/bin/strace mv ${DESTDIR}/usr/lib/liblzo*so* ${DESTDIR}/lib/ >/dev/null 2>&1 rm -rf ${DESTDIR}/usr/lib # add again ata scsi and ide modules tcos_manual_add_modules libata tcos_manual_add_modules scsi-mod tcos_manual_add_modules ide-generic tcos_manual_add_modules ata-generic tcos_manual_add_modules ide-cd stat_after "Clean NFS initramfs" fi tcos-0.89.93ubuntu2/hooks-addons/99tcos0000664000000000000000000000226612260610261014541 0ustar # save generated date and version into tcos.conf if [ -e /var/lib/tcos/version.conf ]; then cat /var/lib/tcos/version.conf >> ${DESTDIR}/conf/tcos.conf fi # load forced settings for derivatives if [ -d $CONFDIR/conf.d/ ]; then for file in $CONFDIR/conf.d/tcos*conf; do [ -e $file ] && cat $file >> ${DESTDIR}/conf/tcos.conf done fi tcos_date=$(LANG=C LC_ALL=C date) echo "# date of image" >> ${DESTDIR}/conf/tcos.conf echo "TCOS_DATE=\"${tcos_date}\"" >> ${DESTDIR}/conf/tcos.conf echo "" >> ${DESTDIR}/conf/tcos.conf # export some vars echo "" >> ${DESTDIR}/conf/tcos.conf echo "# some environment vars" >> ${DESTDIR}/conf/tcos.conf echo "export XAUTHORITY=/root/.Xauthority" >> ${DESTDIR}/conf/tcos.conf echo "export HOME=/root" >> ${DESTDIR}/conf/tcos.conf echo "export DISPLAY=:0" >> ${DESTDIR}/conf/tcos.conf echo "export PATH=/bin:/sbin:/usr/bin:/usr/sbin" >> ${DESTDIR}/conf/tcos.conf cat << EOF > $DESTDIR/etc/issue TCOS $TCOS_VERSION \n \l EOF # reduce /dev tmpfs size to 5Mb if [ -e $DESTDIR/init ]; then sed -i '/tmpfs_size/s/"10M"/"5M"/g' $DESTDIR/init fi if [ -e $DESTDIR/etc/udev/udev.conf ]; then sed -i '/tmpfs_size/s/"10M"/"5M"/g' $DESTDIR/etc/udev/udev.conf fi tcos-0.89.93ubuntu2/hooks-addons/52intel0000664000000000000000000000071512260610261014666 0ustar # hook for intel graphics card # Copyright Rubén Gómez Antolí cat << EOF > $DESTDIR/sbin/disable_dpms #!/bin/sh sleep 2 waitforX || exit # disable dpms sleep 2 xset -dpms EOF chmod +x $DESTDIR/sbin/disable_dpms cat << EOF > $DESTDIR/etc/X11/PreRun/30intel_dpms #!/bin/sh test1=0 test1=\$(get_vga_vendor 8086) if [ "\$test1" = "1" ]; then /sbin/disable_dpms & fi EOF chmod +x $DESTDIR/etc/X11/PreRun/30intel_dpms tcos-0.89.93ubuntu2/hooks-addons/01busybox0000664000000000000000000000245612260610261015244 0ustar # hook addon for busybox # check for a decent version of busybox # ubuntu busybox-initramfs don't have some utils if [ -e "${TCOS_BINS}/busybox" ]; then _echo " Found busybox in ${TCOS_BINS}/busybox" [ -e $DESTDIR/bin/busybox ] && rm -f $DESTDIR/bin/busybox cpifexists ${TCOS_BINS}/busybox /bin/ elif [ $DESTDIR/bin/busybox ]; then test1=$($DESTDIR/bin/busybox tftp --help 2>&1 | grep -c -i usage) test2=$($DESTDIR/bin/busybox awk --help 2>&1 | grep -c -i usage) test3=$($DESTDIR/bin/busybox losetup --help 2>&1 | grep -c -i usage) if [ $test1 = 0 -o $test2 = 0 -o $test3 = 0 ]; then if [ -x /bin/busybox ]; then _echo " INFO: Better busybox found, replacing it..." rm -f $DESTDIR/bin/busybox cpifexists /bin/busybox /bin/ else _echo "ERROR:" _echo "" _echo " The initramfs busybox version don't have some needed utils." _echo " Please install other busybox that have awk, tftp, and losetup" _echo "" _echo " This TCOS image will not work." _echo "" fi else _echo " Busybox pass all tests OK" fi # check for busybox static #if ldd /bin/busybox | grep -q libc; then # _echo " busybox (not-static) getty and login disabled" #fi else _echo "busybox not found in initramfs yet..." fi tcos-0.89.93ubuntu2/hooks-addons/40etc23000000664000000000000000000000150412260610261014625 0ustar # hook addon for EPATEC eTC2300 cat << EOF > ${DESTDIR}/scripts/tcos-bottom/15etc2300 #!/bin/sh # # new header not using prereqs if [ "\$1" = "prereqs" ]; then echo "" exit 0 fi quiet=n . /conf/tcos.conf . /conf/tcos-run-functions test1=\$(grep -c "10395315" /proc/bus/pci/devices) if [ "\$test1" = "0" ]; then # no client with chip Silicon Integrated Systems [SiS] 550 PCI/AGP VGA Display Adapter exit 0 fi echo "#/scripts/tcos-bottom/15etc2300" >> /conf/tcos.conf echo "TCOS_XORG_VIDEO_DRIVER=auto" >> /conf/tcos.conf EOF chmod +x ${DESTDIR}/scripts/tcos-bottom/15etc2300 stat_before manual_add_modules sis5513 if ! tcos_find_module "snd-sis7019" ; then manual_add_modules ac97_codec manual_add_modules sis7019 else manual_add_modules snd-sis7019 fi stat_after "eTC2300 thin client hacks" tcos-0.89.93ubuntu2/hooks-addons/65web_browser0000664000000000000000000000300512260610261016072 0ustar # hooks addon embedded web browser # need links2 or dillo # dillo copy some system fonts (25 Mb) if [ "${TCOS_WEB_BROWSER}" = "dillo" ]; then if [ ! -d /usr/share/doc/dillo ]; then echo "WARNING" echo "" echo "Please install dillo package or disable WEB BROWSER support." echo " => apt-get install dillo" echo "" else stat_before cpifexists /usr/bin/dillo /usr/bin/ cpifexists /usr/bin/dillocfg /usr/bin/ cpifexists /usr/bin/dpid /usr/bin/ #cpifexists /usr/bin/dpidc /usr/bin/ # FIXME this need perl :( cpifexists /etc/dillorc /etc/ cpifexists /etc/dpidrc /etc/ mkdir -p $DESTDIR/usr/lib/dillo/ copydir /usr/lib/dillo/dpi /usr/lib/dillo/ mkdir -p $DESTDIR/etc/fonts/ cpifexists /etc/fonts/fonts.conf /etc/fonts/ copydir /usr/share/fonts /usr/share/ rm -rf $DESTDIR/usr/share/fonts/X11/ stat_after "Dillo, web browser" fi fi if [ "${TCOS_WEB_BROWSER}" = "links2" ]; then if [ ! -d /usr/share/doc/links2 ]; then echo "WARNING" echo "" echo "Please install links2 package or disable WEB BROWSER support." echo " => apt-get install links2" echo "" else stat_before cpifexists /usr/bin/links2 /usr/bin/ cpifexists /usr/bin/xlinks2 /usr/bin/ stat_after "Links2, web browser" fi fi if [ ! $TCOS_WEB_BROWSER ]; then _verbose "(65web_browser) TCOS_WEB_BROWSER disabled" fi tcos-0.89.93ubuntu2/hooks-addons/95usplash_timeout0000664000000000000000000000353212260610261017007 0ustar # Add timeout on usplash startup script if [ -e $DESTDIR/scripts/init-top/usplash -o -e /scripts/init-top/plymouth -o -e /scripts/init-top/00_splashy ]; then _echo " * Applying usplash timeout patch" cat << EOF > $DESTDIR/scripts/init-top/00_nosplash #!/bin/sh # new header not using prereqs if [ "\$1" = "prereqs" ]; then echo "" exit 0 fi . /scripts/functions . /conf/tcos.conf . /conf/tcos-run-functions # kill usplash if cmdline have "nousplash" or "nosplash" for x in \$(cat /proc/cmdline); do case \$x in nosplash) KILL_SPLASH=true ;; nousplash) KILL_SPLASH=true ;; esac done if [ "\$KILL_SPLASH" = "true" ] ; then echo -e "#!/bin/sh\nexit 0" > /scripts/init-top/framebuffer [ -e /scripts/init-top/usplash ] && echo -e "#!/bin/sh\nexit 0" > /scripts/init-top/usplash [ -e /scripts/init-top/plymouth ] && echo -e "#!/bin/sh\nexit 0" > /scripts/init-top/plymouth [ -e /scripts/init-top/00_splashy ] && echo -e "#!/bin/sh\nexit 0" > /scripts/init-top/00_splashy fi EOF chmod +x $DESTDIR/scripts/init-top/00_nosplash else _verbose "(95usplash_timeout) Splash not found, timeout path not applied." fi # add fancy startup messages cat << EOF >> $DESTDIR/scripts/functions log_use_fancy_output () { TPUT=/bin/tput EXPR=/bin/expr if [ "x\$TERM" != "xdumb" ] && [ -x \$TPUT ] && [ -x \$EXPR ] && \$TPUT hpa 60 >/dev/null 2>&1 && \$TPUT setaf 1 >/dev/null 2>&1; then [ -z \$FANCYTTY ] && FANCYTTY=1 || true else FANCYTTY=0 fi case "\$FANCYTTY" in 1|Y|yes|true) true;; *) false;; esac } FANCYTTY= [ -e /etc/lsb-base-logging.sh ] && . /etc/lsb-base-logging.sh || true EOF [ -e /etc/lsb-base-logging.sh ] && cpifexists /etc/lsb-base-logging.sh /etc cpifexists /usr/bin/tput /bin cpifexists /usr/bin/expr /bin tcos-0.89.93ubuntu2/hooks-addons/03udev20000664000000000000000000001427112260610261014576 0ustar # copy some extra files to /lib/udev # # # mkdir -p $DESTDIR/lib/udev cpudev() { if [ ! -e "$1" ]; then # don't copy, orig file not exists return fi if [ ! -e "$DESTDIR/$1" ]; then # check if other script have put this file in $DESTDIR cpifexists "$1" "$2" fi } cpudev /lib/udev/write_cd_rules /lib/udev # DON'T COPY write_net_rules, it will hang trying to create new persistent rules !!! #cpudev /lib/udev/write_net_rules /lib/udev cpudev /lib/udev/udev_run_devd /lib/udev cpudev /lib/udev/udev_run_hotplugd /lib/udev cpudev /lib/udev/logger.agent /lib/udev # new for keyboard and mouse rules cpudev /lib/udev/input_id /lib/udev # new udev > 111 cpudev /lib/udev/rule_generator.functions /lib/udev # SATA cdroms (thanks to vidal_joshur at gva dot es for patch ) cpudev /lib/udev/cdrom_id /lib/udev cpudev /lib/udev/scsi_id /lib/udev cpudev /etc/udev/rules.d/60-symlinks.rules /etc/udev/rules.d/ # ubuntu rules (create symlinks /dev/snd/*) cpudev /lib/udev/rules.d/40-alsa.rules /lib/udev/rules.d/ # new udev don't have vol_id => blkid #/sbin/blkid -p -o udev /dev/sdb1 cpudev /sbin/blkid /usr/bin/ # needed by evdev driver cpudev /lib/udev/rules.d/60-persistent-input.rules /lib/udev/rules.d/ cpudev /etc/udev/rules.d/60-persistent-input.rules /etc/udev/rules.d/ # new in Ubuntu Lucid cpudev /lib/udev/rules.d/60-cdrom_id.rules /lib/udev/rules.d/ cpudev /lib/udev/rules.d/60-persistent-alsa.rules /lib/udev/rules.d/ cpudev /lib/udev/rules.d/78-sound-card.rules /lib/udev/rules.d/ cpudev /lib/udev/rules.d/80-drivers.rules /lib/udev/rules.d/ # new xorg+udev rules cpudev /lib/udev/rules.d/64-xorg-xkb.rules /lib/udev/rules.d/ cpudev /lib/udev/rules.d/65-xorg-evdev.rules /lib/udev/rules.d/ cpudev /lib/udev/rules.d/69-xserver-xorg-input-wacom.rules /lib/udev/rules.d/ cpudev /lib/udev/rules.d/78-graphics-card.rules /lib/udev/rules.d/ mkdir -p $DESTDIR/etc/default [ -e /etc/default/keyboard ] && cpifexists /etc/default/keyboard /etc/default/ # console setup cpudev /lib/udev/rules.d/95-keyboard-force-release.rules /lib/udev/rules.d/ cpudev /lib/udev/rules.d/95-keymap.rules /lib/udev/rules.d/ cpudev /lib/udev/rules.d/85-console-setup.rules /lib/udev/rules.d/ cpudev /lib/udev/console-setup-tty /lib/udev/ cpudev /lib/udev/keymap /lib/udev/ [ -d /lib/udev/keymaps/ ] && cp -ra /lib/udev/keymaps $DESTDIR/lib/udev/ cpudev /lib/udev/findkeyboards /lib/udev/ cpudev /lib/udev/pci-db /lib/udev/ # delete not usessfull rules rm -f $DESTDIR/etc/udev/rules.d/024_hpmud.rules rm -f $DESTDIR/etc/udev/rules.d/025_libgphoto2.rules rm -f $DESTDIR/etc/udev/rules.d/025_logitechmouse.rules rm -f $DESTDIR/etc/udev/rules.d/45-hpdjconsole.rules rm -f $DESTDIR/etc/udev/rules.d/45-hplip.rules rm -f $DESTDIR/etc/udev/rules.d/55-hpmud.rules rm -f $DESTDIR/etc/udev/rules.d/60-persistent-v4l.rules rm -f $DESTDIR/etc/udev/rules.d/70-persistent-cd.rules rm -f $DESTDIR/etc/udev/rules.d/70-persistent-net.rules rm -f $DESTDIR/etc/udev/rules.d/85-pcmcia.rules rm -f $DESTDIR/etc/udev/rules.d/90-hal.rules rm -f $DESTDIR/etc/udev/rules.d/91-permissions.rules # ?????? rm -f $DESTDIR/etc/udev/rules.d/libmtp7.rules rm -f $DESTDIR/etc/udev/rules.d/z60_hdparm.rules rm -f $DESTDIR/etc/udev/rules.d/z60_libccid.rules rm -f $DESTDIR/etc/udev/rules.d/z60_libfprint0.rules rm -f $DESTDIR/etc/udev/rules.d/z60_libpisock9.rules rm -f $DESTDIR/etc/udev/rules.d/z60_libsane-extras.rules rm -f $DESTDIR/etc/udev/rules.d/z60_libsane.rules rm -f $DESTDIR/etc/udev/rules.d/z60_virtualbox-ose.rules # from idefix (sid) rm -f $DESTDIR/etc/udev/rules.d/65_dmsetup.rules # from dartacan (etch) rm -f $DESTDIR/etc/udev/rules.d/020_permissions.rules rm -f $DESTDIR/etc/udev/rules.d/z25_persistent-cd.rules rm -f $DESTDIR/etc/udev/rules.d/z25_persistent-net.rules # from max40 (Ubuntu hardy) rm -f $DESTDIR/etc/udev/rules.d/40-basic-permissions.rules rm -f $DESTDIR/etc/udev/rules.d/40-permissions.rules ### ???? rm -f $DESTDIR/etc/udev/rules.d/45-fuse.rules rm -f $DESTDIR/etc/udev/rules.d/45-legousbtower.rules rm -f $DESTDIR/etc/udev/rules.d/45-libmtp7.rules rm -f $DESTDIR/etc/udev/rules.d/45-libnjb.rules rm -f $DESTDIR/etc/udev/rules.d/45-libgphoto2.rules rm -f $DESTDIR/etc/udev/rules.d/50-huawei.rules rm -f $DESTDIR/etc/udev/rules.d/50-iscan.rules rm -f $DESTDIR/etc/udev/rules.d/50-libpisock9.rules rm -f $DESTDIR/etc/udev/rules.d/55-hpmud.rules rm -f $DESTDIR/etc/udev/rules.d/60-symlinks.rules rm -f $DESTDIR/etc/udev/rules.d/62-bluez-hid2hci.rules rm -f $DESTDIR/etc/udev/rules.d/65-dmsetup.rules rm -f $DESTDIR/etc/udev/rules.d/70-persistent-cd.rules rm -f $DESTDIR/etc/udev/rules.d/70-persistent-net.rules ##rm -f $DESTDIR/etc/udev/rules.d/85-alsa.rules #???? rm -f $DESTDIR/etc/udev/rules.d/85-brltty.rules rm -f $DESTDIR/etc/udev/rules.d/85-hdparm.rules rm -f $DESTDIR/etc/udev/rules.d/85-hplj10xx.rules rm -f $DESTDIR/etc/udev/rules.d/85-pcmcia.rules rm -f $DESTDIR/etc/udev/rules.d/95-hal.rules rm -f $DESTDIR/etc/udev/rules.d/kino.rules # some deprecated and no used rules in my laptop rm -f $DESTDIR/etc/udev/rules.d/56-hp* rm -f $DESTDIR/etc/udev/rules.d/85-rt* rm -f $DESTDIR/etc/udev/rules.d/85-tosh* rm -f $DESTDIR/etc/udev/rules.d/usb_mode* rm -f $DESTDIR/etc/udev/rules.d/z60-hplip* # udev rules are now in /lib/udev/rules.d/ rm -f $DESTDIR/lib/udev/rules.d/90-hal.rules rm -f $DESTDIR/lib/udev/rules.d/91-permissions.rules rm -f $DESTDIR/lib/udev/rules.d/*bluez* rm -f $DESTDIR/lib/udev/rules.d/*libmtp* rm -f $DESTDIR/lib/udev/rules.d/*libpi* rm -f $DESTDIR/lib/udev/rules.d/*libsane* rm -f $DESTDIR/lib/udev/rules.d/*v4l* rm -f $DESTDIR/lib/udev/rules.d/*-dm.* # modify udev script to not wait in init-premount (wait in tcos-top/01busybox) #sed -i -e '/udevadm trigger/s/trigger/trigger --subsystem-match=net/g' $DESTDIR/scripts/init-premount/udev #sed -i -e '/udevadm settle/s/udevadm/#udevadm/g' $DESTDIR/scripts/init-premount/udev #cat $DESTDIR/scripts/init-premount/udev # modify /init script to not call depmod sed -i -e '/depmod/s/depmod/#depmod/g' $DESTDIR/init # remove some init scripts rm -f ${DESTDIR}/scripts/init-premount/devpts rm -f ${DESTDIR}/scripts/init-bottom/dropbear rm -f ${DESTDIR}/scripts/init-premount/dropbear if [ "${BOOT}" != "tcos-nfs" ]; then rm -f ${DESTDIR}/scripts/init-bottom/udev fi tcos-0.89.93ubuntu2/hooks-addons/05compcache0000664000000000000000000000307112260610261015471 0ustar # hook for compcache # based on Ubuntu initramfs hook # # if [ $TCOS_COMPCACHE ]; then stat_before tcos_manual_add_modules ramzswap tcos_manual_add_modules zram # need swapon for preference option (busybox swapon don't have it) cpifexists /sbin/swapon /sbin/ [ -x /usr/sbin/rzscontrol ] && cpifexists /usr/sbin/rzscontrol /usr/sbin/ mkdir -p $DESTDIR/etc/udev/rules.d cat << EOF > $DESTDIR/etc/udev/rules.d/80-compcache.rules KERNEL=="ramzswap0", ACTION=="add", RUN+="/sbin/swapon -p 100 /dev/ramzswap0 2>/dev/null" EOF cat << EOF > $DESTDIR/scripts/init-top/compcache #!/bin/sh # new header not using prereqs if [ "\$1" = "prereqs" ]; then echo "" exit 0 fi quiet=n . /conf/tcos.conf . /conf/tcos-run-functions # find total amount of available ram TOTAL_RAM=\$(grep MemTotal /proc/meminfo |tr -d ': [A-Z][a-z]') # Do not use compcache if we have more than 256M if [ "\${TOTAL_RAM}" -gt 262144 ]; then exit 0 fi # add TCOS_COMPCACHE_PERCENT% of RAM (by default 20) kbytes="\$((\$TOTAL_RAM * $TCOS_COMPCACHE_PERCENT / 100))" AVALAIBLE_RAM=\$(grep 'Inactive:' /proc/meminfo |tr -d ': [A-Z][a-z]') if [ "\${kbytes}" -gt "\${AVALAIBLE_RAM}" ]; then kbytes=\$(( \${AVALAIBLE_RAM} - 500 )) fi if tcos_find_module "zram"; then modprobe zram echo \$((1024*\$kbytes)) > /sys/block/zram0/disksize /sbin/mkswap /dev/zram0 >/dev/null 2>&1 /sbin/swapon -p 100 /dev/zram0 >/dev/null 2>&1 else modprobe -q --ignore-install ramzswap fi EOF chmod 0755 $DESTDIR/scripts/init-top/compcache stat_after "Compcache support ($TCOS_COMPCACHE_PERCENT%)" fi tcos-0.89.93ubuntu2/hooks-addons/51amd_geode0000664000000000000000000000252212260610261015454 0ustar # hook addon for thin clients with chip AMD - GEODE stat_before # save Xorg version in file Xorg -version > $DESTDIR/conf/xorg.version 2>&1 cat << EOF > ${DESTDIR}/scripts/tcos-bottom/15amd_geode #!/bin/sh # # new header not using prereqs if [ "\$1" = "prereqs" ]; then echo "" exit 0 fi quiet=n . /scripts/functions . /conf/tcos.conf . /conf/tcos-run-functions test1=0 #geode 100B:0030 #geode 1022:2081 test1=\$(lspci -n |grep -c -e "100B:0030" -e "1022:2081") test2=0 test2=\$(cat /conf/xorg.version | sed '/^\$/d' | head -1 | awk '{print \$NF}' | awk -F"." '{if (\$1 <= 1 && \$2 > 3) printf "1"}') if [ "\$test1" = "0" ] || [ "\$test2" = "1" ] ; then # no client with chip amd geode or Xorg with amd fixes exit 0 fi [ "\$TCOS_XORG_VIDEO_DRIVER" = "fullauto" ] && exit 0 [ "\$TCOS_XORG_VIDEO_DRIVER" = "xorgauto" ] && exit 0 log_begin_msg "Loading xserver AMD Geode Support" if [ -f /usr/lib/xorg/modules/drivers/amd_drv.so ]; then configurexorg --newsettings --xdriver=amd --outputfile=/etc/X11/xorg.conf 2>> /tmp/initramfs.debug elif [ -f /usr/lib/xorg/modules/drivers/geode_drv.so ]; then configurexorg --newsettings --xdriver=geode --outputfile=/etc/X11/xorg.conf 2>> /tmp/initramfs.debug fi log_end_msg \$? EOF chmod +x ${DESTDIR}/scripts/tcos-bottom/15amd_geode stat_after "AMD Geode Xorg support" tcos-0.89.93ubuntu2/hooks-addons/51via_openchrome0000664000000000000000000000541012260610261016545 0ustar # hook addon for thin clients with chip VIA make_launcher() { cat << EOF > ${DESTDIR}/scripts/tcos-bottom/15via_openchrome #!/bin/sh # # new header not using prereqs if [ "\$1" = "prereqs" ]; then echo "" exit 0 fi quiet=n . /scripts/functions . /conf/tcos.conf . /conf/tcos-run-functions test1=0 test1=\$(get_vga_vendor 1106) if [ "\$test1" != "1" ]; then # not in client with chip VIA unichrome exit 0 fi log_begin_msg "Loading Via Openchrome drivers" modprobe drm modprobe via [ "\$TCOS_XORG_VIDEO_DRIVER" = "fullauto" ] && exit 0 [ "\$TCOS_XORG_VIDEO_DRIVER" = "xorgauto" ] && exit 0 if [ -f /usr/lib/xorg/modules/drivers/openchrome_drv.so ]; then configurexorg --newsettings --xdriver=openchrome --outputfile=/etc/X11/xorg.conf 2>> /tmp/initramfs.debug else configurexorg --newsettings --xdriver=via --outputfile=/etc/X11/xorg.conf 2>> /tmp/initramfs.debug fi log_end_msg \$? EOF chmod +x ${DESTDIR}/scripts/tcos-bottom/15via_openchrome } if [ $TCOS_ETC_GENERIC ]; then stat_before manual_add_modules drm manual_add_modules via-agp manual_add_modules via manual_add_modules i2c-viapro stat_after "Generic VIA modules support" fi if [ $TCOS_XORG_DRIVER_OPENCHROME ];then test_driver1=$(strings /usr/lib/xorg/modules/drivers/via_drv.so 2> /dev/null| grep -c openchrome) test_driver2=$(strings /usr/lib/xorg/modules/drivers/openchrome_drv.so 2> /dev/null | grep -c openchrome) if [ -z $TCOS_ETC_GENERIC ];then manual_add_modules drm manual_add_modules via-agp manual_add_modules via manual_add_modules i2c-viapro fi if [ $TCOS_XORG_DRIVER_OPENCHROME ] && [ "$test_driver1" != 0 ] ; then stat_before cpifexists /usr/lib/libviaXvMC.so /usr/lib cpifexists /usr/lib/libviaXvMCPro.so /usr/lib [ -e /etc/X11/XvMCConfig ] && cpifexists /etc/X11/XvMCConfig /etc/X11 mkdir -p ${DESTDIR}/usr/lib/dri cpifexists /usr/lib/dri/unichrome_dri.so /usr/lib/dri make_launcher stat_after "VIA Openchrome driver support" elif [ $TCOS_XORG_DRIVER_OPENCHROME ] && [ "$test_driver2" != 0 ] ; then stat_before manual_add_modules via_chrome9 cpifexists /usr/lib/libchromeXvMC.so /usr/lib cpifexists /usr/lib/libchromeXvMCPro.so /usr/lib [ -e /etc/X11/XvMCConfig ] && cpifexists /etc/X11/XvMCConfig /etc/X11 mkdir -p ${DESTDIR}/usr/lib/dri cpifexists /usr/lib/dri/unichrome_dri.so /usr/lib/dri make_launcher stat_after "Openchrome driver support" elif [ $TCOS_XORG_DRIVER_OPENCHROME ] && [ "$test_driver1" = 0 ] && [ "$test_driver2" = 0 ]; then echo "" echo " WARNING: Use Openchrome drivers enabled but don't have installed via/openchrome package" echo "" echo " Please install openchrome VIA drivers package" echo "" fi fi tcos-0.89.93ubuntu2/hooks-addons/10hwclock0000664000000000000000000000014312260610261015172 0ustar # addon to set hwclock stat_before cpifexists /sbin/hwclock /usr/bin/ stat_after "HWclock" tcos-0.89.93ubuntu2/hooks-addons/90plymouth0000664000000000000000000000672612260610261015446 0ustar # hook-addon for plymouth support if [ ! -x /bin/plymouth ]; then _verbose "(90plymouth) Plymouth not installed" else if [ $TCOS_DISABLE_PLYMOUTH ]; then rm -f ${DESTDIR}/lib/plymouth 2>/dev/null rm -f ${DESTDIR}/sbin/plymouthd 2>/dev/null rm -f ${DESTDIR}/bin/plymouth 2>/dev/null rm -rf ${DESTDIR}/usr/share/plymouth ${DESTDIR}/lib/plymouth ${DESTDIR}/usr/lib/plymouth 2>/dev/null rm -f ${DESTDIR}/scripts/*/plymouth 2>/dev/null cat << EOF > ${DESTDIR}/sbin/plymouthd #!/bin/sh exit 0 EOF chmod +x ${DESTDIR}/sbin/plymouthd cp ${DESTDIR}/sbin/plymouthd ${DESTDIR}/bin/plymouth _verbose "(90plymouth) TCOS_DISABLE_PLYMOUTH enabled !!!" else #TCOS_DISABLE_PLYMOUTH not found stat_before cpifexists /sbin/plymouthd /sbin cpifexists /bin/plymouth /bin PLY_PATH="/usr/share/plymouth" # in ubuntu /lib/plymouth if [ -d /lib/plymouth/themes ]; then PLY_PATH="/lib/plymouth" fi mkdir -p ${DESTDIR}/${PLY_PATH} mkdir -p ${DESTDIR}/${PLY_PATH}/renderers mkdir -p ${DESTDIR}/${PLY_PATH}/themes echo "TCOS $TCOS_VESRION" >> $DESTDIR/etc/debian_version THEMES="$PLY_PATH/themes" THEME=$(readlink -f ${THEMES}/${TCOS_PLYMOUTH}/${TCOS_PLYMOUTH}.plymouth) MODULE=$(grep "ModuleName *= *" ${THEME} | sed 's/ModuleName *= *//') TEXT_THEME=$(readlink -f ${THEMES}/text.plymouth) MODULE_TEXT=$(grep "ModuleName *= *" ${TEXT_THEME} | sed 's/ModuleName *= *//') # plugin that is always required cpifexists $PLY_PATH/details.so ${PLY_PATH} # copy the default themes cp -a ${PLY_PATH}/themes/details ${DESTDIR}${PLY_PATH}/themes/ if [ -n "$TEXT_THEME" ]; then rm -f ${DESTDIR}${PLY_PATH}/themes/text.plymouth 2>/dev/null ln -s $TEXT_THEME ${DESTDIR}${PLY_PATH}/themes/text.plymouth cp -a $(dirname $TEXT_THEME) ${DESTDIR}${PLY_PATH}/themes/ cpifexists /lib/plymouth/$MODULE_TEXT.so ${PLY_PATH} fi if [ -n "$THEME" ]; then rm -f ${DESTDIR}${PLY_PATH}/themes/default.plymouth 2>/dev/null ln -s $THEME ${DESTDIR}${PLY_PATH}/themes/default.plymouth cp -a $(dirname $THEME) ${DESTDIR}${PLY_PATH}/themes/ cpifexists ${PLY_PATH}/$MODULE.so ${PLY_PATH} # if we have a non-text theme, make sure we copy all the support libs cpifexists ${PLY_PATH}/label.so ${PLY_PATH} # output renderers cpifexists ${PLY_PATH}/renderers/frame-buffer.so ${PLY_PATH}/renderers/ cpifexists ${PLY_PATH}/renderers/drm.so ${PLY_PATH}/renderers/ cpifexists ${PLY_PATH}/renderers/vga16fb.so ${PLY_PATH}/renderers/ [ -e $PLY_PATH/${TCOS_PLYMOUTH}.png ] && cp $PLY_PATH/${TCOS_PLYMOUTH}.png ${DESTDIR}${PLY_PATH} [ -e $PLY_PATH/ubuntu-logo.png ] && cp $PLY_PATH/ubuntu-logo.png ${DESTDIR}${PLY_PATH} [ -e $PLY_PATH/debian-logo.png ] && cp $PLY_PATH/debian-logo.png ${DESTDIR}${PLY_PATH} # and copy the font support files needed in order to actually display # any text mkdir -p ${DESTDIR}/usr/share/fonts/truetype/ttf-dejavu mkdir -p ${DESTDIR}/etc/fonts/conf.d mkdir -p ${DESTDIR}/usr/lib/pango/1.6.0/module-files.d mkdir -p ${DESTDIR}/usr/lib/pango/1.6.0/modules [ -e /usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf ] && \ cp /usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf ${DESTDIR}/usr/share/fonts/truetype/ttf-dejavu/ cp /etc/fonts/fonts.conf ${DESTDIR}/etc/fonts/fonts.conf cp -L /etc/fonts/conf.d/60-latin.conf ${DESTDIR}/etc/fonts/conf.d cp /usr/lib/pango/1.6.0/module-files.d/libpango1.0-0.modules ${DESTDIR}/usr/lib/pango/1.6.0/module-files.d/ cp /usr/lib/pango/1.6.0/modules/pango-basic-fc.so ${DESTDIR}/usr/lib/pango/1.6.0/modules/pango-basic-fc.so fi stat_after "Plymouth support" fi fi tcos-0.89.93ubuntu2/hooks-addons/51paquito0000664000000000000000000000653612260610261015243 0ustar # hook addon for INTEL DOT STATION alias Paquito PAQUITO_MODULES="intel-agp agpgart i2c-i810 intelfb i810fb vfb video" make_launcher() { cat << EOF > ${DESTDIR}/scripts/tcos-bottom/16paquito #!/bin/sh # # new header not using prereqs if [ "\$1" = "prereqs" ]; then echo "" exit 0 fi quiet=n . /scripts/functions . /conf/tcos.conf . /conf/tcos-run-functions # check if we are in paquito machine test1=0 test1=\$(lspci | grep -c "PCTel Inc HSP MicroModem 56" ) test2=0 test2=\$(lspci|grep -c "Intel Corporation 82810 CGC") if [ "\$test1" = "0" ] || [ "\$test2" = "0" ] ; then # not in paquito, exit now exit 0 fi log_begin_msg "Loading Intel Dot Station (Paquito) modules" PAQUITO_MODULES="${PAQUITO_MODULES}" _log "PAQUITO loading modules: \${PAQUITO_MODULES}" for mod in \${PAQUITO_MODULES}; do modprobe \$mod >> /tmp/initramfs.debug 2>&1 done # test if we have intel-drv or i810 if [ -L /usr/lib/xorg/modules/drivers/i810_drv.so ]; then configurexorg --newsettings --xdriver=intel --outputfile=/etc/X11/xorg.conf 2>> /tmp/initramfs.debug else configurexorg --newsettings --xdriver=i810 --outputfile=/etc/X11/xorg.conf 2>> /tmp/initramfs.debug fi log_end_msg \$? EOF chmod +x ${DESTDIR}/scripts/tcos-bottom/16paquito } if [ "$(pathof Xorg)" = /usr/bin/Xorg ]; then XORG=7 else XORG=6 fi # test if we have intel-drv or i810 if [ -L /usr/lib/xorg/modules/drivers/i810_drv.so ]; then intel_driver=intel else intel_driver=i810 fi if [ $TCOS_PAQUITO ] && [ "$intel_driver" = "i810" ] ; then stat_before for mod in ${PAQUITO_MODULES}; do manual_add_modules $mod done cpifexists /usr/lib/libI810XvMC.so.1 /usr/lib mkdir -p ${DESTDIR}/usr/lib/dri cpifexists /usr/lib/dri/i810_dri.so /usr/lib/dri if [ $XORG = 6 ];then if [ ! -e $DESTDIR/usr/X11R6/lib/modules/drivers/i810_drv.so ]; then cp -ra /usr/X11R6/lib/modules/drivers/i810_drv.so $DESTDIR/usr/X11R6/lib/modules/drivers fi else if [ ! -e $DESTDIR/usr/lib/xorg/modules/drivers/i810_drv.so ]; then cp -ra /usr/lib/xorg/modules/drivers/i810_drv.so $DESTDIR/usr/lib/xorg/modules/drivers fi fi make_launcher stat_after "Intel Dot Station (Paquito) drivers support [i810]" elif [ $TCOS_PAQUITO ] && [ "$intel_driver" = "intel" ] ; then stat_before for mod in ${PAQUITO_MODULES}; do manual_add_modules $mod done cpifexists /usr/lib/libI810XvMC.so.1 /usr/lib mkdir -p ${DESTDIR}/usr/lib/dri cpifexists /usr/lib/dri/i810_dri.so /usr/lib/dri if [ $XORG = 6 ];then if [ ! -e $DESTDIR/usr/X11R6/lib/modules/drivers/intel_drv.so ]; then cp -ra /usr/X11R6/lib/modules/drivers/intel_drv.so $DESTDIR/usr/X11R6/lib/modules/drivers fi else if [ ! -e $DESTDIR/usr/lib/xorg/modules/drivers/intel_drv.so ]; then cp -ra /usr/lib/xorg/modules/drivers/intel_drv.so $DESTDIR/usr/lib/xorg/modules/drivers fi fi make_launcher stat_after "Intel Dot Station (Paquito) drivers support [intel]" elif [ $TCOS_PAQUITO ] && [ "$intel_driver" != "i810" ] && [ "$intel_driver" != "intel" ]; then echo "" echo " WARNING: Intel Dot Station (Paquito) enabled but don't have installed i810/intel video driver package" echo "" echo " Please install xserver-xorg-driver-i810 or xserver-xorg-video-intel" echo "" fi tcos-0.89.93ubuntu2/hooks-addons/56rdesktop0000664000000000000000000000325412260610261015413 0ustar # hook for windows rdesktop if [ ! $TCOS_RDESKTOP ]; then _verbose "(56rdesktop) TCOS_RDESKTOP" else if [ ! -e /usr/bin/rdesktop ]; then _echo " * rDesktop not installed" fi stat_before cpifexists /usr/bin/rdesktop /usr/bin/ mkdir -p $DESTDIR/usr/share/ copydir /usr/share/rdesktop/ /usr/share/ if [ ${TCOS_PULSEAUDIO} ] && [ ${TCOS_SOUND} ]; then # padsp pulseaudio support cpifexists /usr/bin/padsp /usr/bin/ cpifexists /usr/lib/libpulsedsp.so /usr/lib/ fi cat << EOF > $DESTDIR/sbin/startrdesktop #!/bin/sh . /conf/tcos.conf . /conf/tcos-run-functions export DISPLAY=:0 export HOME=/root if [ -f \$XAUTHORITY ]; then TCOS_XORG_OPTS="\$TCOS_XORG_OPTS -auth \$XAUTHORITY" fi XKB=\${TCOS_XORG_XKB} if [ "\${XKB}" = "br" ]; then XKB="pt-br" fi Xorg \${TCOS_XORG_OPTS} >> /tmp/initramfs.debug 2>&1 & sleep 2 waitforX || exit sleep 1 # default server RDESKTOP_SERVER=\$(read_server 'rdesktop' "$TCOS_RDESKTOP_SERVER") RDESKTOP_CMD="/usr/bin/rdesktop -5 -u \"\" -f -a 16 -k \${XKB} \${RDESKTOP_SERVER}" if [ -x /usr/bin/padsp ] && [ -d /proc/asound ]; then RDESKTOP_CMD="padsp -s localhost /usr/bin/rdesktop -5 -r sound -u \"\" -f -a 16 -k \${XKB} \${RDESKTOP_SERVER}" fi # -r sound # -u "" # empty username # -f -a 16 fullscreen and 16 color bits while [ 1 ]; do xterm -e "echo Connecting with \" \${RDESKTOP_SERVER}...\" ; sleep 1 ; \${RDESKTOP_CMD} >/tmp/rdesktop 2>&1; echo \"Connection closed.\"; sleep 2" done EOF chmod +x $DESTDIR/sbin/startrdesktop # old redesktop cmd #/usr/bin/rdesktop -5 -f -a 16 -k \${XKB} -T "Remotedesktop-Client: \${rdesktop}" \${rdesktop} > /dev/null 2>&1 stat_after "rDesktop" fi tcos-0.89.93ubuntu2/hooks-addons/08pcimodules0000664000000000000000000000047312260610261015721 0ustar # hook addon to load pcimodules # need pcimodules cpifexists /usr/bin/pcimodules /bin/ mv -f $DESTDIR/usr/lib/libz.so.1 $DESTDIR/lib/libz.so.1 2>/dev/null mv -f $DESTDIR/usr/lib/libpci.so.3 $DESTDIR/lib/libpci.so.3 2>/dev/null mv -f $DESTDIR/$LIB_MULTIARCH/libpci.so.3 $DESTDIR/lib/libpci.so.3 2>/dev/null tcos-0.89.93ubuntu2/hooks-addons/12getty0000664000000000000000000000141612260610261014702 0ustar # getty console # use fgetty if found #/sbin/fgetty #/bin/fgetty-login #/bin/fgetty-login2 #/bin/checkpassword if [ -e /sbin/fgetty ]; then stat_before cpifexists /sbin/fgetty /sbin/ cpifexists /bin/fgetty-login /bin/ cpifexists /bin/fgetty-login2 /bin/ cpifexists /bin/checkpassword /bin/ cat << EOF > $DESTDIR/bin/login #!/bin/sh fgetty-login \$@ EOF chmod +x $DESTDIR/bin/login cat << EOF > $DESTDIR/sbin/rungetty #!/bin/sh VEL=38400 CONSOLE_NUMBER=\$1 if [ "\${CONSOLE_NUMBER}" = "" ]; then echo "Error: need a console name (example tty1)" exit 1 fi while [ 1 ]; do fgetty \$CONSOLE_NUMBER --noclear >/dev/null 2>&1 sleep 2 done EOF chmod +x $DESTDIR/sbin/rungetty stat_after "fgetty (login)" fi # end of -e /sbin/fgetty tcos-0.89.93ubuntu2/hooks-addons/18openvpn0000664000000000000000000000371112260610261015241 0ustar # hook to include openvpn # need openvpn if [ -n "$TCOS_OPENVPN" ] && [ ! -d /var/lib/tcos/openvpn/keys ] ; then _echo " TCOS_OPENVPN enabled but no keys" _echo "" _echo " Please run 'tcos-init-openvpn' as root user" _echo "" elif [ -n "$TCOS_OPENVPN" ] && [ -d /var/lib/tcos/openvpn/keys ]; then stat_before tcos_manual_add_modules tun cpifexists /usr/sbin/openvpn /usr/bin/ mkdir -p $DESTDIR/usr/share/openvpn cpifexists /var/lib/tcos/openvpn/keys/ca.crt /usr/share/openvpn/ cpifexists /var/lib/tcos/openvpn/keys/client.key /usr/share/openvpn/ cpifexists /var/lib/tcos/openvpn/keys/client.crt /usr/share/openvpn/ TCOS_VPN_SERVER=$(awk '/^server/ {print $2}' /var/lib/tcos/openvpn/tcosserver.conf | cut -d . -f -3)".1" # startup script cat << EOF > $DESTDIR/scripts/tcos-bottom/18vpn #!/bin/sh if [ "\$1" = "prereqs" ]; then exit 0 fi quiet=n . /scripts/functions maybe_break openvpn1 modprobe tun ln -s /bin/busybox /sbin/ifconfig ln -s /bin/busybox /sbin/route openvpn /usr/share/openvpn/client.conf > /tmp/openvpn.log 2>&1 & grep -v -e xdmcp-server -e font-server /etc/hosts > /etc/hosts.new mv /etc/hosts.new /etc/hosts echo "$TCOS_VPN_SERVER xdmcp-server" >> /etc/hosts echo "$TCOS_VPN_SERVER font-server" >> /etc/hosts echo "$TCOS_VPN_SERVER vpn-server" >> /etc/hosts maybe_break openvpn2 # wait for carrier/ping in tap0 log_begin_msg "Waiting for OpenVPN connection" log_end_msg 0 while [ 1 ]; do #if [ "\$(cat /sys/class/net/tap0/carrier)" = "1" ]; then # break #fi ping -q -W 1 -c 2 vpn-server >/dev/null 2>&1 && break sleep 1 done EOF chmod +x $DESTDIR/scripts/tcos-bottom/18vpn cat << EOF > $DESTDIR/usr/share/openvpn/client.conf client dev tap proto udp remote tcos-server 2194 float resolv-retry infinite nobind persist-key persist-tun ca "/usr/share/openvpn/ca.crt" cert "/usr/share/openvpn/client.crt" key "/usr/share/openvpn/client.key" comp-lzo verb 1 ns-cert-type server EOF stat_after "OpenVPN" fi # end of TCOS_OPENVPN tcos-0.89.93ubuntu2/hooks-addons/23bootchart0000664000000000000000000000153312260610261015535 0ustar # must export this variable from shell no config yet if [ "$TCOS_ENABLE_BOOTCHARTD" = "1" ]; then cpifexists $TCOS_BINS/tcos-bootchartd /sbin cpifexists /bin/sleep /bin cat << EOF > $DESTDIR/sbin/bootlogger #!/bin/sh cmd="\$1" logfile="\$2" while [ -f "/tmp/bootchart.lock" ]; do # Write the time (in jiffies). read uptime < /proc/uptime uptime=\${uptime%% [0-9]*} uptime=\${uptime%.*}\${uptime#*.} echo \$uptime # Log the command output eval \$cmd 2>/dev/null echo /bin/sleep 0.2 done >> "\$logfile" EOF chmod +x $DESTDIR/sbin/bootlogger cat << EOF > $DESTDIR/scripts/init-top/000bootchartd #!/bin/sh # if [ "\$1" = "prereqs" ]; then exit 0 fi if grep -q bootchartd /proc/cmdline ; then /sbin/daemonize.sh /sbin/tcos-bootchartd start fi EOF chmod +x $DESTDIR/scripts/init-top/000bootchartd fi tcos-0.89.93ubuntu2/hooks-addons/16dbus-avahi0000664000000000000000000000546512260610261015605 0ustar # hook to include DBus/avahi # need dbus,dbus-x11,avahi-daemon packages if [ -n "$TCOS_DBUS" ]; then stat_before mkdir -p $DESTDIR/usr/lib/dbus-1.0 mkdir -p $DESTDIR/etc/dbus-1/system.d mkdir -p $DESTDIR/etc/dbus-1/session.d cpifexists $(which dbus-daemon) /usr/bin/ cpifexists $(which dbus-uuidgen) /usr/bin/ cpifexists /usr/bin/dbus-launch /usr/bin/ cpifexists /etc/dbus-1/system.conf /etc/dbus-1/ cpifexists /etc/dbus-1/session.conf /etc/dbus-1/ if [ -f /etc/dbus-1/system.d/pulseaudio-system.conf ]; then cpifexists /etc/dbus-1/system.d/pulseaudio-system.conf /etc/dbus-1/system.d/ fi cat << EOF >> $DESTDIR/etc/passwd messagebus:x:104:107::/var/run/dbus:/bin/false avahi:x:106:113:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false EOF cat << EOF >> $DESTDIR/etc/shadow messagebus:*:14994:0:99999:7::: avahi:*:14994:0:99999:7::: EOF cat << EOF >> $DESTDIR/etc/group messagebus:x:107: netdev:x:111: avahi:x:113: EOF cat << EOF > $DESTDIR/scripts/tcos-bottom/15dbus-avahi #!/bin/sh if [ "\$1" = "prereqs" ]; then exit 0 fi mkdir -p /var/run/dbus /var/lib/dbus mkdir -p /var/run/avahi-daemon chown avahi:avahi /var/run/avahi-daemon chmod 755 /var/run/avahi-daemon chown messagebus:messagebus /var/lib/dbus /var/run/dbus dbus-uuidgen > /var/lib/dbus/machine-id start-stop-daemon --start --quiet --pidfile /var/run/dbus/dbus.pid \ --user messagebus --exec /usr/bin/dbus-daemon -- --system [ -x /usr/sbin/avahi-daemon ] && avahi-daemon --no-drop-root -D EOF chmod +x $DESTDIR/scripts/tcos-bottom/15dbus-avahi stat_after "DBus-Avahi" fi # end of TCOS_DBUS ############################################################################### if [ -n "$TCOS_AVAHI" ]; then # avahi-utils avahi-daemon cpifexists /usr/sbin/avahi-daemon /usr/bin/ mkdir -p $DESTDIR/var/run/avahi-daemon mkdir -p $DESTDIR/etc/avahi/services cpifexists /etc/avahi/avahi-daemon.conf /etc/avahi cat << EOF > $DESTDIR/etc/nsswitch.conf passwd: compat group: compat shadow: compat hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4 networks: files protocols: db files services: db files ethers: db files rpc: db files netgroup: nis EOF cpifexists /etc/dbus-1/system.d/avahi-dbus.conf /etc/dbus-1/system.d/ cat << EOF > $DESTDIR/etc/avahi/services/tcos.service tcos-%h _workstation._tcp _http._tcp 8998 EOF stat_after "Avahi" fi # end of TCOS_AVAHI tcos-0.89.93ubuntu2/hooks-addons/07cdaudio0000664000000000000000000000052612260610261015163 0ustar # hooks addon to read cdaudio # need cdparanoia if [ $TCOS_SOUND ] && [ -x /usr/bin/cdparanoia ]; then stat_before cpifexists /usr/bin/cdparanoia /usr/bin cpifexists ${TCOS_BINS}/cd_type /usr/bin manual_add_modules cdfs stat_after "CD-AUDIO support" else _verbose "(07cdaudio) TCOS_SOUND && cdparanoia disabled" fi tcos-0.89.93ubuntu2/hooks-addons/17acpid0000664000000000000000000000101512260610261014626 0ustar # hooks addon of acpid if [ ! $TCOS_ACPID ]; then _verbose "(17acpi) TCOS_ACPI disabled" else stat_before manual_add_modules button cpifexists /usr/sbin/acpid /usr/sbin/ mkdir -p ${DESTDIR}/etc/acpi mkdir -p ${DESTDIR}/var/run cat << EOF > ${DESTDIR}/sbin/startacpid #!/bin/sh modprobe button /usr/sbin/acpid -c /etc/acpi EOF chmod +x ${DESTDIR}/sbin/startacpid cat << EOF > ${DESTDIR}/etc/acpi/button_event event=button[ /]power action=/sbin/poweroff EOF stat_after "ACPI daemon" fi # end of TCOS_ACPID tcos-0.89.93ubuntu2/hooks-addons/18tcos_hdd_installer0000664000000000000000000000167412260610261017426 0ustar # hooks addon TCOS hdd installer # need whiptail, syslinux # needed for swap creation cpifexists /sbin/mkswap /sbin/ # fdisk for fstab generation cpifexists /sbin/fdisk /sbin/ # disktype detection (for fstab too) [ -x /usr/bin/disktype ] && cpifexists /usr/bin/disktype /usr/bin/ if [ ! $TCOS_INSTALLER ]; then _verbose "(18_tcos_hdd_installer) TCOS_INSTALLER disabled" else cpifexists /usr/bin/whiptail /usr/bin cpifexists /usr/bin/syslinux /usr/bin cpifexists /usr/bin/mcopy /usr/bin cpifexists /usr/bin/mattrib /usr/bin cpifexists /sbin/install-mbr /sbin cpifexists /sbin/mkfs.vfat /usr/bin mkdir -p $DESTDIR/usr/lib/syslinux/ [ -f /usr/lib/syslinux/mbr.bin ] && cp /usr/lib/syslinux/mbr.bin $DESTDIR/usr/lib/syslinux/ [ -f /usr/lib/syslinux/ldlinux.sys ] && cp /usr/lib/syslinux/ldlinux.sys $DESTDIR/usr/lib/syslinux/ install -m 755 ${TCOS_BINS}/installer.sh ${DESTDIR}/sbin/installer.sh fi # end of TCOS_INSTALLER tcos-0.89.93ubuntu2/hooks-addons/02hex2ascii0000664000000000000000000000021512260610261015420 0ustar # hex2ascii converts an hex ip into ascii format if [ -f /usr/lib/tcos/hex2ascii ]; then cpifexists /usr/lib/tcos/hex2ascii /bin/ fi tcos-0.89.93ubuntu2/hooks-addons/70tcosmonitor0000664000000000000000000000725512260610261016141 0ustar # this file copies tcosxmlrpc server into initramfs # and adds startup scripts of tcosxmlrpc server if [ $TCOS_MONITOR ]; then stat_before # EJECT for mount/umount cdrom copy_exec /usr/bin/eject /usr/bin/ # SCROT package copy_exec /usr/bin/scrot /usr/bin/ IMLIB_DIR=/usr/lib/imlib2/loaders/ [ -d $USRLIB_MULTIARCH/imlib2/loaders ] && IMLIB_DIR=$USRLIB_MULTIARCH/imlib2/loaders #/usr/lib/x86_64-linux-gnu/imlib2/loaders/png.so mkdir -p $DESTDIR/$IMLIB_DIR cpifexists $IMLIB_DIR/png.so $IMLIB_DIR/ cpifexists $IMLIB_DIR/jpeg.so $IMLIB_DIR/ # screenshot script and webserver cpifexists ${TCOS_BINS}/screenshot.sh /sbin/ cpifexists ${TCOS_BINS}/useallmodules.sh /sbin/ cpifexists ${TCOS_BINS}/devicesctl.sh /sbin/ cpifexists ${TCOS_BINS}/vnc-controller.sh /sbin/ cpifexists ${TCOS_BINS}/vlc-controller.sh /sbin/ cpifexists ${TCOS_BINS}/rtp-controller.sh /sbin/ cpifexists ${TCOS_BINS}/pactl-controller.sh /sbin/ # new VNC client (avalaible in armel) mkdir -p $DESTDIR/etc/X11/app-defaults # don't run ShowPopup() with F8 grep -v ShowPopup /etc/X11/app-defaults/Vncviewer > $DESTDIR/etc/X11/app-defaults/Vncviewer cpifexists /usr/bin/xtightvncviewer /usr/bin/ cpifexists ${TCOS_BINS}/soundctl.sh /sbin/ cpifexists ${TCOS_BINS}/configctl.sh /sbin/ # udev process cpifexists ${TCOS_BINS}/tcos-udevd.sh /sbin/ mkdir -p ${DESTDIR}/etc/udev/rules.d/ cpifexists ${TCOS_DIR}/xmlrpc/050_tcos_devices.rules /etc/udev/rules.d/ # with new kernels (>= 2.6.22) need mount/umount events cpifexists ${TCOS_BINS}/mount-listener /usr/sbin/ cpifexists ${TCOS_BINS}/save-udev.sh /usr/sbin/ cpifexists ${TCOS_BINS}/listener-daemon.sh /usr/sbin/ cpifexists ${TCOS_BINS}/cdrom-mount /usr/sbin/ # need udevinfo in listener-daemon.sh if [ ! -e /usr/bin/udevinfo ] || readlink /usr/bin/udevinfo | grep -q udevadm; then cat << EOF > $DESTDIR/usr/bin/udevinfo #!/bin/sh /sbin/udevadm info \$@ EOF chmod +x $DESTDIR/usr/bin/udevinfo else cpifexists /usr/bin/udevinfo /usr/bin/ fi # tcosxmlrpc utils cpifexists ${TCOS_BINS}/tcosxmlrpc /usr/bin/ cpifexists ${TCOS_BINS}/lockscreen /usr/bin/ cpifexists ${TCOS_BINS}/screensize /usr/bin/ cpifexists ${TCOS_BINS}/lockvlc /usr/bin/ cpifexists ${TCOS_BINS}/lockvnc /usr/bin/ cpifexists ${TCOS_BINS}/get_server /usr/bin/ # copy locked image mkdir -p ${DESTDIR}/usr/share/tcos-core/ if [ -e /usr/share/tcos-core/lockscreen-custom.png ];then cp /usr/share/tcos-core/lockscreen-custom.png ${DESTDIR}/usr/share/tcos-core/ else cp /usr/share/tcos-core/lockscreen.png ${DESTDIR}/usr/share/tcos-core/ fi cpifexists ${TCOS_BINS}/getinfo.sh /sbin/ chmod +x $DESTDIR/sbin/getinfo.sh cat << EOF > $DESTDIR/sbin/restartx #!/bin/sh restartxorg & exit 0 EOF chmod +x $DESTDIR/sbin/restartx # pci database copy_exec /usr/bin/lspci /usr/bin/ mkdir -p $DESTDIR/usr/share/misc/ [ -f /usr/share/misc/pci.ids ] && cpifexists /usr/share/misc/pci.ids /usr/share/misc/ [ -f /usr/share/misc/pci.ids.gz ] && cpifexists /usr/share/misc/pci.ids.gz /usr/share/misc/ cpifexists ${TCOS_DIR}/xmlrpc/abyss.conf /etc/ cpifexists ${TCOS_DIR}/xmlrpc/mime.types /etc/ # configure /etc/abyss.conf # abs path of mime.types sed -i s/"etc"/"\/etc"/g ${DESTDIR}/etc/abyss.conf # configure user sed -i s/"nobody"/"root"/g ${DESTDIR}/etc/abyss.conf mkdir -p $DESTDIR/var/log mkdir -p $DESTDIR/var/www # add launcher cat << EOF > $DESTDIR/sbin/startxmlrpc #!/bin/sh killall tcosxmlrpc >/dev/null 2>&1 cd / /usr/bin/tcosxmlrpc /etc/abyss.conf >> /var/log/tcosxmlrpc.log 2>&1 exit 0 EOF chmod +x $DESTDIR/sbin/startxmlrpc stat_after "TcosMonitor" else _verbose "(25tcosmonitor) TCOS_TCOSMONITOR Disabled" fi tcos-0.89.93ubuntu2/hooks-addons/20alsa0000664000000000000000000000412112260610261014461 0ustar # hooks addon SOUND support # need alsa-utils if [ ! $TCOS_SOUND ]; then _verbose "(20alsa) TCOS_SOUND disabled" else stat_before # TCOS MIXER (include ALSA and OSS support) cpifexists ${TCOS_BINS}/tmixer /usr/bin/ mkdir -p $DESTDIR/usr/share/ copydir /usr/share/alsa/ /usr/share/ # Ubuntu make pulse default in this dir (thin clients must use ALSA directly) rm -f $DESTDIR/usr/share/alsa/*pulse* mkdir -p $DESTDIR/var/run/alsa mkdir -p $DESTDIR/lib if [ -d /lib/alsa ]; then copydir /lib/alsa /lib/ fi mkdir -p $DESTDIR/etc/init.d/ [ -e /etc/init.d/alsa-utils ] && cpifexists /etc/init.d/alsa-utils /etc/init.d/ if [ -d /etc/alsa ]; then copydir /etc/alsa/ /etc/ fi if [ -f /etc/modutils/alsa-base ]; then # OLD alsa-base mkdir -p $DESTDIR/etc/modutils/ cpifexists /etc/modutils/alsa-base /etc/modutils fi if [ -f /etc/modprobe.d/alsa-base ]; then # NEW alsa-base mkdir -p $DESTDIR/etc/modprobe.d/ cpifexists /etc/modprobe.d/alsa-base /etc/modprobe.d/ fi if [ -f /etc/modprobe.d/alsa-base.conf ]; then # NEW alsa-base mkdir -p $DESTDIR/etc/modprobe.d/ cpifexists /etc/modprobe.d/alsa-base.conf /etc/modprobe.d/ fi ALSA_LIB_DIR=/usr/lib/alsa-lib/ [ -d $USRLIB_MULTIARCH/alsa-lib ] && ALSA_LIB_DIR=$USRLIB_MULTIARCH/alsa-lib _verbose "(20alsa) alsa-lib=$ALSA_LIB_DIR" mkdir -p ${DESTDIR}/$ALSA_LIB_DIR [ -e $ALSA_LIB_DIR/libasound_module_pcm_pulse.so ] && \ cpifexists $ALSA_LIB_DIR/libasound_module_pcm_pulse.so $ALSA_LIB_DIR [ -e $ALSA_LIB_DIR/libasound_module_ctl_pulse.so ] && \ cpifexists $ALSA_LIB_DIR/libasound_module_ctl_pulse.so $ALSA_LIB_DIR [ -e $ALSA_LIB_DIR/libasound_module_conf_pulse.so ] && \ cpifexists $ALSA_LIB_DIR/libasound_module_conf_pulse.so $ALSA_LIB_DIR [ -e $ALSA_LIB_DIR/libasound_module_pcm_alsa_dsp.so ] && \ cpifexists $ALSA_LIB_DIR/libasound_module_pcm_alsa_dsp.so $ALSA_LIB_DIR stat_after "Alsa sound support" fi # end of TCOS_SOUND tcos-0.89.93ubuntu2/hooks-addons/03wireless0000664000000000000000000001371612260610261015411 0ustar # hook addon for wireless # need wireless-tools (firmware....) if [ ! $TCOS_WIRELESS ]; then _verbose "(03wireless) TCOS_WIRELESS disabled" else stat_before # copy wireless utils (some aren't necesary) cpifexists /sbin/iwconfig /sbin/ cpifexists /sbin/iwevent /sbin/ cpifexists /sbin/iwgetid /sbin/ cpifexists /sbin/iwlist /sbin/ cpifexists /sbin/iwpriv /sbin/ cpifexists /sbin/iwspy /sbin/ # copy udev firmware agent mkdir -p $DESTDIR/lib/udev cp -ra /lib/udev/firmware* $DESTDIR/lib/udev/ >/dev/null 2>&1 if [ -d /lib/firmware/${TCOS_KERNEL} ];then firmwaredir="/lib/firmware/${TCOS_KERNEL}" mkdir -p "${DESTDIR}${firmwaredir}" else firmwaredir="/lib/firmware" mkdir -p "${DESTDIR}${firmwaredir}" fi # generic modules manual_add_modules arc4 manual_add_modules ecb manual_add_modules michael_mic manual_add_modules ieee80211 #manual_add_modules rc80211_simple manual_add_modules mac80211 manual_add_modules ieee80211_crypt manual_add_modules ieee80211softmac manual_add_modules ieee80211_crypt_tkip manual_add_modules ieee80211_crypt_wep manual_add_modules ieee80211_crypt_ccmp # copy kernel modules for mod in $TCOS_WIRELESS_MODS; do manual_add_modules $mod if [ "$mod" = "ipw2200" ]; then _echo " WIFI: Copying firmware of ipw2200" cp -ra ${firmwaredir}/ipw2200* ${DESTDIR}${firmwaredir} elif [ "$mod" = "ipw2100" ]; then _echo " WIFI: Copying firmware of ipw2100" cp -ra ${firmwaredir}/ipw2100* ${DESTDIR}${firmwaredir} elif [ "$mod" = "madwifi" ]; then _echo " WIFI: Copying madwifi modules" #ath-pci ath-hal wlan_tkip wlan_scan_sta ath-hal manual_add_modules ath-pci manual_add_modules ath-hal manual_add_modules wlan-tkip manual_add_modules wlan-scan-sta elif [ "$mod" = "ndiswrapper" ]; then _echo " WIFI: ndiswrapper not supported (perl based)" elif [ "$mod" = "zd1211" ]; then _echo " WIFI: Copying Zydas modules and firmware" manual_add_modules zd1211rw # firmware #mkdir -p $DESTDIR/lib/firmware/ cp -ra ${firmwaredir}/zd1211/ ${DESTDIR}${firmwaredir} cat << EOF > $DESTDIR/scripts/tcos-top/02zydas_firmware #!/bin/sh if [ "\$1" = "prereqs" ]; then exit 0 fi mkdir -p /usr/lib/hotplug/firmware/ ln -s ${firmwaredir}/zd1211/zd1211_ub /usr/lib/hotplug/firmware/zd1211-WS11Ub.fw ln -s ${firmwaredir}/zd1211/zd1211_uph /usr/lib/hotplug/firmware/zd1211-WS11UPh.fw ln -s ${firmwaredir}/zd1211/zd1211_uphm /usr/lib/hotplug/firmware/zd1211-WS11UPhm.fw ln -s ${firmwaredir}/zd1211/zd1211_uphr /usr/lib/hotplug/firmware/zd1211-WS11UPhR.fw ln -s ${firmwaredir}/zd1211/zd1211_ur /usr/lib/hotplug/firmware/zd1211-WS11Ur.fw EOF chmod +x $DESTDIR/scripts/tcos-top/02zydas_firmware elif [ "$mod" = "rt61" -o "$mod" = "rt2561" -o "$mod" = "rt61pci" ]; then _echo " WIFI: Copying firmware of rt61/2561" cp -ra ${firmwaredir}/rt2* ${DESTDIR}${firmwaredir} elif [ "$mod" = "rt73" -o "$mod" = "rt73usb" ]; then _echo " WIFI: Copying firmware of rt73" cp -ra ${firmwaredir}/rt7* ${DESTDIR}${firmwaredir} elif [ "$mod" = "bcm43xx" -o "$mod" = "broadcom" ]; then _echo " WIFI: Copying firmware of bcm43xx" [ -e /lib/firmware/bcm43* ] && cp -ra /lib/firmware/bcm43* ${DESTDIR}/lib/firmware cp -ra ${firmwaredir}/bcm43* ${DESTDIR}${firmwaredir} else _echo " WIFI: Trying to copy unknow firmware" cp -ra ${firmwaredir}/$mod* ${DESTDIR}${firmwaredir} 2>/dev/null fi # end of if module done # end of modules for loop if [ "$TCOS_WIRELESS_ENC" = "WEP" ]; then _echo " DEBUG: using WEP..." if [ ! $TCOS_WIRELESS_KEY ]; then _echo "" _echo " WARNING:" _echo " Configured Wireless with WEP encription, but TCOS_WIRELESS_KEY is empty" _echo " Put your wireless key into this var in a supported format (HEX or ASCII)." _echo " See: man iwconfig (section key)" _echo "" fi fi if [ "$TCOS_WIRELESS_ENC" = "WPA" ]; then cpifexists /sbin/wpa_action /sbin/ cpifexists /sbin/wpa_cli /sbin/ cpifexists /sbin/wpa_supplicant /sbin/ cpifexists /usr/bin/wpa_passphrase /sbin/ # need linked libs in /lib not /usr/lib for lib in $(_ldd /sbin/wpa_supplicant /sbin/wpa_action /sbin/wpa_cli /usr/bin/wpa_passphrase | awk '{print $3}' |grep ^/); do newlib=$(echo $lib | sed s/"\/i686\/cmov"//g | sed s/"\/tls"//g ) #_echo " DEBUG: WPA: copying lib=$lib newlib=$newlib" if [ -e $newlib ]; then if [ ! -e $DESTDIR/lib/$(basename $lib) ]; then cp $newlib $DESTDIR/lib/ #else # _echo " DEBUG: WPA: $newlib is in image, not copy." fi else _echo " DEBUG: WPA: ### ERROR ### $newlib or $lib not found !!!!" fi done copydir /etc/wpa_supplicant /etc/ cat << EOF > $DESTDIR/sbin/start-wpa.sh #!/bin/sh . /scripts/functions . /conf/tcos.conf . /conf/tcos-run-functions TCOS_NET_WIFI_ESSID=\$(read_cmdline_var "essid" "") TCOS_WIRELESS_DEV=\$1 if [ "\$TCOS_WIRELESS_DEV" = "" ]; then echo "Error, need a wireless network device name" echo " example: \$0 ath0" echo " example: \$0 wlan0" fi WPA_CONF=\$(ls /etc/wpa_supplicant/*conf 2>/dev/null) if [ "\$WPA_CONF" = "" ]; then psk=\$(wpa_passphrase "\${TCOS_NET_WIFI_ESSID}" "\${TCOS_WIRELESS_KEY}" | sed 's/[[:blank:]]//g' | awk -F"=" '/^psk=/ {print \$2}') WPA_CONF=/etc/wpa_supplicant/wpa_supplicant.conf cat << EOC > \$WPA_CONF ctrl_interface=/var/run/wpa_supplicant network={ ssid="\${TCOS_NET_WIFI_ESSID}" proto=\${TCOS_WIRELESS_ENC} key_mgmt=WPA-PSK psk=\$psk } EOC fi PID=/var/run/wpa_supplicant.\${TCOS_WIRELESS_DEV}.pid #WPA_RUN=/var/run/wpa_supplicant wpa_supplicant -B -P\$PID -i\${TCOS_WIRELESS_DEV} -c\${WPA_CONF} EOF chmod +x $DESTDIR/sbin/start-wpa.sh fi stat_after "Wireless support" fi tcos-0.89.93ubuntu2/README.wireless0000664000000000000000000000266212260610261013607 0ustar ######################################### Boot TCOS from wireless device ######################################### 1.- Edit /etc/tcos/tcos.conf and set vars this vars: TCOS_WIRELESS_MODS="driver" TCOS_WIRELESS_ENC="enc" when driver can be: * madwifi: alias of atheros chipset (copy ath-pci, ath-hal....) * ipw2*00: need firmware in /lib/firmware * other kernel wireless module you can put more than one module (space separated) enc is type of encryption: * empty: use a free wireless network * WEP: you will be asked for passprhase (not work yet) * WPA: if you have a file like this /etc/wpa_supplicant/*.conf passhprhase and ESSID will be used, if not will be asked during boot Rebuild image: # gentcos -tftp You will see "Package Wireless support ...." Then copy the following files into hdd of wireless thin client: vmlinuz-x.x.x (same version of compiled with tcos) /var/lib/tcos/tftp/initramfs-x.x.x And add the following to grub menu.lst: # tcos title TCOS, kernel 2.6.17-10-generic root (hd0,0) kernel /boot/vmlinuz-2.6.17-10-generic ramdisk_size=65536 root=/dev/ram0 quiet boot=tcos wifi=1 essid=ESSID server=192.168.0.254 initrd /var/lib/tcos/tftp/initramfs-2.6.17-10-generic boot Important vars: wifi=1 (enable wifi network) essid=ESSID (your wireless ESSID) server=xx.xx.xx.xx (TFTP and XMDCP server) tcos-0.89.93ubuntu2/bin/0000775000000000000000000000000012260610427011641 5ustar tcos-0.89.93ubuntu2/bin/get_server0000775000000000000000000000276012260610261013735 0ustar #!/bin/sh # # Returns XMLRPC caller IP (tcosmonitor IP) # # Copyright (C) 2006-2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # if [ -e /conf/tcos-run-functions ]; then STANDALONE=/var export `grep SSL /conf/tcos.conf` else STANDALONE=/var/lib/tcos/standalone . /etc/default/tcos-standalone fi pidssl="$(pidof stunnel4 | sed '/^$/d')" # SSL enabled if [ -f $STANDALONE/log/stunnel.log -a "$pidssl" != "" -a "$1" = "1" ]; then if [ "$TCOS_XMLRPC_SSL" = "1" ] || [ "$TCOS_ENABLE_SSL" = "1" ]; then grep "tcosxmlrpc accepted connection" $STANDALONE/log/stunnel.log |tail -1 | awk '{print $NF}'| awk -F ":" '{print $1}' exit 0 fi fi # SSL disabled (not stunnel4 logs) read XMLRPC abyss log if [ -f $STANDALONE/log/access.log ]; then tail -1 $STANDALONE/log/access.log | awk '{print $1}' exit 0 fi tcos-0.89.93ubuntu2/bin/udhcpc-script0000775000000000000000000000665412260610261014346 0ustar #!/bin/sh # http://lists.debian.org/debian-boot/2002/11/msg00500.html # udhcpc script edited by Tim Riker # # Copyright (C) 2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # [ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1 RESOLV_CONF="/etc/resolv.conf" [ -n "$broadcast" ] && BROADCAST="broadcast $broadcast" [ -n "$subnet" ] && NETMASK="netmask $subnet" case "$1" in deconfig) /sbin/ifconfig $interface 0.0.0.0 ;; renew|bound) ( echo "# created by /bin/udhcpc-script" [ -n "$boot_file" ] && echo "boot_file=$boot_file" [ -n "$bootfile" ] && echo "bootfile=$bootfile" [ -n "$bootsize" ] && echo "bootsize=$bootsize" [ -n "$broadcast" ] && echo "broadcast=$broadcast" [ -n "$clientid" ] && echo "clientid=$clientid" [ -n "$cookiesrv" ] && echo "cookiesrv=$cookiesrv" [ -n "$dhcptype" ] && echo "dhcptype=$dhcptype" [ -n "$dns" ] && echo "dns=$dns" [ -n "$domain" ] && echo "domain=$domain" [ -n "$hostname" ] && echo "hostname=$hostname" [ -n "$interface" ] && echo "interface=$interface" [ -n "$ip" ] && echo "ip=$ip" [ -n "$ipttl" ] && echo "ipttl=$ipttl" [ -n "$lease" ] && echo "lease=$lease" [ -n "$logsrv" ] && echo "logsrv=$logsrv" [ -n "$lprsrv" ] && echo "lprsrv=$lprsrv" [ -n "$message" ] && echo "message=$message" [ -n "$mtu" ] && echo "mtu=$mtu" [ -n "$namesrv" ] && echo "namesrv=$namesrv" [ -n "$nisdomain" ] && echo "nisdomain=$nisdomain" [ -n "$nissrv" ] && echo "nissrv=$nissrv" [ -n "$ntpsrv" ] && echo "ntpsrv=$ntpsrv" [ -n "$requestip" ] && echo "requestip=$requestip" [ -n "$rootpath" ] && echo "rootpath=$rootpath" [ -n "$router" ] && echo "router=$router" [ -n "$search" ] && echo "search=$search" [ -n "$serverid" ] && echo "serverid=$serverid" [ -n "$siaddr" ] && echo "siaddr=$siaddr" [ -n "$sname" ] && echo "sname=$sname" [ -n "$staticroutes" ] && echo "staticroutes=$staticroutes" [ -n "$subnet" ] && echo "subnet=$subnet" [ -n "$swapsrv" ] && echo "swapsrv=$swapsrv" [ -n "$tftp" ] && echo "tftp=$tftp" [ -n "$timesrv" ] && echo "timesrv=$timesrv" [ -n "$timezone" ] && echo "timezone=$timezone" [ -n "$userclass" ] && echo "userclass=$userclass" [ -n "$vendorclass" ] && echo "vendorclass=$vendorclass" [ -n "$wins" ] && echo "wins=$wins" [ -n "$wpad" ] && echo "wpad=$wpad" [ -n "$sipsrv" ] && echo "sipsrv=$sipsrv" ) > /tmp/net.data ifconfig $interface $ip $BROADCAST $NETMASK if [ -n "$router" ] ; then while route del default gw 0.0.0.0 dev $interface ; do : done for i in $router ; do route add default gw $i dev $interface done fi [ -n "$domain" ] && echo search $domain > $RESOLV_CONF for i in $dns ; do echo nameserver $i >> $RESOLV_CONF done ;; esac exit 0 tcos-0.89.93ubuntu2/bin/get_xauth0000775000000000000000000000376512260610261013566 0ustar #!/bin/sh # # get_xauth shell script to make and screenshot with scrot # and save it in /var/www # Copyright (C) 2006-2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # export DISPLAY=:0 user=$(/usr/lib/tcos/tcos-last --user 2>/dev/null) home=$(getent passwd ${user} | head -1 | awk -F":" '{print $6}') if [ "$user" = "root" ]; then echo -n "error: root not allowed"; exit 1; fi # test if file exists and not empty if [ -s "${home}/.Xauthority" ]; then XAUTHORITY=$home/.Xauthority else XAUTHORITY=$(find /tmp/ -name ".gdm*" -user ${user} 2>/dev/null | head -1) [ -z $XAUTHORITY ] && XAUTHORITY=$(xauth info 2>/dev/null | awk '/^Authority/ {print $3}') [ -z $XAUTHORITY ] && [ "$XAUTHORITY" != "/root/.Xauthority" ] && XAUTHORITY="$(find /var/run/gdm*/ -name auth-for-* -user ${user} 2>/dev/null | head -1)/database" fi # standalone GDM login if [ "$user" = "" ] && [ -e "/var/lib/gdm/:0.Xauth" ]; then XAUTHORITY="/var/lib/gdm/:0.Xauth" fi # standalone GDM3 login if [ "$user" = "" ] && find /var/run/gdm3/ -type f 2>/dev/null| grep -q "auth-for-Debian-gdm" ; then XAUTHORITY=$(find /var/run/gdm3/ -type f 2>/dev/null| grep "auth-for-Debian-gdm") fi # standalone KDM login if [ "$user" = "" ] && [ -e "/usr/bin/kdm" ]; then XAUTHORITY=$(find /var/run/xauth -type f | tail -1) fi echo -n "${XAUTHORITY}" exit 0 tcos-0.89.93ubuntu2/bin/tcos-gdm-autologin.10000664000000000000000000000401612260610261015434 0ustar .TH tcos-gdm-autologin 1 "Nov 19, 2006" "tcos-gdm-autologin man page" .SH NAME tcos-gdm-autologin \- TCOS tool to configure GDM, create users and edit /etc/hosts form TCOS network .SH DESCRIPTION .PP \fBtcos-gdm-autologin\fP is a python script that configure some GDM vars, create users, and edit /etc/hosts to put in ip hostname pairs. .SH OPTIONS .B [no options] With no options will return username that correspond with DISPLAY and will restore home from SKEL. (this option is for use from gdm autologin file) .B --configure Set this vars in /etc/gdm/gdm.conf: [daemon] TimedLoginEnable=true TimedLogin=/usr/sbin/tcos-gdm-autologin| TimedLoginDelay=10 [security] AllowRemoteAutoLogin=true DisallowTCP=false [xdmcp] Enable=true .B --add This option will ask for user/host names prefix to add to system config. Example: prefix=myhost number=4 ipbase=192.168.0 Will generate the following: user: myhost1 pass: myhost1 home: /home/myhost1 user: myhost2 pass: myhost2 home: /home/myhost2 user: myhost3 pass: myhost3 home: /home/myhost3 user: myhost4 pass: myhost4 home: /home/myhost4 host: 192.168.0.1 hostname= myhost1 host: 192.168.0.2 hostname= myhost2 host: 192.168.0.3 hostname= myhost3 host: 192.168.0.4 hostname= myhost4 .B --skel=/foo/bar/file.tar.gz This compressed file is used to create users home, with some personalized settings and files, Default is /root/skel.tar.gz, use this option to change path and filename. .B --nodelete Not uncompress SKEL, put in gdm.conf something like this: TimedLogin=/usr/sbin/tcos-gdm-autologin \-\-nodelete| .B --help Some usage help about tcos-gdm-autologin .B --noaction Not perform any action (for debug proposes only) This option enables debug, too. .B --debug Show verbose output when running .SH BUGS Contact Mario Izquierdo Info about TCOS project: http://www.tcosproject.org .SH SEE ALSO tcos-gdm-autologin(1) .SH AUTHOR Mario Izquierdo (mariodebian) tcos-0.89.93ubuntu2/bin/tcos-genbootchart.10000664000000000000000000000124112260610261015342 0ustar .TH tcos-genbootchart 1 "Sep 28, 2008" "tcos-genbootchart man page" .SH NAME tcos-genbootchart \- TCOS tool to generate bootchart images. .SH SYNOPSYS \fBtcos-genbootchart\fP [IP/hostname] .SH DESCRIPTION .PP \fBtcos-genbootchart\fP is a shell script that get bootchart files and create boot image Thin client must boot with bootchart argument: tcos bootchartd .SH ARGUMENT .B IP/hostname (optional) IP address or hostname (must be in /etc/hosts) of thin client .SH BUGS Contact Mario Izquierdo Info about TCOS project: http://www.tcosproject.org .SH SEE ALSO gentcos(1) .SH AUTHOR Mario Izquierdo (mariodebian) tcos-0.89.93ubuntu2/bin/gentcos0000775000000000000000000006454312260610261013241 0ustar #!/bin/bash # # gentcos generate network bootable initramfs images # Creation Date: 2 Feb 2006 # # Copyright (C) 2006-2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # ID=$(id -u) if [ $ID -ne 0 ]; then echo "You must run this script as root" exit 1 fi . /etc/tcos/tcos.conf [ -e /var/lib/tcos/version.conf ] && . /var/lib/tcos/version.conf . ${TCOS_DIR}/tcos-generation-functions.sh . /usr/share/initramfs-tools/hook-functions # Multiarch DIR LIB_MULTIARCH=/lib/ USRLIB_MULTIARCH=/usr/lib/ if [ -n "$TCOS_MULTIARCH" ] && [ -e "/usr/lib/$TCOS_MULTIARCH" ]; then LIB_MULTIARCH="/lib/$TCOS_MULTIARCH" USRLIB_MULTIARCH="/usr/lib/$TCOS_MULTIARCH" fi export LIB_MULTIARCH export USRLIB_MULTIARCH for tpl in $(tcos_get_templates); do . $tpl done # load forced settings for derivatives if [ -d /etc/tcos/conf.d/ ]; then for file in /etc/tcos/conf.d/tcos*conf; do [ -e $file ] && . $file done fi if [ -z $TCOS_KERNEL ]; then NEWEST_VMLINUZ=$(basename $(ls /boot/vmlinuz-*| head -1)) TCOS_KERNEL=${NEWEST_VMLINUZ#vmlinuz-} fi # default output files OUTPUTIMAGE=${ISOS}/tcos-boot-usb.iso if [ -e /usr/bin/mkisofs ];then GENISO="/usr/bin/mkisofs" else GENISO="/usr/bin/genisoimage" fi OUTINITRAMFS=initramfs OUTNBI=linux.nbi OUTROOTFS_TMP=/tmp/rootfs-${TCOS_KERNEL}-$$ OUTROOTFS_END=${TFTP_DIR}/rootfs-${TCOS_KERNEL}.squashfs # temp vars INITRAMFS=/tmp/initramfs-$$ TMPNBI=/tmp/nbi-$$ EXTRA_APPEND="" TCOS_SUFFIX= MKVERBOSE="" # BASH COLORS NORMAL="\033[0;39m" GRAY="\033[1;30m" LIGHT_GRAY="\033[0;37m" CYAN="\033[0;36m" LIGHT_CYAN="\033[1;36m" RED="\033[1;31m" GREEN="\033[1;32m" YELLOW="\033[1;33m" BLUE="\033[1;34m" MAGENTA="\033[1;35m" WHITE="\033[1;37m" _exit () { if [ "$1" = "1" ];then rm -f ${TFTP_DIR}/usr${TCOS_SUFFIX}-${TCOS_KERNEL}.squashfs 2>/dev/null rm -f ${TFTP_DIR}/${OUTINITRAMFS}${TCOS_SUFFIX} 2>/dev/null rm -f ${TFTP_DIR}/${OUTNBI}${TCOS_SUFFIX} 2>/dev/null rm -f ${TFTP_DIR}/root-${TCOS_KERNEL}.squashfs 2>/dev/null rm -f ${TFTP_DIR}/${OUTINITRAMFS}-nfs 2>/dev/null fi unset TCOS_SQUASHFS unset TCOS_ALL_MODULES unset TCOS_SUFFIX rm -f ${TMPNBI} rm -f ${INITRAMFS} rm -f ${INITRAMFS}-nfs rm -rf ${OUTROOTFS_TMP} # exit wrapper #echo "DONE" exit $1 } call_mkinitramfs() { rm -rf /tmp/mkinitramfs* /tmp/gentcos* /var/tmp/mkinitramfs* NEWINITRAMFS=$1 #echo "mkinitramfs $MKVERBOSE -d ${TCOS_CONF} -o ${NEWINITRAMFS} ${TCOS_KERNEL}" mkinitramfs -k $MKVERBOSE -d ${TCOS_CONF} -o ${NEWINITRAMFS} ${TCOS_KERNEL} DESTDIR2="$(find /var/tmp/ /tmp/ -maxdepth 1 -type d -name "mkinitramfs*")" #(cd "${MKDIR}" && find . | cpio --quiet --dereference -o -H newc | gzip > "${NEWINITRAMFS}" ) if [ ! -d "$DESTDIR2/scripts" ]; then _echo " **ERROR** mkinitramfs temp dir not found" return fi export DESTDIR="${DESTDIR2}" # clean dir bash ${TCOS_DIR}/hooks-addons/clean_initramfs echo -n " * Updating module dependencies..." DEPMOD_ARGS="-a -F /boot/System.map-${TCOS_KERNEL}" if depmod -h 2>&1|grep -q map; then DEPMOD_ARGS="-am -F /boot/System.map-${TCOS_KERNEL}" fi # convert module kernel links in files LINKS=$(find ${DESTDIR}/lib/modules/${TCOS_KERNEL}/ -type l) for link in $LINKS; do fname=$(echo $link| sed -e s@"$DESTDIR"@""@g) #echo " fname=$fname link=$link" rm -f "$link" cp "$fname" "$link" done mkdir -p ${DESTDIR}/boot/ cp /boot/System.map-${TCOS_KERNEL} ${DESTDIR}/boot/ chroot ${DESTDIR}/ /sbin/depmod $DEPMOD_ARGS ${TCOS_KERNEL} rm -rf ${DESTDIR}/boot/ echo " done." # compress again rm -f ${NEWINITRAMFS} # LZMA gets 11 MB and GZIP 9,9, disable LZMA for now #if grep -q -i ^config_rd_lzma /boot/config-${TCOS_KERNEL}; then # echo -n " * Using LZMA (experimental) to compress image..." # (cd "${DESTDIR2}" && find . | cpio --quiet -o -H newc | lzop -9 > "${NEWINITRAMFS}" ) # echo " done." #else (cd "${DESTDIR2}" && find . | cpio --quiet -o -H newc | gzip > "${NEWINITRAMFS}" ) #fi rm -rf "${DESTDIR2}" rm -rf /tmp/mkinitramfs_* /tmp/gentcos_* /var/tmp/mkinitramfs* } # some functions create_initramfs() { # call mkinitramfs _echo "TCOS $DISTRIBUTION/$TCOS_DISTRO/$TCOS_ARCH $TCOS_VERSION" _echo "Creating initramfs with ${TCOS_KERNEL} kernel..." call_mkinitramfs ${INITRAMFS} if [ ! -f ${TFTP_DIR}/vmlinuz-${TCOS_KERNEL} ]; then _echo " Linking vmlinuz-${TCOS_KERNEL} in ${TFTP_DIR}" ln -s /boot/vmlinuz-${TCOS_KERNEL} ${TFTP_DIR} fi } # some functions create_initramfs_nfs() { # call mkinitramfs _echo "Creating NFS initramfs with ${TCOS_KERNEL} kernel..." export TCOS_BOOT=tcos-nfs call_mkinitramfs "${INITRAMFS}-nfs" unset TCOS_BOOT if [ ! -f ${TFTP_DIR}/vmlinuz-${TCOS_KERNEL} ]; then _echo " Linking vmlinuz-${TCOS_KERNEL} in ${TFTP_DIR}" ln -s /boot/vmlinuz-${TCOS_KERNEL} ${TFTP_DIR} fi } create_rootfs() { if [ ! -e /etc/tcos/chroot ] && [ ! -f /etc/exports ]; then echo " Warning:" echo " No NFS server detected and /etc/exports file." echo " Install nfs-kernel-server and put this line into /etc/exports" echo "" echo " /var/lib/tcos 192.168.0.0/255.255.255.0(ro,no_root_squash,sync,no_subtree_check)" echo "" echo " (change 192.168.0.0 with your network addresses)" echo "" echo " Ignore this if you are running with a 32bit chroot." fi _echo "Creating NFS rootfs in ${TCOS_VAR}/fs-${TCOS_KERNEL}/" rm -rf ${OUTROOTFS_TMP} && mkdir -p ${OUTROOTFS_TMP} export TCOS_ENV_DISABLE_SQUASHFS=1 create_initramfs unset TCOS_ENV_DISABLE_SQUASHFS _echo " Uncompressing initramfs..." # uncompress initramfs cp ${INITRAMFS} ${OUTROOTFS_TMP}/initramfs.gz gunzip ${OUTROOTFS_TMP}/initramfs.gz old_dir=$(pwd) cd ${OUTROOTFS_TMP} cpio -i < initramfs 2> /dev/null rm -f initramfs rm -rf ${TCOS_VAR}/fs-${TCOS_KERNEL} mkdir ${TCOS_VAR}/fs-${TCOS_KERNEL} mv ${OUTROOTFS_TMP}/* ${TCOS_VAR}/fs-${TCOS_KERNEL}/ echo -n " * Updating modules dependencies..." DEPMOD_ARGS="-a -F -F /boot/System.map-${TCOS_KERNEL}" if depmod -h 2>&1|grep -q map; then DEPMOD_ARGS="-am -F /boot/System.map-${TCOS_KERNEL}" fi mkdir -p ${TCOS_VAR}/fs-${TCOS_KERNEL}/boot/ cp /boot/System.map-${TCOS_KERNEL} ${TCOS_VAR}/fs-${TCOS_KERNEL}/boot/ chroot ${TCOS_VAR}/fs-${TCOS_KERNEL}/ /sbin/depmod $DEPMOD_ARGS ${TCOS_KERNEL} rm -rf ${TCOS_VAR}/fs-${TCOS_KERNEL}/boot/ echo " done." if [ -e /sbin/nbd-client ]; then echo -n " * Creating root-${TCOS_KERNEL}.squashfs to use with NBD..." MKSQUASHFS=mksquashfs [ -x /usr/bin/mksquashfs ] && MKSQUASHFS=/usr/bin/mksquashfs [ -x /usr/sbin/mksquashfs ] && MKSQUASHFS=/usr/sbin/mksquashfs $MKSQUASHFS ${TCOS_VAR}/fs-${TCOS_KERNEL}/ ${TFTP_DIR}/root-${TCOS_KERNEL}.squashfs > /dev/null 2>&1 chmod 644 ${TFTP_DIR}/root-${TCOS_KERNEL}.squashfs echo " done." fi cd ${old_dir} rmdir ${OUTROOTFS_TMP} } ramdisk_size () { # uncompress initramfs and exec du _echo "Uncompressing ramdisk to get sizes..." tmpdir="$(mktemp -t -d gentcos_XXXXXX)" cp ${INITRAMFS} ${tmpdir}/initrd.gz gunzip ${tmpdir}/initrd.gz || return oldpwd=$(pwd) cd ${tmpdir}/ cpio -i < initrd >/dev/null 2>&1 rm initrd squashfs_size=0 ramdisk_size=$(du -s . | awk '{print $1}') if [ -e ${TFTP_DIR}/usr${TCOS_SUFFIX}-${TCOS_KERNEL}.squashfs ]; then squashfs_size=$(du -s ${TFTP_DIR}/usr${TCOS_SUFFIX}-${TCOS_KERNEL}.squashfs 2> /dev/null | awk '{print $1}') fi echo "RAMDISK=${ramdisk_size}" echo "EXTERNAL_SQUASHFS=${squashfs_size}" if [ $TCOS_NBI ]; then nbi_size=$(du -s ${TMPNBI} | awk '{print $1}') echo "NBI_IMAGE=${nbi_size}" echo "TOTAL_RAM=$((${nbi_size}+${squashfs_size}))" else echo "TOTAL_RAM=$((${ramdisk_size}+${squashfs_size}))" fi rm -rf ${tmpdir} cd ${oldpwd} } create_nbi() { # call mknbi _echo "Creating nbi image with ${TCOS_KERNEL} kernel" # TCOS_APPEND add more append with -extra-append echo "Building NBI image with this append: ${TCOS_APPEND} ${EXTRA_APPEND}" if [ "${EXTRA_APPEND}" = "" ]; then echo " Please add option -extra-append=\"your_modifiers\" " fi /usr/bin/mkelf-linux /boot/vmlinuz-${TCOS_KERNEL} /tmp/initramfs-${TCOS_KERNEL} \ --output=${TMPNBI} --append="${TCOS_APPEND} ${EXTRA_APPEND}" rm /tmp/initramfs-${TCOS_KERNEL} } create_isolinux_iso() { # ISOLINUX dir=/tmp/isolinux-iso$$ mkdir -p ${dir}/isolinux [ ! -d ${ISOS} ] && mkdir -p ${ISOS} create_initramfs cp ${INITRAMFS} ${dir}/isolinux/initrd.cdrom parse_pxelinuxcfg ${dir}/isolinux/isolinux.cfg isolinux sed -i s/"vmlinuz-${TCOS_KERNEL}"/"vmlinuz"/g ${dir}/isolinux/isolinux.cfg sed -i s/"initramfs-${TCOS_KERNEL}"/"initrd.cdrom"/g ${dir}/isolinux/isolinux.cfg cp ${TFTP_DIR}/${TFTP_LOGO_LSS} ${dir}/isolinux/ cp ${TFTP_DIR}/${TFTP_MSG} ${dir}/isolinux/ cp ${TFTP_DIR}/${TFTP_MSG_HELP1} ${dir}/isolinux/ cp ${TFTP_DIR}/${TFTP_MSG_HELP2} ${dir}/isolinux/ cp /usr/lib/syslinux/isolinux.bin ${dir}/isolinux/ cp /boot/vmlinuz-${TCOS_KERNEL} ${dir}/isolinux/vmlinuz ${GENISO} -l -r -J -V "${VOLUMENAME}" -hide-rr-moved -v -b isolinux/isolinux.bin -c boot.cat \ -no-emul-boot -boot-load-size 4 -boot-info-table -o ${OUTPUTIMAGE} ${dir}/ > /dev/null 2>&1 if [ $? = 0 ]; then echo "Iso image done succesfully: ${OUTPUTIMAGE}" else echo "Error running mkisofs." fi rm -rf ${dir} > /dev/null 2>&1 } usage() { /bin/echo -e "Usage: $WHITE$(basename $0)$NORMAL $RED-tftp$NORMAL [-o=initrd-pc1] PXE (>= 64 Mb) $RED-nfs$NORMAL [$GREEN-rootfs$NORMAL] LTSP like (28 - 64 Mb) $RED-nbi$NORMAL [-nbi-output=linux.nbi] Floppy $RED-cdrom$NORMAL [-force] CDROM $RED-instpkg$NORMAL pkgname $RED-rmpkg$NORMAL pkgname $RED-listpkg$NORMAL $RED-fix-nvidia-ati$NORMAL [-h] or [-help] $(basename $0) extended help [${RED}-vmlinux=${WHITE}vmlinuz-x.x.x${RED}|${WHITE}/boot/vmlinuz-x.x.x${NORMAL}] kernel version [${RED}-suffix=${WHITE}foo${NORMAL}] ( suffix for filenames ) [${RED}-size${NORMAL}] ( print ramdisk size ) [${RED}-v${NORMAL}] ( show verbose output of mkinitramfs ) [${RED}-allmodules${NORMAL}] ( generate allmodules-${TCOS_KERNEL}.squashfs to know what kernel modules need ) [${RED}-extramodules=${WHITE}"foo,bar"${NORMAL}] ( add coma separated list of modules ) " _exit 0 } _help() { /bin/echo -e " This is gentcos help info about generating net init images. ${BLUE}TFTP PXE images:${NORMAL} ${GREEN}-tftp${NORMAL} or [-t] make initramfs-${TCOS_KERNEL} and copy to ${TFTP_DIR} [${GREEN}-o=initramfs-tcos1${NORMAL}] output file ( default ${TFTP_DIR}/${OUTINITRAMFS} ) ${BLUE}NFS (like LTSP) images:${NORMAL} ${GREEN}-nfs${NORMAL} or [-n] make initramfs-${TCOS_KERNEL}-nfs and copy to ${TFTP_DIR} [${GREEN}-rootfs${NORMAL}] Make a complete initramfs and uncompress in ${TCOS_VAR}/fs-${TCOS_KERNEL} ( default ${TFTP_DIR}/${OUTINITRAMFS}-nfs ) ${BLUE}NBI IMAGES:${NORMAL} ( Etherboot floppy ) ${GREEN}-nbi${NORMAL} or [-b] create NBI (network bootable images) in ${TFTP_DIR} [${GREEN}-nbi-output=linux-tcos1.nbi${NORMAL}] output nbi file ( default ${OUTNBI}-${TCOS_KERNEL} ) [${GREEN}-extra-append${NORMAL}] append more options to cmline of NBI image ( Example: -extra-append=\"startx=N volume=80%\" ${BLUE}ISO IMAGES:${NORMAL} ${GREEN}-cdrom${NORMAL} or [-c] create cdrom iso file in $ISOS [${GREEN}-force${NORMAL}] force cdrom build if external SQUASH is enabled ( this will put squashfs into initramfs ) ${BLUE}Install package in cache:${NORMAL} ${GREEN}-instpkg${NORMAL} This option download with apt-get install -d -y (not install) and extract package in ${TCOS_PKG_CACHE} This is used for use some tool (example esound) without instllin it. ${BLUE}Remove package from cache:${NORMAL} ${GREEN}-rmpkg${NORMAL} This option remove cached package from ${TCOS_PKG_CACHE} ${BLUE}List cached packages:${NORMAL} ${GREEN}-listpkg${NORMAL} This option list all cached packages with -instpkg option ${BLUE}Fix NVIDIA/ATI driver problem:${NORMAL} ${GREEN}-fix-nvidia-ati${NORMAL} This option cache xserver-xorg-core and libgl1-mesa-glx packages to avoid using nvidia/ati libs. In all build you can add this params: ${BLUE}-vmlinuz${NORMAL}=[ vmlinuz.x.x.x | /boot/vmlinuz.x.x.x ] this will build all images with the kernel version of this file Examples of use: ${WHITE} gentcos -tftp -suffix=-pc1 gentcos -nfs -rootfs gentcos -cdrom gentcos -nbi -extra-append=\"vga=791 uselocal\" gentcos -instpkg esound gentcos -rmpkg esound gentcos -listpkg gentcos -fix-nvidia-ati ${NORMAL} " } if [ $# = 0 ]; then usage _exit 0 fi alert_need_module() { _mod=$1 echo "ERROR:" echo " to build usable TCOS initramfs images need this kernel module: \"${_mod}\"" echo "" echo " Perhaps we have compiled for you, try installing tcos-extra-modules-${TCOS_KERNEL}" echo " if package don't exist you can try to build it" echo "" echo " # apt-get install module-assistant linux-headers-${TCOS_KERNEL} ${_mod}-source" echo " # m-a -t -k /usr/src/linux-headers-${TCOS_KERNEL} build,install ${_mod}" echo "" echo "" echo "NOTE: You can change kernel version in ${TCOS_CONF}/tcos.conf file" } check_modules() { NEED_MODULES="aufs|overlayfs|unionfs squashfs" for _module in ${NEED_MODULES}; do have_module=0 if [ "$(echo $_module | awk -F "|" '{print $2}')" != "" ]; then for _mod in $(echo $_module | sed 's/|/ /g'); do #_echo "searching for module $_mod" tcos_find_module "${_mod}" && have_module=1 done else tcos_find_module "${_module}" && have_module=1 fi if [ ${have_module} = 0 ] ; then alert_need_module $_module _exit 1 fi done } check_xfs() { # since 0.89.13 TCOS not need XFS server return if [ ! -e /etc/tcos/chroot ] && [ ! -f /etc/X11/fs/config ]; then echo "" echo "WARNING:" echo " TCOS needs a font server, please install xfs package" echo " and configure to allow remote connections. See README." echo "" else if [ ! -e /etc/tcos/chroot ] && grep -q "^no-listen" /etc/X11/fs/config ; then echo "WARNING:" echo " TCOS need a network font server. Please edit /etc/X11/fs/config" echo " search for no-listen = tcp line and put like this:" echo " #no-listen = tcp " echo " Then restart service: /etc/init.d/xfs restart" fi fi } link_vmlinuz() { if [ $TCOS_VMLINUZ ]; then if [ -f $TCOS_VMLINUZ ] ; then vmlinuz=$(basename ${TCOS_VMLINUZ} ) TCOS_KERNEL=${vmlinuz#vmlinuz-} if ! find ${TFTP_DIR}/*${vmlinuz}* 2> /dev/null | grep -q vmlinuz ; then # no link, create echo "Linking ${TCOS_VMLINUZ} in ${TFTP_DIR}/" ln -s $TCOS_VMLINUZ ${TFTP_DIR}/ fi elif [ -f /boot/${TCOS_VMLINUZ} ]; then vmlinuz=${TCOS_VMLINUZ} TCOS_KERNEL=${vmlinuz#vmlinuz-} if ! find ${TFTP_DIR}/*${vmlinuz}* 2> /dev/null | grep -q vmlinuz ; then # no link, create echo "Linking ${TCOS_VMLINUZ} in ${TFTP_DIR}/" ln -s /boot/$TCOS_VMLINUZ ${TFTP_DIR}/ fi else echo "ERROR: vmlinuz argument not found: ${TCOS_VMLINUZ}" echo " You can use -vmlinuz=vmlinuz-x.x.x or" echo " -vmlinuz=/boot/vmlinuz-x.x.x" echo "" echo " Using default kernel ${TCOS_KERNEL}" fi fi } list_pkg() { echo " Installed cached packages are:" ls -1 ${TCOS_PKG_CACHE} 2>/dev/null _exit 0 } check_cached_packages(){ for PKG in $(echo ${TCOS_PKG_CACHE_LIST} | sed 's/,/ /g'); do if [ ${PKG} = "fix-nvidia-ati" ];then CANDIDATE1=$(LC_ALL=C apt-cache policy xserver-xorg-core | awk -F"Candidate: " '/Candidate/ {print $2}' | sed 's/[[:blank:]]*//g') CANDIDATE2=$(LC_ALL=C apt-cache policy libgl1-mesa-glx | awk -F"Candidate: " '/Candidate/ {print $2}' | sed 's/[[:blank:]]*//g') VER1="" VER2="" [ -e ${TCOS_PKG_CACHE}/fix-nvidia-ati/VERSION.xserver ] && VER1=$(cat ${TCOS_PKG_CACHE}/fix-nvidia-ati/VERSION.xserver) [ -e ${TCOS_PKG_CACHE}/fix-nvidia-ati/VERSION.glx ] && VER2=$(cat ${TCOS_PKG_CACHE}/fix-nvidia-ati/VERSION.glx) if [ "${CANDIDATE1}" != "${VER1}" -o "${CANDIDATE2}" != "${VER2}" ];then echo "Updating package cache fix-nvidia-ati..." fix_nvidia_ati "1" fi else CANDIDATE=$(LC_ALL=C apt-cache policy ${PKG} | awk -F"Candidate: " '/Candidate/ {print $2}' | sed 's/[[:blank:]]*//g') VER="" [ -e ${TCOS_PKG_CACHE}/${PKG}/VERSION ] && VER=$(cat ${TCOS_PKG_CACHE}/${PKG}/VERSION) if [ "${CANDIDATE}" != "${VER}" ];then echo "Updating package cache ${PKG} to version ${CANDIDATE}..." tcos_inst_pkg ${PKG} fi fi done } get_pkg_uri() { PKG_MIRROR=$(basename $(rgrep "/$1_" /var/lib/apt/ 2>/dev/null| awk -F":" '{print $1}'| head -1) 2>/dev/null) if [ $? != 0 ]; then return 1 fi MIRROR=$(echo $PKG_MIRROR | sed 's|_|/|g' | awk -F"/dists" '{print $1}') COMPLETE_MIRROR=$(grep "$MIRROR " /etc/apt/sources.list | grep -v "^#" |awk '{print $2}') PKG_FILE=$(rgrep "/$1_" /var/lib/apt/ 2>/dev/null| awk '{print $2}'| head -1) echo ${COMPLETE_MIRROR}/${PKG_FILE} } tcos_inst_pkg() { error=0 echo "Install PKG \"$@\"" for PKG in ${@}; do rm -f /var/cache/apt/archives/${PKG}_* 2>/dev/null PKG_URI=$(apt-get install -qq --print-uris --reinstall ${PKG}| egrep 'file|http|ftp' \ | grep "/${PKG}_" | awk '{print $1}'| tr -d "'") if [ "${PKG_URI}" = "" ]; then PKG_URI=$(get_pkg_uri ${PKG}) fi PKG_PROTOCOL=$(echo ${PKG_URI} | awk -F ":" '{print $1}') if [ "${PKG_PROTOCOL}" = "http" ] || [ "${PKG_PROTOCOL}" = "ftp" ]; then PKG_FILE=/tmp/$(basename $PKG_URI) _echo " * Downloading ${PKG_URI}" wget -q "${PKG_URI}" -O ${PKG_FILE} elif [ "${PKG_PROTOCOL}" = "file" ]; then PKG_FILE=$(echo ${PKG_URI} | sed s/"file:"//g ) echo "Using file:// protocol, package is in ${PKG_FILE} " else echo "Unknow PKG_URI=${PKG_URI} protocol: ${PKG_PROTOCOL} " error=1 PKG_FILE="" echo "There are some errors during caching \"${PKG}\". PLEASE CHECK REPOSITORIES!!" fi dpkg -I ${PKG_FILE} >/dev/null 2>&1 if [ $? -ne 0 ] || [ "${PKG_FILE}" = "" ] ; then echo "Error: Unknow package: ${PKG}" error=1 echo "There are some errors during caching \"${PKG}\". PLEASE CHECK REPOSITORIES!!" else echo "Extracting $(basename ${PKG_FILE})..." VER=$(LC_ALL=C apt-cache policy ${PKG} | awk -F"Candidate: " '/Candidate/ {print $2}' | sed 's/[[:blank:]]*//g') rm -rf ${TCOS_PKG_CACHE}/${PKG} mkdir -p ${TCOS_PKG_CACHE}/${PKG} dpkg --extract "${PKG_FILE}" ${TCOS_PKG_CACHE}/${PKG} if [ "${PKG}" = "xserver-xorg-core" ];then echo ${VER} > ${TCOS_PKG_CACHE}/${PKG}/VERSION.xserver elif [ "${PKG}" = "libgl1-mesa-glx" ];then echo ${VER} > ${TCOS_PKG_CACHE}/${PKG}/VERSION.glx else echo ${VER} > ${TCOS_PKG_CACHE}/${PKG}/VERSION fi [ -e /tmp/$(basename $PKG_URI) ] && rm -f /tmp/$(basename $PKG_URI) fi done [ $error = 0 ] && echo "All package installed." [ $error != 0 ] && _exit 1 } tcos_rm_pkg() { echo "Remove PKG \"$@\"" for PKG in ${@}; do if [ -d "${TCOS_PKG_CACHE}/${PKG}" ]; then echo -n "Removing package ${PKG}..." rm -rf "${TCOS_PKG_CACHE}/${PKG}" echo " done." fi done _exit 0 } fix_nvidia_ati() { tcos_inst_pkg "xserver-xorg-core libgl1-mesa-glx" rm -rf ${TCOS_PKG_CACHE}/fix-nvidia-ati mkdir -p ${TCOS_PKG_CACHE}/fix-nvidia-ati [ -e ${TCOS_PKG_CACHE}/xserver-xorg-core/usr/lib/xorg/modules/extensions/libglx.so ] && \ mv ${TCOS_PKG_CACHE}/xserver-xorg-core/usr/lib/xorg/modules/extensions/libglx.so \ ${TCOS_PKG_CACHE}/fix-nvidia-ati/libglx.so # libGLcore.so is not provided by xserver-xorg-core in >= 1.6 [ -e ${TCOS_PKG_CACHE}/xserver-xorg-core/usr/lib/xorg/modules/extensions/libGLcore.so ] && \ mv ${TCOS_PKG_CACHE}/xserver-xorg-core/usr/lib/xorg/modules/extensions/libGLcore.so \ ${TCOS_PKG_CACHE}/fix-nvidia-ati/libGLcore.so [ -e ${TCOS_PKG_CACHE}/xserver-xorg-core/usr/lib/xorg/modules/libwfb.so ] && \ mv ${TCOS_PKG_CACHE}/xserver-xorg-core/usr/lib/xorg/modules/libwfb.so \ ${TCOS_PKG_CACHE}/fix-nvidia-ati/libwfb.so [ -e ${TCOS_PKG_CACHE}/libgl1-mesa-glx/usr/lib/libGL.so.1.2 ] && \ mv ${TCOS_PKG_CACHE}/libgl1-mesa-glx/usr/lib/libGL.so.1.2 \ ${TCOS_PKG_CACHE}/fix-nvidia-ati/libGL.so.1.2 # multiarch support i386 [ -e ${TCOS_PKG_CACHE}/libgl1-mesa-glx/usr/lib/i386-linux-gnu/libGL.so.1.2 ] && \ mv ${TCOS_PKG_CACHE}/libgl1-mesa-glx/usr/lib/i386-linux-gnu/libGL.so.1.2 \ ${TCOS_PKG_CACHE}/fix-nvidia-ati/libGL.so.1.2 # multiarch support amd64 [ -e ${TCOS_PKG_CACHE}/libgl1-mesa-glx/usr/lib/x86_64-linux-gnu/libGL.so.1.2 ] && \ mv ${TCOS_PKG_CACHE}/libgl1-mesa-glx/usr/lib/x86_64-linux-gnu/libGL.so.1.2 \ ${TCOS_PKG_CACHE}/fix-nvidia-ati/libGL.so.1.2 [ -e ${TCOS_PKG_CACHE}/xserver-xorg-core/VERSION.xserver ] && \ mv ${TCOS_PKG_CACHE}/xserver-xorg-core/VERSION.xserver \ ${TCOS_PKG_CACHE}/fix-nvidia-ati/VERSION.xserver [ -e ${TCOS_PKG_CACHE}/libgl1-mesa-glx/VERSION.glx ] && \ mv ${TCOS_PKG_CACHE}/libgl1-mesa-glx/VERSION.glx \ ${TCOS_PKG_CACHE}/fix-nvidia-ati/VERSION.glx rm -rf ${TCOS_PKG_CACHE}/xserver-xorg-core rm -rf ${TCOS_PKG_CACHE}/libgl1-mesa-glx echo "NVIDIA/ATI cache done" [ ! -z $1 ] || _exit 0 } for opt in $@ ; do case ${opt} in -h) _help _exit 0 ;; -help) _help _exit 0 ;; -c) TCOS_CDROM=1 ;; -cdrom) TCOS_CDROM=1 ;; -t) TCOS_TFTP=1 ;; -tftp) TCOS_TFTP=1 ;; -nfs) TCOS_NFS=1 ;; -n) TCOS_NFS=1 ;; -o=*) OUTINITRAMFS=${opt#-o=} ;; -b) TCOS_NBI=1 ; TCOS_TFTP=1 ;; -nbi) TCOS_NBI=1 ; TCOS_TFTP=1 ;; -nbi-output=*) OUTNBI=${opt#-nbi-output=} ;; -extra-append=*) EXTRA_APPEND=${opt#-extra-append=} ;; -suffix=*) TCOS_SUFFIX=${opt#-suffix=} ;; -f) TCOS_FORCE=1 ;; -v) MKVERBOSE="-v" ;; -force) TCOS_FORCE=1 ;; -type=*) TYPE=${opt#-type=} ; TCOS_CDROM=1 ;; -vmlinuz=*) TCOS_VMLINUZ=${opt#-vmlinuz=} ; ;; -size) TCOS_SIZE=1 ;; -allmodules) TCOS_ALL_MODULES=1 ;; -extramodules=*) TCOS_EXTRA_MODULES="${TCOS_EXTRA_MODULES},"${opt#-extramodules=} ;; -rootfs) TCOS_ROOTFS=1 ;; -instpkg) tcos_inst_pkg "${@#-instpkg}"; _exit 0 ;; -rmpkg) tcos_rm_pkg "${@#-rmpkg}"; _exit 0 ;; -listpkg) list_pkg ;; -fix-nvidia-ati) fix_nvidia_ati ;; -parse-pxelinuxcfg) parse_pxelinuxcfg _exit 0 ;; --*) echo "Double -- is not accepted as command line parameter." echo "See $0 -help to know about usage" _exit 1 ;; esac done ################# START APP here ############################ if [ ! -d /lib/modules/${TCOS_KERNEL} ]; then echo "Error: kernel ${TCOS_KERNEL} not found." _exit 1 fi # link vmlinuz in TFTP_DIR link_vmlinuz # check for unionfs and squashfs check_modules # check for XFS setup # check_xfs # make a pxelinux.cfg/default with this kernel #parse_pxelinuxcfg OUTINITRAMFS=initramfs-${TCOS_KERNEL} OUTNBI=linux-${TCOS_KERNEL}.nbi # disable usr.squashfs external file (need into initramfs) if [ $TCOS_CDROM ] ; then export TCOS_SQUASHFS= fi # add suffix to usr.squashfs into hooks/tcosbin if [ $TCOS_SUFFIX ]; then export TCOS_SUFFIX fi # generate allmodules.squashfs to teast all hardware in terminal if [ $TCOS_ALL_MODULES ]; then export TCOS_ALL_MODULES fi # Check if cached packages need update only if action is regenerate image if [ $TCOS_PKG_CACHE_LIST ];then export TCOS_PKG_CACHE_LIST check_cached_packages fi if [ ! -z $TCOS_CDROM ]; then if [ ${TCOS_SQUASHFS} ]; then echo "Can build external usr.squashfs to use in cdrom iso." echo "Edit ${TCOS_CONF}/tcos.conf and set TCOS_DISABLE_SQUASHFS=1 or TCOS_SQUASHFS=" if [ ! ${TCOS_FORCE} ]; then echo " Use [-f | -force] to continue." _exit 1 fi fi fi # default isolinux if [ ! -z $TCOS_CDROM ]; then create_isolinux_iso fi if [ ! -z $TCOS_TFTP ]; then if [ ! -f ${INITRAMFS} ]; then create_initramfs fi if [ $TCOS_NBI ]; then cp ${INITRAMFS} /tmp/initramfs-${TCOS_KERNEL} create_nbi fi # don't overwrite initramfs if we are generating NBI image if [ ! ${TCOS_NBI} ]; then _echo "Copying initramfs to ${TFTP_DIR}/${OUTINITRAMFS}${TCOS_SUFFIX}" cp ${INITRAMFS} ${TFTP_DIR}/${OUTINITRAMFS}${TCOS_SUFFIX} fi if [ $TCOS_NBI ]; then _echo "Moving nbi image to ${TFTP_DIR}/${OUTNBI}${TCOS_SUFFIX}" cp ${TMPNBI} ${TFTP_DIR}/${OUTNBI}${TCOS_SUFFIX} fi fi if [ $TCOS_NFS ]; then create_initramfs_nfs _echo "Copying initramfs to ${TFTP_DIR}/${OUTINITRAMFS}-nfs" cp ${INITRAMFS}-nfs ${TFTP_DIR}/${OUTINITRAMFS}-nfs fi if [ $TCOS_ROOTFS ]; then create_rootfs fi if [ $TCOS_SIZE ]; then ramdisk_size fi parse_pxelinuxcfg _exit 0 tcos-0.89.93ubuntu2/bin/tcos-bootchartd0000664000000000000000000001021112260610261014652 0ustar #!/bin/sh # # Bootchart logger script # Ziga Mahkovec # # Modified for TCOS project by Mario Izquierdo (mariodebian) # # This script is used for data collection for the bootchart # boot performance visualization tool (http://www.bootchart.org). # # To profile the boot process, bootchartd should be called instead of # /sbin/init. Modify the kernel command line to include: # init=/sbin/bootchartd # # bootchartd will then start itself in background and exec /sbin/init # (or an alternative init process if specified using bootchart_init=) # # To profile a running system, run: # $ /sbin/bootchartd start; /bin/sleep 30; /sbin/bootchartd stop # # Copyright (C) 2006-2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # PATH="/sbin:/bin:/usr/sbin:/usr/bin:$PATH" VERSION="0.8" # Lock file BOOTLOG_LOCK="/tmp/bootchart.lock" # bootchartd.conf SAMPLE_PERIOD=0.2 PROCESS_ACCOUNTING="no" BOOTLOG_DEST=/var/log/bootchart.tgz AUTO_STOP_LOGGER="no" AUTO_RENDER="no" AUTO_RENDER_FORMAT="png" AUTO_RENDER_DIR="/var/log" LOG_DIR="/tmp/bootchart" # Start the boot logger. start() { mkdir -p $LOG_DIR cd "$LOG_DIR" touch "$BOOTLOG_LOCK" /sbin/bootlogger "cat /proc/stat" /tmp/bootchart/proc_stat.log & /sbin/bootlogger "cat /proc/diskstats" /tmp/bootchart/proc_diskstats.log & /sbin/bootlogger "cat /proc/*/stat" /tmp/bootchart/proc_ps.log & /sbin/bootlogger "cat /proc/net/dev" /tmp/bootchart/proc_netdev.log & } # Stop the boot logger. The lock file is removed to force the loggers in # background to exit. Some final log files are created and then all log files # from the tmpfs are packaged and stored in $BOOTLOG_DEST. stop() { if [ ! -f "$BOOTLOG_LOCK" ]; then echo "${0##*/} not running" return fi # Prevent concurrent stop() calls rm -f "$BOOTLOG_LOCK" /bin/sleep $SAMPLE_PERIOD /bin/sleep $SAMPLE_PERIOD cd "$LOG_DIR" # Write system information log_header } # Log some basic information about the system. log_header() { ( echo "version = $VERSION" echo "title = TCOS Boot chart for $( hostname | sed q ) ($( date ))" echo "system.uname = $( uname -srvm | sed q ) TCOS version:"$(grep ^TCOS_VERSION /conf/tcos.conf| awk -F "=" '{print $2}' |sed s/'"'//g) if [ -f /etc/gentoo-release ]; then echo "system.release = $( sed q /etc/gentoo-release )" elif [ -f /etc/SuSE-release ]; then echo "system.release = $( sed q /etc/SuSE-release )" elif [ -f /etc/debian_version ]; then echo "system.release = Debian GNU/$( uname -s ) $( cat /etc/debian_version )" elif [ -f /etc/frugalware-release ]; then echo "system.release = $( sed q /etc/frugalware-release )" elif [ -f /etc/pardus-release ]; then echo "system.release = $( sed q /etc/pardus-release )" else echo "system.release = $( sed 's/\\.//g;q' /etc/issue )" fi # Get CPU count local cpucount=$(grep -c '^processor' /proc/cpuinfo) if [ $cpucount -gt 1 -a -n "$(grep 'sibling.*2' /proc/cpuinfo)" ]; then # Hyper-Threading enabled cpucount=$(( $cpucount / 2 )) fi if grep -q '^model name' /proc/cpuinfo; then echo "system.cpu = $( grep '^model name' /proc/cpuinfo | sed q )"\ "($cpucount)" else echo "system.cpu = $( grep '^cpu' /proc/cpuinfo | sed q )"\ "($cpucount)" fi echo "system.kernel.options = $( sed q /proc/cmdline )" ) >> /tmp/bootchart/header } case "$1" in "start") start ;; "stop") sleep 2 stop killall bootlogger 2>/dev/null ;; *) echo "Usage: $0 {start|stop}" ;; esac tcos-0.89.93ubuntu2/bin/seq0000775000000000000000000000271312260610261012356 0ustar #!/bin/sh # # This file is part of TCOS # # (emulate /bin/seq with a shell script) # # Copyright (C) 2006-2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # MAX=$1 NUM=1 INC=1 if [ "$MAX" = "" ]; then echo "TCOS seq number generator" echo "" echo "Print numbers from FIRST to LAST, in steps of INCREMENT." echo "Usage: seq LAST" echo " or: seq FIRST LAST" echo " or: seq FIRST INCREMENT LAST" exit 1 fi if [ $# = 1 ]; then MAX=$1 elif [ $# = 2 ]; then NUM=$1 MAX=$2 elif [ $# = 3 ]; then NUM=$1 INC=$2 MAX=$3 fi if [ $MAX -gt 100 ] || [ $MAX -lt 1 ]; then echo "ERROR: Max number must be in 1-100" exit 1 fi if [ $INC -lt 1 ] ; then echo "ERROR: Increment must be big than 1" exit 1 fi while [ $NUM -le $MAX ]; do echo $NUM NUM=$((NUM +INC)) done tcos-0.89.93ubuntu2/bin/installer.sh0000664000000000000000000002176712260610261014203 0ustar #!/bin/sh # Copyright (C) 2006-2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # if [ ! -f /conf/tcos.conf ]; then echo "ERROR" echo " This script must be exec in thin client " echo " not standalone or server" exit 1 fi . /conf/tcos.conf . /scripts/functions . /conf/tcos-run-functions # size of vfat partition vfat_size=100 HDD=/dev/hda HDD1=/dev/hda1 HDD2=/dev/hda2 # get_hdd for dev in $(ls /dev/[sh]d[a-z]); do devname=$(basename $dev) if [ "$(cat /sys/block/$devname/removable)" != "1" ]; then HDD=$dev HDD1=${dev}1 HDD2=${dev}2 break fi done if [ "$HDD" = "" ] || [ ! -e "$HDD" ]; then echo "No hdd found" exit 1 fi FDISK=/sbin/fdisk INSTALL_MBR=/sbin/install-mbr # translatable strings MSG_TITLE="TCOS hdd installer" MSG_WELCOME="Welcome to TCOS hdd installer.\nDo you want to install TCOS in thin client hdd?" MSG_CANCEL="Cancelled, exiting now..." MSG_NOHDD="Not hard disk detected. Check if TCOS_DISABLE_IDE is set in tcos.conf." MSG_HDD_DETECTED="Detected partitions:\n\n" MSG_DELETE_ALL_DISK="Do you want to delete entire first hard disk?\n\nThis installer will create 2 parts:\n* $HDD1 vfat with kernel\n* $HDD2 swap (hdd memory)\nRECOMENDED: yes" MSG_NOPARTIIONS="No partitions detected, please rerun installer.sh and select all disk." EXIT () { # fixme clean umount and do some things here exit $1 } MSG () { whiptail --title "$MSG_TITLE" "$@" 12 80 } LIST () { whiptail --title "$MSG_TITLE" "$@" 20 80 } umount_all () { log_begin_msg "Umounting all parts in $HDD" data=$(grep ^$HDD /proc/mounts | awk '{print $1}') for part in $data; do umount -l $part > /dev/null 2>&1 done swaps=$(grep ^$HDD /proc/swaps | awk '{print $1}') for part in $swaps; do swapoff $part > /dev/null 2>&1 done log_end_msg $? } mount_swap () { log_begin_msg "Mount swap $HDD2" swapon $HDD2 > /dev/null 2>&1 log_end_msg $? } make_all_parts () { umount_all # $HDD total size (in MB) total_size=$(LANG=C $FDISK -l $HDD|grep ^Disk|head -1 | awk '{print int($5/1000000)}') # swap (in MB) = Total_RAM (kB) * 2 / 1000 swap_size=$(awk '/MemTotal/ {print int($2*2/1000)}' /proc/meminfo) # $HDD1 hdd size (in MB) = total - swap - 10 vfat_size=$(echo $total_size $swap_size 10 | awk '{print int($1-$2-$3)}') # clean MBR log_begin_msg "Cleaning MBR of $HDD" busybox dd if=/dev/zero of=$HDD bs=512 count=1 >/dev/null 2>&1 $INSTALL_MBR --force $HDD log_end_msg $? log_begin_msg "Making 2 partitions in $HDD" # call fdisk $FDISK $HDD << EOF 2>/dev/null >/dev/null o n p 1 1 +${vfat_size}M n p 2 +${swap_size}M t 1 b t 2 82 a 1 w EOF log_end_msg $? # format parts log_begin_msg "Format $HDD1 as vfat (${vfat_size}M)" mkfs.vfat $HDD1 >/dev/null 2>&1 log_end_msg $? log_begin_msg "Format $HDD2 as swap (${swap_size}M)" mkswap $HDD2 >/dev/null 2>&1 log_end_msg $? mount_swap } install_kernel () { # mount $HDD1 mkdir -p /target mount -tvfat $HDD1 /target > /dev/null 2>&1 if [ $(grep -c $HDD1 /proc/mounts) -lt 1 ]; then echo "" echo " ERROR: Can't mount $HDD1 in /target" echo "" exit 1 fi NET_INSTALL=1 # check if we are booting from cdrom if [ $(grep -c initrd.cdrom /proc/cmdline ) -gt 0 ]; then # instalation from cdrom cdroms=$(awk '/iso9660/ {print $1}' /etc/fstab) mkdir /cdrom for cdrom in $cdroms; do mount $cdrom /cdrom 2>/dev/null echo "Waiting for cdrom ${cdrom}..." sleep 5 if [ $(grep -c "/cdrom" /proc/mounts) -gt 0 ]; then if [ ! -d /cdrom/isolinux ]; then echo "ERROR: $cdrom don't have isolinux" else NET_INSTALL=0 #echo "$cdrom have isolinux" break fi fi done if [ -d /cdrom/isolinux ]; then log_begin_msg "Copying isolinux files to $HDD1" cp /cdrom/isolinux/vmlinuz /target/vmlinuz cp /cdrom/isolinux/initrd.cdrom /target/initrd.gz cp /cdrom/isolinux/tcos.msg /target/tcos.msg cp /cdrom/isolinux/help.msg /target/help.msg cp /cdrom/isolinux/help2.msg /target/help2.msg cp /cdrom/isolinux/logo.lss /target/logo.lss log_end_msg $? THEME=" DISPLAY tcos.msg F0 tcos.msg F1 help.msg F2 help2.msg " else echo "Not medium found, using network install" NET_INSTALL=1 fi fi if [ $NET_INSTALL = 1 ]; then log_begin_msg "Downloading kernel" download_file /tcos/vmlinuz-$(uname -r) /target/vmlinuz > /dev/null log_end_msg $? log_begin_msg "Downloading initramfs" download_file /tcos/initramfs-$(uname -r) /target/initrd.gz > /dev/null download_file /tcos/initramfs-$(uname -r)-nfs /target/initrd.nfs > /dev/null log_end_msg $? log_begin_msg "Downloading usr.squashfs" download_file /tcos/usr-$(uname -r).squashfs /target/usr.squashfs > /dev/null log_end_msg $? log_begin_msg "Downloading startup logos and help" download_file /tcos/tcos.msg /target/tcos.msg download_file /tcos/help.msg /target/help.msg download_file /tcos/help2.msg /target/help2.msg download_file /tcos/logo.lss /target/logo.lss THEME=" DISPLAY tcos.msg F0 tcos.msg F1 help.msg F2 help2.msg " log_end_msg $? fi # check for min ram memory=$(awk '/^MemTotal/ {print int($2/1000)}' /proc/meminfo) if [ $memory -lt $TCOS_MIN_RAM ]; then log_begin_msg "Using NFS boot images ($TCOS_MIN_RAM Mb RAM)" DEFAULT="nfs" log_end_msg $? else log_begin_msg "Using TFTP boot images" DEFAULT="tcos" log_end_msg $? fi log_begin_msg "Installing syslinux" [ -f /usr/lib/syslinux/mbr.bin ] && cat /usr/lib/syslinux/mbr.bin > $HDD syslinux $HDD1 cat << EOF > /target/syslinux.cfg DEFAULT $DEFAULT TIMEOUT 50 $THEME PROMPT 1 LABEL tcos KERNEL vmlinuz APPEND ramdisk_size=65536 initrd=initrd.gz root=/dev/ram0 BOOT=tcos ${TCOS_INSTALLER_BOOT_OPT} LABEL update KERNEL vmlinuz APPEND ramdisk_size=65536 initrd=initrd.gz root=/dev/ram0 BOOT=tcos ${TCOS_INSTALLER_BOOT_OPT} startx=N installer-update LABEL nfs KERNEL vmlinuz APPEND ramdisk_size=32768 initrd=initrd.nfs root=/dev/ram0 BOOT=tcos ${TCOS_INSTALLER_BOOT_OPT} LABEL nfsupdate KERNEL vmlinuz APPEND ramdisk_size=32768 initrd=initrd.nfs root=/dev/ram0 BOOT=tcos ${TCOS_INSTALLER_BOOT_OPT} startx=N installer-update # syslinux.cfg generated by tcos installer on $(date) EOF log_end_msg $? # umount vfat partition sync umount /target } format_part () { #$1 is partition mkfs.ext3 "$1" } # update local files if "--update" is passed if [ "$1" = "--update" ]; then log_begin_msg "Updating installed system" log_end_msg $? install_kernel exit 0 fi # install without questions if "--oeminstall" is passed if [ "$1" = "--oeminstall" ]; then log_begin_msg "Unattended INSTALL" log_end_msg $? make_all_parts install_kernel exit 0 fi # welcome message MSG --defaultno --yesno "$MSG_WELCOME" 10 80 if [ $? != 0 ]; then MSG --msgbox "$MSG_CANCELLED" EXIT 1 fi # ask for delete all disk MSG --defaultno --yesno "$MSG_DELETE_ALL_DISK" if [ $? != 0 ]; then TCOS_TYPE="one" else TCOS_TYPE="entire" fi if [ "$TCOS_TYPE" = "one" ]; then MSG --defaultno --yesno "This part isn't done yet, exit now..." exit 1 parts=$(cat /proc/partitions | awk '{print $4}'| grep "^[hs]d[a-z][0-9]") num_parts=$(cat /proc/partitions | awk '{print $4}'| grep -c "^[hs]d[a-z][0-9]") if [ "$num_parts" = "0" ]; then MSG --msgbox "$MSG_NOPARTIIONS" EXIT 1 fi # show partitions parts_types=$($FDISK -l |grep ^/dev | awk '{ if ($2 == "*") {print $1":"$7}; if ($2 != "*") {print $1":"$6" "$7}; }') LIST --msgbox "$MSG_HDD_DETECTED${parts_types}" parts="" for part in $parts_types; do device=$(echo $part | awk -F ":" '{print $1}' | awk -F "/" '{print $3}') type=$(echo $part | awk -F ":" '{print $2}') parts="$parts $device $type" done #echo $parts whiptail --title "$TITLE" --menu "Select part:" 20 80 5 $parts 2> /tmp/tcos_selected_part selected_part=$(cat /tmp/tcos_selected_part) && rm /tmp/tcos_selected_part # ask for format MSG --defaultno --yesno "Do you want to format $selected_part?" if [ $? != 0 ]; then MSG --msgbox "$MSG_CANCELLED" EXIT 1 else format_part /dev/$selected_part fi else make_all_parts install_kernel fi tcos-0.89.93ubuntu2/bin/get_filesystem0000775000000000000000000001031612260610261014607 0ustar #!/bin/sh # Copyright (C) 2006-2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # DEVICE=$1 FSTYPE="unknow" NTFS_mode="ntfs" [ -x /sbin/mount.ntfs-3g ] && NTFS_mode="ntfs-3g" KLIBC_FSTYPE=/usr/lib/klibc/bin/fstype [ -x /bin/fstype ] && KLIBC_FSTYPE=/bin/fstype [ ! -x $KLIBC_FSTYPE ] && KLIBC_FSTYPE=/bin/not_found UDEVINFO="/usr/bin/udevinfo" [ -e /sbin/udevadm ] && UDEVINFO="/sbin/udevadm info" ONLY_FS=0 if [ "$2" = "--only" ]; then ONLY_FS=1 fi echo_fs() { if [ "$ONLY_FS" = "0" ]; then echo "$DEVICE $1" else echo "$1" fi } if [ "$DEVICE" = "" ]; then echo "error, need device" exit 1 fi # 1.- Try with udev utils vol_id or blkid if [ -x /lib/udev/vol_id ]; then FSTYPE=$(/lib/udev/vol_id -t $DEVICE 2>&1) elif [ -x /usr/bin/blkid ]; then FSTYPE=$(/usr/bin/blkid -o udev $DEVICE 2>&1| awk -F"=" '/ID_FS_TYPE=/ {print $2}') elif [ -x /sbin/blkid ]; then FSTYPE=$(/sbin/blkid -o udev $DEVICE 2>&1| awk -F"=" '/ID_FS_TYPE=/ {print $2}') else FSTYPE="" fi case $FSTYPE in *unknow*) FSTYPE="unknow" ;; *error*volume*) FSTYPE="error" ;; *ntfs*) FSTYPE=$NTFS_mode ;; *NTFS*) FSTYPE=$NTFS_mode ;; esac if [ "$FSTYPE" != "" ] && [ "$FSTYPE" != "unknow" ] && [ "$FSTYPE" != "error" ] ; then echo_fs "$FSTYPE" exit 0 fi # 2.- Try with udevinfo DPATH=$(find /sys/devices -name $(echo $DEVICE | awk -F"/" '{print $NF}')| awk -F"/block" '{print "/block"$2}') if [ "$DPATH" != "" ]; then FSTYPE=$($UDEVINFO --query=env --path=$DPATH 2>/dev/null| awk -F'=' '/^ID_FS_TYPE/ {print $2}') else FSTYPE="" fi case $FSTYPE in *unknow*) FSTYPE="unknow" ;; *error*volume*) FSTYPE="error" ;; *ntfs*) FSTYPE=$NTFS_mode ;; *NTFS*) FSTYPE=$NTFS_mode ;; esac if [ "$FSTYPE" != "" ] && [ "$FSTYPE" != "unknow" ] && [ "$FSTYPE" != "error" ] ; then echo_fs "$FSTYPE" exit 0 fi # 3.- Try with fstype if [ -x $KLIBC_FSTYPE ]; then FSTYPE=$($KLIBC_FSTYPE $DEVICE 2>&1 | awk -F "=" '/^FSTYPE/ {print $2}') case $FSTYPE in *unknow*) FSTYPE="unknow" ;; *ntfs*) FSTYPE=$NTFS_mode ;; *NTFS*) FSTYPE=$NTFS_mode ;; esac if [ "$FSTYPE" != "" ] && [ "$FSTYPE" != "unknow" ] && [ "$FSTYPE" != "error" ] ; then echo_fs "$FSTYPE" exit 0 fi fi # 4.- Try with disktype # type=$(disktype $DEVICE 2>/dev/null | grep "file system") # case "$type" in # *ReiserFS*) # FSTYPE="reiserfs" # ;; # *XFS*) # FSTYPE="xfs" # ;; # *Ext3*) # FSTYPE="ext3" # ;; # *Ext2*) # FSTYPE="ext2" # ;; # *HFS*) # FSTYPE="hfs" # ;; # *NTFS*) # FSTYPE=$NTFS_mode # ;; # *FAT16*) # FSTYPE="vfat" # ;; # *FAT*) # FSTYPE="vfat" # ;; # *) # FSTYPE="unknow" # ;; #esac #if [ "$FSTYPE" != "" ] && [ "$FSTYPE" != "unknow" ] && [ "$FSTYPE" != "error" ] ; then # echo_fs "$FSTYPE" # exit 0 #fi # 3.- Try with fdisk line=$(/sbin/fdisk -l |grep $1 | sed s/*/XX/g) if [ "$(echo ${line} | awk '{print $2}')" = "XX" ] ; then type=$(echo ${line}| awk '{print $6}') else type=$(echo ${line}| awk '{print $5}') fi case "$type" in *83*) FSTYPE="ext3" ;; 82) FSTYPE="swap" ;; b) FSTYPE="vfat" ;; c) FSTYPE="vfat" ;; e) FSTYPE="vfat" ;; f) FSTYPE="extended" ;; 5) FSTYPE="extended" ;; 7) FSTYPE="$NTFS_mode" ;; *) FSTYPE="auto" ;; esac if [ "$FSTYPE" != "" ] && [ "$FSTYPE" != "unknow" ] && [ "$FSTYPE" != "error" ] ; then echo_fs "$FSTYPE" exit 0 fi exit 1 tcos-0.89.93ubuntu2/bin/daemonize.sh0000775000000000000000000000164212260610261014152 0ustar #!/bin/sh # Copyright (C) 2006-2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # cmd=$1 if [ ! -e $cmd ]; then cmd=$(which $1) fi args=$(echo $@ | sed "s|$1||g") /sbin/start-stop-daemon --quiet --background --start --exec $cmd -- $args tcos-0.89.93ubuntu2/bin/tcos-genbootchart0000664000000000000000000000276012260610261015212 0ustar #!/bin/sh # Copyright (C) 2006-2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # HOST=$1 if [ "$HOST" = "" ]; then HOST=$(echo $DISPLAY | awk -F":" '{print $1}') fi if [ ! -x /usr/bin/bootchart ]; then echo "ERROR:" echo "" echo " Please install bootchart-view package" exit 1 fi OUT=$(pwd) TGZ=$HOME/tcos-genbootchart/bootchart.tgz mkdir -p $HOME/tcos-genbootchart/mnt _exit() { fusermount -u $HOME/tcos-genbootchart/mnt rm -rf $HOME/tcos-genbootchart exit $1 } ltspfs ${HOST}:/tmp $HOME/tcos-genbootchart/mnt if [ $? -gt 0 ]; then echo "Error mounting remote LTSPFS" _exit 1 fi if [ ! -d $HOME/tcos-genbootchart/mnt/bootchart ]; then echo "/tmp/bootchart not found on remote host" _exit 1 fi ( cd $HOME/tcos-genbootchart/mnt/bootchart && tar -czf ${TGZ} *) bootchart ${TGZ} -o ${OUT} _exit 0 tcos-0.89.93ubuntu2/bin/clean_string.sh0000664000000000000000000000245012260610261014642 0ustar #!/bin/bash # # Replace accents and other stuff # (break xmlrpc and xml.sax parser) # # Copyright (C) 2006-2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # while IFS= read -t 1 -r INPUT do echo $INPUT | sed \ -e 's/á/a/g' -e 's/Á/A/g' -e 's/à/a/g' -e 's/À/A/g' -e 's/ä/a/g' \ -e 's/é/e/g' -e 's/É/E/g' -e 's/è/e/g' -e 's/È/E/g' -e 's/ë/e/g' \ -e 's/í/i/g' -e 's/Í/I/g' -e 's/ì/i/g' -e 's/Ì/I/g' -e 's/ï/i/g' \ -e 's/ó/o/g' -e 's/Ó/O/g' -e 's/ò/o/g' -e 's/Ò/O/g' -e 's/ö/o/g' \ -e 's/ú/u/g' -e 's/Ú/U/g' -e 's/ù/u/g' -e 's/Ù/U/g' -e 's/ü/u/g'\ -e 's/ñ/n/g' -e 's/Ñ/N/g' done tcos-0.89.93ubuntu2/bin/down-controller0000664000000000000000000000211312260610261014705 0ustar #!/bin/sh # ------- # File: down-controller # Description: controle timout in reboot/poweroff actions # Author: Ignacio Vidal # # Copyright (C) 2006-2011 mariodebian at gmail # Copyright (C) 2006-2011 Ignacio Vidal # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # sleep $2 case $1 in poweroff) $(which poweroff) ;; reboot) $(which reboot) ;; esac tcos-0.89.93ubuntu2/bin/tryXorg.sh0000664000000000000000000000570712260610261013660 0ustar #!/bin/sh # Copyright (C) 2006,2007,2008 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # . /conf/tcos.conf # try to launch Xorg or return error MAX_XORG_RETRY=3 XORG_FORCE_AUTO=0 export XAUTHORITY=/root/.Xauthority export HOME=/root export DISPLAY=:0 run_scripts() { [ ! -d $1 ] && return for src in $1/*; do [ -f $src ] && . $src done } for x in "$@"; do case $x in --server=*) SERVER=${x#--server=} ;; --fontserver=*) FONT_SERVER=${x#--fontserver=} ;; --xorgopts=*) TCOS_XORG_OPTS=${x#--xorgopts=} ;; esac done counter=1 while [ $counter -le $MAX_XORG_RETRY ]; do run_scripts /etc/X11/PreRun # start Xorg at vt7 to avoid getty keyboard conflicts Xorg vt7 ${TCOS_XORG_OPTS} > /dev/null 2>&1 counter=$((counter+1)) [ -f /var/log/Xorg.0.log ] && mv /var/log/Xorg.0.log /var/log/Xorg.log.fail.${counter} done # try to autoconfigure Xorg new_xorg=$(Xorg -configure 2>&1|awk '/Your xorg.conf/ {print $5}') if [ "${FONT_SERVER}" = "" ]; then FONT_SERVER=${SERVER} fi if [ "TCOS_ENABLE_FONT_SERVER" = "1" ]; then # add font server sed "/modules/i\ \ FontPath \"tcp/${FONT_SERVER}:7100\"\ \ FontPath \"tcp/${FONT_SERVER}:7101\"\ " $new_xorg > /etc/X11/xorg.conf.auto fi # disable HAL sed "/ServerLayout/a\ Option \"AutoAddDevices\" \"off\" \ " /etc/X11/xorg.conf.auto > /etc/X11/xorg.conf.auto.new mv /etc/X11/xorg.conf.auto.new /etc/X11/xorg.conf.auto # change keyboard map sed -i "/kbd/i\ \ Option \"XkbRules\" \"xorg\"\ " /etc/X11/xorg.conf.auto sed -i "/kbd/i\ \ Option \"XkbModel\" \"${TCOS_XORG_XKBMODEL}\"\ " /etc/X11/xorg.conf.auto sed -i "/kbd/i\ \ Option \"XkbLayout\" \"${TCOS_XORG_XKB}\"\ " /etc/X11/xorg.conf.auto XORG_FORCE_AUTO=1 run_scripts /etc/X11/PreRun # start Xorg at vt7 to avoid getty keyboard conflicts Xorg vt7 -config /etc/X11/xorg.conf.auto ${TCOS_XORG_OPTS} > /dev/null 2>&1 cat /dev/null > /dev/tty1 chvt 1 cat << EOF > /dev/tty1 Error launching Xorg, check /var/log/Xorg.0.log for errors These are the lasts lines of Xorg.0.log EOF tail /var/log/Xorg.0.log > /dev/tty1 echo "---------------------------------------------------" > /dev/tty1 grep EE /var/log/Xorg.0.log > /dev/tty1 exit 1 tcos-0.89.93ubuntu2/bin/set-limits0000664000000000000000000000244612260610261013660 0ustar # Copyright (C) 2006-2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # not set shell this script may be sourced . /conf/tcos.conf # limit ram if [ "$TCOS_MAX_MEM" = "" ]; then TCOS_MAX_MEM=95 fi if [ "$TCOS_MAX_MEM" != "0" ]; then MEM=0 for size in $(grep -e Inactive -e SwapFree /proc/meminfo | awk '{print $2}'); do MEM=$(($MEM+$size)) done MAX_MEM=$(($MEM*$TCOS_MAX_MEM/100)) echo "set limit in $0 to $MAX_MEM Kb" >> /tmp/initramfs.debug ulimit -m $MAX_MEM >> /tmp/initramfs.debug 2>&1 ulimit -v $MAX_MEM >> /tmp/initramfs.debug 2>&1 else echo "unlimited memory in $0" >> /tmp/initramfs.debug fi tcos-0.89.93ubuntu2/bin/tcos-buildchroot.10000664000000000000000000000377512260610261015217 0ustar .TH tcos-buildchroot 1 "Sep 21, 2007" "tcos-buildchroot man page" .SH NAME tcos-buildchroot \- TCOS tool to create and manage a TCOS chroot. .SH SYNOPSYS \fBtcos-buildchroot\fP [options] action .SH DESCRIPTION .PP \fBtcos-buildchroot\fP is a shell script that create, and update a chroot (usesfull to build 32bit chroot in 64bit server) .SH ACTIONS .B --create Create chroot and install tcos packages and default kernel version. .B --update Chroot into and exec "apt\-get update && apt\-get \-y upgrade" .B --install=package1,package2 Chroot into and install packages listed (separated by comas) .B --update-images Chroot and call "gentcos \-tftp" .B --help Some usage help about tcos\-buildchroot .SH OPTIONS .B --arch=i386 Build a chroot of this architecture (see man cdebootstrap) .B --flavour=standard Install a selection of packages (see man cdebootstrap) .B --version=etch Set Debian/Ubuntu codename of chroot. (NOTE Debian unstable sometimes don\'t work) .B --forcedistro=ubuntu Set DISTRIBUTION (debian or ubuntu) .B --dir=/var/lib/tcos/chroot Set path where chroot is builded. .B --mirror=http://ftp.debian.org/debian Set an alternate mirror to download packages. .B --tcosmirror=http://www.tcosproject.org Set an alternate TCOS mirror to download packages. .B --kversion=2.6.18-5-486 Set kernel version (recomended use default of TCOS in every Debian/Ubuntu codename) .B --gentcos="-tftp " Set gentcos cmdline options (use double " ) .SH EXAMPLES .B Build chroot: tcos-buildchroot \-\-create \-\-arch=386 \-\-dir=/var/lib/tcos/chroot \-\-kversion=2.6.18-5-486 \-\-mirror=http://ftp.uk.debian.org/debian .B Update chroot: tcos-buildchroot \-\-update \-\-dir=/var/lib/tcos/chroot .B Generate TCOS images: tcos-buildchroot \-\-update-images \-\-dir=/var/lib/tcos/chroot .SH BUGS Contact Mario Izquierdo Info about TCOS project: http://www.tcosproject.org .SH SEE ALSO gentcos(1) .SH AUTHOR Mario Izquierdo (mariodebian) tcos-0.89.93ubuntu2/bin/cd_type0000775000000000000000000000167312260610261013221 0ustar #!/bin/sh # Copyright (C) 2006-2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # CDROM=$1 CDPARANOIA=/usr/bin/cdparanoia type=$($CDPARANOIA -d "$CDROM" -Q 2>&1 |grep ^Table |grep -c audio) if [ "$type" != 0 ]; then echo "cdfs" exit 0 fi echo "iso9660" exit 0 tcos-0.89.93ubuntu2/bin/clear-logs0000775000000000000000000000220512260610261013612 0ustar #!/bin/sh # timer to clean some big logs # # Copyright (C) 2006-2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # empty file if size is more than 52 Kb MAX_SIZE=52 while [ 1 ]; do for file in $(find /var/log/ -type f); do size=$(du -a $file| awk '{print $1}') if [ $size -gt $MAX_SIZE ]; then logger "clear-logs $file have BIG size $size Kb, empty it" last_line=$(tail -1 $file) echo $last_line > $file fi done sleep 60 done tcos-0.89.93ubuntu2/bin/get_vga_vendor0000664000000000000000000000305712260610261014556 0ustar #!/bin/sh # Copyright (C) 2006-2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # if [ -f /tmp/vga_vendor ]; then VENDOR=$(awk -F":" '{print $1}' /tmp/vga_vendor) MODEL=$(awk -F":" '{print $2}' /tmp/vga_vendor) else #return /sys/bus/pci/devices/0000:06:05.0/class:0x030000 VGA_DEVPATH=$(grep 0x030000 /sys/bus/pci/devices/*/class | awk -F"/class" '{print $1}') VENDOR=$(cat $VGA_DEVPATH/vendor | sed -e 's|0x||' | tr [a-z] [A-Z]) MODEL=$(cat $VGA_DEVPATH/device | sed -e 's|0x||' | tr [a-z] [A-Z]) #VENDOR=$(lspci -nn| grep VGA | grep -E -o '[0-9a-z]{4}\:[0-9a-z]{4}' | tr [a-z] [A-Z] | awk -F":" '{print $1}') echo "${VENDOR}:${MODEL}" > /tmp/vga_vendor fi if [ "$1" = "vendormodel" ]; then echo "${VENDOR}:${MODEL}" exit 0 fi if [ "$1" != "" ]; then if [ "$(echo $1| tr [a-z] [A-Z])" = "$VENDOR" ]; then echo "1" else echo "0" fi exit 0 fi echo $VENDOR tcos-0.89.93ubuntu2/bin/gentcos.10000664000000000000000000000554412260610261013371 0ustar .\"Created with GNOME Manpages Editor Wizard .\"http://gmanedit.sourceforge.net .\"Sergio Rua .\" .TH gentcos 1 "Feb 03, 2007" "gentcos man page" .SH NAME gentcos \- TCOS image boot generator .SH SYNOPSIS .B gentcos .RI [ options ] .br .SH DESCRIPTION This manpage show options for .B gentcos boot image generator. See gentcos \-h to better descriptions. .B You must exec this app as root user. .PP \fBgentcos\fP is a shell script that create a TCOS initramfs and optionally a iso image to boot from it. .SH OPTIONS .B .IP \-h .IP \-help Show extended usage about gentcos .B .IP \-suffix=foo Suffix used to filenames (default empy) .B .IP \-vmlinuz=2.6.16-1-486 Kernel version used to create initramfs .B .IP \-size Print size of uncompressed initramfs ram disk .B .IP \-allmodules Generate allmodules.squashfs and copy to /var/lib/tcos/tftp Then thin client must start with allmodules cmdline to download it .SH BOOT METHODS .PP .B PXE like method .B .IP \-tftp Create initramfs-x.x.x (and usr-x.x.x.squashfs) and copy to /var/lib/tcos/tftp \-o=initramfs-pc1 output filename (in /var/lib/tcos/tftp) .PP .B NFS (LTSP like) method .B .IP \-nfs Create initramfs-x.x.x-nfs and copy to /var/lib/tcos/tftp .B .IP \-rootfs Creates an complete TCOS and uncompress in /var/lib/tcos/fs-x.x.x NOTE: Need a NFS server (apt-get install nfs-kernel-server) and this line in /etc/exports: .B /var/lib/tcos 192.168.0.0/255.255.255.0 (ro,no_root_squash,sync,no_subtree_check) (change network data with yours) .PP .B Floppy boot method .B .IP \-nbi Create initramfs (and usr.squashfs) an join with kernel in a nbi file then copy to /var/lib/tcos/tftp .IP \-nbi-output=linux-pc1.nbi output filename (in /var/lib/tcos/tftp) .PP .B CDROM method .B .IP \-cdrom Create initramfs and create a bootable iso based on isolunux Iso image is saved in /var/lib/tcos/isos/ .SH EXAMPLES .B PXE like boot (>=64 MB) # gentcos \-tftp \-suffix=\-pc1 .B NFS (LTSP like) boot (28-64 MB) # gentcos \-nfs \-rootfs .B CDROM boot # gentcos \-cdrom .B Floppy boot # gentcos \-nbi \-extra-append="vga=791 uselocal" .SH Package cache Sometimes TCOS need some software that conflicts with installed packages. To solve this, gentcos can download and extract package files in /var/cache/tcos/packages/pkg_name to copy files to initramfs. .PP .B Howto install a cached package .B .IP \-instpkg\ foo Exec .B apt-get install --print-uris -y -f foo get the package URI and uncompress it into /var/cache/tcos/packages/foo .PP .B Remove one or more packages .B .IP \-rmpkg\ foo Remove foo package. .PP .B List installed packages .B .IP \-listpkg Show all packages installed. .SH BUGS Contact Mario Izquierdo Info about TCOS project: http://www.tcosproject.org .SH SEE ALSO tcos.conf(5) .SH AUTHOR Mario Izquierdo (mariodebian) tcos-0.89.93ubuntu2/bin/tcos-buildchroot0000775000000000000000000004262312260610261015056 0ustar #!/bin/bash # # tcos-buildchroot This script creates a chroot to build TCOS 32bits images # # Copyright (C) 2006-2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # if [ $(id -u) != 0 ]; then echo "Error: need to exec as root user" >&2 exit 1 fi . /etc/tcos/tcos.conf [ -e /var/lib/tcos/version.conf ] && . /var/lib/tcos/version.conf . ${TCOS_DIR}/tcos-generation-functions.sh for tpl in $(tcos_get_templates); do . $tpl done # load forced settings for derivatives if [ -d /etc/tcos/conf.d/ ]; then for file in /etc/tcos/conf.d/tcos*conf; do [ -e $file ] && . $file done fi export LC_ALL=C export LC_MESSAGES=C export DEBCONF_FRONTEND="noninteractive" export DEBIAN_FRONTEND="noninteractive" # default settings TCOS_ARCH=i386 TCOS_FLAVOUR=standard #TCOS_MIRROR="http://www.tcosproject.org" TCOS_MIRROR= TCOS_PACKAGES="initramfs-tools-tcos p910nd fgetty" TCOS_PACKAGES="${TCOS_PACKAGES} binutils acpid alsa-utils twm dropbear mbr file" TCOS_PACKAGES="${TCOS_PACKAGES} rdesktop pulseaudio pulseaudio-module-x11" TCOS_PACKAGES="${TCOS_PACKAGES} pulseaudio-utils pulseaudio-esound-compat libasound2-plugins" TCOS_PACKAGES="${TCOS_PACKAGES} dbus dbus-x11 avahi-daemon" DISTRO_PACKAGES="xserver-xorg xutils xfonts-base xfonts-100dpi libgl1-mesa-dri libgl1-mesa-glx libglu1-mesa mtools xterm wget dosfstools" DISTRO_PACKAGES="${DISTRO_PACKAGES} x11-utils debootstrap eject debconf syslinux squashfs-tools" DISTRO_PACKAGES="${DISTRO_PACKAGES} python python-dbus alsa-base xauth xserver-xorg-input-all xserver-xorg-input-mouse" # apt options (force-yes) APT_OPTS="-y --force-yes" ACTION= GENTCOS_OPTS="-tftp" MIRROR_EXTRAS="" TCOS_EXPERIMENTAL="" UBUNTU_DEF_MIRROR=http://archive.ubuntu.com/ubuntu/ UBUNTU_DEF_MIRROR2=http://security.ubuntu.com/ubuntu/ DEBIAN_DEF_MIRROR=http://ftp.de.debian.org/debian/ set_conf() { if [ "${DISTRIBUTION}" = "ubuntu" ]; then if [ ! $MIRROR ]; then MIRROR=$UBUNTU_DEF_MIRROR ; fi if [ ! $MIRROR2 ]; then MIRROR2=$UBUNTU_DEF_MIRROR2 ; fi MIRROR_EXTRAS="universe restricted multiverse" #DISTRO_PACKAGES="console-setup ${DISTRO_PACKAGES}" else if [ ! $MIRROR ]; then MIRROR=$DEBIAN_DEF_MIRROR ; fi #DISTRO_PACKAGES="console-data ${DISTRO_PACKAGES} libltdl3 " #DISTRO_PACKAGES="console-tools console-data ${DISTRO_PACKAGES}" fi } # load forced settings for derivatives if [ -d /etc/tcos/conf.d/ ]; then for file in /etc/tcos/conf.d/tcos*conf; do [ -e $file ] && . $file done fi usage() { cat << EOF tcos-buildchroot usage: Actions: --create (Create chroot) --update (Update chroot) --install=package1,package2 (Install some packages in chroot) --update-images (Update chroot TCOS images) Options: --arch=xxx (Set Architecture of chroot, default: $TCOS_ARCH) --flavour=xxx (Set flavour of chroot, default: $TCOS_FLAVOUR) --version=xxx (Set version of chroot, default: $TCOS_DISTRO) --forcedistro=xxx (Set distro of chroot, default: $DISTRIBUTION) --dir=xxx (Set dir of chroot, default: $TCOS_CHROOT) --tcos-exp (Enable experimental TCOS branch) EOF if [ "$DISTRIBUTION" = "ubuntu" ]; then cat << EOF --mirror=xxx (Set mirror of chroot, default: $UBUNTU_DEF_MIRROR) --securitymirror=xxx (Set security mirror of chroot, default: $UBUNTU_DEF_MIRROR2) EOF else cat << EOF --mirror=xxx (Set mirror of chroot, default: $DEBIAN_DEF_MIRROR) EOF fi cat << EOF --tcosmirror=xxx (Set mirror of TCOS, default: $TCOS_MIRROR) --kversion=xxx (Set kernel version of chroot, default: $TCOS_KERNEL) --gentcos="xxx" (Set gentcos cmdline options) EOF } createEmptyCMD() { cat << CMD > ${TCOS_CHROOT}/$1 #!/bin/sh #echo " * Fake $1 called: '\$@'" exit 0 CMD chmod +x ${TCOS_CHROOT}/$1 } chrootcreate() { mkdir -p ${TCOS_CHROOT} debootstrap --arch "${TCOS_ARCH}" ${TCOS_DISTRO} ${TCOS_CHROOT} ${MIRROR} if [ $? != 0 ]; then echo "Error running debootstrap." ; exit $?; fi # Add TCOS mirror [ "x${TCOS_MIRROR}" != "x" ] && echo "deb ${TCOS_MIRROR} ${TCOS_DISTRO} main ${TCOS_EXPERIMENTAL}" >> ${TCOS_CHROOT}/etc/apt/sources.list [ "x${TCOS_MIRROR}" != "x" ] && TCOS_PACKAGES="${TCOS_PACKAGES} tcos-keyring" # add extras (universe and multiverse repos) if [ "${MIRROR_EXTRAS}" != "" ]; then echo "deb ${MIRROR} ${TCOS_DISTRO} ${MIRROR_EXTRAS}" >> ${TCOS_CHROOT}/etc/apt/sources.list echo "deb ${MIRROR2} ${TCOS_DISTRO}-security main" >> ${TCOS_CHROOT}/etc/apt/sources.list echo "deb ${MIRROR} ${TCOS_DISTRO}-updates main ${MIRROR_EXTRAS}" >> ${TCOS_CHROOT}/etc/apt/sources.list fi # add extra source include in forced settings if [ ! -z ${MIRROR_EXTRA} ];then echo ${MIRROR_EXTRA} >> ${TCOS_CHROOT}/etc/apt/sources.list fi # add /etc/resolv.conf (some versions of cdebootstrap don't create it) cat /etc/resolv.conf > ${TCOS_CHROOT}/etc/resolv.conf # avoid to use a shell script in chroot chroot ${TCOS_CHROOT} dpkg-divert --package initramfs-tools-tcos \ --add --rename --quiet \ --divert /sbin/start-stop-daemon.original \ /sbin/start-stop-daemon chroot ${TCOS_CHROOT} dpkg-divert --package initramfs-tools-tcos \ --add --rename --quiet \ --divert /usr/sbin/invoke-rc.d.original \ /usr/sbin/invoke-rc.d # # avoid calling udevadm inside chroot # # http://bugs.debian.org/627790 # chroot ${TCOS_CHROOT} dpkg-divert --package initramfs-tools-tcos \ # --add --rename --quiet \ # --divert /sbin/udevadm.original \ # /sbin/udevadm # createEmptyCMD /sbin/udevadm cat << EOF > ${TCOS_CHROOT}/etc/apt/apt.conf APT::Install-Recommends "false"; APT::Install-Suggests "false"; EOF mount --bind /proc ${TCOS_CHROOT}/proc mount --bind /sys ${TCOS_CHROOT}/sys # preseed linux-image message cat << EOF > ${TCOS_CHROOT}/preseed linux-image-${TCOS_KERNEL} linux-image-${TCOS_KERNEL}/preinst/lilo-initrd-${TCOS_KERNEL} boolean false linux-image-${TCOS_KERNEL} linux-image-${TCOS_KERNEL}/preinst/bootloader-initrd-${TCOS_KERNEL} boolean false linux-image-${TCOS_KERNEL} linux-image-${TCOS_KERNEL}/postinst/create-kimage-link-${TCOS_KERNEL} boolean false linux-image-${TCOS_KERNEL} shared/kernel-image/really-run-bootloader boolean false console-common console-data/keymap/policy select Don't touch keymap console-data console-data/keymap/policy select Don't touch keymap console-setup console-setup/variant select USA console-setup console-setup/charmap select UTF-8 console-setup console-setup/layoutcode string us console-setup console-setup/compose select No compose key console-setup console-setup/fontsize-text select 16 console-setup console-setup/optionscode string console-setup console-setup/layout select USA console-setup console-setup/detect detect-keyboard console-setup console-setup/detected note console-setup console-setup/variantcode string console-setup console-setup/codesetcode string Uni1 console-setup console-setup/dont_ask_layout error console-setup console-setup/modelcode string pc105 console-setup console-setup/ask_detect boolean false console-setup console-setup/altgr select No AltGr key console-setup console-setup/ttys string /dev/tty[1-6] console-setup console-setup/model select Generic 105-key (Intl) PC console-setup console-setup/fontsize-fb select 16 console-setup console-setup/switch select No temporary switch console-setup console-setup/codeset select . Combined - Latin; Slavic Cyrillic; Hebrew; basic Arabic console-setup console-setup/toggle select No toggling console-setup console-setup/fontface select Fixed console-setup console-setup/fontsize string 16 dash dash/sh boolean false EOF createEmptyCMD /sbin/start-stop-daemon createEmptyCMD /usr/sbin/invoke-rc.d cat << EOC | chroot ${TCOS_CHROOT} apt-get $APT_OPTS update apt-get $APT_OPTS dist-upgrade grep "tcosproject" /etc/apt/sources.list && apt-get install $APT_OPTS tcos-keyring apt-get $APT_OPTS update apt-get install $APT_OPTS ${DISTRO_PACKAGES} apt-get clean debconf-set-selections /preseed rm -f /preseed apt-get $APT_OPTS upgrade apt-get $APT_OPTS remove --purge grub grub-pc EOC if [ "${DISTRIBUTION}" = "ubuntu" ]; then cat << EOC | chroot ${TCOS_CHROOT} apt-get install $APT_OPTS linux-image-${TCOS_KERNEL} apt-get install $APT_OPTS ${TCOS_PACKAGES} apt-get clean /etc/init.d/dropbear stop || true EOC ###################################### else # DISTRO != ubuntu cat << EOC | chroot ${TCOS_CHROOT} apt-get install $APT_OPTS linux-image-${TCOS_KERNEL} apt-get install $APT_OPTS ${TCOS_PACKAGES} apt-get clean /etc/init.d/dropbear stop || true rm -f /preseed EOC fi touch ${TCOS_CHROOT}/etc/tcos/chroot umount -l ${TCOS_CHROOT}/proc umount -l ${TCOS_CHROOT}/sys # remove udevadm diversion chrootexit } # end of chrootcreate() ############################################################################### chrootenter() { cat /etc/resolv.conf > ${TCOS_CHROOT}/etc/resolv.conf [ ! -e ${TCOS_CHROOT}/sbin/start-stop-daemon ] && createEmptyCMD /sbin/start-stop-daemon [ ! -e ${TCOS_CHROOT}/usr/sbin/invoke-rc.d ] && createEmptyCMD /usr/sbin/invoke-rc.d #if [ ! -e /sbin/udevadm.original ]; then # chroot ${TCOS_CHROOT} dpkg-divert --package initramfs-tools-tcos \ # --add --rename --quiet \ # --divert /sbin/udevadm.original \ # /sbin/udevadm # createEmptyCMD /sbin/udevadm #fi } chrootexit() { return #if [ -e ${TCOS_CHROOT}/sbin/udevadm.original ]; then # rm -f ${TCOS_CHROOT}/sbin/udevadm # chroot ${TCOS_CHROOT} dpkg-divert --package initramfs-tools-tcos \ # --remove --rename --quiet \ # --divert /sbin/udevadm.original \ # /sbin/udevadm #fi } chrootupdate() { chrootenter # copy console keymap if [ -e /etc/console/boottime.kmap.gz ]; then mkdir -p ${TCOS_CHROOT}/etc/console cp /etc/console/boottime.kmap.gz ${TCOS_CHROOT}/etc/console fi if [ -e /etc/console-setup/boottime.kmap.gz ]; then mkdir -p ${TCOS_CHROOT}/etc/console-setup cp /etc/console-setup/boottime.kmap.gz ${TCOS_CHROOT}/etc/console-setup/ fi if [ -e /etc/console-setup/cached*.kmap.gz ]; then mkdir -p ${TCOS_CHROOT}/etc/console-setup cp /etc/console-setup/cached*.kmap.gz ${TCOS_CHROOT}/etc/console-setup/ fi if [ -e /etc/console-setup/cached_UTF-8_del.kmap.gz ]; then mkdir -p ${TCOS_CHROOT}/etc/console-setup cp /etc/console-setup/cached_UTF-8_del.kmap.gz ${TCOS_CHROOT}/etc/console-setup/ fi cat << EOC | chroot ${TCOS_CHROOT} apt-get update apt-get $APT_OPTS dist-upgrade apt-get install $APT_OPTS ${TCOS_PACKAGES} apt-get install $APT_OPTS ${DISTRO_PACKAGES} apt-get clean EOC touch ${TCOS_CHROOT}/etc/tcos/chroot chrootexit } ############################################################################### chrootinstallpkg() { chrootenter cat << EOC | chroot ${TCOS_CHROOT} apt-get update apt-get $APT_OPTS install $@ apt-get clean EOC chrootexit } ############################################################################### chrootcp() { if [ -e "$1" ]; then mkdir -p "${TCOS_CHROOT}/$(dirname $1)" cp "$1" "${TCOS_CHROOT}/$(dirname $1)/" fi } chrootupdateimages() { chrootenter # remove udevadm diversion before gentcos chrootexit # copy some files chrootcp /usr/share/tcos-core/lockscreen-custom.png chrootcp /etc/default/console-setup chrootcp /etc/default/keyboard chrootcp /etc/adjtime chrootcp /etc/hosts TCOS_KERNEL=$(awk -F"=" '/^TCOS_KERNEL=/ {print $2}' ${TCOS_CHROOT}/etc/tcos/tcos.conf | sed 's/"//g') if [ -f /etc/tcos/templates/tcosconfig.conf ]; then mkdir -p ${TCOS_CHROOT}/etc/tcos/templates/ cp /etc/tcos/templates/tcosconfig.conf ${TCOS_CHROOT}/etc/tcos/templates/ if grep -q "TCOS_KERNEL" ${TCOS_CHROOT}/etc/tcos/templates/tcosconfig.conf; then TCOS_KERNEL=$(awk -F"=" '/^TCOS_KERNEL=/ {print $2}' ${TCOS_CHROOT}/etc/tcos/templates/tcosconfig.conf | sed 's/"//g') fi fi mount --bind /proc ${TCOS_CHROOT}/proc cat << EOC | chroot ${TCOS_CHROOT} gentcos ${GENTCOS_OPT} EOC umount -l ${TCOS_CHROOT}/proc # this is exec outside chroot rm -rf /var/lib/tcos/tftp/vmlinuz-${TCOS_KERNEL} \ /var/lib/tcos/tftp/usr-${TCOS_KERNEL}.squashfs \ /var/lib/tcos/tftp/initramfs-${TCOS_KERNEL} \ /var/lib/tcos/tftp/linux-${TCOS_KERNEL}.nbi \ /var/lib/tcos/fs-${TCOS_KERNEL} # new Ubuntus chmod 600 vmlinuz, copy vmlinuz to tcos/tftp/ [ ! -e /var/lib/tcos/tftp/vmlinuz-${TCOS_KERNEL} ] && \ cp ${TCOS_CHROOT}/boot/vmlinuz-${TCOS_KERNEL} /var/lib/tcos/tftp/ && \ chmod 644 /var/lib/tcos/tftp/vmlinuz-${TCOS_KERNEL} [ ! -e /var/lib/tcos/tftp/usr-${TCOS_KERNEL}.squashfs ] && \ ln -s ${TCOS_CHROOT}/var/lib/tcos/tftp/usr-${TCOS_KERNEL}.squashfs /var/lib/tcos/tftp/ [ ! -e /var/lib/tcos/tftp/initramfs-${TCOS_KERNEL} ] && \ [ -e ${TCOS_CHROOT}/var/lib/tcos/tftp/initramfs-${TCOS_KERNEL} ] && \ ln -s ${TCOS_CHROOT}/var/lib/tcos/tftp/initramfs-${TCOS_KERNEL} /var/lib/tcos/tftp/ [ ! -e /var/lib/tcos/tftp/linux-${TCOS_KERNEL}.nbi ] && \ [ -e ${TCOS_CHROOT}/var/lib/tcos/tftp/linux-${TCOS_KERNEL}.nbi ] && \ ln -s ${TCOS_CHROOT}/var/lib/tcos/tftp/linux-${TCOS_KERNEL}.nbi /var/lib/tcos/tftp/ # NFS files and dirs [ ! -e /var/lib/tcos/tftp/initramfs-${TCOS_KERNEL}-nfs ] && \ [ -e ${TCOS_CHROOT}/var/lib/tcos/tftp/initramfs-${TCOS_KERNEL}-nfs ] && \ ln -s ${TCOS_CHROOT}/var/lib/tcos/tftp/initramfs-${TCOS_KERNEL}-nfs /var/lib/tcos/tftp/ [ ! -d /var/lib/tcos/fs-${TCOS_KERNEL} ] && \ [ -d ${TCOS_CHROOT}/var/lib/tcos/fs-${TCOS_KERNEL} ] && \ ln -s ${TCOS_CHROOT}/var/lib/tcos/fs-${TCOS_KERNEL} /var/lib/tcos/ # generate pxelinux.cfg/default parse_pxelinuxcfg } ############################################################################### # # Script begins here # if [ "$#" = 0 ]; then echo "No parameters !!" usage exit 1 fi OPTIONS=`getopt -o d:ko:r:v --long create,update,install:,update-images,help,version:,forcedistro:,arch:,flavour:,dir:,mirror:,securitymirror:,tcosmirror:,kversion:,gentcos:,debug,quiet,verbose,tcos-exp -n "$0" -- "$@"` if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi eval set -- "$OPTIONS" while true; do case "$1" in --help) usage ; exit 0 ;; --version) TCOS_DISTRO=$2; shift 2 ;; --forcedistro) DISTRIBUTION=$2; shift 2;; --arch) TCOS_ARCH=$2 ; shift 2 ;; --flavour) TCOS_FLAVOUR=$2; shift 2 ;; --mirror) MIRROR=$2; shift 2 ;; --securitymirror) MIRROR2=$2; shift 2;; --tcosmirror) TCOS_MIRROR=$2; shift 2 ;; --dir) TCOS_CHROOT=$2 ; shift 2 ;; --kversion) TCOS_KERNEL=$2; shift 2 ;; --gentcos) GENTCOS_OPT=$2; shift 2 ;; --debug) echo "FIXME DEBUG"; shift ;; --quiet) echo "FIXME QUIET"; shift ;; --verbose) echo "FIXME VERBOSE";shift ;; --tcos-exp) TCOS_EXPERIMENTAL="experimental"; shift ;; --create) ACTION=create ; shift ;; --update) ACTION=update ; shift ;; --install) ACTION=installpkgs PKGS="$2"; shift 2;; --update-images) ACTION=update-images; shift;; --) shift ; break ;; *) usage; echo "Unknow option $1"; exit -1 ;; esac done # load conf with forces settings set_conf # save data in tcos-buildchroot.conf or load if chroot exists if [ ! -f ${TCOS_CHROOT}/tcos-buildchroot.conf ]; then mkdir -p ${TCOS_CHROOT} echo "DISTRIBUTION=$DISTRIBUTION" > ${TCOS_CHROOT}/tcos-buildchroot.conf echo "MIRROR=$MIRROR" >> ${TCOS_CHROOT}/tcos-buildchroot.conf echo "MIRROR2=$MIRROR2" >> ${TCOS_CHROOT}/tcos-buildchroot.conf echo "TCOS_MIRROR=$TCOS_MIRROR" >> ${TCOS_CHROOT}/tcos-buildchroot.conf echo "TCOS_KERNEL=$TCOS_KERNEL" >> ${TCOS_CHROOT}/tcos-buildchroot.conf echo "TCOS_DISTRO=$TCOS_DISTRO" >> ${TCOS_CHROOT}/tcos-buildchroot.conf echo "TCOS_EXPERIMENTAL=$TCOS_EXPERIMENTAL" >> ${TCOS_CHROOT}/tcos-buildchroot.conf else . ${TCOS_CHROOT}/tcos-buildchroot.conf fi if [ "$ACTION" != "" ]; then case $ACTION in update) chrootupdate; exit ;; create) chrootcreate; exit ;; installpkgs) tmp=$(echo $PKGS | sed 's/,/ /g') chrootinstallpkg $tmp ; exit ;; update-images) chrootupdateimages; exit ;; *) echo "Error, unknow action: $ACTION" exit 1 ;; esac fi tcos-0.89.93ubuntu2/bin/configurexorg0000664000000000000000000005402212260610261014444 0ustar #!/bin/sh # # configurexorg # Copyright (C) 2006-2011 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # template=/conf/xorg.conf.tpl tmp_xorg_file=/tmp/xorg.configurexorg outputfile=/etc/X11/xorg.conf mysettings=/conf/mysettings.conf touch ${mysettings} restartxorg=0 autodetect_xdriver=1 force_xdriver=0 xdriver_via="#" xdriver_amd="#" TCOS_XORG_CONF= . /conf/tcos.conf . /conf/tcos-run-functions if [ -d /usr/lib/xorg/modules/drivers ]; then xdriver_dir=/usr/lib/xorg/modules/drivers elif [ -d /usr/X11R6/lib/modules/drivers ]; then xdriver_dir=/usr/X11R6/lib/modules/drivers fi # set to 0 to disable debug verbose=0 debug () { if [ ${verbose} = 1 ]; then echo "configurexorg DEBUG: $@" >&2 fi } tftp_download_again() { MYIP=$(awk -F"=" '/^ip=/ {print $2}' /tmp/net.data) debug "downloading file /tcos/conf/${MYIP}.conf" download_file /tcos/conf/${MYIP}.conf /conf/mysettings.conf # new versions of tftp don't create file touch /conf/mysettings.conf . /conf/mysettings.conf } # FIXME use getopt for x in "$@"; do case $x in --getsettings) method="getsettings" ;; --newsettings) method="newsettings" ;; --changesettings) method="changesettings" ;; --downloadagain) tftp_download_again method="newsettings" ;; --restartx*) restartxorg=1 ;; --autodetect) autodetect_xdriver=1 ;; --noautodetect) autodetect_xdriver=0 ;; --verbose) verbose=1 ;; esac done # default xorg settings xdriver="$TCOS_XORG_VIDEO_DRIVER" xres="$TCOS_XORG_VIDEO_RES" xdepth="16" xhorizsync="28-49" xvertsync="43-72" xrefresh="60Hz" xdpms="" # default enabled xmousewheel="" # wheel enabled xmouseprotocol="ImPS/2" xlocalfonts="#" # default disabled xmousedev="/dev/input/mice" ENABLE_EVDEV="#" ENABLE_KBD="" EVDEV_MODEL="evdev" KBD_DEV=$(find /dev/input/by-path/ -name "*kbd*") if [ "$KBD_DEV" != "" ]; then # link in /dev/input [ ! -e /dev/input/keyboard ] && ln -s $KBD_DEV /dev/input/keyboard if [ ! -e /usr/lib/xorg/modules/input/kbd_drv.so ]; then # use EVDEV (Ubuntu don't install xserver-xorg-input-kbd) ENABLE_EVDEV="" ENABLE_KBD="#" fi fi if [ -d /usr/lib/X11/fonts ] && [ ! -e /usr/share/fonts/X11 ] ; then mkdir -p /usr/share/fonts ln -s /usr/lib/X11/fonts /usr/share/fonts/X11 fi # FIXME serial mouse scan !!! if [ -e /dev/input/mice ]; then xmousedev="/dev/input/mice" elif [ -e /dev/psaux ]; then xmousedev="/dev/psaux" fi # default is Ctrl Alt <== DISABLED xdontzap="1" xzap_txt="Section \"Serverflags\"\\ Option \"DontZap\" \"yes\"\\ EndSection" xzap=$xzap_txt usemodes_txt="Section \"Modes\"\\ Identifier \"Cimarron\"\\ # 640x480 @ 60.00 Hz (GTF) hsync: 29.82 kHz; pclk: 23.86 MHz\\ Modeline \"640x480-60\" 25.1749 640 656 744 800 480 490 492 525 -HSync -VSync\\ # 640x480 @ 75.00 Hz (GTF) hsync: 37.65 kHz; pclk: 30.72 MHz\\ Modeline \"640x480-75\" 31.5000 640 656 720 840 480 481 484 500 -HSync -VSync\\ # 640x480 @ 85.00 Hz (GTF) hsync: 42.92 kHz; pclk: 35.71 MHz\\ Modeline \"640x480-85\" 36.0000 640 696 752 832 480 481 484 509 -HSync -VSync\\ # 640x480 @ 90.00 Hz (GTF) hsync: 45.54 kHz; pclk: 37.89 MHz\\ Modeline \"640x480-90\" 37.8889 640 672 736 832 480 481 484 506 -HSync -VSync\\ # 640x480 @ 100.00 Hz (GTF) hsync: 50.90 kHz; pclk: 43.16 MHz\\ Modeline \"640x480-100\" 43.1629 640 680 744 848 480 481 484 509 -HSync -VSync\\ # 800x600 @ 60.00 Hz (GTF) hsync: 37.32 kHz; pclk: 38.22 MHz\\ Modeline \"800x600-60\" 40.0000 800 840 976 1056 600 601 605 628 -HSync -VSync\\ # 800x600 @ 75.00 Hz (GTF) hsync: 47.02 kHz; pclk: 48.91 MHz\\ Modeline \"800x600-75\" 49.5000 800 816 896 1056 600 601 604 625 -HSync -VSync\\ # 800x600 @ 85.00 Hz (GTF) hsync: 53.55 kHz; pclk: 56.55 MHz\\ Modeline \"800x600-85\" 56.2500 800 832 896 1048 600 601 604 631 -HSync -VSync\\ # 800x600 @ 90.00 Hz (GTF) hsync: 56.88 kHz; pclk: 60.07 MHz\\ Modeline \"800x600-90\" 60.0649 800 840 928 1056 600 601 604 632 -HSync -VSync\\ # 800x600 @ 100.00 Hz (GTF) hsync: 63.60 kHz; pclk: 68.18 MHz\\ Modeline \"800x600-100\" 68.1789 800 848 936 1072 600 601 604 636 -HSync -VSync\\ # 1024x768 @ 60.00 Hz (GTF) hsync: 47.70 kHz; pclk: 64.11 MHz\\ Modeline \"1024x768-60\" 65.0000 1024 1048 1184 1344 768 771 777 806 -HSync -VSync\\ # 1024x768 @ 75.00 Hz (GTF) hsync: 60.15 kHz; pclk: 81.80 MHz\\ Modeline \"1024x768-75\" 78.7500 1024 1040 1136 1312 768 769 772 800 -HSync -VSync\\ # 1024x768 @ 85.00 Hz (GTF) hsync: 68.60 kHz; pclk: 94.39 MHz\\ Modeline \"1024x768-85\" 94.5000 1024 1072 1168 1376 768 769 772 808 -HSync -VSync\\ # 1024x768 @ 90.00 Hz (GTF) hsync: 72.81 kHz; pclk: 100.19 MHz\\ Modeline \"1024x768-90\" 100.1869 1024 1088 1200 1376 768 769 772 809 -HSync -VSync\\ # 1024x768 @ 100.00 Hz (GTF) hsync: 81.40 kHz; pclk: 113.31 MHz\\ Modeline \"1024x768-100\" 113.3099 1024 1096 1208 1392 768 769 772 814 -HSync -VSync\\ # 1280x800 @ 60.00 Hz (GTF) hsync: 49.68 kHz; pclk: 83.46 MHz\\ Modeline \"1280x800-60\" 83.46 1280 1344 1480 1680 800 801 804 828 -HSync +Vsync\\ # 1280x1024 @ 60.00 Hz (GTF) hsync: 63.60 kHz; pclk: 108.88 MHz\\ Modeline \"1280x1024-60\" 108.0000 1280 1328 1440 1688 1024 1025 1028 1066 -HSync -VSync\\ # 1280x1024 @ 75.00 Hz (GTF) hsync: 80.17 kHz; pclk: 138.54 MHz\\ Modeline \"1280x1024-75\" 135.0000 1280 1296 1440 1688 1024 1025 1028 1066 -HSync -VSync\\ # 1280x1024 @ 85.00 Hz (GTF) hsync: 91.38 kHz; pclk: 159.36 MHz\\ EndSection" usemodes=$usemodes_txt # other withnofail=0 setsettings=1 stamp=$(date +'%Y.%m.%d.%H.%M') cmdline=$@ get_myconf() { # $1 is var name # $2 is default value debug "get_myconf() varname=$1 default=$2" varname=$1 defvalue=$2 value=$(grep ^${varname} ${mysettings} | awk -F "=" '{gsub(/\"/,"",$2); print $2}' ) if [ "${value}" != "" ]; then debug "get_myconf() new value=${value}" echo ${value} else echo ${defvalue} fi } get_myres() { echo $(awk -F "=" '/^xres/ { gsub(/\"/,"", $2) ; split($2,A," ") ; print A[1]}' ${mysettings} ) } get_myrefresh() { echo $(awk -F "=" '/^xres/ { gsub(/\"/,"", $2) ; split($2,A," ") ; print A[3]}' ${mysettings} ) } get_mybool() { varname=$1 value=$(grep ^${varname} ${mysettings} | awk -F "=" '{gsub(/\"/,"",$2); print $2}' ) if [ "${value}" = "1" ]; then echo "" # enabled else echo "#" # disabled fi } detect_driver() { debug "detect_driver()" #if [ $force_xdriver = 1 ]; then # debug "detect_driver() force OFF" # return #fi if [ -d /usr/share/xserver-xorg/pci/ ]; then xpci=$(get_vga_vendor vendormodel) #xpci=$(lspci -nn| grep VGA | grep -E -o '[0-9a-z]{4}\:[0-9a-z]{4}' | tr [a-z] [A-Z]) #xpci=$(lspci -vn | awk '/VGA/ {print $3}' | tail -1 | tr [a-z] [A-Z]) #xpci=$(lspci -n -s $(lspci | awk '/VGA/ {print $1}') | tail -1 | awk '{print $3}' | tr [a-z] [A-Z]) if [ "${xpci}" != "" ]; then # get last line _xdev=$(grep "${xpci}" /usr/share/xserver-xorg/pci/xorg.pciids| awk '{print $1}' | tail -1) xdev=$(basename ${_xdev}) if [ -f ${xdriver_dir}/${xdev}_drv.so ]; then xdriver=$xdev debug "detect_driver() FILE ${xdriver_dir}/${xdev}_drv.so FOUND" else debug "detect_driver() FILE ${xdriver_dir}/${xdev}_drv.so NOT FOUND" fi return fi fi # detect Xorg kernel module and driver # pcimodules --class 0x30000 --classmask 0xffff00 | grep -v fb$ if [ -x $(which discover) ]; then counts=0 all_file_drivers=$(ls $xdriver_dir/|grep "_drv.so"|grep -v vga) all_drivers="" for file_driver in $all_file_drivers; do all_drivers="$all_drivers $(echo $file_driver| sed s/'_drv.so'//g)" done debug "detect_driver() all_drivers=$all_drivers" xdevice=$(discover --data-path=xfree86/server/device/driver display) debug "detect_driver() xdevice=$xdevice" for driver in $all_drivers; do if [ "$xdevice" = "$driver" ]; then debug "detect_driver() possible driver: $driver" xdriver_candidate=$driver counts=$((counts + 1)) fi done if [ $counts = 1 ]; then xdriver=$xdriver_candidate debug "detect_driver() xdriver FOUND ===> $xdriver" fi else debug "detect_driver() discover not found" fi # # # IMPORTANT # # for discover other devices use something like this # # allmodules="" # for module in $(discover --data-path=linux/module/name ethernet sound ide usb modem bridge isdn printer scanner mouse webcam floppy); do # if [ "$module" != "" ]; then # allmodules="$allmodules $module" # fi # done # echo $allmodules # } # FIXME use getopt load_cmdline () { for x in $cmdline; do case $x in --xdriver=*) xdriver=${x#--xdriver=} force_xdriver=1 ;; --xres=*) xres=${x#--xres=} ;; --xdepth=*) xdepth=${x#--xdepth=} ;; --xrefresh=*) xrefresh=${x#--xrefresh=} ;; #--xhorizsync=*) # xhorizsync=${x#--xhorizsync=} # ;; #--xvertsync=*) # xvertsync=${x#--xvertsync=} # ;; --xfontserver=*) xfontserver=${x#--xfontserver=} ;; --xmouseprotocol=**) xmouseprotocol=${x#--xmouseprotocol=} ;; --restartx) restartxorg=1 ;; --xmousenowheel) xmousewheel="#" ;; --xnodpms) xdpms="#" ;; --xdontzap) xdontzap="1" ;; --dontzap) xdontzap="1" ;; --zap) xdontzap="0" ;; --xzap) xdontzap="0" ;; --xlocalfonts) xlocalfonts="" ;; --withnofail) withnofail=1 ;; --outputfile=*) outputfile=${x#--outputfile=} ;; esac done } # end of load_cmdline set_sync() { RES=${1} xhorizsync=$(get_sync "$RES@${xrefresh}" | awk -F ":" '{print $1}') xvertsync=$(get_sync "$RES@${xrefresh}" | awk -F ":" '{print $2}') } get_sync() { # horiz and vert sync table # orig by debian debconf # ==> xserver-xorg.postinst debug "get_sync() RES=$1" RES=${1} case "$RES" in "640x480@60Hz") horiz_sync="28-33" # Some old monitors only support max 60Hz vert_sync="43-60" ;; "640x480@72Hz") horiz_sync="28-38" vert_sync="43-72" ;; "800x600@60Hz") horiz_sync="28-38" vert_sync="43-60" ;; "800x600@72Hz") horiz_sync="28-48" vert_sync="43-72" ;; "800x600@85Hz") horiz_sync="30-54" vert_sync="50-85" ;; "832x624@75Hz") horiz_sync="30-50" vert_sync="50-75" ;; "1024x768@60Hz") horiz_sync="28-49" vert_sync="43-72" ;; "1024x768@70Hz") horiz_sync="30-57" vert_sync="43-72" ;; "1024x768@75Hz") horiz_sync="30-60" vert_sync="50-75" ;; "1152x768@54.8Hz") # This is a 15" PowerBook G4 mode; its video hardware (LCD) was also # capable of 896x600 and 720x480 pixels at a 3:2 aspect ratio and # 1024x768, 800x600, and 640x480 pixels at a 4:3 aspect ratio, so give # its horizontal and vertical ranges a little more "headroom" than # that required by this specific mode to accomodate the others. horiz_sync="30-50" vert_sync="50-72" ;; "1152x864@60Hz") horiz_sync="30-68" vert_sync="50-70" ;; "1152x864@75Hz") horiz_sync="30-68" vert_sync="50-85" ;; "1280x768@60Hz") horiz_sync="30-65" vert_sync="30-60" ;; "1280x800@60Hz") horiz_sync="30-67" vert_sync="30-60" ;; "1280x960@60Hz") horiz_sync="30-60" vert_sync="50-75" ;; "1280x960@85Hz") horiz_sync="30-92" vert_sync="50-85" ;; "1280x1024@60Hz") horiz_sync="30-65" vert_sync="50-75" ;; "1400x1050@60Hz") horiz_sync="30-67" vert_sync="50-75" ;; "1400x1050@75Hz") horiz_sync="30-85" vert_sync="50-80" ;; "1440x900@60Hz") horiz_sync="30-67" vert_sync="50-75" ;; "1440x900@75Hz") horiz_sync="30-85" vert_sync="50-80" ;; "1600x1024@85Hz") horiz_sync="30-70" vert_sync="50-90" ;; "1600x1200@60Hz") horiz_sync="30-75" vert_sync="50-85" ;; "1600x1200@75Hz") horiz_sync="30-94" vert_sync="50-75" ;; "1600x1200@85Hz") horiz_sync="30-107" vert_sync="50-85" ;; "1680x1050@60Hz") horiz_sync="30-90" vert_sync="50-60" ;; "1792x1344@75Hz") horiz_sync="30-107" vert_sync="50-85" ;; "1792x1344@60Hz") horiz_sync="30-84" vert_sync="50-75" ;; "1856x1392@60Hz") horiz_sync="30-87" vert_sync="50-75" ;; "1856x1392@75Hz") horiz_sync="30-113" vert_sync="50-75" ;; "1920x1200@60Hz") horiz_sync="30-75" vert_sync="30-60" ;; "1920x1440@60Hz") horiz_sync="30-90" vert_sync="50-75" ;; "1920x1440@75Hz") horiz_sync="30-130" vert_sync="60-160" ;; "1920x1440@85Hz") horiz_sync="30-130" vert_sync="60-160" ;; "2048x1536@60Hz") horiz_sync="30-100" vert_sync="60-85" ;; "2048x1536@75Hz") horiz_sync="30-125" vert_sync="60-100" ;; "2048x1536@85Hz") horiz_sync="30-140" vert_sync="60-160" ;; *) debug "get_sync() Unkwnow screen resolution ${RES}" echo ":" ;; esac debug "get_sync() $horiz_sync:$vert_sync" echo "$horiz_sync:$vert_sync" } set_settings() { TCOS_ENABLE_XDRIVER_FULLAUTODETECT="" if [ "$xdriver" != "auto" ]; then autodetect_xdriver=0 fi if [ "$xdriver" = "xorgauto" ]; then # Leave Xorg to autodetect all [ -d /usr/share/X11/xorg.conf.d ] && TCOS_XORG_CONF=/usr/share/X11/xorg.conf.d/ [ -d /usr/lib/X11/xorg.conf.d ] && TCOS_XORG_CONF=/usr/lib/X11/xorg.conf.d/ [ "$TCOS_XORG_CONF" = "" ] && xdriver=fullauto fi if [ "$xdriver" = "fullauto" ]; then # Try Xorg to detect all? TCOS_ENABLE_XDRIVER_FULLAUTODETECT="#" fi if [ "$xdriver" = "auto" ] || [ $autodetect_xdriver = 1 ]; then # Try Xorg to detect? detect_driver if [ "$xdriver" = "auto" ]; then xdriver="vesa" fi fi if [ "$xdriver" = "via" ] || [ "$xdriver" = "openchrome" ]; then xdriver_via="" fi if [ "$xdriver" = "amd" ]; then xdriver_amd="" else usemodes="" fi disablesync="" if [ "$xdisablesync" = "disable" ]; then disablesync="#" fi if [ "${xdontzap}" = "0" ] || [ "$xdontzap" = "#" ]; then # enable Ctrl Alt <=== xzap="#" elif [ "$xdontzap" = "1" -o "$xdontzap" = "" ]; then # disable Ctrl Alt <== xzap=${xzap_txt} else debug "unknow dontzap" xzap="" fi if [ "$TCOS_ENABLE_FONT_SERVER" = "1" ]; then TCOS_ENABLE_FONT_SERVER="" else TCOS_ENABLE_FONT_SERVER="#" fi if [ "$TCOS_XORG_XKB" = "br" ]; then TCOS_XORG_XKBMODEL="abnt2" EVDEV_MODEL="abnt2" fi if [ "$TCOS_COMPOSITE" = "1" ]; then ENABLE_COMPOSITE="#" else ENABLE_COMPOSITE="" fi debug "set_settings() xdriver=$xdriver xres=$xres xdepth=$xdepth xdpms=$xdpms" debug "xhorizsync=$xhorizsync xvertsync=$xvertsync xrefresh=$xrefresh xmousewheel=$xmousewheel" debug "xmousedev=$xmousedev2 xmouseprotocol=$xmouseprotocol2 xlocalfonts=$xlocalfonts" debug "date=$stamp server=$SERVER xdontzap=$xdontzap dontzap=$xzap" # sed template to output file sed -e s/"__xdriver__"/"${xdriver}"/g \ -e s/"__xres__"/"${xres}"/g \ -e s/"__xdriver_via__"/"${xdriver_via}"/g \ -e s/"__xdriver_amd__"/"${xdriver_amd}"/g \ -e s/"__xdepth__"/"${xdepth}"/g \ -e s/"__xdpms__"/"${xdpms}"/g \ -e s/"__xhorizsync__"/"${xhorizsync}"/g \ -e s/"__xvertsync__"/"${xvertsync}"/g \ -e s/"__xrefresh__"/"${xrefresh}"/g \ -e s/"__disablesync__"/"${disablesync}"/g \ -e s/"__enable_composite__"/"${ENABLE_COMPOSITE}"/g \ -e s/"__xevdevenable__"/"${ENABLE_EVDEV}"/g \ -e s/"__xkbdenable__"/"${ENABLE_KBD}"/g \ -e s/"__evdevmodel__"/"${EVDEV_MODEL}"/g \ -e s/"__xkbmap__"/"${TCOS_XORG_XKB}"/g \ -e s/"__xkbmodel__"/"${TCOS_XORG_XKBMODEL}"/g \ -e s/"__xmousewheel__"/"${xmousewheel}"/g \ -e s/"__xmousenowheel__"/"${xmousenowheel}"/g \ -e s/"__xmousedev__"/"${xmousedev2}"/g \ -e s/"__xmouseprotocol__"/"${xmouseprotocol2}"/g \ -e s/"__xlocalfonts__"/"${xlocalfonts}"/g \ -e s/"__date__"/"${stamp}"/g \ -e s/"unix\/:7100"/"tcp\/${SERVER}:7100"/g \ -e s/"__xfontserver__"/"${SERVER}"/g \ -e s/"__enable_font_server__"/"${TCOS_ENABLE_FONT_SERVER}"/g \ -e s/"__enable_xdriver_fullautodetect__"/"${TCOS_ENABLE_XDRIVER_FULLAUTODETECT}"/g \ -e s/"__dontzap__"/"${xzap}"/g \ -e s/"__xdontzap__"/"${xdontzap}"/g \ -e s/"__usemodes__"/"${usemodes}"/g \ ${template} > ${tmp_xorg_file} } save_settings() { # backup old settings [ -f ${outputfile} ] && mv ${outputfile} ${outputfile}.${stamp} # move new settings if [ -f ${tmp_xorg_file} ]; then cat ${tmp_xorg_file} > ${outputfile} fi if [ -d "${TCOS_XORG_CONF}" ]; then FONTS_DIR="/usr/share/X11/fonts" [ -d "/usr/share/fonts/X11" ] && FONTS_DIR="/usr/share/fonts/X11" # xorgauto delete /etc/X11/xorg.conf rm -f "${outputfile}" # create ${TCOS_XORG_CONF}/60-fonts.conf cat << EOF > ${TCOS_XORG_CONF}/60-fonts.conf Section "Files" FontPath "${FONTS_DIR}/misc" FontPath "${FONTS_DIR}/100dpi" FontPath "tcp/${SERVER}:7100" FontPath "tcp/${SERVER}:7101" EndSection EOF fi } getsimple() { value=$(grep "^#$1=" ${outputfile} 2>/dev/null | tail -1 | awk -F "=" '{print $2}') if [ "${value}" = "#" ]; then value=0 elif [ "${value}" = "" ]; then value=1 fi echo -n "$1=${value} " } getvalue() { value=$(grep "^#$1" ${outputfile} 2>/dev/null | tail -1 | awk -F "=" '{print $2}') echo "${value}" } get_settings() { getsimple "xdriver" getsimple "xres" getsimple "xdepth" getsimple "xdpms" getsimple "xrefresh" getsimple "xhorizsync" getsimple "xvertsync" getsimple "xfontserver" getsimple "xmousedev" getsimple "xmousewheel" getsimple "xmouseprotocol" #getsimple "xmousenowheel" getsimple "xdontzap" getsimple "xdisablesync" } load_settings() { xdriver=$(getvalue "xdriver") xres=$(getvalue "xres") xdepth=$(getvalue "xdepth") xdpms=$(getvalue "xdpms") xrefresh=$(getvalue "xrefresh") xhorixsync=$(getvalue "xhorizsync") xvertsync=$(getvalue "xvertsync") xfontserver=$(getvalue "xfontserver") xmousewheel=$(getvalue "xmousewheel") xmousenowheel=$(getvalue "xmousenowheel") xdontzap=$(getvalue "xdontzap") xdisablesync=$(getvalue "xdisablesync") } ######### end functions ################### ############## start app ###################### if [ $(cat ${mysettings} | wc -l) -gt 1 ]; then debug "loading settings of remote file..." xdriver=$(get_myconf "xdriver" ${xdriver}) xdepth=$(get_myconf "xdepth" ${xdepth}) xres=$(get_myres) xrefresh=$(get_myrefresh) xdpms=$(get_mybool "xdpms") xmousewheel=$(get_mybool "xmousewheel") xdontzap=$(get_mybool "xdontzap") xdisablesync=$(get_myconf "xdisablesync") fi SERVER=$(read_server "font-server") # get first one for iserver in ${SERVER}; do SERVER=${iserver} break done if [ "${xmousewheel}" = "#" ]; then xmousenowheel="" else xmousenowheel="#" fi xmousedev2=$(echo ${xmousedev} | sed s/'\/'/'\\\/'/g) xmouseprotocol2=$(echo ${xmouseprotocol} | sed s/'\/'/'\\\/'/g) ######################################################## if [ "${method}" = "newsettings" ]; then load_cmdline set_sync "${xres}" set_settings save_settings elif [ "${method}" = "getsettings" ]; then get_settings elif [ "${method}" = "changesettings" ]; then load_settings load_cmdline set_sync "${xres}" set_settings save_settings else echo "Usage configurexorg: --getsettings - print xorg settings --newsettings - set all new settings based on default and cmdline --changesettings - change any settings based on configured --downloadagain - download ${mysettings} again --restartxorg - restart Xorg after edit/change/create settings" exit 1 fi if [ ${restartxorg} = 1 ]; then debug "restarting xorg...." /sbin/start-stop-daemon --start --quiet --background --exec /sbin/restartxorg > /dev/null 2>&1 fi exit 0 tcos-0.89.93ubuntu2/bin/tcos-gdm-autologin0000664000000000000000000003014012260610261015272 0ustar #!/usr/bin/env python # -*- coding: UTF-8 -*- ########################################################################## # Tcos writen by MarioDebian # # tcos-gdm-autologin # # Copyright (c) 2006 Mario Izquierdo # # 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. ########################################################################### """ Usage: * from GDM this app is called to retrieve username based on hostname * Exec standalone, configure GDM /etc/gdm/gdm.conf file with ThinClient values """ import os, sys import getopt from subprocess import Popen, PIPE, STDOUT from socket import gethostbyaddr as gethostname import pwd GDM_CONF_FILE="/etc/gdm/gdm.conf" # try to edit correct file (Ubuntu use -custom file) if os.path.isfile(GDM_CONF_FILE + "-custom"): GDM_CONF_FILE=GDM_CONF_FILE+"-custom" if os.path.isfile("/etc/gdm/gdm-cdd.conf"): GDM_CONF_FILE="/etc/gdm/gdm-cdd.conf" # in new Ubuntu create empty file and use it if os.path.isfile("/etc/gdm/gdm.schemas") and not os.path.isfile("/etc/gdm/custom.conf"): # create empty file f=open("/etc/gdm/custom.conf", 'w') f.write('\n') f.close() # new GDM in Ubuntu Karmic if os.path.isfile("/etc/gdm/custom.conf"): GDM_CONF_FILE="/etc/gdm/custom.conf" # in Debian unstable GDM is installed in /etc/gdm3 create empty file and use it if os.path.isdir("/etc/gdm3") and not os.path.isfile("/etc/gdm3/daemon.conf"): # create empty file f=open("/etc/gdm3/daemon.conf", 'w') f.write('\n') f.close() # new GDM in Debian unstable if os.path.isfile("/etc/gdm3/daemon.conf"): GDM_CONF_FILE="/etc/gdm3/daemon.conf" HOME_TEMPLATE="/root/skel.tar.gz" USER_GROUPS=["fuse"] debug=True configure=False add=False delete_home=True noaction=False local="" # this is the values needed to connect to GDM from thin clients TCOS_GDM={ "daemon":[ {"TimedLoginEnable":"true"}, {"TimedLogin":"/usr/sbin/tcos-gdm-autologin|"}, {"TimedLoginDelay":"5"} ], "security":[ {"AllowRemoteAutoLogin":"true"}, {"DisallowTCP":"false"} ], "xdmcp":[ {"Enable":"true"}, {"MaxPending":"60"}, {"MaxWaitIndirect":"80"}, {"MaxWait":"75"}, {"PingIntervalSeconds":"35"}, {"MaxPendingIndirect":"30"}, {"MaxSessions":"40"}, {"DisplaysPerHost":"4"}, ] } def print_debug(txt): if debug: try: f=open('/var/log/tcos-gdm-autologin.log', 'a') f.write("[%s] %s::%s\n" %(os.getpid(), "tcos-gdm-autologin", txt) ) f.close() except: sys.stderr.write("%s::%s\n" %("tcos-gdm-autologin", txt)) ##print "%s::%s" %("tcos-gdm-autologin", txt) def usage(): print "tcos-gdm-autologin help:" print "" print " [no options] (write username to login, used from GDM)" print " -d [--debug] (write debug data to stdout)" print " -h [--help] (this help)" print " --configure (configure gdm with ThinClient values)" print " --skel=/foo/bar/file.tar.gz (skel template, default %s)" %(HOME_TEMPLATE) print " --add (add users and hostnames to system files)" print " --nodelete (NOT delete HOME and uncompress HOME_TEMPLATE)" print " --noaction (NOT perform any action, enable debug)" try: opts, args = getopt.getopt(sys.argv[1:], ":hd", ["help", "debug", "configure", "skel=", "add", "nodelete", "noaction", "local="]) except getopt.error, msg: print msg print "for command line options use tcos-gdm-autologin --help" sys.exit(2) # process options for o, a in opts: if o in ("-d", "--debug"): #print "DEBUG ACTIVE" debug = True if o == "--configure": configure=True if o == "--add": add=True if o == "--nodelete": delete_home=False if o == "--noaction": noaction=True debug=True if o == "--skel": HOME_TEMPLATE=a if o == "--local": local=a if o in ("-h", "--help"): usage() sys.exit(0) print_debug("--------------------------------------------------------") if "DISPLAY" in os.environ: print_debug( "DISPLAY=%s"%(os.environ['DISPLAY']) ) else: print_debug("DISPLAY not set") ######################################################## # # Extends python-configobj class to use '=' instead of ' = ' # ######################################################## from configobj import ConfigObj class MyConfigObj (ConfigObj): def _write_line(self, indent_string, entry, this_entry, comment): """Write an individual line, for the write method""" # NOTE: the calls to self._quote here handles non-StringType values. if not self.unrepr: val = self._decode_element(self._quote(this_entry)) else: val = repr(this_entry) return '%s%s%s%s%s' % ( indent_string, self._decode_element(self._quote(entry, multiline=False)), self._a_to_u('='), val, self._decode_element(comment)) ######## some functions ############# def execmd(cmd): if not noaction: print_debug(cmd) try: if not noaction: os.system(cmd) else: print_debug("NOACTION: execmd() cmd=%s" %(cmd) ) except: print("Error while exec: \"%s\"" %(cmd) ) def is_ip(host): try: if len( host.split('.') ) == 4: print_debug("is_ip: host=%s seems to be an IP address" %(host) ) return True return False except: return False def show_login(): username=None host=None home=None display=None # FIXME use tcosmonitor.shared.parseIPAddress host, display = os.environ["DISPLAY"].rsplit(':', 1) if host == "": print_debug ( "localdisplay return local='%s'"%local ) print "%s"%local sys.exit(0) if is_ip(host): try: host=gethostname(host)[0] print_debug("show_login() convert IP to hostname host=%s" %(host)) except: print_debug("show_login() error converting IP to hostname") try: data=pwd.getpwnam(host) except: print "no_username_configured_for_host_%s" %(host) print_debug("ERROR, host (%s) not found in users." %(host)) sys.exit(1) home=data.pw_dir username=data.pw_name # kill all user processes execmd("pkill -9 -u %s" %(username)) if delete_home: restore_home(home, username) else: print_debug("Not restoring home...") print_debug("show_login() returning '%s'"%username) print username def read_exe_output(cmd, verbose=0): print_debug("read_exe_output() cmd='%s'"%cmd) p = Popen(cmd, shell=True, bufsize=0, stdout=PIPE, stderr=STDOUT, close_fds=True) output=[] for line in p.stdout.readlines(): if line != '\n': line=line.replace('\n', '') output.append(line) print_debug("read_exe_output() output=%s"%output) if len(output) == 0: return "" elif len(output) >= 1: if verbose==1: print_debug ( "read_exe_output(%s) %s" %(cmd, output) ) return output return [] def restore_home(home, username): if noaction: print_debug("NOACTION: restore_home() home=%s username=%s" %(home,username) ) return if not os.path.isfile(HOME_TEMPLATE): print_debug ( "skel don't exists: %s" %(HOME_TEMPLATE) ) return # umount all fuse devices if int(read_exe_output("grep -c \"%s\" /proc/mounts" %(home) )[0] ) > 0: print_debug("user %s have fuse mounted devices" %(username) ) for mount_dev in read_exe_output("grep \"%s\" /proc/mounts | awk '{print $2}'" %(home) ): print_debug("umounting %s" %(mount_dev) ) execmd("fusermount -u %s" %(mount_dev) ) execmd("rm -rf %s 2>/dev/null" %(home) ) try: os.mkdir(home) except: pass execmd("tar -zxf %s -C %s 2>/dev/null" %(HOME_TEMPLATE, home) ) execmd("chown -R %s:%s %s 2>/dev/null" %(username, username, home) ) def SetVar(section, key, value): GDMCONF=GDM_CONF_FILE # try to edit correct file (Ubuntu use -custom file) if os.path.isfile(GDM_CONF_FILE + "-custom"): GDMCONF=GDM_CONF_FILE+"-custom" if noaction: print_debug("NOACTION: SetVar() gdm.conf=%s section=%s key=%s value=%s" %(GDMCONF, section,key,value) ) return config=MyConfigObj( os.path.realpath(GDMCONF) ) print_debug("setting section=[%s] key=%s value=%s" %(section, key, value) ) config[section][key] = value try: config.write() except: print "Error, can't write in %s" %(GDMCONF) def SetAutologin(): for section in TCOS_GDM: for var in TCOS_GDM[section]: for key in var: value=var[key] SetVar(section, key, value) print ("gdm config file edited") return def AddUserAndHost(): hosts=[] ips=[] prefix=raw_input("Please input the common prefix of hosts/users (example host): ") ipbase=raw_input("Need network IP Address of thin clients (example 192.168.0): ") number=int(raw_input("Number of host/users to generate (number): ")) fromip=int( raw_input("Start generating from (default 1): ") ) if fromip == "" : fromip = 1 for i in range(fromip,number+fromip): hosts.append("%s%s" %(prefix, i)) ips.append("%s.%s" %(ipbase, i)) print "" print "I will generate users and hostnames from \"%s\" to \"%s\"" %(hosts[0], hosts[-1]) print "with ip adresses from %s to %s" %(ips[0], ips[-1]) if os.path.isfile(HOME_TEMPLATE): print "and uncompress \"%s\" as HOME_TEMPLATE" %(HOME_TEMPLATE) else: print "and **** I'M NOT USING ANY HOME TEMPLATE ****" print "Cancel now and create %s using a template user" %(HOME_TEMPLATE) print "" resp=raw_input("Are you sure to continue? [y/n] ") if resp != "y" and resp != "Y": print "cancelled." return for i in range(fromip,number+fromip): AddUser( "%s%s" %(prefix, i) ) AddHost( "%s%s" %(prefix, i) , "%s.%s" %(ipbase, i) ) print "done." def AddUser(username): print ( "Adding user: %s" %(username) ) execmd("useradd -m %s -p%s -s /bin/bash -d /home/%s" %(username, username, username)) execmd("echo %s:%s | chpasswd" %(username, username)) execmd("tar -zxf %s -C /home/%s 2>/dev/null" %(HOME_TEMPLATE, username) ) execmd("chown %s:%s /home/%s " %(username, username, username) ) for group in USER_GROUPS: execmd("adduser %s %s" %(username, group)) def AddHost(hostname, ip): # check if exists f=open("/etc/hosts", "r") data=f.readlines() f.close() for line in data: line=line.replace('\n','') if ip + " " in line or ip + '\t' in line: print ( "IP %s is in /etc/hosts" %(ip) ) return try: print ("Adding %s %s" %(ip, hostname) ) if noaction: print_debug("NOACTION: AddHost() hostname=%s, ip=%s" %(hostname,ip) ) else: f=open("/etc/hosts", "a") f.write("%s\t%s\n" %(ip, hostname) ) f.close() except: print "Error editting /etc/hosts, are you root?" pass try: if configure: SetAutologin() elif add: AddUserAndHost() else: show_login() except KeyboardInterrupt: # Por si se pulsa Ctrl+C print "\nCtrl+C event, quit now..." sys.exit(1) # end of file tcos-0.89.93ubuntu2/ssl/0000775000000000000000000000000012260610427011672 5ustar tcos-0.89.93ubuntu2/ssl/tcos_ca.crt0000664000000000000000000000211712260610261014014 0ustar -----BEGIN CERTIFICATE----- MIIDATCCAmqgAwIBAgIJAIuuKgWsLaMqMA0GCSqGSIb3DQEBBQUAMF8xCzAJBgNV BAYTAkVTMQ0wCwYDVQQIEwRUQ09TMQ0wCwYDVQQHEwRUQ09TMQ0wCwYDVQQKEwRU Q09TMSMwIQYJKoZIhvcNAQkBFhR0Y29zQHRjb3Nwcm9qZWN0Lm9yZzAeFw0xMDA0 MjYxMjM3MjJaFw0yMDA0MjMxMjM3MjJaMF8xCzAJBgNVBAYTAkVTMQ0wCwYDVQQI EwRUQ09TMQ0wCwYDVQQHEwRUQ09TMQ0wCwYDVQQKEwRUQ09TMSMwIQYJKoZIhvcN AQkBFhR0Y29zQHRjb3Nwcm9qZWN0Lm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAw gYkCgYEAzYac6lIu/Ee6aVkD4ksnUWdL+ptYpjtRK8yxv/xJkPB4KGQl7KEF9rLh RewxhgMfFiJ1nAioJ8OEOZoOFHNbIQCoAexVSESvYS5dMD55nXrCyeUfGzgyv2lN XaVS3UcbPZ/DSnFI/A8EIvohsdd5yx63dJ5K/dPl/WnK0nbmhhECAwEAAaOBxDCB wTAdBgNVHQ4EFgQUj9qm1jRZ5GoLiEGbzoV+2Aqv+T4wgZEGA1UdIwSBiTCBhoAU j9qm1jRZ5GoLiEGbzoV+2Aqv+T6hY6RhMF8xCzAJBgNVBAYTAkVTMQ0wCwYDVQQI EwRUQ09TMQ0wCwYDVQQHEwRUQ09TMQ0wCwYDVQQKEwRUQ09TMSMwIQYJKoZIhvcN AQkBFhR0Y29zQHRjb3Nwcm9qZWN0Lm9yZ4IJAIuuKgWsLaMqMAwGA1UdEwQFMAMB Af8wDQYJKoZIhvcNAQEFBQADgYEAUxQ0TwQhct8Bf7tccMS19TCNXQwoTpwXc8hh y9A2rOZ/9v1Uz66B05NsbiwrDvndLxEQl+oRgLiO0/Lby+RfmtWeMfEKS5T1Qo0s duDlsLl91a+OBwb49UUqhDrGnf2E39TM4lpepIVqkrVXzjGgdcYJeti+8MFlwvHi UkzRt3s= -----END CERTIFICATE----- tcos-0.89.93ubuntu2/ssl/tcos_server.pem0000664000000000000000000000371212260610261014732 0ustar -----BEGIN CERTIFICATE----- MIIDATCCAmqgAwIBAgIJAIuuKgWsLaMqMA0GCSqGSIb3DQEBBQUAMF8xCzAJBgNV BAYTAkVTMQ0wCwYDVQQIEwRUQ09TMQ0wCwYDVQQHEwRUQ09TMQ0wCwYDVQQKEwRU Q09TMSMwIQYJKoZIhvcNAQkBFhR0Y29zQHRjb3Nwcm9qZWN0Lm9yZzAeFw0xMDA0 MjYxMjM3MjJaFw0yMDA0MjMxMjM3MjJaMF8xCzAJBgNVBAYTAkVTMQ0wCwYDVQQI EwRUQ09TMQ0wCwYDVQQHEwRUQ09TMQ0wCwYDVQQKEwRUQ09TMSMwIQYJKoZIhvcN AQkBFhR0Y29zQHRjb3Nwcm9qZWN0Lm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAw gYkCgYEAzYac6lIu/Ee6aVkD4ksnUWdL+ptYpjtRK8yxv/xJkPB4KGQl7KEF9rLh RewxhgMfFiJ1nAioJ8OEOZoOFHNbIQCoAexVSESvYS5dMD55nXrCyeUfGzgyv2lN XaVS3UcbPZ/DSnFI/A8EIvohsdd5yx63dJ5K/dPl/WnK0nbmhhECAwEAAaOBxDCB wTAdBgNVHQ4EFgQUj9qm1jRZ5GoLiEGbzoV+2Aqv+T4wgZEGA1UdIwSBiTCBhoAU j9qm1jRZ5GoLiEGbzoV+2Aqv+T6hY6RhMF8xCzAJBgNVBAYTAkVTMQ0wCwYDVQQI EwRUQ09TMQ0wCwYDVQQHEwRUQ09TMQ0wCwYDVQQKEwRUQ09TMSMwIQYJKoZIhvcN AQkBFhR0Y29zQHRjb3Nwcm9qZWN0Lm9yZ4IJAIuuKgWsLaMqMAwGA1UdEwQFMAMB Af8wDQYJKoZIhvcNAQEFBQADgYEAUxQ0TwQhct8Bf7tccMS19TCNXQwoTpwXc8hh y9A2rOZ/9v1Uz66B05NsbiwrDvndLxEQl+oRgLiO0/Lby+RfmtWeMfEKS5T1Qo0s duDlsLl91a+OBwb49UUqhDrGnf2E39TM4lpepIVqkrVXzjGgdcYJeti+8MFlwvHi UkzRt3s= -----END CERTIFICATE----- -----BEGIN RSA PRIVATE KEY----- MIICXwIBAAKBgQDNhpzqUi78R7ppWQPiSydRZ0v6m1imO1ErzLG//EmQ8HgoZCXs oQX2suFF7DGGAx8WInWcCKgnw4Q5mg4Uc1shAKgB7FVIRK9hLl0wPnmdesLJ5R8b ODK/aU1dpVLdRxs9n8NKcUj8DwQi+iGx13nLHrd0nkr90+X9acrSduaGEQIDAQAB AoGBAJFvuIp4LZeIinkR7JWt6NzJ5BIq68h2ITKFXyMkPEq8X8r1U4DnUXkJjDAW u9TBULYxHFiWJ6g7ys2YHm6KUuj5fdW6oDqtAZCCVH3pFeUk/tot8BcpPavTUT0S 8QIgNhd8L77gTROTFYlKMYxpX6Ja3ihXQ9W2BTO+O6ICVjwhAkEA/S2ntzwE9F5s 1YzuMzz3fbRN28NkzZEROiIGYGoCcMuc5uvI5RpaWHikxn/QKWHQU40jzLsIyeSE Y1Jb6MsrCwJBAM/RAAdQsxmT3ywjrSWrD2JiLHn/9mXsgURtRVEbydQaD/6evhd8 0au4KNck3r/S75AemGrdkHmKL01O0XL9pNMCQQDywmwmji5SAphoy5E7ICJPLivZ pSlq0sap7yYeHIfqj9IKudsPko0+d6/HhZabl2aiNps1G8H5lFw8wCPQu76xAkEA xlDvkwuK7rSze37MRC8a7ks7oG0IaTmqHm+cf4tiLnt0mgpI40clG5cRukYgH7Sf EsxvrUOlFKcu/rphnDe7KwJBAOiDKIl1MePeqfG6F6G2i98q1pJyq0dpUm+KdZ1z fRcifVBNsjm83o4KJ/iq90BCQ2Wnu8/7ve41N3mn4/myU/I= -----END RSA PRIVATE KEY----- tcos-0.89.93ubuntu2/ssl/tcos_dh1024.pem0000664000000000000000000000036512260610261014327 0ustar -----BEGIN DH PARAMETERS----- MIGHAoGBAK7b2ePRuBumzBexJ8P0ctVhdTLMQuv4sFVuCLjKwThh8VYzXTJOGk8v NwYTeSl2jco6ooikkPDArzyKXAETE+qkpmgWFTt/ZsDbKJAsfIFZ0/MCN+tZqLvM Osw+a5G7eAoQGe5r4y/LBiA8ghaROw1L0bB6YtY5deuiNZvfOAGjAgEC -----END DH PARAMETERS----- tcos-0.89.93ubuntu2/GPL0000664000000000000000000004310312260610261011433 0ustar GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. tcos-0.89.93ubuntu2/REMOTEFS0000664000000000000000000000313212260610261012233 0ustar ############################################### Howto Remote filesystem in TCOS ############################################### 1.- Using LTSPFS 2.- Using SHFS 3.- Using SAMBA 4.- Using NFS =================== 1.- Using LTSPFS =================== LTSPFS is a remote protocol to mount devices (or dirs) into local filesystem. LTSPFS use X-Windows autentication protocol. (as root) # adduser USER fuse (as $USER) $ mkdir $HOME/Desktop/Device (as $USER) $ ltspfs terminal:/mnt/DEVICE/ $HOME/Desktop/Device =================== 2.- Using SHFS =================== SHFS is a method to mount remote filesystem throught ssh protocol. Install: In server, exec this: # apt-get install module-assistant linux-headers-$(uname -r) # m-a prepare # m-a a-i fuse # m-a a-i shfs The shfs-module-2.x.x will install shfs-utils package, set suid to YES when ask. In user startup session add tcos-shfsmount Gnome: Click in System --> Preferences --> Sessions In startup add "tcos-shfsmount" KDE: Add a symlink in .kde/Autostart/ ln -s /usr/bin/tcos-shfsmount /home/USERNAME/.kde/Autostart/ XFCE: can use Desktop/Autostart/ folder same as kde or in xfce4.4 use the startups preferences dialog To umount, and clean you can use something like this: GDM: You can add a line in /etc/gdm/PostSession/Default after PATH declaration. /usr/bin/tcos-shfsumount KDM: FIXME, not know =================== 3.- Using SAMBA =================== FIXME, samba deprecated in TCOS =================== 4.- Using NFS =================== FIXME, nfs write some info tcos-0.89.93ubuntu2/TODO0000664000000000000000000000060612260610261011557 0ustar TODO for TCOS images ==================== * Make better help screens (using pxelinux or isolinux) * Configure personalized boot options with ip, cmdline, dhcp or both. * IMPORTANT Network swaping for thin clients < 40 Mb RAM * IMPORTANT make pulseaudio works with Xcookies and not allowing from ip. * See at VirtualGL performance: http://www.virtualgl.org/Documentation/Version20 tcos-0.89.93ubuntu2/README.cache0000664000000000000000000000140612260610261013010 0ustar ########################################## TCOS packages cache ########################################## In many distros the package system have conflicts dependencies. TCOS need some packages that conflicts, for example esound and pulseaudio-esound-compat. To have all files at image build time, I have made a small ugly trick: Uncompress debian packages into /var/cache/tcos/packages/PKG_NAME/ and copy from this dir to initramfs images. Example: # gentcos -instpkg libesd0 This will download libesd-x-x-x.deb and uncompress into /var/cache/tcos/packages/libesd0/ For downloading we search URI with apt-get --print-uris install -y -f libesd0 # gentcos -listpkgs will show all cache packages installed. tcos-0.89.93ubuntu2/GPL-header0000664000000000000000000000134212260610261012660 0ustar Copyright (C) 2006,2006,2008 mariodebian at gmailcom This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. tcos-0.89.93ubuntu2/lockscreen/0000775000000000000000000000000012260610427013221 5ustar tcos-0.89.93ubuntu2/lockscreen/lockvlc.c0000664000000000000000000001364112260610261015023 0ustar /* * lockvlc.c * Copyright (C) 2006,2007,2008 mariodebian at gmail * Copyright (C) 2008 vidal_joshur at gva.es * * This file is based on screen-locker of iTALC project: * screen_locker.c - screen-locker, which is part of the iTALC client-software * * iTALC/Client-software * Copyright (c) 2004-2005 Tobias Doerffel * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include int setenv(const char *name, const char *value, int overwrite); #define AllPointerEventMask \ (ButtonPressMask | ButtonReleaseMask | \ EnterWindowMask | LeaveWindowMask | \ PointerMotionMask | PointerMotionHintMask | \ Button1MotionMask | Button2MotionMask | \ Button3MotionMask | Button4MotionMask | \ Button5MotionMask | ButtonMotionMask | \ KeymapStateMask) /* TODO: don't use X-Athena-Widgets (xaw)*/ int main (int argc, char **argv) { XtResource desktopBackingStoreResources[] = { { XtNbackingStore, XtCBackingStore, XtRBackingStore, sizeof(int), 0, XtRImmediate, (XtPointer) Always, }, }; Display * display; /*Visual * vis;*/ XSetWindowAttributes attr; unsigned long valuemask; int count = 0; Pixmap src, msk; XColor fg, bg; Widget toplevel; Dimension displayWidth, displayHeight; Cursor blankcursor; Widget form, viewport, desktop; Window desktop_win; char srcBits[] = { 0,0,0,0,0 }; char mskBits[] = { 0,0,0,0,0 }; setenv("XLIB_SKIP_ARGB_VISUALS", "1", 1); /* Call the main Xt initialisation function. It parses command-line options, generating appropriate resource specs, and makes a * connection to the X display. */ toplevel = XtVaAppInitialize(NULL, "ScreenLocker", NULL, 0, &argc, argv, NULL, XtNborderWidth, 0, NULL); display = XtDisplay(toplevel); (void)DefaultVisual(display, DefaultScreen(display)); displayWidth = WidthOfScreen(DefaultScreenOfDisplay(display)); displayHeight = HeightOfScreen(DefaultScreenOfDisplay(display)); /* full screen - set position to 0,0, but defer size calculation until widgets are realized */ XtVaSetValues(toplevel, XtNoverrideRedirect, True, XtNgeometry, "+0+0", NULL); form = XtVaCreateManagedWidget("form", formWidgetClass, toplevel, XtNborderWidth, 0, XtNdefaultDistance, 0, NULL); viewport = XtVaCreateManagedWidget("viewport", viewportWidgetClass, form, XtNborderWidth, 0, NULL); desktop = XtVaCreateManagedWidget("desktop", coreWidgetClass, viewport, XtNborderWidth, 0, NULL); XtVaSetValues(desktop, XtNwidth, displayWidth, XtNheight, displayHeight, NULL); /* "Realize" all the widgets, i.e. actually create and map their X windows */ XtRealizeWidget(toplevel); /* We want to stop the window manager from managing our toplevel window. This is not really a nice thing to do, so may not work * properly with every window manager. We do this simply by setting overrideRedirect and reparenting our window to the root. * The window manager will get a ReparentNotify and hopefully clean up its frame window. */ XtVaSetValues(toplevel, XtNoverrideRedirect, True, NULL); XReparentWindow(display, XtWindow(toplevel), DefaultRootWindow(display), 0, 0); /* attempt to resize it, then ask "form" to manage it again. */ XtResizeWidget(toplevel, 1, 1, 0); desktop_win = XtWindow(desktop); src = XCreateBitmapFromData(display, DefaultRootWindow(display), srcBits, 5, 5); msk = XCreateBitmapFromData(display, DefaultRootWindow(display), mskBits, 5, 5); XAllocNamedColor(display, DefaultColormap(display,DefaultScreen(display)), "black", &fg, &fg); XAllocNamedColor(display, DefaultColormap(display,DefaultScreen(display)), "white", &bg, &bg); blankcursor = XCreatePixmapCursor(display, src, msk, &fg, &bg, 2, 2); XFreePixmap(display, src); XFreePixmap(display, msk); XtVaGetApplicationResources(desktop, (XtPointer)&attr.backing_store, desktopBackingStoreResources, 1, NULL); valuemask = CWBackingStore; attr.cursor = blankcursor; valuemask |= CWCursor; XChangeWindowAttributes(display, desktop_win, valuemask, &attr); /* Try to get the input focus. */ XSetInputFocus(display, DefaultRootWindow(display), RevertToPointerRoot, CurrentTime); /* Try to dont allow screensaver to activate */ XForceScreenSaver(display, (int) ScreenSaverReset); while (count < 5) { if (XSetScreenSaver(display, 0, 0, (int) DontPreferBlanking, (int) DontAllowExposures) != BadValue ) { break; } printf ("lockvlc::screensaver Could not disable screensaver, Badvalue=%d Count=%d.\n", BadValue, count); sleep (1); count++; } XUngrabKeyboard(display, CurrentTime); XUngrabPointer(display, CurrentTime); count=0; /* now grab keyboard and mouse */ while (count < 5) { if (XtGrabKeyboard(toplevel, True, GrabModeAsync, GrabModeAsync, CurrentTime) != GrabSuccess || XtGrabPointer(toplevel, True, (unsigned int) AllPointerEventMask, GrabModeAsync, GrabModeAsync, None, blankcursor, CurrentTime) != GrabSuccess) { printf ("lockvlc::keybmouse Could not grab keyboard and mouse, Count=%d.\n", count); sleep (1); count++; } else { break; } } #ifndef DEBUG while (1) { /* wait in a loop */ sleep (5); } #else sleep(3); printf("DEBUG: quiting...\n"); #endif return (0); } tcos-0.89.93ubuntu2/lockscreen/Makefile0000664000000000000000000000366712260610261014671 0ustar LOCK = lockscreen XRES = screensize LOCKVNC = lockvnc LOCKVLC = lockvlc WAITFORX = waitforX SOURCES = lockscreen2.c XRES_SOURCES = screensize.c LOCKVNC_SOURCES = lockvnc.c LOCKVLC_SOURCES = lockvlc.c WAITFORX_SOURCES = waitforX.c GXD=get-xdg-desktop GXD_SOURCES=get-xdg-desktop.c GXD_OPTS=$(CFLAGS) $(LDFLAGS) -ansi -pedantic -Wall $(shell pkg-config --cflags --libs glib-2.0) LOCKLIBS+=$(shell pkg-config --libs imlib2) CFLAGS+=$(shell pkg-config --cflags imlib2) LDADD+=$(LDFLAGS) -ansi -pedantic -Wall -lXaw $(CFLAGS) -lX11 -lXext -lXt LDADD_WAITFORX+=$(LDFLAGS) -ansi -pedantic -Wall -lX11 CC=gcc all: $(LOCK) $(XRES) $(LOCKVNC) $(LOCKVLC) $(WAITFORX) $(GXD) include ../common.mk $(LOCK): $(QUIET_CC)$(CC) $(SOURCES) $(LOCKLIBS) $(LDADD) -o $(LOCK) $(XRES): $(QUIET_CC)$(CC) $(XRES_SOURCES) $(LDADD) -o $(XRES) $(LOCKVNC): $(QUIET_CC)$(CC) $(LOCKVNC_SOURCES) $(LDADD) -o $(LOCKVNC) $(LOCKVLC): $(QUIET_CC)$(CC) $(LOCKVLC_SOURCES) $(LDADD) -o $(LOCKVLC) $(WAITFORX): $(QUIET_CC)$(CC) $(WAITFORX_SOURCES) $(LDADD_WAITFORX) -o $(WAITFORX) $(GXD): $(QUIET_CC)$(CC) $(GXD_SOURCES) $(GXD_OPTS) -o $(GXD) clean: $(QUIET_CL)rm -f $(LOCK) $(XRES) $(LOCKVNC) $(LOCKVLC) $(WAITFORX) $(GXD) *~ debug: clean $(CC) $(WAITFORX_SOURCES) $(LDADD_WAITFORX) -o $(WAITFORX) -DDEBUG=1 $(CC) $(SOURCES) $(LOCKLIBS) $(LDADD) -o $(LOCK) -DDEBUG=1 $(CC) $(LOCKVNC_SOURCES) $(LDADD) -o $(LOCKVNC) -DDEBUG=1 $(CC) $(LOCKVLC_SOURCES) $(LDADD) -o $(LOCKVLC) -DDEBUG=1 install: mkdir -p $(DESTDIR)/$(TCOS_BINS) mkdir -p $(DESTDIR)/$(PREFIX)/share/tcos-core/ install -m 755 $(LOCK) $(DESTDIR)/$(TCOS_BINS)/ install -m 755 $(XRES) $(DESTDIR)/$(TCOS_BINS)/ install -m 755 $(LOCKVNC) $(DESTDIR)/$(TCOS_BINS)/ install -m 755 $(LOCKVLC) $(DESTDIR)/$(TCOS_BINS)/ install -m 755 $(WAITFORX) $(DESTDIR)/$(TCOS_BINS)/ install -m 755 $(GXD) $(DESTDIR)/$(TCOS_BINS)/ install -m 644 lockscreen.png $(DESTDIR)/$(PREFIX)/share/tcos-core/lockscreen.png tcos-0.89.93ubuntu2/lockscreen/lockscreen2.c0000664000000000000000000002417512260610261015604 0ustar /* * lockscreen2.c * Copyright (C) 2006,2007,2008 mariodebian at gmail * Copyright (C) 2008 vidal_joshur at gva.es * * This file is based on screen-locker of iTALC project: * screen_locker.c - screen-locker, which is part of the iTALC client-software * * iTALC/Client-software * Copyright (c) 2004-2005 Tobias Doerffel * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include "X11/extensions/shape.h" #include #ifndef LOCKSCREEN_IMAGE #define LOCKSCREEN_IMAGE "/usr/share/tcos-core/lockscreen-custom.png" #endif #ifndef LOCKSCREEN_IMAGE_TCOS #define LOCKSCREEN_IMAGE_TCOS "/usr/share/tcos-core/lockscreen.png" #endif int setenv(const char *name, const char *value, int overwrite); #include int file_exists (char * fileName) { struct stat buf; int i = stat ( fileName, &buf ); /* File found */ if ( i == 0 ) return 1; return 0; } #define AllPointerEventMask \ (ButtonPressMask | ButtonReleaseMask | \ EnterWindowMask | LeaveWindowMask | \ PointerMotionMask | PointerMotionHintMask | \ Button1MotionMask | Button2MotionMask | \ Button3MotionMask | Button4MotionMask | \ Button5MotionMask | ButtonMotionMask | \ KeymapStateMask) int main (int argc, char **argv) { XtResource desktopBackingStoreResources[] = { { XtNbackingStore, XtCBackingStore, XtRBackingStore, sizeof(int), 0, XtRImmediate, (XtPointer) Always, }, }; Display * display; /*Visual * vis;*/ XSetWindowAttributes attr; unsigned long valuemask; int count = 0; Pixmap src, msk; XColor fg, bg; int blackColor; GC gc; Widget toplevel; Dimension displayWidth, displayHeight; Cursor blankcursor; Widget form, viewport, desktop; Window desktop_win; char srcBits[] = { 0,0,0,0,0 }; char mskBits[] = { 0,0,0,0,0 }; Imlib_Image *image; Pixmap pixmap, mask; int image_x, image_y, rc; int screen, depth; setenv("XLIB_SKIP_ARGB_VISUALS", "1", 1); /* Call the main Xt initialisation function. It parses command-line options, generating appropriate resource specs, and makes a * connection to the X display. */ toplevel = XtVaAppInitialize(NULL, "ScreenLocker", NULL, 0, &argc, argv, NULL, XtNborderWidth, 0, NULL); display = XtDisplay(toplevel); (void)DefaultVisual(display, DefaultScreen(display)); displayWidth = WidthOfScreen(DefaultScreenOfDisplay(display)); displayHeight = HeightOfScreen(DefaultScreenOfDisplay(display)); screen = DefaultScreen(display); depth = DefaultDepth(display, screen); /* full screen - set position to 0,0, but defer size calculation until widgets are realized */ XtVaSetValues(toplevel, XtNoverrideRedirect, True, XtNgeometry, "+0+0", NULL); form = XtVaCreateManagedWidget("form", formWidgetClass, toplevel, XtNborderWidth, 0, XtNdefaultDistance, 0, NULL); viewport = XtVaCreateManagedWidget("viewport", viewportWidgetClass, form, XtNborderWidth, 0, NULL); desktop = XtVaCreateManagedWidget("desktop", coreWidgetClass, viewport, XtNborderWidth, 0, NULL); XtVaSetValues(desktop, XtNwidth, displayWidth, XtNheight, displayHeight, NULL); /* "Realize" all the widgets, i.e. actually create and map their X windows */ XtRealizeWidget(toplevel); /* We want to stop the window manager from managing our toplevel window. This is not really a nice thing to do, so may not work * properly with every window manager. We do this simply by setting overrideRedirect and reparenting our window to the root. * The window manager will get a ReparentNotify and hopefully clean up its frame window. */ XtVaSetValues(toplevel, XtNoverrideRedirect, True, NULL); XReparentWindow(display, XtWindow(toplevel), DefaultRootWindow(display), 0, 0); /* Now we want to fix the size of "viewport". We shouldn't just change it directly. * Instead we set "toplevel" to the required size (which should propagate through "form" to "viewport"). * Then we remove "viewport" from being managed by "form", change its resources to position it and make sure that "form" won't * attempt to resize it, then ask "form" to manage it again. */ XtResizeWidget(toplevel, displayWidth, displayHeight, 0); XtUnmanageChild(viewport); XtVaSetValues(viewport, XtNhorizDistance, 0, XtNvertDistance, 0, XtNleft, XtChainLeft, XtNright, XtChainLeft, XtNtop, XtChainTop, XtNbottom, XtChainTop, NULL); XtManageChild(viewport); /* Now we can set "toplevel" to its proper size. */ XtResizeWidget(toplevel, displayWidth, displayHeight, 0); /*image = XCreateImage(display, vis, 32, ZPixmap, 0, NULL, 2000, 2000, BitmapPad(display), 0);*/ blackColor = BlackPixel(display, DefaultScreen(display)); desktop_win = XtWindow(desktop); gc = XCreateGC(display, desktop_win, 0, NULL); if ( file_exists (LOCKSCREEN_IMAGE) || file_exists(LOCKSCREEN_IMAGE_TCOS) ) { imlib_context_set_display(display); imlib_context_set_visual(DefaultVisual(display, DefaultScreen(display))); imlib_context_set_colormap(DefaultColormap(display, DefaultScreen(display))); imlib_set_color_usage(128); imlib_context_set_dither(1); if ( file_exists(LOCKSCREEN_IMAGE) ) { printf("loading custom image %s...\n", LOCKSCREEN_IMAGE); image=imlib_load_image(LOCKSCREEN_IMAGE); } else { printf("loading TCOS image %s...\n", LOCKSCREEN_IMAGE_TCOS); image=imlib_load_image(LOCKSCREEN_IMAGE_TCOS); } imlib_context_set_image(image); image_x = imlib_image_get_width(); image_y = imlib_image_get_height(); printf("image x=%d y=%d displayWidth=%d displayHeight=%d\n", image_x, image_y, displayWidth, displayHeight); pixmap = XCreatePixmap(display, desktop_win, displayWidth, displayHeight, depth); imlib_context_set_drawable(desktop_win); imlib_render_image_on_drawable_at_size(0, 0, displayWidth, displayHeight); imlib_render_pixmaps_for_whole_image_at_size(&pixmap, &mask, displayWidth, displayHeight); rc = XSetWindowBackgroundPixmap(display, desktop_win, pixmap ); switch (rc) { case BadMatch: fprintf(stderr, "XSetWindowBackgroundPixmap - BadMatch.\n"); exit(1); break; case BadPixmap: fprintf(stderr, "XSetWindowBackgroundPixmap - BadPixmap.\n"); exit(1); break; case BadWindow: fprintf(stderr, "XSetWindowBackgroundPixmap - BadWindow.\n"); exit(1); break; } if (mask) { XShapeCombineMask(display, desktop_win, ShapeBounding, 0, 0, mask, ShapeSet); } XMapWindow(display, desktop_win); XSetForeground(display, gc, blackColor); XFillRectangle( display, pixmap, gc, 0, 0, displayWidth, displayHeight ); if (image) imlib_free_image(); if(pixmap) XFreePixmap(display, pixmap); if(pixmap) imlib_free_pixmap_and_mask(pixmap); pixmap = None; if(gc) XFreeGC(display, gc); } else { /* Tell the GC we draw using the black color*/ printf("file %s not exists!!\n", LOCKSCREEN_IMAGE); XSetForeground(display, gc, blackColor); XFillRectangle(display, desktop_win, gc, 0, 0, displayWidth, displayHeight); } src = XCreateBitmapFromData(display, DefaultRootWindow(display), srcBits, 5, 5); msk = XCreateBitmapFromData(display, DefaultRootWindow(display), mskBits, 5, 5); XAllocNamedColor(display, DefaultColormap(display,DefaultScreen(display)), "black", &fg, &fg); XAllocNamedColor(display, DefaultColormap(display,DefaultScreen(display)), "white", &bg, &bg); blankcursor = XCreatePixmapCursor(display, src, msk, &fg, &bg, 2, 2); XFreePixmap(display, src); XFreePixmap(display, msk); XtVaGetApplicationResources(desktop, (XtPointer)&attr.backing_store, desktopBackingStoreResources, 1, NULL); valuemask = CWBackingStore; attr.cursor = blankcursor; valuemask |= CWCursor; XChangeWindowAttributes(display, desktop_win, valuemask, &attr); /* Try to get the input focus. */ XSetInputFocus(display, DefaultRootWindow(display), RevertToPointerRoot, CurrentTime); /* Try to dont allow screensaver to activate */ XForceScreenSaver(display, (int) ScreenSaverReset); while (count < 5) { if (XSetScreenSaver(display, 0, 0, (int) DontPreferBlanking, (int) DontAllowExposures) != BadValue ) { break; } printf ("lockscreen::screensaver Could not disable screensaver, Badvalue=%d Count=%d.\n", BadValue, count); sleep (1); count++; } XUngrabKeyboard(display, CurrentTime); XUngrabPointer(display, CurrentTime); count=0; /* now grab keyboard and mouse */ while (count < 5) { if (XtGrabKeyboard(toplevel, True, GrabModeAsync, GrabModeAsync, CurrentTime) != GrabSuccess || XtGrabPointer(toplevel, True, (unsigned int) AllPointerEventMask, GrabModeAsync, GrabModeAsync, None, blankcursor, CurrentTime) != GrabSuccess) { printf ("lockscreen::keybmouse Could not grab keyboard and mouse, Count=%d.\n", count); sleep (1); count++; } else { break; } } #ifndef DEBUG while (1) { /* wait in a loop */ sleep (5); } #else sleep(3); printf("DEBUG: quiting...\n"); #endif XCloseDisplay(display); return(0); } tcos-0.89.93ubuntu2/lockscreen/get-xdg-desktop.c0000664000000000000000000000173512260610261016375 0ustar /* * get-user-desktop.c * Copyright (C) 2010 mariodebian at gmail * * Return user Desktop dir based on XDG USER DIRS * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include int main (int argc, char **argv) { printf("%s\n", g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP) ); return 0; } tcos-0.89.93ubuntu2/lockscreen/lockscreen.png0000664000000000000000000074046212260610261016070 0ustar PNG  IHDR bKGD pHYs B(xtIME([ IDATxJ,@&){o>3@~A{.L2J*TZRQ/ _:ָGoDTruhWq>(oʾSu,:N뜻%o t͔q8Sc6>V<-SݤcM iQ;N-r#Ddj w?c6}v9L48>nǔt=SbD~o2qG1α~Wq] O/;'m>MG \I&|?2.x3ΰDڎN'4ᦴLMYf&ӓi.YRxL=sHY<<kzM: @4O1Y?ZD+$- EVᲗDh<@ g&Ĕt;\fl?Dnk4`IIqOVNb Dsw[5 (jYyxͭOF|@S3ܹGLYwDL#H\ߟ3I OdI NhBئx4g|P.+ǔ}sL\0SE$ǚ$乃-iqZI˖XG1sn/Rݣ<7$)^=(٥ԹIIe &/Oœl<*ҠU &mEBk>AZ$cRǓr{e:#ӤNri݇2#ZcoB1 ρg#)2͍SY>Ru8zhx?^s)eSb_VyAgyPdm"i>mwXF<pwX?>ofL(p>`V&Ʃ$ #A^_d<>yvitihFS.9fًn<}g1|rwOKlbywX#۝7' ='%H{ ,':|x ֌sr PƤ&^OWh%sxOR0jzw؎؝!E^5;,uOUrߝwg{5@&dUta.M$wZwg}DexMi]@ۜN>v{3'; HK\_Yvgm%H`1ٝh vguH`Y$dx$'( Pd3k Z3 } g ۄid'3 O3 ٠mwxNS Pڝʃ@myWp Zھ3x惶܈9t9:,ޤ՜>O"E`5liȽEyIұ;cW;$EvgW!EJ%$@x[ӚD]kJ\,-t:Ў84a0OqX hG;5&W8JZiQ,McR,xi";Kz 0x|%giw(KW&2be1yzOf|6O ps:Ȣs7N; "7;6t{LJoV$V)MlRd 0"J =)R* xڊ(Ot<3@x&%A[$ֶ3J3,[:M`;Ѳ1YYE&BdXibٵ$&w>%H 0J`w(Cֱ; ;,3J1Y(^`. B$t~9 Ŀ gBOOҢkuwL cw mBb;;&3:nwxN<eysr3JK{bfp5ü(/ 0 \ϊJ w]xZ0%.>8t%=öȲvm pI 0 -+SxVٝVKHnw(~3`+gY! rx6 pO`qceqaT|n &KWL_I9YܕFHtc-o$2Y@&'Jg`3ж;OEVmI`w(sWyR<;Fe1B]*R><x6 :0X~-~-NEe PDpzp.߀K8," 8~^ vge`+%@ 0=&J"i>Yݨ`wX;^ֿ9F$@$[>?`$u<qߧou2HR>u"d83<;i8_` YOLJ=ǔ eF}|Ls k %wmg¿8:?zu:V8X2)FT/^)Rܡ33xNeOnKaQ`$0'1]+A.mwX<_  -9b_ HI$A{DZ¿E@I7GSeT&Hg WmwO*M,Kl b|P \xxz 4w97 R an;lvgDR;"vgEnw(~3C|=@m( &X*9 $[D\TX*:+kWMuT` a@"!>h<hCVX :W!nu|ޝdx@)# @_@Zv~C-A@'4F':|<9?H`xڝ6m3mҲ/ x*2%&K2Xg䵝=zO k'2lJPqƤڢ6&~SeP_ -~Ռ,  t` 0]f8h+A|9g 4 :#3D34@c6}clsyxn){߽Ϟ1BSǭ.+֩uL1n6M:~w6:f1(xL\뵔PV)#6jJlئQ)97&s \igӤBcT|m}OC|_ɕ?+/O SJc'`n?#bP g% S<跙 Xbxx ZSmro>'{[;?2'2&#qDH;+1ˎ:kԲV89 ^O٦Qn>[CM dV<}vm|}I$4*nx S%[ڥ Fm3I]nc IT =R$). __qZA[m{o,q>\IgS,O"r=ݾg%`NW`r L^<%8XD+@?ߓ#vzBMD~$NR~G.Wj8ZƛNH t $19O 7߷^?$LXf)m+`5vX$rJDɕeܤx. 0B{'9XZ-ڦv l@HKS+I"1Y8nGh&يT7m+ZT˧pL^ Sγk*tB` ^|i0JZOq}fa ϙ54m yx|8QmO<1 S6ֺM䣊OtWT&W9<χa( }crIRH_w^k mG!B\bK3lwyEAJVK p p4@#.x Й4$M@3q=]x.5h+9nӚ#IShOrt_[vSqɨ|2~|$l? ٚ[h~&hpwWl Ėiy6pن؆zΈ5G}jl1S;u o5151a.~Dh|$Ba@W- `bYǿS~yJ{8й{tyus.H ΃Bl Ivr wccL'48Xc6t< l 0EE p%^gDi`jR* M;iWx ;s)}x?3vys}٭I֚A[V@&"xOiIhl%ŨO ȹ[ V<=[p Q7,AO%CZ$g+|1[9_\ُmP6vIM_oO%Hn':EZQO> z wSt1g?5&)0Ơ,j8U%6-2:M.C#x ۶ څmˢܿ5A>ї0L/OWXk]F"$@k19mmw(m3px*h+p?3$@Y5kj%bd|^+se5?yv|3֧}f`~7FZ1qT᧡J?pi9shGw^ІTW󂀤 ;R#I F`+ű8YƑŁ+JVpz( @C&/ pqV.A<ԳEK[,ё+LdQZRoXOr(IG;M3@)`kж;Om`w؝ L$˵>eo䚇m< _Vmgr]Oivbu>A֟\@<p>UXw">d%"$Zc'@}iR98 !9"fu]XW8Uʠ>0 ^{FE:kl|1gOH1 m `s9LQ{\B3@(t9 ;$ vg҇?PO֘ h >͚kETMro} _ QB;`%G׶Suh;sۢi;.9mw^>xQa?>6{rJb{3d@<<3DBy$Q q+5ުs8wSppJҗ2#vgγ~-]؊XkA , h+O3 P^:HkuvqZ dKDd$wjWy59Bmrӊ#8紅9twΡi~ _U?=YOO^BVOxBNC@襮1[:ķbXi~C IDAT_4Ơ,*[E[m pw- *q >Zl3dІe/ 0 t}635ymqn4]wY ؏}DVso WGnO|&T0*W/0+`?itsPPs ۶C۶ZTz>];Ve ޗ#r~0*~ȍE_$Z@?.0H U Rcq9~xo 8:xA}H>8`0_%uX3e@\pp]; HHc mvE0 ; ȃhnrƹP;"M}sA. I;,<3xڝvg?`x+їBJgS Tk+沺oUlTڿPw6u:}XOu-_۵hb[ :~CY_+G 쫠_{>U_VC @5M*,w@*}xHG. L-oӿ b 䍠nE8tۦ5gOAͮ?`Zʶ2~M3fmwX3S@4ewXuvgѫ{ؽeU}t:ӥ0=[6>3@p~"kU?߶-ڦU@ߨ"[mE_s3>hs{0pM%d[AϪfb}b3_!_x *Ů^oK0 @lς=5Y51UpMAv'qܡ]m‰RKkȁh[Zo?5|;(@ !P3 0`dBDZj8K,3=,8 P32 1՝dtw.)ޝ1;,!J\`wXڝ_u>jivUa _78VGkp VW& S] > kmZtW}]¯|.H|[}9r{}Q?{A.8 ;O{bAq~ O\J; }X  |N%DHP]5={hY[]Ă9Ut }8 ?!Nvf$'D&n'}@"8>Ò@Z3Zo>t ) r_|:LJ^` ƚ+9+[$gѧȃ."R:vgDvٝVmtX5vgUAۚ>3 0B&SKzJ? ;c|~\ϯw٦GSߥJ`;`{}!hmy>X$"})["F=Hhr?!? M ;B#:m g@ -܉uT0Fh$C}T4u`\H`a@:"px޾ PX8X.8mAXc` 3F 00x3fBj@[R5Ha#I, 郻 ,gX/~3,=:Lv^2;m؝p {`F 1 l/Uް?UOũ:_YOHXsO}FU1S sNyݠگDPĀA_=o;'罝_wA: Sp~铫:XKZ 8Ds2|I$AllTr7Tx V=zd0Ɂ` 9BADBwl`*65*S+'j=ZcPY8j ]ju] _U.bvA q2};A6 _ ?Lڗ KgZ. Ri20O3sw0=؝ʃ`x* h۝3@a`mw7lbno1(gՕ_R`*#wQuŽ/U]-:ßc9S~%Ρiu23}fu=xEz-W83Ndž9=31Y[ٙ ؚhYW~'|k~"OBLl A "I~"'n@ɠ" ^WKl}[  2 fD,?* ;nZlu@Ѝ$qQ Ib*su+_J~|3PO܈X X߅3njO3Ȫ4vgOtX_p| i$ @/yi=@|oί~SU /H7E>.EПsPR?WwYȯs=xLr];u m;;<DV5Ь@ZهyI Ċ>Y} Kւvu :~? 8d=$x:}(p$OI%C@ $AQyؓGFԢL,! ?Ns&xt]j }~4INLg@k9$50gx 0%da<WXXv h۝Vm3;ږ.;5?3v2T0l_O`Ɵ~UT쯢ܩR/!>#Ow%|IV Wp"&%3@Y iFe@ ß 4h`_U{p ̾ũyà_[V~ì7}lGC׆3 w.#'{~_kV[WZ!VA҉U}R aTN '2 [QolHo* + `95m8xq6 |P'"H"Vmłj5p/W! Cx߂:llDS620 ܩV`<&;8x{;?qхk+[Wz=gA {(U+b$ pq?\qfx yd$l|F_Rdrxu`]gt"N3=N+씤@T `wۑ3H`{3C?s}K~ڪ`_e} HH}it`W[ɖw]_ok¯pn*P/;<$*#ɠ2*x!A>1dmZVs?yf[l&8)!PR˜G [t4"p -B$qIĂBZ'@NȭU'=|оp>\ރeE=u*8Nvį#.<:q;%o 0d-!+gߖH%L*tu͜dQ~ٵA$@" $;`g* 0(5߱2xKz?4ڽ|yޟ3 b߻]L7 Fᜋy('$Z9GPOp_[S?φ3O 0 SYX~ :U`!±Ew"?<Zo@B  xI$B" Ԁ8j0 @]5!m+hw~gT=0@U @.74ዄ5H$@]puna \.66n,`'zM`9:<~+ ȃ& 2&mgF}P5A3A de vgv gaԖQʯ>:e8ov/pQܞId!&umnwΡi߶h<D }u?u:"xANC".b?GO ;ѷ NUz|_b$18&Vـalcـ @ H~ |t(8ms! Q,$xO o #;:/܏C\^ eT;uh==3C 0z?訆D b{qLՃԶT9˱"'Ns| ].u01I:JQǙ|= zC8Z7SbD!@Td2Dwo9s@w3]o"@"nv,hՉ(0R('>dF- uuơ28{{-|M=#䱩wqHT\pZ3G[-"7sbzB<]v# YΒWt(3:07- ھ3A 0dT mwBm +o NuSݷg++{3K;!,p~z\]+`>U |AӴZOBs]Pl0Aqgm';q3T bwl7`kvT}V`> Z=W̱ +7ep"MR0-=8Vu} Z:x"εUwP ^#H!H;-p+wpCwڳGs&gF{L][H|~ȎuC]XuO@ISVUm[US7i?/G"m fshuW{Q P`ف[j:Pۢk"t ȵ@BDZ x@w?A%@lM=฻>DDI6k3v^cb:?x=1Ϫq88x;Pn`::H~W}` p ~kgϿo'Ov`'vpM |@ktwUKI4ܝm32;{K f}i&?*UQ[*8TqQW*Gka&؟!wZj{k!&4Zu_s< ,ص]lw*19+T}joԛUFbZX[Lgc@P5B4 *Fd;|H  >q*E *[ntF3H΀hU?A: -|,Dj@Z q5w^ B˙ B]P7etmZضR_`QW5Nǃ7@pPEA0JsbIUK94>vsMEx=bN}h[ZZ(B$`w(ڰ;,Y 0}3RB\RgRX?hZ?&e~2|khZ4m`?U㬾G48YOUng X5'>'m* _T+ppڶoe=zo?d(@;E=+ $yȺ S#q HL 6z<`<`@-@-g/gpFwD$D, (*r̝i{!Q^W޵pkwh茁*xkEQp<QYԆbu]U𮃱6ȕ@Z8SH []}cg7gs9Mdv> }aɕOu(Sz p!fg`P؝V?f 6&yc&&ZY[j:Pe˙шv\I]'>we?'s|n^c[D~9 1WƯyS`jPɯam+"1`s_GTT}@ mnH ,f9tYB@!3DiX9Y ुgDQ@Am$?0#DU$Q| g=9&k]c]u-> cZ{E@mgT/ת3jɷss}ipH-mSu zt sM[;* (29u_@Qmx6M ,vgnn|nMbU<5QOs[ms?7 Sݫ?h;slR9 9?ommH۔gE.A>qʧ1 STull&`㺉u?s[?E>ѹv 4$t "@ P~:1ꆐ @6|GhĎ Ʌ!ށ;$Ԁ?rB 06&"h Ӏ@U]@蜎tM0 A!c _Nx;~78{еUU0 &/@6LuqQVĽu*(H AĊD _T)]h `m]] D~`yX2yB\;!vhD!m@@!8}yg7u @(  P"; Q'@B@ >OA%Q't tTM&P5;$,(P9l(8w;m/3#et.uH kx*3)pFDKH"Dvgg;!vgq՜{CO5~,3V 1\/鿮Agn^'*_+g4 UK@ lko*}؛Xϳ_JEL5xoJo'6?;dpj現Ց+)X(g@0͑4ߝZcG"1t|BjQ_^B A y 06 TUQA-?6^OH] $h]@ੁ{LX'$` b q;|$|D Pv:tay. j'18J!& `NRLWS7pSF3fk4 UޭD_ Hkw(C,!쪕6loXp_pwXO3Kl,"O ^?5:AWOs3!7qzBMNJ~sΠ3WMs΀m[8ж!\_ǯXAI-?[}U}Zՙm__Y([)D"suD(' > EOB @rIgiO"' :P!O ľ1 &?G]^G$!&/\ZYB|`Aq#"QAQ Ȃe{@< l%nN, i( pq+%k iD*ﭬ:̩B3}p$>Β$DQWe 0[vIdT `KgYx}kT悽`6-o mrvge;Lh3e©RN zGjAӜ撙>ޚ忮z +]Kb~R͹??|!׶_;et-Izu6g' _[u)`c>F='mA2%!q~ta>( aJ҈"8N`_)  V BQ0t $88 ,H/Zz9tgΨPG[:T;)J8v@Aj H1!G{h ߱Kkr kJXFvȎq$AW%H0&1&|^v\8̯H9?dVWw(@t`2혔Ilvgq pX\wg`wy>3p058EWu ʠ2֨?'zOLGП^?'s;v+ЏF}d-^RʺGk>l >Sհ!꿭_X-U'2~2_ʕ|J CEgMu\ALmWe~DB $E UP:k,$@V=;P8q:XW8%7u&j1"y э( K \{g9L!GmH!>$bwXv!ETd;,$;J<3@jڮl2xuXqV?GۗԻ A{m1=7y_ߢ߿s DCs+MlZ|l+peAFyVSs5L)":l9~N~d8[WI^ _^ W%j^Gä%@RD DPb$ 5,FQ{ D,@$,K$uug0w`nT;@g9V[}J0QB g%cȈ 5zjz"R@rx;p:q:T:ׁBk[C:pU!x1n %ũx(f+Un])|38~4kK6nPt{2{ &Q˲ ELg ;|'` ڝʐ`{%gT7XJ>GۏG;DT!4|{tdؿP$g1?+ `ZgM_bmrѹ\O@jߗU:d*Gl@&~D6} J}(hO=@ I؏j {궧 cxhȠ$mW5G@ SRGC<^smyJ /PQ} ޵:vb y3$T: UYQ Dm8f¬]3j(m{ Zxp@ި7CpȖC#Ag$$5烶0[ɽs V \pTrjt'?Emb7>! @?>r#H Z3 BxI&IOi^#)mxX (ҝ PAC+hO~Ŏ6"kv+ :kn 6A CrEH!i=6IAwr.c,*g1+©Vm t:qޕF~l(I30Zʎ#38 3!n=|^ ; pn87I|MϹ%f.e*kp.5G(ڿ]PjޘObbrN``>KiO?9 ?"OH٬)8!lR;_+maleʿ@S3 (П.ď2*y>("OO[^hLplk%،tMOA(JW[/vR+[ĨAXDRPb / +% ЂU!:@DZ(Y' D7m5Ak@~ȑ  9/8wPj+#&sv0@0І2 mҠ) P^s3!ux/||>߮q/Pi l> p8ҹ z:7|p3@SѸ-.G5ޏ*|nTcT#w) oy2o" "DDyplYeכ* 32/?6J՟ˊLF8Џd _DO@?U%< A,3NT';T5F|,6 qlѶƱU lZ H'D$ IDATpL$B81a jW Û==5 ڞzHރv==G/PxD<蛨{= `U'^Of\OffVpZcX\TGU/j\I?+h5Ntp߮2o;cfyRgYYەz{5f])ԓ=f_@6WW3߸ VDwE_R%3@'@f@Kk$C}TY7 eP^r|;ImnG 8OAZKQt);yu c+fK>./ ='v23$:Q*(k)R^qc\4M+`S <('|,<&@B"I`)_6BLuEQ5 h-څGhVkĦ?. zqb|#BpeJrEcEU9ԕC,[q"9qGq'Ztu_h8PXI x=O?ytj`  s& |s>@ֹ}lϺ'=w [`\UsvÊk>t׌;k X,X`QuJ^96mb.$1_) XQoc=zjvH_ HN._g'A"dWode=!Ͳ#G)D*TΪuy ͡}ܽ'Q?I?GK*mh$?oMOVe 9}_{#JQs3mfHs3J{&H|e5d!EbX ˳)lmLʵx$eד0>J]U]`]! `J;?>>Jj?gITyK_G/Io w$q=ŔlYʏE7:?uFz෶|LR P\ V{@B+tY"XI"ᏛGdRTd燍GhZ4("j !/EsA׷7 y u`x?Z9 *Ǯ!!xAۮѶ oađSc<Pښ{ko`v Mߟ E컞 {8xaw=~B͓{ \3f/i87H]J4`hM{QèƇo.*j8rB@6eX?9od2|;/9!vٹO_k $4V0__e_ND"ge_ecbWtut+K?*Y]'| CL h!y-lI,2/?ە@؂4ukÓ~&(@!ty Ǣͳ$0BkPb*Eiu0x4ˈfB@hZ@䥮s! !}Q'9÷L䜂ІP4<]ѶH1k-5q:@W3`&8h~-sSڣ" )' T!k}FXb5p: `NA_|۹$P=swnxtn88h"TV㲶x;^ rAC4́j꟔RO% !2?ϲ?N1O0L9e'6 yfLUT[3X7U j铟'+A?)S$kR~%?H <=N?V^ S.~M{wJ,mv%.c|rxd`OܐvKMGbRKcE1'G=`Q@kT F@k;TLO`z Zkfޢ{g+R Ɩ?y9 D!D˨@Gc(0 P;(\s 6Rh)y[YgE J::gtܶ(Q`$PP3ЗAS^)}I(q9_|Iqwi&ߑKٹ}?7nߎp;`? /9yLR )- AH΍~ JPPӡ@A1-laCvFam Q kgr,hGzȣ&eX mY@!xh2A%Gac!s.~c7ůX}4z:`$h(yЏS> @t*)bڋN"zm=$ f$ foBe4 7C|f#8vE' K2ſIOdiObTS">)Fo3u:V]}9ѿ߳ Rg+'T)R Ǹ7g_ݳd7+Ǯ$sW*ckhWVuq5 IdY'm('TŤԧp~5|TIy JsƳˑOA~Bލ%>PPƯ7PG#ixsmͽfR$fBHD*6<Bb'*P-*n%JBL10-C;M6mVB@9$1zG+C·99TU` *}:.R Jc\JZߟ1Oٌܴo+qrNJ)~/zCOYOOΚfS~fHƗ㟻Los3mfȹt&Nۏ+a^~|;»Q V+-q'Ov_JO;?ϰX,;9˛#I@^ SHʾe+: _1g)#P?MgJl?[,m(iV_9r_$?#R͟d ?z[(+v g]AIEJw]9|z'"l<@Q1EH1h !d)g@0 &xia0YxإoTЀ !@Q $c i =>?CL T=DpC]U3Z 8Ph5lt@q.CƫhJ9IjHS(|"#9.p'R&w~B1E5z:1'mfY}Hs3@o$K' j x7?ojQeQV=wIO S ?L߶!]Yc;tWg`?o]}y%N+jү$;6<ï~,'e?(i|3_ee'51dBJ 掺N=P }%*4YZVj*q&j a%_"7vZNb@ ^Jy[r{18c:4EaB%P0s`| ġBhy !"qFP+PkF<_hnq(<* UNkjնhFccr }G3@8EM@ۗ p12GfC>~h8x=}!ӾN $Wvnxtn87>;jvx7Û;dT㢲pRbaI˔?L0N7x[%/MӲ_~&+U_?[ u2L0J צHגn-QşR2?/vGG  Pg;,PT%,ʿ`߶ pi'pv=k;  ŪZ`j@yaiib ?Hu:A#H H2BT>i [L*V0N#@| x&0aQ,7.ouUjg1_{{iX]\GbJy|rƟ-$ *مqd !h}6<^~h($)Dӫj88{dz:z# e4pn<$@/k/4q<#F) ?q,?oVlOJ}}ۛc2oϡh]?i{c3*cߥ ?6A&L1sJ;hA\OP"?Y%՟DpQe{~TP%kQGy@7ۿ1OXR < ,n1Xܢ^ܠߢ^ޡ^e?fUP]n"eEhܰ  ?7_%gŠb 4 b[BۉOq9>̿o ؅cHRthPCK5 pn^ό9Us3oxNZ@[km{=g ?>^!>^vXa }˿ WӼRS4777a*.jz@D*:4RJ[TV}`Zu\ Vf;u?Y4N1< >KT4˟ǸlUdBz<`yjqz9[w3V]_qL<-Uh;~IJ~7yA ;%{cE` P[ LchIgț5q*7P,rHHga[ _YkhdAk/~hq(B2I"д:hC2wv8WrjAsBۈm[D܂ `{R6'~g3I΢ pJ3n\Hc3LK6f~ j8 Hs"f @3x;߿EYMd?Nq#jOp~wJbj3Q- 5u%Vc]W7U [/?)v~Z~(_#yIĶz="I@" Je_Prw-6T6Kfj9F`q\~QX~Nמ thACЩ֛BP8,+L/_1WH! IDATخgkw.VQV3w0teMX g%L=&`^,e?AR3y9MRP@ SYXb Bk Z^1BTdmG&_ݨA9 :T mCBHPGow6C<w/i<5`~uh^ibckgҮf'3Ovn|V )6 gnT7C|s9A301/%lxk\__O/ 07T} 'j(V_TC: (ELM*H Oet&T|d\9R_c |R0͂ST u/P&km0UT5x@ 7?oHWKS6 0͟[8 8CplDm0UiZ²^qkF ;"r  r)r G@THAk`,>F-bh PkBV\ 0hY|/2rj-DGF8@V ̄6:XgT=kg8 ibc(Y9d=F~F} |/Gȃ\O΃Is3@o$@X9HCg4FwWCո8TVhut_oł + 'd:b@Ӷۢ+s?9(#5~|?5}WR_UCi`?ƀT҅/sE~SҦ/ t3IݚǎgߴI-0\``~K:4 yh ]M+`^\ ?7~|Aq+ˣ|yJ~$\)۳: *T/jKuU ,Vu|-@TźaTA$~cT xdB=4A!Yc<#ZP!16PZ "ajlRC*CY6< Su* +ѰZaNc-|M ۏw;f?B3@"C@S<x|fs5<+h;87w} /_h"X0,ލ*|sY g8cJvWiZl%սg2Pr0_J6[K=gˣZ(mp?B35Zӌ?TQSPzK/`6E-:<,S; c?X1e#~VU -V%+oͻ_Ϙߣ(v3ʯktV7 :ENX XM0{:M|E/"Y0_Z.R+ +#$'"W(]9ZX_s`&߮ Z!VU5`WUE`Jsd@, Di\0@VS``Whh0TXH*#;h7?tֵ N{}GzmAKdS92nt/Gdf~Hn4/jU9ۦ6ImX,0N?q{wO >} AJ1Pҟ=d`Dۜ7UG ͖ge'*$ͿPmq 'EC:W)!ʯa<j=C`~F0_c0R\ڔ=q~ܼG,7-}*7)9Mr1@ehC:_ԄqU ,5p;/EIJ!Q!B@d/_=@Lc9^B!#LEE9: +m`]ńB |`=$xPCXv(%\A1HNo狳8b@=|K(H :jfʻC7Žo{cqKjPOo>G3Sϙ/Q޽xx|fc/ `螛p=mL<)EpF㢲x7rE-ut, C4i٘8p2zݠiZg_i5|mWCؚ]" 9 VP6)@de:/)џ?I_e@ TɌJO!%,A#J-87 WSup ?qj3Rl-('`FRʰ?_qgL/êA'=vlէ.?NW ?y_,NP;vZf]FX@e,Vdq7ng|[&Kb[%F(Dk)@GI=ҝԜ -6EP`F 6 N< 8ı |hZQ;ZhB4 |i :G?xҚ}L< =un}8zYO RȳKLC pn87K$Ef"&B-ܿ!:XO_?4?9OlEX.W2[&*K0re*QppD?*[(dO m"9*H ]"_Isz2UCAJC(p~zqJg׫-OhWh퀕o1yn??_o7 `ȽTR~w@VuK)o?Q -y~[Xd xLX6HD:A$z.8' 0 })Ak:Ҙ*& 7Z1Y}gOy엀< sUUr}+. T[{z})ޮ|n 0#h|V;h pm=f#oPL> T38#z qv_f^ӹ7R56?_(Q@?0]X{v atA\ 8;ה"l94"Zq(@#" +~AVn6{ȵjb1Wz︘WrO 0Xܰ=i0~囮o*?Uغ)D+47X?z#pCWJ% ~⺨Ӆ/{NfK AppM׀Յ{@&,fƗitb ϯyI @hyCA@E悐 r_,U%,""%.z\s֚Ae -#0Urc g*`ф&xDߢmh& Q9dF6ot%bD"hBP~Ҏ]O@ $@/{pBdd NxwGfn ߚ<7|qDЊPQem1pfOzk?d/ 4{{tPRg0Gp`;? 0s@ODP"9s-j$gW@$@IO9Qmu+|4iʱn:bw/sS py_o;j aZ@?g@ۉy'# QkW!#wѾǟP/j i^)J|+ *SXth,t[_=Vふo'w3|gM>n@ TB)ɔu$BYCAx㨵A 0tJA;+52v#`!}([(z o: *@uW / ІqA@&ڰ?z::t54#^`/ `GoGfmfϳ^RBp2ZvCgpQ;Vh=!_w%qs{z{"٬ҟ\=D@5"2g˿6XI>sJAE_9 jl-Ϲ.- 3/Nϕe?I9 _{?row [CNҀz#w?A} w۟ TBI~ ogl6n6mvBg?يAt w 7h<0[kĭ>iɞH ^ooS( xVZO:"B;"X׼ 5Mm-䵒q`W1#5ERme]4IOKxc>wk8ľfE֍ 1~6PboTkVUolXjj;Ϡ_~g߁>| 5Bj(ʿ*er?m]v| HF{V>z `~pljmJ90^lJ wv"GT(c7 @b "E I"_-&gQSfe(W5}-ԊWXߦJb,~v@ӛ P]g3"::s4 c:7oV}b}v5s3W ph;7N|f4k "q Nm: *C'?]&O&XX7 7`~WP.?B#,sC誂6+ ?%),)O|h(( (-}"0-Z)(MtVK"ŇB!(ZsVPY÷-!H` ۏ>#!~ 0r*hzo}Np$C۷qHೀ6|Đ# ퟛs=m/Az{y36<':7&&zL+8Q[3բwb' Ɠ n%>ph٦.P xt7D%C7@R+EUE 53НWKO?x+f,DoAPWlQ/oq1Wb 7p9T<v֠_aW? 7PU rây˽w<>12o=l" 0;nn.xrwqR`ρR?) J$B |NPeIP:&2Кޤ8O)UB B2k'[cZ8ଅ1B#AԚ O)B=6f{chc=%ɽfc_c3@x@;Hh8,f^{4~f) p1"s=AYI) 9"Fa4*`VNXmzwww-VZ6VRg)ѿ/{.Jrc݈ *6gCd <G(A2PBQ ."Uli#7wO̔]Y`h "{s`hV=CcH$ޡ=S GHSI]~-ٟ]]xz >z:7HF>88hm8p^ Dd_s3gx}=0)"8P[5EͶP_"Ɠ `|wM}𯌁v%ۿ7D=^Ct?RP|{ t~5+rJ[B ?N`[! U'(t0?ݮ` ԋԋ gZM Ekkvj5x3;&h~ C&'˿PWW0?Ϩ~߽,64)ܯ~ @v~_iY͟,R?Y`f࿖:$lx\)7P.S_ 3)(G+knǷ܉|?K3қbOXߤݮ뛣@lpnxtn8d jh=,%Re6a^ mJC%sJ vx+q؟2 ˖:i֏]$?U%E)?vI*'K%ſjW9zkMjqZKKxi>j7\Lj5i c|Jl9RPu ``'? _`~{K%d_5|ai ͙(hJaПR.OI)=iH9Z*$n +>AEDA}K>@4_Qno8Ԕgˋ1X8k`4xD@2C ˤ8fdcK7<sA}$Βӓ^Hbu >{kk0fs3@$ORu4t;P[3o(S0t6rBzNW{m [:? T+TCNg?v:R󧒽_K߰GAϟ$OEBONQ?f=[M1rO\1XUWXKF`1|ar?9]喀^)6~G؟+-.?YX-'o73_"دc\O0ذy|vxjtirDATP! jW49YsB6Kp<CN`a@7m1ym>|>%H_kZnєpg,Ooam܏]/ N]DR9A&N^O#Sezݾ9 Y p0<7FJ:ՍFEObSt6bd뿀Me4ݠ1|:V5'6( l*'2Z?nT??w+v\}.V3T; p1 b/\n=EP[.>b1AVc\L̈́_BPF#oa:aCP*<ЏzءVt?*u{N0~?d#˸ }P(".H  !@CKE!Q"(OjBvS@njC|y&:@g-\UrFkPl j|Jxc>c:v;c̦3Wk@*UYh[  @WhSM-'QF2JaQCY %zw\L7wpu7 g`qj5mּŪwXWɨ?p5;kf?i pWϜyƳ?[2пO/1 5ދRbn· ~A{!2JH=-*##|bjLwrh~]A]E,LĀж G$  ;?kK:_]3oTr @t \Cz.пͧB&{[O/ z{1E L_ YA۱(^3h;q?7f+jv(ۣ0пrO^$ d6jm}23{R< &\  a GUH@"hMBt? FO ǽ4l͟qK_:?tX[smԎHN\Ǜ)"Lo0Y|x?#"(fPUQF#bowPU6FU{ԏ?B3ԯҟoRh$p|eMi 矸:?PlL끿e-Za~^e/ƻے2[4ІAKhhCA kF0fܼ^/Z.]>PKm2PJ RdkhXK]p` Z9P7-4L=U( g([36gdK Qm[ H?Z3ٗyfyM 5 v'"ƭ3Jp$|%:?7_1cY]꿐ҧ GP$l* U lZU4U # D n֦Z&L*c57d+^CkPy#.~bYxFxPEL3|NǠ|þ\_O&oߒ*~, ?q>:qn P%3.!"`u~ 1;5[Q Ra >;֠o 0Dqa4t(شK`Qh 3R{^hRBJ810mjhyx @''H8 9B= H>/jРm5s([xm3k61NyOYxI)?Tgn_/ f3b>Qh By|JWnH`L?WVq.g}'ZpW zyڑBi+2R- &?`ePeUMN\w]g!azٿq17&dS!xL^7o(_~/ &NT,WI~g=bkO0SR-= g/: a n ]x0h4 ,Z՚ऊ>iz @!$)<@vOu5h 9mm&mk5ƚ̪rdAj6 A~n c2>E3 p\ Cs3cĐPsg'"O"$~#vn|=AG)X~}߯[Cfwwn+^WG$W~ hϘhP?܏*јhp0:[@m27T&B<: ^+o/b#* 1Y|& ATUԇ!}|<&/@~ ~ I@\w {Ӵ?mÎTCpjh3.zˮ֚>55i`54פ`k#Z@550,a`Щ:`]R9 R@czWlyT>fh`=/ 09$P 4sW-5ۈk 6faHs3Hoj=J[#8M+'2kӱI( h.(_zʃCx ǐU)/Tc0Lo/ @;rl?*&0?*{-oŸ F<~9*&󏈒9DȄ/w2/_B{_/x >gz P"_&@|Yd̆t77ckC޹A.ԓm3m.;M7h4|R4}r ?7?|5&duR @I%%瀩neƐҁ 9nMߺJi㿋cv$wc3g;KCmq.+t 0t ϡ$CCsS|n !;s3 $)>'8|)Ν#6M8^JfYj^H@?CO5ʏ \Q?-GOm 얎p ! A"fW'y*!ˌrM#3AatM@ݬLI#bK5|F=߿Jm ?A\\._^_)̚i{Jk[嗖4ݟMBw&,0r?{I۶^Cᗆ߻S ٴf)>8lmJ1i?4{M]ߡ*UcV~Bpiki0 4Fl$A6+.p83|fi3`'c`HK I`l wdN:\fs3$!8@?,\R8' /꺦-mT>Bno}W@x4B`LN$ѦKn=FU X+6^&]!7mdN # |LlfC0%J" _c>y4|~`tJ+l4xxD? [ׯIqv}N`t.nc S"k;w=_|mt!t%x5<M dЍf9@7071ѥB 0AN wJ)mH3Q5[htm BB@`n'X 0y6?P6+BMU0`D?HCB(Ctg<Ѯp p?sD X(PߟW5dc5FO Waq&E YOrlPsŸ ^b1~xYxF(Da8Q~I? 4\Dc`<_~˟3wo!_N)Ovzl_`b`454RsuI-tފ[Hlnpm3pv SK}g sp>sӸ,}+y<΀VatKjVZmpqMS:7)3H{ vmډS6~y7Vsj'm87 Ers30 z@ @ K%0m~_[#fXr+ @ FP M!쟓LK0tƨ1т~=u}7 TY gş1n˛7|QMe 4j! HFO"^'ກR,>` k3 IDATR[0Z(2{_3_@]N8z:2^yEA]L7mRܴK:R& ̵YR0Mihz M5D@hf84 m$l\RS<RQiz6ID2t1_3}w'7-!֓}Io`koHMC3IACfӑf"fO |fp i c&eYʿۻ;\29 \PG^4?)}Hi NX?hk8u~CY<~@QcDՀ5 "/0?c4⽭7FgDW*r0ݴ+O>e,b#f?a1y"D5G*#~Pyp4zO _ ^_]HxvumEMqܥ7q쟕@Qw g̪F{NG?R7/$Y0NCӷU@::u{md2V> $]Hߠ+!{p ~9ts,g)v9G(/z&% fw3i& )`?&B! 3p+o'?S~f Y(NmDUCFpy.w KB d5,#J1 T*`1'L1Gl~I4C鍐WXLbv  +w/|.?~߯muц|Yg1y|pĿa_`p6.tT݇kÉh>@hnqc+25q!`8U8U9{V44< Zlֵ$\ֻnǯ `Xclf;GNi 7f! pn8. Y$@j%f3f3,俨J4Z`V/) IQ _聛pJۺ.៾@͠,&_1b:ӻ1~6W,;񹹽 E/Ob1y4|Z$/'1'߿toM/^c1yO] gzr d hَN_5@Uۀdliio#F_4(}Ҡu{Ge g\ˇ14h3 SBzsP`~wmPJBJ8#t]4;h豲lY9bhXV چY1;97lGJ޿fSnrMdstn8p97 N BkYjRm|>|6C$ȲUU1S ^81h T?&$P?36107?7 ߁P.f`(5,azO\w.3^@V9xS4iH7FbsD FL7BW` $/ '] XL+/' Wm}FphC1 F3,M#m 1Fwk ~ jWh&s Yt e<%hiv8^$۰yxf~S w|>G(KBHSN#( nM6g1AIH} n 7h{b`j 0cz>rM`5c:7rcwn8乜Ff3J%5t71*?cq?0_,9ʪ&E>`O1p/ G~ᇐRK+ qpBwd,m7Py xW7 +cՒܟmH4W%XL"B"^ Jo0Y|8l6oPȂK׸ܾ3n~b#% J} &-N8@}O~F%φmؔfk*XHS!+5s5Z5otYVؤYCpZ$ ڞ`#)ܷuP|z ($[;.)s37 O>7:Ðfӑf8g < '.f|z'TP^FFcj# |[߿f&Sȟ dpжk@%ӻpuxq/Ⱥpr>4㨥#|#ksxe08q avh Pzc/~՟qXi?B#0& p9 pc$`Ve Ȍ!^ ,sߥ$JMsT{m^-̘zi֙h{@XbƚnJQC?] p[hu[}{ym160sMd ImXx$]ÊvbPp8i3&0?$ p()w\[}0[bmcǴk1xPZOۜ!^]Ӷ~qquz?@p_rDD"J))}g|yW^?TåX}kٺ},Kw_cw R- m۬ո'] [@ Ax8ۄ=?k94⌯`<Q AM݇4BFHFgKT*3 2d?\wKT2@/y|ydcZnLjUkq%<g8бѣ?2M h`8Nom%cy`}gzڑ6ȩ @IP {ڇ}q9֏oпf8h{;!< /kP@3k7p5{h{=9ݎ}n8 ߹TG ((iTwhRa>#N:߿ I~~?$8N#zhSmSt?3 @4F0@W9 +|Q`BFHXLa1ytRc/TnIW5ւZ+,&p{-`FЌ/iImAݪB;u(68&FB*}VY6nCc {IښVrAkp$эU@Sd=`tڦn3Cϥ`) wW[hxȎrf>8k5rM za3smfs3IӹD]~nN9 ʄp,e{ $/Jh>^0&4#H?I &M7``@! ~^ar?!W!4c9avX7%{Z ?F:zG7H\A>8q |L T*DfIV!P;&9=1sE|㌼sNaDG-=[,O /hţih _Y`mmV$y'6 1/ lCLVo~-n)% _p֒PlS;@) t]c=A38͡eO 3snGІ44ktIc7 9 a{ smBmC!1ރ]BE 8z!TN{aOIp5×RؕnA]mfX,bih 9M酐фR1dBO.P/xZo+ ip@8d  `^~>:` GL`1~$zҋ`avkfwvy`Ќ^ b N {dU 4uoiM,iAU_ǔd h4_}~b";J[Y 4=>@'ux-ȯym4Suaݷc090FU#ˬ<z%NJAI՚20b ж+Z:8 : Mq =@ }fs59:܇;mfIS} 0hf3JBr~/f%'Ix ||8Q$mAx>^4 ǐADχ>^? :?SP hqݿqyw\]F'-r/B)sJr0F?G$ר M0d3xhϠBF ģH( jb4K*u7w-*sYX4;ɿK?"hA\tmAց}hiN>J,B2z>ݹ?5ٗwa~gU%k@'gK%nW2;=;ifpn]nmR-`{m)֛_Պ4n}j64Zdc }.lKR;n0{c5 #cxf9@:7([ ×?=տK1E4P756ֻ/!PA?? ?ob$`.Of8xx8t/7^~/e Jx(1 @V)^|_f18 c0L Qzcs+. ,>"J[?׍8|h`\>*ѷ ewj48#~h=yd$c|J4wtUuW+xCv`ۿf~{f_"VɈ5[o \WߋfuS]њNߪxhSF3ܾ/O iVk <܎:I;F}|̬`fSz&*-H94<h`h`sZO( 4MsI`y^A!!^ C+gֆ2 xq__.o#|hZ# PKLA~g%x |0a&\@sKTj! _ .~'% 8Fe0a|ڿ~Cvq3NpЦ 9j۞$`5yn8 7P7? ?[~>Y"N$I,Q5Շs҃P!T0)+`7# 8l5ëtoW2 㨅Ÿ"/0E!5mq[]7B鏑+ $K$_# /pJ L1Y|@kk414C%{rڂb?OӀ"$7uym# t4w!h]Bjyzv_%g-fO"qjJ["@ 9PWǾfI.|9|@kq[h\pnxh2|zSO `6|'Ec3s$?f$` 3J nߓiZK9V,E娪Z ʃ ƽڿ\4>Pm^630k0 l0J޽?qu7`MA\!rܿ !fw$oJpc8 мyx,ji iYx<@O fwPU뭷TIC|4ң?{!}{&1$?w~RJkt[\)\m_+I ̒E{Niz9fvVV֭sڦi~S!0qrKxUM:ĕs?@wIn9ch F 28")boxh-h{ybmP@ %6 rӋmx 9)Is3kϧ6J JW/{my!IR+O EI=m>@#x#H?II7'ozqa *q_!?azFk4S?B^G0CU)ƋOTNZ(' ۋPxcrR{T#*@#$6o&dׅ1h[fͣ偏O28)d\¿뇛R<y1K^~2P6^PRV\I-ضRpH!  3 8Az 6`SS x:7#56B?5hg}l/ p5yz1<'+p:hun87:'E'_OfJ—R闽̑I8IQ9m{%@s_p1-66 hnT]b/[* .P?ARM*SD *3~eA~y0EOh\ߔ?F"^ZxBA3f N! Av(F?Jڷ4ƒ ҈_GʇU*WЗ$-OUm8jOI{^/$a74f2DU!Hf7𳙕W0Ơa [K*WqPhܴNKoQz*^4֋OS$+Ⱥ_ƈ[m:@I9VAJhEoWˈr? wV6Wj0?%76ON ch *r@5r:׉1K0hH#RPD[. E!dthzϙhn~45ב~e/Kޞh!6$[]"kG |=7Ěw 4MSij& /qd s4\ dP*oD)2@-iү$τ x]8 4xSA92r0l56PsR(T K,&o@^v:"HHmi ~؃4wM[hn,Kg4U$t#D@?c-6Ԏ1k av0{IA8hY4-<$l/6{`v\0I-6;1Y1z:7JsR3Z`( $ D{O[Ofϋً JP@ v4 ʲ\3P `YƹMWO!!KI=?ذ J#F2!&uoxKdΐoP QW2@BC#T+'VXO a UgM֫\MJY+Yx$zʋl([d02J@O驶<(7g![.&7}=9)ڿB:X Eg6)ۺ5fI .^@a-gH YZeJbR-;|ef:f v=J8E$mDa$`n8YOA#dRQ?7<vnn{eFUڍ9sdy,ˑ$j9H? @z~ :|ư20hPg F%%%Ⱥh*TBT|*rSSFx} JַS~"a1ຂ :#nP?F\"l%Jo<@i+)Ы{gKRR *я82瀒[t 3 zl'ug?k`@[ڞ{];n/zfI-;!UfFmp[Nbxߠf3mJ KNux_ж͔uunx:]n?D[_~lstO ֖luP$kg` J s3SSIs3A˹`x u_ݱ(re?فʏByɿc&w~@ݶs@fl@C# _aDS REDF("?,6R h爉I?{l;Ѡ? DSAdE}ҙq7BOں,@-4` LF#׆TE "7K oН G3Շ#ѯ\hHNєȹc@3} # 8?%9tA{+aN-2 ^0@4hzr̼{w9 {B$YйR)PyXu lWt(MuX.~j辤ktD]j[?jXO+y%wǔՙH ?>&g)]$0>g&=w(hKH d \Y#%a, !ECt^C=(kys3koضP- %`02q29A愿Mqp -Fӻ˟1ན&&dcIk25#1uxI~%1B,J'(x\mۦZ|>570l1j[% (aH?WCp)YW@N)S9ɤsףUmSA 8N L@`!M\)oj+^n~E]ݡ- 0v~BU?lj7T3@/*b2@~Z \gh8潤="PM pJs5`<zO??OA\c?^11;4Nl3 G)>Q۩2dcImSHc9Әcơ8޸X%lk2I:'=Is'c g JgDl@z?t!#࿈D7-\z?_ϩ@+?8# :Wa="itnΕ (gT3f ?A[,stnVIkk3\-[xWI\l*w2ssO'Kl29hLb Ʈ}d$5$`J6)c s$Wj@U8"S`]XZ4],qNb*UmQ'+`l)Z_fx>5Es@XU`hp^0&*-^n\ )L(ڕ>_]-hy`,^݁0nf<,Xm%o6J4xcCl;?9F=~}Ͽ2xP'fyߠ*k 1bh*;WltÐӏmهbٲ)V7 ǒ% . p`\'& vjSϏ |ĵs5`*`ߝS},h&LOD[ZAilhuhMu} cpLQXc$PV# wȉ 0ZgtSw}'AMy8ߠhwBѮa} [0n\ustL%e~FU?u V/ xVo  5Vu!bk:% ^4:q%T@b=g"Ͼ́?`5 JgHCJz' 0= PVM-12$3B0rN!&0D>u^m3> m~#P;qXPۡ8py;w2%I!`Ey?H2p}k2I ڦ"Ӑ9IY̴I}ڑu]m[1k4Mmd-s0%-`]߉_C<ԷcfK* 쎩죀@ o x[%P5\jsnW+fƁ8hWp wWQOht5L 04ǯ*|,V id`_V"`OB(t|}l$Vm` ahDAbuNF> H~W{yO}=Їh sXSDd-sqnIV+Cϖ %p2@r()vFH #wOZg+Q-,Yϫ`ϊHJd!h w`D$ 2?HS=mjHWo ҈Qk^SDccA?-UH[n{@4i?8JoW n>pB`?>{2vzG=ڮ@ۑk2.6>ӓ"S$*BJE mkk4MHդ Wl|v|rGc\C @@(2J=$H& yvǐoS8x9FOJl%.5`r pM;q<9KBZ?O(_XcK@,U?c%/9`0 X2o℗h=LhQ4+T#?Q6/` 0f%\׈ `,a~B.QkƷJ[P94u+?_= )/+O"x^ aD ?m܉|[8eڧUz:hk+1];eBX?=6YTΩb?o2!3 3?@~mÅ>k)XA侹,;Aak }_Cqng0; $!Qdk25`1~M;?g tNܸ5BhfW+\k4m[WUWDu%T#-M"Db sP`2@[,}%,-vU՟c`Bv3lpe@~tA_?t@a L$Jf:x?# =جzE160xTH?hb`|RoO}+(% G4l~1u(5vO^UQ'" v 5-ɑU*{b q$ ]cIw5i ǦvrA5=:* FO Z _'' &|4;y0Wy5j +mm""c?Z%LQ$@*a%(Ľ{g9g}:&EgKٽ$*b;? ? nQ 2JH#@\,;׼D ٷBQ%'I's{=2yˍ$K8X;‰JO \ _{dk<"$ݡ3de5 znn4MSH?٢7+JW(گ) 9]8U 4!mԸt< aƂ Uy0_'T3\&EqàZˀ8]Tc|Z>U!YHS>0 /3Bu$Fڈ>?*B?0 FT}z_/}꠼O*8y{k kP@,o_N38vg|\n~J269h24~do8ڷc!AמS~~4`2HE:[^h4L k2q1v‚Sk2acdd- @%ΠRʞy#^h> i1 }:X-D $Xlu9? H9d!q~5wO/j](oP6 >ObR_K#X݃,\м,}ӿY5Hzӿ -_{B^>|Lw_lfҨPJNIGC00f oI~kow>Uy4]nxqL3v%N *$@x9~Tc|M8/ 0?t*&i'"ƠnE4XQ-|$6mQ:'X+23 ?f0HW7ǰ3ҥ H_,q/702cq,5lh,@-RK2ӊq[Bb}} +¯@붿,,!pO?SAa׽_*A[;%|R (@<_@&U>6Y 'w=Kl!Q; Hz5lf6?oNdGLj1ӑǀSH|sl2y@Ԁk+Yk}x:v"Jp/ǹ]&h͘]m(f=Cuݠ4Myeo RE?2 QZ"5P8Nʄ4 D'J#epJJ8M XJ|`Dѭa} Y0V,zF/ߟ^J@aF|p"{jYySfoaGo0 H?UDЂ]JH)XO| ih$&k feYYLF> $ v.|w5?cߧmS\QFɍ7vL2M&d>>g2MU&LNw2tM8{*T ^E8eƠ~R K` *OY!J;JXϟn[Fb?b޷@~5e+r~z%xM8d&)17 d ?g2X0rM8tLN`29z<]&!>Z23@"1p!:7j״-Eyx/ dz$OH#FyTAzU(lz,dz/IyY#=`"0YxSXpF`}'@Dټ8` x >_%v% {T3+';#U+*>/oG'͟C**I*@_CVG2~1RD;k1/nUll‡HU +RZש;cI7*<8u`H۾K&04O;%hk2{l5M p&\&|` hQ,%K5{mE 5:Y5Odl 3oT5 @s=o|F&`,-ѹ:7I^aX%E fO+'d̀}CLBX=~qFE)KQ[Qxm O?2|=yCWן/. &&XJi_T _5ЪhQ6/saBko4Io4"qnNp /`sȣ L&ǞL~S7 M dM@'@ k2e5`zRd{jkn`RFeO֖0VZgS@f2DUF=a;}>:7DWst5nSpAѬPO(FW3=\[J _Q*D10+N v^BV278 Y?IuYDd18QRn}AF5|& c$?'w`no"\Sۆpi~(ȊNmg12F7Ҩ]mc@j>%򿛚Hxt~"?]2AK'|DvM8 tO\N]]&&vlk =EuڶEm/c8 :X[ *hpb[@>f,#[!~@fh:7 @ +j#A2) 4^x(fU!~c@  ڜQ9 xX/ki >) ؏ЫFn?kÀh#pLЧVM;Q/=Go%BRoQbV*, 'f1s&ߔd@ opvhw `\ L$`XٓǮ4|)ٓydHk2I$ pM80`73@ӶlZdmQ$z!ym&qG-N+!*1 }hG -кd``FF@8cbY ^WJp0s9tD IDATésp@7*p[1n*`,-O+lZ!>o!Es83sG+؇[I^!xbx_tMA=(LJ>Xt"7vyrظr?Iy]hT{hvǀC`%:&0pΩ|~p:ghO?x|cxĝ p]&'udI!pZ#@{ykt]i9T差- I&uL^jzvWw⏅ޖh9M1+VM8AޖhVX;)o`,̲ҧRR0du4`0Fʶ+_ y-j#Dۿ0~4ɣz>~N };7E-|N(NHY;KMTƨ>omX%ngbWkd9M۶ ~-}oy|J;Yꊏmc@¤lxÓ'O ?xz{N8W2αwj29;&l>YASk2 pC$dbV߮۶@mj|Z4k*ra!?#IZ~PwbCS ,*!jRavͯX-~I&U sv,V* >` `TC gYA \ \Kò'kQ"O\ #+?g& Uڵ@ 0~/$e^"K #ؾ@0+5n^bV8n=V&1JHя $ b p?lqpqdsSީʈ8L&Fʜu<}dwvІk2$5 #c@gK@^*>hU߶bދ?Eub(hfzZ|C[z#fDlZ(JJ?C0&L}#UXͿ?xrWt1õkXW32` *iX5J/dr=NӈE)x\?`#"TA L2حѤj74?t_z;p!tϸZR Cs?o4S[VQ XkQ*p;PVG>7 {Vm=O?Ko ?FS@ž9S%D-7vWn7+U@U8%r^ݳ&(_?x36Ȋ-?N2@8Յ}L 6E2zO?ӑ$1N :0TuM&L[5EۧIGl1 @z`%@")@NTdzl["R5bѱRƔmCOĖ:ADI @uuu f#n-@+oϷG[w oloˑWYzKm >Dq* D)(K%4\5Ҟn7}XdJp~YF $#ϧ{}bw(Ч6ٯVc~v3/?U( `?aPnAUX,*YyU75DZd]W_9g",#zCϔ ot2)յLyXdo#ӏ N'-?T2kwMzzj2:Xm;/M% k Xga?ߐQr.U\pfNY5iS9*^Qdoi[M㡲1@S`=ۿ`V?Pp 9-ֳ{WN$yn k]D\1J@-U E1?*Bϙ34<K/N}/?@{M$ ԛċToAw _of(TIf`"5 ӓ9/O[La 8X@$!)I.{~d1$R&?R2_>N2AdiHk2HNd<]ޅ;&Tmכd37r$ҨAYD<D0@L `'xw%N74enD zI5ͱ}x_qb<7U:;CU?l^P+Ђ8pASDk4J3P2ћ7&TbpZZ6<?[٦Mo,/9Ř_":yt>E"H!WиOoMdIۉJ0+eg}8yV@SPNRPJdI' z?t4\"^$@\熀m >pD2BY܏U2avk!g3\[`f逯 tF# Bzc@[ ̦QF@Pk(cW(.齭8;yU[Cs?%}+*5@_,h6SPXIk="F*s Y/ 7{qnDhHΣiC DFlPg,1oy[-#XugNs?u2$ 5 pM8\_HL3||@ۉ!:`obߚLؐڴC˰Oy`K&9Lp2 L DQt. a~S,ZͯX.~l jH]vۿ?xȀc?p;\ LQ6Ϩ'mXÄl,EȎtRUgTh0*8Kpfܨ_f$$no?=$g.w A_c?wеI |j$Be)+4k)C>ԛ) @F@W%ng%q7+1+]>kFs`h ˛U6S#͇A  ށ T7 [.ǐ Aۘ5D4rc'Q}_'c5`zR"?$(c)l*kZ#!) u HÞ|6x1@Sb;?`BNm9_tw<~/gbW5Ϙq5LEDU@`G0yuǜzX`˿qOخ--QWxϷ` on 6F̰EѮQϘP6Kw.jl6^@,YEjW!`f{2ix=ClGUxX9oO1dJpa ⾭~?43^) 1Kh_s(OY1!o=d{yXXcP8YYv^v^n^a^88SIl>!ڶ^H AQhn9d,+xd](0HA۱/7C<-@gv|xC6\N!h&mGk2a&6&ϝ !tKc@[s) d{Mq4;8AȒ9MZpԍeDޫqjD޿}q{/QWxDMy~oՏZ^%ТlP6O(ps: h3˳,0+7$NOokF1,Q9L|s? x R컻l1U$oE]ӃNsF KA *kLQ%?f Tnf,f 59Mi] ߩ>I)d޽ &I*{m!NJc d'\6Րmd~ N_~<}d>x:s2њk24$5r$5<5`9I1xk ZlPfaj_oۿ +&tb=op^yt`|Eپ` E;X$VOga-E Ĭo`w$Tپ:ӚO/r yFa7%v$]`VuGx^˾:OAfsρٟ&/*/]n'bI鵣_V#=M>F<1`$uXTRnVb^:/8&ə붙@%0xԛ6^>F9Kx?!iO4CVS&v@2Aۮ󁉓O|>>x!7~h >hP<g@۱ \.k2(AT}lh`GB3qoΑ FlDVX1HYn0%a"cs?POMyůX.~AW5n_KOWy7@Q4K,`~Ʋkk}?ǒMh'{ӻ1W6Eo[8d&aN4 j ,L2.no<W0)иzLF]|7n g[x[{>՟(FΣ!fP(%֏(gX_٢;|~uv($`|3BD Vp)hAeV+=JJ T(wuv+ф_o;K(P{+p_>./#T/^'nNN$1"c?W#荕= _ofv3󿲀6E]?7f+:yIs&ȳo4(Lx $GA}j? pHY^x}|t&g8^qts-__N"1'Gޥ51q|v!1 " BV/ZsjSt0Y"Hl~`@ G0&ہHܕpɦ73cy+/1h}`ELB5U~j=vE1`*^UO, ݾq́_;?,E?dg XTp7g|sXYi`5Yy}C:^vוVfًF2?U?46_طAuCgў%V p3p_of?k_wVsMM#I )r>$%5s߼oY=on#89U1R^>/oc+&; IDAT0܎H8W o[~dw 8}M8\^NOdI6ܺK`uާאGe`})o} +c,Aa`A%*$imlzӞ[ƽ/H`cx|?Xco89JGbXO֒`}`,8y3 l)Ҫ>@(*(C灺M4c"$ o1J{`F^g[g̫7l Ֆ5CGGC?c-XO%!!>u( -&J{?`Ɯ۪9_FS ``XʿV\F>3Fwd: B| ޡm8bP#?"h;Jq!~dwI6O 0z<]&lL1@ FyI>?}%l!1H*)K yH@cDZ7@czGaA A0՟/{ U,i3\[û;䏠6~1AP (5/O 붯,R/_w"_^e&䁪ʂP!=AQeBx!JN_M'kJfBE^^[Qg C@Ŭ,q7nfG0co⟞Mu!$0SPŔp Fy Ix[Nέ3񀧀6Fq,3O#Hk2;LW2$h&$gOd"?k2@*Bw֓4 K>$1fC~!xm5$kI! Cӟ8a|3ٮȪh9bֶwv88t(WQՏ(%>RJ[3ĭ?0P:$%gƷVFVK q_$w֟rI׺eϋ?G*S= E5ޤh~caNjIۅ;_6)Z ktDZ'qQ%ObDgZTdW?'4$Y#p*hˮY1a2OsNd>Op|ȯӰg%δd |W@1/)kIɀ@0'N; TELoQ^ cE 9st6z-ݫF蝣bovہ!!кZ7G a !+ 0h^0[`Ѽ̿8#RKNm)@$C2d,Q8 V  蟗B0!^܂cUKZÒR3٦*!U/J~?gV: F!p@}#U͓~hΙ C:L'gN|dwN1&\k2A;?G2+ݙ *bs͝ERLC_ײ-Uσ;=ˠJ2MbHCAFi @fb)Afqa ]M0:t7 /E `̄A(5# e:}G`{Ѵ~% 1[5%a)rC׹E hF{K+2k|t^ ~xf,k6a>0Rw'/} Fi[־`A?|bQ N" T S xeP%כ9zosK ?ۦh//Kk4MӤH6%%X=)x:eNcAֱ5 h5] pAuMu=VT>`Ł&p%0B@O}HaDz&)h[c@YEդw!0^]CɀMmC[̰\绿毘laM2XAkb[҂٪Zh;ƺa[`ꖱS-s̀۹ /lȦeH'3?^zdd)V3I?EP'2gMBxچ`<ua)U*J:[c*qw3÷69 #r\^cZ iOa[[bP QQa̧y\ng Fcd?z2{lMѻ~h;8S?)F 0$\p:s%M >hQNdk25wdXݏ=^+cүڗAVccl7̃iEܨgCzv9 0zY0MEb\`vF8JvOt[^6@fs6a ,x[B0@.a} &6 VԽ]W J?Kn+qMU +x}Ϧcwm)?x^3SLn!tR$w `?D 䟈 3V~G:50$~NdR[C֡(UowsrݬBU8m5|}J"Fn%ƨ>m 2n!)oB:2z`9_0]95h3MPɞ<`}tiHrY$g.cs@V=UN>c^*k%Kd,BM`aP`oq Cd"P C8l=9 0پ|@Xt7̾?( (x tXߠh(%ߑj?f L|WCdA ku_sB K+VRC"ZRgd#__I[oB Z_\~b,"O}TXe<ߙcg.jX־9~߿/_v3ͬL~"`ƺubDN&;y,DY,c(>=>N ڦ6r p{KL ~$ @Qϐ p.!7h܅} sMh&\Oc{ 8[TVo?V3#@d sH3{5P߲`7@ s#p X9_dd%Q7@DMcs ,%ȷp3@*Uzkaӷd 21dǯIhIIsfoyI:p* r'%4gL8>'IpM^>h;a{Ms!c┡L}+5HXG9h+$j\! GT P `ʧ ҃Md&OIMSϧ :_ o,r盿kطkT͓a<{Xߢl^6k`tU_|w&@m"H@ xVϙ@[qZ3x(=^Z}?}O5qw"/VkMP';~ZXO;[hϢ(p3-q7PV@S)IM_u F]hӟCYP" W :=c2@ o |)Sc@۫)mi|2c'lK%iHA5rڎdk2b?z6)vH*@}cD)tJĕeȬa {s?={ PU5HvE!THVT!Tymdj'N96`s 3"gd @dle}2s49"@xoVhtЬ<ϦOhV?-]!|0eHh^{lF 0o U%^hK2+ǽ௟x~~[2> 0V> 5s{l>F!AUloR}d3#V^Y&'mǂ}A֡uI8h{m$EPjzӭe$PVI0@-;&\@bzI3,'#$RVC$CdE*`Qm?@1k<mJ o7' svG=^k]x ˗ix@Ef}4AdӠʓ,#MUD+kWv/_C/M_ ~>ǃk`j'~)OB_L_S_⺒[(ocVc?u/αFvz\c6i1{,fxo015 |MIJa?f=*jye 뛚f˦XcȹSG>?ګwD¡m'$rx$G ݯ qI}dk%i<]6@[  r=(UU5D^"?ѨP`/$%.HQFpE99K>Gi:XBI(*1oaB`.941F w#0ahxX?%|\Wp1Y?Z ' G4[?,a "uSDX ݉uw*Z_`%VZ_ @4_UOWL¤*#yCXBA0!2@;>QYF@4*`bw\?|dniwءm5^ߟn2p=6%=_';?<`^#D)' 5V 3D2H QDڞ)HRZ^$ ~S Iyܲ۾/mǀCIf陝qd9a2F=}wI}dHS7Od^A|O_r=p6WjC\rR{HM@]S^H[ ˉ:G1Gyd0{O3i,S_dzUxbp ϟcp? X=b OIi5 .ѬЮ- pvw[70z5>DxWDN|-8:ڮduce`@|>v*SmP]*c畟[@"d9ݒ{mdݾ%L jț! `T3})gUA[O=:!K#%9~" L@VM_Zl0_( L`r*f cDѲ% qڀl6ɶMyׯ'=vh֏ ~xDW mÇE ~@C~0 <%ݿl=oRVIi[>wǧ=VGzsr_?=0`#DO KU?s)y2w=u-3 |ͼâoTI&]r=\L a~l}2 |G4]I'rcVO$3F1@d鲇=2&|W5AN ޑӌ}OI`2?%$D\c Z{KɽӉDCXAoahlpJd5[yf@)HZ-lO~wѶ 2"P6Xv׀hD$`Ұ{ ҁ%ĪeLmL*0YD]1$b]@ Q-xavvfX™8Ou&3B.lDHq^N@ʴu$% [V?hhF1(5ޒD8O`|o; n p z\/燅V6L ?I-nooUZ!J&ުoZkQj{&l5sگ`x(L'%PE4H}\`_ t.?ck'FԜ>`"J8h$\.;#EY6jpF"fWTs/w 4=n@& ^`guJ@DFh<o6`@4 Df$0Y@<ĞזU*^Hs3C"xe\b qD|^sa׾p7QwFohB#8 p nXj @rh뎌vp? Z6 $ *IڟSW19+sV8{q Ā V׳J+wsq( .Ϋ_u^̭|?>,p=з'>MKurqW7Uq `a(`ZNQ2 i~ [z!߯ vݯRz}~KvdXd [2ݯ [ %`$vImK2n=~!D!b5p/x,/`J_]ǪCf UJ@HGS*h^IҰi=bvڋD"99%h89XKSC~] Ra4OM`&\䞤">s} jWWDb7rpJAL '0\oO7>^p5 3K?-nocP9WV}j or%*/_j@\s)@#~mǘ 'v;3qd =HO8= ljM&wOmn~Ok2 & jȯ Lpc_ u!- ++U,1PMAM $Gk(I TBl1iT X9}Y+JB^z^@K 0vA(2zn|,yq7p42b=OM X"c`,b#D!rF8U0>H&vG:_!$j?1b@xaHV7}E/2 0" >mXNXişKw S_TYOW [L8 2_O=noo'\0 A=*Z-I YIb&*@&s=U2}@ Yo uP׮ Nw"4.o|rOzkZ%抿L*W*TIWWD1@)$YgO% #*̚#csӿK  M6 ?Ŀ?_np=9{O?gW'~ Àc6NWd~"OUe\+MaNxI m xrvV'W2eN1&䕏L887h{ uIqdSK2%ljU-ӨMEmaD'h59zR W@0 aw HFHLbD@A;1@ֻ ;Lw$B.`᾿cpgO?ᡙcōBQʄdàD|##1`?S_m#rl_ G+`&b >j%_$1V(II5 0@U]Eo6;2JHߞU?;2מuK߿}W;f8~=* '=V{x|zEf3M[%m'w! h:!><p&h}  12&ȡբ#HS M8)>֡.@]vۗH@%`ǞK2K&!b\㷛>]14\xkO]u?0rOϟ?7a\"9{ 7}ӢI*hì $@M4>KUI]@@u2@&7O^J7vr? ;L8$LJk|fc*gb<;|%2!\O).KkǏ;~5bm)"H(|)^o}LkaL%Š^oCeS Pb0%b*WOIo)CYW2%cPcreIF7jVUmж-Ck ׳ExxW[{i:/OSׯ__᯿—/_p{{G .+(|t}RB >(`?lvHm^m/) M5Fy| @YMHNJ].z<]dl(a"|Q\<25_>3Dd k4 `@cN.$_"u:NuDc3.f$+Dk KIil,/2} @nmY{Y JXd_Y~nԄ|t )կ=C!ύڑ)<1 <0Io!Hjoo >EEV#Qj (iaݗ@d(GDt~$i9SJ0ל Mߣk[ 7W  |xyh9T`4NMnO*߿+}߾Z_ro^]U=QJuxnN"V\}%#C*χl)%^c<= pr=K2n px$|,:! VQ&4*3;2u  u@=Cqj]yNI둆#")xkH I[ RMͰoz~|&dQJh ƀ) dB ƩI }څ`oS^> aY??1Ǫ?frRLWق ^{ݏ-Qk@Vѧy{ 䓘πD IaF&B0I?vo{omb>a |ƟojrŬmGmElO7z|Ռ^s%^vM7g#=Os"pT3{&O'rdZqpCAF픸v,wzom9ذOxdP)!v'^{cA1d"1=S%$;xzd"BHՀ|j;1ʗTh*+!w-]d@1_[ p' ēmYhڌ dGxRWR"`怄>Mb`&^*K%KHN(A%P/Q_>=m ]JS%YB&+cUɯcѲl&)a%OJ *_O8"- 5:nEJVu$3?f Umi=f7WWt}~pWs,NS3UdthM0`^#ÿ$+_}÷o5[-V O߹S~G_E0L=4{^CmT=W2= |_e$ȶ&k xj)^f &EpIسjxІ'GvI$xBQu%(gAL"3Aeg2y> q ?:kW+TܳvZk8hj{/=E}P `Wlĉ@I )BUC`>(V?J_m ~4gS@#06>OG/ RPL"ZI+$}ճ/)@ۙ<0_ L0I>S$Q [d>[WWTMےINq g>0rdqNV ,E-|+|jc޵hk/VOL2Vooo}ׯ_so!fRٹߣghm÷49Z̧xw? L|_pcYȒ+NCژI[YN:I$~zqw8s&Hb% )c.%~9І pІK2[W!.GS'$MJ0!aRyͧNlNǙߚU ?;G Ϡnm5UJ`*p#&0HRsXC|LRݒUP6!AE Y̰PքVPR 8O*B2!%5*3C%PC?13%RV1 xO*I"DlJ D(rdxjփ1RULeQ xbH#j!l%UDN$``jGu7p\'yy5ޣiZ4m٬Ǭz1~>^/p3a޷蚪?*d3 IDAT׶?IaQׯ_/%Ka&&_fY E-&sT8Ey 6?h#ٵ6wa >^/S_5d_]N>N ptI8xIԓ,GfxA 藺y28ĥCo ?Z}+g%Zu=r?=K `p \A5MͩkX ˵U1DTͦP tBQ@rUA-Ъ`{0J>D69.Un1];g ];%U_L1&0QTT@\͵jdIUBĊHƂY_O юST&U1/0b^rFf{ߠ:g3\_-j?ǧ=fxW_o9'7]>U먿$Oi?U?U/amdUӿ6~tٙS6$O'/sI6%8; Hc3vmi4̠m?rJx$;g7|_NM\tx:G&ԑs $ ,Cuk:Pd FkA\ :BR<*^c8ڗ,N @_n0'P+T5GmU@1cU)aPL@dfRhT2̪RR|T( `PTsAR`ez-@,Nnbhȱ;8> md>!)㈿ j]Tڲuʔb&( Ĺ?ɚX.㓫3<_fs)SGw ?^_>\5n3,T߷F?y'e6=7o?G$*O۷\;| _|5ٿd{~2LoB :H$q Q *v-g vZVN8; K%=o */pI}dȏK2b ̴F 'U{- _@QA CD 1HH`mIbOZ'R %V1a!ToW&L!f?<[uYurgJ HD)@ N"U/*tHE20 u(cGAH:6,UmzόDŽ2CQ`m'EV/R`+JKbP'A&j6Yde&6ewE%PrWy4m=ڶC63f=s7jwq=mZ^{ݶ^)+jc?}3_/_7cZ#ڹ+T st9~s_2LJO;dKx|\bC?{k>fM״jy͞<< p5dpz p:x }ޣ щAJFd#'j %6\b< 1uI8r9q^ P. H*"j/@ _'@3@N%ŭ!X!  X"aX9SA&iGiR@ {H`#Dɀ6Q;9gu?Лb>õ*_j7uuZi5//o'+Sϟ | ?~O<>>bZNEuT?ӊ7B7[3gϙ_vd)H.&SFXL7J/=]ۼB< A~8qLݿB2{\~vI8x$3(G@G` n8? xjP'6X3 ,rtS XFB+D ԗ}y n=P˕H(`6}*='Ra4 SAGFLrTU2Ul S^H"K =(~Iүi7HHU~ש T+"5rť[+l~Ne|zb~9s,=aַ6{v Umi]O9?]PZp3󟡝//h S^^z7cdszjUd& UٵBqNl-2 pz^P5A[:08SFds&M %+%`M$uIvS.1[~u9TͶ3.t\#x>aM`ǢnI`n+#A]G bEg πUJ6f&p$H7aqЉ]fFsl!D0'.% = k$MH;T{s/|F8ɏA,c< +:6y䜀? S2~LюK_K1nI/DH +( zϤl z"ʟd`_IB߶mׯ>7uX}Ӡڑ@5ב'sM~֑S2{xxȠ??3ݭgmmČUG7S~~~࿛/szjreN`Q N ܵ;w2&SSc'|r-@h/#O%h%D镓#_ߦ7Ke@.; qI8XOԽx2҃U,"`]V(O h!ACD $"d'_RL @*4&A@MLKRbגN^ɲ+ B!!_Tb@ tD,QAHTҎzTq (v+z P&AU.$IAQ*YWGՠX40crʕ~ғ+Hi2+$Ȋ*όZ^S0Fޣ ڮE=f} WWsе f]3w*Wb1))sg)xMJ_XǦ['?'$I߿=߿}Vb4qvWӿJ / g|:ɜdeO)^C3'd!&x{}ܔ4}Sm/<~)N*HN!??xd?#M K2yHK2ȫK2I.S-k9bĩYa+J(5A--": B !^ A XZ@( UcT^/ޝ@}9zUrJ%#ak!i bm{m!XEUg-Fx("X,a'sAvgɆu~5=h%bd螪N@k `0HE\21ɶ ߷Nlj>b>bYa1K/ۨ4F2O;1̹gSIPKsDݍ]onaykisU?}Wo?{#.dH^CHxzWd~!g?t}1@VxJl+0`dMTpI@_&d%E^m<]^yD<("fu'6oˋ(Pٙ3I P?gk.c!`ZW"``A=OS: p\fW.A\]RlErPmUD\M 1'tMTS/HTUgJu^, {pR s=,(p:&!)J=Y_R3'「7WAFDFZy,TFwg;|y߬ﰘѷ  {uO`m<oϟqs}y)LSsZ=?<<_K'wTEݭy%dpi@;[(_\avum+h&w\W2w<5<<kn􉁞3!t.mn:$m2b=5 p=2NyD©]ߡd1$~[. pI$GxBoA0גTQe ^ ׈R*tQ?@> AC# @kJ6r*Jwl2~%%YwY QO Q)FPTbi-RW`Y^ƸEm/ERl&[\a>"6}J} {մi8i4hdJ&_uf}Yߡ>;>~}0S rmrOOUiײ߿]V >VMϫ I;%|vxlw9KxB"E)`^||. k_?K2q$>D©MJݓޅ%AkK2?#{M XLtS[`b ,&/vuklAHS@og=[՜| Z7t&~]f5m_6+_,Pq(!X; ?1lb|Fr b$\TĘVye"@XBT|5M~D 1S_GyD3XO BEŜgYTt!N7ti^}&s2pV+.{kѵ3M?;MUw}>6]ӠMsT7ՌcWؾɖ7`,W~ۻZYiog0&~&s>`$.+:Bd^ Xh͒di?Jp v $1$-h$uTЖP崟B ϤHTN$k[q |+o2(.߷fʹr;s][H_I N)u*qD5ً58+n g%y$M!`@"H*\ R+MfZ@X!GKHdF"?|B ,Ϯz2s_~S'Q4_"l&`vTW鱛N bE$ yP2.$Ae]59J>Яv}`^m6 g̷mmcd@S+`qǯڟ`dwjscy.ojX/?'_W79OjDgj4r_-nv6G7[+Л?=ng 4]N|&&W|LMJH@y"yߋUT{$Dm}|T2$N6$CV2>$Od+6\NM&M\Nw1ǓvHOb,`3 r;=doj KWqP{%5j '`f .A 9US| &frvH =&3Ĩ*R@K/>r.0Rdf"%?Zb6/vLĢ>8Y;W"4TT#CSNUH'>)$C4ڻo.ѿf F*з^%mw`e,ZlX$]fn'=GLN@~WU5= VK%폣~>HWH}FSU@U`  MÒ&M%f0ꂭc\8g*pMf kk^+ qq}[}k~"\\\=ΒԆ=[S2RmgLJ,V2_9{swmJϿ|ϯ,FT#$(`w1 s(6q}gJ$Γ ڕvixd;\!8}'dxmKxޓK2y@.o15&OdN\sil uGp-4 n 45 Y 䠭;|,X6K`/rATs!>= XIM5VXd&9OjB*b__r,Qޛ [n~ĥH1SWɞI+H\)7}"($O{oSu ]ުh=sߵz3~" :+ԗ^ck>UM&ۖ}}}?ӾsriߝUksTO_AOFkTQ䨿9bߧm7o[?2lD 7l=8AK\sK3%<?bv, +%0rR]&dRPWJxdm.d"Κ `gLQ>QuRmv طpm7bi@ŠnHX[܈&C'XۀRJ>N4k+򍎳ɀ8aHZ[@zkFzu_='0H Jy ׆|<({':\)%9JM:o_OduwkT\>>28wY| im?<*ogl=,T0'/|u8Rې$k$$U®&l5< ph2J4M8[SwmxIx[vI8xڏ<$zxmR ؁\M Ā8C߮A&'S5ruaY[Fw֛Uك\%3OD` XUZx*}IO]_]^S@9ZӱYR@}Lf+~$y'-*L]IUIr8&/~ ڃ`9OSuJ5fUsTٯVF~u?Mq~>߿2+_?K?LK?߻o[K}StE;9;߂?zNMV?4 PwM?&5L' v5d]ҙ削Pw @ pu:>Ͻ?NAU2Oe@.; qI8XOԝq<ȄxTtVJwЀ$AjLPTEIIR?"JB ȟDhgQIM?7GU~Ǟ&Tş\3RLP"R%8IWߘLOU\ܧI?96ʽ}i&UkB=)ؽSO{k` j!mjWWk{|Pb`ZV@eɪ9UֻFMW{vtϴ߿.L.$}o>yFIB;C"~3bZ03aİ|DX-+a aT1/2~rz4-~g9f7Vl! K+DxTgw'(NhOrX;E0W*^|b_*殖3[PHōs Z??T7¾#WYnc xA&_o2_WȟV, ?>>b1j !S5;uo:*yZߥ?~RxO'EO`S$<9}vd2m_1?s;Hq p"Λx/$/25.ɿm2<MEJ#9', Z`XAz zV?VKK032i5е|[7 4\fodץt_$< `Ig5о{" ٤J$ r~mW> *R $GꀫSlsow8oZv`S,&?5T鯫5؟:ү?<.qx=P֏/z]T@6 - аW XP'(&Fc&\iFxSy‡s (774`B> C8`?Lj9`}Oy EBLwiQ$@ܼ%wM|| $%ɫ̟@2ONCU333y`n{n~E2"a=!wqm8V;ouF}`Uwہ_n!/*DY+g]$@8s0*u43&$dU·U+5RUP6 V* \uhk2•T? Cp@M \ )ЦEA-uXpÝTx.Oء. d ?J( ]񒈐ߍH:/hsBzD" *@k.m"a89 1!K ye)/SQ{~u`w\~XɟY;^/U?,a~.N7Nb#8?wVs?,Q?Ͽw8q}5X!YV<qU" 1 >Wyԣ Asӓ4 @j Xe߫fO O`mU d~*T$2@n yM=1I;У@`.|"E0PH #@]߉onr[h"oqH]Ak@WX!!\{ tp= gQd>1_{ew#(K|'Ui`[DœQ{ѱy *} r K=AӊQFJQ@Z$` *]Z S*4ڬ2P0a͐lV@?GITE3a, E%~ K)ZEZA@-7DU_>q<׉ 9\H? "phןQ=]P|B1a@D E$"uwTvˎmC6W? 䓟ggK}H`?}S?7;p!a~?q2~Z }GU.D:|5vE=A~@+& % -'o׿8`e18M*\ @( )KM(QTYmy P)b`ĞkmC`Lؓ e6iVxǾLÃy}0p*aQ5{ >v} 8Q$K6#I9Q^ ȃܓ`_eG9O{U||9P Ɛ $OJ%>ƟG˅'99Q'hp(;hXωA '( }EVgO€n# Hg  HH5` +;uzeUF,%e`* ž*Ԅ$J< B }/|hP.,wiзZ]/"HHRHp)S7^wM9ru (w>H}NODdDϻYgY%Y|dA^%xYfQe2y"$B;&g#DREuq?Ҟe Ixߑ;pZh aQ4@X~okp> +OjJ~!eHD%wEc>Qw *$@%8\U2@@ Pm~PX5hhӵeXes)dW %h gXP^L N;t#y'p\}G8:C97$#b9='@tnW/‘($<Ȳ90Be,""/w0ZT?/W_Ɵ$ Og;!ю>% ;eIGh|#nOZ}' ޷;hubNͥtv9iE$ 4u$+ s\ڟ`S!T@Q@^ 0/ @)>498M.' XC"!DL$QAmD y9!@AGpa@8r!X[ֈZ)2?WIgUHB_ gE$C Kwb~^T>_?*Ÿ ᭒$~ BBi@#J%pNb wBR K)!w߄29" 9K:{Ug@TIH2 jP7< .K_έT2+?T@'>'eef`mV* ODab2@Lx\Z @>A<,oc (D  ߄84? {e}y@S &?/YH")9*iSHd8) P[)K[Anq=C#RfcI8y/ϧ$vGHΗ|*֗ ,"pl {ٵ„̋vy9B@  $vpF(u*! wJq!v[vrݯDY&e4(D M+)y(lO俫`Ҝ.ee{Ҍ` s"C`LؓURP`gx/!pzc(pj|}3@@ޟwHJ ptlP c)X|= 0mU?hcXM>I\@f*ϐIԴ2@pŸ-J+TJXe6l$BVXE2`AbS˞2Pm]_nf6G?$`ΰ!~n3TE;!? ,p WE q<}9 QT7'9≈O q]=KG/r 'Ap?A0 —KK@.gxN~H [)g(SΑp@#. ܿCPB;prU8-+ ;-O<@P BqO}_O’RY;*| R2 F6 JE@U5fPbU> · JQEPl*Ku.uIfU2 ES* P)ƹ<*{KϹ(u#}# Ax> 4*G4mHzqM$sZwx% bPΑ q~~{DKm'Sop!\tѿd~vG2KYjR j!ƒzIϷn~a>9<@*!v'wCOx0? t'1ϋ9d>q   u ˆ,\<a@bG a<  4 Qz0R$D.R<-w=O2dGE|g#Q>/'-$,ǃ ;~Dn6}0' !XY g"r;BĬ2c,R'1A0q\s S)eJ .M$Kx2l3; +1M)pV^>*4ޠM6 9L*RT൙ÁJ"(e4$z1xg^:?" "6)}QJA|>8 R'P-H"H|{k'Q7/[O:X ȢBQ@q҉a'|$@@? > *XƱо Wd}"iI#|:O+E 42wW vJ:}w vc]G o?*Gr$#@@I0n~b}I( (5(!3(  k H*|Jv@h. ` ]`I U&IۓB.U.{}Z$H?B}Z ̈́q\ .=#A'^U >BnP? B8RY;\tUϨfHx%)@l ^La<.A DyvY`_}Bw]}LRGN ~*IGq97#(#(S5(_M$í P'U82@ŧ#4GpUQR< wŒ| 2@EMم\%S* \uaaE&lCמ2@6xZy 0 !Da)@('q@^̟u\[ "#X/2:A!"X0-̼P[T )h~փvAwy'9BmprUAoaQ|ÿ9>|x=*G8?!q | <@qUxR#CJ8HU'y 2 dCL=C<@mEJ݂ )ns(A*6`(UЦ[$sTkٹ2[:KU,hf%uR*T[7L rY>|lEu\:L` qỰd=.]Mcci R∀$x=*祢R4Wd0ͥ0P2l}Dt6[Q1tsa,kH" .?,~ĝp>!I~W_ '\M* 8OJ) $叫#E¤wf|E |H)2 ƨPŘعb H+kɜyT'~U0`r}~e%P\o*1V =VebuQ^yyx&܃ơ}^Pq1YAâ S ޹OD A@ IE{,;2#^9X"FS !ğqu 9g8gmg9f¹ Dp_u?EdHB]8ܟ"ϔ3IUAz 0σ|" piwu"}{p"OsB1jOX [Sߎwuk>ĠBEEsϸ y[מz%wE s>+2{"V %`̃6 @*,X@e-wg]zËHb6KVO;Iu=W̎`qgbO*}JW? gB@&@I15zp\ θf9u>1S[e#wlbi$17U#h8>I*$| |/&Y2@v~@Nǒvε!沧 aː(@?}d2"2C!Fѱ^1Dz?u:_ O~#k.e$sG6m~T;4]/Y,&kTx@¥E9E(  $!AHw \CG}0vR؀IfF$V)=|V  P ڲe˘d7]qSYe" F2V:~\Jڬ2BIٞ2@ucȔTHTN _. bB9B*lrA 2HHM`|U}"pq}BE%҄ET[,N^D,bY)sI/8 ?|(2@XHWIA#H[e3aH A$h :UM6Yej*4 `BH0y$TvZJ6D@%b2+leK쥥bC! R(R&sD&#AlpgaF*י ׌$#Dr~ɱ;48s&<{DQ@4 cdl}E Od9ߪ,EF*:J H] j\( VXK*4 2@*ې20*M(bufs1$~rgK!A@Gd~~? q05W̒EA*% uLP ҌTtzh=INIߤ iOM+ yNט2gl%_㹾jiX*n *:V`a(' 0M[x\%%BL{mI%iO!,ڗ9v:98$b6΋I]Wd; ƹY;yQ;!6mVٵ*$4BHS0SfO:$@L=4_'LNTQaH P ` @[m`dh 22@cԕ* OTnTÕoqDBf@a{y׃R1|1dXB$)E$?,ۥa[v"WtgI_VLǫd5 ^reD,Ab5 D&*g,$ҼB* h"w})+0m,eKd7ڬ2Usm7_peDD('sk3)LO8 ֥S3ҀEɾzm )K`IO P%WY33XhNX{8g^& PE + . ͋X $N r,TX2@o})<Y"d*g>ee‰*nV nge·=1롺.7aOv0dcdŞdq? $s"Ҧ8P>M3ϳCspQa=B~XII_ f|cB_b|dH(,@IG#"A''* {,1РkG*) A6Qه1T 5h-k&5{oZ|4mhcChOUQ# RdmXZ2Tu_յNBK 5cOɮUyDm3pHf|PB-2 W E;El:RQj ! mDKIs[`1&H N6`$(z}fL>CR?u/VVJ_QMKd͉q@`"1AP̠IA.R dPZ=KTV)* OV0IRhbY$f{dj 2@k&I܍n(S? 4CbX p+uFm,&eKBV4hCfOV1TI9M8KR\qpm!),PȬ2@k7 uPԐ2@ . 8Mzym 2A,Hd РS\偋ړUh 5Qd50 ڬ2H `teE1&Zdr )T}Ą=xƋCs мs˂,.FHߌD2 2ʼ[e%hr>Uɞ2@c* ƞq2@뿑TAR*S,3DSKw9>e?) 4cUI&'Y@e\&@l=U\0LHphh :Ȧ= 3h3aOV@nN2pa'kQ)i{2Zez2f<2BEZu$ 9?Bif^[otI ` $Ud[e@= X.{rZ`JVQ+he乳' PmW&dQ@UBwS@IM.SlPmz$5"51h{yYb*4[eiړUdc}UYmKP I$b@fĞ]BR&%RqMg"`0Hew@o2 )J9,%e~ +X*ط8V`*4ڬ2pS#NU2@ ĨU6g4}c)SEe(Y |ɤȒUAg `a=f 0 7`'vmOV1fǞ2U(&hl'BCTmT Td@oNe<Ջxӹ&HA)fd &A[aVSlYe* hdC2@f_X _Ve%2}4}?pBe0O]מR!2)DMox8 PmK 8 è 0PЦk&@ l*T[2@m쩎T0* = 6I*D0)},-觊x4)lW IDATsЕCM[ejm,eK4D h]Q31ЦtXe ۸U0IXea!E|vH1 Pm @]9] BY*cdy^ЦuIdL[em ڞ,0(b*7!c^6ٔ=ΩUFl `|VeLcFI cOyfԊdqBPtS,tHReЖqUJnQ@`*d7 h*SSM+MXemДoL];N)6E`'Aoj'u~"yCT&xzQVHmj`IaTPI&42%) P1H4d[eaOV 097 `yaa*ȍyIW$jJ ܡmVr'!*~+T2@ܶ%0 ڬ2ܸ2@Mdm' Pmj]_dGXej6Sug,$>I/eblͯ<,R){2hYzkHfLVZC b a"2@=U0d&@ ' Pm A VV`0z}3d]3 I*I)MTrW IB`][eĊi{R` ڬ2dW2=Ye@UߞL8ō6äUh]J 6 {f|s$A Bw+Tda&te@ȹUI%i@E{  `܉v2@kW&'9mYeztH0)b[0 x20 Ѐ=2>4 PHB_USI [2cL?L{r[eD:h [ezl 0dmV mj>ì PoQXfca:jDd6s{9U@[hGƢ&i.@V]2ybŴ=(2$[dw2@až2@s*oO&b `jm\Y]Ay =10c$^A&h>ょ@[F@-$UP>i耔ڱ$%è 0>Ye@Uמ2@*HerVƊL2V6FHڈL1!wZiNvѫ1-Aȁ,bPm:Ss,0ĀUd/eڬ2@ a!ELٓXߵRVHA(B t`:5\3Dh$;KI=HڤǘPQHΗ)e9m0(V*X`UɶfWdmV=Ye1Ze:ZVP Ԕ2 &L# z5v%E)zT% `YeqYe*4ږ2@#9V2{K rJ11/ Xbhx.i5O @I!"TƲLh P 8 V`0TW 괧LؓU}Xeh =?G̐,CP 2Q$<[mYPUJcY`X$IQ:2d[eZÄ=Ye@[u [eIָ $@3kUn2*T'S)$+@Z=a@H&Ú Ȁe/# ˼Y=$oc5+tJs]~:,k0_!kW&'6t3aCiOsr_Iu>TֵVw#,hUI\$Z γ ?SSαy;M4 О@i+j  ~5JKI[g6Q#ѓ^}I/{\ L,iuD 1y@,JY"!810$@BʳL%x"48/>_D@(|0*x:K_ƃ $= d%p@dh i;j$@mNaR1{j)65['@%IP_MR{RK3=+tIjbod3q=wzl `o!p( =YՒc'Dz9NxyԞ/ch9ԧRcl!3yOx| 18Ddi[   }Zd~{uaPPiC۞$HK,` &5١F6ਖF@[=}3#g'eBvA {R%IٓJ=gHuo|5G.W?äz[˱sܳrܶ*J}-fžw4i@>"$ x0%mPn-^N@;K`PDfF}XH :X,kc"HI[v }Z$$ 4 `X)UX$U(UUbOyRU_'ajDL*HC @ A˥h9-Jn 9}w{`5&Igcў|Uz [i>y u S.y@Jڎ8=< =(~6 PD$ԥ ` EDp$pM?0] i\> =Ғ3v.IڈG=}T~gGǛ go90/<#o?ZS>?_:qjӸ7/>[8B'qO,|ln"iǿ'~/;ag MO7&mU#Qg F/÷87OX~c}?f~8x7ι-V 8ן؏g~sx?¶Fq5V8;lzO=O!=ѣl}Xw|8~OOz+9K ˰KovB}8(] `nl1wRʞN}3xE?Zc9fų].qOֽ;GNQy'<\q坟Ī~98Ne~~ډq`ӡ.iG/*٠Ed]5pծ}7浮ur N<_'d3#`-8wѧ-w/G,?z?qa\xp_[#gS-?r?.x9c;Xsp {ѣm qcIa5(U߀R&g&I,KtZZ }ﳀ nJVw HM(E h dg F P{dP54;x/~o;yH)}Z>KE񴙟}?Xs(A?c2x-{*ɽ]NSl휭FֱOq_w+ZYI=Gށz-m$g @~졬_|K9,^x/+ X8M(]Cxi=?t{7omoe J4^̠2o} gSɻ]x}o D/x!V5 pøv+u'>wfW |>?v~2ۗ? zv'y]W5w+fw+<՟zw:#-ec8uo02o{j}ʘ/7>7{>RO'5/8uQz%_-&wIkn[>Z8/W{EdGx7~'}SU a@PNXtp'G|@CEh>2\M(X`t*d1^=5s &^ǯ׸v1f;Wj5{*ux+kcƹ;rm~7*Y8AM*ہo#{{߂g 0=N[OGeު8 8yscކw&}Tsx]omFq ?X\lގw8x7b_WVXŊNa1H #-Ư|ױ]Fvtd-8vxw'_T/4֮FV/uXu^c6x_G瞛e|v\?Ś[czt m|1V/6cc\6\b#$)}0e*$!fI5 B"M$z:봰lUXN1r*V"1 eK,1`rnH&Hו7+Wgܬy"9 IDAT,kCK|$3olOKzzA&H+r{O=#UIؤ=>N3.qӮAl»x'V_Wu0qe޲*>(9gf}&njy>\(D=ۃ6oZ-w_e]u~iaܞKXx6F.\G'gv5?},cdL=ms!^e3+'NaP&<ç?=`ܦ&fH?/1ai 7<ُ|g|;p PHA PţI1v]LrbkH_3I8xm@ W+5c1Q*H PީA*$_gvRY0uf `'HNP4 gdS&ǼX?XS?_OZNR{cX;} ` 88])s_:?s;z]k`{k< ދ?>/ \q8wQwkeb5h}܇Ч19q۟`E :^8xxl7yw~7>pK\W5ΡI3Q'Nbj ;2_|kv.^z[Uj9OC8yhNhś*?kk< Ě rsxo^#=>?8qxk\y~>X\_S.Q(`V{à l@]yuyw "ڮt?=@{UK6T,I P="a/,cӕݤ7m.]xg3iwMN˓JE <{'0팛'rƩބwG9k0"Q3UxjZ3i'#ZMm·?KݟT ⨻ &{G7܏W\wo(״/Wy 8.AqO]~fq }~nR\RdO܋$>wo| _ZwI}eGxNy@aZ@ÄOW?1|)]ZEui9~-ԉoGty#8^yNqÑq+p)W_Pw#N>E:Ͷa:82~2*h_6;&:0Y^xa>rM 1S wnlø&5Ǧ[mUoŲ|=w G7 W`ۙWtR?JA1+. P xgp%HC28 ?IRbu_Erp(<F*[tX*ĀU^{$IЖy V=^;P "un0R);xOH>1w 'KA×VL\Yg $/{=Y\?ڌzu˛nU R ~Z<9Ez>mX- q̙Z|0N :kz+~Rcef\Ekhqޱ_G~\/Oܸ{7xEk=u1nXlYv1L ?9ăxnvoYd|g݋pϲK"כyG~ggm\?uWa(ur(:.lVOSR>z~z+#6QN8.:="WueAοܻ\##>-7-g;m6pʞSwi]pϿ➳G2$Wo7n3x̫'/r㶕ONmO+ v*W=owr1rvhL OOҪ=W.z|%I,|dzWƅwR","}'=zĻ?VZߏ6<#uC'?mx:~kxMIQw~߹&;?Rڗw^l;yK|Ԯ(?ǃ>;u=G7\G7\3;7^n'|I'7!˵ϼySmFy`i_1:)8%p@1d@aGRK7AEе'[py f{V@{ _;fSvAG #}jFZM̟G+eXO;Rsŵ+U׉1\~%೅ZtjsOǵߋ)qk黋}g''_wI ̟g)c=RhBBs{}|l7'kw~tug#|q`#8)i>#"ϙO}G/?՝OO0 @43u.D=8:֏_D@' #K).frkF,,rJii2@9$IA&F#20Ae}J6-U?enFdu "dMɿ{Ε&.u'za-æ7IY<2z|l:Nml6q>uoKaϗ!ܒO6gHӋnu&'}myoz];oFck{0og^6Ys=]snM>LP1%O'aIL Ya묁 $ɟ p?x],kc͔O`BqоU/ 7 `;5Pe5}ZE횶"4 ī4yn@%eGƞ>p-X?y!g9۰e'LknWDjNlzs _< _IE;~J){.M˯3ƀsKƼs *9{ '櫒{6`ܿo/i(cVxSuWI_tZF\[j:Hw8p n?Sxq6_ ݏ1vV{'Owg;ഒۀ(М&lsgӝUaK4|3pY/SuJpc^Y,?pn')m:o}:K"k'Iu<wsʦw}+fl?*0LJ2PR *if{>SR( KuR8mxa >z}`/A,etCX$Ui#PTttLf65%&( 3A*3 9o,Gl_Uh ΥjQ@x1:E&KЪ&%^Zk'~$5%oH͓\-Ͼc-s¶1ބLwEݓjc^=W)*N=Y~b>@]xȃ7uh7uVdOS3e\a$cq%41d&_;n;v[;&;w,u6J=7Ʋvs.d.ݮ1ߑz^Px,>C9LH*(H`$s Q,WDdχih\@HYeB}]Jnc7Xq,A>,%̀X ?MRsrnJړi'aU۸(xƀX8$J&ɿFJd&VíUvx]<_p{3aĆvVc[XQ<9GGMKPWߨdzPۆ#v =66FQF'j^tvئGhwhqvWޭn}sbtmj\2jql.=cI}yLo͔y^6Քvy%#L.U+.n 9 K19 v!. eS$q^"3B&b1&\s'8hCRTnBn1kǨW>avH6_vR\:No鸖]HavI~>:%=e9Ǹ=uج8el2y'=eQp(f"'npA*^=(]kiJHQ-绬|tAvjFFU*L ĺz}Ғ ,ȍvJ f vKAŒşe\:H<²"NeP~c%B}=w$y "Rj9rn/mGI/S 5.s6&(D<}`w,Ib#8EI3$DP"Us׫tZ:-S>1cGHi@fNBwqK Z?E0і3v1v1v1ia35Ʋ6Fۘicb:v1 v\?T:h9CKJj:eR-j|*.|`M`aƹX۞cT8t`󐴍;Pz̪A%]~؊l2 kVh$={P{[-ΨTu͗%t݊+M(%ubf,~W|%mzs79'h\{+sq`y,{edlc4*> +~NwSV1-x0М$xe m[&GS_F$B^<`'nS2@ ΠHp ɱ8"Ѷc[6ưb\ŭ `e%\H /F IB!L# Lhk[<ӡ5d8Ż'߭lRڷMs[Kn8-t}R8EN3ÍmO8/:q6vL8/C]X^wS|$q3w+ZSx Bw?.;߮}7|}g\ŕ[7uFY( ! h0&8`zkllzau6, 0l@ Q 4g󽷾#=g4=T:[j OvXEhNTє̥mGXx&t\ǶԼhՎUZ[Fwjp-_kF5gذ.(l3`OA &W,GwV1Yozҋ?j0*(1^ qӯږyW*qZ.>UM9HfU)\0JL$NBdk * @ |/VJP1^kv(82pyTh(wD;FX!VfF"!\BAݏ=Ϧ=Ol6ͯ{;:n賷j޿%r1TEciݗ/J $8#D_Ahh-)h# e.x:L;UI*[\' 6,OkEv:Ԟ%} c+H](v yf/ހ u۩M=5'Mrz:I'Zc$>>8S\),a^c:mR2jR1lm=#Yh =>BOA Ϙ4$ @?SimjqV?z@$<<4QI#Ǫg^%0P 6'2W%@8q,x.YN$fTDEEeFt`q(. lz7$%mݝa[ngW3cwmY'u[?C[ oxuS/|#އ+MBS \xm\; [LANǹxԴSE}M~\9%.}EzqY—>qͲg&=Q@ 42ej)V$nje.TpxcN'L+6:ԣMU,3ueV.l'Qɲx܂;yw^:{\!l^ʞ>}UUN?Z޻e:4 '6t*O~y'kQ`,ztNKeU*?'keh-p( 0ѳ'%=-~[lt8t)t;Q2 (Hu" %%6%c:P$vFd;0y]D9I{d.lA4p$ii0EX#f Z$l_Qg$R^cLSs{𩉇}|BW/߃y.qV;r6 ̊&GsJέr~~7;j.ħ1,:,&>:r:zg?Ash g5Dhg=Xq(}ͻ8/0+|İ~|xH`oT;GY0`>|   SH,s`SB IDATYjk!U7fOǕ8T ]wv s~?\2ў#47*:w{ n;pntn^ފܭq g}xѡNX١u;MN}+#t=}]97GL9K;ov]}`U`Sr:h?+B;uur}EyN:r> 3CƃG?7\μi}:Wckf.9 KB"/{լ"7(`-Uay ]wU/Ǿ^'J5r>M<1ۺC'ma|k~) jGQTNSe !![^Cr ~Ә=?9p:Q^PfH&/}Ąf}K0nɑ7l+4 ʧ1o`SѺp~;,W>ǟMpԣV{Iy (3z'~_TtYGYAQc j՛>/~9\u35t7_ܼ)c Ԕ@oQF8Oh=ɐMgR3*D5mO=J1j[iycA LbFA> {e" rCݻg=4l0Z@,6 T c)a2# Au2Xcp}d ˘Aq[aǚ|9{|<xHȆlD le|;cMt=e/X+>5H:\ڨ+᭘F0ʹ2_ l,-Eq'GR9Ց] [3r~ >)'LnAgAօ!*s2'qgG?bIN&pIǒrUtSN|v藸.{_DQ4$qNh'B=OIWL< /،X#Y5/4 ߴSBƚ+Xڃ_ L  Wq"NHB#|ufy9%/ptY~*`)nl#nuudC{U+Y7_ko k#'qV`>s䃺(~2Ǹz}{e s6Hc&8r4'A}"G-hj\9)Y#?º^A;UBˆ8 W v1;O.*yG-8w|,`94AwcQ7GBYV,٠Oܓ<1ރkJ{%pc>5asa5AYm/㬮G0n`,:v } ^L:A6Oߍ~S܍*+v/$֦9P p7c^":{}^LdTsffw.T^deB)lR @e^D5#xTk_Tsת SdESb?>FjU3z`d_@X(F&MM񂀢\j+12Lfn_s&`<%g9Y/X*gR|T\0 \|ƜlJNizg}` g? Pg_K?%洗+Cvu֊-ݽ\u}/q_ EX/Y)ࢌ|{V`sz$T"r_M| w7MS ѿbTG8lr ^qBI?և,-ɇvC!6]<ǤW^_!׈pi~IGg {9v`@8~S2zZe8c~,?G΀Jʻk1N ~J)M^8y$ aK_!0&//}Uiqݎ_-:_{4ty~~ժrbaTO+zl88YP9)aJR_Q?=\R8v nt3'JR׉ʥxzr}sOEƆ{xƂP67:v+D _o'(TeJI\ԍNֵ"M_!dmWW蘡fSLhXL&RmKiĨiKMP`.蚏YLE h\DL#>|&̣䥸O30 ǒd]`qpyx<TPCh8қƎϗ}~♶ 5m3J @qƎ/V~4ɸ`O|q?%_mZ 2.Yo5ܖ`@Pmq8Aqc n|wa~}+' W1ƕ0U /g։|A=m0pw71/_VV]el}:Cuf ,ug2_t W5oB06'r*׵s֩8 rs.iQ kH~z|d|:_BGhˠą5"L5(`t-UHh2:31"( q,|N4UQe.j+߄D ¬ ^ PҎ]gjQ;r?`R(ǽ+ !NIl pxtٝZQA\I^3L*K"'7n+zՄ A{UKo+ io't|%㚗ojPױUqo_?%kW>ſDVHLK' u@HlĄ *H]s=`#@*1;Y"d!&Œ"~8mQ:^cR3jL GJhRb?@ l*Mca98dzDC)d< ;A `ŷpm(u8c0 lU?ķ1ٰ}HǪnd8!lDwp.YG6|Z rR#|{K'g?_O7ޅ#Y8h6}yֆϵ܅^[j;U"HNalv7-և- ފ/;%Rq8Gsp[ǿPq૝^G.{"OǸ |Lu4+S ݆ދZcaQl~vL!w;~WƲO!15\2ym׉ߝ zgD6otgW1❅{/-N斤>Ot ;Y-F=m%*Ѕy!9ύ1#`Ũ U.#~Oktj7 .?51D2 @ U-Fݹsӳp(~`&SwǭtT!}鸉 Z׹F@҈ ^rF'埑UUmo( APOt=9B;ϢeCS e.;m8V1H3Yfl &Y3#7X @H2,ˤ \.0}``cr cO(G[1NYpE}D w_+>W H7Xp^Dqr>_"F\9rCDoQr>wT+ǴNXKcn(9V \Ji Ou_D΍(@ЌZՠyY/]ѢRl8_ì .G%̉.I][ʔO.GDG8K`tamp7 >PT.l1.7wjSSO~Blkx'[}_uOan ; 62n DCUnga[r^xר,2@WJ:h>31lNE:{ث !SdDVY` kΪm>֊P J/=2I~xuʱ l<]df63!fd0H$f Hzx`kxޱ.9Āa"f |3X1P]l_lKP%Y4iyz7f0БˎeX 5/狎soUǟrZWP)$2%3 pGx}AFNBD8<[\BhI0%VJY{+^ QA#`{5^s.CGC„FZ| ]3j/4}6ݪ@vls/K5p4-(Vuʄ.R] ;9vr]Uשcg%G 1obYT?n2r-'Cn+}ï>in: U_}5 RJo| `}ݕˍ7P;lQ:k HP3<a<|(eʽ&- |<}֗yާrN]/ FP5JKQyfݔaS ./EP\'ŰfU]Y=uH0*ݖI^`=m8U-BryɤSe۰aM,c ˱qO< 7N֭ԈlSQT5(JDm`d+;|hWN6Xz7-Ж)`69EEZs5NսvW;: jv[4@;Kd !q,GcHdQ/g$l& sHRTf `]74^ԉpA[. ۄx^8cϔAX#bmtΎ@xu(4"qo6B`_T07RAlٱLNKNq`1 ;l չ~̔>U8? KО8iάOr5[þ[  P07$⽨0 Ws\Ɣ]E85mXُqԈ#pdtb1[+v;eJXaϮ.Gpi`3V@GenW%MbXއXjpJlO~ޟ S`8+T]aCuň>b#V^D{QC :0נގw5&1،?O$D މIW`fz#f%OkM}lDmƵ82ZHY@%SY0hnIFJ->>'AX4)pI Yw-B#x(t)dY6}[͢& b}C3vL)"qḈpY=!4-Oz-K eRyT*}cCwitSRRIsJgID?8(JOԼMG)UH+ŰCHLecR eEF74O2hRJbO2r7=; aaU )QY9=5ϔz;g~EjW~~zI^_ Xᘈ$[uvԢO  |JmۯrWNu0KXpâiB@N4lr@%+'V]0'EI{mU3>}2ӧ[I4T%LS(+k+Zcz΢6v^ 0z0f"h{-6ș|L-GoR&袎xA)ZWўg?CyP$ONǨTTᤗqUӌN"* v#3 4Ϗd$!J vSo[$j+JED~p,*@\%ױ8eFIwg#t6y:I EJ-> !9fنEd{L1kL}2+K)]$%'29~$ T*LsaLĤQ Ob8 ]IzԮN¢6)^r!Ζ 0ZlkDq_D#d4U~Wp IDATccgxo,{c䣧ɄgIjLiD6& Q"QDZ (!#D R nP2gPi 6APPf)c ʜDƱBPqmd,`4p\| y~$ٓ6 aTybM[?!ȁ$dSi]$h;$m0@HS4$٦SҏDX<3(X"H1cnXm&;%'si.}Mg06)G12QtN Y giQ[QL=Z1[6Z_@nBईvƒ3=)ͻ nf?T"HVRMewH6P&@(2e!*$Q#Vi0~jՔ!12`uv$###.e&}w:@[$FQdbh:P ĂC&T)m#()+h˗uS}r=LÌ Q\4LXGl@4!AMPDa*~d(HU~,u J້>QC?55? ".>ȠZZDGzIڍ.uO3@9`j 4 P2eqeɘh8Ч!>L+V|#dX#REQtP+\@800VЂCq.Sry Ǝ5ޏq>)8U>,W읈2M,{0w;9#h&1$%_^n]KI*Y)9h21 /AD!zq1YI9Z&8ǒY'\ Clubum^)yhG8 @I> 5Z3h K"{17za)Mf0ʤqȺkUˆuc=h/j(ac`! M_1 !17r->T'LA <ƹ2 5赵sC/k$cg0 Fscل~< xfCfyk%o74 Ɔ^!w} =A{v}q։1g]<|0 čSm%Bhߋn"p1ǐ'"9~%Q 1<A{F([oԻGu ep(Y(ʻLsNֿG OgOqbucP8 o1pR շ9%VޝkC6Ԍ7|B|Ϯ$ihzIԌ.C'JT6Dt5_6CgA&M[B݌8Y2+ܞ:#Ć 9j0V92ɺ=nBB @s54{DgKra{ 9 'T4`wWGgFc@'1.5k1]W&*yF-R0!TO+X%L;9E|$+Gmbkïaa0X =8h sq|1>u1; Yw<@$,c{5FJ3&Nj!|4D gcg ZM}jKˑ3WSmssFJ a #;1 E}uM>= P?s`N!#9,959mT-3 0w#k.5&`% }B9 5;o˓ӇދaO{Q{\e,܌} T6=/_p0֧y/q~=(3 ;26it7X9a l+3Ko7$0 lF._׵+S= }'b+ǦSuUbч`O;!jd?:7nlo)bj [.EUoxF^s~|;u涏H.қ?/VH LŸ䌹915Oig|'!58,k-͜91[iwэ|fJl1{.m$[]j{NZQ)R^Hh]wuޗLñS⢌LJ$43q24]\Gy#;xƽqƖRMXٗ9`,8 s6{·pz \x+B;3@L)FcNv`Œi}Q\6g*ʙ/Y+C8;p8Y)uR`ܭ \|3Ac3M1?=;$:5r rM 8s96y·LxM]M `!뎗h'^Ċ ;*s_h &Эi:͹q\4KB /J1?ts‡}6^,"Ãc XB2Se'j tw {-q40ūPi'Xrh"kէ9lOq{b04`x#odDA@߃&>tլƞ+ 3<@&'6ؙIe/}^e@4%LÆk旅*9Wxi4 AlS!!RmG$.! B2x㨖ƒFOe=h㡲0UϿeR2AYކxX~-&8>-qlĔ=h21F7'J)0 2$Be 1exqTcIfoK|8;Wy<K'kI0oG[8.LQrN<54v8C8,&9h{ 51w(51$MlrZ\{ {jbς0pn HI\q~ ӧf:A5n聹ֶcQvʄQVOϿ a0ƚcIc*s5*xe٫p75IS?ðP?vX}>xçRll}R9\qΑ ( 0!~ulj`FWd wdH0;+P@Hr̾MD.w 6|֚5mmx e]س#84LΒd̋^= kc.ё,{4sFS r/"Jl^C$L)}L%*/эd@28[ ![JoЋ" kK$Q b<0׃BJ'@8@0@(ۉ 3K~4T P)G؀Q;>/ d^ZO8[ߍP$ޱG#Sv |`!zPgT䴲U%FpxU9($I(dAJ)a| OR8O?er? 7?h?jUx] ] A p*>>l}*1OQn{n)TO?{]v]yvCrMc,&{&U.aUmR܏g:?^ `Ě6Շ8\tUe8=cy^7 u1lX~B%uFoR[sO^>qRއm'r Dr8E_٪ÃXuw'ϖb'jVY~8; cgfL٤'+ZOFN@VXb7ᡲ{'o b*X]Ʋ7oOt5}]+4=) 1De0މ>,81,H'+{mN 2i j6)@(ɻ f:QHtXg0?QE9$X1ӿ0l@G1Px{e(E(@0@$Ḥa6Y$H vaM 5 rߐT4u"n;r7Uވ$'fPN3 qXRN&Rnh"Yr^?UΛG<ǀWo| v!&e.r ix,oѤ~8U܈ 1+ޣZ![&r4N@fxw>q7mC2F4DS'u961F6@c3$2Nf"ll/7 QaNM 㼾?bcLJsNغr RQr<:> +xC8Xh8}K1 fe̙RkÖw?䘜V=YNz XX}>b(d\+~0vzpN##–WGf8&Q$Uwcfj  U32.hgtx1ރ]G7rt.heqpց߃0xj Pֳ_(eSz H gPyWpQͥ3b'.Դ$0d $ @<[*,oI _v^Q=ȀКiH3ꬖg0.O>49Qĺx(EI!FpxӲuOB@""pԞtK>pQ\ WTxb"; 0(QjHIy91ԉډAJA` tB$^s-W,&pSh"X6cd ;O&G3sjx  2^*੆>+Tͥ,& +??ZރUO&E,_tc;UT NR:S%Ed+ΏBd+>*SƄp~I1TjCX,NxqFMXr/L edY#2)dWwWby"oD}H ,zQ2Dl悍#XX9e`@qw 1ԕ(G|BlpN1u"0$ԂbO*{?5ɲPLL"yOzG0ؙgF HIf(0@5RQ @t*Rb ]CʼF䗀H0K@d_MT-OV |> fl0A;Yr = "X*&@u`-_  z@8"* +Ǔ\$ nw?D4j3 H jBsP A $s1fo c6Dd/lLp< A Eŀ8;:ޣ6=<\qsçCa; @Yf|ؘ瀔RL7ꝅST˚,lIÁiA$8gR è(!9h~-2LQO`MiD!`waêl,ۯR'T+ qvUЙlŢo@E&"RL ek#fRx)ݒ;5iy _F~(Ң@'(QL n50 ,nB(6rW/h0Yy;jd$' ΐ3$t~ P-b~숡cB+磟ϼR D5~`s4: v_9f ,GsnqgEa}>&\FfݶVuǀИiC%4O>Ďk/d:')]vwI)v{Ѥ g~ {Ϲ4% m굵kl L$cah/c}EQ!9'l`ItZ8{3A4ذsu.1ٱ..tku`sNf韙"1^4sP=E5ALe=0s2192X#.? # `d~ߍPz[]{5T#wR MC7*bH{oo5<(CXiKQGNԆuqz*aQ>Ml5D:txYDecP֭ɿ+"AWy=O^O4[Hnǐǰs`iBS;۱ 1XzcӉUP/s4zg5tDy,܅eð 6bguwnΦ tWFtnS<)xFva05Xtz6 {ܟ:tԡ,,{6u H#Y{r fK0QZ$ҀPӥ*_F`-{Y;] w" rU{;0XoWה WcQп0^6 eP?YOmOk +D*p*WF8yt_مjIU=I=@Zf_J yzhw瓸Kf{2$ HDMw|cez?2dV0axz2)2!@C"2̲jAI zXa۠~3O8hMI$"K0UnݶV<8pep#Tc_px{\ #8py`s&ϹONehJdYXHX< |XdWL< ʆpx i1,'.꾌-9r(祁/+c쵷!\ĥgd4WhupxsReTu ެG,;εcںzaw9C` @ H$@o ; =Q=HCH &jɬ̈̎.\tWU]ν|=;'/_qX\??i}O `C%#f__޻S )>)AԟefPlO);ևw)~. گ&[8ۺN_{kd"|-AT g?]}v] euM~:[P{j7bn)~?8Ao]}kpS^?z`~X=/?BMs|27O>`zd}Dh{i(|lX)goQ'=AA(||s tߏ}Uz5@uyeD_DG;^|י`x!ڎ r;η R/VPCص$YiܓHO?jr4B>jQ{G OwN~wy"O92۟__&~/gW7E9g'[V#XV?>տS|??-_x寮ۤoޅowyi+hgQNօVK9#e7[7uPǯ찱awq^8g4`OTD1[nwzbNO__{?^כ?}ֳp}R_,߼?򝫟ᗗ?ps373_~_mϪ|0 /? k+BwQ*Xt?~cHfE&>)ꬰZ㶝~_佃%W^~?6._|'~{ٶ ǚeO[?zO MÃ,KSJ/҃,Į$zOI造F"hpy/+pO!@ ue}aު>gW|&1~<).?᧝f z=|{S47΍IKp_꧸{7ϋGpM=`S4 ~xd'o[=߸d=|p匿OGxxMݠn?|X~C尼]}5ܹog׭{kjcGElV|QO(y1O_C9/'/\}_}i*4&w޳+OTֆCT9ŏsVݏFotwY>!>mՃ?2Oէgӳ_ζrWyooՃeOa$65&Dz8dzӯӇM |jx,g}vI5{xzIt ͮ]C4JK4D*G6^]#Wז^>NVO>eY]ldy*s'~ k4&Cӏw?}_7ltCyeҨ:zonY1~:y܇?O_ϝ})z놙 =#m(imrnR}!x,[Hg;g|~>+Vžp[Ε7qN=}V°?+޵>Pdlal%s4B’n\ 팫3 7ecO3\a l<<DMmhwhodKxQw~]lL o>Pm6h#"ƾSx{Nc6 |Zy#Hi*Զy>Ai ;韀^8?kO͐6Mu@n?yx>mJ' }y>)ž:yKe#@SzT=qus̈́ @ZgC5>f=0XR zG pK@ZuÄ R)lxz '3,Op2q2uU㪋XU5d⩵Y*h@h` /i.80y4ڪfMmu/Z`y6pQ/\Nnni<󥙩HgJѮM lP8VӍy"$dP{=2ߜ34̨ȚIi`߳d_ ݎ2788lmxCNEMN;*PKg Ƽe2mC;wBN4ڴNPmsmkdaM6j3PS1[̑lr9ÿ_⽝j;S*s&8Kl6b ǢA# )´`>{;~`{Ŧ8'S6$LVҍS٥N~4^[{ħm{s>ܯ)Z4ȬUozMj7k h7}7/aY @$EdM*}>K ) e uȀ{݀4?͙ X$VF ,oȌĘ Vmm(̼= jo@|7N!z,>$`0c :^E9侁לz[v)ﮨV yVE[)7HaTaChFfIO*~6T |,} p2+p:q6/QdFTr.`%ޟ6f,J L_d;1j&{+S/{ö1av#THE^yO2cp(q( \4f(u3xՕl164#pW]ё W#=.߿E4;_?%a'p u$ s kP0& Ie!6}ƴ}* g8)NK2Է }G:pfqSCf9;iY:CSa{ͪ$RBpׇ9>zD6z\'^P7-|͚uK8SS>l-7A[#s=}}7y:6dHBUΝTk }|2/8blY`ڬ?ۢMm |Ϻ)5I{k4{ >nzmi֨1WӺX kj3^6iK] ~(۹)1>^8GzbbcOi'gp,S̪o['_,n,.P޶cwS^`r>w~ey^_[ҹٯ>Gɾ7Vf>tY^XE$v\~ Y9Pϛ.PƓFV҅vVpgm^t{Mmf=Żqʑeg~b?W[0|K79|;[=ǦP"楽v<}\.|r[`]tz z?JDgmdҒW p| `XʭmbڟQ_7  a9o/[݀uu_U .$զuw /GOɰ H{ rC; Am^c>avPB{5OMӚ[~@f iE@C\6+|o |Es+Ax9*?B YO "l>_|uP> :@ml.3tALM`z@x[io=z,.7[3@V-&d5g7oc*< \{1>JO)̙C}Vy1_~g_; c!]C38ͳg zv'4b?cXbCđ!Ǻx ijt & >p$kD ]/:A\bPg]T's; 6r'9f]zz#j i{1 _owY/7? }ۙ IDAToNy4{Fܸ|$p@ lr=_*E+p<33*hGjaԎj) KVoʯ:;ٽ{^dmլL\ k{)oNl9^ x?1cC3˸->- fݔWq׳Uln^ca`#8m:|p0n9<]>4 m6vY^b~\ČgZ;k`Pg__| w>rY7T 'qx{ƌZ f{x<`>fP_8X,fNF}sC{|d%F: }$!dR{g.v#^oE@>O)n#I"j8 1r,9&ir-]¿RbJO'euz]t/ql[Մf:yy}:@[I]p`^h|"c侑*k$$@/7Klj$@0`O# L9rW iTM/  q/yyǧ8]?c֏G(bdR^>~:?ǥ9|X?*_`3"k>GE%sw3 *[ʹ-+ B{uqc;VONv!^qޱaތ’yrlb(e¹rqmclTʼnh^Ǩ2DԂ9(s׫R^9NWOO)NU.[=\넺}8FЏKn&ja|~+|~]Cc4;6 u6g't`-NDmh`?(/}clT)B@;5ź[ГǨS뺱u兀noǥk1oȠMQt{kmkwYA6ar\1^zOrV#p @fqS>kCxw7Ķ1m^l@$ֲ8;W;x{gp={%zOod3}hsn>3V; /s[cr070^5 ܻymWX-'az`~Oے~UyFxV`xtp@]}w)ϝY-hnNæX~LFS asN;OW/QKBY.n提߬as5y;WGț`-`S]c5z yD^gDr:۱~y=Y9n{zg(%Vy/lxLofP+oFX>GQ]aU^Q3x!M9b^/>^y Bò7v^ʔclA,Qn^ @9rrٷs 9l!z9x.ƍ1yƦ8CAyFc2ADow 5e]$;i4^L%eXzZޯ@ȶ}Iht 4"+hlGlۚ+ TR W* RU 9ayQԴtǀqV7Pxa@):x>"DR ̲С1[3Uf|ޢ8-3dY{ [AX"7ξԦho뫠0zTDh#BC6fuvb\m6 p@D)X'c1 d0^bQ]arT n lҮN6πvsvG34YH(:]``2C" 娲)*upb > Ϫ>(bg)pS^Z#2p~ js7U6vܾ! kHq , rk;O6 Lpf'}pxֳK 1| ] wD^ڥd%Qu|Wb6Br U~&+=@1t_ٴ]=2N<mn(+ t9TOj;XY`GcބT :T@`umґA|QF@nk9+t'^!`)  NpuU^WwЊ ͽt%\Rq[y;"#3[v`O /XoNG5Zn}5hP9:>]LFiO2 BL0 'j"̊ 'e ̊) k|Yޅ9s[Yfƫ*ΐFڏFV_cV়:j!*Ԇ-=n,HH0aFY])Q2ajk]ec IXQMα)ԯv]±3fFX=6s2l橾]#n{doܴeco|īdQ=M_-PZM>`K74DQVWȚ %6̨НH[l7L%c]\' #7U,X-Z*,,\Fok PG m=D ;*.c@S׷ߨ0$51M_٦ <ĐZops mNEA& Bm=Ȭ7a`EytMm7pTKgǠ8Nnm ty"54gH.R)C@ .,6/B֘6/&շN pyEē۟uyžb,pl!Cz%צBXkĕm^[-CFOpU^bn'05`S^th6%52zyuyuy[pAkݚ_f\C^ wM!a T̒4w}j'PZ@_Fi#\oa) }gv;Jȟ?2[W\.QHW4VnEƔ(xmTyAVCGa`*1^u@e>K[a es,wQ2,;Ϟ su*?MqޥxvuNH NoA T3eX(7 k@߶XH};; & &oϱqR^FTz eXuҖۧ]SK (YcO&sV6Dƙ Euj-O<Ǻ@ڥuvϞ6)@d0Gў-0#l/z]riaӣ%VD8'/l#TXE,%EbR-ה93 zպڥ ɄJGyꜴ~p)S' Ku~AAh>z&EE3 O顸 nA!&6`|<`c(ZѾD<4 O|Zr6Pd+ ]A%;GTE\+:CQ/YJw }X>1Zg(!`/6X)fy@D_f[*3eE3ThK!) @hHB]ef0RHeʰ*vOMծx޾/Vx㴊iZ fӦFlv̫p_#7 uW6̠"#\Q9eXsյC[E vMV2gȫ ٹj/ۺSEJƉҝ~&V;C)SW 9 Q{叫p&z/6 Srm2@N ]m=!pqnUFͅJHZhHgצAjIj+l @&PZhuOMN>l;Rojy8PDWStT3YsO пU\f$:2CX{(skdr , "Y2uS7+pBݰ0$3~a2o7hp)PoƓ<ʟ^bf@' QMKh"&?i6ym,FР:5CMezGm 4G:.V2_fٯBv pV`ƭ=+Mqk̚f`+H9`Jp.')N|ln?z;Rf9SD Eg(_%@{Gx&<zI*S4 !BO{f9  H8 Q1]tޓxh7ڊu#n [ǟFV8dmn6TC#I2Q"j< @P(i,+s9Z~SsJ= oMRi 0t`@8EYdbgZ,iTx0 3ԛVP~溹u"c&QSNz!ԩua f^$RS9oza$ q cY ]|Py ic24׼G@T y>F g.V럛̡~P#Ě/?"c )GQ ILy;输Lm*)ziMn=no_3GB9Dc f3 !.n Q8bpj$Z!hR,<\v&{ȥhUF)KK2~zv]>ZMFY-(ΠtF֛+;ݪړ7 ,J u*mbU݀70}ŶW[~ #EBhC֔ 'o$@STvrƽ^!`! à&XF]g[T:Xw =wXy&V2ġlh7YW8|۵ӕc쑄|Kv0ws8Ct8Iu8\AÑ@sn (%~jL4DO"#s-ܖd5L%WE ȑ4@pHP_08ϛFcxإ ̻%J@˗: ףbhw6(= XmrhEN<_n&hdHp2T8,SeX"T(m 'EyaQ䘗bK,?@dA<]yr%z'&VI Bp#H7'>家M?<-%؍oRM:bI/P,O1p}k)#TYNO!ՓhdubSp'GL'̦ " "1s9G}"}[W@s)XBc5 M g 70؋/㊻(5/MQ'"}]UZ dT@HmjN^3y1yk7fnXU5MK,7>)HVĊjH1#PBR)V2qBǦfӞ\0DX.oQȍVLJKR)nem=fluv@Ν{|Z"q!GN~X]NY6Q$a9LF0v{\CͲq\@1&(fw,G`=!R;`+>msr<{1'!LVpޯ)V׹0*f|<8ae׋T@c;DmȀmjpIM~~$@ '&9 0WŞhEwܙױHbpc =" hPc0'"H 0aM5 -i/&]!OvmCa6'^dAU;mwEInSOEOM[`!Ee@)dKK3+qz@>6 @oxJD53$(Gߓѿ|DOyE M޴ :*NI܆&#PT8BXӎM`QL+Mp:ud5#!&e,1Ѧ 4=+Fa8 H{!Q4mhgQc۵8Vٲhb"F0s$NAJ֥,@$_) OZryC܂'IIs7 a^ ` *>3O- M;ʉT҃.A6] [tD ?۪=Rnx6ܴ\Wd])ĨO!D% deoNE@TAsCSۓ1w@Qd%?/]NE|iqƈ%PJdݾOM(1LP 1HH /c%@rr_2GiT7}TbB?4!9Kd:y]dU\;mS’cO( O2弦nBψՏْأgS/^7a.,H4פY'Je"*$ט<`6࿬ ~h< IDATxX%fUXoN_>艁CF\ee$+L4 =@Q8ALrII"̊VpsVDټȐgM): NkHL<991ʌAfY 8 yšQWpRښ7T|@2 %ɰ9 ,mLitLBsGkzSD!jCEb= i E] ͐ ^47P3eiH_B!<62̛OWD zϞ2<í*%9`#&녢>7 ħir,õWzOXײ2B5r.B7njd8j5 т? eEiަ {Dz'b8rQC46*`SרVS9iP]-eFCeJ97N˘!qtgCc\D 5룒2~|;'Ijv%Z%M!'7Q)3GrC=$#ڽ/sۛ@<Ѡg ٧ ,lDݑHU+y p|FxpUBU$'F o%\[\5 K {Y7)kɊK+$OȔ9Ot-pWfKqMzkGFH>"BjJ@mD`u^w';beD$@<@V_\ꕨGPJ!aS7qݯ .JV|2{>Gs_H|, `Crbu JGR)AϺ/e@ ~fTMu뷥}jUHA } eSN^)6P}.#uGd(  ȀzKNj:ȩ\@U%IEƎ^ J`)T)@Z`&mx@b9zQŦUفT]4њ鷛!ȧDIil-Y*E `c϶̾Ж< A_>ROFRHN=N, @@3\kmKZCSGw)v /I$\װE I6Ik&hYBYW^6 ~(Lnrp}Lr7%,N_{e s{G(+xxD@( V / Oۋ X[rMU[ꈃnDvȚ`Bjܺ* eܠ6hP%0}ITFLQ!-HS:!3yۨflUͨFlpfDI`:$zO{,;yDHI]@Լ C*<\ږe&x͇,I|eoK"ag(匽{ M;hOMd遯5*/ƾvxks%(]E7FTtoJ#@Q VpWZ.ߵ;j인W@m^퉂nPwBݴiͨ\6=E[Hޟ!CY ۳" `Jޮ D7v@o d _Q;V8{хl6;_ã<*[^}e{M\ߙ!䆺kԥs>uhC꛱ԌXޖ}!`(n6d+ܦR,WfԥY~n;bQMPd">ºH `Q&p6E0϶e?sMCL"DrR&o;$EɺlCro5 łx\6"JCm㮾4 d$}F؇AK `$7 BsNAL9BF: "I{4S_n_ eF@fԓ[7mp|a4 +F)H{ iZne[mSC0-Ȉ`L;*i3!Bwi1:$|>GZdJ 9N8J0#2B0hRCr@Kl63؟"S*pHI/ |8rs| Jď^=´t/28YQ%bfZ5 <+:]N/]_d>Cݴ;?Y>iZr;AGe15)*%L4 [/?d;6i _$FHm0,Rϛ7!a)nûk_VhXKL?nȠs4сrhXw.N/y{3fwu% "(ISx+)_gc#51 tq-1/z+%PD3"oRl6[γ E%t&J-E(,ԜJl+0GܧȧWG P1.>%qӟ>H2T=zV;!N[WW.g9 #SW.qĀcVD?H4T*m~n**NaǸ4` jMM$4'v" ("Asr $jo󜾸H_U*wW汬i}J~A$U!ŎKSGclm63t**(:J3L3*{, Ϟ$%$'3iB:2Y*#j !] Hp4b\o~콉A#8)|RY1%MT~sF$!7ᨵAֆFe&O(d.Y$*'ƥ+,͑F2+Jy! @-~7Zҿ%571+-x_=̋Tn1zTI)I2˷uRsB = b&Cm9TUlz%1 "-_Zmɑk!Lc u @>um!J&K0FP>~% {ϵOx@gЁ$C71.B:ΗQ$eh|*ј뵰($1ST<L ;W>޶\5o[p+ -&_4N$-eO]Ri#JHo>@GFOn)S 4dZR"z+$WVJ?giǣ-3hm`UM)vᑆQP/)sU wWP\>\xXI[@pu A ʦ &!9{8֦"=g_sX p\v P^-!:q<RD>- " 4L}_togZ9 [ǫe?JO}fB6< R)sDQ 4Rm#[bdУ"~8aFCLx eF(3@06MiP7,r0G>Y%ģdOOaƃ/CCώ{ J%$TҌw @*[$@>^w[0I+?ΖKHod|W0ޒO} ~H_d,!؞!gmN .R==Ɩ;>܄Tty OXz3;y|3%X\tK]5hr*Б&gMyFȳ f/$o<}&f*͈tN%Շe7lPB HbsED(hqV(8n}|!%e|Ĕ,߫Ne=mܶ^9ͱd+ p?y~ʨ(=a>Ye$'?(p;]/IOWM@.{S濑jA-BqwOj/؞4ĩdH!,aho$6E / CIKŒ/+Ib\I"!"} VVU),nMt 8 ymn9w11Nȅ8F}3FxgZ?MX1.{"c,2a%sg)8mLf"BDGPuH3BfW( S!vҦH4~Ek1pjLչg2Ejp\\¼3 Uֳh|dO=%hufŕ3@x-M my@L/1*zؙWǃBn1ͱ0M|эU| QS\`[YcD@Jh"#$7Sso2K0}ͨaB퇫L'sR  7߇AmWpS BMJ WݡC2О2]LCX+=MQQxNM[%NN.'' T+LY&Pdjnɀ]t@,RiQ"Gԅj<_'9G3Hr|D:&cH(yp]~HL!m}ߌ BZ}`6:~)&1Rx@X@E~XGֲKLB`pL(xQ%utt@t@t-݁pP$:.D؆NycEL1#,7w uvl-Ǟfc{.OQbNU^0dV0pv-b}:ۇpwόTbJ$pTatBqw-[}D=n$ǐe[LDR,(ޱ#ǁoBčA&6Y_X籈Q[' [/)H=p%\ū~.%RKL erG !7(T c38fesas|Tf;U?@4472&"*@GSjyiϷ9I7x|er٥$$=%{\4@'@_bl )-egUOܝp8Œ2:ּg&:5<7b:J#, T/w| `j-we8K$U>/lc $}PI #k!2ʼ}X4tM#[ĤdH$@ bVJ`OF3I/>fRǬvNӈLsǧ2ny9Z`&{ʟPFnE9߾= 3LD/ @F{  [{w":z{BZNArUuQ SU%NgXh(7֐_Pο4hbQ)iX"=q[YP7+5X7<ߕc)tًRզfUlRg]Xh>ziY=?ɖZ78$W—1Z@ B._!=FDJM@  _t@~SOnNq[mPOl()UyT* >ID$@wCKyrH\%$̞%" *vLFmtzM[]-¬^S&=%-'OQ :ë32٭Jq 7tDd;σ?u9MćR=b'J';ʓܼL w @v'(k)HFN-WAdDn:a/;"[lmA+[dhV$JMJPFdI"S_ 0SI1 r!Fwmt@ t&LP2hq('S:LusHNK‹8>Ra3vܤuEb%#و/"Tzb73vV(A. )[02ؗFYc*Y-Ǯ_9nܗ O[ ӥS)S(H@ŒK ) bB"J,uw"(-fW&F[ )cӜӂT<6~' IDAT7Pdh:1nhtRIaCRMbTaѐTZ?]TQfn196aݱgU䀱?)m)9f}i*S #LWbo VQf,%X3B4Mϒ"l U搿;Vv{1Wf|ݱmz1V\Q = "GoIfDeDWhgo e4%\X2A;@@HLy>#023(FTͰԠЏ)>טF4g[ TIq>iReǘ9\aT-g ~!$6YvuȤ&;Б?h76QZ RߌiGtt1D@iO%?v5%SD-P" KF,7uݏקG+R$COL,w94B^2@ܹ: ᚡ~l/,+92miJ- `7t S٦6FG&8Y \gIjƥCnN'{ٗop56 {USkHJȔꦅ+ߎHcGrZ5L$VJB)'΄&5kƵIU3E&]7n@4C+u)$"XERW]9ZT$@G j+ˤiE%gHڐ{[={uPtOqiˉchXJ%4iopLŖ02"Jܼ΄)H!$:dF27fJQ1ItB_' '-Ob"bկG`x"Na"0 tUDX)Y9S8Ҏd$hHJZ@/j_^,(ƈ'4B1ԋ;M ~ dM~@ߕMućM Z3rIf XɂhmIS!{0FD|DX{HW qB$ xJC*Ihنm9"xJJ/`.aQ=R@ҍL4 fMk|I :%aJ0ڛ0RPMvHtHƃI㱪P)M @>ݿˉJ~.2ddžRU>x*>H) TFG!4H H" T4~ì\4)Dau'²!$"R={$D,(y!!.u`-#%PF$@j'-֗lQ㚄5V:eJ܂dFT+X$A!)wJ)yʞT#;ԦN=NyD"{" 4]t@`! 772d#ѐvRRc 0 RlTT-j6d[. 9@ٹ*A8 H*7~XM)(iTpz=?m7÷#d( 7)ic8 @~{nh NqsFFÍԨ<}-Y"9V97X*:6]| n#JlH]tbBHU0Eфm49|!3Dި k R13$u'#8Ⱥ3vw R-|hRTj.h",Ql{N_Yn2Ǩ͹}s=jp(de`R~mBdD(1AHG8RÞ'OȤ''=q8lK~hKjK4GȌAfYޒmm@sSuRvT|q@U=Fp9) jT!3ԜHHW7j2hiX5猤?ZIXdEa7 vŖGt$ϓiܰB(17S1Ow|ƭ} 9R<ÞIruT$ Q/Me_W>֞;u{Brޖ㧨q<&5!P ٲSSB Ԫ7LHBύAn[B`[e`GlIs-1) i onGא{fi.0zVr˴6/.>'EN"R - hSay;}aLQd5Xt,žQ5Kw m^㕤D<nöfB)A+MZSB)3Mj)2l*(n'SSsCWyae Ɣ"3(2eVhMFM40H ?8)´ź.y)hf\'T쬔`kH|E Dq\@ޛlSS~ֵJe X6㑄S:/cIS;+IqaRF0$3xMq{ZrC8I$$hF0&WdۉuL$ l)<۸aSeܩL?q#çy|\y0DN;B P- prn"AKR cڤC ;s=-)zMYCu;$_UWHxƉ{x-3jSVdEI/J9Dl"F: 7OQ'Tдh{f<hj$AV/%o'wyFȑ9)]aL*j, /P$E06إx$@0l>W:a^i_Bժ2βOdu3;;Ck(`, 0vYiS)ݖ?oؿ};siα+8UJD$(-3K$S >0ccE9k뇺ӎ41M^>G= sIgo.׫!o h׊ 2jn Fur1Pڴq 0(cDlTgVCxtAKL XUux S"4#":CroONho8:bIΛxe$@,%6 pd12_^@+JU_]UmQ=M8{rc|Ì*mί{)_n ޭ^)4FӰz_=CΑDO~+(qޚBCʀVWU:$!~ۦ_XUZt*fR3tG'ǟ5DU)";6b={c ' Xr5H QЃd-ٙ{-фg('nəZ.x~=fBN,za:!UOxq7y~ᨄ,qss7(Op7{Q*}C@ ۳㴁>4EEtqw$@.@ׄ*TxzFwP@ {_[>l:ӽ=dOhR$AD9)l!l##k{>A>A 08Ɏ$Ҋ,j0i(6d~Ωa]k}95yo[ O|JP 4O@._:X"ƿoO ԁ`.%ϯ:~v*=bF),̣ AKڑ2P nO>$g HGfq}&v4ܖ8~cAe >|iȀgA=(we2l@9!@u<5z-~'߻5 yvg >0/2$Nڎȸ6>sIYn#Cr[k EhQN.>fv ϣi }Hr^m+kK@p.+F6zap7"'A pL#D9WH^~%}x#| N0ބ۵(/~>ÿܻwzV}ĺބIG3 *'C$M#+iCp"BEW xH߼`#& ɫ#YBߩ>ZAԋ ,)&?G0/ϦQ`=^x ?cZu8;$?FC# R DZ5itD^b_̞.nޤ^~mg?_Z!y$"OAЎ#{32NFKް%k!R*vEtO65PӇ{?O$;;//Rb˯% w N!ⵗ"X f@YH б!X" r5WR!6KFw{wX!#u ^E& 娫ڄ=@r:ڇt]Q ze>_[εXt,= Gm]Po+2ɶ?.$.^~ -_)J*k}OktWjAٜBg4 NbRzL4s ^R "{x $@(̉ FP`IxRM*x'cX ^lU´қM“B[$]+JA+QE}+FB#l@`m&q30t\_c!j.!YC9rvn @_O~#P;~"+Uw_TE ܺ i߹}g~  5\87ZlĴRdZ(ܚY&pİ* (hՇ!wgD`-fgd)d{ڡ8]P/CGZmj5(L|mmG8%081?dzޛmKi2ILj p눌 iXYyn>Y0g6q2 Du OMd Tdv???&€˺ҡ-x~~"f6`XR1 ik[`L"Mt6&:ԥs!YLeCPØԆaaP$[QL8]`z=[:_0$d,PzM kt$'lJOKB%>ŭ}7W$ƁK^x=&8'Q2vS5t0爌9zqH+i Uwo uޯOvL)}҄k^$SV}{U pBor d[\da<jN@3Me<=:OJ0JEAHAG z-/Z)h/A`TuSc( 5qӯ~!#I9N (I^7 AH]v :3+M")IM㡰LZ1bD Q}^j6M^@P% @sGåls n,D~;j#36Ja}p'AVӮFTd ̃lNۑj{LgSc>90g?{ IKwp}i,+{]>Y ˲bͧDD2B)Yd Y?X.,4o IDATU$l6 Fza^*ҏ-"@H7Ā.3xʠ (Ft&tC<тp41`&f;BBEeuZ5ZBARD'|n$Q@nQ`xxr7ߥ! }r*r#12_$B* t ǫp~`oonM|{l oC}:L&\ ܙyvz7`6$I NT jyJvZڜxz1 "G bJoJQ2rOo}ʚ"h E`zQ/1ow8gRF%F]E&ۀiE"#kb1t1tIlژg.jY X#V,N(n2ZևFzc59? 3_ؾYi<!Ɖ,!V$(&/7II$Bخ*ȷdBCl0Rqt'{@zF{U *G( Hj"O; MԦk҆ӡy!tYhBEL&I8C!,1$ FJeeTRkPS@b@TΨPGL+c-W63PZ+'RjZ?{Mde'eկkYVd7#\t0Yf2E8Lce53@m8(n&2 [{yfCޞI$OܰPcQ\H~#[#!3@ף ^`(?Kdtwop<@Ꮘw!F tԚ ʗ|񻔜g)oL!&vZ7(po@lVPzU~3Epp#fh?Yi_P<ξ@|=IsxjY=+ e#P jlaV^cAco^$ޒ!f(E@ QQNhgjvA!MRz]#e# l$: TNmDhf|cxe`  oď+Ea=ŕ5.tE +lG*{m{MG,6]wu{Z0&@"8o/8v@Ve]ī<ՒkIƷXb`/R$U WYq <INS̯7Y\ƱҎg>>Q\\\&$޻e6jBG'Ⱁ:h',D=#d'vڕ%wFT ccq,p<>7NZqjGԶgVF ryG~k([DAhBL_F$N c8B;Tp]dxvm]3DS<hq+[o[/ $6Lm ]K$>k@~oo7֭p-X,0Na:I IM'XR Rp~vggprr GGp=x\.=@jH^!>Џ(+.p9gբӥԅˋ.1r+Nz-4e|)9J_Q'Եw{Gm/: 1z Y5D{;%w҄ϡtn8k{hLWۤ(ӪZ?@;r2c YYX `\YƷNc)k~n~r01ly}-* ]&ſs%pH7 _]N<k>vf~&eY'~^ Ol68a ]-!RȔڸ#l{{XEVD}]}{=Np ݭml"s@xe0;&[ܢ֏L H3BX?\IA:0׽֡?rb |YA)A3ʳIX{Ee}/B@^46wup"DY cfX Ft)DSt@C;¥)M@@Vx[ G$W̡q3@3wU Լ8TwS& l"ʽ@_K/1|+X,Yx|6Lep~~g秐"r0Z|`UQ`D~| ߻W_.V+Z ]]2`_ZUnM8V=\8LL4i3*<];}m>{6!=JR@kQKvB}] }7YE1qEBUUm6#JHa,Zof) ؃#PNc ~4 k3Sƍarץ|/q1J(v Nі*N{sՀE /t`qp_gy%<:z'5п:26{W_/׿uַ/ qc2Ia,j)4C];ecs ?T*Զ k_O~IX]<D&bIjLuyHR1:J!Ks-(!Ib2uBmڋCe䫏m"s(_jrZ+Wv6us3Mk ı^wA7Jњ8m.Ù>$I8!ܻd {иe*`>_ԁ?P_ܾ}oc?s7 AooO>WZ/Ç ?==7x{=Vt ܹ w?8W@5C^cǡ߶iDȏ7W5V?/ 8aײ"J'}=]<"Z"LַM -'  ʔ{i=Coc04YY,h%0_o?x5V1h= bJq&hkTܽ!x@TϺqY( nxy?$oDQFwxo?zGλ@e]%O~}x_^zqȁK/_J?j3A΁(<ў2q\Ȋ>ǯdx*O7 ԚD5Q  YV`\CѠ.;Ѐa%\/mN`d Ā&,=J-UzGWjHi bMY("_<箏mLCgϢut> " b#9JB @q<^reCD J2bAXPJ֙`쾆I|>7- j &3p٧w<~}ʯ?xxNN _o6|߄7&dY]e^}UxW歛~>\a/<Vݓ,hڴ~O':p$K{.{k2>ڄW"rY+w \de2b$Am Oc@][tKIKDd "fWh_rwȅ< v᮵Q6߈5GsIa<s(V=gp& ?v4vGE~`>Q18hbηsS&0i%6:;?GFxj _?}{5eY5!|ޗu_ }x3xQ,M:5Oׁ{u$eı*= '?ɿ ;T.XX2 \VB5 GcyӸuCM ~thxGvfg@Q i Nr 3Wn^=EIzw}=;Œ`f"li+q9") X:)l}(t*j\e(gp9K;M=wDYܸqcS#(oeD8??;c&{tFyu0 I k͇,w[A/aHS{GFB5@ 3O3YPbhtu!&ڠW60A ˘ijC!PQ50yȕ 6Ažf rKT&Lb*>v{hP69" EuInl=j4#N;.v3u)/L&ҀQfsO.ztGS@~o"8Vq_,t4D{{pxx&ZD[M̩H%ZހtuEY׾?ian;wnƒE˦M"Zp 7$@~2Y ![.2WO$ >8}"h@fE]п( [3xRM%,!O} *Z.FKqW-ې킢kZXwT5%umS;~%z-1E6oPή&LD>6э~|)Xp5ьlMf_m} >͜WKLw7@№ 4O:mC  iR (swx?(#HW{F̫+FϦ7!.`8\߂jb/>"$uKHH "~I@bYR;!RSn$Yl1De 65B`EB >A ޮ:}ڣ{ц,@dJ@<3x~Bd㫚":<&ڶm/@8AјҲDNB҇-81x ?K췽mBF k{qn۩5Ly!%0z"3,rS'1 D1Ans>_j F6jytlm$˦pqv {Z~?^I=,7)84b<Ȭ#Pj.T= wzr GEQ II@T7W :$"?8=d`>]-\0Z' "()Bic7>k.2iOrIPK<q/kAD(VXčD<;4F@HR:"Omqj C,KÁ~>}N*u!Lj;m.9;J*aݵjN4z |wu϶Tc IDATTp9{IK矯]*V߼ GG-4]@[ d;Dr/.a8n?x >O߇bq+U1DuJx8>^j_idJl6$9ټ5>Ҹfr ^Y3Cf [C6Wz^P&vfGG4$LAT$=!dʊ$Аp4ÞN&®tziGr3nfz5iP%ߩH͕ LR 3)W۫&2A20a0{c# ?Ɠ)}^8Ub$ HS!Lʴx@ tUbǙSaLp]gg?@Qd-CX1D{Gu|r ?xM&("TDT_9RT*?'G'k,KyÉT>iD72k!ˍч~_sGA;K3(&Egy_F]$Bi9'rq`KH Amm'~eh @5aҩ|]]J6P[5sw)-&F7gN.};vk*=( Rmo>k+`=~n߹?xJI?Vy Zşi; @W ˯fߙ?aeЭ[$^Cg~IaǤ}KupM[} SPRhKjr~&56"ҷ<0d^jyD-$a4 r@wIMgIahE΍!67OEOu&M @y165.}N m?Y鴑@\iI%@*bDDH8AN [D JljI8<<#}UE @o|󟆷z}=X)   #7$WMJWku4q}.S@^Ե2\n캱.oq]5(qcUWu/ ]jOLI \į ͚LBmvMcGm@X4~b2K7@Dto>9joA5q,Ka: ZInd/+J0P3V3HӤ6mOqS]a4fyuZ 8tX@"FI%bc P_P;vmIګjfm= y.#,`7ܖ xr>rEYIu~FmSho$NN5@e?UB"/k54qRd+97"@f<|[??Q?AMZJ5$юteg ۮ>?aGDҥQh OP;瞸.̬N\SfQ 9cVT6X,`ݒ`' 0XGPs+ RFgv B%(4IhB2 2HMz`Ww]oUHӴ&7Ejh{BE!I<:Vї)ܿ><ڜȶA8o7˥&PMZv ~m T -lDt3tV/;=θs Ћnב#"N3hjf:_y_A9Nq3C;8uӓO11K|RNq50!Qi-Q Ƨ鼐3=igBq\i{)I5s7yE0TZV+LIa:2)q,5路|`ϝe* Әu' ad2jU_ZÆuq*j[iiY!7G =.Y})5OZ$%d5v<qe& ڨ}!NfI0 Qa\#zc-{8~pԅS7j_6xL&|b*sGZ{k!z}Mϯ z ~b:h-hGJWֹ?_N@ܿK6Āɫh3.WpnV8|tD),0Ma2I "T7Q0NaYq'"HHa/Q_DPIh( !"jb7y?&_OB,plaH s)[3upÝx- @ol/_}qX|'q Z^$'ħ2& DP &^6k b68/f7%VkIiBe+ nR~_h߬IM`i駒>?ɮgoopwk G'ppp{$ d)"rX,x ,!miI1 ^uájld2>GΎlAyq*;2w䚽B[/2N.$‡~&n}4}@~'.nph6Qk B[Uǵ E:ᮎ]Y0Elb\'8e۠@uR0X u@m$۽L'Ma`k>s@NI@%pmCw!;ֵFZ ?}Vrrj>,ˠCP218W sV%X`JOޅ@h&\.{+˓qh@ *lP![UP76܀zz-u<c7+ UEJ6d8##`L`x(Ct{21ݻu$h7- dwgb$I*"| {YsߧR%WiU-S dFP签^]{n|ە[\S)PBysx-}發2:S 2mc_\O/]' 쬅we(M ɯxu֋Qtd S/pun$Cd٤|E87{#\":UAS`,n8}[(Zx^PKDi*7m$BlZ^<8>nʿ>xp Ƒ~,"7V?Vug8bw-.+8V#aEB^.5nKovmJ8A¬y!|o 4L`)Qfrsg>Ɔh1a>[G;vQ|_r:x uLrO5 vTzKnّ“JTXet;_"quW")VgV7eT6GPT?WrI2Y#ZF@Iܧܿ,3]L& LH5"x|1oCZt-zX'c S0DZDoۉ:_njL$$`driCy j-7D @^#NK)ʱ@~tJkJB$bkCa ih) }..cyd2iUR}M5 5P⧸o0L`&"\Gޫ UL um(XhPڜ@j"7o݀n9 X,vM/.. X{!@eWGpEI;#[:(Mc?Xuwf;ZM=nU#ln6,#5o%sy_@`q兀 Ct28`VY 8<mPp]6]]ט_GuӇ/sy'qR#gl"]踦OExW}@-AH}H+!Y퇎V2HL BҊx @aH Fe|H9C:.U "i%&Pb*e< W6 'U-o#b;֍ x *]5 &X0R5lKm v%=9#h(aو`CAWܵ I,\_:k.^ x \Eiж_S\͉Z*3]KgDxPxd b3Mtls_wd+W6q-/CI C\%ڢ~49H1$@$;L9aO uȦ-ݣ@=qRڦ2p"UdP~]ipЬ'LABt\KEDXF14 KSPD1q\x{;c4Ec".} "ۃ̦S&0L XFձZ.ySԡ޾'m^msy37$[Xk@{gb4r r^A>7]c8'4 Z൅dm ae!b fS"8 N5KMcK] 4ҋss#t+L_RٓJۀ+~}Ep4q9Lq;xf5xbM={?}^pcZﻛCZ&uμq'^X~瞄<o^y{o+HӨjp;߇޽q "PR~8EXvԟ1N[ЪKKp֥%)v?H?44? "& "@Tp,^݅-U鼼uu4o :-e$nkw ׹_zwy8X->o,87xR5\-@P3s7$O|>?o}oy>Wu15v8y|.uStM{sK!gy ~2|r3w'cT= 8޽^**S5M"jt/D,LX L> ;_&WPn(0}U甕d 9riDm{[$@Ըoe}j؆ڲDzڈLͯ/[~[dc\W?HD#]K^I~ nbWZ#.֝LMN:/uwvwo" >c0yTOu7dk!i*x鿅{o~~Ckr%PzT l {pr|HᨊWE6a10%&/zoӡQF Iׅ _xHU^ oQ9`0)Y#6ͦCҦ/fXU x{d$@3JInlm.g70& &#|tb;JODTqZMPY"ADZ?Z^uǪ"fcem~S.$\+=%0/?U?z{9Autjf?Ok?x{J"TqRZld%GsyF.Zĩdm"<~!MCX@y-ɭMQ&#8yYHD35A䔬 ro>nP$/zF:&E݁8zG\.`D?0A,#R;$.%E t,ut5)laXx(Տ_VO%{0;xf[sOy;oR^ & @**sO~/Tj;J]ߕUʛǧpqz?^ }e1ycWK(I7.'~>W(1tII!m%nR4;ꋐvgqnw*fkιQ zA4pgq/n3aZ)K#ZChlFe4JiI+e0}IzN_k}x~aqy ,?dAVJZ ԁrOV(+WW&ʊdgQq]wV D wL"}wނwzBJ"N IDAT#>h@lJ4EpmȢ:UXqA$i#H:ֲPj"t`z2zjh| VhB qi;`[ {'w1dtIdI'ԕ{qmxbMIf"2/^ˆqn_pS(Wu^ڴF&M@ieܸs"!w I>$gh6=y_2|?oa::vy淯_32H\j,##h W%cx'? o|߀Z_:|d*I!zDZulV6Dq Vnjy.Z٬ r';h (t!r+V#أ3FP2HFx$@3ilfEO)ǮI^~#u':=*g648OQiM!Y=(=w߫A٠$/v~31ʨd{PR7H/@:O4x[᫿I-$`v/<=xOjxhnMρ(cc;]^sSxvsĊs+;L=}c,ԉ+~j3(cjzqoo=}.̹vEORU([0R-&xOK [OLy``rNHv]2W;zdžwҨ"rz+Y& I)-~ߤi\v~k1Fs!ҕ`KƏ0u!LSH0E*«L]&\ xE 0* +^׀V N?hçc5,p kMx˯TA4kݲ8g3=8sC Az:3dvwhm/nv3O P1gxx58qa08i%B9c\GcaxHr@P~١(G\_Dt+E9$~SY(gs-6GGg"c''O/}w_u17vUБz, ď~{AﶸƼ!Oo64aƢ$_G54fUݛ#h4}1P/J4Yē:LZQ6Ohe \ڥML"Ey1tMyL2VB6w&>/)KMisZJp@V gH# #_ 'zBhdjF :MHF~R}*\T_=л[ü#ǰW6Bcu`#TjdjUE@pX(R'|#{P5}82 |TJ3TTVɐh`y;  ͭo|v_txF%0i;Ndn=L-TMWR1tP8'C4Yd*򱣥 OWaS0P#W3FI pa8ϰm(y M@3<*E+غ't sY{8/a+ t6mŹИ/h9Rbd/WϵnA0!R-l,0fe^Fyo@ +I"u%a–N0w`Nbo$;eV^<@i; dIT0tJuq(Mt O7cnVsڏ+wHZg& 変fh 5Gc\ |Bf2U|Q>)>Q~6Owu`{@/1oΉOiAA :?g G|OCkwOGHɇ<};sޗ`8rYj$[)E-T~kQD݀>ZHd@:na0L(@wL FzcHY͆*a8Z`B6'h|vQ}ڏ!y1lE]ۗ$KeVNo_"nRp <]6`3wfꅰp!>Ĭ\ (R@*kIQpzښ$ʝUKkĀ~RV(W^&>^ X.3X+"\Շ43_l1Y@eD,ԺPYʔke @H}1im&so>=Fn9/d4T f`[N93vubYLUdX)liSMc&T;6RW~K@$ zSTBKvOD0L ZoJ<҂PR@X!˿7M_Vn5:M6Q4!6=\z7^ ,g8?%5ף:ބ4e>Ӽ`OvO߂>(ÐcBG=ݣo 1lqA Y崒2i^f|`5S{hqm3ܚαK >dtޓ0joId +!{#!@kȰK|\?@;E>#HҴ>Z^F6FSae_xpxI+ F}&kKh \[z5MdxSfM튇y{0Zg`L/[1 ^Gސ̥$@׉bo,mgH,$[.>?{"]di3`K82U=Q{ |5uŅ$?^E$KroU0skB#@j&}wtS{BgvʸM-B6D j ~! oXNэ~|?-z#v)z&I˅<Ն` L$)<1{@+ S̯]8*W3 )?tn񾳂c2W~ pB4 ` f? HD~nG 0 6Yz$I~3Rb M bu'ZFt-p$ %2,Pԥ$/ m ;zKvc); D'j^Be>;qll;l6jI Irt2V7 5oOEf]'hH3M%p I)$Y-y0\]\9rNI֧.†BYTvFP9~ W@{Xxs@ ;WdN@klTvG}Ha?!=#JmKd 0fBu=#TuM/#hs)ѫ Rm۠5?V:F f~Sfm'9Q_ %",-.9q!Hܭg(.QU7A]l~nwo)YQjs2!!~Iiʀ @D?.Oy2uJI5{аX!Iv3U5ѓp'*zA池_kmSxБxIcC$WiR ~hf"rהG7}}iqQYZywL':!iMNDƶ{,)^.`5 p{rRT||֘fq}q~6bpBVO^R+E/'гAg!?R #HƠBȾgcO  ~U 䭊,ƣ86෰_4>H1Avdv9@# .ߵy%jXw7E ׀bK2ՈQ۵gnXP_N,)ܼ9уF0FL"ʽipTR$_0mٵ=jg}QG/TDS}=܈ԹKK׌@B] ~& ~'8 9?og]._z)$ᰑ 5(P,9O ,Q- M?XҞȣ86-m]>`$@X͗c>>0B|B;=9y.pX133<>,NHOpi2K;t\>(}2naS:F6۹nPH\XhyG %|Lnq^\*KWvMo (<쓺7]muM@VeZ"g*ާz )8Pk|r]j]>L[jyџ 9P{DD.x_4 X+h8M77ɞk3 l$Ypr{bwXOitT gʬ#a֭#v ~krNUvBAeܫ^͑ўM2Imm$R.<[?@P=h۰TJoh0 Ն"XrZt%l1u Bp[wW3y->[0Ns fv6?gHpWzi0G.»==q#dKPh%3ty'yph4|~d IDAT/{"QwFršz2x' b!Y&E-[;I\`PV*f[_hv?i V%K w'cuD-8`XyugQRbQ= f=渇>ݷÓz-\%FI~y{jPX.!q=c>Uׄ‡3Rl8эzʕ= 5{~2gc/kQR+ @˂<("}ʷZZd0ha; [(hWq@ǰx,/ԕ[zC|67,Md6z\//d{Db<ޛ5K\gb߉\[twuV v  I !%qh^,Ӄ_ qFzΘIf2+n4tWuU[s CFDVy3#<܏_|gY2_;RdћO_!d>dvŘ$]DH)]@>Li: 0%OIH"1,s]MJA=@E53V2n3Jσ3H6fk@уČ33К M6GTCBfnoP Ox&2 *j#E<|"oȻ$-3\ӖOiid&$SjV3ZJZM'#nSc\ {{sjp^N]$EdJ؄#+yz䐿zM8 ];;5_€ߙefphdZj1浠P٥k"-'h4$>T@B2C(3""_L.KQ^Z.Ȗe`L_ypkE-:"7eQeF˕y#@S9t0Οv:Y@S$Nƃ ]!+OQw2&\WgGk8H7\K:W[X=Ntw^(y@^?G9'Kg? zRoWJV!^CڶtVw/"r2\#&1f}Ҥ &U Nub~}~S!@_oŵV-|0nw6CM')~kX j0̏M~:?M0~>O$}p B .<} %-]?xܺu'pz\ݵ@=FeHa0h8,}GksAL@VVi\ U82$ژNr/iT R mu(G5Td/1nZ>K|9fYyzyCJ .gqs$}r)vo: 0N1L1E #.YW u: 3;> ;0x/@1` 6B29 4t-cw$I)tVN}a. daYA0 gsέ-䤹?d؋>DBgG絵]HMC G6Q3:\5m!n/DFuDf]3lȕ-~DzFv*efudCu'(sڛr{n1z__7*qԌȄ!&\ s  j) O4hL)"w<]FwK<G1`&3O#M?DA g@>H|7 8  tvr`VGƀxҠE߁ެȀ5sOu썯]nFB_qpNk<p(lR"oj4R;FnzK,'\/4ebWZ_$01uÐށ~㷫 5kf$D" :o:PD=8fE%d$>58>~q~Yf,1JmdO<)7'|3J ̳ 0F ^7oqZݏ ۯ3Awt`m-5v`hkZ9ſfP}' t,IDBLd$Ű`B }[VBuRH<'OZҐͲhZ̘.1PѠkP/Kt<|Ke28Ye2׶ɡt$zw0Czܒ}Ms/:`y _No%?© O@S}Ž9#k27ov)NZ׌0g0;qa4<4 [\j"0Ҋ ƻݔ#)v1"f S+|"dv&zj`O> BC6/=3I:s_mN;fJ+uB]\})EHvwv¯qg x/ogqڇp=x$̈"BK1qL?f OrE04~_xo!EwSڱQ!`x?MXn2.+H<2yYY]S놭9Ȇ$b]:ҐZE&C -~%YVcdEK?ECDz F;eWDw ޚwΐ^ +kDU]q @˭/  uěğ {s̜h;wa1"dz f7ym[[Ny`/~kLN0tX{LA5oOGedN2 k^C~ MvwZ2;EC53zOdё6ғ)9r''l]}(KuDΝ·/`5srյiP"xt<ʝy[3ˆ$ݝ{tu 5vy>88?{wgG[E=ax>BԳ妾7x;|M]5 Kg!fgA ei#Xėx4R;񃝔{5P5l^J!a$T!JEF2Tqz2VU˩.HyOayG,dsd$T'ʫz0k Yy<u^+RV7}^wK#>|+xKB;%|r ]` 7v~ n؋u33%?F<'@bBuz)=Weƌbb1Fc^3E4 SM]DTj2*vGa6t2c |@ρWZvRʠIG IH#g@8 g}5%0vwo:ob2^HVYY(/W;݃bsXǦWG@0Hƽ03`4tLzR)6V ]/[]dj nk.cBJ )b)aJM JJSɞFFwv -(Ν;=FCdSIԢNx}|@MN?94ma{S;~?x}}`i_矻 ?yPxl(Q agt `*ץ#)݉2@ˍp!%@W:k@&2ど;! T-魦53[;&`,ՋѨeCVզ7 '61yH dm);o=԰̨ItP#!yd4,pl5YrH)|^E9m3aHFTOv&?"m͆&q0^nH$o1 uHJ$rbIz=.3$5E{J$BOW.f O@f@&T>ͨ_ś ۖdZԚp\L _U@ԩωڢ|(s<~(mv.`'$0Nuur ҌtuPJb(x0{ ot&C4qɸ[[cb8$Ae`SKZ63*T_ΌLXHWNm"}\2qe_dSםx}htRRZu}F5biA AeZ*mbvD**t0Ii20JjIk!}îLEL&l͎waJKD-6$bl2~βoddf/,_wXrޚ6+ѝ@&B}xe`0?G^.8]z孒z &8 H>|d2Ip9.D7$fyУV5jԉr FZȉ#E 8&*n,HTjlpVs3ķ[;zY|?T#&܁L V@Fzƍ8촵 :7EִH H&{v888H;[$~^0o]wTG&f *MY}Ԍl\WnFra4a <'~)R._*;<ԁ\EMEx#/l> gI-i}kkI&\eBfj`3FxMsnْ|!22HЮ U'9Ucgt13`FY`* bUdpnqWfRnPg8v,#@x5wTd//fYSI󓪧$Y}BAu^z^eq$t2+YfOgD-& Ajv8]Jٽθ"7WT'nkU#@lq>` yБطPOlM b@rFF[OǨgb#]݆t~`c*/@G8~$2" H{HFDw B}ie PZ:]6k{4J.@u ;= 9}%!ΘgI`m3 1}))Q(Ai~;KSFo$w㔨QMA*qlcdڨr,)0ixe /SIFQ33ڰG'[_saMB3'Ftl^N|IM8Ya겔3/?*ɬ$\k5v]A{eXkCM(ʮ*_ULjVaREn2F)*MWjWIP߀_vzLYpӆJI}b-1(6gƕM ے)'@y?!kTeS~}9UCޝv9YdlҤyhxXZU C(Dv\ϔUDι,oA\XJ*/=I2¢}+pfQ,ˢ@&/+.4Yy*k3/ `oYq޽pxOF3 Yfpu 9I0Ij8'Zg* ם>([(i\џ:#m:(~&rB&CSi=W5W[(j d4ʀ` 'w0N.wЇNˁAcCen@H6XZ2۰2aA^R=]k<Ȝ* CTaP1ʤe 6FŬzGDWE;or!3gX1#H "b2Is0sbAP9yS?67vf? j?jU:3YQ~-L,d`ԵkGkhdE4<Ddxkni̩YI''G;u=\^<)cw jc;cy/W'MCJNɈfsor#|{eFWq=Vtr;+7ԑ@Etɻ۴ %)iSDi% Wݛ0kLYRzHO!D/qEqEdžK$CYv3s4O^A" @][2'LfYZʩN~^ T  bb;l{6$OUU; y%ۻ鸜{\My^RUHہxPt TjAB+q$Mp ,=_ -LF Dę}|@kd(\hTqQƐƈ5dA(,MjNC @l ,akP0ąDP iSVy&s&7$8"2q@]θ-z6C_Bx{<.꣏3_?E3=+ ?.4яyqıqVg?zP$H,eFӖeH=qe?n9^i#ԿU#Iq#@7'6uUįDθeҕ^ T$}x dLx?K\|󿌯}EO;!;\vu<_._ @`:{Axnj#9lCښk灴QwQ`T%$0l)Քѯ-[hx IDATzPl\,U@Dajx^ݛ&> w.ڞ_Ÿ|/3[O?_r 1<'k |JNr4o?D5Os]i.OtMF|"tú)?/xαBH'x/|Vz'J·#ˤ,&Ϭ9[Xfa BZ+4roɬƐgkbz,tg) d~iڐ _Fa:?^x p1`l$7j F@VS5Ӿ~T$qRz deRYƩ-NyTJLI}GU&CZB9F [)4w ƕetXIR>cmm-ݠ"a.Y[#jcVOuk2Z~[J<@:eDeMlRؐMOu2Q*&&Sq^djVU#jpHBP%V2S__]^8ju6tY$2lݽӧOx}2/*w?\t ׯ_ǹsg2Uw*ϞƼ\YJ;d*++'>VwʷQ~"c,X!H [@; vwwqM), ۸ 9́dt՟Daz$Q}˗Gj7 5 x+*NLU48N[#i>W^0w׾C7n{pIllliU`ƤP; zOe)[WmoY]m)[gU({f2`4aww{{{e}sOon>dvw7m7- /|Ã}`6wq!d Ěcf0J@ȋ "y?YVc3LSLF#FCGn~_@Wbukg& @S7ir#Sv9%)K+mN |.Gxa'46A>H68ww~{w2x._cx7!ga OƹKGpY;"P?fο7ϩg V]>">u)Zl m0#FҐi TL52cvxj{[ i%œrK ?";OdNNY\ YΗK<o~ 30ݷ!m!yz7um0=w/ȱxxړ%C|Zɢ^++^v A '0DL xS aBF p  @2Wi "̏i0_˺k(LJ.bw*˲JVAҀ[}3at3>'=pc ѵZ NaLl'Ks j@q@KfvB‹sڥfAi; , I/1$@{έ[7.S@}{Wx׮?/7QHE҆!y^F0F`? #%! }BafT ] M -}(>Rm*)Gq&gbϓ$%$%3ʼU+b$ J%ݣkAoV\^&irG4#@,N䦁q'HS~zd1a ?C"L``d6XÉ'xE.K)??S3凯8d=f< s7hK@?:\|R8|I\D 4eh25k .* ă[=tg%0YAA֑G YMË8D!P) oUPt~+QfDK]#L)pOgR 0p= XW HϽ6߿}ElKN.ʕ˸t8{w;ʛ˗.ᩧw71N+{pw _'_sΜx{=@4t{H~*\#>{gY/[yi? A(m/1T[m(4SJ.m ^d;!8jN+I:W6%fe ZS ΁̹ѷӸ|[ehWB= 3l/yR40 (\.Y@  w;x[_ŝ??0^}W\FՏfLuG8q$N_xgΜp^pu\~x;?垈d2K/59~SCb~sϮ?4$Ogu{ 3=UQq1yFR *Ι3g;xo;o`aqU ΁zџ(+I{HgQri#D'Z,e"v]lrbZ4H _OJ**r=6)?֒u;sThL޿i;L[3!so6?' b@c 7k Oo2D` >/cg^a[\|#8uꤲښLc|> ow޷u;|k!+L77"QHȞ@  ɄаkP& M,GV dE8U2T!m0m'/xa>~Agi)Dԭ2q ~K}N9sd>;E-0|lT`]!R>>OW`!Lyԩ/*y|/pgg_?D?(sYIw"ͲxD:@(Ix)zH -S$g]*뛅i6B@J]4ԣ{ +GB2[4ǟhIڤ ǚqťWp-YַE"&(m˼0,^3g(xG}10|ow`O kkq=y'8 #(}Rf\}ΝWuz$g=|󯿂Oyޜ? )H} /yW#=$~s  MMOlj'Fb'?<+D_%qo;r|IΎbFԕɷf%ˠK"5Z&X%t[q4$/;"Ё0;=ث_E/j?ȱK>>ツ W׾?~Dd9`=CG"T.!1Hb)MhG\'v4welG5钀P2D-XW$S7Ua Zt=hV,3Yps@ 5$/*=kVƹ3)y6m~a*w3`ow?|۩"; 3ש֮9AH`y zW_y !?|xړ8rxd{SxKz=OmOIA`0K4/ TB粡u_bЋEdzYE㽙 Ȧ qOsVx564NV8wK{ߘL;Pf%q)* ``de{t>O]G0 RSz[&^=`:Az=o +'>2'r@=s?Q ܈g^:cs.c&bk{8q+[‹@#C CXsWq󀺬ܙX l\ߪ-?MVlLw eQ1foSbe1Ip>fk`"DN3 3DA7lwI>9?,l~" +"qpx۷`4O 4:r}G=p`IAjtZOR2Kssm23~ey QGPǗ:P=P$e@f: HTF%ȿWG6>Q{p54mF[~q WZ<.MdϠ\+Z4bo<b \bdtVIX@z(ǘQȆZ9%nj=T= dw!g. ,nfgT҆c5rH%j?lom[2RC2EVg7f1 T ^Z:^Z":wxн<4UkV#pkj~yPpŌiF/<,0U4\ UIG'E5)JHM~pZ"!$%Ca2 [*>;0N.)mI`a:MKdg㯇%1B?RsB'pxDWd IDATt1cu8$!`}`2`կD7$L[Lxhs˕7OEs KQh~ƃ23,CI&D5נF*G7  0ddɕ {MjqOJֿȁxcȉ̠kDj\u{X?rx<^zy5 x Ygw,1pX/;w6so="&^kf} IX:lrF2!\Ipdbʃk+}㤶J < lʊsh{7sf'/=B/7 4,=  MZfy g/`m$ ǎp8~z=cVE?Ϝ0 >%tg>R(@yKpx{ys0X90յ:]8"&&J!# UxҐd}O.PɎa2ۥ{Q uW; 9 n{$^{!b.g~؂`ISꑇ!}"Ag/^w1O_}u|c6 6FΟӧN'r(nGvww5t=t|9Ɛ}l޽V*̫8!؟(K=^ |x!Aت?-Θ%Bie 6h s % `qi^Һ2'j7Id ,LLތ.CB=vqcݭ-zΜ;V0;?.\#G6 1_>Μ>i0hZxam-Y|2`&vqvvw O6omVWCߋxDڗ|N2{7;'D?ſGnQC ʲh¶?_G ^[ CyH+Ό^wty^01Ԏɬ * ;g9Q6˵v;]v~%A%*ږ8?l @G;Ig TQ tK>ܩ+/O}X[[o?ݻ/…KaX+@N:3 Ãֽ.z> -!8)n-l.3_ן"\JS쮟&˅|9#Cߧɇ4j<íֈG6BV, krE7 UIIϻ.Iݺ-& ?nvx{ K^kJS=,.D p8XxcgH|J!4 ͉g^{%m^7 ] ;wp=ܸy/_spٳAN򴈇}ۆ'~'ϜK}xOVAߑq/t$`e7TiL})k;+ DždJ[ZL>^HvY()9`45x^-θ%$K>' r|e^4s70?qoydzҿ=O{zƋs=3ƞ k4֭;ƹsqe={]2fz8qT b =KUX|l]~w6-loo46o}*vOQ?LЀ">y>Cw\@^4I=S)r]gBuOSOvz35>پ`zVKfs>Nd=nx6`~I &d82//8K >`~ <bz}| ?^}>} <,`5Mqgsw6?qC8wN>~_`2Vn'3wwܿ?8׎l_C<ǿo'ʌ(L@A|A7@h-Uvi /1đB),"K'"xHx 2($ 2[t#07[wem0w 4.#@W}i?d<230;2}Vy0 :nN_tҤRJ3\@Hw5&3fh OMPz@#?[Y3k\7,`@E|GXf^!`ǣ/`X0+W7η`~ G0d0M1w٢b`Ν>ӧɓ8vXrXu8{{xݻ{>Fwu]G?K=}~~k\Nc=^#Mz7d)hLW_|Է:rf .À!N93i1:1ݑ\U6tS䑐8naBFF5t54)vut#MNWӸ.3M'rϏaD,+@( G^^0~y@Nj21 /7񃗿UHwxxW^zN?N93c<%NgFwKy.>6̀-^x#Ǔ{2 Pww|l[?~ |#xßu8'yJy 2&ex4IĨ}I?E7/7R"rm`Q# ǃ xλ0N"sA;@eorƕŗW# 3Sď0#Ce>B@( rD$ vv3,`s :G>__`?ŏ~7qt?~ 00Ljt:t:!p|G6~awgWc'N+8wRsb= jkpȑ61++Gf NV2ao/. _ܹr ҨO!$bSŚ|AxȀ͸;_]@N iVz:+~ /3و맆ݶ5ﲛP QIĀZPK?zf!IX0SsNgfH7 ;` /yPz3x_4n<={ϟѣ 1L;ҡ?A\Cv{S(?{_gyw:yFFd˨7 ;jZOtm~s,fbIZRY5sN|uC82/|_0~k΃Bnƭ[砸Ù3gpq@yth`X*h]ܻGe=~O }_g\gv1{S/G'MST}RM<{խŕ4@Y =gI@-m%:{nTGvMEb*Z+3Z~Y79|[5AWܩA݃Q6~ڏTĒcJ72 Pǟy?6߿u71p޻޻#8 w$=48w2^|sxgo㽟7~JrW]A`gw;M_~+\ÕEB2eF+)#1 UCw ?k ϳTAʨǞkOomimtN8y,_WxhSt@;P@ɚE%Jǿ$6] Mn[s :ؾX}#ٓX Ĩu\̓-025蘈ZLU}rn+8KENW/MN7],_ߜ/O߃ $ `q?L0,0C'=H p t\0F!n|slynbKÉSgpe\]^I}Ξ?S .LLJȦΰqT*6B2nOy&{1]O#LB37H+ba^mXK60Ptv*;w@qI@I1kYpkRl HßR&OcGˆ (0\eg@O`>> [px>vš@f`'N8ugϢuR@'A7J$rW>=ǮxH훷Hӑ` kmhOI)IY L׃4EgY]` *F2=C ?+#3k)q}3ji _G'2r8/I{*.gfH~! C^3ϼ?b}<bwb4<-~kXڑX?O~[l^ ~2+?0IoPLy$\RS#%}dYXğ*ޖ bJjyf}DjmtY@8raf:w@~4tyѵ m C Y>BO$0xg(;k +/{ ^[[:Ξg@h|pA怿yW?sK#npbIz9o(*g9OhDdZUCju/2曎S#L Y Th:gTu.QsrV//_DF7Sbʥrd?$YYGP4oe : +4OvGɾ*zdA:'K/ .Z}a!17`4@*F+^ Xmuc$ x0 HBd`0Tn tbX῱am~E6Ģ.(8 J#@ Eއ"C72uB'sHe0W(A122;g׷.B`įOf>ga$ўj2@J28 31Cᔍ_u3,QKint.D(, Pe/VgAL A9&BCFgUܥ1`v:]UzP/d U^Hb Z$9HҢblDP2w]Ԟq|dO ky.9fS]%J (:+3ҡ]N4P&?Ns_jya(:G(u =KcM(1I;|< Ђ"Os^A쩿26Nm8Y/Ilr6JY8i rܱȁ,^Ҩ!3sgK5S2x[YbHoJ'd8[/onHC~0 Ȃ{`!Pg@Gd"A 8^ s~ Y'-On(u:2_&*VFuFLiXv{aˌ3n& /[* 2,co];@ /}Cn79/7-A#>O/?ޟ|w\Eú|Az@|gX𼐀j[m ߓ^qY>C XU70Zy8`W_׿e:xӬFUFOD Cކ!׭;,C˃ɍ"ky[aQ#*Ⱥ37ʁz$N) 39b_@сWÛѺ`DfiGBPͲ !fց< `ҘPbH!c H1 d1uy}e8` 4w%rq>>\dͣ*nOuSKFa}B ]ikRf*bwӸw2jƚ"lႍ dh03Ų t@MWa۫c\LD1 O)p7P 9` {S}%i`Qᕧ5b?P;< Z؏گh9iY#6/ ښ)%q4>jbIK=5;ô%=6QNIU_^Sjk_mBi3$SFfƂ9@a 'cɘɐ2I r<3@`ǿAg_F&v5';$N.Y­^斉zRk8uu S4$) _o;ehԜ6Oޥ-0]>şKJyVO$% Q({Cn/p|JOjz?)$ݓ)4:oB>+}֝Ev[A-@сƉx˺6gcCRy ʙ!WY/сbs.b%z̿K{bxnŬx4b %|TZJIXh1P:.`E!Fj>M)TmQo|  /r;R&UV5tl(BYaRѿʃiRQh@̊T)}3 :2Zwo:q{"ff'%ۊ2#@MIlEMf2iv6t [(9G;_BUўpF6bQF/ IB.J(PuB~ˌ&#uk XMmV">%coڒByzs{ AyPf0x&i0Rˈ7D&To^!_%A60ӂtz՘js(ٴU>M :NW/@}㒤Mv-L86W4(y ʞ" _=5hũjlR}qF*7p RG["8R f/oYۤum $3p.07֖?綥ճj?LޟaR'YP4_ zN5,|΁Vx&rVDvH/Y#T3u J9 Z.JuE&L!2L4]g\kJw! >M[<c^&FP\O2Z,[%@x{YSx7ϴbQޜi(VuK6@ t-ZjA Uc,ko0>[Z0(bV}^LsQw imoiyTr@5ŝ¯./YWj<GPgMc6]2)?z*hSeCNL*I Lx6Hk }/&Q2;ۓd6JSF>V"w]mp;? HI]Viɭ)OYM*?-bc%q!Fҍ.?Q߷PWK4d0w ޖ84m-̨aE3ȸY7QöR([| -HRg3J4AA<#3S"1Ef/^MoNw ~5S39)0(߆c[m!Z챸kf Q$/rΌ)xNK5)S2$DKhJ1]#T^`[ )ˢbt}4R~g]ĸ@co2zȢY1ol<7}L ]bFRt K l0HR D*E Uw!Ll𯙮Mf0ڀŰd mt%n,KRltdKoJ'CY/xj 9/vs)i-HH1-<ݨAJ wO5Fuy_X˄ݢZӴ.1x7_X΢(E+/.i K6"x֖d b>28h @K>4ӂAZg4 5=_ߴA2JvL-Ce2E7nCk)į.nk+1[Nȯ-5ML_J JtEzaA-d w?@%_iQ4V-udcoט(YC-Yxd7plIO dsӆ5[N;lWgFs#3Uj(b઱ЪUBLfRcMqκ okc)|;etŋ ^vN Pk&-dcRړibjúLm#EZe`[ƌlp(V/wvnG4(xsŁxWXmY277y[[dIqtv}M`Hj-,,[vָ.[Z0E ô $3g6qkzo%%3g(\\olSa`WY{SLxŝ^ xAo|c#}Llʅ>N[EjE zi̜.;@'cFN! u*woґyW[_`XQȒQVD2q锃8%]=qVAWf;$CFi~zi!X,r^&;|&NܢO*E9[a1'E1LۗiTiXJLiXMm rށe3)~MV5S\JBȸU7ZT߂Z.)koZ,a`DN,8l {{*}Rr1lI)Yi2$1#Ua"C lO EEh *)io1(c@__QCɶfEjl$=E=jd͕Os3+ 4N,zr;ݗ~ңc(Ϻ.:.J㠸G&pͱQXlK,ZCx/$H q<0c|㨰ܩg9vxxx9 *,4a]Hܝ_Y_LLz`YǙZ2P/\MLR^0Al;=̺ y"IN&V"""@s}| z?E[.<7[ N  ]r}1L-Wyđ XQ9boD g"8SC$D)GoC| \غ+ahOYwvvf2z8-zhA3[1ŵ{&ڳU(3npA84+C#Õw&fkz@W"pEgz![tffט1Ѧ*IFxrI;.Y[yƩ-w'?Wwa#ᅬ"dݹkF'r͊d lE_8XAjtoՌVm- $> nˆSvc7wtrep,suC~wr{ċX&pnl3_ 8EmDs~U/nZm& '_Zc}Y=eHEIa0*S]& }P 3j2Hw5ѤQNy^if|vC.l*viu\{PD;RxEecM3SO m>PàqJ3txB!}d-hQ!+SZS+/_D׳K 9$o(zleS81U3Fls04g.4.5J[L =a}EEzd|=Mh4 U32Laщ* zE7"0wNUd==-a%G %ZzF@d^ !eDi#ɆF015L qFT<\<}z ; c@IB^NUQ z|1_3(wŃ1wũYB u{ȳSΆXx 7DykF^~]NG i$Nű܀} (]h.1oFJ~Lc^=v'fR:aD&{G26ʬbQ`E=.5cQw\.ðs:w_!ODw38‹ 9-M$T?ULzD=x2#ZWe >5>B/a[D1022lX$^^zaAݿG[y.a&* ="9?]s&e_% anaNDEfW26:=@8K=q dm ay Çϟ3W"<0XchQź` ,ܧ%&mz]dୋ+j؟aݱw75Ӣ(ċg@;`lq`FeƥF뿓a)&G y(}| Ⱦw*///O`L&m xQ#YXI7Y}̘* A!i/d/B Hcau뉔hvqQf+vD壁c|aVr@`y fs!mzl<:YgW= 3<=bgnz)`]&=f)1$7*C۩"/NEE#l#O)NQ7|@[}[h1Աkp"sv3[<nQW(,WTF0oDt O9:99WoMjɏy fV^W(17ŒqJ9:_(!WKHDi/ ;)mxb3a~v~`ekO9s^}a$>Wu>lj#9 ބnd+fIH|%|h %4d v8~shqJ*4ʂ9`۶ 08]D)UQ")·J?(|l)\\3*]<V&хMʝ}Qr.oX46@B}?rشI:E*JnBF*:"60ۘ`o{5)dp`;b3?ۭFU2 M M?wl=cG>TFωH5fκFX^sqagːb=0t?AsTfZax/pa;|B)ċ\EaXN4 VKAlA(0({gi%m/M.x˕~-7by]l0 {GQ|D݀&n!,)47U(8hg /Jed "V=zX$‹~XƅܹE;LL$E1<Bݷ6gi[OW5#:Yċ+QvWIƫD6zE c(&@F!NT&p'<7bv-{z;݌^g\QX̪3~+(:SgT(;.#ct4>*AC׌DEU$^~aۘ&P[Zr).#0F ,Ǽ0z^g[gຟb=@~@<)|'Vx s|gPI_ȳ JT|_אz1=*بսu '#߄/Md9Ѓ5ـ|Ly5*Waesj $ 󏒰:e\@ }7`%p;e۷oO[薞 1'?+63IENDB`tcos-0.89.93ubuntu2/lockscreen/lockvnc.c0000664000000000000000000001340112260610261015017 0ustar /* * lockvnc.c * Copyright (C) 2006,2007,2008 mariodebian at gmail * Copyright (C) 2008 vidal_joshur at gva.es * * This file is based on screen-locker of iTALC project: * screen_locker.c - screen-locker, which is part of the iTALC client-software * * iTALC/Client-software * Copyright (c) 2004-2005 Tobias Doerffel * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include int setenv(const char *name, const char *value, int overwrite); #define AllPointerEventMask \ (ButtonPressMask | ButtonReleaseMask | \ EnterWindowMask | LeaveWindowMask | \ PointerMotionMask | PointerMotionHintMask | \ Button1MotionMask | Button2MotionMask | \ Button3MotionMask | Button4MotionMask | \ Button5MotionMask | ButtonMotionMask | \ KeymapStateMask) /* TODO: don't use X-Athena-Widgets (xaw)*/ int main (int argc, char **argv) { XtResource desktopBackingStoreResources[] = { { XtNbackingStore, XtCBackingStore, XtRBackingStore, sizeof(int), 0, XtRImmediate, (XtPointer) Always, }, }; Display * display; /*Visual * vis;*/ XSetWindowAttributes attr; unsigned long valuemask; int count = 0; Pixmap src, msk; XColor fg, bg; Widget toplevel; Dimension displayWidth, displayHeight; Cursor blankcursor; Widget form, viewport, desktop; Window desktop_win; char srcBits[] = { 0,0,0,0,0 }; char mskBits[] = { 0,0,0,0,0 }; setenv("XLIB_SKIP_ARGB_VISUALS", "1", 1); /* Call the main Xt initialisation function. It parses command-line options, generating appropriate resource specs, and makes a * connection to the X display. */ toplevel = XtVaAppInitialize(NULL, "ScreenLocker", NULL, 0, &argc, argv, NULL, XtNborderWidth, 0, NULL); display = XtDisplay(toplevel); (void)DefaultVisual(display, DefaultScreen(display)); displayWidth = WidthOfScreen(DefaultScreenOfDisplay(display)); displayHeight = HeightOfScreen(DefaultScreenOfDisplay(display)); /* full screen - set position to 0,0, but defer size calculation until widgets are realized */ XtVaSetValues(toplevel, XtNoverrideRedirect, True, XtNgeometry, "+0+0", NULL); form = XtVaCreateManagedWidget("form", formWidgetClass, toplevel, XtNborderWidth, 0, XtNdefaultDistance, 0, NULL); viewport = XtVaCreateManagedWidget("viewport", viewportWidgetClass, form, XtNborderWidth, 0, NULL); desktop = XtVaCreateManagedWidget("desktop", coreWidgetClass, viewport, XtNborderWidth, 0, NULL); XtVaSetValues(desktop, XtNwidth, displayWidth, XtNheight, displayHeight, NULL); /* "Realize" all the widgets, i.e. actually create and map their X windows */ XtRealizeWidget(toplevel); /* We want to stop the window manager from managing our toplevel window. This is not really a nice thing to do, so may not work * properly with every window manager. We do this simply by setting overrideRedirect and reparenting our window to the root. * The window manager will get a ReparentNotify and hopefully clean up its frame window. */ XtVaSetValues(toplevel, XtNoverrideRedirect, True, NULL); XReparentWindow(display, XtWindow(toplevel), DefaultRootWindow(display), 0, 0); /* attempt to resize it, then ask "form" to manage it again. */ XtResizeWidget(toplevel, 1, 1, 0); desktop_win = XtWindow(desktop); src = XCreateBitmapFromData(display, DefaultRootWindow(display), srcBits, 5, 5); msk = XCreateBitmapFromData(display, DefaultRootWindow(display), mskBits, 5, 5); XAllocNamedColor(display, DefaultColormap(display,DefaultScreen(display)), "black", &fg, &fg); XAllocNamedColor(display, DefaultColormap(display,DefaultScreen(display)), "white", &bg, &bg); blankcursor = XCreatePixmapCursor(display, src, msk, &fg, &bg, 2, 2); XFreePixmap(display, src); XFreePixmap(display, msk); XtVaGetApplicationResources(desktop, (XtPointer)&attr.backing_store, desktopBackingStoreResources, 1, NULL); valuemask = CWBackingStore; attr.cursor = blankcursor; valuemask |= CWCursor; XChangeWindowAttributes(display, desktop_win, valuemask, &attr); /* Try to get the input focus. */ XSetInputFocus(display, DefaultRootWindow(display), RevertToPointerRoot, CurrentTime); /* Try to dont allow screensaver to activate */ XForceScreenSaver(display, (int) ScreenSaverReset); while (count < 5) { if (XSetScreenSaver(display, 0, 0, (int) DontPreferBlanking, (int) DontAllowExposures) != BadValue ) { break; } printf ("lockvnc::screensaver Could not disable screensaver, Badvalue=%d Count=%d.\n", BadValue, count); sleep (1); count++; } /*XUngrabKeyboard(display, CurrentTime); XUngrabPointer(display, CurrentTime);*/ count=0; /* now grab keyboard and mouse */ while (count < 5) { if (XtGrabKeyboard(toplevel, True, GrabModeAsync, GrabModeAsync, CurrentTime) != GrabSuccess) { printf ("lockvnc::keybmouse Could not grab keyboard, Count=%d.\n", count); sleep (1); count++; } else { break; } } #ifndef DEBUG while (1) { /* wait in a loop */ sleep (5); } #else sleep(3); printf("DEBUG: quiting...\n"); #endif return (0); } tcos-0.89.93ubuntu2/lockscreen/lockscreen.c0000664000000000000000000001402312260610261015511 0ustar /* * screen_locker.c - screen-locker, which is part of the iTALC client-software * * iTALC/Client-software * Copyright (c) 2004-2005 Tobias Doerffel * * This 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 software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #define AllPointerEventMask \ (ButtonPressMask | ButtonReleaseMask | \ EnterWindowMask | LeaveWindowMask | \ PointerMotionMask | PointerMotionHintMask | \ Button1MotionMask | Button2MotionMask | \ Button3MotionMask | Button4MotionMask | \ Button5MotionMask | ButtonMotionMask | \ KeymapStateMask) /* TODO: don't use X-Athena-Widgets (xaw)*/ int main (int argc, char **argv) { XtResource desktopBackingStoreResources[] = { { XtNbackingStore, XtCBackingStore, XtRBackingStore, sizeof(int), 0, XtRImmediate, (XtPointer) Always, }, }; Display * display; Visual * vis; XSetWindowAttributes attr; unsigned long valuemask; Pixmap src, msk; XColor fg, bg; int blackColor; GC gc; Widget toplevel; Dimension displayWidth, displayHeight; Cursor blankcursor; Widget form, viewport, desktop; Window desktop_win; char srcBits[] = { 0,0,0,0,0 }; char mskBits[] = { 0,0,0,0,0 }; /* Call the main Xt initialisation function. It parses command-line options, generating appropriate resource specs, and makes a * connection to the X display. */ toplevel = XtVaAppInitialize(NULL, "ScreenLocker", NULL, 0, &argc, argv, NULL, XtNborderWidth, 0, NULL); display = XtDisplay(toplevel); vis = DefaultVisual(display, DefaultScreen(display)); displayWidth = WidthOfScreen(DefaultScreenOfDisplay(display)); displayHeight = HeightOfScreen(DefaultScreenOfDisplay(display)); /* full screen - set position to 0,0, but defer size calculation until widgets are realized */ XtVaSetValues(toplevel, XtNoverrideRedirect, True, XtNgeometry, "+0+0", NULL); form = XtVaCreateManagedWidget("form", formWidgetClass, toplevel, XtNborderWidth, 0, XtNdefaultDistance, 0, NULL); viewport = XtVaCreateManagedWidget("viewport", viewportWidgetClass, form, XtNborderWidth, 0, NULL); desktop = XtVaCreateManagedWidget("desktop", coreWidgetClass, viewport, XtNborderWidth, 0, NULL); XtVaSetValues(desktop, XtNwidth, displayWidth, XtNheight, displayHeight, NULL); /* "Realize" all the widgets, i.e. actually create and map their X windows */ XtRealizeWidget(toplevel); /* We want to stop the window manager from managing our toplevel window. This is not really a nice thing to do, so may not work * properly with every window manager. We do this simply by setting overrideRedirect and reparenting our window to the root. * The window manager will get a ReparentNotify and hopefully clean up its frame window. */ XtVaSetValues(toplevel, XtNoverrideRedirect, True, NULL); XReparentWindow(display, XtWindow(toplevel), DefaultRootWindow(display), 0, 0); /* Now we want to fix the size of "viewport". We shouldn't just change it directly. * Instead we set "toplevel" to the required size (which should propagate through "form" to "viewport"). * Then we remove "viewport" from being managed by "form", change its resources to position it and make sure that "form" won't * attempt to resize it, then ask "form" to manage it again. */ XtResizeWidget(toplevel, displayWidth, displayHeight, 0); XtUnmanageChild(viewport); XtVaSetValues(viewport, XtNhorizDistance, 0, XtNvertDistance, 0, XtNleft, XtChainLeft, XtNright, XtChainLeft, XtNtop, XtChainTop, XtNbottom, XtChainTop, NULL); XtManageChild(viewport); /* Now we can set "toplevel" to its proper size. */ XtResizeWidget(toplevel, displayWidth, displayHeight, 0); /*image = XCreateImage(display, vis, 32, ZPixmap, 0, NULL, 2000, 2000, BitmapPad(display), 0);*/ blackColor = BlackPixel(display, DefaultScreen(display)); desktop_win = XtWindow(desktop); gc = XCreateGC(display, desktop_win, 0, NULL); /* Tell the GC we draw using the black color*/ XSetForeground(display, gc, blackColor); XFillRectangle(display, desktop_win, gc, 0, 0, displayWidth, displayHeight); src = XCreateBitmapFromData(display, DefaultRootWindow(display), srcBits, 5, 5); msk = XCreateBitmapFromData(display, DefaultRootWindow(display), mskBits, 5, 5); XAllocNamedColor(display, DefaultColormap(display,DefaultScreen(display)), "black", &fg, &fg); XAllocNamedColor(display, DefaultColormap(display,DefaultScreen(display)), "white", &bg, &bg); blankcursor = XCreatePixmapCursor(display, src, msk, &fg, &bg, 2, 2); XFreePixmap(display, src); XFreePixmap(display, msk); XtVaGetApplicationResources(desktop, (XtPointer)&attr.backing_store, desktopBackingStoreResources, 1, NULL); valuemask = CWBackingStore; attr.cursor = blankcursor; valuemask |= CWCursor; XChangeWindowAttributes(display, desktop_win, valuemask, &attr); /* Try to get the input focus. */ XSetInputFocus(display, DefaultRootWindow(display), RevertToPointerRoot, CurrentTime); /* now grab keyboard and mouse */ if (XtGrabKeyboard(desktop, True, GrabModeAsync, GrabModeAsync, CurrentTime) != GrabSuccess || XtGrabPointer(desktop, True, (unsigned int) AllPointerEventMask, GrabModeAsync, GrabModeAsync, None, blankcursor, CurrentTime) != GrabSuccess) { printf ("Could not grab keyboard and mouse.\n"); } while (1) { /* sleep a little bit - only for better task-scheduling... */ sleep (5); } return (0); } tcos-0.89.93ubuntu2/lockscreen/screensize.c0000664000000000000000000000347012260610261015537 0ustar /* * screensize.c: returns scren size in horiz x vert * Copyright (C) 2006,2007,2008 mariodebian at gmail * Copyright (C) 2008 vidal_joshur at gva.es * * This file is based on screen-locker of iTALC project: * screen_locker.c - screen-locker, which is part of the iTALC client-software * * iTALC/Client-software * Copyright (c) 2004-2005 Tobias Doerffel * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include int main (int argc, char **argv) { Display * display; Widget toplevel; Dimension displayWidth, displayHeight; /* Call the main Xt initialisation function. It parses command-line options, generating appropriate resource specs, and makes a * connection to the X display. */ toplevel = XtVaAppInitialize(NULL, "ScreenLocker", NULL, 0, &argc, argv, NULL, XtNborderWidth, 0, NULL); display = XtDisplay(toplevel); displayWidth = WidthOfScreen(DefaultScreenOfDisplay(display)); displayHeight = HeightOfScreen(DefaultScreenOfDisplay(display)); printf("%dx%d\n", displayWidth, displayHeight); XCloseDisplay(display); return (0); } tcos-0.89.93ubuntu2/lockscreen/waitforX.c0000664000000000000000000000364212260610261015171 0ustar /* * waitforX.c * Copyright (C) 2011 mariodebian at gmail * * wait for X server to start up * * iTALC/Client-software * Copyright (c) 2004-2005 Tobias Doerffel * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include /* number of tries to open X display */ #define MAX_TRY 25 /* wait 1/5 second */ #define WAIT_LOOP 200000 void usleep(unsigned long usec); int main(int argc, char **argv) { int i=0; Display *xd=NULL; /* allow to pass as argument the DISPLAY var */ char *displayNum=":0"; if (argc == 2) { displayNum=argv[1]; } #ifdef DEBUG fprintf(stderr, "Opening DISPLAY '%s'\n",displayNum); #endif for ( i=0; i< MAX_TRY; i++ ) { if ( (xd=XOpenDisplay(displayNum) ) ) { #ifdef DEBUG fprintf(stderr, "DISPLAY '%s' opened in %d iterations done, return 0\n",displayNum, i); #endif XCloseDisplay(xd); return 0; } #ifdef DEBUG fprintf(stderr, "DISPLAY '%s' not opened in %d iterations\n",displayNum, i); #endif usleep(WAIT_LOOP); } #ifdef DEBUG fprintf(stderr, "DISPLAY '%s' not opened, return 1\n",displayNum); #endif return 1; } tcos-0.89.93ubuntu2/Makefile0000664000000000000000000001663712260610261012542 0ustar ## ## TCOS Makefile ## ## mariodebian \/at\/ gmail \/dot\/ com ARCH:=$(shell dpkg-architecture -qDEB_BUILD_ARCH) all: $(MAKE) -C hex2ascii $(MAKE) -C xmlrpc $(MAKE) -C udev $(MAKE) -C lockscreen $(MAKE) -C tnc $(MAKE) -C dbus $(MAKE) -C session-cmd $(MAKE) -C tcos-standalone $(MAKE) -C tmixer include common.mk clean: @find * |grep "~" | xargs rm -rf -- @rm -f build-stamp configure-stamp $(MAKE) -C hex2ascii clean $(MAKE) -C xmlrpc clean $(MAKE) -C udev clean $(MAKE) -C lockscreen clean $(MAKE) -C tnc clean $(MAKE) -C dbus clean $(MAKE) -C session-cmd clean $(MAKE) -C tcos-standalone clean $(MAKE) -C tmixer clean distclean: find . -type f -name "*~" | xargs rm -rf -- install: # Creating directories install -d $(DESTDIR)/$(TCOS_CONF) install -d $(DESTDIR)/$(TCOS_CONF)/ssl install -d $(DESTDIR)/$(TCOS_CONF)/hooks-addons/ install -d $(DESTDIR)/$(TCOS_CONF)/conf.d/ install -d $(DESTDIR)/$(TCOS_CONF)/secrets/ install -d $(DESTDIR)/$(TCOS_DIR) install -d $(DESTDIR)/$(TCOS_DIR)/hooks install -d $(DESTDIR)/$(TCOS_DIR)/hooks-addons install -d $(DESTDIR)/$(TCOS_DIR)/scripts install -d $(DESTDIR)/$(TCOS_DIR)/inc install -d $(DESTDIR)/$(TFTP_DIR) install -d $(DESTDIR)/$(TCOS_BINS) install -d $(DESTDIR)/$(X11_CONF) install -m 640 ssl/tcos_ca.crt $(DESTDIR)$(TCOS_CONF)/ssl/ install -m 640 ssl/tcos_dh1024.pem $(DESTDIR)$(TCOS_CONF)/ssl/ install -m 640 ssl/tcos_server.pem $(DESTDIR)$(TCOS_CONF)/ssl/ install -d $(DESTDIR)$(TCOS_CONF)/hacking install -d $(DESTDIR)$(TCOS_CONF)/pxelinux.d install -d $(DESTDIR)/usr/sbin install -d $(DESTDIR)/usr/bin install -d $(DESTDIR)$(TFTP_DIR)/pxelinux.cfg install -d $(DESTDIR)$(TFTP_DIR)/conf/ install -d $(DESTDIR)$(TCOS_CONF)/hooks for i in `find scripts/ -type d`; do install -d $(DESTDIR)$(TCOS_CONF)/$$i; done for i in `find scripts/ -type d`; do install -d $(DESTDIR)$(TCOS_DIR)/$$i; done for i in `find hooks/ -type d`; do install -d $(DESTDIR)$(TCOS_DIR)/$$i; done install -d $(DESTDIR)/var/lib/tcos/isos install -m 644 xorgids/xorg.pciids $(DESTDIR)/$(TCOS_DIR)/inc/ install -m 644 tcos/default.tpl $(DESTDIR)$(TCOS_CONF)/pxelinux.cfg.tpl install -m 644 tcos/example.dual.server.conf $(DESTDIR)/$(TCOS_CONF)/pxelinux.d/example.dual.server.hook install -m 644 tcos/help.msg $(DESTDIR)$(TFTP_DIR)/ install -m 644 tcos/help2.msg $(DESTDIR)$(TFTP_DIR)/ install -m 644 tcos/tcos.msg $(DESTDIR)$(TFTP_DIR)/ install -m 644 tcos/logo.lss $(DESTDIR)$(TFTP_DIR)/ install -m 644 tcos/default.menu.tpl $(DESTDIR)$(TCOS_CONF)/pxelinux.menu.cfg.tpl install -m 644 tcos/pxetcos.jpg $(DESTDIR)$(TFTP_DIR)/ install -m 755 hooks/tcosmain $(DESTDIR)$(TCOS_CONF)/hooks/ for i in `find scripts/ -type f`; do install -m 755 $$i $(DESTDIR)$(TCOS_DIR)/$$i; done for i in `find hooks/ -type f`; do install -m 755 $$i $(DESTDIR)$(TCOS_DIR)/$$i; done for i in `find hooks-addons/ -maxdepth 1 -type f`; do install -m 644 $$i $(DESTDIR)$(TCOS_DIR)/$$i; done # delete tcosmain from tcos/hooks/ rm -f $(DESTDIR)$(TCOS_DIR)/hooks/tcosmain chmod -x $(DESTDIR)$(TCOS_DIR)/scripts/tcos install -m 640 conf/tcos.conf $(DESTDIR)$(TCOS_CONF)/tcos.conf install -m 644 conf/version.conf $(DESTDIR)/var/lib/tcos/version.conf sed -i 's/__TCOS_VERSION__/$(VERSION)/g' $(DESTDIR)/var/lib/tcos/version.conf sed -i 's/__TCOS_DISTRO__/$(DISTRO_VERSION)/g' $(DESTDIR)/var/lib/tcos/version.conf sed -i 's/__DISTRIBUTION__/$(DISTRO)/g' $(DESTDIR)/var/lib/tcos/version.conf sed -i 's/__TCOS_ARCH__/$(TCOS_ARCH)/g' $(DESTDIR)/var/lib/tcos/version.conf sed -i 's/__TCOS_MULTIARCH__/$(TCOS_MULTIARCH)/g' $(DESTDIR)/var/lib/tcos/version.conf install -m 755 bin/gentcos $(DESTDIR)/usr/sbin/ # tcos.conf templates install -d $(DESTDIR)$(TCOS_DIR)/templates/ install -d $(DESTDIR)$(TCOS_CONF)/templates/ install -m 644 conf/branding-pxelinux.info $(DESTDIR)$(TCOS_CONF)/templates/ # copy tcos.conf to have a default config install -m 644 conf/base.conf $(DESTDIR)$(TCOS_DIR)/templates/base.conf install -m 644 conf/tcos.conf.all $(DESTDIR)$(TCOS_DIR)/templates/tcos.conf.all install -m 644 conf/tcos.conf.low $(DESTDIR)$(TCOS_DIR)/templates/tcos.conf.low install -m 644 conf/tcos.conf.nfs $(DESTDIR)$(TCOS_DIR)/templates/tcos.conf.nfs install -m 644 conf/tcos.conf.light $(DESTDIR)$(TCOS_DIR)/templates/tcos.conf.light install -m 644 conf/tcos-modules.conf $(DESTDIR)$(TCOS_DIR)/tcos-modules.conf install -m 644 conf/tcos-generation-functions.sh $(DESTDIR)$(TCOS_DIR)/tcos-generation-functions.sh install -m 644 conf/tcos-run-functions.sh $(DESTDIR)$(TCOS_DIR)/tcos-run-functions.sh install -m 644 conf/branding.info $(DESTDIR)$(TCOS_CONF)/conf.d/ install -m 644 conf/80export_pulseaudio $(DESTDIR)$(X11_CONF)/ install -m 644 conf/initramfs.conf $(DESTDIR)$(TCOS_CONF)/initramfs.conf install -m 644 conf/template $(DESTDIR)$(TCOS_CONF)/hacking/template install -m 644 images/logo.xpm.gz $(DESTDIR)$(TCOS_DIR)/logo.xpm.gz # gentcos build script install -m 755 bin/gentcos $(DESTDIR)/usr/sbin/gentcos install -m 755 bin/tcos-buildchroot $(DESTDIR)/usr/sbin/tcos-buildchroot install -m 755 bin/tcos-gdm-autologin $(DESTDIR)/usr/sbin/tcos-gdm-autologin install -m 755 bin/configurexorg $(DESTDIR)/$(TCOS_BINS)/ install -m 755 bin/seq $(DESTDIR)/$(TCOS_BINS)/ install -m 755 bin/get_filesystem $(DESTDIR)/$(TCOS_BINS)/ install -m 755 bin/cd_type $(DESTDIR)/$(TCOS_BINS)/ install -m 755 bin/installer.sh $(DESTDIR)/$(TCOS_BINS)/ install -m 755 bin/tryXorg.sh $(DESTDIR)/$(TCOS_BINS)/ install -m 644 bin/set-limits $(DESTDIR)/$(TCOS_BINS)/ install -m 755 bin/daemonize.sh $(DESTDIR)/$(TCOS_BINS)/ install -m 755 bin/get_xauth $(DESTDIR)/$(TCOS_BINS)/ install -m 755 bin/clear-logs $(DESTDIR)/$(TCOS_BINS)/ install -m 755 bin/down-controller $(DESTDIR)/$(TCOS_BINS)/ install -m 755 bin/get_server $(DESTDIR)/$(TCOS_BINS)/ install -m 755 bin/clean_string.sh $(DESTDIR)/$(TCOS_BINS)/ install -m 755 bin/get_vga_vendor $(DESTDIR)/$(TCOS_BINS)/ install -m 755 bin/udhcpc-script $(DESTDIR)/$(TCOS_BINS)/ install -m 755 bin/tcos-bootchartd $(DESTDIR)/$(TCOS_BINS)/ install -m 755 bin/tcos-genbootchart $(DESTDIR)/usr/bin/tcos-genbootchart install -m 644 conf/xorg.conf.tpl $(DESTDIR)$(TCOS_CONF)/xorg.conf.tpl install -d $(DESTDIR)/usr/bin $(MAKE) -C hex2ascii install DESTDIR=$(DESTDIR) # xmlrpc $(MAKE) -C xmlrpc install PREFIX=$(PREFIX) DESTDIR=$(DESTDIR) sed -i 's/__VERSION__/$(VERSION)/g' $(DESTDIR)/$(TCOS_BINS)/tcos-last # udev $(MAKE) -C udev install PREFIX=$(PREFIX) DESTDIR=$(DESTDIR) TCOS_BINS=$(TCOS_BINS) # lockscreen $(MAKE) -C lockscreen install PREFIX=$(PREFIX) DESTDIR=$(DESTDIR) TCOS_BINS=$(TCOS_BINS) PACKAGE=$(PACKAGE) # tcos net controller $(MAKE) -C tnc install PREFIX=$(PREFIX) DESTDIR=$(DESTDIR) TCOS_BINS=$(TCOS_BINS) PACKAGE=$(PACKAGE) # dbus conf file $(MAKE) -C dbus install PREFIX=$(PREFIX) DESTDIR=$(DESTDIR) # session-cmd scripts $(MAKE) -C session-cmd install TCOS_BINS=$(TCOS_BINS) DESTDIR=$(DESTDIR) # tcos-standalone helper $(MAKE) -C tcos-standalone install PREFIX=$(PREFIX) DESTDIR=$(DESTDIR) sed -i 's/__VERSION__/$(VERSION)/g' $(DESTDIR)/$(PREFIX)/sbin/tcos-standalone # tmixer $(MAKE) -C tmixer install PREFIX=$(PREFIX) DESTDIR=$(DESTDIR) # VPN support not complete # # openvpn # $(MAKE) -C openvpn install PREFIX=$(PREFIX) DESTDIR=$(DESTDIR) tcos-0.89.93ubuntu2/hex2ascii/0000775000000000000000000000000012260610427012750 5ustar tcos-0.89.93ubuntu2/hex2ascii/Makefile0000664000000000000000000000042412260610261014404 0ustar all: hex2ascii include ../common.mk hex2ascii: $(QUIET_CC)$(GCC) hex2ascii.c -o hex2ascii $(CFLAGS) $(LDFLAGS) -Wall -ansi -pedantic clean: $(QUIET_CL)rm -f hex2ascii install: install -d $(DESTDIR)$(TCOS_BINS) install -m 755 hex2ascii $(DESTDIR)$(TCOS_BINS)/hex2ascii tcos-0.89.93ubuntu2/hex2ascii/hex2ascii.c0000664000000000000000000000316012260610261014767 0ustar /* * hex2ascii.c convert a hex string into ascii string * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* * Mario Izquierdo mariodebian at gmail.com * Based on http://www.bigbold.com/snippets/posts/show/2073 * */ #include #include #include char *strtok(char *s, const char *delim); char hexToAscii(char *io_hex) { /*printf("DEBUG: %s\n", io_hex);*/ char hex[5], *stop; hex[0] = '0'; hex[1] = 'x'; hex[2] = io_hex[0]; hex[3] = io_hex[1]; hex[4] = 0; return strtol(hex, &stop, 16); } void usage() { printf("hex2ascii converter usage:\n\n"); printf(" hex2ascii xx:xx:xx:xx:xx:xx\n"); } int main(int argc, char* argv[]) { char *p; if ( argc==1 ) { usage(); return(1); } /* split by : */ p = (char*) strtok ( argv[1],":"); while (p != NULL) { printf("%c", hexToAscii(p) ); p = (char*) strtok (NULL, ":"); } printf("\n"); return(0); } tcos-0.89.93ubuntu2/README0000664000000000000000000001523012260610261011746 0ustar Readme file of TCOS build generation system INDEX: * Boot from PXE network card. * Boot from Etherboot floppy. * Debug terminal that don't start. * Howto decrease RAM requirements. --------------------------------------- Boot from PXE --------------------------------------- 1.- Configure /etc/tcos/tcos.conf and enable/disable all what you want. All vars are comented. 2.- Exec: # gentcos -tftp ( see gentcos -help or man gentcos for more options ) 3.- Configure dhcp server like this: host __PCNAME__ { # PXE boot hardware ethernet 00:04:75:ff:b6:aa; # mac address fixed-address 192.168.0.10; # ip address filename "/tcos/pxelinux.0"; } 4.- Restart dhcp server and boot terminal. 5.- You can add some cmdline options before boot, you can see some of them presing F1 before boot starts. Examples: startx=N ( no startx) startx=L ( start local session Xorg + xterm + twm ) startx=R ( start remote x default) server=10.0.0.1 ( tftpboot and XMDCP server, default is dhcp server) volume=80% ( volume of PCM and MASTER chanels of audio mixer ) value can be 1%-100% or integer from 1 to 31 zap ( allow to kill Xorg with Ctrl + Alt + Backspace, default disabled) force-update ( delete usr.squashfs if found in local harddisk and download again ) noswap ( disable swap file generation, swap partittions will be used if found ) nounionfs ( disable unionfs mount on /usr, /usr will be read only ) --------------------------------------- Boot with Etherboot floppy --------------------------------------- 1.- First off all you need a Etherboot floppy that works with your network card. You can try with universal FLOPPY, download here: http://prdownloads.sourceforge.net/thinstation/BootDisk522b.zip?download Or try to build your own in: http://rom-o-matic.net/ 2.- Run gentcos -nbi [-nbi-output=linux-1.nb] This will create and put in tftp dir the nbi boot image. You can change default name (linux.nbi) to another one => linux-1.nb 3.- Configure DHCP server to serve NBI image: Example: host pc3 { # NBI Etherboot hardware ethernet 00:04:75:ff:b8:31; fixed-address 192.168.0.30; # nbi generated file with: gentcos -nbi filename "/tcos/linux.nbi"; } 4.- Restart dhcp server, boot terminal from floppy and enjoy. --------------------------------------- Debug terminal that don't start --------------------------------------- If terminal don't connect to XMDCP server and give a busybox shell we can read some logs and examine what is the cause. 1.- Exec: $ more /tmp/initramfs.debug In this file are all output of many actions during boot. 2.- View "ps" output. 3.- View dmesg output. We can connect with ssh to thin client ( if enabled ): $ ssh root@__TERMINAL-IP__ If we copy any rsa key, password will not be asked, else root password is defined (plaintext) in /etc/tcos/tcos.conf Is possible to mount all thin client filesystem in server: mkdir thin-client/ ltspfs __TERMINAL-IP__:/ thinc-client/ To umount fusermount -u thin-client/ See help about LTSPFS and fuse. #################################################### Thin client gives a kernel panic !!!! #################################################### If terminal gives a kernel panic we can try to stop boot process using break stament, you can append to cmdline following vars: (all var are sorted in same order that are exec) TCOS-premount breaks: break=network # stop before configure lo and eth0 break=fstab # stop before create /etc/fstab break=uselocal # stop before scan local disks break=swapon # stop before create/mount swap file break=sqmount # stop before download usr.squashfs or allmodules.squashfs break=ldconfig # stop before exec ldconfig TCOS-bottom breaks break=inittcos # stops before some daemons are started break=initsound # stops before sound is loaded break=ltspfs # stops before ltspfs daemon is started break=startx # stops before startx is started When thin clients stops you can do some things: see dmesg output see /tmp/initramfs.debug file see loaded modules (lsmod or cat /proc/modules) see mem usage (free or cat /proc/meminfo) see inet info (ifconfig or dhcp.leases file) view process running (ps) --------------------------------------- Things to do, to decrease RAM requirements --------------------------------------- * First of all disable what you don't need in /etc/tcos/tcos.conf reduce a lot of ram TCOS_SOUND= ( disabled sound support ) TCOS_USB= ( disabled USB & SCSI support ) reduce a few ram TCOS_SSH= ( disabled ssh support ) reduce a bit ram TCOS_INETD= ( disabled inetd support ) TCOS_DISCOVER= ( disabled discover support ) You get more info during generation process of needed space for each app. * Edit /etc/tcos/initramfs.conf and set MODULES var to list MODULES=list MODULES can be one of this: most ( include all of network modules and chipset) dep ( include all modules loaded in server NOT RECOMENDED ) netboot ( include netboot modules, but not block devices ) list ( include all modules we need => tcos-modules.conf low RAM RECOMENDED ) more info => man initramfs.conf with this setting initramfs have exactly all modules you want * Edit /etc/tcos/modules you can edit some var to exactly put needed modules There are 2 methods of know what modules thin client need: 1.- Use discover: set TCOS_DISCOVER=1 and boot with this params: boot: tcos startx=N when thin client finish to boot you will have a shell, exec this: cat /tmp/initramfs.debug | grep Skipping you could read something like this Skipping XXXXX; assuming it is compiled into kernel take note of all XXXXX modules and put them in /etc/tcos/modules 2.- Second method is to start terminal with cmdline: tcos allmodules startx=N ( you need allmodules.squashfs in /var/lib/tcos/tftp generated with gentcos -allmodules [other options] ) -allmodules requires at least 14-15 Mb of extra RAM. next exec lsmod or cat /proc/modules and take note of all. ####################################################################### WITH ALL OF THESE TCOS will start (without swap[*]) with 26 Mb of RAM ####################################################################### [*] swap in limited thin clients (ex: 32 Mb) is very important, because Xorg need free memory to run. tcos-0.89.93ubuntu2/scripts/0000775000000000000000000000000012260610427012560 5ustar tcos-0.89.93ubuntu2/scripts/tcos-top/0000775000000000000000000000000012260610427014330 5ustar tcos-0.89.93ubuntu2/scripts/tcos-top/20mountnfs0000775000000000000000000000342612260610261016272 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi . /scripts/functions . /conf/tcos.conf . /conf/tcos-run-functions quiet=n # if break=mountnfs STOP here maybe_break mountnfs # read /tmp/less_ram if [ "$(cat /tmp/less_ram)" = "0" ]; then # have more than TCOS_MIN_RAM exit 0 fi # if use NFS try to mount: # # SERVER_IP:/var/lib/tcos/fs-$(uname -r) # MNTOPT="ro,nolock,rsize=2048,wsize=2048,retrans=10" NFS_RO=/mnt/nfs NFS_RW=/root mkdir -p /root mkdir -p /mnt/nfs # NFS or NBD ? NFS_MODE=$(read_cmdline_var "nfsmode" "nfs") if [ "${NFS_MODE}" = "nbd" ]; then # mount root-$(uname -r).squashfs as /dev/nbd0 log_begin_msg "Mounting remote squashfs with NBD" NBD_PORT=$(read_cmdline_var "nbdport" "2001") # load 1 nbd devices modprobe nbd nbds_max=1 # wait for device while [ ! -e /dev/nbd0 ]; do sleep 1 done nbd-client tcos-server $NBD_PORT /dev/nbd0 sleep 1 mount /dev/nbd0 /mnt/nfs log_end_msg $? else log_begin_msg "Trying to mount NFS" nfsmount -o $MNTOPT $(read_server "nfs-server"):${TCOS_VAR}/fs-$(uname -r) ${NFS_RO} 2>/dev/null # try again if [ $? -ne 0 ]; then log_begin_msg "Second retry to mount NFS" nfsmount -o $MNTOPT $(read_server "nfs-server"):${TCOS_VAR}/fs-$(uname -r) ${NFS_RO} 2> /dev/null fi if [ $? -ne 0 ]; then panic "Unable to mount NFS, check NFS service in server and ${TCOS_VAR}/fs-$(uname -r) dir" fi log_end_msg $? fi # end of NFS_MODE # remount /root in RW mode log_begin_msg "Remounting root in RW mode" mount_unionfs /mnt/ram /mnt/nfs /root log_end_msg $? maybe_break move_mnt # Set browseable NFS and RAM dirs mkdir -p /root/.dirs/nfs mkdir -p /root/.dirs/ram mount -o move /mnt/nfs /root/.dirs/nfs mount -o move /mnt/ram /root/.dirs/ram exit 0 tcos-0.89.93ubuntu2/scripts/tcos-top/02check_ram0000775000000000000000000000123312260610261016327 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n . /scripts/functions . /conf/tcos.conf . /conf/tcos-run-functions echo 0 > /tmp/less_ram # read MemTotal (in MB) have_mem=$(awk '/^MemTotal/ {print int($2/1000)}' /proc/meminfo) if [ ${have_mem} -lt ${TCOS_MIN_RAM} ]; then # we have less than TCOS_MIN_RAM # need to start in NFS mode echo 1 > /tmp/less_ram fi # force boot without nfs if booting from disk FORCE_NO_NFS=$(read_cmdline_var 'nonfs' '0') if [ $FORCE_NO_NFS = 1 ]; then echo 0 > /tmp/less_ram fi # force boot nfs FORCE_NFS=$(read_cmdline_var 'forcenfs' '0') if [ $FORCE_NFS = 1 ]; then echo 1 > /tmp/less_ram fi exit 0 tcos-0.89.93ubuntu2/scripts/tcos-top/01busybox0000775000000000000000000000430012260610261016103 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n . /scripts/functions . /conf/tcos.conf . /conf/tcos-run-functions # set kernel very silent if grep -q quiet /proc/cmdline ; then echo "1 1 1 7" > /proc/sys/kernel/printk dmesg -n 1 fi # start syslogd (busybox embeded) killall syslogd 2>/dev/null syslogd 2>/dev/null if [ $? != 0 ]; then # create a fuck logger rm -f /bin/logger cat << EOF > /bin/logger #!/bin/sh echo "[\$(date +'%d/%m/%y %H:%M:%S')] \$2: \$3" >> /var/log/messages EOF chmod +x /bin/logger fi # hack for ubuntu old udev while [ 1 ]; do [ -e /sys/class/net/eth0 ] && break [ -e /sys/class/net/eth1 ] && break [ -e /sys/class/net/eth2 ] && break [ -e /sys/class/net/wlan0 ] && break [ -e /sys/class/net/wlan1 ] && break [ -x /sbin/udevtrigger ] && /sbin/udevtrigger [ -x /sbin/udevplug ] && /sbin/udevplug [ -x /sbin/udevadm ] && /sbin/udevadm trigger [ -x /sbin/udevadm ] && /sbin/udevadm settle if [ ! -e /tmp/waiting_for_net ]; then echo -n " * Waiting for net device " fi touch /tmp/waiting_for_net echo -n "." sleep 1 done echo "" modprobe -q loop >> /tmp/initramfs.debug 2>&1 modprobe -q squashfs >> /tmp/initramfs.debug 2>&1 # network and nfs modprobe nfs 2>/dev/null modprobe af_packet 2>/dev/null if [ ! -z "$TCOS_DISABLE_IDE" ]; then # load cdrom and HDD modules modprobe -q ide_disk >> /tmp/initramfs.debug 2>&1 & modprobe -q ide_cd >> /tmp/initramfs.debug 2>&1 & fi # from > 2.6.26 we need to load aufs module (unionfs is deprecated) # TCOS_UNIONFS is generated in hooks-addons/99tcos and saved in /conf/tcos.conf if [ "$TCOS_UNIONFS" = "aufs" ]; then _log "BUSYBOX load aufs module" modprobe -q aufs >> /tmp/initramfs.debug 2>&1 & else if [ "$(read_cmdline_var "aufs" "0")" = "1" ] && [ $(modprobe aufs -q ; echo $?) != 1 ]; then _log "BUSYBOX loaded aufs module" modprobe -q aufs >> /tmp/initramfs.debug 2>&1 & else _log "BUSYBOX load unionfs module and if fail try aufs" modprobe -q unionfs || modprobe -q aufs >> /tmp/initramfs.debug 2>&1 & fi fi grep -q -e aufs -e unionfs /proc/filesystems || modprobe -q -b overlayfs exit 0 tcos-0.89.93ubuntu2/scripts/tcos-top/60make_init0000775000000000000000000000331612260610261016363 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi . /scripts/functions . /conf/tcos.conf . /conf/tcos-run-functions quiet=n # if break=make_init STOP here maybe_break make_init # read /tmp/less_ram if [ "$(cat /tmp/less_ram)" = "0" ]; then # have more than TCOS_MIN_RAM exit 0 fi if grep -q bootchartd /proc/cmdline ; then # stop bootchart /sbin/tcos-bootchartd stop mkdir -p /root/tmp/bootchart mv /tmp/bootchart/* /root/tmp/bootchart fi UDEV_SCRIPT=/scripts/init-premount/udev [ -e /scripts/init-top/udev ] && UDEV_SCRIPT=/scripts/init-top/udev rm -f /root/sbin/init cat << EOF > /root/sbin/init #!/bin/sh . /scripts/functions . /conf/initramfs.conf . /conf/tcos.conf quiet=n if grep -q bootchartd /proc/cmdline ; then /sbin/daemonize.sh /sbin/tcos-bootchartd start fi /scripts/tcos-top/01busybox >/dev/null 2>&1 # start udev again log_begin_msg "Re-Discovering hardware" $UDEV_SCRIPT find / -type f >/dev/null 2>&1 log_end_msg \$? run_scripts /scripts/tcos-bottom/ EOF chmod +x /root/sbin/init mkdir -p /root/proc /root/dev /root/sys mkdir -p /root/var/run /root/var/www /root/var/log /root/tmp #mkdir -p /root/var/lib/dhcp #cat /var/lib/dhcp/dhclient.leases > /root/var/lib/dhcp/dhclient.leases cat /tmp/net.data > /root/tmp/net.data cat /etc/hostname > /root/etc/hostname cat /etc/hosts > /root/etc/hosts cat /etc/resolv.conf > /root/etc/resolv.conf cat /etc/modules > /root/etc/modules cat /tmp/initramfs.debug > /root/tmp/initramfs.debug cat /var/log/messages > /root/var/log/messages cat /tmp/less_ram > /root/tmp/less_ram touch /etc/mtab cat /etc/mtab > /root/etc/mtab [ -e /etc/console/boottime.kmap.gz ] && cat /etc/console/boottime.kmap.gz > /root/etc/console/boottime.kmap.gz exit 0 tcos-0.89.93ubuntu2/scripts/tcos-top/05network0000775000000000000000000002022712260610261016113 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n . /scripts/functions . /conf/tcos.conf . /conf/tcos-run-functions # if break=sqmount STOP here maybe_break network # localhost log_begin_msg "Bring up Local loopback device" ifconfig lo up log_end_msg $? touch /etc/resolv.conf #if [ -d /var/lib/dhcp3 ]; then # # link to work with dhcp-client or dhcp3-client # ln -s /var/lib/dhcp3 /var/lib/dhcp # chown root:dhcp /lib/dhcp3-client 2>/dev/null # chown 775 /lib/dhcp3-client # chmod 4744 /lib/dhcp3-client/call-dhclient-script # chown root:dhcp /etc/resolv.conf 2>/dev/null # chmod 644 /etc/resolv.conf #fi # wireless TCOS minihowto # # start thin client with something like this: # # boot: tcos wifi=1 essid="ESSID" server=xx.xx.xx.xx # * server is tftpd and XMDCP host # * ESSID is wireless network if [ $(read_cmdline_var 'wifi' '0') = "1" ]; then # load kernel modules log_begin_msg "Loading wireless kernel modules" modprobe -q arc4 modprobe -q ecb modprobe -q mac80211 modprobe -q ieee80211_crypt modprobe -q ieee80211 modprobe -q ieee80211softmac #modprobe -q rc80211_simple for kmod in $TCOS_WIRELESS_MODS; do if [ "$kmod" = "madwifi" ]; then #ath-pci ath-hal wlan_tkip wlan_scan_sta ath-hal modprobe -q ath-pci 2>/dev/null modprobe -q ath-hal 2>/dev/null modprobe -q wlan_tkip 2>/dev/null modprobe -q wlan_scan_sta 2>/dev/null elif [ "$kmod" = "zd1211" -o "$kmod" = "zd1211rw" ]; then modprobe -q zd1211rw 2>/dev/null elif [ "$kmod" = "rt2400" -o "$kmod" = "rt2400pci" ]; then modprobe -q rt2400pci 2>/dev/null elif [ "$kmod" = "rt2500" -o "$kmod" = "rt2500pci" ]; then modprobe -q rt2500pci 2>/dev/null elif [ "$kmod" = "rt61" -o "$kmod" = "rt2561" -o "$kmod" = "rt61pci" ]; then modprobe -q rt61pci 2>/dev/null elif [ "$kmod" = "rt73" -o "$kmod" = "rt73usb" ]; then modprobe -q rt73usb 2>/dev/null elif [ "$kmod" = "bcm43xx" -o "$kmod" = "broadcom" ]; then modprobe -q bcm43xx 2>/dev/null else modprobe -q $kmod 2>/dev/null fi done log_end_msg 0 fi # get list of network interfaces TCOS_NET_ACTIVE="eth0" TCOS_NET_WIFI=0 TCOS_NET_WIFI_ESSID="" TCOS_NET_WIFI_KEYMODE="" TCOS_NET_DEVS=$(ls /sys/class/net/ |grep -v -e lo -e sit0 -e wmaster -e pan) TCOS_NET_LINK="" TCOS_NET_LINK_NUMBER=0 # search for network interfaces with link ok status for dev in $TCOS_NET_DEVS; do # need to up iface ifconfig $dev up >> /tmp/initramfs.debug 2>&1 # have link ??? if [ -e /sys/class/net/$dev/carrier ]; then if [ "$(cat /sys/class/net/$dev/carrier 2>/dev/null)" != "1" ]; then # some gigabit cards take some time to negotiate network link log_begin_msg "Waiting for netlink in $dev" sleep 10 log_end_msg fi if [ "$(cat /sys/class/net/$dev/carrier 2>/dev/null)" = "1" ]; then _log "05NETWORK found carrier link in $dev iface" TCOS_NET_LINK="$TCOS_NET_LINK $dev" TCOS_NET_LINK_NUMBER=$(($TCOS_NET_LINK_NUMBER+1)) fi fi done if [ $(read_cmdline_var 'wifi' '0') = "1" ]; then #force wireless, read some vars TCOS_NET_WIFI_ESSID=$(read_cmdline_var "essid" "") for dev in $TCOS_NET_DEVS; do # is wireless???? if [ -e /sys/class/net/$dev/wireless ]; then TCOS_NET_WIFI=1 TCOS_NET_LINK=$dev # stop searching break fi done fi if [ $TCOS_NET_WIFI = 1 ]; then # one iface wireless TCOS_NET_ACTIVE=$TCOS_NET_LINK elif [ $TCOS_NET_LINK_NUMBER -gt 1 ]; then # we have some ifaces with link _log "05NETWORK various net ifaces have link" elif [ $TCOS_NET_LINK_NUMBER = 1 ]; then # one iface TCOS_NET_ACTIVE=$TCOS_NET_LINK else # not link !!! panic "ERROR: No link network detected, check cable." fi # break for wireless maybe_break wireless if [ $TCOS_NET_WIFI = 1 ]; then #ifconfig $TCOS_NET_ACTIVE down #ifconfig $TCOS_NET_ACTIVE up [ -z $TCOS_NET_WIFI_KEYMODE ] && TCOS_NET_WIFI_KEYMODE="restricted" # scan wireless log_begin_msg "Scanning wireless networks" iwlist $TCOS_NET_ACTIVE scan | grep ESSID | awk -F ":" '{print $2}' | sed s/\"//g >> /tmp/initramfs.debug 2>&1 log_end_msg $? log_begin_msg "Wireless associating with $TCOS_NET_WIFI_ESSID" iwconfig $TCOS_NET_ACTIVE essid "$TCOS_NET_WIFI_ESSID" log_end_msg $? # associate if ap cmdline var is set if [ "$TCOS_NET_WIFI_ESSID" != "" ]; then if [ "$TCOS_WIRELESS_ENC" = "WPA" ]; then modprobe -q michael_mic modprobe -q blkcipher modprobe -q aes modprobe -q ieee80211_crypt_tkip modprobe -q ieee80211_crypt_ccmp log_begin_msg "Wireless WPA mode" /sbin/start-wpa.sh "${TCOS_NET_ACTIVE}" log_end_msg $? fi if [ "$TCOS_WIRELESS_ENC" = "WEP" ]; then modprobe -q ieee80211_crypt_wep log_begin_msg "Wireless WEP mode setting key" if [ ! -z $TCOS_WIRELESS_KEY ];then iwconfig $TCOS_NET_ACTIVE key $TCOS_NET_WIFI_KEYMODE $TCOS_WIRELESS_KEY fi log_end_msg $? fi else log_begin_msg "Wireless associating with any" iwconfig $TCOS_NET_ACTIVE essid any log_end_msg $? fi #else # # wired network # ifconfig $TCOS_NET_ACTIVE down # ifconfig $TCOS_NET_ACTIVE up fi log_begin_msg "Sending DHCP request on $TCOS_NET_LINK" _log "DHCLIENT $TCOS_NET_LINK" if [ -x /sbin/udhcpc ]; then /sbin/udhcpc -i $TCOS_NET_LINK -s /bin/udhcpc-script >> /tmp/initramfs.debug 2>&1 else busybox udhcpc -i $TCOS_NET_LINK -s /bin/udhcpc-script -O swapsrv >> /tmp/initramfs.debug 2>&1 fi myip=$(awk -F"=" '/^ip=/ {print $2}' /tmp/net.data) dhcpserver=$(awk -F"=" '/^serverid=/ {print $2}' /tmp/net.data) hostname=$(awk -F"=" '/^hostname=/ {print $2}' /tmp/net.data) netmask=$(awk -F"=" '/^netmask=/ {print $2}' /tmp/net.data) gateway=$(awk -F"=" '/^gateway=/ {print $2}' /tmp/net.data) TCOS_NET_ACTIVE=$(awk -F"=" '/^interface=/ {print $2}' /tmp/net.data) xserver=$(awk -F"=" '/^swapsrv=/ {print $2}' /tmp/net.data) log_end_msg 0 if [ -n ${TCOS_DEBUG} ]; then _log "NETWORK data: ip=${myip} server=${dhcpserver} hostname=${hostname}" fi # count number of ":" in hostname string if [ $(echo $hostname | awk '{print split($1, A, ":")}') -gt 1 ]; then if [ -x /bin/hex2ascii ]; then # got an hexadecimal hostname hostname2=$(hex2ascii $hostname) _log "NETWORK HEX hostname \"$hostname\"=\"$hostname2\"" hostname=$hostname2 fi fi if [ -z $hostname ] || [ "x{$hostname}" = "x " ]; then panic "ERROR: DHCP server don't give me a hostname !!! Edit /etc/hosts in dhcp server" fi # search for other hosts TCOS_TFTP_SERVER=$(read_cmdline_var 'tftpserver' "${dhcpserver}") if [ "$xserver" != "" ]; then TCOS_SERVER=$(read_cmdline_var 'server' "${xserver}") TCOS_XDMCP_SERVER=$(read_cmdline_var 'xserver' "${xserver}") TCOS_FONT_SERVER=$(read_cmdline_var 'fontserver' "${xserver}") TCOS_RDESKTOP_SERVER=$(read_cmdline_var 'rdesktop' "${xserver}") TCOS_NFS_SERVER=$(read_cmdline_var 'nfsserver' "${xserver}") else TCOS_SERVER=$(read_cmdline_var 'server' "${dhcpserver}") TCOS_XDMCP_SERVER=$(read_cmdline_var 'xserver' "${dhcpserver}") TCOS_FONT_SERVER=$(read_cmdline_var 'fontserver' "${dhcpserver}") TCOS_RDESKTOP_SERVER=$(read_cmdline_var 'rdesktop' "${dhcpserver}") TCOS_NFS_SERVER=$(read_cmdline_var 'nfsserver' "${dhcpserver}") fi # Setup the hostname log_begin_msg "Setting hostname to ${hostname}" echo $hostname > /etc/hostname echo $hostname > /proc/sys/kernel/hostname cat < /etc/hosts 127.0.0.1 localhost.localdomain localhost 127.0.1.1 ${hostname} ${myip} ${hostname} ${TCOS_SERVER} tcos-server ${TCOS_TFTP_SERVER} tftp-server ${TCOS_XDMCP_SERVER} xdmcp-server ${TCOS_RDESKTOP_SERVER} rdesktop-server ${TCOS_NFS_SERVER} nfs-server ${TCOS_FONT_SERVER} font-server EOF hostname $hostname export HOSTNAME=$hostname log_end_msg # start portmap || rcpbind (for NFS) [ -x /sbin/portmap ] && /sbin/portmap >/tmp/portmap.log 2>&1 & [ -x /sbin/rpcbind ] && /sbin/rpcbind >/tmp/rpcbind.log 2>&1 & exit 0 tcos-0.89.93ubuntu2/scripts/tcos-top/50fstab0000775000000000000000000000541512260610261015523 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n . /scripts/functions # if break=fstab STOP here maybe_break fstab . /conf/tcos.conf . /conf/tcos-run-functions cat < /etc/fstab # /etc/fstab: static file system information. # # proc /proc proc defaults 0 0 sys /sys sysfs defaults 0 0 none /dev/pts devpts gid=5,mode=620 0 0 EOF if [ ! -d /dev/pts ]; then _log "FSTAB Mount /dev/pts" mkdir -p /dev/pts mount /dev/pts >> /tmp/initramfs.debug 2>&1 fi # mount usbfs if [ "$(grep -c usbfs /proc/filesystems)" != "0" ] && [ ! -e /proc/bus/usb/devices ]; then log_begin_msg "Mounting /proc/bus/usb" mount -t usbfs procbususb /proc/bus/usb/ 2>/dev/null log_end_msg $? fi # DOCUMENTME uselocal | enable use of local disks uselocal=$(read_cmdline_var "uselocal" "1") if [ ${uselocal} = 0 ]; then _log "FSTAB uselocal disabled from cmdline" exit 0 fi if [ "$NO_UDEV" = "" ]; then # don't call udev again with NFS # wait for devices [ -x /sbin/udevtrigger ] && /sbin/udevtrigger --subsystem-match=ide --subsystem-match=block [ -x /sbin/udevsettle ] && /sbin/udevadm settle fi # To avoid fsck #touch ${rootmnt}/fastboot # # Search local disks partitions # get_partitions () { echo $(ls /dev/[sh]d[a-z]?* 2>/dev/null) } # # Search for CD/DVDs # get_cdroms () { echo $(head -3 /proc/sys/dev/cdrom/info 2>/dev/null | tail -1 | cut -f 3-) } # # Create fstab # create_fstab () { defaults=" defaults,noauto 0 2" partitions=$(get_partitions) for part in $partitions; do # get_filesystem is a script in /bin entry=$(get_filesystem $part) dev=$(echo $entry | awk '{print $1}' ) fs=$(echo $entry | awk '{print $2}' ) if [ "$fs" = "swap" ] ; then entry="${dev} none swap sw 0 0" elif [ "$fs" = "extended" ] ; then # extended partition continue else mntpoint="/mnt/${dev#/dev/}" mkdir -p $mntpoint if [ "$fs" = "ntfs" ]; then defaults=" defaults,ro,noauto 0 2" fi entry="${dev} ${mntpoint} ${fs} ${defaults}" fi echo $entry >> /etc/fstab done num=0 cdroms=$(get_cdroms) for cd in $cdroms; do entry="/dev/${cd} /mnt/cdrom${num} udf,iso9660 ro,noauto 0 0" mkdir -p /mnt/cdrom${num} >> /var/log/initramfs.debug 2>&1 num=$(($num+1)) echo $entry >> /etc/fstab done } [ "$NO_MSG" = "" ] && log_begin_msg "Searching local disks (fstab)" create_fstab rm -f /etc/mtab cat /proc/mounts > /etc/mtab # force boot without swap if [ "$(read_cmdline_var 'noswap' '0')" = 0 ]; then swapon -a >> /tmp/initramfs.debug 2>&1 fi _log "FSTAB done" [ "$NO_MSG" = "" ] && log_end_msg 0 exit 0 tcos-0.89.93ubuntu2/scripts/tcos-premount/0000775000000000000000000000000012260610427015377 5ustar tcos-0.89.93ubuntu2/scripts/tcos-premount/36squashfs-methods0000775000000000000000000000261612260610261020775 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi . /scripts/functions . /conf/tcos.conf . /conf/tcos-run-functions quiet=n # if break=nfs-squashfs STOP here maybe_break nfs-squashfs # if use NFS try to mount: # # SERVER_IP:/var/lib/tcos/fs-$(uname -r) # # SQUASHFS NFS ? SQUASHFS_MODE=$(read_cmdline_var "squashfs" "") if [ "${SQUASHFS_MODE}" = "nfs" ]; then MNTOPT="ro,nolock,rsize=2048,wsize=2048,retrans=10" NFS_RO=/mnt/nfs-squashfs mkdir -p $NFS_RO log_begin_msg "Trying to mount NFS-SQUAHSFS" nfsmount -o $MNTOPT $(read_server "nfs-server"):${TCOS_VAR}/tftp ${NFS_RO} 2>/dev/null # try again if [ $? -ne 0 ]; then log_begin_msg "Second retry to mount NFS-SQUAHFS" nfsmount -o $MNTOPT $(read_server "nfs-server"):${TCOS_VAR}/tftp ${NFS_RO} 2> /dev/null fi if [ $? -ne 0 ]; then panic "Unable to mount NFS, check NFS service in server and ${TCOS_VAR}/tftp dir" fi log_end_msg 0 # copy squashfs file in /mnt/tmp to not download log_begin_msg "Copy SQUASHFS to /mnt/tmp" cp ${NFS_RO}/usr-$(uname -r).squashfs /mnt/tmp/usr-$(uname -r).squashfs log_end_msg 0 umount ${NFS_RO} elif [ "${SQUASHFS_MODE}" = "http" ]; then log_begin_msg "Downloading SQUASHFS using HTTP" wget http://$(read_server "nfs-server"):8080/usr-$(uname -r).squashfs -O- > /mnt/tmp/usr-$(uname -r).squashfs log_end_msg 0 fi # end of SQUASHFS_MODE exit 0 tcos-0.89.93ubuntu2/scripts/tcos-premount/20hdd0000775000000000000000000000202612260610261016222 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n . /scripts/functions # if break=sqmount STOP here maybe_break hdd . /conf/tcos.conf . /conf/tcos-run-functions # check if we are booting from HD / USB _INITRD=$(read_cmdline_var "initrd" "") if [ "$_INITRD" = "initrd.gz" ]; then # booting from hdd, use usr.squashfs from HDD if exists mkdir -p /mnt/tmp for part in $(grep -e ext3 -e vfat /etc/fstab| awk '{print $1":"$3}'); do device=$(echo $part | awk -F":" '{print $1}') fs=$(echo $part | awk -F":" '{print $2}') mount -t${fs} ${device} /mnt/tmp if [ -f /mnt/tmp/usr.squashfs ]; then USR_SQUASH=/mnt/tmp/usr.squashfs _log "SQMOUNT found usr.squashfs in $device " break elif [ -f /mnt/tmp/usr-$(uname -r).squashfs ]; then USR_SQUASH=/mnt/tmp/usr-$(uname -r).squashfs _log "SQMOUNT found usr-$(uname -r).squashfs in $device " break else umount /mnt/tmp fi done fi ############################################## exit 0 tcos-0.89.93ubuntu2/scripts/tcos-premount/15uselocal0000664000000000000000000000462512260610261017302 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n . /scripts/functions # if break=uselocal STOP here maybe_break uselocal . /conf/tcos.conf . /conf/tcos-run-functions mkdir -p /mnt/tmp >/dev/null 2>&1 # DOCUMENTME uselocal | enable use of local disks uselocal=$(read_cmdline_var "uselocal" "0") if [ ${uselocal} = 0 ]; then _log "USELOCAL uselocal not enabled from cmdline" exit 0 fi # try to mount any part in /mnt/tmp ######################################### ext3_parts_num=$(grep ^/dev /etc/fstab|grep -c ext3) ext3_parts_devs=$(grep ^/dev /etc/fstab|grep ext3 | awk '{print $1}') vfat_parts_num=$(grep ^/dev /etc/fstab|grep -c vfat) vfat_parts_devs=$(grep ^/dev /etc/fstab|grep vfat | awk '{print $1}') need_free_space=131072 ######################################### if [ ${ext3_parts_num} != 0 ]; then log_begin_msg "Try to use some ext3 parts" for ext3 in ${ext3_parts_devs}; do mount -t ext3 -o rw ${ext3} /mnt/tmp >> /tmp/initramfs.debug 2>&1 sync sleep 1 if [ $(grep -c ${ext3} /proc/mounts) != 1 ]; then _log "USELOCAL ${ext3} not mounted, next..." # not mounted else _log "USELOCAL ${ext3} mounted, check free space" free_space=$(df ${ext3}| grep ^/dev| awk '{print $4}') # check if free space > 64 Mb if [ ${free_space} -ge ${need_free_space} ] ; then _log "USELOCAL have more than ${need_free_space} in ${ext3}" log_end_msg 0 exit 0 else _log "USELOCAL no free space in ${ext3}" umount ${ext3} fi fi done # if here no ext3 part log_end_msg 1 fi if [ ${vfat_parts_num} != 0 ]; then log_begin_msg "Try to use some vfat parts" for vfat in ${vfat_parts_devs}; do mount -t vfat -o rw ${vfat} /mnt/tmp >> /tmp/initramfs.debug 2>&1 sync sleep 1 if [ $(grep -c ${vfat} /proc/mounts) != 1 ]; then _log "USELOCAL ${vfat} not mounted, next..." # not mounted else _log "USELOCAL ${vfat} mounted, check free space" free_space=$(df ${vfat}| grep ^/dev| awk '{print $4}') # check if free space > 64 Mb if [ ${free_space} -ge ${need_free_space} ] ; then _log "USELOCAL have more than ${need_free_space} in ${vfat}" log_end_msg 0 exit 0 else _log "USELOCAL no free space in ${vfat}" umount ${vfat} fi fi done # if here no vfat part log_end_msg 1 fi log_begin_msg "NO parts avalaible (ext3 or fat)" log_end_msg 0 exit 0 tcos-0.89.93ubuntu2/scripts/tcos-premount/45sqmount0000775000000000000000000000323512260610261017203 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n . /scripts/functions # if break=sqmount STOP here maybe_break sqmount . /conf/tcos.conf . /conf/tcos-run-functions TCOS_SQUASHFS=$(read_cmdline_var "squashfs" "${TCOS_SQUASHFS}") if [ ! -z $TCOS_DISABLE_SQUASHFS ]; then _log "SQMOUNT no squashfs support, exiting" # no squashfs support defined exit 0 fi USR_SQUASH=/mnt/tmp/usr-$(uname -r).squashfs MOD_SQUASH=/mnt/tmp/allmodules-$(uname -r).squashfs # check if have in /mnt/tmp without version if [ -e /mnt/tmp/usr.squashfs ]; then USR_SQUASH=/mnt/tmp/usr.squashfs fi if [ -e /mnt/tmp/allmodules.squashfs ]; then MOD_SQUASH=/mnt/tmp/allmodules.squashfs fi ############################################## if [ ! -e /dev/loop0 ] && [ ! -e /dev/loop1 ]; then for NUM in $(seq 0 8) ; do mknod /dev/loop$NUM b 7 $NUM done fi # Mount squashfs filesystems log_begin_msg "Mounting usr filesystem" mount -r -o loop -t squashfs ${USR_SQUASH} /usr >> /tmp/initramfs.debug 2>&1 # check if squashfs mount give an error if [ $? != 0 ]; then panic "Error mounting usr.squashfs check squashfs module or bugs" else log_end_msg 0 fi ############################################### # DOCUMENTME allmodules | download with tftp allmodules.squashfs to test what modules need thin client TCOS_ALL_MODULES_CMD=$(read_cmdline_var "allmodules" "0") if [ "$TCOS_ALL_MODULES_CMD" = "1" ] || [ ! -z $TCOS_ALL_MODULES_DOWNLOAD ]; then if [ -f ${MOD_SQUASH} ]; then log_begin_msg "Mounting allmodules.squashfs" mount -r -o loop -t squashfs ${MOD_SQUASH} /lib/modules/$(uname -r)/ >> /tmp/initramfs.debug 2>&1 log_end_msg $? fi fi exit 0 tcos-0.89.93ubuntu2/scripts/tcos-premount/20swapon0000775000000000000000000000456312260610261017002 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n . /scripts/functions # if break=swapon STOP here maybe_break swapon . /conf/tcos.conf . /conf/tcos-run-functions # DOCUMENTME noswap | disable swap file creation (swap partition is used always, if found) noswap=$(read_cmdline_var "noswap" "0") if [ ${noswap} = 1 ]; then _log "SWAPON swap disabled from cmdline" exit 0 fi ############ VARS ############### # need 64 mb of free space (in kb) need_free_space=65536 mem_max=$(grep MemTotal /proc/meminfo | awk '{print $2}') mem_max_dd=901120 if [ ${need_free_space} -ge ${mem_max} ] ; then # mem_max - 10 Mb need_free_space=$(($mem_max-10240)) fi if [ ${need_free_space} -ge ${mem_max_dd} ];then need_free_space=${mem_max_dd} fi ################################# swap_parts_num=$(grep ^/dev /etc/fstab|grep -c swap) swap_parts_devs=$(grep ^/dev /etc/fstab|grep swap | awk '{print $1}') ext3_parts_num=$(grep ^/dev /etc/fstab|grep -c ext3) ext3_parts_devs=$(grep ^/dev /etc/fstab|grep ext3 | awk '{print $1}') fat32_parts_num=$(grep ^/dev /etc/fstab|grep -c vfat) fat32_parts_devs=$(grep ^/dev /etc/fstab|grep vfat | awk '{print $1}') ######### FUNCTIONS ########## check_if_swaps() { # exit if swap is mounted if [ $(grep -c -v ^Filename /proc/swaps ) != 0 ]; then _log "SWAPON have swap !!!" log_end_msg 0 exit 0 fi } mount_exits_swap() { for dev in $1 ; do swapon ${dev} done } swap_mnt_file=/mnt/tmp/swap.file # check if /mnt/tmp is mounted and create swap file into /mnt/tmp create_swap () { if [ $(grep -c /mnt/tmp /proc/mounts) -gt 0 ]; then # have /mnt/tmp !!!! # check if file exists if [ -f ${swap_mnt_file} ]; then # file exists, mount swapon ${swap_mnt_file} >> /tmp/initramfs.debug 2>&1 else # file not exists, create it dd if=/dev/zero of=${swap_mnt_file} bs=${need_free_space}k count=1 >> /tmp/initramfs.debug 2>&1 mkswap ${swap_mnt_file} >> /tmp/initramfs.debug 2>&1 swapon ${swap_mnt_file} >> /tmp/initramfs.debug 2>&1 fi fi } ############# begin code ############ log_begin_msg "Active swap partitions" # first we search for a swap mounted and exit _log "SWAPON checking swap mounted partitions" check_if_swaps # no swap partition, create swap file in /mnt/tmp (if mounted) create_swap # if here we have no swap _log "SWAP no swap avalaible" log_end_msg 1 exit 0 tcos-0.89.93ubuntu2/scripts/tcos-premount/25nbd_filesystem0000664000000000000000000000120012260610261020465 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n . /scripts/functions # if break=nbd_filesystem STOP here maybe_break nbd_filesystem . /conf/tcos.conf . /conf/tcos-run-functions TCOS_ENABLE_NBD=$(read_cmdline_var "nbd" "0") if [ "$TCOS_ENABLE_NBD" != "0" ]; then log_begin_msg "Mounting remote squashfs with NBD" NBD_PORT=$(read_cmdline_var "nbdport" "2000") # load 1 nbd devices modprobe nbd nbds_max=1 # wait for device while [ ! -e /dev/nbd0 ]; do sleep 1 done nbd-client tcos-server $NBD_PORT /dev/nbd0 sleep 1 mount /dev/nbd0 /usr log_end_msg $? fi exit 0 tcos-0.89.93ubuntu2/scripts/tcos-premount/50unionfs0000775000000000000000000000161412260610261017151 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n . /scripts/functions # if break=unionfs STOP here maybe_break unionfs . /conf/tcos.conf . /conf/tcos-run-functions # Mount squashfs over unionfs log_begin_msg "Mounting UNIONFS usr filesystem" if [ ! -d /usr/share ]; then panic "Error mounting usr.squashfs check squashfs module or bugs" fi mount_unionfs /mnt/ram /.usr /usr log_end_msg $? ############################################### # DOCUMENTME allmodules | download with tftp allmodules.squashfs to test what modules need thin client TCOS_ALL_MODULES_CMD=$(read_cmdline_var "allmodules" "0") if [ "$TCOS_ALL_MODULES_CMD" = "1" ] || [ ! -z $TCOS_ALL_MODULES_DOWNLOAD ]; then if [ -d /mnt/.modules/ ]; then log_begin_msg "Remounting allmodules in RW mode" mount_unionfs /mnt/.ram-modules /mnt/.modules /lib/modules/$(uname -r) log_end_msg $? fi fi exit 0 tcos-0.89.93ubuntu2/scripts/tcos-premount/40tftp0000775000000000000000000000343212260610261016444 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi . /scripts/functions # if break=tftp STOP here maybe_break tftp . /conf/tcos.conf . /conf/tcos-run-functions if [ -e /usr/bin/Xorg ]; then # we have a mounted /usr with other method exit 0 fi ############################################### if [ ! -e /mnt/tmp/usr-$(uname -r).squashfs ] && [ ! -e /mnt/tmp/usr.squashfs ]; then # download usr.squashfs from tftp server log_begin_msg "Downloading usr.squashfs from $(read_server "tftp-server")" _log "SQMOUNT downloading squashfs" value=0 download_file /tcos/usr-$(uname -r).squashfs /mnt/tmp/usr-$(uname -r).squashfs || value=1 #sync #sleep 1 log_end_msg $value if [ "$(if_is_zero /mnt/tmp/usr-$(uname -r).squashfs)" = "0" ]; then panic "Error downloading extra data from server $(read_server "tftp-server")" fi #else # log_begin_msg "usr-$(uname -r).squashfs not downloaded" # sync # log_end_msg $? fi ############################################## # DOCUMENTME allmodules | download with tftp allmodules.squashfs to test what modules need thin client TCOS_ALL_MODULES_CMD=$(read_cmdline_var "allmodules" "0") if [ "$TCOS_ALL_MODULES_CMD" = "1" ] || [ ! -z $TCOS_ALL_MODULES_DOWNLOAD ]; then if [ ! -e /mnt/tmp/allmodules-$(uname -r).squashfs ] && [ ! -e /mnt/tmp/allmodules.squashfs ]; then _log "SQMOUNT Downloading allmodules-$(uname -r).squashfs" log_begin_msg "Downloading all kernel modules: allmodules-$(uname -r).squashfs" download_file /tcos/allmodules-$(uname -r).squashfs /mnt/tmp/allmodules-$(uname -r).squashfs sync if [ "$(if_is_zero /mnt/tmp/allmodules-$(uname -r).squashfs)" = "0" ]; then echo "Error downloading allmodules" log_end_msg 1 exit 0 fi log_end_msg 0 fi fi exit 0 tcos-0.89.93ubuntu2/scripts/tcos-premount/30rootfs0000775000000000000000000000610112260610261016776 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n . /scripts/functions # if break=sqmount STOP here maybe_break rootfs . /conf/tcos.conf . /conf/tcos-run-functions ############################################## TCOS_ENABLE_USENFS=$(read_cmdline_var "usenfs" "${TCOS_USENFS}") if [ "$TCOS_ENABLE_USENFS" != "1" ]; then _log "ROOTFS no NFS support, exiting" exit 0 fi rootfs_file=/mnt/tmp/rootfs-$(uname -r).squashfs mkdir -p /mnt/tmp /target if [ "${TCOS_USENFS}" = "nfs" ]; then value=0 log_begin_msg "Mounting NFS /mnt/tmp" MOPTS="nolock,ro" mount -n -t ramfs none /target nfsmount -o ${MOPTS} $(read_server "nfs-server"):${nfs_dir} /mnt/tmp 2>&1 > /dev/null ||\ nfsmount -o ${MOPTS} $(read_server "nfs-server"):${nfs_dir} /mnt/tmp 2>&1 > /dev/null ||\ value=1 log_end_msg $value fi ############################################## TCOS_ENABLE_ROOTFS=$(read_cmdline_var "rootfs" "${TCOS_ROOTFS}") if [ "$TCOS_ENABLE_ROOTFS" != "1" ]; then _log "ROOTFS no rootfs support, exiting" exit 0 fi if [ ! -f ${rootfs_file} ]; then _log "ROOTFS is __NOT__ in /mnt/tmp" log_begin_msg "Downloading rootfs" download_file /tcos/rootfs-$(uname -r).squashfs ${rootfs_file} log_end_msg $? else _log "ROOTFS is in /mnt/tmp" log_begin_msg "Using NFS rootfs" sync log_end_msg $? fi # Mount squashfs filesystems _log "ROOTFS mounting rootfs in /target" log_begin_msg "Mounting rootfs filesystem" mount -r -o loop -t squashfs ${rootfs_file} /target >> /tmp/initramfs.debug 2>&1 log_end_msg $? _log "ROOTFS remounting /target as RW" log_begin_msg "Remounting /target in rw mode" mkdir -p /.target mount_unionfs /mnt/rootram /.target /target log_end_msg $? _log "ROOTFS copy some things on /target" # copy some things rm -rf /target/conf/ && cp -ra /conf/ /target/ rm -rf /target/scripts/ && cp -ra /scripts/ /target/ mkdir -p /target/tmp && cp -ra /tmp/* /target/tmp #mkdir -p /var/lib/dhcp/ #cp /var/lib/dhcp/dhclient.leases /target/var/lib/dhcp/dhclient.leases cat /tmp/net.data > /root/tmp/net.data cp /etc/hostname /target/etc/hostname cp /etc/resolv.conf /target/etc/resolv.conf cp /etc/fstab /target/etc/fstab cp /etc/mtab /target/etc/mtab _log "ROOTFS creating init_rootfs script" # make a /sbin/init_rootfs cat << EOF >> /target/init2 #!/bin/sh echo "Loading second stage, please wait..." . /conf/initramfs.conf . /scripts/functions run_scripts /scripts/tcos-bottom EOF chmod 755 /target/init2 _log "ROOTFS pivot_root /target" cd /target pivot_root . ../ _log "ROOTFS mounting /dev /proc and /sys into /target" # mount -o bind some things log_begin_msg "Moving /dev /proc and /sys" mkdir -p /target/dev /target/proc /target/sys /target/mnt/tmp mount -n -o move /dev /target/dev mount -n -o move /sys /target/sys mount -n -o move /mnt/tmp /target/mnt/tmp mount -n -o move /proc /target/proc log_end_msg $? # enter to jail exec chroot . /scripts/init2 dev/console 2>&1 _log "ROOTFS run-init /script" #exec run-init /target/ /scripts/init2 "$@" /target/dev/console exit 0 tcos-0.89.93ubuntu2/scripts/tcos0000664000000000000000000000126312260610261013451 0ustar # TCOS -*- shell-script -*- # (Thin Client Operating System)live filesystem mounting # # Parameter: Where to mount the filesystem mountroot () { # checkings #log_begin_msg "Running /scripts/tcos-top" run_scripts /scripts/tcos-top #log_end_msg # if not booting in NFS mode exec other scripts if [ "$(cat /tmp/less_ram)" = "0" ]; then # Find and mount the Image maybe_break tcos-premount #log_begin_msg "Running /scripts/tcos-premount" run_scripts /scripts/tcos-premount #log_end_msg maybe_break tcos-bottom #log_begin_msg "Running /scripts/tcos-bottom" run_scripts /scripts/tcos-bottom #log_end_msg fi } tcos-0.89.93ubuntu2/scripts/tcos-bottom/0000775000000000000000000000000012260610427015032 5ustar tcos-0.89.93ubuntu2/scripts/tcos-bottom/06start_acpi0000775000000000000000000000021712260610261017253 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n [ -x /sbin/startacpid ] && /sbin/startacpid > /var/log/acpid.log 2>&1 exit 0 tcos-0.89.93ubuntu2/scripts/tcos-bottom/35services0000775000000000000000000000237612260610261016757 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n . /scripts/functions . /conf/tcos.conf . /conf/tcos-run-functions # if break=inittcos STOP here maybe_break services if [ "$(which dropbear)" ] ; then # need read from /dev/urandom not /dev/random # http://www.nomis52.net/?section=projects§2=netgear&page=dropbear # ugly hack or recompile with #define DROPBEAR_RANDOM_DEV "/dev/urandom" mv /dev/random /dev/random.old ln -s /dev/urandom /dev/random _log "INITTCOS starting dropbear ssh daemon" log_begin_msg "Starting dropbear SSH daemon" ln -s /var/run/dropbear /etc/dropbear/superwise >> /tmp/initramfs.debug 2>&1 ln -s /var/log/dropbear /etc/dropbear/log/main >> /tmp/initramfs.debug 2>&1 ln -s /var/run/dropbear.log /etc/dropbear/log/superwise >> /tmp/initramfs.debug 2>&1 dropbear -p 22 -E -d /etc/dropbear/dropbear_dss_host_key -r /etc/dropbear/dropbear_rsa_host_key 2> /tmp/sshd.log log_end_msg $? rm -f /dev/random mv /dev/random.old /dev/random else _log "INITTCOS not starting dropbear ssh server" fi if [ "$(which inetd)" ] && [ -e /etc/inetd.conf ] ; then _log "INITTCOS starting inetd daemon" log_begin_msg "Starting inetd" inetd log_end_msg $? else _log "INITTCOS not starting inetd" fi exit 0 tcos-0.89.93ubuntu2/scripts/tcos-bottom/75print0000775000000000000000000000100412260610261016257 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n . /conf/tcos.conf . /scripts/functions . /conf/tcos-run-functions . /bin/set-limits if [ $TCOS_PRINTER ]; then LP="" [ -e /dev/lp0 ] && LP=/dev/lp0 [ -e /dev/lp1 ] && LP=/dev/lp1 [ -e /dev/usblp0 ] && LP=/dev/usblp0 [ -e /dev/usb/lp0 ] && LP=/dev/usb/lp0 if [ "${LP}" = "" ]; then exit 0; fi if [ -e /usr/bin/p910nd ]; then mkdir -p /var/lock/p910nd /usr/bin/p910nd -f $LP > /var/log/p910nd.log 2>&1 & fi fi exit 0 tcos-0.89.93ubuntu2/scripts/tcos-bottom/55mount_listener0000775000000000000000000000126512260610261020201 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n . /conf/tcos-run-functions # enable tcos-udev.sh events mkdir -p /var/run/ touch /var/run/tcos-udev.run nodevices=$(read_cmdline_var "nodevices" "0") if [ "${nodevices}" = "1" ]; then _log "Devices disabled from cmdline" exit 0 fi if [ "$(configctl.sh --get TCOS_DISABLE_USB)" = "1" ] || \ [ "$(configctl.sh --get TCOS_DISABLE_IDE)" = "1" ]; then _log "Devices disabled" exit 0 fi if [ -x /usr/sbin/listener-daemon.sh ]; then /usr/sbin/listener-daemon.sh > /var/log/listener-daemon.log 2>&1 & fi if [ -x /usr/sbin/cdrom-mount ]; then /usr/sbin/cdrom-mount > /var/log/cdrom-mount.log 2>&1 & fi exit 0 tcos-0.89.93ubuntu2/scripts/tcos-bottom/04hwclock0000775000000000000000000000042712260610261016555 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi # fixme, don't work as expected exit 0 quiet=n . /scripts/functions . /conf/tcos.conf . /conf/tcos-run-functions log_begin_msg "Setting clock based on hardware clock" hwclock --localtime --hctosys log_end_msg $? exit 0 tcos-0.89.93ubuntu2/scripts/tcos-bottom/05inittcos0000775000000000000000000000231012260610261016751 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n . /scripts/functions . /conf/tcos.conf . /conf/tcos-run-functions # if break=inittcos STOP here maybe_break inittcos # Loop over every line in /etc/modules. # patch from Roberto Ibañez grep '^[^#]' /etc/modules | \ while read module args; do [ "$module" ] || continue modprobe "$module" "$args" >> /tmp/initramfs.debug 2>&1 done # load modules if [ -x /usr/bin/pcimodules ]; then for mod in $(pcimodules) ; do modprobe -s -k "$mod" >> /tmp/initramfs.debug 2>&1 & done fi # detect Xorg kernel module and driver # pcimodules --class 0x30000 --classmask 0xffff00 | grep -v fb$ if [ "$(which loadkeys)" ]; then _log "INITTCOS loading keymap" log_begin_msg "Loading default server keymap" [ -e /etc/console/boottime.kmap.gz ] && loadkeys -q /etc/console/boottime.kmap.gz >> /tmp/initramfs.debug 2>&1 & [ -e /etc/console-setup/cached.kmap.gz ] && loadkeys -q /etc/console-setup/cached.kmap.gz >> /tmp/initramfs.debug 2>&1 & [ -e /etc/console-setup/boottime.kmap.gz ] && loadkeys -q /etc/console-setup/boottime.kmap.gz >> /tmp/initramfs.debug 2>&1 & log_end_msg $? else _log "INITTCOS not loading default keymap" fi exit 0 tcos-0.89.93ubuntu2/scripts/tcos-bottom/78cpufreq0000775000000000000000000000050112260610261016574 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n . /conf/tcos.conf if [ "$TCOS_CPUFREQ" = "1" ]; then modprobe acpi-cpufreq modprobe cpufreq_powersave if [ -e /sys/devices/system/cpu/cpu0/cpufreq ]; then echo powersave > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor fi fi exit 0 tcos-0.89.93ubuntu2/scripts/tcos-bottom/72ntpdate0000775000000000000000000000045712260610261016572 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n . /conf/tcos.conf if [ -z "$TCOS_NTPDATE" ]; then exit 0 fi /usr/bin/ntpdate $TCOS_NTPDATE_SERVER >> /tmp/initramfs.debug 2>&1 if [ $? = 0 ]; then # save clock in BIOS hwclock --systohc >> /tmp/initramfs.debug 2>&1 fi exit 0 tcos-0.89.93ubuntu2/scripts/tcos-bottom/70wakeonlan0000775000000000000000000000141312260610261017101 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n . /conf/tcos.conf . /scripts/functions . /conf/tcos-run-functions if [ -z "$TCOS_WAKEONLAN" ]; then exit 0 fi # get list of network interfaces TCOS_NET_DEVS=$(ls /sys/class/net/|grep -v -e lo -e sit0 -e wmaster -e vmnet -e pan) # search for network interfaces with link ok status for dev in $TCOS_NET_DEVS; do # have link ??? if [ -e /sys/class/net/$dev/carrier ] && \ [ "$(cat /sys/class/net/$dev/carrier 2>/dev/null)" = 1 ] && \ [ "$(/sbin/ethtool $dev| grep -c "Wake-on: g")" = "1" ] ; then _log "70WAKEONLAN Enabling WOL in $dev iface..." [ -x /sbin/ethtool ] && \ /sbin/ethtool -s $dev wol g >> /tmp/initramfs.debug 2>&1 fi done exit 0 tcos-0.89.93ubuntu2/scripts/tcos-bottom/10ldconfig0000775000000000000000000000451412260610261016706 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n . /scripts/functions # if break=ldconfig STOP here maybe_break ldconfig . /conf/tcos.conf . /conf/tcos-run-functions # update lib cache log_begin_msg "Updating lib cache" /usr/sbin/ldconfig >> /tmp/initramfs.debug 2>&1 & log_end_msg $? # needed for ssh login grep ^export /conf/tcos.conf > /root/.profile # mount /dev/shm # if not mounted # this causes to break browsers and italc mkdir -p /dev/shm mount -t tmpfs shmfs /dev/shm >>/tmp/initramfs.debug 2>&1 # italc 1.0.0 new version if [ -x /sbin/startica ]; then ln -s /sbin/startica /sbin/startivs fi if [ -z "$(which Xorg)" ]; then _log "LDCONFIG Xorg not found" log_failure_msg "Xorg not found" log_end_msg 1 exit 0 fi _log "LDCONFIG Updating links in Xorg 7.x mode" [ ! -e /usr/lib/libGLcore.so.1 -a -e /usr/lib/libGLcore.so ] && ln -sf /usr/lib/libGLcore.so /usr/lib/libGLcore.so.1 [ ! -e /usr/lib/libGL.so.1 -a -e /usr/lib/libGL.so.1.2 ] && ln -sf /usr/lib/libGL.so.1.2 /usr/lib/libGL.so.1 [ ! -e /usr/lib/libGL.so -a -e /usr/lib/libGL.so.1 ] && ln -sf /usr/lib/libGL.so.1 /usr/lib/libGL.so [ ! -e /usr/lib/libGLU.so.1 -a -e /usr/lib/libGLU.so ] && ln -sf /usr/lib/libGLU.so /usr/lib/libGLU.so.1 mkdir -p /usr/share/X11/ ln -s /etc/X11/rgb.txt /usr/share/X11/rgb.txt ln -s /usr/share/X11/xkb /etc/X11/xkb mkdir -p /usr/X11R6 >> /tmp/initramfs.debug 2>&1 ln -s /usr/bin /usr/X11R6/bin >> /tmp/initramfs.debug 2>&1 mkdir -p /var/lib/xkb ln -s /var/lib/xkb /etc/X11/xkb/compiled ln -s /usr/bin/xkbcomp /etc/X11/xkb/xkbcomp # make links in keymap rules [ ! -e /usr/share/X11/xkb/rules/xfree86 ] &&\ ln -s /usr/share/X11/xkb/rules/base /usr/share/X11/xkb/rules/xfree86 [ ! -e /usr/share/X11/xkb/rules/xfree86.lst ] &&\ ln -s /usr/share/X11/xkb/rules/base.lst /usr/share/X11/xkb/rules/xfree86.lst [ ! -e /usr/share/X11/xkb/rules/xfree86.xml ] &&\ ln -s /usr/share/X11/xkb/rules/base.xml /usr/share/X11/xkb/rules/xfree86.xml [ ! -e /usr/share/X11/xkb/rules/xorg ] &&\ ln -s /usr/share/X11/xkb/rules/base /usr/share/X11/xkb/rules/xorg [ ! -e /usr/share/X11/xkb/rules/xorg.lst ] &&\ ln -s /usr/share/X11/xkb/rules/base.lst /usr/share/X11/xkb/rules/xorg.lst [ ! -e /usr/share/X11/xkb/rules/xorg.xml ] &&\ ln -s /usr/share/X11/xkb/rules/base.xml /usr/share/X11/xkb/rules/xorg.xml exit 0 tcos-0.89.93ubuntu2/scripts/tcos-bottom/80shell0000775000000000000000000000164212260610261016236 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n . /conf/tcos.conf . /scripts/functions . /conf/tcos-run-functions # kill bootchart if grep -q bootchartd /proc/cmdline ; then [ -x /sbin/tcos-bootchartd ] && /sbin/tcos-bootchartd stop fi TCOS_TTY=$(read_cmdline_var "ttys" "${TCOS_TTY}") export PS1="($(whoami)@$(hostname)) # " grep -q " startx=N " /proc/cmdline && chvt 1 # empty memory cache # from http://linux-mm.org/Drop_Caches sync echo 3 > /proc/sys/vm/drop_caches # no clear #clear while [ ${TCOS_TTY} -ge 1 ]; do if [ ${TCOS_TTY} = 1 ] ; then if [ "${TCOS_TTY1_PROTECTED}" = "1" ]; then rungetty tty${TCOS_TTY} else echo "" echo "" echo "Press enter to activate this console..." read enter sh fi else rungetty tty${TCOS_TTY} & fi TCOS_TTY=$((TCOS_TTY -1)) done while [ 1 ]; do sh done exit 0 tcos-0.89.93ubuntu2/scripts/tcos-bottom/25startx0000775000000000000000000000656212260610261016461 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n . /scripts/functions . /conf/tcos.conf . /conf/tcos-run-functions . /conf/tcos-modules.conf # set limits in memory . /bin/set-limits # if break=startx STOP here maybe_break startx modprobe -q mousedev 2>&1 >> /tmp/initramfs.debug modprobe -q psmouse 2>&1 >> /tmp/initramfs.debug modprobe -q agpgart 2>&1 >> /tmp/initramfs.debug # Create magic cookie # http://www.xs4all.nl/~zweije/xauth-6.html # cookie=$(dd if=/dev/urandom count=1 2>/dev/null | md5sum | awk '{print $1}' |sed -e 's/^/add :0 . /') # cookie=$(mcookie) # xauth -f /root/.Xauthority -q ${cookie} if [ ! -f $XAUTHORITY ]; then value=0 log_begin_msg "Creating magic cookie for X" _log "STARTX creating cookie..." #MYIP=$(awk -F"=" '/^ip=/ {print $2}' /tmp/net.data) MYIP=$(getinfo.sh -i NETWORK_IP) cookie=$(mcookie || value=1) xauth -f $XAUTHORITY -q add :0 MIT-MAGIC-COOKIE-1 $cookie 2>> /tmp/initramfs.debug || value=1 xauth -f $XAUTHORITY -q add localhost:0 MIT-MAGIC-COOKIE-1 $cookie 2>> /tmp/initramfs.debug || value=1 xauth -f $XAUTHORITY -q add localhost.localdomain:0 MIT-MAGIC-COOKIE-1 $cookie 2>> /tmp/initramfs.debug || value=1 xauth -f $XAUTHORITY -q add $(hostname):0 MIT-MAGIC-COOKIE-1 $cookie 2>> /tmp/initramfs.debug || value=1 xauth -f $XAUTHORITY -q add ${MYIP}:0 MIT-MAGIC-COOKIE-1 $cookie 2>> /tmp/initramfs.debug || value=1 # for new LTSPFS echo $cookie > /var/run/ltspfs_token #xauth list >> /tmp/initramfs.debug _log "STARTX end cookie" log_end_msg $value fi # read some settings from cmdline # DOCUMENTME xdriver=foo | set default X driver (auto, vesa , via, vmware, ...) xdriver=$(read_cmdline_var "xdriver" "") # DOCUMENTME xres=bar | set default X resolution (1024x768, 800x600, 640x480, ...) xres=$(read_cmdline_var "xres" "") XORG_CFG_APPEND="" if [ "${xdriver}" != "" ]; then XORG_CFG_APPEND="${XORG_CFG_APPEND} --xdriver=${xdriver}" fi if [ "${xres}" != "" ]; then XORG_CFG_APPEND="${XORG_CFG_APPEND} --xres=${xres}" fi if [ ! -f /etc/X11/xorg.conf ]; then # generate xorg.conf log_begin_msg "Generating xorg.conf" configurexorg --verbose --newsettings ${XORG_CFG_APPEND} --outputfile=/etc/X11/xorg.conf 2>> /tmp/initramfs.debug log_end_msg $? else log_begin_msg "xorg.conf exists, no overwrite" log_end_msg $? fi # DOCUMENTME startx=X | set default X session (R=remote L=local N=none, F=freenx, S=sshX) startx=$TCOS_XORG_TYPE if [ $(cat /conf/mysettings.conf | wc -l) -gt 1 ] ;then startx_type=$(grep ^xsession /conf/mysettings.conf | awk -F "=" '{print $2}' | sed s/'"'/''/g ) case $type in XDMCP) startx=R ;; local) startx=L ;; sshX) startx=S ;; FreeNX) startx=F ;; rDesktop) startx=W ;; esac fi # always overwrite with cmdline startx=$(read_cmdline_var "startx" "${startx}") if [ "$startx" = "L" ] ; then ln -s /sbin/startlocalx /sbin/startx startlocalx & elif [ "$startx" = "R" ] ; then ln -s /sbin/startremotex /sbin/startx startremotex & elif [ "$startx" = "F" ] ; then ln -s /sbin/startnx /sbin/startx startnx & elif [ "$startx" = "S" ] ; then ln -s /sbin/startsshx /sbin/startx startsshx & elif [ "$startx" = "W" ] ; then ln -s /sbin/startrdesktop /sbin/startx startrdesktop & fi exit 0 tcos-0.89.93ubuntu2/scripts/tcos-bottom/60installer0000775000000000000000000000166212260610261017124 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n . /scripts/functions . /conf/tcos-run-functions # try to exec installer INSTALLER=$(read_cmdline_var "installer" "0") # try to exec installer-update INSTALLER_UPDATE=$(read_cmdline_var "installer-update" "0") if [ "${INSTALLER}" = "1" ]; then chvt 1 # launch installer #clear /sbin/installer.sh echo "" echo "Installer done. You can reboot now or connect server." echo "" echo " for reboot/poweroff exec => reboot poweroff" echo " for connect to server exec => startremotex" echo "" sh elif [ "${INSTALLER_UPDATE}" = "1" ]; then chvt 1 # launch installer #clear /sbin/installer.sh --update echo "" echo "Installer update done. You can reboot now or connect server." echo "" echo " for reboot/poweroff exec => reboot poweroff" echo " for connect to server exec => startremotex" echo "" fi exit 0 tcos-0.89.93ubuntu2/scripts/tcos-bottom/22intel0000775000000000000000000000066412260610261016241 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n . /conf/tcos.conf [ "$TCOS_XORG_VIDEO_DRIVER" = "fullauto" ] && exit 0 [ "$TCOS_XORG_VIDEO_DRIVER" = "xorgauto" ] && exit 0 test_intel=0 test_intel=$(get_vga_vendor 8086) if [ -e /usr/lib/xorg/modules/drivers/intel_drv.so ] && [ "$test_intel" = "1" ]; then # force intel driver (intel don't like VESA) configurexorg --newsettings --xdriver=intel fi exit 0 tcos-0.89.93ubuntu2/scripts/tcos-bottom/55checksumoff0000775000000000000000000000147212260610261017427 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n . /conf/tcos.conf . /scripts/functions . /conf/tcos-run-functions rxtxoff=$(read_cmdline_var "rxtxoff" "0") if [ ${rxtxoff} = 1 ]; then # get list of network interfaces TCOS_NET_DEVS=$(ls /sys/class/net/|grep -v -e lo -e sit0 -e wmaster -e vmnet -e pan) # search for network interfaces with link ok status for dev in $TCOS_NET_DEVS; do # have link ??? if [ -e /sys/class/net/$dev/carrier ] && \ [ "$(cat /sys/class/net/$dev/carrier 2>/dev/null)" = 1 ] && \ [ "$(/sbin/ethtool $dev| grep -c "Wake-on: g")" = "1" ] ; then _log "55checksumoff disabling rx, tx protocol checksum on ifaces..." /sbin/ethtool -K $dev rx off tx off >> /tmp/initramfs.debug 2>&1 fi done fi exit 0 tcos-0.89.93ubuntu2/scripts/tcos-bottom/01download_settings0000775000000000000000000000077612260610261020656 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n . /scripts/functions # if break=download_settings STOP here maybe_break download_settings . /conf/tcos.conf . /conf/tcos-run-functions MYIP=$(awk -F"=" '/^ip=/ {print $2}' /tmp/net.data) download_file /tcos/conf/${MYIP}.conf /conf/mysettings.conf if [ $? -eq 0 ]; then log_begin_msg "Download personalized settings ${MYIP}.conf" log_end_msg 0 else log_begin_msg "No personalized settings to download" log_end_msg 0 fi exit 0 tcos-0.89.93ubuntu2/scripts/tcos-bottom/40initsound0000775000000000000000000001127512260610261017142 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n . /scripts/functions . /conf/tcos.conf . /conf/tcos-run-functions . /bin/set-limits # if break=initsound STOP here maybe_break initsound TCOS_DISABLE_SOUND=$(read_cmdline_var "nosound" "0") if [ "${TCOS_SOUND}" = "0" -o "${TCOS_DISABLE_SOUND}" = "1" ]; then log_begin_msg "Sound disabled" log_end_msg 1 exit 0 fi # check if soundcard is avalaible if [ ! -e /proc/asound ] && [ ! -e /dev/dsp ] ; then _log "INITSOUND /proc/asound and /dev/dsp don't exists, need other kernel modules!!!" log_failure_msg "No soundcard found" log_end_msg 1 exit 0 fi # DOCUMENTME volume=XX% | set master and pcm volume levels to value passed (0%-100% or integer from 1 to 31) TCOS_VOLUME=$(read_cmdline_var "volume" "${TCOS_VOLUME}") if [ -e /dev/dsp ] && [ ! -e /proc/asound ]; then export TCOS_SOUND_OSS=1 echo "TCOS_SOUND_OSS=1" >> /conf/tcos.conf log_begin_msg "OSS detected, try to search another sound device with ALSA support" log_end_msg 1 exit 0 fi if [ -n "$TCOS_PULSEAUDIO" ]; then log_begin_msg "Init sound server (PulseAudio)" _log "INITSOUND starting pulseaudio" startpulseaudio 2> /var/log/pulseaudio.log & log_end_msg $? fi TCOS_VOLUME_MIC=75 # setting volumes, set after sound server initialization log_begin_msg "Setting audio levels to ${TCOS_VOLUME}%" _log "INITSOUND Setting volume to ${TCOS_VOLUME}" tmixer -c 0 sset 'Front' ${TCOS_VOLUME} >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Front' on >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'PCM' ${TCOS_VOLUME} >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'PCM' on >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Master' ${TCOS_VOLUME} >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Master' on >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Master Mono' ${TCOS_VOLUME} >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Master Mono' on >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Master Front' ${TCOS_VOLUME} >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Master Front' on >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Master Digital' ${TCOS_VOLUME} >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Master Digital' on >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Mic' ${TCOS_VOLUME_MIC} >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Front Mic' ${TCOS_VOLUME_MIC} >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Rear Mic' ${TCOS_VOLUME_MIC} >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Mic' off >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Front Mic' off >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Rear Mic' off >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Mic Boost (+20dB)' off >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Mic Boost' off >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Rear Mic Boost' off >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Front Mic Boost' off >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Mic Boost (+20dB)' 0% >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Mic Boost' 0% >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Rear Mic Boost' 0% >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Front Mic Boost' 0% >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Headphone' ${TCOS_VOLUME} >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Headphone' on >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Speaker' on >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Capture' cap >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Capture,0' cap >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Capture,1' cap >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Capture,2' cap >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Capture,3' cap >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Capture' 90% >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Capture,0' 90% >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Capture,1' 90% >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Capture,2' 90% >> /tmp/initramfs.debug 2>&1 tmixer -c 0 sset 'Capture,3' 90% >> /tmp/initramfs.debug 2>&1 log_end_msg 0 exit 0 tcos-0.89.93ubuntu2/scripts/tcos-bottom/57devices0000775000000000000000000000311712260610261016554 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n . /scripts/functions . /conf/tcos.conf . /conf/tcos-run-functions . /bin/set-limits # rewrite /etc/fstab from NFS if [ "$(cat /tmp/less_ram)" != "0" ]; then export NO_UDEV=1 /scripts/tcos-top/50fstab unset NO_UDEV fi nodevices=$(read_cmdline_var "nodevices" "0") if [ ${nodevices} = 1 ]; then _log "Devices disabled from cmdline" exit 0 fi if [ ${TCOS_USB} ]; then # load floppy from /lib/extramodules [ -e /lib/extramodules/ide-floppy.ko ] && insmod /lib/extramodules/ide-floppy.ko & [ -e /lib/extramodules/floppy.ko ] && insmod /lib/extramodules/floppy.ko & MODULES="scsi_mod sd_mod sr_mod isofs vfat usbcore ehci-hcd ohci-hcd uhci-hcd usb-storage" log_begin_msg "Loading usb modules" for mod in ${MODULES}; do _log "INITTCOS Loading module ${mod}" modprobe -q $mod >> /tmp/initramfs.debug 2>&1 & done log_end_msg 0 else _log "INITTCOS usb support disabled" fi # if break=ltspfs STOP here maybe_break ltspfs # DOCUMENTME noltspfs | disable ltspfs daemon noltspfs=$(read_cmdline_var "noltspfs" "0") if [ ${noltspfs} = 1 ]; then _log "LTSPFS ltspfs disabled from cmdline" exit 0 fi ################################################### # http://wiki.ltsp.org/twiki/bin/view/Ltsp/LtspFS # ################################################### if [ "$TCOS_REMOTEFS" = "ltspfs" ]; then if [ -x "$(which ltspfsd)" ] ; then # start ltspfsd daemon log_begin_msg "Start ltspfs daemon" _log "LTSPFS Starting ltspfs daemon" ltspfsd log_end_msg $? fi fi # end of TCOS_REMOTEFS=ltspfs exit 0 tcos-0.89.93ubuntu2/scripts/tcos-bottom/56tcosxmlrpc0000775000000000000000000000100312260610261017317 0ustar #!/bin/sh # if [ "$1" = "prereqs" ]; then exit 0 fi quiet=n . /scripts/functions . /conf/tcos.conf . /conf/tcos-run-functions # if break=xmlrpc STOP here maybe_break xmlrpc # DOCUMENTME noxmlrpc | disable tcosxmlrpc daemon noxmlrpc=$(read_cmdline_var "noxmlrpc" "0") if [ ${noxmlrpc} = 1 ]; then _log "START-XMLR-PC xmlrpc disabled from cmdline" exit 0 fi # start daemon log_begin_msg "Starting tcosxmlrpc server" _log "START-XMLRCP starting startxmlrpc...." startxmlrpc & log_end_msg $? exit 0 tcos-0.89.93ubuntu2/images/0000775000000000000000000000000012260610427012336 5ustar tcos-0.89.93ubuntu2/images/prueba640x480.jpg0000664000000000000000000022402312260610261015173 0ustar JFIF}} ExifMM*bj(1r2i}}Adobe Photoshop 7.0 2006:05:01 23:29:50(& HHJFIFHH Adobe_CMAdobed            `"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?I%)$gbOvb38oجeZN??M[$BSA)z=];㺦t涇GAȶr7nܳ~^elޫ387j7՞Fe]G+?%fm-zonb疕47^C-tU@.pskے[\Y? fNleX_{^kiu_[}տ[=Wqv> lysktJ>_$&Lpil礬?g3[tl]Re$H)I%6VS.ڧﳮ֛g.&C]^5dW_o%̺faX-鹶G}^Mm8vP>psqHDW. qqLF,yN@F@ߨFq'$_TVVQ+qiweJd[a"[dj@H*xlZctl=s[Pk1>E_[z穌~FݶXahoeb/q@NQx>(Ӈ.w p53mz5Z}[_U{$f^>Ue웭olR?zkч1E堗zWطkeSrm#Ř 5kӊ,kj{DZ7h[e6 j;^ߢja4܋o.qf&K>}t}kϳۯmw‚Fˆ&SK%N>'C36P(ɲ]W[.ҹYrrz`v.9OuU_N_٬lnN0~Z]nene-!SVQjb^ܼVu`1k55ߑWxӥ-WHӬ2lak,-9^vZmcuj"K`5$kPosZLx3oRFV'xi$ _I%;i}[-'zl˱fk2=#?K?`qNWON]2N ͮk?~z>e`bu||k3K]*L>͑ңщe?;*# _k_XTүMo]?mٔKlvmsKbO*FgէU/.c-fm'wQf훿yV>Ru 1akAumt-ޮlU«Y}oꑩ޷{fSVkB<\^*Opemhy.?*dV]6mCQo_3;7=5v}ί!+MqK`fc\IζYYɶǹoOvwM}K7Ӯ[C̊zwK^7NvWڲIURr`WC:SsZIy6vnj9XhS6:Qߤfw6]/߫_YzG=/"m_}.޵ҭO_dW  4kuIWU]E4Vk-[6=SI3"k8asKП?ufP+v$û$PEI$j_I%)$IJI$S:/ݏcZanu,EoTIIss2}^e)$I$$I)I$JI%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$Photoshop 3.08BIM%8BIM}}8BIM&?8BIM x8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM(8BIM@@8BIM8BIMO logo9-640x480nullboundsObjcRct1Top longLeftlongBtomlongRghtlongslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongRghtlongurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM8BIM48BIM ` JFIFHH Adobe_CMAdobed            `"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?I%)$gbOvb38oجeZN??M[$BSA)z=];㺦t涇GAȶr7nܳ~^elޫ387j7՞Fe]G+?%fm-zonb疕47^C-tU@.pskے[\Y? fNleX_{^kiu_[}տ[=Wqv> lysktJ>_$&Lpil礬?g3[tl]Re$H)I%6VS.ڧﳮ֛g.&C]^5dW_o%̺faX-鹶G}^Mm8vP>psqHDW. qqLF,yN@F@ߨFq'$_TVVQ+qiweJd[a"[dj@H*xlZctl=s[Pk1>E_[z穌~FݶXahoeb/q@NQx>(Ӈ.w p53mz5Z}[_U{$f^>Ue웭olR?zkч1E堗zWطkeSrm#Ř 5kӊ,kj{DZ7h[e6 j;^ߢja4܋o.qf&K>}t}kϳۯmw‚Fˆ&SK%N>'C36P(ɲ]W[.ҹYrrz`v.9OuU_N_٬lnN0~Z]nene-!SVQjb^ܼVu`1k55ߑWxӥ-WHӬ2lak,-9^vZmcuj"K`5$kPosZLx3oRFV'xi$ _I%;i}[-'zl˱fk2=#?K?`qNWON]2N ͮk?~z>e`bu||k3K]*L>͑ңщe?;*# _k_XTүMo]?mٔKlvmsKbO*FgէU/.c-fm'wQf훿yV>Ru 1akAumt-ޮlU«Y}oꑩ޷{fSVkB<\^*Opemhy.?*dV]6mCQo_3;7=5v}ί!+MqK`fc\IζYYɶǹoOvwM}K7Ӯ[C̊zwK^7NvWڲIURr`WC:SsZIy6vnj9XhS6:Qߤfw6]/߫_YzG=/"m_}.޵ҭO_dW  4kuIWU]E4Vk-[6=SI3"k8asKП?ufP+v$û$PEI$j_I%)$IJI$S:/ݏcZanu,EoTIIss2}^e)$I$$I)I$JI%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$8BIM!UAdobe PhotoshopAdobe Photoshop 7.08BIMHhttp://ns.adobe.com/xap/1.0/ adobe:docid:photoshop:2168d4e4-d958-11da-ab42-c6987e71b5f7 Adobed@P     ! 1 A"Q#aq2B3$wRCS4%789yb:csD5&fG(Xx !1A"Qa2q#BRb3 r$CS4%Ⴂ5uv78cdtU&DE6F ?`XٺLVͰ}_F`~[Ͱۋ?"f5ߐqrFymm!R̽H c,v;~`Zuw4loZA?a-Mf}29 ZRm1$QXTφi? )2>z GGck׸5eŪs+YJgŝnQ=elcŇ 2KCiϥ?i7Yꩭwf9fƊʬTD.HرQ(hG+&'Y:}mq(.;i=DCLӮKA[Tpd@Rq'YP`~umW׋c)^bJC.#(z #fdA%_Q?/5Mpd s.=@)>Y^%ų7\%'v0Mi2> -,Fxa%Esh)8̀@=Vgϱ3ߑϏo0 "L%"4YdZbgɤ̽@x;2ld6'P쫸ٔ#m བɦ9JI'`~=|`gu*dq;.r]uA ɫ#ə-Sr Ӟ܆Ҕ@0 ~Ǜf7G.> qXʒ5W!^bvC\N)I `KsȖ7}_k[מ5~$_ȱPeC)RTq !"Z`>2'EEkX4jfcr 1qR [QxXАgcFA}ycX??!N)(BT)Bԥ(ςJRDffg/^l/lrxM#\.> rf@ >Sc%+_e5u+lkSÈFj[BREɘ폎hȏ/kRpÙ._#I9BIO⇖٤ :U.%n]=g5niv$-$|pYI#q,ʹ*O\h%5_˼S1; GU+i^8zh6BIL_嫪}viaKqMorv ayKؽUaYmMu2b!M(Z~}G{GjutP9l?[yeY݌oXiBg@[S`II$ÐөY,'i |ƢT;KTyiB]fZޑ/\t$SB6qnh;U"27l]D~.q)τ&}X~4V$}{3 Znoƪn'H Le4Z`JJl@˻ ?J}UηˉU> !=9IaT7md*c~Oh2Q %kEuBb2^9yI[oϟ(_gG#G*g\+4U9RIFo1&RT侥_E/wGUMҫ }_doɨ9&nD0jg Li;_lSrKos"b |Wj? DG}@|_}EYa6FPw6ʾ9XO8O{c2JTϨȼC~M҂sΪ_?etj4|J_WOԎ[/ n%Ɩ| r57Z|p7eŗy7ѭO碚yGW6̡Խq[{FAE̲0Q;"2"%5R%}qOf^=n\ZrUʼZevZ_Y%7|)2ݽyY얙|b?-xtX6?0"ujbB3ܖk0ݏN8\C1rWs%jL7Թ*FJ 1{W6jYFm~)/vy˯gۯΟ鮚d6VDHv'?&n2d-1I''sHYckO$<7¾̼̽ţ`I'gY~WU.ӮtO*K_A~;9.h9L,mXF~>ꤢeDDrd(ȏ/ͷ38dydfڟZpਯ{{?ڣۑJ!-9w"豯>qq+%s䟡 YXʋѭJ6D7(=}LUJKp֨G'Ѳb$V*ݝ֭V q%vUiJ/9 WNKF5%.;d_{uOO1o_yk}l*:#ĢMy:qN~KW0œF/y \5f},ޱ\^eHJfGˣV-.xGoOi˶Hf٢,8Zp~^OƿGWYpJLlJ&J?.L4:%96u2D6Y@ؼ<!WZbvmB>|@tSzQuhi/>y}V=԰Yf&-orԯ`ǟGjE\ZV&6¹ۛWfm\K/f̳Oqȶr+Jr]Ƚ @m~+;s!1=sfi/dW͋-,-%.LmoGM˞e><>ۏAn3m GvF/qp=(qK&V$Kj\> &2߯][] :u3$VO(JK!c)5# y';./k57{CPŽg6_gkTq3l=IWF"$J%ԧ&]ڿ֯s/}4}{0~b cXs 4y/%c7QW.%[.6_<oGUs/~^θkuNV}׸A'p-;'Y>/lKtT'm R|GbtcDBL-6RDDDDDCmx8p1⯅½~''6Ċg\,#ҞY'Ajk_(ng'#qrf>Ը̓+ %dp^Az̀nGR|T.S26ݸ覤fMxLbjq[K. &e)ADSkЗ?c̝Bmd=7Y2tfdM}-2?O/ >O\ôNtX4 /~_/{қ1~r%%E/TWVC^NJx"#) /B3m{ 1ֳaUq_J]h\vظɛW+/o5Mm-ijYGhu^/F\c\ơf IKKh?_Ŵ8\~#I`~ ᳿`55_ol_/k_5Mb<lh2_^剎%ͶU-z4YEve淰b9&!+INrBe,2)K_ BFfdD5Br+86.6jeૄ a)4C>}͛oۑvhBl%jJVY7F2oC?k zkkjh1 q2 G#JLT#G$_A&A:,ZKuvw8j˧D~zLOU|8oGl74䝪fzSR{C!tTR]Y6zvj> $VQ"7s۶vM%vN0I~4TeMC&ޚF.O GE;+ qZe2ž> Dbk[HZʆ8.COJB-ddEJ?O{#܄z3ט:>X~@Ivc PGLԴs ȌTWIճPvW]jpmj/M[6V#şm=???eGD}ѝzzo!wUXIJO,\m Q}ɧǩ`s5%ӝo7kwWsus,|cyvK_C6!1&qŸۄx7_z ιm-םƫu_rX˶G4mk WYjj\H*Ȉ2#q]8 yeY%qI=9m.)p֓ӒRs@iۂKtoPGI>Uf#QVK(NyB2Qf{|9[_t03G+g]MCiB`:JzSdjC-inA̶57,Up]k]FzW\wŮ]TBi'(wYNI4kk=ֺomVfFi>f\y' &:mPD_o2dM蜚kNإz/޼xfs>.21`d(WT']dW)H&epsXu&b6.C:➒)I^~<ӵCqnĆ|,T?y(عzKNӮO2yW<'^F CJoliIE;''&6r}ݺJM)R5 $fg^D ;'3slXPNT bǫ'cɍ7Y/erȔ2JzˉQ*%Sax??FYzCGӏeYBuQ!mkq$ p/t]sU7_i<(Ee_*ro$Дҭ3-j_B" /n{Ga]M5qc=l|WMQy!3i%rTx|KiZl['޶=#x;\Vj1K_WW}ʋ&{حhW[-t}7MLOզdSy}Th-=ĮͻE2꺺HvbMOO~3odF5pf>8>??A7MFZI|UBzXbwVY$\+ղጷ]vF0ʬS,2ĵ:.W@&ce*2/D4F~Ι5s-C.ݳ֞_boO期0R"x~]丼SǜW;xN5Rik`zv .%oB=Gdƕڙ-)E]ysn'╙'MxwǼɻf͑WN씫uz\~ ד >AOl)BN^*O^iOۮJ1OEշ?N<q8ߌ8Nۏ]PBNCiuz&*KDk}͓j:Bu=cbQdza5IH͘ķ"y2#¯wȊWe5"kױNjNHt5ro-s)qlr+kTb8%uTqi)b lys>9̖8d;yw.JVsFQhO=)qwr[gݐSx60zF[.7$~6dD>|m8}=Fۿ{vսo9zu/N2 &NܽIefzʸuiOI6ɶ}Yu,7L;849.Kޭ+[aHJ˔*S6pߵ=xxyMI}5v6^Hû6n/ ٫?5F."fmnݿ}Q9n-l7:Roec^+BOĉKn|[Cn-$"Ǭ߯_M  dpuXQōqI(-^xO܇Mz.\aj@ailȉ~ןC59^qlwS^,G\эv_@_:m--Z g3Tӄ?DxZ[.m:_c[Dj"5~b^LĬf+RiظwJRS}IyˏC22?~eH&4؎<*3(2#YuVۈ## >.GI'.diUy\Kxu+QcS˃@~gONb173Nn}S1lU5&BbhCh"S \*i{QKZns[a)Z C30qeEzӼ}Cp㸛fdcaeW/ax~5{*ֺvs80[ e!i\_O{=]aTzwU1ƅ%Oxz-WꞚwW6&ܞDs^ŵ M]i~˄P/qd mq;Ŷ1n>5.Ehx_/=& VM7UO|oeJnUv5u|>d*R{$;nn>+*ȷMdzP׺GZ%uZ'v;:g2|\"fg+RX*„pj\۱-)uөaH<=O|`մTɲ:wF8Ƕ 윣jn}Pi- p3͜tZ$޲ӯlbk2qvq>=>;y:3Qu;0Ï-Yr։pv^O&QAi[68m%򇄼Y83y7Jv˵|eZ42JQrtVxw䓣]jRk`CUѶ=ўv WQX3.;eԸ}-;j1(B6y,>nnHi&F;9ʒ.6WޑB5LeS{v{/8W+#.տjNUأմ}5Qo)M!>N2NlSpǭVv2#k`[fiEE Wtв[urkO ³i8ʇ>pܦr)iW'[M7 JYW\\kȎt# goH2׶ȯ5%hL$GWoWJKܝSovTlv%g.8ߊlcS ^\$̹ۙ)JRIIR$)"$$\Gܟ0}mGItDv:w9,URMuyaU]7eF;U-䗪 TQ5N]q'U5_qQl2cUrMjD> *ЋZ^fmj#R>G;S>e0NɒmHK-ԡ BP^JZ )"b]{I]mFE7)7Ium$$`yዉ\ȲJ1)=croI6Dy/b-vgE^yOq%ټsK_!Wq <5yD{<'eSAƥ;?|xY<_Ou(e4\mRs1Oo,޹dS%UW%Vw^wڃSPʍ(phGʏI:xUBs|2r8yY]bbAJaҪ:ږܫgJGobrQڱn%[cR%S.vUlOk.كNDı^3\M Zl;--'ľl<>༹'rmS;٣f4l=iNX֡^i?oxKf%yMgoY+=5镏o]]'sأ-_r;:fnˋ?Naհ*Y+LeѢ4[IG6b9nݷg̋jRVJUܔj)v௸O dzWAA p3$_42|$􇔷Wf3F߅bՅ `F+E6-^Y/9߳7.ޯreNRW0a${mFmTc{~r.&52i uDo!ZFbGl;$hvǤk.R/.rqlܲ _!ð_* ٘^[m)0"%$Ǟ4sfK7shUS+9ǖ~W\_ƭhzruO(Wj[\lgݿg]Wq!\]$IńKl"=l=xQ_)~7rm{oY2s!fK/$ _`xytȮ.ym|s%8N6d-ZS?B}˜fٰ|'!V#[IA4 & 9';7dOG#6cX% "T `͊&ܘ\y,8Dd~2|= I#AòFS [k]%2|C;|Yz$$-/G s?=Nrr䗖 W-̛%6-3S2Zj4ԕhsW,J˕(ȕ|Nv?Kjo),-d>}O}jw_XtW^vW[⶜9ҵ),~ <:WygY{eO3BMYM CRl/YU!~V\}vo-Jm RdE–(0[.6>ݍ)Ysp\ZI9Y-={SGOL/l>N޹wx_ƆNU^*2SFMv󃅖}ڝ^52~\ O.;q1k=l%e>TMkVfFdB&=iwsڱNIunJ7\nG_HHvM7_qڏ?6U]+vݲ_UJ޶_dM@ծIoe}y:Eżϖ❑*\ ]qj*?B. % \l|,zq1jPǮ*1]?>r]s}[eӶlnSɽe&/DI$'~=7NYeHkj*![)H奴$\yj67Ft] c{3IXjko+]U;==0﫮eZ5D$k}!)i9-նr 6_66U5 7}wa!yxx f;$ 6DД$ lzkmlUϳf1M)Ty[[,1+X>iiqyE:\c>!t[{{n<]$̺8>ZuIz`SVw2F>Օ -}E4 ><-מujq]qFqřn-ffffff|R)Mͽ[}[oշJQ(ɳF; ı6u.`F5NkҕL{h'#wO$=H qem JI>ZԗwWKTk'Ǵo+ۿwcR_8ʹ8?eh{wMmV]+s|+95"밹FB9e>m,s5?wCey Zݦ>jL%%do0smÕW%N~~MYd+pIEtyb^˿+11J:%7٬.ԻVuB`K;^7}f "&_:OI&ĕ/5Sp^mȸv YT^/m};fl|}n׻d63arкݘb;mAUuHF#KI&5b0vN*3iN+Z$Gϼ<-ƳܭBjN.-%Om'58٨[9Y)&M-ӣzkխzp1q162M>W._~-L75vаڵ!.}>-8/SB}@3WǨs혏M̡9n3m+.ڢF1x#eNqN^]Z8__Y(Tou܂7*:}$92s˟%rS&}K~L9+Sg0s_b27WF'Iy$\DkzC?65)GM7|{v圻w`ÃMń"i7NSI#!<6oxcr;ʺiƲ?k_59I[,Z%nMmweĩUQ%+Ӳ=,M^FNxL%ͷᕾdA$LXuRҥ=?Yǀ;/0ò3Y-M)Y2zDMՖ 6q$#Tdidhul-iH+%"Iu/OSc*llTV֣+^RTfZnwd_m^:m39{E3psq#8(FWӝrs2_-ԛjX4y=ՍbBLF*S2=ڕ*2.Lc>ێ̸7;o#ʡ )R(6ޖ/Dx\]U𮪲!9JMF)J&.fix6] MiYڜv{ȉ[_Uof?Ҝ#qq[u4+W!瑬R zEtVJ-ɥS#~@3yŢܜJJi8)rKWKW^V6PC]&qTx'gb̛]ҧr}35+^|SƻM{o{'us5tzh r/unJ?XHjdPӔ+B?e_y? ;fhS{z*q҉8>55V>odOdw]~.szxJ\ ([wN>ۓc3zZƵÃ,JG܁U>i{V7@3WgW*Bg1;+Zᙅƌay%!'B2dZ蒧ϝ!aS&JZb4X!ǤH}P$ԥRv'W{E.~Aw^,ihsʨY,lS`eqE\LZoC \v6MdU{fݑcq,'SMu\䌽oI" 6,릸ozp+5(^%\ cW b؎EE6BXBAldiMʶ374w鱣v=]VN^T嬍*K>d;~gxJXIueBӶ5oӷO͵0ɷFL_㮮QFchbw+|8<{uMeke}u! ;9[u?TY_-˝-5 1ONeGAj]3+Xs]nTbOOY=zCSf^VTzF"lJnuv-k9wy<\KgmovUtI8-uil|Wb{^S "7mq}wE_p  -*[ Σp"&`բVt0Y+U !O(pi9=mFBWHNu|s8|s ;grvTSo٤d8ɒy֑xWezL1$&&.4π:_}ZXF{')nf#uSoƴ\M܏VOsnCo-.UT?rF᥇wT9'WOkz GOH>^l"iN=ƻե8)u2i͇to^L7%J79OFRKMFdOʹoϓ8n^7b:dݑUө[~TSm /g%o[l3[,Wu2A} =妣)Rixܧ#!]UŬeK%DfF#nμ7NWyն]b8pDĪ*lxN~qT ᪌i:g=[l\ >5wO#?q8egNWYU^yV[nu(R..ږ.^=Ogf͕܃}M 3 i%<>#Ƿ"l|frrg*hz¨(SqRPZ3Mߗ/ܹ' { [eJ(deU^_c"MV(7-jmƭʶ݅L?e6SMyIb 4S>A RR}[<7"_6|iGD)F>˓˃q=FٱQ l:ԭqqjSʾ7)*9JrmX8|yprezr~k-V4¸8qN/ݟp˄)RSdʺssb&ߢSӺ:Ŧ&_ܻpv];ѝfN4!j l#)/mʾ$ҕߎGuc.u*sZ+:V$؉o~Oy(>ah'ޣܞM:N~R_WaFI1I2#JXa܅yXdiKd%k}f>Yd")˫rRm u3G5USitZi8ᬑ8&&-l&*1dQ[2Gz2栗sz pgV,t 6}k;YM?Cdв>H*G_?oP eUIV;bћ|/:Ω%PwnIk\[Sʯ vm7^;K#LWW%C |}?3:G¿UM{hcGUEfAf:,j\ }u$ܧh APzC]a=ǺZ&7)퍈m,%[ԋ+Jl4-]TyV8d Eukeu"NSe6 -9V5 ݯqh1FmBd '@=}W> hɲw q5zir"(4:< PuH~~Rq>4~0W?JN[l}ok:85>،fه8s{*^↽0}ж urvHm>.rV'ojQF\,Tχs2~6Ĩ.%v̍J'O컖Vo[Z#L_^FrG]#:ۜP~hط Jq-G%)vc_N)7$E&cƣȡ[jǵf>rf.ؖuUp#7ޏItcSKZ|R񟶟-r x۰3#VRz>0mhREkxediLe''M(Ek묵ӪL5IӇ24Xtdl\e0m? f؎7ĩ|n>.xw3jM{wEFRV#. &b.;o>V+o8(zw%F&|#35%.zvyb+amΆ9:L]]9 GRDe1/_3;zȍ8TY&WnM%u6o-o%%dRmIzmj'/Hu>w1X]rK%]gSU`ɳ&]k6ǥd/2JA>W[~n ;Yc8B~웊oJnSJ:)qDZemؘlvS T%OMiF*:pp:~|u#ս0fĩyey=Y,3eIqBvyGl59BZFC="4W-?P꜐믡=!jvC%{ο!8Z31Mj۸õqUcB]qPދoV/jduk/ϡz?bAsvIjk/.ȔjgImCc=[?ARl;emLeFUS5C8x?+}Dxx4Ɖ`ht9Vdk׽9ڵoYt&F<^ƪ*](e>lR1UVRC|gV_u8EszmÑs%^lqJ2OSlpT@t^5h]c|gbǯ\r\Kb.\jW@04V@3ҟyL%HaNl|yYi_$pGǧ 0eo%J(Ӄ騯mIEⓇp7~ՊQ3b6GiZ(RrTo)q|y$D`:fz00f\HUYbT~.HҢJd|09v۸LTd%k+T3"F[^s ƫe6m4dWv2qr\;]d[ט|i!\UsN?RՃ. rLV9.2MqsqZN-n$92t;Kn.ʝa5ːn-J? Ȼ37&˲쓔99R~RnM[miǪ1tEi(/%KG:>vL\wVZ`UgmaǏ#7#;)3P> Nf?p>Yr.J5¼glelbEآâDŽWO#'ey2zU)U~ Aۋz}J8~~oLmZ>cK)噚qjZȻ/3"˲쓔99NR~ۓl4N=UEQ0ZF1IE%Z$8t:Cg5Sj[gQRy%Sc5ffD˟C7{p *Vٙ>ˏ\ӟjOv?ϡR'j5r\vmePDucJ2f?ԆߠM)OROp|mkW5 Mtv2Ϗ.,dsoL\+tJ?RԓpM8 \r̭kƺEk$BD~6A'(OusK\'1%qTMyJuAkpU]o&>x~"d-[r]:zu?sWݳ/{ǣUn+*5Cczso)BKGԐ~VMtMtnƝ|OPRE)(?LDZ`"|ßo.U*b-1Ţ߽m 5,#du(JOkr_&qkKmL6_ ;3t$; 3.۔!9!]h 72jtdYM1a"XD_R}Mq~F!lt'K"*4?rYg\+nl򤻟_-%sz{AOfQ 5‹=Fn?I##Ka'МIp';r2ڜ J$0%j(ς/C3kn1Fl؞pjS&>^Tv_ߛƤ9),e^E[|Ls<<lOhuNRͿYWSKO y_e}u6&V&o_;|z-mfL( ÓGI ^k~ xd~!3_= SScٶĻ6+{]:[k5eƏRR?:t֣N7s{ڗ&93qھo1JD \~ce}p;Gnf&7=>s UYR`Ayq8R Ȉj({CEoH[b Rey7ػlYp2:,''$q˖Rka&DI 17n^ioͤ;IծTg̆}iufȉK|̡Mx4-sǡrC"W?LO\3FV}_"? S0eFdI0f|VBBL>~_Ñ.M4be\hy%0)~b"1S595fmr}u>yV6kʼN:Lme\vR#M=?Nd Ƙ}s/O{p7Ink-vկT73?(g}?c%O]]^bm?E'%s]kT1Y69 gcd-!Z$nyK'jY5ޟ}ϘY]KMڝTbz).bK:x1ءOdkvim뤿z ~1\m C*}&ܽÔzΌDF%NέQD/Ҵ:i8qv;X<wĭZI=aFguuۯ]xt?Y| %O[Իl:"llU<2c a/F)D̜VԷDD\KA葬5)1wmmP6#"Q"?OC$^+gL=wYD6˵%)xF??єU uL!J=A؟!=}t;Btv=x}rrօFBA_ ?,'/W|xS*ʾ㓮U`S']5iGP_vDZJ)O#v8^x4c1E_cq*[D&o:jZԣ3gnٛ+-NOYNr~RmHI%W*ZԔ)5)J2JR*R|$LS嗰ѻWSm[)Shl:r0BxHl qF<#}zm-MG[+.Pb(3#k[!?dF{/N;ԍrmahnvhc\" (5Um˲VfMՖ_KKAf󤗛Kӻ Lĺ4+pe.ߚV.LR/Ј s@7yt ctJ#*S0FmNɛ:A(qIn).LnᇷTɍpm%}IH:{wٯɅr~[uwNg+NRclt6Ff*u5vm>ˈϔ4䗛IKKZ2W)!y_츱&o䌾1Q]dީ'_ۯGμ_kovuQe7U OIi/SQm-[i\(U~;z)*=>͓r݆S+FjJ?ȑcejdg6mmd7QɨQ&i^%Ym 3"+6:0ƸI)RovȲVVnE޺//H$`HmdFDe/?c#Aqk'(JUc֫5z$2ٳ~^]8hQR]+q!`g\m0jkm[w|k^Irq[#JHš \'üfS5F}}iNsuqdJ{tJ?7igWei`{`[gvE4;wc '*Ɲy0~.I}%>^ㄆ(כ79OXEKr= _E+l=IwIF2jTõzY+  >=[&% mmE7Dm:H&ƳȭpX]~RTd`qR)kRԥ(JR|JQjR3?X6_wgsv#E4+O1=wGM(^['/Hs͟\ܿzW[MQ|zZŰ,Mtj5X K(ǣE &e*(^> @ݼL|tQgf7j{jJEHO<9J^8R} ' R)JMJQR> )"Ёm9e9F1roD3׭$ڐy88pGE|逸nґ8 8?'bl6Y5.תkT]?=gͼng'fZeڤc(9ag: ~ΉTP5$Khp[Uɜ큣^4J[w:%ʷ[dwC2zY|c^]5=/S?lm3Y\V]k}Fo|m 5|㉏}S4ʝupM6p6OI->LJRdnPdhѯYk[_^}}Ӳ? o"tQN~G 5'4WvEF_EiҬ&ʱfΚeʐ꼜zD]qj?SQM5c]USRI%ItHGqܷ ?/tsmܯmesrm|c7s>!SޮDucykGhINIEY*>ϭkŴ+r@[Q,m+񏣱eRt˪v7<#~vWl)xF+`>6 KxR]Tvn;Oe/FS7[*.:۳3Jw;#z5nξh-jjtg H4HҌz%$}XcQ Fx6߹hR/ezo*x$ ׯ)s? ˃#>HǸޭ T.x~*3tTfx؟N6|4ix><̿hۡbzǩ=`;>JĿ쭂otry\}W?^#'"y|./V.gk#0˞?-Vqk=zVT=>z|j)%>R3Gn}>CoM<$fǯl8w~]kKyYȬUŸƲ^l$(_ž2_/*=?uv;32Ql)oOobf O a'zv"ima6nAe,ůˌBimH!d>]ZA8_{1;n"zt+rB2jV?0&dUM0nc7554+4R]tzzk}^\Ȼ7pjǖ<٤eM$e*zG ]e9'>)F5i`Pf d- ve9]RLuN1^n6n,10EښU KB0p m9y??Xuf;:뱸]fmFҘS 88+^;ySCN:'Eu&WŶZ'r#S6N`˂rTdv o_3«zr?nO>>K-?0>F;UٶrTy6ηCG]ĦJY>k]][bDRфLWf &<)ŦB-(xu%\)DFk:u-;{U~֛#[fx=u¥#Y=-\kO87 S_BhZ DfnLMۺ3V5J;3ELTMJTQ$+04qp.cu.ÚX_pkUZCeF{y(/3D"/c̸q}XVnCz}rr`%%;Z^\ZKeqP`Jh#$<6xJQ?H9Mȷ ' EܮkM&[7+Z.Ƈ eē:cf$6%BɦBp GFB6[]0YV[i%[Y0sw,;o̞ Nr6cI~kdP`Ƌ zښ5g6vܜlL}hJ|\qY4SOH|iM};M8y X̼֥ML̋Q#2?-7xǒ_q 1{1_oܒT=0ܬ˗mm~Y-J[? tm3.~$_&u$ikFN/Qk) qͶV% n^JGȆ{n;DwZۏj\ZG|8+֯ ~>dC/[KuLٳ쾣tU%8nY/%gn#+S+aS$9oƘ~4ЮHӅ7n79'%aE!5}*OcȐqԂQpdc]W-,<}_Ʌ=z9[$wY/TC_Ԗy5{k̶58f5QB&"$DDKQ׬qrl˛nSrmIܒ]+Drno%qyzRPnIy%\ȒCKΨ„y-_U/ 5Ҍ^˷;1_4<GRORZ坄&2IكgS4hߓn|l>mK5dazEg\G|ߟ#^W<0l#Ϝ ?TAU=rtLodr-X,8DU3_Z*O {֌SW3wpf e=RՓn96Zk4 >=w{\he*~mxW%kIv[&&i .z3&;fD8f\D2#kߋb'P_4̀glquo,ͷ97Ԫ]j*ⲒaۄIJ2 ũOMz}&G΍ FnGBd}>;fcgMvؕYR*ۃao:!BZh{޶vr|N z?uO|KzE숛S {9Esth3/RźBpuY&I~| mSb;uv˩zm9{=ט@{U_VUɃ%t ÀXσ>v/o/yvmh7;3k}oZ-ۘu`rJ#q(MKy)a2cy5( 5=OǮ( nu3%Ȯ+T6lG[l!}U&ZB#<'Z`'Zkk(P3 4q&⸺삞UEMom4:Ю96m9ٹ\h77z*c Ց WusSlzjI5m$7~C۩Sqa O?wJeQٴWoع5adx;jS2tza,9RBM.w}uv_^ur8?pŭ[^b΢pVa%dbS#ٍS<JL#yK޲#hifFe^vG^_5KGQFdϺ2F/yo.7(wGL,/OFGǝ@ ڻCZf]l|v<3/1yLj%?Ia,֒32>L/O~n4G-juӓ}&nISpg$^}-Wӑ'l!.'bKba &` yoqhK1WQ%r $5ɗ,fnR{lB#mĖ~/0}?+2zQ(k(d(5ڈ wFN0Ec?y'ōM%ٌM+rN&>QRPn/Ii.=,XvGGO?~l!3Y/t_һ6,hkK-O&se:M{5:Gf͐R{4T-Z/<m|.22ԎO5NF-Q`Gkv=K7{iYQtgflC0^Q+[cbIӐ 3ꥷ,rB^N-E^R.r.v~tתa=-S?aQ|7*x;v4W,]ZY?qԣ w[9F7;blډ"aX. ErSij$Ӕ;s1vlT|w7GϜ|a[{P{:dҗz|b@DFqS?&=+V쉫ɿn]եq߯џ;]X`J]׍7lp2 6^RDHa$1%5&;iĩ RLG*Qo+ijwRaKYvUNM[M\^ڍQ nr=N!sS57e`qZo@Ҙ1ɷʭZlg'JŜvMIjB+l`A qEv?Y>=vo-gHwR"/ە!S#9>"re|~>. ullZ:qp^nFO/qAdʫjkW{IjϣT^dMZ&]m^WdU+%L\F&3SIJZýG5!eX/씪I)845tz$Yu<^?&z}MjZE"jesK\#dn#q7'o;]Eó?>IW-yL}7iFD4 vL,ko:J;MU9rGy\kȡ,/._.Em㨷#){x}HUTی2|Kz<"Lm/σ#eȇn~Mv+؞*O%`Zьg jjiUr%.Tʓ˨%Ā?ԥJQ%$jRԥDD^fci%zu~qG;un°&)ذZ2U2 kIJaGcm>-ėӎ2ٶ=FQʲdMk _V=7}:ZW8'ɘ Č\$$Z.<;7dn l= {'+"R4U''r(º Jri%Xc2,馤erij9JRiF+WMUk^K6];W^a!f\+QiD?'[~י['r#v5( |Ej}zJ,l&mWCpmjXi,/=<î0g۬M:ڿ *Ii1\g$4v=Wt^Qn2OMh$Juo}/WB|qJZP"BBQ%9˺yW妲I-[mIuIK#C?׏Տo޿zW_w'r/}g^c뮿 :?K>;voOil>+i(U_:[$#$z%(b3n:?}.7IfQ ZEyUuI}s a+eDSI@ 3տkODg‹YD;ga4n4d|{2kj,#eq34{U]^uKNRѿo2nEd?4MQӯJOVpF~\z-쟷k8圼Ulh7U3v 5Jr`T/7mbG/B3W~ lj6wS"Z;Mjq..qIs *&d @mS|(阰,;wۯ3VRN;cLe"A-3'/dd@HaW}W"S.̛or;6\5!^-|" SAͼw%jmEE#dZ n@dTWtU#Fv)=Ut6[-sm\ llIj;)yk|4>^Kq~1{_vD|^&m=[q2G iE%`>Ab3miD͘rxxZh?Z3?O@d_dxȳqu!6L=KZʉdH~: jӛ5SSg:kJJHsǨ2紤lub)~&e[UƉ! JLҦ֤3 ?&w|loNNaچךynOɳ|سl2f5]Lv{2Q+[_qiIo[ZcW:;rY@}D":FԨ#m_hQ{Sa֊5Cb۳ ( zsXdqj؋ *^:iln4 {j~|a$FW5'a5S v=e m&'u_BKF&6.> #(WZPIvM4L֯O'gwv46`܈󚬶>6NzŦȹ(qV#$v;|17 7n{u~FNV%J~7(W>bʍ|i*ٵ$:dwk7ֽ}дV:Zbe9]=\c4S񟚘cs"lI(y| ӳS?̛ã!eXMNW;/Nm%g%ڬy}}VLiwRalu%;'ܚtaZ#_֟oӍ3KqmS|b{GGRɲ}uZF'[aK'Ql$[oJLm6IA]A_Tca3Xn`f5ʛR94,hkką BY*:W(8ҡ}T}E0ߔ&뤱e7=ZB<-?^;`z'ld7jؗP7)?U:)&% z# DFq 9m۾^')o̶">L7p.6uJ;WOx{rShԢuw%9'Bgi:iS Yn'>yX#*1-kW+ U.\ ꢲQYJ[$m CcVNe}8"aN.D_!nǛ>kMo 1~wSUmsL)vU99*_O|5;vs-hnǑ]SO[5b].}ҮNhWa&׹^Ōj>d$j3Ծp)<DjT eeZʕ#A~5:e"#n&6oΧj x>UO-CŜSr_)8&X[G M?q9d[%pmi˭oI$DY\nf=tͷҚ>ͱ`f}4'ڵ_OU!^q5/Z1 Ң93wj9T1*r-8#JKOٕS]&ȸNf+oԦ-blrNԽ5TF>u[&XN"rySkʌ ۔9ZFqB$IvA,DQ/&Vܽo8{&^4.6UR[VRlPR23\m97lvcʽ]s(Nөuh}sӺDK׺#ֹ=8v6E&MeG}U4FVlW2{˹;;gɶ<[e^NFmImb NUTԾcd29.ׁȷ=nu*/UcĥW\~Y8Mڦ$ }_V/.xyԌ8W6NEsvϺuZPoXHqF,~=];[ {vgȕ1fX}vBPOB-%_)vܥFmJo(k )h2oaj=Bmo&޶i.˘bDk +m։捷m(tVwܱ3S6FuXFʤ]˶I=/|dx<-hN8?ҮIkTzE5\v^عv Jxy1v('FZcbWۑ3%*$z%CJ7(vN pi:f)9E¹(eaU-a?kuyhQѸnlv c֣'Tj75Sq-'Tw+7ϲ݇FAd㛂6҄ `Bd-"#v-Qm?rsǯ;lx3݊Y.+L'Fd, 5|_h a00>跱Yn}G7cgSՋ=Z)i|^MoxvO1Ǯ9,\k+f4"QK]&҄`o$wn?CbsuBx;WjI٬RROYf1,Fh;:︶kz,[:s4 K5·]ęX8HZHUrL}x1vm73 Bl©ZF|+MhM'd|λ2շJU] r~n.JUq]R0<;ϵ2OuWf;kcdQiKJTKSl]aSWԷI[L4dDgsa,쯓 T\KJolu,'q ?;XG%;c_. giŵ%E5$f'd;?˥?+2só2 SɟH%՗*3?JEJRԵ)J?SRf3 <ّ\(ʹ< v}kc=^xq^ڭ.OnoUfwlg;#uknll׵ {H/&ҐČ7}=Zc՝=īًETNbz%KvM֬<9'<M[tj4@~7gG?&Lq5:'KV -0fjGLQpF?@&@_`W7з&ImWfJqS)d"5z>SaO{]Ev3ul|Ύ=ܰf3?C6%fRh,g(洶&SdRs[Rk#JkJd`Oۏ5RzO3y䥷jV$+uzN|30_%hfe۟o>īf_SfSi5fG~\.&ь3$i!-crd@ Bmm8I֦֓㔭 4'%(#Ċ˒%J}јi&^},n8∈}}uB:=S}O0Mq-q*24 K\JM]_-qgۄRM%)Mˮ0OC[Y}Rj%EQ:CѴ]YTEh6ɖlC22~|{y32st}]u4WZUZWIzm|duY2q Jдȇv>FFExNqn2ԣ(hԢiQmU_U]\gL(qkF}kOiٮmٿ=5ACnޙH6E?W93 `V"])ot3rksm8IN%Ee.k.&-G94+W"}ҿ]Fբisxv%Gk/ӚG>ոtՖX̳_g%KH$fXlKrq.E[VNİ)ӉT?M%;>EKܚJ0][V~V㛟ffzQ=c]U媤޽չ|Ҕgrw6wyCο.`Z{*>#;t߱eogwM>C~v0?Kn^}wӶej|_]]}ݟ{B4{;ۢWLdTI~@ug`~݋ oKXu~,7o]797wn>繯gmY5{=_;f6Omt;;tuOziiۣZt]_nּf덊7KEʩ5JSM;#˽Ԧ['NE&*x|3z Wb{M 7.{^-u];*t}{W.o]}Ve?#; lJ0TNteZnlz'1{Dw&؍4̖$x<;K]T;wM:tTmʄ+m]aZ_Uq]i[N'-p+oXS)I'W^" hb/Əm_Bo_5̣jiEed?vp f1 l!{R\c?;oa<ݳdýatqr7ƍc).սIo` /p҃u-&kVuKCn9)FzvdK`c6TeȦ5~]~)y9/ڐߢn9.Ͳt۹sسcdT[ndNUwIN2ؾǢoN~x;kܪji)BڻIAOؘƽZ^;tέ'1<-ET9Ruqlm'C f fU|ǘo~8-;gUsu__}ݕNJF1qpjVNŰ[++yP{uƺ+j)M&'Ӣ/k6>Uu}Z&#%0*ֈ9d!z"n7ּ$JiIA"rkK'zdWxm^'=qNUq lMg}:'ʹ[uIiB1}_o͛v~z~7^ J)$-}e&%םmZ;Wn1?wQ5aY՟N~kDOrw"}|o_Ŀzv{vݽ^z;?ݳ=iwovݦ^n]6_Ůij{sNOX?^햟~şx{~9Zwv}]ײ}wwfN65m}Gw{+;?TtNвb&^? lg~w;ưf8l j'AE[ӔhIZ4%>J`Xk#_SC]`uڞ=hV+cZ6\,y1+uMBdٯ^S0)O>]j؝ΐEwIkC*5 &1}Ce2f)SuM9}?ĞʋA`Rk^n wpl'ij\ҜpQCioӬ쒣\qX>ȼ'!䲘b,{Y*~k(ׂS9Q1,34,\‹W%e2i”U.m}ZM/e) ȶF;aRj.;gjqm1ERc)ĶHHςlO|qߍl(FPkU_^RոNs{F^Mq=Ck7[j}䖍맧oiY>!b%b)+beh34)Ւ#ImH3䌔F@ QԩQqd[G (#GxW*]O!K?r,ƜIq 1NHDxgY0IdS+,fax;3$.A_Ϳ_?"s@\M^/0% գz&R"h7%zJЀw so秴^Rjn'6rCy*:.mLr*e>&[WOffP26f|ZM5{_gtE\iE$}2z6UvGc^j3ۘSHkfGοõvWgbT?m,\)I79d+2!<5'{[b݉;MO=_Ўbu^cX+>sڧdQnjЦȹsb|kK8QÇc>$I$Nd#MA%I$KaԄVe˃?;ȪUUs_2RiKuʪ(Nu>|.N9zJk v}kB$yg{e\NG UծXWp+\c3ҟCu[;IElڜ/q~"X G}&fui{S`h+ VI̧֯ed&5TؒW2{䆹a-ٮ~n<}v3cd3f/δXwj0ECq2 .Zdѫb)JƕR([SesEeXyVwKj?n{yKfwmA~^je[im[ :]YtCGU%1n03.Wc5 b/3xȜ۟~طH+NråƼMXN+*,+R%l ?tp=ۅopO7b}ంmwI]J'\&"dm!GN]שdXqgXO79 JVjIO|qk2WrtTe%)WM~oOs"OUY󏔼qql`xWj %ؓUCIM~R*TҤΝ%f>r+.?ROWoų-;ڟe;jmuV>ά[..&M">]QObT|W휻7o<'Ļp-{xǒu;}I)9˫iڴԫqwm˕on8 U2j/$( M܌W8|^fۿV]ȝN[l bۜݍ{/Zm^f]un% P+ݶWtwmfvܲޓ=iN$$U4.>\jߓZWCV2={B\pxp6o9}w#nysQ]`:=+Vlo9= =>EWumFު.OI?M~,YWIͱ>FzsK] x&&i_kQ99Vwmܛ} 1Bëaym>&;WxarJɯD8kZ&m|#yӏm{ٺ[Or.Uʩk^И6wWqt:n=uX, Xt9uN=w NĊ)>$Dd~Ttr%ۮ&߷_MF*Sq]۴bm;&۵WvNNMvW[nSQ:F e9#QHf;~7js[9sllX^Ggl1rY#<- uL'ώTg}#vMnRn~8%]]5fy?hoeO Yf\cU)GMzk<z"h~ǥ,7]\g,ǂdf%Gb8#IB&|+][vJeFGEi;ҏ__y+aUoF~Uj7/.zxZ2[oZH<˪مdͭgEF|L${3ZBG\ "t H brdWξzi_!{D铔{#\ƾ[Z}Ccc@ ־iOk)9[^ _mo[IY;Qyyt{/4iA,rn,Ώ_k-sean M-5kF;WQ㴕&BH[BL#"}z;YRU+wnsSҔX-M!hnMS,!$fI}j"3?k?wb)bAۻ =uԜVݮCB瑇Í o3 _s$㿮G. (yaskyyeٖW{==6#ɭ%\YuFffJ ~~1f];i"cX뾿c#Pex3 .E:$j,jL+E5{;Z@jA:ٳ+2`J \w ! [Ni2$@.NۻA'r,nuLk[;8611d5ͥ) Y"IF01ycݝO!<:ɲ'52.;3',aa鎵7#}zٝOS]s <'2BWڭi%IcQ="$BQ"3q%Y!KBжIq*JJ%i2%6iIɏT1nqd:7\cO#>^V:޹ *,𦔛1CMExn;}{ȷ-lzw+j-i~O,:̇5.M7sxσ|Nn6,+J~m]=K`Gu8ch6rU8yvPW^Yң)/qQ}sU^wyt˖FNt_9v}5r[ %'+^Lgl>I+?]0;b^4iVU1 +tPZGg?sCc8F(1pvV4eeiry% Qz%R'?C2-|Y)4q ]UY)I~ Ihd}y?ۇxhln:넚J1_l& &s'UB'Ϻ{G®R'-ִz{[rذM\qҹ&=Zz>_or>um[njSҹؓ0ɸ_UEgMsO{PHdc66'wc﫧.T+TvvMvTR]u^F{ft`{l-u}[oEgU&j0*Nt[kOM12YgPW:"rqߊP%K_E^qI##V۪4/_OGig}wW^ʣW_;󵧧lu_@믔Z<6XOGgcFYdxiFm|L׶ە;7~_=;FoxMN2Ŗ"Qm_|l(Xzokg4枩:߶G!r[<_it&=q,oWtX5F7-ɳsjUG_g),ªmWeQ:KiK[yߏt*čf4qRnZ=ɽ;^/%{jm*sSIZ-;~Wa|fkҧTfW=Vfa}a6q.~řI )i|>$<nw#߹>52Ȏ׍أBȗ{t]z,ll0?eتw[]kvHVŻ[zyNl}W7Tb+Oc-Q)%,)*$183E=:uft|=/ [=J}Q#3KvC139RUsb*Z-du&;xF͕ё ;Uii>.e=!6riWyMSqkmIu#a1R%)RD0S~w2؇üz{2q=mV+O^WZ9M[ϖ*Fw^rx\M;s -)/o×XHtЯ?-$.&j; 35Ljm;uJ&~+"+fO!'Ǔ3" ^wvhn1팏 cDujT-UjM.r2(oHWSqS| Wb5o$tEMVط_5pHSb%@y㝛Q%n\Q12e/_ê{{sٱ~4zu|h*AbFmLIQ!#.~r{4`S;?1R>M-4mČ_]c=G6Yj8-\DfԣB]m19EIԀ|]X;Ɨju{5ȱ8fߴ0<@⠛i%:[$%<&k?Ф>BI3"2'rJ##/:}.c'n+\@TѪ3X7 ji431VDA]:݊?`(zxt5;FLz LX2=~3i Ea7l i 24^y~I쯭O,솓uvN5mP=^*0p 2S1ZSO&V "~?6S:3DU!ҝn[/uZiYEkvStVٲ{"ܕLiK&’O2 DG$F)3,< [(pn/)(k'C"[ȥlXKU'_,fF]{̓5ݕ|+fDt4!%DDCf6;ׇO1UkN[g;M][,,N>z~^kDdsM}}8M~K~M?E?&*TK&Drnȕ)$H}ǟuKqի5]Yler[oVV]+ꂍqZ$I/.-D%JR)I?&fc=dS}"_[i):G"i~ ɑ|=ݱKW[oM_QB{>)]v,I!p RTkQ%1\(֣".>cT=1P?u~\̆7ˈ4y\ߍW2o7ʤN̳=w{bAy)W$jI}MN,VO6W#c,)I7VgfM&j).Md^ >Կ͚v XD,nMk\2/U6v%\{S<Ϗ > KGlQ;;.⤤֯b[322ӀGc_di$(;KAMUnK&dD)(wew1p iTH3OXgF/g9ߋ-萬0|Fn:mHǃϠ߅\rs_~ڙw 5.K"]TSk"dL|ЋCK~~=&]?׫ r(ڥ;khڝB%9!kiI.ֵW$}u&;g 5:[^?Дӑfi Ѝ=I"#_^JuOT:sQrc3ilȼ$X8+Irg\m~Q{+1 }|9+ᦳƊ4%ə0)122mmo>,iZl㮺)JHF|tO_!5BTJfBG6Yv9`9 mŵi*!)C<4t=ƳHk`jOLgq\&8.^\x(LL\B~vRKq֘ll:`±EZ~"V fxԒD^j_Q'ywN]u5ğ]-w#Xvu5:u.ɘy^Dj982.@ \͉3 }\4\ Ʋ^.~֦LY6fhq~ *#I%C4݌Ι/~cd9[a g̣iJܖ҈DFDj#eWd ΊSN4BVWf%rm]{$I5-D|wޭ;YY{~r_mMXSW ?ߧ?]w|G.ߙZQq\TZzHS5a7ji>jG ?Ory\Phˬx?6uZ} [̧2[[=>%z +/fYm ٙ.as&{vDyZF"Cf<8$hm%I"gJݭjկt~Fqadk;2)?O`5.>?e#tw}#YaCݏ uݣNe"ch\ .! ~DQkz8` hgi_ièv:[Ly0:1e-{hegָ4MyDD\ {+Mja)l_5f揬C'u@O/\;tdx,)R ["R9Y%wWW yS$y 6?{7PV:ۨ{7Ļ 2"_u3HQ:Ii4Lٿ{c'L6ۇ! XgaMe3ĥsj7й0v݁ nC6ZWcp죩.qo .| ω5~NBq+iJpV:g.?2mL""I3l-e>t)ҝ[fϒrpd-ǞugjRu[>fr-X!bn2 f$ q\Z(Ch%-jJ6~ m_XgKmݛ \c,:@y <ᰴ=[Td*LTQ,vw\=f݋WTq,Ҋglu: M}b̗|%Lׯęۀh<1܂(j].EVd* xr,.ʲ{k #y{wm2EfXNe̙)8)KZfffJJRjR)ID\2L+4__׽y @-8NĴ,;Xבi[7-دJQ[cxVoJg RR· l<_P.3ץe[gMCeG28Z\zuie[0='{gL}|ZKʊ+J\9!Kŏ94ĈԬd*; Q%HIx+7>oq螠KVMd, •'>KubYls֘kLf 4'ɟoC$tS/ߗl> }:p\z۬/=+-R(̬4OЈ C@GpǎlT4kҫ(RnvO"lK$^&\p@ KsBcBw=Eñ S1ipmCf3p7 "?9Ӫ"񭗺 Nt_I {^sXyn3qbRdJ]4ϊJi ΛY.=lUẇM!ؒ6y,-uJJ vj_g˂ײU qZK y)R $O$ŝ#rؙJ9,rRȰK|3@}Ob+JI=b :IQp\%dJ/sYc:v}ivvӭjC%h?2`vRnVܲ[C?7yyԹxSLK[r n~[Bܼ&/ORҕxNu%*J>TRrwG*'f+fJPtcos-0.89.93ubuntu2/images/fondo-1024x768.png0000664000000000000000000036555312260610261015207 0ustar PNG  IHDR5؂Z pHYsg tIME 0 IDATxג\WĖR"*TY]]-\#<ּ<¹>KP!Sr))@&@0 L _0 0 0̯w0 0 ð`aa 0 0 0laaa0 0 0 aaa0 0 0 aaa6 0 0 ð`aa 0 0 0laa 0 0 0laaa0 0 0 aaa0 0 0 aaa6 0 0 ð`aa 0 0 0laaa0 0 0F 0o DUi%Q` &(I4$VJq9Qp # 03T]m:sֺn6c- @y};|!B "a 0 r(PRiG:#AƑRGQDI+%#%^@Xi-F Js9iT#HEZGBF2t9s!@Q t0 aV *ZK)@ gQ/K<*٠8R J*)R(PI<ىѝ(G{oiiۦuֵims5ucJ!u\;O!0 0la~=ȳ8KTA?iI/, ^/eiZk)B@!@\ \h]pǗJH@DD.ug>"bd1X댱Mct7M۴ilX (uݖU4`3a @0 ð`yg i2 rq`{l [;[Nufjh)Zo].x 6 0laя j^m|oXGIi?,o-:VR"( QJD[;x낱mmݘEYOvU֗USh}`?0 am=+1"m 㝭lo;78$q,M<6޺jKb8{oZX鼨lUuE=_M楙Ei 0la&} i"v񝛽}to4YJI)t+VdD:^/f szclV>y>ѷOUe0 ð`y Xl߼1lo+Cn*Z k޹.9HTJ*)@TRvB))x!@JiTKK$7N Zz{?gA~coxՃ~y(ba0 B@/U;۽?~zo}^ϯU2Oι˲.ʺ(u(m[Ӷg#c]ZIXwJ<BH!Zq$HjYI$qEBD!K!BR7Xw@I)(;n zXj>`a0 "%O>n {<B˷6Oټ*v2-uʪ-ju@ 뺖[۩Ns R"D)XBIRG2K4K$J"K{yg$die^̓vea 0̛@'{w?]QUeYeSlOZ,*kC$qMk >vo6UrBq -($))HőZ {I-(iɠ y8VIű݆'tƃ~D 0 a7Dӏvwb(pr2fV.Vjs/ WSK8"kJZIV)q,h{ G( BDfP`O-a6 0o"Z@wwӟ~!l8<=z2~|hq4YGo.m>Yo=I!V"eٰIA? Q>>滣/9<&D@]~ly-EYD*A~?ݼ5gY0ƖU;6U0 aM$wwvҎOf}dᜣߍ SxIˎw~o?z9EQY۴Z 0laD;ۃSLJ}_>{t>־Mx"Xk5LU[c\A"C=zzY 0laH>E<0 üV8Za5BD~`o'+!ZKy{2)}(CݴO?4?0Oa^ {l1/x/0 al^Uil;MԝQ*"z|Sa 0axZի X«LjHݿsc>=IYYa6 0o>Ei;X'd餱J޻7>e;:>=/0 3 üF ֽ20xQ@ΰwҝa>U>}>Z0 am Mc]3 n޻]H>eIE0 -@ ü}h-DK)z ƄUU+%/0B$VRk!@+?{{'1Lգa6 0AA/^;x<)0-ʶ(4ˢ] LHwho v.ڛټ<<O 2 ð`y?f{k/x_wܴ_XATVx/Y^h]glga0 ÜC z[[ww4 X/dQ!`YJDk.=d{AE_"L0 \?|0 KW.;[VDDno?WR :@Eϛ־K%4VR;0'gzɷ=~6s\g.aO@DD>_:.S {ioIYx."ie[_7Y(% kwo4MSUt:}ٷjp>H0 a)1*UHK)Qk\Ӻ6DӹQuY~x\V9x+IYaZB/$Ȓ(B w"Dl 7^,|_:nga0̛'(R()JI%VR)iE*TR+)@@}hWMԴ܈gAi{;ytz2)wsTUn֪KDE[.+[VO)}||ٳG}W_~W_}5[/F?0 aWbkbiZj-OHű$QVuc\ت!Mk!ESD8@S٢*:ϲ/RR$IVh,]@w?W_}ލ a 0*ѤJ8VIqIWݏTIde8RQ$ucɬټ.ʶLj:F˄1"(%?~zkQ4_t`2-jo%~#+ii% j׿<߾'OEѶsnEQ/Ca6 üY B(l鄾VJkue-_FZm8RqXu. \ V! o3"Xny6Q̅ U&@~_JQvvxj~z"(G=xoLb=%y"+B6mS"@$IqPa6 h}(+wsxғgUK:+^^Ok}ڲ6_lE;_4YmYz]'bkl@p[pRZI蠢VD%D`k[U 5ziӻɤXIԍ}v(6 Q'i"uVP-m[XP8tfR! a6 6iaUח*O^/ ҭa:dA2%,Jݭ_G#ÇB 炵X_զ>Gx\NlQ3[M) oZfC$ 8 ֠v›ɯ ϕWfhT}"p'(sNk}Ň9:M$VJ!x-3["J򬷭tz 0 wQIKK<^Xw)dDB$Mt mD9[itΝ[n{}͛ٷ_^ `0 a~])PJ!*%Heixkh鰟v=Rr! /(yLlLfdZu뇹|qe=FV=GoT3\Z-K{D:*u*B"ӟ2.@55ɤ6Ɔ@B\94Ro>0"pOn~x?'<`a0qDigp0ʷi$"եw&/{V)vh&dRˣqQmUku˻ُ+ſEZM\uQH$(t"8A~D_6F|U Z[ 6]EU+;Jl -f2 (MQ֣AvŕJɭQc-zzrpǷ~[nmooyh&ӧEلa6 s-t5pD idOFtO$O,4eQFIK\uָuk%,ڢ4eek?[ZzrTy]Gq*4JY Og+qu :6e?Ҫ\Co3*t'օE6s.t[~A~/轝ߏ>\qkXZx@ѰJ}6DZO?wwq,>:Y,?0 u#yd8HFl{le;|g+ ^K?8sWTfQ4E3Y5UdZMgUӺ.Q 3+Ͽ~ uPy ˾ IDATD@IBq"&/<>nEOgukZ2zѽ;ۻy몶u)uPT`wgt_Jy/O"yH_?ݾ5T)*SdVMfdV'xZi׍!i{OWG+:14?~. 9%֡ Y8K@AR$d Fx+A~6HZ7@:o&ZÇ'V??Wm|GDT^k{*Za$JO/*ךa0kF "G*հn|g頟 {ɠt9p}{2quʺ]NflQ/v^4 TH]S]%7+/Ufu%JH B @ŝ2"[\v$u*08ttt#&.? qn=?^gN٢wC$WYm iQA6mHbgZk%`jla0kf+1']`on^iW^5n2j<)':/kֱ6Lټ6EZKyg^F[C6xO^`ueU7y`a0?nwkl]Ϡi:RBت2EՖYlQS;˪j۴ N;A ! y@y>4RX@GN/_p\g wIBD!  XG (|p;"??x;.ɹ`]+i%ŵdV?y6{W^fZ{ <9X8uWU;q0 :Va? ݭ|o^wR'C]۲6]fhdZ'UQUeֵZuFoURיe_@G)/040={D! Dai D @]BODX@QP D~Ѝ_z=R@+-do[{u9Io{I=dV { Q)A?t^y3 ð`+ !P "=n޹5s0yd2CȹP7x\G8E=_yUDis?X/:)}ׅ查%7efskY H@XN"@bq ĵa4?u  1n40y ǰ:_`[{ }cӋcEu;[('fum*q <"۰;KPR hw6)f:&\1 0lriv{vog+RxTY&L.g6e[7g]{6pYɞ\wsna+ˢ?FU_Dq{+ہBX(Rq:׊0xyiqDpHi9 |eeڽLEY)1f{۽ݭpZ'&Lyc83A<ȣyѾ3D~~UIDe 0 uu`8KϷucV-<'k/+ӴXwVӜ]U:Sl}@ =?Z/}7<@ ' +ꃂ).O3N#! !8 Z:#Њ˻`E 6imY\ PYT¢ti1;;UՄ xnކ$ 4zy iBֶxa \"H)F>{Ihkil^?9?}>{z8<^uQxݬÆߨF 9|Qe3Н9!" =9곡@./[V@@DA/OiS8%2::pz< ߙ3ѹ`> W%NY-=; vvFWOR٠|@CUGP\YVƸ@oU)0 @hn`o7Yi%%;ZeeteZl{OrKeQ7u4u?J+}xFс~vs2s=V}=P( x"QrR5TԻZK @`a0PE@H:  o Yk8R纛u'Qfa0F7o ͇n vދ~FqY+6t3`^b6o.U>.4 )I0 ICԝBѽC <^<=?;d^usF`m v'צ #6gy/~P\79pa\p2Lj?q=Ӻѽ$eD*&zyg~#oD j{!`X{Y|`x2):_Ѽx޿Z6M>?OE5ȾY뿭fOm"!  }\.ßևе! byJO<.l\ƺWҬgѭo ^k>Tyw_WNR*p^fV"GÞta: P7ں׹taabđ |ϳu]8-qϪ2܆wlmu7R;_٦ yawzY-ot( (` Pw_M @BIRNΤv[$ TVil/?KGjg;f,**s tvwR*I탃>O>~w޽7wx0/TJ>B.Ht4Z7NJ#BH#]EM:c'%I ۞)b q K a^'iwn~^GR?9EhN>?y>o[w"eTw>j.Cz6/^)VB "x&2U.:22"[06&@,25 @ L@x(5,t]E*u2:YHx}(Wv< Ywa{wwoܧ۽ѠjyB8|~45Z=:R3kDDho 8a0f4L?fijSQ_|s/饽p~QxSӽ7 aV"luf?XP"i=ΪqVQ^e82r4/?.03_@(5j0@%<$Ԅ.`AV"ރ N/Ҳ_(U<??|ro~RJq0#b^E ›NI, @u6M˿y\^[ E] gNm:qQ@wð`׆Vrw'4ѯeɗ(gqٚM&}ώv}]?-w>jZY7cĩ8sp]B ڶV]?niuyyU'i=Ii."S*ow"X|Me,T^ $K")"B $D "@ I 1QABIBtD@^A/4pQDt0|o?a4u׳ "TY'qtCXMY>DBĶk2[6~ܔm7[*Y¿7aCH),s7"-_ԯ~6=u XٜM/,%%s(@ʹKv≂6NQ oP2 RD+6ZM0RjѠVn5#+GGv7Fh?S_&&)u{OMpgYb] RZ ^tǭI :V7_(2.3r$u>;- IDATjgo,Ϙ2D 4  P!M`?qP45>}Qy<>DaQ$qBЅ=xT0(4t]{JL\6&0}2jti !bI8(R;ˉ_Jƥ/ǣr{Y`.s $#ur12Gvgz/O2XƵ$Dqs}#(zz($/tO\3BpdJjyNqǭ`<:,ddc# D04g+ŸFo坣w>5s0:X::-,Pbc!z4t4@0Q3"RHHS,o+{Æ.l[պ]14zè~zZ^e,c 4n>hkRj0~~v8G9)#!?̫|Ni?/_HŸHǵzq<:,Eʔĉճ҅f{m?r1lZ&Vm,pM(Y`h P !G301@PD|`' PM=Т8,I'ɵTu!ċsi~\Ƕ̧lMcagPyӀRU02nZ+a,4bS\#idg6c'K%tö4!M"Ib=e,2~aꝝz4n`\tl#7hy%m+$/:hQe'n8gEmB5@́ V,3$q G54Hb@92Ljg[HHQ@` uW\⩨(pW M^dj#?>h}6\44|4FQp9IxyR,<3ػ3ث}/"d/=}:+{坮Sϙ&3d.iK꺰M4e鮭K֤8&XAGQ/cK_dp\xfٻjAzy./{9CS6ߓtkg`*zQԆ {gĔb*EWO?z'Vg 8  |m`j``8!@0sZ#'Ԅl|B:nH$FzB#Ӭx!*NB Rs˞ ^H*@`xdYb>!X!:9ږa"˲0 |G<@_NwVWd$ ;6ƭ{=6=j@yƵvQf\ 2Ι!N3Ɛ&ΘL6=d_-KcLSñ mKm44YQh~O Yg23JdV7.TPIT2RY/_ 53+5&3+{ߋPc X.c FWX_n n_?9Y~s}̝w^Lm1>l/be$TϢ}Px׳h?b{[+[0&LI{.c`3 01B`8IQq4ŷt` ؉J0uut 0ulKya 1}j h! CHٙ M#d%B "D5/"IgA/>eRLS(^ifFEqZRӞ6-X[)K&g$%!q\Kx<駟7Z֟ҶЖ3sRYThf,Z8j LCM E ӁU*@HR@K2`X:;ϱ[ FGIvgEi4sξtO\L?/sQJIQ$N:xRggi?bk?y|*t+`>Dg(R#7{ɿn4!^[]2?InY(srVt&?O4AgLIsD$$i'Pq9"zagY)KEy.߹kZbkA!?H*R+"ږ^-[qɛʳt4dYZT}wWLX*\AB/R7 VZ+QKrZQc-h]4d7J=W}Xn6 EO!ihomWޮ{wumŭmtkZc^*e0x#? e@:w׸7dm+*o1$( `VMTn3ƌ.r{bt%`K_Ҙ蕒U8LJǣS)ϒڤuFS gB:?"Ӑ$ӌ, 7h~g>u2\_|˿+66a{nJgjp<"*ͱaݢyW5b dE҉F*80Y5]R)*eK^Ĩd$ys8dV)@|uu{_>Fkw{7L]?r`%5Ž^dT0~XzT }czKǗ9LMqݦnε3 n\h6nmU C\jCDTqac䰿4h |Z?{OLwUN~ν"%A H9v MhPPs *ɫYަFaXBD$Aο+5'`%j6)(Ry#,c S:q_(t30'+1~~d90T>StZZɰ4j0Ĭ$fY7o{HW9aQo[?|+f }Ip<'8!SM;p 0' !qRsf -Rpf^@JRCe2M9_OQq6kU|#cb&c[wԿO2 #MKR]fnVz^Vn9YD{Mo#ԝɞ@%i2;+6(Rש[-w=0j?f?޽ՍՒ vZ{!eGAcov~0$-#LpoST2b 9塊*StZ2Gۨ9ܪ^"dt )zff0(1r%Q3^v,c ⹶9{T~~-Pf)w*Lg;k8UjbBq]0 ٫̭ h'26V%0 Ȯ5nwn;u,u> b4UƸ}kx3:Z B匈2TUi{`ZG';M~aUAZsオd~0n?;4m(Uq1/m1\?dStRHeȔTqFJ%:r.u.\ @rt3@*; x8,"m.[k4&δ٪#2*ԧ<^Xe¶m/!4+oOZ$gg>-lQ^g7#SЩiIqQ4:Z>Xk!tVzǥȮ1wZipi'_|a~X[C~'$94t4.}dppҿ1Q Rrq <9 0{2u߱ܶrt#WY#8?kzX]G-X.'IRAZo ˬV޶>n⾝Bz!Ycocrqkog<쎳rTگ8O^V[ڪYy.qh`3iI^( יU{̪XĺJeWAS:wq&,權$ƩdܮfH? hw7-Tx G2ƹ)J;(I),fxi,c V=|q,/v{tq#"4_&'r`lJ?gBapAOHeܠ]?^>AHƽ~n2%FO3ϋm^*g~?ァ /TMo孧B_+NܵaykCݡ <|k]2v7hFGqkaE^3JTʻ&NJ[(I*-fuyK_Β-m $)Uftv{89I"^L h?HĔtnp6߬701+?;<׬jf׵A?o r Q :> x D7z2 :iSסbsx#%:@R4+Եk1C]ҹy5 TJ/iۖa[Bؤzs5s>2)RRP)7ͻQc52H4? &Bٯj^l[~C_*ևVОkTARnZo}֓u΋uwޱ>s]ܕ4˅ ֈv; 1bHW,z'/vbR7<)VVlqJ9+W~$ije1%}P-+TQD@!WWhsܬ7 *wA,2{kvuOPvW+[=i¹]U:/NDY^nw0K\J»ufUzHfh_UG2#SR0E jT)F29+)svT"[T$2HPwP8_?`gfeWjP^2`yacXא][vQz Ns[~ 0NBeq3Uhydţjw`J~exe!Vn?ieQkퟵ<|n8Ly߾m/֟d~ mԴt0:@g esݧfj8&u 0f8G0)U&xK sM55KI^演4EVs ^6~/< [k"WMMy3:G}Mfk=_ WWr# m<=(tɄUkZ9HEqpaI^l3jo-T'QOTТ"tDDJŃV{{ةnΑ6,8/IDRCy[*U 3H2x](eO,&RFs`/ /E˵ H#i?Ys_LcT IDATÍ{qS *>4IYqjg#@:_Y'2d bt؇Z#'gz\]O8?`:͋#ReFvut1tMd+ ˡ7;QZ̑9c%r1xM48g~)eIjS,[wz>ԋL\Z[okkAg?G= Y&';oUn%US|JT˶PD?IVgAd3J\RyN1ܧ"?gP3 f|:j(1Wytʏuڹs(HP%#Rͯ>( &,2ERJ%W+Fmi1F̴}gIw&9JS9.q<:wW;?tV׳hi"{OzwBjε O?5?Pll,\0>v` MR藟k,^*@xwzSef4 ͱuҒ4ύϸNZ?I.B!iB}")e^ Q~Iy?&s' *"mM' /ksX[U"ctl-w}Qi+0\SO?>>z(,ac u B BmvǐalS#C̪F㔮iuـdJۖf], D_X*`4N)g3O~N™_hun\c#כn5^o~[FКX& kTe -gAS5#ӵn i1\YeWø 5cZvGנz"2qN2r>7h2w-Taٖ\OImS~Vd9n]6>\yroti\QcQ8͏O[GVw7]%f {D$3vU2y1 06<fY5}#ׯILR$2h}7]+ؽɞ!/śAGD<({fo NL)5O? Zם`)Y8 /Ui&$bvF㖕DŽ(T&suսm,^q5?86b1WۥMҼo~l4+&gf_/X/edfQN[=fUkX=J"8jk706) 2#Ne2`o̶jFk`sQvf)wg 'ȴMs6RPRqsj؊Lgk]mm|]y7*LI'lҽ2~_|߻'VWQӮ2vJIQk*P7l~iJ}]vS; kuf9Yٷ-)`P &B/RyBHdQ5쭄@w*,2]R.H4孵5d=m ' ]+&Gc`qHJ*'n>9{s1ˣ<beg{5c*45ųraZ#:C SH Poڲ2aa8#-6̡#\4{ihg,$Q~t]@)%,"˲4MGQL:*1zE(&N?jxkxɨҚq-wQZm7Q-\o=V0;N |6?QREɣ'i0e犚B_JF^1\}fUYG#u{gtI 5>>T{W"g 0H 'p<?O74;P__mS+ӿ<;y@nW_"$'Mq9>>n4OL B:{x*Yxo.xD1ܓah۵%Xo/lKRLQpjoI!9+_(Ziϋ<1_m5ZkmcqLHe]yQlWȊkW;?[=CIee]Sw%|3$TǓ% /OG{]8AgL$.eԧvxx^|4:Ww\va |F^n7Fl6HD]ꯥ>pB0Cl-eY6=~7$yi`_^dvyyD&ȹ62J~agc,% y" "ZBarRY&(ȏ\湔&q% 2v6"kyqj4^m ?{7h꺨U,×Q}*T;f`wwwwwwl,3J}R=,)B 0`1/;G~w{+QO"n"հ`",, JVuc5,0aZ+ue$+(q30b4OiV<ۋ^QA2#N׋(̋"`Dnk50<&3*YPS*@IRTAJ-U}Յm1~B5{A-ssY6?c0gx}.Д39DP"ϼq2[kq4DzzK,6v>Vn2/79ex=;@78ғ5~i§oO掛Ny n.ٖn %ss#(NT^h8cԙ,MY $EƞC=xo\irT7ce#͊Dqk8W̓OӠ(R6dYj5t:+"r_PŔ,%XD3zfƚiI/SQ/j<0i@9Saݵ yq٣Fv;+[e5`QqŹ|AItZS䫚ŊTe|50OVPɐdFJ R8u?ZxG1'MTeJ| U'$ Xest왓uѢz&cS!WrsJs=xAퟩJQcFox6]}د+ea?h~[K0ӭ]nlx~nbVcrqղ+ C6e4H4N -w-fٙ &$ L-_Sy9"L2^0vY0}K]sKI1noUvlYz5)Ul T) dk(]+0gR_}v)H氌e,2~AiR&W)IL4 L/r\b/rᨼ=\@O;.uaG1I}n %S7#3 ͶWFtZe^FJDanyէۊȲnsG`ȹ` Hĕ$dr&5~<\MX0kV]du1:fʓ+b^sޮJYx}~y%IEJfGT,3œ0 .ȑs:N@R.= U2aIrcT鮾(R;z꽇Z72Qep'wQbh] /n~jn!$㉬<$Lܟ|241F`azB3T^QSRY%I,ՂoL9xfT^NG,D=iVQfj2˹H1?Џ'꟮c370,$ Uءԇq 5 uDFa 9&32`oz_s%$?6EiDu`bN4ψ8$gbLJ-tlpCe/2bjx[vWt[1#;]hgh9L* cxҡ`CW:Ls+j2xe|.[첦[YzHi2~=;@JIRR3>@qoWaU(ď"͹iQh`HI)pkr658gR_3P%y?/)dPLPw`-ZU{݉j62NE!X, ΙmiղeDw4Aq۝$8G>Hpb62xkj]7hYȮwk 4qyxu7o|.wTv֗GVnM*RA^$qO t۔dB08i`ղ"rnrQп,?˓0yՉMr!cC!O!TAr"cf2,Pw<2qTC?;Wvd gMSWW-Ml.NtM^I鶶f2F3K{b@Darwu~K%Xƛ.({i&N1G~% +e7nn5ag\=ni$d~iA~/jLNЩ~ԳOپwOey<╬yA.!/ - /5']xЄƀW_,x\,sMxb9M3@䫟Չ"Hua 0ƸP^BDB9cD%A5V!Woל,7A߿s 'RiVQ^=O/29wV)UZ/c Fej%t`a5L?U3v/~&@3@ƕF{3%fYd&|)!t3AR"O[߯]2߷> ܵ˞9Φe0)JA&! !Lin~>R@oN3YJz̲5 ]^!{Ƹ-vac4"2<ϩV\]S _G1c!"cqx:>BI;,Cf\Xٍ8Hv{pfuIa$_ 'c:32(L\&9=o&2p͍$Y4T{zwîa}7ouWeUN* w?@02U%bV1Z@ ==nqͽ. #EByDP p#FfYRN;fX-R? *q E$eV#/C.޵dԪAm[qL~x)q/!m<7 A.Uqa ! 74fڥK8CMcKLn pͽ͵Aan7I$0هKbz*T%u̺o8(I/xl d|s4a%<-t=ykOoN{A69;_c?[w !@/m=xF'GG;?_"fB*gPgf$PH` p2dssV:g]]L׸k",k5*1M,t:|??7iwoO'0vRT!ci k[Vn1BRÕ*.NB2y4n5]64[fݎXQDFf2ꤨP 7Fӝ~y]/MB.t{Ժw87G~k1zZΨu/s{K$9s8ј0M -@Pa]Z8ьH=$uəZ S?湆ejA|qrm u?䓟g_~vww9Iب;_zWR)A*Z5Vw,R]eP"!YaQYS)]1le޼p8")9T2Wq% *PckV2+/px@ _ptk?}l 9=##{ƧЌn63%#>}k2?~87Dg0HO#84jf[.^(\ Pz-W8:%8gq i?Mmvo۵__~aĺ[us :9,@gHcxF\[L{2qRR4+&Ar: ν"cGY^LǓ$B$2@EBtYuL(+@DnpN$tr5dsgy$rr(Q8[JH}73BE*ܼEckif!ۓnb7>}mciֽ=nMO/9zj$V[Œ'} vp`=pM5"PsS )V+Gβ_9 8dxCW 腬f}'']_?y؆tLCDcoKHt["`%IٍM4Bi%*B֋Vc:ƭ:cwQno2Rf۫-RBG1LoxGeLGVtT$@HpUW񐤼+JuRT@x8ejCRRG?"t3|`sS0#p?>2IЬ'Ok}/챷Hs$d5άepk6YfHxڼ)xB5Ղ;Ķ_g 0Т?{) T+v#Ȑs~lȑ$XL2A_9䳱j Ī_K2TӲd3iJ\4R^W)'秆7k3V1no7?sw(Jʞ,E6Lŧ Ni@c׆Uœ.[* .5c>^v]$U*P0xZ^fMx|| Y)ـo4, mu㿙Y0 ݎְ}?7ɷ~gW\kf~fRzΰ}hR7:?l>7caUuG78x&?ǚ=y?vO93 2uv#u*bI|:noMS?OLpu8 X98+ 4sl7FvcM G{v]0m#9p!VCr]jff۞Am+;vZU/ GhZnS zɾ7£bZ;[NPs_{*rCtMC@ ^-S3MU(C]f(Yg/ C?OmKo,Hk2 9V3otOn0Rxv oͰH"vi΍K`R }?6gLӘm鈈7kn8ݶغZ͚xL48)F8Bȷ9HI {uq"[*l ꝝ73Ž t* Tԗ1+ 6+4Ӹ%Pŧ*Ϗ 6HUt\YU@G8gctZi^| FѸ?8_~)λ˸\B&sM䄨cJb<3kۉӊNBo#;if^;k9pYBB;m_3p%YaQ@LɴmBWwCR\fEtN JI'=01~HVsz28(ĴS`?I Ƨlxe>58g5rm]Y?"h@Y&zw.6 1M;9G(mօڈqU#o,խ n R"?Ĕ`<.J 4Fw]#CDԈfYr$==yw 4muPA,lh. k#sHeSCGrѪ1C=?c2STN[(vH1ͬ:2|FsPBeSG@g04fpQw6sұ=Uٴ P 70滦cˣ8y8O<+I@srߗVξk)(Bn2%h63{wZyiy%ׅnGN;7'ۓnb\87\YWj!!H7nU7nCCˠnJ-@g,bC ΅-%3߳l[ZoDPI% jٖ:e$SR4 ckko BJExey>wW$٢oT=t㢋$Q|j@ M~`5˥?8  QǥE\NmouISMfγ8yO5 V(Y)@V? ee2QKDdBAE1,SMF1 BIQ.`m0 M\GOѲn}㻟}t)/_I0WwCh/H&ȝ3^$D摛DZf`^}wMXY ٬$ 1 ңo?| sOlklտx2M)4DFJP$s.s4}fkE32moy9HƧ*:D."5"r7fv gm)`~:FdP#xJ? *PC]˵"aeksv>Ǘ+몀JE 冓I}wغ7n )yצ^70rڧOz[?;~N69 x_Ù :)L>pfDg!bĀ14M]U*W/ iƞ0mqu%~_R*I ~oY ..L,I- EVĪ^fOOg?"m1bg/O_h5}Qެ}sM$-%MDxHY c^j;3&j2m~Y8u^-1_FFQr_Ty޹lb7)dQθOͽBx~6 $5yaIMk;i[p\]]JiAcd?Z?F-FHKK#YәeimWJn,"qj]:]L!]5%%ϔHiiZͯ8ϮGcN/_*d̝<.f2EzB" ! IDATGiAuld&ia/~vVtm@#0ξzӓaIEr Yn2Ks5oȜDeY}u**R2Ƭ2kh(E2"VYJ"VBE*\?,KwڏTh8B!.~AK; \-ńBQE1^nNb n|J[+7Sfk#*tWr^QA>}ڪ#,I'<0x*gвWł,C\w *.]T$Lޝ[9jVTW XH\AW'pm74%nM,0d^""+ x,>׽xk΄y!\N'/N׃c!r$RdȐY[+" DF"SEDE V<(XF=.2\w(A2'tJbmJUTpõM6 ]܄Tq4&RX +\)sXSAyoԼH{Fak#-r@w:v1A)38 ,بA.BEQٚ`u7 MI.'tؐy!i< S5Mm놡h (ONzݓ~䗳DD$@ I3DT< Dͳ<4u"* 9' =W,eq{2b{HԉçFQvkZߑLE[s1~$C3 <9p.?\2"(!sA# naulVl %*}G%LSJ(-.%xѬٺίYhg2!*tq1Hx}cBy[\TJȪ_ܘXu4LLZti2/o췿V}.*Tپk <A GQb X}q1zndi&]F5xro3 (FrCNQ9#C ]75d1DO5\]dt.6k6#""ܐ!!NxQb6BdY={__?ryǵB)HC;2No+TP WfvlI1EaR̳R_x|3ɍi;kfӽOD+ K=H~xs~A!3l> vp/BM" {f9լ;Z{yqRAV8IazǏL~tv!`!UQH.Dl贆N뛍ϪRBTxi[:?W`qv:X _R@j- IY=o5Gd65F1Yj6|R_PA.>JSj4]ZBnSX2t^uGЫe!G~_GF#頹Yk^a<.B8[nkPB v1MSR0띆-?8#)5`^?!'d~psw^طiY*EZ   +K{]1iR%q"b@L!8-Y[ MxHŸw( br=⩼(@`gkCq59 *T@c:g"P8W>gJaqڄHJiss]sB/bv\fN40IYALx9m6."=Ŵ8)SuYjY|.{H7P* :o7ZͲ,Js@)R HN罗?4]nd"D~gӺLӴm PBT m+(TfQ,\ZWM?1YӣJ'oߧ2ȅf*=ПngP!8 SEACou9_~Yg5`}Aͮ_,]WRJͱoQG/{q t)4RȮ.CM3"ʲ,I(QDU_B !K_*EiVLpJ,\BE@j2 VvfP2Bz{PX؉v2λ(oQ~:l1DIPٛHʞ?g㿫Eן΢`YOXٖ= J)u&Z@#0uuELE(%WFs۶4MRϟ?zo=Q@ WW *T@ Biqf*x'B2uSJ/'8 ?TgM x;| 9ukF4M>9RCg"$VV'=ǼUk 7r0nybEOJ"-(RiWtBA^Ç_ѣGO85B4\%97tW%x=y`\p3pKo$ i#/NB Cٸۂn ؄ASG[ ބ&1$9⦭.tP"jV1e[ݚWRY..:o挛]K @^+)D*Lj椉8y"Iŷ~^wlߩYbU_B ,"sq2x]d1{, WT0?Y ԪflQf:eJw'SxV8Cu8ׄ;xENQF47șl9- ~HJ6 KڰM#xHU{_* OGC%g`Pqzr@SC^@.A\Szٞ_s)̊~%fNFf@y.ij@59fo71\Kf8n˲F_|o?NDtflWk*TP &XޕRyFjCWc:(Ϟ g)QxTyn"}= B3Ǎ/oډ3B.H0}ڬn.@` n`ۀ$(88$Lpu,|g*$(E$aE2 \/i,Sk7N˭ֵRjfzC mw?᫯sNv]w4ǡWD WXc @ *T JbqRQ&^L 5'ǵo֤?ЬZ"65OLRy1n헿>}vQGcK04ڬ"pa?{0ii4 ʠ RJOT̫EOIR_em-J&߳vk5RIuCW[NW/9}{nk9=5$]nZGV *T@k5VZ}Nm" .@H1Xǵ~mrwh.џ6z_YPv>3ѳ6h]l.I@ǃ;,5 YQ6DEc04AQv!:tgK@+ye$@}/G/Etm<]KY) FyvSgz}Ɲڭie#nY1+$,V;繼2PBT E%EgvV!gGp> P$&2Yۇz$7_k_nn'pg'K`ËY:j@xў-h .l֡cdd)R0M`>2B],FuJ)?9`EPA9@W`,Khڮc\njT*Ei&nIhZ|V55WU3d9Xv}αKjVPBE*|H"3ϙJ3-NJ_.AyZ&jyf;Q{۴>{㿚ٔ)U=7>D*Nx9N8 ɉ1sn`Ϻ``|L ʲ٨h L :>% %BZr}M^/" $Z>XV Yrh50Ɲ[ͭn29waD*TP">pER?BH'.Hg(t{R5nM;SqYֽNtۇl_h" &vijBBe8[[^  djgSxڇ-%-'j/->?J RCieg "ؖ~oUwڎB4+(ndSMiy*g#kka^?{wi۶eF=?@EHS*? kٴN,pd|d7ߏj/UP"IVq.<^k?Ҭ_Rk/N b0aISzɂ8{9Ȃ?>xl:‹NJƅff^&A.`aJI5n`5QA`ј?=BVg9pEeυ Zr:@YtAJwuv7kי0U2̈́8uӘy.ȋu`ZkFDv?g>9'BiꦎM4 !'ŕ0da-H-"7dUB c D"+Q e?-h@"D>Ѣ qRo|u, MPRE,JXH⟅(j p9HŚ NV~jȕ!Ji y $ ,/(ngWrN!iٶ9GD)BJ9pUxS4%-i0Ӊn"3efJt;F*TP ?Bx_)g4@egz5)NU vNm;4z?zao{)a`ܼsDiO`] 0pDOz S9lhYBo·ZU-(*~%HH+ÜSÖ@0.iצ8Oy @^P cq$ιq`S 1fZ볕"RJQUJ2D'^JZEl9'ɕ Lh7WBT1\P'z,kR@ Ás j۽ύ,l_/"9ÝC =NZç_]Ŧ*G=J pL--\ΡI˹5VvaZ1=͓?"s;_ XP*: 9g{;O?ڴ, LEr0lmZ͕d:(ʂ*?Zd܉acS,+ B6hܮv` *PZADJQ,tY`Z).ϾR I~60+($Kǒۇ>2,NgV:RH]Ŧf Hv߼@y^xq È4t|ܪf5;Y`h@:CT2h3Y/-}-~Zv *E}QWm67kwv[[]ЯW>N n\ƻ;o58KU/WGRȝ"fؼӨuΆo0U}d2M7 }w8|}!H HYY׼_+u_̧*دhvX!ږlrz%B8-d2@y "*%ij5l_"."3bDT5?D,q;y\S͌.!O Qͽڡ*T@BBMk>?t/%-怯p)F蹙Ho3%,c/6 Hr8^BVYȶ&;"0QRJ*j:{Ov/^jnwpOTrN&g3H)]ZY@AQHle"n@9ɘ\RaEu ZUR5 `gGD7U峈/7\(W}Ka[sgaWw|lj5 IDAT΂aAT Q$<t2 .LJ-x+l0T4=4'GLJhn%&@{P@#n ΃p l(2JPJ%r3~ +jeQHD @PH07$޾b~.U}cHRQ08ABOpH^.AuY?4]a190!DR1Kjf Vgl X}pv?ıM\NjD~Zv*E$iRj6=>\11TCQ"bJ*j?<ڛ+BnL6>V;f2($eHV!Tk^<'QQJ" R TXHv!Ќ d%ߘ (cv5%%+jN*[,ޠ9K"x B/dC#dI`k&r2l",´N _?" {-l8fww[&FR$ Rh8888xg_< :7~ JR0%*I#auJ-wz'oJ=:k[/.j[csD7QCiV6vwn̊A<{/Ke2 J@)R $Z e+0*D  ("^@D-9@i,op}79=.DFmE$J3A c)%QB![uҬlؤnJ]Pd!xFN dkӾпZ+Vv@`JӭWom[wO1^C I`?w?gÃOw|Q"#;nH F%I/\Ʉ$qYHRO yzr5/*_pww?vuKC?tX\Cwoo477Nl6- wwh&& _ "2Mwpoz;?oSC@Ȱq{zûMo`%է!7kۯw:f=槉5VFͪzͬUk㌦y}8-y)- PƀsqF9gu<d0rޗQFIx2T!Rj` v*IӖ9 ,E* HB"0B J,JYhn7 !(A*=J|Ԓ>;1Bwj]D" b|>X|or?H7pEd/PV[/m}VU5sjJEȕkmZVWƆiBasc; F87D@=rT ՖߛI.yIbOfbq0>)i2fj5+ݎmWۭj6+nL kL8eJ,/C$ U L\/|zڛ]̃0B2( @ xMDCVTxȅg7G@ҙ H.JH("aHj@WϾwv/e*a2Lɼ>d%ZB|RzG/bn;~~=G Lzg0>DoK˲7G>MSkME*Nw("2d?;*c3qҸ37km;?tkij5ZƞYN6{֝fc7jVS?Mj<D"|zQ&BrFue7ǜFD$Bߺ(I@( JH_L0C@k8 X\ Հ\H~D^u>gnNU^3Ll.~п 4?_u-=DE тQzg壭??=׏>D b6=?֒zY,DDTQ+k3࣑YI `w~3#J|*U¸~~07jr5)- N慽uնFvMN~ݍjXKu_,c9wݳ|:3'HTe⿌2JPۅdžĿR ߈/fi;o@PBs % PX(tFd.w //mLsoP=vس Uj P%3Ù9^U# Sh7_ܿN % Hy:(2JP/B)_ RdDY3EP:5 BDT@JEY@P Ӏ"Ї_ܼ]JrjI>}y&\peYyd%OHqԹTY䔠0pCR>BXDvG/>1MNkB&O/}2$q%ຮUYj uG*~@)Ա僆0%둳;?l5% gAui+ƕgfO7un|u!e&gtr֛a$B2( @RU[  T6loAJV8"d5dT!A!(B)#@ д2 H B$R5^{{@2 LƋ`@d2"b* d3_[dt[f0].E XʄԲh\faC׶Wo{wwvŠYDHǍ.fgS?H>R'_ZqAC\M&wӓV0c_BrǨn7*.35IQjLd|q6:|ٱ_5XJb?{ǧЙCϏT%/c_B`?Hl=7wZ,D o?HH 4}+̀X~.i_ebOw#r`Z *AeBE)+_Gkq?b/hu:_⑥OA,;Wo}=8gp5 IA93tk u[@UҎMw& 7WFY}6ۯOF贱;n|ʗu{_y!by8zq4|y8:s'TeQ2n"F/IH$c X O!g*I:%`$ 32t0DЌ%LuA@3& FT bp0Z輱w &L xh6j'4Hxs?=X`I̤ϙݪv?{H-FQ_B,~:J1^ϷzwgN|?>8M?h H¹^T|QunYa]VaEe%;NήCHȠqܼ{`|PT7>]_O;nƃ_5+= Yv֛mAৌ2JPƍ'Jb!7qTm냾4i) @GBBPJLPeE:(?K.!+H­Y`_i%2"G2}^ߙwC祏Hۧ=:JūR_`'Ckпʬ&PHs5sw/?ߺ۪Vۀ0Mp}B)b'+jYfōP0e~H6&.#+ kOӯ3ӫN˽0Ees࠽߫mZEP_JuQ3w`_EWǣެ7pfN)q`BD`=x0!,H`H"Ȑ"%A, HYA&" Q\e1])V3_zՍa$th8Z_lWkBW9`mE?CHJ+Wju.*<gd` kDk|v,t.fs'bj97M5Bnn*DL)pi9PQ9F8v.5'@.j[ڶWMw^+1t~Wv B:jfjY}y4zu4:>\ Ϗ$u)eQ2n: 6 s^1G Uu$"!" @ T@EHӂ’ @! o ȟ>բ{8Yq hWc:it* ޺~]_ċN'VB" EA&jUӪ~㇛o4-A}DDzjEyEc7YNVQ3σ0P7ѣnۑ[z~rM[ [V;'auTjic3-Ĺ&iov|6=:tA,*=($eVFI&s'ZU]vPYGR P Bf[*ei.?\U  ʌ(ha̬{ ̏W Tx O]N^QuOShU;w/Cb?WEUeB 61kf;wۿbglX'7Fb:̢P /J |9c)ocΉ(pxzrzxx1:RjvwPT\-gvzgvYpVkw/й݋ڦ[nVb? ն<"4_خ=?>wڛƝ?὎ih9zq8 folT슮-RI"=?>^f#~ɟt΀j~Y}gq TcOd<ֽ.`ޓMo`贾{Լ}D8%(Rʼnmhud* s#"f2 e BE)PB* KL +]̊{3hy\]k_ɥZ}WeWҕd5+-}V|ɥBA:aeLw_>z[MJ2}r`.Ǡ$VH<_^ljqƲpJM+O~w_)UۥL?%%B_ZV߭wþ;=;=cЄjJgXݐf?gTLO37H7c1 @4{W4޾?óã 0Ie@D2| @D"2TyDL .W6QƵWw%dm^wFT%1U I94d!z:`iIBBә_Jz|Eyl' _Ȓ` hdJMm~ 5 \" ҲW+Eb\q]Wf=CMJYV;F]%?VSy|#(әhWbYih7xG0 R!jIx`t ;z 6ϭ?1@\:ݓ^mpΖzGB!iaL _&30ry퀌%g2꿔A)Q!&<:<{5y>wwPG=*)#V:'?QQ N8w0 Q*jJ&k"bEs=ryZHB45d?!73i "ԝ* 1 ph"//KA5 Z|߂\ﻚ_뽒 AH3k Ւ$ ))_+U;v۶|+Ra(&?=5PDEb{5fsob D'2NDH?NO//Falj~1j\(/eEs7 R D%PdBE̒ɄD)1Q{BPPMqCUR*#:4 M/EAq?_25O{% E S@X6=64zp?Y4 )US\;Q6;v΃{svDKh=S'fQ2QeZ"7V83;۷#WR63Vm3SDaόjN+͉tuիVIJ4YZIPT傄jf_Aıxip<~"!Ӻ(q"Stx~̏N' #G ^m{b62OJ2JPƧND^8H+1S&̍$%ȄJD $4 ̭׬2DFdPBX@C t RF U"2*9}.gR~]6 2\(]=ß ʳ! Zջo ?( /\ *E??Rj44ԪިV۶;jflnUK4v ;}H4ן<wp<(ׇ$Jt CiAǹ:As ez4͏ D UǨhftD#0~u1jV}S؆ҁns7hA nmB/ÉWt9Zfհ!gÓՊiUv6VnDH?HFo0r.fzQ˳ެٰZJQvfi@HR7z8ߟBBͼ7=q5ST\&kSI?1j6I [+hܬV*yn\Iv2GϕqzM]u0TMz0%!4aKS2ʸ$zRRIy+ddLpDjw^dr -X@^ ̿B9ewZF~7BJtQ5u'Kl4ϥ5ĿJENQ:o7*͆jXݶѱm{]m-K};F)q'zza$n]!]/%F gtF"4@+H$utꬪJJJ͊>5aKʸLU:Youk[fxN7f'}| 黓 L(Y]cu|nd(zSݪlշVR)d2#trr6=X(Gq,3{omm؍k \K2@P9_xIHa-t#ץE/MS[keBEBq*!xuP<0lQ5հ:jamӮ覩:ρRNg٫/z0K'A$zUp^kқ:!DLf?“lTȔd0*`:n70 ~oOr~?Y#R//ڻ/mB|:;gg[ww_r4?~awg\Y}8_t'Q,x[ȎHBһm^Թ943BHuܸ3W^۟}1xi9@U~IA^m렵}{,øN@l"wvwf UjX#TE3}+~~0kj I&Jّ[=QBH_sQ2>y H!DiDL\&9S3]qSrCt@_ڌ",Ł7tte.^VzWX ^&ʁb.3)]䲰g9gSMcuU,f)4ͺYvըXeh\~xp4O&/G^ zu8c )1T$LtƘ"7%J{?a E܈J$ƾj&Q/[f}oomt4'30 m[Z6=LvhBpN !` JOf w_~I)=c0)-i֭;;NmۿrDHe$BHBej@Ȋ? \UpŲ>ץk TZ5T˛LSedW0Mͮ굪Ѯm6VQF*8c [Rl_fY@>$$E"$"Mㆮ[ι1@PF%.tSEhV4zm\ lfMi˜1?i6/m !G/GgU 9Պ|xsNӮ~p3E WYgl{k|zt:99NfĨZѷ6j=~jVimsy0o)R `:nhW C˔ѵ1* mWϫ0ޫmlLWC$p) 5y=CLkcGS2fAu5}&x6y-r慽yQۜZt81Ѹvzw'q͊>tTJP~aoLty;mB}($e|!ȸJ?,LDL PRtltWa L]p5cA,@5нѳY|nX%x_2]^ +S\]Xviֹ 7k-!%=iR0t-uLbK7 n輑gu^3M7tqiLa~DBg9^O'1"~$Q]Y#Ho2M+Jޮ4]ɵm"B$e1Vt$0E$f.gf46s~ǿ( P /Fg~{o-zq89a+F=5Mmw:yt'R)_nv͎x{?ޒ(i'nsA(jEX1(y+ɃA=!d˃~MV,Dei%^-r͚Ẍ́jץUjsO7Y̴ǻ fz3!Mw )?>W^y"f m܋i#3Sy{y[JPF7uy$@*)GnJ"f2RP%e )WLCܐLW#>WXMg9..nUPòixy,=Tz,ЀBY;*ЛWNd}|4`&Q3H"f^~=iA39c 4Ro^35^*fܮK3tnihM(TI"=?dhtޟOgBɂTIR) FEsDX1Zݽ;[g}G'C\n)gJ"2d\pnǮ&BPCD4K`o?R2:0/GONTk};n?٬}cn5&`0rv5c8/yrz~1/6 d$^sѶ6#٫["b,8:VfRjapΨhv"67l?x1j==j}ٟyڏ~a B2Q_vWן^fWfmxt8owV8\T(v!*睕e0 HPP@qM$E 3ҹ!H"'K{aڛ{! * B@QKD+-q*_ֽ\e*+j5_׸ej ׬mUji7jfWXZ\zK(<.Ƀ?0HDz?t_^ OΧ;w86O3J)g>;88/.-ª7>iݻo{;wlmm=}~8I%r`ɘ?!b+ uG|&WC{/χc%TO_C畊ݸ:Rj躌Ľ w;V}0nigu ^lbyEܛmx#jj5w>{yЫm%2Wܜ ] ,Ь {KЫb5BNֽ^yܼ{wzsCIZ"(80B"Q$x&KVp XYa'W|\Y/WV.Z(ר&3c~g]U,ͮt]MCK4(4HPp4c??/3'DICS F~O^ϟ?y@{v27C,˺yۯjhض]ViL(UBQYI`Ǟgaw ́/Gxz}D"io 4 p({q !Cg< !U,gIGNgwQ$p?5DJymDSɨy?h9GQRf77kcj?aO$ڰ#J1EE($e܊%K: .FV3c6\ x03yp5ן/b.\w)biK7tFjԭFLisjkfB4kRUwH)% d4'/'uswx~> fOOxl6v=yCodޝǏս%W 4$JUSXjџCCPQ,&q,H=?>Y[YfѨ?p\/zj4N@8Zj^q9 9f{;Mnx1p.fAkf""LL6Ùj5΍olf6.ͳN3Vc|ͺD\ {sb|]4kf5Q".O}e[u|;FpQ|_S(3McՊaW KGqfWjU5(P &7usezXJRn 1Tj{t:>Cg<7b!e_?|o|>BJ))e RI#p#cb$ИifEܨ]eZ22D ?F`誷v094;l*'Ņ&ORMbI;[WǣuHGgVb|0t/Vrxr>dusRl3=f% RktTXI˸ ǕҹS1^yÆ^2jSCF婯KKXuY>SȂ,$:{ fy(gQy:ZKӘ]ѫbe 9M%!,fXH׋7Qg4'`[ӹ;8>:y>KBIܠ3" !O%e2   yǯ*O.([h1w0!!JBL to#6.g"?Z+ZJґ`?wh$T^Ҳx6Ey=רΙҘ{k:7M4uu84u+iZn_}ܑĉxIo:xs'c)IhT IDAT;)TH!⧈ LY7M$IJ)2B) (Ao"7oi'r: Xb1B  B|Jc |$Gy0sq;J3 Y{#׎_XI+ #f8"|( @1_zP<(պ1 F.o"XY<&ƀ"7f]k@1P^Xj9K??3H6Ӽ{O9t4礉OwlUY.gg)QJRBaԟ̓؛|׋(E7e2 }3Vnl !dcBc3JLJLۮn+XuBn+6!Lgf1:u}_},A& þ1P~>nZD#?Ɖ¤7p7e_=6Pj%2NArsnE9!A hjfi,5Liږ*B$)^ԳV >;뺄BlJaamh#q ,89'Pp(V W]J>Z=OhT B)U LH&9ԽU\IzЫ%zlA@w$@½Օ<|<F̨b&$A?X_kkOFE{8B]=-Zůp+FEFeINuIB{+P'cLpDZfaay4y5FtxEf\M#!?@Uw"pj]"EVatyU==_8Y-OŲZMUq3{2{ :,pЋ!"{^2F_d> 'Hˤ7K( +W@y:k;ZGE܃(o)u'go?~M!ԝ~}h~fϺSmIvڵh@x@Et8\v^7 ߑk_5~_c"xHc}c]Zu,W|Q.V|Y-rU{yo^0&_~U77d{{;A uA!"3R%r- uǝmx(s;ۂ8{n$ {VҰz8|ѰLj$zgƱNjb]4uoQ@hpwjp-ZТk7|$QiN(MLQEyeieQH\_\(Q6/'Hh[պYŲ:OY1rǁŇ"흝ܻ_ܻw!z~O . ff/Ÿ^Xҋ{UVwϲd}:YnNQqg2 %$d*"Fa6u<>}t9_eeC(ڜ&͒~"1ԫa9[KƝbWwUiFŞT%ZŧEX\]ibiҊH'0*x\G6JKW͋n_lEGRyn4jl(?EѬK;jՍ[?bF׽=wl ,Ne̘jsDM UU Ÿ0-ʟA9|TԖ$̭I?<ָ?u;'aw?e8ȳ 2WFCQF˝@W{g;Od;۫ߢ->q 뫉)t|QjL!Q!ɠ:$+^v].<^ 77^Da"nqYYu67֯z]4E0_VeT[lڵ=Dq2~?$BGZ+@ޫ%@/*i^{пH:q1UyYGu$Hn|)+|v&{w^nבQI4 0:;_n7e4~SXh|5BhgpXL/[;HS>J{{׽nkWE+Z ^7X(4ID)?4I~9T*0 E誛'noBMY$|ʖ-K[Vns\UE9_VUee("$?O"i цbu[r|D>]kI۸xxVpk}x~uW-2qS[fxϳy'ZQFN^K)j]ٝhOwEifY1y9_UEو۽GuTn˻|"ǝw+po_=ؓ5l -^'n0EAh !p7zS#LHHl27Ƥhz3˪e6ᥙi(CBM#W'D7qxyrY۲>E!e͓u6}EO1l;jP*|ho>+}p4ee?y,>ښtFvaft>z6/ʿ氷A5Y[X$=O#+%^( J[/p F:l? --ZoY\TJtp `Q.H+eL*o("eEBdM-pj]%b3`(zR̻ߴ.|yOi\ոqm֗USl(wίfy[XǍu~+6}py,,/aQJ'˨Sđ T;zPN1@Ʒ(qs<|? f_aɳqK{4΋4яN"E pysο//^8uI_ǾԫqqvQyI?>*j/wVhR y#mb.\fP@h!f3W_d$ 0dX4B3EDp1 _"|otd}xf_akyS:nՍ·= xnUնlcA TE6|f[KsڬVC"0#<&E`2uո8Sp(obnӫip#=d n2̵,RT-њBkKKz ~| (2,wYSd}6Ki a.k^4i>~ֿwg ݢ-ZeK/hf , Rz 1 E_ _;$Lccfx?V^U dN@7,›U6I!9nqPJkm/knK\tu/˯QHlTׯz>I5Ԗj:x7v'= KӋ# 95ϋ壧GϦOYIl^<>8/+{VinUׇ:^lO=Fe[|7E֬cW#8'ۭmm -~E^3_ǟ>dHGFKXڶq[]+ I앋4Y`jSYH}4>ɚ"uUwaVf״O{$t H@Fco?/NVM㾺w_n띓?nW .umN'Y^Į!efsJϒY>>'GΤI+[EV`Z l uZ=&զMD&BR޿ܖ#Ge&_nX|6eY%n漇GO3vl|uQ.{xtDoO~jyҫ\rS̳_-(<lXD{CniJdztp[[]H^feQ~O^tw;dP]y{ݭtrZ-•Nf-)cfJE+Zh{n߶ 'JoWa( )>m>W(Rge|hbo|ڰ%>M^%\W_vNjoß􄣓olQrӎw?W ,VՓH``5Z/Gsy2muw~7M"- ELgumE0$O,!:ht}7Ef֗ϙeuҎw~~?ޓnʼ\ݷ+'Em,آ-ZhɊL~5gt< t_$1qo#&}0Rj>5Fo@wY~bU4uo4:NˢVdΟw%Gj}H[~{v;{0n'цdnŷgv[h@-ZV3_mf&`fkmUU*UUU=8x`"obeaN/R[:jTɯ?ik|Yr]u$KͿ㝝In?M zUe_,<>h -Zh"ԕZ93euzvv~v4=Y.4݉vc NQ'/ŋUv׼\$eP'a v2 ]4)׋_{#Js5[|uK/h@-Z}KrX/sz]#4[DDt` )`/u$ :oD$ dPGU@Ehp-{a+i/혰hѢEAw 0av3_UYVM\9P_<`Tʷ(QG"jS.?oؒsr)>eco:)rQ]45K:⌫vcջ&ov׵h@-Z`CA@J2Ws "]ފ"|d HU:|d`HcIѤh2PKql4oѤ kG /F߽[IUwOuv(wnstuxosJ_U"E+ZhѢ/lj.3gaFDRJ2;Pq?D];lKR͹^rT&=*VDuwC<^_?-+.AX\%W5&}=u"pUEDN/KlrVhѢE_)S<:!iD z#Nu8^DܧlGιZo7Z$)R6҃{#{@\$ @|>vF @d:zsuJnYQyzw[E+ZhѢů{r_YϞo76(;{Lv}TFD&l\c.o\ T+_(/\NŖq,aCHb-B ]o;.nW5 DD|Nk "? uQ}vջ^rWZ:R(a؜MDT$?e7u}fZТE-~]'B`sXwE0djoo﫯ڿs/GO3+A iQy} ssq׌rSr/c1am$U:F ]Ao0B"HbCSl!Ш"(vܙoZq=D/NDTU:b[Do&Au77d@āU_v*d'm-Zv h "E!5mʩB!BE5E$QQ)2$IJ$1+okҢ,QO $8RH(EB`檶el^zAF8,`CJkh, f7YE9_7ND<{dAA#ѢP'oI8)nDҬ=;{ !%S\QKI3_S('cC_x'[pfFFLqUJxǮf9(Rcc)R Aυ+CQQ1A  pqWG?S?Gn횢Ճ)7&Y={pM? ޾z3J{hR b̭WKP*O6C6w*zWnة|[ !RU%KM:;{-TgK; 7f(W[`G@>W=2A@q['l BQ'E0R T:T{*ߦsuy[2;53=oOf:wGww//jDx&Sm=.(sq/RXh@t%'{<{ {OJ4i,Q&$MkHk2Ző_qdH(RG֚5 >$B"Z+~s9f1$sxfD!m@9WUxfXM뼰2n[zIiꘒoZŁ]49F&fNLr=OW<hR=F\>6=q/7%(5I)({$A ~}LI_mN/ޔfRuv1W)0%\[qsfb4 %}T/Ů(t@YP2,!=\uw) DɠI1(2&s8t(/T v0I Ž^@|NDlʙ2LdQz*wc{Sm@oHVD8)$$AcV XWj^ +(82iw$IgIn't$("Q'H "Z*1j㽈HDMR9AԻH/߹\Wo|CA6޳uVD3 1R|QYn[uU[|ӸEU\,grZ.H)$E/wC#e¦[HEQJz^,Wea-HiE12`cjQB(BR^l*$ ~nl9J HKi*Q'(|B-^nHʷTg4k.g\NYQ 7BݨJ~u97+`/l]:۠".5[H tL&|BIOuv69o\$S>Qʈ@R/Q%:ѽ}fWG\/׈ uIOw1ή(|+q˙4K@@ec轚_J:'/ml)@z%|Upr{d2J\F TDuNcQCcz uLQe';DqU*~"K[U4JGOqW\.ܬBƁW;1*_uv( \p9cFT.uo'h@h"E1Z+DpZq'O,N(Rϟ?}ӣ#kָwd2 ~/ϳMX[U1|p > [qO s(0;/_p5M\^Pg)-8W٘=v1~D,xuLl}X7WՑ_\8`S=C呟?A6#ũ(]w5L/rCq50o#7}f^ ۋ"@)MsJ~}~\l)ZS7b_>[ϟx1%JGn/ Lp@YNTwO\uSBl *ܬ38a@d<Ł\V#$[l F~}i8Ƚ}7+{-Si "{>_TNP'> N6E_Ny͟o@<稌Q2h鶴hiE(ARd4)""!` I4$FH(ҡ>'8֤]\]Wj_/l>NN˥!x5L&d2 qQh}wǟ?KIJ@D x溮׫'Ozgz]2sGRFHiYwzA?ʒa7hhL 뢬*[[KX`6.Ճ?g'?ß_ϗ/\6,kk_tȘ86Dw{]%ԈWěYįO^\_\LU"yD|\u'~}r)/ 'S⯼Wm,JA4 "3?_5>P/'}D<l_–Q\'Xcx_RE9M81Oqs^L\}ٻ!* ".\eKJ>FfřWS~vmVlKqU6=WRJL)٥5\УLe#` M* ;@TXl% [`vD&QϥY0A2[,@G*rvc׫MBPq5W a W1;[R6niL+ZIaE5ƑQ .Lvyh{4ϒ44"*Eh"mJ)\־8:zÇ=ɓ/^k}pooΝ;wߟL&(4MCc oe*xZNN/"#Z9 =ɓ'|7|*w. hIz;w޽{ܹ3~'q(E{YK]z}>[-VTbY-c巕WOT) [嘛7kr.U;c(qqܬt:$ؕc&WX%@`ļ,jW=i*_m9oYsk&7׈pD CM*츚URL̄|\\/#= UG\q:R6E]ޮA6(W3.gg9pqI_[S %49"Rԁ%) Z*^Q/!oq>Hk -^G/;KH $ieYq,1yƑ1F)4YiıR M 2HJ"zi|>?;;;??NǧgggUU9綷< x2lmmx|ѣgϞxbZeGZqy`kkkgggggg{{{kk+\L^).5 riEYWe=6VVr]e˵UYypxRW+D&!eX{ǗrGJ :zѼyAXl ңm* 2#5F{@γB$%  aϮZ `{nya|08i yS\ #F*;0ʻq 5"{lS>fW/q/oj 0P:GTu0ꠎ^rua_Eq0lԗ.B1MFn6ap|aqoҰm=e+Zd/d]x#Mqh ]h4HbMDw$Il"CZ)m6}cBLrD l/8犢XVѣGϟ??::*$L&?;w~ֆj,Yq9g^=7 vMSUYuceU[q:Edk?Mxψ$ )o"֥ đ"mt&1 đ8K4Kˆx)MEJ):ti"J(.ŗ^7}ֆl>T!gϞ%N;ccLEi;wܽ{7ܹ3n$ƘצG_rѼg\8ml\,)+.t+KEԵQllu>HJc$uwtNf@k#r:٘IڋmPE\θ^{8Ћ.a&@sv =o|47Žy`I#QܣI=/S쥞Ց߅; LB&]{:榀ת)|닳_j+IW P-ZТ A+2FqYBngBģAɒ$B41IIl ZV)R&D3̗n\u]eQ!pppxxxttZRJi~8N&p,O4NbDb$f񞋢\UՔ hgh,uykuX V97~9VW2 ELҍ͕\Nb'b1"jM!)EeQD;5CZ)c1:2:$ ѣPzZJ+ Ɵmf)z5]u]󓓓???Zw:߻p8 B?M(B];.*B"˝qc]crY7=_WU\Uu\Ή N 8WRϱRR~Gb."(|PQ'M8wՖ\{KIWq|$/RotHT ,!",ZpqWG^DY6lo,\Ƞ2C2H&@:z۳QNrI/Tg>F]WWgƱ<^9RPS avlc]j2=uO>}Ssn3yAE+Zxӧ&OZADij"Yu;i4Qyݼ%DgqiE.7s/kBuGpl,j*|ft:=;;[,ժjh< Gx2F^i!F5/͋3s,ժ(릮]8 =։gABTrAy/OU JG Cp/m!ER)\6G$I82@AME*tcwȊ tyr8999x~囇>}tXTUƘ^|B-Gp8L47Snաj0&}眵~\VhrfjlQڢ 12!ֶ)u@BM:J ""%cc>QV\* FUFBR*Q2vܬuӯPEd2~ńt&a\#^l)f/X{.LJؽG$XBשGIPNM:ە73tq>{hʀmI b05g)IQEWq=WI)JG>Wݼ ^&oU 3WӖ0uYHZDiq-ZOZa8,I=v2=vvyfi<1J娮иw2PG^Ul6;::zӧOd=Ǚu,l1]SjU庨jy\ YP՝\:]Em=S=Egq3D  .BPj36C6(ON'8#{`G,=yw}ݷyӓX3s(vrxtB!P4C88iG`4vtZOe.bx  "V wwvݤwM,qXkđtGYWȞʷTW i֛II:[ ^p5f*¸CDV/FKQGe[-6U7uLI] gIV{zB5o7.Sҧd ʿ%r1D>D@ 7t('Y[rqFohR_/[.JЎ+:*9W[.j[){-a1-uk -^~E51 zdoa$Ngq$6icBEJ#4.ۭeY.|/W0$i˯6&JUmǧ,ʋƺ6֋ ^1Y\6-N6My 9E #2uiϗu Qh8A˳ӓӳS_~lG.d2ܚwwvvwv{}OpTJzFx˄dTg[uФHZ>W(P6j3#0hrTF x{6*Žs49nƺ*M ][-B~GN(YT:_szS[F9%fӷh *^'Νv~c̜s4#G _*~WS:Bh"B*X+sﵮRǻ5bd0E! F [+ɢL6FdLW@(.km.0yg2$@Aը˪| nPN5TMOmzjik.8_]z/m"nUAy}&SYF4h@ׂxqv7Wv׮l{-u8u.!@߅(ޓ44+ADyaFcXZ,lB"ݷgg++{@A$.-Db$6hww;z$h<ǑsJ)x@>|(>J'i1_&NGU47y< oO_ /]z |?D,,cYBs%u??|fjR+|sRE] @iQ A徉Qڗ uv3hjP괩?`Ъܦ2m)& IDATnV|*;;&@1 N˖Y|qA;vwYNJݶ-cT9P`H61%V >hm2Oe Y0 'n Xm9x6-"Zmө { kEݿKe}DD*}A5"+*ZاG FvlrjMł5tRs^l k ƟM2%uuSbe#<پܠA#baR+Fgs^Fpxdb.,D*DJEU9֤ KK M0hݖMNi¯kTĚ:Dl:11_kEA[tB;S*HITMOMtfӗ}bF&9!f}&MϼD)*@$$O@m67#vi3QLPA(eFK A b uBܬu?ը ,99p6om&i?NUbo =3TA> FTgM,}" d:ӭA#1?D#yuwҷW֖>Z(h>_'|6_4ͪJEE"-c1" DcX$%!R7B)p`Nv;`D;ZvwEB>"x'h?Y\Gu[W.Yrβ"(QinԊ'H>VI)l kmYz_V߈z p\ NJ.5h xhөmopy!*TI&&>6!}ujvKd`Pk;Q̟NF]& F]{)*\m:*}-D`Spz= 5h*ȤS޻»?kUjgwm6:``/ؤ{B [Fh*4.uPWD@L|򊛎֠.mlBU`ECU&=}Aq+/B/b%ig=s>+s&>6ё5h@?(%v]Nΰ \dkmIV|-t-II\hk[DJ,%bݽ cjp>$% ZkTT"2|S@ub#@{-#@/}seǁqI<m6iXdz8e@^xBvxj|Eur)h>|Fb XF֑hhB˴uz@lsPB,*C/6GD]l9;kTr[XFϬ2֫}[쫗{ѢttDHTil2AS<-",'/Vm=Ke=2OV&Q F$hl6_w;g[V*Jʨ 5ԯ|M6Gl6K[D/Y`ʐ:ޅx^!2GXITX*y%sxT '<>|q£" <~s[&X%g.+6[|kb*5E(E UiRuzgwX뭯(eoSo*UU:/,/(],jLtiVH!gnO*mHaΒ 0Z0FVA]@Z~;7w`B03* !>)-6lmoħt2KO&Q^J}'yvgJ=0p$3GQ/l N]FhPWļ0m4@*5-17cR UQ22/y+6`TxIES>Yb缐낤~p:xrrN.pVϩjDQ6ߟXm֖Vް5X%JLrBV9yՏ@]pNًt>[}Lz ¯7K49kieu@$ebT_=#r7Ӡ >y#o|gewoכtZ,lur\E*.'4͍ E6 9̋ZT XLK<{.CGN\{NA!Pt:a\(t~7lY-"CĤݖtY!6&8UQwXURɝJsN I5֒_xH]S!^K=>g5Zs}ͩ"y*km|iM`DݮIOX ?smW땁i@?ns~cuAt9o&eBl.4oQ}6{[kkGnZRmRJgYX%UdlNU\I%eYJE ȯCH Z]T&fd\qJ+I=~Bx9ﺮ\8·:p̎ƫO^BVa?txYf{(jZRPʄ8vjۉw~>mkXM`LwQeK (  !L6C@5b^k-  Ihp/. BPg.oocS/ii,>/NNW˨\2 SVV+ ޘV"Z!$N Yu?sp[nP[nvn允Rpq^9݀1jaom&Ӆͩ (2^@-U.E4 cxlu7?{ig4vm|J_>`|8Φ|ee:$?2˙i`-5)ŴbJQ-5f-XB*e$IQZ0 _| vC;m }!*ý?N3@_ {I~r,JfU0F}Okmߘ5Uj1`^6$%6_b2fsbT,w7m77A#| $pY^lu/muwvyYk\Y<7o=:\,"溬yӚUZ,H)RpOwV1!AB,!$/tWRPxV[nuZ^+}_ u1踵|>[nݾ}t^4OYAk!Q8RGI~t >f.Jm->@'%yYSnK\TX,Xe, Q3Ҥm6GaUy AhI@ X.u}ZW;fG2(y3OZ:qF8!HFSmhf45jM%qf4/ ucڠT7_paZ촜 [kNBuJ)eQ ig>yZ~駟V1VqYHA} {֮]^X96b.o}p:YIa-=M[FWSgbSWrܺͫJ( *5 UsnTZH!ƜTDԧH9XN-$PBPnf`I!@I)%u%\s~v}ثsYIL&~͛nzt:U[U)U*Gf\CWOzcleiVe65sGJ)9ؤ}4hРA#kyjϷRmv Ǔ_߼sz8Ngʾ}rjnΨ e?q-et2B3Q*`Y?PP[evr.LSSF2 RXhC+Í0IRaM (@|7infc+f"FQt_׿-˳.ʒiVk_yHPJIGVVkX&(/+4tqKF K#~ 4h@' zןo^4\u9{+ k,飣$M3e^iTkYrj-B쩭ЎSy~1W3%,y1E-c AƑ2Y0 ɘVd ,VPp틪e҈t -A `M0 ]ixVO{{~o:a@t:}/?ܹsgooo2i[?^zys7^`QLGˣӴ(Ѽv=N@qrgsh뗜QEU5T`8!W_! lGY rOւx/b. bx1[vdakz_.{^J0cs(jߟJ.h4>melИ Zb jc,""8X-Qɺn F;I[Qo;47IDzB]-gU)]027NBO}q^0H%3q) 8m@  {c!szwx%Z,gi4)5~]sʕݭn8B!c,v;.;4m@8]{s 2O47J{L 鞗5:1--5gRN:/T,󕥟xrfYS"ֽ }G`Z$0.|\x~~8\%Ѹʗ':VݽvZAMxqw>c1yy{Xf{GFA/X|yiΖ-+!Di9R(ҠA !@g}vveYݹí~FK9ts7ƟMGMoI[XC!Xεh!\0|ɪCUe}D!X E,`GKZZ~S%ۭʷj˵$n$UZVq^=i D8߿`׻1g \U2K4(T2>pnot%^^ϯ}}ٵkASJ/77qZ}ɴ|mi*ֺBpJNi`Lk$ֆxZf;ܾ%>!·ًhРA@Jo{ `-*go9ytZJ)|"ĕ{o14Mww|~ (En zg`/@:Thۙ^vNb.άӐg뜥Qbp1[湟wj#[NIS%wev"S"t0L:t"U\:i#Q3AP7 ث^.Z.x =!U_?*IL.*c@uqӟ}[[Nu'|.0EGHB|_ AT`rf\@Mmdx<>88?ܟuneiРAF4(%@|vg]|cLYӭnQ)͵H3Hޟ^K mݺ=,6Ư?Rn+gr]^@H%5uNox4 %Wa7͇GQG#h%咙ʰy-z&#mXZ^?a=k BA0<3jWˈ`HKkSB%Ԟ'#q+ϯ)˲V4|{Spܖ Ýh?k70)Zk+UN7o㓖 IDATG<O4J?\Ϲtxxx||+gd],bJ#Uڝp<-ͻZ_("#".U`N RScq,s"!Bqj )@V@0e.sﱻh݋uS2HK͓J.r/E-|QB -eJ(0c@dQy>W5 Zfi 38k1L+˸e2Fk4 Єg!@ qRۯvRu+`} ~$R~@f w?'LJ",,2ᴆybL4U@ 4h`@(७7_l\]k7cUҬp[U^5\h.Jn% k ڑpQ$w^gOYdPL?1w;v4}#!inrcz?{Q%yʆP@c6سzcii2 }NYڗ6Nã~HaG 8I[]c\uQɦ;:+Q58]Bego}<ܑӀϳBE|oNiLH"J.ro{Rt_NfלZ$DV2/޲K d`YRF8LBҞsj̆*pzZrPVEМnwV7?xB f!\ߞ~>]{n(%at,j Z9nRQTkj !\#S( eBʨQ%Ӡd`9;W/o )mk1Ͳ,>go&"L2De5B ȫ2.v6yA^,~fٖ3ΤVw$_S$`Nb/7KH!ޖ_t4j~,ʰ0k'ϮWzǥn!P/JPYuܢi% ˪唛(aNJj_-AZh1O(].JXjoq}0iRɨpk1RkhI+zsq?ԏX  [)\ Vk8p`rIj4!2mZ:1DiXw ɋ2J^Hhtg5BÓ|JE>x Bz~Tszjz^0ؐ0 nРAF4-PJzmnp^Z(jJo>w&EEK©2K,yvE5\C^xYL+q_pM,G9w2A#@Vrw&0jEWW[h/ (*$HA( ;Mk jGZ0v0^ AAߞAƁւ$a-Y]w:+N$ 6Y^sʍ0Y^-aOvB@J N Z(rڶ`ZUYk-]8RjkyU!'$/|eZ/L|JQq.vfB:_{*_P0VNfR97'+hhFutb%tM,+Urx1_ƪCz/?W#'V_P8\Q$5۝U(@V ĭ;ڲ(HE%ZF-Tq܎JW[0m(rv Oh $`չ9Y C$X2-e̟ԓ U+J2FETk)= _0<k:\u"bYL֫1/gdt?}9ٿlx5?7%ڨy>̪2Mw{ 4K(|}n=Y7"Aj-ZT%*zX>B9xǙ JRy|{Rn-vs\ӫ.K %wШB3.yc@M,²I8IA(H8/ӯ SiӁ*ͦipWae֗JP/r$nvVF5mzŒ& R`M]Ce>w7S)bOkxsQg# !` PF@nu|O^cRbρQ۽NX?fx8>MMykK)91$;QFItRj0B"ZJJAR A;l[NZ}nޛL7vB8=:߾w:~|ee(e(+sR4o@ 4 9`*VdR㣣d2ϗjʲ37>o6]Z%YJx+Ŭ XPňy,Rgd싸'+sz|x yd+HjS[ 0SDf_^H%yFR3q fY tZ 7go=^`O_8=X.tsSb~ ;+;o:e!δ,J?iQO'!0Ƥ`$o4hР ^F}x<͖euK¸ Z= -  `OB^|{.OʰB[DžJ leU!>z=ZNv62,T2vˮ"S2(HZXT[j eJn856϶p2 ypx(jlbYO0ډ3#q>s2^9 g# ^tԌ|-%!p LLK;5x rc-^u[0;=߾tx(OKc/ HXxK#ǑP*J~7y4'V f^xKJ6N\5 4h/;KE|>O4MӢ(ʲT/aNr?AgKHZ@B:uOރޑGK,_֩ꎫ^O}xJ9=|S9EO.㤵( 5fzj9V;J+WO/uPtJZeXT0 5vSRL\ 'v(Z@Lw|r$tfP*QiFqyv{-+c-y1<Zε0:T Y.i*\r h/#epWfb&ַuXvKfoc3;mTo[Yxqt`q8Wx&.Ο"Fq`{ORfXVI' 4h@`oo*ÇcuRx^ ;d>5``:nn;3 h&9ɵӫuu1O,Oצ7HB`(PA|c0[\_)οǣOOR㏪.Tkvx籇kJRJ)ckƘR^k-GUK9Gq8Bt$YoL>ii^+OrZ tsX\6O4I!d=)/(= R•VW Y\-sM;{޴j鋚*q8k<uqZRJP[K鼮gJ{VtՈeq0k[bt^ALOG`_v4oLhyHP+Ֆ/ƝD0ޤ u=ZPH(ɼ~8kL@[zu׿2{G&bƖj5Նi)1Rb=—_ Ɓ1U`=! ùc BPv#h6d&zrܩ R0ƾGs>󽃳g;',-JcTRWmm.EQHQJtm5n:˳LY(}9 qj5\(d!_cR|ϏQS YG\);lT7J,]3-~y~SNl=K\0ԍrN:Z4mдNs4s2:L ųT`sëa"( {:a{YZ 8{\6)ƒiS;0e0vmNRm.EiKg(K Vq|gܦyq4ז'L qtE!oJxZO3 a|#wTkea{q{F#tfC;$!d=֞O,esJ| ˉyYe]xZ. 7'73/}XYtݛ !-- 3xo`awԾvҰ0xEmzUoeѼφ]q0B6#^<Vf?~uǔ;?~B7V;G $Hg[zqT`̒+~Gat>!ċ B{2U"/]UZ& AbڪN+\:n}׮őu9*`\R}CZ/|{Ь޾w˗_=G,YB+mBj!$ e@$N| #Bi h,---6Xw$~z՚a^37كvDRs8kwv_,sK!/{Ϭ]o>i.ѬE_7Gyk¬JGB/^GU^1Dkg2MM&LY"4Σ) ^vl1nYĕdE1H͸L "qF A )E FMQ8d f= AHoT$/ǓA:l^8cѫCsT${OJs(<)G R z-Xħ#Q&/N *޽{Nc,giqf\{KkqSynLi4CmiU`kW͘*1Gc1xJ#lSRTkߺRZIi7Jc~mh<7fžo1&K€k(djj8ŲFH.BPF1Bc;p898<}qi9iny=B?%u{_['Gy?MVFyThb{,ӎXKYFe2Oi5I SZ"gETIk$70bj!NonvζڃYӝKDZc1W1QkUzGernp9bxYE}2\I:V;"1!B0* FJ D0YPD!CnƋP@(QRPJ)%n9Q(m4ҽl47Yan ˋW; BYׯ_|ѳy^p@,-j \EaL:띦l۾}7nB+svۺ2<;}V,>dך;jn? 0sGR(C£sw#a #h,՚+%eFLkK3-WR]~!, Da|-ZPEaH D y y EHJ1!s׉Gc<>MNfQ6T'J2c[cJP-f -;+ qxNƏ{Gyjܯf4- Cn5  W+Jyސ}N'c!ܔRڨǛ z4-zLl>I]<:N{L<Ê8k)syB-#=؟O%&k5hl;6OЖjKe8~|q_0#J B)I)`aqZq$9ő"\p*QF9;_/ fyEy1eg`>ӤLR-4ˊH>?ܸB)J=yv_@~U4/doR4q.Àx<"4wW7qw?tyQFi5|>[gIҘAaZB \tټ#\5G}cҪ~;^uĿ|trb>&`1&CU+)`jF zQIkqGA3F c#zic<= GQdTy:wZZ4(ɿqloj~ȅ_s(h4Vq6@{u<_|sdߧ :ڗhY/xykn)-Y⧾VU!s{JT9#QqqԢ0 0%> E(R).x3'c1J %~7Z댱yQΓ|:˦l:/r4I4IU몡-1F@v\ڭ^lM|g_?ƅuhj*;ƓjV{GcԬ$x k)xkvM]c(8\ERpޟ&i,`xhkӋu/|b-ޣ+wh- F1#Q3wNsQ( Ic3^0PR9%1]zw;sXtyLx xOf<5I8G?Ex,pcueQ0Sjg>?O SΣRt0ؼ[{﬩ǬsBWGjB''GqHO1{BnUۺ>;|lhz:HA"k!]_]c !O &!?ưwe8qjQEQH Ҫ#2dH!e39e`km/v P VkZTJ,g(񴘧*/1Xos>xZ&3Zrmvfo}!4%hVΆIl2N*RƘٌjYo;^<ͣi.)28,Wz( eܘq6TesEcB,V"_0U3MJ0E!) )gsqΫJj-F`1ah)RP)X B. ;k8(>>}ǧa;놓trvv8cBz=k:3i|A?)-tZ1έUQUqۛd8'gӲRSj(c\x?'3_j|{yvB PJ)9%2){ƨ<*cIɤ`R2)\J2s^1;1J F`L)!_ޫ^ٿGyYg-2UV,+t6/t0L$z:~cHk+?_yn#yޢ,_q~es(INl6( @J)F4W}XG/kzMef60a(d6;9Vw5nJea<KrI(ιw3$8k\ Eas*3qL &s@2ƪ @0JwJ&TmzB{笍s;B=uqeT91,u^Y^`4;>Ul^d-J1Ρ??=Q H=;[wVzT5*cg|Y,+r7 FByi0t:L(V}kw2:Jh+{|=~vZ[knSGZel6L&'''~d}9.,_[,W),QcLGTwG\.WPӳ$I@HEz˲l8>{ѣG;;;'''iv:ݻwg{d]ټ!c !t,>;99Jz卍k׮---F0nYj6J۲TErؼP#7n~[w\vmeeijq -B/;v]Wc\/m])k}y١TFkS*/TRv2OgY^4SIZgɲ2/tuHuճ FNK,77^麟xGGOwFY[w=J st:r4c/|X/vSJYx m41 6λזz M)9BSd2GGG{{{ǃSzz^W5Eu>U)|fViBYVT&/ePa+K*X_mFB eFkkXC_4e?_kvbsVժUxTmWyB)gLGaH9;oJcGQB[ULeW; JGN9:P{6Q&RT۝1BJ[Js&%b1l4Ӄ{Ͼyx4VJyq7kVo޼y{ݹsgaa!?;]\I 6еGXkZ). :/Ty(pUkoNMn+ {:4iYQCEKF.-VXi Yf{;Mauma#o,98Ǐβ,xqqq{{߯j="DGQn5BUeK眵a=ZyYy^&Ye,s)̳TZVTm96Z*ˋd<-3UZKo;gw<|B=w Zf+-ZF`TY#1VQNE8 VVUy E)t:ϦO_xqpp01Uuk:9t{;nݺvjB{mj@ʲxgg_G?>NRUBqn_O?O>~z)~dUAZ뼵N[:I<8+l}3yƘ>Z7nX__ja-w>i,O<~/믟>4MRZպ͛7-f^q|YdԜsJϟ?'ONNNfYe-9a.--ommmooooozV-kjjgc2EGtQVQ*EYB;ĬCeBR90.z.:{1Ff//o/=^X[?>9hf}D*J{O_WK" ݪ/k5}c@?*XEJ[TX:X+(%yFDJ.{g7@0R00 !䐷R)L !sƥyct2'`0 \kuQ 2ʪBUS?^*yM%RB) àh^~֭[n\]]t:z kՁV #\iVJ%I2={^=<Yss}e Z嫃տ*:TPrߨq\=k>^MLI>|*p)0p{ IDATWcbB(Ō%g #AS\ !,t<8d4I%,Dvas9yo|Y{1RDQl֮_[nu:8}T?/UMH,i7|׏vvO,+28)#)jݻ[o---A<Jt1&dZkm5Y:uY ջ6jvR8¹\EQe5M)Sjc6JoG(UAr4EQ(I\ܾ۾n78t~xMg>󓓓x !8^ZZj6Fhj(0 d?GvFU٨I)_{bqOHyb2Iq |cԮg\~6iJ)mR8kZUZz^Ղ SJGQ9P!_a$Bz( !`8r%-KGh.`#JJ/d{>nՌ1Y!VVVvmZQA@)%Tǂ.!}Qyq|9,f5jjf zBZJ[jg{:=aj8]LJ=܌!DvQARzY_Bιx6ϕFVjݏ9C$+ֵ;k 䄼+#{R_vzr%<~t ?x!{1jZZF<3mw`V&c8R(ͺR׎cvլimwi~|/ G!΍F+wPQP#J0%3,ie,t 7zV= !cO)or?"qH?FV}~ #~)|#B0%19aHIPav;V##jƝVMJQMS@v;[K!h*(K{۷+FעF#Xg#=¨ecF1c9"" X(dFح,:fG(E ׻ե..(1?BcVf+dP羫gGrLmad)%Ψ\JUđ")laik3B) A@FLlot5*Bp|r4KUc0BBgc#{;1!RFG{=)4F{g_-1RL&SJ9csV NÀ B4FNrHs&6qy^[އ(u0-@Hp uܺ>'x'ObEvY y89\ 0Z;gJs .%U3yUIE!3"2JB0 0{oTkAjQV1F/iA84s [?%Qou?g, [tMg<ɜ{"d^sv^u.qLY몹eUMqJI'I:&I8LyRTZ2JYm1w"@Ho?ߺkQ0J!㪢0~Z眳# !B8"LzwM_s敖߱Q9/~1=;G=FyĹ85p(xGIf̜ I:?njC @@@@@ޝqw򬫫n4 @ H%Y%˶l#1:b#6b7v"v=3ÒYCIg}33Ej' "QT=/9@@@@@@@@@@@ @@@@@@@@@@@ $~s.]UI,KS}p7OZiwy\aZ(6iCm"Ϻ|HlV&՗U%H9$=ʗ#IRH۩%|$>V6beG0<-\mh0XyP`BR{]߲TȘ13iӴM,ZčD=hrtI>6J9w>fKD7WfnE>yp* XG,*KTgt'M|R I-9Di@q.?` x*  [C^$ K$&)%ɴ! +5ՔbYvY`ּc"ۛ7rYuT8jȬ,K22gUIW+MsiOVcWJlUf>n)"ieiU-)@hʆ YJyP))_OF1|y;_}ēܼ[I2`mUS-KߌWe(-$]G<_ŽKYϬkҮzWDjv:#;ߔو)Mgi²rͲX; &  &jjو[ePXdaIJ,s57mkJrGKX=#ɉ٬&+jͶLzg֖01g$EZ.+MUHTiGv/Ϗ6MqAWҺ*joĝcc|HlTS:S O1_e{%9ˍL|-0D2/UrOZs*dLˇE7z~xlƘ ZtРO..W4EjRNrUTȘ ;ElyPqR+f=`IP-%MUmPawOE͎Od*ssO;̄M` c!K zK* ;ݕņR5&"iX7i)Fo¹}}y^w4j33dfZs0ܸ BƃQE~֡Y.iq~G|Sܺ:7{ǥI%W-sNuQ"i؋JU=t-]se¬}7f7EK O-1eӨs h=Źa0 )jW|`Uou\%x][t. TQֺPǾW,aM-O;]Ҕ¬t?]:?3a\>/ 6)k`<50B4ɣK&)eiQ$ ETY伉JxDksZՋxk WaXqt$fr䝃 &۪ѾI_w#֥t~pzʬc[ӤM@]ēVcJk,dK,tGTOzyuj]ҽ{CԂ<>c=hw %C[bʩxyzJ,aEbmŲi0M+B،639g\gh[YV?V"r]kMپhyU)NSђqo9zJȒ$ E"eOS%]ܺC< @œVXJ6Y%ag媬WZ:lZV(􏰖ٗY\?Eϧh=e*dN=c+3^ ûaA(F-^dݳ]zKw--_O^:;WX*F7~#RE0{ʽs=U 䲀MXʰ)6vٶxʰ쥒X]9\z<ځttG/DSF}X4UӤ_&%4 IDAT/3XfjO*7=bYs 11Ԗ\Sھa1 ~7k,&[ " +xni4mX2VR`g$ٺxXUW7lh~Gtc`:dL ^t?6Ȳ.Q*UTMy)Nj[/*A%V2eKW՟m9%eJ1G2Lɔ2el$m$,K,.~P{7RSK? s{cr6mS_)+˿ݙmb׻x\R_vIBH$BS%KrNۘ @ Xbdʺћߒe$OepԼW%f"O*k%kҊx$ff ) d)$QS_ɔu/.nW+ų]IŞFJW< VÓ-wOUi˹s[%܏-n$f^튯yq;,\=ZibXk $CtVω,4MgInb vosDah=e)Fy~<|b kh254Ӏhº)>dyt;,f6əZ܅E28̂6O%gd2o^^e}\<1ƒCeR۔'fH,XUBMh=ƴăδiZ))+BQs.bveT̯O^j#hܚ3LdτKA\PܲK4U(g%>m'Gv뒪H$ڊ@ oV"iV(jN_[WV'v'C977 8&4Ui5ڔqngX*~qɺ&ieiͫobY´Dʰb k6bNlҗ-Z9HnjIaV"%b `za6tg.cZQu6aM) Ic:J uE+`Qis;j>WB W=KξGbeY^~y !ϯ U2s/%sQlKG?r\[#KR>T>Yw)E2zBu#Y$1#U듆)$H/es!W~w`c ^ҏ|.!Y(e?>7E7G%7ez"G^nIMe_>v^K=/~g\NjG;G6~@EUH4kᢔe!_XP#^!a1qؒo7h?Sqo袺|"BԗLwO(,&tÒBTL|iU1,K>Pwkv:U>0j,yڰ]}7$2-ySz'~7hCْo{ wۻm%/jaZߟ;~~3k'ϫ4o9q2/ukяͣlFįl*B NPdi!IBH)3tSBX0-i>&SJ|b y*e%CL}KMl !}\d-F4ܣse.5_RmwN~*0'8wm_xKoB~cc[ʧ"7%`%K~nsD+[ !'Ǐ~rݑw?iIO~Y35NuUۧN_XgYn2Í}}.s޸ga2̙Wu˷ {n?~?MΤPͷΜȳR)BwO\7eE:߼ձp}vu>q'KD?xdt6OK*מhqe:A??9ԗV|A!eI[z-=B kXB%5->!gKn !2<珧>a93Fsp~ގ:e:=n.h(B}{R?wp?]ʏ:ޥ&Jfl|yNWŦ%Օ̸swZ+SK8/ur_Fm`"\=^֒3B&/jB"W,fz&-K:8;+~*Ζ~bz}_S_xES$ eE?:yx島/VՒsr=!x,Tcst֊tYeSOK[eIduIȕ%ĥO蒄'Յr0xJnO.r<]_oĒBU~r罦ɗٵ+^jZpLg{[?{-|XӃ9~QwOxt]=̳Ni*󇮖K&K2_>3^.8-ebaԂ\ƪjE =]{'U2ĒZ}t n }DyO, ׯ z!2w3@?)eG& Uj$oF<;ϴUU"'C5(+'w(_/IVko1%TCƓ"=Yw|`d] ߉{dMGKy$b\qsn yYR1PA癗ZXm[9QKY+j"X IVcT?RS la Ny6U{#6F=%YBdȢU1?Y4\c=n۰UuI~Xʮ,y_Bo__䊧˵#4?=xoaoD!"g;F+ߥhB{wR~J˟{DzhAw,k]/cm\E-W_?Vut}&WAOg\+ϼU9??60]g7 \K]+>8"q$vWOԗ!Vx:ODy7|ീ'v'Wmqkb),WZEeڏVNXs[9s|Q7ڑBSe3@}owǎRq ~׫/R26 U\jj!X)SW*!E6%F1B6M%,KO^=)!|\OԼ_'aG[z_Dte4-=MK%kiǏ,/ ;5meMz=yܣ%9j˒~tO U1$!4{j ڪ"GZz۱+s]3rs6c~<^V&xhz#J&)SNO]3s])C/XVN˖S)g^1]9ؿ0|ͽBw"\2l+/2j(`?|>W\1zՆ)bw:⛊F dZ*҃_c] >iNg\_@"R?mZC@Uh_=s&=qannzN}(]ҭM$Q|Y~Ӕѿ"r?LN!DwOp˿я*Džo޽+2iuwT꜏Vz¾!.lKJX״P̕~sOo=vsD?l>b!J/5 !*s7.$R]Ml7/^>(: `O*]{vUo>Kj {sg:sMKzu`{n{^ήgwQ5?~硘۴'*}RMj[s~l sݱ_^K?V޹2E.O_|1˥ҳo & ۷w{wy&?]|ܣ%v׌TB_}iIqݴ$;n0\9x.c_vI( Ӓ^k8{ma iI{gw=WdlUk_.'NXS_YQإ%)!_z{♝eXLKz0Y^g<[&ȧRw=#bh~z!9a('f.czدhB3\K Z~vmcm-Aot4o>yS]Sd-|ko֞3aK_+RdJHRLxtt5UVqkɤcX%%Rږ4nb}ΟZE ǔao‘KG#В@llɒGsKbD+ci` ۅ*36Bcy2Oqkr8\=,[Of.6-b'KV;֒lʲFgICr8艺")C$whd.^U4Xq0L9a(;GK\qM15eIūm6ԊJR웷=/v>4E/ͥ*wP=;YjYbpdO,ڞb|;n;8*%5zͪY²$ӒR0hBE` oe9{o.^)M_{L7ouz}2OW:j3?|(br5"SkJˋ’dڋ*~NqGΡJ E=9{Ͻ^\e2PFS^U6_{N,{ G.?zW6 /s_|"iI9wֽ~vp*ꝏ8/R gs,e.t,xyͧg%ɶ:&jWB⛧O*`?ryq;^|>LICO艅~ww]'m5,Y_y>l.kr5m0<IGn-i{]^g2e KM9Ǿ51.5lK1҃|٠Z+۫ 3"pV}u7.,laj };G?7Z*gAmkrg q{\w kݮžs>ko=Mvw%z}m՗7pYZd`lC5wg{m_w3U=# Gursֹi8NeI9՟+W\GV""qWX`e`vDssX[6_s{f?Ò'{H?nΝ]KPʽec lhP=_{'V\t|>_r,۲4;J.&C 5x]B7Fo M/ugn^Q,<2-;W\Z߀ ) KԕLg0o։ VIDATTAvݶfiızox|3@k>[ҩ:6J'>(k< b6Ŭ(jECpҶ#b>z$MdZpo<9R2KpcnGg%_}끨7"\̚F5ųG}yw;2j4)/돰n Ud3yTŔ%KBB,E6jdx[Q5Ja+Ȓ{O z Sxf{'VvT;\}wpu6!窔^=aAU*;xrߤaےG[zuk5JTb6Ŭy۲rؔY_E̼vdm/t|,xVGȢ=zO-r5ME|X.fj_g&lczߝm`Kչu)7rC9;MPf#6-ꉳ .G}cw[|1Ao?]9?sS"wN]iI:NsR-KU_dUWq}H)LI=~+ ?^"qߟ;fm[bPz 5` l#jJdoa\F'Zm#TFh7Z^5yŽK߹gb wJT]3y2ϼ{.t8w,֞Ou8Ƌy9d#SdW^;oo؆rPcվ#չuW~>yaפֿEKb:={{_#3:J5kU;kʒCW_wspdvޓ0mk[kYG oچRtwǒL0sǒ2u/n홝_t{{Oay֒rg\(1,Y=Qk,zh7,UZbb3f+e"q׷N"mm9,20]-l j"egeP)Cpv)E2'tgHOs9^`9R\geIp؟zf<zuz Ua:߹u'+Wchŧl3"rwzv>v2z~Д P}k?re_}}Ug=lqr.J`U^z?Lql P_҃NT򡹨;gsxaKG"e?rpf<}"qw).Um Sog%tW`oDBvtc`ힺգՁ٠7bȲ)q1br_97~o [SΕ=5r$}ߢ`=Q⺒B$ 5sMsIC`ф>e |9 ㇰ$:-IENDB`tcos-0.89.93ubuntu2/images/fondo-1024x768.xcf0000664000000000000000000061530312260610261015172 0ustar gimp xcf fileDq\Dq\$gimp-image-grid(style intersections) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) '72T?XHX\f,p|ޯ;2e4 + consoltux     %y+''++)<)<'< < < <  << << <<G<<<>BXN<<<>ERqQ=<<=AIS`r jB?=<<=>BL`y ִhP?<<=DRdw ž|[TPD< <=?FQdIM^ŔeG< <@GdԨrSSOnɗaMAA<=AѽujÏfD?<<<ҹR><<<䷃VD=<<< ~X=<<<J]{ ~I><<<DP]jz}vu @BEHNUURMIHIQ AA@==<< slj<< ӿpp<< 踁aL<< k>=<<  h<< << <<)'         󎑕  􍏑 򎖡蔣鎔썦      󍎠 𛜭  𺼼  繱     򷶲      )':  : : : : : :::{ŵ<::::hùq<:::;QſtS;:: :=KŽp\I?:: :?@KPXpùveWMF?<:: uvoVWg ºrbOD<::?@;::^?Md ²bFB?<;::;IN?::«`NJZevhXI<;::DUv[:籇X;:EVrmS?;::H[myiJ@::=Ch:\]H?::;?EKOJ?<::=Mo~fT@<: :`dD<::;E?;: :;?DMN>::gN=;>K[l_RF@<;;::;<;:: DM@;:=<;;<=>==;::::=>=>II ::HKUTNZimoko :: ;8*=Ғ\4   J̡b(  %/8:6.0:/  A~ʎI8d(  !0JZd`UA @J@+׍*Ca& 2Ic|R&#BcN2 3yY &\])DcoX@(/mud* _p,5`3"3HhٸT*)p}K&NC&^ˊ`VtͫyJ%  Ewy̆),Mu ˮӳ]4 6_:n̓Q" EN=tΥmA  x\>S꿋X*sj1 /8L m٬(ȔYRj/چA]0D s,cE#{b3&bYH' >=7$ # .4- o !4: J5G%z'  /M5 RҎ\0 #EN5=ө{J(0dR;s+O[K 3zìֿqE 4Wv;+s z[SfճM+ @e?8x鯊 w(:Mn·G $Tkse]>8d= -Fgb9  n|+>ː8+Yq4>δyD2Tz{> 5Qm}^7+O{lN. 1E[rǦo;  9[{rY-4iЧw=GcoO3  "?_yI-bqV+XnN1*J]hec`]YPLJRZcjondT5,70(RyxR%1JWahig^[[cije\K4 &MugK'  99999E 2 1///     4 4 4 $ $ $ $ 4 4 4 4 4 4 4 4 4 $ $?==<<<<<99999E 2 1///     4 4 4 $ $ $ $ 4 4 4 4 4 4 4 4 4 $ $?==<<<<<:9:9:9:9:9:E P2 P1P/P/P/PP PP PP PP PPPP 4P 4P 4P P$P P$P P$P P$P 4P 4P 4P 4P 4P 4P 4P 4P 4P P$P P$P?:=:=:<:<:<:<:<881,+% 85.,% 8 8E"$#!1!J~]" 0Yѥc+.4T .(fˡ|#.:U:T8   H`"QH    ORCB6LYUD- (7>02ERT?#3IZVI4 TM4t3 D|m5Z{twW ?vy TO9LO1V<-^J TO2l 0ӕ0w SO$^(-r?0~ SO4{8X<+x*UA9Rf SO=^0I*Q3zC/f[v SO@Y &P *E1wE ]Q SO@Y &O*F2xG P伏\ TO===&<< <=#22<)>><<)>><1 3?1)=<0(==@6mzB*l7sǐJC}l1Iqo?(Tp0]EAՖS )l e~4qޯS #޺l1t_8:{zЇ (l ^u0!^$'z `jq./<'k?͚O ]#'z5󵣮ߒݧ/!GD:Q'l=ޚ7\#'x!ne$(Ynl^%'mhՁ[#&x<=M;(ch cc''mhՂ [#&xv̄6(di cc''miՃ [#&xUTD'dj cc''mjք[#&xB4 J'ci cc''mjք[#&xL9 ʃ!*ah bc''mjՃ Z"&xl^5.\hbc''ljԁ Y!&w /Ӎ D2Som[$'llԁ Z#*wjDA(AJBK'mkߚ6|{MVx ;ﴲr/)ě3(piʌFp帛z!dtn榵mv{ )oMt,OwCI@zu7 ?|待G!sV -ur--hſ[E{$F  %&''% % %&''  !''&%&% $!%"]. >ET derecha copia     R'>E'2H>E(12 --((%##!""       / / / /-------,,---/--/ / / / 0 1 1 2 - - ( ( % # #                      ! " "          / / / / - - - - - - - , , - - - / - - / / / / 0 1 1 2 - - ( ( % # #                      ! " "          / / / / - - - - - - - , , - - - / - - / / / / 0 1 1 2 5Qn- .Gb}, 5QnԠ( %8Kc~' :br6$%Ceګd/"&Ce٤^'";yP FƒN - Ʉ98PO'9fեc4 5Zy`5c˓[$ @YB|: %KyȬcL֝f2 8`mHXȘT",W͈.Ww2)Q}^3̡g6  6c`BWʌM4`ȄDWتl=!L{QJ~Η`, )\j(mĄ; LQDۧo5"LMJpԥ^)Vv5d֐I  +DދQMؓQ 'A[x\WM  !ӟd&wx% 9{ӨuNP_ .rӂɖJHJ+wvίzC3cߨ?O_̥|^:Dؖ7熕ͱoN6  c΃0p}̇myaJ7' ~ݥZ!IRTC[SD/ѹL"&$  'ҫZ" 0ζQ.6ƦR.1s+.*q9. $mI- %gU , %nc, "s , &5, 'J ,X ,yQ, d܈B, Kȗd% ,2ǣ>,`ώ[#, Dƚy2.*yӠvD-?˗W, in.-]! .B@.*a/T̅#/ #qޤ10:A 0>Y 2 2 44 2 2 4 4  2 2 4 4 cq,1a=1 -`A3 g܂;3 K^%"B%hin     2B%3 ?LB%3 ? 9    -/00"                         9    -/00"                         9    -/00"                         g(<@ i)EJ t-2vzy/4y{y/#^[y/'b}O#y/'y/y/8y/      y/8YxqR, AUU/Ti|Я[<$ /Ii Ҵb: !S Ч|R( >q£|Q6  1ΥzP+  ;ŜoH'  %mwP.Sբo<&߻oH, *@ƢqJ'F\ϝk@bv ˣxJ.{ 㺈R)  ˍY-  ܯ}D!ݦ[!‹J% !vι}E#auϸV) #Peƫm*%=Q˸rg}b &&3ruUZp׵d&Jbo`& 0oY) ?Y) 8[(na' Rp (9{(#\{)/߶l) wཏ^-(Kӳ0)&Y\)%]D)Bˊ7) (y=& TщE()eǔ]8 %)~K) Gΰ\$  !`͓@10C:+")fYhy_E,+}ƐʽI;wڴ\  /mw6 3Ód73?`T;H}? KiBɑbAJdqJ伓j]`W 9yٵwXi% 1eyuLjD"1@߼>$f޿_1`&lient      H`&I\`&I&V;......//9                  .  .  .  .  .  .  /  / 9                                                                                                                        .  .  .  .  .  .  /  / 9                                                                                                                      fq3hh*-ht6"qt1-sׯB JQ-wF JP-wF2؅:-wF8nue3-wF  .wF.wF8wF ""!  wF$aaP$9^xqP$ 4W_L1 KwFCB(P{оe=XO&WwF`[" eБBui$*bwF`[" Oɰۻz$uqTzݳwF`["=дv_NNWem-uʕ輐cwF`["){<A\ uUwF`["'fw/>qJ uJ wF`["Qt1  ~·ukwF`["ӓ4  +8u6wF`[" Y  Wc&uSwF`["u2wF`["'gHuٜ-wF`["-wSuʃ%wF`["-w[uhwF`["-wؕWWQC uhwF`[")meuhwF`["!XuuhwF`["9! &uhwF`[" O ,fJ- uhwF`["Ґ) mΛ1uhwF`["Oj+ %kؕ( uhwF`["`j  &Y^uhwF`[" 0鿅P$'MkuhwF`[";ҡwXI@@DLa|Œ5uhwF`[".l϶tuhwF`["*WҭV,uh[h6IßF *[ɲ[- YO  "" &;N]]8                                                                                                                                                "w{@$}A,ߒH/J/J/J/J/J/J ""AZovP$ >Xaa~Ñaa^U¨Y( i˴e#伒zzk-_۽C--5Cm_2GNNoNNKE/1MDD/J ~j(/Jcu,/J Qٙ9/J CF/J >F/J  1OttW1  !  CKmm >m 3<[@ K^5~PZBUgZ::ЇZL&ZTm(L`g]O<2" 3[ qޘ> UܥP4ݽyX8 BЩcK6," dվx\7+dĴt_J4] ơ|P  =i ɴ_' "W կU. %Z|1 "6Jc| ʚY "B]vB &<`E$:Od{}-5he.n&*+',j535@Qfqrh1"\ųTLxr ވ}ވwA~ވ^rp܃3M+Eg0`" |J[1-U]'  =ԍ'vi8(CZ?ӥb1 ?}qNݷfSD><z. 5X| ˤ{P.  'OwλR( @^gw|lV038O     s f38f38f`````#` '` '`+`` `` ` ` ` ` ` ``` ` `` ` `` ` `` ` `` ```````!`!`!`!`!`!`!`!`!````` `` ` `` ` `` ` `` ` `` ` ` ` ` ` `` `` `` `)` %` %` "````` # ' '+            !!!!!!!!!             ) % % " # ' '+            !!!!!!!!!             ) % % " (PwwxP($BffB$"RĬT,.Qx ̥\/0z{: U΢o/ #Rs9   eϠlb[[^z܅( $ddI6,&""$4DTrƄ9Qu3 !Ys-L~J!  ?pj Ą6)i.Fs$ Qx.?v6"UP bی%  w -SHPSl)]ʀ|? /"Օ+!{A0mJc3MHވ^r-  wwfw}\n Jᬷa 9\ 9Z 9Z 9Z 9Z ;Z @j Nu}]j}lSi3  |3MWވ.{!JZޤ2$|5oN : @B)jto{TC JW %h)nݦS6vC $I $sh'f٦_- "S؏(1uq=" *`T5زo:+]RD信kVF?<<>Sfvd$ F׶e  5uљQ# 1gֺL&pΒH*Jp ȧY7 Cq̽}U. *?RisaN1 =E T derecha     mj q=Eq{=Eq{n0 / / ((%"" !!!!           ,,,,,. . .,,,,,,*,,,-,,. . . /-0 / / ( ( % " "            ! !       ! !            , , , , , . . . , , , , , , * , , , - , , . . . / - 0 / / ( ( % " "            ! !       ! !            , , , , , . . . , , , , , , * , , , - , , . . . / - 1)C_y. 7Rl..Hc֦)#2E[wӍ(6]P$&B^zߝ]## (CeТW "$Oʈ7 "c}D  !Qr.  ED4$F͒Z( Ef}d:Gx亇G!,Y͵s-rf* 8cɿxYU羋S+ .TϛKUٴxA!HT?yؕR$ %Dqj?iݶL,ZwFDj% /Vۛ=S弈M# $Esm0s׫v?+[rCIћS$"JԚRN|F"  R`Eiޯk3 Y3^X  #+<ܕ]:_# &S[h[FYm%EsÂ>\,6VDg :τc7kCF˴tQVl+1™ˏ8OPbsƥqBgA磮᠏˹rV2""8 ׿]>& A؛0 ޢð}no}fTB0! #cݭq!`d{k@??C3 -Ʒb 5ˣn" 8íg -7k#,,y5,'kȳI,%g^ -$gp,-'o;--K-0_+/o+%hs+I߳g+)㾇V++粍^ +dẓ0+Ctݰ?,'gQ+Aӎf+"t4,;cN ,@j +1uч-N,-mA.7}]$. Cz2/JޚB 1 1 2 2  1 1 2 2  1 1 2 2 aO0 TZ0 %ZP1T˗B2$Qk."epT     j |ep|ep|~=885 4 4 0--**(%%"!!$''),,../ // / //// 1 00 2 4 4 5 5 5      )))) ~ = 8 8 5 4 4 0 - - * * ( % % "   ! ! $ ' ' ) , , . . / / / / / / / / 1 0 0 2 4 4 5 5 5             ) ) ) ) ~ = 8 8 5 4 4 0 - - * * ( % % "   ! ! $ ' ' ) , , . . / / / / / / / / 1 0 0 2 4 4 5 5 5             ) ) ) ) ; $8 #_5 4m,=hȱG)#f)9`ܠb/-E*%Ne&A|(2UlA(6r%$JuÅ<+1]%AtO0-E""Bh۩a8,Gt !UkA-1j(QΊ@16N$@n`-1N %\`8+;p.ZƇC-0h 7oV/.D &Zs7,Cn  &Jy͆Q.2d(] N5/Cݫ$N s4,=y￉N7h ؅L+7\ٰwA <ެV-.PަP M lB04xщN  /Ҍ@49M͑C"5Ub4/K4 4H=S|mF3>mY 4lSpːE16W`$LN[93?ґ0 TԮ[ v>4Cc[NZtсQ32]% $euUݤR?9Cd (_ݥc` y85BcH *eld އR<8O}3 "lGwܪa=9MvZ# $Vˈ4 m?/:k> ZmP ϫn.*Q-Lx`}ͼ\35! (S\ˤ}U8 J ֊GŽX{{bJ4  &p Ӈj|hhɳz^A,A|rSz^H4%  Z eFSk=k}iXF4%  lʫxB HizX;(=>0# |ڷkL+ !-.)  ഈbbooO پ}gge( )ԟm?Gdq(3vjnȿxC (:ͭiVlиvY6 (?©}ZQlհ_Yas[  D"        /        D "                          /        D "                          /";Uhw^ 1Jcui$8Mc|Ţ $1@Ul !>_ !;Vqg-E`‚+ ?gz2 $>Zw 쿁? 9]Ɓ) 6[ i4 @_ףi- ٘O캃D ܸu;ݠP& R y3 Μ_) 㸈P% j/ ĎR- ߽}D ޠ_& ໊U& s4ʓV)۶Fڦ\'軁K&޳p:ޔS K l+(  /))))))))'''((('''')))''))'(((*****,,,.,-//0004 4  ) ) ) ) ) ) ) ) ' ' ' ( ( ( ' ' ' ' ) ) ) ' ' ) ) ' ( ( ( * * * * * , , , . , - / / 0 0 0 4 4  ) ) ) ) ) ) ) ) ' ' ' ( ( ( ' ' ' ' ) ) ) ' ' ) ) ' ( ( ( * * * * * , , , . , - / / 0 0 0 4 4 3rrntxhm& ('JZZ~ĜvRVj3(&`gak@(0xie|M(BaAEl[#(,cwjqw0( Hetۓ>(dL( $ X& * f & |& 4 'xM' g^' S [&8 π9&!o ĆeF&& VʑI_kC'@~Zcj.(.Œ]b?(WЅ6XR(-a\i &wďRbف&QфO]*(0sȅcaF(F֘A[f#()dMь1(Vm]B' FiQvU ' "Azp#) & <) [ )Z w)%k ݒ) :0+KL+ hk++3rڐ=-7N+B^,Vo.!T% . b0 /*c6 0T:1 R) 3=~ܿd3%R{828"Operating System     Ju"w"F`4 `1 `.`*`(`'`` ` ```` ` ` ```` ```` ```` ```` `````````````````` ```` ``` ` ```` ``` `` ``` ```````` ```` ``` ``` ` `` `` `` `` `` ``:`:`:`:`4 1 .*('                           ::::4 1 .*('                           ::::/DD;&3 4GZZR@+ 0M}Ƴj6- 2`Ƚ˱H& ) !۴hIIVuh%'<̛oI8)!/?V߸z&"qѣH)nI      aB (U٦M .61$ '88(&W {v!Dj7(Fb}lP3 "Eg|t'Bq* >0 Lc}3V\pֲ2 cTLwŮюL -i԰ך  FѺx!LڹĤkM91   b" L# O! Xܳqm! -ӻ]LYqpHƗ Pp-Iq0L֛BKϲS0}Y" Wg2  D؛%Lw9  J{4BܪV  %YʠrT?009PlՇCL׵äkM9100=[ _ǶзALuюL -iģ)qϕS LK}3V .Kf{r\? L|=b}lP3 "A`z}'881 L|.61$ '88,   L|     L|9L|9L|98r[: *``1``1``1``1``1```` ``` `` `"` ` ``#` ` ``#` `0` `0``````````````````````` ````````````````````````````````````` ````` ``````` ````````*11111   "  #  # 0 0    `*11111   "  #  # 0 0    `*$90QmW&0.K?^~k/0)f;^02}ӳ;_02}ӳ{>02}ӳ 2B9    2}ӳ31# !07/ 2}ӳY:>cF >k]0MieI, /nH%?d{qb.L^98]NȊ9?"і&+uۨk!pT ?f& ց53~ԴȞZ ?ѐoPE̾~T .b䪣E ց53~rʔ7?濁R4*(٭zU>08JhŻT 6MwaTJ$ ց53~!N1?ިC -rٛL  4pT  ;ն  ց53~#qS ?y+GˮM9T 2}ӳ ց53~$Iu ?Ha|TT 2}ӳ ց53~g>? }W  +T 2}ӳ ց53~@I ?  -?wT 2}ӳ ց53~Է%I ? 50 kT 2}ӳ ց53~ԱHHG2? -?wT 2}ӳ ց53~Ա ?}W  +T 2}ӳ ց53~Ա 8?a|TT 2}ӳ ց53~ԱTz8?G˱U!8T 2}ӳ ց53~Ա?V ?-rީT  4mT 2}ӳ ց53~Աسg(?(ݯzU>08JhķT 2}ӳ ց53~Ա׻x! ?E̾{T 2}ӳ ց53~Ա٪Z&?+uۗQpT 2}ӳ ց53~ԱeI$ >cC0MieA/nH%7]O L^98]N!07/  _3`7 `4 `3 `1 `1 `` ```` ``` `` ` `` ` `` ` `` ` `` `` ```` ` ` `` ` ` `` ` `` ` `` ` `` `` `` `` `` `` ```` ``` ``` ` `` ` `` ````````,`.`/`/`37 4 3 1 1                                ,.//37 4 3 1 1                                ,.//30DD6GZZ63 )eμ\)2$lϧh' 0J|ZZj"01uܷc7##;em#    E emW88+ 580E>_}|S+ ?[wb?2WZ 3{9JiOϔE;u. Yu*ͻi-$wŰ. 3w6gD18OtܩW#\ˆ]?55Dm. Yܲ}<9  s݀XP# u.  QۮP WPѽu 2}.!Pԧp-)6~2,<C.=i.+mݬ<][2./\{$ &gܭ@%p@ )z. `ް^&gܭ@%p/ &p. ?׫7&gܭ@%p@ -.%Y&gܭ@][:. Nq%&gܭ@,< R. "1=y,&gܭ@xĺ|-K. Yc1Zj&gܭ@Gm0  0. غh  ,R &gܭ@QΤ}WTYh. T׺~Q81Sȝ5&gܭ@!iɻĩ. (`ƟϝT&gܭ@ 7tޱw;;u. PI-aL /G\oqndN17' Dml@' L'88  pD8`  gX>*"/F0 +.r֙kLJMWwU-2sɾʹX$. )Xʽr@.&;WZWN6  `:`:`:`:`:`-`` ``` ``` ``````````````` `````````````````````` ``` ```` ` ``` ````` ````` ` ````` ```` ```` ``` ` ```` `````` ``` `9`9`9`9`6 :::::-                   99996 :::::-                   99996 +3.99C<9")9*39*39*3, *3   &7 *3 085#0SS,:n@ColF Pd΍qq-B_ywb=jh43 EM?bKۏJL؈ Zl*~ˮǂ* -~ᶣAlȯǩW#*l٤?LF_2Ehr+ FOpwTT!NȐaC63B^ǜP 6)2u.`R  ! 3< KX)  V#H %]6dn#*3pƇ# "^ĠVWjAXX *3 (hB+ "B i̢^ #ޯ_- *3TάѶ6 ^o  *}5 Lѭ~N *3f»й77̣VP 0M*3fͻ 1RļL&97_ѯb*3fNH H@ ,ņ?>õr$2~1*3X` yvc۞/ )h߸`*34:2%  K蹡wMܿk!*3yٵt Ip:!sۡN Rݻe*3RڰH"  M` Pv2=uc@1l5*3 RÇU703B^̻o ;LMᮐw*3lܾкw54";Ђ<*3KcS˩n>fc8FSJBZtjI('xB/8  086. [j    G8 'i)8&`68(_x85`````````````````````````````````  (5,,4( Ch9,SytR()XwzS-Ika'(dmIrڭn#{ִXI׬I99O֯fxN19W؎IR  >Οe  չIЍ/Pw*nIQ+PSI, "ߩ@MIՍ5JIx-JIx-JIx-JIx-JIx-JIx-JIx-JIx-JIx-J Ch9 TZ5!CiF#6= C derecha     pA6=U6=e*  * *** * ( ' ' %%""$$% ' ' ' ' * * * ( ( * * * + ) ) * ( (%'% ""#%*  * *** * ( ' ' %%""$$% ' ' ' ' * * * ( ( * * * + ) ) * ( (%'% ""#%*  * *** * ( ' ' %%""$$% ' ' ' ' * * * ( ( * * * + ) ) * ( (%'% ""#%* 4Tun< .Ifc5 )7CQby˹yQ.   "##'-379<>?FO]_`boƲfA% +3:@KW[^_jx龋V) -CZpɦU8! /Jm ҲX0 %Y ΡuM) @rä|Q3  4ӨyL(   @ŚmI+  *sƨzO*Zܨq: $ŞvP0 #;ѯ~P(AY֫uF&]r ׮Y4v ʜZ,  أm; ĕY,  w2զf6!}Κ^ #i|ãzA#Xm˴w>%H^ЮtxW&3Dvef~ĭc &)dp^jb& 0XS( BQ) MR) 9U)!r_' Pk(9x)$^r),V )wӮiA*LҮ1)"Q]) ,fJ)Gъ& ( (Ł?'\@ %(eϛV'&5ԩ~U7 $NЪ{L cВ7)+A3 4{WexjUE6 *ݲ{EEЬQ?“E >ަj, C<) _幆W>3SwP$\޹y=*;bk %`]QX~S &atf{܃0 !A|nyL! 8LVʗO!"3׿S% Tͻm:VbC     nlVbƄVbƠ Ш='''/ 4 4669;;:775 5 2 00-**''#  ##$$'))+++,,,,-----////.///1//)='''/ 4 4669;;:775 5 2 00-**''#  ##$$'))+++,,,,-----////.///1//)='''/ 4 4669;;:775 5 2 00-**''#  ##$$'))+++,,,,-----////.///1//)< & #*3>@AABGQ^ "(*+,,.1ADHNU]fv",9BIQ\krw~  !?Vj 4Ni&<]}% 3f&,['ɦZ)h(ױU1 5(̟pL- >{(ȧ|S/  }&ڵF&*n&ƜsR3 R$ʩ|Q- /$׬vE Z!ٽtN2  ĝsE" 0’Z9" 4LšsH!TiܳAm ޱ~P.   Ěh7 ߩo1 ֭zQ- њ`" ݮv> ƕc49"أc."НX$$ԇF% سE&Ͼp2(s°d6 (`tƱA*Mdĝv_Rl.*>Ṳ|eYau"*-C`DGWzd++{T3/PB+ ETO]v. +Co , 1u , 4#,+( ,b0 -F:.1J.O\. #n.x|.Uю#.3~ߤ+/UDž$/3ئl+ /`ʕyaK'02忝~W . k‘z݋ .BV( b    4 b    4 b    4 ,Cc "1BYu|!0=UlѲQ (8Lf|ɭR("/?Ql۱~Em~rM0 àvL% Ǚh<uH+ˡsG" ۸jE$  ӸmG) Z2 ;#4///--.*+((%!#"%%%%'''%##""  "$&)+///--.*+((%!#"%%%%'''%##""  "$&)+///--.*+((%!#"%%%%'''%##""  "$&)+!NՔ= .Tj". 9e . uL!, GۧU-$[ܛ[)-_+* T඀F+'jÐY3 (3廈O& (Hʨa@(%eյc?  .lJ"7 աN4CcrcRA3$ G ȃGTϷ|\;!Z~˺sV6)f弚¥p9 jg .Y>I ڲw?   !͍T$ ;C3 K ٯyG"&Afj> ٞ[ :`1H٩tD'2Qx<Jșe7$.Jt93u6&*P~ޘ% A|ØkMF`n 2z轋UCKyB %hͱzbaV!-Zzm*# ';Wf&:ྒྷU) ( WɦxH*(NǵnB# +1jteclado y torre     jދޗޣjם$ 0  B/>r>DEEK,Zl%l5oryv<z;|!1R=83 3 =83 3 =83 3  < !7 4Ib3!7Ux3 9Yy v ++#!!&&, 3 39<z=83 3  v ++#!!&&, 3 39<z=83 3  v ++#!!&&, 3 39<z=83 3  v(7E,  &-4BRg|+ $2G\p$ +9HWer #.>Qi ':Ndw -:GSdw 7Ss (9L`v  "1DVh #2CZr&3G]tų 1G`{î{b /E]xŬy^C3' +A\x w^G4 =Z}!ջdH- ˺w]F5'׿nV@* §v\C*   p  , 4 4895 //*##!!).. 49z p  , 4 4895 //*##!!).. 49z p  , 4 4895 //*##!!).. 49z p $*17@IS\d! !&,40&  as$  YMN͈$.@G./~x2.&vY,oہ,jK,\ʂ.+ LG +>k$,6C,3 i,+~ ݓ" +!a F+@ ~2+, N)  l)  9 ) c({ Ӑ"( l =(_ ^#(Y ߇< 'ܯɤ⹻ʼʻۼ⹻ʼ⛪𬫺dzúdz·Ľʺ½ͻtž tȸ tĵ"t،"t҈$&&ﺶ&ﶱ&&ﵰ&ﷲ&﹵&ᄎ$$ʾ$$ٛ$ ܊$ ܊& ڟ& ۥ& પ& ᬬ'ⰰ' Ἴ' ' ' ͅ& ɘ& Ƨ( ȯ( ʳ( DZ( ͼ( ( ӝ( ؖ( ڑ( ( 曛( 窪) 껺' ȗ' ˌ' ͏' ϕ'ܯɤ⹻ʼʻۼ⹻ʼ⛪𬫺dzúdz·Ľʺ½ͻtž tȸ tĵ"t،"t҈$&&ﺶ&ﶱ&&ﵰ&ﷲ&﹵&ᄎ$$ʾ$$ٛ$ ܊$ ܊& ڟ& ۥ& પ& ᬬ'ⰰ' Ἴ' ' ' ͅ& ɘ& Ƨ( ȯ( ʳ( DZ( ͼ( ( ӝ( ؖ( ڑ( ( 曛( 窪) 껺' ȗ' ˌ' ͏' ϕ'ܯɤ⹻ʼʻۼ⹻ʼ⛪𬫺dzúdz·Ľʺ½ͻtž tȸ tĵ"t،"t҈$&&ﺶ&ﶱ&&ﵰ&ﷲ&﹵&ᄎ$$ʾ$$ٛ$ ܊$ ܊& ڟ& ۥ& પ& ᬬ'ⰰ' Ἴ' ' ' ͅ& ɘ& Ƨ( ȯ( ʳ( DZ( ͼ( ( ӝ( ؖ( ڑ( ( 曛( 窪) 껺' ȗ' ˌ' ͏' ϕ'  $+8Pdt}! #/7;ANdv  (8KZar "/BVgx ;Yy .Fe 0Ps#L !Ev $TĶ+rðwaQE4pϿtaPC;2$jЦaA'FݺnH3%t͢mG& (yA ,ݨl9.` 2W& 2o$ "0}&#._$-I&,ݞ?&*֌7&&}1&{y/&b|0&LӃ4&B׍8& 4ۙ=&D%oJ% `O%NR&=Y&-pc &"X w&A , & * 5 &A 'qP' Zm'A ̄'&v ۗ'^ '&I 6 '7 Q((s c&(M s0( & ߆;( J(p [(U f(= t(+n $ (T 4( < E(* ])s w&(R Ӓ/( 5 ݥ:(y G '^ [ ú˻ڼ ĽȻɳ ɻɳ ̾̾!Ʊɸ-ſ˺׻ҿ˺׻ᯟƺŹ 'ο 'ο -0////߮/͆/ѭ/ʞ.Ŗ.䲱.ݘ0Ј.ο.0㽙.׾./ˢ/Ʃ/̠vCCOO.ѵlH3!!CC.rݸgC# 2nW43Qf ' 3GZr ' ,Ht - 7m0 %/e/Y/[|/q8/ $t /:C/d]/,ך0/G[/)m- 0Lh . qJ. o.0LB/.{ؕ'.Bn/[D /%vt"/ =R/Zښ</vk)0A0 +$ 0<~0 Xc02xI1F|21Re"0aO0u;0 #Ґ-07s!1PW1hB1#40+06o 0I`0ZO2'jފ=25~n-2CY 2RI2W4 0`ޛ#0 pӋ 6ֹ侨ʼ˼įæ۵֤͎6ֹ侨ʼ˼įæ۵֤͎6ֹ侨ʼ˼įæ۵֤͎6 Y(t+X!ڊ=KMߏ?p.Hؖ* f5 Z/0++((%""!!$$&'')''%%$##"!!!! !""" "$$$%$$$&''')''')**)**+++-)0++((%""!!$$&'')''%%$##"!!!! !""" "$$$%$$$&''')''')**)**+++-)0++((%""!!$$&'')''%%$##"!!!! !""" "$$$%$$$&''')''')**)**+++-)0 5Nk, -S~,.Qu) /Lu(%O % #@d " 4\"3a8^ F?s-R @٤[.;וY% j֜E@Ύ@&w֑N  A؞C(kRHejm0 Ғ5 R !:f !"[ό7!18#>p!M>#cO#%vǁ+# 7B$ On#fڑB#~K%'˅& %7 N &I k&'c ؜A &8 R(H ΂ &\ M& s V( ͊0(7 I)V k)!t Յ=)* A*8 v*I> +^Q +.tv.,?3-Sp (-((""$$+// 3 37; <-((""$$+// 3 37; <-((""$$+// 3 37; <˹oTB2$ âcE.èqW@- Ȳy\A( ְfE. ׿qV>)  ˷wS6 $аfG4" %Ƭx\?( *έ~R) .аdB, /§b>! 3•e5 4\A)7.:  <)))))''''&''''%%%%%$$$$$&&&$$$$$$"""""""""""""""""""""""""""""")))))''''&''''%%%%%$$$$$&&&$$$$$$"""""""""""""""""""""""""""""")))))''''&''''%%%%%$$$$$&&&$$$$$$""""""""""""""""""""""""""""""Q Z(G y(7 /(+o P(%e u&("` ݦ:'Y S&N v*&?J&/k &'׉&#) &"I&r-&vܘ?%dO$Sh$C, $<H$ 7f# 4˅ # -/#$A#p]!# cx2%WD%T[%Qr#P#O7#MY#Js%#Fэ-#Bݦ6#>B"9S!5j#!1w6!,mK!'cd !"Xx!O؋!L(!K:!LP!Kb!Iv!Fْ!D!C!G!J!L!L!L"K"N" T"&`",m"2{"8"="B Ҝ) ԣ) ִ) ) )ᴙd)ʫx[()˝nB& )vO/ )ϧsA.ěmF'/Ƥ{P*2o:5F1  /7hh)g  0Mot)g2Wɧ1 6Yݱ.%N|߶+ 6[+3T}˦*IMƦ+xy˜++ +Ȳ) Ͽ) ɜ+ї+ז+㖖+鞞+譭+麺,Ƈ*·*ӝ*֦*ԧ#Ӭ#Ե##˹#֮%᫢%%枖$~x$Իf96$ɶlT;*%ڼz\@( %~v\D-!%]5- %3<<<<76352*AS/7e-"H|,?t Ҝ) ԣ) ִ) ) )ᴙd)ʫx[()˝nB& )vO/ )ϧsA.ěmF'/Ƥ{P*2o:5F1  /7hh)g  0Mot)g2Wɧ1 6Yݱ.%N|߶+ 6[+3T}˦*IMƦ+xy˜++ +Ȳ) Ͽ) ɜ+ї+ז+㖖+鞞+譭+麺,Ƈ*·*ӝ*֦*ԧ#Ӭ#Ե##˹#֮%᫢%%枖$~x$Իf96$ɶlT;*%ڼz\@( %~v\D-!%]5- %3<<<<76352*AS/7e-"H|,?t Ҝ) ԣ) ִ) ) )ᴙd)ʫx[()˝nB& )vO/ )ϧsA.ěmF'/Ƥ{P*2o:5F1  /7hh)g  0Mot)g2Wɧ1 6Yݱ.%N|߶+ 6[+3T}˦*IMƦ+xy˜++ +Ȳ) Ͽ) ɜ+ї+ז+㖖+鞞+譭+麺,Ƈ*·*ӝ*֦*ԧ#Ӭ#Ե##˹#֮%᫢%%枖$~x$Իf96$ɶlT;*%ڼz\@( %~v\D-!%]5- %3<<<<76352*AS/7e-"H|,?tH n%)4| 5)S O)3 e) v)v ׄ ) T )2 ,)j D) T ^$)? {0+- ۙ=+ Z I+4 _) v!)d 7 +KL+4{ b+[ v+ @ Ћ *+ ޟ. +" >+` P+9 f'+ ނ9+c L*N X+9 j +#\+?$ + ' :+| ]+ ` {&, FՕ.,-|9+`I *E_+4r*,$g;#<R# d#~t #cڌ%G+%,r<&%TQ/% :h(<$*р2J#qٔ;X$PE_$ 1V l$sh%$X{6 %C4 D&0tKJ& Ua[&6wr&ӍЊ&w+ݛ!' W?#'8Z!(&!q|51&ZGF&FR%0ݲ1ި1ޣ1ڨ1צ1ԥ1׭1ұ1ɭ1ᄑ/11볱1踶1㭫1ॡ1ޘ1ۤ1222պ2211ä1ϵuu1ȠuO.+""1򄖢jK1)&#1]^^M4-GG3 #Z3 An3 %K3+?Y~3h~罽3泳3븸3333㳳3দ3ߛ3ߐ31⇇1寯1Ǽ1΋xhh1͛pB4AA1ԷS,1`'1zphC' 66' 8 9%0ݲ1ި1ޣ1ڨ1צ1ԥ1׭1ұ1ɭ1ᄑ/11볱1踶1㭫1ॡ1ޘ1ۤ1222պ2211ä1ϵuu1ȠuO.+""1򄖢jK1)&#1]^^M4-GG3 #Z3 An3 %K3+?Y~3h~罽3泳3븸3333㳳3দ3ߛ3ߐ31⇇1寯1Ǽ1΋xhh1͛pB4AA1ԷS,1`'1zphC' 66' 8 9%0ݲ1ި1ޣ1ڨ1צ1ԥ1׭1ұ1ɭ1ᄑ/11볱1踶1㭫1ॡ1ޘ1ۤ1222պ2211ä1ϵuu1ȠuO.+""1򄖢jK1)&#1]^^M4-GG3 #Z3 An3 %K3+?Y~3h~罽3泳3븸3333㳳3দ3ߛ3ߐ31⇇1寯1Ǽ1΋xhh1͛pB4AA1ԷS,1`'1zphC' 66' 8 9%w1 `1 G 1&7 15.1Pu!1'ib1.|R 11I14ߧB29֐81Cx.1Q`$1 \V 1eK1j:1q&1"yߋ14ك1 E{2 Ut2_e2gU2lF2p?2v92y01h#2$P2 (A2 +73 ,63 143723?ٝ.3Kϊ)3$\t"3+k_32wO37L3;G3?A3A83C- 3E 3H~2Nt1Vp 1^j 1 fc1mX1sO1wG3uB3tߊ=3u܂83xz43|r/3 k+3 #d'3 %]#3 'U3 *N3 /H...//-///00000 2 1 1 1 1 3 3 3 3 3 4 4 4 4 4 46666666666677777777777777777799999...//-///00000 2 1 1 1 1 3 3 3 3 3 4 4 4 4 4 46666666666677777777777777777799999...//-///00000 2 1 1 1 1 3 3 3 3 3 4 4 4 4 4 46666666666677777777777777777799999hB- ~S- Ў1-1W.C% .#^d..yߓB/8^$.F6. V/hQ /#z~+/ 7[ / JC/]}/1pN0*0| 0.a0$>I29Q}42Qf` 2i|E 2ܣ22˄%3c3G3, 3|3j3Y5G5ۂ85k+5Z!5H565, 5ۗ$5·5w5f6Z6N 6D 6: 606z(6r"6k6d6^6Y6U 6R 6N6J6F7B7߫@8ާ?8ݥ>8xݣ=8[p۠<8"""""           !!!!!!!####$$$$&&&''')))+++,,../ 1 1 1 1 366577"""""           !!!!!!!####$$$$&&&''')))+++,,../ 1 1 1 1 366577"""""           !!!!!!!####$$$$&&&''')))+++,,../ 1 1 1 1 366577"G"L"O"R"U _ l  } + 4 > M b v  #, 8K \*l;Max 9[-> R&sG l8'cBc 9 j +"W"?#k#8#*s"M#4}# e$9$׌6v$hj#HY$+=&{ @&Z ){&; $k&d .j'F  !h(ϊ- )e'R .l''  (l)c>|):)%>dϔ)>\֖):ߢ)i㤤)⤤)尰)縸)+Ř+Ș+Δ+і+Л,ҩ,Ա,յ,ؾ,Ǹ,ڼ,,,ǮV,ںg+,ٶS0 ,ܸg? ,i3 ,_D)-\$ -U/D // 6-J5dϔ)>\֖):ߢ)i㤤)⤤)尰)縸)+Ř+Ș+Δ+і+Л,ҩ,Ա,յ,ؾ,Ǹ,ڼ,,,ǮV,ںg+,ٶS0 ,ܸg? ,i3 ,_D)-\$ -U/D // 6-J5dϔ)>\֖):ߢ)i㤤)⤤)尰)縸)+Ř+Ș+Δ+і+Л,ҩ,Ա,յ,ؾ,Ǹ,ڼ,,,ǮV,ںg+,ٶS0 ,ܸg? ,i3 ,_D)-\$ -U/D // 6-J5)K}&C*7Ֆ2H*$dB M*HNR*2\V*%m%Y+l5\+NE^+ 1O`+zba,ay b-Nc-<e,*h"i+O7m+9Nm+ &fm+~l,gٕi, Hf-.b.h].UW.DM/6D0+w;0 [70>y40 $t00c&0|O2i7 2R)2A"33{Ћ3^s3FX37D3+0 4!{t4`_ 4LL4<95 ')6w6 f6T8D8;94{9,m9S9>9 /9#99va=MURG7" 4}|V01l3ҬlնxϚƚཽI໻%߸޲3᷷3333šff3oM@++ ~d=**MDC.Xnn :Ë:ʡ:ʪ"ɩ */77ǥ )Dfktt#$Dd½ƭcklμ⾾༼̻༼Ⱥ߻Ԧ߻II޸Ѽ޷ɘ ޶`;,޶8޶ "-CC޷9Rs~߹ɷ߻༼༼߼߻ཽ᝝杝ڍАТa=MURG7" 4}|V01l3ҬlնxϚƚཽI໻%߸޲3᷷3333šff3oM@++ ~d=**MDC.Xnn :Ë:ʡ:ʪ"ɩ */77ǥ )Dfktt#$Dd½ƭcklμ⾾༼̻༼Ⱥ߻Ԧ߻II޸Ѽ޷ɘ ޶`;,޶8޶ "-CC޷9Rs~߹ɷ߻༼༼߼߻ཽ᝝杝ڍАТa=MURG7" 4}|V01l3ҬlնxϚƚཽI໻%߸޲3᷷3333šff3oM@++ ~d=**MDC.Xnn :Ë:ʡ:ʪ"ɩ */77ǥ )Dfktt#$Dd½ƭcklμ⾾༼̻༼Ⱥ߻Ԧ߻II޸Ѽ޷ɘ ޶`;,޶8޶ "-CC޷9Rs~߹ɷ߻༼༼߼߻ཽ᝝杝ڍАТ 4B39=3>93C53H1 3M. 3Qݝ+ 3Vۚ(3Zٖ$3]֑ 3`Ҍ3d·3gʀ3j|4m{4r!yʁ$ʁ&z(t *o,i.c'0[12V;4TE5SQ6R_ 8On8K ~'6H < 3F P1D c0A x2@ ь 3> ߟ, 3; 3 3> <3C N6H b&9I v1>H ~6?G ? ?G L ?G ] ?G m  ?F v @D | @C  AC   @C . ?C A ?C Q ?D a ?F v$ ?G ю+ ?G ߩ3 ?G 7>H <>I B=J R=K d=K w.W۟;8">ڟ;8-Ѧ>8 ŭA8C9oD9WD8 =tD7(_B7K@ 78w97&U.7- 8 :7 !"##"  "*3=CIPTUPOQSUVVUTTSSRQPPONNONNMNQWYZYZ] )2ATew  $/:FS_iq{ !.IT^it+  $)-27>CH:<~(( 1 ,2 2 ~(( 1 ,2 2 ~(( 1 ,2 2 ~+ ( $+ ڷcA' ƲjA#˛kB& ʲybE+  ȷeC) $ĨeH2#%ɶ|gQ<( (̹gM3 0x]G5* 0raK=1 5 7};:::::::::;============= ;:::::::::;============= ;:::::::::;============= ;g: ^: Q: ?:&y:h: [:T:J;><4<-~<*t<%g<V<=<)< <<<< << ղܿټڽ׼׺ݶZH,,ؿa@# älhgI-¤+"! ʽ55麩5壔5奜5媤5氫5鼹  .FOZZͩ(5Poɛ}URaĢqM8!ȡiB ŢE9%ǩ˰η3  ./(9Mcqz|2Ja~ռy˭̰Ҵťպ׾㼘仙澡ªDz躣йc̶rU-{dI1 E<7"ּ% Ӷ3ϯ3̩ɣ!!Ɲ ":X_]]™&8Qt3=`呑􏚼㑑鹶ᙙۧࢢȣqo䷷WA87zrgH&=5+븸 絵ղܿټڽ׼׺ݶZH,,ؿa@# älhgI-¤+"! ʽ55麩5壔5奜5媤5氫5鼹  .FOZZͩ(5Poɛ}URaĢqM8!ȡiB ŢE9%ǩ˰η3  ./(9Mcqz|2Ja~ռy˭̰Ҵťպ׾㼘仙澡ªDz躣йc̶rU-{dI1 E<7"ּ% Ӷ3ϯ3̩ɣ!!Ɲ ":X_]]™&8Qt3=`呑􏚼㑑鹶ᙙۧࢢȣqo䷷WA87zrgH&=5+븸 絵ղܿټڽ׼׺ݶZH,,ؿa@# älhgI-¤+"! ʽ55麩5壔5奜5媤5氫5鼹  .FOZZͩ(5Poɛ}URaĢqM8!ȡiB ŢE9%ǩ˰η3  ./(9Mcqz|2Ja~ռy˭̰Ҵťպ׾㼘仙澡ªDz躣йc̶rU-{dI1 E<7"ּ% Ӷ3ϯ3̩ɣ!!Ɲ ":X_]]™&8Qt3=`呑􏚼㑑鹶ᙙۧࢢȣqo䷷WA87zrgH&=5+븸 絵8א8eܛ)7ۛ<bޝ* 3{D_ޝ+ 1yL[ޞ, 4|OV/ 2zR P6-rT J>%gU DF^V =NYV 6W VV  .^#TW  'd'TW  #j*TW  !m,TW  !p.SW  s/RW w2RV ||5RV t݄9RU iߌ?SU  `DSS YKSQ SSTONZULJaVIFh ZDCo  `ܞ>@v&iא8@-sс2>( 5~r,<7<g'7@A\#2xGBQ-nJDG&`QG<Q[P/Dq!=^=====;;::::99999777776666444ݚ4â2ұ1򍦦˔1򍶸1㵲/ې1Ő1¬3Խ20Ε1º/ݬ0񧟞ּ0񧵼̺.ຸ/ģ.ȷ.0̭.ǻ,񣫰ʔ.Ҽ-立о.立׶,ʩ+-ۼ+﴾ɚ+䥞-̥=^=====;;::::99999777776666444ݚ4â2ұ1򍦦˔1򍶸1㵲/ې1Ő1¬3Խ20Ε1º/ݬ0񧟞ּ0񧵼̺.ຸ/ģ.ȷ.0̭.ǻ,񣫰ʔ.Ҽ-立о.立׶,ʩ+-ۼ+﴾ɚ+䥞-̥=^=====;;::::99999777776666444ݚ4â2ұ1򍦦˔1򍶸1㵲/ې1Ő1¬3Խ20Ε1º/ݬ0񧟞ּ0񧵼̺.ຸ/ģ.ȷ.0̭.ǻ,񣫰ʔ.Ҽ-立о.立׶,ʩ+-ۼ+﴾ɚ+䥞-̥=<< <<< $<=<!]<*t<0;;;I: Y:o:5: R:k:9 %9=9%_9:7Q7l7 &7B7q606O65}4]Ս4 P4B$4+yp 2MF2)ue!2 \ڡ< 2 ,c 2!X% 1J[ 1 %zs13d2 2H`0qԐL,:ۣF-#YR+5l_ + ;|X"- &Zr" 溺#9IQ>3&;\~m}ǵƬ܀օھϗظЦԯַդعؑطۗԳҨպ길谰ڼ 㨨௟ ߦߝ أठ ƞ䶴 ȶ굴 ﱰ 澛  ۾ 𼺚 ‹  ߺ ˲RR ڥ!çlDB** ֗!y^E0  ˈ!tXL4$ #:  # -- #  )6GQgg #4Jb{ #Zpϼ2˚2͐2ƚ2Ÿ2Ȯ2Ȳ2ı22Ј0؈1ޡ1㬬1䭭1混11˚1Μ1͞1Ϩ1Ұ0“0ȍ0ȋ0񛹽И1ڥ1軻1̉/،/۠溺#9IQ>3&;\~m}ǵƬ܀օھϗظЦԯַդعؑطۗԳҨպ길谰ڼ 㨨௟ ߦߝ أठ ƞ䶴 ȶ굴 ﱰ 澛  ۾ 𼺚 ‹  ߺ ˲RR ڥ!çlDB** ֗!y^E0  ˈ!tXL4$ #:  # -- #  )6GQgg #4Jb{ #Zpϼ2˚2͐2ƚ2Ÿ2Ȯ2Ȳ2ı22Ј0؈1ޡ1㬬1䭭1混11˚1Μ1͞1Ϩ1Ұ0“0ȍ0ȋ0񛹽И1ڥ1軻1̉/،/۠溺#9IQ>3&;\~m}ǵƬ܀օھϗظЦԯַդعؑطۗԳҨպ길谰ڼ 㨨௟ ߦߝ أठ ƞ䶴 ȶ굴 ﱰ 澛  ۾ 𼺚 ‹  ߺ ˲RR ڥ!çlDB** ֗!y^E0  ˈ!tXL4$ #:  # -- #  )6GQgg #4Jb{ #Zpϼ2˚2͐2ƚ2Ÿ2Ȯ2Ȳ2ı22Ј0؈1ޡ1㬬1䭭1混11˚1Μ1͞1Ϩ1Ұ0“0ȍ0ȋ0񛹽И1ڥ1軻1̉/،/۠Z <̆'f8י-s 5ޥ1݉  04Ձ *6o"=\H M~^Atp)7n}3i#j8Qd>B[F6 LVю+ ;hj '~uNr~ 8lل ! h r a* Z VA CHN n, ;Y" O 5j( 5 1с2 Έ .}۞= f 'kߩD D !TJ t!6S  T ! $` 7# o #) # t< #fU $^o3Wφ2Oږ2@0 2/vE2&hX 2\p.2Rߌ>2 >Q2-c0&u1 r# 1Z;1@P1 *i1|Ή(1 hܣ62UH2Ea22y{31TI1@^0 -w 0 0j91 La$1/ؖ91gO/ Og/<1             ~;;::9777677777777766~;;::9777677777777766~;;::9777677777777766~<;$_:R:I9.7)b7 W7 67q7 87Y797J7T7T7C7(h73|77m7 8^Ϊ,)ٺ')Į(ε(љ)'⫥)ƪ(չ%ʛ&䷴$ ؘ$&ʻ%搦ǽ%搧ìqe\YV\#õ|xv{|xjHH#䤵Ʋ|pgefm{mm#䤾ѡxsv|ܷmm#Öﹳ%ï좓%ᦒ% ת% Ъ%֩%߯궱ʺͻʻμ @   ǻĺΪ,)ٺ')Į(ε(љ)'⫥)ƪ(չ%ʛ&䷴$ ؘ$&ʻ%搦ǽ%搧ìqe\YV\#õ|xv{|xjHH#䤵Ʋ|pgefm{mm#䤾ѡxsv|ܷmm#Öﹳ%ï좓%ᦒ% ת% Ъ%֩%߯궱ʺͻʻμ @   ǻĺΪ,)ٺ')Į(ε(љ)'⫥)ƪ(չ%ʛ&䷴$ ؘ$&ʻ%搦ǽ%搧ìqe\YV\#õ|xv{|xjHH#䤵Ʋ|pgefm{mm#䤾ѡxsv|ܷmm#Öﹳ%ï좓%ᦒ% ת% Ъ%֩%߯궱ʺͻʻμ @   ǻĺ4cz6,7я6 *"R۔D) XU)3nU!(?zv% (B~*)(cٙI'3gS )4ur(@:&DݨB &UZ %&V Ԁ% &` K&*g a&% )c ٚ2 %p a# 3l 2 # $l` #&tޡC#-em+%g;%% %%܌%%)$h,j7%"*3870.,*&"" !`LB@@AHPYn}xtodYYZZYXWWѿľ@  ż ؠĻz]KEVejihoy-޴0Ņ0ڹ0蹚0ð2ȅ0؉0ᡡ1绷/Ȋ/̦1ӷ1Ջ244666553//*񪬳*򪬳 쳼ޓ˫ɴ ޓ˫ɶ ɳʵ쵸 'v1.¶ϥ¶ϥ÷ӹ ض¶ӹ -޴0Ņ0ڹ0蹚0ð2ȅ0؉0ᡡ1绷/Ȋ/̦1ӷ1Ջ244666553//*񪬳*򪬳 쳼ޓ˫ɴ ޓ˫ɶ ɳʵ쵸 'v1.¶ϥ¶ϥ÷ӹ ض¶ӹ -޴0Ņ0ڹ0蹚0ð2ȅ0؉0ᡡ1绷/Ȋ/̦1ӷ1Ջ244666553//*񪬳*򪬳 쳼ޓ˫ɴ ޓ˫ɶ ɳʵ쵸 'v1.¶ϥ¶ϥ÷ӹ ض¶ӹ -)oU1<ˁ1 31eV 2?ف82]V01x0^>1 )r$0K= 1#Vn+2mU1 (k׈2 6~V4&ݤ4e6=6#g6"f7-t5N3/219`=`8`5 `5 `2 `0`0`-`-`*`'`'`'`%`%`"`"` ` ` ``!`!`!`!`#`$`$`=85 5 2 00--*'''%%""   !!!!#$$=85 5 2 00--*'''%%""   !!!!#$$<9 6 5 2 $1 "&+/  %*/4- !&,28>, #(.3:@G*  %*/5ELT]fo& "',2:BJQYajt~& #)/5FNXair|#  &-3;BIQZdnw" "(/5GPYcmy  %+18@IR[fpz %,3:AJT\fr}`=`6`0`0`+`+`'`"`"`#`'`'`,`,` 1`6`6`9``=``~`=600++'""#'',, 1669=~=600++'""#'',, 1669=~7 3 0 $(,0, "',159@DHMTZ^bflsx~  !&+/48;?CGJNRW\cinrx~  !&+159<@DFJOTX\aflry~ &+037;@DGKOTY^chlqw} $)-26;>CHMQUY^dimsy} #).37:=AEJPU[`einuz~  $).27<96568:91("瘖zuplkjgfhmppfT:%%藖z]9'(򗘙Y;!( zZ1 ( }N06xQ16mG%7a2:xH+9_<9yU;o;;<===66..&ƿ   ¿ÿ!"" ""#%¿&)456788:;<;;<=>86 . (09@. '3CRbo{' &-39?EO]n$ *7ER]fmsy $2DXm%2ARf}1F]r !9[{    4X   $Jy  +S .U  "$%%$%&%$##"! ,Nx!%(*,-.//.-/0/.--,,*)(('&$"!*A`˿"&+-/3567889::9::;:987654221/-+(&%#$)5Gc|zos~369<>@BCDEEFGGHIHGEDCB@>=;:8530.+*,07ER^bddcb`\UKA;>G[uBEHJLNOQRTTUVVWVUTSRPNKIHFCA>;9522116:>??>;962-& #1HePTWZ\]^`bddeffggfeddca^[YXVSPMJFD@=:741/-*(&# #;g^cfhkmnortuvwwvtsqpmkhfd`]ZVSOLHE@<851.*($ )Jrnsvxz}~Ɔ}{wusokhd`\XTPKFA=83/,(# 2Q|Ě|xtokfa\XSMGA=84/*&"4VŬ}wrmgb\UOJE?93.*%!"9c~xrkd]XRKD=83-($ !EsЇ{tlf_WPIB<60*&"4Y{umd\UME?82,(#'D{qiaXPHA:3.("1vnd[SLD<5.)$%ý|qh_WNF=50*$ŽulbYPF=71*$ûzod[PG?81)#{pf[QH@8/(" ż}rg\SI@6.(#ǿ~rg]SH>5.(#}qf[PE;4.'|pdXMC;3+ znaVKA80!·xj^RH?6"¶uh[PG=$reYOD#ʾ|nbVJ#ƻwj]P(öqdW(˿yk^(ȼsf+ķ|n,˿u-ǹ}/Ϳ/Ÿ0̿1ŷ1ʾ1Ķ1ɼ12ķ3ɼ1124&& & & & & &&&&&&&&&&&&&&&&&&&&&'&&)'&&-)'&&3+'&&GO_dd``_]YSMFEDGKSZabb``_][XWWZ]aba````_`aba`` `a`J`     ! / E' a7" }O2 hD$}Z.p>$P.e<"xO.e@%|[7$$$qO6%(77kQ:-#""&1Aa헒t_PA><@I^qzl^YW^gy𖒍 <  ¿ÿ   ÿ  ¿ ¿¿ J   EA6* zhS:%  󿾸pP1 Ĥ~V5 ձY5 յ[1 ޵Q,ڲK" իl8ԏQ! f.x8@ƊEȎG ǍFĊECF ƎL$ϙV* اb2o;|DyɊN ^ԘY! Esۣb'0Vj,"=en0-Ip2"2er3'Ns53)  xhZMA6," }m^PD8.% sbTG<1'  wgYK?4*" {l]OB7-% o`SF:0' $`&`&`&`&`'`)`)`)`+`+`+`+`,`.`.`.`/`/` 1` 1` 1` 3` 3` 3` 4` 4`6`6`6`6`6`7`7`7`9`9`9`9`9`;`;`;`<`<`<`<`<`<`<`<``=``=``=``=``=``=``=``~`$&&&&')))++++,...// 1 1 1 3 3 3 4 46666677799999;;;<<<<<<<<=======~$&&&&')))++++,...// 1 1 1 3 3 3 4 46666677799999;;;<<<<<<<<=======~ %+2:BKT^hr}!%+2:BKU_hs~ &*19BKT^is&,19AKU^it',28AKV`kv $-3;CLV`lw#,2:CMV`kw*28ALV_jv(08?IT_it "06>GR\hs  ,7=FP[fr~ *4=ENXeq} "3FOZes  0:CMWbn{'8?HU`kv "1=FQ]it -:CNYeq~ '6AIUalz  2=FP\ht *;CLWco| %3?GQ]jw .9BLWdq $5>FQ]kx /:CMXdq &6>HS_lx  /;BLYfs'4>FR_ly /8AKWer!4;DO\jw)7?HTbp~ !0:CNYgv'4>HS_m{ ,8ALWdr$0;EO[hw)3=GR_m{ .5>IUcq#07ALYgu '2:DP]jy *3=HS`m|",4>JVcp~ %.6@LXfs '08BNZhv )1:DO\jx!!*3;FR^l{!#+3IVdr '.6>IVdr  '.6?JWds! '.6?KWdr   '/7@KWcr  &/7AKVcq &.7@KVbp  $,5>JVbp~ $,4=HUbo}  $+33)! ɻyhZL@4*! ʽ{j\OA6+" ̿|l]PB7-$ ~m_QC8.& ³n_RE:0' ôo`RE:0' ĵpaSE:0' ĵpbTF;0( ĵqcUG;0' ĵrcUH<0& ĴscUG:/' ôscTF:/'  ôrcTF:/(  ³rcTF:/' qbTF:/& paRE9.& ˾~n_QC8.& ɼ|l]OB7.& ǹzk\M@6-% ŶxiZL?5,$ ôufWJ=4+$ rbUI<2*# ʼ~o`SG;1(" Ⱥ|m_QF;0'  ŷyk]OD:/& vhZMA8/& qdWJ?6-% }n`TH=3+# zl^QE;1)" wi[OC90'  seYLA7.& }obVJ?4+$ 즗yk^SG<2)" uh[OD:0&  휍qdXLA6-$ 혉{naUI>3*# 픆xj]RG;1(! 퐁sfYNC9/'  }obVJ?6.& xk_RE<3+$ tfZOB90)" }oaVK?6-&  xk]QF=3+$ sfYMB:1)" nbVJ?6.&  i]RG=3,% cXMC:0*# _TI?6.'! YND;3*$ SI?7/'!ND;3+% J@7/(" G=4,%  A80)" <4,&  7/)#  `a:`a5`a`_^_`6`ab`^WUUX[^`a`1`a_WOGDCGMTZ_`aa+`c`TE?8668;DMX^bccba`)`SL9/-*))+/6DPZ__`aa&`>7,)(''()+19CJMORW[^``aa`$`.+'&&'*/6;>@CINTZ^`a`$`('&&'(*+,/26=GSZ^`$`&'('&&'&%&'()+-08EOY^`#`&'(+6AQZ_a`!`&(-5ES]a`!`&(.;IX`aa``&'+4BU`aa``&')0=Q`aa``&'(.9O`aa``&'(.9P`aa``&&'(.:Raa `&&')/=Uba` `&')3DXba` `&',>Q_b`!`&').@V`a`!` &'&(6;ccb`"` &'&(6;ccb`"`752򛘒/񛚔o_XU^k}*蝗|XK=86:CWl'yi@(!'7Ws%H9"-?Udlry$$(7DINWbo}$!'/9I_y#",p$=r&@x(I~ 1X !Kt %O! 8B" 8B":551+)&%ÿ$$#!    !! " " $+4>IVamz $+3GQ\gs #*19BKU`lx !'.5=EOZep} %*08@IS]ht  !',3;DMValw #(.6>GOYcmx  $*18@IR[doz !&,3:CKS\ep{ #(.5FMU^gpy !%*18?EMU]emw !&,17=DLS[bkt} !&+06DIPW]dkqx~  $)-16;AGMSY_elsx~  #'+.38=CHNSX^ejpv| %5CEA3% !$(,049>CHLRX]bhmrx}&Ebz}w`G."5"%)-159>BGMRV[_dimqv{ !>ky\MC@><94-$ #'*-148=DGKPTW\`dinrvz~.Uƫxtqnh]O<,!$&),/4:=@EILPSW\aeilptx{~7eǿjK/!!#&)-247;?BEHLPTY\_dgkmptx{~:kпsH-!#&),/258;>ADHMPSVZ]`cfjmosvy}:k̟e=!$'),/257:=ADGILOSVY\_`dhkmq0Z忁N%!$')+.1479;>ACGILORSVY\_b %G ғY)  !#&)+.01469;>?BEGIKNQS1cԕZ(  "$&'(+-01358;=>?BEFCmąN"   "$&()+-/13458:<'Fpجm>   !"$&'()*,.02'CgѬL* !""$&&()#?=92)        |`;`-`-` |;-- |;--< %    ƾӽӫ՞~}{stux{|~׎}{{zywutrpnmlcdfikmoqqrsuwwxzz{||}~~}|{yxwvusqomlkjhgfdca_^]TVXZ\^`bbcdfgghiijjklmnnononnmllkihgfeca`_]][XXWVTSQPPHIKMNPRTUVWWXYZZ[\[[\]^__^^_`a`__^^]\\ZYYXVSRQPOOMKIHHGFFE<>@ABDEGHIJJKLLMNOOPRQRRSRRQPPONNMLKJHGFFEDDCA@?>=;9872367789;<=>>?@?@@BCDCCDDEFEDCBBA?=<<;:9875441.*('*+-../122344567899::;:;<<;:977653100/,("  "#%&&()**+,,-../0011201221221001/-+*)(($! !"##$%&'&&'()(()*)()**)(%$$%&"          ?``:`;`:`:`8`6`6`3` 0`0`.`.`+`&`&`#`` ` `&`&`, `3 `3`:?:;::8663 00..+&&#  &&, 3 3:?:;::8663 00..+&&#  &&, 3 3:!Żvk_ULD;!ƽzodYOG?6 ɿ~sh]SIA92vkaVMD;4-¹xncYPG>6/)ùyoe[RIA91+%ĺzpg]TKB:3-'!ĺ|rh^ULD;4-)#Ļ~ti_VMF=5/)$ ļukaVNG?80*% żulcYOG@92,&!ĻukcZPH@93-'#úukbYPHA:2-(# ǿtjaYPHA:3-(# ļ~si`XPH@:4.'# {rh_WOH@:3.(# Ľypg^VNGA:3-(# wof]UMF@93-'#»|tkc[TME>82-(#  üxph`WQKD=61,'#¼{tlc\UMGA;50*&! }unh`XRKD>93.)%! ¾}wpib[TLGB<61,(#Ŀ~wqkd]VQJD?:40,(# xrkf_XRLGB<73/*&!  yrlf`[TMGC?:41-*$ {uojd^YSOIC>:72.)$  |wrlfa\WRMHD@;62.)$ Ҷ{vrmhc^YUPKFB><84/*$ ԧ}zvrlhd`[VRNJFB>:62-&  ؗ}yvrolhd^ZWSOKHD@<840,& ؈~|ywurolhda^ZWSOLJGC@<62-&  yvtrpmkhfda^[WTQNLIFB?;72-&! ifedb_][XUTROLIGDB@=93-(! ZXWUTRQPMKIGE@<851+'" NLJIGFECA>;850+&# %CBA?=:732.%" &52-,*'" ,% 3 5; ` ` ` ` ` ```````````          2+%   .("  *$  '! $       kV5+SUteclado     ;SU;SU<2N\tdq7*N6ͪ˾.ưļй.ưĽ)걲)𱲽%# # ˿ʲʲ¸¸´ĴƿļƽΫͽòķȾڴջ ƻϝ!ġ! ͸"Ⱥ#İ#пq\VR]d%©pV?((θr]G4'(DznT?-.iP9& 0OMH<* 5 :K87-G\^a2 #6Op2 %Fṋ*#>\}Ń(  8[Ԝ( 5Qz䣣(6ͪ˾.ưļй.ưĽ)걲)𱲽%# # ˿ʲʲ¸¸´ĴƿļƽΫͽòķȾڴջ ƻϝ!ġ! ͸"Ⱥ#İ#пq\VR]d%©pV?((θr]G4'(DznT?-.iP9& 0OMH<* 5 :K87-G\^a2 #6Op2 %Fṋ*#>\}Ń(  8[Ԝ( 5Qz䣣(6ͪ˾.ưļй.ưĽ)걲)𱲽%# # ˿ʲʲ¸¸´ĴƿļƽΫͽòķȾڴջ ƻϝ!ġ! ͸"Ⱥ#İ#пq\VR]d%©pV?((θr]G4'(DznT?-.iP9& 0OMH<* 5 :K87-G\^a2 #6Op2 %Fṋ*#>\}Ń(  8[Ԝ( 5Qz䣣(6 ). )4>Me.,@Zgr) - "Sѧc. Qԑ;B߶|G 2m0*jחV  ^ɓN#%؉D  )lv> Iz/!nl-! F|6"o}2#'u9 #$< ʊ9%=U D &]q Z&r ˀ0'{ ;(~ ҁ( \*~ =*v q+*k~ a*Tj f"*3-+'!  ʾs_VL=*  ˷lTg۸m%,J|%t篺,é,é4̱4̱ ûо ÿɼѳ<&ѳ<&̩zM %Ęf;%ίgE)'εiD)'ÚqI.  /IeȯmM1  %4DYpѪX6  ,B]yҬaE- 3Jc|ç_=  !/?Rgǝʹ׼༕kB  )g۸m%,J|%t篺,é,é4̱4̱ ûо ÿɼѳ<&ѳ<&̩zM %Ęf;%ίgE)'εiD)'ÚqI.  /IeȯmM1  %4DYpѪX6  ,B]yҬaE- 3Jc|ç_=  !/?Rgǝʹ׼༕kB  )g۸m%,J|%t篺,é,é4̱4̱ Ǿڶsttsrqlife_VTPF;/  ƾٿ~zwtsnec`VL?/&$#! ~{yuph_UJ?5--+(" ~wvtqj_PG?:50*%!#ǻ~qdX)û9;4&py~$*16:?BCDO\jv !):L]hpt $(,.7ALTZ\bkx  '4?M\l~ #+6Jbx%'4:AI]ny, #7Rdo- #,6ALXr5 /?M8 Nº6Nº2&=Xsƿڻ(/AYqͶ"ㆤ̶"׻ȹ ŹǼȸ ˹ !(dz)Ǵdz+ž)&Ͽ&Ѷȼκ(ڹʶ#뙬 뙬 쪵γ𷾼⻍\𷾼ֱ];׻g?! Ŷȕa. ¼޾jE&(˧vJ +qF&0󩯻sB 7f.f&7&8Pm6Bj6*t7S7S9::<=;9974ħ412-((#¼  ¶Ӫžų¶Ӫž 䲳 ýϺͼ ̻Ϻͼ ŻNº6Nº2&=Xsƿڻ(/AYqͶ"ㆤ̶"׻ȹ ŹǼȸ ˹ !(dz)Ǵdz+ž)&Ͽ&Ѷȼκ(ڹʶ#뙬 뙬 쪵γ𷾼⻍\𷾼ֱ];׻g?! Ŷȕa. ¼޾jE&(˧vJ +qF&0󩯻sB 7f.f&7&8Pm6Bj6*t7S7S9::<=;9974ħ412-((#¼  ¶Ӫžų¶Ӫž 䲳 ýϺͼ ̻Ϻͼ ŻNº6Nº2&=Xsƿڻ(/AYqͶ"ㆤ̶"׻ȹ ŹǼȸ ˹ !(dz)Ǵdz+ž)&Ͽ&Ѷȼκ(ڹʶ#뙬 뙬 쪵γ𷾼⻍\𷾼ֱ];׻g?! Ŷȕa. ¼޾jE&(˧vJ +qF&0󩯻sB 7f.f&7&8Pm6Bj6*t7S7S9::<=;9974ħ412-((#¼  ¶Ӫžų¶Ӫž 䲳 ýϺͼ ̻Ϻͼ Ż 3K>1% 2骡|rgc^WI9)  (źk_ZK<.(# "̻x]C*" " q\NC5& Һ|_@1% ô{hU7#Ŵo^K9)  ϭmK, "òjN4 (չz\E1  )Ͳb< -δxX?* +ױgD% )ƪU5[j'Ƥ]8 $6Wp)㼉 ",3@N^m$ !2I^p" *[|) %De(.Kh# ,:Md~  0Rn #4?Rh~ ٻ '/;Idz ҾqI #9Mcz ӤzS6 '1GVn T' ([! T& /R  e찳 װӸζӸѾ¼俕qT oé&u Ѯ#u Ź% Ǯ! Ȯ! ÉB .. ̧i2F}ε ׵M'#Kε ʳgTZvٸаŸwW?4Fc¸ڻҵŹʹw_RLYjŹnUA=I_贸ͰfJ5+6Kr 륦ЮfN>GVn T' ([! T& /R  e찳 װӸζӸѾ¼俕qT oé&u Ѯ#u Ź% Ǯ! Ȯ! ÉB .. ̧i2F}ε ׵M'#Kε ʳgTZvٸаŸwW?4Fc¸ڻҵŹʹw_RLYjŹnUA=I_贸ͰfJ5+6Kr 륦ЮfN>GVn T' ([! T& /R  e찳 װӸζӸѾ¼俕qT*z ڠU&Z P%8 ֪p>%H 潅O. "w ݹN#!@ ƦfH, E ⼕mQ:) W eH5$  #oɲv^OC<0" .nŮwYI<5* 0w˾nfbZRH;0-+*&" 5pʻxurohaX&Tɼ Dh :[z" #1Ji *;Og{ +EU_t  #+6ELS^o (7@FHOZjw $(*,2;GR\biosuv{@볮˿&=Ǵ˿&=ǴwT5@gsT5 CoԿiL4!>\ǪdC' )El սfJ. &?a oT:( $5PmǪfF(9^͸hO9'#:WvzY>( !;[ 9#  $@` @볮˿&=Ǵ˿&=ǴwT5@gsT5 CoԿiL4!>\ǪdC' )El սfJ. &?a oT:( $5PmǪfF(9^͸hO9'#:WvzY>( !;[ 9#  $@` @볮˿&=Ǵ˿&=ǴwT5@gsT5 CoԿiL4!>\ǪdC' )El սfJ. &?a oT:( $5PmǪfF(9^͸hO9'#:WvzY>( !;[ 9#  $@` @:  PH>865441//-*&$$%" !##&,1455668CKXdosw $*059>J\p   "#%&*4=FMTZ]acdfmu!%'()*.4(! ŷ|hT>* "ͽsZA'%±{bPE7*!&ƼvdM>0 ,ﭙ~oaF/ .PD7/'4*T* AServidor de terminales TCOS     n7gimp-text-layer(text "Servidor de terminales TCOS") (font "HandelGotD") (font-size 25.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "es-es") (base-direction ltr) (color (color-rgba 0.874510 0.742658 0.284644 1.000000)) (justify left) (box-mode dynamic) (box-unit pixels) AAMYA!C/9IC`$#,^8#D$@~xx#;19'(( (('#(!(' (( " JDGD$pW ~D#~;GD$㽴5C D$+tD$R D$;QZD$AT44'D$D$ nD$;T0\& mD$d ٸD$n D$f D$| D$ D$D$  )SjD$D$h D$, D$o{D$D$tIB$"'$" 84'84 84'84 84'84 (W4EhD@~xx(U Be1(V ivV() :( W( 㽴5(# # ( AT(  n(  (k Neq ((6 (x{;%  Q Wi  )S(D m (3D\&o$ .=4I P(v>Soleupix-Tcos     VT)gimp-text-layer (text "Soleupix-Tcos") (font "HandelGotD") (font-size 60.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "es-es") (base-direction ltr) (color (color-rgba 0.570150 0.576132 0.654902 1.000000)) (justify left) (box-mode dynamic) (box-unit pixels) Hv>h(v>όlC{ * Ax" ![ t S i@+ '4 5Yr6%6&0Tp~|iJ#_ۉ"!f n ZZۑdOPi ﱉj^VTTRNJ@5! gS\X  \q c d( v7eAYclsttw{fdO(<8|+'i)"71^VW OT L x "G &>ds mdd60d* $dq n Odί{>RڗA31FPPF/ D 8888888888 (244* 44  $r@  5 @9@?@⨅rhddQ@kJ@D @ @H@S3@s@HH:@@@@@PPA@\<y4Dq& 3 $|o1]F[佦{ U r  CB  = <9888888+442+4 42,#+442  ӚF  0  U I ddes K       W    J  l  z}  k  j  w  ~  ^  1    s  V   bj " -    Ȧq 888888888 "o A$BHt% '# (J{(*=GS+-.-PX6g pL 6H0 0lg.Wa{7,,*( >(~J{W&I+$""  ?!7 |} ok HF%H%H%H%H%| )l7l7l7l7l)044 lZ 0_lj0fl0l0lrgddligl i lrqlcl ((l e}el Sfl 3<l '+l l +)l 97l W^l l TWl 1TllBGl?l+ªlR00lS0$l%0nlc0R   0Tp~|iJ$-34 41ۉ" !   9?MۑdOPiylgd d_S\(DDb !ds!Sy"`!d!C8˫`'K"Q1MV0;BFGHHIKQ_X D! L , ! s m& @  @s O@sڗA @ 1FPPF/ ].=www.consoltux.com     -gimp-text-layer(text "www.consoltux.com") (font "HandelGotD") (font-size 60.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "es-es") (base-direction ltr) (color (color-rgba 0.874510 0.742658 0.284644 1.000000)) (justify left) (box-mode dynamic) (box-unit pixels) =;    =kQQmS @@@I 4444$44 448H88H88H88H88H88H88H88H88H88H88H88H88H88H88H88H8:H:=H=>H>4H4$H$HnHn}rH}r͘n#n "Q QQ Q?@@@I44$44 4444H8HH8HH8HH8HH8HH8HH8HH8HH8HH8HH8HH8HH8HH8HH8HH8HH:HH=HH>HH4HH$HHHHnHH}rH͘͘n43Q1 Q@@@@I$44)044 Z 0_j0f00rgddig i rqc((e}eSf3<'++)97W^TW1TdBG<?<+ª <R00 <S0$ <%0n< c0R?@@@I0Tp~|iJ+4 43-# ۉ" t !  9?MۑdOPiddp+S\(D b   d A S [y  ih` d ]u! 8 Tx ' TxK  Tx " Tx 1 TxM V Tx TxD TxL  Tx Tx  Tx s m Tx  Tx& Tx@  Tx@O  Tx@ڗA  Tx@1FPPF/ 5@@@I><<<<<<<<<$-34 410Tp~|iJ _ۉ"  f  9?ylgd d_ۑdOPiDgS\ Dq sc d( SeCfd˫`<8+'Q)"710;BFGHHIKQ_^V X !W D ,T L  !  G s m 0s$ s n O RڗA #1FPPF/ @@@Ifb)hd)hd)hd)hd)hd)hd)hd)hd)hd)24444/ 44 +442@ @ @ @ `dddd\@ hd @ hd @ hd @ hd @ hd @ hd @ hd @ hd @ hd @ hd @ hd @ hd @ hd < hd 4 hd & ff  `r $ P  3G ]F߳  U  r 5B q< C@@@I44 44)044 Z> j o A BHt  rgdd# i J{( i=GSr(-e}X6Sg3'pL6+9 WlgWa{7T,1  >dB ~J{W<?I+<+ª"<R  ?<S 7 |}<% ok H< c@@@@I4 0Tp~|iJ+440_ۉ" 0f  090?dۑdOPidd gS\@ D@q @c d@( S@e@fd@<8@+'@@)"@71@^V@@W D@T L @ @G@ s m@@00@0$ @0n O @0RڗA @1FPPF/ #I4320,$ l =;ddjyXN*PhbwR}LLLLLLLLLLLLLLLLLL C!Fondo     c #/;GS_kw+7CO[gs'3?KWco{ #/;GS_kw+7CO[gs'3?KWco{ #/;GS_kw+7CO[gs'3?KWco{TfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTfTf`@0tcos-0.89.93ubuntu2/images/logo.ppm0000664000000000000000000273407412260610261014031 0ustar P6 # CREATOR: The GIMP's PNM Filter Version 1.0 640 400 255 1,'1,'[YR[YR[YR[YR[YR[YR[YR[YR[YR[YR[YR[YR[YR[YR[YR[YR1,'1,'1,'1,'1,'[YR[YRΖ[YR[YR[YR[YR1,'1,'[YR[YR[YR[YR[YR1,'1,'[YRΖ[YR[YR1,'1,'[YR[YR1,'1,'[YR[YRΖ[YR1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'[YR[YR[YR1,'[YR[YR1,'1,'[YR[YR[YR[YR[YR1,'1,'[YR[YR[YR[YR1,'1,'[YR1,'1,'[YR[YR[YR[YR[YR[YR[YR1,'1,'1,'[YR[YR1,'1,'1,'[YR[YR1,'[YR1,'1,'[YR1,'[YR[YR[YR1,'[YR[YR[YR[YR[YR[YR[YR[YRΖ1,'[YR[YR[YR[YR[YR[YR[YR1,'1,'[YR1,'1,'1,'[YR[YR[YRΖ1,'4K4K4K*4K4K>I4K[YR1,'[YR[YR1,'1,'1,'[YR[YR[YRΖ1,'4K4K>I4K*********4K1,'1,'[YR[YR1,'1,'[YR[YRΖ[YR1,'4K>I4K>I****************4K4K[YR[YR1,'[YR[YRΖ[YR1,'4K4K>I************************1,'1,'[YR[YR4K4K>I4K>I>I****************************>I[YR1,'1,'1,'[YRΖ4K4K>I*4K************************************1,'1,'1,'1,'1,'[YRΖc4K>I*******************************************>I1,'[YR[YR1,'1,'[YRc4K4K*************************************************4K1,'1,'[YR1,'[YRc4K4K*******************************************************1,'[YR[YRΖc4K>I***********************************************************4K[YR1,'1,'[YR1,'[YR[YRΖc>I>I***************************************************************>I[YR1,'1,'1,'[YR1,'1,'[YRc4K>I********************************************************************>I1,'[YR[YR[YR1,'[YRc4K*************************************************************************4K[YR1,'[YRΖ4K4K******************************************************************************[YR1,'1,'1,'[YRΖ4K>I********************>I*>I*>I*>I*>I*>I***************************************************4K1,'1,'1,'1,'c4K>I*******************>I*>I*>I*>I*>I*>I*>I**>I>I>I>I>I>I>I*>I*>I*****************************************4K[YR[YR[YR1,'1,'[YRc4K******************>I*>I*>I*>I*>I>I>I*>I>I>I>I>I>I>I>I>I>I*>I*>I*>I>I*>I*>I>I*>I**************************************R1,'1,'1,'[YR4K4K********************>I*>I*>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I*>I*>I>I***********************************>I[YR1,'[YR[YR1,'4K>I******************>I*>I>I>I*>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I_>I>I>I>I_>I>I>I>I>I>I>I>I>I>I>I>I>I*>I>I>I*>I*******************************>I[YR1,'1,'1,'[YR4K>I*******************>I*>I*>I*>I>I>I>I>I>I>I>I>I>I>I_>I_>I____>I_>I__>I_>I_>I_>I_>I>I>I>I>I>I>I>I>I>I>I*>I*>I*******************************1,'[YR[YRΖ4K>I*******************>I*>I*>I>I>I>I>I>I>I>I>I>I>I>I_>I__>I_>I__>I_>I____>I_____>I__>I__>I_>I_>I>I>I>I>I>I>I>I>I>I>I*****************************4K[YR1,'4K4K******************>I*>I>I*>I>I>I*>I>I>I>I>I>I>I>I>I_>I_>I_>I__________>I_____>I______>I___>I__>I_>I>I>I>I>I>I*>I>I>I***************************4K[YR[YR1,'[YR1,'Ζ4K4K*****************>I*>I*>I*>I>I>I>I>I>I>I>I>I>I>I_>I__________>I__>I_______________>I____>I__>I__>I_>I_>I>I>I>I>I*>I>I*>I*************************Ö[YRΖ1,'[YR[YR[YR[YR4K4K*****************>I*>I*>I*>I>I>I*>I>I>I>I>I>I>I_>I_>I_>I_>I_>I_>I___________________________________>I_>I_>I>I>I>I>I>I>I*************************>I[YR[YR1,'[YR1,'[YR4K>I****************>I*>I*>I>I>I>I>I>I>I>I>I>I>I>I>I_>I__>I__________________________________________>I_____>I_>I_>I>I>I>I>I>I>I*>I*********************4K1,'1,'Ζ[YR[YR[YR4K>I*****************>I*>I*>I>I*>I>I>I>I>I>I>I>I_>I_>I__>I___>I_>I_________________________________________>I_____>I_>I>I>I>I*>I>I**********************>I1,'[YR1,'1,'[YR4K>I*****************>I*>I*>I>I>I>I>I>I>I>I>I>I_>I_>I__>I______________________________________________________>I_>I_>I_>I>I>I>I>I*>I>I********************4K1,'1,'4K*****************>I*>I*>I>I>I>I>I>I>I>I>I>I_>I_>I__>I_____>I________________________________________________________>I__>I>I>I>I>I*>I*******************>I1,'1,'Ζ1,'[YR1,'[YR4K4K*****************>I*>I*>I>I>I>I>I>I>I>I_>I__>I__>I__________________________________________________________________>I_>I_>I>I>I>I*>I******************4K1,'[YR1,'[YR[YR****************>I*>I*>I>I>I>I>I>I>I>I>I_>I_>I__>I_______>I_______________________________________________________________>I_>I>I>I>I>I*>I*****************>I1,'1,'1,'1,'[YR4K*****************>I*>I>I>I>I>I>I>I>I>I_>I_>I___>I__________________________ccҬIlcҬIlc______________c________________________>I__>I_>I>I>I>I>I*>I*****************[YR1,'[YR1,'[YR1,'Il1,'[YR4K*****************>I*>I*>I*>I>I>I>I_>I_>I___>I________________________ccҬIlIlcc_____c___c_______________________________>I_>I>I>I>I>I*>I****************4K[YR[YRIl****************>I*>I*>I>I>I>I>I>I>I_>I_____>I______________________cҬIlIl_______________c__c______________________>I__>I_>I>I>I>I*>I****************>I[YR[YRIl[YR4K******************>I*>I>I>I>I>I_>I_>I_>I_>I_____________________ccҬIlIl________________________________________cc____>I_>I>I>I>I*>I***************>I1,'[YR1,'[YR1,'1,'4K****************>I>I>I>I>I>I>I>I>I>I_>I_>I________________________IlIlIlc______________________c__________c_c____>I_>I>I>I>I>I*>I***************[YR[YR[YR[YR1,'1,'[YR[YR1,'[YR>I**************>I****>I>I>I>I>I_>I_>I_______________________IlIl_____c___c_____________________ccc_______>I_>I>I>I>I*>I***************4K1,'1,'1,'1,'1,'[YRΖ[YR****************>I*>I>I>I>I>I>I_>I_____>I_________________cҬIlIl____c_________c______c_c_c_____________>I_>I>I>I*>I*>I*************4K1,'1,'[YR1,'1,'1,'1,'1,'1,'1,'1,'1,'[YR[YR[YR[YR[YR1,'4K4K4Kc______c4K4K4K4Kcc_____c4K4K4K[YR[YR>I************>I*>I*>I>I>I>I>I>I>I_>I_>I_>I__________________IlIlIlc________ccccccccc__________>I__>I_>I>I>I>I>I***************4K[YR1,'1,'[YR1,'1,'1,'1,'1,'1,'[YR[YRΖ[YR1,'4Kc_______________4K4Kc________________4K***************>I*>I>I>I>I>I_>I_______________________cҬIlc_________________>I_>I>I>I*>I**************>IЖ[YR[YR1,'1,'[YR1,'1,'__________c___________1,'4Kc____________________4K1,'>I***********>I*>I*>I>I>I>I>I>I>I_>I_>I_>I________________c_cҬIlc___________________>I_>I>I>I>I>I>I*************>IЖ1,'1,'1,'1,'[YRΖ1,'4K________c_______________4K4K__________________c____c[YR4K**************>I>I>I>I>I>I>I___>I__________________cҬIlc_cҬIlcc__c_____c_____________>I_>I>I>I*>I**************R1,'[YRIl1,'[YR1,'4Kc________c4K4K4K1,'4K1,'4K4Kc________c4K_______c4K4K1,'4K1,'4K1,'4K4Kc___c____1,'>I************>I*>I*>I>I>I_>I>I>I_________________cҬIlc__Ilc______________________>I__>I_>I>I>I>I*>I*************Ö[YR1,'[YR[YR1,'1,'Ζ1,'_______c4K4Kc_______4K______cc______c1,'[YR4K**********>I>I*>I>I>I>I>I>I_>I____>I_____________cҬIlIlc__IlߪFcc________c___________________>I_>I>I>I>I*>I************4K[YR1,'Il1,'[YR1,'____c_c4K4K_______4K___c__4K4K______4K[YR********>I****>I*>I>I_>I>I_>I_>I______________cҬIlIl_c_c_______c_______________________>I_>I>I>I>I>I*************4K1,'1,'1,'Il1,'1,'Ζ[YR_______1,'______c4K_____4K4K_____c**********>I>I>I>I>I>I>I>I>I__>I_______________c__cҬIlIlc_________________________________>I_>I_>I>I*>I*>I***********4K[YR1,'1,'[YRΖ1,'4K_c___c______4K4K_____c_____1,'>I***********>I*>I>I>I_>I_>I______________cҬIlIlc__Ilc________c______c__c___________________>I>I>I>I>I*************4K1,'1,'1,'1,'[YR[YR______4Kc_____c_c___4K_____4K1,'4K********>I>I>I*>I>I>I>I_>I_>I______________Il___IlIlߪFc_________c___c__________c_____________>I_>I_>I>I>I*>I************4K1,'1,'1,'1,'IlΖc_____4K4K_____cc_____1,'1,'cc4K4K4K4K[YR*******>I***>I>I>I>I>I>I_>I__>I__________cҬIlIl_c_Ilc_______c___________________________________>I_>I>I>I>I>I***********4K1,'1,'Il_____c_c____4K_____4K1,'********>I*>I>I>I>I>I__>I______________IlIlcc_IlߪFc______c_____________________________________>I_>I>I>I>I>I*************4K1,'[YRΖ1,'1,'1,'1,'4K___c_4K4K_____4K4Kc_____4K1,'[YR4K*******>I*>I>I>I>I>I>I>I_>I_>I_________cҬIl_Ilccc_____c______________c___c__c______________________>I>I>I>I>I>I**********4K1,'Ζ[YR[YR1,'1,'[YR[YRc______c___4Kc______c4K[YR******>I*>I*>I>I>I_>I______________Ilc__Ilc____________c___________________c__c_____________>I>I>I>I>I>I*************4K1,'1,'1,'1,'1,'[YRΖ[YR[YR[YRc___________c_c_______4K4K*******>I*>I>I>I>I>I_>I>I_>I_________IlIl___IlIl_c_________________c__c__________________________________>I>I>I>I*>I**********4K[YRΖ1,'Il1,'1,'1,'Ζ1,'1,'[YR_____cc_____c____________c4K4K1,'>I*****>I*>I*>I>I>I>I_>I___________c_cҬIlIlIl__c______________c__________c___c________________________>I_>I>I>I>I>I*>I**********4K1,'[YR1,'1,'1,'1,'1,'1,'1,'_____4K4K__c__4K4Kc_______________4K4K[YR[YR4K*******>I>I>I>I_>I>I_>I_>I_______c___Il_____c____________c_______c______________c___c____________________>I>I>I*>I**********4K[YR1,'1,'Il[YR1,'4K__c__4K4K_____1,'4Kc_________________4K[YR******>I*>I>I>I>I>I_>I__________Il__cҬIlIlc______________c_______________c__________________c____________>I_>I>I>I>I>I>I*>I**********4K[YR1,'1,'1,'1,'_____4K4K_____4K4Kcc_______________4K*****>I*>I*>I>I>I>I_>I_>I________cIlIlc__Il_______cc___________________c__________c___c___________________________>I>I>I>I>I***********4K1,'1,'1,'1,'[YR4K_____4K4K__c__1,'1,'4K4Kc_____________4K1,'4K*******>I>I>I>I>I>I_>I________cҬIl_Il__IlIlIl_______c_________c_____c________c________________c_______c___________>I_>I_>I>I>I*>I**********4K1,'[YR_____4K4K_____1,'4Kc_c________4K[YR1,'4K*****>I**>I>I>I>I>I_>I_>I_____Il_IlIl_c_Il_________c___c_________________________c________________c________________>I_>I>I>I>I*>I**********c__c__cc_____1,'4Kc____c__[YR4K******>I>I>I>I>I_>I_>I_______Il_IlIl_Il_Il__________cc___________________c_____________c__c__c_________________________>I_>I>I>I*>I**********Ö[YRΖIlIl1,'1,'1,'____________4K_c_____*******>I*>I>I>I>I>I__>I____IlIl_Ilc______c_c_____cc_______c___c__c_______c____c________________c_______c__________>I_>I_>I>I>I>I>I*>I*********Ö[YR1,'[YR[YR[YR4K_____4K_____4K4K4K4K______1,'1,'>I*****>I*>I>I>I>I___>I_____IlIlcc_Il_c______________c__________________c____________c________________c_________________>I_>I>I>I*>I***********R1,'[YR1,'Il[YR[YR1,'_____c4K_c___4K4K_____4K___c_4K[YR4K******>I*>I>I>I>I>I>I______Il_IlIl_c_Ilc_______c___cc__c_c__c___________________________________c_____________c____________>I_>I>I>I>I*>I*********1,'1,'[YR[YRc_____1,'_____c_____4K1,'_____4K*****>I*>I>I>I>I>I_>I__>I___c_Il_cҬIlIl____________c__cc_________c_____c_______c____c_____c__c_______c____c_____________>I_>I>I>I>I>I*>I**********>I[YRIl[YR4K_____cc_____4K__c__c4K_____4K1,'1,'4K******>I*>I>I>I>I>I_>I____Il_IlIlc___cIl___c_____________________c_______c____c_____c__________c__________________________>I>I>I>I*>I*********4K1,'1,'[YRcc____4K4K___c__4K_____1,'4K_c___4K1,'******>I*>I>I>I___>I____ccIl_____________c____________c_________________________________________c_______c________>I_>I>I>I>I>I>I*>I*********4K1,'1,'[YR4K______4K4K______1,'1,'__________c_1,'>I*****>I*>I>I>I>I>I>I___>I_cIlcҬIlIl__________IlIl_____________c_______________c_______________c___________________c_____________>I__>I>I>I>I***********4K1,'Il1,'1,'[YR[YR1,'4K______4Kcc_____4Kc______c_____4K4K******>I*>I>I>I>I_>I_>I___Il_IlIlIl______________Il_________c_____c__c________c______c_______c_______c___c___c_____________________>I_>I>I>I>I>I*>I*>I********4K[YR[YR1,'Ζ[YR4K_______4K4K_______c____c__4K4Kc______1,'1,'******>I*>I>I>I_>I>I________άIlIlc_____________________IlIlcc_c____________c____c__c____________c__________________________c___________________>I>I>I>I>I***********Ö[YR[YR4Kc_______4K4K4K4K_c______4Kc_______4K4K4K4K_______4K1,'4K******>I*>I>I>I>I__>I________________________c______cIl__Ilc_____c________c____________________________________________c_____c__c________>I_>I>I>I>I>I>I*>I***********1,'Il[YR1,'4Kc__c___c___c4K_4K_________c_4K4K___________c4K_4K_______c___4K[YR1,'>I*****>I*>I>I>I>I>I>I__>I__________c___________________Ilc_IlIl_______________________c_____c_______c___c___c___c___c____________________________>I>I>I>I>I*>I********4K1,'[YR1,'1,'Ζ1,'[YR1,'c_________________c_____c_c_____________________1,'******>I*>I>I>I>I_>I_______________________c____________IlIlIlc___________c_____c__________c__________________________________________________>I_>I>I>I>I>I>I************4K1,'1,'1,'1,'1,'[YR1,'1,'[YR[YR1,'4K____________c_____c1,'4Kc__________________c4K[YR4K******>I*>I>I>I>I_>I_>I_____________c___c_____________IlIl__IlIl__Ilc_______c________cc______________c__c_____________c__c____c____c___c______________>I_>I>I>I>I>I*>I*********4K1,'[YR1,'1,'Il1,'[YR1,'4Kcc____c______c4K4Kcc___c___c___cc4K1,'1,'******>I*>I>I>I_>I_>I_________________________c_c_____Il__cҬIlIlc__IlIlc__c___________c__c_c__c_____________________c________________________c________>I_>I_>I>I>I>I*>I***********Ö1,'[YR[YR[YR4K4K4K4K4K4K4K1,'1,'4K4K4K4K4K4K4K4K4K[YR******>I*>I>I>I>I>I__>I_____________________c___________IlIlIlIl_IlIl_________________ccc__________________c__c_________________c_____________________>I_>I>I>I>I>I*>I*********>I1,'1,'[YR1,'[YR[YR1,'[YR>I*****>I*>I>I>I>I_>I_>I__________c____c___c_____________IlIl__cҬIl___c______c_______cc_____c____________________c_______c_____c_________________>I_>I>I>I>I>I*>I***********4K1,'[YR*******>I*>I>I*_>I>I_____________c_______________c_____c__Il_____c______c_____c_________c__c________c_________c____________c___c_________>I___>I>I>I*>I*>I*********4K1,'[YR1,'[YR4K*****>I*>I>I>I>I>I>I__>I_______c________________c________cҬIlIlIl_________________________________________c____c_______c___________________>I__>I>I>I>I>I>I>I************Ö1,'1,'[YR1,'[YR1,'[YR4K*******>I*>I>I>I>I>I_>I_______________c___________c______Il________c__________c__c________c__c______________________c__________________>I_>I>I>I*>I*>I*********4K1,'[YR1,'1,'*****>I*>I*>I>I>I_>I____________c________c__c_______c___c____________c___________c_________________c_________________c__c_________>I_>I_>I>I>I>I>I*>I**********R1,'[YR[YR[YR4K*******>I*>I>I>I>I>I>I_>I___________c____________c________cc___c____c____c______________________c_______c__c___c___________________>I_>I_>I>I>I>I>I**>I********>IЖ1,'[YR1,'[YR4K******>I*>I>I>I>I_>I_______c_________c___________________Il____________________cc___c_______c____________________c________________>I_>I>I>I>I>I*>I***********1,'1,'[YR>I******>I*>I*>I>I>I>I>I>I____________________c_________c____Il_____________________c___c__c____________c________________c________>I__>I_>I>I>I>I*>I*>I*********Ö1,'1,'1,'********>I*>I>I>I_>I__>I_______c_______c_____c___c________IlIlc__c__c________________c__________c__c______c__c______c____________>I>I_>I>I>I>I*>I***********4K[YR4K*****>I**>I*>I>I>I>I>I>I____________c________________________Il_c_______c______________c_cc_c___________________c______________>I__>I_>I>I>I>I*>I*>I********>I4K1,'[YR1,'4K*******>I*>I>I>I>I>I_>I_>I_________________c__________c______Il_IlIl__________c__c___c_____c_________c__c___________________>I_>I>I_*>I>I>I*>I***********4K[YR>I*******>I*>I*>I>I>I>I>I________c______c_______c__c__________IlIl_Ilc_______________________ccc________________c____________>I_>I>I>I>I*>I**>I*******>IЖ[YR[YR1,'[YR[YR[YR>I********>I*>I>I>I>I_>I_>I____________c_______________________Il__Ilc___c____________________c____________c___________>I_>I>I>I>I>I>I>I>I*>I*>I*********1,'[YR[YR1,'>I*****>I***>I*>I>I>I>I>I_>I_________c_______c____________c_____Il_cIl____________c_____________c__c_______c________________>I__>I>I>I>I>I>I***********4K1,'1,'********>I*>I*>I>I>I>I_>I_______________c_____c___c_c__________Il_Ilc____c__c_________________cc_____c___________________>I_>I_>I>I>I>I>I*>I*>I**********4K[YR1,'Il1,'*********>I*>I*>I>I>I>I>I>I>I____________________________________cIl_c_____________c____________cc_____c________c_________>I_>I_>I>I>I>I>I*>I***********4K[YR1,'Il>I*******>I**>I*>I>I>I>I_>I________c___c________________c__c______IlIl_IlIl_________c_________________cc___c___c____________>I_>I_>I>I>I>I>I>I>I*>I*>I**********Ö[YR[YR[YRIl4K**********>I*>I*>I>I>I>I>I>I>I_____________c____c___c_______________Ilc__c__________c______________c____________________>I_>I_>I>I>I>I>I*>I**>I*******>I4K1,'Ζ1,'1,'>I********>I**>I*>I>I>I>I>I_>I________________________________c___________c_______________________c_________c_________>I_>I_>I>I>I>I>I*>I*>I***********[YR[YR1,'[YR4K***********>I*>I*>I>I>I_>I>I>I_____________c___________c___________Il______________c_____c__________c_cc_____________>I__>I_>I>I_>I>I>I>I>I>I**>I*********[YRΖ1,'1,'[YR>I*********>I**>I*>I>I>I>I>I>I_>I________________c____c_____c_____c____Il________c_______c______c________c_c________________>I_>I>I>I>I>I>I*>I*>I*>I*********4K[YR1,'[YR1,'1,'1,'[YR[YR1,'[YR4K************>I***>I>I>I>I_>I>I>I________________c____________________c_________________________c______c___c____________>I_>I_>I_>I>I>I>I>I*>I************Ö1,'[YR1,'1,'1,'1,'[YR[YRΖ[YR[YR1,'>I**********>I**>I>I>I*>I>I>I>I>I__>I____________________c______c_________IlIl___c______c________________________c________________>I_>I>I_>I>I>I>I>I*>I*>I*>I*>I*******>I[YR1,'1,'[YR1,'1,'1,'1,'1,'1,'[YR1,'[YR[YR[YR[YR1,'4K***************>I*>I>I>I>I>I>I>I_>I_____________________c______________Il_______c_______c__c__________________cccc_________________>I_>I_>I>I>I>I>I>I>I>I*>I***********>IЖ[YR1,'1,'1,'[YR[YRΖ1,'1,'1,'>I***********>I*>I**>I*>I>I>I>I>I>I_>I_>I______________c______c______________Ilc___________________c__c____c____________________________>I_>I_>I_>I>I>I>I>I*>I*>I**>I*********>I[YR[YR[YRIl1,'[YR[YR1,'1,'4K*************>I**>I**>I>I>I>I>I>I>I>I_>I_____________________________c___c_IlIl__________c___________________________________________>I__>I_>I>I>I>I>I>I>I>I>I*>I*>I**********>I[YR1,'1,'[YR[YR1,'1,'>I***************>I*>I*>I*>I>I>I>I_>I>I_>I_>I____________________c_____________IlIl___c____________________c______c_____________________>I_>I>I>I>I>I_>I>I>I>I*>I*>I****>I*******1,'1,'Il1,'1,'Ζ1,'1,'4K******************>I*>I*>I>I>I>I>I>I>I>I>I_>I_____________________c____________Il____________c__c__________________________________>I_>I_>I_>I_>I>I>I>I*>I>I*>I*>I*>I********>I[YR1,'Il1,'1,'Ζ1,'[YR1,'>I****************>I**>I*>I*>I>I>I>I>I_>I_>I>I>I_>I_________________________________Il______c___________c____________________________>I_>I_>I>I_>I>I>I>I>I>I*>I>I*>I*>I***********[YR1,'1,'1,'Ζ1,'1,'4K**********************>I**>I>I*>I>I>I_>I>I_>I>I_>I________________c______________cҬIlIlIl____________________________________________>I_>I_>I_>I>I_>I>I>I>I>I>I>I>I>I*>I*>I**>I********>I4K[YR[YR1,'1,'1,'[YR1,'1,'4K*****************>I**>I**>I>I*>I>I>I>I>I>I>I>I>I>I>I_>I>I>I_>I______________________________________________________________________>I_>I_>I_>I>I_>I>I>I>I>I>I>I>I>I>I*>I*>I*>I**>I*********[YR[YR1,'1,'1,'Il[YR[YR1,'4K**************************>I***>I>I>I>I>I>I>I>I>I_>I_>I>I_>I_>I_____________________________________________________________>I_>I__>I_>I_>I_>I>I>I_>I>I>I>I>I>I*>I*>I*>I*>I**********>IЖ1,'Ζ[YR1,'Il1,'1,'*********************>I*>I*>I*>I*>I*>I>I>I>I>I>I>I>I>I>I>I>I_>I>I_>I>I>I_>I_>I_______________________________________________>I_>I_>I>I>I_>I>I_>I>I>I>I>I>I>I>I>I>I>I>I>I>I*>I*>I*>I**>I***********4K4K1,'[YR[YR1,'1,'1,'[YR1,'1,'[YRΖ1,'1,'1,'1,'1,'1,'1,'1,'1,'4K****************************>I*>I**>I*>I>I>I>I>I>I>I>I>I>I>I>I>I_>I>I_>I_>I>I_>I_>I_>I_>I_>I_>I__>I_>I__________________>I_>I_>I_>I>I>I_>I_>I_>I_>I_>I>I>I_>I_>I>I>I>I>I>I>I>I>I*>I>I*>I*>I*>I***********4K[YR1,'1,'1,'1,'1,'1,'1,'4K**************************>I****>I*>I*>I*>I*>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I_>I>I_>I_>I>I_>I>I_>I_>I>I_>I_>I>I>I>I_>I>I_>I>I_>I>I>I>I>I>I_>I_>I>I_>I>I_>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I*>I*>I*>I*>I************>I>I1,'1,'1,'1,'1,'Ζ1,'1,'1,'1,'1,'>I****************************>I******>I*>I*>I*>I*>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I_>I>I>I_>I>I_>I>I_>I_>I>I_>I>I_>I>I>I_>I_>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I*>I*>I*>I*>I*>I*************4K[YR[YR1,'Il1,'1,'[YR1,'[YRΖ1,'1,'1,'1,'1,'1,'>I******************************>I*>I*>I***>I**>I*>I*>I*>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I_>I>I>I>I>I>I>I>I_>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I*>I*>I*>I*>I*>I**************>I>I4K[YR[YR1,'1,'Il1,'1,'1,'[YR1,'[YR[YR1,'1,'1,'1,'4K***********************************>I**>I*>I**>I*>I*>I**>I*>I*>I*>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I>I*>I>I>I>I>I>I>I>I>I>I>I>I*>I*>I*>I*>I***>I*****************4K[YR1,'1,'1,'1,'Il1,'[YR[YR1,'[YR[YR1,'1,'******************************************>I*****>I*>I*>I*>I*>I*>I*>I*>I*>I*>I*>I>I*>I>I*>I>I>I>I>I>I*>I*>I>I*>I>I>I>I>I>I*>I*>I**>I*****>I*******>I***************>Icc[YR1,'[YR1,'1,'1,'1,'1,'1,'1,'4K******************************************>I*>I*******>I**>I*>I*>I*>I*>I*>I**>I*>I*>I****>I*>I*>I*>I*>I***>I*>I*>I*>I**>I*>I***>I******************4Kcc1,'1,'1,'1,'1,'Ζ1,'1,'[YR1,'[YR[YR1,'Ζ1,'[YR1,'1,'1,'1,'1,'1,'IlIl1,'1,'1,'1,'>I*********************************************>I*>I*>I*********>I**>I*>I*>I***>I*>I*>I**>I*>I**>I**>I*>I****************************>I4Kcc1,'1,'1,'1,'[YR1,'[YR1,'1,'1,'1,'***************************************************>I**>I*>I*********>I*>I*****>I************************************4Kcc1,'1,'[YR1,'1,'[YR[YR1,'[YR[YR1,'1,'[YR[YR1,'[YR[YR[YR1,'Il1,'1,'1,'1,'1,'Il1,'1,'1,'1,'1,'1,'*********************************************************>I**>I****************************************>I>I4K_cҖΖΖ[YR1,'1,'IlIl1,'[YR1,'1,'1,'1,'1,'1,'1,'1,'1,'Il*******************************************************************************************>I>I4K_4Kc1,'1,'1,'1,'1,'1,'[YR1,'1,'[YR[YR1,'1,'1,'1,'1,'1,'4K****************************************************************************>I>I>I>I4K>I4Kcc[YR1,'1,'1,'1,'1,'[YR1,'[YR[YR1,'1,'1,'1,'1,'1,'4K4K>I4K>I4K>I>I>I>I>I4K>I4K>I*4K4K>I********************************************>I*>I>I_4KccccΖΖ[YR1,'1,'[YR1,'[YR[YR[YR[YR1,'[YR[YR1,'[YR1,'1,'1,'Il1,'1,'1,'Il1,'1,'1,'1,'1,'4K4K>I4K>I4K>I4K>I4K>I4K>I4K>I4K4K>I4K>I4K4K4K_4K4K_4KcccccΖ[YR1,'1,'Il[YR[YR1,'[YR1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'[YR[YR[YRΖΖΖΖΖΖΖ[YR1,'1,'1,'[YR1,'1,'[YR[YR1,'[YR[YR[YR1,'1,'1,'1,'Il1,'1,'[YR[YR[YRΖ[YR[YR1,'[YR[YR1,'1,'[YR1,'[YR[YR1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'[YR[YR[YRΖ[YR[YR1,'1,'[YRIl1,'[YR[YR1,'[YR[YR1,'[YR1,'1,'1,'Il1,'1,'1,'[YR[YR[YRΖ[YR1,'[YR[YR1,'[YR[YR1,'1,'1,'[YR1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'[YR[YR[YRΖ[YR[YR1,'[YR1,'[YR[YR1,'[YR[YR1,'[YRΖ1,'1,'1,'1,'IlIl1,'1,'1,'1,'1,'[YR[YR[YR[YR[YRΖ[YR[YR[YR1,'1,'[YRIl[YR[YR1,'1,'[YR1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'[YR[YR[YR[YR[YR[YR[YR[YR[YR[YR[YR[YR[YR1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'[YR[YR1,'[YR[YR1,'[YR[YR1,'1,'1,'1,'1,'1,'Il1,'1,'Il1,'[YR[YR[YR1,'1,'1,'[YR1,'1,'1,'1,'Il1,'1,'1,'1,'1,'[YRIl1,'[YR[YR1,'[YR[YR[YR[YR[YR[YR1,'1,'Il1,'[YR1,'[YR[YR1,'1,'Ζ1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'[YR[YR[YRΖ[YRΖ1,'1,'1,'1,'[YR[YRΖ[YR1,'Il[YR[YR1,'[YR[YR1,'[YR4K1,'4K4K1,'4K4K____c4K4K____c4K___4K4K4K_4K1,'[YR1,'4K___4K4K4K4Kc___4K__4K4K4K1,'__4K4K4Kc_4K4K_4K1,'[YRc_c4K4Kc_c____4Kc_4K4K_4K4K_4K4K_c____1,'4K_4K1,'1,'1,'1,'1,'[YR[YR[YR[YR[YR[YR[YR[YR[YR[YR[YRΖΖΖΖΖ[YR[YR[YR[YR[YR[YR[YR[YR1,'1,'1,'1,'1,'4K_c4K_4Kc4K4K4K___c4K4Kc___c4K4Kc4K4K__4Kc___c4Kc4K4Kc4K__c4K4K4K4K4K4K4K4K4K___c4K4K4K____4K4Kc4Kc_4K4Kc4Kc4Kc__4Kc4K_c_4Kc4Kc___c4Kc4K4K___c4K4K4K___4K4K1,'1,'1,'[YRΖ[YR[YR[YR[YR[YR1,'Ζ[YR1,'______c_c4K4K4Kc__4K4K___4K4K4K___4Kc_4K_c4K4Kc__4K4K4K4K____4K_c__c_4K4K_4K4K_4K4K_c4K4K4K__4K4K__4K4K4K4K__4K4K_4K4Kc_4K4K_4K__c_c4K4K__4K_c____4K___4K4K4K___4K__4K_c4K4K4K__4K4K_c4K4K4K__4K1,'1,'1,'[YR[YR[YR[YRΖ1,'1,'[YRΖ[YR1,'1,'[YR1,'1,'4K_cc_4K___4K4Kc_4K4Kc_c_4K4K__4K4K__4K______4K_4K4K___4Kc_4Kc_c4K_c_4K4Kc_4Kc_4K4K_4K_4K4K4K_4K4Kc_c_4K___4K__4K_4K1,'_c1,'1,'1,'[YR[YR[YRΖ[YR1,'1,'1,'[YRΖ[YR1,'1,'[YR[YRΖ[YR[YR1,'1,'[YR1,'4K_4K4K_4K_______4K_4Kc_cc_4Kc____4K_4K4K__1,'4K_c4K_4K4K__4Kc__4K_c4K_4K4K_4K4K_4K__4K4K_4K__c4K__4K4K_4K1,'1,'1,'[YR[YR1,'1,'1,'1,'Ζ[YR1,'1,'[YRΖ1,'1,'1,'[YR[YR4K_4K4K_4K__4K_4K4K_c4K4K4K4K4K4K_4K4K_4K1,'__4K____4K_4K4K_c____c_4K4K__c__4K_4K__4K4Kc4K4K_4K4K4K4K4K1,'4K_4K__4K1,'__4K_4K1,'1,'1,'[YR[YR1,'1,'[YR[YRΖ[YR[YR[YR[YR[YR[YR[YR[YR[YR[YR[YR[YR[YR[YR1,'[YR[YR[YR[YR[YR[YR[YR[YR[YR[YR[YR[YR[YR[YRΖ[YR1,'[YR[YRΖ[YR1,'1,'1,'[YR4K_4K4K_4K__4K_cc________________1,'4K_4K____4K_4K4K_4K__4K__4K_4Kc_c_c4K_cc__4K4K_4Kc_______________c4K_c4K_4K1,'1,'[YRΖ1,'1,'1,'1,'[YRΖ[YR[YR[YR[YR[YR1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'[YR[YR[YR[YRΖ[YR1,'1,'[YRΖ[YR[YR1,'[YR___c_4K4Kc4K4K_4K4K4K1,'4K4K4K1,'4K4K_4K4K_4K____4Kc4K4K_4K___c4K_4K4K_4K4K_4K4K_4Kc__4K4K_4Kc_4K4K4K4K4K4K4K1,'___c4K_4K1,'[YRΖ[YR[YR1,'[YRΖ[YR[YR[YR1,'1,'1,'[YR[YR[YR[YRΖ[YR1,'1,'[YRΖ[YR1,'1,'[YR1,'1,'4K_4K4K_4K__4K_4K4K_4Kc_1,'1,'_c1,'____4K_4K4K_4K____c_4K____4K_4K4K__4Kc4K4Kc4K__4K_c4K_4K[YRΖ[YR[YR1,'[YRΖ[YR1,'1,'1,'[YR[YR1,'1,'__4K4K____4K__4K4K_c4K4K4K_4K__4K4K____4K_4K4K_4K__4K_4K1,'__4K4K4K__4K_4K4K_4K_4K4K_4K4K_c4K4K___4K4Kc4K1,'Ζ[YR[YR[YR[YR[YR[YR1,'1,'1,'[YRΖ[YR1,'1,'__4K4K_c4K___4K4Kc_4K4K_cc_4K__1,'4K__1,'c_____4K_4K4K_4K____4K4K___4K4K_4K4K_cc__c4K4K_4K4K_4K4K__cc4K__4K__4K_4K[YRΖ[YR[YR[YR1,'1,'1,'1,'1,'[YR[YR1,'[YR[YR1,'c__4K4K1,'4K4Kc__c__4K_c4K1,'4K4K4K__4K4K__4K4K1,'4K4K4K__4K4K_4K4K__c4K4K4K__4K____4Kc4K4Kc4K__c__4K4K4K4K__4K4K_4K__c4K4K4K4K__4K__4K_c4Kc__4K_4K4K__4K4K1,'4K4K4K__4K___4K4K_4K1,'Ζ[YR1,'1,'1,'1,'1,'1,'[YR[YR1,'[YR[YR[YR4K4K_______4K4K__4K__c__4K4K4K4K______4Kc_1,'4K_____4K____4K_4K4K_4K__4K4K____4K1,'4K_4K4K_c___4K4K_4K4K_____4K_4K4K4K______4K__4K_c4K_4K[YRΖ[YR1,'1,'[YR[YR[YR[YR4K4K__4K4K4K4K4Kc_4Kc_4K4K4K[YRΖ[YR1,'1,'1,'1,'Ζ1,'[YR__4K_4K4K__4K_4K[YR[YR1,'1,'[YR[YR1,'1,'[YR__c_c4K4K4K_c_c[YR[YR1,'4K4K4Kcc4K4K4K1,'1,'[YR[YRΖ1,'1,'1,'1,'__4K________4K4K_4K[YR[YR1,'4Kcccc4K1,'4Kc4K1,'1,'[YR[YR1,'1,'4K1,'4K4K4K4K4K1,'1,'4K1,'Ζ1,'4Kccc4K4K4Kccc4K1,'[YR[YR1,'1,'[YR1,'1,'1,'1,'4Kcccc4Kcccccc4K1,'1,'1,'[YR1,'1,'1,'1,'[YRΖ1,'[YR[YR[YR1,'Ζ1,'[YR1,'1,'cccc4K4K4Kcccccccc1,'1,'1,'[YRߪFߪFߪF1,'1,'1,'Ζ1,'1,'[YR[YR[YR1,'1,'ߪF1,'4Kcccc4K4Kccccc4Kccccc[YRߪFߪFߪFߪFߪF1,'1,'[YR[YR1,'[YR[YR[YRߪFߪF1,'1,'4Kcccc1,'4Kcccc4Kccccccccc1,'1,'[YRߪFߪFߪFߪFߪFߪF1,'[YR[YRߪFߪFߪFߪF1,'1,'[YRߪF[YR1,'[YR1,'[YR1,'1,'Ζ1,'ߪFߪF4Kcccc4K1,'4Kccccccccccc4KcҖߪFߪFߪFߪFߪFߪFߪF1,'ߪFߪFߪFߪFߪFߪFߪFߪF[YRߪFߪFߪFߪF1,'[YR[YR1,'1,'1,'[YR1,'1,'ߪFߪFccc4K4K4KccccccccccccҖߪFߪFߪFߪFߪFߪFߪFߪFߪF1,'ߪFߪFߪF[YR1,'[YRߪFߪFߪF1,'1,'ߪFߪF[YR1,'4K1,'1,'[YRΖ[YR1,'1,'[YRߪFߪFߪFߪFc4K1,'ccccccc4Kcc4Kcc[YRߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪF[YR1,'ߪFߪFߪF[YR[YRߪFߪFߪF4Kcc1,'1,'1,'1,'[YR1,'1,'ccҖߪFߪFߪFߪF[YRccccccccccҖߪFߪFߪFߪFߪFߪFߪFߪFߪFߪF[YRߪFߪFߪF1,'ߪFߪFߪF[YR1,'1,'[YR1,'1,'1,'1,'1,'1,'[YR1,'1,'1,'1,'[YR1,'1,'1,'1,'[YR1,'[YRߪFߪFߪFccc4K4K1,'1,'1,'[YR[YR[YR4Kccc[YRߪFߪFߪFߪFߪFc4KccccߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFccߪFߪFߪF1,'1,'1,'1,'1,'[YRߪFߪFߪFߪFߪF[YRߪFߪFߪFߪFߪFߪFߪFߪF1,'ߪFߪFߪFߪFߪFߪF1,'1,'ߪFߪFߪFߪFߪFߪF[YRߪFߪF[YR4Kcccccc4Kcc4Kccc4Kcc4K4Kcc4K[YR1,'1,'1,'4Kc4K1,'1,'ߪFߪFߪFߪFߪFߪFߪFcҖߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFccccߪFߪFߪF1,'1,'ߪFߪFߪFߪFߪFߪFߪF1,'[YRߪFߪFߪFߪFߪFߪFߪFߪF1,'ߪFߪFߪFߪFߪFߪFߪF1,'ߪFߪFߪFߪFߪFߪFߪFߪF[YRߪFߪFߪF4K4Kccccc4Kcc4Kcccccc4Kcc1,'1,'[YR1,'[YR1,'[YRc4KߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFcccc4KߪFߪFߪF1,'ߪFߪFߪF1,'[YRߪFߪFߪFߪFߪFߪF[YRߪFߪFߪFߪFߪFߪF1,'ߪFߪFߪF1,'1,'ߪFߪFߪFߪFߪFߪF[YRߪFߪF[YR4Kcc4Kcc4K4Kcc4Kcc4Kcc4K1,'[YR[YR4K1,'ߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFccccccߪFߪFߪF1,'ߪFߪFߪF1,'1,'ߪFߪFߪFߪFߪFߪF1,'ߪFߪFߪF1,'ߪFߪFߪF1,'1,'[YRߪF1,'[YRߪFߪF[YRߪFߪFߪF1,'[YRߪFߪFߪF4Kcc4Kcc4Kccc4Kcccc[YR1,'1,'1,'[YRΖ1,'1,'4KߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFcccccccߪFߪFߪF1,'ߪFߪFߪF1,'1,'ߪFߪFߪF[YRߪFߪF1,'ߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪF[YRߪFߪFߪF1,'[YRߪFߪF[YR4Kcc1,'4Kcccc4K4Kccc4K1,'1,'[YRΖ[YR1,'4KccߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪF[YRcc4KccߪFߪFߪF1,'[YR[YRߪF1,'ߪFߪFߪF1,'1,'ߪFߪFߪFߪFߪFߪF1,'ߪFߪFߪF[YRߪFߪFߪFߪF1,'[YRߪFߪF[YR[YRߪFߪF1,'[YRߪFߪFߪF4Kcc4Kcc4Kccc4Kcc[YR1,'1,'1,'Ζ[YR1,'1,'4K4KccҖߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFc4KߪFߪFߪF1,'ߪFߪFߪF1,'ߪFߪFߪF1,'1,'ߪFߪFߪFߪFߪFߪF1,'ߪFߪFߪF1,'ߪFߪFߪFߪF1,'[YRߪFߪF[YRߪFߪFߪF1,'[YRߪFߪF[YR4Kcc4K4Kccccccccc4K1,'[YR[YR[YR[YR[YR[YR1,'1,'cҖߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪF[YRߪFߪFߪF[YRߪFߪFߪF[YRߪFߪFߪF1,'1,'ߪFߪFߪFߪFߪFߪF1,'ߪFߪFߪFߪFߪFߪFߪFߪFߪF[YR[YRߪFߪF[YRߪFߪFߪF1,'[YRߪFߪFߪF4Kcc4Kcc4K4Kccccccc1,'[YR[YR1,'1,'1,'[YR4K1,'ߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪF[YRߪFߪFߪF1,'1,'ߪFߪFߪFߪF1,'ߪFߪFߪFߪF[YRߪFߪF[YR[YRߪFߪF[YRߪFߪFߪFߪFߪFߪF1,'ߪFߪFߪF[YR1,'ߪFߪFߪF1,'ߪFߪFߪF[YRߪFߪF[YR4Kcc1,'4Kcc4K4Kcc4Kcc4K1,'cc4K1,'[YR[YR1,'1,'1,'4KߪFߪFߪFߪFߪFccߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪFߪF1,'1,'ߪFߪFߪFߪFߪFߪFߪFߪF[YR1,'ߪFߪFߪFߪFߪFߪFߪF1,'ߪFߪFߪF1,'ߪFߪFߪF[YRߪFߪFߪFߪFߪFߪFߪF1,'ߪFߪFߪFߪFߪFߪFߪF[YR[YRߪFߪFߪF4Kcccc1,'cccccccc4Kcc4K4Kcc1,'1,'[YR[YR1,'1,'[YR[YR4K1,'ߪFߪFߪFߪFΖccccccҖΖΖ[YR[YR1,'ߪFߪFߪFߪFߪFߪF1,'ߪFߪFߪFߪFߪFߪF1,'1,'ߪFߪFߪFߪFߪF1,'[YRߪFߪF1,'[YRߪFߪF[YRߪFߪFߪFߪF[YR1,'ߪFߪFߪFߪFߪF[YR[YRߪFߪF1,'c4Kcc4K4Kc4K4K4Kc4K4Kc4Kcc4K1,'[YR[YR1,'1,'[YR[YR4K4K1,'ߪFߪFߪFߪF1,'1,'4Kccccccccccccc4K1,'1,'ߪFߪFߪF1,'1,'[YR1,'[YR1,'1,'1,'[YR[YR[YRߪFߪFߪF1,'4Kcccccccccc1,'ߪFߪFߪF1,'[YR[YR1,'[YR1,'1,'[YR[YR[YRߪFߪF[YR4K1,'4K4K[YR4K4Kc4K1,'ߪFߪF1,'1,'[YR[YR[YR1,'[YR[YR1,'[YRߪFߪFߪF[YR4K4K1,'4K4K[YR1,'ߪF1,'1,'[YR[YR1,'[YR1,'1,'ߪFߪF1,'1,'4K4K4K4K4K4K4K4K4K4K1,'4K1,'[YR[YR[YRΖ[YR[YR[YR1,'1,'1,'1,'ߪFߪF1,'1,'[YR[YR[YR1,'1,'[YR[YR[YR1,'1,'1,'1,'[YR[YR[YRΖ[YR1,'[YR[YR[YRΖ1,'1,'1,'1,'1,'[YRΖΖ[YR[YR1,'1,'1,'1,'1,'[YR[YR1,'1,'1,'1,'1,'1,'[YR[YR[YRΖΖ[YR1,'1,'[YR1,'1,'1,'1,'1,'1,'[YR[YR[YRΖ[YR1,'1,'[YR1,'1,'Ζ[YR1,'1,'1,'Ζ[YR[YR1,'1,'1,'1,'1,'1,'Ζ[YR[YR1,'1,'[YRΖ1,'1,'1,'1,'[YR[YR1,'1,'1,'1,'1,'1,'1,'[YR[YR[YR[YR[YR[YR[YR1,'1,'[YRΖ[YR[YR1,'[YR[YR1,'[YR1,'1,'Ζ[YR[YR[YR[YR[YR[YR[YR1,'[YR1,'1,'1,'1,'1,'1,'1,'1,'[YR[YR[YR[YR[YR[YR[YR[YR[YRΖ[YR1,'[YRΖ[YR1,'1,'1,'1,'1,'1,'1,'[YR[YR[YRΖ[YR1,'1,'1,'[YRΖ[YR1,'1,'Ζ[YR1,'1,'[YR[YR1,'[YRΖ[YR1,'1,'[YR[YR1,'[YRΖ[YR1,'1,'1,'1,'1,'1,'1,'1,'[YRΖ[YR1,'1,'[YR1,'1,'Ζ[YR1,'1,'1,'[YR1,'[YR1,'1,'[YR[YR[YR[YR[YR1,'1,'Ζ1,'[YRΖ[YR4K[YR[YR1,'1,'[YR[YR1,'1,'[YR[YR[YR[YRΖ[YR1,'1,'Ζ1,'[YRΖ[YR[YR[YR1,'1,'1,'[YR[YR1,'[YRΖ1,'1,'[YR[YR[YR[YR[YR[YR[YR[YR[YR[YR[YR[YR[YR[YR[YR[YR1,'[YR1,'[YR1,'1,'1,'1,'[YR1,'[YR[YR[YR1,'Ζ1,'1,'1,'Ζ[YR[YR[YR1,'1,'1,'1,'Ζ[YR[YR[YR1,'[YRΖ1,'[YRΖ[YR1,'[YR[YR[YR[YR[YRΖ[YR[YR1,'[YR1,'[YR[YR1,'1,'[YR1,'[YR1,'1,'1,'[YR[YR[YR1,'[YR1,'1,'1,'1,'1,'1,'1,'[YR[YR[YR[YR[YR1,'Ζ[YRΖΖΖΖΖ[YR[YRΖΖ[YRΖ[YR1,'1,'Ζ[YR1,'1,'1,'Ζ[YR[YR[YR1,'1,'1,'ΖΖ[YR[YR[YR[YR1,'1,'1,'1,'1,'[YR[YR[YR[YR[YR[YR[YR1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'[YR[YR1,'[YR[YR1,'[YR[YR1,'[YR[YR[YR[YR[YR[YR[YR1,'[YR[YR1,'[YR1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'1,'tcos-0.89.93ubuntu2/images/logo9-640x480.psd0000664000000000000000000113041712260610261015035 0ustar 8BPS$48BIM%8BIM$) adobe:docid:photoshop:c598a419-d95a-11da-9351-f6d394a78062 8BIM}}8BIM&?8BIM x8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM 8BIM@@8BIM8BIMO logo9-640x480nullboundsObjcRct1Top longLeftlongBtomlongRghtlongslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongRghtlongurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM8BIM48BIM ` JFIFHH Adobe_CMAdobed            `"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?I%)$sGn1qr~[{l踍YPw??fcI@H;k{cKSW 2.q~Y#eU:^/ߡMTHʰkBc%}̑O8YDdDg|3~c~oWlC]ں|}tn:FNfGWdSF(eLC[p?GB9z{G]*u_[:FOS*}[^]Q?GM,_oAWϋqGyNAGDߪ1 Um4? ~ờO>;XsawqX?eQGX5=-{~c3}OK⁶Ǜ}Ų=qٿ+-O{8 8iY9FR21cѴwWC#Cke)%G_zxIX#;"qoXlo}naeYn׮lf~5B+lʱ6[ -*k=u,ea\Y[C5znnkV1osu w-3SԾkl%)n_NRFW\?7}M,ޝgMٓeuW[ {_Yao1fF.[oc6aIu}R@ }5ˈ;s6+,dmhbxFI I%=J[Pw0t7տ!;=]S\ݶfvn=]1VWkn1ȱߝ{Em?zTَ/5MqnϤ\;~YƸ,vs~2;0gͩd;=w)޵S*W3:WXuƌ1G =u8Uw ]oUE9{fqNk`bdOvS۰:Y~.;'CwF31P[h-k mX8c>~cUPwt~VYk#eջ=YZc@DZ\ͮ-{:'t]\̜͸Ae?mٕ}h?FƢ )2Z{Rne,S]KkX5-{Co}濛zM$xχ؊?kk8asKП?ufP+v$û$PEI$j_I%)$IJI$RI$$I)I$JRI$I$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$8BIM!UAdobe PhotoshopAdobe Photoshop 7.08BIM"&MM*bj(1r2i}}Adobe Photoshop 7.0 2006:05:01 23:42:36(&HH-,8BIMnorm)(Fondo8BIMluniFondo8BIMlnsrbgnd8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrpV* t%=%=%=8BIMnorm((teclado8BIMluniteclado8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrp@Mĝj~;n,)xCP8BIMnorm((lcd8BIMlfx2lnullScl UntF#Prc@UUUUUmasterFXSwitchboolOrGlObjcOrGl enabboolMd enumBlnMScrnClr ObjcRGBCRd doub@IGrn doub@8Bl doub@oOpctUntF#Prc@RGlwTenumBETESfBLCkmtUntF#Pxl@OblurUntF#Pxl@NoseUntF#PrcShdNUntF#PrcAntAboolTrnSObjcShpCNm TEXTLinealCrv VlLsObjcCrPtHrzndoubVrtcdoubObjcCrPtHrzndoub@oVrtcdoub@oInprUntF#Prc@I8BIMlrFX8BIMcmnS8BIMdsdw3x8BIMmul 8BIMisdw3x8BIMmul 8BIMoglw*348BIMscrn348BIMiglw+8BIMscrn8BIMbevlNx8BIMscrn8BIMmul 8BIMsofi"8BIMnorm8BIMluni lcd8BIMlyid 8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrp@Mĝj~;n,qh"b)N)N)N8BIMnorm((teclado y torre8BIMluni$teclado y torre8BIMlyid 8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrp@Mĝj~;n,E8BIMnorm((C8BIMluniC8BIMlyid 8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrp@SH|^V>\-+"FlS8BIMnorm(( C derecha8BIMluni C derecha8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrp@u&8t:@$ڦn8BIMnorm(C(Operating System8BIMTyShB ?.;?.;@vFG@f]Z2TxLrTxt TEXTOperating SystemTxtCObjcnullHrzndoubVrtcdoub textGriddingenum textGriddingNoneOrntenumOrntHrznAntAenumAnntAnCr EngineDatatdta@ << /EngineDict << /Editor << /Text (Operating System ) >> /ParagraphRun << /DefaultRunData << /ParagraphSheet << /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 8 /PreHyphen 3 /PostHyphen 3 /ConsecutiveHyphens 2 /Zone 36.0 /HyphenateCapitalized true /WordSpacing [ 0.80000 1.0 1.33000 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.20000 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> /Adjustments << /Axis [ 1.0 0.0 1.0 ] /XY [ 0.0 0.0 ] >> >> /RunArray [ << /ParagraphSheet << /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 8 /PreHyphen 3 /PostHyphen 3 /ConsecutiveHyphens 2 /Zone 36.0 /HyphenateCapitalized true /WordSpacing [ 0.80000 1.0 1.33000 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.20000 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> /Adjustments << /Axis [ 1.0 0.0 1.0 ] /XY [ 0.0 0.0 ] >> >> ] /RunLengthArray [ 17 ] /IsJoinable 1 >> /StyleRun << /DefaultRunData << /StyleSheet << /StyleSheetData << /AutoKerning true /FontSize 42.33333 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /Tracking 0 /HorizontalScale 1.0 /VerticalScale 1.0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /YUnderline 0 /Strikethrough false /Ligatures true /DLigatures false /OldStyleFigures false /ProportionalNumbers true /BaselineDirection 1 /Tsume 0.0 /StyleRunAlignment 2 /Language 12 /WariChuLineCount 1 /WariChuScale 1.0 /WariChuWidowPercentage 25 /WariChuOrphanPercentage 25 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 0.37646 0.59607 0.99216 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst false /OutlineWidth 1.0 /Font 0 >> >> >> /RunArray [ << /StyleSheet << /StyleSheetData << /AutoKerning true /FontSize 42.33333 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /Tracking 0 /HorizontalScale 1.0 /VerticalScale 1.0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /YUnderline 0 /Strikethrough false /Ligatures true /DLigatures false /OldStyleFigures false /ProportionalNumbers true /BaselineDirection 1 /Tsume 0.0 /StyleRunAlignment 2 /Language 12 /WariChuLineCount 1 /WariChuScale 1.0 /WariChuWidowPercentage 25 /WariChuOrphanPercentage 25 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 0.37646 0.59607 0.99216 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst false /OutlineWidth 1.0 /Font 0 >> >> >> ] /RunLengthArray [ 17 ] /IsJoinable 2 >> /GridInfo << /GridIsOn false /ShowGrid false /GridSize 0.0 /GridLeading 0.0 /GridColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /GridLeadingFillColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /AlignLineHeightToGridFlags false >> /AntiAlias 1 /UseFractionalGlyphWidths true /Rendered << /Version 1 /Shapes << /WritingDirection 0 /Children [ << /ShapeType 0 /Procession 0 /Lines << /WritingDirection 0 /Children [ << /Procession 0 /LineTop -39.97689 /Leading 50.80000 /WordStarts [ 0 10 17 ] /CharacterCount 17 /Segments << /WritingDirection 0 /Children [ << /Range [ 0.0 30000.0 ] /Words << /WritingDirection 0 /Children [ << /Type 0 /Base << /CharacterCount 10 /Advance 226.07397 /TrailingAdvance 14.11800 /Leading 50.80000 /TrailingCharacterCount 0 /StyleRunAlignment 2 /Language 12 /WordCode 1 /IsBrokenWord 0 /BreakType 0 /Strikes << /WritingDirection 0 /Children [ << /Font 0 /Direction 0 /GlyphDirection 0 /Scale [ 42.33333 42.33333 ] /FontSize 42.33333 /Tracking 0.0 /AntiAlias 1 /Kerning 0.0 /Origin [ 0.0 0.0 ] /GlyphMaps [ 50 83 72 85 68 87 76 81 74 3 ] /LigatureMaps [ ] /Flags 4 /FillColor << /Type 1 /Values [ 1.0 0.37646 0.59607 0.99216 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /OriginEnd [ 226.07397 0.0 ] /OutlineWidth 1.0 >> ] >> >> >> << /Type 0 /Base << /CharacterCount 7 /Advance 155.89738 /TrailingAdvance 14.11800 /Leading 50.80000 /TrailingCharacterCount 0 /StyleRunAlignment 2 /Language 12 /WordCode 1 /IsBrokenWord 0 /BreakType 0 /Strikes << /WritingDirection 0 /Children [ << /Font 0 /Direction 0 /GlyphDirection 0 /Scale [ 42.33333 42.33333 ] /FontSize 42.33333 /Tracking 0.0 /AntiAlias 1 /Kerning 0.0 /Origin [ 226.07397 0.0 ] /GlyphMaps [ 54 92 86 87 72 80 3 ] /LigatureMaps [ ] /Flags 68 /FillColor << /Type 1 /Values [ 1.0 0.37646 0.59607 0.99216 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /OriginEnd [ 381.97137 0.0 ] /OutlineWidth 1.0 >> ] >> >> >> ] >> >> ] >> >> ] >> /Cookie << /Photoshop << /ShapeType 0 /PointBase [ 0.0 0.0 ] /Base << /ShapeType 0 /TransformPoint0 [ 1.0 0.0 ] /TransformPoint1 [ 0.0 1.0 ] /TransformPoint2 [ 0.0 0.0 ] >> >> >> >> ] >> >> >> /ResourceDict << /KinsokuSet [ << /Name (PhotoshopKinsokuHard) /NoStart (!\),.:;?]}    0!! 0000 0 0 0000A0C0E0G0I0c000000000000000000000000 =]) /NoEnd (\([{  00 0 0000 ;[) /Keep (  %) /Hanging (,.00) >> << /Name (PhotoshopKinsokuSoft) /NoStart (  0000 0 0 00000000 =]) /NoEnd (  00 0 000;[) /Keep (  %) /Hanging (,.00) >> ] /MojiKumiSet [ << /InternalName (Photoshop6MojiKumiSet1) >> << /InternalName (Photoshop6MojiKumiSet2) >> << /InternalName (Photoshop6MojiKumiSet3) >> << /InternalName (Photoshop6MojiKumiSet4) >> ] /TheNormalStyleSheet 0 /TheNormalParagraphSheet 0 /ParagraphSheetSet [ << /Name (Default) /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 8 /PreHyphen 3 /PostHyphen 3 /ConsecutiveHyphens 2 /Zone 36.0 /HyphenateCapitalized true /WordSpacing [ 0.80000 1.0 1.33000 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.20000 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> ] /StyleSheetSet [ << /Name (Normal) /StyleSheetData << /FontSize 18.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 27.0 /Tracking 0 /HorizontalScale 1.0 /VerticalScale 1.0 /AutoKerning true /Kerning 0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /YUnderline 1 /Strikethrough false /Ligatures true /DLigatures true /OldStyleFigures false /ProportionalNumbers true /BaselineDirection 1 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /WariChuLineCount 1 /WariChuScale 1.0 /WariChuWidowPercentage 25 /WariChuOrphanPercentage 25 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst true /OutlineWidth 1.0 /Font 1 >> >> << /StyleSheetData << >> >> ] /FontSet [ << /Name (LevenimMT) /Script 6 /FontType 1 /Synthetic 0 /FontMetrics << /FontSize 1.0 /SpaceGlyphWidth 0.33350 /Ascent 0.94434 /Descent 0.37549 /CapHeight 0.73599 /DistanceToBaseline 0.94434 /UnderlinePosition 0.10596 /UnderlineThickness 0.07324 /HCJKProporitional false /VProporitional false >> >> << /Name (TimesNewRomanPSMT) /Script 0 /FontType 1 /Synthetic 0 /FontMetrics << /FontSize 1.0 /SpaceGlyphWidth 0.25000 /Ascent 1.00684 /Descent 0.30664 /CapHeight 0.67799 /DistanceToBaseline 0.69336 /UnderlinePosition 0.10889 /UnderlineThickness 0.04883 /HCJKProporitional false /VProporitional false >> >> ] /SuperscriptSize 0.58300 /SuperscriptPosition 0.33300 /SubscriptSize 0.58300 /SubscriptPosition 0.33300 /SmallCapSize 0.70000 >> >> (TimesNewRomanPSMT) /Script 0 /FontType 1 /Synthetic 0 /FontMetrics << /FontSize 1.0 /SpaceGlyphWidth 0.25000 /Ascent 1.00684 /Descent 0.30664 /CapHeight 0.67799 /DistanceToBaseline 0.69336 /UnderlinePosition 0.10889 /UnderlineThickness 0.04883 /HCJKProporitional false /VProporitional false >> >> ] /SuperscriptSize 0.58300 /SuperscriptPosition 0.33300 /SubscriptSize 0.58300 /SubscriptPosition 0.33300 /SmallCapSize 0.70000 >> >> 0P!warp warpStyleenum warpStylewarpNone warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub warpRotateenumOrntHrzn8BIMluni$Operating System8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrpC+WLFA3BQ8BIMnorm((T8BIMluniT8BIMlyid+8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrp@Rd4%>^cBm8BIMnorm(( T derecha8BIMluni T derecha8BIMlyid.8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrp@u.@H`Hkj8BIMnorm(B(O8BIMTyShA?.;?.;@{š@ZzTO2TxLrTxt TEXTOTxtCObjcnullHrzndoubVrtcdoub textGriddingenum textGriddingNoneOrntenumOrntHrznAntAenumAnntAnCr EngineDatatdta@ << /EngineDict << /Editor << /Text (O ) >> /ParagraphRun << /DefaultRunData << /ParagraphSheet << /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 8 /PreHyphen 3 /PostHyphen 3 /ConsecutiveHyphens 2 /Zone 36.0 /HyphenateCapitalized true /WordSpacing [ 0.80000 1.0 1.33000 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.20000 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> /Adjustments << /Axis [ 1.0 0.0 1.0 ] /XY [ 0.0 0.0 ] >> >> /RunArray [ << /ParagraphSheet << /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 8 /PreHyphen 3 /PostHyphen 3 /ConsecutiveHyphens 2 /Zone 36.0 /HyphenateCapitalized true /WordSpacing [ 0.80000 1.0 1.33000 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.20000 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> /Adjustments << /Axis [ 1.0 0.0 1.0 ] /XY [ 0.0 0.0 ] >> >> ] /RunLengthArray [ 2 ] /IsJoinable 1 >> /StyleRun << /DefaultRunData << /StyleSheet << /StyleSheetData << /AutoKerning true /FontSize 95.25000 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /Tracking 0 /HorizontalScale 1.0 /VerticalScale 1.0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /YUnderline 0 /Strikethrough false /Ligatures true /DLigatures false /OldStyleFigures false /ProportionalNumbers true /BaselineDirection 1 /Tsume 0.0 /StyleRunAlignment 2 /Language 12 /WariChuLineCount 1 /WariChuScale 1.0 /WariChuWidowPercentage 25 /WariChuOrphanPercentage 25 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 0.37646 0.59607 0.99216 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst false /OutlineWidth 1.0 /Font 0 >> >> >> /RunArray [ << /StyleSheet << /StyleSheetData << /AutoKerning true /FontSize 95.25000 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /Tracking 0 /HorizontalScale 1.0 /VerticalScale 1.0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /YUnderline 0 /Strikethrough false /Ligatures true /DLigatures false /OldStyleFigures false /ProportionalNumbers true /BaselineDirection 1 /Tsume 0.0 /StyleRunAlignment 2 /Language 12 /WariChuLineCount 1 /WariChuScale 1.0 /WariChuWidowPercentage 25 /WariChuOrphanPercentage 25 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 0.37646 0.59607 0.99216 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst false /OutlineWidth 1.0 /Font 0 >> >> >> ] /RunLengthArray [ 2 ] /IsJoinable 2 >> /GridInfo << /GridIsOn false /ShowGrid false /GridSize 0.0 /GridLeading 0.0 /GridColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /GridLeadingFillColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /AlignLineHeightToGridFlags false >> /AntiAlias 1 /UseFractionalGlyphWidths true /Rendered << /Version 1 /Shapes << /WritingDirection 0 /Children [ << /ShapeType 0 /Procession 0 /Lines << /WritingDirection 0 /Children [ << /Procession 0 /LineTop -69.34460 /Leading 114.30000 /WordStarts [ 0 2 ] /CharacterCount 2 /Segments << /WritingDirection 0 /Children [ << /Range [ 0.0 30000.0 ] /Words << /WritingDirection 0 /Children [ << /Type 0 /Base << /CharacterCount 2 /Advance 100.55200 /TrailingAdvance 26.46350 /Leading 114.30000 /TrailingCharacterCount 0 /StyleRunAlignment 2 /Language 12 /WordCode 1 /IsBrokenWord 0 /BreakType 0 /Strikes << /WritingDirection 0 /Children [ << /Font 0 /Direction 0 /GlyphDirection 0 /Scale [ 95.25000 95.25000 ] /FontSize 95.25000 /Tracking 0.0 /AntiAlias 1 /Kerning 0.0 /Origin [ 0.0 0.0 ] /GlyphMaps [ 50 3 ] /LigatureMaps [ ] /Flags 68 /FillColor << /Type 1 /Values [ 1.0 0.37646 0.59607 0.99216 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /OriginEnd [ 100.55200 0.0 ] /OutlineWidth 1.0 >> ] >> >> >> ] >> >> ] >> >> ] >> /Cookie << /Photoshop << /ShapeType 0 /PointBase [ 0.0 0.0 ] /Base << /ShapeType 0 /TransformPoint0 [ 1.0 0.0 ] /TransformPoint1 [ 0.0 1.0 ] /TransformPoint2 [ 0.0 0.0 ] >> >> >> >> ] >> >> >> /ResourceDict << /KinsokuSet [ << /Name (PhotoshopKinsokuHard) /NoStart (!\),.:;?]}    0!! 0000 0 0 0000A0C0E0G0I0c000000000000000000000000 =]) /NoEnd (\([{  00 0 0000 ;[) /Keep (  %) /Hanging (,.00) >> << /Name (PhotoshopKinsokuSoft) /NoStart (  0000 0 0 00000000 =]) /NoEnd (  00 0 000;[) /Keep (  %) /Hanging (,.00) >> ] /MojiKumiSet [ << /InternalName (Photoshop6MojiKumiSet1) >> << /InternalName (Photoshop6MojiKumiSet2) >> << /InternalName (Photoshop6MojiKumiSet3) >> << /InternalName (Photoshop6MojiKumiSet4) >> ] /TheNormalStyleSheet 0 /TheNormalParagraphSheet 0 /ParagraphSheetSet [ << /Name (Default) /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 8 /PreHyphen 3 /PostHyphen 3 /ConsecutiveHyphens 2 /Zone 36.0 /HyphenateCapitalized true /WordSpacing [ 0.80000 1.0 1.33000 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.20000 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> ] /StyleSheetSet [ << /Name (Normal) /StyleSheetData << /FontSize 18.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 27.0 /Tracking 0 /HorizontalScale 1.0 /VerticalScale 1.0 /AutoKerning true /Kerning 0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /YUnderline 1 /Strikethrough false /Ligatures true /DLigatures true /OldStyleFigures false /ProportionalNumbers true /BaselineDirection 1 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /WariChuLineCount 1 /WariChuScale 1.0 /WariChuWidowPercentage 25 /WariChuOrphanPercentage 25 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst true /OutlineWidth 1.0 /Font 1 >> >> << /StyleSheetData << >> >> ] /FontSet [ << /Name (ArialMT) /Script 0 /FontType 1 /Synthetic 0 /FontMetrics << /FontSize 1.0 /SpaceGlyphWidth 0.27783 /Ascent 1.00586 /Descent 0.32471 /CapHeight 0.72800 /DistanceToBaseline 0.72803 /UnderlinePosition 0.10596 /UnderlineThickness 0.07324 /HCJKProporitional false /VProporitional false >> >> << /Name (TimesNewRomanPSMT) /Script 0 /FontType 1 /Synthetic 0 /FontMetrics << /FontSize 1.0 /SpaceGlyphWidth 0.25000 /Ascent 1.00684 /Descent 0.30664 /CapHeight 0.67799 /DistanceToBaseline 0.69336 /UnderlinePosition 0.10889 /UnderlineThickness 0.04883 /HCJKProporitional false /VProporitional false >> >> ] /SuperscriptSize 0.58300 /SuperscriptPosition 0.33300 /SubscriptSize 0.58300 /SubscriptPosition 0.33300 /SmallCapSize 0.70000 >> >> ype 1 /Synthetic 0 /FontMetrics << /FontSize 1.0 /SpaceGlyphWidth 0.33350 /Ascent 0.94434 /Descent 0.37549 /CapHeight 0.73599 /DistanceToBaseline 0.94434 /UnderlinePosition 0.10596 /UnderlineThickness 0.07324 /HCJKProporitional false /VProporitional false >> >> << /Name (TimesNewRomanPSMT) /Script 0 /FontType 1 /Synthetic 0 /FontMetrics << /FontSize 1.0 /SpaceGlyphWidth 0.25000 /Ascent 1.00684 /Descent 0.30664 /CapHeight 0.67799 /DistanceToBaseline 0.69336 /UnderlinePosition 0.10889 /UnderlineThickness 0.04883 /HCJKProporitional false /VProporitional false >> >> ] /SuperscriptSize 0.58300 /SuperscriptPosition 0.33300 /SubscriptSize 0.58300 /SubscriptPosition 0.33300 /SmallCapSize 0.70000 >> >> (TimesNewRomanPSMT) /Script 0 /FontType 1 /Synthetic 0 /FontMetrics << /FontSize 1.0 /SpaceGlyphWidth 0.25000 /Ascent 1.00684 /Descent 0.30664 /CapHeight 0.67799 /DistanceToBaseline 0.69336 /UnderlinePosition 0.10889 /UnderlineThickness 0.04883 /HCJKProporitional false /VProporitional false >> >> ] /SuperscriptSize 0.58300 /SuperscriptPosition 0.33300 /SubscriptSize 0.58300 /SubscriptPosition 0.33300 /SmallCapSize 0.70000 >> >> 0P!warp warpStyleenum warpStylewarpNone warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub warpRotateenumOrntHrzn8BIMluniO8BIMlnsrrend8BIMlyid#8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrp@C~V=_`Hk88BIMnorm(B(S8BIMTyShA?.;?.;@~g@ZzTO2TxLrTxt TEXTSTxtCObjcnullHrzndoubVrtcdoub textGriddingenum textGriddingNoneOrntenumOrntHrznAntAenumAnntAnCr EngineDatatdta@ << /EngineDict << /Editor << /Text (S ) >> /ParagraphRun << /DefaultRunData << /ParagraphSheet << /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 8 /PreHyphen 3 /PostHyphen 3 /ConsecutiveHyphens 2 /Zone 36.0 /HyphenateCapitalized true /WordSpacing [ 0.80000 1.0 1.33000 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.20000 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> /Adjustments << /Axis [ 1.0 0.0 1.0 ] /XY [ 0.0 0.0 ] >> >> /RunArray [ << /ParagraphSheet << /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 8 /PreHyphen 3 /PostHyphen 3 /ConsecutiveHyphens 2 /Zone 36.0 /HyphenateCapitalized true /WordSpacing [ 0.80000 1.0 1.33000 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.20000 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> /Adjustments << /Axis [ 1.0 0.0 1.0 ] /XY [ 0.0 0.0 ] >> >> ] /RunLengthArray [ 2 ] /IsJoinable 1 >> /StyleRun << /DefaultRunData << /StyleSheet << /StyleSheetData << /AutoKerning true /FontSize 95.25000 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /Tracking 0 /HorizontalScale 1.0 /VerticalScale 1.0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /YUnderline 0 /Strikethrough false /Ligatures true /DLigatures false /OldStyleFigures false /ProportionalNumbers true /BaselineDirection 1 /Tsume 0.0 /StyleRunAlignment 2 /Language 12 /WariChuLineCount 1 /WariChuScale 1.0 /WariChuWidowPercentage 25 /WariChuOrphanPercentage 25 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 0.37646 0.59607 0.99216 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst false /OutlineWidth 1.0 /Font 0 >> >> >> /RunArray [ << /StyleSheet << /StyleSheetData << /AutoKerning true /FontSize 95.25000 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /Tracking 0 /HorizontalScale 1.0 /VerticalScale 1.0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /YUnderline 0 /Strikethrough false /Ligatures true /DLigatures false /OldStyleFigures false /ProportionalNumbers true /BaselineDirection 1 /Tsume 0.0 /StyleRunAlignment 2 /Language 12 /WariChuLineCount 1 /WariChuScale 1.0 /WariChuWidowPercentage 25 /WariChuOrphanPercentage 25 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 0.37646 0.59607 0.99216 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst false /OutlineWidth 1.0 /Font 0 >> >> >> ] /RunLengthArray [ 2 ] /IsJoinable 2 >> /GridInfo << /GridIsOn false /ShowGrid false /GridSize 0.0 /GridLeading 0.0 /GridColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /GridLeadingFillColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /AlignLineHeightToGridFlags false >> /AntiAlias 1 /UseFractionalGlyphWidths true /Rendered << /Version 1 /Shapes << /WritingDirection 0 /Children [ << /ShapeType 0 /Procession 0 /Lines << /WritingDirection 0 /Children [ << /Procession 0 /LineTop -69.34460 /Leading 114.30000 /WordStarts [ 0 2 ] /CharacterCount 2 /Segments << /WritingDirection 0 /Children [ << /Range [ 0.0 30000.0 ] /Words << /WritingDirection 0 /Children [ << /Type 0 /Base << /CharacterCount 2 /Advance 89.99451 /TrailingAdvance 26.46350 /Leading 114.30000 /TrailingCharacterCount 0 /StyleRunAlignment 2 /Language 12 /WordCode 1 /IsBrokenWord 0 /BreakType 0 /Strikes << /WritingDirection 0 /Children [ << /Font 0 /Direction 0 /GlyphDirection 0 /Scale [ 95.25000 95.25000 ] /FontSize 95.25000 /Tracking 0.0 /AntiAlias 1 /Kerning 0.0 /Origin [ 0.0 0.0 ] /GlyphMaps [ 54 3 ] /LigatureMaps [ ] /Flags 68 /FillColor << /Type 1 /Values [ 1.0 0.37646 0.59607 0.99216 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /OriginEnd [ 89.99451 0.0 ] /OutlineWidth 1.0 >> ] >> >> >> ] >> >> ] >> >> ] >> /Cookie << /Photoshop << /ShapeType 0 /PointBase [ 0.0 0.0 ] /Base << /ShapeType 0 /TransformPoint0 [ 1.0 0.0 ] /TransformPoint1 [ 0.0 1.0 ] /TransformPoint2 [ 0.0 0.0 ] >> >> >> >> ] >> >> >> /ResourceDict << /KinsokuSet [ << /Name (PhotoshopKinsokuHard) /NoStart (!\),.:;?]}    0!! 0000 0 0 0000A0C0E0G0I0c000000000000000000000000 =]) /NoEnd (\([{  00 0 0000 ;[) /Keep (  %) /Hanging (,.00) >> << /Name (PhotoshopKinsokuSoft) /NoStart (  0000 0 0 00000000 =]) /NoEnd (  00 0 000;[) /Keep (  %) /Hanging (,.00) >> ] /MojiKumiSet [ << /InternalName (Photoshop6MojiKumiSet1) >> << /InternalName (Photoshop6MojiKumiSet2) >> << /InternalName (Photoshop6MojiKumiSet3) >> << /InternalName (Photoshop6MojiKumiSet4) >> ] /TheNormalStyleSheet 0 /TheNormalParagraphSheet 0 /ParagraphSheetSet [ << /Name (Default) /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 8 /PreHyphen 3 /PostHyphen 3 /ConsecutiveHyphens 2 /Zone 36.0 /HyphenateCapitalized true /WordSpacing [ 0.80000 1.0 1.33000 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.20000 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> ] /StyleSheetSet [ << /Name (Normal) /StyleSheetData << /FontSize 18.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 27.0 /Tracking 0 /HorizontalScale 1.0 /VerticalScale 1.0 /AutoKerning true /Kerning 0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /YUnderline 1 /Strikethrough false /Ligatures true /DLigatures true /OldStyleFigures false /ProportionalNumbers true /BaselineDirection 1 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /WariChuLineCount 1 /WariChuScale 1.0 /WariChuWidowPercentage 25 /WariChuOrphanPercentage 25 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst true /OutlineWidth 1.0 /Font 1 >> >> << /StyleSheetData << >> >> ] /FontSet [ << /Name (ArialMT) /Script 0 /FontType 1 /Synthetic 0 /FontMetrics << /FontSize 1.0 /SpaceGlyphWidth 0.27783 /Ascent 1.00586 /Descent 0.32471 /CapHeight 0.72800 /DistanceToBaseline 0.72803 /UnderlinePosition 0.10596 /UnderlineThickness 0.07324 /HCJKProporitional false /VProporitional false >> >> << /Name (TimesNewRomanPSMT) /Script 0 /FontType 1 /Synthetic 0 /FontMetrics << /FontSize 1.0 /SpaceGlyphWidth 0.25000 /Ascent 1.00684 /Descent 0.30664 /CapHeight 0.67799 /DistanceToBaseline 0.69336 /UnderlinePosition 0.10889 /UnderlineThickness 0.04883 /HCJKProporitional false /VProporitional false >> >> ] /SuperscriptSize 0.58300 /SuperscriptPosition 0.33300 /SubscriptSize 0.58300 /SubscriptPosition 0.33300 /SmallCapSize 0.70000 >> >> ype 1 /Synthetic 0 /FontMetrics << /FontSize 1.0 /SpaceGlyphWidth 0.33350 /Ascent 0.94434 /Descent 0.37549 /CapHeight 0.73599 /DistanceToBaseline 0.94434 /UnderlinePosition 0.10596 /UnderlineThickness 0.07324 /HCJKProporitional false /VProporitional false >> >> << /Name (TimesNewRomanPSMT) /Script 0 /FontType 1 /Synthetic 0 /FontMetrics << /FontSize 1.0 /SpaceGlyphWidth 0.25000 /Ascent 1.00684 /Descent 0.30664 /CapHeight 0.67799 /DistanceToBaseline 0.69336 /UnderlinePosition 0.10889 /UnderlineThickness 0.04883 /HCJKProporitional false /VProporitional false >> >> ] /SuperscriptSize 0.58300 /SuperscriptPosition 0.33300 /SubscriptSize 0.58300 /SubscriptPosition 0.33300 /SmallCapSize 0.70000 >> >> (TimesNewRomanPSMT) /Script 0 /FontType 1 /Synthetic 0 /FontMetrics << /FontSize 1.0 /SpaceGlyphWidth 0.25000 /Ascent 1.00684 /Descent 0.30664 /CapHeight 0.67799 /DistanceToBaseline 0.69336 /UnderlinePosition 0.10889 /UnderlineThickness 0.04883 /HCJKProporitional false /VProporitional false >> >> ] /SuperscriptSize 0.58300 /SuperscriptPosition 0.33300 /SubscriptSize 0.58300 /SubscriptPosition 0.33300 /SmallCapSize 0.70000 >> >> 0P!warp warpStyleenum warpStylewarpNone warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub warpRotateenumOrntHrzn8BIMluniS8BIMlnsrrend8BIMlyid$8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrp@D Je5 0@].:8BIMnorm(B(lient8BIMTyShA?.;?.;@}:@d|2TxLrTxt TEXTlientTxtCObjcnullHrzndoubVrtcdoub textGriddingenum textGriddingNoneOrntenumOrntHrznAntAenumAnntAnCr EngineDatatdta@ << /EngineDict << /Editor << /Text (lient ) >> /ParagraphRun << /DefaultRunData << /ParagraphSheet << /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 8 /PreHyphen 3 /PostHyphen 3 /ConsecutiveHyphens 2 /Zone 36.0 /HyphenateCapitalized true /WordSpacing [ 0.80000 1.0 1.33000 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.20000 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> /Adjustments << /Axis [ 1.0 0.0 1.0 ] /XY [ 0.0 0.0 ] >> >> /RunArray [ << /ParagraphSheet << /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 8 /PreHyphen 3 /PostHyphen 3 /ConsecutiveHyphens 2 /Zone 36.0 /HyphenateCapitalized true /WordSpacing [ 0.80000 1.0 1.33000 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.20000 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> /Adjustments << /Axis [ 1.0 0.0 1.0 ] /XY [ 0.0 0.0 ] >> >> ] /RunLengthArray [ 6 ] /IsJoinable 1 >> /StyleRun << /DefaultRunData << /StyleSheet << /StyleSheetData << /AutoKerning true /FontSize 63.50000 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /Tracking 0 /HorizontalScale 1.0 /VerticalScale 1.0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /YUnderline 0 /Strikethrough false /Ligatures true /DLigatures false /OldStyleFigures false /ProportionalNumbers true /BaselineDirection 1 /Tsume 0.0 /StyleRunAlignment 2 /Language 12 /WariChuLineCount 1 /WariChuScale 1.0 /WariChuWidowPercentage 25 /WariChuOrphanPercentage 25 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 0.83920 0.12549 0.12549 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst false /OutlineWidth 1.0 /Font 0 >> >> >> /RunArray [ << /StyleSheet << /StyleSheetData << /AutoKerning true /FontSize 63.50000 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /Tracking 0 /HorizontalScale 1.0 /VerticalScale 1.0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /YUnderline 0 /Strikethrough false /Ligatures true /DLigatures false /OldStyleFigures false /ProportionalNumbers true /BaselineDirection 1 /Tsume 0.0 /StyleRunAlignment 2 /Language 12 /WariChuLineCount 1 /WariChuScale 1.0 /WariChuWidowPercentage 25 /WariChuOrphanPercentage 25 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 0.83920 0.12549 0.12549 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst false /OutlineWidth 1.0 /Font 0 >> >> >> ] /RunLengthArray [ 6 ] /IsJoinable 2 >> /GridInfo << /GridIsOn false /ShowGrid false /GridSize 0.0 /GridLeading 0.0 /GridColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /GridLeadingFillColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /AlignLineHeightToGridFlags false >> /AntiAlias 1 /UseFractionalGlyphWidths true /Rendered << /Version 1 /Shapes << /WritingDirection 0 /Children [ << /ShapeType 0 /Procession 0 /Lines << /WritingDirection 0 /Children [ << /Procession 0 /LineTop -59.96533 /Leading 76.20000 /WordStarts [ 0 6 ] /CharacterCount 6 /Segments << /WritingDirection 0 /Children [ << /Range [ 0.0 30000.0 ] /Words << /WritingDirection 0 /Children [ << /Type 0 /Base << /CharacterCount 6 /Advance 148.11499 /TrailingAdvance 21.17700 /Leading 76.20000 /TrailingCharacterCount 0 /StyleRunAlignment 2 /Language 12 /WordCode 1 /IsBrokenWord 0 /BreakType 0 /Strikes << /WritingDirection 0 /Children [ << /Font 0 /Direction 0 /GlyphDirection 0 /Scale [ 63.50000 63.50000 ] /FontSize 63.50000 /Tracking 0.0 /AntiAlias 1 /Kerning 0.0 /Origin [ 0.0 0.0 ] /GlyphMaps [ 79 76 72 81 87 3 ] /LigatureMaps [ ] /Flags 68 /FillColor << /Type 1 /Values [ 1.0 0.83920 0.12549 0.12549 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /OriginEnd [ 148.11499 0.0 ] /OutlineWidth 1.0 >> ] >> >> >> ] >> >> ] >> >> ] >> /Cookie << /Photoshop << /ShapeType 0 /PointBase [ 0.0 0.0 ] /Base << /ShapeType 0 /TransformPoint0 [ 1.0 0.0 ] /TransformPoint1 [ 0.0 1.0 ] /TransformPoint2 [ 0.0 0.0 ] >> >> >> >> ] >> >> >> /ResourceDict << /KinsokuSet [ << /Name (PhotoshopKinsokuHard) /NoStart (!\),.:;?]}    0!! 0000 0 0 0000A0C0E0G0I0c000000000000000000000000 =]) /NoEnd (\([{  00 0 0000 ;[) /Keep (  %) /Hanging (,.00) >> << /Name (PhotoshopKinsokuSoft) /NoStart (  0000 0 0 00000000 =]) /NoEnd (  00 0 000;[) /Keep (  %) /Hanging (,.00) >> ] /MojiKumiSet [ << /InternalName (Photoshop6MojiKumiSet1) >> << /InternalName (Photoshop6MojiKumiSet2) >> << /InternalName (Photoshop6MojiKumiSet3) >> << /InternalName (Photoshop6MojiKumiSet4) >> ] /TheNormalStyleSheet 0 /TheNormalParagraphSheet 0 /ParagraphSheetSet [ << /Name (Default) /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 8 /PreHyphen 3 /PostHyphen 3 /ConsecutiveHyphens 2 /Zone 36.0 /HyphenateCapitalized true /WordSpacing [ 0.80000 1.0 1.33000 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.20000 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> ] /StyleSheetSet [ << /Name (Normal) /StyleSheetData << /FontSize 18.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 27.0 /Tracking 0 /HorizontalScale 1.0 /VerticalScale 1.0 /AutoKerning true /Kerning 0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /YUnderline 1 /Strikethrough false /Ligatures true /DLigatures true /OldStyleFigures false /ProportionalNumbers true /BaselineDirection 1 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /WariChuLineCount 1 /WariChuScale 1.0 /WariChuWidowPercentage 25 /WariChuOrphanPercentage 25 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst true /OutlineWidth 1.0 /Font 1 >> >> << /StyleSheetData << >> >> ] /FontSet [ << /Name (LevenimMT) /Script 6 /FontType 1 /Synthetic 0 /FontMetrics << /FontSize 1.0 /SpaceGlyphWidth 0.33350 /Ascent 0.94434 /Descent 0.37549 /CapHeight 0.73599 /DistanceToBaseline 0.94434 /UnderlinePosition 0.10596 /UnderlineThickness 0.07324 /HCJKProporitional false /VProporitional false >> >> << /Name (TimesNewRomanPSMT) /Script 0 /FontType 1 /Synthetic 0 /FontMetrics << /FontSize 1.0 /SpaceGlyphWidth 0.25000 /Ascent 1.00684 /Descent 0.30664 /CapHeight 0.67799 /DistanceToBaseline 0.69336 /UnderlinePosition 0.10889 /UnderlineThickness 0.04883 /HCJKProporitional false /VProporitional false >> >> ] /SuperscriptSize 0.58300 /SuperscriptPosition 0.33300 /SubscriptSize 0.58300 /SubscriptPosition 0.33300 /SmallCapSize 0.70000 >> >> ntMetrics << /FontSize 1.0 /SpaceGlyphWidth 0.33350 /Ascent 0.94434 /Descent 0.37549 /CapHeight 0.73599 /DistanceToBaseline 0.94434 /UnderlinePosition 0.10596 /UnderlineThickness 0.07324 /HCJKProporitional false /VProporitional false >> >> << /Name (TimesNewRomanPSMT) /Script 0 /FontType 1 /Synthetic 0 /FontMetrics << /FontSize 1.0 /SpaceGlyphWidth 0.25000 /Ascent 1.00684 /Descent 0.30664 /CapHeight 0.67799 /DistanceToBaseline 0.69336 /UnderlinePosition 0.10889 /UnderlineThickness 0.04883 /HCJKProporitional false /VProporitional false >> >> ] /SuperscriptSize 0.58300 /SuperscriptPosition 0.33300 /SubscriptSize 0.58300 /SubscriptPosition 0.33300 /SmallCapSize 0.70000 >> >> (TimesNewRomanPSMT) /Script 0 /FontType 1 /Synthetic 0 /FontMetrics << /FontSize 1.0 /SpaceGlyphWidth 0.25000 /Ascent 1.00684 /Descent 0.30664 /CapHeight 0.67799 /DistanceToBaseline 0.69336 /UnderlinePosition 0.10889 /UnderlineThickness 0.04883 /HCJKProporitional false /VProporitional false >> >> ] /SuperscriptSize 0.58300 /SuperscriptPosition 0.33300 /SubscriptSize 0.58300 /SubscriptPosition 0.33300 /SmallCapSize 0.70000 >> >> 0P!warp warpStyleenum warpStylewarpNone warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub warpRotateenumOrntHrzn8BIMlunilient8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrp@[q~@)c[~J8BIMnorm((C derecha copia8BIMluni$C derecha copia8BIMlyid&8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrp@wJ*@P~&ӳw^^^8BIMnorm(B(hin8BIMTyShA?.;?.;@x_>1@d|2TxLrTxt TEXThinTxtCObjcnullHrzndoubVrtcdoub textGriddingenum textGriddingNoneOrntenumOrntHrznAntAenumAnntAnCr EngineDatatdta@ << /EngineDict << /Editor << /Text (hin ) >> /ParagraphRun << /DefaultRunData << /ParagraphSheet << /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 8 /PreHyphen 3 /PostHyphen 3 /ConsecutiveHyphens 2 /Zone 36.0 /HyphenateCapitalized true /WordSpacing [ 0.80000 1.0 1.33000 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.20000 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> /Adjustments << /Axis [ 1.0 0.0 1.0 ] /XY [ 0.0 0.0 ] >> >> /RunArray [ << /ParagraphSheet << /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 8 /PreHyphen 3 /PostHyphen 3 /ConsecutiveHyphens 2 /Zone 36.0 /HyphenateCapitalized true /WordSpacing [ 0.80000 1.0 1.33000 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.20000 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> /Adjustments << /Axis [ 1.0 0.0 1.0 ] /XY [ 0.0 0.0 ] >> >> ] /RunLengthArray [ 4 ] /IsJoinable 1 >> /StyleRun << /DefaultRunData << /StyleSheet << /StyleSheetData << /AutoKerning true /FontSize 63.50000 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /Tracking 0 /HorizontalScale 1.0 /VerticalScale 1.0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /YUnderline 0 /Strikethrough false /Ligatures true /DLigatures false /OldStyleFigures false /ProportionalNumbers true /BaselineDirection 1 /Tsume 0.0 /StyleRunAlignment 2 /Language 12 /WariChuLineCount 1 /WariChuScale 1.0 /WariChuWidowPercentage 25 /WariChuOrphanPercentage 25 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 1.0 1.0 1.0 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst false /OutlineWidth 1.0 /Font 0 >> >> >> /RunArray [ << /StyleSheet << /StyleSheetData << /AutoKerning true /FontSize 63.50000 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /Tracking 0 /HorizontalScale 1.0 /VerticalScale 1.0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /YUnderline 0 /Strikethrough false /Ligatures true /DLigatures false /OldStyleFigures false /ProportionalNumbers true /BaselineDirection 1 /Tsume 0.0 /StyleRunAlignment 2 /Language 12 /WariChuLineCount 1 /WariChuScale 1.0 /WariChuWidowPercentage 25 /WariChuOrphanPercentage 25 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 1.0 1.0 1.0 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst false /OutlineWidth 1.0 /Font 0 >> >> >> ] /RunLengthArray [ 4 ] /IsJoinable 2 >> /GridInfo << /GridIsOn false /ShowGrid false /GridSize 0.0 /GridLeading 0.0 /GridColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /GridLeadingFillColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /AlignLineHeightToGridFlags false >> /AntiAlias 1 /UseFractionalGlyphWidths true /Rendered << /Version 1 /Shapes << /WritingDirection 0 /Children [ << /ShapeType 0 /Procession 0 /Lines << /WritingDirection 0 /Children [ << /Procession 0 /LineTop -59.96533 /Leading 76.20000 /WordStarts [ 0 4 ] /CharacterCount 4 /Segments << /WritingDirection 0 /Children [ << /Range [ 0.0 30000.0 ] /Words << /WritingDirection 0 /Children [ << /Type 0 /Base << /CharacterCount 4 /Advance 111.34204 /TrailingAdvance 21.17700 /Leading 76.20000 /TrailingCharacterCount 0 /StyleRunAlignment 2 /Language 12 /WordCode 1 /IsBrokenWord 0 /BreakType 0 /Strikes << /WritingDirection 0 /Children [ << /Font 0 /Direction 0 /GlyphDirection 0 /Scale [ 63.50000 63.50000 ] /FontSize 63.50000 /Tracking 0.0 /AntiAlias 1 /Kerning 0.0 /Origin [ 0.0 0.0 ] /GlyphMaps [ 75 76 81 3 ] /LigatureMaps [ ] /Flags 68 /FillColor << /Type 1 /Values [ 1.0 1.0 1.0 1.0 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /OriginEnd [ 111.34204 0.0 ] /OutlineWidth 1.0 >> ] >> >> >> ] >> >> ] >> >> ] >> /Cookie << /Photoshop << /ShapeType 0 /PointBase [ 0.0 0.0 ] /Base << /ShapeType 0 /TransformPoint0 [ 1.0 0.0 ] /TransformPoint1 [ 0.0 1.0 ] /TransformPoint2 [ 0.0 0.0 ] >> >> >> >> ] >> >> >> /ResourceDict << /KinsokuSet [ << /Name (PhotoshopKinsokuHard) /NoStart (!\),.:;?]}    0!! 0000 0 0 0000A0C0E0G0I0c000000000000000000000000 =]) /NoEnd (\([{  00 0 0000 ;[) /Keep (  %) /Hanging (,.00) >> << /Name (PhotoshopKinsokuSoft) /NoStart (  0000 0 0 00000000 =]) /NoEnd (  00 0 000;[) /Keep (  %) /Hanging (,.00) >> ] /MojiKumiSet [ << /InternalName (Photoshop6MojiKumiSet1) >> << /InternalName (Photoshop6MojiKumiSet2) >> << /InternalName (Photoshop6MojiKumiSet3) >> << /InternalName (Photoshop6MojiKumiSet4) >> ] /TheNormalStyleSheet 0 /TheNormalParagraphSheet 0 /ParagraphSheetSet [ << /Name (Default) /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 8 /PreHyphen 3 /PostHyphen 3 /ConsecutiveHyphens 2 /Zone 36.0 /HyphenateCapitalized true /WordSpacing [ 0.80000 1.0 1.33000 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.20000 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> ] /StyleSheetSet [ << /Name (Normal) /StyleSheetData << /FontSize 18.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 27.0 /Tracking 0 /HorizontalScale 1.0 /VerticalScale 1.0 /AutoKerning true /Kerning 0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /YUnderline 1 /Strikethrough false /Ligatures true /DLigatures true /OldStyleFigures false /ProportionalNumbers true /BaselineDirection 1 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /WariChuLineCount 1 /WariChuScale 1.0 /WariChuWidowPercentage 25 /WariChuOrphanPercentage 25 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst true /OutlineWidth 1.0 /Font 1 >> >> << /StyleSheetData << >> >> ] /FontSet [ << /Name (LevenimMT) /Script 6 /FontType 1 /Synthetic 0 /FontMetrics << /FontSize 1.0 /SpaceGlyphWidth 0.33350 /Ascent 0.94434 /Descent 0.37549 /CapHeight 0.73599 /DistanceToBaseline 0.94434 /UnderlinePosition 0.10596 /UnderlineThickness 0.07324 /HCJKProporitional false /VProporitional false >> >> << /Name (TimesNewRomanPSMT) /Script 0 /FontType 1 /Synthetic 0 /FontMetrics << /FontSize 1.0 /SpaceGlyphWidth 0.25000 /Ascent 1.00684 /Descent 0.30664 /CapHeight 0.67799 /DistanceToBaseline 0.69336 /UnderlinePosition 0.10889 /UnderlineThickness 0.04883 /HCJKProporitional false /VProporitional false >> >> ] /SuperscriptSize 0.58300 /SuperscriptPosition 0.33300 /SubscriptSize 0.58300 /SubscriptPosition 0.33300 /SmallCapSize 0.70000 >> >> ition 0.33300 /SmallCapSize 0.70000 >> >> ntMetrics << /FontSize 1.0 /SpaceGlyphWidth 0.33350 /Ascent 0.94434 /Descent 0.37549 /CapHeight 0.73599 /DistanceToBaseline 0.94434 /UnderlinePosition 0.10596 /UnderlineThickness 0.07324 /HCJKProporitional false /VProporitional false >> >> << /Name (TimesNewRomanPSMT) /Script 0 /FontType 1 /Synthetic 0 /FontMetrics << /FontSize 1.0 /SpaceGlyphWidth 0.25000 /Ascent 1.00684 /Descent 0.30664 /CapHeight 0.67799 /DistanceToBaseline 0.69336 /UnderlinePosition 0.10889 /UnderlineThickness 0.04883 /HCJKProporitional false /VProporitional false >> >> ] /SuperscriptSize 0.58300 /SuperscriptPosition 0.33300 /SubscriptSize 0.58300 /SubscriptPosition 0.33300 /SmallCapSize 0.70000 >> >> (TimesNewRomanPSMT) /Script 0 /FontType 1 /Synthetic 0 /FontMetrics << /FontSize 1.0 /SpaceGlyphWidth 0.25000 /Ascent 1.00684 /Descent 0.30664 /CapHeight 0.67799 /DistanceToBaseline 0.69336 /UnderlinePosition 0.10889 /UnderlineThickness 0.04883 /HCJKProporitional false /VProporitional false >> >> ] /SuperscriptSize 0.58300 /SuperscriptPosition 0.33300 /SubscriptSize 0.58300 /SubscriptPosition 0.33300 /SmallCapSize 0.70000 >> >> 0P!warp warpStyleenum warpStylewarpNone warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub warpRotateenumOrntHrzn8BIMluni hin8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrp@@'w6?@Q$/xs8BIMnorm((T derecha copia8BIMluni$T derecha copia8BIMlyid/8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrp@t@O /w{+w8BIMnorm(( consoltux8BIMluni consoltux8BIMlyid08BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrp   IS<0#X_K@1//'$ !  ##&+08>8G]T $0V 28BUScfjrrusƵsusrkfdUSD1  %0;CRauƸ~jS=<7),68Fh|ϻkXC. $34Nu ˺`7- *7fǢ^0!.X±{ikikjt ֫a*  &GDz{jg\P<-  %6KVahj Νy: (Ytk]A"  Vt|;j ѬlB 6btz3,tưe7 9i|e,(v׼h?  %Uw}8 eǜr= ,bߌ=QN;k)3R8c`jx6b0,;%JvRUV /_pr& 0e~ T 5m|*EGY  @ 3 JK|0|Rs a%E]+<G`I:`' nW |3 eg >y6}S 4nV m1MzWH:Ibf _  7ZI .Miq4 Pm )IUĈ?e7FUАG a% /CGf潉F u'  "-7?Ggժh6 !ޖK$  (3<BFJg~׵K A֗]7  /<>SsܹO(] ᅵW<1  #+17;<=Smy|ɰ~V,`㻛mLDA8,# % ##)15=BEDPfvʹbFB̺|}qXUT^hgfq{z ɶiU'K վbMCo ԸeV3 &O_ ѳt]Q4*I\asѷg]Q8 !%8HS]bdq|qcaZN4 ybұճݤҟ̣⋜˪媓R&1lލɻèԥ5B滹"ѥۧȡð;,_ұճݤҟ̣⋜˪媒L,:t¿ա3B滹"ѥۧȡð;,Pұճݤҟ̣⋚ʨ㤖? :62,-/CHJSX\^`ddfgfddb]YWRNHD>940,(% ;5 "-4:?FIPY^akpswx}}{yvqnhb]VQJB;4-(!K::",2:>DLR[bjrz|une^VMC<4,% #UI ?'.5;AFOX_enxypeZRG<4+$&n^B !.37EJQZajpzŸ}n_P@6+!"^6'  *273(:= % !'-4@JT^gr̽q]L1$  !(4?JVes͹r]H7*  $-6CQ^kzů~hS?/#  &0L[lzʵhS?.  (3=M]mлpXD2#  ")5CO`r īy_I7' %-8GUfu ˲gP<,$0- .7FVhz ѼlVA.  (8CSey ԿoXB1# 7AQbx ªqYE3% 3?L_s ësZE3% )=IYlīs\F4& 7BVgy īu]H4$  1?Pcvêv\F2% %K_s ӿrZD1$ 8CTj ѼoWB1$  0>M`t ηmT?0# 9CVl ˳hQ=."  -=K`u ƭ{bO;+! 5@Rh~ xaK;) ):H[r Ѽs]G8)1?Pd{˵kWD4'"5EVkưhS@1$  ,7H[s zcO=.! /;Mbyκr^K9* "1@Sg~DzmXF6& '3CWlҿ|gSA0# *6FZpιwaO=,! ,9I]tdzo[H8+ !-:Nawҿ~iVA4' #./% #0?Oby̼jXG8+!  !.2)"  $,9FTeuɼscVI=4)"  &0IR^lx*ļ}rf\OG=4,% $ #*25/*!5 --  !&+3:BKR\enw3xoe^ULF=61*#  )__2]"'.4;AKRY`hnv~wpiaYRJC=92*! 8Qᵄke`WC)$(,2<@HMSYbhnt{)ztpi`ZTMHB<61'7kâf0#'.28=BGMUY`eiouy'|yuqnid]XSNHF@<2*k(\!!&).37;BFJOUY_ahlqtv{}#{{yvtqnlgec^[VTPKGC@;1) PQ. "$(-248?<;;883-,( P6nĄ8 #$%'**-./101234566757768988767433.++& 5 !AavsZ1 "##$$&'&')()*(*)%$$&            `a]N73''&&`a]N73''&&`a]N73''&&`a]O84''&&`a^I3/(''&&`bV:+('&&`a`K1(&&`a]H/'&&`^K2(&&`_Q9*&&`ZJ5+''&%&&` ZM@84310021-'&&` ^XSOMMLLPPE4)'&&`_^`^M5)&&`b_J2('&&`c^I0(&&`b[?*&&`a`P4(&&`\D.'&&`aV:)&&`N2'&&`a]@+&&`aN3(&&'&`aY?*'&&'('`a_M2'&&('$`YB.(&&&'--,,`^S>0*)+.>X[[`]TE;9 e7oO;40-*+.-"{smlhkss\4n4e,c*Ns2Y#Bn/Op0Kl-Q%"#!!yJ)%KzZD>E`zwx tN;9Bad,$Fw 0CHVj (@k5g@z(c Z#a&qEB\V_     ̿̿̿Ϳɿ ƿ˿¿˿Ň¿ ,4$*2# %'3==;9>?=<47680453013211../--)+**)(+('&*)'()()'*)**'''(()'))*('(('%'*')*(()(('')(''$$&''''(&%&$'&%&'&()*)+'%'*+-6H[O28ALL$):+!FE $/Vs}mY=%&" *Lt̷~xhH-( !Nȕ{X2'DҞ`4B=Ͼ8-̭fS.  4Paivޛe2<[ux? /XmCC&0,.z  HYzs"HZ} HlfW.&o A /73" aT,=N`yoI"894z -CZo}S8  F 5 )?Yt㴁Y6Ta )GfⶀM/i pP 0SsċW)B^4M )QxИc1 /  &  !:b֦q@%^;  !?jٰyE VW< 5`ฃO EzjT G|ɑ]&:*Fxͥt?s*s ,IuִT:@.!@m޾g4 !H<|&RөrD]taI'V뿑_2_-XקzL"0( KĐb9{( )rL%uLIo6RA-N Rg1@7<ai09 dXj,'I9, Ju- VS ^~,CZ \)a"OEV tN4XOS4\{+`f Dl Si'?uYX1*51E6Rhy \cEGc X5Asud H  ../v7,KwefwQc["S0tTFPA Jy=':->KE9"{<g]67 lV4a ; '>2*5d>ToYzn =`9k-F!] r[(P2sGB+C\=/7-8, 'Ko B$(P;%KF"XETrhq]5-tre?>l#KR  rM {<xvef}=- 1 <OLRd*D ktr n@NK m# g  , _EX[Wl^V8b.S`W M 5VY z: bU^ ^nOn]X i^BlC ]1!dX&GXJn*X': MX  h[sv^r+]]k1 _jM b~p+ bO KP b" c fઋGHem c#, YzX[C F `M#e d*_) k$!S#up+Q ]6s9kX4I{E1lVpW?5Z 3 O#7@iAcRi tC# 'tdo1F<Jg4wGt 7lC -AaӁ{ '9GMaׁTA>@LZ{tmXXYXVWXYYXkutr~ lJܤv9̚V4F˟`?8)X ȹvbJ32-"]m9-OXS`ts}stulVX?./-)& QP;*#3;BDEGHJHJHFC?>7752/# #$''$%$%%(()*'%(%'"'"%'&#'&"$&&%'&&'(*&" %" !"'$" !%$$#"##!$!$$"#$$"$$"$$! !#%%&%%#"##!!%%$& "$$%#"##$$&$%&+13018?;BGFEEEAAA@ABCEFHMCJMNVSX\Y^_`a`ZTOLE7#1ZbĻԔޜ#Ѿӻ㻜yշȥ̺¸Ψ"ɱӳȥ̺̩ǥ̺ ׯ͸ϩɿ矙 ڽճܾꌇ'ĶձܾޔȾ֕*ôĶղܾߕǬһ,֡ĶղܾߕȯТ±x}/ɞĶղܾߕȯьʨit/ΜĶղܾߕȯя莁pt0ĶղܾߕȮՑw0snĶղܾߕɴց0ĶղܾߕĎź!Ƕղܾߕ﷌˖ʞ ղܾߖֲܾԆ˳ܾҹvñܾ䎏u~}ƳܿƋꊗދ朝ׂˠӋ>CDڞ ~y2 shjkjni&3%(҆~ԓ쩳 ĕ ߅}  㕔̣  ;ylmʖڝ)^瑅omo]~әuzy˗يޅ薎댖닋*.-7|zυw ,ޤ|(ܲ| y#˭}$ ђ{${gNhonu a馰_aϩڠS֦ʥ쓃©{mof܁ŏІ͂~ޖb"nsrs?*BAw  ~~VBؽチهzIPR9︁敏{ҁ|ʂޣҁwuyxy~uvԌT&!f龼aԋ~L$ \}jnejl`? jH :lv%A=A, *UV\f E{  EٔFSROc줛|ŽŎҘ3Í蓅dbqg lt晏ǧњ퐁튁ۄ/.0{턁ޖ1LhrBr}oru] #ЂS'֕U[}4 13231+*," LuFыw85.٫Rec힐l%#/źǁæ~|~/i켁ڋ \컁z,W컁TRQTW,HGA켁MʶA>9YŚȫÁȁɁʁف®쯁הyyCȗÉ|stus8¥Ϥ3|<{9-25zpqp~< = 6tsut>C?qqmlrӢېp(Ρ#$ӫٷÝ 6982܁P$"&UĽÁ呄԰ެغ块qwxtȑ閊ʉ죘πyvﰥŁҁ~^cӾA QFGH@عҮͤǛ ;pjhvws/%$'\xރݕ碁֥ݫުTBc_^]mlmL ЁA 敏>è敏_|}zӼanjnkլԃڌ—˕ڟ{vmُﻁčؓ﵁ٔި؈tyִ֏履㖔ח࣠yֆݏՓև䓉̖ɃšҤɔTADզ ሏS) ե {UC<㾨 펄 9>権,7752/# #$''$%$%%(()*'%(%'"'"%'&#'&"$&&%'&&'(*&" %" !"'$" !%$$#"##!$!$$"#$$"$$"$$! !#%%&%%#"##!!%%$& "$$%#"##$$&$%&+13018?;BGFEEEAAA@ABCEFHMCJMNVSX\Y^_`a`ZTOLE7#1ZbĻԔޜ#Ѿӻ㻜yշȥ̺¸Ψ"ɱӳȥ̺̩ǥ̺ ׯ͸ϩɿ矙 ڽճܾꌇ'ĶձܾޔȾ֕*ôĶղܾߕǬһ,֡ĶղܾߕȯТ±x}/ɞĶղܾߕȯьʨit/ΜĶղܾߕȯя莁pt0ĶղܾߕȮՑw0snĶղܾߕɴց0ĶղܾߕĎź!Ƕղܾߕ﷌˖ʞ ղܾߖֲܾԆ˳ܾҹvñܾ䎏u~}ƳܿƋꊗދ朝ׂˠӋ>CDڞ ~y2 shjkjni&3%(҆~ԓ쩳 ĕ ߅}  㕔̣  ;ylmʖڝ)^瑅omo]~әuzy˗يޅ薎댖닋*.-7|zυw ,ޤ|(ܲ| y#˭}$ ђ{${gNhonu a馰_aϩڠS֦ʥ쓃©{mof܁ŏІ͂~ޖb"nsrs?*BAw  ~~VBؽチهzIPR9︁敏{ҁ|ʂޣҁwuyxy~uvԌT&!f龼aԋ~L$ \}jnejl`? jH :lv%A=A, *UV\f E{  EٔFSROc줛|ŽŎҘ3Í蓅dbqg lt晏ǧњ퐁튁ۄ/.0{턁ޖ1LhrBr}oru] #ЂS'֕U[}4 13231+*," LuFыw85.٫Rec힐l%#/źǁæ~|~/i켁ڋ \컁z,W컁TRQTW,HGA켁MʶA>9YŚȫÁȁɁʁف®쯁הyyCȗÉ|stus8¥Ϥ3|<{9-25zpqp~< = 6tsut>C?qqmlrӢېp(Ρ#$ӫٷÝ 6982܁P$"&UĽÁ呄԰ެغ块qwxtȑ閊ʉ죘πyvﰥŁҁ~^cӾA QFGH@عҮͤǛ ;pjhvws/%$'\xރݕ碁֥ݫުTBc_^]mlmL ЁA 敏>è敏_|}zӼanjnkլԃڌ—˕ڟ{vmُﻁčؓ﵁ٔި؈tyִ֏履㖔ח࣠yֆݏՓև䓉̖ɃšҤɔTADզ ሏS) ե {UC<㾨 펄 9>権,7752/# #$''$%$%%(()*'%(%'"'"%'&#'&"$&&%'&&'(*&" %" !"'$" !%$$#"##!$!$$"#$$"$$"$$! !#%%&%%#"##!!%%$& "$$%#"##$$&$%&+13018?;BGFEEEAAA@ABCEFHMCJMNVSX\Y^_`a`ZTOLE7#1ZbĻԔޜ#Ѿӻ㻜yշȥ̺¸Ψ"ɱӳȥ̺̩ǥ̺ ׯ͸ϩɿ矙 ڽճܾꌇ'ĶձܾޔȾ֕*ôĶղܾߕǬһ,֡ĶղܾߕȯТ±x}/ɞĶղܾߕȯьʨit/ΜĶղܾߕȯя莁pt0ĶղܾߕȮՑw0snĶղܾߕɴց0ĶղܾߕĎź!Ƕղܾߕ﷌˖ʞ ղܾߖֲܾԆ˳ܾҹvñܾ䎏u~}ƳܿƋꊗދ朝ׂˠӋ>CDڞ ~y2 shjkjni&3%(҆~ԓ쩳 ĕ ߅}  㕔̣  ;ylmʖڝ)^瑅omo]~әuzy˗يޅ薎댖닋*.-7|zυw ,ޤ|(ܲ| y#˭}$ ђ{${gNhonu a馰_aϩڠS֦ʥ쓃©{mof܁ŏІ͂~ޖb"nsrs?*BAw  ~~VBؽチهzIPR9︁敏{ҁ|ʂޣҁwuyxy~uvԌT&!f龼aԋ~L$ \}jnejl`? jH :lv%A=A, *UV\f E{  EٔFSROc줛|ŽŎҘ3Í蓅dbqg lt晏ǧњ퐁튁ۄ/.0{턁ޖ1LhrBr}oru] #ЂS'֕U[}4 13231+*," LuFыw85.٫Rec힐l%#/źǁæ~|~/i켁ڋ \컁z,W컁TRQTW,HGA켁MʶA>9YŚȫÁȁɁʁف®쯁הyyCȗÉ|stus8¥Ϥ3|<{9-25zpqp~< = 6tsut>C?qqmlrӢېp(Ρ#$ӫٷÝ 6982܁P$"&UĽÁ呄԰ެغ块qwxtȑ閊ʉ죘πyvﰥŁҁ~^cӾA QFGH@عҮͤǛ ;pjhvws/%$'\xރݕ碁֥ݫުTBc_^]mlmL ЁA 敏>è敏_|}zӼanjnkլԃڌ—˕ڟ{vmُﻁčؓ﵁ٔި؈tyִ֏履㖔ח࣠yֆݏՓև䓉̖ɃšҤɔTADզ ሏS) ե {UC<㾨 펄 9>権,,Z("w׸ &4Q7H> I K.VX 6|d @mʫ^(/'[xuA "DD""DwUD3wwwDDf "wDDw3w"UUwDDww"w333D3"DDD33D3wDDw"DD"D33D"w f3wwwUwwwww Dwwwww3wDDUw33wwwUDf5fwDDẅD3fDUwDwww"wwwDUw UDfwf"DDwDfwww UDffwfDw3DUfwDw3"ݙwwDwwww3Dݙ"fwDw"wfwݻwwD"wUݻwwwwwff3"wf3w"wwf"wf̻w"f3fw3f"wwww"DDw"33wwwww"wwwwDDfwDDwwwwDDwwwf"3wwww3ww3wf3w3f"wwwwDDw"f3"fݙD"wwww33wwDwݻwwwwwDD"wDDDD""w3fDwwwDDwDwDwwDwwwwDDf3w3fwwww "fDDw" wUDf ffDD3w fDUwwwwDDwwݪfUDDffD" DDfwwwwwwUwU3wwUwwwwDDfwwUwDfwwww"DD"w3D3"DD3D3D"f3DD3wffw UwDDUfwDwwDD3```````````````````````````````````````````````````````````````☁☁☁☁☁☁☁☁☁☁☁☁☁☁☁☁☁☁☁☁   %QoWJt/e+n#a.;/_"ri(*\< K^1 K$q =)u@ 47!O }O+/Zjx,+1I/)]t,C)CB ur"+<2*mXK(<3Ky%+x-.jFG.8$+L{2-#!K11ZI,9K08=Pz{32-C*07QM^hQ<6jD,-640g[Ѓ](ѓS&  fuQM& M tBšl<  f\(P7n2  t5p څ;P (ߋE:E*xmcGt 'Ai K8Kf5o$8e(ܝ$فorW(  PZ${~G< ) O ?[   zLE4IhXXuK~jl\TiEv dv&CxP;[@:OC"Vz#Y\75D;-FeTdGCU_z#YJ& E 36/CjX IfU^| #YC06E1G0BkX1rT^| #YNQ5E@Y,DkX1n; N_|$V-S<QE/}=@:kX~]+="S$Y>#{.ESŧHn\^,{7E Trp_ D b kY ZrCKw Z ` yzh 8a 05j͢( IB K} fe)Ҏ0Zq=$V^ (~S L1,b|xx["DD  "$# "!  <<<<<<<<<<<<Jq.<><<@_O9<e<Kw><<@n<Gt#0=<<ܐU<^X'3><<@МqG<#<<<:PC:>ƯjJ:PN_TW=y}T=:PKsu:Nn>:S:P::TqA:iPQLK:]ɝR:?xPQK:@:KmK:@PQJzF:APQFaɝM:=PKia;:\:PKjc:J<:=::PKj:I::?yW?<;;<=>=:PKj:;WƵww|:PKj::ɹY:::>I::j::::8BIMPatt 09."/8)#!$#*/>HB96:99D?ILW\cflps{}}}zvsmmukfdbabbhozx|:1-,5@<r   SQYQY]d`jojtQR]b`LLU\\ubVeiv"%&')'#$2C7'NI 09."/8)#!$#*/=GB96>=AGIRW^clmstz}uzwnigefffns|~|:1-,5@<r   SQZQY]d`joj{QR]b`LLU\\ubVeiv"%&')'#$2C7'NI 09."/8)#!$#*/>GB95:98D?GOW^dflqvxz~~yvsmmuf`b\^^[^mnnz~|:1-,5@<r   SQZQY\d`joj|QR\a`KLU\\ubVeiv"%&')'#$2C7'NI   )5Pcs{~vn]L6/$ "2Xuοxs_H*'! .kˣyb:*-_ ܯlB*/Ӈ(gӷqiq# cU:  &7L_hsmyQ& +H`yRk, %H_L*/iVl+7Uw^N+@YW2gHf7.&~xon! /73" C 8Ӌ1,=N`ypM- 8&!yy2 -CZoᯀ\F0&'&   /xi& )?Yt㵇eF+&TB )Gf㺉Z@1&i Mu 0SsȔeB7'&C^ )QxԤzP:/&3   !:bٰ\@3(&0^m'  !?jܹa@2'&! 7= 5`i=/)&'&'&E U  G|ϡuF(&'('& ;r*FxӲ\4(&()*)('&}*P)^,Iuۿm@,&()*+,+*)('&I) m@mȤ~R.'&')+,.././/.-,+*(&2 +'X&Rض`5&'(*,./01232321 0/..-,*(''&%&-]xP@1'VǡwQ-& (),.0133556678765543210/-,+**))('&$=iXڱgC(&')+-02345679:;;<=<;::9865431/.,,+*))(('&0uKˡyW5&')+.0234678:;<>?@AABCBCBBA@?><;:875320/-,++*)(('&{)rᅰgE)&()+.0134579;<>@BCDFFGHIJIHGFDDBA?=;:85420.-,+*)((''&Q/\I組T8&')+-/023568:<=?ACEGIJKMNOPPQPONNMKJIGFDB?=:96420.-++)(''&^Af1 R~P:)&'>)+.0234578:<>@BDFHJLNOQRSTUUVVWVWWVVUUTSRQOMLJHEC@>:8531/.,*)('&N(aO7'&(),.0234568;<>@BDFHJLNPRSUVWXYYZ[ZYXXWVTSQOMKHEC?<9641/-,*)('&H ccAX|K5&(*,.0234578:<>@BDFHJLNPRTVWXYZ[\]\[ZYXVTRPNKHDA=:8520.,*)('&8I"|(fJɅL2&()+.0234678:<>?BDFHJMNPSTVWYZ[\]^_^_^]\[ZYWUSPMJFB?<8520.,*)'& y#vg4'&!')+-0134579;=>ABDFHJLNQRTVWYZ[\]^^_`_^]\[YWUROKHD@<852/-,*('&t}$^ ^͌K+&!'(*,.013579:<>ACEGIKMNQRTVWYZ[\]^^_`_`_^]\ZXVSPMIDA<952/.,)(&C5y$=)r8)& '(*,./13479;>@BDFIKMOQSTVWYZ[\]^^_`_^^][ZWTQMIE@<842/-*)'& E9Ef0&')*,./02579;=@CEGJLNPRTVWXZ[\]]^_`_^]\ZXTQMHD@;741.,*('&ua5"XY"&')*+-.02479;>ADGILNPRTVWYZ[\]]^_`_^\[XUQMID?:630-+)'&T4_W `o(&')*+,.01469<>ADGJMOQTVWXZ[\]]^_`adq`_^][XUQLHB=962/,*('&Hla53X{ji?&'()*+-/1358;>ADGJMPRTVXZ[\]^^_`nͲ`_^][XTPLFA=840.,*('&I= RBp֋Yg*&'())+,.02469=@BFILORUWXZ[\]^^__`dv`_^\ZWSNID?:620-+)('&@RnfF}25=&'()*+,/0258;>BEHLORTWYZ\]^^_`ctp`akyέYVRMGB=841.,*(''&E"4~O1n0"#&'())*,./247:=@DHKNRTWY[\]^__`lu`l}[XUPKE@;630-+)(''&yi}M?;p2c(&'()*+,.0258;>BFJMPTVX[\]^__`c{v`fqÉb_][WSNIC>941.,*(''&g$ =y''*Iae .&'()*+,/1469=@CGKORUXZ[]^^_`alձp`ceffis{市`_^\YUPKE@:62/,*)(''&* b[8O-8BW^`r[--F3- &-F:-c-&'()+,-/248:>BEIMPSVY[]]^__`hҫ~`_][WSMHB<840-+)(''&X c?#P ћ, UL -S`S- &F`:F&')*+,.0358940-+)(''&  y#ve8 M`M- -@`ZS`M- -:Z`F5&)+,-/248;?CGKNRVXZ\]__`fӨqmЗp`_^\ZUQKE?:51.,*(''&72Y[rSy6M`: -`Z-`M-`-z&(+,./258<@DHLPSVY[]^_` c|ֲslȑp`^][WSMGB<73/,*)'&|fP5DD<2?Ґ,9 :`ZM`MZ`S&`S" &'+-.0369=AEILQTWZ\]^_` xֽyoёn`_^\YTNIC=840-+)(''&&mbSFjbi I7 `ZM`-`&:` FS&+-.146:=BEJMQUX[\]__`o̅tvȎo`_^\YUPJD?:51.+*(''&&]g4 smNtC S`ZZ`Z-``-y&)-.137:>BFJNRUX[\^_`fԘttɑh`_]ZVQLF@:52.+*)('&&Z'iw$IF79in`-&`--`Z`F3&&',/037:>BFJNRVX[]^__``bvs쿇f`_][WSMGA;63/,*)('&&[K)$rzd 7:`ZS`S-`&-&~&+/137:>BGKOSVY[]^__``ts|g`_^[XTNIB<83/,*)('&&Yg 5w}_j_Z`:-``F6$&(/147:>CGKOSWY\]__``fԕptˊf`_^\YUPIC>840-+)(''&UzT ֍k2B(c̲h ` `-S`@ lZ&-137:>CGKOSWZ\]^_``|wsǺܖf`_^]ZVPJD>840-+)(''&RB~L$  \c\Ӵ2Jܢnv-` S`@ `F& &*036:>BGKOSVY\^__`kʃs|Աxm`_]ZVQKE?:50-+))'&&X 8 H ֧n¡q? 6 )J<-`F`F3`S:& %&&'/359=BFKOSWZ\]__c՘qt˘j`w`_][VQLE?:51.+)('&&[2vrLIR(fƫ^7@`M-`-`S: 5g&,358CIMRVY\~ֻtuyx` nl`_^]ZVQKE?:51.,*('&&P%a#3` S`M3` `-F-&(148<@FKPUX[tՐjfl`avx`_^\YUPJD?941.+*)'&&X,Tm=J `F-`&&`-`-r&- 35:?CINSWZfsr``ff`x`_]\XTOIC>840.+*)'&3hQZָR֡sO:`-`S `S&`:&&(0 47,Z( Z`&Z`&F`:S`Z&,259>CHMRVZ]κ|of`Рb`a`_^]ZWRMGA<73/-+)(&&\& `oH"w׸ &`3-Z`@`::`:#O&&'/36;@EJOTX[]ksynf`Ѹwa``_^\YVQKF@;63/,+)(&&lq&:`S& F`M3`S&&S`ZM&+148=BGLQVZ\^_`ee`b`d–ye`v`_][XTOJD>:52/,*)'&&u$L4Q7:`F3-FZ`MM`F3-FZ` v&.26 :>DINSX[]_`lŞ{ӫc`b`_^]ZWSNIC>951.,*)'&&EF7gu.H> I&Z`:F`Z&A&&)036 ;@EKPUY[]_` sǠ|Ýya`c`_^\YVRMGB=840.+*(&[emW K.VX :`F-Z`F&,138 :52/-+)(&&?`BS D&&).048=BGMRVZ]^_`md`bt`_^][XTPKFA<840.,*)'&&c e&*.148=BGMRVZ]^_`eu`mۆ`_^\ZWRNID?:630-+*)& ֕"&+.148=BGMRWZ]^_``g`_^][YUQLGB>952/-+*(&&.}4 &&',.148=BGMRWZ]^_``bΓg`_^\ZWSOJE@<841.,+)'&&Z  X&&(,.148<BGLQVZ]^_`|b`nҟxd`_^][XTQLHC>:630.+*(&l LX=&&),.048<AGLQVY\^_`j{w`}dxk`_]\YVRNJEA<841.-+*'&&2bF&)+.037<AFLQUY\^_`vҊ`xáf`_]\ZXTPLGC>:630.,*)&iW  &*+-037; @EKPTX[]__`w֣`a ӫza`_^][YVRNIE@<852/-+*'&5P"&*+-/36:?DJOSW[]_`ixֻg`ga`_^][YVSOKGB>:630.,+)&c [$%zN &&')+-.15: >CHMRVZ\^_`{w`cp``b`_^][YWTPLHD?;841/-+*'&&";E H@gi n&&')+,.159 =BGLQUY[]_`ry`l،``ga`_^]\ZWTQMIEA=9630.,*(&YT E =pӄ X&&')*+.048 ;@EJOSWZ]^_`΄a`t l`pu`_]\ZXURNJFB>:741.,+*&im E9tr" B&&()*+.026 :>CHMRVY[]__`ri`q Ջ`q`_^\[XVROKGC?;852/.++(&uCo  D _e 1&&()*+-/15 8=AFKOTWZ\^__`m`opsl`_^\[XVSOKGC?<8530.,+)&:D ?rO &&&'()*,.03 7;?DHMQUX[]^_`g` iՓu`_^]\[XVSOKHD@<9630/-,*'&.z ? <&&'()*+-/2 59=AFJOSVY[]^_`|b`cȍg`_^]\ZXVSOLHDA=9641/-,+'&[nz, ? @gXω*Y8&&'())+,.137:?CGLPSWY[]^__`t`a}p``_^][ZXVSOLHD@=:642/.,+(&<:B, ?,R4a #$%BEHLORUWXZ[\]^^_`_`s`_^]]\[YXVSQNKHFB?<9642/.,+(&y  G,{]Д/N &&'()*+,.0258;=ADGJNPSUWXZ[\]^_`}`_^]]\[ZYXVTROMJGDA>;8631/.-*(&'xM K Uvo  E ~&'()*+-.0247:=@CFILNPSUVXYZ[\]]^_`Ԁ`_^]\ZXWVTQOMJHEB?<:7531/-,)'&"x L"2<Ij?O&'()*+-.02479;?ADFIKMPRTVWXYZ[\\]]^_`_zr_`_`__`_^]\[[ZYXWVTSQNLJGEB@=;86420.-,(&$Kt4 Lg/= "&'()*+-.01468:=@BDGIKMOQSTVVXYY[[\]^_j_^]\[ZYXWVTSQPNLIHEC@><975310.,*'&5 kK VCi֙j0J= &'(")**+,.013579;=@BDGHJLNOQSTUVWXYZZ[[\]\[\[[ZZYXWVUTSRPNMKIGEC@><:754210.,(&,XHEQBl;;owF &'#'(()*,./023579;=?ACEFHJKMNPQRSUVVWWXYZ[ZYXWVUTSRQQONMLJIGECA?=;9764210.+('&<`B[l'f"U[VrGrVz&'''(())*+-./023579:<>?ACDFGHJKLNOPQRSSTTUUVWVWVUTSRQPPOONLLKJIGFDCA?><:9754310.+(&1b U8faww)d֝d֝dC&'&&%'(()*+,-./0145689:<>?@BCDEGHIKLLNNOOPPQRQRQPONMLLKKJIIHGFEDCB@?><:9865421/,)(&0W ֯Xή{#'wDwd֝9dd&&) *+,-./01345689:<=>?ABCDEFGHHIJJKKLMLKJIIHGGFFEEDCBBA@?>=;:98665410-+(&9a# rqşrC"rqw"3^ⷛN d֝+d d&&%'()*++,-.//023356789:<<>?@@ABBCDDEEFFEFGFEDCBA@@??=; :98765531/-*('&Cl)dUAmX1 ӟ:wD~S|d֝d$&&'(())*+,./01234557789::;<=>?@A@@AA@AA@?>=<;:99887 655310-+)(&Bg#Y  Ωk{Mwr6Td֝d&&'()*+,,-../001234455677889:;:987654311-,*)(&(Ke >""ôxm= wfw"w""ww3U=d֝dVdVd9VdVdd֝ddV &&'('()*++, -..//00122345676543200/,,+((&:QxX2 |i|iiwUfDD]d֝9ddGV&&'()*+,-./0123233232320/,+,*(&(@T{- Exkpˤ wfDDffDDfDD d֝9 ȏdd+dV r99VVVdd֝ddV&&'()*+,-./0/0/./-+)(& (,CSoO K 6tSlִDDf3wd֝9d9ֹ֫d&&'('()*+,+,+,*)'('& )>N_Y t7'fDDUJd֝9VVր֫Vd&&'('()'& .CQWyPjpuODwDDD~%d֝9ր9dd&&')+-.3@LZ}Eo iwDDUDSt d֝9++d֫r֝d&),-00348:=AIRW`o~u1f xGwDD3D agd֝9d֏d֝d*58< <2100,*('&)/35!47?@>DKIJX^]`orÅA^ I_{wwDDD7Rd֝9ddd֝d)8YyԮm4 !UִX?wwDDDe d֝9d֝dd֝d *BZqճzM TąLuֹXmwwDDDA d֝9Gdd֝d*CYr ѺhN4B%a|wwDDD20d֝999dd֝d -?Qbt Į[K$ 0 8AwwDDDZWwW. d֝9֝+dd֝d .;IWdq~ɸtXPA .QwwDDDo۳4d֝9+ր+rdd֝d(/;CKTfqvgVKIA2!  $)GwwDDDak d֝9V֝9d֫dd֝d& 4r wwDDD X}d֝9Gȝdd֝d'  C /wwDDDZ ]d֝9d9dd֝d% "M"V lPm,9" /!_ 6OD! Aw-Ҋ+" 2#    - %-S`S--```S``Z&F& M`F--F`M-`@3 ZM F`-F! ;WSZZZ-`-` :-Fv\ :ZZF -`-` F  !)87GKQaaosmtvv{}utsscaTKH87) )d` `-&`-`-S`S- S`:-`M`F-S`S-`--` `--`-Z`-3Z`:-``-F`3`3F`:`S -`3`MS`3$  ,Lgym^L?<6.;Fb(-``- -`:`: &F`:5&`S-3ZM-`M3:`F& :`:`--F`-- `--`:Z- @`- M`: &SZ@`:`-&` :S`@-Z&-SS-- M`: &F`&-`:S&-ZMZ: F`& *5@Lgz`/ 2] †? NުTI<FMF-``:`-`@ S:-`@-`3``--``--`ZFZ@`:``:`FS: `&-`F@`-` -`S&`S-SF &1?QoiB,,UޘM  )H`fG2! /L :FFF-`-FS:`` -` SF-`--``--`&&` `-S`&ZZ-` -S-`&F `3F:-`&`S3`#,Bj ȈO''Bqu/ But>%&HFMF-` &`ZZF`&-``& `--``--` `-` 3`SZZ-Z-S`-F-`MFS-` `:-` &8c vF.6[˺sjkhik_[jkjkW0_ ضz@! c-``--```SF&-```--``--``-`-`ZF-Z&Z F`SF-`F-``--`  5]&ӣlB;WťuodSB5$  0;HVfq}w/  L خY)`--`-`&`Z3-``& `--``--``-` :`&` `&S:SZ F-`-``--` =wϞoPOqɦoYB%  #ϛoRQm|qW.   .gݝ^-t SZZS-`Z:`-`:MZ-`-`:Z`--``--``3`&M``Z@:``Z:`-FFZ&`--``--`P Τx_ZRXQ*  $GgxV) "n M`@&-F`M -`:`: &F`: &`M&3ZZ-` :`F& :`:`--``--``F`M--:ZS@`&`F :`3F`&Z&M` F M`3&F`:-``--`O ŖlQ70   #On}هLSP"-S`S--` S`S- M`F-`-S`S `--``--``&F``S--` Z`-:FS``Z&F:Z`Z--``--`TݰR/  9cz^)j9;  -` F `&IϩsO  $Dvf,pC-`Z:&`&:S:ݝn6(Vxf  TP-` `S- :`MZ&%o> %-0-# ,Jk`){2{-`F`Z--Z K[ '4;3' "(Hnd^E{v'9"6<4  98' 7]g '>A<7 0<<, *<2/H[K<9%$Eyo LrTG  2<<.)<6 ,Uh !H|z(,9v3`9 }s ,<<;/< 2%ZM  'Ux0NV}8; vt&<+"6<JL[N8Ǝ yt F+mQ < x><<2< @_W$  7z 5^z$ e;1;<Kw$or@6  #%h1B>ɔ:Wt2>':<GtO9R    <;|85tR:4Gѷ< N<'8a 7_< vu(FK 00 (:<+j͢(3RtHl{ |3xB Ii '+/8:$fe  #G\l6s  H)Ҏ$$!((~SA3qtaGG?2'  )  $-5tkG*-775?QP[ihfxtfhi^PQRI75-.*%    )5Pcs{~vn]L6/$ "2Xuοxs_H*'! .kˣyb:*-_ ܯlB*/Ӈ(gӷqiq# cU:  &7L_hsmyQ& +H`yRk, %H_L*/iVl+7Uw^N+@YW2gHf7.&~xon! /73" C 8Ӌ1,=N`yoK' 8&!yy2 -CZoW?&   /xi& )?Yt㵄_=  TB )Gf⸄S7" i Mu 0SsƏ^5% B^ )QxҞn@' 1   !:bث{M/ *^m'  !?jڴR. 7= 5`Ἄ[+E U  G|̙h5 ;r*FxЫ~M" w*P)^,Iuع`/ !  A) m@mÜrB #%&%'&% $##" ) +'X&Rկ|Q# #(),-..//./ .-,++*(%$" #]xP@1'VÙj@ $),/1457899:<:9875430.,)(# =iX٬Y2").03589>@BCDGGHGECA@=;8630,($!0uKǘmG#$*-037882,(# @ ccAXr;#" %*-0359=@DINSW]`ejpsx|}xsmg`XQHA:4-)$ /I"|(fJ}<*#)-/369=AEJMRW\afkoty|zsle]TLD<4.)#  y#v\"##(,/259>BFJOSX\`fjotx}~xqh`XME<5.(# t}$^ ^˅;$%),/49=AEJPTY^bglptx} {tlcXOE>5-($ C5y$=)i&' $',038=CIMRW]bgkpuz|}umcYNE<3-'"  E9E]# #&*-49>CHNUZ_ejnsx}}ulaWMC:2+%  ta5"XT""%*.38>CJQX]cintx}~vkbVK@70)# T4_W `j!$(,28>DJQX_ekqv|rdYVo~uk`TH?6.&!Fla5 i2"',053+$g$  ''*Iae "!&+27>GMV_hqw~kA*" !E ѮsgZMA7.& * b  -8BW^`r[GGoQG=Go[G)c& "(-3:AISZblszb8& %]Ϋym`RE<2)"X c?#   UL  GG=o[)C $*/5=DLU_fpwT# 4ί~sfXK@5+% zO ~   pGGG oQ v #!%+28?HOWajrzm' Mʬxl^QE9/&"C~B    "D  ezz H#"&,3:BKR[cmv~uOl6 #w©|qdUI>3*#  y  8  zzG3)Ge zG3)G[o1 #'-2:CKV^gnxuK#OJ @༣th[M@6,$72Y   y6 z[ GGz)GGx  $(.5GR\gqzu:" !_J +`קݘvi[L@5,$L2v  7ezGG[35f  /4=EQ[fp{X( Bf" 7w꿚ܘxk\MA6-%LT$ nooGe[n-3:DNZdoxQ -w~5 >רژxl]NA6-%K`CooGGzQ /(28AKWblvt) !^R 4ƙۘyl^NB7-&S ooG=[z  s  /5?HR_jt~WtT Cn& 'v֘yl]OC8-%g  tooQ=ez2,3>}0 ,u~: Pؘ߱xk^PB7,% }*  # Goo3oG\?%28BLXcnxy6!r_ !^T &ׯטxk]OB7,&fb s=[G/6>HS_ju~v. @3 C~r( B ¸Ԙwk\OB7-% - E -=G)=G=[) **39DN[fq{q. "lg +r|@ f ѮӘvj\NA6,%KE QeGoG( !/5>JUblwt, <; [[ ! ҲԘuhZL@5,%P Q zQGF'+3:DO[hs~}1 !hm" #6Zl+ 1Ԙ~reXK>3+$X,  =JoG==G Gr " 05?KUbny@ 8A "6Sq; <՘}pcVI=2*$ hQ   sO[G=)7* 29DO[ht~d ar# '@Xtt# @՘zmaSE<1)#<tPo  >,Z(==o[ .4=IT`mx_# .yG(=Pe|Y &W՘wk^QE91("M&   "w׸ =Q Ge)[  [[#L(08BNZfr}gRPmr~H %?d֘uh\NC7/(!^ &[= 3oz Q= = M,34,%EF7g H> I=[  o=?)/8 BNZgs~ * /W|rF&3Z~٘wk_RF<2*#[em K.VX[o)Go+1: ER^ku 8OuwO+1YynYϚؘ~tg[NC90("$p  6|dQ[) =oe) $,4> HTbnx qwU00TxwO()ʿ٘{pcWK@7.&!@hxu  @)G3)3G=)<S&-5@ KVdq{X00XytO( ~ژvk_SH>4+$ V6kmʫ^d (.7A MYfs}6UzwP+ rژ~si\QE<2)#ۃ ` !)08C O[httqQ, \ݘ{peXLB8/)"ޖ1P r #*0;E Q\jvU/ Dޘvl`TI?4-&!-`BS B$*2 GR]it~- 3i$ i浘}ulbYOG=6/)$ TT E   X %*2: CNZeq{U(tq( K Ѡwof\SJA82+%!im E   B #(.6 @JValwex0 /'䴘xpg^TLC;4-(#pCo  D  1 "&,4 =GQ\gr|; x̢ypg^UMD=5/)$!,D ?  &  $)19BLValv~? W 乥×yqh`WNE>7/*&!.z ?   "'.5>GQ\fpz|( :۵ܛyrj`WOG>82+&" Rnz, ?   *Y8 !%+18AKU_jr{` )סyrjaXOH@82-(# 1:B, ?  #$%GOZbks{3 M(ŧ|ung_WNF?82-($!s)i E    J_ "&+29@HQZbjry|, 8~xrlc\UME>82-($!v+? D      eU #(-3:AIRYaiqx~p' -{vpha[SLD>72-($!q  G  N  !$(.5:BHOX_fnty~j( &z|wqke^WPIB=70,($!pM K    E ~ !%*.39@FNU[cinty~m- "w|vrkf`YSME@94/+&# t L    j?O !$)-38=CKQW]bhmsw|}?& 3}yupkf_YTNHB<72-)%"Kt4 L  = " !$(,26;AGMSX^chlquz|`Fe$}zvrnid`[TNJD>940,)%!* kK V    J=  &!$(+/49>CHNSX]afjnrvy|(~|zwsplhc^YUOJE@:63.+(#OHEQB   wF  % $&)-059=BGLQUY]aehlosux{~+~~|zwvurpmjfb_[UQLGC?:72.,($/`B  f"U[   z (!$&*-149=ADILPTW[_aehknqsuwz{}}~.~~}{zywwutrqpnkiheb_\XUQMIEA=9520,(##] U8   ww)   C * "%'),248:>AEILOSUX[^acgikmnpqsttuuvwvwxwv%utsqponlkjhgfdc`^\[XUROMIDA>:852.,& N    wDw    # "$&*,/257:?ADGILORUW[\^aacefghijijjkjh!gecba_^]\[YXVSROMLIGC@>;8742,("&V#     w"3^ⷛN    d % "#&(*-/1579<97541,(!6e)d     wD~S|  $ " !$%'*,-/2468:=;9 754/+)!1\#Y  wr6T    "#%&(*+-/2256789<=>?>?@A@AACBCBA?><;::876 5432/++#!:[ >" wfw"w""ww3U=        ( !"$%&()*+--/002344545676778787676654233211//-*)' 'DqX2wUfDD]        !""$%%&((**+,+,,--././/./0/./- *))& .Gt- E wfDDffDDfDD               !""$%&('(('(%&" 2CeO K 6tS DDf3w             ,>PyY t7 fDDUJ         2@HmPjpu DwDDD~%         .%&HozoG=o=G =GGGG))GQ G G G oGzoG[G &8c vF.6[˺sjkhik_[jkjkW0_ ضz@! cG  GG))o=G))GGGG))GG oG = ooGoGGG  5]&ӣlB;WťuodSB5$  0;HVfq}w/  L خY)GGG =QG=GGGG))G[==[)oG GGG =wϞoPOqɦoYB%  #ϛoRQm|qW.   .gݝ^-t  )) G)[G)[ z GG[)GGGG))Q= z e[ [ Goo=GGGGP Τx_ZRXQ*  $GgxV) "n ze=))Goz G[[3)=o[ =z=))QG [o=)3[[GGGG)) ozGG[e=o3)[Qo)==)zo zQ))=o[GGGO ŖlQ70   #On}هLSP"GGG3G3zoGG3GGGG))=oG G3G[o)=o [GGGGTݰR/  9cz^)j9;))G))) )o) =) )IϩsO  $Dvf,pCG [==[:ݝn6(Vxf  TPG 3G))3[z =%o> 5VjqiR7,Jk`){2{G)oG G  K[ +[yw\G4#O9(Hnd^E )){v'*P}zE Z  7]g '>A,)of au(#5C7,*$Eyo Lr>4tla~(  ?aM !H|z(,9v3`9\U g-&n u B|9 'Ux0NV}8; vt zp@eP~gDo:,wn^[ F+mQ < =?t @y{{ 7z 5^z$ ,1rgVX2n* xwRWh1B>ɔ:WtoUZ:y,@    wuCn_ S) 4J*Ex%3 Ilf>>R5XkJ LlfA;iiJ wu%i|A 7A%B,!B6=<kifGK Tb0y hL VjKOhwte&3\j/#&tfh*f;Rz;8[yQ"X jh%wt;vY2ZimS]JsB_z 3H<BwwDm~1XgF%|g&1#ˢpG!IDx"2g".K> "P;BwwDm~1XgW+}qW!4Xֲ~O),Ez->g0K>"M) 7CwwDl~/Vgb C_ZXI]5.!Y<Er!X+_-)K>XA+ :wvFl1dgTn"LJ/! D k}"E:u 3dMAB`| ppzzDO rfOj&]V,ay'@v .?SfFbld0j EK> y?P`zx%)A fOc1z%Y? fJ, K5YZ?z [)aH 7_< vu(FK U#\cNw3RtHl{ |3xB6n' )EZdmTK}J  #G\l6s  H^i 1T>!/M\4]=A3qtaGG?2'  )  $-5tkG*-775?QP[ihfxtfhi^PQRI75-.*%    )5Pcs{~vn]L6/$ "2Xuοxs_H*'! .kˣyb:*-_ ܯlB*/Ӈ(gӷqiq# cU:  &7L_hsmyQ& +H`yRk, %H_L*/iVl+7Uw^N+@YW2gHf7.&~xon! /73" C 8Ӌ1,=N`yr\Y\^Y?8&!yy2 -CZo᱋~~za@  /xi& )?Yt伡yHTB )GfȬpi Mu 0SsڶhE^ )QxpD   !:b¿[^m'  !?jܾj 7= 5`E U  G|ȿ ;r*Fx¿*P)^,Iu) m@mu +'X&Rt]xP@1'V  m=iXǿm0uK{)rǿQ/\IAf1 RĿ(a ccAX!yI"|(fJ$i y#vȸ!ct}$^ ^!dC5y$=)˸ÿ e E9E巤dva5"XjW4_W `ёݷXla5 i㽘sTD;1dn= R  YѡԥuQ;& iyRnf  5k؞fG- LqE"4~O Vk>& Eyi}M  ;p2cʂG* Lg$  ''*Iae ^3$ #d* b  -8BW^`r[3vvv3"evvCc_K+ )X c?#   UL vv"eC\& 8zO ~   pGvv"v- MC~B    "D 33HNvI #w  y  8 vTCv3vTCvLo&wn @72Y   y6"v3vCvvv z0 d# !^fP5DD    9 C3e"U І7 P6 *bSF  I7 C3vCeTFcB 3[ Eg4   tC 3v3vyLQ #؅! "q'iw$    nCvevvKh, d٬. 4K)$r  7v3eveC3x}7 8E \g 5w  v336X? #h #zT     c̲h 3T"v"li]& `ٟ# <B~L$  \   Jܢnvv"Te"O; 7C #f 8 H    )J<vۘe"@P# #n 42v  7vvۘT5tz/ _ա$ JT$ nv""nPz 8G W`Cv"vKػ1 "| E v"e x `ӯ* -  t"e2NXX= 7Q y*  # vTv\RI" # +fb se"vK: [D `ͷ/ ^- E -3e"v3CeveC F; # 5Z KE Qv"3v(w6 SQ !Ό "P ""vFY@ ## %I5 ?X,  =J"veevvrb \ K^ #H~R ThQ   sOv3"eCK % -Z% ZtPo  >,Z("e3eI& 9g0Ux *&   "w׸ evC#]|xڸi )X &eTeeMHQ $EϜu$  4Q7vvTvb ? @ʸ\&qEF7g H> IeeR 2 <ɷf*D[em K.VX"Cv3Q Lww5?ůp  6|d"CeC ߵ=>v00hxu  @"CvT3CTveC<z ==źv/ !6kmʫ^diIx5 ۃ ` `滶z7 ޖ1P ui< c`BS T: E eKP + ֕"Zk }4 a ¿  [j" Sl LXN7 Pʦ¿bFSm Oӛ'W d QҢ/ ¿5P"d@ SР- S [$%zN a Pˤ* *¿;E H  ob 8 DΧ( T E   Yc // oim E   Cc ۟= <Co  D  3c Q D ?  'b X ¿.z ?  b / Pÿnz, ?   *Y8a! 0:B, ?  #$%" wfw"w""ww3U=        ? İX2wUfDD]       uƲ- E wfDDffDDfDD            #{ ̻O K 6tS DDf3w         ${ Y t7 fDDUJ       $v Pjpu DwDDD~%       H;Eo wDDUDSt         A[cg loolgcZTYf˱u1f   wDD3D ag       *5:>@6652.+('(;Zpvvw!vyÅA^ wwDDD7R       )8YyԮm4 !U   wwDDDe         *BZqճzM TąL   wwDDDA       *CYr ѺhN4B wwDDD20         -?Qbt Į[K$ 0 8  wwDDDZWwW.         .;IWdq~ɸtXPA . wwDDDo۳4       (/;CKTfqvgVKIA2!  $)  wwDDDak         & 4 wwDDD X}        '  C wwDDDZ ]       % "M lPm, " /  6OD! AҊ+" 2# "CC""CvTC3%vvvCCe& "vCCv3v"TTv! ;WCCvv"vv\ 333C3"CCC33C3vCCv"CC"C33C !)87GKQaaosmtvv{}utsscaTKH87) )d`"ve3vvvTvvvvv Cvvvvv3vCCTv33$  ,Lgym^L?<6.;Fb(vv vTCe5evCCvʇC3eCTvCvvv"vvvCTv TCeve"CCvCevvv TCeeveCv3CTe *5@Lgz`/ 2] †? NުTI<vCv3"ۘvvCvvvv3Cۘ"evCv"vevۺ &1?QoiB,,UޘM  )H`fG2! /L :FvvC"vTۺvvvvvee3"ve3v"vve"ve#,Bj ȈO''Bqu/ But>%&Hʺv"e3ev3e"vvvv"CCv"33vvvvv"v &8c vF.6[˺sjkhik_[jkjkW0_ ضz@! cvvvCCevCCvvvvCCvvve"3vvvv  5]&ӣlB;WťuodSB5$  0;HVfq}w/  L خY)3vv3ve3v3e"vvvvCCv"e3"eۘC"vvvv =wϞoPOqɦoYB%  #ϛoRQm|qW.   .gݝ^-t CCvCvCvvCvvvvCCe3v3evvvvP Τx_ZRXQ*  $GgxV) "n "eCCv" vTCe eeCC3v eCTvvvvCCvv۩eTCCeeC" CCevvvO ŖlQ70   #On}هLSP"vvvTvT3vvTvvvvCCevvTvCevvvvTݰR/  9cz^)j9;"CC"v3C3"CC3C3C"e3CC3IϩsO  $Dvf,pCvee:ݝn6(Vxf  TPv TvCCTe%o> L{vO),Jk`){2{vCvv K[ =ƫfK2"qR(Hnd^ECC3{v' sɰc-''7]g '>A )ɓ#:  $Eyo Lr%ɛ9  )( !H|z(,9v3`9 A6 &47* 'Ux0NV}8; vt&# [sm"0:8*5FLE1 *D( F+mQ <( 7WZƯjJ:- CPOIPP67P5  7z 5^z$ I=y?G}T=:4 'PK(1PP 6P1 u} h1B>ɔ:Wtu:N\n>:P6P;PP 5P4`ɞ_ S) 4J<ɀ::OqA:iE>P6@C!0-%(0!"0.//!5Q18ɱ] O]5_?/_M WWkifGk ɿv(7::]ɝR:?x1>P6 .OPPM"APMPPO'/OPPM"#MPPO.5Q06IɘC27ǧfh*U>:KmK:@=P7;OM(6PC @PG$;PCJO':PDKP/.PN5Q0YɺHɗwjsB_z PP?P PCBP@PC@P5P1aɛFɔɅ=mub ŝ_: a;:PO?P!PCCPF PD @P5P1bɝFɔe5|g&1#ˢpG!&+iɱM:?cD>P6>A.P>PO?P"PC=PP$PD @P5P1bɝF~ɔ}=}qW!4Xֲ~O)@*F:>\yE=P7PP.P>PO?P"PC# 9PGPC@P5P1bɚD|ɔ#ɍ C_ZXI]5A/yc:J<:<*E3PD'PP*PBPM?P"PC(PAPJ PH GP5P1eɛFɓyɞ1LJ/! a+::?yW?<;;<=>=::7' EOP>4IP>NM-9P?AP#PEPN+8P@HP22PJ7P3aɼqɓqɘ+þ6|,ay'@v BZ9;UƵwwL-76!-MPF/P M@P"PD6PJ$MP+7P25;^ ɒrɎGɰ%Y? fJ, kL:5@ Ƀ //7_< vu(FK lD9+ */% 3RtHl{ |3xB4BW+;cy'  #G\l6s  H 0 GyY0 DoJ  A3qtaGG?2'  )  $-5tkG*-775?QP[ihfxtfhi^PQRI75-.*% tcos-0.89.93ubuntu2/images/logo.xpm.gz0000664000000000000000000002621512260610261014445 0ustar ySElogo.xpmKHOA4\[5}!P[];^00A/la€nDĉɠByYu3%Q|?\Oq˿߇_u_??_~6OaO߾LfS01Kq$E&E-Jb!1ą;b#JB038[1 aߛplvG A~`oAc"ȟV ,o1+j"9 5RN1xy\"qE# s"q )'E ⊚ dͽa@A2}-W4V|A Q3 706bP9q?>'jptܐ^W*lNF0O S}uGz1—M6Mm%4 ̼WgXAfd)4dK C!1]M C_k1t> ,~[jq ?Ҿ>^qO:W48e Oؾ)G?$^"| ]/j |AfLIz=k[2U>O4me8cb$<|=)<"υ~_T/ o !uvόwu^&Wo0+"i՗AVx9=ʆ?hƠ*OKJ*3c"7~)ua.~fI<:/T3H83X~ |S%sdu+$¿Ui>eC8o<ܽky &?Kj3]?Um'1X8៦/'aYנ%7n_> YM/4}F7^ਥsQJRdȔu9[V_W86wٖHcp,D_CPkh$4_"UmWO VL>U]ZR :app9uody V9B ИGsx|u, i|XON"&eǨE)IA0'KA fNCx6%D0lb`0K8 1WzUCq;M,XJ#H V=8pu)cvG$o-#Mw+99KĀ(;1TI_cZ}^'ؖ3\Bp7z5L@8_^yi2ĨXJR2\WTֲ&wGA&-5fZI ֩))?@yr_f D'eJ@{c=ROMx|P[2)5%WZ _%byܟu2Zu: O*|5 ":^}? ޠu1;bm {xLxW$mnl yݾA=qCqyL`Xu\Lؼ9.B^o_ 2TeOT+ab!0Zt(,! {o]*1NjN>r`h0P0.4o1qFZ7uM2VL+r@jֳ%_48Mv&P#Q38VOEP3tY^ܖWrf9B\2N0'.@6+,15b3<.f!F(o9C7xyl^aF%-&;Vu <6 FQ.Q,X4K !ourī DƕT1 5"w,m/+ÌE#H*mп!"MoFwCӭT.YY`OeMR  ;乲2@W}+Dzg: u**$f{A/ȘN[8*N{5`p>LK:(Ɏ(ÐHDN UUA撓xY?r_ g1j ?{"}cCT|+֝ $Eo֣ѧ<;ur('؀AϬ,,+ |~abbv Epf]ԛg&m4b3e&wPerǛƑ9g0װi$$PeGI1ᰊO8(|<ɗXj N8< G>.C5uy9)73>&RjPC*J~T]gPxAX=G rGF F0OHKI0GC* ߤ*oYt7#-&msG>@BL[$€T莞)SF_,U = ey> ^ XAp!39B(9[ 5oynN9*"l'j־a+QePAxiejBNj2 [o[㋯Hq&`mR"'nNyΝX P2[uAכVA=JHV?|F/HY'슑36aT0/C%g<V: YA툵h렭)$v|`,|JcTsVQ٨f ,jib.@&⼇FImRNa17.t]e2K^]tAh>;ĸW!eAi%g8/J(' :f: H@;g]L-B9z,|$Qe.t&0=˖Faq5ŝmsO < pfw a.XqLRKU׀uiM8c(# wZ]Rзĺ6@řK0%>jd 3$p&ߧ}v'Ln!wF]m]:ƠLn.񞘺Aћ߯v0L3{)l.N.R]|m;GA3{b~]G=S:` ff8׿,+f!a-% K30ܩ}b`~#O pm0oۮuB2ep^ 1t/͐E&Dae'Ptŵeg댳q<ޏUA{+]xpI֗uAnMB =h:/)as%K3v6PQeUA"WM릿ش =?a11k/ƼqpV'xC\NL7iy:0w|R@wM5Qz9SbH2 .ۺl-j{&" ik:c<]6 [PC2)p6h1? vO8Nn:ƛJ#쵐hBf0RWo7C bqO!mːa%$hL &Ew.3̄UgSms.jgQ ~o:aen7p>첱&-V3(.d`f3&杀82M{Nɢv=-ř%dE5|R: ]<_&2@D{0 ONj`} pE3';XC O/#{G }zb$L. I"4[86.;r :IaWkq.3!|!躰$-$Cx\{ HG4#Ao$Iץ` OuyH>6:`0 ɋ]2Dz/_NW$WܜΜr6: ͭdo>f f͊71ztԌAXA>{8Ch/d7ڷmfpŶXR3R$W^Ѷ؀ݥ ǍAbО_6Ta0[﹕˵߽Laz%m0HH69V[#vJfuIr&D2cF%wEa{u*M +±WG(ĻQôrס (S'e! ~Iy} jZ`_-LQ;WGKWhV* 'boI6ҕhD,;X1AJA4sMr[D3d^]4'\x šj=Q;Ƚ0ё5T~8](\w^N\[: e;WT -Nvފ 5xYw8 yMĂx2jz~.#8gpv~k CeX8bS^xbjr;_pNY_tڙҎ1X$WFYAs nS3;"[̊Mڠ B;h,,-ea16>4Y,i5^oI:[G2`Q 3ƺ@Y6vي`PO4xdRfՀ'8|-Pht K50 V 2,55u3̟g,oISttMI^lnf|X\y лOEVCOAhl2>H ScKm?d~Gi*bz$:"Awh| +G G!z@Yb F ߀`=Af" lg7v9o2 T߆Agrl/&tƄODߺۉWZ– ʏB)طLXɜy^0 ЁZK/2J{XSܦ$MOB :߼8iWO| v{~۽.f|ϩ`˲M;VB?ԙ6;*fަ}5* wΐ*W3Avz , _7Ex;,&Z$V-6`"cPqE_"r(cSq4k,E^* y1|V=pkmoO%ۍ_; zb!E`'G0gc[e;fSx5[ M!@vt[6U0e䘞j\^|1|އh#`~A:+Ѩ !CoZԶww4g}O8A1* az#d0̊|8C<cgAD59yc;kd^l6)bƸI9^m9m" Kh.x XOZg_iScp3-V;Bv3 ȟffS8ޖlA7i5B`>D%x@>TjEKے̸pv#n\_ĬO󬌤K={{\Xσ="v{=amslz;Hv$$iOS+Rv[" @N,! ~;񕱃jSr*Slڟ|f;t60vvg.૨[ŃU>r3 {3ex@L<({>҃pFߌm7\j&Od)1:5kP~-*M#l /|@6fP.Oʠꎠ{(pKuSukxI!3N4(qi/eR_W*N8>ۺ݂:kT[vbЍfo;R8΄˓/$ea~!btB~6l9iEœ{'ˤycۓ~ , Kblu韒H1zIL NV}p*c߫0pbma?^94lNb6,^cna!\$)  wd`8 6r'L 0(H#92s¹Cxi+?GbL u .>A-XA/"CY 梟ۚ)<>/I x)RTvј.U-uQWvw$\J7'io@PapA`zm\)YS],|rFh1ܛä*3g4>x*,ma*`ãq])h=>g?bʳΡl.NFmO xl2 c| N Ash1wen2|z'/7^6>q v_K638:a0jq.mg[ uf+&ϾB".1H}ˢʲ{}UD6Kv4 |մl^Z^LgJjOa0g%O7XaU j:Ztfr2WA5Q hՐNo8" 0Z*D#A4h ؼ(e @yC溿]yb4 ~x䉍ߝd>")JojJV;V:*1r\18A83LূMg4kqxHRL3i> I$ؚ?%PڳYg &<-TԘ> bg@SD@cgYBPuWV~AUraarҙٵpbOfM2hgsߢӝiNfCtYS1) N[s_+SD6!yK,LaY5 h7y6+1:n.wߏZ߹Sl)ɺ uM䌳*0>ɨT"n0; Rrd.M@}_I9u>ș76Y=gt2ҋpKqZY|˄yJԳsh3.*닃[_Ezy6\۹Ӟ\r,8|&M .-uDP a^fK8*(5i:^V!CՖ[u u&!k{A8;fGZ WdyzSq[쑺t]EX/m8h9/Zh 4~ԱT_-L|Bl~ټ{ە*LMSH'X1+3A/%D z~nzA 2bowN"vȢxiE Zͪ>$y"Mt_Ġ,든ٶF|ZZqg]pa_`T7M?Ax6WĊg(3"L%< @g2q/"b ~ɴ0xLHE yTg|Tq"dIYYQyI-n. $1H-b[ ARo"IE z$1H-b[ ARo"IE z$1H-b[ ARo"IE z$1H-b[ ARo"IE z$1H-b[ ARo"IE z$1H-b[ ARo"IE z$1H-b[ ARo"IE z$1H-b[ ARo"IE z$1H-b[ ARo"IE z$1H-b[ ARo"IE z$1H-b[ ARo"IE z$1H-b[ ARo"IE z$1H-b[ ARo"IE z$1H-b[ ARo"IE z$1H?3Jtcos-0.89.93ubuntu2/images/tcos-splash.xcf0000664000000000000000000023334012260610261015301 0ustar gimp xcf fileDq\Dq\$gimp-image-grid(style intersections) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) c4&`*.3<JNUt7.` consoltux     8q``  <*<<< =<ES cH?><<=ALcѰaH<<=Ik>@Fuœ_F@=Eeש = << <?DWĖdLH <<=Iͬ ]L=@KYgjb^y<_kY><<=>@A??HlI=<<C=< <d< < *     󎞷          *::: ::K=: ::Gĉ=: :P:D ¸[;: :P:>I~ŽxVA::PPPP[t}gmfQC>A=::PPPP iTe«]G=;=Wxn:: PÓHARqnI;::@X PȫECABMcu]C;::?^ P=vhJ==?<::r Põ|F;::;Kd: PȿF;=;::=F_vd:: P憐X?IbWC<;:;;@D=::P?@DCXzf\Z_cWB::PȱD::NƾY;::PɰMA=Xj;::P:=ELg:::B ::? ::ijS3 * TsR;]v5.)ӔT* /V %1"9t-s 6Og^:!  +R0 $# :O/Z_6 :s]P +jţd-&od R0$`z1 q[  aM(zP)E 5<\*XbD%KJ[W* -\Eت - 96%R6 ,̸Mbȉ+Yz,= - 87  j׸ޖ)u“7YֹM}"U - 87xGй;u~6>Zخ/C ' - 87 m9Ϳ?uq,:12 p , 86 @^(m9;>ur-:A3:H 6?q0o;ͽ=ur-ABfS*9i*)Z$ސh׭3vs-H{{H3 7ܿSl۵FPʽwpm,?`,Z8Fʤo2=d}DJbc`: DacW!.U,@TKcKh,@ދ@nV 0tw8 !Koϻp$3Z`1BpyO;V]I<31>WouD88  DgJ! ,8:538:2  << n=<< I<< ;=<< 8<< 8<< @<< B;<< B;<< B<< B<< D<< E<< ;<<_             _PPO PPPPOM PPPPOM PY PQOg PQO_ PNK PNK PNK PNK PNK PNK PNK PNK_ s)-?5" -@ WS FcB<`[0 ,E6+B9(G(BB'J͵I Fʚ4.Nl`A.ji.Vyވ&ޢm4JTHIή7~حvh6Gf܉:@lCϮ7}Azg&1;XՌ;@g BϮ7} C׹H4;WՌ;@g BϮ6~} 4@=Z׋;?f CϮ7};`{:h}7@܃A˾`~|לpuԾR/=sR4׺w7dbS TcbHDR'Zc16aca[0PB:Y^0 #T derecha copia     b:#N#^                                                                                                  .Y "?g֢2[O@5 E2 JQDf# @}pW %bҊp=  ^bo  ?sQ Zlې6  )^k! )w{w [ze& bgX [uw7 d֥˫~OC& {}wO,R &92$!ij  jm S( K<XTdoRv8q!G ]͹u( 6"KCo  Vj*k" "hin     o""'          [          [          [WD< b [O g@5 g  gg%ZOVP-d4Q~\ pK͇&,* ]u4Ґ-ԠuKKs|0ȹ/g謖}THg݊ ߛ9  K60ȹ/gH 7RFV 0ȹ/gb tqp 0ȹ/g-d׀ fx0ȹ/gUk fx0ȹ/g|Tg fx0ȹ/gyTg fx0ȹ/gyTg fx0ȹ/gyTg fx0ȹ/gyTg fx0ȹ/gyTg fx0ȹ/gyTC derecha copia     Bg                                   >lT %(+8AFYoS$0I[gvƖ\# *\㼉L2ćF5t<~w:J{5o3 ԋE h˗GhҪ7 7o| T Y7$~*Bה: p12 n|$ ^%@І86/ VȕU Lr% `hHon _ҙmך LX  (bW1lient     Xo 11!!!!      )         !  !  !  !              )                                                  !  !  !  !              )                                                 xjI˵/ `WbA tb̈ G, }g͉  }g͉   k͉ QC *Wy|V* >P' Szj7HddV͉ .gعl]Nn$ƭ͉ 4ױ#{΢xhuxԜtRUWLjj\͉ 4ױ# b_ Vc ޜ<oߞl͉ 4ױ##a <Ƶ+;+; }g͉ 4ױ#F޲?&UR }g͉ 4ױ#rw v] }g͉ 4ױ#{ѵ__^ }g͉ 4ױ#r| \^ }g͉ 4ױ#Qޒ%\^ }g͉ 4ױ#+I#\^ }g͉ 4ױ#}ݣ3  +؈\^ }g͉ 4ױ#(ҶxMAJqؚ2\^ }gÂ1ͨ!$u,W}Y wbB`@eR?krHG_+ =a,:c0S     ^: &''"`````1`` ```````````` ` ` ``4`````1   41   4+\Ʒ`/'pӵ; Fb9㺞dm7##4\@C2 * ii A5{CLw\O~b) [.,h7  T濜zR2 gqA  2۵p3 :lH ,HmW  3U8  Qph:Wg +)GIW5 "o9 vw Z  5A&t( Uj.<uV! ,eQ$~ҩ~gbjflM 6۱m,;g[.# T derecha     6 /y#/#/                                                                                                   "K~.N׮ $D{n 6mX  =O BJ?ڃ7  ?|ip .qΉoJ  )neu& PgV /z}sٌ:   Mgd 8gj 5u}v 8gH @ͦZ& ؾӸf9R }zZ8 zs *- ٱ`  ilj3Ng  lhCިy)$ߦO bêw (uA1U 7x ? H#J 49T     E6 4A494U494e*( #!    ' ' ' ' ' ' & % % %$$% % ' ' & & & ' ' ( ) *++* ( # !                              ' ' ' ' ' ' & % % % $ $ % % ' ' & & & ' ' ( ) * + + * ( # !                              ' ' ' ' ' ' & % % % $ $ % % ' ' & & & ' ' ( ) * + + +4]' .Kmҷ$1S!8bKFyO7i> aڇ4 eu" &MJ,WO!US=ב6 Cp8yj!Eف>iݞ> :{HQ{. ,eVDRYn>|Ӂ4  @C]e  )fXIFOn:z#jAXR!wTK17Wu@~>(ouHV[0~PK:إvCxc7|Ia94{ٚC>${Ƒb-cpΫ|V4 *zfxynM2 AU BaR./,RΘu> g͖y^ &sѦI &a|a& Ezޠ &_s-& FxE& K_% dy%T$B($+$%ړsQ% Pގ}%ܑ}4%{ّ~V&?v~&g{%T:&Cc &&>0' RS'hy()!y(*q%+XjOperating System     <<JiJu<BVH`)` `'` ````````` `;`8`8`9```` ``7``=`=`` ` ` ``` ```` ````` `;`-) '  ;889 7==      ;-) '  ;889 7==      ;- F^W0)?$;t#Y}4 &#M c9vZ@HsM )]4ce[ /; '+ *- '**  7h  :v1z`\?XPKbZ`^ HNEv%K7=j]* k+ʥaaxc[bÄV.id]~6;˦f+]'Q:w$ oT =|%"e;H C' ^ĵ1 8h ['Q<&&{[ZZ[op't.|1*]['"g/  g9ӭl,v Z1*]['[Z !q3H557<$q" e1*]['D uFH =vf?%W'q\T 21*]['3^. &H~eזL%%F7 ,C$!E4q+S(#Aɵ1*]['#sIqE:@g.}|,&US#9]niK*>ekQ) #MhmO+ .# HhjH8 12 , ~    x: E<,``"`` ``` ````` ```` ``+`````+`````+`(```&`````#``)`````` ``` `` `````````````` `` ``"    +++(&#)    "    +++(&#)    "OR#  ?,!1H \ ]V n ,& -! %u&>  )  .y)+ W>p]m4hH f?*p9.N Nȕ3 CZÜx]s"^gpC.gAlyv>}̰m% df^~{m r1 ^Y &sZ@ LHo/ .y).U"EN)}?p 6U Q2\o^҇]ZZi} ;T9]+n+.U4x12oxڮv;T5h6o>\&pTC#eosM6557=v;Tx3vs%Q0g Z _6oHN Uv;T :R4=er9s0*oF+T ;@+x+oO$">|l6M9ulTe"yve*N$3%u8L;7X4*L36Q4*L36Q4<L36Q4E.1I/529H$ C derecha     ,9K'K;KK                                        #M}N &)-:CI^uM  5Nbn}ÎS+]仇I2ȈE<o8}>H輂9{z; R u"ܬ\rῪGDSfL'& ]+)j OQ "H  FXkӝQ  !`sgH) 6Ͻڽu *ۡU74 BYi Cֶ݄-f|5Xɍ5 ,2C     e8Oj,2O~,2O" ##$""      ! ! """ ! !  " ##$""      ! ! """ ! !  " ##$""      ! ! """ ! !  # &Cs 5Ss[  "$$)6PkӮm1  &-15=HRVX`s֣_.  #=Wg|k. -XΚ]&aϛW' 0ΒS$ 0ňI  ȑP ^ȌC %xBQɆEєHZ"{2 E1aͣSβZ_ᯆu69a{ Aq~ Wz N ( m& <2!;!Zۑ=!%͝*! Kp!l:!>: !t@ /U JѐJ vƎW(GUfJ2 3ꤗѳ[/ ?̀8E Ty2#IuN b^4O܌ WĀK_QuhQ =sDlTɑQ teclado y torre     0 VvV\hV\b&7/,&&" "%$##  !#&&())*,,...////0 1 00 2 2 3 3 27/,&&" "%$##  !#&&())*,,...////0 1 00 2 2 3 3 27/,&&" "%$##  !#&&())*,,...////0 1 00 2 2 3 3 26 !.B0 4Lb{,,C\{('Kp& P' <u,)-S){D *;9 ,yG ,1W -Pp-v%.!I.7/X4/|_ ."/&J0C|0 h10V132R82 q\31<:* $ !      #  & ' , 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 <:* $ !      #  & ' , 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 <:* $ !      #  & ' , 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 99; *o4 '/. &/8ESat|dF$ U %3=JZi|ŵ[>) ) (9K\k}ŤcC, j +>Snϰ`?#  h4^|sO4 Yj ѴnH' I1ؽwW84a ҩS5!(ʬa; #SڽxT4%oX6 )Z@,My 2=21R2&111_ 1t1Z30NW0F05'0(G0!r0011w1t1o2g2^2S2I2?2;2;2927292;2;2?2J2VſԸǸǹ 򳼼     ʹ Ⱥ ؼtٻt ˿ ! !     Ŕ ƨl8 ­@YU4 ɼ  0޶11   ˚, )JK> ҕM,2VǷ~ ѕѕ ܻ֨ ٳɎկ͜ǾѯⲲদnje!͖ۧT&٪ƌ@ͮ󭵲JF " ҕM,2VǷ~ ѕѕ ܻ֨ ٳɎկ͜ǾѯⲲদnje!͖ۧT&٪ƌ@ͮ󭵲JF " ҕM,2VǷ~ ѕѕ ܻ֨ ٳɎկ͜ǾѯⲲদnje!͖ۧT&٪ƌ@ͮ󭵲JF "HR^lz%4BLMNRUTTSRPOONSXY[_`eklqx0H]n #/>L[p  $-:FUgv  )5BMWblv !(/6 -} -G - ,> + + W*0))]( T'J&8$R"W!"lE8)h] )^l)at ;n{)Cp] /LsG   -Mpu/ .=TjƍB !1CRg}ʔO"lÀJ!Фj= #ɪ{Q+ Ǩ]8 jI. lK7& ɿu^SD,  yuusnhbYOFB<1$   ({ '^˔ "Sט<ޣ}߬ɘԗ١  ۳ oQ޿ ҷӨ n 뾁I# ̽? uB_+㸖. `, Gfr -' K aè  l⽤  #J_e羭 U`uɾ ȼ ֹ  Ċ[- l@*0> a>/3Jz Wn    ݪ   ڭu m3%Ϸ5%&7٣7ˠ7ͯ ' "&Ϧ ,:S&\6* ˢ%Y?  Ы& ׸( &(?]ry&d­ٲ&йџ&͛&Ш&ھ&&ڬ&oD"&ԾI6)&γ  %ǧ  (%ß )Nqwf%Ѿ_d|Ò% ¡%Řqf ͺ '^˔ "Sט<ޣ}߬ɘԗ١  ۳ oQ޿ ҷӨ n 뾁I# ̽? uB_+㸖. `, Gfr -' K aè  l⽤  #J_e羭 U`uɾ ȼ ֹ  Ċ[- l@*0> a>/3Jz Wn    ݪ   ڭu m3%Ϸ5%&7٣7ˠ7ͯ ' "&Ϧ ,:S&\6* ˢ%Y?  Ы& ׸( &(?]ry&d­ٲ&йџ&͛&Ш&ھ&&ڬ&oD"&ԾI6)&γ  %ǧ  (%ß )Nqwf%Ѿ_d|Ò% ¡%Řqf ͺ '^˔ "Sט<ޣ}߬ɘԗ١  ۳ oQ޿ ҷӨ n 뾁I# ̽? uB_+㸖. `, Gfr -' K aè  l⽤  #J_e羭 U`uɾ ȼ ֹ  Ċ[- l@*0> a>/3Jz Wn    ݪ   ڭu m3%Ϸ5%&7٣7ˠ7ͯ ' "&Ϧ ,:S&\6* ˢ%Y?  Ы& ׸( &(?]ry&d­ٲ&йџ&͛&Ш&ھ&&ڬ&oD"&ԾI6)&γ  %ǧ  (%ß )Nqwf%Ѿ_d|Ò% ¡%Řqf ͺ!G> cQ6,P jH@~j rBGXy;Q ;#~7[ !70f  N+n ae 't;%x'{ y* $R= !!6V $u 'h ){C +n '. *\ G 'O |` &EV} (1? (*& ,5 0  qC 0gL_ 1G4n 1+ z 1{ 1Rl' 0(T7 0y@F 0E)O /h /M . s -Y ,%@ )%0 #&$& !&- &w@ & `S &I` &?f %&5h ,&&o 0&y 3& 5& 7&;& zE& !qR& w" f]& t" \f& t"Xk& s"Vo & r"Nx & s!A & s6& u/% x +%  )"%v '4%g #A ><=<<<<< ><=<<<<< ><=<<<<< ?=<9< u<<<N<"]R6 %  ̺& ˽$"=VZ. $ku ؀# Ɣ# ƫ" ̷"ޓ ʷ" " ! !ѿ 黫 ޴ εܵF龟X3 ֹD, ɥ 1E``۶DZƶ̠кۯײɐ۸ָԶϒ弬Ш̱ҴȪȱͨίո Ժ 󪩷л ܯ ê  Dz!ʪ#Ϣ%ؽ%ĭ'ʬ'ɻ)Ȭ~z+Ȳ_Y+꺚ޱm(걬㞔&ܣڡ#񷽼ľÿԿ繱ҹѿü庲  ). ƻ"]R6 %  ̺& ˽$"=VZ. $ku ؀# Ɣ# ƫ" ̷"ޓ ʷ" " ! !ѿ 黫 ޴ εܵF龟X3 ֹD, ɥ 1E``۶DZƶ̠кۯײɐ۸ָԶϒ弬Ш̱ҴȪȱͨίո Ժ 󪩷л ܯ ê  Dz!ʪ#Ϣ%ؽ%ĭ'ʬ'ɻ)Ȭ~z+Ȳ_Y+꺚ޱm(걬㞔&ܣڡ#񷽼ľÿԿ繱ҹѿü庲  ). ƻ"]R6 %  ̺& ˽$"=VZ. $ku ؀# Ɣ# ƫ" ̷"ޓ ʷ" " ! !ѿ 黫 ޴ εܵF龟X3 ֹD, ɥ 1E``۶DZƶ̠кۯײɐ۸ָԶϒ弬Ш̱ҴȪȱͨίո Ժ 󪩷л ܯ ê  Dz!ʪ#Ϣ%ؽ%ĭ'ʬ'ɻ)Ȭ~z+Ȳ_Y+꺚ޱm(걬㞔&ܣڡ#񷽼ľÿԿ繱ҹѿü庲  ). ƻ"V J%G wX$&4 jp $3' c$B Y$d G# :.##s 58"9Q ,E"Y: X" ~% h"} z!=V !m1 k( Z6 <_MEy,3T4 j  lE* r%eJ g5@}PQ 7X$ Pdy %m|K  6#! C-"lf8$1'pX%i+r%' 9'0J<)DJr+T,+ Yg ,J2*! M(98z$%H~' "-BZtk]&!-1+'!   !'))-3:@CL\p{ ˙}ꓔ +.̽~eWD2GĽÿỵ~wnaTKE>1'# "ӼДץÒϮƞֳĖ߹²ȺýĻƼ̻"ӼДץÒϮƞֳĖ߹²ȺýĻƼ̻"ӼДץÒϮƞֳĖ߹²ȺýĻƼ̻":f Cu &X (l<f1r5uw݄/ <ܓڧb!ܽf2nR5 ( e\2.mXlcd     6"mX,mXH0i:`6`1 `/`-`)`&`$`!` `"`#`%`(`)`*`+`-`.`/`0`0`0` 1` 2` 2` 3` 4` 5` 5` 5`6`7`8`8`9`9`:`:`;`;`<`=`=`=`=`=``=``=```:61 /-)&$! "#%()*+-./000 1 2 2 3 4 5 5 5678899::;;<=======:61 /-)&$! "#%()*+-./000 1 2 2 3 4 5 5 5678899::;;<=======< 6 %3 %/8>E/ &09BIRZc- &07AJS\epy) $,4;EMUaku& %-6>DMWaku$ $-6>DNU^is! $-6?HRZcnw (1M_o  #/;KZj &2?Naq )5DUe{ #.=K]p $0>Pat&3CSi| )6EWj   *8GZn #.=N_v  -;Lat  -Sj(4H_y) %ASl*4K`z+ '>Ul,3F`y,$;Nj-.CWu-6J`- $;Og.+AVn./D[t. !2H_y/&5Ld}/(7Nf/*8Oh/*8Ph/ *9Pg. )8Of/ (6Me~/&5Jby.&&<0)'&&`aS<-)'&& `O5*'&& `a^E.'&&`]D.'&&`]I2'&&`_U@-(''&&`]T?4/-,++*('& &`_YRMIGEGF:-'& &`_^^_YB-'&&`Z=+'&&`W7)&&`_J0(&&`Y?+&&``_U5(&&``^G-'&&` `V7)&&'&` `^G/'&&'` `_U9)&&()`!`]N3*('(-*`"`\K:227Eb`#`\TMLS]a`'`a`````*``*``)`*`*`*`)`)`(`'`F){F# q7 Y'X'd.O#}M3(#  xkc^[^^A#򗖕T"F:e)J6_$ 9 ^% ~?!m1$!fB0/8Z"}ljz#&**)***))(' ¿ ǿǿʿ  ƿ ſĿÿƿ  ǿ !"#'**)***))('  "-1' %0B^{Z'  ,Fe{߼r54S|r,    Zo  26  :N&,/2323321.-+($ "2k[.5;@DFHIIJIGDA>:61-/@WcdbZK@Mu\KRY^adghiihgea]YSNGA;640,&+gZjqy~{wpiaYQG>5-%4xcul_TI>3)!Av#ϩĿreVI;0'!Z0ȿp`OA4(7?ŸxeTE4)"YK Ⱥn[F8*1{R pZH6("PT ƲnYE3' 4~UǴmUA1%'RJ DzfN=,$5z|3 Ǯz`J6'&>]a:ֿoW@/$ "η~dK7( ɯv[C0  սfL8%ɭqU@+ ԻbJ1" ūlS9' ζw\A- ׿eG3" ȩmN8&ϳvV?, Թ|ZC/ ٿ_G2 ŧfL5! ɬjO8#̰mR;% ϳpU=(ѶrV?) ҶtX@) ѶuY@) еuX?) дtX?) βrV>( ˮnS;(ƩkP9& £eL7%ջ`I4" е{\E3  ɮtWA/ ¦nQ<+ ѻhL8( ɲx`G3$pY@. ӻjS;* ɱ|aK5' sYE0#ϹkQ>, ƮzaI7' ϻpXC2#­{dM:+ ηoYD3&«|dP=,! `_^_`:`WF@ES]`aa`4`H1+)*0AU]^`4`,'&&'+4BFJMQTWY[\^__``bccdcca`_]ZXUSPNLJ&mI  #'*-0379<>ACDEFFHIIJKKLLKJIHFCA@><862 (U£_$   "%')+-./012345565542/-+($"1IY]U>    !!""!          '`'`&`%`%`$`$`"` "` !` ` ` ``````` ` ` `"`V''&%%$$" " !     "V''&%%$$" " !     "VűlVD3%ɷu^K;,  λ{fR@2$ϾjWF5) ѿp[J:," p^K=/$ r`O>2&  ξt`PA2( Ƹo^M?3'  n\N?2(  ĸyiZK>2(  Ĺr`SF9/% vh\LB7,$ ºvk^QG;3* ½~ti]SH>6," 潺xod[RH@8.% 蜙yqkbZSJC;1) }xtpje`XSMF?6,"d`]YVQMIA:3+" GEA=93,%.+#  $W6,+teclado     +++(5B  )+۰U Gr ᜨƽ׳³uG6Ijڭ°zihsƻɿƦlgzԱշv^ּx|§~{Ь˰yyڵӾ¬svϽxssve"Ĭ%;&®'ȼ'Ҿ'ȱ*ƺ)ͼ+¹+̴,ٵ.ɼ.ƥjh}0ϵiF'1wP23 98 ?OR5;kɶ3 G{Ơ2Uٿ0^Ⱦ-ue1)أH='ˣr`ʹ˾ƫ"ӑ׸pkĽ@ "lժݻh[l˴_+  "MΐUGtS) 2k亮K)d ʢrI$ !Jy M̨wL(3` 㮱ƒ`9 6i5B  )+۰U Gr ᜨƽ׳³uG6Ijڭ°zihsƻɿƦlgzԱշv^ּx|§~{Ь˰yyڵӾ¬svϽxssve"Ĭ%;&®'ȼ'Ҿ'ȱ*ƺ)ͼ+¹+̴,ٵ.ɼ.ƥjh}0ϵiF'1wP23 98 ?OR5;kɶ3 G{Ơ2Uٿ0^Ⱦ-ue1)أH='ˣr`ʹ˾ƫ"ӑ׸pkĽ@ "lժݻh[l˴_+  "MΐUGtS) 2k亮K)d ʢrI$ !Jy M̨wL(3` 㮱ƒ`9 6i5B  )+۰U Gr ᜨƽ׳³uG6Ijڭ°zihsƻɿƦlgzԱշv^ּx|§~{Ь˰yyڵӾ¬svϽxssve"Ĭ%;&®'ȼ'Ҿ'ȱ*ƺ)ͼ+¹+̴,ٵ.ɼ.ƥjh}0ϵiF'1wP23 98 ?OR5;kɶ3 G{Ơ2Uٿ0^Ⱦ-ue1)أH='ˣr`ʹ˾ƫ"ӑ׸pkĽ@ "lժݻh[l˴_+  "MΐUGtS) 2k亮K)d ʢrI$ !Jy M̨wL(3` 㮱ƒ`9 6i8 , !&).9?DKT\! '28BR^fn #/FT]q *D\m -A`~;tm:]ŶdYK6*% B ϹpVE4  &SnS;+ Qؾ`C0 Bͭ_9 3zդpD%#Zh.& 7ɂ>'SP(U~7 ( qT)z~4 *je* bE+84 +ـ--O{.܄&/D#0r*1Y 23|3sp 3H3$/2 ]%0-;/ Xf(.{律V3 ).ӮeI6#$0ɳoVH<0&"   0snlhd^[[YNFFEFLNNQW[dlnowL%Iq 4H]u  )5;GZcj{ O¹û֩Z l ߽z8ԩp@ јd3 /VڬqB!4Pzܶৣ{99\$ɶƢm+L+ٹz0:78uԣž*릵ܨ\ҩ鶢߷缭w7 `԰ѯ׷z8 KپljF (V Ϥf5([ њc2%W  ߶L/aեp8 2f˶Νc0 \ܿϳO¹û֩Z l ߽z8ԩp@ јd3 /VڬqB!4Pzܶৣ{99\$ɶƢm+L+ٹz0:78uԣž*릵ܨ\ҩ鶢߷缭w7 `԰ѯ׷z8 KپljF (V Ϥf5([ њc2%W  ߶L/aեp8 2f˶Νc0 \ܿϳO¹û֩Z l ߽z8ԩp@ јd3 /VڬqB!4Pzܶৣ{99\$ɶƢm+L+ٹz0:78uԣž*릵ܨ\ҩ鶢߷缭w7 `԰ѯ׷z8 KپljF (V Ϥf5([ њc2%W  ߶L/aեp8 2f˶Νc0 \ܿϳ%*-=MYipx}ӵzsh]F0)$ fuſsaXSI9+ ̾ſꝨgZNA;962/(&""',0368;@M[dmp~  $(-Sl8)=:x+ &-:M[ "*1;Pht~ ").17CPX^dq %+/7?FQ_lu "#'.8?FJLTblw}惋$λ*ɳo[C,  ¸ziQC1 Ƶk`O=5,0" B|μ·.Rzɷ{ƻ˻Ŷ Լ ù϶n% ܚ3 ~> ¾|=첳Ł><ΎM.T稩̷m"6[ھo&Lyr'e!tSȵɪºιĸŽο 㸾̻ ﵣƱ ƟƼſķ  ³Ͽƹ¾¯ȼ Ǿ°}0" B|μ·.Rzɷ{ƻ˻Ŷ Լ ù϶n% ܚ3 ~> ¾|=첳Ł><ΎM.T稩̷m"6[ھo&Lyr'e!tSȵɪºιĸŽο 㸾̻ ﵣƱ ƟƼſķ  ³Ͽƹ¾¯ȼ Ǿ°}0" B|μ·.Rzɷ{ƻ˻Ŷ Լ ù϶n% ܚ3 ~> ¾|=첳Ł><ΎM.T稩̷m"6[ھo&Lyr'e!tSȵɪºιĸŽο 㸾̻ ﵣƱ ƟƼſķ  ³Ͽƹ¾¯ȼ Ǿ°},$ #|kXG;4) ŵr[E- pW0 ǰlJ- Ы`9 ޸d3 ėa5OlԨp: 4Tr v: %>]~ l,  &=Z ٗF  #:d k$ +Qy ׈& 2X #0Y OXQ 6,TFwu5dC 5E6mA  /Th 3T{w= +@`F  !  ںd@$ ˰cA&϶tP3ŬpS6 нlO7#sT9*!V+ Fondo     ...  - = M ] m }        ! !(()(9(I(Y(i.4;NY^_][XUT.BY_XT T,9Y^TT);\YTT&W[TT$9^TT"@_TT ;_TT(^TTWTT;]T TYT"T+_T#TIUT$TXT&T^T'T_T(T^T)T]T*T]T+T^T,T_T-T^T.T XT/T IT0T +UT0T _T1T YT2T ;T3T ]T3TWT4T(T5T^T5T;T6T_T6T@T7T_T7T9T8T^T8TT9TWT9T[T9T;T:T\T:TYT:T9T;TYT;T^T;TT3B3F3J3N3R3V3Z3^3b3f3j3n3r3v3z5+5/53575;5?65qU=) /q= ,q-)a'y$Q"= =Qy) q"5#$u&U'=(-)%*%+-,=-U. u/ 0 0 51 q2 3 )3y45Q56=67=78Q8:y99:a::;q;-;=<q<=< <===q=U===)== =} )=Uq1 =q,-q)a&y#Q!== Q"y#)%q&5')u*U+=,--%.% /- 0= 1U 2u 3 3455q66)7y88Q99=::=;;Q<;y;<<a<==q=-_q= qU=) = ==)===U=q==== <=<q<<=-;q;;:a::9y9:Q88=77=66Q55y4 )3 3 q2 51 0 0 u/U.=--,%+%*-)=(U'u&$5#q") yQ ="=$Q'y)a,q-0q= 5qU=) -=q=<<a<;;y;;Q;:=:9=98Q87y6)65q4533 2u 1U 0= /- .%-%,-+=*U)u'&5%q#)"y Q==Q!y$a&-q) =q- )=Uq2 )=Uq =qap?8tcos-0.89.93ubuntu2/images/prueba640x400.jpg0000664000000000000000000025775312260610261015203 0ustar JFIF}}?ExifMM*bj(1r2i}}Adobe Photoshop 7.0 2006:05:01 23:25:35(& HHJFIFHH Adobe_CMAdobed            P"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?I%)$q h$ԤZT}ZŐ:f[Ittqc8{Ak voc~NԬ>:uNsǦosYI$RI$I%?_WNOKxԗ[s"ͣkg8a7*ޕ:Q&iؙ #umv6੥2M?9dadD}Ttv|zgK?X:9-˱̡E_vSW=mŸXC^G6=uGf="YC^[KZ WjOͫ81MuNxͮ~p8b.KYg<^08SNBŌq{r<5~_XŤvh-W-PӓԲ=Nk]c3AwPmiuV{;)6[99ZD&+SPюRr c"}pޯW9-x}wUuU sM,߬n -5}NʶmW:>NvUYqfkXw }W^kzH¿LLHez4],zs-}paZi5V3sk~En~-ϳ]ctD2?67UI%'ʓMeoqѢjrԨj2E>eNͶOU,,JSs5ګ};? tΰˎ#,u){_ vWVOVR7,<""DG`eVU,{;zcS_et ;RwD̩rx_sf71g_wqK8fهY/}kgOc{}Fz_/=<@-V=7їRKO_,F8SIL mO`Xӵ(e[]6UB{ZI k;ݵE Bjd?sjfpk[ca$4nsY^vַRJ=Gf윗CAtyUtK[:Kv˺L;cXܧ2kAV*L9N&o*kYߖ=?/Zx3}4e}K[q6*i9_uǪw{O(YԺ#kVUlO'--s/=j'# euLubIɤO|2voF8~5X[@5nE}Uz]M+u8zv}_f_{//7}['U+5>V[t㽶fNa/S+9Wg>N{,`q_08x/TGbl |ut7ךeӏWӰoy!ֹv M{/ƹd17]cM~7t_I~&^+S ^~[_'N =BGQ/YN8v[{(xm~}5U{W;7luS@~/M{NK(kiWzϷ鬊a 4?!S>:{M4Z1ϯ'K\\r.}~lbDz ZI$w3cH WZN+,;1{-huԽ7{?}Rɯ)vUVMa-kv[wJOޅҚ@u{6hqh;K9Sbڰq\_.2Ou3~l,@F:p#1wn TWHg3oV̳ԹbKh1?G%̳e_bsyuo``0:ͩ37_f&KV[%%f~{.e܌%պK!!mkWRFT!8⁗֘3uu MnȭkUz̾M. n?Tsh` {D1n.rF5B^J@pozߓ΃ըy/Vjٍsw]wmmk71NgRoƢ?7RIOIO]=GGRCǠZZjc=g떢7/W]=w%H<6W_z2-7j?]$Upޫt^_;6.kc%kK{:ת}[i]KTdӎ7;nzxx߳:RN Τu/i}k~,<<q+ݳ~'=Y={Vr,[. 527? O-_>6->jً]:ư.n-IH~jUn2pCy,~3V׽m+TzF=YFmsOѶ}ov[}_,RWKEߑkȱZ/8=$ $JRI$I$I%)$IJI$RI$I%)$IJI$RI$Photoshop 3.08BIM%8BIM}}8BIM&?8BIM x8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM(8BIM@@8BIM8BIM?logo9nullboundsObjcRct1Top longLeftlongBtomlongRghtlongslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongRghtlongurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM8BIM48BIM -Px JFIFHH Adobe_CMAdobed            P"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?I%)$q h$ԤZT}ZŐ:f[Ittqc8{Ak voc~NԬ>:uNsǦosYI$RI$I%?_WNOKxԗ[s"ͣkg8a7*ޕ:Q&iؙ #umv6੥2M?9dadD}Ttv|zgK?X:9-˱̡E_vSW=mŸXC^G6=uGf="YC^[KZ WjOͫ81MuNxͮ~p8b.KYg<^08SNBŌq{r<5~_XŤvh-W-PӓԲ=Nk]c3AwPmiuV{;)6[99ZD&+SPюRr c"}pޯW9-x}wUuU sM,߬n -5}NʶmW:>NvUYqfkXw }W^kzH¿LLHez4],zs-}paZi5V3sk~En~-ϳ]ctD2?67UI%'ʓMeoqѢjrԨj2E>eNͶOU,,JSs5ګ};? tΰˎ#,u){_ vWVOVR7,<""DG`eVU,{;zcS_et ;RwD̩rx_sf71g_wqK8fهY/}kgOc{}Fz_/=<@-V=7їRKO_,F8SIL mO`Xӵ(e[]6UB{ZI k;ݵE Bjd?sjfpk[ca$4nsY^vַRJ=Gf윗CAtyUtK[:Kv˺L;cXܧ2kAV*L9N&o*kYߖ=?/Zx3}4e}K[q6*i9_uǪw{O(YԺ#kVUlO'--s/=j'# euLubIɤO|2voF8~5X[@5nE}Uz]M+u8zv}_f_{//7}['U+5>V[t㽶fNa/S+9Wg>N{,`q_08x/TGbl |ut7ךeӏWӰoy!ֹv M{/ƹd17]cM~7t_I~&^+S ^~[_'N =BGQ/YN8v[{(xm~}5U{W;7luS@~/M{NK(kiWzϷ鬊a 4?!S>:{M4Z1ϯ'K\\r.}~lbDz ZI$w3cH WZN+,;1{-huԽ7{?}Rɯ)vUVMa-kv[wJOޅҚ@u{6hqh;K9Sbڰq\_.2Ou3~l,@F:p#1wn TWHg3oV̳ԹbKh1?G%̳e_bsyuo``0:ͩ37_f&KV[%%f~{.e܌%պK!!mkWRFT!8⁗֘3uu MnȭkUz̾M. n?Tsh` {D1n.rF5B^J@pozߓ΃ըy/Vjٍsw]wmmk71NgRoƢ?7RIOIO]=GGRCǠZZjc=g떢7/W]=w%H<6W_z2-7j?]$Upޫt^_;6.kc%kK{:ת}[i]KTdӎ7;nzxx߳:RN Τu/i}k~,<<q+ݳ~'=Y={Vr,[. 527? O-_>6->jً]:ư.n-IH~jUn2pCy,~3V׽m+TzF=YFmsOѶ}ov[}_,RWKEߑkȱZ/8=$ $JRI$I$I%)$IJI$RI$I%)$IJI$RI$8BIM!UAdobe PhotoshopAdobe Photoshop 7.08BIMHhttp://ns.adobe.com/xap/1.0/ adobe:docid:photoshop:2168d4e4-d958-11da-ab42-c6987e71b5f7 Adobed@P    ! 1 A"Qa2B#$q3b%v8RCScu7:ᒲ4VXx9rD5EU&6'()  !1A"Qa2qBR# br3C$ђSt68s4%cvғDdUu&W ?0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0&?cJ/}Lx{SU CxLOd,1`Lw%)~d[_5W:Ih3t<aj*#K~amV]7\=,QēE@JRnOc9vF `i+68(_H!X~_I![/:NC %+f˙J⡊!|ys*g)V#E )}~^8=:묶FSX6A]HO\[&><7P&v(n = tIAma%Ec3]zZը5 nK <*:sϝ(" K ܭ*i(Cg` 0` 0` 0` 0`0` 0` 0` 0` 0 C\zե1@X6tf5{_Eoيrm)a.6+a!D41Mf) r>1s1sLsD1<0&1y 0;}Q#7սI7 W5;Q7`HFȮIH`({]=c:I굦^1kq* F:r~"Ɏ@f_W,0` 0` 0` 0` 0` 0` 0`}g^߮"T=تNZ9l=y%;Sf_}ř%}zځ I7d#"_|ۉ0nsw^Hu-LɌx-Vfc}߲yRƎ[{OӖ͗bM9]bN;>ϕ(j?OdeA(_-P3T"3 U?<}3.c4+tAT+[C䱀0Ħ}΃BH]qͶ7ͯbXTD֩n*Gl[BPS-uLxݝtl{ZW7rKTkTٌ bw<#|x4#E_1)sCE c1sLs&1caDGGp` 0` 0` 0` 00` 0` k9vjmY fYʢd3:d/5|#0=S@tV4Q?.[Nz TGʁ!2̏hfGg[MǑ¡IZeCR4Կc9{w* LFґp\nQ :>%i=GE'׶q_4Tʄr<CR? nMcy4Ui_@m; ǩߵmm"ASIӃed|Ձv,H׏MMQ2mAIQu-3:?Y8e׾S dkui9FYR<=s?^Q [Gá4l+q^dhUj DW&sN)8mе0~d` } o[ursEƊ#9)->-/:m|H^Wco]֢ oCvNeJ$S)h=83Q/  +6;ncTt_Od?Y,V fѫB@LF$L "m6ӴmXشMP6&#-}[g9q)+].匳$ DST(N<}Ԃ>&Ob(x{o`6^QS,Q &Nݤ_$5׭vζ_O] ޮcF`ƕ%ZU7X5( OdI*ny8on)܇n# !f+jRا׶5%z2\Րף>Ϻͯt:\ʽtb`hҷ S Ʃ*FȨTH4LE0y9Y UaWNȨR2կ˭jE!QZ]Cyo 3sΡv"nT!7T4QEbhn TefpO2s!Z g?;dnlmXM7j&];d[%(z8v,UP謊2jF(0r 0#KȉH@pɜ &cEZ:A`&QAU>n`:*  "0` 0` 0` 0` 00` 0/cAdNMwu&…dHyE#oE"LlM3[y2_o5]Q![Ϻ%l$TiZ+J)} ( y?eGL)`G][M$3-YTV 2RL%gB||@uc\z1l3bEv)m0.S"Җ-@  `])Z VW ZlBT#!2dJHE+~7oj"YU.T?ݼ~d#Mx:U]d#s\ 鬤)If޿tAuᜰt)TҶ[RP>)5vv8qHx^6s}~vqrɄ䖚t}$yfSFy=Qwg,_朌Xꕼ;6׵6LD@IsL{/0) |f8J2êh)}19G~mtvuc^،Zm/.~ }ΫյR1`kJ{֥nP=y\5)؇uUOw&[gYFf0(_C+\їj)-$xk2]S=ԓeDgz3M~Sn;cx4ҲOcrmGĘy`h>H=t4(Dx7Wyo\-itt2DzUtTN f5~͛d3vnj3"᳖.tN%9 SD48||{)9bt7.W:mʭAc9,iT=X`9~͎qt[f.EN؊Iظv> X͠hMp )&LCA u+[I=} U[BdVD;t1fTgY G}73\oAeuU߻ $ݾ]nU-)&P cWRkAhP'ɿu7+WFu3o)5ÒkKTLIQUZ&.0 m` 0` 0` 0` 0` 0` 0 9~?/QuCK~})=]MnI|:1C`0q=g~dDs%,.AH@QH}AYr[Bp}>__CK^Ms*WAJdJeJ.ASq锅Le _clmal*NGi`R>`ĥ *yUmB*F)I. (i5!)A}{sVd~쓽f՚!e#In[MAE/#}DG3wL, z0hZa+RQKKB7*HUVTSA?7o^91c=rѕREsV~QT_f=@x er]&C3ǯl!^$C2Uhs`<@9뤈_1fˤCP(rqlYrKW|x>0G/^$)js!ϧ{Cz?ʚ6Te5t'ȀveXE[zԣBt^?(J9 ˔TAw3cM}CL(Zd}yGyhY(nJ OQv)UMtr*sUw e9c:Q>l0` 0` 0` 0` 00` -%{;H&6S+4u}/%1* efLYMG8Q&ڤ(I?/֮CUokbj] i.1ĚJDA7 kܲ&ifEen+bfcz~tmzO3{9]Cʇ9 vv='}}֮& c>=WWLț1rI-[V{A7іE2ݸLU}fu_P+ t0yFLc7l~Jᯠg̨MԧͲHФ5?mCU l};wc2Lp)ϓxOUzxyHT:kxt85yѼbʜ;朢_d>ȢϑOԨj7R ʉ81cpOF!Z>g;}*_>jv2(c}8Ȗw!RrWݥIK 6H\4/GG<Drl{s+$a$`4qIDKԥ?߼]f3"Y\&~v\ƵEel$䪫 i$Bĥ>n^-f¬X-e9F1_l&_{eG&tkWO\V,=X]ٳ6W;"m?6F mj7.ͶfJgT VT!yP@` M0rcyӒ/ekp]pM%(ݺo_Mql|Ŷ(JyynKV?gjr]{*dqyM) 2g@Y0PA@7o\l<7c2qkXȩ{v̽SiɎ0_6\Gm{۝n<3;-CRuͦ.K\ԟ"8~GD RhRhf)hO23+DA*74)s>TC9bm5Gmo.8ywF\]_{~BG-`daޙrqΣ uLH(@o䘙,گǺqtkX_&Mw[aNT']'=#8'?x(q2ۜ^iٷEt"9L>Ji2e]qL7Zw0Kz4 vԀk3:)A@94qܝoSjT{k"V \d/h%д;J{vmEs{"Bʄ- yPv'ª">T1m: VW-3ȂVat$ܤߥzf>&1 抅0C31rCD! %1LSC7PNZ7|z;<{6ZR:sH1# BJWlr PRM!*V8&%1<~u3~i׺Ʊ(/(2OnIl@DYZP r;0t4%\20 KC a+]& NA8Yg ]?,^&1IX$`  DD??W` 0` Ѵ& Ҩv)I&!<~y0}D=x2źrmeOMS_ݬGYaxA~gcI*x_"%lǎYK]'p߸Yt'UgglxSHɍ(9cFہlHߢZ& ?uܷbp*g|VWV 0<$"1ᚳfrL\jVธ0ABQ0fM۲r30q𥏑8RpkE6F˳qS|U:ͪU^BIwNMJыթV0` 0` 00` ً "Zg`[~تh-g ̲w+s]# U  >@;ݤ~9zx~#Q(gb.Zp`"SP0SɚK[PPB/r1vmP"'R~zu~,w'?$[Sݡ*KzU8nM5)ӀQV(inI.Dȗh~06(μ r=˒n5uܓdܼ8mXN/f{}v?c{ %/ LY$RuKLs'"Q=/^ǧ&0ћal`ucִu0W(r˻.YYY3"OW)M&*v/}ןQKƣyoU?I*Th [Y̜Z=LS~=::` 0 Y&UÅ*HgUe8HI&:|qe9(%oKg_uXش̋$E9JR}V$ˤBlץjsvǐy#eLƚ{˸NAV"&xn93o~O%FYjI>Q.1(ĸ]u;57wJqN2(ȝ:.2DṰ,!)۩0% >5C 2aW:? {;ʄwk{=#D_W)X㞽="MI>5ݹ/cCIݺn5S/\uYlNS^YL'#dMo׽eGU:LGf2챍}Ȳ3Έs72M!pyVdgIwI NfXAjmF*Ri;.v3r2X2aRbZM|0_GTw|q*VxmW%N)y8)71+Jm[|Gle5*t_sw̹apD>I_s_ol~H54h??o/?j_??߿=y|/?>5q4릺ο]zi?/o'v~wnnC!BW68]^:*i(L( >^MDC8[Kvw4Umyxzt}z[[k_?p|6Lv t %h}ul[nō@rQeQm9]C.T@*)PT!tpIwvQK:+/CVMtOqRM-yvn[>RPK_Gi<)v/a6UoTjggBd|rBnmBDU(xP!9sȖzF1]eep]e'蓓I[ܝtWR[o1_)>^6#g\)ln]*v"s. R,A RB'x&N>bc=n&;VljR]}5#ӑ*0^BWۧ/y?Xj„8UG5wh87`< xu^Sk_|K_o~(|;7[z;{'v4o>)ƖBLW0{-dr.ɶo~(Qnd/{G|>4 ?4I'Ji75%t66j[͟[lZ֝*5 @=D r5G^7PrtTDH8kw6 x-W-5ޛRRg{n8[.dF+ /FQi8I+-Eh` 00`(TA%]u(C(ʨ`"i$QE`DDx ŇWLJQ:4L+R5$M-kj7=U=}>X5]b:YC,Sяd'M( YeT1Hd@pW/%vOn߭q;k '3O9j@XZ7P@'nXR"nUN }Le;g%&ܛz$}][Q׾VP-h$:ꗐy1n `*} '{_2kkqsZ.U~7>Q:#7cLrvzYRŃ_4B,faNLDNVhŌaN'D8 PL*J@9o~9<leqە)E2mRwѨge85˧\[8_9š92PyYY-VutS;x ]z`B5;L'q(Ю1|9Ĝ$*~W+0Җ#a:t$ٌtsvۅ "i04vMN=bbK:c[~уmAmk/YNsj16:FdsUSzNWkU4ө ƫx;Vfs++tby/˪ 9%~ůsֱt_*~g%)FfڋK Jzr\״ذ ]`FQ %\CvUܬ!am~Ӌ =G1ZK~Ŝ\y }אd[ߊۦB _]q#E9>+lnng6]0E99SlU$PAMz䯊p~Y!Ŷ+/OpeҸ/IkԲ\dw*i YKe?h1##Eu8SNy(x{+MyxqAf晉"UesA z}]=WN>~YH\)ƶ[g%,J/J?>al Ŕ1Ӭ\V*i@G Eq\q9EYqZ;̉}5F ߹&䳛ݷ['K*_/OXldX`;DQ}W>d*ߵ2v&SGǏLly3\c--L'ml|̿6#cu,]I׺|UEe~A᜻G)+jQ07h+|sϫ23M(zη > ! !!?K[}5OhZoGvI&( V9rC:tmm& Q>!J '0p2t7仫=~!ڂʦ٩q]v\ oͲqj5bbi,+5qvθltY:^!p,_bv#,LZy ^N&5mےBYRҤ*d߯ͮ}5ݷvS/׮ZtrR_%8T/L(nUQIļ5kLv2GwJ$@( "\ϒ=Xnqy !6^%>a?HUx YX#(I䟦ѱ|{1}{2GjCWF PV M,շfe S89e7{|=tSG^춗6 %lVc/sMtp~N>% e7v~Seؠs:E^,MZ?՛5`Y~]7E5"3̥??#ɷKڣ)SJU[\5W]qZ.[f5C{ViY6&8cEnjq̉|sI콉ͪnqMy1QYŠ3GR8( 1:PJ@ /~C 9Du8Z:g(Ǿ:87'/]v)ǕUn؜,}%y_"]ֽ0;^'ZЪYByS38P@)(ҫuASyF$ٶ;*rPn7IB]VF+]"o=ˇlV~^Dv%(ܺ.: 0>` 0?0`YB{m1!Pf/d_!|&Aɱv|rpmFO*q+篹/~޽aT=鞌-byr>ZtG]{}ݯ-<\cQ1my! 6"_%YSxD} P@yv-ۓ[gذgf] YNsz%/obI6m*;{.;X\wnƝXuk&#&r"E҉Mp#r9DT`Rh)ϚeɳOO5}( J?2wc$t%xqkui_qC -3*v2J]Nٷ% jw]Ub|ёMM!o(Jg/\$"%( [~'/bجXF:Vf؜ǮMM;oI95)JQe%VV==yHfc lguWVs-DD\ףܼd@=@EEU?\,_yzF;&soX"b?JIl@?BH0 ,Y=Zc#!Oխ A F֛Alt<΄u )ψ80r6&ۻy[_ilM {ZjPjժ )lLRP0 y-~Wf}sx|?7<~X`礝_՗d:*J^zho0n+s"(X3L,V䋷"y%|m\ɻsoZj4eUm}ҋ2/O ޻뚲S2},X+.&|0tcr<-$0>e6&o9F1O,WtKҸX}>͋8>5rݣmkm:iW9,‹Iv[v}̃Djq2o"#l ,RInbJ_#9׃[o J+9'~o/F#ߐ7nEVW[YL֨ƾii TtNN7o՟#:X\7֬S5:n F:)23-3n 6":ތzUۦi܋L/yWI)1ĖAhey+_8]?rL偹C`-+$C 2B[‘bQk.ip^N\<|`p9dOÛ\oԳ2zgs4 _tR.ėazd9+ԧjvWGJt 97QEUI2k95ڎMKU2Rn#?c\Υ$::^tC(u1s&k| cx>ZT׭|w[/ႌ~'}ܝPTv2Wezx9CZw%#rmj:OTK(bOib` J/PY_Y޲9ͤV^dW|j]꥔cMRڌWWQW~rS97&ٔޱVW, <(qPTUpfd1Jɀ""aG;'xӿ)+rnuKtſ]!Eui7&gym{7kŭ]P&IkWZ7/^M%?kF$y4sQzJѨ<&OM~V?=fBV8}QK?4GE`>-54֯^&Tz\϶=V`:4JԒ*;`+A`yr7xc;1ZdYy :tD$r`*eD@P0o*_\W 컵Pº闷 )S}5nZɶcʿlj!)S)6ѨNjc6Tģ` 0AG3Q"M( "7#+nȲeǪn~ [V~?AGJlGƨJ*[ ]Dİ W6+26̭+2CC"Ad|W7HE;ˑJadL]gZ']u#oiv7S9@FYۯ1y wb;E@:G!06(l~c5kk [7<4@88u0f8` 0` 0 k^¾A((Zy"\F Sh܆rHBW ycj ]t)5D$mވǗ8oGsų`O.+Nr2w 2jj2B*RZ_num!_5z>Kv.%=x*OdclRD sb)x;;n~N_v5nK?sWc(ީizxo6Ux۶Xo\6'-S M g?qJ1YzWNXnټf.;jܵrBb**@1QCJ~Zr}ȵ^޵O{aRtoBֽ\\grŵi;ȹD ^~H>ߏlm: $٬w`K%Jʣ[5ewҦ;n4QXnϡKM6MhK}j~2x$<O%5t `RM9u̼-Nu = zMpT;Hʶ=ԕܶ?6+)Gtqru*QWNpIFZi/"׸Kxju_d豵:e*5ۣI쾾)cָ%C3V>ꉵ+i)&n2gS|O[_|__,J:妱uOӣM-wmn{NTmızXfc%F9.Oe aAQWiήB1SMCAG@3K S rsN']y/'eqYNZ%մz?߹Qd+nm|fts(:EНk-zRvWf lݣ_;ͮ[յ%.3'p:?غҁŘB[c,$bάG>0 p}ZocK%u=gnk_h1` 00``.ߞFe6øXT5mhU9Qze/|\y5:${>T;i#Hi,zu/G+-TXvHH\O_ 鸬HM #qI3y_rď婇%ܖɜa[k-ۅʺoZڊFU$H=2xMF9rSm0$Βo33k(`Ϗ1.9u0+-Ի5~{8K;:Y'?:D)Q`@(8_L?rw/mtmӫK]FvYr螺dx~*ټQǏ:? QcntIJP]nmBE!9QSьvNʺ*?US"cL"?\9o"̽mxSbg969ڡJrm)Iɷd'yy+}+5B']PJ0+Ra(KBɡUF؏b ZJ}-5 &H:z4SHǮQJsa\?׌6[~^nD(nF1\*n5QUb'^vǻosmij'&1Ȳs65ߕ}5^mK$2'dG^Xqj*I/7x' |6+X\Vm[As|j~G@3w5=F|K7AbŲ۝FѐM$W]՞Gn2t43G+Sd(D ϮvK{9xT`be\Tb`s{>ውC[&|9|/={#x?51^LM Þѕn9?^e}Dϛ5çȏ?ͯ~fwl=21Z!K5~<4oEPN勏x+e"0w |n5_O'Ldk89`%ruj! *RrM T8"26ԅ쑼J_R`L>{jHJE䕋hj\Huh:!QUJa*rJ ^_i~>O?^dumJqpaY{=H-&ld>@Sð1 bSSb( =oޡs[alsVZ-a-Z$U(dzO2sW0&2_.@**x| %usRV['YM>ofi*9Ö? ӝTXS4 H؛QF&s7(GwťɈTkVT"`3x^psLFPZl #l.Py`+,J)ǍL42)Q0(Lb`LhlME> ,,u"(qM_tb,EYԢSŠ'mNa2 cFq>4c񶗓LdTT^ENMu4Z'9-YK2ܾjbƾ Mz)xCѷE^~+yBY1|wQ?&Q;h<k{4>uצt=6:iʂ[?5I*Nu[$UW5y'$[ۭlOU@Q)VLO*ܟ mmw)$w]t1cM蛮}5JqZkOWT>=cO VQlgBOu*d! &9=2 ټXQ>NF6zuSu\%otPL9:dP߰,Yڷ0pESFTߛ~Q>xnF6%%ΘNK]=윈fӦ^hI$!D` 00`hwJ.(|vT9ng[%ާy9/l 9鈷g]ʒ2 nIqHX\NE ꣥ra9<"Sq,(d^%{o_PD[w6h_#, FpD>@xG?rO4a~Od,2*q@?ٓPv?`}M-~-`,Q6bb.6,KGVn(lb&} g0g.>YCz=5`U: Ĕm5Nf77Ѧڢ ;;#|UPۂywa.KYӬԮYI-wb?Ӕtw]5"&f0? 8HKRgR`a7,:\dzt1Q.`ݐs>\{.&C5񭿵Ac*). #ɹ#"v{cg[׭ 1ܻ z#`}ftG +ДhQPLJ`WrND@`H|ț/0X4ʌ'$5$T=}t%Ug>рyR`(TXF?x"Mcڪ‡0Ezo/w49Uk'j6PExCJt? srC9C NC@1LQ)!z7oCInut~뚦@h_GW$g/;_;qd3#rѣl@||[M1 $4|PxoUd7M"1`0/%o] m 9LD-nrl-k0 rfʪ;YT%TAb/勷>"w&VwJ9<2RIIVOdX2QM[IR1a1݀0` 0EĻoJH"iɱjvr$HD|%H&r xٍm]m8㯯kkUy00&-%}U8Wr*FJ6$4}Qgm` 0` 0` 0?0`X~MmCV0*mѵգ2j`(E;-bR?מ2e㽚CxfǍ+tƯK^+>uIΚ$nrpP RPJRx /5WKD]K%$CӒ抙Ip@G\U66t2Rs?#WVd([>@CK#~ [6`5g rMBfrwLUPPY>!81Z%bkh/ 1w>Aoj''*&p>L=#FT)KxϫSz[Ei̗3u y)[E[q߁xtڲ9?'x\QO'6x{}2[ZqZ?W͹u3caㅶMq!Zc]GF/m-I|S(TDH/^ M"x!JP18anhټoݍ5|/ȹ<̈d,oG)Fa2|>/oW".ջcû\[1pus)'mӲm!y#v=h~bm!j*uvUB @tr;jc5‰Tן7l=[mx|˜eկwv[_nězGǞI .b\ׯNu ezVd,?b=OYTKOL09LS ˭fܸnc8ָNOQkTM6fm>~)FQi_ѯTM&EkEvo{m@* 8&Z4d݉ڦ2v1HJP/mPq*u67Ti\WE 1;発oqv. ڄ#Sɿ$kq͇q+5;ݨ"/٬VPP"bP(oM¿Ew6,E% d^UJ+ya-|jI=%z^0-t!a IqjIF6cT$DH@;a-~{񍖱t'l[IјS;jܶvtuU]5EcC/IjP%KN!eR~SM.rI"V$wqSId\>w&[Nۋq2>q1UnbÎ1C}s%m] ճmacT-׭=ckM6ph%^L.@e]D"NM7`e?Eͳþ:߹f<h=>ZO׫RӪ3kПj7}[:oTBUM^Z^brE!1SZ^H*O#fq%(g99ɷnퟓegd ]$$IE(DIܲ%;?}2*HXXPn/V2S)-eh02px` oilh劣/J4kz+B@קR1EEER v.~Y4ߚgQX@P"Cճ S](# ! cV iZΙU$ieeC&5J{Ə@ыv)>88HU-OGH$]Ǭ!UC< 0` 0 G\:ȰCAR$L 9۶ÿpϦ~qZԕ yB<P|b޲.ڷ(_uqvk藯O;c>Y[^ٗwTu)N7mY+QM($դZ` 0` 0` 00`>[P> ŃR7j[rg*Gp  lӔ-N-~#ǯk5l'M()US( RHG yE\x8NUGJ̏RJ{]PJ1ʲNvYtoVIקe~x&n0)϶nVWZ*e)/*ꧻXNWn4;>GpL䛈*3pEP `@D3;n/]XO#4-;Zo"< x~Og޶̜;SZ S_ztOfQLd#ʰi"`0 [/> ?ӟԿ߰9Oع.b۸aӓS]kZw({.h20Min5Ώ]z}ǣ40 Em.M gpUs *hI!;G/pW(ࠩ!@|%L ڏc{:SZ^>tVׯ'Pmmù2\l6lmK_Oܤ_vz #=7xՆӰ' oSG0"^CLd4 \MOӿ+鯿(S觡;g;.I U&b4_Rq.z;6LkE]/.Wݗ:*uflT}LOi#~a(z:<anVmo$ҍT(|t]5eyk#9^nJ_]gcok롃NvݙhXG+NGOz((\2&Q?\ "tL 9&8eQV:w(ƺѸV]')9KD mucaT^7'MZ Ɍj* !D}L4bNƺ<\ n^4{pDOrY-I66fVAU~a9vVe͟fUF)gLH!܌Ƭ2ndM-SY'"H !Lc pv9go}XF-NmJ#)IRI0Qo8Ktnk6|#kin #7zzꇺBlۑIk@iFo8S?dS8 zM/k^PZuUJ;6_`*5{>>*O- 8Ʈ7IiT>m|ਸMB7@:K9(g۱z޹9w6'gwΣ騍nl^RR;^FF?(gnNVT\ bwe纻[V6b/dq"R7QO~2 M H>g0 y߱~w &ALy(u q08>@~d>BA7'94L)$ ~L` 0:6Faxؖ$] 5agoꦃfQeN?+ݑlaLVRi$DWmfcmF~VtkJ''')?&&ߩ5XAB?kt*S˔0lc7b'r E=LϟY1u5R}lH fU^w{U[v'n9RoTbcUeu6A֖ܟC)_C9י^n$nҒso|?(l*Xҵna!IEO" ^M[E˖.Q,~S_6դ^yտ }xk{6ӓ3qnP9I,k#XWGڼK5ugM\ *CTH$Q%"EcnXy[v]*ȩM8Riiʍ/u7h̻uŶuSvmrR-Jei4+U-1TȺb*MFCS\Jb9)ɺ]e?eQ>KlɱoX2_JeZ譚GJk?m-Z7*}ćl~X.5cu-{TN9nDYL&܊? ON3~Ǟ vB\nUݒ_|?I*(ת_gq\OQ\WǺ%nҿ݇d *`3_2Vi-%+fU??D30{R {TM>s1'r?? TωKDj~?}kꞋ\ޢQr.zzSmFQj!MÔ~/?_ʶg}52{}^?\S]$wH)DžK_Yř@%}m&ײ65B@Jn# Fj~E6M1ap" /~Wtdz()*ߞ.Y?K>w6%:*P ` i|q;_M]mMar7JKS; ].L ӐTS&)J"D_Y6\뽄nk$QTA$U#Ot@DDDxQ~"8?RmRjuͫ4>֣ƿ|jCO,fpv E'Mohy|~Í(fRzvt_)|Ekhw)Z7MW:sDRV](W*IYr—zH};[kf BBg_2JENéQKzRx\nbfi{ UE~)8E|^~αp}'p\a4J*=:t4E\;jY*)Ub7ʱL!As`8]nMڪURYs08g{ur^c"-ZDgc'-П{$ڰ[씢i;d.ۢ Uhe~-*D@ve0Ie?IpS6g+]{yYQY{5ArTJZ}Zsayt6|y_ k&=TW^٫tR!dsK` u^V{t7wvpPjFfŴ %LI^ᤠ+c6<"7(A9s_A8x=bn )&UwT͘Fdz@cD |>ꏌn9kKLqvQ=sCm{&EPXĩI}0 3ZvMj鮭7Je6*A!/fPjMѼ!($95[ h\snNflX%(>J:rEy1Pp w` 0` 00`Vuz:g;c4cFب.r:2#nT-صw3Drv7xs.{];ai K[rnБ%?XC{>4O7AҪn@89{ǍJd~5иD^V cY ΕR{=U$~OR)2JG1 7' D}DpQx"m8;,45Fv#6+&Z8EVMT! \` ub}[nwo]] v&a< # qH($pL"p %yvr5stwzjӟ|ic|27l}vuS뫵K$u=f)J2CԵwSrLOح3 +.)cc &N.@ y^8*T4="_oY6&b1l-=޻w̋lr}Q5{%5 ~RVb cV4#HY&(D3L^IJjLPg3Sfk~g6m]czۂ7a)ԛ4xw^w] lcU֫fm{]uKqqKC%Zh:/vAwj&\}D\G7AR;QB!ϰ,F7'&!isIpRy0?+C1옗ճWw];RoR]Ҕc:mk(9NK<S?7mMnD=fk{v6.siv:=+4AӕRI6@(?|C&ӧt6bBOcVݹ'hj1:H.GW:H8(Q D-3p7,Ul體9]TUTS)@C3&v}QtGSu׈݉ReB5:+RLj{uDKO:#%:}gޯty^kSl\̐O[Ir H~?;pϩtvj-l:[7,Z h,Ks-')>*y)g . 5ve[:j#᳄dAt)UEdU(0`pƿ_l[ᆾ[BkcuךբU]Θkl6mp sR(o_͗xlmתryei:U 1 POR@%_>lC Z&7VXKٍ+$9i 3$1Ѥ =T11ʻs{lήȹ7ݯjoH$oö/)nvɉF뙍.m>kN^򖚽 oS*#]SeQEXۘF8jVg0YVD_HtSv>9Fٿ{{7T]Rm;alu_SO;9_ gjªg *tJFvJoPXiI*j,$QHQUUPDM2""<L(.RiE-[~UVmtQ\t7)IIum.E6ۤa^$`j==x?X1`>\er><oWvfڙ^0?m}]ovinCs Ec9D!"S0b8P&OTm8Nλ d[M5Mti4Q5~LcVm[}X;nEظu9ƨ&dZii}qIE4kDI D0(c'D D8 6J;DADx\Ϋ/yݨʌt=]M-I|d\4~>U%Z8^ٙl2ݡv+k%SKUܧӪ{S kO"+^'U2!lgꕪLd&e xg*l͍IJm\kP}Iqb?aoQPƕXуJ#R ,6J00`@@D==@@}FR8Ik504Пj!d.ڦB}u] I;En P8-짌lx|K˸yTcGR\Vۋ6)w(qM(nnUd]G#-RGgn*H?[d".+ѲI(&/x{/Ӈg,bW@@TyuKt8y=L<wI}]/=}"#HxTus7pU5,x0qO6oLw5]Ud z7޵I/,pM$-oCX9pTO_v>%kf?q vHCtoyO6o/JM- CsOƵDːD}G)SC!|=O|A|KNCj!_׀yf%޾(lkW?'fN+>0B)8pM=O\'>?27=)Bӊ֋˘ Vkxg7>\@8nj§zG2D^z8bE)}ܾjR=?FՏujɲMhoRu/ y(r8@ӐmқSedr_kݿWOh.Y&i~{@TLU̚72w)jрC$D/A/Z%vzO!_r?D~J C{"cSORO@?} Pg1( Gm; i沭kkL֫M}NB|_LsO1ObHD@żmDZ{'Pk 9P3n_\?Q{vWO-Ō_'Ӥ& 5%ꞧġ~́kύ @WT2\ZI[ lFUluo7(r"-)$[0n٢ $OB(zc+m%mJvܛm՞``  sfطzȂ UhDeN`N"eD?}XFED;s}2Rn=t[XTr3Dr+tSC:^rE[iFCk{G)ȜMUW{NӲ5e%{#obJWc<_/$"rn>bfh4` 0ݛ>çBk^4yu͛c{VP{-2ڳ"6C!Ȁ<l[N=mһ&SXᔵ_@e Ԭ;Iθ/VT[0 uT}j}#*XET CUUL#USENcD#`` 0/YʯdL]k)7zh›8s F) &!~]?is2k]{zŭR6h{9.k ]l&]^ܤq$L~AW_hhVhn> GXg1*d"QI|{xE@O#r|_W(;&RS壄bY+E83ɇ\wͲʷ*qqj_ơʼiFV{S(CZl#:cjgz3^E޻ obxDhw:.d, =2ZGpݖTOL҉5U)ŽVk5 *GO(C2S RJu*$]mD:K6Y>/fۺjC NevNZ{ ̕F2>ZM녞n( wg~/{# ^ݬ7w6v2Y:V)T]s4r 1^5A7>"a`WW F?͟R; E~Wp?ڿX\4}_hNE걍몣ߪbw)?pp"(tՎyVv;o+`˶PRqy%&V2M}-4DLe}HR? ? $?قzqǦ^_馺˻?*U#@SB5!06dAE2S܉HBqZ0Vftu9mGKzo\o)|vԣLu{Q?V6-\a7KCuCcN0i'4K;3nQ,$l UN)MNQPc \/lػ?t6}ո=%[G־)[g*GVuNW6N=_f5ҏuW8F*JPWJ:)N[8 ;KM!E&.$RN,sӻn$re0Pd[ѓo[r屯:>?Wf ;6O.xǻW-ˣfI߇%Mi7(rPU/iǚٻF+oLK$ºd8 5B~o@N l&Żcr$K}]JO./||ys,܎2#V5nEvH"vOE` 0` {pVk%]_֬u)g.^96*!j l)K7vk2 R=UL&LJ?_[w^{eJK'd&/S(zzyp RgDDcM/!j*[9MoQ8q%0 YIIa WM PB7v$> 0 ]wqH- xt)Jh@"k?|]%D[]Z$<1!^H_ר tD,hkɼ_;>"$_OP/ޓwH* a)E! 1 YNx~рV >nPAq*q*]-lfX7cLJ v8!?=Ĭ'Q&W$*&e[1BFiJl:5bHb#{bq<?φÎCSà[{޵X\pm' E SS)DA3,V<oeNݣԚN? *&tX$a0wv5潄l?&{%q8pHwOL #M\ 쯼R*FOR :iM'W:|*^B1~ϙ]Gڵ7R7SPj{UyD3Bqm,y6ӜQu)3[ܸ !ev+,(~F?@-` 0Hom?.Of;}㯿GGUlYoXT#\ tR:THsy?g--Eu{m0SĦSTi{ B#s}D0 ;+[Ϝ*[F̈L%8FCN$DzDp ]`aֶKY3u9D,Ch.J xC&}Jak޶>[cW4 4i3=~2;8y~o|ZIdu](N?f}ڥfF~V]D\Y2Ȱ1}2KL ؍@ɱ=F\:jXnk6Sn/1?t37e;%漛juVS_3kJEAU^Qvt֧1TUO  V}{ۃ5w$z9|ە?m{o%N)M}GwoDe^nW#Tlkg؏u^Gp#7;i/w7FY#WTlݫ,,ʝ;-WUfcl5$ 1sp3/$D0zETS@@@C_/]`w11õ# d5j7+օs =0UMݑPH;UE[$ۑWٻC{o)-j:f Yz~S;m+$FpvoE$d?1L|^Pרw>sο .1Mݺ3Hh <\J֯s8ߟ ٳGaԯj~7CyuQO@gԕC[#YٖN%z !^[*G0/,",Y?rs]Q0OL߮mmcWT]!bI+&*R$k}+醇MOӑO`䧉D$[o޷mlxg?/98~jU:E)M4Se8[ӴdZvwԽ)٫KHխ}w3Ju[D9ػpC %GY)li/_⳧X2Dv+EǵO (<8HqMlG묪۫6Jz9$}Fl?=\'=a% &]kOTڽT.P]f"ʷpTAt:K GYS5S9@1D9 8/~AJIM%6G;%m=46׶Sf+8"wC#{AەFԠhƿGD;U5R3Aڨ&g+3;xtg *bw^_DZ5}n55jc M"yj]Xg@}툔.#\S`,׳D#E^e.^Mϧh6YpドmҥzNZz.fӻyXvN+Xo#֐1a9XR+)Ytj2~NH|>Ð R~\Tr"' r,Z>NͶ=h|7p_t1ȾuaZ.ƺꞅ|N%ع&j#.EV(("E0GFEQ-d5Omsܶlmh/uwSd~,.i Yס@8<ȘF@TNF.wݮiF?T_PX {۫ʛOnNVRmI'o]ɼpDG.ݨ#J(QL++E%_amvw{37Ke;m_lr|e.iXͲBR S"fZ%jMEitɓyS{fv0,p'>F2lpnU[/nsIoCdɸo;Y列_ "J)ϢSziEKD'ʑ'aEM/`͜$H,Cy>KvEYuO*}dn:thܯNmpطNEQjȦw(U4b`ZKICKGJEUkIFIJ2_cM54P;nX{źdanS,7U5*Q$JNJjAăiY ;vΖ0g/:QW\*q9c~E8׏Lk ()F1K$I/KCs7=p&YmY;m=e;,9>Vχ=J0?0` eIrdAٓe.n>(E7:ۢ}Ff(,@ nuFJJ`AAVe?RT"`ݝs^(P;wzA%#`|ڌ-+8Lߋo9kTHx7Ш8ysU;#7z>9z$sboKW+&Rt(*eja);b:EODw_>)gtMuZ n˥&%_!/*5[&RZXud2^Quz}2W_eh`>C] elfus$T'w 2SD8/Bi7^ۺ8LJLnUlj@s &? e ɾ2p~]w"b,R]C< > <p~~`Go&$ 0*$l*]`O.TrxA7|KN"Koz#ӮHLY\Y2#{g(֥Liꩪ@lBAf*>)#=0 hCJ<X9$|^FWA` oE}KH/xlW(pe wS}G0:Chx)}|`uQ)Y!(Qg30CJRx2t s~ajfۖ/;U"*Gajy(.M>b<@G/x~zb;_&sm Tu+1JXH7 pap̥yZ {![To:93HJ./DWR_^Ƒbp C%?5bBX9N"dBG)DA~O#VXtdfYO?媕jSQM5()E$B1j:=ok&{WU.'!:O6 VTUOY̒i=^Yڍ לT 2("d&R{pmܚ[mJWW1tnIkФïcy,j6-kN]Tnv)uOԖwNjgWt[Fۦ=:fqo!3JkPW goeEJ!N:N:>%s<2*ΊdJ)['6KxSܡe7k-Ek`ܲ=jV'q\w6MoqTʈS_l׹e.iɯu*#~u+V?Bϧڭ\llZT /N말h숺"܆&O(ۼk|GYMҊiWeڒŪOXg.+eOšqV[+曌!M>fi5-ҎSYVu]hpsfO1vVfbA8[ Rl3y 2j\x8V.+ݱĕQsԠ"5e3zJI/yg5|ksɦ)dt+Pw*sgܫSI\gZ4\l J*,:h66m-8ֿ!6dc?dg^wG^҂rAmU?/K'{Ɔβ.e<rGڗϥZ? Em\WK=q溿Y꺑ij^ӦZ}U- ~alƝݜj"?_+h=8r #1kh Tֲ2Z}ŞR;W TpDTl](DʩDyhZ:SZq27m/.[R+pз<`j&sǾ| l|n|'wW/ܭ0fB.W>]iKQI>vZ{6=yy>J?s>M?u߮nuoֿi ߵi nN,bzz1 4Fy)&P#I*)+X9͇b<+Oo"v`dW7dJ*Ējw'+úl\;ֱj 'k^=4;{zG`]l]4uVZVB=~f2GYrS Q9PϿ& aݶϊ)Xe`'n,rm|͟G}ܰo}ҧ#)B% aN]Pb:x͊j6CʳW۵zV.ے>5P^ S9Rr&?>86߬{nbK*ڥv6\Tn-ѹf"Ey7,`{ц=)weI-'boq0զ#iYkƒHSm9CG&gT7*m%([-bRr*%l>IȔ|\sSwU,tz&2ܣu7*e+Z{RL5q*Z =>oTٝz_KH f&ꆨW?΋{Y+VUds}s.rNA')}^>ût΅~{!^n:nOH5>Ӷrz|aJZwۮ9ݓ]uN-VFOM]N.kƶG.K^SJvR`0S)}iM#ms#P+2I HD,=j$0{$6jz@7uH;a4t:nƠŎ{${+ՇfH8)%c'LQ/ҝ|j:<u*nO2J)j6+Б|'g0RТofCC0:'6auG5x mM/6DHwrfe̪C^5Y2~?͆oE2~x1ғT@=@b~L7\flY7S!W$<$3w_ γ8t*LB˯) 28TצZBӀ0?!=@~!>MYILꖟ,V]l%"aػm^9,cL&D|M3 ݑfߘ(Σv=i<}k3@)@w qu|eN o!VϽ6tޡ26wp`2j{]mSCMX%L狉 ?_8&"#80?tjVjvPUDT' >'L1yp 7w(~{pQ璇P}?}}`n']" rĶf>b.p?̞rNn/`6 !*b"QQ`AS1"g?/#*qU/tTu[ײ)!!OթRaTDokJχN﹦ڮt;ZY`@c.űswgLH&ZҢ+P`AS+QHTmfQp//\/Zoaۂ2]i ,w&A'2V:[)ǟ.A营]7~O}mO$15mD}<)Lr'^9q08y[#IɑT"(P:j&b3(LQK蔍x6wPu!$QC:eֆ8qsb 7:ܚF)}nJp+CX?E.PN"T{8z`ݙ )vbꩁEUc{/fVwdZXJhboUZ*N|OLj/vܟn#1bXD mh7m%5XbŦĭMUgO> `tlܢw*tWAtΒȬJN(p804βLu9SLLsRޓK_jZ)ؕHmY+&-J_i!\Vm"qTQE2aD/; ]Q߮lTIhd SA$dXSR#zy[~1VLj^ROkv^=LQ~)0.΋>N⠸E5"\-vU,tVa3,*$wKtR +Hb `UIig[ܔZqsKFd4}z4jӾ|i5ѵ %(5KTBVh}'޲:z%ՙ[H=J굉73&maEQ8BN1'dmg?/ɷwعz7˺x_m5Mƅkdmz"b;ZZG'ʡ9tN-4s}>5/O'Xh͎uU!u pnm!e+o1lJc3)x>Zj0(~ uKuW%׬iyw0{Uoեӝ&⮸V )Nmޑ~H_:=KE䣧I/h80: 3%¢Ǵb6\8e["nm7qeۍeѨN]{eON>FĞ06YCuu0]eUUשb2?_׆r + hHw4kC.JHztM) ?'1((Tpdyzv>\-ct 9SC)(gy}P5ni ?.ޟܜdcʮ%'uq5֋7_j/O"Vd5#bUҎ Ur&Sar_26L7nHm˸*xR-'\ӿ/NʅvnNm.HOBEY ~[XVCWP+d%O,ne-[6n3>et0ۏP*rJ_^$y\WetcV+" -mvmvZ>}WN}NspXnԛ XHGE') &L5 i (_鑟! =\l~ۥgl]m((m.%mÅvCT}m?T*3ެwbή= ź-"ۺc/;dt{H+ѡF:tR]Xɼ+pQB2/*~Xϗ18S^L qrȞvžw6c݃EptzOh6;ukV2@;PzfU3,lS?@#'3 Iq.KrQn;o^ӅLd4# #l]vX 6ϕcw;"Ļ-a;鮫>ۚ ̣}׼InfH4$tYj(ٓ4+Q;IAj^~|*٪l8{\; .E=t߽|, &/?ǶW i43yNٹK#jθnB_%[ EMnvjjJUuP5W{mWUJk;Z ok.Zn*PPœ.5`ýms=*:_ō6ʦܭnPRmZջerϗ[zpDžQs)!)5 Tk-eNrI7f] do)yQ#$iDSeYݨA9{/5qs&#jpV۾G=d[^FG&q6Nq1q6Y,C??(`|96ŏ ~6\Gr]UƹFUFB뮱?nV y\y;cu[nY'ꔡğ|4ѽ,}mَh3`FʦoVjG.), ƥ69}*~kOv^NԚl\ƅwHl⭖euDW-Vۄe.&rT滥9$&({]O?7?i_2'?]d}ϖ6_mg ?=ko~goRFǿ/~_{wooû^[{]Gq/VvW?߮RΘE4PߨzfKxǓl|{i6߸e/q5IqӬFfqwJF=2N_4_qBbu'k4fSu͎kY_ۣQn芹(PAT} o_7߷cǐsOW\e9zF-w5۳7n+m}>m8::MdW!v%⦮vh^~>Fqn=)y7!C"[M9>{rkY)EkTѤ((:[ a.FZgBQZ00@Nk5i[~ED {iW둳ظ).*i"0@Dp #{&ŋﯔ[H&jŋRL) rDW5I{qe4q"#u묽}vm/bʟZטv4sNO ɔ=rqQSvg=p鶳T3c.5^eB'mScӵ>L@p K]kZWek߅a/|LgXժ*s9`7*x;h7vVBs9g(s$BH͐2C[F3]lnt`QSSUDz^EkE-5Q%uKOM۪ЦDhT6%38J]33Y&uTj 3 T[Fm[odMu&%:%Zj?2.-~M\nݹ+6V)(2]-,{[]=2վRc .[٨*!( %EԻВu$P&UY7mSvWq M '_)Jz(ũ8'vƞ =5Ϗsy7g^!.̋I8n֮mmN}lh#jDB)JvN)*b Dx]/lN_5¦ud+m%78Lyǔ,dG:8T_Ÿ.2} :nmQ^Sl WJ$@RBxr- *+J߿_Y?C$Jĺ_ރ堚Ap%1A"~xB&!/x?yFO7E VO=EGVln7͋"ЄQ %Bnz5A55.%1@C)=fk퍉T%u?(z`gg ۦUpy6Uʁ2rRRl-EW@PIA0&s->H GL@x|o1㗶gSފuN6APmi瑋k/ʮ_8)<K@}ZU~֥ܵɁ'&* =Wª/+F {س?8{>=^o^>:hT~S/3~S];_fgvڔW` D91NC!9JbS %1D9PcBEzű<ۺ5Hqiu mqfw?v;˧3ȤAfg[jQL?-V;ҦA&0BW[2[ښ^MB ە^+.J5%@1GeR~_3 dV17㻃՚ʋh)V7̲*%@ۿvȷiԙuX~ꧪ*ݱu?$X vrSR¨y~-BmK ~`l{F//'*w53/D8vª("#8 >|llR`V[*Rqv "/c8y~`PhN@"A+ 1}h#FBɎfY+'fQ O'J r NA2靿e;ENStïT=@5X%@!DP^ȃ0 IzRBMM7QdDJ s%Z=.QJ%2k u6??b ө޵k>WJ-vaeJGͽQ0zs_&3Ֆ3tTc ?(7ot|#/0r9"ܧz?dF;u7ϻ#݂O˲:N:IiѭKV`o?ÿ?SrȯI8mZI֩w?Z̎Q0` 0 yLSa5ߤVʧ^޺3Cʸ !3e$H97j.۶]1`n{NRv7KGe)'ll[@pU fOD:"ESE"ٝ>ܯ>6g_A ڙB:H?pA[iKEEũDZSr^CB,3w{ӵ.NHK;5Z_w-A70v-*5EE"~3sgMzlݝ&:56XȽJڼ^br*Фd˱MWn V*@0rMn~<[8-(^vzcsc?ڲ誽u51$ϊI !7bl2Z" ;cZVmpobVnc  Tjsl}[O{̩r~wfy7fZ|lely91N ˝b/*>źemQ8ycՍDwL+QJ:VRZGZw=d c9&1LcD1<#ȈbI$] /W {[au+kwze.MFܮd[^ƅ]71bʡM"R }sɵs]bxqxJlrutO^5Ӗ޺#:bn{;{ο:Jsw]>Fz2HWRk9;9 њvk%;tJBu8 &ƴ{p#[1D1a }Ӓohi%ZDy+8[jtmcN_7V仱kyt]fw7Hiȭrnu~$! uR]UU̺ &bY&'Ԧ\tǏ-Xd+s=hm5f)4].j^&WNSUֽkj#Fūv/SBaْJ+Q8{[cxwQ4*ƝQٲ*|Óyqn[Xq3RvFrsRrzN>=l[6qx1Z{tDnj}VBS-5PW:*zkOC1M/>2HR&#9m{}{x>FG <)ّU=,#;;_oGbv:ίܩtl:u5y(lت1b%'TnDTOr$gHJ'6Ocd;=]i,W'TI9$IwE릺])dl<|" 땍i-T>x-Iiٞu *ιBjtDfH#Tgf#k\&J"*CH xN关Cuy;fBQ3V][j=^zI|rٝOjXgg^;ri='.K^X=` mm#hޚha׋f<λښbZ{jw(iH4腓At5~&L dRlA2"&DE$M$L D!@ 4mz=BK8[~v)`SZΑN2m< 5 Ew C s4::Q|D|hONiY@a $(;d/b @W=;=Ͽvݛ ~*eD6t%G IXEsBz5 ~tz~V=ൗdjףq4QUMe%pu͝dӀUDOx g/ iwM륾en ,tDB}MVuWppd@0 _` 0` 0` 0` 0` 0 }Hӝ{kdMew>FM(qԧNZRIvhXJ:*R1J <`XvFlzt:IIlIF3ڿ J0r~[{*H3{n]eqԵ~NO%aVIB#QC` .r ve\tUr2.uLuVYe &1"cDDy? 0 FwQvT, =,SE7+9ظ]Tm#:$ U]5"(jlL.z)٦VRtoQP,;xzwp]cfj 7ޗdgNٛQw{udWpnk4unWram^i!e$<IdYɈb2p.cSh圧bʼU;5)B/rS}J|W/-|Kq[nö1N|&]ؒqW+{cاTSr^OprmЈ8dL۹z}?<'e{)3Ύ%6v%GUՓ|[7g ŵ2bƞr|;w yV͸9U1QL^9%̾L=6)JUrm}1+n?iŷ&w>k#[# l0 ދ擗ۺ⍹ճ[ZP HT;Yyz:$Y72J9r5vn_{Ӿv #~v(/B9ۮǕ,-o%~֫%[M䀶~A:-bF۾F}a J n7] U^ %Dp!&TL;+yV' 7=Ɩ\uA֘^qIk ϳ܋4Kl)ؽvBqrKXMZqzߏ^ھ:o{6}}iMIZZ2L&]H*Hp@D^ Ne]^fպQ}v[>mIvB1R EY;bl#3ʾ}ZmJZ/N^_]vCǶ 7\:puNHꪍ}lhNR5GkVQI?Qp,8>x/Wvp7.&pRo׶Z+ztj?#FGy#_L+0vBsQG_׵%C ߧ|j}$fѕqݭkYbԼWT.K6?uo(I`\fKqmKg[H\YBVieFc$l3}5U 5Bh@9IZ9L A/L+ l/ײJ^zq4E r}~(=Rܥު^k/^uN;%;E:[nj*əuą=ԩ` G`u_HcgG^Ϳx{kKqjY ۆrE&Ѥ+y|cs#_NLjo(vTMa4'`T-61X?-$ @8܃a88QʈgCĥ8(SfV[][~&*UF7NR}N:8윿k˄{m)P넢V/bQRKV֍F}khuɷUZa8N.+ϲbY{DŽMLDTUa#8,D)tdGcd;f1OW_kJ2Ǭ#/ԾlïRkGLk[; D}j]jsR@YôLlqϳrEYu.&skBUe[?%1("2n)-6ևH;MvwLְ,-[_ҁ%Xcؑ*TG*.>Gu2F#ܝ܁\Dz3VdUBV'%)}z Y4= sv#a7hœM6 $,}j\jF(W3 dQE:USO฽O}hsxUpV}GZRYvjҬLd*#68f?/fh5Z6^ =vAHpb3Q+M jr@EEDY&` t0ӏ9MfeL)Ӷ~> r%+D S(yD@c69z6`ίQ 74fojE(G70` 0` 0` 0` 00џ C}S֝;;wl6Rm,4ɲ&ӟJg_ƦDSeU1I0315>BzqZZ󫖇RVi7щDOԮʫ\Gn I:h"*.1It~B+=fuG+"gV"Wi7o#6Y9(1w4|L @}>!p$YĵY5\(Du^*j Yd s@?v,r;O5rgȪ6%n<=5|?/ӧw7Vٙm#'kvHZ1wF{~cjh[ĬG;UV]]YV׈IuRzCfmP0<|C "a .8Y[L7"ONdgZ׶ca[$g1p)xu tUbEB5OJI6K{UC,J \ U0S*J>f _~F6qΏXd~*LAɺ oꔀS߀=MEc$H-5eDqy/E/ gb;'=<c6[EHb^~<]t'lD"B&U2P"'3֛|SɀGx0 HFe&ZHkTLEz\S24 q"Q'F%0vgݼmU`v>‘h<U L?Ӏd'X}~%!FATS<[bN!dN} fa'}le:c;^/]^Ǫ')($oƤzN>:z#} H*[.|e!I0SCG b>6 Y%QJR&Z62w S5vP kڏ-9X^;xWG9YF{KtGm?YH˕IV [EZTk{&œr P\kMnk((UT;5~I~}qP=[L@(@ ܾ<حK=h?8 5fF>X&ۊ*ƶ~! nB.\HQvΣߞݏ:>^>=au暀nδb<l{.:ڋg"M B&&C]l06C]WȽN_M+NgroH5׎?i**GM **@l6-3]COgKq)]a^30v'ڱVd `l+Tz*&?0` 0` 0` 0` 00?_|^6ۻZ~X͉lw%e[~5Pdc9byS+Ͻy*Y&R 7˼l=aSx)5^o39:H9* h+(&m>ᚭ˾uV;\ޑkC*2*_O25Y4vn΄lWGU.k]FM w/'6\ nA‚>bIaGzj9P7L FԞBT?C]/)NnMݓU!zr__!1_㫭;tBHkֵ<#An3 x lzL7J|>YYQ+=w6ڒMȅ+mc4` e$ #T.(#5lU>SfAv,zɷj͢ tuLI)Ye )@L#fS?ot?j]YШҾډ%UhsbZogn7 tk9`*iO W}ZCZӰ<ɐNt<9:6nǣ܍Y:yu ޟWeg^*>&Qg (af&Uh4U[h1ARs%g$y!] (gf$@0 ~oVڪuW#'96އT"j/}5H9Q5B I_Ӭn=`'!]mG*}6݆췿8R.Z v"?@P>)7ݧ"Wg}Tib IaKcs( .-iRoci4 ֶ5yb*1PPߥp<.,̢s(DQE"cDDDDp` wʤm B C^܌V $veAŵX޷0?U>~2|QQP4t J[@N{Sf$E٥2 hfIuf;x  p_7_7[sɚ:m-4u#6bMWQÙdqLFD3.^` y[Y#`iT=Pg7U.0Mb}H(JI^>!,m2CT6]SzL4U9}eۙrd;B ;S_6ؚ[iWv6X(wZGIU&*M/ PTSD-` 0` 0` 0` 0?0Q]fʑf*tL)ȡ!?A0 g\[jSF߲l{W D?C2r/k.EƯ ܰr5cvf+" *y:`C-ZmÛ bϼ0jJ~]фy8r"?Sp w`S!]G֖Jh.[mp%֫Y8?7|Hp{a?)y!>oDnMK׀__@ C+*|*w*2fW_P `Mdu"k$p1L1؞#ڻ1-fOu6jz><޼ïQ(F&P<c{ތCRn)Ů~-@0TO"8}p =~>LBbXF~G0<}138(s<8.RQ~B;؏ ?f餲c}J`\hvR!3s+MuP֕ZI HHϺAA @e@ qZݮiCQLUZ+;.>q$bUb]# aOC>ߙMKӋfM1TVntS289`)' 2mY< (/i!p)jG.CjSJ&*"] _OG<}7 ]סRqONGr>kR0IgrpBL%s35'jk @~oÜbm^!Hmٹ>IiEos靥WBAXWU_E6`]VxVk6tdS_\ k`9!|ڢ$"vب Gb?g|`Kw=+fu\J݊$F(DC(v0D>!}i}gnk4UHCh2yDR:W0=UNPtr PGPȪ@sDy/wSE[kX> պɀ\n/DG}x)zO" y]z.=:p?Lv$O98z8ԎLP%j0b?[[Ā _@7p YDF- x-wa8R6:7ȇ#U=m=a]sܑ)Fx@/(T(tάjv!27w;B`*dGl>mh 7sZ/""]p 5]-]Ux<@yQ FKu',줓􌋥޾xQQçnN oSG` 0` 0` 0` 00` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` tcos-0.89.93ubuntu2/images/tcos-splash.png0000664000000000000000000014424412260610261015311 0ustar PNG  IHDRbւbKGD pHYsg tIME xM IDATxY\};no I%Qrk(hnYnڲB!GfyӴ;hw#[Ƕd-ؗB[V]ΙU(@"*Tf|~ᯎ?#|$G-x:B)=6\/8Vs}7DD/o4ibtiF!»D^൙|GDxÓ/A+;"DރeJ0׮,nWᝢkOi]?]b"Dށ W__7/GDx ǎ}rODR"Hا.\^wuzO[_?8f=]6"Dp!g.|#"!3!B& O_[}{~Kς@]"D0?@Wv-D>B"KNۥ(~+ >"Dp=X~S>ܳ'rE8½!@ 0 eئ$I&cئ"d 2dӐxn P;=0L+FݡlZ4[6Aӥq|@G(d^z¿zoӿ'JZ_'?CB"nI9d#M[rIm``;mcR 5) 4|}Ғnwh44]\_4-Zm?;]j.펏F)PZ__oY"/}/ Lt:#ܫ0 AܑcG01#M86e`6Bo[kOC"ZT PxW.XhPu(W[T.Zfۣtq=)b a{o~?j{OF0½)!?#aj"O t)PJdr@RlSC^PT*| ՚M-F:X$G[oo3J~g׳ފ#ܻKH<'T)%RޜRBr]ZE5Nn]4)m40M۶m۔&$ ֈH!"T7z?P4wWA #_H&ٿ|'^?.޻DxNE"ܫْcs#xtt*k>ZrJ jjC|<'4AOI)0DÐRbY -H'$1,CIf$&Y1"XXyËT^t#܇^.~v/{_|ӭNU{BDO|>qD"j Nc~zF('=@:^1|&4R DcbqGR%(05K$HbcH)D}ο'{5boW9x FgaGGy-b~+^U:AqNub~2dL@/hwDE _nbd"gc>0Nq8m]FN7Nx펗{#~{ ;~GG>xQ4b'>0G1͛_˙s|oOX\mqUr߫ar+Zmj3se6uƊ)rRۗSt5|_ŎS;[ߋV^`&r1 P-W֙]'@i-mohq2KMT4@?#+#QwGD_G١+Ѐe]go\᭳;Zk4afv=y9:QD͖{7"/}/:5jK3k=LH%LƋ-zW߼J{lv2/}/Q"oGc"נEnNNصEc]ZLC2689=%_و #<3?wo|.E)Vkx \tģ2ܕbR'ϰ^nG'9Tu"|ԟDhދJSxK ®.35S)q.Xq23U\/R{\uW__E"5,ӠXHR%j!h4mM№)ql iL*2:0$Zk6g.,SozDr}B_F8|?gQl۸+\mV$Nhd ) rB0ZqThA:fˑa|+]w9m7:nX iQ]ɓRp(?x0f6BX] ˺o:E2F11Cyx+Lv⬗[{F_ҿvۍ:<?:HW) {\2zCoHRF I"yZ.MjΞvgu=1gY&!19|H2aʹsK?ܬGWً&Q"Ohѿ;&G?Oz1:3 iJ, , l$,6Lé!VۣRkn,S"{Dy\Y絓st}jI$I^xb#)M̆./2*d_"+Fa+@Ǿɳ??Z%z_(:BR e3bE"fa!%6E:#tH%mq6m3$-_RovYYZcFK./M Ր|gXHe=g&!bs1^P;~@QwX/7Zu-Nܮ |@IJ2 \VQ8)x Griw=f{/d<4.23gYi[(RaxaKadq]J*,jl C:X,4"?vg M tfB- RI3C;SHoS?_ed`qZZFO񹞏 ʗ] |5Z&~W p>~ Yऽ-dXktTLMCp!9+= ]V긮G,;mN9wiOOQڀ4M$Ҵ(B[P~?+"qvJUL_oH)_+)mp`*#4l|q[!?¸bfqJ:+u6*-n8}KOOȰL "A[$JɐutFh#EAK1pR>O8\`onU!3!iN9Lg9?CLO(C(&Pvۥ+d_Ze}ڝ"PZSʐ#>O dBhAOFcX (tNGZ e;(k9h`̗e_"j@k(׺đC;ip`H:iQw3)ɦlk6]]Q{Gs۞¤b,?塃Ee&mO7V/n*ZR UWXCKr=7 ?##aE0Ÿ Fa"Ta*=@aDǡ Kv _Wf+h0.yՕ9Ndot<_5"<4=+<HP}9XS%kڔ uUo\eiF֦qæՃD!9 mPc:F47eO[$65 P|ЁA =**,!m[_S`a_)u`sL3Ol{4&52ĎM-d$4;3 fDu7x4G~_Shx~0߹ZsyrJzlYX$M'~ϰ49 w̞!Qf`O B姂Z_V8ĈKfun4}a̍R25U=^5JsLO1MUyJs.pyܮ yǮD$R\iP`{{4$[|Pc$'r8ezRt>j:WfK\-ZjѠ`ko'G~"~ <^WTr9n=$Lb n7})lh75rN% FKO~2ߠ8aRwl_:v 7;^!V-N6."0D_k]A:;Xެ!$cfd*X^+SYK/SNyhM:rXZ\De/n;4Q Q2?(D(OS|[Nc}ɹK\+52rMyP #tNp>mxe[ GB"Dij4r~O&qE<. sKw-F7MBL:.FSwʩy\EkX,ƾ}H߱42Y^ #9!^"Cs f2/s*Ak+p-0^O ~ǰv4%ܨ>ێem&!RI_zlIԀ45NR{+ᴊokȨtoXK8trx@& K./(U|kt]d2<ȇ>!^'Fjͻ"siR8a(W[Qh{>+~!8r ɤbZz N_S\ߠvYsb36'7i"Z]u?eNil:w]u]K!ĵ]i43J^8Wajڽz ύ!%4#iJ=H!Hē9j159??G|#LNNrifWX8.% jGD!^uACE>c<>R {ׄrř +3\ZZo_b1 {󹴶%X[?Eonlu%3:UZ<Їطod)%L\&&Bm b9N]ϧ ߃5Iu6ט-QlKyh5pG?I>c<Ԗf*\-[s~jI0ff؆Io<|5E׵=듟W| IDATwqu,+dj $~zj|OHb 9 !Ŷ>0!  PXԄЁNy؉ \yᘾ͝J4{evx}DǥurĐ=ط?ԟI~fTpclInT}\eѵs%]["\ԐGhgũfJ) H:`_Π¢|m8 k:D NNJhR! Euݠ[5i0B{4M^&vT:8׎J-L=Bl"؃6 m@~ -Sht؁dhpH&Ceʉ1g'I]`S8wy U4q}2t6 а؞ n|eE_9MDSr[H6vSm-Ħ [|9&PHA1 Ŵ l44WAm5|m! JWd M=7pt]Z3(BMs(% Tq`H*s0(6v^]O)zqLفhsg)Jd;5l [6i^|+÷um !zNI%qhx1M̅^}k.b)'L!D~p!80O>ubL3mlk%b2^Y@CNa!ܖ2X] /bj7l!ܳ,LO~τS\M!2Ge 1 rɐiDƲJNk/jVk-mT 1u0xhB! v5YBA&gr,e{62v!B!`$$rX)[#Do'P,,,p9^y"ZOR:@h;9 C0;kJl97!1 葝^DÐ 60 I6#S%eh`q ޛ4Va$Gv i'A:]!hziIƦŰV( d,'<[G5Q r;w`DTro"nر &'r&Ape"3!ARgX7P~V a8гCCmPظ9R5lxא_JHQV~+}=}8*;\ˀT àѵ!!n?O6Ai"^UZ @B@H m!ڰz-pD uwk#fϐMX-5z*㣹m*M26K *w-qEi+|/ՙ 9s = ҌSm2$uL_x.;[o_TYNN<1VxDHmS1r8lt*F,fؖe$v8.͐R PJ*(W\Y.άSwFIJ"Fz˅O$ Fj#\ wHHLaN@?D:5vu"] ]Dm(MTݏn$qU(2[^ً+P1Te[T`B%}ڬ_VHls9~;WH4K~ׯE0:~S?)z#X! Z}"n~6CtuyPmÕU89'@%EqϐE9%eEZjpBa)F)6{'T m̮#Ӄd>$c# Kޝx~#fK 1|fAZ;58X%."ݭsdc *kXJOpna?NNiJ&F390±ã̑MljLLCb[!I*C Eeaʥ>`'HM``fk.~aXpQ AP/_Au뽹#A#5Y8 cly#\kIJ1~ ~enh{*f!4{ X17?5Ͷ+pVm 467k֧ t 捭_,P|,xXnC3/ě3wCEza'?)}IzŸuw鸰V58*®w 3JdbXe}I +H; lgtohd63[͖j q3 )',ݻL)u9C__Ї?OoX^\?a*GJW8VHmqq 8RBm h[ .rrq3Z,`d>r3 χbW|j-q Ujf`'Ǝ#p]T[ʄ mS'a"c9hK_$h\ 2Q?ۨN6amiaC_n< bXT¹i֚v%^;9OفjK"IЌχڠmA:JRRLR\3at,fE00y?O3!m+iuaWB tv*!ZkU+Tkj?CL6Na0sv 33$jօvhr$\'O\#4 /}´,fFz2TNpݭ4VbA6L>X"n3=q]4se%e1.000Ę0 SU&O25s8r[9?_8?L$n]̕Bv@*!e(i6 t t>6+ l ɄgDfy*"R2Z̐ƸX+͓O#~T*!J.P2.kWhfsg3^_ax(M;|v?o;v*tt=:c$z*F@YWf9{i痙_N=fFC%oo\/]ͩ&+21>icd&w ܪ9A KKo:՝_ h-A*VjZdb0͛ZÛ1tob8H+> ?z@abOAqG.}?!0l,8f3/n(b1O>I%cMLyk4*p~)@Jub`!ުѳIJE]׿N1FoV:P*7 ԛ. 5zؖq|6NXfaZ&Zk@xO*eYu'aeb^%$xssz8K in!A%yPR]ʜYYl׵ޅDr! zm ^S ,o1@#3q9!/lW :kn1E4S#b$GH30=w} )#iM~8k'7Z[fɡо7wN1GUft]S󯒯\/pO2~- IKt*e (% 1$k:רa <>yvWߚ'aa&k_*[;"h#`Xa]`IСI/J b7}ůΡ6Zh0F0\ Ɗ),ƶh9y3q=Sl%)fTo1:kFΑh#0l'Np/?fjnzsdSO_%Ә®I0PF'T'4WVaZL@P!ѳFXf`yE>=k]V*ԻDaVءD˽9֗QuX"BIŘސ@1P]a}bd?!"@'TC"|-x$L/Cɥ7HזCJ2\< Q~?".︼ >t>F8;gm"a fmtl&)t6-iHEw1v'•U~6pEV*{<ޕf1Q_7{m%ᵶBtM!vGΑom Ԝ W h8]eG5[3]F?}*'.Qoy_%^):ɵ Z%TAHa"AHzu9fna:pٜfC)LDDxlF Iҩu'ki4d8Sp`}v޴C|ޏz=~m1r#W^+_ڃXP*#[[KK;`*Md^|>56!z~z~ ޘ @A?V'D8ULJH>A"aJO\… :u/Av콽l Xt:xSt=WxbE֓#d;U \}ap,qi0ӕyՖ0B!Ҕy]Wܤ"+յ:FZޘmjNfsCCv +p{G5e[,f&TnQ*Q=b$""27a7W\k'[-ACĘ {{>~luWy_0zX|fizxCFW j@I Q% |?42ڂa!~$׮h.F.[חǦVN+ZyuRN@X}29/m|\93)t:48OaZ=?l!6?o}B~ lWPsH1(5'F"JznCY^ II1c^֯oN .F: ¾ܾ-:p/0np I%<*<ԳfMH 96hr=JndFDx- $;+@)Vk觗_lAi wPM5[cz5^[gJ:c‹zz+G>F-3ɡN];zy?'$Ow`aޜ՜ V Flb{z!LS A:0:3 huqIƖ5+tub,{TkJ5OΏ=f.0~~sKq'O18?}c2wÓOQ,$ Ջ+nce\-`$F"IJ1vc4J®2'OH|g/k3C5ΖP۵Gʣg˓o nԵ,N>ť>u8r/`.Z .}מMJţ7 K"* L KCq-!n5AP6#Ӕna֮0''[0;nM2Ziþ:kxc0-gϬ׻dq|)xBv بp]?V ӛ,q> ؓ@!CV7T]jq%la'A2H';!dFI t"4 h!I&^TJ'0T4B׫ĴjZl-p`HחozWr;x鹟25P%ϊ3NG L'lmv:Bkm:6,8cݴeg"4-${IR{B3P.[Ck؛ZkTzBH 枞υ~Ľn /8+Wk\Zbb4doҝćUSCazqXLwЅN@+SD#=K/` [=DsL1]sK>B Yfhp<+sy#w/f^RƳkch8p2-YNsO:~ wUvJi>ݐ{,t31Ǽ-"RI۾ILLnݞ q8r ڇmK=ۄhPkDJôwt9K=ksL)?@“ @tŲ]mm(&1_>G(W7B )RhU]Ȣ'71{9@ 7"d"朽zZ8VAJgGz&!bq57wS>hIt clo~2{,#^{~MP 6}F/,ornʛ} R bls@dHU!K!HFAz􅵧S*\~:ny$dL~t p=>LMvoV#s׭O:E3vB! צf= AeKO@Usi2 ,lX<[|yw&LPo?+tay(!ݻ9 \3B=6yp/5?2Ǡ ʩ)*GvL]138F ]+ʹAPv~=_ <>X1%HCsoW]F(k{N11? (٦'D9u-h$;[@Tlyߓ*P9 va5Tyo: 痈Ww{lI C؞|ݱlMF#6_1)vQAϰFpGS\RQx`2 M=JRB:(ճCmk*%=IJ Пx\@kؖ4ǃtA$051ҳ 3ɤ"ئF9nU%|N?֋R Fwc 5 ki s!^"K.}h9H&'Nj7ָx|TG;ʩ>B (WDzlw<,B7QJ7 xM@fGMyVc| S kAlmB! Mu l] zB|E"p[/X=glO\G=ƷoBF4C13Us2g)pn2_$+;UHy`/UKvv/rD hl{f^"I*yQ gŞ^N׍BuFcZqBJ?H{ tj&߄aJ02GYb'|3uRdk9]\\g7&y91'ӌ Ű-X"i6=UrUv;S(O`f/!$Z$5~l$PrVNhhf ->14RJݰ46 +htf遲+W蝊>69Nk;}[P42(xRj}C!ݱ *t4blM(vƯ2Cg&ǩ&pauOO3”h#awYf ۥQ& U adrX0Dlh|9-֞]jZ #IR ɫ4mK̡kĜ&+Ĝx'B)xmg;\SiR$//~!~U.;xUt̑yCQsh,zlZBGht0n;QU_v-F/X⣘V=5艶D0Eh eFtDah c] Y,UB _!d0]: s$šYPѲ$aIVY",uz3gٚ|bfZTPvĵh&696ЩT*T,;H,qLhq—]X3tRtd"w;iÌ48S4u2>4F!:fz+{;U4HzSjCKr_B)ŏw683AhAnJPg/We, ;gsthjUgcCEҐ gBM#In=GwK7Pt̡9p9V =>hLw:[9P6edADJwBt B'z!`Uʩ)ʩ)tZm|㘉N%tZvb,[SoPNM۽C-eg:(MVacdDl{>(EC %D%=gA~|M  bQo.;vzBc7>9N5hB'b{,3qu~hĢx|2;% _!_/sĨE01gГ@d)= j4g#| oF\PMh wkSN_Zǯ mB2Ȥ\| aނO|˩kًg/Q: .b*TcG~ fxچTE}j}1aj4tVNؗ"*3a2Jc{L" ]#`-d 3i1??{n{L_~L q%y.?lp#)`)$_ަRk1?7^j]xYf4UߕNV@O3S^ TYf٪t̓SznoZ$?ݍ fd15 dr L"dU{4Eۦs[h]؀ q"V!4iVϽC95P.c*caxM=twDx ;˓顠[4W 4lwҢӤQ4Ĉj8r|6r+.:Zd_ "mZX,96;Jh$g.|עaFOxlХ󣤓QΝQ3hr>_z,EP=C%Qnm@u{L |MLD::A}У)E.m0 Rm6VB!]Zt8vRzwg;"ó&vv0NQj.`ߙTR'ax*GDAʨ,0 DZN.g{UJSx]h~Md#8'i>:L60Љqp}HKύz>:wX, @Xi(Rm[=D0㘎a6qZ-BIFPIM@Q`zSK94籾BPW1;xmCq830jAt_T 2*F5Ðxbd(~", ITP:+ZJ7o|u-2,kqE]~C3_t h6he=IE/񇏗+ @h,B2BOW40hc81N-1eƷH~XmwҞ V wa4xg^054xޚ,*8y`w^)6~j>81:8qjV**5;ViV7?oo,,m=6WN) PJ=`56F|6wz-z۽x1K|[Lm~ j'Qy;"Ỳ;`ohQ5`k`:6tYylp;bLNN Q/o~>!|* Dh2p?X1dQJlyli]FEC3Du$[G5Ee]tx8ϗل`8چճo*wy Ң2HJ? {eza"fsf2mpR3gPΗ/)sA wiTy`#/oō5  1#0t X_d¢¶ YK͠IGtj 6TceunùQx+(ˈpZ(7Uʰ[TM2Z{:Ee?c$s3#}O-fVn%I|P*1\}gjg}8cGja[:B(RRe}9‚hF4wJiV*0תT }hR0;BQA"(IMX~avߣR$u:E >~pnfL/ZKgb!0((,bjj+\g(}cN)(|/X]fe7F8A t4rj3֓=8E$*%xjr%4!-RT琚P+\'KTT0P0 Ԑ"󣂅]XU |>Ro`o-*E,$냾/i42_C#2ǵ+?3/_Û%-Wq]rr%07B^m|:>Rzw~Po0 ]Ljw"4,K.:Y~L#:=aZW>uÁVC2m])HE"j2m*it>)P.6twA(io!fOUJPa0,^7x]q\G,p R()mcۑb ||M<;?(NjN6T`ikJ3BdiF-<ۓ dT9 xkVpi2p/e"+6U:>S< 0*]( 6k̛\4A&9qZT)h<3{3|׸z HjN"n>Px"._%=~O:Z-R%+Ʃ:-*'"x\@ OMǯ>O;+g]}*ɉ[`; C\bKHF nq;-8SWWӼ;щZ i" .RkQ,5 qܠeF%!LW՟t*;4A b_ͣ@Sz:g yO)5(MgwHK)}?p/R 5vǮ ;,+{ElW[AR;V)EӅ=x%$"6c0AT^ N"z(\D}_R*7h=af#_r<,0 2Q۠\8dGF~u דkG渒|zI2E4"uOD]׉ŢضǎJa. FY"[1YbQ$լ Pl&+ @xⴘT4.{Q"M`;_2C~,̉SiR^0tZ<0{/k0sHc%H-Z \*L}9/EÛ˓O@xhsLGL |N6ʴ}lP?g;!'#]19Pbc~!ҩÙ(;5Jӹ-_ MJlEQdLaf[Ga4<񫃕x <1 K:&'hF,غۿpnDeJr%k6Ehy]O("fl\S$#𳫂0ۄZ3`Ru}/V;( Ӣa}𐔨eύ剎Fi|r\9UڢZkBJ4@8zbhaq=m;5t釛RA͊qg MNblb'e/i>EG~ ~ Mzǒ n99*͠IlcMչQ5<ɿ+|)4d``' ~0$!}*XWGX`@ҩN'-JIFv;K4y,c;EL[&W< -\kw26nDޜs9 hJLy>eJm l $r$E>91|m 7(͖ϯ~'s۷n_ ;SOr K|QC>1DeCz ƅ"r8^|OϼH A-TzB =&97=x y gbu6Dw؍!d΅cO BP ⟓)3[,q`G.҈,~E1]\ :CCS<;[*>]RT(*h$R N6v=sѨ˓YRWJQ,7Y.h>g ō{w?';XwLe~ 7!BYX_Jb{mVLOq嗰z@Pu+Jf[x8ra^ٳki C`4bbY:ۤQQ2*,YYg(˸c%$(M _aǠ7+B=Mݔ0D_+Om4e$+[d F.(]% fGB_ ;pw-ҭBQ0EP e1>I Fl׮N?h2:RU`}hF@, ccܼIw'\ *Ktȹ*n"٪ {%n/Zʭkl%'qL2J&%&eN6D 4XĶ t]#0 rz{ ;_ܣXj຃rTk-"-+ A>L )_ם>J4 -]]ЎgsX{2te1zcmǔ&%u(OhYߙTҡn:q"Pй:?8SAzai5OTV͡q|\6 hFj(g&3Ql2u,3`|&ݨ7K,`|z%IJuF⁢:dE4P >/8}-HU@ҶpZ4[v?'^[Ti-36S9W]s`V~p`0K\8~uv,|iў ՚/JƈEmFA9z׍B)La\~{svrFL7|nEY䫬fR/4 0 3S~Ë\8Av8N4b6n햹p/m]Tn~-A|ˀp{Bi< $Z5B4ynLnb W3^xux3Ģ&1RӎQX*M,[Zk{alnH?;tJh8<#zh.J75kEx)n]{<bϰc:n4U|C*xN#:C @P m^:{3?7zj!bk݇;ԏ҆{NzR2 1]Oa}Pj_# %цy^ݾ+;1셫l%'Kd_`G \|μEʑ4R^u$i^2E2 T[,渷˝;lli\| >͏?Dvu/zG~ n3[h=qaSM-;KiTܹ⣜_5.[RƷXyߏ wPI(t@mǩp=C ޺~s! ,͖ǭ{[Qp; 4uq;BVR"p0;$e絭dE@)fqdzu #rf mΏY_]WMry7W[|\Q>B$@vio]'Bf0^P=U_srrxhpW>!G`_PA{D; 1f9vPX{]bt$q*i"K{|*rk?}_/i4ZB0LWJj:+|qK>bF~~Rĝ:dEHhQFYq1fOY9ϝ+#'~e|zs?}|lu ۿyϗ9N}sq6HHxߗTj-V|zswݯPoMxVXO3o"[55+/c'9bǫ[_r1ݱ+}c䨿@h 54];]C)f+rBrK ~DiB3P^AP3PBGhm ݀f 6";QmQ} رH끪s4\Aֈ1 x6ɵK|s\Xs؂W,Qx!:RTk.J)%&ECϿ*-Zo4?>#,?:aqA0ֹK{q l=. 8;q&*dkhJR Kԡ;ё8i`[+gM#JF|D+y~>Nx͗|lD֨Iԭ(53bZkXN=gSZ6u줇pmn(4̨aHd( a 6 ZMޯlj\[0Cq$|ՁAGSW2>kkh s(W.s#gsw+O | Z:[-| mD%-j?Ybuކ vHԔ fyh)4dr) lĕBW~ _Jo-CLs.=[Q'O@ڤtqB:{j00kF} fj V̴%\9x{ңGJʟ#>h'VWC(l['1qnz!'2e$6=s/)-~"7lRx jؖ'%BCQ_t2?5~Y<͠eHM3> )]f(HDx,l2,g2DljZbR W.O{w(W[DQrȤafzd"B᰹S]rclrN4bIE9;$rTA 68WXeliH)廤%ƫ XGMQqt3gD{,HScI]*v$,M~m0]$,3^%59StZͭW@2+|^$4-rᵴcN]k @/ ~ݟ] -:sVVxDfxý< ) Miϑ8i'2L&MJDN}(Psa_!vh6L6cRu+tg̱-Kq i]ؖۯۛ٫t0w.hl픨ZagW݇ {Aׂ i|.xv!2١8?{g*3PI*' !r .=훁@AVMsoƯR}}ƫܘ|l-+;wjv$0#ƍôlk2&f\qz$]M4AӌRӐ3[~8ZR%=ڟ&qhhpxh ZaH]=LPI?x$Pe$QFGeLNF:ºğ}_t<7| _`sTI5<-eݳ|"$D l&N%N]Jf1j;5.Czĝ:,S~i̞1 ]koH3|sZ߯ttM#`xfQF&ĸyw"͖p_f<ɿ.{m]טLIE ץOUiD:m|c׷o`==^bFk{y{S,uJtAlaB(ݱChJ1Qbn׷nP4Fb#\-0]d-=jf&`߂aQ 3kbD|XV)@f#1JML,%B :VM1ݵ8aOh_3 $aYFEM2dlLt2J&% CCf_z;4[_ӛ,םU>Iu}*:X\\Xȇނ,Mdvn.믂9M O3PBp$[*vSGԑ5D7ou)gܾvW r_9okKǸ`]/r\CXZۼvuK{GJv+UN > r![8g9f )B)"^omjfVOڵ2ó|6; 5+;+pq!+T$M3y,%Y˜u<7 !ư}섇]-x 3"1c.-&xEO8 bpY) Dx-1Me`E"nZRDtd"Bf>B,3n$÷}ӓܾ/h(]s쐭刹54Ph$ZU4×Cרd>k<Wsl䙟 :W7 h:|q{y.soq"٣g1RWp`Ck&ij݌)EUmOμ8װ;v/+vﰖf/>ONfwXqF渴LPHJ 5 _J8|i&>F1CRhh;P9珩_9$Tlc!7]4MC K։EL2X0e$6Tm[$bQ>Or&Y,P,7^R^_w? +r_s.5в,x啫ضZw>Y,aQ T;{GojU0|.CY^ϱz8k6tySk窾B]loO=%eGl{Z{]>f@.8Te`YQ FMbQm bQ+4 C7l52tm>}_RY/첲Q`cHZFzFǐ0V#< 3}GRC̴{岵SqeR#`1K*~JX?RAc7hbu#>Z,c?}뱺^xfݠ[mp41EUE@ -peBiFХ7u]iX$,ֵMRĤf/`T :1 TcZa0 Mz@Pܸ=y,Y*SPDh˲0bPJP|"Ss6;1|cy-VpF󀧼.qZs`aϏ1r)3d( k:U+A9ܪMV&U,Y57"/<F"f[$b6D$DCamE'<&`'Z{nnR g*5GdF;ϗ8OR(UUY,[&WQ;;FzyE V@ H{,h&0B_)թɮzWL2wR맞&U`vS5~/^{,#PW7EܩǞķ}_Q;B"tQFÔc,jģdx& 25m";0yIuNT(-e2=5j5|NPcw~|NҤZo!}t>mXOS~9hjJ,QPR~=VLcyh6u+FN0]ĔۉqFsŌjŇ29߻Xܸ=r C4B4"4}tc&%F_i>Ԁ +n%-ǣRk6 :eM"xQrmH8sgFv_v 'IU`#tq=T4tQTTnP6Mfoi.wi,7'f$nY!44 6S',1VcQ>T>y֋b09Tv!\/zOPo8 |:vmF⇚kRnꇴ |'pO'N}N;=l~ig6FLl;^tl;Pe]v44?2[ 5FM)k7$RKC&h.Fl4]J͖GP oU%!^Ҵ$!DLLS e_ `QBPf7z/lmSz F1y+PX\xa\8%mE-C@ >W7lR;OyG.缶%5;~,ەRS Szd^E]fpg k>`it:5vn&C vSL0ntXa8ZiDc}$h::PVwr;*Mk~{kVf؍8W\e _NB݊λ82|<@>Ot2S-D=lE5C_/)# tkiڑ'I4M2M";͝+ NxM.ȗ=MwH%" gbLMIΨ;ܸ^[ϠPzaЃ"hrq5O53ߡfƹ_H2,l*v{|6H֨'%n"٨" 3΃t#G)tw'bnc ۶L/TDXOOĝL!['5qzt*?󯿻wz _ݽ|>]OW}.\C?"3gk_cmP>X6;|ZwϳtvξM݌4}g!7HO}B!džMj%kBpt;#e\dyHX :+C3[#-@8A q8`ôRO>*Sb-v|ObixS;1R'6=GJ'_R6y4R*t]sDZm<_ݢRmv~oid >9߿Ш[1gY}0{+&+CX:wf-soݹ;A ;H)xx\Jk.݇4`wH4wƮpu.5+mE-*\>?Əw3i-GK|yw3b߾̓ܓJIX^57h9>gDvj°4ŒmJ*$|gBuTx=>W\E9gN`]W|pBC1P4_/:(Ծ;-6^ ,1P  z)ԛ[;r9ti՟P0"I(ˆ"S>U/o |9m~}UMGѓZ$14Fb_90fq\Y^cvUR(rjkky?l^ne3+;KTEI$ 5÷{ J$E-T1|4@81cjR(F6{q:Ҁ8`}0ەHd# υ Mhw8e$YoϿS)*lUE f(4*a~ D!Ywe@eVatЯT%luA%`9ؕYisX)<-ˋd-P)27A\Ez% $!"icDU*Z+1 إcH4-LMA89tdddy CGaR#hh!~iHAؕ%_A!Y{U./bjHts$P]6V~`LNg 6c&ik,*O"ڤs11nLG둗Xþ0cfYZ%H: up] }Iӈ, A%01Bb8HhGg p 剓~?d0ql\g$#J@c즢81`F폲:(w3rϵ*nhv9&< j$۟rp&ΐ"̐AzHD"kB:XwIAg]Y{,F=>*ꌀ*Lu6*3ןmV fO} ng+ tnhc[3׾wP'=Y{MOÓR$ZzYdPE 1_!nt~ իPH5NBCf1Hz{uy1W  >B:X9W@=u*LL'ZbzcN ji5[ rHT`zDHXy.J3[y65ul\mA,K Z#oٲc{WB&M$IfIJ\4%c$!IR4#IR$#a3Dt}A Ȕ$4{_dFi6r6e#~%qի\>!I+9(By]|F蹖_FQfg;9Ia@ jޚ+#Rv E!ү`u]s> U3:iJz[&SdYy}sY.Vqg܈T6hƊ zبpi Vad~*5`H+d] ؏9D5_y{YckaviWO yE#lPa=+wG*24tdabW.C Zg-+?U^ d"m, YJ{ H7PQ0Ԩ=q{cc4`W%`\vs<KccF6\I2 f&vr,ΞԩN3YX{cLmb(xЎDbr8{E!j5%iJ& XY]cgk:i\bijm4Rr$1nijL~h/_جt15_IJTF$i wA0~?В!(=&sLv†CXǔ6-`&ISSTa6 P jLsJ־o! \ R`&I8P.ЀB 677X]]Ν4 Vy'/qIN<4r $fQذ1>j.FxG_8U~9Z7Ox?qGܸ9FLeKP gNsy[dbr!-:^hit Vn?eĉ˾ãakW>+n%lL33p%%Trc2/ 7TJbT*W0~pC~z.2ztpϕF޶Oy'av!pAamr=D;CwIT=q r !U: d.*BfԖpqQ nT>4ƴѨ ,L^q$gỂjb!(}M][{zIv=}[[[iD^̉K,..299E>Dz41ijE3q4 $DqLdQB87@'s(Z&ZQNc&YxC ).ض5 -91CK tw.>~!+++}T*efff8}y*:Vdé(FFV;bgM50S3*MJ}7ڇ$qD$2~?(z,2F[h4Y~4 &ү[dB B"}ToP045 |4F"J w}]o4XjckGg;7B jU~ot ݁;(Qd69DZ(#o}>$kC:i#Fu&I16W;X9" QQk"vu !3Aur8B+b:4:?eT"Z#ݼ#iӯ>iL2036eұ Ǯ,yVXY!^v@CKTMf <@+SgZzjavN '8{ųVM]g< p.z{gccF8KpaGs.qKܿC [NY dH"e!4-@onȝcr9szKǘ)^i=KJֵm (f;5O?hwBVjswm^J=-O(;g:Vsl9ZS3,U)rXҌԵ28P7Qg&[; v=&S)呤(us4{l>Aq8;Ldj7C<"s(c=Ok0m A:_x^LdSMԷGF+S ЃY?#R+*PGŰogNd`:J}m.~ѵ2b!{I >vQ۬ݾܡu oz{;YC5k}ܡi PdsjqN%x8_v)( jʽ]6Œ4(%xj'iJ=K13UZ|&' Tkaȳ8T+6RIx[:WltQZ< 8~eIF8gAD?4?R5o?Tq挿2| g4\ ,} '@e8#'zo5 ϕTKLkK99kj$_R$͸}w[;Ye}^+fC !94$u=| P28eXi2gp2m#)!%lĶTUrԪ3Ef˔Kbb!0U)GTYb]yZa^Ƨ"IrIlxsUFRx[BߓYˋriS|ihs&-Viw,"BiysʶIQ.O溠5v4Nb$F)6^pF|sJqd5<@8huopm[rcvts3&*|}bem>c~w7nQ,1wujӧвSyy45l&)YR.Bo|Tjz6Tt!7u tlAڥ9~4 5rOJ)z7le߮U$F'yܦ5`hjgàP&R=~;i ZQ@ˑ^vZR((-u_9f0f;f}kQ;N噙,xlZr1721PzիWyw ޸A$IS4wX<#f^"_> aqlB9t{![;W{z(kϹXReys[pf^_WO19QR! [;->~w?XfeM8QGqfS xvJ#̑( -$D"S NЋ,u\2q>lyqQ݄,CƵR nD!UOltK49LﶯNVcKfc̉)&U K9\A)E͛׿7 ׯ_goox4ˤIJ3lКlsYV4j`\ǦRqAq{+9P~)rODwlڭwCזñw8Q%$wʄ\/ ;x62MFb e"ʲG1(VpC`L= NVv)z:jN^~⢴@Û@cI-BhJo~"@c[&M<=wHp,kq.Հ19Ӭ?+o&Io6RI-9q<޶O{(%5-vzw|nO3-R)8dd>;qRsS'gtn5IǕxwﵾ7,,vzrN+(>O3W@Y6v4u-$9-g'>'K',vVg;ܛ/0H!#g26&p(Qi'ߧGznaw(f6рƀ۫-\ۢ-ӯY n 5lR.b'OrY^z%^}U?r/wysgON3Q-#V.)QlL%)\<)8˳8urYF\[gYe6 7(H$*Ҙvq.OȆB-Rր`s}.L[ n6Q|)N->tK-',lΒdۣ j\O Z TfY)Ċm~ԫ$.;7v=Ν;/[oŹs瘝T*a۶1`}ͧ_|g <k!-W+ c0뱹ݛ .Z[Ϭp8x,-L}i_Rnok+w.AƓOAj_(k 3t|[ Qcq,XNå N_&ciw)łqS~|nKSۼ2bɍ!f^~Qꑊu?5?/0p^+N_xAN`%^/S^yfff(J8sܶ-xvKu$NMqX$IY^V9y1淿u>1+~@e8^ tl/.=fYvŻVX'O!k-U/:Iq}x՝|b3kc/ˈ?*],Hz?ϻ$[S|;{56:E<+ea5ed|kek2QjSʛۜiFv/% z–~VAj)6JK6:EvzCbP"3"YFzedcEf* IDAT"s]^[X$x~9ko'?}#j.ӥ/*Es(4=>\-]ӕ?zO4(,.Dy,O;~wj߿u'g!fc;}n3JOۙзs|ʲsyA+U4%h5L-Pq>b e;&o jOodB>x,(EaY eΞEJ]n-)zH3M)Zs,ԎqEBM>gڥY^H0M MͿ:WmQoD_QC !X+ּ2w_Vzki79S#1RwۗRAIw\Pȴ`(-tmLmܘ|nV\S;4€0uX49Sۥsizrۻݘsu%6&F"Bf 2P$Xij\]c>_RW:.fii[=yvo8^8 B0?]NP*4?.~_d<P^i%$ ~:siɴu$Ȱ0δݳݷ{0"1v+c:ŒkY(9L ^|=l!4qf,3Hl9't#/0>sJ0n!Z=RyΠO_ % Zͮ5 0QJs*ﶸ\<@9c%.;mIn/orky(yo^q,";ZvoB2qp@&X<6[֚8 Ðf6}{ 42͆gf>A*oj1GݴD_yX씜g֐:5B8FTXRs$Ek["ˍ * 47xVTIb:Jm7!`I$LS0N+Y+33Uyljr5>Ԫ%.h[TYx~|>VH8^, U<Ν!xdYFt:6[[[ܽ{mW$rf|~u= *l8vƿ3e7CG %2*ܠj{:NH컑x|lX(xif2+c7G@cQymfı2n=r/EL2*TT NNNcvf⑇1Ly?ަ8-l^<ųHOqV(V%5H!x,R|[k\棍94btL)4~b6 lq -\8]Ns#}Yh4;| _?Vl˒px7^>N6/\@e5( s8$Iuq&\o6N0 2EP'6FZ{UA #I9JVc^<4P+,8\v|9g;slu$ɖ4JmZZǙ.eɡʳDE8HzJ[(r$CeˌJWf7xsN)gdJA>aءV6]%(ԴeΥ-Lp\֫$QqQMoj) VK'ʼr15U9TZ$)[ :E8}b^/Wpף2Lb/O) `'!i}lIjgliJdG"xqƼ<\yjNWrwX>PD@gYD\ݚvc ;ǭӅ/n6%?^rJ7XmU8]d|Vk@-Ȕy`H$,e }\"L}~^p]Xqv)@h=iB$#?0P0 ii [Bב.j*gONqriZ繇h$nr:^w#M tz]> @ I{>q <,K2U+Q;o}681§[mvuz9ێG:澾 @e4!<\+\aba??ͻݗTEKhtOQPC F Pv+6+xm g۬ыҥapec~F+.evkDM5hfQy|^9h |roknVv@7(y SFN<{cU!ӂ֎8iW A)ZB{w(˶e&B)xGV/,)pAR昛.rx٩sUJkƤi^í|wWl&6j YR-~;tzDYhbeYJ9*%):'2c/2R>mOVT."w^4&''+No\c"i.F2ۢtِUiIk:Xig5A`,UM+ Hգ:}y\ߙz(i#3Ln֎Ff8=?۬5€?{Υ@p8 BjP/=P?,i \"[umƶ#i"ڝ{ZZ^L/5k-T/~rqsßo?{L6qy sTx$8ap՟OYZZ !PJE{sųڬwJTi |"%dlJU;12KMܗKiI; S)P8fyk M.,3YP*8& >|@>.maIyR,SfV{]e}K02ThvFη8P²$^]_߻F[ibO3nVG>!Kjc8eT9u4.\"?l%dR%@u3o0 u},ʞoOFgagI )p w-3T6C\ 8.|8c#/_R(~٩wnVgyI'fw.|n,86X{.iѡg7zoR.z(*ac[|k5qSAu^˙<۶ű˗YZOqkړTqkF3.&R 42ͱ ع>R\ǶżO\l<6`YrHZ0jGjG_f!{V7鲳קݍ I:kslKsݏ273Ae\tkܸNFO-1O<>I-dF1q@^iw6KG\Zĥnj:W?[em}FŽп8%%mc[h!2:׵*sA <uHZض\*R={zDZŶcİO>Du5YȔ" cڝ..[6k-!nD?L %~3r8ju~un6hg(VlֻX,%4aV8q;XqOPKXz1ǎTKcz,4Sd /48ֆABdi!UG!~0 I*KBS)_c,bH ND?44S_V'O9wz|CkXo޹ε[{DwfJ6cRpOU8sbwt@qc ӊ_)|~)&'JfcWn+++\v$azz_G\p h4=Z}FO/L1~D*Iӌ$M2m@rhN6TMeh8iߓf|5,3j4Ø^@/i:4!FV;R"I_Ͻ؂c3y~SLL:@:w-!57l|E fmt-Nj䋽V{gyA:fΧ;\8w\pc>A3c Fl?B/$%bL#52[}:| >loDYhZ#瘟kx嗘!}Pm[Xec#)0~23޽{?duuu)Oo~%3gnҝYjzq#]V^v'ꘌ=N2L3rf&5G|~R1n|xef5kM`Z$)\>?'pxp?3R6*)s(NϓZsuNv/a$=۶ m:tl=gah4|_͛7>Qj"199ŋxWW^ajj %~]>?lb6W⭷b~~~T;j!M$DqBiTE1( ٮ:{My7[}(ʈ s=+ Mov3+8N~>6[F;W88ɥY\g''3c/d! ,w\B!N໒rۻਮ 9ۻvb4l5(lقw}D";1i sjkeq\VpM5gZl8tٜF3,H: a^𘋏{2ʛjظOnZښ0&b<ݽCv9v|\LV$6ԯ@W_abN ?eY})H Mv"a&!XDG4B4. ] #umvy?/rRCl C7PZp=(҅VO?4lٲpBض=9fq]r>r| 5Cgg'SДe+yfl4v+ p*T>t(B`'ô,xaY6r -ӣIgXș@:E:mvl;j>\ׇe;<\hUDXjTOj>G_E.!`EhPKh>;/ *$/_GIfeO|OlZD=ԖMrIΞAoo/z{{Na64MC<Gq\rVJ~)%VT{OCi ͧD BZ4#AMje>V,M̙hooR Cyy9`!4hӀ(̠Ht[++'0t kV" #| L>lO >Z\A.Emm-֭[ba(ƧIgП!5ꢐN0dH'tl_[&Qko :J"8Ԏ(D BZ#ja:4-@1\ r9é̜:˙Hd=KI\Ib0R&,N݌Ӕ0>`.lۙ/¬Φ߾4#Mtq= r`d"a`0R9 L w~NN4v5%Y*$롥}'z @SM`|‡jڛeX^ ZZ]Ԟ7绫A3cu q!ɇi=xiJah8Lhރ9Ӂi[gy ?&TH<xe~{WQe.MMRi 4wm@jRI)`eI%=/Lōm;Au]?Ǯ0*lXiXVQH !53-ض_(^v<'#1dNie,ڑBkG i>o)#"E "vn91Y ""ZF3fHeODD Y ""Z7/ѶG$g%"EEӤ]=BŒb2},%!"d,$|ƒb2}>=t- fޝF~h `;Q74DDL̼If^M *];o4t݈R<=JDD ڵY7)ۮ Bvm]׊'1M'RB i߼R#BpSeuA_fh!Q]X.""ZHQwv>okDD,ضcьUQEK{vX}ɛ-t36KGDD 2MjA h!o9"7XB""*d2qcLz$"B|q^#oKIDDh*v <)%DDTHC{ n?Ze,-w1o׋SyJ[/KKDD`:5 <7u]byh>uuߜt`ێWF3V%KMDDM,jt,#&M:&MDDAFMw95Z럍ze'"b4cGy:7WϲDD44>~wf47~i㙬0w͕hD?wֆ.WĶ917ͅ5C6{DDtoGF'7Iƈ0P}?}l6gp C6Cۮ;]=Qr_7a]=wvmYή}4)-шѿ`Ӻ BhճɺXԸEDD)5.=xn6NNt/mwV{wm6Ƙ?"߻kk}DDt'4>?'ߍ˻h~st L6cJ"JoYYŶw-N,jt8:Wm?.&"uu蝷z?u/?ܩ#/yfpiybn""=Cgw/wή_zsR{gssO7}}˚v0 "Z|QԱ_s ~?Zݪ_Z:87z[Ճ [~+K@$"Zx3|?͗mO}_X!"*|Ѩq|k[__ͷmߏW~it< G(JhUIENDB`tcos-0.89.93ubuntu2/HACKING.es0000664000000000000000000000424012260610261012462 0ustar ############################################### Informacion sobre modificacion de TCOS ############################################### TCOS es un conjunto de scripts que copia binarios y liberias en una imagen de arranque, es posible añadir más utilidaddes según se vayan necesitando. Usar como plantilla /etc/tcos/hacking/template Forma de añadir soporte a un programa: Ejemplo, añadir en la imagen soporte para display ( visualizador de imagenes => ImageMagick ) Crea un archivo en /etc/tcos/hacking/ ####### /etc/tcos/hacking/display ############## # script TCOS para soporte del comando display cpifexists /usr/bin/display /usr/bin ############################################## Ayudantes que podemos usar: * cpifexits [BINARIO] [RUTA_DESTINO] Copia un BINARIO dado por su ruta completa en RUTA_DESTINO dentro del initramfs Esta función copia las _dependencias_, es decir las librerías de las que depende el binario => man ldd Ejemplos: cpifexists /sbin/fdisk /sbin/ Internamente se ejecuta: $ ldd /sbin/fdisk linux-gate.so.1 => (0xffffe000) libc.so.6 => /lib/tls/libc.so.6 (0xb7e3e000) /lib/ld-linux.so.2 (0xb7f8f000) Y se copian las librerias enlazadas. NOTA: Se intentará no copiar nada que tenga que ver con /lib/tls/ Tambien se pueden copiar archivos normales: cpifexists /etc/hosts.allow /etc/ * copydir [DIR] [RUTA_DESTINO] Copia un directorio dentro de la imagen initramfs equivale a ejecutar cp -ra DIR $INITRAMFS/$DESTINO Ejemplos: copydir /etc/dropbear/ /etc/ * stat_before Crea un punto de ajuste de tamaño, vease stat_after * stat_after "TEXTO" Lee el punto de ajuste de tamaño creado por stat_before, calcula la diferencia en Kb y lo imprime por pantalla Ejemplo completo: stat_before cpifexists /usr/bin/display /usr/bin/ stat_after "ImageMagick display" Esto copia el binario (y librerías) en el initramfs y calcula el tamaño en Kb que hemos añadido a la imagen con esta accion, por lo que imprimiría por pantalla: => Package ImageMagick display get XXX Kb. tcos-0.89.93ubuntu2/udev/0000775000000000000000000000000012260610427012034 5ustar tcos-0.89.93ubuntu2/udev/050_tcos_devices.rules0000664000000000000000000000021112260610261016134 0ustar # This rule exec a script to save some udev env vars in a tmp file # SUBSYSTEM=="block", RUN+="/sbin/tcos-udevd.sh" tcos-0.89.93ubuntu2/udev/mount_listener.c0000664000000000000000000001445712260610261015256 0ustar /* * mount_listener.c poll file and get changes using a tmp file * Copyright (C) 2006,2007,2008 mariodebian at gmail * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Usage: mount-listener /proc/mounts /tmp/proc_mounts listen in changes of /proc/mounts and exec SAVE_UDEV script */ #include #include #include #include #include /* variable argument list */ #include #define MSG_BUFF 4096 #define POLL_TIMEOUT 2*1000 int snprintf(char *str, size_t size, const char *format, ...); FILE *popen(const char *cmd, const char *type); int pclose(FILE *fp); #include char *strtok(char *str, const char *delim); #include int file_exists (char * fileName) { struct stat buf; int i = stat ( fileName, &buf ); /* File found */ if ( i == 0 ) return 1; return 0; } #include void mysleep(time_t sec, long nsec){ struct timespec ourtime; ourtime.tv_sec=sec; ourtime.tv_nsec=nsec; nanosleep(&ourtime, NULL); } #define SAVE_UDEV "/usr/sbin/save-udev.sh" int found_device=0; void debug( const char *format_str, ... ) { va_list ap; va_start( ap, format_str ); va_end( ap ); vfprintf(stderr, format_str , ap); } int getnumlines( char *fname ) { FILE *fp; int lines=0; char line[MSG_BUFF]; fp=fopen(fname, "r"); if(!fp) return -1; while ( fgets(line, MSG_BUFF, fp) != NULL ) { ++lines; } fclose(fp); /*debug(" DEBUG: getnumlines of '%s' %d\n", fname, lines);*/ return lines; } void print_dev(char *txt, char *action) { char *output; char cmd[MSG_BUFF]; FILE *fp; /* use strtok to split txt with spaces */ output=strtok(txt, " "); debug("DEBUG: output \"%s %s\"\n", output, action); if ( strncmp(output , "/dev/disk/", 10) == 0 ) { debug("DEBUG: detected /dev/disk device => pam-usb IGNORING...\n"); return; } snprintf( (char*) &cmd, MSG_BUFF, "%s %s %s", SAVE_UDEV, output, action); if ( file_exists(SAVE_UDEV) ) { debug(" DEBUG: command \"%s\"\n", cmd); fp=popen(cmd, "r"); pclose(fp); } else { debug("ERROR !!! can't find %s script to exec %s\n", SAVE_UDEV, cmd); } debug(" DEBUG: End of print_dev()\n"); } void sync_files(char *fname1, char *fname2){ FILE *in, *out; char ch; if((in=fopen(fname1, "rb")) == NULL) { debug("Cannot open input file.\n"); return; } if((out=fopen(fname2, "wb")) == NULL) { debug("Cannot open output file.\n"); return; } while(!feof(in)) { ch = getc(in); if(ferror(in)) { debug("Read Error"); clearerr(in); break; } else { if(!feof(in)) putc(ch, out); if(ferror(out)) { debug("Write Error"); clearerr(out); break; } } } fclose(in); fclose(out); debug(" DEBUG: sync_files( %s => %s ) done...\n", fname1, fname2); } int compare(char *fname1, char *fname2) { int n1, n2; char lineold[MSG_BUFF]; char linenew[MSG_BUFF]; char *old, *new; FILE *fpold, *fpnew; int dev=0; char *action=""; n1=n2=0; n1=getnumlines(fname1); n2=getnumlines(fname2); if (n1 == -1 || n2 == -1) { debug("DEBUG: error reading number of lines n1=%d, n2=%d\n", n1, n2); return -1; } if (n1 == n2) { /*debug("DEBUG: warning, files have the same number of lines %d\n", n1);*/ return 1; } if (n1 > n2) { /* mount */ debug(" DEBUG: compare MOUNT, diff=%d\n", n1-n2); old=fname1; new=fname2; action="mount"; } else { /* umount */ debug(" DEBUG: compare UMOUNT, diff=%d\n", n2-n1); old=fname2; new=fname1; action="umount"; } /* open file that contain extra lines */ fpold=fopen(old, "r"); while ( fgets(lineold, MSG_BUFF, fpold) != NULL ) { dev=0; fpnew=fopen(new, "r"); while (fgets(linenew, MSG_BUFF, fpnew) != NULL ) { if ( strcmp(linenew, lineold) == 0) { /*debug(" DEBUG: linenew \"%s\"found\n", linenew);*/ dev=1; break; } } if (dev == 0) { debug(" DEBUG: lineold not found %s", lineold); print_dev(lineold, action); } fclose(fpnew); } fclose(fpold); debug(" DEBUG: end of compare() \n"); sync_files(fname1, fname2); return 0; } int main (int argc, char *argv[]) { int fd_file; struct pollfd fdarray; int rc; debug("DEBUG: *** comparing: %s <=> %s\n", argv[1], argv[2]); sync_files(argv[1], argv[2]); if ((fd_file = open(argv[1], O_RDONLY, 0)) < 0) { perror("Error opening file"); return -1; } for (;;) { fdarray.fd = fd_file; fdarray.events = POLLIN | POLLERR; rc = poll(&fdarray, 1, POLL_TIMEOUT); if (rc < 0) { perror("error reading poll() \n"); return -1; } else if(rc > 0) { /*debug(" DEBUG: Changes detected at %s rc=%d revents=%d\n", argv[1], rc, fdarray.revents);*/ mysleep(0, 2000); /* ugly hack to not eat all CPU when poll() return inmediatly */ if ( compare(argv[1], argv[2]) == 1){ /*printf(" sleeping 2 seconds \n");*/ mysleep(2, 0); } } /* poll() return 0 if no changes else { perror("ret value of poll() unknow\n"); }*/ } /* never here */ return 0; } tcos-0.89.93ubuntu2/udev/tcos-udevd.sh0000664000000000000000000000627612260610261014454 0ustar #!/bin/sh # tcos-udev.sh # exec by udevd in all block events: # SUBSYSTEM=="block" # # Copyright (C) 2006,2007,2008 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # output_file=/tmp/tcos-udevd.log # don't listen on udev events during boot # this file is created in scripts/tcos-bottom/55mount_listener if [ ! -f /var/run/tcos-udev.run ]; then exit 0 fi get_env_var() { env_var=$(env |grep ^$1=) echo $env_var } is_cdrom() { # receive hdc hda (without /dev/) cdrom=$(head -3 /proc/sys/dev/cdrom/info 2>/dev/null | tail -1 | cut -f 3- | grep -c "$1") echo $cdrom } action=$(get_env_var "ACTION") if [ "$action" = "ACTION=mount" ] || [ "$action" = "ACTION=umount" ]; then # action mount/umount not controlled by tcos-udev.sh echo "**tcos-udev.sh ** $action not processed" >> /var/log/listener-daemon.log exit 0 fi id_bus=$(get_env_var "ID_BUS") device=$(get_env_var "DEVNAME") devpath=$(get_env_var "DEVPATH") if echo $devpath | grep -q "/devices/" ; then # translate name _devpath=$(echo "$devpath" | awk -F"/block" '{print "DEVPATH=/block"$2}') echo "tcos-udevd.sh OLD ==>$devpath" >> /var/log/listener-daemon.log echo "tcos-udevd.sh NEW ==>$_devpath" >> /var/log/listener-daemon.log devpath=$_devpath fi blockname=$(echo $devpath | awk -F"/" '{print $3}') part=$(echo $device | awk -F"/" '{print $3}') if [ $(echo $DEVNAME | grep -c "/dev/loop") != 0 ]; then exit 0 fi if [ $(echo $DEVNAME | grep -c "/dev/ram") != 0 ]; then exit 0 fi label="ID_FS_LABEL="$(get_env_var "ID_FS_LABEL_SAFE"| awk -F"=" '{print $2}') fs_type=$(get_env_var "ID_FS_TYPE") if [ "$fs_type" = "ID_FS_TYPE=" ] || [ "$fs_type" = "" ]; then fs=$(get_filesystem "${device#DEVNAME=}" --only) if [ "$fs" != "auto" ] && [ "$fs" != "" ] && [ "$fs" != "unknow" ] && [ "$fs" != "error, need device" ] ; then fs_type="ID_FS_TYPE=$fs" fi fi if [ "$(is_cdrom $part)" = 1 ]; then fs_type=$(cd_type "${device#DEVNAME=}") fi vendor=$(get_env_var "ID_VENDOR") model=$(get_env_var "ID_MODEL") if [ "$vendor" = "ID_VENDOR=" ] || [ "$vendor" = "" ]; then vendor="ID_VENDOR="$(cat $(dirname $(find /sys/class/scsi_disk/*/device/ -name "block:$blockname") 2>/dev/null)/vendor 2>/dev/null | sed 's/ //g') fi if [ "$model" = "ID_MODEL=" ] || [ "$model" = "" ]; then model="ID_MODEL="$(cat $(dirname $(find /sys/class/scsi_disk/*/device/ -name "block:$blockname") 2>/dev/null)/model 2>/dev/null | sed 's/ //g') fi echo "$id_bus#$device#$action#$label#$fs_type#$vendor#$model#$devpath" >> $output_file exit 0 tcos-0.89.93ubuntu2/udev/cdrom-mount0000664000000000000000000000317512260610261014225 0ustar #!/bin/sh # # Daemon to generate UDEV event of insert CDROM/DVD # # [ ! -x /sbin/blkid ] && exit 0 # detect CDROM CDROM=$(devicesctl.sh --getcdrom| awk -F"|" '{print $1}') [ "$CDROM" = "" ] && exit 0 CDROM="/dev/$CDROM" # seconds in loop TIMEOUT=3 UDEVINFO="/usr/bin/udevinfo" output_file="/tmp/tcos-udevd.log" [ -x /sbin/udevadm ] && UDEVINFO="/sbin/udevadm info" # blkid -p /dev/cdrom # STDOUT error: /dev/cdrom: No medium found # RETURN VALUE 2 # # **INSERT MEDIA** example # STDOUT /dev/cdrom: LABEL="MaX 6.0" TYPE="iso9660" USAGE="filesystem" # RETURN VALUE 0 # run in foreground while [ 1 ]; do OUTPUT=$(/sbin/blkid -p $CDROM 2>&1) RETURN=$? #echo "cdrom-mount OUTPUT='$OUTPUT' RETURN='$RETURN'" if [ "$RETURN" = "0" ]; then export $($UDEVINFO --name=$CDROM --query=env | grep -v "^DEVLINKS" | sed 's/[[:blank:]]/_/g') export ACTION=add if echo $DEVPATH | grep -q "/devices/" ; then # translate name _devpath=$(echo "$DEVPATH" | awk -F"/block" '{print "/block"$2}') DEVPATH=$_devpath fi if [ "$ID_FS_LABEL" = "" ]; then # if no label CDROM is detecting... continue fi if [ -f /tmp/cdrom-mount ] && [ "$ID_FS_LABEL" = "$(cat /tmp/cdrom-mount)" ]; then echo "$ID_FS_LABEL mounted" >/dev/null else echo "ID_BUS=$ID_BUS#DEVNAME=$DEVNAME#ACTION=$ACTION#ID_FS_LABEL=$ID_FS_LABEL#ID_FS_TYPE=$ID_FS_TYPE#ID_VENDOR=$ID_VENDOR#ID_MODEL=$ID_MODEL#DEVPATH=$DEVPATH" >> $output_file fi # save a lock file with $ID_FS_LABEL echo "$ID_FS_LABEL" > /tmp/cdrom-mount else # RETURN != 0 # clean lock file rm -f /tmp/cdrom-mount fi sleep $TIMEOUT done tcos-0.89.93ubuntu2/udev/Makefile0000664000000000000000000000124512260610261013472 0ustar all: mount-listener include ../common.mk mount-listener: $(QUIET_CC)$(GCC) -Wall $(CFLAGS) $(LDFLAGS) -o mount-listener mount_listener.c install: install -d $(DESTDIR)$(TCOS_XMLRPC_DIR) install -d $(DESTDIR)$(TCOS_BINS) install -m 755 tcos-udevd.sh $(DESTDIR)$(TCOS_BINS)/ install -m 755 mount-listener $(DESTDIR)$(TCOS_BINS)/ install -m 755 listener-daemon.sh $(DESTDIR)$(TCOS_BINS)/ install -m 755 save-udev.sh $(DESTDIR)$(TCOS_BINS)/ install -m 755 cdrom-mount $(DESTDIR)$(TCOS_BINS)/ install -m 644 050_tcos_devices.rules $(DESTDIR)$(TCOS_XMLRPC_DIR)/ clean: $(QUIET_CL)rm -f *.pyc *~ mount-listener proc_mounts tcos-0.89.93ubuntu2/udev/save-udev.sh0000664000000000000000000000501712260610261014266 0ustar #!/bin/sh # Copyright (C) 2006,2007,2008 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # enable_debug=1 output_file=/tmp/tcos-udevd.log UDEVINFO="/usr/bin/udevinfo" [ -x /sbin/udevadm ] && UDEVINFO="/sbin/udevadm info" debug() { [ $enable_debug = 1 ] && echo " ** DEBUG (listener-daemon): $@" >&2 } is_cdrom() { # receive hdc hda (without /dev/) cdrom=$(head -3 /proc/sys/dev/cdrom/info 2>/dev/null | tail -1 | cut -f 3- | grep -c "$1") echo $cdrom } #/dev/sda1 mount DEVNAME=$1 ACTION=$2 debug "$@" PART=$(echo "$DEVNAME" | awk -F"/" '{print $3}') DISK=$(echo "$PART" | cut -c-3) DEVPATH="/block/$DISK" [ "$PART" != "$DISK" ] && DEVPATH="/block/$DISK/$PART" [ -n "$DEVNAME" ] && [ -e $DEVNAME ] && export $($UDEVINFO --path=/sys$DEVPATH --query=env | grep -v "^DEVLINKS" | sed 's/[[:blank:]]/_/g') if echo $DEVPATH | grep -q "/devices/" ; then # translate name _devpath=$(echo "$DEVPATH" | awk -F"/block" '{print "/block"$2}') debug "save-udev.sh OLD ==>$DEVPATH" debug "save-udev.sh NEW ==>$_devpath" DEVPATH=$_devpath fi if [ "$ID_FS_LABEL_SAFE" ]; then ID_FS_LABEL=$ID_FS_LABEL_SAFE fi if [ "$(is_cdrom $PART)" = 1 ]; then ID_FS_TYPE=$(cd_type $DEVNAME) fi if [ -z $ID_VENDOR ]; then ID_VENDOR=$(cat $(dirname $(find /sys/class/scsi_disk/*/device/ -name "block:$DISK" 2>/dev/null) 2>/dev/null)/vendor 2>/dev/null | sed 's/ //g') fi if [ -z $ID_MODEL ]; then ID_MODEL=$(cat $(dirname $(find /sys/class/scsi_disk/*/device/ -name "block:$DISK" 2>/dev/null) 2>/dev/null)/model 2>/dev/null | sed 's/ //g') fi echo "ID_BUS=$ID_BUS#DEVNAME=$DEVNAME#ACTION=$ACTION#ID_FS_LABEL=$ID_FS_LABEL#ID_FS_TYPE=$ID_FS_TYPE#ID_VENDOR=$ID_VENDOR#ID_MODEL=$ID_MODEL#DEVPATH=$DEVPATH" >> $output_file debug "ID_BUS=$ID_BUS#DEVNAME=$DEVNAME#ACTION=$ACTION#ID_FS_LABEL=$ID_FS_LABEL#ID_FS_TYPE=$ID_FS_TYPE#ID_VENDOR=$ID_VENDOR#ID_MODEL=$ID_MODEL#DEVPATH=$DEVPATH" exit 0 tcos-0.89.93ubuntu2/udev/listener-daemon.sh0000664000000000000000000000213712260610261015455 0ustar #!/bin/sh # # Launch /usr/sbin/mount-listener (see if /proc/mounts changes) # and generate a udev mount/umount event # # Copyright (C) 2006,2007,2008 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # MOUNT_LISTENER=/usr/sbin/mount-listener MOUNTS=/proc/mounts LAST_MOUNTS=/tmp/proc_mounts while [ 1 ]; do $MOUNT_LISTENER $MOUNTS $LAST_MOUNTS echo "******* Something wrong happen mount-listener died ******* restarting..." done tcos-0.89.93ubuntu2/conf/0000775000000000000000000000000012260610427012016 5ustar tcos-0.89.93ubuntu2/conf/branding.info0000664000000000000000000000126512260610261014457 0ustar # # # BRANDING info for TCOS # # # You can change some default settings in TCOS creating a file # in /etc/tcos/conf.d/ dir # # # Files allowed: # # tcos*.conf # Overwrite /etc/tcos/tcos.conf settings # # Examples: # # 1.- Overwrite TFTP image # # Create /etc/tcos/conf.d/tftp_image with this content # # TFTP_MSG=xxxxx.msg # # this file must be in /var/lib/tcos/tftp/xxx.msg # and must contain a .lss logo (use tcos.msg as template) # # # # session-cmd* # Overwrite default session-cmd-exec settings # Vars: # TITLE # ICON_FILE # LOGOUT_TIMEOUT # LOGOUT_MESSAGE # # If you want to brand another file, please tell me # tcos-0.89.93ubuntu2/conf/tcos-generation-functions.sh0000664000000000000000000002217612260610261017465 0ustar # vars # Copyright (C) 2006,2007,2008 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # functions used by tcos hooks _ldd () { # wrapper to ldd LC_ALL=C ldd $@ 2>/dev/null || return 1 return 0 } _echo () { # wrapper to echo in scripts echo "$@" } _debug() { if [ ${TCOS_DEBUG} ]; then echo " DEBUG :: $@" >&2 fi } _verbose() { if [ ${TCOS_VERBOSE} ]; then echo "## VERBOSE ## '$@'" >&2 fi } _warning() { # always show echo "## WARNING ## '$@'" >&2 } read_template() { [ ! -e "$1" ] && return tpl=$(awk -F"=" '/^TCOS_TEMPLATE=/ {print $2}' $1) if [ "$tpl" = "" ]; then _verbose "(t-g-f) Not found TEMPLATE in $1, searching BASED_TEMPLATE" tpl=$(awk -F"=" '/^TCOS_BASED_TEMPLATE=/ {print $2}' $1) fi [ "$tpl" = "" ] && _warning "(t-g-f) template don't have TCOS_TEMPLATE or TCOS_BASED_TEMPLATE. BUG???" && return #_debug "Template $tpl" for tdir in ${TCOS_DIR}/templates /etc/tcos/templates; do _verbose "(t-g-f) Searching in dir $tdir" [ -f $tdir/$tpl ] && echo "$tdir/$tpl" && break done } tcos_get_templates() { # read template from tcos.conf tpl1=$(read_template /etc/tcos/tcos.conf) tpl2="" personalized="" _verbose "(t-g-f) Default template $tpl" for tfile in $(find /etc/tcos/templates -type f -name "*.conf"); do if [ -f $tfile ]; then #_debug "$tfile file exists, adding to tpl2" tpl2="$tpl2 $(read_template $tfile)" personalized=$tfile else _verbose "(t-g-f) Based template $tfile not found, ignoring" fi done if [ "$( echo $tpl2 | sed 's/[[:blank:]]//g' )" != "" ]; then _verbose "(t-g-f) return tpl2='base.conf $tpl2 $personalized'" echo "${TCOS_DIR}/templates/base.conf $tpl2 $personalized" else _verbose "(t-g-f) return tpl1='base.conf $tpl1'" echo "${TCOS_DIR}/templates/base.conf $tpl1" fi } convert_links2files () { # convert all links in $DESTDIR to linked files # needed to calculate initramfs space #_echo "Converting links to files..." subdir=$1 if [ "$subdir" = "" ]; then subdir="usr" fi dir=$(pwd) cd $DESTDIR # copy binary not links for xfile in $(find "$subdir" -type l); do _link=$(readlink $xfile) if [ $(echo $_link | grep -c ${TCOS_PKG_CACHE}) != 0 ]; then rm -f $DESTDIR/$xfile cp -f $_link $DESTDIR/$xfile #_echo " ******** convert_link2files() CACHED FILE => cp -f $_link $DESTDIR/$xfile" elif [ -f /$xfile ] ;then rm -f $DESTDIR/$xfile cp -f /$xfile $DESTDIR/$xfile #_echo " ::::::: convert_link2files() :::::A:::: cp /$xfile $DESTDIR/$xfile" else #_echo " convert_links2files() " rm -f $DESTDIR/$xfile cp -f $_link $DESTDIR/$xfile #_echo " ::::::: convert_link2files() :::::R:::: cp -f $_link $DESTDIR/$xfile" fi done cd $dir } stat_before () { # read space in $DESTDIR (this functions is a checkpoint) size1=$(du -s ${DESTDIR} 2>/dev/null| awk '{print $1}') } stat_after () { # read size after checkpoint and prints diff between disk space # this give what space need an app convert_links2files size2=$(du -s ${DESTDIR} 2>/dev/null| awk '{print $1}') #diff_size=$(echo $((size2 -size1)) ) diff_size=$(echo $size2 $size1 | awk '{print $1 - $2}' ) if [ ${TCOS_DEBUG} ]; then _echo " Package $1 got ${diff_size} Kb." fi } pathof() { # give absolute path of $1 binary (if found) location=$(which $1 | awk '{print $1}') if [ -z $location ]; then location=$(whereis $1 | awk '{print $2}') fi if [ ! -e $location ]; then echo "pathof() ERROR $1 not found !!!" 1>&2 fi echo $location } cpifexists () { orig=$1 dest=$2 if [ -f $DESTDIR/$orig ]; then return 1 fi if [ $# != 2 ]; then echo " cpifexists(): ERROR: Need 2 arguments: \$1=$orig \$2=$dest" return 1 fi if [ ! -f $orig ]; then echo " cpifexits() WARNING: $orig not found, searching with pathof()..." _file=$(pathof $(basename $orig) ) if [ "$_file" = "" ]; then echo " cpifexists(): ERROR $orig not found in PATH, please install package that contain $orig." return 1 elif [ -f "$_file" ]; then echo " cpifexists(): FIXED: $(basename $orig) found in other path: $_file, using it!!!" orig=$_file else echo " cpifexists(): ERROR: $(basename $orig) no found in PATH, please package that contain $orig" return 1 fi fi if [ ! -d $DESTDIR/$dest ]; then echo " cpifexits() WARNING: $DESTDIR/$dest don't exists" fi copy_exec "${orig}" "${dest}" return 0 } copydir () { if [ $# != 2 ]; then echo "copydir() ERROR Need 2 arguments: \$1=$1 \$2=$2" #_echo " DEBUG: \$1=$1 \$2=$2" return 1 fi if [ ! -d $1 ]; then echo "copydir() WARNING $1 dir not exits" #_echo " DEBUG: \$1=$1 \$2=$2" return 1 fi #_echo "cp -ra \"${1}\" \"${DESTDIR}/${2}\"" cp -ra "${1}" "${DESTDIR}/${2}" return 0 } read_env_var() { # read from env var tmpvar=$(env| grep "^$1=" | awk -F "=" '{print $2}') if [ "$tmpvar" = "" ]; then echo "$2" else echo $tmpvar fi } # ubuntu dapper have very old manual_add_modules that don't work correctly tcos_manual_add_modules() { for mam_x in $(modprobe --set-version="${version}" --ignore-install \ --show-depends "${1}" 2>/dev/null | awk '/^insmod/ { print $2 }'); do # Prune duplicates if [ -e "${DESTDIR}/${mam_x}" ]; then continue fi mkdir -p "${DESTDIR}/$(dirname "${mam_x}")" ln -s "${mam_x}" "${DESTDIR}/$(dirname "${mam_x}")" if [ -n "${verbose}" ] && [ "${verbose}" = "y" ]; then echo "Adding module ${mam_x}" fi done } force_add_module() { # force copy of module modprobe dont show as dependency this_module=$(modprobe --set-version="${version}" -l "${1}") if [ ! -e "${DESTDIR}/${this_module}" ]; then #echo " WARNING, adding module $(basename ${this_module}), see Debian bug: #384043" mkdir -p "${DESTDIR}/$(dirname "${this_module}")" ln -s "${this_module}" "${DESTDIR}/$(dirname "${this_module}")" fi # end of force copy } tcos_find_module() { mod=$(find /lib/modules/${TCOS_KERNEL} -name ${1}.ko | tail -1) if [ "$mod" = "" ] ; then return 1 fi if [ "$(basename $mod .ko)" = "$1" ]; then return 0 fi return 1 } parse_pxelinuxcfg() { if [ $TCOS_NETBOOT_MENU ] && [ -z $2 ]; then TEMPLATE=${TCOS_CONF}/${TCOS_PXECFG_MENU} _verbose "(t-g-f) BOOT_MENU=1" else TEMPLATE=${TCOS_CONF}/${TCOS_PXECFG} _verbose "(t-g-f) BOOT_MENU=0" fi if [ $TCOS_NETBOOT_MENU_VESA ]; then TCOS_MENU_TYPE=vesamenu.c32 else TCOS_MENU_TYPE=menu.c32 fi if [ $TCOS_NETBOOT_HIDE_INSTALL ]; then TCOS_NETBOOT_HIDE_INSTALL_STRING="" else TCOS_NETBOOT_HIDE_INSTALL_STRING="#" fi if [ $TCOS_NETBOOT_HIDE_LOCAL ]; then TCOS_NETBOOT_HIDE_LOCAL_STRING="" else TCOS_NETBOOT_HIDE_LOCAL_STRING="#" fi if [ "$1" != "" ]; then DESTFILE=$1 else DESTFILE=${TFTP_DIR}/pxelinux.cfg/default fi echo "## Generated file don't edit, edit $TEMPLATE instead" > ${DESTFILE} echo "## File generated by gentcos on $(date)" >> ${DESTFILE} cat ${TEMPLATE} >> ${DESTFILE} if [ -d /etc/tcos/conf.d/ ]; then if [ $TCOS_NETBOOT_MENU ] && [ -z $2 ]; then for i in /etc/tcos/templates/pxelinux.menu*.tpl; do [ -e $i ] && cat $i >> ${DESTFILE} done else for i in /etc/tcos/templates/pxelinux.nomenu*.tpl; do [ -e $i ] && cat $i >> ${DESTFILE} done fi fi sed -i -e "s/__TCOS_KERNEL__/${TCOS_KERNEL}/g"\ -e "s/__DATE__/$(date)/g" \ -e "s/__TCOS_MENU_TYPE__/${TCOS_MENU_TYPE}/g" \ -e "s/__TCOS_NETBOOT_HIDE_INSTALL__/${TCOS_NETBOOT_HIDE_INSTALL_STRING}/g" \ -e "s/__TCOS_NETBOOT_HIDE_LOCAL__/${TCOS_NETBOOT_HIDE_LOCAL_STRING}/g" \ -e "s/__TCOS_MENU_PASSWD__/${TCOS_ROOT_PASSWD}/g" \ -e "s/__TFTP_LOGO_JPG__/${TFTP_LOGO_JPG}/g" \ -e "s/__TFTP_MSG_HELP1__/${TFTP_MSG_HELP1}/g" \ -e "s/__TFTP_MSG_HELP2__/${TFTP_MSG_HELP2}/g" \ -e "s/__TFTP_MSG__/${TFTP_MSG}/g" ${DESTFILE} _verbose "(t-g-f) MENU_FILE=$(cat ${DESTFILE})" if [ -d /etc/tcos/pxelinux.d ]; then for f in /etc/tcos/pxelinux.d/*.hook ; do . $f || true done fi } tcos-0.89.93ubuntu2/conf/tcos.conf.light0000664000000000000000000000066212260610261014743 0ustar # TEMPLATE_DESCRIPTION="Disabled USB, sound, IDE, SATA, with tcosmonitor enabled" TEMPLATE_DESCRIPTION_ES="Desactivado USB, sonido, dispositivos IDE o SATA, con tcosmonitor activado" TCOS_XORG_OPENGL= TCOS_XORG_ALLDRIVERS= TCOS_USPLASH= TCOS_DISABLE_USPLASH=1 TCOS_SOUND_ISA= TCOS_SOUND= TCOS_PULSEAUDIO= TCOS_REMOTEFS= TCOS_DISABLE_USB=1 TCOS_DISABLE_IDE=1 TCOS_USB= TCOS_PRINTER= TCOS_INSTALLER= TCOS_SSH= TCOS_DEBUG_TOOLS= tcos-0.89.93ubuntu2/conf/xorg.conf.tpl0000664000000000000000000001174112260610261014442 0ustar # xorg.conf (Xorg X Window System server configuration file) # # This file was generated by dexconf, the Debian X Configuration tool, using # values from the debconf database. # # Edit this file with caution, and see the xorg.conf manual page. # (Type "man xorg.conf" at the shell prompt.) # # This file is automatically updated on xserver-xorg package upgrades *only* # if it has not been modified since the last upgrade of the xserver-xorg # package. # # FILE generated by configurexorg at __date__ # # If you have edited this file but would like it to be automatically updated # again, run the following commands as root: # # cp /etc/X11/xorg.conf /etc/X11/xorg.conf.custom # md5sum /etc/X11/xorg.conf >/var/lib/xfree86/xorg.conf.md5sum # dpkg-reconfigure xserver-xorg Section "Files" ModulePath "/usr/lib/xorg/modules/" FontPath "/usr/share/X11/fonts/misc" FontPath "/usr/share/X11/fonts/100dpi" __enable_font_server__ FontPath "unix/:7100" # local font server __enable_font_server__ FontPath "tcp/__xfontserver__:7101" # Truetype xfstt fonts EndSection Section "Module" Load "bitmap" Load "dbe" Load "ddc" Load "dri" Load "extmod" Load "glx" Load "int10" Load "record" Load "vbe" EndSection __xkbdenable__Section "InputDevice" __xkbdenable__ Identifier "Generic Keyboard" __xkbdenable__ Driver "kbd" __xkbdenable__ Option "CoreKeyboard" __xkbdenable__ Option "XkbRules" "xorg" __xkbdenable__ Option "XkbModel" "__xkbmodel__" __xkbdenable__ Option "XkbLayout" "__xkbmap__" __xkbdenable__EndSection __xevdevenable__Section "InputDevice" __xevdevenable__ Identifier "Generic Keyboard" __xevdevenable__ Driver "evdev" __xevdevenable__ Option "Device" "/dev/input/keyboard" __xevdevenable__ Option "CoreKeyboard" __xevdevenable__ Option "XkbRules" "xorg" __xevdevenable__ Option "XkbModel" "__evdevmodel__" __xevdevenable__ Option "XkbLayout" "__xkbmap__" __xevdevenable__EndSection Section "InputDevice" Identifier "Serial Mouse0" Driver "mouse" Option "SendCoreEvents" Option "Device" "/dev/ttyS0" Option "Protocol" "Microsoft" Option "Emulate3Buttons" "true" EndSection Section "InputDevice" Identifier "Serial Mouse1" Driver "mouse" Option "SendCoreEvents" Option "Device" "/dev/ttyS1" Option "Protocol" "Microsoft" Option "Emulate3Buttons" "true" EndSection Section "InputDevice" Identifier "Configured Mouse" Driver "mouse" Option "CorePointer" Option "Device" "__xmousedev__" __xmousenowheel__ Option "Protocol" "__xmouseprotocol__" __xmousewheel__ Option "Protocol" "__xmouseprotocol__" __xmousewheel__ Option "Emulate3Buttons" "true" __xmousewheel__ Option "ZAxisMapping" "4 5" EndSection __enable_xdriver_fullautodetect__Section "Device" __enable_xdriver_fullautodetect__ Identifier "Generic Video Card" __enable_xdriver_fullautodetect__ Driver "__xdriver__" __enable_xdriver_fullautodetect__ __xdriver_via__ Option "EnableAGPDMA" __enable_xdriver_fullautodetect__ __xdriver_via__ Option "DisableIRQ" __enable_xdriver_fullautodetect__ __xdriver_via__ #Option "VBEModes" "true" __enable_xdriver_fullautodetect__ __xdriver_via__ #Option "VBERestore" "true" __enable_xdriver_fullautodetect__EndSection Section "Monitor" Identifier "Generic Monitor" __xdpms__ Option "DPMS" __enable_xdriver_fullautodetect__ __disablesync__ HorizSync __xhorizsync__ __enable_xdriver_fullautodetect__ __disablesync__ VertRefresh __xvertsync__ __enable_xdriver_fullautodetect__ __xdriver_amd__ UseModes "Cimarron" EndSection __usemodes__ Section "Screen" Identifier "Default Screen" Device "Generic Video Card" Monitor "Generic Monitor" DefaultDepth __xdepth__ SubSection "Display" Viewport 0 0 Depth __xdepth__ __enable_xdriver_fullautodetect__ Modes "__xres__" "1024x768" "800x600" "640x480" EndSubSection EndSection Section "ServerLayout" Option "AutoAddDevices" "off" # HAL disabled Identifier "Default Layout" Screen "Default Screen" InputDevice "Generic Keyboard" InputDevice "Configured Mouse" InputDevice "Serial Mouse0" InputDevice "Serial Mouse1" EndSection Section "DRI" Mode 0666 EndSection __enable_composite__Section "Extensions" __enable_composite__ Option "Composite" "Disable" __enable_composite__EndSection #Section "ServerFlags" # Option "blank time" "0" # # # DPMS options # Option "standby time" "5" # Option "suspend time" "10" # Option "off time" "0" #EndSection __dontzap__ #xdriver=__xdriver__ #xres=__xres__ #xdepth=__xdepth__ #xhorizsync=__xhorizsync__ #xvertsync=__xvertsync__ #disablesync=__disablesync__ #xrefresh=__xrefresh__ #xmousedev=__xmousedev__ #xmouseprotocol=__xmouseprotocol__ #xmousenowheel=__xmousenowheel__ #xmousewheel=__xmousewheel__ #xdpms=__xdpms__ #xfontserver=__xfontserver__ #enablefontserver=__enable_font_server__ #enablexdriverfullautodetect=__enable_xdriver_fullautodetect__ #xdontzap=__xdontzap__ #xdriver_via=__xdriver_via__ #xkbmap=__xkbmap__ #xkbmodel=__xkbmodel__ tcos-0.89.93ubuntu2/conf/80export_pulseaudio0000664000000000000000000000137712260610261015670 0ustar # $Id:$ # Startup script for export_pulseaudio # if [ -f /usr/share/pyshared/tcosmonitor/shared.py ]; then DISPLAY_HOST=$(python /usr/share/pyshared/tcosmonitor/shared.py "$DISPLAY" 2>/dev/null) else DISPLAY_HOST=$(python -c 'import os; import tcosmonitor.shared; print tcosmonitor.shared.parseIPAddress(os.environ["DISPLAY"])') fi if [ ! -z "${DISPLAY_HOST}" ]; then # export PulseAudio server export PULSE_SERVER="${DISPLAY_HOST}" ## don't export ESPEAKER VAR, eats a lot of bandwich if detected # export again, wine don't like alsa and OSS is not stable export ESPEAKER="${DISPLAY_HOST}" # FIXME load spanish kbmap #if [ -x /usr/bin/xmodmap ] && [ -e /usr/share/xmodmap/xmodmap.es ] ; then # xmodmap /usr/share/xmodmap/xmodmap.es #fi fi tcos-0.89.93ubuntu2/conf/tcos.conf.all0000664000000000000000000000043412260610261014401 0ustar # template enabling all recomended features TEMPLATE_DESCRIPTION="Enabled most of features" TEMPLATE_DESCRIPTION_ES="Activadas la mayoría de las características" TCOS_DEBUG_TOOLS=1 TCOS_XORG_ALLDRIVERS=1 TCOS_XORG_OPENGL=1 TCOS_PRINTER=1 TCOS_X11VNC=1 TCOS_INSTALLER=1 TCOS_DBUS=1 tcos-0.89.93ubuntu2/conf/tcos-run-functions.sh0000664000000000000000000001701012260610261016125 0ustar # vars # Copyright (C) 2006,2007,2008 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # dir of download or used to mount througt NFS download_dir=/mnt/tmp # NFS server dir nfs_dir=${TCOS_VAR}/tftp ########################################### # functions in reboot and poweroff wrappers wait_for() { # enter in infinite loop waiting for file dir or anything # $1 = file or dir # $2 = [d f] type of $1 while [ ! -$2 $1 ]; do /sbin/udevtrigger sleep 1 done } kill_xorg() { log_begin_msg "Killing Xorg" killall tryXorg >/dev/null 2>&1 killall Xorg >/dev/null 2>&1 log_end_msg $? } kill_all() { # FIXME better scan ps output process="ltspfsd p9100 pulseaudio ivs dhclient dropbear tcosxmlrpc" for proc in ${process}; do log_begin_msg "Stopping ${proc}" killall $proc > /dev/null 2>&1 & log_end_msg $? done # kill all with -9 for proc in ${process}; do log_begin_msg "Force kill ${proc}" killall -9 $proc > /dev/null 2>&1 & log_end_msg $? done } umount_swap() { log_begin_msg "Disable swap" swapoff -a log_end_msg $? } umount_all() { log_begin_msg "Umounting all" devices=$(grep -v ^none /proc/mounts | awk '{if ($2 != "" && $2 != "/dev" && $2 != "/dev/shm" && $2 != "/") print $2}') # Soft umount for dev in ${devices}; do #echo "Umount ${dev}" umount ${dev} > /dev/null 2>&1 done # Force umount for dev in ${devices}; do #echo "Force umount ${dev}" umount -l ${dev} > /dev/null 2>&1 done log_end_msg $? } # common functions used in tcos scripts if_is_zero() { # $1 file if [ ! -f $1 ]; then _log "FUNCTIONS $1 no exists" echo 0 return fi size=$(ls -l ${1} | awk '{print $5}') _log "FUNCTIONS size of $1 is ${size}" echo ${size} } _log () { /bin/logger -t "$(echo $1| awk '{print $1}')" "$@" >> /tmp/initramfs.debug 2>&1 } tcos_find_module() { mod=$(find /lib/modules/${version} -name ${1}.ko | tail -1) if [ "$mod" = "" ] ; then return 1 fi if [ "$(basename $mod .ko)" = "$1" ]; then return 0 fi return 1 } read_server() { # $1 is server hostname nSERVER=$(grep "$1" /etc/hosts | awk '{print $1}' | head -1) if [ "${nSERVER}" = "" ]; then nSERVER=$(get_server) fi echo "${nSERVER}" } get_server() { if [ ${TCOS_FORCE_SERVER} ]; then echo ${TCOS_FORCE_SERVER} return fi # read server ip address from dhcp if [ ! -e /tmp/net.data ]; then clear panic "Error, network not configured, check your DHCP server / DNSMASQ conf." fi SERVER=$(awk -F"=" '/^serverid=/ {print $2}' /tmp/net.data) # overwrite with cmdline # DOCUMENTME server | ip of XDMCP server SERVER=$(read_cmdline_var "server" "${SERVER}") echo "${SERVER}" } download_file () { # $1 remote file # $2 local file mkdir $(dirname $2) >/dev/null 2>&1 _log "tftp -g -r ${1} -l ${2} "$(read_server "tftp-server") tftp -g -r ${1} -l ${2} $(read_server "tftp-server") > /dev/null 2> /tmp/download_file.log if [ $? = 0 ] ;then _log "download_file() OK" rm -f /tmp/download_file.log return 0 else _log "download_file() Error" cat /tmp/download_file.log >> /tmp/initramfs.debug 2> /dev/null rm -f /tmp/download_file.log return 1 fi } read_cmdline_var() { # read cmdline and print to stdout var value if found # $1 var name # $2 var default value unset var for x in $(cat /proc/cmdline); do case $x in $1=*) var=${x#$1=} ;; $1) var=1 ;; esac done if [ ! -z ${var} ]; then echo "${var}" _log "read_cmdline() reading $1 cmdline=${var}" else echo "${2}" _log "read_cmdline() reading $1 default=${2}" fi } stat_before () { # read space in $DESTDIR (this functions is a checkpoint) size1=$(du -s ${DESTDIR} 2>/dev/null| awk '{print $1}') } stat_after () { # read size after checkpoint and prints diff between disk space # this give what space need an app convert_links2files size2=$(du -s ${DESTDIR} 2>/dev/null| awk '{print $1}') diff_size=$(echo $((size2 -size1)) ) if [ ${TCOS_DEBUG} ]; then _echo "Package $1 get ${diff_size} Kb." fi } mount_aufs() { ramdisk=$1 rofs=$2 rwfs=$3 # # example: # mount_aufs /mnt/ram /.usr /usr # RAM RO RW # _log "AUFS Creating ramdisk ${ramdisk} of 2 Mb" mkdir -p ${ramdisk} >> /tmp/initramfs.debug 2>&1 mount -t tmpfs -o "size=2m" tmpfs ${ramdisk} >> /tmp/initramfs.debug 2>&1 _log "AUFS Moving ${rwfs} squashfs to ${rofs}" # move /usr mkdir -p ${rofs} >> /tmp/initramfs.debug 2>&1 mount -o move ${rwfs} ${rofs} _log "AUFS Mount with aufs ${rofs} and ${ramdisk} to create ${rwfs} in rw mode" # mount aufs mount -t aufs -o br:${ramdisk}:${rofs} none ${rwfs} >> /tmp/initramfs.debug 2>&1 } mount_overlayfs() { ramdisk=$1 rofs=$2 rwfs=$3 # # example: # mount_overlayfs /mnt/ram /.usr /usr # RAM RO RW # _log "OVERLAYFS Creating ramdisk ${ramdisk} of 2 Mb" mkdir -p ${ramdisk} >> /tmp/initramfs.debug 2>&1 mount -t tmpfs -o "size=2m" tmpfs ${ramdisk} >> /tmp/initramfs.debug 2>&1 _log "OVERLAYFS Moving ${rwfs} squashfs to ${rofs}" # move /usr mkdir -p ${rofs} >> /tmp/initramfs.debug 2>&1 mount -o move ${rwfs} ${rofs} _log "OVERLAYFS Mount with overlayfs ${rofs} and ${ramdisk} to create ${rwfs} in rw mode" # mount overlayfs mount -t overlayfs -o rw,relatime,lowerdir=${rofs},upperdir=${ramdisk} overlayfs ${rwfs} >> /tmp/initramfs.debug 2>&1 } mount_unionfs() { # DOCUMENTME nounionfs | disable unionfs from /usr mount point nounionfs=$(read_cmdline_var "nounionfs" "0") if [ ${nounionfs} = 1 ]; then _log "UNIONFS disabled from cmdline" return fi # if module not loaded try with aufs/overlayfs or exit :( if ! grep -q unionfs /proc/modules ; then if grep -q aufs /proc/modules ; then mount_aufs $1 $2 $3 return elif grep -q overlayfs /proc/modules; then mount_overlayfs $1 $2 $3 return fi _log "UNIONFS ERROR mounting unionfs or aufs in rw mode" return fi # mount_unionfs() # remount $3 filesystem in rw mode # $1 ramdisk # $2 ro filesystem # $3 union # $3 contains a mounted filesystem in ro mode (squashfs) ramdisk=$1 rofs=$2 rwfs=$3 # # example: # mount_unionfs /mnt/ram /.usr /usr # RAM RO RW # _log "UNIONFS Creating ramdisk ${ramdisk} of 2 Mb" mkdir -p ${ramdisk} >> /tmp/initramfs.debug 2>&1 # not needed because / is a big ramdisk mount -t tmpfs -o "size=2m" tmpfs ${ramdisk} >> /tmp/initramfs.debug 2>&1 _log "UNIONFS Moving ${rwfs} squashfs to ${rofs}" # move /usr mkdir -p ${rofs} >> /tmp/initramfs.debug 2>&1 mount -o move ${rwfs} ${rofs} _log "UNIONFS Mount with unionfs ${rofs} and ${ramdisk} to create ${rwfs} in rw mode" # mount union mount -t unionfs -o dirs=${ramdisk}=rw:${rofs}=ro unionfs ${rwfs} >> /tmp/initramfs.debug 2>&1 } tcos-0.89.93ubuntu2/conf/initramfs.conf0000664000000000000000000000144112260610261014655 0ustar # # initramfs.conf # Configuration file for mkinitramfs(8). See initramfs.conf(5). # # BUSYBOX: [ y | n ] # # Use busybox if available. # BUSYBOX=y # # MODULES: [ most | netboot | dep | list ] # # most - Add all framebuffer, acpi, filesystem, and harddrive drivers. # # dep - Try and guess which modules to load. # # netboot - Add the base modules, network modules, but skip block devices. # # list - Only include modules from the 'additional modules' list # #MODULES=list MODULES=most # # BOOT: [ local | nfs | tcos | tcos-nfs ] # # local - Boot off of local media (harddrive, USB stick). # # nfs - Boot using an NFS drive as the root of the drive. # BOOT=tcos # # DEVICE: ... # # Specify the network interface, like eth0 # DEVICE=eth0 # # NFSROOT: [ auto | HOST:MOUNT ] # NFSROOT=auto tcos-0.89.93ubuntu2/conf/tcos-functions0000664000000000000000000000530412260610261014715 0ustar # common functions used in tcos scripts _echo () { # wrapper to echo in scripts, only print if debug is enabled if [ ${TCOS_DEBUG} ]; then echo "$@" fi } convert_links2files () { # convert all links in $DESTDIR to linked files # needed to calculate initramfs space dir=$(pwd) cd $DESTDIR # copy binary not links for xfile in $(find usr -type l); do if [ -f /$xfile ] ;then rm -f $DESTDIR/$xfile cp -f /$xfile $DESTDIR/$xfile else rm -f $DESTDIR/$xfile file=$(basename $xfile) cp -f $(pathof $file) $DESTDIR/$xfile fi done cd $dir } convert_links2files_bin () { # convert all links in $DESTDIR to linked files # needed to calculate initramfs space dir=$(pwd) cd $DESTDIR # copy binary not links for xfile in $(find bin -type l); do if [ -f /$xfile ] ;then rm -f $DESTDIR/$xfile cp -f /$xfile $DESTDIR/$xfile else rm -f $DESTDIR/$xfile file=$(basename $xfile) cp -f $(pathof $file) $DESTDIR/$xfile fi done cd $dir } stat_before () { # read space in $DESTDIR (this functions is a checkpoint) size1=$(du -s ${DESTDIR} 2>/dev/null| awk '{print $1}') } stat_after () { # read size after checkpoint and prints diff between disk space # this give what space need an app convert_links2files size2=$(du -s ${DESTDIR} 2>/dev/null| awk '{print $1}') diff_size=$(echo $((size2 -size1)) ) if [ ${TCOS_DEBUG} ]; then _echo "Package $1 get ${diff_size} Kb." fi } pathof() { # give absolute path of $1 binary (if found) location=$(which $1 | awk '{print $1}') if [ -z $location ]; then location=$(whereis $1 | awk '{print $2}') fi if [ ! -e $location ]; then echo "pathof() ERROR $1 not found !!!" 1>&2 fi echo $location } cpifexists () { #_echo "DEBUG: \$1=$1 \$2=$2" if [ -f $DESTDIR/$1 ]; then #echo "cpifexists(): WARNING: $1 exists in $DESTDIR, not copying again!!!" return 1 fi if [ $# != 2 ]; then echo "cpifexists() ERROR: Need 2 arguments: \$1=$1 \$2=$2" #_echo " DEBUG: \$1=$1 \$2=$2" return 1 fi if [ ! -f $1 ]; then echo "cpifexits() ERROR: $1 no exists" #_echo " DEBUG: \$1=$1 \$2=$2" return 1 fi if [ ! -d $DESTDIR/$2 ]; then echo "cpifexits() WARNING: $DESTDIR/$2 don't exists" #_echo " DEBUG: \$1=$1 \$2=$2" fi #echo "DEBUG: copy_exec $1 $2" copy_exec "${1}" "${2}" return 0 } copydir () { if [ $# != 2 ]; then echo "copydir() ERROR Need 2 arguments: \$1=$1 \$2=$2" #_echo " DEBUG: \$1=$1 \$2=$2" return 1 fi if [ ! -d $1 ]; then echo "copydir() WARNING $1 dir not exits" #_echo " DEBUG: \$1=$1 \$2=$2" return 1 fi #_echo "cp -ra \"${1}\" \"${DESTDIR}/${2}\"" cp -ra "${1}" "${DESTDIR}/${2}" return 0 } tcos-0.89.93ubuntu2/conf/tcos.conf.nfs0000664000000000000000000000066012260610261014420 0ustar # TEMPLATE_DESCRIPTION="NFS force boot, disabled USB, sound, tcosmonitor, IDE, SATA" TEMPLATE_DESCRIPTION_ES="Arranque NFS forzado, desactivado USB, sonido, tcosmonitor, dispositivos IDE o SATA" # force 4 Gb of RAM to boot without NFS TCOS_MIN_RAM=4096 TCOS_METHOD="-nfs -rootfs" TCOS_DISABLE_USPLASH=1 TCOS_INETD= TCOS_REMOTEFS="none" TCOS_USB= TCOS_DISABLE_USB=1 TCOS_DISABLE_IDE=1 TCOS_SOUND= TCOS_SOUND_ISA= TCOS_PULSEAUDIO= tcos-0.89.93ubuntu2/conf/template0000664000000000000000000000155212260610261013553 0ustar ############################################## # # # Template hacking file of TCOS # # # ############################################## # # PLEASE, DON'T EDIT THIS FILE, CREATE A NEW ONE # IN /etc/tcos/hacking/ dir # # Examples: # # # include nano # cpifexists /usr/bin/nano /usr/bin/ # cpifexists /etc/nanorc /etc # # # # copy a dir # copydir /usr/NX/ /usr/ # # # # create a complex dir structure # mkdir -p $DESTDIR/var/cache/fonts # # # $DESTDIR is where initramfs root dir # # # To copy kernel modules (copy module depends to image too): # # tcos_manual_add_modules module_name # # If you want to be loaded at startup: # # echo "module_name" >> $DESTDIR/etc/modules # # # Some info in /usr/share/doc/initramfs-tools-tcos/HACKING # tcos-0.89.93ubuntu2/conf/tcos.conf.low0000664000000000000000000000046512260610261014436 0ustar # TEMPLATE_DESCRIPTION="Disabled USB, sound, tcosmonitor, IDE, SATA" TEMPLATE_DESCRIPTION_ES="Desactivado USB, sonido, tcosmonitor, dispositivos IDE o SATA" TCOS_DISABLE_USPLASH=1 TCOS_INETD= TCOS_REMOTEFS="none" TCOS_USB= TCOS_DISABLE_USB=1 TCOS_DISABLE_IDE=1 TCOS_SOUND= TCOS_SOUND_ISA= TCOS_PULSEAUDIO= tcos-0.89.93ubuntu2/conf/base.conf0000664000000000000000000001520312260610261013574 0ustar # base configuration for tcos.conf TEMPLATE_DESCRIPTION="Base configuration file for TCOS" TEMPLATE_DESCRIPTION_ES="Plantilla de configuración base para TCOS" # Net boot menu (set to 1 to enable) TCOS_NETBOOT_MENU= # Net boot menu VESA MODE (not work with all BIOS) TCOS_NETBOOT_MENU_VESA= # Hide install and update options (set to empty to show options) TCOS_NETBOOT_HIDE_INSTALL=1 # hide local HDD boot TCOS_NETBOOT_HIDE_LOCAL=1 # kernel cmdline ( needed for nbi images) TCOS_APPEND="ramdisk_size=65536 initrd=initramfs-${TCOS_KERNEL} root=/dev/ram boot=tcos quiet" # verbose messages TCOS_DEBUG=1 # include debug tools TCOS_DEBUG_TOOLS= # If RAM is less than this number (in Mb) tcos will try to boot from NFS server TCOS_MIN_RAM=38 # Max mem (including swap that can use thin client) avoid firefox XPixmaps insane consumption (set to 0 to disable) TCOS_MAX_MEM=0 # COMPCACHE support TCOS_COMPCACHE= TCOS_COMPCACHE_PERCENT=20 # show a message of not found modules (better use showmodules cmdline) TCOS_SHOW_NEEDED_MODULES= # create all kernel modules .squashfs TCOS_ALL_MODULES= # download all kernel modules .squashfs TCOS_ALL_MODULES_DOWNLOAD= # list of kernel modules separated with comas TCOS_EXTRA_MODULES= # blacklist kernel modules separated with comas TCOS_BLACKLIST_MODULES= # include CPUFREQ modules TCOS_CPUFREQ=0 # list of cached packages TCOS_PKG_CACHE_LIST= # disable usr.squashfs if =1, empty create usr.squashfs TCOS_DISABLE_SQUASHFS= # include usr.squashfs in initramfs /mnt/, if =1 download with tftp (less tftpboot time) TCOS_SQUASHFS=1 # disable usplash TCOS_DISABLE_USPLASH=1 # disable Plymouth (disabled by default got a lot of RAM) TCOS_DISABLE_PLYMOUTH=1 # Plymouth theme TCOS_PLYMOUTH="" # wireless support TCOS_WIRELESS= # wireless modules # (avalaible ipw2200, ipw2100, madwifi (ath-pci, ath-hal, etc...), zd1211 (Zydas) and all kernel supported) # ndiswrapper don't work (perl script) # server must have firmware to generate correct images # put names with spaces # example: TCOS_WIRELESS_MODS="ipw2200 ipw2100 zd1211" TCOS_WIRELESS_MODS="" # methods of encription # empty=no encryption # WEP # WPA # only one method (no autodetection yet): example: TCOS_WIRELESS_ENC="WEP" TCOS_WIRELESS_ENC="WPA" # WEP/WPA key TCOS_WIRELESS_KEY= # inetd support (actions with telnet) TCOS_INETD= # acpid support (button poweroff thin client) TCOS_ACPID=1 # server user to be admin in Thin Client network (need ssh key and italc key) TCOS_ADMIN_USER="root" # number of TTY created on boot (default 1) TCOS_TTY=1 # tty1 console with password (default 1 = yes) TCOS_TTY1_PROTECTED=1 # ssh support => dropbear package needed TCOS_SSH=1 # root password ( if empty root password is "root" ) TCOS_ROOT_PASSWD="" # Autofs support (deprecated) TCOS_AUTOFS= # REMOTEFS access mode ( values: ltspfs, none ) TCOS_REMOTEFS="ltspfs" # enable NTFS-3g support TCOS_NTFS_3G= # USB support TCOS_USB=1 # Put this vars to 1 to lower initramfs size (disables USB and IDE) TCOS_DISABLE_USB= TCOS_DISABLE_IDE= # enable USBIP TCOS_USBIP= # Xorg support (needed to connect XDCMP or local session) TCOS_XORG=1 # Include in image all xorg installed drivers (~ +3Mb) TCOS_XORG_ALLDRIVERS= # Include OpenGL files (needed to run apps in fullscreen ~ +3Mb) TCOS_XORG_OPENGL= # Xorg cmdline options ( example -ac to disable control access, default empty) TCOS_XORG_OPTS="" # allowed host than can use Xorg (localhost is always, host separated with spaces) TCOS_XORG_XHOSTS="" # DEFAULT keyboard map TCOS_XORG_XKB="es" # DEFAULT keyboard map TCOS_XORG_XKBMODEL="pc105" # type of X session ( L=local R=remote S=SSH F=freenx N=no startx W=rdesktop) TCOS_XORG_TYPE="R" # default video driver (also allow auto only detect driver or fullauto also detect screen,input devices,resolution) # xorgauto will not use xorg.conf and leave Xorg to autoconfigure all. TCOS_XORG_VIDEO_DRIVER="vesa" # default video resolution TCOS_XORG_VIDEO_RES="1024x768" # Direct rendering TCOS_XORG_DRI= # DRI drivers TCOS_XORG_DRI_INTEL= TCOS_XORG_DRI_ATI= TCOS_XORG_DRI_SAVAGE= TCOS_XORG_DRI_SIS= TCOS_XORG_DRI_TRIDENT= TCOS_XORG_DRI_UNICHROME= TCOS_XORG_DRI_MATROX= # composite extension TCOS_COMPOSITE= # wakeonlan support TCOS_WAKEONLAN= # printer support TCOS_PRINTER= # ntpdate support TCOS_NTPDATE= TCOS_NTPDATE_SERVER="pool.ntp.org" # freenx support ( need freenx installed on server ) TCOS_FREENX= # freenx squashfs ( need freenx installed on server ) TCOS_FREENX_SQUASHFS= # italc Master-Eye client support TCOS_ITALC= # support for x11vnc server ( conflicts with iTALC ) TCOS_X11VNC= # Enable rDesktop TCOS_RDESKTOP= # rdesktop support (IP address or hostname of MS Windows Terminal Server) TCOS_RDESKTOP_SERVER="" # embedded web browser values=none, dillo(25 Mb), links2 (6 Mb) TCOS_WEB_BROWSER=none # Include DBUS/Avahi daemon and utils TCOS_DBUS= TCOS_AVAHI= # enable tcosmonitor TCOS_MONITOR=1 # Sound support ( this includes kernel sound modules alsa files and esound binaries) TCOS_SOUND=1 # ISA sound support (old sound cards) TCOS_SOUND_ISA=1 # force OSS compability (sis7019 need it), normally it is autodetected TCOS_SOUND_OSS= # enable PulseAudio to listen as esound daemon (disabled by default) TCOS_SOUND_REMOTE_ESD= # disable acpi and raid stuff TCOS_DISABLE_ACPI=1 # write some fuck service to inetd.conf (insecure, debug only) opentelnet=0 # VOLUME levels of mixer master and pcm ( values 0%-100% or 1-31 ) TCOS_VOLUME="80%" # boot quietly (no used yet) TCOS_quiet=n # PulseAudio support, use pulseaudio instead of Esound Daemon TCOS_PULSEAUDIO=1 # PulseAudio work with some resample methods # Avalaible options= # * src-sinc-medium-quality # * src-sinc-best-quality # * src-sinc-fastest # * src-zero-order-hold # * src-linear # * trivial TCOS_PULSEAUDIO_RESAMPLE_METHOD="src-sinc-fastest" # Use NFS and not download files with tftp. Values= (none|nfs) TCOS_USENFS=none # HTTPFS is a fuse http filesystem to mount usr.squashfs TCOS_HTTPFS= # Include installer (you can build isos with these) TCOS_INSTALLER= # syslinux installer extra boot params TCOS_INSTALLER_BOOT_OPT="quiet" # some special settings for thin clients # Openchrome(via) TCOS_XORG_DRIVER_OPENCHROME= # epatec with chipset VIA, generic hacks TCOS_ETC_GENERIC= # epatec 2300 fast boot TCOS_ETC2300= # Intel Dot Station (Paquito) TCOS_PAQUITO= # force build NFS images TCOS_FORCE_NFS_BUILD= # Use SSL tunnel for tcosxmlrpc TCOS_ENABLE_SSL= # Support to clone hosts TCOS_CLONE= # bootchartd TCOS_ENABLE_BOOTCHARTD= # font server (empty to enable 1 to disable) TCOS_ENABLE_FONT_SERVER=1 # MODULE to mount squashfs as RW (unionfs, aufs) TCOS_UNIONFS=unionfs # Use VPN for XMDCP, sound and devices (disabled by default) TCOS_OPENVPN= tcos-0.89.93ubuntu2/conf/tcos-modules.conf0000775000000000000000000000327212260610261015306 0ustar # modules to be copied into initramfs boot image # please include desired module/s, all dependant # modules of yours will be put automatically # core modules ( nothing of them are essential ) CORE_MODULES="ide-core ide-disk ide-generic ide-cd cdrom isofs ext3 vfat fat floppy" CORE_MODULES="${CORE_MODULES} generic_serial parport_pc serport serio_raw i2c-piix4 piix i2c-801 sisfb i2c-sis630 scsi-transport-spi" # New module names in 2.6.30 CORE_MODULES="${CORE_MODULES} ide-gd_mod ide-cd_mod" # usb modules ( if enabled ) ( this contains USB & SCSI for pendrive devices ) USB_MODULES="ehci-hcd ohci-hcd uhci-hcd sl811-hcd usbcore usb-storage scsi_mod sr_mod sd_mod" # live modules ( some off them are not essential ) LIVE_MODULES="loop unionfs overlayfs aufs squashfs nls_base nls_utf8 nls_cp437 nls_iso8859-1 nls_cp850" # network modules (vmware and 3Com, Realtek, VIA) you can edit this !!! NETWORK_MODULES="pcnet32 3c59x 8139cp 8139too via-rhine r8101" # xorg modules ( if enabled ) XORG_MODULES="video psmouse mousedev sermouse usbmouse evbug evdev agpgart vgastate lkkbd xtkbd intel-agp i810 i915 i830 mga r128 radeon savage sis tdfx" # sound modules ( if enabled ) please add your modules in second # line ( can remove someone if you need ) # pcspkr removed SOUND_MODULES="soundcore snd-seq-device snd-pcm snd-rawmidi snd snd-hwdep snd-mixer-oss snd-pcm-oss snd-seq snd-seq-oss" SOUND_MODULES="${SOUND_MODULES} snd-ac97-codec ac97_codec snd-ens1371 snd-via82xx i810_audio snd-intel8x0" SOUND_MODULES="${SOUND_MODULES} snd-hda-intel snd-atiixp snd-usb-audio sis5513 snd-sis7019 snd-cs5535audio cs5535" # personal TCOS modules MYTCOS_MODULES="piix via82cxx" # blacklist kernel modules BLACKLIST_MODULES="" tcos-0.89.93ubuntu2/conf/tcos.conf0000664000000000000000000000152312260610261013632 0ustar # some build vars TCOS_DIR=/usr/share/tcos TCOS_BINS=/usr/lib/tcos TFTP_DIR=/var/lib/tcos/tftp TCOS_CONF=/etc/tcos TCOS_VAR=/var/lib/tcos TCOS_PKG_CACHE=/var/cache/tcos/packages TCOS_CHROOT=/var/lib/tcos/chroot TFTP_MSG=tcos.msg TFTP_MSG_HELP1=help.msg TFTP_MSG_HELP2=help2.msg TFTP_LOGO_LSS=logo.lss TFTP_LOGO_JPG=pxetcos.jpg TCOS_PXECFG=pxelinux.cfg.tpl TCOS_PXECFG_MENU=pxelinux.menu.cfg.tpl TCOS_TEMPLATES_DIR=/usr/share/tcos/templates TCOS_TEMPLATES_ETC=/etc/tcos/templates ISOS="/var/lib/tcos/isos" VOLUMENAME="TCOS boot cd" DISTRO="TCOS" TCOS_KERNEL= TCOS_DEBUG=1 # Net boot menu (set to 1 to enable) TCOS_NETBOOT_MENU= # Net boot menu VESA MODE (not work with all BIOS) TCOS_NETBOOT_MENU_VESA=1 # Hide install and update options (set to empty to show options) TCOS_NETBOOT_HIDE_INSTALL=1 # template to use TCOS_TEMPLATE=tcos.conf.all tcos-0.89.93ubuntu2/conf/branding-pxelinux.info0000664000000000000000000000146212260610261016330 0ustar # # # BRANDING info for TCOS # # # You can change some default settings in TCOS creating a file # in /etc/tcos/templates/ dir # # # Files allowed: # # pxelinux.menu*.tpl | pxelinux.nomenu*.tpl # Add custom menu labels to pxelinux.cfg template # Examples: # # Vars: # __TCOS_KERNEL__ # # pxelinux.menu*.tpl: # # label tcos-custom # MENU LABEL TCOS Thin Client Custom Label # KERNEL vmlinuz-__TCOS_KERNEL__ # APPEND ramdisk_size=65536 initrd=initramfs-__TCOS_KERNEL__ root=/dev/ram0 boot=tcos quiet # # # pxelinux.nomenu*.tpl: # # label tcos-custom # kernel vmlinuz-__TCOS_KERNEL__ # append ramdisk_size=65536 initrd=initramfs-__TCOS_KERNEL__ root=/dev/ram0 boot=tcos quiet # # # # If you want to brand another file, please tell me # tcos-0.89.93ubuntu2/conf/version.conf0000664000000000000000000000026112260610261014345 0ustar # some package vars TCOS_VERSION="__TCOS_VERSION__" TCOS_DISTRO="__TCOS_DISTRO__" TCOS_ARCH="__TCOS_ARCH__" TCOS_MULTIARCH="__TCOS_MULTIARCH__" DISTRIBUTION="__DISTRIBUTION__" tcos-0.89.93ubuntu2/make-tcos_msg.sh0000664000000000000000000000347112260610261014157 0ustar #!/bin/sh # Copyright (C) 2006,2007,2008 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # if [ "$1" = "help.msg" ]; then _files=$(rgrep "DOCUMENTME" scripts/|grep -v svn | awk -F ":" '{print $1}') #echo $_files cat /dev/null > /tmp/make-tcos-$$ for _file in ${_files}; do echo $_file >> /tmp/make-tcos-$$ done cat /tmp/make-tcos-$$ | sort | uniq > /tmp/make-tcos1-$$ echo -e '00 08 Help about TCOS boot Boot options: ' for _file in $( cat /tmp/make-tcos1-$$); do #echo $_file num_of_vars=$(grep "DOCUMENTME" $_file | wc -l) for (( i=1; i<= $num_of_vars; i++)); do #echo $i _cmdvar=$(grep "DOCUMENTME" $_file | head -$i | tail -1 | awk '{print $3}') _cmdexp=$(grep "DOCUMENTME" $_file | head -$i | tail -1 | awk -F "|" '{print $2}' ) _cmdvar_len=$(expr length ${_cmdvar}) _tabs='\t' if [ ${_cmdvar_len} -lt 8 ]; then _tabs='\t\t' fi echo -e ${_cmdvar}${_tabs}${_cmdexp}'\n' _tabs='\t' done #sleep 2 done rm -f /tmp/make-tcos-$$ /tmp/make-tcos1-$$ echo -e ' Press ^O08F1^O07 to return to main ' else echo -e 'logo.lss 07 Press 08F107 for help Options 021:TCOS 64 Mb08 [default] 021:TCOS 32 Mb08 ' fi tcos-0.89.93ubuntu2/localapps/0000775000000000000000000000000012260610427013047 5ustar tcos-0.89.93ubuntu2/localapps/firefox0000664000000000000000000000634112260610261014434 0ustar FIREFOX_VERSION=3.5.4 FIREFOX_DOWNLOADED_DIR=/var/cache/tcos/localapps/firefox/ FIREFOX_DOWNLOAD="http://download.mozilla.org/?product=firefox-${FIREFOX_VERSION}&os=linux&lang=es-ES" if [ ! -d $FIREFOX_DOWNLOADED_DIR ]; then mkdir -p /var/cache/tcos/localapps/firefox/ echo " * Downloading Firefox $FIREFOX_VERSION .." wget -q "$FIREFOX_DOWNLOAD" -o /var/cache/tcos/localapps/firefox/firefox.tar.bz2 ( cd /var/cache/tcos/localapps/firefox/ && tar -jxf firefox.tar.bz2 ) ( cd /var/cache/tcos/localapps/firefox/ && mv firefox/* ./ && rm -f firefox.tar.bz2) fi stat_before mkdir -p $DESTDIR/usr/local/lib cp -ra $FIREFOX_DOWNLOADED_DIR $DESTDIR/usr/local/lib/firefox-$FIREFOX_VERSION ## copy linked libs LIBS=$(LD_LIBRARY_PATH=$FIREFOX_DOWNLOADED_DIR:$LD_LIBRARY_PATH ldd $FIREFOX_DOWNLOADED_DIR/firefox-bin | awk '{print $3}'| grep lib| grep -v "i686/cmov"| grep ^/usr/lib) LIBS2=$(LD_LIBRARY_PATH=$FIREFOX_DOWNLOADED_DIR:$LD_LIBRARY_PATH ldd $FIREFOX_DOWNLOADED_DIR/crashreporter | awk '{print $3}'| grep lib| grep -v "i686/cmov"| grep ^/usr/lib) for lib in $LIBS $LIBS2; do if [ ! -e $DESTDIR/$lib ]; then _echo " * copying lib '$lib'" cpifexists $lib /usr/lib/ fi done mkdir -p $DESTDIR/etc/pango cat << EOF > $DESTDIR/etc/pango/pango.modules /usr/lib/pango/1.6.0/modules/pango-basic-x.so BasicScriptEngineX PangoEngineShape PangoRenderX common: /usr/lib/pango/1.6.0/modules/pango-basic-fc.so BasicScriptEngineFc PangoEngineShape PangoRenderFc latin:* cyrillic:* greek:* armenian:* georgian:* runic:* ogham:* bopomofo:* cherokee:* coptic:* deseret:* ethiopic:* gothic:* han:* hiragana:* katakana:* old-italic:* canadian-aboriginal:* yi:* braille:* cypriot:* limbu:* osmanya:* shavian:* linear-b:* ugaritic:* glagolitic:* cuneiform:* phoenician:* common: EOF mkdir -p $DESTDIR/usr/lib/pango/1.6.0/modules cpifexists /usr/lib/pango/1.6.0/modules/pango-basic-x.so /usr/lib/pango/1.6.0/modules cpifexists /usr/lib/pango/1.6.0/modules/pango-basic-fc.so /usr/lib/pango/1.6.0/modules ## metacity #cpifexists /usr/bin/metacity /usr/bin mkdir -p $DESTDIR/var/lib/dbus/ cpifexists /var/lib/dbus/machine-id /var/lib/dbus/ ## metacity theme mkdir -p $DESTDIR/usr/share/themes/ cp -ra /usr/share/themes/Simple/ $DESTDIR/usr/share/themes/ ## gconf mkdir -p $DESTDIR/usr/lib/libgconf2-4 cpifexists /usr/lib/libgconf2-4/gconfd-2 /usr/lib/libgconf2-4/ ## fonts list cpifexists /usr/bin/xlsfonts /usr/bin ################# LAUNCHER ######################## cat << EOF > $DESTDIR/sbin/startlocalx #!/bin/sh export DISPLAY=:0 export HOME=/root # make links needed by firefox [ ! -e /bin/pwd ] && ln -s /bin/busybox /bin/pwd [ ! -e /bin/ls ] && ln -s /bin/busybox /bin/ls [ ! -e /usr/bin/firefox ] && ln -s /usr/local/lib/firefox-$FIREFOX_VERSION/firefox /usr/bin/firefox if [ -f \$XAUTHORITY ]; then TCOS_XORG_OPTS="\$TCOS_XORG_OPTS -auth \$XAUTHORITY" fi /sbin/tryXorg --xorgopts="\${TCOS_XORG_OPTS}" & waitforX sleep 2 # set background color xsetroot -cursor_name left_ptr -solid "#338899" 2>/tmp/initramfs.debug ## metacity #/usr/bin/metacity & ## launch as fullscreen? while [ 1 ]; do if [ "\$(pidof firefox)" = "" ]; then /usr/bin/firefox else sleep 10 fi done sleep 10 EOF chmod +x $DESTDIR/sbin/startlocalx stat_after "Firefox LOCAL" tcos-0.89.93ubuntu2/README.ssl0000664000000000000000000000446612260610261012557 0ustar ##################################################### SSL over TCOSXMLRPC Readme ##################################################### UPDATED: IMPORTANT¡¡ Now certificates are created randomly # TcosXMLRPC server receive a lot of info like others HTTP # servers in plain text. # # Some of this info is user and password strings that are used # to allow exec some danger actions (reboot or poweroff for example). # # If you want to protect this traffic data, you can enable SSL # over TcosXMLRPC (require more CPU and TcosMonitor will work a bit slow). # # # 1.- Install stunnel4 package # (need a package with "TIMEOUTclose=0" patch enabled, see # http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=480496 for more info) # # (FOR THIN CLIENTS) # 2a.- In Tcosconfig, enable SSL support in services expander, and remake images. # # (FOR STANDALONE) # 2a.- In tcos-standalone app (or /etc/default/tcos-standalone) # # enable SSL checkbox/var. # # # (FOR ALL) # 3.- In TcosMonitor -> Preferences, enable SSL over XMLRPC checkbox. # # # From now all traffic between TcosMonitor and thin clients /standalone # hosts will pass throuth SSL layer. # # You can check it with tcpdump, wireshark, or ssldump. # ########################################################################## # * How to create SSL keys for stunnel (from README.Debian stunnel4 package) # ########################################################################## # # # The certificates default directory is /etc/tcos/ssl, so cd into that dir # and issue the command: # # cd /etc/tcos/ssl # openssl req -new -x509 -nodes -days 365 -out tcos-custom.pem -keyout tcos-custom.pem # # Fill in the info requested. # # chmod 600 tcos-custom.pem # # Now you need to append the DH parameters to the certificate. # # First you need to generate some amount of random data: # # dd if=/dev/urandom of=temp_file count=2 # # And now make openssl generate the DH parameters and append them to the # certificate file: # # openssl dhparam -rand temp_file 512 >> tcos-custom.pem # rm -f temp_file # # IMPORTANT: # Certificate name need to be tcos-custom.pem (don't use another name) tcos-0.89.93ubuntu2/pkgdiff.sh0000664000000000000000000000264012260610261013035 0ustar #!/bin/sh # # Simple script to track changes between installed tcos packages # and compiled with "debuild -us -uc" # # This script show file changes between packages # # # Copyright (C) 2006,2007,2008 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # PKGS=$(awk '/^Package:/ {print $2}' debian/control) for PKG in $PKGS; do dpkg -L $PKG | sort | uniq | grep -v "^/.$" > pkg.____${PKG}____.instalado dpkg --contents ../${PKG}_*deb | \ awk '{ if ($(NF-1) == "->") {print $(NF-2)} else {print $(NF)}}' |\ sed -e 's/\.\//\//g' | sed -e 's/\/$//g' | grep -v "^$" | sort| uniq > pkg.____${PKG}____.generado diff -ur pkg.____${PKG}____.instalado pkg.____${PKG}____.generado rm -f pkg.____${PKG}____.instalado pkg.____${PKG}____.generado done tcos-0.89.93ubuntu2/xorgids/0000775000000000000000000000000012260610427012550 5ustar tcos-0.89.93ubuntu2/xorgids/vboxvideo.ids0000664000000000000000000000001112260610261015242 0ustar 80eebeef tcos-0.89.93ubuntu2/xorgids/xorg.pciids0000664000000000000000000004145112260610261014725 0ustar apm 1142:6422 apm 1142:6424 apm 1142:643D ark EDD8:A091 ark EDD8:A099 ark EDD8:A0A1 chips 102C:00D8 chips 102C:00DC chips 102C:00E0 chips 102C:00E4 chips 102C:00E5 chips 102C:00F4 chips 102C:00C0 chips 102C:0C30 cirrus 1013:00A0 cirrus 1013:00A4 cirrus 1013:00A8 cirrus 1013:00AC cirrus 1013:00B8 cirrus 1013:00BC cirrus 1013:00D0 cirrus 1013:00D4 cirrus 1013:00D5 cirrus 1013:00D6 cirrus 1013:0038 cyrix 1078:0000 cyrix 1078:0002 cyrix 1078:0104 geode 100B:0030 geode 1022:2081 glint 104C:3D04 glint 104C:3D07 glint 3D3D:0001 glint 3D3D:0002 glint 3D3D:0003 glint 3D3D:0004 glint 3D3D:0006 glint 3D3D:0007 glint 3D3D:0008 glint 3D3D:0009 glint 3D3D:000A glint 3D3D:000C glint 3D3D:000D glint 3D3D:000E i128 105D:2309 i128 105D:2339 i128 105D:493D i128 105D:5348 i740 003D:00D1 i740 8086:7800 imstt 10E0:9128 imstt 10E0:9135 intel 8086:7121 intel 8086:7123 intel 8086:7125 intel 8086:1132 intel 8086:7120 intel 8086:7122 intel 8086:7124 intel 8086:1130 intel 8086:3577 intel 8086:3575 intel 8086:2562 intel 8086:2560 intel 8086:3582 intel 8086:3580 intel 8086:2572 intel 8086:2570 intel 8086:2582 intel 8086:2580 intel 8086:2592 intel 8086:2590 intel 8086:258A intel 8086:2580 intel 8086:2772 intel 8086:2770 intel 8086:27A2 intel 8086:27A0 intel 8086:27AE intel 8086:27AC intel 8086:2982 intel 8086:2980 intel 8086:2992 intel 8086:2990 intel 8086:29A2 intel 8086:29A0 intel 8086:2972 intel 8086:2970 intel 8086:2A02 intel 8086:2A00 intel 8086:2A12 intel 8086:2A10 intel 8086:29C2 intel 8086:29C0 intel 8086:29B2 intel 8086:29B0 intel 8086:29D2 intel 8086:29D0 intel 8086:2A40 intel 8086:2E00 intel 8086:2E20 intel 8086:2E10 intel 8086:2E32 intel 8086:2E30 intel 8086:2A42 intel 8086:2E02 intel 8086:2E22 intel 8086:2E12 mach64 1002:4354 mach64 1002:4358 mach64 1002:4554 mach64 1002:4742 mach64 1002:4744 mach64 1002:4749 mach64 1002:474C mach64 1002:474D mach64 1002:474E mach64 1002:474F mach64 1002:4750 mach64 1002:4751 mach64 1002:4752 mach64 1002:4753 mach64 1002:4754 mach64 1002:4755 mach64 1002:4756 mach64 1002:4757 mach64 1002:4758 mach64 1002:4759 mach64 1002:475A mach64 1002:4C42 mach64 1002:4C44 mach64 1002:4C47 mach64 1002:4C49 mach64 1002:4C4D mach64 1002:4C4E mach64 1002:4C50 mach64 1002:4C51 mach64 1002:4C52 mach64 1002:4C53 mach64 1002:5654 mach64 1002:5655 mach64 1002:5656 mga 102B:0519 mga 102B:051A mga 102B:051B mga 102B:051F mga 102B:0520 mga 102B:0521 mga 102B:0525 mga 102B:2527 mga 102B:1000 mga 102B:1001 mga 102B:0522 mga 102B:0524 neomagic 10C8:0001 neomagic 10C8:0002 neomagic 10C8:0003 neomagic 10C8:0083 neomagic 10C8:0004 neomagic 10C8:0005 neomagic 10C8:0025 neomagic 10C8:0006 neomagic 10C8:0016 nsc 100B:0104 nsc 100B:0504 nv 10DE:0020 nv 10DE:0028 nv 10DE:0029 nv 10DE:002A nv 10DE:002C nv 10DE:002D nv 10DE:0040 nv 10DE:0041 nv 10DE:0042 nv 10DE:0043 nv 10DE:0044 nv 10DE:0045 nv 10DE:0046 nv 10DE:0047 nv 10DE:0048 nv 10DE:004E nv 10DE:0090 nv 10DE:0091 nv 10DE:0092 nv 10DE:0093 nv 10DE:0095 nv 10DE:0098 nv 10DE:0099 nv 10DE:009D nv 10DE:00A0 nv 10DE:00C0 nv 10DE:00C1 nv 10DE:00C2 nv 10DE:00C3 nv 10DE:00C8 nv 10DE:00C9 nv 10DE:00CC nv 10DE:00CD nv 10DE:00CE nv 10DE:0100 nv 10DE:0101 nv 10DE:0103 nv 10DE:0110 nv 10DE:0111 nv 10DE:0112 nv 10DE:0113 nv 10DE:0120 nv 10DE:0140 nv 10DE:0141 nv 10DE:0142 nv 10DE:0143 nv 10DE:0144 nv 10DE:0145 nv 10DE:0146 nv 10DE:0147 nv 10DE:0148 nv 10DE:0149 nv 10DE:014C nv 10DE:014D nv 10DE:014E nv 10DE:014F nv 10DE:0150 nv 10DE:0151 nv 10DE:0152 nv 10DE:0153 nv 10DE:0160 nv 10DE:0161 nv 10DE:0162 nv 10DE:0163 nv 10DE:0164 nv 10DE:0165 nv 10DE:0166 nv 10DE:0167 nv 10DE:0168 nv 10DE:0169 nv 10DE:0170 nv 10DE:0171 nv 10DE:0172 nv 10DE:0173 nv 10DE:0174 nv 10DE:0175 nv 10DE:0176 nv 10DE:0177 nv 10DE:0178 nv 10DE:0179 nv 10DE:017A nv 10DE:017C nv 10DE:017D nv 10DE:0180 nv 10DE:0181 nv 10DE:0182 nv 10DE:0183 nv 10DE:0185 nv 10DE:0186 nv 10DE:0187 nv 10DE:0188 nv 10DE:0189 nv 10DE:018A nv 10DE:018B nv 10DE:018C nv 10DE:018D nv 10DE:0190 nv 10DE:0191 nv 10DE:0193 nv 10DE:0194 nv 10DE:019D nv 10DE:019E nv 10DE:01A0 nv 10DE:01D0 nv 10DE:01D1 nv 10DE:01D3 nv 10DE:01D6 nv 10DE:01D7 nv 10DE:01D8 nv 10DE:01D9 nv 10DE:01DA nv 10DE:01DB nv 10DE:01DC nv 10DE:01DD nv 10DE:01DE nv 10DE:01DF nv 10DE:01F0 nv 10DE:0200 nv 10DE:0201 nv 10DE:0202 nv 10DE:0203 nv 10DE:0210 nv 10DE:0211 nv 10DE:0212 nv 10DE:0215 nv 10DE:0218 nv 10DE:0220 nv 10DE:0221 nv 10DE:0222 nv 10DE:0240 nv 10DE:0241 nv 10DE:0242 nv 10DE:0244 nv 10DE:0247 nv 10DE:0250 nv 10DE:0251 nv 10DE:0253 nv 10DE:0258 nv 10DE:0259 nv 10DE:025B nv 10DE:0280 nv 10DE:0281 nv 10DE:0282 nv 10DE:0286 nv 10DE:0288 nv 10DE:0289 nv 10DE:028C nv 10DE:0290 nv 10DE:0291 nv 10DE:0292 nv 10DE:0298 nv 10DE:0299 nv 10DE:029A nv 10DE:029B nv 10DE:029C nv 10DE:029D nv 10DE:029E nv 10DE:029F nv 10DE:0300 nv 10DE:0301 nv 10DE:0302 nv 10DE:0308 nv 10DE:0309 nv 10DE:0310 nv 10DE:0311 nv 10DE:0312 nv 10DE:0314 nv 10DE:031A nv 10DE:031B nv 10DE:031C nv 10DE:0320 nv 10DE:0321 nv 10DE:0322 nv 10DE:0323 nv 10DE:0324 nv 10DE:0325 nv 10DE:0326 nv 10DE:0327 nv 10DE:0328 nv 10DE:0329 nv 10DE:032A nv 10DE:032B nv 10DE:032C nv 10DE:032D nv 10DE:0330 nv 10DE:0331 nv 10DE:0332 nv 10DE:0333 nv 10DE:0334 nv 10DE:0338 nv 10DE:033F nv 10DE:0340 nv 10DE:0341 nv 10DE:0342 nv 10DE:0343 nv 10DE:0344 nv 10DE:0347 nv 10DE:0348 nv 10DE:034C nv 10DE:034E nv 10DE:0390 nv 10DE:0391 nv 10DE:0392 nv 10DE:0393 nv 10DE:0394 nv 10DE:0395 nv 10DE:0397 nv 10DE:0398 nv 10DE:0399 nv 10DE:039A nv 10DE:039B nv 10DE:039C nv 10DE:039E nv 10DE:03D0 nv 10DE:0400 nv 10DE:0401 nv 10DE:0402 nv 10DE:0404 nv 10DE:0405 nv 10DE:0407 nv 10DE:0408 nv 10DE:0409 nv 10DE:040A nv 10DE:040B nv 10DE:040C nv 10DE:040D nv 10DE:040E nv 10DE:040F nv 10DE:0420 nv 10DE:0421 nv 10DE:0422 nv 10DE:0423 nv 10DE:0424 nv 10DE:0425 nv 10DE:0426 nv 10DE:0427 nv 10DE:0428 nv 10DE:0429 nv 10DE:042A nv 10DE:042B nv 10DE:042D nv 10DE:042E nv 10DE:042F nv 10DE:05E1 nv 10DE:05E2 nv 10DE:05E0 nv 10DE:05F0 nv 10DE:0600 nv 10DE:0602 nv 10DE:0604 nv 10DE:0606 nv 10DE:0609 nv 10DE:060C nv 10DE:060D nv 10DE:0610 nv 10DE:0611 nv 10DE:0612 nv 10DE:061A nv 10DE:061C nv 10DE:0620 nv 10DE:0622 nv 10DE:0630 nv 10DE:0640 nv 10DE:0647 nv 10DE:0648 nv 10DE:0649 nv 10DE:064B nv 10DE:06E4 nv 10DE:06E5 nv 10DE:06E8 nv 10DE:06E9 nv 10DE:06E0 nv 10DE:06F0 nv 12D2:0018 openchrome 1106:3122 openchrome 1106:7205 openchrome 1106:3108 openchrome 1106:3118 openchrome 1106:3344 openchrome 1106:3230 openchrome 1106:3371 openchrome 1106:3157 openchrome 1106:3343 openchrome 1106:1122 r128 1002:4C45 r128 1002:4C46 r128 1002:4D46 r128 1002:4D4C r128 1002:5041 r128 1002:5042 r128 1002:5043 r128 1002:5044 r128 1002:5045 r128 1002:5046 r128 1002:5047 r128 1002:5048 r128 1002:5049 r128 1002:504A r128 1002:504B r128 1002:504C r128 1002:504D r128 1002:504E r128 1002:504F r128 1002:5050 r128 1002:5051 r128 1002:5052 r128 1002:5053 r128 1002:5054 r128 1002:5055 r128 1002:5056 r128 1002:5057 r128 1002:5058 r128 1002:5245 r128 1002:5246 r128 1002:5247 r128 1002:524B r128 1002:524C r128 1002:5345 r128 1002:5346 r128 1002:5347 r128 1002:5348 r128 1002:534B r128 1002:534C r128 1002:534D r128 1002:534E r128 1002:5446 r128 1002:544C r128 1002:5452 r128 1002:5453 r128 1002:5454 r128 1002:5455 radeonhd 1002:7100 radeonhd 1002:7101 radeonhd 1002:7102 radeonhd 1002:7103 radeonhd 1002:7104 radeonhd 1002:7105 radeonhd 1002:7106 radeonhd 1002:7108 radeonhd 1002:7109 radeonhd 1002:710A radeonhd 1002:710B radeonhd 1002:710C radeonhd 1002:710E radeonhd 1002:710F radeonhd 1002:7140 radeonhd 1002:7141 radeonhd 1002:7142 radeonhd 1002:7143 radeonhd 1002:7144 radeonhd 1002:7145 radeonhd 1002:7146 radeonhd 1002:7147 radeonhd 1002:7149 radeonhd 1002:714A radeonhd 1002:714B radeonhd 1002:714C radeonhd 1002:714D radeonhd 1002:714E radeonhd 1002:714F radeonhd 1002:7151 radeonhd 1002:7152 radeonhd 1002:7153 radeonhd 1002:715E radeonhd 1002:715F radeonhd 1002:7180 radeonhd 1002:7181 radeonhd 1002:7183 radeonhd 1002:7186 radeonhd 1002:7187 radeonhd 1002:7188 radeonhd 1002:718A radeonhd 1002:718B radeonhd 1002:718C radeonhd 1002:718D radeonhd 1002:718F radeonhd 1002:7193 radeonhd 1002:7196 radeonhd 1002:719B radeonhd 1002:719F radeonhd 1002:71C0 radeonhd 1002:71C1 radeonhd 1002:71C2 radeonhd 1002:71C3 radeonhd 1002:71C4 radeonhd 1002:71C5 radeonhd 1002:71C6 radeonhd 1002:71C7 radeonhd 1002:71CD radeonhd 1002:71CE radeonhd 1002:71D2 radeonhd 1002:71D4 radeonhd 1002:71D5 radeonhd 1002:71D6 radeonhd 1002:71DA radeonhd 1002:71DE radeonhd 1002:7200 radeonhd 1002:7210 radeonhd 1002:7211 radeonhd 1002:7240 radeonhd 1002:7243 radeonhd 1002:7244 radeonhd 1002:7245 radeonhd 1002:7246 radeonhd 1002:7247 radeonhd 1002:7248 radeonhd 1002:7249 radeonhd 1002:724A radeonhd 1002:724B radeonhd 1002:724C radeonhd 1002:724D radeonhd 1002:724E radeonhd 1002:724F radeonhd 1002:7280 radeonhd 1002:7281 radeonhd 1002:7283 radeonhd 1002:7284 radeonhd 1002:7287 radeonhd 1002:7288 radeonhd 1002:7289 radeonhd 1002:728B radeonhd 1002:728C radeonhd 1002:7290 radeonhd 1002:7291 radeonhd 1002:7293 radeonhd 1002:7297 radeonhd 1002:791E radeonhd 1002:791F radeonhd 1002:793F radeonhd 1002:7941 radeonhd 1002:7942 radeonhd 1002:796C radeonhd 1002:796D radeonhd 1002:796E radeonhd 1002:796F radeonhd 1002:9400 radeonhd 1002:9401 radeonhd 1002:9402 radeonhd 1002:9403 radeonhd 1002:9405 radeonhd 1002:940A radeonhd 1002:940B radeonhd 1002:940F radeonhd 1002:94C0 radeonhd 1002:94C1 radeonhd 1002:94C3 radeonhd 1002:94C4 radeonhd 1002:94C5 radeonhd 1002:94C6 radeonhd 1002:94C7 radeonhd 1002:94C8 radeonhd 1002:94C9 radeonhd 1002:94CB radeonhd 1002:94CC radeonhd 1002:9500 radeonhd 1002:9501 radeonhd 1002:9505 radeonhd 1002:9507 radeonhd 1002:950F radeonhd 1002:9511 radeonhd 1002:9515 radeonhd 1002:9517 radeonhd 1002:9519 radeonhd 1002:9580 radeonhd 1002:9581 radeonhd 1002:9583 radeonhd 1002:9586 radeonhd 1002:9587 radeonhd 1002:9588 radeonhd 1002:9589 radeonhd 1002:958A radeonhd 1002:958B radeonhd 1002:958C radeonhd 1002:958D radeonhd 1002:958E radeonhd 1002:9590 radeonhd 1002:9596 radeonhd 1002:9597 radeonhd 1002:9598 radeonhd 1002:9599 radeonhd 1002:95C0 radeonhd 1002:95C2 radeonhd 1002:95C4 radeonhd 1002:95C5 radeonhd 1002:95C7 radeonhd 1002:95CD radeonhd 1002:95CE radeonhd 1002:95CF radeon 1002:3150 radeon 1002:3151 radeon 1002:3152 radeon 1002:3154 radeon 1002:3E50 radeon 1002:3E54 radeon 1002:4136 radeon 1002:4137 radeon 1002:4144 radeon 1002:4145 radeon 1002:4146 radeon 1002:4147 radeon 1002:4148 radeon 1002:4149 radeon 1002:414A radeon 1002:414B radeon 1002:4150 radeon 1002:4151 radeon 1002:4152 radeon 1002:4153 radeon 1002:4154 radeon 1002:4155 radeon 1002:4156 radeon 1002:4237 radeon 1002:4242 radeon 1002:4243 radeon 1002:4336 radeon 1002:4337 radeon 1002:4437 radeon 1002:4966 radeon 1002:4967 radeon 1002:4A48 radeon 1002:4A49 radeon 1002:4A4A radeon 1002:4A4B radeon 1002:4A4C radeon 1002:4A4D radeon 1002:4A4E radeon 1002:4A4F radeon 1002:4A50 radeon 1002:4B49 radeon 1002:4B4A radeon 1002:4B4B radeon 1002:4B4C radeon 1002:4C57 radeon 1002:4C58 radeon 1002:4C59 radeon 1002:4C5A radeon 1002:4C64 radeon 1002:4C66 radeon 1002:4C67 radeon 1002:4E44 radeon 1002:4E45 radeon 1002:4E46 radeon 1002:4E47 radeon 1002:4E48 radeon 1002:4E49 radeon 1002:4E4A radeon 1002:4E4B radeon 1002:4E50 radeon 1002:4E51 radeon 1002:4E52 radeon 1002:4E53 radeon 1002:4E54 radeon 1002:4E56 radeon 1002:5144 radeon 1002:5145 radeon 1002:5146 radeon 1002:5147 radeon 1002:5148 radeon 1002:514C radeon 1002:514D radeon 1002:5157 radeon 1002:5158 radeon 1002:5159 radeon 1002:515A radeon 1002:515E radeon 1002:5460 radeon 1002:5462 radeon 1002:5464 radeon 1002:5548 radeon 1002:5549 radeon 1002:554A radeon 1002:554B radeon 1002:554C radeon 1002:554D radeon 1002:554E radeon 1002:554F radeon 1002:5550 radeon 1002:5551 radeon 1002:5552 radeon 1002:5554 radeon 1002:564A radeon 1002:564B radeon 1002:564F radeon 1002:5652 radeon 1002:5653 radeon 1002:5657 radeon 1002:5834 radeon 1002:5835 radeon 1002:5954 radeon 1002:5955 radeon 1002:5960 radeon 1002:5961 radeon 1002:5962 radeon 1002:5964 radeon 1002:5965 radeon 1002:5969 radeon 1002:5974 radeon 1002:5975 radeon 1002:5A41 radeon 1002:5A42 radeon 1002:5A61 radeon 1002:5A62 radeon 1002:5B60 radeon 1002:5B62 radeon 1002:5B63 radeon 1002:5B64 radeon 1002:5B65 radeon 1002:5C61 radeon 1002:5C63 radeon 1002:5D48 radeon 1002:5D49 radeon 1002:5D4A radeon 1002:5D4C radeon 1002:5D4D radeon 1002:5D4E radeon 1002:5D4F radeon 1002:5D50 radeon 1002:5D52 radeon 1002:5D57 radeon 1002:5E48 radeon 1002:5E4A radeon 1002:5E4B radeon 1002:5E4C radeon 1002:5E4D radeon 1002:5E4F radeon 1002:7100 radeon 1002:7101 radeon 1002:7102 radeon 1002:7103 radeon 1002:7104 radeon 1002:7105 radeon 1002:7106 radeon 1002:7108 radeon 1002:7109 radeon 1002:710A radeon 1002:710B radeon 1002:710C radeon 1002:710E radeon 1002:710F radeon 1002:7140 radeon 1002:7141 radeon 1002:7142 radeon 1002:7143 radeon 1002:7144 radeon 1002:7145 radeon 1002:7146 radeon 1002:7147 radeon 1002:7149 radeon 1002:714A radeon 1002:714B radeon 1002:714C radeon 1002:714D radeon 1002:714E radeon 1002:714F radeon 1002:7151 radeon 1002:7152 radeon 1002:7153 radeon 1002:715E radeon 1002:715F radeon 1002:7180 radeon 1002:7181 radeon 1002:7183 radeon 1002:7186 radeon 1002:7187 radeon 1002:7188 radeon 1002:718A radeon 1002:718B radeon 1002:718C radeon 1002:718D radeon 1002:718F radeon 1002:7193 radeon 1002:7196 radeon 1002:719B radeon 1002:719F radeon 1002:71C0 radeon 1002:71C1 radeon 1002:71C2 radeon 1002:71C3 radeon 1002:71C4 radeon 1002:71C5 radeon 1002:71C6 radeon 1002:71C7 radeon 1002:71CD radeon 1002:71CE radeon 1002:71D2 radeon 1002:71D4 radeon 1002:71D5 radeon 1002:71D6 radeon 1002:71DA radeon 1002:71DE radeon 1002:7200 radeon 1002:7210 radeon 1002:7211 radeon 1002:7240 radeon 1002:7243 radeon 1002:7244 radeon 1002:7245 radeon 1002:7246 radeon 1002:7247 radeon 1002:7248 radeon 1002:7249 radeon 1002:724A radeon 1002:724B radeon 1002:724C radeon 1002:724D radeon 1002:724E radeon 1002:724F radeon 1002:7280 radeon 1002:7281 radeon 1002:7283 radeon 1002:7284 radeon 1002:7287 radeon 1002:7288 radeon 1002:7289 radeon 1002:728B radeon 1002:728C radeon 1002:7290 radeon 1002:7291 radeon 1002:7293 radeon 1002:7297 radeon 1002:7834 radeon 1002:7835 radeon 1002:791E radeon 1002:791F radeon 1002:793F radeon 1002:7941 radeon 1002:7942 radeon 1002:796C radeon 1002:796D radeon 1002:796E radeon 1002:796F radeon 1002:9400 radeon 1002:9401 radeon 1002:9402 radeon 1002:9403 radeon 1002:9405 radeon 1002:940A radeon 1002:940B radeon 1002:940F radeon 1002:94C0 radeon 1002:94C1 radeon 1002:94C3 radeon 1002:94C4 radeon 1002:94C5 radeon 1002:94C6 radeon 1002:94C7 radeon 1002:94C8 radeon 1002:94C9 radeon 1002:94CB radeon 1002:94CC radeon 1002:9500 radeon 1002:9501 radeon 1002:9505 radeon 1002:9507 radeon 1002:950F radeon 1002:9511 radeon 1002:9515 radeon 1002:9580 radeon 1002:9581 radeon 1002:9583 radeon 1002:9586 radeon 1002:9587 radeon 1002:9588 radeon 1002:9589 radeon 1002:958A radeon 1002:958B radeon 1002:958C radeon 1002:958D radeon 1002:958E radeon 1002:95C0 radeon 1002:95C5 radeon 1002:95C7 radeon 1002:95C2 radeon 1002:95C4 radeon 1002:95CD radeon 1002:95CE radeon 1002:95CF radeon 1002:9590 radeon 1002:9596 radeon 1002:9597 radeon 1002:9598 radeon 1002:9599 radeon 1002:9591 radeon 1002:9593 radeon 1002:9610 radeon 1002:9611 radeon 1002:9612 radeon 1002:9613 radeon 1002:9440 radeon 1002:9441 radeon 1002:9442 rendition 1163:0001 rendition 1163:2000 s3 5333:88D0 s3 5333:88D1 s3 5333:88F0 s3 5333:8811 s3 5333:8812 s3 5333:8814 s3 5333:8901 s3virge 5333:5631 s3virge 5333:883D s3virge 5333:8A01 s3virge 5333:8A10 s3virge 5333:8C01 s3virge 5333:8C03 s3virge 5333:8904 s3virge 5333:8A13 savage 5333:8A22 savage 5333:8A20 savage 5333:8A21 savage 5333:9102 savage 5333:8C10 savage 5333:8C11 savage 5333:8C12 savage 5333:8C13 savage 5333:8A25 savage 5333:8A26 savage 5333:8D01 savage 5333:8D02 savage 5333:8C22 savage 5333:8C24 savage 5333:8C26 savage 5333:8C2A savage 5333:8C2B savage 5333:8C2C savage 5333:8C2D savage 5333:8C2E savage 5333:8C2F savage 5333:8D03 savage 5333:8D04 siliconmotion 126F:0910 siliconmotion 126F:0810 siliconmotion 126F:0820 siliconmotion 126F:0710 siliconmotion 126F:0712 siliconmotion 126F:0720 siliconmotion 126F:0730 sis 1039:0200 sis 1039:6306 sis 1039:6326 sis 1039:0300 sis 1039:6300 sis 1039:5300 sis 1039:5315 sis 1039:0310 sis 1039:0325 sis 1039:6325 sis 1039:0330 sis 1039:0340 sis 0103:9315 sis 1039:6330 tdfx 121A:0003 tdfx 121A:0005 tdfx 121A:0009 tga 1011:0004 tga 1011:000D trident 1023:2100 trident 1023:2201 trident 1023:8400 trident 1023:8420 trident 1023:8500 trident 1023:8520 trident 1023:8600 trident 1023:8620 trident 1023:8820 trident 1023:9320 trident 1023:9388 trident 1023:9397 trident 1023:939A trident 1023:9420 trident 1023:9440 trident 1023:9520 trident 1023:9525 trident 1023:9540 trident 1023:9660 trident 1023:9750 trident 1023:9850 trident 1023:9880 trident 1023:9910 tseng 100C:3202 tseng 100C:3205 tseng 100C:3206 tseng 100C:3207 tseng 100C:3208 vmware 15AD:0405 vmware 15AD:0710 voodoo 121A:0001 voodoo 121A:0002 openchrome 1106:3122 openchrome 1106:7205 openchrome 1106:3108 openchrome 1106:3118 openchrome 1106:3344 openchrome 1106:3230 openchrome 1106:3371 openchrome 1106:3157 openchrome 1106:3343 openchrome 1106:1122 openchrome 1106:5122 vboxvideo 80EE:BEEF tcos-0.89.93ubuntu2/xorgids/generate.sh0000664000000000000000000000215612260610261014676 0ustar #!/bin/sh # Copyright (C) 2006,2007,2008 mariodebian at gmail # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # OUTPUT=xorg.pciids cat /dev/null > $OUTPUT for i in /usr/share/xserver-xorg/pci/*ids openchrome.ids vboxvideo.ids; do driver=$(basename $i .ids) echo " * parsing driver $driver" >&2 for _line in $(cat $i); do line=$(echo $_line | awk '{print substr($1,0,4)":"substr($1,5,8)}' | tr '[a-z]' '[A-Z]') echo "$driver $line" >> $OUTPUT done done tcos-0.89.93ubuntu2/xorgids/openchrome.ids0000664000000000000000000000014312260610261015402 0ustar 11063122 11067205 11063108 11063118 11063344 11063230 11063371 11063157 11063343 11061122 11065122 tcos-0.89.93ubuntu2/HACKING.en0000664000000000000000000000417312260610261012462 0ustar ############################################### Adding extra software to TCOS initramfs ############################################### TCOS is a set of scripts that copies binaries and libraries in a boot image file. It is posible to add more utilities as they are needed. Use /etc/tcos/hacking/template as a template HOW-TO add specific applications to the generated image: Add display (image viewer => ImageMagick) Create a file in /etc/tcos/hacking/ containing this: ####### /etc/tcos/hacking/display ############## # TCOS script for display command cpifexists /usr/bin/display /usr/bin ############################################## Helpers that can be used: * cpifexits [BINARY] [PATH_DESTINATION] Ayudantes que podemos usar: * cpifexits [BINARY] [PATH_DESTINATION] It copies a BINARY designated by its full path in PATH_DESTINATION inside the initramfs This function also copies any dependent library. Example: cpifexists /sbin/fdisk /sbin/ Internally it runs: $ ldd /sbin/fdisk linux-gate.so.1 => (0xffffe000) libc.so.6 => /lib/tls/libc.so.6 (0xb7e3e000) /lib/ld-linux.so.2 (0xb7f8f000) And the linked libraries are copied. NOTE: It will try NOT copying any library related to /lib/tls/ Regular files can be copied too: cpifexists /etc/hosts.allow /etc/ * copydir [DIR] [PATH_DESTINATION] It copies a whole directory in the initramfs file, being equivalent to run cp -ra DIR $INITRAMFS/$DESTINATION Example: copydir /etc/dropbear/ /etc/ * stat_before It calculates the initramfs file's size for state_after function * stat_after "TEXT" It calculates the difference between the current initramfs file's size and the one state_before calculated and prints that difference on screen. Full example: stat_before cpifexists /usr/bin/display /usr/bin/ stat_after "ImageMagick display" This copies the BINARY (and linked libraries) in the initramfs and calculates the added size, printing on screen: => Package ImageMagick display got XXX Kb. tcos-0.89.93ubuntu2/common.mk0000664000000000000000000000526012260610261012711 0ustar #.SILENT: PACKAGE=tcos # uncomment for verbose build #V=1 MAKE:=make -B GCC:=gcc INSTALL:=install ifndef V QUIET_CC = @echo ' $(TXT)' CC $@; QUIET_CL = @echo ' $(TXT)' CLEAN $@ `basename $(CURDIR)`; QUIET_LN = @echo ' $(TXT)' LINK $@; MAKE = @make --no-print-directory -B endif VERSION=$(shell head -1 debian/changelog 2>/dev/null | awk '{gsub(/\(/,"",$$2); gsub(/\)/, "" , $$2); print $$2}' ) have_changelog := $(wildcard debian/changelog) ifeq ($(strip $(have_changelog)),) VERSION=$(shell head -1 ../debian/changelog 2>/dev/null | awk '{gsub(/\(/,"",$$2); gsub(/\)/, "" , $$2); print $$2}' ) endif TCOS_CONFIG_FILE=conf/tcos.conf have_config := $(wildcard conf/tcos.conf) ifeq ($(strip $(have_config)),) TCOS_CONFIG_FILE=../conf/tcos.conf endif TCOS_DIR=$(shell awk -F "=" '/TCOS_DIR=/ {print $$2}' $(TCOS_CONFIG_FILE) ) TFTP_DIR=$(shell awk -F "=" '/TFTP_DIR=/ {print $$2}' $(TCOS_CONFIG_FILE) ) TCOS_CONF=$(shell awk -F "=" '/TCOS_CONF=/ {print $$2}' $(TCOS_CONFIG_FILE) ) TCOS_BINS=$(shell awk -F "=" '/TCOS_BINS=/ {print $$2}' $(TCOS_CONFIG_FILE) ) TCOS_STANDALONE_DIR=/var/lib/tcos/standalone TCOS_XMLRPC_DIR=$(PREFIX)/share/tcos/xmlrpc/ DBUS_CONF=/etc/dbus-1/system.d/ X11_CONF=/etc/X11/Xsession.d/ OPENVPN_CONF=/var/lib/tcos/openvpn/ DISTRO_VERSION=$(shell dpkg-parsechangelog | awk '/^Distribution/ {print $$2}') have_changelog := $(wildcard debian/changelog) ifeq ($(strip $(have_changelog)),) DISTRO_VERSION=$(shell dpkg-parsechangelog -l../debian/changelog | awk '/^Distribution/ {print $$2}') endif TCOS_ARCH:=$(shell dpkg-architecture | awk -F"=" '/^DEB_BUILD_ARCH=/ {print $$2}') TCOS_MULTIARCH:=$(shell dpkg-architecture -qDEB_HOST_MULTIARCH) # debian or ubuntu ??? HAVE_DEBIAN=$(shell grep -i -c debian /etc/issue) HAVE_UBUNTU=$(shell grep -i -c ubuntu /etc/issue) ifeq ($(HAVE_DEBIAN),1) DISTRO=debian endif ifeq ($(HAVE_UBUNTU),1) DISTRO=ubuntu endif ifeq ($(strip $(DISTRO)),) DISTRO=debian endif PREFIX:=/usr test: @echo "------------------------------------" @echo VERSION=$(VERSION) @echo PACKAGE=$(PACKAGE) @echo @echo TCOS_ARCH=$(TCOS_ARCH) @echo TCOS_MULTIARCH=$(TCOS_MULTIARCH) @echo @echo PREFIX=$(PREFIX) @echo DESTDIR=$(DESTDIR) @echo @echo CURDIR=$(CURDIR) @echo @echo TCOS_DIR=$(TCOS_DIR) @echo TCOS_BINS=$(TCOS_BINS) @echo TCOS_XMLRPC_DIR=$(TCOS_XMLRPC_DIR) @echo DBUS_CONF=$(DBUS_CONF) @echo X11_CONF=$(X11_CONF) @echo OPENVPN_CONF=$(OPENVPN_CONF) @echo @echo DISTRO=$(DISTRO) @echo DISTRO_VERSION=$(DISTRO_VERSION) @echo @echo CFLAGS=$(CFLAGS) @echo LDFLAGS=$(LDFLAGS) @echo CPPFLAGS=$(CPPFLAGS) @echo CXXFLAGS=$(CXXFLAGS) @echo "------------------------------------" tcos-0.89.93ubuntu2/debian/0000775000000000000000000000000012313341344012311 5ustar tcos-0.89.93ubuntu2/debian/tcos-core.docs0000664000000000000000000000001312260610261015051 0ustar README.ssl tcos-0.89.93ubuntu2/debian/tcos-core.install0000664000000000000000000000037412260610261015601 0ustar etc/dbus-1/system.d/tcosmonitor.conf etc/X11/Xsession.d/80export_pulseaudio usr/lib/tcos/* usr/share/tcos-core/lockscreen.png usr/sbin/update-tcospasswd usr/sbin/tcospasswd etc/xdg/autostart/session-cmd.desktop etc/tcos/ssl/* var/lib/tcos/version.conf tcos-0.89.93ubuntu2/debian/tcos-standalone.manpages0000664000000000000000000000004212260610261017116 0ustar tcos-standalone/tcos-standalone.1 tcos-0.89.93ubuntu2/debian/initramfs-tools-tcos.postinst0000664000000000000000000000520112260610261020212 0ustar #!/bin/sh set -e # create tcos group if not exists if ! getent group tcos >/dev/null; then addgroup --quiet --system tcos || true fi # make sure that tcos.conf is not all readable chmod -f 644 /etc/tcos/tcos.conf chown -f root:tcos /etc/tcos/tcos.conf chmod -f 775 /var/lib/tcos/tftp/pxelinux.cfg chown -f -R root:tcos /var/lib/tcos/tftp/pxelinux.cfg chmod -f -R 664 /var/lib/tcos/tftp/pxelinux.cfg/* 2>/dev/null || true chown -f -R root:tcos /etc/tcos/secrets chmod -f 755 /etc/tcos/secrets chmod -f -R 640 /etc/tcos/secrets/* 2>/dev/null || true if [ -d /etc/tcos/templates ];then chown -f -R root:tcos /etc/tcos/templates chmod -f 775 /etc/tcos/templates chmod -f -R 640 /etc/tcos/templates/tcos* 2>/dev/null || true fi # create file [ ! -e /etc/tcos/modules ] && touch /etc/tcos/modules # obsolete file, moved to tcos-core:/var/lib/tcos/version.conf [ -e /etc/tcos/version.conf ] && rm -f /etc/tcos/version.conf # FIXME, now tftp is /srv/tftp TFTPBOOT_DEFAULT=/var/lib/tftpboot TFTPBOOT= read_inetd() { # read tftpboot dir from inetd.conf if [ -f /etc/inetd.conf ]; then # get last word of tftp file tmp=$(awk '/^tftp/ {print $NF}' /etc/inetd.conf 2>/dev/null) if [ -d "${tmp}" ]; then TFTPBOOT=${tmp} fi fi } read_dnsmasq() { # read tftp-root var from /etc/dnsmasq.conf if [ -f /etc/dnsmasq.conf ]; then tmp=$(awk -F'=' '/^tftp-root/ {print $2}' /etc/dnsmasq.conf 2>/dev/null) if [ -d "${tmp}" ]; then TFTPBOOT=${tmp} fi fi } read_from_conf() { #$1 is conf file if [ -f "$1" ]; then for txt in $(grep OPTIONS "$1" ); do if [ $(echo $txt |grep -c "/" ) = 1 ]; then TFTPBOOT=$(echo $txt| sed s/"\""/""/g) fi done fi } # # First we try to read from dnsmasq, second inetd and third conf file # read_dnsmasq if [ -z "$TFTPBOOT" ]; then # read from inetd read_inetd fi if [ -z "$TFTPBOOT" ]; then # try with conf files read_from_conf "/etc/default/atftpd" fi if [ -z "${TFTPBOOT}" ]; then TFTPBOOT=$TFTPBOOT_DEFAULT echo " * Using $TFTPBOOT_DEFAULT dir as TFTP root dir" fi if [ ! -d ${TFTPBOOT} ]; then # create dir mkdir -p "${TFTPBOOT}" echo " * Created $TFTPBOOT dir as TFTP root dir" fi if [ ! -L ${TFTPBOOT}/tcos ]; then rm -rf ${TFTPBOOT}/tcos fi # make symlink if [ ! -e ${TFTPBOOT}/tcos ]; then ln -s /var/lib/tcos/tftp ${TFTPBOOT}/tcos fi [ ! -e /var/lib/tcos/tftp/conf ] && mkdir -p /var/lib/tcos/tftp/conf chown -f -R root:tcos /var/lib/tcos/tftp/conf chmod -f 775 /var/lib/tcos/tftp/conf chmod -f -R 664 /var/lib/tcos/tftp/conf/* 2>/dev/null || true #DEBHELPER# tcos-0.89.93ubuntu2/debian/tcos-standalone.prerm0000664000000000000000000000041612260610261016455 0ustar #!/bin/sh set -e case "$1" in purge|remove) # stop tcos-standalone script if [ -x "`which invoke-rc.d 2>/dev/null`" ]; then invoke-rc.d tcos-standalone stop || true else /etc/init.d/tcos-standalone stop || true fi ;; esac #DEBHELPER# tcos-0.89.93ubuntu2/debian/tcos-core.manpages0000664000000000000000000000006712260610261015725 0ustar xmlrpc/man/tcospasswd.1 xmlrpc/man/update-tcospasswd.1 tcos-0.89.93ubuntu2/debian/initramfs-tools-tcos.docs0000664000000000000000000000010212260610261017252 0ustar HACKING.es TODO README README.wireless README.cache README.freenx tcos-0.89.93ubuntu2/debian/tcos-core.dirs0000664000000000000000000000005012260610261015063 0ustar /etc/init.d /usr/lib/tcos /etc/tcos/ssl tcos-0.89.93ubuntu2/debian/tcos-standalone.postinst0000664000000000000000000000035112260610261017211 0ustar #!/bin/sh set -e # tcos-standalone echo "TCOS_DATE=$(LC_ALL=C LC_MESSSAGES=C date)" > /var/lib/tcos/standalone/etc/tcos.conf echo "TCOS_VERSION=$2" >> /var/lib/tcos/standalone/etc/tcos.conf #DEBHELPER# tcos-0.89.93ubuntu2/debian/copyright0000664000000000000000000000331612260610261014245 0ustar Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: tcos Upstream-Contact: Mario Izquierdo (mariodebian) Source: http://tcosproject.org/cgit/tcos.git Files: xmlrpc/common.c (base64 functions) Comment: base64 encoding/decoding (RFC1341) functions Copyright: 2005 Jouni Malinen License: GPL-2.0+ Files: session-cmd/* Copyright: 2007 Luis Garcia Gisbert License: GPL-2.0+ Files: lockscreen/lockscreen.c lockscreen/lockscreen2.c Comment: based on iTalC lockscreen Copyright: 2004-2005 Tobias Doerffel License: GPL-2.0+ Files: * Copyright: 2005-2011 Mario Izquierdo (mariodebian) 2007-2010 Ignacio Vidal License: GPL-2.0+ Files: debian/* Copyright: 2005-2011 Mario Izquierdo (mariodebian) 2007-2010 Ignacio Vidal License: GPL-2.0+ License: GPL-2.0+ This package 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 package 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 version 2 can be found in "/usr/share/common-licenses/GPL-2". tcos-0.89.93ubuntu2/debian/initramfs-tools-tcos.dirs0000664000000000000000000000053512260610261017275 0ustar /etc /etc/tcos /etc/tcos/hacking /etc/tcos/templates /etc/tcos/scripts /etc/tcos/scripts/tcos-bottom /etc/tcos/scripts/tcos-nfs-top /etc/tcos/scripts/tcos-premount /etc/tcos/scripts/tcos-top /etc/tcos/hooks /etc/tcos/hooks-addons /etc/tcos/conf.d /etc/tcos/pxelinux.d /etc/tcos/secrets /var/cache/tcos/packages /var/lib/tcos/tftp /usr/sbin /usr/bin tcos-0.89.93ubuntu2/debian/initramfs-tools-tcos.manpages0000664000000000000000000000012512260610261020122 0ustar bin/gentcos.1 bin/tcos-buildchroot.1 xmlrpc/man/tcosxmlrpc.1 bin/tcos-genbootchart.1 tcos-0.89.93ubuntu2/debian/tcos-standalone.dirs0000664000000000000000000000017512260610261016273 0ustar /etc/default /var/lib/tcos/standalone /var/lib/tcos/standalone/log /var/lib/tcos/standalone/www /var/lib/tcos/standalone/etc tcos-0.89.93ubuntu2/debian/source/0000775000000000000000000000000012260610427013613 5ustar tcos-0.89.93ubuntu2/debian/source/format0000664000000000000000000000001512260610261015016 0ustar 3.0 (native) tcos-0.89.93ubuntu2/debian/changelog0000664000000000000000000043751712313341344014204 0ustar tcos (0.89.93ubuntu2) trusty; urgency=medium * Update build-deps for the xmlrpc-c 1.33.06 transition. -- Adam Conrad Sat, 22 Mar 2014 11:02:33 -0600 tcos (0.89.93ubuntu1) trusty; urgency=medium * Merge from debian, remaining changes: - Drop dhcp3-server from Depends: following dhcp3-server to isc-dhcp-server transition. - xmlrpc/common.c: Comment out the memset implementation to allow inlining of memset from libc (fixes FTBFS with gcc-4.7). -- Dimitri John Ledkov Tue, 31 Dec 2013 18:46:36 +0000 tcos (0.89.93) unstable; urgency=low * Bump standards version to 3.9.4, no changes needed * Fix debian/copyright format (lintian: unversioned copyright format uri) * Read fgets() result * Use build var TCOS_MULTIARCH * Use mkinitramfs temp dir instead of initramfs file to avoid [intel|amd]-microcode in initrd.gz * Enable hardening build * Multiarch fixes * Use mke2fs for ext3 and ext4 * Fix nvidia clean * Check for DESTDIR/scripts dir before cleaning * Read fgets() result in tnc/tcos-net-controller.c * Use mktemp file in squash creation log file -- Mario Izquierdo (mariodebian) Thu, 10 Oct 2013 16:29:03 +0200 tcos (0.89.92) unstable; urgency=low * Fix some multiarch and console-setup issues * Use ~/.Xauthority only if not empty * Replace fuse-utils with fuse package in Recommends, (closes: #698181) * Remove depends on python-eggtrayicon, (closes: #702105) * Remove -I/usr/lib in Makefiles, (closes: #722844) * Save multiarch during build -- Mario Izquierdo (mariodebian) Mon, 07 Oct 2013 15:22:53 +0200 tcos (0.89.91) unstable; urgency=low * Disable udevadm divert, fail on old versions * Fix pulseaudio parse version * Fix some multiarch libs, fix modprobe list (closes: #694870), * Use glx-alternative mesa instead of fix-nvidia-ati -- Mario Izquierdo (mariodebian) Wed, 02 Jan 2013 22:28:39 +0100 tcos (0.89.90ubuntu2) saucy; urgency=low * Depend on the new package name: fuse-utils is renamed to fuse. -- Dmitrijs Ledkovs Tue, 28 May 2013 16:15:40 +0100 tcos (0.89.90ubuntu1) quantal; urgency=low * Merge from Debian unstable. Remaining changes: - Drop dhcp3-server from Depends: following dhcp3-server to isc-dhcp-server transition. - xmlrpc/common.c: Comment out the memset implementation to allow inlining of memset from libc (fixes FTBFS with gcc-4.7). -- Logan Rosen Wed, 08 Aug 2012 20:00:49 -0400 tcos (0.89.90) unstable; urgency=low * debian/initramfs-tools-tcos.postrm: - piuparts, don't call delgroup if can't * Add overlayfs as aufs alternative * hooks-addons/clean_initramfs: multiarch with libpci3 * Simplify grep commands * Install conf/tcos.conf instead of conf/tcos.conf.etc * Use a global LIB_MULTIARCH var * tcos-standalone French translation, thanks to Julien Patriarca, (closes: #672135) -- Mario Izquierdo (mariodebian) Fri, 22 Jun 2012 13:42:53 +0200 tcos (0.89.89ubuntu2) quantal; urgency=low * Drop dhcp3-server from Depends: following dhcp3-server to isc-dhcp-server transition. -- Andy Whitcroft Thu, 02 Aug 2012 10:08:12 +0100 tcos (0.89.89ubuntu1) quantal; urgency=low * xmlrpc/common.c: Comment out the memset implementation to allow inlining of memset from libc (fixes FTBFS with gcc-4.7). -- Michael Bienia Thu, 17 May 2012 22:03:28 +0200 tcos (0.89.89) unstable; urgency=low * debian/initramfs-tools-tcos.postinst: - Fix remove obsolete version.conf -- Mario Izquierdo (mariodebian) Fri, 13 Jan 2012 13:11:33 +0100 tcos (0.89.88) unstable; urgency=low * bin/tcos-buildchroot: - Install tcos-keyring only with tcos repo. - Don't use universe/multiverse in ubuntu-security * bin/gentcos: Set TCOS_KERNEL to newest vmlinuz in /boot * bin/tcos-buildchroot: - Add dbus,dbus-x11,avahi-daemon to chroot. - Delete not needed code. - Copy vmlinuz to tftp root * conf/tcos.conf: Unset TCOS_KERNEL * conf/tcos.conf.all: TCOS_DBUS=1, pulseaudio needs it * scripts/tcos-top/01busybox: - Delete ra interface. - Send a line break after waiting for net * hooks-addons/21pulseaudio: - Enable module-udev-detect if avalaible * hooks-addons/50xorg: - Search libGL.so.1 in /usr/lib/ARCH-linux-gnu/mesa/ * hooks-addons/16dbus-avahi: - Split TCOS_DBUS and TCOS_AVAHI, TCOS_DBUS is enabled by default now -- Mario Izquierdo (mariodebian) Sun, 08 Jan 2012 16:42:46 +0100 tcos (0.89.87) unstable; urgency=low * conf/xorg.conf.tpl: Add ModulePath to not load propietary drivers * tcos-core: Depends on adduser (for postinst/postrm) * initramfs-tools-tcos.postrm: Delete (on purge) some files and dirs, piuparts errors * Don't hardcode TCOS_KERNEL_VERSION, use newest from /boot * Move version.conf from /etc/tcos to /var/lib/tcos * Move version.conf to tcos-core (arch depend) * bin/tcos-buildchroot: TCOS_MIRROR optional now with TCOS in Debian and Ubuntu * debian/control: Remove conflicts and XB-Python-Version -- Mario Izquierdo (mariodebian) Mon, 02 Jan 2012 17:34:07 +0100 tcos (0.89.86) unstable; urgency=low * Change 'xvnc4viewer | xvncviewer' with xtightvncviewer (avalaible in armel) (closes: #651188) * debian/changelog: split a very long line -- Mario Izquierdo (mariodebian) Wed, 07 Dec 2011 23:24:48 +0100 tcos (0.89.85) unstable; urgency=low * common.mk: Update kernel versions (add 2 last Ubuntus) * tcos-standalone.init 45wakeonlan: Support old and new ethtool paths * Makefile: disable openvpn install target * hooks-addons/45wakeonlan: Fix OR => AND in ethtool paths * tnc/tcos-net-controller.c: Remove not needed include, fix hurd-i386 build * tcos-standalone: move ethtool from Depends to Recommends * debian/tcos-standalone.init: Check if ethtool bin exists before run wakeonlan * hooks-addons/45wakeonlan: refactor ethtool cpifexists * Change Priority to extra, we depend on some extra packages * move from CDBS to dh7 * hooks-addons/50xorg: Remove nVIDIA libs in multiarch paths too * hooks-addons/21pulseaudio: No install filter, equalizer or rygel modules -- Mario Izquierdo (mariodebian) Thu, 24 Nov 2011 16:02:16 +0100 tcos (0.89.84) unstable; urgency=low * Promoted by "Antonio Pérez-Aranda " from Yaco Sistemas SL * hooks-addons/00main: really fix libgssapi_krb5 -- Mario Izquierdo (mariodebian) Thu, 15 Sep 2011 15:43:18 +0200 tcos (0.89.83) unstable; urgency=low * fix some compilations warnings variable ‘XXX’ set but not used [-Wunused-but-set-variable] * hooks-addons/00main: multiarch support for libgssapi_krb5.so * hooks-addons/51paquito: fix typo ) => } -- Mario Izquierdo (mariodebian) Thu, 15 Sep 2011 15:42:54 +0200 tcos (0.89.82) unstable; urgency=low * Add Ubuntu Natty and update Ubuntu Maverick kernels * lockscreen/Makefile: Use pkg-config to get glib-2.0 includes and libs * Fix warnings: 'variable XXX set but not used [-Wunused-but-set-variable]' * Fix multiarch support * hooks-addons/51dri: Add multiarch support * hooks-addons/00main: Add more multiarch code, and include rpcbind daemon * scripts/tcos-top/05network: Exec rpcbind if found * hooks-addons/04debug: ldd use x64 if exists * hooks-addons/50xorg: delete libnvidia files in image * bin/tcos-buildchroot: add file to package list in chroot * hooks-addons/05compcache: Use 'zram' in newer kernels * hooks-addons/50xorg: search for NVIDIA in libglx.so * Use '-e' instead '-d' for dir tests -- Mario Izquierdo (mariodebian) Wed, 06 Jul 2011 14:42:59 +0200 tcos (0.89.81) unstable; urgency=low * debian/initramfs-tools-tcos.install: Install OpenVPN files in /var/lib/tcos/openvpn * common.mk: Update kernels -- Mario Izquierdo (mariodebian) Sun, 12 Jun 2011 14:31:46 +0200 tcos (0.89.80) unstable; urgency=low * change xmlrpc dev build depends order * xmlrpc/Makefile: use $(shell cmd) instead of * hooks-addons/16dbus-avahi: add Avahi mDNS for autodiscover tcos hosts * hooks-addons/16dbus-avahi: join the Avahi services in one file * Add Avahi tcos-standalone.service file * add OpenVPN support for TCOS images * conf/base.conf: add TCOS_OPENVPN var (disabled by default) * hooks-addons/18openvpn: fix var names * scripts/tcos-top/05network: Use TCOS_SERVER instead of dhcpserver for tcos-server in /etc/hosts * xmlrpc/sh/getinfo.sh: fix typo * hooks-addons/18openvpn: don't save hostname as VPN server IP * openvpn/tcos-init-openvpn: secure key files and restart openvpn with cond-restart * scripts/tcos-bottom/25startx: Use getinfo to get NETWORK_IP * openvpn/tcos-init-openvpn: add info messages * xmlrpc/sh/getinfo.sh hooks-addons/18openvpn: use tap0 instead of tun0 and wait for VPN link * hooks-addons/18openvpn: Add message when starting VPN * Switch VPN dir from /etc/tcos/openvpn to /var/lib/tcos/openvpn * initial multiseat support * bin/tcos-buildchroot: fix udevadm calls in chroot and use dpkg-divert to move files * openvpn: use tap instead of tun in server side * hooks-addons/00main: Use /lib/x86_64-linux-gnu if found * hooks-addons/01busybox: remove silent old busybox * hooks-addons/03udev2: copy /lib/udev/pci-db if found (sound realated) * hooks-addons/18openvpn: add break points * bin/gentcos: convert module links in files and call parse_pxelinuxcfg after image build -- Mario Izquierdo (mariodebian) Sun, 12 Jun 2011 13:46:41 +0200 tcos (0.89.79) unstable; urgency=low * bin/configurexorg: fix quotes in font paths * debian/initramfs-tools-tcos.postinst: bashish, don't use function * debian/tcos-standalone.init: cosmetic changes in init script * debian/control: Use Standars 3.9.1 and add libxmlrpc-core-c3-dev as alternative of libxmlrpc-c3-dev -- Mario Izquierdo (mariodebian) Fri, 25 Feb 2011 18:38:33 +0100 tcos (0.89.78) unstable; urgency=low * lockscreen/Makefile tmixer/Makefile: add lost link flags, thanks ghe@d.o -- Mario Izquierdo (mariodebian) Wed, 16 Feb 2011 18:07:32 +0100 tcos (0.89.77) unstable; urgency=low * bin/get_vga_vendor: Use /sys/bus/pci with CLASS 0x030000 to search VGA vendor * lockscreen/Makefile lockscreen/waitforX.c debian/copyright: rewrite waitforX * hooks-addons: exit if waitforX fail * bin/get_vga_vendor bin/configurexorg: save VENDOR and MODEL and use in configurexorg * xmlrpc/pci.h: simplify PCI_ALL command -- Mario Izquierdo (mariodebian) Wed, 16 Feb 2011 17:43:53 +0100 tcos (0.89.76) unstable; urgency=low * debian/copyright: Machine readable debian/copyright format * update debian/copyright * bin/get_vga_vendor: cache VGA Vendor output in /tmp/vga_vendor * global license headers fix * Makefile: delete obsolete targets * debian/control: fix descriptions * debian/*.p* clean scripts and set /bin/sh as shell -- Mario Izquierdo (mariodebian) Mon, 14 Feb 2011 17:41:29 +0100 tcos (0.89.75) unstable; urgency=low * bin/tcos-buildchroot: remove dhcp3-client * cosmetic changes, remove extra spaces * Makefile common.mk: add Debian Squeeze -- Mario Izquierdo (mariodebian) Sat, 05 Feb 2011 15:55:30 +0100 tcos (0.89.74) unstable; urgency=low * hooks-addons/01busybox: delete old busybox if exists * hooks-addons/01dhclient: copy /usr/lib/tcos/busybox if exists, don't show error messages -- Mario Izquierdo (mariodebian) Wed, 12 Jan 2011 17:24:40 +0100 tcos (0.89.73) unstable; urgency=low * tcos-standalone/tcos-standalone.desktop: replace gksu with su-to- root * bin/get_vga_vendor: use grep to extract vendor ID and product ID * bin/configurexorg: change method to get PCI vendor ID and product ID * remove usplash support * remove dhcp-client depend, switch to busybox udhcpc * udhcpc-script: use ifconfig without /sbin and save all vars in /tmp/net/.data * udhcpc read serverid instead of dhcpserver * clean old dhcp & splash code, and use /sbin/udhcpc if avalaible (lenny) * hooks-addons/01busybox: use TCOS_BINS/busybox if found * hooks-addons/01dhclient: make check with DESTDIR/busybox * hooks-addons/22esd: remove obsolete * hooks-addons/09printer: checkbashisms, remove function * scripts/tcos-top/50fstab: checkbashism let => a=(()) * scripts/tcos-premount/40tftp: checkbashism 'echo -e' * bin/gentcos: checkbashism 'echo -e' -- Mario Izquierdo (mariodebian) Wed, 12 Jan 2011 15:40:15 +0100 tcos (0.89.72) unstable; urgency=low * Convert bin/get-xdg-desktop script in glib C app in lockscreen/get- xdg-desktop.c * debian/control: add libglib2.0-dev to Build Depends (get-xdg- desktop) * lockscreen/Makefile: compile get-xdg-desktop with warnings * Remove GRUB to build ISOS * lockscreen/Makefile: Add GXD to all target and fix install GXD * debian/initramfs-tools-tcos.install: rmeove menu.lst-tcos * tcos-standalone/Makefile: disable qcv locale * Switch to dpkg-source 3.0 (native) * Remove AUTOFS support * remove destripar_initramfs.sh, not needed * Remove UPGRADE.debian and references * Remove not needed SecurityPolicy * Remove obsolete daemonize dir * lockscreen/screensize.c, fix header and close display -- Mario Izquierdo (mariodebian) Mon, 06 Dec 2010 16:13:52 +0100 tcos (0.89.71) unstable; urgency=low * common.mk Update Ubuntu Lucid kernel 2.6.32-26 * conf/tcos-generation-functions.sh: fix templates dir, use absolute path * conf/tcos-generation-functions.sh: fix another wrong templates path -- Mario Izquierdo (mariodebian) Thu, 25 Nov 2010 17:15:15 +0100 tcos (0.89.70) unstable; urgency=low * xmlrpc/sh/tcos-ftpclient: Parse OPEN in True/False way * xmlrpc/sh/tcos-last: set TCOSMONITOR_NO_EXTENSIONS before importing tcosmonitor * debian/copyright: update GIT URL * update GIT url * change TCOS_DIR from /usr/share/initramfs-tools-tcos to /usr/share/tcos -- Mario Izquierdo (mariodebian) Thu, 25 Nov 2010 13:25:47 +0100 tcos (0.89.69) unstable; urgency=low * hooks-addons/13kbmap scripts/tcos-bottom/05inittcos: really fix console keymaps * hooks-addons/clean_initramfs hooks/tcosbin: remove mdadm scripts * bin/get_xauth: fix XAUTHORITY handling -- Mario Izquierdo (mariodebian) Thu, 11 Nov 2010 18:48:17 +0100 tcos (0.89.68) unstable; urgency=low * Fix facet zombie process, go to /tmp and redirect stderr and stdout, thanks to Fede Heinz * session-cmd-script set umask 0177 and don't use --daemon, thanks again to Fede Heinz * session-cmd-script: try to call shared.py directly to get :0.0 IP * bin/tcos-buildchroot: don't install GRUB, and remove it if installed * hooks-addons/13kbmap: link cached.kmap.gz to boottime.kmap.gz * bin/get-xdg-desktop: safe eval XDG_DESKTOP_DIR (allow spaces) and create if not exists * common.mk: remove obsolete kernel versions and update Ubuntu Lucid and MaX -- Mario Izquierdo (mariodebian) Fri, 05 Nov 2010 16:29:28 +0100 tcos (0.89.67.1) unstable; urgency=low * Add Ubuntu Maverick -- Mario Izquierdo Rodríguez (Thinetic Systems SLNE) Fri, 15 Oct 2010 17:52:38 +0200 tcos (0.89.67) unstable; urgency=low * xmlrpc/sh/tcos-last update parseIpAddress and add tcosmonitor Sessions support (dbus+gdm+consolekit) * udev/cdrom-mount: read first CDROM device with devicesctl.sh * conf/80export_pulseaudio: call shared.py instead of importing modules * bin/tcos-gdm-autologin: fix some errors in read_exe_output and use pwd instead of read /etc/passwd * debian/control: allow isc-dhcp-client ash dhcp client * hooks-addons/01dhclient: move libz.so to /lib * hooks-addons/05compcache: use Inactive - 500KB if kbytes > AVALAIBLE * hooks-addons/99clean_nfs_image: move liblzo.so before deleting /usr/lib * hooks-addons/03udev2: don't delete udev script if booting in NFS mode * hooks/tcosnfs: add comcache to NFS initrd image * scripts/tcos-top/60make_init: fix udev script patch and use cat instead of link files in NFS root -- Mario Izquierdo (mariodebian) Sun, 03 Oct 2010 17:10:22 +0200 tcos (0.89.66) unstable; urgency=low * update Ubuntu Lucid kernel to 2.6.32-24 -- Mario Izquierdo (mariodebian) Fri, 10 Sep 2010 20:03:29 +0200 tcos (0.89.65) unstable; urgency=low * bin/gentcos bin/installer.sh session-cmd/session-cmd-script: don't use '&>' to redirect all output * bin/gentcos: add distro and tcos version to gentcos output * bin/tcos-gdm-autologin: update popen2 => subprocess and search a GDM conf file in other sites * bin/tcos-gdm-autologin: add support for setting user if DISPLAY is local and log debug in /var/log/tcos-gdm-autologin.log -- Mario Izquierdo (mariodebian) Fri, 10 Sep 2010 19:54:29 +0200 tcos (0.89.64) unstable; urgency=low * hooks-addons/12getty: fix Debian lenny fgetty launch in background * bin/tcos-buildchroot: add fgetty to TCOS_PACKAGES and console-tools to Debian chroot * bin/configurexorg: fix xorgauto, use only if Xorg support it (xorg.conf.d dir) -- Mario Izquierdo (mariodebian) Tue, 13 Jul 2010 18:22:41 +0200 tcos (0.89.63) unstable; urgency=low * xmlrpc/sh/devicesctl.sh: fix typo, double || * common.mk update kernels * add support to automount CDROM/DVD need new version of tcos-devices- ng * bin/gentcos: Add a workaround for Debian bug #514938, rebuild initramfs if cpio fails * hooks-addons/50xorg: cosmetic change 3 dots * bin/configurexorg: change fullauto method to not user xorg.conf, use /usr/[share|lib]/X11/xorg.conf.d/ and set remote fons * hooks-addons/90plymouth: fix delete DejaVuSans.ttf font * hooks-addons/01dhclient: fix new ISC dhcp client and move libcrypto to /lib if needed * rename new fullauto to xorgauto * Update Ubuntu Lucid kernel to 2.6.32-23 -- Mario Izquierdo (mariodebian) Tue, 13 Jul 2010 12:02:08 +0200 tcos (0.89.62) unstable; urgency=low * conf/tcos-run-functions.sh: download_file() read 0 from tftp command not from rm * hooks-addons/clean_initramfs: be silent if /scripts/panic/ don't exists * bin/tcos-buildchroot install tcos-usplash standalone, Ubuntu Lucid don't have usplash * move cdparanoia from tcos-core to initramfs-tools-tcos * tcos-core must depends on python-ipy * xmlrpc/sh/tcos-last don't crash if IP is binary * bin/tcos-buildchroot: copy /etc/hosts to chroot * udev/save-udev.sh xmlrpc/sh/devicesctl.sh replace spaces with underscores, fix some mount issues, thanks Nacho -- Mario Izquierdo (mariodebian) Thu, 17 Jun 2010 18:13:53 +0200 tcos (0.89.61) unstable; urgency=low [ Mario Izquierdo (mariodebian) ] * xmlrpc/sh/tcos-last: update parseIPAddress function and fix typo mitad => half * xmlrpc/sh/screenshot.sh: use /var/run/gdm*/ valid for Ubuntu and Debian * bin/get_xauth: use /var/run/gdm*/ valid for Ubuntu and Debian * scripts/tcos-top/05network: read x-display-manager and font-servers from dhclient.leases, option 48 and 49 * debian/control: remove arch Depends in a all package, move to Recommends [ Ignacio Vidal ] * bin/get-xdg-desktop: new script to get Desktop dir * ssl: Add FTPSSL default certs * xmlrpc/sh/tcos-ftpclient new FTPSSL client * hooks-addons/03udev2: remove init-bottom/udev * xmlrpc/sh/screenshot.sh: test for XAUTH in /root folder * bin/gentcos: remove bashism function * bin/get_xauth: test for XAUTH in /root folder * bin/rsync-controller: remove old file * conf/tcos-generation-functions.sh: remove bashism function * Makefile: Install new get-xdg-desktop and ssl and not install rsync- controller * debian/control: add ethtools to Recommends * debian/tcos-core.postinst debian/tcos-core.install, unstall and chmod ssl dir * hooks-addons/clean_initramfs: chmod +x all /scripts * xmlrpc/sh/tcos-dbus.py: add DBus arg sendfiles * xmlrpc/Makefile: install sh/tcos-ftpclient * session-cmd/session-cmd-script: use tcosmonitor.shared to get DISPLAY * session-cmd/session-cmd-send: fix echo call * session-cmd/session-cmd-exec: don't load tcos-generation functions and use logout in gnome-session when avalaible [ Mario Izquierdo (mariodebian) ] * Release 0.89.61 -- Mario Izquierdo (mariodebian) Fri, 30 Apr 2010 15:52:18 +0200 tcos (0.89.60) unstable; urgency=low [ Mario Izquierdo (mariodebian) ] * hooks-addons/95usplash_timeout: fix typo 00_nousplash => 00_nosplash * hooks-addons/40etc2300: change stat_after message * debian/control: add alsa-base and xfonts-100dpi to recommends * delete hooks-addons/08discover * hooks-addons/00users: remove '' from password string * scripts/tcos-bottom/05inittcos: don't delete /tmp/initramfs.debug * hooks-addons/50xorg: Add xorg.conf.d files [ Ignacio Vidal ] * bin/down-controller: search comands with which * bin/get_filesystem: try with /sbin/blkid too * bin/get_xauth: search XAUTHORITY in /var/run/gdm * conf/tcos-run-functions.sh: don't ping plymouth on quit * hooks-addons/00users: copy tcospasswd * hooks-addons/10ssl_tunnel xmlrpc/var/etc/stunnel/stunnel-custom.conf xmlrpc/var/etc/stunnel/stunnel.conf use sslVersion=all * xmlrpc/sh/getinfo.sh: use absolute path of pcimodules * xmlrpc/sh/restartx.sh: use which to search command * xmlrpc/sh/rtp-controller.sh: don't use 'w' command to search users * xmlrpc/sh/screenshot.sh: search XAUTHORITY in /var/run * xmlrpc/sh/tcos-last: try to split uthost in half len and compare it, Ubuntu put IP addr twice in this var [ Mario Izquierdo (mariodebian) ] * Release 0.89.60 -- Mario Izquierdo (mariodebian) Fri, 23 Apr 2010 17:56:22 +0200 tcos (0.89.59) unstable; urgency=low * move logo.xpm.gz from /etc/tcos to /usr/share/initramfs-tools-tcos * Release 0.89.59 -- Mario Izquierdo (mariodebian) Sat, 17 Apr 2010 16:09:06 +0200 tcos (0.89.58) unstable; urgency=low [ Mario Izquierdo (mariodebian) ] * initial work supporting plymouth * hooks-addons/12getty hooks-addons/01busybox debian/control: use fgetty to protect shells * scripts/tcos-top/05network: read 'server-name' from dhclient.leases if exists for dhcpserver var * hooks-addons/90plymouth: delete plymouth scripts if disabled * scripts/tcos-bottom/05inittcos: don't change root password on boot, use hashed * hooks-addons/00users: use tcospasswd to generate a password hash and put in the image, don't use chpasswd [ Ignacio Vidal ] * xorgids/xorg.pciids: add new IDS * xmlrpc/var/etc/stunnel/*: Remove extra spaces * xmlrpc/sh/tcos-last: remove duplicate line and use groups command to search users in group * xmlrpc/sh/getinfo.sh: use pcimodules intead of discover * xmlrpc/sh/*: set volumes for capture devices * tnc/tcos-net-controller.c: use TCOS_TNC label for our iptables rules * tmixer/tmixer-alsa.c: Allow control capture channels for rtp, mic... * bin/gentcos: cache libglx.so and LibGL.so.1.2 if exists * conf/base.conf: comment new fullauto setting * bin/configurexorg conf/xorg.conf.tpl: use new fullauto and update refresh settings for old monitors * conf/tcos-modules.conf: add scsi-transport-spi i830 mga r128 radeon savage sis tdfx new modules * conf/tcos-run-functions.sh: kill and start plymouth/usplash in same function * hooks-addons/00main: create /usr/lib before copying things to it * hooks-addons/05compcache: add prereqs header * hooks-addons/19usbip: update usbip paths * hooks-addons/40etc2300: refactorize and search for a PCI id * hooks-addons/51dri: add TCOS_XORG_DRI_MATROX and new dri files of radeon and trdent * hooks-addons/54devices: don't copy if /usr/share/initramfs- tools/hooks/ntfs_3g exists * hooks-addons/clean_initramfs: make +x all scripts and delete usplash or plymouth if disabled * scripts/tcos-bottom/40initsound: add more channels * scripts/tcos-premount/40tftp: test if /usr/bin/Xorg is found instead of /usr/share dir * scripts/tcos-top/01busybox: test for usplash before calling it * scripts/tcos-bottom/22intel: exit if fullauto is set * scripts/tcos-bottom/25startx scripts/tcos-bottom/60installer scripts/tcos-bottom/80shell: change usplash => splash * hooks-addons/96modules: disable splash if sisfb is needed * hooks-addons/51amd_geode hooks-addons/51via_openchrome: exit if fullauto is set * hooks-addons/00init: rename usplash => splash * hooks-addons/90plymouth hooks-addons/95usplash_timeout [ Mario Izquierdo (mariodebian) ] * New release 0.89.58 -- Mario Izquierdo (mariodebian) Sat, 17 Apr 2010 15:59:10 +0200 tcos (0.89.57) unstable; urgency=low * Rename sources from initramfs-tools-tcos to tcos -- Mario Izquierdo (mariodebian) Tue, 06 Apr 2010 16:06:53 +0200 initramfs-tools-tcos (0.89.56) unstable; urgency=low * xmlrpc/sh/devicesctl.sh hooks-addons/54devices: ensure LTSPFS_TOKEN is set * add prereqs in scripts headers * hooks-addons/03udev2: copy input_id helper * hooks-addons/50xorg: copy libGL.so.1 from mesa dir if exists * hooks-addons/clean_initramfs: remove ORDER files an overwrite cache_run_scripts * add prereqs in some other scripts * remove console-tools from chroot packages * bin/tcos-buildchroot: copy lockscreen-custom.png if found * xmlrpc/sh/tcos-last: check IP with ipaddr module * conf/80export_pulseaudio: use python to get DISPLAY -- Mario Izquierdo (mariodebian) Tue, 30 Mar 2010 17:44:09 +0200 initramfs-tools-tcos (0.89.55) unstable; urgency=low * fix dolar escape in openchrome start script * bin/tryXorg.sh: configure fonts servers xfs and xfstt * tmixer/tmixer-alsa.c: Fix hidden channels, only hide enumerates (alsa 1.0.22) * Add support for compcache (ramzswap) * hooks-addons/05compcache: Show info when compcache is enabled * scripts/tcos-bottom/10ldconfig: don't show errors in ldconfig * tnc/tcos-net-controller.c: change ip_by_eth function * hooks-addons/05compcache: fix TOTAL_RAM -- Mario Izquierdo (mariodebian) Fri, 26 Feb 2010 17:36:05 +0100 initramfs-tools-tcos (0.89.54) unstable; urgency=low * remove backup of tcos.conf * better method to get VGA vendor * add dropbear and mbr packages in chroot * change perms 644 to tcos.conf * wait before Xorg is launched a bit more time * don't depend on portmap (Debian unstable) -- Mario Izquierdo (mariodebian) Wed, 06 Jan 2010 17:27:33 +0100 initramfs-tools-tcos (0.89.53) unstable; urgency=low * move some tcos-bottom script later * scripts/tcos-bottom/80shell: stop bootchart if exists * scripts/tcos-bottom/57devices: test ltspfsd * scripts/tcos-bottom/55mount_listener: only start if USB and IDE is enabled * set chmod +x in scripts * bin/tcos-genbootchart: use DISPLAY if not arg is passed * set 2.6.32-trunk-486 for Debian unstable * conf/base.conf: add TCOS_USBIP new var, disabled by default * hooks-addons/19usbip: use new var TCOS_USBIP * debian/tcos-standalone.init: provides tcos-standalone * debian/copyright: replace (C) with © * debian/control: add misc:Depends and fix typo * xmlrpc/man/update-tcospasswd.1 tcos-standalone/tcos-standalone.1 bin/tcos-gdm-autologin.1 bin/tcos-buildchroot.1 bin/gentcos.1: split lines longer than 80 chars * Makefile conf/tcos.conf.light: Add new light template run in 46 MB * conf/tcos-run-functions.sh: update list of killed apps * tcos-standalone/tcos-standalone.desktop: remove obsolete Encoding * New XMLRPC method: config, read vars from tcos.conf in thin client -- Mario Izquierdo (mariodebian) Fri, 18 Dec 2009 19:04:14 +0100 initramfs-tools-tcos (0.89.52) unstable; urgency=low * Enable/disable composite Xorg extension * fix if::else TCOS_COMPOSITE * downgrade some depends to recommends * cosmetic hanges in standalone init script * bin/tcos-buildchroot: copy /etc/localtime /etc/adjtime if exists * hooks-addons/50xorg: copy linked libs * add TCOS_CPUFREQ support with powersave scaling governor * tcos-standalone/tcos-standalone.py replace obsolete popen2 with subprocess * scripts/tcos-bottom/30devices: disable -a in ltspfsd, not needed anymore * remove rtptools and sox depends, audio multicast use pulseaudio native RTP module * fix typo suggest => suggests -- Mario Izquierdo (mariodebian) Sun, 13 Dec 2009 19:24:56 +0100 initramfs-tools-tcos (0.89.51) unstable; urgency=low * new bin waitforX, to e used in startup scripts * copy waitforX and use it instead of 'pidof Xorg' * dnsmasq by default * detect VGA vendor with new script get_vga_vendor * update USBIP bins PATH * add 2 new openchrome cards * hooks-addons/53mga: fix typo * hooks-addons/21pulseaudio: fix typo * tcos-genbootchart: move to /usr/bin * hooks-addons/05devices call ltspfs-set-xprop in X11/PreRun * Update copyright * fix path in tcos-genbootchart -- Mario Izquierdo (mariodebian) Mon, 07 Dec 2009 21:37:52 +0100 initramfs-tools-tcos (0.89.50) unstable; urgency=low * Depend on ltspfsd-core and ltspfs * Use evdev as keyboard driver when kbd is not found * put XbdModel=abnt2 in evdev driver * update depends, change to i386 the thin client depends * update kernels * revert arch depends -- Mario Izquierdo (mariodebian) Sun, 22 Nov 2009 20:14:37 +0100 initramfs-tools-tcos (0.89.49) unstable; urgency=low * remove libnss-db, new libc conflicts with it * set home if getent fails * bin/tcos-buildchroot: remove libnss-db from PACKAGES * hooks-addons/00main: copy libnss_db.so.2 if exists * bin/get_xauth: read cookie from GDM/KDM when no user is logged * scripts/tcos-bottom/10ldconfig: export env vars in /root/.profile * scripts/tcos-bottom/80shell: change order in PS1 var * debian/initramfs-tools-tcos.postinst: fix typo -- Mario Izquierdo (mariodebian) Sun, 08 Nov 2009 14:57:29 +0100 initramfs-tools-tcos (0.89.48) unstable; urgency=low * fix startscale STANDALONE auth argument * copy localtime and adjtime from system to chroot * save date in BIOS after run ntpdate and copy /etc/services always, not only if inetd is ENABLED * bin/get_filesystem: call udevadm if exists * bin/tryXorg.sh: fix AutoAddDevices in xorg.conf.auto -- Mario Izquierdo (mariodebian) Tue, 13 Oct 2009 12:02:21 +0200 initramfs-tools-tcos (0.89.47) unstable; urgency=low * fix typo and use DPATH inseat of reserved var PATH * udev/mount_listener.c don't show errors if poll() return 0 * hooks-addons/03udev: copy /lib/udev/rules.d/40-alsa.rules, Ubuntu Jaunty fix sound * add support to update BIOS date/time with ntpdate, disabled by default * use blkid, from util-linux (if avalaible) to get filesystem type * call user scripts in /etc/tcos/pxelinux.d/*.hook files * log ntpdate in initramfs.debug file * fix typos in example install * add new files to initramfs package * check for reopen in x11vnc before using it * fix exec pxelinux.d hooks and fix example hack -- Mario Izquierdo (mariodebian) Sun, 04 Oct 2009 15:43:59 +0200 initramfs-tools-tcos (0.89.46) unstable; urgency=low * pulseaudio: set exit-idle-time to -1, only set SHM if low memory < 64MiB, and don't copy udev or x11 modules * create p910nd lock dir * update Ubuntu Jaunty kernel to 2.6.28-15-generic * don't run vol_id if not found, and add udevinfo detection method * udev/tcos-udevd.sh udev/save-udev.sh: translate DEVPATH to old short one -- Mario Izquierdo (mariodebian) Thu, 01 Oct 2009 16:03:36 +0200 initramfs-tools-tcos (0.89.45) unstable; urgency=low * Allow to start x11vnc server in scale mode * Include dbus utils, disabled by default * PulseAudio revert to deprecated module-detect add users and revert module-x11-publish => pax11publish * Remove chroot package from DISTRO_PACKAGES -- Mario Izquierdo (mariodebian) Wed, 30 Sep 2009 22:41:29 +0200 initramfs-tools-tcos (0.89.44) unstable; urgency=low * Use abnt2 keymap for Brasil users * Add support for NTFS-3G * Add more info about dnsmasq and gPXE * Allow to personalize usplash resolution * Fix rdesktop IP detection and use correct keymap * xmlrpc/*: - Add support to get screensize in info.[ch] -- Mario Izquierdo (mariodebian) Fri, 25 Sep 2009 23:46:32 +0200 initramfs-tools-tcos (0.89.43) unstable; urgency=low * bin/gentcos: - Copy and remove System.map file. * bin/tcos-buildchroot: - Update to work on Ubuntu karmic - Add lost dependencies - Merge Ubuntu and Debian code, remove cdebootstrap - Preseed console-data, console-setup and dash too * hooks-addons/05devices: - Warn about different ltspfs versions * hooks-addons/21pulseaudio: - Copy linked libs of modules (new libudev) - Use module-udev-detect if avalaible -- Mario Izquierdo (mariodebian) Mon, 07 Sep 2009 11:12:50 +0200 initramfs-tools-tcos (0.89.42) unstable; urgency=low * Fix debian/initramfs-tools-tcos.postinst * Call depmod with System.map file and remove '-e' argument -- Mario Izquierdo (mariodebian) Sun, 06 Sep 2009 13:26:53 +0200 initramfs-tools-tcos (0.89.41) unstable; urgency=low * bin/tcos-buildchroot: - Add --tcos-exp option (enable experimental branch of TCOS repo) - Remove obsolete esound package * Makefile: - Remove obsolete patch targets - Add karmic target - Delete deprecated amd64 patch * tcos/tcos.dnsmasq.conf - Add example of MAC:IP allocation * bin/configurexorg: - Add support to 1440x900 xres * New metapackage tcos-tftp-dhcp: - Install dnsmasq || atftp + dhcp3-server * common.mk: - Add Ubuntu karmic * debian/control: - Reformat - Add debootstrap [amd64] -- Mario Izquierdo (mariodebian) Sun, 06 Sep 2009 12:33:17 +0200 initramfs-tools-tcos (0.89.40) unstable; urgency=low * Switch to CDBS. * Update debhelper to 7.0.0, compat to 7 and Policy to 3.8.0 * Add dnsmasq as replacement of DHCP and TFTP server * Downgrade some Depends to Recomends (since Lenny, Recomends are installed by default) * hooks-addons/50xorg: - Make twm optional -- Mario Izquierdo (mariodebian) Tue, 01 Sep 2009 19:12:50 +0200 initramfs-tools-tcos (0.89.39+1) unstable; urgency=low * hooks-addons/21pulseaudio: - Only add shm settings if found in file (supported) * hooks-addons/03udev2: - Delete more not needed rules * hooks-addons/20alsa: - Only copy /etc/init.d/alsa-utils if found -- Mario Izquierdo (mariodebian) Mon, 31 Aug 2009 15:17:05 +0200 initramfs-tools-tcos (0.89.39) unstable; urgency=low * tcos_vnc() don't show plain password, vnc-controller.sh don't return error with killall fail * mount-listener poll() eats CPU and RAM, wait 2 seconds if no changes * hooks-addons/03udev2: delete some not needed rules * hooks-addons/25tcosmonitor: create wrapper of udevinfo if link or no exists * xmlrpc/sound.c: don't show plain password * scripts/tcos-bottom/75print: Add /dev/usb/lp0 as printer device -- Mario Izquierdo (mariodebian) Tue, 18 Aug 2009 15:11:58 +0200 initramfs-tools-tcos (0.89.38) unstable; urgency=low * Use upper PCI IDs * re-add wait for Xorg when launch rdesktop or local session * delete some not needed modules, create /var/lib/pulse fix SHM memory bug and use module-x11-publish.so -- Mario Izquierdo (mariodebian) Tue, 11 Aug 2009 11:05:45 +0200 initramfs-tools-tcos (0.89.37) unstable; urgency=low * scripts/tcos-top/05network: - Wait 10 seconds for netlink (some gigabit cards needs it) * scripts/tcos-top/01busybox: - Call udevadm too * hooks-addons/25tcosmonitor: - Create udevinfo script if no exists (for backwards compability) * hooks-addons/00main - Copy /lib/libnss_mdns4_minimal.so.2 when avalaible (fix DNS calls) * hooks-addons/50xorg: - Only support Xorg versions >= 7.0 * conf/tcos-modules.conf - Add new modules ide-gd_mod ide-cd_mod * Refactorize Makefiles and some XMLRPC code * Set C code spaces to 2 and clean some old code * Disable old screenshot.c method * Add TCOS_XORG_DRI_* new vars to enable individual DRI libs * Don't copy libGLcore.so if not found (newest xserver-xorg-core don't have it) * Update kernel versions * Disable '-Wl,--as-needed' flags (Squeeze and Lenny don't work) -- Mario Izquierdo (mariodebian) Mon, 13 Jul 2009 20:17:51 +0200 initramfs-tools-tcos (0.89.36) unstable; urgency=low * Add Xfbdev support * hooks-addons/99tcos: - Fix typo TCOS_UNONFS => TCOS_UNIONFS * Disable HAL in Xorg autoconfigure * hooks-addons/50xorg: - Copy linked libs in drivers * hooks-addons/21pulseaudio hooks-addons/22esd scripts/tcos-bottom/40initsound - Disable ESOUND (pulseaudio only support) * Fix typo in hooks-addons/52intel * scripts/tcos-bottom/22intel: - Force intel driver (VESA don't works) * Disable INETD by default * Delete old code (discover, opentelnet, etc...) -- Mario Izquierdo (mariodebian) Thu, 18 Jun 2009 12:32:47 +0200 initramfs-tools-tcos (0.89.35) unstable; urgency=low * hooks/tcosmods: fix detection of floppy module * hooks-addons/21pulseaudio: use pulse-*/ for modules dir adn delete console-kit and ldspa modules * scripts/tcos-bottom/40initsound: fix empty var test and add % to volume string, printf need it * scripts/tcos-bottom/10ldconfig scripts/tcos-bottom/20autofs: fix empty var tests * hooks-addons/50xorg: create /usr/lib/xorg before copying files to it, and don't copy fonts if not exists * scripts/tcos-top/01busybox: fix test var to disable ide modules * scripts/tcos-bottom/80shell: empty cached memory when TCOS ends booting * scripts/tcos-bottom/70wakeonlan: fix var test and only exec ethtool if exists -- Mario Izquierdo (mariodebian) Tue, 19 May 2009 15:34:44 +0200 initramfs-tools-tcos (0.89.34) unstable; urgency=low * Fix have_getty var and sleep 2 second between getty calls * call linkcreator in tcos-bottom/00 and fix ln -s command * bin/configurexorg: set TCOS_ENABLE_FONT_SERVER emtpy if value is 1 * fix initsound script when sound is disabled * Change modprobe.d files with new .conf format -- Mario Izquierdo (mariodebian) Sat, 21 Mar 2009 12:16:14 +0100 initramfs-tools-tcos (0.89.33) unstable; urgency=low * Remove tinylogin (use busybox-static when avalaible * Update GPL to GPL2 in debian/copyright * Disable RDESKTOP in tcos.conf.all * Add geode choipset pci IDS * stunnel don't allow comments on vars lines, fix 0 TIMEOUTclose * Stop and start tcos-bootchartd when booting in NFS mode * use PCI IDS instead of calling lspci in hooks-addons/51amd_geode * use PCI IDS instead of calling lspci in hooks-addons/53mga * Update module deps in initramfs image * don't copy udevinfo, link from udevadm if original is a symbolic link * scripts/tcos-top/01busybox: * remove prereqs test, TCOS don't need * hooks-addons/01busybox: check for static version of busybox, remove tinylogin * hooks-addons/12getty: disable getty if busybox don't have it * hooks-addons/23bootchart: remove prereqs and commented code * hooks-addons/04debug: * hooks-addons/03udev2: * hooks-addons/clean_initramfs * Update destripar_initramfs.sh script with new kernel version and call fdupes -- Mario Izquierdo (mariodebian) Sat, 28 Feb 2009 20:13:10 +0100 initramfs-tools-tcos (0.89.32) unstable; urgency=low * Remove bc package as Build-Depends and fix/clean xmlrpc/Makefile * hooks-addons/05devices: close if LTSPFS * hooks-addons/19usbip - Fix copy of usb.ids - Clean header -- Mario Izquierdo (mariodebian) Mon, 16 Feb 2009 12:56:24 +0100 initramfs-tools-tcos (0.89.31) unstable; urgency=low * Switch tcos-standalone to arch all * Remove lp-server support (packages are removed from repos) -- Mario Izquierdo (mariodebian) Sun, 15 Feb 2009 20:31:46 +0100 initramfs-tools-tcos (0.89.30) unstable; urgency=low * hooks-addons/19usbip: - Change path of usb.ids * lockscreen/lockscreen2.c lockscreen/Makefile debian/control: - Switch from Imlib1 to Imlib2 * Delete USPLASH stuff (is in another package) * Add Debian lenny as distro target -- Mario Izquierdo (mariodebian) Sun, 15 Feb 2009 18:34:39 +0100 initramfs-tools-tcos (0.89.30) unstable; urgency=low * Fix some errors with (set -e) in debian/*.p* scripts -- Mario Izquierdo (mariodebian) Thu, 12 Feb 2009 18:49:14 +0100 initramfs-tools-tcos (0.89.29) unstable; urgency=low * Remove SHFS support * Update reportbug mail * Cleanup debian/* files and scripts -- Mario Izquierdo (mariodebian) Thu, 12 Feb 2009 16:23:41 +0100 initramfs-tools-tcos (0.89.28.1) unstable; urgency=low * Merge From Ignacio Vidal an Lliurex changes -- Mario Izquierdo (mariodebian) Mon, 09 Feb 2009 17:14:11 +0100 initramfs-tools-tcos (0.89.28) unstable; urgency=low * Remove httpfs support (unknow license) * Clean all busybox httpd old stuff * Provide alternate in tcos-core Depends: busybox | busybox-static * Remove print_server support (use p910nd or lp-server) -- Mario Izquierdo (mariodebian) Mon, 09 Feb 2009 16:06:10 +0100 initramfs-tools-tcos (0.89.27) unstable; urgency=low * Add support of p910nd print daemon -- Mario Izquierdo (mariodebian) Sun, 08 Feb 2009 19:18:06 +0100 initramfs-tools-tcos (0.89.26) unstable; urgency=low * Add portmap and acpid as depends of initramfs-tools-tcos * hooks-addons/20alsa - Delete pulse-as-default Ubuntu files from usr/share/alsa - Copy libasound_module_conf_pulse.so if found * Move usr/share/initramfs-tools-tcos/inc from tcos to initramfs-tools-tcos package - initramfs-tools-tcos now conflicts with tcos << 0.89.26 * hooks-addons/50xorg - Copy /usr/lib/xorg/protocol.txt (new file in Xorg 1.5) - Check if exists /usr/lib/xorg/modules/extensions/libGLcore.so before copying - Check if exists /etc/X11/rgb.txt before copying * hooks-addons/51dri - Copy new dri /usr/lib/dri/swrast_dri.so * hooks-addons/51via_openchrome - Check if exists /etc/X11/XvMCConfig before copying -- Mario Izquierdo (mariodebian) Thu, 05 Feb 2009 19:05:31 +0100 initramfs-tools-tcos (0.89.25) unstable; urgency=low * xmlrpc/sh/soundctl.sh: -Allow to kill/restart PulseAudio * Use new version to deploy PulseAudio hack -- Mario Izquierdo (mariodebian) Wed, 04 Feb 2009 13:14:13 +0100 initramfs-tools-tcos (0.89.24) unstable; urgency=low * Upss wrong patched lines in hooks-addons/21pulseaudio, fixed -- Mario Izquierdo (mariodebian) Wed, 04 Feb 2009 10:54:15 +0100 initramfs-tools-tcos (0.89.23) unstable; urgency=low * Update Vcs- debian/control headers to new GIT repos * Remove debootstarp stuff * Update debian/copyright (remove pkgdetails and usplash) * hooks-addons/21pulseaudio conf/base.conf conf/80export_pulseaudio: - New var TCOS_SOUND_REMOTE_ESD, enable pulseaudio to listen again at esound port - Fix some if then test -- Mario Izquierdo (mariodebian) Tue, 03 Feb 2009 23:23:02 +0100 initramfs-tools-tcos (0.89.22) unstable; urgency=low * conf/xorg.conf.tpl: - Include TTF fontserver too, doc at: http://wiki.tcosproject.org/Tips/XFontServer/es -- Mario Izquierdo (mariodebian) Mon, 26 Jan 2009 17:12:43 +0100 initramfs-tools-tcos (0.89.21) unstable; urgency=low * Enable XFS again, some apps needs another fonts * Use TCOS_ENABLE_FONT_SERVER (disabled by default) * common.mk - Update Ubuntu Hardy and MaX kernel to 2.6.24-23 -- Mario Izquierdo (mariodebian) Sun, 25 Jan 2009 13:08:22 +0100 initramfs-tools-tcos (0.89.20) unstable; urgency=low * Makefile common.mk - Fix amd64 patches * Update tcos-standalone pt_BR translation -- Mario Izquierdo (mariodebian) Wed, 14 Jan 2009 20:15:04 +0100 initramfs-tools-tcos (0.89.19) unstable; urgency=low * Include xorg.pciids and use in configurexorg * hooks-addons/00main: - Include portmap (needed for NFS) * hooks-addons/01dhclient - Fix nameserver detection * hooks-addons/16debootstrap - Fix duplicated cpifexists * xmlrpc/sh/devicesctl.sh - New function --getid (call udevinfo to get vendor and model) * scripts/tcos-premount/36squashfs-methods - Get squashfs using NFS or http -- Mario Izquierdo (mariodebian) Sat, 10 Jan 2009 16:25:21 +0100 initramfs-tools-tcos (0.89.18) unstable; urgency=low * Use update_progress without argument (switch to new theme) * tcos/logo.lss: - New black theme * conf/tcos-run-functions.sh: - Increase progress bar when downloading big files * hooks-addons/clean_initramfs: - No delete libdrm and other libs * common.mk: - Update Ubuntu Hardy and MaX kernel to 2.6.24-22 -- Mario Izquierdo (mariodebian) Wed, 31 Dec 2008 17:22:51 +0100 initramfs-tools-tcos (0.89.17) unstable; urgency=low * hooks-addons/50xorg: - Priorice /usr/share/fonts instead or old /usr/lib/X11 (fix for etch) * debian/control bin/tcos-buildchroot - Add xfonts-base xfonts-100dpi as Depends on initramfs-tools-tcos and tcos-buildchroot -- Mario Izquierdo (mariodebian) Tue, 04 Nov 2008 16:06:09 +0100 initramfs-tools-tcos (0.89.16) unstable; urgency=low The 10 seconds less Release * Remove discover support: - This breaks xmlrpc/sh/getinfo.sh, bin/configurexorg and other things * Add pcimodules as replacement of dicover * Fix lspci calls, use -n switch (more speed) * Overwrite run_scripts() with simple one -- Mario Izquierdo (mariodebian) Wed, 29 Oct 2008 15:38:01 +0100 initramfs-tools-tcos (0.89.15) unstable; urgency=low * bin/tcos-bootchartd: - Create new bootchartd script (without init stuff) * bin/tcos-genbootchart: - Conect to thin client, get bootchartd logs and create bootchart.png in current dir * scripts/tcos-premount/40tftp: - Disable sync and sleep before downloading (not needed) * scripts/tcos-top/01busybox: - set kernel less verbose if quiet arg detected * scripts/tcos-bottom/80shell: - Stop tcos-bootchartd if detected * scripts/tcos-bottom/55mount_listener: - Enable late tcos-udev.sh * scripts/tcos-bottom/30devices: - Configure LTSPFS wit noauth when using bootchart - Load floppy module with insmod in background * tmixer/tmixer-alsa.c: - Enable sset to set Capture level * bin/tcos-buildchroot Makefile - Delete libltdl3 depend with Ubuntu intrepid * hooks-addons/03udev2: - delete some not needed rules * bin/tcosgenbootchart: - Fix typo, rename -- Mario Izquierdo (mariodebian) Tue, 28 Oct 2008 18:29:40 +0100 initramfs-tools-tcos (0.89.14) unstable; urgency=low * Move /etc/tcos/tcos-modules.conf to /usr/share/initramfs-tools-tcos * Don't copy floppy/ide-floppy module in /lib/modules, use /lib/extramodules * Move usplash stuff to tcos-usplash package * Add hooks-addons/91splashy hook (don't work yet) -- Mario Izquierdo (mariodebian) Sun, 26 Oct 2008 12:22:58 +0100 initramfs-tools-tcos (0.89.13) unstable; urgency=low * hooks-addons/50xorg: - Remove Xorg 6.9 support - Add local fonts, remove xfs depend * conf/tcos-run-functions.sh: - Only start usplash when reboot/shutdown if enabled in cmdline * conf/xorg.conf.tpl - Remove fonts and XFS line, now we have local misc/100dpi fonts * scripts/tcos-bottom/55mount_listener: - Include conf/tcos-run-functions.sh * bin/configurexorg bin/tryXorg.sh - Remove fontserver support * hooks-addons/23bootchart: - Add experimental support for bootchart (not enabled) * hooks-addons/52intel - Fix Intel X11 PreRun if (need a space) - Escape dollar in lspci and compare with 0 * bin/gentcos - Disable XFS check -- Mario Izquierdo (mariodebian) Thu, 23 Oct 2008 15:15:35 +0200 initramfs-tools-tcos (0.89.12) unstable; urgency=low * Patches by Vidal: - Enable RTP multichat mode and configure MIC levels -- Mario Izquierdo (mariodebian) Sat, 11 Oct 2008 15:15:22 +0200 initramfs-tools-tcos (0.89.11) unstable; urgency=low * xmlrpc/sh/tcos-pam-usb.sh: - Add readdevices option (used by pamusb-conf-gui) -- Mario Izquierdo (mariodebian) Sat, 04 Oct 2008 12:28:50 +0200 initramfs-tools-tcos (0.89.10) unstable; urgency=low * Change tcos-standalone Depends: tcosmonitor => tcosmonitor-common -- Mario Izquierdo (mariodebian) Tue, 30 Sep 2008 11:30:55 +0200 initramfs-tools-tcos (0.89.9) unstable; urgency=low [ Mario Izquierdo (mariodebian) ] * udev/mount_listener.c - Compare device with /dev/disk/ and do nothing if match => pam-usb mount * xmlrpc/sh/tcos-pam-usb.sh - No clean /tmp/tcos-udev.log * xmlrpc/pam-usb.c - Read fwrite returned value too (fix amd64 warning_unused_result) [ Ignacio Vidal ] * tnc/tcos-net-controller.c xmlrpc/*: - Allow net-controller only block ports * scripts/tcos-bottom/* - Add more options from cmdline * debian/control: - Update depends * scripts/tcos-bottom/40initsound xmlrpc/sh/rtp-controller.sh hooks-addons/21pulseaudio: - Update scripts to allow new chat mode -- Ignacio Vidal Tue, 23 Sep 2008 19:05:58 +0200 initramfs-tools-tcos (0.89.8) unstable; urgency=low * New XMLRPC method pamusb: - Copy LTSPFS_TOKEN, mount device UUID and get/save PAD (needed by libpam-usb-tcos) * xmlrpc/* printer/* tnc/* tmixer/*: - Read fgets and fwrite value (fix amd64 warning_unused_result) * xmlrpc/common.c: - Redefine dbgtcos as MACRO to show source filename and line number (idea taken from pam-usb) - Add base64_decode (needed by tcos_pam_usb) * xmlrpc/Makefile: - Remove -ansi -pedantic from compiler flags (dbgtcos MACRO use ISO C99) * hooks-addons/05devices: - Always copy xprop and ltsp-set-xprop * Update debian/copyright with base64 origin -- Mario Izquierdo (mariodebian) Fri, 12 Sep 2008 17:34:43 +0200 initramfs-tools-tcos (0.89.7) unstable; urgency=low [ Mario Izquierdo (mariodebian) ] * debian/control Makefile: - Debian etch and Ubuntu feisty, gutsy don't have libsox-fmt-all, use sox instead * Move sox and alsa code from 21pulseaudio to 20 alsa [ Ignacio Vidal ] * tnc/tcos-net-controller.c: - Add routing table support * debian/control: - Fix atftp depend -- Ignacio Vidal Wed, 10 Sep 2008 17:48:36 +0200 initramfs-tools-tcos (0.89.6) unstable; urgency=low * xmlrpc/sh/rtp-controller.sh, hooks-addons/21pulseaudio: - Copy and create links of sox libs - Copy libasound2-plugins of pulseaudio and create /etc/asound.conf * bin/tcos-buildchroot: - Add libasound2-plugins to base packages * bin/configurexorg: - touch mysettings.conf (newer tftp don't create if no exists) * debian/control: - Add libsox-fmt-all and libasound2-plugins to tcos-core Depends * xmlrpc/sh/rtp-controller.sh, hooks-addons/21pulseaudio: - Revert creation of /etc/asound.conf in 21pulseaudio because breaks tmixer * common.mk Makefile: - Add Ubuntu intrepid target and kernel version (2.6.27-2-generic) * bin/tcos-buildchroot - Add intrepid in if sentences -- Mario Izquierdo (mariodebian) Fri, 05 Sep 2008 17:22:54 +0200 initramfs-tools-tcos (0.89.5) unstable; urgency=low * xmlrpc/validate-tcos.c: - Revert remove_line_break that breaks tcos auth * Update Debian unstable kernel to 2.6.26-1-486 * bin/get_server: - Read TCOS SSL vars before reading log file * Update Debian testing default kernel to 2.6.25-2-486 * xmlrpc/tcosxmlrpc.c - Fix typo adding method tcos_tnc in OLD API * tmixer/Makefile - Disable '-ansi -pedantic' compile flags (Debian Etch libasound2-dev don't like it) -- Mario Izquierdo (mariodebian) Wed, 06 Aug 2008 20:21:58 +0200 initramfs-tools-tcos (0.89.4) unstable; urgency=low * xmlrpc/xauth.c xmlrpc/common.h - Change mkstemp prototype, from man page: 'int mkstemp(char *template);' - This fix amd64 warning of incompatible types. * hooks-addons/21pulseaudio - Change method to read CPU speed - Add --system to pulseaudio options - Remove --system (need pulse user) - Add --realtime only if pulseaudio support it (use --help to know it) * tmixer: - Add new way to get audo channels (mix of aumix and amixer sources) * hooks-addons/20alsa scripts/tcos-bottom/40initsound xmlrpc/sh/soundctl.sh xmlrpc/sh/vlc-controller.sh - Prepare to use new tmixer tool (all is more easy) * Makefile - Install tmixer in /usr/lib/tcos/ * debian/control bin/tcos-buildchroot - Build depends on libasound2-dev and remove aumix and alsa-utils depends - Make pulseaudio-esound-compat as alternative of esound -- Mario Izquierdo (mariodebian) Wed, 30 Jul 2008 16:12:32 +0200 initramfs-tools-tcos (0.89.3) unstable; urgency=low * xmlrpc/tcosxmlrpc.c xmlrpc/reboot_poweroff.c xmlrpc/screenshot.c xmlrpc/xorg.c xmlrpc/devices.c xmlrpc/tnc.c xmlrpc/vnc.c xmlrpc/sound.c xmlrpc/info.c xmlrpc/validate-tcos.c xmlrpc/rtp.c xmlrpc/pci.c xmlrpc/standalone.c xmlrpc/common.c - Use remove_line_break function to clean '\n' returned fgets line * xmlrpc/dpms.c xmlrpc/dpms.h - New method to control DPMS Monitor features * hooks-addons/21pulseaudio conf/80export_pulseaudio - don't listen on esound port and export ESPEAKER, eats a lot of bandwich -- Mario Izquierdo (mariodebian) Mon, 28 Jul 2008 12:18:08 +0200 initramfs-tools-tcos (0.89.2) unstable; urgency=low * conf/tcos-modules.conf: - Add modules: nls_base nls_utf8 snd-hda-intel snd-atiixp snd-usb-audio fat * bin/installer.sh - Use BusyBox dd instead of klibc dd (and use bs argument) * hooks-addons/40etc2300 - If found, use snd-sis7019 instead of OSS sis7019 module * hooks-addons/56rdesktop hooks-addons/50xorg - Escape var XAUTHORITY in launchers * tnc/tcos-net-controller.c - Fix get_uid() function (return unsigned int not char pointer) - Add debug function, and clean code - Remove not needed vars * debian/control: - Add iproute to tcos-core Depends * hooks-addons/21pulseaudio hooks-addons/03wireless hooks-addons/22esd conf/tcos-generation-functions.sh - Create _ldd wrapper to call ldd with LC_ALL=C and no return error messages * hooks-addons/clean_initramfs: - Move libasound if zattoo is installed to proper path - Delete not needed libs (depends on resume and not used) * hooks-addons/22esd: - Use copy_exec to copy libesd (and depends) * scripts/tcos-top/50fstab: - Don't show errors mounting /proc/bus/usb -- Mario Izquierdo (mariodebian) Fri, 25 Jul 2008 12:54:29 +0200 initramfs-tools-tcos (0.89.1) unstable; urgency=low * New release 0.89.1 -- Mario Izquierdo (mariodebian) Sat, 19 Jul 2008 20:37:05 +0200 initramfs-tools-tcos (0.89~rc12) unstable; urgency=low * Add pt_BR translation of tcos-standalone, thanks to: Aécio dos Santos Pires -- Mario Izquierdo (mariodebian) Thu, 17 Jul 2008 16:32:27 +0200 initramfs-tools-tcos (0.89~rc11) unstable; urgency=low [ Ignacio Vidal ] * Update translation [ Mario Izquierdo (mariodebian) ] * debian/tcos-core.install debian/tcos-core.postinst conf/tcos.pem Makefile - Don't provide SSL cert, create using openssl - Add openssl to depends * hooks-addons/00main hooks-addons/25tcosmonitor - Move start-stop-daemon to 00main and check for *.original and *.REAL -- Mario Izquierdo (mariodebian) Thu, 03 Jul 2008 16:20:04 +0200 initramfs-tools-tcos (0.89~rc10) unstable; urgency=low [ Mario Izquierdo (mariodebian) ] * scripts/tcos-top/50fstab: - Mount /proc/bus/usb * tcos/default.menu.tpl: - Fix NFS initramfs fielname - Use localbot instead of chain.c32 [ Ignacio Vidal ] * initramfs-tools-tcos/common.mk - Update kernel vars * debian/tcos-core.postrm debian/tcos-core.postinst - In standalone not found group tcos * Add valencian translation by Lliurex * debian/tcos-standalone.init hooks-addons/10ssl_tunnel - Use random certificates for ssl connection -- Ignacio Vidal Mon, 30 Jun 2008 14:36:19 +0200 initramfs-tools-tcos (0.89~rc9) unstable; urgency=low * Set /var/lib/tcos/tftp/pxelinux.cfg as tcos group owner * bin/tcos-buildchroot: - Fix new template parse - Add new preseed var to kernel (>2.6.25 need it) - Add standalone xauth package to new distros - Copy console keymap * hooks-addons/25tcosmonitor - Delete start-stop-daemon of image before copying * common.mk - Update Ubuntu hardy and MaX4.0 kernel version * hooks/tcosmods - Search sound/isa patch, don't use debian default path -- Mario Izquierdo (mariodebian) Wed, 18 Jun 2008 18:06:14 +0200 initramfs-tools-tcos (0.89~rc8) unstable; urgency=low * debian/tcos-core.postrm debian/initramfs-tools-tcos.prerm - Fix delete of group tcos in upgrades - Move prerm to postrm to fix purge problem * xmlrpc/sh/screenshot.sh - Disable temporarily system beep on get screenshot in standalone * conf/* - Also allow personalize template pxelinux * hooks/tcosbin - Fix creation of allmodules squashfs (mariodebian) * hooks-addons/00main hooks-addons/00users - Create /etc/tcospasswd if exists generic user and passwd secret file - Moved to 00users and update password root with this secret method to avoid plain password of root in tcos.conf -- Ignacio Vidal Thu, 05 Jun 2008 17:04:38 +0200 initramfs-tools-tcos (0.89~rc7) unstable; urgency=low * xmlrpc/sh/tcos-last - Fix break * conf/tcos-generation-functions.sh tcos/default.tpl tcos/default.menu.tpl bin/gentcos - Parse custom msg and logo in boot menu - On create cdrom iso not parse or overwrite pxe vesa menu * debian/tcos-standalone.init - Fix permissions * scripts/tcos-premount/* xmlrpc/sh/useallmodules.sh - Update allmodules support * hooks-addons/40etc2300 hooks-addons/90usplash - Fix disable usplash warnings * hooks-addons/51via_openchrome - Fix vars preference -- Ignacio Vidal Mon, 02 Jun 2008 15:14:04 +0200 initramfs-tools-tcos (0.89~rc6) unstable; urgency=low [ Mario Izquierdo (mariodebian) ] * xmlrpc/sh/tcos-last - Use while 1 loop to retrieve last users connected [ Ignacio Vidal ] * xmlrpc/sh/tcos-last - With method last fix problem with users much time logged * xmlrpc/sh/vnc-controller.sh - Fix vnc typo [ Mario Izquierdo (mariodebian) ] * Update Ubuntu hardy kernel to 2.6.24-17-generic -- Mario Izquierdo (mariodebian) Tue, 27 May 2008 15:02:33 +0200 initramfs-tools-tcos (0.89~rc5) unstable; urgency=low * bin/clean_string.sh - Use /bin/bash as shell, dash read don't have -t param * Update Debian unstable kernel to 2.6.25-2-486 * Remove libxaw-headers build-depend -- Mario Izquierdo (mariodebian) Sun, 25 May 2008 16:50:52 +0200 initramfs-tools-tcos (0.89~rc4) unstable; urgency=low [ Mario Izquierdo (mariodebian) ] * hooks-addons/10ssl_tunnel xmlrpc/var/etc/stunnel conf/base.conf conf/tcos.pem debian/tcos-standalone README.ssl - Add support for tunnelize XMLRPC connection ussing stunnel4 * tcos-standalone/ - Update tcos-standalone GUI to allow enabling SSL * xmlrpc/common.h xmlrpc/common.c xmlrpc/validate-tcos.c xmlrpc/Makefile - Use split function (common.c) instead of insecure strtok Remember to free tokens after work with data. * bin/clean_string.sh xmlrpc/sh/getinfo.sh debian/control: - Revert unaccent change, add script with sed to replace some accents and strange characters * Update conf/tcos.pem with a new openssl key [ Ignacio Vidal ] * debian/control debian/tcos-core.postinst debian/initramfs-tools-tcos.postinst - Add stunnel4 depend - Control permissions * tnc/* xmlrpc/tcosxmlrpc.c xmlrpc/tnc.c xmlrpc/tnc.h - Add Tcos net controller for iptables * xmlrpc/sh/vnc-controller.sh - Fix demo mode? * xmlrpc/sh/update-tcospasswd.sh - Support more params for automatic actions * xmlrpc/standalone.h hooks-addons/25tcosmonitor - Update support get_server * xmlrpc/sh/getinfo.sh - Fix broken xmlrpc data broken by accents * debian/* - Fix postrm and prerm [ Mario Izquierdo (mariodebian) ] * bin/clean_string.sh -- Mario Izquierdo (mariodebian) Sun, 25 May 2008 16:34:41 +0200 initramfs-tools-tcos (0.89~rc3) unstable; urgency=low [ Mario Izquierdo (mariodebian) ] * Add TCOS_XORG_VIDEO_DRIVER and TCOS_XORG_VIDEO_RES to base.conf * bin/configurexorg: - load this vars as default * bin/gentcos: - dont gzip initramfs with -9 * conf/tcos-generation-functions.sh - warn about lost TCOS_BASE_TEMPLATE var in tcosconfig.conf * hooks-addons/50xorg - Disable dpms when starting Xorg (thanks to Santiago Castillo) * tcos/default.menu.tpl conf/base.conf conf/tcos-generation- functions.sh - Add TCOS_NETBOOT_HIDE_LOCAL [ Ignacio Vidal ] * debian/initramfs-tools-tcos.prerm debian/initramfs-tools-tcos.postinst: - Pre add create/delete group tcos * conf/tcos-run-functions.sh: - Fix umount segmentation fault in poweroff/reboot * scripts/tcos-bottom/40initsound - Probe channels * xmlrpc/tcosxmlrpc.c xmlrpc/reboot_poweroff.c - Update method reboot-poweroff for down-controller * bin/gentcos: - Check libwfb.so mv - Support fix-nvidia-ati as pkg cached list * hooks-addons/21pulseaudio: - Fix pulseaudio hack for cpu < 800 * scripts/tcos-bottom/10ldconfig hooks-addons/50xorg - Update OpenGl support * conf/base.conf hooks-addons/51dri hooks-addons/51via_openchrome - Update dri xorg support - Update VIA Openchrome support * xmlrpc/sh/tcos-last xmlrpc/standalone.* - Use who instead last to avoid problems with users much time connected - Add support for user blacklisted or excluded from control in Tcosmonitor * debian/tcos-core.postinst debian/tcos-core.postrm - Create group tcosmonitor-exclude [ Mario Izquierdo (mariodebian) ] * bin/tryXorg.sh hooks-addons/52intel hooks-addons/50xorg - Create /etc/X11/PreRun to be exec before launch Xorg * hooks-addons/50xorg hooks-addons/51via_openchrome - Don't copy .la|.a files, and don't copy nvidia libs (not nvidia thin client support) * hooks-addons/25tcosmonitor: - Copi pci.ids.gz if found (instead of simple pci.ids) -- Mario Izquierdo (mariodebian) Thu, 08 May 2008 00:21:25 +0200 initramfs-tools-tcos (0.89~rc2) unstable; urgency=low * Disable mksquashfs -no-progress option -- Mario Izquierdo (mariodebian) Tue, 15 Apr 2008 12:06:18 +0200 initramfs-tools-tcos (0.89~rc1) unstable; urgency=low * New Release uploaded to experimental * debian/control: depends con console-setup|console-data -- Mario Izquierdo (mariodebian) Tue, 15 Apr 2008 10:25:11 +0200 initramfs-tools-tcos (0.89~rc0.1) unstable; urgency=low [ Ignacio Vidal ] * xmlrpc/sh/tcos-last: - Fix typo [ Mario Izquierdo (mariodebian) ] * NOT RELEASE, alfa stage * Add tcos.conf template system: - Avalaible templates: base.conf tcos.conf.all tcos.conf.low - Add template dir in /etc/tcos for user defined templates * Replace PREREQ header in all boot scripts with a simple if condition * Add new function tcos_get_templates (return templates in correct order to load) * Add tcos_get_templates to gentcos hooks/[tcosbin|tcosnfs|tcosmods] * get_all_tcos_vars.sh (search if all TCOS_* are in base.conf) * Add _verbose log output function and replace some _echo => _verbose (enable verbose: TCOS_VERBOSE=1 gentcos -tftp) * hooks-addons/52intel - Fix if condition (if file don't exists warn, else copy) * show more info in get_all_tcos_vars.sh * Disable verbose in tcosmods modules * Fix info in tcosbin verbose * hooks-addons/50xorg - Copy /usr/share/xserver-corg/pci directory - Only copy libwfb.so if exists (some nvidia versions don't have this file) * Update tcos/dhcpd*.conf: - Change dhcpd example configurations to be more clear * Fix typo in hooks-addons/50xorg * xmlrpc/reboot_poweroff.c xmlrpc/reboot_poweroff.h - New method to reboot or poweroff using Xorg cookie * hooks-addons/50xorg - Fix typo * conf/tcos.conf.nfs - New template, force to boot with NFS * hooks-addons/01busybox hooks-addons/25tcosmonitor xmlrpc/sh/screenshot.sh xmlrpc/Makefile xmlrpc/screenshot.h xmlrpc/get_screenshot.c scripts/tcos-bottom/56tcosxmlrpc debian/tcos-standalone.init tcos-standalone/tcos-standalone.py tcos- standalone/tcos-standalone.glade - Delete busybox httpd process, fix screenshots path and update tcos-standalone app * common.mk - Update Ubuntu hardy and Max40 kernel version to 2.6.24-16-generic * conf/tcos-run-functions.sh - Fix typo in awk command -- Mario Izquierdo (mariodebian) Sun, 13 Apr 2008 11:37:43 +0200 initramfs-tools-tcos (0.88.15.7) unstable; urgency=low [ Mario Izquierdo (mariodebian) ] * debian/control: - add rtptools depends to tcos-core package (RTP sound multicast) [ Ignacio Vidal ] * xmlrpc/* xmlrpc/sh/rtp-controller.sh hooks-addons/25tcosmonitor: - Add support for RTP sound multicast * xmlrpc/standalone.h: - Fix last change in get user process * scripts/tcos-bottom/40initsound: - In some thin clients only work sound in headphone * xmlrpc/sh/vnc-controller.sh: - Fix not show in demo mode cursor of server in higher version of vnc [ Mario Izquierdo (mariodebian) ] * hooks-addons/00init: - Move real reboot and poweroff to /lib/cmds (avoid crash when unionfs is not umounted) * scripts/tcos-top/01busybox: - Delete mount and umount (klibc-utils) bins, not compatible with busybox mount * scripts/tcos-premount/45sqmount: - Revert last version change * conf/tcos-run-functions.sh: - Read mounted with /proc/mounts and awk script magic * hooks-addons/52intel scripts/tcos-bottom/21intel: - Add support for old i810 intel graphic cards chipset - Thanks to Rubén Gómez Antolí -- Mario Izquierdo (mariodebian) Fri, 04 Apr 2008 19:11:34 +0200 initramfs-tools-tcos (0.88.15.6) unstable; urgency=low * scripts/*: - Mount squashfs file using loop device (losetup) - Preserver old mount line if losetup return empty string - Remove extra shell call after panic action (panic call a shell) * hooks-addons/01busybox: - Add another test (losetup) * common.mk: - Update kernel versions of Debian testing, Ubuntu hardy and Max40 [ Patches by Ignacio] * xmlrpc/sh/tcos-last: - Change format to time 00:00 => 00h:00m * xmlrpc/sh/devicesctl.sh: - Exec mount.ntfs-3g with start-stop-daemon (avoid to use threads in tcos-devices-ng) * xmlrpc/standalone.h: - Get user process with ps U $USER instead of ps aux|grep USER -- Mario Izquierdo (mariodebian) Sun, 30 Mar 2008 17:23:02 +0200 initramfs-tools-tcos (0.88.15.5) unstable; urgency=low [ Mario Izquierdo (mariodebian) ] * Rename 82export_pulseaudio => 80export_pulseaudio: - Delete old file in postinst - dbus session (exported in 81) need to know PulseAudio server IP [ Ignacio Vidal ] * xmlrpc/simple-methods.c - Update command [ Mario Izquierdo (mariodebian) ] * don't start tcos-standalone if start-stop-daemon is a fake script -- Mario Izquierdo (mariodebian) Thu, 27 Mar 2008 18:41:31 +0100 initramfs-tools-tcos (0.88.15.4) unstable; urgency=low * xmlrpc/sh/vlc-controller.sh - no change system volume if is grather than vlc need * xmlrpc/xauth.c xmlrpc/common.h - Fix segmentation fault in tcosxmlrpc when number of temp file descriptors reach the maximum supported by system - Update include typo * xmlrpc/sh/* - Avoid to show errors - Search var HOME in standalone for exports * hooks-addons/90usplash - Create usplash.conf to avoid crashes in thin clients (thks mariodebian) -- Ignacio Vidal Sat, 15 Mar 2008 17:09:07 +0100 initramfs-tools-tcos (0.88.15.3.1) unstable; urgency=low * scripts/tcos-top/05network - Ups fix unknown command operator, although work ok -- Ignacio Vidal Fri, 07 Mar 2008 14:38:13 +0100 initramfs-tools-tcos (0.88.15.3) unstable; urgency=low [ Ignacio Vidal ] * scripts/tcos-top/05network hooks-addons/03wireless: - Update support WPA for wifi, also works with WPA2 and other driver cards not generics [ Mario Izquierdo (mariodebian) ] * xmlrpc/sh/tcos-last: - Fix GetLast() to check for hostname too -- Mario Izquierdo (mariodebian) Thu, 06 Mar 2008 22:25:57 +0100 initramfs-tools-tcos (0.88.15.2) unstable; urgency=low [ Mario Izquierdo (mariodebian) ] * Add pxelinux boot menu (normal and vesa mode) - Move parse_pxelinux to tcos-generation-functions.sh - Add 3 new TCOS vars: TCOS_NETBOOT_MENU, TCOS_NETBOOT_MENU_VESA, and TCOS_NETBOOT_HIDE_INSTALL * tcos/pxetcos.png and tcos/pxetcos.jpg - vesamenu.c32 images (better jpg, less size) * common.mk: - Update Ubuntu hardy kernel to 2.6.24-10 * debian/tcos-standalone.init: - Exec ethtool in shutdown to enable wakeonlan * scripts/tcos-bottom/70wakeonlan - Check if network device is wakeonlan compatible before enabling * xmlrpc/sh/tcos-last xmlrpc/standalone.h xmlrpc/sh/screenshot.sh xmlrpc/sh/getinfo.sh xmlrpc/sh/vnc-controller.sh - Change last or w with tcos-last (a python script that reads /var/log/utmp) Only work in STANDALONE MODE * xmlrpc/sh/getinfo.sh - Change IFDEV detection, use /sys/class/net instead of DHCP lease file * xmlrpc/Makefile - Install tcos-last in TCOS_BINS dir [ Ignacio Vidal ] * Discard more eth not required in TCOS_NET_DEVS * conf/tcos.conf - Add TCOS_PKG_CACHE_LIST list of packages to cache for Tcos - Change TCOS_WEP to TCOS_WIRELESS_KEY for WEP/WPA key * scripts/tcos-top/05network hooks-addons/03wireless - Update support for wifi cards * xmlrpc/sh/soundctl.sh - Fix not show correctly sound controls depending version of distro * bin/gentcos - Check cached packages if need updates when generate thin client images * debian/tcos-standalone.init - Remove tcos-standalone log if exceed 5M [ Mario Izquierdo (mariodebian) ] * xmlrpc/sh/tcos-last: - Fix time diff * Update Ubuntu hardy kernel to 2.6.24-11 * debian/tcos-standalone.init - Clean all logs of tcos-standalone not only tcos-standalone.log * debian/control - Add python-utmp to tcos-core Depends (needs tcos-last script) - Add genisoimage|mkisofs to initramfs-tools-tcos Depends * usplash/0.4.1 - Add png files (ImageMagick bug don't create correct colormap) * bin/installer.sh: - detect hdd and not use /dev/hda -- Mario Izquierdo (mariodebian) Thu, 06 Mar 2008 17:59:18 +0100 initramfs-tools-tcos (0.88.15.1) unstable; urgency=low * scripts/tcos-top/05network - Fix DHCP3 force detection, use 'route -n' output instead of 'myip' * xmlrpc/sh/getinfo.sh - Detect IFDEV reading dhclient.leases * bin/gentcos - Not show xfs config file errors * conf/tcos-run-functions.sh - Return 0 or 1 (not true or false) -- Mario Izquierdo (mariodebian) Sat, 23 Feb 2008 15:27:17 +0100 initramfs-tools-tcos (0.88.15) unstable; urgency=low [ Ignacio Vidal ] * session-cmd/session-cmd-exec - Redefine script * lockscreen/* - Generate lockvlc and lockvnc for non multi-actions conflicts - Add method to don´t allow screensaver activate * xmlrpc/* - Add lockcontroller to avoid locks not work correctly - Add vlc controller - Add lock screensaver and keyboard in vnc controller * bin/daemonize.sh - Remove recents changes * bin/down-controller - Add controller for poweroff and reboot with timout * bin/gentcos - Fix broken size calculation * hooks-addons/21pulseaudio - In some cases pulseaudio down unexpectedly * hooks-addons/40etc2300 - Manual add modules for Epatec 2300 thin clients [ Mario Izquierdo (mariodebian) ] * Set log_end_msg first param in all init scripts * Append to GCC flags '-O2 -ansi -pedantic' * udev/mount_listener.c - Use strtok to split device (no more segfaults) * lockscreen/lockvnc.c lockscreen/lockscreen2.c lockscreen/lockvlc.c - Call setenv after vars declaration (ANSI C) * hooks-addons/95usplash_timeout - Append /etc/lsb-base-logging.sh to /scripts/functions to support fancy output * scripts/tcos-top/05network hooks-addons/01dhclient - Use /sys/class/net/IFNAME/carrier to detect link status - Delete mii-tool as no needed * scripts/tcos-bottom/25startx scripts/tcos-bottom/01download_settings bin/configurexorg - Use /var/lib/dhcp/dhclient.leases to retrieve IP ADDRESS (not eth0) -- Mario Izquierdo (mariodebian) Sat, 23 Feb 2008 12:43:57 +0100 initramfs-tools-tcos (0.88.14.13) unstable; urgency=low * udev/mount_listener.c - Fix Segmentation Fault: call to save-udev.sh, use popen() instead of system() * xmlrpc/get_screenshot.c xmlrpc/screenshot.h xmlrpc/common.c xmlrpc/sh/screenshot64.sh hooks-addons/25tcosmonitor - Remove screenshot64.sh and base64 - Rewrite tcos_get_screenshot method with base64_encode function (based on wpa_supplicant) -- Mario Izquierdo (mariodebian) Tue, 19 Feb 2008 17:31:37 +0100 initramfs-tools-tcos (0.88.14.12) unstable; urgency=low * udev/tcos-udevd.sh udev/save-udev.sh: - Collect mount/umount events with listener-daemon in any kernel version * scripts/tcos-bottom/70wakeonlan hooks-addons/45wakeonlan conf/tcos.conf - New var TCOS_WAKEONLAN - Set eth0 wol on during boot (needed in some network cards) -- Mario Izquierdo (mariodebian) Sun, 17 Feb 2008 18:45:21 +0100 initramfs-tools-tcos (0.88.14.11) unstable; urgency=low * xmlrpc/* - Add new method getscreenshot (returns base64 screenshot file) * xmlrpc/sh/screenshot*: - Change default image format to jpg * hooks-addons/25tcosmonitor - Add jpg imlib2 lib and remove gif (not used) - Add base64 bin and screenshot64.sh script * xmlrpc/var/etc/abyss.conf - Change port from 8080 to 8998 (not conflicts with proxys or dansguardian) * udev/tcos-udevd.sh udev/save-udev.sh - Search ID_VENDOR and ID_MODEL in /sys tree if empty * udev/tcos-udevd.sh udev/save-udev.sh - Remove spaces in ID_VENDOR and ID_MODEL detection -- Mario Izquierdo (mariodebian) Mon, 11 Feb 2008 12:05:24 +0100 initramfs-tools-tcos (0.88.14.10) unstable; urgency=low * udev/mount_listener.c udev/listener-daemon.sh udev/save-udev.sh - Make mount-listener more inteligent, compare files and sync without scripts - save-udev.sh is a script helper to generate udev event and put into /tmp/tcos-udev.log - listener-daemon.sh now only start mount-listener and if crash start again * hooks-addons/25tcosmonitor - Add save-udev.sh script to image * scripts/tcos-bottom/55mount_listener - Remove extra code * xmlrpc/tcosxmlrpc.c - Include time.h header -- Mario Izquierdo (mariodebian) Wed, 06 Feb 2008 23:52:16 +0100 initramfs-tools-tcos (0.88.14.9) unstable; urgency=low * xmlrpc/xauth.[ch]: - Add mkstemp file to create xauth (don't fail with concurrect connections) * xmlrpc/devices.c - Add more debug output (error codes) * xmlrpc/xauth.c xmlrpc/xauth.h - Use popen to write tmp cookie - Remove for loop * xmlrpc/*: - Reorganize code, move some functions to common.c and defines to common.h * Fix some license typos (tcos is GPL2+) -- Mario Izquierdo (mariodebian) Tue, 05 Feb 2008 23:49:36 +0100 initramfs-tools-tcos (0.88.14.8) unstable; urgency=low * Add libwfb.so file to fix-nvidia-atu hack (need to rerun gentcos -fix-nvidia-ati) * Update Debian Unstable kernel to 2.6.24-1 * xmlrpc/exe.h: - Add XAUTHORITY=/root/.Xauthority to thin client * xmlrpc/xauth.c: - unset tmp env var XAUTHORITY * xmlrpc/sh/devicesctl.sh: - Don't fail if already mounted * Update Debian etch kernel to 2.6.18-6 * xmlrpc/xauth.h: - Declare unsetenv prototype -- Mario Izquierdo (mariodebian) Mon, 04 Feb 2008 15:24:45 +0100 initramfs-tools-tcos (0.88.14.7) unstable; urgency=low * scripts/tcos-premount/20hdd: - Change /target with /mnt/tmp (booting from hdd) -- Mario Izquierdo (mariodebian) Tue, 29 Jan 2008 16:23:06 +0100 initramfs-tools-tcos (0.88.14.6) unstable; urgency=low * bin/gentcos: - Don't show warnings if running in chroot * bin/tcos-buildchroot: - Save settings in chroot/tcos-buildchroot.conf - Allow to install other distributions (ubuntu from debian for example) - Allow to set TCOS mirror or ubuntu security mirror - Enable DEBIAN_FRONTEND again (set to dialog in upgrade) -- Mario Izquierdo (mariodebian) Sun, 27 Jan 2008 16:51:38 +0100 initramfs-tools-tcos (0.88.14.5) unstable; urgency=low * scripts/tcos-top/20mountnfs - Move NFS and ramdisk to /mnt/ - Set ramdisk size to 5m (normal boot needs 2.3 Mb) - Move /mnt/nfs and /mnt/ram to /root/.dirs * scripts/tcos-top/01busybox: - Hide errors in modprobe nfs and af_packet modules * hooks-addons/00main: - Create empty /etc/modules (needed by 05inittcos) * scripts/tcos-bottom/05inittcos: - Redirect errors in modprobe -- Mario Izquierdo (mariodebian) Sun, 27 Jan 2008 12:46:02 +0100 initramfs-tools-tcos (0.88.14.4) unstable; urgency=low * Add max (Ubuntu MAdrid_linuX) to distro list -- Mario Izquierdo (mariodebian) Sat, 26 Jan 2008 18:35:25 +0100 initramfs-tools-tcos (0.88.14.3) unstable; urgency=low * Move script/tcos-top/40make_init to 60make_init * hooks-addons/99clean_nfs_image: - Don't remove ide and ata modules (need for swap in NFS boot) - Delete usplash bins and libs (with 32 Mb of RAM can't play with usplash) * scripts/tcos-top/20mountnfs: - Reduce ramdisk size from 5m to 1m * scripts/tcos-bottom/30devices: - call fstab again (with NFS modules) * bin/gentcos: - Warn about /etc/exports not found * scripts/tcos-premount/20hdd - Detect if bootting from hdd mount disk in /target and create symlink if squashfs exists * bin/tcos-buildchroot - Fix typo DEBIAN_FRONTEND => DEBCONF_FRONTEND - Change DEBCONF_FRONTEND to dialog in some cases (needed for user input) -- Mario Izquierdo (mariodebian) Sat, 26 Jan 2008 18:17:37 +0100 initramfs-tools-tcos (0.88.14.2) unstable; urgency=low * hooks-addons/13kbmap: - Don't copy keymaps if exists * scripts/tcos-top/50fstab: - Move exit code after /etc/fstab creation - Allow to mount /dev/pts always -- Mario Izquierdo (mariodebian) Tue, 22 Jan 2008 17:50:09 +0100 initramfs-tools-tcos (0.88.14.1) unstable; urgency=low * Remove httpfs build (old versions of libfuse don't work) -- Mario Izquierdo (mariodebian) Sun, 20 Jan 2008 11:57:40 +0100 initramfs-tools-tcos (0.88.14) unstable; urgency=low * New stable release * hooks-addons/01dhclient: - Don't copy dhclient-script, create a small hack to configure network * Reorganize scripts/tcos-premount to allow get squashfs with other methods ( plugins?? ) -- Mario Izquierdo (mariodebian) Sat, 19 Jan 2008 15:07:40 +0100 initramfs-tools-tcos (0.88.13.4) unstable; urgency=low * Add HTTPFS method to get squashfs -- Mario Izquierdo (mariodebian) Fri, 04 Jan 2008 14:09:58 +0100 initramfs-tools-tcos (0.88.13.3) unstable; urgency=low * scripts/tcos-top/01busybox: - Wait for any wireless iface instead of only eth0 * bin/gentcos: - In cdrom copy initramfs as initrd.cdrom * conf/tcos-run-functions.sh: - Disable progress log (too many calls) * bin/installer.sh: - Copy files from cdrom instead of network if booting from cdrom * grub/menu.lst-tcos: - Put initrd var in kernel line to allow installer to detect cdrom -- Mario Izquierdo (mariodebian) Wed, 26 Dec 2007 15:47:04 +0100 initramfs-tools-tcos (0.88.13.2) unstable; urgency=low * session-cmd/session-cmd-exec: - Fix actions * lockscreen/Makefile: - Update debug make * xmlrpc/sh/vnc-controller.sh: - Revert some changes and update screensize cmd * bin/daemonize.sh: - Not work with new method reboot and poweroff -- Ignacio Vidal Mon, 24 Dec 2007 04:49:06 +0100 initramfs-tools-tcos (0.88.13.1) unstable; urgency=low [ Ignacio Vidal ] * debian/control: - Add vlc depend * session-cmd/session-cmd-exec: - Add Poweroff and Reboot actions * scripts/tcos-premount/20swapon: - Fix memory exhausted in dd command * scripts/tcos-premount/15uselocal: - Fix typo * lockscreen/*: - Add screensize command to obtain screen resolution for vncviewer - Add lockkeybmouse to avoid user interaction with video difusion - Update Makefile * xmlrpc/*: - Add support for new lockkeybmouse in tcosxmlrpc.c - Add lockkeybmouse.c * xmlrpc/sh/vnc-controller.sh: - Exec vncviewer with screen resolution in client * bin/tryXorg.sh: - Fix sed * hooks-addons/* - 22esd: Fix esd command and ldd, now works correctly in etc-2300 and also fix sound which only work in first user logged - 25tcosmonitor: Fix typos and add support for lockkeybmouse and screensize - 21pulseaudio: Fix ldd and not remove necessary modules [ Mario Izquierdo (mariodebian) ] * bin/installer.sh - Copy files if boot from cdrom (initrd.gz image) * bin/gentcos - Use parse_pxelinux to create isolinux cfg file -- Mario Izquierdo (mariodebian) Sun, 23 Dec 2007 00:27:23 +0100 initramfs-tools-tcos (0.88.13) unstable; urgency=low * hooks-addons/18tcos_hdd_installer bin/installer.sh - Use install-mbr from mbr package to regenerate HDD TOC * hooks-addons/22esd - Start esound without -noterminate * bin/rsync-controller - Delete -no-p -no-g -chmod in rsync cmdline * debian/rules - Call dh_installinit with -n (not duplicate postinst code) * debian/control - Add mbr package depend - Revert ltspfs depends, change order first ltspfs-client second ltspfsd * session-cmd/session-cmd-script - Wait 2 seconds after killing faucet * Merge from branches/experimental r608 => r615 -- Mario Izquierdo (mariodebian) Wed, 19 Dec 2007 09:31:59 +0100 initramfs-tools-tcos (0.88.12) unstable; urgency=low * scripts/tcos-premount/35sqmount - Check if mount squashfs returns error and stop loading (new squashfs bugs) * hooks/tcosbin - Check if mksquashfs returns error * xmlrpc/xauth.h xmlrpc/xauth.c - New function check_ip_address that return an IP address check struct - Don't fail in xauth if pass servername as IP address - Rename hostname var to host (now can be an IP address) * session-cmd/session-cmd-script - Kill facet before launching -- Mario Izquierdo (mariodebian) Wed, 19 Dec 2007 09:12:51 +0100 initramfs-tools-tcos (0.88.11) unstable; urgency=low [ Ignacio Vidal ] * xmlrpc/sh/vnc-controller.sh: - Fix params in killall for busybox [ Mario Izquierdo (mariodebian) ] * tcos-standalone/tcos-standalone.py: - Save username:password with a end line break -- Mario Izquierdo (mariodebian) Wed, 12 Dec 2007 16:14:43 +0100 initramfs-tools-tcos (0.88.10) unstable; urgency=low * conf/tcos-generation-functions.sh: - Fix convert_links2files (check if using PKG_CACHE) * hooks-addons/05devices: - Support new auth method (LTSPFS_TOKEN) of ltspfsd > 0.5 * scripts/tcos-bottom/25startx: - Save mcookie in /var/run/ltspfs_token * xmlrpc/sh/devicesctl.sh: - Call ltspfs-set-xprop to auth new LTSPFS_TOKEN * debian/control: - Split Depends lines again (dapper don't support [arch]) -- Mario Izquierdo (mariodebian) Sun, 09 Dec 2007 16:25:13 +0100 initramfs-tools-tcos (0.88.9) unstable; urgency=low * With tcos-standalone separation avoid session-cmd running on server -- Ignacio Vidal Fri, 7 Dec 2007 14:09:24 +0100 initramfs-tools-tcos (0.88.8) unstable; urgency=low * bin/installer.sh bin/gentcos bin/tcos-buildchroot - Add help2.msg file * bin/gentcos bin/tcos-buildchroot conf/tcos.conf conf/branding.info - Brand TCOS TFTP splash message * xmlrpc/exe.c: - Debug complete command in job_exe -- Mario Izquierdo (mariodebian) Wed, 05 Dec 2007 12:57:56 +0100 initramfs-tools-tcos (0.88.7) unstable; urgency=low * Patches by: Ignacio Vidal * xmlrpc/sh/vnc-controller.sh - In some cases process not die, need force kill with SIGKILL - Fix stopclient, bad username password exec in standalone * bin/tcos-buildchroot - Need ssh in chroot for xterm connection from tcosmonitor * hooks-addons/50xorg - Delete libvnc Xorg extension (conflicts with x11vnc) -- Mario Izquierdo (mariodebian) Wed, 05 Dec 2007 00:23:54 +0100 initramfs-tools-tcos (0.88.6) unstable; urgency=low * debian/tcos-standalone.init: - Fix stupid typo, if file don't exists exit -- Mario Izquierdo (mariodebian) Tue, 04 Dec 2007 10:34:57 +0100 initramfs-tools-tcos (0.88.5) unstable; urgency=low * tcos-standalone/tcos-standalone.glade: - Change invisible character with * * debian/tcos-standalone.init: - Busybox dapper rename process to httpd, fix for it - Exit script if conf file not found -- Mario Izquierdo (mariodebian) Tue, 04 Dec 2007 09:30:29 +0100 initramfs-tools-tcos (0.88.4) unstable; urgency=low * hooks-addons/03wireless scripts/tcos-top/05network: - Support WEP encription - WEP key is in in new var TCOS_WEP -- Mario Izquierdo (mariodebian) Mon, 03 Dec 2007 17:04:35 +0100 initramfs-tools-tcos (0.88.3) unstable; urgency=low * hooks-addons/25tcosmonitor: - Move check of ELF file inside especial start-stop-daemon condition * bin/rsync-controller: - New script to wrap rsync calls and allow to work with translated dirs -- Mario Izquierdo (mariodebian) Sun, 02 Dec 2007 11:15:20 +0100 initramfs-tools-tcos (0.88.2) unstable; urgency=low * debian/tcos-standalone.init - don't exit if TCOS_STANDALONE_START is 0, but no allow to start daemons - kill tcosxmlrpc-standalone and delete pid in stop process - in tcosxmlrpc status compare pidof output with pid file and ensure pid is not empty * hooks-addons/25tcosmonitor bin/tcos-buildchroot: - Copy start-stop-daemon original executable in start-stop-daemon.original - check that we are copying a binary file and not a script -- Mario Izquierdo (mariodebian) Thu, 29 Nov 2007 22:50:01 +0100 initramfs-tools-tcos (0.88.1) unstable; urgency=low * tcos-standalone/*: - New python GUI to configure tcos standalone mode * debian/control debian/tcos-core* debian/tcos-standalone*: - Move some code to new package tcos-standalone * hooks/tcosnfs hooks-addons/00main hooks-addons/00users: - Only include files if not using NFS * hooks/03wireless hooks-addons/90usplash: - Fix minor typos * Add gksu in tcos-standalone.desktop launcher * Add Conflicts in new tcos-core with tcos-standalone -- Mario Izquierdo (mariodebian) Thu, 29 Nov 2007 17:13:16 +0100 initramfs-tools-tcos (0.87.13) unstable; urgency=low * gentcos: - Add option -rmpkg (remove cached package) * session-cmd/session-cmd-exec: - Fix typo in TITLE var * common.mk: - Add Ubuntu hardy to defined distros * hooks-addons/00main: - Copy real ldconfig (suggested by Ignacio Vidal) * lockscreen/lockscreen2.c lockscreen/Makefile: - Support branding (if lockscreen-custom.png exists, loads it) * common.mk: - Add Debian testing to build targets (unstable or etch don't work) -- Mario Izquierdo (mariodebian) Thu, 29 Nov 2007 11:17:08 +0100 initramfs-tools-tcos (0.87.12) unstable; urgency=low * bin/tcos-buildchroot: - Update support for Ubuntu distros grather than Gutsy with kernel modules -- Ignacio Vidal Tue, 27 Nov 2007 15:00:23 +0100 initramfs-tools-tcos (0.87.11) unstable; urgency=low * conf/tcos-run-functions.sh: - Revert last change, sorry for break TCOS * debian/control: - Put depends in single line (old versions like dapper don't allow multiple lines) - Remove [i386] arch depends (old versions don't support) - Remove mknbi depends from Makefile patch_amd64 -- Mario Izquierdo (mariodebian) Tue, 27 Nov 2007 10:26:33 +0100 initramfs-tools-tcos (0.87.10) unstable; urgency=low * session-cmd/session-cmd-exec: - Fail to read /etc/tcos/tcos.conf, need correct permissions * conf/tcos-run-functions.sh: - Fix function, not work anymore tcos pxe * bin/tcos-buildchroot: - Remove more old files to force links update -- Ignacio Vidal Mon, 26 Nov 2007 13:34:18 +0100 initramfs-tools-tcos (0.87.9) unstable; urgency=low * Fix branding errors: - Only include if file exists -- Mario Izquierdo (mariodebian) Sun, 25 Nov 2007 23:13:37 +0100 initramfs-tools-tcos (0.87.8) unstable; urgency=low * Add branding support: - New dir /etc/tcos/conf.d/ which can contain some tcos conf files * bin/tcos-buildchroot: - Add same apt-get options to all calls - Fix some errors - tested with Debian and Ubuntu. -- Mario Izquierdo (mariodebian) Sun, 25 Nov 2007 21:33:00 +0100 initramfs-tools-tcos (0.87.7) unstable; urgency=low [ vidal ] * session-cmd/* - fix syntax error and logout kde [ Mario Izquierdo (mariodebian) ] * Fix pulseaudio errors, need to update cached pulseaudio-esound-compat package * Remove debian/initramfs-tools-tcos.postrm * Create TFTPBOOT dir if not exists * Clean more dirs in debian/initramfs-tools-tcos.prerm -- Mario Izquierdo (mariodebian) Sat, 24 Nov 2007 11:53:49 +0100 initramfs-tools-tcos (0.87.6) unstable; urgency=low * hooks-addons/21pulseaudio: - Don't enable esound protocol in new pulseaudio lib * session-cmd/session-cmd.desktop: - Start session-cdm from /etc/xdg/autostart * session-cmd/session-cmd-script: - exit if not remote or not standalone -- Mario Izquierdo (mariodebian) Mon, 19 Nov 2007 23:07:56 +0100 initramfs-tools-tcos (0.87.5) unstable; urgency=low * session-cmd/* - kde logout - Permission denied with socket creation - Not list or remove all sockets in thin clients actions -- Ignacio Vidal Mon, 19 Nov 2007 14:32:56 +0100 initramfs-tools-tcos (0.87.4) unstable; urgency=low * session-cmd/: - Scripts to exit current session (from lliurex developers) - Added to debian/copyright * bin/tcos-buildchroot: - More changes to make work in Ubuntu * debian/control: - New depends on tcos-core package: netpipes and libnotify-bin (session-cmd) -- Mario Izquierdo (mariodebian) Sat, 17 Nov 2007 19:11:47 +0100 initramfs-tools-tcos (0.87.3) unstable; urgency=low * Fix tcos-buildchroot in Ubuntu -- Ignacio Vidal Thu, 15 Nov 2007 23:30:51 +0100 initramfs-tools-tcos (0.87.2) unstable; urgency=low * Move usr-x.x.x.squashfs file to TFTP_DIR, files dir is obsolete from now * scripts/tcos-bottom/50freespace bin/clear-logs: - New script, empty logs files bigger than 256 kb * scripts/tcos-bottom/35services: - Only start inetd if /etc/inetd.conf exists * tcos/tcos.msg tcos/help.msg tcos/help2.msg tcos/default.tpl - Update some command line options and add new page F2 * hooks/tcosmods conf/tcos-generation-functions.sh: - Export tcos_manual_add_modules and force_add_module functions in tcos-generation-functions * hoos/tcosbin hooks/tcosnfs: - Move some common code to new hooks-addons: 00main 00init 90usplash * hooks-addons/50xorg: - Remove nvidia_drv.so from image (not work, no needed) -- Mario Izquierdo (mariodebian) Sun, 11 Nov 2007 15:25:48 +0100 initramfs-tools-tcos (0.87.1) unstable; urgency=low * scripts/tcos-top/* - Add new cmdline force nfs to force mount nfs in host with more TCOS_MIN_RAM * debian/*install debian/*manpages: - Move update-tcospasswd and tcospasswd to tcos-core package * debian/control: - Add depends xvnc4viewer|xvncviewer - Remove tftpd-hpa depends (force to install atftpd) * debian/tcos-standalone.init: - Include vars.sh file only if exists (not critical) * hooks/tcosnfs: - Make some dirs in initramfs before calling other hooks-addons * scripts/tcos-top/40make_init: - Create again busybox links in NFS init * bin/tcos-buildchroot: - Link NFS files and dirs in update images (if exists) -- Mario Izquierdo (mariodebian) Sat, 10 Nov 2007 11:22:05 +0100 initramfs-tools-tcos (0.86.8) unstable; urgency=low * hooks/tcosnfs - Add 00users 01busybox 02udev2 hooks-addons (ubuntu busybox awk bug) * Remove not needed code -- Mario Izquierdo (mariodebian) Thu, 08 Nov 2007 22:21:45 +0100 initramfs-tools-tcos (0.86.7) unstable; urgency=low * Add support to Intel Dot Station (alias Paquito): - Add hook-addon and test if modem and graphic card. - Force load some optional modules -- Mario Izquierdo (mariodebian) Thu, 08 Nov 2007 00:06:51 +0100 initramfs-tools-tcos (0.86.6) unstable; urgency=low * xmlrpc/vnc.c: - Fix typo in IS_STANDALONE condition (not needed) * bin/tcos-buildchroot - Add EXTRA mirror to Ubuntu (universe and multiverse) - Add new tcos-keyring package - Remove download key with wget * debian/control: - Add new package depends tcos-keyring -- Mario Izquierdo (mariodebian) Tue, 06 Nov 2007 23:20:21 +0100 initramfs-tools-tcos (0.86.5) unstable; urgency=low * xmlrpc/sh/tcos-dbus.py: - Stop if bad username:passwd string * xmlrpc/sh/screenshot.sh - export XAUTHORITY in thin client case * xmlrpc/Makefile - Clean temp *~ files -- Mario Izquierdo (mariodebian) Fri, 02 Nov 2007 17:05:29 +0100 initramfs-tools-tcos (0.86.4) unstable; urgency=low * xmlrpc/exe.c: - call daemonize from job_exe * Makefile: - Install daemonize with 755 not 644 * xmlrpc/standalone.h: - Change STANDALONE_TIME define to work with old and new clients * xmlrpc/sh/vnc-controller.sh: - Remove abspath and add dbus call to startclient * bin/daemonize.sh: - Fix remove first arg sed command -- Mario Izquierdo (mariodebian) Thu, 01 Nov 2007 19:13:00 +0100 initramfs-tools-tcos (0.86.3) unstable; urgency=low * xmlrpc/standalone.[ch] - New STANDALONE_TIME, to get time logged from standalone host * tcos.conf: - Disable TCOS_MAX_MEM -- Mario Izquierdo (mariodebian) Mon, 29 Oct 2007 09:32:05 +0100 initramfs-tools-tcos (0.86.2) unstable; urgency=low * Revert (semi) last change who => w: - Old versions use column 2, new versions use column 3 -- Mario Izquierdo (mariodebian) Sun, 28 Oct 2007 00:47:25 +0200 initramfs-tools-tcos (0.86.1) unstable; urgency=low * Fix some nvidia issues, delete /usr/lib/libGLcore.so (10 Mb) * bin/gentcos: - Add another method to get packages uri (-instpkg) * bin/tcos-buildchroot: - Only make links if exists into chroot and not exits outside - Call apt with nointeractive frontend * hooks-addons/55vnc: - Add auth to x11vnc server * xmlrpc/* - New method tcos.vnc use a new wrapper: vnc-controller.sh * Update Debian unstable (2.6.22-3-486) and Ubuntu gutsy (2.6.22-14-generic) kernels * bin/daemonize.sh: - wrap start-stop-daemon in a simple script -- Mario Izquierdo (mariodebian) Sat, 27 Oct 2007 23:31:17 +0200 initramfs-tools-tcos (0.85.3) unstable; urgency=low * hooks-addons/25tcosmonitor: - Create dir before copying png lock image (ups !!!) -- Mario Izquierdo (mariodebian) Thu, 11 Oct 2007 11:17:28 +0200 initramfs-tools-tcos (0.85.2) unstable; urgency=low * Move lockscreen.png to tcos-core package => /usr/share/tcos-core/ -- Mario Izquierdo (mariodebian) Sun, 07 Oct 2007 20:55:12 +0200 initramfs-tools-tcos (0.85.1) unstable; urgency=low * xmlrpc/* - Adopt new libxmlrpc API (> 1.06) and use conditionals adding methods - Move echo, version and status method outside main file * debian/initramfs-tools-tcos.[postint|postrm] - Remove error with unknow argument - Purge tcos-standalone script with || true (thanks Vidal) * lockscreen/lockscreen2.c: - set environment var XLIB_SKIP_ARGB_VISUALS=1 (force load png image) * Split initramfs-tools-tcos package to new tcos-core (bins for tcos images, not server dependencies) * bin/set-limits: - Set memory limit in some startup scripts (startx tcosxmlrpc...) * xmlrpc/xauth.c - Be more silent in xauth cookie creation * hooks-addons/25tcosmonitor: - Move launchers in a new scripts files: scripts/tcos-bottom/56tcosxmlrpc scripts/tcos-bottom/55mount_listener -- Mario Izquierdo (mariodebian) Sat, 06 Oct 2007 20:12:44 +0200 initramfs-tools-tcos (0.84.7) unstable; urgency=low * Fix upgrade scripts -- Mario Izquierdo (mariodebian) Sun, 30 Sep 2007 12:06:59 +0200 initramfs-tools-tcos (0.84.6) unstable; urgency=low * bin/tcos-buildchroot: - Add rdesktop as tcos package * hooks-addons/25tcosmonitor: - Search for /sbin/start-stop-daemon.REAL (cdebootstrap hack) -- Mario Izquierdo (mariodebian) Sun, 30 Sep 2007 11:44:43 +0200 initramfs-tools-tcos (0.84.5) unstable; urgency=low * Remove tcos-server-utils package (now contents are in tcos package) * Remove obsolete opengl dir * Remove obsolete discover dir * Remove obsolete esound dir * Remove old dir -- Mario Izquierdo (mariodebian) Mon, 24 Sep 2007 13:10:18 +0200 initramfs-tools-tcos (0.84.4) unstable; urgency=low * Make TCOS_EXTRA_MODULES new var in tcos.conf * gentcos: - Remove export TCOS_EXTRA_MODULES - Fix read -extramodules cmdline to allow more modules -- Mario Izquierdo (mariodebian) Mon, 24 Sep 2007 13:07:23 +0200 initramfs-tools-tcos (0.84.3) unstable; urgency=low * Only depend on mknbi on i386 arch * Patch debian/control in Ubuntu dapper with Source-Version -- Mario Izquierdo (mariodebian) Sat, 22 Sep 2007 21:23:44 +0200 initramfs-tools-tcos (0.84.2) unstable; urgency=low * bin/tcos-buildroot: - Fix typo in TCOS_CHROOT var - Add --gentcos option to build images with other params * Update Ubuntu gutsy kernel version * debian/control: - Replace source:version depends with 0.84.1 - Fix some descriptions -- Mario Izquierdo (mariodebian) Sat, 22 Sep 2007 18:52:55 +0200 initramfs-tools-tcos (0.84.1) unstable; urgency=low * Important move of code, some of tcosmonitor stuff move here: - udev - xmlrpc - lockscreen - hooks-addons * bin/tcos-buidchroot: - Script to build a (32bit) chroot to build tcos images -- Mario Izquierdo (mariodebian) Fri, 21 Sep 2007 23:32:14 +0200 initramfs-tools-tcos (0.83.2) unstable; urgency=low * bin/configurexorg, hooks-addons/40etc3800: - Support new openchrome driver * scripts/tcos-top/20mountnfs: - Mount NFS without nfsro (deprecated in new unionfs) * scripts/tcos-top/50fstab: - Call udevtrigger and udevsettle to create ide/block devices * scripts/tcos-premount/25nbd_filesystem: - Create only 2 nbd devices and wait for /dev/nbd0 -- Mario Izquierdo (mariodebian) Wed, 19 Sep 2007 22:41:27 +0200 initramfs-tools-tcos (0.83.1) unstable; urgency=low * scripts/tcos-bottom/05inittcos, conf/tcos.conf - limit MAX_MEM used for thin clients with ulimit (default 95%) * Remove PATH definition in all scripts * conf/tcos-run-functions.sh: - Disable change vt in kill_usplash * scripts/tcos-top/50fstab: - Add option to force not use swap - Replace cut with awk * scripts/tcos-bottom/10ldconfig, hooks/tcosbins: - Move ldconfig to /usr/sbin * bin/gentcos: - Fix typo in inst_pkg function * hooks-addons/08discover: - Move discover /lib files to squashed /usr/lib (less ram) -- Mario Izquierdo (mariodebian) Fri, 14 Sep 2007 21:32:49 +0200 initramfs-tools-tcos (0.82.11) unstable; urgency=low * Add USB/IP experimental support -- Mario Izquierdo (mariodebian) Wed, 05 Sep 2007 23:06:21 +0200 initramfs-tools-tcos (0.82.10) unstable; urgency=low * Update debian unstable kernel version 2.6.22-2-486 -- Mario Izquierdo (mariodebian) Wed, 05 Sep 2007 22:04:44 +0200 initramfs-tools-tcos (0.82.9) unstable; urgency=low * bin/gentcos, hooks-addons/50xorg: - Add -fix-nvidia-ati option to cache xserver-xorg-core and libgl1-mesa-glx - Reorganize bin/gentcos with simpler code * bin/tcos-gdm-autologin: - Remove wrong licence line (thanks to Quiran to alert me) * daemonize/daemon.c, daemonize/Makefile: - Make work daemonize with double fork. -- Mario Izquierdo (mariodebian) Tue, 04 Sep 2007 11:10:17 +0200 initramfs-tools-tcos (0.82.8) unstable; urgency=low * Add support for cdaudio (using cdfs + cdparanoia to detect) * Update dapper kernel 2.6.15-29-386 -- Mario Izquierdo (mariodebian) Sat, 01 Sep 2007 13:18:30 +0200 initramfs-tools-tcos (0.82.7) unstable; urgency=low * bin/get_filesystem: - Remove disktype - Add fstype (new klibc) * Update Ubuntu gutsy kernel version -- Mario Izquierdo (mariodebian) Fri, 24 Aug 2007 17:59:18 +0200 initramfs-tools-tcos (0.82.6) unstable; urgency=low * bin/tcos-gdm-autologin: - New option (--noaction) for debug proposes only - If DISPLAY contains IP address instead of hostname try to convert using gethostbyaddr - If /etc/gd/gdm.conf-custom exists use it. - Update man page * conf/tcos-run-functions.sh: - Kill tryXorg too in kill_xorg() - Kill process in background -- Mario Izquierdo (mariodebian) Tue, 21 Aug 2007 23:10:18 +0200 initramfs-tools-tcos (0.82.5) unstable; urgency=low * Add Subversion repository URL to debian/control. * bin/gentcos: - Ignore errors in ramdisk size -- Mario Izquierdo (mariodebian) Mon, 20 Aug 2007 18:28:27 +0200 initramfs-tools-tcos (0.82.4) unstable; urgency=low * Add support for lp_server (if avalaible) * Change Debian etch kernel version to 2.6.18-5-486 -- Mario Izquierdo (mariodebian) Mon, 20 Aug 2007 11:08:59 +0200 initramfs-tools-tcos (0.82.3) unstable; urgency=low * Update kernel versions (enable update && security mirrors in pbuilder) -- Mario Izquierdo (mariodebian) Tue, 07 Aug 2007 13:32:34 +0200 initramfs-tools-tcos (0.82.2) unstable; urgency=low * Fix new gentcos test about unionfs|aufs module (crash without awk) * Create /sbin/startesd always not only with cached esound -- Mario Izquierdo (mariodebian) Mon, 30 Jul 2007 23:39:09 +0200 initramfs-tools-tcos (0.82.1) unstable; urgency=low * Add printer support TCOS_PRINT * Add initial NBD support (don't work fully yet) * Add support for using aufs module instead of unionfs * mksquashfs go from /usr/sbin to /usr/bin in debian unstable, search for it... * Try to put all copyright authors in debian/copyright -- Mario Izquierdo (mariodebian) Mon, 30 Jul 2007 17:31:24 +0200 initramfs-tools-tcos (0.81.2) unstable; urgency=low * Install get_filesystem in initramfs-tools-tcos package -- Mario Izquierdo (mariodebian) Wed, 27 Jun 2007 22:39:22 +0200 initramfs-tools-tcos (0.81.1) unstable; urgency=low * New script get_filesystem wit 3 modes of work: - udev vol_id - disktype - fdisk -- Mario Izquierdo (mariodebian) Wed, 27 Jun 2007 20:08:17 +0200 initramfs-tools-tcos (0.80.8) unstable; urgency=low * conf/tcos-run-functions.sh: - change get_filesystem to make modular -- Mario Izquierdo (mariodebian) Wed, 20 Jun 2007 21:17:19 +0200 initramfs-tools-tcos (0.80.7) unstable; urgency=low * hooks-addons/56rdesktop and hooks-addons/21pulseaudio: - Fix TCOS_SOUND disable * scripts/tcos-top/50fstab: - Remove some old code, and mount all in /mnt/$DEVICE * conf/tcos-run-functions.sh: - If /sbin/mount.ntfs-3g is found return ntfs-3g filesystem * daemonize: - Wrapper to daemonize a process -- Mario Izquierdo (mariodebian) Wed, 20 Jun 2007 15:10:38 +0200 initramfs-tools-tcos (0.80.6) unstable; urgency=low * User disktype to create a better /etc/fstab * conf/tcos-run-functions.sh: - Move get_filesystem() to this include * scripts/tcos-bottom/05inittcos: - Create fstab again with disktype info (disktype is in squashfs) * scripts/tcos-top/50fstab: - Clean and delete get_filesystem() * hooks-addons/18tcos_hdd_installer: - Add /usr/bin/disktype -- Mario Izquierdo (mariodebian) Tue, 19 Jun 2007 12:44:49 +0200 initramfs-tools-tcos (0.80.5) unstable; urgency=low * Fix more typos, close ticket #2 -- Mario Izquierdo (mariodebian) Mon, 18 Jun 2007 11:33:25 +0200 initramfs-tools-tcos (0.80.4) unstable; urgency=low * bin/tryXorg.sh: - Fix typo this => these... * conf/xorg-tcos.conf: - Remove this obsolete file * Add HACKING.en, close ticket #1 (thanks to Andres Jimenez gandresin at gmail) -- Mario Izquierdo (mariodebian) Fri, 15 Jun 2007 12:45:15 +0200 initramfs-tools-tcos (0.80.3) unstable; urgency=low * conf/xorg.conf.tpl: - Keyboard driver is kbd not keyboard -- Mario Izquierdo (mariodebian) Thu, 14 Jun 2007 23:40:17 +0200 initramfs-tools-tcos (0.80.2) unstable; urgency=low * bin/tryXorg.sh: - Xorg log is Xorg.0.log, not Xorg.log -- Mario Izquierdo (mariodebian) Wed, 13 Jun 2007 12:32:14 +0200 initramfs-tools-tcos (0.80.1) unstable; urgency=low * conf/xorg.conf.tpl: - Disable via VBEModes, VBEREstore (not work with last Mesa) - Add __xkbmodel__ var (pc104 with us keyboard and pc105 in some cases) * debian/control: - Remove as hard depends: ltspfsd | ltspfs-client * conf/tcos.conf: - New var TCOS_XORG_XKBMODEL * hooks-addons/40etc3800: - Move startup script from 30 to 15 (startx is at 25) * bin/configurexorg: - Add __xkbmodel__ in sed replace * bin/tryXorg.sh: - Change tty7 => vt7 - Use TCOS kbd info in new xorg.conf.auto file * hooks-addons/05devices: - Enable cache for ltspfsd: gentcos -instpkg ltspfsd * common.mk, Makefile: - Add Ubuntu gutsy info. -- Mario Izquierdo (mariodebian) Tue, 12 Jun 2007 20:46:14 +0200 initramfs-tools-tcos (0.79.11) unstable; urgency=low * debian/tcos-usplash.postinst: - Change priority from 30 to 5 to not overwrite ubuntu default usplash theme * hooks-addons/03udev2: - Copy some more files to make work SATA cdrom. -- Mario Izquierdo (mariodebian) Tue, 12 Jun 2007 12:16:36 +0200 initramfs-tools-tcos (0.79.10) unstable; urgency=low * conf/tcos.conf: - Remove TCOS_VERSION => /etc/tcos/version.conf -- Mario Izquierdo (mariodebian) Fri, 08 Jun 2007 23:47:14 +0200 initramfs-tools-tcos (0.79.9) unstable; urgency=low * URGENT: Remove «set -e» ini initramfs-tools-tcos.postinst, because break if grep exit with errors -- Mario Izquierdo (mariodebian) Fri, 08 Jun 2007 23:23:58 +0200 initramfs-tools-tcos (0.79.8) unstable; urgency=low * Move TCOS_VERSION and TCOS_DISTRO to version.conf (avoid to update tcos.conf in every package update) * Fix some cat commands in postinst -- Mario Izquierdo (mariodebian) Fri, 08 Jun 2007 22:47:30 +0200 initramfs-tools-tcos (0.79.7) unstable; urgency=low * bin/tryXorg.sh: - Start Xorg at tty7 to avoid getty keyboards conflicts -- Mario Izquierdo (mariodebian) Tue, 05 Jun 2007 14:32:53 +0200 initramfs-tools-tcos (0.79.6) unstable; urgency=low * Use debian ltspfs and ltspfsd packages -- Mario Izquierdo (mariodebian) Mon, 04 Jun 2007 14:35:46 +0200 initramfs-tools-tcos (0.79.5) unstable; urgency=low * hooks-addons/21pulseaudio: - Create symlink of libpulsecore.so.0.3 to so.0.2 * Change in all files default Homepage to http://www.tcosproject.org * Change /tftpboot dir in doc files to /var/lib/tcos/tftp -- Mario Izquierdo (mariodebian) Sun, 03 Jun 2007 23:27:41 +0200 initramfs-tools-tcos (0.79.4) unstable; urgency=low * scripts/tcos-top/50fstab: - Add /dev/pts to /etc/fstab and mount it (dropbear need it for kernel 2.6.20). * conf/82export_pulseaudio: - Remove xmodmap keymap hack -- Mario Izquierdo (mariodebian) Fri, 01 Jun 2007 12:54:39 +0200 initramfs-tools-tcos (0.79.3) unstable; urgency=low * common.mk: - Set default kernel in debian unstable to 2.6.21-1-486 - Update Ubuntu feisty kernel to 2.6.20-16-generic * Makefile: - Add patch targets * debian/copyright: - Add more info * hooks-addons/59freenx: - Warn about missing depends of libstdc++2.10-glibc2.2 package -- Mario Izquierdo (mariodebian) Thu, 31 May 2007 19:40:25 +0200 initramfs-tools-tcos (0.79.2) unstable; urgency=high * hooks-addons/03udev2: - Important bugfix -- Mario Izquierdo (mariodebian) Mon, 28 May 2007 17:39:47 +0200 initramfs-tools-tcos (0.79.1) unstable; urgency=low * hooks-addons/03udev2: - Fix typo in logger.agent script * Makefile: - Copy parsed tcos.conf in TCOS_DIR * Add support for reportbug * Change HomePage to http://www.tcosproject.org -- Mario Izquierdo (mariodebian) Mon, 28 May 2007 16:36:23 +0200 initramfs-tools-tcos (0.79) unstable; urgency=low * hooks-addons/50xorg: - Fix XKB path - Remove symlinks (xfree86 and xorg) * scripts/tcos-bottom/10ldconfig: - Generate removed symlinks * usplash/Makefile: - More simple file * usplash/0.3/usplash-tcos.png, usplash/0.2/usplash-artwork.png: - New theme * scripts/tcos-bottom/10ldconfig: - Create some needed symlinks -- Mario Izquierdo (mariodebian) Sun, 27 May 2007 21:12:49 +0200 initramfs-tools-tcos (0.78) unstable; urgency=low * Delete hooks-addons/41_snd_cs4236 (not needed) * conf/82export_pulseaudio: - Export PulseAudio environment var and load kbmap (Spanish yet) * tcos/logo.lss: - new pxe splash logo based on new usplash * hooks-addons/50xorg: - Working keymap !!!!!! * scripts/tcos-bottom/25startx: - Move startx to medium start (start in 5 seconds less) * conf/tcos-run-functions.sh: - Use busybox syslogd and logger to save log messages => /var/log/messages * scripts/tcos-bottom/05inittcos: - Move some code to scripts/tcos-bottom/35services -- Mario Izquierdo (mariodebian) Sun, 27 May 2007 00:33:29 +0200 initramfs-tools-tcos (0.77a) unstable; urgency=low * Fix XKB dir in ubuntu edgy, dapper => /etc/X11/xkb * hooks-addons/41_snd_cs4236: - Add special support for Crystal Sound * scripts/tcos-bottom/40initsound: - Unmute 'Master Digital' and set to TCOS_VOLUME * Add experimental to common.mk defaults -- Mario Izquierdo (mariodebian) Wed, 23 May 2007 17:09:37 +0200 initramfs-tools-tcos (0.77) unstable; urgency=low * Add mii-tool to check what network interface have link * Add support for different servers (xdmcp-server, font-server, rdesktop-server, etc...) * Try to add xkbmap support (working on it) * Fix usplash change TCOS_USPLASH not work * Add new and beutifull usplash theme (called 0.4.1) based on usplash-theme-debian sources * New build dependencies: imagemagick and librsvg2-bin -- Mario Izquierdo (mariodebian) Fri, 18 May 2007 21:38:24 +0200 initramfs-tools-tcos (0.76) unstable; urgency=low * Remove all dpkg calls -- Mario Izquierdo (mariodebian) Fri, 04 May 2007 22:55:33 +0200 initramfs-tools-tcos (0.75) unstable; urgency=low * bin/tryXorg.sh: - new method for launching Xorg (3 times in normal mode and -configure if fails. * bin/installer.sh: - Mount swap after parts creation - Add option --oeminstall to part and install syslinux unattended * hooks-addons/03wireless: - Add support of Zydas (zd1211) in wireless hook * - -- Mario Izquierdo (mariodebian) Fri, 04 May 2007 22:55:31 +0200 initramfs-tools-tcos (0.74) unstable; urgency=low * Fix conf/tcos.conf kernel double " * Set usplash version with distro version * Delete usplash/test.sh * bin/gentcos: - Fix duplicate entries in cache package read uris * Set new var TCOS_USPLASH to allow change default thin client usplash theme * Backport new manual_add_modules to tcos_manual_add_modules (dapper have debian bug yet) * Add more recomends packages. * bin/configurexorg: - parse error in xdriver ( use getsimple with #VARNAME= ) * bin/installer.sh: - make mem test before installing syslinux (NFS need less ramdisk) * debian/control: - fix typo in tcos Recommends * Remove discover hard dependency * Add pulseaudio, aumix, busybox to tcos metapackage dependencies * Update dapper kernel to 2.6.15-28-386 * hooks-addons/99tcos Makefile: - remove dpkg -l call and write TCOS_VERSION during package build => Makefile * hooks-addons/50xorg: - If Xorg don't start after 3 atemps, try to autoconfigure with Xorg -configure and generate /etc/X11/xorg.conf.auto -- Mario Izquierdo (mariodebian) Sun, 29 Apr 2007 00:02:45 +0200 initramfs-tools-tcos (0.73) unstable; urgency=low * usplash: - Make usplash from dapper work (pngtobogl must be compiled from sources) * scripts/tcos-premount/35sqmount: - Ubuntu feisty udev (or 2.6.20 kernel) don't create loop devices and need to wait * Put in tcos.conf default distro kernel (during install check for version, see common.mk) -- Mario Izquierdo (mariodebian) Sat, 21 Apr 2007 21:19:38 +0200 initramfs-tools-tcos (0.72) unstable; urgency=low * hooks/tcosbin: - Try to remove all stuff in /lib/i686 in similar way than /lib/tls * conf/tcos-generation-functions.sh: - convert_links2files acepts one argument (dir where conversion is done) * Add serial modules (serial mouse needs it !! ) -- Mario Izquierdo (mariodebian) Sat, 21 Apr 2007 14:02:11 +0200 initramfs-tools-tcos (0.71) unstable; urgency=low * hooks/tcosbin: - add absolute path of mksquashfs bin. - hide hack load info * In debian unstable start thin client with vga=791 (usplash at 640x480 not work) * Not load pcspkr module * Depends on libusplash-dev (only valid with new usplash package) * bin/tcos-gdm-autologin: - Fix username : displayname compare in /etc/passwd * debian/rules: - Fix typo in version detect. -- Mario Izquierdo (mariodebian) Wed, 18 Apr 2007 10:44:18 +0200 initramfs-tools-tcos (0.70) unstable; urgency=low * Extends ConfigObj class to use '=' instead of ' = ' * Don't copy /lib/dhcp3-client/call-dhclient-script * Use discover from TCOS cache (for dapper) * Better gentcos.postinst (work with inetd.conf, atftpd, tftpd-hpa) -- Mario Izquierdo (mariodebian) Tue, 03 Apr 2007 14:50:05 +0200 initramfs-tools-tcos (0.69) unstable; urgency=low * Remove old debian/*lintian* files * Move allmodules-x.x.x.squashfs to TFTP_DIR instead of /tftpboot/tcos -- Mario Izquierdo (mariodebian) Tue, 27 Mar 2007 10:06:48 +0200 initramfs-tools-tcos (0.68) unstable; urgency=low * bin/tcos-gdm-autologin: - Fix typo chowm => chown - Add fromip var to make a network not starting in number 1 - Add --nodelete option to not work in kiosk mode. * hooks/tcosbin and hooks-addons/*: - move some code to hooks-addons * Change depends, move to tcos metapackage. * Change Makefiles to allow not building tcos-usplash (HAVE_USPLASH=0) * More debug info in configurexorg with --verbose flag * Fix some typo in conf/xorg.conf.tpl -- Mario Izquierdo (mariodebian) Tue, 20 Mar 2007 11:27:46 +0100 initramfs-tools-tcos (0.67) unstable; urgency=low * gentcos depends atftpd | tftpd-hpa and dhcp3-server * hooks-addons/*xorg: - fix Xorg path search * Do some job in freenx support ( gentcos::README.freenx) * Make an special computer hook (EPATEC eTC3800 force load via driver) * Add acpi button daemon event. -- Mario Izquierdo (mariodebian) Sun, 11 Mar 2007 17:20:24 +0100 initramfs-tools-tcos (0.66) unstable; urgency=low * Add 600 file rights to tcos.conf -- Mario Izquierdo (mariodebian) Wed, 7 Mar 2007 19:22:23 +0100 initramfs-tools-tcos (0.65) unstable; urgency=low * scripts/tcos-premount/35sqmount: - Add autodetect support for booting from HD or USB device (mount all ext3 or vfat partitions and search usr.squashfs or usr-$(uname -r).squashfs) * Update tcos kernel version to 2.6.18-4-486 (debian testing and unstable) * Fix some info and warning messages in gentcos.postinst -- Mario Izquierdo (mariodebian) Tue, 6 Mar 2007 22:21:59 +0100 initramfs-tools-tcos (0.64) unstable; urgency=low * Fix 40initsound OSS broken detection * Copy libesd0 (OSS) always if avalaible from cache * Use cached pulseaudio-esound-compat files * Add README.cache to gentcos docs -- Mario Izquierdo (mariodebian) Sat, 3 Mar 2007 16:07:40 +0100 initramfs-tools-tcos (0.63) unstable; urgency=low * Fix esound start in OSS compability PulseAudio -> eSound -> OSS * Know to not work (PulseAudio bug ???) PulseAudio -> OSS (/dev/dsp without /proc/asound) -- Mario Izquierdo (mariodebian) Mon, 26 Feb 2007 21:39:47 +0100 initramfs-tools-tcos (0.62) unstable; urgency=low * Add cache support to gentcos, used to use some non installed packages (esound, libesd0..) * Rename all hooks-addons with numbers (exec order) -- Mario Izquierdo (mariodebian) Sat, 24 Feb 2007 13:32:20 +0100 initramfs-tools-tcos (0.61) unstable; urgency=low * Change /opt/tcos with /var/lib/tcos (debian correct) * Remove debconf message * Not build tcos-discover2 tcos-opengl-libs tcos-esound anymore (no clean, not debian) * Change /tftpboot/tcos with /var/lib/tcos/tftp and link it * Add UPGRADE.debian info to gentcos package * bin/gentcos: - Fix initramfs name in isolunux cdrom generation -- Mario Izquierdo (mariodebian) Tue, 20 Feb 2007 11:39:47 +0100 initramfs-tools-tcos (0.60.7) unstable; urgency=low * New package tcos-esound (esd and libesd0) -- Mario Izquierdo (mariodebian) Sun, 18 Feb 2007 00:09:52 +0100 initramfs-tools-tcos (0.60.6) unstable; urgency=low * Add support for rdesktop (tested with Windows BadVista / MalaVista) * Loop some core functions (Xorg, rdesktop...) -- Mario Izquierdo (mariodebian) Tue, 13 Feb 2007 09:11:19 +0100 initramfs-tools-tcos (0.60.5) unstable; urgency=low * hooks-addons/rungetty: - Exec getty in a while [1] loop. -- Mario Izquierdo (mariodebian) Fri, 9 Feb 2007 13:50:33 +0100 initramfs-tools-tcos (0.60.4) unstable; urgency=low * bin/seq: - Complete seq shell script, now accepts same params like /usr/bin/seq seq LAST seq FIRST LAST seq FIRST INCREMENT LAST -- Mario Izquierdo (mariodebian) Thu, 8 Feb 2007 18:53:33 +0100 initramfs-tools-tcos (0.60.3) unstable; urgency=low * conf/xorg.conf.tpl: - Add serial mouse support -- Mario Izquierdo (mariodebian) Thu, 8 Feb 2007 11:25:29 +0100 initramfs-tools-tcos (0.60.2) unstable; urgency=low * bin/gentcos: - Clean initramfs unwanted files after mkinitramfs * ALL: - reduce required RAM (min now is 24 Mb, probably need swap) -- Mario Izquierdo (mariodebian) Tue, 6 Feb 2007 19:26:15 +0100 initramfs-tools-tcos (0.60.1) unstable; urgency=low * Remove PREREQS in init scripts (scripts have numbers, should start in order...) * hex2ascii: - move this build dir and bin to this package * scripts/tcos-bottom/80shell: - more elegant shells (getty) num of ttys defined in tcos.conf -- Mario Izquierdo (mariodebian) Sat, 3 Feb 2007 22:07:59 +0100 initramfs-tools-tcos (0.59.1) unstable; urgency=low * Fix some bashism (== /bin/sh), I hope that ubuntu will work OK now. -- Mario Izquierdo (mariodebian) Mon, 29 Jan 2007 14:02:45 +0100 initramfs-tools-tcos (0.58.2) unstable; urgency=low * Change usplash_timeout script -- Mario Izquierdo (mariodebian) Sun, 21 Jan 2007 16:15:21 +0100 initramfs-tools-tcos (0.58.1) unstable; urgency=low * Add ubuntu-tcos splash theme (debian don't work in new usplash version) * Delete "quiet" in all boot args for ubuntu. -- Mario Izquierdo (mariodebian) Sun, 21 Jan 2007 13:49:20 +0100 initramfs-tools-tcos (0.57.2) unstable; urgency=low * Add wireless boot support (hooks-addons/wireless scripts/tcos-top/05network): - TCOS_WIRELESS_MODS="list of kernel modules" (madwifi alias of atheros) - TCOS_WIRELESS_ENC="type" (WEP, WPA, empty) WPA work, WEP need some job... * Change interpeter (bin/gentcos) /bin/sh to /bin/bash (fix problem in ubuntu with dash) * Remove unsused Xorg dirs (hooks-addons/xorg) * Add TCOS_INSTALLER_BOOT_OPT to change installer cmdline extra options. -- Mario Izquierdo (mariodebian) Sat, 13 Jan 2007 11:02:19 +0100 initramfs-tools-tcos (0.57.1) unstable; urgency=low * usplashize installer.sh * Move installer launcher before startx script * Add installer update to pxelinux.cfg * Add bigger usplash timeout before udev (need some testing) -- Mario Izquierdo (mariodebian) Tue, 26 Dec 2006 23:33:39 +0100 initramfs-tools-tcos (0.56.18+1) unstable; urgency=low * hooks-addons/xorg: - fix space in if conditional - fix "! -d /var" => "-d /usr" in opengl conditional - delete libglx.so (only needed by nvidia & ati drivers) * Fix minor typo in hooks-addons/xorg -- Mario Izquierdo (mariodebian) Sun, 17 Dec 2006 15:51:45 +0100 initramfs-tools-tcos (0.56.17) unstable; urgency=low * New package: tcos-opengl-libs (force free opengl drivers) - libGL.so.1.2 - libGLU.so.1.* - libGLcore.so Ati (fglrx) and Nvidia drivers don't work on thin client. * Fix hooks-addons/xorg to use new files of new package (tcos-opengl-libs) Must work if packages are created in same Xorg version that server runs. -- Mario Izquierdo (mariodebian) Sun, 10 Dec 2006 17:00:19 +0100 initramfs-tools-tcos (0.56.16) unstable; urgency=low * Enable by default OpenGL support, now screensaver and gcompris must work. * Add message when OpenGL is enabled or disabled. -- Mario Izquierdo (mariodebian) Sun, 10 Dec 2006 14:16:06 +0100 initramfs-tools-tcos (0.56.15) unstable; urgency=low * bin/tcos-gdm-autologin: Umount all fuse devices before restoring template. -- Mario Izquierdo (mariodebian) Mon, 4 Dec 2006 10:46:26 +0100 initramfs-tools-tcos (0.56.14) unstable; urgency=low * FIX tcos-gdm-autologin AddHost() loop ;) -- Mario Izquierdo (mariodebian) Wed, 29 Nov 2006 18:41:19 +0100 initramfs-tools-tcos (0.56.13) unstable; urgency=low * Fix LC_ALL=C in tcos image date. -- Mario Izquierdo (mariodebian) Wed, 29 Nov 2006 18:14:49 +0100 initramfs-tools-tcos (0.56.12) unstable; urgency=low * Fix some errors in tcos-gdm-autologin and enable execmd() function -- Mario Izquierdo (mariodebian) Tue, 28 Nov 2006 15:19:38 +0100 initramfs-tools-tcos (0.56.11) unstable; urgency=low * hooks-addons/xorg - add Xorg OpenGL support (new tcos.conf var TCOS_XORG_OPENGL) -- Mario Izquierdo (mariodebian) Fri, 24 Nov 2006 09:28:12 +0100 initramfs-tools-tcos (0.56.10) unstable; urgency=low * Revert vga=771 patch, initramfs-tools revert mknod /dev/fb0 too... * Add tcos-gdm-autologin script (need man page) * Installer: add update method to download files again, but no make parts. add PROMPT 1 in syslinux.cfg and change TIMEOUT to 50 (5 segs) * New rewrite of tcos-gdm-autologin (python based) With tcos-gdm-autologin you can: - configure GDM ( --configure option ) - add users and host ( --add interactive option ) - gdm autologin (it's called from GDM to return username and restore home from template) * Add python-configobj to tcos-server-utils depends. -- Mario Izquierdo (mariodebian) Sun, 19 Nov 2006 20:13:24 +0100 initramfs-tools-tcos (0.56.9) unstable; urgency=low * Fix hooks-addons/dhclient dhclient3 path of script * Make package with common.mk -- Mario Izquierdo (mariodebian) Thu, 16 Nov 2006 22:05:35 +0100 initramfs-tools-tcos (0.56.8) unstable; urgency=low * join tcos-nfs startup with normal tcos * autodetect ram < 38 and boot from NFS * fix hooks-addons/alsa amixer path * move fstab from tcos-premount to tcos-top * pxelinux.cfg/default add vga=771 to force vesa framebuffer start -- Mario Izquierdo (mariodebian) Wed, 8 Nov 2006 22:02:13 +0100 initramfs-tools-tcos (0.56.7) unstable; urgency=low * Don't use pathof() in hooks, call cpifexists() with abs path. If not found search with pathof() -- Mario Izquierdo (mariodebian) Sun, 29 Oct 2006 22:24:01 +0100 initramfs-tools-tcos (0.56.6) unstable; urgency=low * Add tcos metapackage. -- Mario Izquierdo (mariodebian) Fri, 13 Oct 2006 12:09:31 +0200 initramfs-tools-tcos (0.56.5) unstable; urgency=low * Fix more minor things in pulseaudio hook-addon -- Mario Izquierdo (mariodebian) Fri, 13 Oct 2006 00:05:44 +0200 initramfs-tools-tcos (0.56.4) unstable; urgency=low * Possibly ubuntu dapper now work. * Support for dhcp3-client (configure network with ifconfig and route) -- Mario Izquierdo (mariodebian) Sun, 8 Oct 2006 20:30:53 +0200 initramfs-tools-tcos (0.56.3) unstable; urgency=low * Provide manual_add_modules (ubuntu dapper initramfs-tools is very old) -- Mario Izquierdo (mariodebian) Sun, 8 Oct 2006 11:12:49 +0200 initramfs-tools-tcos (0.56.2) unstable; urgency=low * Error in conf/tcos-run-functions while need do not then :$ -- Mario Izquierdo (mariodebian) Sat, 7 Oct 2006 15:52:34 +0200 initramfs-tools-tcos (0.56.1) unstable; urgency=low * New stable release. -- Mario Izquierdo (mariodebian) Fri, 6 Oct 2006 09:37:40 +0200 initramfs-tools-tcos (0.55.3) unstable; urgency=low * Add tcos-discover2 package (all discover2 files into /usr/lib/tcos/discover) -- Mario Izquierdo (mariodebian) Mon, 2 Oct 2006 18:27:56 +0200 initramfs-tools-tcos (0.55.2) unstable; urgency=low * Ubuntu part2, use /bin/busybox (not static) but with more utils * New scripts/tcos-top/01busybox that make symlinks of utils with new busybox -- Mario Izquierdo (mariodebian) Fri, 29 Sep 2006 12:45:05 +0200 initramfs-tools-tcos (0.55.1) unstable; urgency=low * Try to work with ubuntu, part1. More work needed.... -- Mario Izquierdo (mariodebian) Fri, 29 Sep 2006 11:18:01 +0200 initramfs-tools-tcos (0.54.9) unstable; urgency=low * Use /usr/lib/tcos to put scripts and bins ==> $TCOS_BINS * Add install-system.sh script with cfdisk and debootstrap This install a debian/ubuntu distro in thin client. -- Mario Izquierdo (mariodebian) Thu, 28 Sep 2006 11:16:47 +0200 initramfs-tools-tcos (0.54.8) unstable; urgency=low * Minor bugs in some scripts (pulseaudio, alsa...) * Add support for ISA sound cards (TCOS_SOUND_ISA new var in tcos.conf) * Use mcookie to create xauth cookies and start Xorg with -auth /root/.Xauthority * Fix /etc/hosts creation, hostname is ip not 127.0.0.1 * Disable creation of /etc/X0.hosts, Xorg auth is with cookies -- Mario Izquierdo (mariodebian) Sun, 24 Sep 2006 22:44:51 +0200 initramfs-tools-tcos (0.54.7) unstable; urgency=low * Work in bin/configurexorg, now autodetects xdriver with discover, can detect more things... * Add new var TCOS_XORG_ALLDRIVERS to copy all X drivers into image (usr.squashfs) * Remove "-ac" flag to Xorg startup, now access is disabled to all except localhost or 127.0.0.1. To allow more host to connect edit tcos.conf and add them to TCOS_XORG_XHOSTS separeted with spaces. Need localhost for lockscreen and scrot commands. During boot new file will be created /etc/X0.hosts listing allowed hosts (man Xserver) * Add TCOS_XORG_OPTS var to allow put some Xorg params from conf file. * ltspfsd now works with auth (remove -a param) * configurexorg seems to work fine with new auto setup ==> tcospersonalize * Add more sleep time to pax11publish -- Mario Izquierdo (mariodebian) Fri, 22 Sep 2006 13:54:43 +0200 initramfs-tools-tcos (0.54.6) unstable; urgency=low * Copy /lib/terminfo/x/xterm (needed if use ssh + iftop) * Fix build of floppy boot images (gentcos -nbi) * Add mkfs in debug hook-addon (to format disks or floppies) * Copy some udev files from /lib/udev (write_net_rules crash startup eth0=>eth2) * Make autofs support optional * Fix some alsa startup scripts * Fix TCOS_EXTRA_MODULES, now works like a charm... * Add more modules to conf/tcos-modules.conf (intel audio, realtek...) -- Mario Izquierdo (mariodebian) Wed, 20 Sep 2006 22:04:41 +0200 initramfs-tools-tcos (0.54.5) unstable; urgency=low * Fix minor bug in detection of sound devices (scripts/tcos-bottom/40initsound) -- Mario Izquierdo (mariodebian) Wed, 13 Sep 2006 19:56:01 +0200 initramfs-tools-tcos (0.54.4) unstable; urgency=low * Add some options to NFS mount -- Mario Izquierdo (mariodebian) Mon, 11 Sep 2006 21:56:38 +0200 initramfs-tools-tcos (0.54.3) unstable; urgency=low * Add hex2ascii to nfs build. -- Mario Izquierdo (mariodebian) Mon, 11 Sep 2006 21:53:33 +0200 initramfs-tools-tcos (0.54.2) unstable; urgency=low * Forgot file hooks-addons/clean_nfs_image FIXED !!! * Disable some debug messages -- Mario Izquierdo (mariodebian) Sun, 10 Sep 2006 13:09:19 +0200 initramfs-tools-tcos (0.54.1) unstable; urgency=low * Make powerfull NFS support (TCOS boot in 28 Mb RAM!!!) * Make work change passwd (need /etc/login.defs and no locks) * Reorganize scripts/tcos-bottom (it's used by normal and nfs tcos) * Make a /tftpboot/tcos/pxeslinux.cfg/default with more examples * A lot of bin/gentcos work: - gentcos -tftp (no changes) - gentcos -nfs (generate a small initramfs and mount a remmote NFS) - gentcos -rootfs (generate NFS dir /opt/tcos/fs-${TCOS_KERNEL} ) ( need this line in /etc/exports, and a nfs server: ) /opt/tcos 192.168.0.0/255.255.255.0(ro,no_root_squash,sync,no_subtree_check) * Better way to generate nfs image and filesystem is: # gentcos -nfs -rootfs * Fix PulseAudio startup params, and start silently log > /var/log/pulseaudio.log * Update gentcos man page * Change editing initramfs.conf in gentcos for exporting some env vars (need sync with TcosConfig) -- Mario Izquierdo (mariodebian) Sun, 10 Sep 2006 10:02:58 +0200 initramfs-tools-tcos (0.53.pre6) unstable; urgency=low * Fix some paths. * Detect sound device as /dev/dsp or /dev/snd -- Mario Izquierdo (mariodebian) Thu, 7 Sep 2006 10:38:18 +0200 initramfs-tools-tcos (0.53.pre5) unstable; urgency=low * Fix convert_files2links() function in conf/tcos-generation-functions.sh - If app isn't in path can't copy, use readlink instead of pathof * Use initramfs-${SUFFIX}-${KERNEL_VERSION}, for support multiple kernel * Change pxelinux.cfg/default to initramfs-2.6.16-1-486 * Add all build vars in /etc/tcos/tcos.conf * Fix bin/gentcos to use /etc/tcos/tcos.conf new vars * Use hex2ascii tcosmonitor hack to retrieve hostname in a string in dhcp dinamic servers -- Mario Izquierdo (mariodebian) Tue, 5 Sep 2006 23:11:41 +0200 initramfs-tools-tcos (0.53.pre4) unstable; urgency=low * Upload last changes to svn -- Mario Izquierdo (mariodebian) Sun, 3 Sep 2006 20:20:55 +0200 initramfs-tools-tcos (0.53.pre3) unstable; urgency=low * Change /etc/tcos for /usr/share/initramfs-tools-tcos/ for hooks and scripts * Start NFS support and complety rootfs -- Mario Izquierdo (mariodebian) Fri, 1 Sep 2006 19:52:03 +0200 initramfs-tools-tcos (0.53.pre2) unstable; urgency=low * Initial PulseAudio support, new var TCOS_PULSEAUDIO * Delete obsolete TCOS_XMLRPC username and pass. -- Mario Izquierdo (mariodebian) Thu, 24 Aug 2006 19:45:16 +0200 initramfs-tools-tcos (0.52) unstable; urgency=low * Add destripar_initramfs.sh script (mount initramfs and chroot into it) . * Fix /lib/lsb dir creation (hooks/tcosbin) * Delete in postinst: /etc/tcos/scripts/tcos-bottom/40freespace * Fix some scripts/tcos-bottom/10initsound * Move mount_unionfs into conf/tcos-run-functions * Add check_module before manual_add_modules because some files not copied - see debian bug: #384043 * Rename allmodules.squashfs to allmodules-$(uname -r).squashfs * Add some remove stuff in postinst, to clean /etc/tcos dir * Add force_add_module #384043, and remove check_module -- Mario Izquierdo (mariodebian) Mon, 21 Aug 2006 22:06:14 +0200 initramfs-tools-tcos (0.51) unstable; urgency=low * Remove some FIXME code * usplash-tcos.so is in svn repos while there is a easy way to compile it (based on debian-edu) * Remove some extra functions in tcos-*-functions -- Mario Izquierdo (mariodebian) Wed, 16 Aug 2006 16:14:44 +0200 initramfs-tools-tcos (0.50) unstable; urgency=low * Add usplash artwork (tcos-usplash) usplash is now in debian unstable. -- Mario Izquierdo (mariodebian) Mon, 7 Aug 2006 15:50:19 +0200 initramfs-tools-tcos (0.49) unstable; urgency=low * New stable release * conf/tcos-functions is deprecated, split in two files: - tcos-run-functions used in thin client - tcos-generation-functions used by gentcos * Disable fstab generation if uselocal is not set * Do some actions in background & (better timming 15 seconds with usr.squashfs download) * Resync with TcosMonitor 0.0.10.b3 -- Mario Izquierdo (mariodebian) Sat, 15 Jul 2006 22:29:09 +0200 initramfs-tools-tcos (0.48.b4) unstable; urgency=low * Launch session in background ( & ) * Disable tcos-bootom/25freespace * Delete old stuff (20ltspfs) -- Mario Izquierdo (mariodebian) Mon, 10 Jul 2006 12:51:45 +0200 initramfs-tools-tcos (0.48.b3) unstable; urgency=low * Minor changes in bin/configurexorg -- Mario Izquierdo (mariodebian) Mon, 10 Jul 2006 11:17:53 +0200 initramfs-tools-tcos (0.48.b2) unstable; urgency=low * Minor changes in bin/configurexorg -- Mario Izquierdo (mariodebian) Fri, 7 Jul 2006 16:54:32 +0200 initramfs-tools-tcos (0.48.b1) unstable; urgency=low * New release * Add configurexorg wrapper and xorg.conf.tpl * Add restartxorg script (exec from TcosMonitor) * Disable freespace (need some work) * Change dependencies >= 0.48 * Now depends in dropbear (not recomended) -- Mario Izquierdo (mariodebian) Tue, 4 Jul 2006 11:48:11 +0200 initramfs-tools-tcos (0.47.b6) unstable; urgency=low * Delete depends of non avalaible unionfs and sqaushfs modules * Add TCOS_XMLRPC_USER and TCOS_XMLRPC_PASS to conf/tcos.conf file * Add background sshx start (close terminal after startx) -- Mario Izquierdo (mariodebian) Thu, 29 Jun 2006 15:44:33 +0200 initramfs-tools-tcos (0.47-b5) unstable; urgency=low * Add -extramodules="foo,bar" argument * add hooks-addons/tcos to write into conf date and version * Add hooks-addons/hwclock to setup date by BIOS clock * Add update_progress() to any init script (usplash progress bar) -- Mario Izquierdo (mariodebian) Tue, 20 Jun 2006 17:00:08 +0200 initramfs-tools-tcos (0.47-b4) unstable; urgency=low * New subrelease. * Add IP.conf support (put a file in /tftpboot/tcos/conf/ like 192.168.0.25.conf and vars will overwrite tcos.conf) * Add X resolution and depth support, cmdline vars: res=800x600 depth=16 * Disable mouse wheel from cmdline => disablewheel -- Mario Izquierdo (mariodebian) Wed, 7 Jun 2006 20:09:29 +0200 initramfs-tools-tcos (0.47-b3) unstable; urgency=low * New subrelease. * Add new startx methods (F=freenx S=ssh -X) -- Mario Izquierdo (mariodebian) Wed, 7 Jun 2006 19:47:56 +0200 initramfs-tools-tcos (0.47-b2) unstable; urgency=low * Add tinylogin dependency debian/control. * Update initramfs-tools-tcos version dependencies. * Fix tcos-shfs[u]mount scripts (is_remote and is_mounted don't work clean) -- Mario Izquierdo (mariodebian) Wed, 7 Jun 2006 10:48:35 +0200 initramfs-tools-tcos (0.47-b1) unstable; urgency=low * Add TCOS_ADMIN_USER entry (ssh key and italc key) * Add TCOS_REMOTEFS selector (shfs, ltspfs, none) * Remove TCOS_BIG_BUSYBOX (reboot and poweroff now works!!!) * Add TCOS_SHOW_NEEDED_MODULES (show loaded and discover detected modules) * Add showmodules cmdline to show loaded, discover and not found modules info. * Add tcos-server-utils package: - tcos-shfsmount (mount shfs in terminal) - tcos-shfsumount (umount shfs) * Add manpages of tcos-shfs[u]mount.1 * Update gentcos manpage * Add tinylogin utils to create users and groups with busybox. -- Mario Izquierdo (mariodebian) Tue, 30 May 2006 22:35:59 +0200 initramfs-tools-tcos (0.47) unstable; urgency=low * Bad news, TCOS not accepted in SoC :( * Change all dirs to not intercept with initramfs-tools => all code is in /etc/tcos * Split tcosbin hooks file into some package-unit files, ex: xorg, discover, sound, autofs... * Update gentcos scripts and gentcos manpage * Update help.msg (pxelinux help screen) * Fix dropbear SSH server startup failure /dev/random => /dev/urandom * Clean ping before startx (resolved with /dev/urandom) * Start Xorg once time (keyboard seems to work correctly) * Add iTALC support, start ivs and daemonize it * Enable remote reboot and poweroff (copy reboot & poweroff in /usr/sbin, outside of squashfs) * Add reboot and poweroff wrapper scripts (kill X, kill process, umount squash, umount all, reboot/poweroff) * Delete/clean ACPI and RAID stuff (add new var TCOS_DISABLE_ACPI) -215 Kb !!! * Add X11VNC support (not only iTALC) * Join code to mount a ext3/vfat part in 15uselocal and use from swapon or sqmount * Add break points with every startup script: - network, fstab, uselocal, swapon, sqmount, ldconfig, autofs, inittcos, initsound, ltspfs, startx * NOT use package revision numbers, initramfs-tools-tcos is debian based !!!! * Mount /dev/shm as tmpfs in 50ldconfig -- Mario Izquierdo (mariodebian) Thu, 25 May 2006 11:48:27 +0200 initramfs-tools-tcos (0.46-3) unstable; urgency=low * Updates README file ( debug a kernel panic ) * Delete scripts/tcos-premount/40unionfs and put code in 30sqmount * More easy script scripts/tcos-premount/30sqmount * add allmodules.squashfs ( all kernel modules to debuging ) * add _log() function ( write into /tmp/initramfs.debug ) * add reboot and poweroff scripts ( reboot -f / poweroff -f ) -- Mario Izquierdo (mariodebian) Wed, 17 May 2006 16:24:02 +0200 initramfs-tools-tcos (0.46-2) unstable; urgency=low * Add info about missing packages * Add TCOS_DISABLE_ACPI to delete acpi and raid stuff * Complete gentcos script support to be more flexible from TcosConfig * Add some debconf scripts and templates -- Mario Izquierdo (mariodebian) Sun, 14 May 2006 14:12:34 +0200 initramfs-tools-tcos (0.46-1) unstable; urgency=low * Add support of embedded web browser (dillo 25Mb or links2 6 Mb) * Reorganize hooks/tcosbin scripts * Add some functions to conf/tcos-functions to copy files and dirs * Add resolv.conf file generated from server resolv.conf ( browser need it ) * Add HACKING info. * Add Etherboot support ( NBI images ) -- Mario Izquierdo (mariodebian) Thu, 11 May 2006 12:05:31 +0200 initramfs-tools-tcos (0.46) unstable; urgency=low * Initial version of tcos own package. * Rename pxes to TCOS support (Thin Client Operating System) * Add swap file mount and generation system * Mount /usr in read-write mode unionfs and 2 Mb of ram filesystem. * Add ltspfs daemon and autofs to read devices from user session. * Remove samba support. * Split TCOS to his own package. * Add /tftboot/tcos dir to all needed into it. * Create symbolic link to /boot/vmlinuz-xxxxx into /tftpboot/tcos * Add /etc/tcos dir to not touch /etc/mkinitramfs files * Add /etc/tcos/tcos-functions with common shell script functions * Create symbolic link to /usr/lib/syslinux/pxelinux.0 into /tftpboot/tcos * Add support of ssh server (dropbear ssh don't need PAM) * Copy ssh rsa public keys to .ssh root home in initramfs (no pass needed) * Add support of Xorg 7.0 or 6.9 (debian testing unstable generation build systems) * Move vars to /etc/tcos/tcos.conf (only vars) * Use debian kernel 2.6.16-1-486 (can use any > 2.6.12) -- Mario Izquierdo (mariodebian) Sun, 7 May 2006 18:43:07 +0200 tcos-0.89.93ubuntu2/debian/tcos-core.postinst0000664000000000000000000000247112260610261016016 0ustar #!/bin/sh set -e # add tcos group if not exists if ! getent group tcos >/dev/null; then addgroup --quiet --system tcos || true fi if [ -d /etc/tcos/ssl ]; then chmod -f 640 /etc/tcos/ssl/* 2>/dev/null chown -f root:tcos /etc/tcos/ssl/* 2>/dev/null fi if [ -e /usr/lib/tcos/tnc ];then if [ -d /var/lib/tcos/tftp ]; then # TCOS server, set SUID in tcos-net-controller (iptables wrapper) chown -f root:tcos /usr/lib/tcos/tnc chmod -f 4750 /usr/lib/tcos/tnc else # TCOS standalone, set tnc rights for standalone hosts chown -f root:root /usr/lib/tcos/tnc chmod -f 0700 /usr/lib/tcos/tnc fi fi if ! getent group tcosmonitor-exclude >/dev/null; then addgroup --quiet --system tcosmonitor-exclude || true fi # Rename 82export_pulseaudio => 80export_pulseaudio # need to remove old file if [ -f /etc/X11/Xsession.d/82export_pulseaudio ]; then echo " * Remove obsolete file /etc/X11/Xsession.d/82export_pulseaudio" rm -f /etc/X11/Xsession.d/82export_pulseaudio fi # tcosmonitor dbus case "$1" in configure|reconfigure) if [ -x "/etc/init.d/dbus" ]; then if [ -x "`which invoke-rc.d 2>/dev/null`" ]; then invoke-rc.d dbus reload || true else /etc/init.d/dbus reload || true fi fi ;; esac #DEBHELPER# tcos-0.89.93ubuntu2/debian/compat0000664000000000000000000000000212260610261013505 0ustar 7 tcos-0.89.93ubuntu2/debian/initramfs-tools-tcos.links0000664000000000000000000000026712260610261017456 0ustar /usr/lib/syslinux/menu.c32 /var/lib/tcos/tftp/menu.c32 /usr/lib/syslinux/pxelinux.0 /var/lib/tcos/tftp/pxelinux.0 /usr/lib/syslinux/vesamenu.c32 /var/lib/tcos/tftp/vesamenu.c32 tcos-0.89.93ubuntu2/debian/rules0000775000000000000000000000030512260610261013365 0ustar #!/usr/bin/make -f export DEB_BUILD_MAINT_OPTIONS = hardening=+all DPKG_EXPORT_BUILDFLAGS = 1 include /usr/share/dpkg/buildflags.mk CFLAGS+=$(CPPFLAGS) %: dh $@ --with python2 test: make test tcos-0.89.93ubuntu2/debian/tcos-standalone.postrm0000664000000000000000000000024012260610261016647 0ustar #!/bin/sh set -e # on purge delete tcos-standalone daemon case "$1" in purge|remove) rm -rf /var/lib/tcos/standalone/* ;; esac #DEBHELPER# tcos-0.89.93ubuntu2/debian/control0000664000000000000000000001006012313341046013710 0ustar Source: tcos Section: net Priority: extra Maintainer: Ubuntu Developers XSBC-Original-Maintainer: Mario Izquierdo (mariodebian) Build-Depends: debhelper (>= 7.0.50~), python (>= 2.6.6-3~), libxmlrpc-core-c3-dev, libxau-dev, libxaw7-dev, libimlib2-dev, pkg-config, libasound2-dev, libglib2.0-dev Standards-Version: 3.9.4 Vcs-Git: http://tcosproject.org/git/tcos.git Vcs-Browser: http://tcosproject.org/cgit/tcos.git/ Homepage: http://www.tcosproject.org Package: initramfs-tools-tcos Architecture: all Depends: tcos-core, initramfs-tools (>= 0.40), console-setup | console-data, squashfs-tools, pciutils, ltspfsd-core, ${misc:Depends}, ${shlibs:Depends} Recommends: mbr, syslinux, mtools, acpid, pulseaudio, dropbear, fgetty, p910nd, genisoimage, mknbi, twm, binutils, alsa-base, cdparanoia, xfonts-100dpi, debootstrap Description: Tools for generating a TCOS thin client bootable image This package contains tools to create a bootable initramfs for prepackaged 2.6 Linux kernel. The initramfs is an cpio archive. At boot time, the kernel unpacks that archive into ram, mounts and uses it as initial root file system. Next thin client configure some hardware, download extra tools ( /usr compressed dir ) and connect to remote server using XMDCP, ssh -X, FreeNX, rDesktop... Package: tcos-core Architecture: any Depends: busybox (>= 1:1.13.3) | busybox-static (>= 1:1.13.3) | udhcpc, adduser, xterm, x11vnc, xtightvncviewer, dosfstools, scrot, eject, netpipes, libnotify-bin, libasound2-plugins, iproute, xdg-utils, pulseaudio-utils, python, python-utmp, python-dbus, python-ipaddr, python-ipy, ${misc:Depends}, ${shlibs:Depends} Recommends: vlc, stunnel4, openssl, ethtool Description: Common scripts and bins for generating a TCOS thin client bootable image This package contain common scripts, libs, bins and dependencies to generate network images or be used in standalone hosts. Package: tcos-standalone Architecture: all Depends: tcos-core (>= 0.88.0), tcosmonitor-common, openssl, gksu, python, python-gtk2, python-glade2, ${python:Depends}, ${misc:Depends}, ${shlibs:Depends} Recommends: ethtool Description: TCOS GUI configurator for standalone hosts This package contains a PyGTK+ gui configurator and dependencies to install and configure a standalone TCOS host. . With this package you can control installed clients from tcosmonitor. Package: tcos Architecture: all Depends: initramfs-tools-tcos (>= 0.84.5), python, python-configobj, ${misc:Depends}, ${shlibs:Depends} Recommends: tcos-configurator, dnsmasq | tcos-tftp-dhcp, tcosmonitor, tcosconfig, ltspfs, fuse, pulseaudio-esound-compat | esound Description: Base package for install a TCOS (Thin client) server This is a system for generating thin client hosts using initramfs. TCOS is a set of build tools to prepare an initramfs image to boot thin client terminals. TCOS support dhcp, sound (alsa & esound | pulseaudio ), ltspfs, Xorg and more utils. . This package install and recommends all required packages to make a TCOS thin client server. Package: tcos-tftp-dhcp Architecture: all Depends: atftpd, isc-dhcp-server | dhcp-server, ${misc:Depends} Description: Metapackage to install TCOS with atftp and DHCP server This metapackage depends on atftp and a DHCP server to provide needed daemons needed to run a TCOS server. tcos-0.89.93ubuntu2/debian/tcos-standalone.install0000664000000000000000000000027412260610261017000 0ustar var/lib/tcos/standalone/* usr/share/locale/* usr/sbin/tcos-standalone usr/share/tcos-standalone/* usr/share/applications/tcos-standalone.desktop etc/avahi/services/tcos-standalone.service tcos-0.89.93ubuntu2/debian/tcos-standalone.default0000664000000000000000000000062212260610261016753 0ustar # # put 1 to start tcosxmlrpc-standalone # # before starting standalone mode please read # /usr/share/doc/tcosmonitor/README.standalone TCOS_STANDALONE_START=1 # set to 1 to enable very verbose log # /var/lib/tcos/standalone/log/tcos-standalone.log TCOS_DEBUG=0 # set to 1 to enable SSL over XMLRPC # (you can make your custom SSL cert) # see /usr/share/doc/tcos-core/README.ssl TCOS_XMLRPC_SSL=0 tcos-0.89.93ubuntu2/debian/tcos.docs0000664000000000000000000000001112260610261014121 0ustar REMOTEFS tcos-0.89.93ubuntu2/debian/initramfs-tools-tcos.install0000664000000000000000000000123512260610261020000 0ustar var/lib/tcos/tftp/* usr/sbin/gentcos usr/sbin/tcos-buildchroot usr/bin/tcos-genbootchart usr/share/tcos/templates/* usr/share/tcos/xmlrpc/* usr/share/tcos/hooks/* usr/share/tcos/hooks-addons/* usr/share/tcos/scripts/* usr/share/tcos/xmlrpc/* usr/share/tcos/tcos-generation-functions.sh usr/share/tcos/tcos-run-functions.sh usr/share/tcos/tcos-modules.conf usr/share/tcos/inc usr/share/tcos/logo.xpm.gz etc/tcos/hacking/template etc/tcos/pxelinux.cfg.tpl etc/tcos/conf.d/branding.info etc/tcos/templates/branding-pxelinux.info etc/tcos/xorg.conf.tpl etc/tcos/initramfs.conf etc/tcos/tcos.conf etc/tcos/pxelinux.menu.cfg.tpl etc/tcos/hooks/tcosmain etc/tcos/pxelinux.d tcos-0.89.93ubuntu2/debian/bzr-builddeb.conf0000664000000000000000000000003112260610261015515 0ustar [BUILDDEB] native = True tcos-0.89.93ubuntu2/debian/tcos.manpages0000664000000000000000000000003112260610261014766 0ustar bin/tcos-gdm-autologin.1 tcos-0.89.93ubuntu2/debian/initramfs-tools-tcos.postrm0000664000000000000000000000077412260610261017665 0ustar #!/bin/sh set -e case "$1" in purge) if getent group tcos >/dev/null; then [ -x /usr/sbin/delgroup ] && delgroup --quiet --system tcos > /dev/null || true fi # delete all generated files and dirs rm -rf /var/lib/tcos/tftp rm -rf /var/lib/tcos/fs-* rm -rf /var/cache/tcos rm -rf /var/lib/tftpboot/tcos rmdir --ignore-fail-on-non-empty /var/lib/tftpboot || true rm -f /etc/tcos/modules rmdir --ignore-fail-on-non-empty /etc/tcos || true ;; esac #DEBHELPER# tcos-0.89.93ubuntu2/debian/tcos-standalone.init0000664000000000000000000001352612260610261016301 0ustar #! /bin/sh ### BEGIN INIT INFO # Provides: tcosxmlrpc-standalone tcos-standalone # Required-Start: $local_fs $remote_fs # Required-Stop: $local_fs $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start tcosxmlrpc standalone in installed system # Description: This file should be used to construct scripts to be # placed in /etc/init.d. ### END INIT INFO # Author: Mario Izquierdo (mariodebian) # # Do NOT "set -e" # PATH should only include /usr/* if it runs after the mountnfs.sh script PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/lib/tcos DESC="TcosXMLRPC standalone" NAME=tcosxmlrpc-standalone DAEMON=/usr/lib/tcos/$NAME DAEMON_ARGS="/var/lib/tcos/standalone/etc/abyss-standalone.conf" DAEMON_WWW="/var/lib/tcos/standalone/www" SCRIPTNAME=/etc/init.d/$NAME DEFAULT_CONF=/etc/default/tcos-standalone TCOS_STANDALONE_START=0 ETHTOOL="" [ -x /sbin/ethtool ] && ETHTOOL=/sbin/ethtool [ -x /usr/sbin/ethtool ] && ETHTOOL=/usr/sbin/ethtool # Exit if the package is not installed [ ! -e $DAEMON ] && exit 0 # Read configuration file if it is present [ -e "$DEFAULT_CONF" ] && . ${DEFAULT_CONF} # Load the VERBOSE setting and other rcS variables [ -e /lib/init/vars.sh ] && . /lib/init/vars.sh # Define LSB log_* functions. # Depend on lsb-base (>= 3.0-6) to ensure that this file is present. . /lib/lsb/init-functions # # Function that starts the daemon/service # do_start() { # don't start if start-stop-daemon is not a ELF file (installing in chroot) if ! file /sbin/start-stop-daemon |grep -q ELF ; then log_begin_msg "Fake start-stop-daemon detected, not starting " return 0 fi # start stunnel4 if [ "$TCOS_XMLRPC_SSL" = "1" ] && [ -x "$(which stunnel4)" ] ; then # fix permissions chown -R stunnel4:stunnel4 /var/lib/tcos/standalone/lib/stunnel4/ [ -e /var/lib/tcos/standalone/log/stunnel.log ] && \ chown stunnel4:stunnel4 /var/lib/tcos/standalone/log/stunnel.log # generate SSL cert [ -e /var/lib/tcos/standalone/etc/stunnel/tcos.pem ] && \ rm -f /var/lib/tcos/standalone/etc/stunnel/tcos.pem openssl req -new -x509 -nodes -days 365 \ -out /var/lib/tcos/standalone/etc/stunnel/tcos.pem \ -keyout /var/lib/tcos/standalone/etc/stunnel/tcos.pem \ -subj "/C=/ST=/L=/CN=localhost/emailAddress=root@localhost" 2>/dev/null TMP_FILE=$(mktemp /tmp/tcos.ssl.XXXXXXXX) chmod 600 /var/lib/tcos/standalone/etc/stunnel/tcos.pem dd if=/dev/urandom of=$TMP_FILE count=2 2>/dev/null openssl dhparam -rand $TMP_FILE 256 >> /var/lib/tcos/standalone/etc/stunnel/tcos.pem 2>/dev/null rm -f $TMP_FILE stunnel4 /var/lib/tcos/standalone/etc/stunnel/stunnel.conf > /dev/null 2>&1 & fi $DAEMON $DAEMON_ARGS >> /var/lib/tcos/standalone/log/tcos-standalone.log 2>&1 || return 2 } # # Function that stops the daemon/service # do_stop() { # stop stunnel4 if [ -f /var/lib/tcos/standalone/lib/stunnel4/stunnel4.pid ] ; then kill -9 $(cat /var/lib/tcos/standalone/lib/stunnel4/stunnel4.pid) 2>/dev/null rm -f /var/lib/tcos/standalone/lib/stunnel4/stunnel4.pid [ -e /var/lib/tcos/standalone/etc/stunnel/tcos.pem ] && \ rm -f /var/lib/tcos/standalone/etc/stunnel/tcos.pem # empty log file cat /dev/null > /var/lib/tcos/standalone/log/stunnel.log fi kill $(cat /var/lib/tcos/standalone/log/abyss.pid 2>/dev/null ) 2> /dev/null killall tcosxmlrpc-standalone 2>/dev/null rm -f /var/lib/tcos/standalone/log/abyss.pid # clean www data rm -f ${DAEMON_WWW}/* return 0 } # # Function that enable WakeOnLan in all network devices # do_wakeonlan() { if [ -n "${ETHTOOL}" ]; then return fi # get list of network interfaces TCOS_NET_DEVS=$(ls /sys/class/net/|grep -v -e lo -e sit0 -e wmaster -e vmnet -e vbox) # search for network interfaces with link ok status for dev in $TCOS_NET_DEVS; do # have link ??? if [ -e /sys/class/net/$dev/carrier ] && \ [ "$(cat /sys/class/net/$dev/carrier 2>/dev/null)" = 1 ] && \ [ "$(${ETHTOOL} $dev| grep -c 'Wake-on: g')" = "1" ]; then ${ETHTOOL} -s $dev wol g > /dev/null 2>&1 fi done } do_checklog_size() { # clean logs when size > 5 MB for logfile in /var/lib/tcos/standalone/log/*; do [ $(du $logfile| awk '{print $1}') -gt 5000 ] && \ cat /dev/null > $logfile done } case "$1" in start) [ "$TCOS_STANDALONE_START" = "0" ] && exit 0 log_daemon_msg "Starting $DESC" "$NAME" do_start case "$?" in 0|1) log_end_msg 0 ;; 2) log_end_msg 1 ;; esac ;; stop) log_daemon_msg "Stopping $DESC" "$NAME" # enable WAKEONLAN in ethernet devices (only needed during poweroff/reboot) do_wakeonlan do_stop do_checklog_size case "$?" in 0|1) log_end_msg 0 ;; 2) log_end_msg 1 ;; esac ;; restart|force-reload) # # If the "reload" option is implemented then remove the # 'force-reload' alias # [ "$TCOS_STANDALONE_START" = "0" ] && exit 0 log_daemon_msg "Restarting $DESC" "$NAME" do_stop case "$?" in 0|1) do_start case "$?" in 0) log_end_msg 0 ;; 1) log_end_msg 1 ;; # Old process is still running *) log_end_msg 1 ;; # Failed to start esac ;; *) # Failed to stop log_end_msg 1 ;; esac ;; status) if [ "$(pidof tcosxmlrpc-standalone | sed '/^$/d')" = "$(cat /var/lib/tcos/standalone/log/abyss.pid 2>/dev/null)" ] && \ [ "$(pidof tcosxmlrpc-standalone | sed '/^$/d')" != "" ] ; then echo "tcosxmlrpc running" else echo "tcosxmlrpc stopped" fi ;; *) echo "Usage: $SCRIPTNAME {start|stop|restart|status}" >&2 exit 3 ;; esac exit 0 tcos-0.89.93ubuntu2/debian/README.Debian0000664000000000000000000000214112260610261014346 0ustar initramfs-tools-tcos for Debian ------------------------- Online doc: http://wiki.tcosproject.org/Install/Debian (in some languages) http://wiki.tcosproject.org/Install/Configure * Postinstall process: · Configure a DHCP server: - You can install tcos-configurator package and launch it as root. - Edit /etc/dhcp3/dhcpd.conf with example files (at /usr/share/doc/initramfs-tools-tcos/examples ) - You can install dnsmasq and use example file too. · Configure hostnames and users: - Can use tcos-gdm-autologin script or tcos-configurator to create users and configure GDM ( see: man tcos-gdm-autologin ) - Can add host names (/etc/hosts) and users (adduser) in manual mode. · Generate network images: - You can use tcosconfig wizard - You can use gentcos (see man gentcos or gentcos --help) · Boot thin clients with PXE support or use an Etherboot floppy (package etherboot-tcos and exec make-tcos-floppy) -- Mario Izquierdo (mariodebian) Tue, 01 Sep 2009 19:04:01 +0200 tcos-0.89.93ubuntu2/debian/docs0000664000000000000000000000005312260610261013160 0ustar TODO README HACKING.es HACKING.en REMOTEFS tcos-0.89.93ubuntu2/debian/tcos-core.postrm0000664000000000000000000000140712260610261015455 0ustar #!/bin/sh set -e reload_dbus() { if [ -x "/etc/init.d/dbus" ]; then if [ -x "`which invoke-rc.d 2>/dev/null`" ]; then invoke-rc.d dbus reload || true else /etc/init.d/dbus reload || true fi fi } # restart dbus with new tcosmonitor.conf # on purge delete tcosmonitor.conf case "$1" in configure|reconfigure) reload_dbus ;; purge) if getent group tcosmonitor-exclude >/dev/null; then delgroup --quiet --system tcosmonitor-exclude > /dev/null || true fi if getent group tcos >/dev/null; then delgroup --quiet --system tcos > /dev/null || true fi rm -f /etc/dbus/system.d/tcosmonitor.conf reload_dbus ;; #remove) #;; esac #DEBHELPER# tcos-0.89.93ubuntu2/debian/tcos.install0000664000000000000000000000003412260610261014644 0ustar usr/sbin/tcos-gdm-autologin tcos-0.89.93ubuntu2/debian/initramfs-tools-tcos.examples0000664000000000000000000000010312260610261020141 0ustar tcos/dhcpd.conf tcos/dhcpd-without-mac.conf tcos/tcos.dnsmasq.conf tcos-0.89.93ubuntu2/get_all_tcos_vars.sh0000664000000000000000000000446612260610261015125 0ustar #!/bin/bash #/* #* get_all_tcos_vars.sh: display DEBUG table of vars in TCOS templates #* #* Copyright (C) 2006,2007,2008 mariodebian at gmail #* #* This program is free software; you can redistribute it and/or #* modify it under the terms of the GNU General Public License #* as published by the Free Software Foundation; either version 2 #* of the License, or (at your option) any later version. #* #* This program is distributed in the hope that it will be useful, #* but WITHOUT ANY WARRANTY; without even the implied warranty of #* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #* GNU General Public License for more details. #* #* You should have received a copy of the GNU General Public License #* along with this program; if not, write to the Free Software #* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #*/ ALL_VARS1=$(rgrep "\$TCOS_" * |grep -v svn |grep -v "\.py" |grep -v "debian/" | awk -F'TCOS_' '{print "TCOS_"$2}' | \ awk '{print $1}' | awk -F"=" '{print $1}' | awk -F"/" '{print $1}' | \ sed 's/)//g' | sed 's/}//g' | sed 's/"//g'| sed 's/;//g' |sort | uniq) ALL_VARS2=$(rgrep "^TCOS_" conf/ |grep -v svn | awk -F":" '{print $2}' |awk -F"=" '{print $1}' |sort | uniq) ALL_VARS=$(echo $ALL_VARS1 $ALL_VARS2 | sort | uniq) eline(){ echo "------------------------------------------------------------------------------------------------------------------" } TEMPLATES="conf/tcos.conf.all conf/tcos.conf.low conf/tcos.conf.nfs" is_in_template() { value="" for tpl in $TEMPLATES; do if [ $(grep -c "^${1}=" $tpl) != 0 ]; then tmp=$(grep "^${1}=" $tpl | awk -F"=" '{print $2}') value="$value $(basename $tpl):'$tmp'" fi done echo $value } printf "%30s |%5s| %8s| %10s| %5s| %36s|\n" "VARNAME" "base" "value" "" "needed in base" "in templates" eline number=0 for VAR in $ALL_VARS; do base=$(grep -c "^${VAR}=" conf/base.conf) basevalue=$( grep "^${VAR}=" conf/base.conf | awk -F"=" '{print $2}') tcos=$(grep -c "^${VAR}=" conf/tcos.conf) iit=$(is_in_template $VAR) if [ $base = 0 ] && [ $tcos = 0 ]; then needbase="FIXME" else needbase="" fi printf "%30s |%5s| %8s| %15s| %5s| %40s|\n" "$VAR" "$base" "$basevalue" "" "$needbase" "$iit" tnumber=$((number/5)) [ $number = $((tnumber*5)) ] && eline number=$((number+1)) done tcos-0.89.93ubuntu2/tcos/0000775000000000000000000000000012260610427012041 5ustar tcos-0.89.93ubuntu2/tcos/default.tpl0000664000000000000000000000161212260610261014202 0ustar default tcos prompt 1 timeout 200 display __TFTP_MSG__ F0 __TFTP_MSG__ F1 __TFTP_MSG_HELP1__ F2 __TFTP_MSG_HELP2__ label tcos kernel vmlinuz-__TCOS_KERNEL__ append ramdisk_size=65536 initrd=initramfs-__TCOS_KERNEL__ root=/dev/ram0 boot=tcos quiet label install kernel vmlinuz-__TCOS_KERNEL__ append ramdisk_size=65536 initrd=initramfs-__TCOS_KERNEL__ root=/dev/ram0 boot=tcos quiet startx=N installer label update kernel vmlinuz-__TCOS_KERNEL__ append ramdisk_size=65536 initrd=initramfs-__TCOS_KERNEL__ root=/dev/ram0 boot=tcos quiet startx=N installer-update label nfs kernel vmlinuz-__TCOS_KERNEL__ append ramdisk_size=32768 initrd=initramfs-__TCOS_KERNEL__-nfs root=/dev/ram0 boot=tcos quiet # other examples #label tcos-low # kernel vmlinuz-__TCOS_KERNEL__ # append ramdisk_size=65536 initrd=initramfs-__TCOS_KERNEL__ root=/dev/ram0 boot=tcos quiet noautofs noltspfs nosound # tcos-0.89.93ubuntu2/tcos/help.msg0000664000000000000000000000216712260610261013503 0ustar 00 08 TCOS Thin Client Operating System. Available command line options 02 server=foo 07 IP address of all services server (def DHCP server) 02 xserver=foo 07 IP address of XDMCP server (def DHCP server) 02 tftpserver=foo 07 IP address of TFTPD server (def DHCP server) 02 fontserver=foo 07 IP address of TFTPD server (def DHCP server) 02 nfsserver=foo 07 IP address of TFTPD server (def DHCP server) 02 rdesktop=foo 07 IP address of Windows Terminal Server (def DHCP) 02 startx=X 07 set default X session (R=remote L=local N=none W=windows F=freenx) 02 xres=800x600 07 set default X resolution (default 1024x768) 02 xdepth=16 07 set default X color depth (default 24 bits) 02 zap 07 Allow to kill X with Ctrl + Alt + Backspace (default is not allowed) 02 disablewheel 07 disable mouse wheel and 3 buttons (default enabled) 02 volume=X% 07 set master and pcm volume levels to value (0%-100%) 02 break=XXX 07 Stop at breakpoint (see README file) Press 02F207 to get more help or 08F1007 to return to main screen tcos-0.89.93ubuntu2/tcos/example.dual.server.conf0000664000000000000000000000122712260610261016572 0ustar # don't start with /bin/sh # # This example generate needed default pxelinux.cfg/XXXXXXXX # to force boot for alternate server # * 10.0.0.1 is master server 10.0.0.101 => 10.0.0.130 # * 10.0.0.2 is slave 10.0.0.131 => 10.0.0.161 # # # Place files in /etc/tcos/pxelinux.d/filename.hook #CONF=/var/lib/tcos/tftp/pxelinux.cfg/ # #IPBASE=10.0.0 # #FROM=131 #TO=161 # #for _ip in $(seq $FROM $TO); do # # IP=${IPBASE}.${_ip} # HEXIP=$(gethostip $IP| awk '{print $NF}') # cat $CONF/default | sed -e 's/quiet/quiet xserver=10.0.0.2 fontserver=10.0.0.2/g' > $CONF/$HEXIP # #done # don't return values # don't end with exit # only do the things you want tcos-0.89.93ubuntu2/tcos/tcos.msg0000664000000000000000000000017212260610261013515 0ustar logo.lss 07 Press 08F107 or 08F207 for help Options 02tcos:TCOS > 38 Mb08 [default] 02nfs:TCOS NFS < 38 Mb08 tcos-0.89.93ubuntu2/tcos/dhcpd.conf0000664000000000000000000000276712260610261014002 0ustar # Sample configuration file for ISCD dhcpd # # Don't forget to set run_dhcpd=1 in /etc/init.d/dhcpd # once you adjusted this file and copied it to /etc/dhcpd.conf. # # Another example: # http://www.gentoo.org/doc/es/ltsp.xml # default-lease-time 21600; max-lease-time 21600; option subnet-mask 255.255.255.0; option broadcast-address 192.168.0.255; option routers 192.168.0.254; option domain-name-servers 192.168.0.254; option domain-name "domain.com"; # REPLACE WITH YOUR SERVER IP (192.168.0.254 is an example) option root-path "192.168.0.254:/var/lib/tcos"; next-server 192.168.0.254; shared-network WORKSTATIONS { subnet 192.168.0.0 netmask 255.255.255.0 { } } group { use-host-decl-names on; option log-servers 192.168.0.254; next-server 192.168.0.254; host pc1 { # PXE boot hardware ethernet 00:04:75:ff:b6:aa; fixed-address 192.168.0.1; filename "/tcos/pxelinux.0"; } host pc2 { hardware ethernet 00:04:AC:AE:76:7C; fixed-address 192.168.0.2; filename "/tcos/pxelinux.0"; } host pc3 { # NBI Etherboot hardware ethernet 00:04:75:ff:b8:31; fixed-address 192.168.0.30; # nb file generated with: gentcos -nbi # (not recomended, use etherboot-installer.sh from etherboot-tcos package) # and install a etherboot boot image in HDD. filename "/tcos/linux.nb"; } } tcos-0.89.93ubuntu2/tcos/pxetcos.jpg0000664000000000000000000005525612260610261014241 0ustar JFIFYYExifMM*C  !"$"$C" M !1a2AQTq"%RSrs#$3B4Cbt&D56c5!1AQaq"2B3R ?(Q亗Q+J}gٟcWdWDL ~D逎AQ^S0ccFF>S04Qяu}LdGPЏ*<T!#BB>PɃ)TLtBOG:?P1 ?P}@LdB zLd̊SpeNbL ~Q:_WP !C*tSp@4JʆT}T?*X遣*_UʆT}T?*c&2GPʕ@LtyR~T:E‡@Lh,BQ ɁA4~@t(U?ʇ &T~@thT?*,*"~T+KQv+AeD]_Uʁi5(~TWbgFxP/FLS3D]_WʉԣKoQЭeht\?*ҥphlt\?(/E]ʗ;?FcXQJJЏBL(OOGU4AD](g?QV(P„}Eϔl(r6G+QvhhOGJt#6Fkp *pǁQVhL}J1hfh>}BJ+Y$hD^ $h%Z1S+~#bHoO@jOq"diN>Q3LTLXɀ2i H$`% 1 1&L Ldɦ2`LdL)Ldɦ:`LdŎ錙4:`#(cŒC&U 8E2i DƋ&ɀLdŌJ&4Y42fMLdN,dR,t&9*~}9Ƈ2Cřd"c"2hdJ2d0Q1&L 2I1E b!E,c 8(Țc&:c&"c&R,t&4X T2d04Q1&LtL04LQ M T˜c&R,t&:`(e"Ȧ2`%\Ѝ`B4D*A Bd.),1@F>-2\4idhB2M 0@.5Ihd Isl(nF+FPJ]b>D䍣,\r\$)eEFY6NKQ%h&Ě*ВDhV #@4Jeh/igMDpc42HtJ&2d2bQ1&əU1$鐔ALD2ILdJ&2d3&C&"c&BQ1ɦ2`%S b&2(S1C20cE1E13":c"i鎙$NjE104:x($h*}eBL<(ιD˜ D˜ JEED2`ĢcELdŎ錘24DLcQ1&ɡɓLdJ&:d3"Q 2dL)Ldɡ+2d, Ldɡ2%2idTDLLdɦ:fMLdɦ:`C:d/ DLc&EO$04hQ04+4#DjG6\4Xm ѳ$B%`@ZHk3E̛*6Hh1m $;NHZK `hvhنIbIs+%I!Idk˨PMHLIW >hOƑu?J> :2i1(LD@#c&J,`C2b & =աXВ?$(.M~&`瑶TJʛꔑ7bS֍Z%&N(ЕE(3>r 2RatG_Q|*/ )Q3/I T/ǡ,#kҲr)#d,k/l թF<(I~Fh֚LFM|`@hvb F{od/u^KO#;?թEJtڋ柈m{? R! YR5Yگ.&\(v?bF ."F{8¨?C"e>S36uůC E17Od\Ei:fp CLc&WQyVQuuFLY!*LXɐ):d,aLD@)AL LtI1(ɈɁ2IT™Zw9ڼnQӢԛ.F\6٣lRSK*4xGkJ?n?/.e196r4pHtHdC0 :c&*C$LdHdFC !Fz fPBpdPL#IrɉPR # kChXf8*04M'EQW"4A\K6iֶ6SWMr9Iǘ&0Uǜvv3R)x%ڎ,I#6x5ܽfcǑ\cq*u'l6֨`^^mW/fycڢmt:pJJu3F*劐_j;N(FK3k#qKpf~mSbY[JtE3G0Z ԟ)>& Y0f C`@H(d2B@C" AC˚ @S}pBjo+*,i/A*ϡhd\LQ(QkҌG :T\Eh:fõdЎڢjChX!E@:1)JJm8JOd 2f .|続yg!CJu?R8993d#rNnG3F:KbT7ʱy8](9OrF4rЊ$2F9TR1 Hɠ$2AHd@HĆH,@!$2AHd! AHĆH XC$2EF&<eF$2F`)QD2$:C$b$Lr).e0лAr+EeD*G&țCfZ"+|6 ylN"m5fhK`Jˆ8~mr&nfK:ez?;yfLVTKa m3j+*#5^kW¥ol3a)Q8ptXt5%NwFkVvmlYZ0E>NP &<:}`C`U4[Ix=y= ~3H[r2R/nߡ#(T"UD*%cB(:!cDDuBƄQ #(#(V4"R(6бj#(!cB(!2 )2X'N2𢘎m*#`,Q+j G E9%懈8Ť:FS$_\Ek$2E ~`TH)F$HĆHĆH R @&$V+䁊1! ) AF.C$R \‘ A ! Qe rQ[q+*5\A yѰЎ#aD\@g\F‰m55xw,q55xw,_32\?6v k}+tCga; 3oaX eeD66f 4Chvf²;L_a ʈm VTID*/WhTBʉDJƉ:=cD!FQ+&2aE &2#( )QƉ:LeB:BƄQ #$D"iXЊ!Hu!HuT"Cm V4"At.dƍwkMe +Yn$.qI#8>p~WO\HY*T_۟@ZX+*AH) KHbA YCG1!F5Ć8!C#0L^`!1! yȏRQ'e%aGcaD ‰8'Ym4MOQ|љ.LV^Cih;M$voaXm-ͅeDviml+*#ͅ,6eDv+*!ͥhYmVTID*%FQ *&2BXЛBQD*!cBmFQ+&6F4MDeD,>XЊ!HuBƉ!Q *!GQ XЊ#$>ФV4"AQ4*]Hu"6! AfTFQ+*DmDHdH)и3dIҦv6ejI?H]EO͸ǘA\(S]q~9ڟZq l\Q›5pi{G&+~)/QX R-cgp!eLE#(RcB2_# AH8 !$(8Q(hYGiGQm+`J8zF~1|љ.LVqRWiqR[aoKm-́f6f²;L[`v6eDv6viYQm-ͽeD6QҪ!Q *&2!Q+&Q)*=eDiMQ+ QD*!cDFQDej!M)4&Ф:R+ XИ #$VT"A:A 6pV4*A @4*A @T"AHtV4"C$:AH RHh\H1\H!pH)Щ`8+#0> 2D4+AX1"*; u}EzPςSHlhNL0?Y\ FT ׌xQ+.j;ebL06Å}/jko] Y8~k1|*Ѭ,·[k;:)r#;Jfm %ͥ0[iJʉm3imm+*#8+;Bʈͥ+ͥeD6viYQQ+ͥeDCvP!QGlQ DXЛCЉ!C,LChQ @4"TJ$f ʄQ.3hXи CfұRQ YP! D4"C(R0R+ l  C`)P C) >dhTh\!ƅR$VT+F$> YP1 !bXcB.(l  3D@VYQ7WVwq?'Yfd*?PmqvtRGiKm3hX-m+;Jʈ3il[LWhvfһLCD1VTKhv"[LWiJʉ3iMTKiJ3oaYQ=$WiJƉ ]VTIDeFHD]YP&`AXИôh!Q *'cDC !B>02C`8AeB`)H8 p:AHhMH|v" CT&>C@H8 ,Ep6ђR"R0Sh0D*ABdHČ"d pB.3dOjo8~j1fK:mq #oQvS";L[iBQ-m+ͥeDҔxNr [i^Bˑw\3/,WVmb莻ͧ%}[]qG-\x5{oy7oa\i{*K/y7hqpiu:n_D Gm/Z uRqS?xB5n!R)Pp:֠G94}qmw:5t[YS5kgfһYJʉm›LVTOoaJ3iYQ-ShvQ m YQ4QD;HhШH8 *i% Ƅp:AH,CmhTHhLDcB$H;YXИC*H|"hTFpT.3BRDH)pD&ƅp6YP\+!bR$pV"8 @@p6 01@HWq?čmY|w,%ѝF?}ȾiBE4fb)U8I$ף*QU9u#ȡ)M:wy,P)vvτj?[ ' |ǿqxRήcKGODY9sSotó& RZI.Kv8*~(E>,3ArM7ΜM S^,ôV]Jڴw5[/֍Օ*ySgw:ڈT6fӚ %ͥpfʉ3iLvoaYQ-m+ͬAMm!0f m YQ<"C{B>XЊ!>QhШpTOhTGH8+Ҳ0L8+*D;GH;JƉLhM$6Xи C`)P36d"AHd!pf!bp$60 01+*jmڲ'YG tgW/Q"Nur66Dlwe>#t5k֌k8 }nNj5O .q]GkQͥYҢ[LikZe :R8Gr\IXI6?͓Mc)ť.jUOh6ot)]ŒZM=յnm*ƭ)uJ%=%W]}w_k~FfҸ8oLiin|ՒϐDžqdK?#Mi3)B2MǪg8'iGi%/+Nm[yyyc6 f~]to>9UtWגcCKŕx֧64mG$T>Ɋx5MuLH84,.Sҹ]JN.kSYMirm>\QUȉi;kYՍP딘Ee9ѓqM{OkqUzD^?w_k~MH}.\WշRӬԡ,?;7xnUapɡA'}OS>˓ۋp͵]M&NG:M~xvګ+QNK[FVZ$NK e<)dX.OZzRٵ RTs[BkzC_\ӡչ~8Z\su*}8RizLO. #ᴎ=>٬Ï)IyI8j74#^ެ*Қe`)&t:n..Qpf =cWӴJ(R#oi+,O. cwVS<8%'Ghpi\jmKP b>Mד|5:Ͽ'I K&Xvft]i6vL!mkкաZc8/zj7hu: nU6vkZ^IӮErI,TO8rɆn"]&.8EZ{NF/R8_Ho9:y= pd6 ],2kL3i]qkԮ!Bx)RMg8~xZeI_ʞ^7NQɹi1IFybbb RixL5eUObZWcZHէ5/)IY|w,ŧM Lt~okIչM/ Iӣ}G܎[B3M9?未ζ8#l?v5Tjx沎wCC7 t%ϙ7u [5-,*/_!IFޖ ;{Fl(i_:^_!۸"ƕJbq',sLjsuQIm|Y*ΟK:Xr_TWuzIlr*/>CHgfEQNU'˞[/q律Oy㹑\YIr3iHG/@Nݝ<9'<(?WԷ=]zfɺ,muӹ)8ɾ[Ykm;J t$kĜg]<ڏ%_<]ZJrqoMxY'jw ;U.=Kl)^[TԊiv3~ͩ}ekoz^N4qZ\st9N%9ɯ+Icg(}Y{QR3x̨ŕzTV474_«1,~nW_p4/hp>!TK9nmJMQ{)Τ$J-~mUycyËLZ9i?Iϋ&M>8d8?&w4q,۔~::5r ZR3J9|2p)իShMކ;,g{TJNWRGq)/^Q6aW')TsuLKJ 1y䯷?)^^7Qn5K|v?-u םXnU%焎ãjZuJ95keK(RMt%z_K4XVO)vݺֹ#o;jg Ji*Wӥg֞G9j{"ɧH엝]Ҳ[}J{=ڟb--t&ܣN5:Q%,= {yW tJMH݃hnzlSn|#IkV=6pIRrxG΋ƻSէ/V}gVFuT"n';8\K{w\вn.*FJ\ma#-T JNW]|OMy!O#Ȇ> 6rj{vQ`ϒ7&W W<'Մo.eB||68CJw4/'sWnj8(QʒY|EGCQX]OpMiN g4vy_z]9vn{fbm\:MջϟMN[[]YGsV}c^nrmp~,^Nk_a\[TgRi~J: U]{:t- _ӯ/'c'w8ҥ8xit}zsFD][Kcw';=Ms3ڱQuΖTq-J-x<ߠz > 1kqާkԊj2N)I5{6sV\7Z_^&ꯗ?ܲ,xk)Epw\/?ҭ-~2)%>qW2M8Gv螒qw俺0ǩ?q3YkS9]SQ)<-ɾ_&͢鞣Pۻoq|ڥ?oJ.ӑ.麦ei iY(#zm]:ƥ8nX^[jմ뽯΃le}^iگ ZZ4jյsNi7ŦmNOnM*ktvseB.S~_׿_ g_asu8;XMRQ/E'tyhvmRԛI{/u{u#4o5xOOx6ڬҋjK_Z6,ƥ*M4۴X7}Q-o7J6+k>GnzF˶ic䤭ʓI<S/]tյN/QUjQF\mԭ.;+ysX _]m&&KM'jx:530iep[_-iiZ\jrOs,x_N/MWOu{xowѶYV5 V X:*[ȯbXYwm7lN5 Sq݅䌓c=;~ jݿ> jJ<կQvq hĪrirGj:)^SxG.qٞKNÈPi[)O ry{jp&rK6v6sz~mzӥi*9!OiZ=&rv3ٲOs5gj櫿gޥKT/x` R~Ǔ}>5 H4m0"=xtl$.hq.ݔy&|&6 []Ը))?K;mSMG 5P8sYg^j=B[O{cM&t79.!FU$Y3OcաWԥ)O1^TKKv΢Nj>"\ac9NJĚptU-UWi0 t>}6^y!W+]4{&h\}-wyU\{$j}<յKڻO4YG?'c Ǖ\Y}Qi[[T⤚jMN[j^X=L(ZQm6Zu9[eSkF2T7wj˩'86S'<O.(G^iɳ8S{9g/Gx:rNk/uuR3dӑn<a6} ipymx~Ӽ4qm̽'3…+N?=q`\88a\xa^w!B{'şPq,4QPYE2⎝]Z?**_S}9M>C87t+kzɫm, =oa{ ;@(EI|׷G<=q,\_5}9gpwj*W6hſVXiz6zh. r6;_iNհiv9'=I"Σ8/!w; ΎFz.ۧij|Vr~.G8JQOU_i}mÉcc66YGKhVipKߗ%Ü[a9Pc>&oGf9A 9{3M5]y tBM'QrNsI\/}+;"[SNME<[==$[˧u2_Y Su4Si5 eө)%Sr$?O$yΩI9QsN/Ug(&6YKu}K7. _E~o;֥QJ&{.qi+ FPj6{U l$%(_TcI]v Kn<<%p\je 7q:*\YIG?rGČiB9%Vk5XۜS}_3tsД{R;Tbɟg3k'j9$߄j:{GHu:Ovrи*"Um?\TU;^D̓4rTw[(i:=Y SvJ+Tg)|w^vVTӯ.PIA'2zsG=$tSo7k%tϢV%M{:o҄` ޕWOȟ8uKp{3 x-U|<1Y`I?invV ȭm.mzǂWRI7U^w>U7G|rk : N*w}sH}2R*Z&_y0q%Uŕ'R[TW>ްf;'tgr.*띷ݿp_ [p+{UDŽ;D*ĵMA]KdUGO30fkQi3VQ.|zioY[|mc V:8Ks᷑=4#J9Si/9>ݰ~3,&>i8,b^%v_Ѷoy; |IT%:}=k% ?mgJ[VG8:%G }֟zX9+\PV omoyeJX'V8r|/3pTɸˉ?WќQ$(S u#pdx.% WR>G<\/ƚtB>_[k:b'TƻMڧTܓSW-=aeԬܬS*_;>OM }_s?Y+toh=Ñ|ըԊyQo $vY38FK >pzm44cGdg|'gqFڗZ5qm7Jtz:Ҹq$`%+_SpNcs#k=+鑲m.r EF1~^Mite'}\SS6zVd]Odkljmcr*~9>՗Wq?FXT(U_Sy^s՗Wq?עrdk: ʼn? /_BUx[Q_s:d~m{KÕ38WTѸw,jה{Ȇ->Vitn9SnM\YΞGQ_/(JIӕ7%dYʻW#O;U]GJ(I2Y>u լ]Üs[r*MzɃzɏ:940E%88u4Zow6n rlٽTsSL}x r0jx^h&|3H:%5򟓝Y%X+׬УOWiSg/aO]5 O9$s^(/cG\ԸQRyŤͺW{smAxVw~zK.mGC>jǷF'\?Zy:u%c'ҽtQR֝+FMakH^.):~FY{ZnzpK.y 1KZmmB)a$#6]m7:H} ^jtս7tNwګ9\USxsWJZ.WDӮ#Rlc.yg &pm?Awݮ^y7E=/q<8cȏI6VQ8r=nmip=m);H W` 3iMm!xTO`6pSiJʉf ʄ8+m+*iJm3hYPLM`)ͥeB`pD HhE|TOhp> 3 0> 06*`ld. \E$D& LH`R$E@`,\ g;˫.>SK yqhPZW\sHlͲ3dyrbNOzw%V%F6QӭoF=Q՗Wq?ͼڲ'Y`b#9dnSvvqbaF -6i[+ȻMoki֋TwKP\weu::uíoFo9_˿|+wj2cJIw<]rmz4|JվgZ'TSíf3ZÆgwmdGW+[ëس]ԔSkxt|~&~Z ?gfTyk;HDe&Bqj٣7linďt{i<Ƨo&Fx8ڳ]ۖYxCяGa6>*/1xKeC+Rl4)V[p7ZMS'M;xOC`Zc?P-cD>uhq׍}zJO2syM\V?iޝگEXF=P^KGMӭ4xдpQF w{XL=bג3m~!=1 >oka?V%{mcy)%6}a?;ϭ~#Ly+6={mc ek]m%}mcyĩ%vyokS+^J3i.oka?f=a?[{XJ[`y=ĩ3{Ooka־?V#ZXL>2 okU{XJ[_k{ϭ~%OZ[oka?ท3{ϭ~&w[{XBq/%f;[{XL?ϭ~%Lx3{O_ka?V#[{XL?ϭ}~%Ly/0G2 G־??xi}kc cċ85xXy?4>?ļ!Ook4>?h0G2^Ka־??xi}kc*ekɱ0kg ?ϭ}~!Ly60f~g >1pk[{XL?m~%Ly60f ~okxXyĩ_j7 >ڭҽmџ%V?ENMStcos-0.89.93ubuntu2/tcos/help2.msg0000664000000000000000000000156112260610261013562 0ustar 00 08 TCOS Thin Client Operating System. More available command line options 02 allmodules 07 Download all kernel modules (exec gentcos -allmodules) 02 showmodules 07 Pause boot and show loaded and needed modules 02 wifi 07 Enable wireless connection (need essid) 02 essid=foo 07 Set wireless ESSID to connect to 02 nbd 07 Enable NBD squashfs 02 nbdport=xxx 07 Port to use NBS (default 2000) 02 sshuser=xxx 07 User of SSHX 02 sshhost=xxx 07 Host IP of SSHX 02 sshport=xxx 07 SSH port of SSHX 02 sshdesktop=xxx 07 ssh desktop of SSHX (startkde, gnome-session, startxfce4) 02 noswap 07 disable swap file creation (swap part is used always) 02 forcenfs 07 Use NFS (no check for memory) Press 02F107 to more help or 08F1007 to return to main screen tcos-0.89.93ubuntu2/tcos/pxetcos.png0000664000000000000000000031205212260610261014233 0ustar PNG  IHDR5sRGBbKGD pHYs B(xtIME )r^ IDATxYv$I,Yus&zX/^սAڠ @P5s2yNUd;mTT"o?^ϸW'm[v嗹˼6{6 e?6mc7etX?7|p]AY^}Njs8"qev;{ڱT˜gRYol {W-od)~.LD$"c1pnTOG=?|O }ZŞͷ5vOc{++${nwv*]&c.ߖn(J8bzy\1씰矿2M6h/K6-Bq9-MYc l8\87o*sw8Oo|܀3AAE62MIJND }2k&yl($P;ϏcOϠY#:CHdWOĖf(sם0r3}L5щ;-Y< V |6[TNw^)gt_& [Xeos@n6"3R934% =GyG~ipV6" FIwҁe}E~~?908pF'*cݎ)g5^k CX9;n#slMveԨʚPh*, `;, 8:~V7pH@pEFB/`JFxb7 ށf@ +5@!sx&<-]șuvˉ `0󠦖 1#y6R :p8cDlo˴(tҾBpNu;bVJM ]E}4aD5C™gB+A(IUڋVشqokc AŮw@@;P"$9_08 '1]4D%0rS^hbq$nrm >E*@~?v|=FIfd מS Ȅ(1 ǿ^#dh؎3@m)z#@#@N4eHI ZΙ Z=`t9@(>P#\$Wz@} D gu0΍$0fR•q  DC_.ӂ &@򙢸p<Ҁe D,3Y72!Rآ0y"lI#'@Y [sx"8#XڋQ?XENg%Z&"p[K9Hj7L&?#5n@1$6LER5r %'चn8TgG:Gx8t{p!Y8 Ƴ@dfK1)Xks ?(|ž~(zAH '`zWW00U^ n+o*8ood)XW ^ކ~pZ IB|qzOY}S#KM=gG M4$ ^ļcH`D,5wD)dKAt^e n\궤8*ƋsmeA"U gmK $J G1%Rњz#&jT< H/x#{Ɩt =Ah)}pNm슳5QArjTR0\i Fsȶ]R#~k =I9 bl8繑j8ﻂ=붔4]GN0=YpF>8agIB8)-8.ы|ePt3ث" o- "' FN5P`< |MH&*j@p)@ !Kav<i%9aLg5¢5Q#aR a*ȽȄ.a=3``+@Ϟ<jH FqFSV7Crd` !Ԩ2 pȓOlk[U)II48׾;1ȷsXą3sےP0jZ:FpFWA_fଌ^0G #i8?A< 83{K(g(JU #֠`)%1\5q`< S] &73DN^x1ygpK΄H <7Hfz t8h!`10>Mas N919ù# ̺Q38 QJhj;GA$0aK"0`uj0.|9Aa&iXK̯3@5@KG,2ߨxԱ=k$ z8?AQ0]*"=3p%=C$}gW=,?VBJq!_`;:&OC9) 3M;L0 !jv+m mqT<̪UIٟ!P_g(Cl ;Dq>I2΢SY1r,Y9mamCZվ^q; .-0iqΌ4$<'Rz[Hkl j  tusGSH$e;g >n8A R!|ozlU E].+\; \׬X/%kO޲k[a8!ZKj+g< D( %&8@ 8w**6#sp6:g9I,ZqYOP!<FN1`Ɩ p_/c KLI` Z JKI ]j3Z3U z*|,p>3X_بH 85ľ1ݷ)}gW 9Afz?T#$W;:C};9'dݚVQvzUGp>3V 1r 8:p, 5"ōs شFhd DI MiД5̞T?j6;e#ˬ;3VHgtRN'H!կ3&8g0 ù ܽ8==Fwpx[Mb;Qg03X|j9#QYexFH` abJ%UaFgxηϨ򓩌E 6B8g0! z \ &t9I튳.Ŋ~Rd$0X,?C`loeY$0MwK.u ԒFL*Ɵ!&gx0~D<̾t?b>*u6 d|jXscXIZNYn+ĢFa/|*uykh]J/'uLZ8Γ>XS[g3V;4 zu3˶(s0b@Zv0dႣҁc$9F.@a<$P՗ĩ&&&mK&8YQ.+#0R >ߠW<6+p!^YH ŖTy3X$tP(3#c,U7H7P+18 PӢ55#?Vj3Z?FI|/F?jUk$'ڗى"<*1sp`Iaf](Wg\iL{.E:3X 0df ޒ˪ﯣpr>1C$㹯Q软<$xKΓ$:3I38gps<pg >C< sbn8I{!ٔFlJUUxwɮk&gLXF KH3iz+bKS'J!H FgER0 A`=Kg&9JXAwlMŜ]qE .0ΊԘڽQûx؈rUu) Nk5ʈ`CKꖀmiY/0lHP쬞˃eN!@g3x+r2WlWpgm@gpjQ8'?&@5gMJ8_W X gcY$p1-C9=]HJu^:@0!(5v^r>0hGvqqP%U,}3832I3b3RM"'yz8/x#l7=J9 %*BQS᨞$'mJ Fq_5zoݿ!:͎=ȁ|̩u 0c5gp{l1==F;9P9r[yG ޝn ΰ)wť t根|vuimxTqðJ`@B^j_LqlҊ3Oқ Pd %w F`2( D~"0 s ęI3 sHK}r%L5Sgb I w9H`3pu;xvkh aTqB DM!g Bpp`GV0fbl Zàn8y=àjkk< ˶à=[Ѯ8*O :$"` . ^e[f~:3@br:-¨\F%қ<@::Z:z)ŗDaQ0b-™,0f*΂ N΍QXU谒e FE=gs1'D(: DIX vHL!53X3{(n_t({KٜL@,<ƽ< `Tar~5g0cZn#'pi1J9DUqΩ8@m4 9-@HƏ`1\$p{n ? IDATUy_~YW~{g(趞gQU*3&9@wM!H$oq%70wtfm!j :[YUΊ\;_zގr=Dm"Ga(\lgD5ÀgaОYvfoxO35+΃zgcSsRn#BRvTh!lgR)9VLL;'ΨcU'PWO qArwKH?< iRK/rZ> ܸl7 =#`Xas(1)wZI8L!$))lոtAPUr>QrREҜ8QqE |]%q rBarݴl=hM8]#Ν!=ňy#zwzӘ|Ff˶qd@F`D,Uf` ǰcUkR nkfG5.+-rb>樞 >ϓ5f93$ 6:GT3I+>i`k[Y$i{ 5W]ke̽" jVH`xAH`53xiJ$/JqvFiwV8@"aPg<*+O3xT< )rBùS`Y D7%EE:1 0$pb1Rv4!Ef&`-qfy A91SL!"Muj:I>2<zg-*W,tG <2 Sof{L&@ D2KB[A!%7[e^ƺ-Ա:1s56h)yF(8FپSkì;*F*TslA=Sqv( u=#0p/8˘xLgp7%rG&@f#$넪0vPKK@ 8g3Xu1CE#x' *4tϞ ~ FU1)7b@38A-0cp# 'O FqN"p:yACJV\CZدts.#CQrϙ9ޛ9B8MK% o g= /}wBgbsdLǪ:#'|vCq$^1m,I$+΍ļ!;,kL4@xHh[%pBB @~Iܬ J@6@?DYwk^^q`xgpDVb`T:' g0sgY趟C*fjػ*"%6n(kw43@ UsE >d%K ^gAܦ1އ[/!e%pBU̞bO Dg@>%᨞8G1^;@8:~{p>"S8M=&f (J`v+1L-1Zdy =`]Nyl&e:=#2i S"W383XЌsxLgI&G|38 cj< Xku/B'%!se;n!0hΛ%߭ 8+ (r3ztA=c$]/PBP%!)0q8Ŝ!;@#$pGT:pÐH!$] Rkx3g9}%, ${&1t_!׬<_FM@UcLItgLgpfx/ |x.&Ҹ`|H}S!E=[q.=3V`@މè / I< ֍ ={ :S`9g04M ٦Y2Km0 y %')6rU.JzcwTB'![gpfؒ#8'eu t<\:38gpR7Q' ^{&@=mr-f d&BK4F ƞ3NwqD!93' -g$cz.f(|BHmwo*t@rbʚЎqr"$cDȲxzXJ`0̌H՟ 3x6ؒVU %p[sؒ,-Ŧy|^%&A9 Y4o1.e+ wښ,bcðz "h,Ii[{ȁ٫gg{x̟3y& #"8w-u!&!;zՙ8K3Z$fīX*k9MCI`3Ap)`l%\u6Dvߟh:= 2e^_¹gnc/r1翜EHy 8HrH 0 ,v"$pe@4J<捐@$CIiD0k+Afl J3h*pNtv zG7#z㜘N1g0sU4qS58=SmE*g(uY*ΌvǼ0΍E'@QgjbDßX=)21L3Rq >kSt񨊇\MEfc.ڳx  !_kvoq\ǘB$tZ{O֞j2{2菊A#zGw(Ν 8'6bjQ%!; 8Α06R``cyLڬ1SW:|P< s0fY0>aEx_|jn< y3l $PYMP%pr@¨x\<'4zgVO j/sRcQj92 QmIu׫>БvOa,g0JcRJ x  qzB@&20e*6Y!- 'G sRn8 +lpnLAe9%3 ^.?0 @UGelYD$2e!J1"8t#8'9'kLIDSƾ3+a8wrp ٜ+82gyf:Ձ O,HI`cUkɆ!g=zErG3X+4[F0 &#/3h.@N0`dA6Ր¹3X(Mfѳ7EϢt;g# nW, R8N$\uBĭ_< 3 $ NOe\_sP`P:3q 2+#zw zϨ g8L!`ȀƯ#RY9#S%DFsZĜ03 ~NzK?em @c )ezE_gp*Ι䤕Lg0d(gyF) SEMg3r1Y.f9Ay^,PfɆja-1ekM!ہ6X~`^܅H JN)cU(m zM) :K$pBb=m"2[jD&Y{}?0P9iڈڊ rwIF1eH'D$Жڈj+]ZRq^kz nuOUd} 9RsRcW,w(gp g%La28oC` g`cntG.{N. 50M\Q:Xh 3tDSI`3X=L!hygxY( * uLxD{Rg0c9C8BqccyJW9%1sWN.$XvDmF& f~`uszI~+7AH@ `W:ߩeFA̞Y =㜸2 a.{mPX#[Ps{WF`; lQDek m RκԬ$uxO% ( D&{VS ֟gyQ00zنps9O$}%'@I}-N$wW6jJ,^¸Ews|97DH Ss f aNfvLRbX3!'vD>ଘSAb£\3RsJ$#gVR'AHRxc Lp63"1Ţ$<*uaRq9˶gg9GNΝS#{=yn;$T3Rs pj$KUR t8 zKb>fZyI{V D9XdL8=z9#?p* qDAcў#a20Ά0) -H IDAT~~Rgcc+ΝH`3t gpgp%ں&ng0 u] ޞpf< ^P0QI$0gpd3x3XY=3X< IaR0 gc%97e84B[9:i͚H'ZY0ˀŖ?8g:߿yU ֽatl7Y^88J< Dgp | R,m!VMԮF2h޿`bFN#mVf^j`YkzL𨺐8m=Ke8F$u Z~Od"'mHa*3cK5aߝZI^䅅:S2dMr$#z[afa0pvph3'>0ߌxrMyV<4TtR%vJ(<1fyS@8Czf^A87f8w+F'iIEbKz5$DI`O*'lGc8qƞ]q4yIa?>׾뤉a$#duW@rҳ+X%^^"ǟ lUEaA5^^n8#B$O{pΛ x}%>8?SJG]u6A{p6ǖ^]q=Sq[3 &!益P+΁k3]9I8 [B:[aj2H"=H/3oIg(ӍԿ+t]2OSc\"x@?ܽz/xs eS <0f``y80Ω>r}礕 B8WH,{ĭ4xr{ȗDY[6YBNHAH rMz F6$&x38犋(69)\{yU7e2 r[BN5㜥Y$PɄcNDgpb/`38Dꈞb< A==hs#z f 3"r>vVo1Us4{ @ˣ%z-7'yƮ8׈ib<̺8h-$"E [g  D&eY*'\ږ4;p3 ~=+ߕdhA[uնże V8.#E jgǸ;B"5Z4Ke _XmD":aPj3'<*+O3xT 9iƹ: z =;E_=C`%g.b皙CpN#9r1ǪEiD #Evq(??"8mu0xHTh |P`bA8yg;8DsQI4Еf^q8)8=!["-ҩFcK(NE1HAqn&@z8{o%ӱ=!ŦFpWe-sbn#¹c< s8 !r0:ߋgߌ~ߚlMʌF3( P 5p >`gW<}KbK2 Xs0~3@ D Ȝ#gp"rDgp*'w_kԌvփcD z g9g!)E~GQgpf`Ac59kj`d Y$0t( 3<9V#8v#3~\KX,m,o$׷ aH o.iV`11۩g-û3v38D#$38'ug n$=6;:g/iwV&vsGgpgPw$A'C΂H4)ލs dV08]IDa.$ E 2|FgpZgLmut#sRa|/3U,~CDx8ؘ,l]@ZN%'{R0b[0zيK[;;:K<(]\x%̞YygyI`!7 U{8gs 4 Hybˬ3X{ ;Ƈpy$0scy9i,>-i@ #;DU)@7_9':UT 66Kp{ .àl䏙PZ08gE\^8cļ[lIȺܩ<+΃&@{6AjG?Y@fL UPƖ,R[8)kb^5@L8؇:zq}9k;Ɩ$_nHSH.vA:p[ Ed8qbF]{.l+eA^lm{[8ˬS:2#`t:H}4h U{-bls+p3b TdZ!n0SI,'3X<# cz6N`9O>scN t*jp"ϊ lgp X&.-j !ְc Ӎf. d n9 &NĠG $O[=e:=8>FANb1$LØ`80869|m8rr#Y$<` R0-eU.b3hW2a=O77eB JUѲ <30#0l8$Y0gs׎1R384@{lIIög0JNV̩aDҏ7, s/C9f!`{<>3U~G# (l=cK8?36$=z_mXIL}ϲ I>03 _V `qM f6iP#0Ff+!c<=#/,I,G)qBù)$gc`bKB87@8V& 6WP9(8;ab5i1lv^1׿Hu?*)2QӺ7f0Fp֗wK-YV?ԝ' ʞ8:_x'<*H&ƖDpnPk;' REa&( DI4L NgT E!.˞Ph(T@|Өβ)INx0>Z3ȋ?氞=gsVg0s:"`4 !3cZ+{?B3(IB<ۆqcPVSDp'XI.ϩ1a!g0#JQ%!6'm38($g09j`–s/g0&1es:+^PRƯKgq ұcIh^yFc8vHq4d~ l[UClI=qFUü=Q ַu {k/ lp;j$l*]Tӈ֗a$03x3\5yIYQ|3g%QpLSH 4L; l'>шN2sQ\]D%T\F*1fuL_g門#̞YYn##z8GDyT.8frDyF38SS`3:b^5 -, Њ :b@دD'PQ+0Z Ἣ3tg0f *T~3Tp=Sq1=3Up}??%gun8's{|1{ i{'myR '.&yA4`dcxq#V ⬜) 5A%I1F΂3zY8gx8?AQ0h`ϽQF'@aОg$p2sgNNDPNWZa<JS0G9aN QQ*Q=:~h= 玱%8)1++dL38aZn T ܪ:6P"+H՞9(䤵9=8[$ T$gp`{ڈxLj*ΆbEN2=_#zH4%Tpj~( FUrr qVꤢt>ڳ3x}~V]"WU1sV .~ c5m֚[O rG~9g0-!8g(1"$zor8C!xMBw#8$'b*h^:Bcژ+cc"0Ozq~ ɳgxbENn0^$^p>(%qጨhyQ $!=[I`Y3 E$P%5AIͶށ'T-Az&29-%u0JN8 y3fapg0 n8NZ5am!3 =н ( \RgYWTa@ј ʎ g0xNRqI^N!֠"$0zr$Ή=k8b/ 3Vpq03xD`ɔ󽧰,O醳k!E_gpQQ Ĺ9J (wGlf`=a`,8gc: ŖϓixHb?3XS x ,) .,Y:'t H 6'+UTG읱+y4+#a`c MJ%ZINHA== +<_xLgp&1Jglgb|Cf FX:})g4-/00jyo.[#6Gϳ1D ܪ*L=n\%t"$K=$¹3i{ŖxNXs0~3 @IùS>=Lg:X5 G?38ggpWb381fm#;Ğ[@c CuSÔ"~wRENt?*&#z3K <_ׄCq6H)(xdcf|dY ՞̶){ 8-"!=q)QxH< 7Q?{`tAI7; 1<NlC8E $3&Xx~/3`|0Νz8'oW Sydr!8_b(=8[1Q DHf A;`@ڒ]H[83$g0뜾 "V^{[A=#053' 32;I(3p~<]8,eG>> .+5~TȈc r"ˬ%N0 q=u} }U&@zfy,/TsczeZK/6F[~^0[7grsP8/Ω/Λe.9[Z~:T~L a݃pV<f&Kץ9^ K28?b#N̯=mɞY]KQԶ̛^ZGn|8*)wur~]|D^| bO7E8K/,RodI9r51qN$']qn$'5iƹp̽Hta87o&">LiEȮ$u.D/Sq%K-NţӍr,B|]o.3# ' /u@* FbzZ$Pn 's@^n(9A^XK#ʏMINl*궂$U5DI7M78܉(cȳ!\Hm#'@L7b7Mt^xiu`ndYRVZz&~(PDО2{;xi4mTҏ6Wx%Wx%"43+U5W{bc~ ;@tU"y㤑@/a `9)/˵~uCv)3@wP 'H DqnUsqݠ| h>BSqd]+4ķ~FTysM6/ϝoK{"] AE腧BL/[r#3Snq&)V\lIW#U2,~SE^-ZJcM6[&1H@J B4M5UZ^ZК(DͱH62tY`pZu4pB"*8lù^y܉8 ZMɧ˵ur%|LzhoWWtqGH \Ykk[mIA'DHoDJ"kTV3 $pg1{uXU K̆E="1r~iRwM!照 S5Q j™Sqt~;9V✥΂ꨪ*6)8\peo/vJ cGF:upo'A \H0*Dn&qձ-vv_'>\7#])_3ͳDL3)q%;?_Z3\oä:GOؒ:aO s:EQ hL+weo^_.zrYgMwL+ mN4հuEKb)kk ˎcժ˳ȝͤ3녈m_|S `N%0W/h=H:m4;Vga8r8; rҌIvzpLL/7w] s8;*<ϥ|*caT*U 6=oђ."SJznDz".DLgv]N~% tsc/y0)N2v38d:A/gp30O nUTsqNt'LrD^˸閗ȜkΦUpt)Dagԡ~ lD k \UH .V*Ǟ ^e ɷwf.V9jw#a֑xC"A/gpxn8+G9aDpH yebrL1+D aJ  h1/ tc .:fMy#o=k.+51ӷ ^.,&3?oEl!v"Ǫ%:8Ě^0]q8{tv:$gp+&?uf% /fx=Kl4G4hi"5 $.__q)p^l4G[*1ؒ7k\˅k- _@7]Bv7ɯRx5>0 ܥNP[=_4[UY%{gYK1Y/ =3qLtݻ)|[e$ mIX hWM&5!SȖ0DA < _~sQ&&c'wpQ٘|Mj:EhL! Z#)%Wpc )|83؃et[ҽbg-*$pX@҉`&λc,\ߌ!@$|mfxЏ+6}xWez568Sky|\{] Z=`x*p~g6gR$pm$ct{ WqI6tExvY#z%!_o;u}4g8_#{+/ZIf$}r[ѹH3Ϭ4ME ֠z΃gI{ FN.veʵh1B( e 1hSTwŹ&U*g-}lv[!K(9V-aRDG(RFO`o (=[/ ڵL?4P,1 A6D m A"?ܷ_6- D g:_rxԱښBV|:3X#'L<X 3 L77{AۏMx 6novrG+H †\15Z-{dqpa㽶zsY{j?/HY]8ts3owwu9'+rt}&ەvץ?ӟ3!!@67 *H ܿxM 8C~,oJCBE)=[ɉGf6*< gG Z/zLuE#ΪBPxISQ(~JOҠ 'R$1gX|MCȲv- ^2&U?TܵOxU͖8٩u{oa/\ >w2ʲ^%^+.޺]~ ^T)B—?]Fu].~{Hm $'Ϳu ȶQdA #pj/S,`hgb%p>gpbQ8^=?^*.E7qc0m9 .|-Wե:Ԧ[u{G=M=[Ռ˟4+]zYBH-FR})yX#s02_:m?~ӿ~ϷxfŖnY`ze=W;\.;CP{з&ӱIv8-}`/[GW;h8__Io^2nR-sޞ{]f%nR)嚜 FVo> V?6$/A$grȋ· pEdY:\SEO 1=` /&k6 }} jƈ@h\Q3^)o/-s6놻t|1κᢲ_ =/mKve[;HN$@kK*t+zړ-5{ 4.unqsYs/XvVD 'ebWz~?|+.kiӈʼn@4^"߽;iu3g!ԼT%f:V{#Yu^/=~P1hcM!l+|?2n߸]0ₖp;|7.>X\ׁ6\UԻ B*ɫZc EdO7$I#'"z*ǒuvk1&Kw12͛_LLMBk,ug_ 01?߀_x{gxXJn/̫LhW8/gY:u` !A3[rҞ0 UzO̷- Y}g=H*1; CJW3),-F%,]`hXUN"۝2ʮ~Oj_[Ӥ,-aē^km;mbWy{D9K}?|߾Loǯbx_0K"P="rVmvDǭ]KJp6|3 H`fu9E`DzS+Π)eJ8uhr~=nPׅ CwrQoئ#'[jK.KqaQ~N l&FerKa6)*fe}R*}:k\2o[)?PCDyXE~_?/+gϫ2ǭne@}zD$#j 0eN~Wy"e! I]P d|r|y*(]DzŖ=W &i[di }W]p6w9FKĢ3V9/D/wEFLʿkM^v* fC3{o~Y?uUajHf IDAT辭 9"'c.gyÂE%o V2$V]PwY$+bOMq׎sut-#naYvJ4۪ ]V8۫Dh*%Ii)EL_!$j3MiT)Vk :3)X̗)[| b`gLʓjHe)EJx)mU"Z/+E̋'z_֒|;O?">-1k;^Z^w< Wm@ʘw暤AO�ҿJ?fE<a`ZFE{UB¦/nDYHe)Rx'7Ighm8gIa bsDJB_/4 ˆkƬo QR5e!H[sYdeY>jmm#]Z넣; ]O7/B"<1(De; i@%8moX*ǿ$Z Fz~>8U$~gʘ/F;zރ*6o{{V+ߛ <~۷v[b]4o:L^ǮiRz!2X!bKk}ZnF5d@oW?RST{LL!aqKJ)f? +1څU$IVe`}wQ땇Fu,1wMs 5Os%:hv@6T3}%)5yejp*BѤ@ *ޘ*fw6CL_F`@uR=+n!5:s;tVtpRqoi`7yL`9&4nD称qSa8*,ƚg/X̫hUtn֫|!,CNYHՄȦ ](kQL׼j^a&8܊]ؒSB+EW$:SljI[a{w-VSf,*GdByxApSlRa7<.hB9vMEj6͆ǖ3}N/uX/G碹gBu˅#8|Ժ?MUCյ* Z7tq\=(2%=Lf2pr&a +C5Z|cBGĀ &z`csGY( 0]I!N_ Diu[ 3hDod8!9m#EBy1> kkԁuWkbf~w݁ǖ*LeCe0RBeg90^/[s ` -NJٮBpl{@v-[Lԅm: 0Z尣CtTNzo GxnhzZF}{k9dӴ]Bb˞fC8d< #N8-"^CVqÙ=kYD8i C )SO:+Xfj)YC0. DͿ9ڜAe 3fE-3m ޴ IQp21A7'0.*'Cҍ*3R N3Jnnz;9q/6B큞Jp; ZӅ̵Ԥ: .]w`HFt,T"lfA``_1$Ra^!gy—b(cވlqSGnXz&*=qQK1Y9S2?z ߺ.|S #.NfT'SO|V0!x(9o֨MfT5UEU~2zh 5?TS4ɴ Wi6f,BsI/zzk@Vנ&B>uێ1lL ؈eQpBfzFe3+ǹ<`AGst!8؋ƅ<#'8AGa@Vƀ6Qt F |1 w.rdž*.*ڬjx!"ñwz2 + ^^S9orWoaʳ<9AM5E$ݬ:]uCu-P}6ϗT{Va &^*1P#c M+~a.@ ,:,1"a<&ȭFOg9#Nyfe/`_ WH j2lP`zg2?D6!ܖh/2cmK#=a]/QO$"E## f ;Z,ypz@&uu5]s.^Ʃ$EGC?dhs}7g`+Ml1řvʢsO^7&M/;gyoqU9o2Kj,e!Z~Dsi/m)dBnRZ?t4OX^iiS ̖-sY/aߔ$rT%- )̘@WBWA~zI<_1{B)p̖NjHo.[m|GF45; _o;[zqwÁv6ژCm(XO0uUQSWmyunh4JY :X\mK~ᑙGɝD-|6_ .`b$=ZtCHdB<(3H$ gվQ8b~@Q7x;C;N|ąjK}̄Kz{G<1Pai Ԯc]oP6u^KiY y&,<FYAe]8 Űc:0ÆNoP^TX5>|(O j=<v7t[Wm1QXra vU3O.eOSQ.!OͲinKx7M]cSDAC E4av plWH<Z۬5 ~vCEcFLj0qhEL  )T !kIdk^<+QExf@{6/ "hk3w.w#Gz:t“֦Xo>FW%';#|l*tVSW+Z>[Wj4y'%̪ܰX*Ъ;O%`#kI̘!Fف:al"(GMO ^0ʩx1~Oc6]sm9a,凹myhA:_ 80`c@s@T+eY3$J\k-HŬw,IpH"6'`.GIDhm;pݡCk[3ػ[y 8hTkZY\+j*PUGZ})qO( A57C @;vmp.wPө, C||7(i q 6pv`ρڌHYm]:d"j {%dm'TUT[T(8# 0`0a$aPoP2 3^r/ [wLhx'z͠Ļ ޣU]QSm&&|Zڷ--{ c2_r= *ýv`xZ'=ߪiTeB@XS+VZAeO9hUD/3Gnŏ Np\4MG ք $Dg@QVj :`Ygn+B39,>ш 'l'^E #-Gq MoOqg dǒ12Epo̕oC3c{=نZO-3|hgXTfH*t,\KA]UT8[5Uugz Ƞ@N6Td*l`2uqS5YWgqkhC+ _!dGBr^ fW(̈́ndy7$5ܫ.Hƌ_X.bypX*l2;~0]*4-ڛ b$,cT8`'v\:4 %f䤼DEhv;cN(|-ܠm<)Xy_@!SY9C/ߧgO~Kpf*%  f1 ߤf']@E"9GS)r0~&кrm_Hrdj{vP 6 IDATSs @^rpj$K^@),CGpq!ۣ3h5+C'U+Pl/DJ[u(  jQrRRp\jKIf]VyY7*3X !0160>I 6ft;u :NB yXDm\"/%55)X@[j{=g/Bؒ9e(vD5y@ʘ3"~WMZl%X#+s:Xu~1g LpN":VcˁT|oy2MDge(˰GUKUU6E&4 Xȥ4"B<ȨdgV8x *t93>S8,Aq7 {IlS8ypТu],Ow;CXecUx,sNSճf.R\wmۇ[S,Ng ~ ʼ'+?e,.b+Ft7;h8qM>$dg;< _r> 061 =:H0Ti7rPJqy ~X-m u$LYX5@fd9ffTЅe~spTRrb qْe W^1=rOV|m&-d,(Ϭ@1ix!Lt""_zJ@Χ†ev0` 6gTrD$}wˉ{Pq,n9fGAmn@<,{+gR_%倅v`Y8V`C v9bnV6ƼלdXeDVK4\C_"jTS%3Y釰\C_ a>k8J?R&I))ZԳ TN BY9OSWgP#ީڼN` v_cd` ͙>75^kcd&>yZxf LgEJBv'(CvstT&McKlylAv8°rX-~VK\Vr]ܨDTEl7F`\96x5R5ͳ G UbGC瘳K lVEµRtgk4̽vU>D=EWmh\p^<ο ꆜac>`͒jfUAѳj)1t $"s%i/R3yԸC1B-da˞aL3o|N@ "HT`zk=sBn iV YeW2`{ ?[hFMqwci_$dbTɃ\h5אy{ ̘Ѭ&XX+_KGŬO 5bL%7p3^ƿD6ley]մi{n۶9_\R+6ФU$V d 94/^ GKH3AEHLyTd>cyO\"ge;=Y̥/Z}͆L:Df Ѕ6Hc3%@̰b[΅/W*IgC![_nY &Â5q"BnWpd$h;ej29*@iqH%{]le8i%*0m3Z9(ЭJ\(9wpU1ut}u(=UJC;Y&X!;캴[2P aho0s/c&h!q8[53FxgN-f8#&drxEx*T(0(& }B'A&"n1;ȽJW0bCA3rm8f3f)KrC dʏ6 oΦ i4Մ~ '@5*"jwH%,"pȊ# 4'G1|CCmo3A!0"u0ZHYWZ%TBg0`[$jc{Y 7$ՠ~ܰTj 5|PCְ3m̕l7HgQs aòYiʸži 2YwzeDďה l 1|3jzOHO1 =s".1\qbc a( $ͥr;e\Cɗ= "2onP5@ܒ=m-0#tZDr"|jwA3u1Bt5_ZhKSݴM BwQS_rbKtu̦aʠ}c6<.ή7<%]N+k "tP:lq氰̳t ^/oDi, ,0>Ά2lӷgHi-lBVs(jT)NW)oc(lq RԴ9\;  U>T 1n{(geW(rVw>@uZ7 lg1j0-U0^:{9a0G\NˏM,:5Nu ڞb1 C,F;3/6޸ C'*t|&)s N#s`}s@ MsS@ z#c%%)R#a!"4Z}ډs,5?!ނ& o嵖{s 8=UZא,(4?תmz!j⾺<-3uE5컜;dHIцϘBQ&^{S ?'z<^ dY.CUUD'yX P b4>leh594z TGr,$Rj gl ik7];/"v䋱/W E0m<6ャ 8B2UxUUԫQl):͚l ErBQŸv^TH*ƀrKp1gm $?BӺmQȔ0Ef{genhEBd 0" * \Hvp1-bbkc/,$KfT&p$_`:D]tKpUZF؄eYK-H{G[O,K;p [ՠUMD$] :nC$|eJa 'qrhB22x&e氶jGu,"Z)(t.\b@>ē2˃i4^es뇜6{B/<IֳBgBiq4kOC*UY2!7/'/QCE '}) iU糥4 D5us{@83?0jfFžR#@Z@(Rc}`W@oW` -"LIH̜6ph3ft,x"PTBxPk XE"]¯ 枩ҙ¾`D9 ό@ďsUB=4 vmF!wk:JӔ\=A#z @MS.0C!|ڰ&/ +9PU՞pqEҡ3ILAsgFRo vsбh'p35w'~lx'1d#tR~..e&i[hNxK,1*1ߪ%@feI$~Ћj_] KIr@a Ce]M}0%\G6#8HFP9`.`Ʊd,LEeڎn o=x־jж`76)OJ5{̬䔰TE=y4VFpX0aTeɹx{,U>:m܇۾Ґ+M55@`/}F!a`/u131*P}XD^l@`2Ṋۄ^Q0"@ ~IJ7i+v(&sAXRAA] b/. |{pmsZNRlȒUנ>==Uʎϰ])kIz{( G ٥-S]+)z/pt s+ 9aoF,B%ȏx@b REd%UzV#1{#Ǖk^9Vg %Op{P;D=#mטw! # 6yɺ?j24mo|Q.D5"Ҁc % W O&V80nnKLUHiں7s#f|f!rFt;֙ F#:g`xE(@h:N ]4:>Y7NIV zޗ! Ϛ<(F 03'6e74NT7ha<> gc~ >Wn}Er<ѹGvpQ 6a+.aQZJQP^{ubsAt"pyqLQ D~C@1zer{s|%=U0-Y cU%E)eKXb:-,9H'F˓pf:A)P?9 _ [y#a>C`\H׵ ƂX̸Yš&ɇ F!kj,£FT)@2胄c'\r!ܛcso//}`XZ!1X_aRY:8CsKt{a` ^l$ IDATn@zaDeJ UW9[fsq"'A8s0jc,Q ֲǟr G< y"yZ*fCBQuS]U-7VF5 i'pqؙ0!O-o pm>DIGb\Nm硷y_6cJsd:Vύ ɀĩ]oЩLFvNV̨ $COa&D;~Z# t[v\ ҧgΰw^(A\ǗQ{$ǒq…lRs~1K|`4fD`VKk0&MX (%s0)9egN5t3RXCg80Ҁ2JƖ!H9.nZb|Lt7 tEy> QX1JY,CG33whMfm,c ?sR o9me/H` 2'7zF?e{ xC'H(@H1fb <7T\40 4 yGVQ'-{߂q=zn I[T HrqG?6.Ð9u ] J2)cO@`Ž, шN-fyʝZBXBs6UXz{ [.קvSBn@ά4}SafIzRCSIoZϳ4,+%cЉL|&}`ەq`k-ʝ:dR{ĀI_@g#xf<iCcsDʃ8O  +`{k#1ٽ ,^g5 kTh% Pᅭ=-tf5++}^Bg|iة!58!c?cC`Zrω_lo淙%Z. 3qWAm"d҅c9#e4&E!4l255@|^u-Vd àlu [o!@cfXo0lwlQn?&\$1$?b^$\D1Dqa; L`jVw}4}ϙ#: 9fAPd3to^>IC>ox<ծ P2 AUL/h+^9foE}|sG|qZS48|6qg HajjJO&-ԟs[PЅKِs^ s`f dJ r*K7Skƺj]F,!zSh+RkIH9+8@X D.| *ypDdˇ#'b绰U̚\kҮ =oHh)3r8pF쵁 Ic'fK/'A am8 i!kUD(j|\BHks4U}("_PE j<|6/>c#b,E3e86JOU.aS+} 9e(){d\&ʙW-9mH8$UJ6Ա3ڠH],w4@{[5ii` b--osfEˠº`k)F:|:dbgξ:\rg&3BP$l|gNԆ$i[MLː{Rz4; fS)ED i/Ե?g˸>g( NP{3];t30UA54I7iB7 H`rUtik],ag_Tb?ݒP|N:}@^мXk'!M$2vYN(wߠNE! '4HtoS(y"^7Y}{bf|p;7XCTU؀{@aիБ> Uwg] Or@HlX%&eބ "d1DuD] `rx^||,{(C ) 6 loذQ_<ا`ny;00 #H1i%ozIQ k&˔\C5kg$>.% MW!(osv<7l _Br,E7?&*1x+g4N?xE-0fo lo?x{S׀!f \oyQ,=/d~@k/o}%6ǚ/dj@x'dGt{sJ<)/`UwlXIS#8"VDէ?Gʋ$ݚt\Dk7{Yϖ5 YǏ@mFBo5|[H#u-Z84$p,fm#y:(F;]=?%0?_t).|0F}zqgPw+%C5i*T+3 I?G̞m"}nHK8_CLSu/=\jF+Rgj#B73V`ã9&Oc,\jkt&/B/b۶}$ a>*7ϩdHS eƼQ0_bϽ8 =QTvn+gY3xFd}@yVrf9sY }. ANꅱ} zƒʎϵjߘF67OFVňx}qo4S(ᒦ3BE :h(>YY$2?M- q khVZwH\dYc9Y;IY\ #wċxQ!gG),V^*Y[7ڏib'U sq~y<}@bD½k8~!)E+DLk JiPÌkMJ;PjJeJ!iL={.6GعdmԩijB$tnd Pd8qmCmڞVrdyTү1&?._zf)sު(,=e)}oɓEZ٭MI5LTY I ֱOԖ4o1,!P$Ly[џJH>)U">i o3 `aԔˆ"%Mp;PY0)nA kI.LuUάJI}&e*t`M,!/", +war2ߛ P DNy@[6i)e[M쐼H*8];s;g *վ9vcdXL HxI-?ǩy)$从=#|u@Ĕf")Kz4os$Raelܱo վ6̥N~g|`n~. rg{E."=Pd̒4 ^~Db9gV7gABTLp,BaHq.Ib!8a1of9gK|19:|nOgQo8<#oPnC#` 'B)r!09LJq:o>4G]5=?YWlt~SK]$G_e~9 ">p` <γ<r= fOemD9Q_\@Q0%%GܸPÊ6" eg,HgPQPQ~~4 _r/Q`{C =Ssű:Pqo9І)]¸p~Xވ)'s3;`> @/ 'RE \`9`53O !?y$QRH:~z1sY*P*sτeB~rhA`/:7W-/kT⨮K]@qsc!DIw6EgeyI}9-*\oz&CemlsyR2bPTPfztF,~Px" =0Θ/`4;v d89T4nPj+pdl,03Q k^Nd#A/`٬XLE̿3q `eN$產(K!4x3Ql~KkvVi]-aWDtZOgfŋpn(IІ'."Z<(5p,f8#'*V{7BZ*FމFإaxi$JaxHg~+?DرLh1eu*E7?x)0+,߿ty=Ic ai%?gr&*.T|P&Aj_qEf8/ڦ@x%,$;qT_i<,Koi0;Tɰ$|J)ͪP ˯q|Z @ksy}S|A.Aa5!ٻ(,̅ƐvHLGB\NoL~Fv`t)%WWc~ Kw+U9j9JUGxx!YAHɁL*9GW(lƜ܏Z_& P((%;ϵp ST̜< %#`($OpC'?ƒWa&s\=vVG&^nP o9M)^ANۛ]E\`ݹ3Wp.p!KJ+4ߚ!'>) x6N4Ɛ0@vy7N~A-N7):r_e R/6rJUqxP5"a)&jMݖI2(}TI;iO7?~ [.k%[9ƛ{= ie5 P $v`AHG3k>pk0uޡo #ƺ VjUB(7U TK; C-A}+N %/t!pr0|!2KxxCPmQҲat7|~͒nSM(Op:V=FUC;N|  ϐPeF3Qn\hcZfd *p]C2ʂ8Vk2`#^eOM%P>_ 2v]Zw.3%p(>KSAfzs$4լrҀ* gY[Y|Aҁl#g:>p1 %/g"Pp=ax`;+auJ)ms agל +KޚCF ]9t);9Ŀt_^tXoNp r c,%v=N:tuX3̊:nyg[T|#sBb!o+CDAQ$|v!ƍa;>KSzN X93 ̾ Ӣ474ޚxs/-f ieYGY[Pe"ܯA͛(/$YPzkdǓϺ0 ' I8џbw{bDv`ܜEe`@oO)yA/\㲯ʨ5kէZ"5.Ea6){C +T♴`ÿﰵ ¹6pOhAZ *]0N71z~ kyay.@s?uW( Dl}i"\L8_=Xo_exN(zx5[ue۽2f䅑WعWqy爔q D )WAUdz+p5o/#D]:~)u;Pa y!jQ^$ :E.D6(Pds8e ;*}påwɛ%TÅR$&$Ps Bv$JU  B{j1dcRbmXaI'&C(6C}=uB x{P;@TͪñݱTSR""e4c"u^P)4TyNl73K}0\}L:Tr2YzJ{![I. *O)A6O?=={s{ ?1^asY ` a$W*+K#g"Pv][+~>\Ōs!XH0(E ,w&d\8rQi]v*>- Ǟ ~g}a‹bx(cUW ״?=vmWZBg)Q1Tfb:]!#9m0~ oM_e~N~nTTyJ2c %"Ů論d?Ъ=.ivykaScPoF50'0n#-ZU65je]@{&Tիnm!1\vs. jKyBAu1{}b10AWaJl8DySN'=W4>Ag}G}q%ħ57*qo1w}[wK%eKp^xUTWf﫺VU ⶥCpGsKܶ ? ~1U]jڶO~GzYu w[d[ks-~V ,"b[jva KFf0c1+\8d=H,dq\Zh+bú|vA'^zYxk"VO 򚪢USѺiUuS޺#miӎ#ѱe:1:L(mzi7zjjU߿o\]Q`a@MKAL*αn HzON _?+ll#?ȴ?2[#ýtkꦦTa=[z%VMC޽W:0Q]7TU5UuL6R 5fP &c\{?1i.2p!XBnNf/u4rY$|v;&KɅ*yaQOOTO ,{S6z֮hi]?Mfm=<ӎG j{wl[j[H푨m*~MaMDm@Ñ?mj1LTuMǛ+}BjCjEJʇ,~6gIO$Viz!^R:W-iಐG%[bQN cq0GKXZr1AJ 55 df t%{̅$n뼆U^ȩ)oԴYunԴ]5gnU{÷G:tx:=}n?wcZw~x_ہ#o== kzG՞>?/5jZni8ta`"˗/twiAs !ˀ9,p+ˮEsH+|uV3nY@('v/ÌO[$\Q#Q2!^p,{NaIz94Fu%\?y ' ^rC6JCuCUCכ] SPx<}~o߾-~wwt[z<"t:x8v.mCn@ϴOqM݆xaұ}"?35;nzEh~>L>j uYYb sB/|/l?P@bLZbңؼe$;ARod.8E8=lyR!^N8cMs /_"\Wg:6S&ysosՇp;6c6.|{j.!ܪYԖmm?hя?;_ѷ[~=vv;:= />3w#kj nP@Zݿ=ҏGbNO~"pݎjEWWWǏ5 mh^SUW K>3Z>C^w<ОR: jץC_/gj K(E)1/&g2)8[Ϫ1gL]د@=A`Z@|uC7n+Z7Yu^U^wIb:t8}F_~۷[|wtw@?󻻻ǧ'vt8n{yiYi^f=_N?~=A'bqȖ{:oOwԶLixdzy05=m?Wz#mW453r%Ьe~7(L@黪FffDTO^Yd:)}R a%DmTO?a ϣ.@Pa9';zVB8JSƩf5]k^hTjjp ؽ?~t{gnǏ=<AwwtwwOݎ-1 ՊVUWhfmoꊮoh>H~-;:tGb>@uMu7tlb{d;//ч_oj*{xJ`"zM/?ҏ{Z7TQ$}q0ʬZ_8,=>4<)υpv2\rO!W< ޠTL2 MӱB^-3=lI+F;3N[ЪBwlWmjZ5'0kۮb#}\o}1ׯ?nHfEUjvK֛mi mi{uM^Q]]כ }}pKtF5TG"~$"}W_T5H|}EOt8itQjE_oׯtl:i̛mp}E}+UQաje%H쪷-XE.;%#:<ˑcfao`dɠ }ld˅0`Y v) OS`ts,.*B6Uҽ٬պ}>[]B|,k_K+}~F߿;?%P#6״~Gm6Ww~״^z~Yz݅WVj4Zt<}б}î%xDgGۖvO?]ӻ+Zՠ]_eu]zk/jMݏoZoְ͵Ϧ8FA3No% K|-AwX/},{EZHyf:*;ILi?Z1x;'t[ :/t {]g(aUvU5[7jC}_]!Z}8tնoպnow }2jj޾w~G޼;^]z{Ӂ7 ؅TuWWT_Può~?+6-5on?{Sx`C_h:_'}mx07MC>|xO?ѧׯ㯴*3|OyǙ2(#vDXx4\avbY4W1;"S:%~yPbT{{YVBR~9ɠ̈20a$ׅwo6+]M/"v9+ڸ[}~ځ_˗/'+=<<#-UՖ67hun>7/G^V+jjV'vA-@y TL5@iUDbjGGz{:iۿnXSE*jn~oNcp^]]чiTxj9S Pba4J&/<5SFI,CϥmV-LTvʸ2>8p3$cZ6= 05.2;(< t¾d`76u[U}Zӯ731}'nw^o߾ϟg}>}׎vj5~wHW=]wi\QjZQU5DUM@EyD8&B_o}}Fww?l>m}{~ ]H~yOۛ޾fsCzKu%T+!ZֵǓ_i00ATb"pM|X7h#hyG,ߞJLJ?W4l|E~E#{)ݾg 7UE͆޽{GяۯpG77ԬVTU3yb̡c3_, A2mlQ2,5Ɂ"NkϦyWWWmB/hbE~DgȠ|n.FfzC\Նn6+Z7U;wO9}'>}L_|/o#1՚67h}7gn>Bwttmo>=Qz}EToNmĽi_0["n{HT&;Z]3U]Hh:<{r8sӹIђdYـ C=,h @C0 fz!x hZ8(9Vnn>CWubUJ^S^euj;g?>i(;2S^,!(eAR _ - NG,Yv( {Z Mw8ёD%zwpvƶ, A\9ܨY=w/xMN(jS3`a$iÝ:^/baӽco&Up Ut4@"B61K.P(--/< 1;7< ˎ`ǒn 4DX"JB1PiFJ(2zJ (xWzSR jU~G!@"48pLEHxKB H$fp0p8!M|J"<s}}v(" A(̀Sb >%oԫU.$6x;zVBhMO(|P$B4)&SdGY&!Wr;n Xj ?j~D"N4lQp%B0cya2k|* 0-W![[Լ٥j͛dv:wht}/-͓2'# `_j[#j5g#֊ 6l>B~0}0Q;Rr2W8fggf~~턈 IDAT+W2;;+ E<0 &${S${$z҄b #d 3|@+JV|[tJ9:TUUpVYF>+ /x}|?0*PUіfx:=JA`wqe\{xԎ r&`"A:`ir\frD4M3L] ں\RCˢCM[~o#&aZ iwە~] "B.Adi͇OlkY9[|I~$؅noEb {dxtT2R.R,Y[[c155իW|yi^J6\.Vh4J4&%'O"Gx hp'0F -*,x@)x|rW1*Q haBzaYGkMW8N\B]+CWP L;L/I"5YhQ @.Qv%%3H,F:DOeMm.iC|ٱK&n0c&$S"ZGDצأ^nqmEk* !`n'EwE^f!C{׾Q%{ϵGQqkuX/`_DA[*,//q.]̅$.Ɖ&$}w~"ɞV_*"haci_įzUf@WVI4`sss.\ ZXB*+ofq:F]u v9r? b#t $Xa92k YW. ۼB UؓNLJ,\qH a#ZD `Uz{jvQAle&ŞT`ޮӶLݚ[mu;*o9:l$j~?op)!&ܤhr]g[؆?a8 ѽLyŋ?wcc,/BHBHDdO?AC~~8s aG@L\gYa*=+L']/LZguU¥50X9uM]V6TηTV*8R[(W>wP+QZ") QdE̅U vX#%]U? $F"ev5d)bU{ ̉kQhi`=z&KS6k2Q,FD'aꦤ5av[(KUyf/{.6n5_k6DwG=%&TV!@ђz&yRП'N2bՌ 9r9fgg>}N1=5M>!Ca±8~^F&?DwX:~F8n𴉫%gAGoüt+9kIJs._wis$3KH0C ٷP4 0q _7;c]c9yb9^fhe^ 6IZmV;_,‰rnmjv5ϯ`ՉcIEqPJ3Ăe%㋚ԢDuAH(IJbX, @'MO_ , R eMp#7px4Zb.ſ+AؓͰa{}=^Ɯ%n.ySkVY,Gp;sl8-"M6hX8̯~v Dے[w*xȤ70dM*8/^_䥓'YY^!'wwpa#IH',\-qmd<L3t%yA'෵訾W1GlL4MkAm:EVp2 ґQZi#R.Pߒnh{,RnLF`Ot׮ }Gv~{d][ hDtc`D7-:47SgitӰ?oX .v4~a;El+N{YʀMcQ;<._P(ad8]cj< JWz^Cg8zqB,Wߴ9qKxP9W18H-D#B֣}Y8;X<>;6G ^R`X()q#c*WteE߯3'SDKϟw8Oj4M|5.Pa0]$&6ha{GW mXf^tUoFXjڲL([t܋1i}{ )"'ߐ}$E[=ܕmOn/ҼX|WMel z399ŋxbXSSSq%#:pI bxªDnD:[S,{ΞgUz/a&` žL%M]}0xM$w8"jQ}|M4',vQV4@D?{\\ ?[g3p3j4p0L  yʥjFFks]Bϥ/Ӕ) \=/{7Gz]u[ xPvգag&ϼ8pNbg HL>ƍ Q?m_h XYgC\x p#OMQ퓺%PNw?hC rsDgOcᅢr.[عt Z<(.#2(.e\ cB+S=6íbwp$Zzt Vv BYm}0s˗1sA(Ə8GPv;[`Nbcn cn|׎qV'1&0H'a=xaܾ(;4hjirk2F~kqZc0Wb n@9O 7?ڷ U4tv!)GGYd&Ce9t#3, <D1~ ~ϡ-."= B10RỀSA5AŶ(g: @a#umo r7*b ?wrrK./3>>TCqzeG\I3(3q=71H-L024׿9^&TZE*}3׀BKuM<ׇJI\l[Xi JSt4Skǯٮ*M!Bj)||yUDWM"VD<P*( N%& e&9Giʩ,_NoQUKYcōQa]8K"1$4nב|/:n[XX;rVo3p}sJY?J=hn$ƿIt4vvײz!D.$Gﻕ~-hiDa'r'm,/({mKzeL'63 MHV6ݓo^s$?Fli,fa!~Y?]"'Ig"3/M8|+Eh+-A}{:ibc_^ p U=NqGEّuh/]&yL>WsMW4nr8C[PvJDx9| -Y G# I^Z N!țd D{*x"I'OcX~o]rLjOc-_ ʹ بg)}OT#@\*4naK?`H]Y{ͲFc/>5 Zb^!8P`ӟ%<(vX_0!t|s23,"Rpև>㸣x{{!KDF!v RyG&annnNLLPv$}0Rh#%%Y; /=#ϒ^Q5Vh!)FL-=}i{ 'ʕ#" i!yS53/.1oߓ{R(}V>  ,0 ," c[NDXtjc,N3y/FZ24+N}e?2Mt/3Gb`p:XZ#$4ٗo|{Z0#zȌy]ʤM)~k,y0`;rB";psi cֈ/'> >8û^4jԅG9І~-uZZS IDAT$3Vvr51ͥs.|ItP&n+3Mdy%{ۙGo_~Sn> ւ~)FRi۷hUh/}7ŞyؓRˀs"O}o>Q Լ׷DbO9yD9HO$?{W 9wů>i ;~tl.J۩`I207|> ,/`6Ag`0H_X=v<3]>Ǎ+_ TlYo,fa:-&o}% 2^m;"<793s{(^(dW<~]*m2)K< `mNr wtfp;+}(e-9? q[[\ 4G݆:tl-"6 ? 7ԧvfB5i_͞З?I@P ~#?o Rͼȁ/Vva![ ޭ xOd$>3c-/g? {e_a v-6kmgaI};twcS>gRN<"KHKR3%yWÿNa7'T`EhT[4+~c$N}&c#7O?Km7}_}4<,_d)[޿5L@VI>"-^}7m ZnOBV*: 03n{Z,g,T7[ǚ?K9B'G0kcjyo3mK 8EĞ$5vD95G>uir~jh"U61u߶)X\]OvEN>x``xz^Gzp?X%Ô|I }ˮ皘Yĩ[ǙjaaՁXJC,4߹yVs0v+ߝZTu%~|ZgmJ)f\g_٠t9ݲ)wH]_,'vc7j f_">LMWIcߴ4gPw-{/|&"2FW6;7:u,#1-S$٭&'Yÿ/BǾ΁~-?@~R":Ï[bWl{Ͽ K#׸{}m?aKϴ] ӯ<_=~왶Ơp!A;$N><^}&s'-MDAkida:h[Nm?#[r T̐-.;ߵ7KA=Ww-?c:n?{"~u8Nw>j o{=D+FfQ9{umH,XNbu籱1ʎK"wC7thaqA8^ {v>Cɰ7 w3L$rs-bC3CLK"Xg xp=_xg˹ Sab)%֣7}VO)bOU"uVh0vF׉ڶM$s]b At.^MG}(1Tđ&6m8,55tkSZeb3/nn"ZDa8eD_5:!2 +7iY\"sS3t$ƾAꓕ 2x;[Md%ϵ~3BdO<=Ə0O!щAwhEh>w5W[fJ#௢C 1mr#ww_k"S/Տa/]jWL‰G}^|Kfz 0?K|.jٗij$@4iR$k2}^+%o9Rd% =9ed-KhM ʱ'#?.t4s4!V'5BD/O~K7J" Ŀ*fN\"#N67Pئ F_sp{JiZ(S.pnM} - bKPޣ|Ks]jV`klP]Av*,JW1l. Sfy D znw1+;BW-V|tksLT垓737_s\p;^z+4K? "S/4BGʊv;nbߖ2uǞh *01Jk]/"<O#xs_ݞӊ=(+G}dn}nzs/v'PvmՆ#8N1mqf~w]@A`  7u*NC[` ,gsO;hzۓVj/EƾA5&ZJT_~ʇ^ddU_&g Fai" R"=FS>~n|)]6yɚ} N[y=k?kSYiBqV_oOQ'}Ow #u^=p;ŻmH~bNTFu.ySxC7P'\ )U?M>_gϞcrb!Ͼ'c) zI\ 'x,-Gnw<6KzMvCSXa27x#C7np}ͫfrH aXj2Ӻi[7SUpWxZZU@oV0@`ƮAL$`S}/`!E40zRtozF6HPm.@PGCV" U,uDUR'3 +3]{ΈGIzk?ڍ߇ol"H#0%/s/>k^;bk~Wb*.̭)X.=0L1]#Gt Bk=@(JZհWOPmh`):e|ϫխ>Mϛbw$袼IqZz-[ZjGl{ߡ3fk||+3S,ƒF[H~m |%qV^[O ֭r`_#sfhz$_`ꗜ#, do- ȼFL7S_"zkAU\&!(\6VE?;O1֦kֹv[Gߴu/@G#Տ?-|j:t3Ѭ M<[sczvGmd ?[ ERd3mz<+Y0Zv>K; ;>@_ $udGY?cu$wG*>=lu7J_tj2Agk_ԅ"7["y =Cw`,^1SHq W-CLLw2ssH$7#70|=#I|,?`Ob+g3d%INUWzCq֒8:Nür㻑Z3zI.6+Z e;s)\W5=1xq='$A«m;Ѿ]碔^%HFЬ0 H)~ہaR0eǮ|&(-]WDZW8lr'Jhi5= nf2p~n_w [D 2p2U=גh+pT{?Lh@T?p5Cws yU:;(m4J&Ɵ&r vӷVD.(ou1S/<hb%_5Y mX/,%wϿBG{~sIvh;F_p#Z/_Lg,Z-iiQC>JWwIUTr=νJoߝܕ5UUAG{Ei+B:y_2mf.c,_A%k_ɦ52$FeejzE,&(}C#S=vW8^Jf_&LbQ"<;ā&MwljLrR(gEBһtsD+[MB6H-jy>J6v̐`5^̧*>TrW ګkR LĦiX5*,9.38٪ Фh 6iARD|muu{CDʎ3/;gNeEp?ro%:wCOfNP\ She0k"z}^ l0, G4r+]!<}U^ gֆ5335ʎPiξF_Z_?5ot-A䚙Jfn$Kܡ(N aS+VXsY=?QXJc@I#-b.7z8aSn"ta9rOD{},nd NQgk@kSSŜ;["RwDkY7o榦')X#k[II<^pO2W BY pXZZb~~JoLvrLA.>H6r$E)G6JL"RZ!VX\O U~ohX"0CxJOKt1 '+-+Yhiok(pqPELӗ&pžc, ހkFǬ$RuIQ:NA<'/liLݗJh|wPR(gS+4!`4ԢJ!Py3͙9뫒Woc܂Hih^7^tp F0mS#4hS7s{KG^z[4d4da77PueI)PxNM -$-"9^4s8mhjNpSJdOW҉uHS2Z5ɲ Ѐڈah6?EB׏Rn̫s+)\;e\Ah]wmi3!܃`v /"ߕF D mШiv9j(/ѡxVw4]]{Mrf@eusi&aaa9pt C#$z"Q0;?U7v~9LN3@A"Ad$2-ǖ,[+g[^ZemI+WH$H f0&7o7Tqo^43sz{oݪ~)@i$>fK;'rs[{Rj׬ dl6N{ E|&\W3SW`r\r,AKXkJ?S: wVsߖ->)sеBo5(PqVzzEEH .NmmA41Ne]'KvdtxmlI'6 VPd[u#Ԗvi84vᰂ VXzOh&|[ Ƅ]h+mlcn|}|O,sTB.n HNP!v}jeɠl'"+u!2۩h0꽑Wv`*{5zFtPg IDAT,2._<&Ni7ڴ!P[ONͪUپ$wv'ad\6枬O.jK0?e}3;gR/Vkndm*.OcYq[P*V%_$mbrr+\ G&/!-Jn@2!`q_}0bg;PTidzvemӗ!RI)EU&5o 98DB01%`nVmoHH.b!Z[-$^s)fMN?uS2jP8Lk)Je7']|m;aqƲQEs tcŗWm IYvc܅t{DOžm#o^}˾ {:pMě<9 셗R~ 嗖E+4̞}7>Wz Dg6'G6Ƿ۸t>d7KAg{,ΗWɅeէSi6a+9zE$$295. 8|2λnB` q>A?DےN3)i묹24S= //[["$+m{TRqEg{*qRjΙ瑵::ru)%dcI2BH^zG(eގ86$-R}VZ*-X- 3>| L/$$l?nPeg8Mk o* Dd؛z,I?DE8e[P,+)XD 8VGrn hQ)fNazCV~п (r@ӡث|ypWxLR8,cY㡃`yDѶ"Vs'qH-tv+R8uܙlVc;_®OVPpk#MdDeCܙ3N>֗L]Dݯ$R7*MV.?ն$.FV]'¿|{򣡹ǟcL5-w|zy.s**_i3n긦[rGc9eD[0쉧.ֆMϟg8 =gX+D2gq/~UlLrbtSFG3/O4xC{xϰT$7L}2{/KN>{Źn(! ޾9"W MXU3I=WqO?ׅUrGő5W1ա juf5XǖXB$ SLMO!?Ho0B PZǚH%kJ c$(o=5W/cJqJ~|2ǿJ 857#8y 0YܾrUfC-VAIql')ڐDZI۸VoaHȘs[qv^J-?m^#kXkʌ2ص%UL }B8h'Km'K0p2*^hE'wZ-db'F˿1L"tL/ fIO|[=G@k(/Ou#!&Px+")_ ǿ1HM^O v}ɧEi $݃]ĩ]n:j 47=6̙>Sgtz Dh\R|k5Q>ێ;_]pur;Sq19wlp*z.?_'mWw8ݨe/&l^:BZt"g(}_1NXTɽd A4t39)}\|(ŧV}p{r}'cY^D%s|r қIJl >67R6ν8rf,cU.#3 dns͏'6wKAX'{ P֧}_a5|5kn>7Qlsι/㤲U2;#/oͯ '|϶^ѷ21A&gޛضFJX^H %/v+arQ(Kd3){ѱ)q&lN.J32Pza@e]dj"~Yc&qP#nByP,2 y y3rx=׿ @Z&"fff|2gΞezLO?v줷l6j nH0XZ K<2VS'D'.4j^|3^1Uv0K\܆v`9)epN~ѧ q/U<0 k>*RnR<"@>A-S70GLE2p9EF;Xs}?3pRYn{xɌXQh/O\H AFM/~s0b x'zvbRXQo4?? l*7ȭ¿:(TwYΟ\g_ F/Ξ'.nO,7eV޸h7?:ޕwչ%!4S ܦrao/7BxKRGw~ @=ߗ9/y0ut mj}tŹ_|ܱ?_vxy*w}|@<`dN>M~wx ɹ/m\G[|aYmّEL"*gNINo~lcɧ?½|mdЇ󩶋PV W~/n턄?I}i0wjי8O{'Ӷݑ(3'vbK6VILq)%oBlL wZY+ؗzvb2E@fpϽlojK7gjW#ēSɾd|Hx$z;}r c+*/Gr矧7alY&3&Ovj o?47}J(a8̭?4Qqz~‰/Vcos򧟦J>AO?՘O1_tT?i S#rGt`vPW`p6V;u/= qfΒ? _ΌƎ?,Su//!t3}»O{zcS?#*7#>qqQ#=[?ſ >@sK ۷bvDi2_j $yPC8xq~xv)dmؿo0Q.}ov7qq?̹*qP!IXOU}VX 3!҂=*G!ȟ9Bc'GHG{waU;oKBTȠ3V"a"dީgr_im-߷hAgְF;4[x@ez8Tqx%5Iشy rSg$i8sib.0yqBR{gp.\2cܳ/{!8𽄻cs즱=t~x4O3 +`_yF}T>޷`7pϽ,_Zv\+_'{wߗWXSg ΅:VG{ 8ksiK1Ko!c}% Â<Ϲtx5`Ƕ1&)2$Z)hz>z 8KA)RJiIA1fM4c10q|[/T&%)VxUp臜g-nّ/>wpr!2/ gc7qX#踁Q!q"Xm[:88v.9DZ5bR31Qm4kLX1uɟ퓬o_~+$DNObo8C[`T+e, SۃSWipU$BR Y**d3=dry'9ʗe "EF424[jS[=#&0 9_pp;|#0D&f yM%qH:*c&BXBc[:8x2.箭oO4Zk0$LAj\ ̢Yv'c A߾EUZ4r+|nqmmo_ۛm;>GezYK;Y*{fn1W\wX?̕~nAz͊۸ߡr_W{);>΅ 7<Ƕ2sק?@,˅SdνlY0WC2j?q07N(S>pp={g~=m]ظqso|>K{+%w}-[0z^&>ԇ-q?Tn[^!c9Tit-ׅp$dFilƝ?^Tp߃/؞ ZE;G,,B{T ]T{dWZ$g~1 Zk\T}r{DX#uX6QzS}w߳.cy}!$Mt =D)jA~⳿/ߕ0Al Yٙ?$ֱ|u#)IbT  ט&O2&! .BB!CX ϒ' \"ߵHTJQי̙3aw`l6c;˪F~ I`NU ʧa.~_~[#8֣lcDsPq}aWě<՜Yӱ0ӷiS먵ibD̼GHn+, q饱^Ni[+䃟ca$vec%q2}O3Ϡ3= }d=`,"8@SAвMԿ`PR=\ؕ2BKF ;Fv:Cc#Ȩ]Cᜠ* }_:+up&:nqq?H}7;0} U[]x#f)Q >oo+$]x1RS=m4}mcǰg/휳}4}~W*$ob6SM`} ½MܿxVd}C̊t$#}kwkªڍv߃  tM=i/-XqUm8a1.94T@ u>5;8!OHp׏2B︓Q=!SI_9oeS1+*6|,?ZEj Ο?ω'c0;vl.cƚw*t]$aN,NVP^u7GnaO3g nL+.C7}/X6vu+Xhۧ~&LD ;~; ũ zg`ZvЍNҊ$ [rL>3ITw UsdTn{?GJR}Q._0Bd}ʡ]1K8tNMA0r >COJ]4w܍#D_K#{OK{I_3 nem;Hڴs:O'}P(]=D쾗ه?^뇗wq4=H?=ן7q@d]5 IDAT)*}k˚uD;^>9j|շ܋d_ɋCyޏHtN]w'U+/m9qK$g'х!Dh"ۍxE$q2D{v'57aFxxۭXq. 8yq ջȬ,P{hIjсG1KK`^O}w̥ut^Ϳuaxat$>}/C vW BK' jDQy"!-In6 2ZhӲk- Foer`? A^pr#N9+CѮ2 ^< alx*k1'ybIm>_/F?ÿ QߞAo%11ř:I7/=sT;+i1WGHR] w$9( k?Mǩ8"}_I Fa"Q^~ЙE1CԿC(2T~ã;B7, V )!~;O=b%$ ճ`a>}h<-%^fe;w"_~ю;iTaI:CHgJ=N:?!l1wP/O xfK1i/6*|Q1ZEDA8Ԧ듄)*UǑ1Y_R,쥧@bb@/(2.?Z*ccc<|gsynNA~\_ߚ7'Nw0yx9XBlhmg?#zvro|iXcq؜{&Ėآ݈q7+y!&6mLmlH S㳶v nzϬ4^.)*Zecws0a8&#%|?=, K hQ1ZbH@ (Ћ1`˲Iܕ!.lsvfβsvc 1ۋZCe10[?w5Isbeg+e@^sH)x-/_ D2qc9KԬ*:#te)\s-|%d|y6Pg)28;-h4̖hmqmiYVW9f@:7n!pJsڶ|ĖX7[6AlIp_k` F::?HN b)+m;d22 XeR$%uRa4BG AX1- DMZ "vo?u=&Wdax9_Lq. Fm4|ƒ7B)BRi9 $%dUIt0GG-YLէ q%c\[6ٌG.d3)t]r,=r)[ubZWըT*LMMu]\q],+u[7}@n(b.V⚏3 D\뱀@̹7Ŧ#Ǻ]5s*ka5[05{] q_CwjGz60*a؎x8H)1D/P%@ 4&) QV"mVEɣ!AaK@pY rs\ 'r?#WZ$ #0Qd4ҚGGr}cMj!0(afgR"c83f &y5W7okMoj)SG0ƙ!wUciȶM5 d%CCk/DV./o&ťm}8Z.NKCCζ<u@Z`Y`` B#J2dsЋ;D$СRMp=gU/3ӳ1ڠ ƀ5rX"^~n"M10sfhi1ӻwn S9@wH`((͞g|"71[ILMpq0P$+B`H$dg43qND 4Z'*nuE4;jV0QImibDPA; k7Kx珢RM^Z@!2:ɞtg%p,c \[GX&&DB,Cha9H0e;-@>'=D)n~NYt_L)2b'ԫPRH*1A^@DXi Ikg5oTi0AQNþӄ29Ho Ya< {U׉3 @OOOs\L+2,\l.0Bߍվ,UQ~M\q'>5NzlږX{.z$q6kW حHkw*94?;XZY.]?Fgt8{-uIb;v" b-ĵ%#pm#bBAM`Yv1FX6" '" MӢvP@č9 KfΒMPby\%w+< a3o# y? y+ @3SLV F~*ZR(7˄$kT໒l!B!Gؽ 82H/ 8&fggҥKL`6\\@&q]e'UڄZW 6FkZ:f&6ϵHWomƬ u ;'b0!cϽLO޺q|$][= n/X8c;ؖV lq$+]I|GX!(6BEMVd r"d ANĶ9x bKLܰ@|93߫Ad"D9щsg3*J@_X# ja mjRC,Bl\&(s s 9zJE {tÐrccc;wzAO_RR|>XRl7*6kf<66t֛+suߗϴ8u.oxOOO/CC#  Q,?Z븡\m[r[|@k8/hXнaS-Dw2 ؒQzK3YvOJ&D"R(kV*'$`0 3u"ejatJ)'O-Y$&IȩU+E/iY"CL52~~#Q*exh!)fWe 8& Cj333?1N8#G8z(QJQ(bܵm)yd*?cnR/$I\cClfW-z筋1ljiiK w7z}zH؂\A\쒭7twV )%.l})`Icg<|%C ]rF=XIpFy;T?u'% C>0qx@|aoeq*g@_]^^ϟG?3~w~+Fh/_8~_UJ$!ǜR tZQ}V  T8c%-7[G?|5qC1X̂:s m1 Fɛ O1?@|""nYE8vaOY8H] N@e1p[܂8<<0Tj~0D|hT˯,BvY?3yy޽{I CMK-'''GG[)-\XK63Dm8<KӇԷ`jdQ}Xȥ++Sf) ڌز,ZY8|nNN1RH\8k /yLAr, V$HMS^I`i4Ms𗥩B(q`PBBB +p&"%4 98\ǁmx zzi>G{ =.yMls|%ox=>|3fs0>'8y~|o~xm>;0s\͡Z͵Q۷ΤV 2r}&=mR4 4qWL`v}LSQ n $6,+mA'7IBd4Y=efLSńIF ! b*9|pl}6۱-klЧˀoA3o> _~9>O>߿) خ{JMD'wr71.@I$+)x9Du9>ˋ $InF8~A4 !T(WdʃO83L ӏBdySZ+^ڬpbLbιܲ`ys8R*3`YR|@6]U-=5EQ|laWq[wfn+|mVjUTTnj8:eFXVo;D %4S[楞{RU8z=H!ps{*G\܆-ŨU\kQnɛ ъjM|W+{-+2{Eg̚8l6l6|>5pqq3}&{~~D@uac<;9&?8p4҇u~숗s jbPb*QT[M>ƝDV@mqDzlfJ*{|f,JBe7`78+pbp b9pccc°\=|9YsB,b "+e #dY MS\^^爣Ijn~xCN&8hr1Aqa1G[)֭hIX]PRjBz'jgW %I5ȃJ!*8$D4Nq $)V-ګPW 9( '"-nCGk,*π"h\Ub-=\ Y"3>crssNy~UMi|Gƶ, =ScE}h201 zw氘perFk;jhz˜DqsFz%=fC]=E࿊̓S5k^H+wO@0g(*QI'i {xIm]P`5z̿ _,&˙C* Pbt>|e,(T”(rh:\¼8Y=EQD~ab8!A z/:G[quVU~15H~[%U9Fj}]Jn5Lasbm'Ra j"D$qs3TE2m,P0IG^sӬ`-nLW K^I!Y.SD,91c,s62tܶm\ zz? y|?:k}0wvUuY]ݭ&l4HH-N*dB*)Zojx)ꛩړ֘b?fG[(g xKI#$8#ZCb$Q8g $50[G, ӆpXB`{N5CseY1+h=nρyp]òxn@͹ pW)1+Q~F8.lGZ\Y[LKӀuM݃LmisE68[\ ZtmY B盄Ǵ2&/heU>ܵ01s.".#{o ?'58:)4Pr5aB ̰yL9EE~ Ԋ2ݳ-Bp84nqX\~ m@bЭ+IVInG>+6q>q%RY>&ꞗU OiRVmS̷}3ϩ3@eE"'VIm 2fٖ Qwc,[NV&lӱqȶ U7ZE 6mB;y%)L>^,VekZzrQnnͶ$p{b\h ^3m-TEnQV]yѯ0-U/zs*z̦ێEP55MɚƉ/eZ-F7^rs-[G:~a:^%mêECvohe'FϽAwqU:r%$wU=ۡ$uEԱK ]5"`jCZ׸WRG?t*8Z@dW{"X~E%$n{{]Mެ5*nV DR9s!c 40 Mb) KERNEL vmlinuz-__TCOS_KERNEL__ APPEND ramdisk_size=65536 initrd=initramfs-__TCOS_KERNEL__ root=/dev/ram0 boot=tcos quiet label nfs MENU LABEL TCOS ^NFS ( RAM < 40 Mb) KERNEL vmlinuz-__TCOS_KERNEL__ APPEND ramdisk_size=32768 initrd=initramfs-__TCOS_KERNEL__-nfs root=/dev/ram0 boot=tcos quiet label local __TCOS_NETBOOT_HIDE_LOCAL__MENU HIDE MENU LABEL LOCAL ( boot from ^local HDD) LOCALBOOT 0x80 label install __TCOS_NETBOOT_HIDE_INSTALL__MENU HIDE MENU LABEL TCOS ( ^install images on HDD) KERNEL vmlinuz-__TCOS_KERNEL__ APPEND ramdisk_size=65536 initrd=initramfs-__TCOS_KERNEL__ root=/dev/ram0 boot=tcos quiet startx=N installer label update __TCOS_NETBOOT_HIDE_INSTALL__MENU HIDE MENU LABEL TCOS ( ^update installed images on HDD) KERNEL vmlinuz-__TCOS_KERNEL__ APPEND ramdisk_size=65536 initrd=initramfs-__TCOS_KERNEL__ root=/dev/ram0 boot=tcos quiet startx=N installer-update tcos-0.89.93ubuntu2/tcos/tcos.dnsmasq.conf0000664000000000000000000000246612260610261015331 0ustar # # /etc/dnsmasq.conf settings for TCOS server # # put server IP here listen-address=192.168.0.254 # range of thin clients (example 1 to 253) dhcp-range=192.168.0.1,192.168.0.253,12h # router IP (or server IP) here dhcp-option=option:router,192.168.0.254 # put server IP (not know if really needed) dhcp-option=option:tftp-server,192.168.0.254 # TCOS default filename (don't change) dhcp-boot=/tcos/pxelinux.0 # set DHCP server autorative dhcp-authoritative # enable builtin TFTP server (disable atftpd from /etc/inetd.conf) enable-tftp # TFTPBOOT root dir (/var/lib/tftpboot or /srv/tftp) # if change, exec "dpkg-reconfigure initramfs-tools" after tftp-root=/var/lib/tftpboot # # If you boot thin clients with gPXE floppy/CDROM/EEPROM # edit /etc/default/dnsmasq: # # DNSMASQ_OPTS="--dhcp-no-override" # ############################################### # optional # # allocate IP for a given MAC # ############################################### # Example: # # MAC=11:22:33:44:55:66 # IP=192.168.0.100 # HOSTNAME=PC01 # reserve IP for a given MAC #dhcp-host=11:22:33:44:55:66,192.168.0.100 # reserve IP and give hostname #dhcp-host=11:22:33:44:55:66,PC01,192.168.0.100,12h # see more examples at # /usr/share/doc/dnsmasq-base/examples/dnsmasq.conf.example tcos-0.89.93ubuntu2/tcos/dhcpd-without-mac.conf0000664000000000000000000000157112260610261016231 0ustar # dhcpd.conf # from: http://www.ubuntu-es.org/node/20079 ddns-update-style ad-hoc; option subnet-mask 255.255.255.0; option broadcast-address 192.168.0.255; option routers 192.168.0.1; option domain-name-servers 192.168.0.1; option domain-name "tcos-domain.org"; option option-128 code 128 = string; option option-129 code 129 = text; get-lease-hostnames true; # REPLACE WITH YOUR SERVER IP (192.168.0.3 is an example) next-server 192.168.0.3; #option root-path "192.168.0.3:/var/lib/tcos"; shared-network WORKSTATIONS { subnet 192.168.0.0 netmask 255.255.255.0 { range dynamic-bootp 192.168.0.11 192.168.0.30; filename "/tcos/pxelinux.0"; # All thin clients boot from PXE (floppy or NIC BIOS) # (we can add static addresses here too) #host host01 { # hardware ethernet 00:E0:06:E8:00:84; # fixed-address 192.168.0.101; #} } } tcos-0.89.93ubuntu2/tcos/logo.lss0000664000000000000000000002471112260610261013525 0ustar = # 1( 7?0"&8&&&#-?<<<RRRRRRRRRRRRRRRRhDgdagF gRDEDfDFPDb& f6D!3R3DDb& fFD1#UP0#0dmpDc& gFDPD3Q3da 0Db& hFD3Q3caDb& gFD3QU3U3Ca Db& h6D@3_3CaDa& gFD33S3Ca Da hFD0`VdD3R3Ca Da hFDoVo6DD!3Ru3daDahFDoF`D!3Qu3dAp DahFDo6aD!3Qe3daDahFDn6A2U5#@F` DagFDo&0 @1U5#0DagFDn6 M2U430FP dg6Do6 K1U5#0FP DagFDn6 I2U4#0Dag6Do6 It1#U3#0dadfFDmF Ht1U3#0dA@ Daf6Dn6μp Gt1U3#@de6DnFͼ Gd1U2#@F0 de6DnF̼܈Gd1U2#@F0 df&Dn6̼܈FT1U1#0F f ]fBf̋hD3!ca MfBf#̋hD30F MfBf ̊hD3DMfAf̳; ̋hD!3!DF ddD`&Ɍ \eDa@dadc&D`&| L9ETDE=fAfx̳;̄XFE=fAfx̳;@LEEF dbD`&l,?\EE--fAfx̲; .̅hD Pd-fA$@fx̲; >̇XD @=F$@fx̲;^̇XFDa=F$@fh̲0~̉XD 0F -fAfx̲0ɌECa -fAfh̵0˜dD 0dF d-F$@fh̶0 ̈HFBa-F$@fx̲̲ ̈XFAa-fA@fh̳;̱̉HFAdbDDg&L, PEF -F$@tfx̲+̲̉XF@F -fA@tfh̲+̱ ̈HF@F dbDDf\,9, E-dbDDf\I, |eDka =F@dfh~̲̲̇XFF -FATfh~̲̲̆XFF -fA@Tfhn̲+̱̇HFF dbDhL, |dDkB -fA@Dfh^̲̲̇HfA F -fA@Dfh^̱̱̇HfA F -FADhN̲̲ |eDjadbDdL,y|eDja-FA4fXN+̱`!̇XF F -FA4fXN̲>@#̇XF f-fA@4fX.̲̲N0$̇XF -F dobDDc\<ipleDja-F@DX̴̲n(̆XF0F -fA@DX̲;̲n)̆XF0F -F@DX̲Ḵ~)̇XfA0F -FA4fH̷k̲*̇XfAad_a Dc|y?|eDj@F -FB4X̶;̱.*̇XF@-F fAB4H̶+̱.+̇XF@-F -FA4X̵;̲+̇XF@-F dOa Dc\9,lfDibFB4f8̶;;㼙+̆hFPF fAB4H̵+;.̱*̇hFPF FB$fH̵;K^*̇hFPF FB4H̶{~*̇hFPF dFB4H̸+鮼;*̇XfAPF FB4H޼[)̆hF`F fAB4H.{(̇hF`F FADH ̱(̇hF`F d?a DcLlgDiad?m Dc\p|fDiadFBDHṉ'̇hfAaFBDH &̇hFpF d?a Dcl9@|gDiad?m0Dc\i0|fDiaFC4H K#̇hfApF FC4\` lgDF fABD\`|fDiaFCD|`ɻfDiaFCD|<@ɻ |gDF FCD|` gDi aFCD|,P0|gDi aD DẌxFbFCT|,P0@|gDi b?m0DX.+̇fA-F ?m0DXK. ̈xfAfA ?m0DeČ̉fB-F /m`Dh  >~̉fBfA /m`Dẖ ~̉fB-F /mGd 0Ƭi&Di bDh^̋fBfA Dh ̱^̋fCF Dx^̌fC-F Dx0̌fCF D`̱̌fC-F Dp̱̏fBfA D̠̱fC-F D^̱fC-F dBL 9p mFDibdBM , mFDja-D+fD -fdAN =`FDibdAO 9`VDjcp DfEf@=F0 `1#FĈ` `VDjcDdM3qD fEfP=fA@ fA3Q%31Dm`aVDjcdP1U7CBAfFfp=fA` dP1U;Bf:fFf-=fAp `1U:Bf0fHf==fA 1U9#B@f&fGf-=fA 1#U5C0D`fPahDl6d1PD`ֈjDmFdD2pD@aD`V dD3CDaDbdfD@`f!d&D D`cv#e&DDbv'e&DD@bv+f&DD`/gDDp`4g&DD` :i&DDbfGhFDDb6dj6DDc6dl6DDdVNoVDDdf2@`fDDepdvDDhbD@Dm aD `D@`D`D DPD0DRRRRRRDgDb6Ap-fg.mD!fgadpadp,Fg,Qdp,Qdf,aFA`̂f+&,f,f ,f *p,Qf *p,QfdmFG@dACA ,QdHC`@ _0@ Qda/@X8(b88@8( ,EfE$`8(@@/0 P(P,E,݆F(((P(Da<fH-F(((AeAp 0Ն|QFGH`@@Fa(( ,ĈeЄ ((Fa 0 d`̂el`@@ `0QF`@@ `00,E@ ((Fa(( ,E `@@ `0Ё0,EL((Fa(0(,Ad F`@@ `@(P(@P̂e @-`@@ `Ph@H8 ̂e ` D`@@ ``PH@,e DDpD,e,E,Ad@LQF@LE ,e@LdABf00Bc@f0-P ,AdOLce @fD,e Dav2aF 0FC @a0M`  0FP ,AdFfMC0P D0M`e ,EfDafd/FD$MBMcM0M`cDP ,Qd6DdfDfAbmeD@fAcm0D0,GfH@``C @,HD@f5F,pa, ad;,FAd;̂ Af;́`1f;D(D́c1f;K1D;K1FK1FK1<cBB!Fc@BPPHRRRRRRRRRRRRRRRRRRRRR' yz**:y0`:"""P""P""":""`"qzz|'yzrz'{*u#.wj@rtz"J'+zrtЧPr'$wjw:wJ'*wjrtr**p**r"("y"u#-ysx'' *0r @w:rx(y )#::prxr(#**:P: P'{)#"zs*:`r+s::prx:r:p:P:rG0 p@z: 0:rG@r-s::x:r:p:P:"Z Zw##u7`Zw"pu70Zw#pu'uw#qu70Zw#r#%yt7%"u7ZwZs::x:r:p:P:r0:'xs0JP:'J's$!t%t#Jw# ty$w#Z)$#: JPJ0Jys::x:r:p:P:rt"$($usJ@JP::`:`$v#psJ:rtys%J`$%ss::x:r:p:P:*0::`JJus&:`$&sv#p#j sy#*p::`:p:s::x:r:p:P: P::p:@P:p:s:sv#:':::sp#v#w#sJJp:x#:x#w#u#y#y:@P:x#:ps:`:sz:::sp#v#'#sJ'sp:p:p#w#w#u#y#y#w#Ju:s:p:`:spuq#y#/s'sp#v#'#:`J`::`J`::ptJP:::`J$supJ:p:`:PJq#pG ::$v#p#&s'#:Pj@JJ@r%usJPZP:@J$JP:@:P:&:s's%$us!stJ:PJq#J`:xt  Zr$"x"JJ rwr$0J'wtxt"J0JP:%%:pJ'"t$J %xtpJp'"t J:pJP:x  0p:'w0~r` sx.0'''q"r :  @ʧ@ ':   ')v~:wP  *0 :)/``'rr#*"*"zrxw}:"'vy#*"*@0*x z'(z r'(z rwu@rx#0rwP"|w$0rxpPz'tq,xrG`rGrG`rGrG"PrWpr&wPr%w$swJw%wrG rg"rw&wPr!wprG`w!/wZx):0y#)*:):y)rJyr7zɧzȢ{ȧ'Ȫw~"RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRtcos-0.89.93ubuntu2/tnc/0000775000000000000000000000000012260610427011655 5ustar tcos-0.89.93ubuntu2/tnc/Makefile0000664000000000000000000000066412260610261013317 0ustar TNC = tnc SOURCE = tcos-net-controller.c #LIBS= -I/usr/lib LDADD += $(LDFLAGS) -ansi -pedantic -Wall $(LIBS) $(CFLAGS) GCC=gcc all: $(TNC) include ../common.mk $(TNC): $(QUIET_CC)$(CC) $(SOURCE) $(CFLAGS) $(LDADD) -o $(TNC) debug: $(CC) $(SOURCE) $(LDADD) -o $(TNC) -DDEVNULL="\"\"" -DDEBUG clean: $(QUIET_CL)rm -f $(TNC) *~ install: mkdir -p $(DESTDIR)/$(TCOS_BINS) install -m 700 $(TNC) $(DESTDIR)/$(TCOS_BINS)/ tcos-0.89.93ubuntu2/tnc/tcos-net-controller.c0000664000000000000000000003372112260610261015740 0ustar /* * tcos-net-controller.c * => iptables controller * Copyright (C) 2006,2007,2008 mariodebian at gmail * Copyright (C) 2006,2007,2008 vidal_joshur at gva.es * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define GROUP "tcos" #define IPTABLES "/sbin/iptables" #define BLACKLIST_PORTS "8998,8999" #define BSIZE 1024 #ifndef DEVNULL #define DEVNULL "2>/dev/null" #endif #define UNUSED(x) ((void)(x)) void create_route(struct rtentry *p, char **args); char *strncpy( char *to, const char *from, size_t count ); FILE *popen(const char *orden, const char *tipo); int pclose(FILE *flujo); void *malloc(size_t size); int getgroups(int size, gid_t list[]); /* int strcmp(const char *str1, const char *str2); */ char *strtok( char *str1, const char *str2 ); int getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, size_t hostlen, char *serv, size_t servlen, int flags); #define MAXTOKENS 256 #define MAXLINE 1024 /* fgets buff */ #define MINLEN 3 /* skip lines shorter as */ /* split string into tokens, return token array */ /* http://www.c.happycodings.com/Miscellaneous/code37.html */ char **split(char *string, char *delim) { char **tokens = NULL; char *working = NULL; char *token = NULL; int idx = 0; tokens = malloc(sizeof(char *) * MAXTOKENS); if(tokens == NULL) return NULL; working = malloc(sizeof(char) * strlen(string) + 1); if(working == NULL) return NULL; /* to make sure, copy string to a safe place */ strcpy(working, string); for(idx = 0; idx < MAXTOKENS; idx++) tokens[idx] = NULL; token = strtok(working, delim); idx = 0; /* always keep the last entry NULL termindated */ while((idx < (MAXTOKENS - 1)) && (token != NULL)) { tokens[idx] = malloc(sizeof(char) * strlen(token) + 1); if(tokens[idx] != NULL) { strcpy(tokens[idx], token); idx++; token = strtok(NULL, delim); } } free(working); return tokens; } #ifdef DEBUG /* debug print to stderr */ void debug( const char *format_str, ... ) { va_list ap; va_start( ap, format_str ); va_end( ap ); fprintf(stderr, "TNC-DEBUG::"); vfprintf(stderr, format_str , ap); } #endif int check_port (char* port) { char blacklist[] = BLACKLIST_PORTS; char *delim = ","; char **tokens = NULL; int i=0,j; if (atoi(port) > 65535 || atoi(port) < 1) { #ifdef DEBUG debug("check_port() Incorrect port: %s\n", port); #endif i=1; return(i); } tokens = split(blacklist, delim); for(j = 0; tokens[j] != NULL; j++){ #ifdef DEBUG debug("check_port(): token=%s ¿=? port=%s\n", tokens[j], port); #endif if (atoi(port) == atoi(tokens[j])) { i=1; } } for(j = 0; tokens[j] != NULL; j++) { free(tokens[j]); } free(tokens); return i; } static unsigned int get_uid (const char* user) { struct passwd *pw = NULL; uid_t value=0; pw = getpwnam(user); if (pw == NULL) return value; else return pw->pw_uid; } static char *get_group (gid_t gid) { struct group *grp = NULL; grp = getgrgid (gid); if (grp == NULL) return ""; else return grp->gr_name; } int check_user () { gid_t *list; int i,n,found=0; uid_t uid, euid; if ((n = getgroups(0, NULL)) < 0) { found=0; } list = (gid_t*)malloc(sizeof (gid_t) * (n + 1)); if (!list) { #ifdef DEBUG debug("check_user() out of memory!\n"); #endif found=0; } n = getgroups(n, list); uid = getuid(); euid = geteuid(); if (uid == 0 && euid == 0) { found=1; } else { for (i = 0; i < n; i++) { #ifdef DEBUG debug("check_user() %lu (%s) %d %d\n", (unsigned long)list[i], get_group(list[i]), uid, euid); #endif if ( (strcmp( get_group(list[i]), GROUP) == 0) && (euid == 0) ) { /* Only work if euid is root */ found=1; } } } free(list); return(found); } int status_iptables_user(char *args) { FILE *fp; char cmd[BSIZE]; char line[BSIZE]; char *fret; UNUSED(fret); /* iptables rules with tcos argument, allow not remove other rules. */ sprintf( cmd, "%s -L OUTPUT --line-numbers -n %s | grep TCOS_TNC | awk 'BEGIN{count=0}{if ($(NF-3) == %d || $(NF-3) == \"%s\") count++}END{print count}'", IPTABLES, DEVNULL, (int)get_uid(args), args); #ifdef DEBUG debug("status_iptables_user() %s\n",cmd); #endif if ((fp=(FILE*)popen(cmd, "r")) != NULL) { fret=fgets( line, sizeof line, fp); pclose(fp); if ( line[strlen(line)-1] == '\n' ) line[strlen(line)-1] = 0; if ( strcmp( line, "0") != 0 ) return(1); } return(0); } int flush_iptables_user(char *arg1, char *arg2) { FILE *fp; char cmd[BSIZE]; char *substring; char line[BSIZE]; int i; char *delim = " "; char **tokens = NULL; char *fret; UNUSED(fret); if ( (i = status_iptables_user(arg1)) == 0) return(1); substring = (char*) malloc(strlen(arg2)); strncpy(substring, arg2+13, strlen(arg2)); if ( strcmp( substring, "no") == 0 ) { sprintf( cmd, "%s -L OUTPUT --line-numbers -n %s | grep TCOS_TNC | awk '{if ($(NF-3) == %d || $(NF-3) == \"%s\") print $1}' | tac | tr \"\\n\" \" \"", IPTABLES, DEVNULL, (int)get_uid(arg1), arg1); } else { sprintf( cmd, "%s -L OUTPUT --line-numbers -n %s | grep TCOS_TNC | awk '{if (($(NF-3) == %d || $(NF-3) == \"%s\") && ($3 == \"tcp\")) print $1}' | tac | tr \"\\n\" \" \"", IPTABLES, DEVNULL, (int)get_uid(arg1), arg1); } free(substring); if ((fp=(FILE*)popen(cmd, "r")) != NULL) { fret=fgets( line, sizeof line, fp); pclose(fp); if( line[strlen(line)-1] == '\n' ) line[strlen(line)-1] = 0; tokens = split(line, delim); for(i = 0; tokens[i] != NULL; i++){ sprintf( cmd, "%s -D OUTPUT %s %s", IPTABLES, tokens[i], DEVNULL); #ifdef DEBUG debug("flush_iptables_user() %s\n",cmd); #endif if ((fp=(FILE*)popen(cmd, "r")) != NULL) pclose(fp); } for(i = 0; tokens[i] != NULL; i++) { free(tokens[i]); } free(tokens); return(1); } return(0); } int add_iptables_user(char **args) { FILE *fp; char cmd[BSIZE]; char *substring; char dirred[BSIZE]; int i=0,j; char *delim = ","; char **tokens = NULL; char *fret; UNUSED(fret); /* Delete rules that already exists for user*/ flush_iptables_user(args[5], args[2]); /* Obtain network destination */ sprintf( cmd, "ip route %s | awk '{if ($3 == \"%s\") print $1}'", DEVNULL, args[4]); #ifdef DEBUG debug("add_iptables_user() dired cmd=%s\n",cmd); #endif if ((fp=(FILE*)popen(cmd, "r")) != NULL) { fret=fgets( dirred, sizeof dirred, fp); pclose(fp); if( dirred[strlen(dirred)-1] == '\n' ) dirred[strlen(dirred)-1] = 0; } else { return(0); } /* block ports if especified*/ if(strstr(args[3], "--ports=")) { substring = (char*) malloc(strlen(args[3])); strncpy(substring, args[3]+8, strlen(args[3])); #ifdef DEBUG debug("add_iptables_user() substring='%s'\n",substring); #endif tokens = split(substring, delim); for(j = 0; tokens[j] != NULL; j++){ if (check_port(tokens[j]) == 0) { sprintf( cmd, "%s -A OUTPUT -p tcp --dport %s -m owner --uid-owner %s -m comment --comment TCOS_TNC -j DROP %s", IPTABLES, tokens[j], args[5], DEVNULL); #ifdef DEBUG debug("add_iptables_user() cmd=%s\n",cmd); #endif if ((fp=(FILE*)popen(cmd, "r")) != NULL) pclose(fp); } } for(j = 0; tokens[j] != NULL; j++) { free(tokens[j]); } free(tokens); free(substring); i=1; } substring = (char*) malloc(strlen(args[2])); strncpy(substring, args[2]+13, strlen(args[2])); #ifdef DEBUG debug("add_iptables_user() only-ports='%s'\n",substring); #endif if ( strcmp( substring, "no") == 0 ) { /* Allow loopback for user*/ sprintf( cmd, "%s -A OUTPUT -d 127.0.0.0/8 -m owner --uid-owner %s -m comment --comment TCOS_TNC -j ACCEPT %s", IPTABLES, args[5], DEVNULL); #ifdef DEBUG debug("add_iptables_user() cmd=%s\n",cmd); #endif if ((fp=(FILE*)popen(cmd, "r")) != NULL) { i=1; pclose(fp); } else { return(0); } /* Block output ! network*/ sprintf( cmd, "%s -A OUTPUT -d ! %s -m owner --uid-owner %s -m comment --comment TCOS_TNC -j DROP %s", IPTABLES, dirred, args[5], DEVNULL); #ifdef DEBUG debug("add_iptables_user() cmd=%s\n",cmd); #endif if ((fp=(FILE*)popen(cmd, "r")) != NULL) { i=1; pclose(fp); } else { return(0); } } free(substring); return i; } char *ip_by_eth(char *dev) { struct ifaddrs *ifaddr, *ifa; int family, s; static char host[255]="error"; if (getifaddrs(&ifaddr) == -1) { perror("getifaddrs"); return host; } for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { family = ifa->ifa_addr->sa_family; if( strcmp( dev, ifa->ifa_name) == 0 ) { if (family == AF_INET) { s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in), host, 255, NULL, 0, 1); if (s != 0) { return "error"; } /*fprintf(stderr, "iface=%s ip=%s\n", ifa->ifa_name, host);*/ return host; } } } freeifaddrs(ifaddr); return host; } int add_route( char **args ) { struct rtentry route; int i = 1; int fd; create_route(&route, args); if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) return 0; /* del the route if its set before */ ioctl( fd, SIOCDELRT, &route ); if( ioctl( fd, SIOCADDRT, &route ) < 0) { i = 0; } close( fd ); return i; } int del_route(char **args) { struct rtentry route; int i = 1; int fd; create_route(&route, args); if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) return 0; /* del the route if its set before */ if (ioctl( fd, SIOCDELRT, &route ) < 0) { i = 0; } close( fd ); return i; } int main(int argc, char **argv) { int i=0; i = check_user(); if (argc < 2) { return(1); } if (i == 0) { printf("denied"); return(1); } if ( strcmp( argv[1], "disable-internet") == 0 && argc == 6) { i = add_iptables_user(argv); if (i == 0) { flush_iptables_user(argv[5], argv[2]); printf("disable-error"); } else { printf("disabled"); } } else if ( strcmp( argv[1], "enable-internet") == 0 && argc == 4) { i = flush_iptables_user(argv[3], argv[2]); if (i == 0) { printf("enable-error"); } else { printf("enabled"); } } else if ( strcmp( argv[1], "status") == 0 && argc == 3) { i = status_iptables_user(argv[2]); if (i == 0) { printf("enabled"); } else { printf("disabled"); } } else if ( strcmp( argv[1], "route-add") == 0 && argc == 5) { i = add_route(argv); if (i == 0) { printf("error"); } else { printf("ok"); } } else if ( strcmp( argv[1], "route-del") == 0 && argc == 5) { i = del_route(argv); if (i == 0) { printf("error"); } else { printf("ok"); } } else if ( strcmp( argv[1], "ip") == 0 && argc == 3) { /*fprintf(stderr, "ip_by_eth(%s)=%s\n", argv[2], ip_by_eth(argv[2]));*/ printf("%s\n", ip_by_eth(argv[2])); } else { fprintf(stderr, "ERROR => Bad command line arguments\n"); fprintf(stderr, "tnc :: tcos-net-controller usage\n"); fprintf(stderr, "\t tnc disable-internet --only-ports=[yes,no] --ports=[AA,BB,CC] ethX username\n"); fprintf(stderr, "\t tnc enable-internet --only-ports=[yes,no] username\n"); fprintf(stderr, "\t tnc route-add ip-multicast netmask ethX\n"); fprintf(stderr, "\t tnc route-del ip-multicast netmask ethX\n"); fprintf(stderr, "\t tnc status username\n"); fprintf(stderr, "\t tnc ip [iface]\n\n"); return(1); } return(0); } void create_route(struct rtentry *p, char **args) { struct sockaddr_in singw, sindst, sinmask; /*char mask[]="255.255.0.0";*/ memset( &singw, 0, sizeof( struct sockaddr ) ); memset( &sindst, 0, sizeof( struct sockaddr ) ); memset( &sinmask, 0, sizeof( struct sockaddr ) ); singw.sin_family = AF_INET; sindst.sin_family = AF_INET; sinmask.sin_family = AF_INET; sindst.sin_addr.s_addr = inet_addr( args[2] ); if ( strcmp( ip_by_eth(args[4]), "error") == 0 ) { return; } singw.sin_addr.s_addr = inet_addr( ip_by_eth(args[4]) ); sinmask.sin_addr.s_addr = inet_addr( args[3] ); memset( p, 0, sizeof( struct rtentry ) ); (*p).rt_dst = *(struct sockaddr *)&sindst; (*p).rt_gateway = *(struct sockaddr *)&singw; (*p).rt_genmask = *(struct sockaddr *)&sinmask; (*p).rt_flags = RTF_GATEWAY; } tcos-0.89.93ubuntu2/tmixer/0000775000000000000000000000000012260610427012401 5ustar tcos-0.89.93ubuntu2/tmixer/tmixer-alsa.c0000664000000000000000000015241212260610261014774 0ustar /* * ALSA command line mixer utility * Copyright (c) 1999-2000 by Jaroslav Kysela * * Modifications to show parseable output by: * Mario Izquierdo (mariodebian) * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include #include #include #include #include #include #include #include "tmixer-alsa.h" #define LEVEL_BASIC (1<<0) #define LEVEL_INACTIVE (1<<1) #define LEVEL_ID (1<<2) static int quiet = 0; static int debugflag = 0; static int no_check = 0; static int smixer_level = 0; static int ignore_error = 0; static struct snd_mixer_selem_regopt smixer_options; static char card[64] = "default"; static void error(const char *fmt,...) { va_list va; va_start(va, fmt); fprintf(stderr, "tmixer-alsa: "); vfprintf(stderr, fmt, va); fprintf(stderr, "\n"); va_end(va); } static int help(void) { printf("Usage: tmixer-alsa [command]\n"); printf("\nAvailable options:\n"); printf(" -h,--help this help\n"); printf(" -c,--card N select the card\n"); printf(" -D,--device N select the device, default '%s'\n", card); printf(" -d,--debug debug mode\n"); printf(" -n,--nocheck do not perform range checking\n"); printf(" -v,--version print version of this program\n"); printf(" -q,--quiet be quiet\n"); printf(" -i,--inactive show also inactive controls\n"); printf(" -a,--abstract L select abstraction level (none or basic)\n"); printf(" -s,--stdin Read and execute commands from stdin sequentially\n"); printf("\nAvailable commands:\n"); printf(" scontrols show all mixer simple controls\n"); printf(" scontents show contents of all mixer simple controls (default command)\n"); printf(" sset sID P set contents for one mixer simple control\n"); printf(" sget sID get contents for one mixer simple control\n"); printf(" controls show all controls for given card\n"); printf(" contents show contents of all controls for given card\n"); printf(" cset cID P set control contents for one control\n"); printf(" cget cID get control contents for one control\n"); printf("\ntmixer-alsa output format:\n"); printf(" ChannelName, ChannelType [volume|switch] , Volume in %% , SwitchStatus [on|off] \n\n"); return 0; } static int info(void) { int err; snd_ctl_t *handle; snd_mixer_t *mhandle; snd_ctl_card_info_t *info; snd_ctl_elem_list_t *clist; snd_ctl_card_info_alloca(&info); snd_ctl_elem_list_alloca(&clist); if ((err = snd_ctl_open(&handle, card, 0)) < 0) { error("Control device %s open error: %s", card, snd_strerror(err)); return err; } if ((err = snd_ctl_card_info(handle, info)) < 0) { error("Control device %s hw info error: %s", card, snd_strerror(err)); return err; } printf("Card %s '%s'/'%s'\n", card, snd_ctl_card_info_get_id(info), snd_ctl_card_info_get_longname(info)); printf(" Mixer name : '%s'\n", snd_ctl_card_info_get_mixername(info)); printf(" Components : '%s'\n", snd_ctl_card_info_get_components(info)); if ((err = snd_ctl_elem_list(handle, clist)) < 0) { error("snd_ctl_elem_list failure: %s", snd_strerror(err)); } else { printf(" Controls : %i\n", snd_ctl_elem_list_get_count(clist)); } snd_ctl_close(handle); if ((err = snd_mixer_open(&mhandle, 0)) < 0) { error("Mixer open error: %s", snd_strerror(err)); return err; } if (smixer_level == 0 && (err = snd_mixer_attach(mhandle, card)) < 0) { error("Mixer attach %s error: %s", card, snd_strerror(err)); snd_mixer_close(mhandle); return err; } if ((err = snd_mixer_selem_register(mhandle, smixer_level > 0 ? &smixer_options : NULL, NULL)) < 0) { error("Mixer register error: %s", snd_strerror(err)); snd_mixer_close(mhandle); return err; } err = snd_mixer_load(mhandle); if (err < 0) { error("Mixer load %s error: %s", card, snd_strerror(err)); snd_mixer_close(mhandle); return err; } printf(" Simple ctrls : %i\n", snd_mixer_get_count(mhandle)); snd_mixer_close(mhandle); return 0; } static const char *control_iface(snd_ctl_elem_id_t *id) { return snd_ctl_elem_iface_name(snd_ctl_elem_id_get_interface(id)); } static const char *control_type(snd_ctl_elem_info_t *info) { return snd_ctl_elem_type_name(snd_ctl_elem_info_get_type(info)); } static const char *control_access(snd_ctl_elem_info_t *info) { static char result[10]; char *res = result; *res++ = snd_ctl_elem_info_is_readable(info) ? 'r' : '-'; *res++ = snd_ctl_elem_info_is_writable(info) ? 'w' : '-'; *res++ = snd_ctl_elem_info_is_inactive(info) ? 'i' : '-'; *res++ = snd_ctl_elem_info_is_volatile(info) ? 'v' : '-'; *res++ = snd_ctl_elem_info_is_locked(info) ? 'l' : '-'; *res++ = snd_ctl_elem_info_is_tlv_readable(info) ? 'R' : '-'; *res++ = snd_ctl_elem_info_is_tlv_writable(info) ? 'W' : '-'; *res++ = snd_ctl_elem_info_is_tlv_commandable(info) ? 'C' : '-'; *res++ = '\0'; return result; } #define check_range(val, min, max) \ (no_check ? (val) : ((val < min) ? (min) : (val > max) ? (max) : (val))) #if 0 static int convert_range(int val, int omin, int omax, int nmin, int nmax) { int orange = omax - omin, nrange = nmax - nmin; if (orange == 0) return 0; return rint((((double)nrange * ((double)val - (double)omin)) + ((double)orange / 2.0)) / ((double)orange + (double)nmin)); } #endif #if 0 static int convert_db_range(int val, int omin, int omax, int nmin, int nmax) { int orange = omax - omin, nrange = nmax - nmin; if (orange == 0) return 0; return rint((((double)nrange * ((double)val - (double)omin)) + ((double)orange / 2.0)) / (double)orange + (double)nmin); } #endif /* Fuction to convert from volume to percentage. val = volume */ static int convert_prange(int val, int min, int max) { int range = max - min; int tmp; if (range == 0) return 0; val -= min; tmp = rint((double)val/(double)range * 100); return tmp; } /* Function to convert from percentage to volume. val = percentage */ #define convert_prange1(val, min, max) \ ceil((val) * ((max) - (min)) * 0.01 + (min)) static const char *get_percent(int val, int min, int max) { static char str[32]; int p; p = convert_prange(val, min, max); /*sprintf(str, "%i [%i%%]", val, p);*/ sprintf(str, "%i", p); return str; } #if 0 static const char *get_percent1(int val, int min, int max, int min_dB, int max_dB) { static char str[32]; int p, db; p = convert_prange(val, min, max); db = convert_db_range(val, min, max, min_dB, max_dB); sprintf(str, "%i [%i%%] [%i.%02idB]", val, p, db / 100, abs(db % 100)); return str; } #endif static long get_integer(char **ptr, long min, long max) { long val = min; char *p = *ptr, *s; if (*p == ':') p++; if (*p == '\0' || (!isdigit(*p) && *p != '-')) goto out; s = p; val = strtol(s, &p, 10); if (*p == '.') { p++; (void)strtol(p, &p, 10); } if (*p == '%') { val = (long)convert_prange1(strtod(s, NULL), min, max); p++; } val = check_range(val, min, max); if (*p == ',') p++; out: *ptr = p; return val; } static long get_integer64(char **ptr, long long min, long long max) { long long val = min; char *p = *ptr, *s; if (*p == ':') p++; if (*p == '\0' || (!isdigit(*p) && *p != '-')) goto out; s = p; val = strtol(s, &p, 10); if (*p == '.') { p++; (void)strtol(p, &p, 10); } if (*p == '%') { val = (long long)convert_prange1(strtod(s, NULL), min, max); p++; } val = check_range(val, min, max); if (*p == ',') p++; out: *ptr = p; return val; } struct volume_ops { int (*get_range)(snd_mixer_elem_t *elem, long *min, long *max); int (*get)(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t c, long *value); int (*set)(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t c, long value); }; enum { VOL_RAW, VOL_DB }; struct volume_ops_set { int (*has_volume)(snd_mixer_elem_t *elem); struct volume_ops v[2]; }; static int set_playback_dB(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t c, long value) { return snd_mixer_selem_set_playback_dB(elem, c, value, 0); } static int set_capture_dB(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t c, long value) { return snd_mixer_selem_set_capture_dB(elem, c, value, 0); } static const struct volume_ops_set vol_ops[2] = { { .has_volume = snd_mixer_selem_has_playback_volume, .v = {{ snd_mixer_selem_get_playback_volume_range, snd_mixer_selem_get_playback_volume, snd_mixer_selem_set_playback_volume }, { snd_mixer_selem_get_playback_dB_range, snd_mixer_selem_get_playback_dB, set_playback_dB }}, }, { .has_volume = snd_mixer_selem_has_capture_volume, .v = {{ snd_mixer_selem_get_capture_volume_range, snd_mixer_selem_get_capture_volume, snd_mixer_selem_set_capture_volume }, { snd_mixer_selem_get_capture_dB_range, snd_mixer_selem_get_capture_dB, set_capture_dB }}, }, }; static int set_volume_simple(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t chn, char **ptr, int dir) { long val, orig, pmin, pmax; char *p = *ptr, *s; int invalid = 0, err = 0, vol_type = VOL_RAW; if (! vol_ops[dir].has_volume(elem)) invalid = 1; if (*p == ':') p++; if (*p == '\0' || (!isdigit(*p) && *p != '-')) goto skip; if (! invalid && vol_ops[dir].v[VOL_RAW].get_range(elem, &pmin, &pmax) < 0) invalid = 1; s = p; val = strtol(s, &p, 10); if (*p == '.') { p++; (void)strtol(p, &p, 10); } if (*p == '%') { if (! invalid) val = (long)convert_prange1(strtod(s, NULL), pmin, pmax); p++; /* FIXME tmixer-alsa conversion lose original % because of 0-39 limits */ /*printf("DEBUG: pmin=%li pmax=%li val=%li\n",pmin,pmax,val);*/ } else if (p[0] == 'd' && p[1] == 'B') { if (! invalid) { val = (long)(strtod(s, NULL) * 100.0); vol_type = VOL_DB; if (vol_ops[dir].v[vol_type].get_range(elem, &pmin, &pmax) < 0) invalid = 1; } p += 2; } if (*p == '+' || *p == '-') { if (! invalid) { if (vol_ops[dir].v[vol_type].get(elem, chn, &orig) < 0) invalid = 1; if (*p == '+') val = orig + val; else val = orig - val; } p++; } if (! invalid) { val = check_range(val, pmin, pmax); err = vol_ops[dir].v[vol_type].set(elem, chn, val); } skip: if (*p == ',') p++; *ptr = p; return err ? err : (invalid ? -ENOENT : 0); } static int get_bool_simple(char **ptr, char *str, int invert, int orig) { if (**ptr == ':') (*ptr)++; if (!strncasecmp(*ptr, str, strlen(str))) { orig = 1 ^ (invert ? 1 : 0); while (**ptr != '\0' && **ptr != ',' && **ptr != ':') (*ptr)++; } if (**ptr == ',' || **ptr == ':') (*ptr)++; return orig; } static int simple_skip_word(char **ptr, char *str) { char *xptr = *ptr; if (*xptr == ':') xptr++; if (!strncasecmp(xptr, str, strlen(str))) { while (*xptr != '\0' && *xptr != ',' && *xptr != ':') xptr++; if (*xptr == ',' || *xptr == ':') xptr++; *ptr = xptr; return 1; } return 0; } static void show_control_id(snd_ctl_elem_id_t *id) { unsigned int index, device, subdevice; printf("numid=%u,iface=%s,name='%s'", snd_ctl_elem_id_get_numid(id), control_iface(id), snd_ctl_elem_id_get_name(id)); index = snd_ctl_elem_id_get_index(id); device = snd_ctl_elem_id_get_device(id); subdevice = snd_ctl_elem_id_get_subdevice(id); if (index) printf(",index=%i", index); if (device) printf(",device=%i", device); if (subdevice) printf(",subdevice=%i", subdevice); } static void print_spaces(unsigned int spaces) { while (spaces-- > 0) putc(' ', stdout); } static void print_dB(long dB) { printf("%li.%02lidB", dB / 100, (dB < 0 ? -dB : dB) % 100); } static void decode_tlv(unsigned int spaces, unsigned int *tlv, unsigned int tlv_size) { unsigned int type = tlv[0]; unsigned int size; unsigned int idx = 0; if (tlv_size < 2 * sizeof(unsigned int)) { printf("TLV size error!\n"); return; } print_spaces(spaces); printf("| "); type = tlv[idx++]; size = tlv[idx++]; tlv_size -= 2 * sizeof(unsigned int); if (size > tlv_size) { printf("TLV size error (%i, %i, %i)!\n", type, size, tlv_size); return; } switch (type) { case SND_CTL_TLVT_CONTAINER: size += sizeof(unsigned int) -1; size /= sizeof(unsigned int); while (idx < size) { if (tlv[idx+1] > (size - idx) * sizeof(unsigned int)) { printf("TLV size error in compound!\n"); return; } decode_tlv(spaces + 2, tlv + idx, tlv[idx+1]); idx += 2 + (tlv[1] + sizeof(unsigned int) - 1) / sizeof(unsigned int); } break; case SND_CTL_TLVT_DB_SCALE: printf("dBscale-"); if (size != 2 * sizeof(unsigned int)) { while (size > 0) { printf("0x%08x,", tlv[idx++]); size -= sizeof(unsigned int); } } else { printf("min="); print_dB((int)tlv[2]); printf(",step="); print_dB(tlv[3] & 0xffff); printf(",mute=%i", (tlv[3] >> 16) & 1); } break; #ifdef SND_CTL_TLVT_DB_LINEAR case SND_CTL_TLVT_DB_LINEAR: printf("dBlinear-"); if (size != 2 * sizeof(unsigned int)) { while (size > 0) { printf("0x%08x,", tlv[idx++]); size -= sizeof(unsigned int); } } else { printf("min="); print_dB(tlv[2]); printf(",max="); print_dB(tlv[3]); } break; #endif #ifdef SND_CTL_TLVT_DB_RANGE case SND_CTL_TLVT_DB_RANGE: printf("dBrange-\n"); if ((size / (6 * sizeof(unsigned int))) != 0) { while (size > 0) { printf("0x%08x,", tlv[idx++]); size -= sizeof(unsigned int); } break; } idx = 0; while (idx < size) { print_spaces(spaces + 2); printf("rangemin=%i,", tlv[0]); printf(",rangemax=%i\n", tlv[1]); decode_tlv(spaces + 4, tlv + 2, 6 * sizeof(unsigned int)); idx += 6 * sizeof(unsigned int); } break; #endif default: printf("unk-%i-", type); while (size > 0) { printf("0x%08x,", tlv[idx++]); size -= sizeof(unsigned int); } break; } putc('\n', stdout); } static int show_control(const char *space, snd_hctl_elem_t *elem, int level) { int err; unsigned int item, idx, count, *tlv; snd_ctl_elem_type_t type; snd_ctl_elem_id_t *id; snd_ctl_elem_info_t *info; snd_ctl_elem_value_t *control; snd_aes_iec958_t iec958; snd_ctl_elem_id_alloca(&id); snd_ctl_elem_info_alloca(&info); snd_ctl_elem_value_alloca(&control); if ((err = snd_hctl_elem_info(elem, info)) < 0) { error("Control %s snd_hctl_elem_info error: %s\n", card, snd_strerror(err)); return err; } if (level & LEVEL_ID) { snd_hctl_elem_get_id(elem, id); show_control_id(id); printf("\n"); } count = snd_ctl_elem_info_get_count(info); type = snd_ctl_elem_info_get_type(info); printf("%s; type=%s,access=%s,values=%i", space, control_type(info), control_access(info), count); switch (type) { case SND_CTL_ELEM_TYPE_INTEGER: printf(",min=%li,max=%li,step=%li\n", snd_ctl_elem_info_get_min(info), snd_ctl_elem_info_get_max(info), snd_ctl_elem_info_get_step(info)); break; case SND_CTL_ELEM_TYPE_INTEGER64: printf(",min=%Li,max=%Li,step=%Li\n", snd_ctl_elem_info_get_min64(info), snd_ctl_elem_info_get_max64(info), snd_ctl_elem_info_get_step64(info)); break; case SND_CTL_ELEM_TYPE_ENUMERATED: { unsigned int items = snd_ctl_elem_info_get_items(info); printf(",items=%u\n", items); for (item = 0; item < items; item++) { snd_ctl_elem_info_set_item(info, item); if ((err = snd_hctl_elem_info(elem, info)) < 0) { error("Control %s element info error: %s\n", card, snd_strerror(err)); return err; } printf("%s; Item #%u '%s'\n", space, item, snd_ctl_elem_info_get_item_name(info)); } break; } default: printf("\n"); break; } if (level & LEVEL_BASIC) { if ((err = snd_hctl_elem_read(elem, control)) < 0) { error("Control %s element read error: %s\n", card, snd_strerror(err)); return err; } printf("%s: values=", space); for (idx = 0; idx < count; idx++) { if (idx > 0) printf(","); switch (type) { case SND_CTL_ELEM_TYPE_BOOLEAN: printf("%s", snd_ctl_elem_value_get_boolean(control, idx) ? "on" : "off"); break; case SND_CTL_ELEM_TYPE_INTEGER: printf("%li", snd_ctl_elem_value_get_integer(control, idx)); break; case SND_CTL_ELEM_TYPE_INTEGER64: printf("%Li", snd_ctl_elem_value_get_integer64(control, idx)); break; case SND_CTL_ELEM_TYPE_ENUMERATED: printf("%u", snd_ctl_elem_value_get_enumerated(control, idx)); break; case SND_CTL_ELEM_TYPE_BYTES: printf("0x%02x", snd_ctl_elem_value_get_byte(control, idx)); break; case SND_CTL_ELEM_TYPE_IEC958: snd_ctl_elem_value_get_iec958(control, &iec958); printf("[AES0=0x%02x AES1=0x%02x AES2=0x%02x AES3=0x%02x]", iec958.status[0], iec958.status[1], iec958.status[2], iec958.status[3]); break; default: printf("?"); break; } } printf("\n"); if (!snd_ctl_elem_info_is_tlv_readable(info)) goto __skip_tlv; tlv = malloc(4096); if ((err = snd_hctl_elem_tlv_read(elem, tlv, 4096)) < 0) { error("Control %s element TLV read error: %s\n", card, snd_strerror(err)); free(tlv); return err; } decode_tlv(strlen(space), tlv, 4096); free(tlv); } __skip_tlv: return 0; } static int controls(int level) { int err; snd_hctl_t *handle; snd_hctl_elem_t *elem; snd_ctl_elem_id_t *id; snd_ctl_elem_info_t *info; snd_ctl_elem_id_alloca(&id); snd_ctl_elem_info_alloca(&info); if ((err = snd_hctl_open(&handle, card, 0)) < 0) { error("Control %s open error: %s", card, snd_strerror(err)); return err; } if ((err = snd_hctl_load(handle)) < 0) { error("Control %s local error: %s\n", card, snd_strerror(err)); return err; } for (elem = snd_hctl_first_elem(handle); elem; elem = snd_hctl_elem_next(elem)) { if ((err = snd_hctl_elem_info(elem, info)) < 0) { error("Control %s snd_hctl_elem_info error: %s\n", card, snd_strerror(err)); return err; } if (!(level & LEVEL_INACTIVE) && snd_ctl_elem_info_is_inactive(info)) continue; snd_hctl_elem_get_id(elem, id); show_control_id(id); printf("\n"); if (level & LEVEL_BASIC) show_control(" ", elem, 1); } snd_hctl_close(handle); return 0; } static int show_selem(snd_mixer_t *handle, snd_mixer_selem_id_t *id, const char *space, int level) { snd_mixer_selem_channel_id_t chn; long pmin = 0, pmax = 0; long cmin = 0, cmax = 0; // Allow control capture channels for rtp, mic..etc long pvol, cvol; //long pvol; int psw, csw; //int psw; int pmono, cmono, mono_ok = 0; /*long db;*/ snd_mixer_elem_t *elem; elem = snd_mixer_find_selem(handle, id); if (!elem) { error("Mixer %s simple element not found", card); return -ENOENT; } /* don't show enumerates */ if ( snd_mixer_selem_is_enumerated(elem) ) { /*printf("DEBUG ENUMERATE not show '%s'\n", snd_mixer_selem_id_get_name(id) ); printf(" enumerated %d\n", snd_mixer_selem_is_enumerated(elem));*/ return 0; } //if ( !snd_mixer_selem_has_playback_volume(elem) && snd_mixer_selem_has_capture_volume(elem) ) { /* don't show only capture channels */ // return 0; //} if ( level & LEVEL_BASIC ) { printf("%s,", snd_mixer_selem_id_get_name(id) ); /*printf("%sCapabilities:", space);*/ if( snd_mixer_selem_has_common_volume(elem) || snd_mixer_selem_has_playback_volume(elem) || snd_mixer_selem_has_capture_volume(elem) ) { printf("volume|"); } if ( snd_mixer_selem_has_common_switch(elem) || snd_mixer_selem_has_playback_switch(elem) || snd_mixer_selem_has_capture_switch(elem) ) { printf("switch|"); } printf(","); if (snd_mixer_selem_has_playback_volume(elem) || snd_mixer_selem_has_capture_volume(elem)) { /*printf("%sLimits:", space);*/ if (snd_mixer_selem_has_common_volume(elem)) { snd_mixer_selem_get_playback_volume_range(elem, &pmin, &pmax); snd_mixer_selem_get_capture_volume_range(elem, &cmin, &cmax); /*printf(" %li - %li", pmin, pmax);*/ } else { if (snd_mixer_selem_has_playback_volume(elem)) { snd_mixer_selem_get_playback_volume_range(elem, &pmin, &pmax); /*printf(" Playback %li - %li", pmin, pmax);*/ } if (snd_mixer_selem_has_capture_volume(elem)) { snd_mixer_selem_get_capture_volume_range(elem, &cmin, &cmax); /*printf(" Capture %li - %li", cmin, cmax);*/ } } /*printf("\n");*/ } pmono = snd_mixer_selem_has_playback_channel(elem, SND_MIXER_SCHN_MONO) && (snd_mixer_selem_is_playback_mono(elem) || (!snd_mixer_selem_has_playback_volume(elem) && !snd_mixer_selem_has_playback_switch(elem))); cmono = snd_mixer_selem_has_capture_channel(elem, SND_MIXER_SCHN_MONO) && (snd_mixer_selem_is_capture_mono(elem) || (!snd_mixer_selem_has_capture_volume(elem) && !snd_mixer_selem_has_capture_switch(elem))); if (pmono && snd_mixer_selem_has_playback_channel(elem, SND_MIXER_SCHN_MONO)) { if (!mono_ok) { /*printf("%s%s:", space, "Mono");*/ mono_ok = 1; } if (!snd_mixer_selem_has_common_volume(elem)) { if (snd_mixer_selem_has_playback_volume(elem)) { /*printf("Playback");*/ snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_MONO, &pvol); printf("%s", get_percent(pvol, pmin, pmax)); /*if (!snd_mixer_selem_get_playback_dB(elem, SND_MIXER_SCHN_MONO, &db)) { printf(" ["); print_dB(db); printf("]"); }*/ } } if (!snd_mixer_selem_has_common_switch(elem)) { if (snd_mixer_selem_has_playback_switch(elem)) { snd_mixer_selem_get_playback_switch(elem, SND_MIXER_SCHN_MONO, &psw); /*printf(" [%s]", psw ? "on" : "off");*/ printf(",%s", psw ? "on" : "off"); } } } if (pmono && snd_mixer_selem_has_capture_channel(elem, SND_MIXER_SCHN_MONO)) { if (!mono_ok) { /*printf("%s%s:", space, "Mono");*/ mono_ok = 1; } if (!snd_mixer_selem_has_common_volume(elem)) { if (snd_mixer_selem_has_capture_volume(elem)) { /*printf("Playback");*/ snd_mixer_selem_get_capture_volume(elem, SND_MIXER_SCHN_MONO, &cvol); printf("%s", get_percent(cvol, cmin, cmax)); /*if (!snd_mixer_selem_get_playback_dB(elem, SND_MIXER_SCHN_MONO, &db)) { printf(" ["); print_dB(db); printf("]"); }*/ } } if (!snd_mixer_selem_has_common_switch(elem)) { if (snd_mixer_selem_has_capture_switch(elem)) { snd_mixer_selem_get_capture_switch(elem, SND_MIXER_SCHN_MONO, &csw); /*printf(" [%s]", psw ? "on" : "off");*/ printf(",%s", csw ? "on" : "off"); } } } /*if (pmono || cmono) printf("\n");*/ if (!pmono || !cmono) { for (chn = 0; chn <= SND_MIXER_SCHN_LAST; chn++) { if ((pmono || !snd_mixer_selem_has_playback_channel(elem, chn)) && (cmono || !snd_mixer_selem_has_capture_channel(elem, chn))) continue; int printed=0; if (snd_mixer_selem_has_playback_channel(elem, chn)) { /*printf("==> %s%s:", space, snd_mixer_selem_channel_name(chn));*/ if (!pmono && !cmono && snd_mixer_selem_has_common_volume(elem)) { snd_mixer_selem_get_playback_volume(elem, chn, &pvol); printf("%s,", get_percent(pvol, pmin, pmax)); printed=1; } if (!pmono && !cmono && snd_mixer_selem_has_common_switch(elem)) { snd_mixer_selem_get_playback_switch(elem, chn, &psw); /*printf(" [%s]", psw ? "on" : "off");*/ printf("%s", psw ? "on" : "off"); printed=1; } if (!pmono && snd_mixer_selem_has_playback_channel(elem, chn)) { if (!snd_mixer_selem_has_common_volume(elem)) { if (snd_mixer_selem_has_playback_volume(elem)) { /*printf(" Playback");*/ snd_mixer_selem_get_playback_volume(elem, chn, &pvol); printf("%s,", get_percent(pvol, pmin, pmax)); printed=1; } } if (!snd_mixer_selem_has_common_switch(elem)) { if (snd_mixer_selem_has_playback_switch(elem)) { snd_mixer_selem_get_playback_switch(elem, chn, &psw); /*printf(" [%s]", psw ? "on" : "off");*/ printf("%s", psw ? "on" : "off"); printed=1; } } } } if (snd_mixer_selem_has_capture_channel(elem, chn)) { /*printf("==> %s%s:", space, snd_mixer_selem_channel_name(chn));*/ if (!pmono && !cmono && snd_mixer_selem_has_common_volume(elem)) { snd_mixer_selem_get_capture_volume(elem, chn, &cvol); printf("%s,", get_percent(cvol, cmin, cmax)); printed=1; } if (!pmono && !cmono && snd_mixer_selem_has_common_switch(elem)) { snd_mixer_selem_get_capture_switch(elem, chn, &csw); /*printf(" [%s]", psw ? "on" : "off");*/ printf("%s", csw ? "on" : "off"); printed=1; } if (!pmono && snd_mixer_selem_has_capture_channel(elem, chn)) { if (!snd_mixer_selem_has_common_volume(elem)) { if (snd_mixer_selem_has_capture_volume(elem)) { /*printf(" Playback");*/ snd_mixer_selem_get_capture_volume(elem, chn, &cvol); printf("%s,", get_percent(cvol, cmin, cmax)); printed=1; } } if (!snd_mixer_selem_has_common_switch(elem)) { if (snd_mixer_selem_has_capture_switch(elem)) { snd_mixer_selem_get_capture_switch(elem, chn, &csw); /*printf(" [%s]", psw ? "on" : "off");*/ printf("%s", csw ? "on" : "off"); printed=1; } } } } /* only want one channel */ if( printed > 0) { break; } /*printf("\n");*/ } } printf("\n"); } else { if ( strlen(snd_mixer_selem_id_get_name(id)) > 0 ) { printf("%s|", snd_mixer_selem_id_get_name(id) ); } } return 0; } static int selems(int level) { int err; snd_mixer_t *handle; snd_mixer_selem_id_t *sid; snd_mixer_elem_t *elem; snd_mixer_selem_id_alloca(&sid); if ((err = snd_mixer_open(&handle, 0)) < 0) { error("Mixer %s open error: %s", card, snd_strerror(err)); return err; } if (smixer_level == 0 && (err = snd_mixer_attach(handle, card)) < 0) { error("Mixer attach %s error: %s", card, snd_strerror(err)); snd_mixer_close(handle); return err; } if ((err = snd_mixer_selem_register(handle, smixer_level > 0 ? &smixer_options : NULL, NULL)) < 0) { error("Mixer register error: %s", snd_strerror(err)); snd_mixer_close(handle); return err; } err = snd_mixer_load(handle); if (err < 0) { error("Mixer %s load error: %s", card, snd_strerror(err)); snd_mixer_close(handle); return err; } for (elem = snd_mixer_first_elem(handle); elem; elem = snd_mixer_elem_next(elem)) { snd_mixer_selem_get_id(elem, sid); if (!(level & LEVEL_INACTIVE) && !snd_mixer_selem_is_active(elem)) continue; /*printf("Simple mixer control '%s',%i\n", snd_mixer_selem_id_get_name(sid), snd_mixer_selem_id_get_index(sid));*/ show_selem(handle, sid, " ", level); } snd_mixer_close(handle); return 0; } static int parse_control_id(const char *str, snd_ctl_elem_id_t *id) { int c, size, numid; char *ptr; while (*str == ' ' || *str == '\t') str++; if (!(*str)) return -EINVAL; snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_MIXER); /* default */ while (*str) { if (!strncasecmp(str, "numid=", 6)) { str += 6; numid = atoi(str); if (numid <= 0) { fprintf(stderr, "tmixer-alsa: Invalid numid %d\n", numid); return -EINVAL; } snd_ctl_elem_id_set_numid(id, atoi(str)); while (isdigit(*str)) str++; } else if (!strncasecmp(str, "iface=", 6)) { str += 6; if (!strncasecmp(str, "card", 4)) { snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_CARD); str += 4; } else if (!strncasecmp(str, "mixer", 5)) { snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_MIXER); str += 5; } else if (!strncasecmp(str, "pcm", 3)) { snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_PCM); str += 3; } else if (!strncasecmp(str, "rawmidi", 7)) { snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_RAWMIDI); str += 7; } else if (!strncasecmp(str, "timer", 5)) { snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_TIMER); str += 5; } else if (!strncasecmp(str, "sequencer", 9)) { snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_SEQUENCER); str += 9; } else { return -EINVAL; } } else if (!strncasecmp(str, "name=", 5)) { char buf[64]; str += 5; ptr = buf; size = 0; if (*str == '\'' || *str == '\"') { c = *str++; while (*str && *str != c) { if (size < (int)sizeof(buf)) { *ptr++ = *str; size++; } str++; } if (*str == c) str++; } else { while (*str && *str != ',') { if (size < (int)sizeof(buf)) { *ptr++ = *str; size++; } str++; } *ptr = '\0'; } snd_ctl_elem_id_set_name(id, buf); } else if (!strncasecmp(str, "index=", 6)) { str += 6; snd_ctl_elem_id_set_index(id, atoi(str)); while (isdigit(*str)) str++; } else if (!strncasecmp(str, "device=", 7)) { str += 7; snd_ctl_elem_id_set_device(id, atoi(str)); while (isdigit(*str)) str++; } else if (!strncasecmp(str, "subdevice=", 10)) { str += 10; snd_ctl_elem_id_set_subdevice(id, atoi(str)); while (isdigit(*str)) str++; } if (*str == ',') { str++; } else { if (*str) return -EINVAL; } } return 0; } static int parse_simple_id(const char *str, snd_mixer_selem_id_t *sid) { int c, size; char buf[128]; char *ptr = buf; while (*str == ' ' || *str == '\t') str++; if (!(*str)) return -EINVAL; size = 1; /* for '\0' */ if (*str != '"' && *str != '\'') { while (*str && *str != ',') { if (size < (int)sizeof(buf)) { *ptr++ = *str; size++; } str++; } } else { c = *str++; while (*str && *str != c) { if (size < (int)sizeof(buf)) { *ptr++ = *str; size++; } str++; } if (*str == c) str++; } if (*str == '\0') { snd_mixer_selem_id_set_index(sid, 0); *ptr = 0; goto _set; } if (*str != ',') return -EINVAL; *ptr = 0; /* terminate the string */ str++; if (!isdigit(*str)) return -EINVAL; snd_mixer_selem_id_set_index(sid, atoi(str)); _set: snd_mixer_selem_id_set_name(sid, buf); return 0; } static int get_ctl_enum_item_index(snd_ctl_t *handle, snd_ctl_elem_info_t *info, char **ptrp) { char *ptr = *ptrp; int items, i, len; const char *name; items = snd_ctl_elem_info_get_items(info); if (items <= 0) return -1; for (i = 0; i < items; i++) { snd_ctl_elem_info_set_item(info, i); if (snd_ctl_elem_info(handle, info) < 0) return -1; name = snd_ctl_elem_info_get_item_name(info); len = strlen(name); if (! strncmp(name, ptr, len)) { if (! ptr[len] || ptr[len] == ',' || ptr[len] == '\n') { ptr += len; *ptrp = ptr; return i; } } } return -1; } static int cset(int argc, char *argv[], int roflag, int keep_handle) { int err; static snd_ctl_t *handle = NULL; snd_ctl_elem_info_t *info; snd_ctl_elem_id_t *id; snd_ctl_elem_value_t *control; char *ptr; unsigned int idx, count; long tmp; snd_ctl_elem_type_t type; snd_ctl_elem_info_alloca(&info); snd_ctl_elem_id_alloca(&id); snd_ctl_elem_value_alloca(&control); if (argc < 1) { fprintf(stderr, "Specify a full control identifier: [[iface=,][name='name',][index=,][device=,][subdevice=]]|[numid=]\n"); return -EINVAL; } if (parse_control_id(argv[0], id)) { fprintf(stderr, "Wrong control identifier: %s\n", argv[0]); return -EINVAL; } if (debugflag) { printf("VERIFY ID: "); show_control_id(id); printf("\n"); } if (handle == NULL && (err = snd_ctl_open(&handle, card, 0)) < 0) { error("Control %s open error: %s\n", card, snd_strerror(err)); return err; } snd_ctl_elem_info_set_id(info, id); if ((err = snd_ctl_elem_info(handle, info)) < 0) { if (ignore_error) return 0; error("Cannot find the given element from control %s\n", card); if (! keep_handle) { snd_ctl_close(handle); handle = NULL; } return err; } snd_ctl_elem_info_get_id(info, id); /* FIXME: Remove it when hctl find works ok !!! */ type = snd_ctl_elem_info_get_type(info); count = snd_ctl_elem_info_get_count(info); snd_ctl_elem_value_set_id(control, id); if (!roflag) { ptr = argv[1]; for (idx = 0; idx < count && idx < 128 && ptr && *ptr; idx++) { switch (type) { case SND_CTL_ELEM_TYPE_BOOLEAN: tmp = 0; if (!strncasecmp(ptr, "on", 2) || !strncasecmp(ptr, "up", 2)) { tmp = 1; ptr += 2; } else if (!strncasecmp(ptr, "yes", 3)) { tmp = 1; ptr += 3; } else if (!strncasecmp(ptr, "toggle", 6)) { tmp = snd_ctl_elem_value_get_boolean(control, idx); tmp = tmp > 0 ? 0 : 1; ptr += 6; } else if (isdigit(*ptr)) { tmp = atoi(ptr) > 0 ? 1 : 0; while (isdigit(*ptr)) ptr++; } else { while (*ptr && *ptr != ',') ptr++; } snd_ctl_elem_value_set_boolean(control, idx, tmp); break; case SND_CTL_ELEM_TYPE_INTEGER: tmp = get_integer(&ptr, snd_ctl_elem_info_get_min(info), snd_ctl_elem_info_get_max(info)); snd_ctl_elem_value_set_integer(control, idx, tmp); break; case SND_CTL_ELEM_TYPE_INTEGER64: tmp = get_integer64(&ptr, snd_ctl_elem_info_get_min64(info), snd_ctl_elem_info_get_max64(info)); snd_ctl_elem_value_set_integer64(control, idx, tmp); break; case SND_CTL_ELEM_TYPE_ENUMERATED: tmp = get_ctl_enum_item_index(handle, info, &ptr); if (tmp < 0) tmp = get_integer(&ptr, 0, snd_ctl_elem_info_get_items(info) - 1); snd_ctl_elem_value_set_enumerated(control, idx, tmp); break; case SND_CTL_ELEM_TYPE_BYTES: tmp = get_integer(&ptr, 0, 255); snd_ctl_elem_value_set_byte(control, idx, tmp); break; default: break; } if (!strchr(argv[1], ',')) ptr = argv[1]; else if (*ptr == ',') ptr++; } if ((err = snd_ctl_elem_write(handle, control)) < 0) { if (!ignore_error) error("Control %s element write error: %s\n", card, snd_strerror(err)); if (!keep_handle) { snd_ctl_close(handle); handle = NULL; } return ignore_error ? 0 : err; } } if (! keep_handle) { snd_ctl_close(handle); handle = NULL; } if (!quiet) { snd_hctl_t *hctl; snd_hctl_elem_t *elem; if ((err = snd_hctl_open(&hctl, card, 0)) < 0) { error("Control %s open error: %s\n", card, snd_strerror(err)); return err; } if ((err = snd_hctl_load(hctl)) < 0) { error("Control %s load error: %s\n", card, snd_strerror(err)); return err; } elem = snd_hctl_find_elem(hctl, id); if (elem) show_control(" ", elem, LEVEL_BASIC | LEVEL_ID); else printf("Could not find the specified element\n"); snd_hctl_close(hctl); } return 0; } typedef struct channel_mask { char *name; unsigned int mask; } channel_mask_t; static const channel_mask_t chanmask[] = { {"frontleft", 1 << SND_MIXER_SCHN_FRONT_LEFT}, {"frontright", 1 << SND_MIXER_SCHN_FRONT_RIGHT}, {"frontcenter", 1 << SND_MIXER_SCHN_FRONT_CENTER}, {"front", ((1 << SND_MIXER_SCHN_FRONT_LEFT) | (1 << SND_MIXER_SCHN_FRONT_RIGHT))}, {"center", 1 << SND_MIXER_SCHN_FRONT_CENTER}, {"rearleft", 1 << SND_MIXER_SCHN_REAR_LEFT}, {"rearright", 1 << SND_MIXER_SCHN_REAR_RIGHT}, {"rear", ((1 << SND_MIXER_SCHN_REAR_LEFT) | (1 << SND_MIXER_SCHN_REAR_RIGHT))}, {"woofer", 1 << SND_MIXER_SCHN_WOOFER}, {NULL, 0} }; static unsigned int channels_mask(char **arg, unsigned int def) { const channel_mask_t *c; for (c = chanmask; c->name; c++) { if (strncasecmp(*arg, c->name, strlen(c->name)) == 0) { while (**arg != '\0' && **arg != ',' && **arg != ' ' && **arg != '\t') (*arg)++; if (**arg == ',' || **arg == ' ' || **arg == '\t') (*arg)++; return c->mask; } } return def; } static unsigned int dir_mask(char **arg, unsigned int def) { int findend = 0; if (strncasecmp(*arg, "playback", 8) == 0) def = findend = 1; else if (strncasecmp(*arg, "capture", 8) == 0) def = findend = 2; if (findend) { while (**arg != '\0' && **arg != ',' && **arg != ' ' && **arg != '\t') (*arg)++; if (**arg == ',' || **arg == ' ' || **arg == '\t') (*arg)++; } return def; } static int get_enum_item_index(snd_mixer_elem_t *elem, char **ptrp) { char *ptr = *ptrp; int items, i, len; char name[40]; items = snd_mixer_selem_get_enum_items(elem); if (items <= 0) return -1; for (i = 0; i < items; i++) { if (snd_mixer_selem_get_enum_item_name(elem, i, sizeof(name)-1, name) < 0) continue; len = strlen(name); if (! strncmp(name, ptr, len)) { if (! ptr[len] || ptr[len] == ',' || ptr[len] == '\n') { ptr += len; *ptrp = ptr; return i; } } } return -1; } static int sset_enum(snd_mixer_elem_t *elem, unsigned int argc, char **argv) { unsigned int idx, chn = 0; int check_flag = ignore_error ? 0 : -1; for (idx = 1; idx < argc; idx++) { char *ptr = argv[idx]; while (*ptr) { int ival = get_enum_item_index(elem, &ptr); if (ival < 0) return check_flag; if (snd_mixer_selem_set_enum_item(elem, chn, ival) >= 0) check_flag = 1; /* skip separators */ while (*ptr == ',' || isspace(*ptr)) ptr++; } } return check_flag; } static int sset_channels(snd_mixer_elem_t *elem, unsigned int argc, char **argv) { unsigned int channels = ~0U; unsigned int dir = 3, okflag = 3; unsigned int idx; snd_mixer_selem_channel_id_t chn; int check_flag = ignore_error ? 0 : -1; for (idx = 1; idx < argc; idx++) { char *ptr = argv[idx], *optr; /*printf("DEBUG: argc=%d, arvg[0]=%s, argv[1]=%s\n", argc, argv[0], argv[1]);*/ int multi, firstchn = 1; channels = channels_mask(&ptr, channels); if (*ptr == '\0') continue; dir = dir_mask(&ptr, dir); if (*ptr == '\0') continue; multi = (strchr(ptr, ',') != NULL); optr = ptr; for (chn = 0; chn <= SND_MIXER_SCHN_LAST; chn++) { char *sptr = NULL; int ival; if (!(channels & (1 << chn))) continue; if ((dir & 1) && snd_mixer_selem_has_playback_channel(elem, chn)) { sptr = ptr; /*printf("DEBUG: ptr=%s\n",ptr);*/ if (!strncmp(ptr, "mute", 4) && snd_mixer_selem_has_playback_switch(elem)) { snd_mixer_selem_get_playback_switch(elem, chn, &ival); if (snd_mixer_selem_set_playback_switch(elem, chn, get_bool_simple(&ptr, "mute", 1, ival)) >= 0) check_flag = 1; } else if (!strncmp(ptr, "off", 3) && snd_mixer_selem_has_playback_switch(elem)) { snd_mixer_selem_get_playback_switch(elem, chn, &ival); if (snd_mixer_selem_set_playback_switch(elem, chn, get_bool_simple(&ptr, "off", 1, ival)) >= 0) check_flag = 1; } else if (!strncmp(ptr, "unmute", 6) && snd_mixer_selem_has_playback_switch(elem)) { snd_mixer_selem_get_playback_switch(elem, chn, &ival); if (snd_mixer_selem_set_playback_switch(elem, chn, get_bool_simple(&ptr, "unmute", 0, ival)) >= 0) check_flag = 1; } else if (!strncmp(ptr, "on", 2) && snd_mixer_selem_has_playback_switch(elem)) { snd_mixer_selem_get_playback_switch(elem, chn, &ival); if (snd_mixer_selem_set_playback_switch(elem, chn, get_bool_simple(&ptr, "on", 0, ival)) >= 0) check_flag = 1; } else if (!strncmp(ptr, "toggle", 6) && snd_mixer_selem_has_playback_switch(elem)) { if (firstchn || !snd_mixer_selem_has_playback_switch_joined(elem)) { snd_mixer_selem_get_playback_switch(elem, chn, &ival); if (snd_mixer_selem_set_playback_switch(elem, chn, (ival ? 1 : 0) ^ 1) >= 0) check_flag = 1; } simple_skip_word(&ptr, "toggle"); } else if (isdigit(*ptr) || *ptr == '-' || *ptr == '+') { /* tmixer-alsa FORCE to work always with % */ ptr=strcat(ptr, "%"); if (set_volume_simple(elem, chn, &ptr, 0) >= 0) check_flag = 1; } else if (simple_skip_word(&ptr, "cap") || simple_skip_word(&ptr, "rec") || simple_skip_word(&ptr, "nocap") || simple_skip_word(&ptr, "norec")) { /* nothing */ } else { okflag &= ~1; } } /* don't comment this part, need to set capture channel */ #if 1 if ((dir & 2) && snd_mixer_selem_has_capture_channel(elem, chn)) { if (sptr != NULL) ptr = sptr; sptr = ptr; if (!strncmp(ptr, "cap", 3) && snd_mixer_selem_has_capture_switch(elem)) { snd_mixer_selem_get_capture_switch(elem, chn, &ival); if (snd_mixer_selem_set_capture_switch(elem, chn, get_bool_simple(&ptr, "cap", 0, ival)) >= 0) check_flag = 1; } else if (!strncmp(ptr, "rec", 3) && snd_mixer_selem_has_capture_switch(elem)) { snd_mixer_selem_get_capture_switch(elem, chn, &ival); if (snd_mixer_selem_set_capture_switch(elem, chn, get_bool_simple(&ptr, "rec", 0, ival)) >= 0) check_flag = 1; } else if (!strncmp(ptr, "nocap", 5) && snd_mixer_selem_has_capture_switch(elem)) { snd_mixer_selem_get_capture_switch(elem, chn, &ival); if (snd_mixer_selem_set_capture_switch(elem, chn, get_bool_simple(&ptr, "nocap", 1, ival)) >= 0) check_flag = 1; } else if (!strncmp(ptr, "norec", 5) && snd_mixer_selem_has_capture_switch(elem)) { snd_mixer_selem_get_capture_switch(elem, chn, &ival); if (snd_mixer_selem_set_capture_switch(elem, chn, get_bool_simple(&ptr, "norec", 1, ival)) >= 0) check_flag = 1; } else if (!strncmp(ptr, "toggle", 6) && snd_mixer_selem_has_capture_switch(elem)) { if (firstchn || !snd_mixer_selem_has_capture_switch_joined(elem)) { snd_mixer_selem_get_capture_switch(elem, chn, &ival); if (snd_mixer_selem_set_capture_switch(elem, chn, (ival ? 1 : 0) ^ 1) >= 0) check_flag = 1; } simple_skip_word(&ptr, "toggle"); } else if (isdigit(*ptr) || *ptr == '-' || *ptr == '+') { if (set_volume_simple(elem, chn, &ptr, 1) >= 0) check_flag = 1; } else if (simple_skip_word(&ptr, "mute") || simple_skip_word(&ptr, "off") || simple_skip_word(&ptr, "unmute") || simple_skip_word(&ptr, "on")) { /* nothing */ } else { okflag &= ~2; } } #endif if (okflag == 0) { if (debugflag) { if (dir & 1) error("Unknown playback setup '%s'..", ptr); if (dir & 2) error("Unknown capture setup '%s'..", ptr); } return 0; /* just skip it */ } if (!multi) ptr = optr; firstchn = 0; } } return check_flag; } static int sset(unsigned int argc, char *argv[], int roflag, int keep_handle) { int err = 0; static snd_mixer_t *handle = NULL; snd_mixer_elem_t *elem; snd_mixer_selem_id_t *sid; snd_mixer_selem_id_alloca(&sid); if (argc < 1) { fprintf(stderr, "Specify a scontrol identifier: 'name',index\n"); return 1; } if (parse_simple_id(argv[0], sid)) { fprintf(stderr, "Wrong scontrol identifier: %s\n", argv[0]); return 1; } if (!roflag && argc < 2) { fprintf(stderr, "Specify what you want to set...\n"); return 1; } if (handle == NULL) { if ((err = snd_mixer_open(&handle, 0)) < 0) { error("Mixer %s open error: %s\n", card, snd_strerror(err)); return err; } if (smixer_level == 0 && (err = snd_mixer_attach(handle, card)) < 0) { error("Mixer attach %s error: %s", card, snd_strerror(err)); snd_mixer_close(handle); handle = NULL; return err; } if ((err = snd_mixer_selem_register(handle, smixer_level > 0 ? &smixer_options : NULL, NULL)) < 0) { error("Mixer register error: %s", snd_strerror(err)); snd_mixer_close(handle); handle = NULL; return err; } err = snd_mixer_load(handle); if (err < 0) { error("Mixer %s load error: %s", card, snd_strerror(err)); snd_mixer_close(handle); handle = NULL; return err; } } elem = snd_mixer_find_selem(handle, sid); if (!elem) { if (ignore_error) return 0; error("Unable to find simple control '%s',%i\n", snd_mixer_selem_id_get_name(sid), snd_mixer_selem_id_get_index(sid)); snd_mixer_close(handle); handle = NULL; return -ENOENT; } /*printf("DEBUG: argc=%d argv[0]=%s argv[1]=%s\n", argc, argv[0], argv[1]);*/ if (!roflag) { /* enum control */ if (snd_mixer_selem_is_enumerated(elem)) err = sset_enum(elem, argc, argv); else err = sset_channels(elem, argc, argv); if (!err) goto done; if (err < 0) { error("Invalid command!"); goto done; } } if (!quiet) { /*printf("Simple mixer control '%s',%i\n", snd_mixer_selem_id_get_name(sid), snd_mixer_selem_id_get_index(sid));*/ show_selem(handle, sid, " ", 1); } done: if (! keep_handle) { snd_mixer_close(handle); handle = NULL; } return err < 0 ? 1 : 0; } static void events_info(snd_hctl_elem_t *helem) { snd_ctl_elem_id_t *id; snd_ctl_elem_id_alloca(&id); snd_hctl_elem_get_id(helem, id); printf("event info: "); show_control_id(id); printf("\n"); } static void events_value(snd_hctl_elem_t *helem) { snd_ctl_elem_id_t *id; snd_ctl_elem_id_alloca(&id); snd_hctl_elem_get_id(helem, id); printf("event value: "); show_control_id(id); printf("\n"); } static void events_remove(snd_hctl_elem_t *helem) { snd_ctl_elem_id_t *id; snd_ctl_elem_id_alloca(&id); snd_hctl_elem_get_id(helem, id); printf("event remove: "); show_control_id(id); printf("\n"); } static int element_callback(snd_hctl_elem_t *elem, unsigned int mask) { if (mask == SND_CTL_EVENT_MASK_REMOVE) { events_remove(elem); return 0; } if (mask & SND_CTL_EVENT_MASK_INFO) events_info(elem); if (mask & SND_CTL_EVENT_MASK_VALUE) events_value(elem); return 0; } static void events_add(snd_hctl_elem_t *helem) { snd_ctl_elem_id_t *id; snd_ctl_elem_id_alloca(&id); snd_hctl_elem_get_id(helem, id); printf("event add: "); show_control_id(id); printf("\n"); snd_hctl_elem_set_callback(helem, element_callback); } static int ctl_callback(snd_hctl_t *ctl, unsigned int mask, snd_hctl_elem_t *elem) { if (mask & SND_CTL_EVENT_MASK_ADD) events_add(elem); return 0; } static int events(int argc ATTRIBUTE_UNUSED, char *argv[] ATTRIBUTE_UNUSED) { snd_hctl_t *handle; snd_hctl_elem_t *helem; int err; if ((err = snd_hctl_open(&handle, card, 0)) < 0) { error("Control %s open error: %s\n", card, snd_strerror(err)); return err; } snd_hctl_set_callback(handle, ctl_callback); if ((err = snd_hctl_load(handle)) < 0) { error("Control %s hbuild error: %s\n", card, snd_strerror(err)); return err; } for (helem = snd_hctl_first_elem(handle); helem; helem = snd_hctl_elem_next(helem)) { snd_hctl_elem_set_callback(helem, element_callback); } printf("Ready to listen...\n"); while (1) { int res = snd_hctl_wait(handle, -1); if (res >= 0) { printf("Poll ok: %i\n", res); res = snd_hctl_handle_events(handle); assert(res > 0); } } snd_hctl_close(handle); return 0; } static void sevents_value(snd_mixer_selem_id_t *sid) { printf("event value: '%s',%i\n", snd_mixer_selem_id_get_name(sid), snd_mixer_selem_id_get_index(sid)); } static void sevents_info(snd_mixer_selem_id_t *sid) { printf("event info: '%s',%i\n", snd_mixer_selem_id_get_name(sid), snd_mixer_selem_id_get_index(sid)); } static void sevents_remove(snd_mixer_selem_id_t *sid) { printf("event remove: '%s',%i\n", snd_mixer_selem_id_get_name(sid), snd_mixer_selem_id_get_index(sid)); } static int melem_event(snd_mixer_elem_t *elem, unsigned int mask) { snd_mixer_selem_id_t *sid; snd_mixer_selem_id_alloca(&sid); snd_mixer_selem_get_id(elem, sid); if (mask == SND_CTL_EVENT_MASK_REMOVE) { sevents_remove(sid); return 0; } if (mask & SND_CTL_EVENT_MASK_INFO) sevents_info(sid); if (mask & SND_CTL_EVENT_MASK_VALUE) sevents_value(sid); return 0; } static void sevents_add(snd_mixer_elem_t *elem) { snd_mixer_selem_id_t *sid; snd_mixer_selem_id_alloca(&sid); snd_mixer_selem_get_id(elem, sid); printf("event add: '%s',%i\n", snd_mixer_selem_id_get_name(sid), snd_mixer_selem_id_get_index(sid)); snd_mixer_elem_set_callback(elem, melem_event); } static int mixer_event(snd_mixer_t *mixer, unsigned int mask, snd_mixer_elem_t *elem) { if (mask & SND_CTL_EVENT_MASK_ADD) sevents_add(elem); return 0; } static int sevents(int argc ATTRIBUTE_UNUSED, char *argv[] ATTRIBUTE_UNUSED) { snd_mixer_t *handle; int err; if ((err = snd_mixer_open(&handle, 0)) < 0) { error("Mixer %s open error: %s", card, snd_strerror(err)); return err; } if (smixer_level == 0 && (err = snd_mixer_attach(handle, card)) < 0) { error("Mixer attach %s error: %s", card, snd_strerror(err)); snd_mixer_close(handle); return err; } if ((err = snd_mixer_selem_register(handle, smixer_level > 0 ? &smixer_options : NULL, NULL)) < 0) { error("Mixer register error: %s", snd_strerror(err)); snd_mixer_close(handle); return err; } snd_mixer_set_callback(handle, mixer_event); err = snd_mixer_load(handle); if (err < 0) { error("Mixer %s load error: %s", card, snd_strerror(err)); snd_mixer_close(handle); return err; } printf("Ready to listen...\n"); while (1) { int res; res = snd_mixer_wait(handle, -1); if (res >= 0) { printf("Poll ok: %i\n", res); res = snd_mixer_handle_events(handle); assert(res >= 0); } } snd_mixer_close(handle); return 0; } /* * split a line into tokens * the content in the line buffer is modified */ static int split_line(char *buf, char **token, int max_token) { char *dst; int n, esc, quote; for (n = 0; n < max_token; n++) { while (isspace(*buf)) buf++; if (! *buf || *buf == '\n') return n; /* skip comments */ if (*buf == '#' || *buf == '!') return n; esc = 0; quote = 0; token[n] = buf; for (dst = buf; *buf && *buf != '\n'; buf++) { if (esc) esc = 0; else if (isspace(*buf) && !quote) { buf++; break; } else if (*buf == '\\') { esc = 1; continue; } else if (*buf == '\'' || *buf == '"') { if (! quote) { quote = *buf; continue; } else if (*buf == quote) { quote = 0; continue; } } *dst++ = *buf; } *dst = 0; } return n; } #define MAX_ARGS 32 static int exec_stdin(void) { int narg; char buf[256], *args[MAX_ARGS]; int err = 0; /* quiet = 1; */ ignore_error = 1; while (fgets(buf, sizeof(buf), stdin)) { narg = split_line(buf, args, MAX_ARGS); if (narg > 0) { if (!strcmp(args[0], "sset") || !strcmp(args[0], "set")) err = sset(narg - 1, args + 1, 0, 1); else if (!strcmp(args[0], "cset")) err = cset(narg - 1, args + 1, 0, 1); if (err < 0) return 1; } } return 0; } #ifdef HAVE_TMIXER_MAIN int tmixer_alsa(int argc, char *argv[]) { #else int main(int argc, char *argv[]) { #endif int morehelp, level = 0; int read_stdin = 0; static const struct option long_option[] = { {"help", 0, NULL, 'h'}, {"card", 1, NULL, 'c'}, {"device", 1, NULL, 'D'}, {"quiet", 0, NULL, 'q'}, {"inactive", 0, NULL, 'i'}, {"debug", 0, NULL, 'd'}, {"nocheck", 0, NULL, 'n'}, {"version", 0, NULL, 'v'}, {"abstract", 1, NULL, 'a'}, {"stdin", 0, NULL, 's'}, {NULL, 0, NULL, 0}, }; morehelp = 0; while (1) { int c; if ((c = getopt_long(argc, argv, "hc:D:qidnva:s", long_option, NULL)) < 0) break; switch (c) { case 'h': help(); return 0; case 'c': { int i; i = snd_card_get_index(optarg); if (i >= 0 && i < 32) sprintf(card, "hw:%i", i); else { fprintf(stderr, "Invalid card number.\n"); morehelp++; } } break; case 'D': strncpy(card, optarg, sizeof(card)-1); card[sizeof(card)-1] = '\0'; break; case 'q': quiet = 1; break; case 'i': level |= LEVEL_INACTIVE; break; case 'd': debugflag = 1; break; case 'n': no_check = 1; break; case 'v': printf("tmixer-alsa version (TCOS) " TCOS_VERSION "\n"); return 1; case 'a': smixer_level = 1; memset(&smixer_options, 0, sizeof(smixer_options)); smixer_options.ver = 1; if (!strcmp(optarg, "none")) smixer_options.abstract = SND_MIXER_SABSTRACT_NONE; else if (!strcmp(optarg, "basic")) smixer_options.abstract = SND_MIXER_SABSTRACT_BASIC; else { fprintf(stderr, "Select correct abstraction level (none or basic)...\n"); morehelp++; } break; case 's': read_stdin = 1; break; default: fprintf(stderr, "Invalid switch or option needs an argument.\n"); morehelp++; } } if (morehelp) { help(); return 1; } smixer_options.device = card; if (read_stdin) return exec_stdin(); if (argc - optind <= 0) { return selems(LEVEL_BASIC | level) ? 1 : 0; } if (!strcmp(argv[optind], "help")) { return help() ? 1 : 0; } else if (!strcmp(argv[optind], "info")) { return info() ? 1 : 0; } else if (!strcmp(argv[optind], "controls")) { return controls(level) ? 1 : 0; } else if (!strcmp(argv[optind], "contents")) { return controls(LEVEL_BASIC | level) ? 1 : 0; } else if (!strcmp(argv[optind], "scontrols") || !strcmp(argv[optind], "simple")) { return selems(level) ? 1 : 0; } else if (!strcmp(argv[optind], "scontents")) { return selems(LEVEL_BASIC | level) ? 1 : 0; } else if (!strcmp(argv[optind], "sset") || !strcmp(argv[optind], "set")) { return sset(argc - optind - 1, argc - optind > 1 ? argv + optind + 1 : NULL, 0, 0) ? 1 : 0; } else if (!strcmp(argv[optind], "sget") || !strcmp(argv[optind], "get")) { return sset(argc - optind - 1, argc - optind > 1 ? argv + optind + 1 : NULL, 1, 0) ? 1 : 0; } else if (!strcmp(argv[optind], "cset")) { return cset(argc - optind - 1, argc - optind > 1 ? argv + optind + 1 : NULL, 0, 0) ? 1 : 0; } else if (!strcmp(argv[optind], "cget")) { return cset(argc - optind - 1, argc - optind > 1 ? argv + optind + 1 : NULL, 1, 0) ? 1 : 0; } else if (!strcmp(argv[optind], "events")) { return events(argc - optind - 1, argc - optind > 1 ? argv + optind + 1 : NULL); } else if (!strcmp(argv[optind], "sevents")) { return sevents(argc - optind - 1, argc - optind > 1 ? argv + optind + 1 : NULL); } else { fprintf(stderr, "tmixer-alsa: Unknown command '%s'...\n", argv[optind]); } return 0; } tcos-0.89.93ubuntu2/tmixer/tmixer-alsa.h0000664000000000000000000000247512260610261015004 0ustar /* * ALSA command line mixer utility * Copyright (c) 1999-2000 by Jaroslav Kysela * * Modifications to show parseable output by: * Mario Izquierdo (mariodebian) * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ /** COPY FROM ../include/version.h *****************************/ #define SND_UTIL_VERSION_STR "1.0.16" #define LEVEL_BASIC (1<<0) #define LEVEL_INACTIVE (1<<1) #define LEVEL_ID (1<<2) #include void *alloca( size_t size ); #include double rint(double x); #include int strncasecmp(const char *s1, const char *s2, size_t n); tcos-0.89.93ubuntu2/tmixer/tmixer-oss.h0000664000000000000000000000443612260610261014667 0ustar /* $Aumix: aumix/src/common.c,v 1.9 2002/10/29 21:27:51 trevor Exp $ * * aumix: adjust audio mixer * copyright (c) 1993, 1996-2002 the authors--see AUTHORS file * * This file is part of aumix. * * Modified to merge with amixer by Mario Izquierdo (mariodebian) * * Aumix 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. * * Aumix is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #define OSSMAXLEVEL 100 /* highest level permitted by OSS drivers */ #define OSSUNMUTELEVEL 85 /* level of unmute (no way to get old level) */ /* you can overwrite this level with TMIXER_OSSMUTELEVEL environment var */ #define SOUND_IOCTL(a,b,c) ioctl(a,b,c) #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif enum { ENOERROR, EOPENMIX, /* trouble opening mixer device */ EFINDDEVICE, /* no device found */ EREADDEV, /* SOUND_MIXER_READ_DEVMASK */ EREADRECMASK, /* SOUND_MIXER_READ_RECMASK */ EREADRECSRC, /* SOUND_MIXER_READ_RECSRC */ EREADSTEREO, /* SOUND_MIXER_READ_STEREODEVS */ EWRITERECSRC, /* SOUND_MIXER_WRITE_RECSRC */ EREADMIX, /* MIXER_READ */ EWRITEMIX, /* MIXER_WRITE */ ENOTOPEN, /* mixer not open */ EFILE /* unable to open settings file */ }; /* name of mixer device file */ #define DEVICE_FILENAME "/dev/mixer" int mixer_fd = -1; int devmask = 0; int recmask = 0; int recsrc = 0; int stereodevs = 0; char *dev_name[SOUND_MIXER_NRDEVICES] = { \ "Master", \ "Bass", \ "Treble", \ "Synth", \ "PCM", \ "Speaker", \ "Line", \ "Mic", \ "CD", \ "Mix", \ "PCM2", \ "Record", \ "Input", \ "Output", \ "Line 1", \ "Line 2", \ "Line 3", \ "Digital1", \ "Digital2", \ "Digital3", \ "Phone In", \ "PhoneOut", \ "Video", \ "Radio", \ "Monitor" }; tcos-0.89.93ubuntu2/tmixer/tmixer.c0000664000000000000000000000413712260610261014056 0ustar /* tmixer main app * * Detect OSS and ALSA and pass argc and argv to tmixer_oss or tmixer_alsa * copyright (c) Mario Izquierdo (mariodebian) * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #define HAVE_TMIXER_MAIN 1 #include "tmixer-oss.c" #include "tmixer-alsa.c" #include int file_exists (char * fileName) { struct stat buf; int i = stat ( fileName, &buf ); /* File found */ if ( i == 0 ) return 1; return 0; } int main(int argc, char *argv[]) { if ( getenv("TMIXER_FORCE") != NULL ) { if( strcmp(getenv("TMIXER_FORCE"), "oss") == 0 ) { /* force to work with OSS/aumix api */ return tmixer_oss(argc, argv); } if( strcmp(getenv("TMIXER_FORCE"), "alsa") == 0 ) { /* force to work with ALSA/amixer api */ return tmixer_alsa(argc, argv); } } /* AUTOMATIC DETECT * 1.- Search for ALSA ( exists /proc/asound/card0/id ) * 2.- Search for OSS ( exists /dev/dsp and /dev/mixer ) */ if ( file_exists ("/proc/asound/card0/id") ) { return tmixer_alsa(argc, argv); } else if ( file_exists ("/dev/dsp") && file_exists ("/dev/mixer") ) { return tmixer_oss(argc, argv); } else { fprintf(stderr, "tmixer: ERROR, can't detect ALSA or OSS devices.\n"); return 1; } } tcos-0.89.93ubuntu2/tmixer/Makefile0000664000000000000000000000164712260610261014045 0ustar DEBUGCFLAGS += -g -O2 -Wall CFLAGS += -g -O2 -Wall TVERSION = -DTCOS_VERSION="\"$(VERSION)\"" LDADD += $(LDFLAGS) -lasound -lm bin_PROGRAMS = tmixer TMIXER_SOURCES= tmixer-alsa.c tmixer-oss.c CC=gcc all: tmixer tmixer: tmixer.c tmixer-oss.c tmixer-oss.h tmixer-alsa.c tmixer-alsa.h $(QUIET_CC)$(GCC) -o $(bin_PROGRAMS) tmixer.c $(LDADD) $(CFLAGS) $(TVERSION) tmixer-alsa: tmixer-alsa.c tmixer-alsa.h $(QUIET_CC)$(GCC) -o $(bin_PROGRAMS) tmixer-alsa.c $(LDADD) $(CFLAGS) $(TVERSION) tmixer-oss: tmixer-oss.c tmixer-oss.h $(QUIET_CC)$(GCC) -o $(bin_PROGRAMS) tmixer-oss.c $(LDADD) $(CFLAGS) $(TVERSION) debug: tmixer.c tmixer-oss.c tmixer-oss.h tmixer-alsa.c tmixer-alsa.h $(CC) -o $(bin_PROGRAMS) tmixer.c $(LDADD) $(DEBUGCFLAGS) $(TVERSION) include ../common.mk clean: $(QUIET_CL)rm -f *~ $(bin_PROGRAMS) *.o install: mkdir -p $(DESTDIR)/$(TCOS_BINS) install -m 755 $(bin_PROGRAMS) $(DESTDIR)/$(TCOS_BINS)/ tcos-0.89.93ubuntu2/tmixer/tmixer-oss.c0000664000000000000000000002553312260610261014663 0ustar /* $Aumix: aumix/src/common.c,v 1.9 2002/10/29 21:27:51 trevor Exp $ * * aumix: adjust audio mixer * copyright (c) 1993, 1996-2002 the authors--see AUTHORS file * * This file is part of aumix. * * Modified to merge with amixer by Mario Izquierdo (mariodebian) * * Aumix 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. * * Aumix is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include /* getenv() */ #include #include #include #include #include #include #include #include #include #include "tmixer-oss.h" int InitializeMixer(char *device_filename); int MixerStatus(void); int WriteLevel(int device, int leftright); int ReadLevel(int device, int *leftright); int WriteRecSrc(void); int ReadRecSrc(void); void ErrorExitWarn(int error, int mode); int SetShowNoninter(int dev, char *action, char *level); int InitializeMixer(char *device_filename) { if ((mixer_fd = open(device_filename, O_RDWR)) < 0) return EOPENMIX; ErrorExitWarn(MixerStatus(), 'e'); if (!devmask) return EFINDDEVICE; return 0; } int MixerStatus(void) { if (SOUND_IOCTL(mixer_fd, SOUND_MIXER_READ_DEVMASK, &devmask) == -1) return EREADDEV; if (SOUND_IOCTL(mixer_fd, SOUND_MIXER_READ_RECMASK, &recmask) == -1) return EREADRECMASK; ErrorExitWarn(ReadRecSrc(), 'e'); if (SOUND_IOCTL(mixer_fd, SOUND_MIXER_READ_STEREODEVS, &stereodevs) == -1) return EREADSTEREO; return 0; } int WriteLevel(int device, int leftright) { if (SOUND_IOCTL(mixer_fd, MIXER_WRITE(device), &leftright) == -1) return EWRITEMIX; return 0; } int ReadLevel(int device, int *leftright) { if (SOUND_IOCTL(mixer_fd, MIXER_READ(device), leftright) == -1) return EREADMIX; return 0; } int WriteRecSrc(void) { if (SOUND_IOCTL(mixer_fd, SOUND_MIXER_WRITE_RECSRC, &recsrc) == -1) return EWRITERECSRC; return 0; } int ReadRecSrc(void) { if (SOUND_IOCTL(mixer_fd, SOUND_MIXER_READ_RECSRC, &recsrc) == -1) return EREADRECSRC; return 0; } void ErrorExitWarn(int error, int mode) { char string[80]; const char *errorlist[] ={"tmixer-oss: error opening mixer", "tmixer-oss: no device found", "tmixer-oss: SOUND_MIXER_READ_DEVMASK", "tmixer-oss: SOUND_MIXER_READ_RECMASK", "tmixer-oss: SOUND_MIXER_READ_RECSRC", "tmixer-oss: SOUND_MIXER_READ_STEREODEVS", "tmixer-oss: SOUND_MIXER_WRITE_RECSRC", "tmixer-oss: MIXER_READ", "tmixer-oss: MIXER_WRITE", "tmixer-oss: mixer not open", "tmixer-oss: unable to open settings file", "tmixer-oss: unknow commandline action"}; if (!error) return; if (error > 12) { sprintf(string, "tmixer-oss: unknown error %i", error); fprintf(stderr, "%s", string); } else if (error > 0) { fprintf(stderr, "%s", errorlist[error - 1]); } fprintf(stderr, "\n"); if (mode == 'e') { /* exit */ close(mixer_fd); exit(EXIT_FAILURE); } else return; /* warn */ } int SetShowNoninter(int dev, char *action, char *level) { /* Change or display settings from the command line. */ /*char *devstr;*/ int tmp; if ( (strcmp(action, "scontents") == 0) || (strcmp(action, "sget") == 0) ) { /*devstr = dev_name[dev];*/ ErrorExitWarn(ReadLevel(dev, &tmp), 'e'); printf("%s,volume|switch|,%i,", dev_name[dev], (tmp & 0xFF) ); if ((tmp & 0xFF) > 0) printf("on"); else printf("off"); /* if ((1 << (dev)) & recmask) { ErrorExitWarn(ReadRecSrc(), 'e'); printf(", %c", ((1 << dev) & recsrc ? 'R' : 'P')); }*/ printf("\n"); } else if ( strcmp(action, "scontrols") == 0 ) { /*devstr = dev_name[dev];*/ ErrorExitWarn(ReadLevel(dev, &tmp), 'e'); printf("%s|", dev_name[dev] ); } else if ( strcmp(action, "sset") == 0 ) { /*fprintf(stderr, "DEBUG: sset: level=%s\n", level);*/ if ( (strcmp(level, "mute") == 0) || (strcmp(level, "off") == 0) ) tmp=0; else if ( (strcmp(level, "unmute") == 0) || (strcmp(level, "on") == 0) ) { if (getenv("TMIXER_OSSMUTELEVEL") != NULL) tmp=atoi(getenv("TMIXER_OSSMUTELEVEL")); else tmp=OSSUNMUTELEVEL; } else tmp = atoi(level); tmp = (tmp > OSSMAXLEVEL) ? OSSMAXLEVEL : tmp; tmp = (tmp < 0) ? 0 : tmp; ErrorExitWarn(WriteLevel(dev, tmp), 'e'); /* show channel */ SetShowNoninter(dev, "scontents", 0); } else { ErrorExitWarn(12, 'e'); } return 0; } void tmixer_oss_help(void) { printf("Usage: tmixer-oss [command]\n"); printf("\nAvailable commands:\n"); printf(" scontrols show all mixer simple controls\n"); printf(" scontents show contents of all mixer simple controls (default command)\n"); printf(" sset sID P set contents for one mixer simple control\n"); printf(" sget sID get contents for one mixer simple control\n"); printf("\ntmixer-oss output format:\n"); printf(" ChannelName, ChannelType [volume|switch] , Volume in %% , SwitchStatus [on|off] \n\n"); } #ifdef HAVE_TMIXER_MAIN int tmixer_oss(int argc, char *argv[]) { #else int main(int argc, char *argv[]) { #endif int ii, index=-1; static struct option long_option[] = { {"help", 0, NULL, 'h'}, {"card", 1, NULL, 'c'}, {"device", 1, NULL, 'D'}, {"quiet", 0, NULL, 'q'}, {"inactive", 0, NULL, 'i'}, {"debug", 0, NULL, 'd'}, {"nocheck", 0, NULL, 'n'}, {"version", 0, NULL, 'v'}, {"abstract", 1, NULL, 'a'}, {"stdin", 0, NULL, 's'}, {NULL, 0, NULL, 0}, }; while (1) { int c; if ((c = getopt_long(argc, argv, "hc:D:qidnva:s", long_option, NULL)) < 0) break; switch (c) { case 'h': tmixer_oss_help(); return 0; case 'c': fprintf(stderr, "tmixer-oss: WARNING: OSS driver don't support -c (--card) option.\n"); break; case 'D': fprintf(stderr, "tmixer-oss: WARNING: OSS driver don't support -D (--device) option.\n"); break; case 'q': /* do nothing */ break; case 'i': /* do nothing */ break; case 'd': /* do nothing */ break; case 'n': /* do nothing */ break; case 'v': printf("tmixer-oss version (TCOS) " TCOS_VERSION "\n"); close(mixer_fd); return 1; case 'a': /* do nothing */ break; case 's': /* do nothing */ break; default: fprintf(stderr, "tmixer-oss: Invalid switch or option needs an argument.\n"); exit(EXIT_FAILURE); } } /*printf("argc=%d optind=%d\n", argc, optind);*/ if (mixer_fd == -1) ErrorExitWarn(InitializeMixer(DEVICE_FILENAME), 'e'); if (argc - optind <= 0) { /* default OPTION empty == scontents */ for (ii = 0; ii < SOUND_MIXER_NRDEVICES; ii++) { if ((1 << ii) & (devmask | recmask)) ErrorExitWarn(SetShowNoninter(ii, "scontents", ""), 'e'); } close(mixer_fd); exit(EXIT_SUCCESS); } if (!strcmp(argv[optind], "help")) { tmixer_oss_help(); close(mixer_fd); exit(EXIT_SUCCESS); } else if (!strcmp(argv[optind], "scontrols") || !strcmp(argv[optind], "simple")) { for (ii = 0; ii < SOUND_MIXER_NRDEVICES; ii++) { if ((1 << ii) & (devmask | recmask)) ErrorExitWarn(SetShowNoninter(ii, "scontrols", ""), 'e'); } close(mixer_fd); exit(EXIT_SUCCESS); } else if (!strcmp(argv[optind], "scontents")) { for (ii = 0; ii < SOUND_MIXER_NRDEVICES; ii++) { if ((1 << ii) & (devmask | recmask)) ErrorExitWarn(SetShowNoninter(ii, "scontents", ""), 'e'); } close(mixer_fd); exit(EXIT_SUCCESS); } else if (!strcmp(argv[optind], "sset") || !strcmp(argv[optind], "sget")) { /*fprintf(stderr, "DEBUG: argv[optind]=%s argv[optind+1]=%s argv[optind+2]=%s\n", argv[optind], argv[optind+1], argv[optind+2]); fprintf(stderr, "argc=%d optind=%d strcmp=%d argv[optind]='%s'\n",argc, optind, strcmp(argv[optind], "sget"), argv[optind]);*/ if ( strcmp(argv[optind], "sget") ) { if (argc < optind +3) { fprintf(stderr, "tmixer-oss: ERROR: need value to change channel '%s'\n",argv[optind+1]); close(mixer_fd); exit(EXIT_FAILURE); } } if( strcmp(argv[optind+1], "Master") == 0 ) index=0; else if( strcmp(argv[optind+1], "Bass") == 0 ) index=1; else if( strcmp(argv[optind+1], "Treble") == 0 ) index=2; else if( strcmp(argv[optind+1], "Synth") == 0 ) index=3; else if( strcmp(argv[optind+1], "PCM") == 0 ) index=4; else if( strcmp(argv[optind+1], "Speaker") == 0 ) index=5; else if( strcmp(argv[optind+1], "Line") == 0 ) index=6; else if( strcmp(argv[optind+1], "Mic") == 0 ) index=7; else if( strcmp(argv[optind+1], "CD") == 0 ) index=8; else if( strcmp(argv[optind+1], "Mix") == 0 ) index=9; else if( strcmp(argv[optind+1], "PCM2") == 0 ) index=10; else if( strcmp(argv[optind+1], "Record") == 0 ) index=11; else if( strcmp(argv[optind+1], "Input") == 0 ) index=12; else if( strcmp(argv[optind+1], "Output") == 0 ) index=13; else if( strcmp(argv[optind+1], "Line 1") == 0 ) index=14; else if( strcmp(argv[optind+1], "Line 2") == 0 ) index=15; else if( strcmp(argv[optind+1], "Line 3") == 0 ) index=16; else if( strcmp(argv[optind+1], "Digital1") == 0 ) index=17; else if( strcmp(argv[optind+1], "Digital2") == 0 ) index=18; else if( strcmp(argv[optind+1], "Digital3") == 0 ) index=19; else if( strcmp(argv[optind+1], "Phone In") == 0 ) index=20; else if( strcmp(argv[optind+1], "PhoneOut") == 0 ) index=21; else if( strcmp(argv[optind+1], "Video") == 0 ) index=22; else if( strcmp(argv[optind+1], "Radio") == 0 ) index=23; else if( strcmp(argv[optind+1], "Monitor") == 0 ) index=24; else fprintf(stderr, "tmixer-oss: ERROR: unknow channel '%s'\n",argv[optind+1]); if (index >= 0) { /*fprintf(stderr, "DEBUG: argv[optind]=%s argv[optind+1]=%s argv[optind+2]=%s\n", argv[optind], argv[optind+1], argv[optind+2]);*/ ErrorExitWarn(SetShowNoninter(index, argv[optind], argv[optind+2] ), 'e'); } close(mixer_fd); exit(EXIT_SUCCESS); } else { fprintf(stderr, "tmixer-oss: ERROR: Unknown command '%s'...\n", argv[optind]); } ErrorExitWarn(12, 'e'); close(mixer_fd); exit(EXIT_FAILURE); }