bluewho-0.1/0000755000175000017500000000000011322443266012716 5ustar muflonemuflonebluewho-0.1/setup.py0000744000175000017500000000647211322441333014433 0ustar muflonemuflone#!/usr/bin/env python ## # Project: bluewho # Information and notification of new discovered bluetooth devices. # Author: Fabio Castelli # Copyright: 2009 Fabio Castelli # License: GPL-2+ # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the Free # Software Foundation; either version 2 of the License, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # more details. # # On Debian GNU/Linux systems, the full text of the GNU General Public License # can be found in the file /usr/share/common-licenses/GPL-2. ## from distutils.core import setup from distutils.command.install_data import install_data from distutils.dep_util import newer from distutils.log import info import glob import os import sys class InstallData(install_data): def run (self): self.data_files.extend (self._compile_po_files()) install_data.run (self) def _compile_po_files (self): data_files = [] # Don't install language files on win32 if sys.platform == 'win32': return data_files PO_DIR = 'locales' for po in glob.glob (os.path.join(PO_DIR,'*.po')): lang = os.path.basename(po[:-3]) mo = os.path.join('build', 'mo', lang, 'bluewho.mo') directory = os.path.dirname(mo) if not os.path.exists(directory): info('creating %s' % directory) os.makedirs(directory) if newer(po, mo): # True if mo doesn't exist cmd = 'msgfmt -o %s %s' % (mo, po) info('compiling %s -> %s' % (po, mo)) if os.system(cmd) != 0: raise SystemExit('Error while running msgfmt') dest = os.path.dirname(os.path.join('share', 'locale', lang, 'LC_MESSAGES', 'bluewho.mo')) data_files.append((dest, [mo])) return data_files setup(name='BlueWho', version='0.1', description='Information and notification of new discovered bluetooth devices', author='Fabio Castelli', author_email='muflone@vbsimple.net', url='http://code.google.com/p/bluewho/', license='GPL v2', data_files=[ ('share/applications', ['data/bluewho.desktop']), ('share/man/man1', ['man/bluewho.1']), ('share/doc/bluewho', ['doc/README', 'doc/changelog', 'doc/translators']), ('share/bluewho/data', ['data/bluewho.glade', 'data/bluewho.svg', 'data/newdevice.wav']), ('share/bluewho/gfx', [f for f in glob.glob('gfx/*') if os.path.isfile(f)]), ('share/bluewho/gfx/class1', glob.glob('gfx/class1/*')), ('share/bluewho/gfx/class2', glob.glob('gfx/class2/*')), ('share/bluewho/gfx/class3', glob.glob('gfx/class3/*')), ('share/bluewho/gfx/class4', glob.glob('gfx/class4/*')), ('share/bluewho/gfx/class5', glob.glob('gfx/class5/*')), ('share/bluewho/gfx/class6', glob.glob('gfx/class6/*')), ('share/bluewho/src', glob.glob('src/*.py')), ], cmdclass={'install_data': InstallData} ) bluewho-0.1/locales/0000755000175000017500000000000011320161277014335 5ustar muflonemuflonebluewho-0.1/src/0000755000175000017500000000000011322443406013501 5ustar muflonemuflonebluewho-0.1/data/0000755000175000017500000000000011317521307013624 5ustar muflonemuflonebluewho-0.1/doc/0000755000175000017500000000000011322442421013453 5ustar muflonemuflonebluewho-0.1/man/0000755000175000017500000000000011317522515013470 5ustar muflonemuflonebluewho-0.1/gfx/0000755000175000017500000000000011305542357013504 5ustar muflonemuflonebluewho-0.1/locales/en_US.po0000644000175000017500000002057111317512173015714 0ustar muflonemuflone# BlueWho - Information and notification of new discovered bluetooth devices. # Copyright (C) 2009 Fabio Castelli # This file is distributed under the GPL v2 license (see copyright file). # Fabio Castelli , 2009. # English translation for bluewho package. # msgid "" msgstr "" "Project-Id-Version: bluewho 0.1\n" "Report-Msgid-Bugs-To: Fabio Castelli \n" "POT-Creation-Date: 2010-01-02 01:31+0100\n" "PO-Revision-Date: 2010-01-02 01:32+0100\n" "Last-Translator: Fabio Castelli \n" "Language-Team: English\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ASCII\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../data/bluewho.glade.h:1 msgid "Available services:" msgstr "Available services:" #: ../data/bluewho.glade.h:2 msgid "Detected devices:" msgstr "Detected devices:" #: ../data/bluewho.glade.h:3 msgid "Scan options:" msgstr "Scan options:" #: ../data/bluewho.glade.h:4 msgid "Startup preferences:" msgstr "Startup preferences:" #: ../data/bluewho.glade.h:5 msgid "When a device has been found:" msgstr "When a device has been found:" #: ../data/bluewho.glade.h:6 msgid "About" msgstr "About" #: ../data/bluewho.glade.h:7 msgid "Auto scan" msgstr "Auto scan" #: ../data/bluewho.glade.h:8 msgid "Available services" msgstr "Available services" #: ../data/bluewho.glade.h:9 msgid "Clear list" msgstr "Clear list" #: ../data/bluewho.glade.h:10 msgid "Detect devices" msgstr "Detect devices" #: ../data/bluewho.glade.h:11 msgid "Detect devices at _startup" msgstr "Detect devices at _startup" #: ../data/bluewho.glade.h:12 msgid "Preferences" msgstr "Preferences" #: ../data/bluewho.glade.h:13 msgid "Re_trieve name during scan (slow)" msgstr "Re_trieve name during scan (slow)" #: ../data/bluewho.glade.h:14 msgid "Restore last used _window size and position" msgstr "Restore last used _window size and position" #: ../data/bluewho.glade.h:15 msgid "S_end notification" msgstr "S_end notification" #: ../data/bluewho.glade.h:16 msgid "Show _local adapters" msgstr "Show _local adapters" #: ../data/bluewho.glade.h:17 msgid "_Automatic scan at startup" msgstr "_Automatic scan at startup" #: ../data/bluewho.glade.h:18 msgid "_Notification command:" msgstr "_Notification command:" #: ../data/bluewho.glade.h:19 msgid "_Play a sound" msgstr "_Play a sound" #: ../data/bluewho.glade.h:20 msgid "_Resolve device name after each detection" msgstr "_Resolve device name after each detection" #: ../src/bluewho.py:64 msgid "adapter" msgstr "adapter" #: ../src/bluewho.py:83 #, python-format msgid "%(year)04d/%(month)02d/%(day)02d %(hour)02d:%(minute)02d.%(second)02d" msgstr "%(year)04d/%(month)02d/%(day)02d %(hour)02d:%(minute)02d.%(second)02d" #: ../src/bluewho.py:113 msgid "No local devices found during detection." msgstr "No local devices found during detection." #: ../src/bluewho.py:143 #, python-format msgid "Last scan: %s" msgstr "Last scan: %s" #: ../src/bluewho.py:156 msgid "Type" msgstr "Type" #: ../src/bluewho.py:164 msgid "Device name" msgstr "Device name" #: ../src/bluewho.py:172 msgid "Bluetooth address" msgstr "Bluetooth address" #: ../src/bluewho.py:179 msgid "Last seen" msgstr "Last seen" #: ../src/bluewho.py:188 msgid "Service name" msgstr "Service name" #: ../src/bluewho.py:195 msgid "Protocol" msgstr "Protocol" #: ../src/bluewho.py:202 msgid "Channel" msgstr "Channel" #: ../src/bluewho.py:335 msgid "" "A GTK utility to inform and notify you when a new bluetooth device is " "discovered." msgstr "" "A GTK utility to inform and notify you when a new bluetooth device is " "discovered." #: ../src/btsupport.py:40 msgid "positioning service" msgstr "positioning service" #: ../src/btsupport.py:41 msgid "networking service" msgstr "networking service" #: ../src/btsupport.py:42 msgid "rendering service" msgstr "rendering service" #: ../src/btsupport.py:43 msgid "capturing service" msgstr "capturing service" #: ../src/btsupport.py:44 msgid "object transfer service" msgstr "object transfer service" #: ../src/btsupport.py:45 msgid "audio service" msgstr "audio service" #: ../src/btsupport.py:46 msgid "telephony service" msgstr "telephony service" #: ../src/btsupport.py:47 msgid "information service" msgstr "information service" #: ../src/btsupport.py:58 msgid "miscellaneous" msgstr "miscellaneous" #: ../src/btsupport.py:59 msgid "computer" msgstr "computer" #: ../src/btsupport.py:60 msgid "phone" msgstr "phone" #: ../src/btsupport.py:61 msgid "network" msgstr "network" #: ../src/btsupport.py:62 msgid "audio-video" msgstr "audio-video" #: ../src/btsupport.py:63 msgid "peripheral" msgstr "peripheral" #: ../src/btsupport.py:64 msgid "imaging" msgstr "imaging" #: ../src/btsupport.py:65 ../src/btsupport.py:73 msgid "uncategorized" msgstr "uncategorized" #: ../src/btsupport.py:79 msgid "desktop workstation" msgstr "desktop workstation" #: ../src/btsupport.py:80 msgid "server" msgstr "server" #: ../src/btsupport.py:81 msgid "laptop" msgstr "laptop" #: ../src/btsupport.py:82 msgid "handheld" msgstr "handheld" #: ../src/btsupport.py:83 msgid "palm" msgstr "palm" #: ../src/btsupport.py:84 msgid "wearable computer" msgstr "wearable computer" #: ../src/btsupport.py:88 msgid "cellular" msgstr "cellular" #: ../src/btsupport.py:89 msgid "cordless" msgstr "cordless" #: ../src/btsupport.py:90 msgid "smartphone" msgstr "smartphone" #: ../src/btsupport.py:91 msgid "wired modem - voice gateway" msgstr "wired modem - voice gateway" #: ../src/btsupport.py:92 msgid "common ISDN access" msgstr "common ISDN access" #: ../src/btsupport.py:96 msgid "network fully available" msgstr "network fully available" #: ../src/btsupport.py:97 #, python-format msgid "network 1-17%% used" msgstr "network 1-17%% used" #: ../src/btsupport.py:98 #, python-format msgid "network 17-33%% used" msgstr "network 17-33%% used" #: ../src/btsupport.py:99 #, python-format msgid "network 33-50%% used" msgstr "network 33-50%% used" #: ../src/btsupport.py:100 #, python-format msgid "network 50-67%% used" msgstr "network 50-67%% used" #: ../src/btsupport.py:101 #, python-format msgid "network 67-83%% used" msgstr "network 67-83%% used" #: ../src/btsupport.py:102 #, python-format msgid "network 83-99%% used" msgstr "network 83-99%% used" #: ../src/btsupport.py:103 msgid "network unavailable" msgstr "network unavailable" #: ../src/btsupport.py:107 msgid "headset" msgstr "headset" #: ../src/btsupport.py:108 msgid "hands-free" msgstr "hands-free" #: ../src/btsupport.py:109 msgid "microphone" msgstr "microphone" #: ../src/btsupport.py:110 msgid "loudspeaker" msgstr "loudspeaker" #: ../src/btsupport.py:111 msgid "headphone" msgstr "headphone" #: ../src/btsupport.py:112 msgid "portable audio" msgstr "portable audio" #: ../src/btsupport.py:113 msgid "car audio" msgstr "car audio" #: ../src/btsupport.py:114 msgid "set-top box" msgstr "set-top box" #: ../src/btsupport.py:115 msgid "hifi audio" msgstr "hifi audio" #: ../src/btsupport.py:116 msgid "vcr" msgstr "vcr" #: ../src/btsupport.py:117 msgid "videocamera" msgstr "videocamera" #: ../src/btsupport.py:118 msgid "camcorder" msgstr "camcorder" #: ../src/btsupport.py:119 msgid "video monitor" msgstr "video monitor" #: ../src/btsupport.py:120 msgid "video display loudspeaker" msgstr "video display loudspeaker" #: ../src/btsupport.py:121 msgid "video conferencing" msgstr "video conferencing" #: ../src/btsupport.py:122 msgid "gaming toy" msgstr "gaming toy" #: ../src/btsupport.py:127 msgid "joystick" msgstr "joystick" #: ../src/btsupport.py:128 msgid "gamepad" msgstr "gamepad" #: ../src/btsupport.py:129 msgid "remote control" msgstr "remote control" #: ../src/btsupport.py:130 msgid "sensing device" msgstr "sensing device" #: ../src/btsupport.py:131 msgid "digitizer tablet" msgstr "digitizer tablet" #: ../src/btsupport.py:132 msgid "card reader" msgstr "card reader" #: ../src/btsupport.py:136 msgid "keyboard" msgstr "keyboard" #: ../src/btsupport.py:137 msgid "mouse" msgstr "mouse" #: ../src/btsupport.py:138 msgid "keyboard+mouse" msgstr "keyboard+mouse" #: ../src/btsupport.py:142 msgid "display" msgstr "display" #: ../src/btsupport.py:143 msgid "camera" msgstr "camera" #: ../src/btsupport.py:144 msgid "scanner" msgstr "scanner" #: ../src/btsupport.py:145 msgid "printer" msgstr "printer" #: ../src/settings.py:67 msgid "New bluetooth device detected" msgstr "New bluetooth device detected" bluewho-0.1/locales/fr.po0000644000175000017500000002147311317515331015313 0ustar muflonemuflone# BlueWho - Information and notification of new discovered bluetooth devices. # Copyright (C) 2009 Fabio Castelli # This file is distributed under the GPL v2 license (see copyright file). # Fabio Castelli , 2009. # French translation for bluewho package. # msgid "" msgstr "" "Project-Id-Version: bluewho 0.1\n" "Report-Msgid-Bugs-To: Fabio Castelli \n" "POT-Creation-Date: 2010-01-02 01:31+0100\n" "PO-Revision-Date: 2010-01-02 01:32+0100\n" "Last-Translator: Emmanuel \n" "Language-Team: French\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);\n" #: ../data/bluewho.glade.h:1 msgid "Available services:" msgstr "Services disponibles:" #: ../data/bluewho.glade.h:2 msgid "Detected devices:" msgstr "Dispositifs détectés:" #: ../data/bluewho.glade.h:3 msgid "Scan options:" msgstr "Options de recherche:" #: ../data/bluewho.glade.h:4 msgid "Startup preferences:" msgstr "Préférences de démarrage:" #: ../data/bluewho.glade.h:5 msgid "When a device has been found:" msgstr "Quand un dispositif a été trouvé:" #: ../data/bluewho.glade.h:6 msgid "About" msgstr "À propos" #: ../data/bluewho.glade.h:7 msgid "Auto scan" msgstr "Recherche automatique" #: ../data/bluewho.glade.h:8 msgid "Available services" msgstr "Services disponibles" #: ../data/bluewho.glade.h:9 msgid "Clear list" msgstr "Effacer la liste" #: ../data/bluewho.glade.h:10 msgid "Detect devices" msgstr "Rechercher les dispositifs" #: ../data/bluewho.glade.h:11 msgid "Detect devices at _startup" msgstr "Rechercher les di_spositifs au démarrage" #: ../data/bluewho.glade.h:12 msgid "Preferences" msgstr "Préférences" #: ../data/bluewho.glade.h:13 msgid "Re_trieve name during scan (slow)" msgstr "Récupérer le nom pendan_t la recherche (lent)" #: ../data/bluewho.glade.h:14 msgid "Restore last used _window size and position" msgstr "Rétablir la _dernière taille et position de la fenêtre utilisé" #: ../data/bluewho.glade.h:15 msgid "S_end notification" msgstr "Envoy_er notification" #: ../data/bluewho.glade.h:16 msgid "Show _local adapters" msgstr "Afficher les adaptateurs _locaux" #: ../data/bluewho.glade.h:17 msgid "_Automatic scan at startup" msgstr "Recherche _automatique au démarrage" #: ../data/bluewho.glade.h:18 msgid "_Notification command:" msgstr "Commande de _notification :" #: ../data/bluewho.glade.h:19 msgid "_Play a sound" msgstr "_Jouer un son" #: ../data/bluewho.glade.h:20 msgid "_Resolve device name after each detection" msgstr "_Résoudre le nom du dispositif après chaque détection" #: ../src/bluewho.py:64 msgid "adapter" msgstr "adaptateur" #: ../src/bluewho.py:83 #, python-format msgid "%(year)04d/%(month)02d/%(day)02d %(hour)02d:%(minute)02d.%(second)02d" msgstr "%(day)02d/%(month)02d/%(year)04d %(hour)02d:%(minute)02d.%(second)02d" #: ../src/bluewho.py:113 msgid "No local devices found during detection." msgstr "Aucun dispositif locale a été trouvé lors de la détection." #: ../src/bluewho.py:143 #, python-format msgid "Last scan: %s" msgstr "Dernière recherche: %s" #: ../src/bluewho.py:156 msgid "Type" msgstr "Type" #: ../src/bluewho.py:164 msgid "Device name" msgstr "Nom du dispositif" #: ../src/bluewho.py:172 msgid "Bluetooth address" msgstr "Bluetooth adresse" #: ../src/bluewho.py:179 msgid "Last seen" msgstr "Dernière détection" #: ../src/bluewho.py:188 msgid "Service name" msgstr "Non du service" #: ../src/bluewho.py:195 msgid "Protocol" msgstr "Protocole" #: ../src/bluewho.py:202 msgid "Channel" msgstr "Canal" #: ../src/bluewho.py:335 msgid "" "A GTK utility to inform and notify you when a new bluetooth device is " "discovered." msgstr "Un outil GTK pour informer et notifier quand un nouveau dispositif " "bluetooth est découvert." #: ../src/btsupport.py:40 msgid "positioning service" msgstr "service de positionnement" #: ../src/btsupport.py:41 msgid "networking service" msgstr "service de réseau" #: ../src/btsupport.py:42 msgid "rendering service" msgstr "service de rendu" #: ../src/btsupport.py:43 msgid "capturing service" msgstr "service de capture" #: ../src/btsupport.py:44 msgid "object transfer service" msgstr "service de transfert d'objets" #: ../src/btsupport.py:45 msgid "audio service" msgstr "service audio" #: ../src/btsupport.py:46 msgid "telephony service" msgstr "service téléphonique" #: ../src/btsupport.py:47 msgid "information service" msgstr "service d'information" #: ../src/btsupport.py:58 msgid "miscellaneous" msgstr "divers" #: ../src/btsupport.py:59 msgid "computer" msgstr "ordinateur" #: ../src/btsupport.py:60 msgid "phone" msgstr "téléphone" #: ../src/btsupport.py:61 msgid "network" msgstr "réseau" #: ../src/btsupport.py:62 msgid "audio-video" msgstr "audio-vidéo" #: ../src/btsupport.py:63 msgid "peripheral" msgstr "périphérique" #: ../src/btsupport.py:64 msgid "imaging" msgstr "image" #: ../src/btsupport.py:65 ../src/btsupport.py:73 msgid "uncategorized" msgstr "sans catégorie" #: ../src/btsupport.py:79 msgid "desktop workstation" msgstr "poste de travail de bureau" #: ../src/btsupport.py:80 msgid "server" msgstr "serveur" #: ../src/btsupport.py:81 msgid "laptop" msgstr "ordinateur portable" #: ../src/btsupport.py:82 msgid "handheld" msgstr "ordinateur de poche" #: ../src/btsupport.py:83 msgid "palm" msgstr "assistant personnel" #: ../src/btsupport.py:84 msgid "wearable computer" msgstr "ordinateur vêtement" #: ../src/btsupport.py:88 msgid "cellular" msgstr "téléphone portable" #: ../src/btsupport.py:89 msgid "cordless" msgstr "sans fil" #: ../src/btsupport.py:90 msgid "smartphone" msgstr "ordiphone" #: ../src/btsupport.py:91 msgid "wired modem - voice gateway" msgstr "modem filaire - passerelle de voix" #: ../src/btsupport.py:92 msgid "common ISDN access" msgstr "accès RNIS commun" #: ../src/btsupport.py:96 msgid "network fully available" msgstr "réseau entièrement disponible" #: ../src/btsupport.py:97 #, python-format msgid "network 1-17%% used" msgstr "réseau utilisé au 1-17%%" #: ../src/btsupport.py:98 #, python-format msgid "network 17-33%% used" msgstr "réseau utilisé au 17-33%%" #: ../src/btsupport.py:99 #, python-format msgid "network 33-50%% used" msgstr "réseau utilisé au 33-50%%" #: ../src/btsupport.py:100 #, python-format msgid "network 50-67%% used" msgstr "réseau utilisé au 50-67%%" #: ../src/btsupport.py:101 #, python-format msgid "network 67-83%% used" msgstr "réseau utilisé au 67-83%%" #: ../src/btsupport.py:102 #, python-format msgid "network 83-99%% used" msgstr "réseau utilisé au 83-99%%" #: ../src/btsupport.py:103 msgid "network unavailable" msgstr "réseau indisponible" #: ../src/btsupport.py:107 msgid "headset" msgstr "oreillette" #: ../src/btsupport.py:108 msgid "hands-free" msgstr "mains libres" #: ../src/btsupport.py:109 msgid "microphone" msgstr "microphone" #: ../src/btsupport.py:110 msgid "loudspeaker" msgstr "haut-parleur" #: ../src/btsupport.py:111 msgid "headphone" msgstr "casque" #: ../src/btsupport.py:112 msgid "portable audio" msgstr "audio portable" #: ../src/btsupport.py:113 msgid "car audio" msgstr "audio pour voitures" #: ../src/btsupport.py:114 msgid "set-top box" msgstr "adjoint de poste de télévision" #: ../src/btsupport.py:115 msgid "hifi audio" msgstr "audio hifi" #: ../src/btsupport.py:116 msgid "vcr" msgstr "magnétoscope" #: ../src/btsupport.py:117 msgid "videocamera" msgstr "caméra vidéo" #: ../src/btsupport.py:118 msgid "camcorder" msgstr "caméscope" #: ../src/btsupport.py:119 msgid "video monitor" msgstr "écran" #: ../src/btsupport.py:120 msgid "video display loudspeaker" msgstr "écran vidéo avec haut-parleur" #: ../src/btsupport.py:121 msgid "video conferencing" msgstr "vidéoconférence" #: ../src/btsupport.py:122 msgid "gaming toy" msgstr "jouet" #: ../src/btsupport.py:127 msgid "joystick" msgstr "manette" #: ../src/btsupport.py:128 msgid "gamepad" msgstr "manette de jeu" #: ../src/btsupport.py:129 msgid "remote control" msgstr "commande à distance" #: ../src/btsupport.py:130 msgid "sensing device" msgstr "dispositif de détection" #: ../src/btsupport.py:131 msgid "digitizer tablet" msgstr "tablette graphique" #: ../src/btsupport.py:132 msgid "card reader" msgstr "lecteur de cartes" #: ../src/btsupport.py:136 msgid "keyboard" msgstr "clavier" #: ../src/btsupport.py:137 msgid "mouse" msgstr "souris" #: ../src/btsupport.py:138 msgid "keyboard+mouse" msgstr "clavier+souris" #: ../src/btsupport.py:142 msgid "display" msgstr "écran" #: ../src/btsupport.py:143 msgid "camera" msgstr "caméra" #: ../src/btsupport.py:144 msgid "scanner" msgstr "scanner" #: ../src/btsupport.py:145 msgid "printer" msgstr "imprimante" #: ../src/settings.py:67 msgid "New bluetooth device detected" msgstr "Nouveau dispositif Bluetooth détecté" bluewho-0.1/locales/it.po0000644000175000017500000002116611317516233015321 0ustar muflonemuflone# BlueWho - Information and notification of new discovered bluetooth devices. # Copyright (C) 2009 Fabio Castelli # This file is distributed under the GPL v2 license (see copyright file). # Fabio Castelli , 2009. # Italian translation for bluewho package. # msgid "" msgstr "" "Project-Id-Version: bluewho 0.1\n" "Report-Msgid-Bugs-To: Fabio Castelli \n" "POT-Creation-Date: 2010-01-02 01:31+0100\n" "PO-Revision-Date: 2010-01-02 01:32+0100\n" "Last-Translator: Fabio Castelli \n" "Language-Team: Italian\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);\n" #: ../data/bluewho.glade.h:1 msgid "Available services:" msgstr "Servizi disponibili:" #: ../data/bluewho.glade.h:2 msgid "Detected devices:" msgstr "Dispositivi rilevati:" #: ../data/bluewho.glade.h:3 msgid "Scan options:" msgstr "Opzioni di scansione:" #: ../data/bluewho.glade.h:4 msgid "Startup preferences:" msgstr "Impostazioni di avvio:" #: ../data/bluewho.glade.h:5 msgid "When a device has been found:" msgstr "Quando un nuovo dispositivo è trovato:" #: ../data/bluewho.glade.h:6 msgid "About" msgstr "Informazioni" #: ../data/bluewho.glade.h:7 msgid "Auto scan" msgstr "Scansione automatica" #: ../data/bluewho.glade.h:8 msgid "Available services" msgstr "Servizi disponibili" #: ../data/bluewho.glade.h:9 msgid "Clear list" msgstr "Pulisci" #: ../data/bluewho.glade.h:10 msgid "Detect devices" msgstr "Rileva dispositivi" #: ../data/bluewho.glade.h:11 msgid "Detect devices at _startup" msgstr "Rileva dispositivi all'a_vvio" #: ../data/bluewho.glade.h:12 msgid "Preferences" msgstr "Preferenze" #: ../data/bluewho.glade.h:13 msgid "Re_trieve name during scan (slow)" msgstr "R_ecuperare il nome durante la scansione (lento)" #: ../data/bluewho.glade.h:14 msgid "Restore last used _window size and position" msgstr "Ripristina posizione e dimensione della _finestra" #: ../data/bluewho.glade.h:15 msgid "S_end notification" msgstr "_Invia notifica" #: ../data/bluewho.glade.h:16 msgid "Show _local adapters" msgstr "Mostra adattatori _locali" #: ../data/bluewho.glade.h:17 msgid "_Automatic scan at startup" msgstr "Scansione _automatica all'avvio" #: ../data/bluewho.glade.h:18 msgid "_Notification command:" msgstr "Comando di _notifica:" #: ../data/bluewho.glade.h:19 msgid "_Play a sound" msgstr "Riproduci un _suono" #: ../data/bluewho.glade.h:20 msgid "_Resolve device name after each detection" msgstr "_Risolvere il nome del dispositivo dopo ogni rilevazione" #: ../src/bluewho.py:64 msgid "adapter" msgstr "adattatore" #: ../src/bluewho.py:83 #, python-format msgid "%(year)04d/%(month)02d/%(day)02d %(hour)02d:%(minute)02d.%(second)02d" msgstr "%(day)02d/%(month)02d/%(year)04d %(hour)02d:%(minute)02d.%(second)02d" #: ../src/bluewho.py:113 msgid "No local devices found during detection." msgstr "Nessun dispositivo locale trovato con la rilevazione" #: ../src/bluewho.py:143 #, python-format msgid "Last scan: %s" msgstr "Ultima scansione: %s" #: ../src/bluewho.py:156 msgid "Type" msgstr "Tipo" #: ../src/bluewho.py:164 msgid "Device name" msgstr "Nome dispositivo" #: ../src/bluewho.py:172 msgid "Bluetooth address" msgstr "Indirizzo bluetooth" #: ../src/bluewho.py:179 msgid "Last seen" msgstr "Ultima rilevazione" #: ../src/bluewho.py:188 msgid "Service name" msgstr "Nome del servizio" #: ../src/bluewho.py:195 msgid "Protocol" msgstr "Protocollo" #: ../src/bluewho.py:202 msgid "Channel" msgstr "Canale" #: ../src/bluewho.py:335 msgid "" "A GTK utility to inform and notify you when a new bluetooth device is " "discovered." msgstr "" "Un'utilità GTK per informarti e notificarti quando un nuovo dispositivo " "bluetooth viene scoperto." #: ../src/btsupport.py:40 msgid "positioning service" msgstr "servizio di posizionamento" #: ../src/btsupport.py:41 msgid "networking service" msgstr "servizio di rete" #: ../src/btsupport.py:42 msgid "rendering service" msgstr "servizio di render" #: ../src/btsupport.py:43 msgid "capturing service" msgstr "servizio di cattura" #: ../src/btsupport.py:44 msgid "object transfer service" msgstr "servizio di trasferimento oggetto" #: ../src/btsupport.py:45 msgid "audio service" msgstr "servizio audio" #: ../src/btsupport.py:46 msgid "telephony service" msgstr "servizio telefonia" #: ../src/btsupport.py:47 msgid "information service" msgstr "servizio informativo" #: ../src/btsupport.py:58 msgid "miscellaneous" msgstr "varie" #: ../src/btsupport.py:59 msgid "computer" msgstr "computer" #: ../src/btsupport.py:60 msgid "phone" msgstr "telefono" #: ../src/btsupport.py:61 msgid "network" msgstr "rete" #: ../src/btsupport.py:62 msgid "audio-video" msgstr "audio-video" #: ../src/btsupport.py:63 msgid "peripheral" msgstr "periferica" #: ../src/btsupport.py:64 msgid "imaging" msgstr "immagine" #: ../src/btsupport.py:65 ../src/btsupport.py:73 msgid "uncategorized" msgstr "sernza categoria" #: ../src/btsupport.py:79 msgid "desktop workstation" msgstr "postazione desktop" #: ../src/btsupport.py:80 msgid "server" msgstr "server" #: ../src/btsupport.py:81 msgid "laptop" msgstr "computer portatile" #: ../src/btsupport.py:82 msgid "handheld" msgstr "palmare" #: ../src/btsupport.py:83 msgid "palm" msgstr "palmare" #: ../src/btsupport.py:84 msgid "wearable computer" msgstr "computer indossabile" #: ../src/btsupport.py:88 msgid "cellular" msgstr "cellulare" #: ../src/btsupport.py:89 msgid "cordless" msgstr "senza fili" #: ../src/btsupport.py:90 msgid "smartphone" msgstr "smartphone" #: ../src/btsupport.py:91 msgid "wired modem - voice gateway" msgstr "modem con cavi - gateway voce" #: ../src/btsupport.py:92 msgid "common ISDN access" msgstr "access comune ISDN" #: ../src/btsupport.py:96 msgid "network fully available" msgstr "rete pienamente disponibile" #: ../src/btsupport.py:97 #, python-format msgid "network 1-17%% used" msgstr "rete usata al 1-17%%" #: ../src/btsupport.py:98 #, python-format msgid "network 17-33%% used" msgstr "rete usata al 17-33%%" #: ../src/btsupport.py:99 #, python-format msgid "network 33-50%% used" msgstr "rete usata al 33-50%%" #: ../src/btsupport.py:100 #, python-format msgid "network 50-67%% used" msgstr "rete usata al 50-67%%" #: ../src/btsupport.py:101 #, python-format msgid "network 67-83%% used" msgstr "rete usata al 67-83%%" #: ../src/btsupport.py:102 #, python-format msgid "network 83-99%% used" msgstr "rete usata al 83-99%%" #: ../src/btsupport.py:103 msgid "network unavailable" msgstr "rete non disponibile" #: ../src/btsupport.py:107 msgid "headset" msgstr "auricolare" #: ../src/btsupport.py:108 msgid "hands-free" msgstr "senza mani" #: ../src/btsupport.py:109 msgid "microphone" msgstr "microfono" #: ../src/btsupport.py:110 msgid "loudspeaker" msgstr "altoparlante" #: ../src/btsupport.py:111 msgid "headphone" msgstr "cuffia" #: ../src/btsupport.py:112 msgid "portable audio" msgstr "audio portatile" #: ../src/btsupport.py:113 msgid "car audio" msgstr "audio per automobile" #: ../src/btsupport.py:114 msgid "set-top box" msgstr "set-top box" #: ../src/btsupport.py:115 msgid "hifi audio" msgstr "audio hifi" #: ../src/btsupport.py:116 msgid "vcr" msgstr "videoregistratore" #: ../src/btsupport.py:117 msgid "videocamera" msgstr "videocamera" #: ../src/btsupport.py:118 msgid "camcorder" msgstr "camcorder" #: ../src/btsupport.py:119 msgid "video monitor" msgstr "monitor video" #: ../src/btsupport.py:120 msgid "video display loudspeaker" msgstr "schermo video con altoparlante" #: ../src/btsupport.py:121 msgid "video conferencing" msgstr "videoconferenza" #: ../src/btsupport.py:122 msgid "gaming toy" msgstr "gioco" #: ../src/btsupport.py:127 msgid "joystick" msgstr "joystick" #: ../src/btsupport.py:128 msgid "gamepad" msgstr "joypad" #: ../src/btsupport.py:129 msgid "remote control" msgstr "controllo remoto" #: ../src/btsupport.py:130 msgid "sensing device" msgstr "dispositivo percettivo" #: ../src/btsupport.py:131 msgid "digitizer tablet" msgstr "tavoletta grafica" #: ../src/btsupport.py:132 msgid "card reader" msgstr "lettore di schede" #: ../src/btsupport.py:136 msgid "keyboard" msgstr "tastiera" #: ../src/btsupport.py:137 msgid "mouse" msgstr "mouse" #: ../src/btsupport.py:138 msgid "keyboard+mouse" msgstr "tastiera+mouse" #: ../src/btsupport.py:142 msgid "display" msgstr "schermo" #: ../src/btsupport.py:143 msgid "camera" msgstr "camera" #: ../src/btsupport.py:144 msgid "scanner" msgstr "scanner" #: ../src/btsupport.py:145 msgid "printer" msgstr "stampante" #: ../src/settings.py:67 msgid "New bluetooth device detected" msgstr "Nuovo dispositivo bluetooth rilevato" bluewho-0.1/locales/bluewho.pot0000644000175000017500000001546011317512036016533 0ustar muflonemuflone# BlueWho - Information and notification of new discovered bluetooth devices. # Copyright (C) 2009 Fabio Castelli # This file is distributed under the GPL v2 license (see copyright file). # Fabio Castelli , 2009. # X translation for bluewho package. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: bluewho 0.1\n" "Report-Msgid-Bugs-To: Fabio Castelli \n" "POT-Creation-Date: 2010-01-02 01:31+0100\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" #: ../data/bluewho.glade.h:1 msgid "Available services:" msgstr "" #: ../data/bluewho.glade.h:2 msgid "Detected devices:" msgstr "" #: ../data/bluewho.glade.h:3 msgid "Scan options:" msgstr "" #: ../data/bluewho.glade.h:4 msgid "Startup preferences:" msgstr "" #: ../data/bluewho.glade.h:5 msgid "When a device has been found:" msgstr "" #: ../data/bluewho.glade.h:6 msgid "About" msgstr "" #: ../data/bluewho.glade.h:7 msgid "Auto scan" msgstr "" #: ../data/bluewho.glade.h:8 msgid "Available services" msgstr "" #: ../data/bluewho.glade.h:9 msgid "Clear list" msgstr "" #: ../data/bluewho.glade.h:10 msgid "Detect devices" msgstr "" #: ../data/bluewho.glade.h:11 msgid "Detect devices at _startup" msgstr "" #: ../data/bluewho.glade.h:12 msgid "Preferences" msgstr "" #: ../data/bluewho.glade.h:13 msgid "Re_trieve name during scan (slow)" msgstr "" #: ../data/bluewho.glade.h:14 msgid "Restore last used _window size and position" msgstr "" #: ../data/bluewho.glade.h:15 msgid "S_end notification" msgstr "" #: ../data/bluewho.glade.h:16 msgid "Show _local adapters" msgstr "" #: ../data/bluewho.glade.h:17 msgid "_Automatic scan at startup" msgstr "" #: ../data/bluewho.glade.h:18 msgid "_Notification command:" msgstr "" #: ../data/bluewho.glade.h:19 msgid "_Play a sound" msgstr "" #: ../data/bluewho.glade.h:20 msgid "_Resolve device name after each detection" msgstr "" #: ../src/bluewho.py:64 msgid "adapter" msgstr "" #: ../src/bluewho.py:83 #, python-format msgid "%(year)04d/%(month)02d/%(day)02d %(hour)02d:%(minute)02d.%(second)02d" msgstr "" #: ../src/bluewho.py:113 msgid "No local devices found during detection." msgstr "" #: ../src/bluewho.py:143 #, python-format msgid "Last scan: %s" msgstr "" #: ../src/bluewho.py:156 msgid "Type" msgstr "" #: ../src/bluewho.py:164 msgid "Device name" msgstr "" #: ../src/bluewho.py:172 msgid "Bluetooth address" msgstr "" #: ../src/bluewho.py:179 msgid "Last seen" msgstr "" #: ../src/bluewho.py:188 msgid "Service name" msgstr "" #: ../src/bluewho.py:195 msgid "Protocol" msgstr "" #: ../src/bluewho.py:202 msgid "Channel" msgstr "" #: ../src/bluewho.py:335 msgid "" "A GTK utility to inform and notify you when a new bluetooth device is " "discovered." msgstr "" #: ../src/btsupport.py:40 msgid "positioning service" msgstr "" #: ../src/btsupport.py:41 msgid "networking service" msgstr "" #: ../src/btsupport.py:42 msgid "rendering service" msgstr "" #: ../src/btsupport.py:43 msgid "capturing service" msgstr "" #: ../src/btsupport.py:44 msgid "object transfer service" msgstr "" #: ../src/btsupport.py:45 msgid "audio service" msgstr "" #: ../src/btsupport.py:46 msgid "telephony service" msgstr "" #: ../src/btsupport.py:47 msgid "information service" msgstr "" #: ../src/btsupport.py:58 msgid "miscellaneous" msgstr "" #: ../src/btsupport.py:59 msgid "computer" msgstr "" #: ../src/btsupport.py:60 msgid "phone" msgstr "" #: ../src/btsupport.py:61 msgid "network" msgstr "" #: ../src/btsupport.py:62 msgid "audio-video" msgstr "" #: ../src/btsupport.py:63 msgid "peripheral" msgstr "" #: ../src/btsupport.py:64 msgid "imaging" msgstr "" #: ../src/btsupport.py:65 ../src/btsupport.py:73 msgid "uncategorized" msgstr "" #: ../src/btsupport.py:79 msgid "desktop workstation" msgstr "" #: ../src/btsupport.py:80 msgid "server" msgstr "" #: ../src/btsupport.py:81 msgid "laptop" msgstr "" #: ../src/btsupport.py:82 msgid "handheld" msgstr "" #: ../src/btsupport.py:83 msgid "palm" msgstr "" #: ../src/btsupport.py:84 msgid "wearable computer" msgstr "" #: ../src/btsupport.py:88 msgid "cellular" msgstr "" #: ../src/btsupport.py:89 msgid "cordless" msgstr "" #: ../src/btsupport.py:90 msgid "smartphone" msgstr "" #: ../src/btsupport.py:91 msgid "wired modem - voice gateway" msgstr "" #: ../src/btsupport.py:92 msgid "common ISDN access" msgstr "" #: ../src/btsupport.py:96 msgid "network fully available" msgstr "" #: ../src/btsupport.py:97 #, python-format msgid "network 1-17%% used" msgstr "" #: ../src/btsupport.py:98 #, python-format msgid "network 17-33%% used" msgstr "" #: ../src/btsupport.py:99 #, python-format msgid "network 33-50%% used" msgstr "" #: ../src/btsupport.py:100 #, python-format msgid "network 50-67%% used" msgstr "" #: ../src/btsupport.py:101 #, python-format msgid "network 67-83%% used" msgstr "" #: ../src/btsupport.py:102 #, python-format msgid "network 83-99%% used" msgstr "" #: ../src/btsupport.py:103 msgid "network unavailable" msgstr "" #: ../src/btsupport.py:107 msgid "headset" msgstr "" #: ../src/btsupport.py:108 msgid "hands-free" msgstr "" #: ../src/btsupport.py:109 msgid "microphone" msgstr "" #: ../src/btsupport.py:110 msgid "loudspeaker" msgstr "" #: ../src/btsupport.py:111 msgid "headphone" msgstr "" #: ../src/btsupport.py:112 msgid "portable audio" msgstr "" #: ../src/btsupport.py:113 msgid "car audio" msgstr "" #: ../src/btsupport.py:114 msgid "set-top box" msgstr "" #: ../src/btsupport.py:115 msgid "hifi audio" msgstr "" #: ../src/btsupport.py:116 msgid "vcr" msgstr "" #: ../src/btsupport.py:117 msgid "videocamera" msgstr "" #: ../src/btsupport.py:118 msgid "camcorder" msgstr "" #: ../src/btsupport.py:119 msgid "video monitor" msgstr "" #: ../src/btsupport.py:120 msgid "video display loudspeaker" msgstr "" #: ../src/btsupport.py:121 msgid "video conferencing" msgstr "" #: ../src/btsupport.py:122 msgid "gaming toy" msgstr "" #: ../src/btsupport.py:127 msgid "joystick" msgstr "" #: ../src/btsupport.py:128 msgid "gamepad" msgstr "" #: ../src/btsupport.py:129 msgid "remote control" msgstr "" #: ../src/btsupport.py:130 msgid "sensing device" msgstr "" #: ../src/btsupport.py:131 msgid "digitizer tablet" msgstr "" #: ../src/btsupport.py:132 msgid "card reader" msgstr "" #: ../src/btsupport.py:136 msgid "keyboard" msgstr "" #: ../src/btsupport.py:137 msgid "mouse" msgstr "" #: ../src/btsupport.py:138 msgid "keyboard+mouse" msgstr "" #: ../src/btsupport.py:142 msgid "display" msgstr "" #: ../src/btsupport.py:143 msgid "camera" msgstr "" #: ../src/btsupport.py:144 msgid "scanner" msgstr "" #: ../src/btsupport.py:145 msgid "printer" msgstr "" #: ../src/settings.py:67 msgid "New bluetooth device detected" msgstr "" bluewho-0.1/src/bluewho.py0000755000175000017500000003642611322443401015531 0ustar muflonemuflone#!/usr/bin/env python # -*- coding: utf-8 -*- ## # Project: bluewho # Information and notification of new discovered bluetooth devices. # Author: Fabio Castelli # Copyright: 2009 Fabio Castelli # License: GPL-2+ # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the Free # Software Foundation; either version 2 of the License, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # more details. # # On Debian GNU/Linux systems, the full text of the GNU General Public License # can be found in the file /usr/share/common-licenses/GPL-2. ## import gtk import gtk.glade import pygtk import sys import os.path import select import btsupport import settings import subprocess import time import gettext import handlepaths from gettext import gettext as _ foundDevices = {} statusBarContextId = 0 def playSound(): "Play sound for detected devices" proc = subprocess.Popen(['aplay', '-q', settings.get('sound file')], stdout=subprocess.PIPE) def readTextFile(filename): "Read a text file and return its content" try: f = open(filename, 'r') text = f.read() f.close() except: text = '' return text def addNewDevice(address, name, deviceClass, time, notify): "Add a new device to the list and pops notification" if deviceClass > 0: minor_class, major_class, services_class = btsupport.getClasses(deviceClass) deviceType = btsupport.getDeviceType(major_class) deviceDetail = btsupport.getDeviceDetail(major_class, minor_class) else: deviceType = (0, 'adapter') deviceDetail = (0, _('adapter')) iconPath = getIconPath(deviceType[0], deviceDetail[0]) modelDevices.append([ gtk.gdk.pixbuf_new_from_file(iconPath), deviceClass, deviceType[1], deviceDetail[1], name, address, time ]) if notify: if settings.get('play sound'): playSound() if settings.get('show notification'): command = settings.get('notify cmd').replace('\\n', '\n') % { 'icon': iconPath, 'name': name and name or '', 'address': address } proc = subprocess.Popen(command, shell=True) proc.communicate() def getCurrentTime(): "Returns the formatted current date and time" currentTime = time.localtime() return _('%(year)04d/%(month)02d/%(day)02d ' \ '%(hour)02d:%(minute)02d.%(second)02d') % { 'day': currentTime.tm_mday, 'month': currentTime.tm_mon, 'year': currentTime.tm_year, 'hour': currentTime.tm_hour, 'minute': currentTime.tm_min, 'second': currentTime.tm_sec } def executeScan(): "Scan for local and remote devices" # Add local adapters if settings.get('show local'): for i in range(10): name, address = btsupport.get_localAdapter(i) if name and address: # Adapter device found if not foundDevices.get(address): name = 'hci%d (%s)' % (i, name) addNewDevice(address, name, 0, getCurrentTime(), True) modelRow = modelDevices[-1] foundDevices[address] = modelRow # Update seen time modelRow[COL_LASTSEEN] = getCurrentTime() else: # No more devices found if i==0: print 'error: no local devices found, unable to continue' diag = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, _('No local devices found during detection.')) diag.set_icon_from_file(handlepaths.get_app_logo()) diag.run() diag.destroy() # Disable autoscan toolbAutoScan.set_active(False) return break # Add detected devices devices = btsupport.DeviceDiscoverer() devices.newDevice = on_newDevice try: devices.find_devices( lookup_names=settings.get('retrieve names'), duration=settings.get('scan duration'), flush_cache=settings.get('flush cache') ) except: devices.done = True toolbAutoScan.set_active(False) readfiles = [ devices, ] # Wait till the end while not devices.done: progSearching.pulse() while gtk.events_pending(): gtk.main_iteration() ret = select.select( readfiles, [], [] )[0] if devices in ret: devices.process_event() lastscan = time.localtime() statusScan.pop(statusBarContextId) statusScan.push(statusBarContextId, _('Last scan: %s') % getCurrentTime()) def createDevicesColumns(): "Create columns for devices list" # Column for device icon cell = gtk.CellRendererPixbuf() column = gtk.TreeViewColumn('') column.pack_start(cell) column.set_attributes(cell, pixbuf=COL_ICON) tvwDevices.append_column(column) # Column for device type cell = gtk.CellRendererText() column = gtk.TreeViewColumn(_('Type')) column.pack_start(cell) column.set_expand(True) column.set_attributes(cell, text=COL_DETAIL) tvwDevices.append_column(column) # Column for device name cell = gtk.CellRendererText() column = gtk.TreeViewColumn(_('Device name')) column.pack_start(cell) column.set_expand(True) column.set_attributes(cell, text=COL_NAME) tvwDevices.append_column(column) # Column for device address cell = gtk.CellRendererText() column = gtk.TreeViewColumn(_('Bluetooth address')) column.pack_start(cell) column.set_attributes(cell, text=COL_ADDRESS) tvwDevices.append_column(column) # Column for device address cell = gtk.CellRendererText() column = gtk.TreeViewColumn(_('Last seen')) column.pack_start(cell) column.set_attributes(cell, text=COL_LASTSEEN) tvwDevices.append_column(column) def createServicesColumns(): "Create columns for services list" # Column for service name cell = gtk.CellRendererText() column = gtk.TreeViewColumn(_('Service name')) column.pack_start(cell) column.set_attributes(cell, text=0) tvwServices.append_column(column) # Column for service protocol cell = gtk.CellRendererText() column = gtk.TreeViewColumn(_('Protocol')) column.pack_start(cell) column.set_attributes(cell, text=1) tvwServices.append_column(column) # Column for service channel cell = gtk.CellRendererText() column = gtk.TreeViewColumn(_('Channel')) column.pack_start(cell) column.set_attributes(cell, text=2) tvwServices.append_column(column) def saveDevicesList(filename): "Save devices list to filename" saveFile = open(filename, 'w') for device in modelDevices: saveFile.write('%s\n%s\n%d\n%s\n>\n' % ( device[COL_ADDRESS], device[COL_NAME], device[COL_CLASS], device[COL_LASTSEEN])) saveFile.close() def loadDevicesList(filename): "Load devices list from filename" loadFile = open(filename, 'r') devices = loadFile.read().split('\n>\n') for device in devices: if len(device) > 0: device = device.split('\n') addNewDevice(device[0], device[1], int(device[2]), device[3], False) foundDevices[device[0]] = modelDevices[-1] loadFile.close() def getIconPath(deviceType, deviceDetail): "Return the icon path for a device" if deviceType == 0 and deviceDetail == 0: # Adapter iconPath = handlepaths.getPath('gfx', 'adapter.png') else: # Normal device iconPath = handlepaths.getPath('gfx', 'class%d/%d.png' % ( deviceType, deviceDetail)) if not os.path.isfile(iconPath): iconPath = handlepaths.getPath('gfx', 'unknown.png') return os.path.join(handlepaths.base_path, iconPath) def on_newDevice(name, address, device_class): "Callback function called when a new device has been discovered" modelRow = foundDevices.get(address) # Search for the name if not found during scan if not name and settings.get('resolve names'): # Search name if the device exists without name or if doesn't exist at all if (modelRow and not modelRow[COL_NAME]) or not modelRow: # Find name by scanning device name = btsupport.getDeviceName(address) if name is None: name = '' # If device doesn't exist then add it if not modelRow: addNewDevice(address, name, device_class, getCurrentTime(), True) modelRow = modelDevices[-1] foundDevices[address] = modelRow else: # Sets the new name if it didn't exist if not modelRow[COL_NAME] and name: modelRow[COL_NAME] = name # Update seen time modelRow[COL_LASTSEEN] = getCurrentTime() def on_winDevices_delete_event(widget, data=None): "Close the main Window and gtk main loop" dialogServices.destroy() gtk.main_quit() cursize = winDevices.get_size() curpos = winDevices.get_position() saveDevicesList(settings.devicesfiles) settings.set('window width', cursize[0]) settings.set('window height', cursize[1]) settings.set('window left', curpos[0]) settings.set('window top', curpos[1]) return 0 def on_toolbRefresh_clicked(widget, data=None): "Reload the list of local and detected devices" progSearching.show() toolbRefresh.set_sensitive(False) toolbServices.set_sensitive(False) # Single scan executeScan() # Automatic scan while toolbAutoScan.get_active(): while gtk.events_pending(): gtk.main_iteration() executeScan() # # What is this? useful for testing purposes, you can just ignore it # on_newDevice('STEFANIA', '00:11:22:33:44:55', 5211141) # # Hide pulsing progressbar progSearching.hide() toolbRefresh.set_sensitive(True) def on_toolbServices_clicked(widget, data=None): "Show the details of the selected device" iter = modelDevices[tvwDevices.get_selection().get_selected()[1]] modelServices.clear() address = iter[COL_TYPE] == 'adapter' and 'localhost' or iter[COL_ADDRESS] # Load the list of enabled services services = btsupport.listServices(address) for service in services: modelServices.append([service[0], service[1], service[2]]) dialogServices.run() dialogServices.hide() def on_toolbClear_clicked(widget, data=None): "Clear the devices list" modelDevices.clear() foundDevices.clear() toolbServices.set_sensitive(False) def on_toolbPreferences_clicked(widget, data=None): "Show preferences and save settings" dialogPreferences.run() dialogPreferences.hide() settings.set('startup scan', chkStartupScan.get_active()) settings.set('autoscan', chkAutoScan.get_active()) settings.set('retrieve names', chkRetrieveName.get_active()) settings.set('resolve names', chkResolveNames.get_active()) settings.set('show local', chkLocalAdapters.get_active()) settings.set('notify cmd', txtNotificationCmd.get_text()) settings.set('show notification', chkNotification.get_active()) settings.set('play sound', chkPlaySound.get_active()) settings.set('sound file', filePlaySound.get_filename()) settings.save(clearDefaults=True) def on_toolbAbout_clicked(widget, data=None): "Shows the about dialog" about = gtk.AboutDialog() about.set_program_name(handlepaths.APP_TITLE) about.set_version(handlepaths.APP_VERSION) about.set_comments(_('A GTK utility to inform and notify you when a new ' 'bluetooth device is discovered.')) about.set_icon_from_file(handlepaths.get_app_logo()) about.set_logo(gtk.gdk.pixbuf_new_from_file(handlepaths.get_app_logo())) about.set_copyright('Copyright 2009 Fabio Castelli') about.set_translator_credits(readTextFile(handlepaths.getPath('doc','translators'))) about.set_license(readTextFile(handlepaths.getPath('doc','copyright'))) about.set_website_label('BlueWho') gtk.about_dialog_set_url_hook(lambda url, data=None: url) about.set_website('http://code.google.com/p/bluewho/') about.set_authors(['Fabio Castelli ', 'http://www.ubuntutrucchi.it']) about.run() about.destroy() def on_tvwDevices_cursor_changed(widget, data=None): "Control sensitiveness of the buttons" if tvwDevices.get_selection().get_selected()[1]: toolbServices.set_sensitive(True) def on_btnPlay_clicked(widget, data=None): playSound() # Signals handler signals = { 'on_winDevices_delete_event': on_winDevices_delete_event, 'on_toolbRefresh_clicked': on_toolbRefresh_clicked, 'on_toolbClear_clicked': on_toolbClear_clicked, 'on_toolbServices_clicked': on_toolbServices_clicked, 'on_toolbPreferences_clicked': on_toolbPreferences_clicked, 'on_toolbAbout_clicked': on_toolbAbout_clicked, 'on_tvwDevices_cursor_changed': on_tvwDevices_cursor_changed, 'on_btnPlay_clicked': on_btnPlay_clicked } # Load domain for translation for module in (gettext, gtk.glade): module.bindtextdomain(handlepaths.APP_NAME, handlepaths.getPath('locale')) module.textdomain(handlepaths.APP_NAME) gladeFile = gtk.glade.XML( fname=handlepaths.getPath('data', '%s.glade' % handlepaths.APP_NAME), domain=handlepaths.APP_NAME) gladeFile.signal_autoconnect(signals) gw = gladeFile.get_widget # Main window winDevices = gw('winDevices') winDevices.set_icon_from_file(handlepaths.get_app_logo()) winDevices.set_title(handlepaths.APP_TITLE) tvwDevices = gw('tvwDevices') toolbRefresh = gw('toolbRefresh') toolbAutoScan = gw('toolbAutoScan') toolbServices = gw('toolbServices') progSearching = gw('progSearching') statusScan = gw('statusScan') statusBarContextId = statusScan.get_context_id(handlepaths.APP_NAME) # Model for devices (icon, class, type, detail, name, mac, last seen) modelDevices = gtk.ListStore(gtk.gdk.Pixbuf, int, str, str, str, str, str) COL_ICON, COL_CLASS, COL_TYPE, COL_DETAIL, \ COL_NAME, COL_ADDRESS, COL_LASTSEEN = range(7) tvwDevices.set_model(modelDevices) createDevicesColumns() # Properties window dialogServices = gw('dialogServices') dialogServices.set_icon_from_file(handlepaths.get_app_logo()) dialogServices.set_title(handlepaths.APP_TITLE) tvwServices = gw('tvwServices') # Model for services (name, protocol, port) modelServices = gtk.ListStore(str, str, str) tvwServices.set_model(modelServices) createServicesColumns() # Preferences window dialogPreferences = gw('dialogPreferences') dialogPreferences.set_icon_from_file(handlepaths.get_app_logo()) dialogPreferences.set_title(handlepaths.APP_TITLE) chkStartupScan = gw('chkStartupScan') chkAutoScan = gw('chkAutoScan') chkRetrieveName = gw('chkRetrieveName') chkResolveNames = gw('chkResolveNames') chkLocalAdapters = gw('chkLocalAdapters') txtNotificationCmd = gw('txtNotificationCmd') chkNotification = gw('chkNotification') chkPlaySound = gw('chkPlaySound') filePlaySound = gw('filePlaySound') # Load settings from ~/.config/bluewho.conf settings.load() winDevices.move(settings.get('window left'), settings.get('window top')) winDevices.set_default_size(settings.get('window width'), settings.get('window height')) chkStartupScan.set_active(settings.get('startup scan')) chkAutoScan.set_active(settings.get('autoscan')) chkRetrieveName.set_active(settings.get('retrieve names')) chkResolveNames.set_active(settings.get('resolve names')) chkLocalAdapters.set_active(settings.get('show local')) txtNotificationCmd.set_text(settings.get('notify cmd')) chkNotification.set_active(settings.get('show notification')) chkPlaySound.set_active(settings.get('play sound')) filePlaySound.set_filename(settings.get('sound file')) # Load devices list from ~/.config/devices if os.path.exists(settings.devicesfiles): loadDevicesList(settings.devicesfiles) winDevices.show() toolbAutoScan.set_active(settings.get('autoscan')) if settings.get('startup scan'): on_toolbRefresh_clicked(None) gtk.main() # Save settings on close settings.save(clearDefaults=True) bluewho-0.1/src/settings.py0000644000175000017500000001015111322441753015714 0ustar muflonemuflone# -*- coding: utf-8 -*- ## # Project: bluewho # Information and notification of new discovered bluetooth devices. # Author: Fabio Castelli # Copyright: 2009 Fabio Castelli # License: GPL-2+ # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the Free # Software Foundation; either version 2 of the License, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # more details. # # On Debian GNU/Linux systems, the full text of the GNU General Public License # can be found in the file /usr/share/common-licenses/GPL-2. ## import os import ConfigParser import handlepaths from gettext import gettext as _ config = None confdir = os.path.join(os.path.expanduser('~/.config/bluewho')) conffile = os.path.join(confdir, 'settings.conf') devicesfiles = os.path.join(confdir, 'devices') __sectionSettings = 'settings' __sectionStartup = 'startup' __sectionScan = 'scan' __sectionNotify = 'notify' __defSettings = None if not os.path.exists(os.path.abspath(os.path.join(confdir, '..'))): os.mkdir(os.path.abspath(os.path.join(confdir, '..'))) if not os.path.exists(confdir): os.mkdir(confdir) def load(filename=conffile): "Load settings from the configuration file" global config config = ConfigParser.RawConfigParser() loadDefaults() if os.path.exists(filename): config.read(filename) # Settings lookup is made upon __defSettings for setting in __defSettings.keys(): # Add section if doesn't exist if not config.has_section(__defSettings[setting][2]): config.add_section(__defSettings[setting][2]) if not config.has_option(__defSettings[setting][2], setting): config.set(__defSettings[setting][2], setting, str(__defSettings[setting][1])) def loadDefaults(): global __defSettings strbool = lambda value: value == 'True' __defSettings = { 'startup scan': [strbool, False, __sectionStartup], 'autoscan': [strbool, False, __sectionStartup], 'restore size': [strbool, False, __sectionStartup], 'retrieve names': [strbool, False, __sectionScan], 'resolve names': [strbool, True, __sectionScan], 'show local': [strbool, False, __sectionScan], 'notify cmd': [str, 'notify-send -u low -i "%(icon)s" ' + \ '"%s" ' % _('New bluetooth device detected') + \ '"%(name)s\\n(%(address)s)"', __sectionNotify], 'show notification': [strbool, True, __sectionNotify], 'play sound': [strbool, False, __sectionNotify], 'sound file': [str, handlepaths.getPath('data', 'newdevice.wav'), __sectionNotify], 'scan duration': [int, 8, __sectionSettings], 'flush cache': [strbool, True, __sectionSettings], 'window width': [int, 570, __sectionStartup], 'window height': [int, 360, __sectionStartup], 'window left': [int, 200, __sectionStartup], 'window top': [int, 100, __sectionStartup], } def save(filename=conffile, clearDefaults=False): "Save settings into the configuration file" file = open(filename, mode='w') if clearDefaults: for setting in __defSettings.keys(): if config.has_option(__defSettings[setting][2], setting): if get(setting) == __defSettings[setting][1]: config.remove_option(__defSettings[setting][2], setting) config.write(file) file.close def get(setting): "Returns a specified setting from the configuration or default values" if config.has_option(__defSettings[setting][2], setting): return __defSettings[setting][0](config.get(__defSettings[setting][2], setting)) elif __defSettings.has_key(setting): return __defSettings[setting][1] else: print 'unknown setting: %s' % setting def default(setting): "Returns the default value for a specified setting" if __defSettings.has_key(setting): return __defSettings[setting][1] def set(setting, value): "Sets a specific setting to the value." config.set(__defSettings[setting][2], setting, str(value)) bluewho-0.1/src/btsupport.py0000644000175000017500000001716511317474011016127 0ustar muflonemuflone# -*- coding: utf-8 -*- ## # Project: bluewho # Information and notification of new discovered bluetooth devices. # Author: Fabio Castelli # Copyright: 2009 Fabio Castelli # License: GPL-2+ # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the Free # Software Foundation; either version 2 of the License, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # more details. # # On Debian GNU/Linux systems, the full text of the GNU General Public License # can be found in the file /usr/share/common-licenses/GPL-2. ## import bluetooth from gettext import gettext as _ DEVICETYPE_MISCELLANEOUS, DEVICETYPE_COMPUTER, DEVICETYPE_PHONE, \ DEVICETYPE_NETWORK, DEVICETYPE_AUDIOVIDEO, DEVICETYPE_PERIPHERAL, \ DEVICETYPE_IMAGING, DEVICETYPE_UNCATEGORIZED, DEVICETYPE_UNKNOWN = range(9) def getClasses(device_class): "Return device minor, major class and services class" minor_class = (device_class & 0xff) >> 2 # Bits 02-07 Minor class bitwise major_class = (device_class >> 8) & 0x1f # Bits 08-12 Major class bitwise services_class = (device_class >> 16) # Bits 16-23 Service class return (minor_class, major_class, services_class) def getEnabledServices(service_class): "Return enabled services for a service_class" availableServices = ( _('positioning service'), _('networking service'), _('rendering service'), _('capturing service'), _('object transfer service'), _('audio service'), _('telephony service'), _('information service') ) services = [] for service in range(len(availableServices)): if service_class & (1 << service): # Service enabled? services.append(availableServices[service]) return services def getDeviceType(major_class): "Return the device major class" major_classes = ( (0, _('miscellaneous')), (1, _('computer')), (2, _('phone')), (3, _('network')), (4, _('audio-video')), (5, _('peripheral')), (6, _('imaging')), (7, _('uncategorized')) ) if major_class > DEVICETYPE_UNCATEGORIZED: major_class = DEVICETYPE_UNKNOWN # Unknown class return major_classes[major_class] def getDeviceDetail(major_class, minor_class): "Return the device detail type" uncategorized = _('uncategorized') if major_class == DEVICETYPE_MISCELLANEOUS: return (0, uncategorized) if major_class == DEVICETYPE_COMPUTER: return { 1: (1, _('desktop workstation')), 2: (2, _('server')), 3: (3, _('laptop')), 4: (4, _('handheld')), 5: (5, _('palm')), 6: (6, _('wearable computer')) }.get(minor_class, (0, uncategorized)) elif major_class == DEVICETYPE_PHONE: return { 1: (1, _('cellular')), 2: (2, _('cordless')), 3: (3, _('smartphone')), 4: (4, _('wired modem - voice gateway')), 5: (5, _('common ISDN access')) }.get(minor_class, (0, uncategorized)) elif major_class == DEVICETYPE_NETWORK: return { 0: (0, _('network fully available')), 1: (1, _('network 1-17%% used')), 2: (2, _('network 17-33%% used')), 3: (3, _('network 33-50%% used')), 4: (4, _('network 50-67%% used')), 5: (5, _('network 67-83%% used')), 6: (6, _('network 83-99%% used')), 7: (7, _('network unavailable')) }.get(minor_class >> 3, (0, uncategorized)) # 3 lowers bit unused elif major_class == DEVICETYPE_AUDIOVIDEO: return { 1: (1, _('headset')), 2: (2, _('hands-free')), 4: (4, _('microphone')), 5: (5, _('loudspeaker')), 6: (6, _('headphone')), 7: (7, _('portable audio')), 8: (8, _('car audio')), 9: (9, _('set-top box')), 10: (10, _('hifi audio')), 11: (11, _('vcr')), 12: (12, _('videocamera')), 13: (13, _('camcorder')), 14: (14, _('video monitor')), 15: (15, _('video display loudspeaker')), 16: (16, _('video conferencing')), 18: (18, _('gaming toy')) }.get(minor_class, (0, uncategorized)) elif major_class == DEVICETYPE_PERIPHERAL: if minor_class <= 15: # Lower 4 bits return { 1: (1, _('joystick')), 2: (1, _('gamepad')), 3: (1, _('remote control')), 4: (1, _('sensing device')), 5: (1, _('digitizer tablet')), 6: (1, _('card reader')) }.get(minor_class, (0, uncategorized)) else: # Higher 2 bits return { 1: (81, _('keyboard')), 2: (82, _('mouse')), 3: (83, _('keyboard+mouse')) }.get(minor_class >> 4, (0, uncategorized)) elif major_class == DEVICETYPE_IMAGING: return { 1: _('display'), 2: _('camera'), 4: _('scanner'), 8: _('printer') }.get(minor_class, (0, uncategorized)) def get_localAdapter(deviceNr): "Return name and address of a local adapter" import struct from bluetooth import _bluetooth as bt name = None address = None sock = bt.hci_open_dev(deviceNr) if sock.getsockid() >= 0: sock.settimeout(3) # Save original filter orig_filter = sock.getsockopt(bt.SOL_HCI, bt.HCI_FILTER, 14) # Create new filter new_filter = orig_filter new_filter = bt.hci_filter_new() bt.hci_filter_set_ptype(new_filter, bt.HCI_EVENT_PKT) bt.hci_filter_set_event(new_filter, bt.EVT_CMD_COMPLETE) # CMD Read local name opcode = bt.cmd_opcode_pack(bt.OGF_HOST_CTL, bt.OCF_READ_LOCAL_NAME) bt.hci_filter_set_opcode(new_filter, opcode) sock.setsockopt(bt.SOL_HCI, bt.HCI_FILTER, new_filter) bt.hci_send_cmd(sock, bt.OGF_HOST_CTL, bt.OCF_READ_LOCAL_NAME) try: data = sock.recv(255) name = data[7:] name = name[:name.find('\0')] except bluetooth._bluetooth.timeout: print 'bluetooth timeout during local device scan for name' # CMD Read local address opcode = bt.cmd_opcode_pack(bt.OGF_INFO_PARAM, bt.OCF_READ_BD_ADDR) bt.hci_filter_set_opcode(new_filter, opcode) sock.setsockopt(bt.SOL_HCI, bt.HCI_FILTER, new_filter) bt.hci_send_cmd(sock, bt.OGF_INFO_PARAM, bt.OCF_READ_BD_ADDR) try: data = sock.recv(255) status, raw_bdaddr = struct.unpack("xxxxxxB6s", data) address = ['%02X' % ord(b) for b in raw_bdaddr] address.reverse() address = ':'.join(address) except bluetooth._bluetooth.timeout: print 'bluetooth timeout during local device scan for address' # Restore original filter sock.setsockopt(bt.SOL_HCI, bt.HCI_FILTER, orig_filter) sock.close() return name, address def listServices(address): "Return the list of enabled services" services = [] for service in bluetooth.find_service(address=address): services.append((service['name'], service['protocol'], service['port'])) return services def getDeviceName(address): "Retrieve device name" return bluetooth.lookup_name(address) class DeviceDiscoverer(bluetooth.DeviceDiscoverer): "Support for asynchron detection" def __init__(self): "Superclass constructor" bluetooth.DeviceDiscoverer.__init__(self) # Callback function to receive new discovered device self.newDevice = None def pre_inquiry(self): "Scan is starting" self.done = False def device_discovered(self, address, device_class, name): "Call callback function for new discovered device" if self.newDevice: self.newDevice(name, address, device_class) def inquiry_complete(self): "Scan completed" self.done = True bluewho-0.1/src/handlepaths.py0000644000175000017500000000330011317520673016350 0ustar muflonemuflone## # Project: bluewho # Information and notification of new discovered bluetooth devices. # Author: Fabio Castelli # Copyright: 2009 Fabio Castelli # License: GPL-2+ # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the Free # Software Foundation; either version 2 of the License, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # more details. # # On Debian GNU/Linux systems, the full text of the GNU General Public License # can be found in the file /usr/share/common-licenses/GPL-2. ## import os import sys base_path = os.path.dirname(os.path.abspath(__file__)) APP_NAME = 'bluewho' APP_TITLE = 'BlueWho' APP_VERSION = '0.1' PATHS = { 'locale': [ '%s/../locales' % base_path, '%s/share/locale' % sys.prefix], 'data': [ '%s/../data' % base_path, '%s/share/%s/data' % (sys.prefix, APP_NAME)], 'gfx': [ '%s/../gfx' % base_path, '%s/share/%s/gfx' % (sys.prefix, APP_NAME)], 'doc': [ '%s/../doc' % base_path, '%s/share/doc/%s' % (sys.prefix, APP_NAME)] } def getPath(key, append = ''): "Returns the correct path for the specified key" for path in PATHS[key]: if os.path.isdir(path): if append: return os.path.abspath(os.path.join(path, append)) else: return os.path.abspath(path) def get_app_logo(): "Returns the path of the icon logo" return getPath('data', '%s.svg' % APP_NAME) bluewho-0.1/data/bluewho.desktop0000644000175000017500000000047111320201337016656 0ustar muflonemuflone[Desktop Entry] Version=1.0 Name=BlueWho Comment=Information and notification of new discovered bluetooth devices Type=Application Comment[it_IT]=Informazioni e notifica dei nuovi dispositivi bluetooth rilevati Exec=/usr/bin/bluewho Icon=/usr/share/bluewho/data/bluewho.svg Terminal=false Categories=Utility;GTK; bluewho-0.1/data/bluewho.svg0000644000175000017500000060262011317454611016023 0ustar muflonemuflone bluewho-0.1/data/bluewho.glade0000644000175000017500000006411611317402571016300 0ustar muflonemuflone 1 True vertical True True Detect devices True gtk-refresh False True True Auto scan True gtk-media-record False True True Clear list True gtk-clear False True True False True True False Available services True gtk-properties False True True Preferences True gtk-preferences False True True About True gtk-about False True False 0 True 7 vertical 5 True 0 <b>Detected devices:</b> True False 0 True True automatic automatic in True True 1 False 2 1 True False 2 350 300 5 mouse normal False True vertical 2 True 5 vertical 3 True 0 <b>Available services:</b> True False 0 True True automatic automatic in True True 1 1 True end gtk-close True True True True False False 0 False end 0 5 False mouse normal False True vertical 2 True vertical True 0 4 <b>Startup preferences:</b> True False 0 True 12 True vertical Detect devices at _startup True True False True True True 0 _Automatic scan at startup True True False True True 1 Restore last used _window size and position True True False True True 2 1 True 0 4 <b>Scan options:</b> True False 2 True 12 True vertical Re_trieve name during scan (slow) True True False True True 0 _Resolve device name after each detection True True False True True 1 Show _local adapters True True False True True True 2 3 True 0 5 <b>When a device has been found:</b> True False 4 True 12 True vertical True 3 True 0 _Notification command: True txtNotificationCmd False 0 True True 1 0 S_end notification True True False True True 1 True 5 _Play a sound True True False True True False 0 True 1 True True True top True gtk-media-play False 2 2 5 1 True end gtk-close True True True True False False 0 False end 0 bluewho-0.1/data/newdevice.wav0000644000175000017500000015334011270670504016324 0ustar muflonemufloneRIFFWAVEfmt "VXdataL || JJ$$ ( ('+&+:-:->.>.N.M.g-f-++((X%X%E!D!hh00sra `    { { uw4h o <Y ; ]$ jGPa r-9II9t9&T` kT"X  R89lxWpKzAZ' .&G9cGb(ViruJ0~D߉FEG!߻dڀ>߲sөۡ١o *1$Їշ3Ք3բҁ]ל!i*ۑ\>5j _1p ; -  m D ` A 6 o, Y V  ], jw|q_Ua>ggY:)!'[$JMpT߬hHI@IiJtv%m4X+1W]Dv(tQiqGj eTY.h1 6 CnO:%)Pja(@Yf#s>Oߋ_ݯfJ} m-؄sXd^qۖ݋>keo-\4> 6= ~H_ RaY .";"" !5 L^PG"2O@ ) H~   x STpR= k3 M #6 ?7 P E  B QZ~. M=E:]0!@a&JVP2'TUsw}7+NIq1;4A7x&~jT#cT^l7 {YMR$y^|qkysjD/}b`Rpm [ P&WWDh    9 \^A$aSWWB]wdyFh[3pz}7=Gt}W%s{^vTVYSBRs}Ti aZCjfPi@uvuI H`:Aa%u-U&\\&m5&L~c*oT5%@$M x Oe#8!c_,2L ?) p + V [ z? iAz  T & 2 oL 9?ZKT/_4zo@|d O2&Or9$uC =Um4CvHd=M $0=68L( PdnD!@s6~=i:,N~OWB)C}/Fp69.)/9V:`j,v7"i3tz nwf7u7 Fe:_ U !1* /pe JB 7S M  + H D o! j 7N Q {  Z 9 #P]H^DvaxKL4 BI2pO1[9 ) |  (  M %e % Bn u+  9?*pIF*"(/B9^\)]>Slw" *<Yy[d z7K'&?@` Pl_"jt}?`'?|nQ{.83(6{V kA.JNu1>uIAY_''#[Us7rM)sDM E   G S q*&Z{Mz= px)bobSA* > ? x1  6 atzD    K i nq 9      ;@Zc#2R._GGRnf>C1]1S sp= #ny 72(rE,TJ9`c%GZl F @U8 @r>'Sx`YqDT][A (Yib]%cxF709_G;- pbD- 3$ul8 1 PA  ?n'Sv6)uFf^C*l|+d3dN/a f c W ]J EJe  0 bj  5  o} nN {6 / . . '  a"l_S3|eS*u~>ioAM!V*o*.(xFZw$##hG~b*<M` >J|N s ZQq_,CB2|q0zfnN0[s;b0(D"vkz'=+i|cD= Jp+nOi8zyrI~  J 593:v@g9(T }&  4 q e a5jSr   z$   t Pz @U ?C H? T? _@ d7 `% Q 21H!fX_"/HB]^lnl9'H>`0'/`~3`-%@dp9p\+ h ~m3P{37kuX0 Y` pIa_ i :YbyN}QI\[~%aJyK+jI9:Ghb5@o(m   9% b^Mufmr?~b>J:.D("#   O    K /  \  B ` = - ) + - (   o=`)jDg9;~3jyE'Kq^y\ WSBRsZ'Q[~GV 3T_N'i\s?V_}\Rc`u-p A#);QHdpt7nY4n>Te*Ig&.#W h/pE)^W':XPie"E  oS o /60DR ,A1B;/<!/2 h @ F i   .X u 9 \  S 6 j' a$ e& n( |&   ~V F3 vN zLou} #rn/y0SL"y[l++WF!ZZp75lWLs0./I `% ?z<gXV] g * rK#.{!A9hv&1r4*-bvLDOJpTY\j/~AF%~7ro #!RG:v!=[ ^H 9 B }z511MB| f.+=>2Hi=n/  l *6 Gj   + I   x OH -       r?A0a|Q0E@v !/3h`VH5naQ}J BpE[3y.oRBf zq#dqp`i$Kc!epKF Pa8T] Pw+W~;_qJ6|4/Ei%JQg6V5?nW(wF'vV  !Ua  ~H1GJ3(7BV9ml:5NO?' _\ N   :`] 0  " 5 r  Lm ;  s Z RU[_V6wg"Z @q,^ "wR/TYZ8'$3KUzbH~eI^}nf5Tk8SLa*I WG?F;!$6Hb7ig^D!Xr^plH Zjn0Mkx4I#,=h2n5 +M~  f $ 55Dy!+G-^O6z6?y+eF[4 q   : o  R   ?A /{7x_>?uX 5/JN5D1fGAQ^!}fk9&+RK:h2kJ ]o Gb"K?F8nR \ 5  K x 11 F*73()n; 0Q|+WL-qAXk J)7X^HT^<_N0 |Io]WcOAu"II ~W<0.%5cF\y]*'{JmbG%&QVa'(\%]`W6&j 6  - T.RF=p(QWS{=np< 9 _q  ~ !r  ^   A  U3pG\Hr4qj.R#>;?m% (zrGPSHf]6Uw]8[n5qZgiQc.E  {; "  8 ?F k  [uzX/sV-a7mH,/e-O!QJO-ALs ;bh8 t4^f6~&o9W=S`D d(   I  T^lwE ]N~#L~b9^JAq  7 w  @ g 6@   14 a]oI[HK3PCr1}++zKXN?K,$#?xU*m3GB8xf R ~ u) +  \N h Ah T A y P p B  V [O"8 t 9wBU?s7i`BdO =dK>]5kX9 ?w|*`-| WR|p5E xrh#U^Euc1BP#-&geiQ$0dV`* FV JGX !j! aS;bAWM  -  ! kv:$0Me\ ;K `9:c1@Oi69~Qbg !rE<i - {  xCE@*a ,'4kPc29{۠+T.Iڈ0ۭڄ]Q7[\'|v L]pXMOF mSFX  r T z z/ } D  zi_ 6bgN}5gY g Q  2 >^<8?vYdTjs +7   x C]%yJVZ |sF h<  c ]J *U.F.kNP%G]xuNx9];1Dv9y//*f;^=m޳IXߤV#w rs 6!2  = [g L v  X   e: , > lfH Q9  u. ,&cA7D-r-X0 r = . % UkVB2?8> 7 ry]*we (o NEqf@&%;b/~Fo2x{ uq20vk$ XVTca^ DnY { $. {!7":F"!!} iT   4sL5Jm t Y~lj)QAQmgd<@N7xSQz}9ZdA:C@-'Q`&-KfzXd;`4*ep-v^PhF0h( 4p)YShP  &g t X ~ e 4 KN  _L|):d=BV' O 6 q   r$`ymp2m8 h u7_;*a'5vM [tQw0 1    5 Sw(rc0&W_EDW %ckDK0{')J7Y*nWGO+*]}jSI4, D{$3 L Z  Hg    T C3cltz:<  ( LmYjK#nxfZ% O  y & B /e+%e[EHo].y 9 qSghp ga\s]f g& Fo jmv#sW~;27m3PA&}"%u8 N7 UZZc  s! V[ r> 5  l# >MD|??f\:T S ovFq4B.$Kn <b5(i.yE%9hHfD=JmK]SAq s6*Ez ml9ygg8kot}w8'~I:n \ Oa  w ,v 1i p !O6E+C~boY % e n 0 #}s(%"2 f : S 1^'D&sl %m-`-QW&  ~~ W  y{ h^0LMc$+DC5En0y $,cqW*x[%lqGz+YG73q`T >r(t  6  k  D_}y'ZxDG t  On ? 4D t  - O  5 X /&+ Oe  U 4  ; =P~V 6v*Q}R ]  \Rc&}fZ: Po k Q\U_zWV, ^o8AoDF%UI?u1MC R$a B_BY1<H ieBCy  QQh?w+8Wxp O n 7VK '>  k RoUdN<_ +R5E>_F|PmN3dUSxf;v{Q"}NvF1m>At(id kwo;g\ *  q\gfy |ZIr30`7/5@Jk W ! D  dU )@<<~ p [ , [ L9r+Gj;k%+f[e9  j x 4 GHOc5p{GOJ\{dco WXKd35#R <_HY-k}(:w+#{ ` <10"2E Jjx  Q w9 )c (y-+  j t ' B i JP K  P 8\ P & "  0U ye_ i O   ?<@iK?+@,)}$ ] & Qcd\TW:q44(]Q'|opL5j! :)Nm <-C{I 73x`V Pz k : GZ JWA{(5  % H# <5 \ GT ~ (+17s_EVMa,%PAe>>[&Xu~b*,kZr$AG0Ie6N-fRw\m?5*)FEAQ $\S>uP&rc)HEpEL=0`a3?{) , T =3  NZB^aO= f:v\p v}$9  6 5J(`N.YlP t ]  zwr{3[l@ki& 9y :5FH4p JT@ > !wYbu\Gl[>aiWCJYCMOP'W9gS~ )]gg c ?  ^[R T* , = I -  c7 ] ` " In2yVJSX.]2T$`1zUN2Lfq ILb;t)s]WrXXpD#7~9_s26&?  UqF k v$j, k  }i X9 q`NY S } H 4K P]\4M2@2 H 6   D %9a@2}?PqpnNvqI!'ky+T]P 5ng,$Y7RTcvw!~ p  #% ]lCu(,"Rqt Mg  1 QE.!Y|+8z `bX rnJD*4"#} i"W6MlRuT&& B] Q 2C=b r bF    r   * J A x:  I ki n# ' s+-)8`_4+]ywp!+IZ8u >Abx?,<Qos(]Cl `59d  <x p % Qi   Q H3aSG_| ? 4 f  3 : =   u* X gh V  9 ? X b6{1~W%Fw!;|Y8gVzo;-E^/CC?0g~90^o9rzyF#h8Wn_z"}xlC^\!rl "c":NFr ]P/j  ={\ius   &t:=,r4gL01 =  ~ s6!oFQk6v_hK s q\ 1    #*  K {) _  ac ;cx'" E7L=)5fq Mk@C#Uopa+Ybl:kN_&P  18   B b B  7  G   VM H   ^ R 4h1TR,t rwFH&p\8b*f~ fT5wg3O7Mj~~OT}bQN2G,i\D;Jgx/ au7@*\ &G#V c3e*Y @c jnc 1  P  ~ F Qa37|g`yp | .  d M rY  v  j= t    nj  7 i 3 Xhn3w,H@&0d&-1<O?8*$U#acmC?Q,VEuPTKWO m+_0A GTEJx+r,l "}0$Wk_Ww4r  ?LAgpHN0 6G]~Z  ;  i E^ R 'wj8&=cy&dQV88-4eNC`owe|l/I\bN i  0 @2 "  > h G+    ={Ph(S>U(X6/>_ q#/ ta|}zC'A _Uj]:f\ 1e=^a ,  M T  s g 0 '   4,v {   b  j dl T+rp2gY' Y:PSY__!#&%jf{[rH+r$=}mbz:%Y5h? PlW_ m7Er>6j^Gk@g'  w1 9 {' R %F1wLE ,  =  ! I 1 | N X I   ] (( k  5 NFVNm28=6f}6 +?p< b< ~Jwt 7%L;? m Y5Bl{*mLJbA{l8(!ikxr;m4O[m$.jO'f ^ q&.hhZd+p9|/P& b  / q  ; B 7 ?%p i|#pX?qha}98v(jV K  g  '{ . X t]6p}@ ' *b& :Iz1 ':JB>/~YV`mg2.X2$;l(\  Z1q )  ? Pe  z  gu  KI p q V + @{v'z     G  GKQ;m]@X D7J ;/NjexpHpW~ES E'p-^W$,R . w<9y _-Ac-Rv2B.  n < ^ CE;CMczIu$ :%6NVAy4 } J  A e] !^J  p # t Z >r*%uxQ0 0` $&( m!47G/wKt'vW#2sI 8E Dsg1aNWd+$ TmISWe+ wY + e&8E.ZZf7Q>}v"   .  HM}=:a{(EJ`E}+Tfe@yPWN[B<m j83u|#zv   i  (vx2 Zb]#TT{ff.-_oTNQb?[aJP|#o)q78CZ95hRn5HK,vbFI9`i/]hg82Uh?-+2 < @4; c `W )eevf*k,bT )y3" 2( < ;)Kr(lx  XC c K| @ma}5{]G.gh|nEy8K_**x,`DDV+b}ygupdOTC50:ZZpEkJJ#4@f*1z. Q  ${_}$  )d.Qk^LY?FC%Ww x (  .mQgna?)MVH tpi+|?4^ivO B?_egZB"},Lc[v0i&)`Ps;^Dv+=& 5o4nn8H6g]_ 0cj Q_  v    q 4 4^l-v  U@   t }F E"   . &  >I   # Z )@Uu%zYbE N=:Z J=m 90fI:h4 A/^%3z' .<{^wH#\X88XX5 F  | ]  M  br&h\iBC'1 }  P iDMBo 9 F  5yaA|d,tef6P. lK'f}YzL!9V Vjo`K;0`4/}TotV% [  %H)J<%UOLq!nK2v.+#(l+ 1M3J8|,T wwQqTz IT@ S<5z'$FdW o)Kj-V+#A=]lOPpW-9l`my=F   ^J   %  iu %k@^i9jdd u (; sI KW{   ( \eZcwE_>d $nnf5Ju >q6nU2?p1b\h4/q[]yP)?*xF0`0@kZxn;  Qd     [< t b " 9 (i o   u <    y t ' @ M  A n mM6[2:dqaw8{fi5N%83< Zjnh7t}L\b48FWgQ{ J Sd@5+)?o{&]* F%JIWK   6 U CZ G 5 p ye W 3rh-QP/ p& R O \O  ! (9P_O" _Qd%"h(i"vz J~p4~~&O;[wJ7n]9:k"TU? mA7S$2so+sZ#b]K**g\<Y k h eM B    uCE:ASvt :  N` R7 m # L h| JNtO."0iuv+os:^#i[7'nn5}%*2k(qG}ZU&k7Jc+f +r9@ "'\m)s6n#?:-{5Vr"3m3  !j/'  C  tj  2X L : i   Pw4|GbK,>x v T =k  9 A   zE~Q!?OTS~<5mQI%z[i:!pY {3VdxntH42rOgx F0H`D}g(P$j<4 Qcej]}:ch-[at F  ,   N Yg6a=,-gx^p ]  L@x&T 1x ^ ^@HvU\a 6@@s'eo ,HbQUfqlC7C20o_YKFjzQZ ?akOt5ZTccb*O;<ZqL U)Nhud  7 J X    t =ouv@=(axm C (p Z  &;K : " -f y IC :KecYx=jT6 )OJp? g[I 5OW($zo/p7Lg_su:>T$+5u~F O2-O@fH(9*J9FK;A v&  / b   =e  s  J'F]dZ?G]  0 %  + I  ? - :u]cPf$ 5 W'jmI';QQK|TVd+(:16 {;\S5&!kr ke"gu KE:J\^b1.Qt'QUc/y 'u]09}ct80{-U W x ),!y   s o   "O#B43boYG   hj 7y  xN  ,y F %Zz6A*j5`b|f7N~sFx6^# |(, mQOd=1K-V{{ 9ta~ep b~Y*di\ha yV`M8Hy o  !:u ,;   9 m C  }5b6E P  -  z-  e v q @ gxd]XCr K!bM)2P_3 X ]D)Zvq|l%E| (UV2fX4D&p5c- o{"J**$At"91tNP{yko5n0bGh 1 K xk  i 4 J  /9es@YO+`l+ 8 ~ 1   i  34 g }B#178W'_d*%23Q4WBjka;5O\)N FyjH&EXh 'V g  dC  M  PbPaE  g  >  i  t _OfY~b!r=0q:iKb,@{e8sc;X9X`NGLAh@Hw4O-^d-yh4zm "35 wD_Ze}G:Wv%!a R } f v n@   E  LXV1oW_! s }  =;  uC  < x3 j r- 20G?o G30r0;SSLS9b^K=U\*GaW0N0$eKLw#q}m[~[hK6Mku , O hpwzs_=  2  " J `5 Q !PZDZW=Y  4 n   '4  I N "V  a @u_-gx _]XqX\P^'RHN>''u+~)#Nq6 W4vGXBs-).Vkxrm{/xS.1(BTZ $ A V bd=[DE."   (e      ~7r AI;p: b Q   v . ,  8  C Tgrs!:|"r:xg PGsV m;ULW?`2&s[g2ncp\ OsB#qa$rE|q. 9fEf42X=Rp49K{v   N  2x 6 2 ~    eE J}f `7  q  A =  X  l  s0y_ =+v @yY Q{.*yjg+  [  I P Y  4  #  | .F+MVEk.l ] B  Q   I m I~ / ! 5 2 T[ :CVsAUGH=Wp9#=gXxxTn1x'&w1 _eDG<?i)b?6EhEFu) tLVs(IfY    g7 (  Q D dh e F;   7 !4Y l q g T B ;  H     F  m O 4| m^&VND*G,d`  _g*3?BbS4oeJYbsE> \?V +bE?)t!+p=StmlB   6 @2 lw 1 Y x  ~  @ T  l  "]  Z  } &  k   =  Qq F`.z#sfCn |VU~v: q* VI8.v1 ^f j`X# 8Uv _[{[> e) 4 ;8 ;? 2/m_ f  <  *   P B Z_ n n Ka z F " x /   6 3 Z~   a v _H7;;kSC;943122r0,$8QUZErA'A>-|2p$(~Qy[5vV{PacYdCcYI4K7z|Wi* P d d Q 'U , ! CA I 5 i  a  b   [  T .  O r -   =(  s C 6d _ ^M_" _U~3lV`;{KxVO!tt3Q+{jmg||R^Qx1|kD Fh(]b@(1 # q/!Y"u  ~ f ;  w/6 H" t ! ~ ^ '- h v  w :  d H 3   | (4 h  H V  &M %PRXh-` bh L0U-U_,kld\Q5lZe @__TjN) oWiXi1 `':\r1fo m&1TC+Tzrrh [{ G] ,,   dFS y X  $ ^s !  n & z 3 3 Q )   V q >8   ;r *  q G l^-t?&9d9A4sGr 0o*CA//atlg+A4f0 ;L7uQqiBA-/GzuqyLh/,t,"EooS=%*Nq  d . d 3   e J,   }  i )Q | z  Y { W ! .   N R )   E *Yo&V IQdsR m}H>rcO s^{+h@EiL-Xkeo3u7gWJTK!Cs\3.Qmy`D'e )  |} =   HC  l  ^  g u 7   / / 6 K 5 * M  A  2 ] )*  . ~ HA  y>o q+QOb)a vZ54] ZVoo_!:h[#'}2U.M"< H\ w.cn_j)29As$:mD _`1  g | /n  {/ t     Q ~  E K n W % C m P \.  x   7P  rrm7}G<oD&=B9gxj 6:HTHV6C{CV`&tNt2?4\fYo^9u) -`kO+3Gy4rlgh`0WK:"j;g[X  {[   Og  U  0   ' d b &  B  2  r   Ri B  DNZ%q+~Cc!AWf|.l(Qe}  }zXQ,jEMxGWdNbe(TKY\TJsotR33>w|:V)CjlGD `  U    a   ]    * [ H " ] l t X u q g sX $E .  9Yc9 Bz|F:s].PFUO34\`mzlZy;^8~ Vq:@0Cw|*RdX[mT3 W 4'U/ h])Q9upHw+OO nk6j,2@ >  &   A!    @ l  v D  `#g(hJm,1 z<k>?m2n"n%)p1 z6NDQ]Ee+` Hw'R5m)G5-b%5t=co4C s ,  &7CeJ9L KE=z1H"|HoKj%/pn+:GB>`w  U)6!0<FCs2U:-n5YZP[U~q+ziGelUB:V7. 7U 7mjf@w+34J~I,t0V>[q=|~:pZ_vJ1oI"vyaJJ0|BX)<NK 9z+h$] "p$XD :@w`s}J 5c}E.508yLPl2g#;&] J5[k 7R,6=L|j>P-H6"//x}>'Sx3y%T}!y)b/I1.0.( e<z{BZ5 9HE'BRNly2w^nz`TN X s P*QzG<l86g6XJ@BVV pv K19V4p7<{>a61$7j,8i'p- b-8? C)CEA^<r4+lJ%p[Dl)4 s)n= 1uP 8qRhbe9c\auc p#(cA jz> Mk/6}pT {C^QdQXS_4d]M},dBXxT5 Z/{?2wQk 3Xy *036n4V09+"wE lKE_HK }|//.FoS ^7k[y8#vGv?Xlr+e`etpUB76>;J`~k&@_@j'|Cj{FM|9D6V KHXHp.[,; H)RCZY`ocdb\SH:(m? kR5Z,l7{U:O4BNiKwI<0sJ ZxjW%>.&}&S..?Xx@<ajx4v: Zj6\dn%(5;,>w,EwB*[&W$Da|)Kj,7@FJKJGn?K6")Sl<B@p1&\\"gLVy8Ku8VN Jk]D# g7 "Bh:z JUzK%eR>^){e p^_G>\ MF{4h3Z Gn4J]+nD}[qweN3m8qS3<UVQ_9z0S27*0x Ju"\$u<v>Jp*}D WOFPQWd>|KqZF8-%"#'0.qWo%,044{2_-A&{LgwC=Jh 6S^&g/}E i>m; ekC[#OF@>>BJTbq$E+iGc(Q {1V{$Oy5Y}!Ku$Ee=d1:LZgy*(;<KQXdcvkqttqlcXJ8$ qI {dJ.g5yaO+$Tf 4Zo->n]Q45xbO@2(!$+4(B>QVbov$ F)iFeBg >]zCg %A\u;]~ %<3SMif~ .<JWaktz~|vjnMc.W H6" tJ zWi3:  gU<(f_<<~]>!ug[RKGFFHLS\gt)B2]Jybz )Gf/Ib|=]{ #:Qg}/Lh)>R(e;xL\jv!'~+s.e.U.C-/)"mJ&nQ3h@c~=X3`>sX@*mUA-1-B=VMk_r ";T-mCYn "=Wq%8L_r #;Ri -?O_ o~'-1343/+#uZ?"q[D,b@}\<}^@#~_B& ~l\OB7.u'g"ZOF@;7!6&6,83<879.8%62/)#}kWD0| hUA,|l^QD8p.`#RD7 +    $- 5(=0E9OBYLcVl_whs|,:GUc&p2}=HR]hs~     xiYI9)xiYH7%|qg\SyKmCa=U7L2C.:*3'-%'#"# "##$')- 1#5&9+>0D6J;PAVH]OdVk_sf{nv} "-8 COZ(e1p:{CMV`jr|~reXK>0u#hZL>/!ztng|br]iXaU[QUOPNKLHLEKCLAL@NAOAQCSEWGZK]ObSfXk]paugugzmryLIST`INFOISFT5GoldWave (C) Chris S. Craig, http://www.goldwave.comIENG ICRD 2004-08-19bluewho-0.1/doc/README0000644000175000017500000000222111317712262014337 0ustar muflonemufloneBlueWho - Information and notification of new discovered bluetooth devices. Copyright 2009 Fabio Castelli License: GPL-2+ (please see the copyright file) Description: BlueWho is a GTK+ utility to inform and notify you when a new bluetooth device is discovered. Detection can be requested by the user or automatically continuous until is stopped. A visible and audible notification can be fired whenever a new device is detected. Each device found will be saved on the list as well its name, MAC address, last seen date and time. For each device a list of available Bluetooth services can be requested. Requirements: Python >= 2.4 Python bindings for GTK2 Python bindings for Glade and libglade support Python bindings for bluetooth (python-bluez) rsvg library Personal configuration Program user's configuration and detected devices list will be kept under ~/.config/bluewho/ Please report any bugs in BlueWho to the author: Fabio Castelli Homepage: Official project: http://code.google.com/p/bluewho/ Italian project : http://ubuntrucchi.wordpress.com/progetti-projects/bluewho/ bluewho-0.1/doc/copyright0000644000175000017500000005040111322442416015412 0ustar muflonemufloneCopyright 2009 Fabio Castelli License: GPL-2+ 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. ------------------------------------------------------------------------------- gfx/class1/ files: 1.png, 5.png gfx/class2/ files: 2.png, 4.png gfx/class4/ files: 4.png, 7.png, 12.png, 13.png, 14.png, 15.png, 16.png gfx/class5/ files: 1.png, 2.png, 5.png, 81.png gfx/class6/ files: 1.png, 2.png, 8.png Copyright © 2002-2008: Ulisse Perusin Riccardo Buzzotta Josef Vybíral Hylke Bons Ricardo González Lapo Calamandrei Rodney Dawes Luca Ferretti Tuomas Kuosmanen Andreas Nilsson Jakub Steiner Copyright: These files are part of gnome-icon-theme. gnome-icon-theme is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 dated June, 1991. gnome-icon-theme 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 package; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. On Debian GNU/Linux systems, the complete text of the GNU General Public License can be found in `/usr/share/common-licenses/GPL-2'. ------------------------------------------------------------------------------- gfx/ files: unknown.png gfx/class1/ files: 2.png, 3.png, 4.png gfx/class2/ files: 1.png, 3.png gfx/class4/ files: 1.png, 2.png, 5.png gfx/class5/ files: 82.png gfx/class6/ files: 4.png Copyright © 2008-2009: Valmantas Paliksa Tadas Dailyda Copyright: These files are part of Blueman. Blueman 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 3 of the License, or (at your option) any later version. Blueman 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 Foobar. If not, see . bluewho-0.1/doc/translators0000644000175000017500000000021411317455447015767 0ustar muflonemufloneEnglish: Fabio Castelli Italian: Fabio Castelli French: Emmanuel bluewho-0.1/doc/changelog0000644000175000017500000000020011317712211015316 0ustar muflonemuflonebluewho (0.1) all; urgency=low * Initial release -- Fabio Castelli Fri, 1 Jan 2009 22:20:00 +0100 bluewho-0.1/man/bluewho.10000644000175000017500000000201711317522500015211 0ustar muflonemuflone.\" $Id: bluewho.1 0.1 2010-01-02 02:38 muflone $ .\" .\" Copyright (c) 2009 Fabio Castelli .TH BLUEWHO "1" "January 02, 2010" .SH NAME .B BlueWho \- Information and notification of new discovered bluetooth devices .SH SYNOPSIS bluewho .SH DESCRIPTION .PP .B BlueWho is a GTK utility to inform and notify you when a new bluetooth device is discovered. .PP Detection can be requested by the user or automatically continuous until is stopped. A visible and audible notification can be fired whenever a new device is detected. .PP Each device found will be saved on the list as well its name, MAC address, last seen date and time. For each device a list of available Bluetooth services can be requested. .SH FILES Program user's configuration and detected devices list will be kept under ~/.config/bluewho/ .SH AUTHORS .B BlueWho was written by Fabio Castelli .SH HOMEPAGE International project: http://code.google.com/p/bluewho/ Italian project: http://ubuntrucchi.wordpress.com/progetti-projects/bluewho/ bluewho-0.1/gfx/adapter.png0000644000175000017500000000343511304032635015627 0ustar muflonemuflonePNG  IHDR00WsRGBbKGD pHYsnnyDhtIME IDATh͚KlW{3O8ۼ"A`UB X`*!R!Z!"eB* X4%(B @P(Uڒ$sbg{XD33s{(:<{dNĊ:)yէvNhE}ӓ޻uKǎzؿ&}{\D `bĊ5Y r"W3^ovR:8fo$D۵ zcKL9Po [zd9zbZd|žŎuЬ$7u ,VӞ>)".]LLgj\^zXpY8yKOb߿Ο{ĢnZg1ꓫ\czɹ)ܻ07Cj-a;sWQ`jj eL+ўO=2>@%`j ==7M}=a{1Eu[̙7q`}?_dSis4Fa[D%'ٻkO܉_ΧNpp6R(F(H3KY}?w=J( }/rjj]eO\(K3Xg%+lϽ9K|玱"b RM9q-d6u O dx8uBs,ƒpF%(}s%cbسs/}yfq6@E{б YjC(18.kqVƙ O ,OC5j[a fXbMJ⋏sXlF~x i^Mgmc O)4z -ǎkS)ۘ@EmȌ#cf u5@ Efu.C$X^n!!I$&3η/*J(Nzř23UCeУ Z H ,b=t5Fh2pNB>pp}Vo!8hfJ53ĂޱG+uk!o&& @fhE !]Bq0jiI:HBDǀ+t7 @xz۟/Gns+-~fZ$O4>\}3XxRӯѬx۟V]G a>C)?F,"Iw'ી#?>r[ w瓥-w4mt@ =z7r9:Aa ,8YP գB{J)* RUر};seFGqa% B$ʍ3sA@njm ŋ631͠U,R жV B~\}nܸ>рB5EPJ)ONڵ? o (N bV+==V!".$+O<~-"na~ %IENDB`bluewho-0.1/gfx/unknown.png0000644000175000017500000000567411167137602015724 0ustar muflonemuflonePNG  IHDR00WsBIT|d sIDAThZipTUүA6dSv(8LhcqKDKtFA 32E  b-$hK;~:d&dfjNwss wK Ea4Rf㜜׃T!{W~X<4̥f&rF*#XLzh4<c=6v\n*V'RŠ)U޶^sB`w$Aji?g>';s ]2 e8@' 0DĘ%"ʮ5c'~u9ݞW~@= _!Pa(\~(A/@H] E})yB{CN 75?8XBM3OWn<_bV J}ch% So)V7՘kG!#`Zey : کmKpkC'(xLmq$ȼpVY01'],LOCSJak6KۏOCgCm㛱>^-YI$ 2)pD^(;c .@, DؙuO@W |p [2sWpSod&qC{zH_2}\ gHP>"5MqcM@#KFeN y)_y,l% 05?eSFJJшAniFZ& pAr%9IEBY $tͅĸha #:}f C[^ `b2l}_6y0lzn8J!`a2M4Jh٨CHTJᕽX8y8zl:p=jh!o2|_>qT">x>"Qߌte@Yڠ 0(p{H7UnjN[Nb|K-@> ؼbt_ѺK<ρABQW2A?ƋL«PA #gBg'``,8q*@JfE!P9V~tEHz( c`+C w`+f}/7D=µ<N,ى)Q=?#7 1f--+x/G#}>$z=v;N-NwHlxz‘5MA 4<BK\<{m3Mx#p4OZ]ư{ Wշgà ʃv @#<0Fi1B':W d{k(+kg) f eʺ/))k~Bo?Qcѣ@QT略Aa 1?_?Ca1iQYYkgֆdrjU55x8YބO_B W&߯>_`ŋWLMJ7/)P ߞ8@ +FW<^[wm$-x#(!>Jѭ)æJq|ǩӗ]k#bC펱R5:n>5(armӭ&t%ʜ.{V)FQq:MWU<5;=Yg1v [/iDYP^tt}Ϛwv1&clyI#KXXݪD2Jn$%'Kݎڵ5E~ 5/D"! B}ŧsTU܇ZcUq1qa(Π@y<WQ䡕DtD%"[:rziKZK9CD$9>5eR?Gff8m^(`^NN]ESRn)9%iюxenPLl(vT|p  @>5D jH =[p`Oӈ7X ?5EIENDB`bluewho-0.1/gfx/class2/0000755000175000017500000000000011305542434014667 5ustar muflonemuflonebluewho-0.1/gfx/class5/0000755000175000017500000000000011320176674014700 5ustar muflonemuflonebluewho-0.1/gfx/class6/0000755000175000017500000000000011305543016014670 5ustar muflonemuflonebluewho-0.1/gfx/class3/0000755000175000017500000000000011305542503014665 5ustar muflonemuflonebluewho-0.1/gfx/class4/0000755000175000017500000000000011322442272014667 5ustar muflonemuflonebluewho-0.1/gfx/class1/0000755000175000017500000000000011305542414014664 5ustar muflonemuflonebluewho-0.1/gfx/class2/3.png0000644000175000017500000000316511303556402015542 0ustar muflonemuflonePNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAThYoU3lK mEXMD{EP }2Ab]}ƒ&j4&E & %BBTQ۽3sfwv/sw99C.6J';p޽ u:R'\)BHNٯٳ'U긲 ݫ{l /{H8RB:ׁ.)BᓧN|y_'(t׺u$~㷢@wOWE*"G ڿ}pASWczmL\(\z?Aرy85' l|%#{㥄H;gJbgn[̡%} &4G = ܗ*PNL.VhyP [,PloBJPڲ6I-R ^y?HZ6i0->PuZ ]ɑDʄ͸7Rj.@AwiQ-(-is[R"3?@lKӷY(2,Y, PѦG2 Ke9@PV@.T'wxJ~浐;y7cb>7{Vݟ/T/S`(U.ڧ*Kc@JT*q^As"yǒFՆpC` 4 ( *ĥK8w}EM`GaΏضx"+FܔN[0.m]멊i)/όǟ@SS#On۶H$dIB{lf;8z R bRB8(u0]AQ!pi;5,˂ |}ed !q`4brtwu@UU;ßFss3!Q AY qj4yibp \,D)HUU]AEQyH&VE( 8g4 x܋OY0-ztG١O` T?=QO&t-w{w x2AZ,hTۺ)@JXyJt < ]A5]AUUpam6cmctl333him\0j###&0#F5Ji \<~[gg7&''0L` TP EQA ĭ4 w#LP:K)mFWK!eY!0ZckGN0m~yB0p.9˸ %ǘW1qyg{.;"l,+ݷ8lzvz+$|dz'G> ͽYR* ҩ )eH$HsREQ"E8NI.@MUUs^6*ˆe/~ߌKIENDB`bluewho-0.1/gfx/class2/4.png0000644000175000017500000000745611304032364015547 0ustar muflonemuflonePNG  IHDR00WsRGBbKGD pHYs44\VtIME  ,IDAThݚ{]Uykyn@Dᙈ$P*V(LdZgh2ТmKyZ%jC^p &&W8h2cfs>{}}!o|)xg0.LXJ?Bp3 &6˗Tdnjy[l-H ϲbq罧W2 |c> ZI'Lo(=/T5XȚ뺿U O@|9\,F>?OjE(x1\;̝CGSF!!!;:YZg3uYϾ E|Vb()fP@ Sm5nR )_~.YRwfme!xr>.ꯟBwhR!9lAb*f.;}sh uJ:;M[k(z~D8/<#\Di ގ Ldo=o7e1 D?]²^b*ɼ`.6P%Uڝ{ ]3&bMʹD-K%W!py2)h3z0@ hG)޶䮽Ww0+Hqb6@מֿ80 êTh4QxAtRv<L&:&ħV R ՚M>ePOB@:i`;.~"|+/UrL{};g\ǦeqO]F9h'C9n!ns=wAe;ϗR&PݵlxyaO ))o\uA--ͤ)$}}}zW30>}޹+8\_82&aYIp]() tvvR, U+/MnEaM^$>TضMǤR)l#2yz5 i.\*+ L-v>LsֽwT% \|8z$B<Q0s-Xr/_X%u練wvG,TҘ1հ (mݸw9t׿~[}!8RH9[a1~JXzb:Wx)˶dEb&rVsvg 9KMBـ Ͷ+("r CT=`jD}pxh۟q} Ӵ?x;?L&R$գD8`!a%QR"m+HiMDAÇp]- bƍ GN[ $4)3"# g,Ry.:{26ZJ\MkvE6P N1w/IgPJa(IE)QR&Q5-eTT!a" X9<3n8R׫]V{fL*A;;p^DMvʛH%,Rkx6`^߿H&-d2ETBJIsK3E.%͒L%ijnB)Iks3iQӍ8-qR s=zgq+Cf腿E-܌i g]O>QQRM G)EX4,R*,ˢX("AԄe%ds()R$鞕i$ )-/.Wz/~ǭrhh^(WH!Is3ΖRYBi%JI@`%,r:B>a)Mr9$\4Ɉd P3U#(k@ODmR 3LS+.U€ZJ86Tѱk~4Ѳ&~'6 B鈕!( !0 q!Dl^ gu˯ͥ"#$ɽ] B:yFNZk|?u,cbZ hZhaYKޓL& Jsq|2>y#jy)r@nۺe˗m PfVrtRӜߧ6l@ `9d:~_{ `0 TETIENDB`bluewho-0.1/gfx/class2/2.png0000644000175000017500000000506611304032303015531 0ustar muflonemuflonePNG  IHDR00WsRGBbKGD pHYs((fitIME dn IDAThՙs[?{$ˎ-Yv1YSHL B:偔tҷvJt}6a()tJH6!P-^b[lY+]s %Pf4=G~a=ؑRB\/%aܚ 7uYM]^N g$eYV __x.d9Amt+l3B sezqt7I䱆H'}۬h#m!>1W$Nɷx&(y.̀#sUgש0@.#R*z88w72<ᰃ1c!}yӌ޻FT;:D.PH$BHy,f׮(ؽk7RVց+e3E kO}jc  `L@SSp46Fڠ#j!I,$xزvb--_ɀ8'OࡇƠ}Z#dtdm vnh}y{JbLMMҿa`1Wn%J(|/( eDdU,[chmj\J>RrifH)?#Nrfxx%/)%tEE!5F n[ͪƊrZwoYEsaek͎ 8T77MPr{Tm Bs-?(cLJyD)P:0(W[*yRinCJ939;{QӇWpy;oDV(_ CDL߽h51gU 8bToW1NwwO@MsEh_窋F B=(TP;fmY(PB*@T՚}‘0bʡSHTEY B˲+GH[aYrRö*uh$KmlpA(p$aQ*k+ٜan~u=i^r9`ת΢Wrs3xGXfu'aR 1:2RE T{$EcqiKT(XLފٻ6`¬ksn&~mG9|k~wfom["0&7l k&<>au 8 .spN2L}#]fbjR ʕY,i!%Qp(%l6T)%1aV-h{9p}@#{Çyw˕zw݅ c{:I$)z~9`jr=;w17?G>'rv|"AuI,&bz˶Ysy|!B6% *ק*/ h #c}APډ1(TH@ef1I,,Y^f=,1RP&3L&}vB =kyØ!(m)}$JJ)K!jlKUqPJ1>qg.[6m%mۙghxQb-1\p~Y"h'=ǎK='&4d}DRuV nˣ}&yR+z=S7{J۶߶m.CP-x?)H&tvv&PJhijj؋Gc?2{L𿦐 .裳~::V6-q˚U& m9s:(ǧzzeō N2흭LNN?rSi˶,I>Z[ ~ C$aqq~By*J7zPP7PSݷ6]K^Z444ve*QmɌ!@JE8s룿*~ܹrU2PA -Tg+ڇr ! ?>>vŏ?8 xU)TE€{*oCVUTUDUU)Uy9Sb]Y7)?m?'dRϜbIENDB`bluewho-0.1/gfx/class2/1.png0000644000175000017500000000353111304301121015520 0ustar muflonemuflonePNG  IHDR00WsRGBbKGD pHYs B(xtIME !IDAThՙSGZ! b>l6`6I:io{^& OS4ENvp=6u$P cic0jHHHb3;GstΞy}߳g;~ >yf~.+)lF-0MC݅X %m3>}>i\][ښoii+xR"D)mHo%i^+?xo~ɉM8\{t~haa3_c6X )%mgG wa~}|CsG ^藛 =!x4+:5'Bs:\aYX ˲s^~%9.qΞ߼gwWz'ĥѴ P~TXn @þnq=!'8Nl8SčVJ&X]>׎?Oww7߸`9PAATlH1^%1$2zznres< /3=W_e9/@ ͛;s"qGcC<lX^\)@$X5NE%qBfN|HTrPg yQӲۍLf5}OJÛ$b$46Vc"2:W`JPOnyFfZI+ա2JPk<-ldnyB&ԭF+q:RH܂́6Fh )L70jcނ8y3g/JȑMzjw]Bdc @<56еS{}n㧑8AZko!H`~@<*+s ;S*5\r`vڄ1FFFf+ae]io?oaah>"uǸ}{)KOv* ^l%$1.pwjiٙ)HMu-a~z(bPiTSE,DCj=Ji`0ogizx;}!1pV@kK[r$x<7xy_M#_ϝ0 !D Ș.0~o#Ph~9_>119H8DJ>%h x=^v+=,!m'vwHH*E0$)f aHiKȌEee2B)JVB~|\W2`0H$Fd)!\hn\s 544xH=\% `phH$L" 308Dg燔m˴NuB1 y<^\.;w!CԊbY_h" 0 .W^Ʀ 2u]9 (z<;wa/vw%EŸ i[i)eb(KN'PhSPJ- ݽP0͟Hio,}z' J<[ luBJ !4MD.bJ)s8󏆇9å뺰m[ө畔0דkDΌޜs͢l'IENDB`bluewho-0.1/gfx/class5/81.png0000644000175000017500000000324011304267465015636 0ustar muflonemuflonePNG  IHDR00WsRGBbKGD pHYs B(xtIME +/ IDATh[l\Wxnόxlq"PDTAHR[ (dj%A*< *K ޒE$}*rT5INk؞9w3?.pW :7pd|䞣9iGw5Rtj@Vz' LH-{W}?}/xE9 zeoBxE.3?Wt m@>K5"H)5)]M:溶ڶXfYnnj%]⬱0uA?}ʨȦm}DO?(&{/t7{+5 ~Ͼ`W@^ͣJ4=Ze\^ o:vV0t/5=-+ hb@ЛkQ)v?T;C@ڶ#}lzV/FTvluv,Ӷ-õM1΋.z_/T ٗ޿i\Ku$8Ql{{Rn󞉮B}P1VkԴsƑ$]G"E<7 =꯻f7GQR.I!Ppz4[dSU4$J.%8dgó|Ww56?Կ/Y(H$w:qK uc mp8eYD Xy #9\rD4t;;d63K!zycB`;_zoު\u#|?ܿ?y`H$JkL`Yx4I6`Vt]9k4liN:( &iKѳk-`BEQ۫CÃuoܔ@Q( 440th R!KP.hJ$) 4'[sZ岤Sdt;flb1@G6EҩTRԧ/_@Q% a&PǶ " :;:U!K)t}{?xw'/PGS"a脂!JU,D0P5T!д TqrɓEIgIěXXȐgFchZRĶ; ]/// e]N[_$*4Tmc~g3ӸBwlfn~ٹkK[L\x]}WFRvKe|=}eڜ%ٺ{@:N:~C}<'ߠ "kԻ'(`NOOqDQ )]4M'\ƴ́c' \ K)z@Qg2ӡWLw-:`*OkF-wIENDB`bluewho-0.1/gfx/class5/82.png0000644000175000017500000000517111303556373015642 0ustar muflonemuflonePNG  IHDR00WbKGDtIME IDAThZ]L[s}k*^b(°ZQ2ѭI?mT>L^:iLU'M4MZ^Uf %ePV 0ФIIuz`Lڑls99ʩSslPJNz<_S^xqi} c,N#Gmv.ǣ-wsQ˗d2/!vB0B,EB龾b|ߒ$j<}G4iZ!a$Qn۶8ߟú'O$)Dv!$H$fooR㖖$rrwc\|Y*4z{{9sf F(;Bȑ#1BȄiD޻qF;39w\sΰ !kE!y?8Ō_?;w,!7 BJ8}n[P$^Ӓ$sc*I"clrOq˲F)Ã3<}0l뻵Hww,;pA I  ߿rLLL`vv7oL J)e4߽wb+uww7H^CCCp8L8Μ9NR)|hmmE8(BEb1|G x:~+ϟ76E kzѣG>Ɩø pm`qqA4TTT4M$ (B%;wx&'',B/RmEEEO(PYY IZ9d84 O=r}gG ض|MMMF x,ˈFF0 eylnJHz{{ûvAeY1ض ۶A,耪/PVV@ IV&JPYY Avm߿URwm`󡭭 mmm±crpH0ƐJn2ƞ/ӦR q&c,yLӄ(P(8qLӄ˵Xfggq=Ȳ YMO~w n;BEL, , w^iPQQYǡ( 4MΘV"@]]!.P& %QaYb Q__JT*X,&\qض Y PRR4aRdY/VGUUE2DUU @2eYme0 DL&1??j0@)c mX Mt655y ÀF:8촖eAӴdWrDMMMnW` BH&k.TmJ>F3UU {ɓ+J/WEA`fFNg=w+$}i  ?nEQ?*8'퍴 4!/M)F؊"v_lhhr'{B$r~xuuu.˵#m`09d=&ΝeeW6 UUQSSm! DQ l9?.r#lP$\.X.J?WÇ+܍DQW}}8Bg!q#@)_}CP($8d`R J*rH9|Z IG"2Q4J˲Vٿ i`YȌVR vU p EƑz6xJi^PuB*CKQ˗u `&NWB2 ae~g R)S}zIENDB`bluewho-0.1/gfx/class5/2.png0000644000175000017500000000560011304032457015540 0ustar muflonemuflonePNG  IHDR00WsRGBbKGD pHYs  YtIME  SPz IDATh}py?rw'N^0/z$b^35[Bi1N=u3Inx׵;8imnݠဍ:{07 l$" 7ImT^ŤSgvv>gkt5\TzVz8JRU (ƫ@&+t%zQ>jk8|pI-BXPpʁ8ÇGVUS'e47KC`C}cj w@@ x}uW <9n#:n4N K|g0@ 47vAR9A`:0X\[h%\5Ъ戢mk7jO('>>,ɲ[IUB"ƛnsR$ٱh,䏟:y倰?1 /ی`^UU?+bm>A2mIsfKi7gg67~3p^V7m޸Ο<ǟ+egeA<}ՑH!CɔrŢVN9ē?2wޜUUk+z;  VaaZ<ޑm$\I~BO&[g@Fp,l۾ͼܼJJeQKCD؎u }I*>Q.cw3T6NRV\ mO''CO#L{Yq,KEלo=ɱ8]Q]1R,|A9\.E,QU?Yfs4׍(B[g)]Gq]h]0PXEAA>.G.kװq}~|vmt/ qˬ{.z^i DA&mx=^EQ-+nz=j&3|@ymضM? Mo*˗,f׾:hWWCy#ǎ.ny!FK+!b2N?4R$†r=m2kZ.MoRa>Sq (a$A* >ϭ e; mdh|e+}L/*nՅ*mC2iD"o`[)-.ɂHoo},_ 4 "Ѽ^|N  |τ;-V.T޾_SXGz.5UUTl;eYiȲi$ ۶#L:c:OS4u  16}c6%X/|>~IH(=H#cPsl}.ZvmFi֬!qn\.HN2 딗fU#L{ ť`Ye)`MMv*+ Ptd<Xn-isrPmzg'0Eس6-A"+^O/5y]DAtZ1$a&eŅ7nYUQ ?DޠaFGz̭*CuR:op(?;-[̍  "n:멉w%*U/FFtm./`phrd`i80äRIR$arP\~?h7nyu3OopA"d?w,_,=##bQ C4M\.ni04== 28պ:y# JntVVU,ӆdQun7YY s4scG8 Q8:S]?`ىX fee$  Lh4J?L|,͏cn *9́rthϞ߾_QY>SŐ $I8###DQ"ttC7u 'q0쌝~}(+XSN2::Xo_߶}3H g~Xt9S%It hڶ-r:N{ ?ണ|wM%Pz/Wf;Q@$JMCD"9=[xɗ.G1MSp,~~IMmX,6|?tA`ęʙPl.WίUZR\<Ǐxw{-##ш38J9]5FaIENDB`bluewho-0.1/gfx/class5/1.png0000777000175000017500000000000011320176674016412 22.pngustar muflonemuflonebluewho-0.1/gfx/class5/5.png0000644000175000017500000000674311304267321015554 0ustar muflonemuflonePNG  IHDR0.nޚlsBIT|d pHYsE]tEXtSoftwarewww.inkscape.org< `IDAThXyxս~'2I@$$ P!=xȦXE^x[!^b[@-WSZ7@ƭlc [A2[#3a&{9w};O.La[Ӡ.׊\RjM49 v9VVUdnN6mo=3n32n$W{M*-9f[W~ǹ\ ~4>3ֶKWKƚƵkV7qnKu' Ͽ%`\`6< Z lO$`\'Z,[_xmL(~~v{_KI:^6Ʀ^uZ[GԢ[oA{zzּyw .6%^{MĽK~(9u>>$''cΏ]^h+B>lӰkHTd~{-Zg'Tl\˼@UUhtFyFw <Zcc`UBKJPnU%zyϋk7zmoo/<}#,@ Pl/9iz&RG)P @']1'aŋyy/V8녽x^k;Zxkh$0NXdQpT׮.S˵'N|IW%9zhnȞ'No-r(UQkҪ_ RdthGAE:%1D8bH$1¬` c`8# ]K~tG*e r"7qDV )$Z{{@ 7://I (#`*-e+Pu@`p3&*qŽ+ *'ȘzalIH[s:$+WTr`K@ی)?e˖3Pf\g0^XD~Æw`pB85IuN~}sI#`d*aJo0yAӧr. B8 @UUׇzM8J@H'6wR)|z3[+w-[G *YecDAmKMtֶ:߾y/FWi.#tc e=X.2lAF5=}-[t`PPN}I4թK ̹cP bM$Xnyrp}^'Px  `/.b_u;v9e,8*`>o^4㨣AĸqߋWmߝ]'nDտvhulkEcs8{,Sy%`%w~18V5X,X:y2O.Gc*{z6mjj*RҰis ֽ*RSS-[7כmVN`"2 !fnX,`E LJl߹ ;;QlȦ d0 7?o.V=sX$q0$2<-7NY 0pLl{}(? ߚT>3)OW^}ux3LCYPS]K6l|QkHdB{b"h&L$& 1l.S+5lhNCl޼Q?Klu?m-p{LH*޼nTG鸝wP `lYe >Y#81u<ÉS]y0 6rwTV)99.W/TUbAQY h ]o6";TcbF\qoGUE\n7;ך1{曢 (,,, yF:x/ OMI}/qy?o(Ûooă=J`{VVEU5PCϙzX K] Ջ< kk_d2"NA1rH< 5*+*ifF X/)f[P06 LU~!ђG/1{4ZM?ؘTu1" c$YDMMDI. /fb=@Mfh4.#*S<1Pmro zP2 R$'CѠ,aXVFFg! %SJTN@Jr2 zC ШisB8,xDƜ` Ǎǁښ: FP x-j4MrJjjj*``&'4zhx Qܸp_YF2B R ϋt1qc!ɚDEn2*'8 @Vdh5Z̛7. "ǣcC`I Y˸|JV(rn,#a0H0!J"N@UU5y 4iiN(W_o'_l#O'B(+ 5 PBxb_֏i|^"f3k45$ @ 2_H 8" E'FAA~ w}@M0 (F\! #[ ! ߗ J3%M)ˢl+yFXvDSBff&0*=Cg y_4MSEL`b0a(#f0RعkS}xnO2N"@eatI[Z聞~e=ͧ3~fQ3Rط/W_vmOYz^w^f'":uʯW?Xv秷{n?\ؒ8W]h ۃϝ'wܩY(RnVGڞ︕J3T'"Tƫ8vPG[y3g%<@?[+5s<ۊG96[A]mOփ]?; F=8x򵃽߮})X3cWΈdjs|+C@bBL03ۃ'‰'0^ZuAj5H$:+H=T߹}^ !Bc$h*^L:-+ ꩱ1uV y_TJ]bF4,]zKTA 毤bB d2HV6aoR.o߾asMQ}!k@hbcXlAb IA  040V8H),s]B }Ϟ=K`'on۶m Fq ho9V=֑|.R,*H@8\x ŪdZ) L"|Aގ: Goڵk࿲:Mzjw0C|SR+[ADJ1QA*jM֑'1fm,.eFi&cǎgh t޼yv ixWg!F1 { qs@Mƞ&D8~5;@F2 (:3oq !LD͛ߞ٭@RgQs.JfB {g1 ])L8$[ J&`YI{pqزeE?l֭˦WsY "]a$|P4=(4y.|<Řx5Q  @u4]QWち-EOJi:[RX%!A D*"9d E* 4ƂNs&/_]3/*mǁnhXes+(&vUg.4k=]o^ƙ4 . ^ӓΛżjh+k*Gqra\PK2)Q*ܑWi^zzzrs9/a/S_΀)""?Fj@*Vp} <pyBa%`.uVƟ7[a]Wo|H$@Ju|^}I)'v& Ԩ)FW$ٍW; <ԙqp5h:EbY0q'5T=HՅГiTeL$MӼ{E@7$LgCSh I8VǙ F*}HPN.CUXvms,A dS&E%142.ipUtwĦ& YX,P \ߙ?PpƱQ P7$ &CXȁEN۽6bql,td3`bk>FlV]|ٺFMf HY{GF6Ü4΢^O@4dO\uQw-.HBqt/2Z~F&[p}4+,ϡ^@&A!P@A6iu/E֝9 $u/?[ @!IPvda&д&5}{ߖg57qS}d:2,\r=Lb d2fG8ty֥=w] KxU'3!j-4A6hvWTr}Tt f2i>`]1C7V$MSx uz`|t>L8|l|OeYX^q94 X TkYL= iF1#a6@$dD:4g~6 i QLR839C5*Ls|,7 /q^U~6uTCE,ەjaUݾdGFFo>ˣ\.Ch8Zjܚ 흡។ycs3}|Q 3,+5~i33ofhڔ"Z :Foigu;t` O IJg&!=ITRJ$)eQDd2@gf:Ρ8c O @AJM 8u_u0 /aiYo-ƒ$BCbH4~;y@Fq(x<"0<b4h& t67N<[&ΧIENDB`bluewho-0.1/gfx/class6/2.png0000644000175000017500000000556111304267101015543 0ustar muflonemuflonePNG  IHDR00WsRGBbKGD pHYsllytIME &9BC IDAThIyZz_gș".Ý")ҢPB"]I+AXrA0 1rŁ%@9D0r$t`%EnҐ"#r6LU]ˡzÙMb? Uj'ܓKk7/|{Rr4k8nM_qtYZZʕ+ .r<RoCPJQVW:vozf](Rʻ`qq۷S(qAP*(uƈRD`lllYc J/|{}[ߙXπWX,5ct:9ӧ9qTsIRLf0q1bh6loًJ%8~!R*v'\ѣ\~ uo@9?`aa'xE6Γ_I|>{E9/?F@Hz墔dΝ o7CCC>pcb>)" :L0>>Jp1k-CChT} e=]H6ƘފB8R,ja2==MT[sg($BHJ2BHRwXC6R t"Jz߷Z}T:c=vlImnwL1@eׯBGѤ$seffF}! Iٺe\J%)vy>ˀ(%Z'UYȤrteYZj(h68_-MV#$|Vm6_ d&#MZ[(B9Xql@(L x_wVʴrcb1SUY861gRkZӹY|~ࣿǹv33Y.{0֮Ca:| c06FkǥI\!0?zulPH-lCJ5 LNcQ!X BAnFX:M86[Iu_耡-mY|c,ZJ.a7J:qu 1B`E$WGT(R >0MF&`;]T|>8!^*Bjoh%2 ~I c:Fb ֚\.0w~f?!wypDLZ >T sI?5`lrv +I35zC%1ݜFNq_!ϓPJl AOO6[$ 0;;)Y#b7tkCcQGhjqi[|wjw:ܿm?lJR&>)?E`I11>QN@ (FQ[+0E !B~'~F5Bl*nu])$BL\;(h{c@6MWK4dqD&!I C*L8ָ)LlVj˜6ql64܉8"I' Z'Ue-R)RH.)<ϣP(yJ4 b#@NA,5x׻9س{0&ڇ뺫- G$KLdoRH(gLr?l]Rdt$1?7 X0L}Lݲ{&\Zj\B! a !~[uk[Wy!zJo7;pp7ǼrBբ%Xkv{…=3?{RqWoL>uhmé,P*x_ۻoϟop`rdh_}?{o_:=5/k0k$֐LH>ϕ>UK5'sgΟ0ٳ@gz w]`Ok}l[?27Pp\wqemj=Yrmh0mZrxj)\$")BdjYTk5D @\l7c%c?k" [="դMc_% "#~+2(lǸܐHHqT?h5"Ѳ8$I48qRG(JZE*4]j R)K?zBW+:F@Ҳ ƀDB:ҲN5737Xze^Fa9=7ڲU[gNW7pرlgݜ4 KP23b#|K9GGG(hO) oO=m oG~桭+YMZhY+24R9y|aO:s*}c||0-TqlӴ`YV/Ӵ,:T6~L6{BD2η|i؎~Պ3Ʃ4^(ADyۋػ?s~v~,8Nx "+!C됲cc e~gU0umr(_@OO?nwzbY:6tajf "(P; ꗰ._~Ca@2qy &73w2u]pPZ{ؼi3&#֢[{z{{.޻1 ba\mrg#`¶Ύ-.26Jw%E`~Y{BRMC]1):>,1 2l4\;;"lF u`e#/K,_2#FT?͙i:q!"bVJի4(Fʌց<󬈐L"8bFdmYH[B>x$b i@)D$RDD$J)˯TS@~5ۜX/]񶊁W TK}<$^uY5pمIENDB`bluewho-0.1/gfx/class6/1.png0000644000175000017500000000402511304032220015524 0ustar muflonemuflonePNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAThY]]WM'3uvt&ifJՂ7QQ<` }EQbėF@_UH QCiAiL'3ܟasw$=}oo;6nׂą5о Xc3 TBnϴm[Ƌr:v{XDϞ9W:?w>~ao~5ܼ3L[{,.Te&h>OD8<;#o @=zTU6kvEJNDuf"V5.pMLN؟~,D{.+Y(~)eY*&iT~Ny*|qb([*j$X>@XQgAFU<ac@'0`uuYj Ճ;iPE4ɫ N &e@ 2#nWAc7zՋDݨ_!F%L1 L MW5@ؽ9N.} 6I@II22 yOC+[x}&a Qͪn u@2W@,9?PP@[tntq}:&0`UBDPř" 1HYA`8DIiydlE@/Lǭ^/!(e+Dld+!J`#V{3+@=rRDzh>$CJ 2c+ FFR/1Š;H*B+\ЦYGΙ"bL4g~`t-(q"0 a}eG !B"")jz] z'dl_(Z:9v:e( NYfH #CH@R V_WP@yQ%ܩP4p#AtOU`-i.2NDY(JX6#Ƹ0H8 N+2eߟSRe)&%a8G^/'ޥ|9 Sfb^Ac(!AU:g8u8i@o*+47f/+?kX 5k17%ԗu nYm&u(mXX"[WUHh׮nָN~bja ( ~YCSrͨ^G7w~t;-& "1@z`mXqa^ھ_Nvg(zşxE/V; v/eټw_ě]zros2}M \ߒh p5+^=r3mtl&VW]]y^ԉ[ %HR!@D)V=<{ĉ#>8@IB/$=VWӜEPbȢ(@?G|t21[s"MaEi὏ $"؟" hP 劔nyA9:syD!K3j E Bu흝k;{x97J iBin/jL&vf +iGtz5X/4jBS]&vACđ"ugf"㪔9[y@^GUwnC6W*ʨ3Ŧn!n.XP|ںCFMg AQq@Z-|ҿsw!ɼ'KSJ˘NNKyyvj*CC+.W)z5(M?^`Hm2J>&[.(jLCIc-^qXhkT4!ziF gmWmR`6^y{k[C^א2m`Uw΀-v\4<]0VYzzSo3 A ƛIENDB`bluewho-0.1/gfx/class3/3.png0000644000175000017500000000156411304271733015546 0ustar muflonemuflonePNG  IHDR)8sy9sRGBbKGD pHYs  tIME 3| IDATH͖kA?oos$'*"66 b#X'h#HNVhoc#Aы%{3,vvo~x&ineg|!$p@Cp8riEЂ/8+ϟ=^\$G_6672vֲ"Ј"Q(jrE{FpJmēEKӹe=@KXCM5 3VP M I"BAK :%v=^@@.ީZ|  Tj-9Tݹ{wϙ=\___->䪐saNPvZ=`3Y ptPY$h4"F5,^9 $*.SqOVjf|P%~>ZLhSŪk;;Zj-4\: ]{P?¹F8f!7k71Wonsa$C!AUl`46#Mw eb`v?bp=0*noVE/5+b~tB׶ppfgŕXzD81_/Ru6 +c""UcdH(ȡp`.槐n^Ѡt3SFE 3_o,CQ)ApAUjsL^n  p1 |sR>NTk1!+S?J}dō 8:PQDt<`Tf_!ةy^EAǝWg.5e 27|Y n9U}`x|2P u(~?|jRUkI$;IENDB`bluewho-0.1/gfx/class3/2.png0000644000175000017500000000146611171100770015540 0ustar muflonemuflonePNG  IHDR)8sy9bKGD pHYs  tIME,,IDATH͖=oA9$BB44(P$J~B*$ ҧE (1qlvw(wCʧ=n}wfngo7/mlZJ;-,.>k @Y[{ze[;&ыI=HGD`U|LyTQD@3h! Y4yI`*uE@KXC5LB+(J D^fK :%l|>w`pzSS'ж [MUki8H85Bp tEa EiѝԢbh9@ş Σ iQrF OhGJ2NLe_N$$Krζ8 x" 3۪ ?bps0*|7ryA#|'佧 Ԡ74Yf4^=8!qh o}XŧTȕENeMlɐZ""Ec醤O 5_CE\1,wmHn \C:` <޿{w]Ќ/0 7o^X\| DGBϟ'f {N;kB&zP'9szxS<`:(dN@; Y4yI`: E>@{!dz=ShH/x#nmp2Ŝde}34jQXutm Ma9 1ht(o@/$K,Zf>SEx9Yb>fS98x]"CkUkk4H85B6p t BE؝ !'#x4KA[ Ђ1\#:/7W8vuP,! u 9HcyU=![` h0JPl9wdt&ٞNIENDB`bluewho-0.1/gfx/class3/0.png0000644000175000017500000000137111171100770015531 0ustar muflonemuflonePNG  IHDR)8sy9bKGD pHYs  tIME+nIDATH͖kQ?Ĵ6TV{ tZeѶM[Ϥ+K@-%&O mwF6WMJ\ũA[m$SPT OIENDB`bluewho-0.1/gfx/class3/5.png0000644000175000017500000000150111171100770015531 0ustar muflonemuflonePNG  IHDR)8sy9bKGD pHYs  tIME,(?IDATHǵoAvsAB)(5@ NEKA% i !((Nbnw(v39۷o޼ftIa9:'zX~~voy1h/@b-~/`2v><䤝CQD+jE-nY)EKT@-؄`2oMT%|k H"BY ͎up0 _</aa xFDz N, 2K;{xqxx&!' ιZ`+`ի9v ,ǨSp5Q3bJkF)0h]Sq"Hٙy;sUrLXI@GUԆ8z2PF6L\Bw%"3>[jeFgc^fN]QW#Z Ǵ^cH}kI\FA٤0>4SP򦡅j󤿔Rƪ~GR m%m¨VNIȋ0RY Ζpt(T){iF &jX2V^y{aC^>-&7 ņ#&H/ c kT,xp)`ɩOΣ] zH;kDqL?}VWoゑ˃BIJ'H@ ,RVIJo-%|Ȳk H"Bi -C :%M*:AH=("*yTkl("z^ )W,q54vt:$I0s6 @ YP>aDQL,^OH}P< u,kp{ߐʐ=}MEt}` )aNeYl?"psGUj | p ~9BOx:/ 'IENDB`bluewho-0.1/gfx/class4/12.png0000644000175000017500000000634411304032112015612 0ustar muflonemuflonePNG  IHDR00WsRGBbKGD pHYsѹTCtIME 9 dIDAThYl\yBH.cjX6Kʶ +㢆Sk6pCP(VQA[M_bn(@HVTH2Ym g8{0#r$QxɃ{ν~o|5!>:6y :=`3 ^Cv[u]J'n$G(=8@<&t.'1]~<ϽpЁ^]_پ}e+L43]d;(Rv_M=:R.099͞0s(I)_CPӴ_ ƍuqy&kngϟbucj. BIERC74ZZ&"y>mba(zj822R:4ʞ=ߌ-t[[\iKc˓_8_ڍI%+"aj~4BQ.ZF2 ikK!DF۶QQR sBq鶇iڎDQjKLiphQaժ/twuis6o}㸼N/aneYTU0$ %7o ۙ%aOwwB([G<`ff\4B04k׬&L;T&_k[ii,JX <Mj繜:y͛d5X\ёx8;ށBi?x 丷mv]>8Q$I$,Yjo4cs5>{f'Bf%RFmK%RQWX?>٥{tvf1-_[? i`hhLN?rKں]B. !2,۷na KԼYƍ2ӧN3<2D<ъ!RJZZ )%J)Z1PwB,IJL یS'O#?_"Yb9:>j0H5 #x~ ۶~&d|!@45Er }\|[\Ok!+z=mDQD*ӥ)  E&'&AV\88|ǴUJ}>'ܿ[h:Zb;6QVVj.RXEwO'c\rs.ՑеϜyP,S,o>pl=+3N9AZiHW 41W|kM:[ϸ2"$ar:ea։1 ř[ud*0 APV) gg k)X̔m 9()%h~k3_E54JJ$ FGzPJIZ0pk YleĜ/L& +_gӦ'x;s}<ò,޽{[ٝO3p{r _ŷ_zFJI{H)in;? (8|˗H8y?QGBFR|wSpoo/==\t5W3<2 @{{ryӴ~ڧ AXTݑT ?9P044?y ==9|ٺel'Nd˓[o\T@)ZZt]cvHyC?|%46l豣R0tZ[[#$!Q$0`YBФܰ˗T* >bHNoHJ׭QO[CJkM3˒%Lq~ ,͔\% 4E0 фhx"aOOWyn1tE-! r |?h~D)t2 g膎ihh봶xnV "Jfu4!P=GҸ:N 偡?}N?u!B*uX*n  RailG`.4]0tt@44޶)5z#$e3Dwg?n&?ѭ0՞2\`( ) Ө}*4 0"{!{OѬEۺ?hd||Iv68դ1|n Gku3#Lh$v/Sw*XZ;BvMɀc*ʾ4"VFk'P1u:[rsq!C IR@bFY(j1,2Jp ` ALpwq?%Ouxe"? VHc\1);+3kr9~Z81+ j'8sĞxWAh hl#x~΄+G}uAÅ8 9lY"?=Ύ' BGa싃d J@=~C,<~lxV' br"vw/$˾I=pzj<$w& <=H{!7`k{Y-S<*3,-R{ mw*QU |$q{FIls.MI _V'j?vV"\{/eUdI! øgD"!QXp9;UA6[q[ʬ (Bww_VdYH&SsD1.mPkWrsGa6&f,>ُc] Vaq~n/٠+Jn͂D?#q*'XT Z[`(lPl\M>V<]IENDB`bluewho-0.1/gfx/class4/13.png0000644000175000017500000000556111304267101015623 0ustar muflonemuflonePNG  IHDR00WsRGBbKGD pHYsllytIME &9BC IDAThIyZz_gș".Ý")ҢPB"]I+AXrA0 1rŁ%@9D0r$t`%EnҐ"#r6LU]ˡzÙMb? Uj'ܓKk7/|{Rr4k8nM_qtYZZʕ+ .r<RoCPJQVW:vozf](Rʻ`qq۷S(qAP*(uƈRD`lllYc J/|{}[ߙXπWX,5ct:9ӧ9qTsIRLf0q1bh6loًJ%8~!R*v'\ѣ\~ uo@9?`aa'xE6Γ_I|>{E9/?F@Hz墔dΝ o7CCC>pcb>)" :L0>>Jp1k-CChT} e=]H6ƘފB8R,ja2==MT[sg($BHJ2BHRwXC6R t"Jz߷Z}T:c=vlImnwL1@eׯBGѤ$seffF}! Iٺe\J%)vy>ˀ(%Z'UYȤrteYZj(h68_-MV#$|Vm6_ d&#MZ[(B9Xql@(L x_wVʴrcb1SUY861gRkZӹY|~ࣿǹv33Y.{0֮Ca:| c06FkǥI\!0?zulPH-lCJ5 LNcQ!X BAnFX:M86[Iu_耡-mY|c,ZJ.a7J:qu 1B`E$WGT(R >0MF&`;]T|>8!^*Bjoh%2 ~I c:Fb ֚\.0w~f?!wypDLZ >T sI?5`lrv +I35zC%1ݜFNq_!ϓPJl AOO6[$ 0;;)Y#b7tkCcQGhjqi[|wjw:ܿm?lJR&>)?E`I11>QN@ (FQ[+0E !B~'~F5Bl*nu])$BL\;(h{c@6MWK4dqD&!I C*L8ָ)LlVj˜6ql64܉8"I' Z'Ue-R)RH.)<ϣP(yJ4 b#@NA,5x׻9س{0&ڇ뺫- G$KLdoRH(gLr?l]Rdt$1?7 X0L}Lݲ{&\Zj\B! a !~[uk[Wy!zJo7;pp7ǼrBբ%Xkv{…=3?{RqWoL>uhmé,P*x_ۻoϟop`rdh_}?{o_:=5/k0k$֐LH>ϕ>UK5'sgΟ0ٳ@gz w]`Onh @E8F0D{\*=֧ @["?i\ւ  #"Ncpp/cUCc$lw <с{dJ("!ZC)9 '@A"@{4tM;g-++AB`m>Sb8ȤZ(R 破B*R (|³r\!H= !D>8ǁsy3BΝ˨1 7~^B`c RIқel6;_*y{@Z J_+v=ko١]=q^Tx%pM) b u݂W}!PV^o;1gϞ#S@VhOJxmXyS?mhk?-P:!V5Ljcsfhfָ۞K=`3K1:6hL6P8\)x^>Vu]L6TVTʗoV70bm}׆ɤpGǓ8 `tyIC,C__?ƒ\02:SN]\ WxŗAx[}=We_7849!B0RIx҃B8f\^`jS❗^|yMiz[#$İH$jKvlDrJoD"BO!@EQp.J7=??teM` ' Wzȵ{"k q<ǻHT淒JrUj$FiYΜ9VVU,|ۖmhk?l6/惯1f{jbtǩ3s*|v2}^}:/u$8;Vp"VZZF q;KJJ/^m(N|zX穃}\sm31> "aooKJJ۶lGEEed9r5ғs~{B:emQԦd`㆒oP %%hWc_2_NJ[/_no`oQU?ʿ BZ[&'@~[׭{G~W>h'Ĭufex| sfB*]xehFR$ѐ_ @i࿈DRjCDm]}4^qmkmd&O ¹\?Q8)\xe+#<2SD8D(e\Lg:x:-("Ddڵ1J-,L8V}vMғC`ڵߴ$?+Fo,s#^$~gc0FkחH(b`YŒ%A)Ǒq0FsBxMdE:m\ȹч˯w4_^w'/B8-\n]Q\p!.gEOOe8rc46sSJ)crΜ@ޭ߲ڸq* .Z7F5d30ƀR0Z+===0ҋEA(sD0D]]]s0>LG*3J񥊊O6@>1Œ%K"ssdnii)~RP$| @ BVAh4ZQ⋾V[XB/uEEE @%8S1zeJyWe'S! `tJAZ邕ְ KF讙 髃|"RN9y3σ@ `0{wB #{)kO}ɔ3===u]81H$ԴbƘ|8|wc-5&ZaTVTbtl~'r"zf`/\x6:<)uC 泊J0@ PJC0ss(..AŜ =yr9|=MNt VWW7iu㫡pUKiii)nLI OyC}&&&q:SoOzg```[ }ꊝHh1$x,nqA:=)Sd2u `9]}ĉ'KƗίM=D5H:V;AP!5p:^:222w8/`b?g|jŚj`xx; WIENDB`bluewho-0.1/gfx/class4/15.png0000777000175000017500000000000011322442272020066 2../class1/1.pngustar muflonemuflonebluewho-0.1/gfx/class4/2.png0000777000175000017500000000000011322442152016376 21.pngustar muflonemuflonebluewho-0.1/gfx/class4/16.png0000644000175000017500000001004211304032172015612 0ustar muflonemuflonePNG  IHDR00WsRGBbKGD pHYs#ftIME  y3/IDATh͚yTՙޫ@Ŗ0*$2 LbbIb͓&LfOLbFK|H_#1a݄*XTq29}}ήM] oaB-x􍳦טcKq @ 0t 5JJ)oN&5 (RBpXף gY֡6SӶmӷk_֔i_4\8a$Nc9>Mwcp4I&(OFș*ر%xrU[alX20 Bi!} ,g<}O*_uK/_7},(B)i'5itvv_d2{Z':qg/D`L2Uʫv!R%̞=G۷}JsϞik>PJ7ޤWWVใHя&$(DbAygݭϜ3wo:go<ԣ^u>z(=?eOǃD4Dt )CH)G/j-uh)+]׷GHq4a[ChỼvxI&"dyhF} /3kYo{.{ xcYY٘ٳl6K!JKK ה `6K_*RǍJG|/R~w+Lu}!$RK tt;*& غu+]~9UF1u4>U?>mh`ڵ#fr<˲hh8GFdƧ?ꊓ'Ɠf?CY7vXj)5cVuzj.mGS:U'R+H&Kio7ﺋ.7z.l2SWb5̋ضMyH'?ƨ*DdrQ>r|{(/@2B- I聅"mk.Z0/Hm&c;On\sߍr\gVmme ! d9V_{)*2.<,\sgg~?lʕvuymNRQq]d2uu%&e&L"m1(Fh<_0ei|c^Ɯ3'+0qo՟g],}t%s7{Xs"_uB>a獤_tF [KgdAlL0Y4J؄ƍ9Oa*~0|@J1T{jH)R>mg&O9!$\s_)}LC=ԐRfzK$)Jغu+uLx>A'dRpBc (Р,f5ksd 477+)x1H> W}㩇7 ATꘫ^8 !hٱD"氂G{ 3Kgg'h)S.1J%477|BA|?hE1Qi,ˢR Ҡ<!ytvu‹:-ojj:ki8sXv,>1?k0tn\9T1)z;yXl_[L&eYGD"x衇a㣛OxZwvN2yj&2yZ.Y},iӦqUcr¥4wvrP= +>}~l1J)ikkc7ݭIU_zhw}fE"E#INJI:NvK/LMM w8I&f9pH߶_zI\~R4M#HPVV;V[7=_R_hV^^}&@ooQ20k&Txo;;0dh4Jee%=lyn.۶'Snl]zƏ;NӶm:x̪#j>/J)6hE̜qiRYYcon|qYO>T׊@۸~CxR.^L|~oˆ pq½L%D48dg{6/r]wS|+͍78‹XYY`׿a100pXt:Rcw䊕O&(x?pl8eO?+/.~Ҹ~_>Pot rkn6U8d2 ܁X,F,w7{3Om^rDB MZ{ ]~UYYUqndzt|qIz`ib][?'? A-<X|4&p/q:PDԨL&KDeE/fY;na[#Mz}[leG ۟u ŕ;^izx+ k\̜𜮫s+J q\)RhQTWWS^&AGg'9sRr dr9{>7v[rׁz޿l>7v1h4isĔ ȿ 7>\~Q8I˫}C=8y"=CTPyljA$6xIZ]zYi2L&zi*%KJOXx,F4=r͑rraw7];]}&9DF깆nNT>4)( !2T = rmq}kӳ?v OMd"Fa7pz~ "U^݆y E&/7gW ZQ((t1DA+?aշIENDB`bluewho-0.1/gfx/class4/14.png0000777000175000017500000000000011322442207020070 2../class6/1.pngustar muflonemuflonebluewho-0.1/gfx/class4/1.png0000644000175000017500000000612111303556362015542 0ustar muflonemuflonePNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATh͚Yl]yMJIb;VPe-ׁyH"pI F 4A>5&/MD(ZF&Z b$eH63_ιWFf ;YȞ4"7?'{>n''K~Yi ѺO@&R?آ_];w'=h`[l_̸^X*sB2QVTr&n7]8I;9Xȵ1|?佹Fg߿z•>pdd$;zsσm[,OL60z?^x ff)=KD)Gzw?o#̙3wFV Ac$7&(3ɺ6Wϟ˓'OꍘLGG o,,ףHAi)=Ţeey ~o1׮k0mf|'rݡ|%KFF$3~Ws?9Л 7o)xd㼠\tD?n{ypǎP4}ܛ^\XuZ}k;;g8LժƛcF<0@Xg'i! X|0/]T^.ku|=CL34OO1oesw WڠQ#C8F)8BZC4;RTzQZ]YAq`F!"2qkϧ i!lL}!0DA>4ZSN)w` C~у[z륮LWW m!ϣ9٠Vk`pp0eQzvl ^":P< mX֚{ DV?@D{jjca̭kl |o[oWA$ `Y1%FF1c[P`dkKl>f962^$mI~1p3ymI7dXRB@Xd[ !@DI$!Z#`^F1\y.3HGc0*D"Y08Vm;CD iyf /l k4P&$ac43NZ{R 15Zi "fDuFk\0@Ƙx& eBk=%`h`XCֹ- 0hŽ$[H~4[`؄6&1A†ڙCj2|֓Eސh]XJ">v+*lD BJX;yFy Z?~i^&~!2=:KE( XXaVBUzRHT5_&1&TBiF &³{كHس(HۃL9Rb]tBbva-cu="I6 :Y]*e`Y~W3R[ZJX<R1.{ooEaT*Nx7ǐ >Z;/:ZDD~l6 CC't'kY_GFw^6;AB ,"?UL^%uB@QI?usN`Y+2ҵы5A a4f݅w0;}Z+V&51@Ш7|/~Kc}ep?c[ |-bX)A\Fw1ȯ^C&!qI]Sp\LM٨'t~lбZ$(loJk`F۲q-ToOWX :k+.ި~"Ձ!g^`z{^ Gµ(V߻|6cqݨ0 ӹPFVi8}h*-$՚gz;K+UR_|o Ҥ>S-j; "h՚%0+"F޻p͚:g#|\k4vűn3?0&@϶t\ܜM=Z㤵f; ë*TV]*80$`60}rb.t=l](52mDApr)ABs݇ff|rbOR=;ى[7@y>Erl_VV( \{z $2%1mib b36v,$Y])@EWr<95 p]==ɦ`.*JEi.$T-)}!Z V[-QХ;sqbzvbl%nݼ9Ei,Vk^>6} `3tzmHj |۷nU8½Y/.,sYmh4~ڦN]u槵@ @ JzmXW+go]Q*qa|z^Ke*j^@6x&J5D4t|̦fH;ݺ :Hkǂ_IQ`MDMoO 4IENDB`bluewho-0.1/gfx/class4/5.png0000644000175000017500000001024411303556372015550 0ustar muflonemuflonePNG  IHDR00WbKGD pHYs.#.#x?vtIME  + 1{1IDATh՚{]Wu{=c{ƞ;$$!m(8qSi)F*-V*ZBOHT !Ѩ JԒ%I㼨y9gƏܹ{sgcB#{u:[k}kχY?p,MoJHFb!ԐrZk9]9 ?QzG޾>zV֬\R܎;Z}D?(NZ`Ƃ5Ӈa<7swܹ_oӹyg?'\kAHE-pqPJz.ckO~߼{=u1{vS>YnVP~ {[8 ; @$VRzm(ˉ3 LR%=EWV!(wu1$>qziOqMRεjiL$IBQ_fOn[tp$ZD{)` $^ @^gt:&qj>O ˖ oJ+K,I鴉( ;Fn_ !\1Q*8t*Rf(6Rl 2/Y$G'0Ł^rF5(Xk;aEvB@kB#epe*!0`2ͫ'f`e)~pqBmvɻ2;4̉FI@_a!X}\% CRRI)a(a"2J ֚$MƁ`|O<\c&ij-_m<>l޷>"N"֯''1F!cB OF!38&Nf_ \Ͻb~a;nݻY5c6ͷl[uj|M^ٷ+(YIigUv8qxF)J֚,r׾ΞgmmM7q]LcDH14F1rVA.J.\R8i 1fme!سy6o_+~i^xa/V[d+Tiۤiр01d:i kIFexyj5RxG^n1!`rLӊt.LCcxx wܱ$Ih4-hmCeh `u 1Ɛf)V}C)6~|>}T¥K )&C 8}4Z뜒kmwk]e$iznUFa-,֚ LkQ. 5 P"2aҨ7PDQb5,3usL I0_5#(%֠u9[k֬lbZˣ㯷w_?hZ [n4 f_eqqRM4q(%24z&ח9N.4[_ej5z{{) 뺤i#Ij,JgΞ豣:xFi:yŽdY+/ģ>̋/hM'di````u=(ZCrBpZS ;s,I0:C)EVR裏8 `RR. 6$qK)ƪFFF(|4AQl7"[J A}/> }+46lX,RF  Cy%u!MSX,(GqfRPVT*T* LLLSAH5Z{sssnf2nexx;+|H)iLMMKdd:cWr)TVP=RlܸX "rRHP, c Qg1ڬ5kL@>Z[)#T*2>A_F3꿖˴ZYn/- i+{$/v5R)s-[|7q]kma ,HӔ4MI$IAW+Mcp]rӍ1+JVkή//ʲ~s>=m۶ϔJyAcl~ WǤi°TrBM& 2=>>#N˯1^edd$InΜ9C [%!ŀ6"~]-|?%۶]ΝOeXX2o۷_gmjeA ( hc87?ǡCȑ#$IMﺉjJx\.BkIeJ>BHvt3CCKhOqp;{  \\}k}}! ={Gi H86yUCc-a'ddddEJ)q\|R㎞jO©B6ڞXnB]vqبy=}_Z?P^vRm[@yQ"dÆ *dLNnO}Sqgdw}n`=wtQQNWec^F()1hffs+䔓XkqB@X<)q0\3B ֮Qj} Aa̭tC)~J3IzW,qrq\a<dnwAPdllt'~fgOu G@N-Fo(jT]˗dOMپs,(b}]B!`b8BJ0$IR4afpi֬Y*W[nA _;S*y{n''N`DaDEH!X=,aYdsWwo4`; ?]vekD[m*WN ֏}&4執m%`īWo$e.v@;ۭ۾Wots. 3L  k ?cU/JP"մb0^<_vf!`[.w`;{ % *"km}v@(b uP6{&QQj֯l֮;6eƘr{(,L+Vp1Mdfp6`:s{+5 |\ 5&܁@1յ1V!*ňhovmJ @ATczP 7,5U*߂U:m&dЕCbl~Fq{`yp+eUQU1 ح"*T^)ʊjMaGEUqj~Hh^Rg#sFȣdk lMv޴,ʥ~ GP8Y!o?aЏ0ւ^<i3 89FK5̀~2 "3U-]Tx_QK}:^k*AH}u@0tUj. E0oX^'p0/'[{;m[FO PZG="7"P/u;uuKUCHWW[u1ԉ:V0bQC tQ  X#3=i>QlvŃ=x9?Kn Ise"M3@Bs)g6Fh9ΫeM'fNJǵI,Mq@Eћι-6JZNC1F^ NYy\8?v#t' Bvnk?:Wby<=Qh& L/k*UawCIENDB`bluewho-0.1/gfx/class1/4.png0000644000175000017500000000403511303556355015546 0ustar muflonemuflonePNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAThYoWvgח8MB#,8lrmm JE"$x!B<  )J $*AUٴEqbljޙ̙3ڎ{OZs~3.0"B7r躁!@ m&]y0 09(:``'Hmde嶾$QנLa0iEEzD6c,)qN$H2'%:džIl#!F8X'?_I"$e<!vF޿X,r, i" :IoBvlћC7Ύ{*ɞ.Nqla.PnA3)%.pr8D;#je ǁg V ?$rnߞeH(ũc#eVYMy@Gۗ Z8 =o4hlAۥ Ix ,ƻwW?gB&AZFãGABj'"H)$Davv6@saqahz't6q"Bl4]5N)h4[Wba {cuuw{n/d.LЭ\qX{s=7v]HV c,j}8{I"\Ëxj*Hx?`>VZus4BcGI)(FFF01 |2m7&3p.?xky5 C3R/ 8u4c5 (Vpdl 8W4 J%,0Ľk>ju{m5 >v56u4p}B0!kep~ ׾k208qbwB%c@c``RT.:Wx37<y*2fffPr';IrYAUSH*T5_*vL&ﭷKsƠ( ^WX^… S,z(ҽW^?\@'KIENDB`bluewho-0.1/gfx/class1/2.png0000644000175000017500000000337311303556401015540 0ustar muflonemuflonePNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<xIDAThZݏW{c?6^Wv?n6hiW)/I6H>D+Fy@ڇHx*P-AQA"TH vSBmȚڻǞfPdfk#4:;s޹3JD0|K/xk+/ʃ "=c̷KR!yZV9F,AcPf…ZL.~DG6}|{l8py(HV"h4\r8pcSc++gK~]Nfv4Md]Չ_-#(^;4611QUMDMLTj|!^>{LR5|#-gC?Aݿw#;6]~&&)- }6[+VacrOyD2Z_ðGŭ?﮽ kOV?cLT٭W^Ǒ*N޹7<D$5m@+%[G e~'r@8<ϖ,i"螎N~j{\y?b$2ǘ̂n; F 5Gw f010 D%4>^B2bJ%2NftPj YK0lAi_YuB2УafJeY E!n׷S]'"ajQz SO@}c!k)5Q [p+`H[uҗ>2@DnsׯyPPhD:=o\% @cB=j$A[xvCz?gk"|kvCd"d<A$͈[aHzq&*].~Sx lソ@0-n4f+?}Yo &N己 ,4@ %csM( ,I!nAA.ڻA6Z LXBμPġbV/>HJ)=7 ~JmB`w{@)%a*J)䉈 Nd@4*Q@6`as3&O,Z^^fŇGgkX]FTHlv!,-usJb .]x6fh`VyyDPA.CՆ1f[2/^T9766yyj5Q,cfggQ(p7͵T1u^ lklr3 n4$* aww7 mޡR7q͜I}y㊨j6 >(qXmm/MY3J)r9AAy%W@b 3]V( 2Z)J *"@ |Eeh}u;julRMթSt^׹\af]8&CMLd+ hcac]Qt:{az*IԿ8HIENDB`bluewho-0.1/gfx/class1/1.png0000644000175000017500000000531111304250666015536 0ustar muflonemuflonePNG  IHDR00WsRGBbKGD pHYs  9tIME % IIDAThZk\e~;3gfvwmi˭P(*r xim@ 4CI%ڠQ H$#QBBf Ee{ٝs̙ݙ],i%_>~gS;h=vX=e5*гn-gfKqS&/[M"tZjMX]sg-ˋD߫?Ivc k7oظ~P ˯O=oAd W5wڏŒKspz֭mssB }}DZcq<֑\$ƉfcNEr\Ϻի { f]Q}ؼ0͝hxBQF \?xk\Ѝ;!r_&=$ڱpS?i xȈD)W iTk^rD#* rZ),ѝV7 X(u<@TAD07MDZ¯Z:VtDJPÐ_5-ncP+^okYf  Ni9MRaD8WD2x8PH' Ԅe<&hNi0QC::CE qT":0kq199 , #W`XZ0)+zW f8ATDD&6nւA#@ 0)HCrXUQ*8_X*qE $J*U 8lX)QD!U0'9@\&J*(Tck'@XiITB1:U6a ðUA p"$“({BA vpNkqsD0T]2#c͊"Q8 VpA(2qBTEU($HZ=7y*#4 a'B& & %V'Ǵ7#Q(` AV@d` a؀*j ZP@9yT4*0! @`0S"C3u7[|Y_ySf7|G>_@wg[?x??XkW>A1śY+bl6 :(7R İsrB`05Z{)dރw\/(<Äb'2aaXȑΛ ٿ%t.`;lnϺVI\xfqp+P 6N0 b~{ "̹mVi?SO08i6<@ׯ|#*5kɕMݻ8(8RN_|P3IENDB`bluewho-0.1/gfx/class1/5.png0000644000175000017500000000561011157603350015542 0ustar muflonemuflonePNG  IHDR00WbKGD =IDATx՚YyU==rw܃Ԋ2JDY$òiJ| Ŏm@`%F&>0lZE:HKIoٝ9*3;\1Y!HM, \wg j@^p{g C,b/@p\ץQoj&C@>`0izn0"Q6N[oŹsPڛ@Ѥ+<\l;`J6c4<6(!jMfZC,aTAT{|pcʑynCX̡Q DFƠFkV.h>c(7Vn4Յ{O)8Vwh@W=@iŏ!jh<5G1}h+Nq0j8\ N[ rdvSgw~_痿7e+?|5 Dh`l JiߠA[[`^UDa Il9B)_RvHZ.ZiѤ/e#D P}@'{PRPz kU&;l{eh{oXRJ/ǖbж50tB2#MwCR"0ڏ_R rm.k*L;{,`*BFwm-}gn#3Yr+e'FRZ=3RZzJ_ZɅC*Mn]ϑ&3d|2Ra ߅ )Z<0>EfF#VvPlNmc|wcnԲtR j|v<%x46bS#5QXJލ,\F'g׫TJ>MԺ1GƶBrGE;ShHo|‰Ǧ{c1e{,cS;BH)}>݉$OrU&I( Y{ՄcƵn| Ҳݨ H1rzcu)O(dE( fH̏0H$Zb\rrΗ>,i "Bh+ds齛\<'=H6 &gCpcn~ exJ~G"|YK NlBB!N?1OJ'A X8n AIcV2ut&z=~R bj_m{&!F C4nsR zLrį* _7u|oLt!K"he_71|ٷXVhOX"~nHHц:O>=ϵś3]* QV Tu-+n ,)Odbb7v[SA&b1.f)|%X' ,\ny .ztm L9?N, iĚ^Y^O$!R4o9+^?@K6YӘ@mq{Q iq=0qhϟ;C2b$ rxJ- p#q=I+9.35=hds;!H+!XE8E+Eq4Wo@1_m).\XNYd_W]gΜq*j1ܾbY- !dڨ^BوG4ȆW)[b*s23=eY@xkܥ6k*^;YFpڧZm Z~Bƕ/AoaClvh<}_ c1шM4%4;z0J):NEPw ƐN«_uwp]q*@1AtPdvv68ΐqTZ/n~"fդjaYC!‘#Q~?j_ -h]J4b2X#<7cW'  uRN `+%oPp}}@AU[ٱJ9Au&`vUn3v9xIoZϿM]ntm _҃Ve% oDNIENDB`