./qwbfsmanager-1.2.1-src/0000755000175000017520000000000011546156115014523 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/translations/0000755000175000017520000000000011546156115017244 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/translations/qwbfsmanager-pl_PL.ts0000644000175000017520000010372511544172501023300 0ustar pasnoxpasnox Gauge Usage %1 (%2%) / %3 - Free %4 (%5%) PartitionComboBox Add a partition Enter a partition path Current Partition PartitionWidget Set the current partition Load/Reload the discs from the current partition Format the partition Add a new view Remove the view WBFS View Remove the selected discs Rename the selected disc Show/Hide Import View List CoverFlow Import View Clear the discs Import the discs to the WBFS partition %1 disc(s) on the partition - %2 disc(s) to import. Can't open partition. The partition '%1' will be formatted, all data will be erased permanently, are you sure? Can't format partition. You are about to permanently delete %1 disc(s) on partition '%2', are you sure? One or more discs have failed to be removed. Choose a new name for the disc Can't rename disc id #%1 (%2) to '%3' ProgressDialog Global progression... Details. Time remaining: %1 Cancel requested, the process will stop after the current operation. The thread finished in %1 PropertiesDialog Properties General Application locale Click here to change the application locale View Mode View Icon Type Covers' Cache Path Browse for a folder Use the system temporary directory Disk Size Unlimited MB Proxy Type Login Password Server Port PLEASE NOTE THAT THE PASSWORD IS ENCRYPTED WITH A SHIT METHOD. BE CAREFUL. List Icon Disc Cover No Proxy Socks5 Http Choose a folder for the data cache QObject The Free, Fast and Powerful cross platform Wii Backup File System manager QWBFS::Driver No error Partition not opened Source partition not opened Disc read failed Disc write failed Disc extract failed Disc add failed Disc convert failed Disc rename failed Disc found Disc not found (or not exists) Invalid disc index Invalid disc id Invalid disc Can't drive to drive copy Unknown error None Success Failed QWBFS::Model::DiscDelegate Estimated size: %1 - Origin: %2 QWBFS::Model::DiscModel Id: %1 Title: %1 Size: %1 Origin: %1 Region: %1 State: %1 Error: %1 Image Id Title Size Region Origin Sort by Id Sort by Title Sort by Size Sort by Region SplashScreen Version %1 UIAbout About... Informations License Notice I DO NOT TAKE ANY RESPONSIBILITY FOR ANY DAMAGE TO YOUR WII CONSOLE BECAUSE OF IMPROPER USAGE OF THIS SOFTWARE. 3rd Party Version %1 UIMain Tools File System Reload the mount points Export Clear the list Remove the selected items from the list Process the export list Main ToolBar Covers Covers By Reload Reload the partitions About... Quit... Properties Convert ISO Files Convert WBFS Files Rename Discs in folder Actions Welcome to %1, the cross-platform WBFS Manager. Report bugs <a href="%2">here</a>, discuss <a href="%3">here</a>. I don't know how to list partition for this platform. You will have to set the correct partition path yourself for mounting partitions. Choose ISO files to convert Choose the folder to scan for ISOs/WBFSs files Choose the pattern to apply: %1 %2 %3 Which format do you want to use to export the discs ? ISO Files (*.iso) WBFS Files (*.wbfs) Choose WBFS files to convert %1 = Game Title %1 = Game Id %1 = File Suffix Choose a folder to export the discs WorkerThread Indirect Export to ISO Export to ISO Indirect Export to WBFS Export to WBFS Indirect Import to ISO Import to ISO Indirect Import to WBFS Import to WBFS Indirect Convert to ISO Convert to ISO Indirect Convert to WBFS Convert to WBFS Rename Disc Initializing WBFS disc '%1'... Formating WBFS disc '%1'... pPartition Unknown FS Unknown Vendor/Model pPartitionModel Label Path File System Mount Points Vendor Model File System Id Display Text Size Used Free Last Check ./qwbfsmanager-1.2.1-src/translations/qwbfsmanager-it_IT.ts0000644000175000017520000010756011544172501023303 0ustar pasnoxpasnox Gauge Usage %1 (%2%) / %3 - Free %4 (%5%) Usati %1 (%2%) / %3 - Liberi %4 (%5%) PartitionComboBox Add a partition Enter a partition path Current Partition PartitionWidget Set the current partition Seleziona la partizione corrente Load/Reload the discs from the current partition Carica/Ricarica i dischi dalla posizione corrente Format the partition Formatta la partizione Add a new view Aggiungi nuova vista Remove the view Rimuovi vista WBFS View Vista WBFS Remove the selected discs Rimuovi i dischi selezionati Rename the selected disc Rinomina il disco selezionato Show/Hide Import View Mostra/Nascondi Vista Importazione List CoverFlow Import View Vista Importazione Clear the discs Cancella i dischi Import the discs to the WBFS partition Importa i dischi nella partizione WBFS %1 disc(s) on the partition - %2 disc(s) to import. %1 disco/dischi nella partizione - %2 da importare. Can't open partition. Impossibile aprire la partizione. The partition '%1' will be formatted, all data will be erased permanently, are you sure? La partizione '%1' verrà formattata, tutti i dati verranno cancellati definitivamente, sei sicuro? Can't format partition. Impossibile formattare la partizione. You are about to permanently delete %1 disc(s) on partition '%2', are you sure? Si sta per eliminare definitivamente %1 disco/dischi nella partizione '%2', sei sicuro? One or more discs have failed to be removed. É fallita la rimozione di uno o più dischi. Choose a new name for the disc Scegli un nuovo nome per il disco Can't rename disc id #%1 (%2) to '%3' Impossibile rinominare disco id #%1 (%2) a '%3' ProgressDialog Global progression... Avanzamento globale... Details. Dettagli. Time remaining: %1 Tempo rimanente: %1 Cancel requested, the process will stop after the current operation. Annullamento richiesto, il processo terminerà dopo l'operazione corrente. The thread finished in %1 L'azione finirà in %1 PropertiesDialog Properties Proprietà General Generale Application locale Lingua Click here to change the application locale Cliccha qui per cambiare la lingua dell'applicazione View Mode View Icon Type Covers' Cache Cache Copertine Path Percorso Browse for a folder Sfoglia per una cartella Use the system temporary directory Usa la cartella temporanea di sistema Disk Size Dimensione Disco Unlimited Illimitata MB MB Proxy Proxy Type Tipo Login Login Password Password Server Server Port Porta PLEASE NOTE THAT THE PASSWORD IS ENCRYPTED WITH A SHIT METHOD. BE CAREFUL. SI PREGA DI NOTARE CHE LA PASSWORD È CRIPTATA CON UN METODO DI MERDA. FAI ATTENZIONE. List Icon Disc Cover No Proxy Nessun Proxy Socks5 Socks5 Http Http Choose a folder for the data cache Scegli una cartella per la cache dei dati QObject B B KB KB MB MB GB GB TB TB PB PB Too big Troppo Grande The Free, Fast and Powerful cross platform Wii Backup File System manager Il gestore per il Wii Backup File System, multi-piattaforma, libero, veloce e potente QWBFS::Driver No error Nessun errore Partition not opened Partizione non aperta Source partition not opened Partizione di origine non aperta Disc read failed Lettura disco fallita Disc write failed Scrittura disco fallita Disc extract failed Estrazione disco fallita Disc add failed Aggiunta disco fallita Disc convert failed Conversione disco fallita Disc rename failed Rinominazione disco fallita Disc found Disco trovato Disc not found (or not exists) Disco non trovato (o inesistente) Invalid disc index Indice disco non valido Invalid disc id Id disco non valido Invalid disc Disco non valido Can't drive to drive copy Impossibile copiare da lettore a lettore Unknown error Errore sconosciuto None Niente Success Riuscito Failed Fallito QWBFS::Model::DiscDelegate Estimated size: %1 - Origin: %2 Dimensione stimata: %1 - Origine: %2 QWBFS::Model::DiscModel Id: %1 id: %1 Title: %1 Titolo: %1 Size: %1 Dimensione: %1 Origin: %1 Origine: %1 Region: %1 Regione: %1 State: %1 Stato: %1 Error: %1 Errore: %1 Image Id Title Size Region Origin Sort by Id Sort by Title Sort by Size Sort by Region SplashScreen Version %1 Versione %1 UIAbout About... Informazioni... Informations Informazioni License Licenza Notice Avviso I DO NOT TAKE ANY RESPONSIBILITY FOR ANY DAMAGE TO YOUR WII CONSOLE BECAUSE OF IMPROPER USAGE OF THIS SOFTWARE. NON MI ASSUMO NESSUNA RESPONSABILITÀ PER EVENTUALI DALLI SULLA CONSOLE WII A CAUSA DI UN USO IMPROPRIO DI QUESTO SOFTWARE. 3rd Party Version %1 Versione %1 UIMain Tools Strumenti File System File System Reload the mount points Ricarica i punti di mount Export Esporta Clear the list Cancella l'elenco Remove the selected items from the list Rimuovi gli elementi selezionati dalla lista Process the export list Processa la lista di esportazione Main ToolBar Barra degli Strumenti Principale Covers Copertina Covers By Reload Ricarica Reload the partitions Ricarica le partizioni About... Informazioni... Quit... Chiudi... Properties Proprietà Convert ISO Files Converti File ISO Convert WBFS Files Converti File WBFS Rename Discs in folder Rinomina Dischi nella cartella Actions Azioni Welcome to %1, the cross-platform WBFS Manager. Report bugs <a href="%2">here</a>, discuss <a href="%3">here</a>. Benvenuto in %1, il gestore WBFS multi-piattaforma. Riporta bug <a href="%2">qui</a>, discussioni <a href="%3">qui</a>. I don't know how to list partition for this platform. You will have to set the correct partition path yourself for mounting partitions. Non so come elencare le partizioni per questa piattaforma. Dovrai impostare a mano il percoso corretto per le partizioni montate. Choose ISO files to convert Scegliere file ISO da convertire Choose the folder to scan for ISOs/WBFSs files Scegliere la cartella da scansionare per file ISO/WBFS Choose the pattern to apply: %1 %2 %3 Scegli il modello da applicare: %1 %2 %3 Which format do you want to use to export the discs ? Che formato vuoi usare per esportare i dischi? ISO Files (*.iso) File ISO (*.iso) WBFS Files (*.wbfs) File WBFS (*.wbfs) Choose WBFS files to convert Scegliere file WBFS da convertire %1 = Game Title %1 = Titolo Gioco %1 = Game Id %1 = ID Gioco %1 = File Suffix %1 = Estensione File Choose a folder to export the discs Scegli la cartella dove espoertare i dischi WorkerThread Indirect Export to ISO Esportazione Indiretta in ISO Export to ISO Esporta in ISO Indirect Export to WBFS Esportazione Indiretta in WBFS Export to WBFS Esporta in WBFS Indirect Import to ISO Importazione Indiretta in ISO Import to ISO Importazione in ISO Indirect Import to WBFS Importazione Indiretta in WBFS Import to WBFS Importazione in WBFS Indirect Convert to ISO Conversione Indiretta in ISO Convert to ISO Conversione in ISO Indirect Convert to WBFS Conversione Indiretta in WBFS Convert to WBFS Conversione in WBFS Rename Disc Rinomina Disco Initializing WBFS disc '%1'... Inizializzazione disco WBFS '%1'... Formating WBFS disc '%1'... Formattazione disco WBFS '%1'... pPartition Unknown FS Unknown Vendor/Model pPartitionModel Label Path Percorso File System File System Mount Points Vendor Model File System Id Display Text Size Used Free Last Check ./qwbfsmanager-1.2.1-src/translations/qwbfsmanager-ar_SA.ts0000644000175000017520000010372511544172501023257 0ustar pasnoxpasnox Gauge Usage %1 (%2%) / %3 - Free %4 (%5%) PartitionComboBox Add a partition Enter a partition path Current Partition PartitionWidget Set the current partition Load/Reload the discs from the current partition Format the partition Add a new view Remove the view WBFS View Remove the selected discs Rename the selected disc Show/Hide Import View List CoverFlow Import View Clear the discs Import the discs to the WBFS partition %1 disc(s) on the partition - %2 disc(s) to import. Can't open partition. The partition '%1' will be formatted, all data will be erased permanently, are you sure? Can't format partition. You are about to permanently delete %1 disc(s) on partition '%2', are you sure? One or more discs have failed to be removed. Choose a new name for the disc Can't rename disc id #%1 (%2) to '%3' ProgressDialog Global progression... Details. Time remaining: %1 Cancel requested, the process will stop after the current operation. The thread finished in %1 PropertiesDialog Properties General Application locale Click here to change the application locale View Mode View Icon Type Covers' Cache Path Browse for a folder Use the system temporary directory Disk Size Unlimited MB Proxy Type Login Password Server Port PLEASE NOTE THAT THE PASSWORD IS ENCRYPTED WITH A SHIT METHOD. BE CAREFUL. List Icon Disc Cover No Proxy Socks5 Http Choose a folder for the data cache QObject The Free, Fast and Powerful cross platform Wii Backup File System manager QWBFS::Driver No error Partition not opened Source partition not opened Disc read failed Disc write failed Disc extract failed Disc add failed Disc convert failed Disc rename failed Disc found Disc not found (or not exists) Invalid disc index Invalid disc id Invalid disc Can't drive to drive copy Unknown error None Success Failed QWBFS::Model::DiscDelegate Estimated size: %1 - Origin: %2 QWBFS::Model::DiscModel Id: %1 Title: %1 Size: %1 Origin: %1 Region: %1 State: %1 Error: %1 Image Id Title Size Region Origin Sort by Id Sort by Title Sort by Size Sort by Region SplashScreen Version %1 UIAbout About... Informations License Notice I DO NOT TAKE ANY RESPONSIBILITY FOR ANY DAMAGE TO YOUR WII CONSOLE BECAUSE OF IMPROPER USAGE OF THIS SOFTWARE. 3rd Party Version %1 UIMain Tools File System Reload the mount points Export Clear the list Remove the selected items from the list Process the export list Main ToolBar Covers Covers By Reload Reload the partitions About... Quit... Properties Convert ISO Files Convert WBFS Files Rename Discs in folder Actions Welcome to %1, the cross-platform WBFS Manager. Report bugs <a href="%2">here</a>, discuss <a href="%3">here</a>. I don't know how to list partition for this platform. You will have to set the correct partition path yourself for mounting partitions. Choose ISO files to convert Choose the folder to scan for ISOs/WBFSs files Choose the pattern to apply: %1 %2 %3 Which format do you want to use to export the discs ? ISO Files (*.iso) WBFS Files (*.wbfs) Choose WBFS files to convert %1 = Game Title %1 = Game Id %1 = File Suffix Choose a folder to export the discs WorkerThread Indirect Export to ISO Export to ISO Indirect Export to WBFS Export to WBFS Indirect Import to ISO Import to ISO Indirect Import to WBFS Import to WBFS Indirect Convert to ISO Convert to ISO Indirect Convert to WBFS Convert to WBFS Rename Disc Initializing WBFS disc '%1'... Formating WBFS disc '%1'... pPartition Unknown FS Unknown Vendor/Model pPartitionModel Label Path File System Mount Points Vendor Model File System Id Display Text Size Used Free Last Check ./qwbfsmanager-1.2.1-src/translations/qwbfsmanager-zh_CN.qm0000644000175000017520000000002011410740625023242 0ustar pasnoxpasnox Gauge Usage %1 (%2%) / %3 - Free %4 (%5%) Utilisation %1 (%2%) / %3 - Libre %4 (%5%) PartitionComboBox Add a partition Ajouter une partition Enter a partition path Entrer le chemin de la partition Current Partition Partition Courante PartitionWidget Set the current partition Définir la partition courante Load/Reload the discs from the current partition Charger/ReCharger les disques depuis la partition courante Format the partition Formater la partition Add a new view Ajouter une nouvelle vue Remove the view Enlever la vue WBFS View Vue WBFS Remove the selected discs Enlever les disques sélectionnés Rename the selected disc Renommer le disque sélectionné Show/Hide Import View Afficher/Cacher la Vue d'Importation List Liste CoverFlow Import View Vue d'Importation Clear the discs Vider les disques Import the discs to the WBFS partition Importer les disques dans la partition WBFS %1 disc(s) on the partition - %2 disc(s) to import. %1 disque(s) sur la partition - %2 disque(s) à importer. Can't open partition. Impossible d'ouvrir la partition. The partition '%1' will be formatted, all data will be erased permanently, are you sure? La partition '%1' va être formatée, toutes les données vont être supprimées de façon permanente, êtes-vous sûr ? Can't format partition. Impossible de formater la partition. You are about to permanently delete %1 disc(s) on partition '%2', are you sure? Vous êtes sur le point de supprimer définitivement %1 disque(s) sur la partition '%2', êtes-vous sûr ? One or more discs have failed to be removed. Un ou plusieurs disques n'ont pu être supprimés. Choose a new name for the disc Choisissez le nouveau nom pour le disque Can't rename disc id #%1 (%2) to '%3' Impossible de renommer le disque #%1 (%2) en '%3' ProgressDialog Global progression... Progression globale... Details. Détails. Time remaining: %1 Temps restant : %1 Cancel requested, the process will stop after the current operation. Annulation demandée, le processus s'arrêtera après la tâche courante. The thread finished in %1 La tâche s'est terminée en %1 PropertiesDialog Properties Préférences General Générale Application locale Langue de l'application Click here to change the application locale Cliquez ici pour changer la langue de l'application View Mode Mode d'affichage View Icon Type Mode d'affichage des icônes Covers' Cache Cache des couvertures Path Dossier Browse for a folder Choisir un dossier Use the system temporary directory Utiliser le dossier temporaire du système Disk Size Taille sur le disque Unlimited Illimité MB Mo Proxy Type Login Nom d'utilisateur Password Mot de passe Server Serveur Port PLEASE NOTE THAT THE PASSWORD IS ENCRYPTED WITH A SHIT METHOD. BE CAREFUL. VEUILLEZ NOTER QUE LE MOT DE PASSE EST CRYPTÉ AVEC UNE METHODE BASIQUE. SOYEZ PRUDENT. List Liste Icon Icône Disc Disque Cover Couverture No Proxy Pas de Proxy Socks5 Http Choose a folder for the data cache Choisissez un dossier pour les données du cache QObject B octet(s) KB ko MB Mo GB Go TB To PB Po Too big Trop grand The Free, Fast and Powerful cross platform Wii Backup File System manager Le gestionnaire de Système de Fichier de Sauvegarde Wii multi-platforme Libre, Rapide et Puissant QWBFS::Driver No error Aucune erreur Partition not opened La partition n'est pas ouverte Source partition not opened La partition source n'est pas ouverte Disc read failed Impossible de lire le disque Disc write failed Impossible d'écrire sur le disque Disc extract failed Extraction du disque impossible Disc add failed Ajout du disque impossible Disc convert failed Conversion du disque impossible Disc rename failed Renommage du disque impossible Disc found Disque présent Disc not found (or not exists) Disque introuvable (ou n'existe pas) Invalid disc index Index de disque invalide Invalid disc id Id de disque invalide Invalid disc Disque invalide Can't drive to drive copy Impossible de copier de disque à disque Unknown error Erreur inconnue None Aucun Success Succès Failed Erreur QWBFS::Model::DiscDelegate Estimated size: %1 - Origin: %2 Taille estimée: %1 - Origine: %2 QWBFS::Model::DiscModel Id: %1 Title: %1 Titre: %1 Size: %1 Taille: %1 Origin: %1 Origine: %1 Region: %1 Région: %1 State: %1 État: %1 Error: %1 Erreur: %1 Image Image Id Id Title Titre Size Taille Region Région Origin Origine Sort by Id Trier par Id Sort by Title Trier par Titre Sort by Size Trier par Taille Sort by Region Trier par Région SplashScreen Version %1 UIAbout About... À Propos... Informations License Licence Notice I DO NOT TAKE ANY RESPONSIBILITY FOR ANY DAMAGE TO YOUR WII CONSOLE BECAUSE OF IMPROPER USAGE OF THIS SOFTWARE. JE NE PREND AUCUNE RESPONSABILITÉ POUR LES DOMMAGES CAUSÉS À VOTRE CONSOLE WII QUANT À L'UTILISATION INCORRECTE DE CE LOGICIEL. 3rd Party Ressources Tiers Version %1 UIMain Tools Outils File System Système de Fichier Reload the mount points Recharger les points de montage Export Exporter Clear the list Vider la liste Remove the selected items from the list Enlever les items séléctionnés de la liste Process the export list Traiter la liste d'exportation Main ToolBar Barre d'outils principale Covers Couvertures Covers By Couvertures Par Reload Recharger Reload the partitions Recharger la liste des partitions Convert ISO Files Convertir des fichiers ISO Convert WBFS Files Convertir des fichiers WBFS Rename Discs in folder Renommer les disques d'un dossier About... À Propos... Quit... Quitter... Properties Préférences Actions Actions Welcome to %1, the cross-platform WBFS Manager. Report bugs <a href="%2">here</a>, discuss <a href="%3">here</a>. Bienvenue dans %1, le Gestionnaire WBFS multi-platforme. Reportez les bugs <a href="%2">ici</a>, discutez <a href="%3">ici</a>. I don't know how to list partition for this platform. You will have to set the correct partition path yourself for mounting partitions. Je ne sais pas comment charger la liste des partitions pour cette plateforme. Vous devrez renseigner vous même le chemin des partitions pour les points de montage. Choose ISO files to convert Choisissez les fichiers ISO à convertir Choose the folder to scan for ISOs/WBFSs files Choisissez le dossier à analyser pour la découverte de fichier ISO/WBFS Choose the pattern to apply: %1 %2 %3 Choisissez le modéle à appliquer: %1 %2 %3 Which format do you want to use to export the discs ? Quel format voulez vous utiliser pour exporter les disques ? ISO Files (*.iso) Fichiers ISO (*.iso) WBFS Files (*.wbfs) Fichiers WBFS (*.wbfs) Choose WBFS files to convert Choisissez les fichiers WBFS à convertir %1 = Game Title %1 = Titre du Jeu %1 = Game Id %1 = ID du Jeu %1 = File Suffix %1 = Extension du Fichier Choose a folder to export the discs Choisissez un dossier pour exporter les disques WorkerThread Indirect Export to ISO Exportation Indirecte vers ISO Export to ISO Exportation vers Indirect Export to WBFS Exportation Indirecte vers WBFS Export to WBFS Exportation vers WBFS Indirect Import to ISO Importation Indirecte vers ISO Import to ISO Importation vers ISO Indirect Import to WBFS Importation Indirecte vers WBFS Import to WBFS Importation vers WBFS Indirect Convert to ISO Conversion Indirecte vers ISO Convert to ISO Conversion vers ISO Indirect Convert to WBFS Conversion Indirecte vers WBFS Convert to WBFS Conversion vers WBFS Rename Disc Renommage du Disque Initializing WBFS disc '%1'... Initialisation du disque WBFS '%1'... Formating WBFS disc '%1'... Formatage du disque WBFS '%1'... pPartition Unknown FS SF Inconnu Unknown Vendor/Model Fabriquant/Modèle Inconnu pPartitionModel Label Étiquette Path Chemin File System Système de Fichier Mount Points Points de Montage Vendor Fabriquant Model Modèle File System Id Id du Système de Fichier Display Text Texte d'affichage Size Taille Used Utilisé Free Libre Last Check Dernière Vérification ./qwbfsmanager-1.2.1-src/translations/qwbfsmanager-ja_JP.qm0000644000175000017520000000002011410740625023224 0ustar pasnoxpasnox Gauge Usage %1 (%2%) / %3 - Free %4 (%5%) PartitionComboBox Add a partition Enter a partition path Current Partition PartitionWidget Set the current partition Load/Reload the discs from the current partition Format the partition Add a new view Remove the view WBFS View Remove the selected discs Rename the selected disc Show/Hide Import View List CoverFlow Import View Clear the discs Import the discs to the WBFS partition %1 disc(s) on the partition - %2 disc(s) to import. Can't open partition. The partition '%1' will be formatted, all data will be erased permanently, are you sure? Can't format partition. You are about to permanently delete %1 disc(s) on partition '%2', are you sure? One or more discs have failed to be removed. Choose a new name for the disc Can't rename disc id #%1 (%2) to '%3' ProgressDialog Global progression... Details. Time remaining: %1 Cancel requested, the process will stop after the current operation. The thread finished in %1 PropertiesDialog Properties General Application locale Click here to change the application locale View Mode View Icon Type Covers' Cache Path Browse for a folder Use the system temporary directory Disk Size Unlimited MB Proxy Type Login Password Server Port PLEASE NOTE THAT THE PASSWORD IS ENCRYPTED WITH A SHIT METHOD. BE CAREFUL. List Icon Disc Cover No Proxy Socks5 Http Choose a folder for the data cache QObject The Free, Fast and Powerful cross platform Wii Backup File System manager QWBFS::Driver No error Partition not opened Source partition not opened Disc read failed Disc write failed Disc extract failed Disc add failed Disc convert failed Disc rename failed Disc found Disc not found (or not exists) Invalid disc index Invalid disc id Invalid disc Can't drive to drive copy Unknown error None Success Failed QWBFS::Model::DiscDelegate Estimated size: %1 - Origin: %2 QWBFS::Model::DiscModel Id: %1 Title: %1 Size: %1 Origin: %1 Region: %1 State: %1 Error: %1 Image Id Title Size Region Origin Sort by Id Sort by Title Sort by Size Sort by Region SplashScreen Version %1 UIAbout About... Informations License Notice I DO NOT TAKE ANY RESPONSIBILITY FOR ANY DAMAGE TO YOUR WII CONSOLE BECAUSE OF IMPROPER USAGE OF THIS SOFTWARE. 3rd Party Version %1 UIMain Tools File System Reload the mount points Export Clear the list Remove the selected items from the list Process the export list Main ToolBar Covers Covers By Reload Reload the partitions About... Quit... Properties Convert ISO Files Convert WBFS Files Rename Discs in folder Actions Welcome to %1, the cross-platform WBFS Manager. Report bugs <a href="%2">here</a>, discuss <a href="%3">here</a>. I don't know how to list partition for this platform. You will have to set the correct partition path yourself for mounting partitions. Choose ISO files to convert Choose the folder to scan for ISOs/WBFSs files Choose the pattern to apply: %1 %2 %3 Which format do you want to use to export the discs ? ISO Files (*.iso) WBFS Files (*.wbfs) Choose WBFS files to convert %1 = Game Title %1 = Game Id %1 = File Suffix Choose a folder to export the discs WorkerThread Indirect Export to ISO Export to ISO Indirect Export to WBFS Export to WBFS Indirect Import to ISO Import to ISO Indirect Import to WBFS Import to WBFS Indirect Convert to ISO Convert to ISO Indirect Convert to WBFS Convert to WBFS Rename Disc Initializing WBFS disc '%1'... Formating WBFS disc '%1'... pPartition Unknown FS Unknown Vendor/Model pPartitionModel Label Path File System Mount Points Vendor Model File System Id Display Text Size Used Free Last Check ./qwbfsmanager-1.2.1-src/translations/qwbfsmanager-es_ES.qm0000644000175000017520000004075511543645433023272 0ustar pasnoxpasnox)(-!$\\q^1 '9 5 e k lu~%f lu~) k }4  C  q*w t~ * %' (b i4  cx s,- W  NH( ~  ($ G> U f'_7O  9 e# 8 > yUO  J ~% s, 9c   -+ < ȉ_q!~D5:U 2xP^7c%8jk{s.j mi=$PUtilizado %1 (%2%) / %3 - Libre %4 (%5%)#Usage %1 (%2%) / %3 - Free %4 (%5%)Gaugej%1 juego(s) de la particin - %2 juego(s) a importar.3%1 disc(s) on the partition - %2 disc(s) to import.PartitionWidget"Abrir nuevo panelAdd a new viewPartitionWidgetBImposible formatear la particin.Can't format partition.PartitionWidget:Imposible abrir la particin.Can't open partition.PartitionWidgetXImposible renombrar el juego #%1 (%2) a '%3'%Can't rename disc id #%1 (%2) to '%3'PartitionWidgetPIntroduzca un nuevo nombre para el juegoChoose a new name for the discPartitionWidgetJEliminar todos los juegos de la listaClear the discsPartitionWidget&Formatear particinFormat the partitionPartitionWidget,Ventana de importacin Import ViewPartitionWidgetjIniciar importacin de los juegos a la particin WBFS&Import the discs to the WBFS partitionPartitionWidget ListaListPartitionWidgetdCargar/Actualizar juegos desde la particin actual0Load/Reload the discs from the current partitionPartitionWidgetJUno o ms juegos han sido eliminados.,One or more discs have failed to be removed.PartitionWidget<Eliminar el juego seleccionadoRemove the selected discsPartitionWidget"Cerrar este panelRemove the viewPartitionWidget>Renombrar el juego seleccionadoRename the selected discPartitionWidget0Definir particin actualSet the current partitionPartitionWidgetLMostrar/Ocultar ventana de importacinShow/Hide Import ViewPartitionWidgetLa particin '%1' ser formateada, todos los datos sern borrados de forma permanente, est seguro?XThe partition '%1' will be formatted, all data will be erased permanently, are you sure?PartitionWidget:Datos de la WBFS seleccionada WBFS ViewPartitionWidgetEsts a punto de eliminar permanentemente %1 juego(s) '%2', de la particin actual, est seguro?OYou are about to permanently delete %1 disc(s) on partition '%2', are you sure?PartitionWidgetCancelacin solicitada, el proceso se detendr despus de la tarea actual.DCancel requested, the process will stop after the current operation.ProgressDialogDetalles.Details.ProgressDialog&Pogresin global...Global progression...ProgressDialog4El proceso terminar en %1The thread finished in %1ProgressDialog&Tiempo restante: %1Time remaining: %1ProgressDialog MB MBPropertiesDialog.Idioma de la aplicacinApplication localePropertiesDialog"Elija una carpetaBrowse for a folderPropertiesDialogPElija una carpeta para la cach de datos"Choose a folder for the data cachePropertiesDialogdPulse aqu para cambiar el idioma de la aplicacin+Click here to change the application localePropertiesDialogCartulaCoverPropertiesDialog$Cach de Cartulas Covers' CachePropertiesDialog JuegoDiscPropertiesDialog Tamao del disco Disk SizePropertiesDialogGeneralGeneralPropertiesDialogHttpHttpPropertiesDialog IconoIconPropertiesDialog ListaListPropertiesDialogUsuarioLoginPropertiesDialogNo usar ProxyNo ProxyPropertiesDialogMUY IMPORTANTE: LA CONTRASEA SE ENCRIPTA CON UN MTODO MUY BSICO. TENGA CUIDADO.JPLEASE NOTE THAT THE PASSWORD IS ENCRYPTED WITH A SHIT METHOD. BE CAREFUL.PropertiesDialogContraseaPasswordPropertiesDialogRutaPathPropertiesDialog PuertoPortPropertiesDialogPropiedades PropertiesPropertiesDialog ProxyProxyPropertiesDialogServidorServerPropertiesDialog Socks5Socks5PropertiesDialogTipoTypePropertiesDialogIlimitado UnlimitedPropertiesDialogPUtilizar la carpeta temporal del sistema"Use the system temporary directoryPropertiesDialog&Tipo de vista IconoView Icon TypePropertiesDialog*Modo de visualizacin View ModePropertiesDialogAdministrador gratuito rpido y potente, multi-plataforma de copia de seguridad del sistema de archivos de la WiiIThe Free, Fast and Powerful cross platform Wii Backup File System managerQObjectJNo se puede copiar de un disco a otroCan't drive to drive copy QWBFS::Driver0Error al aadir el discoDisc add failed QWBFS::Driver@Error en la conversin del discoDisc convert failed QWBFS::Driver@Error en la extraccin del discoDisc extract failed QWBFS::DriverDisco presente Disc found QWBFS::DriverLEl disco no se encuentra (o no existe)Disc not found (or not exists) QWBFS::Driver2No se puede leer el discoDisc read failed QWBFS::Driver6Error al renombrar el JuegoDisc rename failed QWBFS::Driver@No se puede escribir en el discoDisc write failed QWBFS::Driver ErrorFailed QWBFS::DriverDisco no vlido Invalid disc QWBFS::Driver,Id del disco no vlidoInvalid disc id QWBFS::Driver2ndice de disco no vlidoInvalid disc index QWBFS::DriverSin erroresNo error QWBFS::DriverNoNone QWBFS::Driver8Imposible abrir la particinPartition not opened QWBFS::Driver.La particin no se abreSource partition not opened QWBFS::Driver SucesoSuccess QWBFS::Driver"Error desconocido Unknown error QWBFS::Driver@Tamao estimado: %1 - Origen: %2Estimated size: %1 - Origin: %2QWBFS::Model::DiscDelegateError: %1 Error: %1QWBFS::Model::DiscModelIdIdQWBFS::Model::DiscModel Id: %1Id: %1QWBFS::Model::DiscModel ImagenImageQWBFS::Model::DiscModel OrigenOriginQWBFS::Model::DiscModelOrigen: %1 Origin: %1QWBFS::Model::DiscModel ReginRegionQWBFS::Model::DiscModelRegin: %1 Region: %1QWBFS::Model::DiscModel TamaoSizeQWBFS::Model::DiscModelTamao: %1Size: %1QWBFS::Model::DiscModelOrdenar por Id Sort by IdQWBFS::Model::DiscModel$Ordenar por ReginSort by RegionQWBFS::Model::DiscModel$Ordenar por Tamao Sort by SizeQWBFS::Model::DiscModel$Ordenar por Ttulo Sort by TitleQWBFS::Model::DiscModelPas: %1 State: %1QWBFS::Model::DiscModel TtuloTitleQWBFS::Model::DiscModelTtulo: %1 Title: %1QWBFS::Model::DiscModelVersin %1 Version %1 SplashScreenAcerca de...About...UIAboutMUY IMPORTANTE: YO NO ME HAGO RESPONSABLE DE CUALQUIER DAO QUE SE PUEDA PRODUCIR EN SU CONSOLA Wii EN CUANTO A LA MAL USO QUE USTED PUEDA DAR A ESTE SOFTWARE. USTE SER SIEMPRE EL NICO RESPONSABLE.oI DO NOT TAKE ANY RESPONSIBILITY FOR ANY DAMAGE TO YOUR WII CONSOLE BECAUSE OF IMPROPER USAGE OF THIS SOFTWARE.UIAboutInformacin InformationsUIAboutLicenciaLicenseUIAboutImportanteNoticeUIAboutVersin %1 Version %1UIAbout,%1 = Sufijo de archivo%1 = File SuffixUIMain %1 = ID de Juego %1 = Game IdUIMain*%1 = Ttulo del Juego%1 = Game TitleUIMainAcerca de...About...UIMainAccionesActionsUIMainFElija un archivo ISO para convertirChoose ISO files to convertUIMainHElija un archivo WBFS para convertirChoose WBFS files to convertUIMainLElija una carpeta para exportar juegos#Choose a folder to export the discsUIMaindSeleccione carpeta para buscar archivos ISOs/WBFSs.Choose the folder to scan for ISOs/WBFSs filesUIMainNElija el modo a ser aplicado: %1 %2 %3 &Choose the pattern to apply: %1 %2 %3 UIMainFQuitar todos los juegos de la listaClear the listUIMain,Convertir archivos ISOConvert ISO FilesUIMain.Convertir archivos WBFSConvert WBFS FilesUIMainCartulasCoversUIMainExportarExportUIMain&Sistema de archivos File SystemUIMainVNo se puede optener una lista de particiones para esta plataforma. Usted tendr que establecer la ruta de la particin correcta aqu mismo para el montaje de la particin.I don't know how to list partition for this platform. You will have to set the correct partition path yourself for mounting partitions.UIMain&Archivo ISO (*.iso)ISO Files (*.iso)UIMain*Barra de Herramientas Main ToolBarUIMain&Iniciar exportacinProcess the export listUIMainPropiedades PropertiesUIMainSalir...Quit...UIMainRecargarReloadUIMain8Actualizar puntos de montajeReload the mount pointsUIMain(Recargar particionesReload the partitionsUIMainPQuitar el juego seleccionado de la lista'Remove the selected items from the listUIMain:Renombrar Juego en la carpetaRename Discs in folderUIMainPanel lateralToolsUIMain,Archivos WBFS (*.wbfs)WBFS Files (*.wbfs)UIMainBienvenido %1, un Gestor WBFS (multi-plataforma). Reporte los bugs <a href="%2">aqu</a>, discusin <a href="%3">aqu</a>.qWelcome to %1, the cross-platform WBFS Manager. Report bugs here, discuss here.UIMainpQu formato se desea utilizar para exportar los juegos?5Which format do you want to use to export the discs ?UIMainConvertir a ISOConvert to ISO WorkerThread Convertir a WBFSConvert to WBFS WorkerThread"Exportacin a ISO Export to ISO WorkerThread$Exportacin a WBFSExport to WBFS WorkerThread<Formateando disco WBFS '%1'...Formating WBFS disc '%1'... WorkerThread"Importacin a ISO Import to ISO WorkerThread$Importacin a WBFSImport to WBFS WorkerThread4Conversin indirecta a ISOIndirect Convert to ISO WorkerThread6Conversin indirecta a WBFSIndirect Convert to WBFS WorkerThread6Exportacin indirecta a ISOIndirect Export to ISO WorkerThread8Exportacin indirecta a WBFSIndirect Export to WBFS WorkerThread6Importacin indirecta a ISOIndirect Import to ISO WorkerThread8Importacin indirecta a WBFSIndirect Import to WBFS WorkerThread@Inicializando disco WBFS '%1'...Initializing WBFS disc '%1'... WorkerThreadRenombrar Juego Rename Disc WorkerThread&Sistema de archivos File SystempPartitionModelRutaPathpPartitionModel TamaoSizepPartitionModel./qwbfsmanager-1.2.1-src/translations/qwbfsmanager-de_DE.ts0000644000175000017520000010372511544172501023232 0ustar pasnoxpasnox Gauge Usage %1 (%2%) / %3 - Free %4 (%5%) PartitionComboBox Add a partition Enter a partition path Current Partition PartitionWidget Set the current partition Load/Reload the discs from the current partition Format the partition Add a new view Remove the view WBFS View Remove the selected discs Rename the selected disc Show/Hide Import View List CoverFlow Import View Clear the discs Import the discs to the WBFS partition %1 disc(s) on the partition - %2 disc(s) to import. Can't open partition. The partition '%1' will be formatted, all data will be erased permanently, are you sure? Can't format partition. You are about to permanently delete %1 disc(s) on partition '%2', are you sure? One or more discs have failed to be removed. Choose a new name for the disc Can't rename disc id #%1 (%2) to '%3' ProgressDialog Global progression... Details. Time remaining: %1 Cancel requested, the process will stop after the current operation. The thread finished in %1 PropertiesDialog Properties General Application locale Click here to change the application locale View Mode View Icon Type Covers' Cache Path Browse for a folder Use the system temporary directory Disk Size Unlimited MB Proxy Type Login Password Server Port PLEASE NOTE THAT THE PASSWORD IS ENCRYPTED WITH A SHIT METHOD. BE CAREFUL. List Icon Disc Cover No Proxy Socks5 Http Choose a folder for the data cache QObject The Free, Fast and Powerful cross platform Wii Backup File System manager QWBFS::Driver No error Partition not opened Source partition not opened Disc read failed Disc write failed Disc extract failed Disc add failed Disc convert failed Disc rename failed Disc found Disc not found (or not exists) Invalid disc index Invalid disc id Invalid disc Can't drive to drive copy Unknown error None Success Failed QWBFS::Model::DiscDelegate Estimated size: %1 - Origin: %2 QWBFS::Model::DiscModel Id: %1 Title: %1 Size: %1 Origin: %1 Region: %1 State: %1 Error: %1 Image Id Title Size Region Origin Sort by Id Sort by Title Sort by Size Sort by Region SplashScreen Version %1 UIAbout About... Informations License Notice I DO NOT TAKE ANY RESPONSIBILITY FOR ANY DAMAGE TO YOUR WII CONSOLE BECAUSE OF IMPROPER USAGE OF THIS SOFTWARE. 3rd Party Version %1 UIMain Tools File System Reload the mount points Export Clear the list Remove the selected items from the list Process the export list Main ToolBar Covers Covers By Reload Reload the partitions About... Quit... Properties Convert ISO Files Convert WBFS Files Rename Discs in folder Actions Welcome to %1, the cross-platform WBFS Manager. Report bugs <a href="%2">here</a>, discuss <a href="%3">here</a>. I don't know how to list partition for this platform. You will have to set the correct partition path yourself for mounting partitions. Choose ISO files to convert Choose the folder to scan for ISOs/WBFSs files Choose the pattern to apply: %1 %2 %3 Which format do you want to use to export the discs ? ISO Files (*.iso) WBFS Files (*.wbfs) Choose WBFS files to convert %1 = Game Title %1 = Game Id %1 = File Suffix Choose a folder to export the discs WorkerThread Indirect Export to ISO Export to ISO Indirect Export to WBFS Export to WBFS Indirect Import to ISO Import to ISO Indirect Import to WBFS Import to WBFS Indirect Convert to ISO Convert to ISO Indirect Convert to WBFS Convert to WBFS Rename Disc Initializing WBFS disc '%1'... Formating WBFS disc '%1'... pPartition Unknown FS Unknown Vendor/Model pPartitionModel Label Path File System Mount Points Vendor Model File System Id Display Text Size Used Free Last Check ./qwbfsmanager-1.2.1-src/translations/qwbfsmanager-sl_SI.qm0000644000175000017520000000002011410740625023252 0ustar pasnoxpasnox Gauge Usage %1 (%2%) / %3 - Free %4 (%5%) Utilitzat %1 (%2%) / %3 - Lliure %4 (%5%) PartitionComboBox Add a partition Afegir partició Enter a partition path Indiqueu la ruta de la partició Current Partition Partició actual PartitionWidget Set the current partition Definir particions actual Load/Reload the discs from the current partition Carregar/Actualitzar jocs des de la partició actual Format the partition Formatar partició Add a new view Obrir nou panell Remove the view Tancar aquest panell WBFS View Dades de la WBFS seleccionada Remove the selected discs Eliminar el joc seleccionat Rename the selected disc Renombrar el joc seleccionat Show/Hide Import View Mostra/Amaga finestra d'importació List Llista CoverFlow Caràtules Import View Finestra d'importació Clear the discs Eliminar tots els jocs de la llista Import the discs to the WBFS partition Iniciar importació dels jocs a la partició WBFS %1 disc(s) on the partition - %2 disc(s) to import. %1 joc(s) de la partició - %2 joc(s) a importar. Can't open partition. Impossible obrir la partició. The partition '%1' will be formatted, all data will be erased permanently, are you sure? La partició '%1'será formatada, totes les dades seran esborrades de forma permanent. Està segur? Can't format partition. Impossible formatar la partició. You are about to permanently delete %1 disc(s) on partition '%2', are you sure? Estàs a punt d'eliminar permanentment%1 joc(s) '%2', de la partició actual. Està segur? One or more discs have failed to be removed. Un o més jocs han estat eliminats. Choose a new name for the disc Introduïu un nou nom per al joc Can't rename disc id #%1 (%2) to '%3' Impossible renombrar el joc id #%1 (%2) a '%3' ProgressDialog Global progression... Pogresión global... Details. Detalls. Time remaining: %1 Temps restant: %1 Cancel requested, the process will stop after the current operation. Cancelació demanada, el procés s'aturarà després de la tasca actual. The thread finished in %1 El procés acabarà a %1 PropertiesDialog Properties Propiedades General General Application locale Idioma de l'aplicació Click here to change the application locale Premi aquí per canviar l'idioma de l'aplicació View Mode Mode de visualització View Icon Type Tipus de vista Icona Covers' Cache Memòria cau de Caràtules Path Ruta Browse for a folder Trieu una carpeta Use the system temporary directory Utilizar la carpeta temporal del sistema Disk Size Mida del disc Unlimited Il limitat MB MB Proxy Proxy Type Tipus Login Usuari Password Contrasenya Server Servidor Port Port PLEASE NOTE THAT THE PASSWORD IS ENCRYPTED WITH A SHIT METHOD. BE CAREFUL. MOLT IMPORTANT: LA CONTRASENYA S'ENCRIPTA AMB UN MÈTODE MOLT BÀSIC. TINGUI CURA. List Llista Icon Icona Disc Joc Cover Caràtula No Proxy No usar Proxy Socks5 Socks5 Http Http Choose a folder for the data cache Trieu una carpeta per a la memòria cau de dades QObject B B KB KB MB MB GB GB TB TB PB PB Too big Massa gran The Free, Fast and Powerful cross platform Wii Backup File System manager Administrador gratuït ràpid i potent, multi-plataforma de còpia de seguretat del sistema d'arxius de la Wii QWBFS::Driver No error Sense errors Partition not opened Impossible obrir la partició Source partition not opened La partició no s'obre Disc read failed No es pot llegir el disc Disc write failed No es pot escriure al disc Disc extract failed Error en l'extracció del disc Disc add failed Error en afegir el disc Disc convert failed Error en la conversió del disc Disc rename failed Error en renombrar el Joc Disc found Disc present Disc not found (or not exists) El disc no es troba (o no existeix) Invalid disc index Índex de disc no vàlid Invalid disc id Id del disc no vàlid Invalid disc Disc no vàlid Can't drive to drive copy No es pot copiar d'un disc a un altre Unknown error Error desconegut None No Success Suceso Failed Error QWBFS::Model::DiscDelegate Estimated size: %1 - Origin: %2 Mida estimat: %1 - Origen: %2 QWBFS::Model::DiscModel Id: %1 Id: %1 Title: %1 Títol: %1 Size: %1 Mida: %1 Origin: %1 Origen: %1 Region: %1 Regió: %1 State: %1 País: %1 Error: %1 Error: %1 Image Imatge Id Id Title Títol Size Mida Region Regió Origin Origen Sort by Id Ordenar per Id Sort by Title Ordenar per Títol Sort by Size Ordenar per Mida Sort by Region Ordenar per Regió SplashScreen Version %1 Versió %1 UIAbout About... Sobre... Informations Informació License Llicència Notice Important I DO NOT TAKE ANY RESPONSIBILITY FOR ANY DAMAGE TO YOUR WII CONSOLE BECAUSE OF IMPROPER USAGE OF THIS SOFTWARE. MOLT IMPORTANT: JO NO EM FAIG RESPONSABLE DE QUALSEVOL DANY QUE PUGUI PRODUIR EN EL SEU CONSOLA Wii SOBRE LA MAL ÚS QUE VOSTÈ PUGUI DONAR A AQUEST SOFTWARE. VOSTÉ SERÀ SEMPRE L'ÚNIC RESPONSABLE. 3rd Party 3rd Party Version %1 Versió %1 UIMain Tools Panell lateral File System Sistema d'arxius Reload the mount points Actualitzar punts de muntatge Export Exportar Clear the list Treure tots els jocs de la llista Remove the selected items from the list Treure el joc seleccionat de la llista Process the export list Iniciar exportació Main ToolBar Barra d'eines Covers Caràtules Covers By Caràtules Reload Recarregar Reload the partitions Recarregar particions About... Sobre... Quit... Sortir... Properties Propietats Convert ISO Files Converteix arxius ISO Convert WBFS Files Convert arxius WBFS Rename Discs in folder Renombrar el Joc a la carpeta Actions Accions Welcome to %1, the cross-platform WBFS Manager. Report bugs <a href="%2">here</a>, discuss <a href="%3">here</a>. Benvingut %1, Gestor WBFS (multi-plataforma). Comuniqui els bugs <a href="%2">aquí</a>, discussió <a href="%3">aquí</a>. I don't know how to list partition for this platform. You will have to set the correct partition path yourself for mounting partitions. No es pot optener una llista de particions per a aquesta plataforma. Vostè haurà d'establir la ruta de la partició correcta aquí, per al muntatge de la partició. Choose ISO files to convert Trieu un arxiu ISO per convertir Choose the folder to scan for ISOs/WBFSs files Seleccioneu la carpeta per cercar fitxers ISOs/WBFSs Choose the pattern to apply: %1 %2 %3 Trieu la manera a ser aplicat: %1 %2 %3 Which format do you want to use to export the discs ? ¿Quin format es vol utilitzar per exportar els discs? ISO Files (*.iso) Arxiu ISO (*.iso) WBFS Files (*.wbfs) Arxius WBFS (*.wbfs) Choose WBFS files to convert Trieu un arxiu WBFS per convertir %1 = Game Title %1 = Títol del Joc %1 = Game Id %1 = ID de Joc %1 = File Suffix %1 = Sufix del fitxer Choose a folder to export the discs Trieu una carpeta per exportar jocs WorkerThread Indirect Export to ISO Exportació indirecta a ISO Export to ISO Exportació a ISO Indirect Export to WBFS Exportació indirecta a WBFS Export to WBFS Exportació a WBFS Indirect Import to ISO Importació indirecta a ISO Import to ISO Importació a ISO Indirect Import to WBFS Importació indirecta a WBFS Import to WBFS Importació a WBFS Indirect Convert to ISO Coversión indirecta a ISO Convert to ISO Coversión a ISO Indirect Convert to WBFS Coversión indirecta a WBFS Convert to WBFS Coversión a WBFS Rename Disc Renombrar Joc Initializing WBFS disc '%1'... Inicialitzar disc WBFS '%1'... Formating WBFS disc '%1'... Formatar disc WBFS '%1'... pPartition Unknown FS FS desconegut Unknown Vendor/Model Venedor/Model desconegut pPartitionModel Label Etiqueta Path Ruta File System Sistema d'arxius Mount Points Punts de Muntatge Vendor Venedor Model Model File System Id Id Sistema d'arxiu Display Text Visualització de text Size Mida Used Usat Free Lliure Last Check Darrera Comprovació ./qwbfsmanager-1.2.1-src/translations/qwbfsmanager-sk_SK.qm0000644000175000017520000000002011410740625023253 0ustar pasnoxpasnox|#('@! q^+1 '2n 5 e lu~ lu~#m kk }4D  g p q$R t $  "Q i- < cx5 s&  4 NH" ~ z (g G>! U 9 f'_0 3Q 8$ >  ~ 3 s& 9c V  & < ȉq8~D/[3 2xP^1Gc%2jk.ji6eJUsati %1 (%2%) / %3 - Liberi %4 (%5%)#Usage %1 (%2%) / %3 - Free %4 (%5%)Gaugef%1 disco/dischi nella partizione - %2 da importare.3%1 disc(s) on the partition - %2 disc(s) to import.PartitionWidget(Aggiungi nuova vistaAdd a new viewPartitionWidgetJImpossibile formattare la partizione.Can't format partition.PartitionWidgetBImpossibile aprire la partizione.Can't open partition.PartitionWidget^Impossibile rinominare disco id #%1 (%2) a '%3'%Can't rename disc id #%1 (%2) to '%3'PartitionWidgetBScegli un nuovo nome per il discoChoose a new name for the discPartitionWidget"Cancella i dischiClear the discsPartitionWidget,Formatta la partizioneFormat the partitionPartitionWidget$Vista Importazione Import ViewPartitionWidgetLImporta i dischi nella partizione WBFS&Import the discs to the WBFS partitionPartitionWidgetbCarica/Ricarica i dischi dalla posizione corrente0Load/Reload the discs from the current partitionPartitionWidgetV fallita la rimozione di uno o pi dischi.,One or more discs have failed to be removed.PartitionWidget8Rimuovi i dischi selezionatiRemove the selected discsPartitionWidgetRimuovi vistaRemove the viewPartitionWidget:Rinomina il disco selezionatoRename the selected discPartitionWidget@Seleziona la partizione correnteSet the current partitionPartitionWidgetDMostra/Nascondi Vista ImportazioneShow/Hide Import ViewPartitionWidgetLa partizione '%1' verr formattata, tutti i dati verranno cancellati definitivamente, sei sicuro?XThe partition '%1' will be formatted, all data will be erased permanently, are you sure?PartitionWidgetVista WBFS WBFS ViewPartitionWidgetSi sta per eliminare definitivamente %1 disco/dischi nella partizione '%2', sei sicuro?OYou are about to permanently delete %1 disc(s) on partition '%2', are you sure?PartitionWidgetAnnullamento richiesto, il processo terminer dopo l'operazione corrente.DCancel requested, the process will stop after the current operation.ProgressDialogDettagli.Details.ProgressDialog,Avanzamento globale...Global progression...ProgressDialog*L'azione finir in %1The thread finished in %1ProgressDialog&Tempo rimanente: %1Time remaining: %1ProgressDialog MB MBPropertiesDialog LinguaApplication localePropertiesDialog0Sfoglia per una cartellaBrowse for a folderPropertiesDialogRScegli una cartella per la cache dei dati"Choose a folder for the data cachePropertiesDialoghCliccha qui per cambiare la lingua dell'applicazione+Click here to change the application localePropertiesDialogCache Copertine Covers' CachePropertiesDialog Dimensione Disco Disk SizePropertiesDialogGeneraleGeneralPropertiesDialogHttpHttpPropertiesDialog LoginLoginPropertiesDialogNessun ProxyNo ProxyPropertiesDialogSI PREGA DI NOTARE CHE LA PASSWORD CRIPTATA CON UN METODO DI MERDA. FAI ATTENZIONE.JPLEASE NOTE THAT THE PASSWORD IS ENCRYPTED WITH A SHIT METHOD. BE CAREFUL.PropertiesDialogPasswordPasswordPropertiesDialogPercorsoPathPropertiesDialog PortaPortPropertiesDialogPropriet PropertiesPropertiesDialog ProxyProxyPropertiesDialog ServerServerPropertiesDialog Socks5Socks5PropertiesDialogTipoTypePropertiesDialogIllimitata UnlimitedPropertiesDialogJUsa la cartella temporanea di sistema"Use the system temporary directoryPropertiesDialogIl gestore per il Wii Backup File System, multi-piattaforma, libero, veloce e potenteIThe Free, Fast and Powerful cross platform Wii Backup File System managerQObjectPImpossibile copiare da lettore a lettoreCan't drive to drive copy QWBFS::Driver,Aggiunta disco fallitaDisc add failed QWBFS::Driver2Conversione disco fallitaDisc convert failed QWBFS::Driver0Estrazione disco fallitaDisc extract failed QWBFS::DriverDisco trovato Disc found QWBFS::DriverBDisco non trovato (o inesistente)Disc not found (or not exists) QWBFS::Driver*Lettura disco fallitaDisc read failed QWBFS::Driver6Rinominazione disco fallitaDisc rename failed QWBFS::Driver.Scrittura disco fallitaDisc write failed QWBFS::DriverFallitoFailed QWBFS::Driver Disco non valido Invalid disc QWBFS::Driver&Id disco non validoInvalid disc id QWBFS::Driver.Indice disco non validoInvalid disc index QWBFS::DriverNessun erroreNo error QWBFS::Driver NienteNone QWBFS::Driver*Partizione non apertaPartition not opened QWBFS::Driver@Partizione di origine non apertaSource partition not opened QWBFS::DriverRiuscitoSuccess QWBFS::Driver$Errore sconosciuto Unknown error QWBFS::DriverHDimensione stimata: %1 - Origine: %2Estimated size: %1 - Origin: %2QWBFS::Model::DiscDelegateErrore: %1 Error: %1QWBFS::Model::DiscModel id: %1Id: %1QWBFS::Model::DiscModelOrigine: %1 Origin: %1QWBFS::Model::DiscModelRegione: %1 Region: %1QWBFS::Model::DiscModelDimensione: %1Size: %1QWBFS::Model::DiscModelStato: %1 State: %1QWBFS::Model::DiscModelTitolo: %1 Title: %1QWBFS::Model::DiscModelVersione %1 Version %1 SplashScreenInformazioni...About...UIAboutNON MI ASSUMO NESSUNA RESPONSABILIT PER EVENTUALI DALLI SULLA CONSOLE WII A CAUSA DI UN USO IMPROPRIO DI QUESTO SOFTWARE.oI DO NOT TAKE ANY RESPONSIBILITY FOR ANY DAMAGE TO YOUR WII CONSOLE BECAUSE OF IMPROPER USAGE OF THIS SOFTWARE.UIAboutInformazioni InformationsUIAboutLicenzaLicenseUIAbout AvvisoNoticeUIAboutVersione %1 Version %1UIAbout(%1 = Estensione File%1 = File SuffixUIMain%1 = ID Gioco %1 = Game IdUIMain"%1 = Titolo Gioco%1 = Game TitleUIMainInformazioni...About...UIMain AzioniActionsUIMain@Scegliere file ISO da convertireChoose ISO files to convertUIMainBScegliere file WBFS da convertireChoose WBFS files to convertUIMainVScegli la cartella dove espoertare i dischi#Choose a folder to export the discsUIMainlScegliere la cartella da scansionare per file ISO/WBFS.Choose the folder to scan for ISOs/WBFSs filesUIMainRScegli il modello da applicare: %1 %2 %3 &Choose the pattern to apply: %1 %2 %3 UIMain"Cancella l'elencoClear the listUIMain"Converti File ISOConvert ISO FilesUIMain$Converti File WBFSConvert WBFS FilesUIMainCopertinaCoversUIMainEsportaExportUIMainFile System File SystemUIMainNon so come elencare le partizioni per questa piattaforma. Dovrai impostare a mano il percoso corretto per le partizioni montate.I don't know how to list partition for this platform. You will have to set the correct partition path yourself for mounting partitions.UIMain File ISO (*.iso)ISO Files (*.iso)UIMain@Barra degli Strumenti Principale Main ToolBarUIMainBProcessa la lista di esportazioneProcess the export listUIMainPropriet PropertiesUIMainChiudi...Quit...UIMainRicaricaReloadUIMain2Ricarica i punti di mountReload the mount pointsUIMain,Ricarica le partizioniReload the partitionsUIMainXRimuovi gli elementi selezionati dalla lista'Remove the selected items from the listUIMain<Rinomina Dischi nella cartellaRename Discs in folderUIMainStrumentiToolsUIMain$File WBFS (*.wbfs)WBFS Files (*.wbfs)UIMainBenvenuto in %1, il gestore WBFS multi-piattaforma. Riporta bug <a href="%2">qui</a>, discussioni <a href="%3">qui</a>.qWelcome to %1, the cross-platform WBFS Manager. Report bugs here, discuss here.UIMain\Che formato vuoi usare per esportare i dischi?5Which format do you want to use to export the discs ?UIMain$Conversione in ISOConvert to ISO WorkerThread&Conversione in WBFSConvert to WBFS WorkerThreadEsporta in ISO Export to ISO WorkerThreadEsporta in WBFSExport to WBFS WorkerThread@Formattazione disco WBFS '%1'...Formating WBFS disc '%1'... WorkerThread&Importazione in ISO Import to ISO WorkerThread(Importazione in WBFSImport to WBFS WorkerThread8Conversione Indiretta in ISOIndirect Convert to ISO WorkerThread:Conversione Indiretta in WBFSIndirect Convert to WBFS WorkerThread:Esportazione Indiretta in ISOIndirect Export to ISO WorkerThread<Esportazione Indiretta in WBFSIndirect Export to WBFS WorkerThread:Importazione Indiretta in ISOIndirect Import to ISO WorkerThread<Importazione Indiretta in WBFSIndirect Import to WBFS WorkerThreadFInizializzazione disco WBFS '%1'...Initializing WBFS disc '%1'... WorkerThreadRinomina Disco Rename Disc WorkerThreadFile System File SystempPartitionModelPercorsoPathpPartitionModel./qwbfsmanager-1.2.1-src/translations/qwbfsmanager-de_DE.qm0000644000175000017520000000002011410740625023201 0ustar pasnoxpasnox Gauge Usage %1 (%2%) / %3 - Free %4 (%5%) PartitionComboBox Add a partition Enter a partition path Current Partition PartitionWidget Set the current partition Load/Reload the discs from the current partition Format the partition Add a new view Remove the view WBFS View Remove the selected discs Rename the selected disc Show/Hide Import View List CoverFlow Import View Clear the discs Import the discs to the WBFS partition %1 disc(s) on the partition - %2 disc(s) to import. Can't open partition. The partition '%1' will be formatted, all data will be erased permanently, are you sure? Can't format partition. You are about to permanently delete %1 disc(s) on partition '%2', are you sure? One or more discs have failed to be removed. Choose a new name for the disc Can't rename disc id #%1 (%2) to '%3' ProgressDialog Global progression... Details. Time remaining: %1 Cancel requested, the process will stop after the current operation. The thread finished in %1 PropertiesDialog Properties General Application locale Click here to change the application locale View Mode View Icon Type Covers' Cache Path Browse for a folder Use the system temporary directory Disk Size Unlimited MB Proxy Type Login Password Server Port PLEASE NOTE THAT THE PASSWORD IS ENCRYPTED WITH A SHIT METHOD. BE CAREFUL. List Icon Disc Cover No Proxy Socks5 Http Choose a folder for the data cache QObject The Free, Fast and Powerful cross platform Wii Backup File System manager QWBFS::Driver No error Partition not opened Source partition not opened Disc read failed Disc write failed Disc extract failed Disc add failed Disc convert failed Disc rename failed Disc found Disc not found (or not exists) Invalid disc index Invalid disc id Invalid disc Can't drive to drive copy Unknown error None Success Failed QWBFS::Model::DiscDelegate Estimated size: %1 - Origin: %2 QWBFS::Model::DiscModel Id: %1 Title: %1 Size: %1 Origin: %1 Region: %1 State: %1 Error: %1 Image Id Title Size Region Origin Sort by Id Sort by Title Sort by Size Sort by Region SplashScreen Version %1 UIAbout About... Informations License Notice I DO NOT TAKE ANY RESPONSIBILITY FOR ANY DAMAGE TO YOUR WII CONSOLE BECAUSE OF IMPROPER USAGE OF THIS SOFTWARE. 3rd Party Version %1 UIMain Tools File System Reload the mount points Export Clear the list Remove the selected items from the list Process the export list Main ToolBar Covers Covers By Reload Reload the partitions About... Quit... Properties Convert ISO Files Convert WBFS Files Rename Discs in folder Actions Welcome to %1, the cross-platform WBFS Manager. Report bugs <a href="%2">here</a>, discuss <a href="%3">here</a>. I don't know how to list partition for this platform. You will have to set the correct partition path yourself for mounting partitions. Choose ISO files to convert Choose the folder to scan for ISOs/WBFSs files Choose the pattern to apply: %1 %2 %3 Which format do you want to use to export the discs ? ISO Files (*.iso) WBFS Files (*.wbfs) Choose WBFS files to convert %1 = Game Title %1 = Game Id %1 = File Suffix Choose a folder to export the discs WorkerThread Indirect Export to ISO Export to ISO Indirect Export to WBFS Export to WBFS Indirect Import to ISO Import to ISO Indirect Import to WBFS Import to WBFS Indirect Convert to ISO Convert to ISO Indirect Convert to WBFS Convert to WBFS Rename Disc Initializing WBFS disc '%1'... Formating WBFS disc '%1'... pPartition Unknown FS Unknown Vendor/Model pPartitionModel Label Path File System Mount Points Vendor Model File System Id Display Text Size Used Free Last Check ./qwbfsmanager-1.2.1-src/translations/qwbfsmanager-pl_PL.qm0000644000175000017520000000002011410740625023247 0ustar pasnoxpasnox Gauge Usage %1 (%2%) / %3 - Free %4 (%5%) PartitionComboBox Add a partition Enter a partition path Current Partition PartitionWidget Set the current partition Load/Reload the discs from the current partition Format the partition Add a new view Remove the view WBFS View Remove the selected discs Rename the selected disc Show/Hide Import View List CoverFlow Import View Clear the discs Import the discs to the WBFS partition %1 disc(s) on the partition - %2 disc(s) to import. Can't open partition. The partition '%1' will be formatted, all data will be erased permanently, are you sure? Can't format partition. You are about to permanently delete %1 disc(s) on partition '%2', are you sure? One or more discs have failed to be removed. Choose a new name for the disc Can't rename disc id #%1 (%2) to '%3' ProgressDialog Global progression... Details. Time remaining: %1 Cancel requested, the process will stop after the current operation. The thread finished in %1 PropertiesDialog Properties General Application locale Click here to change the application locale View Mode View Icon Type Covers' Cache Path Browse for a folder Use the system temporary directory Disk Size Unlimited MB Proxy Type Login Password Server Port PLEASE NOTE THAT THE PASSWORD IS ENCRYPTED WITH A SHIT METHOD. BE CAREFUL. List Icon Disc Cover No Proxy Socks5 Http Choose a folder for the data cache QObject The Free, Fast and Powerful cross platform Wii Backup File System manager QWBFS::Driver No error Partition not opened Source partition not opened Disc read failed Disc write failed Disc extract failed Disc add failed Disc convert failed Disc rename failed Disc found Disc not found (or not exists) Invalid disc index Invalid disc id Invalid disc Can't drive to drive copy Unknown error None Success Failed QWBFS::Model::DiscDelegate Estimated size: %1 - Origin: %2 QWBFS::Model::DiscModel Id: %1 Title: %1 Size: %1 Origin: %1 Region: %1 State: %1 Error: %1 Image Id Title Size Region Origin Sort by Id Sort by Title Sort by Size Sort by Region SplashScreen Version %1 UIAbout About... Informations License Notice I DO NOT TAKE ANY RESPONSIBILITY FOR ANY DAMAGE TO YOUR WII CONSOLE BECAUSE OF IMPROPER USAGE OF THIS SOFTWARE. 3rd Party Version %1 UIMain Tools File System Reload the mount points Export Clear the list Remove the selected items from the list Process the export list Main ToolBar Covers Covers By Reload Reload the partitions About... Quit... Properties Convert ISO Files Convert WBFS Files Rename Discs in folder Actions Welcome to %1, the cross-platform WBFS Manager. Report bugs <a href="%2">here</a>, discuss <a href="%3">here</a>. I don't know how to list partition for this platform. You will have to set the correct partition path yourself for mounting partitions. Choose ISO files to convert Choose the folder to scan for ISOs/WBFSs files Choose the pattern to apply: %1 %2 %3 Which format do you want to use to export the discs ? ISO Files (*.iso) WBFS Files (*.wbfs) Choose WBFS files to convert %1 = Game Title %1 = Game Id %1 = File Suffix Choose a folder to export the discs WorkerThread Indirect Export to ISO Export to ISO Indirect Export to WBFS Export to WBFS Indirect Import to ISO Import to ISO Indirect Import to WBFS Import to WBFS Indirect Convert to ISO Convert to ISO Indirect Convert to WBFS Convert to WBFS Rename Disc Initializing WBFS disc '%1'... Formating WBFS disc '%1'... pPartition Unknown FS Unknown Vendor/Model pPartitionModel Label Path File System Mount Points Vendor Model File System Id Display Text Size Used Free Last Check ./qwbfsmanager-1.2.1-src/translations/qwbfsmanager-zh_TW.ts0000644000175000017520000010372511544172501023325 0ustar pasnoxpasnox Gauge Usage %1 (%2%) / %3 - Free %4 (%5%) PartitionComboBox Add a partition Enter a partition path Current Partition PartitionWidget Set the current partition Load/Reload the discs from the current partition Format the partition Add a new view Remove the view WBFS View Remove the selected discs Rename the selected disc Show/Hide Import View List CoverFlow Import View Clear the discs Import the discs to the WBFS partition %1 disc(s) on the partition - %2 disc(s) to import. Can't open partition. The partition '%1' will be formatted, all data will be erased permanently, are you sure? Can't format partition. You are about to permanently delete %1 disc(s) on partition '%2', are you sure? One or more discs have failed to be removed. Choose a new name for the disc Can't rename disc id #%1 (%2) to '%3' ProgressDialog Global progression... Details. Time remaining: %1 Cancel requested, the process will stop after the current operation. The thread finished in %1 PropertiesDialog Properties General Application locale Click here to change the application locale View Mode View Icon Type Covers' Cache Path Browse for a folder Use the system temporary directory Disk Size Unlimited MB Proxy Type Login Password Server Port PLEASE NOTE THAT THE PASSWORD IS ENCRYPTED WITH A SHIT METHOD. BE CAREFUL. List Icon Disc Cover No Proxy Socks5 Http Choose a folder for the data cache QObject The Free, Fast and Powerful cross platform Wii Backup File System manager QWBFS::Driver No error Partition not opened Source partition not opened Disc read failed Disc write failed Disc extract failed Disc add failed Disc convert failed Disc rename failed Disc found Disc not found (or not exists) Invalid disc index Invalid disc id Invalid disc Can't drive to drive copy Unknown error None Success Failed QWBFS::Model::DiscDelegate Estimated size: %1 - Origin: %2 QWBFS::Model::DiscModel Id: %1 Title: %1 Size: %1 Origin: %1 Region: %1 State: %1 Error: %1 Image Id Title Size Region Origin Sort by Id Sort by Title Sort by Size Sort by Region SplashScreen Version %1 UIAbout About... Informations License Notice I DO NOT TAKE ANY RESPONSIBILITY FOR ANY DAMAGE TO YOUR WII CONSOLE BECAUSE OF IMPROPER USAGE OF THIS SOFTWARE. 3rd Party Version %1 UIMain Tools File System Reload the mount points Export Clear the list Remove the selected items from the list Process the export list Main ToolBar Covers Covers By Reload Reload the partitions About... Quit... Properties Convert ISO Files Convert WBFS Files Rename Discs in folder Actions Welcome to %1, the cross-platform WBFS Manager. Report bugs <a href="%2">here</a>, discuss <a href="%3">here</a>. I don't know how to list partition for this platform. You will have to set the correct partition path yourself for mounting partitions. Choose ISO files to convert Choose the folder to scan for ISOs/WBFSs files Choose the pattern to apply: %1 %2 %3 Which format do you want to use to export the discs ? ISO Files (*.iso) WBFS Files (*.wbfs) Choose WBFS files to convert %1 = Game Title %1 = Game Id %1 = File Suffix Choose a folder to export the discs WorkerThread Indirect Export to ISO Export to ISO Indirect Export to WBFS Export to WBFS Indirect Import to ISO Import to ISO Indirect Import to WBFS Import to WBFS Indirect Convert to ISO Convert to ISO Indirect Convert to WBFS Convert to WBFS Rename Disc Initializing WBFS disc '%1'... Formating WBFS disc '%1'... pPartition Unknown FS Unknown Vendor/Model pPartitionModel Label Path File System Mount Points Vendor Model File System Id Display Text Size Used Free Last Check ./qwbfsmanager-1.2.1-src/translations/qwbfsmanager-zh_CN.ts0000644000175000017520000010372511544172501023273 0ustar pasnoxpasnox Gauge Usage %1 (%2%) / %3 - Free %4 (%5%) PartitionComboBox Add a partition Enter a partition path Current Partition PartitionWidget Set the current partition Load/Reload the discs from the current partition Format the partition Add a new view Remove the view WBFS View Remove the selected discs Rename the selected disc Show/Hide Import View List CoverFlow Import View Clear the discs Import the discs to the WBFS partition %1 disc(s) on the partition - %2 disc(s) to import. Can't open partition. The partition '%1' will be formatted, all data will be erased permanently, are you sure? Can't format partition. You are about to permanently delete %1 disc(s) on partition '%2', are you sure? One or more discs have failed to be removed. Choose a new name for the disc Can't rename disc id #%1 (%2) to '%3' ProgressDialog Global progression... Details. Time remaining: %1 Cancel requested, the process will stop after the current operation. The thread finished in %1 PropertiesDialog Properties General Application locale Click here to change the application locale View Mode View Icon Type Covers' Cache Path Browse for a folder Use the system temporary directory Disk Size Unlimited MB Proxy Type Login Password Server Port PLEASE NOTE THAT THE PASSWORD IS ENCRYPTED WITH A SHIT METHOD. BE CAREFUL. List Icon Disc Cover No Proxy Socks5 Http Choose a folder for the data cache QObject The Free, Fast and Powerful cross platform Wii Backup File System manager QWBFS::Driver No error Partition not opened Source partition not opened Disc read failed Disc write failed Disc extract failed Disc add failed Disc convert failed Disc rename failed Disc found Disc not found (or not exists) Invalid disc index Invalid disc id Invalid disc Can't drive to drive copy Unknown error None Success Failed QWBFS::Model::DiscDelegate Estimated size: %1 - Origin: %2 QWBFS::Model::DiscModel Id: %1 Title: %1 Size: %1 Origin: %1 Region: %1 State: %1 Error: %1 Image Id Title Size Region Origin Sort by Id Sort by Title Sort by Size Sort by Region SplashScreen Version %1 UIAbout About... Informations License Notice I DO NOT TAKE ANY RESPONSIBILITY FOR ANY DAMAGE TO YOUR WII CONSOLE BECAUSE OF IMPROPER USAGE OF THIS SOFTWARE. 3rd Party Version %1 UIMain Tools File System Reload the mount points Export Clear the list Remove the selected items from the list Process the export list Main ToolBar Covers Covers By Reload Reload the partitions About... Quit... Properties Convert ISO Files Convert WBFS Files Rename Discs in folder Actions Welcome to %1, the cross-platform WBFS Manager. Report bugs <a href="%2">here</a>, discuss <a href="%3">here</a>. I don't know how to list partition for this platform. You will have to set the correct partition path yourself for mounting partitions. Choose ISO files to convert Choose the folder to scan for ISOs/WBFSs files Choose the pattern to apply: %1 %2 %3 Which format do you want to use to export the discs ? ISO Files (*.iso) WBFS Files (*.wbfs) Choose WBFS files to convert %1 = Game Title %1 = Game Id %1 = File Suffix Choose a folder to export the discs WorkerThread Indirect Export to ISO Export to ISO Indirect Export to WBFS Export to WBFS Indirect Import to ISO Import to ISO Indirect Import to WBFS Import to WBFS Indirect Convert to ISO Convert to ISO Indirect Convert to WBFS Convert to WBFS Rename Disc Initializing WBFS disc '%1'... Formating WBFS disc '%1'... pPartition Unknown FS Unknown Vendor/Model pPartitionModel Label Path File System Mount Points Vendor Model File System Id Display Text Size Used Free Last Check ./qwbfsmanager-1.2.1-src/translations/qwbfsmanager-ru_RU.qm0000644000175000017520000000002011410740625023275 0ustar pasnoxpasnox ,Ye^5D̓. %*Lv/e"KNV)2^y=h"i>]i-p)Yu q^#|-35t3TeP1^KbA\~./~>/?QNy1L;@sV9&c$9Eld$4(֣֣2=6c4x<= *~s'O:*3PQN> e*(.!%q^3 ': 5 e" lu~' lu~*f k2 }4G !z  6 q+S t + & )T i5  ' cx s-M $? g NH)z ~  (&_ G> U B f'_8 { ;  > e%0 8K >!- yU  ~'P ƙ /# s- 9c+ u   .) < ȉq#0~D7<# 2x'P^9c%:pjk .`j ӟ~iB.TUtilisation %1 (%2%) / %3 - Libre %4 (%5%)#Usage %1 (%2%) / %3 - Free %4 (%5%)Gauge*Ajouter une partitionAdd a partitionPartitionComboBox$Partition CouranteCurrent PartitionPartitionComboBox@Entrer le chemin de la partitionEnter a partition pathPartitionComboBoxp%1 disque(s) sur la partition - %2 disque(s) importer.3%1 disc(s) on the partition - %2 disc(s) to import.PartitionWidget0Ajouter une nouvelle vueAdd a new viewPartitionWidgetHImpossible de formater la partition.Can't format partition.PartitionWidgetBImpossible d'ouvrir la partition.Can't open partition.PartitionWidgetbImpossible de renommer le disque #%1 (%2) en '%3'%Can't rename disc id #%1 (%2) to '%3'PartitionWidgetPChoisissez le nouveau nom pour le disqueChoose a new name for the discPartitionWidget"Vider les disquesClear the discsPartitionWidget CoverFlowPartitionWidget*Formater la partitionFormat the partitionPartitionWidget"Vue d'Importation Import ViewPartitionWidgetVImporter les disques dans la partition WBFS&Import the discs to the WBFS partitionPartitionWidget ListeListPartitionWidgettCharger/ReCharger les disques depuis la partition courante0Load/Reload the discs from the current partitionPartitionWidget`Un ou plusieurs disques n'ont pu tre supprims.,One or more discs have failed to be removed.PartitionWidget@Enlever les disques slectionnsRemove the selected discsPartitionWidgetEnlever la vueRemove the viewPartitionWidget<Renommer le disque slectionnRename the selected discPartitionWidget:Dfinir la partition couranteSet the current partitionPartitionWidgetHAfficher/Cacher la Vue d'ImportationShow/Hide Import ViewPartitionWidgetLa partition '%1' va tre formate, toutes les donnes vont tre supprimes de faon permanente, tes-vous sr ?XThe partition '%1' will be formatted, all data will be erased permanently, are you sure?PartitionWidgetVue WBFS WBFS ViewPartitionWidgetVous tes sur le point de supprimer dfinitivement %1 disque(s) sur la partition '%2', tes-vous sr ?OYou are about to permanently delete %1 disc(s) on partition '%2', are you sure?PartitionWidgetAnnulation demande, le processus s'arrtera aprs la tche courante.DCancel requested, the process will stop after the current operation.ProgressDialogDtails.Details.ProgressDialog,Progression globale...Global progression...ProgressDialog:La tche s'est termine en %1The thread finished in %1ProgressDialog$Temps restant : %1Time remaining: %1ProgressDialog Mo MBPropertiesDialog.Langue de l'applicationApplication localePropertiesDialog$Choisir un dossierBrowse for a folderPropertiesDialog^Choisissez un dossier pour les donnes du cache"Choose a folder for the data cachePropertiesDialogfCliquez ici pour changer la langue de l'application+Click here to change the application localePropertiesDialogCouvertureCoverPropertiesDialog*Cache des couvertures Covers' CachePropertiesDialog DisqueDiscPropertiesDialog(Taille sur le disque Disk SizePropertiesDialogGnraleGeneralPropertiesDialogHttpPropertiesDialog IcneIconPropertiesDialog ListeListPropertiesDialog"Nom d'utilisateurLoginPropertiesDialogPas de ProxyNo ProxyPropertiesDialogVEUILLEZ NOTER QUE LE MOT DE PASSE EST CRYPT AVEC UNE METHODE BASIQUE. SOYEZ PRUDENT.JPLEASE NOTE THAT THE PASSWORD IS ENCRYPTED WITH A SHIT METHOD. BE CAREFUL.PropertiesDialogMot de passePasswordPropertiesDialogDossierPathPropertiesDialogPortPropertiesDialogPrfrences PropertiesPropertiesDialogProxyPropertiesDialogServeurServerPropertiesDialogSocks5PropertiesDialogTypePropertiesDialogIllimit UnlimitedPropertiesDialogRUtiliser le dossier temporaire du systme"Use the system temporary directoryPropertiesDialog6Mode d'affichage des icnesView Icon TypePropertiesDialog Mode d'affichage View ModePropertiesDialogLe gestionnaire de Systme de Fichier de Sauvegarde Wii multi-platforme Libre, Rapide et PuissantIThe Free, Fast and Powerful cross platform Wii Backup File System managerQObjectNImpossible de copier de disque disqueCan't drive to drive copy QWBFS::Driver4Ajout du disque impossibleDisc add failed QWBFS::Driver>Conversion du disque impossibleDisc convert failed QWBFS::Driver>Extraction du disque impossibleDisc extract failed QWBFS::DriverDisque prsent Disc found QWBFS::DriverHDisque introuvable (ou n'existe pas)Disc not found (or not exists) QWBFS::Driver8Impossible de lire le disqueDisc read failed QWBFS::Driver<Renommage du disque impossibleDisc rename failed QWBFS::DriverBImpossible d'crire sur le disqueDisc write failed QWBFS::Driver ErreurFailed QWBFS::DriverDisque invalide Invalid disc QWBFS::Driver*Id de disque invalideInvalid disc id QWBFS::Driver0Index de disque invalideInvalid disc index QWBFS::DriverAucune erreurNo error QWBFS::Driver AucunNone QWBFS::Driver<La partition n'est pas ouvertePartition not opened QWBFS::DriverJLa partition source n'est pas ouverteSource partition not opened QWBFS::Driver SuccsSuccess QWBFS::DriverErreur inconnue Unknown error QWBFS::Driver@Taille estime: %1 - Origine: %2Estimated size: %1 - Origin: %2QWBFS::Model::DiscDelegateErreur: %1 Error: %1QWBFS::Model::DiscModelIdIdQWBFS::Model::DiscModelId: %1QWBFS::Model::DiscModel ImageImageQWBFS::Model::DiscModelOrigineOriginQWBFS::Model::DiscModelOrigine: %1 Origin: %1QWBFS::Model::DiscModel RgionRegionQWBFS::Model::DiscModelRgion: %1 Region: %1QWBFS::Model::DiscModel TailleSizeQWBFS::Model::DiscModelTaille: %1Size: %1QWBFS::Model::DiscModelTrier par Id Sort by IdQWBFS::Model::DiscModel Trier par RgionSort by RegionQWBFS::Model::DiscModel Trier par Taille Sort by SizeQWBFS::Model::DiscModelTrier par Titre Sort by TitleQWBFS::Model::DiscModeltat: %1 State: %1QWBFS::Model::DiscModel TitreTitleQWBFS::Model::DiscModelTitre: %1 Title: %1QWBFS::Model::DiscModel Version %1 SplashScreen Ressources Tiers 3rd PartyUIAbout Propos...About...UIAboutJE NE PREND AUCUNE RESPONSABILIT POUR LES DOMMAGES CAUSS VOTRE CONSOLE WII QUANT L'UTILISATION INCORRECTE DE CE LOGICIEL.oI DO NOT TAKE ANY RESPONSIBILITY FOR ANY DAMAGE TO YOUR WII CONSOLE BECAUSE OF IMPROPER USAGE OF THIS SOFTWARE.UIAbout InformationsUIAboutLicenceLicenseUIAboutNoticeUIAbout Version %1UIAbout2%1 = Extension du Fichier%1 = File SuffixUIMain%1 = ID du Jeu %1 = Game IdUIMain"%1 = Titre du Jeu%1 = Game TitleUIMain Propos...About...UIMainActionsActionsUIMainNChoisissez les fichiers ISO convertirChoose ISO files to convertUIMainPChoisissez les fichiers WBFS convertirChoose WBFS files to convertUIMain^Choisissez un dossier pour exporter les disques#Choose a folder to export the discsUIMainChoisissez le dossier analyser pour la dcouverte de fichier ISO/WBFS.Choose the folder to scan for ISOs/WBFSs filesUIMainVChoisissez le modle appliquer: %1 %2 %3 &Choose the pattern to apply: %1 %2 %3 UIMainVider la listeClear the listUIMain4Convertir des fichiers ISOConvert ISO FilesUIMain6Convertir des fichiers WBFSConvert WBFS FilesUIMainCouverturesCoversUIMainCouvertures Par Covers ByUIMainExporterExportUIMain$Systme de Fichier File SystemUIMainFJe ne sais pas comment charger la liste des partitions pour cette plateforme. Vous devrez renseigner vous mme le chemin des partitions pour les points de montage.I don't know how to list partition for this platform. You will have to set the correct partition path yourself for mounting partitions.UIMain(Fichiers ISO (*.iso)ISO Files (*.iso)UIMain2Barre d'outils principale Main ToolBarUIMain<Traiter la liste d'exportationProcess the export listUIMainPrfrences PropertiesUIMainQuitter...Quit...UIMainRechargerReloadUIMain>Recharger les points de montageReload the mount pointsUIMainBRecharger la liste des partitionsReload the partitionsUIMainTEnlever les items slctionns de la liste'Remove the selected items from the listUIMainBRenommer les disques d'un dossierRename Discs in folderUIMain OutilsToolsUIMain,Fichiers WBFS (*.wbfs)WBFS Files (*.wbfs)UIMainBienvenue dans %1, le Gestionnaire WBFS multi-platforme. Reportez les bugs <a href="%2">ici</a>, discutez <a href="%3">ici</a>.qWelcome to %1, the cross-platform WBFS Manager. Report bugs here, discuss here.UIMainxQuel format voulez vous utiliser pour exporter les disques ?5Which format do you want to use to export the discs ?UIMain&Conversion vers ISOConvert to ISO WorkerThread(Conversion vers WBFSConvert to WBFS WorkerThread Exportation vers Export to ISO WorkerThread*Exportation vers WBFSExport to WBFS WorkerThread@Formatage du disque WBFS '%1'...Formating WBFS disc '%1'... WorkerThread(Importation vers ISO Import to ISO WorkerThread*Importation vers WBFSImport to WBFS WorkerThread:Conversion Indirecte vers ISOIndirect Convert to ISO WorkerThread<Conversion Indirecte vers WBFSIndirect Convert to WBFS WorkerThread<Exportation Indirecte vers ISOIndirect Export to ISO WorkerThread>Exportation Indirecte vers WBFSIndirect Export to WBFS WorkerThread<Importation Indirecte vers ISOIndirect Import to ISO WorkerThread>Importation Indirecte vers WBFSIndirect Import to WBFS WorkerThreadJInitialisation du disque WBFS '%1'...Initializing WBFS disc '%1'... WorkerThread&Renommage du Disque Rename Disc WorkerThreadSF Inconnu Unknown FS pPartition2Fabriquant/Modle InconnuUnknown Vendor/Model pPartition"Texte d'affichage Display TextpPartitionModel$Systme de Fichier File SystempPartitionModel0Id du Systme de FichierFile System IdpPartitionModel LibreFreepPartitionModeltiquetteLabelpPartitionModel*Dernire Vrification Last CheckpPartitionModel ModleModelpPartitionModel"Points de Montage Mount PointspPartitionModel CheminPathpPartitionModel TailleSizepPartitionModelUtilisUsedpPartitionModelFabriquantVendorpPartitionModel./qwbfsmanager-1.2.1-src/translations/qwbfsmanager-pt_PT.ts0000644000175000017520000010372511544172501023320 0ustar pasnoxpasnox Gauge Usage %1 (%2%) / %3 - Free %4 (%5%) PartitionComboBox Add a partition Enter a partition path Current Partition PartitionWidget Set the current partition Load/Reload the discs from the current partition Format the partition Add a new view Remove the view WBFS View Remove the selected discs Rename the selected disc Show/Hide Import View List CoverFlow Import View Clear the discs Import the discs to the WBFS partition %1 disc(s) on the partition - %2 disc(s) to import. Can't open partition. The partition '%1' will be formatted, all data will be erased permanently, are you sure? Can't format partition. You are about to permanently delete %1 disc(s) on partition '%2', are you sure? One or more discs have failed to be removed. Choose a new name for the disc Can't rename disc id #%1 (%2) to '%3' ProgressDialog Global progression... Details. Time remaining: %1 Cancel requested, the process will stop after the current operation. The thread finished in %1 PropertiesDialog Properties General Application locale Click here to change the application locale View Mode View Icon Type Covers' Cache Path Browse for a folder Use the system temporary directory Disk Size Unlimited MB Proxy Type Login Password Server Port PLEASE NOTE THAT THE PASSWORD IS ENCRYPTED WITH A SHIT METHOD. BE CAREFUL. List Icon Disc Cover No Proxy Socks5 Http Choose a folder for the data cache QObject The Free, Fast and Powerful cross platform Wii Backup File System manager QWBFS::Driver No error Partition not opened Source partition not opened Disc read failed Disc write failed Disc extract failed Disc add failed Disc convert failed Disc rename failed Disc found Disc not found (or not exists) Invalid disc index Invalid disc id Invalid disc Can't drive to drive copy Unknown error None Success Failed QWBFS::Model::DiscDelegate Estimated size: %1 - Origin: %2 QWBFS::Model::DiscModel Id: %1 Title: %1 Size: %1 Origin: %1 Region: %1 State: %1 Error: %1 Image Id Title Size Region Origin Sort by Id Sort by Title Sort by Size Sort by Region SplashScreen Version %1 UIAbout About... Informations License Notice I DO NOT TAKE ANY RESPONSIBILITY FOR ANY DAMAGE TO YOUR WII CONSOLE BECAUSE OF IMPROPER USAGE OF THIS SOFTWARE. 3rd Party Version %1 UIMain Tools File System Reload the mount points Export Clear the list Remove the selected items from the list Process the export list Main ToolBar Covers Covers By Reload Reload the partitions About... Quit... Properties Convert ISO Files Convert WBFS Files Rename Discs in folder Actions Welcome to %1, the cross-platform WBFS Manager. Report bugs <a href="%2">here</a>, discuss <a href="%3">here</a>. I don't know how to list partition for this platform. You will have to set the correct partition path yourself for mounting partitions. Choose ISO files to convert Choose the folder to scan for ISOs/WBFSs files Choose the pattern to apply: %1 %2 %3 Which format do you want to use to export the discs ? ISO Files (*.iso) WBFS Files (*.wbfs) Choose WBFS files to convert %1 = Game Title %1 = Game Id %1 = File Suffix Choose a folder to export the discs WorkerThread Indirect Export to ISO Export to ISO Indirect Export to WBFS Export to WBFS Indirect Import to ISO Import to ISO Indirect Import to WBFS Import to WBFS Indirect Convert to ISO Convert to ISO Indirect Convert to WBFS Convert to WBFS Rename Disc Initializing WBFS disc '%1'... Formating WBFS disc '%1'... pPartition Unknown FS Unknown Vendor/Model pPartitionModel Label Path File System Mount Points Vendor Model File System Id Display Text Size Used Free Last Check ./qwbfsmanager-1.2.1-src/translations/qwbfsmanager-sl_SI.ts0000644000175000017520000010372511544172501023303 0ustar pasnoxpasnox Gauge Usage %1 (%2%) / %3 - Free %4 (%5%) PartitionComboBox Add a partition Enter a partition path Current Partition PartitionWidget Set the current partition Load/Reload the discs from the current partition Format the partition Add a new view Remove the view WBFS View Remove the selected discs Rename the selected disc Show/Hide Import View List CoverFlow Import View Clear the discs Import the discs to the WBFS partition %1 disc(s) on the partition - %2 disc(s) to import. Can't open partition. The partition '%1' will be formatted, all data will be erased permanently, are you sure? Can't format partition. You are about to permanently delete %1 disc(s) on partition '%2', are you sure? One or more discs have failed to be removed. Choose a new name for the disc Can't rename disc id #%1 (%2) to '%3' ProgressDialog Global progression... Details. Time remaining: %1 Cancel requested, the process will stop after the current operation. The thread finished in %1 PropertiesDialog Properties General Application locale Click here to change the application locale View Mode View Icon Type Covers' Cache Path Browse for a folder Use the system temporary directory Disk Size Unlimited MB Proxy Type Login Password Server Port PLEASE NOTE THAT THE PASSWORD IS ENCRYPTED WITH A SHIT METHOD. BE CAREFUL. List Icon Disc Cover No Proxy Socks5 Http Choose a folder for the data cache QObject The Free, Fast and Powerful cross platform Wii Backup File System manager QWBFS::Driver No error Partition not opened Source partition not opened Disc read failed Disc write failed Disc extract failed Disc add failed Disc convert failed Disc rename failed Disc found Disc not found (or not exists) Invalid disc index Invalid disc id Invalid disc Can't drive to drive copy Unknown error None Success Failed QWBFS::Model::DiscDelegate Estimated size: %1 - Origin: %2 QWBFS::Model::DiscModel Id: %1 Title: %1 Size: %1 Origin: %1 Region: %1 State: %1 Error: %1 Image Id Title Size Region Origin Sort by Id Sort by Title Sort by Size Sort by Region SplashScreen Version %1 UIAbout About... Informations License Notice I DO NOT TAKE ANY RESPONSIBILITY FOR ANY DAMAGE TO YOUR WII CONSOLE BECAUSE OF IMPROPER USAGE OF THIS SOFTWARE. 3rd Party Version %1 UIMain Tools File System Reload the mount points Export Clear the list Remove the selected items from the list Process the export list Main ToolBar Covers Covers By Reload Reload the partitions About... Quit... Properties Convert ISO Files Convert WBFS Files Rename Discs in folder Actions Welcome to %1, the cross-platform WBFS Manager. Report bugs <a href="%2">here</a>, discuss <a href="%3">here</a>. I don't know how to list partition for this platform. You will have to set the correct partition path yourself for mounting partitions. Choose ISO files to convert Choose the folder to scan for ISOs/WBFSs files Choose the pattern to apply: %1 %2 %3 Which format do you want to use to export the discs ? ISO Files (*.iso) WBFS Files (*.wbfs) Choose WBFS files to convert %1 = Game Title %1 = Game Id %1 = File Suffix Choose a folder to export the discs WorkerThread Indirect Export to ISO Export to ISO Indirect Export to WBFS Export to WBFS Indirect Import to ISO Import to ISO Indirect Import to WBFS Import to WBFS Indirect Convert to ISO Convert to ISO Indirect Convert to WBFS Convert to WBFS Rename Disc Initializing WBFS disc '%1'... Formating WBFS disc '%1'... pPartition Unknown FS Unknown Vendor/Model pPartitionModel Label Path File System Mount Points Vendor Model File System Id Display Text Size Used Free Last Check ./qwbfsmanager-1.2.1-src/translations/qwbfsmanager-ca_ES.qm0000644000175000017520000004015611543645433023241 0ustar pasnoxpasnox((,m!#q^0l '7 5~ e lu~$ lu~( k }4T %  ? q)m t ) $Q 'v i2 t cx_ s+  ` NH' ~ ($ G>m U k f'_5  8~ e" 8h > yU  ~$ s+ 9c x  , < ȉq ~D48 2xP^6c%7VjkC.j /i;RUtilitzat %1 (%2%) / %3 - Lliure %4 (%5%)#Usage %1 (%2%) / %3 - Free %4 (%5%)Gauge`%1 joc(s) de la partici - %2 joc(s) a importar.3%1 disc(s) on the partition - %2 disc(s) to import.PartitionWidget Obrir nou panellAdd a new viewPartitionWidget@Impossible formatar la partici.Can't format partition.PartitionWidget:Impossible obrir la partici.Can't open partition.PartitionWidget\Impossible renombrar el joc id #%1 (%2) a '%3'%Can't rename disc id #%1 (%2) to '%3'PartitionWidget>Introduu un nou nom per al jocChoose a new name for the discPartitionWidgetFEliminar tots els jocs de la llistaClear the discsPartitionWidget"Formatar particiFormat the partitionPartitionWidget*Finestra d'importaci Import ViewPartitionWidget^Iniciar importaci dels jocs a la partici WBFS&Import the discs to the WBFS partitionPartitionWidget LlistaListPartitionWidgetfCarregar/Actualitzar jocs des de la partici actual0Load/Reload the discs from the current partitionPartitionWidgetDUn o ms jocs han estat eliminats.,One or more discs have failed to be removed.PartitionWidget6Eliminar el joc seleccionatRemove the selected discsPartitionWidget(Tancar aquest panellRemove the viewPartitionWidget8Renombrar el joc seleccionatRename the selected discPartitionWidget2Definir particions actualSet the current partitionPartitionWidgetDMostra/Amaga finestra d'importaciShow/Hide Import ViewPartitionWidgetLa partici '%1'ser formatada, totes les dades seran esborrades de forma permanent. Est segur?XThe partition '%1' will be formatted, all data will be erased permanently, are you sure?PartitionWidget:Dades de la WBFS seleccionada WBFS ViewPartitionWidgetEsts a punt d'eliminar permanentment%1 joc(s) '%2', de la partici actual. Est segur?OYou are about to permanently delete %1 disc(s) on partition '%2', are you sure?PartitionWidgetCancelaci demanada, el procs s'aturar desprs de la tasca actual.DCancel requested, the process will stop after the current operation.ProgressDialogDetalls.Details.ProgressDialog&Pogresin global...Global progression...ProgressDialog,El procs acabar a %1The thread finished in %1ProgressDialog"Temps restant: %1Time remaining: %1ProgressDialog MB MBPropertiesDialog*Idioma de l'aplicaciApplication localePropertiesDialog"Trieu una carpetaBrowse for a folderPropertiesDialog^Trieu una carpeta per a la memria cau de dades"Choose a folder for the data cachePropertiesDialog\Premi aqu per canviar l'idioma de l'aplicaci+Click here to change the application localePropertiesDialogCartulaCoverPropertiesDialog0Memria cau de Cartules Covers' CachePropertiesDialogJocDiscPropertiesDialogMida del disc Disk SizePropertiesDialogGeneralGeneralPropertiesDialogHttpHttpPropertiesDialog IconaIconPropertiesDialog LlistaListPropertiesDialog UsuariLoginPropertiesDialogNo usar ProxyNo ProxyPropertiesDialogMOLT IMPORTANT: LA CONTRASENYA S'ENCRIPTA AMB UN MTODE MOLT BSIC. TINGUI CURA.JPLEASE NOTE THAT THE PASSWORD IS ENCRYPTED WITH A SHIT METHOD. BE CAREFUL.PropertiesDialogContrasenyaPasswordPropertiesDialogRutaPathPropertiesDialogPortPortPropertiesDialogPropiedades PropertiesPropertiesDialog ProxyProxyPropertiesDialogServidorServerPropertiesDialog Socks5Socks5PropertiesDialog TipusTypePropertiesDialogIl limitat UnlimitedPropertiesDialogPUtilizar la carpeta temporal del sistema"Use the system temporary directoryPropertiesDialog(Tipus de vista IconaView Icon TypePropertiesDialog*Mode de visualitzaci View ModePropertiesDialogAdministrador gratut rpid i potent, multi-plataforma de cpia de seguretat del sistema d'arxius de la WiiIThe Free, Fast and Powerful cross platform Wii Backup File System managerQObjectJNo es pot copiar d'un disc a un altreCan't drive to drive copy QWBFS::Driver.Error en afegir el discDisc add failed QWBFS::Driver<Error en la conversi del discDisc convert failed QWBFS::Driver:Error en l'extracci del discDisc extract failed QWBFS::DriverDisc present Disc found QWBFS::DriverFEl disc no es troba (o no existeix)Disc not found (or not exists) QWBFS::Driver0No es pot llegir el discDisc read failed QWBFS::Driver2Error en renombrar el JocDisc rename failed QWBFS::Driver4No es pot escriure al discDisc write failed QWBFS::Driver ErrorFailed QWBFS::DriverDisc no vlid Invalid disc QWBFS::Driver(Id del disc no vlidInvalid disc id QWBFS::Driver,ndex de disc no vlidInvalid disc index QWBFS::DriverSense errorsNo error QWBFS::DriverNoNone QWBFS::Driver8Impossible obrir la particiPartition not opened QWBFS::Driver*La partici no s'obreSource partition not opened QWBFS::Driver SucesoSuccess QWBFS::Driver Error desconegut Unknown error QWBFS::Driver:Mida estimat: %1 - Origen: %2Estimated size: %1 - Origin: %2QWBFS::Model::DiscDelegateError: %1 Error: %1QWBFS::Model::DiscModelIdIdQWBFS::Model::DiscModel Id: %1Id: %1QWBFS::Model::DiscModel ImatgeImageQWBFS::Model::DiscModel OrigenOriginQWBFS::Model::DiscModelOrigen: %1 Origin: %1QWBFS::Model::DiscModel RegiRegionQWBFS::Model::DiscModelRegi: %1 Region: %1QWBFS::Model::DiscModelMidaSizeQWBFS::Model::DiscModelMida: %1Size: %1QWBFS::Model::DiscModelOrdenar per Id Sort by IdQWBFS::Model::DiscModel"Ordenar per RegiSort by RegionQWBFS::Model::DiscModel Ordenar per Mida Sort by SizeQWBFS::Model::DiscModel"Ordenar per Ttol Sort by TitleQWBFS::Model::DiscModelPas: %1 State: %1QWBFS::Model::DiscModel TtolTitleQWBFS::Model::DiscModelTtol: %1 Title: %1QWBFS::Model::DiscModelVersi %1 Version %1 SplashScreenSobre...About...UIAboutMOLT IMPORTANT: JO NO EM FAIG RESPONSABLE DE QUALSEVOL DANY QUE PUGUI PRODUIR EN EL SEU CONSOLA Wii SOBRE LA MAL S QUE VOST PUGUI DONAR A AQUEST SOFTWARE. VOST SER SEMPRE L'NIC RESPONSABLE.oI DO NOT TAKE ANY RESPONSIBILITY FOR ANY DAMAGE TO YOUR WII CONSOLE BECAUSE OF IMPROPER USAGE OF THIS SOFTWARE.UIAboutInformaci InformationsUIAboutLlicnciaLicenseUIAboutImportantNoticeUIAboutVersi %1 Version %1UIAbout*%1 = Sufix del fitxer%1 = File SuffixUIMain%1 = ID de Joc %1 = Game IdUIMain$%1 = Ttol del Joc%1 = Game TitleUIMainSobre...About...UIMainAccionsActionsUIMain@Trieu un arxiu ISO per convertirChoose ISO files to convertUIMainBTrieu un arxiu WBFS per convertirChoose WBFS files to convertUIMainFTrieu una carpeta per exportar jocs#Choose a folder to export the discsUIMainhSeleccioneu la carpeta per cercar fitxers ISOs/WBFSs.Choose the folder to scan for ISOs/WBFSs filesUIMainPTrieu la manera a ser aplicat: %1 %2 %3 &Choose the pattern to apply: %1 %2 %3 UIMainBTreure tots els jocs de la llistaClear the listUIMain*Converteix arxius ISOConvert ISO FilesUIMain&Convert arxius WBFSConvert WBFS FilesUIMainCartulesCoversUIMainExportarExportUIMain Sistema d'arxius File SystemUIMainBNo es pot optener una llista de particions per a aquesta plataforma. Vost haur d'establir la ruta de la partici correcta aqu, per al muntatge de la partici.I don't know how to list partition for this platform. You will have to set the correct partition path yourself for mounting partitions.UIMain"Arxiu ISO (*.iso)ISO Files (*.iso)UIMainBarra d'eines Main ToolBarUIMain$Iniciar exportaciProcess the export listUIMainPropietats PropertiesUIMainSortir...Quit...UIMainRecarregarReloadUIMain:Actualitzar punts de muntatgeReload the mount pointsUIMain*Recarregar particionsReload the partitionsUIMainLTreure el joc seleccionat de la llista'Remove the selected items from the listUIMain:Renombrar el Joc a la carpetaRename Discs in folderUIMainPanell lateralToolsUIMain(Arxius WBFS (*.wbfs)WBFS Files (*.wbfs)UIMainBenvingut %1, Gestor WBFS (multi-plataforma). Comuniqui els bugs <a href="%2">aqu</a>, discussi <a href="%3">aqu</a>.qWelcome to %1, the cross-platform WBFS Manager. Report bugs here, discuss here.UIMainjQuin format es vol utilitzar per exportar els discs?5Which format do you want to use to export the discs ?UIMainCoversin a ISOConvert to ISO WorkerThread Coversin a WBFSConvert to WBFS WorkerThread Exportaci a ISO Export to ISO WorkerThread"Exportaci a WBFSExport to WBFS WorkerThread4Formatar disc WBFS '%1'...Formating WBFS disc '%1'... WorkerThread Importaci a ISO Import to ISO WorkerThread"Importaci a WBFSImport to WBFS WorkerThread2Coversin indirecta a ISOIndirect Convert to ISO WorkerThread4Coversin indirecta a WBFSIndirect Convert to WBFS WorkerThread4Exportaci indirecta a ISOIndirect Export to ISO WorkerThread6Exportaci indirecta a WBFSIndirect Export to WBFS WorkerThread4Importaci indirecta a ISOIndirect Import to ISO WorkerThread6Importaci indirecta a WBFSIndirect Import to WBFS WorkerThread>Inicialitzar disc WBFS '%1'...Initializing WBFS disc '%1'... WorkerThreadRenombrar Joc Rename Disc WorkerThread Sistema d'arxius File SystempPartitionModelRutaPathpPartitionModelMidaSizepPartitionModelA ./qwbfsmanager-1.2.1-src/translations/qwbfsmanager-es_ES.ts0000644000175000017520000010773111544372164023300 0ustar pasnoxpasnox Gauge Usage %1 (%2%) / %3 - Free %4 (%5%) Utilizado %1 (%2%) / %3 - Libre %4 (%5%) PartitionComboBox Add a partition Añadir una partición Enter a partition path Indique la ruta de la partición Current Partition Partición actual PartitionWidget Set the current partition Definir partición actual Load/Reload the discs from the current partition Cargar/Actualizar juegos desde la partición actual Format the partition Formatear partición Add a new view Abrir nuevo panel Remove the view Cerrar este panel WBFS View Datos de la WBFS seleccionada Remove the selected discs Eliminar el juego seleccionado Rename the selected disc Renombrar el juego seleccionado Show/Hide Import View Mostrar/Ocultar ventana de importación List Lista CoverFlow Carátulas Import View Ventana de importación Clear the discs Eliminar todos los juegos de la lista Import the discs to the WBFS partition Iniciar importación de los juegos a la partición WBFS %1 disc(s) on the partition - %2 disc(s) to import. %1 juego(s) de la partición - %2 juego(s) a importar. Can't open partition. Imposible abrir la partición. The partition '%1' will be formatted, all data will be erased permanently, are you sure? La partición '%1' será formateada, todos los datos serán borrados de forma permanente, ¿está seguro? Can't format partition. Imposible formatear la partición. You are about to permanently delete %1 disc(s) on partition '%2', are you sure? Estás a punto de eliminar permanentemente %1 juego(s) '%2', de la partición actual, ¿está seguro? One or more discs have failed to be removed. Uno o más juegos han sido eliminados. Choose a new name for the disc Introduzca un nuevo nombre para el juego Can't rename disc id #%1 (%2) to '%3' Imposible renombrar el juego #%1 (%2) a '%3' ProgressDialog Global progression... Pogresión global... Details. Detalles. Time remaining: %1 Tiempo restante: %1 Cancel requested, the process will stop after the current operation. Cancelación solicitada, el proceso se detendrá después de la tarea actual. The thread finished in %1 El proceso terminará en %1 PropertiesDialog Properties Propiedades General General Application locale Idioma de la aplicación Click here to change the application locale Pulse aquí para cambiar el idioma de la aplicación View Mode Modo de visualización View Icon Type Tipo de vista Icono Covers' Cache Caché de Carátulas Path Ruta Browse for a folder Elija una carpeta Use the system temporary directory Utilizar la carpeta temporal del sistema Disk Size Tamaño del disco Unlimited Ilimitado MB MB Proxy Proxy Type Tipo Login Usuario Password Contraseña Server Servidor Port Puerto PLEASE NOTE THAT THE PASSWORD IS ENCRYPTED WITH A SHIT METHOD. BE CAREFUL. MUY IMPORTANTE: LA CONTRASEÑA SE ENCRIPTA CON UN MÉTODO MUY BÁSICO. TENGA CUIDADO. List Lista Icon Icono Disc Juego Cover Carátula No Proxy No usar Proxy Socks5 Socks5 Http Http Choose a folder for the data cache Elija una carpeta para la caché de datos QObject B B KB KB MB MB GB GB TB TB PB PB Too big Demasiado grande The Free, Fast and Powerful cross platform Wii Backup File System manager Administrador gratuito rápido y potente, multi-plataforma de copia de seguridad del sistema de archivos de la Wii QWBFS::Driver No error Sin errores Partition not opened Imposible abrir la partición Source partition not opened La partición no se abre Disc read failed No se puede leer el disco Disc write failed No se puede escribir en el disco Disc extract failed Error en la extracción del disco Disc add failed Error al añadir el disco Disc convert failed Error en la conversión del disco Disc rename failed Error al renombrar el Juego Disc found Disco presente Disc not found (or not exists) El disco no se encuentra (o no existe) Invalid disc index Índice de disco no válido Invalid disc id Id del disco no válido Invalid disc Disco no válido Can't drive to drive copy No se puede copiar de un disco a otro Unknown error Error desconocido None No Success Suceso Failed Error QWBFS::Model::DiscDelegate Estimated size: %1 - Origin: %2 Tamaño estimado: %1 - Origen: %2 QWBFS::Model::DiscModel Id: %1 Id: %1 Title: %1 Título: %1 Size: %1 Tamaño: %1 Origin: %1 Origen: %1 Region: %1 Región: %1 State: %1 País: %1 Error: %1 Error: %1 Image Imagen Id Id Title Título Size Tamaño Region Región Origin Origen Sort by Id Ordenar por Id Sort by Title Ordenar por Título Sort by Size Ordenar por Tamaño Sort by Region Ordenar por Región SplashScreen Version %1 Versión %1 UIAbout About... Acerca de... Informations Información License Licencia Notice Importante I DO NOT TAKE ANY RESPONSIBILITY FOR ANY DAMAGE TO YOUR WII CONSOLE BECAUSE OF IMPROPER USAGE OF THIS SOFTWARE. MUY IMPORTANTE: YO NO ME HAGO RESPONSABLE DE CUALQUIER DAÑO QUE SE PUEDA PRODUCIR EN SU CONSOLA Wii EN CUANTO A LA MAL USO QUE USTED PUEDA DAR A ESTE SOFTWARE. USTE SERÁ SIEMPRE EL ÚNICO RESPONSABLE. 3rd Party 3rd Party Version %1 Versión %1 UIMain Tools Panel lateral File System Sistema de archivos Reload the mount points Actualizar puntos de montaje Export Exportar Clear the list Quitar todos los juegos de la lista Remove the selected items from the list Quitar el juego seleccionado de la lista Process the export list Iniciar exportación Main ToolBar Barra de Herramientas Covers Carátulas Covers By Carátulas Reload Recargar Reload the partitions Recargar particiones About... Acerca de... Quit... Salir... Properties Propiedades Convert ISO Files Convertir archivos ISO Convert WBFS Files Convertir archivos WBFS Rename Discs in folder Renombrar Juego en la carpeta Actions Acciones Welcome to %1, the cross-platform WBFS Manager. Report bugs <a href="%2">here</a>, discuss <a href="%3">here</a>. Bienvenido %1, un Gestor WBFS (multi-plataforma). Reporte los bugs <a href="%2">aquí</a>, discusión <a href="%3">aquí</a>. I don't know how to list partition for this platform. You will have to set the correct partition path yourself for mounting partitions. No se puede optener una lista de particiones para esta plataforma. Usted tendrá que establecer la ruta de la partición correcta aquí mismo para el montaje de la partición. Choose ISO files to convert Elija un archivo ISO para convertir Choose the folder to scan for ISOs/WBFSs files Seleccione carpeta para buscar archivos ISOs/WBFSs Choose the pattern to apply: %1 %2 %3 Elija el modo a ser aplicado: %1 %2 %3 Which format do you want to use to export the discs ? ¿Qué formato se desea utilizar para exportar los juegos? ISO Files (*.iso) Archivo ISO (*.iso) WBFS Files (*.wbfs) Archivos WBFS (*.wbfs) Choose WBFS files to convert Elija un archivo WBFS para convertir %1 = Game Title %1 = Título del Juego %1 = Game Id %1 = ID de Juego %1 = File Suffix %1 = Sufijo de archivo Choose a folder to export the discs Elija una carpeta para exportar juegos WorkerThread Indirect Export to ISO Exportación indirecta a ISO Export to ISO Exportación a ISO Indirect Export to WBFS Exportación indirecta a WBFS Export to WBFS Exportación a WBFS Indirect Import to ISO Importación indirecta a ISO Import to ISO Importación a ISO Indirect Import to WBFS Importación indirecta a WBFS Import to WBFS Importación a WBFS Indirect Convert to ISO Conversión indirecta a ISO Convert to ISO Convertir a ISO Indirect Convert to WBFS Conversión indirecta a WBFS Convert to WBFS Convertir a WBFS Rename Disc Renombrar Juego Initializing WBFS disc '%1'... Inicializando disco WBFS '%1'... Formating WBFS disc '%1'... Formateando disco WBFS '%1'... pPartition Unknown FS FS desconocida Unknown Vendor/Model Vendedor/Modelo Desconocido pPartitionModel Label Etiqueta Path Ruta File System Sistema de archivos Mount Points Puntos de Montaje Vendor Vendedor Model Modelo File System Id Id Sistema de archivo Display Text Visualización de texto Size Tamaño Used Usado Free Libre Last Check Última Comprovación ./qwbfsmanager-1.2.1-src/translations/qwbfsmanager-sv_SE.ts0000644000175000017520000010372511544172501023311 0ustar pasnoxpasnox Gauge Usage %1 (%2%) / %3 - Free %4 (%5%) PartitionComboBox Add a partition Enter a partition path Current Partition PartitionWidget Set the current partition Load/Reload the discs from the current partition Format the partition Add a new view Remove the view WBFS View Remove the selected discs Rename the selected disc Show/Hide Import View List CoverFlow Import View Clear the discs Import the discs to the WBFS partition %1 disc(s) on the partition - %2 disc(s) to import. Can't open partition. The partition '%1' will be formatted, all data will be erased permanently, are you sure? Can't format partition. You are about to permanently delete %1 disc(s) on partition '%2', are you sure? One or more discs have failed to be removed. Choose a new name for the disc Can't rename disc id #%1 (%2) to '%3' ProgressDialog Global progression... Details. Time remaining: %1 Cancel requested, the process will stop after the current operation. The thread finished in %1 PropertiesDialog Properties General Application locale Click here to change the application locale View Mode View Icon Type Covers' Cache Path Browse for a folder Use the system temporary directory Disk Size Unlimited MB Proxy Type Login Password Server Port PLEASE NOTE THAT THE PASSWORD IS ENCRYPTED WITH A SHIT METHOD. BE CAREFUL. List Icon Disc Cover No Proxy Socks5 Http Choose a folder for the data cache QObject The Free, Fast and Powerful cross platform Wii Backup File System manager QWBFS::Driver No error Partition not opened Source partition not opened Disc read failed Disc write failed Disc extract failed Disc add failed Disc convert failed Disc rename failed Disc found Disc not found (or not exists) Invalid disc index Invalid disc id Invalid disc Can't drive to drive copy Unknown error None Success Failed QWBFS::Model::DiscDelegate Estimated size: %1 - Origin: %2 QWBFS::Model::DiscModel Id: %1 Title: %1 Size: %1 Origin: %1 Region: %1 State: %1 Error: %1 Image Id Title Size Region Origin Sort by Id Sort by Title Sort by Size Sort by Region SplashScreen Version %1 UIAbout About... Informations License Notice I DO NOT TAKE ANY RESPONSIBILITY FOR ANY DAMAGE TO YOUR WII CONSOLE BECAUSE OF IMPROPER USAGE OF THIS SOFTWARE. 3rd Party Version %1 UIMain Tools File System Reload the mount points Export Clear the list Remove the selected items from the list Process the export list Main ToolBar Covers Covers By Reload Reload the partitions About... Quit... Properties Convert ISO Files Convert WBFS Files Rename Discs in folder Actions Welcome to %1, the cross-platform WBFS Manager. Report bugs <a href="%2">here</a>, discuss <a href="%3">here</a>. I don't know how to list partition for this platform. You will have to set the correct partition path yourself for mounting partitions. Choose ISO files to convert Choose the folder to scan for ISOs/WBFSs files Choose the pattern to apply: %1 %2 %3 Which format do you want to use to export the discs ? ISO Files (*.iso) WBFS Files (*.wbfs) Choose WBFS files to convert %1 = Game Title %1 = Game Id %1 = File Suffix Choose a folder to export the discs WorkerThread Indirect Export to ISO Export to ISO Indirect Export to WBFS Export to WBFS Indirect Import to ISO Import to ISO Indirect Import to WBFS Import to WBFS Indirect Convert to ISO Convert to ISO Indirect Convert to WBFS Convert to WBFS Rename Disc Initializing WBFS disc '%1'... Formating WBFS disc '%1'... pPartition Unknown FS Unknown Vendor/Model pPartitionModel Label Path File System Mount Points Vendor Model File System Id Display Text Size Used Free Last Check ./qwbfsmanager-1.2.1-src/translations/qwbfsmanager-uk_UA.ts0000644000175000017520000010372511544172501023276 0ustar pasnoxpasnox Gauge Usage %1 (%2%) / %3 - Free %4 (%5%) PartitionComboBox Add a partition Enter a partition path Current Partition PartitionWidget Set the current partition Load/Reload the discs from the current partition Format the partition Add a new view Remove the view WBFS View Remove the selected discs Rename the selected disc Show/Hide Import View List CoverFlow Import View Clear the discs Import the discs to the WBFS partition %1 disc(s) on the partition - %2 disc(s) to import. Can't open partition. The partition '%1' will be formatted, all data will be erased permanently, are you sure? Can't format partition. You are about to permanently delete %1 disc(s) on partition '%2', are you sure? One or more discs have failed to be removed. Choose a new name for the disc Can't rename disc id #%1 (%2) to '%3' ProgressDialog Global progression... Details. Time remaining: %1 Cancel requested, the process will stop after the current operation. The thread finished in %1 PropertiesDialog Properties General Application locale Click here to change the application locale View Mode View Icon Type Covers' Cache Path Browse for a folder Use the system temporary directory Disk Size Unlimited MB Proxy Type Login Password Server Port PLEASE NOTE THAT THE PASSWORD IS ENCRYPTED WITH A SHIT METHOD. BE CAREFUL. List Icon Disc Cover No Proxy Socks5 Http Choose a folder for the data cache QObject The Free, Fast and Powerful cross platform Wii Backup File System manager QWBFS::Driver No error Partition not opened Source partition not opened Disc read failed Disc write failed Disc extract failed Disc add failed Disc convert failed Disc rename failed Disc found Disc not found (or not exists) Invalid disc index Invalid disc id Invalid disc Can't drive to drive copy Unknown error None Success Failed QWBFS::Model::DiscDelegate Estimated size: %1 - Origin: %2 QWBFS::Model::DiscModel Id: %1 Title: %1 Size: %1 Origin: %1 Region: %1 State: %1 Error: %1 Image Id Title Size Region Origin Sort by Id Sort by Title Sort by Size Sort by Region SplashScreen Version %1 UIAbout About... Informations License Notice I DO NOT TAKE ANY RESPONSIBILITY FOR ANY DAMAGE TO YOUR WII CONSOLE BECAUSE OF IMPROPER USAGE OF THIS SOFTWARE. 3rd Party Version %1 UIMain Tools File System Reload the mount points Export Clear the list Remove the selected items from the list Process the export list Main ToolBar Covers Covers By Reload Reload the partitions About... Quit... Properties Convert ISO Files Convert WBFS Files Rename Discs in folder Actions Welcome to %1, the cross-platform WBFS Manager. Report bugs <a href="%2">here</a>, discuss <a href="%3">here</a>. I don't know how to list partition for this platform. You will have to set the correct partition path yourself for mounting partitions. Choose ISO files to convert Choose the folder to scan for ISOs/WBFSs files Choose the pattern to apply: %1 %2 %3 Which format do you want to use to export the discs ? ISO Files (*.iso) WBFS Files (*.wbfs) Choose WBFS files to convert %1 = Game Title %1 = Game Id %1 = File Suffix Choose a folder to export the discs WorkerThread Indirect Export to ISO Export to ISO Indirect Export to WBFS Export to WBFS Indirect Import to ISO Import to ISO Indirect Import to WBFS Import to WBFS Indirect Convert to ISO Convert to ISO Indirect Convert to WBFS Convert to WBFS Rename Disc Initializing WBFS disc '%1'... Formating WBFS disc '%1'... pPartition Unknown FS Unknown Vendor/Model pPartitionModel Label Path File System Mount Points Vendor Model File System Id Display Text Size Used Free Last Check ./qwbfsmanager-1.2.1-src/translations/qwbfsmanager-he_IL.qm0000644000175000017520000000002011410740625023221 0ustar pasnoxpasnox Gauge Usage %1 (%2%) / %3 - Free %4 (%5%) PartitionComboBox Add a partition Enter a partition path Current Partition PartitionWidget Set the current partition Load/Reload the discs from the current partition Format the partition Add a new view Remove the view WBFS View Remove the selected discs Rename the selected disc Show/Hide Import View List CoverFlow Import View Clear the discs Import the discs to the WBFS partition %1 disc(s) on the partition - %2 disc(s) to import. Can't open partition. The partition '%1' will be formatted, all data will be erased permanently, are you sure? Can't format partition. You are about to permanently delete %1 disc(s) on partition '%2', are you sure? One or more discs have failed to be removed. Choose a new name for the disc Can't rename disc id #%1 (%2) to '%3' ProgressDialog Global progression... Details. Time remaining: %1 Cancel requested, the process will stop after the current operation. The thread finished in %1 PropertiesDialog Properties General Application locale Click here to change the application locale View Mode View Icon Type Covers' Cache Path Browse for a folder Use the system temporary directory Disk Size Unlimited MB Proxy Type Login Password Server Port PLEASE NOTE THAT THE PASSWORD IS ENCRYPTED WITH A SHIT METHOD. BE CAREFUL. List Icon Disc Cover No Proxy Socks5 Http Choose a folder for the data cache QObject The Free, Fast and Powerful cross platform Wii Backup File System manager QWBFS::Driver No error Partition not opened Source partition not opened Disc read failed Disc write failed Disc extract failed Disc add failed Disc convert failed Disc rename failed Disc found Disc not found (or not exists) Invalid disc index Invalid disc id Invalid disc Can't drive to drive copy Unknown error None Success Failed QWBFS::Model::DiscDelegate Estimated size: %1 - Origin: %2 QWBFS::Model::DiscModel Id: %1 Title: %1 Size: %1 Origin: %1 Region: %1 State: %1 Error: %1 Image Id Title Size Region Origin Sort by Id Sort by Title Sort by Size Sort by Region SplashScreen Version %1 UIAbout About... Informations License Notice I DO NOT TAKE ANY RESPONSIBILITY FOR ANY DAMAGE TO YOUR WII CONSOLE BECAUSE OF IMPROPER USAGE OF THIS SOFTWARE. 3rd Party Version %1 UIMain Tools File System Reload the mount points Export Clear the list Remove the selected items from the list Process the export list Main ToolBar Covers Covers By Reload Reload the partitions About... Quit... Properties Convert ISO Files Convert WBFS Files Rename Discs in folder Actions Welcome to %1, the cross-platform WBFS Manager. Report bugs <a href="%2">here</a>, discuss <a href="%3">here</a>. I don't know how to list partition for this platform. You will have to set the correct partition path yourself for mounting partitions. Choose ISO files to convert Choose the folder to scan for ISOs/WBFSs files Choose the pattern to apply: %1 %2 %3 Which format do you want to use to export the discs ? ISO Files (*.iso) WBFS Files (*.wbfs) Choose WBFS files to convert %1 = Game Title %1 = Game Id %1 = File Suffix Choose a folder to export the discs WorkerThread Indirect Export to ISO Export to ISO Indirect Export to WBFS Export to WBFS Indirect Import to ISO Import to ISO Indirect Import to WBFS Import to WBFS Indirect Convert to ISO Convert to ISO Indirect Convert to WBFS Convert to WBFS Rename Disc Initializing WBFS disc '%1'... Formating WBFS disc '%1'... pPartition Unknown FS Unknown Vendor/Model pPartitionModel Label Path File System Mount Points Vendor Model File System Id Display Text Size Used Free Last Check ./qwbfsmanager-1.2.1-src/translations/qwbfsmanager-pt_PT.qm0000644000175000017520000000002011410740625023267 0ustar pasnoxpasnox Gauge Usage %1 (%2%) / %3 - Free %4 (%5%) PartitionComboBox Add a partition Enter a partition path Current Partition PartitionWidget Set the current partition Load/Reload the discs from the current partition Format the partition Add a new view Remove the view WBFS View Remove the selected discs Rename the selected disc Show/Hide Import View List CoverFlow Import View Clear the discs Import the discs to the WBFS partition %1 disc(s) on the partition - %2 disc(s) to import. Can't open partition. The partition '%1' will be formatted, all data will be erased permanently, are you sure? Can't format partition. You are about to permanently delete %1 disc(s) on partition '%2', are you sure? One or more discs have failed to be removed. Choose a new name for the disc Can't rename disc id #%1 (%2) to '%3' ProgressDialog Global progression... Details. Time remaining: %1 Cancel requested, the process will stop after the current operation. The thread finished in %1 PropertiesDialog Properties General Application locale Click here to change the application locale View Mode View Icon Type Covers' Cache Path Browse for a folder Use the system temporary directory Disk Size Unlimited MB Proxy Type Login Password Server Port PLEASE NOTE THAT THE PASSWORD IS ENCRYPTED WITH A SHIT METHOD. BE CAREFUL. List Icon Disc Cover No Proxy Socks5 Http Choose a folder for the data cache QObject The Free, Fast and Powerful cross platform Wii Backup File System manager QWBFS::Driver No error Partition not opened Source partition not opened Disc read failed Disc write failed Disc extract failed Disc add failed Disc convert failed Disc rename failed Disc found Disc not found (or not exists) Invalid disc index Invalid disc id Invalid disc Can't drive to drive copy Unknown error None Success Failed QWBFS::Model::DiscDelegate Estimated size: %1 - Origin: %2 QWBFS::Model::DiscModel Id: %1 Title: %1 Size: %1 Origin: %1 Region: %1 State: %1 Error: %1 Image Id Title Size Region Origin Sort by Id Sort by Title Sort by Size Sort by Region SplashScreen Version %1 UIAbout About... Informations License Notice I DO NOT TAKE ANY RESPONSIBILITY FOR ANY DAMAGE TO YOUR WII CONSOLE BECAUSE OF IMPROPER USAGE OF THIS SOFTWARE. 3rd Party Version %1 UIMain Tools File System Reload the mount points Export Clear the list Remove the selected items from the list Process the export list Main ToolBar Covers Covers By Reload Reload the partitions About... Quit... Properties Convert ISO Files Convert WBFS Files Rename Discs in folder Actions Welcome to %1, the cross-platform WBFS Manager. Report bugs <a href="%2">here</a>, discuss <a href="%3">here</a>. I don't know how to list partition for this platform. You will have to set the correct partition path yourself for mounting partitions. Choose ISO files to convert Choose the folder to scan for ISOs/WBFSs files Choose the pattern to apply: %1 %2 %3 Which format do you want to use to export the discs ? ISO Files (*.iso) WBFS Files (*.wbfs) Choose WBFS files to convert %1 = Game Title %1 = Game Id %1 = File Suffix Choose a folder to export the discs WorkerThread Indirect Export to ISO Export to ISO Indirect Export to WBFS Export to WBFS Indirect Import to ISO Import to ISO Indirect Import to WBFS Import to WBFS Indirect Convert to ISO Convert to ISO Indirect Convert to WBFS Convert to WBFS Rename Disc Initializing WBFS disc '%1'... Formating WBFS disc '%1'... pPartition Unknown FS Unknown Vendor/Model pPartitionModel Label Path File System Mount Points Vendor Model File System Id Display Text Size Used Free Last Check ./qwbfsmanager-1.2.1-src/translations/qwbfsmanager-ru_RU.ts0000644000175000017520000010372511544172501023326 0ustar pasnoxpasnox Gauge Usage %1 (%2%) / %3 - Free %4 (%5%) PartitionComboBox Add a partition Enter a partition path Current Partition PartitionWidget Set the current partition Load/Reload the discs from the current partition Format the partition Add a new view Remove the view WBFS View Remove the selected discs Rename the selected disc Show/Hide Import View List CoverFlow Import View Clear the discs Import the discs to the WBFS partition %1 disc(s) on the partition - %2 disc(s) to import. Can't open partition. The partition '%1' will be formatted, all data will be erased permanently, are you sure? Can't format partition. You are about to permanently delete %1 disc(s) on partition '%2', are you sure? One or more discs have failed to be removed. Choose a new name for the disc Can't rename disc id #%1 (%2) to '%3' ProgressDialog Global progression... Details. Time remaining: %1 Cancel requested, the process will stop after the current operation. The thread finished in %1 PropertiesDialog Properties General Application locale Click here to change the application locale View Mode View Icon Type Covers' Cache Path Browse for a folder Use the system temporary directory Disk Size Unlimited MB Proxy Type Login Password Server Port PLEASE NOTE THAT THE PASSWORD IS ENCRYPTED WITH A SHIT METHOD. BE CAREFUL. List Icon Disc Cover No Proxy Socks5 Http Choose a folder for the data cache QObject The Free, Fast and Powerful cross platform Wii Backup File System manager QWBFS::Driver No error Partition not opened Source partition not opened Disc read failed Disc write failed Disc extract failed Disc add failed Disc convert failed Disc rename failed Disc found Disc not found (or not exists) Invalid disc index Invalid disc id Invalid disc Can't drive to drive copy Unknown error None Success Failed QWBFS::Model::DiscDelegate Estimated size: %1 - Origin: %2 QWBFS::Model::DiscModel Id: %1 Title: %1 Size: %1 Origin: %1 Region: %1 State: %1 Error: %1 Image Id Title Size Region Origin Sort by Id Sort by Title Sort by Size Sort by Region SplashScreen Version %1 UIAbout About... Informations License Notice I DO NOT TAKE ANY RESPONSIBILITY FOR ANY DAMAGE TO YOUR WII CONSOLE BECAUSE OF IMPROPER USAGE OF THIS SOFTWARE. 3rd Party Version %1 UIMain Tools File System Reload the mount points Export Clear the list Remove the selected items from the list Process the export list Main ToolBar Covers Covers By Reload Reload the partitions About... Quit... Properties Convert ISO Files Convert WBFS Files Rename Discs in folder Actions Welcome to %1, the cross-platform WBFS Manager. Report bugs <a href="%2">here</a>, discuss <a href="%3">here</a>. I don't know how to list partition for this platform. You will have to set the correct partition path yourself for mounting partitions. Choose ISO files to convert Choose the folder to scan for ISOs/WBFSs files Choose the pattern to apply: %1 %2 %3 Which format do you want to use to export the discs ? ISO Files (*.iso) WBFS Files (*.wbfs) Choose WBFS files to convert %1 = Game Title %1 = Game Id %1 = File Suffix Choose a folder to export the discs WorkerThread Indirect Export to ISO Export to ISO Indirect Export to WBFS Export to WBFS Indirect Import to ISO Import to ISO Indirect Import to WBFS Import to WBFS Indirect Convert to ISO Convert to ISO Indirect Convert to WBFS Convert to WBFS Rename Disc Initializing WBFS disc '%1'... Formating WBFS disc '%1'... pPartition Unknown FS Unknown Vendor/Model pPartitionModel Label Path File System Mount Points Vendor Model File System Id Display Text Size Used Free Last Check ./qwbfsmanager-1.2.1-src/translations/qwbfsmanager-sv_SE.qm0000644000175000017520000000002011410740625023260 0ustar pasnoxpasnox /dev/null 2>&1" startCommand "git --git-dir=\"../fresh/.git\" checkout-index -a -f --prefix=\"$2/fresh/\" > /dev/null 2>&1" } # create a tar.gz file $1 from path $2 createTarGz() { echo "*** Creating tar.gz package: $1" startCommand "tar czf \"$1\" \"$2\"" } # create a zip file $1 from path $2 and extra parameters $3 and ending parameters $4 createZip() { echo "*** Creating zip package: $1" params= if [ '!' -z "$3" ]; then params="$params \"$3\"" fi if [ '!' -z "$1" ]; then params="$params \"$1\"" fi if [ '!' -z "$2" ]; then params="$params \"$2\"" fi if [ '!' -z "$4" ]; then params="$params $4" fi startCommand "zip -q -r -9 $params" } # crossbuild for windows crossBuild() { echo "*** Crossbuilding for windows" QMAKE="qmake" if [ $OS = "Linux" ]; then QMAKE="qmake-qt4" QT_VERSION="4.7.0" QT_WIN32_VERSION="4.7.1" QT_PATH="/usr" MKSPEC="$HOME/.qt/win32-x11-g++" QT_WIN32_PATH="$WINE_DRIVE/Development/Qt/$QT_WIN32_VERSION" ISCC="$WINE_PROGRAM_FILES/Inno Setup 5/ISCC.exe" DLLS_PATH="$WINE_DRIVE/Development/OpenSSL" fi if [ $OS = "Darwin" ]; then QT_VERSION="4.7.0-lgpl" QT_WIN32_VERSION="4.7.1" QT_PATH="/usr/local/Trolltech/$QT_VERSION" MKSPEC="$HOME/mkspecs/4.6.x/win32-osx-g++" QT_WIN32_PATH="/usr/local/Trolltech/win32/$QT_WIN32_VERSION" ISCC="$WINE_PROGRAM_FILES/Inno_Setup_5/ISCC.exe" DLLS_PATH="$HOME/Win32Libraries/bin" fi export QT_WIN32_PATH export QT_WIN32_VERSION export DLLS_PATH export CROSS_WIN32_QT_PATH="$QT_WIN32_PATH" startCommand "cd \"./$FOLDER_NAME\"" startCommand "make distclean > /dev/null 2>&1" 0 startCommand "\"$QT_PATH/bin/$QMAKE\" -spec \"$MKSPEC\" -win32 -r > /dev/null 2>&1" startCommand "make distclean > /dev/null 2>&1" 0 startCommand "\"$QT_PATH/bin/$QMAKE\" -spec \"$MKSPEC\" -win32 -r > /dev/null 2>&1" startCommand "make -j4 > \"$CUR_PATH/log/winbuild.log\" 2>&1" startCommand "\"$WINE\" \"$ISCC\" \"./packages/windows.iss\" > \"$CUR_PATH/log/winpackage.log\" 2>&1" startCommand "make distclean > /dev/null 2>&1" 0 startCommand "cd \"$CUR_PATH\"" if [ -f "./$FOLDER_NAME/packages/releases/$WIN_SETUP" ]; then startCommand "mv \"./$FOLDER_NAME/packages/releases/$WIN_SETUP\" \"./\"" fi } # create windows zip package windowsZipPackage() { echo "*** Creating windows zip package" # uninstall previous package startCommand "find \"$WINE_PROGRAM_FILES/QWBFS Manager\" -name \"unins*.exe\" -print0 | xargs -0 -I {} \"$WINE\" {} /silent > /dev/null 2>&1" # install the current one startCommand "\"$WINE\" \"./$WIN_SETUP\" /silent > /dev/null 2>&1" # create zip startCommand "cp -fr \"$WINE_PROGRAM_FILES/QWBFS Manager\" \"./$WIN_FOLDER\"" startCommand "createZip \"./$WIN_PACKAGE\" \"./$WIN_FOLDER\" \"\" \"-x *unins*.exe -x *unins*.dat\"" startCommand "deleteIfExists \"./$WIN_FOLDER\"" # uninstall installed package startCommand "find \"$WINE_PROGRAM_FILES/QWBFS Manager\" -name \"unins*.exe\" -print0 | xargs -0 -I {} \"$WINE\" {} /silent > /dev/null 2>&1" } # create mac os x package macPackage() { echo "*** Create Mac OS X package" QT_VERSION="4.7.0-lgpl" BUNDLE_NAME="QWBFSManager" BUNDLE_PATH="./bin" BUNDLE_APP_PATH="$BUNDLE_PATH/$BUNDLE_NAME.app" QT_PATH="/usr/local/Trolltech/$QT_VERSION" QMAKE_FLAGS="\"CONFIG *= universal no_fresh_install\"" startCommand "cd \"./$FOLDER_NAME\"" startCommand "make distclean > /dev/null 2>&1" 0 startCommand "\"$QT_PATH/bin/qmake\" $QMAKE_FLAGS -r > /dev/null 2>&1" startCommand "make distclean > /dev/null 2>&1" 0 startCommand "\"$QT_PATH/bin/qmake\" $QMAKE_FLAGS -r > /dev/null 2>&1" startCommand "make -j4 > \"$CUR_PATH/log/macbuild.log\" 2>&1" startCommand "make install > /dev/null 2>&1" startCommand "\"$QT_PATH/bin/macdeployqt\" \"$BUNDLE_APP_PATH\" -dmg > /dev/null 2>&1" startCommand "make distclean > /dev/null 2>&1" 0 startCommand "cd \"$CUR_PATH\"" if [ -f "./$FOLDER_NAME/$BUNDLE_PATH/$BUNDLE_NAME.dmg" ]; then startCommand "mv \"./$FOLDER_NAME/$BUNDLE_PATH/$BUNDLE_NAME.dmg\" \"./$MAC_PACKAGE\"" fi } # startup function startup() { if [ '!' -d "$LOG_FOLDER" ]; then echo "*** Create log folder" startCommand "mkdir -p \"$LOG_FOLDER\"" fi } # finish function, must not use startCommand or function calling it to avoid possible unfinite loop on errors. finish() { # close wine, WineBottler & X11 if [ $OS = "Darwin" ]; then startCommand "killall wine > /dev/null 2>&1" 0 startCommand "killall WineBottler > /dev/null 2>&1" 0 startCommand "killall X11.bin > /dev/null 2>&1" 0 fi # come back to start folder startCommand "cd \"$CUR_PATH\"" 0 # delete exported repository startCommand "rm -fr \"./$FOLDER_NAME\"" 0 echo "********** Processing release finished - Exit code: $1 **********" exit $1 } # startup call startup # delete source folder deleteIfExists "./$FOLDER_NAME" # delete tar.gz source deleteIfExists "./$TAR_GZ_FILE" # delete zip source deleteIfExists "./$ZIP_FILE" # delete win setup deleteIfExists "./$WIN_SETUP" # delete win package deleteIfExists "./$WIN_PACKAGE" # delete mac package deleteIfExists "./$MAC_PACKAGE" # export the taggued version to release svnExport "./$SOURCE_FOLDER" "./$FOLDER_NAME" # create tar.gz source createTarGz "./$TAR_GZ_FILE" "./$FOLDER_NAME" # create zip source createZip "./$ZIP_FILE" "./$FOLDER_NAME" # create win setup crossBuild # create windows zip package windowsZipPackage # darwin specific if [ $OS = "Darwin" ]; then echo "*** Mac" macPackage fi # linux specific if [ $OS = "Linux" ]; then echo "*** Linux" fi # finish call finish 0./qwbfsmanager-1.2.1-src/packages/QWBFSManager.desktop0000644000175000017520000000041311406141535022042 0ustar pasnoxpasnox[Desktop Entry] Categories=Game;Qt; Exec=qwbfsmanager Name=QWBFS Manager GenericName=QWBFS Manager Comment=QWBFS Manager is a graphical user interface (GUI) for working with WBFS filesystem formatted hard disk drive. Terminal=false Type=Application Icon=qwbfsmanager ./qwbfsmanager-1.2.1-src/packages/qt_windows.conf0000644000175000017520000000002411402024631021326 0ustar pasnoxpasnox[Paths] Prefix = qt./qwbfsmanager-1.2.1-src/packages/windows.iss0000644000175000017520000001114511546152625020517 0ustar pasnoxpasnox; This script need to use a special Inno Setup version located here : http://jrsoftware.org/isdl.php#qsp [CustomMessages] QWBFS_NAME=QWBFS Manager QWBFS_COPYRIGHTS=2010 Filipe AZEVEDO QWBFS_URL=http://code.google.com/p/qwbfs/ QWBFS_ISSUES_URL=http://code.google.com/p/qwbfs/issues/list #define QWBFS_VERSION GetEnv("VERSION") #define QWBFS_VERSION_STR GetEnv("VERSION_STR") #define QWBFS_SETUP_NAME "setup-qwbfsmanager-" +QWBFS_VERSION_STR +"-win32" #define QT_PATH "Z:\" +GetEnv("CROSS_WIN32_QT_PATH") #define DLLS_PATH "Z:\" +GetEnv("DLLS_PATH") [Setup] SourceDir=..\bin OutputDir=..\packages\releases OutputBaseFilename={#QWBFS_SETUP_NAME} VersionInfoVersion={#QWBFS_VERSION} VersionInfoCompany=Filipe AZEVEDO VersionInfoDescription=Free, Fast and Powerfull cross platform Wii Backup File System Manager VersionInfoTextVersion={#QWBFS_VERSION} VersionInfoCopyright={cm:QWBFS_COPYRIGHTS} AppCopyright={cm:QWBFS_COPYRIGHTS} AppName={cm:QWBFS_NAME} AppVerName={cm:QWBFS_NAME} {#QWBFS_VERSION} InfoAfterFile=..\GPL-2 InfoBeforeFile=..\GPL-2 LicenseFile=..\GPL-2 ChangesAssociations=true PrivilegesRequired=none DefaultDirName={pf}\{cm:QWBFS_NAME} EnableDirDoesntExistWarning=false AllowNoIcons=true DefaultGroupName={cm:QWBFS_NAME} AlwaysUsePersonalGroup=true ;SetupIconFile=..\qwbfs\resources\qwbfsmanager.ico AppPublisher={cm:QWBFS_COPYRIGHTS} AppPublisherURL={cm:QWBFS_URL} AppSupportURL={cm:QWBFS_ISSUES_URL} AppVersion={#QWBFS_VERSION} AppComments=Thanks using {cm:QWBFS_NAME} AppContact={cm:QWBFS_ISSUES_URL} UninstallDisplayName={cm:QWBFS_NAME} ShowLanguageDialog=yes UsePreviousLanguage=no [_ISTool] UseAbsolutePaths=false [Files] ; Fresh framework related Source: ..\fresh\translations\*.qm; DestDir: {app}\translations; Flags: promptifolder ; QWBFS Manager related files Source: qwbfsmanager.exe; DestDir: {app}; Flags: promptifolder Source: ..\packages\qt_windows.conf; DestDir: {app}; DestName: qt.conf; Flags: promptifolder Source: ..\GPL-2; DestDir: {app}; Flags: promptifolder Source: ..\translations\*.qm; DestDir: {app}\translations; Flags: promptifolder ; Qt related files Source: {#QT_PATH}\bin\QtCore4.dll; DestDir: {app}; Flags: promptifolder Source: {#QT_PATH}\bin\QtGui4.dll; DestDir: {app}; Flags: promptifolder Source: {#QT_PATH}\bin\QtXml4.dll; DestDir: {app}; Flags: promptifolder Source: {#QT_PATH}\bin\QtNetwork4.dll; DestDir: {app}; Flags: promptifolder Source: {#QT_PATH}\plugins\accessible\*.dll; DestDir: {app}\qt\plugins\accessible; Flags: promptifolder; Excludes: *d4.dll Source: {#QT_PATH}\plugins\codecs\*.dll; DestDir: {app}\qt\plugins\codecs; Flags: promptifolder; Excludes: *d4.dll Source: {#QT_PATH}\plugins\graphicssystems\*.dll; DestDir: {app}\qt\plugins\graphicssystems; Flags: promptifolder; Excludes: *d4.dll Source: {#QT_PATH}\plugins\imageformats\*.dll; DestDir: {app}\qt\plugins\imageformats; Flags: promptifolder; Excludes: *d4.dll Source: {#QT_PATH}\translations\qt*.qm; DestDir: {app}\qt\translations; Flags: promptifolder recursesubdirs; Excludes: qt_help*.qm,qtconfig*.qm ; Dependencies related files Source: {#QT_PATH}\bin\mingwm10.dll; DestDir: {app}; Flags: promptifolder Source: {#QT_PATH}\bin\libgcc_s_dw2-1.dll; DestDir: {app}; Flags: promptifolder skipifsourcedoesntexist Source: {#QT_PATH}\bin\libstdc++-6.dll; DestDir: {app}; Flags: promptifolder skipifsourcedoesntexist Source: {#DLLS_PATH}\libeay32.dll; DestDir: {app}; Flags: promptifolder Source: {#DLLS_PATH}\libssl32.dll; DestDir: {app}; Flags: promptifolder Source: {#DLLS_PATH}\ssleay32.dll; DestDir: {app}; Flags: promptifolder [Icons] Name: {group}\{cm:QWBFS_NAME}; Filename: {app}\qwbfsmanager.exe; WorkingDir: {app}; IconFilename: {app}\qwbfsmanager.exe; IconIndex: 0 Name: {userdesktop}\{cm:QWBFS_NAME}; Filename: {app}\qwbfsmanager.exe; WorkingDir: {app}; IconFilename: {app}\qwbfsmanager.exe; IconIndex: 0 Name: {group}\Home Page; Filename: {app}\Home Page.url; WorkingDir: {app} Name: {group}\Tracker; Filename: {app}\Tracker.url; WorkingDir: {app} [INI] Filename: {app}\Home Page.url; Section: InternetShortcut; Key: URL; String: {cm:QWBFS_URL}; Flags: createkeyifdoesntexist uninsdeleteentry uninsdeletesectionifempty; Components: Filename: {app}\Tracker.url; Section: InternetShortcut; Key: URL; String: {cm:QWBFS_ISSUES_URL}; Flags: createkeyifdoesntexist uninsdeleteentry uninsdeletesectionifempty [UninstallDelete] Name: {app}\Home Page.url; Type: files Name: {app}\Tracker.url; Type: files Name: {app}\*.ini; Type: files Name: {app}; Type: dirifempty [Run] Filename: {app}\qwbfsmanager.exe; WorkingDir: {app}; Flags: postinstall skipifsilent; Description: {cm:QWBFS_NAME} ./qwbfsmanager-1.2.1-src/qwbfs/0000755000175000017520000000000011546156115015645 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/qwbfs/src/0000755000175000017520000000000011546156115016434 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/qwbfs/src/UIAbout.ui0000644000175000017520000011675611545577364020337 0ustar pasnoxpasnox UIAbout 0 0 500 525 500 525 500 525 About... 0 0 0 64 64 :/icons/qwbfsmanager.png true Qt::Vertical 0 0 0 0 13 75 true Application Name 0 0 10 75 true Application Version 0 0 10 Application Description Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true Qt::Vertical QSizePolicy::Fixed 3 6 0 1 0 255 255 255 229 229 229 255 255 255 229 229 229 229 229 229 229 229 229 true Informations 0 :/icons/splashscreen.png Qt::AlignCenter License 0 0 0 0 0 0 0 0 0 0 10 QFrame::NoFrame true false QPlainTextEdit::NoWrap true GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. <one line to give the program's name and a brief idea of what it does.> Copyright (C) <year> <name of author> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. <signature of Ty Coon>, 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. 40 Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse Notice 0 255 0 0 255 0 0 69 69 69 10 75 true I DO NOT TAKE ANY RESPONSIBILITY FOR ANY DAMAGE TO YOUR WII CONSOLE BECAUSE OF IMPROPER USAGE OF THIS SOFTWARE. Qt::AlignCenter true Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse 3rd Party 0 QFrame::NoFrame QFrame::Plain true 0 0 470 296 0 0 0 0 0 0 0 212 208 200 12 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Arial'; font-weight:600; text-decoration: underline;">Unmodified/modified third party resources</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial';"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="https://github.com/kwiirk/wbfs"><span style=" font-family:'Arial'; font-weight:600; text-decoration: underline; color:#0057ae;">libwbfs</span></a><span style=" font-family:'Arial';"> - The Wii Backup File System library.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Arial';">© 2009 kwiirk.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial';"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://pictureflow.googlecode.com"><span style=" font-family:'Arial'; font-weight:600; text-decoration: underline; color:#0057ae;">PictureFlow</span></a><span style=" font-family:'Arial';"> - Animated image show widget (coverflow like widget).</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Arial';">© 2009 Ariya Hidayat (ariya@kde.org).</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial';"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://wiitdb.com"><span style=" font-family:'Arial'; font-weight:600; text-decoration: underline; color:#0057ae;">WiiTDB</span></a><span style=" font-family:'Arial';"> - Nintendo Wii games database.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Arial';">© 2009-2011 WiiTDB.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial';"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://bettercodes.org/projects/fresh"><span style=" font-family:'Arial'; font-weight:600; text-decoration: underline; color:#0057ae;">libfresh</span></a><span style=" font-family:'Arial';"> - A Qt 4 extension library providing new widgets/objects.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Arial';">© 2005-2011 Filipe Azevedo (pasnox@gmail.com).</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial';"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://code.google.com/u/nagy.franto"><span style=" font-family:'Arial'; font-weight:600; text-decoration: underline; color:#0057ae;">Splash Screen</span></a><span style=" font-family:'Arial';"> - Version 1.2.0</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Arial';">© Nagy Franto.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial';"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="mailto:exilys@hotmail.fr"><span style=" font-family:'Arial'; font-weight:600; text-decoration: underline; color:#0057ae;">Application Icon</span></a><span style=" font-family:'Arial';"> - Version 1.2.0</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Arial';">© Jean-Baptiste Vasseur (exilys@hotmail.fr)</span></p></body></html> Qt::AlignCenter true true Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse 11 Application Copyrights Qt::AlignCenter 11 Application Homepage Qt::AlignCenter true QDialogButtonBox::Ok dbbButtons accepted() UIAbout accept() 369 458 358 617 ./qwbfsmanager-1.2.1-src/qwbfs/src/Gauge.cpp0000644000175000017520000001333111534466576020205 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : Gauge.cpp ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #include "Gauge.h" #include #include #include #include #include Gauge::Gauge( QWidget* parent ) : QWidget( parent ) { setStyle( QStyleFactory::create( "plastique" ) ); mSize = 0; mUsedSize = 0; mFreeSize = 0; mTemporarySize = 0; } Gauge::~Gauge() { } QSize Gauge::sizeHint() const { return QSize( 200, 21 ); } QSize Gauge::minimumSizeHint() const { return QSize( -1, sizeHint().height() ); } void Gauge::setSize( qint64 value ) { mSize = qMax( Q_INT64_C( 0 ), value ); update(); } qint64 Gauge::size() const { return mSize; } void Gauge::setUsedSize( qint64 value ) { mUsedSize = qMax( Q_INT64_C( 0 ), value ); update(); } qint64 Gauge::usedSize() const { return mUsedSize; } void Gauge::setFreeSize( qint64 value ) { mFreeSize = qMax( Q_INT64_C( 0 ), value ); update(); } qint64 Gauge::freeSize() const { return mFreeSize; } void Gauge::setTemporarySize( qint64 value ) { mTemporarySize = qMax( Q_INT64_C( 0 ), value ); update(); } qint64 Gauge::temporarySize() const { return mTemporarySize; } void Gauge::paintEvent( QPaintEvent* event ) { Q_UNUSED( event ); QPainter painter( this ); const qreal available = mSize; const qreal used = mUsedSize; const qreal free = mFreeSize; const qreal max = used +mTemporarySize; const qreal total = qMax( available, max ); const qreal cent = 100; const int totalPercent = available != 0 ? int( total /available *cent ) : 0; const int usedPercent = available != 0 ? int( used /available *cent ) : 0; const int extraPercent = max != used && available != 0 ? int( qBound( qreal(usedPercent), qreal(max /available *cent), cent ) ) : 0; const int overflowPercent = max > available ? int( available != 0 ? max /available *cent : 0 ) : 0; const int flags = Qt::AlignCenter | Qt::TextWordWrap; QStyleOptionProgressBarV2 option; option.bottomToTop = false; option.invertedAppearance = false; option.orientation = Qt::Horizontal; option.maximum = totalPercent; option.minimum = 0; option.progress = 0; option.text = option.text = tr( "Usage %1 (%2%) / %3 - Free %4 (%5%)" ) .arg( pCoreUtils::fileSizeToString( used ) ) .arg( pCoreUtils::fileSizeAdaptString( available != 0 ? used /available *cent : 0 ) ) .arg( pCoreUtils::fileSizeToString( available ) ) .arg( pCoreUtils::fileSizeToString( free ) ) .arg( pCoreUtils::fileSizeAdaptString( available != 0 ? free /available *cent : 0 ) ); option.textAlignment = Qt::AlignCenter; option.textVisible = true; option.direction = layoutDirection(); option.fontMetrics = QFontMetrics( font() ); option.palette = palette(); option.rect = rect(); option.state = QStyle::State_Horizontal; if ( isEnabled() ) { option.state |= QStyle::State_Active; option.state |= QStyle::State_Enabled; } if ( hasFocus() ) { option.state |= QStyle::State_HasFocus; } // groove style()->drawControl( QStyle::CE_ProgressBarGroove, &option, &painter, this ); // overflow if ( overflowPercent != 0 ) { option.progress = overflowPercent; option.palette.setColor( QPalette::Highlight, QColor( 255, 181, 213, 255 ) ); style()->drawControl( QStyle::CE_ProgressBarContents, &option, &painter, this ); } // extra if ( extraPercent != 0 ) { option.progress = extraPercent; option.palette.setColor( QPalette::Highlight, QColor( 213, 255, 181, 255 ) ); style()->drawControl( QStyle::CE_ProgressBarContents, &option, &painter, this ); } // used if ( usedPercent != 0 ) { option.progress = usedPercent; option.palette.setColor( QPalette::Highlight, palette().color( QPalette::Highlight ) ); style()->drawControl( QStyle::CE_ProgressBarContents, &option, &painter, this ); } // text painter.setPen( option.palette.color( QPalette::Text ) ); painter.setBrush( Qt::NoBrush ); painter.drawText( rect(), flags, option.text ); //style()->drawControl( QStyle::CE_ProgressBarLabel, &option, &painter, this ); } ./qwbfsmanager-1.2.1-src/qwbfs/src/models/0000755000175000017520000000000011546156115017717 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/qwbfs/src/models/DiscModel.h0000644000175000017520000001266511534023323021734 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : DiscModel.h ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #ifndef DISCMODEL_H #define DISCMODEL_H #include #include #include #include "Disc.h" class ListView; namespace QWBFS { class Driver; namespace Model { #define DISC_MODEL_COLUMN_COUNT 6 class DiscModel : public QAbstractItemModel { Q_OBJECT public: typedef QPair PairIntInt; enum CustomRole { ListModeSizeHintRole = Qt::UserRole, IconModeSizeHintRole, CoverFlowModeSizeHintRole }; DiscModel( ListView* parent = 0, QWBFS::Driver* driver = 0 ); virtual ~DiscModel(); virtual int columnCount( const QModelIndex& parent = QModelIndex() ) const; virtual QVariant data( const QModelIndex& index, int role = Qt::DisplayRole ) const; virtual QModelIndex index( int row, int column, const QModelIndex& parent = QModelIndex() ) const; virtual QModelIndex parent( const QModelIndex& index ) const; virtual int rowCount( const QModelIndex& parent = QModelIndex() ) const; virtual bool hasChildren( const QModelIndex& parent = QModelIndex() ) const; virtual Qt::ItemFlags flags( const QModelIndex& index ) const; virtual bool removeRows( int row, int count, const QModelIndex& parent = QModelIndex() ); virtual bool setData( const QModelIndex& index, const QVariant& value, int role = Qt::EditRole ); virtual QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const; virtual void sort( int column, Qt::SortOrder order = Qt::AscendingOrder ); virtual Qt::DropActions supportedDropActions() const; virtual bool dropMimeData( const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent ); virtual QMimeData* mimeData( const QModelIndexList& indexes ) const; virtual QStringList mimeTypes() const; QPixmap coverPixmap( const QString& id, const QSize& size, bool coverFlow = false ) const; QPixmap statePixmap( int state, const QSize& size ) const; ListView* view() const; void insertDiscs( int index, const QWBFS::Model::DiscList& discs ); void addDiscs( const QWBFS::Model::DiscList& discs ); void setDiscs( const QWBFS::Model::DiscList& discs ); void setDisc( const QModelIndex& index, const QWBFS::Model::Disc& disc ); QWBFS::Model::DiscList discs() const; QWBFS::Model::DiscList discs( const QModelIndexList& indexes ); QWBFS::Model::DiscList discs( const QItemSelection& selection ); QWBFS::Model::Disc disc( const QModelIndex& index ) const; QModelIndex index( const QString& id ) const; QModelIndex index( const QWBFS::Model::Disc& disc, int column = 0 ) const; QString discId( const QModelIndex& index ) const; void removeSelection( const QItemSelection& selection ); void updateDisc( const QWBFS::Model::Disc& disc ); qint64 size() const; public slots: void clear(); protected: ListView* mListView; Driver* mDriver; QWBFS::Model::DiscList mDiscs; QHash mIndexes; static QStringList mMimeTypes; signals: void countChanged( int count ); }; struct SelectionRangePairLessThanSorter { bool operator()( const DiscModel::PairIntInt& left, const DiscModel::PairIntInt& right ) const; }; struct SelectionRangePairGreaterThanSorter { bool operator()( const DiscModel::PairIntInt& left, const DiscModel::PairIntInt& right ) const; }; struct HashLessThanSorter { HashLessThanSorter( int column ); bool operator()( const QWBFS::Model::Disc& left, const QWBFS::Model::Disc& right ) const; int c; }; struct HashGreaterThanSorter { HashGreaterThanSorter( int column ); bool operator()( const QWBFS::Model::Disc& left, const QWBFS::Model::Disc& right ) const; int c; }; }; // Models }; // QWBFS #endif // DISCMODEL_H ./qwbfsmanager-1.2.1-src/qwbfs/src/models/pPartitionModel.cpp0000644000175000017520000001777011543625217023552 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pPartitionModel.cpp ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pPartitionModel.h" #include #include pPartitionModel::pPartitionModel( QObject* parent ) : QAbstractTableModel( parent ) { mData = 0; platformInit(); } pPartitionModel::~pPartitionModel() { platformDeInit(); } int pPartitionModel::columnCount( const QModelIndex& parent ) const { return parent.isValid() ? 0 : pPartition::LastProperty +1; } QVariant pPartitionModel::data( const QModelIndex& index, int role ) const { if ( !index.isValid() || index.row() < 0 || index.row() >= rowCount( index.parent() ) || index.column() < 0 || index.column() >= columnCount( index.parent() ) ) { return QVariant(); } const pPartition& partition = mPartitions[ index.row() ]; switch ( role ) { case Qt::DecorationRole: { if ( index.column() == pPartition::Label ) { } break; } case Qt::DisplayRole: { switch ( index.column() ) { case pPartition::Label: case pPartition::DevicePath: case pPartition::FileSystem: case pPartition::MountPoints: case pPartition::DeviceVendor: case pPartition::DeviceModel: case pPartition::DisplayText: return partition.property( pPartition::Property( index.column() ) ); case pPartition::FileSystemId: return QString::number( partition.property( pPartition::Property( index.column() ) ).toLongLong(), 16 ).toUpper().prepend( "0x" ); case pPartition::TotalSize: case pPartition::UsedSize: case pPartition::FreeSize: return pCoreUtils::fileSizeToString( partition.property( pPartition::Property( index.column() ) ).toLongLong() ); case pPartition::LastCheck: return partition.property( pPartition::LastCheck ).toDateTime().toString( Qt::SystemLocaleShortDate ); } break; } case Qt::ToolTipRole: { QStringList tooltip; for ( int i = 0; i < columnCount(); i++ ) { tooltip << QString( "%1: %2" ) .arg( headerData( i, Qt::Horizontal, Qt::DisplayRole ).toString() ) .arg( data( index.sibling( index.row(), i ), Qt::DisplayRole ).toString() ) ; } return tooltip.join( "
" ); break; } } return QVariant(); } int pPartitionModel::rowCount( const QModelIndex& parent ) const { return parent.isValid() ? 0 : mPartitions.count(); } QVariant pPartitionModel::headerData( int section, Qt::Orientation orientation, int role ) const { if ( section >= 0 && section < columnCount() && orientation == Qt::Horizontal ) { switch ( role ) { case Qt::DisplayRole: case Qt::ToolTipRole: { switch ( section ) { case pPartition::Label: return tr( "Label" ); case pPartition::DevicePath: return tr( "Path" ); case pPartition::FileSystem: return tr( "File System" ); case pPartition::MountPoints: return tr( "Mount Points" ); case pPartition::DeviceVendor: return tr( "Vendor" ); case pPartition::DeviceModel: return tr( "Model" ); case pPartition::FileSystemId: return tr( "File System Id" ); case pPartition::DisplayText: return tr( "Display Text" ); case pPartition::TotalSize: return tr( "Size" ); case pPartition::UsedSize: return tr( "Used" ); case pPartition::FreeSize: return tr( "Free" ); case pPartition::LastCheck: return tr( "Last Check" ); } } } } return QAbstractTableModel::headerData( section, orientation, role ); } bool pPartitionModel::insertRow( int row, const QModelIndex& parent ) { const pPartition partition( QString::null ); const int index = mPartitions.indexOf( partition ); if ( index == -1 && !parent.isValid() ) { beginInsertRows( parent, row, row ); mPartitions << partition; endInsertRows(); return true; } return false; } bool pPartitionModel::insertRows( int row, int count, const QModelIndex& parent ) { if ( count > 1 || parent.isValid() ) { return false; } return insertRow( row, parent ); } pPartition pPartitionModel::partition( const QModelIndex& index ) const { return mPartitions.value( index.row() ); } QModelIndex pPartitionModel::index( const pPartition& partition, int column ) const { const int id = mPartitions.indexOf( partition ); return QAbstractTableModel::index( id, column, QModelIndex() ); } void pPartitionModel::addPartition( const QString& partition ) { updatePartition( pPartition( partition ) ); } void pPartitionModel::addPartitions( const QStringList& partitions ) { foreach ( const QString& partition, partitions ) { addPartition( partition ); } } void pPartitionModel::updatePartition( const pPartition& partition ) { if ( !partition.isValid() ) { return; } const int id = mPartitions.indexOf( partition ); if ( id != -1 ) { const QModelIndex index = QAbstractTableModel::index( id, 0, QModelIndex() ); mPartitions[ id ] = partition; emit dataChanged( index.sibling( index.row(), 0 ), index.sibling( index.row(), columnCount( index.parent() ) ) ); } else { beginInsertRows( QModelIndex(), mPartitions.count(), mPartitions.count() ); mPartitions << partition; endInsertRows(); } } void pPartitionModel::removePartition( const QString& partition ) { const int id = mPartitions.indexOf( pPartition( partition, false ) ); if ( id != -1 ) { beginRemoveRows( QModelIndex(), id, id ); mPartitions.removeAt( id ); endRemoveRows(); } } pPartitionList pPartitionModel::partitions() const { return mPartitions; } QStringList pPartitionModel::customPartitions() const { QStringList custom; foreach ( const pPartition& partition, mPartitions ) { if ( partition.isCustom() ) { custom << partition.devicePath(); } } return custom; } void pPartitionModel::dump() const { for ( int y = 0; y < rowCount(); y++ ) { QStringList entries; for ( int x = 0; x < columnCount(); x++ ) { entries << QAbstractTableModel::index( y, x ).data().toString(); } qWarning() << entries.join( "\t" ); } } void pPartitionModel::update() { #if defined( Q_OS_MAC ) || defined( Q_OS_WIN ) || defined( Q_OS_LINUX ) platformUpdate(); #else const QModelIndexList oldIndexes = persistentIndexList(); pPartitionList partitions = this->partitions(); QHash mapping; QModelIndexList newIndexes; // manually added partitions for ( int i = 0; i < mPartitions.count(); i++ ) { const pPartition& partition = mPartitions[ i ]; if ( !partitions.contains( partition ) && partition.isValid() ) { partitions << partition; } } // build mapping for ( int i = 0; i < mPartitions.count(); i++ ) { const pPartition& partition = mPartitions[ i ]; mapping[ i ] = partitions.indexOf( partition ); } emit layoutAboutToBeChanged(); foreach ( const QModelIndex& idx, oldIndexes ) { const int i = idx.row(); newIndexes << QAbstractTableModel::index( mapping[ i ], idx.column(), idx.parent() ); } mPartitions = partitions; changePersistentIndexList( oldIndexes, newIndexes ); emit layoutChanged(); #endif } ./qwbfsmanager-1.2.1-src/qwbfs/src/models/Disc.cpp0000644000175000017520000001221111543625160021300 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : Disc.cpp ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #include "Disc.h" #include "qwbfsdriver/Driver.h" #include #include #define WBFS_DISC_XML_NAME "WBFS-Discs" using namespace QWBFS::Model; Disc::Disc( const QDomElement& element ) { readFromElement( element ); } Disc::Disc( const QString& filePath ) { readFromElement( QDomElement() ); switch ( QWBFS::Driver::fileType( filePath ) ) { case QWBFS::Driver::WBFSFile: QWBFS::Driver::wbfsFileInfo( filePath, *this ); break; case QWBFS::Driver::ISOFile: operator=( Driver::isoDiscInfo( filePath ) ); break; case QWBFS::Driver::WBFSPartitionFile: case QWBFS::Driver::UnknownFile: Q_ASSERT( 0 ); break; } } bool Disc::operator==( const Disc& other ) const { return id == other.id && title == other.title && size == other.size && origin == other.origin && region == other.region /*&& state == other.state && error == other.error*/; } bool Disc::isValid() const { return !id.isEmpty() && !title.isEmpty(); } bool Disc::hasError() const { return error != QWBFS::Driver::Ok; } QString Disc::baseName( const QString& invalidChars ) const { return isValid() ? QString( "%1 [%2]" ).arg( cleanupGameTitle( title, invalidChars ) ).arg( id ) : QString::null; } void Disc::addToDocument( QDomDocument& document ) const { QDomElement element = document.createElement( "disc" ); element.setAttribute( "id", id ); element.setAttribute( "title", title ); element.setAttribute( "size", size ); element.setAttribute( "origin", origin ); element.setAttribute( "region", region ); element.setAttribute( "state", state ); element.setAttribute( "error", error ); document.documentElement().appendChild( element ); } void Disc::readFromElement( const QDomElement& element ) { id = element.attribute( "id", QString::null ); title = element.attribute( "title", QString::null ); size = element.attribute( "size", QString::number( 0 ) ).toUInt(); origin = element.attribute( "origin", QString::null ); region = element.attribute( "region", 0 ).toInt(); state = element.attribute( "state", QString::number( QWBFS::Driver::None ) ).toInt(); error = element.attribute( "error", QString::number( QWBFS::Driver::Ok ) ).toInt(); } QString Disc::cleanupGameTitle( const QString& _title, const QString& invalidChars ) { QString title = pCoreUtils::toTitleCase( _title ); foreach ( const QChar& c, invalidChars ) { QString r; /*switch ( c.toAscii() ) { case '\'': r = " "; break; case ':': r = "-"; }*/ title.replace( c, r ); } return title; } QDomDocument Disc::toDocument( const DiscList& discs ) { QDomDocument document( WBFS_DISC_XML_NAME ); document.appendChild( document.createElement( "discs" ) ); foreach ( const Disc& disc, discs ) { disc.addToDocument( document ); } return document; } DiscList Disc::fromDocument( const QDomDocument& document ) { DiscList discs; const QDomNodeList nodes = document.documentElement().childNodes(); for ( int i = 0; i < nodes.count(); i++ ) { discs << Disc( nodes.at( i ).toElement() ); } return discs; } QByteArray Disc::toByteArray( const DiscList& discs ) { return toDocument( discs ).toString().toUtf8(); } DiscList Disc::fromByteArray( const QByteArray& data ) { QDomDocument document( WBFS_DISC_XML_NAME ); document.setContent( data ); return fromDocument( document ); } ./qwbfsmanager-1.2.1-src/qwbfs/src/models/DiscModel.cpp0000644000175000017520000004137211534466576022311 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : DiscModel.cpp ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #include "DiscModel.h" #include "qwbfsdriver/Driver.h" #include "ListView.h" #include #include #include #include #include #include #define URLS_FORMAT "text/uri-list" #define WBFS_DISCS_FORMAT "xml/wbfs-disc-list" using namespace QWBFS::Model; // Sorter bool SelectionRangePairLessThanSorter::operator()( const DiscModel::PairIntInt& left, const DiscModel::PairIntInt& right ) const { return left.first < right.first; } bool SelectionRangePairGreaterThanSorter::operator()( const DiscModel::PairIntInt& left, const DiscModel::PairIntInt& right ) const { return left.first > right.first; } HashLessThanSorter::HashLessThanSorter( int column ) { c = column; } bool HashLessThanSorter::operator()( const QWBFS::Model::Disc& left, const QWBFS::Model::Disc& right ) const { int compare = 0; switch ( c ) { case 0: compare = 0; break; case 1: compare = QString::compare( left.id, right.id, Qt::CaseInsensitive ); break; case 2: compare = QString::compare( left.title, right.title, Qt::CaseInsensitive ); break; case 3: compare = left.size == right.size ? 0 : ( left.size < right.size ? -1 : 1 ); break; case 4: compare = QString::compare( QWBFS::Driver::regionToString( left.region ), QWBFS::Driver::regionToString( right.region ), Qt::CaseInsensitive ); break; case 5: compare = QString::compare( left.origin, right.origin, Qt::CaseInsensitive ); break; } return compare == 0 ? false : compare < 0; } HashGreaterThanSorter::HashGreaterThanSorter( int column ) { c = column; } bool HashGreaterThanSorter::operator()( const QWBFS::Model::Disc& left, const QWBFS::Model::Disc& right ) const { int compare = 0; switch ( c ) { case 0: compare = 0; break; case 1: compare = QString::compare( left.id, right.id, Qt::CaseInsensitive ); break; case 2: compare = QString::compare( left.title, right.title, Qt::CaseInsensitive ); break; case 3: compare = left.size == right.size ? 0 : ( left.size < right.size ? -1 : 1 ); break; case 4: compare = QString::compare( QWBFS::Driver::regionToString( left.region ), QWBFS::Driver::regionToString( right.region ), Qt::CaseInsensitive ); break; case 5: compare = QString::compare( left.origin, right.origin, Qt::CaseInsensitive ); break; } return compare == 0 ? false : compare > 0; } // DiscModel QStringList DiscModel::mMimeTypes = QStringList() << URLS_FORMAT << WBFS_DISCS_FORMAT; DiscModel::DiscModel( ListView* parent, QWBFS::Driver* driver ) : QAbstractItemModel( parent ) { Q_ASSERT( parent ); mListView = parent; mDriver = driver; } DiscModel::~DiscModel() { } int DiscModel::columnCount( const QModelIndex& parent ) const { return parent.isValid() ? 0 : DISC_MODEL_COLUMN_COUNT; } QVariant DiscModel::data( const QModelIndex& index, int role ) const { switch ( role ) { case DiscModel::ListModeSizeHintRole: return QSize( -1, 37 ); case DiscModel::IconModeSizeHintRole: return QSize( 120, 120 ); case DiscModel::CoverFlowModeSizeHintRole: return QSize( 180, 240 ); } if ( !index.isValid() || index.row() < 0 || index.row() >= mDiscs.count() || index.column() < 0 || index.column() >= DISC_MODEL_COLUMN_COUNT ) { return QVariant(); } const QWBFS::Model::Disc disc = mDiscs.value( index.row() ); switch ( role ) { case Qt::DecorationRole: { if ( index.column() == 0 ) { return coverPixmap( disc.id, data( index, DiscModel::CoverFlowModeSizeHintRole ).toSize() ); } break; } case Qt::DisplayRole: { switch ( index.column() ) { case 0: return QVariant(); case 1: return disc.id; case 2: return pCoreUtils::toTitleCase( disc.title ); case 3: return pCoreUtils::fileSizeToString( disc.size ); case 4: return QWBFS::Driver::regionToString( disc.region ); case 5: return disc.origin; } break; } case Qt::ToolTipRole: { QStringList values; if ( !disc.id.isEmpty() ) { values << tr( "Id: %1" ).arg( disc.id ); } values << tr( "Title: %1" ).arg( pCoreUtils::toTitleCase( disc.title ) ); values << tr( "Size: %1" ).arg( pCoreUtils::fileSizeToString( disc.size ) ); values << tr( "Origin: %1" ).arg( disc.origin ); values << tr( "Region: %1" ).arg( QWBFS::Driver::regionToString( disc.region ) ); values << tr( "State: %1" ).arg( QWBFS::Driver::stateToString( QWBFS::Driver::State( disc.state ) ) ); values << tr( "Error: %1" ).arg( QWBFS::Driver::errorToString( QWBFS::Driver::Error( disc.error ) ) ); return values.join( "\n" ); } } return QVariant(); } QModelIndex DiscModel::index( int row, int column, const QModelIndex& parent ) const { if ( parent.isValid() || row < 0 || row >= mDiscs.count() || column < 0 || column >= DISC_MODEL_COLUMN_COUNT ) { return QModelIndex(); } return createIndex( row, column, row ); } QModelIndex DiscModel::parent( const QModelIndex& index ) const { Q_UNUSED( index ); return QModelIndex(); } int DiscModel::rowCount( const QModelIndex& parent ) const { return parent.isValid() ? 0 : mDiscs.count(); } bool DiscModel::hasChildren( const QModelIndex& parent ) const { return parent.isValid() ? false : !mDiscs.isEmpty(); } Qt::ItemFlags DiscModel::flags( const QModelIndex& index ) const { Qt::ItemFlags f = QAbstractItemModel::flags( index ); if ( index.isValid() ) { f |= Qt::ItemIsDragEnabled; } else { f |= Qt::ItemIsDropEnabled; } return f; } bool DiscModel::removeRows( int row, int count, const QModelIndex& parent ) { count = qBound( count, count, mDiscs.count() -row ); // -1 if ( parent.isValid() || row >= mDiscs.count() || count <= 0 ) { return false; } beginRemoveRows( QModelIndex(), row, row +count -1 ); for ( int i = 0; i < count; i++ ) { mIndexes.remove( mDiscs.at( i ).id ); mDiscs.removeAt( row ); } endRemoveRows(); emit countChanged( mDiscs.count() ); return true; } bool DiscModel::setData( const QModelIndex& index, const QVariant& value, int role ) { if ( !index.isValid() || index.row() < 0 || index.row() >= mDiscs.count() || index.column() < 0 || index.column() >= DISC_MODEL_COLUMN_COUNT ) { return false; } switch ( role ) { case Qt::DecorationRole: { switch ( index.column() ) { case 0: break; default: return false; } break; } case Qt::DisplayRole: { switch ( index.column() ) { case 0: return false; case 1: mDiscs[ index.row() ].id = value.toString(); break; case 2: mDiscs[ index.row() ].title = value.toString(); break; case 3: mDiscs[ index.row() ].size = value.toUInt(); break; case 4: mDiscs[ index.row() ].region = value.toInt(); break; case 5: mDiscs[ index.row() ].origin = value.toString(); break; } break; } default: return false; } emit dataChanged( index.sibling( index.row(), 0 ), index.sibling( index.row(), DISC_MODEL_COLUMN_COUNT -1 ) ); return true; } QVariant DiscModel::headerData( int section, Qt::Orientation orientation, int role ) const { if ( orientation == Qt::Horizontal && section >= 0 && section < DISC_MODEL_COLUMN_COUNT ) { switch ( role ) { case Qt::DisplayRole: { switch ( section ) { case 0: return tr( "Image" ); case 1: return tr( "Id" ); case 2: return tr( "Title" ); case 3: return tr( "Size" ); case 4: return tr( "Region" ); case 5: return tr( "Origin" ); } break; } case Qt::ToolTipRole: { switch ( section ) { case 0: break; // nothing to sort case 1: return tr( "Sort by Id" ); case 2: return tr( "Sort by Title" ); case 3: return tr( "Sort by Size" ); case 4: return tr( "Sort by Region" ); case 5: break; // nothing to sort } break; } } } return QAbstractItemModel::headerData( section, orientation, role ); } void DiscModel::sort( int column, Qt::SortOrder order ) { /* Call beginLayoutChanged() Remember the QModelIndex that will change Update your internal data Call changePersistentIndex() Call endLayoutChanged() */ emit layoutAboutToBeChanged(); QModelIndexList oldIndexes = persistentIndexList(); QWBFS::Model::DiscList newDiscs = mDiscs; QModelIndexList newIndexes; QHash mapping; // old row, new row for ( int i = 0; i < mDiscs.count(); i++ ) { mapping[ i ] = i; } if ( order == Qt::AscendingOrder ) { HashLessThanSorter lesser( column ); qSort( newDiscs.begin(), newDiscs.end(), lesser ); } else { HashGreaterThanSorter greater( column ); qSort( newDiscs.begin(), newDiscs.end(), greater ); } for ( int i = 0; i < newDiscs.count(); i++ ) { mapping[ index( newDiscs[ i ] ).row() ] = i; } foreach ( const QModelIndex& index, oldIndexes ) { newIndexes << createIndex( mapping[ index.row() ], index.column(), mapping[ index.row() ] ); } mDiscs = newDiscs; changePersistentIndexList( oldIndexes, newIndexes ); emit layoutChanged(); } Qt::DropActions DiscModel::supportedDropActions() const { return Qt::CopyAction; } bool DiscModel::dropMimeData( const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent ) { Q_UNUSED( action ); Q_UNUSED( row ); Q_UNUSED( column ); Q_UNUSED( parent ); QSet discs; if ( data->formats().contains( WBFS_DISCS_FORMAT ) ) { discs = QWBFS::Model::Disc::fromByteArray( data->data( WBFS_DISCS_FORMAT ) ).toSet(); } else if ( data->formats().contains( URLS_FORMAT ) ) { foreach ( const QUrl& url, data->urls() ) { const QFileInfo file( url.toLocalFile() ); if ( !file.isDir() && file.exists() ) { const QString fileName = QFileInfo( file.isSymLink() ? file.symLinkTarget() : file.absoluteFilePath() ).canonicalFilePath(); QWBFS::Model::Disc disc; const int result = mDriver->discImageInfo( fileName, disc ); if ( result != Driver::Ok ) { continue; } discs << disc; } } } // remove clones foreach ( const QWBFS::Model::Disc& disc, mDiscs ) { if ( discs.contains( disc ) ) { discs.remove( disc ); } } // remove drop from same view if ( mDriver ) { foreach ( const QWBFS::Model::Disc& disc, discs ) { if ( disc.origin == mDriver->partition() ) { discs.remove( disc ); } } } if ( discs.isEmpty() ) { return false; } addDiscs( discs.toList() ); return true; } QMimeData* DiscModel::mimeData( const QModelIndexList& indexes ) const { if ( indexes.isEmpty() || !mDriver || ( mDriver && !mDriver->isOpen() ) ) { return 0; } QWBFS::Model::DiscList discs; foreach ( const QModelIndex& index, indexes ) { discs << disc( index ); } QMimeData* data = new QMimeData; data->setData( WBFS_DISCS_FORMAT, QWBFS::Model::Disc::toByteArray( discs ) ); return data; } QStringList DiscModel::mimeTypes() const { return mMimeTypes; } QPixmap DiscModel::coverPixmap( const QString& id, const QSize& size, bool coverFlow ) const { if ( view()->viewIconType() == QWBFS::WiiTDB::Cover || coverFlow ) { return QWBFS::WiiTDB::coverBoxPixmap( id, view()->cacheManager(), size ); } return QWBFS::WiiTDB::coverDiscPixmap( id, view()->cacheManager(), size ); } QPixmap DiscModel::statePixmap( int state, const QSize& size ) const { const QString url = state == QWBFS::Driver::Success ? ":/icons/256/success.png" : ":/icons/256/error.png"; const QString key = QString( "%1-%2-%3" ).arg( url ).arg( size.width() ).arg( size.height() ); QPixmap pixmap; if ( !QPixmapCache::find( key, pixmap ) ) { if ( pixmap.load( url ) ) { pixmap = pixmap.scaled( size, Qt::KeepAspectRatio, Qt::SmoothTransformation ); QPixmapCache::insert( key, pixmap ); } } return pixmap; } ListView* DiscModel::view() const { return mListView; } void DiscModel::insertDiscs( int index, const QWBFS::Model::DiscList& discs ) { index = qBound( 0, index, rowCount() ); if ( discs.isEmpty() ) { return; } beginInsertRows( QModelIndex(), index, discs.count() -1 ); for ( int i = 0; i < discs.count(); i++ ) { const QWBFS::Model::Disc& disc = discs.at( i ); mDiscs.insert( i +index, discs.at( i ) ); mIndexes[ disc.id ] = this->index( disc ); } endInsertRows(); emit countChanged( mDiscs.count() ); } void DiscModel::addDiscs( const QWBFS::Model::DiscList& discs ) { insertDiscs( rowCount(), discs ); } void DiscModel::setDiscs( const QWBFS::Model::DiscList& discs ) { clear(); addDiscs( discs ); } void DiscModel::setDisc( const QModelIndex& index, const QWBFS::Model::Disc& disc ) { if ( !index.isValid() || index.row() < 0 || index.row() >= mDiscs.count() || index.column() < 0 || index.column() >= DISC_MODEL_COLUMN_COUNT ) { return; } mDiscs[ index.row() ] = disc; mIndexes[ disc.id ] = this->index( disc ); emit dataChanged( index.sibling( index.row(), 0 ), index.sibling( index.row(), DISC_MODEL_COLUMN_COUNT -1 ) ); } QWBFS::Model::DiscList DiscModel::discs() const { return mDiscs; } QWBFS::Model::DiscList DiscModel::discs( const QModelIndexList& indexes ) { QWBFS::Model::DiscList discs; QSet rows; foreach ( const QModelIndex& index, indexes ) { if ( !rows.contains( index.row() ) ) { rows << index.row(); discs << disc( index ); } } return discs; } QWBFS::Model::DiscList DiscModel::discs( const QItemSelection& selection ) { return discs( selection.indexes() ); } QWBFS::Model::Disc DiscModel::disc( const QModelIndex& index ) const { return mDiscs.value( index.row() ); } QModelIndex DiscModel::index( const QString& id ) const { return mIndexes.value( id ); } QModelIndex DiscModel::index( const QWBFS::Model::Disc& disc, int column ) const { const int index = mDiscs.indexOf( disc ); return index == -1 ? QModelIndex() : createIndex( index, column, index ); } QString DiscModel::discId( const QModelIndex& index ) const { return disc( index ).id; } void DiscModel::removeSelection( const QItemSelection& _selection ) { QList selection; // get pair selection foreach ( const QItemSelectionRange& range, _selection ) { selection << qMakePair( range.top(), range.height() ); } // reverse order to remove last items first SelectionRangePairGreaterThanSorter sorter; qSort( selection.begin(), selection.end(), sorter ); // remove items foreach ( const DiscModel::PairIntInt& pair, selection ) { removeRows( pair.first, pair.second, QModelIndex() ); } } void DiscModel::updateDisc( const QWBFS::Model::Disc& disc ) { const int row = mDiscs.indexOf( disc ); if ( row != -1 ) { const QModelIndex index = this->index( disc ); mDiscs[ row ] = disc; emit dataChanged( index.sibling( index.row(), 0 ), index.sibling( index.row(), DISC_MODEL_COLUMN_COUNT -1 ) ); } } qint64 DiscModel::size() const { qint64 size = 0; foreach ( const QWBFS::Model::Disc& disc, mDiscs ) { size += disc.size; } return size; } void DiscModel::clear() { if ( mDiscs.isEmpty() ) { return; } beginRemoveRows( QModelIndex(), 0, mDiscs.count() -1 ); mDiscs.clear(); mIndexes.clear(); endRemoveRows(); emit countChanged( mDiscs.count() ); } ./qwbfsmanager-1.2.1-src/qwbfs/src/models/Disc.h0000644000175000017520000000572211543625160020756 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : Disc.h ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #ifndef DISC_H #define DISC_H #include #include #include namespace QWBFS { namespace Model { typedef QList DiscList; struct Disc { Disc( const QDomElement& element = QDomElement() ); Disc( const QString& filePath ); bool operator==( const Disc& other ) const; bool isValid() const; bool hasError() const; QString baseName( const QString& invalidChars = QString::null ) const; void addToDocument( QDomDocument& document ) const; void readFromElement( const QDomElement& element ); static QString cleanupGameTitle( const QString& title, const QString& invalidChars ); static QDomDocument toDocument( const DiscList& discs ); static DiscList fromDocument( const QDomDocument& document ); static QByteArray toByteArray( const DiscList& discs ); static DiscList fromByteArray( const QByteArray& data ); QString id; QString title; quint32 size; QString origin; int region; int state; int error; }; inline uint qHash( const Disc& disc ) { return qHash( QString( "%1 - %2" ).arg( disc.id ).arg( disc.origin ) ); } }; // Model }; // QWBFS #endif // DISC_H ./qwbfsmanager-1.2.1-src/qwbfs/src/models/DiscDelegate.h0000644000175000017520000000552311534023323022401 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : DiscDelegate.h ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #ifndef DISCDELEGATE_H #define DISCDELEGATE_H #include class pNetworkAccessManager; namespace QWBFS { namespace Model { class DiscModel; class DiscDelegate : public QStyledItemDelegate { Q_OBJECT public: DiscDelegate( QWBFS::Model::DiscModel* parent, pNetworkAccessManager* cache ); virtual ~DiscDelegate(); virtual void paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const; virtual QSize sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index ) const; protected: QWBFS::Model::DiscModel* mModel; pNetworkAccessManager* mCache; void paintFrame( QPainter* painter, const QStyleOptionViewItemV4& option, bool pair = true ) const; void paintList( QPainter* painter, const QStyleOptionViewItemV4& option, const QModelIndex& index ) const; void paintIcon( QPainter* painter, const QStyleOptionViewItemV4& option, const QModelIndex& index ) const; }; }; // Model }; // QWBFS #endif // DISCDELEGATE_H ./qwbfsmanager-1.2.1-src/qwbfs/src/models/pPartition.h0000644000175000017520000001135211543625217022224 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pPartition.h ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PPARTITION_H #define PPARTITION_H /*! \file pPartition.h \brief An object that represent a partition on the system. \author Filipe Azevedo aka Nox P\@sNox */ #include #include /*! \ingroup Core \class pPartition \brief An object that represent a partition on the system. */ class pPartition { public: /*! This enum defines the differents types of device. */ enum Type { Device, /*!< Generic device. */ Disc /*!< CdRom / DVDRom / BluRay device. */ }; /*! This enum defines the differents types of property. */ enum Property { Label, /*!< The partition label. */ DevicePath, /*!< The device path like /dev/sda1, C:\... */ FileSystem, /*!< The file system name. */ TotalSize, /*!< The total size. */ UsedSize, /*!< The used size. */ FreeSize, /*!< The free size. */ MountPoints, /*!< The mount points. */ //DeviceType, DeviceVendor, /*!< The device vendor */ DeviceModel, /*!< The device model. */ FileSystemId, /*!< The file system id. */ LastCheck, /*!< The last date time the partition was checked. */ DisplayText, /*!< The display text. */ LastProperty = DisplayText /*!< The last available property. */ }; /*! Create a partition for device at \a devicePath. The device validity is checked according to \a checkValidity beefore setting the internal property. */ pPartition( const QString& devicePath = QString::null, bool checkValidity = true ); /*! Check if \a other is same partition as this. The test is only done against the device path. */ bool operator==( const pPartition& other ) const; /*! Set the properties map. */ void setProperties( const QVariantMap& properties ); /*! Return the properties map. */ QVariantMap properties() const; /*! Return the content of the property \a property. */ QVariant property( pPartition::Property property ) const; /*! Return the content of the property \a property. This allow to query non standard properties. */ QVariant property( const QString& property ) const; /*! Update the partitions sizes. The used spaces is computed by the formula: total -free. */ void updateSizes( qint64 total, qint64 free ); /*! Return true if the partition is valid else false. */ bool isValid() const; /*! Return true if the partition is a custom one else a false one. A partition is custom if it's internal device path is equal to the device path property. A non custom partition has its internal device path to null which is differnt than the device path property.. */ bool isCustom() const; /*! Return the device path, the property is queried first and if it's empty it return the internal device path. */ QString devicePath() const; /*! Check is the partition \a devicePath is a WBFS partition. */ static bool isWBFSPartition( const QString& devicePath ); /*! Return true if the partition \a devicePath is a valid partition. */ static bool isValidDevicePath( const QString& devicePath ); /*! Return the file system name from the partition \a id. The device \a type is checked. Some Ids can represent differents kinds of file system, in this case \a full will return the concatened of all possible choice, else only the first one. */ static QString fileSystemIdToString( qint64 id, pPartition::Type type = pPartition::Device, bool full = false ); protected: QVariantMap mProperties; QString mDevicePath; void updateLastChecked(); QString generateDisplayText() const; QString value( const QString& key ) const; }; typedef QList pPartitionList; #endif // PPARTITION_H ./qwbfsmanager-1.2.1-src/qwbfs/src/models/pPartitionModel.h0000644000175000017520000000746411543625217023216 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pPartitionModel.h ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PPARTITIONMODEL_H #define PPARTITIONMODEL_H /*! \file pPartitionModel.h \brief A model presenting the available partitions. \author Filipe Azevedo aka Nox P\@sNox */ #include #include "pPartition.h" /*! \ingroup Core \class pPartitionModel \brief A model presenting the available partitions. */ class pPartitionModel : public QAbstractTableModel { Q_OBJECT friend class PartitionComboBox; public: /*! Create an instance of the model having \a parent as parent. */ pPartitionModel( QObject* parent = 0 ); /*! Destroys the model instance. */ virtual ~pPartitionModel(); /*! Reimplemented. */ virtual int columnCount( const QModelIndex& parent = QModelIndex() ) const; /*! Reimplemented. */ virtual QVariant data( const QModelIndex& index, int role = Qt::DisplayRole ) const; /*! Reimplemented. */ virtual int rowCount( const QModelIndex& parent = QModelIndex() ) const; /*! Reimplemented. */ virtual QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const; /*! Reimplemented. */ virtual bool insertRow( int row, const QModelIndex& parent = QModelIndex() ); /*! Reimplemented. */ virtual bool insertRows( int row, int count, const QModelIndex& parent = QModelIndex() ); //virtual void sort ( int column, Qt::SortOrder order = Qt::AscendingOrder ) /*! Return the pPartition at \a index. */ pPartition partition( const QModelIndex& index ) const; /*! Return the QModelIndex of \a partition for \a column. */ QModelIndex index( const pPartition& partition, int column = 0 ) const; /*! Add \a partition if it does not already exists and is valid. */ void addPartition( const QString& partition ); /*! Add \a partitions if they are not exists and are valid. */ void addPartitions( const QStringList& partitions ); /*! Update \a partition. */ void updatePartition( const pPartition& partition ); /*! Remove \a partition. */ void removePartition( const QString& partition ); /*! Return the list of all partitions. */ pPartitionList partitions() const; /*! Return the list of custom partitions. \see pPartition::isCustom(). */ QStringList customPartitions() const; void dump() const; public slots: /*! Update the list of partitions. \note Linux and Mac OS X should not need this as they are automatically updated by listening the OS events. */ void update(); protected: pPartitionList mPartitions; mutable void* mData; virtual void platformInit(); virtual void platformDeInit(); virtual void platformUpdate(); }; #endif // PPARTITIONMODEL_H ./qwbfsmanager-1.2.1-src/qwbfs/src/models/pPartitionModel_linux.cpp0000644000175000017520000002012611543625217024756 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pPartitionModel_linux.cpp ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pPartitionModel.h" //http://svn.openpilot.org/browse/OpenPilot/trunk/ground/openpilotgcs/src/plugins/rawhid/usbmonitor.h?r=3021 #include #include #include #include #include #include #include #include #include class DisksSession : public QObject { Q_OBJECT public: DisksSession( pPartitionModel* model ) : QObject( model ) { mModel = model; mContext = udev_new(); mMonitor = udev_monitor_new_from_netlink( mContext, "udev" ); if ( !mContext ) { qWarning( "%s: UDev not valid.", Q_FUNC_INFO ); return; } if ( !mMonitor ) { qWarning( "%s: UDevMonitor not valid.", Q_FUNC_INFO ); return; } udev_monitor_filter_add_match_subsystem_devtype( mMonitor, "block", NULL ); udev_monitor_enable_receiving( mMonitor ); mNotifier = new QSocketNotifier( udev_monitor_get_fd( mMonitor ), QSocketNotifier::Read, this ); connect( mNotifier, SIGNAL( activated( int ) ), this, SLOT( deviceEventReceived() ) ); start(); } virtual ~DisksSession() { udev_monitor_unref( mMonitor ); udev_unref( mContext ); } pPartition createPartition( struct udev_device* device ) { struct udev_list_entry* entries = udev_device_get_properties_list_entry( device ); struct udev_list_entry* entry = 0; pPartition partition; QVariantMap properties; udev_list_entry_foreach( entry, entries ) { const QString name = udev_list_entry_get_name( entry ); const QString value = QString::fromLocal8Bit( udev_device_get_property_value( device, name.toLocal8Bit().constData() ) ); properties[ name ] = value; } if ( properties.contains( "UDISKS_PARTITION_TYPE" ) ) { properties[ "UDISKS_PARTITION_TYPE" ] = properties[ "UDISKS_PARTITION_TYPE" ].toString().toLongLong( 0, 16 ); } const QString devName = QFileInfo( properties[ "DEVNAME" ].toString() ).fileName(); QDBusMessage question = QDBusMessage::createMethodCall( "org.freedesktop.UDisks", QString( "/org/freedesktop/UDisks/devices/%1" ).arg( devName ), "org.freedesktop.DBus.Properties", "Get" ); question << "org.freedesktop.UDisks.Device" << "DeviceMountPaths"; QDBusMessage answer = QDBusConnection::systemBus().call( question, QDBus::Block, 1 ); QStringList mountPoints; foreach ( const QVariant& variant, answer.arguments() ) { const QStringList values = variant.value().variant().toStringList(); if ( !values.isEmpty() ) { mountPoints << values; } } if ( pPartition::isWBFSPartition( properties[ "DEVNAME" ].toString() ) ) { properties[ "UDISKS_PARTITION_TYPE" ] = 0x25; properties[ "ID_FS_TYPE" ] = pPartition::fileSystemIdToString( 0x25 ); } qint64 total = properties.value( "UDISKS_PARTITION_SIZE", -1 ).toLongLong(); qint64 free = -1; if ( !mountPoints.isEmpty() ) { struct statfs stats; if ( statfs( qPrintable( mountPoints.first() ), &stats ) == 0 ) { /*const qint64 total = stats.f_blocks *stats.f_bsize; partition.used = total -( stats.f_bfree *stats.f_bsize ); partition.free = partition.total -partition.used;*/ total = stats.f_blocks *stats.f_bsize; free = stats.f_bfree *stats.f_bsize; } properties[ "UDISKS_PARTITION_MOUNT_POINTS" ] = mountPoints; } properties[ "REMOVABLE" ] = "0"; // Check removable attr struct udev_device* parent = 0; if ( properties[ "DEVTYPE" ] == "partition" ) { parent = udev_device_get_parent( device ); } else if ( properties[ "DEVTYPE" ] == "disk" ) { parent = device; // disk without partitions } if ( parent != 0 ) { const char* value = udev_device_get_sysattr_value( parent, "removable" ); if ( value ) { properties[ "REMOVABLE" ] = QString::fromLocal8Bit( value ); } } partition.setProperties( properties ); partition.updateSizes( total, free ); return partition; } protected: void start() { struct udev_enumerate* enumerate = udev_enumerate_new( mContext ); if ( !enumerate ) { qWarning( "%s: Can't enumerate.", Q_FUNC_INFO ); return; } udev_enumerate_add_match_subsystem( enumerate, "block" ); udev_enumerate_scan_devices( enumerate ); struct udev_device* device = 0; struct udev_list_entry* entries = udev_enumerate_get_list_entry( enumerate ); struct udev_list_entry* entry = 0; udev_list_entry_foreach( entry, entries ) { device = udev_device_new_from_syspath( mContext, udev_list_entry_get_name( entry ) ); if ( !device ) { continue; } diskAppeared( device ); udev_device_unref( device ); } udev_enumerate_unref( enumerate ); } protected slots: void deviceEventReceived() { struct udev_device* device = udev_monitor_receive_device( mMonitor ); if ( device ) { const QString action = QString( udev_device_get_action( device ) ); const QString devtype = QString( udev_device_get_devtype( device ) ); if ( action == "add" ) { diskAppeared( device ); } else if ( action == "change" ) { diskChanged( device ); } else if ( action == "remove" ){ diskDisappeared( device ); } else { qWarning() << Q_FUNC_INFO << "------- Got Device Event" << "type" << devtype << " - action" << action; } udev_device_unref( device ); } else { qWarning( "%s: No Device. An error occured.", Q_FUNC_INFO ); } } void diskAppeared( struct udev_device* device ) { const pPartition partition = createPartition( device ); if ( partition.properties()[ "DEVTYPE" ] == "partition" || ( partition.properties()[ "ID_TYPE" ] == "cd" && partition.properties()[ "ID_FS_USAGE" ] == "filesystem" ) ) { mModel->updatePartition( partition ); } } void diskChanged( struct udev_device* device ) { diskAppeared( device ); } void diskDisappeared( struct udev_device* device ) { const QString devicePath = QString::fromLocal8Bit( udev_device_get_property_value( device, "DEVNAME" ) ); mModel->removePartition( devicePath ); } protected: pPartitionModel* mModel; udev* mContext; udev_monitor* mMonitor; QSocketNotifier* mNotifier; }; void pPartitionModel::platformInit() { emit layoutAboutToBeChanged(); mData = new DisksSession( this ); emit layoutChanged(); } void pPartitionModel::platformDeInit() { delete (DisksSession*)mData; } void pPartitionModel::platformUpdate() { // Code commented as the linux implementation has the concept of live auto update, thanks to UDev librarie :) /*const QStringList partitions = customPartitions(); emit layoutAboutToBeChanged(); delete (DisksSession*)mData; mPartitions.clear(); foreach ( const QString& partition, partitions ) { mPartitions << pPartition( partition ); } mData = new DisksSession( this ); emit layoutChanged();*/ } #include "pPartitionModel_linux.moc" ./qwbfsmanager-1.2.1-src/qwbfs/src/models/PartitionDelegate.cpp0000644000175000017520000001735511543625217024043 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : PartitionDelegate.cpp ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ /**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : PartitionDelegate.cpp ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #include "PartitionDelegate.h" #include "models/pPartitionModel.h" #include "qwbfsdriver/Driver.h" #include #include #include #include #include #define COMBOBOX_ITEM_HEIGHT 30 PartitionDelegate::PartitionDelegate( pPartitionModel* parent ) : QStyledItemDelegate( parent ) { Q_ASSERT( parent ); mModel = parent; mStyle = QStyleFactory::create( "plastique" ); } PartitionDelegate::~PartitionDelegate() { } void PartitionDelegate::paint( QPainter* painter, const QStyleOptionViewItem& _option, const QModelIndex& index ) const { QStyleOptionViewItemV4 option = _option; initStyleOption( &option, index ); option.palette = mStyle->standardPalette(); #if defined( Q_OS_MAC ) option.font.setPointSize( option.font.pointSize() -2 ); #endif const bool selected = option.state & QStyle::State_Selected; const bool hovered = option.state & QStyle::State_MouseOver; const int margin = option.widget->inherits( "QAbstractItemView" ) ? 3 : 0; const qint64 wbfsFSId = 0x25; pPartition partition = mModel->partition( index ); if ( partition.property( pPartition::FileSystemId ).toLongLong() == wbfsFSId ) { // update wbfs partitions informations if ( partition.property( pPartition::LastCheck ).toDateTime() < QDateTime::currentDateTime() && ( partition.property( pPartition::UsedSize ).toLongLong() == -1 || partition.property( pPartition::FreeSize ).toLongLong() == -1 ) ) { // use a scope to avoid problems with windows partition read locked { bool created = false; QWBFS::Partition::Handle handle = QWBFS::Driver::getHandle( partition.property( pPartition::DevicePath ).toString(), &created ); QWBFS::Driver driver( handle ); QWBFS::Partition::Status status; driver.status( status ); partition.updateSizes( status.size, status.free ); if ( created ) { QWBFS::Driver::closeHandle( handle ); } } mModel->updatePartition( partition ); } } int total = 100; int used = ( (qreal)partition.property( pPartition::UsedSize ).toLongLong() /(qreal)partition.property( pPartition::TotalSize ).toLongLong() ) *(qreal)100; QStyleOptionProgressBarV2 pbOption; pbOption.initFrom( option.widget ); pbOption.state = option.state; pbOption.palette = option.palette; pbOption.rect = option.rect.adjusted( margin, margin, -margin, -margin ); pbOption.bottomToTop = false; pbOption.invertedAppearance = false; pbOption.orientation = Qt::Horizontal; pbOption.maximum = total; pbOption.minimum = 0; pbOption.progress = used; pbOption.text = QString::null; pbOption.textAlignment = Qt::AlignCenter; pbOption.textVisible = false; pbOption.palette.setColor( QPalette::Highlight, QColor( 0, 160, 0, 100 ) ); QStyleOptionButton bOption; bOption.initFrom( option.widget ); bOption.state = option.state; bOption.palette = option.palette; bOption.rect = option.rect.adjusted( margin, margin, -margin, -margin ); //bOption.icon = partition.fileSystem == "WBFS" ? QIcon( ":/icons/256/wii.png" ) : partition.icon(); bOption.iconSize = QSize( bOption.rect.height() -5, bOption.rect.height() -5 ); bOption.text = QString( "%1 - %2" ) .arg( partition.property( pPartition::DisplayText ).toString() ) .arg( pCoreUtils::fileSizeToString( partition.property( pPartition::TotalSize ).toLongLong() ) ) ; if ( selected || hovered ) { paintFrame( painter, &option, selected ); } painter->setFont( option.font ); mStyle->drawControl( QStyle::CE_ProgressBar, &pbOption, painter, option.widget ); mStyle->drawControl( QStyle::CE_PushButtonLabel, &bOption, painter, option.widget ); } QSize PartitionDelegate::sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index ) const { Q_UNUSED( option ); Q_UNUSED( index ); return QSize( -1, COMBOBOX_ITEM_HEIGHT ); } void PartitionDelegate::paintFrame( QPainter* painter, const QStyleOption* option, bool pair ) const { const int corner = 5; const QRect r = option->rect.adjusted( 0, 0, -1, -1 ); const QPalette::ColorRole role = pair ? QPalette::Highlight : QPalette::Button; QColor strokeColor = option->palette.color( role ).darker(); QColor fillColor1 = option->palette.color( role ).lighter(); QColor fillColor2 = option->palette.color( role ); if ( option->state & QStyle::State_MouseOver ) { const int factor = 110; strokeColor = strokeColor.darker( factor ); fillColor1 = fillColor1.darker( factor ); fillColor2 = fillColor2.darker( factor ); } QLinearGradient gradient( option->rect.topLeft(), option->rect.bottomLeft() ); gradient.setColorAt( 0, fillColor1 ); gradient.setColorAt( 1, fillColor2 ); painter->setPen( strokeColor ); painter->setBrush( gradient ); painter->drawRoundedRect( r, corner, corner ); } ./qwbfsmanager-1.2.1-src/qwbfs/src/models/pPartition.cpp0000644000175000017520000005273211545577341022574 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pPartition.cpp ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pPartition.h" #include #include #include #include #if defined( Q_OS_WIN ) #include #include #include #endif #define PROPERTY_DISPLAY_TEXT "_DISPLAY_TEXT" #define PROPERTY_LAST_CHECK "_LAST_CHECK" pPartition::pPartition( const QString& devicePath, bool checkValidity ) { if ( !checkValidity || ( checkValidity && isValidDevicePath( devicePath ) ) ) { mDevicePath = devicePath; } } bool pPartition::operator==( const pPartition& other ) const { return devicePath() == other.devicePath(); } void pPartition::setProperties( const QVariantMap& properties ) { mProperties = properties; mDevicePath.clear(); mProperties[ PROPERTY_DISPLAY_TEXT ] = generateDisplayText(); updateLastChecked(); } QVariantMap pPartition::properties() const { return mProperties; } QVariant pPartition::property( pPartition::Property property ) const { #if defined( Q_OS_MAC ) switch ( property ) { case Label: return mProperties.value( "DAVolumeName", value( "DAMediaName" ) ).toString().simplified(); case DevicePath: return ( mDevicePath.isEmpty() ? QString( "/dev/%1" ).arg( value( "DAMediaBSDName" ) ) : mDevicePath ).simplified(); case TotalSize: return mProperties.value( "DAMediaSize", -1 ); case UsedSize: return mProperties.value( "DAMediaUsed", -1 ); case FreeSize: return mProperties.value( "DAMediaFree", -1 ); /*case DeviceType: return mProperties.value( PROPERTY_DEVICE_TYPE );*/ case MountPoints: return mProperties.value( "DAVolumePath" ); case FileSystem: return mProperties.value( "DAVolumeKind", value( "DAMediaContent" ) ).toString().toUpper().replace( "_", " " ).simplified(); case FileSystemId: return mProperties.value( "DAVolumeKindId" ).toString().toLongLong(); case DeviceVendor: return mProperties.value( "DADeviceVendor" ).toString().replace( "_", " " ).simplified(); case DeviceModel: return mProperties.value( "DADeviceModel" ).toString().replace( "_", " " ).simplified(); case DisplayText: return mProperties.value( PROPERTY_DISPLAY_TEXT ).toString().simplified(); case LastCheck: return mProperties.value( PROPERTY_LAST_CHECK ); } #elif defined( Q_OS_LINUX ) switch ( property ) { case Label: return mProperties.value( "ID_FS_LABEL" ).toString().simplified(); case DevicePath: return ( mDevicePath.isEmpty() ? value( "DEVNAME" ) : mDevicePath ).simplified(); case TotalSize: return mProperties.value( "UDISKS_PARTITION_SIZE", -1 ); case UsedSize: return mProperties.value( "UDISKS_PARTITION_USED", -1 ); case FreeSize: return mProperties.value( "UDISKS_PARTITION_FREE", -1 ); /*case DeviceType: return mProperties.value( PROPERTY_DEVICE_TYPE );*/ case MountPoints: return mProperties.value( "UDISKS_PARTITION_MOUNT_POINTS" ); case FileSystem: return mProperties.value( "ID_FS_TYPE" ).toString().toUpper().replace( "_", " " ).simplified(); case FileSystemId: return mProperties.value( "UDISKS_PARTITION_TYPE" ).toString().toLongLong(); case DeviceVendor: return mProperties.value( "ID_VENDOR" ).toString().replace( "_", " " ).simplified(); case DeviceModel: return mProperties.value( "ID_MODEL" ).toString().replace( "_", " " ).simplified(); case DisplayText: return mProperties.value( PROPERTY_DISPLAY_TEXT ).toString().simplified(); case LastCheck: return mProperties.value( PROPERTY_LAST_CHECK ); } #elif defined( Q_OS_WIN ) switch ( property ) { case Label: return mProperties.value( "LABEL" ).toString().simplified(); case DevicePath: return ( mDevicePath.isEmpty() ? value( "DEVICE" ) : mDevicePath ).simplified(); case TotalSize: return mProperties.value( "SIZE", -1 ); case UsedSize: return mProperties.value( "USED", -1 ); case FreeSize: return mProperties.value( "FREE", -1 ); /*case DeviceType: return mProperties.value( PROPERTY_DEVICE_TYPE );*/ case MountPoints: return mProperties.value( "MOUNT_POINTS" ); case FileSystem: return mProperties.value( "FS_TYPE" ).toString().toUpper().replace( "_", " " ).simplified(); case FileSystemId: return mProperties.value( "FS_TYPE_ID" ).toString().toLongLong(); case DeviceVendor: return mProperties.value( "ID_VENDOR" ).toString().replace( "_", " " ).simplified(); case DeviceModel: return mProperties.value( "ID_MODEL" ).toString().replace( "_", " " ).simplified(); case DisplayText: return mProperties.value( PROPERTY_DISPLAY_TEXT ).toString().simplified(); case LastCheck: return mProperties.value( PROPERTY_LAST_CHECK ); } #endif return QVariant(); } QVariant pPartition::property( const QString& property ) const { return mProperties.value( property ); } void pPartition::updateSizes( qint64 total, qint64 free ) { #if defined( Q_OS_MAC ) mProperties[ "DAMediaSize" ] = total; mProperties[ "DAMediaUsed" ] = free == -1 ? -1 : total -free; mProperties[ "DAMediaFree" ] = free; #elif defined( Q_OS_LINUX ) mProperties[ "UDISKS_PARTITION_SIZE" ] = total; mProperties[ "UDISKS_PARTITION_USED" ] = free == -1 ? -1 : total -free; mProperties[ "UDISKS_PARTITION_FREE" ] = free; #elif defined( Q_OS_WIN ) mProperties[ "SIZE" ] = total; mProperties[ "USED" ] = free == -1 ? -1 : total -free; mProperties[ "FREE" ] = free; #endif updateLastChecked(); } bool pPartition::isValid() const { return isValidDevicePath( devicePath() ); } bool pPartition::isCustom() const { return devicePath() == mDevicePath; } QString pPartition::devicePath() const { return property( pPartition::DevicePath ).toString(); } void pPartition::updateLastChecked() { mProperties[ PROPERTY_LAST_CHECK ] = QDateTime::currentDateTime(); } QString pPartition::generateDisplayText() const { const QString label = property( pPartition::Label ).toString().isEmpty() ? devicePath() : property( pPartition::Label ).toString(); const QString vendorModel = QString( "%1 %2" ) .arg( property( pPartition::DeviceVendor ).toString() ) .arg( property( pPartition::DeviceModel ).toString() ) .simplified() ; return QString( "%1 (%2/%3)" ) .arg( label ) .arg( property( pPartition::FileSystem ).toString() ) .arg( vendorModel.isEmpty() ? QObject::tr( QT_TRANSLATE_NOOP( "pPartition", "Unknown Vendor/Model" ) ) : vendorModel ) .simplified() ; } bool pPartition::isWBFSPartition( const QString& devicePath ) { QString filePath = devicePath; #if defined( Q_OS_WIN ) if ( !filePath.isEmpty() && filePath.length() <= 3 ) { filePath = QString( "\\\\?\\%1:" ).arg( filePath[ 0 ] ); DISK_GEOMETRY diskGeometry; HANDLE handle = CreateFile( QStringToTCHAR( filePath ), GENERIC_READ | FILE_SHARE_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL ); if ( handle != INVALID_HANDLE_VALUE ) { DWORD bytes; if ( DeviceIoControl( handle, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0, &diskGeometry, sizeof(DISK_GEOMETRY), &bytes, NULL ) ) { const DWORD sectorSize = diskGeometry.BytesPerSector; char buffer[ sectorSize ]; DWORD read; if ( ReadFile( handle, buffer, sectorSize, &read, NULL ) ) { CloseHandle( handle ); return QByteArray( buffer ).left( 4 ).toLower() == "wbfs"; } } } CloseHandle( handle ); return false; } #endif QFile file( filePath ); if ( file.open( QIODevice::ReadOnly ) ) { return file.read( 4 ).toLower() == "wbfs"; } return false; } bool pPartition::isValidDevicePath( const QString& devicePath ) { QString filePath = devicePath; #if defined( Q_OS_WIN ) if ( !filePath.isEmpty() && filePath.length() <= 3 ) { filePath = QString( "\\\\?\\%1:" ).arg( filePath[ 0 ] ); HANDLE handle = CreateFile( QStringToTCHAR( filePath ), GENERIC_READ | FILE_SHARE_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL ); if ( handle != INVALID_HANDLE_VALUE ) { CloseHandle( handle ); return true; } return false; } #endif const QFileInfo file( filePath ); return !filePath.isEmpty() && file.exists() && !file.isDir(); } QString pPartition::value( const QString& key ) const { return mProperties.value( key ).toString(); } QString pPartition::fileSystemIdToString( qint64 id, pPartition::Type type, bool full ) { typedef QPair Info; typedef QList InfoList; QHash hash; if ( type == pPartition::Disc ) { hash[ 0x00 ] << Info( "Unformatted", "NO-Partition empty partition-table entry" ); hash[ 0x01 ] << Info( "CD_DA", "CD_DA" ); hash[ 0x02 ] << Info( "CD_ROM_Mode_1", "CD_ROM_Mode_1" ); hash[ 0x03 ] << Info( "CD_ROM_Mode_2", "CD_ROM_Mode_2" ); hash[ 0x04 ] << Info( "CD_ROM_Mode_2_Form_1", "CD_ROM_Mode_2_Form_1" ); hash[ 0x05 ] << Info( "CD_ROM_Mode_2_Form_2", "CD_ROM_Mode_2_Form_2" ); } else { hash[ 0x00 ] << Info( "Unformatted", "NO-Partition empty partition-table entry" ); hash[ 0x01 ] << Info( "FAT12", "DOS DOS 12-bit FAT" ); hash[ 0x02 ] << Info( "Xenix", "XENIX root file system" ); hash[ 0x03 ] << Info( "Xenix", "XENIX /usr file system (obsolete)" ); hash[ 0x04 ] << Info( "FAT16", "DOS 16-bit FAT (up to 32M)" ); hash[ 0x05 ] << Info( "Extended", "Extended DOS 3.3+ extended partition" ); hash[ 0x06 ] << Info( "FAT16", "DOS 3.31+ Large File System (16-bit FAT, over 32M)" ); hash[ 0x07 ] << Info( "NTFS", "WindowsNT NTFS" ); hash[ 0x07 ] << Info( "HPFS", "OS/2 HPFS" ); hash[ 0x07 ] << Info( "Unix", "Advanced Unix" ); hash[ 0x07 ] << Info( "QNX", "QNX QNX" ); hash[ 0x08 ] << Info( "OS/2", "OS/2 (v1.0-1.3 only)" ); hash[ 0x08 ] << Info( "AIX", "AIX bootable partition, SplitDrive" ); hash[ 0x08 ] << Info( "Commodore", "Commodore Commodore DOS" ); hash[ 0x08 ] << Info( "DELL", "DELL DELL partition spanning multiple drives" ); hash[ 0x09 ] << Info( "Coherent", "Coherent Coherent filesystem" ); hash[ 0x09 ] << Info( "AIX", "AIX AIX data partition" ); hash[ 0x0A ] << Info( "OPUS", "OPUS OPUS" ); hash[ 0x0A ] << Info( "Coherent", "Coherent Coherent swap partition" ); hash[ 0x0A ] << Info( "Boot Manager", "OS/2 OS/2 Boot Manager" ); hash[ 0x0B ] << Info( "FAT32", "Windows95 with 32-bit FAT" ); hash[ 0x0C ] << Info( "FAT32 (LBA)", "Windows95 with 32-bit FAT (using LBA-mode INT 13 extensions)" ); hash[ 0x0E ] << Info( "FAT16 (LBA)", "VFAT logical-block-addressable VFAT (same as 06h but using LBA)" ); hash[ 0x0F ] << Info( "Extended (LBA)", "Extended LBA Extended partition (same as 05h but using LBA)" ); hash[ 0x10 ] << Info( "OPUS", "OPUS OPUS" ); hash[ 0x11 ] << Info( "FAT12 Boot Manager", "FAT12 OS/2 Boot Manager hidden 12-bit FAT partition" ); hash[ 0x12 ] << Info( "Compaq", "Compaq Compaq Diagnostics partition" ); hash[ 0x14 ] << Info( "FAT16 Boot Manager", "FAT16 OS/2 Boot Manager hidden sub-32M 16-bit FAT partition" ); hash[ 0x16 ] << Info( "FAT16 Boot Manager", "FAT16 OS/2 Boot Manager hidden over-32M 16-bit FAT partition" ); hash[ 0x17 ] << Info( "HPFS Boot Manager", "OS/2 OS/2 Boot Manager hidden HPFS partition" ); hash[ 0x17 ] << Info( "NTFS", "NTFS hidden NTFS partition" ); hash[ 0x18 ] << Info( "", "ASTSuspend AST special Windows swap file (\"Zero-Volt Suspend\" partition)" ); hash[ 0x19 ] << Info( "", "Willowtech Willowtech Photon coS" ); hash[ 0x1B ] << Info( "FAT32", "Windows hidden Windows95 FAT32 partition" ); hash[ 0x1C ] << Info( "FAT32 (LBA)", "Windows hidden Windows95 FAT32 partition (LBA-mode)" ); hash[ 0x1E ] << Info( "VFAT (BLA)", "Windows hidden LBA VFAT partition" ); hash[ 0x20 ] << Info( "", "Willowsoft Willowsoft Overture File System (OFS1)" ); hash[ 0x21 ] << Info( "", "[reserved] officially listed as reserved" ); hash[ 0x21 ] << Info( "", "FSo2" ); hash[ 0x23 ] << Info( "", "[reserved] officially listed as reserved" ); hash[ 0x24 ] << Info( "NEC", "NEC MS-DOS 3.x" ); hash[ 0x25 ] << Info( "WBFS", "Wii Backup File System" ); // Not official, just took a free place to set it. hash[ 0x26 ] << Info( "", "[reserved] officially listed as reserved" ); hash[ 0x31 ] << Info( "", "[reserved] officially listed as reserved" ); hash[ 0x33 ] << Info( "", "[reserved] officially listed as reserved" ); hash[ 0x34 ] << Info( "", "[reserved] officially listed as reserved" ); hash[ 0x36 ] << Info( "", "[reserved] officially listed as reserved" ); hash[ 0x38 ] << Info( "", "Theos" ); hash[ 0x3C ] << Info( "PM", "PowerQuest PartitionMagic recovery partition" ); hash[ 0x40 ] << Info( "", "VENIX 80286" ); hash[ 0x41 ] << Info( "", "Personal RISC Boot" ); hash[ 0x41 ] << Info( "", "PowerPC boot partition" ); hash[ 0x42 ] << Info( "LDM", "Windows Logical Disk Manager" ); hash[ 0x42 ] << Info( "SFS", "SFS(Secure File System) by Peter Gutmann" ); hash[ 0x45 ] << Info( "", "EUMEL/Elan" ); hash[ 0x46 ] << Info( "", "EUMEL/Elan" ); hash[ 0x47 ] << Info( "", "EUMEL/Elan" ); hash[ 0x48 ] << Info( "", "EUMEL/Elan" ); hash[ 0x4F ] << Info( "", "Oberon Oberon boot/data partition" ); hash[ 0x50 ] << Info( "", "OnTrack Disk Manager, read-only partition" ); hash[ 0x51 ] << Info( "", "OnTrack Disk Manager, read/write partition" ); hash[ 0x51 ] << Info( "Novell", "NOVELL" ); hash[ 0x52 ] << Info( "CP/M", "CP/M" ); hash[ 0x52 ] << Info( "", "Microport System V/386" ); hash[ 0x53 ] << Info( "", "OnTrack Disk Manager, write-only partition???" ); hash[ 0x54 ] << Info( "", "OnTrack Disk Manager (DDO)" ); hash[ 0x55 ] << Info( "", "EZ-Drive EZ-Drive (see also INT 13/AH=FFh\"EZ-Drive\")" ); hash[ 0x56 ] << Info( "", "GoldenBow GoldenBow VFeature" ); hash[ 0x5C ] << Info( "", "Priam Priam EDISK" ); hash[ 0x61 ] << Info( "", "SpeedStor" ); hash[ 0x63 ] << Info( "Unix", "UnixSysV Unix SysV/386, 386/ix" ); hash[ 0x63 ] << Info( "BSD", "Mach Mach, MtXinu BSD 4.3 on Mach" ); hash[ 0x63 ] << Info( "HURD", "GNU-HURD GNU HURD" ); hash[ 0x64 ] << Info( "Novell", "Novell Novell NetWare 286" ); hash[ 0x64 ] << Info( "", "SpeedStore SpeedStore" ); hash[ 0x65 ] << Info( "Novell", "Novell NetWare (3.11)" ); hash[ 0x67 ] << Info( "Novell", "Novell" ); hash[ 0x68 ] << Info( "Novell", "Novell" ); hash[ 0x69 ] << Info( "NSS", "Novell NSS Volume" ); hash[ 0x70 ] << Info( "DS", "DiskSecure DiskSecure Multi-Boot" ); hash[ 0x71 ] << Info( "", "[reserved] officially listed as reserved" ); hash[ 0x73 ] << Info( "", "[reserved] officially listed as reserved" ); hash[ 0x74 ] << Info( "", "[reserved] officially listed as reserved" ); hash[ 0x75 ] << Info( "PC/IX", "PC/IX PC/IX" ); hash[ 0x76 ] << Info( "", "[reserved] officially listed as reserved" ); hash[ 0x7E ] << Info( "F.I.X.", "F.I.X. F.I.X." ); hash[ 0x80 ] << Info( "Minix", "Minix Minix v1.1 - 1.4a" ); hash[ 0x81 ] << Info( "Minix", "Minix Minix v1.4b+" ); hash[ 0x81 ] << Info( "Linux", "Linux Linux" ); hash[ 0x81 ] << Info( "", "Mitac Mitac Advanced Disk Manager" ); hash[ 0x82 ] << Info( "Linux", "Linux/Swap Linux Swap partition" ); hash[ 0x82 ] << Info( "", "Prime Prime" ); hash[ 0x82 ] << Info( "Solaris", "Solaris Solaris (Unix)" ); hash[ 0x83 ] << Info( "Linux", "Linux Linux native file system (ext2fs/xiafs)" ); hash[ 0x84 ] << Info( "", "DOS OS/2-renumbered type 04h partition (hiding DOS C: drive)" ); hash[ 0x85 ] << Info( "Linux", "Linux Linux EXT" ); hash[ 0x86 ] << Info( "FAT16", "FAT16 FAT16 volume/stripe set (Windows NT)" ); hash[ 0x87 ] << Info( "HPFS", "HPFS HPFS Fault-Tolerant mirrored partition" ); hash[ 0x87 ] << Info( "NTFS", "NTFS NTFS volume/stripe set" ); hash[ 0x8E ] << Info( "LVM", "Linux Logical Volume Manager" ); hash[ 0x93 ] << Info( "", "Amoeba Amoeba file system" ); hash[ 0x94 ] << Info( "", "Amoeba Amoeba bad block table" ); hash[ 0x98 ] << Info( "", "Datalight Datalight ROM-DOS SuperBoot" ); hash[ 0x99 ] << Info( "", "Mylex Mylex EISA SCSI" ); hash[ 0xA0 ] << Info( "", "Phoenix Phoenix NoteBIOS Power Management \"Save-to-Disk\" partition" ); hash[ 0xA1 ] << Info( "", "[reserved] officially listed as reserved" ); hash[ 0xA3 ] << Info( "", "[reserved] officially listed as reserved" ); hash[ 0xA4 ] << Info( "", "[reserved] officially listed as reserved" ); hash[ 0xA5 ] << Info( "FreeBSD", "FreeBSD FreeBSD, BSD/386" ); hash[ 0xA6 ] << Info( "OpenBSD", "OpenBSD OpenBSD" ); hash[ 0xA7 ] << Info( "USF", "Apple Rhapsody UFS" ); hash[ 0xA8 ] << Info( "UFS", "Apple UFS" ); hash[ 0xA9 ] << Info( "NetBSD", "NetBSD NetBSD (http://www.netbsd.org/)" ); hash[ 0xAB ] << Info( "Boot", "Apple Boot" ); hash[ 0xAE ] << Info( "Encryped", "Apple Encrypted" ); hash[ 0xAF ] << Info( "HFS", "Apple HFS" ); hash[ 0xB1 ] << Info( "", "[reserved] officially listed as reserved" ); hash[ 0xB3 ] << Info( "", "[reserved] officially listed as reserved" ); hash[ 0xB4 ] << Info( "", "[reserved] officially listed as reserved" ); hash[ 0xB6 ] << Info( "", "[reserved] officially listed as reserved" ); hash[ 0xB6 ] << Info( "FAT16", "Windows Windows NT mirror set (master), FAT16 file system" ); hash[ 0xB7 ] << Info( "", "BSDI BSDI file system (secondarily swap)" ); hash[ 0xB7 ] << Info( "NTFS", "Windows Windows NT mirror set (master), NTFS file system" ); hash[ 0xB8 ] << Info( "", "BSDI BSDI swap partition (secondarily file system)" ); hash[ 0xBE ] << Info( "", "Solaris Solaris boot partition" ); hash[ 0xC0 ] << Info( "", "CTOS CTOS" ); hash[ 0xC0 ] << Info( "", "DR-DOS DR DOS/DR-DOS/Novell DOS secured partition" ); hash[ 0xC1 ] << Info( "", "DR-DOS6.0 DR DOS 6.0 LOGIN.EXE-secured 12-bit FAT partition" ); hash[ 0xC4 ] << Info( "", "DR-DOS6.0 DR DOS 6.0 LOGIN.EXE-secured 16-bit FAT partition" ); hash[ 0xC6 ] << Info( "", "DR-DOS6.0 DR DOS 6.0 LOGIN.EXE-secured Huge partition" ); hash[ 0xC6 ] << Info( "", "corrupted corrupted FAT16 volume/stripe set (Windows NT)" ); hash[ 0xC6 ] << Info( "FAT16", "Windows Windows NT mirror set (slave), FAT16 file system" ); hash[ 0xC7 ] << Info( "Boot", "Syrinx Syrinx Boot" ); hash[ 0xC7 ] << Info( "NTFS", "corrupted corrupted NTFS volume/stripe set" ); hash[ 0xC7 ] << Info( "NTFS", "Windows Windows NT mirror set (slave), NTFS file system" ); hash[ 0xCB ] << Info( "FAT32", "DR-DOS Reserved for DR DOS/DR-DOS/OpenDOS secured FAT32" ); hash[ 0xCC ] << Info( "FAT32 (LBA)", "DR-DOS Reserved for DR DOS/DR-DOS secured FAT32 (LBA)" ); hash[ 0xCE ] << Info( "FAT16 (LBA)", "DR-DOS Reserved for DR DOS/DR-DOS secured FAT16 (LBA)" ); hash[ 0xD0 ] << Info( "FAT12", "Multiuser Multiuser DOS secured FAT12" ); hash[ 0xD1 ] << Info( "FAT12", "Old-FAT12 Old Multiuser DOS secured FAT12" ); hash[ 0xD4 ] << Info( "FAT16", "Old-FAT16 Old Multiuser DOS secured FAT16 (<= 32M)" ); hash[ 0xD5 ] << Info( "Extended", "Old-Ext Old Multiuser DOS secured extended partition" ); hash[ 0xD6 ] << Info( "FAT16", "Old-FAT16 Old Multiuser DOS secured FAT16 (> 32M)" ); hash[ 0xD8 ] << Info( "CP/M-86", "CP/M-86 CP/M-86" ); hash[ 0xDB ] << Info( "CP/M", "CP/M CP/M, Concurrent CP/M, Concurrent DOS" ); hash[ 0xDB ] << Info( "CTOS", "CTOS CTOS (Convergent Technologies OS)" ); hash[ 0xE1 ] << Info( "Extended", "SpeedStor SpeedStor 12-bit FAT extended partition" ); hash[ 0xE2 ] << Info( "", "DOS DOS read-only (Florian Painke's XFDISK 1.0.4)" ); hash[ 0xE3 ] << Info( "", "DOS DOS read-only" ); hash[ 0xE3 ] << Info( "", "Storage Storage Dimensions" ); hash[ 0xE4 ] << Info( "Extended", "SpeedStor SpeedStor 16-bit FAT extended partition" ); hash[ 0xE5 ] << Info( "", "[reserved] officially listed as reserved" ); hash[ 0xE6 ] << Info( "", "[reserved] officially listed as reserved" ); hash[ 0xEB ] << Info( "BFS", "BeOS BeOS BFS (BFS1)" ); hash[ 0xF1 ] << Info( "", "Storage Storage Dimensions" ); hash[ 0xF2 ] << Info( "", "DOS DOS 3.3+ secondary partition" ); hash[ 0xF3 ] << Info( "", "[reserved] officially listed as reserved" ); hash[ 0xF4 ] << Info( "", "SpeedStor SpeedStor" ); hash[ 0xF4 ] << Info( "", "Storage Storage Dimensions" ); hash[ 0xF5 ] << Info( "", "Prologue Prologue" ); hash[ 0xF6 ] << Info( "", "[reserved] officially listed as reserved" ); hash[ 0xFB ] << Info( "VMware", "VMWARE vmware partition" ); hash[ 0xFD ] << Info( "Linux", "Linux RAID" ); hash[ 0xFE ] << Info( "", "LANstep LANstep" ); hash[ 0xFE ] << Info( "PS/2-IML", "PS/2-IML IBM PS/2 IML (Initial Microcode Load) partition" ); hash[ 0xFF ] << Info( "Xenix", "Xenix Xenix bad block table" ); //hash[ 0xFM ] << Info( "VMware", "VMware VMware raw partition" ); } QStringList values; foreach ( const Info& info, hash.value( id ) ) { values << ( full ? info.second : info.first ); } return values.isEmpty() ? QObject::tr( QT_TRANSLATE_NOOP( "pPartition", "Unknown FS" ) ) : values.join( ", " ).replace( "_", " " ); } ./qwbfsmanager-1.2.1-src/qwbfs/src/models/DiscDelegate.cpp0000644000175000017520000001761011544161724022745 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : DiscDelegate.cpp ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #include "DiscDelegate.h" #include "DiscModel.h" #include "Gauge.h" #include "qwbfsdriver/Driver.h" #include "wiitdb/Covers.h" #include "ListView.h" #include #include #include #include #include using namespace QWBFS::Model; DiscDelegate::DiscDelegate( QWBFS::Model::DiscModel* parent, pNetworkAccessManager* cache ) : QStyledItemDelegate( parent ) { Q_ASSERT( parent ); Q_ASSERT( cache ); mModel = parent; mCache = cache; } DiscDelegate::~DiscDelegate() { } void DiscDelegate::paint( QPainter* painter, const QStyleOptionViewItem& _option, const QModelIndex& index ) const { // remove ugly focus rect QStyleOptionViewItem option = _option; option.state &= ~QStyle::State_HasFocus; if ( mModel ) { switch ( mModel->view()->viewMode() ) { case QListView::ListMode: { paintList( painter, option, index ); break; } case QListView::IconMode: { paintIcon( painter, option, index ); break; } } } } QSize DiscDelegate::sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index ) const { if ( mModel ) { switch ( mModel->view()->viewMode() ) { case QListView::ListMode: { return mModel->data( index, DiscModel::ListModeSizeHintRole ).toSize(); } case QListView::IconMode: { return mModel->data( index, DiscModel::IconModeSizeHintRole ).toSize(); } } } return QStyledItemDelegate::sizeHint( option, index ); } void DiscDelegate::paintFrame( QPainter* painter, const QStyleOptionViewItemV4& option, bool pair ) const { const int corner = 5; const QRect r = option.rect.adjusted( 0, 0, -1, -1 ); const QPalette::ColorRole role = pair ? QPalette::Highlight : QPalette::Button; QColor strokeColor = option.palette.color( role ).darker(); QColor fillColor1 = option.palette.color( role ).lighter(); QColor fillColor2 = option.palette.color( role ); if ( option.state & QStyle::State_MouseOver ) { const int factor = 110; strokeColor = strokeColor.darker( factor ); fillColor1 = fillColor1.darker( factor ); fillColor2 = fillColor2.darker( factor ); } QLinearGradient gradient( option.rect.topLeft(), option.rect.bottomLeft() ); gradient.setColorAt( 0, fillColor1 ); gradient.setColorAt( 1, fillColor2 ); painter->setPen( strokeColor ); painter->setBrush( gradient ); painter->drawRoundedRect( r, corner, corner ); } void DiscDelegate::paintList( QPainter* painter, const QStyleOptionViewItemV4& option, const QModelIndex& index ) const { painter->setRenderHint( QPainter::Antialiasing ); const bool selected = option.state & QStyle::State_Selected; const QWBFS::Model::Disc disc = mModel->disc( index ); QRect rect; // background / selection { QStyleOptionViewItemV4 o = option; o.rect = option.rect.adjusted( 1, 1, 0, 0 ); paintFrame( painter, o, selected ); } // icon { rect = option.rect; rect = option.rect.adjusted( 8, 5, -rect.width() +40 -5, -5 ); QPixmap pixmap = disc.state == QWBFS::Driver::None ? mModel->coverPixmap( disc.id, rect.size() ) : mModel->statePixmap( disc.state, rect.size() ); if ( !pixmap.isNull() ) { painter->drawPixmap( rect.topLeft(), pixmap ); } } // title/region { QFont font = painter->font(); font.setPixelSize( 13 ); font.setBold( true ); QFontMetrics metrics( font ); rect = option.rect.adjusted( 40, 2, -10, -( metrics.height() -2 ) ); QString text = QString( "%1 - %2 (%3 - %4)" ).arg( disc.id ).arg( pCoreUtils::toTitleCase( disc.title ) ).arg( QWBFS::Driver::regionToString( disc.region ) ).arg( QWBFS::Driver::regionToLanguageString( disc.region ) ); text = metrics.elidedText( text, Qt::ElideRight, rect.width() ); painter->setFont( font ); painter->setPen( QColor( 0, 0, 0 ) ); painter->setBrush( Qt::NoBrush ); painter->drawText( rect, Qt::AlignLeft | Qt::AlignVCenter, text ); } // size/origin { QFont font = painter->font(); font.setBold( false ); font.setPixelSize( 9 ); QFontMetricsF metrics( font ); rect = option.rect.adjusted( 40, rect.height(), -10, -2 ); QString text = tr( "Estimated size: %1 - Origin: %2" ).arg( pCoreUtils::fileSizeToString( disc.size ) ).arg( disc.origin ); text = metrics.elidedText( text, Qt::ElideRight, rect.width() ); painter->setFont( font ); painter->setPen( QColor( 0, 0, 0 ) ); painter->setBrush( Qt::NoBrush ); painter->drawText( rect, Qt::AlignLeft | Qt::AlignVCenter, text ); } } void DiscDelegate::paintIcon( QPainter* painter, const QStyleOptionViewItemV4& option, const QModelIndex& index ) const { painter->setRenderHint( QPainter::Antialiasing ); const bool selected = option.state & QStyle::State_Selected; const QWBFS::Model::Disc disc = mModel->disc( index ); const int margin = 9; const int spacing = 5; const QString text = disc.title; QRect rect = option.rect.adjusted( margin, margin, -margin, -margin ); QPixmap cover = mModel->coverPixmap( disc.id, rect.size() -QSize( 0, painter->font().pointSize() +spacing ) ); QPixmap state = mModel->statePixmap( disc.state, QSize( 24, 24 ) ); // selection if ( selected ) { QStyleOptionViewItemV4 o = option; o.rect = option.rect.adjusted( 1, 1, 0, 0 ); paintFrame( painter, o ); } // icon if ( !cover.isNull() ) { QRect r = QRect( QPoint(), cover.size() ); r.moveCenter( rect.center() ); r.moveTop( rect.top() ); painter->drawPixmap( r.topLeft(), cover ); } // state if ( !state.isNull() && disc.state != QWBFS::Driver::None ) { painter->drawPixmap( option.rect.topLeft() +QPoint( 2, 2 ), state ); } // title { QStyleOptionViewItemV4 o = option; o.displayAlignment = Qt::AlignCenter; o.rect = option.rect.adjusted( 1, option.rect.height() -( margin *2 ), 0, 0 ); o.icon = QIcon(); o.text = painter->fontMetrics().elidedText( pCoreUtils::toTitleCase( text ), Qt::ElideRight, o.rect.width() -margin ); if ( !selected ) { paintFrame( painter, o ); } painter->setPen( selected ? o.palette.color( QPalette::HighlightedText ) : o.palette.color( QPalette::WindowText ) ); painter->drawText( o.rect, o.displayAlignment, o.text ); } } ./qwbfsmanager-1.2.1-src/qwbfs/src/models/pPartitionModel_win.cpp0000644000175000017520000001067611543625217024425 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pPartitionModel_win.cpp ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pPartitionModel.h" #include #include #include #include #include void pPartitionModel::platformInit() { emit layoutAboutToBeChanged(); mData = 0; emit layoutChanged(); } void pPartitionModel::platformDeInit() { } void pPartitionModel::platformUpdate() { // Code commented as the linux implementation has the concept of live auto update, thanks to UDev librarie :) /*const QStringList partitions = customPartitions(); emit layoutAboutToBeChanged(); delete (DisksSession*)mData; mPartitions.clear(); foreach ( const QString& partition, partitions ) { mPartitions << pPartition( partition ); } mData = new DisksSession( this ); emit layoutChanged();*/ const QStringList partitions = customPartitions(); emit layoutAboutToBeChanged(); mPartitions.clear(); foreach ( const QString& partition, partitions ) { mPartitions << pPartition( partition ); } mData = 0; TCHAR drives[ MAX_PATH +1 ]; GetLogicalDriveStrings( MAX_PATH +1, drives ); TCHAR* drive = drives; while ( *drive ) { /*HRESULT hr = GetDriveType( drive ); switch ( hr ) { case DRIVE_UNKNOWN: partition.device = pPartition::Unknown; break; case DRIVE_NO_ROOT_DIR: partition.device = pPartition::NotMounted; continue; case DRIVE_REMOVABLE: partition.device = pPartition::Removable; break; case DRIVE_FIXED: partition.device = pPartition::Fixed; break; case DRIVE_REMOTE: partition.device = pPartition::Remote; break; case DRIVE_CDROM: partition.device = pPartition::CdRom; break; case DRIVE_RAMDISK: partition.device = pPartition::RamDisk; break; }*/ TCHAR volume[ MAX_PATH +1 ] = {0}; // volumne name TCHAR fs[ MAX_PATH +1 ] = {0}; // file system type ( FAT/NTFS...) ulong serial; // partition serial ulong max; // max filename length ulong flags; // flags qint64 available = -1; // user quota qint64 total = -1; // system total qint64 free = -1; // system free if ( GetVolumeInformation( drive, volume, MAX_PATH +1, &serial, &max, &flags, fs, MAX_PATH +1 ) ) { if ( !GetDiskFreeSpaceEx( drive, (PULARGE_INTEGER)&available, (PULARGE_INTEGER)&total, (PULARGE_INTEGER)&free ) ) { qWarning( "GetDiskFreeSpaceEx Error: %s", qPrintable( TCHARToQString( drive ) ) ); } } else { qWarning( "GetVolumeInformation Error: %s", qPrintable( TCHARToQString( drive ) ) ); } pPartition partition; QVariantMap properties; properties[ "LABEL" ] = TCHARToQString( volume ); properties[ "DEVICE" ] = TCHARToQString( drive ); properties[ "MOUNT_POINTS" ] = TCHARToQString( drive ); properties[ "FS_TYPE" ] = TCHARToQString( fs ); properties[ "FS_TYPE_ID" ] = 0; if ( pPartition::isWBFSPartition( TCHARToQString( drive ) ) ) { properties[ "FS_TYPE_ID" ] = 0x25; properties[ "FS_TYPE" ] = pPartition::fileSystemIdToString( 0x25 ); } partition.setProperties( properties ); partition.updateSizes( total, free ); mPartitions << partition; drive = &drive[ _tcslen( drive ) +1 ]; } emit layoutChanged(); } ./qwbfsmanager-1.2.1-src/qwbfs/src/models/PartitionDelegate.h0000644000175000017520000001022211543625217023472 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : PartitionDelegate.h ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ /**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : PartitionDelegate.h ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #ifndef PARTITIONDELEGATE_H #define PARTITIONDELEGATE_H /*! \file PartitionDelegate.h \brief A delegate for drawing the representation of a pPartition. \author Filipe Azevedo aka Nox P\@sNox */ #include class pPartitionModel; /*! \ingroup Gui \class PartitionDelegate \brief A delegate for drawing the representation of a pPartition. */ class PartitionDelegate : public QStyledItemDelegate { Q_OBJECT public: /*! Create a instance of the delegate having \a parent as parent and model. */ PartitionDelegate( pPartitionModel* parent ); /*! Destroys the instance of the delegate. */ virtual ~PartitionDelegate(); /*! Reimplemented. */ virtual void paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const; /*! Reimplemented. */ virtual QSize sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index ) const; protected: pPartitionModel* mModel; QStyle* mStyle; void paintFrame( QPainter* painter, const QStyleOption* option, bool pair = true ) const; }; #endif // PARTITIONDELEGATE_H ./qwbfsmanager-1.2.1-src/qwbfs/src/models/pPartitionModel_mac.mm0000644000175000017520000001326511545577341024222 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pPartitionModel_mac.cpp ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pPartitionModel.h" /* http://www.datarecovery.com/hexcodes.asp http://stackoverflow.com/questions/1515068/list-all-drives-partitions-and-get-dev-rdisc-device-with-cocoa */ #import #import #include #include #include class DADisksSession { public: DADisksSession( pPartitionModel* model ) { mModel = model; // init session mSession = DASessionCreate( kCFAllocatorDefault ); DARegisterDiskAppearedCallback( mSession, 0/*all disks*/, diskAppeared, mModel ); DARegisterDiskDescriptionChangedCallback( mSession, 0/*all disks*/, 0/*all keys*/, diskChanged, mModel ); DARegisterDiskDisappearedCallback( mSession, 0/*all disks*/, diskDisappeared, mModel ); DASessionScheduleWithRunLoop( mSession, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode ); } virtual ~DADisksSession() { // deinit session DASessionUnscheduleFromRunLoop( mSession, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode ); CFRelease( mSession ); } static pPartition createPartition( DADiskRef disk ) { const CFDictionaryRef dict = DADiskCopyDescription( disk ); QVariantMap properties = pMacHelpers::toQVariantMap( dict ); pPartition partition; CFRelease( dict ); // set properties on partitions only if ( !properties.value( "DAMediaWhole" ).toBool() ) { const QString devicePath = QString( "/dev/%1" ).arg( properties.value( "DAMediaBSDName" ).toString() ); if ( pPartition::isWBFSPartition( devicePath ) ) { properties[ "DAVolumeKindId" ] = 0x25; properties[ "DAVolumeKind" ] = pPartition::fileSystemIdToString( 0x25 ); } FSVolumeRefNum volume; qint64 total = properties.value( "DAMediaSize", -1 ).toLongLong(); qint64 free = -1; // get volume infos, like total bytes, free bytes... if ( FSGetVolumeForDADisk( disk, &volume ) == noErr ) { FSVolumeInfo volumeInfo; bzero( (void*)&volumeInfo, sizeof(volumeInfo)); /*qint64 major = properties.value( "DAMediaBSDMajor" ).toLongLong(); qint64 minor = properties.value( "DAMediaBSDMinor" ).toLongLong(); qWarning() << "-----"; QStringList test; test << QString( "%1%2" ).arg( major, 0, 16 ).arg( minor, 0, 16 ).toUpper().prepend( "0x" ); test << QString( "%1" ).arg( major +minor, 0, 16 ).toUpper().prepend( "0x" ); test << QString( "%1" ).arg( major, 0, 16 ).toUpper().prepend( "0x" ); qWarning() << properties.value( "DAVolumeKind" ).toString().toUpper() << properties.value( "DAMediaContent" ).toString().toUpper() << test;*/ if ( properties[ "DAVolumeKindId" ] != 0x25 && FSGetVolumeInfo( volume, 0, 0, kFSVolInfoSizes | kFSVolInfoFSInfo, &volumeInfo, 0, 0 ) == noErr ) { properties[ "DAVolumeKindId" ] = volumeInfo.filesystemID == 0 ? 0xAF : volumeInfo.filesystemID; total = volumeInfo.totalBytes; free = volumeInfo.freeBytes; } } partition.setProperties( properties ); partition.updateSizes( total, free ); } return partition; } static void diskAppeared( DADiskRef disk, void* context ) { pPartitionModel* model = static_cast( context ); model->updatePartition( createPartition( disk ) ); } static void diskChanged( DADiskRef disk, CFArrayRef keys, void* context ) { Q_UNUSED( keys ); pPartitionModel* model = static_cast( context ); model->updatePartition( createPartition( disk ) ); } static void diskDisappeared( DADiskRef disk, void* context ) { pPartitionModel* model = static_cast( context ); model->removePartition( QString( "/dev/%1" ).arg( DADiskGetBSDName( disk ) ) ); } protected: pPartitionModel* mModel; DASessionRef mSession; }; void pPartitionModel::platformInit() { emit layoutAboutToBeChanged(); mData = new DADisksSession( this ); emit layoutChanged(); } void pPartitionModel::platformDeInit() { delete (DADisksSession*)mData; } void pPartitionModel::platformUpdate() { // Code commented as the mac implementation has the concept of live auto update, thanks Disk Arbitration framework :) /*const QStringList partitions = customPartitions(); emit layoutAboutToBeChanged(); delete (DADisksSession*)mData; mPartitions.clear(); foreach ( const QString& partition, partitions ) { mPartitions << pPartition( partition ); } mData = new DADisksSession( this ); emit layoutChanged();*/ } ./qwbfsmanager-1.2.1-src/qwbfs/src/wiitdb/0000755000175000017520000000000011546156115017716 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/qwbfs/src/wiitdb/Covers.cpp0000644000175000017520000001347511532572112021667 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : Covers.cpp ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #include "Covers.h" #include "../qwbfsdriver/Driver.h" #include #include #include #include #include using namespace QWBFS; QUrl WiiTDB::checkPixmapCache( WiiTDB::Scan scan, const QString& id, pNetworkAccessManager* cache ) { QUrl url = coverUrl( scan, id ); if ( !cache->hasCacheData( url ) ) { QUrl u = coverUrl( scan, id, "EN" ).toString(); if ( !cache->hasCacheData( u ) ) { u = coverUrl( scan, id, "other" ).toString(); if ( cache->hasCacheData( u ) ) { url = u; } } else { url = u; } } return url; } QUrl WiiTDB::coverUrl( WiiTDB::Scan scan, const QString& id, const QString& local ) { Q_ASSERT( !id.isEmpty() ); const QString language = local.isNull() ? QWBFS::Driver::regionToLanguageString( id.at( 3 ).unicode() ) : local; switch ( scan ) { case WiiTDB::CoverHQ: return QUrl( QString( "%3/wiitdb/artwork/coverfullHQ/%1/%2.png" ).arg( language ).arg( id ).arg( WIITDB_DOMAIN ) ); case WiiTDB::Cover: return QUrl( QString( "%3/wiitdb/artwork/cover/%1/%2.png" ).arg( language ).arg( id ).arg( WIITDB_DOMAIN ) ); case WiiTDB::Cover3D: return QUrl( QString( "%3/wiitdb/artwork/coverfull3D/%1/%2.png" ).arg( language ).arg( id ).arg( WIITDB_DOMAIN ) ); case WiiTDB::CoverDisc: return QUrl( QString( "%3/wiitdb/artwork/disc/%1/%2.png" ).arg( language ).arg( id ).arg( WIITDB_DOMAIN ) ); case WiiTDB::CoverDiscCustom: return QUrl( QString( "%3/wiitdb/artwork/disccustom/%1/%2.png" ).arg( language ).arg( id ).arg( WIITDB_DOMAIN ) ); case WiiTDB::CoverFull: return QUrl( QString( "%3/wiitdb/artwork/coverfull/%1/%2.png" ).arg( language ).arg( id ).arg( WIITDB_DOMAIN ) ); case WiiTDB::CoverInvalid: break; } return QUrl(); } QPixmap WiiTDB::coverBoxPixmap( const QString& id, pNetworkAccessManager* cache, const QSize& size ) { const QString url = checkPixmapCache( QWBFS::WiiTDB::Cover, id, cache ).toString(); const QString key = pGuiUtils::cacheKey( url, size ); QPixmap pixmap; if ( !id.isEmpty() && !QPixmapCache::find( key, pixmap ) ) { if ( !cache->hasCacheData( url ) ) { cache->get( QNetworkRequest( url ) ); return pGuiUtils::scaledPixmap( ":/wii/cover.png", size ); } QIODevice* data = cache->cacheData( url ); if ( data && pixmap.loadFromData( data->readAll() ) ) { pixmap = pGuiUtils::scaledPixmap( pixmap, url, size ); } delete data; } return pixmap; } QPixmap WiiTDB::coverDiscPixmap( const QString& id, pNetworkAccessManager* cache, const QSize& size ) { QString url = checkPixmapCache( QWBFS::WiiTDB::CoverDisc, id, cache ).toString(); if ( !cache->hasCacheData( url ) ) { const QString u = checkPixmapCache( QWBFS::WiiTDB::CoverDiscCustom, id, cache ).toString(); if ( cache->hasCacheData( u ) ) { url = u; } } const QString key = pGuiUtils::cacheKey( url, size ); QPixmap pixmap; if ( !id.isEmpty() && !QPixmapCache::find( key, pixmap ) ) { if ( !cache->hasCacheData( url ) ) { cache->get( QNetworkRequest( url ) ); return pGuiUtils::scaledPixmap( ":/wii/disc.png", size ); } QIODevice* data = cache->cacheData( url ); if ( data && pixmap.loadFromData( data->readAll() ) ) { pixmap = pGuiUtils::scaledPixmap( pixmap, url, size ); } delete data; } return pixmap; } WiiTDB::Scan WiiTDB::urlCover( const QUrl& url ) { const QString path = url.path(); if ( path.contains( "coverfullHQ", Qt::CaseInsensitive ) ) { return WiiTDB::CoverHQ; } else if ( path.contains( "coverfull3D", Qt::CaseInsensitive ) ) { return WiiTDB::Cover3D; } else if ( path.contains( "coverfull", Qt::CaseInsensitive ) ) { return WiiTDB::CoverFull; } else if ( path.contains( "cover", Qt::CaseInsensitive ) ) { return WiiTDB::Cover; } else if ( path.contains( "disccustom", Qt::CaseInsensitive ) ) { return WiiTDB::CoverDiscCustom; } else if ( path.contains( "disc", Qt::CaseInsensitive ) ) { return WiiTDB::CoverDisc; } return WiiTDB::CoverInvalid; } ./qwbfsmanager-1.2.1-src/qwbfs/src/wiitdb/Covers.h0000644000175000017520000000520711532566553021342 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : Covers.h ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #ifndef COVERS_H #define COVERS_H #include #include #include class pNetworkAccessManager; #define WIITDB_DOMAIN "http://wiitdb.com" namespace QWBFS { namespace WiiTDB { enum Scan { CoverInvalid, CoverFull, CoverHQ, Cover, Cover3D, CoverDisc, CoverDiscCustom }; QUrl checkPixmapCache( WiiTDB::Scan scan, const QString& id, pNetworkAccessManager* cache ); QUrl coverUrl( WiiTDB::Scan scan, const QString& id, const QString& local = QString::null ); QPixmap coverBoxPixmap( const QString& id, pNetworkAccessManager* cache, const QSize& size = QSize() ); QPixmap coverDiscPixmap( const QString& id, pNetworkAccessManager* cache, const QSize& size = QSize() ); WiiTDB::Scan urlCover( const QUrl& url ); }; // WiiTDB }; // QWBDFS #endif // COVERS_H ./qwbfsmanager-1.2.1-src/qwbfs/src/PartitionComboBox.cpp0000644000175000017520000001225211543625302022540 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : PartitionComboBox.cpp ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #include "PartitionComboBox.h" #include "models/PartitionDelegate.h" #include "models/pPartitionModel.h" #include #include #include #include #include #include #include Q_GLOBAL_STATIC( pPartitionModel, _partitionModel ); pPartitionModel* PartitionComboBox::partitionModel() { return _partitionModel(); } PartitionComboBox::PartitionComboBox( QWidget* parent ) : QComboBox( parent ) { mButton = new QToolButton( this ); mButton->setAutoRaise( true ); mButton->setIcon( QIcon( ":/icons/256/properties.png" ) ); mButton->setToolTip( tr( "Add a partition" ) ); QHBoxLayout* hl = new QHBoxLayout( this ); hl->setMargin( 0 ); hl->setSpacing( 5 ); hl->addStretch(); hl->addWidget( mButton ); setAttribute( Qt::WA_Hover, true ); setModel( partitionModel() ); setModelColumn( pPartition::DevicePath ); setItemDelegate( new PartitionDelegate( partitionModel() ) ); connect( partitionModel(), SIGNAL( rowsInserted( const QModelIndex&, int, int ) ), this, SLOT( modelChanged() ) ); connect( partitionModel(), SIGNAL( rowsRemoved( const QModelIndex&, int, int ) ), this, SLOT( modelChanged() ) ); connect( partitionModel(), SIGNAL( layoutChanged() ), this, SLOT( modelChanged() ) ); connect( partitionModel(), SIGNAL( modelReset() ), this, SLOT( modelChanged() ) ); connect( mButton, SIGNAL( clicked() ), this, SLOT( addPartition() ) ); modelChanged(); } PartitionComboBox::~PartitionComboBox() { } void PartitionComboBox::modelChanged() { bool custom = true; foreach ( const pPartition& partition, partitionModel()->partitions() ) { if ( !partition.isCustom() ) { custom = false; break; } } mButton->setVisible( custom ); } void PartitionComboBox::addPartition() { const QString partition = QInputDialog::getText( this, QString::null, tr( "Enter a partition path" ) ); if ( !partition.isNull() && findText( partition ) == -1 ) { partitionModel()->addPartition( partition ); } if ( !partition.isNull() ) { setCurrentIndex( findText( partition ) ); } } bool PartitionComboBox::event( QEvent* event ) { if ( event->type() == QEvent::ToolTip ) { QHelpEvent* he = static_cast( event ); QStringList tooltip( toolTip() ); if ( currentIndex() != -1 ) { tooltip << QString( "
%1
" ).arg( tr( "Current Partition" ) ); tooltip << itemData( currentIndex(), Qt::ToolTipRole ).toString(); } QToolTip::showText( he->globalPos(), tooltip.join( "
" ), this ); return true; } return QComboBox::event( event ); } void PartitionComboBox::paintEvent( QPaintEvent* event ) { Q_UNUSED( event ); QPainter painter( this ); QStyleOptionComboBox option; initStyleOption( &option ); option.rect.setWidth( layout()->itemAt( 0 )->geometry().width() -layout()->spacing() ); if ( option.state & QStyle::State_MouseOver || currentIndex() == -1 ) { style()->drawComplexControl( QStyle::CC_ComboBox, &option, &painter, this ); style()->drawControl( QStyle::CE_ComboBoxLabel, &option, &painter, this ); } else { const QModelIndex index = partitionModel()->QAbstractTableModel::index( currentIndex(), modelColumn(), rootModelIndex() ); QStyleOptionViewItemV4 o; o.initFrom( this ); o.widget = this; o.rect = option.rect; itemDelegate()->paint( &painter, o, index ); } } ./qwbfsmanager-1.2.1-src/qwbfs/src/UIMain.h0000644000175000017520000000763111541444454017737 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : UIMain.h ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #ifndef UIMAIN_H #define UIMAIN_H #include "ui_UIMain.h" class QMenuBar; class QFileSystemModel; class QNetworkReply; class pNetworkAccessManager; class pPaypalButton; class pUpdateChecker; namespace QWBFS { namespace Model { class DiscModel; }; // Model }; // QWBFS class UIMain : public QMainWindow, public Ui::UIMain { Q_OBJECT public: UIMain( QWidget* parent = 0 ); virtual ~UIMain(); virtual bool event( QEvent* event ); pNetworkAccessManager* cache() const; pQueuedMessageToolBar* messageToolBar() const; protected: #if defined( Q_OS_MAC ) QMenuBar* mMenuBar; #endif QMenu* mActions; pPaypalButton* mDonationWidget; QFileSystemModel* mFoldersModel; QFileSystemModel* mFilesModel; pNetworkAccessManager* mCache; QString mLastDiscId; pUpdateChecker* mUpdateChecker; virtual void showEvent( QShowEvent* event ); virtual void closeEvent( QCloseEvent* event ); virtual bool eventFilter( QObject* object, QEvent* event ); void connectView( PartitionWidget* widget ); protected slots: void localeChanged(); void loadProperties( bool firstInit = true ); void saveProperties(); void changeLocaleRequested(); void propertiesChanged(); void openViewRequested(); void closeViewRequested(); void coverRequested( const QString& id ); void progress_jobFinished( const QWBFS::Model::Disc& disc ); void networkAccessManager_finished( QNetworkReply* reply ); void networkAccessManager_cached( const QUrl& url ); void networkAccessManager_error( const QUrl& url, const QString& message ); void networkAccessManager_cacheCleared(); void on_aReloadPartitions_triggered(); void on_aQuit_triggered(); void on_aAbout_triggered(); void on_aProperties_triggered(); void on_aConvertToWBFSFiles_triggered(); void on_aConvertToISOFiles_triggered(); void on_aRenameDiscsInFolder_triggered(); void on_tvFolders_activated( const QModelIndex& index ); void on_tbReloadDrives_clicked(); void on_cbDrives_currentIndexChanged( const QString& text ); void on_tbClearExport_clicked(); void on_tbRemoveExport_clicked(); void on_tbExport_clicked(); }; #endif // UIMAIN_H ./qwbfsmanager-1.2.1-src/qwbfs/src/CoverFlowView.h0000644000175000017520000000667311543625302021356 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : CoverFlowView.h ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #ifndef COVERFLOWVIEW_H #define COVERFLOWVIEW_H #include "ofi-labs-pictureflow/pictureflow-qt/pictureflow.h" #include class QScrollBar; class QAbstractItemModel; class QModelIndex; class QTimer; class CoverFlowView : public PictureFlow { Q_OBJECT public: CoverFlowView( QWidget* parent = 0 ); virtual ~CoverFlowView(); void setModel( QAbstractItemModel* model ); QAbstractItemModel* model() const; void setColumn( int column ); int column() const; void setDisplayTextColumn( int column ); int displayTextColumn() const; protected: QScrollBar* mScrollBar; QAbstractItemModel* mModel; QPersistentModelIndex mRootIndex; int mColumn; int mDisplayTextColumn; QTimer* mTimer; virtual bool event( QEvent* event ); virtual void resizeEvent( QResizeEvent* event ); virtual void paintEvent( QPaintEvent* event ); QModelIndex modelIndex( int index, int column = -1 ) const; virtual QPixmap pixmap( int index ) const; protected slots: void _q_dataChanged( const QModelIndex& topLeft, const QModelIndex& bottomRight ); void _q_layoutChanged(); void _q_modelReset(); void _q_rowsInserted( const QModelIndex& parent, int start, int end ); void _q_rowsMoved( const QModelIndex& sourceParent, int sourceStart, int sourceEnd, const QModelIndex& destinationParent, int destinationRow ); void _q_rowsRemoved( const QModelIndex& parent, int start, int end ); void delayedResizeEvent(); void initialize( int index = 0 ); void updateScrollBarState(); void preload(); signals: void centerIndexChanged( const QModelIndex& index ); }; #endif // COVERFLOWVIEW_H ./qwbfsmanager-1.2.1-src/qwbfs/src/WorkerThread.h0000644000175000017520000001022111543625415021203 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : WorkerThread.h ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #ifndef WORKERTHREAD_H #define WORKERTHREAD_H #include #include #include #include "models/Disc.h" #include "qwbfsdriver/PartitionHandle.h" #include "qwbfsdriver/Driver.h" class QWidget; class WorkerThread : public QThread { Q_OBJECT enum BasicTask { Export = 0x1, Import = 0x2, Convert = 0x4, Rename = 0x8, ISO = 0x1000, WBFS = 0x2000, Indirect = 0x4000 }; public: enum Task { ExportISO = Export | ISO, ExportWBFS = Export | WBFS, ImportISO = Import | ISO, ImportWBFS = Import | WBFS, ConvertISO = Convert | ISO, ConvertWBFS = Convert | WBFS, RenameAll = Rename | WBFS | ISO }; struct Work { Work() { invalidChars = "/\\:|<>?*\"'"; } WorkerThread::Task task; QWBFS::Model::DiscList discs; QString target; QString pattern; QString invalidChars; QWidget* window; }; WorkerThread( QObject* parent = 0 ); virtual ~WorkerThread(); WorkerThread::Task task() const; bool setWork( const WorkerThread::Work& work ); static QString taskToWindowTitle( WorkerThread::Task task, bool indirect = false ); static QString taskToLabel( WorkerThread::Task task, bool indirect = false ); public slots: void stop(); protected: QMutex mMutex; bool mStop; WorkerThread::Work mWork; virtual void run(); void connectDriver( QWBFS::Driver* driver ); void renameDisc( WorkerThread::Task task, QWBFS::Model::Disc& source, const QString& target, const QString& pattern, const QString& invalidChars ); void isoToWBFS( WorkerThread::Task task, QWBFS::Model::Disc& source, const QString& target, bool trimWBFS, const QString& invalidChars ); void wbfsToISO( WorkerThread::Task task, QWBFS::Model::Disc& source, const QString& target, const QString& invalidChars ); void isoToISO( WorkerThread::Task task, QWBFS::Model::Disc& source, const QString& target, const QString& invalidChars ); void wbfsToWBFS( WorkerThread::Task task, QWBFS::Model::Disc& source, const QString& target, bool trimWBFS, const QString& invalidChars ); signals: void currentProgressChanged( int value, int maximum, const QTime& remaining ); void globalProgressChanged( int value, int maximum ); void jobFinished( const QWBFS::Model::Disc& disc ); void message( const QString& text ); void log( const QString& text ); void canceled(); }; #endif // WORKERTHREAD_H ./qwbfsmanager-1.2.1-src/qwbfs/src/WorkerThread.cpp0000644000175000017520000004413011543625415021544 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : WorkerThread.cpp ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #include "WorkerThread.h" #include #include #include #include #include #include WorkerThread::WorkerThread( QObject* parent ) : QThread( parent ) { qRegisterMetaType( "QWBFS::Model::Disc" ); } WorkerThread::~WorkerThread() { if ( isRunning() ) { qWarning() << "Waiting thread to finish..."; stop(); wait(); } //qWarning() << Q_FUNC_INFO; } WorkerThread::Task WorkerThread::task() const { QMutexLocker locker( &const_cast( this )->mMutex ); return mWork.task; } bool WorkerThread::setWork( const WorkerThread::Work& work ) { if ( isRunning() ) { Q_ASSERT( 0 ); return false; } mWork = work; mWork.window->setWindowTitle( taskToWindowTitle( mWork.task ) ); start(); return true; } QString WorkerThread::taskToWindowTitle( WorkerThread::Task task, bool indirect ) { return taskToLabel( task, indirect ).append( "..." ); } QString WorkerThread::taskToLabel( WorkerThread::Task task, bool indirect ) { switch ( task ) { case WorkerThread::ExportISO: return indirect ? tr( "Indirect Export to ISO" ) : tr( "Export to ISO" ); case WorkerThread::ExportWBFS: return indirect ? tr( "Indirect Export to WBFS" ) : tr( "Export to WBFS" ); case WorkerThread::ImportISO: return indirect ? tr( "Indirect Import to ISO" ) : tr( "Import to ISO" ); case WorkerThread::ImportWBFS: return indirect ? tr( "Indirect Import to WBFS" ) : tr( "Import to WBFS" ); case WorkerThread::ConvertISO: return indirect ? tr( "Indirect Convert to ISO" ) : tr( "Convert to ISO" ); case WorkerThread::ConvertWBFS: return indirect ? tr( "Indirect Convert to WBFS" ) : tr( "Convert to WBFS" ); case WorkerThread::RenameAll: return tr( "Rename Disc" ); } return QString::null; } void WorkerThread::stop() { QMutexLocker locker( &mMutex ); mStop = true; emit canceled(); } void WorkerThread::run() { WorkerThread::Work work; int count = 0; int id = 0; { QMutexLocker locker( &mMutex ); mStop = false; work = mWork; } emit globalProgressChanged( id, count ); if ( work.task == WorkerThread::RenameAll ) { QDir dir( work.target ); QStringList filters; dir.setFilter( QDir::Files ); if ( work.task & WorkerThread::WBFS ) { filters << "*.wbfs"; } if ( work.task & WorkerThread::ISO ) { filters << "*.iso"; } foreach ( const QString& filePath, pCoreUtils::findFiles( dir, filters, true ) ) { work.discs << QWBFS::Model::Disc( filePath ); } } count = work.discs.count(); emit globalProgressChanged( id, count ); foreach ( QWBFS::Model::Disc disc, work.discs ) { switch ( work.task ) { case WorkerThread::RenameAll: renameDisc( work.task, disc, work.target, work.pattern, work.invalidChars ); break; case WorkerThread::ExportISO: case WorkerThread::ExportWBFS: case WorkerThread::ImportISO: case WorkerThread::ImportWBFS: case WorkerThread::ConvertISO: case WorkerThread::ConvertWBFS: { switch ( QWBFS::Driver::fileType( disc.origin ) ) { case QWBFS::Driver::WBFSFile: case QWBFS::Driver::WBFSPartitionFile: { switch ( QWBFS::Driver::fileType( work.target ) ) { case QWBFS::Driver::WBFSPartitionFile: { wbfsToWBFS( work.task, disc, work.target, false, work.invalidChars ); break; } case QWBFS::Driver::WBFSFile: case QWBFS::Driver::ISOFile: case QWBFS::Driver::UnknownFile: { if ( work.task & WorkerThread::WBFS ) { wbfsToWBFS( work.task, disc, work.target, true, work.invalidChars ); } else if ( work.task & WorkerThread::ISO ) { wbfsToISO( work.task, disc, work.target, work.invalidChars ); } else { if ( work.task & WorkerThread::Import ) { disc.error = QWBFS::Driver::DiscAddFailed; } else if ( work.task & WorkerThread::Export ) { disc.error = QWBFS::Driver::DiscExtractFailed; } else if ( work.task & WorkerThread::Convert ) { disc.error = QWBFS::Driver::DiscConvertFailed; } else { disc.error = QWBFS::Driver::UnknownError; } } break; } } break; } case QWBFS::Driver::ISOFile: { switch ( QWBFS::Driver::fileType( work.target ) ) { case QWBFS::Driver::WBFSPartitionFile: { isoToWBFS( work.task, disc, work.target, false, work.invalidChars ); break; } case QWBFS::Driver::WBFSFile: case QWBFS::Driver::ISOFile: case QWBFS::Driver::UnknownFile: { if ( work.task & WorkerThread::WBFS ) { isoToWBFS( work.task, disc, work.target, true, work.invalidChars ); } else if ( work.task & WorkerThread::ISO ) { isoToISO( work.task, disc, work.target, work.invalidChars ); } else { if ( work.task & WorkerThread::Import ) { disc.error = QWBFS::Driver::DiscAddFailed; } else if ( work.task & WorkerThread::Export ) { disc.error = QWBFS::Driver::DiscExtractFailed; } else if ( work.task & WorkerThread::Convert ) { disc.error = QWBFS::Driver::DiscConvertFailed; } else { disc.error = QWBFS::Driver::UnknownError; } } break; } } break; } case QWBFS::Driver::UnknownFile: disc.error = QWBFS::Driver::UnknownError; break; } } } disc.state = disc.error == QWBFS::Driver::Ok ? QWBFS::Driver::Success : QWBFS::Driver::Failed; emit globalProgressChanged( ++id, count ); emit jobFinished( disc ); { QMutexLocker locker( &mMutex ); if ( mStop ) { break; } } } emit globalProgressChanged( count, count ); } void WorkerThread::connectDriver( QWBFS::Driver* driver ) { connect( driver, SIGNAL( currentProgressChanged( int, int, const QTime& ) ), this, SIGNAL( currentProgressChanged( int, int, const QTime& ) ) ); connect( driver, SIGNAL( globalProgressChanged( int, int ) ), this, SIGNAL( globalProgressChanged( int, int ) ) ); } void WorkerThread::renameDisc( WorkerThread::Task task, QWBFS::Model::Disc& source, const QString& target, const QString& pattern, const QString& invalidChars ) { if ( !source.isValid() ) { source.error = QWBFS::Driver::InvalidDisc; return; } /* %title = Game Title %id = Game ID %suffix = File Suffix */ QString filePath = QString( "%1/%2" ) .arg( target ) .arg( pattern ) .replace( "%title", QWBFS::Model::Disc::cleanupGameTitle( source.title, invalidChars ), Qt::CaseInsensitive ) .replace( "%id", source.id.toUpper(), Qt::CaseInsensitive ) .replace( "%suffix", QFileInfo( source.origin ).suffix(), Qt::CaseInsensitive ) ; emit message( QString( "%1 '%2'..." ).arg( taskToLabel( task ) ).arg( source.baseName( invalidChars ) ) ); emit currentProgressChanged( 0, 1, QTime( 0, 0, 0 ) ); if ( source.origin != filePath ) { source.error = QDir( target ).mkpath( QFileInfo( filePath ).absolutePath() ) ? QWBFS::Driver::Ok : QWBFS::Driver::UnknownError; if ( !source.hasError() ) { const bool exists = QFile::exists( filePath ); if ( exists ) { const QFileInfo file( filePath ); const QString path = file.absolutePath(); const QString fileName = file.fileName(); filePath = QString( "%1/Existing/%2.%3" ) .arg( path ) .arg( fileName ) .arg( QDateTime::currentDateTime().toString( "yyyy-MM-dd hh'h'mm" ) ); QDir( path ).mkpath( "Existing" ); } source.error = QFile::rename( source.origin, filePath ) ? QWBFS::Driver::Ok : QWBFS::Driver::DiscRenameFailed; if ( exists ) { source.error = QWBFS::Driver::DiscFound; } if ( !source.hasError() ) { const QString sourcePath = QFileInfo( source.origin ).absolutePath(); if ( pCoreUtils::isEmptyDirectory( sourcePath ) ) { QDir( sourcePath ).rmdir( sourcePath ); } } } } else { source.error = QWBFS::Driver::Ok; } emit currentProgressChanged( 1, 1, QTime( 0, 0, 0 ) ); } void WorkerThread::isoToWBFS( WorkerThread::Task task, QWBFS::Model::Disc& source, const QString& _target, bool trimWBFS, const QString& invalidChars ) { if ( !source.isValid() ) { source.error = QWBFS::Driver::InvalidDisc; return; } const QFileInfo file( _target ); QString target = _target; bool created = false; QWBFS::Partition::Handle handle; if ( trimWBFS && file.isDir() ) { target = QDir::cleanPath( target.append( QString( "/%1.wbfs" ).arg( source.baseName( invalidChars ) ) ) ); } if ( trimWBFS ) { if ( QFile::exists( target ) ) { source.error = QWBFS::Driver::DiscFound; return; } emit message( tr( "Initializing WBFS disc '%1'..." ).arg( source.baseName( invalidChars ) ) ); source.error = QWBFS::Driver::allocateFile( target ); if ( source.hasError() ) { QFile::remove( target ); return; } QWBFS::Partition::Properties properties( target ); properties.reset = true; emit message( tr( "Formating WBFS disc '%1'..." ).arg( source.baseName( invalidChars ) ) ); handle = QWBFS::Partition::Handle( properties ); } else { handle = QWBFS::Driver::getHandle( target, &created ); } if ( !handle.isValid() ) { if ( created ) { QWBFS::Driver::closeHandle( handle ); } if ( trimWBFS ) { QFile::remove( target ); } source.error = QWBFS::Driver::PartitionNotOpened; return; } QWBFS::Driver driver( 0, handle ); connectDriver( &driver ); emit message( QString( "%1 '%2'..." ).arg( taskToLabel( task ) ).arg( source.baseName( invalidChars ) ) ); source.error = driver.addDiscImage( source.origin ); if ( source.hasError() ) { if ( created ) { QWBFS::Driver::closeHandle( handle ); } if ( trimWBFS ) { QFile::remove( target ); } return; } if ( trimWBFS ) { source.error = driver.trim(); } if ( created ) { QWBFS::Driver::closeHandle( handle ); } } void WorkerThread::wbfsToISO( WorkerThread::Task task, QWBFS::Model::Disc& source, const QString& _target, const QString& invalidChars ) { if ( !source.isValid() ) { source.error = QWBFS::Driver::InvalidDisc; return; } QFileInfo file( _target ); QString target = _target; if ( file.isDir() ) { target = QDir::cleanPath( target.append( QString( "/%1.iso" ).arg( source.baseName( invalidChars ) ) ) ); } if ( QFile::exists( target ) ) { source.error = QWBFS::Driver::DiscFound; return; } file.setFile( target ); bool created = false; QWBFS::Partition::Handle handle = QWBFS::Driver::getHandle( source.origin, &created ); // check handle validity if ( !handle.isValid() ) { if ( created ) { QWBFS::Driver::closeHandle( handle ); } source.error = QWBFS::Driver::PartitionNotOpened; return; } QWBFS::Driver driver( 0, handle ); connectDriver( &driver ); emit message( QString( "%1 '%2'..." ).arg( taskToLabel( task ) ).arg( source.baseName( invalidChars ) ) ); source.error = driver.extractDisc( source.id, file.absolutePath(), file.fileName() ); if ( source.hasError() ) { QFile::remove( target ); } if ( created ) { QWBFS::Driver::closeHandle( handle ); } } void WorkerThread::isoToISO( WorkerThread::Task task, QWBFS::Model::Disc& source, const QString& _target, const QString& invalidChars ) { if ( !source.isValid() ) { source.error = QWBFS::Driver::InvalidDisc; return; } const QFileInfo file( _target ); QString target = _target; if ( file.isDir() ) { target = QDir::cleanPath( target.append( QString( "/%1.iso" ).arg( source.baseName( invalidChars ) ) ) ); } if ( QFile::exists( target ) ) { source.error = QWBFS::Driver::DiscFound; return; } emit message( QString( "%1 '%2'..." ).arg( taskToLabel( task ) ).arg( source.baseName( invalidChars ) ) ); // copying the file chunk by chunk instead of using QFile::copy() to be able to see progression QFile in( source.origin ); QFile out( target ); if ( !in.open( QIODevice::ReadOnly ) ) { source.error = QWBFS::Driver::DiscReadFailed; return; } if ( !out.open( QIODevice::WriteOnly ) ) { source.error = QWBFS::Driver::DiscWriteFailed; return; } const uint bufferSize = 1024 *1024 *5; // 5 MB buffer size char buffer[ bufferSize ]; int totalRead = 0; QTime estimatedTime = QWBFS::Driver::estimatedTimeForTask( totalRead, in.size() ); emit currentProgressChanged( totalRead, in.size(), estimatedTime ); while ( !in.atEnd() ) { const qint64 read = in.read( buffer, bufferSize ); if ( read == -1 ) { out.close(); out.remove(); QFile::remove( target ); source.error = QWBFS::Driver::DiscReadFailed; return; } const qint64 write = out.write( buffer, read ); if ( write == -1 ) { out.close(); out.remove(); QFile::remove( target ); source.error = QWBFS::Driver::DiscWriteFailed; return; } totalRead += read; estimatedTime = QWBFS::Driver::estimatedTimeForTask( totalRead, in.size() ); emit currentProgressChanged( totalRead, in.size(), estimatedTime ); } in.close(); out.close(); } void WorkerThread::wbfsToWBFS( WorkerThread::Task task, QWBFS::Model::Disc& source, const QString& _target, bool trimWBFS, const QString& invalidChars ) { if ( !source.isValid() ) { source.error = QWBFS::Driver::InvalidDisc; return; } const QFileInfo file( _target ); QString target = _target; bool sourceCreated = false; QWBFS::Partition::Handle sourceHandle = QWBFS::Driver::getHandle( source.origin, &sourceCreated ); bool targetCreated = false; QWBFS::Partition::Handle targetHandle; if ( !sourceHandle.isValid() ) { if ( sourceCreated ) { QWBFS::Driver::closeHandle( sourceHandle ); } source.error = QWBFS::Driver::PartitionNotOpened; return; } if ( trimWBFS && file.isDir() ) { target = QDir::cleanPath( target.append( QString( "/%1.wbfs" ).arg( source.baseName( invalidChars ) ) ) ); } if ( trimWBFS ) { if ( QFile::exists( target ) ) { if ( sourceCreated ) { QWBFS::Driver::closeHandle( sourceHandle ); } source.error = QWBFS::Driver::DiscFound; return; } emit message( tr( "Initializing WBFS disc '%1'..." ).arg( source.baseName( invalidChars ) ) ); source.error = QWBFS::Driver::allocateFile( target ); if ( source.hasError() ) { if ( sourceCreated ) { QWBFS::Driver::closeHandle( sourceHandle ); } QFile::remove( target ); return; } QWBFS::Partition::Properties properties( target ); properties.reset = true; emit message( tr( "Formating WBFS disc '%1'..." ).arg( source.baseName( invalidChars ) ) ); targetHandle = QWBFS::Partition::Handle( properties ); } else { targetHandle = QWBFS::Driver::getHandle( target, &targetCreated ); } if ( !targetHandle.isValid() ) { if ( sourceCreated ) { QWBFS::Driver::closeHandle( sourceHandle ); } if ( targetCreated ) { QWBFS::Driver::closeHandle( targetHandle ); } if ( trimWBFS ) { QFile::remove( target ); } source.error = QWBFS::Driver::PartitionNotOpened; return; } QWBFS::Driver targetDriver( 0, targetHandle ); connectDriver( &targetDriver ); // direct drive2drive if ( targetDriver.canDrive2Drive( sourceHandle ) == QWBFS::Driver::Ok ) { emit message( QString( "%1 '%2'..." ).arg( taskToLabel( task ) ).arg( source.baseName( invalidChars ) ) ); source.error = targetDriver.addDisc( source.id, sourceHandle ); } // indirect drive2drive else { emit message( QString( "%1 '%2'..." ).arg( taskToLabel( task, true ) ).arg( source.baseName( invalidChars ) ) ); const QFileInfo tmpFile( QString( "%1/%2.iso" ).arg( QDir::tempPath() ).arg( source.baseName( invalidChars ) ) ); QWBFS::Driver sourceDriver( 0, sourceHandle ); connectDriver( &sourceDriver ); if ( targetDriver.hasDisc( source.id ) == QWBFS::Driver::DiscNotFound ) { source.error = sourceDriver.extractDisc( source.id, tmpFile.absolutePath(), tmpFile.fileName() ); if ( !source.hasError() ) { source.error = targetDriver.addDiscImage( tmpFile.absoluteFilePath() ); } QFile::remove( tmpFile.absoluteFilePath() ); } else { source.error = QWBFS::Driver::DiscFound; } } if ( !source.hasError() && trimWBFS ) { source.error = targetDriver.trim(); } if ( sourceCreated ) { QWBFS::Driver::closeHandle( sourceHandle ); } if ( targetCreated ) { QWBFS::Driver::closeHandle( targetHandle ); } if ( source.hasError() && trimWBFS ) { QFile::remove( target ); } } ./qwbfsmanager-1.2.1-src/qwbfs/src/Gauge.h0000644000175000017520000000476411534466576017664 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : Gauge.h ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #ifndef GAUGE_H #define GAUGE_H #include class Gauge : public QWidget { Q_OBJECT public: Gauge( QWidget* parent = 0 ); virtual ~Gauge(); virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; qint64 size() const; qint64 usedSize() const; qint64 freeSize() const; qint64 temporarySize() const; public slots: void setSize( qint64 value ); void setUsedSize( qint64 value ); void setFreeSize( qint64 value ); void setTemporarySize( qint64 value ); protected: qint64 mSize; qint64 mUsedSize; qint64 mFreeSize; qint64 mTemporarySize; virtual void paintEvent( QPaintEvent* event ); }; #endif // GAUGE_H ./qwbfsmanager-1.2.1-src/qwbfs/src/PropertiesDialog.ui0000644000175000017520000003245711531312333022250 0ustar pasnoxpasnox PropertiesDialog 0 0 436 296 Properties 0 General 0 0 75 true Application locale QFrame::StyledPanel QFrame::Sunken en_US Qt::AlignCenter Click here to change the application locale :/icons/256/folder.png:/icons/256/folder.png 20 20 true 0 0 View Mode 0 0 View Icon Type Qt::Vertical 16 176 Covers' Cache Path 0 Browse for a folder :/icons/256/folder.png:/icons/256/folder.png 20 20 true Qt::Horizontal QSizePolicy::Preferred 69 16 Use the system temporary directory Disk Size QAbstractSpinBox::PlusMinus Unlimited MB 999999999 Qt::Vertical 365 105 Proxy 6 Type Login false Password false QLineEdit::PasswordEchoOnEdit Qt::Vertical 369 41 Server false Port false 65535 255 0 0 255 0 0 151 150 150 75 true PLEASE NOTE THAT THE PASSWORD IS ENCRYPTED WITH A SHIT METHOD. BE CAREFUL. Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true QDialogButtonBox::Cancel|QDialogButtonBox::Ok dbbButtons accepted() PropertiesDialog accept() 271 276 283 295 dbbButtons rejected() PropertiesDialog reject() 173 277 191 295 cbCacheUseTemporary toggled(bool) wCachePathContainer setDisabled(bool) 251 81 367 57 ./qwbfsmanager-1.2.1-src/qwbfs/src/Properties.h0000644000175000017520000000773711534466576020773 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : Properties.h ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #ifndef PROPERTIES_H #define PROPERTIES_H #include #include #include #include #include #include "wiitdb/Covers.h" class QSettings; class UIMain; class Properties : public QObject { Q_OBJECT public: Properties( QObject* parent = 0 ); virtual ~Properties(); QString temporaryPath() const; QString cacheWorkingPath() const; void setCacheWorkingPath( const QString& path ); qint64 cacheDiskSize() const; void setCacheDiskSize( qint64 sizeByte ); bool cacheUseTemporaryPath() const; void setCacheUseTemporaryPath( bool useTemporary ); QNetworkProxy::ProxyType proxyType() const; void setProxyType( QNetworkProxy::ProxyType type ); QString proxyServer() const; void setProxyServer( const QString& server ); int proxyPort() const; void setProxyPort( int port ); QString proxyLogin() const; void setProxyLogin( const QString& login ); QString proxyPassword() const; void setProxyPassword( const QString& password ); QDateTime updateLastUpdated() const; void setUpdateLastUpdated( const QDateTime& dateTime ); QDateTime updateLastChecked() const; void setUpdateLastChecked( const QDateTime& dateTime ); QStringList translationsPaths() const; void setTranslationsPaths( const QStringList& translationsPaths ); bool localeAccepted() const; void setLocaleAccepted( bool accepted ); QLocale locale() const; void setLocale( const QLocale& locale ); QListView::ViewMode viewMode() const; void setViewMode( QListView::ViewMode mode ); QWBFS::WiiTDB::Scan viewIconType() const; void setViewIconType( QWBFS::WiiTDB::Scan scan ); void restoreState( UIMain* window ) const; void saveState( UIMain* window ); QString selectedPath() const; void setSelectedPath( const QString& path ); QString selectedPartition() const; void setSelectedPartition( const QString& partition ); QStringList customPartitions() const; void setCustomPartitions( const QStringList& partitions ); static QString decrypt( const QByteArray& data ); static QByteArray crypt( const QString& string ); protected: QSettings* mSettings; }; #endif // PROPERTIES_H ./qwbfsmanager-1.2.1-src/qwbfs/src/ofi-labs-pictureflow/0000755000175000017520000000000011546156115022471 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/qwbfs/src/ofi-labs-pictureflow/ChangeLog0000644000175000017520000000031211534026570024235 0ustar pasnoxpasnox PictureFlow version 0.1.0 (initial release) basic functionality similar to Apple's Cover Flow optimized software renderer optional blur effect for the reflection single code base for Qt 4/3/2 ./qwbfsmanager-1.2.1-src/qwbfs/src/ofi-labs-pictureflow/pictureflow-qt/0000755000175000017520000000000011546156115025456 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/qwbfs/src/ofi-labs-pictureflow/pictureflow-qt/pictureflow.h0000644000175000017520000001262611534026570030177 0ustar pasnoxpasnox/* PictureFlow - animated image show widget http://pictureflow.googlecode.com Copyright (C) 2009 Ariya Hidayat (ariya@kde.org) Copyright (C) 2008 Ariya Hidayat (ariya@kde.org) Copyright (C) 2007 Ariya Hidayat (ariya@kde.org) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef PICTUREFLOW_H #define PICTUREFLOW_H #include class PictureFlowPrivate; /*! Class PictureFlow implements an image show widget with animation effect like Apple's CoverFlow (in iTunes and iPod). Images are arranged in form of slides, one main slide is shown at the center with few slides on the left and right sides of the center slide. When the next or previous slide is brought to the front, the whole slides flow to the right or the right with smooth animation effect; until the new slide is finally placed at the center. */ class PictureFlow : public QWidget { Q_OBJECT Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor) Q_PROPERTY(QSize slideSize READ slideSize WRITE setSlideSize) Q_PROPERTY(int slideCount READ slideCount) Q_PROPERTY(int centerIndex READ centerIndex WRITE setCenterIndex) public: enum ReflectionEffect { NoReflection, PlainReflection, BlurredReflection }; /*! Creates a new PictureFlow widget. */ PictureFlow(QWidget* parent = 0); /*! Destroys the widget. */ ~PictureFlow(); /*! Returns the background color. */ QColor backgroundColor() const; /*! Sets the background color. By default it is black. */ void setBackgroundColor(const QColor& c); /*! Returns the dimension of each slide (in pixels). */ QSize slideSize() const; /*! Sets the dimension of each slide (in pixels). */ void setSlideSize(QSize size); /*! Returns the total number of slides. */ int slideCount() const; /*! Returns QImage of specified slide. */ QImage slide(int index) const; /*! Returns the index of slide currently shown in the middle of the viewport. */ int centerIndex() const; /*! Returns the effect applied to the reflection. */ ReflectionEffect reflectionEffect() const; /*! Sets the effect applied to the reflection. The default is PlainReflection. */ void setReflectionEffect(ReflectionEffect effect); public slots: /*! Adds a new slide. */ void addSlide(const QImage& image); /*! Adds a new slide. */ void addSlide(const QPixmap& pixmap); /*! Inserts a new slide at given position. */ void insertSlide(int index, const QImage& image); /*! Inserts a new slide at given position. */ void insertSlide(int index, const QPixmap& pixmap); /*! Removes an existing slide. */ void removeSlide(int index); /*! Sets an image for specified slide. If the slide already exists, it will be replaced. */ void setSlide(int index, const QImage& image); /*! Sets a pixmap for specified slide. If the slide already exists, it will be replaced. */ void setSlide(int index, const QPixmap& pixmap); /*! Sets slide to be shown in the middle of the viewport. No animation effect will be produced, unlike using showSlide. */ void setCenterIndex(int index); /*! Clears all slides. */ void clear(); /*! Shows previous slide using animation effect. */ void showPrevious(); /*! Shows next slide using animation effect. */ void showNext(); /*! Go to specified slide using animation effect. */ void showSlide(int index); /*! Rerender the widget. Normally this function will be automatically invoked whenever necessary, e.g. during the transition animation. */ void render(); /*! Schedules a rendering update. Unlike render(), this function does not cause immediate rendering. */ void triggerRender(); signals: void centerIndexChanged(int index); protected: void paintEvent(QPaintEvent *event); void keyPressEvent(QKeyEvent* event); void mousePressEvent(QMouseEvent* event); void wheelEvent(QWheelEvent* event); void resizeEvent(QResizeEvent* event); int animatorStep() const; private slots: void updateAnimation(); private: PictureFlowPrivate* d; }; #endif // PICTUREFLOW_H ./qwbfsmanager-1.2.1-src/qwbfs/src/ofi-labs-pictureflow/pictureflow-qt/pictureflow.pro0000644000175000017520000000013711534026570030542 0ustar pasnoxpasnoxTARGET = pictureflow TEMPLATE = app HEADERS = pictureflow.h SOURCES = pictureflow.cpp main.cpp ./qwbfsmanager-1.2.1-src/qwbfs/src/ofi-labs-pictureflow/pictureflow-qt/pictureflow.cpp0000644000175000017520000007217011534026570030532 0ustar pasnoxpasnox/* PictureFlow - animated image show widget http://pictureflow.googlecode.com Copyright (C) 2009 Ariya Hidayat (ariya@kde.org) Copyright (C) 2008 Ariya Hidayat (ariya@kde.org) Copyright (C) 2007 Ariya Hidayat (ariya@kde.org) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "pictureflow.h" // detect Qt version #if QT_VERSION < 0x040300 #error PictureFlow widgets need Qt 4.3 or later #endif #include #include #include #include #include #include #include #include #include #include // for fixed-point arithmetic, we need minimum 32-bit long // long long (64-bit) might be useful for multiplication and division typedef long PFreal; #define PFREAL_SHIFT 10 #define PFREAL_ONE (1 << PFREAL_SHIFT) #define IANGLE_MAX 1024 #define IANGLE_MASK 1023 inline PFreal fmul(PFreal a, PFreal b) { return ((long long)(a))*((long long)(b)) >> PFREAL_SHIFT; } inline PFreal fdiv(PFreal num, PFreal den) { long long p = (long long)(num) << (PFREAL_SHIFT * 2); long long q = p / (long long)den; long long r = q >> PFREAL_SHIFT; return r; } inline PFreal fsin(int iangle) { // warning: regenerate the table if IANGLE_MAX and PFREAL_SHIFT are changed! static const PFreal tab[] = { 3, 103, 202, 300, 394, 485, 571, 652, 726, 793, 853, 904, 947, 980, 1004, 1019, 1023, 1018, 1003, 978, 944, 901, 849, 789, 721, 647, 566, 479, 388, 294, 196, 97, -4, -104, -203, -301, -395, -486, -572, -653, -727, -794, -854, -905, -948, -981, -1005, -1020, -1024, -1019, -1004, -979, -945, -902, -850, -790, -722, -648, -567, -480, -389, -295, -197, -98, 3 }; while (iangle < 0) iangle += IANGLE_MAX; iangle &= IANGLE_MASK; int i = (iangle >> 4); PFreal p = tab[i]; PFreal q = tab[(i+1)]; PFreal g = (q - p); return p + g *(iangle - i*16) / 16; } inline PFreal fcos(int iangle) { return fsin(iangle + (IANGLE_MAX >> 2)); } /* ---------------------------------------------------------- PictureFlowState stores the state of all slides, i.e. all the necessary information to be able to render them. PictureFlowAnimator is responsible to move the slides during the transition between slides, to achieve the effect similar to Cover Flow, by changing the state. PictureFlowSoftwareRenderer (or PictureFlowOpenGLRenderer) is the actual 3-d renderer. It should render all slides given the state (an instance of PictureFlowState). Instances of all the above three classes are stored in PictureFlowPrivate. ------------------------------------------------------- */ struct SlideInfo { int slideIndex; int angle; PFreal cx; PFreal cy; int blend; }; class PictureFlowState { public: PictureFlowState(); ~PictureFlowState(); void reposition(); void reset(); QRgb backgroundColor; int slideWidth; int slideHeight; PictureFlow::ReflectionEffect reflectionEffect; QVector slideImages; int angle; int spacing; PFreal offsetX; PFreal offsetY; SlideInfo centerSlide; QVector leftSlides; QVector rightSlides; int centerIndex; }; class PictureFlowAnimator { public: PictureFlowAnimator(); PictureFlowState* state; void start(int slide); void stop(int slide); void update(); int target; int step; int frame; QTimer animateTimer; }; class PictureFlowAbstractRenderer { public: PictureFlowAbstractRenderer(): state(0), dirty(false), widget(0) {} virtual ~PictureFlowAbstractRenderer() {} PictureFlowState* state; bool dirty; QWidget* widget; virtual void init() = 0; virtual void paint() = 0; }; class PictureFlowSoftwareRenderer: public PictureFlowAbstractRenderer { public: PictureFlowSoftwareRenderer(); ~PictureFlowSoftwareRenderer(); virtual void init(); virtual void paint(); private: QSize size; QRgb bgcolor; int effect; QImage buffer; QVector rays; QImage* blankSurface; QCache surfaceCache; QHash imageHash; void render(); void renderSlides(); QRect renderSlide(const SlideInfo &slide, int col1 = -1, int col2 = -1); QImage* surface(int slideIndex); }; // ------------- PictureFlowState --------------------------------------- PictureFlowState::PictureFlowState(): backgroundColor(0), slideWidth(150), slideHeight(200), reflectionEffect(PictureFlow::BlurredReflection), centerIndex(0) { } PictureFlowState::~PictureFlowState() { for (int i = 0; i < (int)slideImages.count(); i++) delete slideImages[i]; } // readjust the settings, call this when slide dimension is changed void PictureFlowState::reposition() { angle = 70 * IANGLE_MAX / 360; // approx. 70 degrees tilted offsetX = slideWidth / 2 * (PFREAL_ONE - fcos(angle)); offsetY = slideWidth / 2 * fsin(angle); offsetX += slideWidth * PFREAL_ONE; offsetY += slideWidth * PFREAL_ONE / 4; spacing = 40; } // adjust slides so that they are in "steady state" position void PictureFlowState::reset() { centerSlide.angle = 0; centerSlide.cx = 0; centerSlide.cy = 0; centerSlide.slideIndex = centerIndex; centerSlide.blend = 256; leftSlides.resize(6); for (int i = 0; i < (int)leftSlides.count(); i++) { SlideInfo& si = leftSlides[i]; si.angle = angle; si.cx = -(offsetX + spacing * i * PFREAL_ONE); si.cy = offsetY; si.slideIndex = centerIndex - 1 - i; si.blend = 256; if (i == (int)leftSlides.count() - 2) si.blend = 128; if (i == (int)leftSlides.count() - 1) si.blend = 0; } rightSlides.resize(6); for (int i = 0; i < (int)rightSlides.count(); i++) { SlideInfo& si = rightSlides[i]; si.angle = -angle; si.cx = offsetX + spacing * i * PFREAL_ONE; si.cy = offsetY; si.slideIndex = centerIndex + 1 + i; si.blend = 256; if (i == (int)rightSlides.count() - 2) si.blend = 128; if (i == (int)rightSlides.count() - 1) si.blend = 0; } } // ------------- PictureFlowAnimator --------------------------------------- PictureFlowAnimator::PictureFlowAnimator(): state(0), target(0), step(0), frame(0) { } void PictureFlowAnimator::start(int slide) { target = slide; if (!animateTimer.isActive() && state) { step = (target < state->centerSlide.slideIndex) ? -1 : 1; animateTimer.start(30); } } void PictureFlowAnimator::stop(int slide) { step = 0; target = slide; frame = slide << 16; animateTimer.stop(); } void PictureFlowAnimator::update() { if (!animateTimer.isActive()) return; if (step == 0) return; if (!state) return; int speed = 16384 / 4; #if 1 // deaccelerate when approaching the target const int max = 2 * 65536; int fi = frame; fi -= (target << 16); if (fi < 0) fi = -fi; fi = qMin(fi, max); int ia = IANGLE_MAX * (fi - max / 2) / (max * 2); speed = 512 + 16384 * (PFREAL_ONE + fsin(ia)) / PFREAL_ONE; #endif frame += speed * step; int index = frame >> 16; int pos = frame & 0xffff; int neg = 65536 - pos; int tick = (step < 0) ? neg : pos; PFreal ftick = (tick * PFREAL_ONE) >> 16; if (step < 0) index++; if (state->centerIndex != index) { state->centerIndex = index; frame = index << 16; state->centerSlide.slideIndex = state->centerIndex; for (int i = 0; i < (int)state->leftSlides.count(); i++) state->leftSlides[i].slideIndex = state->centerIndex - 1 - i; for (int i = 0; i < (int)state->rightSlides.count(); i++) state->rightSlides[i].slideIndex = state->centerIndex + 1 + i; } state->centerSlide.angle = (step * tick * state->angle) >> 16; state->centerSlide.cx = -step * fmul(state->offsetX, ftick); state->centerSlide.cy = fmul(state->offsetY, ftick); if (state->centerIndex == target) { stop(target); state->reset(); return; } for (int i = 0; i < (int)state->leftSlides.count(); i++) { SlideInfo& si = state->leftSlides[i]; si.angle = state->angle; si.cx = -(state->offsetX + state->spacing * i * PFREAL_ONE + step * state->spacing * ftick); si.cy = state->offsetY; } for (int i = 0; i < (int)state->rightSlides.count(); i++) { SlideInfo& si = state->rightSlides[i]; si.angle = -state->angle; si.cx = state->offsetX + state->spacing * i * PFREAL_ONE - step * state->spacing * ftick; si.cy = state->offsetY; } if (step > 0) { PFreal ftick = (neg * PFREAL_ONE) >> 16; state->rightSlides[0].angle = -(neg * state->angle) >> 16; state->rightSlides[0].cx = fmul(state->offsetX, ftick); state->rightSlides[0].cy = fmul(state->offsetY, ftick); } else { PFreal ftick = (pos * PFREAL_ONE) >> 16; state->leftSlides[0].angle = (pos * state->angle) >> 16; state->leftSlides[0].cx = -fmul(state->offsetX, ftick); state->leftSlides[0].cy = fmul(state->offsetY, ftick); } // must change direction ? if (target < index) if (step > 0) step = -1; if (target > index) if (step < 0) step = 1; // the first and last slide must fade in/fade out int nleft = state->leftSlides.count(); int nright = state->rightSlides.count(); int fade = pos / 256; for (int index = 0; index < nleft; index++) { int blend = 256; if (index == nleft - 1) blend = (step > 0) ? 0 : 128 - fade / 2; if (index == nleft - 2) blend = (step > 0) ? 128 - fade / 2 : 256 - fade / 2; if (index == nleft - 3) blend = (step > 0) ? 256 - fade / 2 : 256; state->leftSlides[index].blend = blend; } for (int index = 0; index < nright; index++) { int blend = (index < nright - 2) ? 256 : 128; if (index == nright - 1) blend = (step > 0) ? fade / 2 : 0; if (index == nright - 2) blend = (step > 0) ? 128 + fade / 2 : fade / 2; if (index == nright - 3) blend = (step > 0) ? 256 : 128 + fade / 2; state->rightSlides[index].blend = blend; } } // ------------- PictureFlowSoftwareRenderer --------------------------------------- PictureFlowSoftwareRenderer::PictureFlowSoftwareRenderer(): PictureFlowAbstractRenderer(), size(0, 0), bgcolor(0), effect(-1), blankSurface(0) { } PictureFlowSoftwareRenderer::~PictureFlowSoftwareRenderer() { surfaceCache.clear(); buffer = QImage(); delete blankSurface; } void PictureFlowSoftwareRenderer::paint() { if (!widget) return; if (widget->size() != size) init(); if (state->backgroundColor != bgcolor) { bgcolor = state->backgroundColor; surfaceCache.clear(); } if ((int)(state->reflectionEffect) != effect) { effect = (int)state->reflectionEffect; surfaceCache.clear(); } if (dirty) render(); QPainter painter(widget); painter.drawImage(QPoint(0, 0), buffer); } void PictureFlowSoftwareRenderer::init() { if (!widget) return; surfaceCache.clear(); blankSurface = 0; size = widget->size(); int ww = size.width(); int wh = size.height(); int w = (ww + 1) / 2; int h = (wh + 1) / 2; buffer = QImage(ww, wh, QImage::Format_RGB32); buffer.fill(bgcolor); rays.resize(w*2); for (int i = 0; i < w; i++) { PFreal gg = ((PFREAL_ONE >> 1) + i * PFREAL_ONE) / (2 * h); rays[w-i-1] = -gg; rays[w+i] = gg; } dirty = true; } // TODO: optimize this with lookup tables static QRgb blendColor(QRgb c1, QRgb c2, int blend) { int r = qRed(c1) * blend / 256 + qRed(c2) * (256 - blend) / 256; int g = qGreen(c1) * blend / 256 + qGreen(c2) * (256 - blend) / 256; int b = qBlue(c1) * blend / 256 + qBlue(c2) * (256 - blend) / 256; return qRgb(r, g, b); } static QImage* prepareSurface(const QImage* slideImage, int w, int h, QRgb bgcolor, PictureFlow::ReflectionEffect reflectionEffect) { Qt::TransformationMode mode = Qt::SmoothTransformation; QImage img = slideImage->scaled(w, h, Qt::IgnoreAspectRatio, mode); // slightly larger, to accomodate for the reflection int hs = h * 2; int hofs = h / 3; // offscreen buffer: black is sweet QImage* result = new QImage(hs, w, QImage::Format_RGB32); result->fill(bgcolor); // transpose the image, this is to speed-up the rendering // because we process one column at a time // (and much better and faster to work row-wise, i.e in one scanline) for (int x = 0; x < w; x++) for (int y = 0; y < h; y++) result->setPixel(hofs + y, x, img.pixel(x, y)); if (reflectionEffect != PictureFlow::NoReflection) { // create the reflection int ht = hs - h - hofs; int hte = ht; for (int x = 0; x < w; x++) for (int y = 0; y < ht; y++) { QRgb color = img.pixel(x, img.height() - y - 1); result->setPixel(h + hofs + y, x, blendColor(color, bgcolor, 128*(hte - y) / hte)); } if (reflectionEffect == PictureFlow::BlurredReflection) { // blur the reflection everything first // Based on exponential blur algorithm by Jani Huhtanen QRect rect(hs / 2, 0, hs / 2, w); rect &= result->rect(); int r1 = rect.top(); int r2 = rect.bottom(); int c1 = rect.left(); int c2 = rect.right(); int bpl = result->bytesPerLine(); int rgba[4]; unsigned char* p; // how many times blur is applied? // for low-end system, limit this to only 1 loop for (int loop = 0; loop < 2; loop++) { for (int col = c1; col <= c2; col++) { p = result->scanLine(r1) + col * 4; for (int i = 0; i < 3; i++) rgba[i] = p[i] << 4; p += bpl; for (int j = r1; j < r2; j++, p += bpl) for (int i = 0; i < 3; i++) p[i] = (rgba[i] += (((p[i] << 4) - rgba[i])) >> 1) >> 4; } for (int row = r1; row <= r2; row++) { p = result->scanLine(row) + c1 * 4; for (int i = 0; i < 3; i++) rgba[i] = p[i] << 4; p += 4; for (int j = c1; j < c2; j++, p += 4) for (int i = 0; i < 3; i++) p[i] = (rgba[i] += (((p[i] << 4) - rgba[i])) >> 1) >> 4; } for (int col = c1; col <= c2; col++) { p = result->scanLine(r2) + col * 4; for (int i = 0; i < 3; i++) rgba[i] = p[i] << 4; p -= bpl; for (int j = r1; j < r2; j++, p -= bpl) for (int i = 0; i < 3; i++) p[i] = (rgba[i] += (((p[i] << 4) - rgba[i])) >> 1) >> 4; } for (int row = r1; row <= r2; row++) { p = result->scanLine(row) + c2 * 4; for (int i = 0; i < 3; i++) rgba[i] = p[i] << 4; p -= 4; for (int j = c1; j < c2; j++, p -= 4) for (int i = 0; i < 3; i++) p[i] = (rgba[i] += (((p[i] << 4) - rgba[i])) >> 1) >> 4; } } // overdraw to leave only the reflection blurred (but not the actual image) for (int x = 0; x < w; x++) for (int y = 0; y < h; y++) result->setPixel(hofs + y, x, img.pixel(x, y)); } } return result; } QImage* PictureFlowSoftwareRenderer::surface(int slideIndex) { if (!state) return 0; if (slideIndex < 0) return 0; if (slideIndex >= (int)state->slideImages.count()) return 0; int key = slideIndex; QImage* img = state->slideImages.at(slideIndex); bool empty = img ? img->isNull() : true; if (empty) { surfaceCache.remove(key); imageHash.remove(slideIndex); if (!blankSurface) { int sw = state->slideWidth; int sh = state->slideHeight; QImage img = QImage(sw, sh, QImage::Format_RGB32); QPainter painter(&img); QPoint p1(sw*4 / 10, 0); QPoint p2(sw*6 / 10, sh); QLinearGradient linearGrad(p1, p2); linearGrad.setColorAt(0, Qt::black); linearGrad.setColorAt(1, Qt::white); painter.setBrush(linearGrad); painter.fillRect(0, 0, sw, sh, QBrush(linearGrad)); painter.setPen(QPen(QColor(64, 64, 64), 4)); painter.setBrush(QBrush()); painter.drawRect(2, 2, sw - 3, sh - 3); painter.end(); blankSurface = prepareSurface(&img, sw, sh, bgcolor, state->reflectionEffect); } return blankSurface; } bool exist = imageHash.contains(slideIndex); if (exist) if (img == imageHash.find(slideIndex).value()) if (surfaceCache.contains(key)) return surfaceCache[key]; QImage* sr = prepareSurface(img, state->slideWidth, state->slideHeight, bgcolor, state->reflectionEffect); surfaceCache.insert(key, sr); imageHash.insert(slideIndex, img); return sr; } // Renders a slide to offscreen buffer. Returns a rect of the rendered area. // col1 and col2 limit the column for rendering. QRect PictureFlowSoftwareRenderer::renderSlide(const SlideInfo &slide, int col1, int col2) { int blend = slide.blend; if (!blend) return QRect(); QImage* src = surface(slide.slideIndex); if (!src) return QRect(); QRect rect(0, 0, 0, 0); int sw = src->height(); int sh = src->width(); int h = buffer.height(); int w = buffer.width(); if (col1 > col2) { int c = col2; col2 = col1; col1 = c; } col1 = (col1 >= 0) ? col1 : 0; col2 = (col2 >= 0) ? col2 : w - 1; col1 = qMin(col1, w - 1); col2 = qMin(col2, w - 1); int zoom = 100; int distance = h * 100 / zoom; PFreal sdx = fcos(slide.angle); PFreal sdy = fsin(slide.angle); PFreal xs = slide.cx - state->slideWidth * sdx / 2; PFreal ys = slide.cy - state->slideWidth * sdy / 2; PFreal dist = distance * PFREAL_ONE; int xi = qMax((PFreal)0, (w * PFREAL_ONE / 2) + fdiv(xs * h, dist + ys) >> PFREAL_SHIFT); if (xi >= w) return rect; bool flag = false; rect.setLeft(xi); for (int x = qMax(xi, col1); x <= col2; x++) { PFreal hity = 0; PFreal fk = rays[x]; if (sdy) { fk = fk - fdiv(sdx, sdy); hity = -fdiv((rays[x] * distance - slide.cx + slide.cy * sdx / sdy), fk); } dist = distance * PFREAL_ONE + hity; if (dist < 0) continue; PFreal hitx = fmul(dist, rays[x]); PFreal hitdist = fdiv(hitx - slide.cx, sdx); int column = sw / 2 + (hitdist >> PFREAL_SHIFT); if (column >= sw) break; if (column < 0) continue; rect.setRight(x); if (!flag) rect.setLeft(x); flag = true; int y1 = h / 2; int y2 = y1 + 1; QRgb* pixel1 = (QRgb*)(buffer.scanLine(y1)) + x; QRgb* pixel2 = (QRgb*)(buffer.scanLine(y2)) + x; QRgb pixelstep = pixel2 - pixel1; int center = (sh / 2); int dy = dist / h; int p1 = center * PFREAL_ONE - dy / 2; int p2 = center * PFREAL_ONE + dy / 2; const QRgb *ptr = (const QRgb*)(src->scanLine(column)); if (blend == 256) while ((y1 >= 0) && (y2 < h) && (p1 >= 0)) { *pixel1 = ptr[p1 >> PFREAL_SHIFT]; *pixel2 = ptr[p2 >> PFREAL_SHIFT]; p1 -= dy; p2 += dy; y1--; y2++; pixel1 -= pixelstep; pixel2 += pixelstep; } else while ((y1 >= 0) && (y2 < h) && (p1 >= 0)) { QRgb c1 = ptr[p1 >> PFREAL_SHIFT]; QRgb c2 = ptr[p2 >> PFREAL_SHIFT]; *pixel1 = blendColor(c1, bgcolor, blend); *pixel2 = blendColor(c2, bgcolor, blend); p1 -= dy; p2 += dy; y1--; y2++; pixel1 -= pixelstep; pixel2 += pixelstep; } } rect.setTop(0); rect.setBottom(h - 1); return rect; } void PictureFlowSoftwareRenderer::renderSlides() { int nleft = state->leftSlides.count(); int nright = state->rightSlides.count(); QRect r = renderSlide(state->centerSlide); int c1 = r.left(); int c2 = r.right(); for (int index = 0; index < nleft; index++) { QRect rs = renderSlide(state->leftSlides[index], 0, c1 - 1); if (!rs.isEmpty()) c1 = rs.left(); } for (int index = 0; index < nright; index++) { QRect rs = renderSlide(state->rightSlides[index], c2 + 1, buffer.width()); if (!rs.isEmpty()) c2 = rs.right(); } } // Render the slides. Updates only the offscreen buffer. void PictureFlowSoftwareRenderer::render() { buffer.fill(state->backgroundColor); renderSlides(); dirty = false; } // ----------------------------------------- class PictureFlowPrivate { public: PictureFlowState* state; PictureFlowAnimator* animator; PictureFlowAbstractRenderer* renderer; QTimer triggerTimer; }; PictureFlow::PictureFlow(QWidget* parent): QWidget(parent) { d = new PictureFlowPrivate; d->state = new PictureFlowState; d->state->reset(); d->state->reposition(); d->renderer = new PictureFlowSoftwareRenderer; d->renderer->state = d->state; d->renderer->widget = this; d->renderer->init(); d->animator = new PictureFlowAnimator; d->animator->state = d->state; QObject::connect(&d->animator->animateTimer, SIGNAL(timeout()), this, SLOT(updateAnimation())); QObject::connect(&d->triggerTimer, SIGNAL(timeout()), this, SLOT(render())); setAttribute(Qt::WA_StaticContents, true); setAttribute(Qt::WA_OpaquePaintEvent, true); setAttribute(Qt::WA_NoSystemBackground, true); setFocusPolicy(Qt::WheelFocus); } PictureFlow::~PictureFlow() { delete d->renderer; delete d->animator; delete d->state; delete d; } int PictureFlow::slideCount() const { return d->state->slideImages.count(); } QColor PictureFlow::backgroundColor() const { return QColor(d->state->backgroundColor); } void PictureFlow::setBackgroundColor(const QColor& c) { d->state->backgroundColor = c.rgb(); triggerRender(); } QSize PictureFlow::slideSize() const { return QSize(d->state->slideWidth, d->state->slideHeight); } void PictureFlow::setSlideSize(QSize size) { d->state->slideWidth = size.width(); d->state->slideHeight = size.height(); d->state->reposition(); triggerRender(); } PictureFlow::ReflectionEffect PictureFlow::reflectionEffect() const { return d->state->reflectionEffect; } void PictureFlow::setReflectionEffect(ReflectionEffect effect) { d->state->reflectionEffect = effect; triggerRender(); } QImage PictureFlow::slide(int index) const { QImage* i = 0; if ((index >= 0) && (index < slideCount())) i = d->state->slideImages[index]; return i ? QImage(*i) : QImage(); } void PictureFlow::insertSlide(int index, const QImage& image) { if ((index >= 0) && (index <= slideCount())) { int c = d->state->slideImages.count(); d->state->slideImages.resize(c); d->state->slideImages.insert(index, new QImage(image)); triggerRender(); } } void PictureFlow::insertSlide(int index, const QPixmap& pixmap) { insertSlide(index, pixmap.toImage()); } void PictureFlow::addSlide(const QImage& image) { int c = d->state->slideImages.count(); d->state->slideImages.resize(c + 1); d->state->slideImages[c] = new QImage(image); triggerRender(); } void PictureFlow::addSlide(const QPixmap& pixmap) { addSlide(pixmap.toImage()); } void PictureFlow::removeSlide(int index) { int c = d->state->slideImages.count(); if (index >= 0 && index < c) { d->state->slideImages.remove(index); triggerRender(); } } void PictureFlow::setSlide(int index, const QImage& image) { if ((index >= 0) && (index < slideCount())) { QImage* i = image.isNull() ? 0 : new QImage(image); delete d->state->slideImages[index]; d->state->slideImages[index] = i; triggerRender(); } } void PictureFlow::setSlide(int index, const QPixmap& pixmap) { setSlide(index, pixmap.toImage()); } int PictureFlow::centerIndex() const { return d->state->centerIndex; } void PictureFlow::setCenterIndex(int index) { index = qMin(index, slideCount() - 1); index = qMax(index, 0); d->state->centerIndex = index; d->state->reset(); d->animator->stop(index); triggerRender(); } void PictureFlow::clear() { int c = d->state->slideImages.count(); for (int i = 0; i < c; i++) delete d->state->slideImages[i]; d->state->slideImages.resize(0); d->state->reset(); triggerRender(); } void PictureFlow::render() { d->renderer->dirty = true; update(); } void PictureFlow::triggerRender() { d->triggerTimer.setSingleShot(true); d->triggerTimer.start(0); } void PictureFlow::showPrevious() { int step = d->animator->step; int center = d->state->centerIndex; if (step > 0) d->animator->start(center); if (step == 0) if (center > 0) d->animator->start(center - 1); if (step < 0) d->animator->target = qMax(0, center - 2); } void PictureFlow::showNext() { int step = d->animator->step; int center = d->state->centerIndex; if (step < 0) d->animator->start(center); if (step == 0) if (center < slideCount() - 1) d->animator->start(center + 1); if (step > 0) d->animator->target = qMin(center + 2, slideCount() - 1); } void PictureFlow::showSlide(int index) { index = qMax(index, 0); index = qMin(slideCount() - 1, index); if (index == d->state->centerSlide.slideIndex) return; d->animator->start(index); } void PictureFlow::keyPressEvent(QKeyEvent* event) { if (event->key() == Qt::Key_Left) { if (event->modifiers() == Qt::ControlModifier) showSlide(centerIndex() - 10); else showPrevious(); event->accept(); return; } if (event->key() == Qt::Key_Right) { if (event->modifiers() == Qt::ControlModifier) showSlide(centerIndex() + 10); else showNext(); event->accept(); return; } event->ignore(); } void PictureFlow::mousePressEvent(QMouseEvent* event) { const int midWidth = width() /2; const int midSlideWidth = slideSize().width() /2; if (event->x() > (midWidth + midSlideWidth)) showNext(); else if (event->x() < (midWidth - midSlideWidth)) showPrevious(); } void PictureFlow::wheelEvent(QWheelEvent* event) { const int numDegrees = event->delta() / 8; const int numSteps = numDegrees / 15; if ( numSteps < 0 ) { showNext(); } else if ( numSteps > 0 ) { showPrevious(); } } void PictureFlow::paintEvent(QPaintEvent* event) { Q_UNUSED(event); d->renderer->paint(); } void PictureFlow::resizeEvent(QResizeEvent* event) { triggerRender(); QWidget::resizeEvent(event); } int PictureFlow::animatorStep() const { return d->animator->step; } void PictureFlow::updateAnimation() { int old_center = d->state->centerIndex; d->animator->update(); triggerRender(); if (d->state->centerIndex != old_center) emit centerIndexChanged(d->state->centerIndex); } ./qwbfsmanager-1.2.1-src/qwbfs/src/ofi-labs-pictureflow/pictureflow-qt/main.cpp0000644000175000017520000001240711534026570027110 0ustar pasnoxpasnox/* PictureFlow - animated image show widget http://pictureflow.googlecode.com Copyright (C) 2009 Ariya Hidayat (ariya@kde.org) Copyright (C) 2008 Ariya Hidayat (ariya@kde.org) Copyright (C) 2007 Ariya Hidayat (ariya@kde.org) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include "pictureflow.h" QStringList findFiles(const QString& path = QString()) { QStringList files; QDir dir = QDir::current(); if (!path.isEmpty()) dir = QDir(path); dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks); QFileInfoList list = dir.entryInfoList(); for (int i = 0; i < list.size(); ++i) files += dir.absoluteFilePath(list.at(i).fileName()); return files; } class Browser: public PictureFlow { public: Browser(): PictureFlow() { setWindowTitle("PictureFlow"); } void keyPressEvent(QKeyEvent* event) { if (event->key() == Qt::Key_Escape || event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return) { event->accept(); close(); } // checking the speed of rendering if (event->key() == Qt::Key_F10) if (event->modifiers() == Qt::AltModifier) { qDebug("benchmarking.... please wait"); const int blit_count = 10; QTime stopwatch; stopwatch.start(); for (int i = 0; i < blit_count; i++) { render(); repaint(); QApplication::flush(); QApplication::syncX(); render(); repaint(); QApplication::flush(); QApplication::syncX(); render(); repaint(); QApplication::flush(); QApplication::syncX(); render(); repaint(); QApplication::flush(); QApplication::syncX(); render(); repaint(); QApplication::flush(); QApplication::syncX(); render(); repaint(); QApplication::flush(); QApplication::syncX(); render(); repaint(); QApplication::flush(); QApplication::syncX(); render(); repaint(); QApplication::flush(); QApplication::syncX(); render(); repaint(); QApplication::flush(); QApplication::syncX(); render(); repaint(); QApplication::flush(); QApplication::syncX(); } QString msg; int elapsed = stopwatch.elapsed(); if (elapsed > 0) msg = QString("FPS: %1").arg(blit_count * 10 * 1000.0 / elapsed); else msg = QString("Too fast. Increase blit_count"); setWindowTitle(msg); event->accept(); return; } // for debugging only: Alt+F11 cycles the reflection effect if (event->key() == Qt::Key_F11) if (event->modifiers() == Qt::AltModifier) { qDebug("changing reflection effect..."); switch (reflectionEffect()) { //case NoReflection: setReflectionEffect(PlainReflection); break; case PlainReflection: setReflectionEffect(BlurredReflection); break; case BlurredReflection: setReflectionEffect(PlainReflection); break; default: setReflectionEffect(PlainReflection); break; } event->accept(); return; } PictureFlow::keyPressEvent(event); } }; int main(int argc, char ** argv) { QApplication* app = new QApplication(argc, argv); Browser* w = new Browser; #if defined(_WS_QWS) || defined(Q_WS_QWS) w->showFullScreen(); int ww = w->width(); int wh = w->height(); int dim = (ww > wh) ? wh : ww; dim = dim * 3 / 4; w->setSlideSize(QSize(3*dim / 5, dim)); #else w->setSlideSize(QSize(3*40, 5*40)); w->resize(750, 270); #endif QStringList files = (argc > 1) ? findFiles(QString(argv[1])) : findFiles(); QImage img; for (int i = 0; i < (int)files.count(); i++) if (img.load(files[i])) w->addSlide(img); w->setCenterIndex(w->slideCount() / 2); w->setBackgroundColor(Qt::white); w->show(); app->connect(app, SIGNAL(lastWindowClosed()), app, SLOT(quit())); int result = app->exec(); delete w; delete app; return result; } ./qwbfsmanager-1.2.1-src/qwbfs/src/ofi-labs-pictureflow/pictureflow-qt/pyqt/0000755000175000017520000000000011546156115026453 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/qwbfs/src/ofi-labs-pictureflow/pictureflow-qt/pyqt/lib/0000755000175000017520000000000011546156115027221 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/qwbfs/src/ofi-labs-pictureflow/pictureflow-qt/pyqt/lib/pictureflow.pro0000644000175000017520000000016311534026570032304 0ustar pasnoxpasnoxCONFIG += static TEMPLATE = lib TARGET = pictureflow HEADERS = ../../pictureflow.h SOURCES = ../../pictureflow.cpp ./qwbfsmanager-1.2.1-src/qwbfs/src/ofi-labs-pictureflow/pictureflow-qt/pyqt/sip/0000755000175000017520000000000011546156115027246 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/qwbfs/src/ofi-labs-pictureflow/pictureflow-qt/pyqt/sip/pictureflow.sip0000644000175000017520000000454011534026570032327 0ustar pasnoxpasnox/* PictureFlow - animated image show widget http://pictureflow.googlecode.com Copyright (C) 2008 Ariya Hidayat (ariya@kde.org) Copyright (C) 2007 Ariya Hidayat (ariya@kde.org) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ class PictureFlow : QWidget { %TypeHeaderCode #include "pictureflow.h" %End public: enum ReflectionEffect { NoReflection, PlainReflection, BlurredReflection }; PictureFlow(QWidget *parent /TransferThis/ = 0); ~PictureFlow(); QColor backgroundColor() const; void setBackgroundColor(const QColor& c); QSize slideSize() const; void setSlideSize(QSize size); int slideCount() const; QImage slide(int index) const; int centerIndex() const; ReflectionEffect reflectionEffect() const; void setReflectionEffect(ReflectionEffect effect); public slots: void addSlide(const QImage& image); void addSlide(const QPixmap& pixmap); void setSlide(int index, const QImage& image); void setSlide(int index, const QPixmap& pixmap); void setCenterIndex(int index); void clear(); void showPrevious(); void showNext(); void showSlide(int index); void render(); void triggerRender(); signals: void centerIndexChanged(int index); protected: void paintEvent(QPaintEvent *event); void keyPressEvent(QKeyEvent* event); void mousePressEvent(QMouseEvent* event); void resizeEvent(QResizeEvent* event); }; ./qwbfsmanager-1.2.1-src/qwbfs/src/ofi-labs-pictureflow/pictureflow-qt/pyqt/sip/pictureflowmod.sip0000644000175000017520000000015111534026570033021 0ustar pasnoxpasnox%Module pictureflow 0 %Import QtCore/QtCoremod.sip %Import QtGui/QtGuimod.sip %Include pictureflow.sip ./qwbfsmanager-1.2.1-src/qwbfs/src/ofi-labs-pictureflow/pictureflow-qt/pyqt/configure.py0000644000175000017520000000235011534026570031004 0ustar pasnoxpasnoximport os import sipconfig from PyQt4 import pyqtconfig config = pyqtconfig.Configuration() # The name of the SIP build file generated by SIP and used by the build # system. build_file = "pictureflow.sbf" sip_files_dir = "sip" output_dir = "pictureflow" if not os.path.exists(output_dir): os.mkdir(output_dir) # Build the pictureflow library. os.system("cd lib; qmake; make") # Run SIP to generate the code. command = " ".join( [config.sip_bin, "-c", output_dir, "-b", os.path.join(output_dir, build_file), "-I"+config.pyqt_sip_dir, "-I"+config.qt_inc_dir, config.pyqt_sip_flags, os.path.join(sip_files_dir, "pictureflowmod.sip")] ) print command os.system(command) # Create the Makefile. makefile = pyqtconfig.QtGuiModuleMakefile( config, build_file, dir=output_dir ) makefile.extra_include_dirs.append(os.path.abspath(os.pardir)) makefile.extra_lib_dirs.append(os.path.abspath(os.curdir)) makefile.extra_lib_dirs.append(os.path.abspath("lib")) makefile.extra_libs.append("pictureflow") # Generate the Makefile itself. config.pyqt_modules = config.pyqt_modules.split() makefile.generate() del config.pyqt_modules sipconfig.ParentMakefile( configuration = config, subdirs = [output_dir] ).generate() ./qwbfsmanager-1.2.1-src/qwbfs/src/ofi-labs-pictureflow/README.txt0000644000175000017520000000237411534026570024173 0ustar pasnoxpasnox PictureFlow - animated image show http://pictureflow.googlecode.com Copyright and License --------------------- Copyright (C) 2007 Ariya Hidayat (ariya@kde.org) Copyright (C) 2008 Ariya Hidayat (ariya@kde.org) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ./qwbfsmanager-1.2.1-src/qwbfs/src/main.cpp0000644000175000017520000001045011544162061020057 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : main.cpp ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include "main.h" #include "UIMain.h" #define SPLASHSCREEN_TIMEOUT 3000 class SplashScreen : public QSplashScreen { Q_OBJECT public: SplashScreen( const QPixmap& pixmap ) : QSplashScreen( pixmap ) { QFont font = this->font(); font.setPixelSize( 9 ); setFont( font ); showMessage( tr( "Version %1" ).arg( APPLICATION_VERSION_STR ), Qt::AlignRight | Qt::AlignBottom, QColor( 0, 0, 0 ) ); show(); raise(); } void handle( QWidget* widget ) { mWidget = widget; QTimer::singleShot( SPLASHSCREEN_TIMEOUT, this, SLOT( close() ) ); } protected: QWeakPointer mWidget; virtual void hideEvent( QHideEvent* event ) { QSplashScreen::hideEvent( event ); if ( mWidget && !mWidget.data()->isVisible() ) { mWidget.data()->show(); mWidget.data()->raise(); } } }; int main( int argc, char** argv ) { QApplication app( argc, argv ); app.setApplicationName( APPLICATION_NAME ); app.setOrganizationName( APPLICATION_ORGANIZATION ); app.setOrganizationDomain( APPLICATION_DOMAIN ); app.setWindowIcon( QIcon( ":/icons/qwbfsmanager.png" ) ); qsrand( QDateTime( QDate( 0, 0, 0 ) ).secsTo( QDateTime::currentDateTime() ) ); QPixmapCache::setCacheLimit( QPixmapCache::cacheLimit() *4 ); pNetworkAccessManager::instance()->setCacheDirectory( QDir::tempPath() ); Q_INIT_RESOURCE( fresh ); Q_UNUSED( QT_TRANSLATE_NOOP( "QObject", "The Free, Fast and Powerful cross platform Wii Backup File System manager" ) ); pSettings::setDefaultProperties( pSettings::Properties( APPLICATION_NAME, APPLICATION_VERSION, pSettings::Auto ) ); pTranslationManager* translationManager = pTranslationManager::instance(); translationManager->setFakeCLocaleEnabled( true ); translationManager->addTranslationsMask( "qt*.qm" ); translationManager->addTranslationsMask( "fresh*.qm" ); translationManager->addTranslationsMask( "qwbfsmanager*.qm" ); translationManager->addForbiddenTranslationsMask( "qt_help*.qm" ); QObject::connect( &app, SIGNAL( lastWindowClosed() ), &app, SLOT( quit() ) ); SplashScreen splash( pIconManager::pixmap( "splashscreen.png", ":/icons" ) ); UIMain w; splash.handle( &w ); return app.exec(); } #include "main.moc" ./qwbfsmanager-1.2.1-src/qwbfs/src/Properties.cpp0000644000175000017520000002617411545616705021313 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : Properties.cpp ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #include "Properties.h" #include "UIMain.h" #include #include #include #include #include #include #include #define DATA_NETWORK_CACHE_DEFAULT_DISK_SIZE 1024 *1024 *50 #define SETTINGS_CACHE_WORKING_PATH "cache/workingPath" #define SETTINGS_CACHE_DISK_SIZE "cache/diskSize" #define SETTINGS_CACHE_USE_TEMPORARY_WORKING_PATH "cache/useTemporaryWorkingPath" #define SETTINGS_PROXY_TYPE "proxy/type" #define SETTINGS_PROXY_SERVER "proxy/server" #define SETTINGS_PROXY_PORT "proxy/port" #define SETTINGS_PROXY_LOGIN "proxy/login" #define SETTINGS_PROXY_PASSWORD "proxy/password" #define SETTINGS_UPDATE_LAST_UPDATED "update/lastUpdated" #define SETTINGS_UPDATE_LAST_CHECKED "update/lastChecked" #define SETTINGS_TRANSLATIONS_PATHS "translations/paths" #define SETTINGS_LOCALE_ACCEPTED "locale/accepted" #define SETTINGS_LOCALE_CURRENT "locale/current" #define SETTINGS_VIEW_MODE "view/mode" #define SETTINGS_VIEW_ICON_TYPE "view/iconType" #define SETTINGS_WINDOW_GEOMETRY "window/geometry" #define SETTINGS_WINDOW_STATE "window/state" #define SETTINGS_WINDOW_SELECTED_PATH "window/selectedPath" #define SETTINGS_PARTITION_WIDGET_STATE "partitionWidget/state" #define SETTINGS_PARTITION_WIDGET_SELECTED_PARTITION "partitionWidget/selectedPartition" #define SETTINGS_PARTITION_WIDGET_CUSTOM_PARTITIONS "partitionWidget/customPartitions" Properties::Properties( QObject* parent ) : QObject( parent ) { mSettings = new pSettings( this ); //qWarning() << mSettings->fileName(); } Properties::~Properties() { } QString Properties::temporaryPath() const { const QString path = QDir::tempPath() .append( QString( "/%1" ).arg( qApp->applicationName() ) ); QDir().mkpath( path ); return path; } QString Properties::cacheWorkingPath() const { return mSettings->value( SETTINGS_CACHE_WORKING_PATH, temporaryPath() ).toString(); } void Properties::setCacheWorkingPath( const QString& path ) { mSettings->setValue( SETTINGS_CACHE_WORKING_PATH, path ); } qint64 Properties::cacheDiskSize() const { return mSettings->value( SETTINGS_CACHE_DISK_SIZE, DATA_NETWORK_CACHE_DEFAULT_DISK_SIZE ).value(); } void Properties::setCacheDiskSize( qint64 sizeByte ) { mSettings->setValue( SETTINGS_CACHE_DISK_SIZE, sizeByte ); } bool Properties::cacheUseTemporaryPath() const { return mSettings->value( SETTINGS_CACHE_USE_TEMPORARY_WORKING_PATH, false ).toBool(); } void Properties::setCacheUseTemporaryPath( bool useTemporary ) { mSettings->setValue( SETTINGS_CACHE_USE_TEMPORARY_WORKING_PATH, useTemporary ); } QNetworkProxy::ProxyType Properties::proxyType() const { return QNetworkProxy::ProxyType( mSettings->value( SETTINGS_PROXY_TYPE, QNetworkProxy::NoProxy ).toInt() ); } void Properties::setProxyType( QNetworkProxy::ProxyType type ) { mSettings->setValue( SETTINGS_PROXY_TYPE, type ); } QString Properties::proxyServer() const { return mSettings->value( SETTINGS_PROXY_SERVER ).toString(); } void Properties::setProxyServer( const QString& server ) { mSettings->setValue( SETTINGS_PROXY_SERVER, server ); } int Properties::proxyPort() const { return mSettings->value( SETTINGS_PROXY_PORT, -1 ).toInt(); } void Properties::setProxyPort( int port ) { mSettings->setValue( SETTINGS_PROXY_PORT, port ); } QString Properties::proxyLogin() const { return mSettings->value( SETTINGS_PROXY_LOGIN ).toString(); } void Properties::setProxyLogin( const QString& login ) { mSettings->setValue( SETTINGS_PROXY_LOGIN, login ); } QString Properties::proxyPassword() const { return decrypt( mSettings->value( SETTINGS_PROXY_PASSWORD ).toByteArray() ); } void Properties::setProxyPassword( const QString& password ) { mSettings->setValue( SETTINGS_PROXY_PASSWORD, crypt( password ) ); } QDateTime Properties::updateLastUpdated() const { return mSettings->value( SETTINGS_UPDATE_LAST_UPDATED ).toDateTime(); } void Properties::setUpdateLastUpdated( const QDateTime& dateTime ) { mSettings->setValue( SETTINGS_UPDATE_LAST_UPDATED, dateTime ); } QDateTime Properties::updateLastChecked() const { return mSettings->value( SETTINGS_UPDATE_LAST_CHECKED ).toDateTime(); } void Properties::setUpdateLastChecked( const QDateTime& dateTime ) { mSettings->setValue( SETTINGS_UPDATE_LAST_CHECKED, dateTime ); } QStringList Properties::translationsPaths() const { QSet translationsPaths = mSettings->value( SETTINGS_TRANSLATIONS_PATHS ).toStringList().toSet(); if ( translationsPaths.isEmpty() ) { translationsPaths << QLibraryInfo::location( QLibraryInfo::TranslationsPath ); #if defined( Q_OS_WIN ) // sources ones translationsPaths << "qt/translations"; translationsPaths << "translations"; translationsPaths << QCoreApplication::applicationDirPath().append( "/qt/translations" ); translationsPaths << QCoreApplication::applicationDirPath().append( "/translations" ); translationsPaths << QCoreApplication::applicationDirPath().append( "/../translations" ); translationsPaths << QCoreApplication::applicationDirPath().append( "/../fresh/translations" ); translationsPaths << QCoreApplication::applicationDirPath().append( "/../../../fresh/translations" ); #elif defined( Q_OS_MAC ) // sources ones translationsPaths << "../Resources/qt/translations"; translationsPaths << "../Resources/translations"; translationsPaths << QCoreApplication::applicationDirPath().append( "/../Resources/qt/ranslations" ); translationsPaths << QCoreApplication::applicationDirPath().append( "/../Resources/translations" ); translationsPaths << QCoreApplication::applicationDirPath().append( "/../../../../translations" ); translationsPaths << QCoreApplication::applicationDirPath().append( "/../../../../fresh/translations" ); translationsPaths << QCoreApplication::applicationDirPath().append( "/../../../../../../fresh/translations" ); #else // sources ones translationsPaths << "qt/translations"; translationsPaths << "translations"; translationsPaths << QCoreApplication::applicationDirPath().append( "/qt/translations" ); translationsPaths << QCoreApplication::applicationDirPath().append( "/translations" ); translationsPaths << QCoreApplication::applicationDirPath().append( "/../translations" ); translationsPaths << QCoreApplication::applicationDirPath().append( "/../fresh/translations" ); translationsPaths << QCoreApplication::applicationDirPath().append( "/../../../fresh/translations" ); #endif } //qWarning() << translationsPaths; return translationsPaths.toList(); } void Properties::setTranslationsPaths( const QStringList& translationsPaths ) { mSettings->setValue( SETTINGS_TRANSLATIONS_PATHS, translationsPaths ); } bool Properties::localeAccepted() const { return mSettings->value( SETTINGS_LOCALE_ACCEPTED ).toBool(); } void Properties::setLocaleAccepted( bool accepted ) { mSettings->setValue( SETTINGS_LOCALE_ACCEPTED, accepted ); } QLocale Properties::locale() const { return QLocale( mSettings->value( SETTINGS_LOCALE_CURRENT, QLocale::system().name() ).toString() ); } void Properties::setLocale( const QLocale& locale ) { mSettings->setValue( SETTINGS_LOCALE_CURRENT, locale.name() ); } QListView::ViewMode Properties::viewMode() const { return QListView::ViewMode( mSettings->value( SETTINGS_VIEW_MODE, QListView::IconMode ).toInt() ); } void Properties::setViewMode( QListView::ViewMode mode ) { mSettings->setValue( SETTINGS_VIEW_MODE, mode ); } QWBFS::WiiTDB::Scan Properties::viewIconType() const { return QWBFS::WiiTDB::Scan( mSettings->value( SETTINGS_VIEW_ICON_TYPE, QWBFS::WiiTDB::Cover ).toInt() ); } void Properties::setViewIconType( QWBFS::WiiTDB::Scan scan ) { mSettings->setValue( SETTINGS_VIEW_ICON_TYPE, scan ); } void Properties::restoreState( UIMain* window ) const { const QRect geometry = mSettings->value( SETTINGS_WINDOW_GEOMETRY ).toRect(); const QByteArray state = mSettings->value( SETTINGS_WINDOW_STATE ).toByteArray(); pGuiUtils::restoreGeometry( window, geometry ); window->restoreState( state ); } void Properties::saveState( UIMain* window ) { const QRect geometry = pGuiUtils::saveGeometry( window ); const QByteArray state = window->saveState(); mSettings->setValue( SETTINGS_WINDOW_GEOMETRY, geometry ); mSettings->setValue( SETTINGS_WINDOW_STATE, state ); } QString Properties::selectedPath() const { return mSettings->value( SETTINGS_WINDOW_SELECTED_PATH ).toString(); } void Properties::setSelectedPath( const QString& path ) { mSettings->setValue( SETTINGS_WINDOW_SELECTED_PATH, path ); } QString Properties::selectedPartition() const { return mSettings->value( SETTINGS_PARTITION_WIDGET_SELECTED_PARTITION ).toString(); } void Properties::setSelectedPartition( const QString& partition ) { mSettings->setValue( SETTINGS_PARTITION_WIDGET_SELECTED_PARTITION, partition ); } QStringList Properties::customPartitions() const { return mSettings->value( SETTINGS_PARTITION_WIDGET_CUSTOM_PARTITIONS ).toStringList(); } void Properties::setCustomPartitions( const QStringList& partitions ) { mSettings->setValue( SETTINGS_PARTITION_WIDGET_CUSTOM_PARTITIONS, partitions ); } QString Properties::decrypt( const QByteArray& data ) { return data.isEmpty() ? QString::null : QString::fromUtf8( qUncompress( QByteArray::fromBase64( data ) ) ); } QByteArray Properties::crypt( const QString& string ) { return string.isEmpty() ? QByteArray() : qCompress( string.toUtf8(), 9 ).toBase64(); } ./qwbfsmanager-1.2.1-src/qwbfs/src/ListView.cpp0000644000175000017520000002206311543625302020705 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : ListView.cpp ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #include "ListView.h" #include "models/DiscModel.h" #include "models/DiscDelegate.h" #include #include #include #include ListView::ListView( QWidget* parent ) : QListView( parent ) { mIconType = QWBFS::WiiTDB::Cover; mDriver = 0; mModel = 0; mDelegate = 0; mHeader = new QHeaderView( Qt::Horizontal, this ); mCacheManager = 0; QPalette pal = viewport()->palette(); pal.setColor( viewport()->backgroundRole(), pal.color( viewport()->backgroundRole() ).darker() ); setMouseTracking( true ); setAttribute( Qt::WA_MacShowFocusRect, false ); setViewportMargins( 0, HEADER_HEIGHT, 0, 0 ); viewport()->setPalette( pal ); viewport()->setAutoFillBackground( true ); connect( mHeader, SIGNAL( sortIndicatorChanged( int, Qt::SortOrder ) ), this, SLOT( header_sortIndicatorChanged( int, Qt::SortOrder ) ) ); } ListView::~ListView() { } void ListView::initialize( QWBFS::Driver* driver, pNetworkAccessManager* manager ) { delete mModel; delete mDelegate; mDriver = driver; mModel = new QWBFS::Model::DiscModel( this, mDriver ); mDelegate = new QWBFS::Model::DiscDelegate( mModel, manager ); mCacheManager = manager; setModel( mModel ); setItemDelegate( mDelegate ); mHeader->setModel( mModel ); mHeader->setSectionHidden( 0, true ); mHeader->setSectionHidden( 5, true ); for ( int i = 0; i < mModel->columnCount(); i++ ) { mHeader->setResizeMode( i, QHeaderView::ResizeToContents ); } mHeader->setResizeMode( 2, QHeaderView::Stretch ); mHeader->setClickable( true ); mHeader->setSortIndicatorShown( true ); } void ListView::setViewMode( QListView::ViewMode mode ) { const bool wasDragEnabled = dragEnabled(); const bool wasAcceptDrops = acceptDrops(); const bool wasViewportAcceptDrops = viewport()->acceptDrops(); QListView::setViewMode( mode ); setMovement( QListView::Static ); setResizeMode( QListView::Adjust ); setAlternatingRowColors( false ); switch ( mode ) { case QListView::ListMode: { setFlow( QListView::TopToBottom ); break; } case QListView::IconMode: { setFlow( QListView::LeftToRight ); break; } } setDragEnabled( wasDragEnabled ); setAcceptDrops( wasAcceptDrops ); viewport()->setAcceptDrops( wasViewportAcceptDrops ); } void ListView::setViewIconType( QWBFS::WiiTDB::Scan scan ) { mIconType = scan; updateGeometries(); } QWBFS::WiiTDB::Scan ListView::viewIconType() const { return mIconType; } QWBFS::Driver* ListView::driver() const { return mDriver; } QWBFS::Model::DiscModel* ListView::model() const { return mModel; } pNetworkAccessManager* ListView::cacheManager() const { return mCacheManager; } void ListView::header_sortIndicatorChanged( int logicalIndex, Qt::SortOrder order ) { mModel->sort( logicalIndex, order ); if ( selectionModel()->hasSelection() ) { scrollTo( selectionModel()->selectedIndexes().last() ); } } void ListView::resizeEvent( QResizeEvent* event ) { QListView::resizeEvent( event ); QRect rect = QRect( QPoint( frameWidth(), frameWidth() ), QSize( viewport()->width(), HEADER_HEIGHT ) ); mHeader->setGeometry( rect ); } void ListView::mousePressEvent( QMouseEvent* event ) { const QModelIndex index = indexAt( event->pos() ); const bool isSelected = selectionModel()->isSelected( index ); const bool leftButtonNoModifier = event->buttons() == Qt::LeftButton && event->modifiers() == Qt::NoModifier; QListView::mousePressEvent( event ); if ( isSelected && leftButtonNoModifier && dragEnabled() ) { setState( QAbstractItemView::DraggingState ); } else { setState( QAbstractItemView::DragSelectingState ); } } void ListView::startDrag( Qt::DropActions supportedActions ) { QModelIndexList indexes = selectionModel()->selectedIndexes(); if ( indexes.count() > 0 ) { QMimeData *data = model()->mimeData( indexes ); if ( !data ) { return; } QRect rect; QPixmap pixmap = renderToPixmap( indexes, &rect ); //rect.adjust( horizontalOffset(), verticalOffset(), 0, 0 ); // P@sNox: This cause a decal in the preview that cause the QDrag pixmap to not be visible. QDrag* drag = new QDrag( this ); drag->setPixmap( pixmap ); drag->setMimeData( data ); drag->setHotSpot( viewport()->mapFromGlobal( QCursor::pos() ) -rect.topLeft() ); Qt::DropAction defaultDropAction = Qt::IgnoreAction; if ( this->defaultDropAction() != Qt::IgnoreAction && (supportedActions & this->defaultDropAction() ) ) { defaultDropAction = this->defaultDropAction(); } else if ( supportedActions & Qt::CopyAction && dragDropMode() != QAbstractItemView::InternalMove ) { defaultDropAction = Qt::CopyAction; } if ( drag->exec(supportedActions, defaultDropAction ) == Qt::MoveAction ) { clearOrRemove(); } } } // dirty code get from QAbstractItemView for avoid drag & drop bug (no preview when dragging) QItemViewPaintPairs ListView::draggablePaintPairs( const QModelIndexList& indexes, QRect* r ) const { Q_ASSERT( r ); QRect& rect = *r; const QRect viewportRect = viewport()->rect(); QItemViewPaintPairs ret; for ( int i = 0; i < indexes.count(); ++i ) { const QModelIndex& index = indexes.at( i ); const QRect current = visualRect( index ); if ( current.intersects( viewportRect ) ) { ret += qMakePair( current, index ); rect |= current; } } rect &= viewportRect; return ret; } QStyleOptionViewItemV4 ListView::viewOptionsV4() const { QStyleOptionViewItemV4 option = viewOptions(); if ( wordWrap() ) { option.features = QStyleOptionViewItemV2::WrapText; } option.locale = locale(); option.locale.setNumberOptions( QLocale::OmitGroupSeparator ); option.widget = this; return option; } QPixmap ListView::renderToPixmap( const QModelIndexList& indexes, QRect* r ) const { Q_ASSERT( r ); QItemViewPaintPairs paintPairs = draggablePaintPairs( indexes, r ); if ( paintPairs.isEmpty() ) { return QPixmap(); } QPixmap pixmap( r->size() ); pixmap.fill( Qt::transparent ); QPainter painter( &pixmap ); QStyleOptionViewItemV4 option = viewOptionsV4(); option.state |= QStyle::State_Selected; for ( int j = 0; j < paintPairs.count(); ++j ) { option.rect = paintPairs.at( j ).first.translated( -r->topLeft() ); const QModelIndex& current = paintPairs.at( j ).second; itemDelegate( current )->paint( &painter, option, current ); } return pixmap; } void ListView::clearOrRemove() { const QItemSelection selection = selectionModel()->selection(); QList::const_iterator it = selection.constBegin(); if ( !dragDropOverwriteMode() ) { for ( ; it != selection.constEnd(); ++it ) { QModelIndex parent = (*it).parent(); if ( (*it).left() != 0 ) { continue; } if ( (*it).right() != ( model()->columnCount( parent ) -1 ) ) { continue; } int count = (*it).bottom() -(*it).top() +1; model()->removeRows( (*it).top(), count, parent ); } } else { // we can't remove the rows so reset the items (i.e. the view is like a table) QModelIndexList list = selection.indexes(); for ( int i = 0; i < list.size(); ++i ) { QModelIndex index = list.at( i ); QMap roles = model()->itemData( index ); for ( QMap::Iterator it = roles.begin(); it != roles.end(); ++it ) { it.value() = QVariant(); } model()->setItemData( index, roles ); } } } ./qwbfsmanager-1.2.1-src/qwbfs/src/PropertiesDialog.cpp0000644000175000017520000001543211532572722022422 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : PropertiesDialog.cpp ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #include "PropertiesDialog.h" #include "Properties.h" #include #include #include #include PropertiesDialog::PropertiesDialog( QWidget* parent ) : QDialog( parent ) { setupUi( this ); setAttribute( Qt::WA_DeleteOnClose ); mProperties = new Properties( this ); #if defined( Q_OS_MAC ) QFont font = lProxyWarning->font(); font.setPointSize( 10 ); lProxyWarning->setFont( font ); #endif cbViewMode->addItem( QString::null, QListView::ListMode ); cbViewMode->addItem( QString::null, QListView::IconMode ); cbViewIconType->addItem( QString::null, QWBFS::WiiTDB::CoverDisc ); cbViewIconType->addItem( QString::null, QWBFS::WiiTDB::Cover ); cbProxyType->addItem( QString::null, QNetworkProxy::NoProxy ); cbProxyType->addItem( QString::null, QNetworkProxy::Socks5Proxy ); cbProxyType->addItem( QString::null, QNetworkProxy::HttpProxy ); lCurrentLocale->setText( mProperties->locale().name() ); cbViewMode->setCurrentIndex( cbViewMode->findData( mProperties->viewMode() ) ); cbViewIconType->setCurrentIndex( cbViewIconType->findData( mProperties->viewIconType() ) ); leCachePath->setText( mProperties->cacheWorkingPath() ); sbCacheDiskSize->setValue( mProperties->cacheDiskSize() /1024 /1024 ); cbCacheUseTemporary->setChecked( mProperties->cacheUseTemporaryPath() ); cbProxyType->setCurrentIndex( cbProxyType->findData( mProperties->proxyType() ) ); leProxyServer->setText( mProperties->proxyServer() ); sbProxyPort->setValue( mProperties->proxyPort() ); leProxyLogin->setText( mProperties->proxyLogin() ); leProxyPassword->setText( mProperties->proxyPassword() ); localeChanged(); } PropertiesDialog::~PropertiesDialog() { } bool PropertiesDialog::event( QEvent* event ) { switch ( event->type() ) { case QEvent::LocaleChange: localeChanged(); break; default: break; } return QDialog::event( event ); } void PropertiesDialog::localeChanged() { retranslateUi( this ); cbViewMode->setItemText( cbViewMode->findData( QListView::ListMode ), tr( "List" ) ); cbViewMode->setItemText( cbViewMode->findData( QListView::IconMode ), tr( "Icon" ) ); cbViewIconType->setItemText( cbViewIconType->findData( QWBFS::WiiTDB::CoverDisc ), tr( "Disc" ) ); cbViewIconType->setItemText( cbViewIconType->findData( QWBFS::WiiTDB::Cover ), tr( "Cover" ) ); cbProxyType->setItemText( cbProxyType->findData( QNetworkProxy::NoProxy ), tr( "No Proxy" ) ); cbProxyType->setItemText( cbProxyType->findData( QNetworkProxy::Socks5Proxy ), tr( "Socks5" ) ); cbProxyType->setItemText( cbProxyType->findData( QNetworkProxy::HttpProxy ), tr( "Http" ) ); } void PropertiesDialog::on_tbChangeLocale_clicked() { pTranslationManager* translationManager = pTranslationManager::instance(); const QString locale = pTranslationDialog::getLocale( translationManager ); if ( !locale.isEmpty() ) { lCurrentLocale->setText( locale ); } } void PropertiesDialog::on_tbCachePath_clicked() { const QString path = QFileDialog::getExistingDirectory( this, tr( "Choose a folder for the data cache" ), mProperties->cacheWorkingPath() ); if ( path.isEmpty() ) { return; } leCachePath->setText( path ); } void PropertiesDialog::on_cbProxyType_currentIndexChanged( int index ) { const QNetworkProxy::ProxyType type = QNetworkProxy::ProxyType( cbProxyType->itemData( index ).toInt() ); switch ( type ) { case QNetworkProxy::NoProxy: leProxyServer->setEnabled( false ); sbProxyPort->setEnabled( false ); leProxyLogin->setEnabled( false ); leProxyPassword->setEnabled( false ); break; case QNetworkProxy::Socks5Proxy: case QNetworkProxy::HttpProxy: leProxyServer->setEnabled( true ); sbProxyPort->setEnabled( true ); leProxyLogin->setEnabled( true ); leProxyPassword->setEnabled( true ); break; default: break; } } void PropertiesDialog::accept() { pTranslationManager* translationManager = pTranslationManager::instance(); mProperties->setCacheWorkingPath( leCachePath->text() ); mProperties->setCacheDiskSize( Q_INT64_C( sbCacheDiskSize->value() *1024 *1024 ) ); mProperties->setCacheUseTemporaryPath( cbCacheUseTemporary->isChecked() ); mProperties->setProxyType( QNetworkProxy::ProxyType( cbProxyType->itemData( cbProxyType->currentIndex() ).toInt() ) ); mProperties->setProxyServer( leProxyServer->text() ); mProperties->setProxyPort( sbProxyPort->value() ); mProperties->setProxyLogin( leProxyLogin->text() ); mProperties->setProxyPassword( leProxyPassword->text() ); mProperties->setTranslationsPaths( translationManager->translationsPaths() ); mProperties->setLocaleAccepted( true ); mProperties->setLocale( QLocale( lCurrentLocale->text() ) ); mProperties->setViewMode( QListView::ViewMode( cbViewMode->itemData( cbViewMode->currentIndex() ).toInt() ) ); mProperties->setViewIconType( QWBFS::WiiTDB::Scan( cbViewIconType->itemData( cbViewIconType->currentIndex() ).toInt() ) ); QDialog::accept(); emit propertiesChanged(); } ./qwbfsmanager-1.2.1-src/qwbfs/src/qwbfsdriver/0000755000175000017520000000000011546156115020772 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/qwbfs/src/qwbfsdriver/PartitionDiscHandle.cpp0000644000175000017520000000723111410720766025370 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : PartitionDiscHandle.cpp ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #include "PartitionDiscHandle.h" #include using namespace QWBFS::Partition; using namespace QWBFS::Partition::Internal; // DiscHandleData DiscHandleData::DiscHandleData( const QWBFS::Partition::Handle& _handle, const QString& _discId ) { handle = wbfs_open_disc( _handle.ptr(), (u8*)( _discId.toLocal8Bit().data() ) ); discId = _discId; index = handle ? handle->i : -1; if ( handle ) { QString( "*** Opened disc: %1" ).arg( discId ).toLocal8Bit().constData(); } } DiscHandleData::DiscHandleData( const DiscHandleData& other ) : QSharedData( other ) { handle = other.handle; discId = other.discId; index = other.index; } DiscHandleData::~DiscHandleData() { if ( handle ) { wbfs_close_disc( handle ); QString( "*** Closed disc: %1" ).arg( discId ).toLocal8Bit().constData(); } //qWarning() << Q_FUNC_INFO; } // DiscHandleData DiscHandle::DiscHandle( const QWBFS::Partition::Handle& handle, const QString& discId ) { d = new DiscHandleData( handle, discId ); } DiscHandle::~DiscHandle() { //qWarning() << Q_FUNC_INFO; } QString DiscHandle::discId() const { return d->discId; } int DiscHandle::index() const { return d->index; } QString DiscHandle::isoName() const { if ( !isValid() ) { return QString::null; } QString isoName = QString::fromLocal8Bit( QString::fromLocal8Bit( (char*)d->handle->header->disc_header_copy +0x20, 0x100 ) .replace( ' ', '_' ) .replace( '/', '_' ) .replace( ':', '_' ).trimmed().toLocal8Bit().constData() ); while ( isoName.contains( "__" ) ) { isoName.replace( "__", "_" ); } if ( isoName.length() >= 0x100 ) { isoName.chop( ( isoName.length() -0x100 ) +4 ); } isoName.append( ".iso" ); return isoName; } bool DiscHandle::isValid() const { return d->handle; } wbfs_disc_t* DiscHandle::ptr() const { return d->handle; } ./qwbfsmanager-1.2.1-src/qwbfs/src/qwbfsdriver/PartitionHandle.h0000644000175000017520000000541211410720766024231 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : PartitionHandle.h ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #ifndef PARTITIONHANDLE_H #define PARTITIONHANDLE_H #include #include #include "qwbfsdriver/PartitionProperties.h" namespace QWBFS { namespace Partition { namespace Internal { class HandleData : public QSharedData { public: HandleData( const QWBFS::Partition::Properties& properties = QWBFS::Partition::Properties() ); HandleData( const HandleData& other ); ~HandleData(); QWBFS::Partition::Properties properties; wbfs_t* handle; }; }; // Internal class Handle { public: Handle( const QWBFS::Partition::Properties& properties = QWBFS::Partition::Properties() ); Handle( const QString& partition ); ~Handle(); bool isValid() const; wbfs_t* ptr() const; QWBFS::Partition::Properties properties() const; bool reset() const; QString partition() const; protected: QSharedDataPointer d; }; }; // Partition }; // QWBFS #endif // PARTITIONHANDLE_H ./qwbfsmanager-1.2.1-src/qwbfs/src/qwbfsdriver/PartitionProperties.h0000644000175000017520000000423711410720766025176 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : PartitionProperties.h ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #ifndef PARTITIONPROPERTIES_H #define PARTITIONPROPERTIES_H #include namespace QWBFS { namespace Partition { struct Properties { Properties( const QString& partition = QString::null ); bool reset; QString partition; }; }; // Partition }; // QWBFS #endif // PARTITIONPROPERTIES_H ./qwbfsmanager-1.2.1-src/qwbfs/src/qwbfsdriver/Driver.cpp0000644000175000017520000006126711543720725022746 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : Driver.cpp ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #include "Driver.h" #include "PartitionDiscHandle.h" #include "models/Disc.h" #include #include #include #include #include #if defined( Q_OS_WIN ) #include #include #include #endif using namespace QWBFS; #define WBFS_FILE_MINIMUM_SIZE 1024 *1024 *16 QMutex Driver::mMutex; bool Driver::mForce = false; QHash Driver::mHandles; QHash Driver::mLanguages; QHash Driver::mRegions; QWBFS::Driver* Driver::mCurrentDriver = 0; Driver::Driver( QObject* parent, const QWBFS::Partition::Handle& partitionHandle ) : QObject( parent ) { mProperties = partitionHandle.properties(); mHandle = partitionHandle; mHasCreatedHandle = !partitionHandle.isValid(); init(); } Driver::Driver( const QWBFS::Partition::Handle& partitionHandle ) : QObject( 0 ) { mProperties = partitionHandle.properties(); mHandle = partitionHandle; mHasCreatedHandle = !partitionHandle.isValid(); init(); } Driver::~Driver() { close(); } void Driver::init() { if ( mRegions.isEmpty() && mLanguages.isEmpty() ) { /* ASCII Hex Region A 41 All regions. System channels like the Mii channel use it. D 44 German-speaking regions. Only if separate versions exist, e.g. Zelda: A Link to the Past E 45 USA and other NTSC regions except Japan F 46 French-speaking regions. Only if separate versions exist, e.g. Zelda: A Link to the Past. J 4A Japan K 4B Korea L 4C PAL/World? P 50 Europe, Australia and other PAL regions Q 51 Korea with Japanese language. T 54 Korea with English language. X 58 Not a real region code. Homebrew Channel uses it, though. */ /* WiiTDB Folder Game ID: E = US J = JA K = KO R = RU W = ZH ça c'est fixe, ça ne bouge pas, c'est toujours en fonction du game ID Pour les ID en P,D,F,I,S,H,X,Y,Z, on fait en fonction de la langue de l'utilisateur (donc celle de l'interface ou avec une option) et on utilise EN, FR, DE, ES, IT, NL, PT Si l'image n'est pas trouvée dans la langue de préférence, on essaye EN (sauf si la langue préférée est l'anglais bien sur) Si l'ID ne contient aucune de ces lettres c'est que c'est un jeu custom avec un ID qui n'est pas standard. Dans ce cas on essaye la langue préférée, puis EN, puis other en tout dernier. */ // Regions mRegions.insert( 'A', "World" ); // All regions. System channels like the Mii channel use it. mRegions.insert( 'E', "NTSC-U" ); // USA and other NTSC regions except Japan. mRegions.insert( 'J', "NTSC-J" ); // Japan mRegions.insert( 'K', "NTSC-K" ); // Korea mRegions.insert( 'P', "PAL" ); // Europe, Australia and other PAL regions. mRegions.insert( 'W', "NTSC-T" ); // Taiwan mRegions.insert( 'R', "PAL-R" ); // Russia mRegions.insert( 'Q', "NTSC-K" ); // Korea with Japanese language. mRegions.insert( 'T', "NTSC-K" ); // Korea with English language. mRegions.insert( 'F', "PAL" ); // French-speaking regions. Only if separate versions exist, e.g. Zelda: A Link to the Past. mRegions.insert( 'D', "PAL" ); // German-speaking regions. Only if separate versions exist, e.g. Zelda: A Link to the Past. mRegions.insert( 'I', "PAL" ); // Italien-speaking regions. Only if separate versions exist. mRegions.insert( 'H', "PAL" ); // Dutch-speaking regions. Only if separate versions exist. mRegions.insert( 'S', "PAL" ); // Spanish-speaking regions. Only if separate versions exist. mRegions.insert( 'X', "PAL" ); // ?? mRegions.insert( 'Y', "PAL" ); // ?? mRegions.insert( 'Z', "PAL" ); // ?? // Custom disc / Channels mRegions.insert( 'L', "CUSTOM" ); mRegions.insert( 'M', "CUSTOM" ); mRegions.insert( 'N', "CUSTOM" ); // Languages /*mLanguages[ 'L' ] = QLatin1String( "EN" ); // Japanese Import to Europe, Australia and other PAL regions mLanguages[ 'M' ] = QLatin1String( "EN" ); // American Import to Europe, Australia and other PAL regions mLanguages[ 'N' ] = QLatin1String( "JA" ); // Japanese Import to USA and other NTSC regions*/ mLanguages.insert( 'A', "EN" ); // All regions. System channels like the Mii channel use it. mLanguages.insert( 'E', "US" ); // USA and other NTSC regions except Japan. mLanguages.insert( 'J', "JA" ); // Japan mLanguages.insert( 'K', "KO" ); // Korea mLanguages.insert( 'R', "RU" ); // Russia mLanguages.insert( 'W', "ZH" ); // Taiwan /*mLanguages.insert( 'Q', "JA" ); // Korea with Japanese language. mLanguages.insert( 'T', "EN" ); // Korea with English language. mLanguages.insert( 'F', "FR" ); // French-speaking regions. Only if separate versions exist, e.g. Zelda: A Link to the Past. mLanguages.insert( 'D', "DE" ); // German-speaking regions. Only if separate versions exist, e.g. Zelda: A Link to the Past. mLanguages.insert( 'I', "IT" ); // Italian-speaking regions. Only if separate versions exist. mLanguages.insert( 'H', "NL" ); // Dutch-speaking regions. Only if separate versions exist. mLanguages.insert( 'S', "ES" ); // Spanish-speaking regions. Only if separate versions exist.*/ //insert( 'P', "" ); // Europe, Australia and other PAL regions. } } void Driver::setPartition( const QString& partition ) { mProperties.partition = partition; } QString Driver::partition() const { return mHandle.isValid() ? mHandle.partition() : mProperties.partition; } QWBFS::Partition::Handle Driver::handle() const { return mHandle; } bool Driver::open() { if ( isOpen() ) { close(); } mHandle = getHandle( mProperties.partition, &mHasCreatedHandle ); return isOpen(); } void Driver::close() { if ( !isOpen() ) { return; } if ( mHasCreatedHandle ) { mHasCreatedHandle = false; closeHandle( mHandle ); } mHandle = QWBFS::Partition::Handle(); } bool Driver::isOpen() const { return mHandle.isValid(); } bool Driver::format() { if ( isOpen() ) { close(); } QWBFS::Partition::Properties properties = mProperties; properties.reset = true; const QWBFS::Partition::Handle handle( properties ); const QWBFS::Partition::Status status( handle ); return handle.isValid() && status.size > 0; } int Driver::discCount() const { if ( !isOpen() ) { return Driver::PartitionNotOpened; } return wbfs_count_discs( mHandle.ptr() ); } int Driver::discInfo( int index, QWBFS::Model::Disc& disc ) const { if ( !isOpen() ) { return Driver::PartitionNotOpened; } if ( index < 0 || index >= discCount() ) { return Driver::InvalidDiscIndex; } const int headerSize = 0x100; u8* header = (u8*)wbfs_ioalloc( headerSize ); quint32 size; disc.origin = mHandle.partition(); if ( wbfs_get_disc_info( mHandle.ptr(), index, header, headerSize, &size ) != 0 ) { wbfs_iofree( header ); return Driver::DiscReadFailed; } disc.size = size *4ULL; discInfo( header, disc ); wbfs_iofree( header ); return Driver::Ok; } int Driver::discInfo( const QString& discId, QWBFS::Model::Disc& disc ) const { if ( !isOpen() ) { return Driver::PartitionNotOpened; } const QWBFS::Partition::DiscHandle discHandle( mHandle, discId ); if ( discHandle.isValid() ) { return discInfo( discHandle.index(), disc ); } return Driver::InvalidDiscID; } int Driver::usedBlocksCount() const { if ( !isOpen() ) { return Driver::PartitionNotOpened; } return wbfs_count_usedblocks( mHandle.ptr() ); } int Driver::discImageInfo( const QString& fileName, QWBFS::Model::Disc& disc, partition_selector_t partitionSelection ) const { if ( isWBFSPartitionOrFile( fileName ) ) { return wbfsFileInfo( fileName, disc ); } if ( !isOpen() ) { return Driver::PartitionNotOpened; } void* fileHandle = wbfs_open_file_for_read( fileName.toLocal8Bit().data() ); if ( !fileHandle ) { return Driver::InvalidDisc; } u8* header = (u8*)wbfs_ioalloc( 0x100 ); disc.size = wbfs_estimate_disc( mHandle.ptr(), wbfs_read_wii_file, fileHandle, partitionSelection, header ); disc.origin = fileName; discInfo( header, disc ); wbfs_iofree( header ); wbfs_close_file( fileHandle ); return disc.size != 0 ? Driver::Ok : Driver::InvalidDisc; } int Driver::addDiscImage( const QString& fileName, progress_callback_t progressCallback, partition_selector_t partitionSelection, bool copy1to1, const QString& newName ) const { mCurrentDriver = const_cast( this ); #ifndef Q_OS_WIN Q_UNUSED( newName ); #endif if ( !QFile::exists( fileName ) ) { return Driver::DiscNotFound; } QWBFS::Model::Disc disc; const int result1 = discImageInfo( fileName, disc ); if ( result1 != Driver::Ok ) { return result1; } if ( hasDisc( disc.id ) == Driver::DiscFound ) { return Driver::DiscFound; } void* fileHandle = wbfs_open_file_for_read( fileName.toLocal8Bit().data() ); if ( !fileHandle ) { return Driver::DiscReadFailed; } const u32 result2 = wbfs_add_disc( mHandle.ptr(), wbfs_read_wii_file, fileHandle, progressCallback, partitionSelection, copy1to1 ? 1 : 0 #ifdef Q_OS_WIN , newName.isEmpty() ? 0 : newName.toLocal8Bit().data() #endif ); wbfs_close_file( fileHandle ); return result2 == 0 ? Driver::Ok : Driver::DiscAddFailed; } int Driver::removeDisc( const QString& discId ) const { if ( isOpen() ) { if ( wbfs_rm_disc( mHandle.ptr(), (u8*)discId.toLocal8Bit().data() ) == 0 ) { return Driver::Ok; } return Driver::DiscNotFound; } return Driver::PartitionNotOpened; } int Driver::extractDisc( const QString& discId, const QString& path, const QString& _name, progress_callback_t progressCallback ) const { mCurrentDriver = const_cast( this ); if ( !isOpen() ) { return Driver::PartitionNotOpened; } // get disc handle const QWBFS::Partition::DiscHandle discHandle( mHandle, discId ); if ( !discHandle.isValid() ) { return Driver::DiscNotFound; } const QString name = _name.isEmpty() ? discHandle.isoName() : _name; const QString filePath = QDir::toNativeSeparators( QString( "%1/%2" ).arg( path ).arg( name ) ); int result = Driver::allocateFile( filePath, ( discHandle.ptr()->p->n_wii_sec_per_disc /2 ) *0x8000ULL ); void* fileHandle = result == Driver::Ok ? wbfs_open_file_for_write( filePath.toLocal8Bit().data() ) : 0; if ( fileHandle ) { result = wbfs_extract_disc( discHandle.ptr(), wbfs_write_wii_file, fileHandle, progressCallback ); wbfs_close_file( fileHandle ); return result == 0 ? Driver::Ok : Driver::DiscExtractFailed; } else { QFile::remove( filePath ); } return Driver::DiscWriteFailed; } int Driver::renameDisc( const QString& discId, const QString& name ) const { if ( !isOpen() ) { return Driver::PartitionNotOpened; } if ( wbfs_ren_disc( mHandle.ptr(), (u8*)discId.toLocal8Bit().data(), (u8*)name.toLocal8Bit().data() ) == 0 ) { return Driver::Ok; } return Driver::DiscNotFound; } int Driver::status( QWBFS::Partition::Status& status ) const { if ( !isOpen() ) { return Driver::PartitionNotOpened; } status = QWBFS::Partition::Status( mHandle ); return Driver::Ok; } int Driver::addDisc( const QString& discId, const QWBFS::Partition::Handle& sourcePartitionHandle, progress_callback_t progressCallback, partition_selector_t partitionSelection ) const { mCurrentDriver = const_cast( this ); if ( !isOpen() ) { return Driver::PartitionNotOpened; } if ( !sourcePartitionHandle.isValid() ) { return Driver::SourcePartitionNotOpened; } const QWBFS::Partition::DiscHandle discHandle( sourcePartitionHandle, discId ); if ( !discHandle.isValid() ) { return Driver::DiscNotFound; } if ( hasDisc( discId ) == Driver::DiscFound ) { return Driver::DiscFound; } if ( wbfs_add_disc( mHandle.ptr(), discRead_callback/*wbfs_disc_read*/, discHandle.ptr(), progressCallback, partitionSelection, 0 #ifdef Q_OS_WIN , 0 #endif ) == 0 ) { return Driver::Ok; } return Driver::DiscAddFailed; } int Driver::canDrive2Drive( const QWBFS::Partition::Handle& sourcePartitionHandle ) const { if ( !isOpen() ) { return Driver::PartitionNotOpened; } if ( !sourcePartitionHandle.isValid() ) { return Driver::SourcePartitionNotOpened; } const double left = sourcePartitionHandle.ptr()->wbfs_sec_sz /sourcePartitionHandle.ptr()->hd_sec_sz; const double right = mHandle.ptr()->wbfs_sec_sz /mHandle.ptr()->hd_sec_sz; if ( qFuzzyCompare( left, right ) ) { return Driver::Ok; } return Driver::CantDrive2Drive; } int Driver::hasDisc( const QString& discId ) const { if ( !isOpen() ) { return Driver::PartitionNotOpened; } const QWBFS::Partition::DiscHandle discHandle( mHandle, discId ); if ( discHandle.isValid() ) { return Driver::DiscFound; } return Driver::DiscNotFound; } int Driver::discList( QWBFS::Model::DiscList& list ) const { const int count = discCount(); if ( count < 0 ) { return count; // error } for ( int index = 0; index < count; index++ ) { QWBFS::Model::Disc disc; const int result = discInfo( index, disc ); if ( result != Driver::Ok ) { return result; } list << disc; } return Driver::Ok; } int Driver::trim() const { if ( !isOpen() ) { return Driver::PartitionNotOpened; } wbfs_trim( mHandle.ptr() ); wbfs_file_truncate( mHandle.ptr()->callback_data, mHandle.ptr()->n_hd_sec *512ULL ); return Driver::Ok; } bool Driver::isWBFSPartitionOrFile( const QString& _fileName ) { QString filePath = _fileName; #if defined( Q_OS_WIN ) if ( !filePath.isEmpty() && filePath.length() <= 3 ) { filePath = QString( "\\\\?\\%1:" ).arg( filePath[ 0 ] ); DISK_GEOMETRY diskGeometry; HANDLE handle = CreateFile( QStringToTCHAR( filePath ), GENERIC_READ | FILE_SHARE_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL ); if ( handle != INVALID_HANDLE_VALUE ) { DWORD bytes; if ( DeviceIoControl( handle, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0, &diskGeometry, sizeof(DISK_GEOMETRY), &bytes, NULL ) ) { const DWORD sectorSize = diskGeometry.BytesPerSector; char buffer[ sectorSize ]; DWORD read; if ( ReadFile( handle, buffer, sectorSize, &read, NULL ) ) { CloseHandle( handle ); return QByteArray( buffer ).left( 4 ).toLower() == "wbfs"; } } } CloseHandle( handle ); return false; } #endif QFile file( filePath ); if ( file.open( QIODevice::ReadOnly ) ) { return file.read( 4 ).toLower() == "wbfs"; } return false; } int Driver::allocateFile( const QString& filePath, qint64 size ) { const int go = 1024 *1024 *1024; QFile file( filePath ); if ( file.exists() ) { return Driver::DiscFound; } if ( file.open( QIODevice::WriteOnly ) ) { if ( size == -1 ) { if ( file.resize( go *8.8 ) ) { // 8.8 go - all FS except FAT32 // 143432 *2 *0x8000ULL return Driver::Ok; } else if ( file.resize( ( go *4.0 ) -1 ) ) { // 4go - fat32 FS return Driver::Ok; } } else if ( file.resize( size ) ) { return Driver::Ok; } } file.remove(); return Driver::DiscWriteFailed; } int Driver::wbfsFileInfo( const QString& wbfsFileName, QWBFS::Model::Disc& disc ) { /*if ( !isWBFSPartitionOrFile( wbfsFileName ) ) { return Driver::InvalidDisc; }*/ wbfs_t* partition = wbfs_try_open_partition( wbfsFileName.toLocal8Bit().data(), 0 ); if ( !partition ) { return Driver::InvalidDisc; } u8* header = (u8*)wbfs_ioalloc( 0x100 ); int count = wbfs_count_discs( partition ); if ( count != 1 ) { wbfs_iofree( header ); wbfs_close( partition ); return Driver::InvalidDisc; } wbfs_disc_t* cd; quint32 size; if( !wbfs_get_disc_info( partition, 0, header, 0x100, &size ) ) { cd = wbfs_open_disc( partition, header ); if ( !cd ) { wbfs_iofree( header ); wbfs_close( partition ); return Driver::InvalidDisc; } wbfs_close_disc( cd ); } disc.size = size *4ULL; disc.origin = wbfsFileName; discInfo( header, disc ); wbfs_iofree( header ); wbfs_close( partition ); return disc.size != 0 ? Driver::Ok : Driver::InvalidDisc; } int Driver::convertIsoFileToWBFSFile( const QString& isoFilePath, const QString& _wbfsFilePath ) { int result; QString wbfsFilePath = _wbfsFilePath; if ( wbfsFilePath.isEmpty() ) { wbfsFilePath = QString( "%1.wbfs" ).arg( isoFilePath ); } result = Driver::allocateFile( wbfsFilePath ); if ( result != QWBFS::Driver::Ok ) { return result; } QWBFS::Partition::Properties properties( wbfsFilePath ); properties.reset = true; QWBFS::Partition::Handle handle( properties ); QWBFS::Driver td( 0, handle ); if ( !td.isOpen() ) { return Driver::PartitionNotOpened; } QWBFS::Model::Disc disc; result = td.discImageInfo( isoFilePath, disc ); if ( result != QWBFS::Driver::Ok ) { return result; } result = td.addDiscImage( disc.origin ); if ( result != QWBFS::Driver::Ok ) { return result; } return td.trim(); } QString Driver::errorToString( QWBFS::Driver::Error error ) { switch ( error ) { case Driver::Ok: return tr( "No error" ); case Driver::PartitionNotOpened: return tr( "Partition not opened" ); case Driver::SourcePartitionNotOpened: return tr( "Source partition not opened" ); case Driver::DiscReadFailed: return tr( "Disc read failed" ); case Driver::DiscWriteFailed: return tr( "Disc write failed" ); case Driver::DiscExtractFailed: return tr( "Disc extract failed" ); case Driver::DiscAddFailed: return tr( "Disc add failed" ); case Driver::DiscConvertFailed: return tr( "Disc convert failed" ); case Driver::DiscRenameFailed: return tr( "Disc rename failed" ); case Driver::DiscFound: return tr( "Disc found" ); case Driver::DiscNotFound: return tr( "Disc not found (or not exists)" ); case Driver::InvalidDiscIndex: return tr( "Invalid disc index" ); case Driver::InvalidDiscID: return tr( "Invalid disc id" ); case Driver::InvalidDisc: return tr( "Invalid disc" ); case Driver::CantDrive2Drive: return tr( "Can't drive to drive copy" ); case Driver::UnknownError: return tr( "Unknown error" ); } return QString::null; } QString Driver::regionToString( int region ) { return mRegions.value( region, "Unknow Region" ); } QString Driver::regionToLanguageString( int region ) { const QString systemLanguage = QLocale::system().name().section( '_', 0, 0 ).toUpper(); return mLanguages.value( region, systemLanguage.isEmpty() ? "EN" : systemLanguage ); } QString Driver::stateToString( QWBFS::Driver::State state ) { switch ( state ) { case Driver::None: return tr( "None" ); case Driver::Success: return tr( "Success" ); case Driver::Failed: return tr( "Failed" ); } return QString::null; } void Driver::setForceMode( bool force ) { QMutexLocker locker( &mMutex ); mForce = force; wbfs_set_force_mode( mForce ? 1 : 0 ); } bool Driver::forceMode() { QMutexLocker locker( &mMutex ); return mForce; } void Driver::addHandle( const QWBFS::Partition::Handle& handle ) { if ( !handle.isValid() ) { return; } QMutexLocker locker( &mMutex ); mHandles[ handle.partition() ] = handle; } QWBFS::Partition::Handle Driver::getHandle( const QString& partition, bool* created ) { QMutexLocker locker( &mMutex ); QWBFS::Partition::Handle handle = mHandles.value( partition ); if ( created ) { *created = false; } if ( !handle.isValid() ) { const QWBFS::Partition::Handle _handle( partition ); if ( _handle.isValid() ) { mHandles[ partition ] = _handle; handle = _handle; if ( created ) { *created = true; } } } return handle; } void Driver::closeHandle( const QWBFS::Partition::Handle& handle ) { QMutexLocker locker( &mMutex ); mHandles.remove( handle.partition() ); } int Driver::u8StrLength( u8* str ) { int counter = 0; int length = 0; while ( str[ counter++ ] != '\0' ) { length++; } return length; } void Driver::discInfo( u8* header, QWBFS::Model::Disc& disc ) { const int offset = 0x20; const int length = u8StrLength( header +offset ); disc.id = QString::fromLocal8Bit( (const char*)header, 6 ); disc.title = QString::fromLocal8Bit( (const char*)header +offset, length ); disc.region = QChar( header[ 0x3 ] ).unicode(); } qint64 Driver::minimumWBFSFileSize() { return WBFS_FILE_MINIMUM_SIZE; } QWBFS::Model::Disc Driver::isoDiscInfo( const QString& filePath ) { const QString tmpFile = QString( "%1/%2.tmp%3" ) .arg( QDir::tempPath() ) .arg( QApplication::applicationName() ) .arg( minimumWBFSFileSize() ); QWBFS::Model::Disc disc; // create temporary wbfs container for estimating the size if ( !QFile::exists( tmpFile ) ) { if ( Driver::allocateFile( tmpFile, minimumWBFSFileSize() ) != QWBFS::Driver::Ok ) { qWarning() << Q_FUNC_INFO << "Can't create tmp file" << tmpFile.toLocal8Bit().constData(); return disc; } } QWBFS::Partition::Properties properties( tmpFile ); properties.reset = true; QWBFS::Partition::Handle handle( properties ); if ( handle.isValid() ) { void* fileHandle = wbfs_open_file_for_read( filePath.toLocal8Bit().data() ); if ( fileHandle ) { u8* header = (u8*)wbfs_ioalloc( 0x100 ); disc.size = wbfs_estimate_disc( handle.ptr(), wbfs_read_wii_file, fileHandle, ONLY_GAME_PARTITION, header ); disc.origin = filePath; discInfo( header, disc ); wbfs_iofree( header ); wbfs_close_file( fileHandle ); } else { qWarning() << Q_FUNC_INFO << "Invalid file handle"; } } else { qWarning() << Q_FUNC_INFO << "Invalid wbfs handle"; } //QFile::remove( tmpFile ); // should delete it but may be not performant for multiple requests of iso estimated size return disc; } Driver::FileType Driver::fileType( const QString& filePath ) { const QFileInfo file( filePath ); const QString suffix = file.isDir() ? QString::null : file.suffix().toLower(); if ( suffix == "iso" ) { return QWBFS::Driver::ISOFile; } else if ( suffix == "wbfs" ) { if ( isWBFSPartitionOrFile( filePath ) ) { return QWBFS::Driver::WBFSFile; } } else if ( suffix.isEmpty() ) { if ( isWBFSPartitionOrFile( filePath ) ) { return QWBFS::Driver::WBFSPartitionFile; } } return QWBFS::Driver::UnknownFile; } int Driver::discRead_callback( void* fp, u32 lba, u32 count, void* iobuf ) { int ret = wbfs_disc_read( (wbfs_disc_t*)fp, lba, (u8*)iobuf, count ); static int num_fail = 0; if ( ret ) { if ( num_fail == 0 ) { qWarning() << "Error reading lba probably the two wbfs don't have the same granularity. Ignoring..."; } if ( num_fail++ > 0x100 ) { qWarning() << "Too many error giving up..."; return 1; } } else { num_fail = 0; } return 0; } QTime Driver::estimatedTimeForTask( int x, int max ) { static time_t start_time; static u32 expected_total; u32 d; u32 h, m, s; if ( x == 0 ) { start_time = time( 0 ); expected_total = 300; } if ( x == max ) { d = (u32)( time( 0 ) -start_time ); h = d /3600; m = ( d /60 ) %60; s = d %60; return QTime( h, m, s ); } d = (u32)( time( 0 ) -start_time ); if ( x != 0 ) { expected_total = (u32)( ( 3 *expected_total +d *max /x ) /4 ); } if ( expected_total > d ) { d = expected_total -d; } else { d = 0; } h = d /3600; m = ( d /60 ) %60; s = d %60; return QTime( h, m, s ); } void Driver::progress_callback( int x, int max ) { if ( mCurrentDriver ) { emit mCurrentDriver->currentProgressChanged( x, max, estimatedTimeForTask( x, max ) ); } } ./qwbfsmanager-1.2.1-src/qwbfs/src/qwbfsdriver/PartitionStatus.h0000644000175000017520000000432111410720766024317 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : PartitionStatus.h ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #ifndef PARTITIONSTATUS_H #define PARTITIONSTATUS_H #include "qwbfsdriver/PartitionHandle.h" namespace QWBFS { namespace Partition { struct Status { Status( const QWBFS::Partition::Handle& handle = QWBFS::Partition::Handle() ); qint32 blocks; qint64 size; qint64 used; qint64 free; }; }; // Partition }; // QWBFS #endif // PARTITIONSTATUS_H ./qwbfsmanager-1.2.1-src/qwbfs/src/qwbfsdriver/PartitionHandle.cpp0000644000175000017520000000663111542476612024574 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : PartitionHandle.cpp ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #include "PartitionHandle.h" #include using namespace QWBFS::Partition; using namespace QWBFS::Partition::Internal; // HandleData HandleData::HandleData( const QWBFS::Partition::Properties& _properties ) { properties = _properties; QString partition = properties.partition; #if defined( Q_OS_WIN ) partition.remove( ":\\" ).remove( ":/" ); #endif handle = partition.isEmpty() ? 0 : wbfs_try_open_partition( partition.toLocal8Bit().data(), properties.reset ? 1 : 0 ); if ( handle ) { qWarning() << QString( "*** Opened partition: %1" ).arg( properties.partition ).toLocal8Bit().constData(); } } HandleData::HandleData( const HandleData& other ) : QSharedData( other ) { properties = other.properties; handle = other.handle; } HandleData::~HandleData() { if ( handle ) { wbfs_close( handle ); qWarning() << QString( "*** Closed partition: %1" ).arg( properties.partition ).toLocal8Bit().constData(); } //qWarning() << Q_FUNC_INFO; } // Handle Handle::Handle( const QWBFS::Partition::Properties& properties ) { d = new HandleData( properties ); } Handle::Handle( const QString& partition ) { d = new HandleData( QWBFS::Partition::Properties( partition ) ); } Handle::~Handle() { //qWarning() << Q_FUNC_INFO; } bool Handle::isValid() const { return d->handle; } wbfs_t* Handle::ptr() const { return d->handle; } QWBFS::Partition::Properties Handle::properties() const { return d->properties; } bool Handle::reset() const { return d->properties.reset; } QString Handle::partition() const { return d->properties.partition; } ./qwbfsmanager-1.2.1-src/qwbfs/src/qwbfsdriver/PartitionStatus.cpp0000644000175000017520000000457311410720766024663 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : PartitionStatus.cpp ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #include "PartitionStatus.h" using namespace QWBFS::Partition; Status::Status( const QWBFS::Partition::Handle& handle ) { blocks = handle.isValid() ? (qint32)wbfs_count_usedblocks( handle.ptr() ) : -1; size = Q_INT64_C( handle.isValid() ? (double)handle.ptr()->n_wbfs_sec *handle.ptr()->wbfs_sec_sz : -1 ); used = Q_INT64_C( handle.isValid() ? (double)( handle.ptr()->n_wbfs_sec -blocks ) *handle.ptr()->wbfs_sec_sz : -1 ); free = Q_INT64_C( handle.isValid() ? (double)(blocks) *handle.ptr()->wbfs_sec_sz : -1 ); } ./qwbfsmanager-1.2.1-src/qwbfs/src/qwbfsdriver/Driver.h0000644000175000017520000002653411534466576022424 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : Driver.h ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #ifndef DRIVER_H #define DRIVER_H #include #include #include #include #include "qwbfsdriver/PartitionProperties.h" #include "qwbfsdriver/PartitionHandle.h" #include "qwbfsdriver/PartitionStatus.h" namespace QWBFS { namespace Model { struct Disc; typedef QList DiscList; }; // Model class Driver : public QObject { Q_OBJECT public: enum State { None = 0, Success, Failed }; enum Error { Ok = 0, PartitionNotOpened = -1, SourcePartitionNotOpened = -2, DiscReadFailed = -3, DiscWriteFailed = -4, DiscExtractFailed = -5, DiscAddFailed = -6, DiscConvertFailed = -7, DiscRenameFailed = -8, DiscFound = -9, DiscNotFound = -10, InvalidDiscIndex = -11, InvalidDiscID = -12, InvalidDisc = -13, CantDrive2Drive = -14, UnknownError = -1000 }; enum FileType { UnknownFile = 0, WBFSPartitionFile, WBFSFile, ISOFile }; Driver( QObject* parent = 0, const QWBFS::Partition::Handle& partitionHandle = QWBFS::Partition::Handle() ); Driver( const QWBFS::Partition::Handle& partitionHandle ); virtual ~Driver(); void setPartition( const QString& partition ); QString partition() const; QWBFS::Partition::Handle handle() const; /*! \details open the partition. \param none. \return return true on success, else false. */ bool open(); /*! \details close the partition. \param none. \return none. */ void close(); /*! \details return the partition open state. \param none. \return return true if open, else false. */ bool isOpen() const; /*! \details format the partition, closing it first if needed. /!\ Be sure to close all opened handle of the same partition first. \param none. \return return true on success, else false. */ bool format(); /*! \details return the disc count. \param none. \return PartitionNotOpened or the disc count. */ int discCount() const; /*! \details return a filled disc structure. \param index the disc index position in the wbfs partition. \param discId the disc ID of the disc. \param disc the structure to be filled. \return PartitionNotOpened, InvalidDiscIndex, InvalidDiscID or Ok. */ int discInfo( int index, QWBFS::Model::Disc& disc ) const; int discInfo( const QString& discId, QWBFS::Model::Disc& disc ) const; /*! \details return the used blocks count. \param none. \return PartitionNotOpened or the used blocks count. */ int usedBlocksCount() const; /*! \details return a filled disc structure. \param fileName the file to get informations from. \param partitionSelector the partition selector. \param disc the disc to fill informations. \return PartitionNotOpened or the used blocks count. */ int discImageInfo( const QString& fileName, QWBFS::Model::Disc& disc, partition_selector_t partitionSelection = ONLY_GAME_PARTITION ) const; /*! \details add a disc image in the partition. \param fileName the disc image file path to add. \param progressCallback the progress callback to use. \param partitionSelection the partition to add. \param copy1to1 do a 1to1 copy or not. \param newName a new name to use for the added disc. /!\ windows only. \return PartitionNotOpened, DiscReadFailed, DiscAlreadyInPartition, DiscAddFailed or Ok */ int addDiscImage( const QString& fileName, progress_callback_t progressCallback = Driver::progress_callback, partition_selector_t partitionSelection = ONLY_GAME_PARTITION, bool copy1to1 = false, const QString& newName = QString::null ) const; /*! \details remove a disc from the partition. \param discId the disc id to remove. \return remove a disc from the partition. */ int removeDisc( const QString& discId ) const; /*! \details extract a disc from the wbfs partition to a path. \param discId the disc id to extract. \param path the path where to extract the disc. \param progressCallback the progress callback to use. \param name the name of the iso if not null, else the name is based on the disc title. \return PartitionNotOpened, DiscNotFound, DiscExtractFailed, DiscWriteFailed or Ok. */ int extractDisc( const QString& discId, const QString& path, const QString& name = QString::null, progress_callback_t progressCallback = Driver::progress_callback ) const; /*! \details rename the disc id to another name. \param discId the disc id to rename. \param name the new name to set for the disc. \return PartitionNotOpened, DiscNotFound, or Ok. */ int renameDisc( const QString& discId, const QString& name ) const; /*! \details fill a status structure with partition infos. \param status the structure to be filled with partition status. \return PartitionNotOpened or Ok. */ int status( QWBFS::Partition::Status& status ) const; /*! \details add a disc from another partition aka drive2drive copy. \param discId the disc id to copy. \param sourcePartitionHandle the partition to read disc from. \return PartitionNotOpened, SourcePartitionNotOpened, DiscNotFound, DiscAlreadyInPartition, DiscAddFailed or Ok. */ int addDisc( const QString& discId, const QWBFS::Partition::Handle& sourcePartitionHandle, progress_callback_t progressCallback = Driver::progress_callback, partition_selector_t partitionSelection = ONLY_GAME_PARTITION ) const; /*! \details check if drive2drive copy is possible. \param handle the source partition handle. \return PartitionNotOpened, SourcePartitionNotOpened, CantDrive2Drive or Ok */ int canDrive2Drive( const QWBFS::Partition::Handle& sourcePartitionHandle ) const; /*! \details check if a disc is in the partition. \param discId the disc id to check. \return PartitionNotOpened, DiscNotFound or DiscFound */ int hasDisc( const QString& discId ) const; /*! \details list all dics in the partition \param list the list to fill of discs \return Ok or wbfs error code */ int discList( QWBFS::Model::DiscList& list ) const; /*! \details truncate the file system to its minimum size (for creating stand alone wbfs files) \return PartitionNotOpened or Ok */ int trim() const; /*! \details return if a file is a wbfs partition/file. \param fileName the fileName to check. \return return true if fileName is a wbfs partition/file, else false. */ static bool isWBFSPartitionOrFile( const QString& fileName ); /*! \details initialize a file having \a size bytes \param filePath the filepath where to initialize the file \param size the size to allocate in the file \return DiscWriteFailed or Ok */ static int allocateFile( const QString& filePath, qint64 size = -1 ); /*! \details return a filled disc structure. \param wbfsFileName the wbfs file to get informations from. \param partitionSelector the partition selector. \param disc the disc to fill informations. \return InvalidDisc or Ok */ static int wbfsFileInfo( const QString& wbfsFileName, QWBFS::Model::Disc& disc ); /*! \details convert an iso file to a wbfs file \param isoFilePath the source iso file path \param wbfsFilePath the target wbfs file path if setted, else isoFilePath +".wbfs" \return DiscReadFailed, addDiscImage result or Ok */ static int convertIsoFileToWBFSFile( const QString& isoFilePath, const QString& wbfsFilePath = QString::null ); /*! \details return a string representation of the error. \param error the error to represent. \return return a QString representing the textual error message. */ static QString errorToString( QWBFS::Driver::Error error ); /*! \details return a string representation of the region. \param region the region to represent. \return return a QString representing the textual region. */ static QString regionToString( int region ); /*! \details return a string representation of the region language. \param region the region language to represent. \return return a QString representing the textual region language. */ static QString regionToLanguageString( int region ); /*! \details return a string representation of the state. \param state the state to represent. \return return a QString representing the textual state. */ static QString stateToString( QWBFS::Driver::State state ); /*! \details set the force mode of the libwbfs. \param force true to force, else false. \return none. */ static void setForceMode( bool force ); /*! \details return the force mode of the libwbfs. \param none. \return return true if force is active, else false. */ static bool forceMode(); static void addHandle( const QWBFS::Partition::Handle& handle ); static QWBFS::Partition::Handle getHandle( const QString& partition, bool* created = 0 ); static void closeHandle( const QWBFS::Partition::Handle& handle ); static void discInfo( u8* header, QWBFS::Model::Disc& disc ); static qint64 minimumWBFSFileSize(); static QWBFS::Model::Disc isoDiscInfo( const QString& filePath ); static Driver::FileType fileType( const QString& filePath ); static QTime estimatedTimeForTask( int value, int maximum ); protected: mutable QWBFS::Partition::Properties mProperties; QWBFS::Partition::Handle mHandle; bool mHasCreatedHandle; static QMutex mMutex; static bool mForce; static QWBFS::Driver* mCurrentDriver; static QHash mHandles; static QHash mLanguages; static QHash mRegions; void init(); static int u8StrLength( u8* str ); static int discRead_callback( void* fp, u32 lba, u32 count, void* iobuf ); static void progress_callback( int value, int maximum ); signals: void currentProgressChanged( int value, int maximum, const QTime& remaining ); void globalProgressChanged( int value, int maximum ); }; }; // QWBFS #endif // DRIVER_H ./qwbfsmanager-1.2.1-src/qwbfs/src/qwbfsdriver/PartitionProperties.cpp0000644000175000017520000000403411410720766025524 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : PartitionProperties.cpp ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #include "PartitionProperties.h" using namespace QWBFS::Partition; Properties::Properties( const QString& _partition ) { reset = false; partition = _partition; } ./qwbfsmanager-1.2.1-src/qwbfs/src/qwbfsdriver/PartitionDiscHandle.h0000644000175000017520000000534011410720766025034 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : PartitionDiscHandle.h ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #ifndef PARTITIONDISCHANDLE_H #define PARTITIONDISCHANDLE_H #include #include "qwbfsdriver/PartitionHandle.h" namespace QWBFS { namespace Partition { namespace Internal { class DiscHandleData : public QSharedData { public: DiscHandleData( const QWBFS::Partition::Handle& handle = QWBFS::Partition::Handle(), const QString& discId = QString::null ); DiscHandleData( const DiscHandleData& other ); ~DiscHandleData(); wbfs_disc_t* handle; QString discId; int index; }; }; // Internal struct DiscHandle { DiscHandle( const QWBFS::Partition::Handle& handle, const QString& discId ); ~DiscHandle(); bool isValid() const; wbfs_disc_t* ptr() const; QString discId() const; int index() const; QString isoName() const; protected: QSharedDataPointer d; }; }; // Partition }; // QWBFS #endif // PARTITIONDISCHANDLE_H ./qwbfsmanager-1.2.1-src/qwbfs/src/ListView.h0000644000175000017520000000676511543625302020365 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : ListView.h ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #ifndef LISTVIEW_H #define LISTVIEW_H #include #include "wiitdb/Covers.h" class QHeaderView; class pNetworkAccessManager; namespace QWBFS { class Driver; namespace Model { struct Disc; class DiscModel; class DiscDelegate; }; // Model }; // QWBFS typedef QPair QItemViewPaintPair; typedef QList QItemViewPaintPairs; #define HEADER_HEIGHT 21 class ListView : public QListView { Q_OBJECT public: ListView( QWidget* parent = 0 ); virtual ~ListView(); void initialize( QWBFS::Driver* driver, pNetworkAccessManager* manager ); void setViewMode( QListView::ViewMode mode ); void setViewIconType( QWBFS::WiiTDB::Scan scan ); QWBFS::WiiTDB::Scan viewIconType() const; QWBFS::Driver* driver() const; QWBFS::Model::DiscModel* model() const; pNetworkAccessManager* cacheManager() const; protected slots: void header_sortIndicatorChanged( int logicalIndex, Qt::SortOrder order ); protected: QWBFS::WiiTDB::Scan mIconType; QWBFS::Driver* mDriver; QWBFS::Model::DiscModel* mModel; QWBFS::Model::DiscDelegate* mDelegate; pNetworkAccessManager* mCacheManager; QHeaderView* mHeader; virtual void resizeEvent( QResizeEvent* event ); virtual void mousePressEvent( QMouseEvent* event ); virtual void startDrag( Qt::DropActions supportedActions ); // dirty code get from QAbstractItemView for avoid drag & drop bug (no preview when dragging) QItemViewPaintPairs draggablePaintPairs( const QModelIndexList& indexes, QRect* r ) const; QPixmap renderToPixmap( const QModelIndexList& indexes, QRect* r ) const; QStyleOptionViewItemV4 viewOptionsV4() const; void clearOrRemove(); }; #endif // LISTVIEW_H ./qwbfsmanager-1.2.1-src/qwbfs/src/ProgressDialog.h0000644000175000017520000000573411505775715021552 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : ProgressDialog.h ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #ifndef PROGRESSDIALOG_H #define PROGRESSDIALOG_H #include "ui_ProgressDialog.h" #include "WorkerThread.h" #include "models/Disc.h" #include class ProgressDialog : public QDialog, public Ui::ProgressDialog { Q_OBJECT public: ProgressDialog( QWidget* parent = 0 ); virtual ~ProgressDialog(); virtual bool event( QEvent* event ); void setWork( const WorkerThread::Work& work ); public slots: virtual void done( int r ); protected: WorkerThread* mThread; QTime mElapsed; void closeEvent( QCloseEvent* event ); void localeChanged(); void doConnections(); protected slots: void thread_started(); void thread_message( const QString& text ); void thread_log( const QString& text ); void thread_jobFinished( const QWBFS::Model::Disc& disc ); void thread_currentProgressChanged( int value, int maximum, const QTime& remaining ); void thread_globalProgressChanged( int value, int maximum ); void thread_canceled(); void thread_finished(); void on_cbDetails_toggled(); void updateSpace(); signals: void jobFinished( const QWBFS::Model::Disc& disc ); void finished(); }; #endif // PROGRESSDIALOG_H ./qwbfsmanager-1.2.1-src/qwbfs/src/UIMain.cpp0000644000175000017520000004640011545616705020273 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : UIMain.cpp ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #include "UIMain.h" #include "UIAbout.h" #include "models/DiscModel.h" #include "models/DiscDelegate.h" #include "wiitdb/Covers.h" #include "ProgressDialog.h" #include "PropertiesDialog.h" #include "Properties.h" #include "main.h" #include #include #include #include #include #include "models/pPartitionModel.h" // will be part of fresh library in a next version #include #include #include #include #include #include #include #include #include #include #include #define COVER_DISC_SIZE QSize( 160, 160 ) #define COVER_SIZE QSize( 160, 224 ) UIMain::UIMain( QWidget* parent ) : QMainWindow( parent ) { #if defined( Q_OS_MAC ) mMenuBar = new QMenuBar; #endif mCache = pNetworkAccessManager::instance(); mUpdateChecker = new pUpdateChecker( this ); mUpdateChecker->setDownloadsFeedUrl( QUrl( APPLICATION_DOWNLOADS_FEED ) ); mUpdateChecker->setVersion( APPLICATION_VERSION ); mUpdateChecker->setVersionString( APPLICATION_VERSION_STR ); mUpdateChecker->setVersionDiscoveryPattern( ".*qwbfsmanager-([0-9\\.]+).*" ); setWindowTitle( QString( "%1 v%2" ).arg( APPLICATION_NAME ).arg( APPLICATION_VERSION_STR ) ); setUnifiedTitleAndToolBarOnMac( true ); setupUi( this ); #if defined( Q_OS_MAC ) mMenuBar->addMenu( "Fake" )->addAction( aProperties ); #endif centralVerticalLayout->setMenuBar( qmtbInfos ); qmtbInfos->layout()->setMargin( 5 ); qmtbInfos->queuedMessageWidget()->setContentsMargins( 5, 0, 5, 0 ); qmtbInfos->setVisible( false ); dwTools->toggleViewAction()->setIcon( QIcon( ":/icons/256/tools.png" ) ); dwCovers->toggleViewAction()->setIcon( QIcon( ":/icons/256/covers.png" ) ); mDonationWidget = new pPaypalButton( this ); mDonationWidget->setBusinessId( "5R924WYXJ6BAW" ); mDonationWidget->setItemName( "QWBFS Manager" ); mDonationWidget->setItemId( "QWBFS-DONATION" ); mDonationWidget->setCurrencyCode( "EUR" ); mActions = new QMenu( this ); mActions->setIcon( aConvertToWBFSFiles->icon() ); mActions->addAction( aConvertToWBFSFiles ); mActions->addAction( aConvertToISOFiles ); mActions->addAction( aRenameDiscsInFolder ); toolBar->insertAction( aAbout, mUpdateChecker->menuAction() ); toolBar->addAction( mActions->menuAction() ); toolBar->addSeparator(); toolBar->addAction( dwTools->toggleViewAction() ); toolBar->addAction( dwCovers->toggleViewAction() ); QWidget* spacerWidget = new QWidget( toolBar ); spacerWidget->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Maximum ) ); toolBar->addWidget( spacerWidget ); toolBar->addWidget( mDonationWidget ); mFoldersModel = new QFileSystemModel( this ); mFoldersModel->setFilter( QDir::Dirs | QDir::NoDotAndDotDot ); mFilesModel = new QFileSystemModel( this ); mFilesModel->setFilter( QDir::Files ); tvFolders->setModel( mFoldersModel ); tvFolders->setColumnHidden( 1, true ); tvFolders->setColumnHidden( 2, true ); tvFolders->setColumnHidden( 3, true ); lvFiles->setModel( mFilesModel ); lvExport->initialize( 0, mCache ); mLastDiscId = -1; pwMainView->setMainView( true ); pwMainView->showHideImportViewButton()->setChecked( false ); connectView( pwMainView ); qmtbInfos->installEventFilter( this ); lWiiTDB->installEventFilter( this ); localeChanged(); connect( mCache, SIGNAL( finished( QNetworkReply* ) ), this, SLOT( networkAccessManager_finished( QNetworkReply* ) ) ); connect( mCache, SIGNAL( cached( const QUrl& ) ), this, SLOT( networkAccessManager_cached( const QUrl& ) ) ); connect( mCache, SIGNAL( error( const QUrl&, const QString& ) ), this, SLOT( networkAccessManager_error( const QUrl&, const QString& ) ) ); connect( mCache, SIGNAL( cacheCleared() ), this, SLOT( networkAccessManager_cacheCleared() ) ); } UIMain::~UIMain() { #if defined( Q_OS_MAC ) delete mMenuBar; #endif //qWarning() << Q_FUNC_INFO; } pNetworkAccessManager* UIMain::cache() const { return mCache; } pQueuedMessageToolBar* UIMain::messageToolBar() const { return qmtbInfos; } bool UIMain::event( QEvent* event ) { switch ( event->type() ) { case QEvent::LocaleChange: localeChanged(); break; default: break; } return QMainWindow::event( event ); } void UIMain::showEvent( QShowEvent* event ) { QMainWindow::showEvent( event ); static bool shown = false; if ( !shown ) { shown = true; loadProperties(); mUpdateChecker->silentCheck(); qmtbInfos->appendMessage( tr( "Welcome to %1, the cross-platform WBFS Manager. Report bugs here, discuss here." ).arg( APPLICATION_NAME ).arg( APPLICATION_REPORT_BUG_URL ).arg( APPLICATION_DISCUSS_URL ) ); } } void UIMain::closeEvent( QCloseEvent* event ) { saveProperties(); QMainWindow::closeEvent( event ); } bool UIMain::eventFilter( QObject* object, QEvent* event ) { if ( object == qmtbInfos ) { if ( event->type() == QEvent::Paint ) { if ( qmtbInfos->queuedMessageWidget()->pendingMessageCount() > 0 ) { QPainter painter( qmtbInfos ); QBrush brush; qmtbInfos->queuedMessageWidget()->currentMessageInformations( 0, &brush, 0 ); painter.setRenderHint( QPainter::Antialiasing ); painter.setPen( QPen( brush.color().darker( 150 ), 0.5 ) ); painter.setBrush( brush ); painter.drawRoundedRect( qmtbInfos->rect().adjusted( 10 -4, -9, -10 +4, -1 ), 9, 9 ); return true; } } } else if ( object == lWiiTDB ) { if ( event->type() == QEvent::MouseButtonPress ) { QDesktopServices::openUrl( lWiiTDB->toolTip() ); } } return QMainWindow::eventFilter( object, event ); } void UIMain::connectView( PartitionWidget* widget ) { connect( widget, SIGNAL( openViewRequested() ), this, SLOT( openViewRequested() ) ); connect( widget, SIGNAL( closeViewRequested() ), this, SLOT( closeViewRequested() ) ); connect( widget, SIGNAL( coverRequested( const QString& ) ), this, SLOT( coverRequested( const QString& ) ) ); } void UIMain::localeChanged() { retranslateUi( this ); mActions->setTitle( tr( "Actions" ) ); } void UIMain::loadProperties( bool firstInit ) { Properties properties( this ); PartitionComboBox::partitionModel()->addPartitions( properties.customPartitions() ); tbReloadDrives->click(); aReloadPartitions->trigger(); mCache->setMaximumCacheSize( properties.cacheDiskSize() ); mCache->setCacheDirectory( properties.cacheUseTemporaryPath() ? properties.temporaryPath() : properties.cacheWorkingPath() ); QNetworkProxy proxy( properties.proxyType() ); proxy.setHostName( properties.proxyServer() ); proxy.setPort( properties.proxyPort() ); proxy.setUser( properties.proxyLogin() ); proxy.setPassword( properties.proxyPassword() ); QNetworkProxy::setApplicationProxy( proxy ); if ( firstInit ) { mUpdateChecker->setLastUpdated( properties.updateLastUpdated() ); mUpdateChecker->setLastChecked( properties.updateLastChecked() ); const QModelIndex index = mFoldersModel->index( properties.selectedPath() ); properties.restoreState( this ); tvFolders->setCurrentIndex( index ); tvFolders->scrollTo( index ); on_tvFolders_activated( index ); pwMainView->setCurrentPartition( properties.selectedPartition() ); } pTranslationManager* translationManager = pTranslationManager::instance(); translationManager->setTranslationsPaths( properties.translationsPaths() ); translationManager->setCurrentLocale( properties.locale().name() ); if ( !properties.localeAccepted() ) { changeLocaleRequested(); } translationManager->reloadTranslations(); foreach ( QWidget* widget, QApplication::topLevelWidgets() ) { widget->setLocale( translationManager->currentLocale() ); } foreach ( ListView* view, findChildren() ) { view->setViewMode( properties.viewMode() ); view->setViewIconType( properties.viewIconType() ); } } void UIMain::saveProperties() { const QModelIndex index = tvFolders->selectionModel()->selectedIndexes().value( 0 ); const QString selectedPath = mFoldersModel->filePath( index ); Properties properties; properties.setUpdateLastUpdated( mUpdateChecker->lastUpdated() ); properties.setUpdateLastChecked( mUpdateChecker->lastChecked() ); properties.setSelectedPath( selectedPath ); properties.setSelectedPartition( pwMainView->currentPartition() ); properties.setCustomPartitions( PartitionComboBox::partitionModel()->customPartitions() ); properties.saveState( this ); } void UIMain::changeLocaleRequested() { pTranslationManager* translationManager = pTranslationManager::instance(); const QString locale = pTranslationDialog::getLocale( translationManager, this ); if ( !locale.isEmpty() ) { Properties properties; properties.setTranslationsPaths( translationManager->translationsPaths() ); properties.setLocaleAccepted( true ); properties.setLocale( QLocale( locale ) ); translationManager->setCurrentLocale( locale ); } } void UIMain::propertiesChanged() { loadProperties( false ); } void UIMain::openViewRequested() { PartitionWidget* pw = new PartitionWidget( this ); pw->setMainView( false ); pw->showHideImportViewButton()->setChecked( false ); connectView( pw ); sViews->addWidget( pw ); } void UIMain::closeViewRequested() { sender()->deleteLater(); } void UIMain::coverRequested( const QString& id ) { mLastDiscId = id; networkAccessManager_cached( QUrl( WIITDB_DOMAIN ) ); QWBFS::WiiTDB::coverDiscPixmap( id, mCache, COVER_DISC_SIZE ); QWBFS::WiiTDB::coverBoxPixmap( id, mCache, COVER_SIZE ); } void UIMain::progress_jobFinished( const QWBFS::Model::Disc& disc ) { lvExport->model()->updateDisc( disc ); } void UIMain::networkAccessManager_finished( QNetworkReply* reply ) { reply->deleteLater(); } void UIMain::networkAccessManager_cached( const QUrl& url ) { if ( !url.toString().startsWith( WIITDB_DOMAIN, Qt::CaseInsensitive ) && url != QUrl() ) { return; } // update all models const QString id = QFileInfo( url.path() ).baseName(); const QList models = findChildren(); foreach ( QWBFS::Model::DiscModel* model, models ) { const QModelIndex index = model->index( id ); model->setData( index, QVariant(), Qt::DecorationRole ); } lCDCover->setPixmap( QWBFS::WiiTDB::coverDiscPixmap( mLastDiscId, mCache, COVER_DISC_SIZE ) ); lCover->setPixmap( QWBFS::WiiTDB::coverBoxPixmap( mLastDiscId, mCache, COVER_SIZE ) ); } void UIMain::networkAccessManager_error( const QUrl& url, const QString& message ) { if ( !url.toString().startsWith( WIITDB_DOMAIN, Qt::CaseInsensitive ) ) { return; } const QString id = QFileInfo( url.path() ).baseName(); switch ( QWBFS::WiiTDB::urlCover( url ) ) { case QWBFS::WiiTDB::CoverDisc: { const QUrl enUrl = QWBFS::WiiTDB::coverUrl( QWBFS::WiiTDB::CoverDisc, id, "EN" ); // request english if ( url != enUrl ) { mCache->get( QNetworkRequest( enUrl ) ); } // or custom disk else { mCache->get( QNetworkRequest( QWBFS::WiiTDB::coverUrl( QWBFS::WiiTDB::CoverDiscCustom, id ) ) ); } return; } case QWBFS::WiiTDB::CoverDiscCustom: { const QUrl enUrl = QWBFS::WiiTDB::coverUrl( QWBFS::WiiTDB::CoverDiscCustom, id, "EN" ); // request english if ( url != enUrl ) { mCache->get( QNetworkRequest( enUrl ) ); return; } break; } case QWBFS::WiiTDB::Cover: { const QUrl enUrl = QWBFS::WiiTDB::coverUrl( QWBFS::WiiTDB::Cover, id, "EN" ); // request english if ( url != enUrl ) { mCache->get( QNetworkRequest( enUrl ) ); return; } break; } case QWBFS::WiiTDB::CoverHQ: case QWBFS::WiiTDB::Cover3D: case QWBFS::WiiTDB::CoverFull: case QWBFS::WiiTDB::CoverInvalid: break; } qmtbInfos->appendMessage( message ); } void UIMain::networkAccessManager_cacheCleared() { networkAccessManager_cached( QUrl() ); } void UIMain::on_aReloadPartitions_triggered() { PartitionComboBox::partitionModel()->update(); if ( PartitionComboBox::partitionModel()->rowCount() == 0 ) { qmtbInfos->appendMessage( tr( "I don't know how to list partition for this platform.\n" "You will have to set the correct partition path yourself for mounting partitions." ) ); } } void UIMain::on_aQuit_triggered() { close(); } void UIMain::on_aAbout_triggered() { UIAbout* about = new UIAbout( this ); about->open(); } void UIMain::on_aProperties_triggered() { saveProperties(); PropertiesDialog* dlg = new PropertiesDialog( this ); connect( dlg, SIGNAL( propertiesChanged() ), this, SLOT( propertiesChanged() ) ); dlg->open(); } void UIMain::on_aConvertToWBFSFiles_triggered() { const QStringList filePaths = QFileDialog::getOpenFileNames( this, tr( "Choose ISO files to convert" ), QString::null, tr( "ISO Files (*.iso)" ) ); if ( filePaths.isEmpty() ) { return; } ProgressDialog* dlg = new ProgressDialog( this ); WorkerThread::Work work; work.task = WorkerThread::ConvertWBFS; foreach ( const QString& filePath, filePaths ) { work.discs << QWBFS::Model::Disc( filePath ); } work.target = QFileInfo( filePaths.first() ).absolutePath(); work.window = dlg; dlg->setWork( work ); } void UIMain::on_aConvertToISOFiles_triggered() { const QStringList filePaths = QFileDialog::getOpenFileNames( this, tr( "Choose WBFS files to convert" ), QString::null, tr( "WBFS Files (*.wbfs)" ) ); if ( filePaths.isEmpty() ) { return; } ProgressDialog* dlg = new ProgressDialog( this ); WorkerThread::Work work; work.task = WorkerThread::ConvertISO; foreach ( const QString& filePath, filePaths ) { work.discs << QWBFS::Model::Disc( filePath ); } work.target = QFileInfo( filePaths.first() ).absolutePath(); work.window = dlg; dlg->setWork( work ); } void UIMain::on_aRenameDiscsInFolder_triggered() { const QString path = QFileDialog::getExistingDirectory( this, tr( "Choose the folder to scan for ISOs/WBFSs files" ) ); if ( path.isEmpty() ) { return; } /* %title = Game Title %id = Game ID %suffix = File Suffix */ const QStringList patterns = QStringList() << "%id.%suffix" // GAMEID.wbfs << "%title [%id].%suffix" // Game Title [GAMEID].wbfs << "%id_%title/%id.%suffix" // GAMEID_Game Title/GAMEID.wbfs << "%title/%id.%suffix" // Game Title/GAMEID.wbfs << "%title[%id]/%id.%suffix" // Game Title[GAMEID]/GAMEID.wbfs ; const QString text = tr( "Choose the pattern to apply:\n%1\n%2\n%3\n" ) .arg( tr( "%1 = Game Title" ).arg( "%title" ) ) .arg( tr( "%1 = Game Id" ).arg( "%id" ) ) .arg( tr( "%1 = File Suffix" ).arg( "%suffix" ) ) ; bool ok; const QString pattern = QInputDialog::getItem( this, QString::null, text, patterns, 0, true, &ok ); if ( !ok || pattern.isEmpty() ) { return; } ProgressDialog* dlg = new ProgressDialog( this ); WorkerThread::Work work; work.task = WorkerThread::RenameAll; work.pattern = pattern; work.target = path; work.window = dlg; dlg->setWork( work ); } void UIMain::on_tvFolders_activated( const QModelIndex& index ) { const QString filePath = mFoldersModel->filePath( index ); mFilesModel->setRootPath( filePath ); lvFiles->setRootIndex( mFilesModel->index( filePath ) ); } void UIMain::on_tbReloadDrives_clicked() { const QString drive = cbDrives->currentText(); QFileInfoList drives = QDir::drives(); QStringList pathsToScan; cbDrives->clear(); #if defined( Q_OS_WIN ) #elif defined( Q_OS_MAC ) pathsToScan << "/Volumes"; #else pathsToScan << "/media" << "/mnt"; #endif foreach ( const QString& path, pathsToScan ) { foreach ( const QFileInfo& fi, QDir( path ).entryInfoList( QDir::Dirs | QDir::NoDotAndDotDot ) ) { if ( !drives.contains( fi ) ) { drives << fi; } } } foreach ( const QFileInfo& fi, drives ) { cbDrives->addItem( fi.absoluteFilePath() ); } if ( !drive.isEmpty() ) { cbDrives->setCurrentIndex( cbDrives->findText( drive ) ); } } void UIMain::on_cbDrives_currentIndexChanged( const QString& text ) { mFoldersModel->setRootPath( text ); tvFolders->setRootIndex( mFoldersModel->index( text ) ); on_tvFolders_activated( tvFolders->rootIndex() ); } void UIMain::on_tbClearExport_clicked() { lvExport->model()->clear(); } void UIMain::on_tbRemoveExport_clicked() { lvExport->model()->removeSelection( lvExport->selectionModel()->selection() ); } void UIMain::on_tbExport_clicked() { if ( lvExport->model()->rowCount() == 0 ) { return; } const QString path = QFileDialog::getExistingDirectory( this, tr( "Choose a folder to export the discs" ), QString::null ); if ( path.isEmpty() ) { return; } WorkerThread::Work work; work.discs = lvExport->model()->discs(); work.target = path; const QMessageBox::StandardButtons buttons = QMessageBox::Yes | QMessageBox::Ok; const QMessageBox::StandardButton defaultButton = QMessageBox::Ok; QMessageBox msgBox( this ); msgBox.setIcon( QMessageBox::Question ); msgBox.setText( tr( "Which format do you want to use to export the discs ?" ) ); msgBox.setStandardButtons( buttons ); msgBox.button( QMessageBox::Yes )->setText( "ISO" ); msgBox.button( QMessageBox::Ok )->setText( "WBFS" ); msgBox.setEscapeButton( 0 ); msgBox.setDefaultButton( defaultButton ); switch ( msgBox.exec() ) { case QMessageBox::Yes: work.task = WorkerThread::ExportISO; break; case QMessageBox::Ok: work.task = WorkerThread::ExportWBFS; break; default: Q_ASSERT( 0 ); return; } ProgressDialog* dlg = new ProgressDialog( this ); connect( dlg, SIGNAL( jobFinished( const QWBFS::Model::Disc& ) ), this, SLOT( progress_jobFinished( const QWBFS::Model::Disc& ) ) ); work.window = dlg; dlg->setWork( work ); } ./qwbfsmanager-1.2.1-src/qwbfs/src/CoverFlowView.cpp0000644000175000017520000002363511543625302021706 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : CoverFlowView.cpp ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #include "CoverFlowView.h" #include "models/DiscModel.h" #include #include #include #include #include #include #include #define COVERFLOWVIEW_ITEM_SIZE QSize( 180, 240 ) CoverFlowView::CoverFlowView( QWidget* parent ) : PictureFlow( parent ) { mScrollBar = new QScrollBar( Qt::Horizontal, this ); mModel = 0; mColumn = -1; mDisplayTextColumn = -1; mTimer = new QTimer( this ); mTimer->setSingleShot( true ); mScrollBar->setSingleStep( 1 ); mScrollBar->setPageStep( 1 ); setBackgroundColor( palette().color( backgroundRole() ).darker() ); connect( mTimer, SIGNAL( timeout() ), this, SLOT( delayedResizeEvent() ) ); connect( mScrollBar, SIGNAL( valueChanged( int ) ), this, SLOT( showSlide( int ) ) ); connect( this, SIGNAL( centerIndexChanged( int ) ), this, SLOT( updateScrollBarState() ) ); } CoverFlowView::~CoverFlowView() { } bool CoverFlowView::event( QEvent* event ) { switch ( event->type() ) { case QEvent::ToolTip: case QEvent::WhatsThis: { const QHelpEvent* he = static_cast( event ); const QString text = modelIndex( centerIndex(), mColumn ).data( Qt::ToolTipRole ).toString(); if ( !text.isEmpty() ) { if ( event->type() == QEvent::ToolTip ) { QToolTip::showText( he->globalPos(), text, this ); } else if ( event->type() == QEvent::ToolTip ) { QWhatsThis::showText( he->globalPos(), text, this ); } } event->accept(); return true; } default: break; } return PictureFlow::event( event ); } void CoverFlowView::resizeEvent( QResizeEvent* event ) { PictureFlow::resizeEvent( event ); const int sbMargin = 10; const int sbHeight = 16; QRect sbRect = QRect( QPoint( sbMargin, height() -sbHeight -sbMargin ), QSize( width() -( sbMargin *2 ), sbHeight ) ); mScrollBar->setGeometry( sbRect ); mTimer->start( 500 ); } void CoverFlowView::paintEvent( QPaintEvent* event ) { PictureFlow::paintEvent( event ); QPainter painter( this ); const QString text = modelIndex( centerIndex(), mDisplayTextColumn ).data( Qt::DisplayRole ).toString(); const int flags = Qt::AlignCenter | Qt::TextWordWrap; QRect rect = QRect( QPoint(), QSize( width(), 40 ) ); rect.moveBottom( mScrollBar->pos().y() -5 ); painter.drawText( rect, flags, text ); } void CoverFlowView::_q_dataChanged( const QModelIndex& topLeft, const QModelIndex& bottomRight ) { if ( topLeft.parent() != mRootIndex || ( mColumn < topLeft.column() && mColumn > bottomRight.column() ) ) { return; } const int start = topLeft.row(); const int end = bottomRight.row(); for ( int i = start; i < end +1; i++ ) { setSlide( i, pixmap( i ) ); } } void CoverFlowView::_q_layoutChanged() { initialize(); } void CoverFlowView::_q_modelReset() { initialize(); } void CoverFlowView::_q_rowsInserted( const QModelIndex& parent, int start, int end ) { if ( parent == mRootIndex ) { for ( int i = start; i < end +1; i++ ) { insertSlide( i, pixmap( i ) ); } setCenterIndex( start ); updateScrollBarState(); } } void CoverFlowView::_q_rowsMoved( const QModelIndex& sourceParent, int sourceStart, int sourceEnd, const QModelIndex& destinationParent, int destinationRow ) { Q_UNUSED( sourceParent ); Q_UNUSED( sourceStart ); Q_UNUSED( sourceEnd ); Q_UNUSED( destinationParent ); Q_UNUSED( destinationRow ); qWarning() << Q_FUNC_INFO; } void CoverFlowView::_q_rowsRemoved( const QModelIndex& parent, int start, int end ) { if ( parent == mRootIndex ) { for ( int i = end; i >= start; i-- ) { removeSlide( i ); } updateScrollBarState(); } } void CoverFlowView::delayedResizeEvent() { const qreal height = (qreal)this->height() *(qreal)0.50; const qreal factor = 180.0 /240.0; QSize size = QSize( height *factor, height ); setSlideSize( size ); initialize( centerIndex() ); } void CoverFlowView::initialize( int index ) { clear(); if ( mModel ) { for ( int i = 0; i < mModel->rowCount(); i++ ) { addSlide( pixmap( i ) ); } } setCenterIndex( index ); updateScrollBarState(); } void CoverFlowView::updateScrollBarState() { mScrollBar->setMinimum( 0 ); mScrollBar->setMaximum( mModel ? mModel->rowCount() -1 : 0 ); if ( animatorStep() == 0 ) { mScrollBar->setValue( centerIndex() ); } emit centerIndexChanged( modelIndex( centerIndex() ) ); } void CoverFlowView::preload() { if ( !mModel ) { return; } // try to load only few images on the left and right side // i.e. all visible ones plus some extra #define COUNT 10 int indexes[ 2 *COUNT +1 ] ; int center = centerIndex(); indexes[ 0 ] = center; for ( int j = 0; j < COUNT; j++ ) { indexes[ j *2 +1 ] = center +j +1; indexes[ j *2 +2 ] = center -j -1; } for ( int c = 0; c < 2 *COUNT +1; c++ ) { int i = indexes[ c ]; if ( ( i >= 0 ) && ( i < slideCount() ) ) { if ( slide( i ).isNull() ) { // schedule thumbnail loading Q_UNUSED( pixmap( i ) ); } } } } void CoverFlowView::setModel( QAbstractItemModel* model ) { if ( mModel == model ) { return; } if ( mModel ) { disconnect( this, SIGNAL( centerIndexChanged( int ) ), this, SLOT( preload() ) ); disconnect( mModel, SIGNAL( dataChanged( const QModelIndex&, const QModelIndex& ) ), this, SLOT( _q_dataChanged( const QModelIndex&, const QModelIndex& ) ) ); disconnect( mModel, SIGNAL( layoutChanged() ), this, SLOT( _q_layoutChanged() ) ); disconnect( mModel, SIGNAL( modelReset() ), this, SLOT( _q_modelReset() ) ); disconnect( mModel, SIGNAL( rowsInserted( const QModelIndex&, int, int ) ), this, SLOT( _q_rowsInserted( const QModelIndex&, int, int ) ) ); disconnect( mModel, SIGNAL( rowsMoved( const QModelIndex&, int, int, const QModelIndex&, int ) ), this, SLOT( _q_rowsMoved( const QModelIndex&, int, int, const QModelIndex&, int ) ) ); disconnect( mModel, SIGNAL( rowsRemoved( const QModelIndex&, int, int ) ), this, SLOT( _q_rowsRemoved( const QModelIndex&, int, int ) ) ); mModel = 0; } mModel = model; mColumn = -1; mDisplayTextColumn = -1; if ( mModel ) { connect( this, SIGNAL( centerIndexChanged( int ) ), this, SLOT( preload() ) ); connect( mModel, SIGNAL( dataChanged( const QModelIndex&, const QModelIndex& ) ), this, SLOT( _q_dataChanged( const QModelIndex&, const QModelIndex& ) ) ); connect( mModel, SIGNAL( layoutChanged() ), this, SLOT( _q_layoutChanged() ) ); connect( mModel, SIGNAL( modelReset() ), this, SLOT( _q_modelReset() ) ); connect( mModel, SIGNAL( rowsInserted( const QModelIndex&, int, int ) ), this, SLOT( _q_rowsInserted( const QModelIndex&, int, int ) ) ); connect( mModel, SIGNAL( rowsMoved( const QModelIndex&, int, int, const QModelIndex&, int ) ), this, SLOT( _q_rowsMoved( const QModelIndex&, int, int, const QModelIndex&, int ) ) ); connect( mModel, SIGNAL( rowsRemoved( const QModelIndex&, int, int ) ), this, SLOT( _q_rowsRemoved( const QModelIndex&, int, int ) ) ); } } QAbstractItemModel* CoverFlowView::model() const { return mModel; } void CoverFlowView::setColumn( int column ) { if ( !mModel ) { return; } const int min = mModel->columnCount() > 0 ? 0 : -1; const int max = mModel->columnCount() > 0 ? mModel->columnCount() : -1; mColumn = qBound( min, column, max ); initialize(); } int CoverFlowView::column() const { return mColumn; } void CoverFlowView::setDisplayTextColumn( int column ) { if ( !mModel ) { return; } const int min = mModel->columnCount() > 0 ? 0 : -1; const int max = mModel->columnCount() > 0 ? mModel->columnCount() : -1; mDisplayTextColumn = qBound( min, column, max ); } int CoverFlowView::displayTextColumn() const { return mDisplayTextColumn; } QModelIndex CoverFlowView::modelIndex( int index, int column ) const { return mModel ? mModel->index( index, column == -1 ? mColumn : column, mRootIndex ) : QModelIndex(); } QPixmap CoverFlowView::pixmap( int _index ) const { const QModelIndex index = modelIndex( _index ); const QWBFS::Model::DiscModel* model = qobject_cast( mModel ); const QWBFS::Model::Disc disc = model ? model->disc( index ) : QWBFS::Model::Disc(); return model ? model->coverPixmap( disc.id, slideSize(), true ) : QPixmap(); } ./qwbfsmanager-1.2.1-src/qwbfs/src/PartitionComboBox.h0000644000175000017520000000457711543625302022220 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : PartitionComboBox.h ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #ifndef PARTITIONCOMBOBOX_H #define PARTITIONCOMBOBOX_H #include class pPartitionModel; class QToolButton; class PartitionComboBox : public QComboBox { Q_OBJECT public: PartitionComboBox( QWidget* parent = 0 ); virtual ~PartitionComboBox(); static pPartitionModel* partitionModel(); protected slots: void modelChanged(); void addPartition(); protected: QToolButton* mButton; virtual bool event( QEvent* event ); virtual void paintEvent( QPaintEvent* event ); }; #endif // PARTITIONCOMBOBOX_H ./qwbfsmanager-1.2.1-src/qwbfs/src/UIMain.ui0000644000175000017520000003563111545577364020141 0ustar pasnoxpasnox UIMain 0 0 619 394 36 36 Qt::ToolButtonTextUnderIcon true true Qt::Horizontal QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetMovable Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea Tools 1 0 :/icons/256/tree.png:/icons/256/tree.png File System Reload the mount points :/icons/256/reload.png:/icons/256/reload.png 20 20 true Qt::Vertical QAbstractItemView::NoEditTriggers true true QAbstractItemView::NoEditTriggers true QAbstractItemView::DragOnly QAbstractItemView::ExtendedSelection true :/icons/256/export.png:/icons/256/export.png Export Qt::Horizontal 40 20 Clear the list :/icons/256/clear.png:/icons/256/clear.png 20 20 true Remove the selected items from the list :/icons/256/remove.png:/icons/256/remove.png 20 20 true Process the export list :/icons/256/export.png:/icons/256/export.png 20 20 true QAbstractItemView::NoEditTriggers false QAbstractItemView::DropOnly Qt::CopyAction QAbstractItemView::ExtendedSelection QAbstractItemView::ScrollPerPixel QAbstractItemView::ScrollPerPixel true Main ToolBar false false TopToolBarArea false 184 192 184 524287 QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetMovable Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea Covers 2 Qt::AlignCenter true Qt::Horizontal 0 60 16777215 60 PointingHandCursor http://wiitdb.com QLabel { background-image: url(:/wii/wiitdb.png); background-repeat: no-repeat; background-position:center bottom; font: bold 13px "Arial"; } Covers By Qt::AlignHCenter|Qt::AlignTop true Qt::Horizontal Qt::AlignCenter true :/icons/256/reload.png:/icons/256/reload.png Reload Reload the partitions :/icons/256/about.png:/icons/256/about.png About... QAction::AboutRole :/icons/256/quit.png:/icons/256/quit.png Quit... QAction::QuitRole :/icons/256/properties.png:/icons/256/properties.png Properties QAction::PreferencesRole :/icons/128/iso-to-wbfs.png:/icons/128/iso-to-wbfs.png Convert ISO Files :/icons/128/wbfs-to-iso.png:/icons/128/wbfs-to-iso.png Convert WBFS Files :/icons/256/read-partition.png:/icons/256/read-partition.png Rename Discs in folder PartitionWidget QWidget
PartitionWidget.h
1
pQueuedMessageToolBar QToolBar
FreshGui/pQueuedMessageToolBar
pDockWidget QDockWidget
FreshGui/pDockWidget
1
ListView QListView
ListView.h
./qwbfsmanager-1.2.1-src/qwbfs/src/PropertiesDialog.h0000644000175000017520000000472011410720766022063 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : PropertiesDialog.h ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #ifndef PROPERTIESDIALOG_H #define PROPERTIESDIALOG_H #include "ui_PropertiesDialog.h" class Properties; class PropertiesDialog : public QDialog, public Ui::PropertiesDialog { Q_OBJECT public: PropertiesDialog( QWidget* parent = 0 ); virtual ~PropertiesDialog(); virtual bool event( QEvent* event ); protected: Properties* mProperties; void localeChanged(); protected slots: void on_tbChangeLocale_clicked(); void on_tbCachePath_clicked(); void on_cbProxyType_currentIndexChanged( int index ); virtual void accept(); signals: void propertiesChanged(); }; #endif // PROPERTIESDIALOG_H ./qwbfsmanager-1.2.1-src/qwbfs/src/PartitionWidget.ui0000644000175000017520000003402511537767050022122 0ustar pasnoxpasnox PartitionWidget 0 0 272 447 0 Set the current partition Load/Reload the discs from the current partition :/icons/256/read-partition.png:/icons/256/read-partition.png 20 20 true Format the partition :/icons/256/format.png:/icons/256/format.png 20 20 true Add a new view :/icons/256/add.png:/icons/256/add.png 20 20 true Remove the view :/icons/256/remove.png:/icons/256/remove.png 20 20 true Qt::Vertical false WBFS View Qt::Horizontal 40 20 Remove the selected discs :/icons/256/remove.png:/icons/256/remove.png 20 20 true Rename the selected disc :/icons/256/rename.png:/icons/256/rename.png 20 20 true Show/Hide Import View :/icons/256/detailed.png:/icons/256/detailed.png 20 20 true true true QTabWidget::South 0 List 0 0 QAbstractItemView::NoEditTriggers false true QAbstractItemView::ExtendedSelection QAbstractItemView::ScrollPerPixel QAbstractItemView::ScrollPerPixel true CoverFlow 0 0 QFrame::StyledPanel QFrame::Raised 0 0 Import View Qt::Horizontal 40 20 Clear the discs :/icons/256/clear.png:/icons/256/clear.png 20 20 true Remove the selected discs :/icons/256/remove.png:/icons/256/remove.png 20 20 true Import the discs to the WBFS partition :/icons/256/import.png:/icons/256/import.png 20 20 true QAbstractItemView::NoEditTriggers false QAbstractItemView::ExtendedSelection QAbstractItemView::ScrollPerPixel QAbstractItemView::ScrollPerPixel true Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter ListView QListView
ListView.h
Gauge QWidget
Gauge.h
1
CoverFlowView QWidget
CoverFlowView.h
1
PartitionComboBox QComboBox
PartitionComboBox.h
tbShowHideImportView toggled(bool) fImport setVisible(bool) 258 68 73 241
./qwbfsmanager-1.2.1-src/qwbfs/src/PartitionWidget.h0000644000175000017520000000702511541427467021734 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : PartitionWidget.h ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #ifndef PARTITIONWIDGET_H #define PARTITIONWIDGET_H #include "ui_PartitionWidget.h" class UIMain; namespace QWBFS { class Driver; namespace Model { struct Disc; class DiscModel; }; // Model }; // QWBFS class PartitionWidget : public QWidget, public Ui::PartitionWidget { Q_OBJECT public: PartitionWidget( QWidget* parent = 0 ); virtual ~PartitionWidget(); virtual bool event( QEvent* event ); const QWBFS::Driver* driver() const; QWBFS::Model::DiscModel* discModel() const; QWBFS::Model::DiscModel* importModel() const; QToolButton* showHideImportViewButton() const; QString currentPartition() const; void setMainView( bool main ); public slots: void setCurrentPartition( const QString& partition ); void showError( const QString& error ); void showError( int error ); protected: QWBFS::Driver* mDriver; virtual void dragEnterEvent( QDragEnterEvent* event ); virtual void dropEvent( QDropEvent* event ); UIMain* mainWindow() const; void localeChanged(); protected slots: void models_countChanged(); void views_selectionChanged(); void coverFlow_centerIndexChanged( const QModelIndex& index ); void progress_jobFinished( const QWBFS::Model::Disc& disc ); void progress_finished(); void on_cbPartitions_currentIndexChanged( int index ); void on_tbLoad_clicked(); void on_tbFormat_clicked(); void on_tbOpen_clicked(); void on_tbClose_clicked(); void on_tbRemoveDiscs_clicked(); void on_tbRenameDisc_clicked(); void on_tbClearImport_clicked(); void on_tbRemoveImport_clicked(); void on_tbImport_clicked(); signals: void openViewRequested(); void closeViewRequested(); void coverRequested( const QString& id ); }; #endif // PARTITIONWIDGET_H ./qwbfsmanager-1.2.1-src/qwbfs/src/ProgressDialog.ui0000644000175000017520000000507311362160431021714 0ustar pasnoxpasnox ProgressDialog 0 0 400 238 0 0 0 0 Global progression... Details. true true false true 40 QDialogButtonBox::Cancel|QDialogButtonBox::Ok cbDetails toggled(bool) pteErrors setVisible(bool) 55 105 47 130 ./qwbfsmanager-1.2.1-src/qwbfs/src/ProgressDialog.cpp0000644000175000017520000001515611505775715022104 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : ProgressDialog.cpp ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #include "ProgressDialog.h" #include #include #include #include ProgressDialog::ProgressDialog( QWidget* parent ) : QDialog( parent ) { setupUi( this ); setAttribute( Qt::WA_DeleteOnClose ); cbDetails->setChecked( false ); dbbButtons->button( QDialogButtonBox::Ok )->setEnabled( false ); dbbButtons->button( QDialogButtonBox::Cancel )->setEnabled( false ); mThread = new WorkerThread( this ); doConnections(); localeChanged(); } ProgressDialog::~ProgressDialog() { //qWarning() << Q_FUNC_INFO; } bool ProgressDialog::event( QEvent* event ) { switch ( event->type() ) { case QEvent::LocaleChange: localeChanged(); break; default: break; } return QDialog::event( event ); } void ProgressDialog::setWork( const WorkerThread::Work& work ) { open(); if ( !mThread->setWork( work ) ) { deleteLater(); } } void ProgressDialog::done( int r ) { if ( mThread->isRunning() ) { return; } QDialog::done( r ); } void ProgressDialog::closeEvent( QCloseEvent* event ) { if ( mThread->isRunning() ) { event->ignore(); return; } QDialog::closeEvent( event ); } void ProgressDialog::localeChanged() { retranslateUi( this ); } void ProgressDialog::doConnections() { connect( dbbButtons->button( QDialogButtonBox::Ok ), SIGNAL( clicked() ), this, SLOT( close() ) ); connect( dbbButtons->button( QDialogButtonBox::Cancel ), SIGNAL( clicked() ), mThread, SLOT( stop() ) ); connect( mThread, SIGNAL( started() ), this, SLOT( thread_started() ) ); connect( mThread, SIGNAL( message( const QString& ) ), this, SLOT( thread_message( const QString& ) ) ); connect( mThread, SIGNAL( log( const QString& ) ), this, SLOT( thread_log( const QString& ) ) ); connect( mThread, SIGNAL( jobFinished( const QWBFS::Model::Disc& ) ), this, SLOT( thread_jobFinished( const QWBFS::Model::Disc& ) ) ); connect( mThread, SIGNAL( currentProgressChanged( int, int, const QTime& ) ), this, SLOT( thread_currentProgressChanged( int, int, const QTime& ) ) ); connect( mThread, SIGNAL( globalProgressChanged( int, int ) ), this, SLOT( thread_globalProgressChanged( int, int ) ) ); connect( mThread, SIGNAL( canceled() ), this, SLOT( thread_canceled() ) ); connect( mThread, SIGNAL( finished() ), this, SLOT( thread_finished() ) ); } void ProgressDialog::thread_started() { mElapsed.restart(); dbbButtons->button( QDialogButtonBox::Cancel )->setEnabled( true ); } void ProgressDialog::thread_message( const QString& text ) { lCurrentInformations->setText( text ); pteErrors->appendPlainText( text ); } void ProgressDialog::thread_log( const QString& text ) { pteErrors->appendPlainText( text ); if ( !cbDetails->isChecked() ) { cbDetails->toggle(); } } void ProgressDialog::thread_jobFinished( const QWBFS::Model::Disc& disc ) { const QString text = QString( "%1 '%2': %3 (%4)" ) .arg( WorkerThread::taskToLabel( mThread->task() ) ) .arg( disc.baseName() ) .arg( QWBFS::Driver::stateToString( QWBFS::Driver::State( disc.state ) ) ) .arg( QWBFS::Driver::errorToString( QWBFS::Driver::Error( disc.error ) ) ); pteErrors->appendPlainText( text ); if ( !cbDetails->isChecked() && disc.hasError() ) { cbDetails->toggle(); } emit jobFinished( disc ); } void ProgressDialog::thread_currentProgressChanged( int value, int maximum, const QTime& remaining ) { pbCurrent->setMaximum( maximum ); pbCurrent->setValue( value ); lCurrentRemaining->setText( tr( "Time remaining: %1" ).arg( remaining.toString() ) ); } void ProgressDialog::thread_globalProgressChanged( int value, int maximum ) { pbGlobal->setMaximum( maximum ); pbGlobal->setValue( value ); } void ProgressDialog::thread_canceled() { lGlobalInformations->setText( tr( "Cancel requested, the process will stop after the current operation." ) ); } void ProgressDialog::thread_finished() { QTime time( 0, 0, 0, 0 ); time = time.addMSecs( mElapsed.elapsed() ); lCurrentInformations->setText( "Tasks finished." ); lCurrentRemaining->clear(); lGlobalInformations->setText( tr( "The thread finished in %1" ).arg( time.toString() ) ); dbbButtons->button( QDialogButtonBox::Ok )->setEnabled( true ); dbbButtons->button( QDialogButtonBox::Cancel )->setEnabled( false ); emit finished(); } void ProgressDialog::on_cbDetails_toggled() { QTimer::singleShot( 0, this, SLOT( updateSpace() ) ); } void ProgressDialog::updateSpace() { QWidget* widget = parentWidget(); QRect rect = geometry(); if ( !widget ) { widget = QApplication::desktop(); } widget = widget->window(); if ( !cbDetails->isChecked() ) { rect.setHeight( minimumSizeHint().height() ); } rect.moveCenter( widget->mapToGlobal( widget->rect().center() ) ); #if defined( Q_OS_MAC ) rect.moveTop( widget->mapToGlobal( widget->rect().topLeft() ).y() ); #endif resize( rect.size() ); move( rect.topLeft() ); } ./qwbfsmanager-1.2.1-src/qwbfs/src/UIAbout.cpp0000644000175000017520000000640711545621563020462 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : UIAbout.cpp ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #include "UIAbout.h" #include "main.h" #include #include UIAbout::UIAbout( QWidget* parent ) : QDialog( parent ) { setAttribute( Qt::WA_DeleteOnClose ); setupUi( this ); #if !defined( Q_OS_MAC ) const QList widgets = QList() << lName << lVersion << lDescription << lCopyrights << lDomain << pteLicense << lWarning << lThirdParty ; foreach ( QWidget* widget, widgets ) { QFont font = widget->font(); font.setPointSize( font.pointSize() -2 ); widget->setFont( font ); } #endif foreach ( QScrollBar* sb, twPages->findChildren() ) { sb->setAttribute( Qt::WA_MacMiniSize ); } lName->setText( APPLICATION_NAME ); lCopyrights->setText( APPLICATION_COPYRIGHTS ); lDomain->setText( QString( "http://%1" ).arg( APPLICATION_DOMAIN ) ); localeChanged(); QFile file( ":/files/GPL-2" ); file.open( QIODevice::ReadOnly ); pteLicense->setPlainText( QString::fromUtf8( file.readAll() ) ); } bool UIAbout::event( QEvent* event ) { switch ( event->type() ) { case QEvent::LocaleChange: localeChanged(); break; default: break; } return QDialog::event( event ); } void UIAbout::localeChanged() { retranslateUi( this ); lVersion->setText( tr( "Version %1" ).arg( APPLICATION_VERSION_STR ) ); lDescription->setText( QObject::tr( APPLICATION_DESCRIPTION ).append( "." ) ); } ./qwbfsmanager-1.2.1-src/qwbfs/src/main.h0000644000175000017520000000467411410720766017543 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : main.h ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #ifndef MAIN_H #define MAIN_H #define APPLICATION_NAME _APPLICATION_NAME #define APPLICATION_VERSION _APPLICATION_VERSION #define APPLICATION_VERSION_STR _APPLICATION_VERSION_STR #define APPLICATION_COPYRIGHTS _APPLICATION_COPYRIGHTS #define APPLICATION_DESCRIPTION _APPLICATION_DESCRIPTION #define APPLICATION_DOMAIN _APPLICATION_DOMAIN #define APPLICATION_ORGANIZATION _APPLICATION_ORGANIZATION #define APPLICATION_DOWNLOADS_FEED _APPLICATION_DOWNLOADS_FEED #define APPLICATION_REPORT_BUG_URL _APPLICATION_REPORT_BUG_URL #define APPLICATION_DISCUSS_URL _APPLICATION_DISCUSS_URL #endif // MAIN_H ./qwbfsmanager-1.2.1-src/qwbfs/src/PartitionWidget.cpp0000644000175000017520000002653011541427467022271 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : PartitionWidget.cpp ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #include "PartitionWidget.h" #include "qwbfsdriver/Driver.h" #include "models/DiscModel.h" #include "Properties.h" #include "ProgressDialog.h" #include "UIMain.h" #include #include "models/pPartitionModel.h" #include #include #include #include PartitionWidget::PartitionWidget( QWidget* parent ) : QWidget( parent ) { Q_ASSERT( parent ); const UIMain* window = qobject_cast( parent->window() ); const Properties properties( this ); setupUi( this ); setAcceptDrops( true ); mDriver = new QWBFS::Driver( this ); lvDiscs->initialize( mDriver, window->cache() ); lvDiscs->setViewMode( properties.viewMode() ); lvDiscs->setViewIconType( properties.viewIconType() ); cfvDiscs->setModel( lvDiscs->model() ); cfvDiscs->setColumn( 0 ); cfvDiscs->setDisplayTextColumn( 2 ); lvImport->initialize( mDriver, window->cache() ); lvImport->setViewMode( properties.viewMode() ); lvImport->setViewIconType( properties.viewIconType() ); QPalette cfvPal = cfvDiscs->palette(); cfvPal.setColor( QPalette::WindowText, QColor( 255, 255, 255 ) ); cfvDiscs->setPalette( cfvPal ); QFont cfvFont = cfvDiscs->font(); cfvFont.setBold( true ); cfvFont.setPixelSize( 18 ); cfvDiscs->setFont( cfvFont ); sViews->setSizes( QList() << QWIDGETSIZE_MAX << fImport->minimumSizeHint().height() ); localeChanged(); connect( lvDiscs->model(), SIGNAL( countChanged( int ) ), this, SLOT( models_countChanged() ) ); connect( lvImport->model(), SIGNAL( countChanged( int ) ), this, SLOT( models_countChanged() ) ); connect( cfvDiscs, SIGNAL( centerIndexChanged( const QModelIndex& ) ), this, SLOT( coverFlow_centerIndexChanged( const QModelIndex& ) ) ); connect( lvDiscs->selectionModel(), SIGNAL( selectionChanged( const QItemSelection&, const QItemSelection& ) ), this, SLOT( views_selectionChanged() ) ); connect( lvImport->selectionModel(), SIGNAL( selectionChanged( const QItemSelection&, const QItemSelection& ) ), this, SLOT( views_selectionChanged() ) ); } PartitionWidget::~PartitionWidget() { mDriver->close(); } bool PartitionWidget::event( QEvent* event ) { switch ( event->type() ) { case QEvent::LocaleChange: localeChanged(); break; default: break; } return QWidget::event( event ); } const QWBFS::Driver* PartitionWidget::driver() const { return mDriver; } QWBFS::Model::DiscModel* PartitionWidget::discModel() const { return lvDiscs->model(); } QWBFS::Model::DiscModel* PartitionWidget::importModel() const { return lvImport->model(); } QToolButton* PartitionWidget::showHideImportViewButton() const { return tbShowHideImportView; } QString PartitionWidget::currentPartition() const { return cbPartitions->itemText( cbPartitions->currentIndex() ); } void PartitionWidget::setMainView( bool main ) { tbOpen->setVisible( main ); tbClose->setVisible( !main ); } void PartitionWidget::setCurrentPartition( const QString& partition ) { if ( mDriver->partition() != partition || currentPartition() != partition ) { mDriver->setPartition( partition ); cbPartitions->setCurrentIndex( cbPartitions->findText( partition ) ); tbLoad->click(); } } void PartitionWidget::showError( const QString& error ) { mainWindow()->messageToolBar()->appendMessage( error ); } void PartitionWidget::showError( int error ) { showError( QWBFS::Driver::errorToString( QWBFS::Driver::Error( error ) ) ); } void PartitionWidget::dragEnterEvent( QDragEnterEvent* event ) { if ( mDriver->isOpen() && !findChildren().contains( event->source() ) ) { foreach ( const QString& mimeType, importModel()->mimeTypes() ) { if ( event->mimeData()->hasFormat( mimeType ) ) { event->setDropAction( Qt::CopyAction ); event->accept(); return; } } } } void PartitionWidget::dropEvent( QDropEvent* event ) { if ( !fImport->isVisible() ) { tbShowHideImportView->toggle(); } importModel()->dropMimeData( event->mimeData(), event->proposedAction(), -1, -1, QModelIndex() ); event->acceptProposedAction(); } UIMain* PartitionWidget::mainWindow() const { return qobject_cast( window() ); } void PartitionWidget::localeChanged() { retranslateUi( this ); lInformations->setText( tr( "%1 disc(s) on the partition - %2 disc(s) to import." ).arg( discModel()->rowCount() ).arg( importModel()->rowCount() ) ); } void PartitionWidget::models_countChanged() { QWBFS::Partition::Status status; /*const int result = */mDriver->status( status ); gStatus->setSize( status.size ); gStatus->setUsedSize( status.used ); gStatus->setFreeSize( status.free ); gStatus->setTemporarySize( importModel()->size() ); lInformations->setText( tr( "%1 disc(s) on the partition - %2 disc(s) to import." ).arg( discModel()->rowCount() ).arg( importModel()->rowCount() ) ); /*if ( result != QWBFS::Driver::Ok ) { showError( result ); }*/ } void PartitionWidget::views_selectionChanged() { const QItemSelectionModel* sm = qobject_cast( sender() ); const QWBFS::Model::DiscModel* model = qobject_cast( sm->model() ); const QModelIndexList indexes = sm->selectedIndexes(); emit coverRequested( indexes.isEmpty() ? QString::null : model->discId( indexes.last() ) ); } void PartitionWidget::coverFlow_centerIndexChanged( const QModelIndex& index ) { emit coverRequested( index.isValid() ? lvDiscs->model()->discId( index ) : QString::null ); } void PartitionWidget::progress_jobFinished( const QWBFS::Model::Disc& disc ) { importModel()->updateDisc( disc ); } void PartitionWidget::progress_finished() { PartitionComboBox::partitionModel()->update(); tbLoad->click(); } void PartitionWidget::on_cbPartitions_currentIndexChanged( int index ) { if ( window()->isVisible() ) { // dirty hack because qcombobox automatically set the current index to the first item on model set and this can produce errors (partition is not wbfs) setCurrentPartition( cbPartitions->itemText( index ) ); } } void PartitionWidget::on_tbLoad_clicked() { if ( !mDriver->open() && !mDriver->partition().isEmpty() ) { showError( tr( "Can't open partition." ) ); } if ( discModel()->rowCount() == 0 ) { models_countChanged(); } else { discModel()->clear(); } if ( mDriver->isOpen() ) { QWBFS::Model::DiscList discs; const int result = mDriver->discList( discs ); if ( result == QWBFS::Driver::Ok ) { discModel()->setDiscs( discs ); if ( discModel()->rowCount() == 0 ) { models_countChanged(); } } else { showError( result ); } } } void PartitionWidget::on_tbFormat_clicked() { const QString text = tr( "The partition '%1' will be formatted,\nall data will be erased permanently, are you sure?" ).arg( mDriver->partition() ); const QMessageBox::StandardButtons buttons = QMessageBox::Yes | QMessageBox::No; const QMessageBox::StandardButton button = QMessageBox::No; if ( QMessageBox::question( this, QString::null, text, buttons, button ) == button ) { return; } if ( mDriver->format() ) { tbLoad->click(); } else { showError( tr( "Can't format partition." ) ); } } void PartitionWidget::on_tbOpen_clicked() { emit openViewRequested(); } void PartitionWidget::on_tbClose_clicked() { emit closeViewRequested(); } void PartitionWidget::on_tbRemoveDiscs_clicked() { const QModelIndexList indexes = lvDiscs->selectionModel()->selectedIndexes(); const QString text = tr( "You are about to permanently delete %1 disc(s) on partition '%2', are you sure?" ).arg( indexes.count() ).arg( mDriver->partition() ); const QMessageBox::StandardButtons buttons = QMessageBox::Yes | QMessageBox::No; const QMessageBox::StandardButton button = QMessageBox::No; if ( indexes.isEmpty() || QMessageBox::question( this, QString::null, text, buttons, button ) == button ) { return; } int errors = 0; for ( int i = indexes.count() -1; i >= 0; i-- ) { const QModelIndex& index = indexes[ i ]; const QString discId = discModel()->discId( index ); if ( mDriver->removeDisc( discId ) == QWBFS::Driver::Ok ) { discModel()->removeRow( index.row() ); } else { errors++; } } if ( errors > 0 ) { showError( tr( "One or more discs have failed to be removed." ) ); } } void PartitionWidget::on_tbRenameDisc_clicked() { const QModelIndex index = lvDiscs->selectionModel()->selectedIndexes().value( 0 ); const QWBFS::Model::Disc disc = discModel()->disc( index ); if ( !index.isValid() ) { return; } const QString name = QInputDialog::getText( this, QString::null, tr( "Choose a new name for the disc" ), QLineEdit::Normal, disc.title ); if ( name.isNull() ) { return; } if ( mDriver->renameDisc( disc.id, name ) == QWBFS::Driver::Ok ) { discModel()->setData( index, name, Qt::DisplayRole ); } else { showError( tr( "Can't rename disc id #%1 (%2) to '%3'" ).arg( disc.id ).arg( disc.title ).arg( name ) ); } } void PartitionWidget::on_tbClearImport_clicked() { importModel()->clear(); } void PartitionWidget::on_tbRemoveImport_clicked() { importModel()->removeSelection( lvImport->selectionModel()->selection() ); } void PartitionWidget::on_tbImport_clicked() { if ( importModel()->rowCount() == 0 ) { return; } ProgressDialog* dlg = new ProgressDialog( this ); connect( dlg, SIGNAL( jobFinished( const QWBFS::Model::Disc& ) ), this, SLOT( progress_jobFinished( const QWBFS::Model::Disc& ) ) ); connect( dlg, SIGNAL( finished() ), this, SLOT( progress_finished() ) ); WorkerThread::Work work; work.task = WorkerThread::ImportWBFS; work.discs = importModel()->discs(); work.target = mDriver->handle().partition(); work.window = dlg; dlg->setWork( work ); } ./qwbfsmanager-1.2.1-src/qwbfs/src/UIAbout.h0000644000175000017520000000416211410735200020104 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe Azevedo aka Nox P@sNox ** Project : QWBFS Manager ** FileName : UIAbout.h ** Date : 2010-06-16T14:19:29 ** License : GPL2 ** Home Page : http://code.google.com/p/qwbfs ** Comment : QWBFS Manager is a cross platform WBFS manager developed using C++/Qt4. ** It's currently working fine under Windows (XP to Seven, 32 & 64Bits), Mac OS X (10.4.x to 10.6.x), Linux & unix like. ** ** 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 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ** In addition, as a special exception, the copyright holders give permission ** to link this program with the OpenSSL project's "OpenSSL" library (or with ** modified versions of it that use the same license as the "OpenSSL" ** library), and distribute the linked executables. You must obey the GNU ** General Public License in all respects for all of the code used other than ** "OpenSSL". If you modify file(s), you may extend this exception to your ** version of the file(s), but you are not obligated to do so. If you do not ** wish to do so, delete this exception statement from your version. ** ****************************************************************************/ #ifndef UIABOUT_H #define UIABOUT_H #include "ui_UIAbout.h" class UIAbout : public QDialog, public Ui::UIAbout { Q_OBJECT public: UIAbout( QWidget* parent = 0 ); virtual bool event( QEvent* event ); protected: void localeChanged(); }; #endif // UIABOUT_H ./qwbfsmanager-1.2.1-src/qwbfs/resources/0000755000175000017520000000000011546156115017657 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/qwbfs/resources/256/0000755000175000017520000000000011546156115020173 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/qwbfs/resources/256/linux.png0000644000175000017520000011734311534466576022065 0ustar pasnoxpasnoxPNG  IHDR\rfsRGB7MS pHYs  zTXtauthorxs,HUpr su#I; IDATx|>"zdɖ{ c1`0šjh ɽKK 7!$z$`pŽދ\Իw;JV+[.vݝys9t"HUՔ>(wܹؽ{N8_***ܐe9wωAnO8?GNlr?O>>Ov{nn.z艼~}ѣ{7dff#l PJo46 RǁnF޽GmF3V^#Gߤ1tj%zG*))~gw ͔QFaȐ!իRS`1x WWt5f`? PLF~/;7`Ŋt"2 0`cVm9s6wN΃~-\7~ۣ¯_?cƎC4b\bր]%~mׁ `2[huc"Mf+x :ۧItj#v7~e޽{ZΝqmwXHxfCJRk~) JȄ`̀}O>v737\@:9}>φ۷i2e2&_?iik}1/.~2h5L"S:p@ /믿PxѩS~OS/vB?~-xވ gncV\:5BgN~͙37}׌u4Rd}~cGX7xMQ6e҉NaD??' Z1lZ;/X>|UV7DuMMD`s s;VZ}Z뗆 %)u͚5_|C~i1յ-/qhvx_?ȦʠAp˭F1_._2ӧwٸq v=SٳPCw!|ǐ4€J510L8ʕ+aqGZL'~ .?9lǎ߿HmM%x & ΋7<_@1?swWg1M:Xmg~\蓮LT7 ]fDLLLD>NwN>=cꜛ+%π.g9 ';CvO_}?xf9D83bMѣ>썯}niא̝s4}`sEnYSҌ͛7O"Y):;*a$!UV<gd4;f0Iq1§+YK ~_\6l3Ԝb3pg_P5bɓ'Z{+j߶}Okth7tm9SH8Cb‹ԡXE_0eEe% d# 'rNw[{sPYYqiI l6+,kk5l8"EzbIbYBBa`` {oĶm@*4ZĠo>}~9\1A kwH&u<0 w1Lp 7#3C0I) >f0S:f`׈|!Ngb 5_6o^th?"`իCVV`ȣGr]ݳGH^^2Is*iNH+?z1;@ :qЕ0nxkX;\O_2E[>'77{thipjkzcƌ#@RX,o ̙3Ea{y_"F ~$=nRpYӤtO<kn rz=>??2=}C=KdK@zRDžLy %8cb:ecÆ |P-Y~n?F#7CHK @<Y ?HjjmJJJBVfsݬ%P>#Gc{ra!RuGO?CfI$܄zF<Rl cMW-v/_~O,nق{6e!-9A4G\JH"ϒ4{@@&0>}Z<ձx… q" h H%zcq@ځT©q0S~eIQOKrw؁Z9}w>U*!-ya>H ' @%??qIcH8"2dsYniI#€nj{uҝ^7bEEj]:>aK@@Ӑ Jfn|Ɉ!6ScVEEZq&^@8 g:NjJa$ِA`koo7O y"DbZaJ抅^>rnk.E<.4F_"Λ`7Dhmxݮر&i=0 l8М̝HISpV(m#h#F7NJL|yXw_|o/? GzaԐemq ɥ CAQ~u @(99vl޺6cOfZ~}0O_/M$ W,I|'ztN2-﫭՚'0;{#6zEdCbI lrSpUxݽ1*C&3O>W\pʙF8 |pYF3Vyt ӬY햆P^y"X!ۿN&f#'b!5HE\ۛ4\p:I# T\dN緪ydsaJT_<Uv\_e{`歭o0ӗ_~Y3)t*S?V?#i2bm$m$H;<$U\]Y@ %5@@@ J623}c (W s!67tXt xc ]+/LƤC+ k`gY\o[%, jjaM"ҐP[@K5Yb9~ ێ5ӧ l,:mr:Lb/v0Z$p86mo'6Qlsn3<@Jd;|U&X ʪnQxsF,wәM6ODk࿧vF?nDaP\#{̀ q924W]d|5>Njj'8-FqV)s̘1w6DA:ib?aixqZw[ckT٩&$.TK Y yuƫ0PuʌbW埿B[[ޚ_ҟ:жTaa9+CRzjaH+>W ӵ%*ި~s#N"]4X/Uaߩf5^͌xy<;3fjĤrHdzJ.&L-cKCQ@\4|^ #&.N(>!fkrb~p0^m(̓@a 0iDŽr,OqZ3r䷄+_UQawP[*_M'!M{n}#,{2]u$ɐLJr51Rjk,;l&xn|q,S1FgLIw R ==~MkD]ByJ5kGOcӌT9Tx3PSlAq⻖‘HL4C"kZNu \[{n1?@ !o9}ǓV5m$k5 U|E3ΗNڵͣ@'/v ^wg1YU{epj ^H%ȩm)R3$XQ~4l^raw0*9ĹeZ3dՄj4Rtt'@+\} Â˪<( @[ebSGv*%DTL恕%6? &R HKS-vyX6 }^šJH[Zճ.`GDzM]=Цi꥝ǎ$:[7K^IYaM%m_ەm|$嚝rHc6DKB$U1>jD\"XSj59R},E~,za} wm~59))dpmx|aޟdՈdꃉP\0L!l}_5G୴YO`gdX8ʄY[cW\2Kpq);;Zc,ۑlkU$ejKd[[<|:d,L1#Tޭ3=FTIAC\8+I s.TOm(ڵ _Xxr}'&lzaaa9l DTx}*,U Gf|NTOcMɵP`h(Isd^n”R[RɽV9#Bpާif9l4'`ɏET`p.@lBAyg=,3. IDAT>KP3 ]P,q0!t8Ɨs5O-ܻwnNE3gά>6!m?QGy'ʲ_{rQ`\ <[';ՇQ;jl|u>"'|bZ#?Ո|Z$ KMKA ||Fx'_˜ WR>} %%Eo-)I$=nYÆ ݡ*}w1>hiDJHpdo_ = gjH4 MޔJ QeRc2C=[57%Fcc/χ>}z#+]^^5}>2߾c5Ƽ1a``# c:$U)gNDN " $dЈ)&+,t:eK>MbԴZOWuGݱsDžI[tcԩ;wr [qq?wPT-1\3sR # _^bU0:\u{jrH avL,+|7͐FM͏_¹@xHdM38ɘ7[֊(ѹsglڴ ,˔UVt Ы:hQaa\?HC1tiأ4٩OS_~i$^]~ddt1c.ȽXz5Avv6NQ1|k@ߓg3M3-{f,2v 8 泖j)&j˗Aᦛn %%?C;VV̘1>1C஻R'ZJJL})3M\# J>^G<[Zf j⭷$~[߼ջ'VQIL4 #F'hku@Ѝ7x33Yꐊg}VD_6nx9Vu7u $\ͮ:'`rT犸T9-QS6ccD4RDE׬iF!ܑ5~ Ş=m6}mwW$'%%%x TUVb…-:AxH @%T1/y'%M YŘ1#?B͛mt曧ǿf'9ӊ+&]l?,6׼ Qpt5Se? Zz si_@c*Uib/ܑVTMrIjB=z5'@`G<{qҥ[n7V2^۟wDwu5sqj>$XeSpgLTԳ ?sva\  diM|=b]ڹs'n&k'ND߾}QPP`8tП?^7SD_c)3w\T -`¸*̆F iBub$~s-P.G%@qc`^o 8+ZRTd)Sr8zTBpeIm_ ֭[עsqJ>E\7g54%r\"i0+K]Kſbb߿B `SCFL̓l2oSԭkf#Gpma I-f~V-ZoQ_ђq/heUP8o[[C7~(ё%K,A~0`?}C?яޥ{{%k= =S<~8-b`˖-opw$g RzjPd59/h!s.*{3ȿEyE֯_A_uu@VV%F,//_x=:Tyn.\0--=>v*/ZBF?!C0YZ `B%[!0lk"ۜt[jу!v;{.޽{3'L=ФIzyEL(O6$Z/D74 fICjaڰHaI{)WX ϋ2dHDz֕ ;nY#;~x``X^\\k: rN8tիh6ҟ6 >cZBأV@ e/j%Қ*$mKd2D*f +tU(8A$|?iӍlOu©cWg.X0ȑ#E VO{̪/gT{E+*an3Džy0gp.}֭ )bb{lil&"|*!#55kٳ4} [n=L~36 w}愣; kaر#aĸèGUJ'$= lo`gs,#7Q:^AQ< dSds+/"-O>)NK+nblD~?GS>oFW -_عs{>AY`_e0_ZARƩSqP>917䐠,}s&"פ$' !)UHdh4j\|\ `B8~VBbw& H }@|h-r 2$Xݕ"yzܵa^Џ"`Pjj8qG]bSOo $+vg} *}3/^۷SܔAˑ̓OH؜;M{*I*+IpRĦMMOG '-7Mbjģ=K {=0b:4X 8HZ:H[06Q%YmZ.UUX;vlZ'NFm0`^סC?v >6^z_]+?𣩤ZY`[Ø3gNjQ0aHjnСC)E3Z,=B,JymĄ$͓S1A0UH`ENss0sYcϼ?x)&. 4U5꾷$s-z32RjZ47PmEE=w[PXX˺tZoGxMqf';\]N<ٮ30`͟?ǎB?fĉnff&`…u^f{iӭ {G7L # njdM͗ F1'cNr:uEJZp\r>Y݆؇ϟìi$):uFB|0Ew"k'F׼C0̊}l3^:ucvs鿧{o5vNf͊}WXjՐZ똱C6>gg7?3#^f"#SKRȚ*ڴda!\˸SeX\@\S.RccbU0$dVZ%?w۶;˗/kl%81sx0*N*--5%$$}a1y{|:;8LDW_Izg?̙3YJ4D?1h@?!c&99ΟI5AH\%8drsb6 鴉F\_1H RRDomۣ3+*ʉaKp}w]}lbdffL"=*sL|^|Ͼ {ϗ?n;tscP i$؇+*i:vQ#P=?|o.$2SaXȁV͸"31 eK}7O&%7ŋHzj|du˖{!#{lٲe*NIQY7~j 8s.,]^={ᩧ믿!| mqcNJ~y "o `7g3 ^`@uuK޾} NýTYEEeÇ0oPo tOG O?7D6l:wΥ?jSY& ?;L\# KH">jfJnI뮻EG[ Md!`Ms6l8׿:-o,X,ݻĨc{##6nF<yŐ܁M>z5oA?%x !/h|7ĹbC .q>ѣGFWSSKfAXqeϞ=qGjm$pHf͚z!ơo?jnsDTy!g't &jC~)'3hr]ȣ3I8g[Gغu;,\k5{<zY A |/3thSOh"tYjcl2"Vkv؅Լclɩ7L!P8{q.'m L|%9ZQpa7d懚U LK~/ijJ*Is{@?D"'8;0Mޣ7CAQotht̝3g1sCUa!ImS{NJ`tfTx:୓cA:In^{Ũ[A`hHb9p뭷37n܈իW!//i͛y=[gE/#%5UwϞ{f:Atdg{*KN bg^O9b{sʔ)¾W?TK]ANt8Vmޟr%6HռS0^D@Җh̓o{9ۺ#"啡EEE]:?\qaN:_l!j!u=!7߄k~vlQZq%!9N]ɋ72Ժ=jd)EK7q:6s.#npv*4{Ii T2,X\&JܶuӯWX޽{ҋRXB}nqѺ\x=k61i#_s5ċqD^?+A_H"1!Vј *kmu5$77p"Q%x q1wCuh#+ 3gN/~Нo6O8Yry}zcwDIsĶ-W(/b;OD- D#-_Gc?`p3rPcc5n[f鷿U6BǏm|N.:!_s4yns該 G7%Lr?N+z U^CENkUU5`|]2;wd!sڈ&ӧChUFb0͛6Aa2%̙:yqR ɭ8lҢ%Nb]5J4zm2.6!R@z7uiSMF0fTFpM. o5nxmf1I2#^s&a)uk3U}jqTΑ7*1q+\31=2p&7(+4n+'E0w/~e޼yr{9v0嫣G&nW :dNjm4YE& o`a1|Mhh/ ~ǢP4ĩ[t/սl8587Gڵko=/+߮5۸q۷g6?wKyyK߼=C  qX8^m|@iscQ9UatX9rxa޽t+ j𐈑B=!ʂ5Xй3gt] ^{۬sWÉ~ b~,c]qbѐ?@*Qhf$)] P F `(]4OCڢEx@))iԹ p BQ Mil1pm۶mnpk׮QӆCM\(jc2ʛ{71rhzbg*MRpӒE4\tl>}Ea4ĥ%KLH= "Q-IP`/~s=8ܵkW\&GuRB72gnnP+`ÂǓ(B C-M-Q6ٗO[_|ѨQ9;,skO / nFFZf6aW6"ڃ1e:4ŧoX r-O'bᓃQSĞbҥ~.=#A{&8%UBD7_<8bDSFito F WeٷrWJQ0m$Vќ.)>~&Lئ.2*;2Gߘx{*()b1//OH*u/N+ΫaJHR o,3: ?`6*:o\Bjjj={Lѝڲe'YMH K¤x]"HȺqD<,+HIJF#HOQqH]ryE-ÀHk֬iuw_UU jؘ\͉c!! 3"tֽbb]"ڄWHKh $JQ ]o݁]bw5z;fu#'1@u"gԈBT)$sU"VYhq~{@[Ŭ>E!GWQ^ܒslm}@*̵l4&T\cKn# _vyyE HGQt4端FTFcphLj ,8ꞵt^7L7(6_2 ߻I\hĪt~(Oa.")'6`k6(TW0y@h-" .p֮]r뭷7 IUpoXEu h^$RoBp@dMĖd|bDLxv#)QlCIHk HK;n8u%E$kE>={#o T 5 @a wF.8p]N>ydkkyIiɉ"٧ujBZ<جТ 7v}J_!QUZa7CFӂ>0@FQakj;Om[Y`;=Rҗ%Aj5pznv… ƫ f5|cϨ t8ѯ_nR=:d 킏Uc<%\ "×yd&b`I6 ]:bҪQMo5C{>E]6AZp'Twboۘ #%_7T[`mMINJĐA׏ ň7Sw`0[hnR7㹉b6Q)؀483<C{9D ); y< t`I01nH̟Ϟ;vRGtTRRtּ'VX(BPQUMF6VSN݁xæ%G V)>dڼk"2^b~Psj0ILϥny7$<܅סݒuCuO„qcѳsTُ)x?b "NlQcEĈw܅ $XRfߧƍ/f I-qMm&C'mZi- p>&3쯾]5rQR\אǟsEv) W_;(:-*RgG^_vM&kjJthE_cMCK@||2S.{O؁'NLdVW@ J{9L4~xĹb ,;YXt~p'RnftNy]8ujߋۦ4Z NJ<7kY&Ai^xbO{~ꩧj€ܾdw~γ>/[Sng:oÆ ;36mXj)w~VޡzƦ1 @諮JWYs٫vދ#~QNJN8a{g%m|h[ŵ>^wclmߵp ӧ՜i=lSہ_dgC|n}zfE?zX~ScyϜ:y}bp6@\Zz17Nx vM ƪݑ$<* Ź.<.D+$8%I5g-pbw˰xbaO0Aܗ@tk|LHD! x@lx̟cݺسvD:fs,YJd6Ez칸`;"(m wtEN\Uf͆*dL]" jPaZVD >V y_/sAײ>9XGxnkp S!-Y ?zi\IM?cF8i-PАƨ5QQS=VVQQUK ɽb}:Ǧm{4A XԀ#2ˌ/!I~Ijk!T "<BrAaofkHǎX&!@z;šW^m.l5e3"7ՆY Hrhiq|VQH I/"hCēiѼ1X+4/[4M5X`Url+PuhCGn pGӢa'<‹xב۹#o:lh0Æ ۧE2NA # \pM""=-+,WeqY2lش|sN5_Ѝ `4|~!It1px7,`e-N&@}IpQBb /, Ѿ}ENȿ?̬,k{vۗ:\$rxKOhS0/n~HHGV#fd>}̜sR6Nj $k%wK>Q) @n>pf.%&53vyn-voOE[Nla~&;7B%Q˽",nj%H *L Aqv_lL >%{bS/ ~2\1\X65^8"@ O>ݏŻ+DCˢyS/FWE3]_`h'[? >I85-eepNjtEX`A[j᥍SR?̶rY?u*I tU8\*Q!Y+|wڏjj}*:;WG1kSdyo?FˆZ^Z9siw}! `d#.)m'`P)),*AP(WƯq@ِIO@YSg$f5׽VwNRn}vdOeo)"ME| 'p_~Iu# Nj6K%6ciB%inq8ZUAO;cn냴"=TA+1x` 2%IY AKAI֜H+Rc:q2Ԉ1U6Rq.LJ2- fիVf綺Y/Jv3[~{qAHu%03ZIg }(!fs9j-!w!`+5R rLcqwյ1pN3?#7Uл::LY/;٭A-}g+䕡g͉hY:+Wz0^S?ϬXd;^ct2~mklADGo/.KY|gIއ]J &+h vnV cd ,ğ6.RvN㨃yǎY$eUw$|5.fQ+غo9}zJ fA)#t#V pӟq 4T};QL+-ĉ98̛~x8fr𧘕',:H,8Eg/HCU`:3 {OmG?}\1 NDQ¡s:6mxoL\ :2?3\^e*7iyc7,'X=6c>Lau`@'Q 2u_{1R7yAr?ͺFȡOCϙ(!gA|L˛ &<]>o駞ݨՙSKjۼvm+p[!Vy_]+ȊZv~MڃoJ[6C(ԡ:3!J,v|8{+gՇFSZ갅uA/fXYs^/MTN.'Yx?w'4)39 0}9R[nUȦ-~9R1`&yU20Ee* *}HaתXs\蘕wG&W<7%X ܀d %sx˹]Cȗ)y ?gm[k}0+q߰g-q4 BS&hB`4FnQ c25OMqa8u|(͔1?}'9L$|=?9Bv.N+n8Uj㷏eap酧?ݗ@gR: ?)&] gH(t$I/pc;7si>2%PKXAz/%t "b}@Pp&8vma1M $+)bM4{7>}S8猓ŠcCm/v< uj;[V[X cIL ,iDhM iN^2@֯} ۰[b}E6r%qz5 5(g?αѮ:|W+CS- y,%dZ 6g$OC^0=+n*A;+[z>=;)?'O=לwnT4( IDATvL %]v'xJ6 ?HNgJ  ^sΫpEx-(߼3nXx\ވלqNQђ<VnI#8p]8ףӘ0e¨MM6;o|fEF~JuY\=m~K^4t}ŏ&M?^hpa>1H"a:Z;=LxS7uU)@h&>wnļ0j3AKXU[;EµtvVVF1?x29\p֫p+p 3oľr#$JqH6;+D,=L 4/c:j%l Naۯy1 {YmR}C%14R "{̟3kOPמN[eodL_)® `Z;x0uoƿܹEqWu_b68G! x} >CG>/("~ ;~s Jv1ΔS߻bEl&J;En+'PHq/0!~{KN}bN6+jP}p?aW ZZ:}5x2N"4=c)hbySVƟvbK 7`|\kH!˗k~眶+tp7tA*{~o0YSa55] ,@ɇBY|'A TaDkͥoAVksEhX6s=~.L> Bq|T:CI圭#]w|/ncjZ[{VLab}5aقe ;`A|u{ * ˓\ &C#T9yiO ?k_m>i|ڿǙgBQ g j@@B [)_Xy-\HQ'B4!+f[{nd9w"W"^G)N'>@gO;>`T*->\+~}ƾe*e=OD o8aF2P3BpDP̝$~#/ % wB{ پs/>ʕ @G1c?s=Q&C[8z/\q:;3 ?F9HøFՉlX W:lj^Dؙ?vvt7xmdFWNLh,>f4Y1a/H59$F/8JM2 6 d$ypyo :6=>נP,70tRm?ef}BP Q<+FkWV5#@M%& Np*D{x#ެBO[RHJrO&.OصܺqQ7^RoCU=Q9JP+ݻl-Myjअkw,nZ,LbCEy)Xup{x}y =)<|c?[%𛢴jV{7qy(N΅"ТsIvI,\Fݨp_R9F1s;oE|!Ww|NeLROmB2nn ] &֟|a= `{?)E~1M$r}ҍ/ IVp1g;r^pF&PLo :,ʙ}~s˭ޏ~x,~Lnʊdga*=tj1$uLY]w%Un!^hB5QD~%ɴÁ)ѧꣿډZCNqlλAE \'OsC2 spkͭ tDn0%ݳ뮿#,Y/0OOQMEx`Kk,ByH{;Z?R,|?93ƙ7QAUB,': #BϧʿHE}T~R9UkjI|K:R_V4ГD|99J4&58Z\6vBs/+LaHPD |%drŧ:ma@袞"t"@Г(b'e9Z$kl{P[{gw*C H݀ڐdےbzr2:򋔶lTYe@lZZ6Ƴb_>NO?8SOṭqچuV*\XTa]gAL4jz<[ܽV.m& [Gpun#=) }6S1-hFW((+0"bu%'S~ey_/MQOMװC`Z:TOTylaA0 ^gM+xl}~ s!]>~'RrQUTYFh|DF!BnT$Iƹ€(@jL~9#'$Zb[j"9%V~>sBm2W2p T]L0JUvIZ_qyb5cqަFuD D _JmNr Gl!& UW[?+CJR\!_0&!~6!"A*AvfVN!Ůё݋j|v^)l-@m%K,[!JJ8x@eTwf_{j^5E(F 8Ufh{֏Va;j;?SFlLQ ) 3*XL9-G ]iZXs=)Cdaa=h*IS)* ~:T.9V/nV>ogA)_ Z{;7ˁÙ| uS,)qu4yd&?P!g(o*PQQ֟=;M" ;1&z+Z}Cow)$В6w0]vQ/9nwnДTK)w~CQʪZӊ*5bbϜB-4iF6`{ʁU6$Ays6$~HH8ağ//P챀0`É\.U$Uy%ׄbP"X%R~4M8mr$k1gQw9@W6sZ^ԩN;JB撘}$\a&߶3wOh4x櫢yĪBfv[$k3'S}ef|Ofg7ب٥5&f9Ն׭޲w>sNue$'/5u&dQ(z\[w"]%pm~~0aD٫Q=̓{*+^ԯ"B3]ϰe8|M z_1<<B^0ta6_xI!! nYN--`0^!Щ97UqKqSOZ} O#C ƼK凸[F+3%~ʰa=vY+@*% b쀵jK)xEHfkv CBB/QflL0TPcty_FXZ^baߝ hך"1HiUJ)1FT+>ك1&l:uF!od$(Ϯ̣s>Hjs2&ᝫo>F1;a5>K7]hTJ~8/nu_Sű%{ncÊLxǫ }v&ީ?ߠԭ0 G@Ǥ <ߢtzN,WAj ˧Q΢2W.>[+/xs*zn_N k 9*`wU"wmCMG$%9XlkQ7zG"࿼C*PdUzz}^Bﺕ1PX0f--}v p~zSlI l a|I"> ПZf.(&x+>3VP(` y]n ɗ_~Vf BxZ0 4~uaYaJTH!bn K{ݙ Qj0wȪ cAh8]ũ̲A5 AH9̦-CA-AS4+}^g4aHY_EL貣(Ol) #(v +r@a"zbsP{xLsHUo&5rF ;:&1pr̈́nxxS|E0$δ\0l˖8"DGg򫈐^՝>~vQMI1fXnL<k.x^_kvU”_-8MIR?Ϗ_EhQZh L"pγUioLz(}IIHcf7P.+5ޕH-Z ZBi0*l`٦oB!CU rn(/b~gߢ8W #Z'% Au) f+PN6gCz g~1>_]4*;h~o;4,UnzM/qA裿O?{kNꇂ/WAߞGd4~w<"^Ӵ8c ZB.C~co~[ ~Tw~ٽ=u*_wuΔ=C'ڑ+r46@@ 2C}g&zf9LXY)!R8fppA^h^ NI$( D( H^qvK#Q0n᭷ށ/}x.`^nh6"Fu[~Ж@4G:eF}y6ߡ?AHsBv40yH+]\ ^%P .#tO5wy֐aekABdMY҄ ]jkBs}/&䲅v(Ѐ2ՃD0(|h=#cQcי",yd 7&<^0eV||2K3 J#U|aD_t!j`psPPA%kKІA ! > \]ҮG,=Y7Tm49 c\-XtUXR]XS-E ĬR޼%٣Sv,@!uٔ@/)⠶K('iQ+)ZmdF9o@q;>Q7ڇ?i̪[wo w0<<|e8{E'D}gY&q:P kn;fm̻ ~]ڐNQtLI=rn'h=*U7L_0*83ue=qxlXCDr<3 ~>6CTF˝6AlHNXY7Mc_էQaVs~R);$2S+Ti.Hل!ĕxҍVD5,fH[XD22h%ДMX莸u4%Q_"i[\p-ciGJ)b>tO ֯9gמw2VtsjzrȤA(B UMSkR|<~'q L=͔EhU$Zvϧ#?߯ /uYnf Iß-,IAa'h gߝeg-0w#ߴEHzg2P*U>Fk\*4/ h'尡41X \鵡Q g#D5Y a%ɳr rmTAmz`际B{vn]Zw:X$,_a"`ҠQ1UżA) !]cwãO>|o|/lraWicWDlzj'%/EښGm]̨EN3<7"F?='݉4 OK&2wHg̬Y^^-{Vk S *EľZR/i-ĠxF BejצH%&2aMz5'd &R$q\e@Ŭ$DqD@RāYF&FlaAZN3'C?e˰zi,f f"K0eo~&hԪ ֗o ޏ`^%^rH[sq<7# gJ8`j<c2-fQ6s>d?]V5] `|J[xlzO]!7y$N,; oeJ>8L SoI 8tnfR!C WzJ$\y=dKE7Nj8!-oA载rDSaD*Sýq]if Lљif0y磏^]P f5yAT˭~s/ŴhrPȴWŐO!Mep8 Z|*:4A0b(npej]tF,3xjՅokuWp;r2bӫꔉlg@x9*QZ-tȔDE} " 0:s bEdVDI Ì0Z-B34v0"30d^͎:XFu~N0UH>HMc|!0~81[ ȚB5'B`عB{Ig2G_L&'>}Bbzj='h)?a.L,~uDռP)b@>z{8/l="/d<2af 9l#:M?[=-T UXJ 43E֯ mZՠ8E9-4}i-t#e 6ԀvE#Ubhm !8Z|j|f<-߷ t&?n՗>70m]+., r3xJ]+o:$ܩ$ۻa >WpF__=ϕ,uhq=U?[RXVD po.DžE$vmrk}{f1[$XajRs `vɑ(/c1`qWqa8}:w ZpxYmEzhơRW_!Ŋۚ4xuP5)Qb4 ߗqdZ)ꛏ\?#i]P|e_TI>Zy`*,o_9KP$Nfd|,`v6ޠ%؆BVYLt6N HfuiedSJjiF aТkჭJ 7mYZxȂHhra<<=T<0UU,ނ'D6,2]}b; c뱌 EX *,NDLxyOLa)b>Z%(uMb?cQաP.EJAR|-¼D\buX\imPO+97Kv^:[WWӨ-6х <615ԉ/^bld㞋o"33Aqm+_Xx" @Ü[6,a0gSq%FJ"fm9. 6cZSԧML@m6Mtv d\S\{{{ۋdYW zb/D!֋> gVw=IfI_6;{:-]LMPObl|J6SԳ^s*/.c[=XC7=6SrVO3CW*Dlm۬vKaOGo3_j 0ؿ Cw$Nu}ʼpsO^3RRnՍrݰS&ƙ-syqGiŠԡ/#5XϬ)R%o4abOf_&|lar\ј ]D&@:Ӆ}IX>& 'i!0u^Co86^[mg"TASԠHc]񸢡v0zZ9V7ŭ8pl"lMOiׇܛ3_۫)5/ vQ-vqdYxS{=9 e㰎/=kg1g~NqK{zϽuzd~Jӓ1jg7 l,#ɉ>l>a-L08`$;gۃ.AN@rsP>C]Ֆk ?,eJ`ʃ2=B S- PX6I#<7 QZn&Gd ϲC¯8]d(]7-h3' N?vZ[Kxreb'3 Ԙ02XLĖ#b !m}vV3*~ʓA3>-e$ʯg+zd486|xFp*Aiv#X(JGA~ƹ AAʂWӚ<.LF|YIz[qFxLyLOۋزTKM7:"X{,?(̶C7@l #NӵozL̃%NxM} [(T* oW7r5^6r v 9qS[k] b߸$~*5}.&ӫx2NQYS3k $ %$}k`?{@\ }!apGݎ6t*ȞT)VrNPg~5 &n_4F"B=ikrhc }ȏϼt{qT f:R+'-SlH>JD<x9 TH8"{Q k=9LoE`>>v܉p:7p=w?A!C?аѰ Ey0d[!z&u$ y1Ϯ=?ި!W`XxA)r[N̾"I)[1qhTH1H W}G, <_}6٘teo |Հ5PFl0D `LD֝#fD}( g7jx 3S@s0]~]t}؎sU܉T3 ccpPe֎#aH4}U:/Is0\BߌP{t.AGFS~rySc (:{xr[Ǯ_PE䓩.wZ(_=W_", xF~U ~u/eИLeVHȯ&z1lTY0kob}/|(BF,-$~B=(Bٷ>۠"ܯ-Ε|>,D%c:< =Ktq}%m <_羨_/m׊6KeTyEh6JZ0|ګ|eOgAy|wQ)&e%_~-_f&;1wAӍ<T'@I=KSO%(Ȟ<V=&>&S W{6;MXusoˉ+{4c qۉ_o.zV܇Zʄ7-gg9Ai̔H>l;Տqt osT^6(=o?H9vGh4~->̺Sk0I:BHi7_*&o~P%>eH֐^=cPj4[OǑs[۝CuK/j{8rc:jh ^;{yS9n,{{𿺴)(EZTՋ0on#]XT3KP96C;ް葇L8z8L~$N 3)By9Hqdh1˕b?@0jm\v_gpyvj @:E/,e;[Q=pG[PNMsKe2h Kζ2wlwS/ʚc?BCKLl%ID)/ CI@>M=Vi .b 9MMM>UM^X)8Cl!By'kȤ4)h wōS m5A4B35Qad Jڽ_Ws}LBc, n0B@)BkW&peHPx$;a0 6XkQOs.aYGC))*hBH)!@^w)Rpu)$i/ks;06c~cc[$I(+8`)} m {`c_ JEa @ M9RܘEQ9z6¾}{S0ڠ86FޠIoZh)~F:t_?=pG9{=o2XBi u @/]o}'{~ 6PR9/@s8?HүXS[hJ#_Ka p1RxIHk )%__o/[ko 5mgopR"2s$1Z[ E1X_L#M@B Q I (%582Ĺ`3ָ9i6o@67$ .s/ _Rk%/Zw ?ǧN^3an|{?>Ԑ4 A.R J`U4 qU$9KB)>#%B@)Z&HB E`w$X}c,B(4 Mji B*+R EQZ -RRE~B/p˗3oUs[7֮yU├ n6&{~@ɪƇpDyyؙXh$w;\/EQYUD2 49E `V.rTu퐁ҀZkX1PJ!s\,(  gQ@Ex0{wy$"pޤn>I T&\iQ IY,xU^C d'[pF4ڒ{d08N@^5/X'rt5YL̡ިZv96YȬp~8q; DB@[ZOϥ*1Ibhw@Jݠ[Ʃi}^abbZk^oV?$MCpn(U~#I?!'ewQ*yn5q+>~ܘ"w"j  ,J訄E-MF*677Fۅӳ:/Pqp#M ElQ?ޅx\CLiE"lj?( HܹD( Z99 &&K9SZR􉔐*a <]-k଺rtu$p9xQ ITJ@q& ?6glD <J>o$) ,c$.t( Ѓ"Nʳr?z֧XFLE3Q")'`ֶz z>OU=TJ!Mw<;& 8\## #s\L86Zbe?, pUJbIJ$4) PRnaU,/d#>1w]We2;7%p)?y$:&55H<##0p0\^S41>d j6@x p` Ar@:Kk"8q@xy zgJv`$#Xr0|RrS(;My#АdV~ze$IiuBYTi9>-}9u#b7!bɇ5CЊ؃p*B\y_*j*`w@=UP Yv]~G;7h i]D f? T- 4 p$zE#eaF#AJN?N wI).P"5ЍQa'q5HS%IBxc Wmҏ>HF*J\Ёhe<6%}WJ!˲R?JF8_/Ymt(Ej,PO.͹Jf!ZHz&IicP7 wk VՎ=qE BH-\>k\c|M #5B:и ^z2GRy^N!U/L+i\w)HHSx-P l[ \VkA7 j[S %2'Ѽϗ8ށ (<+#}sk$w@ƺ쀤2ts?n7 &TBHug{\Lr|j4^DAA$ !i5J%f ;+6g,㗠 +:_ pOdh.sFr!EYR<ݫjzguMB0 Pn*cnӂV55rP G ,J[l|z@ nHnJ<;?.0]aL4<1}2(wp:0=} m G(&HH 1I}%F_"\Jߞ=V q+kw2fq<Ñ} m d8B@$0ԏd$~>yBE #r7~;p%ewEC@jL 6TH9I ?ϯbT0K-"Uft{F()ݩO*7U Ƣ@ , Fl"ڏ 0WCY=Wv#- Jy)XeCRzT /kBk-8wi%P8PB8l8՜@d  \^iA*Ο1c=7(} ms=Uʧ=pnwO@*6Vv$#<\dD@̗~8$iu[ݱkU~C)%2o +urwT@C0;EǼ{VhY9$p gp)^]z^8UQz@MKn)q-1|JBvOݍm~9&BR|VWҼd\P$cJ2X6=6Jnm(#h_OXUF(D0pͧ?- S {e0HFGʿ}oƚiu3U>Ƿ'H)s^z JJϑԲ[#P 1FRqxȽHN(oDVpV*Ɋ^' uAjfV4MK8A.*CXF2@"- x0Z:JqԞo20PZ"zzcB .eyD!0:x/b9I0OpJmMJRuT1{ⵐa [TB" n wc Gm(D.AH(R3l'FV sO{J.5V$X>k6n%>ϱ D.6nNV6H_oƵEdjcJ~r|tu J{pR[<_.@]I8J!AU, {D'+< XݽF y")ɻnv, Gc .U{ \ydnhi)BV6 bLXo v;C10>b'}<gr҂Dq?Ç~D h{\|xDKQ  Uw'h@U ka#C0'7@jxicPRր0|s\xu+ (o!>ss `+> ( "gt ̐gn0,;H#(p$$~N .N6ᷪ5)vug !@@JHJ}LU4ZC Ujuk$N7 J+ Rʒ7m8x-|ZwҞW&YXa"0[C>B5<=(@< V TKp@ٺ>0!"%~*1_+ i@"lc `-MxK5hB{&FH؞oV@F$<4xWO^'Ӊ:xn;;NpelPhR0 4&QZH^H>=тW PrsZx  jgg;HHj_jEyQزڰ:# +a().S"2~Ҧ@ xx E@d {$ܗE*)_s]݃S1?kͿr;,sd#X/3A^Oev*O4_Zxo<CmsKe` ZW$ `恩畞ԟj)DRWQ(0(Pu䲼 P͕Q3wcUCax%I]8`{e bq(7 QhFW0D8hm"PhdiБ$,|,{5*J$ʼnU" [%;km03=Z `Q8=ߥD r,-bRJ$*UQemPrc!$rnd 7[5VAa *Aa$wPw} [p-s#(`-g-\Akj6ܓs`[ T4H@DK7BJ]P3.3 k-*KD]n=}:[I!*URJHZcPrak4sI_Pi C)PU $:;򆆕%D.HFBb xX]⁒Ӂ:]("g@F& )xpB{@6uf}ndu-Hns G o0S k[_b'w5-F0}5m :L2X`,󯵆 T2@bU_y%W}a50* wd$̃Q(Ցp]/P Eo6 M@"TPTs\Z6@GVvQ\DL*浪 NݟÍvKX-Ǖ<ذ&iOşױ@xe *yg (R8͗ޣRxg`Ӈ%:baWnJR[jk~w/ ;E+`#TtH.7ԝh⭧R6G9UZ%@6nDYƚPQu$`|<8ч8w._<˯?ayyWة*Kiꢈe- _0=mik?:2hd[0,A &V~݂G /q'p=lnnҥK;j }](Ak"bI#>b}+تRZ$ m6$&}ǎLNNblllG)@لR ǎCQx !MڄEİ՞&u)O^;hTJŏ,%˪+ b`Pj?cahT%|To=kCxGJ˲YJ);_/"@[;IVb![#Ϻv;%Z^gyc]2]Qk5X-ŗY`ZQ3v)#9ѭ'+ԯxw0;7Zz\Huzr:^lp t](*<˂Aֆ` Cp~K( Up7iKi* y(=N+G=Evu; 3g@*y 冀WNW kkk8Jlyh1Vޏsn(ܵ4,\#6qĝ(^~5p@t~4iwycxJjBUУ{P@[(SPXW{(k^n)b$7/]/X9a IDAT=NJr#PJX#R֛csSlu!\"ږIH 3 0XCj+Up|݇q.oW9#Op_%/]⹫@/fP<=2:1uͫD}9Y؂VPXx&eJ]O t_V7M?Cv1=+1#Bzo1{f-LNNn;W}7`9Qʹ#@m%IH(Q?: Vi0 -*IL*P @=/h熲/w[jma8t_y$k8ǡN+4cE UWB*):m q,s'!<y+1aA0:"O6{: !$$ OYPȯwɤpT8*]`m,p?&l(F6 W^!&:|333X__Ǐc\8G~fƥnoa%\B*>]wv4MH)ĉx͗󋻠S3񋍊꛼X cy(ybZ[ f?8fffp/_^^o}[9}O߁ @@CsKK$IPhwؑH@I | #Rxq?Xz>kxg{F_x}j@kkz SwQLOOcbbZ hhw:d_KFCfB >X 8ic Ywn'kDߗBX"q̠p[\~9߿?޽{:Zk3<\%#6BTPNpp(JBN ^VZHG%OEAn}5%9<0$= ~tM9=P('6sgʅ3l60?;iL؋i#MSu(5.^TJҥ?!c,C$X\\DF"ۇVa}}V13= [ [*ӇyKcHƁ2 sWc>sƘZgy揊p11 hi,..8|=0N~+X[B~ t&apfg7~ǎ ϥVask HaS~\ە v#0`?@`*B`ʭ( \t)uC{;J-K/yk ޏcaa*Mq);]H)jqǸ=XZZ9|-q T666p:<jO,ڝ (µ OsS]tj0=={b߾}8goojua-aZs `wvz翊KKK%姹96Мy3B+3<\e&0p[pRMD6GaAoj|ӟ_p֯":`ii ISqv8i{ؼy8ze0'&JZW_B4{a.jC/)_P= ~$j.i4P9ړh6سg݋|?|%[teNq |"TÓtzy)%.N~|:x"[n3XXZ5gϜkЃfILxC9VWװ,|>=zo%v10Yuc||sssX^^g<^~/r2/-7_???s36CQD5n{80X?aJ|gOx*g pH֠eb`A>垟R1SJ՗_@^á>}yٜ{q!,,,`~~iptm!E)`Z[Zvn׻7ȱʠ\Z)id0(fB*j 'A|癕RxPt7pA{X\\Lf '?vr3i6ao6Hn+++B^f㓤t:ȳ IQcfff3vю6$I_M<`^[O?\Q-\j_-%`5RDau8 [J)/hCK|tS>ؽ{76NcsgwJ(dn@vZZv]AHS4 `bbSSS<,`z=׫Z9 欵gO{<3P. V@h5pBJu:t0(╿Nx8gn9.yQKX]]. ½_S"Pu ,CAU jJiK>yS~G)* vPHxҎJ .Ӂs@ЁX Н ?ycljMx#1&M4;&a݆JI*sv.f7+ծ;=} 8p>d6671鍀Y!Ŀ֚gyoup w"%ro-fqo 믾£Tߠr=wphox^#l'0 ^%U[X{1ͳ`q,Pk7pp!AB:O"l Ao #>r!QPyp :ֲm+1F &`c!OTF'6@ 76Ш'nS>R1 똝qĒ N96THD\=ƽ~qCkC䷷k2 ~ O966!4Et >a. q5PR1F`^!D^AYHu//Ox/`9D J"%X%$ ,e FO~ZQ ݘʕ=#dz0PS\sw>aHuԯߎpq;OߣZkk @}Ng1 hEy,/a9L À(R|Ulx"ÿCλs^ 9"֖<)iҞDx7RFX\A;{w}7]v!Mkh6ظ-N԰U¡.+{~N-t:t:]tmmtPaH\'qX Lh`zj7&/m0_˿=z,˰sW_s /p#`SMW6&|BaHJB|@9ae2zD~EXW2L#m@joAIWBi#؂1c uHHX1Q0V!}5$Mu71] Ԡw~SO=]|"LV+WV: SMOL`Q,$3|V+Wpm(0==9,..`bbiF2;~?<^~>w'pIPcAoQX8WRAJ%(tV ICECX^cn~+W.amsSҸH)ޝFk8AJ ۊ RbcBJ!$d3R4xLAgL %𭧿 !zI'@vlmm! LM5k.޵ٙY_J?Zc Ν;/ĉ sk.`||0)q]O;!ussΝ/|7?r,L`.!`Z hS Q)`D5uBc14VdO7DG22H6y&R. c$}ӵRЅ!k|x-ZtQ@*U86Z ?$Nh G2 ,9O`bbC onnreZŅ>x?{:@dzV y1rl!7V3J%PZ^{vpNgΜ?:k]Kػn/xqmCPxe6jkVwW~?]2 Zd T#MR1^t}ؽ{cs+;f]YM2TyoLJg;whS]h>())/6Μ='O?x CוÀC 5(Nl`SO>c8k8ucZ-w|K_$XYYٳfݨRX:J`HUr|(>V3gb*] &! 1uvHD'?>{(^8~159G9V|z?w/_<tW2n2;w 2bhhjH8N ڸX[\gP$bN[$L~5ĽF9$^plク }]"ǟazz?/yļ NN{fqo@9&5e=Ɓ藺+Vh|sIh=8W_{WFR٨fjG/{~\vDpJaʃqnc D$VФ#kXO ē莗sNлsgP>HƠJU:MаlϿ;^0a JßB v )y]uW܍,p%lnn(tWG@Lפ,"K}ۮZ&_g^|O|1L'p@2:2]O @` h8W=PM^ l z/dIRn8PfD #zq olB%A!u5gDs&|^Zk9{[_Xݰ;} N<Ç᳟=4IV$+?#ws@[Kb5k:#ݻ? q|ISS=nD']y+++\3_ iŠ2QW/:sJa\B m [@k4m3woWm0qBڒkEQ R IDATM:'R OjZܙo^N¥^k|| >N|hZnacc[[Fݻ=>^؝zVZk)>#ĕ+WfjXvm@fvvvh4S~[  p:mEyFA t;Cb}]xO Mj)"4ۋw"G!&QqI}m8@H ρBd8lbsc[KĹCX+!eTv W ZdymuIC݁dtÁrzݻwBv@0Ѳ'* 6Y(J !E IM \3.p_a8֧&i@]JH='W;eF? ?oF.>zAW ~RVX^^7U7n]ѿ~Ud۔?w,.?-}S9FEg0`||,Lgܘ2\))havvv~T"[x}Zw/@ YrYUXuA4XW4dH3DTW*2!l;1c. yA觜H<hۇAW)%֛oC/}q7/$iU8xnK ֢C^914MoX,Tjسg: _WO=3e:R<ʻ纗S{MczW-I5-Lu۸2sōf|R§2٬;  w X@'qZxGqС3ַ6 tʿ78|{,C"P:^ ȋ_75__ݭna:W3NJsubaa=oMDpK`&F(8ϝs@,RZs;ȰV"\\aq䯹qP>>}ӳsao4.=^|5 n.dYiCc}7?0@N~=ZᅰFS?Ɯ=*dY̮z|-\ Ձ\T )½9EtƇX\c&AnMToTy8yصkVy4Wg2طo/=B &35ŧTdD~ 8(eN;-BxEnw2*(5T%JT8pc73;ELOc{03;yk7&͊!]  IFB{ wv:XXXǾ/?-CC ,7^*QA6I\FkƳ5Wc)j}fmVmWHz681ܽPй>mh|kѣcnnSSX_$-N<]SOBIN= )avj0xX{ރ֖;PKkhN6a+!we,M]*;ϳ$ڨcPƟqUb}x"|duuov He&Szyzʶs2y՗%ah-i(#vB9k%i͗F^ 4'Q; I!C۱$QX4vލn7eR kkk8s,S?|{r[18BJ{M\"QĚqep,@ۍ۔80)v1 !nw0֨Xԗ2ӅN{N|yQ`|bHo拈2.Ib3ĻW]P'<ƣ dm ֆ@.03= dY|<-$M: 9nGg,D2aL@$0~1==4Mκ!CX، yd/u݈Gc`-no$(3B<0G'F +Zt:]͑ Z_|vÇKK8wȑ#!>5o.kh)T ϲPo'ITZ_0!`˛ZkK5zT/%,oj K_'|w !i LVBIbaaBJd,IR~F`xі]yn^y\Nt!,qEW5++(\cIU vc4&''1;;'x?cUOSCt큨؅ր[Yv{B8 IRhc+xqںJP 7xRbssV{.^u&RJoK/ Z݁~>QʘH!Kŕj 3 U@Jސ1Wӳ`^wMWǠިce1kZؾ@~Z׳|29;;t`0p1 _ 5JJOO%7.˭9ن&Sv/S8?׍*wj~9k"Zkqy4 "IlmlޒZ?{sȲ.6l57_)"8mѭ!]@@cW~g \1b}ot|Phh6p"P5Vi\xpc@cRffgQqᣏ?Sd Bi%K 0* 4asN?GP eh;֯pŕ˗j_dߧ:鵫w' ,&:jsA)K.!vq!dYN{Umצ62 [v \y;[PZ|pdjOs165VVװ0?盵X*}>[DXV]i`aaR/!֒@!V'nZQ,JE{"&a Vky#~Ơ]챱p=:WZ)$I{ass#ÀKEm?^<AѣGQjwEzԩ8r!D! tYV}ŲsSQAǣQ.9x FߵV]mF s}R5<^#L6'J S|?c/ BcaagϞŗ|]N `?))ӺWEC2 V=8U'e.nb*.\Ӹt#oj𠚏wQ6{PRJf+p}pݎ|DR]?E{ @J&ۈ4M޵ݓk):O+t[ Zz_ZBjO؟n@~ #^Arw ĥkplſy_~3MkطwVVVp@O#` ϟiyx=jImc\Y4_5FEb,Uoߏ4Mw}g/\DsbݻD Kkm&$YB*ܳgfgg\{^h>}J)dYQސmQa@#%^=;3fI`mm *8w2&&qAk7JڭT]5 גVrP5ϲ w-㣏NbqiL?/**}aaaaΝ{ч]nqE.|$(^a xhC\/( -䑭YmEB^DSi )&&'Ш7}U*B(X2aTk!k.BS5!1?R|k]mT꫆& ᮻ.^9wn Gi+"CHR4տŅ: IpuYqgQY'| *|Kx/e 6Ƣ^K111Gy䧾\P$;p6^% H֢~r^q8U`HX #; 1QInK;]${ ;NY;F7иRH)J,YɇHY53 oƆc;\[C+;I9,4#ӲMH q7}?2z x^WeUeUw_HUɩ+bp%8m3v,0l.Թ9ezJ[!fg06:J(kϨa]~c9b CR@Ep( wK.P,Q4 & Il[||9g?§> -xVC$8ɍMLlN;17;vsw-{0022џ8tCgΜy P~Kg6$PL=q0s.3 wh"SDq$BOs0s8c &k"C@@fqKJU~BA7"N`Lk5[xwj:913M:BJwOĉxP,EޝyUV@V%../Uo<}{:4 u-b?mcJfh;Vqe*jA7/d'J;?s?G_~_ҝ-IKZt"Vuw n} C jY@Cޝw%*V6u }8?=o@jFGFP,}JQu]ض IXMoݣYܨeE@/J??QA&.|bı Oșx"9WMI9 zjU:7ӌH'Y/# c`}UyرcZVAq rCCCo!1,Xy5\$iq|Rib&ЋC y 9Rqi$ $]Ȉ뀺Mq$۲>|3?*CCC&mP(X__v/S~Q.$>lR6 eqZT*hUUN( e7Gwoi -zVU4X۶Pq5!r|m6Ku,H\l&UӶĭd",C(SHjN A-vD(l3, ! jI) HQ0##'2ct~v؏3A1ye [Ϙ_ȿ7O?Nqmn "yKO<V|\LwGV(`ⶪ棌5~zxf|m#`6 5͜pH_蔾SeɊ]t bl7r>nk"k/lrEnbr$8ƥK044-$~빪|Ϯ f*P:ň'O+nCè{ǑӢNLJe-驭f#`|3 @ՂWpL6<"W"/`GVLI@MDnIu )BEG Ԍҥ]s(I<ٹbAbVUO?+at=[ 7ױy\'f8p) IDAT#T t6“ ckڄ3M8+iKOE@0Ȋyb?, JGXJ3B5H"y$:Mؑ _ss8qZ  hf٫p$y3p:Hmy<`ȯÔlPTW-_lLNh;MK=dfM"$! * RyY~qy P]&6 i)ܳ3J$f4Ty f3S45Gq A=sM8L"#,.-OCyr˹DbRѨWF `>!~19(y&W'4[KaJ ĝiM 4d yɴ T>x[? II7}ata=( T.cz&b /^yn4oA {`4g䍘RYl{ue ѣJ%J$"ӘqGʞe"[N'UAzG_rϥR%@[a>#G% qib~"*&aL& Hɍ[Fچw08,JlKGb}ػwl _> M@{Sߴf9g~ڌFĜsկ/3eq\< VE㥣G166?,^T<(<@mno$ ["N,F@,0Df9I9uf2H!7o&&N vn6Z֍[ I*6@0k'^w*<.;R!қ(]x߃>u7(Q^؛ \S{ z`隒&83N!C:;w 0_{ ?C?*PGl|2U^Ϡٛ{m Wus73KpXΕƦA\&6 Il2{v.R9ǵWa.k(zVZ C| 5c斃 mcCIJ4!H([1f5%Ƙ8b̵kxQ:4uxRWoNRمL*7{6& K7\T8nM6v>0 `YjMZZ(dt辌XfxqRUI3f 8FZںn^CZM'C-mTKwr~3)E28)[RiFcFdi juMr<0aР.m9vytq^[}A$u( S.?v$E|ii[AA'uM3Tleͽ#.SUE 241꣣t:M~|_G"2cR#m`96:6$O&To l(n2re{u(P:p"1AV`<):lˆm;wiƗ'~#c 1>1uyujabbxviORg"ݸIP[?R8t"a" F'q,XĘK$NoJ$I%BĉT/FWngm/eK8zlccܙa078-yjz lboRU2λ~g9|FQnWM:s ccjm8J JsF6Aٙ~@ SsP.[=Bխ$gj/sJ{be_,`H* T^5_8p#V)Bo[fb) ` YWH{ 57:#ڄXYY{9rDWMioK6:6T};$:RL\·>$<+ ]"B&BdJ-7X]7kv.CaGDtI(L! /&;IF@qY9&)N'~Ky;hf7KR"AG|C@'9%3c5n|4MT.{)g#?ݚXlmRsODZQ(n7~|4|)!U"hG@ʙƤ[Bv\0*._q²Y_JL$uIt!PD@Xsn3ق<Ц%\døH'ZfloĕLrz^Wy Jg$1fm!͌0,g%DLOHY0TO1LN•陜{z<.K* tmo":TDu=o[q yGQ$}CiK{ lDQL#S^0UT %!$2tQ1m.ȳ9+kkV"{P(lO]NƦdlXc)⯯Gj@^܆d ekqL'邘TSҪ1,K'g!203XnUt7ͨwـĹc2EXqKqlIKts )Cmy "ulai\@*S4P򁣤-B|bFCAi\ 8$LM E| RkZܥSyӒW$ƠD tI !bT4VWW6LYayeBu6tN۟B1кap*. I_!eI`hp~J'AFVLdbm ղlȴd١ƴ!dk9ko9!๮*Ֆ.}D }Rֲy-t|fwy'Ξ=FAHeSd6Iį(׳,/?*f .ߜiB l`p1@,0TvȿI`qHjE?rDtrr.fBF Cz.uaТHj2N O7sd!t1ƐqkP(F!|W]f,y@Z% I #mWBUZnctx.,`xxX뽈),X61 ƕm' .29P2c#ٟQ@sPzd9&2Z߮{6<B(7-DD(؍:K,PL DTb(HnY2 f #!HڦEmȹUk>)QZ嗫ʳ*@ T+qP̭8ylF^~+M0~#\Td,VШ`Y&%yжmR+yś$=H*c?=Je\vMθM;lDivCbY u523u["fbh#E|U/ E,; ؞ d2 Tr( N%Ø49W}I?=;m߿rBqS/jl0jf$aZ]]]t|%ZYG h_bWRU!_RZosA*adǒ9ǧ'p}b}N=wY~:J"t [A J,3-W+ ݋ٮSo/Ӕq0%HϧJd`Hw'ԒP>QƹR,H|FlxdY0 K"y8HzE6q^3o`vvCCt:)u.sNcApؖhsHɒn?DQaphH9S3.ADZ'wz~uA'Ϡ{_o X,hbxx- cR|~fEsqqqL-  ~EOeBP<4bڎ% Xrc 3*@R%/; us! Rm/㞻߅ 199 uq#qӫ8H cB`mmjX2%n$ Nuځ[}}~eavn^{zA7`;JRG~! crV[(Bلŋ/}v݄X [Y!u֢JBdxEQ 4@2KU"N Ǒ2ԋ}нVzFQ7<8t <וe?Kx0띸P(Q(lno{piI1<49H<6IƾčHAnYf?q,.-{{m(Ν;T+DΌ 0T@XVV!0wމQ\xw144iaIK 4ǘ!c?1ꍺa0LgMk\ ^*7r@X|ܹӧOs]iZ/|7Ο?~՘4!AQe-4B⏌sic"4m` :/ǡCVdu>KMD"=QNK$ڞNhEqG mQq #SXC &_jP(]wKV ,́Je&wDaǍDXYYCǘع{SO뺱e6pYV[^[ ?ݓB`yyzC $1p]lþ:p˼;dZZZj;vǏyaqq3g\Aⱍ4%BZ@,J`=hݘ!R1j V]I\59nMz9,# BU17TqɅlPBXrQRmB$Qq,Wm 0u6߿JeSZ9å˗ont:JSPVҭ\22iu@ORzk;>&a>?z{/^X5+qj766G1!][uiyFӐQllT c(J8w<Պ5ug=~>ׂH}:aeԇ8?.@6R %|ЋfRy*&~PRᠦ@HhY2e8Jj dI= >J&,Tq2b !c\zx"._ ~Qum{z~-DQz5d1XO%'mR]шz{vCyu۶077SN}ʕ+4-UI}h $Fl!RWa*.HGQȢZN'%yJw ŗg ]ˎeI*Se1z*#Ѥ03sTF ݺ;cJ%T8"4O'K$0Мl["148ruw^ݻ> O# T[hZX__GjC 9Dxbȅ$ܖ~>X e5HˤH.Dpcn&ɢ YyX))TcH)%NKᩚXAh<3>ƹ1??CM/6dOC FFqHJ^;Bޔ| t|mju\ׁ-8 Ƙ u.*e"}Bh{L7# ~1\ *-C~*^}գԄHq-Gw!`:OEa()ܑI"3D@q(jLZE0l/cҹ{gᬶml %&8@R\g'Ӟ^~5,,,`jjJhuKA*w!b8pssՕ}962i&U;ID_X}j QM/LSRd$4N'VKKKؽ{-H_޼|w;Ҋ+9v^g+3(")RJDwk"H1?x)X-l C1PS-I?;xws%&Iex].1,.J; laT,b׮xk2Kжu\}1Ȣ|coO;Kq{owAPon$p2 3 4 \xqfffY.%@ e7kP rP&kDz,IɅi;DbZ04۱ar *AEaePhlDA 3}5.ǩЉ` Q؅(B=VVV t|}eH!`]̄fd!о{>NyC؜_&b~3$҉4c|zp^DĜc#s8E iέƥ+YLOO?wyوoS%)K$$2uȠ)"!2u@r'76ćLXP9ȒU?)7e&0 T4PtC_yt:OmΝE{ƽ4t"gpD@Odf7ot4BGv#{zD8p /allL7*~_2:.j"XLl#DO,t!Ȗ"M}D'ЁC4$ЂފKz ERDı>E_]Iz'yR1EOV<˱<$ g eߖ%(݃Ymض ȔX>R Oor~SrQ:y +O3y,a=yPH@#Iܹp]##u1;;W~1m絶fxGhmmj@aRBH3}"=1Y T. Ol#,<В⪶UBe2-1pg)I IDAT(_4FGG6 I{b4+XjݍzznY(ξlL7HDi|fhu4f꨾g\<Á) hϐ`+4yײ׀#5_s8,L{405u*Utqĉ?Aÿaf`K,ۑYw [@cJY= ~'3NNlKS*EXݔH:iAHjpACT%4i9\_?Z$:i/_y8PT$a C;n+zi1t< za~nȇwn}{ 2[\1,./LNզo%x,--]gyc $84Ip7 vd"&D!QJ-Dȓϊ-@~侈;$ 6>!> BI j46"<q'ȊȝE$7h^-j{>̕ia;y,=mv|55BqϦP(qN@F.-`&$FBCg!C@@cnD )!ۀPR˯ŋw^ގ/-g%L%ŘI蘺w#laxhPFA ;Ά:d$5E~ {FpīXZ\@M7D^iUer)E@kNvb ;vvh8V+W, _n4uH&mo+lNZSo⚱*1[H*AE֕ <d͹U)4A@RQGɑj2qE 0]Pk8D%o|c: z$q7bt30lZD]i{r\ZODVu TQk4 x+MC E܃c~q ]rF8"T^{$8ؽ{ne@ڧ,q5:uꅫWbq7[Q.{d}ddP-l#_!4oxG(Ug , m;8zY&A~:lPAˌw6#@(;]IX IIE0j\ї033UijMNJ*& D!CTPo ޖ7~20>1Rq btl j#=@ܷ\.Av:? C; 2bJmip8}tgjmr{8sn#E8bbA K $ژwYx1PD6wND<=581<<}#]XFՔ̉`F=b)&R9@00f! |||m YJHT 98ݖ%6@ZE^(xTg$M;ȌIR R߁ P[[]*B@zwTBX_]Ù3g{Fyk,pp9?sOA70o3gNY[XBʘd8X``L[\Q3DD#`V d3: ,Jtl&ARߜs\p??=f@Rcŋq)ܹF x7m,2q˒iD$(waa "QTl6tyuDJ*ёCC۲O t|kk8y خ{&4g,.\0Vm& Nb%b9~+ ̙~*.nKQod</c :iWAÁD'O= e_w[iLc 5H"{&||LucD4>R!7M cppa=XlR@3$fW$92 J`Ն繰8ImST܄~ 8?ymJ"A2ΝR]:^{3HO@בwaϝL*2Qov\@RhKdXKUX.+8M磤钓!~rQHfK~/ ۶ q/9ޔD$ /yۧ% $R޴;G1sΰ124 hwdkmLBu8Fq4FFF01Sh6rʙ{/tsoVJ@` /G161P*lƈʢ"J.$T]S v*iSn 1,(*.J L5K'F&yw{c8ޟuMDtr%QB836[a}_=?-.uUK6$n{~ڦqbmM\tZv°*fWMo(Er-q@V$ax L_{CJ*2C ^y™lJP>`)5`Hʉ iX/XĈcllK XXXXA'޳¸e]{b]1=L? yy Jd(LYcgaI (pl,bmny RjW7N# ɵ.j0ip{oYM\0ƈߒ<@%=%eqm13}S{pP(:P/?j( ֚2}UqldYjKfs~m:^Y^|Sa.h0d~/Y# crth@ǴZ-TU]K?}]tiLB:.|_, b*BiW>nA"P:^u`ttR'ʎ;3vVC77+8  U W.]xhmS*Xb 885m&ܒb Eʴ}e,/xUc "_\쓧MVa/d5&›F4.K!qU s?qӪCw $G a"=˜X䳈bёaxO^?4^=AȎ9Zm.EG辍BF(K<|০_zY7 QDR֕K80u/."P@<$G9+3:z8>c06!!W0 aHi6\<{|?>D 9p!:t+HJ/ T{HicYvlayi33W1<<]yi63V%,.-1]vD2q|cٟDW B"p3 >YZP$ϟ?wf` K%3$}݃s΢^[0m9d/ $TyBHN$ -5I0,˧u<ȳS`w. ߏVIJ{BZL[оnO{ e R "fg0::;P)&a)~B3`ue;vZ$-hp= ~sÕxONNbddV*h4s[ZmPH(J[6= wBSQђi17?ej*ʥR꺄&15"f o6X__GKU8VclEu7ӧ3z C7wǐ*l+cLFP0 i4 X( $G囒c~҅tQfPE)KgiUu]wO>(T.V5TAGir]Rh)P+ͩ˦Ų9j\jF:Z:ٚX,u0ݧ$ B0qHQj}DQ sQQ)aێn2!\ž=HHM c,+d<&93Ƙ1 j1wOc:h@Nܶxdd>]we޽èT*jH,{"q x k>ԏebRIR ٩9ExdT$W߶4v51Uݽ[sOsDc6VlY$mHPPp,˲$sFs" m ۶c˲b۶#qbιpTozu-(Z`qt~3(d۶0W\G~G>yatrz.SlsIiƾ${V6d,wɔd1t:L_}{`bbpDQ+++_c$MC5Ms )y)e јQ,8!1s $-\). O1U(Dض-lj=ϋKR8m;!9m)DK;C4a0zar!m[ÕJw(X6oĉ{g  p$&/k@^0ԍfw8J}P.r\;~JjeY7@I,!E{G]em3۶8T*1Yyu]FߊPhvG#p]nY!I``Y,KX<BRIJ%8<j>A]_V7@= F!DQU%HpVa'v޽hsb_0B/U!`k}'K CrR9G췿'`k݁ w]ϱc2gwh~l>Nwk|)%|>Qy1oyyO}jfaaO=zUk5Z-VC/ roPs T+W /\W'NݦaӁ@[^;kަsԛٶ{!٥DQdk 裏7::{$( f  /;Y& M}FV19==G^{'~驧lCڢ->яbzzF C"ٖe%?{}#J#ye%ReY( `T׭|3.///6;;zv ݰDsf 1Jaʕ+8z?KO=Գ t6 7[f+lw y4H1 ̆FK6=-%qz *BP?/VVVO~/9r$>~?BT''eJ7t2N0{{>V*"I.tj3A+Wqѹ#G·gPynfN7%f>۳P~ f:N E 1ٶ 8 R|FϺCb W:koAd5u,.,ŋX^^na m{ZVۇݻww:((CNT6"6~Z@mkď~q}v/_LV;E?00pĮÇcǎpjZmCL~ %מx_R EҜ[ Gk&Ҥo+g<7ܽ~ouolK Gy|+>ccgSu>pر˗",j269x) X,q=Ex^V #o~0pܿ Z,a۲LȂ#kkpN:u… v̙o1ƚD*^^^zDRA*1*,:BF~3=-Y oٳg7u>yczyfuN yk b17Wム\u|Zׯ㫧Oz>c !Zuyy'SSS&''1::B˲e7vNGIM$8] u quᥗ^Z{;k ǃR@V/--YZ͍Ha_}}LLLq=,b\.ö8NW$*uno E3ϻ.t|PCм7{fic333ܶmVV-q:w/2dx`tj:jfggK/=3RVfzz:>p@gddğGGGf`yy !x⢳bh4.~[zb||C,..> SSS0 ;QEbQ P(s΂ lY{}}ݙnq#=~zn{7<kkJbj8>!7wiDY2<gNƱcf9/TQxI^Dfϗ=O?͖J y眪;їKʌb@<@9^dcgi'd ,xM ^=lgJHF3cG~'1soWEӷCktuU:U}J>fii ̿_vꫯjdpE|饗ڵkneepKKK~yyw<{_~q"ӧOÇ:| / ae9~"NsBQO?<,..޽{իvى9疽=}D022ȑ#211!Ν˹s,Nskf/hGe C}ɳҀih55Pk;өS^{[~'g'T kF/4~*BuSD#Y;v믿Nzozz'O`}NgW_hg3IOF}10^XvOd({۶*SWU#_&Mi_z}#+z/4;;{ʕ+677@tZ'ѣO?)ӧ_әɟIc>6Yִ婜C&if l+ÛIӰ_ᄏtΝKKK/fۈlx,///v%X~vA~ks6۾u1lŬM?cӊk3iכ4y۬[(Ƿo߆ǎ.wDG?1Fpεah+iK[Ri>q|J82ϾyO!}iG;ӰϜQYPowzJ1_F`uvI"msS֛FJY&"C{H 6zk5i8 6Lբ+\ r@Ԧ7J7A΍:isnAʐ7$ -FW1 b7B$ڀm[4bJnNbȓޒL MBm&VS-ׯC"2kv+b@nܒ}hIovM7eƱ*EK vqQqDDH 0?30TjnjFzudߤa`2$%ii(".#"FBVmٮ͠s@zP &f6`7'J1گ)(L )zN7]pwHJ j; >j|!R2.sn{{o@00;碈0"VBJQDx+c5``6 _fЛn;RG$Jӆaj~b[PU$";!3бz*FHD9"2c$",l BmV˶83 "z:~} ȵU`"(2sDTs1*!FP P*6K nAv4GH{@Bb^@Z@(9'D/,R{K#SPX"cG¡C3đ~$s;8~8̬y۷os.G)و ":fz|P~ Kdy.FV` ' 7uH >C8 zEoιg?hWO) X=3<ǏؑGW@q'}~_S5D]`yy8zDd%xԟjS,x*r@*be=s9H !v2%Cxd;loq{X_,ss"霈#bKD̉;`ef~oN81;411ADHMTZ!,A5PoY,@ "" YD$h`NӫbQ󂈔1R󂈄Xb9EHo7׼As]URoA "fƪ_aDDeeYF9w9s9"z"ʈ(ӴSs^L2`deeōOLOOs=w\O(uFhTgQ7n>xzP%WR1t,_i}f撙{Bi^ !1rYD#^9Aǖ^  `|mJVߕ>]ߎGGG{OyfY洛(W"W ӴߛsH ؉1z F|͛VmnV}3chpf.j\mjmV0 oAɦՙL!P*IY뱚\ NvkoW& (Ow ZyQ ;y݂WR:JD,2"*sZGD9щLu81"Bz |;Y{='(E%ƈk/?"F" P9!̲ < A5 4ilPlà 5 Emsb`w^x0 긳gc%j%cV@ղw,˨$!.{z=)B>hW^FmhHϸ4 |FHD7 5UV?VvYA\;l|gvUiX X!$^%is2hա=)RBb]}!C:<36*KePh{ANks`uEL Z<+o~ ںm;.Z]1"Y>訃ZtDʲw}gɐ)lT Bn޼Y6=*iHzL[\u4 fu2U]; !dadp̙CHY۷o|{bb#ψcz# /"ng1X־).@^ީ+yCz!DF/bGeőwRRZJBRrmjc sEpJ%`8|H((.nn׊;r۷3}VIel6$ıGoSBV70s nYz?bHSs3 0,<  tyyyQmADm6}GpxOv-͔ӈdJI&4$"=f8z(z=5FjDGGc8t(֮h4vHJ%* JJDTR)Q*v8DީS0w2F;q1#p˲$IhZ^ƎGqQEEE^ f3&S#uuu @VyNA@r!-MM|ABR26B3ٿw/~~~=zfaaV}А{7d̸5k6̘c8}4F#E^{|꫹dlBCC]z" LI) JJJ8vG!??_?O,YBZZ >`)!qd DV0%gz/+.u<̙3=k׭#/?*Z-7x# Lmmu:>˿Ku<8˯QpTbc),(uʫ?'44___9|(;v#ρВNE?z l4w 0,bcƎ6;+,w閲t׏v^ƾ\,]s1 ,Rɱ\Tpx.eDb"]~%&L`G梋."11Ǐ_`aaaDDD`g_sNvA~^5P[[s?϶y嗉%P ?߫4OaQwaa!|5^Km,+Ah?7pUniG$&Fv3f Z‹.)( n džǏsیȩoa3idV| ?ƚRRR$8$f֬GI~zrrr B~^ ]rl}DZmSS[8:6 !FVuH#ol2LgҤIxhh(}Wrrr0Pljyes2vh_x>> cvZ֬M7 vu}w}wDEEQWWӧ] 22kV7ވǧMyaa~7$yhܩӧ6lX:DDD||-9C9^FDp"EpiΜ> ՝Çgذ-VFȑȎ߲-VA* n9Jj})v(=;B$^~eRR6clXo.[vsZ v @W^BODDDY-[cq/'e͝;\@t8E,7 dYBo;Jn c~]ӝx;;[?d2۞cXp| Dee%U(а0ʆ)p2z} oVf߇bk;䲟ވ!*+">G|*L<&N%R{ygAQ$$$PXXeBZB,kFvSTqI}cĈ|W|ݷ>m繀H^xU?nY$a4\:a,Յ㆟æ |D(Eν/ά7vZκyhCd|=999DFFj!z_^%;LϏ#x'ÁXΣcL2?_oNw#dPQ7 tYzU,j?fz w<*-+Eٵs>j5Æ so9,E<яM$xGj:#78C, 33}Qp~SXo5S8tg/-LʨTW3Q}ͷEe <_,_γyfN8ȑ#qVm ɽnPc~H}^᪁@ywشqw>^8$A }gISZz2Q6fJaߐu>[Fccc>c,‚.3f\V8d`Htg/B|!e^|E 9r(ƚpM,T.P6 #=aD%wߠd2pK(//gʔ$J% M*㵠AĐAH뻝AT^g-*N&aubԩ\{\ǘ s/r-`\D[bxe9B¸뙗پK}MnظǎrMe;EJJ B+VaY$bTju>QT\ټy3Ud8@9[7?/3dI O JQ3ƟqUW0sB^{#SXCUyt-ZF8j0Lu] MA 4, 9y{#Gpdk|vOƮ|;m0aڸ8ń(ULI<"p/8~p566oIOOgƌ4-唟Sn* $N{~ ''N8G="ΣHKKu ԑ??Q–>c\ )kzW xO2']f_ ***YvGa˖><`:WT*H33پk7 U\=f0<1o?zה3@ /mv6)o~렐 oΜ9þ}yΏ@-;E0"TJBa?'ehETil? 6^kV9FC[U+>fc Ĵ><".9z8pE.FZ YbDY}#ug_JBB`>".D3 -,$!eFwЃPdwcz]'ZM`` V Gl0LTUUuDUu5&9$b4 9#Y4Z$ IBkry$T!<&&JLHADb z1?;PRRqZvf %?MCO@f*[TBXX HcV%44jJJJhnnz]o;X=Yҹۘ4| 4Dc$*hhst6ϟK~kqazcu r knLTVo (N;' Ah4 9wbEMN7{~ Bf`jl8z}>..5SHЪގ˯Eqš89[3NlౙL  W>yq(6\C8LQ!==Qz"V\jC)iI bJ0à Gq|_|ZO)_Cb19\̃Gph۩jxx D'Ou*!m OJ%.],QIơ;J>_?+ˮ~r5 ?~ć詬7QYHU}omj,*j<ѨUds ?] Z݀URrJ*iD\uR'Rk41}+++j7p 3\p 1,彬+W~Ə &G22<(tw짡l6_C0%ZrXxS5mpyvh4 oǗ#G:_=8Gstqqq,X{ KtJ|tǪU3~ W^;W\EPQz:NPUVJCe9֦F'MG, h --C0`BAqqqv`ƒ;דLxX[BN I<~oٲooS6sգL9˯1 !'$z}jbxs"@^dYfgcBzTQƿ-05:\38Gs]!tҥK7o@eRSS;wKp@Mm-E1'Z-FgSnXw<hڧT*9܋\;ѝϟ?{hy뭷XjjI))12yf1HāY:ũSP*tMp ĨQxyꩧ8|0/2w,LDt*+-srtd xZa0AT%rwpwN@F{5k2ÏRD!*$L&lHL$99 iiXf>CJny %%ɓ'#FC"=P }'pN vz~Yٴi&L@obe̜5@DAf!@{ %9^O\\:+WS̝;ZCA"][lq=AjN Z3jL =>N7ocɛoq-R !`@ł,.,˄0ydd___^piSyocM1|#Xښ6.`!@Ov/yj{m6[R?!26[KTMW h4r_3z(|}}LJ0F$Ļ\UVV{N$??EEy9EEl6 RRj쪣[჌CPMm-> S!pZSSCDž:%IhnnFT3j"IRFO?^㨫gXj""P*h2r{r9yx嗰X,|1nxjjde""<9B~~IHe+/'55u`0P^^}B?\\CR۬Q;ٌ,XUHfbtx{شi.$c0&a> =u۟G"%%&n)+)EKjl[7ٌQ2seX[ ICZA"`Z1lsN.OܱtRϟqLբ XmG1q[GJ]UXP|}}=-}mAK I6Wl@8MEE465yKO1}zcT*WQ{,.j p ;w,]ԫVZ֊+4i23f$;+u~9F?(Jt:`'XyɄbA+ebAVi 8yj%&Ah_cHHB^opDHn/SKljsN)=e9sp) z .3֭[IJJ‹ge˦MPYYAxDF^ 662*++iyPPP@Pp0#GtGzǰfs3$SwjGbI $lX$F v]V5Y^QNii+2<,|Ȥ @ZPR^Va^opmK.5k0kV:9L[3gs7s/ $,dƎbƈd"88aqoGn!yT >jJ%^q9Ze>744P[WB྽ԛLkP(X%3gbDr 55F|}},pNi25"|=,xH0!^׷54SV^z=7nl;dYߟɓ's,>},z|TUV2v8Fj&r#s^6nҥKܿX||d:a'Nt=`nK{,#!ZFl6 JlVn4,3E477ST\DTtKSXx8eee? 1Qբ(/$C׳`222hll$55O w\dd$(RT\(*(--l}|2S__dI6#3f ˿ѣG,3zhGFr8'dFBBmZ\Ȥ$f3* Q{.67jvӨ=hw 0m4Ǯy_KK%>sOJJddd_ʅ^׃'3'00¢"55QS[,0˸+0L44؈$IcXF$PX$~wߛB/#"B(İJFS#~Hs`DfCElV(`(G񉔜̥M[$zAgBW{$Y<-ZӧOgTVV ^ȴi JZMB|<ÇSPXcTVV#*Dh-d@TP]UJBR B%;a 3fAGz} y f"`7;EARQ*$ddADlv&ٗFs ͆ffY FG ,BW֛)_yѣnN5E5[Ï>q"#e˖q>3\z 2~xƍ׮Ho2b֭Ԑٳ n>hJJJY]vj v632yLΗɶkM7ў j\n32AEp y][+J%jZ6ddo~jjkٵk+Vӽnc_dANf?:6;==D}}23h5iĠ[^_>ojCވ?33kSSSy={h=RZCX~='N`޽$''nݺ!CސaٟĉQ՘:͜etI S KB`hedxvCʕ+1zqژ *qˡC8vl<[ؘX6+o.rϿCPuuu455{Z2AP8)p {Æ~߫%~,X`K.8[+^#::B@ 'OСC:t_x ͆jEe~L4 jjj\)CP7^]|׿>pz #xL4ğK/5\&JZVO8-[aǎg%;asQ(/`ɟ0zhNihhd2uK.p``c[)SY ^x_#pBt:ǨY)+-c~>}^5W]bn&`PR:h/q?>YƯ[DTTG󉏏+>F`'y1k,VXeشi2|}}IOOW^'"UUUl߶{v#IƍCT2qDF#1F_8X$6+$:_D7@h}{qn#e(JgΔ_t*+h4u;ƌn6,,eAxK3qxz㝿ͥ_q|vv.C>k̮ // RAJJ =sClݺµ^]-Y]⏋wqqq]'QSSCff&Fw(bt(2+g Š$tW\ze̻n>{_#y&_/Nm|5GkgV! $`XڼXFF9?^u.]z֚xGǣ>ʣ>J^^%%%ŵ< w۶Q]]͜9sk\?cvWdr~:M#??ߵߛ՞69z2 rPrg de]zm\xхX*J,~ `0)++ӾdG׆ Iy̓)FK9˗/瞣坼x<]FZZ餦>fHvw[ `0@ݨѣ7iGNk[=8^Ozz:iii̚5Ѳ]vQRRbƍ#88]lflذ&OM7"L-ZԮ/ #幘Bw=AB\ZBݦ 4m_peq GSS;vlurxC?;8+oV .yNK;Jl1Vμy:\ Z V+\@ƍ-lܸL>b&yyy<1P8Jΰ+W}#]'!JQ J-JB>eoa]ܵ.&OJ\\114- zAaBs^jر};>~>>^u ^7o^ÜCYY'N@TP(EIIIm6bcc=z4aaayܰ}66oL/h4ϳd4t2zc\:i)̂B { DE+\pܵ`1k5gR}B[x,/pXfruɓ_P٢wzjZ-cƌ!!!?ɺuϣon oɒ%Kj wEht1?lV_p[+in@I޽GrWrM7T*17{H5s8;y{1OiQl'O~ rGرcTTT:X~~>'O8gs0gΜaǎ.'8]w-ʕ+y77 #E1pjO1Z΂fʴiȒ}ߟT=n){J%oIHHNXT*Ғsӹ뮻PV+ۄl6'`X(**bժU]? Xl˖-Pg`gx|5Q3ޕEZMRr2?DScG_Ux~<`ZJ% zNZ???2GW7`^]w#M< TWWz2$IJ] TwG _|9V;YXx1frg׻fkkk&33z,wi{?O[[],ews f=? B _A A$yHv~_\W&baÆ l߾ǏeКuz/^?ϲvdNS@pgL0 g_a1  ȲG+ }07=ƱcǺM ;v{nٸq#EvmʽLېl6n0e4lT]]MaA#[bZ@noG ` ub'Ïؼi}%667xs~^^6m 쮢\*i3lvv{}`;Q&KTUUy "|0@/oM7E<<=.8reee}hd۶mk.˳>{ QQ*OODvl{P3 HR[OB/u &*+!D|{￯vA`BbhhX~Uj׭cNw;_G+XV?Nyyy L=ټy3555>'55 wkl@$ϜK0~x22' $DIb1SUUن(++SA Pg(A@J}{"[; B>AI%n&rz`E_JʨlCNbIB; >#MUu5?1Jg 3-=455d꒍l `?sLy^+,3 {%@RGFFFJN3)//GTvMAP`ZU*3 |2]yi}||ϙ;odffV𫫫ٿ?lݺv`D$di@I@%pÍܹSU( nKoae   @G^j:t~}]Hڄ4ƍ|_h$++SCCG͛7~Μ9~<\Ԓ=7 KH8cXmV&OBdd$ׯɰ=-f v`BȲ,Ï(9}oWjusecbpɅ'3gpȑ bpqN>́XbUUUٚJJ!*@p$K ,K 6oիWzJ`4xİX&  *c) [ZDI8q"1h,=Ϝ9ÑG%|Y)((Gwy9"3:z?"!8 HHRüyؾ};999=~~l[0 κ4i)p@u $:9]kHީSEP̜5X u3ڰɡԫ~JKK9s ˗/$?OQ!ABE3IĬYt=pdMj444of Um h3`b`;xʚի?:hrSL6!U ~AbΦ̫ JJJXr%;vAZytа0D HHvr:} %Ve.ln]FN:ՆhZL&ԾÀ}D1αqՊ2OE_Jb-_2P޽{1Lm&*F#k׮0}ƌ#~?0yI$ ՊbfJަP(PTFח Q]gR}* ! I2 #+XnmmXhjlBe @R^5ԷؐW 0PDž]dW8E~э:Ũ',~TTT`4Yz5k׮u&vh3fϔ{NDoZٳguuu.CNN(4 "~~~򂂂 %::>i`B!*/$]8Fz'#HIA%zgGtĺ8*D8`Uw  |`Faa!{*T:u:ӦOG&Da7G9}0666k.,TWWcXX|9Wzw2"Abݺu޽\Wn(JN::f0󣦦Bvލ1115] J@ۉZ\AѩpHr#"I #FpWvmחiX,4_ЇMm&(DA=\DQd{!6Պ$I._cc#'N믷k1cO=T(T*J%EEEY/Gz*@ fb0\b ff3& ؒ3_l6X,(JT*uuuݻݻwĉߎP.1nO]Chu\%F$J'YU*)hZ `8P 1epfyb'kߓ!MݵZ-TUU!I|.ٚ (Jo7֯_"xJ%#F %%1c0f0 oX}}=9sRinnv1ill+V3k,.`@^#$$ 1}PW8t IHH ȸ0qd"g=zHN `[G5}xإ c1w+ uc0 . swJUUՄ{Y'HHH ::… o\$/;QJΝ;y7ؽ{kW*9I&q饗Rx7M~~>3gtMAګ|^ynJAA3f/ɓa6]RH`` QQQTVVrq>s6n-Bddd0~xGMM n@|eܦ6\ك%IR:)//4CMM eJqHԓO N$Ac$?xa IDATqqqĂKT^s!n6 @vev,9^DdAduYfQVVFYYYϷX,:`PrGAb:NX.%_0fX-JpJ Bzmk7vYi*$y~g w~JhUѿhXqf{4m8ާ[oXC`` W_}kǾ* ???z)ר7UW]FcWI"⨨(&OɧNq̝tvYY~YeĉsI!66 {ŋ=6:.bԩ;Zxntw '2U^{5&''s=0a0RwPSSGߟ9ESSlsJ"::ut:rrr>|8:R?+‰'xv.5T1"1ᑑ:x 샻7ww) 2H64rs6:ajK>NRLޟΜ9}$%'6O Ä .p>Z%Kx(+0%QFӧ12}||صky: gTVVR[[R$$$hW#ozQ;֞\SѠtK<=z'|W^ymr*e}}}C6 ';+oP(F=!5@qQq+eSǷn;3fX"""κyA#77_~ì_턷v:pjjj\ NV%99qyFֿGÇh4?… O>ᗿe` 66Çu%gJ&Bǔ@Escwk$!~̘1[ybu 3~BZբZ,XwƠ`Bݻ0))hNAx]#PPz+111lm#C744c򨬬d2ɓIJJ"88h=ǎGr]f״g#!!LQ$&&r_0mڴ6ơ RIڄ /4S,"{n_vM$IbIٳ:---8plxߎo7 ?lCk[+^wU8v`2 P8(۶o?"״L+ha`۶mCAVyP La ͋aUlD"lbݐs@qO~1`˖-PU0 /]GLzKpibppT2Flܸ_p }pe2 Xt{},Y2Þ:i֬]ֶVxJks #R[{QGWfwt + d2{ξP55Tq&$sg0WW:;;}>!Ktݺux[*{9T* !LV!'pСP=@2֭[E]K.>?044іػw/ ֮]ngf/8-[eY'wW,Мbǎ+ߏcG9ցp aLD)T1`ӦM~䩓5ld2o] a1!h+LXkoƜ횺AU(stCQ֎׼5HïC$ItuuٟsN7Aww7199)lАcJ).r,~އR ={p}ATvRr9]c=^\`s~ӟXLƷ!\>B 4Mʕ+qŎ+4ycUqƩ8!T0ư}=Zmvƒz1.zAV\fK h@ Y[ڽk%Kfڅn` w 9r`5MC*_ϧ$=}4!?1!}݇VmojߢE0::*b⡇۫ \MTB<(m۰m -NWcp1,})Ty6Xd Hicc"-J9֬Z[y3@ӴM $4@CCro tw/s4%'!+W*Mttt_4,7A?WP---uR=L&tRؔuX2* իZeY(ˡqcgZp.+Vp:+ qcBL6oތU~bqW_*,B|$e?߼QUss<ȸz<ӾCCCpS>uFGGSOaΝ>aӦMW-[駟z{{qM7aΝU\ݻ1::*"uttR-[رc.K1lbbbBd2D[ms n`>Sb F)zzz}2;K6nitӦMǃy#B!+TYy!`@Kk TE !XnTlld ׯK/M0::ZeqF"h"|c]O=xQfٲeb/_D"qQ& m 'zWfн[pΜSJH Ĝ* o}kd*EQVBl#0,"Uŋ[nLjˑGaX+Vᠪ*K. dOŶm`6}YJ%u]pVap <ؿ?geݺu袋f6UgXH@( QGAOf@4I2ZtB}}}epQ ?oQ!(ؾ};,~a||v®]j*^]]]1::'Nȑ#b_Q+ŋkq&Hv} jTڊ+_:<ׇS'OYNR*G$xA9!IAOO/>mܾg&pZ1|G`6֭[GB4躎A֍xk֬e09#GLٞH$]4mFqupd;e f6}UW4M сT*bY`bQU)b1<0D`A9K7_sV7v477#ɠ R tgΜA"AX,kbڵ011 RL&E6*Ѣgh֭w܁1luAmnW\=>ͅeYyJFNH$r ,DH&K9ېH$P(GF__ArPGӧEd25Qd`"$Iwq _4"J=ah6sHύcشs3EYP.T*J83-Zt^ T*VݻկyfXx<J)(.bD~8pl2DQXEAkk+R$I HTonvvr4 }k7ccc?-['4 8Jf;NwY ڹ N^y.zMh=g7mO!-P}'?}C((xpx4M ~;۷]]]袋p5נP(8}44C,}Zϒ়e!J!͢===xgbܶm444ۧsعs'nWUL੧J :p:3aϫO,ioR Ja y;@Z[[qwya?~;vM|Hƍ|TUŒ%KՅիWEP@.(³/ ǖ?J}x-lEէ3_+8z(."D܉, H2\K/䋗6_0ӏs6gO~RJݻwc߾}ضmV\CJ>,RԌx6#4hV|Ć ^zA, ~F+."O(ht,pHR(57S!Zdr ]]s Z ,%頹gCw9_wuك￿r^UUqw(pEk-R3|; 9:H$(Kd2+D7n馔(Y3q$+\s58x v=(;m˶1tmZ[[qkj@҅z챚~_W%S)!<+(ȥ73G~dFl۫cX~=֯_!}i|?Ui1Ӹ1O\) y7/ "?gR@`>뮻eW477cll ht9Qt`ɒ&tx \ \{Cތ ͯ-yI$յa,S Hk.\y#֟dq=O<۷'qs7P_OAFdǎZÍ|;qṷ<v;<|xg,F>d]K/Ҫ\|Z`6=*wbb"?+ ,~\.WspÃNgYy'-ƭ:2s|w=1ΡxUǩu ۶"!184M<g>Y} 0pes8|0nYA?^ќd2̂+=8xU|?0೟~.|Bø0L :N֐NcxdTJS\PZ4c glR3'9F.593 l0 :5#3qj P`ɬ|踘Ԕ 3 IDAT_@8~3?B>~5y^p.,A__nP@RA_alݶU% [p䢕+cG@ e-/-^-c x7cbrwmxYGg?yG~mZe E64=vlst O@IO\__Sӱ8PM~k֬Y_!p΀+|{kt.c1ic1$q{z/K5Y# >IJ$#(ك!<8u8Fg8O:nw3عslP- ?Gyd^H$li7YhX<˗cM~_)RA"I8 ?Timm.1^z)6l]סW*0 ~<_^xyh|7 P(>Az뭸;] PO} }}F:3ŋcͪUhj̠yQ3m W6o\<1`V֮YI-@Qqgti;nz ??,R)+9{طo寠cu)6{}m~s[6oFssVUW_]WwLrH$+Z0_@ݱcG'8E[WgYq466u8ݏ?+V̪Q}}}xow܁[=3A# x|7ԧ>={̹˷_5W#ӔgǺf\GDٸ-Y ҹ.(Ml3P{00:: 0dԔ(ֆAwgVu >cϞ=뮻9e~Y%yz42MM 0M#ύ p^g|S؈7\hdGxӛL@<G;+@@*j&i˦3kPL@jpzhDCCgo7#Uv`[oix)O7ߌ[o[Tpo߆Fv/iG>G.7 ^ ?}͹ŋ-gZw3FBss3n]&kwhܽg$Β3)Hײ ?zI<'qa5Mkk֮o~׻T׾??}Bmyb17AhllDww7֮]NbnJ:e( {7a^XbO~ (x:uسq=,~CLNNVՙdZa5-f 455pX ~{0000/x.?硛l6~;zJ`-!F$;G+Yӟظq#Xރ=3 e0- e4g˲kӂi` O?w0 e\.`"7,vU( 3T< J),˂m۰,Keòz{{`fa&lM#T3ӧ rŎPBmLs5&L=26m¦MH`붭Hm ۶kԻ_9=!" 4U04UEnbDCÈE#\0M:r(( Qjmj#1 B( 8e^sM!HL0Yf5cθ)lJgRnLC40J:_OO>ם?J ]|1Kl2l[:6-il\EPEVY aPUgQUU% }#mK|[e7cCS&>۹3<26qJ%DQ,ڊlSӔ3׹n\stvu5f AyC-/'ضS&6l2$ɨHKK=ahkkC6C\mcll Nr9<cX#` 4UT*Z&t'xaxXp8)7x/ny]6T01ضFR(Gm@. |'h43 Jtɘ.el9eJ&LLLTBFiUB&>𩐧ݛ&_U4._rJiOQT*X_ÿ$PnsU}S\ו׫u$԰k^ٺò%7|G}IM+-N1&`۶DM|hl!mx@9ss#SJjiR{1^6E. _S]Ku[~M5҃_ ! (Wxi-H$T]gqf @ɤiZ'~JiG~UB~o~ӝ UV :"Tz(N.m 0l@7Uuy;I=׳h(!x͑_UTq8=0p2Nǚŋg*QcDQMUcLL`lḻ2k<0PT4ć* 'S>WAh#2B [FC LL1K;׳i j53g<"FB #a*t^'78)~D^X, U6,qܵ=  (B&B !x8ZFDAq"OMx(hϪLT2J 6F"JBac#BUDu˝]ѧ^Td`n_B*(bh4E4qti"?m&u ,nĘiOq.@f-lv\Dgl@U( E %2{L~A_(0kI_ņ﷌UH/(@v#r@Z9@QT(@sm4 J4 ZKcFa èʳl2]}_h]l7OE4g2`fUl^plA3v?|65ס޷l r:mU*PJɓ'en}JuOB0+  p(`r6"t6 "W\EdfE.r;+v˄@&2b 5>@T|ׂ#(P!I7~M @$pQ QgrF(y(4-##Uy-[#`äT#byq"7@jqhU@ ,cgt]g˓2'+l 40˲i)9U?(%Dqr"YlBx˂5_sZ/a)o9!.̓ox"Afu$7yתK5U9#74i56H@!N=2"E|XLpNADӋs7UͼNR^`1&hZժ4,!Z(JE˲JLӤBΤA5"04)c̦Zc/-jiш6$`D 9qs|kDV :|}W]DD4TADƌL$0@4:}Tuݕ+W"C7ty5DX,*T b:YwIѨo0֓)ttZJ9JBTh,h4 4yWVtMZlssMn{Db> i2S7TieYeqќtpeR۲,j6%] @aaxE"RՒh 8]?~ϸDjFSZ$(SNdeZ҉yz{{&Z,;c`/ _E9~n@\4A@Y K,Hpel Ԧ'p_tUp;xݕ&ZLr&>AQs$X5D:c!}i T #NqBXu_;1F2,Ϝ{l9"a{4Q4N+$%P , {s=L6U0`@kڱFc<_(,dR[UU(J+TEP_x/\({!+@1K=_eC"0+DA穈ψo1$ qC^_~.7aQ΍C[pA~+Di81NȔEA~bbK4Mm[1Ct{|7*s3*}W:s/j[aXJŶ,`.#0˲!)B+J>J5WYb<$ BASo |WA2s%k14eA ^s2 ./oX`Ln^y%zևAذa֮֙] DUYjϠiC'x_x@@8iDWX] %~:#<\(`K@8E$Xzvu)i4MZ*d֧.B0'RF)eJyRh9ϬQHbP?.Tk37\b%q%)\gos GRi@<6x$Wh7 ]wMQDc1_0Hܯ# Z-玈땪9a8EF`$ 0ذ0/bM #P kNe\PJM۶m0l0Z2@qmYEmږ ۲|cSjxa\S`88 W]4ts&>UI=Ƶ21+鼜(Vj7!7,yȬ B[@,V\ dz5,NNNy8y.vbK044(@ēËNu10IB E*9ض㵮4-JE)F@u\vB\ ˊ؅ 'ƙʸLh3"dc/;e`,J$鴌#.Ac[y)ʁA /2p"j˃71Wo_p7R׽zh>ڠiZ]y& Nk>Ea\עP(< ʜ=Pm rwQ^ШfF0l $Ēxcd3yF !PU m4-KӦiږeٮ rk͹3IDAT2'O5a.ހضl۶''',˄e[O% 3E*tX#OvG5qp1Y$H2Қ?qeR]{2G0q(Lj3|r `3rGGMxpmT**!yUjrAfˮE)/.tn\tec'CSw9u ,@8/m[0Y,trDE9ڶm ضP GxWv= d ;Gvyj4. X̗a ~w-#>\DJlF=n8 IK%QJGJ"pq5`ɒ%;="ydyl'^ԍ|:5S b€9 XѺAtA`SΕ-4mJ)'|).}L@)~F)elr™AZtZl47gx]>F,GA!gМ"ݐr6GCNB^U7G#yRoF6 EzN(@) C\N@"aK@444````AC5%b뚭h=݆]S <3Xy%}ދS`17-&bPm<?00 @˕x! 2!N=y2f54$YPJ12: ]ױh"hR=zk(֮Y+l+   I-7^sOBp8ԲMӤ*`۶jAm#sf2H<U $VQ{jfL/=(LNX*a46_ 0ysQ9{VP"x]`GjMvdBA|P'ˈ2tP&aTQL|яy. ˲P\m95aS3-Ӱ.PUH3 CvybҭOi^ (83<\~L2а˚|OSށ'JC2`B+ !&A|$I*T SM]:LQ/N˭qb3w\|9~X Fa ~Mf8Ow6ݭl.ٔRJf ί9mQ۶:va7YMyҧڶe\Au Z-Bc: L{|+éA() '-fw9d.aJT{)%ZVV*@5q˾0yc l4rGQT*U ɂB4CXa,e9/ƉPEYY 䬭*,/$qI'&|D̶rP}A @Tsb 1l!ΎDhLlq|mXzeۂ(yf mmmظq[[0tAZ[򴵶œ&<׆T*4ggI yhABp]cB7t !ݘF<P*Q*,˪XeXe, @"n$3L&/NRMMMK^rH\auTtRIy,oKTiҵ]rc{)=}H"W!ϓ'| 7Onq%d")mgatlT<;iB$ma EA6|r y"D< @\\΄{D}3}-`se9c΄iY:djH!j(K\bq(M 26${" nB*H499Y|~G)tw-}P. CilдPw`ʹ^wx°(YE-K? ~&e9\`).K%܍-.-ˆp48Y ׿Qw jHmp}dwU{j=  *6b"!EQF*U'(r`flw 0xZ7 J,2*J2A)M=wޗN]ڵtkS&ӥ 9 UHM@p|tLdVMӼΙjjRIjč[)ScdV&y D1AZL;u,# %}09A۶O\TʗJaaYKFBHbFUUXlq$Y @mۋlnjfRdeYq4UR(mk-0Ny.4Tf59܃׫|ˉ!,a-.ћgJRX,l7"EoCpdKJ4-,F):xԩ Ji1Fc8:b Jk&ziEN܎Τ1Ƥg1^'o5Rŵ܎@TIv@'r~B OY h렔c&)Ƥ^!lp]wY0_\u_m{uanI(F<7bX)L"ȄicQ]Gu],dY^,?[L@x80"UUUF 6 !۶ (IJi J O v"!]-&PPLFx.!8{By]Rσ\{_&4,*'C8 ެ.b%11SJ ՠ7 n~~fs%=@F0Bx*b/1۶unZR1f0E1)iE۶K4M+PJ dT*!?0ww`A- wތ|g5@n@FNJ@43BTU! GVN TUU8kE&/>;9sV4]@_+>&U%6ix_ȿ%E(@t6hϗYo|pmsB@RAdw@LN2̉!+ZD9 m3 n9zY\`DbvQUU]"!\,KV"e\D:s|~Md2IΖbTU7f˲H0C,#D"$T*D"HHDQTX,˲XCChTQD"0ĉ!hȈA-#< 7\d%!xD H( CNۻݶy&:m՗+EUe LKv'(6dK/QFGËd7u I]x iٖ@OР[!οC/IxzIc#ZC4 ܜhmAKض~վ*#-ATU)`g=MS>wavv1Ƙ(,K[L&CYl6~ULS3LzS"VHWu<>ꪙa*tX$"!"f"HEL&rlLR~ MS)@<4 K2IttXDD1$aAYhKvVɳ4.P$k0@[kkM?^9 KXGP0r(0!{*l[KD&sl6( $I}pulLz۷oN\ИPx~>4ۄǏUC|>O,K,KVUJtjj>Yg%й\,4X|^!( 7דbk6g|.! *䀄 GhRDQȶ/!iC8FC4{L LRw8 QQGeY~om( [MOlp0^nnn,߿{ #!|{8^,3޿%DD޽Knnn/!"Myt65^>˲Hxw3&DOki69qN#1 1iU>H|A@ OD\db C{9Les'"sOE#YnPdhC䢮:.2mpڪn+!z" Su#&R(˒v( b0=>>vkW;~G><< rn`Xxׯ ѧO"z}6Ͳ,N uH.@BY͍uK L \Ժ׶l[.:5B$ k- o4rLQ6sgCD˗/$E>&إ)x䄖'ISMr`6X$]\Nt!QO[A_l,lH ,w{KO1`KF*ʖ5)уpVZ!mp"3' bIJIbxNOy 1 aOԽOeYszSq]e/ϸ(`⊎сF`>|mBc^cqtF(yi3vsu=;Ld^`pPߡYĊ}hc 'BZك>?[D4n\aMB'xD۠wMt>L~"R- ȨhBA8> w1 ȻK/Ez9Id)Dֹǜ  !̇} YH~YƏ\f嘨A'dvxRwE(8)bCyYW{Ї~F}l5 q#9aA}@PمƏRO?!_7ͼXNj|t>®CXyP/C}iP$?ytA[ d_!ҕ?H>x>ak:먋i/%f"lBd!F0{%૯7}u1ч6\uD;C'@B}GqMb>7|^/ ! }KhArJIvo@ryc`]""P"_sD"3XEpXY# 4 \OPhjwJ}qI@/sٞ￑bwOǼDy{v0^&\7eQ}eQQFe,#2 FHe$QFy2(` `Q^0(/XFe,+ EIENDB`./qwbfsmanager-1.2.1-src/qwbfs/resources/256/quit.png0000644000175000017520000012345511404701453021667 0ustar pasnoxpasnoxPNG  IHDR\rf IDATxyWu?oyi6heؒ,lIRq ma J*TX ȷXT*FS$$Ee߼emNY%͜Ҩ}{y9s=}[($K$SdI䵓%$K%A7yUWWav89~f.^5ku)>/-3:BXB@J@kpPSJURRJ"h K `}B$,!-R:, +eB@l epH%03JRG>YTZ~hބRSJH:Ԋ p^IBtWZ.!Ae 6˩:Z+c}()v&RJ'˶|U] +*PG%Ђ|3B[RCmR^8WVlƶ\:]Y>fihݴݬ{ZވS:-k^)ea&B1@!@R^}8-SD≲e8B+r?-)"&[ܢe)&mwkG-BUYGg ẀRF 7 ǕLzZߊRz4D2 eY(8Nioվ"%˾,1_BX6ОRjER5vvYU.wZT V23Dž,C{fmz#(`iF Tְ섕iR)@(Dž[.T,8Qn7&đetRJٟh&T*ԲkjR8#B˰awtJ{ j5X6D7v|@bO|?S٩B>&=Oz&O6.X@[S0Bn\=SL[}(I!\TKL $K ɧ?iړJ-kwݍuob|>u}.T?aCXT 57ÝbY^fn NE@@d`])LTfQ@-xhxگ^a?)Au'>EL>Oh뮡>6DwH# V"Y s9ltY`/&hd@oիeC"*+Sbu| ngf)&'P<ݍ%P#U!wu\$R= g ,a$t~OqN@Auu FuP, ЭU еy9lأ+ZXDGD&JAg zj5T YzU-Z;; Tꡡ=\s,k^ (='K '> ˶6[v)7ٵ͓Ͽcl,//Grpm]2d mCR*Wpo-GGo2񤿖Ey д8ܨ&mbBOPC/L%\ =c'x4nL[u*ӟ^BK ??nsݵqnbw` eW*T,!`ut B*qRBIRX5)J1~:NdH$K)!]J !^1 Gv].jio }_Ţ ,jܶhO3{\)fC+@h2:Q+@ ̗y W NE@̥MpY3ҲSh+bYx]gOK$v In6ʇEir"9R 08 ʶ6oOՄJߋJ , >1- Kήn]̎(@f# X9@^x뱠 ,Co/MAHb@:kl/T h }2 v-m`bqEXDa~("|  Dޒm?cR|3X R)/qڵ.hoYV^to߁TЕJ|SB>;a־%zm.N0+ @[[F9#!%pm0g?{s @Ғ7-Z8 ck}.>6JHkv)@@6l OI~ǹyJ T߱aR}}ھ@Z|>W Vj𮍻B#P.!ĖznY" ~ {zBJ+ | !B7&đ*yw//Iw`P*eҮmccE+Hkv'gƁ\uPȼo:bH_orH⌺ :5= KP3Lm?;{{Ѯ>ڸ"]!-]D OORn{ӌ{ 'O>˲̺uH{Sɱmz-6Rpmao'4 + 2*[6NA$t@6Lsǎ\#72r4LOȻ})s?Hn2O#Zd֯};2ɤggggB}=kAkg`zU tI7ckѲQ%~{cvT ,[sǎ!?F 17sθHZJ$\Sgm.^:b׭C۶!H@T'}=Br>|iF}Iă"L,ާ!`_5 {5˖=ڴ 92:t E9ȲOYVK->E;6l@[?zfll{(PC}uZ;"`bkP!__>n|>݅Z d(RpWTnwoH:g]??mJ'nrU<~!:֯G Y~ '?ՏQVnsoR*T~? V:MoEڙ\S5O뻺J쬧r9H&-[ ~P宻:c?ۢ tszlvt_6QHm/Qt? `I;)gڦ~φ?ummH}$^}~< p h%͢8:R.Y?0 Hyp W޽{j%p)~~!v+2;H.;ׯGၿV?7K#9m] %cAb>!)U?v)* XYO ?y_ Pw<04zw@ _rL>C}wm؀ mߎNMBwcL@ KN^к%v_T.:7bh8Yp.H=%`@?03,󙀞C3J&[݁;Y޽;oj7OSеaڗ/Gmwq`~;@蹵[]ICa?m#ge 6exHq⎻P79o>V܁~ E!E e<wj~TJY.@8uoRʋGi z] QG a_okZ4&QhD0xuPP͆mڄdڝ)^x0QZJ%1 LMb@6PJwKsκw:~ǹiʟS},_mh_}].˂(VQc0͏b\H[KCaA`WLr nܥx83KO];x$oPo*+08n_( 7oƌR;݁Հ݁ڵ˲hKRn՛Ǖ Ro6ׯGmCބGio4`*k֟W:9`n2fÑζ#{.,hA6,w3& ,rȟ8L hgFBdR~gdYm! /oU<DrXvFuׅO}~-a4Z7 rР[P8oF+'c̶ORʛlT+>PI䧧0MFP~hPe*uoٲ^g|k_;bgPnVo C}^ Cm8u4= 9_""jtC|?D}[qᢦ/\&5ޭXwm< r9 J2 O[$?gJQJWz׻,&:ZR'&"߲,,p!:W@uamyu[BV|DhѼ0{d!44B@m eJW_"|^ 8c܁3V@x~T*7<3o6"toYss^gYf/?%Qe֍qTVq& &bi5l+2F죕T1yJ`l IL{&JE7Q,!DV7r|maeճa:W kL|jj BJz/z(XMbp9<`~Ft=Ҏg1.=f"?^0puP,z?+~T(|g \Bk"?g)1uq ޛoVP#;DDf'&03@(0ىÖuL9Wҷ5Ug s ?H*cDm)۶{Y ^> H cǀR)&Zni]iT4s1bQ7fsB1vAT"&JϏc5qmue"J`vlx+@U*uoM# Hwg PrMZqqv-Rگ'k, ֯Gߺ}B<$P~q J܇eRՏ69=*4_ oq[pk{+ԪwHt ,$V;5rL<]ws.2*\*)!\ xw5g~{(ߩnС>n.=睇nEeASS7=Bcֽ_o)8h8itVO8&wQ\ĴoXHqB7)ʲ VR)ErȎ#;6gA=Lx W[D*e 1}{x][o52oZiq7b0xVw''=M,!Гu.m*o3iuL4b 7 U) ,]VmmHÚ4Qy;`{Oʶ}w@TJ~܁3H zRVoV/zc /Dz \PB<D>րZ(swJ\O,֨py8,W$Z_hݪ0kw9PI GJ6U%(0#;9QUXH܍w~1Dm~\Xי}z}з,v+[([~uX~mC'l, oMXC[ YqJϯϛ/@롫7 \BS/Jj\F$g)89}?e^@PdIL; xR_WԿ˿W7- /˻ Ƈq0uX~s9?au+r7V$&P?|:yZ-(q= ꛘG#d!r>@"EZ'l*\{+gv&~H'%jǏZ  J E&}I! Q !D݁])iY*;2o9/o>R*^ϧ+mXv^|%a IDATcaoQS +&!pxz|ILiř؁d]>[)kTެ,/P?w; 5htv '`ZN}`B0~(F|2z>v&soI뿞V%;Tj;7gVeaxf [[bƀjAzмKz^(6UJZ?t}_O+ "Z c~)F*l]&|8N)f":"׹P1}DeZ"Ff`b"''1v(=D$cPJ@t~[v&soM/Ywv~]wMTx{]>9Jр\~F,_˯CRcsuhŚB  tC?<:o=LK7d4]>mVW&`e\$ZxB~jw-oʳkܰ^qq]rt(NLcpuP {≠/-;zphhJv ~w3nNўPjYn,tdnn[}4g67oƊ 0|\qz#޺-{)<2:o۷x&j٩VQ4ӈELTOW^(87@o(<O* JIlƤ{ tHaP4F_|G<t{{iw~73xJײ+pq~N곣pP!:iQEp-Bbxs>?b8 8³xphco'e Oz7pȼbžQڸ6`0,%< w>98Ԗ@@w(7 xI32{Voق_LO??@|w֭f%r馶qۧ@O<+j'ٙlر~QWPJyJ8x˳P܀#Dt=L躨<(NMى &!'C,nꡡ=*g2:8- ox7oRRn7??N-K.6b꫰B)Tr9}9~B@B+CkǭZ1 ౓'ڝ;qӇ?>b`Q|c3o}VuuC\D"82t--i .XtqpCa;v{O>y<|=Ʈor\zuuK|Ɗ~b B@ ںSaln338sxw(y W_qw{wRis~7~f][-n>^W,hO"i3 +DyvI/gt4  &e \# BD)<66ƀ{qΝ ӷ1>𡫮 3੸qr:&_kw{67|k ní^;/""4 iCv?NuvuqrnS8s8!Xuw7h8- m -ϸeBù 3w%M1|X)]QjQur:Bx|l xk֞=x$F J'e`JYV!J>[[}7ѨnR\jU4ȆHߎ3T JՅN,s]Çqp\uwuvl޶r W~)nF>5.J.wlvsse V\uV.rJ%cc~!@g D)X~F\${bl tܱw/~-J7V˪텈X^]^G}P \r \*>گA=_n @tv"Յ_ Lgŋ=b pW˩{Ka?y)+nA~n?0qgfv\3=iIB۲\r +]1{Pѷx^p |4_K#&/1Ҽި]3ixJ녈$%{촁_K#%K.+W7q)Yl 10]]Q>((+ :;񫾾M˖};݁i|9iggo80=kUdf&HhXs _qV:rcc p''',vUi%o`!/ f&&χoop{BQ'E|'%}S*Lbv#cj}V×x' }ݺs'/4>^Ye >cQUa-}Vզ:9W 3oꢋJy@=֥*QS*󌔻6*iY%ĂXx_+.v˩Kgg  @ʲK0tՕX%%r'Ob.,LME|%M]LI傟ʷ?A#Xى_ziD >M~ڦfb4烟?}J޼y3._;/rƺ @]LuM ,1uXlߏy$pJj^˖ݝw޲( _C% 믯k˩M6./ C>ϝ_ PiF1MbޛwV~U?FLqptN70Yk~  nsLa&}pPPFpT7tvdkN~C?WS`۶mB~]So:85gYZ_^6_K/ ×_Jbĉ#>8H <HLO_^z &y5ز%vtK+a 1`aQj_K#%]K S g[KE_VG2==(03;C##y1Tmo {;:;w$PVK@+.d\Ó{U E@p͸K1t.GGQԴjޫ/SZV0)׿BL@-~(Lٷۼ9b[,97 qy.Hq<1:(-CCb|z Pؠ@ (7PBBJ`g'RhfJaÆ`R RJ@rWW~w@mf hR6SS{ssH˦MK1tY"\ja>t؏O A?S@Pozv'<_*=1xMhHw x[nJW$]q}U?}&pӆ 241= *bсt,1;;gFFO,H&JJx"c]]ztezq~am`uץT:VjkCZRAe7*m Y~wz u`+D#  ,cozrb$O@kU vm܈6A DJZhFm_޿FJ6l˗|VGoBAA> ;xz~q%`eaHJL0; wnt|] {ʟF譂[^>@dcnjV/|5?N|T—{.mltG 9G]+cl~>r_v܁G7{yCX'mթ)R;pɦMHd:ptb~LjPh/\!zfrWj5)-, R펳5;3s SSﻪ=W chh]]]H*Z.tzz|XN"?;ffD7)`:i??;IS?Q0=6L(ZSiOPv]|&E=SOľ}қldn6 -2Yo"0@=B`V6>ؙ :-C,0s+J/7u]]F)xD 1'R]w݉|é41|Xz5z!*UlBO?J%L"A͡J,?}!F8CJFh E{Zu x^Y c03<Ɣy ep/}%I='?3SJ'R^I{CI%zvȈR/^fgQfհ̲NaH#ىL3,kNB(J@W!t(l(6V(Kd 3ut L ]mL!;3Zt)e*47 p YIp`kc(cv0J hoM)4  ~-+lq*}6Ph{ 1EYe8^r̠͢P ԐUmY;,d ڤDJJJmJ)25_u)v)Q-QK/!].#Lža|tbK*+ZNnC, 0ЬB~v膳tn}d$ p_V:&J%|Pvָ?P ѾHRo<,&Jȹ-ע@'r-F %e02&0 [|II\͡23<253ǎ!{|3+H)JeRR%()Q+P瑟K/a$syyTff*sK-v2}S\ޤ=) ܨƌ?mgĝJZg %7{R>e-~K!W!m`J>J SpQ+琘!fAI&'1')Xi`ժ(Yr?Z'O<=5\ ֬С@ZoZV\AJe@ӧl2 x^6?0HD!&Vk!ʮo9~-Z F *MMaC_6hOf Jh|[0K iR͢`Ayv";cPr X.1T;N>ёz9HEnbSq&Lʀ `N R(C s_K,(_DV8$o?9 ~-qL`_a_l?I0` '4#]j5c2*R)Y[_K$@EE9G)7Z jJDK|SϕT91mh$ۑ2Ц!J)'$B3ע^ }ʮypLIA2KPR-w"Kؖ_~EKjJA2 Qzl׹@-2?@pнlsZo\wEL1 2J-]uݣGc]w-[k)F:<ң[A>:|0/iEh[.5Y '4 ?ȡ }Z4_]'mO6>tZ W~9 ~-a}'+|1mjm܋RHO}|~ 2X=%`11yT ;q.(T`@& U!o LN)H?D㊺ 91 Vak\Pt/ӌ!m]ҧ>ax@h䁞O~a2sU;T:~%5h>Ǐcʷ\\bc j|z'.;PtD~&P]} POPp6W|]}xPD_cDICA+:{ߢRo.\ep{&+|t4<:@iuXE>=lJ uñva-x P:Ю Y~(׋QZ%_Fn@ 2A? -ہ!ETQ/O@^J?Ŵ/F~1?6F5 CCY)C8hfOh_BP]x:% ܣ)<O^O}$ַ>vA_jQF uP-SIu-Iv`u ؊  @A<ү|.-9D~7T>U[5i6xm-:?{7`O8 C'oSr}LeD)D Qy}KOwi;MQd hԣڝIA\}lJkzoS8tO= v[Km#ލCIN5V`~,R9~Ep r|#hML$TzAԺ[+3W6 Z)+`.<&{ރ!x1*W.B|0PxܞY`nnfܲ*:`d <Ұ+3JJHfbCPPZNKuU:H+~5zpaщ&e˃8_ݸ_]RX?{ /{uc 레bSmBb?HP:<xvPB!U=a;AoKA Ǣ isw W}kZ ,J7Z^8=9^a13ҲHLOJу|hׇ @MP3 ǣ>!>T\?V H<#P?v]0w`_|H@8bqC"|'DU8>F߿ N @G)7MJAڨuԔk(t[3 X޻6˽O JAQP $kAٳ&lxֿUIQ*TFAj2 #[}jZT$)YZt\B_vfwމKJ'3|' rل5AGiXg݃P_ =M󔚷Ń@X >އZw'Y]ezd@Mϋ W>Y{w܁X%YWOL_y/8to m(k0~8Z)ᡦ`aq{``noJO7Jχ2uYFw`ǒ8#! ~"<Iu.ƀ5m/H9O};PKC:^WBa<罩", 4gQPiPSSf9u}ME 4q:/0ߎvD s˲ waA>SV& NUݞ j07W|~àBC<$q; HAo]U\:ϣt Ta8}$ X4PhLCR, ]RXvo% :o2EDf~" Rx^.u:#ؑ'M )\f;w8%`-)WR;s}dbS}gm97)-ui: F)"lx# V 3/3њRZud 8}i!U"i^I$Bϓ{O1) O-9Oϥ o 0[KbZU4_wזL?fnrt>BG0UD4Z4i/GFcwcTm/)(wx?A#;~0hCԅ %r=oq A'qoy] 4NUu`t/ X_$)ȩBLћMc !=>cf<,Ldp?8<|Q1>Dw,PNDAh&8@&BzfqwG˂FolA=ST!IHۡ %cy|}γ##pI $HVB%NNDCylRy | HN>}wL QYs]\8w"үτH'+D#|<vXlB sϵ/W, }Pb,;2_z+~{ߋ(W _YQqy?)>0 eqdW$sYRK .BeFn ֏Ϋm[@} a8JhM ^ŃG8 xG?&f?m̂IqؾO+u܈ٟ&!G. I AH-##@J@_9Mi//pu@4}h";2z+^h mkˏ栆REfA|qV%qÀb6tm=v\ >~BqEULRLINZ[ɲmz|!j@UzqC=^~>LjH&R% K{{{p8<6&s3$=s&~60{`42 {`Zp*18KG~;׺LQ_zS"}%e @7 ,VÇ("J@2*Ԓ zkbi/ 6qKEfeu~NyYcsDL6P|?<8L)4G{T @@ ƍ"-֧]Y74],ö^fGF[n@*إ=  ~  3Y,}/?I ;.(Hez :##s V zBJ)9>荥iā"2"1\s䊉+sݷx[k~bLGG,VFF"Mt|*Q1Y~-܀pcș$7)Ƹ­"PO0iFFW_~F@Z(ۈ<ʀOvdx[Q%J!ӫ_&c-o{f 朠Oor  V(%k u&vg mOԓ!ˈ"2|#20j%VF)X;޷H"bz?}`z>-oL "bHc-I>¾3궺#t|?Sq| Lz^虂`~QԟTIP#iLjӷ8-؅@gҖ?ޟsi̩bs rVA]Z?;24X,\zy_K{+Y@ mOϏ^~=utxBHq-(a @SEBy߂I۱jVqPc?:M cA$+g1Q_ct_KD7bJln9+ RnN/u;+U$Z8i_xl\C49unߗ7|SP@D HMB AAm A=|3@&}gJh~ BFMFi}qԤO9WuyK*S C%$$ZEm~>ZQ0$lI m`KYRvNvH&vV?)nϯ)2ZOϓ.sMO*yED%24@Q0g[3ǹ /$PPrVj TvkAMH6% ԕXcb-pelrPr8s)H/}yE̝5}3@  B (\}=EXܢ^ IXoޙ;3wqzV%{BN>;]]]~SY=8G<< 7@SaS<V'%_> \ c®w~(OD)E#)˩K -[er,P: ނ۹ bPpW][Cr( A@/chH[3Xk5 <_(Hwcv4Ef1 v>}Qhc{|553VUEV/FA I)&[J@FeVQ|G9/(y뽢\B`e >_ۏă|7 /rA K.Wy@ 'b'V ezH4Oy~_{0MG :`~x <c!;r? %J`a&(pʠß0 {v)$,Wb|Y?UiQ|T7,q(8 '2% 嬮xIoP 8WAd@p@S>H3 /b1NS5^!aH&j$ EP%PPUD"hSZ(Yj.DŽY FϳA>`52_D?gx c"#Ih]8" ȾP% Ȕ$& p&.7-Zy>,){9n%r=xN%*z#3%r`ߥX$϶,!֯\ފnhTxwmˎY.avө|2 `o\$PvA㲔_ޚSgf| 6qBSkPO7s[R9 7GyAUH{BK!?y0x¿_|1 ̼u)hq* R F0L|rB,WNY0o겟x\UmtWB@(H׻[*dw@U}X~0){ ČU 4ٯ%׵asP 9u`EW0~|-nLʔg/*"8 ]uq u(J@AUFJJ) \s7j.vo!9 *wZx'uw8k2֐h*,6a->xz!Ôqp ~ x㩧 HbL[Bd!2_Hc:+ۑw!غxN2BT6욫v /a޿RR;հ<@W2&!e<ڿrJ@ӐFK& \8A(oywd o_.=kɌ<dpQ ! &v(лY|ޭX8.U`u6H V_)_s>9|@A.D.>{/| Xػh,'c ;Δ߆lW 0 JʄgȶX<p(ݲbs;<(~ӎr)w!7_*ѺeUb^.*Sρ|:ĩɪpP]n@6'Xy3j@_M92Sꊬ6k\s珳 y5 ,0hsX,Rh^/bN8eb~]a%FcGc̗o@i@S0duD-DlGA޸ܹ8;QӪexQtMC_4j"`|)uL&2<7"Nv~YGiH!j)7bAYpBā b w*)枊 gd 2 4(AHYnXb;daj '_t{0M{@)(*;P"b@N/cĭ Z?Nsg"^H*&:JRJʢV+'(?? ~8?=GG`gFr"Zq+,Ƿ-+c[I++k/DP +J?V-݃nbLKW&yg@.LDKX*p,L!D_ܭMY֦l?Q^Ĩ"ǃ֮}}%+_[ ka*`}=tg?]}GR4 uu J)%Q +Q)n~t`mټ롒npWG]vǛQA!jUb×wt֚ H)gЁ6w`7k/8@Zr@;A~sѷv-kܹE PJ9%o.2A T0Z #Plr@9v?@w W-t(Zr_ITRO&ǹsѿv_;JkgoS>%K*tq*x RO@5BUʀM] Rx2P@JRA/8w+q睇w/^rE'/u/2nr8JokJzD% bd:mGЁ`^- AJBUʀka@?p{]3@IiJ_+eV^Bȫss݋sIhj.!_-+$nV]|1{)xD% :֔bPjbU`w0j;XBGu28VA`9N<0yl:">ȷŔHlgesfG(iKy,&OBsss:[q鷔@!,i&O:zӖ,9sJ7BMQ-Y|6,,B@i/_@ H)LP;HQt|bQv\R!H&2qscO~׻\$u\ `y7,9ubP,&% ʒ ũy;.=f[9pbDVnÃm12~\\UQ@ A׋=_y%ݯ;]@7M+_q;bJqHο4^s RTY5e ZZZJ $1o֭ey^`}7D9Eȑx㗿tmFwNu؁#vگ Xy\wT Ȫ(vy~^"Q^/bqD) rz啸߆xא± Sʀy0h2X [Λ)J1B0N9)@闿?98'9`uP`@{9SLTTh  ojFppHА^ z2E1 q]XM̙3W1t+ӦL_/'uypL شqS -y1sLh m7t`*:]nR^/~?U eEP>==U BڊQkjC &OFFQ}eN-i(H*!% _Km~34 ': p0eԩhuyX־ˢ _ϗbԩpҬl3}=F1.YD| {cA܇o(ECC(cQ1ڊaU\BBO"0B4@˘19#'OF)AZp'U_zE,aУiS:BGf¢VO0n=>tъӦ{TP8f*?t)d !ƁM!3Vnx`ϺŶ)^ӄh1V6Lq6x4E)@8 (v (f2 *x<ףe(6)80uLBNr(=Ln殧s7T`5Mì-%`Ѯ#}:mZG(=˗\ŗZTB\,AW#0uڴ~]B0f, 7݄]>L~w啁>PB'#Gh3c"7T @G1ٱȺ/u]G0BГˢ+F GCS`HM5H{Jv3墈?]'QMn?C\?%N%~=^qQ#F=a|RxMREYNڕA >v :yfmlD( [Б+v,!TP(2T>\L048d==ؽkz&uu0nB&rˎrO_1,§'7u#V//SN92_}%E/nVZk_[֯Qӏ`%q)Hnv {][Ԣ bD?a0h7nmmׇ&D޽E=} -o/IB ;X  O%S#7vv 4J&O֭X0a"oh"@R ǰ/K"ߎ,!zgrMpʩb/cP92#Jd\r Ryދ[mXs%AzFx}~p%SOe !j(QJAԪO_$V;H@CC#FP?? @6T6ؽwj^6SEIoBN;4UӜ.Nye˖̴+4Cu>syr9dm6$z{=E8f8]P:^%ގ#KdgY~@nqϙZCIopD ݻQH>4y鍊Gm;ʄ_^@| 0`8qqP xi"O4 SU1`wwwu"m9sܸ}>߳EDիW8% O'<*M>ØM¶m7e_QW(<\~q| rtwcǶmHk=p"`eLĺ \Ӗ-(h?~Z.j@^"p{;N,^%D_Oa4KԲ}]xc~3ؚH@H -DR$Ri{3ƌQ!|)ik B^~eOWW) 4o:}[.q4Zx~L -%cd zʋeĤ|[L[1% %~ >8ˤ#_ϋB'~[ؽ{7֯-K"N;thROaeeg u0a2(P] Ј1!<-Ȣ&>7q1_sEWN d_~e?J@*0idfyR||(*x]xvlۆ2J9ʄT HM]Ș@^z3N<k!.`J0Xv!=H$O?Sm[~WuxB%pWJѥ0)E=GϏ~isR0(zSƏk2 ?r @Q~K2ܼyq:{MxQT^t\NP,wK9@w+JePŵu}P(_@ɶ!'ΜQF$HI|~ٺ۶iCB(]vak೑K4g-WfnG(<?XSU$7n=_w"`a%n;XyJU(ؖq1q~xhTk~n*k^zɑÄ]scLL Eϩv%Zs>_"(QzXmgҊF?,u($Bz$S; VS)c#`%%xpƙg"\ʁӥ"gM2%P.;TC]o^z) 5z4N:~OѨ+7-^Gu;̖$Xc ΐƵ.~~ <1rxԵx?`go3~x|\ 4m(l`֭ BTN ڠ崴 .e֝* 0M ߞsǏ_VeeR,]^L ME˩3^)SV^oאٮ`go/~?@k-#'L *f^U(-.蚸4u>(6g=Ƣ2ːeCz9:)kC$YE.^[.L3'JHֈjfsQBJ[9їJyvӦϷtXF0><,r^x%" o4wAVp}81Ņ ZJHr- 2,%VPmc_AaT#r1c]eb8s߾d z{lݺ = ڮåsbokgO>m6.O=q|(*([tB:LJsk?pB_1)=7XJgИF|KPD[VīXd!QMW]%7l[o5=3ǃ3Oq `+BXV Ud @\D1M lێ^{UzO'OiӧK曑hx~~`/S-`<~0_o_Iio[M>} .@Qj3ƍKl6ސ,.b==ܲEwù PP8@4^}5}a=H&`m#ۤ6'¯C\yu_~B3έ31'H@P{NաIzO`7#cx%e"e"{ 0ϒzL6MݺJ)'L@m#X'l'a?H>yJ0EMJV'GE%$5>KRݴi9%Pػ==╀yjo9+/F-(᪫0$ w2_sկubJ4ZQ[';G5J,;gaK& PX7ٓ&-3A;ߠ4cRjZf̾Z0y߯@@.hSNˆ i%%pr@wl)IYI^d2}P< n^Ls`Rbus_{;F?>)ݷ܂~w(K IDAT9+~Yj=& PiO`gwMy &Ξ4i KskE9h ."UcLsN/t)=1MM+dPػC=贔@@Twe Yw)_uF{Uc`;>Ad_>$^*f\R}Yw կjR{nIoџ눌)AQA]{'NDWn;[h 8]W d~Oo׾/@Ոi?pxۗ+` 0Ӽ?կPmkC #&N W(0+ `ۖ$1RR$@6Bn20W\ sFQ~C`>.m% պ8tnZܷ}0[0csU|bo\ĺRsJk=mb7ĉ76"-J 9zW1_UoV_d*!Xh:oJ`, {bݛ7CE[^U-+%咀cmE{߃b́Jx2:5ϭj`OZ߾;$e͋w <4@)xO?. ޹];<\ȶb[~ >q"B9_g,7 &Ο2ey.Z&dIH2>LKW iR:344緯Pdښs9hp+'wR==Hl r4M[h/-)Bb;CB1J4cg9kOP %T^<Y @rO`nꢖJ,'>g /`g00{ZnνZS{v;.v=w[ݖu'"؈ȑPADZCY@`pES(D"RعO??p(%D%!5l3աwW'ts`\SnCe3-*4Gvq:T-*,̺ˎ+u;wrm2 TXk;_n>nn@p)PJ1h赒|'ND #]}bgW,7BLyRVz/OW~5!SL.REUh P:;44Wrɴ5gv57?l޽Hww#U- h\TW֦:جL<z.Ոr"eڱPVWaevEKY  =<(I`?YE˲O_Wes4O=9 .rUUf W^YDSxK6+gX=twofJzL@b,|GZp,}9f/nJʕ+U@UgTˋT`X+齄q)@G-oDZ? 13 M\W)k+XW\jt600իCC`4 +?a2{ ݍb녦iNpBjA%P]̶s/%wP..BXAJk??jo_rsEo,}if|ɃFy9 ,Xt>00/ 13%`$xTLkuY9|I ae ͢me[Y=~ɱ$<*},KY9$Q}*,AHhߤk?~1 vp'tRy4O߮|!QSD?Y j$¾H[’*M!w\B$%1L3Nd_-9O=-o.[e'l/i_[iR(ФI55!6j`bGg@$SpAEٔu<尻||wiN zR%njY{L|u@סypeu =vW%'_{?}i>P緹\cȺr>)Mbi D2Z4jG>yI$keS^#Tv.v6ύR:<քj3f~(`~qL@$I\ui˵XlMVjnrD0&'cXij29"b,O% iƵW_ 6 sn47iP~r1q: Fw0"= :kEnUJQ6)5)-lŊ ~Hsx!~'J$z1:-#  B9Z(;B4+R96W=J)l(MUY=~}v _l@QK(}{G݆;ܠquUP]_^=wJ\52c"0N#](*|6ioY)?{hhgܨ[,2L3~^ 7|*CHk4'9?̢B2oJ`BK  c)OûʬzY֒m¯(Gbĥ@׎m%݈e,M#p+)id PMo *_}ygb眳P_jHU(0L3|# Q[oU4EkLs?O=()188_G݁48%//)WJې|y`Yp[ M*< Y{r@_I=GDZ L|4xf =4=6s_'K|ryO7~#rT)EQXдl_߬\2o&|f4Bn@AĘruK/WVomⳓڧVZ5Z Lr 7]~a Zۋ5 f |!lt;xcĵV_a?p$ P$uE_s%,bn1ԒEfW~ d~#GB >@6'aE!||9gI'$mqz*EeίdS uqы"2-^[K! _(@xൢQE\Wo4 .X?"rk0>j<Msjfq?ޘL |ES)7le@ t$'RrIbX/+B\VN|{iR f2ˏ`QaCasgG t%neAUݔ'@i;rԹy睪JKiC4fϓO.%ZZՏ~lt.tvh>vr/#DVF8ڔԓ7\}"QJ@>1@uۅγm^fsX`&l(EB6x$%;@]ݚAM۔z JxG I(9Mll\s?SLdLe?SpPO@UU(jS`䏁R?p_nsþ,Ro+*s\,K!|yZY^Cǡt|b]khXx!G&G%`r]w7v_jQ/^_(8(2)G?t @ab'-Yq[ /,C1]ݡzJae#elk/0 1d~iPOwX? gaV_Wm޼zCêAUhI̽Qa./_ K |G,%AQ0e0L-%Aa i+e %eb )<L1,_E/f@$3pj TӠr|?3BF|V0^Ji_Gka66sXAαywtD&:z4P3@4 0L11U(=;UUIߢR{YsJNI 8VƹLk߲w< @z_)^xc.|%W=bn?pT~^z_*Ls".78-K0H[QUP|`ا-h5g +;Mjen˴#ALI)S) @UA Q~|AY/+W 4׾vԂqxW<@s4g꽽~ #CL !ܵH`l GBCe@,8+@?[ RW+f+_9h?/ǤTB|&==s`iѵځA t%W>ˬyDJ v;ZګfZ؁K  "G`WbcGgrظ*[E˟җtT8|_WTEk@}4==s/JCa[-ڊ_{;`0-%@,%+,-r_J.LUMYTۖ-PJK-?(Xr%6qxK|꫗UCj=cZޫ(ZCݳ-닇LV"ڊ\{-– "A9!G6?w%ݍV *틸?u롐/\ u48=@rM!V_k 46ڹic .@i]_>1(vbxHYBPUhӧi@3_$RDr%ut >,_0i%,661|[R=b,I$>thomC$ r4 pl)Zݶ{x̫Hv PJ100]ׁ`HUQE˿p lR]ܐl*XK.=}~Qy~؁iNM̺giw"#HNhm "l+tF.&!Y@eKZW@lˁ8~iڴ`1گ| [7ҏhc!Eٔ#נ4ws./؁m 7,o@G)|WX!PM  v|A_+TG9_OFeXU]aukIMYtSyVV6:& MCx\r^pܾ! _oyŞ3>#~w ]]sY|Qw"LNW@C rBD3M@: |~+Js5`>toCݛr*f2d2`:PUGF.U+~{:/* W~Դ*(M+ӷ~LZ~&(.[fw HBgw@R"8^lV@hZ(,nvkK;5C^ﲽlsma@/劳,~3&CQF|WͫRl,Xv1 ~`Xh<ZZ"߽fD__j ($&/+?0wMy-`p@ b².1USj~U_OM%y|Y~͇q(-#˺d`@QqO{6uu]Xhyl1>jyrLFb;;\7L1w/0ss˖-{8% +G38,;IOO tt߅}Z^Y@ (@}^ T@xX̿~ٻ>GtEAS<7.67Nk+<'?Zc99[g"y<1qwufqQ VJ {ۧ]ڬ d/-7\ 2B;e_$:GBFU/nق!qM7-ךWeeK4s7t; q_Qk@}4:;/겔kj*#ZZPcr[<|75&{$А.W8Zj|d^NMRr زGIDATdc;-6PFA7`cO7?cKgz{a)@VQАw"7@AivѢEq <(x=@C4%;:f/9jZG@絛iMM8\ .F^1 B?\b;p 绗W+z(_:؊"ix{p܉-}[nA&`HPАS7Ҳ&( @IinxGx' 5v(㭭m-{[Lգ)ģ[;v@O!88jP0܍XbF*Y B=a ؙLͰlFmo&[MY\βX0?mr Bpq9 }TYf$Q1c1t+ (y466&zM˂MMk$$I)=fsk 믿0VX ٛULqw'fBUQDOD'NdS#(~ ȼ`jv^Y03Dܦ٫ u/畀R뒅rŜ}/BرhGcc#[[aRL2 \onN|yѢeҊIM O|;%jYpa7i"ؘȃ^twvcNt܉K o-^na`8(?[ö3 g T 6|S.,LI/7X;DZ[wx㽡粪P^_g2!Ĥ ?GwcEq]P P Jd({{7>|Ox%/az;%:!YU<-4~jyR JyB*J@B WBvlm?RK] ޟ唃]l\}NR e H]3Xc((}nOR[λ131"ٖRA#&3}۵[HYnn0;Z{ѹɕܠzV-8{BB5!ĻG !^yIENDB`./qwbfsmanager-1.2.1-src/qwbfs/resources/256/wii.png0000644000175000017520000011725111534466576021514 0ustar pasnoxpasnoxPNG  IHDR\rfsRGB7MS pHYs  ~zTXtauthorxs,HUpr su#I; IDATxy}vtLFJJlj%4JC(H#H+Q1&DR(QD CRhD ZS)-w{t}>{=93쳇?p0w0n <>}|vN|~x 8>>A.j狋`?CA=|C pzvǡVf?Z_coCSALwl5woN8Y4K ӧn>K=G?;?_ €uVBocRR`a- hq 3 z0Fn9-A ?Ke9sR1Ev GvnZw:/|wq^ȂpjJPf((^ Ͽ(=4Oزsx|)$0!CL~%v `ņ1u6P ZI؊(_wHx? (JC֟^^|?lίG$PXHID0D= |LPv VY.18YvRWk~ a@Q }w:H8EЃ((c{^E^~*BNϒR 'ǭw~͇~[#i>֫&HwpCvJi:gx. q{Hyp_P!"/^潽=zEnP+2^B:|R;W)<h[p1!*%y4& (+ ~m ~~Ԗ_> OYK~Y,~Sϳo2ނV eu@ V,,(x(|z^U8 @7ބ'~q_vptt*8_}_"|qwۇZ[![ w,0?R WĽ'x%<_x{IbwQ5;o2x #x5 Z{ #hۼ?*`x8dwvy}l63 W~a,?1σ]xߖt@{ eUy1 T R*Y; Xc<CJŋ{Ch"~= ڧMR<=::$e@y˿cT_K> `>.+`5:~N\hH(AQn9F=(q$q"B`Իp11~N͉CA `GFFc *׾}?*/ lwCV*\,4/_Э$gkO%o˄"FCԎ "w-\={ܤD} _>pU/`wBoC/w`=,0ο 刺*I;I6%J#$4XE@^,!(𜚊 ^k߲LvK8Nd?)9K/^P۷ +*ŷx}_C@^ns v(d) Y#(rU  1$Ѓa >'l)prnśc0H*}wc( *v&;plF{qҒN>$R0X}-DA4lE'd%[}DV $XR҂(y ؤOx9w!~ß^>.TL(Cyxaɋ>^G.T)ySON=g/_~p8>tZ6NGɤgT_rXu1 ZtO|+x=Aw@a80>Jdz- @Wm4+8:nNʲn>19qHXbAFǠzu{\y}R0ⱏϙFggg`'.;pg|>…_9KO&Gm]^N iD ƅ8z-pC l:YGxg^OPE؉NVvo?4_xȵ d:^@/̳Ud,A#z=;c(/_?!c&=sZ}Vܭ[)M'tR8f$^| b"%5!E>F%;>=ym:?XzK_Da{_9i&S: t'Sv}PЛ #_Yj7N ^%| )t7%%p|l^VMhL#%@jVdHID7a'Ы}2o>EaG3{;)k(n/h h}GxdS>BCB%?6qU lsqQYWgco^PK1;oĄ# f!+I+'\[&[w̢l\D{àD!y3æ6YG1^1C>+iRVu_?z5듌ʔ,MzxčUaE.j-*CQBE;N.T 5/xhv~61AȡWH@K$`%+pC-牵sq|':*g C_QJZ!uP }x*/&$ހiO)d8=% {1DR󗄦Cʨ;Pw{mm';P]9h1..giq҈.P/ޠA<(q\dɓ}=1[|vHznvϔ 3n"m73H:o„Ykku˲2d (~s4"x|`s4=~o1)ig+~ C3p։Z?Ϗ f"ąA.9eYwܸ@|9)WZf_MAI0:7.\"X!Ƽ1kޔ[u}٦C7| IEW0IF费99Z}r=5XX/X낁<j0"-":L$ Bh+2/Ds#s'^GGh q~Y #$mWdzb/;>Y5 Yt^qμHIM]eHMT GEZs7#xǏ}»}<{afU$Y;{oz}x2/^N7QǏENZl:;<{qf?M'uz d + e;[X{܄U$nߔD5)t^ ^(Cz])"uہwSk.Ro!3v@{,d:妥^?@#£G܄*(7᧤CQ.JdK9'V=OR8=pz9W2&y^a)8b-xepU߅`5>%.0{n: /ُ+c*=jg&|H` R{K`.-B;. w; W?>g?[x1`g}>X8<9Kt9{<.IN..Q/vqY0ƐcɪIum.h]aV/Xoc*zlj ႆm(;i  &;}(Cd2ɴ, +߬RS}@~~vuFnS;p6=x9jLvހy(9DAm6Mt R},IߝGׁ3dٗw:eH@sM¯o#ۯ.*EAN6sM:os3~y QHtG#y;g:l %|_>Tvw[dD#wdQRGxtS;W 53~"&`2t!Gg#  jQ9O9hK˔B-ACFDj6&7MT4!p&a1{3jg>o ~wƓe`v1il]7Ӝ9^w)-lI:04!בe`9k+]{-ZlzO}C DUM (!$KDmRjΦ.t_t J~ ЍPu/:Htgy1عw`ЧqbrD:1g"Frᥜ?t4 vLQHZ;9V.ڝRC1YC;T(?T.رT.t1gߦ00Is][ފR'z5vvvơ}=PLyzo}Q׏#v^ts aǓ_}7F1YT2qq:jc2,6-$G#~ I0́v+Cem"fJόJ{M]7l>n.9(h;F=6XzF%LG1}ϩs !~ý. I} ;pϾxy\PP9 $‰ef0C@s2Xwգj^gBjb.0Sڃ(L\b3 ,fY]pj 7[m K,.< IHs wh&ԟ00r<Dqp(^;ϓV`04YL*|32l: Mc,X(C 5%sXCqS /ĵԉ/#pU.u6uWĭmV#lM#Xӓ1o21o?[|A`>nTlOS5t:-mw!:01[T(`N9[OO} 8:8 Lě`|ajmR*W.JK乇J a IDAT2W' сՍq%/\W jm%']:\ HI)Lr!oevYA'TM`xlZqS%(g-)`{v J먌.S~nl/Q`tQ2ԏ[{!H#XU ~/MV\شJ tρ^ԺV2v@Z]@D&\{Lk_ʗm|.@f E0*T1'-$fPĨ*y^MG9Π .d((_~`+ҢydIs oGɲBYRGL4zev;) ØBͷBb].$ j{ $K s@C<jTbf2d"̹t=%(x -kIc-<4c؞#(r~~sH-u9C=-ҤݱS$m]WYۿć3u; @S+uJu 3"ctr.& (In~%Rφ5W `# G< i%l Ohu}Hnf[s)g@p[5$q%^BAgj[og_4 j7-1zR<0;)c>ҷ}[ Ga%ԋ\b8wQ"ϒYVx\%&K)~M<^m!elb3 {9\WHw>6NE_>0k+!7s'BpĆ2U4}>ϽF >}L>l ^'ld`P ` "x|> !% C%. "Xcܸ) /6]ucumI5[sמm)@7h *+ TKk}k}e`e&KQkeneUb&ki I}"h|^~&c5«kV/]m L' 4$S4چ'tdƢo.E?0j-1\_UNt\ zR.auwKpRDXR^\!ʿR1 f=WBeS`oZ3d*%ѓ|H^Bô%=أ=(PhLg^sJl6˧$IƃyهJ'aDy@l*! -?ՖU[p^#_}!JɯN9m(J$נC~*z!uy=k/I;܆>Ĥ-:s۬EP( rĜvS>...~߶!OcA*H̹rc{2c "`Aʴ^}KΙ__FjpEjCqS9*fkE-Qz+%ԝqsR*2DAe`Js)Gx-!fBa">/^< &\eݖ=Y,` Wkdj 32pWQϧ09nH 0 I\-z.>gQqe6oUz0zԸԺX,u 7!udײɾ]؄0PI<v^Kc] }SSʥe5ỹA-X~ )Knj`v7!zu2KI{8fRO MP&_79N9^(+ $1_{(|IL ox7hEkLg̈́ m0|Ѹ4 PN HU)st"4u@3n/,Bħ*bQ{v k\F礼$#025 sV zZSɘ |i7E|T=gw{ ゙04vn1AY^\#|O%%75d+`F0xxX9&,)п}]l? l3oiY׾)nKMr: V1:3 \Tj1w!~ˠ:Fc .>`R: Tُow_DT"RN(34 1ЕMX&4ooPg`7f! ߫W`'H.-BWg> DlQ 3Ë}qFA5"NlYx׍ .Қ8H`U\zI1WI߄{}q JFeSˮ (ڛJydΥBpE0\eseHg4`5ΦW#@qGwn]xGQ뭷8H:LL%:T_{ƪMp8& oMQ&x肻nEE'mI-VXSQŀǁ/w Pg]M)MS@rKV!X:k][Zr2 ҃(ۺ6o {Ķj*4wjQZ90ʊ{ `ooDTpr_f0BP.ʹm 50P(QNOpkxګ㗹LWs|p)O<W2 4ur!WI@ _* P-`S(CSDW.)+ݨ:Uf.b¥,iIxPROߠ!T0P)-e A% ex&&zclPpQUk-5 8eJB7Tj6l Jp&:: P?P{uA-uӸx:~JaMp%@.C*#}f5m z:NFLtFW<\g1c 4frEg)pY~c.f'Pw_\PEڱA5kC3G]9a ܖvmKTʇP*Ua N|TdYt 8&D[qf(vC 8z 2¹)Tibvlaw o/N2K[$wN2Jw\ID_mЁmbF[%])@J!K\ܺ摝U@֟EbJJ%;)lX_u¦ex!d#AuQj؎a`)e |=xFx`%@(MTB^u'b! @rڲuuw#6!,~]ο[\ʐ֎7ךP(I"0eY6 I*ޟ˰;eqЬ@wÁ1*h_^J͢%g.BNWZ@ y =YR1ՠj㙑6Q)8U! y% yHЈ1# ݭRUYP5kQ웶?>ʟ={Qxu o_WBS?I:4/h tA)A,\n\cuFu@ԝm 1nǝtEin#ض -QI*(.{*ʬ(aanYD)M33#S 9o /l5pq1>a(411::BM4 b)!t|{> < dMAul?B/[E5&@r2<qͦ>1\O)Hr,2xTr@fAa1(aryE}4ܪU{)fM;$l5e> $pp-7[jV{* &׭:ze]IZmQ*Ke֠T'|k}2hV|NU{ ;p" _ZB돔<Ld *H"⅖EF*ˉS\{ X_5TTR'1 zdh[RJk OG \o?G,ٹMhGX„̶"]om]P-$p3L9 %^]450 ]VR( 2Q%7 l GߤK2 iZjwh,ʗs`@hA @{dO%ܐNsBcK8u:Q0CF |v aAo_SbtvkEN!Z&Rf̹wY*kgj}4Q'/(םx_ɁВ YZzwnvai8'w&sFMK!TRH{LWdf.GRaf)g]N~.<.Vbu-;Epe`Dz cƖ$)>O7lUT'=yڲIMnb&IBM_ |ˬuC8f #"ĤMrCE?6a ziOXfii##!pHN3ЙO,8OMPU>dŻQk Gf}' .} >yȞ_5_lPȚ?ի{&Y?U1-%ǔ,4@%B|a~ODY7;}WLpaoěX:֫k@I}nz;%p=Eۤl+?3*H,ؗ)l/4PدaU2 g@rx>` {nID\6ZJ6)1w)ob! ! M;yfzk)\O]iknkI@oY^ 5)[x"$MPXZ4<|3`8웺)  4`0dAS@J>-䤝$;UumǬK@SJ #M(iƇDgfƂnŲ´zQ=x~.z OAG!.?.\eAq-fߞohh)m۪u}njunS4X;r+] bBa{'"1mcPaM]v ]EnZn<ȚlirL'T=%$ \2!&xy+!NQ?cFNؙ<4Ri%GjWFw#jEw` h*dUVn1G]@Ht(v?uO+*316*@_J O30`zv O`i=1ڇvqYq: H/}t\}M ]rG74zu|wq3ic0(@;ꉚ" K*[ObjʡfCPG` ?-bJJḩwX_-+8nK keۈ]ҍۆ" _=<+^Ӳ9n1xTTkc!V݊Htbj5ddZQ]o>P%U P_g d1<9c N,F NĢ1sLGP6Qh7YQ(EkK l[ƦӉ/Td @]ĠCh1R0Dֺ!C$Z @wչM5XЅT_:6z{m\Q(+ myrUފ'BIu/9[??LV~AB@ZCP]gmp 41Č&Y2;"\7&e9J "rǚok2Z7gd1d^JVB%ddb,BB(o>Y"QЍiG BC:Ё.R+jmD Yi,sze@ SM9nRPJrTSO;#I&KX$Y&̹}13lCȿ<94H̩ pЇ^/dj4&J(@@ ڀK,c;wV%'@὘ _b5S.qTţu=^~댶R[;2$$g f̈Zpʆ{!T`-XR9(HMinSw;phf!7 tU` YIU'$--[MӟĻܯ$hIe@Bە{IF3%@J<us?0 h<„}?2\d9Q1M8cXA $ ofH[t`tf KG1*VEݛϡ*+ֹ߲\!nCp\s\JYEkM3?L .xB "FSG~w@Fxн:7ZX SrjLR jPADozL>Z,:mYuB%oay]!Y>hh/[褠k4oS4PP2 6XETy=$v"q$m}s"=4߈Vur&&]Ce{ޢtZnʓ{tN'mtL5рW*BD >b4&e,PT\‹&^)3*u*>'<N#M=ioM߈*ҥG=Mn,7Ck/b~fd!00T#LQc՘s(+땓]t鼅N{ tNPcB[R.7Kܫw/Z*Kֈ:)ۓ[3'0g@Asx!a>Bp:!BBddTfpq: MEmIDV%¦br0|(y=TmCv'u;}`Z!~Y2-VZk0>#[|Je˜FAv\6#! -0mhti|]oE) ݐݮV}׋_r9Y C(1ي IDATjFfs*˗o1fq.BԬgïIvCys N+Xr07@0Ȩl^c!'0=;a>y!@1 6kg<0/%7HŝR~ /nl-f,`.VBXen@<~97!'LIǩ)de  M"@47!),d>m3W=l'`uF}e=,F'<qKg*j%Bv}K^C ek.un=K¿ri$'pxx߅~5۾/n|krOq\)@ =l|6C0!;\Qr nYv1ŎyeP]{m:C.6Qg..}e6n-(ޓuN.2cT3n/ߚ@<:$#ŗ\7T>?7m ?gn & 58DxC@X+2:bzX^ rPʀ7u=^K(/Vߍ_Ӕdݥ9/Mdvr~?c/# †c0}!G# u}h}< $#5YqsSKC:7Ӏ24~j ~@1tuX |˫C8A]umT@9(Ym8tWظvsӧׇ.-3ΫC`v6D?+L)0ʏt_@uB;jUd3pa@ւnD[KjTxu^Uylu$^Ai/A(m&`=q3AbyЍ,f:CV< * 8G O'1 $ޠ$x>5PUjOru\֬3wY$,X'>}[x(PS]aD* U,, 3}۴xJ,&.& XY(WdT*$<@H?0C?aHg@fMgu|jd ^dqQpNW5 CG>,XapIޯd*_M,>f;QFz4Y)mE'Fe\yFn Lkp!Ma@hoD ԋSt6]Xgn%⮪u5UyM+ǽ$vtR7X;R Ӕн-7T5d,y chG7|m&_ jit̠^hEhs)|zEI'Db]eo9Esry0iy[=^Zw*Mk**l=$Z6EW^/_s"N3@AGA Ca=t_|;$J%'^g5.. JE@W -MujW& 2NMm=dl?Z1\ R-+ZjμFwp'9M2*4g.< 2̟vȃY21p`롕ŧvXSAkA0\Qr.͔ 4%rO-R >(9_9ħ.q^ʮ4)e/R4P= EE/L&mAV5Ć, &8F@@Y@5\$$gp0po$ v 0[L=|"uk] څ׍0n7M[J}l5T^b\ٲ<'Yʂ3 >=!jX PPMNLpz>!ȹh39~|՛k.3댻siOSўNܛ@9 *<6ZV^j &Qwk]wܗ(R9L:*I ؝*Ԗ\NQ]V?d;<''{!ht_Z}s[k0%3>, )R,w2iM@u}eAl,û˹y:'")QmoZai/+ ϕ_Ƽl|ь"J_<VA˓\ d:}]#ML|aJ- 称׉L0,.%Bڝ8 %k .Ŭl+<,'CQ+̲wz:N[(vW_hTuJ|+NmcB5*J;5dgW;B~4WApP@׵uy\ ! &ƛ2贡p?Bų|WeT]h QPEAMbCĴJ\nܽmo:*K. ƛMK| lXz jv?{=ښ@m*]LMѪ Ts`>J!IB$_iN"HfS0E!$6"iʋӊe0ޭK.~MʛܯrLO|!trAWGGGnW7LnAj&3@dyd4`#"3Y&)CWX7c4.V׷ߤ.Kh9 hMeYWh.U"(C 1"R]X(Ģ\ofd Zgz  M SQJ{1) l"H ]G æۦu>BuST㺴B.`QԿeBnU !a>R"'~I+bsTڇ&t;kfk6pJ(ҼU@(B}.]( w֟ׄ\_/)bYc,זm4.X 3 3RNF hEFQY#a RAcQ 9t=hn\}=$^e a43=KU_yH[tݒ4h\ú2mrhV rۡEsq7[Dj]_%o!5毅 n2T&LVj 4`eӌ JLD@"gEʘ*,``jB2VY/jq0k}*W.5F{rJ"xBSwqVIqfعO f#>˨9LZVtmzoMi3 xV8#>`E4`a KOxNsJVDIQ.t|3F?BV{p]Dua >)U{($^S N.ּ=pʄueEuVy-jτ 3<4ML(Nf̠ "ZtqX.@ovJRÒb롅]ڑmK]=hJxvݪ&UIRNO[}!lpYpM1ɧ6UG,@ć >yAF?/O>%~6g2, mJKaMŠL6]*q漏:=5Ko` uPngf q/b5sRT>9id[R tSh<:B;4IBx eIy4F5~$n"J.z/?cDYkžДۖugm]cy}M.08c3価VOh8C>C"qU2cj;T**BNNsEGz5bA*%X2FFuO^ QaXs-S,[3L*AG50Q[jrj/c  "#NGa1WLRRZ4B MD1bb48fg:^'$@S tyuu iY@ex]VB8N䗾*Z㙙 n@c!" Aഞze.>YeBaeSHnnZU|rm@ݢ^s>Zm\ُz%`XZ%!@NQknܐ[ӭ J4 t{7Sz!D% /au_w{>Ʉ_#6&u0t9/ @L?tsI ㆠ\֦;lROZ7>.?+cYr ǿR@ z\{+ gV锑~&'G':ӷ qc))߄N+Dw-x?/|i"Eł$'_} ]|uZWR\lєlsÀKDט$JP[類-B7k4UonCœ( K1C PQbkZֻX1gͽPTWqWw[­!^ )eIOo ^»Id߽.u wNM'>EhA!&x;}\JˮUj\ot\x3NXFsLKoY $GY'^E|5 >d.d]-*9fߘf@Y?\]1.c23G{3(#,ryKdzf5}h0LK)*ŒQ4mbĒKMf[IlƠjjt_ (y4p_)y}?1_f:I߅m!sp}Χ(؞>>* cj 7ʵT"iw((}r5c1^fEGo*TUj!"~kLY:?x<VZO ,ԆbDaJx0vB/%l8rh %]}bؐ;/ xS(1o ؆*͂1Xtq=G!Ts֒w ~E[-ʁb/_O_يftU Γ!SF@ߔa8phrѰ4QaحX:]j DZXEk-^XB\^z\Ѻ"Yl%T 5Y.4`#-/CirUp,:\^I:2pUF{ y% P(Թ}K(j%JBՐ4޻.%:eG h\&iR*voܵJvR.| 7IDO3/d:! 'cu"!A燨t@@)_ 1'yi| x{˂\;zCݦ,ʬw(.h^$ԿoDVUX&/RԚ;?8D@I&e>r DRr0-5禇~.˸yu9$)SʻSx$lKgBjNJֵ[_uވ`>=sRd} ,cvJvMmDD) A'2[ WSlr@U@~C$hԸA8ROlɮnAع7tAEL-q-$=EN=z3Z~[e1BQ^"0/4/"mNg#(fpxI;:j={SrcqcE+R~GgoZHa(ɜQҺ#1Na@w׾L[KBz ihHațߘM &m69rjq|t[ãEg(ˇT 2az?{ `eUI7š ގBCf$˕jMP+k]i\i1[!гVd27Nẗ́!HGga0(6u{z5#rгsu7\Ҁ0] 'l7꓂ɐ]6 L}xx`UEJ/+)k"iDABPnx- Ю@e,u4W'7̶4=dti5{٧Ռ!BS B`<=>^Tyl(0 C)^mæ;Rq76U!&,x*S,c*\*m@ \ \FPcVrnW $Z):ppp{%u)A4A >_vQ BGT@&OKK`"Ki)ݔ(2L_c/XwpiVP:S Rkw`< 7P$vhk޵=?քjc`Xc)C+ U-ؿKo{Y)<$8IJ  K@$!߃WǶOꈣPǡ 償<)UZNLTҹ4sՍm[09콢Ֆ\^.s&]> ï"-<<:g_n<@9 #fy!$w? szC睕c$n|`(Qp%AVKȦgӬ\ɍA} .L;Jw2W=+4iN5MT?g;MhuWVnOzb[KV# <::j@Qϋd)>wDqĈ!O2` ?dvo_')Z^I tX1H=J2Mw %P*z,4 XhE5&1 !|#|CSojQE뭌,GkOϛc_oCrg2.?U @t ިqǤ7G𓄒/|.gjwn(I V!Pqe0=tIKQb$4 ]ND0a0·~ӧic/  9yQĢ;q]RCT%U-P.xYT*-Su. !L L*ӀoL^Ϟ@sghK^{ڭ&]+ z i&wz3eH4 A=GC$Tϵk]3~vtf~װF5N|)zV++8 4*rP%FNP}5:*ЉN.~ysd@,*Vjw~ "PX:=d(Mz< PY UKqR I\O!O&zFE9' F&D(; D1Qy)3I1 =P2z_r' @4 EtJ4n=mX+N0߻&YKuvv{{FQWc̎?X_‹'V%B&;-% Ub*`nև+huǝݺ-/ /́u.J5揼ɿ/} Eɻ/}/~]pzz_. 3᛾ӥV*1m% O yJ+!SsN.x* q;pVP3=Mavى1u8 U.ӕg,ּ W7k-=\iAw& W-{0ϳ={|L'_{I""?Ytp8D[$M-o1`. Y2 2/ vY6 Z0 %і=EP(pfz|zWDˈ̪̪rPSɌ;s;AD':uz&ٓ;8!@L=d*2gXWj6 \9KFtQE~f0VI.`*:#e9fF?F8Wg<]icek[x(]޻4 xJ[y̓hh@K[ﭭ8S;[k>so=$`x4YŖ-nWM :7J|7qܷ$?4PK%v3Fs<ҫȼ I?#r3ȎN`׃݇jkkkkk_Z0t[-7x'0ůz%1讪zS>9mPy|s1iɾs@<"h7/0sq RɅP{e%6"&*Ry(XV9æȝa Tw2F~F*bv)3*N DKx %9S]B8 hS%bN"+Gje#7佻w-I͛8I9-(odž+sGoǬT`new>LAy>ar[ˠ4TY~<[jF҉HҦ\p)a0VKqg#_W͜<-\d$^cRNGے=waD#&򼐝 IeUjRQE#2p8[mOh 3k;joOUCtJfh#け*AV{3 VZ\||b6F_2 ʌ eHFn_s8냎ob*G0u,90ɜQ1U1b1o2S&n^NLk,L{}>d$7] nk\Sjk{[mlۚe.چ:J=#ChF3Or$;6yЁdf"<+_9z\8m/fhƚbWSn!v33 4@7 VPm)ƑS7j@0\l1Aa ebM,U=tNrBu.@4`ukAP jQ2J rLN y)op FqZvrN! .80x5œn,<uL&$p%l.Rtr ը\Y46):\HaQ ,^Cj9=GȬpU[$vږxm4^訠M`iXwFS<꼥sk ʌxA  F͋8][.Ob3&bV=h1\m.[Hz4v@Gpc.UUBI{"99χg*MM/|s{a?}u峟/;joogzu۶~oNm Ђ5]Y!uc`D@@pDQ\F,\Aϣ`LeFS5bҁrx#cŸ&n_ ͊$ܻ΀"2܄,fm4=sB?s5:IF}K :զЁюA<Ppؼp.()J\͂N=f.Bemue1Y3sKTaX/"b MH7GjFy Txhl#Z4d"Qv{9tppT0i΃Sljx\Z8EK(UUͫ3s67z7{,#b]$irf@q%"th3Gyh{2ȾFg:HQv[]%HGE' BJ* Ҧ_ /}8>G[H%ؿoM\?>`21e]-*Gu.]w3|q`0fRdϳ7b@!~.̑[(m@`В,:G}!9-t ]m;j71M@S#02x !18Hѣ#uH>D8á1t4DEcà ;-IqO PhEz';QfgYNLy?E]QL] BjWz Z**7p"? "]X gHa>"?Rϙ!'KbQz-w o,FjZCeD䄜RP$82nz~k# RcHcC 5>Tw?KqMYDo6@J` 1F\uV& ^ NnXǂ)C!֮Hou1m4'>˕X )<9%ԛX=w!(1䦜72Lz L+Dqb`E 7GH33M9My_nm] ~d.$6ap93>6bͪHMraPwSbDc)`c-g#>4D_n&4/HY^cz "Ղ"2'XH%2\;yO i6n "&+Ӟ(9`oOMQu#%gv=kl*V G~+Y>F dh'k wc]sO!'i[@)}X[;Ȥ%a;w~k0,@&GQ^kgp#7;#ZwXlou򊼞ͳ =PRȫIGUHψt": :Uq*;::L/[ } *LXc ܑ`گk6`s9)_~ߟB+"큢/=[wTkc4dTI̱C5 UDx IxL>83* 9<{Ur?OzZ [鐨;M̸_touanNY߸"K_ꭷU8 kqj& l_A1'%yHduSIDATG#< 3򽨛R0GA((s?l'4 EbH+9 @Dʌ3v%_P o=_Z50:.qZ;~^Sɧ >1[{kb8"M؂_ZŷqE\w'^ OW 3M8F ` gJ|?Kmd.Sڝʆe>PqJJp89vC \Cj  |KKyL4{ 貁y{"`p! ) |D ؄&TbT}ʊS?A[ 5p{We@'%r/2s%Ӭ<*+ ,~'p ]-)2p[\c&[F?y2{Pd&b/G 7Q\'VQ)iZ]G]9*/H ב֠ٛdYJ|å&?rǵ񾃳Rœ-Y *"i4)H4! Ei?Pc.4|Ob留I՟"2.Ҡ>ŞJpwЌ#e(%VArB'k¶I!V,[{Soqe >Ո[?F-9o#&`#'*. 3 )O8DhdL8<:&[F{N!hʁ&?*oMQq)1St=Ck/4/>` ^&}AP+ e" %rRkWG^_*(gť0]N$b :]6&D B{-AY㌙Kgͥn]a, ᐪyL!8=y(oܝ5DѠdHdQ:Jw/R#)Z^~1lXassKݹsכ-X0=!aBByR:}E8G %H k4^UZ~YJ86BJ^ѝ2mtt>*Ysypfa_b^=Ċش7nq(̬{Q`_FbAA p{VE a͝2 n @UDA+Qdizij ,VfTyeF(?4c9GX( 9Ng6T:]k_tynaLdg0zEʷVkwhG~E6`Ge cr~Zqk${ ˙M59^'3K}_ќ" D~~" e_%G,֤9h)x: N{608m<*nҍUE, S2cBo2S{_&Ƈ݀3xJxnMs;9m +x1`p70C%',=gnjj.&z|aNxܖBYV#~eI8,RQќA&t{ĝ,pr)pZI&REhrx8V:_nn#)@)R,Sd.EO[ӿ u%N}O}}x0@cn]3 `Ӎp> i7߬=` ~?GB$F EK0vJӹոb0*SdH"UaMYYB[Ǖ2v6B|G۰GY3rgk?7sd z" lPaci5vAhx9|j<:n ՟6U߾666_ԊXumH٭ٲt[»xgg3U?BpWщ 6ҀI4Pt$:pHX[&?>`ɊzfDDSmrA'op'il'fL TڣшZdXMdUY!e 6g{v:3k|l&H?8::Rx&bT&ȅJ r[CFuRoU'^&3ܳ@!Xz 7~QYEX8iԕ&F}1ͽS&9{[_G4["jwA`s8&$`=ATb^O{Y~w{{dvAc8f;qxړuRYUc47i sĄ > "M Jq3{E0U&|Ex's/q9܈?Or-rXI,PcS[[EjiMk4Ytp_Y_ZkLt(hj縢'0p{rSAPpjIbRHXI3T9 Woo?r8bYNOߝņaGg|iz5mC!igF荍uM0t[s'n.\V6673Nmom k]?/_%s%ę'y 3=:"Iе3JU`ҀY3BW#J>4IAvYHH-/NAxzE{tԣYɭq%`~||Ɔz-;¨}ރ?ûYibi`t!l|o/>L;[k:0@QhpCף 8alABBL#4(& UAۉkhuB6-)S1P5gӎg@wp9Enc6 ee^tc5ii~C,u(:q',;ָ!5k ?yO綶ΎMyO~_{e:?"ҼѰTaZ^ԢAu>8…_E=- #r[+-E;` U`j#7EgE q`Ys$HNJ!TFã>+M͛)V-j7GS5VX^{n'[__WvG\ۀ+1q&{|[O<7_f#aͶ7dÇr`7T=tҠF @qt0'+vKM[UoPs8G~)NRqp~qL^19]k IZ&rʁ[0ފM\Tk ֨>~{?ppphmǏvmm8P Lvp6 ),ϵpc+B*X $)]TǔY68p+M&@0sT&yv,o@EL/T4x5S"75h.tN&Ԫ5͍n[ l!%u8/֗n߫Y:H!Gށ5cuzݿQ{Ollo}W><:i,`܍(aB̥%-Ԣ.2.2ylkOd/~ f($_*4D!""_T_s@ޠ56 Ũ| p^Om?7s@!2؈G#myP緬|{~rmcg~2>}y6֘86F!()İLND꥗ns(cDK3A֩JCvي%18s : L=)xZ<4Ճ{j48Zy t">wO=eDw_IR`C; R6>^ 6lDGQ;~_=%yXpp=Ol"j։oz7o>nx5^==?wҼYOIENDB`./qwbfsmanager-1.2.1-src/qwbfs/resources/256/remove.png0000644000175000017520000004515211404701453022177 0ustar pasnoxpasnoxPNG  IHDR\rf IDATx߯mYvsϹVݪݶFA HyBBDD@xBt8UwY8E_I()1D?. :B'kYQoWLc"?x"!^Lcrtc@gNL3η_ $> ȅ ( ^3@QY`L"P~CTw/HcpxeeЗ{,d:Er'uiQBLJ1Ӭ4yqLiS!Y *X*N{I OQvP"~|@J!M_/&Z&0Uˣ0$a Y P(ډ3+W4.8J[}@CkuUf-|7g|̴UֿnYS}ue@`:C^B"&Da W-cwi5?&umF򉮵p[:bO_ʁGȄ>R6JzǝUd͍ix"Lў#-R@pCg @,P#WcľhŌdo[:YQy |<jZU0K[L3{\fO󱲩Gλ{Q:"n%=^B}qdE{ى%p+h5':J^wpzPsT"N/.?<r 1"GYx=G]+D[+tE%VD@::t0"(W WP@@<<',,!ⵥњ9)ہ}Q zImIaNosd\P{q?q~7?"/)NQ2`HX<4rǷVhmyM-vu"v˾}f'ű_ (?0IǛх 6}AddW<]-mzd q@.O?f؊!;Okc{׹I֩ΧmfCoReW/@\ M0 ^y}&D$IͶ' Q%MV\ֻgD"L#MVtZ%/=-QJj O(,V`5^ء[o l_~GHlNq"'fFx^`W IQU:bt!@KD=ao+\aYN?D8Fv=\ K+j rv!mժv3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'3F'? P ??\"4x熐 (*w@4TEzt+ #A|Uؤu\  iVn^{}p@RH >Kc`0ȒwTsj\ M>v}b51|Vڿc16.}OW/_?,-ӳOO> 5PZv+L@KaM<}?OZ(]\&5OX% Y^$D#$\fA?'iS&:6pr@^o=֯1|'2x_1_K+oo!Wv) NSJO5.kly~ x= ؃,jyhuX]\%H5 đbmS{s+:~wmg f0r\-hǿ`@3K=󦞵w[2hB=rFo-Sciة.8Lq(s"]e~y1r9~CJb>D{?}䪌7ڶ02auvZ UXô, ǦA;G؄gJ?čɫ"tܯ JGKb3{f2?΋oBOvյE FqU' wpswFja= ^o^[P1EK{H\7Ivʳ<>W &R\C&S._ՃK e{&S+$!fWKopQ(˜@>ְ:ñisݜI㑳^_UyI]x\7U7Bg69Ͷ4vaae8:"oO)>}.'eV-(#'J&e#g|v )ݵ/q p6S -x_w_# 0j'~ !b7=NbjۉytDm@1^k#{rb"}dG~CYuI\YKf{2#ڄYe3`+E}mrB3vu)?&%0Ű )A1"%&=M4sN6b/,̻m&jlWMH }A#" A?\7o]>ga;ruU3n% ej}L:{~?y| 3?G،_Q7>\`iGtrX,B:KOLȀꮉxٱyPo %eyo =)y0&22e"UBKdqÿ\Gz/ ]g*EA9%PU&+;1 dU^D0kaU)PYE#PNBa1bJ N|Yl!1 Khw56'{cZBwݷË] HO*u*n_G<^wA~v3Nc6o?FqT`Ʊ?GL&1#JH+PTTMsA4%۱̂,;ע>}+$Kx d5c g?U#7M!]SA'EN.bM+JWƧE]!q."| S )">y_UeɢhQ&ai\qm1bBQe}6w|I͒ 򈡰;S6 O}$/g Xco'ԍr )I3!kaTEP6Z!(@iP†i -SI!ٮr|-4M0&s"ŏ7O}q/ p#óӄ i'{17#Ya؁aڲ*ko\>`|ÛoXs)69Q#l dѣ7SCa}M틩kwEd?vhYjfS|X`*uߖhCt$ZS*VYQ1YMz?0 (]^]Y( ο f9 ~}Dz㒋wF 'PU :pJbsńL͜󔗦|[h^sM%$A>YfK#3(OjT,}QJ߳[/cV^{F_ @aT>t ^1%{!_~EV>2[YbZxR#5AJJn!Mp}^$&DfyHЫ 6舥ydB?~톋7!o\PFxYLP'%ٵ:+BZaV\fK"! PW/0n)qxqmM.:Kun[ YQ{7sʜfBW1F &e˃uY iDWiXvb5}zl3z }Sl^7Ry0Gsbqk=3k}#;fiw2e8aJ_yq10rBDH1:v6+eok>AHo\}K`X(BT>a_/F­-G>$#'6tS\-&}P͘|jÒHU]cQeUp~ KM@Pr&g.dzTP/[|>uxEv X>+#¤لyؐ* Hhu[_W<%=d|l\B͈Yh2VB/:Oxo~ P5{S }gDϵvH<߻%$&5|#%ibْSjeTHQb?UHi@KffW뉹=ajVT2 '\_ca‹?m$[`#Vb 7K@C/{AX18@BCEB[Jϯ'\MpOAvS+~2(Ȕs(nTB ӧϙ<# E2"H?  jˢ4*\)ňjYe1'1 %SQWRLCeakµ6c"KwGSH1P}M4kR`oKAsl=/\F)1M\!w$HoTW,~3oڸ.i'1JkxW{ն["RrwseUu* N6tn%8-僧?Em7.7vnv!jAUpOfii KgR~%K W`ovE<*"\g|f]W-`y&&859) rjNr"px.Acd`s3MӌCl1ŏj R1RDԌVc*`Վ"6=S9315M$/4I6 ɦƯ؞S=WhC'ʾ"qύ74}:-\S>ly]BAq:d„w-;t6Uʼs!p6tiqM E-}嶌ڄ~uqDLEEX&s5 Xa9>F|gT:Al`*s.srr+)%k oĒDtUD,QHp҆!%V qCqơn 03Z&W.=O}^!z!x;@ 쌍٧Cg넠{E?|A oll-ê݃]'@Y|= +|@-W2,ƆW* b~P[}ĊvĦR}ޭgw ^(,cR`җ,Mw ero,Ⱥ. 4HZjԄŢJJ>v IDATinQ }`Czs91&ZuPc†ev%Z8 !IgO5tgk&'I@#k1^ ,bKw ĖFIDo HaCm]7q52 \32S a3ٌbAHCRM[Ŷ#qPP8ɓƘ{tUbI%+. Йt#SqT15B-Қk<4_گZÌ,͔`_(L_h3j$ԭ,xE&ЏA-1B$G LvM'-W[u/glfwjJ"k^lT~߁y~!܌A1ˆpjAÝ$ QI$,:@RRF c1>`uIA5^F_7yݽIX`(lTua4ޞ(sˣL{iSo9|^ b2~`pœe@ ijlqc땥ZZ [ }<+O'O'.ذX(.ҜB ߣ*RWUc' o^٫ Lﴐ >LhBvj>IYqV:Ir,PܯK(aH#I$ $aH`2bq+$6ɼv4`~"^8yHp1.x!tN~;V1Ew$'.ojҶҸDC+@t-oXj5 柚w &Ff*!mi׸ :_f_[|]Ds:&`vR33bpT^4008kƘX@g6a:5jepDr"QC*)*$I> $1" k5LiU;_{H u~l2e'p+b>(KƗtnL쯈;f4 ֗8k@(FBwMM{$H(3<0tL599,m\gv^nK: 45 T*-G6noW1{Rٗ#1"_1ք5ic}rϐ؊2ȼT:I FO1}<G1A"ܶ3Irk [QeK&=ߪVʹ'nI[ FAD0 KY xm `ee[0x*Q.)'_hr !i~׶om{ՈŁ.1z ,U{önZn%S%2\t[&4]&JEˣߵZi1~ia4xrVu?k>- Lx/r8O y}g۹_ٞQH3݆؇z 1zSU@bl$Xa0V픈L#ՍoV$z]lR຺sc<ߋ В@f z vaٛm*y!#cDuII21zuYH5a}X ?XmUi5 _۶ܨth D1[707 y'pH I= UXIp"UJ =bnfHuQ@W7? ŔجN=EJǜc\[5 7>ሃ3ָi40 UCCCwVy;=6n}fF,8f6I2W3nBۺ ,uo,зmh?~ۊӆo$^# 25{y/oC nN"dK}&fN<و4e|yRW[wj6֛O͎z 4F6Hq0p+$7'79v1S^l1 ~|U"_Ni|7}]~׳Z|&-䚫5z) ~W‹t2gˇ¿v5gH'q@[`~ۛ9 hŸD~T G0[Z-}mYn~\cgIKf.E[l RÚkJ[|:'S8&okFW>Rjcj_;Dou 2xZ/YImDȼ>th⚾ݕ6;fWS;X2+!޻ 2oa-uin17yG$4~ʼA+ntڥ>Amu XkBd*['Y׷J]+?SXS1cOg- F|->','#&i^ŋw$6\eAL@Ϯ|af֗#7oIy&E__kk&z3iǧA֭kRݏNY+رJ;][?xΠ(ف:&vڍ>6笳&nW/{ܒ@L6y40~uo.NnzkEp~GXVmsŸ4bg;Ue!hc)KU.iʅ/߄MF`qaեRgpdd'3MsoS726#K_cfڑЮ~Q2n=bC-#4좽B9񪸷݀kK I,hzq}rG[ ZۇPEp'cbjk60\K~o"6NW/$z.ň@K^cݒ‘sx+Rw~WOUWw:_`ۀ%w$b ?jK@|i_>=2$dJT,U^p3CAŞcZ_>,ZkaxFЏeМv=]wP5Cɇw]/k` {ᅎ ̛|̫m tH l94Lt .Em~Tg^ \2!̪\Za*ٶkoR{n~Y{5ۛ_*i ,: &ʍK6:p{ 8aE/|.k,=U^XF YS|LJ?Zs?q?h}KwE^ik?M:@$!I"!aNs-{`o܉h ?/^~ wVFp"{Æ' mu<0e%Hjf,ڭk^LD*o0dV6."hb6&3,X;7 |}>~:%aφ pst?svM Q ZFQ[AXLǩ}H5 9' cPzHXM[57 }e/,w@97xV[ >+ע9xkk%Ҵmˀ&-A8/K1R< Y&,ޮ7xkhOh{+ew; > ?P|{hԅ{7̏W|پyruDv"!^.\'.Νm_6QPTk'6i'WR$m66>*+d2_io?;5d:,QMqB[ڊe4t.> Xm{p7 #-hcG.fƣ/պek(Z裯Mcf~X3˺6CV~ j/Nn~{r^,BSFl j ZeCX>঺(K`~BX0cl,&(8$K[t}<;vDw66}Wk'祁e꬚P7LP;&D{&BR׮0 \J"匨#62޿Dwab7SHô&Jf]/Zj1BnG|#_c/]x/S&MA[( qVH]j}/~e6I@p.g4ŪH(>͘|x[Mݾ#&A{^6ĵA}k}̯O@ 櫴+,Fkĵ*(2$ί iwdݢ3=7Sa+I2QY b,׳{$ 7 U li\` v(uN ¢J֣ 52BDe Esbn.Ŷrf;9"w`-Lm7s걖X'9w=@RkKL/2DbyC1ȃGLo@Ҽ i~x!fĬL݌P;i$w4?AL0E=d&BaVnNaRRb9M#+Ѽr^&6_De*va !n4fQ2zv%%B_Y;:,=]"WNX/F ˃{ w@2kbjC|[O aVpcM @*wϡHLfmTB$ꛍEԨnD^ߥ!}9i/;+Y a|Udfk#zC*d(Jǒy%QYJ[ BN^\NJ$85P_ WUlEsvuXeg*$7MC[(v,v옽s{R͐yZ>.Q~-a>am b2d;nYxdGy.^ce{vj5c' }ǟ]O!AD ҟL ~ |NRټ-9H{|ճY2IQ\knoXG: B-?u>; dIK 4`44uQWG@38&-F&u% f،vm8J-捻2K|`Ҷ~M{# 9>lýDVc{T[UF|Ў e57Cj ۽N KaWlqN\JIx:IHlYʼn(\ذL/?gXq<<4AD[,WDS)\J=,NO=cʶrN􅰹&!L3R.0ijE$Cܖ@\# ے@i\l#++4ƐWGZȔIxƱwP%yIGRJ$QX*z7 F ;pV=8hӡke\o5> C=P?6f֓ͅ)TVs?Pt.,L-R$Jt{ =l.HHЁQ-4𓣰~NAE$=s9ybs&waVihwv.:kDc}: |%K$m*GqOs0 ޿ajwg<۽EA9/G`3:xm oF2T8E,^ +o : շ[-̟zv[ݘ~1Z8f)Bf:kc4c.|d?%!ͯ vm cL 0VbPwa4_T-E{W2_~Ю\+G] nHƭ!* 7k|ir57l.@.ĸGjƺcǖgqY滜oꛥ\ "UU0ŅJURQ9X(Sڍ8$ön9ѵW Ƴo iL^!hH3Ʉ;6cW?XOi}VLꙈMWS:עUFں1mG'B\G0lO܏Lh, *^/kl}mSl}ypL>ykeWFJ=.ʵ9" n;OXYu4xw|vF!͹#or,cO9=A6cyx/ki֖le[LuAQj>VR-_a}YϛN6s(Ay(cs_x׿ ǿ1% X Wk;v6J>t仹% eoF_ozo~Ǣ I wNE}jNMqq7/b߯ؗp KFD-÷˧ϕHxm5]X0HCo X%1 mܞSuJn %qT97#-+\CAVϱVN&A"L2kHQ?6"RGW4x2P`3 ?Ҙk(/ ?q }%yǶ[>xC^ިwPd?ȨfxǏo'Os[^V3U,'X~g.:G7^Nx[^q9_\F[ۮs9dM")rϽ;_og;Ǽo1l#o}1{ ޾*=V fRxos}ur=zSoңF`}?! 1ˉBG.mV&1})w6e?7Tߏy۱ޏ[_{xc6ħ~* Q#~#L%h7Z!q'0S4] |;P8E{J_IXקl?X!<❎DfFB%O_;6%IS Wm?ixݽ +5n^IENDB`./qwbfsmanager-1.2.1-src/qwbfs/resources/256/clear.png0000644000175000017520000022374111404701453021772 0ustar pasnoxpasnoxPNG  IHDR\rf IDATxye]e{zJR,ZmƲ r2f陀`a::a' 4͎m0^dEXVi+^dsݷԪ2_{sɓo<n e\gJXvNm%>;`AKuo8a:b(0ޣqb{dTA1[^aߞ] 4EUx U  577ZaJx0#SCY8cr֜cei}{ryv g+pm KγYÒY iaZ商N{Xă1(T CGas y<%aq5qI|&PBXGW[,<)  Cy|> /S_ dc ޮ-J3@_z;5o)/i:^! <HK]u~4 JV:d.V3e@(t~t&Kcs*&^X*WsV Q )P&&/{g%<)&x"0M5>s_`J\c+ƾW}3 .<4L֔ؐPO#Iӄ3sb-~N4w>j62 MDU.Ҥݮ/^^8}[~7_O 0N-qzf)<4"|qT\oPg8L(QSjWsznP!:%L8VJ$ 3)B\m dO`nJv9lE)bl| 8daDRi 0ZFGO0te&gqА҇$C%J6,5%qЅj3Ձݹ2!K[sM>*U`ݣxі䯾-B}U p5{Spri}+E[u5 xYX8C]1=PI`]^ٯpvY70j@2HNX|d+6|">~C!pN 4Lqj,@TBNQqn S$6t=ծ5,t=n_=)K|Y+qvѧfgE\ЦF͂;>jեM}>J|ѡ'!s w3Ǯ RsgQ=!|[ؗQ捥R[dV)A BRft.`^ID"#ƢX=DhVpݏ1դ+AA f!\%i{uLWX̕,QW࿦Z&Օ\}X"g}iWtf*'} :'kp9i'fe&EX C-"'A S ɮL'Y[ʼ2`k}ezGK苩xh9h4b/ [AY˺wƑs;egGA .VI3a.Wy#k/ 4dƐɇ)%| [EH*ʡfڑ+aupjTR2H\#00ڥ}FA(^{}UQz WoF?Ix: W C)yL i&G$ZB=]Eoa&5 6vVG8z[ׇУ*Gp4GG@9~, x>;#CV¬v.J s@E*<>^>:pGw2C xGCԤ aj=(OkZץ5D;W ?'v ℴ&x'XfP1i )H@4!wӡE7^F5 jܥL50נ{?||:eZ F)I{7 #.Waċ>动dRKR4 R캧.ڎ龰"ܔ;ULV9VߣyNsc/YwNc2 6іG=.Wz}e9SNgʧZgVytsn=!Gj\}8\ ]B{4$\ w sY,oYF/l$s:ٌ_PH`r0&4%/*ͦ L?mI\]ae5 C{0jYY1ߑBF8B6eE=@E38kE?ayaf.ϢeX몃5Oj/#kʟV֕s)3.yfk؅GL`wZ0Mчz G׀@ pK~R ,bTie*U Go:o# Y虿@Tو:/. dI2t6Jyh'ܡmx|O<)pGow6pd p  'o&F)$܂TW{u9dX?fO-Ht6ģ F=%6N bHpկ? 6~?H^oP@RrJ8bRDt䥿gsԹe1J+q=ϺSm\|GyI3:]A?輄HkC`GaF,kWxXIY@$zf`{JuJxQjS;o0!9' {=T0=dw>0|3AYfw3`%ڮ˯ bfTIPxwxviQјpѢ=h:{7zur3BM r&(A\q`{.¯ExYWCa-G ;17L *pf*BeŒ-E`P j*ߏI ?nG^6||vlՁn\u_Ί%@/P &$1w02O[U|?yF4R eawL VX>&hXav4 HBb.Ywa2tjZ#7}= =C3LU?!|j3-ŽTˋԫ,̤}TA$?޷+H6Z=MsGFd zk5HS0 ~^{~<z5x7xB#`[xD'*k7tZE24xLWjT^ ]Qx\S{BU/UW*,21Iݤ)5v? o.LZ$rWvݚ[&OiwVgx9fG3xm_Z|1-~},~Sq|i xс!H5RWyǬ]k7볺8^qs°\mT p-}h@r῭O` 2_ [iY R6S1?֪Hۜ^և7FHYSIYV:L@[$NI~tFw/B>x[=<[L+G]s>l=uذ >YSEWt|8tg=bx&4qx jAyluI] rsh4 Hl$$T/b0F0Ք0 >aµ7epf~Ŭ0&ݮcJ?,7xzJ&2w`08ہJ MY>Iǻ,;wbՒ.g̵[0o}I }Ԑڣ"h͆F\U<_N ƭi/mGx + xKf-f! I¡Yw1fk.BvκIHbw&&D_&n&;Aͅd&^˦ ȊMG{B-,6*3Cwpgri4%9\Q`1Cd^_cݠ]nZq $ ؊!H8SS^m2!JXOyeW;yp!0׼n(Ӹ5c 15(zr -`h ϷlUA v~vO3s7?vu>BS9 =(s\ZZO덾n`$@UAvU 7 pٵ7t h++a";JI_,_so5)[yk&u%m`oGZZ*cU H,@ o{_+y(d2a+Ȍ س9-OU`|`ƧeNqϳym9\wj5 ]"Pa}*c@@W% {+z #҄=L}!5h7.-~!4JsѱX*%o+0ޥ}.wNŒshY6J7qipNqՠQgEY^1vÅŻVs8N)?Nnr[Ȓ_E"P¥']4Zq&R/H`.kÁg5IFy/e(ON|.)!:^SWm,PäWe$N_JD[2^i~}Q-@ft(۫e%tb$(5|'#I֔/7ࢩplSu^ [3|Duo38{vL$ Rbf]*sKKE9N#'2&105Mԯ>7, d _󼦭|pT60U膙[~'C7 nc1z!O2v„ٹJbR\tٔ }ڜ Q„X_] IDAT"=Hšj$@ౠ |~39f 9&L8|UXYyaO`I6m5()ƚ'cהaxDEqlWϘebV(vNq_n1%@(=O G_T]@!|\"]5*˚ S hO%_q8CZ wp9<RB Mo& T~N$zY vj. Rb 82~ !,ˀa'ʿ0vi1`8XͰ @BAeNgu1u{,L^zpkʗ~7 PȌYOy= Jk2j[1Y00_~6xE4F&&jH8@m uU>jvye9TUt^~>y(PS>E{k Pe>MIEIi"ARin &ߋ8N[60)TXL֋Ŀy^j P2|ހnnl7t$0S?{^c}0tɡ.yG:D5I4Vf|ڧXGX g+⽢GՁaL|Eo}М.E:UDh;N͔@RFm四Ue]uTko=nlF'!Nτ_8_sb^dwnԂ+F/+DwDGS˦e}fփ|)G>n$>&I綖>6^Ŗ؃$\%eU =Q?O`p@ עIJxPg~z:WHZZM3Nό2,X~N9:c5!Y-mX |h^k 5b<[xz;+ / ov=!ΟZþ7Fɯ ><^@+I1N6M[I(Lom4U%'LFJO$Sޜ6gc*ycIgNgsKn *Evh'Fo$$3*y54fp|B{R#\לƩ&7ϓiV},2|w`A;0j(oʚWqϑ<@QX,1X xmFΚ ʁD{./䦛Q_ޛ8xw&|ԩsT-bU rd$i"d'\@ӜM$0* $z!V知u$k'^TR2ԺU$j 6?f]\']GÎhV>;OѠhbdR{$j"8;MSsRǨ0|ao::Q_q Fsw;x!{#'Nhl3I/-4PaԎ-[5?J ]2dI?c=bG/MQv _!t )}q2jx`>Kb 'lݒQ; s~<˹} w,оvT&KVZ$ ȷp0mP찎X>4ƿ۠ z=?sxq'v%@`jk i)mN+Q٠^Nǒ*-ێcPvѰ,c`rH|Osc93;ϹJgLdJ;k9k;snċLlȏ(xK xD8h"H)iH)@p$ԫLj-TUc<-pjjtjuWbPV<𭐆0><|h[}I0Ae6Τ+# ڡ/BVgejs遄zK|ɳ(:{>h{Ձ_d(xS ؘdL?3@A"Bj`6Qs "0[I#G}])1! Nqڎ e !7saou~)?|,9W8)s) +&ͼ\@6 (LU_YAoOp{0>xJ] Lӱ Ph6W:r5\`x]   7\ja ME`ݷɑ={T‹(5}.s@4rNc]|FE5o//>ģNF9W8 `V] ~l(Q$T~`p;oU{p8O?Q ^` ]磽;|;Tv %F٩WشK_rcz玱'yA>[V]Z֠J R#JPǝ@W jhqPj=@#hdTDH(;Z޴,ZHhShx!wGj ݵ5zUhCx^>PA|q<$<6L g0;cXZ}b_+N(O3`s^qUxFMTbp!Fu xaƣjU%$FtQx'wKy1Ofw'j w9± C>C|WQ5T㕾H~hb$DY%.# ֜TJTHUbUЊYZ%@8mkW=1IAҔ ^nGbFI`C߇̡C? WT9؄6Mb,{I[ݻ/ |ӟ/>27aA{<v撨 /ZL=%oݯcOw}=|S0,fA5&~hƺhB<@#QB*kαA5&x9Q0zeZWh9mu%kYzjkU1^CP'"#ͅHցy0b@ŋ*ZW*錆u37F8"SИمTcŽw:,YdaW8WxwR+0`jΌC?+R'`ƻbQ /47>{91=ϭ=y2.%.O;D:EOn֜+A(,;iÛ6_51ʷX]z/eOB"yt1eP9Xb"bD YZ 2輧ss|iU.ɴH8 鸉90=eݶxqx k=JAH`I[UX%aQW(S5"b5$8BhR,(Je<2us$a97$Y tȷWSj3 t~O#77CsYU2KspPKh+]0 H p%ؿDIq7}3y]Z9fn4cʃoi.9riTxwԒ)@%o%ӰcLA^6@4܄Tx!|*Q-eypaiO><.uJݭG9zO$ Dq^Ve@fY4!J#$ ьOD4%T$8E9h=vܹQMv)/*,7jFll4IBV4z{j=nZX=3V›L!Hbƈfs_Pyd D c; E0{{$[c"̉ ^Kpd\q,pHCJxBec7}qWx?{llQ,Dx;7Cآ&X"rƛ6y^bEi(4b%xWrڰWz|΄t0{ Eq!Q{!sJ[/Zvg= kP ֳQj˒Rh!YiNJu۳57s}jyH51UlNhR_Kuv l}[S.@N|BV߫7,#|anX~J0jUhz,r)0*}eΚ̊2&St&.] @ES_ 4N`憻_ {Y|b8p;z?d~?PL.o5Q&kji(5b*spR,1].ǗVp΅$z}H,"QyzKqYd=m*mm=,^#F̥|FW.BU‹qLܔ>8Μ jPkpӾ=dw͓_yS,w\Nֺpثx3(7lUJBkTQmkO3OїATyO!A[]%~ZiPOjӿr!Z{sT=g>7pZ-zAsE2E*Vh\K.HNZv7uaEj+S@؝ P;6F{+QkаJM`@BSA R*8&*dO+獦7.=r]>L}qs4^;}[g>fanTR+=+udod|0 hRp 4zg_xiTF)]W&ge1ryi[Ǘ&JH?{[8|pJA2XR n.?G $}Q&j"&lT1yͳ[Z3g&bSjQgg xPQ$ʺ]qʲSrX|>Z=0u ?Gw 7rX@4D*FI4B- b0mi0ga6fmZY`xmKӪ<>udGpm~oAjZl|ۂUo][}Cܿ;iˠPE0a$3ąh8_<!A>"!3Q5K 2wswCG9VL%l2RQ{֜2篙}ӊ ]4e~ao?!M5xwMTPZ!ޯ.:GP8)/cr_1kLpiq:4~i;V ѰD|Ay쒞s 啖=frlfj+]e%WV}ׅ|8 E@6:x*u SIي0]Sy ay+ya.i6n|J`cЭA%!#; `Z,L.8Y`/T7nrdD5d w!)" h]t_s/,1Ө:N[nܗ=l׎*v)dŪx'1;4-Ԯ?ZS! YDݕaC-IcvAU5vf[dЖO~xpYkA)$p85^:{=yrù~˚sp.s.w՜^z,9t:XAA/\~frYeFT LUy#:]Caan$MfF̝F|׫m:| aknL}~}Hv;>@-1>L>Gcf¨}\۫}SϜ Fu-.?r1/>1/rňMFv'9xW+vQeJA5Ц-\gC>MjTxt3i|,+: 9Q]j,o+z誃~_ae*''%tawSuOuo*yoc%8RLLSpmz#q'_'^}4B<H-( 8P {\`aVi'm}a%OiQ>Q ~- }LY8x$ƮEe߉)bY}aQ;g7i%EGv)HIBzJJ|]ܴgx++pԀmHh{Hi[&~"$]U:h}eHVg?Ky.:B\B*|ﺃSOXH*$.gbkpodscm35|Zdv=5,`yNaO]uŰ ]V=*PM!ކv`sK2|vwۇR}ܗ|1@89"͂I!LOT5L-/ݪc~v;_gpyCa8x"קVpf{'TF `'y(]M*U~ܡ:{q(fߏ}wQ/_0d /1@HQU&b{t 1ss*SCb}jCj)|T,#UT+fT)NG @ *L*ܰ/W!s-ss sn}5<| Y<TdPޑc%րSKY_9"o !XR}+{knge*Jp ?% IDATLj?Aϝ h(@ n"E @U3 6&9}TVQL {JT}4V\S]a]{17pNl4SrWSp֜V:=WAz=]Xޙӯx-rcK)'O4?j"y%Z?4ހ&~nvP?S*Nx92q8wn~g ˊJc%bOj^\@+mGv}SB4 Zg8-Sj-K\2e'5F0 qelnUxm |ƭs x O1 v]|d) +u z2h?v5=qoj֚t`Y9x=~\-6M?bc7-Z':@儎 P:!~:O7N Ph#F:9aẎe<>qy,C@|]tff3Çk 81UK (?3~ʹ oz}Uƺ.Fxkg-^T~xp Bd\Xٯ}j bULB'qm a76p@2PIwC\RHdji6ʞa{pl|".zydT(Gؑ_\};Q|ߚ tw,M׾ۗ : &fQ% 30vvȕZAHp"It:wͧ&BiJ 5Tnysdޓu{dyn7g_ #8~ON?MȚGEј cߧmpVWWpinb]bUjO`7mB^T@2- S 캃Tw,ƧNo}PGb=s=wxqd3gy>C'fAQ1%C/}DXs>LhVSUyE/AY+uߜfM 'xQ~3P Uxq#e1,d30B 4@)nx- P+0)UZMu 'll jfKX@FcM.GV`akff|3/Zn1Fw;1I_M9޽y’ euXwf^ְ8|#4n8UVJz0Cmjb#eT+- JZStDPq(B\Z!r{q̰ hJ`J>"]Ջ93;Oᝣ{S> fGbYRn7-uKKEGqio˔fe l29NyYr$M}7HE˂02~a¡!: >:FCb#4a&Gf@R1uQ3F1ե2-Acf,#fYf -EOK"lŪ"FKMbmuI R?% "̧"]^]C!a_[Ya}y7myN7M@Q۶;ʚVg jϹnƷFet8?dT*/>Qa;X}W!s#2ǻ M-F:G(?f^uvlMȚs9p:cLO c?צ_`h@< Q&Igh7R1+Əxh-6O`mWO*mx)<tn]dRSRAy<7QZ )= VŦ:4VMXϧs}W?kyNd4彙^Y- m?O㑟{S؛ qvtvXYo[n^5nѬ{TQ)oojeYR%)—9!{;L#qḶ􉄔 FeV;xC6cބ Ar]ݼeM@ϱ~m{*mo@5>ȟOKxw6+Tdyw-Z&odůfd)?B>} ŀ8}t\Xв4\x)%XUzZ Z?Aqh&hb.;1#fX7E2tQtk1;wbjګ|l&\*ǏZٖ*{VWzڽo9Gܒ9V`-_^o>:ȝ0m}mu@o9BS.Na2؅CWue9A꺛ΑҞ G_snkʩJ{d>3wrr$׉Gb"4,6ZU I Q*7ҝ4SqjݝRekߏs>JR>-wg ~VTgŸ}j&Y~s%RT7Q|w;1z[T/E_HY"!g<(l(j\Z׳T,kx2|&Af15U7yF֙!]\w{d|ww;T.'Q3KOkfֆ},!5\hb:uy1n'gmi"+ޓB>TYԖWjz[K tI']mk~eJ}©s ::C+ W'ZJ(Gc9\ H-.:կ@=\S9zr҄T}\_]!Y2X'jFk[#XE*m>7w=C2:?~y ڬC&Ylomzd-^;qhpheIÔG^j&h*Νs1G;Y{t:&΃dhB%VA6 c_*!FsfWEn h*QL)H)B.BUMp4\sY]C~y+ɏ~|JH!s=Ou>X}4G veε:3x˔/=Fw l|[ #~"EEZA`e"mo|boQ TE Jj "ݮa{%EM)+hđuńA:d Kd{ȗ,-ѝ]Σ3 h/C:]\KPEJUũ>$ 0] 11HP@ae n;@_q)pOg wYaQ^qp|}?NS ؛P}7=1PsBh~cӦ`4NM8^Wݙ+geSHH{SC <7"s|ɼ-.r݊Y_g$ (bV2)-gY=A#wAB=Fwu`oMy7a9{>7Ã?l_-?YwͿ&OV*r}n ^gKvݵ`4BPyFRt)?߼.ɅO8ynPD;9}̎k ,w:xʄW\E)B4RE!-x^M;YDDf_d5`8z$*Qev2\ɜt7X?bTqĬ5c4ʹY֪JyMw 1XI!C08Dz=qHʻvFmbw)׳쳽,dl]{'F( O|KIS^~aZ+tSoI׹49 \f@oy3t{V}s#BSV0pBlQT`KES`n=t!cq\qM x!e-ቨPEjre˭xp_GjEL Vy?rج? ܃ʄ\cR 2V` 4*x8jә[nA,[o?}榉pVfw~ץ-m$X[ЉpEK\yb/I`TZ`['{3yQxFiB=xY=_CwjTǡ-%i]}kIg{yyo>vM h:*MwaBzT9j=Csft=,ڶ >1]8IM\nBcҩKH*u3ƼHyStV!8^8R* 慃9rm!.p~_ FYselrǥp^Y<+@tj[G!jF}ܲgiR(}uG,_bP+)Zw* H93y-r4FGsS xށBTzyOyO9x14tܚk+C]T8^=f5y]o}]H:'kϲ{.ƒHWQ5)%i!0S-/3]u=?kV11#T x_%o?l$&C%:/jXuaemyTnrụ KJj7i}$zzky[gQUD1ʍ{Gn36vP "30oXvp@O=DqzA;mQCzZz״GTj ZU 11=xc"ǿD5O VEE'b^FYgڪ:k"\ !MV :csjZ}fҸIC˂;~m4i/Dz{~Wkk<~W~ie2$K_ GUI~t=CaS/ k D3@`ORDv90CwF.ǔ1c`#rQ$D btoM\z=+,@fVdnyWU,v{LAru`^0=ȵ8l[Oܻӻs 謹@was{T8|0[ $lUS&T*Ez Im빩Uq̫^^S6&I&\A9^7-,>.s6%ܢv0X`,=5A-)ZZšk6c Eڛ< 78޳eUSex픞ڠe^j@jlK;1J'xoP:(kT 4vmulziٻO, RFDQE*Y|07ǰ賱2g B2REBaғ@cbѢוUNկT)ub49ʪ,cB<7|a_+LFú خ5E{ok|B͚ݖ#gc%  p򸝴B*,C]P]j~wZ0F#_][>NFo;x  o*s). -""fdk@3S]y5 jYB + ^j6blqܭƽں>T%o{M"XqZ5b]vj~l7>o}-um hч(JUSF R ២߰_ן)KxL`(Bt)r:,򻉳1GnqEB᲌*(ۛ|ph;Þ~|uֺeDR:m22Uob>ԏRHH H0b6RiO6lo1xa&Zl ̚(ɃMnJ8O9DUVؾ#0>G:v 48F)Yv]Zn5‚)NqSd{?SGpǟ{bAC#6/uQI,y4&PTckYJJ@*5 6$_CTEAqUAV'NJOӠY€D5_)*sWu\,Ԃ|L)ki^zXٓ@/%>JJIdJ*L aN4ocE+M+w-Uط͝j̦V#XձύC/ +{?#;kV6&W;7J!a u @,+whR:y A-+Ppͱ ɦ[ |ffz[YpgKERfaŹ{k|{Sکc <='&%ame{781|Q±h7l8Ni;$u}M$)IoL9hď/ԏPcb1f<3ŋ8hI5S:E3 "+ܚbj"X:ĖG![/w܇5TϳVI9xU wW~@^'T̑ _wK=U)T j-xP 楅7ں.\ɳ&}"!G%?x=w(#~x%΍F8t'Ҩ6,[q0&P-&ƋFvf1$1"#%jjM ch@c>t{ ~X{kkZ:AKNbzng75иuI6'MujΫm,xXxx~:7u th=h3"Y>|nnhsOq{OP^SGT1r0(Fx4KT1eY #rdxxldUnA&x+p^ˍ'@sAĐ^Lgu]bdnuפ ,TH;y;֦༲;ksguz]47VI̿Wu?YJ`gB>Z u2 ~Fd^S.P# +3Ak}s@w7z ,q6ذ߯-G2z$/@fphlxSS&R~QD#&'ߚE3xQf67Z}9“fԹ*{E=Ps}jɿm@Z{Їa0@}FO?Ay(|v _qXB/~QZZԛ53Þ L8 g9eeu NjEYpa?|噧(/_ (cQIƄb̹%FTnQ4 ]4k8JՓf74χj{67a8 \w\ u~` c0_(X)f}tƁڵarկ2?; c9$ĪO mJvC~Ϭ?lA\V'gΜ@Oi_ͧ>ۻZldRUKII]HU"Lʺ:vo]b䣩ވau&.+{Yq[?ˋl>a8`'FGqTNe8{}go 8ہ]~ ,e<܊}fz,q,ۗ<}%?e<ؤm) ^3ǶGۗOO}Xp`LQaD,J*؎hs:Rh'h;eM+ 8:i7Vƭ_gȎe>Ma@O]e%bGm/qDGFf~wOg\4YGvՊ!j_kKa u2Aij*j 7b+C/Mx!4Xs\QD=>.2w/ᒨlg~73>ʅh.LM6dkꁤ5M bm1-)0~Bs].1xQzo|.t6(FQ {E>\r|uT r,!q4x)Gx*AZ}Vd7v{ ) >==lK8qgUeڬB9pvX<ʰ *? ~v%UBemb9f<v侙z8LZcA>qN884RZTE/D\{v%+)(`x݅\z]\N1 wŖ9kR8c0%`徵 )j|.3utHF2/|+EcdUڸ5ۗUʠUvtt4į_{{V_PqOQyYVy [7y"\H7x? ĊFj[4ȨDi}I[ x߂z;U~CV7aN'.0c$S@YOq0{CM9 DAqbt:>K/<747!Oʻ^X\x+X D@E9ĔIUH4AIހ 7ACM$0 B⻏᭸NP\zy&kiC_ˋ\~{rUߣ8}v ^-WWos gIIBy:$[|'+FP1"8>*Dw֩+\Ԫ+P o92e s ,}bQep>mO* j+0aUL6Uݶ$QM9^YiUʩP +w ܡL&+[ǙPn(yUK  J!iBiعԄRk$D;]pyy`{5&PƥJr!.UΗQ^kF5PE|O*wvYG_d|R䣨1Yz4 -42饉%z* X7LPmѧ![ͷTU\qIƺ ]eYރc*$}}ڦ*khx7L) ]}(>r,g#Fϣ/S_ aEUV1 dc}SEQmfs] ؋tZao e䐦Oi$b?dz?x{#6 :„$//_!cJ퍍cCUzJ?{j+YӚӌ2X=Œ8=lny<`8H$T. ldYk e'==zlx!";sjxT8FZkKZJA}&娎[a@ 7/z,bFS+bddIbtkC569UjCJԺy`X\,S#^B#YtK]D]P.s~5ƔPӨݯ=([8״,J1,M1SYkI*RiR,Nc*Ou jplx.MBQ @ DFV([ْ h1f"tbjSfT?7Kx10ɏ94&%PU ZBOa4\#p{'&Y|Nq{|~шGϟ5qYG^AScr U^ʉqRTAo#.;ݞWӁY(KYΖF Ũu\wX:-Xu ;`\+m͒ \z]0 & g x@WdGDHm'foT񷋻^@z- :vހiXV#Y[77U#'䷪gdanF_\BlMkZ[Ue+8ety{Kޗ:D $RY" XsFQfv7^/Ʋe{3"%q9JL"%D"Uu^ﭺU}@IޫWNxi?me7AG<CP>'Pd_?vw)ф]"F!9 Z_AXS(K".8( 9eXCqˆ+/vLIGO NGlQ z2kC5x݁=i{3BW䎋Y؛;|oI4!x5{;ܝBૼg7F4e^j:NAo`ЃI=].t晥\@€?(˜+9GٛmehHZ̕g<'9Y{͕Ws11h?&PjwEV`{T\ȀsԒV(7X ޓ` =5WϸMƽӲF;2CGl`+0D&ls]BoTPt?զ2hՂ7mE&[/0C6(v}YܖՕny 7JΰzD2ޯCe"ċ/|髏s9 N/mҡ"Y+Mӆ?{z=aCYcL,22.%k호^UB_t.ZV7gt41'pE\|WW~f|}ggeue~v\j>s8;{{^u\ᔧ|NL|,Ek#6۞\DրǩWU Hnf2Q0^MP23p^{uƈHΨ* UoLԣ3<Қ>~֘! s6^ދ/>~*п/ܩMҥMmZ&{Fn ! 1?̹|i3Uop;F$_|8@Vsl㔘RY{V~0s~/;tTs<;8v)rk NAL E#lp6%1v>-e$$~!\b 0TK;,m)7&, z:#(?|q+Hj)R6EOO”6 ~kwn3*)ͶOY"q(Olm16WTM9ywr6ߛ ܪkp=w[S <$:pE:eQXR)(:\%D0M H@Sx`jJG\8Fjz#@*od H-R#r^;gs෵'g1Nt6dPäYfL;1;dQ@ a4{xgB P_¥ɝ0Hi!㏷"0Dm< Z\Z(~]Ѻa֛xLIZwc4<qCr 1=s 9ҏ$Q'cs:EePa(g^=Q5~Uks?:= ߨp,+*=E 3_nkcehȳycamY9tGƑp9O)g'rN)K278MF *#R s)t#h77 |nl ;3D eg:|boyK`RL8h&)S,Vr̐EX9'{r#ƾG=@=rY9_s[iAQ*!}KO?9i8uF a_{z!%nbc Y"e9G~y/7Τ A=kCZWޘyە~M߿sxm)3*7ceVQ겛b$+h~q5T^`?br,@[ 9+Y& l/HR_).磠y=ΰG~m} ԰[BrKنX2M+ BԋoN|uK/|.f? ;Mk%{.|gDB.qI).+Ej~וҫ-i!=I7as~@e](q?8l̗wxx?I;m3۵WGUz*9w"Qd2J]7Y!H2q(ĀJ'8T#UQ :s=T(A:⦛C>Aٔ}Ѿls?*$r01z j,QOD ސWf^9h`6=R[-_M幮@&Z [?'v]PkW^AKXG #7sN Y{-59s6|"}Yks26m͞7_6f*ru.dqE٦/?؟]o09|(6U}~smPި7A?7{0umg:TTٵvs 761.3Kz>߹U\o̿$(xp_wBZІ ) W0;\Im)eӲ|d\ry>> { u! 쾹iLI[ i;4FUVջ/ }Q5$ '._'?dUy9g~>SS)q(UtH ϹQc!nfmv+Fcd_k'wszY M!sfPat•}F/|yoIHoRF]g^+-/,n<(_CDa`\*!Tv.pY[g-8Ǒ~@+0X ož58)W 'n37'z``Ѵ6cW$#jBϚ$ވ ={sD"NɓA]"[)j6BQ![-m[:VJFToNhDsRH= GbAMDyKǯ\H83o}C9Fi㳐6x7l gK),@N0m/!2%dkׯ|%.%'gv6F`Ҡk#԰e\*k;zmWRs}X4ug-*_| /r _gdn6xZ2ksخ¨sxaOx;8J',Icy!vɸ fE 9!TeA_^vkK0"v3e¦(0jESm $g~] o[wBk1l2R6^o7u,TY<2nT*'SsQo"\d߸uoonP\QΉ(wL)j(l狌W/5;lW>RyPbL(UX,Y\(dBߑs\zhbWwy02Sw{&gJy+791={ls?(pZ{tyM 4mu* cpReu_*NÑe1Nk$ @#yO<|1(IbtV ZMv-h'÷ak'*{U7 :u\݂ ʳ GrSEDq8q|6llg993oP6м!4ϸ;N^l}]qNHՆ&idڴ]3}F$ d9Eq};s=EKk~X\ 4EȂHbD'T <Tig#R\,,BҾ M_HG^͇35x`FoAhju[x?fGc描ܯGo 8y./*e(]m ԅ{ޞ@~CqQX0ukґ$LOJÕng̐׭?3rRެ-׫wScykNLqw*,G%dK":iROtt YBT\s Z ;[% ?QþLBxSVhЉxr?@7Uex e&C:pgƸ7]|ꜗ|.>ËۯcuKiYN}Mm\h _p1SN] ?lg/GJC^CzgV?"%>;YYzPRDg%+IX#pNOdNԔi{(2eTdd [ݵD0pH r af,m f}N$S h0mM7>U%fX)I.)V l}=BKgIhEq|* f>D*quES{isN8}$ghU7>񸺦C M(j{7SПѿ?Zl.,r.=4n}dwWګkoϕsl+Zp}+f֢Juz H+foZL@X%Ǧc:bУwh\3`WF`vK 3WŐBMZsR"b,#!jj; &y d0ц#2q`^:tIF6; s:s"˹,JW+@^8 N@st>gwqkXA2Xe)['%$ * } Y[c{ovx/2o:xx5Vn(3iW@QQ'eBjL{*=9ZtGqP,$@N?C"$l)VxYH$?t  omoj(̪I)dJ[}~]N%7{r }Z"-5(5CP(/e1 98!QwtNmXW&jZ1|CU|72r,'5(+MMpRe24錝ٌK)D-) ڧoҝ$x̯EjEιylTW^fֽ(^w<ϫ^7{- M.j^l!k UA2E7a \5b6X:CjTR*.)K*/Ԝv8*VtS|<&/KzYfXa¬Mȅ΄4>w,l{UL4 >svkpNOx.WlZE{rC*z1D&@q!!FK9{?rh H= 'T~ {j+C.Zv!&(#B~\{ev?g N2-LE2V49DC) "( Z2M\zsF:Nl̞isKA1wb[be=_BD' /ٟ*,T{ 's+!)SR?ɜ.Afk?ò{I:Ft}æ4}ؽj0U=YABq݃o)7 sD1@^˽4( S-qqoNac|d89VVYlw%WYt Ɨ'K9B>K'Ͳ((p'Ϭ^9 #?]B@A~16%Zˮ7(?"X3/Bs,cO@Y?[=^:U?"o(Ey/fvmXE;~7F?ޭ9ry5,g;HV Winoi3k6bI+ۧJ@g?i?گ&xV(lÈK;\ܰ&w\Xk]FgzM04'.ʨOf<ڑQ}s7\AMKƀb߀_qdd{\{À_c2yza@4NF-f_ip@ SQƍ0BROl\O^*I9lQKcGc9]^\fpo=L{=-y޷ukueqyo9ːFh9'z2n,mic IDATW0,p3ł(UjqqB~#qErʜٌoK"ij\P]saCk*m)g/UsJDN^-= Y" qQ լDWc+VYK 7&PjNEH ^3vC4 J̱d vd0.{51~tθG$ZE`XYMDNYm,,OD,kp3(Ţz<@߮nm671Li3I ӹuȇ[fcث|$sjCŪ"י\|"PL&|k<[oQ⃈k{N;e(yQ& w0s>j5k'nėxч;DDbJ1^N&eO]kHUtH8Hs|\>#e(ךk27]j ]LGj[~BUI,A qSɵCOusݼxL\#"#gb֒7w4ޛU|â9k.;)U,C6]7K揄!{>]㊒,duEA\pńoy4Ue~+uC=gMc "KsFbVmB&|)|#1hma,S9-b 1'"mnQ8'k#"I@Pe9r+"&pΔByLi!Cu⭘k%Q\/@uŹK vT8ss  2-0{b5S =ם1ŔheJ{'X;USww< a\7xm®'S%m7LH2Rɰ-3(gEcL0e\8wr&ϸqj?!IT92iͲqVj xCԣrf-GV _݋r`-.2 5H&ޠu&gB["RFqF( ZGj8}՝cD{p~Ngty>' ͡r1(EiGI.sF\mڋƾbZc]Tlfi,8AM!I^۫9†@"M0 -gE\dWl{arK.M.#\DCȜ4{JT9 Xxo #|C;R8y{._n#XZ빘Pf+0q|k oݹkp!55xeM|Xm?R1H: j0V 2`GG7|Ve0qèP`/8A$֋94j]I@jKD~zB`$vo"؄NXռ*3f"nw**M_v{|Dx4+`dPo)}v'}f bΛT %\PXӠ;yMS^)Wj,|1_sI&UìCLzxzU?sچn IZ'p͹wi̍~ʺR]. O&01G]|j@emk}=B(rрTW P x9ak >Z)NN;cSf" {H@}1d lml1C0 GH*a^Mc4ǂ% Ӿ2h䘇X)a~k?Ķ x)d:~{Rԅ sTn^sWQ8r="X r3̓ o̧z!/JuDkjeYeĖWF%9 \CCQ (?āÚG.nX%FSLg/QX5GqR_jۏQ#7 ,q?tIpgmU+c^Y$[^B?N2ǼݨЀ OdUosbhCUA͜"]J; WL1Xlka^_܃?c: {K1YKo!eq)k@qH7|LGl!"ToQ!sv4B& f-f]"}d"[?Ȋsxݪq{nbҌL@ɟ4FU:K8ZO¾ kjsd 2'1J,bbXb#"&Cђ29p12ٴ%x$)h;jEqfƵhYE"N-WA6}؞5-.^|BBn 2RH <)k\ePZX9BTlH8#Sjͥ2tԧ*%_6&;.^*.TNORgɽ4N9WlOyRc6:Q.c(KšKTnknjڙɆOxJQ28UN/ 6 e8N\sc"| G`Ӽ" hgS ~Nd)/;2Jk`1_o+dEr`)0eڄ78{ sNa-ks,0?ewFt |?#"pGRAEp3'8*Q'U5AI.*"x$-"S6vI|o}CyCK)d=;9F Wr/R!:Ѭu6Xs51x, iY?6Dxόd W|/N26}f!RM@K&ga(o 8g 03/LzX yBBU`C Xo6HDBC)}e`vF_$/t6pN+1" 1Qh#Ј5V:7\Ey`(UPB .>1UO3 ~zl9CPr9 kʲˡֽz ;PdB(Ͷ G ih;ɘ<x|yB̉9A/G8V§߯sq m}7IU ҎH PSN ۷=8/j%o GEA7#U)?o+X.}n0Q7RZ@bt4C8p|,WN8 ;a|YVlҌH}Im)L7a\\Kff vNc d[:m)=Dz=8s8 _! ?S(J4?mԹ\Ʀ8_yєj.VG? S\ci{P4S>*Qg &+ឫ4puZoE+*7N 댬Fz7vKp&}=v (5}X!Sʿ -B΄A+>gJq(G\$Dػ&?ꏲkg03NhB8 o_)7ū+k*:x<=Ҹy_.eIr+,q)W@z ~ H'n"S2O^t!D l v&٭l9ɲ#{uجUP's54m&M"bjf<ĿvlU8*yjJqfV^o='l29[&[{L`f=yYEANg QQnnp5wQyN#F&\QG #BK!{&&F(iH1#I4XfSJAaDbT45Y6#(|}C=!Vݳ 9;}$h!apf]rd9o~ECFd|WXG#sAgIY D8W㶠J3@*BPe&E=Cl+uVYbyǴC=By."'i7sb(ADP&",R.|8EAYʂcs,O?'eqEȿGkOBCc"{ic#Oű> rS`ޗ8g!`s{RexGپIDf!P.Ʃ-pCqa,u)HC"x|+D5XCp8{Gx=sIOd҅&'I)a*=p:jz"6|zp}| ?+Ƌ5Va7z :,)1NXޱއs8o1F90 g-.ؚ̘+{pߧh2Lo$Α9KO>Mܼ~7GVCM]ie?>1%l3[ U7M4(cņmCNH^Wn` ,c/ݸ=yo% >H96V|7J(\8"GQ9yQ yɢ(Y,0ZG67qǏrU6ΜA6+qP4"͏)षSUۍp^Ҷ CscͫK<߹\os>2Q^+/N+x}y JB-MԬ"X[5V}("I]$ןu)0'?xIx#("Y'~lf?|r@i!HࢃO A,8vDxX碝0]ox~)C:d׆-hL p$p|_S=2>*>i-LM@}BH!/,ySq Fkl>Oy"Qhl2 OyOYEފ tĉ@ztv}] P;Ĩ|Za=H5*%_hxvs+۵rܨ\P͕Wk n5|<+-Ԣ>YK^ *`8j4`)iNΙQSCPs J,˹zW?c!uLw$}]7saqz_H#ܣ3xRfe~`84{Px8҇)gڙ( ?Q~BVfqvF=Uo ̌bVx}@p&Qq P`w| |~y_}@ 'oamiՈSӳ>7 -*w$84).9), C<3(o9I17gjlaA*);TWbD4EnI1x8Dc1iSdly3D{ZR)DmN pRka1) [+{ºB=mqB?:aX+b೏x~>Gejh9CZ鸫頠 & z gM݇H $iL' zY;n=é{@xh?i. 0&5I,7; `֊W=r,@ekXO 4Iso]8/nC.v;&QJ k]}IYzْ4QƊyp%!D=7эU^4һ&(G ķoH|y\G?SʏEǣl~Mį\"\D" eU6{Şr .t•ۺ.s8>ĜkK¸ߨrjX-VdS/q8s(xW{O?gOE#v !NISf6[7oODforsyv( 3ݥ;7CR%a5dk$g:SL+;oR yN6Rr|#|x}D>M6|'$W#!k{ʹ-Җq@؇}| ( \|PD bMb9{󹓌FSЏغ{o3sqܲ/H o K`yZ)L vKﶎ;^ߢީ T^+7(|63~G-:pNaSq;ӕ @iqAlR:Jks qDP$uD /%ڙbp_2k?˼+H}9:iM\v2aFDI7/l*l"\e5{ +,35OTʸ@7R콑 t#FȌIkH+,&)w3ǜ).5&Rۚ$ТLFZM0]3@y:ύb 7f4 `'B;m\~\T-fTVap:U01gnK74 hdp3a! >JIDq;!:^|[Us%ą%̫ö7[2D3OAڏ"Npy Bya]`6?|WY%. rG\ O<1' &M s9#p'Z29yԠԎ[s&Nw/=4Oys~yICg=rݿ@mۿӖߓ>mqf-lWFkl-=c:`3* .עq̝ߟ|w7Hh¶'M̬Lx! NAサfX 51l\[Pu@UR2A܌ۤI=|'+ğg/E.zZ[Kzc0L rI#…5OT|ً1C8Z͍ar܈*(˒yy'^ (Kws{7!)5k\QQL uL=s"S c)"]ڴoo6W ۵R7Q G37@'^4q9Cݬb ?8 |fu]tqIhMvV+0odzo JBE5Րz'{T=a=bՃf:B vIƷ|kk>#]#BXJm"[O_G.U;zda&_a7iCx-U.Wpᩚ' m$3Di+:bx7/뤔&b?ie՗4 +8=3(a?eVSC5ZUH hH@TewLwݕCfӶ JNJX%87`܈ :*J-,p2F66 ѹ|I$/_jP-  1$Q ~*ox@5(4D\TT*+ (55TCPuӤeN:׳}^y#jr^#skʥ {pq=pyS k]Xp@)-"Oklv F#5fAhiY Y d_~4Yo+}#z RV,6ƽ\m?3RbxRگpEo567^]ϭVj T\NxaZ  m+k|dvq4 &..0*20䒎$⃹ \aZ>|eɠA 0$ +cUE )kX :BuV> ZLSUAskKjJ v׶ mrywSہ'gpH?Wvy'~=5je[fY nc$s v,mO7[7-H᷂R)W+XFn&Ca[`Ea)Jk ,`K+>ˇgZ UQ6o5c(ĚZB HմpVJǀ **hT4hpASn rtkiU`ϒ܈BzŒ!O]Sj–+8Uo*הޤ&+TP=y}bLmeD RX}dD9do|@`#͞-_Pݟ)G8?0<2/$$*1A@&k{M?#`xph!Ys ܭ!\PYncpC Vp0-` .r*sq,w>̕eva ˥:j `'GQsIHK1FG-W3W@n : V5.HP',F;O?w܇cC]j&vo(o鱣,(758*'ϼ3 Z;)xAw #@__Tبȳ';(M?W8z6THdS^ea5w &HJ+p Pu^vO6*?#wm z睍kcAV%lZY Vt8^lh0qZQ+^dn?ZAIg_t8s}:8'  ](p.0"B I~ Ր# h 0S}b 5RUBCeIQ:'+<4 hY[5ϊ٣Tn/x*UBeЇsʹF{ʥrnSTåoG>38>rP߬9.#(|#!Ň c"ƌ]PߒG>n'9;߳ثo][o.%i#oǨrb&^xo`qg#zɿU0kNJeVσF]CTQ(WprDL0g*}y`zz3Y`n=%V`;G#zHUYV ꤫:W rǪq'um^?i;ZCN)a.a .fnk?JI?}$z0]\OY܊,*;[{ƞrUFg~dݝa4|Ib\٤&IDyy\Y"e}x?ହԟ?`Z_0Ia84{tg_YV5i%Tu6O*q``6ݰAkd8@}!`&F W-5Td*h0(˒ni5E_S+?s3~ǭ\htRl4ğYpbi DSkhιEpkI}oEIsr% Wa# <0 kk Oyj%rF*hLE3NogހhSENCE s]9 S##;=b͍u.GtZm IDAT[Ka֙}nanw@}(ffO{SUkQ_R_Ƙ@*ոrǧL`3HxN][arN?1QY*rehׇ)㇑?z/,ᄕvE#^8^Nh_]^E6b #kIDrHZsCJ1 GMlgg qTcھG'I͇N'坕V5"_<gHCD"P3?:o`P\_lɕ]m|7My{=> M K}VlJOÇ ~iށXw#Zyq p{̦A;4H><?zwۿ^Bjb&◤"ښgnt1,_-wos+cy+aR +CXL;PCw(Aڡ>m`1!zcvҘ+%(E)Eh=epUq!P~&&c19oe_Z>yӝ,erj 0[Lt%tȯr\R<\QXȕ. `gZҶ޸Ac8z??hK՚]>c5Pvx.8+L=v٘NĪ8 OQve.+d=d%K{=$b5DkK5&Yv*$,O94m'gQ(38j1j^+)w@7 OcrJŠeUV//:oQV{a {qn;}?(HS#<$T:0'$cX5e&jC]TJxנ:NLpju<\ 2 [*Tϯ+wb7f7~K6nFi(_:P(;<"Ț|gm,Xl}|aOY玏U+WXZ U5NEZxTw߬uh+eP+RI44F`;ʆ.GLJʱiև/ӮQaBgrCBڀ\ugZ&1?5 *P$CrOU>d X8بVWşmkЇ4pn]YXe2:nr::V&| ʒ  7×k>3cXzOTJac7u'Q2)xOkWXa6Z!yF sGlyo*iK{a;M{&7K0<,#4LM]kftf :-:1Ze^kAd/o|q0 3ϋX a\ Q&~bcU_61emB1du@f1]K,-%pm, }U緔sʕue\g \odLh?hPnYttv~):۳wz}kNjy[)vTGGY%;%ܭ#Qp2bLU TKs10 m&rvv`Lu[sݞ̥|zIJX$Spת`鱏^/䨕 A8^+}os^x*d`r_q! t?_=? BPW8*$K!N+ ǹc7/L|,|$z~{DŽk F*>&f3 ~Nib^iwKXnk~@/շ!,ÕrC}J#Z ƕh%#C0?+"$vk>S&-Wk3& I ![:*(:";OcLSh\a`sR<~Y tA0#_?< OFw+i'^܋;έm+Ww^Cox3FlO_P)/+^±RTB,3B vxPֲTs/{7̅ާkV hP Oeo*ra p{Ƙ# Y_. p\}CZ {u6_TE*_Sq7Û JYAN0U3@0Zևi<05w5"ґ&32?ڇ㩽cjkIhz|D pv>vn/ Ct wp>u{D~˽sCŠ9rsX<&b2!Ŕ wK8NU;UufRi[)gf +<3WbM` !HTsELRƙK&|z4~0MNؕnF Ev:+Udpu8Jx?m懂";5[GEcd"?̝=zczszw} =np]wzWWy19,wr'߯cG5"Œ90^mJR$AY?!,xf}JB΢S9#!Ez&KǼ&%JI,L_B f|0+.q`0l 4P.`yh7hB@>m1yS~ +X;<;%+)x*uXQ[Y~!_Z4bH:[30U|]?uͿ˲tpe;LupE"UԵX}ڑ^ZzTCPm:/XI/} *R=B6FLuıvN6ɢS_OP YY: U'댍ya_8~"txl|bDr'D4ԄjH k4c^fZs6DlzϏd&i f_柮X}n* ,Lۑ=|g|oW9l&iț#ZAYT G+ev3[.lV~uw}i~0AJ!e$)1}OTKtX`g{mmĘBXө<@ 1%D-TCN.ڱSDWQiPe0#CD=4ͻ</omnG:ʿS i.;NW>iLw: wٌ/::zDug{'Z#?LXh`^0>1Z:4;{_cJ쁜 #ɞGNi<x;_H^i͖;y /oCgWʕ©Wy?v oGtGc]xppjqx7;4R|-k7%~HsJ}-/ pbD W@9x|SP8o)")8\2; j[ $TC$f{TGPG$.*|FAS$I,mQ>4V$ybA;wxZ8hlh^DŽ(|g8{"i"tBO}u+ :Q%^T$utm9ɚc$;-~߭fY~"KM_) NF {ݽsxmC9PW 4 )@oy34u)ᑎXWxpJks eB';r?pkYwMo16#~/&ƀkTK~'DNNRM]_B%XUBĺ*NI(:Hqu@ڦ^Y3t#.arM擢ȵWC+m}Y%E'h*W4TY*n9Q} &O q8qcc;PQTDmA{fC}^ $83}?s ӈoȯ=] V)kW'\U^EۅgwUpiSxR`J{-b=SOO (=];M9tHMJo/Lan di1<^NTLK_s͓m @H}() k)N*&٧ OPׄ: n;O Ujm9 @ Gֻ$TKPsSTm'bC`yj/״BF@ss :;gZtE9y'0^Q\,KI1LL΁DEqO(E6V_d{?B=q;W%3e 0d\ |(M4_c1YX (}XG*/3{fֳoh3brTp)3YDQqQ-Bӷ,}~vwqd}嫣 A!i졌6![؁(m ij#bFrK?PNT36N:m7fwőc%lEcG9557AuɮujD8#'T4i=erz0jo%)DJ "ԉhB7B'K&F;H:u<s=Nq>R K-^&&d䝐mvLٝ7ܖMV#< 30 @#O|;1%Cepq\+{q<oxJG`Lӎ[zyΏ߫5~#4~1<W`d`jFna N,bѲ?u^C0.P_e]+9 5})vg{TQ"ĝm6*e RjtPN#]1(IpUJ6qy3)fDcILVf{I7BpO~˗S~O~.1R,'<2ᎌY~oN?t|^|H?[\vi06VR?ržud smcodh\ <̪ E`;iОbm| ]/|&pl./7QPE2 #լ3nsգ9A 3E.jv:4D[)5DBCZQ0?H]ʹ#*AIc#|R]\2D#Rd!3073Ƒʸ4C UpoH8t=tﺇ4]|\>Tėc[_go{M~fn䦜1dzilmUߵ^g&Mmg 2F:PνR[[4J Fkpȹ6JY B7;pU4&U D8R+fas%t^q&k{f&pYv.Ĉd&7hwDmfL@pWUDP\xLuMt%ks!~oj1BgܝC)1@6ꐘZףΧ-fw?gzVs%FVb}8\Oйn=NIZtasD5C ˨h.ӥϋf3RFww-&Ms@S1 q=pn@ D)Pzt77ں\`a\SxAL+(3"Gp.2㜕VwE:vƴ'扵=u>sO?2NGRy HF?GU£=p(FTbfVNwnf  pD\mZA!s0wZ+fw׉=b_97P.W mQA&L7kLm ae[qt|̇@&[򿿻ŭO=Vǘ;4{KW6@yM .M"K#bEGt &P0oR `ߪzS.N'ڀZ"x:mܰ۹F=;ǠAf8II%rU@hz֝VL[uBG@ -Lj3vDzXs*b: k%]]_xzqj}]ѻh&-[τ}v3|ˉ=es!2›WFs3D_[ݿl#}҃ ȹrq?6ʛtИfD[J+<4%+s uqkw>tsϱwb#i*c!ceTc9׾sJ`(.F\"1 H'8_XC!$%yӳНFUSH4֗o/$Oڄ8ݖFF>زUG!B lt n,/]!9@L6~['#X5iy&/Z9,:q2=' wRzȘ6`7ژ9I &|)7/15)Ĵ(RZ bS=[7AQ!ECqCTCjGF8`me)@( umފ$CL=Ηd5\X@d鳃?;_sip<2}"0}U86+#Rw‘:j>/i_i}G;0k 'O5[|rS4yvva}܃ C嵞=S{Ju3]}ߊc12H1(-X)hN#xУd0:`_}o֞ DU~I1ff1),y8ۿ.8qOzod&qD1"b6܉+;C:q0þ?,3q,DZm}_'&M&}\蜝3L̚%;#ۨ)B{5KM? V1i^_7u"dh?v@Y艁~`D{6͏p04 V5gg~;1\ÿ~ ?m07 H}bBީ1f ߉b*˞Y8.@t0`/qÈ@eĬdٙ.<0tfNǿӧx~w'?BjOY s=.)Kc< T9Ш3ylw*jo,^ٳ;;= LuG)|C54bR3hTLU4 R:"0@!2?8 efI[σJ `:Kز^ӿ>If0As쿦QI~URu*KPͩ-ϯcIj1g׮$ouֳL61^GށN6v28x'퓝D^y `\ {{R# { l8NGUa0/psZH ԗb;?z56}뛄P7Úx7Ɛ'Dj tDq,'I_I.Mlw7މvqjRt5ٳKϠLKP+޴i-ϤlI]iw @#|04`jߒmܦ;;^I+!3\bԒZ Anْ%6+ ?W^ x+CldRRDj*U$kxxq8E cFFF sx1YsoIwQ , 쌅͑nx3N>6yBx5? aZkWK)/돔5ֆP?fW947棁9'1PI|uu:L~Su.6#31܄B# .ev5O)SuoLYb K,/9^o7ﷻQSrn4rlg£0wiy;/<([m~Ƙ9ӦV/pç["\X ~48\uyg4}ۘ߼֘L_|0Bi!ǀ ^ۛԜx 2?j= ۉRtRU]{0فFë%H7KBk{AV@01XB1LB)@ ~ӏ?3ˏ+ة/h͒5{3ý  oƒ69@8M =5%Sd2ṟQ caPbY\ηEk kظ=l}R3HWSo%I p3Asͦ=1ٛc֗H :6uK%5AÔB̤۶m҇w7կ?qdu os-7 7un"kcw$< F7ƪ΅w34-yt:.L'zD7܊^3<;=BĒn(la%jk/&;{VםkkTNE7a2F6ʘoMZ`E C^>LY_nLq,)?,O5i7`&qC&w@ҸyDd+ I_?~>u[K}X:d#ǮMG#abO $k @V#õ|!g{~ąbRc$ ϑ||?cݯac "SEGšez6 ' Hdا vp |MΧE D`|Q4닦 wAZq'-~Ͻk''ou^+O?W~5IY4tTS;pM4ݑp'QHD:JXI Oᅾ+3\3\XX/'S/E0MkK|7߆7~TC-٘&p!ԺçJ&em ckM`'mwl+ Ȭ}d!z{m4|X 'ZG` 4A7n7~Ԏ7ֈȥaM1r [c/39~oGq<#}X7(;& H&$RRdه}y87h{5{u?%K|_q sц5d+ l|O 0Iڟ'-og4 9|NL>yW4Q&&=M69]gBs&_khe{PgbeбiPAsB;p? ɢMqQ< 2/4%tᙾV,Km#L8dr+6oށVcg&'DLmC0NEY}&}D0n&9>uB>C`vNCϾ/Lr2T_;W"`8ra=u x rx7d:w50ޅ>#6>f"np/Lpo00,Yz`k /F?h޸ȭ?&:d; m_iw,ANmkktf)tכ1pq3]mאA{Mc_)6X ࣰ-Z \6y"C6'>S_Ѐ?ѡPB>ԩew3۹p6Ja{|H[6p)[vOݳz yK[o ' } o>Kohq~>&|} mZ]ˠ~No煇^jh/?nKe x8s$n<};W_j+`$ηCG}쎅 ɅGjͅ2 m~^>қ} $ R W}x6Nj ka.t4!h7H'jNI]Rw]{{ܻá6Ԥ }!fs!=íTˏLrj60\V Џ"[OkKdykw{s>=q;;ln8 ݔA?8N>!hT/@ˍђj/ oz!p۷qokYZfY eB9r 3(\r~>\/sP?x{`6ff=(RÒ܊Zr/\.a4C/Av2ӳa}-?\6` U2Ȳi=h?e)GL~;,E&/=)uu%eѻ`w}`$1sП76~3~rNvCZ^kద YeܱS f%,‚`u&{X0 )F~V[jvq שف]oݍ"F%\\I:!`eCWyWFcv5$$5tN L@B cNyF|( .$)Lzj:xoY¼7g&QV=]e륷}oy[,ۚ|}i4ϕFC88$ D4i`J %dV7xb R=V `q^gcW^7o'ÒA.{rWCG5Ɇ0Kap,w^{7nz5yҹ[]Qwhd(h$Pmqj\avjC|qb Xy p7b˕TVzpKi5s{qV"r ǿsW/r5ү1W^@Kc W1$mڻm\C޷+Cafzj)'hPoM@:_U_ePP8.Jaw ;(Qsǰ]U{j&cD3O | aJ c5\L|O),- =9K6}9ooXN.[ 炁۩ \}5 x_= jnf㯇nv6[Vwr-6\NZ˥Tz܃4b~ssoEuPtQ/Z;{`S,g[x8BN+)+Yl?rJfsyvJhVTk:w}T}jH`Re&䙐Ew aF]y5썕v*ULJ9s_N @g>,Ru a5v*X WB݄ΥsIjfX86,zB2}[XyhZ݄5 KF&fBU`l:68ffW년D'f:<c`h$%R#G \Ap\%+17J[>}2t\qa56x.Z|Zkc%6,dxl8 >o17j>m njRKöHb5`8kV3)G2u!TK/Tov vJ-Y΀Bc,м3a#ʰ7#qx!c8߃ JXr saЃ~_Han4}(e[12 ЮEVtrogmI~*0ɴ%c{dv,j(YuwV E?:ĝ| E)<臕j=?,wK-aj+?/gt>#L%Uذ k\k ObA1,'a.AlHz09! /K=*E;3?)FVJ`EkXIsbƊJOX,BKRDdžAl4((qh'meф$ >6ew?Z;WLKw/|VޘI|)j)T*. u%TPUBYjFN|T_*w~ cuj hQ% Mȇl\-~iTz|dX 1,9#XN ,fVKp?$6'B 62$a 1Ѿ9?.!B5t[)%Aet}}Xv RC=\\jZ(+*BpQ3ٶj8?#`X 9:ArgGA/Q`/=X19BdX\ncÒU%; a.{[V Ʊг%~uXBU|C&'1!E23 Rn#j'Z(jkCᄪƵNUT QCЩ?(C>xwG^ &+?'' |HR>hcBa Q, D,D0o VO``yjǽ.Aj 5k ִM{>(xb]:'36pD{5p i\B^yB8tj kP~Z,.%[Vӷ } sb7056gAkZXX1 5[͹{҈w>7'D:!rdZWNIEMz|`ҩ? Q܄hP?kL5ȏ3`®N<9}#VAZDZxj_ X#.Il}~Q:sD:XFd_jgN5;'FN'{>u\ ~y&BbS>t (1!B5v DF J=T&a>ΚiHTji/^)238H( ꜐ (D{!k=N~롅gM::/g J~ F"pGYY!ȑQS] zh,'o/kb4oʕ֊//|U;c0`͊g/g)g`:ƞN}ijEzM#0>_;;Q>;=AfɧDg HSLL|'839ALK,ǻH;gIENDB`./qwbfsmanager-1.2.1-src/qwbfs/resources/256/detailed.png0000644000175000017520000002632411404701453022455 0ustar pasnoxpasnoxPNG  IHDR\rf IDATxۏ,}߿U3=3{$<$u%ERȒ(LǎH$SyΟ)/AmF$F"9."JysHtWUٝL}ݝ[[U0 Myaa: t0, aXð0La`0a: t0, aXð0L Gϱ, Ü>o_rr_^7\pEbLWuߩ^}z)` 3k3s,]X$]eY9?o3[| 殿D2[FӼ6sdAFh ~=*4#:,g6Hs #jm(x=5WO{֞?x|flpqciy蘧OaE6vt•emjIƟŐ5!\I./j(+BQ-Qh1p|&8^G'?䂞"1?&qC'ynE< QK aCwT ')MH'=1:I+  ͧ)|| 9ʪJ Ġ_o2^pEɚU5AA=aZV?8ۅr }E 'hXNK``J ~&F`a0yJӚ?k͔^_"0QlBޡ\= B#HY@8 I~S  <1.19!HI"v?D0B4@H{:";.R7 @3,Eo\]H6Ͻ=՗?87x2&6#r>.n΍{x޶Wf*B (m6 xWi-%[0N*J{FFl=&!Z|c&HE n5\^*qoquԨ>V J2F H`'b0N]Axgb@Z41^xpܸؕxw1&- 6A.{J{%$S{ @5I ԤI!5wx AfVsyM~qj5s] mxAI*桓(hbIk& 5z&Zj|W&+=NCD Tz̴ DBui 5@ӫF,6`{Mi☍wpp&~/0VO!~PB;O>v-k]w7HZFU0hTJj4S8D@jK_z$5~e2/ ͝u/2x9htMƟ-H2i.xhrMxjfCZG$SHk@itD&S$y$iMݾG.7'ZbgBvgwz1NtieDv's>~>Ѡ;} 𛸰i˕I"DIK(JR!$-PAf 5M#ĠE>^Sz>IӥG%@&4S:ah@pbAĀ7mYf歔RǷx"'{wm o">3y [co_ܳ2d"b])lg?߼uRp>T^&c2_e qBB$pL ns6 H"%}k=o%i$Ps@ %Fʟ~寽Ѡb1'9zy^!56%.mm(~r2#_B`P1۷ſF[xwhjv03@CǏM ߧ5օ'iaj]aIv}I ^h:A'8{u3:\Ʀk=| q CP/C&]I vv,᝻n`ozy>xϟ?|M\t1+O0и|aknd/6 @/i @Simn V1g[A@ u43k:dhW8 yԀe^@cծHLY*v@jzj@8s%VI6Tk|}'PXCpg`PO~ 3S{y[o/3MH\zeU._$ }<ν\z;t%Q}{56BMj?`z>ڙG)>#1z">A9%֒fn8Z -$\-J*4xCye-g=}S;VM S?&fם}q|LмD-zKLŭQ,0W"_|_RC.\j/{(m(wN \h0zclc2} 0/|daCH9/v#e)]d`Ex L&SFCc{@QIcLOQ8PJkpi(˲p0`8XzaSoFkhcsPw&8[h@ih,e6Jx`;@XXZoOq7 s0r8MN&)}=<{wZ_kooOpqT'/@ ׬7`ZM{أ'wKF}~%S¥ \K׈5? FnlS/=^?>Zk|-ܟk{#&6wi#k,&cDž(hw֘hkоy/|1̙:X]7~_k j}a' 6:XƯ omaoH7M i-ժZƯ\'M-NK0?O v@ق`NZ'4S!ƬL4~3t ]Jbsu?l0~9:Z_Įng2-up>ck7@4f_i!"6:pcg6d/"00PdL[i ݁yh">k""c Ü#-gOC:7V:8UyHGP$v2upw#w'yߑau@w7[ c"[X6:8);k|`'.AT(T'T09C''\6:g@B tJ<.:WXe W~WrfiV8/Z'jHAmTØuEa]ʲi0`~>x0Y??BEjþWU<=@k}8?O74$XTMdTL 9ShZw}d?R"2iUЖ´2x ]?< ȴm1TuhT莿M)e".MJ1 μ P݁hpCm0aCWuX'-/&Avhf885x/VvU @n",·s _5bZș*_[;#5>d2Y)y]p `ȹt1JR Z[[%#XpHs,L8swݪJDPV s?.H?r_nAsD Дn;`NXYsTyL)( x]tXF!N}avp L1qn%[+Psxdj9(5* ̴sVAeqV砟Wv}Š2^zedܜ3"))72Peԣ(e>I `d a_zj >e :GJ AD;*°Zb<8z,> M~Gӛ+0G,CȲ BZcB8i@UULPJa8bkcv&4WagZ͹ @ez(eY0u-rk^c0b)daT0 Z_xi9&tD s erPY(ű0ƄׁZ,yya}MS~i3:p-/Xeȳ yc<駞Cx_?P6779z^0zWTX/ *ï~Spa֍s_ x17oDe{^}ؕRR&OAfRaPv8>q / jB+B0 @f^>Ihiė._d2EQ`cc q|(@@H W1}O_hcg*B2$J)0(dЎ r7r5?tO'u4],EyX޸Othc zy[(t»CLPMKf*5x/ \TZ*lA޳#ߟ r[  sִR<Ń]!0 k@k|{ه?|w gin'q;3Y:Lx<{_Zkl1ٍgރc  xXnSY'Z'wõ=t}nT>${{IX+; B Vm9w\|Zkܻ.Sl؍VijiF4\ ꕥ?9cل/9i˄wA4)9?:tuh_ `k5 uUU/]Շ-!Sr۱SgS`Zș !MzZ 2;gHxwI~<i%" 5 JUfҤB6tFO@ťq^Ƴ3AӤyi!g r ޸a?_|{zx_ &c ›2-lP{-_SvSahԺ:h-?cܒ` .ζ hJPkd2Y-% ڀ\ ig2ݝWim 7ۉ-oMJ5htQK 0ęm R|kjX Be a)$60JR Z)(H`q$ NI]Ѩ@X?"7q-! 7)P5JJOEk aGdǙ $MIJ,0&(aBU~H< ß~gF_L>&6δ@ܲ,1ytb;EWrĠ]e0\ sRc~YUGsz5d av(@d9d ؽr{.O||Xed\^qVV TKz؏M +RBf9 y_زbi~e\_Br2HXhAYNNv1؀|iy7va:[x0 d_}euRn_'Y!slll@Xϗ_?+/L &&%>/!'Ü>^N~t,lO?y&~Rs yXX+qIdq{H_*.ggZm r>N/NE;8QO$Ća *k5|?2|&EN?pv]kyK0a: <<v}1 ð0LYw9AYn0La`0P@4~GӚ6cKîbBj `|9>7?3LM 7b+w?"-'[RH?-񞕨j37?4\2lrsÂ9F⼒߃]ӛqkGhc7Ӵy@8fs&O0nXVyh7oB<+g(קg_4y{Jc]yhn]vAc0C&& ]Lj8c4wD636 DŸC_H\_rE̊44Æ8.'NӍeba$_~Wz:.M/ċ"2ϲv:o&{/">!a2/ra: t0, a^8W<:RVp,Q'`q85"yG+!aJ7' ӎ3Iv_5ͤ6X-zE u9d=p=L {OOG0FAd%ᗏwWw   hcR"욒vi/F0Ȅ cvCYV'8ˣkKVN{#23NWOt xt0] _]ui5V ôv2La`0a: t0, aXð0La`0a: t0, aXð0La`0a: t0, aXð0La`0a: t0, aXð0L%0IENDB`./qwbfsmanager-1.2.1-src/qwbfs/resources/256/success.png0000644000175000017520000010637211404701453022354 0ustar pasnoxpasnoxPNG  IHDR\rf IDATxw$Yyު3Q%|ծdH29'HaLr qe a0β$#jW*U㭪I+ig:TyEUPrjy?P2O02$ ! e( `(C9eHC),CPNaPr ː2SX02$ ! e( `(C9eHC),CPNaPr ː2SX02$ ! e( `(C9eHC),CPNaPr ː2SXC AjEPP [~Z:$ e4'! @5/,BPGFQ SZ-&K¯0`HCJJF,"XPHLyT#LNn"Pap(C߉2h1C EPɯ`O8<2H(E" @bP5`b @^+`EG]ՓC9ebEa"o(!,¯\DPI5Ù`@XT|!pd! Xu9,C `(d߮﫥X XX) @Վ*P( <9` 唓Ouّ)f:%:> m-RmtP j6H⻞PN)@F52;\B)bRJKPxTgp ({kFc@S`YUQjkm[jU6Er2tz(ERJ ,zyVnETTuE]V[ږcCX%`w? 唐|*HUD4ߎWGB"  Xҳf1[(B` #)=< F㉈A; P)QEAeTTjSŮWQ| 4R C·aR0 [6)HK}`h ZF|M,H4U$?._Y{/|LJvϘJ^^4Z+V}S/{_x "e<$|Cq}*Ȉ u#f Fuau鑀F T #=zow~xeX+b`UecDD {Pd ]Ŀ@Jj a w?*΀_\ @FB [d۷\J%PƯx<D& %a%Pdc)D.3isBafʵ*KMvWlVФ4y;Yn/÷~ob5Zc-VQQ,jE,tE45! FV1=_@L݈5jp3$ pV\2"?s{XbNئ@+hͧfg匿o?qoaZ`0֪x·h[B{T_>Gc1em_L`; nʘ7xտƋOJ TUv11^YG+l%@3t囯?]=VUK_ĔHYF\ ՟~:eU+%# U2; n΀>eTMzxݥ4;- ~)`NS-khvZ3y76roXk:v5 :KA,aش4L +QٰJ'"-@;W8f0FxP[Vy/gC(k(ʴGQe]m=,5[i  #N{Η[[Z=l7g : A4mhWlhj5АUa/O, `(/XI*d`J56fpWbۮzkwrS32J__c.aV>{3 Wq#sρlaLB'a mSCm[mj I DUa'0d{oE͏4B762jf &Ľa4Umel}3LtbH@EI2K (5Q?35*)*\ r4c=ou3zpnʲ_ޭ*ꚅ(AGqAI} "g~-w `(/}_rw`āj+Qzwg^f'.]a2nY;zgIwyRH3ŖVڝV(es˳oz# @lE5eg'bpX0^VW$Jy)2=]?257vmi?gr73zӵ~+ТiaPۗ;Ko6GUA4& K:?08Zz/=E>LEnj<{s)k>~Ю&K,4 ,fYN  _ V[kgꒆM,MBZq D>u`|('dyhT;;B?Y~9 3OD񽓻(z*w')ynj0hMQmyo<~2rRʪ>dk{rO9{ܚy7蘋^ʖѭ|A0"7 Cj;bYTXYmg8$'NÎ@C9)%7O_g<W{_i=gn&g'^^v3K,~NUN5|:P@fgvcW>5>L夒+/@j3Q77[S299y]hK >F92rŧ]/>{vw԰$^i7 DE"9dĿ ZC9y$e@yǝ{qo-f.%vny{0*I[K\4Jw#PU?Yg$" ]X= VԲeJF@}ZC9id?ĭ<;./%vn}E𛈴x<5MmmaC{`E<ƴٟ|ܲ]oلRO9Zz݇Y<2g?΅WRwڿ;7q뷼=)?6!%Ocx @u|ѯ??*vʿOK;8ٮط _FCwi>ZCy^e uwG >[^ ;B,|fg;=h|vgx}Bv\+mJlbE@]`D@70iE0 y fI43uAw`ـ_XsZ缴d/;d kb߆sj8w  P d݁C`(ϩdo!qn*3'uͭ;?]ףӦ|S %)λ6σM؀eBZ=28w`w WH\ 0TF丩2N'h4>tO:\=xrnAjߣG|VQ_x_Ps bn0De;`{ʹC`(ωy緩l9aXYCʳ*븝|blc-~kd>OϠ5N_@=3 |/e5?=tUUA~4u[!{?ѐɪOj]X~V][wK\TO|Z》v}y zc뉵k~`'/_DE9s _ ._5?D5PhJ]k ~'hByhfdcsw86_-i&[FrK.\އp#Y\^@&>q H5$P ~ʹ.n',}Kbg~J.U2 #A&wߣ_B*yc$;u1[9g㹌WqZ}+W{K+:|مD5 *>i}iHC9a2FtW oHTIS>7~-Ӂ|xtj5k~j_?;xBzAٯ ZjnCݛkw6$Y%77;O[KkQ ^x~tqy r5!Kv4yLiXY2aRܡ1u͙dHCy2'972{f s ľuy?51)ⱙ5觷_H,Z=u=O>4RL"`rP( &忚 ! Zw`CZd&}vP>d{ӅcqWpgbf:0 <-V[EZP27_<<]WbܝsipyO䱙= _ y͟?vpiQg$ kbtmkET YK@%b?dR_ע_w<ߙom7d~i U|Q>{jB׹fu4d:@6(l)2q@ xl؆OmX ViC7o%'%%m~#&oC92E"dԐ^ 55e8C29?`'?]7K}gs;er9J~깞mr;6Z_:FY?4* b&ə#_wlml;si.`GKɷH_fFl0y N_V 2fa~HoGEE>7y=y}}QMѪq~>xgk4uy&9īG(%Z1<;?l;S}8脳sH Q{lh-V rlX ~`qH'@>*3y~Cz)8^[ر-D@M{pgj~vεV{n 8皍1*똸k?St:mZ3>Xn.?cFB?_XFMH@@,-JT$u^(,@_xGGDA޴4$)nfZwCzsuGc=\~ל @J K?63l{wU__:F:7 |@+l|Mi-4y~}zT-N3k5ju$K$4KiH$)%56ƒ(#pI Qvc_WQC7 )1.'RA"8ߕvҫQx] û\<.@t-R<>(_;rg OO~_Oo71fy+O߂g|CӡC _pG[Ak.U;j꒪.T OZIH>\S K^DڥZ$d:mH?d_zMb_E뒨kg>]~#{N~wH*R?(o4ҋ_<%{^koO_0ur_u<\6~F iNGOg^rjvs3|hÙPEk킢K6~cQRM̎*D%iC/8! .?23sV Ұ> ?rOq74PKMO!U[x=ۃ1F "\}~?/1 ږ׬wA6D  ^NgzvO}3uFhӚkvО넝 ,YX-UVJ=$! UH_4 Qm7 @Eq:BDD tC`7UAPgH){D&.qkNkÛi}?F^{՛{$! lknA>U[<(z^05ʟ._ǘYzU%:t^3 ̅g\|E+sNkikw NktؠpEѶūX@I@?|n2<8gx6U~ˉ^^ U`HN6~80/HA7!E."caaO??#Z nA}n`ϟңѻ~ HA$CNءo<,_>YjNEN^脝0 WBj۪  5U5,+K?y Qq #DMATBZb{ZƥB "$G!^A_88I`ӇK^PMzhh{{3yUofL-M$u5ݩibIҤ )f:oc࿖1inS-Whw:xKK%{TfО l0\ZhNY lزvTm Vȭ IDATFue_x"⮲(版/"#RqfPR6n·4Z P7|QFtQeE]JZ(URT%)K4FTFU=Uj RFP22&Hqg2~#M=z/SٞȽV_ k}}պk3m0rrLTT,S.aȃtmj0l0B'hv`! aZ U*8>Uܬ'yeHAzm+jՍso^Ϫʯ ]aSԓ'J~D>KOHxJi]YU RTPF iXXW7LG5z_gJj}_Ōzטz RN`DL90mö۬ڣN0g5 p>B A,aڰߙ*cy `Sc T+' fL=ݩbnG!V7^QwP}lQj⚯ G*$_h5)(']Z77O^? 9݅3rWK& !C/>=w#"kO"•/fTqfb$btb J6vؙ6·6 l`mbhkmڰmUHO΂_Q#.D !Ed!b*z}&Hd" ꅿ,{9b6ni02~ldmy~!s> oJy>\^{'/Ɂ}݂${o_Ønc?3fq':6b۲͙ [ksV휵:6\l`]Bk[VmG+OezndϢ~F )Hu1Uc̨Axӊi0,ic+m #B%,^%yU]jURL)P@QI`FUF>x-RAR(⏌'}(~M읾@d4|.Y?ȬsXre- {k3' cdf6~9 :Vuު.Xke뀿ֶ-N.n:fe(*"LD/"E) RS15xFLbwZ$haul VBVt91O[?䠯{)ΩUJMUD7DEˆ(c8hό=xeobtϏ7?mvfRD;f5SsQ;?y;Z~1rH9u0 V.[kUmKU[V]__Q8CIt1H#pG8z6mzBh9f*a>AKW_uK@͞kTP$tm3oF lxxB ;T_!g~M=ɕ 0^Vg*qS*N O O,>οׁf!W_CC'}*XGsRfGmUGuAU,+1UՙgXUH&PInQyeA-׫UTqٜ^:-TFp5T4+ciE(x[Ԅ"FOcف"~Au`!fOxͥobn'jw{Kz mEn,={2;bFe;U/ȱRiU{*s)WtɁ_W)Y$iNIfČ fr&вgA1qE[=LU@IF˜rߎ{WyqvW';k.yS˓<𰫰)Э Nݧq|}$oY[9N\1~5f|WJYђր*Jdɸn$ՖUyixE?J l:.<Uij_Tz/=e+i_@RA? zTUQWX@uXU7_''$t kC5cL]DDsÉuSB$#5+>&fGP+"PUafgKEj/N]U=l̪jͲr)@OBg}r<'5(j t|1QijwY oO^.Or=E>y)&i@%QYh⭉'=oO.|@O6U=sNhBdR3N4~7(F**12&ihVؔ?/G+hRSpA@U:C;h^4Ƶ/=:KGZ% "%ICg}rGqO(GP eg/L=veb 䳝jsiJj4G{#?v_?:rLTo 7y'"bpPHY*ƌ9/@ߏ;;K3GҍZ tl.a lhlǾk")N):t4"w@B} }뺾gT3+Huw?3+?=y?<2.лeb@g쫥.m\AMFG 7'(U9&3,CҬ9<#n Q]+5~C#U1Rcƍ1;:I4͠ ;!}>KM\P?oGȏ}q$P|7EK@S&B[D:)]޴ٷ#ACjߣto`jeg=z>~|jd5O~禟qu]Ŕϯq?>?<3ňD>#F<1cpFJ& EnoM=eO2Rw<<宿}wݻ&Dm&~| $ d/* ^kHKDq/bS?N@O_MV d i}nu߻*PyK7!o'}zr{?]%pp蕌P  ONЙƅ4Ȍ_oM|XG$Ls?/OR#e~S#ucf=-m(l5c;=)Qb8~!=L;hE&DtdrXOfZ=9_ 4h,<c6^)1cb+=c֭ؕ뫅Ƨ6i, ]ڋx6H>hƼW&FTM>d 6ldSc3?[vJrSx70,nq1n`000}ܶ!1S+Fq@ê1+|拏/x-V/gΣ{s#{$mdתl@+sv|{8jC{LU @2iIKS$"QO1≈')#EcLx^S{4ҍcu7W E+l&$uᓜU{O;}:oc3o&66AG4$ }{@8K@D#h\$;#+"ggso3ĝ|u5M/"ށZ:odHG?wi v}L75\T?VQF>?&f:jXLHx^S/P5G.SyP#f\D??@׻_p?cg1ʞʾƯ~a|Иn=rV#5;lѱǎpVlGh.=}1-oq͵-_@8&pDљ(&($1DN}F?yi`O]qlɠ&7~=fu~ܟ`Ӂ?^ɱѵwlzS6';U$/_NV|l .4L44Ok~}~ǓU R(/b1ggUP/x~Nj~qo3gwMVe~[-RR}eH`3ն_!OF̄o At XPXI 41&ͫ~ʸ{n>EdZSqK or~ܟߗJ;>{N_w;MKDxu0Q0e)[զ46 Ś? $M!~}/{+bBq%4~yh׵[^rӹc;MoMJ~_WTޔ?o쐋s3${.O }mlfKm+?zn,ᰂ , HʆED}屧5?qm/qy.Q}8j]'{i2>O8ؚ{l_?޾vw-N)[m49BV˼Z ϯ'揥/Ĉ1񌘂W ^R_x/67w|KS&W&%[}+F'4H*f>ɵZk*9md+?I:t%n Aߋ"_5z^q1x˚1l׮kDwyP1]{/]Jіg9%yѪ!3z8rL.`uV%,+ezrDIdFoW,RW Ѣ_ uWv:obUYݵA@',C9.OU6VMŦilk<4o`9,x*LҭĒEw]fO[MCz鹓 ?Cc9z&x̱ۙoU%ubw_eklNqu*\T-}}BտUC=Nk uV- jueK R}דSǢ}Da$2|AS*jESh+Wʺ#w}ys˶_O+SJ2%eL0l񶍈'H(-8:7Ҧ=rɥ ?y ѕh&#MDMJo2Et^?=z: ׽ʃ?G/y;]SN="}t+(~ϼl"Lm@QGPk"۝'oq=f^e2x?Etna2T'BHkx_ELWMaHqpqr_xM6~9|ٔ^::aw/oF"[ȁ=_P SxB_o"F #n-Y#iZ!TBݮPVM??>vxe3Ͼ8OnI(& 1:KtuoUL͋Qe>ۘoޥ"'}|0XzT9Ez-{_PG7k 7_/B슟D; K?rO ;<>?{ԹxF[Jsd.>uouh Ks Lnۋ u" bi~O7Q'B)WDe3F.5}YM-ݾ~;"YKXD㝖5/h})?`ϿE(jS^a5,Ok~i%iu29"%ƘS_+Z0ZPYW-VM^U7 T_*49$Wdu6Njk*ڜsGGlvxC u8W K0(Bȼi_FWĵΓ|0ǃ'?]53H?ODS wpRIf'>)X¨+!kQ/`VC]!Xڑٓ%Eu榨Q f0'c, IDATxUq+i+v//ʹ6폞Nirq)0"轠ݸyA'W8@V D5v_8y: 2&jϟL=0V/| ->75-MayɇH8>Ⱦ{>Zk wAbʶGqf,ȖnZ#w~z5lmVEj_(3bT}S+xF+q"pKjk\;.f3͟=Tu5v9}֩$wt[実㑅i62{wK:EW'଀vd ąB$]wL&%!5 6Hj3yӅoe!2`\O wd땗Z \BY+|}g Q"o]h"DP4Y,KH (KF7E$bSī/xVۗWV~RҔ!(72JmrՏ/r@P͘) =(Oȁ=+HVIS={fV whI_w#2Ewђ K]0.+RĵR/Tĵ𪁌 4:sc`T_FWOoԇL~?9>3Gp`' /^LI+|ܽ VP*Hɹfڅ1v,uZC4YB4yBV4`9"t؈ %8Tt7L}Ip8o'Wlםg^Çt{- 6=+SԓR@qU_h M%KdTiR?{`s4Vwⵈ{$RufY\k6H(uUD@\_E˂HU0cjΎ +g "Ϳ@[_wsj~C)\?s]Z.D= +URo )Ǣ<# %% Y$+D_Cˆ߼~ U ZT%T?,B Keb97}Ww_=Ku ~3F~oӏކMGRty(}p +ε92h[Bln~ԥ,Aٹ\,Fl0O/~7FAcS+x]ES1;c1k+";AHnNvqwTxOL'^g|wLb+7>۟H`c{PKz))+މfWuaBtpWf쭾K]VMzHWarܘӵw?L .GƄdiߚd&\Q~u$ *US_y09Tm`0r*Qh@Ys=uqQv*o:Ѥ4V>MS̖Ü_lp$pla[`U ҈L7nJ#`:=._r9͛|_ m`6:>+Wwww7L,;FRTbKu ޓSWzwI&&B޸eW)blO)y 'sT KTtTEGx~a"&)uydGu wu4&Tv7~jxBD {z;{96y:U<ɺi;O~."ZB>аE}Y7&]ye!JTXbg=r=^i`|OLΈW+.swLlVϩHoe0s3xej_Փ ?H KvMD!PQS5/u.7l7wv\AK{'cO' &޿ r#T KFu7G_ ),((4g+|kn0I3')tx[<0#|Q85'^>$-_XɶY.f@Po©>'7 yG+1 1"{=y&יt*7m^3\I%=>~q:Oy{V{B7KWĻ6? YnC""91s ~Oe[8N;&K_h3ZO i3j|NWcz {o./ܱO/m@;RmpQyI:ٯ_?3/#_cun$0gy0Й&d-O9˻WPU0jQ=Xr=7]y3_ȩQ'˃mK% =@VMA4]՗&CmCQh$#]UGFPa+چmpxZIo=&<(5gr^k+LRi)fift4ōC73yez_5&Q[%Ԇn^wokrM/_K~t,n6ȯ6ˁLϘFZ&bB ?Kp/I_<[z qd0cxg|@`dduEʵ.M_ QȦ?P &+>h Ǧ41x6;G6l{([oP 5/BA5`{̝jE S >x:UH mW ^/~7产&?}u7vǙY[~Jݵ՚FvMj \?"™VGO\}m9k,y@U~TV;qTqݚ93M=}oa..Cs`C1Hx&W-*~oy/?~ըJVy K|2Z9sW'.jvv-hO>5?-^M!uMkH#p !)2`T m~"'ly?gwi/ /\.ʶā}ixl2& ˍL3ak|?0 }ӻFѤE>/Rrt,waܐ~,%ܤ1]_O}__|nhN3'FxƗ3ɱge{S1ȚuK.VFN T*׮y;SW|YMiz`hFw#kkyLZI= 92޽`Y5HrlI$V-?]n*A%<6J/Nd#ATU;w2|0^̱9Gjɗxm8\or@vSyv޿f,cbQrʟ3HCT,A%bTr1B'ritX6T4Ɂ%=Yi=:`h3:ϿQ aCex||+M?i+ˤڹ*Z;?Z˪:zƄ_]?)d`TD3>c<]շk`vdSU]R ӌUG91L13<>;G+}_IKx?kֲYRik~%$Oi- T"j!_haayG?m~;ācgsi<6I^ J!94(]aa`ozoG8oS~•&?p5Il]ƿ>Svq2Qn.Pk=Oo|7OxO)"芏\L"BX`6"FyC=G!Vwa=T<%gS::c % mg9i ~'y其+jpAЃBt^$M}.ޯo%~4@ED%V"& ]50\}<[^ٿ٠Bq8qe_'~a<Dp`.p|(3ܾ.&uEbamzc߷V55C7zf"/9^JAu6$ -@|)6-̤- l6j`L~tAPwm5LAlxިʿz_J7cv)WyծNh 02.73?4 P&aTP7AUUV *>əɑ}+2D_7'ԏd< -6M#̭ڼt8wQM-ET- 0m]bC{ZV"+b<;F dӳsOd 1??kq dzQ 瓸b.K_c4^&#v\t+M{]KTԧ0'oC h$]Jd_Z1qCr`eq=٩eCTÀj!A~h=76c~`fS&f9̑ÌtuuiuޘJ@U|GkUќ?p$ٷV'|h; gˣ(i_hϱwݟW޾.oh\H'd(ZF9_Bp)^?|54Zs_rM9|{}a.J8?kE^$zbs%{T%WV (>`rfjҞ.(UY=8·L㜬Z JaJ{*,#=]Z$ꀚyhu8c?mP">>4I7`rXշ߹aNfbowl|׀I -~ 2va=G!\R~ۿu'G %=C|g]W=h1);)]H_a?s4+pwIEVAZFVQ|pyC/VgG jC Yٿ>]v'68*-X2V,^Lk:'s:Cb%Mmk\dȠV8m&?olZ~VmCh +I@xdHm4s͌6Py;[wr5mP]߾3hܹg W77IޞyZo"с$S|#}Q@aL g"d嵦>U "L<[zm+4X҇_SH"%V5daZFɮs3vR>\=x ]^=^*TxyE*v._)+=[z|$S!R\߭/lg#ǡ i =׶Uw|EUE2szl(p6'"ua&@բ6j-FZkZCCG_NΌuؐ( %KyهwȆS 'wxc8!Oj =U;g".l;?)( ~pk?E~_E@ŸQ|DU"kQU/(mlPM#CaUC0BqN' "žS5BrsvnNTmɇ/u*E4fhw -BWt1w䚊$3:qV j(+ I{Xz9?}7fp8-]wm5g4( l|Ъ=ZTq 8W_ӤUU)цKDoj#',FVb풁%c'E($ҐDQHoW(m|xOP 3/<^|V 0n, ʬm%B6x QM[%sʹGDęǫ8Q=FU+׮3ZjC꒝"3J6"0fr88xNz\߭oscp#4H4{mGu`mN%ӫOu 7:в?]b % FɴVե#HexjZiokO6]/>FGOZ"g.aNVOpzU|%ZV:YWchiӱvݬ0e8qGS2r}P7̯VhtCW[޻+ΗX@7?ZԺ2;?aڎq;1.:彙o/?kE!tx]HڍN̠q*sS_|$,ƦVC&P 4xAKD9*1q&<$e[:YIgcXt#9s\ǺA=Al}D.↛dmNñObRiYUU4 o&꣐Ρdg4&ȘE Tl__J%yؚ(=ܲ# NJ\EB-'GYնx)HRϚAR[!/7Bc8@1?`+J@V H *HAJ 4;f?) IDAT_hݺ%u=Fą>K]Yw ӁBѬFjUі vA${ a4G'FJ:blDd#r^'_y^n^aJQ3y%빚˶6\TYˢo_ׇ̓ Hq ;ZtelCfcY4RP#;޺%yˏƓZMQ@|XґV8,YUKf= j?k. &Hjci9D M@Owwi4Q"Kd#B\ЈSmk>L9*r!8"hV#0_G4)$1dzYkͪ ͂\oVyu`Ժu},:y|e\/=䄥N1@ͺe4(rȆf=M=@'msZxHx輽Q_OgG_v?Q(wWV?V+:ĵ$v21TЕqE/F$qW #0kźfCi/NF V ..~ny9Z9Č^p|p&<͉%ympzju55oܮl>B}QyeγF0nG9ٿ/@=^?gws V]/Xq`upW1G?Gqqs_%ŎߢpE/0vAuO&@@QXŪVV QWTT̑,KHz;] Bki{U*3&5WHٍ2cѲ(}[V֩d1;PȞ|~c kuy<른}}5IxŠk+V$?mWժ'?Q~nvao(@%Mt@b8' IU((`5&.52ûb۪qz88׃ Z6Ax:8Xt%9N=#k]%{ȋmhMwH%!5XoTBz=/_t7\y;U0CwŸ/ҫӊT5Tu(}vzio8CJ i$@D@4DXyEׁ(ߝ/ a4RS[NH`kL3va$;]^7^OKŗԮ< )HJsM5mӠuc ^mE#:zMOFM徠1bIeX=cq%WϯQp3$m2McjQBghCQ)Qrϑ,⦕pzq:C?wr2ZgmxUHkYrϮ[^vӻw6 j<}ix%KwZkQ:jKVZ-[SIZl4Ukmheo&"|"SH,x"8gV/v<^,bj@1i5l[shܴf^ S>+|m"BND@Ќ|-i6׭צ}2c~mtWw V{k^vg<S]OXsɊ%K.|]/(UcgُL$'c%HN  œn1tgc<3`|3hΆ3ʚ hUSx՚ ]gx?)n/"nvcuzϵ|xkiN{eypɾAX~UeUW"Pj\__= ʂbF $$$$HHb:r%EvC}y +ѿ-˶q*`,C'q L/8,G`o xx1 8VDju"P;"؅IhϽHH;7mSP IΧ Di1ڥ@ܾE&x!P*39~:H5oXUlDQFD 㕶'1??yEMC 2_ 4F F#)tEU[qMjVK-{E:G lYv3g)R=/y|!}-c: BI|+IM}7|$=N1|㮗j$'~KWڰ=IyہQG8ٟ<~EME;U u U>Е+)Z*qŠi ,q*p9XNECbۺr%DL4EB~q 0 U*猝/}S24StNp?oy!/9:p//=r "Yg+\{db~8WInd#{n?&{@PؚihP!NH KI681X#$@K _|m0t#1 R~![C )2CU)_?/RuX>y:x/>JKj(|5;㦾q$ݸ=UfK/F> b9N D bID$] ucĘ=cz=N^;}Vq͂b#\'#H~?Kdsh|߈gI- ݼkJVc(|;vjd+:vQ;U;mą>M]zkYT}D!uI3"z\C OV6يŀ ۿuV wQp 9G 'O֯`;  ~=+yZ*Bd (D'*(3@,n[PC#390 ݰDDeݠf[#VPet8Zj E6Os<>^Ƭ~}+߹Z=,"E:k/#c ~oEMh?CֆWu\$q1"bںE$gՈēS Xѽu70(NZ^hQBmˆZ\t0$jJKKHD>z.kKFEU[En{k(J/J@3=%D.[a< (bOTnH\-:?Cgغv{'&/Tַ⍒޽'{2VqO\Q־wUa#{@D@Q1EʨNRVtF"T֞W?7{h.xXME=QI&UճX~g3`bGֺ~EٺfڧB# bv'e Go=Zϋ{k߿2ܴ;ld,PVa*8ɟ,WZrP]Z4NEQh({Ġ壳u]5[ ;`ڛyrh|`O0 `'>2VcN1{߷STT蔨L :[ޒPmiN @Qԏg'tJ.kxӛL6TT*]k-ko9})&[Qd~+pEXzd6/Nk-RReQ@f=R$`KY޲P-/@2\ K?C-DE :RFedZDgDs.""'o>1&^\4C@qf9ŀ :7;_5lƋ<[G44:C4SgoWxipvÑE0E-R( L ̨KU"BvQį[3W8h:APU?n!e޽bUO_/Z>u6x<@N=8794 5R;5[/ p$QQ1EE)Ld+#[E!_?V$7h.]7GE˓7U\Up__nyٔZUIn #j&% }vN7Zvup ;;I4hbDmY a/[ޛz\E"HNp+$E <` &+0@x"lW,3aT]+HVe3&/X>>Ƕ7p>lA#[4E2%d**x5QEw7F9%_̵J Y K @•,#c/Mn&J n6S/܇Ƕ9Tu{my~ɲoo">dGgyw7/E&VŖ 2aUDdITBqHHv_[[.J8.=*1-N$*Wm\W|F_,o€D!n%򋆛W̫Lx93 FIOo&At?%ȑ?b~-ZRA1˾]pU^+1UɺHЩ;p"p&7Y CTl̿moRz^{}[O ,qGv#d"][nY6m?EŎLوL2%$.p'Cׯ"c+&l;G@Q\UED#2|>WLyF#,}/9erW/*ؚ& ;C4dF liضVqJ]֑/DDqQ䣜hF ;hlH3G_}c+u-?|P"0 Z2ȄEʂ)5"2#*1O9&S IDATTQIe[7 L*ZVnۢŵ ]v#b!U r6 |UNS7S}g5wIAQu ])X%ZlEFDimV3Y%Ш`ZcE.{QBu) "%8q_`/1 `܀*A)gWp{l1tw?[;bb[?{.\Em>Œwϭj/DF.ZZ*SgF4-ݸDvJy}Lo,sc tImzɑΩW'<}N~~%\hbUt,nttZъE -Qd5O"Fagod/ԑ/#FHf$ƸiGD1frLYиA-C80} A!{xNݛytu~.X3N:0آ- 2x XajD"faWs31FD3$1È<߈1 7rcQ ހ{]_m[h'GA_s_DzW[#쿿WDh0 %)dB0S3it.EEڀh@"߆9V-G[Z6P'9o.p9_0y!|s|& fмmȑ?JP !A)#)K4؊ֲIJ._15bE_<ۈ2cz< z >鏜Zy KAr`r9X!\::η^g袩?[7?= FQAJF̄ fÛ4xoU  )XKd#4 Wo/ml g:D$u\f} *PƁ1E;7lz?}д #~is>I$\Rp;D啐h рxH0N3;i̯qE/ bzM:'J@Qh7k]8f:i '<~d3Ó\;^Wmz氓NPrD8DDnz7]z]_6E `AT6Δ[tբU[ܶ %O ~WajN>A[spM낭 Vc{hZ6___H 'oؿв)a`BѸ$W*vt ]_nZ{#ƙr-klF?" k,$&2IiUlbd+_]"=~V$Ưurw]Zvl@gw;?8\6҃{,Ѥ%iiV[hH} |^~md`?~USyƘv6bzD[0"'/hY2U|k߷a >{CMx+7nĔ=9͑>>,15.'_Dxgb19cL[D%bDSn:\eK/\wj ޵^}uS<3{~3yg̔g3Ox^'gsmE/ZK[$i|i@L&[1W Ht@Q?7ߋ̄A}ߟ7gIʞ=M1/~ }ros`s w_9m۲]""@$ID-~.圈<*ݿe{+BHFPHe+ll҉``'6b!I"{sX3w7zwS.[yy9(33rI3rq*1A{Ӽ}:퉪ӵ[ƭkOl9. AI,;J[$l#Q+m\Z)9vǫ[PHZ߽h` m0\9}yߞwW~}A _[-bp3IRJ7ov?^aDDmBbO 5"b!11# 6InAÔ  }M= t{GZMF1G|Vi=vϿ^U*|ЂV<{8V 쨮Sz[?ϷۯC_7hĖFbr@Q@ SDVd9>/]vn>pI޿f+$ؖ> QA(#DA%J£sc2?> V߶dgߔupSh^-\ϯ:Js|}AoTϵ!b"Q>NObLsxr[PE7k8 #>%E+<>9G(a`٬ O~_p0l:wG*`L:lԀ<+%AH <9o>Eb1ϤJo:8Wxrg3 }cp6;d4?'\lGXo6@II)ֽu1d[yƣ 6 Dr웴NfxuzU(&xzowϿ/&ev#Tp~zXJ,)߇Z% uN(~p4¯7[x)=d4* uR_gm x=WXoWЦFh0trǧ;<)sN.A+瑩#m(Wmm m|a6a8W(hl6k| ,Vں+c^@Dx|W+\\`5r 65&ߓdb#Tt{ndv( Bnxw1(Kl[~ W'?WTծ{"l>ڮ`n_q9~&0.n/ovy]C]W02}d Lހ z$* _TaohIa865nzƋPDn7֫U{ޭqy{|apw_w!N'j2gDӮaWmF=?y&T"[A)redg)/QW;x?bY% e87_@;,0PXVк:LFy+%@X.!9a` Ym[E`Kq/PJeEY,K7(zQa^O1^z//\/:?up`sgzkXhl-/Q5촮QPڭD@$=usDSSF^^>~,pܛA}bWx#C[FV410Ȁcq?J ;ua~D}p'nKdMz^`}ƋW1_F6;;u>TghC0`eAe TO@=K hED0M'0X,縸ڶ]7oܺq=굩qtGJHoe_s!u92އi`+b5e\Sƃ[m]Am%# -!@!!@BALM ܢf%C%jh99V)Ej@+y/ (Y?׮l+#iGBF:tmEgNYf {C !Q[29P:2[ @[]zl+@ q;2ɣ]rۭޝֻ5ֻ5ƨ?ĹewSNQe;|( "RɆg@.H@UWX]̱nau mR ڭڭHACX0 )}Mׁ q#!T ނ|te^x_$˝:8Q[xF!7H9p p}@jvgyjt NN %:8^3ub~ G >A]Y8pǿk`W;@a  XG|1.N^C.p @ܗq? : y$adQNz9˸SbNkU3y|>oaPɪZGamUhgyw-'×:8zo2y@IQw ڃ28/+c|NGko\bBDIZաMǤ?@'@n6BP6a}g7#~ؗqxWCO'E=GµN-X/I{BR Ua\N& x N 7<w M@o%+b<#+gyDχv_ cҿ)}B0G~"8Cؾ']H?NBvc($1A_ =^ I*ͦpw%쒀m<yk1'.AGFxrCk  < C"I!Y pXL:8N=_-eD$U-KH"H'A4"2# gIeDtXF?Q/ L& x}ۆ$XI.w(_@> /G@q"7 #C};._ }LlC܆ݸ!k#==Isv"S@:xKHOIOܹ`<糧4'J8y|4,`! SBz: :)GɔA̿ ÆH2pa-qD[ ^q/B(ymwu}z:3IB@$ ^bY!B}$#C[2^r& ʿ(dY[&CeH:#~G(fb_}==Hd̏!{!]\;d_ICX|])C?.I@^HAnC yHyϊ!:&Ք !yJI.@* Cwj81ЁV)щd7`0Q${5? HA PspP= ` ̼h]w@ͽ ;w<PpH<ğBF@-$!uS?FoBHN09:;u&9{I^ @zRB'ht4ve\̀vZeGFNoفdP6R<|\$DObo@ u$ ?@[ )C۽rLSF|&L |6&/h:R |. 1 ~(aAn81"ƞ~Qx~$ΓBݨ 89|>g;*q ~@1>}8X]wv8F_fhpw|=N@H5e$۶!lH -% xso[%L\`v0RP??BI޷v j!Šd@Ja@,$ZOkكXGa5Q _Y~MscmB|NG=H@c@r;;uph `,}QO5b$m?l~D`XFC`r$aNX;;uph`? PPaQhv1:}n ޟ\ ݂l&Y=PyѵA#C[N!~6 $Gcd r18HpJZHwGmٸ1EdL^ & #lQO1iT^&֬g2Ko*8GwOhoO0Fa b}F7P 1-Pʗȃ %m4M%i9ӈ ‡==AQ+lNR0(>%6rWo:89W%jni%8`@Jq$ZQ,~D>H4}Ǡ_W /fg_:xQ9Bzo3xn_4O~~1u0$L.ĈGP" ](ppr]vRcMcXq`Kw$Y' d;~EY0 AS@6*F(PDeqPu=, M8& }C.ġہg:;u{h EJdɽDԛ~3zn.rdYmmѧaİeeFʢGa ㈀*zR>-m!yn8;"d 5p<=EYvphf0ii#Fܚu"r[R!HNDcj b8>:EGjx' FlMLI:;R.=cX!;] 2 o.@O I4~{xr)fc&ownLrT6̾Fqy2 jZNA`%ն"=uel7YOpvObܟW0tjoKt5 wHL}؋?1_qsu2~U&2ۧe3zeꑤ\-84UThlߤbڛaO0)c<_  ` ``6N~;ar|yW1_g;Ö 2oa._0Jse-F;j~P  (UgGG C5緟b= o֑F@Tq} LK zwC|V$Y!@*q:y_wèo>, ~9uowqsq$w0QklFxJ3oǷzSӍ)!.“ǭDtvzW}<~|~P{>>pA=#ow٠7t<-_?˟aS|z) zbD׻2!Q-D6y# "kz 7CQ}5Ϯ~uI !3G)ཱིW 9THbz D$'3"{>=ưb[c]C-uW0Σ2R1 (r$[]M bd;Hnjmdۉ>L65qEo_t: UϱZU߹?`fsެ;PxtSp>;=Msmn:/#o`[vh ܨ+P  og`gvD|m\" 应($9@v>d(:F+n8~wxvp`aom656ϯDe0 Wס\-GR>%& wabZH }RB`2$Џ T)z=:FX׸brr9A P!v̯Γw0N0OA 8, lvk `f%r@!*Z^f YΪ&7Fk65NzcU%0,Fp?f!5{au:Hz/&ӎ$^GBR|g}Ur?3v vXvQ[%X[&&D?^'=DQm>2e(1b}0={q u=_l4JϞ}M6/iqޢ60o[oUgp,sknCL)FzkP7 j-6 G{ (MPDȑז$#B 5"(B@SuW8i($qaa@Kt bV:x~'z!Ig w +H<xW2y@%Cx/­0Gd<|%vSbm\r9b>_*280`hhojL)lW(w%zGXnV tB؅#P@A;BѬ\;! y5AMr5 ("`" '?`h3kf ;=%pR`p#|$s{H@S7Ḙz%mY`ˇTgfե-†dF4_϶eU4^~~chT; x$xjUa[oQ=S: 2 zz (v! tVhgP@4[djP@<;1ȴ R/\JQX0A Տ$ @ÃݏH!,cx,Rn1(h?1IFlrl7otd,GG;4Cf]E L`#wWz(75&rA1tuބ@*,H ys{lI("p~ +PG?<@,%r/'Cvf} #W:$\+H9h%|2P2C ^3>-@n+mD8wo[CS}E/I|Ʋ݃mPJ3 g*po}L{Gc6aUN` a,pU  DMԀrp~ _.`x.CX9xmW.vf=|YU0rv;AL@cGiw51!Pŋ7޳93$TH8r NGёdGJҮDI\VϿ[c87yAT",#xq=* `T*cP+r! }ѵ)@P ԇ}X0w缁^_[onT(qVM%2ʁ5ecdy$8-`FTdחaY0cd4p8@Qknko:/ȇ(Ԧ .-nk &bh(VFp `B U@\` %;=F +;܍-{{NxtW`%6-wR (G^߃Z7\3B(B9pX(_OQ7l#[[j#VBIYFܵQB>j^2 H,0k,opv} rar=U.Kn+z80*(ypQЎ>9d]׵FZHrDџ"\>20H2<_<16(=.\>B֑֭x| "h$ VU9m!WBw[iP|ö!3Ih5#j/<.d@ Xָևڝ]îknk8)cx!QX^Fޢܕ#z(Uiףt'TAT63z*@e@j.)m( \^h̀)lM}7bt؁$93:'f9vl<@[k({6ZN}W+|baa: V0 )~=*޽HrJ(8QX@j!kS2;,[ !&3*lAQe $yj?(@ P>#$20`b"/6{rv2y"!QLGFh@^e$a<O!Cp_<$' c46BH3ݫ~c>Lb{sI&1{GjPx1}/K)jG/8Q Тk,0J/QbjZYdkO R0> DYyR剠\ĻÄڗK{Or5g5e%!qx ~dD'uЖYl 9WJbPcc07S92GS8dCN\&zßj̛ r# Tp¼ŨaZW}0@i{L6hDnH~2V snIJpUbgwI?-8PTo(S2e`@uDN ~I\_z$at"u<סbk@{F AoT S;oI;e]R? [lZoQbrҔP}E#^4کqτޓK'/^KP $`2O $|`j[B]9@\ 0Ϩ] \VN `y*iQ |6 HTNՃ} J-HeA࢓PbvԇB^Mp9e"0׷X bq1D@='~!g]\$7 k,Wu@>!#(I PCd{ru%C+N*)\z68TDMz`&e`{cw_9@ xv wL#.nAjv J"gms<+ic5AIe](\DE "8$0$4T5mI}@[f*;zg96B_f6b]ݛW1!ԗ(w/@_]22f_l Q8w3j0@=~oM8)-sϋ뼗B/B@azq*H=yp$!]](#a$#?B O;g+0e}?!?O2ȑ$\?Mr=h.ᗂ>G92G[Ŏv]aF Fj5/,$`C>bb-}z-}4A&ߩH˜N@Y|60@:kHTH )yY& ,@I*p̱?@zvDX`I!=wv7]/=jB5_> ɕYr{|؄2 Ր޻#dsB6$Ixo++=~gԙ!ܣ9B0&9&!#B8fi5BJק&~RЧV h]qH`_ODbm(+HKv_A 0 RңAi'p[_U XȎ :2T!g~@Cd`u> @>!1q? V iqUb1qM M2WyJP@$=)*r* ]9}A:y=sTbRL0QS>yXy]=x I>r]&/0 D௅'W/ʸ~1!ijRzw9{kzpStT1!@~:%!>G&:-{(p E-ڶ-5ঔ$ߔme%*S _65s^Λh][ daD}-<'SI?OQ>%]WroWǗ!8(ɟ$gb p 2ۦ9J!Po$PLWec P ܇<7%c9n*܇ܡm5̗~].65ʁI?yp8=IHj'p=~?C?k*6oBp4%є'L\?T m'BT}$JFDM@\Q~9?tSK9Hw$HAc{v,xq"{4,HuA4zdS QD Dyv$֐ (@O2vOfCBPutu[懺4پ۟g=j IB0oqknP<´pBXEpLo  Qft !pYB/ D盙8ML]X =8b7_R44x]_¼H9UPLx(,HB]P_$xwV>{Ҥ9dv)?^򧠗TKVl(`/BQ3OF؉b|4A-{|QX=7 ]0믍$~&ǝD/`wM/ S20ය´bV҃8Vsx`B"Pki <~ IDAT5B4*2 >筕4(C6/}a W-Ieh='ILwl|U}Qod>|Ea}΅$eNnoNs^g#oo1cX'>/n 6"KSݕh?OsDP׸0! G周H0l&~.UE-ʄybV  I cy|̹P૚PK|Hsr뙌cM? i#'}Z׸ԯq_c8aZ0K~*>s(SQƅu@{{ |{r$ e RBh&De2pPnF<ӹ% h X OQ$pzׁIxK@3?!+{`OՀ䠭@*hSMz"^'_(sL{G8< 3[ُ^! T)H{xK !`U =p}^ooA\-9"@G|s:mW9 ډ !3k("2ƿj'ĥ#["0_;:&L0d!˽DB<"T"?yI)ш2 S=#^H=A|2Su*8xr(| NDSc~aO e;! X%?<{6:39{\]BinB/4ޭ=3LNp29d8ug:үP}[psH[$ʓS $ȑAQ D4orD9 0VKeF+{Yטd0x)XmTJa6hze }&+ PaA'(Ys`=,)_(^R2Rٸ`0F`=_/DAzs egG8@D Ir @<V!΋$ Š'>@І+[(ezOcݐ "AcҗH0AHc~ o .o/ e-K,K*q||p[ `$^ 0PZ)uz @2إd> mxQ=vaSw'\8o"Htgvx|g8htY9Eѷ@W,q?܄HX`!prWN)y @&YdW qς$ A2{)ͣ[ܼ ̆3Nq4E@u7 &a À̼N,/NYBJAnTzqLi&Sq.ю`+S5c;A ƃ1^^j cw$ ,l|d}-”2Țɬ΄3J;xg SO_E]'SO #@=$yF po:" >偪xhM"&Ԑͦ7?&Rx7Gy]`c"%6X6?I @U%2 rS#ueIYnFO{c|{ Y_v!xyKN0l(rNEFx*uD=ɏR?V VR>M^X:d)+ r*~Y̿U_7^^zx`$d{~WLbxCJ7z˂QWp.W K hتVYKE!N=1q`={ h% `(G؞ _&%ė/}c\ 83`d`ѓML&"@xf2gw~Hh:C aB6ˀϔGEw@^`6xp=iۇ< 02S k\WS<?ƈކO^zyw"/pjh_&.HyZȀ,dv\ AYЋψ6XLFZ?N^}UMqzrr/dLوHrr{1yW̘JBg'so3c_&y{yyxye1[-D( Ww{マx,x.TZwkX-Z6wCmeRKUW'Z gOgFhJwJ2 @. IQC ;ë9 L#S(է\ҪY@xz`]Ķ=F`hx$%Q(vB,zTӷp:9?xYR`0/~x_eZ_Nj9_z~+.neٷӮ7APR"봵[NjҶ|<0z:9{d8EDSK<~)l~/2X9o_±>Ŧ`SVu3]29XWk,E EJo m\|ԓutܾ-CAxt9&w^d'O9~딱0 :>Cvzސr=#S%?'2@TDusJ`P/G.ׯjҾ.sG\_B~}7g^:nMr7m98yh\G="Ul8J+׫KfN'FG "|zqg_>²s>d<`0@,QVV ~ ^zY ZRǝhCR,bI>:F5֧ڒ@[Y6dDwh`p`^Qlw-iTG˸_$}:Eh>WC̆'x4~<<7 EE/]6܉oOn~e cE܆ۤ65j j&)'񰽫.>NO1Q%|jr_~?`{6pZ ޚmGSPaeX]zLVe -W e'FI%' 5]>>cd{vu+[)T^pN)~M65Erqo hz-^^I-=ð7ĺZk>i8'7Q񱎜I`D[J86켍{fs#`[bڟF~[p|''vV9Dm4zeOՋd c6=FYpu}b~ k\\wwp{s^RɛmC]͛X6$!8 _ IR7Cwix0B U`:X{؟Al&߄ H$w!v?p?H0zu#IoJW/s$6(?Ehy_\wygwf#~${6{ +8# ! ȫ>a"q6nO<gf:Z:YW."rI}AX\uTA3'_J7)dbGFÿh~Hd:O9=~ba09Z'1^ q;>-"w?`LzVl@Z71a@j/, Fv2 {Ǥ tW7?-Va^?_'Q3*-2(<)iP2:WUBfMdW+6&եꞀ7%e &2ja:Wŏ\;'̀1pl*mo/I$&#|J"*)43)-s76k,۶ux)zcXve|gko޿ڮHe ^_"Ncf-"471',eI5J|[_)Pio_|9gk |xWaZ NJzCj/u5!BQOBc(4bǛ1_]q* !W[oO?9#wĨJ/pP3Gp&Xs[U־GlQ;ћax (K eoH>VGS&).;k2G/+:)͔{X `!![6kM&JjF  c6yS(Fjv3@<$w/JC%L.]>+2o8_@DWdoڑ|O_ׄIPmy7C nen{\g_O3'l;]Wdh[r!b2q"z%xA)7 %{g2w׬kH#_XrmֿmO/ ;*E>DT 8^~wlDP TC7R$_z{e׷ߌ`P$D!2>-:/@97^O$54} z3et[Q%Mۋ0 <֘( 1:uE'xj H]ހͺ~Н^@U7X\Appav8À$IҀP6 @rwwT/ Bx2!Jc&޸ڎppY$"JB"SMDӲefKbз借S#Ev6"`⍙o pp008aligEZ[`@-@drvٵH) eDGx"Ai¤ `p00$!{:݇j_= 7 jqU:eBPދB`Hڿ\ppp(X42`ff`?6Vf@Wih-}u3'-g0,\׋a@BX_O6iy_ܮӚw4E#rNF>* HQ {X}}[1 !E(H0sk褱__yubUb^EzN'CC'@eK.ou _߯}r w 'C$Mڠ2S0ڡ:Ys]ԯ}{wsV{^YV|MoquS$^$`%hk 8;00*s,؟˞ӶX=bK@$LOHM2}npњPBCi{b'C#'y!vok u+ mj8&Jz#Co2#h\YPY#xP$ࡐ} Bg ‚_,qו'CCo%öVGwթGwIt(ݓàp04,n$|$$IK-~St›"{D IDAT.pp9ak0h"b=ۈmm _qN9 `hغ-k&l.|Sޮ~S<PTz"K!h7iI@D̗Qb |08f@M@Vز{`1T)0 ~sP N97` =D+ߟ幕_u\`h(Cr"M۲ ulwW=a$l'nͮ7zf=T*配FvW3]Y֤#v(;Ii`8!804tot4P7^~0ppO_m#pC? Rmdw? S܁8=5ý[?@IB Q0804l)&vԳր P1KPГwt8NFz`}=7AJY)kӛduRmD`p0.<3*PqʲK)[:nUՏ:  KO@):Mۛ@ZnBnBCA`hdW"-V:>rZM~ZrEàp04LDt:F\}y}IR 1@jO'~ `p00V߃ppp ۄObpOZ`;i/6)|APh϶}ZHo`/_op9 а{4yրbYwgmUIPAMpNI}<[`;V!loʄkщ_>XU88de֝0okRyr煅o C)DaP88r6!Y'o X.y__8Ni[~趹[>ML7ճWY|P#$M؈EYWI. P+/bڗ(_<88l/t!yN),V^_nFrWWu, а06# )/Cאm"r -6i_-kr{>w?=W$oAhRc{X!Ce詶 4 'B[`Wm^9Z˻~BQ'/K}dim" p04HI.{Z|zXes\DA`hp;BxjPA:MeieIohZM\Oa61FBihBo jн d$<{'08w2\.fOpdty^W*h%>Xiv.Us)Rxt5apppxވ|r`4edUimB(ckLfE`Uy^YV_yG@]VqM0|\. 0 yV]iAz/*8О,l* Eu;H)${-#6e|'p!wgʥaQw%L5Mi>A*`dy}hγGϙ}{ !`YUFZݾ@-IIh (r]*(A1/nLn'C%QϾ@4"})IsC H#%CyaBP&.C@ o=}'w3O!$ A@DODA@* ,^"6)B, E&s/g@?) gDIX4} žB{+|cшw7!H']zաM@NpYm9[rFڂy=Q4[lCVn걦ޔ>c:_&aLN'@׿}GK۠&E]8LӶۏf2=OhqwxrO9Y2= ૏ʳ\V\G`hHR|_;2_̉?!Z]rzf:1rN? ðzR+UG!hFb^S^c/,`dtRtDJS1xm%x7|GO'ի~}!N~x o=yl>g>Iqq񆋋7\os9V׫5|`DA'~ϣIIrYe@фOsɬzj_ B./g?ꌧ'oq/KiYGzXpҾVO/LLS1Br2}n;9NaŷŸ 2!q _L6IENDB`./qwbfsmanager-1.2.1-src/qwbfs/resources/256/mac.png0000644000175000017520000010522411534466576021461 0ustar pasnoxpasnoxPNG  IHDR\rfgAMA7tEXtSoftwareAdobe ImageReadyqe<&IDATx ^u&v @c E4wQ%Ȓee;vHg˞q&Jj&I%Ie*,3S5xXyn+]w|^`s}yLy=s=ln9wuql+>>Sy֏A#κ)ʅ/? d7sf ftEaŕ-N,]swАZٚ]TDѻ_ϟoʿ3ݚVZ _p$6aqRO|sF2{|.\[v] GD$^?τ}-j2ؽ{;]\ TwزM߳ kCmhFs i{N`xaWR:a1s$mq!|#%Lj b7T/J&F [0A=Cp߇ޙw~sP,_ {T$ HyϋŤ R89#`. ȦG%th3PF[{? O͏LG uMpT>޸]k/{vYۼl5eݪ}O~Bv`ϹcQݾ@F ^2tDk9񗰆 Vny xd]`؇sKFƾN`Jj#c/w7on0]F-bPoE|yHrEQXO!TuG g\rݼ oXm:IuGP)#=5ޯ\'^NgN,ͳƚ.jQӻ>b}=H`×}'_O6vaJ  A {R6r"qE 2'cvbOAӇ`~_1 al џ[ĸ06tš#t-Qwc1`ha-ݭ/ Uvl4pMQyg+|4PTMuEmT; }lK2z(aЉP~S䍾{}f쨍<< d+0'wl5ygPh$H;3=7 p ,_6]o!Jc΀Yv[/I\.<,/eC I9s`сr_?y<6ks ջ{|*M6 6%pC'C8[Ѯrzߵ.߾%Vm( Umb!wv$>_M$ۍp_祔AzsxMۇޙ3O|5w~W}jwZ #.1%ps>u`e ݏ׻G\W9 @v׿_֭hCuލ`y1k)b7oƛ~>ɺ!jWgy0wt//?| lذ1cEo^JJ%E"'fOÓ#&pܘ:`c/y:ز~LNIiV&QIz?lg ~@Ps"UکS ߃>`i׮'a*á*ūM hy֨B[[?FrlX; o=`URbSzn"c"/?ԙy u--.2' 0Q]1-0RI|cy4ܣbe~v5 ۿZ'&&_'&.4^J5H ,&9Qo?PuԷ !b1TS#{v?&̨R F%.s G;@há_lJm!eKs xg{Ώ| VXv@EwRݡPeR?P1o#oz`]5U3~V hoA.0G ̕RQ@L-YE4-F%*p{}w=te]~>lڼE˃"(tҎuDv!"V }yخ D_o-y0jn7ْ1ڰIE=>bk ExZ:`^r@3ǎÃ:ƫ˯ɩ/Á '@]-c䐪PKFmAD{5RTUi4ES.,Ɩ ( >Xش UfQ(Ȣ R_~S/8$}BVEݺכw} vc?fZyqKT"2 A',b;7@-x@{l]p!UvW\E߸pl i3D.߲-JA.vCLo򓳥cghbʄ = F{+Em4lkQQ0ZiIGs$WDUT^'C]E$jofbו䎨~L9v+S89S{dsQ{}'?uZ4 -0(\؝"[Op >A۲h}hčQ[Ljxc*2f#|ޏ 0k( ";% dP SI=G_;-[/j)tu1TMD0 sZ~;aWSKhxr) qm>{h,a$H͑8sû߄oştn+QX2uG]zKڥԚ1HUʁGkLU=f?:N:g 杢&)0H 築 le@3($ו{-FnPRϳڈo9 _߅cGw˖-K 6n&mFN1 nYl7oegL,u's= }q4 V+q#< L׶G;i̠؈9ƌw۩(qt9fLJh쎟Z\#;o|㫝?'ʼꫯeSS}ɋxпwI*%J 닎P/ ='K] Pٖ1TLe9| 8a"OJ$ PeϢ bgxon8ҟ (_<4 'J<#pߟ8~~? .ظ1A5(CvtsʵKH(HsQBJ"FqLaCZJ4i؁KBQ@EJ PވQRr̚.zU}G& eVBP"%hb2%J<>@ݷoEO{~.*,w&w~ ?LGemKM}(HS1)=AEJ(ij G~pre_GԻ~Q 09_8PbH>* x6 `bOqF(<2Vy&Y8Sgpcjjlذ^ycw)puA]\I\E9K3į),99 l11DKٓr|cu$rb>R޸9mqﳇN!nR\AilîN,EgI@< fX]r^$IM$ϤBMJ7; j_~@>Khg:fffPGߚk~[)R}fGVz^{P=S;(cڪԒ-R& `Xk'KWL&#FwgXIt/MD f82o?'|s/-DH:y^&K$$P(,/.6*&Uhz7rjpKGvD./̓Ht_ #WeƾqLM݀a?0S@HAI͞<O>r vW~֭]')_Ɍ#_uN1j$S#)r)5D1DT":dM-, + . 7L|$"ܖx15^lm,x$ / $ӡgUk`_6>:F ҽnMR5R7l2q$c u I;)] {MNv K$!DxOqx 5ل`vtkj $ i)~$ZKX2ӧ^}g?/չnb}#… J*M:8=i!RBKyXw`@C j##2g9Plp@hNtJ )*VPjkP}CZ42?iڌ؄C_fLرg|$ )\9`܀8o)"$犖u:x#Iq8=@!T!?p1NOC[ ʀ9Mv^f 86"`VV/-Tɖ1@^qi?dH $=%"`@,'(/mOnm?'gsjٔ kb"Q›*V*4r_XZDQ!|E 9"Fօkmv^. ?ze`FrSs>yD).33K˜FI9LDJ"0IqAx#?S?7ofru&V!˳ꐻ&H0WqPt]DH6CD&$X.-^V .)B(QRPۆr:p R &P.N9 *0 D`\0)UH,O檮y/v1|Ώtjj<*CLm}RC(d:]~ik Hl u[Qi "YCkoN@\ uАX]_E, T 6h(bXy¶I0ǦG a7 tL3-^PLCX K<$ l(K7F{Q"I>g O\t?Z LR9a/p2z3ʝW0ucT.2qP8p}QM?[Rc&$8Шy{-˅q^#Q+ {YO B}!*RV6y6wZR.6%_W-S+6SgF=z'#bP Íۉ }菩> 9Y!*s3IQsYPψT:>s^{8N ۶]߁BėNNRc_ o2?Ot ]_oOx,{H5jjdA_8aP,#  !s{$w?TLE.CebI'lA)jb߾O:яOºݩ}lEL YJ *{\f. >Q>z瓂G ҟJ3t4Н`SdНJ{}u='⎨wxLgGi"PCHwEiJ /=xY5\u͵lTShn&Ƶ8ۼ d_W` 7je;1.وグ0t5)R iJ8Fh- *)Ťv0/@"x `ŻyA%ǡEtS'ᅧ'3q&5c2#cgK}ZQ.cHNd&ʪICӁ\"@1,G*H 6;K6AQ LkuT+ e@icq1 6ƋNհ vP9GjAg&Y>Cu N" `FZ+fQ')d$_ڒtV|/!M+kFSSXM:rWA";8!Y=0Iy0xD" "fg,6g=1!5(wc*GLk/<\Íp֭0QM<$+)u&騣k# -`ۧ<$uQP1Sa 9;|*q\)MzlS o\A="EXl&:l9>*9ԕ&RB:S?g~֯_YU_O! uN!9,Fqdd5R|X\ }Z9VxJ t_[XS`xE4_! ;-?Vqm/ю,Ր>PK0ZO@ۙ\P?_*n-_i_TSBx)rqP$Ou.N/xEuo5# $WPPD&/7FN(jʉAŞGriG@J#O\8[>iui*uv=Ɗ1EfJg`"9)H82prGjcT955ð_k-"3{m@1wr'7; ^su8l%3aNOy 1mB v<'K9݁I>#pq">GH؁hoS3u 9Y { =#I}MB/UKŲ.7TEL" <.?|[q睰z&/R$ C4⏔@X<ܤ6]_uBp)H|UR 01SŤkuv. v4pn`@67x@,: Y4*JP5vZQ*AҪOdtj<~VSn6Xa7NVRU} (-ݱ5 -NsȪ4CZV<,g buQ F"y"Sx@Й0.%H_`F\D>Ƃ(M+MQ齫Ɵ /qR`s }. I~.) _lIR쨵 -~݇!(ui<\3P+[%UpY*LKXI0 , (+A( y8Jhk 6%kXLE-8b$&j*1֫~]5NIsZƯsy@'ن '/'޶ (r8NMoU|J d$zu8RygiA *|p!FvH DcP׎ k ݦĴ QcFRxb>PGUUk,\U_0`DkfrM8D $J}/`<K}l/Z5,5GZ@T6c5q6鵳^OO仿ۍ.\)s/E$I(\b?J?iw6eڃ, zg\?T_/}NՙywR9Y<zKX ǎ[:椙N3hP"HD#5  ќ*!,b&n7k , HnGFGLC=YKЪ I "h !0)!k?# Rҕ 4;s ^(a\T? C| /q D4+$I #9ؐcH)?$'%E(@P)0S1!1F"o /ӢT%܎/wz8!*# /HnaR9<+ ppI6I]IK7ߘ(n7^Qj胕݄gԭ VPWd}@@X+~3Yp +Tr^\̵F9 QB.>p?0 ? =$+ gIGAz`y 1ϳ P>Ebl)|c[(׫Gyoor իW?d)_ r(ļͲ+2U&- Kp",ԧ|C}{ pԟ;)"V +d2܀DWQi>GUW ?j..ꜙʬ@p7"E"_S(IL )&r\QdJe7<,;Tg+AS|T0tɏkJ1CJo D،~D}?zO  ӳ,(a `\BzJ,PKAk1POp[\9b69T) dBPIid̞Wn]1= l2҉/t's1͐Kyڔ0u}}q!!6X/ ~%?O<4$|beBd43 px݀e%5)fqV_G2S4'U2 3uHX  HκD/DXU \7H:M"@1 Q䍬3DfF%?'k-4P,Gҋ#aQP\Y y=_CA&.@g[]n^Pv;/FSs_u%6C SPb!5Ixㅧ;6o;xݟ.Xt.gYh3=- `jG[IH I`bOkXTG7N uY @cR8ƜuH&L"S w/a q?қNG0\]/ v!&}%8Q$V&F& (@9(:r l )Б@Oc寅*tKk$.E!CjWRߟ*StW.t,=I@Hjr~=H A NtYLY ')Bv$@yRW"(EnqqHi&) $T=B L1|n=%"VN.rB啥 \8! >J'p ft[: c {&#) h`K /6Yuvgbyؿ4zd B\Hqv)xkX]8DKG`_M"'b%ɮ;47"\ԓE UZO''⧇H`)xj*pX12e--en+MZJ N})f)/DE*r@]L nA%Em4!nEbvrPBBB Y~f!g{X#dI:(S֋@'''Zx\J[tK6eVp|0HScBK#a.*I8T cJʄR Z95;`9wU&<__r3G] ay=X* dϞVR!1cTAZ Ņ)R f_QOϞovSZfmKaz'(XM%US17d%N~Ƹi# [w26/=ldhA}HR. .bv ,` UD/'hMt)>JRB^2Tݝ:yv{qz`C1j3Lt&BsctΏBochLjyܥ.NZ0@)QW1I@.0\BmVS^Jlw'_7l'VpIAx3)q|qG^Uj3eWMrRFyc;S]'ov1,BHvɸ11J]_`&A:d~ R$x.(R<"ЏM)B&c KĴZGR(1(Cz^ 0SˆG ('u;6db(o/9&jГعsGdb䑲EȻS\A/P̎ PL*!s˟%cE"$TI:cp r@YIHI@ӌrbB=N!j=ªe*6 [ ޏs!Brf4~Nu0U9X"S_=Egⅉ]!@ix{SBu}nd`>)*FfZ.Q d\LJ]3V2T0T zS-ЌULxzD vOj7OF5v_k6UIRl z3a~j34)0SsD 4 W\lI "b$H-4H#ExsJ~jF݉1E!'bd`U0s[E.ee #]j rnJs2q!)d_w~Cj "4NǵK0]pong~Q䎄(&9x<:&t!w`NJ-s ai҅HՆolր@N$z1(ëG%~JץEI F2\sE1BiDB#[T qGL "Pdg;svT^|EcQtۦp?zЈl%_ct~$s%+H02D!5v%+bzh BXǚpV8%,[^k.*?Z\soXqP%A;)0 %@D G& ]y P$@)+Wq ~sU)Cuf aK-)-N(rg30E2gԲEN*~Fi,9E0E1aR<@'V:r-؅sxN L6ʣ[/Wasg:7U`ǎ}{i$2r'Ekza*Vi val|TVJXU&KrP\P&A?'ioV:fB^0νn걐·0(9!JCΨsd=8E"s8ur߻g_Z-̩QGӦjS/'/з4/| pݟ) Yez kb@L;JƟ=~.GKbe)ch*AR%4.%[DX+Ƅ94|Ra@ӳ';]o}MkaӐN;N;uzs $#{d 2X=e+.Hb g8}d|PjPɍ7 ߁3?:AIri_BU|(//N?]v%P ߈|z?Sjm5i:n|$a @Ƕ.Aa euqqǧo;Kzp$غu+lڴǻ/-dǟnڰ7|8.WS[b64)(y.B(S(R#ɊȿV!BSbxռkִE~$H '^"a]S,VsN0j@?˛FN4jX="ĮKP}Y >=G}@dx.%GQyAH@,e&x"5Jpret_4-K:Ơ6ŻJ(֒]*K ɦ S dP+h" |8ݽ&LjVFL,#ß/yv`ȡex7l4JfIg&S27 J,⌣aۢG$+Xœ&o\PxF"ڝ؝<`z:Z"l@Gj]Y$ѥӬعsYZN?hyS)u(SMm^7{dN^DDߢ>y-ö8oS!N|7'#7uwl4mKBW`3m}zv1ơB,A#_~A>(Vb7x}6χ/;wN4})*D9".Rhh,ޙ adsxFUy nE $8ĘDskӘID"}\x=jCdÙ$aʕ*95{!],2za%q?HDYfm7v7An04;iX:sĉ(uzιW]`y .DO~X=T$h6l+`.BxKx"`8:L#R,QR*j ̱SrcЯC ^ հ`1Es)j= `}T;i6`4>Lra+**ص|T5WG{\*9" {gF/O"KNIB~k_/?8vυcH5DUL$[ZU7!i|:Bqvv_Ϝ:o< xiTbuis00;p$@ASe)J9Cs0L(nG$*g^K+H;w>6ڱjQN h\PrJMҸ ]5Kma Zr݇4 Ȧ%C3T` c8l^G`!Gӹ1FH8C8d_4"/iFCAk÷?'UaZ'v\ Y)І3m?&$ B KJ"!"ӵHf$`dO?ݕR L|@6cKD.p;[^+WqpZcGd^?%j(јR呆9}?-4iBoa& 9lw/N4`c9ea8qcźACU,O ;(-*W̌67~5QBI^ >S4_*Z%jbMn@zQdvy㧤QSb%>RQGI /KT.k%T#ӀfE [w/b sEwƚcvkrvw_4dfh# m:#74#61K4aX}IFԒ]O,2 j79 3`e¹30s`wrWr}debDf2cźF)$KY&=h$/pH~~Z(rʀ/8bU B{s؎MݰAU@j<@@O37`ۏl4MU5@d3o,`9(%ݟd?>g=}o(hX؝ȊQ"ޑ RSp?+l[/)DLkhfE:e?E((QB.)ȇ{K:$'1ᅥ#~<,ڊ TBc706p~r 7< dS[@R [H!?)]eQR?{߀"6}xQXsO©c:j߼i3 v~_9G#qJ*סҼyω"Ze Ϡq1YdΘmQ(XI {0{v湒B2~k5 er2n夆]-#j )'%?>7?e>52uƸÔ֥n:X>!q1:8Dl#uۏR(BAS M%&\EI Ȥ`-^98UPTD qyoy;#d8wy!Y\.!*/\Cl*RXKMJхCр:EY8i d>ZZBʰ!eĶ-_VdP;<^^qM|pk9aeuG=uٟt+"J'N!⑂֦eY΂-DT`VMP=59mj=UUXn[0:o<_/MۯhBQ 80Kc~TAs~OQ םq;]*3nNđxϜou^m-_[Q@:XgN%1Je_zUW_-VI9!%DIt) _y(ГY}n0 3z/# 2z.jW7Jy7ܹˮo$aʕB4ci;螃?_ G   Ŝ6l8jFC+/˗OI!W`U[uіN =o/q[+xs >K?kM0h]IͦH6CBDDIM/$F1o A 0ڄFŸ,oapړ * ;o\~=/`?{mP0JԻa0Ivl8jc h#9@&y?+CNݕ/޾&vbpwώe㹻7x{K&֛>L-+kV#QIQUݟco'0hZsn1L.U9gN O #gWqO| \pol0 - -iiJZʐ$!㌛0,Wg0ŢN+>28ucԔXa"h" pZzw={^xoV`E厝TFh@o`GĐ/~ bI^kюW;=.4.W'ho\{^z,O* FT—2U 蒟AW bo8Q_GDƇU pNkZcUuԕvۥ U;eߪ#ނ/ƯÚ5k?cl B#iԐ I`OÀCsԻF` =* +XtLӳ% T''Jڳ>ɣo Y;n\|Mrf#is}ܩYc>\DDo s,w ]{E&Tzgn:`Y2@~GcLO<}:/S/F |?!gM*ԭݼR@HT+xsB"Mo[/3;yN2Owm=h2D{9׾ o=Jࢊ+o7}#`u:(4xڋ,!ae;|_-Ol@  KrT`Sz\HwƖ4QQ5wy6Gy ^}kÆ kc=e<#H}L`͒2PQ@-!lϧm oHW!~J:5s*=3/'ҷ|英San#_sKv47sB!T$ AOFbyloWϧp񵷕)‡aU7W|V^qqR꼉)A$͗ 9r~cx;0O}J߇cBס٣KȤSC,)O}u^X9rֱjr6nwq  ?d La7÷EFZ-X`qXn\FLYh T _ʷ vv<##纭…n*Gp 5h[Z7TG(&_<tȯ~Pݼ՗ =0w$e?H pD8p]3@c޳{?U~7^}\w ß|'~WFR.̊$QY' e>J4KF@5Ps?g536YQBv^+(`1VJܰn_-W=c>kos|lJeuyuaۮA,^4L@}#ˈF'//Bbm9]+#vv2cǎrMy瞃wyqŗ|>X3@n>-$ڃ 9@R1a{;fXZEZ|dS\XS]}] ۮ^> wG+a݅N`Żk/7n+(%ҋ~A gV2U C,7e?L`(M@hƕϝ> e01u߅Pȅ Wg=NϿJiJm.?33Xn=|{,|OòeSyWlK-wyf(z 7%kZfXEà+?eavX A,,Avp)IrLNew|\[ ?qVֳ}99^}>cl|VB%T_W 6nU.k75`01ʇvz|_ъySߧ ƇsMpØu(q$hƀһcGCkt~}5+oϻK ˝wީ9sQq>Oջ~unذ^ yZ,zWBĤ'"#<3v`dj(*/\ckʶ {n^괃A<Va% 4HSF] /lzꮟm7|o& sGU:;kɏe+זm* azXn3,_{A&We0lEo`ͯ F{@ ~nZ}T 'TӊpUǏ5x, 2}¾r߳]ؿolv:z{g|Hos 4HKrTa}@W +\ۅs:N =K w pӇSh x/W-x癇V}Ty] ZaVU09JG09we`~tcsZdyO؄h+S9YdYp5_z&0?)̖;\yM({0{x/̝JU[Gp{=GK#7شy ֻ> rV_Nԧro$_ FPzv`Ќw0^iiM~T-jf@aP4ʽ~}`,` ZQk*ܴM2r?ra3_o>Yͮ0~E%M.yZ_+=VyMj~>6Q7aՎa|vW,_/dSz7$kmW;2j= l?8_nrp֖9í0D.BgK~$ПW3-%I|'wX*5?k-յzuߑ{:e %u-#X X0Yð?V:G`KOupSfvfg`t,[~[o'iKTGbl%(.Kn"9qM 3?/U3PQ~\|)8WVܳLhxW4\$DPO`,^`^` MW[sGtþJp}t|p|ͷZMmXy?$1RVTi۰T) PPIn/ǙvwoZp?Os-1f;a `ްvpyyxkOþ T"Teq~eÇnf#Ju _rN}_~ z8@?'Y"XwSg+̸1buEYA7U>]I!Ϭ#@|Alo_z-\ɟ38ڳ*;8acЯ/ bUvb#t32_BC^uύoH<ᇋߐn_*@Ǡk`a| p jO^SXa.C h T0:F:2hAu^qO=sRȻѽ陣#[cڵp;jʫ+,^^C3Bv Q)hL?;r+=SaP~MuE4<Wӏp)wm˲*GJ%@UK?l;h%n錟ĢnGS`+Y^M~܈Z8i ])>0ipWsUυH S"7RSJ68b&ذ 6UF_ҫ9}f/WgGK67J*}=X|5Ldcy^qccnyX_NDd wV ]ir|kbh~3rp {8,.(T<Ţ ?6w*Q?\ڨ@*"K]o6tS~1" ̯AQ ~S6D :7DԵ)00eBZkVۮ̝ TΠ:+GPU͙:ӳ5W~*̱TGEj^VZUaհv:kKXkz# ū!͝3|Q|)iͱ{ҏ 8G`rY VZzvׯBӳl@h?Ɵ`Wկ\Ms}d!aki_r8(1vlbVek/ asAqNܙ88GQ9QYJ;W~rLd436Q3NkJqux{+[o/_^7֬^r]]6& =~\, FF G7I㗠 sU ,4_P`Q؞(T:N&̅ndx-ĵc3ϥ.,RH[6B7c)8 UA֯QR1")w(&`|jZ  r\2&B8i~;U;5t7 ieEej'x#e99vkC\e;vUVO7!pI` )>p)?' ]_BzL?q7}Fp h&HϮpQJ_LA*NKLQՆ~~icY,_J w\uCE*h4\Lt9\w"N6&FD?Up1mYUH L<# 57GRՉ2 `\3pR3lWl2P4\;(}"DɱGh KM;g:bd(G XʂNU_H v4vbÇS:_H ؘѨNOƱKСp|&k}G%br"wq/Y1e_w{ICK 8,(X)vPЪG Yq"lS;b1ecwm9h,fB7ڑ* cgQp\SDטRR fC؎Õݤa |N9 Se  cJS(`E| - P?ǻs @>;m>DsNϥK6(_ "vhw}c8xMgi>1It DD?: QK$hAAщ]wp565(H( 3Q2rzP0`$ A}O̡i삫d祱oONZ&ΝNCݖf6)H=O)Xӻ~2fG”% \O@;8v` ㌺ lK7;<&'OrӪĠ: ZRDH$!Ҝ㎁bgt;~br@ݙUG%ui?R Sa΀X؟4x?OøC4һb؈p#~ ~'ߥ".us4^NiKECM8  ~ )hQ &ۄ#Q O a)}C`mag%0a@H v9Y/<^.'+ ? $rgFs甛yw}~?7 Zi5z!X(lcOlpVl~0XԢ]G` (g`#`T \G`lуPO{O djw@d>.$lb1G5+Ps͟q}< I W :B~J;fbaVd]ͳ#'8@m4ుvw$\a16M)t h ?Tuwz1Y@>ql a,N95aDX B)u6Ųcǎ©;|gJ%,J!Ff>P?2||קL;c$f3; V'`Af:\__t`Əid\4%KGal Q4_@X(@5 FPMbLUGт?v}ÑJ;ꦎMw@kοL81Jb)ŐYe_7 q6dq1Ydw`RY'U p3lgZz츎s$(R"dѤ-%E c'6Ixa@ Y$+YgdmJ6yy!A A"Y8OYd[DES$gHS}_9ݷ{fȫZC }ꫪv[, -G+ G`XO@;Pfͼ4,5 i1Ï"Mi کSc߮Ӏ5Z^^ny$qf@sVlU=~/ B#?V"2Qןuޠ:5YIm/8v4wAx`.QoZƹ@?)-g|44Yymz7/]@w!_e!$vm$o%8UVk2: ?ᄄ0~f3H@ I}-Or&n{hAUj|{M poE+Mj!d@cVx sb sTJP|?C~=+65Ф3 Nz|Vcjd Ө?>3 214by=\e&-nJgN>(Or!?',\:Lӵa͚`&qB!ygB# VԽr/Bn|Zzq3~G60gW4qa?߶[@&Xt#5yFv@ DOf,R C'T +M_# ?DgT{i1ڸvnX9g_{ UFvE|K:3^T6#bز+:{n\VFh!gCށH@fAm?jПo|nc @p(G *)?T&IW7gEIhnG ?Ss? 7}D'F=!o}ܦ`ѳ]V"H`l5CXrh?D'~ ?9*WN\tH@H 8A=iA.Nm.\@9 hS?hsLRT_t.NhHƇF=OzB.|-v=2m91ItE&黌~3NN*}#@ $oEk efe dB01w8k74I?bB $@[x;UhR̙FDu>:/+ HF}疏ڂy:lo{n߾VBk =WmP+qJ(j BP9~)3QK|a!"9%${$`ГW혯E@R,`~ q#}3!7y6S BQ5UyinB?>ը g@) 5_fyd$^F^ցY_ަl`KUH_@e*ǜt4sp?|?}`ւX8% 2`P ~ xqoq(Ey诿PNq'J}|" 6.աEcʌc=#g0QF@_ CE_g&tt׿*O>O3nryЀ<$H{0L`~Tߓ};l `|тʀ։FԎLT醔 Li!{hx7ڠ"!֨`X|rCY "[|偢 YD+[U1j5|FE_\Q?A?&o|Us-/1^VcLR*TUqfsc ;꣦?!V@,f ʱQVAZ;[l&%@408n@dl?uH st(*"H͠9sEghgpjOV)SrT 1| %?E{=vCF='o{nߺCA"n:8JNkuCt8"̢h;~_A~9(&s-Kg*1 AI hD<܀ͮfGGDr؟v&P~RNƖVVFd!UX3u=hH.<.'fn+4ݘdRIIV/8*ղ]=Ib3|ƈOPMAoUB 7^ M \#H8 _bQNcS|@y'+M!YBJ"tqM&9~bIH4YXLh]_oO?CKKߤ[ =,mĠO _12?$SΪ(pǍ!@38Sc4:-qr!Bc7ƈrMt YoH @8C`)kiK wE}Fn).Q`Мӧ>ڷb1=q95$bz qbGm J|B"ߟIk8Avzӹ2GRa ׺.->?`)p$LKd@˞YMb(*c?;[MXG}b=%'O {up9 u}ħ4sk`"ٶ` o a[B/-k堾މ\30%,h 'DhJ/#QuHtVo83)EvDBJ Vb-'Q+OҀ1(\tq4NUo"Y_g41SCo)5q%T0߷~QˀL疀ÌK 4i¥rهԀ@,X㩜'}%U9+J 8T0:=r ~\8&+dVO߸5yyIi%R`P_r0sw.##1ڣgR>O $vDtIG k!ŷJް}J`рN :A0TdPaQPg*7`x"NIA*ҫ$ڃ̆цk8;4# _ʭJ85C5tdmXQDžYQ~{~*y>il}w{"%Ph@D>PPU* z d P pg@)h@$!("}>'` >j pf^|}p$MI- ے%ҕ c!7+q3 ˁALA8q YJ{V]"~'1l̗%H x0ڭ=ݎ@b,r4 :iSXl? Ȳs{ u~LH!/tEzVӎ_TBCd鸺Gd0f ?s}<^(N3@р#l<~w#Hw8cYDu]9J8=< Fut~7E}ј4.Sr@s^˴\מm|:3^\3^R;>Q 9 ?<8kP">2 E5۽>ן}m~lb/L#pEV#ϏE|=o7xH]E?gjF>hO߶f̡n>y9y:=zl/NȰnTsYpǯ]FbcD!B78' MK zo1j@(Q"MVC?ҴWnr9ŘI*hru㝆 /79pzT_@3o~x4--ʀ`T `fi.3Ɗx$F~R2QMDeSUxxFӁn@!;}`Ddg"/0@Dt|aA@Ά&6D-i 4|L'Jf8o~^0Jnja*ŪݍAw}Wo~'P"Z7X*;;\>P0|߼㏹&B0HiA[-NGВj"A@ u }?y&r@i1o#0WQƴovƠpƍGa5{_Yl EeKŠVRS |<܇\;ހZYK^79{g>}W_xf[9u[/:Z  t=]EAш oRI2 +jSS4XW T9˟ ?k7~^?c14G}@C6㿣% Jd[U@"V~+((B*, K;%ew.AsGPʘs'?ΉGN&lcL2q@g3U:91ʼD7ɿSlNY"`sN"'tIF6ab&S6^rq_ׯTCM_csN/dcU5!i$bQH%c6mCbɊ-+ 7/^/_83%~O۝Utcٗ݁:x+49p|{rI;>^B}}IGwxzrWNdjYy/-<̓\}m}}b^_6ybU@^}8}\)787\DS~̥-rNRK?S_=Z_Q_ÍPG2 Z_<}Ѥiƈ_CP>S_|WPO<[_?^_+})P_GV_G+}U}BPή?ןPƾs~ZRn}}Ύ|WU28rv୐?U_P>^|{.(8rviE_F)*%# t~)8rvW_+#+uYdӸ)ǩ!_P_KP>#x浿S_7{ } ?|Sr\gpB7jԡ<;S΃<.3YgU_]ԟ[V@A?|y__Ci QX؝aO:u7=8<2v*@9-r`OOueIENDB`./qwbfsmanager-1.2.1-src/qwbfs/resources/256/format.png0000644000175000017520000006000611404701453022165 0ustar pasnoxpasnoxPNG  IHDR\rf IDATxٓdY';w--ȵ]J-РJٴ0T4ÛoxI4ԨĨHBR-RUnKDfdxUE~w%Rȑc< Bz^wcsoPJ/FZNqݍ(߼~;㓅$yG`ssNUJ)\!4X}[q!kO^?l<6<8>qֵ(tE07;qmض ۶B~ws\G[U/,!8GQ un~ DǏbDQ0 FѫQݍ軟o~0mXZwҥwy/q\mw֣[lǁyjh;T(ƾ&0&:,1sa0EѫQL_?s)ݻ~J>y]/_Z/(fvD(u]ku4 1 Ţ' tE1(BZqQ"x᳿#D?tpk:\5DZAAx…]GކGͭQR^CmmK`Y%[:&:ʕ2fUض@Vq0nn˲Sv B( ?8KKK2Xy p\EsAjuaJ)X`E\pݎ;}`sk Fv HA#"XJ)|GӁe۸t",ض G1 CmDsQhjacs `k{"?8ݥ{_!K @Pm Pah #8.Xt/x^xA҃  ͭ=eYA@R8?tudtP*EA)!hQ!bmonlq]lnl}(I.Sc;,+eR턈fQ ʴzz(bP+W^{yRG7߼l[bG߻OX(`zz becg{cfu11lۖyqBPT059j9LMM@VT˲ˇuOnܼy֭_% (^DR;m$-BF̌)֘R4a]IC 7( (:xQNNZA\,WEQcjrRf|G"bmKw:Lp=OPo4pEN!b8Fo"-buBElB{N VE:Kڭ6He<&˄h8y߳~i9>Bò,DQJ)(vvv01Q(8U,FFg (BEh(J8s4"mO,?!Z6"tp)]'JAL)Fz v ~|"se@"ozw J z֧`aeRE<ʯ5F\0uъ[z_F|LT*((.,oKmUqDeQLd PPʔzY»rEKEtaĪ - mXqn޺jqX ˎA?K4B- qLyoKAi #-X<95R$tz VvJHcneg UsGH jْ1lz͟NGOܸyjRC:F d(̜|WSmtb±1~kJ)<¨NOhTmYJ/_k5b5 G@, #Z`aa"NʶI0=5 >ИA#X RLOOckk;bJjDq۶^z7y#3* (,+j:Ţ4n/^)O 9h۶\_Dv <4;l0YжmA!^narr<77+OP`nfZ OVs6D;sQ*Q)E~WUNJuʿg5qlh`zz ϟ G.@ !O־5PXNΠ r'EH(d#RFɉIb] ԤN0~ W P@F߇Gi#B6̘R؎y8YA:^8,T'Qq 0 1S%<:-9} SSpz#) #Yk;6\P(9ɩ)^:<[ö"N R 67SY5a̦XT,^slGܷ/ "ʑ< ]z~vV[ם$E0;3B{1ފ*?mY@ qA(_wAbccWΞ\D \GXDP@\el!/Y\<Ϣ0N1 &*wP,q9TYr\DN9; E,nq$2ϟӧXOG6i);oAD*28,oYpl-qJ(a%+ˈ}wj똚mY )Dh }\z,a @)7?_|Şf#> KC/ 5\Cۿn߾e/<"x'؟ O xΎ4^QassKNkqWzH Y~q 4F\Zbk{b(Y # Su,eY,kV AR8s4,0m;舌<ÿ~ 8wz)/Ο?<~)oL|3w{qFc۶8N\.o.nݺ?VPAD,b/.eln㓔iX ϲ@cǏcj \'t*!Kq>Ę#ҕ;;>*岬^$`hs q |_>9@T8#c4qx9ˮOwmz޿P(H>o6J_TPx1Z(e=QTB@P> ftJbӀtZ&Z6(NC<`#"<JfQa#l6!7V.ewygm\ e$ l67A`eeV,}~`WkkҨyؖ0b  8mWQJT*DeE J:J7077gTggÀQRil* ;FJE:wrTVm\*dt\_{[?OxhFc(N ޜڵk?S|{÷-4m: ",E(khl[Z<mlȡâ-=ld8lrEN:9Fمxhɔm©m[K3LNNΝ;!j4 {D CbFG;U(vacT*\X<IZ-T' 6^y֖T*]| oN.,l 33ӲA-,,_įگ'? KKKv:{CH*<!1zХ l0N: *AsȬ(vP.RR uzc; |@)K/3b ax.ʕKlR{rIGaҽ{XC\f U&lBuz O:q섿u6bիW /8*Nx1w֓s]j:=)'''Ǔ'Oo6~mܾ}ַO} jQsVc6UWƉС\buAGa/U40_#zB۶Y`}E(>88 ɉ ac,)"x۷nc6 /er~CB&`ggXXX?( z1111A-ESpvqĞ<>rl?WÙ3gREVɓ5^d8A>t:m#>}4N>ׯVWWNVߖ޽{xHFQ.ڮHO /Pk01Q"# k(e}!z]G*$۶|ZfLӲl Rɘd$YC)EuzJOV轙x@D: ,X- #@5I˞avv4SD }rbAlOOp%:uk[hZX][̸ֶ Ĕ+ߘRϧ6ϟ9sgΜX[[ qW>ykkƶ1`bJ8{m6 Ga~lrcb5>0wia$+&y[ʥdU>WAR\r?kt.AϢz6m[Vm(7xAPدWh DQGak{ ˘Ǚ3gCz( y`+~9wq&ݻ7nW_*`9f޲ "AQvNx{_N(|mhZSo8B[LOB-٣" \fˍb늑̈Pi틥"J8۳ y)>3gI9X/ﳑxH8N70}D,LNN,>!lkk 5>HBql[w6@A @<㸨Xse,LOOylW?u<Ν;bYl !l.Akq,heoX,}pw+ŝ7(IAA*)e1eL` ejkBDX鰩mܿ_'$eg H?Q:{3ߪYxՓo,~{X,"Y RR[\eā fTaò,ZmcP}bYO9ͧ2X&&]E3 0<4T ؔ!`O˱1Bka{{ Ә @γ'mX6̘Rz6c(0/1yXAm5 C@4aMCEg@6,!` IDATD8[oaiisgNannׯ_>1Vz <%{?]D@ljq/A<0KʲЮ}'-IB_~/2yR#^R7n7;w099%+ʎt=tJK2 uqm`,O͎{@sEs @$DSDY0Dbf %;Blg(ͦJ,˸t;S~b7oğٟi5}j-z%|C22n?(̒#5)lzӐ/rh^gyy J)^??XWIV dzlB胺8 =4xzȃuwF"@j_c&a @0#5'$LFЯ'r A̚a*ŪLL BTKSN I!E@cAF>*0 wPF$¬ ?TQG }t(1@7Ɵ 9A(5ۋ u@:腋'GwM]ֻhU9*C h@Nr@VH PAHEEDI@)|hi`"w*S3\Un;(0 !S}k* Q@Ļ@i҉@ڀu 0Bt/J$ח~NNG 1pP"%G& 0@z](}|fH@'vf/|w;FE&`!tj/zY(Ox@nߧk{9"xL$HID 2f"Z=M4r[qd6#ntGcWm·E$B Cz/K=j*qicO)x߃F J`a"dY%(He&)V 븢{Z4# / Q0ʼzJe:,@kG@<0" 9'k+`RMx r]L AF`6$*ODT?ݳw z|eƯI{?e^8uZ$л+`,gF";ÀPLNDuΠ3V__>)(C ^v+z\X?3Qٌ&~U T gмс9 5A@w $ @kÌ{oH6kk`@;Y`%{ V߻HN .$T"@0^7!ƬOTI ](SDpT]Ճ-G D1h"D~TK+=j{U HM7r$dQY͉:ݲT^*RWC32,$E~~+C ic ]7VK`BnTԯ<`hc[G;.;a@Aق`%b2RIүEȷcـ'9&@WEFuzq|mZp@U~^dD~ wCGWyOw @݊aQY %$u{N9hϟw"r eHmCif ǃddڿ|Cs%AhB}{GGL?$ATmT: 3 5MnK"ֻ5,J%@]#BΌ;J3%$rGR!`PbY,AbBSE1E1=Dwy@(aR.*1PFr*^31ƆiZp_-f4|F`r0@/ A{IV3, S˦ɥ툀) wG3 I 簋Nc?қh{U e.l_`"w؍ Tgwo]GjSrw@:D+Bj/;Axo@T!@ػ}80;1+ ?yoha "DI=8  ʟ7L dO$i왳XU[)'6!h{S>wHH>)r@eFm8<_i =0%&)܇Ltr6 q^#D~B2%pṘeJF%<ό@l*,3sᣍLI As $ q_b$!֚JS@H}zOg7Á9DYDa~IЃʬ6xĸ^ԅ=g~ɟo@s@wF8( rΥTxxTPڅrP5z迢igqH!{p)sg04@#Ƨt'3&#L9‘ )WUju2҅@N|h6Bd&@ |@vL:2}Z~eT_/ 4'vcX@X{~iXuNU}2  BfIighebnNa*.AHMs|B;2ph,X4/;oUy$tn@?o=)Mjǐz@8\R` ` z]±n=s*F5yXi')B7.*B5k_,RFs4_;7~ 5'SҸIĄÚHARotDDXz8qN}Qj-C yr @$'p ESQ!).#_+/q4_w}D<TР,8?tS"'O{$P/<^"E8? d8(#! Mj0@$i@͵b!]T<_  M#o2دĿ w 4s7!/+Of!>ICN_~٨H߫8#O7㎜@1A )hZ8|Rт:rZp]i΅iGKث3> D5awX?fⴵhC_fh8"{2 cr\(n*ʮ4) d܈ueè "h!@68vBRg ":] _` ]?ϖ3_JU! /+z^J$#!8z#Tw ,a r(8#wJ*3HLe沬guɡAwD1t;D0!*_i * ҷKd /IO&C5:zP2{;(eBOR9ԄV%3 Q8fiw>4²ֳḀ1Z'[#V))HDԍ?FMHCw2 gb`hR30(_`|_Aa:To<3.Ld'R(2rr_G^@ BPRK\_:*:lI'Q'2t3:-6dH:^ 8!9gJ@n4ᠨ(J}'0sBB(d('6# wnۛ^2L3A4^GY ,˲8gξ)@A}/& 8: 0 `P- @enCi)@b;Ǔt@!s4Z05p,Z 9N˵<} -Tcd[:U! 0&:S-kTЃBn8:TȮ7΍H: CBJ7 ^ уp pд!qFR[m`Ô~"OFbXqse@ z:GJ>?s 0!!6A CCFP7{GDz;*9BPk&@@VcP> *Ԝ< X.*Ȱ_BFQDZm4`_k; %e4 "|/ϖ$G~G!ovd p8w?3ܙSZnV9zW2Jc\TO@Y0(fp) [%;u0@ \&?);~*}= "3r@4)i@ 7TsE4!d Q#4L7HE PB2v{1,&PX-)G$%Ue r9ݑA`c$Qy )rYٜB\Gx$#LAdt>x#'WDԤ{ү<,զ6d,Uy&`myC`٩iB>U7Nn~dL$~ w؅}";@aD&g_M(q۔U?`oa4(- WKk?1G}OЁ _I`h:˞{{g=cN@NBLOlG] J有Yu;>ԌThpzO}G'߫}9z , L;ScО h{342h_Pܞ Q>@!O w9e!KhNbP ΟWy `0>g0 NNCO'Z?HCʰ.j1s `HqmP`@@ȶ/z|wI dGa|::?+ɣ*_5!_unR#hPMNBvǜ3]l_޿qF,0t D?+h0Pe)ۺcu Ifc]#`8 Z诅Ba2̴ b %ZFAtmc$~fG@qFlBT,ʢ ^wO$cc2ZzBP8~}:3@=U5| *} X:4~mo=AGxcwL{uC@N-`H %+H.BJ}BHDߒ5z= *@Z4 wezOq 3d^B *F]>{<Ñ` ߦAU{Zb!Cn y7 KSDž u%.A_Wi^G0/7L u2 ADB?DnylqSjv4)s@?瓂2@7 sHqfY5hW[&c,/OO-d#wTbLRf*. vI4|L"oA{PQ/(`s.*t[ӊf T0zAoED.Ƒ4> Ds wBxs?#pJ͡(/?h,@ "U4ǃBE@R ׫6-?4@H=AoT gyz"姏TzÔOwzDžSװ;ߨG F|(` /Uz^)4]Jt`dFu뒽JB (pf2](@1 J,n k6`8}_CijHQDN)iiY,չ @DO'HBǃ z]D~P감G=DOMr?RjORQ=GiRMk(_r!0F/Br% @5' eSv 6ȏj HbА:Q3z-"0RKPsܿ)8F,Rq̋ie\xګ,wLAa@N*pU 02 jAڿGY4AsGN行owp(_ 6`1Z@@aX08#Àf8'] H*}'kz0D/}Y^ /0B90<:X(|g&980 s}i~Ҥ5CV#tʋZ@往k/J͍lI `䂠!#/GGT^7v0Ea`ȇTPA@Nrp\3bi@bdőgM<}&УqErd iL1v"?"01R?d<xPJƐ{AE>mp{pb,̗6 5zqcdvt`04@@ػثٛ'(ރ ZD@1j730XJP`s |U0(@*ʐ::mFgN?tpp;@ @mT{գkJ~"@^[$Qhg.lN5ÂyTO$+IDATT==C{)cb>1݇: AER& =%>VbDA"Hפ&]hW̐t0PO7rpH Ћlv,J0T)H+rpI# -2^"wr/.꿡8Ș#1?iL;CPeы'4=HR,ZB\1hLp$ҳ("$rpPCCF3+ezO}0~mF>#e=e`N:,aAJLRt)0T1ʑL'z I"r;`4gNz4 k4`?)=i#Àm| irJ0r(6D#FynsFa(7z$M$ !{ HZ~VX}֣QԣmY* @`b:Fg=HҮqD2Y]u# vn C)9G1rgZfr]c_,X{uG KTƴTcz G;gQ YտEw0)#~!9D(N4Lp I mB3НF#8j蕳t :E1 rpP h" ^FY/JLac2?+d;ÀǓ=cgnj]9~V﯅I p0D{]̇8@Ya(2 Ѝ\~ 1PqB"Ou 썍|=U#AF T˝Аnnf)Cv1XP^è! qs3 0`ԟƘ4. w21,pg/VFe#w3#tANq+`.G24qY>sTA?a?=*|9c_)m@fTBfH;87FO :tį0{nzv@DqhƟ8a`zIJ, 0Hݲj2uX&xtZ*@Ld<``p}:|YC@ .XI2" F_ӂ 3G D[d-U5˲lE18Ѓ0 8=!ڂbM(4"ίhŸܖqh((Fȗ%Rzkq"LNRP|^b @㐟GjAL|K_~BGrbeg=_MIz=n3mbꬭMh B_nOLLxʔ#DT rL?[2 8Fr~*+hBH<*T#5!?թVt/^H GD;Vqm.8>RnPTj/.!Q8>ߟ!ɞ^T8Á @Qo4NmnnV[V=c,jnTpb!ବ&&&ʶmOQ͹d0)nIO^aRa ]`@Pmo2wq՚nBzC‰x k4FQ&Lol|NJէRzd C#:BV@;3 ppN^o`mcw޽HF{7<˄sGt:/i؉4`}CA8azh\hƘZ[[+ݿyȀFo e(fugZ@D@@n[ ܿF, t nǘf9Q81e'"2 "B)v: D߉I)7J)ӿI}姮^O?;w믿7xo&.^gyW\HcLP A$X9-\O By9wT S_n+++w>=z$?O/s=~now:S6tpBH˶8;_!>V(xqmܾuǽ{y\+W/㩫W>aC\ P.cX,] m,@ñ*XxbyyYf}\"._bjWo|{JYrg+ ۶` @5d`YVRZs]y^P(廯G~ua~a"3O?g}zo6x  \zxP*>, PT~F@}OS֮ 2N`y@2 cV=ƒ*{Y9{4u]DQP[ny~߲eu !Qq|"r6KbR)婉JP*N{u_}? ŢmB,97n⽻wQN-, t"._r˲f8@ܲ-XĂe8J,Ra)EL)o5d JcP 1☽mNMMe]wf`?+̲`I2~EA" CDQFQ# CDqfwX^^ϟǹgqY؎OGqoͷ,Z!,SJw: =zhO¼'2RBH<Ϛv !8NRq]-xWpyw޽woiGʇ?b0:??y|u,//Νx!V<ӧqi=sgϞaAI{RI}@(lFk2@SԖaeVVc>1V3YZX_[>)ˏ !PJlSJkr.NJiL ;RɢjjeT*ٞ繶mۮzgoOW}}?ssss]ǩ|5Bpy<ăq<~:u O-`zzW\LL (E CzOQ xϝqV<͛GX^^I755s38}428BLjQݡq ;oNn\.(! !(zm;rN=8wI\J)JRXbvrDZ,qL(<,-ݜ?8sbT42iqZOX}xx\bsgb~~gϜ,$ SHL"f"*(O GX__l4E>u .,bn~Ξ:6?nTc`{{}滫_pufT{Ws]wJy* 6 !5RĈ'RHK_⹮[j3mz`9g8 p: 8'(}q….,/]%bYǵ,Z\79e1G,--$JσR˗.RX,ӈ)EPS8g:@Lc (pCWnYtpvp-|EALq<d8A p0N>]pBEg~~N;9%.Zt:x]y=,,j|Әb(059)EVEKnY<ϓn:= 667d+Q*0??9cvvΞya!.@)gv;^Y^iݿzVm8N۲eY ۶mqgT*-6ٙn8_C0e0nmm'(q]w. Å0 QDQ4A%(*NǎEKq._RT ‚՛H;KD 6AwxNdo B4,!x}&2DDE13g9wF)j'O啇Qm۷m۷,Ei maYVqm;BaT*m{311QhT*jU,Ójx9?fhT0v:0 }ߟm0 g;N0 '(Ӿ{A(*AaahaahA`9ygϜu/\pN:eKEd8xRw}=PJYgGbM9gϞEX`˩33،k˺3-(Rח@x>z8xA{m}IӶmҲ,wǷ,MiZz뺵B8vP)u۶j111,ͳgΝ℅>WED^AT[ִ{DgF\Mo. Ezew{;oۻwÇ;Z( b$@DQ?c&D%/D-H/0|l6tyy9:˗/uO=I(<0`ޯnnn^Lt2M4M!4M'J!$* efct9gRBf&>a٘3wQWO?Á/@yAGU^cÇӧ͛D,D1%D 6@ Q$kr#^f^ovf===ɉ>W$'dcvF:o&<޾޿1ޟMӴޟ6RV)uJic5/ !afs69.LR"c)䜱BŔ03˗{"jlׯEAMy kV.<61uEaj iUJx])ec4^HP !XQ M)K):I0̌J)xm,0JߚJ(|D?i>΢0H?V,c\(DT`=X>Ƙ2>}?!m_sZWmu@S| f:.A> (趇V9Uq1v9 B:bRJsv!NJ ~R%`SJV^J3  Q R@T(A dP#d!Elbijߋ1Idv]we{W0{z/L-ׯ96E)K+,(uιG^F :!>D.p2N9$R9$dR Kg1 AEA>;|cx% /'ŋg. ?z/I<svrFf'fڑf е2BdYNU .lL5HP!8 Hr!9ea쏂h 2+*Ymk ,Ǵ+19Ƙh] ciUЬ>_ّMAV@*Z)tU[" m ĉg7'aHHBU!YsF)7rD.5]5Iz`aD̲-$}MEL:/5VW k VW~דy7> 5\A/0 lS3J$9 (I1F'lDO I, 234`f6 ^Ha2J| $ZkYD R?[k̉@z:!W{u{j+#<| )Ǜ^H[M]"0BvvDBW5MI^w+ ̀hUO>u zy˵Ts,Ǜ#1[ erP@=}^poǗKJ Rx >д|Mu:['/{pӿ>WmKAWmǞ@ zc>bϘ%oke\oۿP4È+jOvT=LuCC$R[)RMz^} vqt C:F{1~5<ԷMrSz?Two޿hcnr[/>`?D{>߂y).1ϲ?z?͖%KR* IENDB`./qwbfsmanager-1.2.1-src/qwbfs/resources/256/tools.png0000644000175000017520000003706011405503640022040 0ustar pasnoxpasnoxPNG  IHDR\rf IDATx}[yӘeH2SE"JٔKSXd;ArT*%7(+VbcL9 RYhQE\.K.4 tэ>Z= """b9,zCTK""QDD,1XbDĈ "b@D#*%FTK""QDD,1XbDĈ "b@D#*%FTK""QDD,1XbDĈ "b@D#*%FTK""QDD,1XbDĈ "b@Do$I^/ABz=$II/A/%I^$!z% z~C:#| 9B2rE a=Y>bbA#lGٕeDSR&Huq9.IgW'+w:("ϲB@m=7ӧ */LBIzl )B$=~tb'D:FIhQ4wx.ri@9Ff:VG֕i:T+IVAf dFNH2#%(z* ҳ6?Ȳx& G3V} e ){@<;^ԍݶ|ϙ{܇2 ŧ-dT'2#PY]Y&'n)DR=Ftu7@Ј! Ɉ o_^]!B$IVA⛈&TX.;E\% CT]+*>/yDCU+'gW_D#~5 3H蝹\"9 L6u @=DDI?('ߟį$y +I~xw%Y .%A2 5 ؓ:E8H.˘" P>frR# 2o;ߛMɨ\!*Y]/БU 8xb_TE|q#@N~G`GlV K9< *)Ѳ7*ĒX"WͲZ6@!gEY^Ivj2f</5/\Lxl_K|lu_$|[soN+,?\>#Ρ$I Py\rhh2[yqe,(1eWLV.1%I\#謍6[Sf;\em]_mq2\F <ӳ6u CD ǸukB 5MԄ`Y/l.k.U~-WB"D* y~ڣsp@b A3a.]S]d2Kp]m @Y = 5_L?t"vM1-{..]d5m\4`"cJ`6]wqL\L&\zoW!Wh((@DˋOD,?H.k:}=|1} ހLǥ $ QW)h+?l.krSիWqUcHWT#= =]څ7.im\|zBKV_9Y"Ϣ^y=tBՕwqL]wqLmoܸ+WhB7 4w\gAvdY"☺&B/_ÇuB&?QK}Tw_',AwqL]wqL|cc~i+W` AG~pX N:$9#_' ._ڃow9_@xν$S[EtacZsq}\|]ۘGNLEr ~]A?i?͛7i [fD5 8L1(q^[gtP~M?xo~cܥͣG_j.$g֊qQ Pڗ~}CWX}x^fy5kp5mY[P(v]%jXW @<.{P 22UwqLO>Ύ<@geJ9`W?_˟$ AY!2L&I 4e&☚߼y}< y(UA_Lxv0K/W\AL&s:r`;N/☪W\GuB Ȯm> : C !z 8}4N>GFL&\LSy+r/Bޥ1sޫ ZWyG 0|)㩧k^{ .>Cܾ}{|c[JaP,pxX^ɭ{ \p5W_ū˗/|2FWL+ERtM1o@.(:(.krlkk ~ihDoE+ASQMB t|\b/ /g}m'qy\t{bx@3qu yիWq-mYDK*"\Y35`x O\x_5۰q):u =ᅬF#HӔ+q:eU15-ŧ~]m0?%*xylbvBSzOwy/"`SO=7xo |yh *,Gl ƍ^o]43jw⻅ŧ_z7@%\.T""F#} C;w>~i|믿5x?Ƈ~ .hg BTGAF#׿֖AdtSUid+~'\C&gJyx.nܸwyqi'py;RPLӉUwn._ı766pƍ2W"I܀a@/yLT,y)$Ah4>_gϞɓ' /8yO=|M~uV+` 1y#MS׿6AB靀6j_ee `z=L& W~{{{q~_ӧqI/_~.]|cᐏY_Ud_]^M|gꗾB~)pT3<,({6^pL| X} [O~/7^zu}Y| o{9Wpq|Geя~d“!*v?g}h{132K+CB40+M ڸ:,4` I8dw}7UzH+B ׮]۷ebPp:|n? q Ez:IY8<f'|7oٳkؙ2wc >ޞa!T;-]@Ū?"&D`oNe+fy`~???o(¤äX__[yRPG~X.[7!lQZJ/%U%`U7t =Z|PBî F>s<~8yP97S  {UдTg${# 'W xWl_cssz-@p8۷.=ֽ_iPf[ I,/&::Tl"񙛿3<'/.^>0qvAAhG7 Ӏ'4p hw@.:=0àWVV3|={Ν:áRoTr6>V_L p  y0 +g|5_]]+ӧO___0/Qu<4Mqƍ~t@.x%Q8Db z#P0a1g~uu< ^|E|ߵS}~_w:V6]vh@; "Bh" ME?Bn dv̽g~eeַ''^~m\x7o,=>5!☚߸q[JԔÌ>x@F`_YYpq+8s 9b?XO&cNz6/&;8&|ooׯ__E=ZQY|Hʃ@Mil~B>9^z ַs9|}{=tyƴq )H_ncmh`c~?^=Tm% 0aOR9;W_|p8dɮWӱbV0ȑ#X]]`0o$b?j/7S2r7n^L?at ^7 mիW?O8q Ν;|@iP_tY9$T`L մ\-iââ1n޼8"Po:.:&= @Pm[&C5=(ͨnХsq}ܹs'NOKef8? 3%k%ۗ-A9Gi͛K~E@?8p#$- $aiV{~7oތVN#_%-pݚq|8#v]9"{ Th+Ρt:?mɶ80MʱB5`u,@W܄))77X[[+MCdb]F rb}}ɤQIX!Oh,{PA }%AYh$%A|@)$˫HZ5clt{.6,䱎$8 tZ~PL&> fYVfrC0-֑jy|8֭[VwU(|Y|Iur\de@uPc(p&}܀ n2EAb~ڐBaK[0$tuV^oGؼ&m A7h`Ӏ~u `!<&24A>< _TU۷o1<\wI!B}h|7V`!9L:6,fJUbQ]gl,yymO(u q\c_4JoAܢ wPl :BWȾdr[OU}SPpmiZJَw @W-z]B`IH+7LƯCM=.msh>C1_rAr=y ¥n]/6!`Id2  P_Uy *2Y-L02I@ZyJT!o҆@utZ֖vzoQ3IDATwWW AS[ބ*n-]:=\8A<>dVݛ-N#%l%VM12ܿѨG4luD2+O4 J@%dꀫ{]PeEM#4,KH5PJ:J>T֐_jnXжͲ >tUcjc@2pֈr#az9&UD~ߛ5o.ҏT Bh r(B=PK|b:}iS ^I`J2dw!iUVޅ<.}RǏDw,Wwn]%߱/k|RҠ7!oam}sM(:' >|Xޫm$]ǰ/iԇ-ǁUyA|6N1JY(к:looc{{WJmxd>mTn@I1:›,OhB_ҷmium4 u~ؿI/Cp{Dj쪛Ue> mm I15|UC 4/׿~\!(0Ҍ@U~@+Hnk)G/nJ)>|x\jߕĵz!t0fo!`Nͯc3a4akky5 ߥ^twӣpV>օMZ}QMM Cw &MKϋu-/B%@5pRU|\ɯ6bxmv<ǘNs!Ex~&um(L)- t}V.{N=[Y6R-⇶ iJo4AC>Trg,WdL䤔?$(|b|S=c~krl>ciC0)lvM[W>X7lqg,^r( @`#meoSǧh8CgpqźM(P&Ж!JiWiQPӀ"L'En"7qGH9.AEcڬN]%`߼-XO2]P]}i<'/]ۺaC}%0mj+4\_?7IzD~J%SN vpūK~Yڰ>dNKyO$U6ٚPM ׿-ꚯ(oTg-}ILulmBlzogg[p${%~}6u>O/`yc] =\74mTbԉ]ڹ3=q)ooMjN6q,_'hL9WdKIjC֙(+S E$lEd28}S'W.1^kjYh`(ROh")=Ň!7em*YܧHytP ]'hg[۸KޗAur}~@5LӀ~}~SԆ%[y} 4 EP>BYǽnG7^B5r:o@R 6E`+Ngi Amۯz>+G9G!F>Gu Wh%6Ky(٦)J?F6z%ib_K Hi@Sn@@!@)c + \\}nJ)/M)!*_A @3LFD϶ߪ`V_]!į:J(:va@ X%h9NPI8}Y B"ӕO&R&'Moz^Pb[}y`_ q)p V`+]=[U=L&3!c3J~Рۯ/"+|S AӀe&«}ECH&Kq?bQˀ} jt۲b>}/Їz@ğƅvnI[c{+x8FU M*[;lzO k|2qBzmZyۄwz '+gGU˰/h)p7ߤX]vSeHw!7Y6P! R=MR`Ӏȯ)d?N1KyR&o:~ @\ۇ[3Ւ_l<,> o@geղP=L0T'SoUme6ڶ­h>[db}h*7`Ax WܼM&i?2F#LSEYE?DQm|6 q}4KHOHxWUM[eoB51!ֲ-Pu,eP2ʔB95 `rGP&5(~WRSʠ%oh׶ok>3x_'pQ48_T(#:V0Ԫ }~\6Ӏ Am:mJ)&yM lh,_ӀRP1PHt!(c>(EX߷<]wf§E[~2@"W KKP L7MO&]M]Mw ob˕X!k[N-/ CB!(T-I:/ ,ѧ.2r!v]һZ?/lzNH(z61j'#pB/k]0:YL&D_(ٛ7ɪuݷivU>־+xl`vե0oQ4,c*Ue& ,p7ɪmU{ {ޖ_3<^ $O5Qخ $)w\_y"-8TgCh]n@.dF][EZS^#s) 2`Y"֦Y';rm1o\~SMS+s) GˀCB>V>#`kB2#`Ut_Hiʗ?ڇ)‡**oPجXX4IIK_ZWir6xL;IIي> W=2ݾIV%w-o..vV*M{"nGmn4`Ij?W뷩Bd!۶2`Sr/mg]I:d!e0NRP0?LMb<[,R}d.euڄ$ڹfA61ƍ8fG/^ ZK*t:b*6<߄2`]5Pvw{Z O!]uHT0b=UoY!&KOW}5Z:lTk\}ğt%gJ,*3E._[|Ձ_WWj0J^.Wm|ʫC}d>Mæ|\t>`wMm%b`Z @Al$p%xQ>2y j(yZY~؀d[h2P ]M~M,Qc,j9 {m!k4(bl'O]v]Z׽\ڛ.2}2r20Ў4Yx'8zhFD,3F?ϟoi@%O?&x}FD,ok_RxHTx +H 4n΍YPry-{#Xv Nl!ؾOVN6V*K~LC`ܵ=:̨?sgYѧO6ϟǏL KAaTqe$I0IS$IR$$1t~m$(7rUFPVSS),+yg$-QmU;}^mR?LKcprg)ٌg2`յ묬"k05 ]#h]~}knH|cX׶Q[FlWZ~pXd M)̗U턶~eEyPttA\)T_Xڶs$UVж"5%]4`Wc'Z+(s'~E7ܮm#7_־;ypէJ|^&w |D⻶=įZħjm_d<^bb vp_ER;mym妲*vT2K3y^Ƴ[ !O{8R"gZ|bQs;pT BAOui@ݑ`ryDE<muKۃ  !dO@Ҕ\o'$ Q$~$~=AE  w$,Pe&+sUCRaB_uLC2ss #y喲H{\+hB(B]$~ %>U#Bp5wO،@_MB|/PжS Eyeapb/'S3"Ž*XmRy=TJ=oW <"{.aj B ^^YҔ[,mJ}*.eTSf71-[B܍--U>|Q^U=f^Zjk,cPNUe.˅a ;$%^$^BjWQm I\R vtSbh[' `jTuKm+eC[gV_˘񿩸APЬ0&fBfa)oFõ;+Cbi`!Z;w"HGB$%DT0@ ;v׳CtsPJx\NY&#(x_4TbL(mQ*W:UnQfח(_H,<@)IYVr/tl6z \̤{7hFwL@(#7MA1*(Y *9s6!FI'O$Nرcd4a252t:%L&4MI#4C2NI$t:M Ie $˲Br$&JiB)M!DI^d|ϑP;ٝ7Sech+%by[ԡy|.8ۂ<6B2BHƶEY^/f,IS') RJ{^eY(4˲zl:~O4L&U:`0١^=zcuu'={޽{d{{_򗱳CN8]pHVVV.@>%He*ɲPJ,˒,˒^G,cD4~2R =$ S)u;DxJ)F.QJ ":ꔬuN^ B.)ܔg(#=]Y&(vN/>$ɦ)M$Kh4L=ziJdB=xLp8ѣG;wp1zU<?N< ?~9}@~1z&I%g%I}$Id5Yr֋.sar f)y,KvG'ݬM,֓ Z |C >}trm߉1z(bs\}[9Yɘ!B^(EI9!B^WP0ÙiJs>Ql:bee%KɄcz1:`<K_twqY9sJ?!~x"9I/ zl$ I|7!d20m\ j#S2ɫжp7q!@rq7чm6)|P_¸ț6N[}\c=W:'XuuC*![ 2kB}ޝDW@qm)I}XàAɺ " XoXDĈ "b@D#*%FTK""QDD,1XbDĈ "b@D#*%FTK""QDD,1XbDĈ "b@D#*%FTK""QDD,1XbD"gRIENDB`./qwbfsmanager-1.2.1-src/qwbfs/resources/256/error.png0000644000175000017520000013636211404701453022037 0ustar pasnoxpasnoxPNG  IHDR\rf IDATxyeYU]{sνx1GHIId$L2j~VJ-jSRK(RlB[Dd&MUȑrrx眽WϹMI{9q^^[TrVwzAD8+@M礿{xY8d}*^p ,9 k¢QΖpY8g(4qEF \DG  0u pYx eO)o1LT[k3o&αQ;(|LzB'C_Y@x,<2 /T=%&6Q) "Ă`@l-Ǯ[QPzP(BJ H!CPq@CB-L)ߣ3d'Tzjb5ztW+Z$ZDuƘp>xѹuo ч3B𐗄2 e 4PYʀ,PETjwb&]~,9 @~o´ʌ 6~;&u bELgEb#H DDE @1F;^Eƪ *X$xP0jPQEcuE[Jp<8'R@ʲ%Z(Rx2FE &],L9 'QK^aG7oBH 9H+NI 8Lj ICq2KgKT3˶ [C0撋unCkm¥j[];Q+DŽ ^]{)]5r`iI܈s$rp y䛆XbKxhвDPtDa#L[pe-T'.~2dsBA[p z̀^Nshɲunv^rV |4UcGŀ  2ŦH_VP"}"kDT0}C?r.s'2WU+CyyMn*"G%:(! O(Z6@tH8 '"gdWjM$AI-M-dHY4K([ W]@93w51It.Z(s4(O%&Rtu;_OXTFEhjJqbk7ͻCJU5ynGnf"0zZЏyE>@0U,l\&wgz5gwAԢ,ŴR@Äg{@{0{.x񌧰+K"oKJ}o*V#sNSlc&jฌJRU!ŨXtr+oM ĝ|n6rD$P E@ zSR##ހI-:hEV Gg1ϲȾu}&SK3뉛(*+o{a5bޱVs%DQk0ڀIZn=MH>/7^uP wuOD>BG{9/#00hD cVAvr֐W {|Խ}be@;C2$kA <{Kgw{@4U6MxIbH !0V?mj}-H+6:᪾W*k춖0~HE5`b|y;o@ sT¡;@{%J `JÌUda:[,LY!Ců =*R"_Ofbo?\ "WA_g{~g3>Σ=|qڨVPye G *Qi):u0Ln#heVH}40EȊ%|៹OG@@^lY}薐H +~, ,4]ӦP%&UN栝A+C:)Aw笠{%׿s^=0?D)4,I[ &pIA4"U*WD&˘5Qn2MAem50@ q;Ha#e ķ?qHAYO@;@=B7Ge'5 Y ,IP^4C:-1<0_(E/ҹ_+.CC|5,4%*_eLPg1$lQCL)Jė1rE\VPˇHeM 7Ihe@"T=GCBFV˘7>pßKU"_ ,ЕR"}pb,ph*+/5o;dIv握O^r WyRBkfV ƍz]gB\"s-$ɰvg`P<Q<:J4IU{sj<@A \?装|TGB+aZf"^VeǸhiX8A\Gzѕ"W E\ w2|G;G{PNb/Hۢs)̵`~;:՗=/  F0"8{{c c J 9h'H8 <*uf)*v9Mp2vJ&F$$P4oUbVP,}#!oKgVηA;NX88>"˽ |$s)3w|G;{B ?-sȖ%g篺5Oz)!P,E8q)AS4tX[@!`0 0T;ټmGo3چ4Z,R=Q[ uCUe _Pq E6:o GRbŹGerV d%D" Dw|G32]m'0B搅EKClUjB(ţԗiAL5N:LamL\\Ŭ$܀K!MbuZ L ܀ h.TEiAo" FC}c`3 7~ @b7#=8^"=f]k;&߀ZsYtRtYh\z}sWsr j-CԀ%Hb $2CፋFHEhR2P4VLX#f2/ԣE%>xGX0r'~x@nJ]rxĚ#P=q?nvND:to )C]}S_t= ?<} 'qc6ː"AJsjTAh7E-_먕=8)"c_ل0tq J>|/!QHPmw<%)ܾ~?|A`AV9Tjyx\_~R-ttڰ0,C_<{us_j4x E $4$1_2*1,aG~ w@~ e  ү2ˢ*k2M j:@'ٛ0t ?F 2ʂPݿ10Ej}x @.Џq_xِ`}F>կP[?چ|+=tqKt%Dn .q;QҘC!s limÛ/ǼЂ\IG2bq CV' 2k 6 |UD,~ AcPWLt|-=,0z?kLllS'Vh=APA($-rWn,z@t A|ca@=tpaZ x\F黴*o^z5v$q,|Vk-.pssX-SF#Bbƀ4A6&IZ٬q^:StUon퓛?3~f6c1Ұi7Q11 I9eʜP\E=7Mx2f܂ %ϢΨWB ֣ '9S&/0f1)uW+X  }8[C}5 5=+ De3*ɸgMur*A^<ʰǷߨ/  ޻!Kt~#J gqۣ0aLu.cY8 ؟z~c;f:C6oACD1cE#Ǿ#*٬=FLXTY/wFx `H j#k0S "=u{=|&,ܸ~@],`ţ}GCg Q ?Nq1\.avl?];ɯ~E;cXzY }NRz]S'og+\7jHaPԭ݌ڬN)~XSc FTТ}Grc7r,}mpg9ҋ0gr Y%g,vnq.GYv`P>k^l>޵Xmr zknGf5N9EG/u Q~C\nhLNb%8A=xFi3C|EiȖNS_/heb} Sާ04Ki͵Y;3̧N Jr7umx(e? ,25gK~2\8AM,ץHxQ>>p4nmȻ"8G=R **k^gNc8?zz~EBG:y<^`0ΐZsla4ʮI?&ɷ"N^]0 pNI%!4:#c|~L/) ._x:r9E㽢ba>}(!.ah Ti%}W5QȎ-kv/.lj bI)Ig$I0HF=LED5dv5mPfQLZ-OdC"Lmc4 jLcUzBާf(||1 X z#9,yXQ5b}ecftfێ7_QYI”1h 8:$smsX8fO?V=F ?9nm#fF96ŬRǺ{j>)0f@e '"/y; aD|,dz;M_D ݍB#E~@Z/I YO`Xzm'Œr鷖V,@9E ldZU|Yv>u=GUt@+rZiZUim),lAvvx_7B"X#E݊iց*RT5utt6 >~ry3&;jincyms.IPh |Csg!MXSك#w T>}<r;}`n#j] KXȊB?Ri}4|~mt۲1z^e"tb6q.#H k  e}ds!P_+tVz-DŽJ% YnqS1ʨP IDATIvw=c}'rkp֑2ZY,0b1A?hn~J_~u5ހ FR~s aϕ_4<@]o. J_6{2uY9%{|@Y*>x>7}sP[mop$#,=V|Ð9nJE.6Y}5vHz/!U6MijupiF"SVϘ3{mȆ|'3 :G "$6!K[i g q:J{_erUG=~ׯur#z s}w9~kC -ov5DLFTսn 7n U\jc}hURwxk2zzP>U' c+`Bd$"&%s% #3BR?g/G/#iǐ-y# CNhr0 5O~'^=6;ꥊ`cY)K?3b5RDdS晦{nGGL2%g* >bB]GFʮ3 m۬(D,(!kW+JWӀZsh"NBY_K&U8 k2g;x2]+˸⋸i6Vv7u|CYTG Z "8"H`g 2޳d_w6U%JpcG{.۱sqo^7>ɐln&)4AW0ZAMI\,ݕ./g !q|':/>tj2uw" ˲d8l9 h$*޹X}5Nߺ/7y9/w WӅCa%49ƋAZ0"檽λ ¨4TVTߒ:G+MlBBT^#L_`Zk~JD8p|uz9 ]\}]D|fc P[ABֱE@ yyxͣ.Aﻘg]ppP6MYc֐Dq`Fop2,U!8g`.<(K+^<{+,h7hsS>n[ s lk9Ǧ_qх;4!$Olb 4IɒjpO +ݘ[Z׵_7P2 NkzD0U{EP]W&GnGJYO7"Q*7Ɍ.4x eVA 7~'w~AWɝ>_C[fz ٔ3.j>ux0F0cJQ:P(&\ye|o@]}ܔ EL2qWyJ2}, ,5loH}͓wz{-r%^4۴[ډzEVV`y%^p= H7I=,]wsCX{_q`o[t-wbPX>.acbcƖߜUFJλkwW8xvnWCk@-FDuD bwL4֑KX˂{eGʷ.5$;ᗖ. Ҙq;V)r2g-9qn\tN<S}Cd-:ZIFtp|%&~a1<'DȊ~O`Ri>t|XqІײ-W]Eۮ'fNb& I1F֟sP[FT;'2'4,l:h Dǘ4Eӄ9r_R XĘJ{7 Rvww=%L' N F t,DkWwN)C@Tiֆ9$~.WDW ?J@$ǢC>fWl`LvQ~A`"EeLo營Dfm_M'?赬+` P蕩n>u~σ (?S%Exhy?L:hu5G%&8dPT BJuTqYƔ~n\MeE ZwSyZ[ruV+~fc A+Y7K'2 } `L*3  >CX 65T/.>BGrWoƣ3疯+HKcی9rE k`YRM(kDPJi Gb ,sr1G/p4 $#:zkASؒ!{}8o\6[cDb4j1ך$e, qٽ6Ci4h={ǦkmK~Wկmp}"_x;ixj ]߄u|9ǜy" [qŶ;ā}sχ?Y9QJs|2f*ckkj]츝eM^S+,$}zO=}xAAGw>9ЯnW$'~ Ҷ ֲrB蕻<=Q.)m9,Yff.ktWeѲSè1i7|#)^n98~>wc?)7{o?SZҋidoTf0% !kgw?40I_?i{qqwc`44%3s􋂥 <",}|ކbDzGW@r_x pFğ 'K.ݲ۷'4-҈`"2m[2pYZ啨Z@?4g+d_$ڧyW{}vls>޺rӟY.h NE/n6 .H~#Ǐӳ~3x߼wC?X34g#NFqJn EbK,ɽ|Gyб`JTnhS"!!1"y$ pR8_%XIXB[̅N{X)5v*ƒZG#<~z5'3j47f9kG5w?/.MfືS^Ŵٷj9‡<ĭⰀjd3axテ=_:aatHGlW㼀V0*0$0ZqYC%*tXJM,<+n +R͐IV<2j_hx$HPKHkd=Jxqů_E Ot9JmF 2:¦ټ4[0`Cj--kXGKJ Aiî[\6[Я hJ -_}V#V:'TKuVkkpyQ)56O,-4*%tAuRjyRR~\3W厥)7iϵx (-׾ͨȔ;p(y/8 ÛӔF4`s|䡇uyeke:O~ ?W]u7^ fFSS' DlCK-)PǫYǖ4eK'Mʒ9^Ay8;d 1Yt.ܝgM $Tz`Œ8G82I2`_hPO23PjPEb0mon]-+S~Cj93',TR U4 ۥa $ B$jвmU|Cw&H"*ᛒGdjK/T-YH^=KRL0nlę.%р!8rj&G$,Y-# 7ܹ֩:Dv_&[ < H1(fɬ2JL0XS!-!'Q0)9)@~s|*+1ylXI5JXg4qL J8v]|Y4Dbe֍Lsf$Men{r@PYWٳ;)}ha(ZC۝ZcmMM￟8gɌ8nGz?0k\0*A#tx PHWmZ6e-(Q,6Y*K\ԇNdd@S _Ϳ$pI ,%1r\8q0$m``e ]EjOZ_SJ&Y5w.~ֲy޽<ثy‰Te%GGQkY |޽$2ΛqӹZTyPaY\FY:_@bIJJ̢ddO_yqyD(3asNgslR+0K-ጁnG^k IW)CK 2].0#T7Zִ|=SӔS*cMm{Z <%Qg1;gumA3,8]I1+=96Rze ȌeK)=O'-qZB_ +:C;9k.+]bx+&vp>`+˱v<:?XS4W; ׌,ܵ]:N&8yqLWi \c?ϱ8)=x!^{!™`0𫸕0r)"6ԑ)IJnSRZ1:9Vj>lspA4fZ%CnJN~el:A2A:3YMo k\$\ua!!QkZROvԞ{Mbe[ބ>8(ݾtffZ=fLZ 𡃇yfq#"ic>8 0 / v[BfSmJO G0MaJ L r B!a+eV~$h a!w.K`KQOhÔ9|X* c݂`'1IV痖j,Y WGm[IW>̿O_9@Ç;ʉpuY"4ꝴxb6rig$Y\BbEh9C+,|ɞy rHBW`8>`uDc>bkHhy1ƫjuI==qB30'nQ!)3$}1kr?5EŖꛔO}~|O|lQ#d{=Fߣ[䐭[IeZ1;p:YՒ9AgV]VZT /Ӗ_ڀ)syTЖDٻ՘',kıKI%rLJPPJ2 R(o9to_Z&vǛOF[j p ?0&d|Ov^Ls|Em [{̑35)ͶV:UaA8iqʂ"(Vm헾{rk2h[1=FVZ0&'j)օ>@K`5mh{ H=1/MRoЕ>aqʑk+Ut_'7Jolөֲ-o~2`P#{Ot(Ϙwoy2~XdtVdXܯ oD۵F6sC7%t\i4/lƚI" qgmATPZX8Y sq\ !)t yv 5FHmux͒ukAS,Չgs\ [ʓQa( t7<څ ˇ$q1Pj AiX4*Cɂ2pu0+6%_aL5j{ |x+&]BWdž IDAT r‘/A#ÌU|͊6_4cWknϧ3ֲ*;KF8I>p@kY , fJGVA@+,@*TG!$)[ Ҷxs RzMmxz@t+ùhel}ghjȾ !V ):2Y\weY~ f{=}NS[O_s6Y;>=Ӵm#pnE}!"_x伧Ho]## 4q ZLrLTeDNO:m`IAcF^1 XLRf8d֩K3|gHy$e`LVA;2ك_;|O$XjP5D6g`/qnu|3v54%gZ7f G0G <#|".?* 4@" m=3q!UǎwܡwZ~L}C%x (aLAR C#DةQG* :t6Rz`t'D4n/6T9tFQƨ=)ƐڄZR2G1֢`gm2aEiu, jZشro'xTƸc.WPB_0.2c<N v\nn? Y|o2 u3u$ / i\؊QȩlQt$u g ڈ Ptha,  WPdY\M揥sJ&sǥbQ;rLJ?r޳xҩ"-v ݅3Nre~rv\^n/'_[&,2Im_o#כVʕAvˇ9RW /?!8A7#J* $or"*뺢/q"GM3Ar1>`T8'2 q=?fZ 6Śev6WhѿFT9];t_6EƎ|77ոU4*.i08MF"dMKRȖ;cHĠ\7@NV)dgMA K #`7rL i3H.2`Ȗ9k8ئ`d4vm~Q*яI]OЩ/~!Bty>lr+D@q'KuE[ 0 V$|59BbbHϥxF9ʢI 05V? aGOFGL:A0bFb|-t~[׎_@XJ+ѿ78C64̯<#E\9C۟MFA@ PvPq|y)*T0PqIp9!"F5ZhsStP2FL`^9BIm\!kԺm#mㄡ [n{Aw}Ny ? ?.wrë_KD8>~qԍ 4f{mtlp%Eoc RL=H@30$Рi>* īw\Ou؇u~zfm]upEN߈'ǚʪGJ!)dZw@ TEq谌i2 2e 0QdLa73"$"3ԑ)}H$x ϴR6uֿ5 W]1vW9yw׼g~m ^gA`xNAKiB3UFjHKFs):kCAo~ Hq%:(oc0 Ze;2Wx_:PsPve "9|3/G .~Q,}$K^f霳qhnކ 8# $ <&q8aU ҪDR qpM sWKRJ?EY%9lFkOo~:gV|sGÑT_txūWW>]}]R~N+} {*ir&" FxTX9q_j U r(YÕsj)Ɍ준R]7|N&LuL{k:/؏ݏP`?DHD:u Qx˹xY5s=3,U{_[ߚ\.y*w9jr5C>ԗkP4Ru#A.deDF!)9 qaBǘbM>{6FUP/p~SRV?~22}︄?DkM`}O@frv`ܶOipѥ|—]f?ƘvcMv6p/飭:B\H~}F[VSfkJ)CtR'GPULmPanM1$hO5?C|K/I )x?<J$}kqѿgXך-dk9-xCU:TIfG1`j=XܚwIx4l}=Ze.-wgM&\/a.x|^T`ښ_`? *c&5)\Ww;f'Zunί(A Uq(rT%0C#-**g:fV6z%&#_o5ݕ}_*9c?pEi? 0aۆAns>|At;<ܶwl޶=T|# \lQ? h9+PW@0o 0ARz`E#տ)i! (N't^r4v5&;ѶTkĭRu!bqp@2zS;>L'm0sFsswW$߆93?YubAUJ+IN+@M<@AM=+/t6{HOapx}X|i}-4sPZi; Gʵwy2V )"F#VVVzh4MdIj?Li7>MUhJvmf~c^tQ$ CK4jd *X'THTì4F> ~vM:w߃כ6+|u%|mDWfff7e8n'I>j| K滍tp˅6M!K85 (ll~1fg^/i K,!, EI2'R ՜6'F1&@y/~iڨFX\{_2ſxsss,--QD~Zhfff"]澿fAVkͅI#^ܦR-#dS(}RUq ZFJ{WV)08'"ТkCkfm43&{>=w]pB(_F/xGwٹ9A./]cuM.~wmI>؈F٧]焱?URsZ4[ֵ?t몗ׂVS1hA(W<4Ta6YjjP:Ln}om|ܡ.*|~:g k )fg'3W^<`קb_A{]kWRט)窌)ʇ fԯڭC*~@bg=A\i@Q EMY1͒}A_{Lvo'%\_Jɧ]s\o$w9~kϪ",a?߫2U1B;V?g}QDmb I>>N2 =wpx &@PPԉ8JeqH 1Xr2ƁW1 W(a(?- 7x8M wuWomf6mis`~~p9VwP<o3n-Fθh'5Zo:f*rfO>L6sh3{7#P+g*GΧi}Z4P\ގp$`&XUlhLA 2E^U֊Mk)51Mmx:_Q7yUy5Y2X9 IDATv&iKm8D~C%YG:Q-XIƕIfZ}R7 :5n %-r @DYEYe( )&@>J\ut51qcԳUP_3*E13Vcw/~샎p}$,&) j|Id~݇T6Mq90Bs'1nMv豽wRz}\o>yqE`j)ji> \t(f8!cM*it^ݾN8YDl~C}İ#0- dc ;nN9wCNits,%)h 7B&]wWnooMcPB7GTDr~B%4 ! ,L\@ hf6;8Ӗ ZI~Ak -h!&^:̃Y$a2'/ ҅}Z)hW685f کB}|@:IDk[Kq0?bڗVe؊"Z :UA+x>_f5o6:"+*PRL6eN[:1 5mhMm F4 ӱmiaE-=S]Z?1y68UIE >OXWjɽ%ҽLߞ  &?R(ڂDMRk5M @`tMqثŬ"cW`Bgow4q~hVU -VRzv$h.m}ߵ!v!y@>M@,!aU,H‰'﹜tOo1y6FjRk-m=cw%|Clx[h¸ۅ:TZ½Z #(&wR4[,U1*fE*A* cDmuϏվb}mjA R}z1B&'N:{$p~WQ[/ 2x%j,8QU- 06[OO[Nm34MMDڃVJ=X  ?IyV+ yD݉ ܌` $P{:Kac@Q2apm!~mV4zVZ31^1Mtq8~Q?Uǿus"s0-[́ҾmKɒ–CǀPd>U8 9_/Q B-)QW_7XPW(`1f%lLMܵ>vItFiN&_ &X9<4a-eA:Q*׽ \QPal뒜Z}nblW6mih;8A-lFl :}Nik}$.AUUla>ߌ&Iz6δ>^{k\̬Dל/haFhO ?AKu_`)N:I6-!QLT7 q Ʋ 1zd0ShGwu M϶#F2KZ;W6Oa 0[bT`/KYFACIf\9A զlf䠆{\#7c}V|}hk |o{Oʏ1H-@ޔ7~0jԷyaWAv(ZaP_a{.#7b,1~N~V_3}:ݡ1 U 9ỶMf~Z6c(LZ5`e-<-ob/Gӡȹ+?6&W_R5mMq>|Mmی G^ϬfU0f?-8A4*H);W 6B݇jGU&id9tAiZkS:0F%yo}36wg*7oVVPS&;McƨIۿ}CA};򣲈lSP}f(SϪ *6Wk`z"P0/B:=!(2+@` }L  aZb-c$Q ymC,j$Iȅ`1`)S8w^EA旪UcF9f.v~-d~~ {Ew%BRQ-Q!)kO;XStNĪ^LŃ!3*,QF;Pe`"nkVF?ֱ>oC(? :־1 O8\Mw lrijX{o{+ ^M 4K4ͽ4u]sx&|m Z;Bz_SQR\'p%o۟ß TU.dIJ$i@H,I&h6͒wo1Ǿ4yB] /8/rX $(gܯh&HO֋T~α-Ȝca$[pA\_ sЉ.@PKR,G_8~ ^ß+: D4NYPʻ|sNHɈve`0TRbi綋6#!BR,=CN :F4v%H4sey#"~?R3lcU>XSlpo%x=\g=0\8CL1tzNt\vq>Hpz`Ck 6H-e `D* 4,w$@\UaVϩa%\RQ6!M-cIL-C4mߧT3h&I}hk 1[xEo%YXoEz3⸺ d4%kHch&S3j0<׫}O9 xGVO467 QD}e[A3\K tͬ˚2s .9vlL$$!I-Inemi!vJpE%uXOO-{[s8hV'L=i*W mmvu?0|$_`s0٘}m|@*:*D!u{ܧ6A2EhP֝ H E(8IXR1$H+b 8”RլԬ4 {'m m~ttn g< ApQ0-؏@}&A/ F+;WcڛK8V4;5G>FAn[繴&"yO$&ՔdOA m٘5Y# e`z&T Δ>g_`q#R?Ix3>a~l޼[oOxaOeTk7gAiοzbQ?Y}~ s @u.@J 0bpXUeE} pH Z튎 ,@Vz*=!NX4Zq֪*w9+m,MHB\bp3b97 8Ohk2yM}C[`I->Gy$~8)OX`-0 d ^scm om/JB&Pk&ũc͚|"8tnx kz!CRk ~aN)*DY3thIiFAo2~ ĝ:7bk˭KgLȈe 7tӾwK]>2CR@`x:%d!BIk/`8c@М@a u,Qq pj jY]N_"oSKe7a&ejW@A| mOz~Hœ,t-q[!?(}Z<7x++{,+:oDQF" L:bl6B(]{&(&~2}Pq/6L\=q˵РPՒT!PYqw.g$P~`z? HXSlf}* ZVa";s&}QGŁ=Z'ύ7 b[ϘA f{_ua 퓋z h~9Kxܠ'xAjE $ iחSMP+w3rBfkZì`pX !M.gkG>ЌvIx1@[ҙ876#?wGOe@ZN8nY^~dk"cx wcI|6 n zu_/!*!p\wZ;b1 J8F|6$͍JW`:a=@mS)v_A(9LVTe$ z3ZNmkK~w߻e-Ãw,Ox*#};9:yEokZN8Dfffs?bHf61f ߃rb*gv\x}Txv_h V~\h8bkFu&ݽ7"o:^Mx7+n \+#,!ɗ W{ƫ1@0L䠴ɴk}GRKN'yz<^ﻊÕx|`c9&0W/|r?Zˉ' _4e00s?IoM‹ HX|)^{3;RvU{}8LXA xTa#8Uv:uJYӵBD Dր+,ZaA4-VXTǝYβsv0L-c|#zȠNtT %ԌoNsĚXt:߫;Isƛ^_1#};c8;/uE _V՟,?|s:tɏXM& I)sǼl%=a`8 I?OjܧxofvHhG 8\Z O}kRUz~C5$ Z?Zob]S`F?;bb>CbSFeV`*zP{@U:6 h?v$FXA[qη/*|p ?MJ o!!(~QXr d?Z]eE a #RC]oh2bׇh "AԲp dnΗV۱^|)WF]3 $|ْ4e8Aw gƑϘd; ؟,O#V@.LQ~)^`šlwcUߑXEV@1ő1 @a^ tʭU ֐ d㙑㣝O|̀6tC~/ Sy"XqXzg -vw;c9~K/\E__{^x$r)>4cЖj1˚T}DžOW2apYG0I LJĚi?c4N%ѵ" mxF)*}j#O+իYfZJ2WPV08;Q-ٱB. MIO .'?ԡh#kW3_H0q0`3Ųpl}kIE1F?R!y^|)x%{g>Ý?s$I8S:mKӄ5ba-?^p4`v61<x4Y)Z  T1EwRS) WB9IVUmTPj ` P% TTܾ̲ٞ  Ӕ-g M`3uW ۾p,)32ڄ'i*hsj};͗ 9\σg!ҫR; 4LJb)hsmEV/Fi/ Q#e*|iRax)xEZC:1LSk-@@a;|Z 8tg>;N;jӈK< r;أ9%`-iM=&m>_g+?17\518G3[_T/KοY1 !3)4YdUlO ;f@8tUqWR.>tuKEH $eh|DBBDhkqN@?D_to)7x$g_q1YޓN>pTwap/oeA'hu+ss{O pNQyaixa~~`P=8%OArHB}g ܖ>?Ì1$~u%Qnr#Z2_wy|,=IC*(;v`gA2&  챇~Sʃd||5Ctd;q w=@ Ͻs$IzVg{'U я{cX7<#sp7q T"z8xIvK.;SOQ ?z :'I™gUش3_'ssgaXfa:ǚFy$V]U@ˠ_!6rE _[b81$$e`2]l- ե^[oỏ?|۶ƃ,0t |) pg3??W( Pem<&=`q{-%~,X/!%W)J3=_j 5 l'ẙX6aE;U0jw7@ūxvW8+_*~ Μr8GK,9tp8`PNҞ(-hwhńun'EC?]X`YaQO(0CZ'wȸaimB20TjLx!!dtx /zb/< Ok ̿ +47|S=17qF^UXg~dw?^]ٮSkn Œ1,AbYlfeN;Շ29UЋ6w;*$- <+Hk-@5?ָkyU``8C?/ $H4ITH@'s s 5N㱇y;.ӏ;ԧ'st,,,t}^b(ݏ׭96V@l6~3 9k&`,kk|=XmR&Jn92\M IAK]$x- C٦7,qQXSVj~1'}R ~P<즩^oq]wrÙO'#N=c2___]Ut Ѧ:76%`'G-oGb3s nf0E%M2qve{{T{A#?h4sрEs>,jceXV ӄrMMY/N2tN.n8. Sޟ`(봭s:?Q)M4B?r9簰|^-5؎/f Va(œfťEVaPf佐n!$H+""FR۲m\t43MBjb\0$K&~+N\Z? ,p=wsig@9O|" ?u铙Q? Gk-<,lԹm.CU6'Π ~XWF| ajه%J%?J9Z:eQcrT~-;ܱse Lj< R6)kDwVd ﻗ[N@<?ga{\̾ tI'>Ilc.=9@&@o紤#cXHSffG8cٹc_qYBQ[/ÑE] ?n%>"2on;LӔsd6P֭gNdkL=%wv巧${ylڼ;bvG,U2P;v9Ѿr*) YxS j,Ï8ӧmܓZC n'iPѦ'?<6O`+Z@ @/ ߑeM% 6eemFOު{@`~rɌ@@a{Q۹oiU`0K"uPWw ®)i=So^~,)=),<,X7p?ioO|r"j?Zk9)Oe\)PA °k 0J 3%I,(׸ S \ݔ}}[nehbEE^b0@Ts-eZ3~ɦH@XQھ'iï7(d|&ST6ZwNݮ<[sa=<[v@sWl1 |vA>"o5)mЏ8.iD{l\,5En uU%U]Y(0ѐQj`'Mob-I˹KZ{vO29ϐF Xwٔ,K|!AhA[e6hj8EJmP ۂ(-RLLUյ{̈'#VuUwU Y'N̼kDlVǙ1 3릭_|wNg>Y}c'?)ws7俷;N@_坜s,//g>٘"rwvv;H=,HQ; R8O_X5QZ6ԾJ,^/+@;L͠r#c떧 <!Ǫ~2ٿH!˦am8RGsԶشr1}>3|1⅍puK>̅ 'DGӾ*B?q O۶|套xK/v{?^|_x,7~?%VEmSao|6SBe ;. j|Y[0XʮGE.;?n˧j? } ?L00"3TbkhE14Ekm;|>i|jm[ZqA~ь@>ڦKpZm?j~:GNT[N$"vK)?3dTeE\w|]Rrݻ8h?]QfhkM<"0#e,6\1&Ju^Qvˆ c1;3RwU!*xt>X(RLOӀ?8 $ +rcJ|x9x̱kNضO}?o|=+U=$mj[PXRVִ|ݵV,N.j@"t|Y@&)5I16 A^P1*-,*[PV;UE >  t$W &T`,Џ^Oزsk$]` NKS%tt5rӿOA4c_eoJKp'xh^q םcyȕF,^FY8JûD ei`-C~6n3_R0<[Vt&%aHhC?'ӌO@)QV=8m|!1)>~l-t1覈$k >;47&*#.KliYa7ږ WcE^ŷ'``A]gs.Z?J H-4pg4epm)P.+:@uHPʚk@4Cd pS`n}? ~S? $0v-M|C?L0ND-XxAI ؛rȇgʂ(0EAc wCj{92͟C] bi?HߗX)(j 7/(#, CjsTVA#!7w %W9 ۾j〟VNs$am.#@Pc20#q p,=B]XBjն zBWVzW1N]%$G - PZ<<Kx]ݻ rpA$q w$?!%5`| '$9S/0zұu{8K`۵?qے'-7>&#T{:- (}Jk((+LYHmכ7Z=bZ:?\y?o(f2nhx h[3j? {Œ -] BqUE"*qkKt/qppؖw'Nr4!O ?>&ҽ6U]Gtm`PoZkLր;%x'$5ptߩq$ǚ Q)K\a8 kyյVN'q@.7»~l?Jc#ud_<R~jwK/KLi4 Ba ioӅS;- ͗m?}]~lil9kV> {/eO}7_JmFtEAQ{A6|Ys\o[VkhxD̯{~]?kH:N ;7p f$kPI$=fbx(xEA6%|N\_v6 =0N2Xs֟63_DN8G/]\YQp8͏h+\!? qiqzBLA=&$4? O{ۀo ?oVkր~x0ba'cW05*) >ZzK YYpM<_WbRgs98OӑlLI3z2;7.V{G _ʊ7mDS ߩ "'\a^nhŖ%*²64c:Pê;߬u࿡m}4& (̤#9Pd0LWO\r]Sy%,%n5Kw@t t@2=*'ArO} STqLۈ~H $0ʢ'ܿb*lU⪂F[qݵ4:njdQO^Wp!]S3cDГf螅K 1×.o?4Wd4xp!U`z:XONj;}oo{Ω$o4D0e 89 5|zS>`P0_,nyUkmնV,BX H݁7O:^3H=E !/؂o/̬:ɋ}IDATfA bA\]$;' 4 KcQlr;5F$?o"Zqʛӓ@ n_lQ F( *LUssixYqi*AӳVV*kovZ^51$k3& NY@;JSz++JsE$X⛖cpPU' 'MkެclROm=9,mfTID $01vcZ--*hLn8[m[M^48Ў:[JӠXK4ebpb.cuUSKJ3<_V| |y{d",pЮ'Gu:.0&A$%4uD oLNpNta}I@6I@{wj{@z9BCVer{6o-j+$b?z͟k'1&$=&ف"f58 .{^[ϔ%vY,LӢ9a/5^P{[b:3пm.q_?1؏ m  o|7뽷"`bJj BUx5Ѵ6llԩvbϕ_!@x9cRs@,q#P(z T.%߸ϋԬfrE/]ZO= LE0Lwt75Ƙ9mok?<}зI q/=%  ,1Uu+JDW-o6Kۭg6r> < pGHY|~1?<CAv=@wQ}<T"+ ^{>Z|~Sp' n.@v]!ykߑEu u ,iD8[%חK-1BW' B4DRU+4/~msS9tt$LNߏ3PB"kVhp;scqĵŒkzU\w'eF4_/A7݉I;}y71Sp h v.|G ng @k+Puɷ;.c 5x @,ACP@dD1&wt;PkN<([S~[>Vb-JB=Cswrkq傷W 7Gh ~D/#$qn)gѿQ~Ҏ/>@O 1.Pѥ =g PCat;^D9+R`X>T.^8niJ60>Ĉ19`r 2q 3?'ַ=/kM(8Mt7_DZ* uVF\.>smVrP]D%X"EYEU{1rt}x3Ho G6Mi/18bw&kB3YD9%C{+JfR"0A)^p #@(7۬\ P.vk`af Lٌ+5U^USԶ`&B!P`*q5tFB،( #v,Gzp'&Y/c?={)O݆ܷ~olA!Xq{ږ{%sn-jZJ^ztBh; (Пyv]w_i,?薔.S 3GWx"/\үe]V\࠮8?ٯjʒݲ`VZj-kb1 f'MDgȁ Ʀ7`$K1f] "x܄ Ӧff~}HDnTc|tgE9lV].Xr]q8V"YP? &hPdao ?穽!?$Phjֱv 8נH2%{u~Yr٫*d,(*,11%(=!>D`HP=!$kDe'\ TP `RGgu(!(N=Z|pj8jVk c_Y"A9C,o5Q{3M )|`  a"=ÿB,5$HZ Eniح"jb,UUQRH Eb '$ 3BaE>~J9IEEiM"(:~j4>Bs$4mY-+X-&. Al+hǩr_7Uf{X?+j4F澏ws@@t %f j5ry߫J@p0]z "`D(E ˬ5;pSNU3+Kʪ(mhL7ҝDC% PV#1@[)>H*ӷCr*s\ =s4miZ&UX1ׄh%8b_ӣsݠ{ȏi94Q,u8ROA '@@1h#23)<~ry6hw@2*ةjΕg]ŬfVXJ)(*dЁ ckKLY)Ѯ׀B},DK_ h Ƿ:qzOki[G7A-YA dE#we E`?҉}ĩPYC]uɾ-PU SR%ZT51u*K@!s|_&tALMڜniv9Lz#ھu#nfE -V AYkG 174}Ӂ>I+>OrF#cQOC:Lͤc0+]~́@ *\$ Y0w?f**ʢkYɬ%UUR5E5f SVb"-xu2nZ; Nl ynz߁T2C2,_$Xc(MImTՌ)ˊ)C=<)yα6S?i38w[BhE;} yB$ .ڢ"jՁ:5H#tkk_⣣| ô!dB>X:hӆWZ ߕ Ǜd K[HT, T,*J-WDi74CbPB!FU﻾!FUBp'@h-Т!4qYtޙ/Y | -,"}g"gpJ5>D܃de ;&&.5ȧ~{pax4Izj))MUEitqtsQD{c_j5J=!:B*<5BVM6Gyi!=,{䥂%|Em,CcUhaf]d jIv +]:e= kloj@n z8+4ӡ_|O3x@EY.[Uz!V Hm6#no'>ь!\ udfDb`}8YA;O16)r9R]"A{# 'Vrk}DW|,Y HdK\zֱW +gAeY I̬".Pyx7)|JŐbZ[(GJwYXw ZG ըƠ4NJZ5tE_ȫG , Jx]!뚟Q@O/0'X[] /M{^UP Z;YV(.AD&]! H@ư`Jt˙~W|Z 5*^a^h;>D;z:20@|0L:O$J(H[v)jӵ[G4UF5O׃  a:* wu!8Өa\XzgrF|ߴ։ DɅY=) ۷)c/VM3]Y%]0 t@_kr:8p.e¼gdrFa@Ii)rHPȖz"鉡#wa ځ73dur=d3(IrwG=uASa&p[@H1 Fɢ;}\&`vH}go3Mw L?gbl? Ծ:~LX<`b,o>3xr OH>"|H?әə|}*}IENDB`./qwbfsmanager-1.2.1-src/qwbfs/resources/256/tree.png0000644000175000017520000002565611404701453021650 0ustar pasnoxpasnoxPNG  IHDR\rf IDATxٯ$u޿ܪ.Nlg$H%."k1Eа)0,C6?O0[$el@ brY{fzVKfF?ĒYYuT<"1 s-|㛿m_vC|_ļ,-Bt,^W]K,CE+ϬIAίZxpY.Swq+_ 2[D˪tdMF)-B|TLi9Fl; #_۪"-a)hCʷtT7/  㵷{"2`q.nLpqcIMӥEMXgI'*/VN2ڬI u?>&M$W/+|}4ޤ=n!'="1*rwOqcr)L |S?2|Q;{Ip. 7&sϬƃ#"̡)4umpk-;X|>OSo(Ԋ +m@( *%3RoM[sowm bQ[hfAȸ_;4F@b4Q]\q5@45OG"&Hxrg1U*?2쯾Q1 <Y9㋕q[xwq0G҄dmq1ƻ"ͽW\(YhjjҨ KPAUs9 S~qj消Q8ACGcQ) Ge횼%֙u?x $@h|WFO|<Ѓ @|W g Z=]Vyaz-`2Akz6$(r܋ R"/(H@_J( xm VBDnHU퍴1֊j4jvh -]Kh׸O=4, 5@aZM[@s;o?tct]db-xhM\U }mJQ"$&K gpާNgx!Zbq> nt1x4aOc?| OUNU0b~1G~ q|hʕ@@BDbH(H~h ! lqM T iС.^Wz.|!Z @xn>Lȡ ,O?,~Bcuϟ sDP$>Z$p|هxHklw#7 ă\l`Xb~LFiwN( yG(+_ |^1?/{"8F3_ҧWN \YX*6 {%Hny0 L 'hĂ !Ay"+m hjA Q>֏Bu5& =>¦0[Ί {煐|wL&6m4#me:>\N-MX lL9.A6PrBK5r``. ذbAP0*,_aRJF"x}SL~ꕏAg~3/<|d 8$kM])l~>~)?P<ܭ5akHYjf1dp ٧v-eM+˱md>^sMDҧZ@F*b !(7+{@Mnw5 DatC:•S @+i*17wgQ_\`bO)4EBHCG^G}-#FNp0gULFkoG>,,&[45 "K< sN7CcQ!0&NcQ'[wyaڑ 0f8coE7t x-}m FФ " *8Ӻ1Z"$pi'`X[ ݋R@Xv>a->p7<)v?i*@1 yh1wn^}1sZDA08:%Fxs|ܺ,3eR7?9@^EFEo^bw$䌾 Ǝt߮l&^nH 4Na@4) VeA F;ƿ5::mAFF]1 +b/ D4Jٔ6jN{l^.0.n3\t:Ad`%n-Y8}yW x涩''gyXM+Sƣlc@ SSFnF[20Z`;2vƠwi-ჴapnnհ ޺ot @8AGqupю۸Qtю!04pDuh]cX;J_9*2c򱗰zY!CjyvDW_Ý7t1AʸEƅ; KMhґM- ^ @K M'?k|yxrҘYZj[xݥ޴ ;P5a?a%>:ųwn7uj@_`\IwoZkJ $<26MX˷oM o٭+:uz4V%Mo.t|1 ܥUؠ|t6LlkfYÕl,wZ{l<(AKn:a {+o!S,4Pk 0ؙ@N3w)kA&B`\JpZm@ \~ZGsEcFΊx?DYZks[%ڝhf~u\u]C)PkSӇ#XuX?U Jmf0!LJFfGN`xP)j<P(; ڶU]A&l `8"Ă?ZY`= kv9NOM0h<9YL0`XUBЮ5 жc 3NvKkp0Ak@i2 3xT>&MmO@}b}W &H7o~0a pY@@o p2f? 1|0&n:ɻf$p^`3QukhB]+hm faQ{8 v@{`&P+ d3QuM`E_ى7Zb300H,Kƣh p] JjԚD 33ieY= {epcBTUA$!0 {5Zg`^x۴Qz}_o]BhX,X?0Ijii dpQZv> tSJZ?`eYk! " =Z(ҫؖnQu/9s )!&23",= NNNpr:V&@"2F#,sh:~E-Kx _e>,M!Eg1x9pf@E^xkj[CB(  g3Te؏TUN&( E=ڽu0(9~KϢH/zlsuƛeUx,1[o=pttcoQɂ@!%4&k s?G _3O;o \' [`3xZjpᐺqrzH NOP9 |%}||"Be yl^Bd);B[XLٹ+1N&Ir`lV8q\&R]"0 Pdd]8cvN+TfnHQPŁޫ 3p9 HDhw{S̵@6NR,4iB։@ B1.0`(5Xprٺ+X]C+ր"kŠ]\0{p=5F.VVu j3@v> ~"; J@|A}GW_P+L~C^l/bgG3ԧ5~(M =b!rl~`cPEA &YL(n |D./zZC̞`b iZ 6~f(&À᫾"F`k;M f~x;`Sq^L F0 `]-Ա0p@ DO yAf?0 :^jD c0jfڸ's dnlpεɼ u (5J~a6À}x( (QV)w2L+ "TBt" L+Ra.cÀmmF$hVD.7\\mt[o _>wkҐ;g5** c6W7VSpE4Vs:_+5Uh .fpk.xaflm׵7+욁QeO\3E/_5vql~ٟT]*TUr]= t]{̞㗁7!$hx `; ӊf9.5D'ɕ; vrtIˌ1LEYl}_/DnEn!HNۭQ.)0O6*Ӓga2h!% gOLuAFJcx<^/ \L*3t)%Mb'L/<|Tдv?Ńqr'"H! z;F)3R0`)%& sL&ܺu8XˎĔS.n/~4n'dY$D1*pP( ?O`X sܺu izɧgKʋşc:E`۸)BE$1}_ 4ːš$IH >x0')6~f$>ؼ3p?F—ͼ}<- 3`v*3{ 3`v&y lM-je?DA6M%ax][s3 E64͆e a0ӍAڟa!lQ(%F$$o-$Ei_!0͑e)Yjܻ fu.jyQ iIDAT @LG51X,J,<|@e8<<@gBPx4Ux7 EZ&BY0};?>7,5c<AJhd Ib*&E7&k&mxa6U7n@Jh}6DxLp!f 8^84 ҄$IU~ p5^}waF WV7 b^㝁vWU5Qn<X@&!G"dk ܕV;w_=U]khMP(m 1|0kb6\n361b u,fgk  Ư /장o. vp_>) ;=bǮW6"i' Pl' sl|zmxS Eݮ@;C/lkFLA؍BQxe'`GV-H" u @7{> `RNfAÃ0f3y6}f_(m(MZYI]` p?f"J3m m; rݱp7akMvȯq3 . ֨j4vقP)NNل^ <6muMFUu]!^ l_5jfF\>7emѕ|`uޅm@Yk % !RI\ lvpU;#,pK!|,K:00 {Ns^we䱮Wuޝ_^j\;W5ʲlh~qZx8QK>0a@gu)ڎ?PUU "H!@IͼN$/ mL=z ajݱkcuUV{0BRBJp\ʎ%a}[KwFB_]`莕<\u4AW[4ybؒ` ?RF&B]UPZaXlV;B@ Hh f([/4z_e콆~x[ īYSk$I|W('/ V6 i7FYU l/aU߀;$Am_ h{!8k/]?cP5֫kL&eL@fʟ_1!$RQ K.-WcRdY "$f9f}.e?1{ygW{?K$&~mPKubt:l6߅kzwR}0 ! VoC!81!p_4I%)i6$MPu |tk(u]C@ ISܸqzn1o>;fa㷓NDJ(!0Sr[F\.&޾;'l>ѤQ:*R eY,K, , !F=,7a- ]Eo.t5AlB i<\3426',yQBJdY$M0w]$I45i:C7BHJ;!"|DW4/M%)G4I"0a>!IXna\Y`M,+d;/Lk oEDe4e: yA-N W~\{->@W& 0, 3`XftvYuM]ܩ;N&ZV' à QV"y7la^M &\BkNG=/M54Q/r۟:̤6lubM'r ah ;, *N;B+ B]k)D@lvXaT ikL@H <-HZO$DJA- A n%renUб_^ u\~ w:@ٯNy4 0E(o} hga8!x;k. 0a 0, 3`Xf0̀a`0a 0, 3`Xf0̀a`0a 0, 3`Xf0̀a`0a 0, 3`Xf0̀a`0aiQi2IENDB`./qwbfsmanager-1.2.1-src/qwbfs/resources/256/folder.png0000644000175000017520000003673011404701453022157 0ustar pasnoxpasnoxPNG  IHDR\rf IDATx}{}7w{wp %Q(29~IvDJ\+cW?q\$ت$N.[N9I9IU\%Yv8NTd*$e=l @@$AH8uw{w;3?fz7Py߫{<fq7a|a"QV~铈D$c NX=z=w~[m|J082dSOƫC6nv Kpth.a/TJ4Y p/xt;t:tљ:XZ\DԷsp p -ϻ}Ƿs0r|3'  t 0 ol pnqJ';6>P:py<}X? {QW PpXlxcf+ m5Ⱦ|ưM/`g= ɨC$T-/(1A0 3BjE6y6<c H_VG.H `Qz_#ǩgN"򦝌w=ZXZ\BNE[Rsyv_+[ﻎȁdg:- mcC3'2/mVEz v zjNy}Yĕ[{82wƂ6p5p0v*\6 "U,;t_cGh#8YSsA8H%_XB{Ņx{6:'Au;>>0K&<Crq칓STVc^p/(y/g׷ɂ"|8Ȯs" VGx xl0E^"΅@fIi_~]^]G3H\6,*#sg?Cqr^ [{r\:M=8Ǥ`y! Յ Q P еIxM ` pi&[ 6❨޷ }n]u>CKjƙϟ_1x8ENDÅxr__I <@8sc~ڋn{maqV annR=QŔUb86Z}~ :hpOq uMa!M?4g>Ȁ{طo(1)Bt9Tw.^łYB _yS4hJ#  cN,-.GXIً>)|YKWwniߧ/EϤ 0h1) Gawn+G1}ojmGV2yz_NPL`ICC@II6t6f pMbzln_N=yˀI+esGeGvP0puWxqcˋm|Ch:V?z|{MțL8xS+M\ًCx*](BU~s~@怲g4ϝ;w 4RΙ7~\ =t$z|qW.!h?Op&d)||HG׾.^3 p|#`4C$A!E!UEZpȅ#R~ q|,p=|ul_ټν Ỏe_޳57%tOQz`MGFgL:;Ͼr p}8;n xT^sMqE{C,`zZPh 6(*E?ID1ƀF9{A$лhAد`UB9Dx5B%:M:ȅ_cD#d);"l<]oٷ3\ B;^z|S)XN ( `P* -#RYZ_eh}qZ.ܼ\yEMf1h@ ^ؤFp}qՍ~+.VXw! >c ,&maR.О EdK?~b%mf8ph۟~;^ Җq}FVtfyEGWW@)L_1TcDHB0$!hmOxb K,n#01"7ՠϗ_jw]XDɶx!c@x Gp@y)b;*WHz,IĵDPG.vsA-:N>(y€SLI@ǧvq2}OQ5=0{b= Qi~6JάI651$W%'SxAm]? IPcT:iX{uk B,RMU!gN[O?]9< #_XGPb |Kz_AC~5]i2 4 ` Qu?4Dh:BL<٧P#ll 2pP5OBgL0LlK{ڟ7 0K9P  $QJ@ :_ 4䘠ݸ4AGe&6hNjEU=S?eLX_$|)h0i9({Aye+.YJW*%=ԛkM#LĄNh$04gH(-ڑYde4%22DqO#(; 'uSoor:#`!KC_FTM<1ApغؑgT~]KOˉt&ٝ yqG4B7 0ψ1s"42 +zW^D_G% JNL'zrz6 12C ~^=Qń"@v ?L>vZ‛HFΓNLhԥ4O:tOrz[ ƽa 5&yby0pPo42+"@pdO|MnK(•9*l}[2ĉ02K@Ũ3pҴ:f-Τ}f7EG BMfT%(C&u.pP5tAmy 'ɄH!0u_|15s´X~(HA,|  T3O_!H5C[MZL/t\ȓ>q`\QbD!a:Jdžx-  ˨58#TiMz}NT4aB:i,уQU]G _G%0"{(]vSM%tK&EEuFA tS@a)\7/SH8Ҝ0d,G%Ƀ t4J$S@.'c9gN5S=JO#D@y]^Hb{Lq֡ EAEx:*Q%ceiŘ'}q6糐xUꮩcL[~J 0l#,8 {R&^,|_&zGODZ|[}€Ӂ*%Ť>/]a@/>$#gA5V%1DQ8ԌQ;"gN?RhKOX\D.LɾA(k@9Y1.`D0MP4_ ?MZl±8w&"o ~U֟i@V4J+mJ|ɦzq6^PL&!Jz"78?lP1MJ9(0͉j- K~LrW:0%q,!GݪalǚG3DPEO^PYDiSGa(w<;ﻹT{rP<꺟,/% #nOŬ2y!V&is7@Y'%lɘi'3GP_F $G(yAi࣐/,G%0M'lÖ&JzD e`F{ 3&I T:Ct FK OsJ 3Xġ(3HVm2d|= 7j-fPIZ@Y1I2Vy/ʲ>t@2\L}NV,ȨJ` &ώc_t.8Lme'VGr0/R/:j/ (s s22݁xJu8( s)Xv}|07-PuB&^4 UW G%Lx-{@53 ~PK/9s!6;#b-!>AЅK/&w}' GF;M,OCF{4N)D* ;E%$Sc##3<*V:B]W 㵺$FɎJؽcjjVfH}$]W1هPrPy\4!LؔB(twT9"5]݄|H#?`mW7j#Io!_J7u$bQ!̪B)6ـn ;s6hkACA&G{u&я/ɉnGJ%!MA0N:Eq6$ J 7BDPcI|DgCh,ƛtnN<L9,ŵ@P(ϧߘ#h? natӳC$/kgG)ڦl]as/.2"8H 6D0~d D '5ON30{^]s& @_+J `d{0D`~ SMCb!djc˗dsnws8,b?ϰg|22„!:~z<=gzÍ]u/^I@fi!qOw{KOZSyibJ!v}^|L|c6|G#d AU~|r 0^z/T 3aEقv|<;A6GpBFIDATp_VLZ6G7i$j͖<3 G>c'VVVtjy#VWWI?Z"H|v4g В@{6N`xwfv:/"*G<>Ϯ^>*el ќY4?B!7x䓿{/ qr _ 3eOWj| FV$W}wpPħ1xVV!ZDBb%oܗb ܍ "#sLcs&k]{a@%>OoÉlCpm D o}϶7Hḷ0i%셼Ej5?GH703 y=,S|nvGw܎ՃQEW.&IgDS-+][J|*aëz{~,_B;IB(O|$"*|˛qױcXYYbR. Y5i8 C`wu _f^bwb_'2üTI뎷qԗo4Dq;D$"MZ@?GX3-O:SqG5A`{8+||U|%VZ8(|B̠^˙i2n`?`r3O?M*t:DgZWU56Bxsg_¥}B,ε$I­b& [0gN8? cOiL> 1 ­w$ Vw:85\ك 6` ea7cf cy}GIf(:ϓy"A=;.k_y׺}=j1C q ?̖B cC{IA=~^BOS[%Tc ?dxkݢ?1϶:cShz{qG% han1L:{|Uoj\'m黒;qc^_h^fct:5 JuJ%4NJ,-J3Kj] =)ZJmbɱx#km` ~hk nW^M 阒 Bշ|q|դҕiq!u `PBE@Zg,""/ SSv;UQT-*aȰ !~G_{誰i|Lq"RI =Aj\ zeW4PԉmBf;WR?FAC>h4)XvyJ=9n (Jo:ftϬ-8&{"Pi@Wc!9*%<ݶn]y՝,CƼiˆMݭV , xD 'MOH"qSBSe5W E󝙷{tKX]go %* y=c!I@@W* d4q1? (X^wW,uƇ4D$7AWEfEr(C.p{xVzsooT. cB/Be28fz5]U6@Y5]/h8SNQ?0LPh|EHj7nk,'ޟfϙcyW|faQ$.4!AEMLKݺyB 4Q+˯3U,m @b_:uۦؖS+񌩀Cm {6n}eMj a bL@*TgUE4dre@Xۨ1U"N@(s@%?5h'ȴ>P]xV 0C^ZW,Sc$>MB6o,IJ~XMq,46bm\m#n9qu?~9vC~$M>Tȃ G`=M Ϡ%Q(p"ԍtn2˿BY_v3}FKnAn7PDg^ދb=P4ДgnK!٦|uM$a? eLU93Ff?d0ĞqRav4}u\7L s ˱ٵ@Yb\aN n{4vu(B^U^<`?ix{$v{emz\fN@XU-VP/"O'l&>9"AfA @5~^ OuC&0)PJO >"DuW43B\: t2;~s Yz`{#{*пTo$5W\vZpѪؘWu&;ڮQԽ kJ]v*ʬ&9 zaqS^: {"(޳דeSfea9tw`^R-Y|h~U}D$WJE(ugpݽ+J144N0@J"DJN01~'Wg*a\@68{<<Pt r_}G4z1FzoU}3L8w#$U}N@60@ o YD YZ4oaF<8uQ' ДbV l 5:#MwѠcϲ+O`ۢR8wB=~ 9Ra!¹<]( ԭWb8gij#kJ8Sւ:5D'Q m#C3&M &1VMi>P+p@D?T3PM@tV>?qb[N?ZG83@`@0}D]v0`Syo9VFwv;[waW^W ("q\'7+z}7lQjT Fd &ܼ>ÁƤ =`ȯ|6oۃK7׺&):B8a\aKOxCP*'>3 Iz5[`}c_t~mߌlUFF!(G\cH;K5(:m JCu` wk7X _}zwpRvQ@n:9. FTT#m6cN=V _ٿs}@}1n~J {_ŷ󍮿A, l- .M~'m'Z=OT;v'>>qBÂt ŶWN'= q =^`[#2Q \ q8^{wdϗ炮"1"Pϒs;r:א-D=M+->s}M.q@l#zMې 6@6 _8@H7,vd >n^[svB?/!Aj )ЉtCjI@P,ud(5'Yxl0vkoos[[[_=3O??ڝ0Z-XlkW__T-1aB 'qHM] )I'1vu/= /3:pDDHꋿ1>F$@GHsj9mݾ~ڲ`Qq4 H ;@DQS@U}<*_˗/OWaZ2R4F10MF K%D=>P0uYM{^V a<}ď! %K_CrOqA?Pchh@ Y!sTC}|`Aaxi֭'o;[@VumGڠ(h. ϼ~y C9!CČB,%I gepSkkkǏ0h@?WG+-T-o 1{*=xr:g Х D,J^Ĺ ˜hć)c*N!BTf6j _'GWc'GB{+!"줢PapGo{V0> kkk&^~qJx8 5 <4Z$ A>YrS@!mdpS=w66wmT1ƞp/UX?B4b][l!Jij=6k8 3D"{HSyp6\ܥK~x  c:֞s.@;v4<;t^z0_7ʟ;Ih$^`pQ %7h!U-c_o޾0b)D6|}uu2Z?^6`F|Y̱@ H{ihc<.C%GGy~nȏo;p@ w< O~vWh'!}ˏvC#OO~_oh4= ?GC8K P6o?}'?>XZZ:R- #WWWoStG yv?c u| _ş~G!ŗyd@L@ih ?#SOWO="G~W~|;VVV8pXŷVFV4 #CU@>Y& z_~ L&8HHȈH>"G C/39R& 5ѻyGƦ(L@rl8&9HRLwtcO1q(CV@71NɨZ}G_|[^?Lj&T-)H\ KI h_Ȟc" HC4xC:v/ K1=ڷ۽g=v4ޞ[h+YX Ì-.=4?0 Y1t$j ij@-{ZE{)xAC4B &X)(؞zӿ)T!jHӇ>I 82Voo>T]zĆWA ި&>B^Ɠclzto߄IT?$ss i ozR7 ͪ )$/jY`nx?#.f W3TS<+/v{{&d=yz@|#;׿_bz~tp?Y&A}=?\ ֠LJ#!hs38L&]YtAg㩿 .^ y<ܘuwϟ38L \-ݟw}ﻎ#_{ O";D bE̾INr&D@0MV8L4; a( ȓ+5iS Fj/$k3 g880880?zf;IENDB`./qwbfsmanager-1.2.1-src/qwbfs/resources/256/rename.png0000644000175000017520000000717211404701453022151 0ustar pasnoxpasnoxPNG  IHDR\rfAIDATx[o}EHI@%,@`ƨCz@@t\|p"4iaNjPNƉc’ЊN2mqy>xpwHv3JHE9^{ #00 #00 #00 #00 #00 #00 #00 #00 #00 #00 TGQIRԩ4p3]JQ\dK/Y73?a.qߖڇ[vsꊺ斗wmm(IR=~&!jgB'SO}u7={h߾}"&eϏEQVdȇD2.O0/SZ[S0/XwOoS,ֆ-+HQڮMeœ/]cB ôj%vA'K>~<[kXխK7~9KiNug.FSinvΝ;zg~(i]0h;6I<N8w>2/GqfEx˦%q~. a>-Ka:^ElPm@|:ٓ?p%XeC ",:eM佺xm7Kfϯ9,z0?W^|eA ʧqwI裏?~G>|-,.E j4$za]zc~6??wϟH>֣(cxk~aAZMT^ɓ?(|*V]p%WR?tȑ#_XI3=6>>~ruT{73gΜ~/?9cZpwtx̙3$i*0XQ| |lf{Bv:VVM5v߶ӧO=::~}e7Cpَa ӧOx)iUccc_޷opWuƾi@KC[ooGF;:f~Q64= hu &?+ٳg+c;wR۾~IpKҚ|7[aB`Ν#\>wRv;[Y oyB䟤mM=gr Э z%upwtR\@::@=__wlgtV\ˇ] |sϥ\@g1t 2g^O>zmwF[&q}Eo #00 #00 #00 #00 #00 #00 #00 #00 #00 #00 #00 #00 #00 #00 #00 #00 #00 #00 #00 #00 #00 #00 #00 #00 #00 #00 #00^@ٳzS8 #DH\;n6;kf yT"`͛HUu.JզVUo~J;sKWj`cUZZZzWҺ*A#zV{ҥɿ>Mwy@~~盶kvv@SUwozpKK}}o'EE"i"Ӓ8?OKC+++~ ~%iYҚ|ͦ_Q%.y^R$ݞ_+MwoW%ݖtG^T(5$Xtܸvj'{z7z7I/kSVʊIsW\6ӗs?4/iQ>^I|?y['2==ǺrK~|m.!, {i7?>.^ʅ oG/5|'şF$/}^{Zo?CO>rx+ ]_]z睫.]%},馤|,ۀQpPE%J.iDNI #ixhh>Юitne=+Ϧa$R8 g.˭^NZu =mt6?wt3keX nt[p9A;_/)eWhTv1inM99MnR7nVOOO>??UC!iV>n_iHitɇ@kT> aDҰ}}}6>kIrKKKss7 }VtaÂâ;~%GZ o٭5'i&T|gN2s.> pH r<I4aPZAw ~hOrm]`6~%<~ZKN҆t3I/'nKI]/[p^ Sa+/ N抏'wm ?9Jh6zwnmw a҆k@u38Ӹ+09_T>R.ӂ0 (~=xWRmM@r|Ӈ?y'rU6_i'#fCոPUcN 쀻?Ivua`Fa`Fa`Fa`Fa`Fa`Fa`Fa`Fa`Fa`Fa`Fa`Fa`Fa to}k=IENDB`./qwbfsmanager-1.2.1-src/qwbfs/resources/256/read-partition.png0000644000175000017520000016242611404701453023630 0ustar pasnoxpasnoxPNG  IHDR\rf IDATxw%Gy/>qĝ3s^弒@ 5cƾ ||~,cLw5: !ByYIͻwIUO33AgNz e ө'!Y}!]UƵաldRt; !-r[.EJst q\9"_$ wH΃Bcs,&pϕq oEp*K4Mݿ [vl" yE_Q W#t=Kn^{P=A0!8F~Y(? @zNP+Ebt:6`Rܜ^S"=/_XK$>dܵ\OкbA}9bqƜ yLUGD1fh`ÑlQG @q ̝.s9飠I ~]Wl![WJ1)45"[ߌl] Cs@?wIh6@<$S {f156~||C ^ #A|H}99ټg듩uc @&CC45m% Hշ, P*Nr r^PN'##kRwP/S,s , /GɊKӘ={1y&GAp#bcH !  ALHM/+οkhnKcm#&.YhlZTyS(fP.1;;!8YY3Ny9 _8) q$d%6y)DtXKx#'~сCF_.>X,~7U \H pTK^tMߩ h̦2h]҅Uhi[/UoP*N8;|i iΌIO%%QZagz&xz$i-H$u&K3_.X}> gE"\ \$g+ ˟T:{G"гl.G@('S' M$A(E@$`( i[OLQ{HfJ7 js Hb0V#XBpT u7y(Aof1=>٩Q jGR2yN<) 0"I<&F*;.ͱPD:׈dL1\1t1(J_|7?E .O>~׫[f@o6AX|;2V_x?fF1=1zT[ PPQ#X@@*sVL,2I Rh3>\b -'S)ZJ7K <#g&rC/}q!ȵ \$nLF2zz`Y&4~ S0ufFA8<ξ;~-2H^Ԟ |(hsAj&&q dl+@15zw\_.sbg?~#̡@ҁ \$'n;Kk VڊyYXO`#{,921"g1K(lsOl3 ~!CJ%n2e x%ZB@2Մd&dZ.I) )^x;F*(NWP\Epz},=w>1.YҎkv{3`l0Ɔ0\50少)(q$h5@3 ~9e('NB`F)AJLBA`"$L*ӂtnyX80pyAp\*|?x/C*M.'7t׿7LcY+]ef&1ƥ^O#rCk`0u&m(*mThY?$ ?%^~~Ce9-H ^|q'DTCD E}]Ig*~=26デ1tb|L'| {K*<ԾTЄsN9 q`q jM$hZ)O * (!(Bwy)Z%s.ceN.jwO/}w7|cY k]L&bżF/`@E*wxN)U1] Hԓ $g@PS҆K d*K* E4\tTfg%3Hoq˒\$|OϾۺ?Hҭ=]tHehK>9$@+xks_Vag p%P].@<.I]/ HuIl/!k)JHg @߽#?dH' nFVvO&S]mX 4w0v x5Ѹ)=uW8w?\~d~}qY[jr! @eOGL=u;waKPL бP.IQ9]Uf5}^OX0P&GnT) kV"g ăY'Z'VZ  B\SHB w;FUQ3MH(c๟33(g><>T .pr~԰ggu=<ѻfVx%X"a ؇qh= h!Ïexe$ ~HYࠠ$TeKXIL] j`Z.\Yěy&J|zo]P/t G(G'No ^s'jz/ϵ7} ͼui]*[E y&D8hóDF507 fU?z jί$8y(aB̳* چ@ Ie}ZGJ~7YBe1YPD~O ?rw|% @O?‡o׻~6n0ҿ}/"Ko6z?A]rZxS@p+9SWA 5R.sR;jqEG<&DJM A|@"eT$Bퟫ, *}HL~~tO 2wJuf^̓/iA!?_<^.|W߯*-{6Yk Vo0||X vwpB[{Z :S9^Dye ~ֳ Xq{,]xXjُPP)_ $H"JvR=Y$T {_=[Kyh |%82nپvo^s|~O=V\E@p0_7~7 fe5z@O$VPJ z!`Cި9QuЈhE$tụm}e(dzab~?@[G "J!D~ ~#ڹ/dpkނT"c8q)߇aB8@ pk Grm;lJ5Oai:m@} 躈,_JWSI Ό:Ѩi~9^RACm$uwF`fjo P`e:~k5X'@GeW袺Vpt_!B 0EJmFH#qr,aU2c@zs^u!)5<MNU< -z/DBf0 ~21axbR=J`&:3-;Id˖kA"{řIp-Ȍ;J~"W]Z 'ZZ I!T^ d, \NLM<O'!g$$m i~8.yPD ~]zR #x⡿AavC9Ljwmڱn&s-;܅(M}?AKr0&Dr{)89p8 RCYU:bm1y*0~]@xh G'W+ +ID#sB캹&@!0 ;MAxV?`wz 0qtg| Fs~3A2FX K\ģ_(F]`]l  y#׸k[%0pI 4/Lκ3[Xwfv? ׵A~fJ[PNF )b8F<@or(J}U/Nd_H"Ăs|'Ԕ98HRI_B50B8sއːoSB.4P3Hu=X} ,3q >3a̳jZ4hR/k7Zq(l>yQ^71Yw`JT "*< ?s"jZsYh{jkT+#θ/j[`Y!!P>f.Y{CgTym |(tu~i]^}'<^z?06rBKWNsp$խ "J-t+ڡZnћ\' Qu[ @g\(I3CHhh AEՖW!v>z-r MOKR=Ut>IQD‡ox[KWgZ/æqt#(LV@":ԶF 8ӟ8!NAʥ>#@*ܟp~HՎA}= J}*j믣(q@wJa77@$`xz LtPp!8e"_͔$<ٯOP*{`% IBףT} ?3i;g=Vsf#1ăbx3'֗uZΤyb,\f{C=D)r6bh)Dt&T6ыb",87 Y?# a"J_@8ګrǍOK<2/֝BOzJ*?&3u?,7<Q/5aJ`D،8D/=h W߱ک?Ѹ}8ä6*tׂO MC(U8*1\ w^sM;\IBaeB0珀ߔq;A< 4)3Gy@JhUkPDg-|飯~S"p@-3믺 5o~ dJtN5a0B2!jXC_5Lsڱ'1C~jA`uhUD{~Dw,<~OkƱ<? slA1u`5o@Ӓ<_ .GޱfG[Wg[wp]ę(Wu$ȹ}cGkp0a~W?s&˄8Q`鄟aj]u9f`{NM9.M̫ hU[BKд/=o~D\q~kvlkmź+Y꓅k_׻9D [JsoOyC$F%$!{"<{qa5p纓Oߋ= X~Wqjf?6uuл>ݱ𜤳Mx7O.v%moX{ͭx^ ܫzHUKuZ g<ĴuU?я$Crg =S0;t[ةb+̀1!%Yr_;^L=Ʉ #9` G˧D_ELuո|o9Dg.$߼>rϽz!ݸo; f~'2oЬ 5=]$fnXfi-p ?͓ iFIn1TR,{ܩ3 NLcW"}w}mc Ea#"p@?7~kǒuo|X"O`jldGE\Bhl ڠ=INB ڙߩ7d, ϳ.Įv)u ~VԏY&"SR#p}6oA1D g$B $9\y}Hg붾M&Q{ޟڪkFy&` ܜbW)f|QYN `#7}$ԳR#Ec0GGuSdf0ɖ3;"` Ϩ5E8D+:^kEpk;Dگ~   #tҭg+fq3p s<{M|)Ez.w^d6y%0tӦL b?K_n'n=֒m&EtWC_Ֆg;1" 45 ? rGB"R ~rF3~_"_;/>ҙ;#,-kt gpuM-Ziz1w'J?sǝd85u~D1W TpjzǨy!{8@V7ߣDu$5!\=\W6xHH,rEMW%dsۑLn.βALwj=m+zkw83cCL&wb]M!;Y_to@5_D(G!w-qGqc`hHx7 U*0 26NBdL NjB@@PAйJ| r M؎p@ns's .{#xcHXV e3 0֑boSaà8ѱIO@NYA8sFrPmswdk1nG@{}8k&絁0;`kVe"- nAYT}zqB? }/RWy'X"#/p@"J^p9q&)BÝZD 7B1Oybb^]}z@u0 l)9a'CU? Nt 3=B1i?X:iyp$mu؉%0}#'`O@~q7!Tt"]d(Ak_~~+o?wƘ+o6 ϨE\7=' ;˂yVb0.b $3B~H0uίY9~Ĥ  X5 {UX @@[VcQWOw^ 2²&1BQs_ 2\9~lmT?e, ^4us)Zcz8dž!4άPP)s-R)(X,%Z+tq}-T?TVq9vD'=qw:M o?BPf ]1 H!!!G"]D&D2TddiǑLH&FBB{ BKLjAgP߼Ҩˊщ@ MQo0/װlmA YՆ4h1R@rjU^S!2>q j惜UUfOq|>BUN.TLT,I &J†#cKBTzAQZ˳2}KVqmi}\oRʳ`^܊_9`FOfSIa ~c׿ݳu[MGG8sL<P:r@'!H Hu+ Ps vDeP-8׾ZB|.3$D%RwAH6Z^H Ty9zf_$T:DT. jb!@+N+Xy)Vp xcqB, /!~][ol&H0ֿ}su8n&M71d(1/  !3Y" t2/a PߗC~ܵ='|y铰P N@u~^B˖o<*~ :> A(H@ AA2[:#U?0egfAk3P ~Lt6%Rhl];ֳ uHdjģy$C(1J楑L5"S׎t,QS47c7'x+Ub~Bl-He=wu{٢ iIGw, e܏b~1Yz!( S@ ϩ"!M_fP2ģiYTӰ_xtχ g,JIx^=6]vҙM;! Z( os}kDתQ.LctE[B2H{v z`)(zfK{r`W;/;z!X8k@׊д =fu$J UW*`n_" H$sHjB`e~.Tr ~0T.B<lk6n8*ՀS&J\S7-54{RYmUonٷ(\PP!0P@mTFDEƸ3s,W;*>+@[AGfҐrWOe޻Mmk`Vl$BO@ 0h 'M:n ~2c+,Y`ݎW!J]z,B KqBDU^kD{ϕ(g1yOwāT'-c6`-U*=A4 RᎁZwmP;ܨu^>Nz-*ٜR0ұmK"r5G*^i.)@sjѼZ b%X"w?lTᗋV_V,]~ROᄊq7F~(?q9I'"\XNM IpBH(u2@VQ'jϴg$eAl3Р WP mTNO"kAː͵׀\\ P][P Ĉ'} \9i5AyI~^0 XU Xk~y 19gw9Ε('grEkC%` H![*OD&C[CC#c$c-Z:6:~8H* hmP-NxR,(M/vtot/X_#(ұlΕ3cAT;&]i_mT d @ %D.%.4r+ C\JT$@*}n>z@QyMD,3EKI\,|0 +UcA]) YL_s3}}{grvҰ1 TKByfb/~?1&5q(ΎlT? "0_W(Sr5d$/b X_94>^PJe5@) !Deޱfo?̲rue;Ҿjr`~#03[gY8҉#ȡJJ)RJ<2J#1 QJVnؒdrޒթ5涵L][̕ؼg|QĂQ ~~9@TBתau f8,N--d/@p2֔s@!e&;Sw<~ 7L2d|٩KBUUT((/ڒ`@TѰmi_nrfkC5"H7h'|苿9{ՌΝLz憩d*ot4Z:z20/B=Bdžr)I:45>8Y/ 9tLGφeӹEZ313t_4r0]H1?lks?{-zNY7y?ldp~ d d~"áv ]SȦT4le+}!Q-]QR(I"gNhqp'_xщ'~򳉙ѝ_2ֻvزWLe:qUD%zH*KqĨWͣcC/ԍ;9x07wF[;ݫweoܓK׵1b@ _h(e(e~]\z{o}>"97{5 8ٿ_oE}`4vUxb+J$\JC2d;#_*c1zeIPH%~uF|~t09:ZطGIlŲ5/zͯ_h"4 YTQ=O =:qdx!K:{vi^"!6=*~= @ 2vzxMƎΏ|8&c!ļ,]񶥽k߭Wup`Cp#C5 ͉# #l\ d7g:Va>Z=C|6ZO)C??X["70LO/{@Oҡ [$WKK\+if)?Ύ>PK-3T&Kq740/Sd c5{CK73#x2亣&sZn`monh^\2LU0%* V= K饾ly7@Pf LYu  -@ CeX8'p~tpg?_ {?K&]rtw-6Sb' c K723)%`λkxcę"D|ŃNh ~0[>8JIdֽ~n_[\C6|[ol;s ŒJRs}2Įx5. TQ/}瞟^:_vo=B/'LS+Ϋpjj_|iS_piw4kMgsfb&uUP Jϥ3z)?L}]+6cfjV8LZSKGnK$u.3S%h+ FZi i( 't>1UmT9n)bLvZϠ c"(?/uoz[~ijYK~8g'WM\yнrs?{p`_afl@w28"w'9)еJ0~a9j8 v,ړk1@zH#ثjGs'~jҫ EHqkCL `#HHCS_'{ ZزQO=W44/}Ol]vM|g/kXy99NX1|En* ᜂ_1怟WXF:ӈ%oj VRpT[ 3SR߷E5T0Qp P9H Z x!cm\w7EP8@ Z;OZ[lR|c[ldׁ;<ܱ>ϼ`^RTŔtL)?~\~)M:W\5qpH۟z?G_G4\?PT LݭmI7#ݚi. r+c{;(!?5 JF9#2<3wF=6這 Ty@5 PYE@}vLI0D*AI-Bj}@$`~񎻞psc}%/z=?<rόYĕڗo?GpI (18yB)> x]{#$ՌQ`K{ݒmXl}+&FO0b;FPƉt$SHiqmaCk [Ü_m&Pҟb?A*߻3/@B;EMˑH5 GqsP,­oy/jJ4u``|\ME'Ӎ3r"U7LD 'bqr T6A/8'D@#Hdy~a r&&-]÷٘j,~©I$j} (avzDI:1\4iq6-ȩ聐!$YH; LMqlT/ ?d>ŎMv&'ʐۄy,4vls&UD'`"}5~FBBD݃$C% > 9qnx􆺧?I\yCAؼUoAx*gD>fp'Ӎ+'{L6yj&B=?=k񑃭cm#}/ޜkhh5w֪'%<F^jyspSu e}P!(_,科6 [|a;$rPk=s0pcoRUfׁy:\v~KDxH&25&GQ@͢ߦ(w>wa[tS6MwSB&s;W\ڿ%% - 3'_989vkgn8's?O,a%Gиd=`>6"}[I>w=fƣ[D7͌u}j+/udZeNmKkݿbu?wvWxQ9ӆx4ɕ~1\.0p6Vu =U^n7Fr ~(g vD]58:B@u dLgsW4Q] n@ՠe;eұRX1tAձЃ@=.%?XP r($? b:|knn Bܠ7 mt%Ou˜X/ZeN 5-ZO$әC/uGpԜRK"l3彏ՈEHw}>d P ~ ~(槀hh톗Hlٳ1Մ )۷o2) Q @fq#z9/Lz(Tf9~p; yz}JOrar5&ѿq\.>]mJ\LyLG[zMBr/Z\?:hA0W]KV{9i磃=ЉgLKH$ +j:g{ӫ<-z\\Bhli~G_K3&`D@#˔ʥY2$X5˕SHi;TM0gCyi`ó; XBJp DT1Z:ap$ ؕ!u"9.+u Ka*z_Q (靻q8_ ~J`˞"UiK نW=~@Խ%\XUN`W?܃"@ U5WW"19(Ƞ :E-@0#[߂L6w5*qJQr $SMR 36 ~s?KgZ@0`Aœ㰑R2RK@"x ʶnC%HsHeq=Fpt ~''N.} /@p m˶>W-i_{W?Ֆt[z'Wn񉱁uGpPjU6q#T4.Y8rMg0DUѿۘ!pG 6*\(ŬXC4L P^>s"4.Yd*u5X SL.M$Ҧ#?T{ws@o b?&u&]=x4J $)\I $B Q+U05E!bDM 3{eD@0g? wX߳jra6Q{.0W=դǺƎ镛{r_\˳'TJ@RM707_ ͑y*h9ʩp8&> Jܗ,R(?GwيTK 8 F]O?̱,s*z0({"M0H ڱGs~ F*vj"^(?Vx=P,Kn/ t49rx_m=۟rG9z-AޫuM9}"5䚗MuɾOlLA{ᾗ C pm^y~3#8 e* !8Wv]΃X~Shhݝ[QC  ΏKږlb^t3J|#*f |+#=psϣ UÓCJ Q4Q!5`뀟xfZF"cw)BTp@yc-[uł c';VK$3e j h`,!Kq)BV}R˳ҒDso|p*]W:ܷ>* _?]xG >:1^"%lNdsr[0O:?fsMM-\Bw n1WP|DUMpxJ$f(/ & Y\[aP ptcsr)ؿ{_n07ހ rB^GTw<8V}/+ߎ#'ǎ9N 9~#9'Tj$M$8f3q='WS}NeV z窦Egy =  Izl@رO#E~)pp.BȬ&'H,ށh,qqAp#hP,2f߾]hrИRs!' u{U_6!U MtB ]uv*6IJ^Fl VDŽأfXO*eQѧW.XWR EM&;zzUSLu:Kakc&q`=Efn`ҵ/{dt,ZRD*5Jwn[*ݺCYEƎnx)~{;?b`o 8B;h+6KxMk~&bu-^g_%@t` ?x[)U

˱]wnhXSBRLrV蔥gfo->[,W(h00,Z7m `r!Y~M㺋"Y6'Ar MJ}=>eeі (.LJ6MTCp{W*e粜E\鈽׶qy0Q֠`Tΰb8y_G0=5M33Ӵ5ײې0.KFN lL:}xu=zv_d+%QWpqX/b~t7Xx3he@Ba1 Ƒ h=h~,4%&V^ؑv[^/JMrXjGJ&4`IGVfׄʂ1:٧9-1D9~ ש#k(?-K0(oQ87?'gm xHچ[CiFߦ1cJrBbevvGǦN9<w߽̔Dƹ2"Bm!~ҒjPH̪ЌtTqVe(ɈknàK,K^^4ͣ cs6B$$&'XK>d4䘯P W*& mI ? 8so2\SfgfACDR"Bwhbln4>>*W(ee|A Oufm?PU=qFV_|B`a+ح` \gi'tGG2<zx/RWsʿUpHd&TG{au=\cC- {îIA|ݎ]d< se-|K ac7f RmP&#suE5 Coyu"Vn\;1|LIj|zv寈9qN>%Q8k[;Ef_nnCn?{/q*p߁=2H!?ekx^~4 DŤ:_=o|ðIrxTcc۝P$$R.'"flM Ff=~A_u;#FG 2>vc1Bm ՀXX8sH>쌇*y6r]^]'D axɋR ,z[o-M/ b۷]N8vy_8w] ?!<<0߃Q涗sl͛~u_lwAib ̽xnz+%>($R'.cxj] 66 d+:})7L$& $%qJ% _sbws!u,ru`H!(,`cH"5?o OCZKuX2D"&P밦I1dk45Iנ !+Q\Zғӟ95>`7lu|Laj>%2!'!r~RS]Τ!{l]o/RCgja<٥^PAr+O P 4e`M9I D}MYLMOc>wDcʭ͊G~<7tUڿ0}33I5v~23:C{?ȸ~C4^@o9#XMa- OTe ch7H(>JmO&w_,z|tT2AG@.\Hu$4hK>ceN=-Kp̊Ɋ *^ٙY47ߦNh-'ex qˠM{#hßFIݨ+^1L:wI'O6[v ѓO+m[6R2$|\uVoaٳgNvg\q|PyY~گONNN,Xp+,:<Pva6//ev¥RŁ=MG]!Zz֯]Ek&A.vIu]n{-1B Ji 2Nmӌ( !ĺ45F2YĎK"0̻w!9 &$ yAʣ ' UYVyCe{^Hk4QdSy"{~= ɓhjrSee*x9QȗmZ8E(IG|+ٹ[w Sk]s){J n0̒ya3г2@Յ_g~؂$ijef0l$ǽ‘ؕl%F)(axiikiQEh077/,AiPA>#e*ZfP!T( yyfO2ɛ>p̱ߘ[;QBk]'%>|sW%ԭ dARN} ~am}11hVz|˞Oףcc4R/)]'` L{H2R<$ C,؞ R 땑=VeYMFe@Kp5Yk0\5P.u:Yq//`w3i%M̛pXi(EAh q!RQ odgO4=A(3'Ϝz6_Y@q +*J|[(WjC'OH__5}+ٷ[cӌc8+< !^׆ y\h&ƛ'OKI Px/eP_Vbzy/#>B?zXf\0vcMOYj9: |7 E=f]k׻H(žr!LIU]$Yj=F&gf -"Y^ ;YT@4zm y\ AI@Zerp%8ϴa]FS4]k7 a%>uϫ0pzy7M#kd2kyCxe6,:sòorxy`|;{i:ɇO}kЂ=~ @߭|x Sϋ=l.Kz(fN9T9ɰ=[@$j - [ C4%6waOzD/b7ɵQz.QkI 덵*4"ĝ ~_7240~Jp²(8zV]?:FϞ:KLSɒ (GrpChdf"e\5 F$(Y^3a)}G+R6"5K9]m;!'DŽd- X yBfkCطIbcqkwRyęGhtfG?BcVicE@I/0V]36>3`5 Ȃ3/a[ϣLwW_l(pn@uu8w}Zs+U)gy~d|P +g~|0+5cC(Y#[$$gJ{!vy^<)'4?BKp}d,_1S'z!5v,/;@6 YJP >ˋsm%u=!)Od1eHE52>eP%OpExe(asڲo1 Z% 9ɩ)~ {SNkkdP/([`#f9S7:CG%9r_e~?製H!Z|ah믰K @%YVrn>>n w\<3MvQ⫠\8bDJ&ʣۘ\q4@/d.Rz>\ 6xAu9;ķ0 Gx+ .0ȔdRV7a5$7 9\!@Rm.`s 叭_9i5GV5̋Fh2,\ir,;rO[~1뮻i=yBOhFgg[y#`6,ث?3,ȻP:nX8AYlʲaaI?d+aڊNtQEq]Xqnb A Sj5hՐ.8R-3厲x9(Vz(HU)xW@%.LwWe`.ML8'P1/Ojޘߏs>!ޅDa8n~%$ARQF\0?#q*!Z.pR>Ӈ0dz7)=>6B]~IzQHh[7of MI[N:Sv.(^?}7[jŇ< { 7G?Crusy>aqwj%?|*!lyɄѹ,[dedڦHlEdVGK:듐9GYX<|V=@0^!@ %O`X }>r¬(r?7/yޏEp+wj mU}9"niLIn4?44::G3qfj1n=HGɞK)9i3+]r;0.Js Tk47:uǏ>G}P7(_tMB}<:kOڪlx_ ]\Mg=/4C!kTUL{i| 0CVsgڸY,e̼}LfaJNjJ_lj@ &֎H펔* OxH|=H/yF>K=jK5S^:7I%2% 2*ǿ2gs[b(Bfy|mB{9slh;iblL6\Ɛ(l]vv837yg_u033s /ݤIEǁCh5@}^gC %|u?W}nYo@SzZ4ԠǤ(GEJYdmBҸ&N\ ̳Wk8\{ Uy@QY|giaa>DHJ (@8S_/(N.?ELafM6yrE8pYQ 69u <;yCiigt!羅|#42<(ڎQh/nMNNβr;_;f^53gyˮ9#GP>6?(( j?;B̯>c7Y[w}#=% >cD~d 2305oHA8ɲ bI3aE(FcxIM ס ^ 4|=&0cڝ9L0T0>W@2/e.y `K+]^(5c0Q3Kĩ_h5QY fta:|>/4١u]}.2 8 MTiS`>q%`!Ȩ{cH!WAW0B+ /sn [6 {.|£I38G=1ooUgUf]n*MO $X lzT^֒: VM|8IH='PLoQNg7H%, W޺TxT-P&V8%C xe-70?; eBns㖃^h|R1Yb,5ZY!\$>뮯t {O9-|@,IBToF;XadiٷG}OÃ~F` P }?͹?j RQݟ'+~_'N?$`{l"XT,"!&md`]?DCO~ZiILj ^5qWGdW`~,S0ZE%bo$DMt&cUszɮn;Qe$Мxn~˺ X)p<Ǫ$z `}9A"Kݑ"Oοqj& J~('`e0tI/0/5 33">5)X8~ttj(E6<5>'{̋\vr#Zv,^+wGh #)*N+m)h@3gBw$ z [`hFzvePvemT+Ԩ_NZ' 4`=XK,# @y]3K-qשv4lo} $#JZo O_kv\6/>5˚Wm9Ҧ^Hl9ekϊ^@)?! WpR1Y_T%kѕP'ߛoN?[7+/J X:7=+0d "4I{$1&,Ν;e_TVq )Ǎ /)Y-WA8oKwA*JH)|@ %)3_)׏~˳& 4EB_Ō- yD#g}79 @;!FJ *|h Y,‚T GtwC!9ѬiK IDATpAW_gW@ gjx#S0GRi~d&$NwAB[6X Wj@݇n U,*b:l۶U %wO!˝ڮxv\JJ*x st6>r/[1)U݅ Y:SKNu,8z>ɘ B.А%$LJdXN)煿6oHf]{ Xo򙟛y>$5ɀOFB)Rꊫ=! (6=3tC7@|cU'E.ʭ{Zqn{I_l }5@Ơuˑ@YǏ,Rx c1KWvTa(ґ޾RgX;P#- ȶ% (2^ҼBf= E)gg2q6&)IbQ]gyhxwFWپ*.( zDH {}+mbXQW(vYa1AV6³СEi|`LC6k/V"1aT. +P:6s":G%Q7vfDf)K@&|I|v:Ϣ*oU0-Wtgfd7̙IzGh }.zcDA:w >2p^6Scaozڥm6)opKIP$zjNCg r+p|1WF[ڳO-~֧4Y,1Ҳ_bC Ԗ3Q+>Z U`l[u*yC ōXօ!y1B7Z !>_ !_!qJ;xy@"QWLZV&9 .NB&q G)I\aG\.9(F_V=4|)ea ɀYJ9GCq`:-}lj=ywM}kUW]q:GBIp~'*0 b*ޒT|y??;x˪XPB d\ClZ{WH' AkN'b'\2dԸ%ھ^zߓ{ϸb. ?۷ϬdMc<[n @' /kUy B R x?GaUx?.kA̅Rȴ x3f[j@ {[pXӂ8b/s X ,=afzA{Iins .C]-$l;Bc+7PhECdg|"#e:#?( iu!2+Bx؞ziQ D^Nﻏ۳qώ]VZ*峓gT798r9}8>.=|=׿.l@B#4~YX%u&—*{6ȵJ ӫ; 38(˰J_]Uay0=x4&4p. O&d݃ 3^jӒLtZZNxGh捴ī9%)ogjfyYA" bA=}@AA(qC @)hb/@?/lsS3"K JrήxYV?ᔙ`ESeශ`.$NN+:,5sY(e<&)=pIy(](}["QnJ^\(s8pK۹&ˑRr6BǞ{nr*1/0Y/vԡ) +/3S߼aOcQRy>6hp) 4(${RеV Fɍ S_=66JwyTئ(51>$qЇceECm~MO{8K\j/ߴ]`qzGX}&t,>@Z^, RWX ]V >])Y_{ڠU 1 ɚF I*D mimsn=NYtҌZe@ro&N+^V?_fd]Fe @@aeR@QXdvٍ|LOkVSQ2MXJgMva[UZB/4di.!*lh:5S@I VgK] ؠ}尊jK2O E G{sE舊u4Qk0W̡@k=ۑ5ӧ\Dg?Kt;RZn=}[Px](._#|P@Êc2^Yug مK}%މMK/jؒ] #4VpMTcײY-IcF5([yHWh5.o 3>v$̈́^6x E3ݨyK}[X](&)"">>7bf 9;[^.̿K%n |&t D^r(j6dG#)Ǖ]\x[\[AZ)=#C.g>&)iҔKA{HY\|`ZR/قDӐr`Ț899#JS42:6CLOq.G-uo|.tn@5Qհ:S*>V;S&1n4%e>^98ТFCn&M\Q8yX%Ƿ5U <-!8( ~ P@6NdG|A VTU33K3 M.k&پ~~W t~<:٬9 {Yc(#Pfڳu&`j}/2ܰ2ύ/Cۇ$2y9[[k)IZ˴AZV-9О9F QPl{_NB@E8^.cLLx/,->@Q)"߭9@sg&h^7Tq2Hsì3 mIzX IBx V޿W!DҺʋ+#R@VI^ S6Keu9;=҂և3@z!g5*%A3!o%R<}?KH ԩR('Z2, H$ Ÿ )ibbNۋ~yT4߄ƕrhhA#E.+tΡ{ŋRcHBA,[|RlP D ZHofjzL͉\bjONDqYur(lr68yz`WСCta~M;gaxgM﹞_x7T  {R5\ "@ BD'ǖ횬n0Y9d ,hk {.;>?Z06 WD \5)b3h[* -7($>-HL6yncFژn5TG>c_o`ě>LOiU7i! \ o s'P"v3 r#T_p]*2 `B@?&l̵͓3tPЂA$r *hYQ]=A89w-k5ZwTV]lwh~ _JA I4UM@{V-t8Oht8l/ ^%lYty$;O]m$8W;cu޿lg@8 &"8@e@/bdL]T(85hB3y[( };L IDAT6k֡g Ta8d#v-n+ shwbW0'xĘF`d >"{!2f? G !@љ7q)+8.uW؅1ބ=t h{>==X(.$ ?Ŭ[53Rkm2ÅkcWT) A;A` @/S`*2*Z|B4Dž eh%/@\ɵvS]N/:e\L|H }C\gˉGC˪;CHaC`A/MHMl;r`ILc'X:á@aYd]wŖ2OIIQBKO8 낒. WH4S&G/bD,!! SS3~t:!E <"<6Z݅CD㻜ϱAhff=lGZW]377w=s~ZnvML)eR"> 2_1J_F ?fe#H+J 'wZAf4m6O "V/_~4TpS[ .6' 'xaݒ*M{y[xxbB,X'Ђ@ F'F䜀 򐴗AEDŽN]$ n&DsSeu疜s[wk Dlg3w_Aȏw'\aS rl'O\!o1DNRaWW/x>~& ~0[@C,14x5 +{Lĸ6ϊ Ou[B9Lܲ} 44 lwPX~waޘ6[4`(VCÃR[J/A"I}vV"`O@8[\'o? BVȝPB?msa.Cu&ҹ b>??#('m/^fˌ3"OԪ&4pY4Pv .]Ere6m\_^@¿k',0KҺ}G*ɰD;R oJlأ`ڎ% C)z}I(e( X_׏OLY ;,lQ@"h/ gͪ,sΞ`jVhU.:N 0 oM% )͐{AxӢ|~zϦZwD&Ͼ)/Nx-Lʧծ0$ԙKinSwCSgy [^-y ƑDnhy7} Wl8d҄U{o$՛OHQ͟?|.۶ZCC\ǎtLsY t0/ \@>̒'/ Qb9W 26i`5KoS c p+{ 4#.R%&0SLH=V[< Z; ݦ`We 7@+DRX}C!C:eD@P2P'4ЪQzۢCE$`Q2ZMg)Y;mY3qϖ>Z|̚Qۼ Q6IrW&cH@$s'#fbXc/Pg?ƒ`]^ {Qw Щ:EUيXAW>4<$a\YaBK}˅g~ Ɂ0H!D#$!2U,nw eM;$K t+?í:aSb AF(.|zk%nB~֕W2A?uoJ] cf1GNlI^o~OoP*MԐ#g҆{ϱC^1eDd Fy VI5S "qWJrPp~S&kS~)o]e~#ِgr[%K.3.gkNc,v5lB#DLtڱK,-v(R0oIDHI>aK.Ln%@L_%FOe7ݍ?V}}BF5Ү;~>m+=[f|WT6G^J 62x~w3{TӎkN :eIK aPPeaCUDjlK/vx/kWs\`$v(T45"T{ +nDqR_:\vsr{95~;:&̇KBUauȶZsyBGrZJ(#BW1 F!"ϙlICd_'%ҀY kOB6kmr =KmkI.e؂T*v\A K#PZY}'Q۩HRW@ v r\]O#:sM&,0찃T)/a \*W z]ǎ=]\ԐvQ;2xr( 46y|yJwb=҃f`\֠wS=(W;$vy [s 60*퐖[n?]!k5׍wU_/WCN!_XVЩ d遥dO0LH:1l~<>&eRHy4BΆ뛈M}r L V˵Y!_vAu<2(@OwηJd ^d8=黔N(# b϶6Alǽ"2 U5s=w>v~v8] (ˤI2 4.w݋ H -Yn|;j =3u"^ޯ@ 2>۠w6{?f@ll  oȼ31@h4ΌQ38=AIm$KRaC_ls6dYIhB^/zI(1-#=\AE_Qu彗r|jE`ˍ'3gvbshgPm")@IwKT_JN?Zvdʌ,1gW3ifR* 9!|sm1Tm?9Fp]ЍcM"ZN6)ӵHV,ݍLV< [Q E]Vkθj腑۽b6@jC0j?<#BLkgoq)zOqrc>qk3Pg,y@B Pl#J,|Q {:=9NYVP˿I3nyr`wרbj!\ 5J"1l$N^olc#@[7AGx@]*uSAskܜWhaTأn,}\hY'"Yet%;W '29h<] _bU62JHEbDQ..|&^+dw`];_? (PgZl*Z-kM{N L]4`? PmNbsMpOl?Xj 4E e24{2oJ\8, NB`[+~ gJלV?{uM N! ֜ł_0_F8a4-hMt<!?d83=p ):\vf(VfQ9auH~O6֛1*dP@* ixv 6Hn*i _a+÷!3-p26کuYGYHtE @$ e] ƙ~_d ;+Q20,BF|[,s4w2 Lo㋥Odɗ6Jn` Sp|сH8[Ec$ 9G|gK]՜gK]I;լJW=5`ԡ:Q/Dp6^T`J% 9_pEM}>;9#8`e˽C?;A }8)W!h]ԩ,E+73q۴p:G/ ]*O˕gd >:K\J핤ΩI?a\;^mILm:MЊ[c*@>! IլӨ޾2 ` TQJ+^?iasؑ>}fә\,Y T/V ]p,YՄlv _ү?)4 [(\3JNdk%ӆrjkipp55G -dD/_bA/ogfA7-p_?!:y7oec% kB±Zz$2H tW^MlhVfzt6E =:OG4giQ:^H"EPGpoW{k-n\-4'LAҒ6-F`l;IPVakt7 )?N߽M VFl38}} Rh" I#o˷^^ūgtu}IO_dchɑ~BM+rlVh3@toc3 X9hPZN|!ݬL7#N2RR_OO wҏ>|Nǔ:|3Nߗ' .MWsntʚmHWh%P戸V\ F4A[[Fhm7FteKqɇ5mJI):V"̄b@+owV`Y ?Rytͷh.:#Gp3H%5>{ƧZY7ҩw =Mŧ kU.)schw ҨQ7t1cܮW4p=PϽެſ[{oEo>󓂦ϯՋkd6Wt[=j#OOA Oaů#kҗ- ݾ}B]Ӊ=u] l0|iϧ[H5` 383el,mpͷ|w9o3ý+W Adi`NGtZ=Hq\WduV7;=8Q8%}Ȣ Q`HMPFh* . ~eۥn¡6F`c,v%9ehӨzNYFңMDL|La|8r#Iwڜp=޷Ņ_.x}Xӧkc҃ 93٧ Q%6lx<3.@ݬ!4t }@Dr׉0(( ߮$Fi)V5Ý>eBߒ4Ur(EN^m*Iu3U/zXy>RPzp3dǩճ# $1.Yxe꿑ʹi0u_Fre !>f I>v+8]:w \ׅT@!CBdž7p[Vv1=)фCm_B v͌j6r-[*8%ߔ[*ZЊsߐ@զt4{zM^L%#zT#h\s^iW02AcN'[Ab,ƎA:p ގv 5vRֺS~vԉ8%ieF&?Cߥzi͙zSm wR@"ߕ% 8 = '!8?D?wqk.kOA_R}bS\@Ժ0ӑL~$H<w8&>l}=hBc:Od|֏LPux؜kh5f"ڕ]j+\`yH5J1'+>9;kN.drԞްaBovP__? n邳nX0Ia|1j<>ȉQIB-!_*v@-o! ePBXZALwP٬kYy[Wlo o3_2 sӆ9;k[0hBI4ؐK?2x}5vN dU\IjVr?8:s:99{g?埏N,'2OWm2lꆍ*@o@9<*C&1Q?;Cw!\߾۫]򉽡*T+] G\p1:솝\.[AuE:wh0tBz%;Eoi |O;cd 3) 4Ҥ,+ЀNc_ Q#-0k Y\pfpA#޷ E!HG M8ntd{Gg3p`Pyyڡ_4ߗR҉M79r IDAT^b!ޘ<)=z}hr|J6 {CstM=\#{ic,H6}Fɻ(g*A+1}p;ؗ BF\t?:kuW] 8{rQMRtHmFۜӀk gl?bh։,J/LYc,gppaE g1 LB+mkأl؂ ΫtHÃ嫧4|FT/slueؔmٮ9*#fm]42ORFvBqR>,):>Bs!k'1&֘M2Bp vM%gQ\~{\Nb\|_t \&g-]!@?NO6l7r+*#-iƯe ܀QXH@B}{ {拋%L=<m[sgw(!M=:z~rpw( FˆE([ E\%ژjegv4l{\6 _F㪪^u7O‚T zꟲ#ѯiry֑$03 sdJFE?GgG4>_H"͹k\>M|\)&n7;);,jXsqTw|'4D_tH yxɪt 2s-lp|{r $#)@ε,w`N xp !t|h7)iO \o#s0Z~bw|WeQegkH)lQr0}0 :)3חHNb!&џż|@уhH~nl 20#j&4B[ݠ]LefZir 4xDgV(-?>3kFv\ ˂1&S\9->fB^+g "']Ƴ}9^%.?vęSCOA}Dj/IPyQ)8@hYÅ^ź+ʋ.! ll}X5 ı=WIؔC nOK/-Jz R>L kU46MQM4o/y/7Rظ/L (ߗ%J|"=HA+A 2TMTKxv,62kH:PT]+V6tۉqkIK *Rџ .D٧iEL%kfl̸e0W(xbqpA&8rإ+ju>Bb!}b}ҀKq)Q8!Q2`L5!w{"Hnt.@ Hժ[ڽ=t 1ɳ^ PE=ʙ(N T,Kmd ^主>P;{oл-OS u={|T18JcT}Fyo|2<Sv42^g 0gqxO4X9&zHywV ;#n74ɊBS4i9"Y ~u"%$K&Qe RQ>|;ǎvT;5ABaJ`0Ӥ_mi~4_SlxX+AUA49Pt(eG as4bANFd3>FSe#iUwz4UXU*ѝ !QuTc!dCD5sNK)<;6ܾj`i^@i9}0_(ɡ*/v=@+2wC!04e52v 4)T̀j|M2Yn@ݝkD79G fؒC?4{ u-ޜ9[YJ 'F:~OؘiLwWX>8 ڕjԩ 'YWҚ;W\&>V(T,X&|܌n/74?N{?~D;1+/t! ڗodmu%qgdVܣ' >ΈBH҄s돸F8&RWh:TXN6$?du!̋9; 5zWd.=MS{Ht/tdXCJi?aD@qh??t*wCyj/cqSl$T6  "TPjc#?y!2Xmk@ӯ[h*&JvS έhgS ـJ [QWanW7a5 -[960pgIjYqV4{ \nֲ6eҸ;Bj0ժH\?f,&K)ѼY3vuӎM%2G5VD`vu)VJpt5Z m1KngM]jHv9ⱳr7SP=ztr̥3()6 T9PZ #! e~#UpNfXhYB}̀V3Ў#KSRi&%(9uWfִŜA IC:˗9:T5;vRŵ DC :`\m N.n4{%@JxUpM>J A?q's7ZްiUZRam_4#E28>I60'w(C>nSJOи]b EMdE ]qe__6Y1nrK 0sl8W.Z.ڭdYDR𘪤e-ftsyE<:Cnu#mnڝ2`.D04^2lZ@W( E kjȹdNJ%v jk0fg+z (oh Foa6|8J|NRxx۸A@Go%]==80&}48pj&y, b 5ҝKރ:/i} A7P\=|{z>4:r^4G\lO^ A\4CQ^ ίES;az>dH1a5e'{zM.B]| "Ei>@AY7#} Pm"WH#"Sz]A4x`18uk*r+>) Rq΀Cto|-Yj'c@Q1(D8FL.VPۦi6YFi* 8K!ac*GQـOV2[" b(B%BR^|rKO?yNl+pRY7qvbWR$b0' ^ B+OR\jBkHsuZ_jMkP|8۫ ft~z_xP+i]BgC*/n 8#b7{I1N? ߇4MZqbC/4/82/hTܢ! Fz>Ixכ ) | Rf lD)h`y!qHTb,}D,|C], 8%GwO53 -Yu-7_7x\.9k(؁ࢁ&9i}[ѓ-=4})?:ep$PקîND)Qo kJ(ƍ[iPrv뷲n?j̥AO.ի+#{?)sҙx8s>F43Ơa_ 4x]fSߕ)@7a/h^_ԃkw^}XB-sb2%( Ҽ@!>#9(8@`E j&MG/ּfR[1,M=rM[)֨ {#AJ(K%7s$-R*4!}ra7µ1!0rl7o8iBizMc)81N;@V +FhdθQI?hD ?<{>1G6a{8n\L+>GҫK CM4h'Z6&YQJ?d =Z7.8^\QGONH>_rۛ5pMR+OԐ9-Xog)j] R┶~#5p0F@=| >l$h 6S?e ࠗ p~M6“x7 MB ~+01}w _P *ι4#Xo)eDԐ9OZ}`}d1*:Ֆ+4"`JH*c "G"7k˭m >g* CDŽ*\c\//S+:9:%0G&"E5&kFbKXί/]q?Әc~qM~;qM?G?)??%=@ʭ< N Œ^d(*z+*SQG{ xﲢyСd%xT@, ,-4ύM{чU(to aSuD@_0j j/h7]q+#B-rvt&7%MPE8Ɨea,'QncBvW΃A07 vnE08v:WdpA^Qqp!& oLmC_ 9WI8}ـq_qԗ;ߔ3dHf%u2\NJ~h;ˡNN?r#9rS+_H|;X[XsJ4IVã=ߴv/],@CI `׭7niZENp* m6gI#,1pϏ`اS|1;zcg3Rf89t>x?>z)t FBtyO"fh8>P=\+ <nxH+C*B1Y>AmB%]v+ZMi`̔cޣ!;Go.q~'\F,v-Meeݲ\`*|Go\s)8SGzu--Ȩ ~?#E#%2d?/|U0ϗA ߴ /0 2V,KʯVJm ,d43ݐ v"H1gVZ- pY: g W轝_K6J:hŠCBbJ@MRV} hެ+Zl^XF!GÌ7l05auA $e_xԡ?=Gg=_1}zuSr>y ;[A^4r;9 q~7m6ӖoJ:.e;r%zXr"G*tOۘ;w@G115G͐V`h)RF\&`ݰZ/,e=cǽ/ NG߆gpox>.WN3C?0,mMsX3_mhi=}/Q](} ށcaXq[WRʤ pq>)8s&@p,9UMЖ+fc BJQ/"0X7Dy8BEoJe vPPͷF@o)W]utKxHGnp .MKZS،4+w0:tH뮣1nɑ4.3ĜkD IDATq\RL%zFPY@.ֆ|!@'дPa;oXj%.z ]9Dµ8MLecKv ~EX{q<ນʬfg8irUMw\;O8>_Cm8T׿>\V`Ļ5J@Io&it!/ʒV$dh,2i bnvC(~% =zxK.sOOtd6Jv 4.z4"^nTր\ :o/ðD ?~nӱplojz%Hu`uZwNH[MM;X`]iAl8b%7@nv㋢zT OԀs 6,>~SϨu*56su (5- T8xS;-AʆȨ2/.PsL1oQ/O tpi9Ur}<:n6r:Gw*{87F3'VĹf D?DBٖ^o>~F-]^jN3sV-O& kk뢛KX3 ƽGtNNǜۏN8?,~#J/MR|g @ P hNcr9)~\C8f r#;kvf,|]|Wu;D]뉱Fm !ڭu~7iZ^@q (khS,Sd&Zbo%>pW[%UFibz7~;&9%x e[bZǏAPʬ]u Н/ P-LHKd ɸ_m=nOJfbܒh h3Y:G8%`\Vpɇ'kΈno0C'B΁UxI炀IP{6%bȂLQ؆/v HgbF/s4HUI w}o,2;|HIJd`U913!e3Lea'=8Ye_u?F~in|";ʌrmr7FN2 UF#k2aY;\FSTfΦ3N\8|QwI 1aHOdXEO!cT)je8TԦݢ} /h̦--˫<5ë[aG\(=X@6rN n? M5sQݰQsr}u[%_~Cun[7r{rrB}e2ߌ7#s˃T,"H),M͇ OM$ӈ~ Yo˵"qu@c~|u"mu#h4Jv+%\Kra>\$ Q킆h082sz:'9xn2SnNrAQ͗ 3dnG#0^Fh (s)qvO('E< ACM{Cz1VO!(GgR0~GY*Gʜy1/J1osdAU+l4PG%A ~_F5&) ?є̼dη'tumklwggEUh23tas߿/mx.0\I,azηel &{c?2. kȸI@.rdTe_|PGQ=tHэ2X|z͵RfB|A!g>?r~!/BTwѿ2K^"lEL&NJ5YP]:[`*0/ddl̚ dnXp_ qݗGsJxub}$eTr"vb;H}gMxr~ #~K|۵74d2]TH.B/ t_"JmsG swl G@]E6ssN$d2 l<$nab.վНGA=016*ri!h.咆˰a ؀%}hv)u;kv$+^А Ï64|IS;6Vkܒc#F(-U9;0`8C/ 9S)FlbftgY@3I?l␠֓iʖ5f35&0dA 0od$z1CUCeɴ|Bϥrg]ft3vk  [{1e%Zu,{Y~f@a!{Fa:~&L6΀ޡ|p !<2 ˳&N䮎K59Rxo-M@]&1m zׅk&5#D&\+{ȤOaMYlzETe`)ٸZE~rH%w1RPP38tN΅PM:YFcĞZ)|)7L\U%QUfYXvF yv> ;` ׵}-`&7}B"mo~?|2zߣr%^퇍I$ lD; -2wZ@Xq >|mu2Q16c,pzaBeҠvDm@%d6j2qPߖ4ЈJi P-gh3N_ 9d 0ɀһ\C0T;^t'M?q@}݋: oao)@P}E]/x ل %@> =Dql31%Ӌ3EULŘ3]Lq?༿ebg\zݮ2_Co_sݯ ">i J# ?;<3NB-`i ?A 0#ۇװ zW>;ԊBZ u A- vpTϮ9_J ^n 0c9mf+ѣ8˾dubkdX0!X!(eqd g-& h>| K?(&J ȄfĵF4j 9]`l@>{IPَL); 1k#'|z ga0ggg;w> 1# 89 9@$!XNtj-UM 0@Am#.|_~?L#ᦔ$m_jv)pq0G{Fͯ(L$ueʱ4H?6k며{`㤥v5qS'wS&\ h[ bg Vx޷Jߛ5yJGx{]+_k=~sBg2pƋmsThtzO MU t *B%ğY7=ef@{`RJE$SA$['(ɼ{- BR`wV; ۡҪ\L4N1E!6n^svFgD= c}5(IZ>~hLG'폭P/Se1,ss:DģH7I`B }d$Kud'H~R?N[9S::(\hBG Ј7Jི^jYM-5f Cm6'$)\"x9[K * i!ONa@š&K/oh% Jd& NądC~0NM?B$4RBx6]L10D {_}L(=z%>gۥԛdr3>70ȀR@g(nS7 'd1K3|uk$i*?Fވd:;T$'˹Pثiɡ{GEٔ_lb䚐B:L0ut8 _m{nMrq{^ch>.\ \:|^eT1fP4`7d2FF  /zwt{'xz}ƨx 丸 )\m,C,N??uM}w`)[nޥa%I)_K̳IF]FѱW?1B)"R2kk̖_NysoQ['N> ] QުH=.lsRt쌮MTw{KU#[ ;A}\Fxn@WG\S& \O)QD(E~X&ؒۚ+ ~Rဓƅuwގswk>^][qSVct@;NWXwEA|_oik4=YK"FMaq!leB;*BVfD a4 Zh3\lSj6 eIzx"B: Fh$9J޻g~MLc/8FuqD%Y8 ;͐A54,8"x D#_.kv7^^b ̕8Zo{}d ~w#'"X (o ${ 7ENV;EnteA .{Liշ otƧe11iwH }E.AeUnޚ&tIgƀBY^[.RG%[ʣOζ2M?廗F^#ӋTVYelh"VKq5KǺ."n2O;a1 ?doGڄM|VrPd&פ] !El&ˊ~ev_-r7 L4Le"+Ctq\G΍ {mZ)ޣp $^p0ebӔ8??'u:EЧt씎YV5kɾvhdXo@j O*\;1$ } Z>6B@|Ly ʁ\ܲV"+U=$1wNc$Moe4q1 ȼb|@_%Dt״k6G0V]9\3` 'fl[I.26ϩ^] `rG#Oc ;rʌ&c 4q d7lRr` so&QZqiJ.3x'pƶf-$Z pE% z辁+0N8?SV8ؒ톺wh^??x,zE@Rbsl8|hk'w ~ KlЀVM}=>hw;|o/?,ba[ EU#~ч/iZ'ƞ |4ܥ IDATB;2oDЯxƂLz0߉(ڨwב"o0/9)å}N/( Ypڛ5@~^Ӛnn ]8kdw LүTi_P{nCEY/z;3_<|?>>x EGhQɀfÏc:8|B+YlvmeR=*Hnz5/,NDRnJV!Tj@GKaz3ʨt7˺3.2Ѕ!cs4bR' &J>{^.hA;S U$VwW~!@ cN89z-vGc(!-GZ_8˲܀O.Fl9ukڼY7^k|gQ HKPZF܁h|Ȓ5ajABT2Fz1ˍxάf'=g~}gqۏ^ ?sWN<99[/0^hO[~#8|^E`Hx@:ܔG6^؈(כeJIf%MGZ_cADr M:ϝ8p֪$Ny;۩E 'S8`HI=1ϯi정'{ # ^-+ BZHڻF_4sѨ}- ]t;l ~I3OC?n8}hJ*ґ~~.C-Mg$O_M#h/!|`cO~쀃o{8_} _ɟH 6(eixDj~.[7N\-KIJo&riY!]KpcgZ}ŕ 9cG'{?^-l ay}s;RK?lgE8B2wY7ƌX$AŎK([-"ƻ~d#?\ ga ##W~?tT!Vg˿ÎWvt2+?I]'24%0GLJ<va:PsH{"HKJ>E.Z_ q!tk'ZuF !DIe??J*ه3%2zp<H`M-(E\pig#CZ{W5H? 4ʄNhL#yfR:5t93Bp.dA5[I9 w/_zi^Pm'M ??k ޽{7&H"7BGW^??iZb`_ VjSorµ?)ӏZv2/7Pvr֜>o 9*9;"ur*^e$lά7rOJwEG1րI:~F0%D,Tdqh2|Fw&\_1R[?Kݤtg먭#'XIFs&'5POp*kAv Ȧ+-ƢUAm|!eUjsPKOVFrD~ytn?$'}d b0~di>;%@_0s?;<-@:_vG^}ʇ$Sy;g7ґ `9"5M  :vjÁihb. #,4 ?re"-aif.|Y w5ʔG@-3@{WU9|mOo݇Gx~s-*7 C/l9m 4cƿS2؞B\6e~72'B gT43v~uPh'vKW - " Su@@tѼPrv?P< J {S`zs 1rJ/x3uJ4eB%nlb tYз:#6J>͆/5"^T@ ᇗ5TK IM-ܠ=o`K F{vm|=ztv"BM ?]mFC`%3}#Y`M  ئqo׎]i!c1Uo°z0ڂo#D 0lS3m[͉`{8oHS r8_2C#ڛe e/?f'w T(i)2T<}vSvL}ߔ;/eԧ?ȏ /bt{hu20AYqD-QH?/蟯$`hFT11Cb'I~Q~NRPB! PEZHQ G&xvol >@qR'Ԭ>Ixuеhۃ3Zиk n7IR 0H5|$Q%l >.3)K7,E4'Y,R~LGڦ$ƚ#ƣ@~+H :(`8A1q_rqC LR0{+ ;ti.f1|/8BNN;u]~1-hfWv^v-s}%ƿ_nVʢaL8 @ v49:apˆ=|KJ>N&4]nhڊÁl*";`瀂Fx @PnhNE&?}#;ow4gZ n˘P{d~ɶ_( |N.O@AAC4R(TFZ ؎f9zH3lX)qsn@@j{ٟIG@0N7s˿;~7uFY;K?ч_W4/vac,FՕf.^8劦sϟW)+/ :D ]']5hrh>cGp匄 +M|;9Hz:lSM53JE@:`gg(h9 fz%ۮ˟L $+]G=;m)G{c?%Dj lڧBwפּa*$O=_nPvz _^fj\9JJ@u?F?s1q 7sS<\}͛/:>>NlvgY # 8(? ]^^ Y:nuxDOO8Ёm%^\O?}DϞ=)p+*WE2)`$ԉb(aZ?uΩrw=#:ep{ޥteܟp ͺryAޫb# ._ӚqJeQ&Ϭz9wih `-)qf4gܓ~"7`(0'Arם{zl^,v 0" (EIR*e]JթU/9]Օl[.>Y%2IA bB r`l};XE `5ٙ~?~oZ "H R< ULY4x"@P_Ӄ ƲmԨ/&<,I*|QTBDPp,,Je!9o٤Pr758xt3$k0ZG\ ^l\0UFӣyiKm߾}& $dgnZ2TF,[Ոug9OXW~\Po4 4 iB/FC2֦m\e߰(wlP4 챔h4MSlY^a'ȱSŠ/̲"( )~7m\G~wY^@[k(K*q  n>[-0M[IC8V7} |kx0ێhtdwJLQN8ٚwII)d ϙ:/~8nxRDxCהQp~w]w/3۪@ ++ܳg޽{x9U<B'cS$T3̽WJb0&[R/ b_pVYP"@0'p UclUEh\L0݇~P?{#ԕ2Y*fy!%l}yF~}Pcb:*e|u7z6yBPc-}6! j[Ҝ>`ej:\y%"F"2هZLz(c0 סT#U*Ѫ+[ σ>(J;M94_ߛ?\f9s/xI -V ﶒ $)hb+z~6lܫxV IDATMRi,XNf/ΆYɈM2j@b_9CpȜA4E*͕jKP˴D| $IJ-x4xē YBwQO [mIh@a -= ]t ~M1٭nE`2w khR6[˶O(\&L̚nr$LRQV7`'HwB缓dN7ッ5 W [>~beԡPJ Ν͏$@{DJ|ѣ}N %8%ؚd?^Xu `-Tc7!o@=Q @E LGdD+n pJjߖ;/hSZl*?"K26}Ь4U H.v&-\m媴0RP#WoZݺZCMAS4+NbTrbaJ #־Xpbٓ(˲VdV˿R4"xQK@[nwX6"⬹07O9Fe]Kt"_${u;V^[$ܧDӷ:H,[ {M]+VQ M.|^nj~Aec d Z-|{Os Gr $tL=ʀ`4 t^u@"^5XLf׿J~~g,%z;VE~L/f4(lGI?JΛY 0s6QnSeN(_"9(mڼ.z'UaF$yӕ.KB"`Ne}G49&rfڲq ؔqY2,, $-7= /g:H7-F'@-tr0hˆhn(/ߪ ۣa6b,@vJ^7Hb %$/ w]c}{h~g-G$3ݥScG=|SX2ɋ`jjJ@CuQ:~b㵂ac:Q-2jb˻rߖt/Hj &xF/Q z,s0]ѢtLQAoEqʆ )}XiepVhZ"4a_4T~%R|ϥ(;[k%Pمz m/Z3mjՐ#]w%٬ܛ!aE+lj^4mxzmb^[7l\8m5ۃҿ|{070]ћEa:T3`,qQÉmmcbg /+C40ŘZ:9v\J;%y!_^E@G[mK,T )qȸPT9`n4?N\>NO u:ĩwȗXKQr} cM0vxM? @0{fua=}|M ?_]ٽ{2Y1ݕ *CO/e=~R_t(2"J;W&x)7,x-ԂO?z~vM^;@W(8hC&1WLcY%u"aTl Nݖf;Glx|O݌.C}-P|dt^L!tPϲ{\hr@GNL'Mϫ=Vޢ2V `0PƂE9O$F'aSNd2EA+:Ƈ^P*Uw}6;4- W*?>hrbVBQ;O[D'h]2TD.Ыޠ]G6 PAj}Ip'vMY:zȱXԟ hLhT]NK钗4x6{*slFMoDTk*#l$z}:t$ؤOeL-oU3b_jQ]2ꪻϧ^Iy499)V 3+ /JFoT^6 twoSS]zmjq"B&j}[mc7uNNR*:.y:V@LaB:Xb3PdnFyЮOCu:>1E|@k5W6LkVuʁ>^5To֨mbn`5+P8nfĂB_oҚM_vE8 ]KQOG޻\h~V0KOhtB33[5EsN-mQ*uer1?S=z}/ S>&y ¶Q&U&j:*[[?WX.]l6Xd%)l:|RѼ2?"yak6>Rmko(, l53 wIVŬ !RO+JP@2=$(c4VZ2HJMJJ s[rUvY1=([byznD@^,_kȊfAn T< ;v?pڹeSUt[~^,,~ʡ>f$0CY@E#68L@,oJ>=ˇKW ɺRB MwTЫ=+[zTC%H㡯hPN H4`rT(J+FH.|^D"z~T7Y1=Ҩ̯EDA!w@$*t m%41woDIwXnM4@I^ŐNlJab -“GS?[bşca18Uh4w=Meʫ;\tځ-A8|P1 DOq((tK0 xq hj4 /\XVހl |פӻ[AR$X͐"[V("Q\DHq pwx\ X(MdRWl~}^F__N"8|><^~7|9AG]h,AWo~m4;7Oo:@%~KhtDD'x z5b!javo[~zU`$96Ԛ RZz2J!q` eY`a\ր|3M4)>crU?s:݆pΙ¾ŹThu[:.X? .H MP)(7/h4`cCjT&)q'Cwb6[F\J+BU` 0 & I w߽MnEBS9[9~,}>){ɓRo.ZTJ,'>dtW\PPY072#1Yȳ$f--9%IJ}qۦZEjH۵e==maH/un!?S?j$ayd!. s ?yںJei9< @}ww<PyW4D)J#>(0?<OR|zzob@ϨTmR< Ǧ$ӔtR/5({) -2gc޻ڎ߶f׭ӌCrI Y7y1_OV\)x qS/HwNw}H%U'NqhG}N%p .F!tOktxg;[W?Wbw \9XCc糟L0BaHsJ`z2|C]OMkE7Wʾc '+kdG_ݾfM}"2bH2BX*S_|ǹ>ߥ ]Pt :[>} {PϲGV?aP\742*9ֹv! EM0mt ,Zozk;8'P*ї.K`w|ug%ؗpf\z}sO;% n Ρ[5;ݽ-FLs"'ƑLs$x/}kG[ɉ(&ڋ(Q(w_{אx 1--k]=78l:Svq_f<'"\N'>Dm\7RLkZm;&];FglgP _Gk*qzDbaEqET2>h ,Uult]}gE8uww0bYlЇ?"AAee>\,pb}Z5?z_X9_-*"iBbz膭7;U^wHڍ}G|77vn33#89((]"eE]~g]\/.KGF=eԓc:&b@=}*@Ls C.;-]t_(3c6}Aȁ" 4 9Jğ=~p6m'vPVkT @ߢx-[Cr W } 4:~JAAfR-"lqg{{#4g; І'!?#凘:mG""Og ?x˅l;Ld")URN(sZZ~f4Ԃ:Ror2g}L~f<¯р|vV_bű}ٜtA b{EԱWKE*Y6jEŽGB'mc=Ӵk>ֽEE?;3T(uV|g[$&>[b|1p_җSwCa}*9srtQzzs|~8?]U+>ǮL9vrq)$*Jeڵ{/?GǤ1@R:O ;r }_^((/ ʋn{׏ŻwfRY/_w}}A8 r 40Oz3 zŗ7vQ\6¯9 Tݣ` P ~鏚?ʂ, Axys)zTOx]7 Ƴ-P;=;o(%Y;sMrFtJDRz"CzN2¦Fn&6]?MbNT'!(oyя~n*Dv3d&tm_V*})/R7yR~zzNNN/KIPQf8Dk/RZJ*%'Ѧr0 FXT^H.V<-",Eu)k4ڿ)ps8mr@}8'S>4K$>>|=>G/u5ˏ;zMZTd\eWuP/r6_}SO?C{vZ( x$-O!`lU -"OV^q6 nLwWzGÙ) n@3Ǯ?|fY) ?M.3u)k§]?91&^\j (:j*Ttjj^xzizjJЉ$ W ɐW0b1 DiZGfGΖnт>U{m!%{WbyXv(B gFa=8j9 : lu|cܕTd#R!{xdj.,޽W_w&%X/ۋ= x}IC[0 $xnG)VXGP@2#u_g˹T/skN&Sz9!S-@vxmlXV UM;wu6I(V_ 7~<=RC r7}P&g /uy oScǮo۪R_R ƆEE 2*$yz?'$Dž))tW8آ9QDAk믿^cŢ&)x?tOtwuu. cGDJcrXE܆|IDATj%1> " ]U͑I( '瞧%MNRpZ8=w RkFR 3/yg[; `mc+gfU**`/ڿWb wXGgO>- arjZ8 -V.WѥPc:r l)ak6[oW###Ba\FȨ3<|vz,L,j"hcǎӎW_I~ Ë,pK][,bSx.|ףmGewZbPxh#m{>s(CdNuwvnrZv#,YH b䤞`T]Q:6zvF'hvv6>faA^J±Hekwi Pg0֜_Qƻۤuֳ"Y $w+e&zJ@y ݻ7?n,WkkB`æ.{ɄLM(֪ittT"`=@U q+ Ԡ`oZnf1>S\L11V*.g?|epGW\JMLgH1oki 2# ғiC|Mzktط !\N$Ahuv/A0+u}'s(OaB$ǒF"0YT|c_WWןwwg~$ꕪfL2ml6ZR.6R= #p> ) رoNG3ŷFBR2¹@H>jpl"p!7c5OT?۬ r׮T+;uxBjhna Ь7\[&x!! +VdSO$sCy(ÇΝ; Y^A8S~{*۸I=~ܣoxxߋKGw=hpW\L(8ݳbԕ;y-E`8rkloj8@~@p@6v(_濥Jr7 36PǏH8q, UDyښPC\ƍb1(5kȹ5p\TzC$  h4 dgw[)v,T*׻ ?(:Ɗ cǎѩS'Y !ʑ^rJ RȌBHؔu]'υ#Xz3F5F9D ∀xv@~+Oh~NN3ug0^X$]Pԧ biBC=F3b \TZCX@*҃ߵnڰaMR4򽠤gy\(KNkFg5w;JSo&RWeT.&נڋݖS$x #U( Q2fOrp|tLHME) w9Zm+dp,Z* &qВ[-zoC~zztCsBZ)N@åR7 tT՟P`?c~p3Q66zb3{7˥;ͫh6~/Hģ%$;ax̊`@Õl! g xԩS<\=贄f yf}j(#س}b>؊fŸdMH`TfEODX[A6 !4p&^ +#~4j-͢,)IIoIMXT sN &LPW:J,*V[4Fkx0[27׳߯NL `eg+*74L&ߟNy=;gYAYpz)ñ}l?P(E, hQ`EX>P H!E π`, zޡwiABT׆-!l.|Ia[z5m\AY{?PcIh}*2E)[~rT4<6w`0?~#>?;=.6~e==]>:770 FhYi͢+7 #[Y`yM1{- Y=HdѤBQ9Aie:M!`/sтTRʟ ߀"n.^Ux<p>K+ nWBT$h͐Q1V/g,o~ hv ZWދ':ƣ eU!Ag0 2u"Oޅ.^Uy~$ߦX;It٩SWONk7+ jd:"ƒkƂv/@g+,1]| ݉8\x,t>(sl&(J 's_JE9=n5YEpxVqavM2!jzi߲S A3aW3%Q:%9x=!?_ -8=E?,F"/([/~M-ovVJG\q^`Verv ĭju ߢ;0ˊ:``{'DŠ=D &a< IIOU77s^c/u}{:pE{%fRB)CVm`Yςe5 ,8k0װ=׮b:臬~Xsa{[g5Z.rD1e 99ɟ36{8ۖUR.C ~Gt3(\.חf{8\X G=,<=l}X0Y@Xx~ Yoq;6OA B j!#$B3y?_CX(U | YC,gwϣ˳Z'VsUtN2̖ɿYY,Y9DrD m7 ( &[|~dƟ5~\т[UP_%6tu:WtUza oIGD@ȉ%ŎNSIENDB`./qwbfsmanager-1.2.1-src/qwbfs/resources/256/covers.png0000644000175000017520000021275511405503640022207 0ustar pasnoxpasnoxPNG  IHDR\rf IDATxu4\=>8vܺGڤjh ć*nrATqBBqEBPTJ J9>qRv8c>goM.s8,xXk9cEU6n6^ϑpq|n6^qSq)۸xmk?˿ 6뇪z!u*Gf>?Ö~~{טux뭷~4sݟٟK+=n6np[_}뭷~r=~UqG>2/Gϼ]"}>?i\Gwooz0Ȫ̻0ƫ_6ﻟi= {=g}*?wu;pozl.d`~J0/3^s=U^ƋQ4ϣDg?{u5OXKmQUYUHw3$7 |(Y0ȫsW.^5rzx |.X߳~|mm|(`OD?l>^$|ϿZx^x=uǢsϳ>>\ i7 G@? ‰P@2N#pL& L* 0#(LgIF1@p8g[!#C,GF]JH,T@o *MzcGqf@0l'og)&|?g{* J*pg*S$BsSVn, *@~@Bd#YA{ŵşAŐV"Ub8BD c"+0%0^5]rH-y 7t"d(̤Zf0#9GQ)Fs3^ͽ02.|n*YCxZE(oV'!GB"%4FRHςfѡP@B+-WjqՋ^)KF׻F"/JL; dDUH@ !!'E Q5oJLB%>"Cc)ZMh}AtMQ \SFؚ+ Ypgy^ѨI;SVq*a/FR@|MB7D P&b E6(QDrǸyVkg"pb*BCƃ'iJʓ^^֌ԁJѓEM3I8e }>J,2IQJEu'dI*Jߡ 寧q/HoЀJS CF xkeٲKə٫ G>6|3V;1 M-鐀 ZUѷBLZKps\ Z)~ ^Y R־+ oX3D?%ꉒ"k)1-A ^yd\SB٤@J,HM+Exr4ެhd`d1ys"^%3 ט!L>km>7@%83覜PvcSO;]I׵VR 90QJYP\XYUK,K?k/"!fWe:Q;JdFJ̔v",i; sn>|(\}Wk"PE>݄@a1 )aNBz96) 2KL+20MgRÊ ⠮ S2rB1EZo+6m37oTR)o~;# Y܄=%D$!dqvA+/2Qˈh9lB6>-5Xw)SV+U75"3<9ъi?#5rc 3fcU M|=ÈsO`?caFC.Q{phz~WڇMJ +om-Dfthb'AR" `BY$9($Bʦz,@hǕ,4Yh%3sшbVoZź(#|3 g>N"pMNJ5B:!?9H΢:&l}b4Z[|JrW=kʆ|G+h/ IxE*ى*F޼ Х.b5ՐLeZAWbR9pTe490CUaX}_桕ǣI@ TVkq.ZO!TUR@3CL//ahzuE"ɘ0IH-NV/̆֍CN\3@L439^Z &9%Qt+u)Y5) ,TY$Nֈ :0f(c) 2 9;8[&? )vIVdgZ!2'9D5xDf֔˸py gdGSr }Ȍ.Dž:Cr{hͭ&r?A ѵ3B[!wb3s`t C{ >rߋcֺ( DNiAa2ZЦ:+ SYn\UYhgg>@Mߔ>DRCyՊp!)))0:Rgt$UU-'Q̬ oQj{cq~MB`#LHr#N" C,P!&݂tl% GA\dvN" l%)t`fu]* ĹW)tJ-8Qj\mѩ O.1ItAm9!JpxYeum `uIM8$SgM(O5A5ڊniX? JFE7%-%Hm3x( -Nhrytѷq["c.KPf)hG;wP2[Nn >tl:dbRƗ2y=Rv Y˿L@mg<%KM;D^eɀ-zFZfD"+ gt;MF\"&."%,E}HƓ7?Ӥ㴆/h}^kM Μ#ja 3B}+q7o4ZSx0dܕ]#@`'`R&!J)3FN@3N+ g($,$K6削F*[ nǩz_D8p,AܩIpp OtYs" 8a'Z3MədOm»Vx\,) mbAy? Q9e9DHȋ'pŐ3)~`Eх/f1gB.K,_9)eͤXDohdO J ({W}\@_G!*/ ٛ tH.ۦЂ A-3 9c{@]W?@8T֝fCINul AeSI< K,nAQ`0v81nqlE( f F̅vnZ50<NU⊉Cs=JV\ѥD AaZnd8"Ҙ+pԌjc>k@r)͚:'˟K\|=GC0$_U7'v-D|DýkCzAK'Oڗ~k^֓v6"keiyV>,1YF^hO61]#6t `23V(!}a5nܬ&`s]A5QJEFI2єy4y: 1 :i1kܻ ܵPi3:q"#~\t*V-mGsJ*\#έ -q%)y…kE`LrNM0ݯ5u0HQv U+v Y?T``e9ɽKP4an\h  89LfZSJGɛ RJȔqR3/,* wwaN R[od1C-ak#.ByX nkh|'bBYxRYI%"(f-v8Td;4SJbO^XF:8ӛ1Y"έPk؄"QF3VVgNPA`JˇF.SJAJ UǕ.XjԆחQSfZ'ϱ߯@1u[0DfؓdMA,Z1|ޚNZ%&xlNi;,b+%>N=5Kl6D1&]f[)Ch !DV6F* U']%d.k ͺ+D6u 1dr8VÊm`HqM\-pJT.;t-HLrzFL{+kXIA?x+"[^X-6"B2U,3a-;o"p/kTsl2*dեs]jbh2|u~$s5UE ͟@2g|Q.oi'FP )F4Q苊ӂc쌫ZrdbYD2&/h^M إ`wS<25 ]ZLe/ " Z+-!D4ƍv};A-bB[hRM!K,[& mҦ)Uנ.d_+h I4$TwEYT ZD'D5B!r^ʹ>|#&mpɄڛNt$)p/Q5sm>ޣ P҈79B NUdM-dĝKk[3VN0ϩ)An,&q |G'SP Ǖ>jZTd!dM u95)PLT-wZd_8X?!=[ajٛ`1L9&KMC 8sF/SFOdZBrSUNg:9g,7ox8smh5R}-* p`:Y֜4VQ)&&ub%

֢EV+wǝ@p QͦlѺN:簜*~йFJv9. dHe׶RΛ~r-Q4ľF*|a!0@@ki5=D/bm)<9C ,#IN! 6tviÐfV)J}o|3yK@U4z+c]Y|X@OUSd "l`?!YW;1sŵS!RΙ Gh}ӜL17ה@D'lZAV90- n*07D4JHjI)d]AٍCP\WmpD@a[ej7&R3xK8:Q1;9券{\z~,\d^kn!jT&h eܔwZk \@ǮFGCuJ3,K^]B '&躚2p)sat9 !3+< 85Gsbj2+NX eY8'њn,\LgYĕzt̵6_1+q|ؾ!OY)!*{2YH^B}Pj2:$$!TmA–ǧ|r19I8DO"q7'ӊ6WGsDbqP2>cjN Ang P~$0Ő&\kD#yTVCr"CObZL+՛oR!g4e&"TǠevkqHF"Փ3 ;R$t>:5VWYK]6+_e[V 0}Մ.!2 %9dw8b:k[c80v"*9`>u5G5e1l'j2,CoBMS$0nšrn;GN8mZe>*Q PATX΢s{,-M>Dױ&tݰíUOEJ`r-Bx`pt H!q% ^ibrfJ2W*5o_"}X/ѐA.: '8dbV# :A2[`0eahӰ|tm/OEqW`9+>]&hWXTI8ElŐCf)}8z73)mʣ"إΆj[ܴGf!jR B.qHN)O,+wD2"snײծNy9ޔgQ"$2ϲV (oTJs"qRkPHˇ#;')Zƃ+LXeW)Up+#1+-فmm% T9-DA>`CkW;:-(m`ǂv9Jᆚ\BPhaDyZ !Ac̄Te LWM6pWp^XW87'-qcj|Rvyd,+vےiTYD 'a)v]!}bXD:fƤ IDATg:":l ,֍\-.`\xy JT@0xywX.KK^cz \dC&ۓwEsc@W+9ss ɦI9ղKq=v\[p1όh/ %d,3;ܨN*Y/p5c$0ٞUv#HZ<* Hm^pTB{h)Na}P@0]:ĕ  d+ 2d- vb1kFA K`'ߋ 7 P(BZW&9 g\bF0NQkQ -{<*k6B5K8Wǚo=]1f :l*y8 dĂ` w7"ƵJq6)\ҎcP,Ҋw"ψa%%J4GeK-?.{Gl#ȭ> SF\D-{;|KnḞ`~Gubn|2_t״9F-c<֪0sOZ-#Nk9@MAV+,Sp"欉4N*FYR}xc-5?.meQ 즪WWXLN1&Ko{%D!k0C {߇xB&a?;`U\uM~8[V7vMBÝ~v*9gO`K OϢ ̸ǝ-sK/rUp&!eȶe"uj #f^OqS `肚1Io>A/}ᱡ ~0Ęˏ>c JėfRE\B\v>@. d$"`5\0~RCDştߧPW퇦AP 2zF[N0\bSfCiV*_}6Aٜ<"NAe&-yDl5c%IN*yBh۪sUx\=vd(rPMa JԳ6'ޤ|?Ql奉!:QmѺN[SfC( TT+tLdjkq7, 6~+N~pNfQ|7hOO0[%Ç߂vtcZݗ2 ; \& 9]eJ$/kBQ$t )e~P,RNODGqi?hW:gQ+(LCX.ޱ+`aGa&!Y:7<ϛwL@ѮN,3:9I5kkA?e,Z!220Jk |Yѵ>;ejrLv/ CzZ5#he: *zbiU >k([䦔juJ? UD|?C7@c7eYx[T6\Gxy&ȭ‚0x^kRe[M{.`nkD{V~C5S͎AsJc7P*Y0@]$3D- ñ2ʂ b@ԩ T7ܡJ3+RrkEOr+02;yȆI}_<5.E(`a@ |S;=:M }I"P)PD[) Bm=)$$iARF'3aI<@BSP] gӪ`/}`g,e7D!dH?KP] .ԯsm5xAeJ` Bzx{I*ۑS±H/{6KH]BZ#q,{?WD!.^Fh[r@\؇O}X **}j rG (HR;" /`NPO D#x*x4X`+/J%|lopǪB*b|pD2YtUNZrjKܶG9 !|M '={&XɇP cD0LJm;t#HY6tżOaq-Jge}R씵TƯDLE-sqXr\_>qhj(*O̱@~rY9s)d:kh;>.WufYoWTx#2msά :#; C,f "݄x{1Сn@&7G @Җ=aG0|g|r/*9.jQ$KIBޘ~)0<5Eq{{r D(C7($ γPL9 ӵz0, *<;t% '"NNU}sfP2yXx5*Bd[K'5$f ̩3WlhK"Nj YTa J.M8:XzjtL,)Ns8I6}ON x;řmW_ rx<P"|[7hY!b?أWf;IBՐkة|W$s{vY>V1pBFxٹ؆t?H g>Ѩ&Z99߈nvr dT:*rYՊW츟V%.F]iry ;cZK>!AdcGqy}IiD.zf t椲n&# dvr?m6pp)2`_{fy|E4KDR;>L@nZ/(Y?84cgDGU }IOqL4oVL :\p%`_=*;ZUKO!{opOCr^aG!,OB%XOV"K(ȕJA@(J^",dW~pmjgBȭy;цF HγWIpU-' VlF`/11f]a ܈M _VLԋꆤeH2lk MPT~ 'U}XXO!n@ڦ%Nv o.އbӤUvHGfON-f esY\[^ \;`osD'ڭ1ά;]$DI?za4 ߉2oPePMgщHHӑ` YlSlCev?*RPduSԓ`8jP$+M`GeنX蛲bW}gt:)FHKQ&,Rw4K Ѩe3>A"f׿[<~3$z"~M,HVh"l">}nlK VTxTsclc$“60j}J E[ gņfӎ[[ I6v7| ʡrO㶅.\#+uO.' 5tI8`u%??|G 9'«oH> Hׅ1EgX>Q1LԠg,+=u3y lEM ޳qCXp{BSbr_[iKA }ԥEQm'_lxc򟧞{{ݞwv!&_ j;\pFtyj2 8kCs0mb2׫Tb+(qӛ˝bvϼwƜU+LQk( kRnqOܰJq|4>&5hgQvXJ:)pa躘H|U{QEd k׏p7_dT[p.mȮt .3GW3m-ejK|]8c- Ehv@ QJh HPqK*5okI8%Kcs2݋`! }cinUPާ- m2CӲy6$dCui6՞ ٘\خOL{W SJfM7*VajWߎxDsDV~uBTx75k)qw씃:Yf&D+HU]K |hΞ|n8[A I8a!NWq: /: Sq]}0vkoH>J ],'s $%B 8$$Ƙx*%(<~DNCS,д=(H9\hJ@NY5ls \{f[ Ѝ}&\(F1ކf T67%5񚭪PE0_ʌHQ։;> E(,T+b9(oV-zEPm PX&) }ݗppEs']v@ښ%cA(Deo8jd%`M9)(^F 놶ܶ 9ZS9m#.j4Y4]ee6d\BG&B(*!訆)w|VҰuVG]moKG3-U=7| ]i -3K?`r?^ +V(2֝Z5ѮLRޙ!tpQgP+z%4t7V!!Ep[4gcL~sqU,Vlh0# ~!zhQyM9Fi'yE5b9Z1eX(rYآӖkN]?핯 ]TtDG-߼$9Wd?Pݐea7uhx[:LB®[I%j?f%B?_JGXahh_܉boO)67cufnX%FpQTmˬ>7Up32(cp+"Izf1zU]pƣ]Z~jkB!!Asvtg s L 9Vjf`Igw)ak\Rۨu-H(N(f߽tҎ=f8o?0N)}wo v#ZP  K1m m VV,P k}Pߥ/p7):زkӆyck[4h VHϭBw7ʓ$T`nlDVHyK;\${'T`֬U< T<V08 h `[Y+(Q( 1IbG:(t6hx{OV8- lfFj*\R3)4o3|# PJ{ #qa{wd6W jZ`TQk/ oBN}ZR_JbiLơ)Ca5& ^'|+1>Ƽ`+>aSͿMʧ FtNYHܥF?v>sh);qV.hڡ8\8k7;njcVj&\uXe5uM{+4'MG9%T$ް62TF6%FpRBwB2XiFD[G$=v\`c/TDoX~bMXDT*d"!J5a!I%%hN@czO 2馿_\p/? Y h == 0Χ%!o$ Q+޼b.nZ 8IMS]z~ FB\ld@HH\yJuhxj^WL hS0o,wBa^7)roFϸ C^6`+1S0`_FJanDAAZ;  ?{@~WRn\O8+3J5eXd!VZ׳hN L"ey0X-a@~4J i.fb< I3N>ooDž=ihvB-w x9D\<XHV;ڢ+P횘D!YIسSkWѐ7սAA d,n#܏;"T4r}q"7z IDATmXJ#ʒBC8[!%#tݾ76FPnCS&łPp3E% ֐@!᜕]fcZD| &MMSgnMrxc#S#*|-pM6f EpKO+Yq>[a;9돭È✙^lz Ѹ$zl1|`Eg*bdvy p>ȹ#Rϸh+ـ_wʜ\>~ݷ@+R#QsC 4%yY{̅fPdǏ?Hq ^`ge!XZmjQ!?K9q_`-34ٴ܂ CO'!7W^!c3,~sAqǞyNCtDQ!7X. IZ>O Kzp\#d1RZJZE~`WPj®D7XI.lC2#pRkF.vXƕ{k t,\#E\SM@u+r,R?eHeA'Vfg8D{N>>A4n"ņ(g6<ځDiOԇ]7<ؾ6^MH]tgTW@a&mՃpmedlt ف{tC@R)gv 0s*n]iJsj3Q3nL<%έ̼O3!5Yu tƐ'Z%B2fb?-y.: @4opcI杌8&|F!hWvHk#^b0iA/gޭ٭ujuTt AcO 7NOFnIɧaُ"Yj@⹄H&G۟<7ڮ $\>6fU @a7;ѲWsTX)b;GGoH* -dNQ|V'Nn(Q>fbYhG#F",Λ&u;/xb[mf'sh·U:x~>%H*ڭ3~'Qjfdx xzjR;":9ԓ5& )s=^#,Cyn3\2& ϴk # VE[ӄ=ߡ]Z@,(e:;v5ƹ5g$ gɚ ֒pp`g=̔JɕMM%6oq3.R8{rd)-6\d *h qr(dauI 6FZ.@c= ۵!7N)WaqSCK8\}<gUwhC 9s'ZNAA(,[ d!`52FNtK4 &LVG0p >GPL-pxi.l.j h eD!Xzd}Z:v ˎfTXv';#aԡB N7$NݴbL@Ƭm~o-$+5c  J ~["BR3'4gD%0;υ4dGK >^d!tY55a38e;avaѬx\$&Lϊ!̀!Q#*@:N]ffJWWjiχ9dlb.mkZ@k?7*\, Lm$?Y[Uka3FomLF-뎭Eqhp3 92*x]pՐj{I Ͻc¥*D-%fpa퇙8K=BBmfw5"vtZY4z7Rh? hDlodK3C3Lgm^mPBah[J@7V{ 9þ'ьʍg820Uz0OFVpBP%{ T-õLȋ.HA4NK+i0#^VnB`4c<֖EU@.^~bbT>eƣ[mF<>$AL) 7 )+bL(Ү(!0.Va'P[e Ӕ;IJHkYB H*΄T m8%IK0{ LNFb՛ H7'PgC]oH} ڌ)?F$fPS+4=e4 蚽1cǛ~7CBMmԩH5X!jIyL\b<)h([]~X;&Q~x|W`IPߵ9PJF &5 WT^ +]\[fjR(#iAF'M/ M"8''A^!DaBfuurjSFqãjL3 w(˛:q^"S(+<`nH ?Ah )IDEe\ū  ~W-b(MtKma`66TRz]pHWv~[|P?u-?ՙ Ri*&ȕ0梠=*X71*bL]TvZZvpv@`x8^nLElɆ>63af&PYп-Q vN u'*D ]m"{J9bnMNc <`₏_/o~rOU@2PwH܁-Mjy=n"Jm _E>=b]khN"ܟARCOs1Mݝ2VnG!p i4;0^g|^eLw͡uuɪwT?- ec[o0Ar t!NG 3рf ӣ]>|7Ɓ'Oƛ.=m!Wo6~ǟiEp䂕p gb^8V!Cf2w'?8OoOO~?¿"_hCALo˴}ҥDI Ħ,Hg_v&5hY}gI*ʛƋ$%nV :@k햋Ĥ_4E&=c}džn1-StX@xלƃDm{Q bͺ'z,kZ~jFtJO I=1~Æpum2N`[9}߳hfѧšHid>5|w7˿6OO?G7O3o|?o/ҿ"ƻ,&P(;IٶZYx-VE%K&f*k1f"B%]SGRWޅ)Xq{OYGm/!et2[N6V[mM[!,Y4ׁ5ΗUwOң{s "XKo} g-xϥČ,PZDRӱ\GH"3ц&Ŷ2 3İg[IԂc'5~~o|?z1؏~?? ~+_O}'o?;o7KO8ur lMTljC()f7X^-!yx[j;#Ǜ(r.n5ũZzʅiThHwTD;DY j/m\Y"Jq^ed{)^f<-}$ tPJU;/ ~gFRm|N pEV*IC2R[axyC /ﯹ=yZ:>G/Qy=Qy]g |,|kw\܆Z2 kAZ6.}N)uP`l!+aIRn6>v`#}rʥznWhLs;8m]_( \>Ʃ$۵@n6?o7Wyخ2]|jmZ5aJ. 0<3:"\a)e k1jc[`z #Х"4yh5$-3Hd++&.}|7\~ 7?/|%A\ O7|wO?;o'&\2de>4FUmU\T!cڀ=(E?uMxGȝ10%Mm>=ˡM+2g6YVڡ7] 03sO(V&Rja4 ՚O_) 5%㸾Ǟ]/2rcO _O_p[MAޜpbMYP͝z{Z/3߳lY4#67)5EWadK6: 7WRBo M>ȁ2$Ssn Sud:?.X[۽B\v 6eѵL=  Sq0 PV,<9i0pfS󭠒&d}Ȋi"CE%#hg,B?貪Mt'[|o| ?,Ԝ~?w}|O~w~k)|:O?| :sUXګwR xS.cLAi aܞ/pwFPL-,K^NCڔ,V|$i2iC5J\ _iPGP}7_;%8(B'P #6~4H*ZI~|vTHm؏OK<$iѳc6)%,--ѫᢱ)$gK"Ly2']Cdq6M3x׿E<'~mqMLm+?e >?O-|;Ww_~ PB{f2121 VVsZY@--#Ʉpp"``؊QkECP3r.u}Mez-j+E('9ޓBR~ϭ@}znB2~MbeLgxüxaL i7f|͡ vQ|c[Հ J~J$KMHqpY>CCFXQEufKܛ#C61},n*iPV>JR9,ƾ'6ZƛXR:e(VFn!qlv{˵7]X'0bc<~VHѕBkwn֩@:NݟWRڴ!ݵ0]X1h-ʬN>x[؉֖بl4E :ym}gO[l;^65 Ӗkfa'JZM m&߰Bo`y'z:En7R!S8L2(I0AZ2[_,JҶ-uYpK\njm,s= xPV:c ;tEc,n6Օ3Hp{xc?wBQ{Oy|&Zpm'Vj: ᵎ}YzB+D*7iz,v27a.NzBҮT3weNW=Z/)C(a)XdBDQifdubJ_Дպ"byYq0N8>(I[_u>_A Dekg~Cn3n[VU<[;` .&<uv 6ӆ6VԷ'w}Gtu.>G67Y&4'Apo=A}M PퟕO |j@{u+nRȮIkrS&mWK9Mo78n~s 5st/Ltr+V*׺[,F8R ٩T!;IPq@S4э"L((d!]q떶kWviLUV׌C?xW]z}=uircVs]U Ӓ(l[v^ZR\H;ڳ:ns:oq^ 1i4I6={]kݾk)|x}wBpVko^ñN|w2lˆsu;غ# FmX>@vlL'l'ތȻƟ}Հt;D7NmQk ƻx|@n6h T+}7Kw[ B2 IDATo*RD"[D宛 7&vbd1B$=EG␝O: ls%1aiRpڈo1X"z0fS$@R:8e1NHMRH'WczBׁ[[2t RzlV9`>%:eR{pmjӫ ]}7lBO”z4) RmBY%}ǛpYtdI@tCDO(~B(7 k6y@ᓅ%o38!~S8Zd_*6(`n0βR{ fE""T<}ݥ16^3+.g˖YxZM ((~xP%RW4;*4 Hbi[ʪ4HQvlٜ{n^(n{|.wy(RY|.ƛp/Zp-S Z*` N9)uJAt~Rc; XFIlKB(/%B٬{F9^ ܽ L\w {./sDi_ N^lo< *l]X6 K~j g`M2q+sV~r v!rɺX`M|s>5 'l,s{_/׀Nz;:p1Z<2_VYN\ {drt1|MU\9dduzPT Q'*Nj_y_x1d0%F7_?߅+Vdx;#<"{a S_rޞtߌ1.=z8 9؝߭w?wձl)@թ@NH :+^I*(`|<1\6[S ZlXZ6MG~OFڝуq>|7~svo w~I|]¶?a9}Jpnxz0ڧA;P0dD÷>_ _xpvΛӂgw|~f #\z!:ͶA`| ӰfKDibJ:+q}ouW.w1c*,v F]ZwFu{f)d$sH!iۆk. ZKh2]o?/Q%59Txmrߕ=ZX7YcSzX1kkhb)1Ίoڗk ?6i0^my]o:m3cw7`|IZcwyp|h2>Gȏ?wOޟ߽7 x8;hgldYl%%Cs{%1OݸN$=~g(e+W"6Hgq} _6[5d+&7!@7/ VBti9;3 ?rnO;d߁_pʘNATލ.᝻opq1Ny셟WxY=m{!岅TۧMC=yrQb(^Tno1?~#XR ' sե\~ܻu vb0ݨ(-8% B!>AhQ2m^%sjl\h@9x{ E~1WX)zj[1(Q_R(ʙLI eC*or&^_P,3L+Б # GԆ<Ө2CP0'h-L!0ECؗӜpLYSE?=HӔ~",ǂ촭c-M͈nl4gݢ iZ a);nP^7؍q́mՆsk[0b0l6r=ZOt7܁r=x_3kXQJDJ,0?ԒP* [DވtzUJE'%_|uVM)(`4#M[@kNOi@Em7$++.%瞼w_Oqq_?0p&m9wkok]L'p>7#PONҭcn>#n8a.v7q$$NzϏ8&;>S~׽KO r־!ӣCwLVVACKġBRkCd htMf58%j >}#]v/07āc^=> Q2ń?7: i땀t ps .&ܱ(OPz)< myEW*T ]Cs23b[2|A2OUNU)}E$:h4ܼrj% 2  lUdw@^TUmU$kzqB%0xxSTpeG#b.ź! 'p^cM7q4þc[puJĭەSRC;Dž tFngh =J@AzQp6w~?jfG{iJ]7 /{E5eD1Prz<5" 4fZ.% !IJ5k,8xV ӈV״(;'rO_$V^XH|.>9j]-Zypi[v.|CfHׂˆdCB˷Mu]&}j hE?[B">x c֋|q҈*;8RĽ:[3!/K;cgS֫Yi8V Y0\&uW嗨 L *a8Hpt-n= #pOkݞUn̈́˷;sCpu *vKB 3o7d qhCyɫ~{|uv(2T,dMIwo߉0mJ @,b†\E!dvG$R jyN?-(9glհ^JL'O#@7ZW9tC}tN΂Z@*7RlbxE.wo&fm0>n7gjR: ]Nt&ocL H "o2՚@ k(azCb8sv9ߜ0sx:ôk)*pu^ T@HzQH[PW ebQ1LC}f :Ŕ/ſKNue G[ Bo3ׅ".zP%_wX<c|#ƣhظ/URbâʕqx-n]-ْդiL7+WvH% $bYS.jj.MKFӘѕFk۸%4ͽ@4,Kj%8AS 鸇5M]Ĉ35xh䵰u-Cmt>g[|P?Vy('B0lbz\?[Tf}q7\ #V>"1U^q~`riLI)ڦa0\ V0R_?Y1};<.kva@^4Y0(iF(h8YkB #tSU\歏2~^z/ vJ&$B@klc?#pOcG-'X|gF"$]ۄ4?76FQUaXk&{5?=j5mEEJx}:X I7XB!hMEUiٴ,[*|Guְ*$WTq{eR.m1LF}unCV |MJ#  wgRsr|ǏN(kCդ0Z$(\YumX. BH`oGIa< ӔU/W_vf^5r X8W)p[;֢;!evu[z8S(`CM]jрS z%՗A( O"]b\j=VzM Q8UH  š@j.8!%Ý*؏#M:\> Yi!W#N`B^K:Y/\>dqI/`vo!IzUQ^vѾX l=ZwfzL ,aPֽ3ZXXe'cjf YeIJa_!{)b:kSdOC^b . xxmkX<:_pu d?gyuHm4 .WhP(!P!Ý! ,CR vGEË9JIڦEr]ы#UAY_ޫA*@Dӵ ߮Xawـp>Cnm;N͸R, y-ڶby|كc4'1z- {1Psy{4Eł8$AȘP3ВbuC+k:b/cMS7QB-֔ @bxCrzȆE!9=m]pp-FʖKF&Doo*F鿞vStIs5>06}ו@#Doq{w[k/0uv٢M-BG'e B)oP{\r.atQb[TQ7 Zh2B'\L BMUc腒w?8/׆C4WGG' " z=YVPU 5F)a кF)E>11-=cէy.~)!$T<+起9SnC.Nϸt .YuYn<${#o|7yNl<_ϓwYW :(dX/K&㔶.]d$Xf+XҏC?k—n3s|41 b^w7~{1$&B9h@o6D1?eWyg`$]/[`P~ɕWl҆Fشza69z`+ }m UYs7`~|LO" aP\dzWn;$=lE^sܿ||k_a X tcH'DS1(+M&zޠi  ҟ(Y/r>Q)GSswSO>/xpXػ) ?l|`x @pq>?]@Ww+2l;/vv nublJvKWұ[MQF>$(Gg+@PT5Ţ4+aZ/ V"C<#d~KO2_7A/,+iц٢ T֔mEkj\po#^ 789瞿7i͔?w;,GkuvG, tL`fo2汽JxVHD2_x˼` IDATS/1wX-Eͭ'\3jƣ!Fh E>Qiyٛu{_&/>|H/ Hvo Z,+!0a>+2ClH.[T(Y 1M($lK^_e~?<1W/E ޅ3W^_[,6-`\y2HqmpQ<%"iڴi[KcWDiޕ ;CqûҔgWY1i ã2sI.2.E12&hL'1 ]V\~k7p} Ӌ T?7xv8"SDRqxibT,|v`!J8ffuZ ?bB[_-‘ZZ-B$a'ZP%۟f-lX{_NtĘih_S `&hto)aǒ, KA 0m(e99_",/u >pVdy |xL&3Os:;_OClm֒uQG/df |ΪHD9W/yˬ9l$ġ|^TCgZ,D$ yp!ɐ.駑ۣ׿ѠuE[JD /FmƢ8^vN+ ?XbT;vv|B1 i(֝..vO 97ݦh+3m2as_20D2CLuxD'9{QI)2 1I $TYF0[GAL^\HAI! M0m)2]ԫf%=8%HM"`5hŃw^o K_ϼwyO˜KvM}{bF`1 b;ool*W\߹BSNHO#b2ȗC ݻmIy`a)ڔ!'K/3JԴ}ڶi . Ѷ) 4 uO^G1fiJdPA@QT /%w"ںbyKCEKQ5'w8~u>_\~݃=NNO_/?`ztǞG=qp0xڕ4_orW=Zqe{Ea{O "DPd>ˈ4낺*I҄ 2@37ayaY;;ȀQQ@J.;{C>|pAU=#>\S5RI5T\,=3iβ9 o <#_7uy֐~H)˚14Ux Obռ޻@^jH>duSj$DIIY !I(0ƘQCUڼ@' u,/ /翅rEų_~oٝ{??>I0??g1=(3U/办 ӏ=TQhD,A/b^ad@i`4J/vjcHQ mCTU!m^Z" BeHGvvdgg@2 h|+go\i'.M>.خ.8 z5 tP]p@C'\ρv>Bc(l#d$dĽN9;>$d8( ,(7]0E,)d*Ɠi,j~_ٌa*YgF %u EQn` |7_{qeV $qJmlcd^zS7ahtdc'1T=AÄw9>}hsמ~$鳛RkVݫ)*Cab|IW(% bžms$ њ89x0w1H~ŝ2FS`LKSFܡ (%I0uE6 %cLѲB"[뱥iHReq6iؽK,9=[0$/AKj =D]X.^{pHʶDq+vBF#I e!ٽ>Y!yM1irvhur]4EuӓU^Ȣ:avzJ_a R? ͫnv.?aEw 7.Gl\`[yuY1utf37Erª%,vC'}Gseelq0qyP6 0 ekmPRU5qh[tۦа?"⬦6`}xã)"{uF^Lnj&ܾwǧ|xpDoPs(EopY^r~+\ '@"AУ2-d?pHs\nu{LJX-IVW-i,fsj1a.jF)D-QdO0"ʎCE˺iAJɲ苈YFO֌vbN\WiޟD }EY[ ,- $44 ݄n, :E^8uxd0 3UM[v9?>'謢)J궥7r~:(9l0R+Z b1+UigAhÒ 8<~?X3(8pzf޶%Q5Qۮ=hyGgn_݅oϷ!4r/_fK~Uu[;Ąa#RrR =z" BQ.+z" t|A$$ĒbYP )T8Nd48ˊaF5DWIe1MI> kƑ&]\aueE:ST!I 3?] d~W^\8rӟ%+{npUꋿ+^*/Aėy!?v[!ɮ T5-d.iǙ;Nl 3zE:K'4Z#KQ@*C)Ǎ{q N?:)OS ^Gxr2zya#65;wHb7ࡗ, br^3 uV qVFcO(SY\џ4唏N{rYl4^ZNAFk lc0FEab % mjq3G9s8i[K+$z@&/|%N5WxW5$[[߮dQ@9/1Xb8ZJ" iN8ɒm=qAH財 4}#/Z$t⌺mQ*9?EA(˒aUCB!!r<]Ny!P,'̚aIp)7oma^yn YREKhT?ė})'Q+ :ן z}\^O~6(osp|A|m4:d>+x&UcN ɒ,(S.F(:A6)HЖC8?ݛ< LٲijKۣ5I/\8r6%q$%=5MeB5aZ(Yd^b獏u"GnҲv) l  o@YnFeJtabn ZJ ƢԬz0ޒ"㰶%C$Bi'$U4yC t%N,MzA^4Qpi-Ni$p8đ '㚳YR69j8ƫx3(lF  {H& Cu"$RhN'$Tg pdzxHUz663fu^/2i[8*B##h! ND EM(% M$kBrs5kN85s tp]֛ bϸ8qd{kDcjo^ST9 pBt4ֳ+ T~ bRq?zK ZI p k<{ܻʊ Q$ID[UIoNDIk<IJ|(Pb^'"lchLMK=Ӕ%q'   R%h*3E !m qpZc 8 qjkk1yJu0ɘFL-fOA~G^~WH?q5yyw NU_\1'`#VA~eq&CW8jx%V*&gAR0PwL mn2ܼưOQ$Q@kZiY"{Ul2Ҏ?8I#ut5C'pPP5)RTyw#B^LXb!K;624SNKLc?I'Jݵ}M[1)*H˷S/})fz7 /9| Bj( 8/ wA7T-h: #'HuuB{12$A $EKz#z B~嗾K׶q#9;AOuH\()EP5ZT%~D7Q:gkOc^CU!:K[D0qM =D"ż!ic$$N@ƒh N P$ )%˪%S:q0θ+/:1p9 K8iڥEkwi|_?"&v]VYߕ*@$r$*vw!]y )pp˔ ,c&=;.'0m4A$]T9=[\ )o}Nd5qkATHZ6@u"tJmZdBuJ'(Hdw7䌃 Hk;!ݎ)/skJڢbf<8>bsAG"L&}ML [zFk&wpcd,3;xȠpA>19e]UY3ݭdXb ( ip.`go%y]7m8I44 iaV|t*:gA]}q?yUj"rAyO7e;[=咶llp|t¼6|>OO8#!R ZRԕEzFZf6IMVrV"`mO'jۆY }~W6+l¢_ƥ T+ a^tIKo×Kw|ԚHEE]d]5('h mn)F # Q4McY^2) ˆA'c6-pEd6 O1M6Vx&)z]j.ehO[Z ֮lBuK^A20˂"7hR@U@Uy, (f ZaIe%ٜH% ;Ӕct/$Y'f~2F+0- h%%ɜ4 X sSpьQ]px{rCx65엶*5%( ҁu%%<9B˒1WKC/6V)%R,įyh ^0)ޕYpr R{NI q"C[&Kۏ>ULW9={ɂ0X&oў4i5rYR%8vFi@,$XTmCԉIr<$ cnw/@8;} ﳻgnTo,R)ΧdexE%K[  1{^J (W3meR ^ɉϵ.yޯ0R(T0ֱX8z,Jёۿk="IGE8yQDXISQW{ng2 Y.jeI6bgcLz)N{e ۻ=2d Elqz<'R#YL /.x-9kkDGGɠGo8+T"hitM_<>=k.&Eq #NJNp0Z⤧6xVKw(꒬fN/#@F)qrz tvT0؍I{ z ]N0x_s8_2HcYKM|$ p,N,z ]UE`<άI18H$^$|ZbZun?%$|3 k}j Cև}iޠ'5DaH ak0`h=UUz<yTӓw8^zN&*q{u#zzU_/{w.4w=A(W*@R([ɊZS\=8(h9{1;7w3;=!@ [CG)AE;ԳfFXP%2 N)8簺!bm6*a톈,b6c(8IFL\}.;/5J'>`>:|wur I+A]hGlv8#6Z0k%R9n! K*?Ӈ6o4O>ݤ-ONܾ7b>IPԚX,sMEDbE,rziтłҬbIa訐Abc!0Tuivᭌ ,q`3+B \KA"EjhiZ()& XN+><6k[k'gl¢,7ㅍ]|2j TOB\, ֒ـ|E ]W#Ng8gV9>_z)G7ٹoOį~\SkwF|ӟݏO77[=Ռ'l%IV)%¯XG]EMXzYDl\BL'0DN?&R󒍽a7D͛Crֲho!iXLFXчye-5;M>sj0}a!sB$(c3DGx>q'‣1AO0c|'ܼ5eD9? v<"wo 9=\gVlƳ1/\ ,$Mc:AD!sBn袤VH*@B-.*YY{wHrQmO6ܜqhԱq8.pZzϦ+NpZ4dBZN k_XQ7%"Pq^n\pxqitB|萑 '~)ZyUiKᵡ Qi-ycPtɛ?A>6wwo3==a,9?>6fѬDBmrv`: pDX0~)%龚~ҳKBO^*<7H??~:%o~>|Lځ CS襊d",Ơ% )* i$đDk=Z{XtbӚ!iXCw--j6g )k & `^BB@Dr|8egƝ;[ &gs<@ -$z,/%[#9xN kA7A~|RǏ)~kw8M3)nnl52Oټ6 BW$"F54c՞l݈ŤDqp~AcB 1(I [8I71[,Y9::Eu:..tzq1ú*ek[I(CP{KcUO0ktV."Ye0ƊG'Ŋ?ʑHAtPi[Ե%KC%tbj%Yx<}hWVu$HX5V`-thKR{HA3)raC..{[q\tQіִTE+{;ۏxm_J8JXL:#~㛿Aq>3TcF'3%%qESXJz4 ȺB;\P\u(C|`4aec'eż!iY Ӛ $ZD5CkzK-hCLO+zAWnU`р{|櫼_~7YáN& nK+ ʸdBH"f=KX xH ||BݟCaJNN70tPU;o̵Ni&F(w)Y1>[ {%:Y$'-0?RYa5lW6ϸum|AY/bALAMH@R ^xrμY pI;DJ֖8$@( ߣӉ H9wDB{fF`ySH k$EZ|n6i3o1eIleeR95v[׉ebu7)cƋ4XeMJst:s[/ؾ6Upu]++U+)py;LͻoKł*yE/IRT%qў5'5{/n~=cY"Z3&HXv!W5⼥=mnl1YdrP0:ow hcQiGcq)$ cQVHɂR7,4UݐzԚT6b 0-ں;dYʣ'sV3:ZdPG(t| eƽ v7P> ]6^+}'!X)ov ɒ?EnRk׿fa.|(__!@Lk=JBbR./~.N;65Ğ(qLf9#Lń3;DC̰EɊ@y$l g ^d&)t։;7o-AIG]Vh J!_x3~^6|gIXILYOC}-R4KDך3Y=z {!݄Pl=#5w ws$ޓ%1ɂ@Մܸ3r9ׯQs\ DbROSvG~>k#;,y䈢0`7٣+ yf`Cr%i:u ,DN1/)'Pxõ/_ca6ґϗ,4JɒNK_<>&JJ[<)9/=b>2Rpggn7hu%NV܉Kƕf6:!xApچa'Fh&ŗn3 h dVKMekD)VzT7cQm*8fTo㏘L,|-\w9 FTyEqR%:2_.X8<Nw3KE%LkqMډZ0c-^SXFQ-a *k=RhO vSd5N5])mӡ:qѰ1k" 2Φ=lYk89>x5is}3;,sTټe#]ߣ -7^[=c(7uɭ;;=%Bq gc~'R,L!/\--YN(3| |cF;kOWTMA B&E5EstjiZ֝ 9Ӛ16lh,<;;#q@Y6 w+,YM8pow4g:dfND9Ɓ5eNoULS-9!AJ6v'v7%c~G?i=/X@ѶlXj zcvVƒzLDs8`+dF-tD1 ]nJ`a|10; ,<+?3ķ=]pBxmr3!؈ػ?՛Z IDAT_ddD6BP-i'7+\]J&lZA2dHB%T-m> &mѺ~>ߏ?Wђ QӜ[{#>.U֟QT97^v+38-l ?gx2<|{ڳpAxh;#W*Et݌@vr?s?Ӄ3E}{+|~l>oow{)DŽ-\%ަȽ5~9/&7~x|C@P7 ^T[v9vvӒ<:xFZ֮elȀ~'fvi^JWTD޾ŵu8`X.xSPhp-$ShIӐFRT-Y75p}205En,` A"F<<MSq]a&h[\ZvRq1`_*:?&=ͯ!:ֶxq6Oƫݯ;_O,>1Sg]+3sx^'>:ۯo :IY/[/~;l?ĽimUv{n}}$=V%[% cmlc1 2d"RAU`HdKz^߿w=Z+?Q?\@3m9g=s~,هdy4%e~A^y$i,7olsoUvI3Oƥ`uc;|3w?|j{ }q6 }9U9|?ᥥ1qERd9GG~}Ru~ӄceFk3KK.W]] r:;8~xOdFх/ujB3/SʐSgO%,qpdyE=e  VHtiu i1Fл2>ZfB?.AVhu85pz%&{V'`sL!4㭼-o~sFi% H ԚW/6PRq`fZȮ,_Ύqyhxh}G kk(Ee'/)jr9.FDe5^) ƌ< A|o]~#ztPu/?i[ǛO=wzOGy"_WxSxS<(3pÐ2MxٹW/]J*x;~>ےz;"ځTj02z-<6gb;Jx,HҘ(Wƞ%) yKVX 8gzN2*>XcJ*+ w}k ໕Y@kqS&֧1f}<7әjkG%{77>{z=W[X]fiy ?q.N3}u,{sTupo85ZQ\f5r_f) h1'O*}Wr">p7O$g[p[~3 :dX/ß60a+5|u ͩ~4qq*O!ç?$Wyϻ'(2[UI]gc esyp%HPa4EPV{8~<ǟXOx5CsS_v[t{t&0X^#l5P5v zfB&VYTVq|BlmvUGGPeA!$QnZCoL#aKYYd(ՇxϻE5ά`^d|'4}t&'EyYCV._x!VfcL7ZR:?ƿNwn7~W_*,99Hͧ?֞?÷grRG1˫\x| ^BjkeN,MbNp+WF\Z"Ybv"S3\BYtY fD6\] H|i%ay'9q^{{1YJ\_$#ϱs.W_S(lW8t63y/)RkY!u u:8|3AٹyΜxKgc?ʫ'yꉯl0ʣ:t/g_~8{YRO<>Q÷Y.]8Gؚ#سW^=xMo@1ØO>IS<4g=E'B_~}EIsgug?a}p*qC_ J) c}s}.._E>ſU壿=t̹LڼဪsHw*-IFY٧1#.f6~x˛c*#wqga83p&el V ǔF8G{'wɟxNCOӧϱG\k7nOX4gv>:71%x>/WZXmPtͽ ˫ˌzCJSikF|{Mv*K[m ~W_zw?0EN5x =_}1sxaK|k_Usuʲ8_]wʔ yo6}<\[Qd!kxgsC43fMtGЙ#~'> |>JhPoK~ P\9S3 Sw̵fmOӌȭ;q[ɪg8T|΅4Ssa7~ahn9 νzӯӜ~'b}^ַ^2ch]K]6mqIj5STpx #DRz4$)XEA1,Hqx/\cInRLɈrud᭏=L)6oliFyEmH&3N^^E&s\nk/Am^~rvw: ]._X\s%և\$qN*?ދ0u\||{riCTB2Xg~q%V:ۗcܰOԦ|o2i6ш50=s\J0aԽs]Jֺ Veiu/ vo 误CoqE1xām7E#du | w' /t}gu}z_|Tm8GϹp -f+VY^ >O91|QCk)?+^|9ɐpDX'oi#~I957 tYӛ C47.._}L֡S(ҳc Ƴ _WW^rO^o.1j/>*OgΞ62fnVZ6McgZ#&aXF-_~$@};kn%dz<7 (Ϳd\mD|Ò`3-?:N|8fbsS阼*5Q[߾KZDd!tIclp6(-I7KփZ2LMPο0"-UcW8}<>wx7fϟggL^{fsK..F-B hv44uW^ls+ܻ?%1&t7mNNnEƅӌHaqja 4FQZ|YK2wϯ.seav_:4U;]'?AR}+gS z1w|'-!Ogvf}wkK$yr"E{ ip+c^8]"^y4Sywʠl^d!P^}G ]-Chj~ ']w=p==&g>$͹gA_f6x2ϜB][8gU&xt֎<7Do{N8yF$(*mͰ7Пc".cfw8!˘{~?%>/z~ВC(T};u|\0uƷh</|H-XkvƩ!?wpqeig~÷7nx5~J7hFٳ0/\\bxnӡ-͏v3zn ]!Zq3UM. z+1ϞX۫ˈ(c<׷yUoO!q:짜Ǡ!T!FpnՔ"1ePzϿpGKo+E)׳4fuV N˧qn{qWeTMOu9z&bL=lbs{}άRV} el$},;[ 2>gh::ak Pnx0"$*: 7!!GA $h܈ Х3۪Q #9hIr?Gbw ?6;uZtp0`y0Р!IrLY@PȲ&+E1|6 g9QMTBhʜ3sH\n:[f{Wyq^K~~2iy^yH#"ߡYk0JZ-^>xY8 k[t.^xLu N|-n06/«'惼ͯū|/hc'CyQrMb{mMG{9T:8ʕ%Ξ:-4^LXpr [/cӡ( 곸hԣ2ڀnzTZk/ " #i5;^X!k`,&)(#k;n7-_Xˎi [,e.0~ʥj7=Lrpațv7zgn!ǎa.4u ˭wGOQ;;dN5VOSߵgtC;9r`/(hLq-7WBJSoa(|ۊY*2~L[+0J/rm/ؿ7}cLm{w}ca|G$GL5")RJj;:\N;Wa)q='\WHG6th|* It' ʯSUz=4UuIhU}{yAK+Wx\rC@Uf_($58AwiyھB9,@%4 C*(=inx\RocסluWYx%;)`!^,P9_K/̙Ô8?򊛎5㣱l6iҨ5xᥫ=w0=Z (G0l1׶IG%VTp0Y>̱!5NHɉSWR;m gzE?ޙ6K=54fܳ'X) YjxmrZ{}la5$GRSU%K3LEN =Jعt4bfvCZTkR(d)AQۈa{mKeD +U>q"@kCyq4nRe%J}|G)@yBk$';g p1P9) FIO/M;<}m?ǑUU@T޷0(@#;.,iҥGΦ7C YX$#ևո0s>ERb]l6$KEU2;QA}Jzycl' v=gsHjTfN)g9qYzC)#14x~DS"_0*G!4vˀ27L5zDvHgqԜ 93Fq2qm|z7j@g1B8>q~r(ej9*FA<+<6G5X)hhx!P88d;bхFJBaC- j t)@9Zui} IDATL@ugjt=l`RLĨEIQV(ߧxrwh8MG[͠MQ>_x8%Sַ\LJPx֞‘r$TFC]*5[[<:;gVo9p nlt $DY8|=5(BGX,/C|1)(J]5hڧ4k r>ii& ?7WM` DXi)+'@+Uɭ{\0XQdӚA(jD/2DnH([P!8(Nqɾ&:8~*(M$>DNr& Pq' ,[MQ9{we﮽(`l6P18芢(pq>Y1ia b$OSƱ MpE۵eR|v7/ڈ GY7PqG,]z1B NgBG-ҩ+l20[{9ĻјU#ط}{Z")2 Ƭr&juxe4!IℭjɘمMxAo#N>6]wHbz! uA(+A:EvBK.5­w~Z%0hd"&Lm Dr<eJ #.] ~J["-%RF3 *p W1qA xKFE@:tZM RJSYC=hRZ4樅- FM2Y!4uBZI[788RЪMk%QhcI)WJPa2N)O o"`ff(X SbuE(}\LFʂTE2u$)KUUa0F"tAb'@(pESN@nuE ΀ZH)(H p8 29D=6#d@$y\D*kK1dLj yFj QPۥh)}BBN"$P\'&Y0~]P4NN oo/lP KZe FAp]Mc5rbEt=B} Bfx*$ \l%GIr~ ,>qzIR]Q8*PV42|<"u'"OP~@EH-IEQ`%!L&cbRI&3x7&Lƻm'$VUx^M; msJy ]p&FR% &FxȃZ|0HhqecQ0t䶹 "- }j`r%EQcޠIt׭mrE(oe~f'|ՉQT:cgB3*R|#i5#^ cɫZ0 k+qTh*ǡxVR%eSMlMOAYp 0؀S Gq`VК:BCwWY03ABl7~9T?!< )Qv#"}:}ȋU.! H2/VT:+.֓%B ,eA! Ӕ`XS16*B4SH> 'j C[$?I^I+,%(d*P$e*,ľT$K ~sL'2qeh|O-ƕ,Ek~k9jFoIڡd=T%jԚ>UY 5К(ӌt\5ghjFS2=ڭ loZ$72$@QZ j4$u=TCp%:{Re6zw h))c A!+䑙*3uEuBNG0-ynib p`!)%R !KIXfE80[wi֓q#tefDkV6 =Y 8Ezc˜,(O3Җ.X4[ҍ+f͡4|m-iRUY q),*,eFH5JrJt( -$ [h)h5VH Y!(*F);EgaV"<1YI FCM ZmIXm `O]\EW2xJAyf)ҁF.b3jX iHe1@1e"VdT袂Tb ɸ2,(W}dEeVz_+z2r)dF ||ia7Ɓ* dc7-Nh yjiBZ4- =E =j&,z&'\eu#%^,kTP.V=b(ׁbab2a Fi+A< Jlc/,XCC44AFڒ悼++9R@%i',a>Q8Rw!gZ ~?SLcA [.vWΓ3]GeөKUw\yAt߷Q]K[ME1]%PИ*eE4JU I_ @0*JSҬOJQQQ \c SFucVsVK+UPQ0B T4K2QR^hiy 9-HK"ChPs%ٛ5dԕ8x1U-I:Z%jr,*Nǡt0q((K6dX",׌rpjK9 al T-tbk[%(,l M @[H K J\)izCK [(B[ H $%ajoD-1ˍ 15 JHS=v$ZJ)*h@$3y9Qܐ,@Y,64D-IE$hAVhұ%DjmI 7^YQ@[t"e*t7\61Y})x!'E*֢9i)Ɩj|l ~岳%ОA"¯ !r% Tt Ƕ)iQd(KG:Euq*~~8pW)'6o/o9.ϑo:a5k!pZ !RnZ 65JY"8EF4.x/%S1땧,lχ/)qh 1|DC<Ɛޝ[1:z,ԕb|ؘr/LɯO#6'DRi+3__=!$hS8}3lxb\W >%е_Ήa[Qv9M=zMv7F(D}`sʽc$(3ַĥ NEgM㰵Wt'.[gܿ2i4bVa4 g(,2IΣ`mURhC^\%,6!&godU=NyxNh4$'B$xUvFyâ&/$N.3ZJ Nh (ACBY&l>/'IqI`,5wn_؆QQzfk'6 <&4mE, X'21DS)g==jx4__^v/|gFFR NH_O:NSݗ 6FlU^eN>|aд}IacQkX<(Q{e4P;(,ܿ-7]Ssϯ[(9xjZ>1vc1 0싖uIGإ *ڕ/JG-Ɯom#]0?)wCD|pKDV]VM\|HGpNC`YZBPe*) UbW(Ж!DI+V`Rº mW!D8M%p=og[JɽaNg^mr`eK>oX PЖPm 1B %Њ̖8,AYL"_\p3' 6]( 6tR,3_糧Ha ͱR][+ue4f_P &i4 /9*GLǴ3'jB鲅.jlZos00#1n }aPCcKy%LX'> >r]g- Y,'I``h(_IS>dy+irzf&e*Қ+A [B15Yiy(+5$uX2;A[@emMWN〮`!YV01k*H Vf#춆;D5d9{e*('R8/Pc  kHP)Aj=t[a0NJbU& P m JZ m+t+*U)IA/I\.@@ HJ7٠ru]]\̱0BemU> ۴B]u5ǁ؟y}G'!o6%-axdg )!x򡣢\MBPm)*?G o;_ZU-DUB  *e\NWJej^_/ [^|ԱZ*^ a$yCBJ( ܿ,S%^|L9ga }WRՑP'-J4*2)LA$K~&B]SV V bzh\p`4/5CgC$@a l)]Iiۯff%:Ow; xf[hߊ%R}ѵ% c^_+*Mk3~9*dCjK`W ;Ip!CViӮh qI#ENRl^l-!)rdTwƥ+ϊٰ!ҙ8 iNI{re4PCfߟ5)g 4b\OLd=G3:U LZcٔ[`ˈȂ>v4W15Nx q K_x2Rw},K \A6k7I,D$@ Bؚs 3|sw!Elkh9yU2ϑW#Aa]4%R(&XcI=BUZ{Iפ_(E NYU8 92S˜s%Jͪ#0!(/Kx:\,8GOzbɚ/O)[/KZX.uY0Px>hWJBS@k \SˏytPaC3 c(U^RzL%"VJqy>ό3gUJB.}"E9xNByŷL0mU-1)U%T5l~b˱0*Yo'i$2ϐR&œs|`[r5(OQ`[IR)@1"̧l'Jq]z(FC J¢,6oBVW$ +:+*['%9z]] %Ql_?I+([?QIV )ά %o;/?))xk/9&iekyRWQ1 @0Qb 5W'zK5]z\ʒ3LjZa ifxBN Kp͆TTeRc3 q4c/*b J*2(p;},tPE`M`! ̪*l7IjHaSnbNdv`:eu){sq1p*m-`aʂ!JR#ڰ$ O{j^ tUEcV5#%weA!6aPD]dcB̆N$49'岆( 6,^MD5Oa xFXW2QVzSRHUT#|o).0yr('thBa,ʋa?Xmb1~L'AlBJ1yqclTA駼mŸo 9'=9Eezy1$yڼsNyؿi_gMyWvvWpSC[qtLT{]:V2sY`FCq4X5ۧ˯坥qCNu"]uG{$ ש3YFX]@U$8+bձ172w 3+~l iUtJɆuY96>*ea]4̑`qL`1Ț{([aR&1kA,٘_.*/r x1|ry;ח0q> $W8l Pʮ,Ƣɣ>! ^{F\( vSDúxj6<29q}<} 컔y e%T¬ϵTľ{~}*sw7`uE6qi*d5_ja1l  mYrF0!r:%.#^I^0Ufxɮ)f2 KV$X(Qhe60%$P IV\X,1F1RW*`WpxRi%a$8N<6f_rdY,,6K;)7y1U$ C$y[2O \]U/XW8lNZRaSUa} R& b.^[FգsdK-حLiLR Xp%wۘ)1|')R~QNF5"iI"Xrc\إ}Myu5YCZYL*]޾6{k!&(%DL"::+,(˨3[ն`(7&?x~:q,\=*fA88xXGuN+UVtx!Il]`Z): n|=N\PǛ#ϮPuNϰ05Dl f/p^xHxeMaRՆDb"okDڴƲk,K+J w0/+9~QYVhwuୁBlXZ>1IԵP`DT+q]W֘uHQ3.aZڊMK׬,DB*XHVyXǕ K2sگ.v{7%r~DI<)a"2r =( '%,0z~qGW)CLY/ܛRk( w`0pFĴ(qz{HB)@hefǐk 6"fmnFs,e5B[gqۙk5um:+o-CˋO*< Y'Ay~L'Ke }A`%n)oܸ/ܸqş7-EY`1 )R}+cRl-l:ڎs嘘 R P4Ph* XKn+j)Cac#.}B/~PPU)m.e} 㒋mkA5["Md^>Yhj~ߵ|hǁ׏cM wc#3\pXuYJŦy(1b9ĕ(B_vSP՜w}"#,Xyu(a gY !5t\#\WO׏ܭ &eXkP*/wʦ.5B,^hXchˉyI`Fop١PʒÒbk@Fb LWL6%.iſDe'UR2E>]!7Qq{`655˒zk5p(b~*=D\gNO 4JSkSNcM,P1:+>PqZINqDw%/^(jǠW:}k;$6l 0^^r*tK hX@+9|~w& |vx:(^Vʛ((,DxI8MAcPBW/J^heůKn[x$m9 +0YeVaB@z mZVOO\ĀR<_g s"\ۯ8z-,YyD6u$4O@!Tr9CcR0%Es/$#@QAsPw1%JB,MڰNtM>Q)lP,xcXt[ lV8M~ůXhBHi˒+)K"zeB6$,}J80l1DK~%X+r3 Cնb*{e[^yd .>Q7n~8YiRW RD>7( u B& l;Lc4,oHN1VFW2妢SA!+ޭ`J V emV ^[ӕsL>OJc B;mA/t]sJLWLWcW=P\B-IxEn"1N+k@F!jX"TST]vBcߥӒfQ*U*XQ93o`sgA%QjGË^Y Uڐ Z/_ '8N0(9Pp"mJxqg9#A ͆\]V|vpSruta9zV^@4(* 6O6! >0L )n^-'r*:*1`bΜݽR6 lbZyZI[TaawaJx>&.0'hPwB24G¨\N)\+T- Ix:!+ } &/8Bmb,-[aTRG(>7}YLV񜕞%_ 2$eL^)UBQ F&+\x.,Лt`J]?J^qS!<+f }}ɫRLĤ,RR)E`-6ʓrgeE8{F @_}q!*$sp( Ƅ70<%;\|1t?e9|ߟ}~1̱c1n:7>`w-eO.O}?ߏ}ט?g6?:ty_X?|?Kc_}/aԟw]xXgnoZ)~i.Jw;wY?:/?d5C}z?-*8O~WU.ˢ{UZ/^^}|7Ҕe)dAhE>wFUU~_779WKrWwbsIh(߷x ~׿sS,*GBU5^D.9*km1olf1Ryv4iJgYoq\C%sOo\?XkcqVHq%ȓl[uֺu]Mъ1XUEU~R"^=]ğ^w#"x&oM|e~{YRUx%f o߿()߽<cUw1=Njq="B7o,d?ZKY?~3]YLn ,rsnpܸs37n| 07pܸs37n| 07pܸs37n| 07pܸs37n| 07pܸs37n| 07pܸs37n| 07pܸs37n| 07pܸs37n| 0 RIENDB`./qwbfsmanager-1.2.1-src/qwbfs/resources/256/reload.png0000644000175000017520000010646711404701453022157 0ustar pasnoxpasnoxPNG  IHDR\rf IDATxwGy>EWZ]&Wa 8nP~1+/ݱ  $_Ք6ɗSM1%d)-[d[ҕtuٝ;{e(WϹ;;fy2e%-iT~-iI+2=~:=񄅟4G%9R?u VJ5Zt1x;y]Ɣ)SvZ|ٸqskFiҭ5l-iS6>9>1[0q{эVexnEM=7В(%.E?a"j6ttvb޼0~<2n%}o"d ?]~=:ۋ'솶ªζ 4SZВQC~[l/~%$"fI+ؒQicq!UW]vt }x_LAВQLky e/#]o> ,|vªq-K%-'YA3ǃf- $>4@SPNЄ4#fh@KF]Nąs&fOϼ Ÿѵ4 4)Oh6\hZN{(:^{;\jm݁1Oh%.29v`rȇ+߁^s 2G Ljd% Zi<| 3n "'%-hɨ%E-:އ}+xeg L"ÕdԅD*W^x%!&t+`մ %. |-\:M^bID"E-uɒ @#w އ s_.oMp`q-NZВQ>HEt*Qe\b p 4dEdZX P! `/#-ZVj@%.=[ R+ (~Af~+KcfOh@*-hɨ냀fJ2F :O_o|? TKZ2"8hBTِ@S.8&j %. HtO+߇O~ Bs[$%ǀE@= ly-h@KF_2}3`J?20}?9sB#7v`ӜZВQJ[! /A'ւ^]_Ʋ%zK@)mxӘZВQ XkTW4 ~+r"qVCq tWp9ARXu' %.Y)k!xL܊՟؄ ,# %.Q3`(lK@ b"Vax 2|+_ CHZaO/h@KF]lP`DZ:-Б(%4F_ ̗-XiD-hɨ0C05#+Mr]]0/} 砠  %.W.3M,[ Ó9vǤN—e?tEª@-u~G)@7m=xy7 =xBDxaL_—-6mC!taՉܡ/tm41f [/ܭqz{qTo@KF]2g2]d,HȃIÑ=D|/5xlf(FYhmk'V~lO~ݎ Ϝ N?@գqwn#wGP#GZ.@KF]|~ (!IND.O1V?y,7/1 Vv~5RO磜*,Ov:j Y^m<4& {G8[ВQ? -^uވ t|l`x(qi. 'c2jy 8h-:ptʾE-uijL--#<6lz* 2`=~3>i\LƒS!T~i 6 Ԩ={! P~ [@KF] ـ^ %ͯ<$R 8z/&:+߄=|T7kȈ}pA+`vmMUA;&(kLX:*E-uъ FDsn A=/>J ɢ`)>›kw)t [K(pd$ϫ7{mYekhWms/oA׌1>!(:/mIKGl\VqkV5SQ- Q85]Ll߹ o*1Β Wc @V 5t ;gCc1c|z/p( xws?݊dE%v2@e65g<~8g v|',:g,<Ad%6` 1yd$?niMnQYǁu :&BٟHHޯ'p8?ԇ^^|` "d =Z+ )6j7&U37 xvzl|@WWЭ&@~@>п[=?=t&j%.&N~i^ISgֱLEL.+ kyql~Hqb9N]0 k03,H`'!t0L@Bǡ&KZ2rճKN>8a`P@T1_|m#L s?MP*cL>9z ?]^t aF y ;h5#/a 4HYd_qcAtf"n쒿WA>؏|h&Mc` A=b|@J5&>cLO ,y=܊SNC|}~ رd~ ˷k|ʡ d)? Dy܀%M#es}Xxi/Vks=G`J)GyKyPnD\_@G}> ]V*7+%g TB*UW .J.$&L'{nǢscђ?DqN?`h6 I*H$)9/_(r%NY|=|7`S7` MnW8@\R05WGFo , .Ut^gG[?xUZ YDD 1xHUBʠ Ji%pVAw. p-!< g" OQ ?OV;h O !.@"^ↇB3 jFT\&x[p~'[gIXϝ%=`mn*2 B>^{4WBZ}o5N>7ӦMG]}7qhz("(P5B4: -yPy!ӝ]K8u5{R掀-5"]&y$|}> ^iR?c͠98 xN%n0ඍtf 쓖Cb_J@+IrL&,+iKےľDz% >߅78o/I$%a D[qmU>,>o먬 O_߮Q7IE`\uRk P .tБٞc:0uO9 }1t36-? _`ix.v2Ё 2'M&)$O@]E$"0G@V/IH":i-&" AzN~$PA X>%Z>JW]76<& b3ࣉId&PPEP^ǾnDzgo{>o]g-GgbY?зr5N;L3fߣ@fp/T&eIPY4^uWP |ta^kȼ%淏p$0J`Ǔg|3@"\y;[b Wuv`O|Lvs낟z ߒu#kp^cx _)iW8H] n&1Ț,GNfNeoig@&;ɱZ_Ks '[||y>OXBX Mvp_h1v k*m٤x["5%Ux!ʞT;Rdr 6IJ%leߖA-P4iv#@OaD>DcuC]"I\F /8; KϾW&'%X͒k:HAf: r>9,&`7& 4@H2_/AAZX}-L|%D]mM y*SD@*>^Un%ye>%6N)J&!!qj3lM8&m I:Ɓy\ZJʁț}1 ߅eg_Wr_ R[F};W_EnP&&H,/Foq3"¹IEu?iH+ ) J ڀ- IA>$&pm~t*"W*ˠagWXT!}Z%@-] ||)9Xwyˆǧk9 @Q2-xrmQ&9k$wMMAqso&J"uKEL$;_\KC}3' @J3 bYPq- i&&*sTQi\Z(D8 |J\[e+*$o2*ߦNJЛ~@k@k28Ԟ4Ƀ)X %žϓv,Ooqk'A$]Qri 8u}=g_"m(BYh 叾}M4W`DH<@d 1v*H/i$:rw"-Ay1CtGL) Q~Sҹ%5(_d%iw`_( Dr@K A2L H܊>CjXU!W@$!cD}S9V͟=77D'B7+0|+k1 gj41@QXK=_dk "K3kd;j?49%r3roQ}ZU&[M@J\@eBځHZ)82/u m۠$& ]oI ~ ȇKJd¶܈eIk7IJH ě @8!n4NL^^ Z 4OL 88X:&Fz0Xܾ҃ypͨ^R"` VGaj _}?Ef5`Wv/I@)أ!M#vwapuكEPA^&=A&nHAKS8FywMeIlyx@31HKk y=)pCQTAʟ"5-qj5`yHl"4XdtY|uSA p[=8oĖ;rȱ>0XI_غo؁HLӤ H~|D]m3lG@ig%B,A] 4r $x^ rr!%NBy&5?6ykX<s Gc"oZkߔX"Bk'`'a!bpD S.=ؓ4W1+رq_"M$5Xcw/]w\iNG %ø@E {1(jr.q-lÏI8P&3}l3yTA?F$wN/w%~=&!3}2]$x< mD -o 3]8 .79FהE$(PA몃{ wZpz6݇"O^x1 ~|hnCor|G h @}I>k f5?B[f>)h}â:EipM9+V\ T4"7?7_F"P %GOd%W#$J"lfW&gXyKݐ|Cp'R !t&_:H|L|T7=ϾMsҋ@_=-P diokVYyQ_`XE;`xdXnCy)r@|M6}8@!9Q%ź|~i@Krxݩ8h(Ϳ5cDdA:\  Ã=Aa}K@%җxN UI߷>"K/}?uufZ4O` W[\L v]B}(&$aG'`rݧgS1WҌwgV$<yDV"/c@{sEr u3 vӝ[˼.וO-t$׎$/5(qc_Zɷ>C^<?Cz*Aio>"܁&IE93 n5 >Ah{n<%:ye%AE@<<&<-eH'1⼤I:B~ Ez@ ;.| L L ,cPҾ$d$"Vh>DDuԹ d0Aw@[T*GA˾%/GO;K`?l\GDiJ0Y9@(Y퉝9*%\]~B W[mt+Efp+@@~oE!paNwew)5uXR@A92(Fwm$ 53Gֆ2B0]P98&Y$-n\Lr:sY%`_N|izևA\~xlzmc008d^WԱkL>' IDATKl&hl`#S- X Ҋ`%B;1@ޏ=" K "HJ\)YA ᭸ %P96AgT66 M^{R.xȏK@nj}x˄=!`(ɕ^/FŬhpVz>s?Yͽqs/Ɓ*^&KS'Dj~')fzU0IxًO["kA\oUiQB>ϰ2$Q Ii2IcPuRk*b(I @FV?N |^6 ( 1:U-p$A ㇓+ C& 攎F7yu!3{v.,Iڞ݅{.ɷ);.$1 8J AgNn$3p/7'>m[~o=5h4@`Ĕ`;T1>X@N;`݃Y -r1S 6{S5?8I;RC>(y4>R9QXZCHΝ_k%eA!`b}F$Ìo=q^_9!]Q,W䪈 sO 1eZC+ ٘4w1f\|7c#]lRp=JT󾻁<8·sƈ.o93ҥLm 8WC%UI4>5 jף7D'Dhdw&?gvad,rp <O7#žPCJ |{@xܵ5{]l]Fe>s㈢d BN$dEsOŬogx#bMi*Fԥ7E΁"pQqmt2vڜMO͆ʁ?_"VI+1"_ \wL:H59*%tzi-iVMD8L z+gJ 0!(h=w SFy7c^(DyX d`a`B@ݺ  XPx2yi~|(V+6|zۇbrҔW|md_sD3FAeT>l!@k_gٖꛤKqw-k D"Mk,p p+.L*W=RsPg_/7p7}>DGFC!GFwffkOɳ3pѮ8$/eB $!׫µTvXH6"<4ZrࡇVN׷Ͽ=_q:*$V04Pَ#dMy.QQd3S2,t8BW|@T zs]mo pǕ,y^! c*Ajd_L&i~!vrs৺[4# m[`ĭVP@*=2RVi+֎X2?U'$0e阱b|G7aD-JaE=\cl`+ D Xk`0׭r%mbG$P49 3OY2&hCyY% Ps@ٸjh MI+C*@i$U&E߀@ʥ;(a[2 c 7v=4nC@^<*KBp 9홲u~w_\mhbг L]r ӏquƊos <%X&-7  O,^MB@6݋` j5ԴB[f%siΦ_ְd-ȩ26W|K}Ղ:Kfvb #`uHkEh?$v- _(<>HJ׵*DOz!Zjx@fa<7OKnCCuǑ(@fp&Ϻ ?iwքXȕӮx. ߘcК;$$מ"f:{cp0G[[j*CZ#3kzMOZ;Z &9k@gܵx0UB*6$FL x@49PEyLk\y~\D`䨡>2ht[!? 3v_&܄L']U\Rx&N◷ߗ6CX{ec]qdKmPn˷P iK@H  5eV˼ B:pլvnH@m% }VAe` B$N`rğ  @E$8*'9 : kr0Or%Igcb1$* RsY8/܈M [+nc!֏i m䞀?Sw-`lo?6ߤLKZM!ӪR3kR J9AY?*k@;/ =%AHk?w۩_rs&}%JOI: -#+r GB2F'!hw + Nɢs2%8?Ưo6WL'_~}yM7r! 箢" }w+~SyM)۲j_Z_2b+z[@?'4>呠p ?^+?ZO]A}"ɓj|:L|?L@Bkx@4@3칶<0Ih|0IOqLC2E`8=y κa{B>݊zmVa1@珄Rx䚐rwvz|Wԑu|zi hg**_?1D``B篲Fڿ*(8/[_{" րKj@^ϩgw O:kدbG!'=g=Xزnot?|]\ǯp^c)Á#bN@k:z <;P!SZ[qOk/۪-$fCUO~PQ{|H{$yXGi@G08̳0E+m[{00TC)s3ps^V~֯}\}:S%+)|O@;/-'kpA@t@i$]0R jc;-<)[Kp7HkqWwK ~THIsZ$a, Z7lK_< d"-:Z+ }XK$|T?3Cr6%#K}yoc5ojwbBWݶ{ȧd*ڗJ?B=ő|,7 ~.pA X@0揚DL " DS7"Ҥﶫ+"PKp\w qMJK xba @l  >bWPH3O9/xYZaI]87I9*~UQIU($?dY0) c>S$}zIР +}0a9h_ؚ0%h$ pN %M/sXbˠa@B $ {6``u,8we|J1ҶNxKƥEM|Z5op7J~V-l[wwίV(S_ߍ F>$\EJ10N-*.)25*,ʡ !lCW 0xmwl;л';Ø'0f|{R*}Pn=r77 =v`Tx(POQ*a ɭ§~SKNC5~vn@^td.`?y\P79ޟw7x/#YKWE:շ܀m˰WUVRý֦IS81a5Wip\t "% hɋAcfGv܁mƾLJP SmZ?%$'?Kˆ".(Yp A9gKDv H08oSC@Qs6ػ س8vby8N`840k. F(h̨0ޗgWA 8 t| m/w7XtwGHcuW9^go=+n4'xgT^t^ | שE6ez?ؙ98cvnۃ%Œߎ=uA#7ߝRq٤e>2BlyB,xxߘ57+S0Y1y!ۂ3gm98LZ5Xu P "-H9HShsĦ< YPEk c'-Ϻo~Ɗ/_4|$UIQ4;ĺ*T}2 rӈ9Г ԘqɱvLy'`}kؿ 0.)2!il9iBm;bP$ (DZd -$FpoDE@݁0:tL=Pyo L` PN%f2$Ў/ }fu9V|[넱o x3`D2|U2O"Mum,5ں0f\t;OI]ƎuSgbX#y[=<9}<3NȽOK P?lB,[!YU s<{ M<ۯF)k5a 0u׭};n/z m&;LkfH$cW$ d(E!*c+`$nIby/꛿+} M}\K-U(Js5#o#}c[AYN` ]!w܍}{0aq k构8;2^5.B6bA c _$ $ 53ddfv_FҦx'5/`+N',Ŭe/]7;֯~}[q;a4,ެr QpO~r8]3 2{7`P8qOx܏Hˣ%ON+z9ٻ_ ']I-ΠԌIȨnmNJp}S lSOps0\g?rmكSGHϭR3n@TA@2e8'y4&Tľ\T+LCC(v=0e>ɤixl3ֹU*m2mEA?l+r ~G*t0N6/pobB5zq_mMar044'8R;x="PI&i*6n聧kv`\jRq@{Ӓ{w>Ԇ)m BF~ SڙF)K&2q30Uʔ^ul aD\K_ fLU!$!DPiϝ}8}̛yf i9Kq ք/A/,pOEMS94fɸ,PCF)U 4/m=0Xsw5PSP_ʘLeQ .@Sc#/o f=%\ 0)4E#.he[pk /Kn@٥yŵ2&'`*EQVq`™/۾.7g~CᡤbreI4 ; i 商-p0qS_jtL~2FiSpҒQZu$B+@lփ#<`~-f:OڬMY PBܳ0?۾]cZ;t׻ϽAEl#>0BzU =B %{So7 ' T)ĶʢXloV!(kR L2 RP" M 3 t"{=ɝWe߄QJͿ *Ms"6=B&_ܤ%te0@ 7#/JE_hjmg], H{b[9E@ A (2}&:_{ؽ>90o_mE ;UUɷUOR&UQi#6DzJr}`$_zexrDwx #@&2 j^Q) 2@Kp/~=[?00ceߖߞ#T^=wE10Ұ#fFү2T yM_䧃Oc [0Gp"?LXwDӒٙ"5!`'UȠ Bx&<~ Bo󾋢^94%'#1 fɇA@BeKJI ˒f7Yπ: ߊ0 {w'>?[g D+`1Ԭ f !y iԎ;X`Z 9οQJFpLUWfFu%#<ԍ(3Nu+ђ~'PĮkLEʁް5$` ^F ۇPQ,|ϰwCnHl}'ם}_i3H6.@, mSBvs rhrkzviC ^݄o$ AePq(0B:,`.와 IDAT0 utb2B|»W<1 4FAV`EB R6~ Z>\;p_kLph0ú58}'<Rxd9 =9!J!(dWQ( *^KFOJ}F/Y)ى;L sh]AQfWS'Cy_nA#%a7Au 1mJqH-P1p,Zh p57 r'baْ'!L{@ƽkHB1lq+LMR@C|t矞f Sx=0^ 76U{Wd 4}84㋾M.<xv+^ZRG)u7g5@S,wjj!~ f3OMkV 0ePP?a삛5zJzWXJU5 `Sy.b=TZ":O)9y)ydG 9s$/pUw}pN0y3v7qk1fka곖WY׃_IӰ0FAt'z_t%I? 4^a9=gw:n^}; ,/Y?)}ewk=IOT u>̄9ؼ<((S 3']~+}ݔm~|I#&pN=& =7n_D@b>%}hv,@]G(>|Izg˺q(!<;v\`p_Qh2e|7&z-w^de0fѕ_g.PUn a>b>UEJsbpA@q< Stqu'oӏ@.~%Djۭ{+y}\`ݔL)@ (ك3:&Vב\~ln,$,AϠouT|䯬=kdL϶Ux8@)j; 87LQ'K_9--Xe 0A?ݓA\VɃѩ:w޼ jl=ٌvduiѮ PrA=6Ө ?IAq˧пn_=}%ב1 ?(A ØU"354@E3 Q Q = tIȅkO韂j&9 #s_Oz]ɟSlx}ĕ]nC}"1 f*ϙ<`?`lH 7hqS˳<IxIWc1tSKޅ- /:ɬ" .ܪC*Xw烲N#zW8Ӿ5&5wPc6ͫ4}ݦx3M.@#U_@:4tFH'9 Ix7c,`?#&uNIc[} 7>;-cV?&mB}kb+8eđ^m.PmTF+ҙ ._K){,@ ME|wrޯ?}2fщE;:@ [,W̩nUG~ R5[W;^f/H1e_3WIG@R1'2`1*(Q0%Zj >%[aT˹<9_Y_~Rd85hh~ {#(!aȕf\*Cލ|?^ly rODrcW~',HH4E >LK} Z~bq#.D':荫H^e-AVFJ ]S"0ۂZai:ZD9O*ga*Vx~E:`=?>=9R"E/OkDZ_[\AZ1[a&=G 1|C?x=h#iGS?xݺ5u]Y?!N;.A;I8J)fI~' xS _c8%o* Ÿ1^W0~ d|ϲ0(H[$}qZ@zoA?b]g{k õ @dWLE>.Bz&K,QT®;0܍*_aH7 r\ؓ;U^,sA ȑ#9J/N#::Ow>g;ނE +&#-e @Z7Hcx3 i>E# (TpV$|ß",8oU04>`/zs+4Wcs۰}^2G`V`d LVl_aڥ9SQ߻Cyoz/xP 0ki{!_7 hp=TF+c)@@t|̀idnd P!BDoDHJ?Kl?)x@g61t2oK [ Jc;`o¿;w"t mBG )W냇?I5f@ _ &wyUP6J $EBT\f/uEUGc!᪱; ub֣A>#ny_pfe+8XȠ} s&,>])2P +:'X,"Bn/_F<84O:{]pMfL 9I}GL>_@ -c2>n WPG/֙ `9jB[B%% YA¡[l@V6 R>sݓLU+@j>._8Yp;[))420$wb*U9]Ui\c3R|o'v9vxY`{ٰ^-!X Ev`$Q Ɓ@'-o([ޗ_T."r?cDvAPQfh"x a;<mpa1}<i*9 ?[yC!ZlTc?s9~@-dQEaS~뚿]S'V+P"V^@GMV??7 u }țDU X@⵾(a?% @W_ |qG̫?tlxhR ** -)\$E#Zĩѿ rj{nRzz:TePsud5{ke. ,(;%ڼǩ sH|-_μAM>Olýp(BUrg[ rd>ؒ֡k]qh1崓Ѧ0nϡ>B#F(b `d@ENIb(t%6K Qaɝ{NX5Xw%@~YW?_ğ,~[:2${KiI@=)QW?kp`3kw}kwi*]KX{EMD!`SyB, dN|L'~ngջ2cgL9˂?߄~;,?ky `= h:Z^JUϐQeȴ PUxGU6"&KS[$9PYH HΡeߏPWf OTv%WbK H w!>g+ ΀Z1'+{4@D$.olAU1飛VHׂ F8΋\?-@`I:"f9^U{tbJ4.˷{_Jl?ɟ _8(8vl/iJ+\b Rb Mf2{&Ɏ@z*iwູW* >U4œ1pb? h1$U.21%0yT W=WL#s2c?]*l|wnΏ ~P,cL "e ${x |BEZ_o&X(dM AhaWghKy?trE] %S+ oUiizVcK\ ~a{Г)?>cLC^G|l@(pL[M ?o25B)|q.zƴsS_GH&1eo2W.4n1)d'*P$`@~W|i;_Vdi A@|IL5Q?6}k~ƴsů#}xp*BJ "cF*#1ƔsY˱1oh7%XΖpb iH\0?6]@pSª}] Hց J?E~bKF]UksS^6p"0̀Oq?S| _ )g;}Ϟl AM mOc w$@Ni [oc/Ln!&BBfD8}_.ʌik٧Z1 p_lecL7D:&<}t~Wrr溓f6~6TԷK)'@B4aQƨ7% oZ<ܖ^jèޮm hƚ|C\+EKW6O> 3o7a\J ۩: aԑ9! eWYMCWysە̳nn[~9Ư/x-e uy G~ *CPȵxS1cu@l$-p(\Gtҿ)Sz'Ԝ/sR.x><.@k, c 416 & ؾc0udz`/9sTjGsU:tSx~|-Sie*fO,պvЖOs Cs{َOvd;Ћz1gųOA,q'@ l8.?e@ 2Wh# Z|g3ޘ ODž+.oƒ @Fҝ}X| ǬWaq གྷ3ݺ{UAO"v7jLnuu+1%M4f`v7n3jM}n|>0f{<V 9> U|]?u$uұ $щ'&\Ѡ_2\1Xp:.XVh~L*4. $!$uLjͽxbvOc^o]SB@ ``L5:U^^SJs\wZ-)> 5u^ q8~,/ڌƨ`mc/yjca#P_ԇ1 E_t9諈#y _`C&L<ف{2f;P-I y(g7ɻgg !G0 {@ su TY3 EZ1H@ЊХމl鏉H 7>h4f/[/7x(8 ?[:݁TS!o% |jIs5ԑVzF3<Ji@F%uW<$l_oԦ]6ңqoSnf=uLV}6QӟFi}xo:g.Eס BpLf/6o\ ,[- |z|;)e9إ @hڏەz` uu5erICi L1KNMA+=.4m-2{\QgBhxm_NMtf˞z&E MInh'c^U !l` |b 6( Ķ@@ʋ^pq냫1|i|I@A`]*O28ϰŤZ%4V)(eӈ34"n%@H (>}`/ރ]Pw) OML$ h}0/ IA^UCԓAFhd ’EH~LqE@ 䨥xoM@ mA.YT@3S͆# c~Nl4"WP[ J+&t\K 5S=r؇;?&ӣkmyn<^n -,ˏՠs֛QdVd>OHD@VqIF͋v>.%M/;zl? '}}ˀIi+UL;EHCzQ L E&7ck42E)W FA[3ݵ0M\/v{SbS> n϶$"}OZL D[I*O n"BrW )g h?JȏepVC@ȁ3= (0j~s d 8&ExԘT4t2Af2Gfff>ߢU H"p.%+o'޿q8Sqk.ĝ`8l,wmYY{H*-`;ЮNm *Z`5e5[,m~!@% @6ZYvl~~JRKeꐭ&#d&c2:\;Dbr(?)v-7}v\ߘSOX9]xdcgx2~dTA=jԀ2tа-UCQBAhX)PgR Y!(MnLn;?m;?:@#xVR -Kqf~ j`sȗdZ.Rٴf5zX6zcs׏lnA>iہBM~e c<_:%Cww4\=,=n)C[S>UED `>w/4OaC;g_m+>n[d>"ȩk!Cy |>Ir_T XP*˗-[Â8_%60%&a!Kta#G?Ϡ1!(PCRw{zz?C7Ji` 6ӻv(7 [9: Rږ1pZHl^ AʨWM@w v+K\_ PI!-?[# .F3DHbxgr ЮHw.~OcMV A&CLa!8kc!gQdV+ce |MN{/ǵrɾ`W . ﰶ@ݓXk] zPNV&-C2wMqIefdˀ\?ui^>E,^w\. lZ{6틊4A{֍E@]22`9 tQql@{Sp#H܉:a;!{ f O_HRL[}XB.}we U]G~YNJhf~g$`ӖL~&ФShڐ8 ߁܁Lʬd!l:U!VhI5k;x9%hҟa9Xኀ}/{ǔ4ﹾ*zHl$%rOh^n@" <n_+(`o b"J$y;33o̘ڏɓ'IML:?#;Ö=[/` te(9`PDAF[IDyp.r_de- ﱹ<+ c!n!\lv$\r0Q܇YkgM.&vB2%aa{P9$x0Jhk,HZ"pJj^:'V.rԽY! avZ:['/+/Owck}$"Hh5}z*<{قilϋupL-nkh Mjhs/jAN[!g%ľUW$__~Q4K#܌WPJ>hM4!~TMxˀ KԼTƓDl( cQ:a E ^(h%k@#[ `5{'; g/{#A/6FĢ%58 2U܏)B:hrog@Z'hzIzU9,<.ݗ/#7ass\ !8(|FF= u΍e{ߥ$h9C qύۏ$h!ZYj_Xu.ytX&l45='݃o̻*oƻ wX.!4y_+X% Vj¼vQ[qk_B^67E\5թh 49_l L;5vh{}p }m fH8& _4qE̓|'159^YisA_XI _*}s;`0.Յ"Iʼn|MJ$pf8k%;TN|7,@ X 4^|7b˱EA7E!ͺv$2?iVG}Lt[G2)&k&:GEtf&/#gHx~@{q/3w.>T6Md;_O+(fuHsTqo]ܭ*bt"(~8%Wj0XdD%v:,!)O{nGcLvb)W&$3/(x4IZǓX`&'G@0IqYǸgnY@=qM2FC@Tnm IKGrD}26_ =A^EM@hkP*1)NKG- ʕɉCgxKo$p׏b)+1kZ^G}0$EzX2>" >0-:H>>yiI29D/P~ vy$Ǖs^e4$J²A brQxPP YEsi|T/T>YVP5#yy)竅\ eٽޱ;e@SkqKLKb^"="ߟ&@βq8Bd]vJ3ۅ,tyuDŽ{$9Nԡ J}y}DŽ-0nޔ ~`+,n~>eq(lu)q,9 %OdɘuX$ qBn!pl jM vdaăqD 8_f@ $Β"mJN@/Uut.<(wi @/Z=u'I@+i:En6w*(C+<KWn :0sV?HKs^˕Hi}i H6T T"G&V@~C-\P짚  |-_=.QG"OjY:%80,"$M{e~ @@ߒPtU;,ujc Yؘ1_?Ŭi{BÌc,ۢeB,7VG}. 5}dADKAj=)+[0#{Zj IbSDMgJK%zG@XFSڜ"a$I@#M-]g#@'wr!k0E@, $G H`c|d"+)c75.ɝmK5Uβ5hjah43Ԡ׊G1P监P[|xl H7|xN ܶ80z Q;܋0D~//RDy]To3HHm% A=Uf@[}DG߂[LJ GW ?[NJ0wlv)O!'\3UBȒl>K*LsLq)t-۶K =(LÉsqC50m4<8F}̝tX:z kD7CmEj#I{'?_gup>Dۨ !zЉgUvZt/M#1ca7 J,*pU8qR_Xnߗ5fYPԉrw< Y|_@m?I@SHDb16ۢGCI>, g,z9ú'VQoJIt' vuiZhflp>wg9YGYOUH[8`k@ fM!F.@40T%kn&vHs^tEHǂ|\@x`؅(Z "UJ[ y>E(v,B=R4')(ީ8Hf C1}%5\--osuڳPRܼ^+ėaұ+1:h. F=@M5ԔqfZn`IēNƟ]̞3ۑ@AP'2} raZS'M/{+ׇ0?߱?clX\ IDAT+=͔X8] 9Si=9FGquW/9|a1:jȲrP>qч'w? NG:aa6pAJKk-#.I+_qZh8Oj]ĩ}Jg59r#"Nǽ߇Fxp7yzy `#!J,7!gt!>P5]?pΒs݇zS&ku `ա}]vAx4v0ŦO١O5|Jד\XG4s=*ܟtzJJoy ~/3 SMM?E ށ;c olg#`R}ƫ|[4p" >u5>뗾y;yLD&d8W[V؃{D arZ:<~qƭE,Oct+0G pv]|R;$p>wK_>V}PP\FEkT;kSMp/ƺ,_+*` v{:"M_u CGGq'?{ ')U%D=d_m4)<;<~/LJK:f()NCimI X\u4PbS O^{ps1gp 3;x{2`-ع͏* @=Y8rj;G`'Bhڴ !\o h6ChT?%s&M^x?m5Ƨ+d FGp_eo\LPꈛd{l뭤.tzz'eo@O1سcGsXF%2 _0by 33!ЉG\~ZuvlX+ gOfWNw\P&S;1_cxT4Uɽ1`>d:d4}3 :|C6"*iqc "J&&]IW1 #C@c̚;~0{KobpC}ڮeLiʒu7g4pq_]v`͆5AJ;T(ͫ'zfT214t$>/c|{>^9s@ޭ>`>AhW_%&ڱr럇'fDJc- *PIJG@,Iz5|&v?̈Nb\E dH`y|0'H::嘝u/e.nM= u@׀./%&@M< v.l%X&Gl޼W\IvzX9$+@Na-7Cp%ttk@={ l{Gؾ.l۰wmq#}%j7m޴q+@Y+ ZI%]& ɵ: լuQ}ܳi@.ZA 7epO@ Z`ہm;z`22X/m}X3zKdbҕ&=c9`I -'' <17+dbҕ&'0.&`->q)gw;0D|A V+I|Ғ IಿǪSʕs}}(?!^*B% "۲i .I` 8ا>8Tҥ+Mܘ.2uQ83V> ٷ@3^`JT~ Oa F&،+#8uX<ۙ(ĕ_1$χURIɋ {D8 `OXuX<Ҳ-Z>\bthMI_?ɖ)&w)֢,[ PIJGfel3jp6waR\6lP(:vq%*䅒ZP ֭]p%I7"#ꯘJM^ $dIབHP`h@|DP$w%tz+|ϐ}'êSVa9P*/C1'`%].Gr_|c5_~>LgA *"bvcx(1``s$PATP/T0b>;O݀/=srHR`_*ۤ"6đk-9s,JZ*hS`kqi9 ̘4 ì31o/ƶUTR5! ~ ;ؿ7≽OyKuh>?؂UGJT* O7ᒋ.Sw?9#s0{6r*R99Xhtxs/}:w>zu)*F9s ߳g/z&Z?k/*PIWKE ; ͛;/;P Ӧ .µO^tT0AQ0XS5OGOZ5~10Bk%R@9 ۻop c-?1}1<+$_ɯPjX~ꩧ^ycG۾]{v _Q }~Ky_Q5ҶLM 'TɯtTRI%EVIENDB`./qwbfsmanager-1.2.1-src/qwbfs/resources/256/import.png0000644000175000017520000012317711404701453022220 0ustar pasnoxpasnoxPNG  IHDR\rf IDATxy|[vYݯ{1 R`d E 1$JPcˈ a1C r! vbimLzvM[u+SUw߽u[WuLuNYk}w*#9b<~?<o}^)68~?Av`/BPg%;A`s`_o*P41/ JJ UeԑCU^;/,ǿ[s.v((eBo| {gQ?P>t_OEF?֍=nẅ́<^_3ӼK3vn̸9΍}?]}! t}lB;s@Y *@PE0¨{:ߏ'P 3|?V^kAo{>f X%|@I E^XED}غ)(W֩;pO(k%BWC!R@`fqcv~Gtg9G& o{tg¶[5xo;B""c:RJt]@RD b sUC/{黥}4:ĵQ|Al[SJ.LWHPBye3 7{;7W>|'>jw)] yυxoֻćj! 6tCB4@Dp%C t~!+= iң,OUIa&4j 5Xz#Q5B0Attb*A yO@{H',L/9zb#IHo~q?!Q@Gb:4BCA] !0ECwDi$< i.8 j Ő$MQ^ޗi\KFg[ɌO||vv-lC߽ب|q #o~҅T" R tN~ڢE P*РU4XX !Z  $ؗ$"صtCT}0W"ǖq5/>y뛟#>LH YDw)%@]P;9F2//a6`ש()$c;[BR^uBQ~B@$$/$mo|D۽5pO,1~/\w|=(ȃY"  J*)zACl͜T#5 0.8Yҡ)"Q CQrAG#TW<(>!Cp~XlB|0cןb:\_@a۽^ &QUHG~ӻǽ5 _٫% Aӷy_ ihID܃?HNT&Y" B@`Ef3e%Eܳܙar.Хmxq Wo Ѣa!>n-ݍVW`uEK|cƇFh^SR-x M:j /CIb*h5]PP $L ޽|6 )(# EF];e> yi[##<̐tsQhFfʲ5[ w $h08%FC@%>uKQc)]L "N]%%r8d{NUE5 8#zmw}Z6G=yӛD^<<<qJf(1odϒ#S޽{7RJ7NB)J?Rg; FL)I#DS1 Ok,o?9.\J' KQW0ڹCQa@$ :Aȕ>0:ݣGGO'gYC7q<{nwy/acpg{%T !;"^M%F8XQcUfU}B"գ0G>뛆 EčU ?/TtT܈pJ!u`HFNv$F\c!X^v5r}ﻔqg/M6gd.Zɲ׎$i'MdQgIabmNĥF3Y,2UhmnRwɯaB-K2H J@(KHpQ3Zhh<:.oeY(~Gp94NyS\E(V{ԑDIQ)YDh肹 )txy{Ng3Qד-d^Liܰ2هb1~ (<`| !p8p0jO"D".+ڛB[u?o|l#G9 g|U K?<-赳*"VʐHsx od*ߟZ%*zh68XPKy ݔO(冐$SnAA5|8p1Ucb>SS!S}$p>iu',_m|Fb %Lo1 iA #1Cz^UX5+i+>LQa1B2TхMS`Ѕ}[Ei`|NuD'FM*FOd*Y |JO[nR"H$Kpe HDK(INPg\YCNFߏey!=۾eF#ҖU& #̇Y/@"<qË3P"gEgՈm\gAɐ,$0DIjF$AA= ;Z+ ?6T 14 *ݣL0 b|e##Π$a6Q]@#IAu4c,b$҅B"8gV^}'}׈ Qy8 pwo(&9.[.9_ )qL&Z9Y3 ]S xV U{9JNCZʖ9^a:td "H %U xX0K=HOF4xX8\9X,vaA -1JFˌyy8u)r7xr`m'M onAs%:2j87!uD ֯'wB?~%m%d('dJ~>P #()"DG'oЃN{ :FFUR:Ɂ8g1Z3D=Lȡ$U999ʅ2>-}1\`Ћ4:{$^㫃xuvH@hT '<z37f;TgQ5sR: ľcfjT\ xb izRH:8`L#)҇ 4Aw~`FQL~vǺQIso~udso/{!10}Jˬ=z*ezyk~TBޮIG:sVi$$k  nq/q: q`8(øUMQt_!6c^Q6&U8ɯkfmZwFu)ud :q# `S9ML洞Nѱ:2h!~^Wii@2< / tHpR0(DСmZfC4(3 U RVR4KhF ^$p6˿IH<@>5f ߜ%1"&DI#  iNҞ0h@@40^gtUX}~ ssƹiA.v0èaT;7|b,tt]Q},9 Q^^~}tA:QopY9]H q`,ttf8DdQ/ubП=T~/m5%2C]IGBX^$g +5$Q]O@Q@,!Ŝ ]bp f2 rMki.B<@$J`^+ʨc2OW O3VzӉeW|}ed  5t"1~"IG"J$`$۔aB6]4`3_,M;Cs>?r)k\51>L*wEk%ZlSR @3n ЄHB Q NS"7n 80_,@H6C8VSt B/?xl 8y7G{wd $?¨0IScY.Z`tFƲI(ZbyFϼxot*C2'¡~?m [}Ptuooek۩;Ql $F%ORF+H3G4DQ=aq`PvUa9=FE1\\'!c+9%M r,}s)-ׂQHFM% |4`' \y@PS%OʡuV< 7 3OEQF{f$lc#!X pn"1UQ@eHf$Fq@YM6eX66#>H:ڙ_r-8GԾ%^S+K10<@"^z_zSzFĹ+YH1e;ف>#;"b-! 6(yd XD /OB1'6:XޯSD!!R Y/ e\\ pmN| $iΨ9;FqW׮xl[8ƣ/H^nknA)hG}(H@CBC !Vh4Ɓ1VLc2X-l' mֵ2 .#QcK ACZH~_dأ7lBάe{,YGzH)8Hi}P]6 TV5IA=NPk8 ml\H W .YIk6#p ) dIR=)hHdrt? 5SG"ttֹV)5Hp ":_[5H4QY8')֣Dqڌn(W7ΊyJlLK7Aڛb>X̂fIԪ 8uirn@+0&_ E@8Mmڇe!Bې@+M)!4dcJ6%$Ruw/(h_RՔ'{p(L$%}FseiȟĦв㝗W" IDATsNbLIPwQ  X5EEi䓩 Q@z,OZ]T&IN!;SJᬀH^fx*z8'5%.@G - (( bTe#՜K@G~OdcXR9vqP!U6l:OoFJ؞%D`I(!OFnԘ?,@¤aHBr؀yij. [v:yG%[oBy<0ܰBԩz u=6fؽ J,}Vk 8\a}]Q@Ӈ] 3@Tc><Հ[<6o{NiE#Mqh},1`(rV@MJ)}ޮ1MlJtiBx̆$d^ !KzGS%hm$1i aI+B3̵#+QWZN^x_BOOpx:Gj5?+=E2ª@n25N>< N'o dZ g 2lȼGo x0x;tVpd@3 XYک/y9-XBʵ2B 6V%胸lj9SO=},5L!kz~8jd`[#: $vYOʵ1-tHCOI6 4D`=fQ*w(e0dO{04ӣ2qXRW'ߤ*brW~H`[,yr|\8j"²77Ȕxt"{H6a g;ʆ=IĖA$^=Xc h2(޲ibO҂$u̫w_Ye`uRj JsZ&HuO8'RHe gI Z`h9_޹'\BvӉb̆l VˑUBkcWLp`,g&J5DN<|e L )@J |͞ +`]%F-'8\}O0D."Eǭ{<tmPH8D[ 1']S/*,JnoVѢO ޫ+Ӏʿ2* xӗp`e#vr+'Is'ǸJ5!X+9_Wٶ*ysR_Kg rܾs4_z:ft<71j8EU[_>|j&` yR2l(S sd:yW饧Reг n 22_6'3c1RmW"\YkF5:Ub@Bŝzilo>`A4;"#{Z"p= :/!hh_9\ pTʥ#-16Ï"5+*y>:Gp,On 3W?rQX 7#z(/~e9m(nӆ&\wY70.ACi6rghllOR~3EŻyMq)@`ɼ}3e׵v|%8jWum #г}zw*[+NYޜM3olmm}Q@{7 "qqصm'8I4T,1t *1E ġtoI̿툿Nͷ/=Dx)PgVb~i !6'|t)PDx䊟e3 32>TuWU؟A˷z`PԖpPz(l7{€Q{q߼~XQηpt\:$M"n~k+❂jPtZ $?&bi, 3A݂j%)][?zTϙ' (I}~ DV\nf4Xq; Tv~1kVCрM N]x4c~)^lmF3 gYX\Y=b 2|萀OJ*_W^BGoaS>#3ށyKs(вгC@=ǟ~hjg̜ۅb @Q" [#\&Jf9Y,֏a& h`d#@#=y|3m96%j\۟= ,NeN Ǘ&ơ³eU_oΰ%G>7zJ0xV bYcIgÀQHJeBAP >&`rяU-߻AAI(eMx@-P \X!% u&  yCos#? QQzQ/ 4aD#,!򴊜]y=4@y8t@yB+03RKL=\zdXzh۸dYhTLw7|xݓd ЃmZ/N@D _Gmu\ X'2[/ޜ\х_^)p{93gާk8 4b@ѐB8SrLeUJ=6׺\2&rxm)rR (dg0r/KfC8 P=uAWre$Ս8Jd|n 5`SZUI$w;P  5g"D6u;'tvWb$_6]2KP9\񓫝f JnR&yl/8IH~= ps1b&5]C88mNLT?4[lզ_Wȣ008\?`Z_S1R^j%gD.}3P)Z*|MyZ'ek?5_Vzb6{P1DG{:v N!ë>+8ZTv; “ƅ"XʚPsO*\6g@СI5檽Py?jAAs?ˑAmB OUpXjܟey+Znٸǔ}zSVPK~ْ!Xf hĺ+:;?j$v$Xu?oyg( yUK_ȿ5Gk{0aP?~ҡF.dcydSDO+pH'MC 势*ʿ2eIO&?ic14IRl 5_Z% ۤL-,TL!/❯ l HV,|89}HA9ߢowolr]ciZ4EνօyR~dZ\0_U犾LZNE ,OEr- eY;$/1DpYM5|Wc4d!@$zʿnM2-[Up w˨(vju])SV"$W2E/Y RsG~II׋_+ؽdn^'Kli ?\_"RrNZ_P#Չy=d}z_MGZaYk%_;"p/a:rU|W]5xrm ˺{m2 8I$AR U$Z'/Jv\cL*z6udP@k #/F$p- VJ3Ge 1O Zey" 4J-h?yUo5+_1"{*)tZmn G GDbSUɵ4WaO򽭩Wʈ>8}JtYޡ>S$ļoy*" %GlSMEAngEwbD\ 1]ȍӖ@XYnt2*QHX&N t@}>(\%8q,)4?qbD " M/Z`?8HcUjB{kCu}BJp9<_.7)OU6ٶܾaqgZ6A=~ c:_ s?1s$qlel<,dߜ蛡Ч@mADFey/j MK4fĭS~o碚&Tx`';vpYoyUz@=iс)d4zqIb`a%c1l_Ipd+"=w9/ -KL-pΊbԊIAC@P^ AJr"yc:όHbFr@H#1DDMeWu_]WTxh,q$ 'XȼpXfW?,3ysOBm d2$`[*a5MpB ś;CL(ϖהr/\HF `E gt##/ HYXLAm7&Us]8V\G)+(D0CmK۠Yz1="6`j @G@0F99 !\<*9ȵuF՗x!Ȟ;T قx#34% ؙ D +("9StDbi n@p܄|^ΞB&0ml-M)!cS="RޠC41$$Z,LX p $z @e$ҁoyH982\\ pтn/{X{)CDl=)> g]&}Îj0ERX~"y~dY3+X!YFf><7 ɵ0!kCZ}o,_0DZf#mQFų›WfbTH' rm El U<9l1},!PSym_lxZс Yw䈣 ::Q 8y Fy@yx 8IХ,/4tbR:_Au&h.dUk,]'aPn .Ed! H6X>$#_\s2Py~̹c<3#U7%l|An OqD5^9ꐀΊ+XJޔԽD1P dp\joeL{k&i2R4^jB!O#{A*3@$ɩB,6$"/7qҩAH)BIW{]gM#_'K\ћ19xX^)࿏2?/ay6M1e (zJV@j{\](U7n1eFR3x@c@120#10b5y8pW~~s${,Ռ)AJ5˳T{G>~z-(ӗ-6omD #|+FrJ{mYN?;?%=e 80=}xX7{F n=+^>;]wu?۞RͿx׿xֳa[y`Z ho2u8`%$,SMlR9 z@i:LX+Kr!ë}Soyu{S[B` |nIڣN^ַK!v 8a?;!_C~R;F tMrc4O| ݜ~Csg>ysϽn;oqc$rQ3kjK`x!pɾ+*WMþ,p;9:N,5?ܳ#yt{vKkr5[k94C =~e%[y16C6g·~';ޏe~޿ Osr~OTo?d6KJHE~?r>[ >ϝOw[wx3og->K 3&ʿy[i.X 3T?K_(34C7إ1{ys_+w = zIWu{\XLjg,sH HiZ[䕇_| ~p@,z޽x o kn׿o?c~0/0Y연oGt3 WY!?F[<ύܹ;a7>? '??l&7 k:G[$B!dQ~0}A!=p}#3(%(?NN?;x>ٯ6۸'3=;O }3?pw+8;}XX&`fZ= tq;C{YOᙛrmf7f7fV(lnJS&t鹞ת/L:2ŗmb1 hRE$ Sܢg< nX0o|_濽-}v1K_?rl#K$@ ZGEQ@:b릇1l _q@DstL~Cy6^!Â9O/>?/A^X3/S>"|#  N%scgn0~.>Mb46+ + Z!hH$jU[׫xJN&Qz$93CJ s7wCwM#$MtvQ9g2*B漷.ƺU^Bk{; ^{|6wMӼ*αm0@1MM쑸Z\ tjPR~w/Tw纙,fJCoq nY7׿/~c0C=S/?_aX<@ FsuP n'XFPCslSM}, x @7 MQ8>>J>Utr+xu?'mC#MzB@+YQQ ;v˨}pϟ?]n`]v/}BjMMFrv]tO^ZZg2l6^ǐT،1eGt/Q#xvv, l^ :FQfx[no Ay|}ߐ}J^іk%s {Ζҟl;vyhh)W>?ibAʃ|s[;=T=/^,37sWMr|toZ4- h_\U*xnqp^!WAϧ2pa*{~8L .XYr:y=8/ϭJk#v#S:(|ЄO1E}ܰ~o37~)?'9tg=z~ڃwzЙ9ـagq,`7WŜ(g3 t|Mp3;n x]>?ݿvFwL;L%ʿ{*Oݝ]} (6RMᕀ$%TO\곪A10{`q-L7P M J5"}vrM}^bFpE&UlX-a7Q,X5]M'JH=-Uys8`(hs`{P! Rj2=uBOW|$8.^@={  FvJה#,;&u}Fr}N }7c>9`iYaC*{]y<7^/=Yg}yQwgyN;mf̸ɮIPz V BK=[)W d$=z/?&3jq#g/}+; sz??n$Y70Q"ȧC3?ؗ- woh*|o_J!Ϗ~;xc2 wX0cgs{FgO4$Z + ejk 9톏-ȳm"Zա˱Z*,߇=I٦ t"έYX . O+S_=~s6sm9d@(@P`YFF'Jdd=^Z.]=VeXU, Aш;;3L &1  JP$Ӿgw}6vŀ>dUuqΩzSUuaz{H)¸wѱqy_?~jaj<_~d=Nd5 iRH ybO V{#"lӜRzB2KʿӺKEY]kX`srb,z]};V2 ߦIeS M:">' Iw7фNpwx5ڏ8c@Az;ɳ:j6< uZiu[O}=2ؾ@(Rբ5M-ۂ /F $( )a v=Qe l؍mSeU$9QfkhQ\:J/L^.IwӅ#@iP޻D0hBlcOhAo!Y"H-];=w 5L%ֶw6vQw]0:z˫{&XG*0:xӝIlz{kD,-\y*LPM$@a<9 Q%:RU%5" rr/NEq ?[o*\?ım–f;dd27&YZE7"kLZa5`}Jdm4bA}+N ].%1]x}E-(uYu/z #EԱOy|'_:o aGΜzoGY9Wq)c_#o;8Y_xL9n!e=BX _Re`a4]3 ǼR[ݿ-LRhFлB/0"pR:85Unf|{YnHAF:B1o/X)V r]ĶNLT:E+#`kv;zk~e( !U6/Cs-BV ~:K TT/E<\ȶz:xsWzp-xp+ާCÞrXLN&A۾w‚]Ѐ"$J%o\ g#8)o"ם|=UCAǚ-Xe/,W $F R*4|2GE[zZk;h|&0~O7mFI%Q$QP48&Q\'flOMƯLAPy䚿A*/Xg )BI=tL#ve,Z@W[=tgZZQj N;Y64N*ezv׎ߴi9#هϑ94 Ӷ֨B a!D_Yi+$TLirrLtÎ?pώ}r093g 3ek?\ D{^#kK3/s If-xAfX蛴/bF4M_kKo,̂FJESm틖:B?%_ibb/?[>s5+nxͼV F L Vov> +lGJ=q܊O[5U#F%8ٱ6Y%\eBhv0BO)3*YǧҌ}{قsFx@k -+K <|UI<olFF#q᪛oD!=#|xwW5c~):-ZO"BI'zJyA"v3m뼞NyV{w+$(ζF.u-뮻hς?0O ] i+%TR B*a'ZOi?um}৷i<<{{ӽ̴GJn?anxNhKۭ뮗iz박J1t}rT>Z7Ǖ=|/wOTPV(<<[tjX{> BAvб>l \4:Ǯ<t7Wr#i~吥u '*ڥ%YGAL / g}[JaITm{لπwH p#vTT EI\r]c5^'^jǒwعcY&p1BivL B|Y`Spz@PVk>MgAVB^Xl3kpI`5DI0Ǻ.lM6Bk,kB//hP ދ/G+GRQIzT'p׏[n Q_[SZ =;}ɤbBO婞`&oMh4IlyY'a  C|^mXWHa&qI*q\O~e, %&Q<ĕx$8k|OmzI ߘE$}M翇6WXt&:2dwˆq<[RZ=[!a.a{|!NG7ƋR_mNm^0g:;w%vŸRڟx1#:^;MT䫱5Gk묪{ߵ$BIKڶ=1>3[LiϴY̊Nf:ZM<ʕT:D;mOt:/>/[l@ >/^xKkhud*+.V`)5w{z{Lu1|#zvJ%űysP:SsHȋ 3@sJ>|yrT暥@{tϹ7ߗտ?^ ܰ?zc['n8e2ϦeO:@ TՔΘɵn< r IDATtfE;TZe"SyW;7m 컎|;vybmXk,Ϥ1زT@i鵈 i}eaSA*fSZ/~ud >4}v6'2$ogEbj ބzLݍ"Еs]S Wkfh[d@w{=3*T\ 6c9 ! aQ1mB~Î-g6=S`P~?v0hWqwrՇ3JU9ᐓGR0ӡSyM3lF5ʛdi;V: o*>QWxo[SjP-a7+H|Nw,zK4EJjRԕQ_z_9ꁝ;J$Yڣ[@S*5R Xc+B2N A];]Zh*l9 3 ]2 \Jt B^\?k**5'PRRhK>P@D@FaH`uX8ƱO~_> _T*Y[h-' `䴯L:kkDN:wX&|P35ŧ_ۥ2` |5mxPwk{&*2n)ZI%:hg_|vn_%F׼]y|`  P]Av '5fu>M[P%IlKY0Ġ2؂9eMB{(7QRhx4YOez^zh#ҘTܓ4ǯ9;~p'|#vJ;$<鑄jaM{7k=g(ijWbҩ-?sǃYc#.xxfͯͻP/^>Kg{X VdG#tyk\+'z3_o/G?sG$psago|[@וQ%ZZ'WRKΓgAn4u=wJ:pl{}dx3n#IlT,} ;;k t< x՚wpn1kV 'Ȁ$uqDj- a sI:mKW47;L(ކO/{RIK}b =s]CUꐦđZ"Ĵ<{K;&v;ԗ;|>eb3V݈=.V&ah )+ /j"tWՉ=WnӚ3zAd -@O>J` 3GBXȲN8f亏~?'ˀO5jQz@Ldg6:!x3ӝ*>LsǢ#~xx {6)T_[ضsUEB4W*:;)ЩNOʷ~?wpao|_Ń?'L6- MH} &)HzPJ5\E`!(tq! /@}?v!K%ޝgcWn1$61^߹w~Ws!'دP 4x%8%gufu͟UʹN;Eg{[g~SzJ$Ǣ9Dإ<9'  O5a22^#!*Hjq hxc`YGK<_+*w1w>pRMo>[YGA6B=e/bƷ1Q%w+k $YQl}n5D)Zw>[MlͶx/d9l۠{ڧ1'u8ΝV*Nx25AF`Pq7G|qs.ftOHu-!FG-GQQtJ+r ?q{=߻< WqdHůEc,IƩ% jQjXCffi7s:;ڤzY; Q7e="pZ4G{gQ7e3Z'[n*tFTl*SD3&y65j6V\xIfqaE/civZdyzI10R"ч.!s%Pv6U>Nn4r JD*HR*㔓 VR+X4(tA6}-KGڿ}d=~䟅$݌Z_lB#2A9_n~Zk8aɄP 1*n}5,fRRZd$d̠Hx)$Cb F=Z6`>۩ejx8Ip^hM2f1P;% K =Uf;IWEz3U)CjT!Gw+E5R.{c~i:J3&UwEX,F]Ꜵ$᯹7F5Vɯ"*~zذjA-jP*q@,MIi3"Fb2nH/4/{K[igv[U RtZTM'~()EOn#?"[^q%y2NT9P*#@YڷM9@c'?w9ԁVwAR&/&AY;(% CRmFuh̐B=z$S9_767 *WXRYB#iP :հBTHEY22$ۑdH^hQˣ4 E`//'Ǘl;iYQrٙM֌򙬕t|UH P.}$wɑ< k(j NΕ}t*@_HAzץKSK+ѥ/4BKrZ׮B)*wǛ8n>/H =#_}^}C7t Uax %ujqZT% +~DƐ$X\q(G} < XdulS.UYGLgNrfis6OtӬ& QJsuwq-/&W)o|%jKkcgPb.X炛އ,@uJ^U_,:/9DK`TN+jVȢH z ̷>HtF("U `(AY4 ~sro| HFTѨQLO5R $A8 Øbfm؁]%/Eut<9u;e*f:㵳,NSL%T I!0lnxO_c5MI%/WO&IѺ>03YwD@&ആ$=|'ɋeȕRFT_>_ &PT!H49<ä("BK% u\k d9č!P!P ԣq1qÀ?Rk$A( bNc ~x ܗO#VtXߒKO:e*mI[iv&$qJXIˆ@(-9Kxښny9Jå/+l@&m` 9B) j J~$y y!.*PC JVTA}к;/]@ I%W[xg⛯ ի9ikuDWi5$h$հF52( (|39I/}şn+گl(v&uD[T;ҿWF5a8&:p2 T'w~Jk.{_fI.N.kywH#sw4vޯ o&`w'aBq(k %B&dvAA0 `Gq!0?\$R^dF[Y,'C? >pż?y)*U %KSO"cW*1a& 䬋pg"P 0;]^]V{di,i㥖E}]0Àhd2#)K xw ?%):_#QšI~hZ{f&\c[aۮ?ǖ݄lAq0h-3C, &L(UDU(&C@{t>B}?,1{]xi1:h9?Bݽ׽|HG*N>T""b/Kic:U JT% a{K-qLZoRJMmsU Эw+_feTO\d*uhe-:yvf6mJy,m~_"L>R +O7pNK’o&%/!Tz 5 F ?&׳d2I4t:XoƧjz^{Oi!dN6@ޡ6iMYf"9|۷pC@Ɩ|mN\y`I!ӥ@ 5i4JCr.%SP}yɑ(U9(){ҜQab|l| ZkM6+\K~`SU UHTM_T17z}?{@IAEZ)%D&ByV P jqz\T=3/OV$01N[+Yl-IQ&Z*T9,(mT@v{2!;})tt6}=.v/YhKbRGw P\ "-bEz; ~M9D:'KKЈTl߁%~Wq?!sz\Z 憉"(0I`X%Tc:y!z1O]/RO l6W6V/]C+kSG l]$8b(=$۞ʄ]zp)'S0xK_}Y;&=Nc0v'B˘/0j }P_[Y]_M_?/5ӈDD'1ꑑfBg/0xسo^tC)@Tt_8>B x1z?C^6td? f;r~];@gsb!qVpDYk0TĀ.BeY 2wrpZ> j47d*%Vg\}_|ȩD"&ӈǭ_ =F_d{أ *UehADTB.I $~іl$q؍i/? ̐Ev.K(g.t AK]Laf\Ҿ"r ГJ[(TvyZGю2BC rӔMVk0NzhYSy-11_ f$TbѢWyyOwSGdf0jӖ<[SDL">[{%`n;syH-=?WC Dg:C/cߺ&s^ލz9E磴{w*UT :D;Yu7Yt+I{7)}.}VB{Iq *X6eK[4(/F-7 (/omf} ',-9omKw6> ~x`ou%&VP{h%>wÅ|C/}osK.FjոJx/(T" ؁siz_JRޙEF#JJ~B3;=/=(,f ƘVv||W?Ck]H䳮"(?L0Df+uSkqO W5N#!U;7\ /+??E]{t%@_|_VCTs6^'u? IDAT K/Prɷ襗oPU04xG#VwA` ~ۇuvd|K^z Bhnש*al`pJ5Zb(K Y` Eh"$bu -*‚߄c06XśnFT}q{'r{iO7muHjTQ- ;wj {4WC2T \g"<眍ۺ>D|_#|gJMW ШFPHzKȒoT|@PKC/!`25h_Mv꾰3,@7: q?EsMz~濿m^G:֭\iNHLԂzQ/$ ;Wb#}'}\ U)į~߫>ǥ/3Zk?" K:4uE:A#6q~~jG).i{P Q8,>qWX! LQP^&s!q} "WtKSU(4X~|?YP~/4ϛLlo;h=떯u a jI'DеWNj&2f&y< ~{B;Ql~"_n>/+ZhIK4>2c>Na^hk^b;~BiL@a3q]"d_09d|ٱe'^sΜ{gJPc,jtv'G52~ܟ#|B?y>4 H=cw5T. 5]3[xpx wlW\khNld. m +l5u׾ͬjLԔ(|!>M Ia!|>X#-r@}kٶi oxFuހO@%(o$b?.r}dzs!h_&vҦ'if6 YFx!Ϧ"6w{_d=ٗk{s\XMIܝZ->|%tɍ}yfC8ANn<@XzmUe߁k6WʪCh?b^0 Vm]xJRIcCz ]@h5?p*wn?=j&4;M\\>WbvӯI%_8_%A} WGiԷS~j^ͶM[8E@'4\Iעi v~0讀O K؝p$ < x5"#&&:ר%fsH[Nwqğuǽvi%4R^ʻd@)Gކu]|}V-yXKIeNSu\\+OLA?3U\6?1JwSu\o < `w MLy݃3݆LK^*<眃ge}>Zs䳏LS`r(̺=.tYQIs;|?A@#qvУ!ز\J2 뫹yWy&.y5#vZNxvҎA=3QoǔG[$ K(o{N>lȤV*g҆x/j->8/w3G<(9ʹ[fĆX_(< t aD0GzGIJ.Ulyp W !gz xdF0J%]~)j>?jj âJRG?65DGgm8O}fxqb\?ށx> 5"$J KCxz@p|;xzGǿ ("<}ǡ1O.}(;h~'/Y{+[[oy`~Y8V gxn~QqhR{2@W/Ok*B#驍7YWS RD )p_'1~xl_^9G&$ӧږrO6.sDcKSpa*;^c-翅w[mGDfjQ-6JXڿ,,+΂J8u#JD0B0s, ۬KWr ʖ۸Bg$U}X~# b"L/(f]'] r%%!aA!DC"-%SxJ7ev {}$ՠb[x5{o݌=obfӤ8lCv4G""/,ƒxWFu"?!=<\/[Kx߼os+S>r@91^91%JsgAX%AWO_2vl՟򵜾L3]W1St' a &e[O*nQ< 8@@`sˣ gk&16 r!H=|[9p MҚFA^dfЗ$shv`\ٹs>s#xƳDL5H?VTUBØгB<{,vWϺe ﴘ:*8&A`4'u0" ">@*O >|M|```?J;(.*\BPaa/.gbW}#|gl<įHLIo-jrްJV#ĵvWʩGmwE؝hO{4{kgZII9hAD%Q Ԃ $@Y T}?_kA|u B60\pU}Ɓ^+{q359U0AņKJMca5!'WIh2BД'ؐyA'|<܁$p\ :$'`k?T !Ϡӆc{q+\?/߰L|B a,wyD5*A$<h}fOKx,GYpśC0"v$*)p!~s7|[y-go8 ‰`>R2#\B'}Ɨî`zva37C$"*aA#TU & Sl~Gɿ{qM{&Q盦]Ez-R&$p߿/8h#H'!@;d`2N[ei@&g $2?j,$`ٯ=6X&Px-%#0$*JjĐ@ |x!OA5n'm堽CoX A<{+qKoa5͕.d6&; H*cUZBDU3jQϿq,|n.D)BC $-Iq;ICDKI[!E *-*( %)?#!B)y;;sǹwvv[ۻk?i5ǜ;o$Қ4&5mPo<;hzo9Ek ,Bqօ+iݭv\޹7u y婐'r_/A,3-$_S׍DJu^h&R⺑G3m)Y4sRCI&h&BI ES⼚Tg٠ &;rTj4dk;:\~~Oo۴m$mS4$Xm8ّ XEm1< JBԛ4JV zpeQwGր~~s{ۍ(;MgP Et:C ܀Cr7>_:C/ =u3y~uq-ߐՕsw\!OZխ;GiiwH 7'$>–VCtrIi\8C'~_"p>A"R"S QU4<X9' `ecPkO 6 -ۢe:aC;G1Z4)-&=5 9pgTv̡%|'IL$$: IeCoc7;:m8ΞU9jh"l D!5ZdQh寉5{@||9{3lnkY9 QN|-O܁f*Qq{$M27υPOZhglX hH [Bw8k ! {Cac^[{6w7uVd㩶$[LIt˒vH;t!+"*^MM`XG Iڋ 8(A+ !!sOfQl>$9Lv"nۉ=99'Iy4=-_'0 {6hQƊUF[5$0]h8| dMFFvwBx;s_MM{*sJ_KEkgM^HM5a*NZGZ=Lp{>Bѣk(CW?Lk߁$tσ NN7cbO;T'E[5&9 ~2}H 'qH@&[bxH88[6#ѣk#Juust w{w O/7LeS5$#KBaObӹ9}jnN_Sܳ\Kh4sY@06"@h،$.#>&| (?Q N?[w]N9|]Lgu sF7Ć\οDVVG;v^x'/wOYձsW8(*˂AgP-zz,3E*y՗S _d?F+Dߗ;Ms{^TAzWU.DԮpJoSk$vm ZN9n4,2?OQo}抱-+8hO@/Gh5ozt`Q IDATqNUp { UY3PL1z<ӟWc@+{?ʎۆ*Zz"4M1PCn&nOZunw~;9L;zߧS_#k. cs{_-WuGS9i0ZV%ΔSNqçID/[S 怀)BQ݃a&H\B|󊻙L&䤌,{&!E96s;Vz? 3N*"RuK}WUU,{ ^Fw(cL c 2*1D `P)Gx ^,Cg߲QE~N&6)E .>QU!E8Z/`%X˕RMە5'uKѣGME-\{?)"] "Nwqv&w9mxx4e1yXI$ 1*MFf>ۂAx.琗`_p}!}JR1JTT8Ssn5~:i~9 c[~\5sKd۶m,K[EʜsXvp^lkZv*I" W(gz#zc[DBT"e]F}Hd7=~;U]geVrK.} )~V 'J4ȐNNk[cs.w*f<r"ڲe,9i^gx Vș@ڋxoƋ^uVUbeUJKZbhig ~ljRQ^~ Pɬd T)}L w\ R*?T(`,ƅ{KT `nŠxڶmz,KjT8EQc/b{땷^k9|TYL%TnibzPiWxUn3_ֹ|UѠ> JzHzB̊olH-z?~D`>ȫ\|R噸֒oDQ1EDB V+KSWģ[JXZ+_:ޡR ^\ENɬz/ %3+&G^( O&O>f"w) !B(DZcsO4.U"Y| +)|ʊGaJ0p%}\1 J* Jz8"mk 0x$+)+Tx \C U(5uy$ 'q3ڬpPC=Enȭ"" f(I)ɩpno3 `CN,:P8 T b /Q:WJB^}CrRQ8FAO8_ r^r7"f Eȁʃv"TD8fSRzJ)(R&)$Ba;g?a'(P%Y"IH6`}힥*ydfUVufUVuL8g"rfvf|{o""\G:X&1K-)>LkBٓ(Sݨhh2Jk$Fك)vX [ WA 8+@J/%p5@_A @$O ㊆"W@eW*|R .PRj_5 q_> dIڃd@(c @Q@E5P|%˹ .C<@  ,\e+N7Hم  Ee"d<`DqZ;֊-GQ~L5#C(yYU@P-ZT<0RYEnE;XV Ju4OeiWZE""AhZ@ZDv "WU0(C~Kyȼ8r^Wf1LsQtX@eNY( \ ܋2Pr1<MkD9oRx:OA[}Zi RkAUCYEVPBvo3&]"pcP-ێ8󒒓 3(3(3( s%@51ؠ5 X\%Jů y>OtQ6D:Z1t ҁv.uu5j)-}}mp2[(tlTYtGp]Ac‚05;sdqd8rDSXASatFUfb h1p A@RůS %U ȊH[Hs=uF e |>vmmp-9K4\^gFN?7X8L*BCweã"G#.:eIU&Yi1,ȼA *x kPT>+|gSNV1&u XݩVP Xh]܆a:tm)z;Pj iP)_01*;⸠IgHw ZP]o}!NbbY LA#IJj4ʄNTgw\!:$ůPzdEhC!tg{H7tkӼݤVt}]۶ҵm'=[o%՚ )wϏ`X]X ?~U%?q 0 Nl8HG[k9|tgҝ=t L:/xu7c͗8r ̋%%oHZX@u\-z0K?M _zA>hKx߅ɩm2-{tLߞtt.V1(LO1w) ӓw- (wZPd@WSùq΍p`dtGGY[Hw%$ҝe R s\:t?K/Ayq LJ^Rc1CY,Vp HJEVDۀtx^zPY{ZXzeTwwӻs(*{I=e ̝aas1?zUwfӆ~:ٴioպEb7J+97:#9:ᣣ.&GK*2}CL(bqop饗_t1t݄'QV/ӋUTHH9 eu=St#N[нܪVϟ7m3ް]`}n=ӧ?s,]`>6cϮ5l0 /6U^W>M,:qnd_9Αc#|G'OK-C 3)2a!F x ) ϛx-';T[GU0%0p `]kg3ʪ;ogZ ifNd.{ݼn`g5L{'޼D#|8xg{tw?m붒ZG=bbW8oR(%V!qx#oꨪreŸT ??Bm"b#bV՛`ܾӳa*fNbיt[om7m䶛7Va+uY嫼`Rxg{g{tEf e¥p_cžb8| %:0q(A0f ~" &&B^.121PQ uu2ƪwk΢[`avtcG:rM)}Si}5נ`wlE^#,`"; J`D;ɯ>StYI$ &^AY?$|~nB_ ^Dۅc0Yq0SzU/0yo"cx]{\/X=DâJ^ק`e"TwdtoE+\uh]T[Ə#'9ݿO^@0E -`?1P{ߣm@#Ul Zpgq=(^fAO`}vkGy.ʾxhx5KUZV)zvE}8śEۺmoE"q̠6C5P͏}lώ2L:=wlgw+ֲqJE5D`qx{ӱZ#e@pȷCW=e|CSk`9%Xd m*~(@QI9ջ{;IǷ`}{E}vrI㬷rEE"Aqj| c@ r[3s|kHܶi/1}O{%/X(M<+);SX.:^MpJAm =k+Bx~*zw} <~ӳV__A| ־m%I 8j`0=3sϿi&`1`bQ/#3i3j 0,IJޖDPoDdPy}Hvia=)S4C**~u׊O@(;^C>O,e%ވ'~Hi/}h聯p=zuyVZ{gr/Sg $܉mx[@ oE4+"bŘaf`߃e轢?#YT|w~ / CbdL7lu[M.|};A__.k̾vh}>*6Z@PgfO=*7ѾyNK(48? v!^ 3(# U_ _+>=" Ds()ּ6{Hes?r /v}r $=XnJ\6 X(?~7y{:x3ld Dŋ (L2IU.`{V?'ޠA1Y}}N{~WvK‹N7{J!W(5D(]cO="5tt{19:?̝؀wLFn]=gQ.rd<.A ]b_Fs+|HUc ?PףӧN3s>?p;}2eאG2I~)-_tm n_ `b3s<77mͻ|0*'|9o.i1_kjZ=s)'*@`_+G#kő-)T,clϳǰE2iߪ|',@'$\1ֿ2m8;;g?(=7Lw/>ő? .2r_H]{O@aWN 1>w> it2u OkbNMq%Fl4SKCYW!o_|ݷӾyW ̞y7>{ZL|juԏ C2Mhv +B_H;I֪koqCɴnn7VU.2Ǐ?w'_!R?4OQ˂YWPTU/(Q1(`ETγA`E@Y#Ƭ2&wn))fFs{C7V E^WJvYrE#W/"1J0%x_}u`ar@U?A`3 Jh0''FŘ 2v@wϱGq ^o F<>p;7߼6F+| _[Rb+IA/ e 7?_c>18pqb< ~r\AV\`pE@HS|<_-l0ig;v{Xߥwa^;'?ýE#~(J،[BϊJ jso3}8L:v  }|P_Ml E*#'O>Po$Se;IPVܶF싐(O`nnszwW1&0{u^GI~&@&YAVToix+ڂ%NfKwwGMQҴXfx,`2!~q)ǹoi p + 8Tx|OcV.>d VO?Ě)?mf}! OڤU@`q~=.w%/+m*.Df1 qwpXC4)Eh{zĘM&嬳vpKIZYd+]6'XrIҀL\] G8B 825`9*=&$O]WB}|ߣzv؂.LW>ڻu-*@L#AAkM٬Gݹw+s?`?ǣ/> -" P]IN6+ n+R9>{saw<H0i&F.oy Y`<+ķ?J@E/7OYcF1텙3Clf?M_܁Ό񑏾LSI+4h9댤dw6\m+AP,,P {t]7,d}+PWqFQte\vHx&t6sSaf{}_8={=%E#z+WˀZיI>X}ПLBO… 8uN_2]pBYX@8E8Py&SEp\x Bjɦ\>}K՛pC=(xY"ݗ:0H8f=vjm_;XW8r_>=>+ay(tm6Zucmcx`Ш/4bSL(#^!vߊq'exs9mU}E]=x# ҃.)p% *I;[+Nv2u1?)*`Ad+D}Կ:x 9u=.\ @.W`9>G_ c?m뽱vaY8gߴ`OrKxB pbFV??(Y/Yn73/~Xk8';Ǯ7-~$ & $fhœ{ sJax5AB6\XT)hsm1);; MFh M3e ^+~ur6|)O2|}X l/k?Naa\@Wc8|Y4,KXT @5G/};KKw/c:uWcd̷Z=2%Pix9YnЊc3ZȬv¯~'i6 xۋ 00N>4?R~ >xkm +Ik."H;bb~gGIep!ɚϡZз ,%&lYFc"cM*.|%۞c?'+#ϽDcyཷ㺞d7u^=D^ZKY=5Rl#:/w\'sm Ox{ap^6Oz}Y\u&}N E@ h ;zTYVBǬ3ͻy.i=XW?rK/G> ){$C~Xz@J*`wig1@Ө IDATYw +ƣX1 s|\zr8OZđWWPc%?(X$l&l rǬQWoy.7JkK;zNR U\_*Etu-uw17j%ֳ,!c)?xqtbw}^eef<3ׅB!F.Y|,'b2l_ϙ﹞U=En[~S= Xb5@%Tĸ6r SW*Po] ,SL( u3 c)@#ϠX2w ا;8;݌)SX ocO-}" a\T3 dQC ȐZ;_ ysYe乗Y=c>*迖S/,"&u"qϦuf3M>QЍrW ,஗õ:EwQ몾+qpC/|߅er2lZOrFQet<^砂4i:XNrVu1n_C XL=(w?tgLiY}k?Hjv%ijKe,B'ظd3pvE-XE֙KuĻ/[roP|Ƿ~7u 2 چ4, ) +"9AjRຟ};VO2Wy8S<*/2 -Zhԩjm߰r%q[/Y,nׂ@1Zb*T:ý<_~qG?1P&F^Ft]>֔`S %~IUv..LVv|Y}{;08/-y$yb5 K)_OIeEY@o'{7Kqq|工 `TQB?py`Z>.I^Jk^g2U;0e/$R"?KfRO"t`Ǭ>uue}׊kw׆aߝ} v0/WoiA-C;đA^7KvsMc=śwSÅG6ZŃopoqRl?14߻3@ uQѲKt{[ZgM>PJXzKY{Q*E& \ ?:C:Y8W߁BɚqUP\BiB@oQAC!;Wx\f֟P1Wزm5C'e3>R92U*h:I\zګ5#t\@WrilXJ{zY"U̷'jy<@GQVs\;2}ԤeĪN`)hyV.5#.Fz1\[9v}ZsX2q 2=w[r?oA!!n+\eٸ:8]yJnFگNTyUբ_ w70CeOW˿Ǹ;4evaLU^j)u?iHJ_h] H;%ӽ[,/w"J=P"Y@jYJUݩ-ý›7zf(XzMD`p%ZnF:r\|yS"t(:^a:4 e nԀZݫߑGx0=m [E%D/=W/Ӭ @NwG殘`fI\;K H%#(BW_vm^*(ٶN12t[K4K"ӯ ޳:*{(ܽdQ~[~.E7SPoDֹ_-HRRiEW ^b*{߂t VqZ:vbC?."тKbnq~-juiao^gǾMd[[)Jܰpl9QL3C/28lxH[#K`qď N*[oGOpq/ z88,H9!T <՛T??9R`#j3#c.n|[vk~\{\WxrauR-g\^VW^_xٓi_&eX~ ;%%ϋz dR7Z~)Czߨx@m7㙿.v nx''z?{u+FN:o ,P'H ? !'F\V͏>ϑVoȻ. /P]W.I 0:OT?]+\wy\;r-&֧>3飇~=?}ݒ2Oc%>u=^O/>uuZݨ)L n{_EITTCc>(҈03y&w&ݚuc?~B *$V_6ձ$չbX{am^.z9Ax\ Mo(Ƈ@ ݃tt2{Uヌ3՛LHvL  ՔzߜR_!CdveUgY9U(TZ8z^^R?[P8/7~a:%+A_ (-3E=9koچZeG9o`:6i,OFX@b? H8׺z+ͻiX*scS/3xr_uq?Ij.;RIx3|q}2 |qCӌ.GSkMfP7n_aQ:o&{ƞ9&IB*.\K X= P~矐1N-PXw^NKodp]?BV(|GgY UY$Qvϲas.EO~lRitiĺW+B٪tmi_ {g_۱[ҏhB+iz]gD$cյ>ú;ޅZ &a}{C#x0 .nydVr=I\F+%i<~$k/;;;Ͽ쩦(c 6R݄roo*t9ʫf\k])P[T;``= b6DĘ^{v&tK"ADcHN Sٓ(zzbaO_o>}"qjT~9# @ 88)W3p =^JeZGv}Tto@QI@)v1%Ƭv -cl~Q/uuQ~[Oˏ+Ք0iLZor)7=ܺ3W*^wLf X. ޲} }͑UUDNh;0OF0&/ּ{zຖّq<})R~uQ Z5_O@޴r++'&LXNg;}˟k|j^66?ǂBI 4{έNZ[[=yHesݸKE]+H,:Xm|@= iHNm 6>tG);Gޒ‡?'|!RkYjuڭea)IE=mTy%~a9~c|#>+ $Iv=T =p׭ۈs\|5p[LtJJ 0Tq@dE]?(oO+x~}&ޗTLR54툒(`-~,70ؓI&ȥ%2_RFڨT깮Dѐ՗BG_9Haf"v.u ror Z$O鴮#i82mŨ8[(?_bFI| @Yzڨ&;{'gش=u0ؓaV6 {G0rq#gfyFQЬRR6K8b(L6KAΝ"ݾҽwwuuxKNV`ĹU rMiL+Q stu-P/WKI׉Ho]+Xy,8I( ;4S\*X^v-PUTp}ҵjc6Tf1@@7 6 =R@@ Wk{-cb(nOfH c /rAͬg_-Fef*w5# U+`_=m 4P A<7@U{нyҺn,׉ jqn@- LcSa/k:utKL[ةw[5/:i~/ŅHr]QjCVj/5Ь@5VV~o@_E>̟;Mcҳw (>I*dQRTq "Hۭ7og0ͅ|!ŷn Q@P/ {ją;OՍzr2fNqe 5qǢڊlϏ7 p$p ,;If {yljӮ- )d%@ ۩C70yvD}b WMYuҍXD=RRyrF+,*Q>,`K[w7b 8N =;8:4#x (@D@(WL*"ڝYrk2?6 @ u CPP[WJ}ͪ/i˕ Xj8i4+ŸL,`)z܀b dv3w40)!u+3oLe/7aO:\$@aL]/\' g-xHOڮѯc*>N=I;Sk},E3884Bnw=/@^Zc./ұi+ҹuSGA#*d 萏˔\c6_гe5im>끀?pWSzUԫq=O.fZԫ'6Qzǹ@ `ijd::qX'a37K A (@E$1a};oEPefd-k᡾0\PV;Z^ǏW8WHbZ̦\v/43Wv9@~ ۪ jAq]ST|1ܚLG'2zނh]0=* cA! 0|adue$bn6Bc3ZU.G)r9ZW/ݕK:FCxh$E KJ S'IwbTU!Ô :@!%BV6zn(fHd迆@@C@ŵ^ j@eʲڊk#bCVvVۍRB7\ 6q!jw]x)%I~r s׮eQF1 J Y ,gx."Yлc'w~|T[ֳ6:X{Gɵ@P/h$D UMyhh sg9=lhqyYzգz"/XXq=ĵ86.cmkpQ:HFD*Drh]@pOt׷b~GWSjuW[;V+Pm_52T;O 4ykosilX﹖Ҍ@bł?bTę4kCNDZ2Pd^& 2U d$q2N4w/lftuPU[ФTTʀaejr=Z.DUW+cS7Gc[zCGی`=Aruu\OҸAlYk1_Z"s68-tݎe-bU,BF82(^AW~ɈTs<[w P,6-]l[ys7),9 ǵQIU{I&K=Ϳ7]_o~rzZRY{{6QvTv7:--m%?p5iju#Uk^A& (--BJ_-} 8Y"B4 P;P`fj7X&W_T;T^и:y_ IDAT:o/+QvJIR.=;w\W>ǝ$Wηƴw"Ɛ(ѱvcC$`AN> d S ?J*i.0L~npڃKpQZuU{j:^M~-_)yt%i&}qǓF{QǢڬ?%ca P%ՖÝuh]Pwxy½k)>'¾AiH ~C3Lƻ0Q| P/.@GIZ/$9_Iҙ'N2Qיs{bi\{[vgOU[ZZQ꽶zQTKd"-VIg.@*\RXFEmCTqǫ]G-YIzH#VYIRVz,}uQF6 \RiHvL#tਈb# ""4R8]aazL.W-~lb%Rx >^Y>|CkYF(~bQmD {%eԽV*mԾfFqu"}*>6gT`VڇA?-fḛAQkW+sdp. `nQكBnFW*8,v.4=QTIՏm*{DqٟxTF=$$Ҿn-*Z58&'Hehuy-d*@{'%H1ۡsZl2?> oAw }JHeE֢(՘@RPyzDWR@ez/Fժ~\}֧o? M% @eӃ`U\,"X(;n-A"Y@yOb߀J]i?Z!DZ3UsAe篆8@3x=n/WM@Y["|i r~r(tm#]@'$AĸB?@yR?HZ&>GP/^JŎQ7ZI\1ZĨkJJf]W ,kw,F&m3u*3[ T-䋺,"` ˠ8"pnjP .@qDu-_Z*r+)øҒ7I%z8j @gFL@2_w@`DXyoJ0PJI:xi۠ eB=p Of"JJQr_ $UܨH=J_<Y~۽Xyz^;(C՜w ?5^t !E]3DՔŮܮq>vR]yFYB5P*J$ TPP$)[ i'G"Zj[UONzZJkwץ>@{'ρKU]퀲ڊ;;;~02jTGbQR+"/SVTj>jZWbԵDMѺIooƺPq|  7`ߣTe@@m3);REmwj4u!-F ~ H^e Q-QG]K=ʨkYZ[Po$ Zzʕ >W,Zd.̗7(R, HХAXOΞnaIwJd#)}浔%|,I/JY&|MIATjUo^rW4J]^'k147Ar+*+QJ:!E"| Z@a8Sy چI6ɔ)a#J=nW(]GYz7"]WJ*Czjt_(i2լ{\[.NܠPA%(J\0,JiWQl yԝ0#p8mä:㴮i)S XjX+O_frV+ $fDQz]F%a )R/n1&%** CxD0H a1w, tmT*4ʒ_Ddk  H H$E"M8%jFylh43gΙ̙MŒ<7Y,IH&XK7tT^GDdF˗/_U5P ! ^\"#~7"3Q"{q~j0b`2p6UJx:i͍\@m_LqQu? } ._%a}R20·6&EY]j@#q=X^`% A4Z [M-8]G6juRc]/c1bNv~$:W-ufTwK06Ib)0oM0E']PIKNgWqHvf"'25`4:dT Tdc$1&[:1NmCP9odӏyÀn:˪OVwm(y`:w:tL3۸Tޏ}?y8!f|O 0kH)2(d @DH;HK9lAB6@ H.Qli:N{#vxu'XFq̅{NHא]bd܆}ֹc~(y.' H@g+1xA |3-w{yO%ִl49 I55`E$D4@5!}PcӃQQGʏSUJڼNdtuUAղ!&dCFSq ʂŔO`s_Ծ'zI @@si=\İWdI _xId'o6u Cz=`xB2YT/F{Ugˎ|KY.P'YoR9_n QV+毷 CmȨ p@" lPv{Ug3k h 蒠3CS( PfpjFg-H—."_Ad)W6sOCP٬F*We|wu7JWn?Qu1Fi _!Cé[ ),'ždݥވ+CAM @H A*sBp@ª"{UL͈8qt}wIw2.Aj"jB2ڕ@+[o1uZe&GO` O8 ^'IM"X"QNg}l^HB$UvaF$=2 P @7p<N:iIo c 2jC!  D/&u|Eo\>vj o 9A]1}+1+:Ƀ l F{^6 ʚ]p) ʙ Р6c,=ӘmZYy&@By$4J$ȞIB6Ώ _xCDj! 釻.0L R֊'$TԆPMCE-PPq D;vKeqw:_'=kMH`"؀y4'eJBn7%Ꮂ6't Ŷ=p8*," K YNH d+T4[p* m|kƠ73u7AF-!!Wr3p,˸|7Im'GӾzS n)Kh"]Fʶ|B?v ²ՂZg/4+h]PP,z,0 /!8Ġ$J7p'T0T;Fo~u~>$TDq^H2Z*u4JW% &}tDA˒~O=Eb-mW߀<ؤȋld悬v.7B\. 2*Vn{:k[&,=٣7}u~iYet:l (@T0ÒIdD;xd0;{`:I78I0HFN"~d ۶RFz Dq:MU. ly3#ult:v@Oyk3>#e#p(./o6Y. xdYvtStA胑T2I ˠ7 ;qWgߠ p ?$ODq8yxLCu&o3F5ix e̹5a]O^+iN)rAIA20f F[F#H'cePkIus oh/~&σv 004q.ʿ*K̬A`kYnζ0?U4a䗉Jj'O,5m`2OੀA1}F)8ݶ"*&V.r2MA{۲l?Gqy}S ~r_SOeX"h`'׮ q@ƐLf$`HPu<)2sgUE'adșTV׈5OB)"$? ;u?zIH#3m"gɇ۰*~:.խ_C\1*m'(;~{l:i;o;~V?_Gt'B-$}3GX9;7ÀYL@R @@w\|{c'T"PMP5dy~J|w#Po( oH0YrCu/` mFEi,HYPE EQuAY}2#(C`\p-&# E>.3tAyNun- L A@@8kgf2CFnOY `2/Jlaf% \j"YpO65ӻC ~n_X62ho TgXe1q߲M}֯?e{<; l=xPe"*J0ߐDnt`꒫B 4E@p!h .]˪;u`*'I <"/ U+{h9*-)fzϾ}d#x!>CCd&9%T5%&kQ+X„+S(~"BC#y)K2 Y@ A/fK *T dBiҔ"D$J*~B5ƃTZ :KȸeN~f+W,uf紧>ܿr: za1r~.# 'uRFS汩aX̾˧N@0XNF 5b ="Nh`c .// 0 lV?pA%ݺ~zP6 Q&CUK=ows%T~UBSoDڒE@Fj\ӥ?Șm~Zo9<%DqO~gy 14uds.v LJV2w2!"/M@:0U""' B$X ~x~>BXƺ1K&/ș; >;N ߗ DϪ-&Ąۄ@%+%gȫpMkC*%-ܴ斅Vx?Y)@! nC*3u4h AH`n"Ț Iu- G.p74gY>b*~;RJNI^w4" ; \ a亮N>H"$x_-R(ݾz/{! *;TB𖚢 tX:{d=ːr KuUÚ 6 fv.a3V豹?H?Z cL@C΁+/Ih5!2)Sff(1eFH*?NnUDq(xAաBȦ/98qcARhCO} y ~TZR˭S_/`sۻZ:N.ύvKYWu!{HqͻŒ7AP + JafHpsp P tU}WPfBPJa*~<=W~2Cw~W:Y<'xO~aV\ vDq>}\Z2C(\_Fyڝ)9@K0`TD 2EB^QDWO=Мm@Q4$!v|HFEySz5.`&}ʀ_GS1Eu e-ၩW6**DzS6.Xd$t7]^M@dQgl'y8GK2Кk@L',x (u! L|C)#7`(w021t/)G)?DU\s݃PVZ}NH$rB65"V "9!Xcى@Ngg],L&b&}f̛"@ hhHJS^iMocӥ2aw7Zd޲ƭꓳFnP.c$igzI$p_ FsA<7AbDŽ ^UδsePw& )o(m0W *}rQ;hq9$Q?{]F{m?)ȹWI?[Qɶ|'L2\݇CcrND 4K+_pp M:0F~t. ܕq l^KV.I *9T<kW5E~& :@Mv̲=eH 3TOu`@ zƒs}; tC/C9O.X$!cv0d=CCGa PuHb\g丈;uAM`& W yAovQPU@e,spryUH=nX:Il"u@4ID5B@}p9i@¾!Ly7|AL QkDRILA?jL |?@^,Nz[g;d̤DuԀ<*%v}n̏E(Ց!Vh:` ,>w$b@E0o c;0{ΥDR0`lM)>8ж _ U\P͙u4zUdB?urQ!oι켶C$߃mUI}~D(ISBFF[%ܳf/Rdo@_5skR tzAlSW IDAT_~јjX2E8B99K*.6Pc:cR#:FA".^{C-"q=];wIL Y:P|$6.\'ހ1u  7e掐Em\x9";/yFY|JP8u_gwOۭcSq:tTߖ9v#4.):L:j G*)W9PY?O<!gsΊG({-6e7%MblA& "| ?2jN  H ƔRcpR Y^j{bb>u|ۇD[߫@<| I#BDh>Bgy Q> pйOn^g IX9s W/6T#f@HIBB(DY=VVUwaFFo( REq,7ދ/+u!$D K]@)똀AH gd.X3OdK`56@{H?Dd@06*:#,|!h !#CBTBEfj|>UU x m͎G$D ?zֽ4u"oL6u F\3s>|2RV? J#hsVldT2JeC(ap̼FR>NPv_̑i_35jr an5~18I'H-G2n_RQoIɀv1n/P uH`x"c9ǓPZr@$) uVSrpÁ]ּ)zBc@&YrHj΀(# _1Ǫ\+:V͡ʨ@HȠV):LTn~v#-Fb'Q< Y5Oynϸt-91BsB|Fs BEe^@w"bQ?IYhPUA~@qzS;ŎZ,WJ=Z23tUӍ%ι?%h ^!!`2_: A52.21]~BP oHp_ Ԑy}τ3[6P +IFKLI 9>UN0<2#3u, :<! \=Y3Va*s\cY7c`̫`}AH2, Y#WJfrX9A<߶+bO<"PCVnme{5)*I "xj8/Աue93E0_Qs s`>Usȟ\yu^9ܜp3VKB'AkaT3X(.&d<\$%.dF:TfRŏm_ Aզ'34ĬXe&jeI f&X,I<)ĪP1fIl_ p^@:k*ApKaN 5Hh谎D჋Z;=foh?IM4x\ ƭC0lO/Wy*AJhz n6`f<$!|W&MqlU h +y=M$r?ns0/md)@4g#{q௺Bwx+~ e;6) ^G&H ?)(TV Ix᫟uPqf27a`B&ߤPSi:KZEGS>+h|KH: |tcU TtIk{0&gujP1aR50D5I`d*_GHaT.|U4>4@™ef^ ~S}"x|dA¡;5C@yD`Gј^(t3'_1*0"`@e2T1TdxM2!F4Dyy/T55wiהcWFSu;z 5Pb xJlY9*>- ^*oT s`􅒟שWX @}~{%0 yY /3뫬ӳ" <{؀ `z7 ~#͙Wq|΀>bTF}笠ʀ TݎIj& A-HO @H9L!io |`)$3_f5q&hp_XvG %ȼ$z8#? X+*#Si4gZxҬZa/"?,;m˯)U$ U yAK5(R{QD ]x37H}Nk}I2Da}w{ KfDE"3?/zd`kB3iUϠ**gO`t'Ce/Y$Umg>^+ۙv+}A@d܂Aw$"ցYz0,w3Rm)MB<̗XBaFoڎ?`+ln 5[ȧ87c?)XLHGRFh[jTu&Y |Ta]B&P$d܂^2}0) 3sX@}Z/1*̣{07h{vdzL[ioڰ/$  <ǏCl2l N#jN}2jXPT)52bPJbnAԎ!'MNDe1M)+N("̫|U"=#Ut?W! zz$bT0ys}s: qIH9feP6엂K̼ ]7`RK:MΪFOHk׶]H}od鐠Rm#˨č93Q_ LO!~Tu^eu0&QۙP{QÃ*nBM;\^UG͹i>KO~X̐ke`:@ v3 胨j^ZQ { ܧ~Q(7 #soԊqݷAN=ej@H50Fc=WH3k(|@8{gCD'R@{0uw /W0B`c+?O],O]__NZYw{8X:4lTP ;/ {RG?|mh4!$߀YUxwm](4ī zYg+ 3D4 B7 9HY/l@5К|n ZB2H&i҇N,KH:Ioi:NS$2t'Q4KG+)16ߪ~d$"kw݄;߼uYN^|Ѥ.쾻eqrek p !n {P}٨(n}?.>ƍLq鋬U0^G~? _q20$&:*|#hoAk HAt0 ~K|O-i $A!%}R.}#jth}ЇDP~Y-k)bJ|ec/73#s[8~bH9)$9)xJ MtV1n[w uH.TK./SUeH@Hن"w˔7ש8xM4_S G`ܯf}Wf@ UUjw@hhD7 ;?x{'55װ! 8+&H-8elZy. uI rWѿe?QH x%H@F1lBH劣+!>{e ##D3>cE![_)`}e]0t_> ϿNQW~/]? ߈լ4!➊IO_8v } y ҄|nݎR>dM?%@r2j`kyu(UPخ ^Q* վN IDAT$nn֭*%UeD-ὥJI/d~s,()8QN{N.h^d.`M>wUU49tD%!ogO$'8mP_gW'xߙVxyZ[+א3v\)?I*TN}{4M *f 5e <:z3r9 8O3=lA|JY/2%0_`3߿`mU%n4`L`괯-5~R-nT^0:VPRP $$(MA$@d7pUt7Vv0QGI\ǥΥ 4~wH?0}$B|^yOvNӲ'+ Dh :DB&T&`} CQ;82A =Q=żD4g z]tזӤyV?MDٿu<p%y*_U?jv!aa.I}i̿ 2JB7 f>'>g5wizϚ5]~,+w3cD4O$oFM'8|/>_,X>obIl:R46'@pä lnQy82pGIojJ8([.T.J*^ A*y37͚VpGLOgir?Fx?|= f^:B D4%N>4^[?0K }^zg_BD Jx !l:~F !58O L2'`4"*WIB MTPM@gHā¾f2/~4Ȍ ?.F({N@ws$l)4O$ Rŷh|,Izނ䏃AkFg-gVC0`A X3PH n *rW(SUw߫$8o;KtkC*8{ ) t%s@? _$mb<"Tt+o}'1sh!.=ŗ7STgEG I!E HHEե UuB>DQw˘$T"= T@@BD٣sXT$!7k{ueϳ֗ 0`6x&-{ PBLD@b? y63ՃbL$?3-oZY>V1&dU@Zi eEm%*ph7MݔuH rfAŭlɐd$e{Pqs8zg 0:MϱN/AU0܅ 5iX {?Y_hQ&"q|k{䤏}w: [Aw=O|{j M3+$m!nUqj]Qfk7Ƒ8}Edov$),yWG}‘w݄| BN|ϡHOaQI.﹠ #i1Fjt6 nUA(;C໇峝Kz\PE*@R@(0:I~"³_*!@sJAyyf^nO?^\B>H[nMu}|1g6SmhX3/tq5h l?т<ߩG `9E"u&ꨀQ$0uv"ۖlڣ(Ƚ%ൾ)De. "}?o !vWϞ HBN9fc`sBJ?fKDdy< q<*UtfI i|~ 79JqUlU.~Zu+"u=Nk$PgD]IF&(N_0vx`s|a@͙& 3 VXp~StЕBGk=vz?#? d&%"Y":@R!H7'O1AN=Ə5gS•D[5I4-)dOob&>q uIRi ֙,JISzM2 P|QsH f?4ɵ|>P E09m2|p@Q . 1izY_ ^1038?ʁ߿F)7,@=@L$M6 ;B@4GR"%Ճ:K`ȏ(o9 րfc^8xnВK ,%kCx#1e3a;D0"w&5EoR!->S-'@b(܏bz盦mv'?k:i)՟֧Y28{mw}0R04J?^ /K 3Jp<*dt3 !Al:f\;HI ПM@A!v]RCxLdB 5ܟQ F?`R?igf; 'j,>Pw0F䷣@0<6|$/=4?E 0wC|yyN)=xjS{BDE;W0@QRda-̌{ah\:D6q bQ*ٿS!z ZOqi@U)1`"9 2{"?&\ڏAg0yi"@m|~oG>Y\9{Dt&WXok̼Țv{4_UKd4<`䈐тfA!C~㶃X tV{@#ߥTؔ)eLP8Հ6Pa"uI=WX:$t- |4<!?t+r PToُ-~On$D+H> ^d^d`^b500w9ܫ~S`K_22MY"BPjNfC?Wp[ߜ+{trI71jZO^p*Ps#''g[6۳Z$ AaGe A cX0g/>g`U@ﷲ@W3fLcDMe>GS_ !)IOEE|Y_e`6k0xgߕ `D><&3{p8H$7]i01na=˦k6_;@A" I $⨀x_7Q}JSaw@6s+Bc ݗ}%@h4I5 ~"acc+KtL[EfOۨσ `l9+@l@HLAЬ!:HBBߕ1x'GÂIq\A%M yWu(z S2_ߎ njH`룄9d}.쀿hl4RA92TH"w?^ח"Wݧuzʬ>:0woxj裿b{=iMfS"yPy(S1Gޏ}Gzgd`jW_ "DL\0tQAwp2?y<[6RaΟE|6 OXX p<ϋWNgWR2¬g^eч}75v+%_!3iM"'%o;Ĭ5=w~Co.3cs%ҹ֮ДtDȟ`T@ɠH v9 dPL`Q["\0DG|'RlR5MB M w?^(  ):.H|~}^gؾ<賠yE_50'P@hH7@A!bhV L(Z_c\I7TDoJ4#B84X0+U@Yj0"y"%_Q|!7_Q{Q bosɿX @$1sC-D-YP2Doé'ci !O*RάON/3+7a}7|+6_#P0Oj䩁@,pG57;?^]waz\QYOtD!0ߒhG` :/ ! Ӄp=-pFE(fYy/q=ٿK9J'EJML-41(F{n'9SOVLOzB1]bN̈́hU)V'~cߕ `E}J`965D4H5hNoz;p{މv"-bj5%[3MHR1%J_>f0WE@R6vS$0^h`jQ -Gg/ԣ3'@` '̗Y'zˬyYee7yBWNT}$ b < ZP1WDZ{Cmm`m_U =BM`o?JpN Gaj:BHKbQOpXtO&}߻8ct{9I({#pwp'e2etam1$* 'D ӌ3z_voo3t!CGVNWիSKLɗ('y^y/!INol0D1nھnc= Osc@aoJT"w]N½{"x1h\pv`zM=v g_=Ǘ,z( 1DcPov+sW[lorsskl\$&7@l$ٮׁz3O!x&nVUE m1LKi!t=9EO 4f]# [>FՀϷi[G>ᣲ̲v B:_PHDCA^`6sMP\?«DBލnvo;?JTp s]XnqH/"Rw 41i"ҵd+{BѣVc =s־aϵ,%C  k. rSMUjTuX߉5Ơ#o䍽z#/8a(dCMJ3DNJwn"Su$; D$@nG]U"bSa;s׮FlxY`d$rF飺/DWQ8CUDU}#TGvO4g8 ]EyTp# l5C>@bWD\bDj$NH؋AqD$R(鏭1qT)Uw+f !UU0 xY-4U2+HH WYUASgj)m hTljllhd2[0px!ܩl@ZmsvM}]!M#9V57 LFK ,`!=#MIMM$'RGmD)'+%dt2dxCpܾ=IZ=)y14qϮ=ڪZS$3Z!KphvI`ff( BwdN%~(1*D*3lb$HVZ6R 5*NуYv_hM?  bXܴbo7{3Qzx;bMȇ|"1B(yU9 F];Nq`D))Zx߽Xܙd漜 ig 7-Kg' uCbLEƋ,B$k%ѳ6(oՁjiۿ -19g `/RuEqѺT?Ӆ4ΞP.3XAB3zE]9]j4Q~P6w?\ ϝlKr%13)e18 ?=~I|`5ՕZK*y@ު.juM#8H,Cwjwh=\vu+8mgR挩Œ/bCʟbB$A:"aD3h^Uf&?{9D؞vؑ_>…InR\k&)Z5zI1OK0_ɜA?|%{~Gi;S&Cg(CH:wéo@$egei v/!>󽓊*.6ٵwv>[x׊5mWs{Dz9`XIaaxDԇ@C0BToŒMsgL}Y>GQtY~0kݖO߅&Ts`,ǵz԰=ilhc]'.o/ms+?Ν5a,CO.}f%3.OR' Ö)UM'::$tҧ"3P,XJMܾu?SgkZV I^}7<~wLc 5)awoU|k3Ox,/7S5Թ ߞuMVt==.4APwhGE4n~нx0S1='|O?Z_sn㹂y0ÎicB|[dH_Bl}RXW^!޹zӆ'tEPvh LLa ʍpyH0 <<@ ]aC> lt54 z-YT0]x!fhFSwƁ0 *xA ~)B}*3=Y <)5p;WoXXg62{6xhTδ3$ڂ1˙c-Ñ S'c0ÀPAQU5 @;& @2Og{[~υP+wP1a8) _  (,6k7o{:wdK& $!,BFv`NIZw Թl?_:s W6#@+tPcdsp_$xWl|reY,[̾;s1'xAІo3!|^Ԅ%z- zt\sSMqqŧ+ʥOoްyOGL$[AfC-CdV8$A]_ƙIxL0}Zruץk,#  8r 2h ?Nnο/_isBrf˽ }CM'+(g|m--cFQsydu_RV$7k*آ eq|C1 ټΜo۞@wJT^a*,{oӼs _A POd;Hr=ɧ~t2B)k|tUk".`  ӡ YdI&[m.8PSM۷z^L qDJ;.e4~g9Y,ٖþ_PޮV)Ɉ+}_q̽:x]NSRi=2^/);oxi4Xb`MCT}ٱGcۀ3;XYS} Xn-^ *~xb3o:mY-n'wAeks a?Cmzu r )S3-ҵm7{{ls"SPEapGX3CCs=Oր!uSo˝RG^o} Q;twkDF!cLIRFSe/Uwezr|~ۧ ~{I_"AzNKoos^s`+ܞ3U_x) 1)`>Z54 h^>|l@#`Y>XX槍G %3A.^?6@;oK{ +t5 Kryy]Y),GX]؛x0{ojvC֝@|vjSHy]w]6 &s>IgÖaK>΄_;;Y#0|'k"[80?c9魅` $`ECl@y@:hdH[^tܜ5<,Gswauo^B59]wpQR~7tg:޻&jGҨLo~aZ]/\z҈?EoLw~J#?Dl?w>`Cݍc`Q݀zv!vxrbxcp%⣪@~+G_=^oJ XʆɱLτ$)<[fgjԩwNӿ#L  @ʫC& 1dNA`ו k˵:/ft.$* ,/ݹXgxg8*b_dI;q֕ꠞ;=eA}Pw1 m;_e7u} l~ٚ5)pX$ P}ZO*=+a-2R+;2Մ#/+Rw*7ow-0ޜ9阀D,E5m#.OmkW9H,9 D>tk[GwxÊ&%K*8Уa_ &'+cr_d52It8$dEw.;n툡 c[o4_=- l$c32n`^xJݵ\{7&AHU✄ُEa=Ax<0ځۑוs+1r1Y̽@sG}\142&|lOBeDOF񤉷}Ir!^; t~.AJ];~CIh֞.G}Ʉ?19QׅIZpCIi& yZʪ]Dw+B5pQmq'%$_uMO  !1Dw h_W4y$%{2\>G\b‚EP AҔIS_q*KɈqY"6 tFw D=ZFzUƼlnwwp# +̍,#tm/Z{j7~^Q'VDK.p`O*0p1^+YuW)ae_l7ݔZƈOm܀Zū`,mZqtabBRw}Ͱ[^wE&"LG*8#*Y O\ƊEv3:G/|=RDxٓ5w.=/1y$(~d^ҋ9l5'qLM79g)GL7b̺C6 C<벜Ѱ xPWoD0qϝWE| 3 1 bxk«e^ AHL/d%1:ңЛ&3E0꒺}p2!+{W ;"1Õ ע^`5 pb'hcb?ڎy<:/h!xD"X???ȝ[ 1]KaǶnIWZ*Ęp1 =.:*#{67,N )鏙%Ҥ>;s܉J*x3HV#f ڏL<,ut^IG+,#Tɣ" Ґ!&ƦY 2}]/nJ\:$hIJyI?rZ ވT{DW\>h8N9c!ȫB&ȓ;x5mX Su{q^q =Џ~U842W6 {jq&2H\ O>G;wnj_D/6UDBWuco1S?]: r9&q12zH _P$Gu ieHnHX |j0bGe5 8YBfkq7,ÏvˀXw$ʹ!V4斆3j%u w}W%2cIKXcuk98a0Sym5o3Ê^?IFd\Ě(\USZS_peˤ Rjgs6}51|PY 4΀ =d_ڴdU ͯ4`=g1fuh%4FsZꀀn5ᘶ$F{ڵ;.96!?.a_\AZyQ,?F?up@-k(Q[`$Ӕ琍1V02i[rusgXƙ#Ƥi ;t7@ _u5dX:mH!27)=\qnTVlzmCC"gLM0HL3d'r1v',eDy-U\&ML72?o߱N-2P8 Io/^x8E"٨e%'Oz ://O%c:J;"H{% IN0V=$o%բ<c`#i\  y :  ހ o|9KɌGo ^hࣁXˋgq]F32}!tgOX氂-QQk}1~M,ݵ?rw8FPNýMsAm}]yyS~^?My6[)v2 cE2 %%% eee*ӝEIvߍ3^nY1?no5dʦe!RY]L,zsd!fz1ѽŶbQ흺VltQJڝ=|"d8mM@4}+Ź]7:*&W F͛7f3-K>{kd@ ͂b;RGŎ;2JRo֯XՀbip0FhnvS6)6 LfoAo*Dڏ"P"">3G4i"t D-=yft0(,Cͪu\55/噶TƍK|&!%.Y5 hο}8n涚L榦&`4"oĿM]^}Oˀd'Q@E`9&UT5^0THXҡ@E""fn̨@h}.Vԩ@Y&0L$}I4 ":e X80;(* _S ˚ Gy/b^cXޗ LL+7lٲz*,IRȕѢE=rdNؿo_ɓ/袖KV-%k IDAT,հ@{ [Rֆ:Rc nIZzC0I\FG"l6*KQפ¤[G@<"R훌|AּH ӭ^&薇yp΂ G@D$#\v0:`͎D듳X0J<s'wk~-e)A)n4YȂQwc#mXWX'{RF#hJs{>{W9e%oW<%hmhɢYL<4Agbsjϯ[TtxCdVeԓl}:V X.UH/D;d%iߴ ڃ <0LQKA 9-*D~hu)`n@B#2S/[.=6"\Z~mHII)_~}v ںu*Eh5ygc1)MV" GMWёGoDw Y:,G`nɋ Iۤ@%uc<&*@-H1 D:4`#YA`D0"iPa`^rKL<.l#2%0T-d!x#L> i*"߷Q/x7{NcIkd@F޽[AEVsi]`ABFFF@G7Jd7#6lsLX'(<(N3 aP̕I!5jȐ)&lQ`). x f$&hxHaNaUWͅH$nOCe:i5'DBq@DG}¤ab:Q]&O.PQXdU* 8q,HAdLOXUKMTNȨ̏MCuyj߭“ Gt8:-_; y<hii| 0t=C@!QҦT&Rc hOy'σRYHu+g4͂:<%P.c" <9"EؠiaBxS e#`{!vw3k@ :#LKL47Ðf,a!a k7>9Gϊ+C_l &{TlǿK KiP}3g@q <: P=c@GCJh0! =ݞ0K ɔ~m/)qlB lZ݆@ъNRĚy(RB.QIErA_꬈%H#z|B"+ϯKA a֤*^>-8zJkloz: #Bd EKu ;:$&9#^&vFiSNhqZbl)iiW_MX;f̘jƍɓ':p '#1&R-īп! aP{| 1)F:Bԡyc-քԾOk1@ݜCvXZ :3|_;((]K)%"[’'}_д^p 6,< b\zEdGg`A06!_,Gk^pwNP㱅{y *-2W'MDk@MDt`'ӦY[Zg&orx~P"Tġ/RĒ@2'dqDҩ8!şXqؘ @ex0LoAVKʢ>BBK ,dMM5+EAƖ,: Hv%$dt u]l"`G$$$KGK1;w6r3¿'7(c 1uַDA؉Lr$+^ܤ٪F Pg?PZR5ϗzOE#r.k Ȫbbb,^AUW87 xC;փk{KvO|_۵(&1*(1 +CQ*90UFZ& kS* ['K:YVEylfsjI#(@ Kgr%h{9pƒ%KZ;RLd0!KK zL%Uչ`ܣ!'Pfa%`g[D5;x'Sx I葴'gxmZHJv*dzs >ᑿ!A%[!})6Ȕ4~n#|MQZalvNӍ¥}J-38cb n20nmmgϞJܒm)Ǩ}lxlbַƻ@Vfh-LI\߷у|w4Bh-Kir*Js0B Q}ݑ>BoȅjJIFLiMcL5.%p~V#y(@o_DdlF oذk4$E9&jhjj:XXXxpԩ 8*֞ι1"UM/I{<0;㴠?p G#[#9~Qshy}ɇ9ZiԡHS@h3_ ⏑1F |~~~_~eYcP!( 3BccVUUVKvmyyօ_-)΂FP} Nh P@N^$|66..Xe5{9kl ~F|뫾#!5yU }x|vMӆH$B5444Ԋ(>EQH:z=lܧVcg_GDj d4H y9!re1!=(Y Y B*x?iN:$n0.!O͆A="w8BWōaY)EY ,nWd)jqq, 'N޹$1vbj?Ϩ`b!Ne?G-e0~V I}M7UP aN$-¤corN4ac9.'3~d xh0 R7qWW"} IަnXZ!Sp:%ڏL3l)?}{WRɩI^޽_13ޡ~3Ã[ [[aqn)zO7IZmVި٪o`ap:XDK*"a4n¿zrl'g6n- e/Xr}0F(🃻o;`̋dSgwg P ӀUxKAߍ;As81F=ei>? e^c1pA̮s rB"yVaE&^GfaԘʗ,%v}@K Toq&%]3~?-s"Pݎ/(`c O&4a^WjRƍp'5vĩo̘0-՛yÄ9u~ (7U\ 搰vJx/YVjj0 I !Fz o9sίIN{rM}ɯϘYK/:2aVb.$qf ԬC7sݏFqַ$;Zpb:ԉmfTߓ{<^TfN Dxb%P sN{?ɧ}ͳ_|{5o>s1(}1ӵ>xϺ :FTۮB 0h,ݶPO-u^xyh|f{^-/TJN+]{ɷ_,:w4yTᳳNZukxz|p:2ln-8xe'|Z7^s !.6ܟ-ۖ,_?sMv &:]Ap،FX*7U]_ d@5͝94Jks`ϵ`-DYM 13lï*VMӋ/j N抜Dzr=)[Bu4ZA|p`j /:+9z>}@k y"{])ѻ7}[TĘmzr8 D6~F`% K^ztia@^?xhs(Jj,͌OYU%[5 >욠G_EU׾t 7l=s[/6IocF%dB1옜.0ZB@7\y˷\crrNJzO];il3L hμP v#7ã%KAKMʗ.}#FO}қ/>_2{}'O*=vZp o}'6mݞ;͖ #d ZeqO%#m(s'g3x*e?xp 6ٳF?} k<#_.-jW!iZQe}`&ȳE 'Kǣ6 ^*rxf+/tirl¯nPN3?+][&Y3` ,2_]2 @}SmVR}[CN6uIDATXzĀ:(o# 뽊^ _sgO; ҄S΄[;xClQ?I"ݸ*ݔF@SY444PRQ=m`y,Cdc݃а!)hEG6- m[wC\N4 t,w^wYWNue[lغ)ieM C-KA=A2QpA"rIs#"0vNnlqQP!jd l[WԶ>\7*!X(w\0rtAb}.|xϸ{=+>p_UvؕJঌp- b(A.!ΊH4 3j0yсHuUSgRPn#dgY@?o 1iחC}@cC) 8a<|r¿v>)NƬӦ;J2g IyOMJJ߹y{l:otpF`i"aԅY|hL2Ws%*y֐)ض:3Rb-sjm*h7iSC)շ{hU$oiLrAF{0S50r(50zxf70ydߤ>u/?0:v ˗o~Nػ{v*<\\W Q3軼X9aԉ"N  k谈+a0"0YKG;̽P]RNFi^ t֧㳈 Ԣ0h8$V `K*ȆF}S`%,j29&N3iʗ(rKWg :d"r-eeo۲=B"5;1 ˃"cptTS!qI2W]iaZNn FT 90sfPMQ’ P(82O֐x<7P.{`Ik,m`ӧ6-Xϝ_!S}Z?Q%*B\ؚWͰ8`^8ϕiLTIFuvL#5{9'Dmx XM%zx1#`>N0S ]F~R ~4BQuPITDd+2A.&;TX%Jx!d:- 52P A/de+Ǐ|cݿ'\wx3y{Y\QV[Z6x׮ؐCKtbI4Qa!\ $9 GL#>HTM!aE"8ȟDC6бi47*bX4D82t-stq )mbpEơ `$0yD l 7p=l5I[Fm%c`^|Pu&TJvMջJ3E yFoٴkpS#]0ّI0ʚԏDcdT$~(!@l+T;iҎ9TD:xs8}XbI;3Y8M$)VIBVF p GaK6Agr2w#,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEVB>ӳ6|͹yg ysPc}/Ssg?9s< ؋>sm/dMxMS￐7L>SD4lS|L>dQ(9YXh AB:{T6m.`3;/:S!,_a.Jb.bܜߜ'adΓd$}y erJE\K(J3SKȌg%T fmJM~Lh#f5٬2T[Sm2}u7n޽czp:7ݹ[[7o}ob|jjZ6y1~)¡m՚*#T"LyT5b> T3!@>A`?A<([/i~eSs\1cK$X LUgNO#E 3SSominlhx/boDgB2${=\Nvu5կUUUn(/X^^a҇7>|6>TVZ|SeEF$ [,٬ N}|E_ 񺺿I Z[[EggNLNVӪUL&_Pχ 0ؖ0XQ*,vTh|&g>UbIT!_󙿋%~SYz!ԔO) \Nt%d|t;;:Ic"?v96 V4Z4^Gn%IuU] u oTU `a#ȧHd*++倏2(++R/~)(gυKיr>xH6L$Obџjnn×~oVpmH86]84557A&,9I_o`A2.@o^GT3?')"P1WG!B3||MQ0o6@Obx,ŬNJ}r!+@(/+Gc;M-(!;^Z?TQcr C.qN ;1bBS[[pCn][6!H%u1S],* Tf0AJ |澾i-sո9' m3'(%9G{\,WP9\05,Uhu`|VA!h!l6٥n}Z6}#?: 8{)WBU%aP+zixCpzt1iin,h4bjlH ~\j|S-|H_Ya0gFB/ӖJRWWWMRGB%ثr 92=`\QU3oxt< ]]+j]oW+_1rmx/ު}ςp2PYʄڢPa.̠;(#j]@UUE;#߆_hin1fTUYaMXlm|ȮyB*VN,'oBQ`f>YB|>}R"ծЌ$_w\&C=nwYᯮ#}E/՗dZ [+ʧeJ-S]x52UڢEu kPQk56m+66m:G&v :{>=j׬jj{%ֈ*Bb*N**tPiy**3= Lۨbirenk3?H$5l .Gg2W b'K0k^Ps/" -C-/o>6 :G^ӿaY~Wg676h8anVڬn7fW_(52dzE\Ul97;ZV v78p8y8]^p}<\׫=~x^%|1^p{Yds #F& 2ZVU Y `lLURC۠zj0{?kinYňIky+ӟ3^R |aѾxA. =RKctQE}-|gwv+Lc?D4H(QSS,2Gv7R3SЗ9iټ,S֮}M5xkj  0mv ux @ `t 0{L @HD`瑯 סAޣ̓޳$#NA/# v AJDEծT,HhOTjm\-A2C<0G'cȠϥE @E0ğC}>^_zm$^ F B=RY%3aF$Ɂ&x5A(dFTsU)UBШW *ʧ4)ce>XQ^6nZn#L-"OgG?ۿo$z:94Ǯzsf2iVu7Lm4mY=5L5P^z ӄz2*z xXhQI@̓`.{8m$RhDX|?APDdE,<^^X>~k NQ!B<σFLS?n<2BA".?~ϐ8Hr@UF~Vj,ԈjF wf$i Ȗ ! C"i ?c7>?lkm eN.)9^!W iSt5si8-||>}!(TG>u*bsra&yL|}&:zMS_o!B4=ei `@\SKJ9_+8M= =IHG*n`gG <"{g"æ\@!)\0$}n;w <9\~7^|5 H',"Ɂ. y802@@!ऀ~/`k:Z)P1@ VZ:Prm0:@D@Ld3-hw ;d2"_a~LI1VBM>qjO9?o^[Z#bZ֦) ?{ /QǨ^0)Sj^i=#P=vA>Ʋxwe6guxwlxU5́|&4 RqPSp1;|>ٛG@?ky3=qYIٰWd2&eQǎ. ]%`q<ʨ.:&G9{zd{9GCy<<\{_N*kB^G$,)Ъ^~ӉӥW 2`m7A,6IDVN#0VQT UB2V ̈6` 7Slo1 Ij^}1cn1k?s0>|G>(RL훟ZMHq~3 mrm{Ȍ'_6+3]U}Q7d~y1x: OY?*yYAٻC< ,@=nktlPah5GOm;>^5/xovng_árOGN9' NA 1p"Q҂U#eʆRf@ *+'k^x4D}gҩp&kJLf8Xca!ڂ[z3\̅rFj `B0ڜ71ӟdG$5L~| kVb\Sjz+sJjEϠlp txwuӯ+ЩE!\n\=!^ߩ'UFN$$QiAVF11p{xx4=ET<>:V&.vA-H"ݏRs/@NeC1"hw:SMM ^®S|q!Br (6e #PH) {hQ|E t&3'^˘{v/ ? Gx<[*+eBhe/ճ}/}L}\ҧ Bz/|9N#mZvOYFgC81p,D׳kܒv:w`feUB£la|>(ܡ"#}O,4$ƃXUB!nA zD\zF4Q =^N $ߵ+g$T`bB!xu4bhQF e@L+rȀHȌ -2jZ-Vk /^YS4145PDAhМ tݞ/N˥b;[iHLc5Y;L:iNZ154H]]yu.^]U5AtOVkoab.Vw\bcyQy}.^C m}zgLz3.Dv\l'z;]돋RO ^yY$P܏Ga<G^EȽB?Džcx`z7#`ߗ!$if߿ #W_-@ƹdb}|+s×}|fm n.6 ttEۜuq+{ޗ6^ |7zpy@!㈌ tN 6="~ L >NH.Y-@v4\k1y<t(]"gDq! Y\H`.91X U~1`!U H4ym9O5t\UUü?Se^Cd p/DiF<4 ~adosL?‚ۅ`PFښDZە>}u+lY oy6<2gz2#0OQǏAzq_}$#x;Cq1~I=u{}\b!=* #9H $V-ת&FbI%:ۦ)Ч Pg-+`cy ] m" Zhx0?p^`m.E.=Ǧh~*iNM&/~55Tr!ӷ|!1ϏKrRgY|Yڷʲ>"%}b+3|uMe?ЭuR}sCj2q-+础z\[1`nOA(1 gz o. @a."Y.kjG7S'F  ޴l'#|o^H0EoI>$Gb!F<(+;ei@|6@]/67f$NcjwYW?KZVY_) g:S\#,"Fa-,>Yqs4gH6H@A,QbrS \h:AB+P9:I UAa% Lb)0 yEOXH,N">v☻PjfC "0m_]]qD"jiaˈ́ߔNO5B wcsη¼9>$8N=F`EԷӞ?^5}\>ewK_nr'1oG}3:5o;XyC0f%}:x<FhK󰾾5 M2|`s}@zWY~T``o(PW3j*<$z`_k#J)ܾWߜy >.w9Gh~2P(E:d'>޲ʪ> *ʹe6/@,Z>DF#nfpS}׋czwy/᬴j?Dj>*{cLsJ Y 39-<"jHo#Z`7k/'^+֢S7p-6-?Y2e*9!: M؄ ؒ~9q=O=}Ut''=f *sKj~L%|^/g3u0d=@ݦGM|M ۲,*Vު?N}1ܟCf"*y`&BT^1`> g$j@B $hFNmqؔHDHXD@$ բ* L(aNkl5Pv#j[[ۏm~cͧ,tP1^T-Vs=> ЭBH\ P0 K+_Y%X G25 :Ym6{}~ S/@!lf_AWlv\6A|zHuG6fZv>SkB7o^-קeY#1J 5ˉh[yil sZY@H"&dhԶV!0*&tu!6U߈*;bɀ ɀÏĘ QBFNC YkvF[[i4ſ\{Jf!49iYxl_+6?WmeP ]YLnJao 'Rӟdo//0_i;]$49ǁVTPOY~SS F+G"G>7ڷ9Bb|ʜN[uer v+Qg(;2ïOj{*zI:Tq}Vy\OQɝ^V)yz :vٹM+>y]Jo.m)}R}@_{zI_{m@$/f>->k)$3>=#)@@+1}f{l1YB f8Tda&b0֠IJAn bß.pDs4d{.s}DXl$V#UZD69AG kkuOM# q"Pack|^X7 ASMyN (s< m.}Bl[YA $GL%oeLyO5? Exn`1,KZ$[ECeqMͭ [0oӀ}|!0OJ_h+TeXUȗ;gsUj~(1%Y)k,MK$^[y=% P-[oډh(x6Lf4s{hȉDslՅHA-\R0JL)PB1@/Ak>Y3U M4$㦍BV`&nd@x p"PkDdk@: VT 1@BhYc~oS<1k hb*..X`| ||fL1z\`e~)37_5h0?lZ+ʡG" C3&8xY.lyYJ~AЧ ׳}jWq܋j?JJoTGPΧl?,>(#Z = 2v ~=~G34| …!\9 תG=$X#SgUU?P1KAT L P ] (k M`fQr"DA|uoȭ7!? 2HYRvb2QGyE"ekBвDCOSSJr)OB\s\s ƒ8n 鿧 3XK "/iKgX#b dcZÕRe! U?~/RNp{!BJq~$H8ENwc}NxF}z_zĸg^2zpFӺpP3ƈ2>zg:ҼX,뀗|\z@Si{ r(9[»`xd;= w7 XVRlx:xf+1xb<f+O>.B>F>~Ŷ,VbɎ:XNlWV쮇{a;/iM[ὋJ'na(MgIOA? "ItYAxaZ=0C 2Ah@P#3&ҮX (-NDU.#T3=zE&ɀ "PcðB >K¸Lo <+++].׍H$G?εG 8 h.`E|f+0=|,0Q[`?[ִhKƼ,M "ET_G1r-␨o@_@ճn }ۗe~.SmxyWg|[VhFC^(^Vf9zl^d:٭(uqwa(f#~X? 4!6"'ĻK@gUBhBcj`&} >`d@ ]lK2'J"ltA+@d@VL ekˆi TJDb1:Ȅ՝^p4Zz'H$`L}7s㨦APb4,?s>^ PȬ2yj*iʤ6gL?Ϡd?xkkksh+\c>/ ' }p[u^M͠f'SՂjO5cp w6邵ṝMwKީo#m :; 6hۍH`O}Ь[[ȃΟ?{n[ |+mz4kbv|>vxG3]Ͱlw+P4ŠH 9X7ϳU{)WK 9-NF gSE >ل B ̍M6A0YoD2"=\K46T֘Hl@TH"f3\i$Kn[5(/X@ |!Oh `L==|N|?<ߥR\7SۻeS\aBI8[%QV*/{A=N>G}dۀ75yx#Q?㳹>۶'6151v"Fdf~(U;Y_7U0G4  |9{%5·ޭoz&Y$X|wo7IA3xVV6xf{< @0U:aN~+vbt!vaKvuj;񾝝ܝ:;0|G';wc!:}u:kZ,E @|o-b 9X}Ha;<&Xɀ=R((*5as<@h "¦}ly޺^.{0KFҁ|vr?3k1VrUxcٞ~~mvb%hG=Nv"#ϗq^ : S Y 1}ihЂU6H 7`$$`-;R qXw g3uv^3L(ovl"Ù& f9mL4NxU@mhD8@0W'<$![ߔS$" )BJc5"w Z xjkj=ϮĿ"Y5APh`1'*X(P.B[< aQydG F>Cq߬-=4MN&6dLɯ R}<Qy~ le o[ oY'@3D },z;|43>'fpshNy?=57*\1 ûavBkd o"cݛ F$<}h't7l9]m\{>¡Oȭ!8qa8~wNPe8q(3?C1(1 8 ۮG$Ggaaxcax0|l^<: X{hoVH0ktr0!!v <.=XbxXd⹝3v хUeH #)X?`V$-f<6!hDo@o``zgJ.1;+b:2`޾/v57xv`/.H> w\>xz[|}=yfos?e{#G/鄷ࣚ>]zsmkz(|X5*j8\Kpl3 8y tߜL'`׍qq}}8]G-&`qtv^=5O'aqX{d V8H1 b:yqJ_o Ss(s)Żasٝxgw c$D 좊A7{ht```6$m9&#lu`-5D "!8϶֫pl )V&4rqYɀd"dzh[mrR(^մ:RDEEUYElZ>1 ̓D@k 9Gk0gΔi̻k$M{jPW|b@{)S?ռ@T׃~Egϲ}-|c|=E)}f=6h,k<-\~_ ~#;]/A$X>G`B'5Jވ_oǠs|yF:] ae1(C)=87V$K܃q8uo `6{>M 878`>/05'''`~IXoxt; |8>Squcq|q$d>n_g%b'0\fC)F%-U%T\Uv#j8t>1:.LHP >WPE q!VWr$ y2< 8&h^|oPS"=kVv0i>tuO&F#fԌiY^?W^QodFُY(N~ |_ħ(eƯ FD t]qiחHu\:2Ⓧ.e6O<@>OV*W^_! 7Il1|P7q^C70{k#aF s?ό`>/º#eY̳sI Ubh/X}iXDgE9GKcvQ>)>D,ϱl$prnV#ch {Fv"쥐z~X{4u#!X`6xH+xF o< \2^} N#g%Vt 65Zm9@"`O'P#z[F/O 7RaZE?6$ M ^4⠹M`6*_! y^U^ᑤN͔<5l ) fOO%Yju{7NY}?fc"0w9(;3~cGYc~}^/ak?~|mP3rɟAxr[+,j#o!ާvX 6E{Øk#x/ Ö쏏 C@ŌueIȈ%3x اtbtPG|);1 Xz$ 1)<|QG:ZqB"q c&WQCܞ#[vsRD{`d>FVDBp @'=ԁvVx#̭Í jp I\\,f D >߀f:6*jVm`bhPrO[FZvOBϨ.:~1- H@jUm@N*Q$XQ^>vEuDg4WdC(Q|[sSkŸ~_ZXs!j`u>2SR86e|%~rìTrQ j6GV\.n?^Ȳ}*=x0wz=IO>y3`GЯ怿ڏwr]y,r/<_ 㫯,oQ'og9e0s G`~ WO q^:"sLv3&lgg401bXǔ8J %NU"WǮ:1_g_;*XJ:Ue( 9죪 D1mRxV%r[ v)a !$l,Hz`͡n.XwgF+[G. BP?M.Td 5Vi$ j9AmPl$d154j21`e ~>)FeK)HjreK,kX@`q}C|r)h6b|JKf+PGf~'Wg>kյKP/B)˗Pe޽2`;gWo6Ѽ,.RwJ#!8G}URv9"b YGM`#=E^lY|g3\ˮT**;G=q*x1V 8 6'>5m3ӀZkգ`rÌCj lH )*O! 74߸i"0|`-NH@TO6X6zg@ICSj'(@IJ {}ZO=4BϚq_mӦͿ,[ J_z-_{v;9 Ą~ Z_DzF{)#} ½[5Ol}Q%gߞo Ѳ~ ' ?:oj?-_Pǿ_L#|ІY~;s#ǼU{{0Ec&8|v}cӟ6 Onxz;'Xf4eOO^/ɨf9OovH堿cb`?!^`H&cT񢄯1h y3<$9uxp1q˗1x*LkScÇSt<^_HƏ: ޟg9xu,>kYp5 e\+H"^%$ /,"D% Q9X)*Z~Z@-FQi{y`^>t(NV22#hW kaWDeC\V_ßn a_5e2+5̕${yLC 6Y>QzST˞JecVSW"دYg)34/"ȿ()xZ)“I$ld= oJ"SL"Owxlx.x}e<Dl}8 JQom,&q+;OJ`JD~޿㽻$<4# ofA6!AkprpsRj%DVd@Wm!,7$@ ,'2p` >kHxQ!돷a!8BUz$qVzNZu琀iKfG@pA [ 봶 "Z^%mSo T@%J'ANԀj C˛oJc39s%jc^rYy I9qxIkMN}C fOnB6S/T$S|Z?^,S8 ,?ciϟKsS)R} $|- ?'aGڍ  x~ tk޸c#D`ƫH (89H"`#U(]kƯmnq $[nc >Ճ"ۑ,e|v'aw汳l)$ i؆$a J'|ĀD .GR s/)(6RŐZu` 16'+J`U Wh' t޹' 2w`=<#łr|P!>m ᰲotXׯ [[ltj0" j@5#A(>)PDuUUٖH4BsB yj)?.]!X(1~9 |}#c+kGMYq776[K+k%%rcoa{4C4Z9hXƬg t#^8Z-肤 17d ASO1_{3_~M`}}#PflJw(Gb;^3ji//f3:˙#bOr2)砟RL!`ur^:`? /]O+@q@^Ǯ?$ /#P_MXO=ix_B6\2y7]U]kq׮dylD F"H,dĀ$SxLצ$`0rddx*f`P$^@d`hhb$q4 z`$,!ef~!G`Q$zt#QWNh 'ZXU` gcϴgx2"2uC! f(;1 \TGA>-P\ D J:ڣL T ,J]XhkL p>-b ~̏廐B-(īAKj_I%JJs=隚qObzҵ0kOw E I?Y? J>&C* ~5i zb3S/?K io|L֯LՍ fң :`nzh-/?2S;=a8FxY_󗨥} (3?g,O1_u"_HIXA|xxQ_ WR"<>Ϻs88߄_D *f깼}GP\s%ȸݾ߷DqK:ixet+hi4fS<'*&a:8n C ciyȠ5IG#\WT]@θ6%;Z~mm?:ce)~]@`]ɗbO U:9c6| O2ef?%_h4g.";'ܱYyJDc5^8/}W o >Y%=b%/Smc{V8irQ2cVgdqz VHsIXubA"௻28'/^IKgg9o,uu8UDxA=w1~Y|=oS| | AN6_DAtk/PN=$'~)|`W%I/HJ!1bA` ;@T )"ZLSpM!B`8:pk 2H D $~0D` V$"0 ;ƫ/WNvRhӈc ZUnV2b+eXP4aGдUB@mHp qV E%|hZ@jjo62([bT]J@S`K]}c"?WBGg.O,Z4|WҦoKV.p8aw+w&~1-\>VGLrhOlįL(S_z<:?cƬ&c>2EiT e ')xJ?<_VzV<~+s[{a0Yv̋Y#sJ*|&;ca !/;g00_՗&qqXJ$WHwq '<;&T]? P8m"w[A'X~B<xs"p6UWO"8т A:v >F"lh*gl q=M@H &ҡgWJ5@ud KmdV xpm\\,ykK0U*+=h,kwL BkMyd‹E棑{ЧMG 7/O0ӈew+MfK{Ps׷_ޮ|+^nia*rxx?njA(/e^?fބFFWq6sL~կ?d\C4zz@e~Q=qO"SdK❴ Vu0?4I3L䬾tS(O|ŋQKL))+M2b Xug_"B K`%çU7l~k~vnr0|/~wxCq$7G8vCg<Î1Σx'~IuuX^?+K~R?=sޥ{ W7lndKx%`~Xu6 12yw̜@1_|H/=c ~ &O"OXyx IIXs1kM ,{*ݫY=J7({ z vc{o#h}N!NaS|00_I8=_(ZGߜ@d) ]fcUIOSQUY*l3ߐ*2q:SɿQ*7@D{9' {(wK~|bj֟tߘ7 geF |}8h~ y+Wd?~a!xf0 wMAA_31_|Xd#/9SAs 93OFvvAUTN ,M fH`F3Z"D`GF`!x |@/nxt' r"l`n>sk Dr*@@":}ZU`iи`V\H J@:.h-bi$ ڀҜ]555]@h姧ƫMc,igp4`.2¢J|*!s9ߖ\vJ'>2_e*5`0#Fg %я\@ _~P(z>T'7|_*=11f>! 2y5g>;U`'n"6i[oŬ3udJN}ԏn<)'w>˞{^]sH6h~k )Nj)XJ"O3,ƹq  H?_ݿ!yTCݿ/%اXV_f2gO?{yEK<`\L5RTa`auJ0Gj(RpXc|\;EݟfQM"*ת2pv*ICe C.b\ p2DNrb8t=``O)IB :@mT-@$$1R]VA޾02@ h@FXl,=Dࠨ88:̉~fgi$g@2+5@:.eԂ50uPu4 #>>2&غa74;af"[ )*YU]$q}"Id&9!PlTS 0?f`έϷJ=TKSK~kOB@xV!$Ę&.b|41 }_%^_10Ql{c xm/=6ϚX7?7n |~XI[ s;Cߓپ:/zx;ϞY> V~7 _oe={=C`OE^)ٟL>@3gKSpBTV%J:p'h7IedqVt~ ~oO\NM)5u 3m[71>fk3H2p Ç5Y$&YVM!%*x+t)IaP+z7l-:xf. fI8$ A(d`CNC2U7^ :X- eDd?^x ]V$- !L0፧@9PV"dՀV}Z ܔ_`"WamR wˠKjfl pmn%tյqAG@,@P(t8>W_o (BTHT.B|0RӌϗI'=I3i2%(Ôp/jkk~25ЈӋ}, %FQoe/>goTRw ~ +cl[>qyb~aQ}I9Jwс l_K)X|2 NM"Nâ3tL1|ثe-JI_f{DϞ_fGK4W2y +E^3s~"oR$ܱ%= ,;&s:'0ƕůsv),(};}ǤI` JbՈe"\ 18U!HU +UjOx}ekl[O13""GH1DX@ k B< `U1E :NVjD`DSA3Ha#O0Vl 6 @ {V?0-0ň_T|`D 0n$+&p m\Ы ^ê@V~ʄ@YHD,;hݟ4s%(B(Y^'zPPdo>Y.iLߞ*j Mp˯}ܧ\1_Tl/`GOh 'GKL Rׯ8a=RK. ~S$}xA3 N<n~Z:?2g>eپ_+䨞/V@fN 蟜d)#/>_`ύt= Y>WS~~}O<}RH2,'%)$$hRvهI(uQL@F{EGTyBG~>a-,7dFj*TRyg*ܣcP$5.b$ A=on2H؈dYPՀZka\".cH(tT!-"T B&"׳&HȝH#UK,lo3 >*eS 8(#8cFNDu$v¦#8 bAZBDkG%&!QFD[ @H j\O 42 l@XsdD̃g\3 0,bA{lX8y*G`k j"yZߟϲbGg]ⳐHyzL?fuk2S ?=} TOA}= ߾h{v+qx<' ='geYXOfDf/֟RTy;Ϡ9s,C/wO@ P! P@܂GkO@#`Q8v{o0?lak`TSkVy(`0 2J1ɫ w$qS4[vQ1")ܰ^;3!8L6#t 2@co~ȫ̜\ g[SlĐ Xxe$~iFWf`f4&L0Au@Dk`XqW?DD哃H3Ha9" '> w wxEgX8dnUY7T j QA6*-Ҧi¥P C.*籴YS=W _B]Wl[{@`s`FAnؓ6}k/fJ~+ 鮬LJbO-\r1G38 |S%n3F}_Eߨ?eqρ=7g‹[1흰tw6?;gC_1ꢾ%~&sOlH*OSǓ̢si3;kf8 sb sl}H+e>J7j1'7k%r==e. q, 1,<ū;; X mS "` pb,юG{`PĐDB<!z >|TM6e!Q9rC7>'9P )gd 8)d#AJpBΈ: "lP\<ȈOɂ 'u55 2Z*hA"4Aq8D`!N?̉cHNp"*g7hOs}e$O7{`W9&@_0Ԑc #üW WZ VgLTdK@l裂  F|>x[ ( z||l -k.JzϥM[O)%O`6\_O1W3SӢ/faA+{\aےhoGvaٞ>XoŘ?k1[ئl?#2}>Fd8,S$9> ~_O9G6/ wv:p3#w9sbԎeRy/צ0S=;tO$@H2Je@|^|ڜ~H =PH &# w~4IDATH-;MF A-! 4Ӫu2K QC9Q@uHHRjU4"`bVB"P$ |,&D{s  `D@TV!Xst !x0?DL~6'"oicNr <jF/v 62('9#哑^ڀLFS)8' W ӔpKH@t},3$rl5h $S<[ embԿ+n؛('2GoÔ₿Δ6ӏfolH_?Z;( g#~bPPN?>0X WS AgjaV{Z^'v`vŲe{a2̮1 &{FoKP} IIx8Sl)d_߼}=Y.2}=4?)|Ŕr>S wpg *}O{ ֜,ǰrW opZ7#jAAxpR3{{XE YPzAm _9`$=HmG"@Bfx7QVдI^ qAS@0+au Ǵ)%t|PuPZ P-sM<9kT H# 4Ͳfx~+͏K XXa 2?W8 ?i'i4GNgٌsGÑ2X>OTs?Z .O0T7%}#~2WD~̳ WZ2Q;eo o;` Ri%REuW}E.՝>2롹'SH$NL)$KNcg;*SOnv>*AN=Lscrns}|e)&$$+Kůd>=y8e,j-.=, yyX=2s:I;ٽ|=q U3,;DXKR0´5&nCR0^$\G4ܡvM+O425b*3Jb޾͵xv%'1F'>i|S4i /IQ L?pĆz2}ӥi(˯BЯBY~i( .>?zB b<\ w#0 ]}vO3/w_( Pݐ!q,"2G *#1@ 6w0f\x"DXe"eHQ#'j #7^xPNC"42pǑeZR7@ze1 *DR<(}H8&hA)E r"(2_".1—Dk`UFBXAÜ;> / g# 7l>߁D 6 }lb'>ir]6 ZaV PI@ PHZFeBJe+(Ouulsc{ā%s( (bͅd +*rGYMavsA$eIMO_@CCOY2ַGc9۴X硃>N#@#Q0 -6C1"saщ;(G{TQӢ8^ ]=ǡcZ lx1$HNF|(x0\! >`?4+?'Y<.wBdl?TP' $TT9~YU kpZ7%#'!EV_N1 J{ศ! %:ŝ7^/E"pR'4ĂJ1 x(rz^=;! M"oM M0wA ZB$N 3 7 fk (̏mt. VAQ@@-Zh ~bP P NgE4/UB9e#\0S`A. bW(R!(R h?2z?]fn uT0~j H2* Z'@~^Z[owyM#~!'ANnɟ|m/WdSYM7 7r퀧v;{,'3BԿ1_~" NRdX_n[ƀȸgyp.^{i;{w5MuE"4/3\-9ۑҜ@  * #[1x " _1; `?SXPAH4 B#|K t wvFP^}Y=FX`v(ף,7G8DvhbHI7 IID11:uArFIkt Tj$؅d` 0!1NH )@UYA " F`$XyuS#vvU6_j@'l>N1-_dk-YRn&;B`r-h (B4]Kf: ^dL$5BX@@n$lDVJ?\h|L !rcV6^,}MhҴҔbu `F`ghgmm̞Ak|V>fq.o&.ߔ^ { {aI_M]!S_Q_ɏ'?H #KY+YɿՇoD" }8N440on Ak0ѭFPrl{`m :mlGҀЇ ,sH.u"6  Cm__2QTG('0oꢬs;u/q=x{if%ozo'>b%v3n+?{y?eCzcֿT?f?m[pO~Sn`xz502zD=B @~!oqQ$ cE;=IN2R@Tvchd  )dmH $!E<*#6֢!Bɀ@- Pe 27)xDB & n49rT8[=?U*|[miE"K6],8M>5g,HHXTN'Ga.|BIՀ\$T  ZsO@D1M 8@M a#LE@. ndt\&T]#k1r6"XET,++:6_8'S`eJbPh99OӠBxa \YBnQE5K}˜>6|/]?#͖'18i:4B#~rOa?ou6DžЏ'4#Lwݓ,M-;m>xnyPӢgL}Gt৬,F?eKrc&t5UC ^ǁCv_('?ul9 /߱O/]Y@&'WxB8C0xoв} C'P$@lYuS+wfD&2x|l=@pxw`v 3'VgkNZs ?WmEGn4``"'8aIc!%rt AA!8a 8A d`l*;:f! "1nF DubZBm*-&UY`mLSeCĐ>+i&Ep*(ؚcy{`XeU "@AvDkBXk>>]&C,[} [ 9  ]vj9Z:*UR(e%@jxȪv-$O:'J,lD{G3&XlVDAc}"N Pٿӓ3%|j[Qdռ/3+f/a}/qo\~|\,OB?0>T^̰r?(kUZlۘL| OmE'd {1ʖ0e{D_[c?)WKxIXY΀? 0?e|/ot|b/R`%'I;OtB8 r3W>3$= ^}g^fe[Tܗc6,Ĝ"c'PfMNaq4cȣ{3ڛ 7ma!$sNHPJ!:!p:$@BPBJpB@BRŀU  A(6`bGb*IiRH  B06`< ãiށt$SDۀ.<1FI-M7@BHB XU@#tc+ pOUd-t۷xkLN"p@@YSN CK|b@ GAj :GOQ5`I qI@l(-o@U(iZ X5@[*$[f~:E$@1 @>!@-NJKsT 3P+EBRmDP$r]+S6k\ai@I^0X |Ob JsΧLGMσ9mY/O ?kb=no?~1׋~׭sK_'?7ɲ~BQ?;U8>E;I'o_я?GZCc OfY~^ϰ%fEBV^D?d_ JWIاd"Y{'>Vΰl_?=8l3~P IzN0zfܝ CLD#tz+oibj{WOOf^q'@u eޢUy ?//R5v~޸[." 8" LK}jK@ >** Pp@:ؒRJr1"(ZژCjpɅP up>[lLlU翐*£TPl"i|(͖ʗy3qmƿ\U񞿝)\knBB 'i/?"F~A%:"wsJmxbfp1Ѿ.xbk/<3}!I~s^@]?1'ߊiݯD_}c)xb^GrM/oW},%_|L~GY >LeG!gI37m]I] wm` -_ )D"PA#qB'H,#gU DE, k1޼@5 uFN>YlfBxX*WbՀ5&ᅓata޼[.jۑ`v ҆ A 6JYVA[~IX(U}XJa a(cj%=wqrR (C׈-FYs=ǹ_bIieJL fg&ϵ5̿3Çv/7*2+Q?LFh<0߯د7A?+04 w>k<x vUB'G$g8SFrgTO_͢,XcS=E%GcpOnڍ䠁WDL'Mxm̬I \^A hd@Wd@'~.I@@ :+JQH4!!IV 'c/ SѓI7S`jO 8ă>AI1IbrVH32@FCwY=@d{/&:O@=pCL 0"@viqP[` Z>@%ȉ3:մIXw|Il8;/ ! 臷.[` p&luCE ɒܖ$I@HX{_ZG_L8}[n9!5.PHs dri2H4GF(D̊O@I{Ŗ.gB03e96 3_s8XR_]Oe;n?a癿\CWʪ b58S_e?wҳ ]x&$]jwhOg(ߓS"?c< 짬f/MªKiXeoPCd{)OaiT_IC? I %npbB$ğ_~"\'Amdˣ ALv2żӉ١>f׊ 'p_eiP"1 }PQSqIڐ 4MʀW uB+/T|pR(`+G8}8:9pHn%$"N \oӾ2}tP p̒aD`/|l0oQԫkO2m3ax㢨\ m<׆{P@]B`⏋ M( us+#-"J%$VW$Z%@r Ptxuh_ tob= o{EŮF3X߿̞2#]Wɏ+`mKe4wO.J 3~W=OX0n',3q%W_ZveYoOO=7xv{چ࿵ <9Nj}~uM/2ˎ+ Mj5/'a%O)$ۊxLdgʸe׫u,*׀ 6Bx 7 Ҙ  a!x4 Џ@o( :'wD?'/N,y )%W=F= f~.&FFL1~tem݌$ׯc-hQ+`IDFMݦiH<(ÃiOC z35F-H|ƠYEt#D8!dU덭c U-S*PUL*Qdd :@ +5*DNJ2>HS-a3&>PPL=bP[M wM <- xvn6! r [O7iOHŁApfA/@eBa)΁w-$qKhLR lp9#ʈ 7 I(Q8()sNb=]CXcU%#澁k`/>? G_(?Up&? .x^(sOON?$ȉyB?*3aXsي࿵xbk;<OnǬɬ_,yN1Y,g_ %4L8/_2w4R@PbS.~W"p76V~/ }i PhS2{d&CbdE4"sO>} 6f6%f)(/FP^.^.B/ʢJ~5$4y# B]Ϣɀ$ j42 ܼ2 E+-h!M=PU "I$\7khIV@ 12P0ۻ I88Flvt\ S֙„l(llb0=Pp֥(D*4>HS>P5dzu!>jUA?v E뇯Հբ + A?u'Q|iIo uCTyFqTAF aY IT5wB j-:bD*MFE%鬨^c̶7G \$</(f<{tʔOg̿ %`Ϗñ6+_; u ^zr%G[_'xgHvN46? A3~S;0bOB,%![y?S j_a[(!?DSJ?0ැ /d0π5| S)I 1 hy(7BK;C^2fx>ey*BjK.S<×Y=~yULDt(BekeU(<:C Pˉj$5HA8"V-FV@JXk@.H"-S+iD3%PuV@%|ܰ.14и$2Ɏ aoM]qHVBp71ApxTTzb!,テY Al$ ;JS|ZAxhՀ\mk Bp4Z/gXK`AxJs4._=ɧ޽ "u>@M0d64:Ή AbU$R)ZcR0XD-"@ b yN{B(0ANLc4-Ul &NJU%l0$`I@?h \@ ok=ʬ Ss!Ӡ&fzdPVaM lL+PUa P)6 k@(/O*_((_X> g̛3/ԉս Y7G=My-cL.~˫P/mV{#W+_YV=+y"?$Lܢf|ߛ3 ُy [_|/JqYWOâ ܎F[00zO5fK"?*?Y_Lū_J+r?]Ig<z|5:J }4cmgSC1<$| ͑Ӧ:`7@?65"x5f2~jgߨ`^ݳ _~أ@a +dXV )p^ Dە <ԕ,|3>`[I7D T#`$@# 0ZPNpT$P]U"I|A!-Pz^@'R@HYW/M.OS/@1j'9Vm'H#G YjD jPOCҡۺg-Zw0kx5cA>E~YT!d-%p~6]7/ ۗ+HAPx '`(^xVA"*$HhA5) 2  k >1Lx-Oy~_:{ay% /]YUf%1IMsL4]9|)X~0қ f4"5MAy $  qśơ1PA~#:1wvLIاfj:Oπ_~nyLfAy#1+1}6DOOfk{(/ߞ7`˽Ix^6M7'a<#NzNU&D D@$V  0"wiNЈ@Kf NNqݑ63A^@$=H3GW۔DFy D-HIs#?-t[=P Tm"x(G$R8Mq N޾$tgᵓD# xzf V0q`' ֫$`Z$dp ?A2 xVDD4rmH=$`k8#! 6`.\2Zas1"us|?30cQ?c`N믞S`_ʖ|?0S8miaZ3n-)c~J?$yߕ1fȾdCLhe6+0+gv3{& ৒?5Ǭ M H^?M-eCl6i M?d3ThSZo!Ok2xѦ0Z<70C0>-%톬֪?蟞s%3A,,JCpa? :c߼ijxg^ 4l1H T,ss5'lBMEBJ@P@a@[u:X7 bvUbw@@HV< M@=Z7PǸ`m3b_7+7&MLiH毬~pӯݞJh_i0!}a;5k__!g[xٿQղP:Ӱf?wNG#~]cfn~KHwX_࿊Cg2J?/]l~.aӕ&BuXy.h$|"' UB; ,40cP׌YEkSP3 d:-uLղC,㧒?х3e#1dF3U>O-f<2XG=;YR'<+{eɟzܟf`5f.M'`=+ȳO*f*[ M\/dtA~ "W3NeXi0L??DP@l[NbO?1H4 /~d/_^~f_-_Uˑ=G/UA"A|{ o{tÖ`ٵAgE9S$L$ C%^( 1ş(Ӕ AGJ$ 7nHC",^}Hş$"0c5ý 2$P /)BT@ FDj4ϙ|$->[>$\'ݰէVh$i(sm Z>=!w@i=HjDఘ ;woJA1.HSbrO 83_͗Дu/`0 :6mf:}0: 6A+`H~En#A0P`iAJWjehZ" _wF؜y]L#E|競4SViȔ~JѮTL˟ O2fVnb nd0 b$6-ʔ`H>|&CR?Z17Oá ›jkGWt?ZJA.rFC/1Fu#RXQ2GL\',Kv5sZٝH?k%}k%}1fg20r듰FȈ pEOOn`_dZY_DM2VIN2ৱ>Zß- i9eݲgů0g,q,ைH_ɻMpN3 ^> hs$aOU Nۓp7 I7EVvCs8tCCxAύQ?<pn6} !#]bHb|`@9@$"L(܊UnIZX{iae^F|9p琀镀Z-Ы~neUb9<:z|r,Yk N`6+M( *D@UewJ[}W4[RX8 R&k mAea]>.HiӼ%@SDV5'2suu޹֏D QA eBKߔ1nl7VA?@I84M@8IFc@HmD kv5SLfjssL&ad`~\)&7}?#o,[Ca#ɿe?Y9/[Vl˿e=˶|`]+\9 fz{g:09G0@L`D szU>g0\L gZj՟@~{MMI kRCy'= y>Oߵo8я&q+Ӌe^6 GOC4@tb9>⧁Eտ ^+9j.VH^U?ULBZO~J5#r܏d xAK|6MG4'HuE9}jm CdlE,oTVQ&.7B"W-Q ~67Gd!Bzt/+AxhLó9+ȝ' {Mx!ƪ,/mHrDG&a+eaA|v~|Afg b`= +0vym#TT: =p^ϝd{wZdUVMA:0 Љ@c'L2N5150bV 3 ɀtǫa4P>A`\R#A"@EcEヤQ=+G@6?`@D[@-jdTuJ$r!" Z4.X' <%#)j ؇v\9O>(pϐ-?c 'E /_KC# ?8&#O"$Sfcl?QSloWx2^$BHB᪟f![!Wzpt4v&o`zx4CU ^u>G uc gW~;+_>j3ӐG )]k!j>(=ܽx(+ƕ=#C+w*)ebe*>T8W<1>Z _X\htZZۡO|#׸ Ε+Hq$PYA@$>[("7n&0  "tj 6؈2N$m$`<|4„ƓAT+*`A1F8DpkD8\]FAE pF)5^S x8. U&(b0I37k컽ogáY<H$`1s%YHn []Hn @@H$v@m` hAmZd@=?K;p%I-O)1D~2OLڷ{>ޡ׆䓀~ds ǿ45€Bsmfߺeȏu_ԇ#߯UHn. !x$L?>ip7V%>TsկI{ 5IG"`@s_VU0QURVQ܏N_ā*B!@Ԭ~||xq%o3! ~: k~|M@#W?EfVŲ˟<>G@ ل2^dU\n]NgT>90*|Z> SV4WoQ$Ãzx$nlI^1I빳].HI&$u ]У 4L2 U?U f1vA!+ɟ>#0+5&Dj %5.ȩ©~x,| @S"P]@D@$@ypSRlFAp;@?& v@<^XJ"![3ei$JfmP`!mfA|G8#VDcm~f&d=۟eGE%<͏~;'=8 %?(!7G 3X?&gu؛*@eS{8O<߮~T=H`â?(Od"DWSk0N_<^g ~L_S3ߠ護XCb{ib(<{<'X^,7 }*]"@p|I v99&[|1?ϋfvPH]PU]UiҪ(t ,r{ If D3DV"PK@~ J h J8*Pj`7 #XCjM d)mt{I51";i"$V'm6[7 ^󅚷 ;1ȱjN ]xE%xT|k@WnH2$P (xyCÈNESJ"93 E)SRb

]W%Ma;_\O{pf7ȯ]︚]WWͬ?J'\3Ƚ'VYs?fTA `SVf?ɏG?@~?2碔bf ^͡_+97{Ӝ헒aͬ} o퍃o ._ Q aſ>$ =ExU]Iץ^M5o뵙~r+`@UkĀjX 9Bhm* ("@ Y X\.P2?XF-1)P *"@mEI6cm L@$@AB1@XM5@$Q4`?i0 <"M>5r " Z?,"?`PN B&&*7@o L\, %}g8=p sVAZ-x/ $$pF c໙& e;$׷ qE+`vkx-kP'x;hU S{{`ddƶxN -_&Fom<G #G3N6/]V!S/\to_?g  $@`@8JT'FCwtJVdI@ϔ%^uf;UI@5]%, .дGӢ+_P;!5@97@ՖA{K6sRk<!|NETz 9H@?~Ml2JQCt*U?G]}x&1_ Џտ2~??'4NT>U`l ufwyyY[+^'0g?)ª*"tWT]WJp RQ7VT[@'?, pI"`!^Xd $`;"`뾁;zdh $E^(XL~$mݦAP$ .qJ ))%2 (M녋pV-W §9 `N˄80H;+NYwY7x$[([$`غ@B X`H@{IX )զMpțT!As2@477~tIT]fv}`plTrb_Otrw~;hyZ?W9-<=vY_2ttˠ!3Yn+OJ O`>?',1?-~@Wþ/SE@J2ΗۚOO#'\M~#ǡk d"U܂ڥ>0{/b__& =؇I+lpo\Ӹ5K{j}bqARQC 2E2 [>guvߺ7A߮*p/IV 0>3,Vb^B* @/,R+{/o R-IIj("@mA$Il$`D#vB ЈN'{IRd {M@`POm$I(xx`イAPSŊabXS^( #PƄ'mv+ו'` %ݜ)8;$o${U!& P˃:x`k ȿլLj2I*U5?gTJN L q[/U+`;Vm9 ;D&X;H ,w~rI79h%g^_3Ÿx7oT} ȬOJpR?b5/܎<yf{zf%yf}jDW |ʤ_ǽ~`kSViƟ?:M~_y s3iqf?}$g;?-IUWq'VwI?[l:V"3;gmG8vA~ffoei_TZEPXVU %ݰ7o<W?H@ n3& hSj _@ d%Tm`%Dg]4̂%0tvOXրIl$J PG Q~@8&ĥ "9)$Cw и%M ܑ$RP0t@9p.7U:h9bB"!p;&yV GJ,$PT p8o7n@'Z1'@ft`ji-L SSʹ#.ɵ*$Muvϑ'? 3vS2n zj`U }'?ƃϘ3HK7w ;KKC[e'Wdt~t<EWA?_&R$F? ^/^ ӧ BPIP.I!+z˜Io0Y/~я$8`K=ZFƦHߤuT@?1 ɟ3I2ud?5ާe0Kg직\[Y*zaM(^{"{aAU )V貽73*9 Y~qabq &`rY$ZOQd[UuXW@PIMT:^Idb^˝I\$"FV%@ hnI@20 I4MIF&` Ⓜ Sj|П >m ECKq$(4)@APTfn1c ("Gu8۰"́ې] 0HyA^{J{pX#0aAM=I{X 73TPД $@dfe $l6+PI~X`xi[L@}dwno7C9H߂.WiuaòѨKYis{ĸ ^m܏{RD_f%c^g (IGh_USGn^͉ux^N LUt+X%fcc7#qSU0߻7Q_]z[TKu~~OQjG7X+^.<}{tjxZ:w" yyLgG18Xɯ, L-"# , XL_LN28$%@w"䨠J]'(4hBa. !` JT`ГD; & ؇$%8|IsK &KZ 1 9`c et[92Aq^=T&[R`Xg(jn+JFX vEvcX+~O?OLdd3ȯY_njrN'is*鿝@']3R7_t?k?EꝚ_ oA eT^B@k{) }6`lfet"N3&saV#<.Bte 7b0uZW`ri sazZ(H y  Lj jN,@PVwJp^FL(5-I@A D@T[ wjFf$@+ DHFF4 v+sIt,TA=RX2bym62-HH ЂumT'=4&XWĄ (0<1PNDpW# x-A4<З1 ([r0OI8V@ʸ`5i}pKKA_ lRԁ BJ~;򗢾ymo@FW[wՋ?c/FߩY/_fK m?O^UmY*1 23Qxi$N-?ϕMx93ƕ$E3[}.i9N'|`Q;7c݋O q[d_dl/\xY)Wq?u_~'Lk? րU?YWTSx HN5Y畼3@ޟcxz{Z~nZB(@?7==3%_Z?09 ( G34cK0 ~~EYZ@mi(^i91(j o,௷T*hDܒza a]3y5kb&ok:[Q})!h+){2ۛwp7{X~ 2җeSF/+HJsMa(0长C~Yfȏc!I~&w%YE;KxC~nn@4VSXQZd{"S1;̚OEMZXu<03xH<:#+UNz:4Z, "y:#H ZڥP%$Pz _2$]CL/H"p87HJ,DTH#&4o@ tiffT$`# $@m; CTO t [ԁBBd5Z#UA 8Z(8KO C p#`$" 8\b!n EhJS  a`(F!ހJ$2 Жu cD S`ﲘ 蒦@ a3@N tɤ@g%=c#$TXIKƻzJU;e 4}m1K:ҎfOFK9?=WEοkoCCÊe__ԬUd1Mb֟A7OW:dlC@Ofo:4r8sgCQx%?$+h)[_\%\Kޏ$<-Oz1vܲ0DfG7_Us'߭z|ۚǦ?&\h?G֛_MMj/Yx<7`pAy3L1< Oj%"15έ:FfVq臛N8QJJ5r2IfH X?SS|K*`0W՜> &ʙO&@SPPaI-W6Rs<C^Q# (iD HʑTȖ@e $@I$HAM./@o J9@IN!-hGPlˆ,)LB 趑"X3 o _@bIx0 ]% Fef"kF^@'FDIL%b %@^PA*:h!*サV@ J bc);( y/}9mH*d twa?ׄHSX HqߌoQ[+.6ᓏ!i x9ax\!?jxL7*s{6"[oč1ӟӟ$@'od?'po?1NMvy6ZD>[ RX]V5i |L\8~(<P0<AG8 ЧVL!E$0 UhkHnJf7d`~|9«_|]o2e$)DARY K l(b`'69H ; r̯" x`f‡=[Pd!M`5 &P-Z1%PGT$g!: [:$ # H"r|h n $j0);` } 5ËjT}fz T@(*&.$5`%@JRb ]o 7w0 6I$x^GcI 9aLhq)ȥAT z/^ P$ gc!d ߮OFmA}&O HOOUO +Idϫ}Eߟ7IǿgO|2~- ϟ|9fS )Q3oaXڄW~2M$ve>fL?V>a?3^b(|u[wIɟn>7jcy)3 kLmI /Lc1@&2$VTXяA(Ha$J_T!I}| 66 fapyl];|RHzY_$2G^۞0DV6?0Ž ~IXD@OPB @e ੨Nѿ@ @/ R DPPay=d8RI/㬦<$r 롰^4J@-2 EHPc  '@SPg@Jhhj[yJ27 mDN綾R|"3`$F @ba9.v Pz2w E#@$fr1&ئeZId`o̧|H&fNR'H9IY$/؀w=AϟwHOwHZa`xDfI=.X냷a V~8D@PPWW|Or O`W>Eϧv2e@ڃ6ӿQPw} qSwSK~ol3_lr0-JǦ? h5w#}/QxS3V}dVk=Z>{ TF߽G^Ќ?9{K?o07U/kx3#iWf~T%e7$@3T_[Ĩ9\+M)\i__vq޼7}<6wt&fabf<^ oGGal|>&DT0J#<DaN׷Cv$ᙊ_?1wwB 4pHE1߯1PAj~t PsK ߧvxU@v .3MM B$ EC HI hNL5 `J@F$0܏@M 놓D t`5&G w/`ƦDpb &!0,́.5&赎 6D zQ\\tP7pm :RzJX$OAc%` %kAR5Ǿ{+ )& qkR ~|94HTGYU9H<`p1p%BteϚbi?/!73~!~2:}蜨Uiȟ'[Jrɏk}^3$ ;HGMgꟇ?ZbP8 ~*T!H(Qpvjf\L03ĪD}VtIޯ@_'J?0H*@f&ZȧAep^* Mx+'w!F(*iJ2Ho@AZJ@DAL4"`T@33$ࠤABjp%3zS.`d-A "4&z2! ;4ЮfMAD$=H81 "18$p /! x ڄ=bV*]#H{DP[2( WzWxmvPHPt*?@ 2̥A-6vH Z5iY\g[~L$[L6w7[$ n?2@q危xi3#=n~C[[͑f%H@067Ն?5bȇRt18xs6NJ 7=5!@SL Q1UL m(;@8ys`"D|d^[?7@"E %hAC SR "rRE "e& Df & PJy슀IR fAaP#>yݰ>*8cl5*/} S3Hf)l Z:/(0**M sEle36X_ $ ؗ$ l $I-$Yy3eHHpto0)0B(U"ݢ S@A @$H /m[Ml׫ YM@w -}+?3m}2^{9j7_1Gr}W}Zҟ5'?X׮E=#sSX ˢߏbMxK`:A|-96w]V9*6%?U-]"?<8GPVJ%k[Dz/j_U%@Sj?;ӊ_UDTs:+#i @ @dNJaxar !$}H:F0Ov$lIhc%-Bhi: g>$K9s9Ss}?7o> ^'V`b~HRGF MI4RPTK5ndPCځ Uwd<{~pkd" v$HX hS+vI`%@$@S%0E5`PS"$T$T#DR-rRmL@^ %OL2!1AcMI#H躢e ,x2 AF\0+P`. 6/mZ!UK 6=ϭʩ .']. J)'Y AMiSO' ɴFK oS#:wk}f'_2n"ư'b/ԆfK5?@_n`cZf+m4׬y$N[:-~o~ #v?ERUh:L;61W/,d^'p /RV06fq"NE3C_7K;[y*@gY MY_"X/ iK-=?ևyէ>s~^>qf < OV'(>I޷!lKdt ^Ejj론 TxX0<}o#$Pΰ @ V$@RZqAE DϲST!d"۷v<l72(ÃmͰ}T 0BHj{`Z;6FX+IZЈ "DJu{AC p$XE xA3gw1~-03NB?ߠ&F)۫&&# uT"c0#w`ȋO7t6Ŷ/-wk;zy*I 6j `I@4|dJ[g^ >| dƹo _0?-?o.9? }H'O'_?vo? A۬vlJOKS?H(O?.S_&&] ;* b nޅvvu1#'LW$@A0< uh `W-{)>s o7 v- 8;%3P$`FN!jlDo%PljiKMPm @ĀH@eu" (rNƌ "s 8H _M Z "RG 貐&xB `!+ h$U0-B W'jセ'Thé&9p"\ %-i6diJyI(6 &hoZF WAINDPɀ'xk$ `?YI{=DyZo!A#)B`}40b6RE++2elS Ikkk7^Hz;& vZO;}7HO[3s^oz#Q+Sܲo3wVjCi+ܨ/2+!xKXO`?-9n?KdA<uxlo~i l[e_ }^)Oa lNgdVz' _qI̔?/}CRo%bk_ʿV+ׂ~dOOEٍ~" H.5ӏd?N_/z/QQ~? #9kgI,Df! hێ1|sϞ/>z >p. k@cL R@D ?^IJs1TS0OE@)&& A$ WJV<$o8#` OAQmj&$1VJ@AH uxX=hWLog pXHyL5@)*4c Z: }\Pf#lԧ́Zpt-1$`nA,JYM 0"9`'BE0oV XA viL\6a8.#p)I ږ}}r4jATX&$I@]\ Ɖ?9`΀ wIH. I"ʹ459uÑ/=iO 1ߎ>s޿S﯁r\t98V,"XA~+ǿ6Gn&廛7W߯\Fd>NʕWkLʿXxF?{/S\ #򟜉C(bX_aNaq?3h_6X 0;}?X 6gVHX3'g`uO`h`o{:Yw9px`U_=Ʒ0>>YAp~z7z"hzKO/0|_W6~k0:=1eP TKopqO_?_mcS$@hFk4m: (l{-ppZw&Ŭ)<"լ`z| 6*%Y܂Z$(DLnpKEo+ DJR$@o _hP@j%`.(_(ck8 ($ OtV\T߄cիpqH AA)($s< 7ÁU8G ΀ \(GJ>`@^T)*H ^^A- ]1uTB"PɆ@hii)<@l79$Ag|JzZƯA~b[[{6soI_;C[]1#Fҟyʤ/]๋SYx^l,t@AEd~$s#$D^ʚkN|<,$PN $gP)Հ$ %Yb.F 0'7j%I!l2 нm$s)[Z )&HUr>[$D\ȴ5+pi.5!$2B1HOʝ]7c_,B$Ӽ=LfrS))p>\LGZy* ( fca ljp8V/LO/F}}ckiDz?/DƽwwoJ)eY#=/6m']B߰E &1W.e/GK OJ_?/ ~&V S)/zыzsuFܕ=M1φ85:ɕ?zVlH_G7_{ԨU$' ׫~>&#ZE?'PV٪_X An^ p= ~E$Kۃ6?tzz|? #C Fat }$#G L$8g qS*`UHb!A7g _ x |ɳ[NjkWI "i wq.P R!;41PZL\x_H@VEGz,G 0s5 4j-AR+ T$SA2/@$0Hf*VH@bܪ%2ZpgOX+L&3(%M%$HL%!r6pDw7L+r2`.K?G&x+{ Ba BH [)Z=\` 54xؤ}@ HeeSnCgA?2`WV"./k ޡvƚ_]n~{Dˑ?/o[2\?SZ"Ƶ0Qsyix<\(kE' BA@5YXY߀/?q#B!eCj~ω)   *O$E$?41 8[:.L^kHr+ PP$@Q jN"vS#H @Ǫ_Հ~"(RSR[+ Hd5&6A=+`=Ƅ@F"& H"=M|$ m$@tpc'Ƞ#p~.$@f4m:}2 S ^F~ xIHJ $?-a H, "6 7Z$  Gd@6ЮuY!H SllTk\dtll!ggk ' >|WHOl_+cb"7힫cǔGfZP QQ?=78%#q/a2qۛZ6~ ޯX#˰?oIp Rxeʿ(SܩO|OO2:n_,4*o0iDvh?WoI +j>$mR7 !sV5p3 eѴ 7ؿ xA+zȇG! #2CHF %@F Da??_716 cDL8Y w2J:ax;y ytO|ʪ:6*N9@7"N@l դCapb^-XdW"~#r*-6vj SPAk؆uD$@[ $PZRxN0Eu] 2늦V HeLd7vJ 1p "1&j e]"u*-0?׽58H$@d7> 3/݈;  ȟ(u+/*@iLȔy 5ի- ]l1A)[lv'`IO` 4T mlYYO6d֟o;35jُ7h^Q?JG "%0te ^< \'-c4z A_:&A#Wo4C{ZS݆dU$w%%(T V'M[ i1 1}U"vѥ~$q@e/S/f>2ީC'X]GGE" Tq㉄CR 0* x??db`dnK pcp.Uן<?&ⷞ|$TtEz "3v ea\?UjA(<ƛ Uq`P#)?- U0 hEGe_*fE4 }$@)HP H8,-u:j XIT[d5$M%ÿӄIS; !AZaUPytO%5<HF"k83'H@Wth$ 0i/ x 3$P&Z$)Pm|fqB|}H~9)x(@E/R}6 hV) <hLrAZl# d-od$2&8>7]UKi_ ?vW5u[Tb/RvgblcI=$ dr^L³g)'.c13'+X@QwW{<.s\fdz%6QϿ3}CP(ϥ-q/ŘLѥFQ}.>:WvjQ?ՍT*P9p @~xC+ 74}P?ѱq(,xQ&+ @ HB1w[d}? -™ U>_|wW砮oF*C(ht J 2-*S(1ςС-@oPTģBKṼU&c߽$:n$I (̶R H@l 8 _hB FK@t%2$` `':{;]9"hnTɁ7+GDg7 ]`5y H((  AZL{REzwH7.ごJ{5G@E8~90{oh.^c:>Kh ~5Z+@|V@k/yWKb*n OJ/@jnGwC : Ki ?'2~Gz_hlh\5?g]ˮq6u) ?2ǣ (tu^4<Y?i?U~dc/_cU+pd_(g9WrzQz۟_T.6?Ñ8 h_{~ Yɾ+*EO"G'?d'YӉ#roEo @ WO^ V7+D]U QDG&FǢ €D~x$OF,ah~ڣ4 B&VZ'?->s~ _GC5aמ}"2TvK*,>%i> J@N 'Q["5eU}NJGu$ײFn^-$ |NILPS'&ƘN|I$ ``궀ARەM @` S:' T;ojzbrz[W  ɀ#-A {(22x$t}w(9W$M 8]`S DŽ)~cor+ +gyQ[ [ Aja I ~n?k[d@, %J.w/j˂wglu\-v5g`Ds!࿤uk$YP菳"뿛/D-oE?]CZ cyX#ʵ1๋sEx on3 __(&8QJ\տNx~EJ$c/Hν*3qE0Ek|IRcW Oվ c t(h$a`ZI0aOIGG8EA3VאsB6w>̃/?sտx ~[G?eO ytPx@K+oR) ~TQ` 4@}]P6 ; nὢ1xRg>Ǭr  PP$ԀZ/O)E$֙$@Ets=B?%h 2APL( ` 0n'5ǗhNH#zblb+ɀh<2Jhb)ϥeɀx .]@qi2@)06A i: CxjJUο" [TS6"v`?=@9 p2?VX ~2sk&@؊P;H@Uc; 0Py,$}@!,I<.hdХ/HA& b`&Hu&A?#޵NςlH` H3df)P~)A#fRGfH9q ZwW`4\DcM16Q Eh`6ū) He(0j*$`1 TnR_ N$ n~Db=!?H +=`)_5?]N|i3*_kk~Lu#Qkx{m\g/Ó疌# x-Kb oy4Fl"~[[x)'8 BfKO=߯}Ls'Q?L1G: V_]C)˾u׿ATAvN\@u$ SDաIZ݁ Z ,C2tAL@AzpbP34j>~\AG>U?Gn: 0 P "a £Hhpbl#pC$@)U!@z c;cJ1Q $DΜH啳@@Z;N 퀊*(%6x%C#@LwjoT\@B@Gy*2߉&$p*7 p^ >~ -HM蔖 %I@eԺ'@,S HR-0 ݪcOT@Sm*){&NX7%hDp|j JY4*#q&#VS|9]n7JS=C a266 S `Zp+ ƫ~2^W8*Hh|,Z ۶R @*WeLPLC ϤD!cl , 2km{h,~(FwJi2gU?r5K ]U~UߠMGfwփO,1#GĚտ'3ͺxkax|m^"+AmEwj+_fB2 _0(ǿ2t$!iل!m[OX!?IoO-? OOI#޿_p"Ud+?{,Wr]G3;qNV:^ `bz+ic~(pGS䮻÷p1 o `dfSPة!WNh+?w>  x.UAdf 4V >'뛀p7{m_×1<׫a=86 !R{!Z{?U%*atbPWR/Cay=d6Ų/% x&s(Pƾ&XX\}->J@ye "́D@'MVTK@'Bv eRtNR$` vDPP/j"]vpd:d­)Zo]u7\=}?z~Ƀpc,SBAa>CH4F"0@gQ+Yȫ[OJvC d_ b"Su )\4ْ>x`#Mb% 7F́P)֖PlyMZ|H@A 0 0Qpk2M%`5>I"z;APR!)]ehZL4yW@7jqZ{*a awyNkȐ  }GD+[ RS+`STqN $dt oSzJ . ]!C9!#j, B.Tfm,0 eDLooϟʈ3i BOv . ' hMKUH{~cfs{r۟ _0[;bۃ/"ڈ,>؟q!_WoLKfduy}׹L%ְ;2b.M =K,:{iע쯁)~fߺ7er;mt[־?I,?Uc-/꿁 *Lqp I /a>@?]zJ#orE/fgs+!"04,IʜUC< FGa+trMsb>F8^ F y|GNב| ?{JZ/ %O?L[  0$_/)Kt@mv @*PW/_ G=;N>,V x6s.4@nnoSt`iT %H@uR)+ fr kk`7neԕ#Vc: mٓ Y 0v!p poLw@?]b H5FD+y]q8$ $`:X- z 8^lm@2f6.5^Q!pD, ̈́O@ ^ELC$xhooύD(f" ce }WD>6G"iDdx(TIIwh?rOT]VUFe9c3h3k{prN?Icise sGG5z&W9_*ߓ}8A㋡BLynO8^7``d h4[9?jQ?S+ꟁȘ'%nߓϧVS ).z>`/*sr+ b{w ~چW<ğV{: oi~?Gd șCHB3χDDa`t@[d4v? xQ*KO/?|{A-2/"x;`  2% ʖ@6G@@~uPKǯ#WDK2|\Ҋ<ƑDꇻ 0H@M 0I0ߤ>`zF55t3/  q̀$_ Pd ՘u}: jK HRTVOve 4IM XMDV)U&rg@dž$@˵@IɡiF+yUKMp^VsW g/o+7) hI-S T(@Z68u@8 sYn4ɕݜN I2 PT "~/! @Jހm}ATr)g63 /M??VZn/^ІͣA^?UQۗE⟒?ׯ፛Qx$VܥEd+Ҥ-FLkf^-_HJW{q6՘x_l%6Q؏~c<'ߚܦHֲ?WʿmA?9aiS?[/_zFo ,X2E/R0CRV޸Ƌƣ ^Iph"coire`EKvH*zT0!R??HH&ax><\GP 7I)uEړW&|z "X@E #XE10<ˋ(AId, @*`'IpvMKX6/3yBy(s BPn!b:'1DNc R %֑Z *@ޤ ET;וc(YW Z)l c v@} 蚲[b F,B`hH+ѣ @>Z@~> ,upA WTW6[1x;g U8VNjx*[w!|N H^}Yb,c U^XhF;Dy 'ڒ;|!Hmc`6{ҷU>k )wqi=6w!?x oVw-/E`gS<X87ܜWn W<!}䏤 x&ύá N@+l?-)s$ Y<"~ڼ4qq! _ak}]b3m4kNug/jOs?h#(qX :,d_Qq/_I2DYK8Eps ]>AguX@5V$]HhoGF-=HH`&`d!9膓Cp51WGrsϞ/=q7o!с @h( !x#DD!V~U"Pa n;! P$TErJp H\ٝyJ5% ڦJI(jPI:,@6 Vn=ޭI>%`WvZ'l&NY<)3̥X#D"k*Fh)ʴV9VORv,! X*l4VZ `/SiW@ޡ/E+xѬ0a<\eAje4̱@Mhj*@Kt nOԊ50!f/c[~l[S'H"H܍?'2:WΦ?Doˋ{zolS\bU 9Q_H[ #A*Z { ?Y*]ߨ-'7y_'=Ëm>׮~%ݜ* H@JڱIR$Qѫ/AWJ%פZTJ_2,D0 \m:|>< bG7(V˥UJ''o[5Zk `?0@"0<0P)H:B?>5pO…Z?n#1x>q(<%|.OAhdF& ɈB?~R "~~~~:2F`Oq[~ /Dh`Yd! ± $l | ,nXIt i/Bd Hn$"X$G{ "` ZIhOm nLP JD('Tc5&i@ ҽ)'V<(|e`?x|F( %@.sKTJ Tr*xy^86xx>(c3 8 NLwh3 X`枀 ?-j[ *{tC`=gިu + ?Em6@6RBfFګ'iһz'>id;$9UXy{e? e91'?mտ/ƌk!{3 o|< ޘ OH)izԯW_å˜gyRz_CYV P/b~͍~**FRGSH^[_4'@'Ч3uGC UXW/M@79MPP%!(ep'^dpۅLo Fb/U;9 kL ۾0 `O}z["X 0B( Q47LZQ8W30\ k\/?t>^~AxÛЉ?2< I(>/F ! F-lnc/CW?"2O l?+~{+ hӊϏVVpH =yEUYX*Ix"7fYC@<&(ZE& : (:f;@o x O v$`L^)ON j HV@ d pl5@*I|&@MjRT ]V xEA^0~A&~m*7b. RcH&>6C ^-iuJf@eQ6P_?g߇}?T87޽OͿNd |ٜTG3.7V]xŪ '1_{fo7Gk߸cO^XiL\#]/إ۰Du)j}d؏yO ճd8[%DP~m!aA~O|^/BX?CCBe 1$cd =If %'M  U}K@*o^TRmp"$8,R$ % /G$NИDj@"vOPjӕLlL2nEPO LV .#@y|67VZP\0JT́FTO6R[r4PEPAoX2h48p"hWmg.x67eԳHyڟb['TLKm Ŏ f.@MoUTmńN1ϨO"D?w 'E_ms@CUK{z`FŮY؟GAgKgI}&ayRƿ3<oIlpS^D_9/6 ׫c;/eKNt_e[W˾c3=?yɏ^_M7 @O_ju'߬KM/)# /)'QϕN B8aQ6>F p/pt#tC4OaӨW:P@R ́btz^W 'qph}~k'7~|< ?SY<:HCCC$#6CI!GOr @[" IN$`7Ƙ E @q=i m h-h{pbIV.:$Ŧ[$HXcrA+M@U5|J.(2*+&dc`Nmo IAAxI;9(;` ,~jb(]H$lT:L DoGuK<f 6&p6m $Cྻ1a,ZZV)$C;wX @@XyĢ˶v+\JhvC t$PYo\F?m c7=T 3&|kci?ې 8tq| W[azA)AJ] ؟>i{}?U{[cSX W_'ϯ#q)ˬ58?WCE[~LwIU3M-~ڭa?վnKߘgE-!з V'*'WGC(d௪+pBi ťbX )7*8z n@S`FDƦxFtzǯIC @W0@-B  )ӫ?}ps !nsˏo~|O_'F I.(0~(Q/,O.їn?INoeL&.۵uDe eL '" zϭxp M!σb#% 0H@+[!)C@o!z;@JA)l$I}D0hjgɝHIQKn(%H@OK Ԣ睊j1ZGl=j8 gi{U6y1Vkpd>(xc(g/f Z#xR= T2m .sjD@M#1o*]Nl Wax Ow&G,iT{=H_,?>9;m۟TbOix}GaIxc/<ƿ'/M)D52˷mr-P V׿K\wC{n%6zM3k} V?6Tn͠oy^ -ں&X [fOC@ @5*C6^Y  @Aծk`c0JKv$P$\#Ou:L@4!hX+CN]'뙅Cuë—_A? /_n `? H{)ht 7Pа%Pk~`0iLER/ 6@ ZRTE(Dio@>!ԩ_ߍKPeQI (9`Q8,J@*ER pu @@l U@(`О*6&Ĕ )'@d$}s9~"dV@\TRT*@jȩJOU hm0)~1 TuxhIiV߹3 -TT" P3`ZII ('EABUrG@~833PS ]{3pC}f]mmR?Eެ[/Io3ZS.tq{k^1/\W?}ͯ ! 8.#KW>Pҿ-*_oV[  M cng{?Zcu벿U޿>7$+opoҿ&:/"z/*E,W cypPI1R`f0 (Q:jq =Z=x `h ҧt`QHMk*#Tuk*)0Aj UA`P,[YZ+d@u%}sW!PcC @J|I(^F@ , oT PHel*yQP[rQo ̀mSp65 V&vE/`fE,m崮_kqIg9*O,IY{M?Gzeq\woǖ˛-UETDOGiYEXgf*XwG2\Ciź߶O4sg]K[%` M,<8wj;97GO]DpW~ǏzY F X"&.aw@yM r o$V#zNZ!G]4'EXRnȬsUax$30@-{?$@0+:2p!V=U @~: N+kR~*`:'TԹk|pzD[Hrt@va<1%IH6vh@`E退6`] f3n,?A"I%`\, :] PfVFVg@L4ɔ@ S VZtR\gz{0'k!4^yYuavfp(]b,P >U@ܚ(ݶ`߀6y#j]6Vkζ_"/}SV܅@h=w"=@3V_S)´\۪8??\7ŐM7°w[T/rwF(_+fiͯƚKBҪ 060m`Ui%m#{ɤߤ[/s_ro_'.U5$/d!#+' 'Eu}UտI*]ܼSdl&, { ,o  B`02t#spޮk @>|3O—z?>(G)An " K*-HjWN$HCkP1NUD|ûHH ^[&XϞ$?Z HE@@ y:O@E>'4YH$ ZH $^y*ݡ^ dv($@vkmvYM hR*L 0]B& lÅq2! 8Z*_c0qؗHE8^l&X< /@}" *%@zڔ @įSnH@ C* C_SM l(m;7?K @z{FWk"nR/3zNڸ6^&7e0SOҋPց83ƿ`)x|cQsX?Em{ea2%x+(2k~oI?KrN~bYg} ?Kfo~ 5 U F_*Y @AXJbI 6w*N hċpt3(gkp*%X#Ó0|pb QՇD_x\[gGϊ(2/cprNVYE+p0og\fmҿ)N4lw<'Z` ?7%G3M7_Uj_7|T3oҿ= ?/GVFO/@^LWVD㽐? pN;Z Dg%`;#N8`R h`xzG&!@!CS[ucU>8c$%W)?{~W_ Nha0~6!ǻO!VV WIz"n vVSP+I pB^Wyx8g?dNå:|QJ@~A9BK+ eVY4su+`4G}t[Ht NT~}yݚIؚ$/VV@` HhDs3ѻ"g@)cm1tݥ4DBeg2V"9"8XP>P*@bD/"T.X]H;IjG@+Sy` InMMN}ێ|;$A@|Gz?3OljzGn5׊//ttBw :z rbʍOs޿꿥?Gs'9;1hտ2]~n ;qx|KjM&V/:᝖1x0ozCGK|: ޑi@@ )0@!$}~sBK ~6m:Vi=gEJhB pr,ZeSP&ٵl TJR x`v@ Pc&H@`=24zFIRD@npi©BRJ 0 T:T E}al $>U>{y^etIB^։{D%vt@ 6^N45Wf@ @@E -HێW@Zx:@~_

.|Oۗr'2=8G RQ(Ц r(ʚ N?[y> *>g!1+tpbl2^fsBH 1P=,HBD@e2@:t$RZVJ;᭖ 53sǨ`hH"%h-r6@Llʘ` Pedʍ!x^sH@B8Kcf8&/ȷG;~7l]$ D}J#I l֑@ G98i$0;"(}H]f+rHMάÐ,DGƆ o ivѺElQkvo-ߺ;7(GZy/[$U1a+Ռ #ΉyW'%m\cm_ےZ=WZ+Ө_ꠟ 0 ~>Jp4PHoTM M6"۹pV5|O +4o*Di+ 7-nJW>ǡ @?eB U~xK {>qCo=Ǐ[exYtohG~!@-PPRUP )?&tve?#K@\ۻcK 3RzGJZ,+%H$NN==9#BP*" 4r{z>{: =h/ЈՍ~(oʓ0G0O]9u UXyPaA\j! T9@- @tU Й!( h ZDzF@ P,@Kj 1YGN(G,ZN~P.@w` \H +5#c;%C3t` zZ[==j}}}u|:*? `wTw&E럨e$p{aHL_FGdwiEטR7 q g/#[OH;/(l, ~aQ*2'W _nau7?_0d7UzigSW{z_=4P_90%/~_n|6KQ{ ?Gm4p!^ @ `(>OAĨ1@|xxpB=w:| `0C|O ~ -¥4W3<~:7{p׿vS930 F @nd? @'p#hb%I> Wd> Z1#:}5zT=?-\f1%8[g0yFNd" ,zJM ul9)6Y`e&z"6Q`@o;̘ [d,_ڢJ4XpwA[ʂ@[B[Uz}&\=P@ H@w#|+G/Tc>kS 1l V%A7X^` ʒ @,@ xp5t ;ʎ&J~aQA?_#oC_C/ض-+O(+d"^Пyzُ-H*/Ȭ/$6WzLߐ}ۿYҞOßq·]Pߤ;?l@5RZk[ý\lJ:)\?;O_Ls[A"tA=-3#b9H̱ nW9=7Ymyb_5Lܞ,6-Qnֹg;|RZ3+{oկ7G )Bq+ߺ;!3o5N\SbW_W@.Y^aEpއߜ):Ý6hc)U244i' |y-b@;蓂~#S\*텧j`?n?Owo|~#p?< ~w<'*90Q%1F >:4/8P@HXP_]-mGa@6gf/k"؄]Dnxj )Zc= RSPkfTL@ȓ֠ VQx2NJh%((b |@]H@Niik -?2o$$-[XXe t .X&S @Z68Z%"Y -\5Y<U1-XQH[Yr-Z .Ā^_Դ2\( jl f2  cߞޑ8|?ڹc%㉈?akҶ}"!Uxo]roq+HOIx,OJ]  aK3Gݏ ŴVǯnœ7^~ViW%TV@ӊͭmЈ= j|p.G+'5 p&@aQ5{`\zb`P {Zh > '=@@Г#`  ] #z:C3Aa $ʂH+xZ!U'd뚬 , /H-`ab*#H`^B@8``!|G` d@ *Xih #VAv:vp @aggή.׊ui#ʣ=.0%?GD+WP˗F9yx">4ErY};\qx`AD_בb @f96ePrHa(2, |aA*0HvfR8fZ`ڝ.@l 5p[ȮU pvH^3lt -U@ VgkDG$ r,H% P9$ ^5[` @g^ 6JL1`;eIP@Y#G G, , ZK`m |t:y:;v~` wv$R㷵ۋT[K`aSҟ9ؕMxr3ҕYxUxuN?ͅ/<6|}+y ~K߆y)(k CAH將z'ً0 ^u1KV~W!@(zG('kL&0 @ T䥺8{< ox 3 @ L@b%PA2A=5PcN:v{[a2ANdqأ--b",iA!4N{Ykp}TD,j l%G -W @b@bYr\cGS0-aG ",Xb@ \SSaV2,A7~lT WvD"zG_O FӐLBW;zM_XZgW+6{.‹sEþ-],WUy_(%Lߡ߹U &ǹGW߾14'O w/V%ۿdn_f 2%K_TK@ۿC\| si~ pp|A}믃zhO`!_,"u"@XB!|lf R3p>/`t (\z;;('_<"IxxhӓL-Fp/,*g@ @d2]) P6~R \a_ ##<o2 @1esJ `@6VM) TAqA)` L0|݅A! 0]Q; `j1("X Ec`Jh 4["?P4Yf: pd@& wpz,B hۃƘncK`Z$j-(Jl3@-[`O@*)Ck67Wwk;XC˸o5h.C'r[AYJAgW??SЁp̴E!ϔn'Llrfṋ %xؾ' r_CI=pHn>q^П[菡??S f zk'~m߉M߹WaTᯫߝW@@gx?'&_Rk j[ۿW`vuehB SoJ :1]2XOUMCi8WZ`/n4_{n-G=g߄{^<naտ A/W/O:l@@g>* `;@3 _\=P%8[pw_prp3Pa wb `5=HAUG[B8 Әs8**l@e T 0ܭ-Pc= pTc܂8!YtB ȩM xPʎ#2Cp` Z{G ,Q8`Z)GhgnjI.}p7w\=.r_AOH4 +C>Mn ?3 V/m5؟7Ε/'-w^2\XGO ҳ)_EnkEϱyxY_n*7c?L* (<`J>f/HOugntT ڟފW@R.~LWuOp,X B]Wr$OB.\87;ָԿ&@}FmDp)U(ުn] ^ 쭜7@1o崊sV&Z;8 `:eX{tQ Z\=P^not &M@v 0[3u Mh(2-&h*"$5("-\%IHZm®u8P G+87 ؛;,^4S3@ŀK,p[ئYb@b @MJdt ncع};v|vF_q\OBg`?~q _ug%kuiΙ//'y *<O?[ؕnWV䓷U2oy7E&hS_n4>O{ůN3pViKKo-r;5(hP+h͆Lh?Wox%Ps(]"Џ`pdoj+SQ4@0 I'8Cd|r쪌‹Ixϴ)^n?&"SJ`\ >)0@]_>D8fH1vlI,[n!BԊk. "G@`>Z-n&Zy5tNo؀EkpXʫp%Sp _-gYdh,*g. dgQDh"uuz. ݤi`S_Iv׶v>?Ñw3]xq-Mgud *S*}wMc!ɝ]9s ^ϬC'lI-_m˰Q$I.ɆR%san}WŸ 1?$gdu_ 4=mxc.3ߤPE7 P./6# 9pl)AojW^t ĀM0  }#`#@@$C37 *o ,_|~=p_ \(n ~Td&@/èʼnE8@VD>x;`7s= M[|3Y\~#@qCN֤9W 5Qn @) 3:ŀ- T{X&. ܞE#+,@sj 836D"sZsL  5(X#^_M8\h:ZV @C[+x<}anJ-w`_.GmRdĀU Hw'ƥ3lh!PdBM5 csl }G&\ /;_zA74ή4$Ŭ;1_=o1/[tO< C ؓ7/^Y/p]O߂Dݯ_E0_B )Qn-6wudyoj2@Cկj8VOS[~ۿO7#,Qg! _u_O|C$ 7xJAד؎^qh%Sd30$'!=4 +[3^.ea7>|/Mn?6?YHB<zPo: xL  @o ]'ϵ  (-N M- @N.E@ S^n3b J^ l@TUݤ[ [ @1^BdN@fB׎ ;v wD3`lQD749(j,(-Uft%-kAӴ)\{Bh@G˗\b<oWͰL/3%P%Fd?.$Mg0&jjgfG(?q~b`;3?۱;{(&_.B?J~{I۬qmG6x0|e9ex*~r7 Fd,}V%8%?Pۿ*hm+Զ*"Eo?Zom,`,Rgj76J+i3_ M@RYg;/*pΞO]'l@Qaht)zE]o!܍@ ԉw)8_& o~} >yhR V}tS~pz;_/wk9gNfiJM A@@ (B^FNJ **\,o{1|- ¥R 3@UTL@My03* "nh HH13 ) dk [e ]SEt@4kZPɲhT.@&_jZh؂[b.7Ya \xW+x<-J0;US ĉȒ Pɀ݆dreVD\'?¿o575kۿ!?$0&׽Du'+'?5؋]34ʙO"[} M+i9hX_Vۿߴ |u( V>#3Lݫ-ZB@ v?=*hLb:1ʉ| ]^c& AM}#s7Uxꆽx= q_rϛpݯmzn;ݽvQ#tH C*1==H~z?)XV t&8!]hwPhq+z"XU %nȩ׫Ѣΐ  R[3s@m0`8)К`w(&bZNٓM=HJ:5 `ր KmpYd85f;1$$-@H(Y6jdt@ ~Y KTo˅O_\  KKl osCY˃WChYwݛO[$)Ԗa HaCnmsH lQDf/^$ߘsˋVk|.5VU8\5?dH{wi?a3o~"۴I`i?za } TԯND/i_ Wc>nK&\ ;(`@n "?O^ZyAehD&QX_aiA^Q1C0 }lj >Ӈ&ݣ3p>5fw;^[<߄G!SjhR>f!Pgf@ @- s|KO*tyk|3 Bz%N?&q8Ե.ï./\aP*&83RZSY!ug Э [F@zA+ )|,.kB ԘJM@& Lu!MGezxZxqf >Nߋ[;<9O.+= <{J{_?{n 퇇඿{~ϾyP4X䀱Sk!]&:ZO*@%%P+9:`'a@ Dž?OUF\R ݸ L,  c&9**L`2 =v=8(w @3 prl0Q [L j2J -#k#/ @GKE<YM|}˰ӛH YT2 H 8 Tg`dD(gC 8oL;  ,2lcV@u:榡t* p *xC՝G[;^D~wX,"7X7ujG Hcoof^K 'jwn{WS'2MS$[chF>( T=_/q?vC"WY2$ڷ_)'/zI ˟Uc>ጻI3J?YhWV7dFhV=wY2^wmqOx[bZd [zۯ|dlln .ߡO{{pL$kz *⓰:O`W:|#/p xnA?|% IHL ,,F؈iPNgJbǷb+Ba~zA k3@ {j Ow "]_cpj-ؔ ` h @꧀@Pl- @/ 3@[kup& S _:`3TI([ H &XC!fS8$^Ǐ9\7E+xϵoo \ ,\܄) ŀ$V@qhZct*XpҖ nqw ɀ^YLn*If\#AT+7@SczG :K ˽`scu{;w*N|Zh{%"%}2t?߾Zc)]qG0 sy|,ywEZwJEϡJ -)Kh|.kC?|qEkԯuޑ7m*3~ _/+?mQz7DJ9=Fk4z/Dw ^d%-|`dzJ4H`@@1}}pzf J3 sˑ5NO[~ pן~r|1'@t9aR1 Z. $*lv%S*@5?Np=L A[|ЯoB F.PyP ܛ/ʃGs]3LkdA =@gHI{FB, L"@ hj_wP$ o)_ϻNHl w{e$\%P)b kpd bpe,\57@@, kOP.>P NlevHo : T82:rd[5]Ϡz{Vw_ml}2C?dzY?-ۿwJwVkEmk&+D_E ^߀2,:i?Y"ߊ(@$NP##[ЃO¿U#G?m?eGL (LϿ׶ `{Ͽ"O_?_xۿ DۿJV-JXE'pAyS?8*@F՛ǔH:b! H }=D NBb*ƦeJlUi?R|o~;]CH់`Ēf$x  ib!q$#(+Sn'P@.:ػIcCR>P`@gϬjp> T]yu 7?t!=Fq P 0OQ @u Ы Ud Φ V-~ @pxy `rI1 YI @,YɺM*`)n8"JZV`1-\~GI xibX.eKZ:6t{ !-TDz-]"A@ $u ߌ; 7X vk- r` _8^L֤pB{U2O}?/^YίOO)-f e9B?t5jԕB~zE=YBf?uW|:Ou7x/l =A?7v _m O4럈a%>\! !@ pmA NZ_W񘱾4I^RiI>l¥8<_=B`m|w }> ~Cz#@kBFPvcWZQo0 ٲ~ࣀosbԟUyI}‹e #tϕp:&  =Z:3t8Y [0H,@&pv 5?Gܖ)xXWȴ6wl₶ŋZ tY!-JMKp 1-؝/x sB xL%pN3@2XAhihW gpC(z P[K`i}}=ퟡ PlmGG܎X,5=eVU$qC.V!F%,c',Կ*2mFO`_'h4 ja T;[ UQbn (_SԿtK"Kbe~~tJ3럆!wzDNG $ƿAzI _C6dh (KIx?8^ _-Wn}&<} ,)H[@2 e# oJоzoVg8 I58"^u<] ?BIPlW(v[R3p :`eAt@t[b@ Tk%/ĀJx`lz@vyĀN&΂-[,3{[ b P9Gp?P0/_v fpBfsAР 6v@Jn&K@l  GF 6]Y@V?lH.2 =jvm?n5m0DiV/ qS_:yoL!]y?Vϱڣ^Ԭυ##Rz۟5ܖo3A ?NV۟ ik _ - @(rΖ.o{w#NL$硌oVcѮ$Usl,@g2 #sX&J?{w/?.z·_/~~o-<9쟀԰}2 Rt@U{(-=4|r)OO!@ z>n#6)` "}B5ۢNx~ĭl?s##V= wbTR`=@ *pSQ,H;0g` ! @f.@gla+UsԾ @a3δzN?V៮oL]{-ƴ__c2ag+8ku~q>X -G&_;"q7c_0:qO 1+[7hy v$mw/~)_|-z$F!I!?'(B< lJ$Q.#KޖU)@wtϖQmo<2, PJ۵ch 5x9' UTY pg jwb A L ԁ zcz, "* 9(@q yX *4pUJ Xz}?Vveshx8< @g!LB(ԍM5ٽ5o_>r? _r)Sֿ=ŋK/[_ht"[?dl@(_<ֶ?'>N5m_]W?q my%0 %RPK\7ϖ2 H x37< c ~38 Ub@m}=CЛ_`e~Ld&!=8 %k-}xE ^-½Mo_~xo=oӹET5 (@~I+6+R@-zXK8ށ(08fkcZ Ǫ 0A@z% 4@'k F `=(j;& m,Pt eDGlvg&?i3j bq+k3u1  vX8D&sLp~(3U`18LMlK!!P?h F4pX4q&@RfP  [PD`{%;.կ2ڰdl:p?AMoiӆ? /x79؝\ZG U 2nWp< Ke_fk3O%?n>`OU3w&8yOg]odR Z=QJ'@#ѿ5"I/p_q'\ Rp"# ֱ%Ħ_R;U+6@Eݟ4lH_@ z9nNݣܿGlU DV{+ϗ{pAoVN9hBWzOuD@^  ).Jg@ݶ n$z= ׵?M> )kcpr@8 SXQa Y&-!0)@mSY=@2@@3 3 BG%pNgW~b@ܪuH%.usB (@sAK ǫPf|mOn@ Ȇ@ УuG!z-OkV7@#Y/ߍ@M UCommthG__Λ3D&%"L_@3 ]HWL&ߓ0Q>cF(*`ZR ߁yxa9lN BB? .36[ݯnk @[ZۿsN&ceX}Ӧ_ @arW*ȗpY^ϖ#؀;rE7D'q饳@}o Eo'.Dy>ͿvIBjr'Wj4FE='r <#p˟=|˯?g!HߑBN_Oc|hAIJ( @?9@aI ;tI p- d $Hy.?|ES\KixP \Pmc,@+0|, ^dG(  h 0-P `D @@C2Ā%^ߪɀKp̉~- ʂ(} Rd7At%Ueh:n cw@ @9(t!"Z;3Q,@SSX"gdG_~/Wf`]E!Kf]EV>p_8 { O[WzلWfv ?%Qn4H4B$tK"HGFYMG~o6*U&Hk6B;mW@'`0.s̙ڙRټ$M( T_G Z =U:7>νAθwt@dpÐ n&W@e<[CUnA ~+p-?:|p7卐D0gHzYH0@Xq__ P J려pr|\ XoTk l 8!Em(k¥kOdZ }1fe@T+ 3ZN=3?` 2!ԓY`jt8  ` Fk,isF2L%ĀxU(8eb5 P h `ŀ benBFCΑQ *fK=ab@73@p֐p= >l & hkk;;C9?Mk^вW I Qb,9W9gy %]Za =\#U &B,:lMCZh0e º`e0Nÿ/C 7O&i{"?H)Р7FC/lNVB?m pt?s":}c@1 MV=Roo/JΙ``Q¿{dcsـ$ղ0mAyc.6y;_U8dXA%% ek gDp -IKOPGt@=Za6逡Nz]D0<6Lf]Z2`v.)0S<" 28(zDFLdAA 0=Pؐ&tHغe (.QD wh:Oɉl@.?'ѮMM"m_ P_{ :!raR]ׁە'` Rd{wv3o&JMS &JӊZ &a|t`B{W6  "p ߃5 O[¸ Po4S*'`&? 6  崾S^ pN'O_G. )'[!!|ħz{ @h&ڝkyTDB#!&@7e "(D'נ46/usRh|:>wp֯?oO |?Mm?R$`@×"~i_[ sP?W S9OO=|V*t.ci#{ o;45{6|x(BPXT@0J*)l  3`M' bz3@@{?%Pen !>9h%7@ 3;XUȒ XFɀp @`jڄc p<P4.>+3Q ZSmnq j(8Ȋ` `B cmF_cctkY'W7wNBB|G2P7tv)߬a`eW7G82LY/բ'wL{%WW$kUawwl2XF@#nX?mho,!<d?kaQN@E/@L0I k '`< @ )ހ>q&`Xˌ@ a $ c8?.; q1c _ x^jOo<69o}=B8i'b::[ &c^cd-iO_ ~̲qʻ('Bt vGE__P[S&?1p1$p!@0CO@tne8 @BCE @:-2 [bV^ 0 @@źYvN 18 \@24D&!? ԰g>gXz/etu; QDz$R"8wp b}3:|AP|3{J?:~9/_ͯÇ>p$@BQ3ș08Ɂ!EUpJ8矄T$b TQL?G N d?:kd?n |rk$=Eŷ-QG%80O(&`6yM UO-PqPp,  P0 @3pv kɀN@. R:P@Y)=2-yR b@>xe4p8-L\ $3P@XEp30Δز:Xa!<1A"@1oT@] ʁKsץ@u46ZuW1LNÎx? _ߊ(4`#/pHSv δ-?~0O7΋|A/=KUÃ?9M-E/uW{珗;~'ҷ2DSSG_%_ѿvTgy?f(_uW_~8k,@5AWHK/gpԩ36y"s J 3j~u ,f@eU=n4R ^ŠwqBbbZWqHS%}oJ!t;|>_7HXz HpF/!7n8EO5i;@V@M @v!phg~) |F L@O;c:Z|ʵj!(ހ xh)b%h 4, ,k`* $@J @(3ŀ3<XS`kS5x@] `PI\lL Ů PL0\H :TQ7wހCeH3 7 GK&[s詀 f* ǜNythy j!=-"@}pn#|!4;m``0'%,.E(@ @$*,#qL(mwwGM8^6% &p?KPnњ5TEpt ިjR_m';%b?;1*f6,ۿB1 o;&n&?oFNo4FԩpL= +7,{yǥK^ ~I@Uu @8c}8 SxhQ,'p_WdI#_*ra7{d~Bg=C @7h \1 7`@WY Pt8˹%(9bX,5ם٘4*ݜ hf$sb7ۡ$ {x6wrkhZz Hg@9 `. b@ z3r3Ъ'Y!<(ߊDAP*h`jz=' p @5j-ȶpΈ`:o@hzpF0@@ |^o?qƳ-s|jgq&aۻ8" u? A dgϺEO_Onp=砭~^_C/C_,M t_yn5_l6b#@ß0ďbxۿ73_/_+kO@X@7W@5`6P R#/ S'O;{WtZ& 5ۿ3d"&_#袻|/>NPJn]P۷jDY vw,*_=u>}Qp׾rP iH֟F!NC7= =?<?4u; \@eFo$TPj4@:H9HQ,0nAUUx*On__~4|ci3p}_ G 3D 'b Ro`Y&/Otj=Vr(Q al\of va5 ig@0(68=Tcrwe)lGwKO@ dR.dF2`8S@C?)0m@+LW-pdL+`S; yg 3Vp;@oY d؂]y`x2^F)7 ;ͳH@|:FE,?bIg>M PkbܱcRk=aG?.IDAT~%%.y'w.W@AǟDg%ۿKgpd,KV3":j_}Eax-p XdoI9 H"[ߒ X?m #@yV¬AgV_u72)0`gP>mת$E P I`p.W R;3 b9 L!A07 б  Pʻ~x% __z4t׫}!w~[{5 zb$)Hw% A?X84&XXTe7O@z򪆌H`;0g;.h;@PZ%A״6{-0+=+|06FMUQiJA9xA @, $XNgcl XAx̌v@= TA!܆j33 |Y>(7@ lHPgfxߵo5m 0؄=,tp*U3w3M]d*`jJ2t^>C`-<>Bs  !`cCf 9p+#Mnh4\.SN'p3aid/J? '5 K._\GOm;'Y]8 Te׆_Zos 9 F#&ozEumN_?X~ltoJDvb(Eqm~%'a`xJ -6@k =@0AC * ?gzQOB FŲNxn^X= 7un.>{?um?1:@@8 @c+UY(}5@W'SbDB`П ngl $OBQLhT%>vErCVr\C1J@ x`[J#>:ɚàPyy]5VZ@SUq;3"J9MlxM Q=>L[r4;q\9>WxA #4dax` 6)tP@Zu D.@1343VVn TWYxaA!x%t˅QH:u\. RX,ʁNϳ-[,`(`- A=R@BN|=T6ouYضh ?@EyÍv?t.gHadI >Y8_?|Bj7U+vo*!5dס. )G=_ 6)tG(ob_L/CTطzcJfT__ r@bgg)xt &!;`bW)Cc"AP&_9m,wRT3L:!jb sBi'<暂'Kgp~ |?_vOB_bR7LZTY@E@U O N5+RN,?t |Yo!wDYP!A Y`oV <; J=8%Q hp'ilS (~Y) ` h!M~T@ɀ],trz<4 CdE0iѫqEpp*^\W ; \+xqTn0up ^ƙr\H;`$3˦tV 6 VT/<f@hb :ϋX`Y 2g`'vG&gW)! w@y(EF;)RQ[3 |S _YήL{ p EyWտ*2 eE?'2V0v~+hS7c@?W[<?/X*1+m(Ǯ @lWL L>}NS UZX)HMЄ1 ^ u7AH@O/~ (B 10"(~,AN .S-80{f>{Q{_~_}NXtuBw4]d`R( Y%??F=4g:ʫ,^y#zϥbHj_K)m*Q80ϖ-sPPw& H W+1X$eC:PZ5~-F] HI Hl\@b@Cħuk  vZ,쀤xͮ\ jfd(*GPtz`%Ll\b ࡓ R.@/4SJ5[_@5C?Olmؠp\1h5VpۻK`pGE#}p|&?PrQ (A- aDe/r RVSM߲X'3n~m+`3008n(= }:}WqH nF(3#p5 /<䙇z>u;^g|4$ ;x?ĺL"HC/n11uCQa~*lAJPV@1NZ @Te䯏wLJ@(r3  -Bވ9΀;p ;qLz-@j7Qd rl: 1O N > / XZ0Ф-J Xtr* 63R9PnvW)7N:XgǸ`4,cPھbuFh @ ep'C(`ű\@//-- {ά?d2w˴j6?Htņ;>1v3\U &yd /Y]8̟IOg8OUk5p|v篛MBZ3ds.!@x5_e;m6 A5 `HS~WzT/sOۿP';hrYd' vP%K@)>:(P*'4 (Yz_}C3044u?dz+H[)B}P^@`%A3~ck; OY8Zp[ٻ|[oSM2=$4L@@oT7<r@~^C_JH@%!; P+H^dsn6A} TB@x=p9@ +OW UtZ*nO88+-V@:0쀶n'%A8 1uJW+@퀔r6J`5);`@t[֊3a3hl;p[$tՈX`$^h| 3P/[;<~NR+` ґ_pc 9^] H::@W!92l\7EXc~-)B}bB|(߯b> rp:gDL2GHE{{>}׫pӷ^Owo٣@Gơ+A?16 )b& pAx#PXZ yǫ*cp+ '?N?TWJ A5Q:)~q"IwO<wa>߆WA |"@T,NS"8@kqP-u9= P\z z~[ݞ抖8"(eY hfX- '*^d2Ly :Yd-V@;PAz%J hg:6v@bXsb sxim^^^ P o xzW<\`ϻpmYQR@'=m 3@;OX 6:;dNt#KA&E&a X:ȰTu1=T2 莿WM-& rbh%a*Dx ) D$bGg41*>xs Z=z >spA|޾\#MQ9LLD 007~>W@i텪0 @7 sZ[Rp_~%@A@93fM* lȚ`sMj\k(PM g)ҙ'GuP g <ñy>4*@h퀆%ud,[<6ـ fŦ>1[% ހ#|XuGϝ3քQ0@G$ن8J"hKBV>+! /I}.W(=abC8@Qv'kS:0n1=`n3RX8Kg, 2'ϋ 6a׌?"0/P Cϥ]a=@/Q @02uۿbt@)#_GanjM`O 9?SyKK~t gkm G@;o`7:\9\[ۈ ` Y<{054_=%i]g`W:ng{_~oO=p'p@P˔OA~,/@ΟK U|͗2Keb]6mٞAz\Y; l b4&3mz(: 0@ d {E:e1ñv;ô3re* ]%zuB.P<}!Q1-Q BU<R P,25D@* 2)&Z=RJ::#P(28{ 5- d AK:!JBq1 (=H$ms2 'H,. 5x!*Q/+f`{$e{X8;K\k|E-@V00ן_t 5_/b38u8߿!@ϕBi`b}S0B}T/2~nG8؊/=kI@@c @8$f!>B|Qo«3!cg{|o/|ȩvAb4t,}>3A'|IHM^q83@mˁXq1{,p6 4\ASTkWgKf=Xkd&@ a-, RE@| 0d06~Yh@kp2$y@9Aq xiP=t bzVy phKj#&G 's h:: 6R47 !`t466thv (H9v#Xavt@)$Q[hi#HE[ /gD`tOE+TW_7-k^5O ~nN{w,_tCԿvßEREBx=,RϞU!@gx.sDա M°*g;AiB @{ ?~ + QH OBrb:  UwO>_oWw>-t?_i&V ])xA@^^9!(xu}%gua@M?0v'F @2{Mixlv'@tͦ {7@fCbT(*Rŀ r !t3ca[*`<pVn"3 P $uaX`ʉ9^˖X $MHz=3V8,q=W0%V0)4kڍD@\C}8S X̀p^ODD"U[$')tu? @$*m(iVQ|qE"ߓX iESϲpS TZYx1ocwEasw?;w)G~QFn7M_?@ZqϤ@LwvwWbO9p9W2% N8*\^uЀd$ L vڗƯu?ăX{ewMeƃOB1 a*g1F!ڕď ?^T G. `g@@ZF4"%h $ >al3WvxTkTv@ h)jg& )@ @9SS*Y;3@8h"t.Y {h,мW \$Iz!|O _Y7^cWZM'b J(Ihm3=߰*@.#q5 tP}^o`dhi@] Ls0 Dp|ޚ6 ,@)K` 9@M:a h`v @6`@<#G,?;I` ,c<5HP) hp #u_)&q@Fdއ^K˪ pPH%M t 2Y<_/S [~ >//}|#XI&# Ȅ#16ǫrrX _Xl8 |rL` jワ/udln| YzmF`  ҘJE]WV(.%4@܁ eLY=gkuzwcM@i4\gM(u9/yJ}nm *' 8+.zE3x,)E? Kٛo"5 <`M̀W3یD@ H> 1>bZBHH"Zhqߺ:?h@"x<ƥF{ t)90U;Ňq_l , xO!U *T?\>//Y݇_[@fZD5w@6 /*5_:c$$տQ /6q@i*~ X #Ϟ:ΰϝ w/oqyhOB[ `OmT!`+`2fGYȪTg!#4-ÛIx9Gj7yn3C}=:-Q3oG@ w0Unt(,4z`x=7sPbhKϱ4n tn巖4@ 66e=|ðg#0㋴7 '<ӏ@1w<43@['Q/iI<$b zt/@%yPZL7Eu\ Bih$!VZt@h"*OL [D@'!D@xd" l$49E$098XID + POGY \SS]=62KvtǺo``C~L$ЭLFv&JpgKp<|RQ W!sW5,hCưOl&0eujN?z'iKn~z g2@[@/6bha@OWk@1P I'' m>;0 Q:` tlaE HA^3+ tCЇ`wb܃Kj]/msIw-;|>?O_ 8 %z4>YGqR^^1\^ (` 8PTD)d o<gf VnbZpk#P߃z (`,+P *::+:64d 1X`3(S@z3 `  TU0 !ÒЄ P gF` @0Ul*\ $HJ$HB7jU B@bNhV@_s$E'i!`Ɵ3LdT@_o7eOfh.VH$|0@< I!"PLIj (+?_\2\ Nԉ!? UPTYֻv^, _93z@:| #m3'Be3ɡ8dF7XjW@0+M O+@?8/OCip 5  i+t@߁ޗ`ۧ{bAH&5g<(A/?nT&P,~@gA4HV )A(規^=ֶ x]K'NJ; sKbJ, @&Pg R@t rF9Pߚ `XĀ@w(`&X3.ŀ@% @fMms/@BBXf+¹qdUΈb "xfx!g ;-t 9XPC ȿdօSE'd5p k@ڢ2IJ mm<--]]ߖ Ҏoۊe@VhU!D,`^v( Ec˗ _^7ǩ:XE5 L @G( 0h3@-3Ӣ# 0D D*Ԋ,v@x;腠  VжB@+0 iyIp@ k@V#! Q3,Δ9xAxno‹[ L 1J& U ! -W PW'\M+m?ԭOmVK `K[vpQhkp" Xm~ 3 h _J Z߿e-64HТ%V`&g _bgVoNAbtғP=ty7\'W~z>wpg?*[`]=>c_EQ+_1bS@5 :; ,QԐ^ Ax_ Xj "b Hz;bНi<8;28+ @: `3@{xZT@K43JH~o_wIDAs9C5[ LGN<}a  ('QsLI@@3Ęe'%8oZ}($N maڼoP92o]l2\.%Ta  (: Ħ%uPp?8F(BF"!#xqUNV@:*'fP8GK&+j`ݲ+@ 0`_Z!LkV6hii1@mSBYDD--:p@z}]8R8(8 1! |w~V)8JE8P5K~&;HH.  ~w'C7 +"s6&3TZv 0-`nCtW@1 +h18do2NV r2<1R f#@W]:PC_<u.hjB⼄=C;{ p BkP= /F^xs\nΣpM}/|wV'%@; "A\oq@*@4qd R/@}H, Fyخ=0A5S=J7@G*w'h 4ȢPV@Pv@ "]@ %@Yy0 @iy SH:a@۟t7M /4 ͆p (t"–Hk8?-ëUF<Ӹ `Fp"N Mתr m;fVua + W?>'a,}Q%09HH'֖Vzۛ?.v>v7(Z)%@ _,4D@s| I1@O+[׹১D&"xrޒ[(T Je 56K@@L#9u_g@j Q@'%,N`}0!@m+k=Hp%Ot'N['.g7_#@$'GY ԭ;qi 2`Ҕ՟N#N3h؀c i>^w["?:]A%#?=t^N O"1 'L̖1)@O o>*`u^M;  > p]+=9-ϭ`3}Q R&h1h@kHZ255 B@~G`+`3J=,@ <mX8/@0D@ntAWh%) .ϓ (.s'$ L8\: ݽƋҜ| X UN= ŭJH @qh5p"`cUa@X[[۱# Jf[ /*?3>aKNfO4MD[ Mъ%_*t xrRH͗ `U%ЮUk7@ "V,tJtfp_mCfS6_&p8 YcFa`@g|៣ N}VG5 #@;jRpeu=ur&@)Hp300_ד9M8G=|7|K?ku8@$i#+) @/_JT>~ WVC^Q>nPY#N 4qࣞ~V@EH*L{Cq12嵚LL*`;-: V=jet@cstLCwAUhMuvŐ͉ 2*䏖!9*+&w} NB&yUw[ch.BQ +"} HN0rV@wKs`ںIZ5 HOPQ[$' OJf(b0Dk tX:W 9(rQLjy8T vlIجr"stF2Coqod=| @`P_1 D> nDK.QY|Hxl;IG0Jܣ_F?\ D Tw/?<i Coz"%!v |Ρ2h '}H?yzi P M :*.@pH,]9[; 0+P@V P l)2@w`eg>H`ojٱ *Pgk) ۖ@#P }f" ͏8_ Bw۴jX_VߧN ڂ=+`[e4R@gp| iҲj~#u`$_ֳ֖ `5i$S`)`kt W* ,ޢUDV6@hK86dVc0 ^[,`vhz h@$'xƬ, X4O@iIig'_O3 h98z@;P@* .1&A@hylHdq+rq"^(L5eFh @&Ѕ=jp)>t{d*P= H1@z$Qz=0:8 X5&FZςPXe$0-5ptϼxl\ٴ  1 Y_. ';X. ߫Z` (Hꭀq> ~yh7€\+'@]\wWOǾ(@F `# Q4t@\dD ``}PҾ8Z.,˗aO_Ǐ`j I:3t'!K3@2 A@rY>ne T@XFJv/{٪| up]'ŀ^ @g\Qx~S ,f1@/3-u?f|~eL:P#.쉀z'f'@wA+z_iN3 p.7-"xfR KO]VCe$@93ز8`{) dN< g+8v;# _󷵅 @J:{{w@JdR @!Ȗ;N6E@i /S '>}It2k0 .ëBINtßKP2u L X@@?(,"@]Gg:@O Z24n@dTۿ/E 0O8q ?l JNB!?{HoH @c$pB,ñ^x,/a_gy>C?߃WNA8НX ~L:M@,@{ <!g8 \6@H, .@Z j:mg됷 _|n;7%AG+RV@>(EbH#+\ 'wk̀IvOHX+0@3 b45= (  P뙷b(Nl X#i~PܡR7oS+&E,s[ V ++htN ^iq&+`G@Z%/"@-@'zi]FC@Y2#Љ ?IQ@@#U h\ ,G =Kb(u:dp0Y _D> m',ZPи5j+l o  ; Sh05(`Kk ?1)8 Kq PX17~WbHR]E@i70RF Їûƾ8\GX[Ww]yq~ _ïKo~ Bj &m} XIa2KPXC?-P NHh~HpvpfGe6hjQ;?y (3nzh2Э&9 N X,V@`mD@ks/@6`oT@Y PV<H p%9Ɏ/ix4 أ[RjT`Q)P)HR B0Z,/7:vLRp  PKp$#~MYQ/\H Bdo J.ricux&g( s9[TvԊcU WV99"h g*`T pB4D@5 k1o5fڸŠM `3TP+WtEym"ɓpdsaS_\A0`)`=P2[@hw#jFP0`&&1= GDy JM_}~w痾 ."@o c=H378},i8 @:<PS*|?m 4 BizI'p @kg(jm@5ŏ 7 ;Oۜ" @(h Z€,(T'@Bk2w8Ggka&`V_;p*؅mPKB@?*.~ N<Ȏ!+[ r HYoI@IQ $IpC֊Nv 8€Fa@$2@" ])+`[`<ڂ$B -3F".Yb v$q 9:c8DL`0H|jcMëV.2}໗^)HLS*66i < @\i$o A@o,Aubvӵ [oVMO/|*~P/NV@ #A@*JpJ@.I\o'epnŁ.@Z%0hl @TO;Wme=ӦD͆P ߻f-3Э"`T`?P C3`jlmVN P@Y;DxH@4GȆ~LZ) q*€~DbkV+  "{bX2E Q8?CzYO? @&onnZE6!@j,8P@n1KnR\TDcJW%O>i|2, 6XyJY}"ZN!2@`3m@Q_`*ʤU `%?켎3O%(Ӯߙ̆yvfÌl9cIQ$)ERLD09v9t94й99mE=Q }ߩz}-Z(p t#: !1@A- z4r:1o4M._o6y72!P dTsjF:wi! |#"e&'!J00!('!zaVቆ_ۿpǿw>mx)c?~~J$&S 02"@TDn*T9K&@1 o  : 7CE ^pc y;$Y6 vU@>4M[ !ԎZ`w6s`kj4R8*t`5MrR*4"U@1P^ pLCMW@*{P8`N Hf@("u] r>z9 c &$t@Wbnkf N[kkX[Ը(& @*b@vWE-w@e(yp@ жu$7hŃ1 ]Y( `o 2>hli}獶6 z`lqg@[ij_u( l-^V  P@{P@#t_UhIbhqtlDH i P8O4O`à Ds& 2%xoH2|6/ ~$za_>]=8Uٌϋqq' X2Ɂ!^gTZ "ٜ֡ҟ::.(@o~<@ SЈ]U|R'k.@n ͭn/lsVU@`2̀LȄ M*z=@h` ΋U^X@}:F '6h "k]e _`*^Bᩜ xpmNgd*`^|s=ݺl WT@rh}h NUZZ 8şD=4Fawk ;WvZ_uV^o2֏RֆH]R)xNL6VF;+Zط-}KhnP0s0c 3rnB`s жȄZ1fV:64YPUmQ/umdkuXll x Gg!E6#v @=V084x89w!%GUME=Aؑ\O}(z>m.P ,w 0K2ēI/ #p2 r)b@9%?nЯbn)7 9W "S"Kؠv@dv!  v[ut:*(;x- .3*-t'b4*7U@x'_$4\K EA %@f/a}͗!D^\*@/D /^ y[l@ @oRݿE) L$ M@0?Ea..w@lv@kT ]-E:Pz&%٬?8X\*5u|@\C+ 2WZyid;av4;/D=.ip?] 2; 9 y 9^8<2Z< :l^@\B0$`b1`uɍpOqx>}>t+;n}>' _)u?aK0ӤZ8LY9!(s@4j3@59U ?35?:@?&`k%αp*aJ;N (i[9U@ t/ h-X`{`:Э0@'3d5~;  @P8ѨSi-^<%tKǣ'[^ pMw ^p `(T@tt1P#: ;K~9V]ȂFa$$ *:!YO &l6 WyW xlɕ HX+EpZq 0yg|6MbK#{oFhM7< ;de05#& (w7g]T@ނǚHE}2R08fy`{|˦{: . 90)H@|hbWzNAxg\?~#w}yx_w೏5=A!dXq.txNzl|Av \><BPSyz(u@tHX&Afn@u;3N)$t oH O+> 8fYB~Ot4]Lpm @]Y˗Emj9(iU@ \vP4#RHdf@X`2:H95 u|wv\s0tft0WX[" \͍C? .@&@+,6e^8Jg/xPY* t˿byJ+lD",1%VL\Nn),݆05͞0 ԋ)T `=e@cނ-HT>0<6 2^E<"`QP w>mk_W_{ HaqO!9ESH`ZAIP]MJSP\b"l(qRD{e,r2! (YG ۚuc08\%霒 `ht$pMMeU@.|2mXF d,v r@gK"@r4̀@ !Q-|Jϭ5xSlDnY/1cT^ѷcP0 ${:}IyȲ=Zht'X091v[ߠ:ܶR#vlXp d@P?];kNu$p\E@t] `5b0m-sB@27GwIe@i9% `^n;> _FQ .@h LDW^=9{8t$KrTo```pjzF< #*Ç<= ?)xx x BĒ CB_VQ˥@):[p]wJ7u u61nZ.bX044p{ `+@8>#;2(,!LU@?I ]O.9pMu 'w w|.>: IYmLhPHW_H 3 ,nv#mKJ+d@PlA@`x^:w[? kF :}OkIcH\$@x]U޻>ŧ|n/¯ɗOB|jbuHH ? JF' ՋP |WfqzK|6#FԵP:y4: 756BT߀s3t6h8_;7 *p5"vf@t@ ;!0n#xtP $4&ЈL:n+Asje_}UkBycO[Ghzb`7(]c:E`7@@ 8 )\:;@i ^o475-o8@K l} =iK `NK =yhd:;!ydh hZ   Ym!l*Գ@UQC\)̀ L0{̀qm"7UT  S'ϮVıEPwؘw @?;PGH@ Zc@<'N" X( 3 # г`@%.t^tWTR%^(\a&rq:\{44K` d`w6!@S ޫmauwFiNH@@[fv^;ZTj@7nHh.ڡp#dDiu6}k󿧿· T φq=%\x*/Wo> {nV[?Uy((쇩IDHHڀI4lfWL;ED۰J07!  j8@(r'qGG@k ›f7.@,jGuR1ƺyİGJhtT?'ތ $Է 8@9w,ь=v( 2xRZ{"u0mQ8+퀋6$3:x~;[!iL@Z)^D(Gn; iL#@QטW hN#=h@4k ͭGG!0D3|;p݌TP# M>P%{io6 lP H`Pw4Xg eB ^6*Pe{ŭq4zl0P/'@{g.l/ۊ6 酨N`  [G @|,MCjdFC~W |wh?C [EZ'j _-OME:.h5Llp$-:@0P⇓ CÒk,d%8#:- ]*h;@cSp2rk8jv7;' &u,@ ytel@#d+dYF 3rH@oiS|?j7}sPU tzJu;D P(KX.bؤ}jzzz~`@0gWgHcHlji@Q1  fmPQC:I z0$@P +0H6n۩rT p$ %d@- z@o@IDAT&q %-HZd r[h!ffnT9 nd=ذ~(?"lT_j iHh$sz'&N[N-UT0# !za3<SA ~om_wӋޗ oVAhsQb&c& OH qF6?o_gE\VV@w@@5A(RֻE],h}@ku1 Th<\ቡu0 7dv9-n}|!0mH13d{ PLK` lg0.703hz2`w Me' R(̀f@T{#H<@ }@51 |wvQQv @GG(0)_oe(Wi`8.W/ @QJEq6:I0`f[ t`8{nmMn 8`l1@h   Kuyg#΍_xz0 ?amkX > ) `CF!A^sנ$:ϗA^/DWw#;SU=a|%S;&!M@ĢIY2B`nO:Oi~ze-XXRv .Tihn4.F 6@m`SAEKެ "O ;`P9hhT^"Xood;DF ЦHT6Wu*`v @`.:}:Prd<= sp+P@v]h@din  N \tdD tu n :#BW@``Jv9 vh(l "Rhn){5iL@6}Y~O޵ P@贫  @ mݛܴ@WE&(`{`s7 PeFB&NJu`o7| v]ort!Ͱ?wwЏ.}^?KC<9 is&Egf#B^h]edz3~>!q-Di h׈o邂*8*=9Pc's .?ߤ@8@tZu6 Mm?QP=~\ijB\Wk໅+.P9pkPP#vtׁ@vW X0 T,*OZ@p߀[> G3PލKpp>D,8@iX =jݻ@hpt\@9PvMෙfMCvIT5a!.k 5@*?#5oP=m.Pj :``S @6'@e m4ay@"`@@MHOo::qX%1tDIxFu #q`$\XXĝuE'@F3@ btx @jHsSӔ4' NFAc+ 0)-Ƚ :X- xUGx(Y4OB =PdžQř5ҩ<E26D w@ov.՛:Iz ; cpߙ9~nXj 4S7@t?5 z b@XHRa X#]8=v65G^|u;|KO?)[_D#sNךA"xO4;4:4Tba;_ܸŻo \% "m(5kW Ppog#]@A@UwzP$|'"M+`$쐧Gy-`]N@t^0}dn?]`L7@ 5X:#c p44E} V¶bρ@oiP%`d @`^ pAm"@46>e@ssӼШZ]#)  < N P f(_Ԇ2@@ ;@+P>dLko-lcC@\ j^[f@K`zceP{kX0gdA\4}'?P }1H !`RQ*$>fcr Nulo-WO_n ~W_|>G~_H !yQHאt$OFh *{~]p@}T8߉BǾϫ@ @z! $o(ܨ'@# hlP3 F༵`@ [amx@WOuF :hjU@zGhMP_^>P2t@s6|j P@'PuwҊ"8:OJD@SkpUD=b`MH!p$ k@P`@ ulhljpCctjYf% `|6 ָ_vT(gPg$v w'iWPV D0MLm%G=ɬ`3O> @|0ڝh2zA@F7@8#'Ae__x+ jj 6 p#A^RFc$ f/C+)^]Ep_“?~ycC0)DRX,pFE opVފ7+ I@ZohzQv>CN,ׅ͌6+^~#_C;zhhAi5:ׄυ@WIg͚ F%7fOskhC0 @@im0JY*@w&@@fj@F8:XK,8$<'F@e!X<=KhQ@#0&GIn`0  r0B] B@]S?@t5h3 Q hhHjxL5@( G5 d!L[*EGWxt-y}6w@*@ _2; T('@5 `F@Df &R67 pk+ 9z\O 7Сkoix?9 sWNT;C/HJ_$ H&cLBbh"3͓०8<[}+T%}p۷_ w~G~~;t! Jm~ ($QI@W_*kZ)|W0 v|:|:4Hl``p0l` -' `%h)ȶv@D5{'x=lf@C#5:W=Fv#:4Zt(~ 3=@LXb:V `Ye`L8 `͆k @9*g !`mm0R3hp45CX`8' ;u|p # #+p: 1":#tFU6| ^pD8klb!K#aЀxA@ f@w . `+wLU(.I@ w)<܅|5 Ajt &CaҪ!M:Zp$} +f{zC ~n r|_?^ HcxR S1H&!54 q|,/Be+/t횁>pKޯn?#O/> TIbF : ;3-VqpN 0󿽙 G h`Пuq+"X.' >>Jpz j ;6  EzjMA<Q3;j @I@^ElT Ui${tz =tWI8A : rT# w P#=) iRiZaqu?@CSfx /G1h dl8XrG l;@xi#]uh>aDE[74B8V,G4;n QNɲ;@hg@G ٶtؽ] .Ԛtk@0@;j2RJs 9smwc)L0ҋbuMЋ)V먪sRjE`oɔ@&98Nyx>%a_<1 ۖ<ۇ}_QG?ϿC|hbX4c$ >{=r>HPJHg¿M(PɁJ @7ML3v7IPUp/op<Tv3k H ` 0c .&Vk :U@&dlt@_k` LH0k@G u(|p@0U bv"0$5q1NAvhi6;ua,`v:8J@lTO # F0`8`Dס->@8.:j @C j% s"7{R&7'!HDDz^.^41@@ 97>E@|`_|"B -W2oh^*tİC42`J0HZ!ʣ Ga EnxU_o?nyx_C˧?~n8VPAa1@F|bQz~1eR2)ߜlfOT7V.d\G&,M?`!P@=vyk |j`I-hE.@~ k dUe>[҆@?lC .@ta@8evHP1!P$:#bl T!4"F!-m@{4Í 'Vr֧ a@&@k{ };"/@)@mm0G<E  @1hLoyh!`8^#kfvk @eV2E4v(>bO;]':.Agxb zD_[z?o 淴ާB a6bI: 7=@td 9s)8^S[#K_pCcAc >X#aq SAjzb*8xOÿbxQ33@v "xx<( F-|-s%̾hj䘎W% #s ɹ `f 4,~76Ou@]Z`[(lMn4@@ՓeX- [@YKxzs0?F95-@n$4mK{[[;:1}֖#)L, @ XcXrG@n|Ou 8t`u_( 3 45(fxZTBLt,0@-mZ+hjwt @HLn({ @xCNRr* hdS& VCt|2 G xs4 l0G"@ZT): x `@jz P "N^'hK| w,54y"NP$>0 ؼ@fhYDhL5J 5vIW.;.@'. [v:,>4&4]Nn[pas did_lmk2F0 3g0 {<\EW`pd@?(t,I~4~RB>@0ʓ86f@>>- ]| [/'_O0TԵZ!!( (6 N86=*b28CY~ t T8LHPOOi#>U76,4*>B@p-^#m|c`,3 FcF # W:usP#P>g+%-0 rt:ac 09#? 4PWS XmHsK$4>  P\S30)T@>O[ ;yӵ#t#&֡Ww*@5ely"# 24T 05 hg2pF% fS i8kPܿQ6AЛ^!OE72 :q ~4?@ :K@F3"3x+lb >/n? =@]s ShX:k6Hzp ZfˢR8EУ(]ZnuԖ M5 p7lF % {rSPlx2D@@Ss2}lf P_F@{ ЌV#z-9@>PfuYF@Pߓ`"/`PI'G)]F@,'@pK@[@#.-Z u5pkkˤ2tC[HTYD =pZLlbR@#C`'@߀3u7ۥ; GnZ/9p4 3GneTa9> lpTSX%!6L&@3ҲW;i`f: 'i @:юg0bOo(u0&:&`Oc]??|px > ЊOxy1d}$BIr*jT3T(R^AH#3>k vox:P]Ux32EؔTpM0s-n/;F@&8]zT }'XVN ЫYT iL#dZ 5x\~oi pQ7V4@_ L#ƆFZZzz>60G&L`v  htRvoTi8|Ef,7sk @)=D %6?!W% .D,f 8q (cxceQ L 4˺mB@BN"@U 8``fN4Àxlk9: A{[z>jg#FF `tL0`kb y|*E<_Y&8`2'ueD{ @ Df250n0KhP=E ; B 6@H__=rz|I|"V 67ehj,80J}*J|矅]+77*pgp-| C*6ihrQ &$M2ހ6յNbn3Pp [j,ٺn #%HAu+@xid:X C7%dsH=@?@yl+qkl"@s =)qk HUÀ@ 'dIbP!4kE`7G"@,/[ z\ ;) 2F)W^hЩ!hhhDŽt$hΎYCݝCٳ$gq-Nd1"xV8`0_r`kf5(7xEA10ai @ 5@7Y"@ n0 j#ؑ#X5|p^"$Gi0hʟ < { `Ǵ+p3 [/c[7}>{pGs?cu8h@@<_>>|Qp u4/h.@ubfct8@Ckя#?<-D # q45,€2:I1Pw VȷMZ >ӝ&vvU3:NQ<.@Zn iY+E]%"9s Pu @ ;n# w@L P@'u0;  F$Pie= \lwVl?"_tVn^.@2m0d<2 %h5:L]4:~}> O&>f p?^87Hȿ _?LwwT#P,~JnAYז J4epN(?Y~CXjk|DEnfh)T6]>Ɍ]yv{i@Pn<ޚۯFjAC߲[.]= {`эn tx3l=z^O{@Sc>l@2`h:0FTx&$@X@C`o7GR`V_a9+\i0\GX0_YЫoK;9c`V̦>"3{m P Sn:5@H!"8`7À#e`U-<xs7Нc08}^x@gg*;?}5cPPaޫb0 j2@0AiW4@,ބС44)F$ u{ @KHǤA $@Q /|a|!/Ṃ%W- ċ ~cp߫@qP@Pԝ,r%%AoD6hkvMwoo=N' p<S|1Q"@/ 5VP6PYW#-<[73|+u,B !;, y&4"`J~.$ehXbs)  [@} ~/> Bj1fu12,Z*Ї $Hlx(8=P.@(줛Vx)jj}{t(w1^[e622 À :x5@{ 4sOt tf,BkD EU b,ųNK<Mo#|Eh _`(jrD$PL@փZJ@ `3q u MM+`> Foi#V#L. t#!Bklڗ$ Z ~#7~ Z8e"78i8 r€ѩu'נ' =25\܁YY S0 n ȣۆh< J a@ d m`1PIerڞb НD&q>]a<~YN~2|*ʉ|O|~?FH & /9 anmA@FO '[p.fnf NN@UmHE ;NhvùnGi܆8<[vp7Q["@7B@w Lhk K*@Ff*9Rsp3&@\T ?"ZBZ/Ey /[ UR?J@b@-받GKpXn.% €ƒb@"5Q :~ы@7P:|4\b_`nvWn$@tZۅ>Q>0lL\"Xca'lP,9A>'6x 7 @%؃Trjh$: hRNSezc+F0:96; 艐-Po +`qU@/Л{Pmbo0;k &7J֠w "0<6d(`5lLH@ FHrG: $~/0$D.B /`w(6V&zngꗷ!xG? RCN@X GIFb1#cѢ$sTYPu3G0#kE PiԷtCUNզsp4 ߝ` .b P/\`5@{+ X &#]gdP(@g@.fb8(4[ /.UO:1؂=H]2tT5KP4k:?׶N=QqU#d"\Y\|o0xZl5c@nCj\kR:li+ mxTPD?@Zd@o֏w4O ,o ʎ/*DB,U@ h\ov۹8@fJhM@HA Dx hj5tnD`@7T4᭚ax` s*0KPkuzo=- _!ߘ `v f9n: 5@cP'VIdv%3p@v m"7,)"D%yhPa@f`Mt ǡk|'`o0tvO@[82N-+ @#;#ЎЅ?oAXHs #1;<0\b uBjJj6v*8@ݶix6o5dp@Z({ٟXen?+lgykR.RlG'Ὗ<4uaa90éGb D B~[ 7UſTE0 `lf@.7L;`0mUHuLl#h3:٬"@wWtG{qni60 ?;zgST] [@wV.ފe~,q1 xsdVpjࡺ+NX3^7 ;IsӋ߃^tGbq=u u 0@C}odx*'vuu~Qm4 hm4sO@ <be,r !:,c~HުUnZǑRA &"R#~p$Jh hU ׄD" _ސ4nedL. n;:쉀P ^L@]"V5@GPQc 0:Gd-5+% }Ÿ⵼)? $'.A2=5!x90/W3}^|e܎ NA2<P"$>O" $@0kAa9@E_2(Wb fa06 )0$C#Ii o}n5$u^MwfSoj${b`&fFΌl=dNkv s@;1+ @7@L$hpuH( W#ۋak,+5@E_u ^,]F2w l(ѱ eE>=1'6HtҎ?1.ucJ&I&#U9G BHFP FH"$ #;(n@?Yx"&HYx.wv-1X@;@O\whc,11J`У `ҕ](t2 zy @ pD v$S`@!ȱ <$T#*nO w T, =2 @i|qhO?U< ~ArC=\M#pfh O=s+{oO28s4@Nq`,(54vn(9*& x;N@B![ @aLnPcw7 y94a-P]~8T=3 ߰6WUڳP[kX44j7lUl@, ϟ`z'5^A@m2G@(H֏7) *l+1 \bxZy |G&>nݴ8cO/&8 kQHn)`k %%h,7_oP߮CNɉ.: qd;>Pkn1RJ#P M3]b/nqKHP+LRM4x}8 [f`g5&*@hԫxIf:w*hIhG@ :  쀳WWX<xd:,!.{`e$7):y PpIpߙ9~|d }3Dr# ~T,dh`bc)'< <3mwo> }ç jT!BP @!@uq!$Crr=̀nfss@{#\炀. Oؖ^njn7wAa]?k5 /+TI j'l'49; 8ج`W ^ǝsBn'@`+2bP+\9 C\ : cs{*`[ъ8.r dw yYFohp@ y@tvv;n r407ήBh7VDDcwAH67) v_5x`]X^,[YA`{xZ9藫xD$0@ćpbo4@=g@w,^^]Nmv=ş4mPtn XZan^ x #tɊ5\0{yg\ fo~3Â`"M0 [4>Վ4MnaW?G/+Z!&? cC>RcA"T@iS#F<0;qs%W0 R@|+'x#cZ/@Po@1 L@,klgQlqDbpqLCx Pu p*@:lɻȣ*> նjHzZaZE xL) _L` Xd`LXZٸ&(ZZt$p sHH(/+H=HI.7È~xZ)-7 H;yQ8vo8v^n$$m7]~ï?zxdnh3 #z` -@e Gf&W(Гs[ŀ-6P$1@17J"W #x8z `9|lG!af{/ є CcĒ H)|.Bh*ύ:B*<\q? _ nO'xr@`*$yD"@B%~F#Q# NL\B-Kn'Yk nF pEOjpM%elj Zng)HPT|m\iЌO^`y* ixrdxqpL0l#@ PSXvl&@*V9CQ l:V\6@7~/ KZ.@Hey sjk=?,P:x,Ͷֶz *81i4 `% -${77Y}~ 9)rX!L5]"î1@( Ф:Hmן 1*jdtnH`nf@o"@3\p7N8tޔe ዐ җgn2xJRN@4=EN]C8]pNí_ w~3ʞ>DŽ@?.}: /#xհ?gy~Q938h(sn N-ぷ_s3NPd{nd.(H@܀x:kפ3؛)tj4M>ПuAi >4j+]@/*V/Af o 2.Bp~ vOnh8SmM`w<ԅдuJ' L"2t `!@M.3rz{zz(Hikkw!`/0y0^)H^33̀kUUS9 ,|Vk~>w߮&i+U@b]@xC.?C^N&@У `ٷ=Os_L!+[@ff@6ZPlx58KkgugX9 58wR?Q-"K$>13 E8וuA8GFW'9~ix_} ·~,r/ AZX$%9 5( ˸!>J FtL*jϏ?&@A `` on jӟ 3-qD'/#lFm`m: Vcu+7LPЪ8Jl/f}ʋ {*b4P+ 0Q]kr;!.@K`mS@@.B___ĭ{LA *@@G u"y@Map̀FΉLJLh`W:Қ`fcg7@ad^ȟBj['̓^ QM&R^*7@Z&5@kP2&2mu.T`Yc zqQB@=V#[P"@uM :3p/]9;ꖡ)"`h<TW^h}'*d$ wj "Xe3Q8K |ߵ nomq7_|2tSp ! $PCx8$s8Fy,'D~j9 BXG\1~ (l@BXWOW-|W"5-@! z PvDW=6lUi5D7Q8?ILF\~v*.KXzs/a Z X8{ɠ6hpk! }ʬyPw`_#H qC(<@$(gF^[\l FMT|y2G#˱,&p FC @u3 Q.َ+ͣ<&* m*1^n0?)x6 V̀*`Nl /D?vod h zPP sp}?m &DePc PX] D+3S€(hcx|*%hßUjd( PM 8f>)>tS8',D/B,h ¡0ZFo_!+nwsa9O sH?y"I_A(),ލO}w" fn8@ 4 ol̀w14wN@z3(@S(24M8+* 0+$/`9>_`f?pJ4h@1Pպ7z27}@kB%Y4s4ۏt g֜@ZtyP?T=5V^1 p6D tw?dWo%f~*g`;`M]@u`o2PVx` mr|*g vMj@?tv ^ـr>HC`v} @^^c\x mYu(C q23%4}#9[x.LjA|܀n%|R],,hXG!#~ @|jZHs?kExex `%ڷ‡G}%? l?~A (p@~H `)~Ϟ|G(>W{tuߍӂ ow:hn`| F @mnϝ |*jþ)~,C+Dlk :T` 6-Nw H³ϐψuQjnIcPs 0p2RP*bk 7[x9yLT.UY*6~tz :*7 $Bx*Tso5]к@T⿽ǯVD :@ֺ:e?nn#+`M * @o1& e"ɰPJH6GPJ2Yؙ ٔ 5VO ?=bspk }m2ؐ! x5d{Bm <pgأ*`@Ah)7>iX<Ό5@:+MtPh 9g_;"k?i6r WAL A'($'^8ɋ'KC_S߃_Oÿ/GXI!I~~>wbA@H&g``r'IwKLNwRC` DBu]HAu(:u po4Z1 -z&XNh`od^&h@ſ/0tTp6@nP۽ RX@ Ջ/U s2G_t*gҨ@SwZxtXvJo@G/}|] L;掿0[\'")H `/6A9.@h &x+s˰!lˁۿn6?|~:hC0N@,į#" 0N]tw+z ;ygED62@A{Pn@UTԴyobvzί YFc% j>TpΩw@$- a]iӘemil{ ro +P9v7V`{ )S~-SW2NP}{ؚ{8 jfo0J A8wkx"P7@>L$yzCo_@{Dx@$y @*`X49u8\w/ժM,𵫜 H`R[R&0*ЫB4XqgM~c t BU@=c @@(sv̦t(P [qB@fۿw -TmTйZFb @|!6rF!50"I~2L} A<=]5NuZW `WxgOm.?~~?s©Na B8p48 E~.mYRQ>؛qNl' ? 7^FANn@ PڠKjC_j PF@8[0iov q#v  8χnT@5h`P)j7(L2evL;++aw5xED= h _ha=/9`A@@_Pv26 ` 5]#1Eb O|2}MV Տ! <ɱ q \v"YrЪ j` !N* eT-",Yؒ3 Ojر-AaD:? N(\`.k,7# fYL)PWO2K8PvPVVIXlhH` g2Q@+.kG'Z_,-]"eQ6R+ Ā)G (ip#cOHe~,5SFϭBux^7:P< }=>I>Ax0qǢ1=8DJ7f@!Цr.) Ls( ?Y fmMWQ%^i+jN?T-l PLo?{ PE'Gu:f ^ h2biγ r}`v 2<,@CdEkjР)N ] {zn~nC{mmmS W8 ' Ŵfq@0? =~~F(@ VI]r|;\' Zva iOÿ5,:W~ZhOBH P@@gKEռҧ Pѯoމ"vN [( * @||#`z|󥴮VEx>7̟Wj<@ivyx;L\mqjC,fd+r"z:'S+{+%K\ <.bpL@n%/ LBhy^ž%* ˍPZ?<%R<O_%+,SBB8~aHG3A_gAq4)&9~AAA[L d&t# FP\A6M }(8R@A8[(]K8hdv@^ @fsmk@ kw@#7c S*@UkXv-,Y*(C zhKz.랣p@dPd06( 0 ,4Ry0 &+ >_C? Pyң U@5wKf@,# MhJlLa XE* ܸ›J6Gg77&:l+4Wp~^,^sBe(_dB@rċ27]_bm 76Q]M6,](3[ l! ' jjU*68f%jJX8+5'cG ^$X -VSzA7G F!Ÿ4/AtDpuMA*_ׂ_n[I#[nR`&G! B4D,)W%@BXTswV@>v2wjF!e n6 "@eLItSǂ]PVoT&«iy=j hrLL@ա56n^JLZ_r&@-?Eoںgm*Z.qPuײ`e>,_mqO)e"PAuWa[2]et- 21-]^!@ ߇^`HA F@榦t*g=!LSVФtr7â& B n!^ 23Uz% Xw^n\2hC WMZ܉y o eVf2 t#֡/  :* dhlŀ:@d88-Y+i PcS(ۍ-z @w '`Vnޓ pi:(50E {?…`Ҽ_8hn*=￞FǓ<$/!_n8Oc3_~ۯm_ 5&'9D8Y `0H Oq2?Of/,_&*Jl߬f߿[z HV`|>yOCuk5r +rPuj] o.:jiig@u0HmdnnpCiaz*M6%H !|n^, [IH+ xŒkXkV:<.Bju(޾"`mD !7| Ћ ) q.,uU{td7p`bn Y{[ 3P ZCpV#*xLpJ  `o(!`H<Ѷ{j.1n>x\C0y\.D.6uD6V/r)k"lf. sl[p&.;&mP2oE>sN48~hcV~ z58rV)O7jzK @NH'ɗ3@GzpS;Ogg5ï}pg>)xzy0>{~_"ombxtjAoEXK7-6݂nAxĂn;͎@]'+@>#E՝jet`@ jIr = ;z?eP:gZw?W@= *6`hF\ 9 j ]UBX00"kL 5i$\"i@ͲXOR?)]A VP  g@@-C@Wgg ?yOꊈ'swwU,p (b{{LY%pJYdT pS[o4\a8,/ ! d LBۑ? OkK`ZTct\e'&x(6 k L C 5xm0!:Bk wS0ȡLmV"@W @Ipt葛ocX! 2@ 9L'­7XK7~B@v\olҳTZ+@sP@@Wl"XCB@vkG@ o%l(0 23yd[ P{ hhr@ng!a%&pch!`<8}N-d;wvkӔh]W|5 HEOoUѧwh^XI3@Q9$SN\F#uF}7TL_SWᓯWÝ|s7?Y3MO"(B83oT#(b J 7-TIr/~Z X@H Cz+oW<t]tJ@x," {/@3VOx{_k-]Pko(`iNbʗ`K/ҫ8 ?8CWdž` 32d@7p~ 8t60j( `9 \R]Z;u:T:}A:|@0q,dRCĝ"Tzi@586pP z^_̣~N4B\ɵ0Gy@#8~m}xs-شR?z*$_ p#cr*bڂ)|yugt\ 4bPf-h;Q `Ըǝ1p;:k.Pox tVp*`ֳ`W+`_+M `W`[4.:2[^GHl|x[ Y +X.%6*22 {cBZ;ZbP_D= x-pK_2P: B:0NKt!5 k*`eGao д / !s"Il*,[fC r$!Ix&g^8"iHh ! :tG~90d@:7(W73r[{(Zw2`( 5!/a 9r Xҋhh#PÀ 7|g5?Sd7Ckp{zc/[j= oy$?*T HLXi1|Y"p}fW xv{~?ᣟ3CAM $DZ#Θ!{~/s]GPgvnD8~7 `5 eVv~E=Tui2HPXhuT)c(n4g]_\ \hoyó| 5o)\^K".Ž)#-[@X9@xP I,Um.b_e 3& q ñno6 ??(̀.1Do^#Pjhe!`!M%1H &z&@Oe&jX=U밥h=%,ɑ54!<`MgXAz.! " V/z Q9 3h荀ie ,n7pi$c:; O@$5]&+*h @@j?ϝcxdrI8 ?H-~Cko9 /&9zo@Sᧂ""fh ,ޣH泋Hov @ y$= _y~3/~w }po$H09[mP\T yX`a:]OEYKj.Fˍn(pJ" m$@[ RYP8xqό;TfWzciԵ<ȜwT\+Bػ uӥ+5kFx!%:@Ն3r4;C:~e7@#>coi,c{{;>hI/d׮ݒ1 Re ;@I d t3aKB9(h8$JI鳳pbr,M %/Q:m ZLdMToULcs#f6 ^~z of a8ϡ5|,RpV"~"sf,szI;8ߠ#R @7 7T!;P@'a 8,Y[}xq?-][_z~eq|N878 5p >VEU)[9I=@(Bx" -XPU6Fotfl692[ 90:^! t?@4_ژ?9Vq&exl(G]%W` Bړgi9aBZ2׮#xNjnze4jnPHE ]]PM+*XQ]`en)_%ֶ^lP# IŢ( ^&V^iB@X. xH D4<9=wnuu}.m!@BYt` 5pn>pgLXu@V5)-;`@8C B: @?Fj:"P8#ixT1|*|lSWEpJE? Hܧ,k@-wzdC#] vzy $?>OO>~?~:pZr_P@/1Җ--[XBX"DV4lx#Fe)4юTɀE2sy!~ L:S2"U{\뀔:cJ0! CjE]@p :#tgܸ-.@cH/Ýshe&QO~%߇CZ|,gy OaFATE ?) ثXsE3Vg; P@ai-@;(VxSn T +_%ofRw/E?{_LWof_njYf4อb_ݥa[5x'#zY.i@kC+_0)9K @`Jz%pp/jk :Һ+cėoy`'\$Դ%rY9 Ypu !! $ 42hud"VaoJa|[r .@ 4.B4%.xYLZ`) :gvlC@( -v \{\yhsV @@9@x>!4<x~| c >b N4 ]E97lu9 5;T\paI--ke#6)P"*)?p| tO*cgđ`3Ϙ5pMv]{;ge[.#\NA}VJ  W=K%gvy_W๼%x7*xg*]Pk֛͗^Y'Dt @Z;HޘVeʉ"k9dzz׍ ( tuGGǸS #`؈`h@Augo\Sl)~Q`"@[ `aT8 Ou.?6!`Ox0<`_<#8`" hcvZ+!нm 5p'r@  -l6w|_':NV]yR%(nBUR ZĠ-zKZ}k @(ݶcIovcq@thó-ihv'ൖ>8 ^0s-A2 " [ @8?7:⯏ V[U9T?-0 koSI,,.o;K᛹k ր@%4@h@o@ȹ1@i;/ߜv_@l7BUGx7]4]r^șb=r*< 22H9m=PlU'09d*}FpWP8Nƛ tunYY]@u#-?h`6N| 8 @%"DSe &PH~kj/@:W) 9 X@RB*5Gnt]G-`1ŰlE1u@s%L>J " @Xm{ ,@tN^N5!skM ЄO@T9H'|U>z+22nëyNF!B4R OB$tOZq|rV@*ϒ]Y?@y6_\ %ePЉ7Q<Li7Zk K@/?_s[?6=27 8lmO;PrE: r5xy[Rtv^ S疍4z jOj%RS~~rcmϖ(7X A=2= ѭeF?PҥM ¡7Zn8J\|_ 3X[ ! (LLLJK`!/C()@Xx Id@S\Q.\dC !g5:`s@kh =l B@w6@d7zvZ?q$(G@`0Ds[P6%@.[: cu,/9 HDA'#niGNac'},% 1?{$D(o##!| ?g@@ HʚF,4F ~8e(];Q@::*=)( 7((Se]d[]I@ſplƦ@B@H?6@`l6W?zLwߌXkPzMAooϝ)T_,^gV^[g4L OC-f1@( د _;XCuX$`ScEY,@x~-k&h!`p# Hx _(]ɀ#+->!$U8PK6x2(Z4ȉN;X0 Jy 1@@K@tq8:Vś [`;!p s `̘ F<\S H @@#f|RV:s J@psvu8ӽ DʢOorlP^+J`8FzQq%g@Rt{@8FLBkg/Q?u6Ul+ßuD7b^i~ΟNj,(_RNj;  #2%oqsKv/ HuN pPk ۿ;O~ t>_N:f9e*ڗko5x!w vo/,dd+s밳bM{ <_@B@j/jOw*;rNimii `(N0-1@:`_#"(b!` {WT_tt4Y x|*&[ʫBP*h \"5r*hlJ @@dE`60i25 z6lyZ (3 c@7Nx0D[" B~% ]Ф׷d*Vїt(wsF0 |џ'y_Z .Bqc HH +j؟<0@%")7R\n C ވgBjWs.@.Ѣxh gΧy41`ӡ[:uVPwX zc~ u,1w{}ih'{-_߬߀-yᅜIeZxUWXxTi{؆3njR@>5O: M- H m|5ύvnY_[f@*=ﺺ@!k! a QB@t@.C rR"bCa$k ~!E.ӹtYLg/k5.@+ܶ N5%T:`:`7Lfq| 󷇯 )Nt[lB<蒷Pc&6cc*E \̗!|[cePҏ9H᭛RgB@f_x HPbK "GCWZDI}Z[\|*)BSiU`9~ϏSԯw`NAû5p`BoU#`NQ-+gn{bKl%QY JPe 8^9wVz0 ahRx=Ago@v?Sߞ/_y%(o _ӷ{[k<ϙ΢Y, x_'ήHuU@jk^?^:U^_~f4@a*# iPWW 5nw@ q}=/7@>$@!PAc01g  : urz7Xx^m^Vx+:A=yn :@4['m[~OiZ 1`_X  -(s;dޘp@x@y ] un&]MfEt/;Π0 ܁]0TwWuW/RkZk{2"25USPVDk׮]$@StPT,@n |eZaT8VAZtL@ EF3&g1H|=(âL84,RIf¸Fh AyşFRCGgpS}^NC%CH% =\~۲I(lAqHU(@#^HRZ ^CX$!j kH8<'Q0A!{OZk-XXo4.@ h| cZD> 0 #@]TJy=SEcu<.:|sc Xy("  26ktoLU h=(@t@=@'!pm0lЋGoK#= P'* E8 }*%P&@Eh 0 7H(dtcG0.7 qȩS ddH K95Hy` J!'Z`A%` 3d,RTON$ N3yh'PN̸Nz~,*@Zc.b Ы%լ(uj@?̀V@+ NWFY*MLZm2蕱z = exD$ g6L Hc0hUڟgW^JO?oYW@{h?}nK댮Kt5/Y?_M8P2`Ȫ)wz9Bu`Kaw*_M p'LH?&HM7 Kft `0.xW[  S~$F_)GG*O X @j8P ֔1I# X`]dTeܔ` d . \xAŷy`yYD @>1;m#9~hȖ$<DpAv@s> 8'lActjQ}F) ^x٨h-#+(J&Upsz{I{]cUϪ8#Vqo/>(EG:7of⿫"ȶi&qy7 0=¿> ZEJ?VH;V&RjKĮ?e *,G2>O"A](5[IB8VZ]i>cZmnȪ ¾(lCh4 =x M3*Fn Q%4P;_TS0׏[_5ϙ '&g?;T_X^/7ñp#  vl[eė%n $fJ_}(0=# P7kPGo[ ++i{CSSTA7vqx?:>ڟږ"u@ @a)H''"$"@zfU C_X& >^ ?Z߇|ϋ8JZyPV wj 埠0K@ϓF]3@R(s/  >(fo!5 ylk9%?z.7x;h4zg-Z4oO.}0_i8lYoO{_9ܾ,>P/$y+KY @qG&g`MvHOu")Կ/awn{p ߧ!v*Rda BZ Ay~i:`ܪ} Btȿɀ/2cJe#z"8q0@ݒ N%@ MP`l}7l!b( `R*y @ђl~J4/a@l v@!7 vAvv1"CVV!N:q#ݨۙ9/%H.Mq*6c}tsz~^a X{zv!"(_^q% U&s ilW27;} H^!/!6w@iMܮ kH+ "T0~^`]ޕi 雂p o:T`p [X >]PP?@;y3 #I;\} aazq '@)tbj+j,ULUiz$`%=VHjBBTP$>AR dUX&E%^'Bw`ثtí @YTjuaUQb`*#k)($:g'zOX_ [>BfUl?v^WpOpf "oqp~accvċf2 c+ΊoAGTP\.|m򟝜 t`/`aARy~%2%: . <>  <.}# m6=6ub-6٦6gP* hD\hh 8Q5 =6@ WW' B?p؏}zP: H\ %~p&BÕ@d@'!hR/tQV ԶX@$<P`#2Bgz3옕/rDkZZ.WFFKKJ;\q#>OUp';~:CR0۴6_Vq 4$oEͭ]1sUj+?UP Ő_j;Rm$=ȢqD~ ) ߭V `Qy W@}'UN/XK XTԶAqU'ܬyucG{x4@7?!@M/@HuTF 9P5Iϙr<p}? hCGp/RϩI88p5pn1`f/eidN&՞7?A JaO2_^d_u?ݮCS"&@|H!HNR4;cfAVỳ<1@\/ Axbnc4} &n3o4mF p~"(k*q m  IQ6G8, >F2>}Hrs[~J>^<8h`W\ >$n~jl2 NOq\@c~`{I%!s4?w**~y+.]yCB߅*|!'C`{.)Wi} Z!8 " 44u@qv+*,̼),7>Y% eU a-Ay hlQP *`1sp-Lw *FuU}p+"UyLsWo*l@7OoWJmO_-~}$|vg"/8%o,x[) pb 36ߪ$qMW$Wg-)'OCt`>uǥE]?yS.ȧ-.HGi'(u @ "0n;70 Wm뀷]K"H"ǁy p-Spr1 1@6P\dJ G0ų(2@3"8F@4I&ɰH@AHn@$ f+w@M( |&e ~^"@4w*w::z z5X.>_pA?]`dm"r3w2rym^JL 64*)IpHVL >ML5 D!bG_@#\|"WDW3j :[A~*mU g¡w:|3D?2R,6/e;8[NVM!^žJcrޱqF֘C_RW*/߳F4 `͛׿@R  k1TJē,w: w1uH`侙 h?l @F "t66lq@mp(P ?Xgҷ8PL3m6" d&>i <(C(3H<h<D02NrTp(C$Jh&@ԵiIM #a$+ E }ߙp3#kU}΃4 -FYՋO:ZJl'AMm#0sZ L31BF1i#`gyF.$u,OTUGU 9>iY 0?C$@Tt^Q\z *dEq'(b`~\',%jH"H xB&ɒUMkyuZ @q .UGa$, 2:+b F,e@@ez9xk60XIHu!/_q<:<ЍwWP/NO7`rX*0L$%s _M-'ؼ>uP }uruBt/XFq 3kq8?*68*AXN(7,>x2_4{,> cS0 i` |FjE lb4Ki0TbgD>*{d'g,FETT_7`5RT%{IkTֶCQ. #r&u F@f[2@A +>XR$ b%"Z)+w͹韂F+FO7`n.7p¹p3)q~6KF_/*,7Wu !oBE&YA$(?_yI*AX mfmr)B{s>ZŒ6g{0*Y>])) $j`O~@g m4} uo *_9s nD zh @|B%npjI04%:gMl\F@+E$40M _L_<˭ .o-sdꩶYp GﰫGO'z'ZD૵<(y H=< QE^6FL pHFN ddceaeBFF>besoH(dl.6(\T+P_Ty;s aҢ<0(d$5R&I Iy%d/dH)T l+zV(;JmPP킋ðrFlYo4 U[Vd?aP')c3nAٿNo7%m{t |4tS0/O1ʂzjOpj $&_%g!?ZO?+'u9"J0;BMfq8ܿeWSu츰6L}w1Qc3PPcT@0r:CZbb ngN<e,o N,&bXs8Z ;VO&3 oآ|TbE )/, H$as%`=*K88 }" x'i}p/>?2 F uퟞYi\ŐvGzF)N/ipz&ܼSiJR\ P﫷A/9cNeEmXBAD%S5\V'-> ˏ9!@a"O2YT=57ϯ9WBAZܵA~Uw:[#}Ͽ@w x4 Y@7% 5'_v翨@vw>;%CW !5 pzVLþ9ؑ1N')zl Mntt?*2o?5jO?Io8|qr\YYYko}u5S/|%Hz*1@_Ti 0T*s @q $61-?ۼ }sX"R%5|lp~.7P˼ @2 _n,^n(-'j@Sf@{&MK.9 VMW(Dt3`-I0wE @J ЎM.H/hQK_2<30x=}N\][v3NH@YIqR-/1y|Vuv@:D 9lm[XH@+n.D/ƷoSYp#-n*z<nɿs:y$% B> ;+3Fxd @b")`PPƕ#@?V ?; YD/}: (GA @eo+g*D Ф@JzywD#cq9ЖĶ}'g fI79C t3(Ue98Z K8[|)6 _<5g{/lݿ3"&Sr'dO$<:;:S?#Bz_'N* )VRޏ᫑n[^tSc6R&@1l1d*C(]m?ch  w @p<L%Kp̀)1ge"˅@H (x +Z 5m=$ ` =To<.ZC:~h bH =&Vz@TZ H9ELVI,w"u2x Μ:;>nS L 9IC /+7GR=(Rɓ?g_?k.{~og@u?"paϲo U ]f$O,)"weCyoTj?c7ѣl)?`|bz_خEq L"ؙǁYb .q6-62 ԃLug6[s ]G\\n# |䢆i_*% ̀#K gIW#5m''#L'`&N0/"1|11W]LhD` @ b)VP\/7i $iZ0t6#>*2J9}~> q 6}\ yLErl$[9`V4?Vsn@TfHEq&H6@"KҊT2P ]p|&'`z @9W)~~qyR_dj Dbzr_[cECy"tKvT]Rom_ceod lpj`??+O~#fϭ3' UKXuZ>c1Pt B" NOOXbYJ 6^HIlL@ /2>A$3`6ݛǁlf@763j ѷ /I-`8]Gf@ Q*_ ^1@ T"Dh 0$T?BdXV`$@%Gt1j7TXFv'8)m2H16T@ye(*>s:+)ou,C{vbJ y r\|Νg^ spy8o_t^ z *|sWnr5Kӣz4gpݸyRo,7 7ӿt޿z&\ǯo_z ?\uz44\$CG=z":z 9v x N:pOui$į ."D 2O.? ??ƏTD}*"҉"P(RDDLyGQ:Xfz!W­ <P4&UĀ [n ͉\ W"Uˍ&P\\%5PNj@y7AF)WƯE4e!E%GK5j_qG/z>2^KD/y?/W1Yu?ulk~4JBO-ujLx)vOYcϾD_G`T4tsϰ90_hr?|Tuo^kKR~$1 8զX;=ѡ>wﲱ@!f65* @z4 @ 'Kp[F 3 _h8`.K32JGZaHAj%PpIH @?w}{'% ndXWKk>s  "?H8l'^@: ub f/FhN$_r*]%v+ ,y8nvJshޅ>|rt8u<;~;GO3G~~|p??v\ Gz6ۙSOvCgBn^1ffXTPXE3PFHuv|n0ާw<]h(c QL = "q $8" :ՈoKBW3.]2>~*IG\Auf[pvoF\&ɛVBqN1uF zN̎eF5HJl$DKy^ '*' p,*` m6ya@By9,~ 8*J3GLu>y!̀$|@*" @ T6 ^ z]S"f ]2aY* pHS([Ф68@&@uM TB 7tB3~#BO^^A>q}zTE CQ6RvMm}=zDDH{{O݇ՀM[7wr}i7|]ݖ}?kiAjCeaغa| #kq؆Ă "GD0;GN\"@+ }L"DHmD*R(^L3̅۶ӥqK7p iX@d0Pdʍ~TĂ޾|>f%2aiхL@65,&$向]ٹΘ_\9V'*&'zD`K{$2,R[e^$-\jp-#@$ Fĸ`Lz@kĠaA5 S? ?5?w??h$yX-?s B h Rj_ԑ7 [\.qo!C0BGS`8Y(%J 41sN52f 3~ "3%.~3߉&3`<*f<0JD#E v>DD`WPCAbyF5v"@(G "B% 0+``IETE&wDОAf} =n7"Hw3P H@G A:\.׉N@0c>bFTJؾ֝GLQνǑX`BAH&Q8m"D0`!-鉸eg $H" g\n9ƭt,õz8Q6?)e 졵pzsEn~Y@{??:$ ACw3Ei& 7 CIH7S%fs ;?r?׭V(O3?hk6㕓.%β Xӿ3S/-/v9W)?WRGb5x_ @?=~oݻ@R )xh.eե <> xT^=Hf@2:" K|a{cH1Tk4/z-A3f& h$.©y$̀ P'2/I4'Fiɀm*N %,@0Nf@J` 2 7WM\ |m:H@b u ؊X)1G<Eɋ/PBE€L@/fr vemH&d5AecXEPm.k$7"h%[(%m(j+|J|EzD@' GFB!`2@ 0w gLΞ nw#* G1'ov1 pVM`nd։'w?:o.Z؆ۂ[eۛQ E(G z1E*v; {F"A$0Gȉ <8zr:A$$o pY$T ¥˙pj\&tQ.bKi,\|i(} XP q=U$:*;0gUziYٿ8ڒ/f{ioRvXbSh[%c?pțGL@RʓQj:ggGG'9?k%U"<."Y޿ecd*ڷ@ GP :gnh`b:]y jJ h 4 2nhH[+pYVXdcJ`y x3_2:YPf$C0.B__|9$SH;zLlaڱwZH5Iu5HF~_~Lw~E$CLЍ Pa' @$$?B^K *줦8ܚzAh 梙IG# 4W?}LE:`tJm#>+UVjT`&+PA NpS7&÷Sno6 D .SW$KJjl@N@ ]1PdAV@Иª6l%  @BՏ~QU QdA'elܪȃgҰs ." :q=D _'/çW"Y8y:9{ JעQ\6cGr)_bBu  =@A@OP#Jw&jC)?ҺE+:$*?_%S u?joP?&wْ/}U`_1M4vs-{6?აw KbOt㋆o\.q/iG8a2<3_ c6af-"xr!?[ސaxxl&}m#VB|%ih@3:d̀]8%3M3`8`%8TgILjްLt( ,̀Jq4pl<%$ @Wic:"RY&0Hpr6@}@'OFTJu eU`xK8`"PR%ej-CPVͫVB"M==H4ІOnD ԩm8<"`N?KY_~L'A_8PB\ +$@=pZ (G_*q9/>V#J?vJ|>P@xT"Koj5[b uP*(RT>#]fު^CY 5J(=a'ھ ÁS'ǐ0f8 Gr< J߱GeKPX[*/w]=A.d$G5$G?8D3=K`;;8?` :?OsӼMH?Y}%K͙z2G^ in2}30dBooȈyq'pXT?u=>y迷8nﭪ|HUXRee^nwh%PhP L)L.38_^Zd@t6e\JfaX/$e`8{f<;[L}@y&媹zn7x2?4*Ge @TPh;Z$TMÏ*ϠVYm']S+>.&آN&m]=(_}t@fAzXpՍ!}$|0xB!bO ş܅!glƃpo^kgs}ίovvwؕd^ e+D}]1~oYr"NHi!؈i'~lزAva ؽ$Fb s%u9q΁ݗkas]m"^6?Rn oHm_t Wb0L Qǩ *p/.J;]%S?K NsmߔmѿcB'_pH\#_@M_J|HV¡O?9OME 68G+))n߇? UCQf^y"XdPF1>3 Ƶ1]|ih@"@lc-Mp4'`uR3eLņp^(z s #HH?N@K̓?6m*F@Z5"xĭ@A@(@WAĬ%/J=b@/V<V<@#&8Y1?'V%PNNd8V;.hF -4{ /m`@~Onz'A<)G|;IDAT屭  `PH}Z[]M6F߃\I8n:`6;jcRPAJF._ݲᐬt?ķs$߲2Ul6Ov64<ksysC" y6gk'24cHJeO[WzB Fq1iX /(?*#$F?_@gH%k2w-GW4óoXbU[M*i\K ?Ɍ`yW#+XvspO$rm #Nڸ{=1>ߛHI"oXN /V6zHt? xf{P*m? ;3 ߓ* lf<_A x̀3NɀxU-Y˰dNÅ&\gi%T#e!z+ cH34g&p Fqx`(VC8aESa (b 0U#F~iLD( @M]p#4Z O%rV$@"mH;D Q= @.Y.z[*c~_&A1ƀ F`c'w 6nރlB p2$@Hߩ7kQznГ}Mm3<k>W uWݽk@ Q=D׏:tZYk/9؇unžs؅0* -:@y-"_k IuOW!@R l]ΙV?_ |D09h/@;v]0F쯶Gפ/9wϟޘew @Cdߐ_ftTOJ?+bߣ ^pwwv'a4[_Pd|v>p%`9ed_ `U4 =B|!Vi @LCd|n] óx%WN+J I J*}—piP(cE: -# X Mx`7fn(<Ȫ4@$ TH@t^az"$l*0 1B}@@ o?UCU@u3"fn6?V3s*yjQnc Ԣ@7vATT(W&@UJ ||o$5|ωhNA ` "@DH<}mII޸g#4wI u૙u^(fQ/6W2*z)Wۉu9p|{`?vo?( .Jd$/as s_Cn Œ,J/ .w..sS@9`!GЧ%1F@Zmщp3(*-_2@_ww|-;p{v-Ow쫏:л;P$`6 GDr?KNJ #ث:@5u .  ϙF|[: >@}A1[Zo??v#c^Yb翽oѮ쟂r N2ʓݿó?em 1Xfef:3w)/s~Z>aS?G.㿮u()9XxaO/oLoI@Lj1^ =*Vd&~&x?JTU2Kq&<8#U2 @8";|%2TOp= p%yUvG ȣ:]PBOZ( >f#6`9<@3 bPYz C˨]=>s * z!@0*Фz|1'#[\NCz0T5AqIdf@)v:qR"}t`hS0 hY: P*<4s Ҋ@ A| *@^:sI8fř ̰T2X=in;ɀ Ў?ZJl@B V_gpcˌ&L'] @~D^$E /@3K@:P$M$0@B^zy01衜ݗR=AAVX^PB @obP]5Hҫ|Y[Pt *'7ZaЬ)-SPe7]NZW @bJ}W x D#0>F'AN~ntFSظD>} @mDa26םT_j9Of$k觷7ʷ~UROG?*13ˢ@!ș48xyHȫ3iN s/d 5l!bP9H:#j}?ָ_-O{CoD?vG#WToV2@?'dOGE&Õp˲!ʃ0w/&g$b+gIV<4F04DrcL8$(pBX@ݽH&D'j @/XBkU O>˯$UF+JojO;PjN슀S%Wo\}AP'I_6 Q@0Q?3[I_͊9d"_sO@#dAK|(nF?v~*((:;C0@Բv \bT\Do'bN@ }+TkBaꙅV_awj8T(Ǩ/=Ӱ=g6c/4O1wb'so|^sW?'uXb/8Kݿ<lU >7aܰ'`f@d!_a0/b%P$$"$ 0@a$3̀W53 U1Ig / "`WP*f.4py_/3f]+0Q*r .# `Vl Ą! :0`Z4_ݿ<4?s fҏ3ʝy&͔ù"O_X^S 1d(V,7  g_Fzz#c޿E'_d/Mt<8zh) v{?r$:rWL`,ɀ2̀{(6>1CV}qB  =^S`EV+Nf /|MSp\*g%\ixIC /\ C ʪ/(A !T="> FfXv)P,<(#W7z>za!W uJDth'I~dk(h #L@Q h7>P?m ;6#5fPFl#<,/I~`r;G ( `dLزp/:dD`5vҀ~zȌ}/f}?|*j_~%e8Y?gU/opt&;w]- >ڊ4ݿϢtK Ht#-`2>|rgE*>[^M& T pQx K>@V2uǬ@=SM++e|{ P *XL1$z̳XU Cnn Rh@_c@&@] P ;rsˡ=u إ @vm$HXXT :R'1WC$~ _L7 EIՊ{ @2_kϒC >ݘ4} Au`>;~ļF[Nc:sN'e+e`~\nU蹣R;0EL\@wIo_5 2.9=f@@{wI?*SvE8\=e/{?k6g,T?O\Mc ߼~d4U=zO^NMc20 pl!HD x ]-mV`7Z}c"vWPXQFQ<~'WNK[Sӟvdir ӢNc pj9G@!x])r=/Y0w`K{xf-:_/ 6jS?˰/}&aw4?uw?C\"y+$Otq_E_\3я08,bO>s' G?jvOj'ԁ;?0զW!AzC<>VE^d(<\ب84z=W9\ | m$XU;(TK pT̍pgLjmv/@Lz"tW ,C_d|iD,dT Bm78@/4x"N:/WE$0w #K,$n30[Z|*EJ4;HFث +P~Am.th {X&ȁd_Խ'I W(3ϩ6MaV0!G$:x,N^h 1Ϟ49k=OB ſyWOgiص)Ax+*xgQm_k4濜~o?Vcy?@?9/8"It&G^w濎)IZO@-J?Ԕ? CO @IF#Z2P~@]Lǘ$#%  :#Z}=_k^>̑F_x6-/8Tǰ?ZS#g6gٿEVS/ 6@yj]X{/s_/(s}>w*:މ{w'$kL)N96}6/?YN߀ԯ(ly?}g.y  `ü I+>|0rWґ  ߟ%:  md#iS-|*7v-8]i <{Su \1m@*@xU.d~_2[9:&AP "ˀ4RODᨫG* @ jEBvϥq* )*lįF@U VSж '2,@mpP >5DH z}l<{_ص$|BW+:hC*ɲ*h.}D?+6)~վdDD?_~%;"GN_5gB?H]LS2 [4* 2A[ vmۍޘ%HF A?t?U(&ҳ2=}txf;X g4r[ZǦpp3C%`_!vӰ-[+W>9F8cdzD ~O]y/_NURKd ?!5FcE.W/^>@r%#w!yȨ^;шt|v~$4&l-yt#A *b捀M$\U"s>yu#)/|כ8{Cڡ y.%ͰhЁ# !1 MlaRޮ  Ṛ& F@< F@`_X&DYvVA@ePP3y翅@$d Biu'odgCYYKI@#+nT_<v`?%+Z6hI$ P߷ۏ `@oAXMz\yRV,^g]4:~'׻__qG ?SWcO]S 6/g٫YpVCO*Ӻ-mL70 =W@ /|IGH@ja:I;#J$;o ۨY5w{q|=.zK_w{,l?";QıIN޷m?!ψhr?N#?y__k۝oW'!Ev`xr!c;Uahh_y=J - "'"YU`ah {n G@`9`sʹ ".RJ%8Tkt@R§8?AnPj!`$f$Q@0&QF'Z"5%@U*:bY~AGV(T腫_]PS'̚ x[Ȯ.*f@]]#pRSn $O UAVep @o ) AA_ABcw@iElzHν-#H_y>7i@^~Bg.;}}]^}ɀ@~gs7ةGǷik4}4vTg.AsūpzJ%ce` ,ߥO  @@-GJk.aSwgK?(v ikd5e8^_aCE`o$wO_d_:u-1gK?Fh?ȱ}>jfn~ 4D?05p(T_Iz}ο5@~VS eԻS /3`r׼ VC" e$ï >F'>Hf4f3Ii/͞ϼp4/֭p"t)jO"<ŗI8-U/b8 RJ qsNA8F7(@z,_'?ȣ+F|yt#cH VL@sD$n^Ia@R$(eyHʕ@~@yd0<`/@8im){$UpJT${g,*@Th#| Xmy sg,@^Ip5ߙ&`{,T="8a@*opI^ b+q$H'w `H`!@'JPYUv݆@RHlmay6x$@m]7TvæIPכCY*۹*-@RPo~;@$Z˚m.|Ǩ"+zPy@ 6r@^alt ?m=$ _d  7k^ﶉVܧ])ɀ_=L|%GM3?&4A.eppFp*@t 9W Sx8uEtxg+8"t_iП2a_oaؕgL'#/=#vfC*gxV ݕ3Xax}~>2u` ?d?uQzL$d`=O'>l[W6`0M#*@ g Cez dCH<*m<$].蟅L P77e@h>8,?h?O@&rgkvҰn K)Rr%ؐ 0om@6yhel6ӌ6 / ~\OW$0T @7{4͆VxND[9hNTZP.Pmb-)h-%b5 L'FqQ"@ `Cr nuv`&~ M+ TF pc # . @e  p䴌BUc/7BZZ.WV5CE5U W'd$`5 hp'5H$nK `~|-)5N8eVDVl;, ~&Y:|do#o\S<;_~u\kV0.] ;Uǯމ&?j>GuvH_?H_)JcK׳p&k DY@Іϳv| 1ry .#b _>ϸ/.V@{O}*=[S_fsj[^S_peH_?IK<_awj {ǗƿgΩÆFt#za{o@'@F4|~oRVqoX8`@Q?=c˩߭lH+!yC8lzz<\P-\|}40&z% 0P'H  6fqP_SZJ J' кОXo0Im.I\ .9 %M}]P˂E'뷳lA@,`49hx'ӞݩQ:82~!p%o{qCx%kPIha7T.(>G {S通 0p'AFܒ՘6g.Ba<[?$>¹aKALU @C:x.z 3 }qB "ˋN^=`F^t&pIUvSPT\wB~~A񑫺I퇃Q@k@]6 F ta` "Q"c!x6v{0T͊jPH@;FMr^Zř׎ 7bU~sX}x9^}O߮JR\)3% ߾ 3pb @NPWwt Y篐~|_gH# 1-ο=vgx"ҿCk>eB Wv}gtӖ,~?g`߼;Կ4 ]84ſ?#56֓~qR=Q>@j>xWg!e/Mt9dKV?!/!@J4Pgn* 2'U>gK3m^d ML& F [)p ڒk$H LZ "Cs8R #ݾ${(c9!F*@G`zs ?H^@`" @C`J  00)+ם@7|(vb_wo5@$@; pGQP PV* ۻS ` @kd$2p fN[T;R'ڊ„e?dJ2ly~_DyK": >EO/{uWI>?oqD,?قHFHhT]#u AqzN@u/nPt&jS\_@wcIs:5gOv4Z2b%(x{?I؂Yvʵ?b?O8ſ$E:uO'gv|c@P ?6ݲ^bG=ҺrW#k)__gZ.VS=!9gQd0P@ ` $`Mt)OkaHEO*@ZƌNڕG8x H+^sQ5 XEp~A)*{m H@$F#f0PP )*.!#(0 dtͭP[uL(h_'Sf]w NV)BU];~kR*O+ny Ze2p5w28bod ޛV@ߦ|9ǷEvTZ"c~}1s%/Z%8f;2i+H\ !\,[+u5+t=$=7`Q@[WwOt~y}] "?_??] *s{X@O-{ 6g"?]#/^]kaĊ{T~/]?m瓿? !hevyGݽW`k~_89ŔoVR| edoa>ԣ⁥ @G @d.QQyHGcHb-Cgn>Cz!ӳwZ%k !TV.JCp)bK sPܫ";a0d&ͷ;?@8cAl0)gc `f{?$[  ց@/$( @()V9+_2BP^Y٥v;F3 mK ҳ#Хh]к9@Qd~Y 6H 9qv{ @R,fG?h%<6887z6d@}$Z[+Ϙ:gv E_3Vr9sobݒݿ z\n HhCf{'hLjo( PL@^|^GW?տK+zg=폳OYWh\ ^#GV)SMg?;lݿ!kke?`wSY, 6`׌|.q߬MVH:9X8BW "@?.Gҿǵ4|nVVuho:AʟG+_ؙ޾$ =4LJ\ xE1]K"26?gX`/5"D17rO@xkN!$[Y8 kP8P*ljУ RV݇7lxk*qaUPy `Ex`PL T;gP:CN/ZM-$||]>`{BPZYY%p' @YY7@YeU5V} hW@{by#Czm ?RB H@m H@?a8t4^| i%pK2 kVYsrۍ{_ k~2sG|HWDt"wOnߩ?w)]+/^%0*+7r<d0|[%)}OIa3@2OIw푿믙/I$g8Cm;M9ÎOӰ,6/6DuWXkk7~0}oB3>fCh4Q"bEX=bᅢg#w'-ia+~ɔ5>f! R* $OSԿW6q0׃8= éGō2YPJloap#`&t`}l=s-_4 ZmS D8ƌ%-`IgP/ t'I>d?9d GK߆_]Vwg` $G@=*X 3 PK&2 iTLD@,RH*zLCa b־/TBzzd)FVW5" 481pJ!зG.: UOH]}~|1>4 􅼯mZIb>Cݽu5U_+wJW u{篃A?7 `W|•4p6:YsMA.GP- IZ=687nՈ"J L@1U^l| ;-{T)to/1O;Z?'w QݑitWob [ mӴ+l?(Lԉ.w >_ 0y|n} zGHu Z~#c?}"wo3ϰ9c6!/iGO&˹e8VG\3f!288OПȨJ4Sg1W?b/r.z<{0YEg~X[ {--Χ0?OW6_A.C>@ 'TZ U?Q@()T9& 8aS_Q@z4)C :WL$C rP~CM@JY>P_\O$ND>r}ef wC[#J~ HEX!FW;;px@uݍԁd j_0۹^y`?ٜ?_8O7~w\e2r#A_'4J^ j%?n";@]|ߺz\ ?/v2V\;8jh=߈c?-!(xؕ1?O$&sߚe8ݴ:L| T@KC"gN2G pbpQP6@8V \"&Q<䖆@ F+L:}@vlrR"zFZ $@P RD4R, HSt(ֈ o` 4{.;@ZImCU/nwi:7"UHJY&M},@t'O '< AVzaw??t# ЋbSf5 $}u/|{%K[8to_o_`"v%,L\u@FZhs n[92x wBJPs%9'H{FG\?ecs~u2{ }u5vo?"wM)#-J/k'Uwg©Kϭcڟ0a#T#M~ <?>_Ľl;a# N~ֱh_ScA)Z L @jl#\=78@j-r2 R-Rxwb=5=tC`"v+C_ DG U98W7 Fc3L@" eh.?dF+? h_ jcE $^"ޠ"m`Bh@u.RE]SL0uMQ(醬*q+ @@_}@`W*jM# S  ǟ(NJ͖w_ j֟ Kv`9߻zߗaL%gB?|۹pv\T©r$H4j,@ߔ]}\n'(J_rY [K1C;p?@d^!LoҤ8_3 S=o`G6I4|{{A?l."loF޿3"Y?Pu4eo<+fn{~(:ˏM] JK;S.o`eÿ۲޾ 0}ZDTޘF tWh[n ?TaPN}y'"<'ÁĝeL_Lu,ho8LhpTeLp>㭀}`o.p@Pv+]m8kH@7x'8 QPo z*PĬ$wM`@[t>A!Uj*Z=Єq ϐV.ȭk7s PV)uH8>P oWNkd$@@#cK $aBfn9 d۹~z$ߩV77/K~ױTzs-^ʱ|$Upfd@#Ed;G`B"Z|%) ׿G`o()臒H^"tLǿ}VHnaRH/wf$v[| dJ뻻d]۹1o)Gy, +11?yϩ^12R?Kfh*W;Ԡ$\S)Ao+R lZ8ҩ` ÁDDDNː2>bQ93i5rӰ8{KOm8YDk8Domrǂ(eӶFL(C-^ LW j{h`Q[(TJ P* OMT@ܕ MٴD@67CF|W( q+* @)z6Z @-$ ('G o j#5"`?@(Az @1 ;sq=v]yZݿ]u:8tB~kP$@MgW2#_\̨H @*{c=:P}$ B"w GlTݑz/u~E8\>A彆]9`[G)Xk;Gη [^?jﱐR7_:ٮj/ zXa# ij%]X|Vqt̟_x' nE aCM##92H@oXCA W5C ͣ8h@Lz!0# 4 cAM+p\!-98S7 *1 8Z%-:L< 4%T~& L{{ PdL G= ύX$}$BPMv+U7/n?BpWpx  KNn"'@b t:RuAH^G)A l\h7 j{kdRj`5_:~7Gt/,K z[)v*,$#jqih&韺hݿ&+^M?z$ _t/ WJ0~K Љ_?':9荈?uL4QmR'B7v`?!B ۳>Iؘ.4S7v3l]S1SmOkA^{)T/8#i?Řį~{z 7VoџYZ߰`7Xc}8F%" HW~ R#WEX1F@aP8аCH`2n5C!F+P@( s`n/em)s(dNTٺ)$\y1Z lRm5Ŷ#Uy63(͞eh'"Ʀ@ zHboR Iɒ@%nC܉`)$-LH|f8Q7]烢&󡠨'#*)Omm"{)W(U`:]^IWA#Md[xz;F\÷}z X$)g_EpE'o #TM0AIlݿkݿ>}}ݿ)>I ޿xA+0 ~BAyO~)r 6IYߛvA ?MHW+w׍G;p_=?u쇻7$|폤  H"Qz1m]2iddW@B<)IN$8q8{||ʾkKO~o uxzo{@u.h#@_ " B61Fl$R FQ8\6jfAQX ݶȒW<L$#j=*%P ?@ S`Op$ N(9B9S$?#GT1DH ~߮.^ j{+++δ?RLic-pM7SԿ[͟Fb%nWG{DpP,9 C RB*gC!6 Tn# rYb@[< 9s.Q^ c+%[OpGw-Chѣy5r)0h[qQSt`U$@S0@$$( 3 @Y<j-H&w*dcȪtC!v =AŤPTje,.Ū+{G@?uE@w*lUP'%,GtR~tkr;WC -^OZ؏ӾjBN$c'/:E 2 P$dXd•&,7(]+`sF 4s{7GD/5+ύПD_\#4'Ç|<#pG 3b\·o3ؓf|M韱.m#yg ^SMZd@.˝Qm_uyS7_[Gkp}=Z`??4$ wAkW˧/ZZZJ]cο F/"}>&5&̧\_J~%~UJ l}3s Qp2i-4Z IΉ;HXPQV2fJ%-T@j"+&?,)$|- xͣ:L'*"$%WCf>@62$ 4$u+ G10`cq(@5̀R# @M~F~_۷Ջp.U@AI-ܺ jIJ3^ EQ (_7 v@W#:b q@{g/tI#!66Gh' 12 <p($JvJ.qH` p7&|kcHTɳD6}̅K&HTH.˫ndYpLpzvM3j\Bvf}|O=g;e'R.1{=}[o|{?ltAe?";^c$|{{J涹 ĥ?v/sNJ?įc $YXk&ߐio#0a :D/*xFGj0./OM>c@lʆ)?@?W)?T?D[.8՝߼? %@<LhZ $#IwFj$VWR CFZL|zk"+~)8_G$Uds8Z>#%!{ .(65%H $J@wO #ԩ`&1Ar# <7AU"p(ĥ`VP2dNUW6CVNܺ ye EM:Ij-KD5Xkk*NV.h?*d%=`>L׏?(nEp6 Gc*w/F֓};!8C&E`:tT>~IHOG&8.OӘ|g.o( H~9 1/̃s\Ve @Lݿ eo{ύ"'O$&od?<a! MY]Kp+%vo/A_ɹ{rOt}Zb ps;O~ n#Vą ]=2 AƞdW#WK۰}_޵@_Ibwr yax|oԹ`wo%bT*S ѧ2 1x+v6gNA(hP>2}|ds8\7NW~jo&7x(#`pKcaT@Pm%*"Ԯp 0n@Hm ͂6սJ5@fvܼR*V6@5$z_>Gz>]Ѓ zo19`WteW{<"}˛`]۶E%zB XO&G~S_ծg,ȀKR hr@ O\CĸI N! @* W4 & HN:@Xipr& pf!I+5p$ʟO+ZV$ƿ.I,?5G=e _ dU>Oο“EE菙?"6?Ͻ '?jW ؎S'),ʟ ʖp$}.{ JYZҿ;D?IaC+Sҿ/8 IX|2uP(T<:}ι:77 p+kmc 'XRJ_Կ _h$Ko撳 "@*0 (FN[OQR^IpAP 漣v-96 j?Yb?l9_; %+Aj3ǁˁMh䠠yOs$rF[1R ٝxr `c1SkL4(i3 u 3ƭ,ɯ $6j >q] ɀ=-О '@dfAzvjyF} @almCk$BL֝;I"W >^5={N4 8 ۨHڹ4zK'B`>&I߀R""p" 0 ^%p&8/[pbt#Ǯpz9^ N7Ge,V9m1r[kOu47>."/*Ӽ~swyH''g <6A̿{Nu?GEPVw;3^֌]G3ͭ9Oso9[ak25w0sO%wοl )`|bSh)V GMoRV=ԳՈz8b :VRO ?^_10Z`Ϛ ೎cA,\&V@HȔ@ۭL4%W~KUW7e.CespzI$lpq1ADh x/AIoywo荖 H /ZR9OP*ZTE6{ KCYpb.TTkuf3[o`SzoS~N Vo]j:9]6eSϜ?~ b4Џn 6a#Ο_}_9ՑҁNەve"g>m`s[>|oI(Wҡ+TI?K kܯ1? 31c%׿)f2Me??gٟ?> @3`Z`F@oh7ʆ =l'`<>oC0` VX6(!Qut(Ǹ83v1pD8f0` Q1 ke>@2Xd-JS,BpH@  x!A7ֶ^17S!Aj=7)K'HBBOx)xPAMG@^hT<2G T1)IJ$MvTM5p.Toiy|@?I*"%PHc* p"Nzt8A]{j5`M$СT"رǔG;SR*'wE9 H6h]:#ǹ 1mhc)Ko*AR$Au/#aסHsͪDaU8$0 3  4t:}s9cgɖlYCIDATs*$J{JdI?ϳRqPZ{>v{\G.QeI,<;O'nÖ3\lP /aVXV% ʛ"K0e0}=d}]))Wt1_U]u>j/!߭eOԋΟߎ_WWMACSoa?Wb2].݉lF?}$v/fJP8d?LWyz" ^?oդOz%]]Dz쿙v_-y_Ġ{/'6[={lzqn5p1Z\2V O_dk扟hmm#SE-PfЈ௏@QȮ6i @v[R  +0] \Q( (`W21Xn "L Ṡp,u H\3ӌ%ƤTiA D`<$zT?'c<(Ņ$8 *=63v$*25qϲ{!>n{@oL  3Ы !0$؛ÄhaR3jPj[#Dyo9 9s} % ڍ ؤ6"`awa7emjZ:!8׊ $ l;~& l?xv;DÎaۑ˰Ut,6~r 6 KU&4+n=B>VFa2gYӰ3=NWI4)__˹s:'w9hǯsBcO2N.v~nc'~9ς~5sjbUp#!?E]?wXRڟZە}Y~8VH<d,[ IմN-_qwJ=O44r鿅`BgOp0?F,c/-~O5-fϺp&-`cb>4o?Dvv/3\[mn8ı Mf*@C,/N,H^9  dq?)%J?,^;sp$c>a$x4nOBb ?Ls45.X+@ 4AsPz ƧWy 0(oM*P(STd(J腎^Wgzdz7*H R٣4re Z :>0+}Jy4•yz41 5nxjeoVBv  )@IymٯM  Zv~M!o}-mQMq$%U}R 69[;@`NփgfM.`]Ma㑫7a XY.4֞)uQ6X+߇IaY|:Ϥ{ $GYgۑ d;r{F>Q5 Ꟃyz:yҟgP_:iznc? )}*%Xr#;S/3GptUUlœ!~z;wOv;)ZZ:;tuП&g]@PS]onjzilciok|w`1D/, k,aL?\DV~,`DƤNG{)b hP M7#}l+Ql.{H? 0QV Q@cV'P uW}EIK8 N" 8>Ǥ)IT`&ec?3z~t^[3p9\ .,@qJVcY0/c?Hܿ0Ê3 K *v%9wC]e3V /*k kc1!!OsW;n\?|B+sprk˧pgVʙ_G) UV^7Ъ]_=OY"ru޽sK}}㏬VϷP7E%.J.xCFW_KWmՐɢvlzRZtQ9 S|Z enN^>!CDR`%za_ i8C~2f8= /V`h7(ʛP$I$v$/&IK514 ɨ#nJ;acX%n˙MZ ׮ ؜~  RI=,7`^%4gAV&VVf>d! 2E A5X(W 8vFʪm:ȯ۴OaUTP7t'Q| X`1^MO%/NQm? H O ȟMvu{qACaXXs(VMDOէs`v+.Šˍj/,CC8d;SЫ=i؈KT$6C2>Ao7B VFPX섢z(K%n(*Մe*"yDWk\\cOS9eb=m p΀ _WѬ;ʱJ[eu?ND`\e+/cIk?uߟLے)OyY966/k?ʾ6d32sfӼ w3w?کx??R X:°[<x™?u`Y#OSLpWnxm~,m($Qp @ nhQF[`h&w`3|~.C)>Y\v$y p*G H@0zɌ2r׭TMZ!cN3>)P CE9p{F1A&D͂| Iy+^UcɰdV/შVx?>>oydoWQ89 X p#y6ʳCn UPT.$n%/VJO?^Fx;g+~?Uwj5dƗ`og?SC}o~/ņ_o7ñIJUQ;b<%7E#_G~_#6Knҡ /)nv_4:Mi ʬ$Ep:i矎yx/_47gtt >?"#LD,2E^ |F?`LJfG#KlOU{GWT] *͡oQHY@$VK Ar`ttF ogA )mHfu@Q_'rd`;ȑCxRpY`AXaXvX(q <kw5{>EG߇)T,?]>+e,>n>!|t)|<|٪}Vp. .dvLyj7\Qy6, cFW% VwK_v~/MzT!cL⧢;P[/ 4i͂ _jI+t/ /:u8\+1v/`U4U^겒wUS|4J iv׃]}_-_u <)>i$SO/tw.=Zܯ)0:S-r@/#5@"m HaW( Ju g7: h$!|;,׿:o`O?D* /y!LA$+1'F@|R "FjZ5HɃq)Y_ Pm5SS =V:dV\Hiyy/+F SYd0ar @n~5avBxҐH@Bj豍zyT$e찇Q** [D(6 HwmyY+ 26 !>}LL"? ~ _!?#۹D&)ZbjZ$N"'c`QH+L5xX-Ư-FPH@ D?|Zt| z목*@fnVF@3dTVfT 9L*Ll$5j9n_te_d~2𮿤`qW%]/~ @_9( 'r?* iYiǮ6g?A^z*{ \W #?5OYZ*rkG$9>8^Ds9g v*{|+s?Ei(4ѡo'mjd?2ޡ6$MP_b?jBk?V9ݡn s'܊=K:)K5.V C`|M+mD~SGZ@HA۔aRj`iWu?@ $ pg8Ce 5I@ YO0$H/N$\%HJI p$6 %H럀3s'bƴp :){Ix" &@\\,合.^kHLT*5q)0IQě쑀>1J`q&~H`ǰOf阐^DX*6#eh>=Z "AkG9pRp.:ov%ےj.F0zY@jv+wź+\n2,!|<>>]TGQt|t|? b'A ?, %{MiOtzMosp>=Q 陥Y3o} X9y:nd~ 8rsrY'_+h JBeMǥ{ʼ_\`X%KNO_CU'q*aBf_Y4l6 H?z 3_EM~^='VO6i l \6/{sԯfciA-Cy5c#FjCSv2_o=6o RЌݿsjĵ?;:;|)""?k_5X9ukE bo1_ď.X~A}"ڻF~XXM b)" SZj B h|( PYi]8$MDp^ ؒI$$#<(h% pP8&@ǃJZNP :I `?#yHf*OAFL p$@.rI]0;!uޅO!::⮧!>b3EHxAn1O$ǷnBBR*M$  @*嶸8HHFDSYE_A]Tb[@<|COEoVz?= 8(CP @Eu=s-{HK?uuE`z]ׯ^5IXQn~gzyX" ]eGRa l->jczC~SxKx?yO!?l8tگI%{2=3aCX p o~ ~ ~n#nwW;~C/$_ue_}33!Gt)?*(T8BE$T_bMCET4z9#5c-bj|7[Fy3~藰2ze~W įS|?iazף~ eoGġ>#&;2lkv#]440㟍)򷚃V7ѱU9^\ b }=1ƾ~"d27/Bė7`~"s Ak^h0kX f(@?^)a^R#)$@TZ "ܚHerp*Kf𠠽  sZZ #A ``$BSPCa=]KEй^߃ \E@ϋ^kh4̀p(g׬߉V׮_vR ؃@tؽƏįYI#߂@rVdXSX*=QaXv<>>Y .ᣨJ| Ac s{ާwAVXHEÿr{)*ſRi1@L{eU._{ k٣ؗo7 J#+-!rqe!ۄw;\_J2C(sLB%#{1ʚ||O חFZI?:-otQ?a2 ?j a/~p8'WM7sxrW;#aݓlKsklW \#ӆ;uAgw/^r4ktuUVwOOL̀%L_>ܷě^5,տE, oFlo &X?#`<=~6.}`L `;L~FFdT#j!O0<)mا@H$ϔz` aJ di8N %_”8;\,$MA d$ H@PGr뼐[;H腁HaT#6cy'-(T{($W#I~0'WCTBgnBTlD]M+ {#b!&!b3!#!HJĺq;|  H-GHCMG Mס_wpv>V@'b^D  ·o.ķK"p+]vY@>{_!S2`E }Xv;wa/Y n7FxQVn+2|{ن|QX4vga=F +÷)Ϫx>Ə;7wnM!wc 'p*I[\%XŬE1g`E2^Uewπ^瓴_Wg3ݾK#W&?Kɟ]v}ӟwD24Ҽ#/{ ,z4Jk~5 Kت_ ;3S|ŏ05Kϐ+8TȤ?fC,~`Y߬vOܿwȔg2'O_'SPfZ`EĈ4H: cI~_1 §T@¶p< N޴Épz|P nUp&%B8 lp- XH228dA<5s~"RX F. \*VKǯ-D$4*\ ~J6~>G#7i4@_D{o6Ss | L5},9RP e\KH{1zZjAX|V!zVnVl? ve.ǻ1 Aci ?=w'tj#N[v8TS37*Db9z!|_g8kpzD%@TR \Y 1epf1D([Ep9b.X|-R!v1\UD&.AJ+$%^) !)Ej$HBRX7dLJT2A !.]Mm{OaF*;]caAX|t>:[^0J7|7s./ur~8v2HƿRAR+Uzg_n{nK3둄S|ρ>GSI3YާO(/z?>4o `O_mN'kkE5,}>÷#! P朂b| *b '? X%/d[69f6F#G#Ga=U*W_?vr׊"ofǧV͎mohq-ź3~.)4'~%׻S"O?`ƒPomM%<>#_*?-'U4MԁW}|1F7b?H~"/z]]ww׻[Y `FhC ?!A3JHq3@L E7lFpe["(Y:In2p IIc$7" ABH@+WT3@?c >AC| #v 0{p Tp72* PP/t#ӫBEf|),hyfVeE6dZb}lȞYӰmY`{؝ yؕ1j'=^`O]$Tw`ؓ{aOb3KjIp'þxHt;p" ?IOo[up6a]JKjJo…XUe*RWR+!cnC,>^ÊK)CbQS!12!n!ɉ͆aK`x8?>S _pG;~x?!ȿ^j$]TӦXZ/Mksi\?ެHjRb|^8Зigk3mUOB7JZ/{ ~'l_;9?a_9לv,::zJM{;*N8P*1E9(p?_?ݪ ?B?뢆G9d~c/M V'G ptΔ@T t i%)nRrEOSܿ4CKk{"ir`KoCD3/_ /fo1[!Kx`.|ĆS~˯|5h_ OiimO j % h$@ RH %$h@ 2 P7({V @q85e* Jn$ %ep`6/7`M,||}6cm7oVN؋f8f8uNCI>؉dee>nt‡'}6R}xg=צ`a8녫~vZ\^FiT:WMy,c u ?K{͋}0WS|N4n_>U/Q\|6-O5~1'qɟ}\ǮAf?%+~\|ӟIBПB|)ts]t4 ? iebƀ Zfӕ!5k/"_&`JW !>I||R2/{55?MG~5O N+ x[:ٙIymur'3 ޙȗSVeuWkQ_ZtL?L 0oQ{A~ U6 hn} M-4Ut@YjTKj TTs}:4f[f~=P$DI "q>"ׇL>#9\Su/P$ fr (=Ǝb4iD{W|b@qUTRuCfy//O‰p<'q9 8=eO`Bd뷭R` /+T/Kc2NJ|%,z.{$I }-}'eԅphW~KcUwB"ʹr.קMvOҴ.>L'|"߇}s9vE][3Y2t#_he7i|z/ ~ZJVuq7xR~.RW1Nn+%G/Er?ϞE/z)[D/ Ro@N!GR&aCX cX⢌32LƠ wkN,鏁,ܶyf61.ݟgʑ'lOJ.u?jn7IF?}{i-G? CK٦:;:v?lGN\*G.!XFG2w)udUfR=?Z`Y _E0|F ~Lmڽ~i SM?o$=FO=pP]?0p I@<}6)A@$I@fv$48@#H2poK臝qcFNї$R\ nˁq9̫~ŵ>ulטFC(u f@tOQų ;)|*zy+vdؙы6UA  ..*:.ew,.V2BLyXg2{PX6"Y [_)6\(l A8bFX%Zמ+5$ϛ;x}2e+u.޼n'ߗ]fFQ>P7trfo.nޓ%|ݽL|y5R^=1Owh_^M?ɏ ~/#}b/:A_G9=:h?dsr)ΐ_]A=eB*ke|p0)uW  W\"~U 7`o&epjҚY;߰UdO?Rv=ظ:~Cc;e??]4of s3?Z[[ɖ^TKgyMl!KP, Ů_|uOMFgƦvcF h Uy/M z"̀; +rp״@oS5'_$Zi' ydJT%@ pI $Ǒ=`ǵA8: 5y (cD#d "g瞀l$9/)Q[d?Hx'$ZtG)IAv&rJZQi2I<|?L\C@ޢr[TwsTj^YՐU72D *^x|prNú愫T.!PLg4=V^-iOX~ ;6&'f #Rd+NL {+s׮*t~^`%U/V7<~|~K/(rj̬'˥t\}+} Ҿ';P@_ŸjKggE~}|:s~1_iq(#s(sMAKs3}VgN&3U`'0,?V\dO*x?[ S|-ہ'qg*v M>bHMGJnCk?Sn6hiNi;aC+U]z),S^+bP"}_w7+Â^1R'#肋_+֎dSGuvI@ @y/.#$ R&.w4^ %,-PDKB ؂$`Yدgp" K#G0n?jc&@LT 1 P ]AV,)ȯP: %v-p 5NF$ &VNʛbPH(|zC+t1rB*;>UYH 2kc #YddU!p߯*-KyϝO(*-6+%n*+v޴L^:PJw\. '#;1νZ3ek3pƼ\r zj;zsgo\sj`?}iHpO )1uZ\oeI ?[u%Uk%9׺~9IǮnJk'9If,ܧ~䏯)%)WV7f}UxaO# aa`Ź ' +ظr|/Eߎ~_ Ӥ=%):_9"?[0BSS}w:YfX~8;{";}V+:?Rͳ^ oJ^%S,4?;p#Cv VssKj0(@4j`T)0\\0P*ұ:>( r)q7@%oꞀu>|$xW('H|̞'9=ىJ+|7…=# E]3D`CQc=c;LR p-0$`A5bSŋ1ud- @aI#xx-H/" ;c]#ٹ6J!2ʪA$ %9GAȒ׋R^`e}\|>S˝xفg9St؛G9ZpmkvB/ y9#?(_fy%2[=31#_gKU'+lW}:K?+{~wJׁߡv"˟{TaǠ!$YRyP?_2(d_(A93a37i??U $mI_M~fڅq~O?;߮uweoGv寢l6LWW;yӾ SEd,H %-QFw[ ZZz/_\A> ~ Ir3@̀fVIC\],7Ԡ dì (2y'uy4P+8` np( aAC݉r,;$^8 ^ 9hB9pI@v (} e v\cX6*5Aq9L8ྀ^*I tj+"%r,fm+]źO @~B te Ux@/# %HAטNa+#;LI2MWJFWceygSB~M pG)#.26mh@u=CwD:B 끂A@`O51HagMF!z?> g g$ D[h*)k$5^\lHj@VKȫd] J!jN$ N{ Pʬ*?@^TG:hj@#D(@NsrrBPȀEd@I:9ȖN! rjBm_A+%>۰ d.˝yq-W}c 赏sz>UQ:+Uupt% gEDb}^//ukq_7iR}J:~ZvݺoW$IH[!ڟB+=sPR?Hz eJ_.>َ? UO2_X}~$?;OXv_.!G=#/Uf ߟ#i/~n;iߞj/.l!3l?ư1wmaiοg_#*P+XzrϺٿ 4/xh9d`>3ॣA"Xσ? G;:9NlȐ 9 hђ% P7qDDF@r8f% a"DCHvW) ԗp$K瞀)tJx$>GkŚ`r,_FO%FTx,=P$H2+ <2s#)rÍuT5J D@WFA3*d$@cU`@z `r ʠ*:ItvV[ׅ~ucɷ+sUYJ{_8 uΩ{EWJrV/'p7v BͰ'^6*Ojۅ?oݢ*KG?u+}*W4P=(;D_??#}Ϙ˿3eD <˃K>+7pBO6?9sc#y+to#ϟOJ8_w?#u@';c\~ZA3up'drwq׿?Kkf?h&WUV^o?s"ߺ?b./u/V?>DXWKwZZ9d&̀Z\p# TI 끝b3@I'X(W JH@JJoÆk9nPHCF H=kp8)Wz! LHI@#] $E{˳# $USUBIT{kA6 9OQӕ7cR" p"7 6 B@DˣU>STe <>ՕCE@XT\cZPQп^)\+W+;LU(}vɫ ;25\@<:zQ= %^Z_^ժZ,Z%%%zMqZ7Ո~բ}CZZ_,Id:~; ⪪`W+~${eOPɿ?V$_îGv?z_|$j`}<0I;Og4.)ozMxR\\os{ѫh8c.9K/ o۴G'|]p< zDw/|FwwKiS~7J* # 9~;G~T8ѯ5f|ŏGWuS~T8[M ÊC(|8|||9/g/f1;D|=u'?]e;>i_s/2bXSb~"9oiv;.hnx˹mmtKKˑމ")ϑJO`_cy!/A_w|_Hk%k?dXs=j; PQk !GkfɿU i'96?z . ! #"OG_ f`E}H;mFٟT͆ u?vu;Uo%D/yx/QOx6_~-?N ]_̎ mRԀo`yf#f#淂_9]ww"{Vk:Tg/)С끍lmgZZ Pi ^ '`IiEP*26pNv' d\3{%DpH@#8:Go5AJ u>l{d<[u^r!n 4$)MH=GH ԀJ$/ )T=1i_7SΜ֙jIAI" AJ+;`ڕB:nsb\X jZ8INJg+Co翾[X|_ٗez)=-/vѸfgE^:gn^}VSyqQ ]  i?wT+ݾ d~C=N>u_7ӽȮߦF 9x_᢮J {J⩚J%77oOª8e c?㳏&_ S/ ?2/gNjyO~_+.q܇F}O\~ 5ad?;9 w]:j#?;z-,]}^:?\F+{aV Xp%FD| [_`dkgďwt]t,.8d3^5Lf#I Y8-P *i: Pw aAeH @nqEN I'a"`%>Y^MH'Ss8: 1$G 5=XhБۏz L L1Sf (_Z>ȨxD9V> (b755@#Nu,nS@!Br4i, u@n @H WG@XZE`WPKK</ ~Vv%zrN R2]7J-a@oC%|^Jg_Ue+U=ݼz3}{Qr9!GDu꼿Nύ1Y?ve_!>(#._!\otJ- a9 ǟp! $Oi(/!;FOBagtWIo]J\}οQׂ~ĺ75w@[0_'3 i"~+y_".kLb*,[ik",c["~o)0)g-?`ÎY ?ҖZW[I]Rn46DP3D(`r7#Avz,3Rbu$E$4GI֤ #$ :ې쾁$ J5A2%p$Ct hЖHu%x@}TNAz Ȫx ԌBm_Y A^sMD@!P5 WK" @UJHo!}D-V{j WTez,d@$? FDJ+t2P"b۲L uŦDxx6 IF,2i U>^K`߮ӡUq^v[ѺzcwWfuw5HZ~}s6GU#:B]ӷVl_?jv`H;[R? [͵\.O0C>2f珯 U^8I}:5~Jf ,O8{@8O_7)!? OF𗆿p3+;o둲8K&oO?;x/Z5PU?s=ay1U{[_"RoMf;@O{ X}t+`|"5M-u56\[lH@N\$ 22x\` $ 1м"ѣn6̱q5)D A871ύ;HŒ/`v$LÞ/gp8 $!ރmp01UA.4b'ĕRI5"Pb$L 1> `/ )V>1(ʺA~HBO 룁0T =UU@d1[@ ĸ@HCa1w@(SLjb%2:{.DpbbT8%JP&e'/bTu, wW)<_QWfrv/J4G@VWS~~DOj,-Ot ݥf#+>eWk}JlOk ᧙g_ !~%ϟQt,ҷxƑ ?<>g4d(?:y/7&* S_v+  `3 z::w@=QtCnvٯC?;::Nw> %ͽNηB$"22XlLbHosM›:|r"Xo~oOO7i+HSƸ`M h3p ÷DdTZ:`>ǃ$Hn %]l9$x`5t3́l#}ϐ HG!~wvއ=cp1%ܶAЇyPId,`i$0I 59d!ȫ|գH6 P)T݌էmm NnȘ@UBf4Vqb ŖA'h>^j#~UKЭDs(xq9/u!pX[e|z/zZb{р]񔱋:g<$'𗧢׀vPvE /#:.)}'Z_i_)H9ec8ÓFJ ϡ9>+~|g E/mNg5GO > ò3a];~M3"ݏg0O!' \ {8ટ ]/4|ng)l#ӁfЦ|9U6VU𯂊J|$ks7rvRwCEL1x Tye9dW"~}?h?FF|"?K{.#(7Ay3@ ؆$U)〗AtaHP5צ6# $ 2O :Ol?BfFW`K L7p81M/ q]jA8t5 ׃J'%0$*Aej@gY*&@y|cG9RU%2gO#şo(A#݊R`\5 YZpn$Ax>֥ϛ>g|= j^YmwJ(@356%\ѫA<=1v} eg4YlZa f+="m <çwn+~TL|U# }~zK4_u'YSXُZ1'5 IS;d/Οcg=#|)U^E77M-[ٺ.2Ï3ho6|l"'@)r׿&\{ _B_2"`1F@n. ;#̀ _o~+hw3h? Z#~"Km?ѳYg$m@p"8t=b')wC‚!:<WeVr? I؛XwϞ4X;lO]7ܚ<ғi$= ƽ'5I@TL$LSf9$m,^1ieD&!WCiT׉C-PVuȥNxp1f *evke&rZ s% Z-I҉)WBv૔չ*Wx8ث^37t" : WW@_ջ>B%r#W}( dKෙKTৎ9eU;'Xo}A9MC>>\g}/jV7Ol42S?E]0vcCXOyӬ_v9OF;7 v]>؟#sX3 =~7W:WBYv-ΟVE?kz f? ޾_=| ,>0g~#M˻R=:"`Mw>_ȶjk:f9$@nq?!\46$@@%Pc`2Pc s(y<0HxpIBUNHlK 0s ȑ?;^[@8tMA\{&FH+D9Dj 0T2EFR-{]xn pml Rʴi`j(Xc$zG]a;meW0] _f@ !Wtozw5_Mۓ;T"z;,5`*DoSI6n;D_W?{ʮ_;~;p=)C',F~o#>|ۏ*/v>~|||vKO`%s/f?.U5Uri޿w9 F\7k _-|u6>3G:^.wk{{ϗ('g~ϺbU*K;o)ỠO#"ADYR`q͓nk댶 p@4*8c`T>"Dt5kH GXJp,?: ֿW|B귏C!({/!sfYjf>6_Ѫv킟r럀 $'HGa Xw1l~v/~ E~蒿U{d`_<,(ycrTFCV :تۣ?9oBoAoEok`CY`فJ?%~?oQno1x_ XI-l,6DUpؿϒ:`5V  ?$ nsxCl`#5`fE a =)A  $HA&(́󬀨- _>$Ph|DúYxmޛpc8x{Ŗ@? Հ؅7 .H"PҬ&AAe `X+TA$6DA! p A?I ԑA8B !P[9kP?҅/5's Vǁ\#tj%6hI fB*ksΞ,^ZJIӞqUOsn :0lUvʷ@?S/˙9u= N_߰ǁuʬjo+}%S_V2Qȏ[M5u.k盥Ay%Y 07EI)X yj;>FވfвHS߅_=˭:G)u&%Oǃz؎IQf^|f_vz@Hfr+]@fu!I@E>) ! ؞W9 X$`9X;`{ ؝1M ؟`Rr*j RJ̀9mS="@hF9H-Gr4 <v5VNKW7[r j Uu@WC;W+h8Gg$AЉBe:}L+p w6@uG:ZnSMv^7L1Uv/DW^tUy zͤ'o07r~/e3!{ m+=W [irL2> ]Do!>=fZׯ#>oGud[~n\|}3ÁwZA2r'[oKVs]_r{t?1_@o:bt?9wt܇\+m =q"~~;==k:cWֶ^z 6wY*m/X ́V[~?X/#=m핶:{. (8$SƐ SD̰qvP76O ;g 8:p.+p$Gs/ "/`  9l: _lƸc$p(1 ¶p4 \m, VÎ(RW9H-GE,X`h% 5(̄Ѱfdk[;/Kp?R\]t}!%sڦ]MqA~_B7+ģY /O@4ހ❾;DqwT!<{K +A_Q(ZY(l:w󅹯ЍO#~Cf>- OO fcC6\uQ#"otѾ i_51'YF#0)޷2nfj G+-Z;|*Gݿ|սΓH yՑ=b Mwne?/띏F"X"`Adgﶴ9m6{0`wANma 0o(m 6$pˌ243$@ "fN #^羀8pWF_ *9kc}}GZ$5`W3{ I)ԀAwv] [܃] p&9$C&zt"u4 %,@h "-TLifA&DIltEms@T2`@#zXX 1Г 4-[DdA. 𖑶Wیک/\fÝViM0My? ]sL ya?74]#,ۯbšPPKiϵCM?u|+RTb_}?>*s~~qF!_EoGDǮ(<;kd%/K~~,#{p0@ ךʎc uU?m?;i-"~쏯Ђ]?uL_2eЏ:x_c}4E,,A_<|+Xae˧~9 /@|"z1K P$!'V`$ 3'}P 5U=^?$x9P/J1v?ྀY} ҖD>f6]-_R¾(j@{;b~8bJ$y(cu[@e~@،Iȩx UP\30;.3jgo !<] qj,4G;C%Ȃ<#k/V`#4F6^%1$ B@{)u}hަ|nz` 19KWI ”nATb> e۟@ՓW}rj}p '_? ˮfE&_>G|$v'S#Ʈ_E?(\__W;MGk~{gx,$0M㯃9OgkD?"e=ޗZ#{Zb~ۡIM-ltFǏMutt]gjoZ~Eeio7% /#B >y,͠I>H# h!Hx&c`hNLwE=ɲy`fu ́%A5mГM\׷@ *1%&D`z!F"0_IؓC$HF >,wv^ b֫xS^1 > 5@O7tE@ A1 5"0ň eUiFk9Itks@^#>dFkw:zeπ<+T]>3)`/^U??u7dWr&!;YV?u6' %@_?=Rǯ2rLyIUsl, 5@Ham41HV> mOP-w 'H 17A9>W 1-S u$?`_~nSn*c/yFWyKvEoswm!;߮~wU1/}cEϮŸ)fGz>/m@o[_[ïo$Bf}*p 9|tnyqTtdsr ><}]g Xsi ;ۏvgq~؞Y^؟; fB >,ٯ/Gq_:w_ N 7!~O9  LIDAT׌쪟ޅvffĮnjko?{;Ag]~[_=K@R ?8wxrr o/|-h? ZOp?G)IHc!H`:'pE>uە[5" hHӰG !OLuMP ByݳCA9@F?D -=%8 h|acj'S5$I|D!1.Mmy/ vN!@MAcR2kf!j*W>l<0 t!`sїJ'>V_]z\z%a*&~Y/wcf06_SOJ?:5.mk?쵍5Q~44B#uM-`dcXffmmmmRyu}?kJnQbVnYhy>5/~,`F!`dgw$N w;:Ld0)mCR=2+@)5 '&8*H$~4o \#"*(NH ~Xwo ,2ca󵗰3v'>B@"05Ԁ}$x])Dp5۫]dD9p20/ `X \erim0|r*CAC ̋d>ȀhN)GG4`8@,ڗv5~Z6xr>??IHkueA?U gZڢ{~N"GP'Y^ _]:1GV077o`_k_Zh+_ F ws=QQh`k芠0 '%IQ\l$yNX$&(GD(]ktM P|rc?ÂjbM>+M1~x~8d_l8;DlO4"/i' >e,V/÷biנ+ne& "P:k'U`bqU`'4"Ȩx/OŞ\Pd[Y hD~pU'u=ߊˮ9 a *9–F`|[1;멜bY}èI })޾R6cPgI}uX~N%)Ȩ$_H/I?93YI }mPE_d{s |:?7 O 4' /cBl?;G]?o*酽sp/砲^7j/_hn5o El:d?'SKݭǺF{[E*Oc;??᷎L̫A?f؝W%}W/-BbPfɎȥ^LG[)`8 '~34Dvu9 `uJN< d$@O#`X48O,d 0b!\1oqKgaS `j@fIp՗sv@c$OD`_am1`g8r9䰞@"I"P!20/H6?@BV$1c~~}Z˥~%BUHBk|H}sC`_ ~}ZyUc r=AHuJz:.x_ឥ}U?D"|Ď~wu> D>M-vT1]m$([;J7}Ɂ0[Bk'0f#%0fe8.b!6h]gDlD&`oKAD  D=vmNd<8"6zhᧇ`2\Yd9ִrl,%SJ]Hx !#FjǠnT#CJ[Tm,،#L4m?gJS%os'}K>\FG]Wv,Lor70| gkw1y P^5!) *'B8ϺL:~?B~Ig:*i RLw2obWNu5l_Yge{{ΞKVl'^k G "0Y`b֋'oJ\?zxpވT _Z _n"`k8`wNgXljc]lkm|M 4 `A( qs 'vUdM!nG\kA>UĽTo5q5`<͉@ F_ $ :+bc@SOZ,d?EDb,j(Iʛ8!^$XEn *@;ubD0漜 ̲MrA*23"0u`xw!!>&OFF:=/?x^vJ͂3uO+رy ό{*K羑\|LگO0/#E LBu ЯG~>%M:_&_v* ?t5/α>B?t~fcR?QX$W_ uWH]ECR1ɽ~5'rɟm?l%9؟? 1Hk=H_5W5~~OR1Ďo^wuwiE3.k%?k)O<4HUe$pAQ(<67EM@D #{$b þ#-F)O 9eH"&SXp D>Ot.gή ea*dg,NFevƵs$]9<#.'+F" i^s(k,C~\ s{IRK4HR[gWe}'#xm¼cC~Q y;!y{]̇0s\d *ݾ MKM?I9BT4·ro 7=`?]{!ly ۯ>şw|~a~ </Ͳ>ܧJ׿F1o-)>&ȘC`9HN3><s HKf?Cnk&4*f^ZGy='ӄ6MzSgcVl9usGrr_῔Ybs޶\?8$K96A~||[~F~ uxlpkk{f5A;'6hYL h$@h}Ig:†W; `ɁjA:(6xF9*dD\eNj."m9&YuL @"M2"C?$HE`"Wpc)[ud"7*f>. mxP#Iü@) Al\9NseNdB mC3S_QW>gW< Kw[ ةw5 }9'^>^t5N M/b]~6g.f>ȨCfS__oCe~~DU znAdS$K؟ծͼMWe׏K|οJ8W^gl:<ǟ맓9ؗ7 VtYf ;1e_NZek~tek~hk~\t?=76k?OjN_+OwWޮEnCB"rﭢ?ބi*XSQbuv0?tE*@J@-_uHgk2>o42_0v>A"0)⃅/ά~Q/VEz}g Afj\TI,h-7 r,\ X}yۆp>&E '`O(=[G`k8x\,[4`|" `$Շ/>|f !h@B$cE2#3\Rx9 (&dhLgU1_ܜ' |*1ȁ;%.<9`. v&Wոa{geg[-9; 9NAcK2E/7wYJ?@B>ɜAA''qI8|9Hz?Y׿4>O>O3QׯI^>6b׿R׏+ b4Fc/;X߼!ٯUQ_K#֠hVa Ll 8=zFJ3/7K98d*`}ŊRka<-xo=ajވTC~X֎_nkH!Jvnd9P90 &t##AzL{ÍuGP`_`_T^@v 9O'Я堟m UPc\_/A!Sg ;~/\zk>{%|tn+~o> QHfÑOx3p ؟vĽdx5gYROWY?L~_JS9ʞ33;EׯYe4 a]d?& Nfg'Fk~;< \ץ .pڝSUS].#O6w{^+dWmX^sϲE,rt`1,Iw05AW X $ ֱnkB0M  pʬƊ$xW$kɁ$龀'W ̀׌~i-s"7V/}pK58[$Ȉ%:5gWU"F+/`MW'a5$qD&`1ؓ0$`_@`׵~N9W`۵86 1e3l#E@?P#i7V "2"$(pBPG^1u˂b2i\ IAB SF˭d>'lS *DbP$oT#Kb`s*ActLucڡw՛e=g]=Xg)HC~ $PSU>L^ᓤϺ|!9 Á~Js}u}o:ßgWPGNNɔp 8xܗ _/%lO1u:~c5JI?Yؗ7q/P\G|&?X_^'|'Q~w˙»~oj ZO_SS}v"o})Xh3u7"/zK~6b-u Tb,oNj_틠?` Z7 4=nSV،rMPM7 #FZKH@?(9$ՀpD@ igA2HDr, ℏX LS PЪ(1@.D`S||d`B0"@>A D2n x 18 Um!TBE(iU*@Z[Dח5[tڕ.э"E<$C@+fTYTH j{sfZk2%;%Td! Ba$9ŀ*uЕ&\j*q&sv>dK*!իzbf?/$>"髳B7J>9wE dojӫ]RMM$acsxq/O}6/Ox~&B38N Ss l>` /NAIBc*O~4FxDN1Sߗ ʳ#8zg3'!:9p}I_wyV]En[?+~WuR重R%mM5?=̒8~Od# ?2~2.S?%1g&އ]9[eA)`J)g͵f"Z*=}^߿(I)*ߜn~ޅwTA"*\ވ- ZiC'3cV J]1 _! CH g0iam]f"` ЅnljS.N4P0E2Bq"0QkU`cS| l*U17D,K/#1Oҟ…iQCkVd_l+\(۽g/+{l֋YLl#ωX$9J8YJͧ2$}SWL):e4"b[+C ƨYUOgӋ<0NjKU^Rg Y = {ԗ\B`L~v#beO/~"s?| aaXin? 3/}IH2K h >˜C7N#y?˕=+Ŝa/k\/u&-^Jjzpo4_ÿWY `z~˟Ҽ_!  ;& ` 뿘 +yEОKOX^gF\Yjs_Zo?%~ή?ljjY⚠iJm @혐 0\ WAP;/IBD Ip߄/">qX@`;_ӥ`W2'` rFYD)eT19 v <]D8siD0{FH$\)~ o0AZ#/$!-:)(W A8# GY8 'J peU+Cyd \Ł*Pʀ!k=9g Ϭ "cٸt{5 _#F-ǒ^eEw/;{m6co[M3}n_>(ϙYt|xv rxr=t3!H| }1! Ie \.S I%D~13J ৯I_u78o=ggP!2^SL~lSjh6O).=ՏIe?Y'M M[SO#s5j`ϝ/y^kg YJFx6K:CwB"wGXX^ "WK`a?/|sg[ZSv\(:849PHs ( *ykH[ FR oV>pN 9#RЬ2(M?im!рPĉuRD'62PR̫ +d" )9PBSz5s`%PuQUKtx,LvZv}~]\Hw@^ݻ@_D^v_~Ϻv>/S:}C/:}9ӧJu g >!%vo ;̳I؇p&ſYH(s93pk/:___8]L)\?V<) l)?] F~\g"!7 r5ϟ_W+ZՀW u-t 1#NgEX|ovK#L_+W|Rw~?h6M؟|?Dh#~G?77ud{G5I xt_8&jw1f5K 0  iD ܦ20g`u v-Ԁ8780Dk(xZv \磁1b48aKXM3pyW6 d;p2˃+~>I pXWJxlw ~7 )nipھ8/RpWJz ֬'Е)E.ap )7Vn.K'vb NLo>}}+t-/yRAf)_gs}JA!'8Nbd`O_65s瞃Up1o%–ks:FW$ieRj׺}qA `O]ZuoH&Ǯ?}C<iǽ {njrvgY}8_H1>ẏO?'Դ #p&c75:6ﯭ 4646uuM'|ey뷾wexti{?Z5I|͛ -qckCA]n5<;=n# l9pcB"W 7#dS E X$A!^?jg$/?b'K<[ӥA8^D"thȤ!TxH>4c՗@B$ ly[b&`[8l:5/=@0;cp22W6_Fpc8A"y hd-mIAWȀ$- 1PjV:QPXDW1-Ʉj+iЁ %MټZ**|ѤWf^/;{ o5Y@g_(=7_+[G+Gr3PRH 6G?7¥gp% 8ɣ㟃7fac,ϥWK[!|ԕX{/u]׀#o=Ϻ90 ~%߃gsӴׯCZXO>cZD.kg|i$F|j oMM99z[ZZ {z".hx#/u߲׾ \o]!KS%v ^Xx8`@đX?[—{`%% `{zil"/@ d [A%8EЮG5Ħ@?PW5E` c .h3z?\%"` %$8QaWJ f:i}DIpVHDd @$aӕqd  bvF`[4g[ÑۓU4 qu~ȤqAρo4*EB!EɶR6c䬼2EѶ*5aAlPzGJv銻^+u&&$ݗUÞ\ ݛRҗ|1Qr/ʚ-'ჳC7+#󠞯 '"z_}L$\-|)F4 MsH ӎ \<R`k<:W^ѯIW?_ӁuIaugBq¹Gu_8ft?+V ~]|n#wp \W/~I_[EOflhuvI^]ٯkljhOMR}"-x/:MO|Âr>xmmLGoXà?kKo8NvC@?+lFUA mKhVՀ!-Fc( `+ ԡ4"Hj-9Q\D]4cHa_Fv "%1kJ7ig/doL(Nԉ <ÚH6\&2CNbǰ8!35jە~6"-d"aoK ~Q?|:ucp&3Z3*j§؅'º+s,fj\/jr+6;~u|k:kozay`{E懶k  }r߮e9&vwM߯_cy >a ӉnFlů~4Q]:OeA]Ok"{-K0ZeW6kޕU*?]러 X0}]_hoﺆ,9S(4F `DŽFK_[^& 7Io\|b=yx M2El|ፂ x#~"D#`p@0")[H)kccř \Ռp2&F_~ca=ͱ1u`+C'23mH l-ð+a&O2@)[u>Hu8h7uͺ#dl톀c\ uC)yRxK3{0u2i^/~wfky0LמªKc v܇77'CgFaq5 :r_@ l73frmOjrO?w>>砿J?8 5{>X"ßJ8cpw>.5}č~슟]˟׻]&c5~CG -w]dVϻuu>`}x`)7/GM#鿁DdakD*꽔`? Z_Wnt6>ލ.{V` * xWQA]$8`Ю-6x"u4` >A @Qa?=iAؑ7x`c<'cljE)+؜3K$|L #p!l2a?[b0&]㾁hW`S DMÕ9 ˍQ!JiD– b^^.X:ۍxkԄr2՗ժ^n^s~+tbµrߟɝ7!{`#hֱAxutg oDCnD 4|iK8>'Rgc_1slLHS_t@ƾ5J/A_TJO^Xl>!qS ]r?'9-e/rP~я 7;. O#47ѯ ~=6$G0Иsn2*_}e淐c۷,Q8#a&;#K.,x̻8~ff#leg֟Ӡ5;esSKf@wԫ@APQ!~O(&;a@  /1Fj-̂ZHW , DTmh<+ 42:9OaM$a= LlB2+ð$T=uQk 1D$z ی-CT`sY PyWBHUɼD,.Jg{kO{.>_9$ӈM0T NyoNŽaQ! Ò;||>:=x#<;Oڋaݥ _}Oބgpb?9[CNy_! }+ 倖اIz:}2V$/1Jyt~%|WV:ܯ(_JD|8k );np{Mx%5t:_h.fa?쵈X_k):d1 wm;h_Kj1oğ X>k` Z ZW!WDv V[kG2/@ {jlE1x.`VPs:u 5N]6& v0;jPLA\GR bЙ $%H pPva- lbAr6/$KH # x/MšKOa-QH\'`}8l\EAB )уl`3D H`cTl@R lGa_C8p)L~'2!V @#$ (4 dܑ/ #ë/T\r&>Dv>HHq;>ެcG?RaWs6>FaO~>{S>1>0|3X+Y=cX}l]@)'9 |۽iBM\_5/_t*v7_%:Wcǿ2xO=c.3<7뗡]_VԮVծ4cE&>=rǮ}4籾|dS/Yy>|2[8UY .[*[lYq <Iᐐw2??{`+he_2DFD>7={nXm- FC (I'I h0[w);{!"`sz_a9^,xaH+(  ,`;o^\X7J2@ce%D48+. !H aMb=AR (`}݀A0 lz ?QKa{x_1#1f6_} &xsT0 X5+YfA\}Xgln !B;4蕫T^cLwtӯ*ZG'r qm|1~,$o{y {=I:qgĎo%&""XݲW؛ %[*%RDW :@ $ņ~kw [9Ͻ ̜=q1t]t' ߳~r;Wn uoq-4zB[NgpD϶s8Σq9}}j??MH$~bKP/=1R㱋08ߐiҶԄѾl3~L?_(Us3Sw1!"~~?ӟ&?՚׿;[gLVeZB?Aa_|Qjol'F&Fݒ5`xmU>R*fPN |2>5)Bھξ+~X%P`]/l )Hb!i0  ; iH%!V81qsku ,z.C{`aAh aV&~  z^pclvz8>-}SMq=v,Tc1ȹwGm81oIw uoU0ZaC芻p8`0$LJdn`쯸{ ? [hoN!V|q +6xICWl: Z Z hl$}Hu[%;X_>6|W%(_R @Z Y |K(9UNs'~}oB$}?*oZl| }=>& @ow^W./?P(B$M~򧖾'TzOi?4?2iįo)P$_mR޾]ٶ_lˁd=3 TrG 7^\{.ECڪ@xOC^y( A.'D[@642l@\$4BPP7410Xi0;&J9LGB H`a+kp?`@ t>DX"0zh6 ]=2 Aف%(;@*mPiןQ@lI'r+vG!8n5\%>'qb'1X}*@lF XU[28/q,ۜ!K7C #\_dٔA=9p>D&a$59^Ww1r|&pahF}+wGWs!xN`q-ي͐gq?i|bhіvHQ7KݸޖI@'E<$Jb!ƥ<ڗf9σW{r|2ֿCOz 5D8-MI= ɾw\WDOQc}|mG([L?6^@؉lW!>ҟF5:*_u!ŷpcӨqPW*yeO~eHS>4ugQA1.4dpfA} u?F%F5+ʡ=9x7!ؾ{*S B?y#"` 31(@~0@@ɋ$ v)(Xml@cgI,vjv)IA{˷MX)['I,DZb>NZ}1eQi,?t?G }/U?5F~׏=/MُSo:?մɯQj`~{@vG;yhUXQqԅB ,3SVPS.zIe=Pw#Wvǜ, 1 5tPv#D$'˅ش@> qGAI#PLHf*LNc*,zЭO`Pm/a%$-"d`1bP br$И``$ ,~0P@b+Oeq_ƖxD֣WK;!l"lؽiu aL7#" |$s|ц)B_`xԽy-ƕ|7Nq,rڣ_8W㥓gq'Y"\ZN %{Ie&E_D(ҿH97'|fK)Q+A_$~F>A{p,yVC ȒƯITY/yş0Yr_ļOH}~y%~ì|]ʗhg>>g?` rMD#['>n+ver]UV@3ZWQ75Sx1T}q6v \}uIIA<pN `X*dCb$mT- `mY ,>s@ SiY' D ) Q$r [G 66Ap7A"@'6"AB edhर]g zKΡg [B-ggpr`p},-'Y_C'ѳ *;03k3$xfr6L㘡?8=,s6⟹IWޯqTvj<p_m߆ֈWc3V=ٓv엲dyyVv%YK7鉟X0#JQCos覃Y/^D^3喽F ?.'~pK~#?`䈙 CԿ߰ C3V~f롦>`f"QLoI?`(|d*mw{~\o^;u,E3okWmү& l.d Ud V _ӂrvˮBן}}J]%HO3s rX|__fA@ncҚa[4 -@ C8B &@ 4(hn łA8]az ?x2E`~ w# @m0[D) f`?gQD 0 J3ӤAHZ:#lyPJޠۻ@|'N|t RS,$m;pV 8; ؋6><m%{ޗ޳3[i=MgIUpE}TCto~Μ>ff:/]hU}^$+X_AfaϲGhTwsY:/ 0WVp)ǤQd5w<'%~>?c})'I^?"?V[I`#~\_I䏫p8=]_'|"e5a`>w4[w hvfcgfwտ.i/>ҍޖ`0t-`c}@Z~Ƙ> Eu\(Hcd$D>LJqF#ͅ%dÏrS`7 ȡ0@Z[93)3X!cQv@n!!a@?@AopP@=`l h_i't3@ z PFືappXX®_c8 bg5CbBb޽ .JnޯF|v&$ǜwϨ|.p0I~.6/ }& n} O\vjZ[,|cAa%kԮsY`PjB">/]^>%-im`kKd.o\:.(O XI;bEP Y[@Z5,# ȂV @O p y 0{ 7r`0\D_DDYϞS mE/@4 |i nz< GFPNx=s"(,X|g,;#>m\lя|n?LzRqAO~stޞD$zy<,a{Ā^^Ճ S_GHz_V슄1ٓuX0-UI@'ּg'ufѝ>#5_W{G/!G׷E2:a'O _ ~3dT$0> U;6J+HM}\C~VK~n 6t8#{?E'PW|(5}<1_WQj#j~$6NkYi S[n *T.lV]jF,iD\. :-PYB> A @ > P% 9#`2UbAr,!k^,z3G9@`M @/QAh"ƒ F]p XV4kظ!@J[+0Xq_ARQD $p@:@`z[/Jy/ BЙ9/r _*_gt|wNK2Փޯg͌eZm6Ff:v.-ThZZԠIM0-)W.}}y_ ߇CvwMo UN#O 0 hiF aSpgA]06  e:̀Lc >_Òx (}ytՓ9g֟CwʡT?.!ߨޯdkԄ񵖐E}rg4Tkg>gzȖo?&GЃe[Lu?v"K dχIU?,Y$>[GDN;w>K(|Zx_;C;`>w0f+it)WSPW+߿a@WW|uEb3R|b)l-`7M iY -rh|B,($F& gNn  A+G@%2 Csz"&s A^- h!(ʳC6e`1h `oLp?r`1j|,$cCr0jݾU?A9WB${ibIGXe}=L]/M ȢNS?'W9ο@=Hň¿R_kp _k\`0OQFOm `r${^]ԾxyI֏`_xG$:P8r>eo@86l?/M@@0C119&!%SFV,pV@%"HN`*$i ƿ`[Q'Bt,*>G{l4va@ӒC; h[m!m ((;_)^*P3 l  `e d =@An-)֚v~l( ^^NW='` '}8~Hy9$3YtóYts,Z9-iGJd.1.3f!tP ^?>_A7k8ϐ>BO|A\ }OQ.7TϏ#hJ'#F&6~3i"`zV=^MƝh/F@#ص(/`Ƒ́wˊڇiEɡoC< m'u @J\ل<(Mx{lz@f*2 հ#M_`2XDL(LC,&]6Y.@Am-H@wDi#<n~<8Pq4~jhb$r9q5NW#kpbqEp/D]tlč~=T+;peߖCӄj}O5z_ &!_d[M#|oNhYjy#G?,~}YgT?itUI ~%U?nx=~1Eя>H8Հ]j|j Z~!4 Go Bj$X?ȋ@A+%.+i֢}uERkpEZ~$8P}0-@t05 I# 7n3L&+@w$@D2y-1"0l6M1]e`H6 @̈P=͡AGAY,ځ8bPV ha `/ Cnۘ΀A $p# 79{NZz[$_&ȓ'q"KF ~B$WKϣWcEԏ=bsn6Tד(}r\;"FݞxWȂ>Og:-  `B#`23!61̄&X?,o@Ho!TRr@`~HtPgd@jIGL*0g 1`w h=; ~b`6lϢ| [rh3M$6G^ˣGqP^b O_UdG@oxy|[&9=9z<4xq ,9Pg1ɒw)דEdύwTWѫܗZ@Bǔްi|.PQPF\OQ~VS5QCC'+zyg>`N}ԳN{I??'b?‡rT` hǒߏ?>ׯsw JszyhE'հZQ_3 @vX"RF+R9=;W ]]/{w*=s9]' !I(2>!0)!@$@h +60 U`j$'MD"703:==$T @[R с`h xKa w١@p@9 hu a= wXwƝ걎8Cw*v;~9ĉݯ%_8ϡ9RͿ- MH$Ouǽ ILgܟ,KVllϸ%}[*%F>0!>z>'4? |}!8F=GVoבEh:+9l ckcя-i_"՟j'ghœÿ~^Hioe,+Z~Z0r3U>128S~%P%MH =;Y0dH72 B8%[6,H+I'eq \9Z7$ac2 `PHo500UmP80f^Ixp%  ^3(<00x`sA#ehRG+oMhaHW 8sx?O=(´/ E;fJ;G*t~Ҽbr4ʕ>/uÞYSQ50y %z<1_zoc~N[pbPs߁ "wf2#ٷ-ɔٳZr8q6Wib!O5NE?D;- UF gaAIj[?**߻~KڥDHQƎ|4V~>:(mfB.i|'P7>:=[ .[@2J4h!gb2Kb-Du@ 4h xE.v=LNY!v9m]%R"9U3գ^Ɨ񥕺 .||ӞA/ t{5rIwP_~1 {F*^ۧ>}+߈L؇+~a\: |lĹکg>q=Ǘ~nw>rt8Ӂ`xbw#t6vrܿ^Uc~_bf>qk5P#W(l @mB"A@3dz` *R?G;E4K^z6-kw fF+- N@n,ķ20Ws0 eSokff@(BBV%ځ-Y\(Ur)Fh99sCch~節+>s5oPO6 \O†wl.Q;" (@ԓ>Sa#ߘ'}\ ?N@KROid8Eo'|xn~H}Ǿ~ԋý$m`x|{ڢ<}iGwW~FA3 h-t.oΨBnlaMR96c0Q RV*=h4q+ :`GF2uV  $ia'uac` ˙w4QF I@z2 H00<F#Uy3GStdox*$,3-xj hiKI?dә} LYO?Q2wL:k<, pτ}vg*~xOO$>YϪ^;N}D+FK6%s0'++%j|5x_@@iS XpЮsy[Uׂ VmBDZ}yemEp>.Fo'>|)Ś[45 FtC!>B`#CnaP>S#l MP L쀮01IL㲶ZMO) >[~Y/?Q?VҟJ?^JxjRT̸jakN[Hj$~A;'>DߒӿwA]ÓyWk8ի: A+lڢDt=־ 45&l柛5vIӉw&@f?Zst@~Y'` !t0V7y p@Pm ABraV$Y0  ,*4@FL2k03F@Cn/ f m*W`(*=~|T657$"JcЯ*rU}fNK=}٨8+}2UwS>2GԧaT,Lo>KTr8GSh#t:Dz]JDUZ K_D 6h\Szu&UdF(6f*oXӂr悺qoA`@S/xۃ%>of;kfVA 7 zpB̄^!!3L@.k8 1X #! %@ꎅr+!fK4~Lw (**!D̊zD 9"W ^*2Rg"̜آ'lvYe+cz>Ӌ6rO+_HWeI*}gy_F>_ ob>! {k7ݢ?>~6p(y ,<'tR'ɫg ZO5ZZUNKr!65j|%x V(U 5Jjᚷ_ 2s"{%v} #]_D`tcb%sT' ʣn6NrG*$1`&;r!aV Q.[f UT&pGۆe݁փzkvf半1~+xYH{d48$ra~ٝV>'~]G_3\̧'}2+}6BP޾4G}yQ>Hש~F ~_.w<O}.H|,jU}5#z@N}QoƸ߯t|:`>G&|=cx Gr5w\[^tGboÑnE2ԫ; ZQB􀼄HX{$!iͦ\F0@I@G U!Ia\*!e@nH1H7 ƒr;1afJZ3p=𵞼Fu=out1?'y/Y Է6 Y,;½sL  P+^/|lϫq1]SJn uIyqMR35nأszy#草Ãw ]iB{tq9шXPibOUZ3n}~nVW" wohFL@neBAX8tBV|^wFwcFl=/ 0 k$!$,~P74,iV|F>b(TX({I`- L턈Ag^-3'Z`@@ʀFۤ>hLaCs*U:"{ ݬ7ME+ >'>U7WS~C/-|L/Sezgߘu8^Ym3~D2845o(Q=p'ރ] $Z \kW$Z>Ͷf>L5E}~5:[xB@++߄59kX-iߺ i.HKN|<Kv\Y@`8Z]"puWo8c<ف8 ' ̅pPJ7BّK%P i uA'mo;404`@~8/*]_~sC)"]T'B}Dx>lJbΘwύyOxS;^Nap H[W$m|`>*H>=%v`h`{}Њ]PÉcW޵{>2-xս-/Y(0_p Xu۬V+(EDΝ*`P~Zw* dg.zi~6KaǏc;,Pdν{f*<Rv!TT\-~-05@kuF;Ҡ墦giߵ]]IrK4@>h @ BhN Eoah( F>Hv1X_ק 8!ɐQ<rqAtC!wv@j4 7}`n!0ƀ7M dq\ zʾ>e!)G|] ŠDIDATs;ߌǷ3V>IG=M{HTWjݘ^mDD/pzKRջݨXu>Z i> 9 ?O484蒨y `3Va%V#k &|s"V+$ov|@My,ĸ_t.m&m=&؃9U]TH*jw2?M^7dw/RVOL0y a6hp T!0B!bI'- iA^ 28V  ~(0Č{;YLe#_u}LK=]+Q\ MFSRg>O(q}w0OB>exO$>kŞU >߫\Ny>N?^  bړ^k~%+^Ez]~V4Dj~+ yؾ+;hE.P`UE :,iγ922p$P( Hz@ZMAlPysaQP 7%bL p0>@RBo:=> 6 {ZC>=bN Dp#x5{乵.;2'z!=Dxc}|IO+|!p(m&k^`H҇*վO}>~ޞr|b危sRWYL^6pGmS_ T[5D̗Fs޴ɀ,e#t@^}_xVo!>Mē7vǤf+UP5BѷC% N SA[(m Pր ʘd10''"qCN=>W^\Gaa{GI^e:no/ꐾU/$F}o3Q} haT.0,+PWBu݋+BE@@Cqӡ'¢%eL= uIJj;)zrK5^'˃d+vCCttVa0azgP2p 00v^ʷt=yDϨطh} `&=NDv'}O.^}ߕ*T{SmpU7?M]QCvh\޲`f-T0Q U^_A_\~weƾ'y=Ottf`*A!`AOX=LZ,9i㡤1maC2Dk#xݞX9Q#K^1tBӏrrSJY/@_${xNlRU4>랣|<÷'}}|҇oZ nC@FF.O 9HrԏpSZ6֩ FOưajcKsyK 4IM&t0߂²BN)XN}ٚWKa gJz{3cĿ V  Y,i|v@0,s-aP$Cw/ . >u|]j5Yw dѢ|A56+p|'w_IPQ%7בtEU/ӞJb=c7Q<KҌ>  ODr|HPʗ|ZGfBk"fH"_(> )_u.[4jp1_5@=r!P@0_Ó9|YpRF o}8d2*:a j %M N\u$p7搒#ne>s/'z(ϳ-&g'l>gmV[=קob{^{гʁ'ƯYzU|J@ѽzFw3U:EUۚ$ U5~=HJ=F. yzT >Pss<:SS.lccS%H~)P(`08#E7Qɺ)t@P6y ;v(>`zk i5[XJ̃6As8l-N>c a<ԫ ~@V޿7%^gJ}K?20xRP` pK8ۑ?~zJ5)j3Z ~6ߊO# `@5 :sujkPXSZV- a25Va f񮡡Dc?NH$6vi&vE aX2A1\c`Z l#4;܂FH&Pa1iی_5ow jͷ{^ hL |m֢fZIj4y*1/S~^>'_6; _9׉LO__QBՃU7ԯ߯V7j-Ŀxt.oy!a=*]]oFBͮ"nj GLF[)Akٳ759_2/p8@8ivWg8JJG YAo+@ ֊}XdzԇG^ <( ] r cԉ>bP0`quDy<ߩ >2@$܀طImUԌȺ t.8f!FuZH<}06Ԥa $a%).v:25T*;hө?ө}v\.!lv}LlPi3^1.ϖ%QiZ%O3 Dr>1tK~R/,̉{3!?=Lg hs8qU?C{ĺtzq*N?:2Ǐ2+-Q0RB~x¯UkMUZ5[ekMGUoW[mY6bӎ,mҹ`> h`'H68jKVBN)DMJ&١(ir~%SSSill+CCI&¡5Vñr= bւ:a\__/ɟ _ֶ3S}*y 3~ _aEL~822ͩヅb`Ţ}Z{E;ZF:Z n{ͮm{R.{*\@H_jgW5H߷vhDTUTRAB p`AHz8}䇧>>>>LW_s]W[p%|O$ޏu| )|=zw9Yݑe p.t0I} RZEVp:9u~w6Map"> w ~,ot2ᡡ/Nѣp?Ə\%f|?W^Qf2ő]MnS?7רxOihU_VK{ͼw4uMɽ_7w]~h%tEXtdate:create2011-03-27T19:46:09+02:00%tEXtdate:modify2011-03-27T19:42:51+02:00|IENDB`./qwbfsmanager-1.2.1-src/qwbfs/resources/splashscreen.xcf0000644000175000017520000112573011400056447023060 0ustar pasnoxpasnoxgimp xcf file,BBSMf(,Layer 4 ,,o/?O_o/?O_o                        ,Layer 2 ,,#3 >)....9=A3LLLLLLLLMMM#M3MCMSMcMs 8|7|6|5|4|Ƽ3|  |߅gv |gqqg|guugguug|guug guug guug guug|guug| vu ug|  87稲6稵5稵4稵3稵  稵 稵ᘣţ稵ᘧקᘧקᘧקDz ᘧקǹ ᘧקǹ ᘧקҨᘧק  קǨ  8=P~~P6~5~4~3~  ~ ~CntnC~ntn~ntnent~~tnunttnu nttnu nttn~nttn$ nttnuP  8765 4 3 2 1 00//////0:6tl5Yba_diec4du3j~2hj3\3~\2U~q3x^3wW2U~`3~i3{T3}Y3i3}Y3~T3iծ-a}+ٺUq)~amp``fe`[Zq(RZc}{'pÿs'aÿl'軛{u({R~)RTi)Z¾n*W¾~+캫z¾n,품§i-sVƜ~.\ɩv.Zj/ѻXvuu{zupo0nox1򲄬1v12g3Rj3oފ2l|2嵉|2›渵| ¯!k길| ||!q|򊀩|!o|򊀯"mҾ|򊀯#Ҿ|򊀯|$ž|򊀯|%o|||%gɼ|%ҿ|&|'о' ' |':6Ӷ­5432䕡3323323333333-+މ)꣩Һ(重ȧŰζ'譛շ'̑׼'̸(饇ٶ)ꄉ͛)⍷Ơ*ҋ߹+ğ,Ϛ-㿩.͎͢.݌/΋ɺ0ιҵϽ1֫1ݢ1IJ2Θ332ڜ2˰޵2﹵޵ !ś޵ !޵ۨ!޵"ל޵#Ů޵$뻾޵Ȩ%Ɲ޵Ҩ%Ҙ޵ը%ި&'' ' Ȩ':6^5X)W{5Ri   4QS /K_^a``a3g 2d2 dfgjfg3K Xddi3?\de38&Qdd31Zdd3-^d38Odu38Gdnz35Vdhz35 Kdhw39Bdh35 Pfd36_mfdg39Qrmfd{-BX{rnfdd#+Ɠ^|rnfdd^*@I _|unfdN* 44xFuOm|uoD+'T+o|xo;(H»|x7(k2»D(:e»D*û>* eü@+˨ qüF+힇8ü@-aK<þ=.kĿG.T . ԫ0 rRZ 7p??T^~1m3ƾ1wW½1|<½2!v53v22ΘD~2}ZI܄~ uu#|ᄄ~ !~]x!~nu"麒~nu#΁黺~n&dj~n$({~n]%9~ne%~x~&'u' ) $(^=V<&==<==<==W====K=75?ҏ3 2 1p 1 1< 2 3 3 2 2? 2? ! !W ! "  #?  $?%?%-%x&''''7a`Y~qջ6qjfkh^`5s_4ra4ga4cp3lg3W3y\3lj3X3S3q]3-vvun,쵭nwvty~zx{}su+yt*v*|w)飨¼x( Ī|ˀ' Įl\& ƭqX&Ʈ'ĮmË(Ưh)r)Ưp)Ưi)p)Ǵr)ưlUU!ôlsgyztzsstqo }u qmr񩼾¹¿Űor¿Ƶsn ¿ƾux Ŀt v!{"v#l$m$o$%&'ŴgZ(pǯk(mm(ٲq)ڔ*gⴎ+gɟg,765ͬ444њ3ѥ3л3ѳ3Ѥ3Ѿ3ѽ3Ҫ3-Ůͻɢ,ĝǮ+ֺ* *˭)٪( ٳݦ' Ǜ& ݋& ٳͱ'ɝ߭(ș)ڸ))Қ) ̡) ƣ) ԞUU! ҝ ̥ ׺ſ˼ŧ Ϣɜ Ϥֲ׽̥ צ  ã!Ѭ"Ժ#Ǟ$Ϡ$ڢ$ܲ%߾&д'Ø(Ӝ(Ҝ(Ƕ桵)糿츳*˜β+ܾ,7F ,ğ6$ ?5abaa_[14dc04mjhnkfdcE5􄙜gdc ,3idb3oda?z3mdc/w3ndc~3odcCw3rdcCp3mdd!}3-wpAi2hU 4,j}' K +f7Yonqppqrqqok: +;ts9*tvwzvw~zx{vtsS~)httywts5T(ltuytr?'`tt tqK&jtt~ts7 &ntts !Z'^ttsPT(UttsP)ftx~tt#)Ytxts;)Otxtsc})_vtvtsW)o~vtvttG)`~vtvtsiuUU!hvtvutc编ovtwttV ghpvtuso3D2UJ>VU6IMvu tqprsqrtsstt_wutUwvtutvyyt}tYkwvtvvttiYl󽷲xvtwuto'!Ľxvt~wtrU"ľzvt}ttn ľ{vt}t: ž{vtt;!ž~vt^Z"ž~vte"%žvtmI$žvtt^~$žvt7$ſ#%ƿ3 w&½t J'½\+(Ľ(㷊TĴX)eInA1* Ӌ>>>>̨&ը&ب&&&&±&˨&Ө%ݨ%%%%%Ө%Ԩ$$$$$$ $DZ$ǿӵ$ DZ%>>>>>@&e&n&&&u&(['}%%%%u%4R%&$$$$$au)a au$źua$uRa$ кuR%>z>d>d>>&&&&&&&&%%%%%%%$$$$$$$,3  nݷp+mrg,|רjf+|昜˶,|~h㗜-|otj.|޶/ 0==|<|<|<|<|<<<|;|;|;|;|;;;;|;|<| @Ϟ+mנ,µf+ֱ,-.ݨ/Ͳ 0Ǻ==<<<ݨ<ب<Ǻ<<;;;;ݨ;Ͱ;;;Ҩ;<쿨 @͓/I߱2zNf+p1pU_m, }U_kN- ooH. ?ɍ؛/ 0u[<}<<<<u<R4=;;;;;;ua;ua;;<R A + ,y+p,g-^ .U߬)/ &%0==<<<<<<<;;;;;;;;;< @|ug ľ|ug º|ug | uv | g|q|z|z|g|g|g ̓|g Ʉg ̄gR Ѕg`a ԅ gR ׅ g\ چ ge |ge |gR |ngxR ǿ|ovR ǧ|ovR~ Ƿ| pvR~ ǧ|pv~ Ƿ|pv |grvg gg!gg"gtϺgºg ϺggغgvZagtg [a~ߑggv[aR[aR]aR RR!RR"R_īwRδR~ īlRqRΫRa$Rl_R~-~RRaiȨק Ϩק Ϩק Ϩ ק Ϩ ̘ϨϨШѨטҨӨŘ 箨Ř ᯱŘ ⯱Ř 䯱ŘΗ 寱 Ř 篱 Ƙ 鰱 ǘ Ș ͨʘ· Ө៘ ӽڠ ۠ҹ õ ޠ󹇣 ߠ ð⠢ 䡢 ᘻ!˜՘"ɘ¡ɰ϶ öȘ϶ӏ옧ö ֏粘؏ۏސ ڇڇ!̇"ŽŨ ŶŨ$臗Ŷ-ᣇi$tn $Putn @PRtn ePRtn nPR tVPR tdPRtd]RtdjRtntRt#{RtCd tCD tCD tCD tCD^  vCDddH  NDqdT  ZDdT ucDdT jDd^} d" Ǩ5ud8T дaaRdd88 Ǩau 88 Шaau8 aRuu d!s"zƻ-ddQƦQQDdQ ƻzQdƙQQdzzQDd 8Ddzou T!b"wiںz'TTCźCC8TC ںiC T}źCCTi$ziC8T-8Tii&%$#"!  !""!  !!""""!!(0 x                        , Background M,N,N^4u{}(8ِM $$7pJi6D[ٵ%\ L!>+=KPdA&            "       &            "       &            "       )5 %-Yn#p&B(a)<*+`,,,-*-@-R-b-o-z- - - - - - - - -  . 8. L. ^. l. x. . . .  .  .  .  . .  /  5/  K/  ^/ m/  {/  /  /  / ///&!           ׿      ن                DVZXD(DXZXXVTVYZDDZXX TTVW!mhTXĿybTV bTX зmTD ɯZTrTTrgTTX_TZYTTЌh_|vTTϨTTTTTTTTTTlTTTTV񞝝vTTZT dTTY 혗rTTV wTD tTZ sTX nTX?@@4}eTX?~}|u\TXWR? {zyjTX|cLنwo]TV0Ų  cTY TV  TY  0 ~~|{{z~|{{zywwv~||{zyywvutrq{zzywvutrqppomwvuttrqpomlkjftrqpomlkjgfe^FomlkjjgfdcbS??!sD+f/ si!(7Efg.) "9Ps;14""%%**-.-11Yz699%*-146699:%--146699:;='144699:;='99:;=:; =< =<;5=<;8:7=<;8:7665) <;8:76652210 8:776522110-- 6552110--)'' 10--))'&#  )'&#  #      9&ن qV)   􍎏 񐒓  $.9VWz  /Bb{!!$$&'&!!$&)+!$&)+,,..$&)+,../)+,../01+,../01/01/ 1010/10/-.,+10/-.,,+*((0//-.,,+**(''&$-,,+**(''&$$!! *(''&$$!! &$$!! !     3 poponohS! l#)$4%&&4'''''((2(F(X(h(t(((((((()),)A)R)d)r)~) ) ) ) ) ) ) ) *, *C *U *f *v * *  *  *  ;730-)&#        嫢ʔ[`gb`gb`s`` gb`sn`` gb`s`` i`sџn`` b`f~`` ``~~n`` ҿX````d`` k``b`` ``b b``k`` d``ۮ``a b``~i``d``~Ũ``ab``֥ÿn``d``|þ`` b``{`` X``sp``b``ÿ{j`X``q¾{j`b``{j`YFIX``n{j`dJIb``f`db̿JIOmX`db IImd``dbff 5II< BII  @II  JIIS BIIm۬ҜIIJ  JIIfnRII<ҿ7Pɫ4շ0Pɤ-ҷ*շ'ճ$ճѽ!ҳĽVĽZZPϿZZ Wҿ0ғҿ տ 󧓓μ½ɧ ҿ 䧧?=ӿƿ?@=䧧ſ ?=P pL?@䧧ħW?4ŽټzE? ݧ˿\??\Q??񱧧I?ED??է龽wRIf`??簧;Õz??@ӧ쾽~??@ܶǾ{??@ɧz??@ç苊m??=ѷV??+ñ򷶵 ?ñ󫵴`??@ñ v? ñ ~|{N??>P |{{zy\?P޷ ywvva?4PP utr^?@ܗPޫ 路Ppp]?˗ ɧlX?֗ ճɧO?˧?˗̗??= мᡗ_:A73_J2y-0--/--_-+_-)-( -(-(-(_- +p-+7EpN-+7EMOU¤JG -+7EMONUU[[Ɠ--$-?EMONU[__df-/-@U[__ddf«-,+77<-F_ddfgj g1-/EEMN8-E^fgjl ®++:-RUU[]?-1Tejl {EM1-@_ddffQ1-H\elk °UUT-8fgiT8 -qqO-42d>`3> qfSLOP&O'Ħfćdv* dqLddm)2dd`'&dd 'dd{ddvH Wvdd d-' fѨi,ix(ip$i i"ٶsip㶇i|iΔi֙iyЖi۽ipԧqiƆiiqiq~iqˌiqiq iq i  i  ~i qi ipiiqiiyiiiiiiiiipiwiiɩ|iisi۞riiiiߤiiզri~ii{i riiipr܃iiiqiiiiiiiixٳri iiҹriiiii iiŸ˟i ii멟  ii,($ "ƩĠۭ֪֩Ɵֵ˞ƎЙТ    Й Ў ˎҺ౑㶉ܷ 辑㞉㑠 葟܉ йع   @``@,߯@(`$`" @!0#$p&0'p)*0+0-`.`/`0` 10 10 2 3 4p 4 56p678 8909: ::;`;<<`<<=@===>>@>`>>>>         $ # # # # # " " " 0" " " " !                                +             $ # # # # # " " " 0" " " " !                                +             $ # # # # # " " " 0" " " " !                                +    / / !/ 60 M0 _0p0}00 0 0 !0 "0 $0 &0(0)051L1 _1  o1 "~1 $1 $1 &1 (1)1*1,1-1.122  72  82 !82  82  52/1,1(1 #C0 +0 #2/ &6. (4p+ *6AZ(   )06:>@A'B   #&(*+',  '  ) &*ۿ2                Ј       ڣyv}s~y޷     "N  kjgfedba`XG?edba`^]YM?@`^]\XWN@?=XWWQB?>VQD?@+2C?= ?= ?=  =            Ј            "N     2               Ј            "N  *  *   *" *$ *& +3  +I  +[   +l!  +{#  +%  +' +) ++ +-  +/  +2!  +3"  +5$  +:&  ,K( ,^* ,n+ ,|- ,. ,0  ,1   ,2   ,2   ,2!  ,3!  ,3!  ,3"  ,3!  ,2!  ,2!  ,2   ,0  ,, ,l( +5#  *k,  *2#  (4'  &`7)  $RC:."  "BA@>;61*$ ",+*)&$  " $ !& BIImgf¼IIJ JIIˑrVIIBIIdÿrIIIýcII5II[XIIIcRI5IIYcRIIcRIB5IIVcRIIOI@5I@ I@   * /56|6X66666ˤ6ב6ؤ6˙6Ј6Ш6п6ŋ6Ɯ6ƴ6ƽp6ƽ?+ ˗侼ʗ򯮭 㜗Ԩﯮ˗ξРͷܗȩȷ򧦥ܗȷ󛥤 ȷ ܗȷ P P P| P  @* |0|6|6|6X66666ˤ6ב6ؤ6˙6Ј6Ш6п6ŋ6Ɯ6ƴ6ƽp6ƽ ഴQQLKKHEE==:82-'*滴´}HE=::2-''״=::82''Ҵ2-' Ŵa%Ҿ)Ҿ*Ҿn +ҾɆ026ɴ:`6|6X66666ˤ6ב6ؤ6˙6Ј6Ш6п6ŋ6Ɯ6ƴ6ƽp6ƽ # &),/36:    /¿c.(-ҭ-Ѓ,T+л*ϟ*v)F(̲'˓'i&˼5%ɨ%Ȇ$E# )"O"   @# &|)@,/|37:    /¿c.(-ҭ-Ѓ,T+л*ϟ*v)F(̲'˓'i&˼5%ɨ%Ȇ$E# )"O" @    /¿c.(-ҭ-Ѓ,T+л*ϟ*v)F(̲'˓'i&˼5%ɨ%Ȇ$E# )"O"n"nn"Nn!^n!on!on!ߪn O] ?* q&* 2OLSnJ8*&Ln2n2 < & M  M  * &|=* n L &<MM eM e<!e"e#n$*&&|'L,(O*=R+&B-y/ }1&64262:L&>ii"iii"ri!ߠri!ߨiii!iii!iii iii rii iii {riiiiiixiiꛓiiiiqipiiiiqIiIviIiiyIIWdi QIcIQpii qgmWqIi IX~Wni II~ii IIWri [I~Ii cuuWqIi I[qط~II}iII\~IxiiqIfIi~] ĤgIWiW]󜥔z]IIcpi Ic~iq iiipi pi  pi!pi"piq#i$i&iq'pi(i*xi+i-i|/i1pis4i6pi:љxi>""""!ⷉ!Ή!䉲!䨑܉ ˉ 痑 ҉鰉枉찪ȉȉ%&'ȉ' ]I   4  (!4( ,88 IF4,F VV bŔ4'bLn^n qz`WizU]4 qH:FQ:: 4   !"#$&쐻'(*+-/146Ȓ:ȝ>,,--,,,,,,`,@,,+++@+**`**)`)(( (' '& &%$P$#"@"!  0 0!0"0# $&'@(*P+- / 1 4`6`:@>d ddO fddp ddq fddp ddq fd dd- fdd d' fddpddW fvddd fdp{d> Wd{dM'vd>'&ڵdvZ2  L  Z8f '&LK_ f}   2 l  2 :&MM*{& )=f  L &  7  G G Ge 7eeef'u&'LG G= 7& ffѷf'& 3hwtsronkiY' 2"2$&L(L2&&2L q iiޟ ҟi ii矟 şi i ~ iip뭟 냆 iiϟi ii穟i iiޫq iiiii٩iiiϭii rw iq i 裓iix iiqii ii ҠiipIqܵI ~iivII] pQIq iIWQQW iWqqIkI]kQc xiizI~II_c~WIWI iIIQIIWXaq iipIvY~IvXIIII}IiIRIIbbIWIIIIiIIIWYxIqizIIIiIW[[IRIIc~W[kci[cI|II~IIWSIiII}SqII̡cI\dWiISWSIffIiIfIcpSIqiixq]zII SIqӇiIIIzqSIIqiW{ڨI IqipI˺Iq qi ITW~i ~IW i I i ip ip ˌip~ipqipiƆiqiipƓi Ɠix i Ơwi~iƺqipi򆏨~ i"ip$ix(Ѩp ˹ 乹 ޹ 빹 Թ  ǹ ù  ۹ǹ艫 뿹Љ  ㉫Љ ܑ 螎     ԱI י   4 q4   ] q  4   "!((!(( 8%q388 8F2F]F4F7V8V%4'Vq@V7]bSbKSbAqŵqLbZ]]gn]]nL:n]8zqzWqz5Ԑ4 h&֟\ q:Q::-YI ]]v Ў +Й 4      ТЙŽ˞ž˧ ˧ ¢ ˱Ʊ±򠥺 "$(>>~>>>>>>>`>@>====@<<<`<;;`::: 99 88 766P544@ 3 2 1 0 /0 .0-0,0+ *)'@&$P#!   `"`$߯@(@``@              0                       0                       0               І         ˮ           2 ƨ              f  Ġ  ŷ  Ļ              І         ˮ           2 ƨ              f  Ġ  ŷ  Ļ              І         ˮ           2 ƨ              f  Ġ  ŷ  Ļ        6ƽ6ƽ6ƽ6ƽ+ƽ+ƽ+ƽJƽ"^ƽƽ#ƽ2pƽƽƽڗ7ƽ+ƽƽƽeKƽ+ƽƽƽL_ƽ&ƽƽƽ=pƽ"ƽƽ#ƽ2pƽƽƽ7ƽ+ƽƽƽeKƽ&4!gZL_Fҫ"ӫŵ\ϝtb\ZާhVIHGGEDDCBB?>=;::9776$ԆY410.,*('%$#!  kՈX3100/+(+''$##  ߩfVMKJIIHGFDFCCB? 5ٮҢvaXWV { ȸ          ﱶ ط     㪓 ڟ  uټ    6ƽ6ƽ6ƽ6ƽƽpiƽiƽiƽiiƽiiƽiiƽiiƽۨiiƽxiiƽiiƽiiƽiiƽpisƽiiƽiiƽiiƽisƽiiƽiiƽiiƽii~ƽiiƽiiƽiiƽiiƽiiƽiiƽxiiƽiiƽiiƽiiƽpisƽiiƽii4!giiZi~iiFҫ iiӫ i i\Ҿؼ~}|{zyyxxwwu$ŪHA=<<;86631..+)%%#kƩGA==<;886631.+))%%# ط 5ٮվ {            ﱶ ط     䮔   ټ    6ƽ6ƽ6ƽ6ƽƽƽƽƽ􉉸ƽƽƽƽ܉ƽƽƽƽȉƽƽƽƽƽƽƽƽƽƽƽƽƽƽƽ܉ƽƽƽƽȉƽƽƽ4!gZFҫӫ  \$¾}k¾} ¿ 5ٮ {             ﱶ ط     㩓 ֍  ټ     !4h>& w!L +,^  $1 ] _ _ ^2 _ _ _ ^2 _ _ _ ^2 _O"O" O" O"O+O + ƖpnO &ҎM@AOOK爰^>$$>[O_"ܜH7""4IO[@7!!3CO#܎|Νߚ>7! 2AOp2ߘ>6!2AOݗ>51AOܗ>40AO7ܗ>40AO+ܗ>3/AOܗ>3.AOͿܗ>3.AOKeܗ>2+AO+ۗ>2+AOۗ>1+AOܗ>/+AO_Lᴸ¹ۖ>1+AO"ۖ>/*AOۖ>/*AOۖ>.(AOp=ۖ>. 'AO"ۖ>. 'AOږ>+ 'AO # ۖ>+%AO p2 ږ>+ %AO  ܞږ>+$AO  ږ>*$AO 7e ږ>*$AO + ږ>)#AO  ږ>'!AM  ږ>'!AM Ke g0e _   6Z[cx664221.,,*)(%'()(,-/0012345677:;=>@ABCEFGGM]o   !!$%'*++-//37c   !"%'(++,-/137a==<::9:86655321345677889;<==>>@ABCEFEGGHHJJKLLMOZo V'UVWYd|    վ ־Ǽķ   骱 ڸڸ  θL2Ƹ|иdĸߦȮУO"O" O" O" OO i лO i̪Oi䩨ⱕ78Oiiݜ۠|22tOiiמחz//pOii􎲸|Νוz/.oOii֔y..oOii֔y--nOixՔx++nOii ֔x+)mOii ֔w))mOii֔w)'lOsipͿՓw'%jOiiՔw%#jOiiՔu##jOiiՓu!!jO~iiՓuiOiiᴸ¹ՓuhOiiԓthOiiԓtgO~iiԓrfOiiԓrfOiiԓreOiixԓqeO ii ԓpdO ii ԓpdO ii ԓpcO ix ӓo cO ii ӓn cO ii ӓn bO ii ӓm `M sip ӓm`M ii g0e _    髬"usrponmmlilmnoprsuuxyxz{|~  #).168;@BEHKMRRTWZ[^`bdfhkw  %).16;;@BEHLMRRTWZ]_`bdfhku䁁~~||{zyxyz|~5 վ ־Ǽķ   骱 ڸڸ  θL2Ƹ|иdĸߦȮУO"O" O" O" OO  O O󈰩߼Oܜ͹O{ɵO􎲸ž|ΝdzOƯO剉ĬOO Olj O뉉OͿOOωO뉉OOᴸ¹O׉O񉉩OO}}O݉yyOttO ppO nnO 剉 iiO  eeO `_O lj \\O 뉉 WWM QQM g0e _  7驧}}yspke^\UPE?5,#'0>JQ[bfksx~ytpke^\UPE?5,#'0>JQ[bfksx~䫪7 վ־Ǽķ   骱 ڸڸ  θL2Ƹ|иdĸߦȮУ ??????? _U;741-*'%" ۈzm/3W +23 +23Ch33S +23C?33 +23C33S 03Cs?33֏38UM33S _U;8zw45|pj1vwnj.zwkjx+zvj(zvjp%vjp"\wkjpͺynjpþ5sjzj\jx njjvjj~yjjsjjjx\jjΡ\nxף׆֏ί׆ _U;::::7D3a0la-ll*lD"'Dy"$al""y l"!"  " D"Q"Q8"_21"%*ar"""-167Ѯi"$",;ѮƤ"#%**+"0BFѮH$"$1166("/AѮ㤤%%*"8;;?A+"$Y16$",BFFGG7$"֏㤤;;:"(GHJ9(" 2:9(9(9(9(9(9(9(9(9(9(9(9(9(9(9(9(9(9(9(9(9(9(9(99&    ( */,* ( )'$           \v|z\(\z|wspjpv|\\|wskjpyv|sk j~~jsz \yvn jxxjv|sjp¶xjjvypj ž5|sjx$Ծkjx jjjxujοٟ}uһšҸ  jjjj{jw󜛚rjw𞜛jzsjn5랜yjv螜{kjkvܦ~mjy1QQQ1%1Qyw7QyQyz 1l 셇 DyQQ-BSwx1ymyQ!%E`Ile"%%**11676;;js2 "%**16;?BBFFG{W" %*16;?BBFFG"%%**1166;?BFFGHKK""%%**1167;?BFFGHK"%%**1167;?BFFGH K%%**1167;?BFFGH KJ%%**11676;?BBFFG KJIE%%**176;?BBFFG KJIEHDCC %**16;?BBFFG KJIEHDCCB>>=%*16;?BBFFGH KJIEHDDCB>>==;88%%**1166;?BFFGH KJIEHDDCBB>==;88200%%**1167;?BFFGH KJIEDDCBB>==;88220.*&%%**1167;?BFFGH KJIEDDCBB>==;88220.*&"$1676;;??BFFGH KJIEDDCCB>>=;88220.*&"$6;?BBFG KJIEHDCCB>>=;8200.*""?BBFFG KJIEHDCCB>>=;;88200.*&" FGH KJIEHDCCB>>=;;88200.*&"$ GH KJIEHDDCB>>==;88200.*&"$9FKJIEDCBB>==;88200.*&"$"1?FKJIEDDCBB>==;88220.*&"$"*16BBDDCBB>==;88200**&""0    ӿ     ~0nv js jk\ pj }jjw pojj jjvjj|jj|jj|jj|jjyjj5jjn jj| j zjjy jjn j\ j| jw w~p$70 ;? BFF G, GHK/ K/ K KJJ JIB HD B2 ; z     } <85 2 00m-,*)) z     } <85 2 00m-,*)) z     } d<d8d5 d2 d0dd0dd$d-ddd|}u~d,d~|yux}d*d }uu}uz9)dIzuu~|uz)d$xuu~uzuu<8E35? 21uw    я`z ع\ic Zd_ զw            >%% U  U      ݽ             >%% U  U                   >dddd%dd%dd ddddddddddddddddld}tdddd|dd dwuyvv{ddd}+d dluuvuufdddddzddxu~d~\{wwdXddluuwdduyuydpcy|uxvu{uuv}uv}$d}duFddyu0wux0d!,%b+%x3 ! {M/?Do ! vv fw[/      䚲Ŧ      ͪ ˪" թ ҳ( Ұ* l-QLtƽLL4~ƽƽn~ƽ*+>ƽ*+ƽ^ƽ;ƽ߹ƽ=LQ,xƽx,,&;ie22]2!=; h| (+ n"";y$2*n@'+Np+="345675"/e2&    %fUf      䚲Ŧ      ͪ ˪" թ ҳ( Ұ* l-Qir謃ƽiڗڐƽii~ƽiiƽi>ƽiƽiƽiiz;ƽiizƽiiߜxƽxiiܰ,iiiiiiipiipiip]iip!pii hiip (piiy iy"piy$i숧@'i񁙩+isi/Ѩ i   %f@UUf      䚲Ŧ      ͪ ˪" թ ҳ( Ұ* l-Q黝ƽƽ˘ƽƽ>ƽƽƽܗ;ƽ܉ԗƽᯤxƽ῟,i]! h ( "y$졶@'񛬺+/ܷ ddddd ddd dddd d%dddC{GC d }w{v{~d{}zywy~}z}dy|wwvywuuvuxuv{|ddC~}{xuyu~d|vuw}xuIMGvuvuvdtxvuz$}d~uvuuw~d _ _ ^2 _ _ _ ^2 _ _ _ ^2 Y2 2, 6Y~+6Y\4NhvČ~;Ĕꨜsϑe,P-Mg٣٧٩޴֑׮٫ ;|48Ţu*̲ 2Һ;&/ŘO.Q6_"Փ=0+AML Ւ=/+AML Փ=1+AM &LՓ=1,AM&Փ=2-AM"Ւ=2.AMԒ=3/AM"Ԓ=3/AM&Ԓ=4/AHL~ӷźՓ>50AH ſՔ>51AH i֘@61BH ;٣K8!!6JH&!Q&޶dA$$D`H!̽ΗVGIVH"ǢH"H"׷̰H"娮ѵH"ҸH"H" H"H#g@"y#> /,,+       ٣٧٩޴֑׮٫ ;|48Ţu*̲ 2Һ;/ŘOii.Qi6siғAAwMi ѓAAwMi ғCCxMiix ғFFzMiiғHH{MiiѓKI|MiiѓML}MiiѓNN~MiiѓPPHii~ӷźѓRRHip ſѕTTHi iҘVVHi ;գYYH!Q&ܵcdH!̽ϬH"H"H"׷̰H"娮ѵH"ҸH"H" H"H#g@"iy#i> /,,+      U ٣٧٩޴֑׮٫ ;|48Ţu*̲ 2Һ;/ŘO.Q6M M M ©MŭMDzMʵM˺MλH~ӷźпH ſH iH ;H!Q&H!̽H"H"H"׷̰H"娮ѵH"ҸH"H" H"H#g@"y#>d d/dd,dd,dd+ddd ddd d3|d d d d~uyd^u~}zld dd3wuu}dwuuvu| d dd?<۞ҍ@ߑ6 ڛC1H .N -,+  U dJ/䈛!,7& 33UMM?33~3333S(33 <33 U$33x 335 ֏3<33 (33UљLj334 3pMU;33 (33UϸNM3343¾{Y?33(33L¼Z33233ſ}}K3333Cþ}o@33233}oK;333A}}oK;3233u}oK;3-33?}oK;31p233831$31$ 1331$  % %$$$$$$$$$$$$ $ $ $ $ #v #### ###### # # # " """ """ " " "      P~׆׼U ̆֏꓆ǯڑާޱӿ㉆Ƚ˘秆ı׌ê𯆆꽚ý𕓒񯆆ý󉒑ýĽlj{ Pjjk ~ysmPwjjy zupjP\jjmzup jPsjjvyup jpwy5%v jnv|\%vjnv|\$$v|y\$$$$$$$$$$ $ $ $ $ #v #### ###### # # # " """ """ " " "      ϤcFF/"GHKE9/""~ꤤ㤤GGF"+KJC׼դqKK9""9KJIEHDUᤤܤKKJ*%FKJIEHDCCB>֏ sKKB>JJIIEHDDCBB>==;դפJJIIEEDDCBB>==;8822쭤qEDDCBB>==;88220.*&դؤBB>==;88220.*&"$檤㴤k;8200*&""դͤ|200.*""߮Ǥm*&"ꤤظP#ǰ'ꤤǰr*ǰ\+ꤤǰm0112%% $$$$$$$$$$$$ $ $ $ $ #v #### ###### # # # " """ """ " " " d dd dddd d ddu::W;;#<N=?.3+$&%"3                ņ                                       ÿ ÿÿ ÿ ÿ ÿ ÿ ¿¿ ¿ ¿           蚙~pjs53욙zojnzꜛzmjnz鞜ukjnz򕓒{pjpz鞜 ukjv\ yojk| zsjvz zsjny ypjny5 uojkwv3 ztkjny\ {uojp|5~vpjkvz ~vpjpy\ {uojnwz jnwz jpwz s|v          ņ                                       ÿ ÿÿ ÿ ÿ ÿ ÿ ¿¿ ¿ ¿           "%.*"3=62++%"%&"CB>>=;;88200.*&">=;;88200.*&"$8200.*&"$0.*&"$!"$#$'$!3                ņ                                       ÿ ÿÿ ÿ ÿ ÿ ÿ ¿¿ ¿ ¿      ddd d  ddd ddp 2 ~ p 2 ~ p 2 ~ ))(((U(((m(())*+,-/U0013367f8m))(((U(((m(()U)*U+ܢ,-/U0013367@f8m)d}uu|uzuuv)dutuurlzdd~tu(dd|uu{ddd~u(dCuddd(d~uuzdd(dzuu}dd(dwuuvdd(dvuuvd$~x^ud(dud[ytyuufd(dxuuyddxud)dwuu{[d~uxdd)d|uuvpdd|u|3d*d|uuvdzu+d{uuwld.zu,d{uy3d.xu-dyu~dzu/zu{di{u0zu{tdtuw0vuut{w~|xv1+Cxuv~uu3|zuztX.zu3~~uwuyvu6{uzuvzu7Gw~{83$1Qa0%&!.s0y/m W/s:7;4;4A1%2^%1e10  /aN.! r. r.IKN/.'/,,0Uo+i1 2M2, 3CX6ܾ7s>8ffUffmfUmUmU  Uf   fffmU ;fwUffUܟff@mUUfUmUmժU@@  UfU  fff@mU ;fwx|~d~u}dd~dfzvwu~duv{d\vu~d.dFz~yu3dd|uuvyvxz|uvuduzvdCwucd\vdutudduud9t|{x}uuwdduyu|{dxu+dz}u{3dFvuzdxuuXduddwyuvcd}vudvuud}uu3d}uud3vu~dd|~uud|uduw.d0zyzGddxuuXdx{uKduuy3dzvudMyvxu~d@~uxy+du@d|zu~dudzud~uxduuvdxuu}d }uvuuvuu+dXvuxz~d|tud~xyvvuyd~xzu}dCvuu~uvu'dwyyvddvuCvzud|^utvzd@u~utxuv}du{twddu~{uxu|d}Mzuudxuu}uwuxdud|~tuuxizvuuzudd|y{u~dGxuu~Xuvwtuvu~vu| d xuuvdyuv~u\lu}dCvuuxu}d}uuyuyuyzyu|yyvuuy.~uu3d|utlu}\uzGdu{dyuu}wu}$iv+Myvuuuu~ddzyvuyuuFddxu'{uutxXddzuudd dX\}wuwpzt~uu|ddyuddwuuw~vudddd{uuduy{u{uu|dd$xuvu~duyu|fuvdzuud{uuux~uw$ddvuwCdyuu0|u}dzuudIyuuuuyuusd}uuu{yu.uu{dGxuu~u~u}pvuwut+9qzuvv~uxMyuw ~uluz~yuxvuvuvuwl yuzc33vvzvuzquwyyM}uuu| K|vuz vtuuvuvuy{vxyux+{yxz 3C{zuuw{ vuuv$\'Cu vuu};.|~xӜC7iYL)E8Ah E Ѯn4JB [cdr ,F;l>x6 Q7 c׿7:NHjN BVF:w| c¾kι:i9 gNjB=AS7>XN í:H}(Kú-cu c(<\r߮yR~ox6WvJIWLy"Jd˦u]slwj!tJˮV9 yQ [n!tdNNݽT37"< Jes. P1Rt ,wlVKrW ?6NL#NR jcNFd l*-wd z d7 #rP $:ߖO!HNhm4Qb4! b $¿V . xIս 8Ȱ  p6WH Jz# l; MwU   f mUU UfU f   U   f 58U@@   f@ܟ @ mUU @UfU f@@   U   f@ @@58dG{\utw|}yCCvuxwCKvuud|xxy~{}}}|d}uy~{{drtuu'ddddut}dXd{u~ ddddwuuxvu$dddiu ddwuu{udddGu~t d |uuyuvdd+u}d {vucdwu~+dd zu~x.d~uxuuvzxrfuxwu{yduv u~$GC~|0~xuuvvwu}d| uvyuuzuxydxuuxudyuvuvuvwuzdyvxvtx|dwuwuv~uuvuvwd3uwyvdvuwv~z{v{uv} d }uu}d|u0 X~} dxux d~wuu d xvv d'vuu duuv[ dud|uy+ dwuuydi|y{xuvudcvuu{u~uvud{u{yuy}F{v}}uvuK{uvuuy{ql5yzuu}8+|}+8D ͣ~R+YNF1rxtNdkjtjmC&m 78+'X/Pc,B 5daAN  Y m&z#w]h |(mz Ú{k  D۳Xa_{0hovu71uH ^BJ ("Lc]%6a;e˪$!5dN38 U   ffUUmUmUm (=U  @@ff@@UUmU@mUUm@U @(=Ud}uddzu{zv d ddwudyuvuv d ddvtuud$uzy}9ddduyd|vuzcdIuy{dd}dy}.dIzuvd~uwusd[.}uvd~uuvdudyuuvuud\uzldxzxdu~dd}duvpduyduwu~ddzudx}zudc{uuvuz~xudzuuvddyuuwuvdzu}uzd$uwd}uuy3d~uuwMdwuv~utdwuxzu~dyudpu}dyuydu~uv[0uuvwzuxd}tuu~d{uutwdzuuvzdxu|u}~uuwyutvd{u}duuv~fd|uu}wupdzuywvwufuv{~ddxvu}d}vuKd~u~dzuu~w+}udxu|zu~}uvduxd|u}ddddyudyuuxXu0uu~yuuvtudvuXdzuu3dddqvuxXdyuu|xu{uzuu z{uv3d{uzdyut|cd{yu}d~uuizuu{Kcyutuwd~u{d~uuy}uutvuxddf{uxuu~{u$dduvFXuF3~zu|uvCduwxtu}{~u{yuyxuvuvuxCzu[zuwuuuzzuvF|wuvF$yu~vu~{u$uvuuyu.uvuw${xvxy|uuw|}}uuuyzuvl~zvuCz[yuu~'3ruuy}~9~z zvyM}}vur}u(}u{=o0*+c()O Po9v mFB D5 _~ Hn*U@  4PI=! ն3P h T30#h{# z.zN-iѼ> ~/C6z;(%4e3VA% Od]~v{y ;.vJlx\psXx,jl $T[ .7'{v}@=l iQ19.x\HDe}K6RVj ILp9Fv~ew9!CSlei` & Hz]W.ܱt&7%6<e  0fmfmUfmUm mߪ !!!["#f# %'^).  0 fmUfmU@@UfmUm Umߪ @!!!["#f# U%U'^).d ddd ddddd0dddd}ddd3d[.}uvdiG~l$dd|v{zd\uzldׁuyyvuvzx}z dyvuduydyuu{uyuzuuwvfwddztuv}dc{uuvuz~xudցuu|uvwuvuvuw~d$ $wxu{d$uwd}uuy3dM}xuutzuz{zu{u}utx|fdd}{zuuvuzdyudpu}duvizdd'Cvuvdduzuuvxuuvvd}tuu~d{uutwd{uy ddyuwuu{ddxuvw{uxd{u}duuv~fd}udduzdduuyd3uv~d}vuKd~u~dudduzdduudvuu{vd|u}ddddyuu{dd vudu~dyuuyyzdzuu3dddqvuxXƀxudwuvdudzu}dyut|cd{yu}Մ{uuvMd~uzIu{xd~uuy}uutvuxc{u}~CdduwlKvuGXuF3~zu|uvCpwuv|vdd~uv{xuv{$xuvuvuxCzu[}~tuwvw|d~ux|}yuuvx}|wuvF$yu~Xv$z}widd}u|s x|yu}.uvuw$9dwvuuvut I.zxuxzuvl~zvuCdwuv}I9~zzvydwu!ddduz!d{uy![d|uI"dρul#uC# 9lwtuu%~xuwuu|'^.~xv~\~ri@}uuvG)~yxuuzw}uzwx~uyw.{|uuvuuvuv~[D5'W U@ "Oy>! Fܨ. ! YZ7. W h o+;h{# OۂzN-tӞ> ~G'0 Uk=C66/8e3VAtk =2sv{B h:x u0l $B\ Z4>t7(-./0122345667899:;<==>?(-./0112345567899:;<<=>??'-./0012344567889:;<<=>??@&-.//012344567789:;;<=>??@A%-./012334567789:;;<=>>?@AB%-./011234566789::;<=>>?@AAB$-./0012345567899:;<==>?@AABC#-.//012344567889:;<<=>?@@ABCD#-./012234567789:;;<=>??@ABCCD"-./011234566789::;<=>??@ABBCDE!-.//012345567899:;<=>>?@ABBCDEF -./012334567889:;<==>?@AABCDEEF -./011234567789:;;<=>?@@ABCDDEFG-.//01234556789::;<=>??@ABCCDEFGG-./012334567899:;<=>>?@ABBCDEFFGH-./011234567789:;<<=>?@AABCDEEFGHI-.//01234556789:;;<=>?@@ABCDDEFGHII-./012334567899:;<=>>?@ABCCDEFGHHIJ-./011234567789:;<==>?@ABBCDEFGGHIJK-./01234556789:;;<=>?@@ABCDEEFGHIJJK-./012234567899:;<=>??@ABCDDEFGHIIJKL-.//01234566789:;<==>?@ABBCDEFGGHIJKLL-./01233456789::;<=>?@@ABCDEFFGHIJKKLM-./001234567889:;<=>>?@ABCDDEFGHIJJKLMN-./01234556789:;<<=>?@ABBCDEFGHHIJKLMMN-./011234567899:;<=>?@@ABCDEFFGHIJKLLMNO-./01234566789:;<==>?@ABCDDEFGHIJJKLMNOO-./01223456789::;<=>?@AABCDEFGHHIJKLMNNOP-./01234567789:;<=>??@ABCDEFFGHIJKLLMNOPQ   -./001123344556778899::;;<<==>>??@@AABBCDEFG -.//00122334556677899::;;<<==>>??@@AABBCDEFGH -./01122344556778899::;<<==>>??@@AABBCDEFGHI-./00112334556677899::;;<<==>??@@AABBCDEFGHIJ-.//00122344556778899:;;<<==>>??@@AABBCCDDEEFFGGHIJK-.//0112334456677899::;;<==>>??@@AABBCCDDEEFFGGHIJKL-./00112334556678899:;;<<==>>?@@AABBCCDDEEFFGGHHIJKLM-./0012234455677889::;;<==>>??@@AABCCDDEEFFGGHHIJKLMN-./0012234456677899::;<<==>??@@AABBCCDDEEFGHIJKLMNO--.//0112334456678899:;;<<=>>??@@ABBCCDDEEFFGGHHIIJJKKLLMNOP-.//011233455677889::;;<==>>?@@AABBCDDEEFFGGHHIIJJKKLLMMNOPQ.//011233455677899::;<<=>>??@@ABBCCDDEFFGGHHIIJJKKLLMMNOPQ/0012234456677899:;;<==>>?@@AABBCDDEEFFGGHIIJJKKLLMMNOPQR01223445667889::;;<==>??@@ABBCCDDEFFGGHHIIJJKKLLMMNNOOPPQQRS01223445667889::;<<=>>??@AABBCDDEEFFGHHIIJJKKLLMMNNOOPPQQRRST1233455677899:;;<<=>>?@@AABCCDDEFFGGHHIJJKKLLMMNNOOPPQQRRSTU233455677899:;;<==>??@@ABBCCDEEFFGHHIIJJKKLMMNNOOPPQQRRSTUV3455677899:;;<==>??@AABBCDDEEFGGHHIJJKKLLMMNNOOPQQRSTUVW345567889::;<<=>>??@AABCCDDEFFGGHIIJJKLLMMNNOOPPQQRRSSTTUUVVWWXX45567889::;<<=>>?@@ABBCCDEEFGGHHIJJKKLLMMNOOPPQQRRSSTTUUVVWWXY5667889::;<<=>>?@@ABBCDDEEFGGHIIJJKLLMMNNOOPQQRRSSTTUUVVWWXYZ667889::;<==>??@AABBCDDEFFGHHIIJKKLLMNNOOPPQQRRSTTUUVVWWXYZ[67889:;;<==>??@AABCCDEEFFGHHIJJKKLMMNNOOPQQRRSSTTUUVVWWXXYYZZ[[\7889:;;<==>??@AABCCDEEFGGHIIJJKLLMMNOOPPQQRSSTTUUVVWWXXYYZZ[[\\]889:;;<==>??@ABBCDDEFFGGHIIJKKLLMNNOOPQQRRSSTUUVVWWXXYYZZ[[\\]]^89:;;<==>?@@ABBCDDEFFGHHIJJKKLMMNNOPPQQRSSTTUUVVWXXYYZZ[[\\]]^9:;;<==>?@@ABBCDDEFFGHHIJJKLLMMNOOPQQRRSSTUUVVWWXXYYZ[[\\]^_ @:;;<=>>?@@ABBCDDEFGGHIIJJKLLMNNOPPQQRSSTTUUVWWXXYYZZ[[\\]]^^__``;;<=>>?@@ABBCDEEFGGHIIJKKLMMNNOPPQRRSSTUUVVWWXYYZZ[[\\]]^^__``aa;<=>>?@@ABCCDEEFGGHIIJKKLMMNOOPQQRRSTTUUVWWXXYYZZ[\\]]^^__``aabb<=>>?@@ABCCDEEFGGHIIJKKLMMNOOPQQRSSTTUVVWWXYYZZ[[\\]^^__``aabbcc==>?@@ABCCDEEFGHHIJJKLLMNNOPPQQRSSTUUVVWXXYYZ[[\\]]^^__``aabbccd=>?@@ABCCDEEFGHHIJJKLLMNNOPPQRRSTTUUVWWXXYZZ[[\]]^^__``aabbccdde>?@@ABCCDEEFGHHIJJKLLMNNOPPQRRSTTUVVWWXYYZZ[\\]]^^_``aabbccddeef?@@ABCCDEEFGHHIJJKLMMNOOPQQRSSTUUVVWXXYZZ[[\\]^^__``abbccddeeffg@@ABCCDEEFGHHIJJKLMMNOOPQQRSSTUUVWWXXYZZ[\\]]^^_``aabbccdeeffggh@ABBCDEEFGHHIJKKLMMNOOPQQRSSTUUVWWXYYZ[[\\]^^__``abbccddeeffgghhABBCDEEFGHHIJKKLMMNOOPQRRSTTUVVWXXYYZ[[\]]^^_``aabbcddeeffgghhiiBBCDEEFGHHIJKKLMMNOPPQRRSTTUVVWXXYZZ[\\]]^__``abbccddeffgghhiijjBCDEEFGHHIJKKLMMNOPPQRRSTTUVVWXXYZZ[\\]^^__`aabbcddeeffgghiijjkkCDDEFGHHIJJKLMMNOPPQRRSTTUVWWXYYZ[[\\]^^_``aabccddeffgghhiijjkklDDEFGGHIJJKLMMNOPPQRRSTUUVWWXYYZ[[\]]^__``abbccdeeffghhiijjkkllmDEFGGHIJJKLMMNOPPQRRSTUUVWWXYYZ[[\]]^__`aabbcddeffgghhijjkkllmmnEFGGHIJJKLMMNOPPQRRSTUUVWWXYZZ[\\]^^_``aabccdeeffghhiijjkklmmnnoFFGHIIJKLMMNOPPQRRSTUUVWWXYZZ[\\]^^_``abbccdeefgghhijjkkllmmnnopFGHIIJKLLMNOOPQRRSTUUVWXXYZZ[\\]^^_``abbcddeffgghiijjkllmmnnooppGHIIJKLLMNOOPQRRSTUUVWXXYZZ[\\]^__`aabccddeffghhiijkkllmnnooppqqHHIJKKLMNOOPQRRSTUUVWXXYZZ[\]]^__`aabccdeefgghhijjkklmmnnoopqqrrHIJKKLMNNOPQRRSTUUVWXXYZZ[\]]^__`aabccdeefgghiijjkllmmnooppqqrssIJJKLMNNOPQQRSTTUVWWXYZZ[\]]^__`aabcddeffgghiijkklmmnnoopqqrrsstJJKLMMNOPQQRSTTUVWWXYZZ[\]]^__`abbcddeffghhijjkklmmnooppqqrssttuJKLMMNOPPQRSTTUVWWXYZZ[\]]^__`abbcddeffghhijjkllmnnoopqqrrsstuuvKLLMNOPPQRSSTUVWWXYZZ[\]]^__`abbcddeffghiijjkllmnnoppqqrssttuuvwKLMNOOPQRSSTUVVWXYZZ[\]]^__`abbcddefgghiijkklmmnooppqrrsstuuvvwwLMNNOPQRRSTUVVWXYYZ[\\]^__`abbcddefgghiijkklmmnoopqqrrsttuuvwwxxMMNOPQQRSTUUVWXYYZ[\\]^__`abbcdeefgghiijkklmmnoopqqrssttuvvwwxyyMNOPQQRSTUUVWXXYZ[\\]^__`abbcdeefgghiijkllmnnoppqrrsstuuvvwxxyyzNOPPQRSTTUVWXXYZ[[\]^__`abbcddefgghijjkllmnnoppqrrsttuuvwwxyyzz{NOPQRSSTUVWWXYZ[[\]^^_`aabcddefgghijjkllmnnoppqrrsttuvvwxxyyz{{|OPQRRSTUVVWXYZZ[\]^^_`aabcddefgghijjkllmnoopqqrsstuuvvwxxyzz{{|}PQQRSTUUVWXYYZ[\]]^_`aabcddefgghijjkllmnoopqqrsstuuvwwxyyzz{||}}PQRSTTUVWXXYZ[\\]^_``abcddefgghijjkllmnoopqqrsstuuvwwxyyz{{||}~~QRSSTUVWWXYZ[\\]^_``abccdeffghiijkllmnoopqqrsttuvvwxxyzz{{|}}~~QRSTUVVWXYZ[[\]^__`abccdeffghiijkllmnoopqqrsttuvvwxxyzz{||}}~ ~;:875 4 2 1 0.-,+*('&%$#"!                                                              HIJKLMNOPQRSHIIJKLMNOPQRSTIJJKLMNOPQRSTUJKLMNOPQRSTUVKLMNOPQRSTUVWLMNOPQRSTUVWXMNOPQRSTUVWX YZYNOPQRSTUVWXY Z[OPQRSTUVWXYZ [\PQRSTUVWXYZ[ \]QRSTUVWXYZ[\ ]^RSTUVWXYZ[\] ^_STUVWXYZ[\]^ _ `TUVWXYZ[\]^_ ` aUVWXYZ[\]^_` a bVWXYZ[\]^_`a b cWXYZ[\]^_`ab c dWXXYYZ[\]^_`abc d eXYYZ[\]^_`abcd e fYZZ[\]^_`abcde f gZ[[\]^_`abcdef g h[\]^_`abcdefgh i\]^_`abcdefghi j]^_`abcdefghij k^_`abcdefghijk l_`abcdefghijkl m`abcdefghijklm nabcdefghijklmn obcdefghijklmno pcdefghijklmnop qcddeeffghijklmnopq rdeeffghijklmnopqrseffgghijklmnopqrstfgghijklmnopqrstughijklmnopqrstuvhijklmnopqrstuvwijklmnopqrstuvwxjklmnopqrstuvwxyklmnopqrstuvwxyzlmnopqrstuvwxyz{lmmnnooppqrstuvwxyz{|mnnooppqqrstuvwxyz{|}nooppqqrstuvwxyz{|}~oppqqrrstuvwxyz{|}~pqqrstuvwxyz{|}~qrstuvwxyz{|}~rstuvwxyz{|}~stuvwxyz{|}~tuvwxyz{|}~tuuvvwwxxyyzz{{|}~uvvwwxxyyzz{{|}~vwwxxyyzz{{||}~wxxyyzz{{||}~xyzz{{||}~yz{|}~ z{|}~ {{||}}~~ {||}~~ |}}~~ }~~ ~ 󁂂ꀁo'"!%(+.0 3 579;>                                                             SRQPONMLKJIHGFE TSRQPONMLKJIHGF UTSRQPONMLKJIHG VUTSRQPONMLKJIH WVUTSRQPONMLKJIH XWVUTSRQPONMLKJI YXWVUTSRQPONMLKJ ZYXWVUTSRQPONMLK\ [ZYXWVUTSRQPONML] \[ZYXWVUTSRQPONM^ ]\[ZYXWVUTSRQPON_ ^]\[ZYXWVUTSRQPO` _^]\[ZYXWVUTSRQPa `_^]\[ZYXWVUTSRQb a`_^]\[ZYXWVUTSRc ba`_^]\[ZYXWVUTSd cba`_^]\[ZYXWVUTSe dcba`_^]\[ZYXWVUTf edcba`_^]\[ZYXWVUg fedcba`_^]\[ZYXWVh gfedcba`_^]\[ZYXWihgfedcba`_^]\[ZYXjihgfedcba`_^]\[ZYkjihgfedcba`_^]\[Zlkjihgfedcba`_^]\[mlkjihgfedcba`_^]\nmlkjihgfedcba`_^]onmlkjihgfedcba`_^]ponmlkjihgfedcba`_^qponmlkjihgfedcba`_rqponmlkjihgfedcba`srqponmlkjihgfedcbatsrqponmlkjihgfedcbutsrqponmlkjihgfedcvutsrqponmlkjihgfedwvutsrqponmlkjihgfexwvutsrqponmlkjihgfeyxwvutsrqponmlkjihgfzyxwvutsrqponmlkjihg{zyxwvutsrqponmlkjih|{zyxwvutsrqponmlkji}|{zyxwvutsrqponmlkj~}|{zyxwvutsrqponmlk~}|{zyxwvutsrqponmlk~}|{zyxwvutsrqponnmml ~}|{zyxwvutsrqponm ~}|{zyxwvutsrqpon ~}|{zyxwvutsrqpoo ~}|{zyxwvutsrqqpp ~}|{zyxwvutsrq ~}|{zyxwvutsrq ~}|{zyxwvutssr ~}|{zyxwvuutts ~}|{zyxxwwvvuut ~}|{zyxwvuu ~}|{zyxwwvv ~}|{zyyxxwv ~}||{{zzyyxw ~~}}||{{zyyx ~}|{{zzy ~~}}||{zz򁀀~~}||{{~~}}|{~}}|@ 5.)$ !$'),.02 4 68:<=    DCBA@?>=<;:987655443321100/..-EDCBA@?>=<;:9877665543322100//.-FEDCBA@?>=<;::99887765544322110//..-GFEDCBA@?>==<<;;::99877665543321100/..-HGFEDCBA@?>=<;:99887765544322100//.-IHGFEDCBA@?>=<;;::9987766544332110//. -JIHGFEDCBA@?>>==<<;;:99887665543321100/.. -KJJIHGFEDCBAA@@??>>==<;;::9887765544322100/.. -LKKJJIIHHGFEEDDCCBBAA@@??>==<<;::9987766544322100/.. -MLLKKJJIIHHGGFFEEDDCCBBA@@??>>=<<;;:9988766544332110//.-NMMLLKKJJIIHHGGFFEEDDCBBAA@@?>>==<;;::988776554332110//.-NMLKJIHGFEDDCCBBA@@??>>=<<;::998776554332110//.-ONMLKJIHGGFFEEDDCBBAA@@?>>==<;;:9987766544322100/.-PONMLKJIHGFEDDCCBBA@@??>==<;;::988766544322100/..-QPONMLKJIHGFFEEDDCBBAA@??>>=<<;::988766544322100/..-RQPONMLKJIHHGGFFEDDCCBAA@@?>>=<<;;:998776554332100/..--SSRRQQPPOONNMMLKKJJIIHHGFFEEDCCBBA@@??>==<;;:998776554332100/..-TSSRQ POONNMMLLKKJJIHHGGFEEDDCBBAA@??>==<;;:998776554332110/..UTTSSRRQQPPOONNMMLLKJJIIHGGFFEDDCCBAA@??>>=<<;::98876554332110/.VUUTTSSRRQQPPOONMMLLKKJJIHHGGFEEDCCBBA@@?>>=<<;::98876554332110/WVVUUTTSSRRQQPOONNMMLLKJJIIHGGFEEDDCBBA@@?>>=<<;::98876654332110XWWVVUUTTSRRQQPPOONNMLLKKJIIHHGFFEDDCBBAA@??>==<;::9887665433211XXWWVVUUTTSSRRQQPOONNMMLKKJJIHHGFFEEDCCBAA@??>==<;;:988766543321YYXXWWVVUUTTSSRQQPPOONMMLLKJJIIHGGFEEDCCBAA@??>==<;;:98876654332ZZYYXXWWVVUUTSSRRQQPOONNMLLKKJIIHGGFFEDDCBBA@??>==<;;:9887665433[[ZZYYXXWVVUUTTSSRQQPPONNMMLKKJJIHHGFFEDDCBBA@@?>==<;;:988766543\\[[ZYYXXWWVVUUTSSRRQQPOONMMLLKJJIHHGFFEDDCBBA@@?>==<;;:98876654]\\[[ZZYYXXWWVUUTTSSRQQPPONNMLLKJJIIHGGFEDDCBBA@@?>>=<;;:9887655^]]\\[[ZZYYXWWVVUUTSSRRQPPONNMMLKKJIIHGGFEEDCBBA@@?>>=<;;:988765_^^]]\\[ZZYYXXWWVUUTTSRRQQPOONMMLKKJIIHGGFEEDCCBA@@?>>=<;;:98876`__^^]\\[[ZZYYXWWVVUTTSSRQQPOONMMLKKJIIHGGFEEDCCBA@@?>>=<;;:9887``__^^]]\\[[ZYYXXWVVUUTSSRQQPPONNMLLKJJIHHGFEEDCCBA@@?>==<;;:988aa``__^^]]\[[ZZYXXWWVUUTTSRRQPPONNMLLKJJIHHGFEEDCCBA@@?>==<;::98bbaa``_^^]]\\[ZZYYXWWVVUTTSRRQPPONNMLLKJJIHHGFEEDCCBA@@?>==<;::9ccbba``__^^]\\[[ZZYXXWVVUUTSSRQQPOONMMLKJJIHHGFEEDCCBA@@?>==<;::dccbbaa``_^^]]\\[ZZYXXWWVUUTSSRQQPOONMMLKJJIHHGFEEDCCBA@@?>==<;:eddccbba``__^^]\\[[ZYYXWWVUUTSSRQQPOONMMLKKJIHHGFEEDCBBA@??>=<<;feeddcbbaa``_^^]]\[[ZYYXXWVVUTTSRRQPOONMMLKKJIHHGFEEDCBBA@??>=<=>=hhggffeddccbaa``_^^]\\[[ZYYXWWVUTTSRRQPPONMMLKJJIHHGFEDDCBAA@?>>iihhgffeedccbba``__^]]\[[ZYYXWWVUUTSRRQPPONMMLKJJIHGGFEDDCBAA@?>jjihhggffeddcbbaa`__^]]\[[ZYYXWWVUUTSRRQPPONMMLKJJIHGGFEDDCBA@@?kjjiihhgffeedccbaa``_^^]\\[ZZYXWWVUUTSRRQPPONMMLKJJIHGGFEDCCBA@?lkkjjihhggfeedccbba``_^^]\\[ZZYXWWVUUTSRRQPPONMMLKJIIHGFFEDCBBA@mllkjjiihggffeddcbba``_^^]\\[ZZYXXWVUUTSRRQPOONMLLKJIIHGFFEDCBBAnmllkkjiihhgffeddccbaa`__^]\\[ZZYXXWVUUTSRRQPOONMLLKJIIHGFEEDCBAnnmmlkkjjihhggfeedccbaa`__^]]\[ZZYXXWVUUTSRRQPOONMLKKJIHHGFEDDCBoonmmllkjjiihggfeedccbaa`__^]]\[ZZYXXWVUUTSRRQPONNMLKKJIHGGFEDCCpoonnmmlkkjiihggffeddcbaa`__^]]\[ZZYXWWVUTTSRQQPONNMLKJJIHGFFEDCqppoonmmlkkjjihhgffeddcbba`__^]]\[ZZYXWWVUTTSRQQPONMMLKJJIHGFEEDrqqpoonnmllkjjihhgffeddcbba`__^]]\[ZZYXWWVUTTSRQPPONMMLKJIIHGFEDsrqqpponnmllkjjiihgffeddcbba`__^]]\[ZZYXWWVUTSSRQPPONMLLKJIHHGFEssrrqppoonmmlkkjiihggfeddcbba`__^]]\[ZZYXWVVUTSSRQPOONMLKKJIHGGFttsrrqqpoonmmlkkjiihggfeddcbba`__^]\\[ZYYXWVVUTSRRQPONNMLKJJIHGFuttssrqqpoonmmlkkjiihggfeedcbba`__^]\\[ZYYXWVUUTSRQQPONMMLKJIIHGvuutssrrqpponnmllkjiihggfeedcbba`__^]\\[ZYXXWVUUTSRQQPONMLLKJIHGwvuuttsrrqpponnmllkjjihggfeddcbba`__^]\[[ZYXXWVUTTSRQPPONMLKKJIHxwvvuttsrrqpponnmllkjjihggfeddcbaa`_^^]\[[ZYXWWVUTSSRQPONNMLKJJIxxwvvuutssrqqpoonmllkjjihggfeddcbaa`_^^]\[ZZYXWVVUTSRRQPONMMLKJIyyxwwvuutssrqqpoonmllkjjihggfeddcbaa`_^]]\[ZYYXWVUUTSRQQPONMLLKJzyyxwwvuutssrqqpoonmllkjjihggfeddcba``_^]\\[ZYXXWVUTTSRQPOONMLKJ{zzyxxwvvuttsrqqpoonmllkjiihgffedccba``_^]\\[ZYXWWVUTSSRQPONNMLK|{zzyxxwvvuttsrqqpoonmllkjiihgffedccba`__^]\[[ZYXWVVUTSRQQPONMLL @><;987 5 4 3 2 1/.-,+*)(@>=<;:987665432110/.--,+**)(('&&%$$##"!!  -.>-.=-/..<-0/..;-10/..:-100/.:-2100/.9-32100/.8-32100/.7-433210//.6-5432210//.5-5432210/..4-655432110/..3-7654432110/.3-7654432100/.2-877654332100/.1-987665433210//.0-987665432210/../-:9987655432110/./-;:9887654432100/..-;:987765443210//.--<;;:987765433210/..,-=<;::987665432110/.,-=<;:9987655432100/.+->=<<;:988765443210//.*-?>=<;;:987765432210/.*-?>=<;::987665432110/.)-@?>>=<;:998765543210//.(-A@?>==<;:988765433210/..'-A@@?>=<;;:987765432110/.'-BA@??>=<;::98765543210//.&-BA@?>>=<;:998765433210/.&-CBAA@?>=<<;:987765432110/.%-DCBA@@?>=<;;:98765543210//.$-DCCBA@?>>=<;:998765433210/.$-EDCBBA@?>==<;:987765432110/.#-EDCBA@@?>=<;;:98765543210/.."-FEDDCBA@??>=<;:998765432210/."-GFEDCBBA@?>==<;:98766543210//.!-GFFEDCBA@@?>=<;::98765433210/.!-HGFEDDCBA@?>>=<;:988765432100/. -HGFEDCBBA@?>=<<;:98765543210/. -IHGFFEDCBA@@?>=<;:998765432110/.-JIHGFEDDCBA@?>==<;:98766543210/.-JIHHGFEDCBAA@?>=<;::98765432210/.-KJIHGFFEDCBA@??>=<;:98776543210/..--              -./01233456789:;;<=>?@ABCCDEFGHIJJKLMNOOPQ-./01234567889:;<=>?@@ABCDEFGGHIJKLMMNOPQR-./01233456789:;<<=>?@ABCDDEFGHIJKKLMNOPQQR-./01234567889:;<=>?@AABCDEFGHIIJKLMNOOPQRS-./01234456789:;<==>?@ABCDEEFGHIJKLMMNOPQRSS-./01234567899:;<=>?@ABBCDEFGHIJJKLMNOPQQRST-./01234456789:;<=>>?@ABCDEFGGHIJKLMNNOPQRSTU-./01234567899:;<=>?@ABCCDEFGHIJKKLMNOPQRRSTU-./01233456789:;<=>>?@ABCDEFGGHIJKLMNOOPQRSTUV-./01234567899:;<=>?@ABCCDEFGHIJKLLMNOPQRSTTUV-./01223456789:;<=>>?@ABCDEFGHHIJKLMNOPQQRSTUVW-./01234567889:;<=>?@ABCCDEFGHIJKLMMNOPQRSTUUVW-./01123456789:;<=>>?@ABCDEFGHIIJKLMNOPQRRSTUVWX-./01234567789:;<=>?@ABCCDEFGHIJKLMNNOPQRSTUVVWX-./0123456789:;<==>?@ABCDEFGHIIJKLMNOPQRRSTUVWXY-./01234556789:;<=>?@ABCCDEFGHIJKLMNNOPQRSTUVWWXY-./0123456789:;;<=>?@ABCDEFGHHIJKLMNOPQRSSTUVWXYZ-./01223456789:;<=>?@ABBCDEFGHIJKLMNNOPQRSTUVWXXYZ-./01234567899:;<=>?@ABCDEFGHHIJKLMNOPQRSSTUVWXYZ[ -./0123456789:;<=>?@@ABCDEFGHIJKLMMNOPQRSTUVWXXYZ[ -./01234566789:;<=>?@ABCDEFFGHIJKLMNOPQRSSTUVWXYZ[\ -./0123456789:;<==>?@ABCDEFGHIJKLLMNOPQRSTUVWXXYZ[\ -./01123456789:;<=>?@ABCDDEFGHIJKLMNOPQRRSTUVWXYZ[\] -./01234567899:;<=>?@ABCDEFGHIJKKLMNOPQRSTUVWXXYZ[\] -./0123456789:;<=>?@AABCDEFGHIJKLMNOPQQRSTUVWXYZ[\]^ -./01223456789:;<=>?@ABCDEFGHHIJKLMNOPQRSTUVWWXYZ[\]^ -./0123456789:;;<=>?@ABCDEFGHIJKLMNOOPQRSTUVWXYZ[\]]^ -./0123456789:;<=>?@ABCDDEFGHIJKLMNOPQRSTUVVWXYZ[\]^_ -./01233456789:;<=>?@ABCDEFGHIJKKLMNOPQRSTUVWXYZ[\\]^_ -./0123456789:;<==>?@ABCDEFGHIJKLMNOPQRSSTUVWXYZ[\]^_` -./0123456789:;<=>?@ABCDEFFGHIJKLMNOPQRSTUVWXYZZ[\]^_` -./01223456789:;<=>?@ABCDEFGHIJKLMNNOPQRSTUVWXYZ[\]^_`` -./0123456789:;<==>?@ABCDEFGHIJKLMNOPQRSTUVVWXYZ[\]^_`a -./0123456789:;<=>?@ABCDEFGGHIJKLMNOPQRSTUVWXYZ[\]^^_`a -./0123456789:;<=>?@ABCDEFGHIJKLMNOPQQRSTUVWXYZ[\]^_`ab-./0123456789:;;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYYZ[\]^_`ab-./0123456789:;<=>?@ABCDEFGGHIJKLMNOPQRSTUVWXYZ[\]^_`aab-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRRSTUVWXYZ[\]^_`abc-./01234456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[[\]^_`abc-./0123456789:;<=>?@ABCDDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcd-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQQRSTUVWXYZ[\]^_`abcd-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcd-./01234567789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcde-./0123456789:;<=>?@ABCDEFGHIJKKLMNOPQRSTUVWXYZ[\]^_`abcde-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZZ[\]^_`abcde-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdef-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdef-./0123456789:;<=>?@ABCDEFGHIJKLMNOPPQRSTUVWXYZ[\]^_`abcdef-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abbcdef-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg-./013456789:;<=>?@ABCDEFGHIJKKLMNOPQRSTUVWXYZ[\]^_`abcdefg-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgh-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgh-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgh-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgh-./0123456789:;<=>?@ABCDFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi-/0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\]^_`abcdefghij-./0123456789:;<=>?@ABCDEFGIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij-./0123456789:;=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijRSTUUVWXYZZ[\]^^_`abbcdeffghiijkllmnoopqrrsttuvvwxxyzz{||}~~SSTUVWXXYZ[\]]^_`aabcdeefghiijkllmnoopqrrsttuvvwxyyz{{|}}~~STUVWWXYZ[\\]^_``abcddefghhijkklmnoopqqrsttuvwwxyyz{{|}}~TUUVWXYZZ[\]^__`abccdefgghijkklmnnopqqrsttuvwwxyyz{{|}}~TUVWXYYZ[\]^^_`abbcdefgghijjklmnnopqqrsttuvwwxyyz{{|}~~UVWWXYZ[\\]^_`aabcdeffghijjklmmnopqqrsttuvwwxyyz{||}~~UVWXYZ[[\]^_``abcdeefghiijklmmnoppqrsttuvwwxyyz{||}~~VWXYYZ[\]^^_`abccdefghhijkllmnoppqrsstuvvwxyyz{||}~~VWXYZ[\]]^_`abbcdefgghijkklmnoopqrsstuvvwxyyz{||}~~WXYZZ[\]^_``abcdeffghijjklmnoopqrrstuvvwxyyz{||}~~XXYZ[\]^^_`abcddefghiijklmnnopqrrstuuvwxyyz{||}~~XYZ[\\]^_`abbcdefghhijklmmnopqqrstuuvwxxyz{{|}~~YYZ[\]^_``abcdeffghijkklmnoppqrsttuvwxxyz{{|}~~YZ[\]^^_`abcddefghijjklmnoopqrsstuvwwxyz{{|}~~Z[[\]^_`abbcdefghhijklmmnopqrrstuvvwxyzz{|}~~Z[\]^__`abcdeffghijkllmnopqqrstuuvwxyzz{|}}~[\\]^_`abccdefghijjklmnoopqrsttuvwxyyz{|}}~[\]^_``abcdefgghijklmnnopqrsstuvwxxyz{||}~\]]^_`abcdeefghijkklmnopqqrstuvvwxyz{{|}~\]^_`aabcdefghiijklmnoopqrstuuvwxyzz{|}~~]]^_`abcdeffghijklmmnopqrsstuvwxyyz{|}}~]^_`abbcdefghijjklmnopqqrstuvwwxyz{||}~^^_`abcdefgghijklmnnopqrstuuvwxyz{{|}~^_`abccdefghijkklmnopqrsstuvwxyyz{|}~~^_`abcdefghhijklmnoppqrstuvwwxyz{|}}~_`abccdefghijkllmnopqrsttuvwxyz{{|}~_`abcdefghhijklmnopqqrstuvwxxyz{|}~~`abccdefghijklmmnopqrstuuvwxyz{||}~`abcdefghhijklmnopqrrstuvwxyzz{|}~abbcdefghijklmmnopqrstuvvwxyz{|}~~abcdefghhijklmnopqrrstuvwxyz{{|}~abcdefghijklmmnopqrstuvwwxyz{|}~bcdefgghijklmnopqrsstuvwxyz{||}~bcdefghijklmmnopqrstuvwxxyz{|}~cdeefghijklmnopqrrstuvwxyz{|}}~cdefghijkklmnopqrstuvwxxyz{|}~cdefghijklmnopqqrstuvwxyz{|}}~defghiijklmnopqrstuvwwxyz{|}~defghijklmnoppqrstuvwxyz{|}}~defghijklmnopqrstuvvwxyz{|}~efghijkllmnopqrstuvwxyz{||}~efghijklmnopqrsttuvwxyz{|}~ffghijklmnopqrstuvwxyzz{|}~fghijklmnoopqrstuvwxyz{|}~fghijklmnopqrstuvwwxyz{|}~fghijklmnopqrstuvwxyz{|}~~ghijklmnoppqrstuvwxyz{|}~ghijklmnopqrstuvwxyzz{|}~ghijklmnopqrstuvwxyz{|}~hijklmnoppqrstuvwxyz{|}~hijklmnopqrstuvwxyz{{|}~hijklmnopqrstuvwxyz{|}~iijklmnopqrstuvwxyz{|}~ijklmnopqrstuvwxyyz{|}~ijklmnopqrstuvwxyz{|}~ijklmnopqrstuvwxyz{|}~ijklmnopqrstuvwxyz{|}~jklmnopqrstuvwxyz{|}~jklmnopqrstuvwxyz{|}~jklmnopqrstuvwxyz{|}~jklmnopqrstuvwxyz{|}~klmnopqrstuvwxyz{|}~klmnopqrstuvwxyz{|}~klmnopqrstuvwxyz{|}~   !"#$%%&'(()**+,,-..//00 1 1 2 2 3 3 4 4 5 566677888999:::;;;;<<<<<====                                  쁂 삃  􅆆 퇈 酆 놇 퇈 艊 芋 艊 ꊋ 싌 獎 玏 獎 玏 ⏐ 䑒 䐑 䑒 撓 ᔕ ᓔ ᔕ 㕖  ޖ ޗ ♚ ☙ ۙ ۚ ݚ ݛ ؜ ڜ ڝ ܟܞןֽ־ؿۡԢ֢֣ڥӤզӥקզҨЧҧҨϨϩϩѫѪ̪ /*'%"  "#%&()*+-./0 1 1 2 3 4 5 5677899::;;<<<=                                  ~~}󅄄~~񇆆튉􇆆򉈈쎍񌋋퐏뒑畔씓ꖕ蘗햕똗隙坜㟞蝜柞䡠⣢硠壢㥤᧦ݪ⨧⩨૪ܮᬫ߮ݰ۲ٴ޲ܴڶظԻٹ׻Խҿ׽տ<6 1.,)'%#" !"#$&'()**+,-../001 2 2 3 3 4 4 5 5 5 6վվվԼӻӻ|{zzyxxwvvuttsrrqpoonmllkjiihgffedcbba`_^^]\[ZZYXWVUUTSRQPOONML}}|{{zyyxwvvuttsrrqpoonmllkjiihgfeedcbaa`_^]]\[ZYXXWVUTSSRQPONMM~}}|{{zyyxwwvuttsrqqpoonmlkkjihhgfeddcba``_^]\\[ZYXWWVUTSRQQPONM~}}|{{zyyxwwvuttsrqqponnmlkkjihggfedccba`__^]\[ZZYXWVUUTSRQPOON~~}|{{zyyxwwvuttsrqqponnmlkjjihggfedcbba`_^^]\[ZYYXWVUTSSRQPON~~}||{zyyxwwvuttsrqqponmmlkjjihgffedcbaa`_^]\\[ZYXWWVUTSRQQPO~~}||{zyyxwwvuttsrqpponmmlkjiihgfeedcba``_^]\[[ZYXWVUUTSRQPO~~}||{zyyxwvvutssrqpponmllkjihhgfedccba`_^^]\[ZYYXWVUTSRRQP~~}||{zyyxwvvutssrqpoonmlkkjihggfedcbba`_^]]\[ZYXWVVUTSRQP~~}||{zyyxwvvutsrrqpoonmlkjjihgffedcba``_^]\[ZZYXWVUTTSRQ~~}||{zyyxwvuutsrrqponnmlkjiihgfeddcba`_^^]\[ZYXXWVUTSRQ~~}|{{zyxxwvuutsrqqponmmlkjihhgfedcbba`_^]\\[ZYXWVUUTSR~~}|{{zyxxwvuttsrqpponmlkkjihgffedcba``_^]\[ZYYXWVUTSR~~}|{{zyxwwvutssrqpoonmlkjjihgfeddcba`_^^]\[ZYXWVVUTS~~}|{zzyxwvvutsrrqponmmlkjihhgfedcbba`_^]\[[ZYXWVUTS~}}|{zzyxwvuutsrqqponmllkjihgffedcba`__^]\[ZYXWWVUT~}}|{zyyxwvuttsrqpoonmlkjjihgfedccba`_^]\\[ZYXWVUT~}||{zyxxwvutssrqponnmlkjihggfedcba``_^]\[ZYXXWVU~}|{{zyxwvvutsrqqponmlkkjihgfeedcba`_^]]\[ZYXWVU~~}|{zzyxwvuutsrqpoonmlkjiihgfedcbaa`_^]\[ZYXXWV~}}|{zyyxwvutssrqponmmlkjihgffedcba`_^]]\[ZYXWV~}||{zyxwwvutsrqqponmlkjjihgfedcbba`_^]\[ZYXXW~}|{{zyxwvuutsrqponnmlkjihggfedcba`_^^]\[ZYXW~~}|{zyyxwvutssrqponmlkkjihgfedccba`_^]\[ZYXX~}}|{zyxwwvutsrqpponmlkjihhgfedcba`_^^]\[ZYX~}|{{zyxwvuttsrqponmllkjihgfedccba`_^]\[ZYX~~}|{zyxxwvutsrqqponmlkjihhgfedcba`_^]]\[ZY~}||{zyxwvuutsrqponmmlkjihgfedccba`_^]\[ZY~}|{zzyxwvutsrrqponmlkjihhgfedcba`_^]\\[Z~~}|{zyxwvvutsrqponmmlkjihgfedcbba`_^]\[Z~}|{{zyxwvutsrrqponmlkjihhgfedcba`_^]\[Z~}|{zyxwwvutsrqponmmlkjihgfedcba``_^]\[~}||{zyxwvutssrqponmlkjihggfedcba`_^]\[~}|{zyxxwvutsrqponmmlkjihgfedcba`_^^]\~}}|{zyxwvutsrrqponmlkjihgfeedcba`_^]\~}|{zyxxwvutsrqponmlkkjihgfedcba`_^]\~}}|{zyxwvutsrqqponmlkjihgfedcbaa`_^]~}|{zyxwwvutsrqponmlkjiihgfedcba`_^]~}}|{zyxwvutsrqpponmlkjihgfedcba`_^]~}|{zyxwvvutsrqponmlkjihgfeddcba`_^~}||{zyxwvutsrqponmllkjihgfedcba`_^~}|{zyxwvuttsrqponmlkjihgfedcba`_^~}|{zzyxwvutsrqponmlkjihgffedcba`_~}|{zyxwvutsrqpoonmlkjihgfedcba`_~}|{zyxwwvutsrqponmlkjihgfedcba`_~~}|{zyxwvutsrqponmlkjihgffedcba`~}|{zyxwvutsrqpponmlkjihgfedcba`~}|{zzyxwvutsrqponmlkjihgfedcba`~}|{zyxwvutsrqponmlkjihgfedcbba~}|{zyxwvutsrqpponmlkjihgfedcba~}|{{zyxwvutsrqponmlkjihgfedcba~}|{zyxwvutsrqponmlkjihgfedcba~}|{zyxwvutsrqponmlkjiihgfedcb~}|{zyyxwvutsrqponmlkjihgfedcb~}|{zyxwvutsrqponmlkjihgfedcb~}|{zyxwvutsrqponmlkjihgfedcb~}|{zyxwvutsrqponmlkjiihgfedc~}|{zyxwvutsrqponmlkjihgfedc~}|{zyxwvutsrqponmlkjihgfedc~}|{zyxwvutsrqponmlkjihgfedc~}|{zyxwvutsrqponmlkjihgfedc~}|{zyxwvutsrqponmlkjihgfed~}|{zyxwvutsrqponmlkjihgfed~}|{zyxwvutsrqponmlkjihgfed'&%%$#"!   !!"##$%%&''(())**++,,--..///001 1 1 2 2 2 3 3 3 4 4 4 4 5 5 5 5 5 6666                          KJJIHGFEDCCBA@?>=<;;:98765433210/.-LKJIHGGFEDCBA@@?>=<;:98876543210/..-LKKJIHGFEDDCBA@?>=<<;:98765433210/.-MLKJIIHGFEDCBAA@?>=<;:98876543210/..-MLKJIHGFEEDCBA@?>==<;:98765443210/.-NMLKJJIHGFEDCBBA@?>=<;:99876543210/..-NMLKJIHGGFEDCBA@?>>=<;:98765443210/.-ONMLKKJIHGFEDCCBA@?>=<;:99876543210/.-ONMLKJIHGGFEDCBA@?>>=<;:98765433210/.-PONMLLKJIHGFEDCCBA@?>=<;:99876543210/.-QPONMLKJIHHGFEDCBA@?>>=<;:98765432210/.-QPONMMLKJIHGFEDCCBA@?>=<;:98876543210/.-RQPONMLKJIIHGFEDCBA@?>>=<;:98765432110/.-RQPONNMLKJIHGFEDCCBA@?>=<;:98776543210/.-RQPONMLKJIIHGFEDCBA@?>==<;:9876543210/..-SRQPONNMLKJIHGFEDCCBA@?>=<;:98765543210/.-SRQPONMLKJIHHGFEDCBA@?>=<;;:9876543210/.-TSRQPONNMLKJIHGFEDCBBA@?>=<;:98765432210/.-TSSRQPONMLKJIHHGFEDCBA@?>=<;:99876543210/.-UTSRQPONMMLKJIHGFEDCBA@@?>=<;:9876543210/..-UTSSRQPONMLKJIHGFFEDCBA@?>=<;:98766543210/.-VUTSRQPONMLLKJIHGFEDCBA@?>==<;:9876543210/.-VUTSRRQPONMLKJIHGFEDDCBA@?>=<;:98765432110/.-WVUTSRQPONMLKKJIHGFEDCBA@?>=<;:99876543210/.-WVUTSRQQPONMLKJIHGFEDCBAA@?>=<;:9876543210/.-WVUTSRQPONMLKJIHHGFEDCBA@?>=<;:98765432210/.-XWVUTSRQPOONMLKJIHGFEDCBA@?>=<;;:9876543210/.-XWVVUTSRQPONMLKJIHGFEDDCBA@?>=<;:9876543210/.-YXWVUTSRQPONMLKKJIHGFEDCBA@?>=<;:98765433210/.-YXWVUTSSRQPONMLKJIHGFEDCBA@?>==<;:9876543210/.-ZYXWVUTSRQPONMLKJIHGFFEDCBA@?>=<;:9876543210/.-ZYXWVUTSRQPONNMLKJIHGFEDCBA@?>=<;:98765432210/.-ZYXWVVUTSRQPONMLKJIHGFEDCBA@?>==<;:9876543210/.-[ZYXWVUTSRQPONMLKJIHGGFEDCBA@?>=<;:9876543210/.-[ZYXWVUTSRQQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-[ZYYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;;:9876543210/.-\[ZYXWVUTSRQPONMLKJIHGGFEDCBA@?>=<;:9876543210/.-\[ZYXWVUTSRRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-\[[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:98765443210/.-]\[ZYXWVUTSRQPONMLKJIHGFEDDCBA@?>=<;:9876543210/.-]\[ZYXWVUTSRQQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-]\\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:98776543210/. -^]\[ZYXWVUTSRQPONMLKKJIHGFEDCBA@?>=<;:9876543210/. -^]\[ZZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -_^]\[ZYXWVUTSRQPPONMLKJIHGFEDCBA@?>=<;:9876543210/. -`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -`_^]\[ZYXWVUTSRQPONMLKKJIHGFEDCBA@?>=<;:987654310/. -a`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -a`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -a`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -a`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -ba`_^]\[ZYXWVUTSRQPONMLKJIHGFDCBA@?>=<;:9876543210/. -ba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/ -ba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -ba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -ba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -cba`_^]\ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -cba`_^]\[ZYXWVUTSRQPONMLKJIGFEDCBA@?>=<;:9876543210/. -cba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=;:9876543210/. ---./012456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcefghijk-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXZ[\]^_`abcdefghijk-./0123456789:;<=>?@ABCDEFGHIJKLMNOPRSTUVWXYZ[\]^_`abcdefghijk-./0123456789:;<=>?@ABCDEFGHIJLMNOPQRSTUVWXYZ[\]^_`abcdefghijk-./0123456789:;<=>?@ABCDFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijk-./0123456789:;<=>?@BCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijk-./0123456789:;=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijk-./012345678:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijk-./012345789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijk-./012456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgijkl-./123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdfghijkl-}/0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`acdefghijkl--./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^`abcdefghijkl--./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\^_`abcdefghijkl--./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\]^_`abcdefghijkl--./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXY[\]^_`abcdefghijkl--./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXZ[\]^_`abcdefghijkl--./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXZ[\]^_`abcdefghijkl--./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXZ[\]^_`abcdefghijkl--./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXZ[\]^_`abcdefghijkl--./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXZ[\]^_`abcdefghijkl--./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXY[\]^_`abcdefghijkl--./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\]^_`abcdefghijkl--./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\^_`abcdefghijkl--./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^`abcdefghijkl-/0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`acdefghijkl-./123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdfghijkl-./012456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgijkl-./012345789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijk-./012345678:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijk-./0123456789:;=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijk-./0123456789:;<=>?@BCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijk-./0123456789:;<=>?@ABCDFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijk-./0123456789:;<=>?@ABCDEFGHIJLMNOPQRSTUVWXYZ[\]^_`abcdefghijk-./0123456789:;<=>?@ABCDEFGHIJKLMNOPRSTUVWXYZ[\]^_`abcdefghijk-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXZ[\]^_`abcdefghijk-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcefghijk-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij-./012456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij-./0123456789:;=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij-./0123456789:;<=>?@ABCDEFGIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\]^_`abcdefghij-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi-/0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi-./0123456789:;<=>?@ABCDFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgh-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgh-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgh-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgh-./013456789:;<=>?@ABCDEFGHIJKKLMNOPQRSTUVWXYZ[\]^_`abcdefg-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abbcdef-./0123456789:;<=>?@ABCDEFGHIJKLMNOPPQRSTUVWXYZ[\]^_`abcdef-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdef-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdef-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZZ[\]^_`abcde-./0123456789:;<=>?@ABCDEFGHIJKKLMNOPQRSTUVWXYZ[\]^_`abcdeklmnopqrstuvwxyz{|}~klmnopqrstuvwxyz{|}~klmnopqrtuvwxyz{|}~lmnopqrstuvwxyz{|}~lmnopqrstuvwxyz{|}~lmnopqrstuvwxyz{|}~lmnopqrstuvwxyz{|}~lmnopqrstuvwxyz{|}~lmnopqrstuvwxyz{|}~lmnopqrstuvwyz{|}~lmnopqstuvwxyz{|}~mnopqrstuvwxyz{|}~mnopqrstuvwxyz{|}~mnopqrstuvwxyz{|}~mnopqrstuvwxyz{|}~mnopqrstuvwxyz{|}~mnopqrstuvwxyz{|}~mnopqrstuvwxyz{|}~mnopqrstuvwxyz{|}~mnopqrstuvwxyz{|}~mnopqrstuvwxyz{|}~mnopqrstuvwxyz{|}~mnopqrstuvwxyz{|}~mnopqrstuvwxyz{|}~mnopqrstuvwxyz{|}~mnopqrstuvwxyz{|}~mnopqrstuvwxyz{|}~mnopqrstuvwxyz{|}~mnopqrstuvwxyz{|}~mnopqrstuvwxyz{|}~mnopqrstuvwxyz{|}~mnopqrstuvwxyz{|}~lmnopqstuvwxyz{|}~lmnopqrstuvwyz{|}~lmnopqrstuvwxyz{|}~lmnopqrstuvwxyz{|}~lmnopqrstuvwxyz{|}~lmnopqrstuvwxyz{|}~lmnopqrstuvwxyz{|}~lmnopqrstuvwxyz{|}~klmnopqrtuvwxyz{|}~klmnopqrstuvwxyz{|}~klmnopqrstuvwxyz{|}~klmnopqrstuvwxyz{|}~klmnopqrstuvwxyz{|}~klmnopqrstuvwxyz{|}~jklmnopqrstuvwxyz{|}~jklmnopqrstuvwxyz{|}~jklmnopqrstuvwxyz{|}~jklmnopqrstuvwxyz{|}~ijklmnopqrstuvwxyz{|}~ijklmnopqrstuvwxyz{|}~ijklmnopqrstuvwxyz{|}~ijklmnopqrstuvwxyyz{|}~iijklmnopqrstuvwxyz{|}~hijklmnopqrstuvwxyz{|}~hijklmnopqrstuvwxyz{{|}~hijklmnoppqrstuvwxyz{|}~ghijklmnopqrstuvwxyz{|}~ghijklmnopqrstuvwxyzz{|}~ghijklmnoppqrstuvwxyz{|}~fghijklmnopqrstuvwxyz{|}~~fghijklmnopqrstuvwwxyz{|}~fghijklmnoopqrstuvwxyz{|}~=>>>>>>>>>>>=============>>>>>>?>>>>>>>=====<<<<<;;;;:::99988                          ̫̫Ϋˬˬˬˬ˭ȭȭȭȭǮǮǮǮǮƮ殯箯讯讯讯讯讯箯殯ǮǮǮǮȭȭȭȭ˭ˬˬˬˬΫ̫̫̪ѪѫϩϩϨҨҧЧҨզקӥզӤڥ֣֢Ԣۡ١=>>C>>>==<<<;;::998776 5 5 4 3 2 1 1 ۀտ׽ӿս׻ٹԻظ677788888999999:::::::::::::99999988888777665 5 5 4 4 3 3 2 2 1 00/..-,+**ҹҹҹҹҹҹҹҹҹҹҹҹҹҹҹӻӻӻӻԽԽԀ~}|{zyxwvutsrqponmlkjihgfed~}|{zyxwvutsrqponmlkjihgfed~}|{zyxwvutrqponmlkjihgfed~}|{zyxwvutsrqponmlkjihgfe~}|{zyxwvutsrqponmlkjihgfe~}|{zyxwvutsrqponmlkjihgfe~}|{zyxwvutsrqponmlkjihgfe~}|{zyxwvutsrqponmlkjihgfe~}|{zyxwvutsrqponmlkjihgfe~}|{zywvutsrqponmlkjihgfe~}|{zyxwvutsqponmlkjihgfe~}|{zyxwvutsrqponmkjihgfe~}|{zyxwvutsrqponmlkjigfe~}|{zyxwvutsrqponmlkjihgf~}|{zyxwvutsrqponmlkjihgf~}|{zyxwvutsrqponmlkjihgf~}|{zyxwvutsrqponmlkjihgf~}|{zyxwvutsrqponmlkjihgf~}|{zyxwvutsrqponmlkjihgf~}|{zyxwvutsrqponmlkjihgf~}|{zyxwvutsrqponmlkjihgf~}|{zyxwvutsrqponmlkjihgf~}|{zyxwvutsrqponmlkjihgf~}|{zyxwvutsrqponmlkjihgf~}|{zyxwvutsrqponmlkjihgf~}|{zyxwvutsrqponmlkjihgf~}|{zyxwvutsrqponmlkjihgf~}|{zyxwvutsrqponmlkjihgf~}|{zyxwvutsrqponmlkjihgf~}|{zyxwvutsrqponmlkjihgf~}|{zyxwvutsrqponmlkjigfe~}|{zyxwvutsrqponmkjihgfe~}|{zyxwvutsqponmlkjihgfe~}|{zywvutsrqponmlkjihgfe~}|{zyxwvutsrqponmlkjihgfe~}|{zyxwvutsrqponmlkjihgfe~}|{zyxwvutsrqponmlkjihgfe~}|{zyxwvutsrqponmlkjihgfe~}|{zyxwvutsrqponmlkjihgfe~}|{zyxwvutsrqponmlkjihgfe~}|{zyxwvutrqponmlkjihgfed~}|{zyxwvutsrqponmlkjihgfed~}|{zyxwvutsrqponmlkjihgfed~}|{zyxwvutsrqponmlkjihgfed~}|{zyxwvutsrqponmlkjihgfed~}|{zyxwvutsrqponmlkjihgfed~}|{zyxwvutsrqponmlkjihgfedc~}|{zyxwvutsrqponmlkjihgfedc~}|{zyxwvutsrqponmlkjihgfedc~}|{zyxwvutsrqponmlkjihgfedc~}|{zyxwvutsrqponmlkjiihgfedc~}|{zyxwvutsrqponmlkjihgfedcb~}|{zyxwvutsrqponmlkjihgfedcb~}|{zyyxwvutsrqponmlkjihgfedcb~}|{zyxwvutsrqponmlkjiihgfedcb~}|{zyxwvutsrqponmlkjihgfedcba~}|{{zyxwvutsrqponmlkjihgfedcba~}|{zyxwvutsrqpponmlkjihgfedcba~}|{zyxwvutsrqponmlkjihgfedcbba~}|{zzyxwvutsrqponmlkjihgfedcba`~}|{zyxwvutsrqpponmlkjihgfedcba`~~}|{zyxwvutsrqponmlkjihgffedcba`~}|{zyxwwvutsrqponmlkjihgfedcba`_~}|{zyxwvutsrqpoonmlkjihgfedcba`_677777778888888888888888888888888887777777666665 5 5 5 5 4 4 4 4 3 3 3 2 2 2 1 1                        cba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:987654210/. -cba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -cba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -cba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -dcba`_^]\[ZXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -dcba`_^]\[ZYXWVUTSRPONMLKJIHGFEDCBA@?>=<;:9876543210/. -dcba`_^]\[ZYXWVUTSRQPONMLJIHGFEDCBA@?>=<;:9876543210/. -dcba`_^]\[ZYXWVUTSRQPONMLKJIHGFDCBA@?>=<;:9876543210/. -dcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCB@?>=<;:9876543210/. -dcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=;:9876543210/. -dcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:876543210/. -dcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:987543210/. -dcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:987654210/. -dcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:987654321/. -edca`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/ -edcba`^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-edcba`_^\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-edcba`_^]\ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-edcba`_^]\[YXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-edcba`_^]\[ZXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-edcba`_^]\[ZXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-edcba`_^]\[ZXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-edcba`_^]\[ZXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-edcba`_^]\[ZXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-edcba`_^]\[YXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-edcba`_^]\ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-edcba`_^\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-edcba`^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-edca`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/ -dcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:987654321/. -dcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:987654210/. -dcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:987543210/. -dcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:876543210/. -dcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=;:9876543210/. -dcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCB@?>=<;:9876543210/. -dcba`_^]\[ZYXWVUTSRQPONMLKJIHGFDCBA@?>=<;:9876543210/. -dcba`_^]\[ZYXWVUTSRQPONMLJIHGFEDCBA@?>=<;:9876543210/. -dcba`_^]\[ZYXWVUTSRPONMLKJIHGFEDCBA@?>=<;:9876543210/. -dcba`_^]\[ZXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -cba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -cba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -cba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -cba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:987654210/. -cba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=;:9876543210/. -cba`_^]\[ZYXWVUTSRQPONMLKJIGFEDCBA@?>=<;:9876543210/. -cba`_^]\ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -ba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -ba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -ba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -ba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/ -ba`_^]\[ZYXWVUTSRQPONMLKJIHGFDCBA@?>=<;:9876543210/. -a`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -a`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -a`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -a`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -`_^]\[ZYXWVUTSRQPONMLKKJIHGFEDCBA@?>=<;:987654310/. -`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -_^]\[ZYXWVUTSRQPPONMLKJIHGFEDCBA@?>=<;:9876543210/. -_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -^]\[ZZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/. -^]\[ZYXWVUTSRQPONMLKKJIHGFEDCBA@?>=<;:9876543210/. --               !!-./01234567789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcde-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcd-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQQRSTUVWXYZ[\]^_`abcd-./0123456789:;<=>?@ABCDDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcd-./01234456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[[\]^_`abc-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRRSTUVWXYZ[\]^_`abc-./0123456789:;<=>?@ABCDEFGGHIJKLMNOPQRSTUVWXYZ[\]^_`aab-./0123456789:;;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYYZ[\]^_`ab -./0123456789:;<=>?@ABCDEFGHIJKLMNOPQQRSTUVWXYZ[\]^_`ab -./0123456789:;<=>?@ABCDEFGGHIJKLMNOPQRSTUVWXYZ[\]^^_`a -./0123456789:;<==>?@ABCDEFGHIJKLMNOPQRSTUVVWXYZ[\]^_`a -./01223456789:;<=>?@ABCDEFGHIJKLMNNOPQRSTUVWXYZ[\]^_`` -./0123456789:;<=>?@ABCDEFFGHIJKLMNOPQRSTUVWXYZZ[\]^_` -./0123456789:;<==>?@ABCDEFGHIJKLMNOPQRSSTUVWXYZ[\]^_` -./01233456789:;<=>?@ABCDEFGHIJKKLMNOPQRSTUVWXYZ[\\]^_ -./0123456789:;<=>?@ABCDDEFGHIJKLMNOPQRSTUVVWXYZ[\]^_ -./0123456789:;;<=>?@ABCDEFGHIJKLMNOOPQRSTUVWXYZ[\]]^ -./01223456789:;<=>?@ABCDEFGHHIJKLMNOPQRSTUVWWXYZ[\]^ -./0123456789:;<=>?@AABCDEFGHIJKLMNOPQQRSTUVWXYZ[\]^ -./01234567899:;<=>?@ABCDEFGHIJKKLMNOPQRSTUVWXXYZ[\] -./01123456789:;<=>?@ABCDDEFGHIJKLMNOPQRRSTUVWXYZ[\] -./0123456789:;<==>?@ABCDEFGHIJKLLMNOPQRSTUVWXXYZ[\ -./01234566789:;<=>?@ABCDEFFGHIJKLMNOPQRSSTUVWXYZ[\ -./0123456789:;<=>?@@ABCDEFGHIJKLMMNOPQRSTUVWXXYZ[-./01234567899:;<=>?@ABCDEFGHHIJKLMNOPQRSSTUVWXYZ[-./01223456789:;<=>?@ABBCDEFGHIJKLMNNOPQRSTUVWXXYZ-./0123456789:;;<=>?@ABCDEFGHHIJKLMNOPQRSSTUVWXYZ-./01234556789:;<=>?@ABCCDEFGHIJKLMNNOPQRSTUVWWXY-./0123456789:;<==>?@ABCDEFGHIIJKLMNOPQRRSTUVWXY-./01234567789:;<=>?@ABCCDEFGHIJKLMNNOPQRSTUVVWX-./01123456789:;<=>>?@ABCDEFGHIIJKLMNOPQRRSTUVWX-./01234567889:;<=>?@ABCCDEFGHIJKLMMNOPQRSTUUVW-./01223456789:;<=>>?@ABCDEFGHHIJKLMNOPQQRSTUVW-./01234567899:;<=>?@ABCCDEFGHIJKLLMNOPQRSTTUV-./01233456789:;<=>>?@ABCDEFGGHIJKLMNOOPQRSTUV-./01234567899:;<=>?@ABCCDEFGHIJKKLMNOPQRRSTU-./01234456789:;<=>>?@ABCDEFGGHIJKLMNNOPQRSTU-./01234567899:;<=>?@ABBCDEFGHIJJKLMNOPQQRST-./01234456789:;<==>?@ABCDEEFGHIJKLMMNOPQRSS-./01234567889:;<=>?@AABCDEFGHIIJKLMNOOPQRS-./01233456789:;<<=>?@ABCDDEFGHIJKKLMNOPQQR-./01234567889:;<=>?@@ABCDEFGGHIJKLMMNOPQR-./01233456789:;;<=>?@ABCCDEFGHIJJKLMNOOPQ-./01234567789:;<=>??@ABCDEFFGHIJKLLMNOPQ-./01223456789::;<=>?@AABCDEFGHHIJKLMNNOP-./01234566789:;<==>?@ABCDDEFGHIJJKLMNOO-./011234567899:;<=>?@@ABCDEFFGHIJKLLMNO-./01234556789:;<<=>?@ABBCDEFGHHIJKLMMN-./001234567889:;<=>>?@ABCDDEFGHIJJKLMN-./01233456789::;<=>?@@ABCDEFFGHIJKKLM-.//01234566789:;<==>?@ABBCDEFGGHIJKLL-./012234567899:;<=>??@ABCDDEFGHIIJKL-./01234556789:;;<=>?@@ABCDEEFGHIJJK-./011234567789:;<==>?@ABBCDEFGGHIJK-./012334567899:;<=>>?@ABCCDEFGHHIJ-.//01234556789:;;<=>?@@ABCDDEFGHII-./011234567789:;<<=>?@AABCDEEFGHI-./012334567899:;<=>>?@ABBCDEFFGH-.//01234556789::;<=>??@ABCCDEFGG -./011234567789:;;<=>?@@ABCDDEFG -./012334567889:;<==>?@AABCDEEF!-.//012345567899:;<=>>?@ABBCDEF"-./011234566789::;<=>??@ABBCDE#-./012234567789:;;<=>??@ABCCDfghijklmnopqrstuvwxyzz{|}~efghijklmnopqrsttuvwxyz{|}~efghijkllmnopqrstuvwxyz{||}~defghijklmnopqrstuvvwxyz{|}~defghijklmnoppqrstuvwxyz{|}}~defghiijklmnopqrstuvwwxyz{|}~cdefghijklmnopqqrstuvwxyz{|}}~cdefghijkklmnopqrstuvwxxyz{|}~cdeefghijklmnopqrrstuvwxyz{|}}~bcdefghijklmmnopqrstuvwxxyz{|}~bcdefgghijklmnopqrsstuvwxyz{||}~abcdefghijklmmnopqrstuvwwxyz{|}~abcdefghhijklmnopqrrstuvwxyz{{|}~abbcdefghijklmmnopqrstuvvwxyz{|}~~`abcdefghhijklmnopqrrstuvwxyzz{|}~`abccdefghijklmmnopqrstuuvwxyz{||}~_`abcdefghhijklmnopqqrstuvwxxyz{|}~~_`abccdefghijkllmnopqrsttuvwxyz{{|}~^_`abcdefghhijklmnoppqrstuvwwxyz{|}}~^_`abccdefghijkklmnopqrsstuvwxyyz{|}~~^^_`abcdefgghijklmnnopqrstuuvwxyz{{|}~]^_`abbcdefghijjklmnopqqrstuvwwxyz{||}~]]^_`abcdeffghijklmmnopqrsstuvwxyyz{|}}~\]^_`aabcdefghiijklmnoopqrstuuvwxyzz{|}~~\]]^_`abcdeefghijkklmnopqqrstuvvwxyz{{|}~[\]^_``abcdefgghijklmnnopqrsstuvwxxyz{||}~[\\]^_`abccdefghijjklmnoopqrsttuvwxyyz{|}}~Z[\]^__`abcdeffghijkllmnopqqrstuuvwxyzz{|}}~Z[[\]^_`abbcdefghhijklmmnopqrrstuvvwxyzz{|}~~YZ[\]^^_`abcddefghijjklmnoopqrsstuvwwxyz{{|}~~YYZ[\]^_``abcdeffghijkklmnoppqrsttuvwxxyz{{|}~~XYZ[\\]^_`abbcdefghhijklmmnopqqrstuuvwxxyz{{|}~~XXYZ[\]^^_`abcddefghiijklmnnopqrrstuuvwxyyz{||}~~WXYZZ[\]^_``abcdeffghijjklmnoopqrrstuvvwxyyz{||}~~VWXYZ[\]]^_`abbcdefgghijkklmnoopqrsstuvvwxyyz{||}~~VWXYYZ[\]^^_`abccdefghhijkllmnoppqrsstuvvwxyyz{||}~~UVWXYZ[[\]^_``abcdeefghiijklmmnoppqrsttuvwwxyyz{||}~~UVWWXYZ[\\]^_`aabcdeffghijjklmmnopqqrsttuvwwxyyz{||}~~TUVWXYYZ[\]^^_`abbcdefgghijjklmnnopqqrsttuvwwxyyz{{|}~~TUUVWXYZZ[\]^__`abccdefgghijkklmnnopqqrsttuvwwxyyz{{|}}~STUVWWXYZ[\\]^_``abcddefghhijkklmnoopqqrsttuvwwxyyz{{|}}~SSTUVWXXYZ[\]]^_`aabcdeefghiijkllmnoopqrrsttuvvwxyyz{{|}}~~RSTUUVWXYZZ[\]^^_`abbcdeffghiijkllmnoopqrrsttuvvwxxyzz{||}~~QRSTUVVWXYZ[[\]^__`abccdeffghiijkllmnoopqqrsttuvvwxxyzz{||}}~QRSSTUVWWXYZ[\\]^_``abccdeffghiijkllmnoopqqrsttuvvwxxyzz{{|}}~~PQRSTTUVWXXYZ[\\]^_``abcddefgghijjkllmnoopqqrsstuuvwwxyyz{{||}~~PQQRSTUUVWXYYZ[\]]^_`aabcddefgghijjkllmnoopqqrsstuuvwwxyyzz{||}}OPQRRSTUVVWXYZZ[\]^^_`aabcddefgghijjkllmnoopqqrsstuuvvwxxyzz{{|}NOPQRSSTUVWWXYZ[[\]^^_`aabcddefgghijjkllmnnoppqrrsttuvvwxxyyz{{|NOPPQRSTTUVWXXYZ[[\]^__`abbcddefgghijjkllmnnoppqrrsttuuvwwxyyzz{MNOPQQRSTUUVWXXYZ[\\]^__`abbcdeefgghiijkllmnnoppqrrsstuuvvwxxyyzMMNOPQQRSTUUVWXYYZ[\\]^__`abbcdeefgghiijkklmmnoopqqrssttuvvwwxyyLMNNOPQRRSTUVVWXYYZ[\\]^__`abbcddefgghiijkklmmnoopqqrrsttuuvwwxxKLMNOOPQRSSTUVVWXYZZ[\]]^__`abbcddefgghiijkklmmnooppqrrsstuuvvwwKLLMNOPPQRSSTUVWWXYZZ[\]]^__`abbcddeffghiijjkllmnnoppqqrssttuuvwJKLMMNOPPQRSTTUVWWXYZZ[\]]^__`abbcddeffghhijjkllmnnoopqqrrsstuuvJJKLMMNOPQQRSTTUVWWXYZZ[\]]^__`abbcddeffghhijjkklmmnooppqqrssttuIJJKLMNNOPQQRSTTUVWWXYZZ[\]]^__`aabcddeffgghiijkklmmnnoopqqrrsstHIJKKLMNNOPQRRSTUUVWXXYZZ[\]]^__`aabccdeefgghiijjkllmmnooppqqrssHHIJKKLMNOOPQRRSTUUVWXXYZZ[\]]^__`aabccdeefgghhijjkklmmnnoopqqrrGHIIJKLLMNOOPQRRSTUUVWXXYZZ[\\]^__`aabccddeffghhiijkkllmnnooppqqFGHIIJKLLMNOOPQRRSTUUVWXXYZZ[\\]^^_``abbcddeffgghiijjkllmmnnooppFFGHIIJKLMMNOPPQRRSTUUVWWXYZZ[\\]^^_``abbccdeefgghhijjkkllmmnnopEFGGHIJJKLMMNOPPQRRSTUUVWWXYZZ[\\]^^_``aabccdeeffghhiijjkklmmnno877666 5 5 4 4 3 3 2 2 1 100//..-,,+**)(('&%%$#"!   !"#$%&'(*+,-.01 2 4 5 78:                                      נֿ־۽ܟڝ ڜ ؜ ݛ ݚ ۚ ۙ ☙ ♚ ޗ ޖ  㕖 ᔕ ᓔ ᔕ 撓 䑒 䐑 䑒 ⏐ 玏 獎 玏 獎 싌 ꊋ 艊 芋 艊 퇈 놇 酆 퇈 􅆆  삃 쁂 ꀁ󁂂~ }~~ |}}~~ {||}~~ {|}~ z{|}~ yyzz{{||}}~~ xyzz{{||}~wxxyyzz{{||}~vwwxxyyzz{{||}~uvvwwxxyyzz{{|}~tuuvvwwxxyyzz{{|}~tuvwxyz{|}~stuvwxyz{|}~rstuvwxyz{|}~qrstuvwxyz{|}~pqqrstuvwxyz{|}~oppqqrrstuvwxyz{|}~0/.-+*)(&%#"  "%'*/5                ¶                                  ڶܴ޲ٴ۲ݰ߮ᬫܮ૪⩨⨧ݪ᧦㥤壢硠⣢䡠柞蝜㟞坜隙똗햕蘗ꖕ씓畔뒑퐏񌋋쎍򉈈􇆆튉񇆆󅄄~~󃂂~~}~}}|~~}}|{󁀀~~}||{{ ~~}}||{zz ~}|{{zzy ~~}}||{{zyyx ~}||{{zzyyxw ~}|{zyyxxwv ~}|{zyxwwvv ~}|{zyxwvuu ~}|{zyxxwwvvuut ~}|{zyxwvuutts ~}|{zyxwvutssr ~}|{zyxwvutsrq ~}|{zyxwvutsrq ~}|{zyxwvutsrqqpp ~}|{zyxwvutsrqpoo ~}|{zyxwvutsrqpon ~}|{zyxwvutsrqponm~}|{zyxwvutsrqponnmml~}|{zyxwvutsrqponmlk)('&$#"! "#%'),. 16 ;վտ~}|{zzyxwvutsrqponmlkjihgffedcba`_~}|{zyxwvuttsrqponmlkjihgfedcba`_^~}||{zyxwvutsrqponmllkjihgfedcba`_^~}|{zyxwvvutsrqponmlkjihgfeddcba`_^~}}|{zyxwvutsrqpponmlkjihgfedcba`_^]~}|{zyxwwvutsrqponmlkjiihgfedcba`_^]~}}|{zyxwvutsrqqponmlkjihgfedcbaa`_^]~}|{zyxxwvutsrqponmlkkjihgfedcba`_^]\~}}|{zyxwvutsrrqponmlkjihgfeedcba`_^]\~}|{zyxxwvutsrqponmmlkjihgfedcba`_^^]\~}||{zyxwvutssrqponmlkjihggfedcba`_^]\[~}|{zyxwwvutsrqponmmlkjihgfedcba``_^]\[~}|{{zyxwvutsrrqponmlkjihhgfedcba`_^]\[Z~~}|{zyxwvvutsrqponmmlkjihgfedcbba`_^]\[Z~}|{zzyxwvutsrrqponmlkjihhgfedcba`_^]\\[Z~}||{zyxwvuutsrqponmmlkjihgfedccba`_^]\[ZY~~}|{zyxxwvutsrqqponmlkjihhgfedcba`_^]]\[ZY~}|{{zyxwvuttsrqponmllkjihgfedccba`_^]\[ZYX~}}|{zyxwwvutsrqpponmlkjihhgfedcba`_^^]\[ZYX~~}|{zyyxwvutssrqponmlkkjihgfedccba`_^]\[ZYXX~}|{{zyxwvuutsrqponnmlkjihggfedcba`_^^]\[ZYXW~}||{zyxwwvutsrqqponmlkjjihgfedcbba`_^]\[ZYXXW~}}|{zyyxwvutssrqponmmlkjihgffedcba`_^]]\[ZYXWV~~}|{zzyxwvuutsrqpoonmlkjiihgfedcbaa`_^]\[ZYXXWV~}|{{zyxwvvutsrqqponmlkkjihgfeedcba`_^]]\[ZYXWVU~}||{zyxxwvutssrqponnmlkjihggfedcba``_^]\[ZYXXWVU~}}|{zyyxwvuttsrqpoonmlkjjihgfedccba`_^]\\[ZYXWVUT~}}|{zzyxwvuutsrqqponmllkjihgffedcba`__^]\[ZYXWWVUT~~}|{zzyxwvvutsrrqponmmlkjihhgfedcbba`_^]\[[ZYXWVUTS~~}|{{zyxwwvutssrqpoonmlkjjihgfeddcba`_^^]\[ZYXWVVUTS~~}|{{zyxxwvuttsrqpponmlkkjihgffedcba``_^]\[ZYYXWVUTSR~~}|{{zyxxwvuutsrqqponmmlkjihhgfedcbba`_^]\\[ZYXWVUUTSR~~}||{zyyxwvuutsrrqponnmlkjiihgfeddcba`_^^]\[ZYXXWVUTSRQ~~}||{zyyxwvvutsrrqpoonmlkjjihgffedcba``_^]\[ZZYXWVUTTSRQ~~}||{zyyxwvvutssrqpoonmlkkjihggfedcbba`_^]]\[ZYXWVVUTSRQP~~}||{zyyxwvvutssrqpponmllkjihhgfedccba`_^^]\[ZYYXWVUTSRRQP~~}||{zyyxwwvuttsrqpponmmlkjiihgfeedcba``_^]\[[ZYXWVUUTSRQPO~~}||{zyyxwwvuttsrqqponmmlkjjihgffedcbaa`_^]\\[ZYXWWVUTSRQQPO~~}|{{zyyxwwvuttsrqqponnmlkjjihggfedcbba`_^^]\[ZYYXWVUTSSRQPON~}}|{{zyyxwwvuttsrqqponnmlkkjihggfedccba`__^]\[ZZYXWVUUTSRQPOON~}}|{{zyyxwwvuttsrqqpoonmlkkjihhgfeddcba``_^]\\[ZYXWWVUTSRQQPONM}}|{{zyyxwvvuttsrrqpoonmllkjiihgfeedcbaa`_^]]\[ZYXXWVUTSSRQPONMM||{zzyxxwvvuttsrrqpoonmllkjiihgffedcbba`_^^]\[ZZYXWVUUTSRQPOONML|{zzyxxwvvuttsrqqpoonmllkjiihgffedccba`__^]\[[ZYXWVVUTSRQQPONMLL{zzyxxwvvuttsrqqpoonmllkjiihgffedccba``_^]\\[ZYXWWVUTSSRQPONNMLKzyyxwwvuutssrqqpoonmllkjjihggfeddcba``_^]\\[ZYXXWVUTTSRQPOONMLKJyyxwwvuutssrqqpoonmllkjjihggfeddcbaa`_^]]\[ZYYXWVUUTSRQQPONMLLKJxxwvvuutssrqqpoonmllkjjihggfeddcbaa`_^^]\[ZZYXWVVUTSRRQPONMMLKJIxwvvuttsrrqpponnmllkjjihggfeddcbaa`_^^]\[[ZYXWWVUTSSRQPONNMLKJJIwvuuttsrrqpponnmllkjjihggfeddcbba`__^]\[[ZYXXWVUTTSRQPPONMLKKJIHvuutssrrqpponnmllkjiihggfeedcbba`__^]\\[ZYXXWVUUTSRQQPONMLLKJIHGuttssrqqpoonmmlkkjiihggfeedcbba`__^]\\[ZYYXWVUUTSRQQPONMMLKJIIHGttsrrqqpoonmmlkkjiihggfeddcbba`__^]\\[ZYYXWVVUTSRRQPONNMLKJJIHGFssrrqppoonmmlkkjiihggfeddcbba`__^]]\[ZZYXWVVUTSSRQPOONMLKKJIHGGFsrqqpponnmllkjjiihgffeddcbba`__^]]\[ZZYXWWVUTSSRQPPONMLLKJIHHGFErqqpoonnmllkjjihhgffeddcbba`__^]]\[ZZYXWWVUTTSRQPPONMMLKJIIHGFEDqppoonmmlkkjjihhgffeddcbba`__^]]\[ZZYXWWVUTTSRQQPONMMLKJJIHGFEEDpoonnmmlkkjiihggffeddcbaa`__^]]\[ZZYXWWVUTTSRQQPONNMLKJJIHGFFEDCoonmmllkjjiihggfeedccbaa`__^]]\[ZZYXXWVUUTSRRQPONNMLKKJIHGGFEDCCnnmmlkkjjihhggfeedccbaa`__^]]\[ZZYXXWVUUTSRRQPOONMLKKJIHHGFEDDCBnmllkkjiihhgffeddccbaa`__^]\\[ZZYXXWVUUTSRRQPOONMLLKJIIHGFEEDCBAmllkjjiihggffeddcbba``_^^]\\[ZZYXXWVUUTSRRQPOONMLLKJIIHGFFEDCBBAlkkjjihhggfeedccbba``_^^]\\[ZZYXWWVUUTSRRQPPONMMLKJIIHGFFEDCBBA@kjjiihhgffeedccbaa``_^^]\\[ZZYXWWVUUTSRRQPPONMMLKJJIHGGFEDCCBA@?1 00///..--,,++**))((''&%%$##"!!   !"#$%%&'()*+,-./ 1 2 3 4 5789;<       !!"##$$%&&'((^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:98776543210/. -]\\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-]\[ZYXWVUTSRQQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-]\[ZYXWVUTSRQPONMLKJIHGFEDDCBA@?>=<;:9876543210/.-\[[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:98765443210/.-\[ZYXWVUTSRRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-\[ZYXWVUTSRQPONMLKJIHGGFEDCBA@?>=<;:9876543210/.-[ZYYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;;:9876543210/.-[ZYXWVUTSRQQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-[ZYXWVUTSRQPONMLKJIHGGFEDCBA@?>=<;:9876543210/.-ZYXWVVUTSRQPONMLKJIHGFEDCBA@?>==<;:9876543210/.-ZYXWVUTSRQPONNMLKJIHGFEDCBA@?>=<;:98765432210/.-ZYXWVUTSRQPONMLKJIHGFFEDCBA@?>=<;:9876543210/.-YXWVUTSSRQPONMLKJIHGFEDCBA@?>==<;:9876543210/.-YXWVUTSRQPONMLKKJIHGFEDCBA@?>=<;:98765433210/.-XWVVUTSRQPONMLKJIHGFEDDCBA@?>=<;:9876543210/.-XWVUTSRQPOONMLKJIHGFEDCBA@?>=<;;:9876543210/.-WVUTSRQPONMLKJIHHGFEDCBA@?>=<;:98765432210/.-WVUTSRQQPONMLKJIHGFEDCBAA@?>=<;:9876543210/.-WVUTSRQPONMLKKJIHGFEDCBA@?>=<;:99876543210/.-VUTSRRQPONMLKJIHGFEDDCBA@?>=<;:98765432110/.-VUTSRQPONMLLKJIHGFEDCBA@?>==<;:9876543210/.-UTSSRQPONMLKJIHGFFEDCBA@?>=<;:98766543210/.-UTSRQPONMMLKJIHGFEDCBA@@?>=<;:9876543210/..-TSSRQPONMLKJIHHGFEDCBA@?>=<;:99876543210/.-TSRQPONNMLKJIHGFEDCBBA@?>=<;:98765432210/.-SRQPONMLKJIHHGFEDCBA@?>=<;;:9876543210/.-SRQPONNMLKJIHGFEDCCBA@?>=<;:98765543210/.-RQPONMLKJIIHGFEDCBA@?>==<;:9876543210/..-RQPONNMLKJIHGFEDCCBA@?>=<;:98776543210/.-RQPONMLKJIIHGFEDCBA@?>>=<;:98765432110/.-QPONMMLKJIHGFEDCCBA@?>=<;:98876543210/.-QPONMLKJIHHGFEDCBA@?>>=<;:98765432210/.-PONMLLKJIHGFEDCCBA@?>=<;:99876543210/.-ONMLKJIHGGFEDCBA@?>>=<;:98765433210/.-ONMLKKJIHGFEDCCBA@?>=<;:99876543210/.-NMLKJIHGGFEDCBA@?>>=<;:98765443210/.-NMLKJJIHGFEDCBBA@?>=<;:99876543210/..-MLKJIHGFEEDCBA@?>==<;:98765443210/.-MLKJIIHGFEDCBAA@?>=<;:98876543210/..-LKKJIHGFEDDCBA@?>=<<;:98765433210/.-LKJIHGGFEDCBA@@?>=<;:98876543210/..-KJJIHGFEDCCBA@?>=<;;:98765433210/.-KJIHGFFEDCBA@??>=<;:98776543210/..-JIHHGFEDCBAA@?>=<;::98765432210/.-JIHGFEDDCBA@?>==<;:98766543210/.-IHGFFEDCBA@@?>=<;:998765432110/.-HGFEDCBBA@?>=<<;:98765543210/. -HGFEDDCBA@?>>=<;:988765432100/. -GFFEDCBA@@?>=<;::98765433210/.!-GFEDCBBA@?>==<;:98766543210//.!-FEDDCBA@??>=<;:998765432210/."-EDCBA@@?>=<;;:98765543210/.."-EDCBBA@?>==<;:987765432110/.#-DCCBA@?>>=<;:998765433210/.$-DCBA@@?>=<;;:98765543210//.$-CBAA@?>=<<;:987765432110/.%-BA@?>>=<;:998765433210/.&-BA@??>=<;::98765543210//.&-A@@?>=<;;:987765432110/.'-A@?>==<;:988765433210/..'-@?>>=<;:998765543210//.(-?>=<;::987665432110/.)-?>=<;;:987765432210/.*--"##$%&&'()**+,-.//0123456789:;<=>#-.//012344567889:;<<=>?@@ABCD$-./0012345567899:;<==>?@AABC%-./011234566789::;<=>>?@AAB%-./012334567789:;;<=>>?@AB&-.//012344567789:;;<=>??@A'-./0012344567889:;<<=>??@(-./0112345567899:;<<=>??(-./0122345667899:;<==>?)-.//012334566789::;<==>*-./0012334567789::;<==+-./0012344567789::;<=,-./0112344567889:;;<,-./0112345567889:;;--./0122345567889:;.-.//0122345567889:/-.//01233455678890-./00123345667881-./0012334566782-./001233456673-./00123345663-./0112334564-./011233455-./01123346-./0112337-./011238-./01129-./001:-./00;-./0<-./>-.@-     ހ9DEFGGHIJJKLMMNOPPQRRSTUUVWWXYYZ[[\]]^__`aabbcddeffgghhijjkkllmmnDDEFGGHIJJKLMMNOPPQRRSTUUVWWXYYZ[[\]]^__``abbccdeeffghhiijjkkllmCDDEFGHHIJJKLMMNOPPQRRSTTUVWWXYYZ[[\\]^^_``aabccddeffgghhiijjkklBCDEEFGHHIJKKLMMNOPPQRRSTTUVVWXXYZZ[\\]^^__`aabbcddeeffgghiijjkkBBCDEEFGHHIJKKLMMNOPPQRRSTTUVVWXXYZZ[\\]]^__``abbccddeffgghhiijjABBCDEEFGHHIJKKLMMNOOPQRRSTTUVVWXXYYZ[[\]]^^_``aabbcddeeffgghhii@ABBCDEEFGHHIJKKLMMNOOPQQRSSTUUVWWXYYZ[[\\]^^__``abbccddeeffgghh@@ABCCDEEFGHHIJJKLMMNOOPQQRSSTUUVWWXXYZZ[\\]]^^_``aabbccdeeffggh?@@ABCCDEEFGHHIJJKLMMNOOPQQRSSTUUVVWXXYZZ[[\\]^^__``abbccddeeffg>?@@ABCCDEEFGHHIJJKLLMNNOPPQRRSTTUVVWWXYYZZ[\\]]^^_``aabbccddeef=>?@@ABCCDEEFGHHIJJKLLMNNOPPQRRSTTUUVWWXXYZZ[[\]]^^__``aabbccdde==>?@@ABCCDEEFGHHIJJKLLMNNOPPQQRSSTUUVVWXXYYZ[[\\]]^^__``aabbccd<=>>?@@ABCCDEEFGGHIIJKKLMMNOOPQQRSSTTUVVWWXYYZZ[[\\]^^__``aabbcc;<=>>?@@ABCCDEEFGGHIIJKKLMMNOOPQQRRSTTUUVWWXXYYZZ[\\]]^^__``aabb;;<=>>?@@ABBCDEEFGGHIIJKKLMMNNOPPQRRSSTUUVVWWXYYZZ[[\\]]^^__``aa:;;<=>>?@@ABBCDDEFGGHIIJJKLLMNNOPPQQRSSTTUUVWWXXYYZZ[[\\]]^^__``9:;;<==>?@@ABBCDDEFFGHHIJJKLLMMNOOPQQRRSSTUUVVWWXXYYZ[[\\]^_89:;;<==>?@@ABBCDDEFFGHHIJJKKLMMNNOPPQQRSSTTUUVVWXXYYZZ[[\\]]^89:;;<==>??@ABBCDDEFFGGHIIJKKLLMNNOOPQQRRSSTUUVVWWXXYYZZ[[\\]]^7889:;;<==>??@AABCCDEEFGGHIIJJKLLMMNOOPPQQRSSTTUUVVWWXXYYZZ[[\\]67889:;;<==>??@AABCCDEEFFGHHIJJKKLMMNNOOPQQRRSSTTUUVVWWXXYYZZ[[\667889::;<==>??@AABBCDDEFFGHHIIJKKLLMNNOOPPQQRRSTTUUVVWWXYZ[5667889::;<<=>>?@@ABBCDDEEFGGHIIJJKLLMMNNOOPQQRRSSTTUUVVWWXYZ45567889::;<<=>>?@@ABBCCDEEFGGHHIJJKKLLMMNOOPPQQRRSSTTUUVVWWXY345567889::;<<=>>??@AABCCDDEFFGGHIIJJKLLMMNNOOPPQQRRSSTTUUVVWWXX33455677899:;;<==>??@AABBCDDEEFGGHHIJJKKLLMMNNOOPQQRSTUVW233455677899:;;<==>??@@ABBCCDEEFFGHHIIJJKKLMMNNOOPPQQRRSTUV1233455677899:;;<<=>>?@@AABCCDDEFFGGHHIJJKKLLMMNNOOPPQQRRSTU01223445667889::;<<=>>??@AABBCDDEEFFGHHIIJJKKLLMMNNOOPPQQRRST01223445667889::;;<==>??@@ABBCCDDEFFGGHHIIJJKKLLMMNNOOPPQQRS/0012234456677899:;;<==>>?@@AABBCDDEEFFGGHIIJJKKLLMMNOPQR.//011233455677899::;<<=>>??@@ABBCCDDEFFGGHHIIJJKKLLMMNOPQ-.//011233455677889::;;<==>>?@@AABBCDDEEFFGGHHIIJJKKLLMMNOPQ--.//0112334456678899:;;<<=>>??@@ABBCCDDEEFFGGHHIIJJKKLLMNOP-./0012234456677899::;<<==>??@@AABBCCDDEEFGHIJKLMNO-./0012234455677889::;;<==>>??@@AABCCDDEEFFGGHHIJKLMN-./00112334556678899:;;<<==>>?@@AABBCCDDEEFFGGHHIJKLM-.//0112334456677899::;;<==>>??@@AABBCCDDEEFFGGHIJKL-.//00122344556778899:;;<<==>>??@@AABBCCDDEEFFGGHIJK-./00112334556677899::;;<<==>??@@AABBCDEFGHIJ -./01122344556778899::;<<==>>??@@AABBCDEFGHI -.//00122334556677899::;;<<==>>??@@AABBCDEFGH -./001123344556778899::;;<<==>>??@@AABBCDEFG -./011223345566778899::;;<<==>>??@@AABBCDEF;=                                                 nooppqqrstuvwxyz{|}~mnnooppqqrstuvwxyz{|}lmmnnooppqrstuvwxyz{|lmnopqrstuvwxyz{klmnopqrstuvwxyzjklmnopqrstuvwxyijklmnopqrstuvwxhijklmnopqrstuvwghijklmnopqrstuvfgghijklmnopqrstueffgghijklmnopqrstdeeffghijklmnopqrscddeeffghijklmnopq rcdefghijklmnop qbcdefghijklmno pabcdefghijklmn o`abcdefghijklm n_`abcdefghijkl m^_`abcdefghijk l]^_`abcdefghij k\]^_`abcdefghi j[\]^_`abcdefgh iZ[[\]^_`abcdef g hYZZ[\]^_`abcde f gXYYZ[\]^_`abcd e fWXXYYZ[\]^_`abc d eWXYZ[\]^_`ab c dVWXYZ[\]^_`a b cUVWXYZ[\]^_` a bTUVWXYZ[\]^_ ` aSTUVWXYZ[\]^ _ `RSTUVWXYZ[\] ^_QRSTUVWXYZ[\ ]^PQRSTUVWXYZ[ \]OPQRSTUVWXYZ [\NOPQRSTUVWXY Z[MNOPQRSTUVWX YZYLMNOPQRSTUVWXKLMNOPQRSTUVWJKLMNOPQRSTUVIJJKLMNOPQRSTUHIIJKLMNOPQRSTHIJKLMNOPQRSGHIJKLMNOPQR=;97 5 30.+(%!"'.                                               ~}|{zyxwvutsrqponmlk}|{zyxwvutsrqponmlkj|{zyxwvutsrqponmlkji{zyxwvutsrqponmlkjihzyxwvutsrqponmlkjihgyxwvutsrqponmlkjihgfxwvutsrqponmlkjihgfewvutsrqponmlkjihgfevutsrqponmlkjihgfedutsrqponmlkjihgfedctsrqponmlkjihgfedcbsrqponmlkjihgfedcbarqponmlkjihgfedcba`qponmlkjihgfedcba`_ponmlkjihgfedcba`_^onmlkjihgfedcba`_^]nmlkjihgfedcba`_^]mlkjihgfedcba`_^]\lkjihgfedcba`_^]\[kjihgfedcba`_^]\[Zjihgfedcba`_^]\[ZYihgfedcba`_^]\[ZYXh gfedcba`_^]\[ZYXWg fedcba`_^]\[ZYXWVf edcba`_^]\[ZYXWVUe dcba`_^]\[ZYXWVUTd cba`_^]\[ZYXWVUTSc ba`_^]\[ZYXWVUTSb a`_^]\[ZYXWVUTSRa `_^]\[ZYXWVUTSRQ` _^]\[ZYXWVUTSRQP_ ^]\[ZYXWVUTSRQPO^ ]\[ZYXWVUTSRQPON] \[ZYXWVUTSRQPONM\ [ZYXWVUTSRQPONML ZYXWVUTSRQPONMLK YXWVUTSRQPONMLKJ XWVUTSRQPONMLKJI WVUTSRQPONMLKJIH VUTSRQPONMLKJIH UTSRQPONMLKJIHG TSRQPONMLKJIHGF SRQPONMLKJIHGFE RQPONMLKJIHGFED<:864 2 0.,)'$! $).      jAihhggffeddcbbaa`__^]]\[[ZYYXWWVUUTSRRQPPONMMLKJJIHGGFEDDCBA@@?iihhgffeedccbba``__^]]\[[ZYYXWWVUUTSRRQPPONMMLKJJIHGGFEDDCBAA@?>hhggffeddccbaa``_^^]\\[[ZYYXWWVUTTSRRQPPONMMLKJJIHHGFEDDCBAA@?>>ggffeeddcbbaa`__^^]\\[ZZYXXWVVUTTSRRQPPONMMLKKJIHHGFEEDCBBA@?>>=gffeddccbba``__^]]\\[ZZYXXWVVUTTSRRQPPONMMLKKJIHHGFEEDCBBA@??>==<=<<;dccbbaa``_^^]]\\[ZZYXXWWVUUTSSRQQPOONMMLKJJIHHGFEEDCCBA@@?>==<;:ccbba``__^^]\\[[ZZYXXWVVUUTSSRQQPOONMMLKJJIHHGFEEDCCBA@@?>==<;::bbaa``_^^]]\\[ZZYYXWWVVUTTSRRQPPONNMLLKJJIHHGFEEDCCBA@@?>==<;::9aa``__^^]]\[[ZZYXXWWVUUTTSRRQPPONNMLLKJJIHHGFEEDCCBA@@?>==<;::98``__^^]]\\[[ZYYXXWVVUUTSSRQQPPONNMLLKJJIHHGFEEDCCBA@@?>==<;;:988`__^^]\\[[ZZYYXWWVVUTTSSRQQPOONMMLKKJIIHGGFEEDCCBA@@?>>=<;;:9887_^^]]\\[ZZYYXXWWVUUTTSRRQQPOONMMLKKJIIHGGFEEDCCBA@@?>>=<;;:98876^]]\\[[ZZYYXWWVVUUTSSRRQPPONNMMLKKJIIHGGFEEDCBBA@@?>>=<;;:988765]\\[[ZZYYXXWWVUUTTSSRQQPPONNMLLKJJIIHGGFEDDCBBA@@?>>=<;;:9887655\\[[ZYYXXWWVVUUTSSRRQQPOONMMLLKJJIHHGFFEDDCBBA@@?>==<;;:98876654[[ZZYYXXWVVUUTTSSRQQPPONNMMLKKJJIHHGFFEDDCBBA@@?>==<;;:988766543ZZYYXXWWVVUUTSSRRQQPOONNMLLKKJIIHGGFFEDDCBBA@??>==<;;:9887665433YYXXWWVVUUTTSSRQQPPOONMMLLKJJIIHGGFEEDCCBAA@??>==<;;:98876654332XXWWVVUUTTSSRRQQPOONNMMLKKJJIHHGFFEEDCCBAA@??>==<;;:988766543321XWWVVUUTTSRRQQPPOONNMLLKKJIIHHGFFEDDCBBAA@??>==<;::9887665433211WVVUUTTSSRRQQPOONNMMLLKJJIIHGGFEEDDCBBA@@?>>=<<;::98876654332110VUUTTSSRRQQPPOONMMLLKKJJIHHGGFEEDCCBBA@@?>>=<<;::98876554332110/UTTSSRRQQPPOONNMMLLKJJIIHGGFFEDDCCBAA@??>>=<<;::98876554332110/.TSSRQPOONNMMLLKKJJIHHGGFEEDDCBBAA@??>==<;;:998776554332110/..SSRRQQPPOONNMMLKKJJIIHHGFFEEDCCBBA@@??>==<;;:998776554332100/..-RRQQPPOONNMMLLKKJJIHHGGFFEDDCCBAA@@?>>=<<;;:998776554332100/..--QQPPOONNMMLLKKJJIIHHGFFEEDDCBBAA@??>>=<<;::988766544322100/..-PONMLKJIHGFEDDCCBBA@@??>==<;;::988766544322100/..-ONMLKJIHGGFFEEDDCBBAA@@?>>==<;;:9987766544322100/.-NMLKJIHGFEDDCCBBA@@??>>=<<;::998776554332110//.-NMMLLKKJJIIHHGGFFEEDDCBBAA@@?>>==<;;::988776554332110//.-MLLKKJJIIHHGGFFEEDDCCBBA@@??>>=<<;;:9988766544332110//.-LKKJJIIHHGFEEDDCCBBAA@@??>==<<;::9987766544322100/.. -KJJIHGFEDCBAA@@??>>==<;;::9887765544322100/.. -JIHGFEDCBA@?>>==<<;;:99887665543321100/.. -IHGFEDCBA@?>=<;;::9987766544332110//. -HGFEDCBA@?>=<;:99887765544322100//.-GFEDCBA@?>==<<;;::99877665543321100/..-FEDCBA@?>=<;::99887765544322110//..-EDCBA@?>=<;:9877665543322100//.-DCBA@?>=<;:987655443321100/..-CBA@?>=<;:9876543322110//..-  )**+,--./011234566789:;<=>=<<;:988765443210//.*-=<;:9987655432100/.+-=<;::987665432110/.,-<;;:987765433210/..,-;:987765443210//.--;:9887654432100/..-:9987655432110/./-987665432210/../-987665433210//.0-877654332100/.1-7654432100/.2-7654432110/.3-655432110/..3-5432210/..4-5432210//.5-433210//.6-32100/.7-32100/.8-2100/.9-100/.:-10/..:-0/..;-/..<-.=-.-  -./qwbfsmanager-1.2.1-src/qwbfs/resources/wiitdb.png0000644000175000017520000001612411544172355021655 0ustar pasnoxpasnoxPNG  IHDR(y,gAMA abKGD pHYs``zxE vpAg(QMmIDATxXg-CG`l%cӋ&j,OM*쨀RD@E@5j&Pc1X?wvi;#w>c̙{~{8ӏVh|N\W&oGf*ErbRvE}EUGL΁:<}/G>{MȎrty;š/KF6󞔔>':SxNjGkli|y4!ji1b L4';xRiR_\S$k9.=.}MoNLq[V l$/`Д.dF`S<+:ܮ=Nm>ΡQI,8݀.>׌ًGKt[? Y=Cc $BWC ~č~7|647P.9` ݥ3IIwZ.6qg[[-03Kt%e 9I&ߩVaZPtɅ 7Ȣ3{̌UQ2_pdy6>AF&B!y̕=%GLݺ,Ϲrdx- B ٰϞp'h] ŔYVd5~i5vѥy7*HzQ&8-`2X{dROBd|I` ׯJ-0IwWw hL\4%u P",>-?pml2( (%D0U jH0O9;>DbҸ!>JSp2P,hHƈ4|;PoH̡A.4~*0Z6Ư4){LG. Wtu7ҒiU~Rfqss!@I>̗'2U  O@S0){D(BstO ]TC@-e*@j_||(0g+!<:URVHcL0N/I_}fN J ׮yH\5TyNr\X7]",t*hљЙJ]._/@] Vpm0[WAs@7('XbZ 왗Ӆnd920a2@1@2P&y-R۵pDfQd q.\pDdE2RՓ΅:0])p\zZ hsbe~ EӼbh>ͺPRmBۥ~]2K.lPJR ൿH}ö L$9 YPw*HƦ5>=i T -eVI#juǔNzݻZK/fl9N*+4Fr'i4n+Gsqa`&d/n 09'<Cݖp#wyJtˮk l+@HCQ5=^D-Xc_`a'$Azjup*$M +R^I)s ΃/98z%"[ I U;Y)-.9o  /'P*dQmƑhLjEg=$hlT8%q3 CX5^7MTJǃP{yQy~ j~Ec/mX#KGԚ,k3l4{`̹'3:|oBtPi bYt#Y5U5Wo(-Jkhj a^k4c//PJْХdҸ#7K?[!#D:?b鈓r@x8JR2x) X{nx-n4Gv*?wF'0m-6m%KGJq`)ld_'wT;kL &v?M%Iu>]W`UӼ)e x* GEp`-0tz†.n9 G8C19ʂ4*S}*{#i5T`\Xj5U_t OuX0O[|z+ߦܲf7m=|Euuu@AT@c;rpϓNZ\UzbJgAFgKrxmwT7P4N ?pHX7P`G_v@Sr ,sMEFUYߩyftAS7csd/ֹMzmHe'y}MTukW#EŌBcIHg V i*t~aAg\Njq1v80*½`OewqFq$n݃z}ƻT˾֩egҒɓqv>ݫH;Ua=/x5}}a} ږ9GQvﷆ睜=cjؾ?rj'h1VyS] ׆lDr*u*w_m'L{7GlI +b8?igв{6ٰNK0!cA+Arh>J'fC 0q䗐[tm~tLų|[}aǾC P E׶;mSNg fRQ_&BVQ7ۡo4o[-hVDLE*!ѩ|V{Qڣv:mwԿ2 li']B^̈́>uNx*6jy7AmMyI;᥏Z>ǿ:YRYS$豃Τq-/5\0}8v+ nȳq#i쟈 oCͻm)85jJ`}Hgzy]Uya5W k` zbAǹm`.<^StxjC( 6$^z ;<'bY-c;8][`SijsFj[@Pj܎?u7g_>_]qlZ6pQ4զxNIg%tEXtdate:create2011-03-28T22:16:32+02:00%tEXtdate:modify2011-03-28T22:13:44+02:00iIENDB`./qwbfsmanager-1.2.1-src/qwbfs/resources/wii-cover.png0000644000175000017520000001256611531542376022305 0ustar pasnoxpasnoxPNG  IHDR sBITO pHYs.!.![tEXtauthorFilipe AZEVEDOքIDATxs}ǿ A$u-˖x8ݛN[g3N>5Cڙi;dڙ:m&$Ud'uɲeݨ %IqrN " Xh4bߞ۳{o}Q|t~M .BQe]7@>6$I%Y%$I|wN)ɒȲȚhir\N?*J(?V-I$b2VܪP,ʝP0}>ө*.XXT*K,*JZwJCo|I \"S,DeM.xմ[]9,^g MFFde%d( #nbiF3N<%+nŋ.](FGCa\7#/z7Q+5T%ni_+s\b9AD^729)+|駟tݡP`e%92Gї'g칗~b|/,w/.|_\4BnT@T+ c ˲,˲eY19D"8a r BTK3L&z=K%+ /F콵\[f?uh(fG5?;}c,6 NvbPx< q4(QU1v_iڟٟ߿\yX,z/U~Bp}81>*Xv>'8rrnLE">/J-.. 0ڳgݛZ[K&WG,9w:33ӕmM2 *!p4 4L#jJV^^_]JϜ>o9~x8J3TXrF^(JK^w%  5Ǘly0Bp"bS\ɧO>yhEܺ5[.c|`F(p8P0[-ܮ|>ODSn\yȧ+kD2sۮF+z\s'}>,S2MReh;'~!xp1>0 ;ϟsFGG+sIffE|J*f^o$21nҎᄑT%;wc;aa:z3jj*,usLlm!8h2~bF,k|b<DӖe1$I:t`msc8g3LÌ L&[/[${rOT:s3>_r] U/TjdY~\6N:xõ[F&''TUP0VTX(./'f~ 7NQ~qdG9=w湙Hm"X>evmxT*vǯ^JMpȲ9,!N`̒eZB.K_^˔ΞzԱ#&x  t; 'K& ˑ̭䭛=341-wJ]sՉXvulmebס;҈ G4MEeĈhN=LO,d-t}ڬK%85ESIЊu$1͔24d!ܪHL&FhP)<{DU[ZdB}잴#'?zo%j]W81],\,&5V{u|t87ؽj 7ݼPc:7["|B ܺo zO[7|+71.Dw#x[5Olx映VM o% AV"-.*itXf"pK&խS ܸk+^ܶ-w譺Fuk bOQ|K8Jͧ1"WwN nAsk_=z:.Bt iy$,w|E'AѽI_wڜA?xSݍ&ޥ躒6-Eպt]pA͌vۤL\n[v[Gj=)܊jN x \qb:a5qn(t4nO Rh-w>Gv Yz,a-*V, JBj `@^7'**yo;8=nZԴbٻ`j"97`"Bk ފ̀ ތx uk `s,w[If2͋%V2hn1[bd ͈t-'qJ `؞2d#w3C&d W b>;b/C3#f? Ar=zVMvOkiuWIV7#Al/ކq{M@mLw$C/NSKApر u[ 3?\i nm8snr جglՍ0 ycunL3_ ފ&'<Ɛ6my&Zt+4cw78G>.x 7o5R\}j둻pR]f\fStN-oi2wt~a !x:ˮl״\l\.mE\i]*떈]벣6װ:GlHT7±TaIhpuˎx `"-]\m!ס鶱 b! 2;c(r-BM˃K܈ l]SN _Ӡy̠ !6*~F. wܘo2 k;J}w,R4ںfV:[R[dG)Q2h?Knk!uɺZe. Xni]Enn;\TZdZՠݘ*N;MBpW1Bp[T< ZZE;*D<"wŀ <_M<հ4duvZ(^ ݢ eWOЗI~JDp/QlVM޴ޱ`$15w!GlNȽ,Bpj\@g~]S!auzX}P)? k@/X9Bmls`#!6G9Bmls`#!6G9Bmls`#ۜy|5߼coH uW޼-=oNPsG8 (FüB./߆wB8v ­ c9|p5rR1GّOcN7S]@0X?D/g Lr P? I#G$ZOA/<Yoa!S@#LE2(n@i7' G `12|y 88pz_"Q @==?A3- Ac%g0 mk^@H>obY(REX;_T=(=I}\$Rk8cedi[_GC*ϡidI8FjE D c,2HU$kW*7 +,}52(k0 09 XC*BJHAOAW! ]rKYļK3*2#{ ZE l胲'ñ߈dk>8D^4Zk9'Gx2I>T%#F^>sNX7oB2prL--"W7oh"X(`Sd4Hg=}Nõn2".9W+sB*=L8!:2Y$BA9KHP!^xC~(?y7Q9S)\Uu >/ w=J{ 84DTPe9tø1_.Ǐ1R\}pFMj(DzHң`TQ)T;W5hy:DQN:$N端]kzb٣uVja9Ε:8gi C#pjS|{e.}?VqKAIENDB`./qwbfsmanager-1.2.1-src/qwbfs/resources/qwbfsmanager.rc0000644000175000017520000000005611405765604022666 0ustar pasnoxpasnoxIDI_ICON1 ICON DISCARDABLE "qwbfsmanager.ico" ./qwbfsmanager-1.2.1-src/qwbfs/resources/splashscreen.png0000644000175000017520000035625011474656320023075 0ustar pasnoxpasnoxPNG  IHDR,sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxY%uEd9P A"8`,Vk/?L~іOn˲l54E"MQQPU!r8 $8h-Vន'3bǎ=֭[ 1Fs)%y+RJ03}qu !?0MS:o<#PgcD1Fxl{LjL>Sϲ/ϱ[s⽭Q8kzVqkkIoD: o)@cx OwYkYz¦5&tCX6*'VeX]aV.hUxG|ܸ5q\Z 1 JQ|jS!WD}<^/c~}ViAR:Qܪ=<7+C_p"8ExWZ,{"V]cV"TOPjͧ|kcM<Ǎ/}djq.:>;lY_3ȨUHxO>BY,T}V镪·MNjޣoy5-ӦB2io6@ۯBSð\~Q(*I)\t>듨XZWXt}k Y'}tv0#`2`*g@  Cp עjq"8}! c2Uom V%%3ȗ XVT-^ o( ZVΙ@h=ZTZadu-90f߇'>>®D֯Z9Ͻ(cxRf:W>֦EyfkHPo f15myVB#)vux`mӶ,nĄO B:=<7+_"?kL. ,yƺ[HclZ1+ -+[4Z;- eB!x:O :OaQ2U*>b(4nOw36H82+1 -[^y =DF򌯊>N5>_P :O -<-wZQߖ%9aŇ~׹)|hNVϦLLRWֲ[+ͩ"E8OTx|\.s6 C򿅀L=nSxb?8c _7OLc ~ఊD1A1uB-^6E~ׅJk*7/l[+oT%<>8-++cQ1PH/e{Բؔ6n#<>OJ<@akGVV5o5!ǻ9N&Zt8?~sRzo鹿ܚ; 'xawh0fKǯEcV5V}O8& [V%@5L^jΖ9|q|JD}=06/"k>ZTAOӴlYD_ Co!s[WKY})/=jM(׼\C8' Uz :”RZ%aߵ7xmZWAyů{Fͱ1i<'|aq-L~ak)?>Ҫy  7}ry_eehɬx *0#q5ȇ.,h*`ه" ~ej+Rhޖ@W&,U{KNg9W+GFx(|ިUe0kqw=)*y>uQOӯz,W֛>V@ZJ8UU(|J~}tJ*Z}(*=]g=1t0Laܴ=e݌/ngJָl\c{T7=R>#5|J:nZm$և)"Y]XB8H^kY:!j Y:Ȗ->~=bւ*NYxXJQu[xS|k)2>߲|}S3{h~MVoE9£T j{t-QiӰp>UZʃ⇿1|_|xzvL p-$\p5̸tHB@LN$,:HnNpo=^-bo~TX?Mf6;G߿~fK2j8) W3-BV -Aߚ^c"]cp)B] V+f?!~04aR:|ƿ~=T&Pkq6Vi ot#H՚򀴈X넕 <"WI밅"~_YJr;Ft<#HaU8xy@ T0|zܙ*.Tya]ߺV^)[Un{an^K=vP[=nE XWAǘↇ]I?Ƙx+Y]+CTxx5fhT tlV3 aUFc"f52'%ֲ)3L؄ 4şߔ<+ݷاY0/,i=&<\}]CihlK+q Gˠ%x]~ΙàG((܃g GWd:^Qb+`9Ol[ڜϪKꅢ_(cL5g}%Z^RZ>?ڧ&P:ᕘ2ZSj55P<_?C*'Cl:?fTztLxyd_'xυ|#\$|ò[Wk~j=Ux"?oÈ͘'{ v4ۺϿ1=G _ycjLӔx$|FET&!`}`i1x6QjRWAk wQIdBK,6/EySCq R竉j2&u^ШTk)g%xSSn#[ejU{y%RWMD [`}\LU(~7*,W]XtMZp |[h5hE 6s"Ny/%l {:Ug~=T@ Ti&|5_O ^+|^!c ZKxy =GZ <ɰnjLW`NǯWްϿDwS_[ߢ X> o?s3|'6_+S155͇qQ୧2:(϶rVFWyB[ewmRjs+L慜VFyZ~ݼ: P/t=3 eA˒4 */y> dt|ztMuLI,^{Zekga/vGJcw0W?z|kbne/_f8N]NuQ\-TvXJ֡{W;A_j;pxY2TBepֱL V!UW^e_a+0 mGZ!JD}Ҟ*PZuB)4MצկW^kV-==ZK!>?* aW6NOk^p+lMxA_3J-H7?tNx#!=ȱ07;XU@Kzj*BR֛xB[*nR\~>6ҊD9sTamY5eO2>{|Y521BKQKpx\_o(''''G ޓRZ x޲Y{[cyh9ap' )x"L<={Pu5/n=O6v RieV][ 񴆴8a @ *&K}e\ּBB@ٲNZw]W7yī[B> v %Oƹ5ݲ.e75P "s W?S7eH]x-gLLe1k/Ov:a}O镴9i0%vI!C}VyjQCmg [y>G|dDpOoWl g+x|??_.r {糤_0Y{`Q;&4 3-+ᐠTq2 /T婌BF=?`)`}֑%0*д,kT>O;U7Ъ, c2}J_e"OcrTaewExSxt}ň!D8'`ٳ y|! Hb\{1У4v-VnGQ0 禀:ӂZ't2EJ>|h(J98x*ҁw57id 'pΣ8B>]- ␆ #DZlZ`T$VT (8Y{c 8O3&䱇@,Sw+H jUIEV}eycA&hx3[85FaNm4gyRBܒ|庈z!P1Q9o#!+W7a`ě C]y^O=y4aF*+u${NwO1&q9mʏ0\ ?*kFOz$ Ͽk֡֫3Z l~w6P~V]<_H IDATEw0u‡~U磶m0\ עFLx*̸.Tq{˺8fX1ϔꁰ1kK3|Hfxp>be,͐09AJ,!GbR !:`r*,%Z(d@1kG*.}6JμR|>Jyy1׎)ּHJ)a7ڛ6~'|m;@l%3JSqcUX\[+$x>`TL+%2NԻRHZ8GEIIMi|]L&")TkX޲o6Գq~YNOH*}ėz?fּ~Oj[ILƢoI66Ҋň&,1kKVB^K$UG"< <ԓU1Er( TF/"X |JV*TtL*}"k)m%UTI!4ZXZeޖoB|{?4`_Tk!U\?ƫ< gyJ07*Mnk=!6SWa԰Z-k.zܲ-޴aaW|D'aZđ/T#.C+e-cul= u%~sjqރ{)EyD,D%D $X訽+EkT5Yx ViXz }kuzY53sBwX?;ܳ_mq=>Gưź" X[^Ъ}upw呶 Spдy ؼKź'4a?M8?G# \5C"4Mx,{x ae7r#n޼Ǯ_GJ.d;% @E0|,dȐ= P22I q?H,^e_kf$3sxi M !~~Au\t}w.\KECDWYCt䱎ɥҀ%u,dIx [L=e~poĿ>/5yFfI?~WB@ɱt\@ ~H! m,e Dw.|l;SwoUo杻I[|{3^z۱Ě4RnFGZ5ı*UG`CIif:菏*|0Z4JQ{-4]"h-BHhKYGɐ ҳhC}n.y_VW]sO!!!!b1 2\%,|as5TbȂ,-_zE,<B @rA99SXF#bBXbȞ X'$mD)𮜛_ Sy>QjqBAc( ~1Xa;Ƙ?EyVrGBO=8F9{݊"B c-O[x :vB??|uEœ8׏&aˋf,4\ ^?B;5%",L!RW "TT_ȕMYw@1TEBQB{ H[gYT^^ :LE0Z懓E`U[*iN+]CPӣ|kO"=j6}DTiU>_=R1HC|o`9^xrRki. >P( 5D|(OpsV= W1$$tY3Z&L8{k G[_[|w2|q3Eۣ/<^/F@sh|")H|4 G> /LHiBdNflkd!~ǡTQrʲ]H >+ᣰ60dyB1TA6U`Rekf| owYH;#Ky~(y# 9+8TdwJY^B֧Q[- T u R7+SOuhR O:#5-/о3O)eBfǰC&a8$[R])mu"Mc)CU`x"̸j0jq [4T臕` P[_C[=nu+*OXBlj[ސ`I5F]URa1㍚.X3X%B$Rb2",^li}PV,0rBcR$"B ''Ef<(%/c![Yp20ʕ)/ 14,Jx /lwEMJk진B\f2w [-?s*q\v~ iD_j.,{U>ձ 1}XBVZ@@qTI *߽[U=v>+x Ow3 K*-ZJySfY->'=Tu')z;)?\~NuI=Q=AJ*>RtЦ~_UiQG&ĥ$ҋ7w%4bEkyh [*K)t]Xj l56}ܻw&\idHEq-r!XAn8aoʲ>dҍ!"X* vULnU,{ ¬pTuU 4OjV cks&nqߵiX5+Q5c}%cGx>df5zУ~88`36n ݄'ޅUyvK=53;P"Q- O _3#pkZk6S_D~ׅ1||Uz9i'zqõ|~ߏ-|S?xq0XP%OCYa.Hi°Hnl7pY9l1Ot%MC h rC7^)` 7oބ*فKYk!ڢ;o;t}#C|seG j"gE= V Nح“SG@>N)[Ҿ;p4[GOhy Xó_W'ǽ0l^G+޵#r|%RHTrao~nƋsNbyAnc̰,ozӹBFRdž{|% Nڅ~׺[xHAS>馸V2GaX{[+h YJ\3Uڷ0?ĝ;wp<89=vp 4/1 @,e,!Ās.mlNN7 ʞ6ݡpkBqmkװݞ୷BʒY+]wKEQ۞k D*+z!7GlNgEV r7[ 5QAoڑ4ռC-a~Qz73~wa>"ae|X7POcPϪ5wɇc4סX *(U"4B7~Jc fv2C&#.Bj8a?='yV!\ S{L?e,~dVDZpГTYi2zEq) 1 O?}}cN Ń ܿ8n&ܸ.&\V= ?^ 7˿9!b6xB.4lT7M)nr%ܹs}!\zWwo$-5@^[J9?3Zf!(>f %秹y ~W75 +T2U匮O><ſZQ"E'1M`(„ui1oBOe}oÄO=cDj{:C<'TE / #>?Sz|`|>]|c0>U[^z49 P&TwVp= wxf/2;/ݷƒjȣg)%l'?wq|fw\. Xׅ|b)Zfu=v ɗodE 趥:Tv!%} PNwFApScy3#7M-B̞JEQ '-.B s)fVU Ŭ1 ēk.ꧏB Cf%0ҙavnչ×Nz}#00e|ׇ({|X`(P|~Ô54-%#`T(/U$^"|)I0|.a&鲵t/•7ͪVn+W|ķ Hb=-ָإ f/U+QB[wΑt Byc\JS8mO<$'{qW~a3 ؏Sޜ`o7rv~o|p޽J0yZ졄cJES Ζ|`)%* OĬ4HQsPBbDuxq _ܯ㝝dO()^B̡(:T"U}7_l_gW$45bV)9VXqi$*ph Ч1+G: PRwTYcj&@ nrT s~V^Eףh!cN !*ꄅr40u9]7i^;1_7!z_؏?6zdl2رVo SfnW>^VpkIkv _BGk]; X'zUt~Qy"DZ9Q&z1͇*sYfgPdɿY@(8/=Fϻj9W^0` xcwqu}Ĵ割#@ 1{'4"=KUSHK}pP^3.aľ7[ɘ.k\=l'bͰ/ay^'3 ^i:<<2x2sgUL(7*?gTS_j!QJ顛yh>CXqU(@:|Ov3_`[,/΋ղΉŠ '6otY*"*~q̾nsq7[y?mlwkaNq0޽Vi؎֕ޯx =){x#>cJ9%1W>H޽{z S ~(P.WѐrxVfn(l oSE9=-ilreȕd?-tMoN4ͭZ7нAṵA/gaVqmokMZBEGj9U pԖRZmC;.5P} ws# 7[Ű[$9oŋwu53X#ΉL>I|07nccO?4!HXX/avT+WcGRMHv>#Kb++!Y@Ts":}o% 4-dJtCP<+B.Ik wLs((;,VlCdXv[#઎4></13`D|ycs5a!od1IijEQ7jҜ8&xa%΅}\'ȕ8|~I-7 ;tx͛xǞǛo#X.[0J'CfYq@ZY6эԨ IDATG1[L_P&,6"h<"() /Tf%9KfhQ=L{ d+~9ymX gN }aP|)/^<2'33/'+CsO Obrld[*ZLJiHse|= V6Pg 1k]O~Z4 lq{ ܃L7'<#5B&6'\> IeJTгfsiprrrlR7cOu% 7.IͰ.g1-J|Ƶ#No{H5oLdX)8rgC8O))|aZ3 }.6U'"WgcEPf^D:Y(&<-FD|KWC(B:x#T.QJJ7P6-k $*AydȀHIjqhSOHn eX'pl$^T4ͭV^0.0 ocUߕ!ixU6(HO_K&?QF Ü{! @dXXJG9|s} 1 c/\2B Ue^ rR݇4Ci iBp1 3юiLnw0p=p8 xcK}D̏|tG;e|_%CPK_sJ橆k̐߰\ .dҌE*׮go°AbUയȯ]V DfHHQXNHr_3`vT-{?(,C. @~zYJ/a0E_u-[bkyZ9G%#B T8BT&Rrc`yLp?e U^!soُKIyQ@BbY{LCd^VySXk9>Dg ݭήRajqTgzb* ]9j|0 8t SzW3׷PŇɀ?ٟQ|+\d"*X[}}xÜϱ/N[JhEfó5` -*xbapq~dZ8=;l{,B>E$b>pCHc,S=$IXQ&E< 9wpQʻQZdf wz@YQ_<ܸq͐=w0E<:͊jNeB~IxW/Ow뺺OS=j0*TQ `MSR?(Rc+~`eeSqBԖ'#Μ G,30+2U'Z0UUrQds,ɨ7q.S"y]F.¯փ^g_~coohJdg||Q)b~#-1 B]o`kH#X! UTV2*2sLc~AaܼXᱫ1t+JV$,PrӔJ iCNf0e"Qh0<%AEdpFbNzit!BpŒE18qsK 6{-)xO0I+,_k(&? DnRJ#'E#"R-߇[4ZzĽ2 * ܟ<򡈿5͢ĴOIZC0@E W/WK?Zѭ U$1Qľfw -/ ЊcUdf }ՖAa3 (0\uhʉ*LJߨa'GZ5d!_X‹X.h 뾜 !Yq+C$ճЮK V Vð2؇Ci BVFV\iAU3:j},Z %f|\$U>f?G)aOR:<+(HI=;WoLUR`jhF0g(K%*2s!pxvVK#>퍹:VE{Vm:oU Ϧ 4 Cy?Ƹo|>,NNO0cRi#eW}#Kinwf,#RVEx6)Q@Rs I<&%β)JGN(˜/%lՋV6r =pR~.g5FͰx{8l4N[BRX9u6fcZľ̖V ViH?,x*S0[rWުyU"0o+C[*iXUa:1Mt{RKrS32R'j^g(h!UM~%n@ qT^q%@+R*}T7&U5@|7|8% yHfXxi:r 5 i3;MêO z]_i\yrR#\e[ϙg24&1nRVdpjs oX~—7ރP$X"]-| 0JI-^Yyv;a^ ;zPqޏZO~ 'm"n?dz3ezOLˠGJvT*>ZĭDt?# o~]c">O_|#..v/ :4{%ǵqBfJnJԪ}\XiKhJPޱ^pCAc>!/gJ%G Z! /Tw:"cl6XBB}P12)6W/畐Pd-!@ _1^愸N4]eJkR:LXr$~>XEsAEnR\T >ɳgamߝڔVy>Z_e ߫UZJ;ַZL yKM1wxk~xj0.[@.lqU% yiF.&TI*\t)uX0}GihZEދ) l"=^z`Vw@O5CWVQ%Z$Vޅi ḲP^c%;lOr+KR1wrTb@-E:O31mN&1sSOV >3:f)$A*C# jR9z'ݒUk<'8)C8|_<|s ??Z -]T1^]cP&}Yx.Du$ޡGzt]?G1O@ǜPBB!D;89;AכNޏHrQ8 zi:ܟ_F,[A"uCDN fQOσ#*᛫~ hsŢGdXr"0۲ӿږҢaDQE]\j4dKm¢;>H CٺXNVB!x+rRr{k&agߙ6rwvtt~a!=᫗*Lӄ9w׮]Gi~wƳ=aY%,>͖u-^e!B>b$z>b# +)WET)@ON.̓|+PwN\dU: ވύp~p9u6U䴄|[q& wxյU?eJs=/eҧ =~tvv/ [*$- 0|#P-rn22XT-%l(a CPcA$0GOb jR(Ju+BΙdVUxs<`Y_Po>珤~<4UisX}#3j ?3CVyᥱr:֜'tPe=BWzya`Skׇ? P8R5Z*=!`>ҔkyWp#!jzH;)y(>{z+\cΈG-1lүFSW==)%URE|gOdr-ǂ?Ϣ P6ʕy&kAEmX̓d<͕rPJ jub\U4ed:| X(j%IoI}!Z {̟eGTϦy'3`vX= (G0\7~|/TujWD ![箞*`Vŕ¯kJ0TF@Cvmy[yS895WvXPѓv ֲkIq9eNGRPu[,Tb& рBe5#vuv\ԍSy_ȥ`5]LM[|KTQ5]tZsU\KLA߽"^3|u5c:s x5 ǯx&Q\cJJ'hP+B)- "p#ȂhlԓOb't!'"Lc.Ku,.D}Kkxy~ni1#a@$EUӼdd9WF.X3I.ūUUȽD֣Buv.vebN CO띦 1t:n0?Y_^fUbRZz-1#+,ƂMC(V} ^굥6ׯ䥿!Ko G<. ?0bQxe>` DyDJf%Ԫ4, 'Y+1ƃ7uk=j/L>Bjk[Ꚍ?{g͚,ˮo}ν5t7F$&MM!d,a)lEz,[)"$9L1DK @){ϰZ|g*,o:3=g{ |]daj&>"i%x?߅:.>wXc6lXZ沅 Klo>g_^oP\"0{&,@D5e R*97(IHMDu'%T{qH $t5pY 0#ɂ@]=B~a@T_U-b ePP)HsNy12Bo}2#bL2_E3A] ԋfCRf>XiSas ےdE/}!P3s"ۢ#ȴɮmL?zaԈT`,4Gs7hg"i i#-YRe )KA 1?ɒxpUv![K[)A!`Ǹx.(> Q IDAT+KMp/凜0 *u(h )?>j[f|7-18+H)P[Rdo̠=Sܻw4놗a& F ڽ$U'tLYٮ \8^w4~wbՃ{)NDklh H?9~;t9u~  1BCR=*ܶUJ)J\ßd5~ qZx%TM;-cc8:i--!"yZ9{kqd56]iEN:ߍK}_;GZHZAg{!>ouA)eaD!A5$딁y%ؠF"0an%}C[1߹CL5e!(H)6ij)w nSҕHu']A*!`x `0\&LZХ'w;*Fo7Ơ}"+tDjbUrLu8]<Q2#5D1#kӮ'7_m/x"-v8v=1R@6ۨ%sjPp&.:(V=C:əD6r']lkfX؀̆zmiHlo8<>?[f ">F7{cSy/}Z2*8D *=eFwqpnT vqn 9e%/?Zfd%q8Ӷջ<%Vě]٥k-e*Q8 99 >+Y_]@-*,M KgT ?fxsQF'*Pyg1ZF!+Z;〜ʴDɽsTY]}9\*7C0@RLsTr DbzW_&gX":SX\:|&qvFZi Y*: 0Gb.~4y,)LL`G[y 0pǖfDaxOx6.uCJz Ϯm}aζ";-䜑|c7y#P8f|=n9g PQr!)e'|s5V87FsUɓReWQ9qWmO۰780S_$Y>#YW+yյKq0]Tm%%aE8m6~Y}8!y{f6Zm/m筥.>1x>1m@tNU!)s^u~>#}]f\&561b؄c2o}vaZɃ癵$V-İ՚xio~q<R{M{#نmb]v[OUųg{prrb b=55E\\֎ Qs*;\+ކK7iבuM8A=!M)g͘Id#I0vuDH$T4@rnDqRCsYN+nǰ" Z])>Zam7<5/j^s߻BP;% o{iuDykà{[?>ĞgMrX6xVjEíf)8x ݌ڊTժ6ɵg,V+la,ly:X VU7b1qx{mДݐ*_"03V3a mH<^x&/$% }>-\sˌ$~gA4Gcd btz7J)裏puua8`F_\6NŐVD=`r2˶ E`viˎWp@* ($5ۮd$gsovsNxSuI0KBK8r~0kB2iDJ].ؒM~glV&cJhe-&9LpJ4t!Tb;|z.d{Z磵iR6ŵ b!I3YOKTO\'Q YA[J rp̈́?~Ę /^<|l{[x#lޘ[k#CY_[kܭ0YOlwY¿qA.i0M3Ϟ}Ϟ~a74ɈJQ\`*IKk.K]vReRsG"$~h15_" t\`qGjCќzbe6QrdvWU<s \-}z^w90`؅.-"̿3TU|>ۦߥ|'[ Dg\ I1-˷mp?cŮufh%VhmmO`.㨛BUU~W*X'l5|k,LgjOHə@quuQQ$ʉIN ϞnОO4?P`N+ŵ8CL0ZOh(e(΀f8,(ӌyQtD^>)?]<|w݉$HMBN@ʒRN" ߫*!ōa?՚2%TFO1N @ݎj61m@>ϋ`o^2V^Xxjm[?>c;uʷ?I3pf<ܑ' >02eߵܗ٪aL]hLj"œ"k6v<=.A~{OhN(KIWu0~z}vC0fqlSffP1i<9T{YgQ<|e J rJ:KSчp8K_E<|?‡?"SpgޣQ Ebk o)c*9g͌6え1~V e/6ZX6&gL'"x_9R|Uy7۞8s,WiNU-m3f8ۥFB`!,L$XhU0ͱo۷ 003c ~aA>ĩ.41{z1)քXZ^nx#1$2ho;W*t^g04;jm3j!tڇ;%  ÒBXk2A-q=fdI;Іp0Wsw;t]oPs I2T& "%51î bc@1NO-Ue`rڢD$w8G #~}{?_acfR5rUqRl,Q@ɦq6pL5\`m[^^&YkmQ tXLJ; CZX22Ϊn^񖁘iim};y#::J;:]bysQZNnْBzflSDZmW+>$΋SBmY0w: ?l!1$AAbp5R(-EBrg<~WW7~;v7 y$J|,P fV b,RzO`D?3<8Q<\]E %x_wӧ>x<8qzrՈW뒀TEu'PX\)0wn&EaJ(up-Gu!B¿O&Yu+r0k7y`9t?}(>q'6EǟEB7mEy[0ME@;e8 +sS^YCar Gj~d͚][1̹ 7)rQ1Z%@::PNƒ_)!Ch@x~mm{8ND|R!5y( )# ų/ua53RD8}f,4v1(v?yphek}%g[D?^^Z zIWccoX&j3jsă[8+cJ-Nj!xTD@bP<3V o+!d<\qx k+s--{Cl1(~Lqٟj7!^.R“@w{Zsco5`2X_fBtZaTU 3A"XC!jSHwc PIx9rqV>zƘ$H%buac>Ļ8uwb8au. sS.0WWx yk_/?wq ғw+!1 @PY|ͱp-R?3{1 M7cA1՟WZ:lfGwVcX'8yًy~"~r(l| 3疿g+a=6n'Ht&6 IըT#`3l(碸ҊPʵ}e"Yv^kLY(BR1_[}v M:23{q_xmcޣ3mc:{Q1biI+< քǴݜzh(v7Jݸ8"Y~7*(ܙwݳ;!1/JZD[)0quE IWc'ca`ȊR`m`J;i5vy62zK?~!0&,s̰b&0yaj XAb㳔炟w_yuVR y e;? !OżdtGF& 4 -v ī*L/_RsFϳuKa!BBWes{x/YbMzg bX ~8'Z9%9/.j |u6 (v?FX*;51CeҬȇ6ʴZ0X^w{ ]Od m3}1~Z::/|6P&-j|'h(өV ?ϳeebǶQ a-%7$t[be41\8&c+΂f[@)2-o6Sn;86p癉ql)*,L;3H 13R-NcUp'v*PFYUku|C#,D7]:աzB򾞜˿O>8 6i@\dn[.c oRAxl*GW3 u[ fAD@=ag15Q?x͝H_3=̂|ޯ=kuFI)S |&keX>Ps݇W'\BgؕV[?Bkh5ur*Vg[&kniL5`8!Ր⻋˖&JMV1=Fa{ #uPOα@ќuB2)G8`Q3GbOЕy( P}DQABQs\ :,nq,ů} NHzn߬o@J>ص/ e-xDӪ1_Z1ትf[ :T )@R"$!L8 6JJ {8ǭp+iE?x`<KH,BR{0{~w.z*5LjK縋(k<8r>"An䘻lk﷠yUT-lٵE{a(=2XkY܈^6ڝ`ޯ=ۋXDaح΃ӟrg{IPf'ZEyVYWg2>~oiyG]b&~_3|_ ^xO>)>3ógQzJ#GȀH""^`q]m]5t5bIټ-ֳX58+'n=wҌe?G9hVFB&&]\it-w=yƥ>,t 3p[eC'+}afĴ516O|/ 3ٻ4xη2nP.h7ہZm4Ȱ]<v/vUՕ}EUq̳uRjV1!^CQaGO<q3/(DHq|j'y_ }3Zn'mBzg>l;A[?qQZZkt - ᖰ*a} Di0 "c< s<1 a8~~8̘95_]V0h!7Dl+`6T1|𼢊k*=U C5f#49`o 3f'j3X6ci.y{kM~ ŨbADST"_\ET_Jq( 48 Cj܉(0G!~Gx[~k{')=7n.+m%ɼ˖ap7.ϫgfpK'st&xqBAAYYC\&-s .ãG-~$E=ΉsrEq=ADN%|O?)oh ~Wo};89ٹ8;=oğ3qA)Ųg,,.PI//B{\'{і.AeR *IbJ?< Bn38NYgbK9^fHu9`^X\3 &xR[ pk'pgjpk(D۲E0d%Tmq_&vy00Ci$ n` [4?&ʭFϲ꽋;ʄ5hX4߬Ͳ6 dK81$ GCGaݬ :D,c1u invw@ IhS`UsaUϓT]0̰'UtBô.gx}9=="ip}׾˗G9`1AM3Kn}L)W l0qagUDLK9Hu*5F˜,6lf87cniI~B)z;w -;^?ʹpG-ў.21ot DXL%c&co Ulse -'db  0CeOo1jjh(yKģ !S)KZ-H 0(4̣^[qLc(hS@ @hqDߣTCz'c./pvz/^~n|}嶆inv%U1Pc+Tt&vB0~>fkODQQV;@5]c'},Ԍ]Θ p~~oEq88dbӏ?f\k_q<ɓ'Sݻ\2rʘ6j&t&a9 oS,^Xt;uaߐOGXC,ݎ3Ҵ#Ɖx53s%V+5Fi(7Bo@zYOO`R*@33SE=mNjj^xq c^k<ܬcfXb3-m j2%eYkᾲ ϐ"M?3(${)kk))[\0$#&$esQo&|stq5ggD$q3]+!,$BLBuVHTvƖRpz +\_]%w %sAwx!acz}s88\J Mۋm[I8Oseȿ3bIHgHtRb,U矍5TO4 %0Bts1*tј~H=p~_}E\1 1j3r'6Hukg!&?i "2h'M: PM%m)VBh^PUy,ma`:$s_uka#X6&ex*KNkC>Q0֢mk&$b1((xH%#9#9#w/@ʷtO.w[tH) nZڐERceg =*k0FȢJΡWa4jnf(%#Ь(i֫PvOON%{3)GdiE+_?|>r'8* vdTR KXR'duO74XS5Fo :8/B(٢-d74 n38Y2999YRrZҀ/mpFk $NDk7M'Z}A3 gp8܌V1?ض (El kŒeqL؄^HJ)Um64;|UoηI7xFaKplPco)a]3\ς.c =T03r`dIx9F6{NdhS ]Eʭs* ȁ}d 7c>*[,ؠ٘5qj!@a v=$ nLK )~6~~ _ëK # ~_x?qssFYg,z j)>T"Șl{٨3~nIj6;Ǫz?^2T(bȴa`E6XI̴$k 7:C,:Aq d(@2'艁q=ijm-zq?CDV6uv[IVnbckj1o?&<6r_Aom^>> 09o٦2[|b_bqZҥwEHSv|3<&*%Y2s8 =H$TJN2J9q7$(,S#C&ubT+ )| iP`QRrҌ6x pČ{;zz<~pOhƯ_7:>'iŸ_x˫6Ar@Tg.~UإU+cEЧ80Z )+-M ,v4g]7 @LB]0fህ-Ҿ"@[翔b^XA7]0Xw5^YQu3a!>o!)fܖ4jOqc ?jέUBẢ1G[:#1-sg8u!W]ujuyeCo^f(GsL1(,W1h5-fBFE3KUuطj-.#3d 3 G7܈T,\VDw_Ij6UHf )[hx[Wr?@R2?py4emp)wF{NXEapZ):*WJ`JpI y˜-L9)US+};H38{}>+mDRDZ}+w-%4K: 9iX9;V2kzW O `c͌e bΘyG]V\3{} W%6KJN3~cmH.c}ܘ199Y-F%IR"2QByFbA .eno"=yXfb8mTv՘cTϤh{A%{WCHTKG 95#VA8 3oPᣇ+͵kO@Եz jzn/sxE!xݵj/4Tivw}m6ڵmk26c`z3M12WR֒خ]r+U$b]k5"[u\*8|jLǛ] FIr͵A଀'nAq%isyC~7d2: (\`Wn4]M=DR.?8uw=ķ+8==a 0_O,k; rkx2TI"y> b?4B`֎|݋XAU4mEֶp>`0Q2ss7_`vUSaOn;J~pa˒n Z{G@Jr^NַrZ b[uaZ[pzR]|oA6|,l6LjbĻ-ZR!, +bt& 4ѝ,oIPkhm, 8EXmǒ6K:L0g4-y]ۻV fcͶyFb!(84 Y-à 71X Yk"e2PWYaƾ! JBEN4bmS-DH6B$T-#&\eVI2Li"oQ<}{pU5AB@i+Ō1pp3tֳd }DsOu]CLzXs`J{jf8ܑ IDAT.DaT*{öpXXэZ ;qmO+>G]87Q|TJ)zY*jdTVܿ۹K6} jre zLlܿ%(KI=-Ւ91-,!yQvDn+qG{XJ:ϱI1}R~%`G3biy=0We\]֤FPUqۙ!ݗ\]]c i')i>cS֏p#5*i`Aryʶ7;K)A1H\2˾8?ٽSȝ BI6B++P\PVTmiK^w¢Qv@/:=b?n" c*ûҨVXdzaog"jsL`cXfFK)<2}YW핎,3Cxὅ⻮p<7T|.',2XH^,VXˆǘŦ*V۬p8Թ` X.;]}Ãׄ{U^^rf ^'$pm&qPZHJ ټGciU<ّj; 0\Pew{OAX2ObZ xJ<G L %Zr{>&}!{aEY}$l XhxD%IfѝcƞHaeuS)lFZA6VU+n&Yw UP> ߱wjW5Tr cbOuy%0utt&J)^ZLX8/%106´u⻷@^i˜gF5yL @> o+ej Mdj [n Da57#0T ̛UWc9BZ`$\]GDAKˆn[imWvZ؉=<,(vK-$(816Ä#CV"V֟5q<>}ũ,y$, _(D`(@1 *#ޯt/z]/P [RկbP`G#l@]_K+$'eR kKs+D~`o#kYx1Y04kz_\Ȱӊ-EUsg>8͸>y|`F< Vu۴@H.gXҙV!1[ФC<D! G[W_F z3j½y\_T;|qk 2O gd"r'=#]l y'k-wܲ-Xgi-6PG FIc={|iw]\v x;/Zwv[s["\AC*Y3iANw$ŵhJy>|K} *, SI5#ET,PkRw/x$vV?H), W'R3R}0Ӓv&IU (HR^3vWw=~sp@v >z Sq/踫voR. 5qM87Tg6Xȉ5 l 3=}">-h33bqR9gQCۺTVlHlNoMWGDq((bFsvcbv.x0fbk+Fc<[: x(3?K%1'FM{ET ږ2W :}h_۲&sݪw޿83VJ>GT)hxؼާp[\X(j4w3r1nԀbjŦup)ǂiUJRpNIbA˄a1SI|窣Cz?`':{ᓟ}Wdכ]_&K-7hYTc k8buupoi_|'[x~pV|g2uU]q}nu~ (e_|R ~{/k`Kʒԡ9V vOP].Z>u k%P/:W|vYSFXbsB_bik/,Vȍcf!*pk^&"xC:|[0C1*Ukercw=fHc} xR3 0dZK$lGC*bs؍xď|k(0ɒ]hqxv0bߏ〜 M(Z|hͰHM5O5}:U:u;̨"P-՘kJֵ*IbFw-F#7 /' P%yp< sPviHgᅨ{_M.<ׂ/{_w IWcmVH9);4 h,FW|4%>K)R1T~x-5:BU,s D\ϣ- xzQ3[_C؉@rs cq`n~Jϥ_ 2 c"jK" X$lc8c;4}7Kw^c.^b o]{y@qZ-5'H)y%=:.p?ZP`6ȩ%*|mײF^ lANF&ӓ*DH&V!,:1v ez m9h/Q9A1\<p[` Q*.%9C` qp#Vfânop=hQt9cDpq~gϞ8??}DhkN\X#m4sFh٫5@e{E,V@@?y`gw1zj3f > 翥"-윉iV@݅ 9:7\kSڛeX1,Q5a*L| -_bxJ-Èzb->ƚV#m=xˆ}‡xυ {2knĮ0s\+JD?@ӱ1ygu$x8ܚJL0ʛb }Ý޶fGNj{PˀkY%-~AV}">@0NGNO5 ]q G"z4Nc"A{s}~9Ҝ;C;<|8:3nsB؜/6Ŕ0:wu:;5Y 8X:3w؏wLEoX9lGbcpAB, &ѹ'o˽b&?9dC}!QĸZwATowa*mgjALbĔ\LpS~p LΞZ,2p?kA&0 D[ Wh̆C sx~1HFJ}.ϦRz1׍KoZ]'RSk%O eubFev@s}.$~SDyҏ[gkLK@)MY1=&v(!Tl5wu"Av, 8|j?PA[KV`V #?3H.+L'> TS*o| A~PB>dOK S7 f #&/uBlz<&Ӛ{, c>k#F ߁epFU~0.aɾq3 Q/' u>DYY{1#\ladi+W::D.bw ڶjFU0kښgΙ}Q޸}Otq$gG•=OT焴v%D,qs"E+Ck &zZ0NΈH3LMu >MJcqj<<@^U@4Vq^Ӳ Z2b3c<9~{agpl4TJf3kf`m> c SfEDp4?7Rl\UޣQGmxʗ acHV ܸk3zN)dHIbW62@%Y#f^Δ\6mKD$$߹M9(BEwz4zУX1Ξť+Wݛ7pxxK{T1Ę ˸r2`Bj"]ʥ :bf-tI 2̂/ 6cȬn5u6u4i隙&rro@dnhě9g fa&<vTcg(O/"|rHc+Fk5]W>_VA|/ R*MAMo} sE.wd\7 opx[ =SxehЉn@3=,;oX{ޘO .ϒx6nbf6fs}ZanϔьdJ1/2֚JcM0Ca^^d=LKBbry-r]lpL7S#P{.s"BOӓ*8H"Jeitv4탡L0FSroyKmabÔ͒L~9K㵩J9lJg >}b_69K{m8#p@ț,/"xDQykK^O]>`&#9ye0U§f7§,E@Һ$QׁG4h(J90%xi]'FgC(HFWޣ*]3g΢ɤ@5,̲rm&$s$;2M5b+QS(^$-}_2غmǦՃ?Wj2Sƭ0W#i }}c'`0sMAdBcijM@ue3, nTQcTM,=+6OsZ1f `ܟRt&v/^Y=ݰ(b}zދ=7G|7!l;-UpxleZ7i.I!,U W q{iڧ8%lqhH@׶1Nϳtia0Naw*oWtS~Fah['m01x:^,$GRЌu׶!U=i%+j8qZFz޻q$z1f|k:i2 9Z>3L2rS2 {CK&ŁLKi'Mo[۲&v޵#~%7>JU7 hucn-6lݤp!K6%1 -KFċ7 Aƈ3Yv0m&bϗ͌{ǭ kKy2fQ t6mb#9i\-5_Q*Z_);>^6:8{bɰ]tGd0cfZAZ %=HgrLӀH:R+j&Jxֻ"s>nJ@˩Di2c쑴%-w(ҖG$K<4oIf$,@ ~*(q#&v_zCl!nOgF\A T;Φҙl0K%lnuo}?Fn)!1 {P\0ZqʲJ`CDpϸ1/kp?3(xr[dd̨ڶ %x @A=nH(:QHXX+eDa a?w67JFFk0%XQPĎAڕj8 'Xplˣ5!M@dlrAW͠8jfLC\-Q}Gؕ4gwtHԻbe02|w8 /q,r~:'6C6Oq2ZS^pY붴ٖ"2TLsL&oPfe"=d\2>*#K hV͏ QtR7MWrRڳwTđ6&lbb-4Ck o+4h{M0BXm~JNjcR2(?Rvߋ8m)$fs2{pZ,e?m|K7`Hgg>NQ%aἺTq|3;C&9wN5%!FQ)&#t_$:AD!;vPilo(,DN#!Q\U7dnw.uϧ4[W *)@\ە8t1G55;R;8xQ38TBjw׶vAĘ"jlq@ vΡm[ Ð, ! =Fw&-co-kfcap~'eS o68Q4mOFu%=ᡩnЖ|) j96C ϘK⬶Zy𘰊mlWaҥS.2ݳ fac,K>f;,rdD1Ӷm^cla{"y̌ h0 XV~c8DwZ1jTnYsG&Œ|?)nn \ bb},SDzʰq؜V촯R3)3Qg TpD@8DŽuߍ/u5X0Yufa7kdMh1#/a1b_BN$S 梚NHd0kԉ$QR[ڮ"z@Mm9NڨKpK~^*o8jїګ]'eo۵t?BSN)V4hpћ2eSu67 ;sVGzv̈\Xy2*`k6"@iz>aF庮jXJbg'`w๺*=l!bXTxlr;3 dĿT%KǮ1o}/:ؤs`& 1`&<<&.v1~[q!uـz*gY 8g<פ3S9If4~c"`}@l#879AP_NS751xDٸDaCK/giZ$#-H6w^?L;p{.ޡ 6I eH'v\rtm\pt7֨cNymi@yB`&}`#~]!vTϏ^{%m͕6 č^X.ǹ6|<h8!ΡJȴ֝ |Qyq|@H(PHA>Ήiޛ֐):#0c$cwbp'H2"kvX.WA13i"9éDMFĢ9Fc\Ui16ick]Y?R&4&5p|air͛݀i^mn\O\_=~wŨ,Υ y¸|>aG,g~5iAbj-:zЃ~>2\rҾ}gMO Ê~gLFIh>i{͆|n8x6-HvEEIP<ޓv`L@2r#ٽy)feR?Ke \l΍G:e*2d*TjD3$%>led+G_W nxax'^YKܑ Yse'v-윗n޽ި'={ڞF]ڽ ih5d>?Q$2 s<l0c[5=\V_cxڬ^!f %^ZvfQ*`LŒ56s +ICk#Kmp!G?1Hz(ӼUy90S)ǂ˒\&AUaM ?;\YHxڀZ3nnRLs+6&noKX2@Y*/Μxӳ&o6 /vrl)!N_kӸuu6,ab>τ{81)a}]lb{{q賰%fC\aV~ݝxT1f]o~Sɻ6sxH\Ĥ{c.H$c.ZLcAq'qnGjQUuxTwX'L'M@/an//_3O?^w=^Uk?xC-Ym&"!5 DA hC?h}zcZ=MڮC=JJ%~Bmo‚@8Ǝ5Mc.0H4Fb=e>hǏZbrƺQG1tSܹjb)T)!^TLbB_,K̈ki'(!G+\oh,H# R黭-JfpVZ5eXkcثhaQ"*!긇8 {{"&``A}4V c2MȌ!_ I9Cv` MhI$]QR̜4"ycŕ)eBSpUY`v ZҹZI}͌w7^NjzO~7pf1\|qh =.]wp'k=1 Cvݣﻔݠz=ܻUעCJ5]zq]U)ڻu&nBipiwFNNN-e+cAOifbu}=Ji>"~|m>6WdY 0#1h mt<92`Wf6— KȬ/2fqGocSj{|my4|rNvq= 1}7|*5z{ &393ڿn=kxч|_{=gJϓ {|>qak~o6}nzvX\4' ț0s`z+}Xdt..?(lc %LJ>i6*K;8{lm$yz7y&1Vx&>z4,pm[UUgXdVRvZmB5c fe1`z{uY1G0ޔFK:B5h0ƽv=A7L53;Ml<2ݗ@*L k\b*z ;ʀ"sd.d n(@2Ԧ$ZY53aEcZ!`{{Wᮺ1lE;|1.c+;̚Y77DJ1 2XA5T8%gdͅ 'cDVoGSPjr\oARsq8VysDSh %C8<0Kzs,D&cl8q#{2Ӧc44LCqJ3pfV^zb'5U]!FAn|=ĈÃC\zUCtWGUvR5+ œ5^y-yKfuO4k.iGrc}g=

*q1ٓIQqhkwLjCTc8T0/-ψv|RR1aa$Bti3`K:ÜM!Y bwDF:~7^yg?jm|-o~>{7e5Ë/>BeM] 5`,pPƷ_>V%9˜Aq(гPrGUpMf^8i rY%)g--$0M ɹ2e{!6y0sXshLTn/%pO$6F03F_NiL&N0&S6S՞k6Y;َKBm*i:R 6-Bf[ٗқǃ.oPtelsG? 5&:$5&JqB~u˕j|"0$gu$M#CUIPr`f"Q9{Kn#DZj\Nr\ϩ]oQğսw6xDwgaZcZpxc>58>>bA3?7׿5|?٬A ,Ƭ]SUbw_W9ܼC=k}q?AcwH^)3B~{ L{It!- ^L4zք&h{BQJ\B( Fb6e҃G)/%uG?˲?] zX1'!$#nlTlq{ʌ)0.{'g 4ыM'L. 4jYK,r.>S ģQ blJ#4s92 Y VG? IDATvvvGoWSRTsY+88켌;KR )XUYBf[Wi2%g/~LdgDp+5y$:=QĞ{t{iIHx( **J9>YMU!Gxcgn}kJ?Zy~@OSF퓍r ձˠ|GXM縗S&JeixDY)FcKq$u]FuݠTTkϊhIWWZ[ʎ&c2\2@SGYQO׃HmSK(O#MO=c`Zb{g7$0~wMݠk9>bv:wo[9w KL&5qR@gvpm͎mA=<b9 Hb1}VUcvvy`oB`>,?ùwI=:a~`!i6Ė*Ksmv6 =JyڵCDzȒ1*|A::|-)eVR;bXf9@?6Mdy9!\?^G4[!yR J( 1s6*Aym}FIfM +%D u<" < @c(rjFm[G_t4>AFC?%3iUɈ,Eڑ|1}& Fl,.kFD@/$9W2UXbm|S?Cu=u^ _ylomc{{gNrڄ1qDT /_wnLfVZ$;]kM X |cHLJɟm|_ټ_F{Tu*Cjl`P~Wm7}cC74Kev}ho40uu᩷dwng8$$L٫kpZRK;3+[4J.k3Ot}V㕾{N5W_i\X6R҃ƚ㱬}[ʍZF tƇ.IIRj Q"x1/@gϞ? ع c)6N ^A,.cd7!.@^4@ 9}7 6ƺa^b{̚ybkbZ^K2$g0B2YޘxA30WR # R^ާu,=<:R4~wie aܤ83 Ymm~%ѲF?;BJ5muFf$ X=PdE7S8>ґTiAe͸׫0fPi rq({7I6<6^0L0Y"I=UV|ď[x˘:e$3^?3cO^W!Ϭү5Ǹu["*q^%q,#b!E{hE\ 1:l9UǪ*Ytf05;꣭ ;(SbC3+D2 3lQS%ƬzIH=CW8hq) A^LJI`aZs 9eDOcTK#` _ぱFKX k%S|p}9|zX 7Y|܏_h8"oz\wBjcdVLz[œL ULxx=j|oM幺Nj3 aކ-T^& ƅ%$O$w[ed,o6ȯ\<'B1Xޑ 4.9qq@  bYd8˨-ݳi3jlMXFn2=&s0H$UI>ꎱ_qu(u7MAm\hIY ,^3 C`9~lFm8fN#MBV)ğ!΅盡rY`y4lw.)D۠,!HVOJ)z tiwvv* 2+v2& 1&-eiȇ>e2~g7y C7W ht砚FԽ#\4U?z%ijҘc7~8'&Px\zo\6II0 b9Kqxuh=p :Z jimJfbQ?RFip>`zH`&+"J.Yj bnJXJkƄTѮg].eXR*&&?c4^AknoZ? )Vo;÷ o ՟eyG|Ya;yX6l~гFmR2^Xg,Tike`!a8_Hs$I4;3AfIX8(^?Цe .cG Tn"杒c%D֚0_LV> ,_{k~?캩-6}uLLz[MfS]uhzW^k~xVd%ݳo-$a60$;VUy3.|7c7Q= 9mظ E*auh%]ehDJ}=q*Q1ЭdV)sg .di7#21b.]?sn}-81 |?f?Drrl",/;XӀ>de{=܏/39vobnߗՃʎK'4F[x|Y0ID(lqʛɮ=%c-snDJx\hqw^@!q\:)#PUN vJ_րL|y`CpgZ!3"|eqzTpw.+|~b2=Csґ("̓|Lq&^C b^9 tWiNY0Ls*3x~lݣC  " >ص[73frG||3[+Nƶ\p yZ7SD"*=,gi15,rS#(n%<\Duxmxq=Trz>"ASl!Eb$.7vZHVZ,C q)}/!KIP;j BjE1vnhWWhT΍M!s][E8pg+ ~ď~BJ I6~ CD\/خPyIډjwlLَlzu2׺}Y /c)[ і{l|lldN <_g-:Sȕ+U*nk)t5T+c9?4l}ǒyS8aB0YwB@eZa+3M#3){?gtfa ۶ݸJAƞ-:lsp1r>SYF}:M`GG]7ǰޣOjD 3Aߖm FXmxDǸ!ʩ/98sMyp KR#b/!DȠ0D[qmܹܿo?/aZa:Nu):-y C7kWϣ3415?nq+xܖ wÿYG) >rq8TY#‹l+|Z,pw#-O!fA6M3vPNS1i8z#Aarf^>\qn^㏺[}[+O8_OJ2sl6a ʤ NΎρ+YfY+ f<֛߰X((<ܧZ>|Qo]֭[X{{UDǐ"g>QyCL.?ڪDI2$јgnD1jP&GHԵU08n B.a L.Rjm4BcFec:tÀp\;}cX`w ֫%CҳS\U>a -O?OC\z CmY)ʤse5$&WWxM . աB8  m8fv% ,s@-j^xE@-zĚB8ix*Zw(HQ8B> D0tF|2&Dڳ0w_:"N`t֎]$cHN ~1;:@wmbZΝؿw13l-1ϰ wC۵yG8@ĎMLbGs_ |P +ofР|P.쩦 ATD0ĈYbvC!MӦԔ{Pt3-ܑ)#+q ?Xg5lx(PVc>@B\Sg3|w9PVrBQx>Ka}?iVXwZ)bfDg0|5;{>C,/ Uf^:V2E>˓);3#[۶fd ?Aa >tz5op/_7n嗿3;8Ν?WXks_4~Υ$:aguXdV*u#yg @6de`L0 3s)@$4EbG`fh(j/pxp#5ڮG׭qttwo=ԕl@5GSW81[8`]]o=:z[a]c !`\g?͆6mc׻u#b|]iĐTHEseouMb96*O6;ǧzUf6/Y7ARxO#k?ֳfdk$yl,JPRid\Jfc\Y%䓾4iDv#Džk!ymӔkU`^lwp(o 2yYMJqc{b[ xgw=k߿U_+Wwp.᝞(c]8`\aZi6٨^[[>K/Ʒqz0۸Ǿpv/efbxOgt## Mnw6yw{XˮL ֭Ȫ")"E*Z, $4:C!K#N  S%~ІnSj%Kd*RCU;sky׿wV*J: {韾/(_~=۬G18|TϗUePڶ~udU5⟹0 Bo/+z7oCf3,-_K)S}BWAx'OL k@RlD9\fIc4@2D7ϭZ Qm:fePBZ.qxt#tG;qpxA!@1'-v>'$ڃ2I-s?sM\{X#+k%.]™3gq-e 8sYBuv.YӐ!l3U@<=+|(01Q 8p}Ktȟ͖E +"t>Yyo*k_9KM~TČx2̊<$͙r}39`hPglL#!١$WHt۬=g.ljʦ;lNٺd (a! #s].W|"n߽+مC[)>RV,W+tTAIQtԨֳE.5Nl0Al"[Z+d}>c, ,}wށݓLLNMp֬"z$+Fi !{8<Pdf*BYQٽ\ 4hNPmqYLfS GH)鲬æ ־_*ͧ%`\1QW8aϊ)3#f&cٺ`&P32qQkMl  ;$yCyFmi0^X +05Xsyԇ^j(滻h`2agg{{M&# D8|br2Rh,X,;uӦuxVP.V(H mgO͛#4_i#FA?~iǧ2gIDƈ/:I&tĴ-N+a-PG)C_=aPGI3( 1!:ؿ˸:_;`˿0XRgkF[՜ %p9kCGlj_󅚇R$ߚQ3Eq3J2c6Rf힡:-V~^MӍafpKƒˋr|`j!χzfĵu=k<{"ʻb!ЉfЪ-6 xV6fcFte?ݐ5c2ic91CR4K͑{̩Y8 F϶.G0`xv""ּB=VϊqaaZ;G? GGGxuX,ͦДLZ1L=MV?LH(ŸB*BqxC?`2Ց4Y8 2atVD*\[+' @#y-XB[ť˗loRBR-i47m'%6J699ȿ6Z !*~lwqn<ǿsu,6hm} y`U &GИ39.{tAgc2~Z{u]7:X@s\*&v-7ɟa,&֨kr|Z xݸ&EBxxaƒx=.~8*U,+_+hR铧L@7RB߯XϜqCpVT3vv8{.]~7o޲1w@"D"T5䴕ghai+vg]٢Gz }°]xCܹsEN4ЌPЄZx! Є9e DmX88ra9"Cl~D`-~aֶ$118Ze%AqTfY0ũ3gq8F +7| +W`>ڶ0 c ӿV0jl(pc.k˦?s we뇡'Ƹ53ê*!!=1{g 5KxXs`mO>66y=td!̯}n|Pb0@Jo83ZP2lJa>.'E]1t8pxpu˖ kX|D愈 ;M"cs0H=KB0!zb>lj;׸r)\&>awg; '_(ƾzn`!+aR$T/{ EHdF?puk߽aqA6$ش D&(b EF,[51~7ekƵs:y۴Z ?svmqjl&Voc=eAP VTY%F, ՜!Oe/D+mppprY, u'd9Ƹw-m47 =bhZh15x_&.\x oy Bl3?38H+ q;g.4ZL#beznBNϋ;ͯq-5x&lZ7;+GzwZn55~~xBLv󄸠0%؄j|6/"C&ۢaƼqi|0Pk|/j-y>lڶ}*_n3A|V,qO&:=h:ӳ!".=qΜŪ\.qu,Zc"{{{x]3ɠ!DNl2^7`NQNPdt4 V+MܸyGhcϋ1E41" S" p ωbu(MsʹX}ʾf ̧p婧0րg2.,-/f)x l1MaHVE`-@i0LӀ3&;g?Y<>OoБþ~:2 T>6me0BtE7GhBCZ|ZqQ8fÙ6k0Bc[*Cxm%U\ |;:Lr;^oBgר|*a/Ƹai&lvy׹ 64{~-tH]= l:k̕l%Yp"?&G0:(Pj]-^rdRkcaՖ;[oέ[`q|r1{*!Ƶ #T^@4As~7*eV=VcGEknamw0NcpttGbhC3< Jb0+(XG@DR!q91&HJ(EYvGX-ЯzLo!2VQXr2ϾgS8B0k'888rt6+}eLWݢ";ēw/_2vwwγVVd"WgۍxΖE<#3o15jPMzF߫'RQpDC>=;,͚?c:>~S^m}nבB>L?w1pG ~2Ӑu˒I ЭPwt+IT  1Zň!+ҿW5AhB!'OĐU {PۯA֛Uq-ww1{М' upڙ^x [,ÿCº545Mޫ:LJj `zFkaq}רY83qǎfkQ[T3jp OPΊC?7$5b{ Hv<1RksϿ|jaNh%9.cwa  R>|`Yװ wǟ7:+@B5:8wd6CV; '(MQDJ@sr[7UʊRobd"N9%,X-WV8>:Ļ+wkWh&-&)woݻ$6mgMO%,ʁJ KsajÙ*&x i]8<fKƾE`Ng0}@θj̟ XuIvB5ކ;`NmNu`]k_|>l;3߳%RdԖC8`il5P>\ք?XߗNb:[o7U 15)ZdS̱=ލS8<:Ļ7ʓOc\3x+oӘa ,V{\RvDۈM$ 9!&W%nݶvj v6@\>RRmDl"DAxce!PD(R<̗S-NAwU IDAT4d&/o/AQ1QDb\`ډAg\=P*0>aܺuO>4(rl`rmTNQu"ܹAt2IR6AiL~eB0Ͽ jag1_K ;}|pȜXWMZ茓v̙#!/Yr͛ pjZ50ςΙ3x?׊-zl|Yh3xTXG\Շf|c!?؂c&^>oF{ܽ{ׯ_bDІ{zc˿ <oC0.Kb2d VXr( Pre!VC7tXVX.p=wq{1uw}[9i Bg16P !z9V)Wh"ХlVlYPsT2w6Q=($(czh8u4< Є-B){e~-m-jڰlј_nMsmt} OV\fx~ knbjY!| NĜQ^ ͮrkEaFu(wRkf>qg6.|y>~B)xS6`+3mL?gZ[~a; b뺭>"+>7V  f -ܿժ p뿁7[z. ΞAh8{>ؙM1nJ&ˑ ^:V5*Z f*б}.H);,W+ܿ6~x睷=B᝷6 I[u0$!RZ+L .bu$#+MX &6*T ("y*c(,ܐ5SYE>~"o"6&&s!1BdZ*Lp E#LĚ=cWf?1zoC\m?Z![Y%zu)yjaOym-yj‹cN ?|_F433~V7L\j.sE]m=P[?בM?6?}ki]aT~ !G\(vƒ(Za`5* kgk|_,ؿsE9}\{} .]d_uessQXޜ2N>ӧNaz\9f;w8ċ Q'buh5ɠcܻw]7 o6^}*GyãCܼĈ1K$DÂb4_GDs,%#> -գդ!V60!sE;i VLD/c0RfvMWpڛG> ,a#4b{Gk҂ /"\u+qº !北^>zXC#;2ވ؄ҡCw`U[O֨I݄ヘ!e@ytpw]նAISKCyTJ@[IkYpU!X JD-< PR Vw<RM0GX,W+wvJHRBe=ޠsg0NqY )cwg'v"$ 4ϥ=;>!+RVmțm]L9S D%9ξZiVU<.=Ӳ. 42"Jnmμ Ǐ. `<ӵcs&bfLDqSAPԓk̘}LeaIs-`ӟ3[J C{{RGy$8#:^tlÚbY,xxJg<R&C[pugSGp=?8b7{x_K<\.…8u ͔H\!'|bc kigRE5[M2I&o}߸E 8i5e{X=&YvBM0Ah]G߁n}%-3s a0f{`!{력nc EeȯK+s~2FAct Aݽzi=@,Vl` Gi0N0 k/ӂK!6g8i6G\ȸ Nn~N(s>(O1a?.w] 6ݘ==t7Ëyk׼B3WϬ1R!0t zdAt܌G]t2cͲ+,H|u{Y>~s|MXpS"^ܦ 4Xv=mswg#{6^{L)!Gҋ/+9vw,% ~p[cCyfI9 bSJc4 GGGؿuo܀j¤4oER똷3"+д!%^3 ;UH4? !|`ᰱ8@ AHz݁nŪlRʹ+t6NE*p\xz|)LŏS)1]rJXv ˈY;ԥ"ւ7O-V~ddgu1鯆k!BM~m5nx]C، =C#wg˖UNj&rbfFf3DmuӤbqü%`!cm֚=kQZzyp͙a7(lL> 2CĹ{kA;xL>a\'.⅏>14%)A.;ȃp)c<`,Ǹynߺjlbܻ{߷H$"4lAqmRR+O_}X )qYRJ,Gyppt<$HNEΊpRfI̪ry,(B4ے{ AR)~srgՒ\'5"rG"22>ib}n}ݖ,8:Nag6ljxqi,W 1w7`IMD+),ɰhͤ@Qeb A6 b3&x `TZ HX7!`5c~HqJDCZdĺ%dL988@V^#Fh=0O} Й O=u߿zg匹ߒI*R>(4'@mӢ6~S[(fr>2ϼ9ù\ĭeZ)ew0!5Cp]q:~x7k={:'3TUC*,l773Rj?a| .tgE!_*[]nڵߩ%uMsT2l*eR44V$0?N n@7`F(iVNAb3+/ ?w/_xŪl6;}|"V0%cI 0hJy"4ƅ-#'-5D#bq0d KFg9f9W]WZΚE0djkhHHh&C Xޡj]V^3&{9䔠Ef]"Dl ~bu+L'S+ȹK/Ν;wq1Fy%hIctS+4L7 հ:Vę2mUN9R+Ž"6e`A,i*a˒|1rHl|bFVu^ WxAY=~lo[.yUFo.kX/צ1#+|nJ# +*fÙsRNR܊ Jyqog4[uHޑX=ud8s'@diF;d:aȸ{}(w[xO}_WbM3bCz!Z$$)dޓ0#I)3uQfPX;sÐ%dK@J>YbGiܡ0_6nW6䈶mClAX믿3gOcyDO?x >{oŋ8^,`ɅV٬@ZD%tV+~\+dhV$=^y5-k{mrPJ a]Z;k.a0{ptK@|50UPy>F^,,dxL̏B>3XwdS:km=Afͥ ΊߣOָւ"mހd9HBY4lھ$H׮ hB k26݄gbthul6;U,m"9m5@,%/:}FԆKk@yu2}EԊ "'kTUᐑz[wh(rNBSɔ45%t w8^XokutW]g4tbHeI XNFQs*ዿ@bMTESJhB +bU:Ţ[ȱ"k@܀`"X[Eq }3- {,#>#"&dOdw c:˞(8f)gaT;w`8B -~ iЄ{ ֕M݂A,Շ4Qƒ_C (.=XGoZSZѿTQDΒsAm:MY3w?`IPLfB5Dd ΋LH۠$fRj8fpd/Ml4 HZ0絬׶|\\ __|/׎a_?5 w+҆5$4 S`q?B,[s b"_FgF1|(XZA`}4MX4Aдv UK6!x(RcNR#3vv!XּR6 ;f]h,-aj l`)#u&/([F7t4jY3ݽo}+=J&Z+v,~F,KO?julL `6Q CYr˕)%6у3on'ovb6aZ:[$f-)-!}k y<54 pvTd 0FgW_SV߇x̨k̿wum~F&:5,^_^}M=: *$M ,0xBY!6VՒ7!EYVt4iĬhkXЀ!@AQ9%EBMh`YF,[qM0IB@V*HE_O+ Q-hSJ{"R' :B˸cbdB"<|K.g=L&,>.C۲j r)*`y1؜;51u? IDAT7b2=NFiӇ诗ؘ:]?g3_ۘBAk [C`AQC#nq ۶оFuEB3鳰}ْgg;"Ț"Q̗ld3mեF Uk|iX$0gaϗ[-u'Df"l ʳ5c rbmcYz^u?I@k|e-J k= 6aŗ[eT ͶmX,ڶWًQ[ @I RTe!+TW RGPX >>8a0f45e4\B9bPrZC)R^Ġ!c>͵*xb+JsXYE*V@?! `w,|s>sܙӘϦ CHne^gDYgqI'4M0A +i䜰eB iy쬦0mω !3a~7)I-L`ƨY8sd& quٕ2t-.!PC"eV3Ex}`.!9Ǵ͉_;uK>1?;|y}~.~lZe\%-el TK|Hԑ_[qv(6hw1K&lA-4QJ)DX̗5x4퓕?XZ{h"20XR>(ޗyP 1n%FF+GQ"rHR,r`=-I_{g|rB5L І*y:n.>_¹3gp kFZZuR@f؞!T7a'!$ZATR2k~c;8 |㥗^. lnCfԵU+ keza:k%\EVY~yPYCeh/?@lJ)2v wcTE5oQk,DYg0L-\][bf‡ו[9҂א-_}8 #6fԚϏm,4]A5X'Ek`H}~e`dr+MWWUwk*Jmc =Z k*0hbMbDzh @}1|$7 J8,d+"aʼZe 4OBzH R2M*{  C~;%T[7Wu,K??_]4!@{z݀LOBk& 4zSgBg N2Q̮tW_Cگ;Q,vݚn8F8reMHV㴦k^[wkQƙ kN_3[NVCBͨ#|"e-%)OݺrsIi֬"' X$<~i?/EX3a˟Za\=v_/cz|~Vb\>AJ7 !VY6*sx[^u{Ub w5 y+DTI)dsg4b,n'$?/$1Z6Rt0޶]'H~ye Qb2B~MA~c9sq3qF 6u=>CYZdp@}xZ !  }*N m0(Dcy TC ѴQT 9Єⓐ&~T1JRW XEM`"YkZER /- (Z,\34 w5Ҕжj MQ<8w ;"8:"TmP4{? -aU  i.V({ q͛q[y=_wtҚ`{X.wZpdXk`}3yQmC߄LVVEG߰Zk,X5 {6_ 0d$T3Wͦ3jj;}Yr33]/oġuߏ})b$|] Á.QiT7̘Z4jK׍a=9-!_>s`MV8|ޫnn~O h9-B s "%YYDcҴHXzi dh 咴"hcS)- WZ:~o}CR&n(uB#iQ sY.7bQmezRgbPA҄o?s<})|??Ο;;3 $Xoz(M.BT kgֽN&)&mgԩ_[wc$-?[X.YBTN %Lm7FA~3sʜ,6$Ae !Ls"ylWi'LZ+^is"d(4hb@JşН *&wWOoEYg;!zYR K/b(.E?{G/ѭQv ,rա'Ndl߰:0RIsP[(F~i|a +y yCW;jbOdB|/3Bf5\ÓEaa1ҜGfCySD ךo ?Tg,sf,9|0jg[~}+ M>%b[9 ,om!!g|Z)a5X"X9- /BX "@ߢfuX=)J![>Di$@*vhb(m1Ha&rd‰;r(M6!{Pcl;MrB?te {_"{qm`k!@,X`ԋB]Be _|/*xIۿJ%bnH p.fX!Ν;?#;ˮ,X51i1nu:uW!k>./BBǃNՆDM<gQKaSl͐12b6X I&ڪ_;jk89ԑ> IlAlL hȥ1 )[Hh9u]Ci3k>c6k0(!b6 gm Bט|EZƦ0 Obj*ar`~gj&D=I1dE48::wwm$fbC%<7R%+oeBDZګN&Me:[k:l<>X^kKZ{V2m-4`ܶȦO{HaV"0B1K@%EK9u1+}%Bc}ƽ.C(Qf9`~XBt7!Q0v)lJOW$CdbbKԲVAe$J)hqU?\S$$;3&hhIMM -E?8vQwfv^__̄yokK=e}p\8߁{cq_+~yj^ߟם X>N' 1iц,:*RJXj̲լEe+!NV50hoAN[hIqUmIJv/ŪH,48 'V"R-mLXrHJ1I% c*Qܸ}ş34mkV "V>< И l (EZaɲm@y-C7^~Fm4*tQt8)́q$Id{>Is9{,шgifHLBxä9&1$IB$&&p2I"~ƻtf磱rZcm"R^kߝkѫ55358Xiyljϧ;SKO?̩ ۺ&q$C' >}2jF٦>ض.τg>IbF##YLظ/=#bS\Y]RdݱFcfx;Ep6l7T("+\a]:/V }P0^OrޱX8ЛlkƜak"14̯1 , 6TuMjRʺw$w9Y% 2:Bz}Q4 MjgsBcR/|ywb {aXg\vx̯M1oRpXHTr\G\ڡs5j42Y i&Ri,V.}R c{񚢢,?ܗ_y9^z&Ν=2/ @0"uSfMj-1IbGI_+fpVݬ ~_3i D!X=AHȅKB.2¥Bx^r|iRCHj`1%B|sx$!?-M]I۽d8@%ӈqbFٜ`g39KIKj!W&IJĊp40 ,+OR|B]g{nlDTc$8kIMr4I0d}1Iuwp5nd6[o+/u0IM-E53ϘƔ}u vy&(چ< uW_:އ!$k}Bc&(I0Tnlp3u&U޼8=}.q}$[vv8:0 "åTC5~}@Ce(*}7aڕT/'}t!itt_?bz'~ဿ2(C1юs#HʽYwsi]ëI|OrRO3l,;wOrOD,&tؘd*I7`AH~wJiAj1S|-<6Q{ l0A> ژccX7@sT5:1uX(mDJ9s"rL}H >4Y UCkTŅqM,*iԦ6s]FiKQA4 c]A7#>:uhuRZ0\~_y_!ͼÛ7˻5zl|-yW ՙ*UUvĄ=Yp=߸{98..9jlG z"pmY\ϘMbB+%˶ D2I!$8k r.2LWdI%q#n[<iHgxN^wgbR]ra0f[ipŅ"$ȹ, A{SN>8Ӟ$d:Lƒ(Me>GS9P5ISz=э-ZRT*$ ~yxi#×Pkm˭A7[0d<#gWeAx2//K/j(:јy! s1s^io.;<|tvÇ3ΰ֑ _f͟EFjR o8$ iѣG#;qMKXUFzp>YJc:ptG|2cz)9^| !IҖ$8(iC8/YW1EA³rxla\X%~mGxHZzB"_x8% LgW W,M}I%щY8ZN{gلVjA$K-" 6HL06 &1y #_dkueú H[r&"jcg4mk6-@wZN<-Tg}mf2MB,JQwrۼ }N}ތ>\8}PLN?5({+_0M*ȴɣG|r~1[[~'z?@g ZK5FinW^έs|نu9S.vo~C\]3aivvvyXl6#sܗDf0|*8*_jl_Z0b߶"GEjZ+$1Y^|`z$hOH^DtC"{d9ϖ.l|x_$i8Ibm1RMa1+~g>ƚZCh=5YXNjy*X0(̚(p&!u7JYPZSW59Mhf0)0%C$)b U5u ?o뙢Ip#z-O ȚR#G$GJKD0unw O9<C۷HǶ [UX4Y[)sMlNv˲+8/MӎwLZyymcm Jy>ZMM+Mӌ OʀeUbR~O]瓏?'_ʛo4Ο'r:Ԍ ] = jϴ6 Q]rO<֍k7nܤ,kvt]![[czՊɼd6zvlmm/rgKmj=#͡$siG7櫱jˎ[p*Ak,sPnCjE4XQT^G'orE޽&McmAӈi "\R&K$M2r~2HmIy$({'!dF̜%MEmMIm9w'͓1$@y-bܳy3%}{Y3Hsm>v'{Ogvtˌ|Y4GmY5M7De%P'h)h>5q%?y3ƃy:Uנ#Tf-UYPOy?d4k뫜=Cץts@M]UUI,8L(bUPTOyx~m8s /^̙3tEWjW)tIJaBRB]Z $Ur`Z1uH-n @b9&tRt:cYT C9_wu1Eα\^ȟ6Sn4H"tNpOQIX3HsV\Erxt:Jo}s=nܸō[y>3*,#s,2k˙3g *--fM!aY%!r_׾XY,3 ZͻԐgٔr i_UCj YQeij$ib-~Z(iz%1! Ã!?fpHB6mEjJi$&2HJIBr K)%K68Z)̡AfZas50FO#frL,+v1(6A-fnV,I,\SJZLq8v)뚢,}"ӾOz>M1&M)E0!,EiCH$txs 8+ :("ʛևjYT0kg o|ַ%s~W~/}Kt:]겢,-EQAN;G{=0L{$&7ep.0u!QY,+Ў^7տEZgc+ 9Ū8 q~.Uxi9蘢vMyr,N.hp8d{{{L("bk㿥P&M'i=bATUd:a6[Pјml]bLJSfytI҄bY0-H,5,V+%8x|>c\Q>qr{gXr?CCwۤ7w2EL@Ǜ# GlDAbmD:J7'>,K"kdiSl*0簿1!œdmbM7AbӝܻXC ɹHE<,Mi{/*-6a&>|s3mHӌ^Ǫ)V+@ {dYYKP4sF5nrVP5QJ79 G[eJsΜ$:ƓˆfxzV1_3g?q…VPy,X_K|kAO|(optx)k__~?* 9场RC)>Xq#?y`0X#HJ):yMSN4MItC{%klDH§܏ysp;c EYf˂cpN稫鐙تFbRזh0%l]5}k4#M4$AiMާ*M0bLm6Dc#IDd sᶩqҝ yɹk/tܷip> 9ɔ%㈓ qLzLc!P7&mgGń(q4p ?}wy~ܹstJ5~nDa4RPhP5UU4~ I΅tACWPR)k~~/c8#N ;ot fPY͛79x ~qX"}t'56_>+#ژa[Ԧ1cB*?vr?ڴ0i|W?wl,f1p@')F͘YǪXᜦ$Ngz]_WZʪl4ꊃ#,ܹsd&rDJ"2&|WU`C:z+&>1 `i(J]JmL7f$Ҭ$58HAι ژ~_J@:ΝիگA21L&H c6x6#1'XqKg|x{e\5 I{+.l5IxNdO%\HSԧ(^ƌFS7kkOsxE#h"ǣ1لbE$<˩bn;˦u@.YS(rѣEZ \t w.Qy.a4K://Hyh;mc)Ij m6hSAwR\[HkFb<&1AiC"i/ Eg3|/MmXJ{y1 s VK Pjxwƍܾ}{P 2:xh4fgw5GǓlo~w6ۼ/oy?sXK3,ÞV+ooGSV8g)+N\:J+| E'A4n4XR IDAT$HX 'Opun߾ݻw>f3]~рxN YRU:הXoB{qԵ/3/sI.W\_2_ HaIfp $c{\1osΞ%3&GY 7x/lzd$qaBxsIU#-KX D0oMX _/=q дIlvQ Fkk9M0)˂lFQtz}U`#KSVՒUQq̎O+ʢ|ȯJ:ݜlA&Z.ַn< 0Iv… qpu]' ’Sǒ<y0t<^,&Rr HӔ|FPml RM$CU|HaߧA _[ƚX$:Mzı'50^b ? 3wr5n޼Çt쌷F>>^#Zeg{p4nq@ӡa&?wX2> .pU~m^z饍=Z||!Bd1tن1L1ܽ}}ΞDۼ ,3h2Ώ>/mӏd);;wgL[˃Nѡg4Yj~ئZSaP,pigx!OA'˾vU]XihŊra8S錪ɢfsv:Ŋ|NddyƍX.prpx>ɔ,˨j](vNA#$\;ۈcÈa cUQ~D6Sۈv|%񉵔F1zbs\K1R+ $6_Ifk3İ! #&Ky.1#HVL>ZUɹJ&ÀH-ኅ {@b>sM޽˽{>\.I~`8dkEex̥y?6;\zIYC Em&6f֊Vi\쟓r-G+^~UJx1?wrEjK_~_z&ј^xV9 6. \Us^TK4 'B10)J 8`QV$.K>ϣ>˹s簕f?cX1<1rT3/Mg(ӌ,KX,Wx>9LX.WtN'Gkl:9_z29YgAs0(~*X1[l竵r8ҕ<=8`{<W~&9GeRxjWjp[Ӫ06a*_f?K( t4=DeYvϞD),3 jRHsTnsǦHRlQN} U )oe9/Baw*v2 ZX}_@-4ZX-T?쓧IjXLsp0Hӌlj,K;ٲ9_X,|uŅ  dYk+\MeY(, h%‡+m=6\:^$QiiGڪcsDޘ Up6#H$ C mܫ6$&@#mm=<_5\łAn39Ir>ٜб-͒an(__W,Z$x1db`{{N@јPJA%syŒeR8xO>u։ls/`t1ISk-YA)8c|Fur)/u6FKiP % (|F)b>c2 +K%K}t:e\)&1lRP&E|.kb2ae:[!U(y=a{,,#Ri֝ԐIa'tw|T¿[.NRRJZ3te+5Io6:1Teb:(Ku2z.ds~wQ8VǓ)Ill㬥keU21:Y-LgsnGTerq =^… jS/6\?jaIIRڋ5&_=`áO~ Xrb }oOuЃ*+<;Ae[rZ10MyŒm ϵj$R j 5ch)P2uaE1/Iۤ58hP5ߧirJ){ۈ Jk}\*OiwňƓf$k';I{0H!. {318KmMDcKaY\~lªzXUQ\ R C4kNeE8^sY$^`ZQnc4y&G'}rοKہp[`=b 7绸ICYר$$M$X+fj@%vJ`/"v:Xxt4$ϟ%${Bj:$ SiųMf3;GS& SM,3;Ƹ>9`\Έ~ǞW}z@W+2,)]QJW rhg3QOSՊD9$|u,3gPY#.T{51Uno\Q.t5d sbNҬ$ W<|6bZsxi27O"$/56R7b)~\K@&OO8ft|Y`$It2i5-$45I΀?o\t^}~bQۿۼ$^ #7IB'H(Bkls^M|ߐXQU5eJES|s & }bf2bD+gY#<:umls^7o捛ƅ ֥Im6a=$|~ۄDҖL ։,„Tf$)5;k{{mws:iQβ(*nx)͘-hoy~<ɼdV heM S~Ե1f3Ԏh3Li`+;l1,0qD;u)NstpiY#ߕ߹BiPbT#+(ǣg@f4/I"Tc?M Ny#}a!A: >iZ\@ramс5i-'kI,<p=cɰ|3o ._(k1Hӄv^+V6^$^2f2yΟurxpӃCzMiIumhNFQז\Q+(,)NmRm͛RV+JWN`'ө7Cۣ\.O,ˊD+0KUt:ppp9>>?u8<_8{,s}]qB{O-6M ?0>X @ Gar8ӚYY2nj y2]V$}Fנs8:r G= _VLI7vY.u&diшlNmkbZq4[]1Ў+?˗׵`sșj3I.";`2A9 I daιVK)) ґSB8~ܭVW3(V֒(߭ӮNcci5T \Y2+JQ_)K^lu>>mRZ-EKarg6'W,DhUmL氆q$ ުG:|@XkUMoHfQ֏|PQ5U֕>DM:B>$IPUȑ41Z68~>Zkڲ>cpv32165*0QA+P$ !O }/= SRZۥkrtcItl94T(5l1IYm\w;X455U] u*pʠIȳ̟ɤv2-X,hm|ٚ+}3cw{O0J U\Mbym=ٶljq8HHD9&9Ti¥wZ|iRaY\ahɳ&~j(w/gVf(,DV œ~Bm40E4ѭ[X9Sާh2ZS)EiZ5 ,UhyEQ$M)c<2Tg(2 "lN_42Tg6?غfU[֘$~MB뭴4yU-egh2W5Zct PٺafbmBe}B5dP3vZ[WϽD4 h?ܾ}ܻ|mxFUY0( mt91hc,& *,FXy;(LƟҞFFhHheIDYBT$y$/E1~HAYTEAgzG{O{6g=$ዯ/_̙3Wu<2}\f%=X'LL.c0I[|i$tjތ8s(>fƽFyVe勑1)EQ5F_DS(c4YI(ۄGi{s0V$8ǜl2%NjzEQ73&H|'Rzz˼51Y2I#):H h2hzsXk !?Z,1ʡ}1Gk/>D[LҎ^}k: zζ,Hp <5~ ltAKt[óg4X +R1Ҟ 7Aq֗urUq·^')N<4R' 6\kEUQ%ր5IM9)%rRzFt6|T^jEU[2qXmNiL4'Hה$ _'GϿtr˯ IDAT}g\dy5rIyn0U'INN%_ɒ_D%3^U]O `dY|eA>yٖKg0h3kw1ݵNUro''#_-34 UHO{c9qsD0cSCfNz$M q Oˌ<u>d]7Uk[UUKTu>gƸ1/򔸽!UքZʇm?.P!ls`CiU>҇w6‥Kdz0c'pDqxG{:mj.!9mfQ0 d!h`ң-EfFCQzDxnp=.0VCq'\.:z9aGp{$|S:;q3]^bj>p`#c[[Ą[bX`4dLmqQ>|ct1bsl`hc8:*z ~U@"qW N30i_֭[U|wɌgɹ„q9sbP5 b}>^ЧKBہ%lz8t}ψ|c#vѨʩ]~1CR~i?_+lBU4EZ1/B8^ƙRYY 4`6g{,4 v%b v,pD-Ӯ @ꀳΡAc{??9F0$EqeWQ;d;HcwMN*Ea$˙L\nKx`'N N#B|>e3!n={G}] f=ޛq<v}UzoٿH[`tUk_;·9$8:n;|p79v _}}̵v o\;z޵|#3jܼ~myynSO$y 5޸~}KUAHBCy+Ry5_:o?ƷM NO3$ĸ4=P ΁ykãOЎGrS4hoyɵ+Ne_7cu*8l:<~~H hon޼z+C>4.Npb0[s)uAHJDjaױ|b`}b7;Gu r FaFNPyy\):tGlXgm'3pi)@*Pjt1kMª|'pL}=p4.j?4qhC.,~ q+GKI \\4w1,l/ΙNjy۽ 8UxpٟpRt=O agG'=<{_xBCa[c|LpH8LL&`c{sդ^}ZD^۶?ɟ ~v2oc9!v)$K;s9\\ >,3~nQ7p#f7"ࢁϮ. D>$1NO/p}{C;y&U2lWI0,ۿ9QN`w/-c>ADPBm: 217\ZwbJWv() '` }lXxg]EW QD0!L{&nMų'vcW)>] 4WXGY Fh uټx`t/ں}{mz-[;յ[+Sֳ993Dd-f0>9r؈߆.YxeR`T6\w4͚a]"IYBƦ#gFvB!OZNaT “E<%K^ !]lu=o).s4&m=$.h)! h QL|rfQ=LQC?0)%51.0bDFUjǜtuRyDS: [ֆ_δǧs\w P9/ptyLh_PosV9CNubCdVKѬyN}`EHvU!KD s8l<:m>@`u(~!XPtl٢Ǯ;bd>!1~"M hs!9ab</}qpp_V @oy\m*JVG2V|,_V C- Hlcw(ю_a-h+ 0ybnӮ_ Thufz'.`emT$m6w:pr,fio+|nD^%PW^?i/Ю[<<}D<rμ E88Of {\5>ΰnZx/;,A<޾q Ř Ag"Ua#/'=|1-Zip}\}eX^m8{.@gsÄ.%Wp͝ *(h+ >aZ|歜VsU1`=[Uۿַۏ7۸sw7;>xm*PWȼt.NNNcsyݧlu*1xgXKؽ#t3÷}*<_B7}k] sԇi=sDϓ*,4zd$C醱4ڰEL0]s1 eЧr9ta}pwvy$!u |u¤+:`*I\Ÿ2; #>Y8$a|T6,r~UR,ܐ=^;:([-)^`ZD HG)윇s9zog/W,ٲ5;`;4Yr-$VyՁiцڹXC.-3v -$G~a Nu9soo{|+u>'O/0N7/}{x { O>?=EÇn\$[mbw7W殇szGkװd X`:eL+,/NU8Cz6^J:[5,u { ΫT9-H+6gaDd(n +Y4X7֐$ADdO" mR_ !%̻qzD:|Uq~da:[ۛxEO`sYs-a0ES v!{᧏"H. e2k|aw{t 26Ρ OfݚF޴[/5b Ux<ırI|ŋT4 SJpuheF\~b ,P yu`"|ɝug9kg#7~7RÇq-?ƽ{p}|?t<w׾5.2!@]Q+oUk JL&3[,,,SA:yp&8X%Nߕ.2&%Kl=6rx@L>M]!`^ ך*ZM&xtڶ- k [l3` _LC*siy5\_Y[/B-R JmkjpK#eEr m>*jc `, b1# o&|M|k_CJ O<۷c:boo|/b2,y7,cfc^uzحBOvkZ z8(#ٜyMۼ]óz' s\BdY[߿}fiC a[c,˅lxNW|{=p7c.WĻ!Iκ%Y{[x͌ =_ׯ㣏>Z[).4ܚbX[ZMlx^Ώ XZx+XDGe- kJl踥 ̻ckG\שz:VN-4PRښ!\s㰭pqѡ\K!a@x@f ,,HmڥeMyeK{ 8lr࠼Kw8L}J9e25&!׻M3?AUzs |fU]f&]8h*)[-pjVw^HvIL8[tاl<ߴ a:CJҴypc L i`9bCICLO/81K| G҅^zsmɊ;x:iȱzCm)I+:/\ z:yf\ٟLR`?kݖ)t~1|>G;TMPw.XR,Xt,RVVYgoa,-Zf,Y=uڙ/t.xK?| . /nC3ߺ{!x]^]Ζ%AynA= ]H$/2a$%p!7m{ 0]B=}5 s >:*ŚeEb{8q34Hq0*Y3"*ۍzKPi w=PKBs~\Yu8.SB3/瓋H-czgO<ucD+a9p{B̍g%jV2lp[1O:gF,V-]3}n۬]Uʜ9sewDyo3 f= c4voRҿ+D`}cPoNY.qq\mOC< GЃxm'zK¼/ mOU; d&Tau:hiy -#*T{@i *L[sk>%Ե+fbq{4x7/ 9F)9ٞ4 !Vn>2|C\:b, ~>E0lix2p=xCR_ζUUooO}{~8 Y4Z<1?<bJXĸC{4U@p9~5zd-|/ngF` 𔕻-W%.>9u{n5oVbk+jpNk.ZP[3b^MӬȱBMUwl. Ndx{*m r[Baii֘˜_m;gm1% oh]Ic]!h 'wo_QDp9h&>90K ]e?Oüh\>. $X"#9=Z^y)Fhfm@)ns l=ݲ/PKzMWMynk~z:C;(• wܰ\| ~t2C-A$_^(*,狫mm˻+OxQr29 ⨪jy6Ej { XW4Gp)Œ-;W6h 8 #'WgqG/,<:ʄ%cXN"߽wx͢R.>q9=8=/y{A- {9(b|Cp Nb{t=/\ho[eWD d@&V\<=OѦ$TPI]59^@>L󍧢~t:IΔo35|zg/ IW?|\RLjiumÐ _~rrwϦ)/Q"XeIы&ֲ{W E_UmWBsV 3O~ݱ:=i^j˖tZy~B-Rj_1,\xM*?[Bܽ{WXRt΃ /q& &uö;]g=3"OV FG0w\|_=j,ONm{ZPxsq1^۝`\\Ƅryp#v]ʥ=h ״&Xϒ}}IDAT p=/$ d8,DH&<<5"!MW~\Ma쪕lq.}{0^!i"e?H?-f.!&GhGx`*xO8qs3X yסq G.brp}ՠsot, gǞK8$p!xuηvr5_0vHz+Nɣ ƨ 0=K?NbVz?U f):oˇ7q/9*|I[p>f>1뺭i6b?̴K3Isܺx|Va|[A౸|PWn߾-6 Jځm3G'\.`(n9~t|>a=v*0d8 W" y:]8̢` sL7_y&ޣO8\å{͗gW/WH>XX|dCr b {;> 2"hI}Y.1O.z[dI c4yϗ0gFȈ'00sfq@"<(Ip.1j>V."9<55.pۭbV>BbNpN7wqh0v9K0| l--:"JVNv+cH>=s$N)" . Z|f+ [s^ i8,,J=4]4gjqC3 BiKw)PgユM|R)ˌ 9&TolBQDcrQzp_yc'TRN%0[;!dD2J)+SD%ݺEP8DH N=\|Be^*cLHb|j:SCUQ]ʥ`UURV*1%E0a .* 2GxP :Ӈu*cX ;{:,ˆWNx:}I ܽ{o 7c%]CQY ,4CSW_>d_- (b!Lj|ER3fp3@e3.Wa.ί6|]QgJ k BU B0 {8Y1>FW Yxyf= y RZ2V[ a 46yq1[,b7ΡWBwGE?s#_õ~e)Dуs[2j0~Jx7ݟ'K$,嘲pfQ=``.os>Y}x&=^wk*ޙr f5c7Ɲx=`4lmhsUkUYZv[k~ɪ.+.᲍EJs玔|aۤ,DA5w."0G?* aG1 ~Yb} ؃pbIfFVɜK)-|VeFjvKF6@ϭ֯Ĵ\RJkW23<|}9 KL7k黺tK4-ET%|UUAQCEӥsXgX:ϴ[j" In1E$! (!a/*hǝˊR#;(*RfI7o^ydwq#ZY>nɈӲ7պ2E?, :Jc33 M X,[s":Һy m<5:pWm;w䮲Ri8OMRB'A"@svc\}dV?#7K"5!` ҵ5omb %MmC>llVRNXk3>KյKWVl[.kwf@ڬeBTC}fZEPF/_^oIKL.Ia2z^7[=ۯe.vKxv%c|I)Lg.'c\;M-2O.yIRRX}Ua'%q؅޽|4\V[+`zk.ͪL!?߭4Xf"SگD k \DLRfՐfs ȣ(sk"뺔!ts-m%&S"N%TVZ6eV8A{ÌjҽS@p"44H R\M=`o/U=y)?/ߖ͹3%y0;E,asH e*351z^nKڮ  )!1f # kv ==[Z6.I#vLo5n^ k|Yt,C/Y`0-QZJl"&fvnfIpu_JB; ͂P.~P3Ғs5tT.ߢh" rlFқ.V 1 f ?OE:+sg ;,¬m Z]ݻbÄbjEF&J qfLoٴn9=ю{ULVDu)m)eˬ?˔mw|LI8ƦdV@WYo<.(kٖanseXj5K+(z,N,a$CQL7  ϩϚ . f0aXhUBb=g ӆ}(c d4 TܟEm/!۴K kVuVcX&&2)+@`K̙wJ%p=Xs~٭aefh3V,+||xY`X0ⱵBf&>J+?g ҹudqj U8rcFs+suW@yql Wl^wSy_LJڵ؎}Z T%mJE|˘ƩqgWǖ]W^>jcQ핳,0AYe2|1cxn'h.W;V0 2xV}E/NιvqS|lA8ыr|_Z V+ X`E4f֤S STgn_ K[ľ 5y^IӰ02XPϭ=ebTYkcdL}v|ܟm Ⱦ}:GN1fZL4/+J{TGۼWյ>:gRB˸KѿZ sEHX.m3\Yv98yR`iV#sͰ}9ZP"F cK+J ߱jv{3 &lּm) X0>he|ڏ￵t Nfp@eB Wϼ ZAVyQwo`RO+i$Jdyӭ -I>^0kf՚mr^gZ AZoFxȒ Z+_Ι`JRFhD ;La:3\o _: RLF76d 3=9ՄPy=Uԕϩ2AO?J6\bL؜ ckfd34>P O 8Œjo(2Jekd&me(x(od00+͋ɰ)10kVtj?B׬WG0|Md[KΝ;ݴHi'$%ff".6{ՆBsad,if)~UN1²ZČnȄSBT$a΃L˨Y]˺/&R& ,QL<Om̒}foh֫YdaBeqh.yZܬ ,i # n6ZZmajV%Lp/ӏYrMipm<_iO:kq G $U<6gYKY72XV:Z Y"<8YQϗ]!6$*-H{¡x.ۗ*5`4D,a)KU,=*|-윘Z㋬W(ܷ]'3m_ZXDKH񦔐N5gtR)m~i[F‚QmU&6[% ';_FRF;"E 0`XMI#-1kB~j5>'+ oճPbn;d^+זue[TWJn߾-0]Ҟ%*`ϕqu6,qmbn$4f6"žX;/kS[m%X0k7F< ˤ9n!d´p%H0xMx.-KxV0f<ZcI#ԅ1!+t%EtfIƴ1l[CI*qxV#`D߆i6ӥH<òpȬ&ՠZd.1+kJbnwېwJi1,K QpV/yRliRf3?[ɋF5^~@?ȰȪ@gMD`KUjr9ˌOfRV#(m.#nηi #欝(JLu`5EVbu,]c ̄:m9= 8Ej[+™?gzgmpj%bSIWoaw/]X 7X RBg>ڼvi?l1t|ݎzmJI ?xfPEfHpy/hml4)ȑ2u!(H}' JYE} }OShx/J\rKCXk#/ ̻h/Ͻ}ޡ( v12'XJa;mX߈v;Q$nNkc#NTSga$O' HHu0nGFʐ;eD u ܜ뱦9jo-w ٝow?e@ ʬe>`}/5q 6u`,}Oһ1<ϼ}1e ,{u/]"Wd:1ȉ,:0}|{ҐKF{h$=VpvFqt!}dӐ<({;(C#<vB[1S3It)nCO*`^Չ JqY B} -/) Or B٪*(18ͬOY\K}gbF|s\lj ͱձ??=m]Qg=`-O 󝛄;B@M? $r 0PDzeQ& zlhtIQyӻeI ڄ JIˈC<ͧdj*[_:Vf6UDK`؄W-hy?soOdhG4,)r~p([Kz/t&"C /Ͼ͟}}C1.{^H!U.yhŜ{,"T<v#yohtqM案N5pE8=&3_H" So ?7&x.78lONrs]UN$q֜ !5lfQ~xAlrw;tğDLt/DLn^T?훟]ZH>F;ĩ/\eb w'y:lX]zK`5S6Z퓗 sj p+7ԫiY(_ { A*؊]/4d{ȢnPᯕ0T^^I+e W|=Qb\rX(`B ޞJ\n߭K-_cm+kd<|L櫭zUA-aˤ)-Kl<6)kaMhZOàh1@NJkѲgҌt* I{9RmMbv(@??5֢U#>!Q w:`=<. 9cx9n3+'HOϾȟ}o}C15Jkb6տp2#H=F:>W)EA䉂= uaO^M~*ьU _ȇCb컻֘G~E db g^yC fkYx|g|jUPAox_&k4?JFIv4f'_CH2h'{QA+mubxu8PY =%fe؏ͫ?^ g$4`<\nGΉkLHL++ewd8Y)gTWd>ߛ8̊8GI$K9RBqVDX=.vIbAS.&͛}JA(S0[NH-u "idT#̠P+9493/<}&^qxCʈ9o1?d~%5&,xg1RƎY](snٗ\Q}뭍i[U*-mCxLu7zFiv+ЯcRCGiLztzg}%$Fb<8_93C+qp}De_t:l]q(Rb0w㎱5ps=y6ԓ?ϿIu7WXxll=aE+#R=[/:!*Y2&+ j#ڐ@&4Z1i 4F Y  % k8GMbqcOG ^&ע:tbٴɃ?S~rQ.?gP 캙E,ɹ}QU)T+Fda^g1Cyޅ`8ؘm?r4(rTrA& 0O&D:s bFSiYڻ-4$אsڸ`iȚu2,t'dSb) 0p'\ ui`ca593x3kT`x1w2R}NQN934ٗhhՐuC$ЌQ~/& TY"4NRXu~b]=68#MHPxz#m0J!z_94jxYbYafݸ)̪˓Z#`ޙz?Ma[@< |-iqrkhS8j"$вT&V5Fm?i46 U'DOƃ0%>m B=w8I5\Wӟ(.n4Ok{Jx$UI$K-ca0Gp SHd⣸DL'nD"ē>`cUT69hERG_Kxbᷙ^F7 19S1BM7 >`Hͼqքuy)Cݮ(O|#PYY(>G#9<}ݦxb ,\`7]Rl{N4(ݚvo5?UʨPJiG 9)\pygWY)Hm ?`#i_0{E0L'W #ા_###i6qBBFf~` r7Ec~U?FтM4B dH?\^/B_ʑ1uJתbz>@\ W$2tꎲ-a QN}}өUFu%JŘݐF=H[QQ`< y+8^wT2Zr#?JȊCakhE~0EaDbOTT$,bIhi2_Q.z57 T! !:(;;H7s*R o==j,Vg0ItK/4ZԾVBs_9YWp8Ud*r4$t#6ڋ+y)5~g)M䎽XejYZ…cί9}1JqH(Hz{/ -O Ǧ|fϪ>'_+-Iv9Ѡ,Mޥ4|Yx%B@E{; 0M5J%cbj t` +KiS?S }E-xVdhа[#иբn|bp8z%eG a[O -B*C*r!tbV7ǭ S(],9q-EΉ.ܳ*gZ r߯Y2S{I%Dep-Š[Y74] zKеZ^x2O"La͙n҃Y-OWܩܕT[6/MS쓼JқWL";I ۟[F07KΥ.+gG}iJ~O?<ײlLQs#pk8=lG$AiTc^x~13e"] yZ^;*ctqRr T z})\3yfY&Qmck8Rk޽S:lt5["41R3֫  \B߂ E{~F7$.`c?1+"!`:m1-lZa0vXm9 ̱3w&dyjpN/SsP=H{Zi+o@Ada1ϫ4d!-j@s 禌}SyQBuÖi)ѽ0uYhps2K\r|MmW? KqfBjl2/j`KÌ5.W-ԇ"ɦ~(VU"XH]-cxZ=HX8{9ν—ąN`4&j/>cD :77X('^Cl]yp&M, XTuxs%}[f=AxGitM13a%<|C)Hhyo{b, 1sxQYżVdRL 4 Rk&hʟW>/*d7$*p (},׼Xť8vnďZ2kEnݺybWބv3pEYBkE,%2ِ;ӓ{Rz#ɩGҘi4D_]nGtZ%&ÇtSCnup|Sx?Agn<,(g46Np7H4"qx\#PCdhR.u3`Hra ?zNUI ro$a V=x8DC|*WܧiyFj"mre3Hb1ݻ $Jb:>.v*FTnNwxz$Cib/=$iemA7/Tq|%,X^.0c+8&2V5B ʩbLWh%S-S`4:5^ J8ֵ!a)@f͠CHMH ڄ?T,%LȪڝR7Bުӂ0|.)SN 0 GI )C#F@^A&,|hp՗ 91Bϵ>. Y<étS e|2BvHoD-%L*MY<-z'qPKExS[%!h(Ӛ9KN䀥q}h0[r5<и4Oz%THQ}idU\+6lhH| +hRcf,[iL}j#~5~֋avQ DlJe)Җ˹X\3Ʀ%P+ɻsebu1MεuЛ˶Ћ'`'c/ZB߃ 4j,k bh4Wvb6/݂5Ҕ6?u`ӉՠBg kgzdCD;6-qw胚/^tV_֭sB~]Cїc<Ҵ. 4UG0H~ߣyY-vGF 1JhPJR(b8 mB q7'dwbP*Љ@gP 4zQp_6z̀r?V]0bryC RGY7Z Co0㽱S3u"9A!s FL7> H['XQkZfpot^ o%WQ:hpRs~>#6)ډ>kop+Y)5fVFXr`emS>$3W c]&7b"zZas4[Ű|ƒ/ UM) ,˄ga3pCԃJa{b aynb C$y'#as{삂wJL5^8~HXl*Q3}1S3Y묇r(G>}A{G>] T=98do.\, qH.D76vQpFhPOԆ&6 !X"NhimqB@C}y mvNETxb-Spl ۯLgZ'G2,-IpP[V3j"TMhǍp1x_+LLM#xO6n7( -h50I'B'LwĻt&R_1t "AJGρLO.Ο!E辐qzǞ``x:quP妶+TB8qU/iTĈa 1*< fM~ڣ_F Ҭws_CFL"u,KLdC| p\Ճ,W vWҋLGzW<3WIӾQ.1=lZyoJk~WvԨv}j7N]-?՗`֐PhgC %3+_LضJ;mH^]Gҵ$ibhk+?#n]׉U',A/%!9U1qv˄H*Bid# M_&NZc}G@<4zHTu/<4!J.6W)څ l .qwގ7vJc[+:|kްB J}p,J?hj[~uO\V)߅lAQ0F,1t= 26 NnF$ybE+6s\|N}9RYb,f3<, 0f͆6bۜ^2w zuccq0oXo mO>Q,(ȘÀ^fxp]ӄu:[![(lxj"_)]ɒ0nK7J:P:~.Z\CjO0+jI seb"*i=5 ْ%ܶݑeߔC}Jn3scdZn+ݷ4ďg 翘@L~U# 2$TerZ_)8ѩN/`I8S cٶ+=Ng/P3,QMWG˜uhpt8xDlStɘ ֕ns9]TSaGcF7UWvYX桕@FxV6rȹ3Gtѽ\Ƞ1F+1Q~fԀ֩C=dO-Bܐ!.nԨz,D@pd[$GQ 3\(‹Od)yRR:c(4uDT #L#?0bBlabl]q eW&&r|=ny̿X$`c]BԇmH75' ICw(ƞgͺ- n9d,caeB5Zm"%J䔾/U2??_:ԗO5(Z*E&Q/= ޒ̓ Q<;lb˯Wv/? GD)Q/;d=4@; [);i8\jtZ#̠CB,RC0b u[q,2k aqǘOGWYEܜ·DɪOg91ʖk7Oؐ6.lJK-KT܋F($$ߏ׮R!Bw켝8R1 >U]_S T$!+%%!(D'.G*#a]i@Ⱦ]wX 8ȑvJbS!m# :% #C@qIҊ*\X=jz xU"?D.u٭lyQ,aH92¦ D7fGՆ# 7B:chCnD5_!b+7ҽԴ8v?'f)֑R@l]B8?q$KTiKJ^e!N OhP$Hʚ9(hj*LL ߔTZ'7y"iOЫچS%$I'օϑx,+K&\2?Uq eո B1L+x4X]_D ,'{[΋5'~QSM~%ϵ[ѷ,B<1.X2OEo lVf $ tay)C) Ps/g|X4)&8oXK@TP.vd!>7iUt~fu|=Y*W[it!Y? Ftz~7k L<m2U--ߖ~%QZ[Y7%!giO,{v贴U%@ߴk%bzC 8-oy\ҲYHJSӞ qX%~.TQ5ٻC<G)1Nv~,)K,i5 2($h]L^<`zKe/rmb\g@ȸEuNVPݵv3VT #i 9f83I{3 @M0>rM׫g 3 DoSc&f'I d+.b\YzS0m1/Wiz H76l<$,FVnyߘICSpe]'OVg_t`I5ǓO_YѨm4룴|gQK9;f7kY#g{{ޱc{7lQSOvh}lv՞v{hKbؑf:?iSd}F!Aj|BFE>1R!| M@UH*6vzP/ Go&i-#pxL/s썢|DfeZqͼalpX$b ˓h"A B2ҲDMa'aIexSzDѱ7l+ 5): ׋O <ʵ#xwԀ:x~ћ;$Ubli(Hޅ=GsեzrVh O\HP^g zŘ`0Gp_ۀgn++ ݦ *jy{h=tHcLmt0ƪxk휀yį]ZL`\e)REXd9|ě/Ϥ~JfT㶤 2!9ijw6#-Й$<%prEZ[\%^#-sY%(_E=TA"#RB ~奱;s^j H7=TJJ#m:?[~Q B*u$v|Qϻ.h-2|'nb+_#RMƵ3U~Ҋ#b%)\1^eI+15KQ^prBC["Ƅ[cVW [3Lu<%Mm0_NSؤaשjo F躎WZ_?-1ʁ [/d/x{qC WN+F 6rhF!FGò?i_蕆.f>E0A[Ȋ\@^mu lZLGPwMu>:mkvGw8(iDwLj=xr±K utL aIeה>^b4XY7R$ >K͐1@.O8q!t KxbtJv24` uIgow1IHTejySs,}eW75rWɹeגGS7^ۆ%[&-̗|oZ9L~7yW{7DO=S?"JqP4篖Jظ7eZ?FB$~eaݫDGKʷD*v;&A4V/ٓ$ڽi(;EdLK󤰢k;Ȭ7Utsr=,=&x*dlRn$JGZ={'yAND`cB;|.bj+ wZY3n p,V_~'3g/!5ynT೬Nк8RE =B!;*@b;=DXeOkeCd3,/dcG+[+[tlk5EҞکFF<=f( [5G؂Bl V2٨sfOV>j@+kSiFH%2ږj~T6t2%73cbVªrvMҾWFj2}{fk>[4MgFQFcbfRfslN..ma V4GrX wFtһWh3 s9EӴ] ciFqW&{]zm!TܛھƦN^ִ+PEg^D/G7C|1q0w64 B}WP9G^#knP|{w)(| tgx4K pϬDbrajJTSg[Un(KcBe(X(A {( u95'&F. Ƶ1%0Y,aXHFSM+ոκXD*%g:p9\V7\YY͇T)qMRHLpNuoWrUKŞ `8 u++iIj2VFn}}zEx5 \ZB)|U!Lv%zz&&5r\zM!ek i-evf5i0B1Vᧄ:6"r ]G^@=1"J.8@k%"Q?P c>a+ $䃐ǤMtj;K aC,o?1sԓ(K-V'I>ρ0'U3(0;8WZ?=PeͽP2ih_ɗw]Tɺ#6ւSr]K2P#va%eŀ4M/665F// |I1!ߺ=!%kE!ӱZꛬ%yNHηhd +e~UO3).+^?Y Di{S((Vax3-J&ʁ[pS_?XW&_Q]r @\S~MQKk}:ЩnO+Ř[sֹ롳G$ £KIugz ,b ] az,v=ht_ xB:LMb`CS1!w L(&\c5/Yv7isP6> tZ,u%2Nxy)Tv\3vu'qk݇w^64ڀ݀#+>C8NNhsVoI< 4 9,V<ឿFsJp7r#F5 bŸ(=nQeNiFF޺VšLH ߣ %*"ޠT)xaM$Ů#@?j,8ZFR=CW߃ +l(m~dhDvڪr{I'y$ɩ_銝 Kc+"d.M>:=8T2e)r1ȀK% E֡oεdĸ̄-`*xumc3iq1d'o:f*}l 2`f++K QY /bzS[cto Rx ɦ4G)S7TCXf|` 3+(XgB5)_OH#Ѥ5Or=E~oy[Szri8așXkt6w)W2&ۙC $+"Y_e~=NMNB7#t gf"6ͧ6<򆁗[u|TI!,蒗^ ݗURJ#ϡ1B03 `(wJ #-{I5ES$+(ؒ08T@Sgu7W֯ÄBs4Iз;{DVx~b+U ?ecـ46tSIh$*|!< MǙyW'=W'Up:g%kHc㩭t.ıL/Nɑ}v_C{īQb{CYŠiTc7{zU 7龯EtvU %Cz2`B3Ϭ6]lUoyHB:\a6nj'pzPN^g `'nȟ mNk4 cz[]Tx(La/hĞ#HQ4B"z?4DaoIT%}:ѝdLC0ga zRެG])A~-׺7X9-#0H_8zÿ+^:d6zmZuG@oa*w "wL21N||04=R._lH0FB&/Kd|8꧖hg{ȀTȳo`rkHAN?w(>̰ybNeZQ|ZLal,PJ!zv711ߓd Eb CEh79VJi`~.2 Xl1 Ք/P]L[jR\[ !Z ,u"NDt^E,5K.Apk@,RR½H=1]O$55r ^b8w4L!!*._ <0*H6 leU*q}lyx1Ӳ,6)mf^i3̩Ƨ't\>@CnG `ea*h4iQ^ <`O2F J(Xql2JY4.>u7ڇj(_}es\U]2 +葇efTY")FE(ٔU'4JW31ɘ! )j~1!Ol;NMDDborEԓӬ&:jRS u-KJ·ܱ߰DjLaاE]bep76J$߸u}&fI2/Z7is Ô?lk d?rӨ}0WOcPww=vZ-l?heF5`>WA m}iO UC7bvMfۥV֜:xv%|;Y j[X=G^ 8~0} :)hLqřG^PL=k^XGjusuyO5vȎdBɎ*Q{ `Ȍܶ|P6Nlm(G NOX8Ln7}Pp '=D}8Fk,J%=G>lV6GGz'+G슗\4%1Mѹ 7G=*JP6%Ԡpk~Iʖ9>RKׄo_dHH, f0PŶ_ c>~A|ۉK.IF@'̻w'R$ؘ.7]xGPzj/u3Fs/xgq0Rq6d[Ks$:Ĭp*g=`vox5Vr:L 8<\p>S7?b1qI^ bDEgA4$y׈Vu:';ʹxɣK) g@Gw{) (:S >د$7Ij![I&k4ED +Ԡ?I³Y8"y?My!̟Ke@R&7 =jˈx2>ivj_|hZhxTS0&-4O#\h `F%V덬SS\] ʾuL/}~ZbVm/~dsb(jЭ?chD4=ߏʩHDWU6ܭO볰9i϶=&M?!"acO.fa!@]%)3of^50"GP1/{( u95?|fn Fq HI@ vM8<~ȗЌq?,nfxHc}#|C8CZ0FƅD)UXR\-fci ţ"m}:X*~wO6 _s[80Dӂ|'s+PW<>x)z%=+%B4'p?,,>!\=crE/ CT$Wh{,rȤlX<5T" DsGKqrknV̮Gվ44p;Ǿ5сװ !ѯj6[˺}6a{ʑWRڶw'/q@b@r` qH l7n}^?+{ S#TßK_ u ]^}HkU@+&@MkhdFrx($g3dz1 92/\ l.֔ |H |XG W_L緵.]8WjfT\mU%'=72 bD% jHU7;GQ&}k)n1(`s#֒ ߵd5qp2jBBK!i8)S =٫s+(@ˡ,j \ʉwB*!4f9g8S2R \qSw{ (6eyeVD#xjt\5ʩٔ`1НJ٧bJ;2IVYTґdI(6.wt"tYK[w_h e8~ !}\zt*:WWUUldCGWju1X0Jqs=GSJ'g@ dD}/"|E*YĤ劉;No4Pj_|F^Y̧R7؄dCN&@LD&|kwLJ>\A"f4u1dHWatdU Kw\߉4sf$6+Jfj F-7="AD<./!dQ{gY 8>Vy>Aγ-[R;e\5 $ #Q6͟tCjG `UOl|Lwe!(24t4D/)-(s-_DEC6焄d(QwɒϨF*a$+mig^T}F:(*:yhVl%a鮔ۏoWM"LE<(oe^*~=MDz+HExm+X҈T\=pxk*9}{n=$Zls#N'2Z6c9&Hb/Tv3DVp9+j7FwUh1|Eǁ1A3^$$_ϫ:.gN7͊}]I/iYEąn~fGv<4ݭ{~۞拓 s$d F+`[:XQŮC)I: ʻtK!1Gڅ`3ziFE5k mBaW`eSԙnqd= r >#`dF)YYȾв7iG0ln:XW<V6.ȝ#4Su[UiHY#E˿lڢ'IE#g4:)@~@+)+.4?oqs]MZ+hP7,&%&nEśw vHu a2Ne]b<{J$6r *4s= f>?`I%SQScM*@A^#PQYdq˙F]CB"^M%#qVQ#0@.!>Ԡ{f42Bf4Vu}گ [u8f<$!8ak X :qӃ! ;I+&J^iпM6znVDx[T4aM$Ů#?X:i\&wsEmmHTx(=hÒ _0m=! ɏ h "teRI8.9Jz?LP>DQĸ1bݪ(IR`S١rB*!Z#HYjS mg6~A+Q|dٍ,WTJ` \Hp%,aB 35Iip~L߰~JCIž\ ɔmRkn [[wIQ,wTzmDjuƩ|׍M鲳h\e]%{X/u 7Q)0e/Ŭl(t Ü4(tÓVZeS/SbLmQPd\.)g3,2YFH$$O:y׻E08bߒ 4V+=5kWFsN벊m8YT༑K,gD|crD%8JΫ)A 7~Zo̱f!+k-LQ1xie1k*Rd+XMċ4e.I2@B&my1 CBΒe؁\0F`횗6T`V|2QƩ3Gޭ<0$+32\='~@I0wxL3+z~νZMcA0,_y[N^fLVE~{Is򒅹Ц-Zh9:42q*,R#;n7FZ$ޅ׏w!?S27AWed}j=Tb}K%b49C쳆c(/PYA|=S7[gΊ?,ّc;D HL"r&GR+ekx-@[^t D}/+f/䢯yڑ$Ab6˕qb-Rl,^~j>Mt#ŹwqpJSmx0g!А SK^ QT?VǬڼ A5x'Q]J+^B&L>(9#y l* /{Xv\k9>"}0SG=Ͼ9͚ͱ;`S!0yW] 7ʯ˶0-C/>wݎk+/b 8Bx8*{9v|y{?k')BJ<ړtMi,8diIF A9vtس->U Zf]#=I:v$],h .b#LQB eǩ| δDέג؍ Օ`b ?]TXnИͳڹd#pϜ[9G-F7eFx m CqN|X0<6Hq6sST$ z`Hry/?\s̞ť^yj|̙E8#O'hAJ3u̇ ʵJ*gs̲^0V< -C@!'VQ\@y'/pB;YiS PD!FWiihǫ',c-u#ֆǰm 0wI? y 'Ȅ:/& 76fBI臁>E1VåP=Qf }yLl pc= 9{ c \ǥ^ruR%xNUr} h?&>Lخ|` MFfǴxӠ%ozIx'Oܻ?ჭ-/6J0K%[Fӂzi6*vem,0M̶iIԝ}_L|[v(Í5xnμVfu"b!0|Y4},8ћBmR9+]rJk18l qSO{( u{\1vm AI(8`^Eh[z^pc$ga5_}6M&攃2,|`I_[W߈r~G0OfjFkxo@얧8Uf{[^ej_Ixk^d>fH^>34zDk3Q\']oy^i/-Cn~m%JqaLO :B\Ѐ Mn(\|k3<4Y` zLis.YQS(xrb08 w9.P8' +hx;FScɬc;Y2 s M;rCsTm.sdPr"'{GSva'Zn1--8X &3a˅gHNІzA6_JQЧ:fJRRwH;P_)?P'>eVxQyic+.j;ЁH #slCuy9G82,u\wSzvy7,:kz MfadH% ĺ=A#2#Ϸ)pQ%<&B)eǜ鵊sIsHZkH4!ɺFCWA0ȩ+S\4._q '>u74cHcXȬ1҇t6$q/qp[䯯PV@}Hk>1\ˇYy_)3֪Ze  -Tn;޼\^JIޔZ3b0Wz^WIbEBKR$hSnNď} *A`y,i940 \<2uwz28q5-5<~3`2"\p a!iB}FGVc^$. ~;ɹp{zz*3۷ɏKU[%? wͤ9MrP|ri.9 pM)]hA!M9{u dfom!4~"ezT ?T6X[=W_NSW%4^B(;bk7T{eIbKO1$pѫKŬf [CbQ+!bZ \+^6g^w XD  zg*w|,(iˢeTj,ĔZG/mOțkN'Z] G@!KrRp/K8 $IЉ0xZ2qI7\h%庂VitD:pkVeTƛ)ˬr/j22^clX xW \-fUt@ ߟE<~%D*BRUaesƵ>v#sTGXr{{UkLWbd۪G2݆]mc!^24_ \OIڌ<DzKUԝv֩%B'u$aZ;#`5^5vq ]կCs,3 l.C-jߝ) aq2Prk{~OG7 a2$S*? =U S&:vFHq)NKtrMUqQ#~jby7l=C";M$$`H,{s儐xZtNݼ&?Ϧ='q鈓D3ޝUa|?IK+PKbf ƞMrE*9+.r2Z{R3~TTBL23Nj a!b  1+ t{Li,b7ӣ#ڸ*`nJ`ރU}0a 6!y.wBn\-( E)EȌE9L=_w]JfK'ڥÍ0e6yyվ:)|  Vu{A2tQq CtjL%ޚw2]Bd Q)kfIL4H^2v]b% u<ŧH`R?ûHo{qȿjW‘5u- |1BY/B ;S(iG6Lh)(/(Ȱ ed;gA,:e6)΃ZVnRuĥ;v{Ρi˩8/c N^{7aܤ#^ByӖU\D j3ПO#o?@}?7߁ŵZ4zj"U1 @ZT%8$$)yvDӦOi{ 2 D6gYR Tr}S::0l[EPYۗ^c!h#xe r^ޥ@1xS*tbD4>< ɯsEʏx5 J cۂN '(ɔ絿u~"t; c JhMNS܌ٳ|D aEas^3b+,qEO ׶sIoCa"Q עdW5ngޔf #k7R(~]aH{0ǁkb8Ƕ`vk&PE/΍z:Acl9IRj>?Ji?m2_!ox9Pnkwř Ϛz1K?ud{n8E ֗Rpőh )(9dGWpoP7C/jDpكanGEʦP!YQ䞫e"ЎL/[[LG]BBH -^]>1. 'ǒe7]Z гclt[¾DAߞ%͍ :Zr1ˀЮz-1 !`zԱ D6+E+xǽpI}nA\&Uh0\ ͧH]4PoI~rx A!:KrN-2thЦɸZ4ɒۊ1 oMح%̰H-`喪ג;'?Tձ46RZ5Ke `P^;ϴNGirn+0\AV̭ل2A)9 Wc!tOT%IB3J#ڋC[2@`O71%PҤO Ӯ/gJfpKxB;r|bf._^{Y/G?~(G{|CXߑ9;ѝN]_nYko,A/EGc(_ &yG/GB+c2e`E'y ARzU Cp0kN]y9$/ _E.a3s u{xY ;QWKyQj`wR&V-]TNa4--°rJ߄E7DǀyriQ UK^YJEML ߥXM_u0YWSF߃^Q_׮C*Q?T>OyONk0Bqs1̖:S=X-!|dEg24Ng}r8RޏqPϬsD\1s09(7Ӊd,5j'5Jʱgi}H mHmK7LC@⟟lAFIBXP5EVd/ 3:i)yXv:H*}`1c^m NzX2“fPk@G<<Tyr27gW@U6oQ!("6la s "T4bUs]gW w-WO"_5 !;1 Il>0W)plYYk:?FQ]syU_l1 S1m-Żbxj F@2(}vG8P JWZ_ΎGIճj_Ȫы| ӒЕkGWXoc2^%# u5KV2 lZy#$і|0嗿Л&@wF*_;Gu,F?RLh\|dK@ZtSE~Ý͛o %]HGQRCz@);qE5"ׇ 0-5ӹYVa%۠Ttҁ\"/ D'0EY]G2{ QHGGHÏe ώȘX'.Zc\Je-Mj3S2梕^ܾ/ԛJAaƢ6$d<݈ݱ褷ЊD=r1ǎ췉#Ҏ4ۧl(ٚ/E+k}F ̂9!u=$!-9 wo{sk 4j-a<c>_~c\F*98Q?I@G-%߸57|jwOds.O1&bv[Z\Y(cN'D.4]`C͌.SB9h+;lOV ,-!]~#Kiq'TKH|34K+* :8a$WQhJdM˛/0c6Y]0PI'WH]XQxzJ'5N$rR2ep3bAA0| :.ƮvnCa _{Տl}C>t3Sꘜ / jU)IB֞pHaVv ZC҇pxz~,`v";‡ 3!2ZB6e͵FeU$ r`90Qc?DL"p_Њ"ERKh8eMyxlJb:{&[)'!V%FKb~w(ZcS0|VsWK.A.C«AEJ"ja*F׽z_9G؎o,őߴb8Wǽ57UR$zH@՘պj(4tA8X)sٿ, N:N11X׮u^$Of{IV^jϷ]հ"AV)59Fdf@jgl}LU%׽Go&f& x}9BdQd3+q`i Sǔ:2<,ܠ' ï%u8FT9v߄FugLV/A M#1YHjm$a+Kkȝ2[m\|}mZoJY[%h,ꬊ.x$OG X4kOO JKX2'TZ.>Y @+̿ Z%po#Te8,;B wh-=;Ր1LE#y{ͷ)`/'o.ʷW`F nbzeA<8Nlx4tr@yeAto!눘l(=Tb^5⑔ϩAHRP lyk`2w}<3-C6f'A6Q;2q#MIDvNN)5tf?l^of}puܖQ<׿ʘ4ךt_Zwu~cNK=\'UBzgg%A>5!bτ5/am'R[qTd etcA%N+٫cB9E\U-k8YqfHA?%l2nԎĈiln˝lxMW=:̛ze` $?"y‡8C 0Ox/Ǎ].k?(WK͒sq7#,؀R ^4v8FmrڴW&iODx$߱~)ϗZ2Ȫ]ubc~-|X>ǚp(;gg/)|LK4?{m|qB>p1 T,$#4bDe5Gb>y^[2p.V\b_݈t9vwWv0O[uLjB☃b6-"z]9s S,ȋO݀*9=J´s)}upr^&:1 b"@inM؏*/[#Do LRHPIpKk#AUAڞu1H)1H߻o?xKU6JWu\U!N_^dWX&ɗ+auX p0rK;n+) :M!~:XA-MCU \yyl*z 8 ^mX#svO6?ƣJއçjwG_` +܏aqT Mtn=*ԭoz_(xXHJ'_ +`wccf Cg]Z@-5w%8 9L1]l$֓E:cSB]]RUl-6%ѽkXzőNx;&"\hxW@vu2037?Ffϗ:xxLW*IJHi!Cth.̸ d^\zΐe(S\}1o| D̎N:LEU]s1m<\E/j.Zu6OiAm_< [4N@@yxZ*i[IpeOte䯨?s@d%P{\*l9sG@, gr Z;ts*./@Çzچqo}IҼh を QۊdsEm]+a8+e:4Tgg6F R b>fv帠&D)¼ a bWd٫SJ|r!gcFOSH65LSmjHKBԄ5X1 ͚T9bN[H?e6g- MFo\SQȽB`*n=Sp9!mλs-X)@Dm<3GvN82qO9E<뭨9u-夋uS"rQ/ U:}+ž^ (eiڗud*W%=ٟMTlv¹wΡ_;=$Kv(9wIQ@reHU|T$>g3ʼnx{p8?fXa~qDv,|teo۸٨+Zt$xqʜIio7 5D{WA$!aP _m\RqK+EyfOa(Uk~-# Xk˳=5Jݙ"MHm~nO8 O/sw'3!ԷD]jӱ5TոI≈wxĜׂxbLxh>EUy4F6_?ygv1hx!r=&!9r̵v,lMۄHmInuVtR ȷbw E T fϧO#}lBU QH<6y<L D{Q7NkCr@Zػ-0YdS#|L5n\?;=SRk{ ;E'z7؋%]i&/x*+#!YQyYOit;:mN2'烏Z=.Tgb.m1W@ *pYȟgBc2u 鸣 fʗ6X q ;Bؗژ2>!ǁ@DF%C^z< Rӝ Lke8=O)tQHa~^w@ Au"@V5wA`/@ڥ]Iz%5Y2G/X2)Ā\4h$N1HYBsh(3WQzr9KxyZ9-=?d]9& }hTo<\~2mK6.'Y gj@z`fQX0[}MUO$$0n߁`;&lfv!k!(fNbHc cg1Z'떜0=<7% K݌`S%1{e6WsY]A+'f&?ѣZ^'pF \Jcdt̗=NH8t޻_Cmr uCF&R+8;׹^B=F[^6yMjay/Li3P+ԩ@Dĕp\qP_1?<ֲW`ldcLmmnq,a"srRAs51%(w+1nywM/l} {?( >Oj4Q_L\9[;J|X1l+&o7ǖy 6&79~.6KPv85wsJwda/!z@.f,=jXxo$ߌ-_;hO>d;-}.{pFOD3Xx\ՏiT||L\bKDA,i;Q'/@ ޢLݹp+Pפ|@j\ۮ Z6 (;,oEpn:C[^ota ,dEÂU QfSeYiU)ژ 3cܯ"sӦ_Rd;rP[Fy3yݹy˴3OᥚO,0d܁^--)bҢjk:[)jC~~d@˒ҥ8| Om; al3e'Q{v-:Dy9a!Ey&?z0䡤GHAɵcyWv>CbXћd8+sD} ^x]hQ(~88 ~:rRC׵?9V(eC^C-_ ! s}8\FtOI!J0d`Dgdpߢ9=DdqFGy$'EPϖW[D41T˘ ]iw@1)h7w==dڀ.V\qԍ^ɥ!2G_a2Qx;y5PIp|h=~֐[$hܠRDj ?Gȩ1S%[LXIB.I~J /Rj+*MrWFo3}5PI NEMs݂Uv$@7 r%a}Z<#{2~Iv434zA qą w-a5I*s] qN[:rr'*gV /OC{ Ҟq;,FrFPSD/ JA[#XO'z(&dg{6sPKF¶oAO%nK* z1ZC#ygA6X~>W*Ay+g%Ρ`Y2ǩ\UW<|~2iK\=[g[ߏֵND[/GkR2 ]fZE!*_,)õ8 Ԧii.h8%d^LZ_z\Ft)| vZq\-<&!ti %?YF -!;93tz UB!94̨~pVEb-̗h-::u͏5arg{fu62gh@0l}?V S("Z˵lQ}T,FW/r.17C@k G'(p.Y`hg5.^a} K%C, U":-:6ɮ/Bwsj5 ?`Oq,\ ɾxk)o>l$hįc 56f40=tz,׋[g?AV{pz dg &yMv*0E'Aψϊώ,!#?#S]5i;ɢ H dwG0‘TJ\}Tg,7T8x`ԷY`0o/2Yj}D1ព__V>K jwfJ6ۋOx([I\g7<W:BђA ErF ~޿fi>GOϹ2x9<489&-cKÎ>&tGT: >BC׍ټ8lYDd@qQIDHYƹwjA%oUj]")x//Ğr QҨOr0 }SNH̜a\fSJ: }DYhߒZu1qZس[Qc}!(6zȎw".WFykaʢρ[=Y./ tUNh:nΉ{Y]Wc Zٖ`Hѫ 񈂮mAom+1 dʾAx}tV-2E yg"Gѱ2qI_UN ]w@&G>>Z-V[ׅK!)LݝG ~# z&wEQj@j oAF9a070#K{m@ݧ-fC]#v{- #sPb{X{A΋e<*f"C/> 2rĠg֩kEmIl6 sѝk |PWZjx2R1g఼$EAE_87c~R0V& bֹ Hj*ޡA,G|3kN -L!ЕfO"gB`4^^[ 0Qd\;wv ~å"ppNΆQ&-3GwY߄}3ܙ~x$ELݩAšՒʥmgǛLL^yăp }Г?5o)"UB6'ڥT+ǹD:eFh5 ouyAn1i B {9_ӪKؕ[CRs 3>-@RgP(XRזaPXP^v5 @zk0 ǩ 4>vbI]fdf3`4U1Wc4zip>%TuClE 6P@}f֫1n %Uc:vշAZ Hs:]/|ƌys .|[ʒށKrXz] 8C@C$iR6pʣE#oH!& Icv_SL`> WZ:ӓm1N`JHlsҹ"6¦a8_oa S0\0# M\WnZ;Cݷ/tSj`S}r8 .ڒX⬰غӳR䬛e3d^b>x0\Eg@@gh [06 P)oeu#ʽ &6}dJ1`Mn$YcR鈲fF` uIx`N0aT~2gjNNF2h&>at~mbEV~hu0cFPU *om?%VV%Eʈ!㹤J, ,CY{pcoՆu|͸Ok7CC,B#,~Ӌ&.g̃ SwƼ'Dܛύ;m?^шZAObXZ< Du>+@]Œv!i^-i$J}GZY LknR|I0]D qV;;E@F㡽rkX4,} 1L=zQuHʪ F9Zҷ [a0Iw)Вx..lJ^_kR+4Q}v5z&vb;Y(N! Xz]~KpDeOuķl嶎Mpo>f|u2C'lQuK&[ea_Cbtu ~01֘Hjb<Lo.P$&A!ņI#xbxÄ%p `u<[K6WmdSʉ>q̨ 3HI1(EvJS$63g}]7ud'm#sP9wBuXwŢkIJSɳ{%܃0Xm @Z=E(6tq[mbPo#u0edz;3;Gĵ~`b(f&C{pp@дfV_3>9evfa˫z {+#vPjz7<}DAgoЌlt KF ϊT[2o!>6a&`]/h]T!m,[ OKAXRsr~9bs^`#54aBxgȸܞc6OKԠK?j=:w?,C4Qna\jlԵbg>Hg3.(N:fVzv}x>Ff'fGnTK#BɌ)IRg;Fe-o Bn ;tmvҩfѕ|${-qk1 ,>{=Xn_ܛq.W_o&HE.'{pꟕ8+2 rơ'oxYv6@"DĈbbg Z䞮rK5Lj$$ЦYh7vc42Rʺ ^csg4dh@[G^WG:8bі-W < 9a}w aJSĝ]55n LzbnQTizo ?8DJ`a (3eD?Wzj8,ަMpVfyN6qgvlJˋ:Sғ_ yIP*Lѫ;nVq#LFKgK =u B"ZQ[ d_;GHľ,Tl}Z)R7[qZ)&[7!Ke3^ﳽ8|g:tY78:祥ϗ@̳5‡WF{ioc?yxGe\H]Sq w{L'z`IoϊlOxF㗁 0wprWaݎ zy̑`Q񱶡[ќA] `"/̗dOϱsܑEQi8Zgj*61E7R=%J3O43'X=qfPGZTŗSaΣ"f10({xi'w49X Ni yбfJd:OC ys2EډQ+J*&WE=Q>0@E/Srmf&^Ja;GU>, 5w6킜xMFt[xSOxQA̬mG*9Jv2⫴ȗg7ŕAyOgncԛNinFÞn^E!ԌQ Fhb"*yG//q[/Co2 LPg {`TVuR՗d.-* o*@jO503i50ƥ3x+'gS$FD~kމڞ8G?DMjڅmGa>+Oݼ X+i'd }{h;hLA*AnB_7-D큛?OpMi^g*<H(1BFlg EE(ןi9Ɉ-_}DEO>i$\7&0D LՄ%0v>o3NaǦ:!ϑ+h+'h`[?Qf/IP^- (o<5zշ>rOjh[2hѕޢ8^"~R^O0-owjk!jbx'Pr6pբ=L T4@otX:!;A|}|ٸq4Q]&#XMgl26/Z >kZYṀ-ςHiZx/0.ē :Hݐ[Ͱ 5嬂^9ϪRw-4r5Y:6,8 Nos˽ƦSy ڎ|mr$Qs3x̴i(f~d5'^5CS"m>1jؠ(ZYۄtF=V ߆X׭U76AcPoMSD$X`or Qp: Oz+۶ӌ\Ci8/hEl0)}LטU6Ui$м":xeO)"D: Zl\ ~^C"R  `3⤺g$ A/>[%׸DMzkwpkf@sRfqDRY$i壥<DD[2 MOss?Fh~2WFmb+r#Vr]6xMPU$elF1pgE]]d.ܲ@-EbOX% ozS?w۷֑h yE݀B\r Ef+~u>,^||7b:s`F)Q-'cq3z h[+L?LԏSC'o~o*%Fr j$@`W 95,ܺm"d$;dq"OrXۜe\mml\ôjg࣠i45-ZvPAKVJ^Ń ȷ q5URP>byʺ:߈HL!oL.%l5=AzG᏿5uMq\pJ=c?"=yuӸ@őmn!oO؏:"oTvA;$#EtPe70g%*%O 5m{1zV&Ziw}q>W:TJr],/u>e{fseFmizy>Chlb7awqm/y1H?YSڄb^əߢ[{|%H}^ϛٹ#kW87ϓtׂ˓8c<{K kwE_a_GajMOd q &L̲IWT3aA)hEʢ,Q< cbmF}3Dm!1r(#d[v %/xb` xepܴzB XcVJn⢮֌H2?b5>kY!OQjM$Yk>2^4 F͢u?^Drt2'h0T;SӈYД(J{+|w,dR?W[.â3:)?#ojĀZ Ź?T~Ҋj8+~K c_'Q `N w5PEz wjp.&]]YFc)hFA䗙SBޱ}ĥ"7I>~<lGv:Ω I5Jܪ蕪&X=Ev2GH={N5ԍNa*$A[Ct6!2_V`5hYfe:Ν6Dl$;dP.].RM15b8i7zyo} 2g3Z`c?o8ӝʖ aŐ+!xTGT/P&Q]Ml>G:Es&;@7VM4K-7f{'eAKX ǡAdfAאT{ܜrrHUhmV .qIRo1;69.ga%k[ェE*g@"E4-ZKQP}ZSƯ!%AMF 15״2(2v6QSk'5bsZT%@'BǧNM8!GHK8|k\5* ̗ p5"z;:CLkF%/~PWiG!-mBhlrgPT&hD[hi2^h;8 OpXBtZ Ӡo /m-__zko)6|ox2hg (Olד?m~/d3 w6$03K{/9fLE8`=u pTD|R@w#y(~g!fys(5T"K(8j]^Sd$Кfy2h{RݨOb5Pљ! aD\gy3Ohz0}mX\aVDWͲTޭ e[6:8f;m@vY%: ՠt8xbYQ(=*ˤkͮ|V,bOF(JŇF;7,hr]TR6L|BBýIBfJ!=f'!C-0B3հ+DQ)$&7ɗ?fŒl Y2 ř1Ogӈ`O ԦZ&Baa/u.pMO@Lۛ!Fz0Coɓ 2mpAZ Ƚh2E%ĴSw)e6y7ZfѓUM\MI2Cb^ ija<ֵò:&ɦĆq͈QGz95NBC2g4Ŷgڽζ\fnó8, Hq0Ż,H.4unDZe/:-CWxJ- |\B ʵntb7 Gl.E$-ͥ@ߥ!G  !)Ephnj3ZCeΰWĞ^xaM{5hPaXc>_yXEk{'hu=/PmvEb1Aƥ# rVÞiRŖ0 'R@aꊑY*`Ԭ3/vg8mּN@&;TO,}%-)"~j v߀V`ymt7g%(AQgFX[]ZD}a7Ztwج &H_]Ӧm/'Ah!H0Vf8RWLePN,Bl N.&l7哋^lMɔ+L1XL2F`)b_$"rFՖ Pz #"}d?)Ib>&}{UTc5pw\Ia"C.5.Vz,١`<ֹ1eߛ~/dK\M5'58hGCMOE5.@IhP>`K :Xy#+ާ4G1m"c$$P[EU+m.TKh֌G%ïBV-Ĩ h@?W oZjk Q|keJ&z&p a< iL iuL-!eБy/ GG=-.LnZvFܳ\ EIԅTca"b!yqnW{%M9+yYqr=`D Ù-"b=Ҿk;ʁ9@8ae]?.aѥ EwJ{9#-10o/Z_ΎGIճj_Ȫы| ӒЕkGWXoc2^%# u5KV2 lZy#$і|0嗿Л&@wF*_;Gu,F?RLh\|dK@ZtSE~Ý͛o %]HGQRC}di0jzEw9&A[aH[k/KӵݧsWl񊋌a[QICʳ,?hW&mQhsb d~4v{,!ۆ+Hߺ0lwX,ARkۗ`0r%vFP})j/[Չe$|KGd}5 dHjV0qβkt=T4ɑ|vnxNwgAͥB#SrvU, %H~26ҜH;(y *D5h]EqDNbfWUErkӺ"/^S1 މOV }uU|j0.(}ÑGYr+-hweS,.~X| ks@wU~AEb6)A oM:Wz Y@&@V6a[ȡa ЕUhp-e'kG/mi֣DܟȰ(l^]Cȣul^鷕AjqܺSpO8\}5㧫];%^r.w<|׸Gʤ@7{s ^D*#vU%+`8bh]Z9P֢AnjћE>J4>_&d3rvDuŧ&ϵ#-Tb=Ͳ+) PPWVE<Ŀ4FV >]hBoLusJ֓tAC]4`rYZ5<78!j>-@`Q˒8ǹiH]`cx!"խ'uSYEAfl!Nx9}TΦ\UF*-Qiմ%L7Uxv~ؐ4^9ߋՠA{քN+uv˯Ew׵{m(i7@'U<7ih.٪bOE43slᲂ1i+~'!x-UyFZ&)}~@K6\+ԩ lBݠ BI*;TS;6F9V{_nN[4wi/w**GK݁͞)?IrwR)K :}]b6P7f'msë 5E1|P`k# L ^M"~,ySզ4`:VIo8NKl$*b!c͐ R*F׽vLߏã,]9M8ܳmZMX_(¥9H5/C`*ArtMH -eX 3A( ɘN(ND`zO|Rどί=Yu`MіJ ʾoR=P!{.3:YG9lBӯH5'0329En$Ke%>'rTM_ԋr{@qM%@5 Bu x#IooJ5шSxh7b_G[F G/$9jOS2/{ܚQtP"8l6WO8vfRmJ&8z?^i DYWɊHJ{DXVuШQ?pͫ2;497ZQ& 7`׵ :<%'76Hp>%/L桾oDC!.mۃ|u,3c)m~D"h_[eD*dIq=uarl+ߟ<^_rW_;W}6#ŵ7ę4<'68^+k`uauN,vӤ2C"CNݎlm+A+xca's8r-,'{`[# ܘZkX` / zFdgxOi461 TT†xso+eLnmx@e501UsYFA$[?IBTzT T$ KS jf})HWZ83836K &aJ9I^񮖶bX?YU߈xATwto!֪]B2xHnQ asEml4 [y2rpq]fΉ]ex}:KҶMˬe\)Į3g eҷ:we'3!|[J J |a>[. q YtT7@ Йe]/||-.5H6Ixk؀6z1a}߻)sS"腗WKz;$v:$Z! cQ&0# 3KlʚΔj~F|\Rs3 '{d叐=Ʋ.UJ'&sʟZ;f-3F# ՀD{#{I#guS~qIAf6.Xc/2xzrܮ$] 6qnòAJgH1a@ \=!V41z ;b@ `͜!z\~^1OɱLk|cSAJLZ6m$fYqzӪI#mD ʠ_ }\ mRBtxWEƍ51|biˬ]qhz,!5SĊcM6y6?2g\[.:oE:#~v"\hxW@vu2037?Ffϗ:xxLW*IJHi!Cth.̸ d^\zΐe(S\}1vnͳtjfGBY#~ܗ %0^ `Ռ?u6OiAl" jğTMsÈ!.ng n 0̪5!6Gy;= ~USM]'h<2DJrN p2yy햞*7ZةW+.0amp'2=|sV=v*AT]NG{eEu5Vc]6HtK `7Lf7qcmrNy5rw5LK%-$Z~Z )a>i[a뢸0fiĕXFIJFYH^! M\T9mtF" }MUˮ p8~{S/Ol>TVtV:޷6xTB<.2cNKDmR6}}jӪ,ʱ"5h:#oZmB$/!>BѰk TPLщjah0$>URjubL;~O- ;@r6`h&zӧ Nh(yH?WBc]  FJ齢QStߖviҹt#;%B̝yyÊ2_2azQs*)9&>؛@6ȓNVo569yd_́H=Y5X[[n#N{O7#3YG ꯗރk;{]pc.r"UN{tSBiJ^ z}iLk,u@m-ȉ]h_]AMxU1I bc~U30ZZ":a#77~Қ@YSh(("]8v I܆n$QF*&"ސ'O4xxRIT_$@_hNyCFᗏAVT[G }CUNXC(˓ԗ9?cjSc-X)ѲP$m]B[Ps.Wt@Y)5<5ݨ挨  : (ҧ>"ܽa6=eö(*8Mz`LFlYH9vȿ!QpQ_"Vݹ#M%% a 9F~Uk7e[Nu8m$ |jwMN؋N#d%QDX@qm:2;6j|݂/r]]kV{е fUٚe4q,DZޮ@*g9Xq*Xc`\YkPبeozR2OC{ Ҟsզ>y<wסEC͵(Y8s&,g6,JSޞCi۽HF,賎VNy%[] qk 8J@rR+]';?{)KlWD?0s@Q g=w{/>,!aJoZv%'2k'yn[E} Ms?Ed`ƉԔ~[9-f-;u,*"2SaVN">f;9F^MS+h:TzF+`Gxg)5VeP ?Rs%OȣS}Csi2 OژR#knjގz6tWCRބdճ$ (9_Wc~YMDDn@w`C\o޻pworM(/gK81@A0C;G1yg湢]pgpwlP>FjY`|a֣ !K?Tb@ 3N^AH=%̠`eNz3#A+BRƣ*^8H\{u|~7A*/2_ߴgꄒJ.7kezMToRhq:KQq}})Awh~xMв6_ 2qZLgS@}ZCµx/`à :L^ s^~;p:Ÿz2ХMԨz%FGW3_3H433!̏^ve#QBDQ݁yX 旰rmLrK[fݦ-(|e&Yt i^A}"UA5UyH_Ôۙ}~cў(Fk;2(LPCrëְFP؍gzg6a YA ;0.- *ˍq‹gq[k91sǯrz犸8/a3 %_$ר:ڝo2~yրz,+T<~=  H@nZpsOsӧbQ_9P{>J\mCfhou=`zL3. gu*wqae7i)Я\kYgxW> ?QyB53iv+ WCs}lT^vHL4Av=,{L!L1Z'x Ta$+7lgub6 I@P'!_%*aMe&?2Tb n qZ<D6uN]Ćzcpsdn+:5Z~{} XR ٕ7aKen|_yŅ,%yUQtWCDk8AQTn3C|)JH(H HqIm`d)ҺK۪q/׬yh7t!z2S.IF?1RuLݸ*}C'lcP;{=I׉k8x&95 ^ŸִuU1^M*92 Ԁǂbj5[}Q=Y-P> ̰:|5Vbv!>3Qs[9bS{5&Wtixq$y!~@x_a)l׬d|ɰ`GsLd /@6;&# AzUdb~4Dh‡u9TbB@Iwg܂d4:?y|(cqW4 17>`wr|n3Ӗ(xs ZƘ R u.t)eOg3":4Pw#@Ԃa+?i$!N/\g3;ǯ|Dq{zm=A<_IrAVUX~K-WuO"RcsX] ,I꿧z獓7#A] (Ug49vJ: !4`vģ׾W/Y b`YUSˁe"!|+H[ݟ_Y ?я*yJWs۩FZKM Ni4aqx -r@?`kȇx~gVJV81;;"%B˃<Cn vxqp|3P7I# qh`T뙴VRgЅ=bd$z5yw˯r@ 7dSʉ>q̨ 3HI1(EvJS$63g}]7ud'm#sP9wBuXwŢkIJǁ5}Jݎ[OjE@ota5ir4:6Y_\ NJZ#nPw˿򡓕v#e[|lv2n\SRZx2߱!&îO;:O}$fŠC[32}<~ ULͩ%fB(gFbcSs)dxg씏\+i+D^ؐ a֫hVJ.i:+zmO\mَKXav\y 9"tE_bCGfK:ׯ,YN%2{ᐦrXx gVFoMB wNL`rﴨ<+&B\P޸7Jt%Ei%WÔcgRQXJ)G)+Z^qIODH `ȠOtՀY]_oA*^/Fk 0FM1qЎ;3Ҳb_ |*$=/OTOwG0NdTYpjG[ښ:`2-nySw_AjtN K8z:ݼ4ۉS g*`܆ܐ].FsM;vr7g_Uǫ7A.) e?\lG>@J?kD; uLQ|~Ni{vӀtl=ck;2I_j%dti~}$y5IW9]4j3wz4|9ΓPgbDZ iKxn8&O?:NMVp.f 2z%v&vST$+HWKޜi6MR>ma>'HCAP-;HW97i" jgpSlrwPA SSKnz]\ _ i ƈ3W]W10 :.$0ktJ3wS js'leţ}#Gc8f y\MG Z` Mw|0ĝ#`%+`v~7xJ4F^A> LYKGNTvp^ު#4 g[lLx{f׬㯞AlH9BPQA$cY}`ӺB1ZX\G?KBr}Wcnηmƀbp*p3yxGe\H]X)Ţ ^<`/@"7SAJYocjZ#kz+P!NވR.@?< rg{.ѡphY.50->wSShTLG1@%5J(ud'Љy`8m飂ҭrb}zlAYh(gDr `rVPQ;5dAl#7\,+%P_NwD%[kϊ<^"`KG= /;ZFcD ]Q;of /Zj6qC!f *oFaܽ'SY y>s7aiSńDŦs|iE-GE!~+6fLa].|f;Zr GgH!_Ie!i%˼{w^9/w9yILE):;"Y%3}3O @ `z |jLB D~ z ϺȈP ۾q KYexh#'{! 4#S#4-b_5$nKq^Zɗ|Ab߁G>&x4i`O You G 8jdfM^ )o}h-kwJFzdv  |/mN``Pд\cnEm,q+&#ԽտBLHG@2 c:k-!ɽ,).Щ[rIn&ǘ X:2 "pe4)=[6R0FFsoܰK ΌϐDB(+I9rZMJh˓U& mD (d{qȱ`¾mI(wޟ#F"(5~Sg8\nocBk-3ͧC`܆hA hڲ׋NZCعD4y*0~@j $ZZь*+Ar o Mex zLHsbwVD§ҏ3 Ʒ*\{;۪?V$@›I L KiZ؜9Cx .Y wX/MVC?e7 w,IF`QǺcTmI}[bKXx꛺~n(#=辴V 6/5 7Ky(>8">uOtQP^ OTM|_׆MTGZ^r75ޣıJYU*@:up.#鏊H8NĭH=oF39aLAY9flMxp3QgYNMAu2"=CbHM 걀A*8Z6kQJ8}@X:2=[& c+=7ʆ?%ﮠ>kTeKVRjR<8̕ )<)Nd:qP_(Л zsƭo'4b=bJH\i;'1(Bd^txKBV{X,6,izIM&7_}ь&pPhCEFk-ɥ@=T!IBnpӤ61-X'\BeQ-` ay'cV`t8V=qꁚF0pCw!XkmOc0u% !|U@9ML,@`6a}crHW5AOqvܶF3]gUހ V~B E|cO\iH ы"N| pT*`b1 "$y>2oC6O T{F[ {_v.\$!@+wdWcU_}ј-}>6&R jt9LK(aPZrC&L#+QXWc(e~WSy^CW~7y͢4LK&j~JƜݘQeTsQ~[c)XXͰvny@rj}\Lu;N)UӀn4q&ݧel=IT򴘁wA-F-)K̙(qc dĔ=AefZHc)IQ61") 8SSr9eghIhmQ+MĿj=7Qͱs5id.MwzӉc>QoSZ}`y՚)yp$S d :)_b.3c!n7RRDPTdY)Zp5=&^,X-dZi<s%ZyT=NRڞ P"VvN4kr4;h֢W$pXؗ!!ي L2tM;G<zP0a1N-i_a!҈;j 4WP( "6{=oT`r?DFבJ5uMq\pJ=c?"_Sd"l#YfQIEa@tɽcKKbmgkē]dyR2/{+S8!Z]D!s 7ODʚس=GԷzbfZzs^=4=%9hޯGTuoJc_[,WVC a)x S>UGVqu{1|Rh͉ 9eik¾F,FckX;pPъq+$kk*F> i==4h{5aqP9N+>Е͏jBe@ )FꙈY|[ Gpj[nE, ʂ5K˻%ፃ|7-WmPeaܖ]K̘͗'^ӹ66K 8U? ˭kb ,.ƎX1>NF <ĶDZF) k>r{KV'uc[O:qmqќc.o@EEݦ.iD BKOKn1ag\H>qfPJp`#:HDזMqjdO!]mڏR[fFXЗ3+`БtǼžB7nՌm}ZUux4\JԪj(Wyz?NQagj޼P\JďnLK+@onY=GasuEqTؘ7ɗL^^C`W$QE*\ TV\@fU~]C~صu8 ;9"d@ʕ 8c΀qG89&/Hp,X? W謩?l'Rx(o-ba&q;NJq@zztGKz+Nv{%6(>A+ Zbc(Hb6I upeJ('CxC 8YVb$ WU^zt.|8t<\jCzUkFڷ1Y@E٫N /l׹uӫ7)Z+l1e,xxc([B\DkI1TB]O (gy u6y<:!>oD5:Sa @Y-sS,oCS%NPAXhm u(eGL-Bxѣtn+|95=FtIF(?&Kd._"`=`Fx |^i(j% =\CO.;uqiCaΞv.7OͶ>WA'ϒN^R,p#a>IvEQǴEeT8in/W;~ O">MY2اφ VP|B~,őĚXicncEAɾGXC@'e֐.}5j6X^z)RE?'6a[ 25'Q:=1 V27 3/MS0^g ~&# {nmmth eJ>镟qxG0>jB{@8XeaJ_F& cxvU^)ǓgΒ+4UnmO?`D)lS?ăCuq{ts#3G;@>ɧIq*s{wh+:;Vz-){F+6ƼIM,em!³oڢ)4b]疭E-Cu|O;__/L靄߁?n]p+7O7t6p9X5[ӥZ_­զpX-{Q ;GE`'W1#t>e ͳ~bA(c3XE!2]|RAVI%n +i $T}B+~C$.b|"ybLŒ L Eӷ;NWX '3ٜ8(3ޙ:?c+OB`TK&C8Uf/e)4>o$gT iݐ~t^3u>nFٛg m0*bIz8XD̞qm*:ܫu/[C4R,K R1Biے?Q~jk(T7:@]a,2ᇳ*+rw1wa]u$b ``c^q jy٧4똔33N{QNڱ<8O9 .2?ᣇ2̰yר'g:+Kp!gă(2s? zYb Ơ4f0@tds.4$u-}Ț0YSy1E.2bղج$Ęp[$\PTv%iW.tUzkǞ\l!i}  o }єEN |%_.lvCZן Z_ΎGIճj_Ȫы| ӒЕkGWXoc2W34UVG-c\a>Z)hX%b @a#Z]'t>HelCGNeK}z"Ղ@{Zv#%)3`Ёre;dy=2ֽzk!Tr!ם-rlJ]Gд iX UT~/&fY`ȧT(AR#VGEy: Uў #(ʦWz+R1 wjtvARkۗ`05z4{F9ŕ7^E8yO7\+<V%W|i3Rt. Qѽ"1^x`+chX{!;WFd?[|YXk68kͤ|(̼K_HA7Vr7ʘ?PcRQgm@Z'?)K&9l:)5ʮi8HdOv,Tâ@ՀhQ+)$SGĵRA|ԆʪJb(tfmI6躶ґ?|:H=LMƶ`%W#Z` .?ہ1GW'-BC4P\W_W8z'QN)=8^f|5JKgoG^^IuE;LWeR$BU H tQՀVn a඀uWUX^gU<;&Y˱7VHX@$sӬV9x/9Z6t`/3 0+nɋ},8@鰘En(/q_64BÃvFL8b*; 3Zqm$~tY>a k7RgTΡ~dTM8E)6t< $$2ÕYdk<1]{hj6hӠيA:0>a E/E̞ald|_B;5zMqEcJryoFOK*F׽ew,X$}x_0r!~DZ)Ǽؚ_XLYNٶɕx9A"`7pz.K<->4AKkWr9F:U ֥ur$[PߛN㽞#br;8*ӷhfTCõAOh|~sKcMJbr4ק~$cAH/2z1{e&m(| #TeFٍ;́oBymD3Bgz)b@էsL|U:.i׷(n&vDR:ΌԎiIJ# +xHJ)YϫWwep' k zoqjl #wX<~vhheֽ:pˀy5 N{ŃYM7.C('0C+:\$"3.9]ž:kɀg& ^xfEO& Ω>7!:el(he/>/sHqZZP9FWl룼yg\i̪<} aIN&t}4n6I[]'S˭}M4C*kثSW5Qf˜a?NFFLֈUߔg2%i4=/9ifEr[1U-3d`L p%!+&@<+bq}XL Ugn |v/353d9NAK+ǽ^<1(͇O"ȱd Th6zhF;ӱ^@YenS,ĵ&AwbClFӛ?(X/; s;lL#'\d;Dk'{o1|E#٤3T'99~;] s D4{7"-D-s(t8Jm1S8w ' s{5T~et= Y*L>o5նKuР.k`/ `IEͼSH\dW-k Al8[#)V?ÊF*k(vŎ7@\0%P ?c ٥<(zkF0j*FY}gΤx" 'S1+GI6B|UXAA#hݮ-vYL6B1MWAYBZ7ltR%c7 c= lE^lW$"\hxW@vu2037?Ffϗ:xxLW*IJHi!Cth.̸ d^\zΐe(S\}1vnͳtjfGBYF7V{OT.$ԲcDp]lSo[5t\{A!ۡn2/B}f&HȨUWG"@}%yW7JA(BwnqT߄ V֫pJ: i$UgB$7cC]ɣs|;W#*Nl7\~Y fKN qClKPE8LPGqc@5DB"O|@wDuJUÑJ^m >%ZVe |hdZLpbcٕci .Y쭰z]ˌ88 DPD9IuKVӁT8:m A̎:bOv9wΣDvx4q]-% !!NJiwylSS,zVN\w#+;Oxˊq+@ڞvhj40z`(PG6ٌ;7 _Dl+!1)W+O~WzXҩ&Xʻµol:`BȠH~[^ڭf*KKAޱ[)a4'9Tх\&=ZrYKGl\pYs:3%l&r1|>pS*r`PQ1 ]Q8F:.%$NLKӥ0fUŻuK\gQM HAv<VVg _'NFeR+R~`C6ע7 R?-=Np8b %v}pF& 45Ǹ+U{bRytW4+ <+'̾}"!ovI3. =b` ]+Mq݄ `MW)6d@w98(u;hdXi}(Dë]ʥRz){*avTw+7Mּ ;*?c8PȃH`Ԫ(}u_LZ93Vp-+{ RvL7RLt$丶0\s8w^UdQ#Gw ]ɺǤ>A,BBWN{CoMy\JBreMåg}uTyzlڹL/hymԓ}0EY@#`Эa!Z]YXT>ِ p ?L 8 [՜ǐe}'ugY2u9K?i#)~z)T缗GDy`ڦ$N=Zi {$AåH-[ նE=ϫ{I3o}6(эߌPPBXYY893lz}CoƵ p47%uW;pLGye x3dVa(bBtTŮf=EݴK^vy\)"|8$511WaYػ;@$#7'!:j&Z+ ^9\)WsJ16 |ˀP2hѫƊ5.(h)&DE l $ҡoח{6O"4QuvjMkVltY n~-I߹VF"`Jw"!c"wVH8 7lR]%5ȴ}e9VcmKH,4\n' >4vDV x!WS   Z5xuM73DqA9VZ'¾{WAY~SPB"Hy%clas`K7<5깟P5*i~{ٖ \w#s>1ȯpV4fW#Bmt2A!BN9+.&91&z&l!}>݅sn4I?f7D WaCcSݙ6UO;`idRtGno-J5[0,cyg`b"n%UtaF-H.U<_U3R;"uvC@v*U&~b:"KNL8dy Lp)7uƴJ vgՓk c?vOC{ ҞiAa]lߐďWiHAH%.nrۜ_K} ^/ @$Hf݅e6NT*<=H ZMh-)kqxȠ_d&jgE=xui5dŸ%]}?Na<뇊FD"LdȲhCD9S$$V};:bU[Y+F[h5! z@S{ɯN@=>+F3tNd C5mgsր9ƞ45ۈ׊EPo佧9|EېEZ 7H5v.pm:Lђ7~.lQPS^ͭܖ*i4kSi;o )Ov"X?#ULi4$B {'%\~7Wsć>@FmST4.B~&ɠ1 x>װơaK_@p~41'q )l)Y#RcQKd3c6UXf"Btu2zFd2tUª.ۉ81akҔ5DȎɘϋ_kz"u62 Ï*~om\2,FgVAY% XA-U_  kcSa\q4HݹUJgrE<4a5ST0O@[6S})kJ_DU{$̌e82mp9\zk2_qCc2M]%ͯC> /+#u]%/8Høߖ|( %*_{V82PIA<:1 X@hJ=ngSU}p兟<7봽|.YW 1̧&7"Eֵu$ uW#9jՠl> T*XyEE\-bn[\D S"+ΈA/cSXH|Cfzgi%җt.pGl\e +Jl`!O ['At>5JL5JX`EE9q*'])锌'֋E#1wEUU+݂g}c$kv ҂31]UE)`ک[n%V~+R JbpyS>aoq2SINp5'O&k<~h:J$0L=]g|?7I"OwLD bzfm93΍uvD+͜`ILOþ{5z&R(/ [!j{#` 9_wZ>yq+gSfZ{<,X[e"N <*V;_>dGe#m5CS8܀؆@)_-r 0]Y,<֣=R[Pu(?͞I0);$ƕz?&.py;@2fhq|8 z"$.*l"ܸS3dq}2ym:T;;NiQYC:Ux1mIYJxivk#;n}= #0]W@5Aaͼ$'wꔸgh +m)Mu"CkJ%ORs}Po͠YިBH{aĭD`Qh2 ~WL7u4P[CGd6ތbT[td<6:lӳ r';Xʀ"/k0P`$PH5jv5ChqnX)'{D}*Ux6OɖPVQ%,~O p|όģwjRYoo)ӽ`HחcgO쑢'{-Ktv)EE_ zP%-۹mJo*m $=v+ЛZaߎx31]FYB"+@4#ߡ`PvgG&#XGFVtJ U{HP1*IpZ>uszz"ٜl+vb DHr8hXYJx1't>]ww$ּt=作Q&@:Ed?5e4nz){` \sIcq>.ZDʮ tdSʉ>q̨ 3HI1(EvJS$63g}]7ud'm#sP9wBuXwŢkIJ$H'OT#K_ Ǻ1_:W$l֝u?o ئnr2}Khўn7 jϣisI˅ձz&I̖,#whIm?aXj=}GdC6v\jV,1g-:֝k*NS :~a t1a}Qݵ>ʋ 9$=: -SPc]6#T.=ny-Q*7@z/3̽XyQӒq!i8 0'TM~kiE9C?g ǸBoPBU[]1l`:߾O&ZBrκ!eH9vFB-fe`3K֠GG 4mG}h\iCB nTyнf/Eb6؝&E/|ZIG5PŮdZgZJk1 SI:1SFf_Fp|)Ȕ=3 EEW֜{~J*Ϻ4:^cLIPo:jfԢ߶g(ݎu?ETƊmKz ~j?"4yP 7 Ђݢ溸΄bheN/O&fv,1r /)|\PPKli^ '4@Ɓn0I $<8ӤAڟg@td >fVnKk-@v E[?v@_nnaVvG\W7 /?'ylG>*ĩ%ddE!Gn9je(J/*{~ `|GyxGe;T(Ch 6VNS>fk\Q[;2#T&ہёNu6u:V77s'xH`WeNhK[cd,O_>?@"vsRD*ySOLAx"]vJG06[?kĄP3bhnI$z]~$S+_݆1sN͝VTPw^r8 :𼰡uJd-gP-X9dkLKNGA${m>7s0 z JbLc |86 ʩK^[겣5MS@)R}<Bfjh1yNh8R ~IأX qV%s8\Jee`û§|uCB>0 RDl!DzglQ+JGPdtRmՇ'aͪRFϑLp5BkC?_eO{h@)spR=Okk0S/m7}'v@эM)]"߀'>n' it 8it  iv #QfE`40AڀMkwGt{(Vޅ(ʮ]䗫vrabF/{B )ہP%`(d#yG`)hJ1~HFF 7J Lj晓((y)B1!+wIU]^2Ig\{DV:;:K=+Q+wyzs2q E^/BK+ J KH*/ڋs8҆7$!H܀s$zw^jMhId;@8őXL~z]g~ =|l 1ɽdhPXs4$~9٩3^ixn׊nELh|PI-ڐ͵u3J$q="ɖp<. EDߙ5 XdA H)OQm+i7MyAÅ}-,=j`TGZ^r75ޣıJYI~/?ݯE"8Q-Eyx`PGcrcD8+>.]ی&r 9 @ToEI^d~vs# Eħ%1B9wb~8 -#O=F>᭻ C04pƭM%Ϋ<ߙb!r*MYOnP| C4YvG6cn ?cCиYE'w%()(_UW`W`}k1liu0,'2x4_JtV3H1$ct{cu\-ʼs Ç["Hvm'ZZ^$03kK]^>^5=\9 5+j 6YT25 KidepKpZtdc{zVi,35صwp5doН@Z.LJGi51*{Z'4¢ZaB6s>Qz۴rC..}2"ԍ8;n:['7;q#d>o"  ̌ =XY$[N,PHǴWNnH= (w8RT **MPQC*? EHe+"չإn fnwenE;x'cUs*5(La(k6*(N&6$]L"(qF$z,;oE'ܷJgFkpvz RavSi4TxX, ck KQ֠U)3cSXhosULz.!+;n/D.>@d J 6D8 ONW[*䤼g$l8rM,;LxL*'Q>SN{=6B$SS\ Ӿ87PөPvA7%x=ٍXJ {uivF?v@4kv߸\|^"ߤv?'f":2Ç0&uH 0@g 8q]N^%,4';Y 502\ӄ;3htJa/''gxja5"a$?P,Ӣ,Q o{Su Ų1'󈴊lJTh!h>|Zᡍs ęx,56\gzkpp e;x'MA6U & h"h~;ww+Nk J|}j lo[!DBhZg^k'`;ܓQ#8!DD8*Eh +TpR :Lq#HGdk`hj=3ijiwau?XDTgdW`s9VoAYP8Gljt~AsY MW<8~%iObj|$~Hqk)ž(GvwțɈ?;-OW ۞:Y(mT}kf8u}d:?Wն һ z`癡z.nm`\:}b\Et٨6DݨRC)q|cc"+ ׄd˼f[q<4W&퓍X7?vZ!6 oʫ&; ]xSrު㒈C!@!0uQ?~\98׏GQ' D {&97E#Vq6y^Yf=:\jTע#Zyc؂r4`K@S RT ÿe1]x`\ pMۋ@,d7DhrP>kPH2<,M?7u;*=>JX8;phƐfGX^YmVfP]׏9&5'/^`Q}]4m5厬HCm<9K%Nf?c9tdF~Gs.y' Бz9Ԇ IBqN31ěR%)K-=h0~6IX W/B46}' i(t@%/h:q7@%$k!ƕ [M]Rb̠˘(݃Tnd|2z54門f ;J=CPyO0xV|ϡ&rJU+M j~j1R$'>1ʔH%R faAxpj {[>լ'U*A޸v>Kf";ڄ 9U9SfoE BZ۝PJȓs~dϾoD-r:"9\[y_[@c]٥f 3B;`FpaFJH ›$c7'+ }~_ȟWmXB.@)T9d?b@FR2t@ܯLTC8eLaT꡻3O:J$zC^pTr-D2(?G`'^R`f-P^S0I.ZèTJj87¶G䉀`7~p k.8&.4߿M𿿆t7P,uJ'[tRKiҀk<<,c<m8oP(CRU|lv u0xeKZd 3@o(rq7Cnr;>ɤEÖ/0IBdL4l 9X{ '$J[aK}(}z޽^N;kApD37G)ؖm􊐐(_c>h1`x%7U}w < 6TOn,ߌd̹EŪ9dK<3Uyb>9%OMX) e6A3i=i>T2IJE 6y/ @J=bJH;a(GDjrF? c7u2yU(AKE;\,x3 !_{L]P6τ{ZS/.to: u|3VoJ7>PJ?]O[JS3W,~"af D8U$ B7 Td7D;G9JUsFRzsCE Eg+tO! ݃GN'rPfZS>;a\]/Ht%)MiB*j"q8go1W-)ؑv11ZFr ܢ)0[ce=¾ ϹH(gwI?J-`̵W(+a1EB{Xnn̠8¸ec;qu|d| ݽGg^gHzKƺ<RpsQhN[nKƀ:!Me㇓ hkkBF}36]}r&<5hM"KBYp ;Z0t@I F.ѱlUynm)wC),i9F~C`e }fF[j=w;04@fR3|]8y| O=4dyZ$DZgpL&=[bCp2EI1nv:$Ճ׫eHT,hRm9HS Ϻ!(UoH/Y}`KsFvD:dHcnnz.EE!5Vw[r0 QJMtL?eKEȯ4ާEiod~Z{Ԝbg~6z.z|6Ե/pOӑc ި\?L|`i!?B;O?b勇9֬UrEm~ ڎea7C `0IJ{j\krt|orTEln! ?,F(O _…R*^ d2J!ي^Raj'ȥMtC\n MKջEZk}};b1.Гu:F cC,KB6h7@鶖] 'qtXCz)d#2I"ρ^/m[V=1tOyaHIA +:]`-~sޜsVzu,2+PSS;u?'D>G|Ib$$ec8{|F&ūnĢCnorzBbs EH,I̭:ZE| r>k- ոGN㦟)re]}8tXA RW+3T 1:Me louO hgѾ6ʞٻ,K}hlwmˊy"Ԃ4ɼMQal%ICUa/MhMd2<o_ >ն2.Y/hi#k*n\]Ղn95h,^ɹ`<9F_һ[VqU~B#p6 T]%{_ۯ6I?.,T#SDh$a<D!fM,5ܑ}=$>R^ z/Bv:Ԩ2)-Hoa$pyMS,1ݰs<&L߂dS.{}>ξ$h+\9ZR Gi^ ﺣomu+'KB\P91鄥^k9ApU sʝ9&L`V{>d #@xPWDz`h C /AG (dѾ!1;ω`%Qma]άDZ d63AEDz m@ٔt˔@< Cl kBBmzs'Yrp3y5YV܀;- Pb =߼JeL"2[9_j),6-$br$nf4żm-2E74Jj^h]]E@ H;$crCG=6 i$=6jH1x&H!H}/_cȌKx֊gB-Y~!Sa)3T5:ybyf^xe7Q}Ҍm }luW\@Z!`ȟA]8kĦ2BRy\ֻH*^D7Rֆ"2֫=g1ðheX(6⎉'2A7kÂZ^o*fX!k]?wJo5^[BkDψ. ~`&?İ#Nq-6boF@.4,%Mڠ~muz؅"vɷþπžv¿y΅wmˁ%{Ǹ7ľö|ګouɀ'{r·żрĿu^؋}mg޾ķЁö}¿^yٿtq]ݺö{ςľvÿ΀Lڡn}߭SݷÀyЀ0ôw_֊}ǹ,٨H ܳÀŮvЁ,Ļ}¾پuuπ/ۢ=%ٱƫ{ЁEvڥpÀݗ2/֮ŧyЀ)÷wّoπ0yڏ(?ծơЂ]üƿ͊|sxڇ!LѮĽÛЃ^xɿٺv|z{]ίüƷЁ%µvڧqŁ9}spˮIJЄ)úxۙp΀$mȯ ūЂb½}ڎsdïƨρЁQ{Ѝvٺ_Ť΀ЀR³wʿŎ{|ۯUݻ!Ţ΁ЀS·uٻwݩKݸ Ş΀πSºuڱuz٣Aܵ"ƚЀ%uگuр5{۝:&۳ƕ΀*wگuҀ)xݖ.1ձē΁Dxگu{ـڒ'B֮ċ͂р%ǿzۯuр(zԐ TѬĆπр%ƾzۯuр&цfЬ ΀YƾzگúwͫÃσ&ƾy~ڰuр܀ |ƪ΁ρAƽyگvڀ tªρ@ƽwگw¾ہغlٿþỳςOƾuڱxٵgں¼|ЀςRþtĿٸ{¿{ذb׶¼{΁π@rÿ¿zـٮUֲĽ{́р?οrÿ͔~¿{Հ׫I*֯ļ{ЀVͽs¾דy|թ<7Ԭq»y˼}uۚvӪ.Gԫ}΀ςQɻwzڧwԥ'[ϫ΀ςSļsٶ{ӿΥn˪͂ρXοqÿoǖ~̾ϤũE~̻rÿ֗wҀ̀ ˭¨}΀ρ-Ⱥwu¿ڤwрԀԾρT»r{uٹ~ѺպЁJ̻p6Θy{ӤӀЀȻwr)ڠv{ր́π¾qy}ٸӀzҀ΀*ʠ΄˿{o2gјw~,uvvy{|~ЀĽsr`ڧyր} ֊lkjihhgfgiijlnqtwy|o΂˿}oz:oĚzxՃlkjihggffgffghilmnorrtvy{wЀļsp*b١w½z{mkjjiihhihghgijloppqtvy}x΀ˀ{nv=Iٽz|wmjjiijiji5jjllnoprtwzxĺro=E؟vqmkkjkjjk4jkllmnooprtvx{}yɼymuف:aٽxpmllml7mmnnommnopqsuwz|~z}pn8l١xÿqnmmn;oonnoopqsuvx{~zƾtmu=śu¾ppopponono2ppqsuuw{~twmn9eڪ~}þqppoono4pprstuwxz}pþzolx3.ѝu¾|opqpqrrstuvxz{$p|qlq3aڻtĿxpq3sstuvwz{|~rƾrln}20٨yuprqp3qrstuvwxz{}u½sllv܃3;ҟw~{qqp7noopqqrrsstuwxyz|}~~|wq}ýslkq;.~ĝt¿~pnoonopoppq.opoqrsqpnliis|ýrlko}ļ":ڷr m;nnmnnmmkihhfdjt~rkjmx2-@٭r}lkj7ihfdchpzrijluµ?1zקrîqvvx|tgecdjq~)Ŀoiiksɻh$Ԥrÿ}wx½lgikr%1ңq%ighkp$AGҤp}!¿~efhkp~$4aҦoy8¿qdehlq~¹т-֪qs À$fggilqó#/زvnz~,sdjhilrľ!ھ|ls||‚À€Áā&¾agkhjmtĻ'&ˣplv|{ŀÄŃ"dbjiiknvÿ$0ֱzlmw{|ƀŅǀ%ÿgfolhilo~Ľ-*ƣtjnuy{ŀ'fn}uiikmrǼ)7z׸qjlrwx)rf{khjlnǺ<^Ѱqjjnsvw u^kmhjklvƳ%^G̯skhimprsy}j_gvzijjsð%M@ϳyoiggiklmops}&~tgcceddeghhijjigv˾;sԽwojgfefedcbcffihedefhijmʳi?θ{tokihgfe cdeefgghjklmrƢFVzп~yurpnmlkllkllmnopqru̴"*fø}|{ |Ǿk>ـÀրKRׇwWҀӄԀaσʈ HƁǀȂľÃāÀ* € ĿЀуσƽсӀҀπ ؅рހ߅ ɾ"'Ҽ$w$$ž(R֪$oѠ)S{ҟ'ۧ̓.Ľ"m弌πЀрҁ"Ŀ¸¿l՛ρ0Ŀĺ¿`w澍»Ź¿&uߧȁ4ļĵ¿%p՚Ł9¾û¿a˔ֱƶ¿cuĒ潰ƾȾ¾(d潒5㿼·î)X潔ô8߾ƻƲӀ%G忕¿=۽ɾǵFƘֽԀȷÿicΛҾ¶ȸ¾׀kQ؟¾؊μ÷ȶm৙yȼöǴÿNe崛nĻԀöƯ߀sȞہT¿dþéiڣЀUb徼¼˿ǿ¾ׂp屟ہ8ÿܽb㼼»ӀʼȹɢЀ9شc༼ûҀԀǹƯÿ9ߨթhݻՀ÷¥潤Ӂ¿ ӝlػ»Հ̿ǸÿWڧ΀&ԑt׺€ՁȺŪ|溥Ѐ"φ~Ҽ7»ĸƽþځکр#|ϻ¹Հ˽ƭm潨πЀ&q˻0·Ƹžþޫπ%jȺ7ö̾ƭĿBūdø0³Ƹļ䰧ʀ2޵]߿À3ſ̾ĩ¾ӭӁIڭX޻Ԁƹķ΀濭ҁդSݸ˼{Ⱘ-КUݵIúŮþҰӀ/ΑY۴ÀĀԀXȹù°¿ʈ\ڱÀԀ);嵭Ӏ0¾|gױÀŀǾԁ]úëƾݱvqհǿǽԂYȹõȾгo|үÁƿůԂ%˼ijԀ.¿gͯÀĀľîԂ)滲Ҁ$bɯÁӂQŹ嵯۱^į Àƀ рԁgȺߴ٫WƀԀR˻ɾضեS޼ɿсԀSͽʿҷ¿ѡN޹ €ȾЀcʸϙRݶƀԀNùɹ̏XܳǻЀ]Źʹ¿ʆ`ڲƺЁҀAǸʺ¿߀ yjذ€ƸрՀQȹʹsuհ€ƶՀOȹʺ¿kѮiŶȸʺc̮€ƵӁQɸ˺\ɮ"ŵрӀSȸʻ۽Wį!ŴӀRȷ˻ÿٶUڿıӁ>ȷſ̼¿ր կSۼðсӁ=ƶĿѽڀ ҦQ۹¯рӀ@Ŷÿֽڀ ѠUڵ¯рӁ?õ¾޽݀ѕ\ز°ӀEϿ¾㼶ف ӊdկjλ~pԮрӁO̷Ǿs{ЮЀӀRɴnͬсҁRƲĿڿο[ɪKϿÿ㿺Հ%¾ūрӀ-͸¿ƿԀ¾րӀUɳ¾һּ҂?ð[ÿ ԥն'ι(ſÿ؁԰4ʱ)¬Ӏπʢ҂bÿŐyzz}Ԁ͵)~¦ٍponmllkjkmmnprux{}ҁƭ:õلoonmlkkjjkjjklmpqrsvx|}Ԁθ*~ÿĀ |ponnmmlklkmnpstuw{}ҀǬƿ=kòÿxpnnmmnmnm5nnoruvwy{~η=esqoononnono0pqruwy{}Ʃ؁/~ijÿrqppqpq4pqqrtuwxz|~ͳƿ6srq=pqsttuvvwxz|}=Dĸúrsrssrstuv2wwxz||~ʪ6~īósttuv4wwyz{|~ε3Uƿv唥¾Áƀ0۷Ŀ?ÿ摪̿½ĀŀȀ/ҷ 1ފȽƂ0Ϸ¿DڃĹƁ3ǸĿy¾|⿸ƹ̀q⽷¿ ÿo⺷ľ%½s ʀu꽽v޷ƀȀxÿ}ܸƁʀtȿ¾柃ٸƀy˿½غĀŀɁ:;ӹȁ<-ÿ݇θ Ȁɀlܻþ؀ɷ ȁɀiӺ¾xŶҹ˾sƀoѸ̿ÿn⽶ Ȁ9з;p໷ŀoͷrືƀ[ötߺÀŀmÿ޸€ǀl¾暈ڷǀZ¾݀䒑ֶǁɀj¾ҶǀYﴶ¾ ކеq𳷼¾ʵv𳶽¾wƵn񴷽¾pµs곸ǿÿn߿^본ƿÿހ pݺ[볹žÿvݷk볹ĽĿzܵm촹⣃ٵ>㵺+ޚմnⶻ㐛ҳ]ⶼ½€ {βcⷼſ½Ҁ ʰ>㷽Ŀ¾݀ Ʊ޸Oľ׿²^ָľ ڬڼ/׹ ÿ׶/ֹ)Ŀ؀OϪ׺|ոֺ̘>缾ݔ|zyxwutsuw3z}{܍|zyxwvuuvttsstssuwx{|}~ɀڈ|zyywuv3xy{~=첻؄|yyxxyxwx5yyz|(毺ր|yzyzyyzyz0{|}؁8ܯ~}z{7||}|}||7ѯ~{|}~8ɱȿ}~}~23迱ȼ43췲ƴ<4Ů2ւ5Ũ;穯ǡ+ᨮŘ}~~}~/"ץ Ð}|<}||{|~0ϥ{|؀lšƻLƽ(4%ɀȀƁǀ5%ρ΄2 ӄԀ3#ڀو %ހ܀ #!  (   #6 тƀƃ *ih32q ˀֿ̹yw{xuponlko ׵}ggjs}}rs"ghpú{u$~اgiv{&֑fqðĩ{(ԉi{Ի|)ԑkµ꽵á~*xԤlĽj建Ƣ+ҿpi๹ğԃyľjٸվӯs¼kԸϲӁּoиšҷwÿ֫|ͷæη֕½חȲãß}؃íšʯҽ}pàλԭÿaĠEՠþQ˹şģ֖ýGն,ĝƩזýKذ\ěƭז¼R׭ÝůחýYӫ*ŭ֝ýbЩ)éν֫ľ׸m˨'Զչž֭{Ȁ'ξݡȇƿƿ)ɺ菶ՓǿԳӼ ̀Qî}ְǿķ;xʉȿ̂jhhg+lpu|Ŷצȿ{kjk*mpu|̽tʉȿwnDopsyðxwհropqruyǻr+qӛŸppoprsvy{~n*_ˏŝlkjms{½l)aŊþj| ^Ō|h}pʕxpjoҩ}uÁÿ~im!fřxq{l`ġpkow~yqgflnـѾvqppwq́  ؀ ½ɫѴɡ "բŽ$ļ&ఔǿԿý(߫Ķ̾)߱Ž*޿齽+Ҝļ⻼੨ߞۻ½οǠžݚջýɾߩ»ښһýͤѝιŻ˾෮Ŀţɵƺݨü۸ưǺȸҪݮ¯Ƹͽɭޠ¾ǷEſߑкɵ±໳ľމٷ,Ǵűẵľ܈ڴ\ƲDZỵĽۋװűȰ༴ľڍծ*űǮž؏Ҭ)ðŬʯƿՔͫ)ӼҰǿϛɪ'̻ݭڳũ)ͱ袺ỳմԾ[ǧήŹͺܴ΄nllk+pt{̨ɭ}onorrw|̺ܵµyrrsuwzɢϬöxvvxy|ϪªƷuwxz}ѳ*|ݺɷqt{Ͷ)|۵ĺ˱y۷¿ȥ&ݾʹ˩ɀʻ!ɽ{Ŭ݀ɺ    "$&)*+˿ƺҿȼ޳λĸչ˷ɶȾŶDƼŻݾξĹ߻;Ĺܷʾ Ĺٵ*ʿŹֵ)ƺҲǻݭα'ɼɰ)ʽںĭ̾ʾͿҏyvvttu{ ǼΉyyzr|ϽɅ}}~״Ã+ڭ*ܯ})́ۀ    Ȁil32 Ո ѹǔklu~x{ӚjtĮ~}rƲվwΣӭЀïʸ׵ћǾܒúհxĺБϤҔĕſرͧϴüמôѹҞú֌éœՑ¸{ʬĦɞMuͫäɥ֑vɪ¥ɥ֓·yĩȡ՞÷}ŕеӱķթо٢ljŷԾϯ̰矹֕Ʒmmoqu|ĕϼƱlklmqy˳ytҙǬpoqu+|ˉɪooppuÔ|{¼s]¾s sɐÀ oҵyzyunlp ÷ձܶžأנѸƸڦǺ̽ʹعƽȶԥǼޱ½ñڶøڱϺ٫еų̱ŽĽ˵پĻ׸įƸйܷùتίǵ-øץϮƳù޸·٦ʭųø޹÷ڦƬóĸڦϸк͸Ƹؿͮٮٲǹտвǫ簾޼ȹúqqsuyηԱɸ³poprxȤܿʹuvx|+Ϋܲͻstw}δ׭±ɲ x׭¾Ā۷ƴѯ½ï  ˻¼ƴƷ˶̾Ӷ ˽ܽՀ˼޽д̼߽ˁνDzп±չ˻|{|~ƺ{z{|Ӷ+٭~ż  is32 ˨ȭʿǰ˘ŏDZ٩ʙﻬðɪѲ˝ɿȢНɽ²͝Ѡ˼̜ʢͽɞѻ=оεۙǟκntɒn Ƥ ѾʫƷʳӼջʹ˺߼ԼŸ׷ºϾ˸Ŀվ˾ŻҿͽѾϿƵѿ=ĠܦҿszϵūŵͶ¬ ŷѻ=ɨջ~⽾ ich8 +++++++++++++++*******++++*+**N*NNNNN*****++++***NxxTxxxUxxyxNN*$*+++*++*$*yxyxxrTNNTNTNxTxyN***++++**xxxxNN*+****N*NNNxTO**++*+*NyxxN****+++***NNTrx***++++**NxxN**++ONO*N++****NNTxO++N+$UxTN***+NOO++****NNxN**++*TxrN**++O*N+T+*+*$*NNTN++*NxT***+**1OyOU+++***NNTN*++++**xNN**+*+Oy+N+*+****NTr*++*$UxN**+*++O+UyOU+++**NNN*++++*NxN**+*++O+1O**z++OU+O+****NNx*++xTN**+*+*+O+yO++OU++++*NNN*+++*NxN*+*++OUNNz+++U+*+****Tx*+*TNN**+*+*++Oy++++TO++++*NNN*+++**xN*+*+*O+*+OU+O+++O++O++****NNT*++xN**++*++V**y+U1O1+++T++++*Nr**++*NrN**+*+++UU+yO+++++O+*+****Nx*+NTN**+*+++Oy+UU+O++OO++*+NNN*+*NT**+++OU+$+++T++*+**NTN+*NNN***+*+U+*OUU+O+U++**NTN*++*NTN+*++OzU+++U+*+**+NNN*++*ON***+*+*+UO+*zUU+O++++*+*NTN*+*NTN++O*z+UU+U*+***NTN+NNN***+*+1OOy+UUO+++*+Nr**++**NN**+++OU++NV+OUU+*+**NNT*++**TN***+*+N++*+OUOUO+++*+*Tr**++$Nr**+++U+UUO+++**N*xN*+NNN****++U++VVzVVVVVUUO++*+*NTN*++**TN**++OUO++++zU++*+**NNx+ONrNN*+*+OUO++zy+*+*NxN*+++**NU***++U+zVU+*+**NxT+*NTN**+*+UUUzVUO++**UrN*+++*$NxN**+OUOzzzUUU+**NNxN*++*OTNN+*OUUzyzUUUON++*OxT$*++**$TrN*+NUOUOUOUUOU+O*+NTxx*++++*NyT**+*+O1OO1O*1N+*+*NTxx$**++***NxONN+N+*+*+*+*+*+*+*NTxxT$+++*NTyTN*T+N+*O*+N+N*NNUxyN**+++*$*NxxUTN*N*N*N*NTTyTxT*$++++**NNxxxyTxUxTyxxxTH**+++****NNTxxxxxNN***++*+++******++++++*+***+++++++++icl8++***+++***NNTNTN**++*+**OxxxUxNxNxxN**++*NxxN*+***NNTTO*+N*UxN**+N+N++*NTN*+*+*xNN++*+O+***$NNT*++Tx***+OO+O++*NNN*++*Nx**+O*O+U+*+***NN++*rN**+*1O*U++O+++*NT*++*NT*++OO*OO+OU+*+**NN++*NN+**++OU+++U++*+*NN*+NT**+++U*O++O+***TN+NN**+++O+UU+++O++*NN*NN+*++O*+y++++U++***NN*TN*+*++*y+UO+U++++NN*+*NN*+U+y+U++U++**NT+NN*+*++yUO+++*NN*+*NN*++Uy+UO*+**NN++*N**++O+O1O+NT*++*TN*++OU+UUOU+**NT+*NN**+U+VU*+*NN*+**N**+U+OzU+*Nx*+*NN*+*OOVzO*+TN*++*xN+*OUzzUUO*+rx*++*TN*0OUUUUzUUO+*Nx*+**rUN+++O++++*+*NTx*++*NxTN*+*O**O*NTxx**++**NyTNTN*TNTxUN+*++$*NNxxxyxN**+*++****++++++ics8NTNTNN*xN*+**NT+*N*$++*N**N*+*O+**N+ON*+*O+++*NN++O+O**N*N**+OU++*NN+O1*N+N**+OU+*NN*+++UVVO*N**N*+U+N**N+UVyVU*NN+NN*N++*OT**+NTUTrT*ich4 ̿ ||||| |̿ | |  | p | | | | |̿ || ||| | || | p | | p p| | ̿| | || ]]|  | | || p }|||| || || | icl4 | |||| |̿ | | || p p|̿|| | |  | p| p ] p | | |p|| ̿ ||w̿ ics4 |  | ||||ich#H? $?-h'%"(@J@$ @TH $"CĀI!$P@ P@! DD!@A JH!BQ *  (Q$@SBT $ĀD!#j%ZJERBDU??H@P%H$  D??????ICN#@*T? @ $ H P U!(*"PD" TT%B!%*%##H  ?@?????ics#H?SE PQA???t8mk@ ,Psî|];1l䴀GgȂ8t<V{~7D8 r"Cz 6E#L8zW nx`C$pB] o(db2$D)?&  UWk]U:zO$R|(D br)8>@@@>9,t eG,V)V"B ^gu#bb2&M6S1B$vx8/s(X5Z|$)&tP.k:b$Sa:+X6c ,Vv7:\asRGBbKGD pHYs7]7]F]tIME9)#@IDATx} \Wyޫ]R[}$26aIld̜a0'd&L39$NHB0d f0l-Y{wUW[z%q~[}~{K~y غs.eKl"_ -nP+ehTz>2Aƶ P( pY4@41V${v6 ߭%xV @2;;+SSqSݠ?#% %vx!&'ֵ ς@K@籞iu)4 Koy-<F ESiFP æ}x w}߀=43×`d˵3_TJ5B#,KH '* p}Ayi HXBO@[2#L2 'E] >4y˕R*#m*b[JSp'Q,QBX4K gŎSJD2AFgQ 6*|n@A޳'3LC@B<15-SR*Z x>I6Vh6bP 1̀JxeK$e.k`LWOU~*)fc'34ʂ&mm%nϋZG2gQ+5-W. ٙj))k%xXjq3`l !S|q@5ܲ){`/)MN ! -c,y9H~ HoQUؘ{ĶumX)tlMچstl޴@&0#-$tq!mhn잶_}sf]={Ը'o"h| %>cb1/_ġÇ/Hw`o1@,BV,N*H#Mپuh(s!^`B PltIi?"ݺ,5W])&C _,1_GY:!B'nJz7tn\= Lo&m >z ApAAջvO{L[p$$¯A4 7~Ab%)²f_s_- /:6P "8,E 0ufy|U*!-*?`2 HR`yk?|ȚU_0 q} 4 ,ܸ.}`=SњmKs>s}קWISA&Cs8v(r6%_/̩"sҚ+HxϨM QBTbտprtqxp_vDFI&.$V9~ :5L>l(^)'~8&60Lk %W%dp\coG/5X|egu&kj5q.VhxɌH#$n|-neKE @~R H8d?i$·8ʾGb;Y&c㪺yy# ۔l<'#.g 1^Ξ8#N̋7"lAr^`%c Y&e8*( D6EZ|UKo6)ed_N8E)&Z\+ImD  l)IfBСQrzC+WKb^D_HbFSP̡)y !IT6jޭ<0 8 .. ||'6ǰ26T fj 4Ħ.0thiپi 1$cmeX@H@qMkh ^,09əKxv¬T5b+fꚁ4]+D #֎ "8mb{2 }9Zn/!ZuCά,cm9qeY]_dJ)Zi60 ?DMs5L<jbhkt1 #\;O Y P"qsFIDR,2}}ԜTk5 k>zLv\|424=BWe /\Mgߜ A_mW|Ti H6ȡ%վoX:Z!U ---R #T͒3jdpoLv\3cR3[#OxBm5י' !QeLLMJ]h3;Zntyɂb\$̅ a#s 'FցWfV#m-`\6'ss216.=u! @Y8-,,Ck6ꣂ)RȦ {srT,kH@]J_o%}ZX]s 1*pFH0GhS吮+$fxT*czJqL@[16̴Q0*b^% 24^eL$)8S@`u}l#@}5F]]&,yRDo ^X(`Nt p.=ILE0jggX B鯏 zz qXPI*2us z(^v>6 ^t!0 5}˖CKB8+ /WHILu>!}}}4Ƀ8zҗDV π"SJS+V\ 3P2G)L >5Q3ym7V'nʆ.ﲗ%qF eW?~~k'M+GyJN&v,YCf5j";˶bG 953{{{x?!Ha*}[~Ş.;1 LF 2{f}--X!l;^oxkqWw|o?^kP~ϻDkj4?ݺ*-h=vݟx B;mD'[lP711<@6וJTb Tc&4e}{7o^~uE}L6ߝ֭m\S Sc׏M>[/eG (ǂ~EVH,Q[>:s^gOQo*Dگ<շ U el($H8N0Lr(LXd5L4mt$:/Xm?\f-E ^LP&l640wv位:a2}>wɿ~ݺ?6}ܹy4OPπpB,A ~ .}i-vR<ǖc178&W]/:*خ==!E$ېDF?| xt~7oDuV<<'OK~V [-qwӧc9)غcv0ªO?}t u( bG2Y2e03ۺ}3B99z䤄P&S4 Yh1ٔ2rAN[ U#I :p ejʡhkfuܾ~zONjo# >~' s?0epܘc B0>]'XpX,VLP"[H1#s7o$m4[2a{Ν/uo~㳮|ДiCp]ΨyqUUxuPx 'yH|ww7% |똙8'OD ʣ)IV}ڤhe@\6`BC!ɜɩI$sԺJw,ucB#[NtUYiyH}whxv|luwupELF!FTQ2?_ >8Ύ'9p<í j\.c=x@j~N 6`*$3#ImxtJb|qh@$Hymvlog'vƐ=V kVR-π( ߑF >gڼG̐|h\ @_=s`B³6HgHgs4zl4XbJqƾr5lE[%C} †mÒ9y{wv  E3p."(Ϛ9O\^5{ >l!m1%uq%#xXɁ$<>7k_<]Grݍ/~'+K< ވs 5x>8_w}"#̄[|m}>91f ?`DU] )#𣃎`.cܟep.o}#E]XLA4YyvaQL&oyF+TAYf`TM9fJKgE?i@LIHan0^A>^Rs>T_ђ >͢§;\/i]l_h%HT3Y*9)HPq$.Gd<?%l ө ]zVgI^1H0QZd#IOߊ|oo{-?2`%mټY~㇘EXLl&ҁ>7H#0LP-`?>O >(5v>;#|Ju mMFFBLz5ߟOkTuG$cc 5?g[=QlIF֭WWe]qm¹+Vҳ>xRqqڒfFBSs.78zgnom7/gs56:Qn"PcJ<5 iۯKyq{oݦa6|uzK/;e=v6sZȎQ"{O14j`Påow)-iFܢQI/C܋G<SSJk}4d =!\zχKru$g\RPjFmyNM[gSC cL8i5.rq/vLtV0(DKBӿW%Tk_SJ 5bշ0bKO;wCO~>7/Pfu @ s <C~d r'xin2g@%73BսbwSv`w/pu}Qd?^7 x>L-ۂgĪ):CdedI I 0`fk=vmh3MҾH=ORc @tٓs_{ȅB[™7yB۶g>{7Sϕ؁o6<'4zMĩ ==+7"ws܀NFA*`Tf'o1!kNռV |Kz͵lo&0c&焀5G<\Q/I`Ά#:ڗZd‘M"ABm۴ל@sQy 9Dѽή~C/PXpPg׮]\λsu;l[2BHc'+ozE6/Z4-bHܱLgAJڛKmnYD"d̵x͗$ Ь̕c)ܫڍ]p<ìM5bH| ?t>qy^%6nƈ_+:cmQ 9$6DuL351Z{FgBLv1cr` r+vuw ϗe߁}r׼0KyRb] }]lϰ?CXc3N*K4FJL~4yN]k*SǏK>̭;n={ʧ엗2j=k''P;]oS(ޫQV{=]-LL -jiɐ ai}\+$> o-ފmoU[>u¾[}j,Zv=B9_p a&I~4N|Б^*k_ Y0#Aa2آp#{bW믚[ ULdJjINiJN$#8S"яdrQoO@xA &(ky=fʕ+e5BG|/`*Tq%B^MQgD8x\(bt|T9ZpUBIz{'[-ZVf9f )M1AW=5K?~2SNxdR\X5Siҿj `V%@ At˔," -vʼnR}a-#kkk6X ;d=)\=4,CkSqfԬ9oQE|3RiL9Kyn`wK^t)!~J=CXV)mAd22sd| !4-::dIx76^…(%TIZ쯲|R$''gLh[;yoXd}4+vG5+`/0 j>_9KzNukXNn\w;ZNh}vN\Vx}$ :@!RVg̽%2@\Ճdc_WN UP|/j-oHucRQZZ;4LR[M`%> zwj]|_׽GyM@jayvg6/~p/3]."QES>y^m&zNVrH}U#ZBFFlu2Dk \dF!|[VV7݀QOOO4mڴɄl鿹sok'Q_yP#{z瞌9V~ԑKg8ws-t-p.N;'(5*FYYW_/)o[zD kHV䐌` TنQK2W'\3* 70ioLJ9|';w< x1.D)qvvI͉Iiq~4gU|r@OC`3f6f(, zN"# -)[SY.i|!ԻI'-gUAadQ2؆)[S͕fDYH J60D4:HRx?شyӑ뮻~f͚5:z6lօ[gN}G_:}Z1!|]%Q.}= 2]gfI|)NeX##4M$K'yd&C;x &wHI9,he$fA/> M _ȋaV,qt%YM׆s׮4;\M@Ir=8iy' f|'>$uJHT"pw1?ü0CŖEwV*!L0~}λ}^ lU3VR]3&}4Ef::3O\RYuS0KH*D*9zh1F+˾F+d%棄ڥZU k!b^ʙ{>!ܑ6JMͶ!gmiIDUL ?m2qן_Mrː8="osQA~_Tɠ6ritURU+V;RA.Ң9 L[Okr%d B૚P%1/I4CAW7E >$zT݌)-|+^1PA̙ OUVTf GI|MwKR`NHe"ľhG4[֭ FF%dsl2'^|OF 2ǍiٸiQW ).J~D7 xϻEd* Me?򡑑5g9x&t$U0/jN7I9K6!}&  PvQd2AJ%\T5$5'/ 30!\?=rDUקkg7 Y½3z˽6|̗?ym7w\y宊 jǎ+J~ Zp1>Sm @NJm^bi:X(\_rc@5PT~9>VuGODq k<~ |لn&g@H*7שF VI;}dtu7~mhh8ܺu[W^7߼`aOoȶ[+,ɓ'EYכj4)q-6 ({ORJfZP/h+P] beKtM!PPVug@~ĚzB?a*s3x,ppu$> 'O?{厫pH OǀMV_khwoR"hFR{D2@ 44d]h쀷u;v֓[!ݿ\cj3,U@:s6yX3Us9Uї}[l_F_?i^N:ywf%ʶDK6e=lJ,KUN#1pˆE?"Hiq@V88XDRdYb=(Iޝ=spgv4P慎v;w9sր w!e@XkUi\ 2xI oOy$;&D )]žBe`R8Y".AMzΡ']5H/ZCehHFw\(6qC`ٵsڱTʎKWLI1qX4@GP0Tt)Ћ L`4޷}Cn^#6]!h2Nݚ5<ObMLDm[7+oZG5n#&C{%6ϳ;+e1,Z4VTERȤ&v-hz; i[dC5  5SO=F,I1! eI| 9-=I; co}U_Xo64](p+qo&qӈEeDiU6pR@+S'ʨkH6DP y[ɼ:3_xR0= ^ljkv>S%ahhG+*xvWN=y7]P1=ܵ`+X6|0<ўR7p2H_f ۘ̓2B&oi,0狺nlbkc$wGPoޖ-[p!a aEcZ*8c\os@żK=oޣ)QZ1YQ6AZ:b 1ʬ H/b%@c"a!gG]܁eyz1I.!d[QNH \[킦8iCviBl-em۬0ͯKͭ7ލ |vgN卣dSXG(yᩊ,m9\`sp(ڔ9O(SA*9H{Ehw&~L3úLb 50(SI  \ %eHzKmU![7b[]H̰  kU9۸OcC#cY bN@MڗT/PE۲p/[0UĢ/+*DwP;X ZA֩P%4 &, iO| *$B9̈́0%wX4b&fPiHL@ssfP)j5 x{l$ 5BJ/mZl1 9״!VꪒΔA>-V(M2Kw9 }M( |NZ?&R6jۤ 8,Qd?ot2.Ԣ@E4#H XX5W:HL8O,ޔpSr Z6@yFd)o4Q 9SLx怉&2&̈́ C>[zA8()XtKZ (J˦z ?QR1w[AVAXW-BMҘ䥃uDhICIM54msGd FmkhڞVB;7@~jP04T_A0G[VP@IϯGٱz](䦲 r"@ \su&!}RΗJQ?>3AR f{&Ο?7߶6-(-;/#J˾a"QOappf?z实7?Ex_@)ӱkPm;w[-@y+.st5AUAu?6_~_9w qBofT]&7eŗvgˏ4a1iUxta 4j2 :xP&{%s-+#H ]y/ܭ{v#`sA Ja ~li7NE37 "z *gsjb"e?ŶW W0Z۷M;W7nX(b57G5.F=ƶ-+$x8\zr*9j NqGo3 Ng"43Z΍޲cMۯ. ՄT4PT} euohC6[33):=cC~}lqi4J!pqf%dXPo?y-:ږ-^z]csCC6"\S6:V\3:t<['< Omfs )J|:ne67щ 5B55ᨉ%R3b\t\p71:>>𜯵~W fSukfeh PX.Ve(!L1r˖}<._B(]_,˫/>bEIENDB`./qwbfsmanager-1.2.1-src/qwbfs/resources/128/wbfs-to-iso.png0000644000175000017520000003665111475025031023054 0ustar pasnoxpasnoxPNG  IHDR>asRGB pHYsnnޱtIME  :_bKGD=)IDATx} eGu޹u{^t웄4I@b166;  K l@ 4ڑF#~˽*G,-3UwթSo`lQ6F(elQ6F(elkP_'bŶm+ 0w%RiƲ"q\@٬{$>5z;7_-Fqs\X.EJ̆%P'?7ha~ pKuFtdrդ p]Qq,BT`:[WZvtX X`@@rż 9|pjlCR>K[` b[ ?%^yso]XMu J%D9vu8wcW*ė2=3C0=9 q ðt7bk-L{08Vi܉ _(|>t̚_( X#w^Լu͉vR'>UIn*ձ4qO駡=W/B@x}O uzg?5P҇>Y ^看^|{zk]mRuj.)U5m&} 803teÁ rtWxyf=uփcgc ikrjA2@uR(~lm[VpR "#fcC 7$B3`65E;_?#ON}o?Jm(oxۻtm v̖7 G>}bZi- zۯק^߭u߳s+{/(*M\gw?Às~c#{&`Xr Lwa&r uߣ?;:?uԌ3 6\R[ %Go:r\wxG&˞[}@[t/ASmQHL1S%@OOMfGOM/8qדOh] o߾m[U׶c5Bw6_6[՞xndxp뾳'Y('$̃@$=6a}?g(KH+']sW^w_ZGD@mZ <_7ĐV ߏD&mOIBq,,Z44&5e4Ł[3:5V",˾WֽK9xڭdf*P ;XF朕Ìǁ3ǿ];:-HLW c88(?/C~ /i€ `*PIbC7DTVw\e6;?)F mC!j f%;w/،s! `8w]o~{im$h[fr_5Lm`pDajL2 -(h8ilK_mז7R:J%_<@ ?[n8& JϚWH,#b_HO ; N~ڶ%30^702 ^>؎/G-Gn|u2$bٮiVn *l>PmJ^yC5oV3N8slj#J݇7 (Fض-\ɩ'& 7yI$Lm f%_YWh y7?q :Z ڑPGnKƚ3o_ |L`Gw G^䐱32vh}`2$jF 0PZołoDC]& 'N>TjrF٪ս%ɦSo}allP,J3C~۱34_\XغʽnJJb̋VߴE&ym0~oL@ΐ̘6ob+Fٕ0s_}mҀT I;&o |Y[16wkzwfytMg@7*Jj 5Aj)y"mst jE?B&T @1A_~-7~Ykfq ;zoN?ke<2t,94m3+k_˜z6w[6Q !hfؒ6zZ:zS؞>wn7>o8t2o:3 }0%Kr5P1vQvoulrd 2B{sd{yrX`Y3gzެ( D3Jچcup#fJn}tCJѴ P ^:_ tbEvaSGh'(gR2~o{ջc4@DHaۦ !8ؚ }F#HesY7K~ł`st k\,CQ-&NUWw_cR?W{[Eܪc2ԡ0e 9Hgn?W"V۪`?=XOS*߀3{Sg8it\ o#,%,[Z9HB;妁6HİvWZdPKóbUSþ}G 0&&uA2qdgG/,tǭ{vX9|ʀk9)Sʵ Ƕ5T9Q |l5Ϙu'2^Rm!N@D8chjJ ض뮿9G`yk{SAC-!URe Ä蹫mΙ&1W]mV[SϹB[jrI\45hLU(Pmٚ7i׮}wܵsS ^!-D&(aM , ,YID%t;rm88,Q)`ˎU .0u+^![.BEeBiW_47ſzŋ?'F{TNٖk̆'LVvm%Fb ?ut8L1 L>4BYx04NZ DX5d{M]r1֪hw;wlݞ96 P6о I7M!Db"bQEk=P咀O_}hlSE@\%roE QS[o:8_] ثH?oNG{+ @Ղ@j5rC` XT03CtL| E16[$Q>>[ǞMMYW<:X>4Dk$O~JB7oyǫzd8prm+nhm`imBp&5A HCp! t+HBAWb(T*Ga.'<|Hev|0 K[o߭6"pV[%/BdaBI(']_my7BA[gAS@R[I&~܇|hO39HdK,׍BKf|;`^B7mD3cz[__ҨxJ#//嶏`nD7\Y Ӹ:j%Y {L6:PqpV҄Mбm) 8V^Bx3d6LM%Z*_:?~`@-ƨ B"h4s6$cr4\YnFڊ>%ڠ3Q?@K.N ޾|ϗ˗oi&'tm $Ki #axf>G Ues bABe H'S۾sv9,v s7gd$Jf!P>Pt cfmDm4&H&xtJ̈́f`X w,(to{ 6D =_}ҝ%0,Y/<(@=WhFfyaR(9E@PJGsg![D)m{L^EPrPć$Qo@w$1B vtPr+bu^|^|-*n; > }y+KROصs0.Cj jusHg` suo~덇G7Z)WՇ;R^U iJղ H9\b mQ+Pæ),J}DhP-Bʂx`Ө#,C<,B]KƗ kna L:ށhlWv>jkԏn#| Y|"פDlv"`KS*Ի(r[id'M- ,DD!m۹02dհZZO*U9 ^ Xuޤ5ڠ\;$TXQ*l*@V ͜5%vo`G:G\>EIp8?Y\\KgmfzW_ ɌCGdDCy6͵k8p꜀Ft}p;u[DOwϵ>_Pb{f0AKtxoYFX!dm cL. #(-37A| ph744ٶWDM&bcp1͜*u~~RfaR6CqdC253xNjɓ.bְk,CSc,vޟ}D9Dz8VMUi7pZ!D\Ð-Sv,72Զp Φa|2 R҉ZiL[NGą  nTm2HL83?70XrgX07 tG;t>,ax8/|"R A0\``Yؾ}2iޞ(~: - fNf=dP`DgZsJ,87-[Ky%vOt]6DWb8AvlƺccXB;*Lf%Ţ1+v% Z> u Edj]Mŭo/3@{WLgNSfZ+G3 ەL@~1/;d6t0+ޮDצʖ*^)mU}ԩSm޼y%\YDd ܨm[-17F| GB p$C/s]@gQDWW_aT$pW'g!aۂ2D0bSK@$f1TTeE@z܉^ 'GN̞>Lq9r~͵W͖nnn7Vrnn>{{|b"a`o5XX _&arʂy5o57ǻClvs̍Yv8sd6s-TКπn(f 5IO`X=|/@Mr jQR>yoMS,j;,1 aAsa(xucsssZ<^+9<.s1 fX) \.E^j`V "&*#HeY&X䑻Pn-=?,̮lӉ9ճw M5o_cs|< %4 4$6ssj,1'@#\RhzhNƗys A4RĖV#̦,rþmPtf\44Y5a`'>ɾb@9W0 N p!HȰW 9khGf]'QX̑#Z|lE@$5LI H갾2S_@*LJVQ+)!~5BKs ۱u[GM%thGRrágUH?7󲹅,f< < fMD3-k,@?Ɔ;;z`pT:Qva=~l 1Z||)Cm 46'ˡ&3ypja_SG( '&jq6gm$AdJccXG|s= l-ڕm% apE7U "އUQb1s~d[bEmi z.fB.PT*E?~P ?uG"ՏG'C-Z!%G1$v>q?(,"YN=LdT je'z6)Ma^!dO5S0(,B* \Yxp=ХLGF7uutbU}>󫮏pD \@պo(ҡ` k y| o,Y 8dbKR #%8~s}‹/ .ax?1pnm¿H|\JH)2G sʀo(RpsF.z[,x !\:H>>G4.rDM'I9p !AƓؖ$= 'wITI=A$ ̶,?|A<(8J^*00 X4W\̖B#kpG@l|ϝhJd[Wi16Cn,`'"c4Eymar9M2J qE Q!\Շ ..-GT(kƴQWJ}(wnf&s(yTo;HH5q'_g975̍lm!a0Z⩶l*oW@Tz>؀4@#iiO6)a3ngl.k"RU&॓i&-a\Ry9ٷ;p;8Sߤ8gDCWf#c[GuBE[X\C3y*SY\X9),*T(5@1ǨY0  |(׍R2\ ఝNuH8\X_uHɇݺ x /`nYđ{v4m֖HGOƆi0PT(\c1wh<,"01+4raZ c.`RWgǦwjٙa-}W|\Xq8IMppS=; V X^x؆Bn

35ҁ3A:A4H34+hA3ઝC(ThC`9+*@{a:Oh \-B%&Ŋ[MZ|>7Um' n6%0a[2oa۳o;HSFß>)NNN`Ym}vIxb`/|܂[ls$A i*`",`'XW fnE };#2J@b4 JI70ڀA埵 .̜^&VZRs4ycn [y(=Q-_^@й+li"C8n?^~Go־)X̵ﴃk5<ؖmƟm5[7 Q|x{{ӎxd9a"ItHFGڌ .| '| RQbv2+gr6ƗCM>%a>J?P8as{&][:^0$@Op`>@hLY"%=/wHLfW,+v@af+̀%8 k%? vAi&b[;iTOjίX`)@Fi\\̵ =I-d7QN*D}j# u@_cYC 3#T*nڜec]F8RAĮB]k`(116}S9^: %WٽH"~^&6;yƎ[s:uh`6@յܷ k||_ɰ8e|x詄_RV`mq4D51w|Nl*x_kбrV^P\hF/^G&I0߬ن3MLNYk߀ũ\} hc6>&i_:1xmI#a- #;QIjkȜ FuNwspfim< ;_>u.F9(sy"D׏B4 6 ]IEJ/XCĉ,H691JbѣeLeM4m+g+Abo'$[l2Tm5RԡK$ t+S>^FNlpApN˷S8Ud~o+# a#Ul>G @T[X%#`>#W64Ȏ:ݯ2o]3т m l \RJ~8)RI~TR IY d#!Ђ4Z64Hivf_Vw]2H=t<ͼ;=wqDBaq` Sk9a/ ( D")SDN'|tZNS|! dKL&ogȹ>c[I=G3f!7={CCbQ,N~eptH|%7H DLpb$7+=g!5*8P%Kz^؅(U`m!(1_2?lO> 5T'zu0"VZU`ÏB~::HNɼKGZ#Hp`IJ(%.Z@ X)rb`ua2stOpGҪsA'}~ QuoL 6xsAaSC_!ݥɗ.q,$V[[l#&w$:z\ɰu{ Amu5*f$ *WyIc|zpd0eM2 `qpN%,@ N%A}eH< 9j&N'J$RE#լ h3NrT  EmpਛctO燜_4C xXD0imln5Jd(zw7! ErC'&D9*@$aS[LYѩ|rQ@OY/R$SgUؗ3ҋ=E>3D5P`?$-K(ށӛaaY \"!K~ɾot$a:|B'J/|=q%3mB)~+%a#m!Qc^e~qnݫ{$<9{4^szYSTb)Z!:a'-p/``6dO%)ޓdcJK dIl6o>|ʕgoH.: d#oo~̞MUDyOM5 jP.w˵A}>ZP{AsrF8U~WQ(u  [ro +!y8N鶓Pod܄:~_*ڒW qr3^#&,+ujiڿ} XW-T+\@s78I_o&;<rgZgfVAe+jAB XPD6zބ$$61 (\ ۥPB북l[:F~ J%{ ?ϰD[%v=0q, gJPƿH<%o=ꢇ t1Ol XD Mס 1w<'B_|v\ `toڲbf&=3 OD %LAW K_%(/+ȄY"MׇSAK"ສkb@ A6$O76*7 }537c>B[,+U"<"_ʨB C\5("7pNk:#(O;hD:BgZ"J$(CPk#c;G&SޞY5wS`s4GZyUk՛۞yI5s$S_+fVZK"=Cy%u~ KiWGASQ[l>*xqO*ǎv޼d_}e{Ha^B`|p`~8RAFb(m tU@F'zR`Lz}ǧmh$TTO{xC.=# 6,$]<ԅZ SI&_ ⍊/Z x{p2(K;ԥ b| ZAA0`Ӣ 5BEx.X*K㐔ctΘfA[W|Ύ *@k%`@Lk|G(/=7C9M+hÄ> A !"?_²*<thDf&[ٷ{)hRIߕ"ȡz66e*'Ao@=gs_6h1$BQ!ݾessGߥԢKTWːpM[;ȇ 2[?zNyUòuTAYYdnďv"0_~7z}!=M-w !X:~mm몙;oM DRk|3s3,4 ٞ dA -YILu_}R4qOOȯzfK ?dNZF((YEZ kopMo3YaԿ?_IX)ySI O,_Y?.bvt}n8|nݪ7W|sY|"H!Ո,?-W05I".[!?' sJTnh5ohC}]GϽzrGt)w?\~_В(A#js\o~޻.I\pOAE4>0" ("WZ[a_Dre^}i3/v!ݬ]0CLC$Ju=o}/~KV%*2bRz%/vBkAdn7OR1HSM?[R9 ul1X(NSÏ߾ @  ^ ի?YsחRszt~u.x7sodͭfbz~ <;D{$kn|mñ=ݪ?q1r9UBpTXH R ĬY5 ~w=nq|8?rϓ|Ej:@w>(aPQ9ˡ2IKW(ImedM߉br횀޲wW.K?Ugm3Ib!!Jɐ*Jo]{oŽenvV5%PP{IW|]W{;061z۠(8IU54x)d2"/Ļ:si[}ٗ}.}w6>>aEb >(3I$*G(QH"҈r%d9Xym+otyU:"}/#h!h1$ :gHx,^EukkY>gv}YUuu:L%#6YP_.:/^ut^rCcM2[qҤL~;E0;+LL/ \m;zGtM]vϬ)`"U{hQ!!w:!Yx#\$Xc\h~}!,kXuVC[B' ŠjZ[njuBʦ)gsiPЭBހ~N "LuŠ[$ ~vʳy 3 7I.2l0Ə#ce .>0 )y|/-P^IENDB`./qwbfsmanager-1.2.1-src/qwbfs/resources/donation.png0000644000175000017520000000346111407425103022174 0ustar pasnoxpasnoxPNG  IHDR\:;) pHYs 􊲉IDATh_L[?b'iI.h%pc-h6ZUK({4EiâihyK˪XZiTid:5-rh,P7ۜ=BH+s~9 M&CcVjN`Z BLtϠŠ/ 6A>(~uG:K*&oM[?^bz܉pփkۺEpN3]?N`7Nro)zC!:R[Hρ|"3\8mBdB4׹AjoSs38R!o;vbHM@ kԼ\6/"ׄr"Wx<(I00)@Zx5h( jTCU;:!c E8mTeIݘ -.^ w|=G~BS\w$B a<~\>iec 6g]N@7a=H3#6!/)X *!U TtƋk\ϮShU.<鍏8"~uƫǶti>ZFM|`OT|?qtNC?S=r!'s$lh~u'(i=q6SA40t#i9V 3^\Nh>J@_ F+b>0ޛ3T<i:=@ßDhkQS~>X$KײA޷!nlruKL qm2a?X s,j;psh0Cv f#quw5@:?''],X "x9!@{hfQ/Axvِ _f&@u! 6@ 9">;BN57Ed5ı',Տ5oA3|Cs* (DL?;E?P/i%(J#w )Qs>jq<#6*6| queQ| @ToO;fC-LR CPf-^R1IyZ7ʀ4}HŤ (s>9_萼cFZ*,DG6/mKO֏= fc>{d/Q<˂Ll{!g @t>Ncqj ݏ d̰ x5yOnjw{iӴmwEXssЂ)\B䆳7_Q!(M32HE5JM'a~+.Qm>C!@˼g8L7˼-2էŬ7tDN0eJ>wo~sm[o[lw!6l(~K@m"/p_)W{}u/cS>gه@j>/܅e[IENDB`./qwbfsmanager-1.2.1-src/qwbfs/resources/resources.qrc0000644000175000017520000000234511544172355022406 0ustar pasnoxpasnox ../../GPL-2 wiitdb.png wii-cover.png wii-disc.png 128/iso-to-wbfs.png 128/wbfs-to-iso.png donation.png qwbfsmanager.png splashscreen.png 256/tools.png 256/covers.png 256/read-partition.png 256/folder.png 256/about.png 256/add.png 256/clear.png 256/detailed.png 256/error.png 256/export.png 256/format.png 256/import.png 256/properties.png 256/quit.png 256/reload.png 256/remove.png 256/rename.png 256/success.png 256/tree.png 256/linux.png 256/mac.png 256/windows.png 256/wii.png 256/hdd.png ./qwbfsmanager-1.2.1-src/qwbfs/resources/qwbfsmanager.ico0000644000175000017520000052514411543720745023046 0ustar pasnoxpasnox =00hn> D(GgH00M h O 00 %o  T hPNG  IHDR\rf=oIDATx] v: tNܬ7sO:AXf@JM__d$( v:pۣp?>moˁmp rH5q ؓkW!<ft= x ^,a%<w,8]73p}qzTQf~=g F`>brymgnè a]}ڠ8܃XQӿ/1J"(f!Y[A c߆0O68\AS/mojOE7d_l͜[c ~!|6FO=귷Rn #ZMu2^\?LƏ!$~ մ^1ÄH&키31s>f5lvSeWuc|׷sGRhr[2I{\GBEZ+B9"`Poى)IWd8`2k&rO>KBy}[:I/Ѹ"{~ZяH5h{g ],4rZ(Dm ۞=. KetfTMkGthOw^kvǕZO m)hw" jۧiE[d~7s~ww "?Ҍ_^\{h&5LDerk$>FY/8)uX^#}#>tzu*,*}1b9R T*dq;*"XUK6W_uFaq.rf# Y Yw܋1!FZt^1Q2kpC߷~#[)=+&`&3 *;-A*).9fS?x6dfZ_t=׿2 oU9[0G="$y02vN$^ #> E ]zW{`JQDLxժO"^ Ef_CՍ~?3^QFS#E5->{}Z շ6|Mr:H׵5~M`}@ o Щ@/H!:ȬY>xơU?l~}H=#/teVEeQB뉅6/- `zz62}B蚨Ѿ !s<@^xFU5?ENo/z"(W_aFabVkYkŃJ!YH`Tce 5A^ ^Gdz/Ge1LVhRz_&ˢ1jDA> kFUZ MYϼ}I#u5`hح(`r4^qmoLZtU.̇U!=BhFGӨQ?`iSGC3\NM^jĬTl9[ )4pHG2x0{ @Z.,dvYL͕HD=$Alӿg҇`U+e/?d (vt_2K~\5-Z=EkBFg1gF.`d2AZ+3~u@VQMi|} {`eD AI#e迓@:fgQ 2}ѳ- ryڏFR9oT AOW9X؊r`x!`j~r\ HO²PvXb1 hciݗA^v,z>y}YB`s _ıޞ Ok>Q1-Y<6ƊIFSl r±ST zW,X.f~>U0W' jfw>+ ~N-erٖmf [+oˬOVwa4TLn}cൗ/Qzxs4fZ[lS1  g nm6_-ϿBrFf +3)A}f7!{BH1 D+D "ƚ}T:Zx!0:z( 2՘]`FtTOYPJIX.@ְ2+|mYd ,#Q(w=,NX"&_E BL34T,-4,]  >(d@ i?OLY~ֱk'5_I_ 7+&Y,Fx4j}Ϸ @vl2 B}^-^- x dmGh8+ F Ed.>޾ vmªS:?ʊAAEV;@ hJD*@e/yLH@離[c#?܅Ej}JWzzKW-;X-Y^4`&D>ww55]g$hà~ ~MNHp%cqB 3-ՋT3Mw hI d,"Ai + ,^LN} \M}FOy?}2<#Azx5N5zň%mʢwmGLZ00-[6b$݇>"kʖDn Z;u-&UY{%:- `GY`~0~ϰ5<,없\:%~,zl:%Eߛ)eX!`eΧӢ @4gj[ײLh|kCX!@ '̡shjA^X_Y" o<4{saƵ"Dj`ЬGVI?ܡ lBaxˊ%R`=lt҃YJ<`TX#:zVAk R:Ѹ:}%2arɳBsdGg–164'VbɆmJX3_vTýl@mjȵm<6m5`g{)=X3hJ,2bst}RW66V16nFcVw{_}L +_ LK@-Y$Ͳ,J/jAb+!*ZQqgxE$_?a!{5]*UX<e c2u}X1XLt. n.JDQ -P^ dQRod\~vt$.b3a%jj 284`i*-h^[Y8x{z/]'Q6_%jf]utm@Wm,@Ӏ" [i3ɺY#q}{ϏPZ]z5r_h{7 ,?u@!k,P>뛖EE<6J sSkv 6r*nU#hYq%KIb@ s( a8ܫH`f#li D3iHً' MGέ2>Q UiǤ0zV@,kim'֖dתMf@VFQg@TQ7#RZ~( "GV2~a@c.^*:NLj`}7mFt*d!0"!7#pat5*A0C3g&@<MG`6,=#sUDy^ =V;0@?" O V-$&MH82t4 uˁWg>+29Ir j.3dQYl.zp%Ɋ{tE=x_/9:o̠`K9?+cOd}q! * *SMJuԧEIQs g[i Z}be,Y 45젵&Wd䥳"U 9!A?@*f %[2iS[ܟ'H0ĐJP)UlaIDgl0jX3-3kuf+e4dqghoI?5<n%V;bg %)UՀǢ ֽ!2:=(#\dɀF7Y ۇ~ie sW\TVH xC!n) @x ߞehp}N"Bޖi/DtZ⑮HӶ}=P1, $3hpߋX ڽuo XL4wȮ ?k+{o Eo%*e,?Ws}l{xx@&ԮTz *ӿt:fzA݃nZ>oDbJ.c$TX.Ddm0*̙UCe`]! {5Ti lpt#V> |}n)QHi"H:FXIe ãV#]$Q_נh3XՋ}A4fh3zV IɁk,~9xdYYٮ2~1H 7zum|+" hHgY EqG[Xdd00TLOX[ـw%.$W pVzoKX 3z}8}YAt%S lfL [GψȾ1 X y7Mu!(G@e1/fY@hNdܐB'w=)"eV6E پ' 42ag@Z`*3D00yL+T7vsj0*~LD-88/boX1-ϚL@ONT,_XS,`ݹs';V9/B$,@vAOT ati<`$ 83ϪU}u zf|ߢзVY,&FBm"2VߍYHd 0bP[f{@Uw|HЋ_D}ͮ[ދ'RS,鏂z'Yyč? )} "yf^wB#*Z }wil7{𶭛ˀ2C}0~fJH*@eGKW{YU#lֻ.zFԗ53[g{Yr c$Y cǚ 2P 6,9ӺjB}+AWQ(<~~J% g4T tb%l%#/B4Q㨶g? 3 Cq˝RdKE,tJ=;{l@Zѷò.`meJ;o+ eh/h^b{K @2& @Զ(o"m~3wÌ{f3ȊW4gF/7"6&qYNWE`1pyOGt>zlVe}3.hHPnz^tvL Tpm x6/coˀ^()+ Cڇbtڨ?_}Z2PP}}bhl@6XHgjr` O+A@M|VS\ 3o\VŔv[XXr[j)xv"#~EV.W.,A""fB[Agb72TQt"QY4+iQʂ`#Yd}ZUY1՟h14]0Ρ}co?d+}e{$Ε F @َ/3" E@h[挸ѹ*S=mfJUZ|7c}9Ze<&/d(0>è(mkggdPa4=_}C0Pg}%h |Uq%d jŒ>z` *tTߙ`\tǭSѪ~ {Q70U}kMa`q^_h(Zb {=1?kf;wmmXxۑi`@{"x_.>g, A7(g,HAk>)(i̪"] XUG22QʀDFcځ  Rae3&ySGeȠb8 .L@ !>ף53T?Bu[ H79kc`PG;~FJ<ˬfo.o wG4AcF 56~VXn=GK33A+Ji60*,B@TI Lܻ'rnh[y\qŇq}̣=(%*)լ*-ĜDi33BKYT2p-1T¬`5~_Ix؆r~%md@Juҙ gE+$p +RLeQ'<9` 7b cX/&#>)173yl pQA2# (}HIJ/shm4ެ.Ձ< $AF(NvdH&jU yM _>E$jw5 u3PZHzQ6ɪ#L4 iY>`H*a6ƧfdXf-慴TfPY DZԓY{@SDMu֧ho adٻU=?OՍL<LM₍^@4@jɇTW,&ѱr6bQ#/_+Yͣڿ;|* yF:%V@ٯj&7}}H u3DtW =:LwѪ(a{U?,pOc7 6D/}/M޽2MFep/t7U,aڍop%dgF6ZWoe b\#Z(E 0*WY~ 4 -.|)8dPgla Y#ZԏLk;uQ;#+jŬZ3ume7F0+cs3k4ddefV[WMHX׹1-t 컞Œ{I: Hk*vP2 Bkc4i 3}f_gEԑleHlig7y"W]%X+Ѿ|Ѿd",}[(.B3eus2;݀f͠_df l@&l :P4YͲb003xʲrZt[{{q+!ڇ iw`fN/+G~x4A PH㪫[`!1e1w&] X3-&W}4/XmEڿ!7a4d>1#e\i k>M]o"9 E3룟c/0f[B!A0Ex@w?tпKcV0Q^Ǎ,͏6 ,bPZ}0o_ nXZ Oo_7 ng}=}_w|N& (Xh>wי = kJ0+#RQEY.l\-^_1rbYAu}p(1SX,Y֢2 ` PfK'JGT Z;H3NK= "8@^%w_#*m Q}P%1@ & + ݓZ3%;)KPE@ CȿEe^YlƑV`՟McSz&TI*Ձ Q-d~>:>-4b]qywv_@`Tv)~Wf>o@cP#5TuU7C1' hr[{|}ݖ;2sKWo[W:qƊ},h^N& |gpt_/:_GI4hYy)8#}3)& !e6oV/`P^6$+ZB@[0O^je)=]ޏ p>)&T;q4`'[=g^ƎvnQ٩?h@hF 7#92ellf,x~]s㷮Y /P[ bX*ڿa@Lo=NN@Tʂ+^Ff4W^lлӜK iڦWZ0$f85 l߰Y*mk8T}munv/ܙXr #`ϚeR@U7 . "hh+MTk*R23A|+פ}!2nEԿgŁPDjֺGU7 [ǡu{7c"GH+"?"("z>>֔`ĩ+:VEUy__{b ~L0ESu'3BkVED#)h֠]!{b]\ӯwވ PYE߿&J7L k^糬jV]Y  0 p8L i_>z䖵%,)t=wt$)eU!DnzP /dVD [/ku]ދzN_K 0M4\e"GľGUG,Eo/xd f8 ՁEn3 \6|UQBFJuި1U4d\W[4hfDObHXtY7|2|7v<h%a4ߡݓ_i@[k D{VTE;4 H n!HxG`M9R_OhxJ/U߅Mk)jL0]4DiA4T f`@G/D~~5CY}A)ݏ_SM#=Xu*]0E[[Nil"Я W+dl1 3$ϳE,)sNrEᙳ*I/kO}*k#E}q>yvuА+($`&W-ݞ L_ng}9|1kBozcAR/ꏮs߱h@\oۚ$!Y`D@ΑB{L-5ßOK͟i!r,D ^fFMi>!)GB7.yQ`Ӭl@tNT#cPG]w6u-!l'j/{jW" Q'7l*fW28cgYkt&~ =&Xޒ_8Oe1ftFPV8^:]?Oo[  "9 ,F];xLk2me-E$F0 V*+@]]eC߰` VZPn[9|H!d, {$﵊w(G:d s[as_]v417"uPx&֦fE%fgm2Yo-,m HGٖ={ 30< X{7+;M4 B4DW T[ogqN[vTCWJ+ IE~ĮFdh!JTKaw./ GQKuLߍ愚i?9 G!UL@P kמ߰h`\RL.u3*s3 =L^2z{Xޫtz} /(i-{ ՘ܪXR'mW"پ~ 4ЀQ,W@K<^ә[#֔p0|E`h0E>̲s  b-A =o!+]s;h[dgXTXY  L03}Rce;s-K_h$f`Isq$qR#<*d`U] |V(,Xoxx:@d}v[Ax0sAZ,]E*%XV}O OшJPPnRXG?YVߜch='ëkFϦ;Q!FZCP{Q}:zgZ9^ qUK`8oeC'J3+g"K՛bv5˓Ϟ߷Z᭵kOCڼn,|}'T[ǟ9ϟe*т|kDSf~:K7,#qg@:f<[#f}KKtnhj25kr4ˍV$" s,}\3fsqV_/hV"YE*{?" %YC?џ:xtm`1O 2tänxFk`1X? M8ӆ Df vwIENDB`(0`xx~Ȉx爈ȈxΈ興x興xvw|~菈xxgwwwxȈ興興xwVwwwxxxwwwww舏wwwwwhwggxwwxwxx菈xxx舀興x爈菏xx與xxxxx舏興Ȉxx舏興舏xވ舏興x興w菈wψwxȈx~玈????( @wx菈xȏx興xw|xwwwwwwwv~x菈xxxxxx菈x興興x舀莈??( xx興whgx?PNG  IHDR\rf.IDATxdux+W0=`0CH `iI&$%ڊarS7RRUUj-g^֩XQ:VˡZѯ|ߓh'Qva_TʴRb_ޥxm*>r:_t6Gb78KeصU&.+\ΝTVhqDPVѩNN3m5(v-ǒK Kj#C)zO@ 1˸y amۦmv_DrDriganJ6ײRs9଼PV}ٚVw@qm>[5 ><8%s^Nk `,-V{k 4BAo mU`p-ʵ"ɓO9˱V ʎ ȊVҴҬPB)f}L5Lzf To+(4\6n@Ş"mn50x r %jl WJo*TtVr(KRT>m@UG& pAs;Hixx.m۾ڽ{I #N<Pzg:8F׫z )}Yl TNc yC}?4bP@ @"jT5clݶZqrSzSL LKg7(<,_VvH[*lV` i{-뭿߭Z>ol˩8wL 4[s pp VZUc ^g|ϵBuȵ֥i;R,+Mٻ8P;qzX>@ tm}_w~7 1Ĥ+mBfN])>9Ԭh?T_ލDB ]X> X2\tʵw;4Wuk׵چPP}#l(eȪc|&a4@쀲+ k ? VlVޅF]a=ׂt #N} UWޣEOIYꨘ Q|?Jj?ؠR+CFmW/,)ףJ9“ϙr+e0,CiLC1R_*G}hxz$.` ÎT#0 e.?wJ=}TP7=RyPz(N"r_Y0(dA:lIvIANꔭ@704Pw֑qjOJ6K(A;GgQ4cC -U?ua?բ+3n ^l;La-%ߓZۍRz@kyz܄0v B^ppdn{k3e<(ȡCs*҆Q~[}Lf>>ߢ'ӓu*VPn,MmʝoPO-M|+t;IbB1bo?[uv &y7=D&=k56;>6\O(SSC;|o>>,~_{O)PihKz?:b#HS0 voXQص9 aMEO"yWQk48R5lpQCRAnݚeQ1@! swkgfk@ \/Gat-=ҧGz= Ħ³V1oe˷(J>RCA3ƪ\Moe;0DB;L pl6|>ek%xMzgWV("2*UUwq9o\|(/ѓkMFyR!ڳ4& 4P0O)ĩV )?7߲"aǑu L0`FKX^*[Df2aAB$=o{[_:Ǟt˧C)?2}OOf;+祴o/[SYXMk.Tp}BcRʶT|^l%PHDf a A(f, ViFAoOk t9w΃[^iȑ#9s3Vʟͻ\-X~\t_yb(QZJNq.⳥ggYxSMa%gEHejTjoÄgB a6 CTIP\# b֚ouo|Uvbg< ٬T|LJ1>JMnSr,%:"5r KN5[F56pK ;g03b2F[d ]l-"¡6@\`pd'Λ^U:Y#yA LB@_R/x^.K3gm\&Tzѡg7iͪKlK˕|嶉 m_zJA]a0 $C-f ٗk0;7E6"Efb3f1z(Уȃ>'LA="݇pO,ӑ5M0㳵7-zB^鐊 i6rCJ>*C~ϥz*䔋klJ?ߑ`uC0"ف8V`c Lݏo, "_=EC<ȷZn/eQз :<6OK+^lxfG)|]gEĶk兰cFl&~_yZY-9*ѳCKew]?C~`Nj`̪)I`nkg%cI2HWUhf *`\ "UV>~5w-Cb`a$7y)ObX_jWMko6*Kz۬h{Z\Q^ʤtzmaFB})zޭRl@aZM6v;Sa)E &kcl}S>tQTs-8 WġW}U9~bWOuՇ0G7X2l%! f[m.z%*ӏ C8^]#3k`e ֛%0Lx51W@l~xd m{^P~[suzIU`W7IŇlu}wUhSLϬiJN=z .;pO!ـ>6 )mfv`2p6&#lfs6"p0%0%W2J<}Ͻ{D*^V~=+fBZÖ}DY~ͺ|g?<$X||siDie`>(goJv[}Muyc/y2PNsf0ȩmn> F`V:run0BXgm l+e lQ"v(1,?d<# hˏ O-wQi=0Ť\z_:-o(CXMŸr_~WκP4j=Me| HHd0pEH|d|@0 Ak? 1IC4xw嗝VCQGg1]_X}N񀍰 k8aŇڗZ}p(M(Yhnu׺s0(2Z_\g>ރEZ0+9f:* `1}@$$[ ϑ(G %Rf ƞJŋ_X#Ϗo=3KjP~g嗊_}RͳŇȔܓϊ|3+j+-i>Bᇍm7MN^:Z߫}'f}#֌ dt1L 0LFaw +51,(@7.dPmDd_Z}YR4~G򥘔ߴW[;D*@V72f8̢jҮMMMK1@੕ho;ٶPh@\F྿Ӛv `Vpe_ c6d qŒ^S: NI/u5aK3/ۈ ?{Y=]OSgY~|=ftfnN`d#%'Sz6rCwhD1PCy!._iKB( #Bl@`Jk ?.жA)"spy3kb"3m@Vـ L i@!)Bt!%0pϿRn>αm!6ovaITz[J x*Pgꈦ@Z1w)M{CY,&/\)г, ѹ=>@*՛}>` vRA QXpM{Ա)*, c}Lt؀ {se! tg6^U 5/ lQ<.HrPG#8f~xʊ7?XȣLڿ`/ o(Y~usgizzJ@Zv=t4}~)WyS` S$ Գ}RPO`uf|\ 0ayq$ ;^-{%ɗ=Өy3,ݗ-FB?rzV.K)?,?@YϑiPNԸDY(jyNݽ=նK.|Hgt gNѥYݥO1תMeݔ+ݫ|Qc ~dִ0FalA6|V Xz57]d`l , Бy{I*Iç r3?巭nkI,?_xH忲CyYTB{XA ^>1އͭ@,ߌtN: '?ǀ66P̻@|OH]kmld62݂s(3ov^ } oIeH_ŗ]I?[O*s[/J[}Mᦁ&5أ^n wwgO չ4T*k5X*N ᔡJJ/݉dgT>`,Ղ,^ $joL9txm@ʏ$4KE!f_جgG9?ycƷ6\yVQ ʛΧVe:D~;sZ^N[ z t2ޖ9D\K1 [I #6J'&dB~l[cfL@V2), p]( p𞁗HE~KG/*' ٔ?,?IY桙-?HܝUF 1~Ѡ-*2ёhԍZPt]*Wti_VW_[^5^uFݒulR] r.qZo[W@ ȸWڲz@ >Xk@[ K& SҭX1/.pӁu6hzC>U%Q~nY\nY~s)z"#{|6>RYg~m(^QZkQUYٷnOZt T鿦ͭU% (L(OhK˖`P @ko5D2}۽2.YvUF1fErk.,b"E[kzq`$/6 U5^A"/*`?#W tE8.7œ/dqARR,GY!Z+P࠲M'1-[3>J[u׿(:P,%fe*@ L6sct1`a}M͸&F1S8F")-R2 ʠ 3{ۂfmȋ4=bGGUAqt]pO yLGqc ?#X{(=[`۔_V)C;ipk~v%jҤ^VG6)06/|QQf?{6ݸ>J.VZ )OM)ZN8bAY Z:p8ghrrϹdl@ AVi5sD[m6B5c3]aQZw[`TxR/Q =/ʱڎSG}9G 036,fjdh4oeK:ߣ.PY>xe kt)?-3,™o`0ɖ&PQ@`1+(/AH:s@ QՃ6& qL F EBc#x\S㥣w>O+зA?}!crl!0->8'??f@ lJg~d~/{Vh_qƽ \TfL}fSg* {_~/Lݣ x us+͜(ofE 0. AƜ>;M9m.gy Ș@T Pzjr k^u]~&eWB}Hf0svy(yhAN ~?ֿVp_ў*TJvYJ`oN+>OBY\Pѩ hytI@w L0@QLjnpwaX@%3S{1jæ ') |eS~`,Sn~ͪ>)r &ϝt6X<=Ӽ76Ge5]5u, jQ35Aˤԋ=/x00D??@ nQv%] (<Q E1Q]-SR H0wf ̘ߘ.?0 ݻٺ@} tt  ]Ux쉣NT2?I1+k~~I-$CW 3~Vi! ޷D{NJ2.r2=u)&)v gScY3Uz2;)@Ofş+39N%mF }Nݚ+ 86}fo,ZaKGUԁ^"W `OWݠI_it(_oRԬQ>N߸f7y~ 3dGt @yEY^K;)mѬi6ET odv|zprG9>?N UV2,1ܐ\-a f`A+dd)5h( ʆmB  l!Fm[h߫r)/k/a/:N#?WȈmM"*6>̷}‚ XNJi"rE+:+< eTq}yzk t߾=뀕' N@\c#XVhPe: dST[ 8.` 3 m (6W@Y# 3(`@}SZI/ *p{:5潶 PJyK=)?GuH5pGm2AT廡R.^͛ WF PX^G{0=wi4%}sM>X|o ؂BP p6er)pQlM`aG\ %NG߶¨Bfj`Šx]P쀃|"+ K Fi*1NJmݾ!0 0~X sm_PzMC>.mA>)a`*? LI° h_7)J\uGG5C_z\M?L~W <+zMӞb&AAtA^_8/W 0؀گ] !6@{*D+ AV*+D^@V6_U돂?g꿥 9rOԟ2Pg󳘅>z~"'}+?VU?wE+= Sdhd&PoH|1x9]@w~Њ}dl,,|,>. 1m(zEKqp-z l$#̀-(w@޿ 1b8=?-Cw}ϺxC`ڢq8Ē^E?PXJa~? ?7%l->}ԟ'Yp0\@\nƝz4Owћh\,Uw@ҟ},:m.Vi)4@>~# ->o͠ts~gљt-#ho}x cs BC6:3dL ,(V` ylWQ['WwF# _-YDjf} ?a?\ oȩ)?DZ֫WYb{M<Rۥ,lmy@ym'[DuohE@i^ixG+?8^*֏ Ja`I~i ,+V_@JiB. ,}s^@{NҤͺyhY:P:A@'&a,S&g De jeM:in$Vx/+sjq ɄflBݔ sF Otãe4_F{=rjV[U1~L䶠9 ^,mGi?HXUEͧS4 -jV=9uV(}. Xu2t,moEzҬTX>䤞ߴ e7pJP2ނ ͺdxC(9~R[Ĵ,a})pNB#3}H6`v 8}iW|rj7Qwm~.E:ޠՅ+t|Y8-UqAQ}A0 dôIY,vlL篧'1](q`0"&98ldh,b0' ɮn7YǾ &! r)=v/}_-C >8tzޣ qYENI]`%Z\\ }LfyPH/?T\oΓRSL/]3~PS+7}xH^s<3@@-9zϝoi=>[5s;w ˀ(0 S v<&pO;TȔg(TA ctڄ^͎Bw; b zd@9XfPzl۶,GKìYWL뿞F wm_Na@DS԰??nn[|=V]pت.B+7:*kN_+=Ohy/ :PbP(ܟ1 `pcm$e1Iw@o-JNl@Ftu'$ vS\sI\`W,@)$,|UV?86'} ˈ?Ě龰2_/i T/ǂxԟgE)uq(< \2өc'ixt] RJҵLVd ӁeN R WV6|2@۪tؘD w$Ӈe@X)q,:؊dfF i,]XV*qoy]i != E!>(=mo1}X}Y@C(B5MOgޭGt:Jeuꎣ =~c0宧A>E p?1:0ҧdʎ<{yt_mMA65Sy^ J{Xޗ.o .& Fg ?"QB& s+X94)H<}ϽW{rҩκOߠw$g* n@\/H i~])?,n}w7G7t.nbLW+zt:֢GzÛ_ZS`a`LAbQ Y}a3^A@\P0X#PWǑg ld_-(22-l`T,H H*8'SE ;9aO_ӏ 7QgVOho\"KaɐB7h?d¹.Q`jGz_8J;EGz>@K'i{my?TMpޯJea@XvaT{. R4]ڣKQ-xS\;> %0G7Fg^+N ћ 0; &kN _Fo8Ü>!Q?*'~8/ & h*Tl|z[FL[h0NڿJ[@ 8{{vo׌@H4hPN9*Kڠట7lLʘ+xSߓoP ]-<\ I cQ+EICDD`X LH2=bSp‰8+M4G */5OMح?NYrf7]/ݖ7*( XC 'husOש>5Aw_)j%Q4Fge?kͨ\#!cIX_%\jAۺI3a݃b$  K W;.[o9@۶oD`耺2 C#|j6> @O4qV=ȷ9}~9:{mԫBLϗi8_'U:π 7UƕkB8A֒fu$Bsg:Td} ̌., `j۰ٳl,?;F9E-~pֿTsb{8orX9YĖ:Mƹ9hy kqr`Xxffv-pj̳t'huj~;C`O]/0`֟& e* |^*ґ]Zxz$"!|lk @e`)mp3 DcX._\RN>K]ZKb?4`laijB@~y V>P\/M@/+|u'% 08(}t u}G3d+͞'_1}@ZLp$<:u#t[T@, Z0,[D`X``"҂Lp,`l6_``MC_Tip$r`A  [w>z8׽C~]?QPjm/E@EwʩO~W7> ?P6㋩}ڿ.-M}@؄$mXJT Ga~ 00 Xo0&l{ Q`\&,մCd(_d ?6 t} =\ 9 eL*@YT:MN_rˊւˊx@A%tF :ֶՂrz0 nXa1YcXfX qz9(cc`Qa|^[uUuZـPxܔw Aǥ'ZA?AF}A@QǓ}M/~B6"|S @<ؠeZ)~:@gAF2`},{Z-\|w?AϜRPz^`͋M@̴`)As]R5<[1] lV`DMbЍ`V2 31'~|}hh(}yk˼MC?Ҧi9/+roT[3gυEY%0+ԟ_zx0 G-"c"$4%5z@jA YIj+Q|c !9PFK&܀0Upۮ6iA^`ǎoC>3@ORϥ0.# 3oZ'|?N%wnQ`J `kTCѽ/OT%O(2K.g> D, U֪ yҊ|@RϺy>xN!\( 7K͘&af= Y@7n@Xu1B"l~{ix70IRy0 Y[r!C2ǂ_wjZ⬿R2"w\LHرsgI@stգ+x?@cx[V 9=Ndwm(z)pߣ a,}L s5Os $Vj^:& llw:xe‚ZLG<,.+rm\>p_oO&JjY$HgA齻ue/!33~ @:Й9zk?Kb",>J0 0dJB+` A+> ,ݠg !XY!('(4l,tde<7s`_?:o|@N-zkЧ߸ʿ ji5'7?,?nڶ?D@ޢ T@={~KU0(pN*b9u:}]tώM_욗ȧ _@*7q fzv`(]Sg tgԑu =w@|vhzoㄙ  0 E=+\дR(]26C]Ձ.g²R₁+ \ fo@\iGO p{[W`,t`AQÁ\ޟ5kSZ,_iMV\;k IaHCj ޏVQ`(w9XxKO7.M8~>iJ*+W`4qE  `ϻbͺd0KgO; ^ aPV7Q664U/S_ sAEy '.%D\խWa_K l}13~0>?ny,[`Ip=5WSkxΙ'eJNX<Kav3yja|wz1g9=>(I+`VP ص}}Aoܽ%[q}*7`}79' .9=wH>d.nIE 'K0sE|7_6e?s YQ`7ݰGQi@0O=q}#/}M$:FW3e)1Xtb,,D)&O5DžkڲɣAXAi7M: > oH_bCV Dn޾@{p 7j觭G 26t'YLy[?VL52T`ߩ\(@7OP3i17@_t0@H4^`ya%BVO q8H793HkP"n4H9I8qM@@? Jw:'W} 38KsǼ=Hg1n@oGT fTRʁDe묭f:APN֌;zn;x@/_$o$83|%=Aߦ=T&'/Ǔy8!vd*iA`8I Rsfȭx׵`Ȉn@0 D z_l@7qzn_'N;SW. ֢Sx&1ywg~L\I,?Sڳeč MvDj(0IY;q⌞_lځ 7JSyFcgR7AAn%ji1:ݓd:%t>.ģKF@ -;P0bl@NVTO;+/2 ay睇$)"~[\c[J` ^X,V;wJ=;7p R<1gצ 76m˒S 8M+.mgHaAlTᣘW,A }A#@ʕ8\M"d 0Q_@L P m7R$`#7 & ܿ]}x7}E X\." R&le߹Hg)WA8Xtke۰V3O{.L7=tc Ic,+ 8$` 8O+J30pfDVrHZmMf-YBGl?PN} b=M \ (]YQhp@ ВCOscE5! PCANp6V*6-4RdaƮޕjذ%Ţ (D1!W;"$Y@TvPEx%<LZ5P fdXl_Fa @9`fl*;" 10д-h .@.8Z瞡ݼ>~m RaX+Jؙ͆1վ[p}O@H2!,z""p0S$߲ˉQiak9@ <[ ,$dʰ 2Ȗ^K3Osda?H7?`>3Jo @2)>z0=?!0.C >V6ۂt 6E翓COWGiEs~Β 8lf_Ķn@\&`|wU޳D T)W;J}t9(qQaʯo V l-`Zu3,?h? $cV8@p%e+> WL$ xi_ˋ %u](Yn&I} tYoyXw9ޗ%8 dafk+` p@ De5dmm%0c?Ly.@{ Ĺ2`uÐw, .Y$Y g)Y &V!S~2}|2`Sv.p UZTJN>}=􁷼ѧ]SWХ]U& H`ߋcZU(@XV Jt1aaၘ`)3C@DPV j2颢/NG'>R,`1Q *QyLp8Jos`]VKm wA $ LFk/ 'xW2}NW4[4`f|eϝ s1  I .Lgt Xdg#95t$et|FU,3sټ-8^M AJh9u5{sj H.F-7/*`MjE[*erRl} |rο@~nٶT 0sA\^0Sme6)htfCt|rά8>1wY .%/@4sRV ' P \=5}8t{&TuӠ7 (ٔ-ŝ`@!F͖ YF Ⱦhe-d= zZ[hj `۶m6؊3H*3?pM 7X .%$`@:+p[gBˀ!׹Snze` 5+X8M]&NEEC$l؜<#rKtWI\X*f@=0E(lDF2# =W @L@Z6 ]] T] S: rQ5.@7=>S@,@4`Tim1+4Ae)PisBqS^>yZH;sU^xA\M0l J5Tt`u{J?mcP-Ȗ=g/T +S% cS}<@>\(033c\5eib2,@a͛Ucf 0$I U< جX#ݟSX="?8:s 5NMrukJokbV833`J\``Bb0P%qx p Iˁn'pb 0j_' H Lp Д @Mi@1o!@}L 3(0P"pT飡:2JߞY@-/D@?f" 7y V2ƉQ1`Kh:H1aR dq@'  +P&0$c("-YQȮ Λs7}ELUzq(~|bPq _pΝ9C3Pp5cb!4C┟^6 Yݣ dp!pcfV l5 c& ޶;tbh`V<(#(M `, *֪?hqCS)zq?>3:ª9wAԜ_01jMrcȣϕ~V'Bvh`Y:?ƵI!4$z] a37D@VNN.Ɲai [w쥖@X:X?A cq `:u^'I > }W}(cY< Z+ +k EZsCŠcy~vkdSwb=6tT<X}oT`*2Sw/\؟؊?q~EY=CYކrـlW ( .@H9ΝrS7Xajz$HnsL$Zmd/v ٽ=*~COS0>_7>u.^W.vϋQ% ~mF:a`o6m_X%|ҙ$4AXYmQ9g0\֦%d#Pf'(- ]N@dbcM4 @QQ17/K5h mngxh ooYʟNaۨb.fN^*g [rvꁠo=Jٶ1}C\G ` gPj/S2.l1=O +Ήn޹J@d;p { Rʁ>o2o23m gޒKdVEo.аnJfz,Ul.FQZQjӊM`x=[0+zj@)!;_EI`m ia1;4oD H+0jfv&b3α^.XΟ܃ `LrPRhfͦV ӁLzy-j2@ -_/zCbTtP 9Z0A;.qF|y8{q%d23 <:`/- ϵOR `;Zb6`ֻbXK@A@(]80JE/{jvl4 AIͧhq`6_̥ /k/z /_>tjN623>W~gɯ)xQ LJJ &k^T . #&X81H7 Y7* bڷ}1 `, Jofnt- "?k[E)WuV`L1k* [F8s+v?i؟ǿPbh0F^ s5`+h6@ \"ۡ$ v7xE  ?ۢ֓`@ $ LIslӀ4 svi\+l~Zיsstjm>?ߡb2sZ]OJ79IM}c*1m'&vtdF@,K:[ rie7` ^N nĺp@²@XlZБA %. @izoogwZ,Yϯ[i(pdm4}L}p8pǭ&=ϙ9+Ismm S  -]0i% ` }}՘ 3݃ *&S sP&H \.'8Jo7лWKK/Y Z̏t~1Yi;/D60ŦL6_RՂiH( o}=˂3`KF AYѫ_3' v25%6݀Y 1R`6Kp9ʪ߉ f0:/s{Cl0yUtOzYx =@H{4=vQrN͟; \@=T7$-Uo[l-lRy $aa+i巀J@OFs*غYAlU1@`v'<YϨC3?\v3y;G]w@J4`6WII@%ǥVz b~`b<2`ڼCg}'_OwYۢ+K31DŠ2 I߬ȵf}cm:hᐱf ,+B@J΄Sʈ,/t3RYX D ;}4@@-yЬQ9g@f<,fI AI5EMu*@D>OsPX=5$AV'>Jo&jv:033KLBtaT>5wl &`8&ȑ0K`$XE)hQ_ >_DdpI0<2B~e,e]@lr *L@,zp{H ʺJao( I ph=m;h~Ph>*/X}oI qo<(kO308V\-@ :q@D`]1@:ny l&%@x,8lSQ'+kͩ0wj ӎUy?`tl+S*knpB"q3 \1XN|ԫʉ5Gf&IA 356 X. ={\GZ8}.yߍm+ȹYxɴ^0l1ff14%`*ElݿÕ}= cr*pWhpaxm@'EZ|\iht2jR*@.N*Q^fI|g! Xn/ ů5ܿh `f a~_'}pYjyΦ2P4  w"hxS)]qO= `FS?D8m={.> 3DŽ$X A~u ^Y H`1gp B@m¡aAmKoIw9WWj4 a 3Z31v+N{.:(b%]E :lBPe#VkfMvvvfg43CCЀ <@x7S̗gf5@ABUS050 cg@\Up&e$I(;gD#/SdfB bg.k_js9QftđTI.@"}Hz"hO1ϯۣWG@pO]A? #96 ǁk@k E@j PD,[#ՀS @ jQkt5 [XLt*mK9pAx0\dQlž<I߿R3on WvϘ6>u'\¤ 뽬J:Y]]-I,6݁7Z@e K PW4w Wc_"S 9ṪLK]Ɂ~d +aVPm$?J[G!t7.Jգ A0 eWfi{Ɓv0 FA@aoZ8"LP 4V-Mw+"|o{0_#pĿ($,@`r&0h+ rd ,%m1@+עG9%[]2Λ?k~HeT@j80d1g^'}OkW M_I f! _)` nB ps`_, '2 7|LNa|ռW k5 NX)A":+V@;&T`}$+˔aaoK8Hb[35d>}o}< R 8Vn@o 4kc ogs/&vµc6aJm)@]9 +(k:v%\ rX.ȇɒ mV+`dg؂<$#Pkoњ.}qsE@g~hʏ1^3^4_b(r>y@xmHdle%HAނ [fW)Ҳ,İx[, ID 3d5 isQ]ږ``l?߼J}aF缁@ ` ~RJ0)V@];Lh+?ʀѲX+(pe #{NCC@y8,I\) $ t!M r%8\k'$lU% |#4?1ۃCW65X P& c';׼I)["-Y8h8*''ͣxE 4XH i݁yQ_@p BlStbiX9h^1k˗I ޱ~#7й T+/rLLD(+H?|~D{z߳ ZIV@+B)o У3+F4ǂ[ gyvX) 5vo5Wυ7N*Pp [67ȓt.Dh ئ` jc{0z/ma^k\`ns9s`bZ3++w휥E>?PWVWiҬıY@ GοJ\5mN0+b,dg)\::Ifm B67ـûl@l}ALĐ5Uxf9󅝗cZw7:h=vjΞ9CB+M$4͛sA@+NN$AuL4O#,d tc|Z:lf.#PW<B"?τHG?sgGN84p0`Č[Л' t X %.7U*9`H3۬vМ@9grR337]"MFyŦcHHgNXl&8Z8CEkKAw=/_nn޸BJkLeFlVT$D! C>ז~I1$4rpAΨ9^;+i'$5,HsޟK?n.OZ?i rad윒n7zkG`&LٿPwduv p8YzpYC ׍Eޱ%d}fv{ 'S|xd@,9N A0$ ]5x<六B\$$yhDӲ .`P @ Rn5 ܄)V#)Kª\?3/(FLEO4$u 2p^I }%oil!C1ht,}P$ې홉@ @$e` `ۡ (33Rk2&ۈ[0 5/LGTpJ>y Tz!hlH Ix=22bڭPw|-vDÖH Xϐ []er9\jq2oڪ?ۋ'`CꜣrX([`-{iAYwJB\lb@X X 'muS~"kpMU1ZDZ JAMv~DF@<+AZRSiTl(PT|i}A'[g:r7=nXA,8m$Y$-aB" - *@v&!/`y]P5 -L h4i=Ӫ:/c--Ī48CB d7@.+5/d"l@D[ \L;#E3p V$-=~vҘɨz^H|OhSo wzyŀ ;DЕ"ܬw+J32:fyy7k2 l6$~ [BL& Q=űo L̳k'h7FnT+( @Bq/J[~[pmK cvsP'> VrM &mb$m@ű` P/%@ M%:8Ӑw 8 Mk l{ӅDg+|+e!"w`]Ӆ&S/&_f8"@kR˯n;W* #Y) ߇K}wۂyw1r셦оHuV}"31/s 濭??#i @,4+``RMU!~ӈ>'-Y F˼mMΩbHR[kEp Ljg`М:}V |{B3'zmyv)OEKYt+  h/+d_=_׿A6d"@V@``RJ\)A. dp@ۃ `^K&1Pg|yx0@C?\nEl(ΘhDX|}=#/YZpV˳DGrǢrq@#UCe+,ూR~>wNlg`=15_ |_<8z씷t%8pd8S'Y\f* `$IZ`ͼ LD\k^ݼyh>)2oA5Ѝ >~Oϰs,"U 5`tb u 4CgL.߈TWy`C?5j׆k`T:,@ - 8pd3 t= B3$H:h7@'=D>v|M݀;ptgS?[o\tNQ);A>#2(ǵ..r-mQ?[/A&޹36; C^U{'n б. r`a+&U|Atu-rpta 2 ܫD?cK5"^4&Q˺$u Y+`Ks 0 tL 37wcIueQ*j\9N]p"p,`] hjs fL'UW3G][:ąF .=:|_Г| ل>#:c^ 8 ?`bPP+:_v8g֙~ݭ~ ﻣI@95GZ۷48 h8$c.+.o ԫk˧"` A3xoYs|Y_f&oY\7ol@,& 3VvpmYϦ|.eT `Km ͘/Ll!ˡӥ{[ޟ~liٽM?,ڟqEZK? @m|Sص c+# dr +`hnaztKE@Ks`6@Ƅ -+; ]|HL 0Xso2o/_~d|<9 8 3{@+M5?4|wj_R? ?G@o[쌤_VilC[̀|<י&n~9qZ7}b~\3k!I}+O4/I;  @1 owi@M?TV:O6؊~sc=hVKR_ίEUDh66t hD<2t+|$ l -[sVʁec6 sI`s r`h+ ؀`O_N@]pڇpU'Is1ݘZ@5@{ l|p?ߥ dKgi=4upYL`S'`#L~|&c+$ pPP]A pOX2`@ oDkO K2H .7P5(7)V}9C]4>6RЮ%t9/? ?ZW|m1_*u7k7uZ/a3c%g~Tq|0YڟNy#[ɑa*ET_Jm̔ u J@L+rYG7bS:a{i` "XMֲl.~{tlڼ'k|L3ji4gha~+!ŗ&@4^lL8PbqOI8{l?l?uܗS`X?yO+# 6]Yt0Bc]A`:OIqԟ+c:K7iХ& &M ivd591",RszM\B$6_]һ_~ bg)F#b+ܜt9dp_>"~I+Rki}-Hw$"\8 XX L̗Pbӿ6.fK_T͋_}dxS`U8JB@V$WEtP6x"$ tŇ@?q&=~,ܺd%:7 Ȁ.L*~bn.8F ϒO+GOcr ?XA͏_~$p虅9N~[$Ii9MhڏyZ&pC~}d &O8 ) $MB oX8Oֿ`ʂy1@}"K\5@R0T@a?0jP'ͿHY4?ƒtNfp]{1@6. !-w- ӟ%tAKKT32җm48uoucrZݢ3 6H+Tu+|%ˀ9ϟS5ˍzi7N*L]5VkkKQOq_YiQm}#>|q*H h$ Htb#eF N X(̏.,2{DmmH륡݃Lb- ;|0 x}!9cX@wGFb_Q|!{b+]Xm6s0&Gު)6~#ǁ{̳Ozd)ʚɄ=8+ n>^AA~[owmMYpe *ɀz|x຤dc h2}6$G M4L84kַ}vfz~~ lڿ@1{_y9(f?L['ZL>o4V}K3Jil:'^΢h-A +,xI[,tWʵI0k IlV> /|SLMI)C~nH yFs9 G_s08t@mg U_W{lx`Jqc9Wte>S=kvV=#_oV ~?Lyn#\=s\?-O2E=Ӈ7t&n sGڍ+(5F*}Wl@ `dml679 mR#Ĥ󓟾]lM{" [_xNrKؘ7h!&ѺTԈ5/T^h[Mwih}z?_7S揝Ea3?S~)w[ėrZ|/lxk^c%DR!l$%L83j%@FL|AI @6p|n/5h:&i nveb:`UVk[?N\\d&A_JBacb+!-wB>vLT |朩ƣ,` @Yk~ۄS>. IQp_6]^o\6#+.%Z5%f 93tFD"З> p6Y3獙ky ' 6 2[8{B#lկ]Iz Zo4FgIN v6TW|~gy) n¯Mv ` z>ցW UaV{~?r_R- 303{5/o),I }Wu5&a*'Sl  ~ VH?69"u{-KmӀPQA'N6ǏzGw=Г* LgHv9}| LsJX_R,躄_\[ǁc$-H>W^~smJ:_k~݄)?rr ؈&G7N|)Cn)@.HIYL͡ɘ%I`ǠEÛ=/$Ңyfgfq۲Z[2C aDk~/8n4zٳSo$! GΊު)U Z3|BW-" v}d|-cp.dg-@ȡik7o p,[izK &T Z`/B{_ < yƧN08?}_h9O|hVj5˛uG/~B݅^9>AWL@ 0%P+7|Q0nHQ=VI`-=JL4F#MJ83N6S}[MMMΘ-!JL#g6mzKkHsך߶93 ?1Zt@0a!7̂ Gq[]<@Cvr<}2,-ۦ2&$P+(1+ 0kV7z340ru afߏ;dZϥ߮: 8\<|HO.O!5EYC/"a#)aW|4)퇭9ضhoA #+BI>"d"bd`uۏhn#֖vZv}덁AdеY-5FaB[߳N9o92vp=8 4۵49 a]KEi=3@ ?bLwEC~ݮ6PYoF徳m||i՜I?qXOYTL| Y=҃jA[P6̖mȏb.$;/7&FYBoZ ?^ JVg}6 i WcZg?M_q̵aAL2Ͽ={N" x}$Nܤ922 1`  oxiq_01a4zv }R;u 5>zR :Ϛ{ ":&[e7{vz.k^w2zd, 8 "lrvL5,AZb,Ѱ)6&]WbI~u}%ܶݨy1CB4>C럼3]"" < $͏~Fk~w$oF'N_HK 3`&,\cz`kF$޽fdk@a?F2$A ڼ|G[a4<< ௵$I¯ {d~}'~{ k-$8$d <p#{7DpÂz ogv7Q3\LX2K0zm3Y-&m5H$ 0; RKAa LD0Zf}󈽟Hyn1́08zkNBiu2Mg`mLbLL:܂FFD5ؐ l]dm۸FSѢڞ!}r3GErÌ;\ ֗כ~f4ch{o{7Ė9 Y(XcAU+ưYz'\2kH"Bl[v"gǷQ' >~d/k!Tm/כ7j%.&}v^OR{5w=g~bfKܖ: CC`Ȣ!m 0H[l a`2D Y2ld!_۞IzpQ6m`jKa{ޘK. >L~- [h//OcZ_qHh3\g[$v, DnB@x82tH&lпɠ(ҝ&x6_NAn®58ąfЂo3?sk 1kq1PϏ5;N/5?gHgJkF%J"KL$sv lD@1؝ӆt@1F,cf6[&iZ~[ <prxͰNIo54 >|wz~^>oF/[\*8|hfv<%5?cDb]A@,,L2H@!)TB[ p}_f$ =` .?+}x`m lџgzFRpO ~mBf> bs@L~Mv߲u^V|V;nܲN⃓[WFh1:4!%@rjl1V|y/- , ˘}@\ ɳ%)$hBgY6-sV1^7L9dV~G9k>{%?mj"zmڽJ$-#yL 7az,\@(-Io5htm`rb-n{.8r) ;B, ܺM{7|mf_̇G[_i <|mzVQ~؞;֧b O߿~|}srF@5c I<+cnVp&'#E ,X^ j/pNV6+p3VΓ+#3z"GQ.F"p@߰>~o/f`QĿZS|7Jh`wvIHr d"JB7!G]Co& ,|51^GT`mHM]Hxy>_`XS>QBc~zp}-6ڀ/CGzGMXM~Qߐ0=&'oXB?HP#S\ -$lڬ:D/FF/& YCί8F6 m+bMQHR4Z# |$Y?K澫n9hDѐ O1_x lܗ-q)ou =5@g=\"[hM" dsW qXCd$Ґ=ێn,G=z8G!؇aOk~eq0}߇K(o+=p qdS@lhb# W,s5I";IR1y>=_(̰~p~fW3Wn&ߒZaC𥟟Tԃ >0h)*ҙ=#؇{^oH YZ*נXHr g $2#cTA ~(8;ТnV6{;ZmYpa7!h <Ρ[lxeVZs%kGǽH]B][ d?k|AS22e~K<@D,.$f h6;c&@2m#VWVRg&Jy M;+#f_G#KhDu魵hVsŬ߁C3lwt #L#ڇo#?M~jfy<0'"ۖPD:J%#/Dd $2`0)x%MDL=iU\ xt9klc# ۔' ,{sfvo'zw5N%i}'AO>!Kq0xNHBN&X iTH|#V ,04 ^&44zma?hr Oo 7{#EޕOяE[^ Z)>ҡrr<<'%k=ӹBz-`#;1D[ %eI |G&=#Ḍw*ѿ&6_HmїH2`?׋K/ {16:vI<\ \^9c%~d de! ,lb{3!  %o?"x(<\`^t4` 镓àeVM%gwX`6ik$nG. G]y oϐ6'Q7vzx[pQ2OBX2`2sX&;$=`zzbsD\5Wn 'c+*J> (xHP{yA@ HN,&=`xfw@߅/5ضUnBmBȈs//f@!RX܇,"Y "Y9^x ~=/kҲ =Akӽ[x`On^bc(62 !.B%H6 ZNA>z`n^ |t,Bղ~xp k׌*z>3JjR(p@bAD@;ܠݘ\fgxJ(![ cGx=x(Qf% l'F S[!q{=ﴛѿWVkX~ffvȃۚ{/p10֯ZBBՇqAFLcZjxW =fj>5w .u^ R @XU58)HX?ʿ0K&є7ilZ/̚5]Ex'݊L`R'Qr+gvg hth3" hlNl7^x[||+uqtHC@-Ā6\&F|/|Δ+@Q|35y@NoJIENDB`(0`tkgvlhynj}rmtpum{jvpys}v~zGKRYQ|{bmmokjs~{{|aigoofgilkrysqˮp}szx}|Ť˩ոȦ̫ǮɬЭDZ˱ְҳٶ쬋ůűʲ³ζԶպٺҽȷù˺üʽԽ߿ѽ俢ŗìϭƳ½ʿѲ¢ɦëūɬɬѫDzȲʲºĺ͸ŵǵɴʳǺ˹ͻոڼеѽһĴҳƽmb0...0d۾b+%")^^^)! #'.fӷ0(^nc_/'d2(hџ^%+Ʒm/`лХo($dɶg-o}}}}}Х^%2faОxx[XXXUSWqtz{{}Пj$2ga]>FFGIIG9QZuj&daӺ]FGIJKMM 9[j+pbӸvGIKMN~~  3458Qҧa.fj濸vHKMN~  356Sդ/bbƎzVMN~  4Pܧo.Ʒfj|Z|~3 Pէ1dܵdNXO745678:;N㵤1UYa+-----/W@kzβ2' -----._WN|澽Nέ2& ,---._WxP칻L㸫1)ͽ -.-.1mU|M쮻MҸ2*˽ -/.0mU|NM|ҵ2*v../aVkTkTΰa-p3./amYNЎDƩb.oj`/1mmo`D>DZ0\U1ammlW܁CJMƩ_Y6aammlWnM|ƥbY7mamnVn{CtR?qZ7anVnEBǩ\iaZnEIų?Ǧ[EG޲TăkBI¸Q MڀTB~ԯH ?BDBeԞ}SGFIgԭϴ??( ~snztĭοǼ˺ƹȺκ˽˻ʾ½ĿľͿкмĿƴ˶¾ſŬƭɯ³źŽɻʹͿİǵȱʵͷȲɵιQq/P"p0>M[iy1Qqұ/Pp  >1\Qzq/Pp!+6@IZ1pQq/ P6pLbx1Qq,/KPip1Qq/-P?pRcv1Qqϑܱ/Pp!&,>X1qQq~ml~ri@!fcQF=>XIGOrTBH  "IQi!r<.3hnEsw8+V  ,wND|A{a72:-ao!}|Az]1-6.7)_p!x|!r\7(#10V)_r!x~!t^8(;'U92ltACSgW)k$09)[zRPctb*%0&Yyu jKu?`4\zvezKBJdnuDLm5Ml}~?PNG  IHDR\rfIDATx]gq.G2/{k^k;̼3mvT*e6]}dYBsNG9kδ{,_/a|v6' ]5 ~bz^>LwDZq,jOU>ixżVctqC׃=s&$N^i{~dY _?$iR wjZRG2LI3Aq?~`hhh7˱zq5袁M"xBHQ@aܞ`[$\hh\6לrv筋dIf4C':AcKO[`YWzM,$;d\zAw3}PBBp6lO-FGv{驩gZg#\~oe5txuO'-[h+v  Ep2@2z .*?QTEQ%ccgsaѼbaԙAn?Iq6'~Lާx2L k[30.c'v ڵi{ \ YHAkR9/-t+ap{稏-JӸ?nj 5no_T8Y-vlsH-T~CJ_яK?=]8^K( 7 ♋ _XOn:3!O J{N9I}q|oQo?m.ߗgS8>[ĞqO4vE>r%\yb#S/kF/?drɟr<O^Ӊ8A>ژSS[W0z$r+>J*ϽKGK#d/ %hc48N'f!k=  '7^?v(so 0 Cec/;] ]6xCf"Bg"7"|dtt0 /)IT~`=د|o"|/zh_iZ:h!DQNdԜGGO4WԝJ{l,Yj?k6`1|]Ip?%C/> ]U_aˊ73= J}.@@f*2h7@ MdNH C⼧4ӹj[VZG_c՟a`й1G:xDz-_u5ym糇JdeJ΋{> ~iJ={yL" & +~14}e \OFm@R`2tA 5ՃĄ$4;z:>_SmڛLA]{S?6vz` q7 ZL=]_ 6Y% 1k1? q _AO28v&{pt zl6D[#UHuqzMoj{) @7 KvxODf`P-06Š2# m2u8S ?EP X1L5A-%z>^ڗ-j dgk{,rO}0nG֌=?̕dB:T*|>w{ ٳu`)ـo 1zz# E?tu$~H .~N)V^q)/$>F"U`;`Tyd*C9FLvB?fsR'H-x)y5>~ZV`HFP 󡂪,|#6`ÁTݖ*w ]H(8A,5~ml$: Lmw @{wL#۶/DwBxM686߳_'<]Q1<>:Ԇ}Gp|^Уmd=cqï IFc#{bƮŤBLKȌz,%VBgߙ9OAx  Vbz,DjT#X5^+pG B`@hT2b܊׮}xW|z'>{2j*>:m)t6`$T|Iqc8;w?҄6݊! }6ÏJ }9tzt>zЇ:nQssBRgt7@q}Ѓ > kU`Ӫ:7`@d6$gY)4($U RtjuzK?cs/t'pC,'E]eٟbO?uqqex|U|*SNn d$G'pܷɞ@e=2%',)*pt)@OlޟztWf`Qj^3HlZM]F H H <5T)5Keu F̂ANxPa Rl d/:b ۏŹDlOZx4{?(od?@0lf!Tk5 ' ! >#cb}OXd]5g1[0TFO݋S){ Qh]b:yr Xl@{&iDȤSg3hQ7-Cm|-byViF^|0 p=kUT3 ‚ [kpsJ?`RQjIX=w^uMKGEVQ:K7y emo+Wx*9G%Z)9e:cϡf>' ədßk! hT\e{ĩ: y= |SFo@Ib,P1~{ӦKh2P\D"ɞuI![)ɢ>}Nr fI!†uؾ9W.+1afKB JQXI{4Xߗ.[[mϤ($CŝrZv}4̀L!kQ}$Q[Pr_xIe-m2 NfsH~%:̷{>gӫ! kl >./@/dd'B3kCf|CC 6T"2 $(ı5^I'I0 D/ ðjIى8vLOڿJ [6 Ī VD_T{7^Ɵy2{<ΛV}^!~E'{WTr=/etMߝ>J+rH|7FWq:̵L;}|ldh*c'o/ *4a8J t_ڔ@֏{ 8D!h~L+0 *>)7i`clY t %uŦO[:R cԖ@p0' A2 AR'k>٭g d <LT|⋞_MI+tg*ٲ燅 Z2v `|iص4=ݘ22`%(abiIUK-E   P.L@@".'4IJ~+IjL $+,RCTR-]#ߺK= }<A?_FYo#[ OKKn)O^辦t |辦xQIzO'pӝS&Sn2*z|RiH9~Zz>K<DCt%6x F߾2WqhK%lz,*gҠ5OH7BY$^,#~?S!B¡A.AFpX' l UD=3 v^n,Ů@[tά_l3@AhGnd`=5ߛ=qL㹋퓥q wր|K/{[``Wߵ{]j X[>Zd0GY#HCOL%J$ yyiܡ/itϯ =F/zZ $4x&YjZ -3H؀@&qJcޜ r/[ % C>VZ@i} #X%Κ$NT(H0$6c+'V=f9_d{e*#E.t<`!{gW=BF|)O1}0HCT wJ;]S{,q~wwN(M~F~>g@`8$ܳ&ׂkV (Z'PC0<)&6G$t@2Q&}|5ޝN8Y~iGxYp05G$(Ԓ6OFȓgGZ^?g)?@"/ۆ Ð C!f\X};`T.Xb8?S@ 1{)@l8@SaA/~S(srMv[A12 '6@yǦ`c68DC]5PJB)# ErN(N#Gj;@] |}=1׆O]}胛|/z=?B9cO <^8_ ||ICWbX t yDHO*Q;spY* RlQVI~ɷ^S(1һl 6[]%?7:Y:\5 _rS+ 'H 9n1Nd|Flɔ1l>A ޫ2" 꽻d TV7 ' F& hP,,xpP },)jR"L Ӥo `RS*pT{kWn5elW5~,A Gظ֞woo_}ݸ3#6R2Te6G:4Tzw&4%w y|ߩ{z2H' 3JGh c_&U9m D (T gSZafv6vx W,yT,Dn"I% vЂ+0 dM,PX tÁIJ{}Y]@S@j¬-$R JHD@h(P7a]a*9 tOA# ǚß|YL >3m UK׿Ї9_; 1L:E6#['奵,)u>o<0߾мTBgJ$ēH|+OK/zP[{*Dl6G2C*i9d*fԈkSe@RѰ 2|dԼEH4LO13ܝz|_€Ӌy`׋f=B ,'vSЩRғ_/` dC.Ă{`@Z^Ȱd24 t 2>XV @1^V,U/+jv̅V>Lo@_=@2-8gÒ]rnk4_)ͺ?go?G_6W)#vI`C({L{QQXNyw=BDtߓ# ?Ə*G/$,շd(}a)2Gt =#h4(I%55}ݯkGXYn uҙCu^k:P(C9 '4Ze2|dK z T#|%ACO)(R3ɻd>L qfn7kK&wPCW ;twyL-EH o{z1Y@Pnw3@0hoT@1Qe>3OU$t9,lZx5:U< )QHl` *Y(AA >'~yY7`SL|^@3 hQ"#Ubͣs~%W}B9@.TxL#!yk.E{D)gcU9%L/2fX+u(4|/GH9ǠJ{DФ૰ϸH͆Y7T?sXFO^~I+Zשּׁ+F[T9Oj9B Wxv1gxy~bP[412r$7[ ȫ'C5 6~_-cZ:Fo#)%d/=?'xl%ij& ~*>(*ZYev^fɇq,V~j?pǓ^Z\O9[DbgͤU'Rݨz4] SϦOh+zn+6%߀~NUD3^AnUCh KԄy2CA#Յd"< Hr2~}=)AFkvOIN$dJsa$̀P>D|!Uf )/P-#oA @qaL%|8UL 1 |؏ƾ|hjk_vm8 )ˮ.>yWi\[VC:L߾9P4~Sek9 .茊2Y1_tryRK}dt)<_ROϯQ>#T!/?5݃2TEf;"-E/wS2^`:)agzH:Y@;2NǏCG %Z`e8W6H)='YX` r)#f0 6AJ hLx`6枍X0aA_ P^@KH\) 91,dHP b |>2^ nd^QIi8E󓾓) |PPDB_vцk/`:c۽sG O885 2wd أ%:ïjR;g]SxC ) )a>:2ՒUe, dbZYC_T}țaNjf婽l3n0 W%3XQOa zq=DR>l @ !fcp!8rp/+\Yxfa@ ~@ص!!9s@ !qr 6a l ^nE<0D_"ˇb]($2$  &03GYF$9sr02\sN\݄ hHg='QkG2(CY,̪e={},AhC}'~5'_K%yvw_{~}~5C6 iD~͌_- ʬ?E-=)1/Zse!&.DRApwn쪴is7r˶`>U|nniAYd]d'N0\Dꯁ \Q;h<5rg:G, X6!g9k~<`1(Y?I$ԡPnA+˅ZCs `XԠE@LŚ `HFtu M{2/eÜ(L ]P#_x),\㱚xK[U}qt]WߋL_( 2i.2eCh}IR^)ާp`SjTB,,~5>٥GJ b}=5X:V1 LX HSyaIzs@W3tT}_d\߳w/LcI {c^XMYگf h"-W` &\oJVQ$ ]"ۤDB!lLȑpJrP@E]4GKaCR'b3s6/@ǮVWLדp@Wb@ _B,F)@`lɪYzBI}61bbT'={bIܤFWr?4 ?_?gSHBkeKO$L"p$zgʞ >?#H{~p}Xj]}}]ՕcYKB%aO|\0U,xbQISpWs.hڸ"Rd&p?(5;'/WF,\%;˓]OekHjU?k&bÂNOU)SV ؐlFhVRY XT=֐1D$*QyH3,89dY0IAf{ҏzvYDWmm(Y^zyzwO=v]*Q染} 5N +"T|Oe ޠVl5[z)IaC,ӓ=:.،[pK@ɭ1\K Ϊ֜_oUȅL#&R˚OPM "t:݁b|ӥf t7~YyVGwWK~PZT?|/:`W D1SfZ oCys*/A`顡 n7'ѐf3s h@&@A +#t0Qh 'ʀ-ڱdȆOM;gW5nv> +z?vIk/㸷”;qTjPbɘswOA7yOXd{+x(O׍XF_ኂ=`_" F@hلw(4r۬0DI@(5hOJ[Zg.öZ(3_h2/#౓밲1 la0a,)EOw !$&/@JhRr#AA=( I,e.2VM/ p q%V-Jã~w˖5PԜ &!^D|#7\ZoxL'|P2*'L+zf~2~˘VV!ќ|=KNeϏ\&NǞX$d ڰ1g4<1Z+ᄿ~`y>諚2-]Ղ%iG 7!W`rO0ܞ?[`h~pK,mvv>?-|߆^rn"7"bYWo<0.4vԁI ƮsC ( 8$@c'0$eNL &0L@16P`@) 4Ub4aԂ]V^u8]ZVc<ĩ PR0VԂbJqTcwtM by4p합w閹'$#jhJQ{$ 6@Uohn;'g5A:9o3|2_T{xݧ#mЃ>co2A Y*|dI,Bu kE篹WIo?aI}F ~>G9{ۋ6~a,4 i}ˡ2<>jHvK -5|=_ )?>}2~6Pk& w,W'ImOA+ pՆz4(O-S0<2 3x, EÓO?~#:p=7?=y)8xe8ȟirSOV}5;;}@/ \8Q }z^p-:SP+[E{wwůe 4:[0:K&*O%eLS_~ 'rOk˕>k|i }wv'[vqUSw龑ϚJ*pSBǏ1ßGCNh4`hh_CqQ!M}~𗮁0u$\#fbMӀOTpc,2x3`;|,M|]I@4(_k !x~ϊ\ ,B\,RoC <9s0H,4וՁ!d pץ` I m69ʀLl(P@*Tw*gKGn=-/Z,)~e37%ouK+e\hV}dz_e?N3:j-2~$x$6~}RA'zz=&Pn|6@i`(nOq(Wܡ_] ޅU0$xbG ʏxnU?0:A ==% %1z]=EibTѻ0%? >y? 8kZ=81ѝLx:$ RQ x:|s=p&S0`!x/ ̖R ZxC~Zh%wRM<A+Ikp_g=V~XL3KNb0 m߼X0]b"hBx^LZ^?pwO\ Z Є> %<g2)8=CJҔAP`|\0fd()P ֡4ԷSZ|'׮r/g;>yžAҠ8R*N=''XQL'pF\ǝLsz4FmQKig2mԤ秡$ڈ3^ڻtw{妩#u8i. (W?ǃ5s5aE'R_ uK&GBʐ:>o{\eC1i}tP\drޯݍa:8)ὰğӖ }:Rb|]r ԎrF^46 j&1L@b *i2 >-ۈkϷ>.\q[_P@jL>Q + GmsvC7" >`, #Mŕw6+S#t_|U ^W>q?@zuƟQOx~[B AD[zeҏJ}gz,۔]\f>#_ϯCd<,Ino tQ0NjVr+b+#xxB>lUxXcO Cy9ߙ}ê?Ne*^81 FMc86fy|'WeA7Av=yIfVPOWwe$2VJ.X a_/{Gf4d«QexVb3+tqpRpR.[@EACMd1GW@::;EH3rҩ4n۾}uA`$`I+o]=vgh/%ukoK~ƃS%eAE3HB:?b:eAH3} ޾jժwYV}+xoX{=7Ǫ;KTPQ';p!-R~ģ &_fOy05vx!s~׫.QgP5E 4uW&BLe Ȝ험@-@"=V(Bb& . A.<WC яF^ zƓI::0 j>s=o~*Nmr_RM:yacZC WSb n.KA5! <@( ׶j1(9Մ ǝr|ɑAÁJ CS p:)1 <:&&e>RRȆRipc=_P*AmL A7Z>cǎ+(`9І2cio~v'dYs~HyTW&x r^,MsAeCISlh~K6x`~U:}k d@n_5x=5Dדg:a;a472cT2`9WfSNPtA<'_`Ӳ1?o #gFeEoΠ2$3hnZ23|B˕_Jv}N f/^~@{ dy \YCjAe]Dra("P#|@?9pjBGH9u_ڋaP>2րJJڀހ -XzXg ^zߞx\2«w<)!%K_(Jl߷s83&6ƶ2W d_acAZ8ACsk6|cu}s2ajSk)M@'3P@>9.^ m]MT0VKWr4ѤDW>xeeA//쑃Aď4 V4F8>KkA8>H>`#`oe[n*4حKGmZ(:a(R#V.Y?N%i(& 6~4t5P` CrU⡺ H%H]~@ˍir Aj1A_pWANK{b=|יV_//'  XYbGZp냓2ϱ*T,oΕ`]TzѪ= zQ-N@A ԍGL>2ȗ[,jDvUb{\A J'1LH̳[< 4~9.BZW.nlZ.vDBT2 6CS%մ*Q,?\ WlTstĄ~ݺp7 溨F{{o/P>ZEBw~& \wN(&.ƵDWrJԃhIMeQ_v{U_yZ)5}|ȃ[s?^Ԯ&N|oz.̔k*Ņm\؄ >WH @GqhNG5Ŀ}\:%O*L&9̮|ח뷷`4JdYДKg5IG"ÿ ]\ǦEqg'sAߗ S PϭplcoT_0TFߪUޭ0o;^v8<|^@xC J ҺL3R$DN/$ 0 PU @B*-CN߁<%N&!4sP b.@JlÆ rժ8,upN=rU/s+J=ETlm7 |jLAe}Cku'&P6 TЛ8!+z{]s+6_a8' HT(/EhCo3w{5lO<:<.:ك/}GW?s\SO.pߝ8'&1 7p FoNy @%xPZʻ020pY6^^נ[%p@rA@9.ʁezxOϥx6. *0ZUbR DDF6L9{1L3 "+݂[mtg?x%lq{.{Q}coѣ؟&ϖ>18COۂ ?m~߫;'s+L?8ʼnN\zM?ywF &I9RX/?[",Nͯ^$o 5S[h//i;MF@+d%IP{'fᑸy[Ake< zTα{>W X]k0t"0}  a=dWw0h/_dy`~..0}9 A s ޭ[NQ(`:Km ^S( QYPIR0-9Vͣp rNp A $y][o?:{ȜCS'^ض]eyV*5֗ó/b5ٿTOy?i cʇ %*'sp&>?K] bpQ7rwޠ7+/\9  Lk˪(Tf&zt?s ᘜ%8TGcYr4?t кZf LI8txmeϫE@3|'~`#[>ՉVUYɈ݆a}1i;NKOqݟHR;Mw*=\5W+R:sYҫ}~(&@p&r_ڿ &Esp鲎xQ\H\Ӵzh_N_ N ߰Ca؇ I[au{?̻/>1N~Ksk`$>71c5n,tsze>l kFҡ}9 s`ˎQekF4貱Ӕ^\Ɔ- `LqQXzap$,]6/7oyyEb.:,}W?I{s2r`3I?L'[;a[(O?J 7h ?JP"6~*G }z +@1~'Ƴ@`U彲|P+@ ϯw:x9pIe9:H9117n4TX|b7?P]ՙzU*t,u `̌qa`e,r91č3݆mmE1szM&ے6_I0bȵ,(± X]`Kѻ1(ZT5SEH-B;v_2 ^Ks GT< m86\f|j49,27ys6vP_w[i Q^fk_MWv蝯 p n N:6l0x!GOBch5|߆YX_}c"4l_(r(t`u$$wd\a];kdTs-5pv:cHjXHsd ?#": |RQ<"bAbLӰ X! t}lú,up[5Q8?=,fmF Q@<1(עGO(`/;$uyH~[.ͣO___?Q$#uV_)hKsY ޟ9A9G<Sg+=,|2r z6Fln>FVvM.J@A7aw{wV`8Ӗ$aa\]LX~uróP ׾0xs`]00"8/xq qqJ0^MB&: eC>Bӈp`uF"2 h@m(5A@-kF:e7@fd"@KЄZT @pySw˥sAis X1) Ĩb ah =y` h!rWU`?|c^'덐Vz;ȯb+oghpT=dyżO(Fh=sdяL-hu4 6vAQi/ٷC<N>0iʐN8v2;t3pJG ; d"TD쐡S0dc;"B?h+$yp٢Ɍ[`Z XN2A7kDu_AN^3^ FȉpjŴX|ZdQ@D03;,~{xA;椠Ro zNRk|i˖k~Rn`{d_3n%'Ѿ:5?8HoO=No MX{y7Cy;& p L| cBCϲzz.ȯ^^'R$#0 ɭ?j$tC}uMA2k%9;V mK:c,|z,|߁.Z 9`P(HHt.Nr-Bm$YuP]Bx -vV<oZهa=fhɢ`NP3CL$>w? ȿv.g#-rp&@\?ʢ`WM %(AVSkdf&]s^ޯZZ?<;2ǃϳ?ͱ& q jC?2EZj# 6,(Ar݅~7M?jϊ aZrsJwd 4_W# [q$ Anؼ2?_q %.L\m[s&x4Ci8U+s 81[)Ꭽ#_ظ"ᯅS*HZ /TGr0iܺ7U񕕈L#q7}3 L+9/]ִ-3pD!%Hʌ[T4ik&CiFiA ;}uLus8R䛅ڍ`>\5(Ŕ ub A8޹kϏ~S;`\JXK^ 6jYǼ W*Q$̔<*.M X?8N5Ri?ǽ>G@!~l0q1^e%#4o   h_* SpнnZ}[j{ -@d3Iؾu],8dHosd\ |xi A.e|4^$6ౝ >nR] ^#=X0#*Y,-!x[ov^>* _0FLe!=:""}cZy 8ER- NAz-PQ"䓂V}G&v@y1r׷^1%@FwOPF'fsycc(/8,y:FEX08? {W, qR}wx}_  Fc"{9z@}}jWuaP uTc%*}Uu м8~QʢfQgal5 *`7 S%8egK\: |M"v_S| ÛFߒ0HMv XG 85͌e.*˕Mj4;%Є4ܾkV^ A VZ\4Q;p׮a}LIͿ}~-e5v}XDBX uڞ1{m /+zHx}s}3-5NA!w (Ӏ5$ *e>bȎԘPJ)ޮEK=gbs)уJRP'~0Эݗ=&V``$pҺ 0趈,ߩ)!9p9x;9 SP͏׿4/wg>6q{"C\HފKuv3~^9;>Yd7*-J8TZ[1힥HNJ^ jf`# BrV֔A C\0=T (Y6IA QEhFMf %lh KJ|#wN(  f`Ǣ5GP )@;S=jT@ ~a;1__L:M\r= :װ=OvV61F̿\7j[Xћ!~?#Zd&TO^GAr0脵;/ÕjJc`:|R-Bǎ_R~=)͞`p5ޓNjZH#z4102PuY\=5/!!$R^|Ѩ|^ 7j68rϱtG|>(Fe*Cqm@D H?O9uq8FH[b`_,MQᅒM-A4G9'Gz$'@/)Gqӆ?ڸqgt) Vz͇ 8m /Ne}MM5]akSz]!3b5P7V&N[W 9&,u( h_KIQ,q3nu;?'o[q7 ?yGTui(P@3иܳbQCy%ޟx#ehWy'$+Wup &}T@d[G,x*Y۔v|w`"k֬">ٮM5Yρ'|1N.H2| D$T\\ 6L{ƂǕɤ)o:Ce$a4`0_9KO#iEMY8 UKJ 1C$*EPAؗ3 aˉA6 qNɥNҀ RL;\̻k ùVN'RM-O'޲oBa˽{X(C -{?TಜRYe ~pXb8:i}2l)&$b/{0R!<~ܼ wol hJ+ׯ4] <\l8[ǞplM|c,F/?_-K6u ~@/Շ H709H( 4DW_ jm=\b&A jTYJ; 9\Wi:mض "P1e%q)X*sNXHkQZ">@^? CB >|F`dkF?x^t&ЋOLSoK,_Т kMg1(ABalZhciG[iſӣ_{^ 04t_7C{6.}} n_N-e6y?\la @>ynfp ~r ?kfvZן( xi&=x S9# 7:(,7y"P $9aȒ@u0[k0V)Wn.,hd S0DjDaRZ 5I {" Rb@Ȣ]P5pAA aZ& U iYm#B4'5k|q˖k>(O1t˕o~O\Q qQM/No^nk,_KŐFcC9+тϔ2/q, 6!Q3Z0B{C@T:$@pccF A"/nj-k=Zu(UR r֭[gK`>h9pt~@@x|KJWޯW "HTnkƥK D"&10`i=˥#xC8U1+A@tcH79Z:`lBl !21jvR)@$5Ҁvx7VV mZT NT_DfPԆ¢]wޱ7\.p@n?a={ew"'"X^<oD?NyT:]󚞿׋}1a(1 I)N_y f`? WlvbP8 vZ#CVpaÏ# spޭ>p۸fMLP[ɋ4T9($#\ dۿUk"=ӎU*eqfJi⍙Ðw|(įI>o f;\3TŸb=_$@.Om[ ɥb q؛RfM"epxRp€OنZ;P ӁiCrN#c ?ܵnSR |t*yjW`QÉ澿6C_[q?RR竾0ǐ&|tĩ./Z I{;JKuB*1D- 5]B:OЀ@. 3}w`0v-^,/1`hH~# ]8}Ex,LFW< 9UYV_ɋS\:цn;zV Io ^C[ᒸ*KGHe-{ Nr` )Ž" I^3֏i?Y7~]&NZiG[ ,5&Li"LH)%&B!a3nw:J.L s(a^wУl/}ӳ:*PE ro-R 7p1>TA'V?W;) qG.։п7Yїsڈ|X\. HAPM 芵.n`ӠO.=4Hp96m&.bT#S3 >,\9s˧z;? =K'+spҴAލ?r(Уo)ýw*6xLGI'A=S,ZrM~sp^^(5|i-%xc8_i ě-3 H@h$aԚ@CA2 h4,&AcmqP =i5{C?(SiZ͛7m@,x7l:zo-?yXE@PG@JiPao4Gyul>계%MZnߤ.gfHGصIo) "T|?.wo3wGVd[T;y$~HD H'? g j pGz &anz~Y TY FV綡kjq!!~=\/̯/@m¢tmJݕ>8G`HY@IgbZiD;̜A>;2mυEځ}9ijh ްT!0@4w z\PN,kVo>7x&Dç;SFXL?Gj=s3, @`=_l+_p߉ZK*Ƭ~&WM=+Cq!M#3 @`SCfp <e-]rGi0 K%*2T- BY&kօ0|fܝ}FF\sEWAu tG ֠R7~9W'&gCLYkͤhDxt8 oRA޽«sI58}]+MV X-6 ?}/o 8@ ?@MY K,f,&'7ڗ"??^ ur^evS*jH%ps0P7P] :"[`ht%IwZ}6!S'a۶kOiME5ox W.Bv٧~ ߱pa I8|uY/QQRl] G{9tiE2feyzC0Ҁ]fZm - ठ*n f3Ĺ(@Ϫ@8l8ad8Gjܽg9@(j!k<6OD7tƔ şDz?Cw4u-f8uG):@ `|rYހ`8'Z W\G >ͱ_mH 7ɭ6ok P>XoǏ]KU+,1r>> A= P`p P]dh';1nA+ChuFH#,N9sv ] ⮃#@/t5H< zYF S' d$Ս{3͕j7 :Qq@Q3*ف Hvt[j8@+P-6[Pȵ2mn0 `|UfF``iO_O]PCعȥfZ b/XĵG?1ILUQ -_RY[E@f{VCtc &xU,} 8C,<{7Tܮdž.zs3y&a~Q& Bѹ9jeGkf/?qXa~juNօDE>W'q>ed? >P ZkʩB ~fm><P 4$5u,JPM&Lbg@$;6Ve3^w]='pΝ= M iCtd@[EuşTtYL>X?0'ʲ><in{W9(@g()({ {k v {4YXVaEPv~"Cs8׆c%x'OAt48Ÿ~ÐB҇ fq$@9B-8z#(Q2ϹS:ʸCCCgk!k`zY4,Rv~q#kյ0VNÝ͹* Ц-=PC<w 0(8::@[ #>@EivEBfǃ}R w]7׌4 h'@<w7s!`~y.?|}kVN~MRq1r3,dGz8P8X J3 EdR=0ZP?یkP3j鯮}"*zAw{|z @n^1*ळfoXu!M@VkuF.n{^d.''W^ܵu5ppc΢Yd Ždu^?&=GPƟHyl,&AT^t銫1aKᾳ,J`',3"Hyn.0n >_>F!?]>`>@۶ʁtB Dg658lSgu<ܴp~OTB  zO]`aNʸ2Qv: ftw'EAdzwA"DG@`v8섅жXAt # I77g9f/SǎA!x»%J\0AŖ !W c7qJ 1nI/ fךqC_Zu7l#kW>91حoV@>k-"!ML Me!LjXHg`A\׬RɭA-4;B*ⵅ|Fb`|O<GcgPB[0߂ʐbj _xC' u۱Q&gk𜇡Y[wмh?K7IQb!\pvAܾ+!I2 w0r=e)X?7 >x`qh^8|73T %%:K'FT_{( I$`_4u_@0_hXi4vT\)&e\Qİ˅A&-;tbR:gmmZb.D!p1'ZsSQ'nF ~S@S)ALJ0~7 5 Nw+_?>nW* @lYES+G]iыu 7,D~ş|0ߑ(fdYI CʻCU7AH03  x0QG p6uNxhgPS4`ٖjE2h>䠙O_ |뱧`zxS'# 6YB^bF="D9>zyJ&`{Н$oit4#$x4_-mJoI=C PE@\5/9ZZ&cBm*ǀI0@ohB&*Am.Ȣ 4MXQpN/6A?B4hu۶O^l6SNzhd )c`atp |Sq/` 1n *CUR;0MZ\3X2\Ks̡V[j<SDN:DUL`)Cΐkɥ`>qЭvT\ B"1+E"d!9LLjYBr`Trm{mTKP pe!_۫8~Ő*AxO|.L/~wᆭ}%C!$ ѻ# 9kuT@9?l()no(GZ}@')A| Ѝd [h-3H9/ jlk^4 /'$M@AwP+:aYs-M /즡3'jq_#ZD cN}.+?6BWEʰ;og06h-EWuL&?4RGo u 0f$kkܽiqwmj" ^4k[j0mirGNBep|_ p/‡a5$.l,,,PXN j G󰯧c֞IB&w[zd ?N)hFYX)Ղ$`ak$@F!N@hN vٗt5 ލ*s3C4tlF(F8+E6.u 08={n#ts̛9R|*9D"TF!?g\ ] |!כ `#QDT z:"b$d_a;}9)Q e8,ZxeXp~p|ZH>ΐ8JQ |Y#'it̖ Hq`|(@Ru՞aAQI"eì5,l@UoJ[p7Й:Gnf_r8t``>Q3lϹQg)@@@TԚ]`hS+;R@?Q@+ P@ySٛnyą=2sD~i!)nQ ޏ" (suӡA^YF{ Š~sXD\ j^dr_ C2ύ 6X^`s#*_^{;,,lܸ=&2!-dkֆ95?y*!3D01e|#'+iVSYA@IV+.5$%Z0H5g{H yvH-Šy q C;2u Jpz! FE-, kV`HZ$X@[<5ݔ{;(Ϝ>K<_8)@H H+X?Dp\Ilhz/sU cDn2P:2/N0|O`KWo]vh=Q]C-b?jEذaMxE4?y)&"w!g~R6S| h9}hy{zvEB!n,M+j`Е,8ۭDyxbmx:;@*l,>Z;IPI 8-4PPCA&K]>B.*JN ؽm ) "G5LcqsZ8ptX݌X[ UF 2,q4,,?:C3#-D/$HݭHaK7WsžFA`4POs 0B@`;JpMѣ$DA9px<)5ٹ*)#+> yTO3$lWAhZ\8:[ VX>qP@72@ձuuP5V`,=f[@d>2 Sj2SH E@ <UmQą/2|r2PbJ@)@&ܒ :B"U~!‹(B"SlJ;yP΂ĆABxw n˛" hLlImκ-%XQuV#ʕ+ߣ k섥 ptT82O>8,u}٠DX9yK)gUl "Q@ \o d:3Пjr=?N N9'O`ulsσRq9^!N< 4"cό$H$^=' j0Gg`BlA>`Q ]m/s80PЁq-JCi]:ť?R@.A:eް`ňZ26XY,BL.T Tuq@R5`^6,!t(}@H: Zn_o=oddӍ+%8NOO? Sp-_B~7MN10i b`Fk`/ MbBݞQD_/) bSώB/9Tµ<˶>;E +qQ%q.,Ͼo#>{g.^/ܰ‹X908DH_rO0q˅8ȉ YїKBd98[ 1*@Qm3"E H Iߋ^ ɋ< .vs{PĀe`e@z^}`$=92YPak%W>}0;-6s[ ܰNV] UlrЀB <~ +? Lx Kg'ͷ&Hlfa.M]EۃJuyaF{Po [V׎Aǐ73f~GGgBr" C@r} =< a5LL2 )]5#QuЛv&=`L)#\ ޽ _|)1Py Nư9e,@D⺈,hEEF"v;+0b!P[NPj=xQ4v ZTEO(bЈl5ܻ}Dxذō6ڰTv_ wSc?spy6/Z^ ,Tv2W}|=p^F{N@8ȉ@dZ0o[a)ſNA ,_n 2w"6 ďI^RñGj6 gdѾ|`p;F Gd "={W^\G)Ϟ,m飘a&= sB HrV$q06I=XF@ġD/ }IaPyJ9awn`PJF;UZ! RdJ$#k0Oc{z<ܤ}A{es`ov U蕩_=r I`/#to'"g)ϔ? ?wDC#@v;FO:,>zR6(S`/S_=)XZUo'Sޤ@/ ـMHٳw:rX `q!bef)Q^`vPbP4S@AjP]zI? W7rP?:~AAu`r PŗHɀKQT=2\Xnm8>z!fSiڿBy:_C`m~nH;O {Pyj KJ1M3 8tzy:cNJl\kc,q_$;1+j6pz& = 2'  S^Ao ꐤݿE |Vq$"wJ-GvmAdHHUL uر}AOE,Dz<pDqiXEX1".J(ۀ]@n@޿\Wzr_(L[ar-k5ba X?YbKT&m84WK@e2}7H-xb\pHCtt!;"a(`G$mضc5/_$V}#5"3=OUѰ7Ϯ  SY>X k.21@(j!jXE]|aGWw8z[^ qcW{8j (:6 psׁ,mDtץ\`zY#orcPԊ"_-AT 8^5XRC'..L+Tg{擟b箍Rpn|G5hZnP; XMÕiGr&'9W珽WOomNhx|]UHN4Nr,%@*EIuPtN#j:_6 K* 8Z@$` U (4cw1Qot>T*CV"D cz<h41>& y Ap+.x<_w E c7J>/3݀P bSb z[ 3YT\xي'Ua:*0DrWU'`K7㊺mYq$ (+gdݠRPD=4BucO5ixg SH87q@M+*0. H]0`0m@H[L@ l@g֜#+w4o2oہ2=f#] x$f]޵_tK+`oH cX pJ <}t9f;mO/AD8t$,<*ҥTw'^'2#(6D><[tJX*"[> \\?_Kq",4v}@@&`g `5(Otd`}̼GKHdqZ9IYqqv/c{^+pn=~8swn7B; ;mv=\i]CV:0 1$Y@P@@m )LtqH<zrsI7ڨ@9\̋5{iس.#Ai@*Ӏ<8wFsE R[.IJ/єY K%zpQ+XD@*![mD* Փ#f &PI:p7@%j OwolkrP3ӿHM"hfsS/)8q5fNƒoH+Ia}}n pPT!Rfhp:0l e-6hiOI2NEm:<&/V6Aր[4 m@˒ kjafĶ%اk5nC #O"@콄Q:q5XЗhw̸wf -M̏et^\vNEϡ`r Ui/p^BxE-"'-4 `7k4P֬ٿNL@H> H,[]^00@ Ё7ߪ I^2'$\Fz^:w o ; W/~W-6wZ+WȈ_|s)15vt]n}tzzY3GFJվM3 $rc)&y|8)P [MzD]P03i1{p)&O0㢠ӥ:6)qU)Z,b']A<RBA8xS0 yl'"PZYwӁ,M@Th7@WYrE'O 4.TuanނH0erio`@yJ"Vqu񅥌v-AG8' @/;XeieDL:?{V_}{0~X ?|ðgd-켅.;{4 P`T,-0'5KGm.~SG@"@#ĝװ7`H_ @Lq/V*#K %3PlK -քsI˥*2>;.u@`׷`?cp~λ`@]8"Ŀ@{`vffŹ#^[%#Z NA$[3X4:\2X}!!pX"XB2ED LYa[@aR"зv@ 4r4S@])84BE{+\ U P#=Jc">Rpp cbG XIg? (']:$`+X٪΋M3ʋbc(aBsRW$O->ZpElрT["s,Ƭy}i:IkF4p. 8[)sNr5e|ŁTI݆Sy@ x/@:>/qktq;}A )D ¡ >(S1̞ܹ h1 j0=C)*MT:`- Yp/TD dYA_"TR\@~$RYuk àc(.AB?:L;`vFx?z׍pb*}z̯yX\xeG`m>ǵ.-R |O&[GE{=_Gt$H}t  x*=/j<ڍ*ЀeM*L(wHzZo%: E@`ŪHZ,A6} 9Sܱ/2EQ,8v~z ]j0}EJPҎ;# k҉g I=? t;v2Q _fPgeX[1sV Fr8ПgggO+QS>Hw3Ӎ-Bf`.4)*y< `aw]EN-.;EL̴B82|?ɗ ga[߁XDCJh300&qT2Bj a}=D`К5U 3B;8N|OMs,j)@R ;"i-#NP Yԛe4~tIIKϥ*TN1I `\;w`r/6 (UC /6oٵS~Vd@Sq\.$U520cCĕ ~z ` S$r/yu^z;Pwv~~ʿi҂D/2hjJrPPt=@<=5 p\"_7h]}bMX&+q9@ˉ{X~M^27~2u|UTiAg1Pa(Emcn"e ,VC^1"Yз'6kLipr~߃a8r ;! T: W}6h9eR8 \e{ρ7@0Zb<t]522'y233IE 1fr rtAH0@r RM։)w lZ~H&=Ō@?d>% < Nu!S ɼ_ (W@h@6 ߶ kq: +0pԄ|кr޼q;2XCf84 $6]|a\_ $ \i\4N knq_Vğ.I@ A tIpΒ,o  MZ4 0]B1 ޑTvְ <__taϺ!Ӏ%@@DnCCCOƟʟu?(H7$`(Ƃ20,2$fa堃}0Qf͆a=vPfW{-v=4S=76i-B} b>Ex d hy6":3ԐK`̱_(׾(4/n/ժC`siʇ(s$),U]tZiDϕjeB-=Lܧ{)1'V6e}h顿zkP]:j@z^/I0y*`Q)! )AH f`u^̧k۰{M6d5P[_eؕfO;VzR48C,D}z(A cǗ JS+ s-C|7@ن(,(H`ok]ˊ:6Z rLVzxp,B ]j~Eams ]x8&\c?2y8y24C͇p0|[~ ˢ@ƀۭ6*Qmy'$0@b`>q[yq*it>g!OWfc3  Ҡ+B ^*t9`NFY`z̀egX̲:]*I$ h  ـ<=7qƙc?6666 (vխչrkϽX~nݺu^_WH-~mGEF RdGi8HuGM7t@!Wc'G/ | PV r@ T=/On^NLⷠhʛ8 S#%Y0@1:(7@-tt`gzS{%k;l`w&z uKp*ܷuD '߸m @zdH7'NMC89'o?8g.F.U83}VN Eڃ_-f:RA@YIRo3{akkN+)u zQ-"Z` նȿ#HXct(=3jp q&jpuP` #M\wx][7JA`VI tu ҩ5Xu?5"4кoh|Sy F0`Yeu@5w2F'%M=r}P UK/ͫ2Z9ZC|xOP:,B.?IP۱ #g~ ⋇oy!%/>{ شpFc}D_ASQ5h{LRZx~@`.,kGaK4@+ʃYztV. ]t{"D4.^"v@^{uAH?֫_d.W c9ȁ wh4B`17wgEGBZh?k`y,wX3l7O#wde/P+lZ.U2 wlYw?p}o=C $#eJqB=~t#0 ;:, VӉQ^Sl~ @.*ԱȨ(g(pcܦo. ~'ʌp ,%ejHU34ңq`Xk;/o($#y|L`i೫@8t*|? C(H? >hxV:_mG<D: uT`QUk2XS#1\jEJ yڱ<7 (:_?t6 +UYТ\ x*9 ]p* uG``Dj  10oʒLQG@sn=o>w>;,g[訮.+ЯmW@RrCDeETZҥK2 y_3|a*>uF큟'aQ`Р2ޜ5?;;0 wj$w_ (Z ^gOj:60yIہ b_@z@3WVvaK@M:?4Z2E"ڭp~~I”(+)3*l*9:j+pA &IV[n@Z{  o䃲&L'@zJ2#W?x|V8#@`@ R!-3%X`Ңt 8:e@7hދ,]_#~F(pUa\S `2Zl݁{ ~޽tXfff`rrxЅ \Y30m }NKW?0TV 87}A@/->zx,tyyCA!eKxT3N+_iϦ.emZqt@?F ǎZ(d[/ATJ,y\P4kW?JTh۟T@yVbKx[oRY4`񣿰;}I*z*@H @ WϮZF8@@ Q+1 ` $H'P2 Bq'> w0(HkjL?s'ԕg5Okaz=i*!z._ Z̀LMMC[1w,/,P|Wg8B[?7HFu8hCCjB0 _z~&t*ܵ`@_uUEr#$-Mq$@`+DjFw FAR(1VES '33v+n9Jrsv`jY+aEwrM:3ׂ/dPv'+1%B;MYmbP"2c94!2h+xݞ‰X@ڿtv8(@Ztrp4Vj.CuP|NCoڹs'UE,Sal0?t7y;1B*`g M?5b pL{=& n 0ΡQ i {._X7¦pΑwہ.@t`A@ κo,p0U (_`;X3ؐQ Y\ |&Cq^WPۀ#,@=`jغuOtivN\| "7h(W)@FR$) !!hޖm6E$ V&cT2bo@(ԛkK 7.3%sՀܭ$fȇv]}OCz8x׌<HcG1&M J.& @NyD`*1ir' Svxi0!vL׳OJk ڱ yklѫfvxDDzլ&;%Lgh5[28G@ ~E `xW#7\/|Ґq`j: h^[Ȝ/ku$o7] bA>m6VH!PnYA;Wrx[ k\^" 5eXY?t=`;ge7W\jgJ*K,e@ C>`3m"!|+si0{H&8T-w+uO;>#֙(vo&灎.ϲk^nN%S6WC`xX5_q_R _њ]'3fVghЬ@#} {@Վ9RnTZ~Q#.^~3dps8|3vxZ3`t A)Ltdֶ?8KDfk{-Z. L\7 JqHnr00aJLI @U{]wkǫRo?MCh࢐ہ)@ Epa:hʴ3ϬI=,,pYC<$H$)a2Z2 6 - -wl @|Mt#?<H"&`)[ன5Bc mʋCـ/¶mĉ}vReh&ݻwV 4^}4s\SfFw9Y2g^B>;9#B^`mmOҎİ# UKӀF81 ߩG4hFԡ8"!kވ`ʫ?ulo@Jc&UM:?ruw}-;+P$T˄c20|;j lL鹀Vہ;7 XfE(ʀh&eg4QdkЀ5sWcWK%Z]~Vh>(޳x ؿo?\͛6QǠ_iFrF\^QGVKi'J:܋R1&ͬoiNr_t>h-p/T2b7_@{qW׵py\'^f#F[ʨ[5g;@ޑt(ά%d_Ơ78T@rTm1cLiq  m0W+Y&<47 B;>ۂSs;\ 9>2|+Lqy}6l2ݷ#=HSGRKLF /C1g*-CJA Py<^_ <_3@Kp,-蓆3, =($eP-FzF q_287C? 87Be/PAFdm[nKAO @ڪ v)jOpÁYW*Nw?q^w%˜-+X,5Sxӂe0U 2k֪STT9WWRPM^Twm˂ Ai?g@7_|9{W`@5H6Կ}qh<|)##?K$](2[LV2st $uŇLߝ߷vszwm8X'+\Dg`/L'rB5,d Y.((#po/>=/O[ pE~MQb^_/EH[nc6_m&N_Ĕ6n;w/)4x$}ӿvpO#V"G`V nn<=FΤ\n@d&12hHe9P'(bu pK'Lj~ xq 5$ o`c,|۩}7c[l.ຼdt7nH iI`:'p 3𒑎0q[s"~]JL1:zK8~k%#fX" T . Y?XŽhgܾ.|u <*~-oye#clt)W?lݳ_G`&$!TS T@uYҹmhx[PX/ L ~O;baqe?`J HHY˄v`%8v ;Tߴ0!@ˀt01B-t  *a "Tj/7՘;Ep|]@=Tt.xjf Ynq]EnvмjeZ ܅p ѨIxčXn*EWMu ԛ0Y,#v~}oCa;}p.&c|A f'h^zNv`wo[͌Ҙhu쿜3INQC#I78 Ui %Sۀ?$[nm# nwF?ykJX+4@2a(`@5}0u`AdƠ `7 aD6 lqUcyd#E!]RPs&yem?3]=xTIxneZ؋d cΡArpyr,j,⡧m+w[G|I-дm:5V\}2B@%8] WQrkϔ@kp3._&ߦ?"pan_M|~!TMeآR"D3џVbdI}ֹE*?tG9g>PI>@LNeH vVp 7:Po4 1dTp#KMc0TU0KJ(s F0PMp<,ˮWKP>@*@Ju4W]eǃx1)~"o]Κct>瞺 64ۅEBh `~q CiN,|ݒe[7{DѰgBl:XMbhE'b'Xэu 0 [26ɏ(pTKQPPtBl~e<WNLiƲ VHp_ K 6u^DK VJ]vcrr@,N?xG>$ʊ(@l rv`|AI)ha)@ }ܿĵa}y4f0% C L"wnXh fn- tkXOf}=ʯ;{ 6ךp`x i8v0qZoA> X8_=nֿr*W,7%rfvϞ8Γ+l8-tDwtHȀyPw:e~t"mHa@iHp$ ~xYik+ 2VFu}?wۏ\KPDW~*"y*g[k2c6Miw@K@DT S/!Fkʳt7VTNF%lgcv{RrP"5 9ey# s9% @Ex.r|0 @X4۝H EP@f8n'aO" ן> 6v/2\KZ_ 2Tl=^|H-QQ*_MJ OO'5[%.Cܡ%`h g()GWPyY,S0WFæ=J"x|,S@gYqS] fXVq߃mW w*iSxˋ-_^NYfo1:!9*3GHV+Z=bddeBt5mm?D^[.ˀЌc )HV%(tsMg$X[րʀ2, 5a|0 6`J.üĠ 7XR` f>P 5Eݩ@rx'[l ^P>b4EnJiq3W'Ac?>y r>|-x5~n _LT`!RkGf5\p\<CKerAFpYl>-Qڶ(!! 0:'pBȯ+)vAQf1=G%y~KMtwaH"߻vѽeQ @UAul)ٳ&6l}{ x;ߕMK;}TP*[e4$b̬%d* טr ]T3{ɭ@2-v[78?:O(v\`_irnd$ 0' 2"WY|nu!b_X_}7oyG,)/up;?󷣿6k,cC 4{dP+ͭsLͬb =2~<<: >'NuݷK_qGP߆3ui|('J٧4 s[_-@n@=&τвFuhAf'VQ[p9"(LʴEh,;09+ FiH?jh{`xx= E@W,Fw2 Fz# 4ߎC+uјP0T64}%5\=nԆr#`[Н[-+LY bv@hǃRh.AZݶ|c4_/a";4>ϥq6Rf cpUz=t P-h jͩ[ptt6:OJއNp7?>,mU @;v Y72D"sUʊTHdF\)ܱ&Jh3ud0JNhT曷kt";wYԡ|6'v4|dz0p&"oB)dpv!#S%0Q. ; lߠA\ tH F39Ĺ=+e>[c9;Zr h[YIJ .¦Ӑ``8!p5ŖW1Z:f=NacדO m6…s=8|k,CcmYa ;?oZ! ؀| +iGWIV@;CNL+<|`~%3Ѵ;B?w`p֪Y/a_QH+Qt\lٲ7m7w ߝx^{;[AC\a>LS^ R ?wjMRD#X^,p%m\"0ү?Q6̾x}#L[0a-w:Ns`w1;/ѵϮל!L} o/"*mP9|)쒠nvh>7+T?jM`/rHsދzl@8FI FtmlOe !>{F. /ߐgikL9syZeY*w.1g0ϵ[*er#Zϴ|t޴ m[{gLr{{Gڝd;@ALF`6 8tV0R!)ylfBvN" h( !,@Qڅmʀ99hkY.~ 4HHP Q_9&ߧ赲ypR4 7Zb 2@>4$XƇ?wMnU\\{j\|pɠcEӋ@`vs# ޅ##̦Dm2#ꂁv`AmnP8igbbbօ?s+ Lcrl(epLSK;=4L r$܇&*JoWX$?۷>C D[pv5H+r2L 7^dܿDh] ~~ MxO:{O;UC\b`?&/mBUq+kf.- kJ&Bb 7F+qPc8AЈp_{ndt۶έ8>{{ ?ؗsRL_V{qJ0"Ы4/Х&\, )A,,pG![Ք 7X99jԄJ)P~BS;k3Jv1wWA3P\x"N;^C81щ @@I'}/\@kqc2lr6´=Ps끊?!>~)f f6+_h9Q}6\ ]DGPV˩_+wH mU8?<R n8pv}pЎη}%ST*AHnWї6>*4lhpG&`p U@D0*-X$7 BW0uN ޴^2 3ǓݰLhOytavkp9@ue "pz Wk$Lz譗V&+#l|O}W_c~{iƿFZ9e2tQh4h:FT/ Tr,# :4l)_]і gJ;6=kvg|^xoEb-}S Tp8(*<)B@CG3ȕ\tY_M<#ÞQ8(}qB] Azoh=5M7W 044Yjҍ+P`@ }vRrH1U)Xw཯bT^|M`ڊ¶11vwΰxo4U.tQfU@VO[? `G.'#,?2{M+~vdğf]k"1Q7e]kD,Q)%0(۫|3E{mHU?\ڑ"Qos.(#x^ i|#rJ tQhh$"⺵d=V5 krZ R+Iђ)lȯO$ DmbSiA1}/Njgn6vU= aw"+04k1tFn-[nzudN: tD6snP ~rDiuJBkPbey>+o%g4~4q P3f5Z)i?}JL~$pӖ2L"Ǽ<OPnnܸfOg4fp^+oyg_i0@F@pC(,@ \.&ĺh~IH' kRJ]8`F;'rШ@)(RFu!5m.%‹s'gU݌@>ֺf`[iXY!F:S"\9ڀiѱR.3\>zIx_N o~77Gzq\7 ؒK`0)o: ^@_XWJg&򼞾"K5bNJkijLU~RI!7vֿ])ǎWe\CCztD Aفqؗ2_k0#&8(T}[JBƄbdCh%!Krr9``5𖀦 d~\:K~fun=s|Lܾ9>DWSjcenY wxi]e}J,m^X@7#Pfc/٠;'n?"T#`U;x8s@ņ<ϸ}/\'2\;)3\dm(Њ?>:-ڼ+CYE7B%?g{ZϡAkvݙϛg~%5$Dx@t4~lp U.ίt6ckdiE ՑA^%tZh8l)nI@0,)U WnE.;z߀[(I3ZGҔZ9X?LG\pI>>O2hYێr $y=\6z!x Z:Cͭ޿_Q3" sZW }SYn^{1,#G gZpw3(pr[l3Nip 8 FR=(8 D;#v\OcIDAT&JBDF@7 phIk8 9 K^NRJMR : @[w|%`.j!rbgؾn4΋ 8  oջ=s5zP"2$jgn{mn7S\T0Fxz^#|͌ s|УMS}-A1ckdƕx*#ԿSayuzMib#jgU9E%=;j0?״ m!#'i=&m߷+3Z ԏ͎ȧ/=/F9Xg+etaKEY+N Xies Y @uKڑWmjG)[H;99H:rC~/M;e;+ 0J!N) (Tѿ(?g`;vf-Zת5eI}=Nznz/g} XbT)d=Ryf'^ (n1d ݰش_[w88h ^""">`ng9K-4GqSݏ\}Q/nSC@Z7Cpq|ͭ;޲yzԹ=Yu<Nj/ ꍬW~3!$i*QgPвa&pl Kc^X2h,FGaD0Tp"srВN kETWN3~`!ӁFj-zOʋY&R"Ms{Q\2X$J >tG0?>՜zjQ U^`3/R @)I@Wy'x=K*3K0iYzź(,`Z͉_ ensT4NTkMwηűEwy/v ]wjuۛ_zCҷj 2=8VL48ƅCz@2 d@q*hVYc;dV*U'?Wf֕6'ޯ2FwZ_t U T1t'M04k>-@sjj ym _W|u\$\>Ei `kˡCRSk,4X^V6mx 'Ͻ{\ }='50~x(tG@%jJ=yEځ+uA,ᖼ%;5 BNwHMY>ԀZC%r \v 6XI`a``khŶ."  aVX@U4,,-:FWor. Pp|EpUg ǖܥ{`Ƥ8d~80{ gcY@HmipW'_3u2H{ISڟ=\Kscm3돤Id=ck\Fİ}޻w{̥.s}4Pw7E>g `2(1B)@ 6\ZHۃ K1̲qzE T*{T5A( (du kCo h@uB`kbr D,*Iĺ -É+Cɕ> klsv%2gKICGO_5*7:헪_xYNRޱ%N?~NT y@%f`O @Z^)B !cW 5l&06<[7r(>f'IX2R1d\5 pY Bs+28(K9hQMnT6+ڜIm@TF}?m[m#wy{95Yß7E".(vJ:?z -֊ow'Jh8+P-4qطmv, k89((3|nO@yyk!5C1{Ծ(R7t =*]3} E؝|XYp1z~N?u(tb$C4H:<3YixX}~2 0^j]=W@OǴPR >RegiK $Y,LR_2~*Tr/LV|9_6~F;4~txE<'vݳ5~ז{e=yucx/z]>.k ?sKKW x>ߤ  % TQA~l6N{`IɈañN; jA@wA(;5MpcVN`z_ ](.kD{| h8;7+M]CApPSa1G h"w~'kGno:;d- 4YyD~ A'YX;We00u`cZzzmkdε2#YnEQh2~Isi'X/M#3JRG}T3JY曔~ E~t6kP_kUN{o\Ze2=v: p/?=B aB JW@:BNB,.P)PB rR IIa&Q&N2yMnW U$H`4D2h_4b7~BQ |]>p Z/]|嫠mM.)u$CbFާn/io+OtB͎jK#OJ2d@@*?r5UZq2D)Z{ڇ!wOe(o/a; Dq+mBi C549/(pg4JƩ%!:eϘR/?,Pgm dF?$fWsf;^ÝMO~N@caA hn xD UxF+k2ͪ`)Н 5ihoöH@$5(Lѱҋ%8 }ue\ IT.[pO]WFV24-_O~*b0I@4}<#@l 'q_G{39Lܴ䔖@pP}e}؇)eOe.3cbQRF2:xK ӿk%趢ؚ_UZ- h8"BOCGKOa?׾G%v" Ha;^Wφ]:]Ȕ=_F[r*{bBF=l h-케vPǠ# } q1 )Z8)jKҚ$gcF3VS8rjhYn_}cߏZ}9ܹB5B1~)RJ%"ޤϥ}\iWT:,'w=Fq4zo;;6\K@Dj\66[ A( A`00?ы2JFtss8Np f-YM Lxr0@#I3RdY TS.k5ؾEh.f J5[9XmU2? 0% HP7<18q8?5F @8 L2pҰ4vi1y.(W\LCJs9їO)<ˮQ;Ҡ>\})Dz=D~R*J)s(I/(xsPo&&LȴK9|ߠVebm~菪W$IBTMBK;q cw%?Tg{| =}I1;x!D1 m L P֌6e> (-xfX/~_E96f LNН: #hQE-B$  pBЛtn*h`i8=ǏM?PTX<&ТaD'mBg# KԘ/rCOOqcDet45l\ \8 <:~/= 8.(]+dZ5hZ9.)q3şs{_^gKN;V}#XCTfB 4K4~L5'UhT޶}"b}p7|FyBVbžUBQ/#=׾V{eE=WzߞgE{^U5OCP`lgMRf\) ֈW2c}Ȩ>Kә̩sBtԎ!v.I:/q\CP^.!x_2Ə秓1؇lPOu5#6Űu(T:.ћ}3?.FFA`).Ms?4xVLm@?n4_]o9)[Q8A(be-+^  K-2 t2#&В7qtd qIg#@p)c5lҼA(l]i8$&a1)(i3h96TAhe$ 9 Q)cyw(/ u/]B1a(Xf"'^@\P פh6. #s#_Ut忩p?+WO?Qa9&T&-(t _NᙹqkXXyi!&e a1!عi Ƥ.޾ 9-(2[&Hw\MHHDI+i ŴV`)cg .+ɧ'a9t0Qt9q>ܰLaM:&SqEr=P[p Te):[p ]7xuB`x pj#TIuź?QB4FǚfYb!' RxHFDĿ">1>yv~֫"#KrCF㖟`ooaoI1{zr%ߟN sSkI/7Vvubk$56ń>B:(f,f@@ա=SC  0I ChJ'\sICEU! 5ڜJDSא)n7\ga"~Q!':&Uw $jx]/KvJ;P q"8E4Њ=*A9J >ALkm8zj}ګmh1~@TK;X&$rj 6XWyljA6sK~۷H}e՜пMN ?tO䭩pe`Q/_ ^Jp$B ,.q˥@@a'P-AFpU&)B=?@5jɏ6EPjZr%$:Ї ru05#v={ X] @9pq< ﳎ Pp2\L9TQ?,UhCUDw|>IyLNN/HGG3+1P UaiKWlM ys^[s͐S}9GHZ1fMèti%;; ث=p޵7t7ep??52Nt1TZ.tfZ>J|LfXLYke M =Sc$03:ªC@%Ah*"3֣3icWc:01LgF-m96k鍃9Fg@n"ahz[dNXy /qNt}w7^+˼C`^7ίˤ܋m>Rg@EOE_;$g.ni.  Ɔ)(qR:iP*M ,-s&>\@)b5NW׶c09Zbp@ĉ% aJc] l_9^LjAf5xÙ.>\{5XK7}j/8loc5SC04?_sy0CC=:sD#Ưh&^:E}nٳlh,Y TʜocS _s_'m5Qu?,.D/yI/.ͷ_}܋n\^?}p_N_|<hOێ|ZNhfUh< PkǍX+0D!gzK679@Gjɋ%Jq{ö },DEےt78 {7ۈl^ 78D%]imDי2*u2 $M6"O74 pOc]Unq~(zVe_ǀ~q)r)&kR}??5{W9 ZzH@~cGEpMz$]p )zd|x%@-,8̸4ťT>=5LCD]Hzɑ8č? TLJcw9gy6f7Τ21sK:ߋ֎W`?`=DxQxyMS>u=`E9P`+M8vf$J/XT~+\ 1ZkF#%@}?ȍ<=;_WeR9_/~i#x[_ێ}0ɒߎ73`j<@QnLj J-Q\5$ȥϨ] 4A:\Q`|0R ;P=Da -!,fq0Ϝruܨs / pлAkA3 8g1Ry_/] y^nCcָڈS#~dz3D $5KH^kԙ%xyE-t˜ `JUµx4~s '/uK2l֞99/#=5>``])L^E"d~a7Зi:+*x > Wj)ܰ)}LiszdP"Ŧl?EᑙSs~qCfp.Sכ |C>D|@lۘ{^zP iv 8 7 9FfOtÌWY[peEI,Ռ`UHo]l`!;N2#LHHzȿzM h羙b"H8ŀ{y 6nC+Fxu7Hu`AuĞrWyA`|L©sd(l䳥N@)1 rI2y*!|t׻$^?:VO@>x-i#D4~fniw0])! 7#xt߫=a?kJ)m\|;D-b!/l_\;FZ(>/rXYoeK.Aidža rF-c1Fxm*I(cv]78AL@|Dr5 P+x|t`:A.bo ܚߖ i%`|X\tHs,&Ў8Ǐֽ*OX RBd83 8`h}p{ 5FzrCr^):떟k~F"e߲٤ȏ\f6"(/{{*bjC2)*-90(sgꡈh rkul FEQ5m0"Pز U"8U`J#eeAd6} uo;Fy~fD7k.R4Qg o~R4baOc2ڗHO:CbhtF4EeNBgT`Ga*آKa0b( K5()OC1hGHoVzd iOWwGo~ u^x),(ͼLIjJˎE"m?&Z Hg(?ȏ8 ;ԫ8TB&9paCgΟ@.c";b~w|!+u!{&zdD b.oQ@2~}3lv4D>p(~ouWBTJ ۖN\\E1i]RIŽ,#()_5:%.ЭFW{㟻hr9gGI6LW+6^tJDg~ @?^éx{wZ!GUVAa4ƠNi8xl{*ku0 `‡Bt1 %Ȗ ðq£!XNR>cXЦ,*q^En >7VXqAz1Aw!TifNP4 <7Wd#6|=EY =O-Õ5!)$ĴˉȠ:z wps'Et>['*+oH>{@!iTTӅdl7JQ%%4B_K}]|-#mwfL 'X}e XƠ<ԣ0k4z'J3 t2, p rT##!fT¹!,#s]#Lq329y6vZsBn/4aNzz)n<6+{v~u:(e8ą37qRĤsHAU8sa0\VbyAA@i. ڎd?6"W^W?RZ]?bO'&歯(kb{=s_s}?<?XXܽ+ 3=ݳh$[-bxAf 6`(f1 LBB @!Ʃb+~JUHKBmmI2gwsϽ{xٺU=;wseo>,J maטCY bp!70禕Ѕ/NAzan ]~knU҈v)t,Vg9X苦$ ;a~<gŏmc~ t)$__ُdb|d# =s b3,=@6}NƶݙKSIH+c ]p~?!#i>Sbd14]%8o3+DaZ\<uo {@ /|08x2)!Z(7M7=,.&M7y(z H (}{{"7%Ÿ$xCe`H .S nl hXl^D>Y8VB=̅V;COXVѴ耕 )rZBa;Ec-8eۆŀ} ŸXx+6.?)ml2|Fk`+PhrW&)dB(=- كN oz\;@zc{a^MGZ ãT5pۜ+p2ʀ<'Ƌ8hWX|O)mH,q y*1y|"$('Ax7}[`KYmm}]Zh XZҸa&L#ceb 9 "G> ~ P&GGJ~jmώk_#4tEP V{uC?{?%#1J@$rQG 8 ܣÂi}A-- ,,(}_"tQGPvj*W¦>4Xъz4mF[q[PdF ^Pr v>O'$oO)fE| kۤ "xDtf*xJsv1Ɵ7tOw z+PLȰBzsd$7~MҧmMxjwp < j2`۹bFioCPg{O*nls@ [RMe]cZ돯;]S)$`DV a4@S_d,.*V*P@ԶVxrS<2TMC=[MbcE7C>LL[jR`QO`>Ori%,˞mn>~Y(w[ũM o»~܁i~ؠ#5s0ybuhЧ-=,((--K%>|گLn_,з}D%jo} /gwZO G-k"5F?`@2E(v8X K]r!&&ߜxOduOBvwf @/B9.hO5uX0V͆ ` lXNQk"HڔQnFƂa[ă)MI7Թb g ەVsBnXv2GZrc|d֗]>@>{pL,M{0[ZKHΕ7 y$N.Ym%>ƂyWԳߎ~ Onܓ9ϜoiS}5jM7 =ĝ~[/D2?,_C]FtZsS*n3:$xKy{S=02y+1R HYXYo[CQ80Rgpi4# =|fkL4Z[ C5,E2sT墪)P(N5**e}+N }Kp<9mЯ-2 i=:DV>)-\YAH8s4|Q$jdBwu`6ׯo5tqpC=]qRnluk9쯃⢹=oxޛ%, 'J$RbȵyN"9g{+BMab>7,5 Z-`i y#hQϺ 5?aP ` }=3 N'<8!gg} =.nCMvArV\G sp>B[7V`|CFJXRp฀a<Dà2vnpx @އTCxH>J1ҏ_8uXFl6TSc]t=n;ߑhk]x'[wHl*"ݱOް"~0D2*vc dP2\+Uo&VpO skfUF Ƞ Mٱ]Hb`_+PJDRwDt_"Bq1}1ACV-8||&&avi/#e7 #HbHⰀ#wP2lV 8D0€Ml0 QH7tC88w\\/҅hwֻÆkMM.7s! E:`t7@0_@՜Tdׇ"`Y8DL ǧaRfJ8SxJfr18>+9d)c (mM`ۀ ,FaSns'-V?33We#L53pj\Yʇ} ?اy=;<zZV;%??o~)T>_zZi7p8qHV_C ʰuR RaBT >`A.Ɲ0H~^!0BSѱf]U2I6e,Xy#c+X.]Xt\NLC!cV2eq񻴵G_풦32_i3񘵤„&7K!mD | q> 'RӖb}3|ڋ rӳl}ρoIʽyjuZZ~<uJ( a2*k.}՗5KJƸ /0 ?ǹ9KUhs]M A-+X^F ЀsWo_Q)?F|TO[z5]u'xd.N1"(h;dk"в U~fcWϦ ˎ̂s$ "0WD+ ڴqHmĦOrgEgi>o-͝g  kA/@O+w~gt|pKu*>ZŴNi@~%nE<í7_y2 T+%vy_)])/HiZA+g{X X|d W1(ݣ.ؒHM7ZBO`Y4dO)S6 3vY<#'6߸s\,yjTik1w `E ?ֈuJ*\!돼ҳ#l\'bR"%e lCiX%o4Ä e"Ϭp`G" H@ʸ 5ōDmWR)+nP x/bv?g!p X?Rο&bc=΍&6s(^p s;&azʔӡH9egQoz+Tco}ڤc1~ RzM~{nkwW\]~Zӵ ~'u*N %ŝ .9?>T?´*9_@$+AHKLB֐Ro-І8[-τ ZxF"pV -1u Oy-^bK =@'pa[*D!0S^ oWE3 Ϯ:fp Sݶ s 4~IR"B >=OJp~x2%[߳eCGf6|dn,L[}|8>kZ/?'zΛ2qdR3Dz /=rea5(b$ M'. < ' B )N3\ez (n.8@'`*d'<0#"@0u)` <9HA<|T*1,,-J7QϹŷBlC1,H/|&oA֎-*p'Lj1V'<)qq{b7&ppϻd驿užW0׿pT`v~3 `n=RZXMRc]s&Kd6ʀ BR*ẋĔK- }Vhr@` WN f; - l@'!LWL>ϋ;l}W[89`*7^U}׵G~ҳ;MtYV=Q""x^0|\qS ;Vea1aFµ# xw9P>]P7CKco }KY{֞yT\{g]~'¦)QD0ӮV?~m"[־:ZWiw_v"@ .|WJIôăQkJ#ނgzr1,)&z 45հ)+Wx OhC D]l0exĪ=YʹY}}6ԅiS Mth >)xIB~`ɔiKpxj_Mcթ]Dw]p[L7k+#O6"NNs\%/l` 8SS6&+ i|*߹pLs>2kHz rT~9!.8 '4AHI g{H&A/Xk^uGgUU"3Qv94Q n0WضMŪe0VAd> yHQHBxu"aY$,nbe@B[Б‹R[?|W.>G?)e ~W;N?8\u/H&0˖YwsWiZ^x Y@l9;}O7>u |Ϣjv~ ެj Nj}?-bz][{͕1:pY=pPD;@X um?|AW;_,{%Po!~|fa0,% +-\h!F o}-(KBϢTȓ/ ?: 0z~&nHgtW;,j>Ŏq=jk-@!+ߑyDɗ<]$c\N7\HN/ /Uv@|V =W8]Ǧ6}?~6k_9 m~jLZ|V,ʷ[?%{]>ŗMY.Kb0k؆f2"0%jKCX`W <_5@>3#`S-BY ?P̂{#ʇҰ_%d ȥIt-ypi] /!}1~]8'x$*'~ {`qĖ֖>\R̵`?owlS-[z:8Xxk= ?'zbN 6֥>/I=W^t_-uWp=yL}X! {ӊ>sGǨSV?+t$[ܼ_Nj {~kWj*e؃`|a?q8~pCg Z +CQ)(d9`ޯ`> )[ruJkw1&=O lʣy'Vޏ:VYĞMx-arF_ܓ\s.sM|Zޑ*W{@(@+@A7cҝ8,XBa KTjsGoob[rϏwCV) dj6[kq2K`N+-k8t4jy wxao9y a6 , ֋6¾΂_\DE"< "D0d"[RV&zzgrցw{. {~hNC=ǧ:z. #p[b;.:2fsf1& p@ ׶]mX&/,+ ~ S===q=!^*e+USoS^v8թ]t{͋+J,]tbz³Nv/Nt0sj_#~ـ ]2vD#H$.ZvjtߛEf6vkdScV5 `*||z!\w7l8,Ͷ/7/h6;ak*K!_DɆOU^K;`J<]./,W*{ZNkE0-P8.]ǿG}+ǫLd_:quJKr:T ## Project : qwbfs ## FileName : qwbfs.pro ## Date : 2010-04-04T11:04:05 ## License : GPL2 ## Comment : Creating using Monkey Studio RAD ## Home Page : http://code.google.com/p/qwbfs ## ########################################################################################### TEMPLATE = app LANGUAGE = C++/Qt4 TARGET = $$quote(qwbfsmanager) macx:TARGET = $$quote(QWBFSManager) BUILD_PATH = ../build DESTDIR = ../bin include( ../shared.pri ) CONFIG *= qt resources warn_on thread x11 windows embed_manifest_exe app_bundle QT *= core gui network xml include( ../libwbfs/libwbfs.pri ) win32_crossbuild { exists( "$(QT_WIN32_PATH)/lib/*fresh*" ):CONFIG *= fresh } else { exists( "$$[QT_INSTALL_LIBS]/*fresh*" ):CONFIG *= fresh } fresh { !build_pass:message( "Using system fresh library." ) } else { exists( ../fresh/fresh.pro ) { !build_pass:message( "Using bundled fresh library." ) FRESH_PATH = ../fresh include( $$FRESH_PATH/functions.pri ) FRESH_SOURCES_PATHS = $$getFolders( $$FRESH_PATH/src ) QMAKE_RPATHDIR *= $$FRESH_PATH/build macx:LIBS *= -F$$FRESH_PATH/build LIBS *= -L$$FRESH_PATH/build DEFINES *= FRESH_CORE_BUILD DEPENDPATH *= $$FRESH_PATH/include/FreshCore \ $$FRESH_PATH/include/FreshGui INCLUDEPATH *= $$FRESH_PATH/include DEPENDPATH *= $${FRESH_SOURCES_PATHS} INCLUDEPATH *= $${FRESH_SOURCES_PATHS} PRE_TARGETDEPS *= $${FRESH_PATH} QT *= xml network !macx:qtAddLibrary( fresh ) macx:LIBS *= -lfresh } else { !build_pass:error( "Fresh library not found - download from http://bettercodes.org/projects/fresh and uncompress in ROOT/fresh folder." ) } } # define some usefull values OS = $$lower( $$QMAKE_HOST.os ) QMAKE_TARGET_COMPANY = "QWBFS Team" QMAKE_TARGET_PRODUCT = "QWBFS Manager" QMAKE_TARGET_DESCRIPTION = "The Free, Fast and Powerful cross platform Wii Backup File System manager" QMAKE_TARGET_COPYRIGHT = "\\251 2010 - 2011 Filipe Azevedo" PACKAGE_DOMAIN = "code.google.com/p/qwbfs" PACKAGE_DOWNLOADS_FEED = "http://code.google.com/feeds/p/qwbfs/downloads/basic" PACKAGE_REPORT_BUG_URL = "http://code.google.com/p/qwbfs/issues/list" PACKAGE_DISCUSS_URL = "http://groups.google.com/group/qwbfs-discuss" PACKAGE_VERSION = 1.2.0 isEqual( OS, "windows" ):SVN_REVISION = "N/C" else:SVN_REVISION = $$system( export LANG=C && [ -f /usr/bin/svnversion ] && svnversion $$PWD/.. ) !isEqual( OS, "windows" ):system( touch $$PWD/src/main.h ) CONFIG( debug, debug|release ) { PACKAGE_VERSION_STR = $${PACKAGE_VERSION} (svn$$SVN_REVISION debug) } else { PACKAGE_VERSION_STR = $${PACKAGE_VERSION} (svn$$SVN_REVISION release) } # define variable for source code DEFINES *= "_APPLICATION_NAME=\"\\\"$${QMAKE_TARGET_PRODUCT}\\\"\"" \ "_APPLICATION_VERSION=\"\\\"$${PACKAGE_VERSION}\\\"\"" \ "_APPLICATION_VERSION_STR=\"\\\"$${PACKAGE_VERSION_STR}\\\"\"" \ "_APPLICATION_DOMAIN=\"\\\"$${PACKAGE_DOMAIN}\\\"\"" \ "_APPLICATION_COPYRIGHTS=\"\\\"$${QMAKE_TARGET_COPYRIGHT}\\\"\"" \ "_APPLICATION_DESCRIPTION=\"\\\"$${QMAKE_TARGET_DESCRIPTION}\\\"\"" \ "_APPLICATION_ORGANIZATION=\"\\\"$${QMAKE_TARGET_COMPANY}\\\"\"" \ "_APPLICATION_DOWNLOADS_FEED=\"\\\"$${PACKAGE_DOWNLOADS_FEED}\\\"\"" \ "_APPLICATION_REPORT_BUG_URL=\"\\\"$${PACKAGE_REPORT_BUG_URL}\\\"\"" \ "_APPLICATION_DISCUSS_URL=\"\\\"$${PACKAGE_DISCUSS_URL}\\\"\"" INCLUDEPATH *= src DEPENDPATH *= src \ src/models \ src/qwbfsdriver \ src/wiitdb macx:ICON = resources/qwbfsmanager.icns win32:RC_FILE = resources/qwbfsmanager.rc RESOURCES = resources/resources.qrc TRANSLATIONS *= ../translations/qwbfsmanager-ru_RU.ts \ ../translations/qwbfsmanager-sl_SI.ts \ ../translations/qwbfsmanager-pl_PL.ts \ ../translations/qwbfsmanager-zh_CN.ts \ ../translations/qwbfsmanager-he_IL.ts \ ../translations/qwbfsmanager-da_DK.ts \ ../translations/qwbfsmanager-sk_SK.ts \ ../translations/qwbfsmanager-ja_JP.ts \ ../translations/qwbfsmanager-uk_UA.ts \ ../translations/qwbfsmanager-cs_CZ.ts \ ../translations/qwbfsmanager-ca_ES.ts \ ../translations/qwbfsmanager-ar_SA.ts \ ../translations/qwbfsmanager-fr_FR.ts \ ../translations/qwbfsmanager-zh_TW.ts \ ../translations/qwbfsmanager-es_ES.ts \ ../translations/qwbfsmanager-de_DE.ts \ ../translations/qwbfsmanager-pt_PT.ts \ ../translations/qwbfsmanager-sv_SE.ts \ ../translations/qwbfsmanager-it_IT.ts FORMS *= src/UIMain.ui \ src/PartitionWidget.ui \ src/ProgressDialog.ui \ src/UIAbout.ui \ src/PropertiesDialog.ui HEADERS *= src/main.h \ src/UIMain.h \ src/Gauge.h \ src/PartitionWidget.h \ src/ProgressDialog.h \ src/WorkerThread.h \ src/qwbfsdriver/PartitionDiscHandle.h \ src/qwbfsdriver/PartitionHandle.h \ src/qwbfsdriver/PartitionProperties.h \ src/qwbfsdriver/PartitionStatus.h \ src/models/Disc.h \ src/models/DiscDelegate.h \ src/models/DiscModel.h \ src/qwbfsdriver/Driver.h \ src/UIAbout.h \ src/wiitdb/Covers.h \ src/PropertiesDialog.h \ src/Properties.h \ src/ListView.h \ src/ofi-labs-pictureflow/pictureflow-qt/pictureflow.h \ src/CoverFlowView.h \ src/models/pPartitionModel.h \ src/models/PartitionDelegate.h \ src/PartitionComboBox.h \ src/models/pPartition.h SOURCES *= src/main.cpp \ src/UIMain.cpp \ src/Gauge.cpp \ src/PartitionWidget.cpp \ src/ProgressDialog.cpp \ src/WorkerThread.cpp \ src/qwbfsdriver/PartitionDiscHandle.cpp \ src/qwbfsdriver/PartitionHandle.cpp \ src/qwbfsdriver/PartitionProperties.cpp \ src/qwbfsdriver/PartitionStatus.cpp \ src/models/Disc.cpp \ src/models/DiscDelegate.cpp \ src/models/DiscModel.cpp \ src/qwbfsdriver/Driver.cpp \ src/UIAbout.cpp \ src/wiitdb/Covers.cpp \ src/PropertiesDialog.cpp \ src/Properties.cpp \ src/ListView.cpp \ src/ofi-labs-pictureflow/pictureflow-qt/pictureflow.cpp \ src/CoverFlowView.cpp \ src/models/pPartitionModel.cpp \ src/models/PartitionDelegate.cpp \ src/PartitionComboBox.cpp \ src/models/pPartition.cpp linux* { QT *= dbus LIBS *= -ludev SOURCES *= src/models/pPartitionModel_linux.cpp } macx { LIBS *= "-framework DiskArbitration" "-framework CoreServices" OBJECTIVE_SOURCES *= src/models/pPartitionModel_mac.mm } win32 { SOURCES *= src/models/pPartitionModel_win.cpp } include( installs.pri )./qwbfsmanager-1.2.1-src/qwbfs/installs.pri0000644000175000017520000000556411546152625020226 0ustar pasnoxpasnox########################################################################################### ## Created using Monkey Studio v1.8.4.0 (1.8.4.0) ## ## Author : Filipe Azevedo aka Nox P@sNox ## Project : qwbfs ## FileName : installs.pri ## Date : 2010-04-04T11:04:05 ## License : GPL2 ## Comment : Creating using Monkey Studio RAD ## Home Page : http://code.google.com/p/qwbfs ## ########################################################################################### unix { PACKAGE_PREFIX = $${PREFIX} isEmpty( PACKAGE_PREFIX ) { macx:PACKAGE_PREFIX = /Applications else:PACKAGE_PREFIX = /usr/local } !build_pass { unix:!macx:CAN_INSTALL = 1 else:macx:isEqual( MAC_FULL_INSTALL, 1 ):CAN_INSTALL = 1 isEqual( CAN_INSTALL, 1 ) { message( "The application will be installed to $${PACKAGE_PREFIX}" ) message( "You can overwrite the prefix calling qmake with parameter: qmake PREFIX=/usr" ) } else:macx { message( "The application bundle will not be installed into $${PACKAGE_PREFIX}." ) message( "Call: 'qmake MAC_FULL_INSTALL=1' for install the bundle." ) } } macx:qwbfs_translations.path = $${DESTDIR}/$${TARGET}.app/Contents/Resources/translations else:qwbfs_translations.path = $$[QT_INSTALL_TRANSLATIONS] qwbfs_translations.files = $$PWD/../translations/*.qm INSTALLS = qwbfs_translations exists( ../fresh/fresh.pro ) { FRESH_LIBRARY_PATH = ../fresh } else:exists( ../../../fresh/fresh.pro ) { FRESH_LIBRARY_PATH = ../../../fresh } !isEmpty( FRESH_LIBRARY_PATH ) { macx:fresh_translations.path = $${DESTDIR}/$${TARGET}.app/Contents/Resources/translations else:fresh_translations.path = $$[QT_INSTALL_TRANSLATIONS] fresh_translations.files = $${FRESH_LIBRARY_PATH}/translations/*.qm INSTALLS *= fresh_translations } macx { qwbfs_qt_translations.path = $${DESTDIR}/$${TARGET}.app/Contents/Resources/qt/translations #qwbfs_qt_translations.files = $$[QT_INSTALL_TRANSLATIONS]/qt_{\,[A-Za-z][A-Za-z]_}[A-Za-z][A-Za-z].qm qwbfs_qt_translations.files = $$[QT_INSTALL_TRANSLATIONS]/qt_??.qm qwbfs_qt_translations.files *= $$[QT_INSTALL_TRANSLATIONS]/qt_??_??.qm INSTALLS *= qwbfs_qt_translations } } unix:!macx { # binary qwbfs_target.path = $${PACKAGE_PREFIX}/bin qwbfs_target.files = $${DESTDIR}/$${TARGET} qwbfs_target.CONFIG *= no_check_exist # desktop file qwbfs_desktop.path = $${PACKAGE_PREFIX}/share/applications qwbfs_desktop.files = ../packages/QWBFSManager.desktop # desktop icon file qwbfs_desktopicon.path = $${PACKAGE_PREFIX}/share/icons/hicolor/256x256/apps qwbfs_desktopicon.files = $$PWD/resources/qwbfsmanager.png INSTALLS *= qwbfs_target qwbfs_desktop qwbfs_desktopicon } macx { # binary qwbfs_target.path = $${PACKAGE_PREFIX} qwbfs_target.files = $${DESTDIR}/$${TARGET}.app qwbfs_target.CONFIG *= no_check_exist isEqual( MAC_FULL_INSTALL, 1 ):INSTALLS *= qwbfs_target } ./qwbfsmanager-1.2.1-src/shared.pri0000644000175000017520000000277411546131113016506 0ustar pasnoxpasnox########################################################################################### ## Created using Monkey Studio v1.8.4.0 (1.8.4.0) ## ## Author : Filipe Azevedo aka Nox P@sNox ## Project : qwbfs ## FileName : shared.pri ## Date : 2010-04-04T11:04:05 ## License : GPL2 ## Comment : Creating using Monkey Studio RAD ## Home Page : http://code.google.com/p/qwbfs ## ########################################################################################### win32:!isEqual( $$lower( $$QMAKE_HOST.os ), "windows" ):CONFIG *= win32_crossbuild CONFIG -= debug_and_release release debug warn_off warn_on x86 ppc CONFIG *= release warn_on CONFIG(debug, debug|release) { #Debug CONFIG *= console unix:TARGET = $$join(TARGET,,,_debug) else:TARGET = $$join(TARGET,,,d) unix:OBJECTS_DIR = $${BUILD_PATH}/debug/obj/unix win32:OBJECTS_DIR = $${BUILD_PATH}/debug/obj/win32 macx:OBJECTS_DIR = $${BUILD_PATH}/debug/obj/mac UI_DIR = $${BUILD_PATH}/debug/ui MOC_DIR = $${BUILD_PATH}/debug/moc RCC_DIR = $${BUILD_PATH}/debug/rcc } else { #Release unix:OBJECTS_DIR = $${BUILD_PATH}/release/obj/unix win32:OBJECTS_DIR = $${BUILD_PATH}/release/obj/win32 macx:OBJECTS_DIR = $${BUILD_PATH}/release/obj/mac UI_DIR = $${BUILD_PATH}/release/ui MOC_DIR = $${BUILD_PATH}/release/moc RCC_DIR = $${BUILD_PATH}/release/rcc } # Mac universal build from 10.3 to up to 10.5 macx:universal { QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.3 QMAKE_MAC_SDK = /Developer/SDKs/MacOSX10.4u.sdk CONFIG *= x86 ppc }./qwbfsmanager-1.2.1-src/libwbfs/0000755000175000017520000000000011546156115016153 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/libwbfs/libwbfs.h0000755000175000017520000002143411504137677017771 0ustar pasnoxpasnox#ifndef LIBWBFS_H #define LIBWBFS_H #include "libwbfs_os.h" // this file is provided by the project wanting to compile libwbfs #include "wiidisc.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ typedef u32 be32_t; typedef u16 be16_t; #ifdef WIN32 #pragma pack(1) #endif typedef struct wbfs_head { be32_t magic; // parameters copied in the partition for easy dumping, and bug reports be32_t n_hd_sec; // total number of hd_sec in this partition u8 hd_sec_sz_s; // sector size in this partition u8 wbfs_sec_sz_s; // size of a wbfs sec u8 padding3[2]; u8 disc_table[0]; // size depends on hd sector size } #ifndef WIN32 __attribute((packed)) wbfs_head_t; #else __attribute((packed)) wbfs_head_t; #endif #ifdef WIN32 #pragma pack() #endif typedef struct wbfs_disc_info { u8 disc_header_copy[0x100]; be16_t wlba_table[0]; }wbfs_disc_info_t; // WBFS first wbfs_sector structure: // // ----------- // | wbfs_head | (hd_sec_sz) // ----------- // | | // | disc_info | // | | // ----------- // | | // | disc_info | // | | // ----------- // | | // | ... | // | | // ----------- // | | // | disc_info | // | | // ----------- // | | // |freeblk_tbl| // | | // ----------- // // callback definition. Return 1 on fatal error (callback is supposed to make retries until no hopes..) typedef int (*rw_sector_callback_t)(void*fp,u32 lba,u32 count,void*iobuf); typedef void (*progress_callback_t)(int status,int total); #ifdef WIN32 typedef void (*close_callback_t)(void*fp); #endif typedef struct wbfs_s { wbfs_head_t *head; /* hdsectors, the size of the sector provided by the hosting hard drive */ u32 hd_sec_sz; u8 hd_sec_sz_s; // the power of two of the last number u32 n_hd_sec; // the number of hd sector in the wbfs partition /* standard wii sector (0x8000 bytes) */ u32 wii_sec_sz; u8 wii_sec_sz_s; u32 n_wii_sec; u32 n_wii_sec_per_disc; /* The size of a wbfs sector */ u32 wbfs_sec_sz; u32 wbfs_sec_sz_s; u16 n_wbfs_sec; // this must fit in 16 bit! u16 n_wbfs_sec_per_disc; // size of the lookup table u32 part_lba; /* virtual methods to read write the partition */ rw_sector_callback_t read_hdsector; rw_sector_callback_t write_hdsector; #ifdef WIN32 close_callback_t close_hd; #endif void *callback_data; u16 max_disc; u32 freeblks_lba; u32 *freeblks; u16 disc_info_sz; u8 *tmp_buffer; // pre-allocated buffer for unaligned read u32 n_disc_open; }wbfs_t; typedef struct wbfs_disc_s { wbfs_t *p; wbfs_disc_info_t *header; // pointer to wii header int i; // disc index in the wbfs header (disc_table) }wbfs_disc_t; #define WBFS_MAGIC (('W'<<24)|('B'<<16)|('F'<<8)|('S')) /*! @brief open a MSDOS partitionned harddrive. This tries to find a wbfs partition into the harddrive @param read_hdsector,write_hdsector: accessors to a harddrive @hd_sector_size: size of the hd sector. Can be set to zero if the partition in already initialized @num_hd_sector: number of sectors in this disc. Can be set to zero if the partition in already initialized @reset: not implemented, This will format the whole harddrive with one wbfs partition that fits the whole disk. calls wbfs_error() to have textual meaning of errors @return NULL in case of error */ wbfs_t * wbfs_open_hd(rw_sector_callback_t read_hdsector, rw_sector_callback_t write_hdsector, #ifdef WIN32 close_callback_t close_hd, #endif void *callback_data, int hd_sector_size, int num_hd_sector, int reset); /*! @brief open a wbfs partition @param read_hdsector,write_hdsector: accessors to the partition @hd_sector_size: size of the hd sector. Can be set to zero if the partition in already initialized @num_hd_sector: number of sectors in this partition. Can be set to zero if the partition in already initialized @partition_lba: The partitio offset if you provided accessors to the whole disc. @reset: initialize the partition with an empty wbfs. calls wbfs_error() to have textual meaning of errors @return NULL in case of error */ wbfs_t*wbfs_open_partition(rw_sector_callback_t read_hdsector, rw_sector_callback_t write_hdsector, #ifdef WIN32 close_callback_t close_hd, #endif void *callback_data, int hd_sector_size, int num_hd_sector, u32 partition_lba, int reset); /*! @brief close a wbfs partition, and sync the metadatas to the disc */ void wbfs_close(wbfs_t*); /*! @brief open a disc inside a wbfs partition use a 6 char discid+vendorid @return NULL if discid is not present */ wbfs_disc_t *wbfs_open_disc(wbfs_t* p, u8 *diskid); /*! @brief close a already open disc inside a wbfs partition */ void wbfs_close_disc(wbfs_disc_t*d); /*! @brief accessor to the wii disc @param d: a pointer to already open disc @param offset: an offset inside the disc, *points 32bit words*, allowing to access 16GB data @param len: The length of the data to fetch, in *bytes* */ // offset is pointing 32bit words to address the whole dvd, although len is in bytes int wbfs_disc_read(wbfs_disc_t*d,u32 offset, u8 *data, u32 len); /*! @return the number of discs inside the paritition */ u32 wbfs_count_discs(wbfs_t*p); /*! get the disc info of ith disc inside the partition. It correspond to the first 0x100 bytes of the wiidvd http://www.wiibrew.org/wiki/Wiidisc#Header @param i: index of the disc inside the partition @param header: pointer to 0x100 bytes to write the header @size: optional pointer to a 32bit word that will get the size in 32bit words of the DVD taken on the partition. */ u32 wbfs_get_disc_info(wbfs_t*p, u32 i,u8 *header,int header_size,u32 *size); /*! get the number of used block of the partition. to be multiplied by p->wbfs_sec_sz (use 64bit multiplication) to have the number in bytes */ u32 wbfs_count_usedblocks(wbfs_t*p); /******************* write access ******************/ /*! add a wii dvd inside the partition @param read_src_wii_disc: a callback to access the wii dvd. offsets are in 32bit, len in bytes! @callback_data: private data passed to the callback @spinner: a pointer to a function that is regulary called to update a progress bar. @sel: selects which partitions to copy. @copy_1_1: makes a 1:1 copy, whenever a game would not use the wii disc format, and some data is hidden outside the filesystem. #ifdef WIN32 // It's a bit silly to fidef this... - g3power @new_name: different name for imported ISO. NULL to use default name from ISO header #endif */ u32 wbfs_add_disc(wbfs_t*p,read_wiidisc_callback_t read_src_wii_disc, void *callback_data, progress_callback_t spinner, partition_selector_t sel, int copy_1_1 #ifdef WIN32 , char *new_name #endif ); u32 wbfs_estimate_disc(wbfs_t*p,read_wiidisc_callback_t read_src_wii_disc, void *callback_data, partition_selector_t sel, u8* header); /*! remove a wiidvd inside a partition */ u32 wbfs_rm_disc(wbfs_t*p, u8* discid); /*! rename a wiidvd inside a partition */ u32 wbfs_ren_disc(wbfs_t*p, u8* discid, u8* newname); /*! edit a wiidvd diskid */ u32 wbfs_nid_disc(wbfs_t*p, u8* discid, u8* newid); /*! trim the file-system to its minimum size This allows to use wbfs as a wiidisc container */ u32 wbfs_trim(wbfs_t*p); /*! extract a disc from the wbfs, unused sectors are just untouched, allowing descent filesystem to only really usefull space to store the disc. Even if the filesize is 4.7GB, the disc usage will be less. */ u32 wbfs_extract_disc(wbfs_disc_t*d, rw_sector_callback_t write_dst_wii_sector,void *callback_data,progress_callback_t spinner); /*! extract a file from the wii disc filesystem. E.G. Allows to extract the opening.bnr to install a game as a system menu channel */ u32 wbfs_extract_file(wbfs_disc_t*d, char *path); // remove some sanity checks void wbfs_set_force_mode(int force); /* OS specific functions provided by libwbfs_.c */ wbfs_t *wbfs_try_open(char *disk, char *partition, int reset); wbfs_t *wbfs_try_open_partition(char *fn, int reset); void *wbfs_open_file_for_read(char*filename); void *wbfs_open_file_for_write(char*filename); int wbfs_read_file(void*handle, int len, void *buf); int wbfs_close_file(void *handle); int wbfs_file_reserve_space(void*handle,long long size); void wbfs_file_truncate(void *handle,long long size); int wbfs_read_wii_file(void *handle, u32 offset, u32 count, void *buf); int wbfs_write_wii_file(void *handle, u32 lba, u32 count, void *buf); #ifdef __cplusplus } #endif /* __cplusplus */ #endif ./qwbfsmanager-1.2.1-src/libwbfs/libwbfs.pro0000644000175000017520000000162111410720766020324 0ustar pasnoxpasnox########################################################################################### ## Created using Monkey Studio v1.8.4.0 (1.8.4.0) ## ## Author : Filipe Azevedo aka Nox P@sNox ## Project : libwbfs ## FileName : libwbfs.pro ## Date : 2010-04-04T11:04:05 ## License : GPL2 ## Comment : Creating using Monkey Studio RAD ## Home Page : http://code.google.com/p/qwbfs ## ########################################################################################### TEMPLATE = lib LANGUAGE = C++/Qt4 TARGET = $$quote(wbfs) CONFIG *= staticlib include(shared.pri) BUILD_PATH = $${LIB_WBFS_BUILD_PATH} DESTDIR = $${BUILD_PATH} win32:DEFINES -= UNICODE include(../shared.pri) INCLUDEPATH *= libwbfs HEADERS *= tools.h \ wiidisc.h \ libwbfs_os.h \ libwbfs.h SOURCES *= tools.c \ ec.c \ bn.c \ rijndael.c \ wiidisc.c \ libwbfs.c \ libwbfs_unix.c \ libwbfs_win32.c./qwbfsmanager-1.2.1-src/libwbfs/rijndael.c0000755000175000017520000002314611361142533020112 0ustar pasnoxpasnox/* Rijndael Block Cipher - rijndael.c Written by Mike Scott 21st April 1999 mike@compapp.dcu.ie Permission for free direct or derivative use is granted subject to compliance with any conditions that the originators of the algorithm place on its exploitation. */ #include #include #ifdef WIN32 #include #else #define u8 unsigned char /* 8 bits */ #define u32 unsigned long /* 32 bits */ #define u64 unsigned long long #endif /* rotates x one bit to the left */ #define ROTL(x) (((x)>>7)|((x)<<1)) /* Rotates 32-bit word left by 1, 2 or 3 byte */ #define ROTL8(x) (((x)<<8)|((x)>>24)) #define ROTL16(x) (((x)<<16)|((x)>>16)) #define ROTL24(x) (((x)<<24)|((x)>>8)) /* Fixed Data */ static u8 InCo[4]={0xB,0xD,0x9,0xE}; /* Inverse Coefficients */ static u8 fbsub[256]; static u8 rbsub[256]; static u8 ptab[256],ltab[256]; static u32 ftable[256]; static u32 rtable[256]; static u32 rco[30]; /* Parameter-dependent data */ int Nk,Nb,Nr; u8 fi[24],ri[24]; u32 fkey[120]; u32 rkey[120]; static u32 pack(u8 *b) { /* pack bytes into a 32-bit Word */ return ((u32)b[3]<<24)|((u32)b[2]<<16)|((u32)b[1]<<8)|(u32)b[0]; } static void unpack(u32 a,u8 *b) { /* unpack bytes from a word */ b[0]=(u8)a; b[1]=(u8)(a>>8); b[2]=(u8)(a>>16); b[3]=(u8)(a>>24); } static u8 xtime(u8 a) { u8 b; if (a&0x80) b=0x1B; else b=0; a<<=1; a^=b; return a; } static u8 bmul(u8 x,u8 y) { /* x.y= AntiLog(Log(x) + Log(y)) */ if (x && y) return ptab[(ltab[x]+ltab[y])%255]; else return 0; } static u32 SubByte(u32 a) { u8 b[4]; unpack(a,b); b[0]=fbsub[b[0]]; b[1]=fbsub[b[1]]; b[2]=fbsub[b[2]]; b[3]=fbsub[b[3]]; return pack(b); } static u8 product(u32 x,u32 y) { /* dot product of two 4-byte arrays */ u8 xb[4],yb[4]; unpack(x,xb); unpack(y,yb); return bmul(xb[0],yb[0])^bmul(xb[1],yb[1])^bmul(xb[2],yb[2])^bmul(xb[3],yb[3]); } static u32 InvMixCol(u32 x) { /* matrix Multiplication */ u32 y,m; u8 b[4]; m=pack(InCo); b[3]=product(m,x); m=ROTL24(m); b[2]=product(m,x); m=ROTL24(m); b[1]=product(m,x); m=ROTL24(m); b[0]=product(m,x); y=pack(b); return y; } u8 ByteSub(u8 x) { u8 y=ptab[255-ltab[x]]; /* multiplicative inverse */ x=y; x=ROTL(x); y^=x; x=ROTL(x); y^=x; x=ROTL(x); y^=x; x=ROTL(x); y^=x; y^=0x63; return y; } void gentables(void) { /* generate tables */ int i; u8 y,b[4]; /* use 3 as primitive root to generate power and log tables */ ltab[0]=0; ptab[0]=1; ltab[1]=0; ptab[1]=3; ltab[3]=1; for (i=2;i<256;i++) { ptab[i]=ptab[i-1]^xtime(ptab[i-1]); ltab[ptab[i]]=i; } /* affine transformation:- each bit is xored with itself shifted one bit */ fbsub[0]=0x63; rbsub[0x63]=0; for (i=1;i<256;i++) { y=ByteSub((u8)i); fbsub[i]=y; rbsub[y]=i; } for (i=0,y=1;i<30;i++) { rco[i]=y; y=xtime(y); } /* calculate forward and reverse tables */ for (i=0;i<256;i++) { y=fbsub[i]; b[3]=y^xtime(y); b[2]=y; b[1]=y; b[0]=xtime(y); ftable[i]=pack(b); y=rbsub[i]; b[3]=bmul(InCo[0],y); b[2]=bmul(InCo[1],y); b[1]=bmul(InCo[2],y); b[0]=bmul(InCo[3],y); rtable[i]=pack(b); } } void gkey(int nb,int nk,char *key) { /* blocksize=32*nb bits. Key=32*nk bits */ /* currently nb,bk = 4, 6 or 8 */ /* key comes as 4*Nk bytes */ /* Key Scheduler. Create expanded encryption key */ int i,j,k,m,N; int C1,C2,C3; u32 CipherKey[8]; Nb=nb; Nk=nk; /* Nr is number of rounds */ if (Nb>=Nk) Nr=6+Nb; else Nr=6+Nk; C1=1; if (Nb<8) { C2=2; C3=3; } else { C2=3; C3=4; } /* pre-calculate forward and reverse increments */ for (m=j=0;j>8)])^ ROTL16(ftable[(u8)(x[fi[m+1]]>>16)])^ ROTL24(ftable[(u8)(x[fi[m+2]]>>24)]); } t=x; x=y; y=t; /* swap pointers */ } /* Last Round - unroll if possible */ for (m=j=0;j>8)])^ ROTL16((u32)fbsub[(u8)(x[fi[m+1]]>>16)])^ ROTL24((u32)fbsub[(u8)(x[fi[m+2]]>>24)]); } for (i=j=0;i>8)])^ ROTL16(rtable[(u8)(x[ri[m+1]]>>16)])^ ROTL24(rtable[(u8)(x[ri[m+2]]>>24)]); } t=x; x=y; y=t; /* swap pointers */ } /* Last Round - unroll if possible */ for (m=j=0;j>8)])^ ROTL16((u32)rbsub[(u8)(x[ri[m+1]]>>16)])^ ROTL24((u32)rbsub[(u8)(x[ri[m+2]]>>24)]); } for (i=j=0;i // Licensed under the terms of the GNU GPL, version 2 // http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt #include "tools.h" #include // to accommodate certain broken versions of openssl #include #include #include #include #include #include #include #include #ifdef WIN32 #define snprintf _snprintf #endif // // basic data types // u16 be16(const u8 *p) { return (p[0] << 8) | p[1]; } u32 be32(const u8 *p) { return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]; } u64 be64(const u8 *p) { return ((u64)be32(p) << 32) | be32(p + 4); } u64 be34(const u8 *p) { return 4 * (u64)be32(p); } void wbe16(u8 *p, u16 x) { p[0] = (u8)(x >> 8); p[1] = (u8)(x); } void wbe32(u8 *p, u32 x) { wbe16(p + 0, (u16)(x >> 16)); wbe16(p + 2, (u16)(x)); } void wbe64(u8 *p, u64 x) { wbe32(p + 0, (u32)(x >> 32)); wbe32(p + 4, (u32)(x)); } // // crypto // void md5(u8 *data, u32 len, u8 *hash) { MD5(data, len, hash); } void sha(u8 *data, u32 len, u8 *hash) { SHA1(data, len, hash); } void get_key(const char *name, u8 *key, u32 len) { char path[256]; #ifndef WIN32 char *home; #endif FILE *fp; #ifdef WIN32 snprintf(path, sizeof path, "wii/%s", name); #else home = getenv("HOME"); if (home == 0) fatal("cannot find HOME"); snprintf(path, sizeof path, "%s/.wii/%s", home, name); #endif fp = fopen(path, "rb"); if (fp == 0) fatal("cannot open %s", name); if (fread(key, len, 1, fp) != 1) fatal("error reading %s", name); fclose(fp); } void aes_cbc_dec(u8 *key, u8 *iv, u8 *in, u32 len, u8 *out) { AES_KEY aes_key; AES_set_decrypt_key(key, 128, &aes_key); AES_cbc_encrypt(in, out, len, &aes_key, iv, AES_DECRYPT); } void aes_cbc_enc(u8 *key, u8 *iv, u8 *in, u32 len, u8 *out) { AES_KEY aes_key; AES_set_encrypt_key(key, 128, &aes_key); AES_cbc_encrypt(in, out, len, &aes_key, iv, AES_ENCRYPT); } void decrypt_title_key(u8 *tik, u8 *title_key) { u8 common_key[16]; u8 iv[16]; get_key("common-key", common_key, 16); memset(iv, 0, sizeof iv); memcpy(iv, tik + 0x01dc, 8); aes_cbc_dec(common_key, iv, tik + 0x01bf, 16, title_key); printf("title key: %02x %02x %02x\n",title_key[0],title_key[1],title_key[2]); } static u8 root_key[0x204]; static u8 *get_root_key(void) { //get_key("root-key", root_key, sizeof root_key); return root_key; } static u32 get_sig_len(u8 *sig) { u32 type; type = be32(sig); switch (type - 0x10000) { case 0: return 0x240; case 1: return 0x140; case 2: return 0x80; } fprintf(stderr, "get_sig_len(): unhandled sig type %08x\n", type); return 0; } static u32 get_sub_len(u8 *sub) { u32 type; type = be32(sub + 0x40); switch (type) { case 0: return 0x2c0; case 1: return 0x1c0; case 2: return 0x100; } fprintf(stderr, "get_sub_len(): unhandled sub type %08x\n", type); return 0; } int check_ec(u8 *ng, u8 *ap, u8 *sig, u8 *sig_hash) { u8 ap_hash[20]; u8 *ng_Q, *ap_R, *ap_S; u8 *ap_Q, *sig_R, *sig_S; ng_Q = ng + 0x0108; ap_R = ap + 0x04; ap_S = ap + 0x22; SHA1(ap + 0x80, 0x100, ap_hash); ap_Q = ap + 0x0108; sig_R = sig; sig_S = sig + 30; return check_ecdsa(ng_Q, ap_R, ap_S, ap_hash) && check_ecdsa(ap_Q, sig_R, sig_S, sig_hash); } static int check_rsa(u8 *h, u8 *sig, u8 *key, u32 n) { u8 correct[0x200]; u8 x[0x200]; static const u8 ber[16] = "\x00\x30\x21\x30\x09\x06\x05\x2b" "\x0e\x03\x02\x1a\x05\x00\x04\x14"; //fprintf(stderr, "n = %x\n", n); //fprintf(stderr, "key:\n"); //hexdump(key, n); //fprintf(stderr, "sig:\n"); //hexdump(sig, n); correct[0] = 0; correct[1] = 1; memset(correct + 2, 0xff, n - 38); memcpy(correct + n - 36, ber, 16); memcpy(correct + n - 20, h, 20); //fprintf(stderr, "correct is:\n"); //hexdump(correct, n); bn_exp(x, sig, key, n, key + n, 4); //fprintf(stderr, "x is:\n"); //hexdump(x, n); if (memcmp(correct, x, n) == 0) return 0; return -5; } static int check_hash(u8 *h, u8 *sig, u8 *key) { u32 type; type = be32(sig) - 0x10000; if (type != be32(key + 0x40)) return -6; switch (type) { case 1: return check_rsa(h, sig + 4, key + 0x88, 0x100); } return -7; } static u8 *find_cert_in_chain(u8 *sub, u8 *cert, u32 cert_len) { char parent[64]; char *child; u32 sig_len, sub_len; u8 *p; u8 *issuer; strncpy(parent, (char*)sub, sizeof parent); parent[sizeof parent - 1] = 0; child = strrchr(parent, '-'); if (child) *child++ = 0; else { *parent = 0; child = (char*)sub; } for (p = cert; p < cert + cert_len; p += sig_len + sub_len) { sig_len = get_sig_len(p); if (sig_len == 0) return 0; issuer = p + sig_len; sub_len = get_sub_len(issuer); if (sub_len == 0) return 0; if (strcmp(parent, (char*)issuer) == 0 && strcmp(child, (char*)issuer + 0x44) == 0) return p; } return 0; } int check_cert_chain(u8 *data, u32 data_len, u8 *cert, u32 cert_len) { u8 *sig; u8 *sub; u32 sig_len; u32 sub_len; u8 h[20]; u8 *key_cert; u8 *key; int ret; sig = data; sig_len = get_sig_len(sig); if (sig_len == 0) return -1; sub = data + sig_len; sub_len = data_len - sig_len; if (sub_len == 0) return -2; for (;;) { fprintf(stderr, ">>>>>> checking sig by %s...\n", sub); if (strcmp((char*)sub, "Root") == 0) { key = get_root_key(); sha(sub, sub_len, h); if (be32(sig) != 0x10000) return -8; return check_rsa(h, sig + 4, key, 0x200); } key_cert = find_cert_in_chain(sub, cert, cert_len); if (key_cert == 0) return -3; key = key_cert + get_sig_len(key_cert); sha(sub, sub_len, h); ret = check_hash(h, sig, key); if (ret) return ret; sig = key_cert; sig_len = get_sig_len(sig); if (sig_len == 0) return -4; sub = sig + sig_len; sub_len = get_sub_len(sub); if (sub_len == 0) return -5; } } // // compression // void do_yaz0(u8 *in, u32 in_size, u8 *out, u32 out_size) { u32 nout; u8 bits; u32 nbits; u32 n, d, i; #ifdef UNNECESSARY_STUFF in_size++; #endif bits = 0; nbits = 0; in += 0x10; for (nout = 0; nout < out_size; ) { if (nbits == 0) { bits = *in++; nbits = 8; } if ((bits & 0x80) != 0) { *out++ = *in++; nout++; } else { n = *in++; d = *in++; d |= (n << 8) & 0xf00; n >>= 4; if (n == 0) n = 0x10 + *in++; n += 2; d++; for (i = 0; i < n; i++) { *out = *(out - d); out++; } nout += n; } nbits--; bits <<= 1; }; } // // error handling // void fatal(const char *s, ...) { char message[256]; va_list ap; va_start(ap, s); vsnprintf(message, sizeof message, s, ap); perror(message); exit(1); } void non_fatal(const char *s, ...) { char message[256]; va_list ap; va_start(ap, s); vsnprintf(message, sizeof message, s, ap); perror(message); } // // output formatting // void print_bytes(u8 *x, u32 n) { u32 i; for (i = 0; i < n; i++) fprintf(stderr, "%02x", x[i]); } void hexdump(u8 *x, u32 n) { u32 i, j; for (i = 0; i < n; i += 16) { fprintf(stderr, "%04x:", i); for (j = 0; j < 16 && i + j < n; j++) { if ((j & 3) == 0) fprintf(stderr, " "); fprintf(stderr, "%02x", *x++); } fprintf(stderr, "\n"); } } void dump_tmd(u8 *tmd) { u32 i, n; u8 *p; printf(" issuer: %s\n", tmd + 0x140); printf(" sys_version: %016llx\n", be64(tmd + 0x0184)); printf(" title_id: %016llx\n", be64(tmd + 0x018c)); printf(" title_type: %08x\n", be32(tmd + 0x0194)); printf(" group_id: %04x\n", be16(tmd + 0x0198)); printf("title_version: %04x\n", be16(tmd + 0x01dc)); printf(" num_contents: %04x\n", be16(tmd + 0x01de)); printf(" boot_index: %04x\n", be16(tmd + 0x01e0)); n = be16(tmd + 0x01de); p = tmd + 0x01e4; for (i = 0; i < n; i++) { printf("cid %08x index %04x type %04x size %08llx\n", be32(p), be16(p + 4), be16(p + 6), be64(p + 8)); p += 0x24; } } void spinner(u64 x, u64 max) { static time_t start_time; static u32 expected_total; u32 d; double percent; u32 h, m, s; if (x == 0) { start_time = time(0); expected_total = 300; } if (x == max) { d = (u32)(time(0) - start_time); h = d / 3600; m = (d / 60) % 60; s = d % 60; fprintf(stderr, "Done in %d:%02d:%02d \n", h, m, s); return; } d = (u32)(time(0) - start_time); if ( (d != 0) && (x > 0) ) expected_total = (u32)((3 * expected_total + d * max / x) / 4); if (expected_total > d) d = expected_total - d; else d = 0; h = d / 3600; m = (d / 60) % 60; s = d % 60; percent = 100.0 * x / max; #ifdef SPINNER_MOD fprintf(stderr, "%5.2f%% (%c) ETA: %d:%02d:%02d \r", percent, "/|\\-"[(x/10) % 4], h, m, s); #else fprintf(stderr, "%5.2f|@|%d:%02d:%02d \r", percent, h, m, s); #endif fflush(stderr); } void progress(u64 x, u64 max) { static time_t start_time; static u32 expected_total; u32 d; u32 prc,dec; char prg[40]; u32 h, m, s; if (x == 0) { start_time = time(0); expected_total = 300; } if (x == max) { d = (u32)(time(0) - start_time); h = d / 3600; m = (d / 60) % 60; s = d % 60; fprintf(stderr, "\rDone in %d:%02d:%02d \n", h, m, s); return; } d = (u32)(time(0) - start_time); if (x != 0) expected_total = (u32)((3 * expected_total + d * max / x) / 4); if (expected_total > d) d = expected_total - d; else d = 0; h = d / 3600; m = (d / 60) % 60; s = d % 60; prc = (u32)((100 * x) / max); dec = prc % 3; prc /=3; memset(prg, 0x20, 34); for(d=0;d ## Project : libwbfs ## FileName : shared.pri ## Date : 2010-04-04T11:04:05 ## License : GPL2 ## Comment : Creating using Monkey Studio RAD ## Home Page : http://code.google.com/p/qwbfs ## ########################################################################################### CONFIG -= debug_and_release release debug warn_off warn_on CONFIG *= release warn_on DEFINES *= LARGE_FILES _FILE_OFFSET_BITS=64 LIB_WBFS_PWD = $$PWD LIB_WBFS_BUILD_PATH = $${LIB_WBFS_PWD}/../build INCLUDEPATH *= $${LIB_WBFS_PWD} DEPENDPATH *= $${LIB_WBFS_PWD} win32 { OS = $$lower( $$QMAKE_HOST.os ) #OS=$$system( "uname -s" ) OPENSSL_INSTALL_DIR = D:/Tools/OpenSSL isEqual( OS, "darwin" ):OPENSSL_INSTALL_DIR = $(HOME)/Win32Libraries else:isEqual( OS, "linux" ):OPENSSL_INSTALL_DIR = $(HOME)/.wine/drive_c/Development/OpenSSL *-g++*:LIBS *= -L$${OPENSSL_INSTALL_DIR}/lib -L$${OPENSSL_INSTALL_DIR}/lib/MinGW *-msvc*:LIBS *= -L$${OPENSSL_INSTALL_DIR}/lib -L$${OPENSSL_INSTALL_DIR}/lib/VC INCLUDEPATH *= $${OPENSSL_INSTALL_DIR}/include }./qwbfsmanager-1.2.1-src/libwbfs/libwbfs.c0000755000175000017520000004510011500257245017746 0ustar pasnoxpasnox// Copyright 2009 Kwiirk // Licensed under the terms of the GNU GPL, version 2 // http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt #include "libwbfs.h" #include #ifndef WIN32 #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else #define likely(x) (x) #define unlikely(x) (x) #endif #define WBFS_GOTO_ERROR(x) do {wbfs_error(x);goto error;}while(0) #define ALIGN_LBA(x) (((x)+p->hd_sec_sz-1)&(~(p->hd_sec_sz-1))) static int force_mode=0; void wbfs_set_force_mode(int force) { force_mode = force; } static u8 size_to_shift(u32 size) { u8 ret = 0; while (size) { ret++; size>>=1; } return ret-1; } #define read_le32_unaligned(x) ((x)[0]|((x)[1]<<8)|((x)[2]<<16)|((x)[3]<<24)) void wbfs_sync(wbfs_t*p); wbfs_t*wbfs_open_hd( rw_sector_callback_t read_hdsector, rw_sector_callback_t write_hdsector, #ifdef WIN32 close_callback_t close_hd, #endif void *callback_data, int hd_sector_size, #ifdef WIN32 int num_hd_sector, #else int num_hd_sector __attribute((unused)), #endif int reset) { int i #ifdef UNUSED_STUFF = num_hd_sector #endif , ret; u8 *ptr,*tmp_buffer = wbfs_ioalloc(hd_sector_size); u8 part_table[16*4]; ret = read_hdsector(callback_data,0,1,tmp_buffer); if(ret) return 0; //find wbfs partition wbfs_memcpy(part_table,tmp_buffer+0x1be,16*4); ptr = part_table; for(i=0;i<4;i++,ptr+=16) { u32 part_lba = read_le32_unaligned(ptr+0x8); wbfs_head_t *head = (wbfs_head_t *)tmp_buffer; #ifdef UNUSED_STUFF ret = #endif read_hdsector(callback_data,part_lba,1,tmp_buffer); // verify there is the magic. if (head->magic == wbfs_htonl(WBFS_MAGIC)) { wbfs_t *p = wbfs_open_partition( read_hdsector, write_hdsector, #ifdef WIN32 close_hd, #endif callback_data, hd_sector_size, 0, part_lba,reset ); return p; } } if(reset)// XXX make a empty hd partition.. { } return 0; } wbfs_t*wbfs_open_partition(rw_sector_callback_t read_hdsector, rw_sector_callback_t write_hdsector, #ifdef WIN32 close_callback_t close_hd, #endif void *callback_data, int hd_sector_size, int num_hd_sector, u32 part_lba, int reset) { wbfs_t *p = wbfs_malloc(sizeof(wbfs_t)); wbfs_head_t *head = wbfs_ioalloc(hd_sector_size?hd_sector_size:512); //constants, but put here for consistancy p->wii_sec_sz = 0x8000; p->wii_sec_sz_s = size_to_shift(0x8000); p->n_wii_sec = (num_hd_sector/0x8000)*hd_sector_size; p->n_wii_sec_per_disc = 143432*2;//support for double layers discs.. p->head = head; p->part_lba = part_lba; // init the partition if (reset) { u8 sz_s; wbfs_memset(head,0,hd_sector_size); head->magic = wbfs_htonl(WBFS_MAGIC); head->hd_sec_sz_s = size_to_shift(hd_sector_size); head->n_hd_sec = wbfs_htonl(num_hd_sector); // choose minimum wblk_sz that fits this partition size for(sz_s=6;sz_s<11;sz_s++) { // ensure that wbfs_sec_sz is big enough to address every blocks using 16 bits if(p->n_wii_sec <((1U<<16)*(1<wbfs_sec_sz_s = sz_s+p->wii_sec_sz_s; } else read_hdsector(callback_data,p->part_lba,1,head); if (head->magic != wbfs_htonl(WBFS_MAGIC)) WBFS_GOTO_ERROR("bad magic"); if(!force_mode && hd_sector_size && head->hd_sec_sz_s != size_to_shift(hd_sector_size)) WBFS_GOTO_ERROR("hd sector size doesn't match"); if(!force_mode && num_hd_sector && head->n_hd_sec != wbfs_htonl(num_hd_sector)) WBFS_GOTO_ERROR("hd num sector doesn't match"); p->hd_sec_sz = 1<hd_sec_sz_s; p->hd_sec_sz_s = head->hd_sec_sz_s; p->n_hd_sec = wbfs_ntohl(head->n_hd_sec); p->n_wii_sec = (p->n_hd_sec/p->wii_sec_sz)*(p->hd_sec_sz); p->wbfs_sec_sz_s = head->wbfs_sec_sz_s; p->wbfs_sec_sz = 1<wbfs_sec_sz_s; p->n_wbfs_sec = p->n_wii_sec >> (p->wbfs_sec_sz_s - p->wii_sec_sz_s); p->n_wbfs_sec_per_disc = p->n_wii_sec_per_disc >> (p->wbfs_sec_sz_s - p->wii_sec_sz_s); p->disc_info_sz = ALIGN_LBA(sizeof(wbfs_disc_info_t) + p->n_wbfs_sec_per_disc*2); //printf("hd_sector_size %X wii_sector size %X wbfs sector_size %X\n",p->hd_sec_sz,p->wii_sec_sz,p->wbfs_sec_sz); p->read_hdsector = read_hdsector; p->write_hdsector = write_hdsector; #ifdef WIN32 p->close_hd = close_hd; #endif p->callback_data = callback_data; p->freeblks_lba = (p->wbfs_sec_sz - p->n_wbfs_sec/8)>>p->hd_sec_sz_s; if(!reset) p->freeblks = 0; // will alloc and read only if needed else { // init with all free blocks p->freeblks = wbfs_ioalloc(ALIGN_LBA(p->n_wbfs_sec/8)); wbfs_memset(p->freeblks,0xff,p->n_wbfs_sec/8); } p->max_disc = (p->freeblks_lba-1)/(p->disc_info_sz>>p->hd_sec_sz_s); if(p->max_disc > p->hd_sec_sz - sizeof(wbfs_head_t)) p->max_disc = p->hd_sec_sz - sizeof(wbfs_head_t); p->tmp_buffer = wbfs_ioalloc(p->hd_sec_sz); p->n_disc_open = 0; wbfs_sync(p); return p; error: wbfs_free(p); wbfs_iofree(head); return 0; } void wbfs_sync(wbfs_t*p) { // copy back descriptors if(p->write_hdsector){ p->write_hdsector(p->callback_data,p->part_lba+0,1, p->head); if(p->freeblks) { p->write_hdsector(p->callback_data,p->part_lba+p->freeblks_lba,ALIGN_LBA(p->n_wbfs_sec/8)>>p->hd_sec_sz_s, p->freeblks); } } } void wbfs_close(wbfs_t*p) { wbfs_sync(p); if(p->n_disc_open) WBFS_GOTO_ERROR("trying to close wbfs while discs still open"); wbfs_iofree(p->head); wbfs_iofree(p->tmp_buffer); if(p->freeblks) wbfs_iofree(p->freeblks); #ifdef WIN32 p->close_hd(p->callback_data); #endif wbfs_free(p); error: return; } wbfs_disc_t *wbfs_open_disc(wbfs_t* p, u8 *discid) { u32 i; int disc_info_sz_lba = p->disc_info_sz>>p->hd_sec_sz_s; wbfs_disc_t *d = 0; for(i=0;imax_disc;i++) { if (p->head->disc_table[i]){ p->read_hdsector(p->callback_data, p->part_lba+1+i*disc_info_sz_lba,1,p->tmp_buffer); #ifdef WIN32 if(_strnicmp(discid,p->tmp_buffer,6)==0){ #else if(wbfs_memcmp(discid,p->tmp_buffer,6)==0){ #endif d = wbfs_malloc(sizeof(*d)); if(!d) WBFS_GOTO_ERROR("allocating memory"); d->p = p; d->i = i; d->header = wbfs_ioalloc(p->disc_info_sz); if(!d->header) WBFS_GOTO_ERROR("allocating memory"); p->read_hdsector(p->callback_data, p->part_lba+1+i*disc_info_sz_lba, disc_info_sz_lba,d->header); p->n_disc_open ++; // for(i=0;in_wbfs_sec_per_disc;i++) // printf("%d,",wbfs_ntohs(d->header->wlba_table[i])); return d; } } } #ifdef WIN32 //_set_errno(ENOENT); #endif return 0; error: if (d) { wbfs_iofree(d); } #ifdef WIN32 //_set_errno(ENOENT); #endif return 0; } void wbfs_close_disc(wbfs_disc_t*d) { d->p->n_disc_open --; wbfs_iofree(d->header); wbfs_free(d); } // offset is pointing 32bit words to address the whole dvd, although len is in bytes int wbfs_disc_read(wbfs_disc_t *d, u32 offset, u8 *data, u32 len) { wbfs_t *p = d->p; u16 wlba = offset>>(p->wbfs_sec_sz_s-2); u32 iwlba_shift = p->wbfs_sec_sz_s - p->hd_sec_sz_s; u32 lba_mask = (p->wbfs_sec_sz-1)>>(p->hd_sec_sz_s); u32 lba = (offset>>(p->hd_sec_sz_s-2))&lba_mask; u32 off = offset&((p->hd_sec_sz>>2)-1); u16 iwlba = wbfs_ntohs(d->header->wlba_table[wlba]); u32 len_copied; int err = 0; u8 *ptr = data; if(unlikely(iwlba==0)) return 1; if(unlikely(off)){ off*=4; err = p->read_hdsector(p->callback_data, p->part_lba + (iwlba<tmp_buffer); if(err) return err; len_copied = p->hd_sec_sz - off; if(likely(len < len_copied)) len_copied = len; wbfs_memcpy(ptr, p->tmp_buffer + off, len_copied); len -= len_copied; ptr += len_copied; lba++; if(unlikely(lba>lba_mask && len)){ lba=0; iwlba = wbfs_ntohs(d->header->wlba_table[++wlba]); if(unlikely(iwlba==0)) return 1; } } while(likely(len>=p->hd_sec_sz)) { u32 nlb = len>>(p->hd_sec_sz_s); if(unlikely(lba + nlb > p->wbfs_sec_sz)) // dont cross wbfs sectors.. nlb = p->wbfs_sec_sz-lba; err = p->read_hdsector(p->callback_data, p->part_lba + (iwlba<hd_sec_sz_s; ptr += nlb<hd_sec_sz_s; lba += nlb; if(unlikely(lba>lba_mask && len)){ lba = 0; iwlba =wbfs_ntohs(d->header->wlba_table[++wlba]); if(unlikely(iwlba==0)) return 1; } } if(unlikely(len)){ err = p->read_hdsector(p->callback_data, p->part_lba + (iwlba<tmp_buffer); if(err) return err; wbfs_memcpy(ptr, p->tmp_buffer, len); } return 0; } // disc listing u32 wbfs_count_discs(wbfs_t*p) { u32 i,count=0; for(i=0;imax_disc;i++) if (p->head->disc_table[i]) count++; return count; } static u32 wbfs_sector_used(wbfs_t *p,wbfs_disc_info_t *di) { u32 tot_blk=0,j; for(j=0;jn_wbfs_sec_per_disc;j++) if(wbfs_ntohs(di->wlba_table[j])) tot_blk++; return tot_blk; } u32 wbfs_get_disc_info(wbfs_t*p, u32 index,u8 *header,int header_size,u32 *size)//size in 32 bit { u32 i,count=0; int disc_info_sz_lba = p->disc_info_sz>>p->hd_sec_sz_s; for(i=0;imax_disc;i++) if (p->head->disc_table[i]){ if(count++==index) { u32 magic; p->read_hdsector(p->callback_data, p->part_lba+1+i*disc_info_sz_lba,1,p->tmp_buffer); if(header_size > (int)p->hd_sec_sz) header_size = p->hd_sec_sz; magic = wbfs_ntohl(*(u32*)(p->tmp_buffer+24)); if(magic!=0x5D1C9EA3){ p->head->disc_table[i]=0; return 1; } memcpy(header,p->tmp_buffer,header_size); if(size) { u32 sec_used; u8 *header = wbfs_ioalloc(p->disc_info_sz); p->read_hdsector(p->callback_data, p->part_lba+1+i*disc_info_sz_lba,disc_info_sz_lba,header); sec_used = wbfs_sector_used(p,(wbfs_disc_info_t *)header); wbfs_iofree(header); *size = sec_used<<(p->wbfs_sec_sz_s-2); } return 0; } } return 1; } static void load_freeblocks(wbfs_t*p) { if(p->freeblks) return; // XXX should handle malloc error.. p->freeblks = wbfs_ioalloc(ALIGN_LBA(p->n_wbfs_sec/8)); p->read_hdsector(p->callback_data,p->part_lba+p->freeblks_lba,ALIGN_LBA(p->n_wbfs_sec/8)>>p->hd_sec_sz_s, p->freeblks); } u32 wbfs_count_usedblocks(wbfs_t*p) { u32 i,j,count=0; load_freeblocks(p); for(i=0;in_wbfs_sec/(8*4);i++) { u32 v = wbfs_ntohl(p->freeblks[i]); if(v == ~0U) count+=32; else if(v!=0) for(j=0;j<32;j++) if (v & (1<n_wbfs_sec/(8*4);i++) { u32 v = wbfs_ntohl(p->freeblks[i]); if(v != 0) { for(j=0;j<32;j++) if (v & (1<freeblks[i] = wbfs_htonl(v & ~(1<freeblks[i]); p->freeblks[i] = wbfs_htonl(v | 1<wbfs_sec_sz_s-p->wii_sec_sz_s); wiidisc_t *d = 0; u8 *used = 0; wbfs_disc_info_t *info = 0; u8* copy_buffer = 0; u8 *b; int disc_info_sz_lba; used = wbfs_malloc(p->n_wii_sec_per_disc); if (!used) { WBFS_GOTO_ERROR("unable to alloc memory"); } if (!copy_1_1) { d = wd_open_disc(read_src_wii_disc, callback_data); if(!d) { WBFS_GOTO_ERROR("unable to open wii disc"); } wd_build_disc_usage(d, sel, used); wd_close_disc(d); d = 0; } for (i = 0; i < p->max_disc; i++) // find a free slot. { if (p->head->disc_table[i] == 0) { break; } } if (i == p->max_disc) { WBFS_GOTO_ERROR("no space left on device (table full)"); } p->head->disc_table[i] = 1; discn = i; load_freeblocks(p); // build disc info info = wbfs_ioalloc(p->disc_info_sz); b = (u8 *)info; read_src_wii_disc(callback_data, 0, 0x100, info->disc_header_copy); #ifdef WIN32 if (new_name) { wbfs_memset(b+0x20, 0, 0x40); if(strlen(new_name)>=0x40) new_name[0x39]=0; strcpy(b+0x20, new_name); } #endif fprintf(stderr, "adding %c%c%c%c%c%c %s...\n",b[0], b[1], b[2], b[3], b[4], b[5], b + 0x20); copy_buffer = wbfs_ioalloc(p->wbfs_sec_sz); if (!copy_buffer) { WBFS_GOTO_ERROR("alloc memory"); } tot = 0; cur = 0; if (spinner) { // count total number to write for spinner for (i = 0; i < p->n_wbfs_sec_per_disc; i++) { if (copy_1_1 || block_used(used, i, wii_sec_per_wbfs_sect)) { tot++; spinner(0, tot); } } } for (i = 0; i < p->n_wbfs_sec_per_disc; i++) { u16 bl = 0; if (copy_1_1 || block_used(used, i, wii_sec_per_wbfs_sect)) { bl = alloc_block(p); if (bl == 0xffff) { WBFS_GOTO_ERROR("no space left on device (disc full)"); } if(read_src_wii_disc(callback_data, i * (p->wbfs_sec_sz >> 2), p->wbfs_sec_sz, copy_buffer)) WBFS_GOTO_ERROR("error reading disc 3"); // fix the partition table. if (i == (0x40000 >> p->wbfs_sec_sz_s)) { wd_fix_partition_table(d, sel, copy_buffer + (0x40000 & (p->wbfs_sec_sz - 1))); } p->write_hdsector(p->callback_data, p->part_lba + bl * (p->wbfs_sec_sz / p->hd_sec_sz), p->wbfs_sec_sz / p->hd_sec_sz, copy_buffer); if (spinner) { cur++; spinner(cur, tot); } } info->wlba_table[i] = wbfs_htons(bl); } // write disc info disc_info_sz_lba = p->disc_info_sz>>p->hd_sec_sz_s; p->write_hdsector(p->callback_data, p->part_lba + 1 + discn * disc_info_sz_lba,disc_info_sz_lba, info); wbfs_sync(p); if(d) wd_close_disc(d); if(used) wbfs_free(used); if(info) wbfs_iofree(info); if(copy_buffer) wbfs_iofree(copy_buffer); // init with all free blocks return 0; error: if(d) wd_close_disc(d); if(used) wbfs_free(used); if(info) wbfs_iofree(info); if(copy_buffer) wbfs_iofree(copy_buffer); // init with all free blocks return 1; } u32 wbfs_ren_disc(wbfs_t*p, u8* discid, u8* newname) { wbfs_disc_t *d = wbfs_open_disc(p, discid); int disc_info_sz_lba = p->disc_info_sz>>p->hd_sec_sz_s; if(!d) return 1; memset(d->header->disc_header_copy+0x20, 0, 0x40); strncpy(d->header->disc_header_copy+0x20, (char*)newname, 0x39); d->header->disc_header_copy[0x20+0x39] = '\0'; //force last char to 0 p->write_hdsector(p->callback_data, p->part_lba+1+d->i*disc_info_sz_lba, disc_info_sz_lba, d->header); wbfs_close_disc(d); wbfs_sync(p); return 0; } u32 wbfs_nid_disc(wbfs_t*p, u8* discid, u8* newid) { wbfs_disc_t *d = wbfs_open_disc(p, discid); int disc_info_sz_lba = p->disc_info_sz>>p->hd_sec_sz_s; if(!d) return 1; if(strlen((const char *)newid) > 0x6) return 1; strcpy((char *)(d->header->disc_header_copy+0x0), (const char *)newid); p->write_hdsector(p->callback_data, p->part_lba+1+d->i*disc_info_sz_lba, disc_info_sz_lba, d->header); wbfs_close_disc(d); wbfs_sync(p); return 0; } u32 wbfs_estimate_disc ( wbfs_t *p, read_wiidisc_callback_t read_src_wii_disc, void *callback_data, partition_selector_t sel, u8* header ) { u8 *b; int i; u32 tot; u32 wii_sec_per_wbfs_sect = 1 << (p->wbfs_sec_sz_s-p->wii_sec_sz_s); wiidisc_t *d = 0; u8 *used = 0; wbfs_disc_info_t *info = 0; tot = 0; used = wbfs_malloc(p->n_wii_sec_per_disc); if (!used) { WBFS_GOTO_ERROR("unable to alloc memory"); } d = wd_open_disc(read_src_wii_disc, callback_data); if (!d) { WBFS_GOTO_ERROR("unable to open wii disc"); } int result = wd_build_disc_usage(d,sel,used); wd_close_disc(d); d = 0; info = wbfs_ioalloc(p->disc_info_sz); b = (u8 *)info; read_src_wii_disc(callback_data, 0, 0x100, info->disc_header_copy); for (i = 0; i < p->n_wbfs_sec_per_disc; i++) { if (block_used(used, i, wii_sec_per_wbfs_sect)) { tot++; } } if(result) { memcpy(header, b,0x100); } error: if (d) wd_close_disc(d); if (used) wbfs_free(used); if (info) wbfs_iofree(info); return !result ? 0 : tot * ((p->wbfs_sec_sz / p->hd_sec_sz) * 512); } u32 wbfs_rm_disc(wbfs_t*p, u8* discid) { wbfs_disc_t *d = wbfs_open_disc(p,discid); int i; int discn = 0; int disc_info_sz_lba = p->disc_info_sz>>p->hd_sec_sz_s; if(!d) return 1; load_freeblocks(p); discn = d->i; for( i=0; i< p->n_wbfs_sec_per_disc; i++) { u32 iwlba = wbfs_ntohs(d->header->wlba_table[i]); if (iwlba) free_block(p,iwlba); } memset(d->header,0,p->disc_info_sz); p->write_hdsector(p->callback_data,p->part_lba+1+discn*disc_info_sz_lba,disc_info_sz_lba,d->header); p->head->disc_table[discn] = 0; wbfs_close_disc(d); wbfs_sync(p); return 0; } /* trim the file-system to its minimum size */ u32 wbfs_trim(wbfs_t*p) { u32 maxbl; load_freeblocks(p); maxbl = alloc_block(p); p->n_hd_sec = maxbl<<(p->wbfs_sec_sz_s-p->hd_sec_sz_s); p->head->n_hd_sec = wbfs_htonl(p->n_hd_sec); // make all block full memset(p->freeblks,0,p->n_wbfs_sec/8); wbfs_sync(p); // os layer will truncate the file. return maxbl; } // data extraction u32 wbfs_extract_disc(wbfs_disc_t*d, rw_sector_callback_t write_dst_wii_sector,void *callback_data,progress_callback_t spinner) { wbfs_t *p = d->p; u8* copy_buffer = 0; int tot = 0, cur = 0; int i; int filling_info = 0; int src_wbs_nlb=p->wbfs_sec_sz/p->hd_sec_sz; int dst_wbs_nlb=p->wbfs_sec_sz/p->wii_sec_sz; copy_buffer = wbfs_ioalloc(p->wbfs_sec_sz); if (!copy_buffer) WBFS_GOTO_ERROR("alloc memory"); if (spinner) { // count total number to write for spinner for (i = 0; i < p->n_wbfs_sec_per_disc; i++) { u32 iwlba = wbfs_ntohs(d->header->wlba_table[i]); if (iwlba) { tot++; spinner(0, tot); } } } for (i = 0; i < p->n_wbfs_sec_per_disc; i++) { u32 iwlba = wbfs_ntohs(d->header->wlba_table[i]); if (iwlba) { cur++; if (spinner) spinner(cur,tot); if(p->read_hdsector(p->callback_data, p->part_lba + iwlba*src_wbs_nlb, src_wbs_nlb, copy_buffer)) WBFS_GOTO_ERROR("reading disc"); if(write_dst_wii_sector(callback_data, i*dst_wbs_nlb, dst_wbs_nlb, copy_buffer)) WBFS_GOTO_ERROR("writing disc"); } else { switch (filling_info) { case 0: if (cur == tot) filling_info = 1; break; case 1: fprintf(stderr, "Filling empty space in extracted image. Please wait...\n"); filling_info = 2; break; case 2: default: break; } } } wbfs_iofree(copy_buffer); return 0; error: return 1; } u32 wbfs_extract_file(wbfs_disc_t* d, char *path); ./qwbfsmanager-1.2.1-src/libwbfs/bn.c0000755000175000017520000000361011361142533016713 0ustar pasnoxpasnox// Copyright 2007,2008 Segher Boessenkool // Licensed under the terms of the GNU GPL, version 2 // http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt #include #include #ifdef WIN32 #include #else #include "tools.h" #endif static void bn_print(char *name, u8 *a, u32 n) { u32 i; printf("%s = ", name); for (i = 0; i < n; i++) printf("%02x", a[i]); printf("\n"); } static void bn_zero(u8 *d, u32 n) { memset(d, 0, n); } static void bn_copy(u8 *d, u8 *a, u32 n) { memcpy(d, a, n); } int bn_compare(u8 *a, u8 *b, u32 n) { u32 i; for (i = 0; i < n; i++) { if (a[i] < b[i]) return -1; if (a[i] > b[i]) return 1; } return 0; } void bn_sub_modulus(u8 *a, u8 *N, u32 n) { u32 i; u32 dig; u8 c; c = 0; for (i = n - 1; i < n; i--) { dig = N[i] + c; c = (a[i] < dig); a[i] -= dig; } } void bn_add(u8 *d, u8 *a, u8 *b, u8 *N, u32 n) { u32 i; u32 dig; u8 c; c = 0; for (i = n - 1; i < n; i--) { dig = a[i] + b[i] + c; c = (dig >= 0x100); d[i] = dig; } if (c) bn_sub_modulus(d, N, n); if (bn_compare(d, N, n) >= 0) bn_sub_modulus(d, N, n); } void bn_mul(u8 *d, u8 *a, u8 *b, u8 *N, u32 n) { u32 i; u8 mask; bn_zero(d, n); for (i = 0; i < n; i++) for (mask = 0x80; mask != 0; mask >>= 1) { bn_add(d, d, d, N, n); if ((a[i] & mask) != 0) bn_add(d, d, b, N, n); } } void bn_exp(u8 *d, u8 *a, u8 *N, u32 n, u8 *e, u32 en) { u8 t[512]; u32 i; u8 mask; bn_zero(d, n); d[n-1] = 1; for (i = 0; i < en; i++) for (mask = 0x80; mask != 0; mask >>= 1) { bn_mul(t, d, d, N, n); if ((e[i] & mask) != 0) bn_mul(d, t, a, N, n); else bn_copy(d, t, n); } } // only for prime N -- stupid but lazy, see if I care void bn_inv(u8 *d, u8 *a, u8 *N, u32 n) { u8 t[512], s[512]; bn_copy(t, N, n); bn_zero(s, n); s[n-1] = 2; bn_sub_modulus(t, s, n); bn_exp(d, a, N, n, t, n); } ./qwbfsmanager-1.2.1-src/libwbfs/libwbfs_unix.c0000644000175000017520000001251011504137677021017 0ustar pasnoxpasnox#if defined( __linux__) || defined(__APPLE__) || defined(__CYGWIN__) #include #include #include #include #if defined(__linux__) #include #elif defined(__CYGWIN__) #include #else #include #endif #include #include #include "libwbfs.h" void *wbfs_open_file_for_read(char*filename) { FILE*f = fopen(filename,"r"); if (!f) wbfs_fatal("unable to open file\n"); return (void*)f; } void *wbfs_open_file_for_write(char*filename) { FILE*f = fopen(filename,"w"); if (!f) wbfs_fatal("unable to open file\n"); return (void*)f; } int wbfs_read_file(void*handle, int len, void *buf) { return fread(buf,len,1,(FILE*)handle); } int wbfs_close_file(void *handle) { return fclose((FILE*)handle) == 0 ? 0 : 1; } int wbfs_file_reserve_space(void*handle, long long size) { FILE*f=(FILE*)handle; int result; fseeko(f, size-1ULL, SEEK_SET); result = fwrite("", 1, 1, f); return result == 1 ? 0 : 1; } void wbfs_file_truncate(void *handle,long long size) { ftruncate(fileno((FILE*)handle),size); } int wbfs_read_wii_file(void*handle,u32 offset,u32 count,void*iobuf) { FILE*fp =handle; u64 off = offset; off<<=2; if (fseeko(fp, off, SEEK_SET)) { wbfs_error("error seeking in disc file (%ld)",off); return 1; } if (fread(iobuf, count, 1, fp) != 1){ wbfs_error("error reading disc 2"); return 1; } return 0; } int wbfs_write_wii_file(void*handle,u32 lba,u32 count,void*iobuf) { FILE*fp=handle; u64 off = lba; off *=0x8000; if (fseeko(fp, off, SEEK_SET)) { wbfs_error("error seeking in disc file (%lld)",off); return 1; } if (fwrite(iobuf, count*0x8000, 1, fp) != 1){ wbfs_error("error writing disc file"); return 1; } return 0; } static int wbfs_fread_sector(void *_fp,u32 lba,u32 count,void*buf) { FILE*fp =_fp; u64 off = lba; off*=512ULL; if (fseeko(fp, off, SEEK_SET)) { fprintf(stderr,"\n\n%lld %d %p\n",off,count,_fp); wbfs_error("error seeking in disc partition"); return 1; } if (fread(buf, count*512ULL, 1, fp) != 1){ wbfs_error("error reading disc 1"); return 1; } return 0; } static int wbfs_fwrite_sector(void *_fp,u32 lba,u32 count,void*buf) { FILE*fp =_fp; u64 off = lba; off*=512ULL; if (fseeko(fp, off, SEEK_SET)) { wbfs_error("error seeking in disc file"); return 1; } if (fwrite(buf, count*512ULL, 1, fp) != 1){ wbfs_error("error writing disc"); return 1; } return 0; } static int get_capacity(char *file,u32 *sector_size,u32 *n_sector) { int fd = open(file,O_RDONLY); int ret; if(fd<0){ return 0; } #if defined(__linux__) || defined(__CYGWIN__) if (sizeof(void *) == 8) { unsigned long long sec_size; ret = ioctl(fd,BLKSSZGET,&sec_size); *sector_size = (unsigned int) sec_size; } else ret = ioctl(fd,BLKSSZGET,sector_size); #else //__APPLE__ ret = ioctl(fd,DKIOCGETBLOCKSIZE,sector_size); #endif if(ret<0) { FILE *f; close(fd); f = fopen(file,"r"); fseeko(f,0,SEEK_END); *n_sector = ftello(f)/512; *sector_size = 512; fclose(f); return 1; } #if defined(__linux__) || defined(__CYGWIN__) if (sizeof(void *) == 8) { unsigned long long n_sec; ret = ioctl(fd,BLKGETSIZE,&n_sec); *n_sector = (unsigned int) n_sec; } else ret = ioctl(fd,BLKGETSIZE,n_sector); #else //__APPLE__ long long my_n_sector; ret = ioctl(fd,DKIOCGETBLOCKCOUNT,&my_n_sector); *n_sector = (long)my_n_sector; #endif close(fd); if(*sector_size>512) *n_sector*=*sector_size/512; if(*sector_size<512) *n_sector/=512/ *sector_size; return 1; } wbfs_t *wbfs_try_open_hd(char *fn,int reset) { u32 sector_size, n_sector; if(!get_capacity(fn,§or_size,&n_sector)) return NULL; FILE *f = fopen(fn,"r+"); if (!f) return NULL; return wbfs_open_hd(wbfs_fread_sector,wbfs_fwrite_sector,f, sector_size ,n_sector,reset); } wbfs_t *wbfs_try_open_partition(char *fn,int reset) { u32 sector_size, n_sector; if(!get_capacity(fn,§or_size,&n_sector)) return NULL; FILE *f = fopen(fn,"r+"); if (!f) return NULL; return wbfs_open_partition(wbfs_fread_sector,wbfs_fwrite_sector,f, sector_size ,n_sector,0,reset); } wbfs_t *wbfs_try_open(char *disc,char *partition, int reset) { wbfs_t *p = 0; if(partition) p = wbfs_try_open_partition(partition,reset); if (!p && !reset && disc) p = wbfs_try_open_hd(disc,0); else if(!p && !reset){ char buffer[32]; int i; #if defined(__linux__) || defined(__CYGWIN__) for (i='b';i<'z';i++) { snprintf(buffer,32,"/dev/sd%c",i); p = wbfs_try_open_hd(buffer,0); if (p) { fprintf(stderr,"using %s\n",buffer); return p; } snprintf(buffer,32,"/dev/hd%c",i); p = wbfs_try_open_hd(buffer,0); if (p) { fprintf(stderr,"using %s\n",buffer); return p; } } #else int j; for (i=0;i<10;i++) for (j=0;j<10;j++){ snprintf(buffer,32,"/dev/disk%ds%d",i,j); p = wbfs_try_open_partition(buffer,0); if (p) { fprintf(stderr,"using %s\n",buffer); return p; } } #endif wbfs_error("cannot find any wbfs partition (verify permissions))"); } return p; } #endif //__linux__ or __APPLE__ ./qwbfsmanager-1.2.1-src/libwbfs/libwbfs_os.h0000755000175000017520000000171211401176126020453 0ustar pasnoxpasnox#ifndef LIBWBFS_OS_H #define LIBWBFS_OS_H // this file abstract the os integration // libwbfs_glue.h for segher tools env. // standard u8, u32 and co types, + fatal #include "tools.h" #include #ifdef WIN32 #define wbfs_fatal non_fatal #define wbfs_error non_fatal #define wbfs_warning non_fatal #else #define wbfs_fatal non_fatal #define wbfs_error non_fatal #define wbfs_warning non_fatal #endif #include #define wbfs_malloc(x) malloc(x) #define wbfs_free(x) free(x) // alloc memory space suitable for disk io #define wbfs_ioalloc(x) malloc(x) #define wbfs_iofree(x) free(x) #ifdef WIN32 #include #else #include #endif // endianess tools #define wbfs_ntohl(x) ntohl(x) #define wbfs_ntohs(x) ntohs(x) #define wbfs_htonl(x) htonl(x) #define wbfs_htons(x) htons(x) #include #define wbfs_memcmp(x,y,z) memcmp(x,y,z) #define wbfs_memcpy(x,y,z) memcpy(x,y,z) #define wbfs_memset(x,y,z) memset(x,y,z) #endif ./qwbfsmanager-1.2.1-src/libwbfs/ec.c0000755000175000017520000001322211361142533016703 0ustar pasnoxpasnox// Copyright 2007,2008 Segher Boessenkool // Licensed under the terms of the GNU GPL, version 2 // http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt #include #include #include "tools.h" // y**2 + x*y = x**3 + x + b static u8 ec_b[30] = "\x00\x66\x64\x7e\xde\x6c\x33\x2c\x7f\x8c\x09\x23\xbb\x58\x21" "\x3b\x33\x3b\x20\xe9\xce\x42\x81\xfe\x11\x5f\x7d\x8f\x90\xad"; // order of the addition group of points static u8 ec_N[30] = "\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x13\xe9\x74\xe7\x2f\x8a\x69\x22\x03\x1d\x26\x03\xcf\xe0\xd7"; // base point static u8 ec_G[60] = "\x00\xfa\xc9\xdf\xcb\xac\x83\x13\xbb\x21\x39\xf1\xbb\x75\x5f" "\xef\x65\xbc\x39\x1f\x8b\x36\xf8\xf8\xeb\x73\x71\xfd\x55\x8b" "\x01\x00\x6a\x08\xa4\x19\x03\x35\x06\x78\xe5\x85\x28\xbe\xbf" "\x8a\x0b\xef\xf8\x67\xa7\xca\x36\x71\x6f\x7e\x01\xf8\x10\x52"; static void elt_print(char *name, u8 *a) { u32 i; printf("%s = ", name); for (i = 0; i < 30; i++) printf("%02x", a[i]); printf("\n"); } static void elt_copy(u8 *d, u8 *a) { memcpy(d, a, 30); } static void elt_zero(u8 *d) { memset(d, 0, 30); } static int elt_is_zero(u8 *d) { u32 i; for (i = 0; i < 30; i++) if (d[i] != 0) return 0; return 1; } static void elt_add(u8 *d, u8 *a, u8 *b) { u32 i; for (i = 0; i < 30; i++) d[i] = a[i] ^ b[i]; } static void elt_mul_x(u8 *d, u8 *a) { u8 carry, x, y; u32 i; carry = a[0] & 1; x = 0; for (i = 0; i < 29; i++) { y = a[i + 1]; d[i] = x ^ (y >> 7); x = y << 1; } d[29] = x ^ carry; d[20] ^= carry << 2; } static void elt_mul(u8 *d, u8 *a, u8 *b) { u32 i, n; u8 mask; elt_zero(d); i = 0; mask = 1; for (n = 0; n < 233; n++) { elt_mul_x(d, d); if ((a[i] & mask) != 0) elt_add(d, d, b); mask >>= 1; if (mask == 0) { mask = 0x80; i++; } } } static const u8 square[16] = "\x00\x01\x04\x05\x10\x11\x14\x15\x40\x41\x44\x45\x50\x51\x54\x55"; static void elt_square_to_wide(u8 *d, u8 *a) { u32 i; for (i = 0; i < 30; i++) { d[2*i] = square[a[i] >> 4]; d[2*i + 1] = square[a[i] & 15]; } } static void wide_reduce(u8 *d) { u32 i; u8 x; for (i = 0; i < 30; i++) { x = d[i]; d[i + 19] ^= x >> 7; d[i + 20] ^= x << 1; d[i + 29] ^= x >> 1; d[i + 30] ^= x << 7; } x = d[30] & ~1; d[49] ^= x >> 7; d[50] ^= x << 1; d[59] ^= x >> 1; d[30] &= 1; } static void elt_square(u8 *d, u8 *a) { u8 wide[60]; elt_square_to_wide(wide, a); wide_reduce(wide); elt_copy(d, wide + 30); } static void itoh_tsujii(u8 *d, u8 *a, u8 *b, u32 j) { u8 t[30]; elt_copy(t, a); while (j--) { elt_square(d, t); elt_copy(t, d); } elt_mul(d, t, b); } static void elt_inv(u8 *d, u8 *a) { u8 t[30]; u8 s[30]; itoh_tsujii(t, a, a, 1); itoh_tsujii(s, t, a, 1); itoh_tsujii(t, s, s, 3); itoh_tsujii(s, t, a, 1); itoh_tsujii(t, s, s, 7); itoh_tsujii(s, t, t, 14); itoh_tsujii(t, s, a, 1); itoh_tsujii(s, t, t, 29); itoh_tsujii(t, s, s, 58); itoh_tsujii(s, t, t, 116); elt_square(d, s); } static int point_is_on_curve(u8 *p) { u8 s[30], t[30]; u8 *x, *y; x = p; y = p + 30; elt_square(t, x); elt_mul(s, t, x); elt_add(s, s, t); elt_square(t, y); elt_add(s, s, t); elt_mul(t, x, y); elt_add(s, s, t); elt_add(s, s, ec_b); return elt_is_zero(s); } static int point_is_zero(u8 *p) { return elt_is_zero(p) && elt_is_zero(p + 30); } static void point_double(u8 *r, u8 *p) { u8 s[30], t[30]; u8 *px, *py, *rx, *ry; px = p; py = p + 30; rx = r; ry = r + 30; if (elt_is_zero(px)) { elt_zero(rx); elt_zero(ry); return; } elt_inv(t, px); elt_mul(s, py, t); elt_add(s, s, px); elt_square(t, px); elt_square(rx, s); elt_add(rx, rx, s); rx[29] ^= 1; elt_mul(ry, s, rx); elt_add(ry, ry, rx); elt_add(ry, ry, t); } static void point_add(u8 *r, u8 *p, u8 *q) { u8 s[30], t[30], u[30]; u8 *px, *py, *qx, *qy, *rx, *ry; px = p; py = p + 30; qx = q; qy = q + 30; rx = r; ry = r + 30; if (point_is_zero(p)) { elt_copy(rx, qx); elt_copy(ry, qy); return; } if (point_is_zero(q)) { elt_copy(rx, px); elt_copy(ry, py); return; } elt_add(u, px, qx); if (elt_is_zero(u)) { elt_add(u, py, qy); if (elt_is_zero(u)) point_double(r, p); else { elt_zero(rx); elt_zero(ry); } return; } elt_inv(t, u); elt_add(u, py, qy); elt_mul(s, t, u); elt_square(t, s); elt_add(t, t, s); elt_add(t, t, qx); t[29] ^= 1; elt_mul(u, s, t); elt_add(s, u, py); elt_add(rx, t, px); elt_add(ry, s, rx); } static void point_mul(u8 *d, u8 *a, u8 *b) // a is bignum { u32 i; u8 mask; elt_zero(d); elt_zero(d + 30); for (i = 0; i < 30; i++) for (mask = 0x80; mask != 0; mask >>= 1) { point_double(d, d); if ((a[i] & mask) != 0) point_add(d, d, b); } } void generate_ecdsa(u8 *R, u8 *S, u8 *k, u8 *hash) { u8 e[30]; u8 kk[30]; elt_zero(e); memcpy(e + 10, hash, 20); // should take random m --> but we take 1 // R = (mG).x // S = m**-1*(e + Rk) (mod N) // so, we get: // R = G.x // S = e + Rk (mod N) elt_copy(R, ec_G); if (bn_compare(R, ec_N, 30) >= 0) bn_sub_modulus(R, ec_N, 30); elt_copy(kk, k); if (bn_compare(kk, ec_N, 30) >= 0) bn_sub_modulus(kk, ec_N, 30); bn_mul(S, R, kk, ec_N, 30); bn_add(S, S, e, ec_N, 30); } int check_ecdsa(u8 *Q, u8 *R, u8 *S, u8 *hash) { u8 Sinv[30]; u8 e[30]; u8 w1[30], w2[30]; u8 r1[60], r2[60]; bn_inv(Sinv, S, ec_N, 30); elt_zero(e); memcpy(e + 10, hash, 20); bn_mul(w1, e, Sinv, ec_N, 30); bn_mul(w2, R, Sinv, ec_N, 30); point_mul(r1, w1, ec_G); point_mul(r2, w2, Q); point_add(r1, r1, r2); if (bn_compare(r1, ec_N, 30) >= 0) bn_sub_modulus(r1, ec_N, 30); return (bn_compare(r1, R, 30) == 0); } void ec_priv_to_pub(u8 *k, u8 *Q) { point_mul(Q, k, ec_G); } ./qwbfsmanager-1.2.1-src/libwbfs/tools.h0000755000175000017520000000353311361142533017465 0ustar pasnoxpasnox// Copyright 2007,2008 Segher Boessenkool // Licensed under the terms of the GNU GPL, version 2 // http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt #ifndef _TOOLS_H #define _TOOLS_H #ifdef WIN32 // A bit untidy for now - g3power #define SPINNER_MOD #endif // basic data types typedef unsigned char u8; typedef unsigned short u16; typedef unsigned int u32; typedef unsigned long long u64; u16 be16(const u8 *p); u32 be32(const u8 *p); u64 be64(const u8 *p); u64 be34(const u8 *p); void wbe16(u8 *p, u16 x); void wbe32(u8 *p, u32 x); void wbe64(u8 *p, u64 x); //#define round_down(x,n) ((x) & -(n)) #define round_up(x,n) (-(-(x) & -(n))) // bignum int bn_compare(u8 *a, u8 *b, u32 n); void bn_sub_modulus(u8 *a, u8 *N, u32 n); void bn_add(u8 *d, u8 *a, u8 *b, u8 *N, u32 n); void bn_mul(u8 *d, u8 *a, u8 *b, u8 *N, u32 n); void bn_inv(u8 *d, u8 *a, u8 *N, u32 n); // only for prime N void bn_exp(u8 *d, u8 *a, u8 *N, u32 n, u8 *e, u32 en); // crypto void md5(u8 *data, u32 len, u8 *hash); void sha(u8 *data, u32 len, u8 *hash); void get_key(const char *name, u8 *key, u32 len); void aes_cbc_dec(u8 *key, u8 *iv, u8 *in, u32 len, u8 *out); void aes_cbc_enc(u8 *key, u8 *iv, u8 *in, u32 len, u8 *out); void decrypt_title_key(u8 *tik, u8 *title_key); int check_cert_chain(u8 *data, u32 data_len, u8 *cert, u32 cert_len); int check_ec(u8 *ng, u8 *ap, u8 *sig, u8 *sig_hash); void generate_ecdsa(u8 *R, u8 *S, u8 *k, u8 *hash); int check_ecdsa(u8 *Q, u8 *R, u8 *S, u8 *hash); void ec_priv_to_pub(u8 *k, u8 *Q); // compression void do_yaz0(u8 *in, u32 in_size, u8 *out, u32 out_size); // error handling void fatal(const char *s, ...); void non_fatal(const char *s, ...); // output formatting void print_bytes(u8 *x, u32 n); void hexdump(u8 *x, u32 n); void dump_tmd(u8 *tmd); void spinner(u64 x, u64 max); void progress(u64 x, u64 max); #endif ./qwbfsmanager-1.2.1-src/libwbfs/wiidisc.c0000755000175000017520000002300111362160431017741 0ustar pasnoxpasnox// Copyright 2009 Kwiirk based on negentig.c: // Copyright 2007,2008 Segher Boessenkool // Licensed under the terms of the GNU GPL, version 2 // http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt #include "wiidisc.h" void aes_set_key(u8 *key); void aes_decrypt(u8 *iv, u8 *inbuf, u8 *outbuf, unsigned long long len); static void _decrypt_title_key(u8 *tik, u8 *title_key) { u8 common_key[16]={ 0xeb, 0xe4, 0x2a, 0x22, 0x5e, 0x85, 0x93, 0xe4, 0x48, 0xd9, 0xc5, 0x45, 0x73, 0x81, 0xaa, 0xf7 }; u8 iv[16]; wbfs_memset(iv, 0, sizeof iv); wbfs_memcpy(iv, tik + 0x01dc, 8); aes_set_key(common_key); //_aes_cbc_dec(common_key, iv, tik + 0x01bf, 16, title_key); aes_decrypt(iv, tik + 0x01bf,title_key,16); } static u32 _be32(const u8 *p) { return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]; } static void disc_read(wiidisc_t *d,u32 offset, u8 *data, u32 len) { if(data){ int ret=0; if(len==0) return ; ret = d->read(d->fp,offset,len,data); if(ret) wbfs_fatal("error reading disc (disc_read)"); } if(d->sector_usage_table) { u32 blockno = offset>>13; do { d->sector_usage_table[blockno]=1; blockno+=1; if(len>0x8000) len-=0x8000; }while(len>0x8000); } } static void partition_raw_read(wiidisc_t *d,u32 offset, u8 *data, u32 len) { disc_read(d, d->partition_raw_offset + offset, data, len); } static void partition_read_block(wiidisc_t *d,u32 blockno, u8 *block) { u8*raw = d->tmp_buffer; u8 iv[16]; u32 offset; if(d->sector_usage_table) d->sector_usage_table[d->partition_block+blockno]=1; offset = d->partition_data_offset + ((0x8000>>2) * blockno); partition_raw_read(d,offset, raw, 0x8000); // decrypt data memcpy(iv, raw + 0x3d0, 16); aes_set_key(d->disc_key); aes_decrypt(iv, raw + 0x400,block,0x7c00); } static void partition_read(wiidisc_t *d,u32 offset, u8 *data, u32 len,int fake) { u8 *block = d->tmp_buffer2; u32 offset_in_block; u32 len_in_block; if(fake && d->sector_usage_table==0) return; while(len) { offset_in_block = offset % (0x7c00>>2); len_in_block = 0x7c00 - (offset_in_block<<2); if (len_in_block > len) len_in_block = len; if(!fake){ partition_read_block(d,offset / (0x7c00>>2), block); wbfs_memcpy(data, block + (offset_in_block<<2), len_in_block); }else d->sector_usage_table[d->partition_block+(offset/(0x7c00>>2))]=1; data += len_in_block; offset += len_in_block>>2; len -= len_in_block; } } static u32 do_fst(wiidisc_t *d,u8 *fst, const char *names, u32 i) { u32 offset; u32 size; const char *name; u32 j; name = names + (_be32(fst + 12*i) & 0x00ffffff); size = _be32(fst + 12*i + 8); if (i == 0) { for (j = 1; j < size && !d->extracted_buffer; ){ j = do_fst(d,fst, names, j); } return size; } //printf("name %s\n",name); if (fst[12*i]) { for (j = i + 1; j < size && !d->extracted_buffer; ) j = do_fst(d,fst, names, j); return size; } else { offset = _be32(fst + 12*i + 4); if(d->extract_pathname && strcmp(name, d->extract_pathname)==0) { d->extracted_buffer = wbfs_ioalloc(size); partition_read(d,offset, d->extracted_buffer, size,0); }else partition_read(d,offset, 0, size,1); return i + 1; } } static void do_files(wiidisc_t*d) { u8 *b = wbfs_ioalloc(0x480); // XXX: determine actual header size u32 dol_offset; u32 fst_offset; u32 fst_size; u32 apl_offset; u32 apl_size; u8 *apl_header = wbfs_ioalloc(0x20); u8 *fst; u32 n_files; partition_read(d,0, b, 0x480,0); dol_offset = _be32(b + 0x0420); fst_offset = _be32(b + 0x0424); fst_size = _be32(b + 0x0428)<<2; apl_offset = 0x2440>>2; partition_read(d,apl_offset, apl_header, 0x20,0); apl_size = 0x20 + _be32(apl_header + 0x14) + _be32(apl_header + 0x18); // fake read dol and partition partition_read(d,apl_offset, 0, apl_size,1); partition_read(d,dol_offset, 0, (fst_offset - dol_offset)<<2,1); fst = wbfs_ioalloc(fst_size); if (fst == 0) wbfs_fatal("malloc fst"); partition_read(d,fst_offset, fst, fst_size,0); n_files = _be32(fst + 8); if (n_files > 1) do_fst(d,fst, (char *)fst + 12*n_files, 0); wbfs_iofree(b); wbfs_iofree(apl_header); wbfs_iofree(fst); } static void do_partition(wiidisc_t*d) { u8 *tik = wbfs_ioalloc(0x2a4); u8 *b = wbfs_ioalloc(0x1c); u64 tmd_offset; u32 tmd_size; u8 *tmd; u64 cert_offset; u32 cert_size; u8 *cert; u64 h3_offset; // read ticket, and read some offsets and sizes partition_raw_read(d,0, tik, 0x2a4); partition_raw_read(d,0x2a4>>2, b, 0x1c); tmd_size = _be32(b); tmd_offset = _be32(b + 4); cert_size = _be32(b + 8); cert_offset = _be32(b + 0x0c); h3_offset = _be32(b + 0x10); d->partition_data_offset = _be32(b + 0x14); d->partition_block = (d->partition_raw_offset+d->partition_data_offset)>>13; tmd = wbfs_ioalloc(tmd_size); if (tmd == 0) wbfs_fatal("malloc tmd"); partition_raw_read(d,tmd_offset, tmd, tmd_size); cert = wbfs_ioalloc(cert_size); if (cert == 0) wbfs_fatal("malloc cert"); partition_raw_read(d,cert_offset, cert, cert_size); _decrypt_title_key(tik, d->disc_key); partition_raw_read(d,h3_offset, 0, 0x18000); wbfs_iofree(b); wbfs_iofree(tik); wbfs_iofree(cert); wbfs_iofree(tmd); do_files(d); } static int test_parition_skip(u32 partition_type,partition_selector_t part_sel) { switch(part_sel) { case ALL_PARTITIONS: return 0; case REMOVE_UPDATE_PARTITION: return (partition_type==1); case ONLY_GAME_PARTITION: return (partition_type!=0); default: return (partition_type!=part_sel); } } static int do_disc(wiidisc_t*d) { u8 *b = wbfs_ioalloc(0x100); u64 partition_offset[32]; // XXX: don't know the real maximum u64 partition_type[32]; // XXX: don't know the real maximum u32 n_partitions; u32 magic; u32 i; disc_read(d,0, b, 0x100); magic=_be32(b+24); if(magic!=0x5D1C9EA3){ wbfs_iofree(b); wbfs_error("not a wii disc"); return 0; } disc_read(d,0x40000>>2, b, 0x100); n_partitions = _be32(b); disc_read(d,_be32(b + 4), b, 0x100); for (i = 0; i < n_partitions; i++){ partition_offset[i] = _be32(b + 8 * i); partition_type[i] = _be32(b + 8 * i+4); } for (i = 0; i < n_partitions; i++) { d->partition_raw_offset = partition_offset[i]; if(!test_parition_skip(partition_type[i],d->part_sel)) do_partition(d); } wbfs_iofree(b); return 1; } wiidisc_t *wd_open_disc(read_wiidisc_callback_t read,void*fp) { wiidisc_t *d = wbfs_malloc(sizeof(wiidisc_t)); if(!d) return 0; wbfs_memset(d,0,sizeof(wiidisc_t)); d->read = read; d->fp = fp; d->part_sel = ALL_PARTITIONS; d->tmp_buffer = wbfs_ioalloc(0x8000); d->tmp_buffer2 = wbfs_malloc(0x8000); return d; } void wd_close_disc(wiidisc_t *d) { wbfs_iofree(d->tmp_buffer); wbfs_free(d->tmp_buffer2); wbfs_free(d); } // returns a buffer allocated with wbfs_ioalloc() or NULL if not found of alloc error // XXX pathname not implemented. files are extracted by their name. // first file found with that name is returned. u8 * wd_extract_file(wiidisc_t *d, partition_selector_t partition_type, char *pathname) { u8 *retval = 0; d->extract_pathname = pathname; d->extracted_buffer = 0; d->part_sel = partition_type; int result = do_disc(d); d->extract_pathname = 0; d->part_sel = ALL_PARTITIONS; retval = result == 0 ? 0 : d->extracted_buffer; d->extracted_buffer = 0; return retval; } int wd_build_disc_usage(wiidisc_t *d, partition_selector_t selector, u8* usage_table) { d->sector_usage_table = usage_table; wbfs_memset(usage_table,0,143432*2); d->part_sel = selector; int result = do_disc(d); d->part_sel = ALL_PARTITIONS; d->sector_usage_table = 0; return result; } void wd_fix_partition_table(wiidisc_t *d, partition_selector_t selector, u8* partition_table) { u8 *b = partition_table; u32 partition_offset; u32 partition_type; u32 n_partitions,i,j; u32 *b32; if(selector == ALL_PARTITIONS) return; n_partitions = _be32(b); if(_be32(b + 4)-(0x40000>>2) >0x50) wbfs_fatal("cannot modify this partition table. Please report the bug."); b += (_be32(b + 4)-(0x40000>>2))*4; j=0; for (i = 0; i < n_partitions; i++){ partition_offset = _be32(b + 8 * i); partition_type = _be32(b + 8 * i+4); if(!test_parition_skip(partition_type,selector)) { b32 = (u32*)(b + 8 * j); b32[0] = wbfs_htonl(partition_offset); b32[1] = wbfs_htonl(partition_type); j++; } } b32 = (u32*)(partition_table); *b32 = wbfs_htonl(j); } ./qwbfsmanager-1.2.1-src/libwbfs/libwbfs_win32.c0000755000175000017520000001373611504137677021014 0ustar pasnoxpasnox#ifdef WIN32 #include #include #include #include #include #include #include #include #include "libwbfs.h" void *wbfs_open_file_for_read(char*filename) { HANDLE *handle = CreateFile(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); if (handle == INVALID_HANDLE_VALUE) { fprintf(stderr, "unable to open disc file\n"); return 0; } return (void*)handle; } void *wbfs_open_file_for_write(char*filename) { HANDLE *handle = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, NULL); if (handle == INVALID_HANDLE_VALUE) { fprintf(stderr, "unable to open file\n"); return 0; } return (void*)handle; } int wbfs_read_file(void*handle, int len, void *buf) { DWORD read; ReadFile((HANDLE)handle, buf, len, &read, NULL); return read; } int wbfs_close_file(void *handle) { return CloseHandle((HANDLE)handle) == 0 ? 1 : 0; } int wbfs_file_reserve_space(void*handle,long long size) { int result; LARGE_INTEGER large; large.QuadPart = size; result = SetFilePointerEx((HANDLE)handle, large, NULL, FILE_BEGIN); if ( result != 0 ) { result = SetEndOfFile((HANDLE)handle); } return result == 0 ? 1 : 0; } void wbfs_file_truncate(void *handle,long long size) { _chsize(fileno((FILE*)handle),size); } int wbfs_read_wii_file(void *_handle, u32 _offset, u32 count, void *buf) { HANDLE *handle = (HANDLE *)_handle; LARGE_INTEGER large; DWORD read; u64 offset = _offset; offset <<= 2; large.QuadPart = offset; if (SetFilePointerEx(handle, large, NULL, FILE_BEGIN) == FALSE) { wbfs_error("error seeking in disc file"); return 1; } read = 0; if ((ReadFile(handle, buf, count, &read, NULL) == FALSE) || !read) { wbfs_error("error reading wii disc sector"); return 1; } if (read < count) { wbfs_warning("warning: requested %d, but read only %d bytes (trimmed or bad padded ISO)", count, read); wbfs_memset((u8*)buf+read, 0, count-read); } return 0; } int wbfs_write_wii_file(void *_handle, u32 lba, u32 count, void *buf) { HANDLE *handle = (HANDLE *)_handle; LARGE_INTEGER large; DWORD written; u64 offset = lba; offset *= 0x8000; large.QuadPart = offset; if (SetFilePointerEx(handle, large, NULL, FILE_BEGIN) == FALSE) { fprintf(stderr,"\n\n%lld %p\n", offset, handle); wbfs_error("error seeking in wii disc sector (write)"); return 1; } written = 0; if (WriteFile(handle, buf, count * 0x8000, &written, NULL) == FALSE) { wbfs_error("error writing wii disc sector"); return 1; } if (written != count * 0x8000) { wbfs_error("error writing wii disc sector (size mismatch)"); return 1; } return 0; } static int read_sector(void *_handle, u32 lba, u32 count, void *buf) { HANDLE *handle = (HANDLE *)_handle; LARGE_INTEGER large; DWORD read; u64 offset = lba; offset *= 512ULL; large.QuadPart = offset; if (SetFilePointerEx(handle, large, NULL, FILE_BEGIN) == FALSE) { fprintf(stderr, "\n\n%lld %d %p\n", offset, count, _handle); wbfs_error("error seeking in hd sector (read)"); return 1; } read = 0; if (ReadFile(handle, buf, count * 512ULL, &read, NULL) == FALSE) { wbfs_error("error reading hd sector"); return 1; } return 0; } static int write_sector(void *_handle, u32 lba, u32 count, void *buf) { HANDLE *handle = (HANDLE *)_handle; LARGE_INTEGER large; DWORD written; u64 offset = lba; offset *= 512ULL; large.QuadPart = offset; if (SetFilePointerEx(handle, large, NULL, FILE_BEGIN) == FALSE) { wbfs_error("error seeking in hd sector (write)"); return 1; } written = 0; if (WriteFile(handle, buf, count * 512ULL, &written, NULL) == FALSE) { wbfs_error("error writing hd sector"); return 1; } return 0; } static void close_handle(void *handle) { CloseHandle((HANDLE *)handle); } static int get_capacity(char *fileName, u32 *sector_size, u32 *sector_count) { DISK_GEOMETRY dg; PARTITION_INFORMATION pi; DWORD bytes; HANDLE *handle = CreateFile(fileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL); if (handle == INVALID_HANDLE_VALUE) { wbfs_error("could not open drive"); return 0; } if (DeviceIoControl(handle, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0, &dg, sizeof(DISK_GEOMETRY), &bytes, NULL) == FALSE) { CloseHandle(handle); wbfs_error("could not get drive geometry"); return 0; } *sector_size = dg.BytesPerSector; if (DeviceIoControl(handle, IOCTL_DISK_GET_PARTITION_INFO, NULL, 0, &pi, sizeof(PARTITION_INFORMATION), &bytes, NULL) == FALSE) { CloseHandle(handle); wbfs_error("could not get partition info"); return 0; } *sector_count = (u32)(pi.PartitionLength.QuadPart / dg.BytesPerSector); CloseHandle(handle); return 1; } wbfs_t *wbfs_try_open_hd(char *driveName, int reset) { wbfs_error("no direct harddrive support"); return 0; } wbfs_t *wbfs_try_open_partition(char *partitionLetter, int reset) { HANDLE *handle; char drivePath[8] = "\\\\?\\Z:"; u32 sector_size, sector_count; if (strlen(partitionLetter) != 1) { wbfs_error("bad drive name"); return NULL; } drivePath[4] = partitionLetter[0]; if (!get_capacity(drivePath, §or_size, §or_count)) { return NULL; } handle = CreateFile(drivePath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL); if (handle == INVALID_HANDLE_VALUE) { return NULL; } return wbfs_open_partition(read_sector, write_sector, close_handle, handle, sector_size, sector_count, 0, reset); } wbfs_t *wbfs_try_open(char *disc, char *partition, int reset) { wbfs_t *p = 0; if (partition) { p = wbfs_try_open_partition(partition,reset); } if (!p && !reset && disc) { p = 0; } else if(!p && !reset) { p = 0; } return p; } #endif ./qwbfsmanager-1.2.1-src/libwbfs/wiidisc.h0000755000175000017520000000371111362160431017754 0ustar pasnoxpasnox#ifndef WIIDISC_H #define WIIDISC_H #include #include "libwbfs_os.h" // this file is provided by the project wanting to compile libwbfs and wiidisc #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #if 0 //removes extra automatic indentation by editors } #endif // callback definition. Return 1 on fatal error (callback is supposed to make retries until no hopes..) // offset points 32bit words, count counts bytes typedef int (*read_wiidisc_callback_t)(void*fp,u32 offset,u32 count,void*iobuf); typedef enum{ UPDATE_PARTITION_TYPE=0, GAME_PARTITION_TYPE, OTHER_PARTITION_TYPE, // value in between selects partition types of that value ALL_PARTITIONS=0xffffffff-3, REMOVE_UPDATE_PARTITION, // keeps game + channel installers ONLY_GAME_PARTITION, }partition_selector_t; typedef struct wiidisc_s { read_wiidisc_callback_t read; void *fp; u8 *sector_usage_table; // everything points 32bit words. u32 disc_raw_offset; u32 partition_raw_offset; u32 partition_data_offset; u32 partition_data_size; u32 partition_block; u8 *tmp_buffer; u8 *tmp_buffer2; u8 disc_key[16]; int dont_decrypt; partition_selector_t part_sel; char *extract_pathname; u8 *extracted_buffer; }wiidisc_t; wiidisc_t *wd_open_disc(read_wiidisc_callback_t read,void*fp); void wd_close_disc(wiidisc_t *); // returns a buffer allocated with wbfs_ioalloc() or NULL if not found of alloc error u8 * wd_extract_file(wiidisc_t *d, partition_selector_t partition_type, char *pathname); int wd_build_disc_usage(wiidisc_t *d, partition_selector_t selector, u8* usage_table); // effectively remove not copied partition from the partition table. void wd_fix_partition_table(wiidisc_t *d, partition_selector_t selector, u8* partition_table); #if 0 { #endif #ifdef __cplusplus } #endif /* __cplusplus */ #endif ./qwbfsmanager-1.2.1-src/libwbfs/libwbfs.pri0000644000175000017520000000135211410720766020317 0ustar pasnoxpasnox########################################################################################### ## Created using Monkey Studio v1.8.4.0 (1.8.4.0) ## ## Author : Filipe Azevedo aka Nox P@sNox ## Project : libwbfs ## FileName : libwbfs.pri ## Date : 2010-04-04T11:04:05 ## License : GPL2 ## Comment : Creating using Monkey Studio RAD ## Home Page : http://code.google.com/p/qwbfs ## ########################################################################################### include($$PWD/shared.pri) LIBS *= -L$${LIB_WBFS_BUILD_PATH} CONFIG(debug, debug|release) { #Debug unix:LIBS *= -lwbfs_debug else:LIBS *= -lwbfsd } else { #Release LIBS *= -lwbfs } win32:LIBS *= -lws2_32 -leay32 else:LIBS *= -lcrypto./qwbfsmanager-1.2.1-src/README0000644000175000017520000000410411544176431015403 0ustar pasnoxpasnoxQWBFS Manager ============= Home page: http://code.google.com/p/qwbfs IRC Channel: #qwbfs on irc.Abjects.net (irc://irc.Abjects.net/qwbfs) QWBFS Manager is a cross platform WBFS manager running on Windows, Mac OS X, Linux & Unix like systems. IMPORTANT NOTICE ================ I DO NOT TAKE ANY RESPONSIBILITY FOR ANY DAMAGE TO YOUR HARDWARE OR YOUR DATA BECAUSE OF IMPROPER USAGE OF THIS SOFTWARE. Requirements ============ - Build tool chain (GCC...) - Qt >= 4.5.x - OpenSSL (Windows: http://www.slproweb.com/download/Win32OpenSSL-0_9_8q.exe) - A computer - A chair - A brain - Some fingers Build instructions ================== - unpack the sources archive - cd in the uncompress folder - qmake PREFIX=/usr/local - make - sudo make install License ======= 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 3 of the License, or (at your option) any later version. This package is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . In addition, as a special exception, the copyright holders give permission to link this program with the OpenSSL project's "OpenSSL" library (or with modified versions of it that use the same license as the "OpenSSL" library), and distribute the linked executables. You must obey the GNU General Public License in all respects for all of the code used other than "OpenSSL". If you modify file(s), you may extend this exception to your version of the file(s), but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. Disclamer ========== I DO NOT TAKE ANY RESPONSIBILITY FOR ANY DAMAGE TO YOUR HARDWARE OR YOUR DATA BECAUSE OF IMPROPER USAGE OF THIS SOFTWARE. Enjoy, P@sNox./qwbfsmanager-1.2.1-src/fresh/0000755000175000017520000000000011546156115015632 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/fresh/translations/0000755000175000017520000000000011546156115020353 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/fresh/translations/fresh-uk_UA.ts0000644000175000017520000005642111546156115023044 0ustar pasnoxpasnox QObject N/C B KB MB GB TB PB Too big pActionsNodeModel Action Shortcut Default Shortcut pActionsNodeShortcutEditor Shortcut Editor Filter Validate the shortcut Clear the shortcut Text filter... Can't set shortcut, it's maybe already used by another action. Can't restore default shortcut, it's maybe already used by another action. pColorButton Choose a color pConsole Clear the screen An alias for clear command Reset the console List available commands %1 take no parameter No help available Available commands: For specific command details, type: <command> -h/--help Press 'Tab' key to list or auto complete commands, type help for commands help. %1: Command not found. No description available pDockToolBar %1 exclusive pDockToolBarManager Top toolbar Top toolbar visible Bottom toolbar Bottom toolbar visible Left toolbar Left toolbar visible Right toolbar Right toolbar visible Modern dock toolbar manager pEnvironmentVariableEditor Name: Value: pEnvironmentVariablesEditor Environment Variables Editor Add Add a new variable Edit Edit the selected variable Remove Remove the selected variable Del Clear Clear all variables Reset to default Reset to system variables Reset to default variables Add a new variable... The variable '%1' already exists, update it? Edit a variable... Are you sure you want to remove the variable '%1' ? Are you sure you want to clear all variables? pEnvironmentVariablesModel Name: %1 Value: %1 Enabled: %1 true false Name Value pFileDialog Codec: Open in read only. pFileListEditor Choose file(s) Choose file pKeySequenceEdit Press a keybord shortcut... pLineEdit Search Options Clear pPathListEditor Choose directory pPaypalButton Donation Make a donation via Paypal pStringListEditor Add Item Edit Item Remove Item Clear Items Move Item Up Move Item Down New item %1 pStylesActionGroup (System) pTranslationDialog Choose a translation locale Select the locale you want to use with the application. You can click on buttons to locate/reload the translations. Click here to change the application translations paths Click here to reload the translations Choose folders containing your application translations pUpdateChecker Update Check for update pUpdateCheckerDialog Update Checker When an update is detected, you can directly download it (or update it with your package manager). Generally lastest updates fix bugs and/or add new options/plugins/things. Updated on %1 by %2 You are using version <b>%1</b> (%2). Download An error occur: %1 You are running the last available version. An error occur while parsing xml, retry later. ./qwbfsmanager-1.2.1-src/fresh/translations/fresh-ja_JP.ts0000644000175000017520000005642111546156115023023 0ustar pasnoxpasnox QObject N/C B KB MB GB TB PB Too big pActionsNodeModel Action Shortcut Default Shortcut pActionsNodeShortcutEditor Shortcut Editor Filter Validate the shortcut Clear the shortcut Text filter... Can't set shortcut, it's maybe already used by another action. Can't restore default shortcut, it's maybe already used by another action. pColorButton Choose a color pConsole Clear the screen An alias for clear command Reset the console List available commands %1 take no parameter No help available Available commands: For specific command details, type: <command> -h/--help Press 'Tab' key to list or auto complete commands, type help for commands help. %1: Command not found. No description available pDockToolBar %1 exclusive pDockToolBarManager Top toolbar Top toolbar visible Bottom toolbar Bottom toolbar visible Left toolbar Left toolbar visible Right toolbar Right toolbar visible Modern dock toolbar manager pEnvironmentVariableEditor Name: Value: pEnvironmentVariablesEditor Environment Variables Editor Add Add a new variable Edit Edit the selected variable Remove Remove the selected variable Del Clear Clear all variables Reset to default Reset to system variables Reset to default variables Add a new variable... The variable '%1' already exists, update it? Edit a variable... Are you sure you want to remove the variable '%1' ? Are you sure you want to clear all variables? pEnvironmentVariablesModel Name: %1 Value: %1 Enabled: %1 true false Name Value pFileDialog Codec: Open in read only. pFileListEditor Choose file(s) Choose file pKeySequenceEdit Press a keybord shortcut... pLineEdit Search Options Clear pPathListEditor Choose directory pPaypalButton Donation Make a donation via Paypal pStringListEditor Add Item Edit Item Remove Item Clear Items Move Item Up Move Item Down New item %1 pStylesActionGroup (System) pTranslationDialog Choose a translation locale Select the locale you want to use with the application. You can click on buttons to locate/reload the translations. Click here to change the application translations paths Click here to reload the translations Choose folders containing your application translations pUpdateChecker Update Check for update pUpdateCheckerDialog Update Checker When an update is detected, you can directly download it (or update it with your package manager). Generally lastest updates fix bugs and/or add new options/plugins/things. Updated on %1 by %2 You are using version <b>%1</b> (%2). Download An error occur: %1 You are running the last available version. An error occur while parsing xml, retry later. ./qwbfsmanager-1.2.1-src/fresh/translations/fresh-he_IL.qm0000644000175000017520000000002711546156115022776 0ustar pasnoxpasnox QObject N/C B KB MB GB TB PB Too big pActionsNodeModel Action Shortcut Default Shortcut pActionsNodeShortcutEditor Shortcut Editor Filter Validate the shortcut Clear the shortcut Text filter... Can't set shortcut, it's maybe already used by another action. Can't restore default shortcut, it's maybe already used by another action. pColorButton Choose a color pConsole Clear the screen An alias for clear command Reset the console List available commands %1 take no parameter No help available Available commands: For specific command details, type: <command> -h/--help Press 'Tab' key to list or auto complete commands, type help for commands help. %1: Command not found. No description available pDockToolBar %1 exclusive pDockToolBarManager Top toolbar Top toolbar visible Bottom toolbar Bottom toolbar visible Left toolbar Left toolbar visible Right toolbar Right toolbar visible Modern dock toolbar manager pEnvironmentVariableEditor Name: Value: pEnvironmentVariablesEditor Environment Variables Editor Add Add a new variable Edit Edit the selected variable Remove Remove the selected variable Del Clear Clear all variables Reset to default Reset to system variables Reset to default variables Add a new variable... The variable '%1' already exists, update it? Edit a variable... Are you sure you want to remove the variable '%1' ? Are you sure you want to clear all variables? pEnvironmentVariablesModel Name: %1 Value: %1 Enabled: %1 true false Name Value pFileDialog Codec: Open in read only. pFileListEditor Choose file(s) Choose file pKeySequenceEdit Press a keybord shortcut... pLineEdit Search Options Clear pPathListEditor Choose directory pPaypalButton Donation Make a donation via Paypal pStringListEditor Add Item Edit Item Remove Item Clear Items Move Item Up Move Item Down New item %1 pStylesActionGroup (System) pTranslationDialog Choose a translation locale Select the locale you want to use with the application. You can click on buttons to locate/reload the translations. Click here to change the application translations paths Click here to reload the translations Choose folders containing your application translations pUpdateChecker Update Check for update pUpdateCheckerDialog Update Checker When an update is detected, you can directly download it (or update it with your package manager). Generally lastest updates fix bugs and/or add new options/plugins/things. Updated on %1 by %2 You are using version <b>%1</b> (%2). Download An error occur: %1 You are running the last available version. An error occur while parsing xml, retry later. ./qwbfsmanager-1.2.1-src/fresh/translations/fresh-sl_SI.qm0000644000175000017520000000003611546156115023027 0ustar pasnoxpasnox QObject N/C B KB MB GB TB PB Too big pActionsNodeModel Action Shortcut Default Shortcut pActionsNodeShortcutEditor Shortcut Editor Filter Validate the shortcut Clear the shortcut Text filter... Can't set shortcut, it's maybe already used by another action. Can't restore default shortcut, it's maybe already used by another action. pColorButton Choose a color pConsole Clear the screen An alias for clear command Reset the console List available commands %1 take no parameter No help available Available commands: For specific command details, type: <command> -h/--help Press 'Tab' key to list or auto complete commands, type help for commands help. %1: Command not found. No description available pDockToolBar %1 exclusive pDockToolBarManager Top toolbar Top toolbar visible Bottom toolbar Bottom toolbar visible Left toolbar Left toolbar visible Right toolbar Right toolbar visible Modern dock toolbar manager pEnvironmentVariableEditor Name: Value: pEnvironmentVariablesEditor Environment Variables Editor Add Add a new variable Edit Edit the selected variable Remove Remove the selected variable Del Clear Clear all variables Reset to default Reset to system variables Reset to default variables Add a new variable... The variable '%1' already exists, update it? Edit a variable... Are you sure you want to remove the variable '%1' ? Are you sure you want to clear all variables? pEnvironmentVariablesModel Name: %1 Value: %1 Enabled: %1 true false Name Value pFileDialog Codec: Open in read only. pFileListEditor Choose file(s) Choose file pKeySequenceEdit Press a keybord shortcut... pLineEdit Search Options Clear pPathListEditor Choose directory pPaypalButton Donation Make a donation via Paypal pStringListEditor Add Item Edit Item Remove Item Clear Items Move Item Up Move Item Down New item %1 pStylesActionGroup (System) pTranslationDialog Choose a translation locale Select the locale you want to use with the application. You can click on buttons to locate/reload the translations. Click here to change the application translations paths Click here to reload the translations Choose folders containing your application translations pUpdateChecker Update Check for update pUpdateCheckerDialog Update Checker When an update is detected, you can directly download it (or update it with your package manager). Generally lastest updates fix bugs and/or add new options/plugins/things. Updated on %1 by %2 You are using version <b>%1</b> (%2). Download An error occur: %1 You are running the last available version. An error occur while parsing xml, retry later. ./qwbfsmanager-1.2.1-src/fresh/translations/fresh-zh_TW.qm0000644000175000017520000000002011546156115023042 0ustar pasnoxpasnox QObject N/C B KB MB GB TB PB Too big pActionsNodeModel Action Shortcut Default Shortcut pActionsNodeShortcutEditor Shortcut Editor Filter Validate the shortcut Clear the shortcut Text filter... Can't set shortcut, it's maybe already used by another action. Can't restore default shortcut, it's maybe already used by another action. pColorButton Choose a color pConsole Clear the screen An alias for clear command Reset the console List available commands %1 take no parameter No help available Available commands: For specific command details, type: <command> -h/--help Press 'Tab' key to list or auto complete commands, type help for commands help. %1: Command not found. No description available pDockToolBar %1 exclusive pDockToolBarManager Top toolbar Top toolbar visible Bottom toolbar Bottom toolbar visible Left toolbar Left toolbar visible Right toolbar Right toolbar visible Modern dock toolbar manager pEnvironmentVariableEditor Name: Value: pEnvironmentVariablesEditor Environment Variables Editor Add Add a new variable Edit Edit the selected variable Remove Remove the selected variable Del Clear Clear all variables Reset to default Reset to system variables Reset to default variables Add a new variable... The variable '%1' already exists, update it? Edit a variable... Are you sure you want to remove the variable '%1' ? Are you sure you want to clear all variables? pEnvironmentVariablesModel Name: %1 Value: %1 Enabled: %1 true false Name Value pFileDialog Codec: Open in read only. pFileListEditor Choose file(s) Choose file pKeySequenceEdit Press a keybord shortcut... pLineEdit Search Options Clear pPathListEditor Choose directory pPaypalButton Donation Make a donation via Paypal pStringListEditor Add Item Edit Item Remove Item Clear Items Move Item Up Move Item Down New item %1 pStylesActionGroup (System) pTranslationDialog Choose a translation locale Select the locale you want to use with the application. You can click on buttons to locate/reload the translations. Click here to change the application translations paths Click here to reload the translations Choose folders containing your application translations pUpdateChecker Update Check for update pUpdateCheckerDialog Update Checker When an update is detected, you can directly download it (or update it with your package manager). Generally lastest updates fix bugs and/or add new options/plugins/things. Updated on %1 by %2 You are using version <b>%1</b> (%2). Download An error occur: %1 You are running the last available version. An error occur while parsing xml, retry later. ./qwbfsmanager-1.2.1-src/fresh/translations/fresh-ca_ES.qm0000644000175000017520000002713611546156115023002 0ustar pasnoxpasnoxt {8 sb U$=)`+yH? [lee3-ԃ m70CCB&\Z:niTه~i+BBQObjectGBGBQObjectKBKBQObjectMBMBQObjectN/CN/CQObjectPBPBQObjectTBQObjectMassa granToo bigQObject AcciActionpActionsNodeModel(Accessos per defecteDefault ShortcutpActionsNodeModelAccessosShortcutpActionsNodeModelNo es pot restaurar accs, potser ja s'est utilitzant en una altra acci.JCan't restore default shortcut, it's maybe already used by another action.pActionsNodeShortcutEditorNo es pot configurar l'accs, potser ja s'est utilitzant en una altra acci.>Can't set shortcut, it's maybe already used by another action.pActionsNodeShortcutEditorNetejar accsClear the shortcutpActionsNodeShortcutEditor FiltreFilterpActionsNodeShortcutEditor"Editor d'accessosShortcut EditorpActionsNodeShortcutEditor&Text del filtre ...Text filter...pActionsNodeShortcutEditorValidar accsValidate the shortcutpActionsNodeShortcutEditorTria un colorChoose a color pColorButton$%1 no t parmetre%1 take no parameterpConsole6%1: La comanda no es troba.%1: Command not found.pConsole6lies per la comanda netejaAn alias for clear commandpConsole2Comandaments disponibles:Available commands:pConsole Netejar pantallaClear the screenpConsolePer obtenir informaci especfica d'una comanda, escriviu: <comanda> -h/--help7For specific command details, type: -h/--helppConsole<Llista de comandas disponiblesList available commandspConsole2No disposem de descripciNo description availablepConsoleNo hi ha ajudaNo help availablepConsolePremeu la tecla 'Tab' per obtenir una llista dels comandaments o ompliment automtic, escriviu 'help' per als comandaments.OPress 'Tab' key to list or auto complete commands, type help for commands help.pConsole"Restablir consolaReset the consolepConsole%1 en exclusiva %1 exclusive pDockToolBar@Barra d'eines a la part inferiorBottom toolbarpDockToolBarManager,Barra inferior visibleBottom toolbar visiblepDockToolBarManager4Barra d'eines a l'esquerra Left toolbarpDockToolBarManager,Barra esquerra visibleLeft toolbar visiblepDockToolBarManager*Barra d'eines modernaModern dock toolbar managerpDockToolBarManager0Barra d'eines a la dreta Right toolbarpDockToolBarManager&Barra dreta visibleRight toolbar visiblepDockToolBarManager@Barra d'eines a la part superior Top toolbarpDockToolBarManager,Barra superior visibleTop toolbar visiblepDockToolBarManagerNom:Name:pEnvironmentVariableEditor Valor:Value:pEnvironmentVariableEditor AfegirAddpEnvironmentVariablesEditor(Afegir nova variableAdd a new variablepEnvironmentVariablesEditor0Afegir nova variable ...Add a new variable...pEnvironmentVariablesEditorXSegur que vols netejar totes les variables?-Are you sure you want to clear all variables?pEnvironmentVariablesEditorbEsteu segur que voleu eliminar la variable '%1' ?3Are you sure you want to remove the variable '%1' ?pEnvironmentVariablesEditorNetejarClearpEnvironmentVariablesEditor6Netejar totes les variablesClear all variablespEnvironmentVariablesEditorEliminarDelpEnvironmentVariablesEditor EditaEditpEnvironmentVariablesEditor$Edita variable ...Edit a variable...pEnvironmentVariablesEditorDModificar la variable seleccionadaEdit the selected variablepEnvironmentVariablesEditor8Editor de variables d'entornEnvironment Variables EditorpEnvironmentVariablesEditor TreureRemovepEnvironmentVariablesEditor8Treure variable seleccionadaRemove the selected variablepEnvironmentVariablesEditor8Restaurar valors per defecteReset to defaultpEnvironmentVariablesEditor>Restaurar variables per defecteReset to default variablespEnvironmentVariablesEditor>Restaurar variables del sistemaReset to system variablespEnvironmentVariablesEditor\La variable '%1' ja existeix, vol actualitzar?,The variable '%1' already exists, update it?pEnvironmentVariablesEditorHabilitat: %1 Enabled: %1pEnvironmentVariablesModelNomNamepEnvironmentVariablesModelNom: %1Name: %1pEnvironmentVariablesModel ValorValuepEnvironmentVariablesModelValor: %1 Value: %1pEnvironmentVariablesModelFalsfalsepEnvironmentVariablesModelVeritabletruepEnvironmentVariablesModel Codec:Codec: pFileDialog8Obert en mode noms lectura.Open in read only. pFileDialogTrieu un arxiu Choose filepFileListEditor*Trieu un o ms arxiusChoose file(s)pFileListEditor&Premeu un accs ...Press a keybord shortcut...pKeySequenceEditNetejarClear pLineEdit Opcions de cercaSearch Options pLineEdit$Trieu un directoriChoose directorypPathListEditor DonarDonation pPaypalButtonBFer una donaci mitjanant PaypalMake a donation via Paypal pPaypalButtonAfegeix elementAdd ItempStringListEditor Netejar elements Clear ItemspStringListEditorEdita element Edit ItempStringListEditor*Mou element cap avallMove Item DownpStringListEditor*Mou element cap amunt Move Item UppStringListEditorNou element %1 New item %1pStringListEditor Eliminar element Remove ItempStringListEditor(Sistema)(System)pStylesActionGroupTrieu un idiomaChoose a translation localepTranslationDialogSeleccioneu les carpetes que contenen els idiomes de l'aplicaci7Choose folders containing your application translationspTranslationDialogxPremi aqu per canviar les rutes dels idiomes de l'aplicaci7Click here to change the application translations pathspTranslationDialogJPremi aqu per recarregar els idiomes%Click here to reload the translationspTranslationDialogSeleccioneu l'idioma que voleu utilitzar amb l'aplicaci. Pots fer clic als botons de localitzar / recarregar idiomes.sSelect the locale you want to use with the application. You can click on buttons to locate/reload the translations.pTranslationDialog.Buscant actualitzacionsCheck for updatepUpdateCheckerActualitzarUpdatepUpdateCheckerrS'ha produt un error en analitzar xml, intenti ms tard..An error occur while parsing xml, retry later.pUpdateCheckerDialog2S'ha produt un error: %1An error occur: %1pUpdateCheckerDialogDescarregantDownloadpUpdateCheckerDialog:Verificador d'actualitzacionsUpdate CheckerpUpdateCheckerDialog.Actualitzat el %1 de %2Updated on %1 by %2pUpdateCheckerDialogQuan es detecta una actualitzaci, es pot descarregar directament (o pot fer-ho a travs del seu gestor de paquets). En general, les actualitzacions corregeixen errors i / o la afegeixen noves caracterstiques, plugins, etc.When an update is detected, you can directly download it (or update it with your package manager). Generally lastest updates fix bugs and/or add new options/plugins/things.pUpdateCheckerDialogZEst utilitzant la darrera versi disponible.+You are running the last available version.pUpdateCheckerDialogREst utilitzant la versi <b>%1</b> (%2).%You are using version %1 (%2).pUpdateCheckerDialogA ./qwbfsmanager-1.2.1-src/fresh/translations/fresh-fr_FR.qm0000644000175000017520000003026311546156115023021 0ustar pasnoxpasnox { sb U&?)`+y H?[ee[3-ԃ"#70CCB(Z:nmiTه~Di-rOctet(s)BQObjectGoGBQObjectKoKBQObjectMoMBQObjectN/CQObjectPoPBQObjectToTBQObjectTrop grandToo bigQObject ActionActionpActionsNodeModel(Raccourci par dfautDefault ShortcutpActionsNodeModelRaccourciShortcutpActionsNodeModelImpossible de restorer le raccourci par dfaut, il est surement dj utilis par une autre action.JCan't restore default shortcut, it's maybe already used by another action.pActionsNodeShortcutEditorImpossible d'affecter le raccourci, il est peut tre dj utilis par une autre action.>Can't set shortcut, it's maybe already used by another action.pActionsNodeShortcutEditor(Effacer le raccourciClear the shortcutpActionsNodeShortcutEditor FiltreFilterpActionsNodeShortcutEditor*diteur de raccourcisShortcut EditorpActionsNodeShortcutEditor"Filtre du text...Text filter...pActionsNodeShortcutEditor(Valider le raccourciValidate the shortcutpActionsNodeShortcutEditor,Choisissez une couleurChoose a color pColorButton8%1 ne prend pas de paramtre%1 take no parameterpConsole2%1: Commande introuvable.%1: Command not found.pConsolePUne alternative pour la commande 'clear'An alias for clear commandpConsole,Commandes disponibles:Available commands:pConsoleEfface l'cranClear the screenpConsolePour plus de dtails sur une commande, tappez: <commande> -h/--help7For specific command details, type: -h/--helppConsole>Liste les commandes disponiblesList available commandspConsole:Aucune description disponibleNo description availablepConsole,Aucune aide disponibleNo help availablepConsolePressez la touche 'Tabulation' pour lister ou auto complter les commandes, tappez 'help' pour l'aide des commandes.OPress 'Tab' key to list or auto complete commands, type help for commands help.pConsole0Remet zro le terminalReset the consolepConsole%1 exclusif %1 exclusive pDockToolBar*Barre d'outils du basBottom toolbarpDockToolBarManager:Barre d'outils du bas visibleBottom toolbar visiblepDockToolBarManager0Barre d'outils de gauche Left toolbarpDockToolBarManager@Barre d'outils de gauche visibleLeft toolbar visiblepDockToolBarManager<Gestionnaire de 'dock' moderneModern dock toolbar managerpDockToolBarManager0Barre d'outils de droite Right toolbarpDockToolBarManager@Barre d'outils de droite visibleRight toolbar visiblepDockToolBarManager,Barre d'outils du haut Top toolbarpDockToolBarManager<Barre d'outils du haut visibleTop toolbar visiblepDockToolBarManagerNom:Name:pEnvironmentVariableEditorValeur:Value:pEnvironmentVariableEditorAjouterAddpEnvironmentVariablesEditor:Ajouter une nouvelle variableAdd a new variablepEnvironmentVariablesEditor@Ajouter une nouvelle variable...Add a new variable...pEnvironmentVariablesEditorntes vous sr de vouloir effacer toutes les variables ?-Are you sure you want to clear all variables?pEnvironmentVariablesEditorftes vous sr de vouloir enlever la variable '%1' ?3Are you sure you want to remove the variable '%1' ?pEnvironmentVariablesEditorEffacerClearpEnvironmentVariablesEditor8Effacer toutes les variablesClear all variablespEnvironmentVariablesEditor SupprDelpEnvironmentVariablesEditor EditerEditpEnvironmentVariablesEditor*Editer la variable...Edit a variable...pEnvironmentVariablesEditor>Editer la variable slectionneEdit the selected variablepEnvironmentVariablesEditorHditeur de variables d'environnementEnvironment Variables EditorpEnvironmentVariablesEditorEnleverRemovepEnvironmentVariablesEditor@Enlever la variable slectionneRemove the selected variablepEnvironmentVariablesEditor>Restorer les valeurs par dfautReset to defaultpEnvironmentVariablesEditorBRestorer les variables par dfautReset to default variablespEnvironmentVariablesEditor<Restorer les variables systmeReset to system variablespEnvironmentVariablesEditorZLa variable '%1' existe dj, mettre jour ?,The variable '%1' already exists, update it?pEnvironmentVariablesEditorActiv: %1 Enabled: %1pEnvironmentVariablesModelNomNamepEnvironmentVariablesModelNom: %1Name: %1pEnvironmentVariablesModel ValeurValuepEnvironmentVariablesModelValeur: %1 Value: %1pEnvironmentVariablesModelfauxfalsepEnvironmentVariablesModelvraitruepEnvironmentVariablesModel Codec:Codec: pFileDialog0Ouvrir en lecture seule.Open in read only. pFileDialog*Choisissez un fichier Choose filepFileListEditorFChoisissez un ou plusieurs fichiersChoose file(s)pFileListEditor>Pressez un raccourci clavier...Press a keybord shortcut...pKeySequenceEditEffacerClear pLineEdit(Options de rechercheSearch Options pLineEdit*Choisissez un dossierChoose directorypPathListEditorDonDonation pPaypalButton:Faire une donation via PaypalMake a donation via Paypal pPaypalButton$Ajouter un lmentAdd ItempStringListEditor(Effacer les lments Clear ItemspStringListEditor diter l'lment Edit ItempStringListEditor<Dplacer l'lment vers le basMove Item DownpStringListEditor>Dplacer l'lment vers le haut Move Item UppStringListEditor"Nouvel lment %1 New item %1pStringListEditor"Enlever l'lment Remove ItempStringListEditor(Systme)(System)pStylesActionGroup2Choisissez une traductionChoose a translation localepTranslationDialogChoisissez les dossiers contenant les traductions de l'application7Choose folders containing your application translationspTranslationDialogCliquez ici pour changer les chemins des traductions de l'application7Click here to change the application translations pathspTranslationDialogTCliquez ici pour recharger les traductions%Click here to reload the translationspTranslationDialogSlectionner la locale que vous voulez utiliser avec l'application. Vous pouvez clicker sur les boutons localiser/recharger les traductions.sSelect the locale you want to use with the application. You can click on buttons to locate/reload the translations.pTranslationDialog2Vrifier les mises jourCheck for updatepUpdateCheckerMise jourUpdatepUpdateCheckerUne erreur est survenue lors du traitement xml, essayez de nouveau plus tard..An error occur while parsing xml, retry later.pUpdateCheckerDialog6Une erreur est survenue: %1An error occur: %1pUpdateCheckerDialogTlchargerDownloadpUpdateCheckerDialog6Vrificateur de mise jourUpdate CheckerpUpdateCheckerDialog.Mis jour le %1 par %2Updated on %1 by %2pUpdateCheckerDialogLorsque une mise jour est dtecte, vous pouvez la tlcharger directement (ou la mettre jour via votre gestionnaire de paquets). Gnralement les dernires mises jour corrigent des bogues et/ou ajoutent de nouvelles options/greffons/choses.When an update is detected, you can directly download it (or update it with your package manager). Generally lastest updates fix bugs and/or add new options/plugins/things.pUpdateCheckerDialogZVous utilisez la dernire version disponible.+You are running the last available version.pUpdateCheckerDialogPVous utilisez la version <b>%1</b> (%2).%You are using version %1 (%2).pUpdateCheckerDialog./qwbfsmanager-1.2.1-src/fresh/translations/fresh-uk_UA.qm0000644000175000017520000000004211546156115023017 0ustar pasnoxpasnox QObject N/C B KB MB GB TB PB Too big pActionsNodeModel Action Shortcut Default Shortcut pActionsNodeShortcutEditor Shortcut Editor Filter Validate the shortcut Clear the shortcut Text filter... Can't set shortcut, it's maybe already used by another action. Can't restore default shortcut, it's maybe already used by another action. pColorButton Choose a color pConsole Clear the screen An alias for clear command Reset the console List available commands %1 take no parameter No help available Available commands: For specific command details, type: <command> -h/--help Press 'Tab' key to list or auto complete commands, type help for commands help. %1: Command not found. No description available pDockToolBar %1 exclusive pDockToolBarManager Top toolbar Top toolbar visible Bottom toolbar Bottom toolbar visible Left toolbar Left toolbar visible Right toolbar Right toolbar visible Modern dock toolbar manager pEnvironmentVariableEditor Name: Value: pEnvironmentVariablesEditor Environment Variables Editor Add Add a new variable Edit Edit the selected variable Remove Remove the selected variable Del Clear Clear all variables Reset to default Reset to system variables Reset to default variables Add a new variable... The variable '%1' already exists, update it? Edit a variable... Are you sure you want to remove the variable '%1' ? Are you sure you want to clear all variables? pEnvironmentVariablesModel Name: %1 Value: %1 Enabled: %1 true false Name Value pFileDialog Codec: Open in read only. pFileListEditor Choose file(s) Choose file pKeySequenceEdit Press a keybord shortcut... pLineEdit Search Options Clear pPathListEditor Choose directory pPaypalButton Donation Make a donation via Paypal pStringListEditor Add Item Edit Item Remove Item Clear Items Move Item Up Move Item Down New item %1 pStylesActionGroup (System) pTranslationDialog Choose a translation locale Select the locale you want to use with the application. You can click on buttons to locate/reload the translations. Click here to change the application translations paths Click here to reload the translations Choose folders containing your application translations pUpdateChecker Update Check for update pUpdateCheckerDialog Update Checker When an update is detected, you can directly download it (or update it with your package manager). Generally lastest updates fix bugs and/or add new options/plugins/things. Updated on %1 by %2 You are using version <b>%1</b> (%2). Download An error occur: %1 You are running the last available version. An error occur while parsing xml, retry later. ./qwbfsmanager-1.2.1-src/fresh/translations/fresh-ca_ES.ts0000644000175000017520000006023511546156115023010 0ustar pasnoxpasnox QObject N/C N/C B B KB KB MB MB GB GB TB PB PB Too big Massa gran pActionsNodeModel Action Acció Shortcut Accessos Default Shortcut Accessos per defecte pActionsNodeShortcutEditor Shortcut Editor Editor d'accessos Filter Filtre Validate the shortcut Validar accés Clear the shortcut Netejar accés Text filter... Text del filtre ... Can't set shortcut, it's maybe already used by another action. No es pot configurar l'accés, potser ja s'està utilitzant en una altra acció. Can't restore default shortcut, it's maybe already used by another action. No es pot restaurar accés, potser ja s'està utilitzant en una altra acció. pColorButton Choose a color Tria un color pConsole Clear the screen Netejar pantalla An alias for clear command Àlies per la comanda neteja Reset the console Restablir consola List available commands Llista de comandas disponibles %1 take no parameter %1 no té paràmetre No help available No hi ha ajuda Available commands: Comandaments disponibles: For specific command details, type: <command> -h/--help Per obtenir informació específica d'una comanda, escriviu: <comanda> -h/--help Press 'Tab' key to list or auto complete commands, type help for commands help. Premeu la tecla 'Tab' per obtenir una llista dels comandaments o ompliment automàtic, escriviu 'help' per als comandaments. %1: Command not found. %1: La comanda no es troba. No description available No disposem de descripció pDockToolBar %1 exclusive %1 en exclusiva pDockToolBarManager Top toolbar Barra d'eines a la part superior Top toolbar visible Barra superior visible Bottom toolbar Barra d'eines a la part inferior Bottom toolbar visible Barra inferior visible Left toolbar Barra d'eines a l'esquerra Left toolbar visible Barra esquerra visible Right toolbar Barra d'eines a la dreta Right toolbar visible Barra dreta visible Modern dock toolbar manager Barra d'eines moderna pEnvironmentVariableEditor Name: Nom: Value: Valor: pEnvironmentVariablesEditor Environment Variables Editor Editor de variables d'entorn Add Afegir Add a new variable Afegir nova variable Edit Edita Edit the selected variable Modificar la variable seleccionada Remove Treure Remove the selected variable Treure variable seleccionada Del Eliminar Clear Netejar Clear all variables Netejar totes les variables Reset to default Restaurar valors per defecte Reset to system variables Restaurar variables del sistema Reset to default variables Restaurar variables per defecte Add a new variable... Afegir nova variable ... The variable '%1' already exists, update it? La variable '%1' ja existeix, vol actualitzar? Edit a variable... Edita variable ... Are you sure you want to remove the variable '%1' ? Esteu segur que voleu eliminar la variable '%1' ? Are you sure you want to clear all variables? ¿Segur que vols netejar totes les variables? pEnvironmentVariablesModel Name: %1 Nom: %1 Value: %1 Valor: %1 Enabled: %1 Habilitat: %1 true Veritable false Fals Name Nom Value Valor pFileDialog Codec: Codec: Open in read only. Obert en mode només lectura. pFileListEditor Choose file(s) Trieu un o més arxius Choose file Trieu un arxiu pKeySequenceEdit Press a keybord shortcut... Premeu un accés ... pLineEdit Search Options Opcions de cerca Clear Netejar pPathListEditor Choose directory Trieu un directori pPaypalButton Donation Donar Make a donation via Paypal Fer una donació mitjançant Paypal pStringListEditor Add Item Afegeix element Edit Item Edita element Remove Item Eliminar element Clear Items Netejar elements Move Item Up Mou element cap amunt Move Item Down Mou element cap avall New item %1 Nou element %1 pStylesActionGroup (System) (Sistema) pTranslationDialog Choose a translation locale Trieu un idioma Select the locale you want to use with the application. You can click on buttons to locate/reload the translations. Seleccioneu l'idioma que voleu utilitzar amb l'aplicació. Pots fer clic als botons de localitzar / recarregar idiomes. Click here to change the application translations paths Premi aquí per canviar les rutes dels idiomes de l'aplicació Click here to reload the translations Premi aquí per recarregar els idiomes Choose folders containing your application translations Seleccioneu les carpetes que contenen els idiomes de l'aplicació pUpdateChecker Update Actualitzar Check for update Buscant actualitzacions pUpdateCheckerDialog Update Checker Verificador d'actualitzacions When an update is detected, you can directly download it (or update it with your package manager). Generally lastest updates fix bugs and/or add new options/plugins/things. Quan es detecta una actualització, es pot descarregar directament (o pot fer-ho a través del seu gestor de paquets). En general, les actualitzacions corregeixen errors i / o la afegeixen noves característiques, plugins, etc. Updated on %1 by %2 Actualitzat el %1 de %2 You are using version <b>%1</b> (%2). Està utilitzant la versió <b>%1</b> (%2). Download Descarregant An error occur: %1 S'ha produït un error: %1 You are running the last available version. Està utilitzant la darrera versió disponible. An error occur while parsing xml, retry later. S'ha produït un error en analitzar xml, intenti més tard. ./qwbfsmanager-1.2.1-src/fresh/translations/fresh-zh_CN.ts0000644000175000017520000005642111546156115023041 0ustar pasnoxpasnox QObject N/C B KB MB GB TB PB Too big pActionsNodeModel Action Shortcut Default Shortcut pActionsNodeShortcutEditor Shortcut Editor Filter Validate the shortcut Clear the shortcut Text filter... Can't set shortcut, it's maybe already used by another action. Can't restore default shortcut, it's maybe already used by another action. pColorButton Choose a color pConsole Clear the screen An alias for clear command Reset the console List available commands %1 take no parameter No help available Available commands: For specific command details, type: <command> -h/--help Press 'Tab' key to list or auto complete commands, type help for commands help. %1: Command not found. No description available pDockToolBar %1 exclusive pDockToolBarManager Top toolbar Top toolbar visible Bottom toolbar Bottom toolbar visible Left toolbar Left toolbar visible Right toolbar Right toolbar visible Modern dock toolbar manager pEnvironmentVariableEditor Name: Value: pEnvironmentVariablesEditor Environment Variables Editor Add Add a new variable Edit Edit the selected variable Remove Remove the selected variable Del Clear Clear all variables Reset to default Reset to system variables Reset to default variables Add a new variable... The variable '%1' already exists, update it? Edit a variable... Are you sure you want to remove the variable '%1' ? Are you sure you want to clear all variables? pEnvironmentVariablesModel Name: %1 Value: %1 Enabled: %1 true false Name Value pFileDialog Codec: Open in read only. pFileListEditor Choose file(s) Choose file pKeySequenceEdit Press a keybord shortcut... pLineEdit Search Options Clear pPathListEditor Choose directory pPaypalButton Donation Make a donation via Paypal pStringListEditor Add Item Edit Item Remove Item Clear Items Move Item Up Move Item Down New item %1 pStylesActionGroup (System) pTranslationDialog Choose a translation locale Select the locale you want to use with the application. You can click on buttons to locate/reload the translations. Click here to change the application translations paths Click here to reload the translations Choose folders containing your application translations pUpdateChecker Update Check for update pUpdateCheckerDialog Update Checker When an update is detected, you can directly download it (or update it with your package manager). Generally lastest updates fix bugs and/or add new options/plugins/things. Updated on %1 by %2 You are using version <b>%1</b> (%2). Download An error occur: %1 You are running the last available version. An error occur while parsing xml, retry later. ./qwbfsmanager-1.2.1-src/fresh/translations/fresh-de_DE.ts0000644000175000017520000005642111546156115023000 0ustar pasnoxpasnox QObject N/C B KB MB GB TB PB Too big pActionsNodeModel Action Shortcut Default Shortcut pActionsNodeShortcutEditor Shortcut Editor Filter Validate the shortcut Clear the shortcut Text filter... Can't set shortcut, it's maybe already used by another action. Can't restore default shortcut, it's maybe already used by another action. pColorButton Choose a color pConsole Clear the screen An alias for clear command Reset the console List available commands %1 take no parameter No help available Available commands: For specific command details, type: <command> -h/--help Press 'Tab' key to list or auto complete commands, type help for commands help. %1: Command not found. No description available pDockToolBar %1 exclusive pDockToolBarManager Top toolbar Top toolbar visible Bottom toolbar Bottom toolbar visible Left toolbar Left toolbar visible Right toolbar Right toolbar visible Modern dock toolbar manager pEnvironmentVariableEditor Name: Value: pEnvironmentVariablesEditor Environment Variables Editor Add Add a new variable Edit Edit the selected variable Remove Remove the selected variable Del Clear Clear all variables Reset to default Reset to system variables Reset to default variables Add a new variable... The variable '%1' already exists, update it? Edit a variable... Are you sure you want to remove the variable '%1' ? Are you sure you want to clear all variables? pEnvironmentVariablesModel Name: %1 Value: %1 Enabled: %1 true false Name Value pFileDialog Codec: Open in read only. pFileListEditor Choose file(s) Choose file pKeySequenceEdit Press a keybord shortcut... pLineEdit Search Options Clear pPathListEditor Choose directory pPaypalButton Donation Make a donation via Paypal pStringListEditor Add Item Edit Item Remove Item Clear Items Move Item Up Move Item Down New item %1 pStylesActionGroup (System) pTranslationDialog Choose a translation locale Select the locale you want to use with the application. You can click on buttons to locate/reload the translations. Click here to change the application translations paths Click here to reload the translations Choose folders containing your application translations pUpdateChecker Update Check for update pUpdateCheckerDialog Update Checker When an update is detected, you can directly download it (or update it with your package manager). Generally lastest updates fix bugs and/or add new options/plugins/things. Updated on %1 by %2 You are using version <b>%1</b> (%2). Download An error occur: %1 You are running the last available version. An error occur while parsing xml, retry later. ./qwbfsmanager-1.2.1-src/fresh/translations/fresh-sk_SK.qm0000644000175000017520000000003311546156115023025 0ustar pasnoxpasnox QObject N/C N/C B KB MB GB TB PB PB Too big Demasiado grande pActionsNodeModel Action Acción Shortcut Accesos Default Shortcut Accesos por defecto pActionsNodeShortcutEditor Shortcut Editor Editor de accesos Filter Filtro Validate the shortcut Validar acceso Clear the shortcut Borrar acceso Text filter... Texto del filtro... Can't set shortcut, it's maybe already used by another action. No se puede configurar el acceso, tal vez ya se esté utilizando en otra acción. Can't restore default shortcut, it's maybe already used by another action. No se puede restaurar acceso, tal vez ya se esté utilizando en otra acción. pColorButton Choose a color Elija un color pConsole Clear the screen Limpiar pantalla An alias for clear command Alias para el comando limpiar Reset the console Restablecer consola List available commands Lista de comandos disponibles %1 take no parameter %1 no tiene parámetro No help available No hay ayuda disponible Available commands: Comandos disponibles: For specific command details, type: <command> -h/--help Para obtener información específica de un comando, escriba: <commando> -h/--help Press 'Tab' key to list or auto complete commands, type help for commands help. Pulse la tecla 'Tab' para listar los comandos o auto completar, escriba 'help' para los comandos. %1: Command not found. %1: El comando no se encuentra. No description available No disponemos de descripción pDockToolBar %1 exclusive %1 en exclusiva pDockToolBarManager Top toolbar Barra de herramientas en la parte superior Top toolbar visible Barra superior visible Bottom toolbar Barra de herramientas en la parte inferior Bottom toolbar visible Barra inferior visible Left toolbar Barra de herramientas a la izquierda Left toolbar visible Barra izquierda visible Right toolbar Barra de herramientas a la derecha Right toolbar visible Barra derecha visible Modern dock toolbar manager Barra de herramientas moderna pEnvironmentVariableEditor Name: Nombre: Value: Valor: pEnvironmentVariablesEditor Environment Variables Editor Editor de variables de entorno Add Añadir Add a new variable Añadir nueva variable Edit Editar Edit the selected variable Modificar la variable seleccionada Remove Quitar Remove the selected variable Quitar variable seleccionada Del Eliminar Clear Borrar Clear all variables Borrar todas las variables Reset to default Restaurar valores por defecto Reset to system variables Restaurar variables del sistema Reset to default variables Restaurar variables por defecto Add a new variable... Añadir nueva variable... The variable '%1' already exists, update it? La variable '%1' ya existe, ¿desea actualizarla? Edit a variable... Editar variable... Are you sure you want to remove the variable '%1' ? ¿Está seguro que desea eliminar la variable '%1' ? Are you sure you want to clear all variables? ¿Está seguro que desea borrar todas las variables? pEnvironmentVariablesModel Name: %1 Nombre: %1 Value: %1 Valor: %1 Enabled: %1 Habilitar: %1 true Verdadero false Falso Name Nombre Value Valor pFileDialog Codec: Codec: Open in read only. Abierto en modo sólo lectura. pFileListEditor Choose file(s) Elija uno o más archivos Choose file Elija un archivo pKeySequenceEdit Press a keybord shortcut... Pulse un acceso... pLineEdit Search Options Opciones de búsqueda Clear Limpiar pPathListEditor Choose directory Elija un directorio pPaypalButton Donation Donar Make a donation via Paypal Hacer una donación a través de Paypal pStringListEditor Add Item Añadir elemento Edit Item Editar elemento Remove Item Eliminar elemento Clear Items Limpiar elementos Move Item Up Mover elemento arriba Move Item Down Mover elemento abajo New item %1 Nuevo elemento %1 pStylesActionGroup (System) (Sistema) pTranslationDialog Choose a translation locale Elija un idioma Select the locale you want to use with the application. You can click on buttons to locate/reload the translations. Seleccione el idioma que desea utilizar con la aplicación. Puede hacer clic en los botones de localizar/recargar idiomas. Click here to change the application translations paths Pulse aquí para cambiar las rutas de los idiomas de la aplicación Click here to reload the translations Pulse aquí para recargar los idiomas Choose folders containing your application translations Seleccione las carpetas que contienen los idiomas de la aplicación pUpdateChecker Update Actualizar Check for update Buscando actualizaciones pUpdateCheckerDialog Update Checker Verificador de actualizaciones When an update is detected, you can directly download it (or update it with your package manager). Generally lastest updates fix bugs and/or add new options/plugins/things. Cuando se detecta una actualización, se puede descargar directamente (o puede hacerlo a través de su gestor de paquetes). Por lo general, las actualizaciones corrigen errores y /o la añaden nuevas características, plugins, etc. Updated on %1 by %2 Actualizado el %1 de %2 You are using version <b>%1</b> (%2). Está utilizando la versión<b>%1</b> (%2). Download Descargando An error occur: %1 Se produjo un error: %1 You are running the last available version. Está usando la última versión disponible. An error occur while parsing xml, retry later. Se produjo un error al analizar xml, intente más tarde. ./qwbfsmanager-1.2.1-src/fresh/translations/fresh-pt_PT.qm0000644000175000017520000000002711546156115023044 0ustar pasnoxpasnox QObject N/C B KB MB GB TB PB Too big pActionsNodeModel Action Shortcut Default Shortcut pActionsNodeShortcutEditor Shortcut Editor Filter Validate the shortcut Clear the shortcut Text filter... Can't set shortcut, it's maybe already used by another action. Can't restore default shortcut, it's maybe already used by another action. pColorButton Choose a color pConsole Clear the screen An alias for clear command Reset the console List available commands %1 take no parameter No help available Available commands: For specific command details, type: <command> -h/--help Press 'Tab' key to list or auto complete commands, type help for commands help. %1: Command not found. No description available pDockToolBar %1 exclusive pDockToolBarManager Top toolbar Top toolbar visible Bottom toolbar Bottom toolbar visible Left toolbar Left toolbar visible Right toolbar Right toolbar visible Modern dock toolbar manager pEnvironmentVariableEditor Name: Value: pEnvironmentVariablesEditor Environment Variables Editor Add Add a new variable Edit Edit the selected variable Remove Remove the selected variable Del Clear Clear all variables Reset to default Reset to system variables Reset to default variables Add a new variable... The variable '%1' already exists, update it? Edit a variable... Are you sure you want to remove the variable '%1' ? Are you sure you want to clear all variables? pEnvironmentVariablesModel Name: %1 Value: %1 Enabled: %1 true false Name Value pFileDialog Codec: Open in read only. pFileListEditor Choose file(s) Choose file pKeySequenceEdit Press a keybord shortcut... pLineEdit Search Options Clear pPathListEditor Choose directory pPaypalButton Donation Make a donation via Paypal pStringListEditor Add Item Edit Item Remove Item Clear Items Move Item Up Move Item Down New item %1 pStylesActionGroup (System) pTranslationDialog Choose a translation locale Select the locale you want to use with the application. You can click on buttons to locate/reload the translations. Click here to change the application translations paths Click here to reload the translations Choose folders containing your application translations pUpdateChecker Update Check for update pUpdateCheckerDialog Update Checker When an update is detected, you can directly download it (or update it with your package manager). Generally lastest updates fix bugs and/or add new options/plugins/things. Updated on %1 by %2 You are using version <b>%1</b> (%2). Download An error occur: %1 You are running the last available version. An error occur while parsing xml, retry later. ./qwbfsmanager-1.2.1-src/fresh/translations/fresh-cs_CZ.ts0000644000175000017520000005642111546156115023041 0ustar pasnoxpasnox QObject N/C B KB MB GB TB PB Too big pActionsNodeModel Action Shortcut Default Shortcut pActionsNodeShortcutEditor Shortcut Editor Filter Validate the shortcut Clear the shortcut Text filter... Can't set shortcut, it's maybe already used by another action. Can't restore default shortcut, it's maybe already used by another action. pColorButton Choose a color pConsole Clear the screen An alias for clear command Reset the console List available commands %1 take no parameter No help available Available commands: For specific command details, type: <command> -h/--help Press 'Tab' key to list or auto complete commands, type help for commands help. %1: Command not found. No description available pDockToolBar %1 exclusive pDockToolBarManager Top toolbar Top toolbar visible Bottom toolbar Bottom toolbar visible Left toolbar Left toolbar visible Right toolbar Right toolbar visible Modern dock toolbar manager pEnvironmentVariableEditor Name: Value: pEnvironmentVariablesEditor Environment Variables Editor Add Add a new variable Edit Edit the selected variable Remove Remove the selected variable Del Clear Clear all variables Reset to default Reset to system variables Reset to default variables Add a new variable... The variable '%1' already exists, update it? Edit a variable... Are you sure you want to remove the variable '%1' ? Are you sure you want to clear all variables? pEnvironmentVariablesModel Name: %1 Value: %1 Enabled: %1 true false Name Value pFileDialog Codec: Open in read only. pFileListEditor Choose file(s) Choose file pKeySequenceEdit Press a keybord shortcut... pLineEdit Search Options Clear pPathListEditor Choose directory pPaypalButton Donation Make a donation via Paypal pStringListEditor Add Item Edit Item Remove Item Clear Items Move Item Up Move Item Down New item %1 pStylesActionGroup (System) pTranslationDialog Choose a translation locale Select the locale you want to use with the application. You can click on buttons to locate/reload the translations. Click here to change the application translations paths Click here to reload the translations Choose folders containing your application translations pUpdateChecker Update Check for update pUpdateCheckerDialog Update Checker When an update is detected, you can directly download it (or update it with your package manager). Generally lastest updates fix bugs and/or add new options/plugins/things. Updated on %1 by %2 You are using version <b>%1</b> (%2). Download An error occur: %1 You are running the last available version. An error occur while parsing xml, retry later. ./qwbfsmanager-1.2.1-src/fresh/translations/fresh-ja_JP.qm0000644000175000017520000000002011546156115022772 0ustar pasnoxpasnox QObject N/C B KB MB GB TB PB Too big pActionsNodeModel Action Shortcut Default Shortcut pActionsNodeShortcutEditor Shortcut Editor Filter Validate the shortcut Clear the shortcut Text filter... Can't set shortcut, it's maybe already used by another action. Can't restore default shortcut, it's maybe already used by another action. pColorButton Choose a color pConsole Clear the screen An alias for clear command Reset the console List available commands %1 take no parameter No help available Available commands: For specific command details, type: <command> -h/--help Press 'Tab' key to list or auto complete commands, type help for commands help. %1: Command not found. No description available pDockToolBar %1 exclusive pDockToolBarManager Top toolbar Top toolbar visible Bottom toolbar Bottom toolbar visible Left toolbar Left toolbar visible Right toolbar Right toolbar visible Modern dock toolbar manager pEnvironmentVariableEditor Name: Value: pEnvironmentVariablesEditor Environment Variables Editor Add Add a new variable Edit Edit the selected variable Remove Remove the selected variable Del Clear Clear all variables Reset to default Reset to system variables Reset to default variables Add a new variable... The variable '%1' already exists, update it? Edit a variable... Are you sure you want to remove the variable '%1' ? Are you sure you want to clear all variables? pEnvironmentVariablesModel Name: %1 Value: %1 Enabled: %1 true false Name Value pFileDialog Codec: Open in read only. pFileListEditor Choose file(s) Choose file pKeySequenceEdit Press a keybord shortcut... pLineEdit Search Options Clear pPathListEditor Choose directory pPaypalButton Donation Make a donation via Paypal pStringListEditor Add Item Edit Item Remove Item Clear Items Move Item Up Move Item Down New item %1 pStylesActionGroup (System) pTranslationDialog Choose a translation locale Select the locale you want to use with the application. You can click on buttons to locate/reload the translations. Click here to change the application translations paths Click here to reload the translations Choose folders containing your application translations pUpdateChecker Update Check for update pUpdateCheckerDialog Update Checker When an update is detected, you can directly download it (or update it with your package manager). Generally lastest updates fix bugs and/or add new options/plugins/things. Updated on %1 by %2 You are using version <b>%1</b> (%2). Download An error occur: %1 You are running the last available version. An error occur while parsing xml, retry later. ./qwbfsmanager-1.2.1-src/fresh/translations/fresh-de_DE.qm0000644000175000017520000000002711546156115022756 0ustar pasnoxpasnox QObject N/C B KB MB GB TB PB Too big pActionsNodeModel Action Shortcut Default Shortcut pActionsNodeShortcutEditor Shortcut Editor Filter Validate the shortcut Clear the shortcut Text filter... Can't set shortcut, it's maybe already used by another action. Can't restore default shortcut, it's maybe already used by another action. pColorButton Choose a color pConsole Clear the screen An alias for clear command Reset the console List available commands %1 take no parameter No help available Available commands: For specific command details, type: <command> -h/--help Press 'Tab' key to list or auto complete commands, type help for commands help. %1: Command not found. No description available pDockToolBar %1 exclusive pDockToolBarManager Top toolbar Top toolbar visible Bottom toolbar Bottom toolbar visible Left toolbar Left toolbar visible Right toolbar Right toolbar visible Modern dock toolbar manager pEnvironmentVariableEditor Name: Value: pEnvironmentVariablesEditor Environment Variables Editor Add Add a new variable Edit Edit the selected variable Remove Remove the selected variable Del Clear Clear all variables Reset to default Reset to system variables Reset to default variables Add a new variable... The variable '%1' already exists, update it? Edit a variable... Are you sure you want to remove the variable '%1' ? Are you sure you want to clear all variables? pEnvironmentVariablesModel Name: %1 Value: %1 Enabled: %1 true false Name Value pFileDialog Codec: Open in read only. pFileListEditor Choose file(s) Choose file pKeySequenceEdit Press a keybord shortcut... pLineEdit Search Options Clear pPathListEditor Choose directory pPaypalButton Donation Make a donation via Paypal pStringListEditor Add Item Edit Item Remove Item Clear Items Move Item Up Move Item Down New item %1 pStylesActionGroup (System) pTranslationDialog Choose a translation locale Select the locale you want to use with the application. You can click on buttons to locate/reload the translations. Click here to change the application translations paths Click here to reload the translations Choose folders containing your application translations pUpdateChecker Update Check for update pUpdateCheckerDialog Update Checker When an update is detected, you can directly download it (or update it with your package manager). Generally lastest updates fix bugs and/or add new options/plugins/things. Updated on %1 by %2 You are using version <b>%1</b> (%2). Download An error occur: %1 You are running the last available version. An error occur while parsing xml, retry later. ./qwbfsmanager-1.2.1-src/fresh/translations/fresh-da_DK.ts0000644000175000017520000005642111546156115023002 0ustar pasnoxpasnox QObject N/C B KB MB GB TB PB Too big pActionsNodeModel Action Shortcut Default Shortcut pActionsNodeShortcutEditor Shortcut Editor Filter Validate the shortcut Clear the shortcut Text filter... Can't set shortcut, it's maybe already used by another action. Can't restore default shortcut, it's maybe already used by another action. pColorButton Choose a color pConsole Clear the screen An alias for clear command Reset the console List available commands %1 take no parameter No help available Available commands: For specific command details, type: <command> -h/--help Press 'Tab' key to list or auto complete commands, type help for commands help. %1: Command not found. No description available pDockToolBar %1 exclusive pDockToolBarManager Top toolbar Top toolbar visible Bottom toolbar Bottom toolbar visible Left toolbar Left toolbar visible Right toolbar Right toolbar visible Modern dock toolbar manager pEnvironmentVariableEditor Name: Value: pEnvironmentVariablesEditor Environment Variables Editor Add Add a new variable Edit Edit the selected variable Remove Remove the selected variable Del Clear Clear all variables Reset to default Reset to system variables Reset to default variables Add a new variable... The variable '%1' already exists, update it? Edit a variable... Are you sure you want to remove the variable '%1' ? Are you sure you want to clear all variables? pEnvironmentVariablesModel Name: %1 Value: %1 Enabled: %1 true false Name Value pFileDialog Codec: Open in read only. pFileListEditor Choose file(s) Choose file pKeySequenceEdit Press a keybord shortcut... pLineEdit Search Options Clear pPathListEditor Choose directory pPaypalButton Donation Make a donation via Paypal pStringListEditor Add Item Edit Item Remove Item Clear Items Move Item Up Move Item Down New item %1 pStylesActionGroup (System) pTranslationDialog Choose a translation locale Select the locale you want to use with the application. You can click on buttons to locate/reload the translations. Click here to change the application translations paths Click here to reload the translations Choose folders containing your application translations pUpdateChecker Update Check for update pUpdateCheckerDialog Update Checker When an update is detected, you can directly download it (or update it with your package manager). Generally lastest updates fix bugs and/or add new options/plugins/things. Updated on %1 by %2 You are using version <b>%1</b> (%2). Download An error occur: %1 You are running the last available version. An error occur while parsing xml, retry later. ./qwbfsmanager-1.2.1-src/fresh/translations/fresh-fr_FR.ts0000644000175000017520000006075211546156115023040 0ustar pasnoxpasnox QObject N/C B Octet(s) KB Ko MB Mo GB Go TB To PB Po Too big Trop grand pActionsNodeModel Action Action Shortcut Raccourci Default Shortcut Raccourci par défaut pActionsNodeShortcutEditor Shortcut Editor Éditeur de raccourcis Filter Filtre Validate the shortcut Valider le raccourci Clear the shortcut Effacer le raccourci Text filter... Filtre du text... Can't set shortcut, it's maybe already used by another action. Impossible d'affecter le raccourci, il est peut être déjà utilisé par une autre action. Can't restore default shortcut, it's maybe already used by another action. Impossible de restorer le raccourci par défaut, il est surement déjà utilisé par une autre action. pColorButton Choose a color Choisissez une couleur pConsole Clear the screen Efface l'écran An alias for clear command Une alternative pour la commande 'clear' Reset the console Remet à zéro le terminal List available commands Liste les commandes disponibles %1 take no parameter %1 ne prend pas de paramètre No help available Aucune aide disponible Available commands: Commandes disponibles: For specific command details, type: <command> -h/--help Pour plus de détails sur une commande, tappez: <commande> -h/--help Press 'Tab' key to list or auto complete commands, type help for commands help. Pressez la touche 'Tabulation' pour lister ou auto compléter les commandes, tappez 'help' pour l'aide des commandes. %1: Command not found. %1: Commande introuvable. No description available Aucune description disponible pDockToolBar %1 exclusive %1 exclusif pDockToolBarManager Top toolbar Barre d'outils du haut Top toolbar visible Barre d'outils du haut visible Bottom toolbar Barre d'outils du bas Bottom toolbar visible Barre d'outils du bas visible Left toolbar Barre d'outils de gauche Left toolbar visible Barre d'outils de gauche visible Right toolbar Barre d'outils de droite Right toolbar visible Barre d'outils de droite visible Modern dock toolbar manager Gestionnaire de 'dock' moderne pEnvironmentVariableEditor Name: Nom: Value: Valeur: pEnvironmentVariablesEditor Environment Variables Editor Éditeur de variables d'environnement Add Ajouter Add a new variable Ajouter une nouvelle variable Edit Editer Edit the selected variable Editer la variable sélectionnée Remove Enlever Remove the selected variable Enlever la variable sélectionnée Del Suppr Clear Effacer Clear all variables Effacer toutes les variables Reset to default Restorer les valeurs par défaut Reset to system variables Restorer les variables systéme Reset to default variables Restorer les variables par défaut Add a new variable... Ajouter une nouvelle variable... The variable '%1' already exists, update it? La variable '%1' existe déjà, mettre à jour ? Edit a variable... Editer la variable... Are you sure you want to remove the variable '%1' ? Êtes vous sûr de vouloir enlever la variable '%1' ? Are you sure you want to clear all variables? Êtes vous sûr de vouloir effacer toutes les variables ? pEnvironmentVariablesModel Name: %1 Nom: %1 Value: %1 Valeur: %1 Enabled: %1 Activé: %1 true vrai false faux Name Nom Value Valeur pFileDialog Codec: Codec: Open in read only. Ouvrir en lecture seule. pFileListEditor Choose file(s) Choisissez un ou plusieurs fichiers Choose file Choisissez un fichier pKeySequenceEdit Press a keybord shortcut... Pressez un raccourci clavier... pLineEdit Search Options Options de recherche Clear Effacer pPathListEditor Choose directory Choisissez un dossier pPaypalButton Donation Don Make a donation via Paypal Faire une donation via Paypal pStringListEditor Add Item Ajouter un élément Edit Item Éditer l'élément Remove Item Enlever l'élément Clear Items Effacer les éléments Move Item Up Déplacer l'élément vers le haut Move Item Down Déplacer l'élément vers le bas New item %1 Nouvel élément %1 pStylesActionGroup (System) (Systéme) pTranslationDialog Choose a translation locale Choisissez une traduction Select the locale you want to use with the application. You can click on buttons to locate/reload the translations. Sélectionner la locale que vous voulez utiliser avec l'application. Vous pouvez clicker sur les boutons localiser/recharger les traductions. Click here to change the application translations paths Cliquez ici pour changer les chemins des traductions de l'application Click here to reload the translations Cliquez ici pour recharger les traductions Choose folders containing your application translations Choisissez les dossiers contenant les traductions de l'application pUpdateChecker Update Mise à jour Check for update Vérifier les mises à jour pUpdateCheckerDialog Update Checker Vérificateur de mise à jour When an update is detected, you can directly download it (or update it with your package manager). Generally lastest updates fix bugs and/or add new options/plugins/things. Lorsque une mise à jour est détectée, vous pouvez la télécharger directement (ou la mettre à jour via votre gestionnaire de paquets). Généralement les dernières mises à jour corrigent des bogues et/ou ajoutent de nouvelles options/greffons/choses. Updated on %1 by %2 Mis à jour le %1 par %2 You are using version <b>%1</b> (%2). Vous utilisez la version <b>%1</b> (%2). Download Télécharger An error occur: %1 Une erreur est survenue: %1 You are running the last available version. Vous utilisez la dernière version disponible. An error occur while parsing xml, retry later. Une erreur est survenue lors du traitement xml, essayez de nouveau plus tard. ./qwbfsmanager-1.2.1-src/fresh/translations/fresh-es_ES.qm0000644000175000017520000002743111546156115023024 0ustar pasnoxpasnox$ { sb U%)`$+ypH?[ee 3-ԃ!#708CCB'Z:niTه~i+BQObjectGBQObjectKBQObjectMBQObjectN/CN/CQObjectPBPBQObjectTBQObject Demasiado grandeToo bigQObject AccinActionpActionsNodeModel&Accesos por defectoDefault ShortcutpActionsNodeModelAccesosShortcutpActionsNodeModelNo se puede restaurar acceso, tal vez ya se est utilizando en otra accin.JCan't restore default shortcut, it's maybe already used by another action.pActionsNodeShortcutEditorNo se puede configurar el acceso, tal vez ya se est utilizando en otra accin.>Can't set shortcut, it's maybe already used by another action.pActionsNodeShortcutEditorBorrar accesoClear the shortcutpActionsNodeShortcutEditor FiltroFilterpActionsNodeShortcutEditor"Editor de accesosShortcut EditorpActionsNodeShortcutEditor&Texto del filtro...Text filter...pActionsNodeShortcutEditorValidar accesoValidate the shortcutpActionsNodeShortcutEditorElija un colorChoose a color pColorButton*%1 no tiene parmetro%1 take no parameterpConsole>%1: El comando no se encuentra.%1: Command not found.pConsole:Alias para el comando limpiarAn alias for clear commandpConsole*Comandos disponibles:Available commands:pConsole Limpiar pantallaClear the screenpConsolePara obtener informacin especfica de un comando, escriba: <commando> -h/--help7For specific command details, type: -h/--helppConsole:Lista de comandos disponiblesList available commandspConsole8No disponemos de descripcinNo description availablepConsole.No hay ayuda disponibleNo help availablepConsolePulse la tecla 'Tab' para listar los comandos o auto completar, escriba 'help' para los comandos.OPress 'Tab' key to list or auto complete commands, type help for commands help.pConsole&Restablecer consolaReset the consolepConsole%1 en exclusiva %1 exclusive pDockToolBarTBarra de herramientas en la parte inferiorBottom toolbarpDockToolBarManager,Barra inferior visibleBottom toolbar visiblepDockToolBarManagerHBarra de herramientas a la izquierda Left toolbarpDockToolBarManager.Barra izquierda visibleLeft toolbar visiblepDockToolBarManager:Barra de herramientas modernaModern dock toolbar managerpDockToolBarManagerDBarra de herramientas a la derecha Right toolbarpDockToolBarManager*Barra derecha visibleRight toolbar visiblepDockToolBarManagerTBarra de herramientas en la parte superior Top toolbarpDockToolBarManager,Barra superior visibleTop toolbar visiblepDockToolBarManagerNombre:Name:pEnvironmentVariableEditor Valor:Value:pEnvironmentVariableEditor AadirAddpEnvironmentVariablesEditor*Aadir nueva variableAdd a new variablepEnvironmentVariablesEditor0Aadir nueva variable...Add a new variable...pEnvironmentVariablesEditordEst seguro que desea borrar todas las variables?-Are you sure you want to clear all variables?pEnvironmentVariablesEditordEst seguro que desea eliminar la variable '%1' ?3Are you sure you want to remove the variable '%1' ?pEnvironmentVariablesEditor BorrarClearpEnvironmentVariablesEditor4Borrar todas las variablesClear all variablespEnvironmentVariablesEditorEliminarDelpEnvironmentVariablesEditor EditarEditpEnvironmentVariablesEditor$Editar variable...Edit a variable...pEnvironmentVariablesEditorDModificar la variable seleccionadaEdit the selected variablepEnvironmentVariablesEditor<Editor de variables de entornoEnvironment Variables EditorpEnvironmentVariablesEditor QuitarRemovepEnvironmentVariablesEditor8Quitar variable seleccionadaRemove the selected variablepEnvironmentVariablesEditor:Restaurar valores por defectoReset to defaultpEnvironmentVariablesEditor>Restaurar variables por defectoReset to default variablespEnvironmentVariablesEditor>Restaurar variables del sistemaReset to system variablespEnvironmentVariablesEditor`La variable '%1' ya existe, desea actualizarla?,The variable '%1' already exists, update it?pEnvironmentVariablesEditorHabilitar: %1 Enabled: %1pEnvironmentVariablesModel NombreNamepEnvironmentVariablesModelNombre: %1Name: %1pEnvironmentVariablesModel ValorValuepEnvironmentVariablesModelValor: %1 Value: %1pEnvironmentVariablesModel FalsofalsepEnvironmentVariablesModelVerdaderotruepEnvironmentVariablesModel Codec:Codec: pFileDialog:Abierto en modo slo lectura.Open in read only. pFileDialog Elija un archivo Choose filepFileListEditor0Elija uno o ms archivosChoose file(s)pFileListEditor$Pulse un acceso...Press a keybord shortcut...pKeySequenceEditLimpiarClear pLineEdit(Opciones de bsquedaSearch Options pLineEdit&Elija un directorioChoose directorypPathListEditor DonarDonation pPaypalButtonJHacer una donacin a travs de PaypalMake a donation via Paypal pPaypalButtonAadir elementoAdd ItempStringListEditor"Limpiar elementos Clear ItemspStringListEditorEditar elemento Edit ItempStringListEditor(Mover elemento abajoMove Item DownpStringListEditor*Mover elemento arriba Move Item UppStringListEditor"Nuevo elemento %1 New item %1pStringListEditor"Eliminar elemento Remove ItempStringListEditor(Sistema)(System)pStylesActionGroupElija un idiomaChoose a translation localepTranslationDialogSeleccione las carpetas que contienen los idiomas de la aplicacin7Choose folders containing your application translationspTranslationDialogPulse aqu para cambiar las rutas de los idiomas de la aplicacin7Click here to change the application translations pathspTranslationDialogHPulse aqu para recargar los idiomas%Click here to reload the translationspTranslationDialogSeleccione el idioma que desea utilizar con la aplicacin. Puede hacer clic en los botones de localizar/recargar idiomas.sSelect the locale you want to use with the application. You can click on buttons to locate/reload the translations.pTranslationDialog0Buscando actualizacionesCheck for updatepUpdateCheckerActualizarUpdatepUpdateCheckernSe produjo un error al analizar xml, intente ms tarde..An error occur while parsing xml, retry later.pUpdateCheckerDialog.Se produjo un error: %1An error occur: %1pUpdateCheckerDialogDescargandoDownloadpUpdateCheckerDialog<Verificador de actualizacionesUpdate CheckerpUpdateCheckerDialog.Actualizado el %1 de %2Updated on %1 by %2pUpdateCheckerDialogCuando se detecta una actualizacin, se puede descargar directamente (o puede hacerlo a travs de su gestor de paquetes). Por lo general, las actualizaciones corrigen errores y /o la aaden nuevas caractersticas, plugins, etc.When an update is detected, you can directly download it (or update it with your package manager). Generally lastest updates fix bugs and/or add new options/plugins/things.pUpdateCheckerDialogREst usando la ltima versin disponible.+You are running the last available version.pUpdateCheckerDialogREst utilizando la versin<b>%1</b> (%2).%You are using version %1 (%2).pUpdateCheckerDialog./qwbfsmanager-1.2.1-src/fresh/translations/fresh-ar_SA.ts0000644000175000017520000005642111546156115023025 0ustar pasnoxpasnox QObject N/C B KB MB GB TB PB Too big pActionsNodeModel Action Shortcut Default Shortcut pActionsNodeShortcutEditor Shortcut Editor Filter Validate the shortcut Clear the shortcut Text filter... Can't set shortcut, it's maybe already used by another action. Can't restore default shortcut, it's maybe already used by another action. pColorButton Choose a color pConsole Clear the screen An alias for clear command Reset the console List available commands %1 take no parameter No help available Available commands: For specific command details, type: <command> -h/--help Press 'Tab' key to list or auto complete commands, type help for commands help. %1: Command not found. No description available pDockToolBar %1 exclusive pDockToolBarManager Top toolbar Top toolbar visible Bottom toolbar Bottom toolbar visible Left toolbar Left toolbar visible Right toolbar Right toolbar visible Modern dock toolbar manager pEnvironmentVariableEditor Name: Value: pEnvironmentVariablesEditor Environment Variables Editor Add Add a new variable Edit Edit the selected variable Remove Remove the selected variable Del Clear Clear all variables Reset to default Reset to system variables Reset to default variables Add a new variable... The variable '%1' already exists, update it? Edit a variable... Are you sure you want to remove the variable '%1' ? Are you sure you want to clear all variables? pEnvironmentVariablesModel Name: %1 Value: %1 Enabled: %1 true false Name Value pFileDialog Codec: Open in read only. pFileListEditor Choose file(s) Choose file pKeySequenceEdit Press a keybord shortcut... pLineEdit Search Options Clear pPathListEditor Choose directory pPaypalButton Donation Make a donation via Paypal pStringListEditor Add Item Edit Item Remove Item Clear Items Move Item Up Move Item Down New item %1 pStylesActionGroup (System) pTranslationDialog Choose a translation locale Select the locale you want to use with the application. You can click on buttons to locate/reload the translations. Click here to change the application translations paths Click here to reload the translations Choose folders containing your application translations pUpdateChecker Update Check for update pUpdateCheckerDialog Update Checker When an update is detected, you can directly download it (or update it with your package manager). Generally lastest updates fix bugs and/or add new options/plugins/things. Updated on %1 by %2 You are using version <b>%1</b> (%2). Download An error occur: %1 You are running the last available version. An error occur while parsing xml, retry later. ./qwbfsmanager-1.2.1-src/fresh/translations/fresh-sv_SE.ts0000644000175000017520000005642111546156115023057 0ustar pasnoxpasnox QObject N/C B KB MB GB TB PB Too big pActionsNodeModel Action Shortcut Default Shortcut pActionsNodeShortcutEditor Shortcut Editor Filter Validate the shortcut Clear the shortcut Text filter... Can't set shortcut, it's maybe already used by another action. Can't restore default shortcut, it's maybe already used by another action. pColorButton Choose a color pConsole Clear the screen An alias for clear command Reset the console List available commands %1 take no parameter No help available Available commands: For specific command details, type: <command> -h/--help Press 'Tab' key to list or auto complete commands, type help for commands help. %1: Command not found. No description available pDockToolBar %1 exclusive pDockToolBarManager Top toolbar Top toolbar visible Bottom toolbar Bottom toolbar visible Left toolbar Left toolbar visible Right toolbar Right toolbar visible Modern dock toolbar manager pEnvironmentVariableEditor Name: Value: pEnvironmentVariablesEditor Environment Variables Editor Add Add a new variable Edit Edit the selected variable Remove Remove the selected variable Del Clear Clear all variables Reset to default Reset to system variables Reset to default variables Add a new variable... The variable '%1' already exists, update it? Edit a variable... Are you sure you want to remove the variable '%1' ? Are you sure you want to clear all variables? pEnvironmentVariablesModel Name: %1 Value: %1 Enabled: %1 true false Name Value pFileDialog Codec: Open in read only. pFileListEditor Choose file(s) Choose file pKeySequenceEdit Press a keybord shortcut... pLineEdit Search Options Clear pPathListEditor Choose directory pPaypalButton Donation Make a donation via Paypal pStringListEditor Add Item Edit Item Remove Item Clear Items Move Item Up Move Item Down New item %1 pStylesActionGroup (System) pTranslationDialog Choose a translation locale Select the locale you want to use with the application. You can click on buttons to locate/reload the translations. Click here to change the application translations paths Click here to reload the translations Choose folders containing your application translations pUpdateChecker Update Check for update pUpdateCheckerDialog Update Checker When an update is detected, you can directly download it (or update it with your package manager). Generally lastest updates fix bugs and/or add new options/plugins/things. Updated on %1 by %2 You are using version <b>%1</b> (%2). Download An error occur: %1 You are running the last available version. An error occur while parsing xml, retry later. ./qwbfsmanager-1.2.1-src/fresh/.gitignore0000644000175000017520000000021711546156115017622 0ustar pasnoxpasnoxbuild doc/html examples/cpp/*.ini examples/cpp/Makefile* examples/cpp/examples /build-cmake/ /*.directory /Makefile /*.fresh /object_script.* ./qwbfsmanager-1.2.1-src/fresh/FindFresh.cmake0000644000175000017520000000141511546156115020505 0ustar pasnoxpasnox# Try to find Fresh library # Once done this will define # FRESH_FOUND - System has Fresh # FRESH_INCLUDE_DIR - The Fresh include directory # FRESH_LIBRARY - The libraries needed to use Fresh # FRESH_TRANSLATIONS - Fresh translation files find_package (Qt4) find_path(FRESH_INCLUDE_DIR FreshCore PATHS ${QT_HEADERS_DIR}) find_library(FRESH_LIBRARY NAMES fresh PATHS ${QT_LIBRARY_DIR}) file(GLOB_RECURSE FRESH_TRANSLATIONS ${QT_TRANSLATIONS_DIR}/fresh*.ts) include(FindPackageHandleStandardArgs) # handle the QUIETLY and REQUIRED arguments and set FRESH_FOUND to TRUE # if all listed variables are TRUE find_package_handle_standard_args(Fresh DEFAULT_MSG FRESH_LIBRARY FRESH_INCLUDE_DIR) mark_as_advanced(FRESH_INCLUDE_DIR FRESH_LIBRARY) ./qwbfsmanager-1.2.1-src/fresh/fresh.pro0000644000175000017520000001327611546156115017474 0ustar pasnoxpasnox# fresh lib project file # include functions file include( functions.pri ) isEmpty( build_mode ):FRESH_BUILD_MODE = release else:FRESH_BUILD_MODE = $$build_mode isEmpty( build_type ):FRESH_BUILD_TYPE = static else:FRESH_BUILD_TYPE = $$build_type FRESH_BUILD_PATH = build FRESH_DESTDIR = build TEMPLATE = lib CONFIG -= debug_and_release release debug warn_off warn_on x86 ppc CONFIG *= qt warn_on thread x11 windows $$FRESH_BUILD_MODE $$FRESH_BUILD_TYPE QT *= xml network # Mac universal build from 10.3 to up to 10.5 macx:universal { QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.3 QMAKE_MAC_SDK = /Developer/SDKs/MacOSX10.4u.sdk CONFIG *= x86 ppc } macx { LIBS *= "-framework CoreFoundation" } setTarget( fresh ) setTemporaryDirectories( $$FRESH_BUILD_PATH ) isEqual( FRESH_BUILD_MODE, debug ):CONFIG *= console isEqual( FRESH_BUILD_TYPE, static ) { DESTDIR = $$FRESH_DESTDIR } else { win32:DLLDESTDIR = $$FRESH_DESTDIR else:DESTDIR = $$FRESH_DESTDIR } # some library infos QMAKE_TARGET_COMPANY = "The Fresh Team" QMAKE_TARGET_PRODUCT = "Fresh Framework" QMAKE_TARGET_DESCRIPTION = "Qt Extension Framework" QMAKE_TARGET_COPYRIGHT = "\\251 2005 - 2011 Filipe AZEVEDO and $$QMAKE_TARGET_COMPANY" VERSION = 1.0.0 # make library exportable DEFINES *= FRESH_CORE_BUILD FRESH_SOURCES_PATHS = $$getFolders( ./src ) DEPENDPATH *= $${FRESH_SOURCES_PATHS} INCLUDEPATH *= $${FRESH_SOURCES_PATHS} RESOURCES *= resources/fresh.qrc TRANSLATIONS *= translations/fresh-ru_RU.ts \ translations/fresh-sl_SI.ts \ translations/fresh-pl_PL.ts \ translations/fresh-zh_CN.ts \ translations/fresh-he_IL.ts \ translations/fresh-da_DK.ts \ translations/fresh-sk_SK.ts \ translations/fresh-ja_JP.ts \ translations/fresh-uk_UA.ts \ translations/fresh-cs_CZ.ts \ translations/fresh-ca_ES.ts \ translations/fresh-ar_SA.ts \ translations/fresh-fr_FR.ts \ translations/fresh-zh_TW.ts \ translations/fresh-es_ES.ts \ translations/fresh-de_DE.ts \ translations/fresh-pt_PT.ts \ translations/fresh-sv_SE.ts FORMS *= \ src/gui/actionmanager/pActionsNodeShortcutEditor.ui \ src/gui/pTranslationDialog.ui \ src/gui/environmentvariablemanager/pEnvironmentVariableEditor.ui \ src/gui/environmentvariablemanager/pEnvironmentVariablesEditor.ui \ src/gui/gc-updatechecker/pUpdateCheckerDialog.ui HEADERS *= \ src/core/FreshExport.h \ src/core/pCoreUtils.h \ src/core/pGetOpt.h \ src/core/pSettings.h \ src/core/pTranslationManager.h \ src/core/pVersion.h \ src/gui/pColorButton.h \ src/gui/pGuiUtils.h \ src/gui/pIconManager.h \ src/gui/pKeySequenceEdit.h \ src/gui/pLineEdit.h \ src/gui/pMainWindow.h \ src/gui/pToolButton.h \ src/gui/actionmanager/pActionsNode.h \ src/gui/actionmanager/pActionsNodeMenuBar.h \ src/gui/actionmanager/pActionsNodeModel.h \ src/gui/actionmanager/pActionsNodeShortcutEditor.h \ src/gui/dockmanager/pDockToolBar.h \ src/gui/dockmanager/pDockToolBarManager.h \ src/gui/listeditor/pFileListEditor.h \ src/gui/listeditor/pPathListEditor.h \ src/gui/listeditor/pStringListEditor.h \ src/gui/models/pRecursiveSortFilterProxyModel.h \ src/gui/pTranslationDialog.h \ src/gui/queuedmessage/pQueuedMessageToolBar.h \ src/gui/queuedmessage/pQueuedMessageWidget.h \ src/gui/stylemanager/pStylesActionGroup.h \ src/gui/stylemanager/pStylesToolButton.h \ src/gui/pFileDialog.h \ src/gui/pTreeComboBox.h \ src/gui/consolemanager/pConsole.h \ src/gui/consolemanager/pConsoleCommand.h \ src/gui/dockwidget/pDockWidget.h \ src/gui/dockwidget/pDockWidgetTitleBar.h \ src/gui/environmentvariablemanager/pEnvironmentVariableEditor.h \ src/gui/environmentvariablemanager/pEnvironmentVariablesEditor.h \ src/gui/environmentvariablemanager/pEnvironmentVariablesManager.h \ src/gui/environmentvariablemanager/pEnvironmentVariablesModel.h \ src/gui/gc-updatechecker/pUpdateChecker.h \ src/gui/gc-updatechecker/pUpdateCheckerDialog.h \ src/gui/pPaypalButton.h \ src/core/pNetworkAccessManager.h \ src/core/Fresh.h SOURCES *= \ src/core/pCoreUtils.cpp \ src/core/pGetOpt.cpp \ src/core/pSettings.cpp \ src/core/pTranslationManager.cpp \ src/core/pVersion.cpp \ src/gui/pColorButton.cpp \ src/gui/pGuiUtils.cpp \ src/gui/pIconManager.cpp \ src/gui/pKeySequenceEdit.cpp \ src/gui/pLineEdit.cpp \ src/gui/pMainWindow.cpp \ src/gui/pToolButton.cpp \ src/gui/actionmanager/pActionsNode.cpp \ src/gui/actionmanager/pActionsNodeMenuBar.cpp \ src/gui/actionmanager/pActionsNodeModel.cpp \ src/gui/actionmanager/pActionsNodeShortcutEditor.cpp \ src/gui/dockmanager/pDockToolBar.cpp \ src/gui/dockmanager/pDockToolBarManager.cpp \ src/gui/listeditor/pFileListEditor.cpp \ src/gui/listeditor/pPathListEditor.cpp \ src/gui/listeditor/pStringListEditor.cpp \ src/gui/models/pRecursiveSortFilterProxyModel.cpp \ src/gui/pTranslationDialog.cpp \ src/gui/queuedmessage/pQueuedMessageToolBar.cpp \ src/gui/queuedmessage/pQueuedMessageWidget.cpp \ src/gui/stylemanager/pStylesActionGroup.cpp \ src/gui/stylemanager/pStylesToolButton.cpp \ src/gui/pFileDialog.cpp \ src/gui/pTreeComboBox.cpp \ src/gui/consolemanager/pConsole.cpp \ src/gui/consolemanager/pConsoleCommand.cpp \ src/gui/dockwidget/pDockWidget.cpp \ src/gui/dockwidget/pDockWidgetTitleBar.cpp \ src/gui/environmentvariablemanager/pEnvironmentVariableEditor.cpp \ src/gui/environmentvariablemanager/pEnvironmentVariablesEditor.cpp \ src/gui/environmentvariablemanager/pEnvironmentVariablesManager.cpp \ src/gui/environmentvariablemanager/pEnvironmentVariablesModel.cpp \ src/gui/gc-updatechecker/pUpdateChecker.cpp \ src/gui/gc-updatechecker/pUpdateCheckerDialog.cpp \ src/gui/pPaypalButton.cpp \ src/core/pNetworkAccessManager.cpp \ src/core/Fresh.cpp macx { HEADERS *= src/core/pMacHelpers.h OBJECTIVE_SOURCES *= src/core/pMacHelpers.mm } # include installs file include( installs.pri )./qwbfsmanager-1.2.1-src/fresh/LICENSE0000644000175000017520000001674311546156115016652 0ustar pasnoxpasnox GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser 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 Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. ./qwbfsmanager-1.2.1-src/fresh/include/0000755000175000017520000000000011546156115017255 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/0000755000175000017520000000000011546156115020771 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pFileListEditor0000644000175000017520000000003511546156115023754 0ustar pasnoxpasnox#include "pFileListEditor.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pUpdateChecker0000644000175000017520000000003411546156115023600 0ustar pasnoxpasnox#include "pUpdateChecker.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pEnvironmentVariableEditor0000644000175000017520000000005011546156115026210 0ustar pasnoxpasnox#include "pEnvironmentVariableEditor.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pMainWindow0000644000175000017520000000003111546156115023142 0ustar pasnoxpasnox#include "pMainWindow.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pGuiUtils0000644000175000017520000000002711546156115022640 0ustar pasnoxpasnox#include "pGuiUtils.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pEnvironmentVariablesEditor0000644000175000017520000000005111546156115026374 0ustar pasnoxpasnox#include "pEnvironmentVariablesEditor.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pDockToolBarManager0000644000175000017520000000004111546156115024525 0ustar pasnoxpasnox#include "pDockToolBarManager.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pTranslationDialog0000644000175000017520000000004011546156115024504 0ustar pasnoxpasnox#include "pTranslationDialog.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pUpdateCheckerDialog0000644000175000017520000000004211546156115024717 0ustar pasnoxpasnox#include "pUpdateCheckerDialog.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pActionsNodeMenuBar0000644000175000017520000000004111546156115024547 0ustar pasnoxpasnox#include "pActionsNodeMenuBar.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pIconManager0000644000175000017520000000003211546156115023252 0ustar pasnoxpasnox#include "pIconManager.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pDockToolBar0000644000175000017520000000003211546156115023232 0ustar pasnoxpasnox#include "pDockToolBar.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pStringListEditor0000644000175000017520000000003711546156115024345 0ustar pasnoxpasnox#include "pStringListEditor.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pQueuedMessageToolBar0000644000175000017520000000004311546156115025111 0ustar pasnoxpasnox#include "pQueuedMessageToolBar.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pTreeComboBox0000644000175000017520000000003311546156115023420 0ustar pasnoxpasnox#include "pTreeComboBox.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pKeySequenceEdit0000644000175000017520000000003611546156115024122 0ustar pasnoxpasnox#include "pKeySequenceEdit.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pDockToolBarManagerModernWidget0000644000175000017520000000004611546156115027043 0ustar pasnoxpasnox#include "pDockToolBarModernWidget.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pActionsNodeShortcutEditor0000644000175000017520000000005011546156115026200 0ustar pasnoxpasnox#include "pActionsNodeShortcutEditor.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pConsole0000644000175000017520000000002611546156115022474 0ustar pasnoxpasnox#include "pConsole.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pStylesActionGroup0000644000175000017520000000004011546156115024524 0ustar pasnoxpasnox#include "pStylesActionGroup.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pStylesToolButton0000644000175000017520000000003711546156115024411 0ustar pasnoxpasnox#include "pStylesToolButton.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pPathListEditor0000644000175000017520000000003511546156115023771 0ustar pasnoxpasnox#include "pPathListEditor.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pEnvironmentVariablesManager0000644000175000017520000000005211546156115026521 0ustar pasnoxpasnox#include "pEnvironmentVariablesManager.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pActionsNode0000644000175000017520000000003211546156115023275 0ustar pasnoxpasnox#include "pActionsNode.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pColorButton0000644000175000017520000000003211546156115023341 0ustar pasnoxpasnox#include "pColorButton.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pToolButton0000644000175000017520000000003111546156115023177 0ustar pasnoxpasnox#include "pFileDialog.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pActionsNodeModel0000644000175000017520000000003711546156115024263 0ustar pasnoxpasnox#include "pActionsNodeModel.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pDockWidget0000644000175000017520000000003111546156115023112 0ustar pasnoxpasnox#include "pDockWidget.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pPaypalButton0000644000175000017520000000003311546156115023512 0ustar pasnoxpasnox#include "pPaypalButton.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pLineEdit0000644000175000017520000000002711546156115022570 0ustar pasnoxpasnox#include "pLineEdit.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pRecursiveSortFilterProxyModel0000644000175000017520000000005411546156115027103 0ustar pasnoxpasnox#include "pRecursiveSortFilterProxyModel.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pConsoleCommand0000644000175000017520000000003511546156115023773 0ustar pasnoxpasnox#include "pConsoleCommand.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pDockWidgetTitleBar0000644000175000017520000000004111546156115024542 0ustar pasnoxpasnox#include "pDockWidgetTitleBar.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pQueuedMessageWidget0000644000175000017520000000004211546156115024771 0ustar pasnoxpasnox#include "pQueuedMessageWidget.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pEnvironmentVariablesModel0000644000175000017520000000005011546156115026205 0ustar pasnoxpasnox#include "pEnvironmentVariablesModel.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshGui/pFileDialog0000644000175000017520000000003111546156115023065 0ustar pasnoxpasnox#include "pToolButton.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshCore/0000755000175000017520000000000011546156115021135 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/fresh/include/FreshCore/pCoreUtils0000644000175000017520000000003011546156115023142 0ustar pasnoxpasnox#include "pCoreUtils.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshCore/pVersion0000644000175000017520000000002611546156115022663 0ustar pasnoxpasnox#include "pVersion.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshCore/pNetworkAccessManager0000644000175000017520000000004311546156115025303 0ustar pasnoxpasnox#include "pNetworkAccessManager.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshCore/pGetOpt0000644000175000017520000000002511546156115022437 0ustar pasnoxpasnox#include "pGetOpt.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshCore/pMacHelpers0000644000175000017520000000003111546156115023255 0ustar pasnoxpasnox#include "pMacHelpers.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshCore/pSettings0000644000175000017520000000002711546156115023037 0ustar pasnoxpasnox#include "pSettings.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshCore/FreshExport0000644000175000017520000000003111546156115023323 0ustar pasnoxpasnox#include "FreshExport.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshCore/Fresh0000644000175000017520000000002311546156115022122 0ustar pasnoxpasnox#include "Fresh.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshCore/pTranslationManager0000644000175000017520000000004111546156115025024 0ustar pasnoxpasnox#include "pTranslationManager.h" ./qwbfsmanager-1.2.1-src/fresh/include/FreshCore/pWinHelpers0000644000175000017520000000003111546156115023312 0ustar pasnoxpasnox#include "pWinHelpers.h" ./qwbfsmanager-1.2.1-src/fresh/Python/0000755000175000017520000000000011546156115017113 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/fresh/Python/cmake/0000755000175000017520000000000011546156115020173 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/fresh/Python/cmake/modules/0000755000175000017520000000000011546156115021643 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/fresh/Python/cmake/modules/PythonMacros.cmake0000644000175000017520000000443711546156115025303 0ustar pasnoxpasnox# Python macros # ~~~~~~~~~~~~~ # Copyright (c) 2007, Simon Edwards # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. # # This file defines the following macros: # # PYTHON_INSTALL (SOURCE_FILE DESINATION_DIR) # Install the SOURCE_FILE, which is a Python .py file, into the # destination directory during install. The file will be byte compiled # and both the .py file and .pyc file will be installed. GET_FILENAME_COMPONENT(PYTHON_MACROS_MODULE_PATH ${CMAKE_CURRENT_LIST_FILE} PATH) MACRO(PYTHON_INSTALL SOURCE_FILE DESINATION_DIR) FIND_FILE(_python_compile_py PythonCompile.py PATHS ${CMAKE_MODULE_PATH}) ADD_CUSTOM_TARGET(compile_python_files ALL) # Install the source file. INSTALL(FILES ${SOURCE_FILE} DESTINATION ${DESINATION_DIR}) # Byte compile and install the .pyc file. GET_FILENAME_COMPONENT(_absfilename ${SOURCE_FILE} ABSOLUTE) GET_FILENAME_COMPONENT(_filename ${SOURCE_FILE} NAME) GET_FILENAME_COMPONENT(_filenamebase ${SOURCE_FILE} NAME_WE) GET_FILENAME_COMPONENT(_basepath ${SOURCE_FILE} PATH) if(WIN32) string(REGEX REPLACE ".:/" "/" _basepath "${_basepath}") endif(WIN32) SET(_bin_py ${CMAKE_CURRENT_BINARY_DIR}/${_basepath}/${_filename}) SET(_bin_pyc ${CMAKE_CURRENT_BINARY_DIR}/${_basepath}/${_filenamebase}.pyc) FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${_basepath}) SET(_message "-DMESSAGE=Byte-compiling ${_bin_py}") GET_FILENAME_COMPONENT(_abs_bin_py ${_bin_py} ABSOLUTE) IF(_abs_bin_py STREQUAL ${_absfilename}) # Don't copy the file onto itself. ADD_CUSTOM_COMMAND( TARGET compile_python_files COMMAND ${CMAKE_COMMAND} -E echo ${message} COMMAND ${PYTHON_EXECUTABLE} ${_python_compile_py} ${_bin_py} DEPENDS ${_absfilename} ) ELSE(_abs_bin_py STREQUAL ${_absfilename}) ADD_CUSTOM_COMMAND( TARGET compile_python_files COMMAND ${CMAKE_COMMAND} -E echo ${message} COMMAND ${CMAKE_COMMAND} -E copy ${_absfilename} ${_bin_py} COMMAND ${PYTHON_EXECUTABLE} ${_python_compile_py} ${_bin_py} DEPENDS ${_absfilename} ) ENDIF(_abs_bin_py STREQUAL ${_absfilename}) INSTALL(FILES ${_bin_pyc} DESTINATION ${DESINATION_DIR}) ENDMACRO(PYTHON_INSTALL) ./qwbfsmanager-1.2.1-src/fresh/Python/cmake/modules/FindPyQt.py0000644000175000017520000000137611546156115023722 0ustar pasnoxpasnox# Copyright (c) 2007, Simon Edwards # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. import PyQt4.pyqtconfig pyqtcfg = PyQt4.pyqtconfig.Configuration() print("pyqt_version:%06.0x" % pyqtcfg.pyqt_version) print("pyqt_version_str:%s" % pyqtcfg.pyqt_version_str) pyqt_version_tag = "" in_t = False for item in pyqtcfg.pyqt_sip_flags.split(' '): if item=="-t": in_t = True elif in_t: if item.startswith("Qt_4"): pyqt_version_tag = item else: in_t = False print("pyqt_version_tag:%s" % pyqt_version_tag) print("pyqt_sip_dir:%s" % pyqtcfg.pyqt_sip_dir) print("pyqt_sip_flags:%s" % pyqtcfg.pyqt_sip_flags) ./qwbfsmanager-1.2.1-src/fresh/Python/cmake/modules/FindSIP.py0000644000175000017520000000100511546156115023445 0ustar pasnoxpasnox# FindSIP.py # # Copyright (c) 2007, Simon Edwards # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. import sys import sipconfig sipcfg = sipconfig.Configuration() print("sip_version:%06.0x" % sipcfg.sip_version) print("sip_version_str:%s" % sipcfg.sip_version_str) print("sip_bin:%s" % sipcfg.sip_bin) print("default_sip_dir:%s" % sipcfg.default_sip_dir) print("sip_inc_dir:%s" % sipcfg.sip_inc_dir) ./qwbfsmanager-1.2.1-src/fresh/Python/cmake/modules/FindPyQt4.cmake0000644000175000017520000000367711546156115024444 0ustar pasnoxpasnox# Find PyQt4 # ~~~~~~~~~~ # Copyright (c) 2007-2008, Simon Edwards # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. # # PyQt4 website: http://www.riverbankcomputing.co.uk/pyqt/index.php # # Find the installed version of PyQt4. FindPyQt4 should only be called after # Python has been found. # # This file defines the following variables: # # PYQT4_VERSION - The version of PyQt4 found expressed as a 6 digit hex number # suitable for comparision as a string # # PYQT4_VERSION_STR - The version of PyQt4 as a human readable string. # # PYQT4_VERSION_TAG - The PyQt version tag using by PyQt's sip files. # # PYQT4_SIP_DIR - The directory holding the PyQt4 .sip files. # # PYQT4_SIP_FLAGS - The SIP flags used to build PyQt. IF(EXISTS PYQT4_VERSION) # Already in cache, be silent SET(PYQT4_FOUND TRUE) ELSE(EXISTS PYQT4_VERSION) FIND_FILE(_find_pyqt_py FindPyQt.py PATHS ${CMAKE_MODULE_PATH}) EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} ${_find_pyqt_py} OUTPUT_VARIABLE pyqt_config) IF(pyqt_config) STRING(REGEX REPLACE "^pyqt_version:([^\n]+).*$" "\\1" PYQT4_VERSION ${pyqt_config}) STRING(REGEX REPLACE ".*\npyqt_version_str:([^\n]+).*$" "\\1" PYQT4_VERSION_STR ${pyqt_config}) STRING(REGEX REPLACE ".*\npyqt_version_tag:([^\n]+).*$" "\\1" PYQT4_VERSION_TAG ${pyqt_config}) STRING(REGEX REPLACE ".*\npyqt_sip_dir:([^\n]+).*$" "\\1" PYQT4_SIP_DIR ${pyqt_config}) STRING(REGEX REPLACE ".*\npyqt_sip_flags:([^\n]+).*$" "\\1" PYQT4_SIP_FLAGS ${pyqt_config}) SET(PYQT4_FOUND TRUE) ENDIF(pyqt_config) IF(PYQT4_FOUND) IF(NOT PYQT4_FIND_QUIETLY) MESSAGE(STATUS "Found PyQt4 version: ${PYQT4_VERSION_STR}") ENDIF(NOT PYQT4_FIND_QUIETLY) ELSE(PYQT4_FOUND) IF(PYQT4_FIND_REQUIRED) MESSAGE(FATAL_ERROR "Could not find Python") ENDIF(PYQT4_FIND_REQUIRED) ENDIF(PYQT4_FOUND) ENDIF(EXISTS PYQT4_VERSION) ./qwbfsmanager-1.2.1-src/fresh/Python/cmake/modules/FindPythonLibrary.cmake0000644000175000017520000001163011546156115026255 0ustar pasnoxpasnox# Find Python # ~~~~~~~~~~~ # Find the Python interpreter and related Python directories. # # This file defines the following variables: # # PYTHON_EXECUTABLE - The path and filename of the Python interpreter. # # PYTHON_SHORT_VERSION - The version of the Python interpreter found, # excluding the patch version number. (e.g. 2.5 and not 2.5.1)) # # PYTHON_LONG_VERSION - The version of the Python interpreter found as a human # readable string. # # PYTHON_SITE_PACKAGES_INSTALL_DIR - this cache variable can be used for installing # own python modules. You may want to adjust this to be the # same as ${PYTHON_SITE_PACKAGES_DIR}, but then admin # privileges may be required for installation. # # PYTHON_SITE_PACKAGES_DIR - Location of the Python site-packages directory. # # PYTHON_INCLUDE_PATH - Directory holding the python.h include file. # # PYTHON_LIBRARY, PYTHON_LIBRARIES- Location of the Python library. # Copyright (c) 2007, Simon Edwards # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. include(CMakeFindFrameworks) if(EXISTS PYTHON_LIBRARY) # Already in cache, be silent set(PYTHONLIBRARY_FOUND TRUE) else(EXISTS PYTHON_LIBRARY) find_package(PythonInterp) if(PYTHONINTERP_FOUND) # get the directory of the current file, used later on in the file get_filename_component( _py_cmake_module_dir ${CMAKE_CURRENT_LIST_FILE} PATH) if(NOT EXISTS "${_py_cmake_module_dir}/FindLibPython.py") message(FATAL_ERROR "The file FindLibPython.py does not exist in ${_py_cmake_module_dir} (the directory where FindPythonLibrary.cmake is located). Check your installation.") endif(NOT EXISTS "${_py_cmake_module_dir}/FindLibPython.py") execute_process(COMMAND ${PYTHON_EXECUTABLE} "${_py_cmake_module_dir}/FindLibPython.py" OUTPUT_VARIABLE python_config) if(python_config) string(REGEX REPLACE ".*exec_prefix:([^\n]+).*$" "\\1" PYTHON_PREFIX ${python_config}) string(REGEX REPLACE ".*\nshort_version:([^\n]+).*$" "\\1" PYTHON_SHORT_VERSION ${python_config}) string(REGEX REPLACE ".*\nlong_version:([^\n]+).*$" "\\1" PYTHON_LONG_VERSION ${python_config}) string(REGEX REPLACE ".*\npy_inc_dir:([^\n]+).*$" "\\1" _TMP_PYTHON_INCLUDE_PATH ${python_config}) string(REGEX REPLACE ".*\nsite_packages_dir:([^\n]+).*$" "\\1" _TMP_PYTHON_SITE_PACKAGES_DIR ${python_config}) # Put these two variables in the cache so they are visible for the user, but read-only: set(PYTHON_INCLUDE_PATH "${_TMP_PYTHON_INCLUDE_PATH}" CACHE PATH "The python include directory" FORCE) set(PYTHON_SITE_PACKAGES_DIR "${_TMP_PYTHON_SITE_PACKAGES_DIR}" CACHE PATH "The python site packages dir" FORCE) # This one is intended to be used and changed by the user for installing own modules: set(PYTHON_SITE_PACKAGES_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}/python${PYTHON_SHORT_VERSION}/site-packages CACHE PATH "The directory where python modules will be installed to.") string(REGEX REPLACE "([0-9]+).([0-9]+)" "\\1\\2" PYTHON_SHORT_VERSION_NO_DOT ${PYTHON_SHORT_VERSION}) set(PYTHON_LIBRARY_NAMES python${PYTHON_SHORT_VERSION} python${PYTHON_SHORT_VERSION_NO_DOT}) if(WIN32) string(REPLACE "\\" "/" PYTHON_SITE_PACKAGES_DIR ${PYTHON_SITE_PACKAGES_DIR}) endif(WIN32) find_library(PYTHON_LIBRARY NAMES ${PYTHON_LIBRARY_NAMES} PATHS ${PYTHON_PREFIX}/lib ${PYTHON_PREFIX}/libs NO_DEFAULT_PATH) set(PYTHONLIBRARY_FOUND TRUE) endif(python_config) # adapted from cmake's builtin FindPythonLibs if(APPLE) cmake_find_frameworks(Python) set(PYTHON_FRAMEWORK_INCLUDES) if(Python_FRAMEWORKS) # If a framework has been selected for the include path, # make sure "-framework" is used to link it. if("${PYTHON_INCLUDE_PATH}" MATCHES "Python\\.framework") set(PYTHON_LIBRARY "") set(PYTHON_DEBUG_LIBRARY "") endif("${PYTHON_INCLUDE_PATH}" MATCHES "Python\\.framework") if(NOT PYTHON_LIBRARY) set (PYTHON_LIBRARY "-framework Python" CACHE FILEPATH "Python Framework" FORCE) endif(NOT PYTHON_LIBRARY) set(PYTHONLIBRARY_FOUND TRUE) endif(Python_FRAMEWORKS) endif(APPLE) endif(PYTHONINTERP_FOUND) if(PYTHONLIBRARY_FOUND) set(PYTHON_LIBRARIES ${PYTHON_LIBRARY}) if(NOT PYTHONLIBRARY_FIND_QUIETLY) message(STATUS "Found Python executable: ${PYTHON_EXECUTABLE}") message(STATUS "Found Python version: ${PYTHON_LONG_VERSION}") message(STATUS "Found Python library: ${PYTHON_LIBRARY}") endif(NOT PYTHONLIBRARY_FIND_QUIETLY) else(PYTHONLIBRARY_FOUND) if(PYTHONLIBRARY_FIND_REQUIRED) message(FATAL_ERROR "Could not find Python") endif(PYTHONLIBRARY_FIND_REQUIRED) endif(PYTHONLIBRARY_FOUND) endif (EXISTS PYTHON_LIBRARY) ./qwbfsmanager-1.2.1-src/fresh/Python/cmake/modules/FindLibPython.py0000644000175000017520000000101311546156115024721 0ustar pasnoxpasnox # Copyright (c) 2007, Simon Edwards # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. import sys import distutils.sysconfig print("exec_prefix:%s" % sys.exec_prefix) print("short_version:%s" % sys.version[:3]) print("long_version:%s" % sys.version.split()[0]) print("py_inc_dir:%s" % distutils.sysconfig.get_python_inc()) print("site_packages_dir:%s" % distutils.sysconfig.get_python_lib(plat_specific=1)) ./qwbfsmanager-1.2.1-src/fresh/Python/cmake/modules/SIPMacros.cmake0000644000175000017520000001205211546156115024445 0ustar pasnoxpasnox# Macros for SIP # ~~~~~~~~~~~~~~ # Copyright (c) 2007, Simon Edwards # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. # # SIP website: http://www.riverbankcomputing.co.uk/sip/index.php # # This file defines the following macros: # # ADD_SIP_PYTHON_MODULE (MODULE_NAME MODULE_SIP [library1, libaray2, ...]) # Specifies a SIP file to be built into a Python module and installed. # MODULE_NAME is the name of Python module including any path name. (e.g. # os.sys, Foo.bar etc). MODULE_SIP the path and filename of the .sip file # to process and compile. libraryN are libraries that the Python module, # which is typically a shared library, should be linked to. The built # module will also be install into Python's site-packages directory. # # The behaviour of the ADD_SIP_PYTHON_MODULE macro can be controlled by a # number of variables: # # SIP_INCLUDES - List of directories which SIP will scan through when looking # for included .sip files. (Corresponds to the -I option for SIP.) # # SIP_TAGS - List of tags to define when running SIP. (Corresponds to the -t # option for SIP.) # # SIP_CONCAT_PARTS - An integer which defines the number of parts the C++ code # of each module should be split into. Defaults to 8. (Corresponds to the # -j option for SIP.) # # SIP_DISABLE_FEATURES - List of feature names which should be disabled # running SIP. (Corresponds to the -x option for SIP.) # # SIP_EXTRA_OPTIONS - Extra command line options which should be passed on to # SIP. SET(SIP_INCLUDES) SET(SIP_TAGS) SET(SIP_CONCAT_PARTS 8) SET(SIP_DISABLE_FEATURES) SET(SIP_EXTRA_OPTIONS) MACRO(ADD_SIP_PYTHON_MODULE MODULE_NAME MODULE_SIP) SET(EXTRA_LINK_LIBRARIES ${ARGN}) STRING(REPLACE "." "/" _x ${MODULE_NAME}) GET_FILENAME_COMPONENT(_parent_module_path ${_x} PATH) GET_FILENAME_COMPONENT(_child_module_name ${_x} NAME) GET_FILENAME_COMPONENT(_module_path ${MODULE_SIP} PATH) if(_module_path STREQUAL "") set(CMAKE_CURRENT_SIP_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}") else(_module_path STREQUAL "") set(CMAKE_CURRENT_SIP_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/${_module_path}") endif(_module_path STREQUAL "") GET_FILENAME_COMPONENT(_abs_module_sip ${MODULE_SIP} ABSOLUTE) # We give this target a long logical target name. # (This is to avoid having the library name clash with any already # install library names. If that happens then cmake dependancy # tracking get confused.) STRING(REPLACE "." "_" _logical_name ${MODULE_NAME}) SET(_logical_name "python_module_${_logical_name}") FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_SIP_OUTPUT_DIR}) # Output goes in this dir. SET(_sip_includes) FOREACH (_inc ${SIP_INCLUDES}) GET_FILENAME_COMPONENT(_abs_inc ${_inc} ABSOLUTE) LIST(APPEND _sip_includes -I ${_abs_inc}) ENDFOREACH (_inc ) SET(_sip_tags) FOREACH (_tag ${SIP_TAGS}) LIST(APPEND _sip_tags -t ${_tag}) ENDFOREACH (_tag) SET(_sip_x) FOREACH (_x ${SIP_DISABLE_FEATURES}) LIST(APPEND _sip_x -x ${_x}) ENDFOREACH (_x ${SIP_DISABLE_FEATURES}) SET(_message "-DMESSAGE=Generating CPP code for module ${MODULE_NAME}") SET(_sip_output_files) FOREACH(CONCAT_NUM RANGE 0 ${SIP_CONCAT_PARTS} ) IF( ${CONCAT_NUM} LESS ${SIP_CONCAT_PARTS} ) SET(_sip_output_files ${_sip_output_files} ${CMAKE_CURRENT_SIP_OUTPUT_DIR}/sip${_child_module_name}part${CONCAT_NUM}.cpp ) ENDIF( ${CONCAT_NUM} LESS ${SIP_CONCAT_PARTS} ) ENDFOREACH(CONCAT_NUM RANGE 0 ${SIP_CONCAT_PARTS} ) IF(NOT WIN32) SET(TOUCH_COMMAND touch) ELSE(NOT WIN32) SET(TOUCH_COMMAND echo) # instead of a touch command, give out the name and append to the files # this is basically what the touch command does. FOREACH(filename ${_sip_output_files}) FILE(APPEND filename "") ENDFOREACH(filename ${_sip_output_files}) ENDIF(NOT WIN32) ADD_CUSTOM_COMMAND( OUTPUT ${_sip_output_files} COMMAND ${CMAKE_COMMAND} -E echo ${message} COMMAND ${TOUCH_COMMAND} ${_sip_output_files} COMMAND ${SIP_EXECUTABLE} ${_sip_tags} ${_sip_x} ${SIP_EXTRA_OPTIONS} -j ${SIP_CONCAT_PARTS} -c ${CMAKE_CURRENT_SIP_OUTPUT_DIR} ${_sip_includes} ${_abs_module_sip} DEPENDS ${_abs_module_sip} ${SIP_EXTRA_FILES_DEPEND} ) # not sure if type MODULE could be uses anywhere, limit to cygwin for now IF (CYGWIN) ADD_LIBRARY(${_logical_name} MODULE ${_sip_output_files} ) ELSE (CYGWIN) ADD_LIBRARY(${_logical_name} SHARED ${_sip_output_files} ) ENDIF (CYGWIN) TARGET_LINK_LIBRARIES(${_logical_name} ${PYTHON_LIBRARY}) TARGET_LINK_LIBRARIES(${_logical_name} ${EXTRA_LINK_LIBRARIES}) SET_TARGET_PROPERTIES(${_logical_name} PROPERTIES PREFIX "" OUTPUT_NAME ${_child_module_name}) INSTALL(TARGETS ${_logical_name} DESTINATION "${PYTHON_SITE_PACKAGES_INSTALL_DIR}/${_parent_module_path}") ENDMACRO(ADD_SIP_PYTHON_MODULE) ./qwbfsmanager-1.2.1-src/fresh/Python/cmake/modules/FindSIP.cmake0000644000175000017520000000372111546156115024104 0ustar pasnoxpasnox# Find SIP # ~~~~~~~~ # # SIP website: http://www.riverbankcomputing.co.uk/sip/index.php # # Find the installed version of SIP. FindSIP should be called after Python # has been found. # # This file defines the following variables: # # SIP_VERSION - The version of SIP found expressed as a 6 digit hex number # suitable for comparision as a string. # # SIP_VERSION_STR - The version of SIP found as a human readable string. # # SIP_EXECUTABLE - Path and filename of the SIP command line executable. # # SIP_INCLUDE_DIR - Directory holding the SIP C++ header file. # # SIP_DEFAULT_SIP_DIR - Default directory where .sip files should be installed # into. # Copyright (c) 2007, Simon Edwards # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. IF(SIP_VERSION) # Already in cache, be silent SET(SIP_FOUND TRUE) ELSE(SIP_VERSION) FIND_FILE(_find_sip_py FindSIP.py PATHS ${CMAKE_MODULE_PATH}) EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} ${_find_sip_py} OUTPUT_VARIABLE sip_config) IF(sip_config) STRING(REGEX REPLACE "^sip_version:([^\n]+).*$" "\\1" SIP_VERSION ${sip_config}) STRING(REGEX REPLACE ".*\nsip_version_str:([^\n]+).*$" "\\1" SIP_VERSION_STR ${sip_config}) STRING(REGEX REPLACE ".*\nsip_bin:([^\n]+).*$" "\\1" SIP_EXECUTABLE ${sip_config}) IF(NOT SIP_DEFAULT_SIP_DIR) STRING(REGEX REPLACE ".*\ndefault_sip_dir:([^\n]+).*$" "\\1" SIP_DEFAULT_SIP_DIR ${sip_config}) ENDIF(NOT SIP_DEFAULT_SIP_DIR) STRING(REGEX REPLACE ".*\nsip_inc_dir:([^\n]+).*$" "\\1" SIP_INCLUDE_DIR ${sip_config}) SET(SIP_FOUND TRUE) ENDIF(sip_config) IF(SIP_FOUND) IF(NOT SIP_FIND_QUIETLY) MESSAGE(STATUS "Found SIP version: ${SIP_VERSION_STR}") ENDIF(NOT SIP_FIND_QUIETLY) ELSE(SIP_FOUND) IF(SIP_FIND_REQUIRED) MESSAGE(FATAL_ERROR "Could not find SIP") ENDIF(SIP_FIND_REQUIRED) ENDIF(SIP_FOUND) ENDIF(SIP_VERSION) ./qwbfsmanager-1.2.1-src/fresh/Python/Core/0000755000175000017520000000000011546156115020003 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/fresh/Python/Core/pTranslationManager.sip0000644000175000017520000000702511546156115024475 0ustar pasnoxpasnox /*! \file pTranslationManager.h \brief Application translations maanager. \author Filipe Azevedo aka Nox P\@sNox */ // for qHash( const QLocale& locale ) /*!< A QList of QTranslator */ typedef QList QTranslatorList; /*! \ingroup Core \class pTranslationManager \brief Application translations maanager. With this class you can easily set the patterns of your translations and possible paths to locate them. The manager can then reload the translations and list availables locales availables for your translations. Changing your application language was never so easy ! */ class pTranslationManager : QObject { %TypeHeaderCode #include <../src/core/pTranslationManager.h> %End public: /*! Returns the global instance of the pTranslationManager. */ static pTranslationManager* instance(); /*! Construct a pTranslationManager having parent \a parent. */ pTranslationManager( QObject* parent = 0 ); /*! Return the translations patterns defined. \sa forbiddenTranslationsMasks(). */ QStringList translationsMasks() const; /*! Return the forbidden translations patterns defined. \sa translationsMasks(). */ QStringList forbiddenTranslationsMasks() const; /*! Return the current locale of your application (that mean the current language too). */ QLocale currentLocale() const; /*! Return the system locale. */ QLocale systemLocale() const; /*! Return all the found locales (languages) available for your application. */ QStringList availableLocales() const; /*! Return all the found QLocale (languages) available for your application. */ QList availableQLocales() const; /*! Return the paths to look for translations files. */ QStringList translationsPaths() const; /*! Return the paths to look for system translations files. */ QStringList systemTranslationsPaths() const; /*! Return true if pTranslationManager should handle C locale as UnitedStates locale, else false. */ bool isFakeCLocaleEnabled() const; public slots: /*! Looks for translations files to (re)load. */ void reloadTranslations(); /*! Set the translations patterns to \a masks. \note The masks can be filters (ie: toto*.qm). */ void setTranslationsMasks( const QStringList& masks ); /*! Add the translation pattern \a mask. */ void addTranslationsMask( const QString& mask ); /*! Remove the pattern \a mask from the patterns list. */ void removeTranslationsMask( const QString& mask ); /*! Set the forbidden translations patterns to \a masks. \note The masks can be filters (ie: toto*.qm). */ void setForbiddenTranslationsMasks( const QStringList& masks ); /*! Add the forbidden translation pattern \a mask. */ void addForbiddenTranslationsMask( const QString& mask ); /*! Remove the forbidden pattern \a mask from the forbidden patterns list. */ void removeForbiddenTranslationsMask( const QString& mask ); /*! Set the current QLocale (language) of the application to \a locale. */ void setCurrentLocale( const QLocale& locale ); /*! Set the paths to be check when looking for translations to \a paths. */ void setTranslationsPaths( const QStringList& paths ); /*! Set the system paths to be check when looking for translations to \a paths. */ void setSystemTranslationsPaths( const QStringList& paths ); /*! Set true if C locale should be handled as UnitedStates locale, else false. */ void setFakeCLocaleEnabled( bool enabled ); protected: bool addTranslator( const QString& filePath, const QLocale& locale ); void clearTranslators(); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Core/pNetworkAccessManager.sip0000644000175000017520000000607211546156115024753 0ustar pasnoxpasnoxclass pNetworkAccessManager : QNetworkAccessManager { %TypeHeaderCode #include <../src/core/pNetworkAccessManager.h> %End public: /*! Returns the global instance of the pNetworkAccessManager. */ static pNetworkAccessManager* instance(); /*! Construct a pNetworkAccessManager instance and set the parent to \a parent. */ pNetworkAccessManager( QObject* parent = 0 ); /*! Destroy the pNetworkAccessManager and free all its resources. */ virtual ~pNetworkAccessManager(); /*! Set the directory where to cache the QNetworkReply to \a cacheDir. */ void setCacheDirectory( const QString& cacheDir ); /*! Returns the directory where are cached the QNetworkReply. \sa QNetworkDiskCache. */ QString cacheDirectory() const; /*! Set the maximum cache size of the cache directory to \a size bytes. \sa QNetworkDiskCache. */ void setMaximumCacheSize( qint64 size ); /*! Returns the maximum size of the cache directory in bytes. \sa QNetworkDiskCache. */ qint64 maximumCacheSize() const; /*! Set the maximum try an url will be sent to \a max. */ void setMaxRetryPerUrl( int max ); /*! Returns the maximum number of time an url is allowed to be sent. If a request is sent and max retry has been reach, then the request will not be sent and an error will be triggered. */ int maxRetryPerUrl() const; /*! Returns the current cache size in bytes. \sa QNetworkDiskCache. */ qint64 cacheSize() const; /*! Clear the cache, all cache files are deleted from the disk. \sa QNetworkDiskCache. */ void clearCache(); /*! Remove the cache file for \a url and return true on success, else false. \sa QNetworkDiskCache. */ bool removeCache( const QUrl& url ) const; /*! Return a QIODevice for the cached data \a url if exists, else 0. \sa QNetworkDiskCache. */ QIODevice* cacheData( const QUrl& url ) const; /*! Return true if cache data exists for \a url, else false. \sa QNetworkDiskCache. */ bool hasCacheData( const QUrl& url ) const; /*! Return the meta data associated with \a url. \sa QNetworkDiskCache. */ QNetworkCacheMetaData cacheMetaData( const QUrl& url ) const; /*! Return the meta data associated with \a fileName. \sa QNetworkDiskCache. */ QNetworkCacheMetaData cacheFileMetaData( const QString& fileName ) const; /*! Return a QPixmap from the cache content of \a url if it exists, else an invalid QPixmap. \note This member is only defined when the macro QT_GUI_LIB is defined. */ QPixmap cachedPixmap( const QUrl& url ) const; protected: /*! Reimplemented. */ virtual QNetworkReply* createRequest( Operation op, const QNetworkRequest& req, QIODevice* outgoingData = 0 ); protected slots: void _q_finished( QNetworkReply* reply ); signals: /*! This signal is emitted when a request at \a url is successfuly cached. */ void cached( const QUrl& url ); /*! This signal is emitted when a request at \a url fails. The error associated is set in \a message. */ void error( const QUrl& url, const QString& message ); /*! This signal is emmited when the cache has been cleared. */ void cacheCleared(); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Core/pSettings.sip0000644000175000017520000001061711546156115022505 0ustar pasnoxpasnox/*! \file pSettings.h \brief An extended QSettings class that handle ini files with different contexts. \author Filipe Azevedo aka Nox P\@sNox */ /*! \ingroup Core \class pSettings \brief An extended QSettings class that handle ini files with different contexts. This class is used for storing/retreiving data using ini files with different contexts (Auto, Normal, Portable). */ class pSettings : QSettings { %TypeHeaderCode #include <../src/core/pSettings.h> %End public: /*! Thie enumeration represent the possible choices for the location of your pSettings object. */ enum Type { Invalid = -1, /*!< An invalid path. */ Auto, /*!< The pSettings decide which enum to use. pSettings::Portable if the binary path is writable, else pSettings::Normal. */ Normal, /*!< The init file will be created in the user home. */ Portable /*!< The ini file will be created in the binary path. */ }; /*! \class pSettings::Properties \brief This class defined the properties to apply to a pSettings class. \author Filipe Azevedo aka Nox P\@sNox */ struct Properties { /*! \brief A Properties object initialized with default properties \param other The properties to copy. */ Properties( const pSettings::Properties& other = pSettings::defaultProperties() ); /*! \brief A Properties object initialized with custom parameters. \param _name The name of the application. \param _version The application version. \param _type The pSettings::Type type. */ Properties( const QString& _name, const QString& _version, pSettings::Type _type ); /*! \brief Return the path where is located the ini file when using the pSettings::Normal type. \return A QString containing the absolute path of the ini file. */ QString storageLocation() const; /*! \brief The absolute file path of the ini file. \return The absolute file path of the ini file. */ QString settingsFilePath() const; /*! \brief Return an absolute file path of a ini file having application name \a name and application version \a version according to the current properties. \param name The application name. \param version The application version. \return The file path of the ini file. */ QString settingsFilePath( const QString& name, const QString& version ) const; QString name; QString version; pSettings::Type type; }; /*! \brief Create a pSettings object having parent \a parent and properties \a properties. \param parent The parent object. \param properties The properties to apply to this pSettings. */ pSettings( QObject* parent = 0, const pSettings::Properties& properties = pSettings::defaultProperties() ); /*! \brief Create a pSettings object having parent \a parent and properties \a properties with overrided \a name and \a version. \param parent The parent object. \param name The application name. \param version The application version. \param properties The properties to apply to this pSettings. */ pSettings( QObject* parent, const QString& name, const QString& version, const pSettings::Properties& properties = pSettings::defaultProperties() ); /*! \brief Return the properties applied to this pSettings. \return A Properties object. */ pSettings::Properties properties() const; /*! \brief Restore the state of a QMainWindow. \param window The main window to restore state \sa QMainWindow::restoreState() \note This member is only defined if QT_GUI_LIB is defined. */ virtual void restoreState( QMainWindow* window ); /*! \brief Save the state of a QMainWindow. \param window The window to restore state. \sa QMainWindow::restoreState() \note This member is only defined if QT_GUI_LIB is defined. */ virtual void saveState( QMainWindow* window ); /*! \brief Set the default settings. You can reimplement this member to set default ini settings, by example after the first application run. */ virtual void setDefaultSettings(); /*! \brief Set the default properties to be used. Typically this should be defined in the main, just after the initialization of the QCoreApplication / QApplication. \param properties The properties to be used as default. */ static void setDefaultProperties( const pSettings::Properties& properties ); /*! \brief Return the default Properties used when creating pSettings. \return A Properties object. */ static pSettings::Properties defaultProperties(); protected: }; ./qwbfsmanager-1.2.1-src/fresh/Python/Core/pVersion.sip0000644000175000017520000000466511546156115022340 0ustar pasnoxpasnox/*! \file pVersion.h \brief This class is an helper for comparing string based application versions. \author Filipe Azevedo aka Nox P\@sNox */ /*! \ingroup Core \class pVersion \brief This class is an helper for comparing string based application versions. The pVersion class help you to compare string based versions number like "1.5.0b", "1.6.0rc" etc. All kind of operators or available like <, >, !=, == etc. \code const pVersion v1( "1.5.0" ); const pVersion v2( "1.5.1" ); if ( v1 < v2 ) { qWarning( "v1 is smaller version than v2 !" ); } else { qWarning( "v1 is bigger than v2 !" ); } \endcode */ class pVersion { %TypeHeaderCode #include <../src/core/pVersion.h> %End public: /*! \brief Create a pVersion initialized with the string version \a version. \param version A QString representing the version number. */ pVersion( const QString& version ); /*! \brief Return the string based version number. \return A QString containing the string version number. */ QString toString() const; /*! \brief Check if this version is equal to \a other. \param other The version to compare to. \return Return true if this version is equal to \a other else false. */ bool operator==( const pVersion& other ) const; /*! \brief Check if this version is different from \a other. \param other The version to compare to. \return Return true if this version is different from \a other else false. */ bool operator!=( const pVersion& other ) const; /*! \brief Check if this version is smaller than \a other. \param other The version to compare to. \return Return true if this version is smaller than \a other else false. */ bool operator<( const pVersion& other ) const; /*! \brief Check if this version is bigger than \a other. \param other The version to compare to. \return Return true if this version is bigger than \a other else false. */ bool operator>( const pVersion& other ) const; /*! \brief Check if this version is smaller or equal to \a other. \param other The version to compare to. \return Return true if this version is smaller or equal to \a other else false. */ bool operator<=( const pVersion& other ) const; /*! \brief Check if this version is bigger or equal to \a other. \param other The version to compare to. \return Return true if this version is bigger or equal to \a other else false. */ bool operator>=( const pVersion& other ) const; }; ./qwbfsmanager-1.2.1-src/fresh/Python/CMakeLists.txt0000644000175000017520000000451311546156115021656 0ustar pasnoxpasnox# Build Python bindings cmake_minimum_required(VERSION 2.8) PROJECT(pyfresh) set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules ${CMAKE_MODULE_PATH}) find_package(PythonInterp REQUIRED) find_package(PythonLibrary REQUIRED) include(PythonMacros) find_package (Qt4 REQUIRED) set(QT_USE_QTXML true) set(QT_USE_QTNETWORK true) include (${QT_USE_FILE}) find_package(PyQt4 REQUIRED) if (NOT EXISTS ${PYQT4_SIP_DIR}/QtCore/QtCoremod.sip) message(FATAL_ERROR "PyQt4 development files not found. Install it from python-qt4-dev package, or find other way, and share it to the fresh authors for update this message") endif (NOT EXISTS ${PYQT4_SIP_DIR}/QtCore/QtCoremod.sip) find_package(SIP REQUIRED) include(SIPMacros) # Set a a PYTHON_3 flag. if(${PYTHON_SHORT_VERSION} MATCHES "^3") set(PYTHON_3 TRUE) else(${PYTHON_SHORT_VERSION} MATCHES "^3") set(PYTHON_3 FALSE) endif(${PYTHON_SHORT_VERSION} MATCHES "^3") include_directories( ${PYTHON_INCLUDE_PATH} ${SIP_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/../src ${CMAKE_SOURCE_DIR}/../build ) set(SIP_INCLUDES ${PYQT4_SIP_DIR} sip) if(WIN32) set(SIP_TAGS ALL WS_WIN ${PYQT4_VERSION_TAG}) else(WIN32) set(SIP_TAGS ALL WS_X11 ${PYQT4_VERSION_TAG}) endif(WIN32) set(SIP_DISABLE_FEATURES VendorID PyQt_NoPrintRangeBug) # Use an extra option when compiling on Python 3. if(PYTHON_3) set(SIP_EXTRA_OPTIONS -g -x Py_v3) else(PYTHON_3) set(SIP_EXTRA_OPTIONS -g) endif(PYTHON_3) file(GLOB_RECURSE ALL_SIP_FILES *.sip) set(SIP_EXTRA_FILES_DEPEND ${ALL_SIP_FILES}) # SIP macros installs module to the PYTHON_SITE_PACKAGES_INSTALL_DIR # We need redefine this variable to install fresh to PyQt4 module execute_process(COMMAND ${PYTHON_EXECUTABLE} "-c" "import os; import PyQt4; print os.path.dirname(PyQt4.__file__)" OUTPUT_VARIABLE PYTHON_SITE_PACKAGES_INSTALL_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) add_sip_python_module(fresh fresh.sip fresh ${QT_CORE_LIBRARY} ${QT_GUI_LIBRARY} ${QT_XML_LIBRARY} ${QT_NETWORK_LIBRARY}) message(STATUS "PYTHON_SITE_PACKAGES_INSTALL_DIR:${PYTHON_SITE_PACKAGES_INSTALL_DIR}") # Install the .sip files for anyone that wants to build bindings on top of fresh file(GLOB_RECURSE SIP_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.sip) install(FILES ${SIP_FILES} DESTINATION ${SIP_DEFAULT_SIP_DIR}/PyQt4/fresh) ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/0000755000175000017520000000000011546156115017637 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pToolButton.sip0000644000175000017520000000223511546156115022647 0ustar pasnoxpasnox/*! \file pToolButton.h \date 2008-01-14T00:27:54 \author Filipe AZEVEDO aka Nox P\@sNox \brief A corner button used by the pTabbedWorkspaceCorner class */ class pToolButton : QToolButton { %TypeHeaderCode #include %End public: pToolButton( QWidget* parent, QBoxLayout::Direction direction = QBoxLayout::LeftToRight ); virtual QSize minimumSizeHint() const; virtual QSize sizeHint() const; QBoxLayout::Direction direction() const; QVariant userData() const; public slots: void setDirection( QBoxLayout::Direction direction ); void setUserData( const QVariant& data ); protected: enum CursorArea { caNone = 0, caArrow, caButton, caArrowClicked, caButtonClicked }; virtual void paintEvent( QPaintEvent* event ); virtual void mousePressEvent( QMouseEvent* event ); virtual void mouseMoveEvent( QMouseEvent* event ); virtual void mouseReleaseEvent( QMouseEvent* event ); void paint( QStyleOptionToolButton* option ); QSize internalSize( Qt::Orientation orientation ) const; pToolButton::CursorArea cursorArea( const QPoint& pos = QPoint() ) const; QMenu* hasMenu() const; bool menuButtonDown() const; }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pDockToolBarManager.sip0000644000175000017520000000407011546156115024173 0ustar pasnoxpasnox/*! \file pDockToolBarManager.h \date 2008-01-14T00:27:41 \author Filipe AZEVEDO aka Nox P\@sNox \brief This class manage a set of pDockToolBar ( left, top, right and bottom ) of a QMainWindow */ /*! \brief This class manage a set of pDockToolBar ( left, top, right and bottom ) of a QMainWindow \details It provide usefull member ( bar() ) to directly create a unique pDockToolBar for the corresponding area. \details It allow to save/restore state of pDockToolBar using a pSettings class. */ class pDockToolBarManager : QObject { %TypeHeaderCode #include %End public: enum Mode { Invalid = -1, Classic, Modern }; pDockToolBarManager( pMainWindow* window ); virtual bool eventFilter( QObject* object, QEvent* event ); bool isRestoring() const; void setRestoring( bool restoring ); pDockToolBarManager::Mode mode() const; void setMode( pDockToolBarManager::Mode mode ); pMainWindow* mainWindow() const; Qt::ToolBarArea toolBarArea( pDockToolBar* toolBar ) const; QList dockToolBars() const; pDockToolBar* dockToolBar( Qt::ToolBarArea area ) const; pDockToolBar* dockToolBar( Qt::DockWidgetArea area ) const; pDockToolBar* dockToolBar( QDockWidget* dockWidget ) const; QToolBar* modernToolBar() const; static Qt::ToolBarArea dockWidgetAreaToToolBarArea( Qt::DockWidgetArea area ); static Qt::DockWidgetArea toolBarAreaToDockWidgetArea( Qt::ToolBarArea area ); static QBoxLayout::Direction toolBarAreaToBoxLayoutDirection( Qt::ToolBarArea area ); public slots: virtual void restoreState( pDockToolBar* dockToolBar = 0 ); virtual void saveState( pDockToolBar* dockToolBar = 0 ); protected slots: void dockWidget_allowedAreasChanged( Qt::DockWidgetAreas allowedAreas ); void dockWidget_dockLocationChanged( Qt::DockWidgetArea area ); void dockWidget_featuresChanged( QDockWidget::DockWidgetFeatures features ); void dockWidget_topLevelChanged( bool topLevel ); void dockWidget_visibilityChanged( bool visible ); signals: void modeChanged( pDockToolBarManager::Mode mode ); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pLineEdit.sip0000644000175000017520000000160111546156115022227 0ustar pasnoxpasnox class pLineEdit : QLineEdit { %TypeHeaderCode #include %End public: pLineEdit( QWidget* parent = 0 ); pLineEdit( const QString& contents, QWidget* parent = 0 ); QMenu* menu() const; void setMenu( QMenu* menu ); bool isSearchButtonVisible() const; QString promptText() const; public slots: void setSearchButtonVisible( bool visible ); void setPromptText( const QString& prompt ); void clickSearchButton(); void clickClearButton(); protected: virtual void paintEvent( QPaintEvent* event ); virtual void resizeEvent( QResizeEvent* event ); void init(); void setClearButtonVisible( bool visible ); protected slots: void _q_textChanged( const QString& text ); void timer_timeout(); signals: void searchButtonClicked(); void searchButtonActionTriggered( QAction* action ); void clearButtonClicked(); void searchTextChanged( const QString& text ); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pGuiUtils.sip0000644000175000017520000000215111546156115022300 0ustar pasnoxpasnoxnamespace pGuiUtils { %TypeHeaderCode #include %End /*! Create a QPixmap of \a size filled with \a color. */ QPixmap filledPixmap( const QColor& color, const QSize& size ); /*! Create a cache key using \a key and \a size used for caching scaled pixmap in QPixmapCache. */ QString cacheKey( const QString& key, const QSize& size = QSize() ); /*! Create a QPixmap from \a filePath. If \a size is not null, the pixmap is scaled to \a size. The resulted pixmap is cached in QPixmapCache so a call with same parameters will be very quick. \note The scale is done using Qt::KeepAspectRatio and Qt::SmoothTransformation. */ QPixmap scaledPixmap( const QString& filePath, const QSize& size = QSize() ); /*! Create a QPixmap from \a pixmap. If \a size is not null, the pixmap is scaled to \a size. The resulted pixmap is cached in QPixmapCache using \a key so a call with same parameters will be very quick. \note The scale is done using Qt::KeepAspectRatio and Qt::SmoothTransformation. */ QPixmap scaledPixmap( const QPixmap& pixmap, const QString& key, const QSize& size = QSize() ); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pDockWidget.sip0000644000175000017520000000075411546156115022566 0ustar pasnoxpasnox/*! \brief A QDockWidget that keep it's size \details when hidden then shown when docked */ class pDockWidget : QDockWidget { %TypeHeaderCode #include %End public: pDockWidget( const QString& title, QWidget* parent = 0, Qt::WindowFlags flags = 0 ); pDockWidget( QWidget* parent = 0, Qt::WindowFlags flags = 0 ); pDockWidgetTitleBar* titleBar() const; QAction* showAction(); protected: void init(); virtual void paintEvent( QPaintEvent* event ); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pDockToolBar.sip0000644000175000017520000000626211546156115022705 0ustar pasnoxpasnox/*! \file pDockToolBar.h \date 2008-01-14T00:27:40 \author Filipe AZEVEDO aka Nox P\@sNox \brief A toolbar that can manage dock visibility by adding buttons in it */ /*! \brief A toolbar that can manage dock visibility by adding buttons in it \details The dock toolbars are managed by a pDockToolBarManager for top, right, bottom, left */ class pDockToolBar : QToolBar { %TypeHeaderCode #include %End public: /*! This enumeration represents the possible order to use. */ enum DockWidgetsOrder { HashedOrder = 0, /*!< The list is ordered by the hash order. */ InsertedOrder /*!< The list is ordered by the insertion order. */ }; /*! Create a pDockToolBar having \a manager as manager and orientation \a orientation. */ pDockToolBar( pDockToolBarManager* manager, Qt::Orientation orientation = Qt::Horizontal ); /*! Reimplemented. */ virtual bool event( QEvent* event ); /*! Reimplemented. */ virtual bool eventFilter( QObject* object, QEvent* event ); /*! Add \a dockWidget being handled by this toolbar. If \a title and \a icon are non null, they will overwrite the dock widget window title and window icon. */ void addDockWidget( QDockWidget* dockWidget, const QString& title = QString(), const QIcon& icon = QIcon() ); /*! Remove \a dockWidget from the list of handled dock widgets by this toolbar. The dock is not deleted nor hided. */ void removeDockWidget( QDockWidget* dockWidget ); /*! Return true if this toolbar buttons are exclusive, else false. */ bool isExclusive() const; /*! Set the toolbar button to be exclusive according to \a exclusive. */ void setExclusive( bool exclusive ); /*! Change the \a dockWidget visibility according to \a visible. */ void setDockVisible( QDockWidget* dockWidget, bool visible ); /*! Return the list of managed dock widgets in this toolbar sorted by \a order method. */ QList dockWidgets( pDockToolBar::DockWidgetsOrder order = pDockToolBar::HashedOrder ) const; /*! Return the dock widget associated with \a button. */ QDockWidget* dockWidget( pToolButton* button ) const; /*! Return true if \a dockWidget is managed by this toolbar. */ bool hasDockWidget( QDockWidget* dockWidget ) const; /*! Return all the buttons associated with dock widgets managed by this toolbar. */ QList buttons() const; /*! Return the button associated with \a dockWidget. */ pToolButton* button( QDockWidget* dockWidget ) const; /*! Return the number of managed dock widgets. */ int count() const; /*! Return the checkable action for changing the exclusive mode of this toolbar. */ QAction* toggleExclusiveAction() const; private: /*! Update the button properties according to the current manager mode. */ void setButtonMode( pToolButton* button ); /*! Add a button for \a dockWidget and return it. */ pToolButton* addButton( QDockWidget* dockWidget ); private slots: void internal_checkToolBarVisibility(); void internal_checkButtonExclusivity( QDockWidget* dockWidget = 0 ); void internal_updateButtonsState(); void internal_orientationChanged( Qt::Orientation orientation ); void internal_buttonClicked( bool checked ); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pActionsNodeModel.sip0000644000175000017520000001107011546156115023722 0ustar pasnoxpasnox/*! \file pActionsNodeModel.h \brief This class allow to define a hierarchy of pActionsNode that can be exposed in a pActionsNodeMenuBar. \author Filipe Azevedo aka Nox P\@sNox */ /*! \ingroup Gui \class pActionsNodeModel \brief This class allow to define a hierarchy of pActionsNode that can be exposed in a pActionsNodeMenuBar. That allow to have a menu bar that can be easily queried / handled by third party components like plugins. */ class pActionsNodeModel : QAbstractItemModel { %TypeHeaderCode #include %End public: /*! This enum defines teh differents columns of the model. */ enum Column { Action = 0, /*!< The action column. */ Shortcut, /*!< The shortcut column. */ DefaultShortcut /*!< The default shortcut. */ }; /*! Create a new pActionsNodeModel having parent \a parent. */ pActionsNodeModel( QObject* parent = 0 ); /*! Reimplemented from QAbstractItemModel::columnCount(). */ virtual int columnCount( const QModelIndex& parent = QModelIndex() ) const; /*! Reimplemented from QAbstractItemModel::data(). */ virtual QVariant data( const QModelIndex& index, int role = Qt::DisplayRole ) const; /*! Reimplemented from QAbstractItemModel::index(). */ virtual QModelIndex index( int row, int column, const QModelIndex& parent = QModelIndex() ) const; /*! Reimplemented from QAbstractItemModel::parent(). */ virtual QModelIndex parent( const QModelIndex& index ) const; /*! Reimplemented from QAbstractItemModel::rowCount(). */ virtual int rowCount( const QModelIndex& parent = QModelIndex() ) const; /*! Reimplemented from QAbstractItemModel::hasChildren(). */ virtual bool hasChildren( const QModelIndex& parent = QModelIndex() ) const; /*! Reimplemented from QAbstractItemModel::headerData(). */ virtual QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const; /*! Reimplemented from QAbstractItemModel::setData(). */ virtual bool setData( const QModelIndex& index, const QVariant& value, int role = Qt::EditRole ); /*! return the root node of the model. */ pActionsNode rootNode() const; /*! Return the pActionsNode for the given \a index. */ pActionsNode indexToNode( const QModelIndex& index ) const; /*! Return the pActionsNode for the given \a path. */ pActionsNode pathToNode( const QString& path ) const; /*! Return the pActionsNode for the given \a action. */ pActionsNode actionToNode( QAction* action ) const; /*! Return the QModelIndex for the given \a node. */ QModelIndex nodeToIndex( const pActionsNode& node ) const; /*! Return the QModelIndex for the given \a path. */ QModelIndex pathToIndex( const QString& path ) const; /*! Return the QModelIndex for the given \a action. */ QModelIndex actionToIndex( QAction* action ) const; /*! Clear all nodes of the root node. The node's QAction are deleted. */ void clear(); /*! Add the \a action to the model at the given \a path. Return true on success else false. */ bool addAction( const QString& path, QAction* action ); /*! Add a new action in the model at the given \a path having text \a text and icon \a icon. Return the created QAction on success else . */ QAction* addAction( const QString& path, const QString& text, const QIcon& icon = QIcon() ); /*! Add a path node at the given \a path. */ pActionsNode addPath( const QString& path ); /*! Remove the action at the given \a path and delete the path hierarchy if it contains no more actions and the \a removeEmptyPath parameter is true. Return true on success else false. */ bool removeAction( const QString& path, bool removeEmptyPath = false ); /*! Remove the action \a action and delete the hierarchy if no more actions exists and the \a removeEmptyPath parameter is true. Return true on success else false. */ bool removeAction( QAction* action, bool removeEmptyPath = false ); /*! Remove the path \a path and delete the hierarchy if it contains no more actions and if the \a removeEmptyPath is true. Return true on success else false. */ bool removePath( const QString& path, bool removeEmptyPath = false ); signals: /*! This signal is emited when the node \a node is inserted. */ void nodeInserted( const pActionsNode& node ); /*! This signal is emited when the node \a node is modified. */ void nodeChanged( const pActionsNode& node ); /*! This signal is emited when the node \a node is removed. */ void nodeRemoved( const pActionsNode& node ); /*! This signal is emited when the model is cleared. */ void nodesCleared(); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pActionsNodeMenuBar.sip0000644000175000017520000000412511546156115024216 0ustar pasnoxpasnox/*! \file pActionsNodeMenuBar.h \brief The pActionsNodeMenuBar class is a QMenuBar where the hierarchy and actions are exposed by a pActionsNodeModel. \author Filipe Azevedo aka Nox P\@sNox */ /*! \ingroup Gui \class pActionsNodeMenuBar \brief The pActionsNodeMenuBar class is a QMenuBar where the hierarchy and actions are exposed by a pActionsNodeModel. */ class pActionsNodeMenuBar : QMenuBar { %TypeHeaderCode #include %End public: /*! Create a pActionsNodeMenuBar having parent \a parent. */ pActionsNodeMenuBar( QWidget* parent = 0 ); /*! Destroys the menu bar. */ ~pActionsNodeMenuBar(); /*! Set the model associated with this menu bar. */ void setModel( pActionsNodeModel* model ); /*! Return the model associated with this menu bar. */ pActionsNodeModel* model() const; /*! Add the action \a action at the given \a path. Return true on success else false. */ bool addAction( const QString& path, QAction* action ); /*! Add a new action at the given \a path having text \a text and icon \a icon. Return the new action on success else 0. */ QAction* addAction( const QString& path, const QString& text, const QIcon& icon = QIcon() ); /*! Add a new menu at the given path \a path and return the pActionsNode associated with this menu. */ pActionsNode addMenu( const QString& path ); /*! Remove the action at the given path \a path. */ bool removeAction( const QString& path ); /*! Remove the given action \a action. */ bool removeAction( QAction* action ); /*! Remove the menu at the given path \a path. Any child menus and actions are destroyed. */ bool removeMenu( const QString& path ); /*! Return the menu at the given path \a path. */ QMenu* menu( const QString& path ) const; /*! Return the path of the menu \a menu. */ QString menuPath( QMenu* menu ) const; /*! Return the action at the given path \a path. */ QAction* action( const QString& path ) const; /*! Return the action path at the given path \a path. */ QString actionPath( QAction* action ) const; }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pDockWidgetTitleBar.sip0000644000175000017520000000224711546156115024214 0ustar pasnoxpasnox/*! \brief A custom title bar for pDockWidget \details that herits QToolBar so custom actions can be added in the title bar. */ class pDockWidgetTitleBar : QToolBar { %TypeHeaderCode #include %End public: /*! Create a */ pDockWidgetTitleBar( QDockWidget* parent = 0 ); /*! Reimplemented. */ virtual QSize minimumSizeHint() const; /*! Reimplemented. */ virtual QSize sizeHint() const; /*! Insert \a action at \a index position. If \a index is -1 then it's append at end. */ QWidget* addAction( QAction* action, int index = -1 ); /*! Insert a separator at \a index. If \a index is -1 then it's append at end. */ void addSeparator( int index = -1 ); protected: /*! Reimplemented */ virtual bool event( QEvent* event ); /*! Reimplemented. */ virtual bool eventFilter( QObject* object, QEvent* event ); /*! Reimplemented */ virtual void paintEvent( QPaintEvent* event ); QIcon icon() const; QSize windowIconSize() const; void updateStyleChange(); protected slots: void aOrientation_triggered(); void aFloat_triggered(); void dockWidget_featuresChanged( QDockWidget::DockWidgetFeatures features );}; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pFileListEditor.sip0000644000175000017520000000135711546156115023424 0ustar pasnoxpasnox/*! \file pFileListEditor.h \date 2008-01-14T00:27:44 \author Filipe AZEVEDO aka Nox P\@sNox \brief a pStringListEditor that handle files name. */ /*! \brief a pStringListEditor that handle files name. \details */ class pFileListEditor : pStringListEditor { %TypeHeaderCode #include %End public: pFileListEditor( QWidget* parent = 0 ); pFileListEditor( const QString& title, const QString& path, const QString& filter, QWidget* parent = 0 ); QString path() const; void setPath( const QString& path ); QString filter() const; void setFilter( const QString& filter ); protected: virtual void init(); protected slots: virtual void onAddItem(); virtual void onEditItem(); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pColorButton.sip0000644000175000017520000000064311546156115023011 0ustar pasnoxpasnoxclass pColorButton : QToolButton { %TypeHeaderCode #include %End public: pColorButton( QWidget* parent = 0 ); pColorButton( const QColor& color, QWidget* parent = 0 ); const QColor& color() const; protected: void init( const QColor& color ); public slots: void setColor( const QColor& color ); protected slots: void _q_clicked(); signals: void colorChanged( const QColor& color ); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pRecursiveSortFilterProxyModel.sip0000644000175000017520000000046511546156115026551 0ustar pasnoxpasnoxclass pRecursiveSortFilterProxyModel : QSortFilterProxyModel { %TypeHeaderCode #include %End public: pRecursiveSortFilterProxyModel( QObject* parent = 0 ); protected: virtual bool filterAcceptsRow( int source_row, const QModelIndex& source_parent ) const; }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pEnvironmentVariablesModel.sip0000644000175000017520000000475311546156115025663 0ustar pasnoxpasnoxclass pEnvironmentVariablesModel : QAbstractItemModel { %TypeHeaderCode #include %End public: struct Variable { Variable( const QString& _name = QString::null, const QString& _value = QString::null, bool _enabled = false ); QString name; QString value; bool enabled; }; typedef QHash Variables; typedef QList VariableList; pEnvironmentVariablesModel( QObject* parent = 0 ); virtual int columnCount( const QModelIndex& parent = QModelIndex() ) const; virtual QVariant data( const QModelIndex& index, int role = Qt::DisplayRole ) const; virtual QModelIndex index( int row, int column, const QModelIndex& parent = QModelIndex() ) const; virtual QModelIndex parent( const QModelIndex& index ) const; virtual int rowCount( const QModelIndex& parent = QModelIndex() ) const; virtual QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const; virtual bool hasChildren( const QModelIndex& parent = QModelIndex() ) const; virtual Qt::ItemFlags flags( const QModelIndex& index ) const; virtual bool setData( const QModelIndex& index, const QVariant& value, int role = Qt::EditRole ); QModelIndex index( const QString& name, int column = 0 ) const; pEnvironmentVariablesModel::Variable variable( const QModelIndex& index ) const; pEnvironmentVariablesModel::Variables variables() const; pEnvironmentVariablesModel::Variables defaultVariables() const; QStringList variables( bool keepDisabled ) const; pEnvironmentVariablesModel::Variable variable( const QString& name ) const; bool contains( const QString& name ) const; bool isEmpty() const; static pEnvironmentVariablesModel::Variables stringListToVariables( const QStringList& variables ); static QStringList variablesToStringList( const pEnvironmentVariablesModel::Variables& variables, bool keepDisabled ); public slots: void setVariables( const pEnvironmentVariablesModel::Variables& variables, bool setDefault ); void setDefaultVariables( const pEnvironmentVariablesModel::Variables& variables ); void setVariables( const QStringList& variables, bool setDefault ); void setVariable( const QString& name, const pEnvironmentVariablesModel::Variable& variable ); void removeVariable( const QString& name ); void clearVariables(); void resetVariablesToDefault(); void resetVariablesToSystem( bool setDefault ); signals: void defaultVariablesChanged(); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pMainWindow.sip0000644000175000017520000000521711546156115022615 0ustar pasnoxpasnox/*! \file pMainWindow.h \date 2008-01-14T00:27:46 \author Filipe AZEVEDO aka Nox P\@sNox \brief An extended QMainWindow */ /*! \brief An extended QMainWindow. \details This extended mainwindow contains some usefull features : \details a pMenuBar as menu bar, a pDockToolBarManager for tabbed management of docked widgets \details and a pSettings object for storing/reading your settings. \details There is also a confortable dockToolBar() member. */ class pMainWindow : QMainWindow { %TypeHeaderCode #include %End public: /*! Create an instance of the main window having \a parent as parent and window flags \a windowFlags. */ pMainWindow( QWidget* parent = 0, Qt::WindowFlags windowFlags = 0 ); /*! Reimplemented. */ virtual ~pMainWindow(); /*! Reimplemented. */ virtual QMenu* createPopupMenu(); /*! Return the settings object used by this main window. */ virtual pSettings* settings() const; /*! Return the menu bar object. */ virtual pActionsNodeMenuBar* menuBar() const; /*! Add \a dockWidget in \a area having \a orientation. */ void addDockManagerWidget( Qt::ToolBarArea area, QDockWidget* dockWidget, Qt::Orientation orientation = Qt::Horizontal ); /*! Seth the dock toolbar in \a area to be exclusive according to \a exclusive. */ void setDockManagerAreaExclusive( Qt::ToolBarArea area, bool exclusive ); /*! Set the dock manager presentation mode to \a mode. */ void setDockManagerMode( pDockToolBarManager::Mode mode ); /*! Append a queued \a message in the message toolbar with an auto close defined to \a milliSeconds. \sa pQueuedMessageToolBar::appendMessage( const QString&, int ). */ void appendMessage( const QString& message, int milliSeconds = -1 ); /*! Append a queued \a message in the message toolbar. \sa pQueuedMessageToolBar::appendMessage( const pQueuedMessage& ). */ void appendMessage( const pQueuedMessage& message ); protected: /*! Reimplemented. */ virtual void showEvent( QShowEvent* event ); /*! Reimplemented. */ virtual void closeEvent( QCloseEvent* event ); /*! Return the queued message toolbar object. */ virtual pQueuedMessageToolBar* queuedMessageToolBar() const; /*! Return the dock widget toolbar manager object. */ virtual pDockToolBarManager* dockToolBarManager() const; /*! Return the dock toolbar manager for \a area. */ pDockToolBar* dockToolBar( Qt::ToolBarArea area ) const; public slots: /*! Save the state of the main window. \sa QMainWindow::saveState(). */ virtual void saveState(); /*! Restore the state of the main window. \sa QMainWindow::restoreState(). */ virtual void restoreState(); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pStylesActionGroup.sip0000644000175000017520000000151411546156115024173 0ustar pasnoxpasnoxclass pStylesActionGroup : QActionGroup { %TypeHeaderCode #include %End public: pStylesActionGroup( QObject* parent = 0 ); pStylesActionGroup( const QString& textFormat, QObject* parent = 0 ); bool isCheckable() const; QString currentStyle() const; QAction* systemAction() const; QAction* applicationAction() const; QString systemStyle() const; QString applicationStyle() const; void installInMenuBar( pActionsNodeMenuBar* menuBar, const QString& path ); public slots: void setCheckable( bool checkable ); void setCurrentStyle( const QString& style ); protected: void init( const QString& textFormat ); void updateActions(); protected slots: void actionToggled( bool checked ); void actionTriggered( QAction* action ); signals: void styleSelected( const QString& style ); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pActionsNodeShortcutEditor.sip0000644000175000017520000000103011546156115025637 0ustar pasnoxpasnoxclass pActionsNodeShortcutEditor : QDialog { %TypeHeaderCode #include %End public: pActionsNodeShortcutEditor( pActionsNodeModel* model, QWidget* parent = 0 ); ~pActionsNodeShortcutEditor(); private slots: void on_leFilter_textChanged( const QString& text ); void tvActions_selectionModel_selectionChanged(); void on_kseShortcut_textChanged( const QString& text ); void on_tbSet_clicked(); void on_tbClear_clicked(); void on_dbbButtons_clicked( QAbstractButton* button ); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pUpdateCheckerDialog.sip0000644000175000017520000000240211546156115024361 0ustar pasnoxpasnoxclass pUpdateItem { %TypeHeaderCode #include %End public: enum Type { Updated, Id, Link, Title, Author, Content }; pUpdateItem( pUpdateChecker* updateChecker = 0, const QDomElement& element = QDomElement() ); bool operator<( const pUpdateItem& other ) const; bool operator>( const pUpdateItem& other ) const; bool operator<( const pVersion& other ) const; bool operator>( const pVersion& other ) const; QDateTime updated() const; QString id() const; QUrl link() const; QString title() const; QString author() const; QString content() const; QString toolTip() const; bool isFeatured() const; QString displayText() const; QString versionString() const; pVersion version() const; bool isValid() const; protected: }; class pUpdateCheckerDialog : QDialog { %TypeHeaderCode #include %End public: pUpdateCheckerDialog( pUpdateChecker* updateChecker, QWidget* parent = 0 ); virtual bool event( QEvent* event ); protected: void localeChanged(); protected slots: void accessManager_finished( QNetworkReply* reply ); void on_lwVersions_itemSelectionChanged(); void on_lwVersions_itemDoubleClicked( QListWidgetItem* item ); virtual void accept(); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pEnvironmentVariablesEditor.sip0000644000175000017520000000253011546156115026040 0ustar pasnoxpasnoxclass pEnvironmentVariablesEditor : QWidget { %TypeHeaderCode #include %End public: pEnvironmentVariablesEditor( QWidget* parent = 0 ); virtual ~pEnvironmentVariablesEditor(); pEnvironmentVariablesModel::Variables variables() const; pEnvironmentVariablesModel::Variables defaultVariables() const; QStringList variables( bool keepDisabled ) const; pEnvironmentVariablesModel::Variable variable( const QString& name ) const; bool contains( const QString& name ) const; bool isEmpty() const; public slots: void setVariables( const pEnvironmentVariablesModel::Variables& variables, bool setDefault ); void setDefaultVariables( const pEnvironmentVariablesModel::Variables& variables ); void setVariables( const QStringList& variables, bool setDefault ); void setVariable( const QString& name, const pEnvironmentVariablesModel::Variable& variable ); void removeVariable( const QString& name ); void clearVariables(); void resetVariablesToDefault(); void resetVariablesToSystem( bool setDefault ); protected slots: void model_view_changed(); void on_aAdd_triggered(); void on_aEdit_triggered(); void on_aRemove_triggered(); void on_aClear_triggered(); void on_aResetDefault_triggered(); void on_aResetSystem_triggered(); void on_tvVariables_activated( const QModelIndex& index ); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pTreeComboBox.sip0000644000175000017520000000303111546156115023061 0ustar pasnoxpasnoxclass pTreeComboBox : QWidget { %TypeHeaderCode #include %End public: pTreeComboBox( QWidget* parent = 0 ); ~pTreeComboBox(); virtual bool eventFilter( QObject* object, QEvent* event ); virtual QSize sizeHint() const; QSize iconSize() const; void setIconSize( const QSize& size ); virtual void hidePopup(); virtual void showPopup(); QTreeView* view() const; virtual void setView( QTreeView* view ); QAbstractItemModel* model() const; virtual void setModel( QAbstractItemModel* model ); int modelColumn() const; void setColumnModel( int column ); QModelIndex rootIndex() const; void setRootIndex( const QModelIndex& index ); QModelIndex currentIndex() const; void setCurrentIndex( const QModelIndex& index ); void expandAll(); protected slots: void internal_activated( const QModelIndex& index ); void internal_clicked( const QModelIndex& index ); void internal_currentChanged( const QModelIndex& current, const QModelIndex& previous ); protected: virtual void initStyleOption( QStyleOptionComboBox* option ) const; virtual bool event( QEvent* event ); virtual void paintEvent( QPaintEvent* event ); virtual void hideEvent( QHideEvent* event ); virtual void mousePressEvent( QMouseEvent* event ); void calculPopupGeometry(); QModelIndex modelColumnIndex( const QModelIndex& index ) const; signals: void activated( const QModelIndex& index ); void clicked( const QModelIndex& index ); void currentIndexChanged( const QModelIndex& index ); void highlighted( const QModelIndex& index ); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pActionsNode.sip0000644000175000017520000000613711546156115022751 0ustar pasnoxpasnox/*! \file pActionsNode.h \brief It's the class used for storing indexes data in pActionsNodeModel. \author Filipe Azevedo aka Nox P\@sNox */ /*! \ingroup Gui \class pActionsNode \brief It's the class used for storing indexes data in pActionsNodeModel. It handle basic data of a node like the icon, text and shortcut. The internal data is explicitly shared so it's easy to use the api. */ class pActionsNode { %TypeHeaderCode #include %End public: /*! This enum defines the differents types of node. */ enum Type { Invalid, /*!< An invalid type */ Path, /*!< This type represents a path node (ie: a possible hierarchy where to integrate the actions nodes) */ Action /*!< This type represente an action node (ie: it represente a QAction) */ }; enum Role { ShortcutRole = Qt::UserRole, DefaultShortcutRole }; /*! Create an invalid node. */ pActionsNode(); /*! Create a node that is a copy of \a other node. */ pActionsNode( const pActionsNode& other ); /*! Create a node having type \a type and path \a path */ pActionsNode( pActionsNode::Type type, const QString& path ); /*! Return true if this node is equal to \a other else false. */ bool operator==( const pActionsNode& other ) const; /*! Return true if this node is different than \a other else false. */ bool operator!=( const pActionsNode& other ) const; /*! Return true if this node is valid else false. A valid node has a type different than pActionsNode::Invalid. */ bool isValid() const; /*! Return true if this node has children else false. */ bool hasChildren() const; /*! Return the pActionsNode::Type of this node. */ pActionsNode::Type type() const; /*! Return the path of this node. */ QString path() const; /*! Return the QAction associated with this node. */ QAction* action() const; /*! Return the icon of this node. */ QIcon icon() const; /*! Return the text of this node. */ QString text() const; /*! Return the parent node of this node. */ pActionsNode parent() const; /*! Return a list of all children of this node. */ QList children() const; /*! Set the node icon, updating the QAction's icon if needed. */ void setIcon( const QIcon& icon ); /*! Set the node text, updating the QAction's text if needed. */ void setText( const QString& text ); /*! Return the shortcut of this node. */ QKeySequence shortcut() const; /*! Set the node shortcut, updating the QAction's shortcut if needed. */ bool setShortcut( const QKeySequence& shortcut ); /*! Return the node default shortcut. */ QKeySequence defaultShortcut() const; /*! Set the node default shortcut, updating the node shortcut if possible. */ void setDefaultShortcut( const QKeySequence& shortcut ); /*! A convenience function to create a path node. */ static pActionsNode pathNode( const QString& path, const QString& text = QString::null, const QIcon& icon = QIcon() ); /*! A convenience function to create an action node. */ static pActionsNode actionNode( const QString& path, QAction* action ); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pKeySequenceEdit.sip0000644000175000017520000000132211546156115023561 0ustar pasnoxpasnox/*! \file pKeySequenceEdit.h \date 2008-01-14T00:27:45 \author Filipe AZEVEDO aka Nox P\@sNox \brief A special QLineEdit that allow to defin QShortcut */ /*! \brief A special QLineEdit that allow to defin QShortcut \details When the user press some combinaison keys, the result is \details wrotten in the QLineEdit */ class pKeySequenceEdit : pLineEdit { %TypeHeaderCode #include %End public: pKeySequenceEdit( QWidget* parent = 0 ); pKeySequenceEdit( const QString& contents, QWidget* parent = 0 ); protected: virtual void keyPressEvent( QKeyEvent* event ); virtual void keyReleaseEvent( QKeyEvent* event ); QString keySequence( QKeyEvent* event ) const; }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pConsoleCommand.sip0000644000175000017520000000202211546156115023431 0ustar pasnoxpasnoxclass pConsoleCommand { %TypeHeaderCode #include %End public: enum ExitCode { NotFound = -2, NoExitCode = -1, Success = 0, Error = 1 }; typedef QList List; pConsoleCommand( const QStringList& commands = QStringList() ); virtual ~pConsoleCommand(); pConsoleCommand( const pConsoleCommand& other ); bool operator==( const pConsoleCommand& other ) const; bool operator!=( const pConsoleCommand& other ) const; QStringList commands() const; QStringList autoCompleteList( const QString& command ) const; virtual QString description( const QString& command ) const; void setDescription( const QString& command, const QString& description ); virtual bool isComplete( const QString& command ) const; virtual QString usage( const QString& command ) const; virtual QString interpret( const QString& command, int* exitCode ) const; static QStringList quotedStringList( const QStringList& list ); static QStringList parseCommand( const QString& command ); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pConsole.sip0000644000175000017520000000345611546156115022146 0ustar pasnoxpasnoxclass pConsole : QPlainTextEdit { %TypeHeaderCode #include %End public: enum ColorType { Command, Error, Output, Completion }; pConsole( QWidget* parent = 0 ); pConsole( const QString& promptText, QWidget* parent = 0 ); virtual ~pConsole(); QString prompt() const; void setPrompt( const QString& prompt ); bool isPromptVisible() const; void setPromptVisible( bool visible ); QStringList history() const; void setHistory( const QStringList& history ); QColor color( pConsole::ColorType type ) const; void setColor( pConsole::ColorType type, const QColor& color ); void executeCommand( const QString& command, bool writeCommand = true, bool showPrompt = true ); bool saveScript( const QString& fileName ); bool loadScript( const QString& fileName ); void clear(); void reset( const QString& promptText = QString::null ); pConsoleCommand::List availableCommands() const; void setAvailableCommands( const pConsoleCommand::List& commands ); void addAvailableCommand( pConsoleCommand* command ); void removeAvailableCommand( pConsoleCommand* command ); protected: virtual void keyPressEvent( QKeyEvent* event ); virtual void mousePressEvent( QMouseEvent* event ); virtual void mouseReleaseEvent( QMouseEvent* event ); virtual void contextMenuEvent( QContextMenuEvent* event ); virtual bool isCommandComplete( const QString& command ); virtual QString interpretCommand( const QString& command, int* exitCode ); virtual QStringList autoCompleteCommand( const QString& command ); bool replaceCommand( const QString& command ); QString currentCommand() const; void focusCommand(); void useColor( pConsole::ColorType type ); void displayPrompt(); bool showHistoryItem( int index ); signals: void commandExecuted( const QString& command, int exitCode ); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pStylesToolButton.sip0000644000175000017520000000121611546156115024051 0ustar pasnoxpasnoxclass pStylesToolButton : QToolButton { %TypeHeaderCode #include %End public: pStylesToolButton( QWidget* parent = 0 ); pStylesToolButton( const QString& textFormat, QWidget* parent = 0 ); bool isCheckableActions() const; QString currentStyle() const; QAction* systemAction() const; QAction* applicationAction() const; QString systemStyle() const; QString applicationStyle() const; public slots: void setCheckableActions( bool checkable ); void setCurrentStyle( const QString& style ); protected: void init( const QString& textFormat ); signals: void styleSelected( const QString& style ); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pEnvironmentVariablesManager.sip0000644000175000017520000000201011546156115026155 0ustar pasnoxpasnoxclass pEnvironmentVariablesManager { %TypeHeaderCode #include %End public: pEnvironmentVariablesManager(); bool load(); bool save(); pEnvironmentVariablesModel::Variables variables() const; void setVariables( const pEnvironmentVariablesModel::Variables& variables ); bool mergeNewVariables( pEnvironmentVariablesModel::Variables& variables ) const; //FIXME pEnvironmentVariablesModel::Variables mergeNewVariables( const pEnvironmentVariablesModel::Variables& variables ) const; bool removeUnmodifiedVariables( pEnvironmentVariablesModel::Variables& variables ) const; //FIXME pEnvironmentVariablesModel::Variables removeUnmodifiedVariables( const pEnvironmentVariablesModel::Variables& variables ) const; QStringList variables( bool keepDisabled ) const; protected: virtual bool writeVariables( const pEnvironmentVariablesModel::Variables& variables ) const; virtual bool readVariables( pEnvironmentVariablesModel::Variables& variables ) const; }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pTranslationDialog.sip0000644000175000017520000000133011546156115024147 0ustar pasnoxpasnoxnamespace Ui { class pTranslationDialog; }; class pTranslationDialog : QDialog { %TypeHeaderCode #include %End public: pTranslationDialog( pTranslationManager* translationManager, QWidget* parent = 0 ); virtual ~pTranslationDialog(); virtual bool event( QEvent* event ); QString selectedLocale() const; static QString getLocale( pTranslationManager* translationManager, QWidget* parent = 0 ); protected: QTreeWidgetItem* newItem( const QLocale& locale ); QTreeWidgetItem* rootItem( const QLocale& locale ); protected slots: void localeChanged(); void on_tbLocate_clicked(); void on_tbReload_clicked(); void on_twLocales_itemSelectionChanged(); void reject(); void accept(); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pEnvironmentVariableEditor.sip0000644000175000017520000000061311546156115025655 0ustar pasnoxpasnoxclass pEnvironmentVariableEditor : QDialog { %TypeHeaderCode #include %End public: pEnvironmentVariableEditor( QWidget* parent = 0, const pEnvironmentVariablesModel::Variable& variable = pEnvironmentVariablesModel::Variable() ); virtual ~pEnvironmentVariableEditor(); pEnvironmentVariablesModel::Variable variable() const; }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pUpdateChecker.sip0000644000175000017520000000160611546156115023246 0ustar pasnoxpasnoxclass pUpdateChecker : QObject { %TypeHeaderCode #include %End public: pUpdateChecker( QWidget* parent = 0 ); QAction* menuAction() const; QDateTime lastUpdated() const; QDateTime lastChecked() const; QUrl downloadsFeedUrl() const; QString version() const; QString versionString() const; QString versionDiscoveryPattern() const; public slots: void setLastUpdated( const QDateTime& dateTime ); void setLastChecked( const QDateTime& dateTime ); void setDownloadsFeedUrl( const QUrl& url ); void setVersion( const QString& version ); void setVersionString( const QString& versionString ); void setVersionDiscoveryPattern( const QString& pattern ); void silentCheck(); protected: virtual bool eventFilter( QObject* object, QEvent* event ); virtual void localeChanged(); protected slots: void checkForUpdate_triggered( bool show = true ); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pStringListEditor.sip0000644000175000017520000000252411546156115024010 0ustar pasnoxpasnox/*! \file pStringListEditor.h \date 2008-01-14T00:27:49 \author Filipe AZEVEDO aka Nox P\@sNox \brief A widget that handle QStringList edition. */ /*! \brief A widget that handle QStringList edition. \details */ class pStringListEditor : QGroupBox { %TypeHeaderCode #include %End public: pStringListEditor( QWidget* paret = 0 ); pStringListEditor( const QString& title, QWidget* paret = 0 ); void setValues( const QStringList& values ); QStringList values() const; virtual void insert( int index, const QString& value ); void append( const QString& value ); void selectRow( int row ); int selectedRow() const; void selectValue( const QString& value ); QString selectedValue() const; void setValue( const QString& value ); void editValue( const QString& value ); void editValue( int row ); protected: virtual void init(); QModelIndex selectedIndex() const; QModelIndex indexForValue( const QString& value ) const; QModelIndex indexForRow( int row ) const; int rowForValue( const QString& value ) const; protected slots: virtual void onSelectionChanged(); virtual void onAddItem(); virtual void onEditItem(); virtual void onRemoveItem(); virtual void onClearItems(); virtual void onMoveUpItem(); virtual void onMoveDownItem(); signals: void modified(); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pFileDialog.sip0000644000175000017520000000431611546156115022537 0ustar pasnoxpasnoxtypedef QMap pFileDialogResult; class pFileDialog : QFileDialog { %TypeHeaderCode #include %End public: enum Property { TextCodec = 0, OpenReadOnly, Directory, FileName, FileNames, SelectedFilter }; pFileDialog( QWidget* parent = 0, const QString& caption = QString::null, const QString& directory = QString::null, const QString& filter = QString::null, bool textCodecEnabled = true, bool openReadOnlyEnabled = false ); QString textCodec() const; void setTextCodec( const QString& codec ); bool textCodecEnabled() const; void setTextCodecEnabled( bool enabled ); bool openReadOnly() const; void setOpenReadOnly( bool readOnly ); bool openReadOnlyEnabled() const; void setOpenReadOnlyEnabled( bool enabled ); static pFileDialogResult getExistingDirectory( QWidget* parent = 0, const QString& caption = QString::null, const QString& dir = QString::null, bool enabledTextCodec = true, bool enabledOpenReadOnly = true, QFileDialog::Options options = QFileDialog::ShowDirsOnly ); static pFileDialogResult getOpenFileName( QWidget* parent = 0, const QString& caption = QString::null, const QString& dir = QString::null, const QString& filter = QString::null, bool enabledTextCodec = true, bool enabledOpenReadOnly = true, const QString& selectedFilter = QString::null, QFileDialog::Options options = 0 ); static pFileDialogResult getOpenFileNames( QWidget* parent = 0, const QString& caption = QString::null, const QString& dir = QString::null, const QString& filter = QString::null, bool enabledTextCodec = true, bool enabledOpenReadOnly = true, const QString& selectedFilter = QString::null, QFileDialog::Options options = 0 ); static pFileDialogResult getSaveFileName( QWidget* parent = 0, const QString& caption = QString::null, const QString& dir = QString::null, const QString& filter = QString::null, bool enabledTextCodec = true, const QString& selectedFilter = QString::null, QFileDialog::Options options = 0 ); protected: static void setDialog( pFileDialog* dlg, const QString& caption, const QString& dir, const QString& filter, bool enabledTextCodec, bool enabledOpenReadOnly, const QString& selectedFilter, QFileDialog::FileMode mode, QFileDialog::Options options ); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pPaypalButton.sip0000644000175000017520000000452311546156115023162 0ustar pasnoxpasnoxclass pPaypalButton : QPushButton { %TypeHeaderCode #include %End public: /*! Create an instance of button having \a parent as parent. */ pPaypalButton( QWidget* parent = 0 ); /*! Reimplemented. */ virtual QSize minimumSizeHint() const; /*! Reimplemented. */ virtual QSize sizeHint() const; /*! Reimplemented. */ virtual bool event( QEvent* event ); /*! Return the http post action url. */ QString actionPost() const; /*! Return your donation item business id. */ QString businessId() const; /*! Return your donation item name. */ QString itemName() const; /*! Return your donation item id. */ QString itemId() const; /*! Return the currency used by your donation item. */ QString currencyCode() const; /*! Return true if the http request should be automatically opened using QDesktopServices::openUrl() else false. */ bool autoOpenUrl() const; /*! Return the final generated url that will be opened when clicking the button. */ QUrl url() const; /*! Return the pixmap url for \a locale. */ static QUrl pixmapUrl( const QString& locale ); public slots: /*! Set the http post action to \a url. */ void setActionPost( const QString& value ); /*! Set the donation item business id to \a value. */ void setBusinessId( const QString& value ); /*! Set the donation item name to \a value. */ void setItemName( const QString& value ); /*! Set the donation item id to \a value. */ void setItemId( const QString& value ); /*! Set the donation item currency code to \a value.. */ void setCurrencyCode( const QString& value ); /*! Set if the button should automatically open url() when the user click on the button. Give true to automatically open it, else give false and handle the clicked( const QUrl& ) signal. */ void setAutoOpenUrl( bool open ); protected: QPixmap pixmap( const QUrl& url ) const; /*! Reimplemented. */ virtual void paintEvent( QPaintEvent* event ); void localeChanged(); protected slots: void updatePixmap(); void _q_clicked(); void networkAccessManager_cached( const QUrl& url ); void networkAccessManager_error( const QUrl& url, const QString& message ); void networkAccessManager_cacheCleared(); signals: /*! This signal is emit when the user click the button and that autoOpenUrl() is false. */ void clicked( const QUrl& url ); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pPathListEditor.sip0000644000175000017520000000112011546156115023425 0ustar pasnoxpasnox/*! \file pFileListEditor.h \date 2008-01-14T00:27:48 \author Filipe AZEVEDO aka Nox P\@sNox \brief a pStringListEditor that handle files name. */ /*! \brief a pPathListEditor that handle paths name. \details */ class pPathListEditor : pFileListEditor { %TypeHeaderCode #include %End public: pPathListEditor( QWidget* parent = 0 ); pPathListEditor( const QString& title, const QString& path, QWidget* parent = 0 ); protected: virtual void init(); protected slots: virtual void onAddItem(); virtual void onEditItem(); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pQueuedMessageToolBar.sip0000644000175000017520000000115211546156115024553 0ustar pasnoxpasnoxclass pQueuedMessageToolBar : QToolBar { %TypeHeaderCode #include %End public: pQueuedMessageToolBar( QWidget* parent = 0 ); virtual ~pQueuedMessageToolBar(); pQueuedMessageWidget* queuedMessageWidget() const; pQueuedMessage appendMessage( const QString& message, int milliSeconds = -1 ); protected: void paintEvent( QPaintEvent* event ); public slots: void appendMessage( const pQueuedMessage& message ); void removeMessage( const pQueuedMessage& message ); protected slots: void messageShown( const pQueuedMessage& message ); void messageFinished(); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pIconManager.sip0000644000175000017520000000360111546156115022717 0ustar pasnoxpasnox/*! \file pIconManager.h \brief A cache class for icons and pixmaps \author Filipe AZEVEDO aka Nox P\@sNox */ /*! \ingroup Gui \namespace pIconManager \brief A cache class for icons and pixmaps. This class allow to cache and share QPixmap & QIcon. Icons and pixmaps can easily be loaded on demand by using coresponding members. */ namespace pIconManager { %TypeHeaderCode #include %End /*! \brief Return the filepath of the file \a fileName in \a prefix folder (check is done recursively). \param fileName The file name of the file to find (ie: toto.txt). \param prefix The start path to look from, the scan is done recursively until a match or nothing found. \return A QString containing the absolute file path of the file, the fileName/prefix pair is cached for fast lookup the next call. */ QString filePath( const QString& fileName, const QString& prefix = ":/" ); /*! \brief Return the filepath of the pixmap \a fileName in \a prefix folder (check is done recursively). \param fileName The file name of the pixmap to find (ie: toto.png). \param prefix The start path to look from, the scan is done recursively until a match or nothing found. \return A QString containing the absolute file path of the pixmap, the fileName/prefix pair is cached for fast lookup the next call. */ QPixmap pixmap( const QString& fileName, const QString& prefix = ":/" ); /*! \brief Return the filepath of the icon \a fileName in \a prefix folder (check is done recursively). \param fileName The file name of the icon to find (ie: toto.png). \param prefix The start path to look from, the scan is done recursively until a match or nothing found. \return A QString containing the absolute file path of the icon, the fileName/prefix pair is cached for fast lookup the next call. */ QIcon icon( const QString& fileName, const QString& prefix = ":/" ); }; ./qwbfsmanager-1.2.1-src/fresh/Python/Gui/pQueuedMessageWidget.sip0000644000175000017520000000603211546156115024436 0ustar pasnoxpasnox/*! \brief The is the \c message structure used by the pQueuedMessageWidget class. \details It allow to configure the message to show. \details Each variable is directly accessible and mostly optionnal except \c message. \details A default \c Ok button is added if \c buttons is empty. */ struct pQueuedMessage { %TypeHeaderCode #include %End pQueuedMessage(); bool operator==( const pQueuedMessage& other ) const; /*! \details The message to show */ QString message; /*! \details The millisecond time to wait before the message is auto closed. Use 0 for unilimited time */ int milliSeconds; /*! \details The pixmap to show before the message */ QPixmap pixmap; /*! \details The brush to use as background */ QBrush background; /*! \details The brush to use as foreground */ QBrush foreground; /*! \details A hash representing a StandardButton role, and it's optionnal text overridding the default StandardButton text */ QHash buttons; // StandardButton, Button Text ( null text for standard text ) /*! \details The object that is used to invoke \c Slot */ //QWeakPointer object; /*! \details If \c object is not null, it will invoke this \c slot, the slot must take 2 parameters : \details QDialogButtonBox::StandardButton : The StandardButton clicked \details pQueuedMessage : The message from where the button was clicked */ const char* slot; /*! \details A place to stock custom user data */ QVariant userData; }; /*! \brief A QMessageBox like Widget, that can show queued message. \details The messages are queued until they are closed by user or elapsed time is timeout */ class pQueuedMessageWidget : QWidget { %TypeHeaderCode #include %End public: pQueuedMessageWidget( QWidget* parent = 0 ); virtual QSize sizeHint() const; bool openExternalLinks() const; int defaultTimeout() const; QPixmap defaultPixmap() const; QBrush defaultBackground() const; QBrush defaultForeground() const; void currentMessageInformations( QPixmap* pixmap, QBrush* background, QBrush* foreground ) const; int pendingMessageCount() const; pQueuedMessage currentMessage() const; pQueuedMessage append( const QString& message, int milliSeconds = -1 ); public slots: void setOpenExternalLinks( bool open ); void setDefaultTimeout( int timeout ); void setDefaultPixmap( const QPixmap& pixmap ); void setDefaultBackground( const QBrush& brush ); void setDefaultForeground( const QBrush& brush ); void append( const pQueuedMessage& message ); void remove( const pQueuedMessage& message ); void clear(); protected: void paintEvent( QPaintEvent* event ); protected slots: void buttonClicked( QAbstractButton* button ); void showMessage(); void closeMessage(); void clearMessage(); signals: void shown( const pQueuedMessage& message ); void closed( const pQueuedMessage& message ); void cleared(); void finished(); void linkActivated( const QString& link ); void linkHovered( const QString& link ); }; ./qwbfsmanager-1.2.1-src/fresh/Python/fresh.sip0000644000175000017520000000272511546156115020745 0ustar pasnoxpasnox%Module PyQt4.fresh 0 %Import QtCore/QtCoremod.sip %Import QtGui/QtGuimod.sip %Import QtNetwork/QtNetworkmod.sip %Import QtXml/QtXmlmod.sip %Include Core/pNetworkAccessManager.sip %Include Core/pTranslationManager.sip %Include Core/pVersion.sip %Include Core/pSettings.sip %Include Gui/pActionsNodeMenuBar.sip %Include Gui/pActionsNodeModel.sip %Include Gui/pActionsNodeShortcutEditor.sip %Include Gui/pActionsNode.sip %Include Gui/pColorButton.sip %Include Gui/pConsoleCommand.sip %Include Gui/pConsole.sip %Include Gui/pDockToolBarManager.sip %Include Gui/pDockToolBar.sip %Include Gui/pDockWidget.sip %Include Gui/pDockWidgetTitleBar.sip %Include Gui/pGuiUtils.sip %Include Gui/pEnvironmentVariableEditor.sip %Include Gui/pEnvironmentVariablesEditor.sip %Include Gui/pEnvironmentVariablesManager.sip %Include Gui/pEnvironmentVariablesModel.sip %Include Gui/pFileDialog.sip %Include Gui/pFileListEditor.sip %Include Gui/pIconManager.sip %Include Gui/pKeySequenceEdit.sip %Include Gui/pLineEdit.sip %Include Gui/pMainWindow.sip %Include Gui/pPathListEditor.sip %Include Gui/pPaypalButton.sip %Include Gui/pQueuedMessageToolBar.sip %Include Gui/pQueuedMessageWidget.sip %Include Gui/pRecursiveSortFilterProxyModel.sip %Include Gui/pStringListEditor.sip %Include Gui/pStylesActionGroup.sip %Include Gui/pStylesToolButton.sip %Include Gui/pToolButton.sip %Include Gui/pTranslationDialog.sip %Include Gui/pTreeComboBox.sip %Include Gui/pUpdateCheckerDialog.sip %Include Gui/pUpdateChecker.sip ./qwbfsmanager-1.2.1-src/fresh/CMakeLists.txt0000644000175000017520000000567611546156115020410 0ustar pasnoxpasnoxcmake_minimum_required(VERSION 2.8) set (PROJECT fresh) project (${PROJECT}) option(shared "Build shared library" y) set(BUILD_SHARED_LIBS ${shared}) # Find Qt4 find_package (Qt4 REQUIRED) set(QT_USE_QTXML true) set(QT_USE_QTNETWORK true) include (${QT_USE_FILE}) # Set headers and sources list of the library file(GLOB_RECURSE FORMS src/*.ui) file(GLOB_RECURSE HEADERS ./src/*.h) file(GLOB_RECURSE CORE_HEADERS include/FreshCore/*.h ./src/core/*.h) file(GLOB_RECURSE GUI_HEADERS include/FreshGui/*.h ./src/gui/*.h) file(GLOB_RECURSE SOURCES src/*.cpp) file(GLOB_RECURSE TS_FILES translations/*.ts) file(GLOB PRF_FILES ./*.prf) # Process MOC, UI and TS files qt4_wrap_cpp (MOC_SOURCES ${HEADERS}) qt4_wrap_ui( UI_HEADERS ${FORMS} ) # qt4_add_translation(TRANSLATIONS ${TS_FILES}) it seems, we don't need generate translations for the lib qt4_add_resources(RESOURCES resources/fresh.qrc) # Build main library add_library (${PROJECT} ${UI_HEADERS} ${HEADERS} ${SOURCES} ${RESOURCES} ${MOC_SOURCES} ${TRANSLATIONS}) if(CMAKE_COMPILER_IS_GNUCC) set_target_properties(${PROJECT} PROPERTIES COMPILE_FLAGS -fPIC) endif(CMAKE_COMPILER_IS_GNUCC) include_directories ( "include" "src" "src/core" "src/gui" "src/gui/dockwidget" "src/gui/dockmanager" "src/gui/environmentvariablemanager" "src/gui/listeditor" "src/gui/models" "src/gui/stylemanager" "src/gui/queuedmessage" "src/gui/gc-updatechecker" "src/gui/consolemanager" "src/gui/actionmanager" ) include_directories( ${CMAKE_CURRENT_BINARY_DIR} ) # for .ui target_link_libraries (${PROJECT} ${QT_LIBRARIES}) # Install library and include files, only if it is shared if (shared) message("Building SHARED library. Use \n\tcmake -Dshared=0\n for build static.") #message("Library and headers will be installed to " ${CMAKE_INSTALL_PREFIX}) #message ("Use \n\tcmake -D CMAKE_INSTALL_PREFIX=/your/install/path\n for set another path") # Install main library install(TARGETS fresh LIBRARY DESTINATION ${QT_LIBRARY_DIR}) install(FILES ${CORE_HEADERS} DESTINATION ${QT_HEADERS_DIR}/FreshCore) install(FILES ${GUI_HEADERS} DESTINATION ${QT_HEADERS_DIR}/FreshGui) install(FILES ${PRF_FILES} DESTINATION ${QT_MKSPECS_DIR}/features) install(FILES ${TS_FILES} DESTINATION ${QT_TRANSLATIONS_DIR}) install(FILES ./FindFresh.cmake DESTINATION ${CMAKE_ROOT}/Modules/) else (shared) message("Building STATIC library. Use 'cmake -Dshared=1' for build shared.") endif (shared) if (shared) add_subdirectory(Python ${CMAKE_CURRENT_BINARY_DIR}/python) else (shared) message("Python bindings not supported for static library") endif(shared) ./qwbfsmanager-1.2.1-src/fresh/fresh_static.prf0000644000175000017520000000121011546156115021013 0ustar pasnoxpasnox# fresh project features file FRESH_INSTALL_HEADERS = $$[QT_INSTALL_HEADERS] FRESH_INSTALL_LIBS = $$[QT_INSTALL_LIBS] FRESH_INSTALL_TRANSLATIONS = $$[QT_INSTALL_TRANSLATIONS] FRESH_INSTALL_FEATURES = $$[QMAKE_MKSPECS]/features QMAKE_RPATHDIR *= $$FRESH_INSTALL_LIBS macx:LIBS *= -F$$FRESH_INSTALL_LIBS LIBS *= -L$$FRESH_INSTALL_LIBS macx { LIBS *= "-framework CoreFoundation" } DEPENDPATH *= $$FRESH_INSTALL_HEADERS/FreshCore \ $$FRESH_INSTALL_HEADERS/FreshGui INCLUDEPATH *= $$FRESH_INSTALL_HEADERS/FreshCore \ $$FRESH_INSTALL_HEADERS/FreshGui QT *= xml network DEFINES *= FRESH_CORE_BUILD !macx:qtAddLibrary( fresh ) macx:LIBS *= -lfresh./qwbfsmanager-1.2.1-src/fresh/src/0000755000175000017520000000000011546156115016421 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/fresh/src/gui/0000755000175000017520000000000011546156115017205 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/fresh/src/gui/consolemanager/0000755000175000017520000000000011546156115022202 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/fresh/src/gui/consolemanager/pConsoleCommand.cpp0000644000175000017520000001057411546156115025776 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pConsoleCommand.cpp ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pConsoleCommand.h" #include "pConsole.h" pConsoleCommand::pConsoleCommand( const QStringList& commands ) { mCommands = commands; } pConsoleCommand::~pConsoleCommand() { } pConsoleCommand::pConsoleCommand( const pConsoleCommand& other ) { operator=( other ); } pConsoleCommand& pConsoleCommand::operator=( const pConsoleCommand& other ) { if( *this != other ) { mCommands = other.mCommands; } return *this; } bool pConsoleCommand::operator==( const pConsoleCommand& other ) const { return mCommands == other.mCommands; } bool pConsoleCommand::operator!=( const pConsoleCommand& other ) const { return !operator==( other ); } QStringList pConsoleCommand::commands() const { return mCommands; } QStringList pConsoleCommand::autoCompleteList( const QString& command ) const { QStringList result; foreach ( const QString& cmd, mCommands ) { if ( cmd.startsWith( command ) ) { result << cmd; } } return result; } QString pConsoleCommand::description( const QString& command ) const { const QString cmd = parseCommand( command ).value( 0 ); return mDescriptions.value( cmd, pConsole::tr( "No description available" ) ); } void pConsoleCommand::setDescription( const QString& command, const QString& description ) { const QString cmd = parseCommand( command ).value( 0 ); if ( !cmd.isEmpty() ) { mDescriptions[ cmd ] = description; } } bool pConsoleCommand::isComplete( const QString& command ) const { return mCommands.contains( parseCommand( command ).value( 0 ) ); } QString pConsoleCommand::usage( const QString& command ) const { return description( command ); } QString pConsoleCommand::interpret( const QString& command, int* exitCode ) const { const QStringList parts = parseCommand( command ); if ( parts.value( 1 ).compare( "-h", Qt::CaseInsensitive ) == 0 || parts.value( 1 ).compare( "--help", Qt::CaseInsensitive ) == 0 ) { if ( exitCode ) { *exitCode = pConsoleCommand::Success; } return usage( command ); } if ( exitCode ) { *exitCode = pConsoleCommand::NotFound; } return QString::null; } QStringList pConsoleCommand::quotedStringList( const QStringList& list ) { QStringList entries; foreach ( QString string, list ) { if ( string.contains( " " ) && !string.startsWith( '"' ) && !string.endsWith( '"' ) ) { string.replace( "\"", "\\\"" ).prepend( '"' ).append( '"' ); } entries << string; } return entries; } QStringList pConsoleCommand::parseCommand( const QString& command ) { QString cmd = command; QStringList result; bool isExtended = false; int pos = 0; while ( ( pos = cmd.indexOf( QRegExp( "\"|\\s" ), pos ) ) != -1 ) { QChar pc = pos > 0 ? cmd[ pos -1 ] : QChar(); QChar c = cmd[ pos ]; if ( c == '"' ) { pos++; if ( pc != '\\' ) { if ( isExtended ) { isExtended = false; result << cmd.left( pos -1 ).replace( "\\\"", "\"" ); cmd.remove( 0, pos ); pos = 0; } else { isExtended = true; cmd.remove( 0, 1 ); pos = 0; } } } else { pos++; if ( !isExtended ) { result << cmd.left( pos -1 ); cmd.remove( 0, pos ); pos = 0; } } cmd = cmd.trimmed(); } if ( !cmd.isEmpty() ) { result << cmd; } return result; } ./qwbfsmanager-1.2.1-src/fresh/src/gui/consolemanager/pConsole.h0000644000175000017520000001506111546156115024140 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pConsole.h ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PCONSOLE_H #define PCONSOLE_H /*! \file pConsole.h \brief The pConsole widget is a terminal emulator providing a gui for pConsoleCommand. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include "pConsoleCommand.h" #include #include /*! \ingroup FreshGui \class pConsole \brief The pConsole widget is a terminal emulator providing a gui for pConsoleCommand. */ class FRESH_EXPORT pConsole : public QPlainTextEdit { Q_OBJECT friend class pInternalCommands; public: /*! Thie enumeration represent the different possible output color in the pConsole widget. */ enum ColorType { Command, /*!< \a Command color is the color used when the user is typing a command. */ Error, /*!< \a Error color is the color used when the execution of a command failed and it produce an output. */ Output, /*!< \a Output color is the color used when the execution of a command success and it produce an output. */ Completion /*!< \a Completion color is the color used when the user press the key to auto complete a command and that produce an output. */ }; /*! Create a pConsole widget having \a parent as parent. */ pConsole( QWidget* parent = 0 ); /*! Create a pConsole widget having \a parent parent and prompt text \a promptText. */ pConsole( const QString& promptText, QWidget* parent = 0 ); /*! Destroys the console. */ virtual ~pConsole(); /*! Return the current prompt text of the console. */ QString prompt() const; /*! Set the current prompt text to \a prompt. */ void setPrompt( const QString& prompt ); /*! Tells if the prompt text is visible or not. */ bool isPromptVisible() const; /*! set the prompt text visibility to \a visible. */ void setPromptVisible( bool visible ); /*! Return the console commands history. ie: all the commands the user typed. */ QStringList history() const; /*! Set the console commands history. */ void setHistory( const QStringList& history ); /*! Return the color associated with ColorType \a type. */ QColor color( pConsole::ColorType type ) const; /*! Set the color of the \a type to \a color. */ void setColor( pConsole::ColorType type, const QColor& color ); /*! Execute the command \a command. The command is added to the console according to \a writeCommand and the prompt text is shown according to \a showPrompt. */ void executeCommand( const QString& command, bool writeCommand = true, bool showPrompt = true ); /*! Save the successfuly executed commands to the file named \a fileName. */ bool saveScript( const QString& fileName ); /*! Load the file \a fileName containing a list of commands to execute. */ bool loadScript( const QString& fileName ); /*! Clear the console output. */ void clear(); /*! reset the internal state of the console and set the prompt text to \a promptText. If \a promptText is empty, the current one will be used again. */ void reset( const QString& promptText = QString::null ); /*! Return the list of available pConsoleCommand. */ pConsoleCommand::List availableCommands() const; /*! Set the list of available pConsoleCommand. \note pConsole take ownership of the commands and will delete them in its destructor. */ void setAvailableCommands( const pConsoleCommand::List& commands ); /*! Add \a command command to the availalbe commands. \note pConsole take ownership of the command and will delete it in its destructor. */ void addAvailableCommand( pConsoleCommand* command ); /*! Remove \a command from the available commands. */ void removeAvailableCommand( pConsoleCommand* command ); protected: QString mPrompt; QPoint mPromptPosition; QStringList mHistory; int mHistoryIndex; QHash mColors; QStringList mRecordedScript; pConsoleCommand::List mAvailableCommands; pConsoleCommand* mInternalCommands; QSet mNoPromptCommands; /*! Reimplemented. */ virtual void keyPressEvent( QKeyEvent* event ); /*! Reimplemented. */ virtual void mousePressEvent( QMouseEvent* event ); /*! Reimplemented. */ virtual void mouseReleaseEvent( QMouseEvent* event ); /*! Reimplemented. */ virtual void contextMenuEvent( QContextMenuEvent* event ); /*! Tell if the command \a command is complete or not. */ virtual bool isCommandComplete( const QString& command ); /*! Interpret the \a command and return the exit code in the passed \a exitCode. */ virtual QString interpretCommand( const QString& command, int* exitCode ); /*! Return a list of possible commands to complete matching \a command. */ virtual QStringList autoCompleteCommand( const QString& command ); /*! Replace the partially written command by \a command. */ bool replaceCommand( const QString& command ); /*! Return the current typed (partial) command. */ QString currentCommand() const; /*! Set the text cursor position on the last know prompt position. */ void focusCommand(); /*! Set the current foreground color to use to \a type. */ void useColor( pConsole::ColorType type ); /*! Display the prompt on a new line. */ void displayPrompt(); /*! Repalce the current command by the history command at \a index and return true on success, else false. */ bool showHistoryItem( int index ); signals: /*! This signal is emited after the command \a command has been executed. */ void commandExecuted( const QString& command, int exitCode ); }; #endif // PCONSOLE_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/consolemanager/pConsole.cpp0000644000175000017520000004167711546156115024507 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pConsole.cpp ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pConsole.h" #include #include #include #include class pInternalCommands : public pConsoleCommand { public: pInternalCommands( pConsole* console ) : pConsoleCommand( QStringList() << "clear" << "cls" << "reset" << "help" ) { Q_ASSERT( console ); mConsole = console; setDescription( "clear", pConsole::tr( "Clear the screen" ) ); setDescription( "cls", pConsole::tr( "An alias for clear command" ) ); setDescription( "reset", pConsole::tr( "Reset the console" ) ); setDescription( "help", pConsole::tr( "List available commands" ) ); } virtual QString interpret( const QString& command, int* exitCode ) const { int ec = pConsoleCommand::NotFound; QString output = pConsoleCommand::interpret( command, &ec ); QStringList parts = parseCommand( command ); const QString cmd = parts.isEmpty() ? QString::null : parts.takeFirst(); if ( ec != pConsoleCommand::NotFound ) { // nothing to do } else if ( cmd == "clear" || cmd == "cls" ) { ec = parts.isEmpty() ? pConsoleCommand::Success : pConsoleCommand::Error; output = parts.isEmpty() ? QString::null : pConsole::tr( "%1 take no parameter" ).arg( cmd ); if ( parts.isEmpty() ) { mConsole->clear(); } } else if ( cmd == "reset" ) { ec = parts.isEmpty() ? pConsoleCommand::Success : pConsoleCommand::Error; output = parts.isEmpty() ? QString::null : pConsole::tr( "%1 take no parameter" ).arg( cmd ); if ( parts.isEmpty() ) { mConsole->reset(); } } else if ( cmd == "help" ) { ec = parts.isEmpty() ? pConsoleCommand::Success : pConsoleCommand::Error; output = parts.isEmpty() ? QString::null : pConsole::tr( "%1 take no parameter" ).arg( cmd ); if ( parts.isEmpty() ) { const pConsoleCommand::List commands = pConsoleCommand::List() << const_cast( this ) << mConsole->availableCommands(); QStringList help; foreach ( const pConsoleCommand* command, commands ) { foreach ( const QString& cmd, command->commands() ) { help << QString( "%1\t\t%2" ).arg( cmd ).arg( command->description( cmd ) ); } } if ( help.isEmpty() ) { help << pConsole::tr( "No help available" ); } else { help.prepend( pConsole::tr( "Available commands:" ).append( "\n" ) ); help << pConsole::tr( "For specific command details, type: -h/--help" ).prepend( "\n" ); } output = help.join( "\n" ); } } if ( exitCode ) { *exitCode = ec; } return output; } protected: pConsole* mConsole; }; pConsole::pConsole( QWidget* parent ) : QPlainTextEdit( parent ) { mInternalCommands = new pInternalCommands( this ); mNoPromptCommands << "cls" << "clear" << "reset"; reset(); } pConsole::pConsole( const QString& promptText, QWidget* parent ) : QPlainTextEdit( parent ) { mInternalCommands = new pInternalCommands( this ); mNoPromptCommands << "cls" << "clear" << "reset"; reset( promptText ); } pConsole::~pConsole() { delete mInternalCommands; qDeleteAll( mAvailableCommands ); mAvailableCommands.clear(); } QString pConsole::prompt() const { return mPrompt; } void pConsole::setPrompt( const QString& prompt ) { mPrompt = prompt; if ( isPromptVisible() ) { displayPrompt(); } } bool pConsole::isPromptVisible() const { return !isReadOnly(); } void pConsole::setPromptVisible( bool visible ) { setReadOnly( !visible ); } QStringList pConsole::history() const { return mHistory; } void pConsole::setHistory( const QStringList& history ) { mHistory = history; mHistoryIndex = mHistory.count(); } QColor pConsole::color( pConsole::ColorType type ) const { return mColors.value( type ); } void pConsole::setColor( pConsole::ColorType type, const QColor& color ) { mColors[ type ] = color; } void pConsole::executeCommand( const QString& _command, bool writeCommand, bool showPrompt ) { const QString command = _command.trimmed(); // write command to execute if ( writeCommand ) { if ( !currentCommand().isEmpty() ) { displayPrompt(); } insertPlainText( command ); } // execute command int exitCode = pConsoleCommand::NotFound; QString output = interpretCommand( command, &exitCode ); // write output in different colors if needed if ( exitCode == pConsoleCommand::Success ) { useColor( pConsole::Output ); } else { useColor( pConsole::Error ); } if ( !output.isEmpty() ) { appendPlainText( output ); } useColor( pConsole::Command ); // display the prompt again if needed if ( showPrompt && !mNoPromptCommands.contains( command ) ) { displayPrompt(); } } bool pConsole::saveScript( const QString& fileName ) { QFile file( fileName ); if ( !file.open( QIODevice::WriteOnly | QIODevice::Text ) ) { return false; } file.resize( 0 ); foreach ( const QString& command, mRecordedScript ) { if ( file.write( QString( command ).append( "\n" ).toUtf8() ) == -1 ) { file.close(); return false; } } file.close(); return true; } bool pConsole::loadScript( const QString& fileName ) { QFile file( fileName ); if ( !file.open( QIODevice::ReadOnly | QIODevice::Text ) ) { return false; } while ( file.canReadLine() ) { executeCommand( QString::fromUtf8( file.readLine() ), true, false ); } file.close(); return true; } void pConsole::clear() { QPlainTextEdit::clear(); displayPrompt(); } void pConsole::reset( const QString& promptText ) { QPlainTextEdit::clear(); setTextInteractionFlags( Qt::TextSelectableByMouse | Qt::TextSelectableByKeyboard | Qt::LinksAccessibleByMouse | Qt::LinksAccessibleByKeyboard | Qt::TextEditable ); setUndoRedoEnabled( false ); setTabStopWidth( 40 ); QFont font = QFont( "Bitstream Vera Sans Mono" ); font.setPixelSize( 11 ); setFont( font ); QPalette pal = viewport()->palette(); pal.setColor( viewport()->backgroundRole(), QColor( Qt::black ) ); pal.setColor( viewport()->foregroundRole(), QColor( Qt::white ) ); viewport()->setPalette( pal ); mColors[ pConsole::Command ] = Qt::white; mColors[ pConsole::Error ] = Qt::red; mColors[ pConsole::Output ] = Qt::gray; mColors[ pConsole::Completion ] = Qt::green; mRecordedScript.clear(); QString prompt = promptText.isEmpty() ? mPrompt : promptText; if ( prompt.isEmpty() ) { prompt = "@:/> "; } setHistory( QStringList() ); setPromptVisible( true ); appendPlainText( tr( "Press 'Tab' key to list or auto complete commands, type help for commands help." ) ); setPrompt( prompt ); } pConsoleCommand::List pConsole::availableCommands() const { return mAvailableCommands; } void pConsole::setAvailableCommands( const pConsoleCommand::List& commands ) { qDeleteAll( mAvailableCommands ); mAvailableCommands.clear(); mAvailableCommands = commands; } void pConsole::addAvailableCommand( pConsoleCommand* command ) { if ( !mAvailableCommands.contains( command ) ) { mAvailableCommands << command; } } void pConsole::removeAvailableCommand( pConsoleCommand* command ) { mAvailableCommands.removeOne( command ); } void pConsole::keyPressEvent( QKeyEvent* event ) { // filter out cut action if ( event->matches( QKeySequence::Cut ) ) { return; } // filter out paste action if ( event->matches( QKeySequence::Paste ) ) { QString command = QApplication::clipboard()->text() .replace( "\r\n", "\n" ) .replace( "\r", "\n" ); while ( command.contains( "\n\n" ) ) { command.replace( "\n\n", "\n" ); } const QStringList commands = command.split( "\n" ); switch ( commands.count() ) { case 0: break; case 1: insertPlainText( commands.first().trimmed() ); break; default: { foreach ( QString command, commands ) { command = command.trimmed(); if ( !command.isEmpty() /*&& isCommandComplete( command )*/ ) { executeCommand( command, true ); } } break; } } return; } // some needed infos QTextCursor cursor = textCursor(); int start = cursor.selectionStart(); int end = cursor.selectionEnd(); int promptStart = cursor.block().position() +mPrompt.length(); int historyId = mHistoryIndex; bool processEvent = true; QString typedCommand; if ( start > end ) { qSwap( start, end ); } // case switch ( event->key() ) { case Qt::Key_Enter: case Qt::Key_Return: { const QString command = currentCommand(); if ( event->modifiers() == Qt::NoModifier && !command.isEmpty() /*&& isCommandComplete( command )*/ ) { executeCommand( command, false ); } return; } case Qt::Key_Escape: { // stopCommand(); return; break; } case Qt::Key_Left: { if ( cursor.position() <= promptStart ) { return; } break; } case Qt::Key_Backspace: { /*if ( event->modifiers() == Qt::NoModifier )*/ { if ( ( cursor.position() <= promptStart && !cursor.hasSelection() ) || ( cursor.hasSelection() && start < promptStart ) ) { return; } } break; } case Qt::Key_Delete: { /*if ( event->modifiers() == Qt::NoModifier )*/ { if ( cursor.hasSelection() && start < promptStart ) { return; } } break; } case Qt::Key_Right: { break; } case Qt::Key_Up: { processEvent = false; historyId--; break; } case Qt::Key_Down: { processEvent = false; historyId++; break; } case Qt::Key_Home: { if ( event->modifiers() == Qt::NoModifier ) { processEvent = false; QTextCursor cursor = textCursor(); cursor.setPosition( cursor.block().position() +mPrompt.length() ); setTextCursor( cursor ); } break; } case Qt::Key_PageUp: { processEvent = false; historyId = -1; if ( !mHistory.isEmpty() ) { historyId = 0; } break; } case Qt::Key_PageDown: { processEvent = false; historyId = -1; if ( !mHistory.isEmpty() ) { historyId = mHistory.count() -1; } break; } case Qt::Key_Tab: { QString command = currentCommand(); QStringList sl = autoCompleteCommand( command ); QString str = sl.join( " " ); if ( sl.count() == 1 ) { replaceCommand( sl.at( 0 ) +" " ); } else if ( !sl.isEmpty() ) { useColor( pConsole::Completion ); appendPlainText( str ); useColor( pConsole::Command ); displayPrompt(); insertPlainText( command ); } return; } default: break; } if ( processEvent ) { if ( cursor.hasSelection() && event->modifiers() == Qt::NoModifier ) { const QChar c( event->text().isEmpty() ? QChar() : event->text().at( 0 ) ); if ( c.isPrint() ) { focusCommand(); } } QPlainTextEdit::keyPressEvent( event ); // trunc the selection to remove the prompt if ( textCursor().hasSelection() && event->key() == Qt::Key_Home && event->modifiers() == Qt::ShiftModifier ) { QTextCursor cursor = textCursor(); int start = cursor.selectionStart(); int end = cursor.selectionEnd(); start = cursor.block().position() +mPrompt.length(); cursor.setPosition( end, QTextCursor::MoveAnchor ); cursor.setPosition( start, QTextCursor::KeepAnchor ); setTextCursor( cursor ); } typedCommand = currentCommand(); } if ( historyId != mHistoryIndex ) { if ( !showHistoryItem( historyId ) ) { if ( historyId < 0 ) { mHistoryIndex = 0; } else { mHistoryIndex = mHistory.count(); replaceCommand( typedCommand ); } } } mPromptPosition.setX( textCursor().columnNumber() ); } void pConsole::mousePressEvent( QMouseEvent* event ) { QTextCursor cursor = textCursor(); int length = mPrompt.length(); int column = cursor.columnNumber() < length ? length : cursor.columnNumber(); if ( event->buttons() == Qt::LeftButton ) { mPromptPosition = QPoint( column, cursor.blockNumber() ); } setPromptVisible( false ); QPlainTextEdit::mousePressEvent( event ); } void pConsole::mouseReleaseEvent( QMouseEvent* event ) { QPlainTextEdit::mouseReleaseEvent( event ); if ( event->button() == Qt::LeftButton && textCursor().hasSelection() ) { copy(); } focusCommand(); setPromptVisible( true ); } void pConsole::contextMenuEvent( QContextMenuEvent* event ) { // fake release event to reposition the cursor as it's not triggered when requesting context menu QMouseEvent me( QEvent::MouseButtonRelease, QPoint(), Qt::NoButton, Qt::NoButton, Qt::NoModifier ); QApplication::sendEvent( viewport(), &me ); QPlainTextEdit::contextMenuEvent( event ); } bool pConsole::isCommandComplete( const QString& command ) { const pConsoleCommand::List commands = pConsoleCommand::List() << mInternalCommands << mAvailableCommands; foreach ( const pConsoleCommand* cmd, commands ) { if ( cmd->isComplete( command ) ) { return true; } } return false; } QString pConsole::interpretCommand( const QString& command, int* exitCode ) { const pConsoleCommand::List commands = pConsoleCommand::List() << mInternalCommands << mAvailableCommands; QString output; bool foundCommand = false; foreach ( const pConsoleCommand* cmd, commands ) { if ( cmd->isComplete( command ) ) { foundCommand = true; output = cmd->interpret( command, exitCode ); break; } } if ( !foundCommand ) { output = tr( "%1: Command not found." ).arg( command ); } // add the command to the recordedScript list if ( exitCode && *exitCode == pConsoleCommand::Success ) { mRecordedScript << command; } // update history mHistory << QString( command ).replace( "\n", "\\n" ); mHistoryIndex = mHistory.count(); // emit command executed emit commandExecuted( command, exitCode ? *exitCode : pConsoleCommand::NoExitCode ); // return output return output; } QStringList pConsole::autoCompleteCommand( const QString& command ) { const pConsoleCommand::List commands = pConsoleCommand::List() << mInternalCommands << mAvailableCommands; QStringList result; foreach ( const pConsoleCommand* cmd, commands ) { const QStringList list = cmd->autoCompleteList( command ); if ( !list.isEmpty() ) { result << list; } } return result; } bool pConsole::replaceCommand( const QString& command ) { QTextBlock block = document()->findBlockByNumber( mPromptPosition.y() ); if ( !block.isValid() ) { return false; } QTextCursor cursor( block ); cursor.beginEditBlock(); cursor.movePosition( QTextCursor::StartOfBlock ); cursor.movePosition( QTextCursor::EndOfBlock, QTextCursor::KeepAnchor ); cursor.removeSelectedText(); cursor.insertText( mPrompt ); cursor.insertText( command ); cursor.endEditBlock(); mPromptPosition.setX( cursor.columnNumber() ); return true; } QString pConsole::currentCommand() const { QTextBlock block = document()->findBlockByNumber( mPromptPosition.y() ); if ( !block.isValid() ) { return QString::null; } return block.text().mid( mPrompt.length() ).trimmed(); } void pConsole::focusCommand() { QTextBlock block = document()->findBlockByNumber( mPromptPosition.y() ); if ( !block.isValid() ) { return; } QTextCursor cursor( block ); cursor.beginEditBlock(); cursor.movePosition( QTextCursor::StartOfBlock ); cursor.setPosition( cursor.position() +mPromptPosition.x(), QTextCursor::MoveAnchor ); cursor.endEditBlock(); setTextCursor( cursor ); } void pConsole::useColor( ColorType type ) { QTextCursor cursor = textCursor(); QTextCharFormat format = cursor.charFormat(); format.setForeground( color( type ) ); cursor.setCharFormat( format ); setTextCursor( cursor ); } void pConsole::displayPrompt() { if ( mPrompt.isEmpty() ) { return; } useColor( pConsole::Command ); appendPlainText( mPrompt ); mHistoryIndex = mHistory.count(); QTextBlock block = document()->lastBlock(); QTextCursor cursor( block ); cursor.movePosition( QTextCursor::EndOfBlock, QTextCursor::MoveAnchor ); setTextCursor( cursor ); mPromptPosition = QPoint( cursor.columnNumber(), cursor.blockNumber() ); } bool pConsole::showHistoryItem( int index ) { if ( index >= 0 && index < mHistory.count() ) { mHistoryIndex = index; return replaceCommand( mHistory.at( index ) ); } return false; } ./qwbfsmanager-1.2.1-src/fresh/src/gui/consolemanager/pConsoleCommand.h0000644000175000017520000001020411546156115025431 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pConsoleCommand.h ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PCONSOLECOMMAND_H #define PCONSOLECOMMAND_H /*! \file pConsoleCommand.h \brief pConsoleCommand is the command interpreter to be used with pConsole. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include #include /*! \ingroup FreshGui \class pConsoleCommand \brief pConsoleCommand is the command interpreter to be used with pConsole. */ class FRESH_EXPORT pConsoleCommand { public: /*! This enumeration represents some standard exit code */ enum ExitCode { NotFound = -2, /*!< The command to be executed was not found. */ NoExitCode = -1, /*!< Undefined exit code, this is the case when a command is executed and a pointer for the exit code is not given. */ Success = 0, /*!< The command was successfuly executed. */ Error = 1 /*!< An error occurs while executing the command. */ }; /*!< A QList of pConsoleCommand. */ typedef QList List; /*! Create a pConsoleCommand that can handle \a commands. */ pConsoleCommand( const QStringList& commands = QStringList() ); /*! Destroys the pConsoleCommand. */ virtual ~pConsoleCommand(); /*! Create a new pConsoleCommand that is a copy of \a other. */ pConsoleCommand( const pConsoleCommand& other ); /*! Copy the data of \a other pConsoleCommand. */ pConsoleCommand& operator=( const pConsoleCommand& other ); /*! Returns true if this pConsoleCommand is equals to \a other else false. */ bool operator==( const pConsoleCommand& other ) const; /*! Return true if this pConsoleCommand is differents than \a other else false. */ bool operator!=( const pConsoleCommand& other ) const; /*! Return the list of handled commands. */ QStringList commands() const; /*! Return a list of commands matching \a command. */ QStringList autoCompleteList( const QString& command ) const; /*! Return the description associated with \a command. */ virtual QString description( const QString& command ) const; /*! Set the \a description for \a command. */ void setDescription( const QString& command, const QString& description ); /*! Returns true if the \a command is complete or not. A complete command is a command defined in the \a commands() list. */ virtual bool isComplete( const QString& command ) const; /*! Return the usage description for \a command. */ virtual QString usage( const QString& command ) const; /*! Execute the \a command line (which may have parameters) and set the exit code in \a exitCode. */ virtual QString interpret( const QString& command, int* exitCode ) const; /*! Return a QStringList where each entries is quoted if needed and internal quote escaped. */ static QStringList quotedStringList( const QStringList& list ); /*! Parse the \a command line and add each parts in a QStringList. */ static QStringList parseCommand( const QString& command ); protected: QStringList mCommands; QHash mDescriptions; }; #endif // PCONSOLECOMMAND_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/models/0000755000175000017520000000000011546156115020470 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/fresh/src/gui/models/pRecursiveSortFilterProxyModel.cpp0000644000175000017520000000361011546156115027364 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pRecursiveSortFilterProxyModel.cpp ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pRecursiveSortFilterProxyModel.h" pRecursiveSortFilterProxyModel::pRecursiveSortFilterProxyModel( QObject* parent ) : QSortFilterProxyModel( parent ) { } bool pRecursiveSortFilterProxyModel::filterAcceptsRow( int source_row, const QModelIndex& source_parent ) const { const QModelIndex index = sourceModel()->index( source_row, 0, source_parent ); const int rowCount = sourceModel()->rowCount( index ); const bool accepted = QSortFilterProxyModel::filterAcceptsRow( source_row, source_parent ); if ( rowCount > 0 && !accepted ) { for ( int row = 0; row < rowCount; row++ ) { if ( filterAcceptsRow( row, index ) ) { return true; } } } return accepted; } ./qwbfsmanager-1.2.1-src/fresh/src/gui/models/pRecursiveSortFilterProxyModel.h0000644000175000017520000000461011546156115027032 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pRecursiveSortFilterProxyModel.h ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PRECURSIVESORTFILTERPROXYMODEL_H #define PRECURSIVESORTFILTERPROXYMODEL_H /*! \file pRecursiveSortFilterProxyModel.h \brief A QSortFilterProxyModel that does the rows filtering recursively. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include /*! \ingroup FreshGui \class pRecursiveSortFilterProxyModel \brief A QSortFilterProxyModel that does the rows filtering recursively. The standard QSortFilterProxyModel does not do recursive filtering. What is called recursive if that if a node does not match but one of its children match, then the parent node will be filtered out making the child not visible. This model recursively check for children and does not filter out parent having matching children. */ class FRESH_EXPORT pRecursiveSortFilterProxyModel : public QSortFilterProxyModel { Q_OBJECT public: /*! Create an instance of the filter model having parent \a parent. */ pRecursiveSortFilterProxyModel( QObject* parent = 0 ); protected: /*! Reimplemented */ virtual bool filterAcceptsRow( int source_row, const QModelIndex& source_parent ) const; }; #endif // PRECURSIVESORTFILTERPROXYMODEL_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/pMainWindow.cpp0000644000175000017520000001204011546156115022142 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pMainWindow.cpp ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pMainWindow.h" #include "pSettings.h" #include "actionmanager/pActionsNodeMenuBar.h" #include "queuedmessage/pQueuedMessageToolBar.h" #include "dockmanager/pDockToolBarManager.h" #include "dockmanager/pDockToolBar.h" pMainWindow::pMainWindow( QWidget* parent, Qt::WindowFlags windowFlags ) : QMainWindow( parent, windowFlags ) { mShown = false; mSettings = 0; mMenuBar = 0; mQueuedMessageToolBar = 0; mDockToolBarManager = 0; #if not defined( Q_OS_MAC ) setMenuBar( menuBar() ); #else menuBar(); #endif queuedMessageToolBar(); } pMainWindow::~pMainWindow() { if ( settings() ) { settings()->sync(); } #if defined( Q_OS_MAC ) delete mMenuBar; #endif } QMenu* pMainWindow::createPopupMenu() { QMenu* menu = QMainWindow::createPopupMenu(); menu->addSeparator(); menu->addAction( dockToolBarManager()->dockToolBar( Qt::TopToolBarArea )->toggleExclusiveAction() ); menu->addAction( dockToolBarManager()->dockToolBar( Qt::RightToolBarArea )->toggleExclusiveAction() ); menu->addAction( dockToolBarManager()->dockToolBar( Qt::BottomToolBarArea )->toggleExclusiveAction() ); menu->addAction( dockToolBarManager()->dockToolBar( Qt::LeftToolBarArea )->toggleExclusiveAction() ); return menu; } void pMainWindow::showEvent( QShowEvent* event ) { QMainWindow::showEvent( event ); if ( !mShown ) { mShown = true; restoreState(); } } void pMainWindow::closeEvent( QCloseEvent* event ) { saveState(); QMainWindow::closeEvent( event ); } pQueuedMessageToolBar* pMainWindow::queuedMessageToolBar() const { if ( !mQueuedMessageToolBar ) { pMainWindow* mw = const_cast( this ); mQueuedMessageToolBar = new pQueuedMessageToolBar( mw ); mw->addToolBar( Qt::TopToolBarArea, mQueuedMessageToolBar ); mQueuedMessageToolBar->setVisible( false ); } return mQueuedMessageToolBar; } pDockToolBarManager* pMainWindow::dockToolBarManager() const { if ( !mDockToolBarManager ) { mDockToolBarManager = new pDockToolBarManager( const_cast( this ) ); } return mDockToolBarManager; } pDockToolBar* pMainWindow::dockToolBar( Qt::ToolBarArea area ) const { return dockToolBarManager()->dockToolBar( area ); } pSettings* pMainWindow::settings() const { if ( !mSettings ) { mSettings = new pSettings( const_cast( this ) ); } return mSettings; } pActionsNodeMenuBar* pMainWindow::menuBar() const { if ( !mMenuBar ) { #if defined( Q_OS_MAC ) mMenuBar = new pActionsNodeMenuBar; #else mMenuBar = new pActionsNodeMenuBar( const_cast( this ) ); #endif } return mMenuBar; } void pMainWindow::addDockManagerWidget( Qt::ToolBarArea area, QDockWidget* dockWidget, Qt::Orientation orientation ) { dockToolBar( area )->addDockWidget( dockWidget ); if ( orientation == Qt::Horizontal ) { dockWidget->setFeatures( dockWidget->features() ^ QDockWidget::DockWidgetVerticalTitleBar ); } else { dockWidget->setFeatures( dockWidget->features() | QDockWidget::DockWidgetVerticalTitleBar ); } } void pMainWindow::setDockManagerAreaExclusive( Qt::ToolBarArea area, bool exclusive ) { dockToolBar( area )->setExclusive( exclusive ); } void pMainWindow::setDockManagerMode( pDockToolBarManager::Mode mode ) { dockToolBarManager()->setMode( mode ); } void pMainWindow::appendMessage( const QString& message, int milliSeconds ) { queuedMessageToolBar()->appendMessage( message, milliSeconds ); } void pMainWindow::appendMessage( const pQueuedMessage& message ) { queuedMessageToolBar()->appendMessage( message ); } void pMainWindow::saveState() { if ( settings() ) { dockToolBarManager()->saveState(); settings()->saveState( this ); } } void pMainWindow::restoreState() { if ( settings() ) { dockToolBarManager()->setRestoring( true ); settings()->restoreState( this ); queuedMessageToolBar()->setVisible( false ); dockToolBarManager()->setRestoring( false ); dockToolBarManager()->restoreState(); } } ./qwbfsmanager-1.2.1-src/fresh/src/gui/listeditor/0000755000175000017520000000000011546156115021367 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/fresh/src/gui/listeditor/pPathListEditor.h0000644000175000017520000000411111546156115024614 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pPathListEditor.h ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PPATHLISTEDITOR_H #define PPATHLISTEDITOR_H /*! \file pPathListEditor.h \brief a pStringListEditor that handle paths name. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include "pFileListEditor.h" /*! \ingroup FreshGui \class pPathListEditor \brief a pStringListEditor that handle paths name. */ class FRESH_EXPORT pPathListEditor : public pFileListEditor { Q_OBJECT public: /*! Create an editor instance having parent \a parent. */ pPathListEditor( QWidget* parent = 0 ); /*! Create an editor instance having parent \a parent and title \a title. The default path for the file dialog will be \a path. */ pPathListEditor( const QString& title, const QString& path, QWidget* parent = 0 ); protected: virtual void init(); protected slots: virtual void onAddItem(); virtual void onEditItem(); }; #endif // PPATHLISTEDITOR_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/listeditor/pStringListEditor.cpp0000644000175000017520000002073411546156115025532 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pStringListEditor.cpp ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pStringListEditor.h" #include "pIconManager.h" #include #include #include #include #include #include #include class pStringListModel : public QStringListModel { public: pStringListModel( QObject* parent = 0 ) : QStringListModel( parent ) { } pStringListModel( const QStringList& strings, QObject* parent = 0 ) : QStringListModel( strings, parent ) { } virtual QVariant data( const QModelIndex& index, int role = Qt::DisplayRole ) const { switch ( role ) { case Qt::ToolTipRole: return QStringListModel::data( index, Qt::DisplayRole ).toString(); } return QStringListModel::data( index, role ); } }; pStringListEditor::pStringListEditor( QWidget* parent ) : QGroupBox( parent ) { init(); } pStringListEditor::pStringListEditor( const QString& title, QWidget* parent ) : QGroupBox( title, parent ) { init(); } void pStringListEditor::init() { // create toolbar tbActions = new QToolBar( this ); tbActions->layout()->setMargin( 0 ); tbActions->layout()->setSpacing( 0 ); tbActions->setIconSize( QSize( 16, 16 ) ); // create actions aAdd = new QAction( pIconManager::icon( "add.png", ":/fresh/icons" ), tr( "Add Item" ), tbActions ); aEdit = new QAction( pIconManager::icon( "edit.png", ":/fresh/icons" ), tr( "Edit Item" ), tbActions ); aRemove = new QAction( pIconManager::icon( "remove.png", ":/fresh/icons" ), tr( "Remove Item" ), tbActions ); aClear = new QAction( pIconManager::icon( "clear.png", ":/fresh/icons" ), tr( "Clear Items" ), tbActions ); aUp = new QAction( pIconManager::icon( "up.png", ":/fresh/icons" ), tr( "Move Item Up" ), tbActions ); aDown = new QAction( pIconManager::icon( "down.png", ":/fresh/icons" ), tr( "Move Item Down" ), tbActions ); // add actions to toolbar tbActions->addAction( aAdd ); tbActions->addAction( aEdit ); tbActions->addAction( aRemove ); tbActions->addAction( aClear ); tbActions->addAction( aUp ); tbActions->addAction( aDown ); // create listview lvValues = new QListView( this ); lvValues->setMinimumHeight( 40 ); lvValues->setUniformItemSizes( true ); lvValues->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); // create model slmValues = new pStringListModel( lvValues ); lvValues->setModel( slmValues ); // create layout vLayout = new QVBoxLayout( this ); vLayout->setMargin( 5 ); vLayout->setSpacing( 3 ); vLayout->addWidget( tbActions ); vLayout->addWidget( lvValues ); onSelectionChanged(); // connections connect( aAdd, SIGNAL( triggered() ), this, SLOT( onAddItem() ) ); connect( aEdit, SIGNAL( triggered() ), this, SLOT( onEditItem() ) ); connect( aRemove, SIGNAL( triggered() ), this, SLOT( onRemoveItem() ) ); connect( aClear, SIGNAL( triggered() ), this, SLOT( onClearItems() ) ); connect( aUp, SIGNAL( triggered() ), this, SLOT( onMoveUpItem() ) ); connect( aDown, SIGNAL( triggered() ), this, SLOT( onMoveDownItem() ) ); connect( lvValues->selectionModel(), SIGNAL( selectionChanged( const QItemSelection&, const QItemSelection& ) ), this, SLOT( onSelectionChanged() ) ); connect( slmValues, SIGNAL( dataChanged( const QModelIndex&, const QModelIndex& ) ), this, SIGNAL( modified() ) ); connect( slmValues, SIGNAL( rowsInserted( const QModelIndex&, int, int ) ), this, SIGNAL( modified() ) ); connect( slmValues, SIGNAL( rowsMoved( const QModelIndex&, int, int, const QModelIndex&, int ) ), this, SIGNAL( modified() ) ); connect( slmValues, SIGNAL( rowsRemoved( const QModelIndex&, int, int ) ), this, SIGNAL( modified() ) ); connect( this, SIGNAL( modified() ), this, SLOT( onSelectionChanged() ) ); } QModelIndex pStringListEditor::selectedIndex() const { return lvValues->selectionModel()->selectedIndexes().value( 0 ); } QModelIndex pStringListEditor::indexForValue( const QString& value ) const { const Qt::MatchFlags flags = Qt::MatchFixedString | Qt::MatchCaseSensitive | Qt::MatchRecursive; return slmValues->match( indexForRow( 0 ), Qt::DisplayRole, value, 1, flags ).value( 0 ); } QModelIndex pStringListEditor::indexForRow( int row ) const { return slmValues->index( row, 0 ); } int pStringListEditor::rowForValue( const QString& value ) const { return indexForValue( value ).row(); } void pStringListEditor::setValues( const QStringList& values ) { slmValues->setStringList( values ); emit modified(); } QStringList pStringListEditor::values() const { return slmValues->stringList(); } void pStringListEditor::insert( int index, const QString& value ) { const int row = slmValues->rowCount(); if ( index < 0 ) { index = 0; } if ( index > row ) { index = row; } if ( slmValues->insertRow( row ) ) { const QModelIndex index = slmValues->index( row, 0 ); slmValues->setData( index, value, Qt::DisplayRole ); lvValues->setCurrentIndex( index ); lvValues->scrollTo( index ); lvValues->edit( index ); } } void pStringListEditor::append( const QString& value ) { insert( slmValues->rowCount(), value ); } void pStringListEditor::selectRow( int row ) { lvValues->setCurrentIndex( indexForRow( row ) ); } int pStringListEditor::selectedRow() const { return selectedIndex().row(); } void pStringListEditor::selectValue( const QString& value ) { lvValues->setCurrentIndex( indexForValue( value ) ); } QString pStringListEditor::selectedValue() const { return selectedIndex().data( Qt::DisplayRole ).toString(); } void pStringListEditor::setValue( const QString& value ) { const QModelIndex index = selectedIndex(); slmValues->setData( index, value, Qt::DisplayRole ); } void pStringListEditor::editValue( const QString& value ) { lvValues->edit( indexForValue( value ) ); } void pStringListEditor::editValue( int row ) { lvValues->edit( indexForRow( row ) ); } void pStringListEditor::onSelectionChanged() { const QModelIndex index = selectedIndex(); const int count = slmValues->rowCount(); aEdit->setEnabled( index.isValid() ); aRemove->setEnabled( index.isValid() ); aClear->setEnabled( count > 0 ); aUp->setEnabled( index.isValid() && index.row() > 0 ); aDown->setEnabled( index.isValid() && index.row() < count -1 ); } void pStringListEditor::onAddItem() { const int row = slmValues->rowCount(); append( tr( "New item %1" ).arg( row ) ); } void pStringListEditor::onEditItem() { lvValues->edit( selectedIndex() ); } void pStringListEditor::onRemoveItem() { slmValues->removeRow( selectedIndex().row() ); } void pStringListEditor::onClearItems() { slmValues->setStringList( QStringList() ); onSelectionChanged(); } void pStringListEditor::onMoveUpItem() { const QModelIndex index = selectedIndex(); const QModelIndex upIndex = index.sibling( index.row() -1, 0 ); const QPair values = qMakePair( index.data().toString(), upIndex.data().toString() ); slmValues->setData( index, values.second, Qt::DisplayRole ); slmValues->setData( upIndex, values.first, Qt::DisplayRole ); lvValues->setCurrentIndex( upIndex ); } void pStringListEditor::onMoveDownItem() { const QModelIndex index = selectedIndex(); const QModelIndex downIndex = index.sibling( index.row() +1, 0 ); const QPair values = qMakePair( index.data().toString(), downIndex.data().toString() ); slmValues->setData( index, values.second, Qt::DisplayRole ); slmValues->setData( downIndex, values.first, Qt::DisplayRole ); lvValues->setCurrentIndex( downIndex ); } ./qwbfsmanager-1.2.1-src/fresh/src/gui/listeditor/pFileListEditor.cpp0000644000175000017520000000471211546156115025141 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pFileListEditor.cpp ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pFileListEditor.h" #include "pIconManager.h" #include #include #include pFileListEditor::pFileListEditor( QWidget* parent ) : pStringListEditor( parent ) { init(); } pFileListEditor::pFileListEditor( const QString& title, const QString& path, const QString& filter, QWidget* parent ) : pStringListEditor( title, parent ), mPath( path ), mFilter( filter ) { init(); } void pFileListEditor::init() { aEdit->setIcon( pIconManager::icon( "file.png", ":/fresh/icons" ) ); } QString pFileListEditor::path() const { return mPath; } void pFileListEditor::setPath( const QString& path ) { mPath = path; } QString pFileListEditor::filter() const { return mFilter; } void pFileListEditor::setFilter( const QString& filter ) { mFilter = filter; } void pFileListEditor::onAddItem() { const QStringList files = QFileDialog::getOpenFileNames( window(), tr( "Choose file(s)" ), mPath, mFilter ); if ( !files.isEmpty() ) { foreach ( const QString& file, files ) { append( file ); } } } void pFileListEditor::onEditItem() { const QModelIndex index = selectedIndex(); const QString file = QFileDialog::getOpenFileName( window(), tr( "Choose file" ), mPath, mFilter ); if ( !file.isEmpty() ) { setValue( file ); } } ./qwbfsmanager-1.2.1-src/fresh/src/gui/listeditor/pStringListEditor.h0000644000175000017520000000772011546156115025177 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pStringListEditor.h ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PSTRINGLISTEDITOR_H #define PSTRINGLISTEDITOR_H /*! \file pStringListEditor.h \brief A widget that handle QStringList edition. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include class QToolBar; class QAction; class QListView; class QStringListModel; class QVBoxLayout; class QModelIndex; /*! \ingroup FreshGui \class pStringListEditor \brief A widget that handle QStringList edition. */ class FRESH_EXPORT pStringListEditor : public QGroupBox { Q_OBJECT public: /*! Create an editor instance having parent \a parent. */ pStringListEditor( QWidget* paret = 0 ); /*! Create an editor instance having parent \a parent and title \a title. */ pStringListEditor( const QString& title, QWidget* paret = 0 ); /*! Set the editor values to \a values. */ void setValues( const QStringList& values ); /*! Return the values of the editor. */ QStringList values() const; /*! Insert \a value at \a index. If \a index is inferior to 0 then it's prepend and if it's superior or equals to count() it's append. */ virtual void insert( int index, const QString& value ); /*! Append \a value at the end of the list. */ void append( const QString& value ); /*! Select the value at \a row. */ void selectRow( int row ); /*! Return the row of the selected value. */ int selectedRow() const; /*! Select \a value. If the list contains multiple times the same value then the selected one could not be predicted. */ void selectValue( const QString& value ); /*! Return the selected value. In fact it's the value of the selected row. \sa selectedRow() */ QString selectedValue() const; /*! Set the value of the selected value. \sa selectedValue() */ void setValue( const QString& value ); /*! Enter in edit mode for \a value. If there is multiple time the same value which one will be edited is not predictable. */ void editValue( const QString& value ); /*! Enter in edit mode for value at \a row. */ void editValue( int row ); protected: QToolBar* tbActions; QAction* aAdd; QAction* aEdit; QAction* aRemove; QAction* aClear; QAction* aUp; QAction* aDown; QListView* lvValues; QStringListModel* slmValues; QVBoxLayout* vLayout; virtual void init(); QModelIndex selectedIndex() const; QModelIndex indexForValue( const QString& value ) const; QModelIndex indexForRow( int row ) const; int rowForValue( const QString& value ) const; protected slots: virtual void onSelectionChanged(); virtual void onAddItem(); virtual void onEditItem(); virtual void onRemoveItem(); virtual void onClearItems(); virtual void onMoveUpItem(); virtual void onMoveDownItem(); signals: /*! This signal is emited when the values are modified. */ void modified(); }; #endif // PSTRINGLISTEDITOR_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/listeditor/pPathListEditor.cpp0000644000175000017520000000413211546156115025152 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pPathListEditor.cpp ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pPathListEditor.h" #include "pIconManager.h" #include #include #include pPathListEditor::pPathListEditor( QWidget* parent ) : pFileListEditor( parent ) { init(); } pPathListEditor::pPathListEditor( const QString& title, const QString& path, QWidget* parent ) : pFileListEditor( title, path, QString::null, parent ) { init(); } void pPathListEditor::init() { aEdit->setIcon( pIconManager::icon( "folder.png", ":/fresh/icons" ) ); } void pPathListEditor::onAddItem() { const QString path = QFileDialog::getExistingDirectory( window(), tr( "Choose directory" ), mPath ); if ( !path.isEmpty() ) { append( path ); } } void pPathListEditor::onEditItem() { const QModelIndex index = selectedIndex(); const QString path = QFileDialog::getExistingDirectory( window(), tr( "Choose directory" ), mPath ); if ( !path.isEmpty() ) { setValue( path ); } } ./qwbfsmanager-1.2.1-src/fresh/src/gui/listeditor/pFileListEditor.h0000644000175000017520000000476011546156115024611 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pFileListEditor.h ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PFILELISTEDITOR_H #define PFILELISTEDITOR_H /*! \file pFileListEditor.h \brief a pStringListEditor that handle files name. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include "pStringListEditor.h" /*! \ingroup FreshGui \class pFileListEditor \brief a pStringListEditor that handle files name. */ class FRESH_EXPORT pFileListEditor : public pStringListEditor { Q_OBJECT public: /*! Create an editor instance having parent \a parent. */ pFileListEditor( QWidget* parent = 0 ); /*! Create an editor instance having parent \a parent and title \a title. The path and filter for the file dialog will be \a path and \a filter. */ pFileListEditor( const QString& title, const QString& path, const QString& filter, QWidget* parent = 0 ); /*! Return the path used in files dialogs. */ QString path() const; /*! Set the path used in files dialogs to \a path. */ void setPath( const QString& path ); /*! Return the filter applied in files dialogs. */ QString filter() const; /*! Set the filter used in files dialogs. */ void setFilter( const QString& filter ); protected: QString mPath; QString mFilter; virtual void init(); protected slots: virtual void onAddItem(); virtual void onEditItem(); }; #endif // PFILELISTEDITOR_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/pTranslationDialog.h0000644000175000017520000000666411546156115023170 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pTranslationDialog.h ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PTRANSLATIONDIALOG_H #define PTRANSLATIONDIALOG_H /*! \file pTranslationDialog.h \brief A dialog for handling application locales. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include #include #include class Ui_pTranslationDialog; class pTranslationManager; class QTreeWidgetItem; /*! \ingroup FreshGui \class pTranslationDialog \brief A dialog for handling application locales. This dialog use a pTranslationManager instance to provide to the user the list of available locales/translations. */ class FRESH_EXPORT pTranslationDialog : public QDialog { Q_OBJECT public: /*! Create an instance of the dialog having \a parent as parent. */ pTranslationDialog( QWidget* parent = 0 ); /*! Create an instance of the dialog having \a parent as parent and \a translationManager as translation manager. */ pTranslationDialog( pTranslationManager* translationManager, QWidget* parent = 0 ); /*! Reimplemented. */ virtual ~pTranslationDialog(); /*! Reimplemented. */ virtual bool event( QEvent* event ); /*! Return the translation manager this dialog use. */ pTranslationManager* translationManager() const; /*! Set the translation manager to use by this dialog. */ void setTranslationManager( pTranslationManager* translationManager ); /*! Return the selected item locale, if no item is selected it return the translation manager current locale. */ QString selectedLocale() const; /*! Convenient static member that allow to quickly present the user a translation manager dialog. */ static QString getLocale( pTranslationManager* translationManager, QWidget* parent = 0 ); protected: Ui_pTranslationDialog* ui; QPointer mTranslationManager; QString mOriginalLocale; QHash mRootItems; void init( pTranslationManager* translationManager ); QTreeWidgetItem* newItem( const QLocale& locale ); QTreeWidgetItem* rootItem( const QLocale& locale ); protected slots: void localeChanged(); void on_tbLocate_clicked(); void on_tbReload_clicked(); void on_twLocales_itemSelectionChanged(); /*! Reimplemented. */ void reject(); /*! reimplemented. */ void accept(); }; #endif // PTRANSLATIONDIALOG_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/pTreeComboBox.h0000644000175000017520000001231311546156115022066 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pTreeComboBox.h ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PTREECOMBOBOX_H #define PTREECOMBOBOX_H /*! \file pTreeComboBox.h \brief A special combobox handling a QTreeView as popup widget. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include #include #include class QFrame; class QVBoxLayout; class QTreeView; class QAbstractItemModel; class QStyleOptionComboBox; /*! \ingroup FreshGui \class pTreeComboBox \brief A special combobox handling a QTreeView as popup widget. */ class FRESH_EXPORT pTreeComboBox : public QWidget { Q_OBJECT public: /*! Create an instance of the combobox having \a parent as parent. */ pTreeComboBox( QWidget* parent = 0 ); /*! Reimplemented. */ virtual bool eventFilter( QObject* object, QEvent* event ); /*! Reimplemented. */ virtual QSize sizeHint() const; /*! Return the size of the icon. */ QSize iconSize() const; /*! Set the size of the icon to \a size. \note The view has to be defined to take effect. */ void setIconSize( const QSize& size ); /*! This member is responsable of cleaning the state of the widget when hiding the popup widget. */ virtual void hidePopup(); /*! This member is responsable of initializing the state of the widget to popup the widget. */ virtual void showPopup(); /*! Return the tree view used by this combobox. */ QTreeView* view() const; /*! Set the view used by the combobox. \note The old view is deleted. */ virtual void setView( QTreeView* view ); /*! return the model used by the view. */ QAbstractItemModel* model() const; /*! Set the view model to \a model. \note The view has to be defined to take effect. */ virtual void setModel( QAbstractItemModel* model ); /*! Return the model column used to draw text / icon when the tree is not popuped. */ int modelColumn() const; /*! Set the model column to used for drawinf the text / icon when the tree is not popuped. */ void setColumnModel( int column ); /*! Return the view root index. */ QModelIndex rootIndex() const; /*! Set te view root index to \a index. \note The view has to be defined to take effect. */ void setRootIndex( const QModelIndex& index ); /*! Return the view current index. */ QModelIndex currentIndex() const; /*! Set the view current index to \a index. \note The view has to be defined to take effect. */ void setCurrentIndex( const QModelIndex& index ); /*! Expand all the node of the view. */ void expandAll(); protected slots: void internal_activated( const QModelIndex& index ); void internal_clicked( const QModelIndex& index ); void internal_currentChanged( const QModelIndex& current, const QModelIndex& previous ); protected: int mModelColumn; int mMaxVisibleItems; QFrame* mFrame; QVBoxLayout* mFrameLayout; QPointer mView; QPersistentModelIndex mCurrentIndex; bool mForceIndex; /*! This member follow the Qt style of initializing an option style for the combobox. */ virtual void initStyleOption( QStyleOptionComboBox* option ) const; /*! Reimplemented. */ virtual bool event( QEvent* event ); /*! Reimplemented. */ virtual void paintEvent( QPaintEvent* event ); /*! Reimplemented. */ virtual void hideEvent( QHideEvent* event ); /*! Reimplemented. */ virtual void mousePressEvent( QMouseEvent* event ); void calculPopupGeometry(); QModelIndex modelColumnIndex( const QModelIndex& index ) const; signals: /*! This signal is emit when \a index is activated. \sa QTreeView::activated( const QModelIndex& ). */ void activated( const QModelIndex& index ); /*! This signal is emit when \a index is clicked. \sa QTreeView::clicked( const QModelIndex& ). */ void clicked( const QModelIndex& index ); /*! This signal is emit when the current index changed to \a index. */ void currentIndexChanged( const QModelIndex& index ); /*! This signal is emit when \a index is highlighted. \sa QTreeView::highlighted( const QModelIndex& ). */ void highlighted( const QModelIndex& index ); }; #endif // PTREECOMBOBOX_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/pPaypalButton.cpp0000644000175000017520000001372111546156115022517 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pPaypalButton.cpp ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pPaypalButton.h" #include "pNetworkAccessManager.h" #include "pIconManager.h" #include #include #include #include #include #include pPaypalButton::pPaypalButton( QWidget* parent ) : QPushButton( parent ) { setCursor( Qt::PointingHandCursor ); setSizePolicy( QSizePolicy( QSizePolicy::Maximum, QSizePolicy::Maximum ) ); mQueryItems[ "path" ] = QString( "%1/cgi-bin/webscr" ).arg( PAYPAL_DOMAIN ); mQueryItems[ "cmd" ] = "_donations"; mQueryItems[ "bn" ] = QUrl::fromPercentEncoding( "PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHosted" ); mAutoOpenUrl = true; localeChanged(); connect( this, SIGNAL( clicked() ), this, SLOT( _q_clicked() ) ); connect( pNetworkAccessManager::instance(), SIGNAL( cached( const QUrl& ) ), this, SLOT( networkAccessManager_cached( const QUrl& ) ) ); connect( pNetworkAccessManager::instance(), SIGNAL( error( const QUrl&, const QString& ) ), this, SLOT( networkAccessManager_error( const QUrl&, const QString& ) ) ); connect( pNetworkAccessManager::instance(), SIGNAL( cacheCleared() ), this, SLOT( networkAccessManager_cacheCleared() ) ); } QSize pPaypalButton::minimumSizeHint() const { return sizeHint(); } QSize pPaypalButton::sizeHint() const { return mPixmap.isNull() ? QPushButton::sizeHint() : mPixmap.size() +QSize( 1, 1 ); } bool pPaypalButton::event( QEvent* event ) { switch ( event->type() ) { case QEvent::LocaleChange: localeChanged(); updatePixmap(); break; default: break; } return QPushButton::event( event ); } void pPaypalButton::paintEvent( QPaintEvent* event ) { if ( mPixmap.isNull() ) { QPushButton::paintEvent( event ); } else { QPainter painter( this ); QStyleOptionButton option; initStyleOption( &option ); option.rect = option.rect.adjusted( 0, 0, -1, -1 ); option.iconSize = size(); option.icon = mPixmap; option.text.clear(); style()->drawControl( QStyle::CE_PushButtonLabel, &option, &painter, this ); } } QUrl pPaypalButton::pixmapUrl( const QString& locale ) { return QUrl( QString( PAYPAL_MASK ).arg( locale ) ); } void pPaypalButton::updatePixmap() { const QUrl url = pixmapUrl( locale().name() ); networkAccessManager_cached( url ); if ( !pNetworkAccessManager::instance()->hasCacheData( url ) ) { pNetworkAccessManager::instance()->get( QNetworkRequest( url ) ); } } QString pPaypalButton::actionPost() const { return mQueryItems.value( "path" ); } void pPaypalButton::setActionPost( const QString& value ) { mQueryItems[ "path" ] = value; } QString pPaypalButton::businessId() const { return mQueryItems.value( "business" ); } void pPaypalButton::setBusinessId( const QString& value ) { mQueryItems[ "business" ] = value; } QString pPaypalButton::itemName() const { return mQueryItems.value( "item_name" ); } void pPaypalButton::setItemName( const QString& value ) { mQueryItems[ "item_name" ] = value; } QString pPaypalButton::itemId() const { return mQueryItems.value( "item_number" ); } void pPaypalButton::setItemId( const QString& value ) { mQueryItems[ "item_number" ] = value; } QString pPaypalButton::currencyCode() const { return mQueryItems.value( "currency_code" ); } void pPaypalButton::setCurrencyCode( const QString& value ) { mQueryItems[ "currency_code" ] = value; } bool pPaypalButton::autoOpenUrl() const { return mAutoOpenUrl; } void pPaypalButton::setAutoOpenUrl( bool open ) { mAutoOpenUrl = open; } QPixmap pPaypalButton::pixmap( const QUrl& url ) const { QPixmap pixmap = pNetworkAccessManager::instance()->cachedPixmap( url ); if ( pixmap.isNull() ) { pixmap = pIconManager::pixmap( "paypal.png", ":/fresh/icons" ); } return pixmap; } QUrl pPaypalButton::url() const { QUrl url( mQueryItems.value( "path" ) ); QList > queryItems; foreach ( const QString& key, mQueryItems.keys() ) { if ( key == "path" ) { continue; } queryItems << qMakePair( key, mQueryItems[ key ] ); } url.setQueryItems( queryItems ); return url; } void pPaypalButton::localeChanged() { mQueryItems[ "lc" ] = locale().name().section( "_", 1 ); setText( tr( "Donation" ) ); setToolTip( tr( "Make a donation via Paypal" ) ); } void pPaypalButton::_q_clicked() { if ( mAutoOpenUrl ) { QDesktopServices::openUrl( url() ); } else { emit clicked( url() ); } } void pPaypalButton::networkAccessManager_cached( const QUrl& url ) { if ( url.toString().startsWith( PAYPAL_DOMAIN, Qt::CaseInsensitive ) ) { mPixmap = this->pixmap( url ); updateGeometry(); } } void pPaypalButton::networkAccessManager_error( const QUrl& url, const QString& message ) { if ( url.toString().startsWith( PAYPAL_DOMAIN, Qt::CaseInsensitive ) ) { qWarning() << message << url; } } void pPaypalButton::networkAccessManager_cacheCleared() { updatePixmap(); } ./qwbfsmanager-1.2.1-src/fresh/src/gui/stylemanager/0000755000175000017520000000000011546156115021700 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/fresh/src/gui/stylemanager/pStylesActionGroup.h0000644000175000017520000001026311546156115025671 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pStylesActionGroup.h ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PSTYLESACTIONGROUP_H #define PSTYLESACTIONGROUP_H /*! \file pStylesActionGroup.h \brief A special QActionGroup for application styles. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include #include class pActionsNodeMenuBar; /*! \ingroup FreshGui \class pStylesActionGroup \brief A special QActionGroup for application styles. */ class FRESH_EXPORT pStylesActionGroup : public QActionGroup { Q_OBJECT friend class pStylesToolButton; public: /*! Create an instance of styles action group having parent \a parent. */ pStylesActionGroup( QObject* parent = 0 ); /*! Create an instance of styles action group having parent \a parent and having actions text mask \a textFormat. \note \a textFormat must contains the %1 term which will be replaced by the style name. */ pStylesActionGroup( const QString& textFormat, QObject* parent = 0 ); /*! Return true is actions are checkable else false. */ bool isCheckable() const; /*! Return the checked action style name if applicable, else system style name. */ QString currentStyle() const; /*! Return the action representing the system style. */ QAction* systemAction() const; /*! Return the action representing the application style. */ QAction* applicationAction() const; /*! Return the system style name. \note The system style is the style defined when the application start, which can be overrided by a call to 'binaryName -style plastique' call. So it may be different than the true desktop default style. Generally people does not use the -style parameter when starting an application so it should be appropriate for most cases. */ QString systemStyle() const; /*! Return the QApplication::style() name. */ QString applicationStyle() const; /*! Helper function for adding styles actions in \a menuBar at \a path. */ void installInMenuBar( pActionsNodeMenuBar* menuBar, const QString& path ); /*! Helper function for adding styles actions in \a menu. */ void installInMenu( QMenu* menu ); public slots: /*! Set the action checkable according to \a checkable. Checkable actions are fine when inserted in QMenu so user can see current style. Non checkable actions are fine when putted in a QToolButton menu like the QDesigner form preview menu. */ void setCheckable( bool checkable ); /*! Set the current style to \a style. \note the application style is not updated instead the styleSelected( const QString& ) signal is emited. */ void setCurrentStyle( const QString& style ); protected: QString mSystemStyle; bool mCheckable; QString mTextFormat; QMap mActions; void init( const QString& textFormat ); void updateActions(); protected slots: void actionToggled( bool checked ); void actionTriggered( QAction* action ); signals: /*! This signal is emited when an action is triggered or toggled, the style clicked is \a style. */ void styleSelected( const QString& style ); }; #endif // PSTYLESACTIONGROUP_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/stylemanager/pStylesToolButton.h0000644000175000017520000000603211546156115025547 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pStylesToolButton.h ** Date : 2011-02-20T00:41:10 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PSTYLESTOOLBUTTON_H #define PSTYLESTOOLBUTTON_H /*! \file pStylesToolButton.h \brief A special QToolButton that has a QMenu of available styles. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include class QMenu; class pStylesActionGroup; /*! \ingroup FreshGui \class pStylesToolButton \brief A special QToolButton that has a QMenu of available styles. */ class FRESH_EXPORT pStylesToolButton : public QToolButton { Q_OBJECT public: /*! Create an instance of the tool button having parent \a parent. */ pStylesToolButton( QWidget* parent = 0 ); /*! Create an instance of the tool button having parent \a parent and action text format \a textFormat. \sa pStylesActionGroup::pStylesActionGroup( const QString&, QObject* ) */ pStylesToolButton( const QString& textFormat, QWidget* parent = 0 ); /*! \sa pStylesActionGroup::isCheckable() */ bool isCheckableActions() const; /*! \sa pStylesActionGroup::currentStyle() */ QString currentStyle() const; /*! \sa pStylesActionGroup::systemAction() */ QAction* systemAction() const; /*! \sa pStylesActionGroup::applicationAction() */ QAction* applicationAction() const; /*! \sa pStylesActionGroup::systemStyle() */ QString systemStyle() const; /*! \sa pStylesActionGroup::applicationStyle() */ QString applicationStyle() const; public slots: /*! \sa pStylesActionGroup::setCheckable( bool ) */ void setCheckableActions( bool checkable ); /*! \sa pStylesActionGroup::setCurrentStyle( const QString& ) */ void setCurrentStyle( const QString& style ); protected: QMenu* mMenu; pStylesActionGroup* mActions; void init( const QString& textFormat ); signals: /*! \sa pStylesActionGroup::styleSelected( const QString& ); */ void styleSelected( const QString& style ); }; #endif // PSTYLESTOOLBUTTON_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/stylemanager/pStylesActionGroup.cpp0000644000175000017520000001123711546156115026226 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pStylesActionGroup.cpp ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pStylesActionGroup.h" #include "actionmanager/pActionsNodeMenuBar.h" #include #include #include pStylesActionGroup::pStylesActionGroup( QObject* parent ) : QActionGroup( parent ) { init( QLatin1String( "%1" ) ); } pStylesActionGroup::pStylesActionGroup( const QString& textFormat, QObject* parent ) : QActionGroup( parent ) { init( textFormat ); } bool pStylesActionGroup::isCheckable() const { return mCheckable; } QString pStylesActionGroup::currentStyle() const { return checkedAction() ? checkedAction()->data().toString() : systemStyle(); } QAction* pStylesActionGroup::systemAction() const { return mActions.value( systemStyle().toLower() ); } QAction* pStylesActionGroup::applicationAction() const { return mActions.value( applicationStyle().toLower() ); } QString pStylesActionGroup::systemStyle() const { return mSystemStyle; } QString pStylesActionGroup::applicationStyle() const { return QApplication::style()->objectName(); } void pStylesActionGroup::installInMenuBar( pActionsNodeMenuBar* menuBar, const QString& path ) { foreach ( QAction* action, mActions ) { menuBar->addAction( QString( "%1/%2" ).arg( path ).arg( action->objectName() ), action ); } } void pStylesActionGroup::installInMenu( QMenu* menu ) { menu->addActions( mActions.values() ); } void pStylesActionGroup::setCheckable( bool checkable ) { mCheckable = checkable; foreach ( QAction* action, mActions ) { action->setCheckable( mCheckable ); } } void pStylesActionGroup::setCurrentStyle( const QString& style ) { QAction* action = mActions.value( style.toLower() ); if ( action ) { action->setChecked( true ); } } void pStylesActionGroup::init( const QString& textFormat ) { mSystemStyle = QApplication::style()->objectName(); mCheckable = true; mTextFormat = textFormat; updateActions(); connect( this, SIGNAL( triggered( QAction* ) ), this, SLOT( actionTriggered( QAction* ) ) ); } void pStylesActionGroup::updateActions() { const QString curStyle = currentStyle().toLower(); qDeleteAll( mActions.values() ); mActions.clear(); // Add style actions const QStringList styles = QStyleFactory::keys(); const QStringList::const_iterator cend = styles.constEnd(); // Make sure ObjectName is unique in case toolbar solution is used. QString objNamePrefix = QLatin1String( "__qt_designer_style_" ); // Create styles. Set style name string as action data. for ( QStringList::const_iterator it = styles.constBegin(); it != cend ;++it ) { QAction* action = new QAction( this ); QString objName = objNamePrefix; objName += ( *it ).toLower().replace( ' ', '_' ); QString text = mTextFormat.arg( *it ); if ( QString::compare( ( *it ), mSystemStyle, Qt::CaseInsensitive ) == 0 ) { text.append( tr( "(System)" ).prepend( " " ) ); } action->setObjectName( objName ); action->setData( ( *it ).toLower() ); action->setText( text ); action->setCheckable( true ); action->setChecked( ( *it ).toLower() == curStyle ); mActions[ ( *it ).toLower() ] = action; addAction( action ); connect( action, SIGNAL( toggled( bool ) ), this, SLOT( actionToggled( bool ) ) ); } } void pStylesActionGroup::actionToggled( bool checked ) { if ( mCheckable && checked ) { QAction* action = qobject_cast( sender() ); emit styleSelected( action->data().toString() ); } } void pStylesActionGroup::actionTriggered( QAction* action ) { if ( !mCheckable ) { emit styleSelected( action->data().toString() ); } } ./qwbfsmanager-1.2.1-src/fresh/src/gui/stylemanager/pStylesToolButton.cpp0000644000175000017520000000542511546156115026107 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pStylesToolButton.cpp ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pStylesToolButton.h" #include "pStylesActionGroup.h" #include pStylesToolButton::pStylesToolButton( QWidget* parent ) : QToolButton( parent ) { init( QLatin1String( "%1" ) ); } pStylesToolButton::pStylesToolButton( const QString& textFormat, QWidget* parent ) : QToolButton( parent ) { init( textFormat ); } bool pStylesToolButton::isCheckableActions() const { return mActions->isCheckable(); } QString pStylesToolButton::currentStyle() const { return mActions->currentStyle(); } QAction* pStylesToolButton::systemAction() const { return mActions->systemAction(); } QAction* pStylesToolButton::applicationAction() const { return mActions->applicationAction(); } QString pStylesToolButton::systemStyle() const { return mActions->systemStyle(); } QString pStylesToolButton::applicationStyle() const { return mActions->applicationStyle(); } void pStylesToolButton::setCheckableActions( bool checkable ) { mActions->setCheckable( checkable ); } void pStylesToolButton::setCurrentStyle( const QString& style ) { mActions->setCurrentStyle( style ); } void pStylesToolButton::init( const QString& textFormat ) { mActions = new pStylesActionGroup( textFormat, this ); mMenu = new QMenu( this ); //mActions->updateActions(); mActions->installInMenu( mMenu ); setMenu( mMenu ); setText( mActions->systemAction()->text() ); setPopupMode( QToolButton::MenuButtonPopup ); connect( this, SIGNAL( clicked() ), mActions->systemAction(), SLOT( trigger() ) ); connect( mActions, SIGNAL( styleSelected(const QString& ) ), this, SIGNAL( styleSelected(const QString& ) ) ); } ./qwbfsmanager-1.2.1-src/fresh/src/gui/pFileDialog.h0000644000175000017520000003051511546156115021541 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pFileDialog.h ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PFILEDIALOG_H #define PFILEDIALOG_H /*! \file pFileDialog.h \brief An extended QFileDialog. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include #include #include class QGridLayout; class QLabel; class QComboBox; class QCheckBox; typedef QMap pFileDialogResult; /*! \ingroup FreshGui \class pFileDialog \brief An extended QFileDialog. This file dialog add support for some new features like Text Codec choosing, Open in read only mode. The results are stocked in a dedicated structure that can be read using \a pFileDialog::Property. */ class FRESH_EXPORT pFileDialog : public QFileDialog { Q_OBJECT public: /*! Thie enumeration represent the possible properties to query. */ enum Property { TextCodec = 0, /*!< The text codec choosed by user (QString). */ OpenReadOnly, /*!< The open in read only state (bool). */ Directory, /*!< The directory choosed by the user (QString). */ FileName, /*!< The file name choosed by the user (QString) */ FileNames, /*!< The file names choosed by the user (QStringList). */ SelectedFilter /*!< The selected filter choosed by the user (QString). */ }; /*! Create an instance of the file dialog having parent \a parent and window title \a caption. Depending the QFileDialog::FileMode \a directory will represent the default path or file path. The selected filter will be \a filter. The text codec choice and read only state will be enabled according to \a textCodecEnabled and \a openReadOnlyEnabled. */ pFileDialog( QWidget* parent = 0, const QString& caption = QString::null, const QString& directory = QString::null, const QString& filter = QString::null, bool textCodecEnabled = true, bool openReadOnlyEnabled = false ); /*! Return the current text codec. */ QString textCodec() const; /*! Set the current text codec to \a codec. */ void setTextCodec( const QString& codec ); /*! Return true if the text codec choice is enabled, else false. */ bool textCodecEnabled() const; /*! Enable the text codec choice according to \a enabled. */ void setTextCodecEnabled( bool enabled ); /*! Return true if open in read only is checked, else false. */ bool openReadOnly() const; /*! Set the open in read only check state according to \a readOnly. */ void setOpenReadOnly( bool readOnly ); /*! Return true if the open in read only mode is enabled, else false. */ bool openReadOnlyEnabled() const; /*! Return true if the open in read only mode is enabled, else false. */ void setOpenReadOnlyEnabled( bool enabled ); /*! This is a convenience static function that will return an existing directory selected by the user. \code QString dir = pFileDialog::getExistingDirectory( this, tr( "Open Directory" ), "/home", false, false, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks ); \endcode This function creates a modal file dialog with the given \a parent widget. If parent is not 0, the dialog will be shown centered over the parent widget. The dialog's working directory is set to \a dir, and the caption is set to \a caption. Either of these may be an empty string in which case the current directory and a default caption will be used respectively. The options argument holds various options about how to run the dialog, see the QFileDialog::Option enum for more information on the flags you can pass. To ensure a native file dialog, ShowDirsOnly must be set. \note This use a QFileDialog so the native dialog will never be shown even when asking the correct flag for that. On Windows if \a parent is not 0 then it will position the dialog just below the parent's title bar. On Unix/X11, the normal behavior of the file dialog is to resolve and follow symlinks. For example, if /usr/tmp is a symlink to /var/tmp, the file dialog will change to /var/tmp after entering /usr/tmp. If options includes DontResolveSymlinks, the file dialog will treat symlinks as regular directories. \sa getOpenFileName(), getOpenFileNames(), and getSaveFileName(). */ static pFileDialogResult getExistingDirectory( QWidget* parent = 0, const QString& caption = QString::null, const QString& dir = QString::null, bool enabledTextCodec = true, bool enabledOpenReadOnly = true, QFileDialog::Options options = QFileDialog::ShowDirsOnly ); /*! This is a convenience static function that returns an existing file selected by the user. \code QString fileName = pFileDialog::getOpenFileName( this, tr( "Open File" ), "/home", tr( "Images (*.png *.xpm *.jpg)" ), true, true, QString::null, 0 ); \endcode The function creates a modal file dialog with the given \a parent widget. If \a parent is not 0, the dialog will be shown centered over the parent widget. The file dialog's working directory will be set to \a dir. If \a dir includes a file name, the file will be selected. Only files that match the given \a filter are shown. The filter selected is set to \a selectedFilter. The parameters \a dir, \a selectedFilter, and \a filter may be empty strings. If you want multiple filters, separate them with ';;', for example: \code "Images (*.png *.xpm *.jpg);;Text files (*.txt);;XML files (*.xml)" \endcode The \a options argument holds various options about how to run the dialog, see the QFileDialog::Option enum for more information on the flags you can pass. The dialog's caption is set to \a caption. If \a caption is not specified then a default caption will be used. \note This use a QFileDialog so the native dialog will never be shown even when asking the correct flag for that. On Windows if \a parent is not 0 then it will position the dialog just below the parent's title bar. On Unix/X11, the normal behavior of the file dialog is to resolve and follow symlinks. For example, if /usr/tmp is a symlink to /var/tmp, the file dialog will change to /var/tmp after entering /usr/tmp. If options includes DontResolveSymlinks, the file dialog will treat symlinks as regular directories. \sa getOpenFileNames(), getSaveFileName(), and getExistingDirectory(). */ static pFileDialogResult getOpenFileName( QWidget* parent = 0, const QString& caption = QString::null, const QString& dir = QString::null, const QString& filter = QString::null, bool enabledTextCodec = true, bool enabledOpenReadOnly = true, const QString& selectedFilter = QString::null, QFileDialog::Options options = 0 ); /*! This is a convenience static function that will return one or more existing files selected by the user. \code QStringList files = pFileDialog::getOpenFileNames( this, tr( "Select one or more files to open" ), "/home", tr( "Images (*.png *.xpm *.jpg)" ), true, true, QString::null, 0 ); \endcode This function creates a modal file dialog with the given \a parent widget. If \a parent is not 0, the dialog will be shown centered over the parent widget. The file dialog's working directory will be set to \a dir. If \a dir includes a file name, the file will be selected. The filter is set to \a filter so that only those files which match the filter are shown. The filter selected is set to \a selectedFilter. The parameters \a dir, \a selectedFilter and \a filter may be empty strings. If you need multiple filters, separate them with ';;', for instance: \code "Images (*.png *.xpm *.jpg);;Text files (*.txt);;XML files (*.xml)" \endcode The dialog's caption is set to \a caption. If \a caption is not specified then a default caption will be used. \note This use a QFileDialog so the native dialog will never be shown even when asking the correct flag for that. On Windows if \a parent is not 0 then it will position the dialog just below the parent's title bar. On Unix/X11, the normal behavior of the file dialog is to resolve and follow symlinks. For example, if /usr/tmp is a symlink to /var/tmp, the file dialog will change to /var/tmp after entering /usr/tmp. The options argument holds various options about how to run the dialog, see the QFileDialog::Option enum for more information on the flags you can pass. \sa getOpenFileName(), getSaveFileName(), and getExistingDirectory(). */ static pFileDialogResult getOpenFileNames( QWidget* parent = 0, const QString& caption = QString::null, const QString& dir = QString::null, const QString& filter = QString::null, bool enabledTextCodec = true, bool enabledOpenReadOnly = true, const QString& selectedFilter = QString::null, QFileDialog::Options options = 0 ); /*! This is a convenience static function that will return a file name selected by the user. The file does not have to exist. It creates a modal file dialog with the given \a parent widget. If \a parent is not 0, the dialog will be shown centered over the parent widget. \code QString fileName = pFileDialog::getSaveFileName( this, tr( "Save File" ), "/home/jana/untitled.png", tr( "Images (*.png *.xpm *.jpg)" ), true, QString::null, 0 ); \endcode The file dialog's working directory will be set to \a dir. If \a dir includes a file name, the file will be selected. Only files that match the \a filter are shown. The filter selected is set to \a selectedFilter. The parameters \a dir, \a selectedFilter, and \a filter may be empty strings. Multiple filters are separated with ';;'. For instance: \code "Images (*.png *.xpm *.jpg);;Text files (*.txt);;XML files (*.xml)" \endcode The \æ options argument holds various options about how to run the dialog, see the QFileDialog::Option enum for more information on the flags you can pass. The default filter can be chosen by setting \a selectedFilter to the desired value. The dialog's caption is set to \a caption. If \a caption is not specified, a default caption will be used. \note This use a QFileDialog so the native dialog will never be shown even when asking the correct flag for that. On Windows if parent is not 0 then it will position the dialog just below the parent's title bar. On Unix/X11, the normal behavior of the file dialog is to resolve and follow symlinks. For example, if /usr/tmp is a symlink to /var/tmp, the file dialog will change to /var/tmp after entering /usr/tmp. If \a options includes DontResolveSymlinks the file dialog will treat symlinks as regular directories. \sa getOpenFileName(), getOpenFileNames(), and getExistingDirectory(). */ static pFileDialogResult getSaveFileName( QWidget* parent = 0, const QString& caption = QString::null, const QString& dir = QString::null, const QString& filter = QString::null, bool enabledTextCodec = true, const QString& selectedFilter = QString::null, QFileDialog::Options options = 0 ); protected: QGridLayout* glDialog; bool mTextCodecEnabled; QLabel* lCodec; QComboBox* cbCodec; bool mOpenReadOnlyEnabled; QCheckBox* cbOpenReadOnly; static void setDialog( pFileDialog* dlg, const QString& caption, const QString& dir, const QString& filter, bool enabledTextCodec, bool enabledOpenReadOnly, const QString& selectedFilter, QFileDialog::FileMode mode, QFileDialog::Options options ); }; #endif // PFILEDIALOG_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/pLineEdit.cpp0000644000175000017520000001267211546156115021576 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pLineEdit.cpp ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pLineEdit.h" #include "pIconManager.h" #include #include #include #include #include #include const int pLineEdit::mTimeOut = 1000; pLineEdit::pLineEdit( QWidget* parent ) : QLineEdit( parent ) { init(); } pLineEdit::pLineEdit( const QString& contents, QWidget* parent ) : QLineEdit( contents, parent ) { init(); } QMenu* pLineEdit::menu() const { return tbSearch->menu(); } void pLineEdit::setMenu( QMenu* menu ) { tbSearch->setMenu( menu ); } bool pLineEdit::isSearchButtonVisible() const { return tbSearch->isVisible(); } QString pLineEdit::promptText() const { return mPromptText; } void pLineEdit::setSearchButtonVisible( bool visible ) { tbSearch->setVisible( visible ); int left; int top; int right; int bottom; getTextMargins( &left, &top, &right, &bottom ); if ( visible ) { left = mMargin +mSpacing; } else { left = 0; } setTextMargins( left, top, right, bottom ); } void pLineEdit::setPromptText( const QString& prompt ) { mPromptText = prompt; update(); } void pLineEdit::clickSearchButton() { tbSearch->click(); } void pLineEdit::clickClearButton() { tbClear->click(); } void pLineEdit::paintEvent( QPaintEvent* event ) { QLineEdit::paintEvent( event ); if ( !mPromptText.isEmpty() && text().isEmpty() && isEnabled() ) { QStyleOptionFrameV3 option; initStyleOption( &option ); int left; int top; int right; int bottom; getTextMargins( &left, &top, &right, &bottom ); const Qt::Alignment va = style()->visualAlignment( layoutDirection(), alignment() ); const QRect rect = style()->subElementRect( QStyle::SE_LineEditContents, &option, this ).adjusted( 2, 0, 0, 0 ).adjusted( left, top, -right, -bottom ); const QFontMetrics fm( font() ); const QString text = fm.elidedText( mPromptText, Qt::ElideRight, rect.width() ); QPainter painter( this ); painter.setPen( palette().color( QPalette::Disabled, QPalette::Text ) ); painter.drawText( rect, va, text ); } } void pLineEdit::resizeEvent( QResizeEvent* event ) { QLineEdit::resizeEvent( event ); tbSearch->resize( QSize( mMargin, height() -2 ) ); tbSearch->move( 3, 1 ); tbClear->resize( QSize( mMargin, height() -2 ) ); tbClear->move( width() -mMargin -3, 0 ); } void pLineEdit::init() { mMargin = sizeHint().height() -2; mSpacing = 0; tbSearch = new QToolButton( this ); tbSearch->setIcon( pIconManager::icon( "search.png", ":/fresh" ) ); tbSearch->setToolTip( tr( "Search Options" ) ); tbSearch->setStyleSheet( "QToolButton { border: none; padding: 0px; } QToolButton::menu-indicator { right: -2px; bottom: -2px; }" ); tbSearch->setCursor( Qt::ArrowCursor ); tbSearch->setFocusPolicy( Qt::NoFocus ); tbSearch->setPopupMode( QToolButton::InstantPopup ); tbClear = new QToolButton( this ); tbClear->setIcon( pIconManager::icon( "edit-clear-rtl.png", ":/fresh" ) ); tbClear->setToolTip( tr( "Clear" ) ); tbClear->setStyleSheet( "QToolButton { border: none; padding: 0px; }" ); tbClear->setCursor( Qt::ArrowCursor ); tbClear->setFocusPolicy( Qt::NoFocus ); setSearchButtonVisible( true ); setClearButtonVisible( false ); setPromptText( "Search..." ); mTimer = new QTimer( this ); mTimer->setInterval( mTimeOut ); mTimer->setSingleShot( true ); connect( this, SIGNAL( textChanged( const QString& ) ), this, SLOT( _q_textChanged( const QString& ) ) ); connect( tbSearch, SIGNAL( clicked() ), this, SIGNAL( searchButtonClicked() ) ); connect( tbSearch, SIGNAL( triggered( QAction* ) ), this, SIGNAL( searchButtonActionTriggered( QAction* ) ) ); connect( tbClear, SIGNAL( clicked() ), this, SLOT( clear() ) ); connect( tbClear, SIGNAL( clicked() ), this, SIGNAL( clearButtonClicked() ) ); connect( mTimer, SIGNAL( timeout() ), this, SLOT( timer_timeout() ) ); } void pLineEdit::setClearButtonVisible( bool visible ) { tbClear->setVisible( visible ); int left; int top; int right; int bottom; getTextMargins( &left, &top, &right, &bottom ); if ( visible ) { right = mMargin +mSpacing; } else { right = 0; } setTextMargins( left, top, right, bottom ); } void pLineEdit::_q_textChanged( const QString& text ) { setClearButtonVisible( !text.isEmpty() ); mTimer->start(); } void pLineEdit::timer_timeout() { emit searchTextChanged( text() ); } ./qwbfsmanager-1.2.1-src/fresh/src/gui/pColorButton.cpp0000644000175000017520000000500311546156115022341 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pColorButton.cpp ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pColorButton.h" #include "pGuiUtils.h" #include pColorButton::pColorButton( QWidget* parent ) : QToolButton( parent ) { init( QColor( Qt::black ) ); } pColorButton::pColorButton( const QColor& color, QWidget* parent ) : QToolButton( parent ) { init( color ); } void pColorButton::init( const QColor& color ) { connect( this, SIGNAL( clicked() ), this, SLOT( _q_clicked() ) ); setIconSize( QSize( 16, 16 ) ); setColor( color ); } QColor pColorButton::color() const { return mColor; } void pColorButton::setColor( const QColor& color ) { mColor = color; const QStringList texts = QStringList() << QString( "RGBA #%1%2%3%4" ).arg( mColor.red(), 2, 16, QChar( '0' ) ).arg( mColor.green(), 2, 16, QChar( '0' ) ).arg( mColor.blue(), 2, 16, QChar( '0' ) ).arg( mColor.alpha(), 2, 16, QChar( '0' ) ) << QString( "RGBA %1, %2, %3, %4" ).arg( mColor.red() ).arg( mColor.green() ).arg( mColor.blue() ).arg( mColor.alpha() ) ; setText( texts.first() ); setToolTip( texts.join( "\n" ) ); setIcon( QIcon( pGuiUtils::filledPixmap( mColor, iconSize() ) ) ); emit colorChanged( mColor ); } void pColorButton::_q_clicked() { const QColor color = QColorDialog::getColor( mColor, window(), tr( "Choose a color" ), QColorDialog::ShowAlphaChannel ); if ( color.isValid() ) { setColor( color ); } } ./qwbfsmanager-1.2.1-src/fresh/src/gui/pFileDialog.cpp0000644000175000017520000002150511546156115022073 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pFileDialog.cpp ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pFileDialog.h" #include "pCoreUtils.h" #include #include #include #include #include #include #include pFileDialog::pFileDialog( QWidget* parent, const QString& caption, const QString& directory, const QString& filter, bool textCodecEnabled, bool openReadOnlyEnabled ) : QFileDialog( parent, caption, directory, filter ) { setFileMode( QFileDialog::AnyFile ); setOption( QFileDialog::DontUseNativeDialog ); // get grid layout glDialog = qobject_cast( layout() ); // assert on gridlayout Q_ASSERT( glDialog ); // relook the dialog to be more friendly QLabel* lLookIn = findChild( "lookInLabel" ); QComboBox* cbLookIn = findChild( "lookInCombo" ); QToolButton* tbNewFolder = findChild( "newFolderButton" ); QAbstractItemView* sidebar = findChild( "sidebar" ); QFrame* fFrame = findChild( "frame" ); QBoxLayout* hLayout = 0; // search layout containing tbNewFolder foreach ( QLayout* layout, findChildren() ) { if ( layout->indexOf( tbNewFolder ) != -1 ) { hLayout = qobject_cast( layout ); break; } } if ( lLookIn ) { lLookIn->setVisible( false ); } if ( hLayout ) { hLayout->setSpacing( 3 ); hLayout->insertStretch( hLayout->indexOf( tbNewFolder ) ); } if ( cbLookIn && fFrame ) { QBoxLayout* vLayout = qobject_cast( fFrame->layout() ); if ( vLayout ) { vLayout->setSpacing( 3 ); vLayout->insertWidget( 0, cbLookIn ); if ( hLayout ) { glDialog->removeItem( hLayout ); hLayout->setParent( 0 ); vLayout->insertLayout( 0, hLayout ); } } } if ( sidebar ) { QWidget* viewport = sidebar->viewport(); QPalette pal = viewport->palette(); pal.setColor( viewport->backgroundRole(), QColor( Qt::transparent ) ); viewport->setPalette( pal ); sidebar->setFrameStyle( QFrame::NoFrame | QFrame::Plain ); sidebar->setIconSize( QSize( 16, 16 ) ); } // text codec mTextCodecEnabled = true; lCodec = new QLabel( tr( "Codec:" ), this ); cbCodec = new QComboBox( this ); cbCodec->addItems( pCoreUtils::textCodecs() ); setTextCodec( QTextCodec::codecForLocale()->name() ); glDialog->addWidget( lCodec, 4, 0 ); glDialog->addWidget( cbCodec, 4, 1 ); // read only mOpenReadOnlyEnabled = true; cbOpenReadOnly = new QCheckBox( tr( "Open in read only." ), this ); glDialog->addWidget( cbOpenReadOnly, 5, 1 ); // configuration setTextCodecEnabled( textCodecEnabled ); setOpenReadOnlyEnabled( openReadOnlyEnabled ); } QString pFileDialog::textCodec() const { return cbCodec->currentText(); } void pFileDialog::setTextCodec( const QString& codec ) { cbCodec->setCurrentIndex( cbCodec->findText( codec ) ); } bool pFileDialog::textCodecEnabled() const { return mTextCodecEnabled; } void pFileDialog::setTextCodecEnabled( bool enabled ) { mTextCodecEnabled = enabled; lCodec->setEnabled( enabled ); lCodec->setVisible( enabled ); cbCodec->setEnabled( enabled ); cbCodec->setVisible( enabled ); } bool pFileDialog::openReadOnly() const { return cbOpenReadOnly->isChecked(); } void pFileDialog::setOpenReadOnly( bool readOnly ) { cbOpenReadOnly->setChecked( readOnly ); } bool pFileDialog::openReadOnlyEnabled() const { return mOpenReadOnlyEnabled; } void pFileDialog::setOpenReadOnlyEnabled( bool enabled ) { mOpenReadOnlyEnabled = enabled; cbOpenReadOnly->setEnabled( enabled ); cbOpenReadOnly->setVisible( enabled ); } void pFileDialog::setDialog( pFileDialog* dlg, const QString& caption, const QString& dir, const QString& filter, bool enabledTextCodec, bool enabledOpenReadOnly, const QString& selectedFilter, QFileDialog::FileMode mode, QFileDialog::Options options ) { #if defined( Q_OS_MAC ) && QT_VERSION < 0x040500 if ( !options.testFlag( QFileDialog::DontUseSheet ) ) { // that's impossible to have a sheet in a sheet QWidget* parent = dlg->parentWidget(); if ( parent && !parent->windowFlags().testFlag( Qt::Sheet ) ) { dlg->setWindowFlags( dlg->windowFlags() | Qt::Sheet ); } } #endif // dialog settings dlg->setWindowTitle( caption ); dlg->setFileMode( mode ); dlg->setDirectory( dir.isEmpty() ? QDir::currentPath() : dir ); dlg->setTextCodecEnabled( enabledTextCodec ); dlg->setOpenReadOnlyEnabled( enabledOpenReadOnly ); dlg->setOptions( options ); switch ( mode ) { case QFileDialog::Directory: case QFileDialog::DirectoryOnly: case QFileDialog::ExistingFile: case QFileDialog::ExistingFiles: dlg->setAcceptMode( AcceptOpen ); break; case QFileDialog::AnyFile: dlg->setAcceptMode( AcceptSave ); break; } // set filters if needed if ( !filter.isEmpty() ) { dlg->setNameFilter( filter ); } // select file if needed ) if ( !dir.isEmpty() ) { dlg->selectFile( dir ); } // select correct filter if needed if ( !selectedFilter.isEmpty() ) { dlg->selectNameFilter( selectedFilter ); } } pFileDialogResult pFileDialog::getExistingDirectory( QWidget* parent, const QString& caption, const QString& dir, bool enabledTextCodec, bool enabledOpenReadOnly, QFileDialog::Options options ) { pFileDialogResult result; pFileDialog fd( parent ); setDialog( &fd, caption, dir, QString::null, enabledTextCodec, enabledOpenReadOnly, QString::null, QFileDialog::Directory, options ); if ( fd.exec() == QDialog::Accepted ) { result[ pFileDialog::Directory ] = fd.selectedFiles().value( 0 ); result[ pFileDialog::TextCodec ] = fd.textCodec(); result[ pFileDialog::OpenReadOnly ] = fd.openReadOnly(); } return result; } pFileDialogResult pFileDialog::getOpenFileName( QWidget* parent, const QString& caption, const QString& dir, const QString& filter, bool enabledTextCodec, bool enabledOpenReadOnly, const QString& selectedFilter, QFileDialog::Options options ) { pFileDialogResult result; pFileDialog fd( parent ); setDialog( &fd, caption, dir, filter, enabledTextCodec, enabledOpenReadOnly, selectedFilter, QFileDialog::ExistingFile, options ); if ( fd.exec() == QDialog::Accepted ) { result[ pFileDialog::FileName ] = fd.selectedFiles().value( 0 ); result[ pFileDialog::TextCodec ] = fd.textCodec(); result[ pFileDialog::OpenReadOnly ] = fd.openReadOnly(); result[ pFileDialog::SelectedFilter ] = fd.selectedFilter(); } return result; } pFileDialogResult pFileDialog::getOpenFileNames( QWidget* parent, const QString& caption, const QString& dir, const QString& filter, bool enabledTextCodec, bool enabledOpenReadOnly, const QString& selectedFilter, QFileDialog::Options options ) { pFileDialogResult result; pFileDialog fd( parent ); setDialog( &fd, caption, dir, filter, enabledTextCodec, enabledOpenReadOnly, selectedFilter, QFileDialog::ExistingFiles, options ); if ( fd.exec() == QDialog::Accepted ) { result[ pFileDialog::FileNames ] = fd.selectedFiles(); result[ pFileDialog::TextCodec ] = fd.textCodec(); result[ pFileDialog::OpenReadOnly ] = fd.openReadOnly(); result[ pFileDialog::SelectedFilter ] = fd.selectedFilter(); } return result; } pFileDialogResult pFileDialog::getSaveFileName( QWidget* parent, const QString& caption, const QString& dir, const QString& filter, bool enabledTextCodec, const QString& selectedFilter, QFileDialog::Options options ) { pFileDialogResult result; pFileDialog fd( parent ); setDialog( &fd, caption, dir, filter, enabledTextCodec, false, selectedFilter, QFileDialog::AnyFile, options ); if ( fd.exec() == QDialog::Accepted ) { result[ pFileDialog::FileName ] = fd.selectedFiles().value( 0 ); result[ pFileDialog::TextCodec ] = fd.textCodec(); result[ pFileDialog::OpenReadOnly ] = fd.openReadOnly(); result[ pFileDialog::SelectedFilter ] = fd.selectedFilter(); } return result; } ./qwbfsmanager-1.2.1-src/fresh/src/gui/pGuiUtils.cpp0000644000175000017520000001145411546156115021643 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pGuiUtils.cpp ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pGuiUtils.h" #include #include #include #include #include #define Q_MAXIMIZED_WINDOW_GEOMETRY QRect( QPoint( -1, -1 ), QSize( -1, -1 ) ) QPixmap pGuiUtils::filledPixmap( const QColor& color, const QSize& size ) { const QString key = QString( "pGuiUtils::filledPixmap-%1-%2-%3-%4" ) .arg( color.name() ).arg( color.alpha() ) .arg( size.width() ).arg( size.height() ); QPixmap pixmap; if ( !QPixmapCache::find( key, pixmap ) ) { pixmap = QPixmap( size ); pixmap.fill( color ); if ( !QPixmapCache::insert( key, pixmap ) ) { qWarning() << Q_FUNC_INFO << "Can't cache pixmap" << color << size; } } return pixmap; } QString pGuiUtils::cacheKey( const QString& key, const QSize& size ) { return QString( "%1-%2-%3" ).arg( key ).arg( size.width() ).arg( size.height() );; } QPixmap pGuiUtils::scaledPixmap( const QString& filePath, const QSize& size ) { const QString key = cacheKey( filePath, size ); QPixmap pixmap; if ( !QPixmapCache::find( key, pixmap ) ) { if ( pixmap.load( filePath ) ) { if ( size != QSize() ) { pixmap = pixmap.scaled( size, Qt::KeepAspectRatio, Qt::SmoothTransformation ); } if ( !QPixmapCache::insert( key, pixmap ) ) { qWarning() << Q_FUNC_INFO << "Can't cache pixmap" << filePath; } } else { qWarning() << Q_FUNC_INFO << "Pixmap not exists" << filePath; } } return pixmap; } QPixmap pGuiUtils::scaledPixmap( const QPixmap& _pixmap, const QString& _key, const QSize& size ) { const QString key = cacheKey( _key, size ); QPixmap pixmap; if ( !QPixmapCache::find( key, pixmap ) ) { if ( !_pixmap.isNull() ) { if ( size != QSize() ) { pixmap = _pixmap.scaled( size, Qt::KeepAspectRatio, Qt::SmoothTransformation ); } else { pixmap = _pixmap; } if ( !QPixmapCache::insert( key, pixmap ) ) { qWarning() << Q_FUNC_INFO << "Can't cache pixmap" << key; } } else { qWarning() << Q_FUNC_INFO << "Pixmap invalid" << key; } } return pixmap; } QMargins pGuiUtils::frameMargins( QWidget* window ) { Q_ASSERT( window ); const QRect fg = window->frameGeometry(); const QRect g = window->geometry(); QMargins margins; margins.setLeft( g.left() -fg.left() ); margins.setTop( g.top() -fg.top() ); margins.setRight( fg.right() -g.right() ); margins.setBottom( fg.bottom() -g.bottom() ); return margins; } QRect pGuiUtils::saveGeometry( QWidget* window ) { Q_ASSERT( window ); const QMargins margins = frameMargins( window ); QRect geometry = QRect( window->pos(), window->frameGeometry() .adjusted( margins.left(), margins.top(), -margins.right(), -margins.bottom() ).size() ); if ( window->isMaximized() #if defined( Q_OS_MAC ) || ( window == window->window() && window->frameGeometry().size() == QApplication::desktop()->availableGeometry( window ).size() && window->pos().x() == 0 && window->pos().y() <= 0 ) #endif ) { geometry = Q_MAXIMIZED_WINDOW_GEOMETRY; } /*qWarning() << "Saving" << window->frameGeometry() << window->geometry() << window->pos() << window->size() << geometry << margins ;*/ return geometry; } void pGuiUtils::restoreGeometry( QWidget* window, const QRect& geometry ) { Q_ASSERT( window ); if ( geometry == Q_MAXIMIZED_WINDOW_GEOMETRY ) { window->showMaximized(); } else if ( !geometry.isNull() ) { #if defined( Q_OS_MAC ) window->showMaximized(); #endif window->resize( geometry.size() ); window->move( geometry.topLeft() ); } /*qWarning() << "Restoring" << window->frameGeometry() << window->geometry() << window->pos() << window->size() << geometry ;*/ } ./qwbfsmanager-1.2.1-src/fresh/src/gui/Gui.h0000644000175000017520000000307111546156115020103 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : Gui.h ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ /*! \file Gui.h \brief This file only defined the description of the \ref FreshGui module. \author Filipe Azevedo aka Nox P\@sNox */ /*! \defgroup FreshGui FreshGui \brief The Fresh Gui module contains gui classes, structures, namespaces... To include Fresh Gui classes use: \code #include \endcode */ ./qwbfsmanager-1.2.1-src/fresh/src/gui/pKeySequenceEdit.cpp0000644000175000017520000000644611546156115023132 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pKeySequenceEdit.cpp ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pKeySequenceEdit.h" #include #include pKeySequenceEdit::pKeySequenceEdit( QWidget* parent ) : pLineEdit( parent ) { mFinished = true; setSearchButtonVisible( false ); setPromptText( tr( "Press a keybord shortcut..." ) ); } pKeySequenceEdit::pKeySequenceEdit( const QString& contents, QWidget* parent ) : pLineEdit( contents, parent ) { } void pKeySequenceEdit::keyPressEvent( QKeyEvent* event ) { // return if auto repeat if ( event->isAutoRepeat() ) { return; } // if user press something, sequence is not finished mFinished = false; // show current sequence setText( keySequence( event ) ); } void pKeySequenceEdit::keyReleaseEvent( QKeyEvent* event ) { // return if auto repeat if ( event->isAutoRepeat() ) { return; } // check if sequence is finished or not if ( mFinished ) { return; } // show current sequence setText( keySequence( event ) ); } QString pKeySequenceEdit::keySequence( QKeyEvent* event ) const { // is key pressed or key released ? const bool keyPressed = event->type() == QEvent::KeyPress; // or-ed keys int mKeys = 0; // check modifiers pressed if ( event->modifiers() & Qt::ControlModifier ) { mKeys |= Qt::ControlModifier; } if ( event->modifiers() & Qt::AltModifier ) { mKeys |= Qt::AltModifier; } if ( event->modifiers() & Qt::ShiftModifier ) { mKeys |= Qt::ShiftModifier; } if ( event->modifiers() & Qt::MetaModifier ) { mKeys |= Qt::MetaModifier; } if ( keyPressed ) { // get press key switch ( event->key() ) { // this keys can't be used case Qt::Key_Control: case Qt::Key_Alt: case Qt::Key_AltGr: case Qt::Key_Shift: case Qt::Key_Meta: case Qt::Key_Super_L: case Qt::Key_Super_R: case Qt::Key_Menu: case Qt::Key_Hyper_L: case Qt::Key_Hyper_R: case Qt::Key_Help: case Qt::Key_Direction_L: case Qt::Key_Direction_R: break; default: // add pressed key mKeys |= event->key(); // set sequence finished mFinished = true; break; } } // return human readable key sequence return QKeySequence( mKeys ).toString(); } ./qwbfsmanager-1.2.1-src/fresh/src/gui/pColorButton.h0000644000175000017520000000476611546156115022025 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pColorButton.h ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PCOLORBUTTON_H #define PCOLORBUTTON_H /*! \file pColorButton.h \brief A QToolButton that allow to choose a QColor. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include /*! \ingroup FreshGui \class pColorButton \brief A QToolButton that allow to choose a QColor. */ class FRESH_EXPORT pColorButton : public QToolButton { Q_OBJECT /*! \property pColorButton::color \brief the color shown on the button. If the button has no color, the color() function will return an anvalid QColor. The default color is Qt::black. */ Q_PROPERTY( QColor color READ color WRITE setColor NOTIFY colorChanged ) public: /*! Create an instance of button having parent \a parent. */ pColorButton( QWidget* parent = 0 ); /*! Create an instance of button having parent \a parent and initialized with \a color. */ pColorButton( const QColor& color, QWidget* parent = 0 ); /*! Return the color. */ QColor color() const; protected: QColor mColor; void init( const QColor& color ); public slots: /*! Set the color to \a color. */ void setColor( const QColor& color ); protected slots: void _q_clicked(); signals: /*! This signal is emited when the color has changed. */ void colorChanged( const QColor& color ); }; #endif // PCOLORBUTTON_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/dockwidget/0000755000175000017520000000000011546156115021331 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/fresh/src/gui/dockwidget/pDockWidgetTitleBar.cpp0000644000175000017520000002301311546156115025667 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pDockWidgetTitleBar.cpp ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pDockWidgetTitleBar.h" #include "pDockWidget.h" #include "pToolButton.h" #include "pGuiUtils.h" #include #include #include #include #include bool pDockWidgetTitleBar::mUseNativePaintDefault = true; pDockWidgetTitleBar::pDockWidgetTitleBar( QDockWidget* parent ) : QToolBar( parent ) { Q_ASSERT( parent ); mDock = parent; mUseNativePaint = mUseNativePaintDefault; // a fake spacer widget QWidget* spacer = new QWidget( this ); spacer->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Maximum ) ); tbOrientation = new pToolButton( this ); tbOrientation->installEventFilter( this ); tbFloat = new pToolButton( this ); tbFloat->installEventFilter( this ); tbClose = new pToolButton( this ); tbClose->installEventFilter( this ); addWidget( spacer ); aOrientation = addWidget( tbOrientation ); aFloat = addWidget( tbFloat ); aClose = addWidget( tbClose ); tbOrientation->setDefaultAction( aOrientation ); tbFloat->setDefaultAction( aFloat ); tbClose->setDefaultAction( aClose ); setMovable( false ); setFloatable( false ); updateStyleChange(); dockWidget_featuresChanged( mDock->features() ); connect( mDock, SIGNAL( featuresChanged( QDockWidget::DockWidgetFeatures ) ), this, SLOT( dockWidget_featuresChanged( QDockWidget::DockWidgetFeatures ) ) ); connect( aOrientation, SIGNAL( triggered() ), this, SLOT( aOrientation_triggered() ) ); connect( aFloat, SIGNAL( triggered() ), this, SLOT( aFloat_triggered() ) ); connect( aClose, SIGNAL( triggered() ), mDock, SLOT( close() ) ); } QIcon pDockWidgetTitleBar::icon() const { QIcon icon = mDock->toggleViewAction()->icon(); if ( icon.isNull() ) { icon = mDock->windowIcon(); } if ( icon.isNull() ) { icon = toggleViewAction()->icon(); } if ( icon.isNull() ) { icon = windowIcon(); } if ( icon.isNull() ) { icon = window()->windowIcon(); } return icon; } QSize pDockWidgetTitleBar::windowIconSize() const { const int size = orientation() == Qt::Horizontal ? height() -2 : width() -2; return icon().isNull() ? QSize() : QSize( size, size ); } bool pDockWidgetTitleBar::event( QEvent* event ) { switch ( event->type() ) { case QEvent::StyleChange: updateStyleChange(); break; default: break; } return QToolBar::event( event ); } bool pDockWidgetTitleBar::eventFilter( QObject* object, QEvent* event ) { pToolButton* button = qobject_cast( object ); if ( button && event->type() == QEvent::Paint ) { QStyleOptionToolButton option; button->initStyleOption( &option ); option.icon = QIcon(); button->paint( &option ); QPainter painter( button ); button->icon().paint( &painter, button->rect(), Qt::AlignCenter, QIcon::Normal, QIcon::Off ); event->accept(); return true; } return QToolBar::eventFilter( object, event ); } void pDockWidgetTitleBar::paintEvent( QPaintEvent* event ) { Q_UNUSED( event ); QRect rect = this->rect(); QPainter painter( this ); // native background paint for not common style / native paint if ( ( mUseNativePaint || style()->inherits( "QMacStyle" ) || style()->inherits( "Oxygen::Style" ) ) && qobject_cast( mDock ) ) { QStyleOptionDockWidgetV2 optionDw; ((pDockWidget*)mDock)->initStyleOption( &optionDw ); optionDw.title.clear(); optionDw.closable = false; optionDw.floatable = false; optionDw.movable = false; optionDw.rect = rect; style()->drawControl( QStyle::CE_DockWidgetTitle, &optionDw, &painter, mDock ); } // custom background else { QColor topColor = palette().color( QPalette::Highlight ).lighter( 130 ); QColor bottomColor = palette().color( QPalette::Highlight ).darker( 130 ); QLinearGradient gradient( rect.topLeft(), rect.bottomLeft() ); topColor.setAlphaF( .7 ); bottomColor.setAlphaF( .7 ); gradient.setColorAt( 0, topColor ); gradient.setColorAt( 1, bottomColor ); if ( mDock->features() & QDockWidget::DockWidgetVerticalTitleBar ) { gradient.setFinalStop( rect.topRight() ); } painter.setPen( Qt::NoPen ); painter.setBrush( gradient ); painter.drawRect( rect ); painter.setPen( bottomColor.darker( 130 ) ); painter.setBrush( Qt::NoBrush ); painter.drawRect( rect.adjusted( 0, 0, -1, -1 ) ); } if ( mDock->features() & QDockWidget::DockWidgetVerticalTitleBar ) { QTransform transform; rect.setSize( QSize( rect.height(), rect.width() ) ); transform.rotate( -90 ); transform.translate( -rect.width(), 0 ); painter.setTransform( transform ); } // icon / title QStyleOptionButton optionB; optionB.initFrom( mDock ); optionB.rect = rect.adjusted( 2, 0, -( orientation() == Qt::Horizontal ? minimumSizeHint().width() : minimumSizeHint().height() ), 0 ); optionB.text = mDock->windowTitle(); optionB.iconSize = windowIconSize(); optionB.icon = icon(); style()->drawControl( QStyle::CE_PushButtonLabel, &optionB, &painter, mDock ); } void pDockWidgetTitleBar::updateStyleChange() { setIconSize( QSize( 13, 13 ) ); layout()->setSpacing( 0 ); layout()->setMargin( 2 ); QIcon icon; icon = style()->standardIcon( QStyle::SP_TitleBarShadeButton, 0, widgetForAction( aOrientation ) ); aOrientation->setIcon( icon ); icon = style()->standardIcon( QStyle::SP_TitleBarNormalButton, 0, widgetForAction( aFloat ) ); aFloat->setIcon( icon ); icon = style()->standardIcon( QStyle::SP_TitleBarCloseButton, 0, widgetForAction( aClose ) ); aClose->setIcon( icon ); if ( orientation() == Qt::Horizontal ) { tbOrientation->setDirection( QBoxLayout::LeftToRight ); tbFloat->setDirection( QBoxLayout::LeftToRight ); tbClose->setDirection( QBoxLayout::LeftToRight ); } else { tbOrientation->setDirection( QBoxLayout::BottomToTop ); tbFloat->setDirection( QBoxLayout::BottomToTop ); tbClose->setDirection( QBoxLayout::BottomToTop ); } } QSize pDockWidgetTitleBar::minimumSizeHint() const { return QToolBar::sizeHint(); } QSize pDockWidgetTitleBar::sizeHint() const { const QSize wis = windowIconSize(); QSize size = QToolBar::sizeHint(); QFontMetrics fm( font() ); if ( mDock->features() & QDockWidget::DockWidgetVerticalTitleBar ) { size.rheight() += fm.width( mDock->windowTitle() ) +wis.width(); } else { size.rwidth() += fm.width( mDock->windowTitle() ) +wis.width(); } return size; } QWidget* pDockWidgetTitleBar::addAction( QAction* action, int index ) { if ( index != -1 ) { index++; } if ( index >= 0 && index < actions().count() ) { QToolBar::insertAction( actions().value( index ), action ); } else { QToolBar::addAction( action ); } return widgetForAction( action ); } void pDockWidgetTitleBar::addSeparator( int index ) { if ( index != -1 ) { index++; } if ( index >= 0 && index < actions().count() ) { QToolBar::insertSeparator( actions().value( index ) ); } else { QToolBar::addSeparator(); } } void pDockWidgetTitleBar::setNativeRendering( bool native ) { mUseNativePaint = native; update(); } bool pDockWidgetTitleBar::nativeRendering() const { return mUseNativePaint; } void pDockWidgetTitleBar::setDefaultNativeRendering( bool native ) { mUseNativePaintDefault = native; } bool pDockWidgetTitleBar::defaultNativeRendering() { return mUseNativePaintDefault; } void pDockWidgetTitleBar::aOrientation_triggered() { const QDockWidget::DockWidgetFeatures features = mDock->features(); if ( features & QDockWidget::DockWidgetVerticalTitleBar ) { mDock->setFeatures( features ^ QDockWidget::DockWidgetVerticalTitleBar ); } else { mDock->setFeatures( features | QDockWidget::DockWidgetVerticalTitleBar ); } } void pDockWidgetTitleBar::aFloat_triggered() { mDock->setFloating( !mDock->isFloating() ); } void pDockWidgetTitleBar::dockWidget_featuresChanged( QDockWidget::DockWidgetFeatures features ) { aFloat->setVisible( features & QDockWidget::DockWidgetFloatable ); aClose->setVisible( features & QDockWidget::DockWidgetClosable ); // update toolbar orientation if ( features & QDockWidget::DockWidgetVerticalTitleBar ) { if ( orientation() == Qt::Vertical ) { return; } setOrientation( Qt::Vertical ); } else { if ( orientation() == Qt::Horizontal ) { return; } setOrientation( Qt::Horizontal ); } // re-order the actions const QList actions = this->actions(); QList items; for ( int i = actions.count() -1; i > -1; i-- ) { items << actions.at( i ); } clear(); addActions( items ); updateStyleChange(); } ./qwbfsmanager-1.2.1-src/fresh/src/gui/dockwidget/pDockWidget.cpp0000644000175000017520000000602611546156115024245 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pDockWidget.cpp ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pDockWidget.h" #include "pDockWidgetTitleBar.h" #include #include #include #include pDockWidget::pDockWidget( const QString& title, QWidget* parent, Qt::WindowFlags flags ) : QDockWidget( title, parent, flags ) { init(); } pDockWidget::pDockWidget( QWidget* parent, Qt::WindowFlags flags ) : QDockWidget( parent, flags ) { init(); } void pDockWidget::init() { mShowAction = NULL; mTitleBar = new pDockWidgetTitleBar( this ); setTitleBarWidget( mTitleBar ); connect( toggleViewAction(), SIGNAL( triggered( bool ) ), this, SLOT( toggleViewAction_triggered( bool ) ) ); } void pDockWidget::paintEvent( QPaintEvent* event ) { QDockWidget::paintEvent( event ); if ( isFloating() && style()->objectName().compare( "Oxygen", Qt::CaseInsensitive ) != 0 ) { QRect rect = this->rect().adjusted( 0, 0, -1, -1 ); QPainter painter( this ); painter.setPen( QColor( 145, 142, 142 ) ); painter.setBrush( Qt::NoBrush ); painter.drawRect( rect ); } } pDockWidgetTitleBar* pDockWidget::titleBar() const { return mTitleBar; } QAction* pDockWidget::showAction() { if ( !mShowAction ) { mShowAction = new QAction(windowIcon(), windowTitle(), this); connect(mShowAction, SIGNAL(activated()), this, SLOT(show())); connect(mShowAction, SIGNAL(activated()), this, SLOT(handleFocusProxy())); } return mShowAction; } void pDockWidget::toggleViewAction_triggered( bool toggled ) { if ( toggled && focusProxy() ) { if ( isFloating() ) { QTimer::singleShot( 0, this, SLOT( handleWindowActivation() ) ); } else { QTimer::singleShot( 0, this, SLOT( handleFocusProxy() ) ); } } } void pDockWidget::handleWindowActivation() { activateWindow(); QTimer::singleShot( 0, this, SLOT( handleFocusProxy() ) ); } void pDockWidget::handleFocusProxy() { if ( focusProxy() ) focusProxy()->setFocus(); } ./qwbfsmanager-1.2.1-src/fresh/src/gui/dockwidget/pDockWidget.h0000644000175000017520000000521511546156115023711 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pDockWidget.h ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PDOCKWIDGET_H #define PDOCKWIDGET_H /*! \file pDockWidget.h \brief An extended QDockWidget class that handle a QToolBar as title bar widget. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include #include class pDockWidgetTitleBar; /*! \ingroup FreshGui \class pDockWidget \brief An extended QDockWidget class. This dock widget has a QToolBar as title bar widget and handle its proxy widget on activation. The dock widget has a small frame when it's floating (except for Oxygen style). */ class FRESH_EXPORT pDockWidget : public QDockWidget { Q_OBJECT friend class pDockWidgetTitleBar; public: /*! Create a pDockWidget having \a title, \a parent and \a flags. */ pDockWidget( const QString& title, QWidget* parent = 0, Qt::WindowFlags flags = 0 ); /*! Create a pDockWidget having \a parent and \a flags. */ pDockWidget( QWidget* parent = 0, Qt::WindowFlags flags = 0 ); /*! Return the title bar widget. */ pDockWidgetTitleBar* titleBar() const; /*! Show widget Unlike toggleViewAction, this action only shows widget, but never hides */ QAction* showAction(); protected: pDockWidgetTitleBar* mTitleBar; QAction* mShowAction; void init(); /*! Reimplemented. */ virtual void paintEvent( QPaintEvent* event ); protected slots: void toggleViewAction_triggered( bool toggled ); void handleWindowActivation(); void handleFocusProxy(); }; #endif // PDOCKWIDGET_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/dockwidget/pDockWidgetTitleBar.h0000644000175000017520000000675011546156115025345 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pDockWidgetTitleBar.h ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PDOCKWIDGETTITLEBAR_H #define PDOCKWIDGETTITLEBAR_H /*! \file pDockWidgetTitleBar.h \brief A custom title bar for pDockWidget that herits QToolBar. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include #include class QToolButton; class pToolButton; class QStyleOptionToolButton; /*! \ingroup FreshGui \class pDockWidgetTitleBar \brief A custom title bar for pDockWidget that herits QToolBar. Actions can be inserted in the title bar like in any toolbar ! */ class FRESH_EXPORT pDockWidgetTitleBar : public QToolBar { Q_OBJECT public: /*! Create an instance of the title bar handing parent has \a parent. */ pDockWidgetTitleBar( QDockWidget* parent = 0 ); /*! Reimplemented. */ virtual QSize minimumSizeHint() const; /*! Reimplemented. */ virtual QSize sizeHint() const; /*! Insert \a action at \a index position. If \a index is -1 then it's append at end. */ QWidget* addAction( QAction* action, int index = -1 ); /*! Insert a separator at \a index. If \a index is -1 then it's append at end. */ void addSeparator( int index = -1 ); /*! Set the rendering to be native or custom according to \a native. */ void setNativeRendering( bool native ); /*! Return true if native rendering is done else false. */ bool nativeRendering() const; /*! Set the default rendering to be native or custom according to \a native. */ static void setDefaultNativeRendering( bool native ); /*! Return true if default native rendering is done else false. */ static bool defaultNativeRendering(); protected: QDockWidget* mDock; QAction* aOrientation; QAction* aFloat; QAction* aClose; pToolButton* tbOrientation; pToolButton* tbFloat; pToolButton* tbClose; bool mUseNativePaint; static bool mUseNativePaintDefault; /*! Reimplemented */ virtual bool event( QEvent* event ); /*! Reimplemented. */ virtual bool eventFilter( QObject* object, QEvent* event ); /*! Reimplemented */ virtual void paintEvent( QPaintEvent* event ); QIcon icon() const; QSize windowIconSize() const; void updateStyleChange(); protected slots: void aOrientation_triggered(); void aFloat_triggered(); void dockWidget_featuresChanged( QDockWidget::DockWidgetFeatures features ); }; #endif // PDOCKWIDGETTITLEBAR_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/dockmanager/0000755000175000017520000000000011546156115021460 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/fresh/src/gui/dockmanager/pDockToolBar.cpp0000644000175000017520000002160511546156115024513 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pDockToolBar.cpp ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pDockToolBar.h" #include "pDockToolBarManager.h" #include "pMainWindow.h" #include "pToolButton.h" #include #include #include #include #include #include pDockToolBar::pDockToolBar( pDockToolBarManager* manager, Qt::Orientation orientation ) : QToolBar( manager->mainWindow() ) { mManager = manager; // toggle exclusive action aToggleExclusive = new QAction( this ); aToggleExclusive->setCheckable( true ); aToggleExclusive->setChecked( true ); // create button frame mWidget = new QWidget( this ); mWidget->setMinimumSize( QSize( 1, 1 ) ); // create buttons layout mLayout = new QBoxLayout( QBoxLayout::LeftToRight, mWidget ); mLayout->setMargin( 0 ); mLayout->setSpacing( 0 ); // add frame to toolbar aWidget = addWidget( mWidget ); // connect orientation change connect( this, SIGNAL( orientationChanged( Qt::Orientation ) ), this, SLOT( internal_orientationChanged( Qt::Orientation ) ) ); connect( aToggleExclusive, SIGNAL( toggled( bool ) ), this, SLOT( internal_checkButtonExclusivity() ) ); // toolbar properties setMovable( false ); setIconSize( QSize( 16, 16 ) ); setOrientation( orientation ); toggleViewAction()->setEnabled( false ); toggleViewAction()->setVisible( false ); } bool pDockToolBar::event( QEvent* event ) { if ( event->type() == QEvent::WindowTitleChange ) { aToggleExclusive->setText( tr( "%1 exclusive" ).arg( windowTitle() ) ); } return QToolBar::event( event ); } bool pDockToolBar::eventFilter( QObject* object, QEvent* event ) { const QEvent::Type type = event->type(); QDockWidget* dockWidget = qobject_cast( object ); if ( dockWidget ) { if ( type == QEvent::KeyPress ) { const QKeyEvent* ke = static_cast( event ); if ( ke->key() == Qt::Key_Escape && ke->modifiers() == Qt::NoModifier ) { dockWidget->hide(); } } } return QToolBar::eventFilter( object, event ); } void pDockToolBar::addDockWidget( QDockWidget* dockWidget, const QString& title, const QIcon& icon ) { if ( !dockWidget || mDockWidgets.contains( dockWidget ) ) { return; } if ( !title.isEmpty() ) { dockWidget->toggleViewAction()->setText( title ); dockWidget->setWindowTitle( title ); } if ( !icon.isNull() ) { dockWidget->toggleViewAction()->setIcon( icon ); dockWidget->setWindowIcon( icon ); } // create button const Qt::ToolBarArea tbAreaCurrent = mManager->toolBarArea( this ); const Qt::DockWidgetArea dwAreaCurrent = mManager->toolBarAreaToDockWidgetArea( tbAreaCurrent ); pToolButton* button = addButton( dockWidget ); if ( mManager->mainWindow()->dockWidgetArea( dockWidget ) != dwAreaCurrent ) { mManager->mainWindow()->addDockWidget( dwAreaCurrent, dockWidget ); } mManager->modernToolBar()->addAction( dockWidget->toggleViewAction() ); internal_checkButtonExclusivity( dockWidget ); internal_checkToolBarVisibility(); connect( button, SIGNAL( clicked( bool ) ), this, SLOT( internal_buttonClicked( bool ) ) ); } void pDockToolBar::removeDockWidget( QDockWidget* dockWidget ) { if ( !mDockWidgets.contains( dockWidget ) ) { return; } dockWidget->removeEventFilter( this ); mManager->modernToolBar()->removeAction( dockWidget->toggleViewAction() ); delete mDockWidgets.take( dockWidget ); internal_checkToolBarVisibility(); } bool pDockToolBar::isExclusive() const { return aToggleExclusive->isChecked(); } void pDockToolBar::setExclusive( bool exclusive ) { if ( aToggleExclusive->isChecked() != exclusive ) { aToggleExclusive->setChecked( exclusive ); } } void pDockToolBar::setDockVisible( QDockWidget* dockWidget, bool visible ) { pToolButton* button = mDockWidgets.value( dockWidget ); if ( button ) { if ( dockWidget->isVisible() != visible ) { dockWidget->setVisible( visible ); } if ( button->isChecked() != visible ) { button->setChecked( visible ); } internal_checkButtonExclusivity( dockWidget ); } } QList pDockToolBar::dockWidgets( pDockToolBar::DockWidgetsOrder order ) const { QList dockWidgets; switch ( order ) { case pDockToolBar::HashedOrder: { dockWidgets = mDockWidgets.keys(); break; } case pDockToolBar::InsertedOrder: { for ( int i = 0; i < mLayout->count(); i++ ) { QLayoutItem* item = mLayout->itemAt( i ); pToolButton* button = qobject_cast( item->widget() ); if ( button ) { dockWidgets << mDockWidgets.key( button ); } } break; } } return dockWidgets; } QDockWidget* pDockToolBar::dockWidget( pToolButton* button ) const { return mDockWidgets.key( button ); } bool pDockToolBar::hasDockWidget( QDockWidget* dockWidget ) const { return mDockWidgets.contains( dockWidget ); } QList pDockToolBar::buttons() const { return mDockWidgets.values(); } pToolButton* pDockToolBar::button( QDockWidget* dock ) const { return mDockWidgets.value( dock ); } int pDockToolBar::count() const { return mDockWidgets.count(); } QAction* pDockToolBar::toggleExclusiveAction() const { return aToggleExclusive; } void pDockToolBar::setButtonMode( pToolButton* button ) { button->setFont( font() ); switch ( mManager->mode() ) { case pDockToolBarManager::Classic: { const Qt::ToolBarArea tbAreaCurrent = mManager->toolBarArea( this ); const QBoxLayout::Direction blDirection = mManager->toolBarAreaToBoxLayoutDirection( tbAreaCurrent ); button->setIconSize( iconSize() ); button->setToolButtonStyle( Qt::ToolButtonTextBesideIcon ); button->setSizePolicy( QSizePolicy( QSizePolicy::Maximum, QSizePolicy::Fixed ) ); button->setDirection( blDirection ); break; } case pDockToolBarManager::Modern: { button->setIconSize( iconSize() *2 ); button->setToolButtonStyle( Qt::ToolButtonIconOnly ); button->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) ); button->setDirection( QBoxLayout::LeftToRight ); break; } default: break; } } pToolButton* pDockToolBar::addButton( QDockWidget* dockWidget ) { pToolButton* button = new pToolButton( this ); button->setDefaultAction( dockWidget->toggleViewAction() ); mDockWidgets[ dockWidget ] = button; dockWidget->installEventFilter( this ); mLayout->addWidget( button, 0, Qt::AlignCenter ); setButtonMode( button ); return button; } void pDockToolBar::internal_checkToolBarVisibility() { if ( !isVisible() && count() ) { mManager->setToolBarVisible( this, true ); } else if ( isVisible() && !this->count() ) { mManager->setToolBarVisible( this, false ); } } void pDockToolBar::internal_checkButtonExclusivity( QDockWidget* dockWidget ) { int visibleDockWidgetsCount = 0; foreach ( QDockWidget* dw, mDockWidgets.keys() ) { if ( dw->isVisible() ) { visibleDockWidgetsCount++; } } if ( aToggleExclusive->isChecked() && visibleDockWidgetsCount > 1 ) { foreach ( QDockWidget* dw, mDockWidgets.keys() ) { if ( ( !dockWidget || dw != dockWidget ) && dw->isVisible() ) { dw->hide(); visibleDockWidgetsCount--; } if ( visibleDockWidgetsCount == 1 ) { break; } } } } void pDockToolBar::internal_updateButtonsState() { foreach ( pToolButton* bt, findChildren() ) { setButtonMode( bt ); } } void pDockToolBar::internal_orientationChanged( Qt::Orientation orientation ) { switch ( orientation ) { case Qt::Horizontal: mLayout->setDirection( QBoxLayout::LeftToRight ); break; case Qt::Vertical: mLayout->setDirection( QBoxLayout::TopToBottom ); break; } internal_updateButtonsState(); } void pDockToolBar::internal_buttonClicked( bool checked ) { pToolButton* button = qobject_cast( sender() ); QDockWidget* dockWidget = this->dockWidget( button ); if ( !dockWidget ) { return; } setDockVisible( dockWidget, checked ); } ./qwbfsmanager-1.2.1-src/fresh/src/gui/dockmanager/pDockToolBarManager.h0000644000175000017520000001347611546156115025462 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pDockToolBarManager.h ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PDOCKTOOLBARMANAGER_H #define PDOCKTOOLBARMANAGER_H /*! \file pDockToolBarManager.h \brief This class manage a set of pDockToolBar of a pMainWindow according to its mode. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include #include #include #include class pMainWindow; class pDockToolBar; class pSettings; /*! \ingroup FreshGui \class pDockToolBarManager \brief This class manage a set of pDockToolBar of a pMainWindow according to its mode. It provide usefull member ( bar() ) to directly create a unique pDockToolBar for the corresponding area. It allow to save/restore state of pDockToolBar using a pSettings object. */ class FRESH_EXPORT pDockToolBarManager : public QObject { Q_OBJECT friend class pDockToolBar; public: /*! This enumeration represents the differents mode available for presenting the toolbars managing the dock widgets. */ enum Mode { Invalid = -1, /*!< An invalid mode. */ Classic, /*!< The classical mode presenting toolbars at each part of a window (left, top, right, bottom). */ Modern /*!< The modern mode presenting all the toolbars in a unique toolbar that minimize the used space. */ }; /*! Create a manager working on \a window. */ pDockToolBarManager( pMainWindow* window ); /*! Reimplemented. */ virtual bool eventFilter( QObject* object, QEvent* event ); /*! Return true if settings restoration is in process else false. */ bool isRestoring() const; /*! Tells if the setttings restoration process is active or not according to \a restoring. \note This member should never be used directly. */ void setRestoring( bool restoring ); /*! Return the current presentation mode. */ pDockToolBarManager::Mode mode() const; /*! Set the current presentation mode to \a mode. */ void setMode( pDockToolBarManager::Mode mode ); /*! Return the pMainWindow handled by this manager. */ pMainWindow* mainWindow() const; /*! Return the toolbar area used by \a toolBar. */ Qt::ToolBarArea toolBarArea( pDockToolBar* toolBar ) const; /*! Return all the toolbars this manager is using. */ QList dockToolBars() const; /*! Return the toolbar placed in the tool bar area \a area. */ pDockToolBar* dockToolBar( Qt::ToolBarArea area ) const; /*! Return the toolbar placed in the dock widget area \a area. */ pDockToolBar* dockToolBar( Qt::DockWidgetArea area ) const; /*! Return the pDockToolBar that handles \a dockWidget. */ pDockToolBar* dockToolBar( QDockWidget* dockWidget ) const; /*! Return pointer to modern dock tool bar widget */ QToolBar* modernToolBar() const; /*! Conversion helper. */ static Qt::ToolBarArea dockWidgetAreaToToolBarArea( Qt::DockWidgetArea area ); /*! Conversion helper. */ static Qt::DockWidgetArea toolBarAreaToDockWidgetArea( Qt::ToolBarArea area ); /*! Conversion helper. */ static QBoxLayout::Direction toolBarAreaToBoxLayoutDirection( Qt::ToolBarArea area ); protected: pMainWindow* mMainWindow; QHash mDockToolBars; pDockToolBarManager::Mode mMode; QWeakPointer mModernWidget; bool mIsRestoring; QTimer* mModernToolBarUpdate; /*! Initialize the toolbar for each area. */ virtual void initializeToolBars(); /*! Check for unmanaged dock widgets and add them to the correct toolbar. */ virtual void checkForUnManagedDockWidgets(); /*! Change the toolbar \a tb visibility according to \a visible. */ virtual void setToolBarVisible( pDockToolBar* tb, bool visible ); /*! Initialize needed signals / slot / properties for tracking \a dock. */ virtual void trackDockWidget( QDockWidget* dock ); /*! De initialize needed signals / slots / properties for un tracking \a dock. */ virtual void untrackDockWidget( QDockWidget* dock ); public slots: /*! Restore the state of \a dockToolBar if not null, else all toolbars. */ virtual void restoreState( pDockToolBar* dockToolBar = 0 ); /*! Save the state of \a dockToolBar if not null, else all toolbars. */ virtual void saveState( pDockToolBar* dockToolBar = 0 ); protected slots: void updateModernToolBarActions(); void dockWidget_allowedAreasChanged( Qt::DockWidgetAreas allowedAreas ); void dockWidget_dockLocationChanged( Qt::DockWidgetArea area ); void dockWidget_featuresChanged( QDockWidget::DockWidgetFeatures features ); void dockWidget_topLevelChanged( bool topLevel ); void dockWidget_visibilityChanged( bool visible ); signals: /*! This signal is emited when the current prensentation mode is changed to \a mode. */ void modeChanged( pDockToolBarManager::Mode mode ); }; #endif // PDOCKTOOLBARMANAGER_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/dockmanager/pDockToolBar.h0000644000175000017520000001150311546156115024154 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pDockToolBar.h ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PDOCKTOOLBAR_H #define PDOCKTOOLBAR_H /*! \file pDockToolBar.h \brief A toolbar that can manage dock visibility by adding buttons in it. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include #include #include #include #include class QDockWidget; class pToolButton; class pDockToolBarManager; class pMainWindow; /*! \ingroup FreshGui \class pDockToolBar \brief A toolbar that can manage dock visibility by adding buttons in it. The dock toolbars are managed by a pDockToolBarManager for top, right, bottom, left. */ class FRESH_EXPORT pDockToolBar : public QToolBar { Q_OBJECT friend class pDockToolBarManager; public: /*! This enumeration represents the possible order to use. */ enum DockWidgetsOrder { HashedOrder = 0, /*!< The list is ordered by the hash order. */ InsertedOrder /*!< The list is ordered by the insertion order. */ }; /*! Create a pDockToolBar having \a manager as manager and orientation \a orientation. */ pDockToolBar( pDockToolBarManager* manager, Qt::Orientation orientation = Qt::Horizontal ); /*! Reimplemented. */ virtual bool event( QEvent* event ); /*! Reimplemented. */ virtual bool eventFilter( QObject* object, QEvent* event ); /*! Add \a dockWidget being handled by this toolbar. If \a title and \a icon are non null, they will overwrite the dock widget window title and window icon. */ void addDockWidget( QDockWidget* dockWidget, const QString& title = QString(), const QIcon& icon = QIcon() ); /*! Remove \a dockWidget from the list of handled dock widgets by this toolbar. The dock is not deleted nor hided. */ void removeDockWidget( QDockWidget* dockWidget ); /*! Return true if this toolbar buttons are exclusive, else false. */ bool isExclusive() const; /*! Set the toolbar button to be exclusive according to \a exclusive. */ void setExclusive( bool exclusive ); /*! Change the \a dockWidget visibility according to \a visible. */ void setDockVisible( QDockWidget* dockWidget, bool visible ); /*! Return the list of managed dock widgets in this toolbar sorted by \a order method. */ QList dockWidgets( pDockToolBar::DockWidgetsOrder order = pDockToolBar::HashedOrder ) const; /*! Return the dock widget associated with \a button. */ QDockWidget* dockWidget( pToolButton* button ) const; /*! Return true if \a dockWidget is managed by this toolbar. */ bool hasDockWidget( QDockWidget* dockWidget ) const; /*! Return all the buttons associated with dock widgets managed by this toolbar. */ QList buttons() const; /*! Return the button associated with \a dockWidget. */ pToolButton* button( QDockWidget* dockWidget ) const; /*! Return the number of managed dock widgets. */ int count() const; /*! Return the checkable action for changing the exclusive mode of this toolbar. */ QAction* toggleExclusiveAction() const; private: pDockToolBarManager* mManager; QWidget* mWidget; QBoxLayout* mLayout; QAction* aWidget; QAction* aToggleExclusive; QHash mDockWidgets; /*! Update the button properties according to the current manager mode. */ void setButtonMode( pToolButton* button ); /*! Add a button for \a dockWidget and return it. */ pToolButton* addButton( QDockWidget* dockWidget ); private slots: void internal_checkToolBarVisibility(); void internal_checkButtonExclusivity( QDockWidget* dockWidget = 0 ); void internal_updateButtonsState(); void internal_orientationChanged( Qt::Orientation orientation ); void internal_buttonClicked( bool checked ); }; #endif // PDOCKTOOLBAR_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/dockmanager/pDockToolBarManager.cpp0000644000175000017520000004220211546156115026002 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pDockToolBarManager.cpp ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pDockToolBarManager.h" #include "pMainWindow.h" #include "pDockToolBar.h" #include "pSettings.h" #include #include #include #include #include #include #include pDockToolBarManager::pDockToolBarManager( pMainWindow* window ) : QObject( window ) { Q_ASSERT( window ); mMode = pDockToolBarManager::Invalid; mMainWindow = window; mIsRestoring = false; mModernToolBarUpdate = new QTimer( this ); mModernToolBarUpdate->setSingleShot( true ); mModernToolBarUpdate->setInterval( 0 ); connect( mModernToolBarUpdate, SIGNAL( timeout() ), this, SLOT( updateModernToolBarActions() ) ); initializeToolBars(); mModernWidget.data()->installEventFilter( this ); mMainWindow->installEventFilter( this ); } void pDockToolBarManager::updateModernToolBarActions() { const bool wasRestoring = mIsRestoring; mIsRestoring = true; const QList docks = mMainWindow->findChildren(); QHash > hashActions; foreach ( QDockWidget* dock, docks ) { const Qt::DockWidgetArea area = mMainWindow->dockWidgetArea( dock ); hashActions[ area ] << dock->toggleViewAction(); } QList actions = QList() << hashActions[ Qt::LeftDockWidgetArea ] << hashActions[ Qt::TopDockWidgetArea ] << hashActions[ Qt::RightDockWidgetArea ] << hashActions[ Qt::BottomDockWidgetArea ]; mModernWidget.data()->clear(); mModernWidget.data()->addActions( actions ); mIsRestoring = wasRestoring; } bool pDockToolBarManager::eventFilter( QObject* object, QEvent* event ) { if ( object == mModernWidget.data() ) { switch ( event->type() ) { case QEvent::ActionAdded: { if ( !mIsRestoring ) { mModernToolBarUpdate->start(); } break; } default: break; } } else if ( object == mMainWindow ) { switch ( event->type() ) { case QEvent::ChildPolished: { QChildEvent* ce = static_cast( event ); QDockWidget* dock = qobject_cast( ce->child() ); if ( dock ) { trackDockWidget( dock ); } break; } case QEvent::ChildRemoved: { QChildEvent* ce = static_cast( event ); QDockWidget* dock = qobject_cast( ce->child() ); if ( dock ) { untrackDockWidget( dock ); } break; } default: break; } } return QObject::eventFilter( object, event ); } bool pDockToolBarManager::isRestoring() const { return mIsRestoring; } void pDockToolBarManager::setRestoring( bool restoring ) { mIsRestoring = restoring; } pDockToolBarManager::Mode pDockToolBarManager::mode() const { return mMode; } void pDockToolBarManager::setMode( pDockToolBarManager::Mode mode ) { if ( mode == mMode ) { return; } mMode = mode; switch ( mMode ) { case pDockToolBarManager::Classic: mMainWindow->addToolBar( Qt::TopToolBarArea, mDockToolBars[ Qt::TopToolBarArea ] ); mMainWindow->addToolBar( Qt::BottomToolBarArea, mDockToolBars[ Qt::BottomToolBarArea ] ); mMainWindow->addToolBar( Qt::LeftToolBarArea, mDockToolBars[ Qt::LeftToolBarArea ] ); mMainWindow->addToolBar( Qt::RightToolBarArea, mDockToolBars[ Qt::RightToolBarArea ] ); mDockToolBars[ Qt::TopToolBarArea ]->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Maximum ); mDockToolBars[ Qt::BottomToolBarArea ]->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Maximum ); mDockToolBars[ Qt::LeftToolBarArea ]->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Maximum ); mDockToolBars[ Qt::RightToolBarArea ]->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Maximum ); if ( !mMainWindow->toolBarBreak( mDockToolBars[ Qt::TopToolBarArea ] ) ) { mMainWindow->insertToolBarBreak( mDockToolBars[ Qt::TopToolBarArea ] ); } foreach ( pDockToolBar* toolBar, mDockToolBars ) { toolBar->internal_updateButtonsState(); toolBar->setVisible( toolBar->count() > 0 ); } mModernWidget.data()->hide(); break; case pDockToolBarManager::Modern: { bool visible = false; foreach ( pDockToolBar* toolBar, mDockToolBars ) { if ( toolBar->count() > 0 ) { visible = true; } toolBar->hide(); } mModernWidget.data()->setVisible( visible ); break; } default: break; } emit modeChanged( mMode ); } pMainWindow* pDockToolBarManager::mainWindow() const { return mMainWindow; } Qt::ToolBarArea pDockToolBarManager::toolBarArea( pDockToolBar* toolBar ) const { return mDockToolBars.key( toolBar ); } QList pDockToolBarManager::dockToolBars() const { return mDockToolBars.values(); } pDockToolBar* pDockToolBarManager::dockToolBar( Qt::ToolBarArea area ) const { return mDockToolBars.value( area ); } QToolBar* pDockToolBarManager::modernToolBar() const { return mModernWidget.data(); } pDockToolBar* pDockToolBarManager::dockToolBar( Qt::DockWidgetArea area ) const { return dockToolBar( dockWidgetAreaToToolBarArea( area ) ); } pDockToolBar* pDockToolBarManager::dockToolBar( QDockWidget* dockWidget ) const { foreach ( pDockToolBar* dockToolBar, mDockToolBars ) { if ( dockToolBar->hasDockWidget( dockWidget ) ) { return dockToolBar; } } return 0; } void pDockToolBarManager::initializeToolBars() { // Qt::TopToolBarArea mDockToolBars[ Qt::TopToolBarArea ] = new pDockToolBar( this, Qt::Horizontal ); mDockToolBars[ Qt::TopToolBarArea ]->setObjectName( "pDockToolBarTop" ); mDockToolBars[ Qt::TopToolBarArea ]->setWindowTitle( tr( "Top toolbar" ) ); mDockToolBars[ Qt::TopToolBarArea ]->toggleViewAction()->setObjectName( "pDockToolBarTopViewAction" ); mDockToolBars[ Qt::TopToolBarArea ]->toggleViewAction()->setText( tr( "Top toolbar visible" ) ); mDockToolBars[ Qt::TopToolBarArea ]->toggleExclusiveAction()->setObjectName( "pDockToolBarTopExclusiveAction" ); // Qt::BottomToolBarArea mDockToolBars[ Qt::BottomToolBarArea ] = new pDockToolBar( this, Qt::Horizontal ); mDockToolBars[ Qt::BottomToolBarArea ]->setObjectName( "pDockToolBarBottom" ); mDockToolBars[ Qt::BottomToolBarArea ]->setWindowTitle( tr( "Bottom toolbar" ) ); mDockToolBars[ Qt::BottomToolBarArea ]->toggleViewAction()->setObjectName( "pDockToolBarBottomViewAction" ); mDockToolBars[ Qt::BottomToolBarArea ]->toggleViewAction()->setText( tr( "Bottom toolbar visible" ) ); mDockToolBars[ Qt::BottomToolBarArea ]->toggleExclusiveAction()->setObjectName( "pDockToolBarBottomExclusiveAction" ); // Qt::LeftToolBarArea mDockToolBars[ Qt::LeftToolBarArea ] = new pDockToolBar( this, Qt::Vertical ); mDockToolBars[ Qt::LeftToolBarArea ]->setObjectName( "pDockToolBarLeft" ); mDockToolBars[ Qt::LeftToolBarArea ]->setWindowTitle( tr( "Left toolbar" ) ); mDockToolBars[ Qt::LeftToolBarArea ]->toggleViewAction()->setObjectName( "pDockToolBarLeftViewAction" ); mDockToolBars[ Qt::LeftToolBarArea ]->toggleViewAction()->setText( tr( "Left toolbar visible" ) ); mDockToolBars[ Qt::LeftToolBarArea ]->toggleExclusiveAction()->setObjectName( "pDockToolBarLeftExclusiveAction" ); // Qt::RightToolBarArea mDockToolBars[ Qt::RightToolBarArea ] = new pDockToolBar( this, Qt::Vertical ); mDockToolBars[ Qt::RightToolBarArea ]->setObjectName( "pDockToolBarRight" ); mDockToolBars[ Qt::RightToolBarArea ]->setWindowTitle( tr( "Right toolbar" ) ); mDockToolBars[ Qt::RightToolBarArea ]->toggleViewAction()->setObjectName( "pDockToolBarRightViewAction" ); mDockToolBars[ Qt::RightToolBarArea ]->toggleViewAction()->setText( tr( "Right toolbar visible" ) ); mDockToolBars[ Qt::RightToolBarArea ]->toggleExclusiveAction()->setObjectName( "pDockToolBarRightExclusiveAction" ); // modern widget manager mModernWidget = new QToolBar( mMainWindow ); mModernWidget.data()->setObjectName( "pDockToolBarManagerModernWidget" ); mModernWidget.data()->setWindowTitle( tr( "Modern dock toolbar manager" ) ); mModernWidget.data()->toggleViewAction()->setEnabled( false ); mModernWidget.data()->toggleViewAction()->setVisible( false ); mMainWindow->addToolBar( Qt::LeftToolBarArea, mModernWidget.data() ); } void pDockToolBarManager::checkForUnManagedDockWidgets() { if ( !mMainWindow ) { return; } foreach ( QDockWidget* dockWidget, mMainWindow->findChildren() ) { bool hasDockWidget = false; foreach ( pDockToolBar* toolBar, mDockToolBars ) { if ( toolBar->hasDockWidget( dockWidget ) ) { hasDockWidget = true; break; } } if ( !hasDockWidget ) { dockToolBar( mMainWindow->dockWidgetArea( dockWidget ) )->addDockWidget( dockWidget ); } } } void pDockToolBarManager::setToolBarVisible( pDockToolBar* tb, bool visible ) { if ( !mDockToolBars.values().contains( tb ) ) { return; } if ( visible ) { if ( mMode == pDockToolBarManager::Modern && visible ) { if ( !mModernWidget.data()->isVisible() ) { mModernWidget.data()->setVisible( true ); } } } else { tb->setVisible( false ); if ( mMode == pDockToolBarManager::Modern ) { bool visible = false; foreach ( pDockToolBar* toolBar, mDockToolBars ) { if ( toolBar->isVisible() ) { visible = true; break; } } mModernWidget.data()->setVisible( visible ); } } } void pDockToolBarManager::trackDockWidget( QDockWidget* dockWidget ) { Q_ASSERT( dockWidget ); if ( dockWidget->objectName().isEmpty() ) { qFatal( "%s", qPrintable( QString( "%1: Can't handle dock with no object name" ).arg( Q_FUNC_INFO ) ) ); return; } connect( dockWidget, SIGNAL( allowedAreasChanged( Qt::DockWidgetAreas ) ), this, SLOT( dockWidget_allowedAreasChanged( Qt::DockWidgetAreas ) ), Qt::UniqueConnection ); connect( dockWidget, SIGNAL( dockLocationChanged( Qt::DockWidgetArea ) ), this, SLOT( dockWidget_dockLocationChanged( Qt::DockWidgetArea ) ), Qt::UniqueConnection ); connect( dockWidget, SIGNAL( featuresChanged( QDockWidget::DockWidgetFeatures ) ), this, SLOT( dockWidget_featuresChanged( QDockWidget::DockWidgetFeatures ) ), Qt::UniqueConnection ); connect( dockWidget, SIGNAL( topLevelChanged( bool ) ), this, SLOT( dockWidget_topLevelChanged( bool ) ), Qt::UniqueConnection ); connect( dockWidget, SIGNAL( visibilityChanged( bool ) ), this, SLOT( dockWidget_visibilityChanged( bool ) ), Qt::UniqueConnection ); } void pDockToolBarManager::untrackDockWidget( QDockWidget* dockWidget ) { Q_ASSERT( dockWidget ); disconnect( dockWidget, SIGNAL( allowedAreasChanged( Qt::DockWidgetAreas ) ), this, SLOT( dockWidget_allowedAreasChanged( Qt::DockWidgetAreas ) ) ); disconnect( dockWidget, SIGNAL( dockLocationChanged( Qt::DockWidgetArea ) ), this, SLOT( dockWidget_dockLocationChanged( Qt::DockWidgetArea ) ) ); disconnect( dockWidget, SIGNAL( featuresChanged( QDockWidget::DockWidgetFeatures ) ), this, SLOT( dockWidget_featuresChanged( QDockWidget::DockWidgetFeatures ) ) ); disconnect( dockWidget, SIGNAL( topLevelChanged( bool ) ), this, SLOT( dockWidget_topLevelChanged( bool ) ) ); disconnect( dockWidget, SIGNAL( visibilityChanged( bool ) ), this, SLOT( dockWidget_visibilityChanged( bool ) ) ); } Qt::ToolBarArea pDockToolBarManager::dockWidgetAreaToToolBarArea( Qt::DockWidgetArea area ) { switch ( area ) { case Qt::LeftDockWidgetArea: return Qt::LeftToolBarArea; case Qt::RightDockWidgetArea: return Qt::RightToolBarArea; case Qt::TopDockWidgetArea: return Qt::TopToolBarArea; case Qt::BottomDockWidgetArea: return Qt::BottomToolBarArea; default: return Qt::BottomToolBarArea; } } Qt::DockWidgetArea pDockToolBarManager::toolBarAreaToDockWidgetArea( Qt::ToolBarArea area ) { switch ( area ) { case Qt::LeftToolBarArea: return Qt::LeftDockWidgetArea; case Qt::RightToolBarArea: return Qt::RightDockWidgetArea; case Qt::TopToolBarArea: return Qt::TopDockWidgetArea; case Qt::BottomToolBarArea: return Qt::BottomDockWidgetArea; default: return Qt::BottomDockWidgetArea; } } QBoxLayout::Direction pDockToolBarManager::toolBarAreaToBoxLayoutDirection( Qt::ToolBarArea area ) { switch ( area ) { case Qt::LeftToolBarArea: return QBoxLayout::BottomToTop; case Qt::RightToolBarArea: return QBoxLayout::TopToBottom; case Qt::TopToolBarArea: case Qt::BottomToolBarArea: return QBoxLayout::LeftToRight; default: return QBoxLayout::LeftToRight; } } void pDockToolBarManager::restoreState( pDockToolBar* dockToolBar ) { pSettings* settings = mMainWindow->settings(); QStringList areas; if ( dockToolBar ) { areas << QString::number( mDockToolBars.key( dockToolBar ) ); } else { settings->beginGroup( "MainWindow/Docks" ); areas = settings->childGroups(); settings->endGroup(); } foreach ( const QString& area, areas ) { dockToolBar = this->dockToolBar( Qt::ToolBarArea( area.toInt() ) ); if ( dockToolBar ) { const QStringList docksName = settings->value( QString( "MainWindow/Docks/%1/Widgets" ).arg( area ) ).toStringList(); const QSet verticalDocksName = settings->value( QString( "MainWindow/Docks/%1/VerticalWidgets" ).arg( area ) ).toStringList().toSet(); const bool isExclusive = dockToolBar->isExclusive(); dockToolBar->setExclusive( false ); foreach ( const QString& dockName, docksName ) { QDockWidget* dockWidget = mMainWindow->findChild( dockName ); if ( dockWidget ) { dockToolBar->addDockWidget( dockWidget ); QDockWidget::DockWidgetFeatures features = dockWidget->features(); if ( verticalDocksName.contains( dockName ) ) { features |= QDockWidget::DockWidgetVerticalTitleBar; } else { features &= ~QDockWidget::DockWidgetVerticalTitleBar; } dockWidget->setFeatures( features ); } } dockToolBar->setExclusive( settings->value( QString( "MainWindow/Docks/%1/Exclusive" ).arg( area ), isExclusive ).toBool() ); } } checkForUnManagedDockWidgets(); setMode( pDockToolBarManager::Mode( settings->value( "MainWindow/Docks/Mode", pDockToolBarManager::Modern ).toInt() ) ); } void pDockToolBarManager::saveState( pDockToolBar* dockToolBar ) { pSettings* settings = mMainWindow->settings(); QList dockToolBars; if ( dockToolBar ) { dockToolBars << dockToolBar; } else { dockToolBars << mDockToolBars.values(); } foreach ( pDockToolBar* dockToolBar, dockToolBars ) { QStringList docksName; QStringList verticalDocksName; foreach ( QDockWidget* dockWidget, dockToolBar->dockWidgets( pDockToolBar::InsertedOrder ) ) { docksName << dockWidget->objectName(); if ( dockWidget->features() & QDockWidget::DockWidgetVerticalTitleBar ) { verticalDocksName << dockWidget->objectName(); } } // write datas const int area = mDockToolBars.key( dockToolBar ); settings->setValue( QString( "MainWindow/Docks/%1/Exclusive" ).arg( area ), dockToolBar->isExclusive() ); settings->setValue( QString( "MainWindow/Docks/%1/Widgets" ).arg( area ), docksName ); settings->setValue( QString( "MainWindow/Docks/%1/VerticalWidgets" ).arg( area ), verticalDocksName ); } settings->setValue( "MainWindow/Docks/Mode", mMode ); } void pDockToolBarManager::dockWidget_allowedAreasChanged( Qt::DockWidgetAreas allowedAreas ) { Q_UNUSED( allowedAreas ); } void pDockToolBarManager::dockWidget_dockLocationChanged( Qt::DockWidgetArea area ) { QDockWidget* dockWidget = qobject_cast( sender() ); pDockToolBar* currentDockToolBar = dockToolBar( area ); foreach ( pDockToolBar* dockToolBar, mDockToolBars ) { if ( dockToolBar != currentDockToolBar ) { dockToolBar->removeDockWidget( dockWidget ); } } if ( mIsRestoring ) { return; } if ( currentDockToolBar ) { currentDockToolBar->addDockWidget( dockWidget ); } } void pDockToolBarManager::dockWidget_featuresChanged( QDockWidget::DockWidgetFeatures features ) { Q_UNUSED( features ); } void pDockToolBarManager::dockWidget_topLevelChanged( bool topLevel ) { Q_UNUSED( topLevel ); } void pDockToolBarManager::dockWidget_visibilityChanged( bool visible ) { Q_UNUSED( visible ); /*if ( mIsRestoring ) { return; } QDockWidget* dockWidget = qobject_cast( sender() ); pDockToolBar* dockToolBar = this->dockToolBar( dockWidget ); if ( dockToolBar ) { dockToolBar->setDockVisible( dockWidget, visible ); }*/ } ./qwbfsmanager-1.2.1-src/fresh/src/gui/pIconManager.cpp0000644000175000017520000000544111546156115022260 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pIconManager.cpp ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pIconManager.h" #include "pCoreUtils.h" #include #include #include pIconManager::pIconCache pIconManager::mIconCache( 200 ); pIconManager::pFileNameCache pIconManager::mFileNameCache; QString pIconManager::filePath( const QString& fileName, const QString& prefix ) { QString path = prefix; if ( path.isEmpty() ) { path = QLatin1String( ":/" ); } const pFileNamePair pair = qMakePair( fileName, path ); QString fn = mFileNameCache.value( pair ); if ( !fn.isEmpty() ) { return fn; } QDir dir( path ); fn = pCoreUtils::findFile( dir, fileName ); mFileNameCache[ pair ] = fn; return fn; } QPixmap pIconManager::pixmap( const QString& fileName, const QString& prefix ) { QPixmap pixmap; const QString fn = filePath( fileName, prefix ); if ( !QPixmapCache::find( fn, pixmap ) ) { if ( pixmap.load( fn ) ) { if ( !QPixmapCache::insert( fn, pixmap ) ) { qWarning() << Q_FUNC_INFO << "Can't insert pixmap" << fn; } } else { qWarning() << Q_FUNC_INFO << "Can't load pixmap" << fn << "(" << prefix<< "/" << fileName << ")"; } } return pixmap; } QIcon pIconManager::icon( const QString& fileName, const QString& prefix ) { const QString fn = filePath( fileName, prefix ); QIcon icon; if ( mIconCache.contains( fn ) ) { icon = *mIconCache[ fn ]; } else { const QPixmap pixmap = pIconManager::pixmap( fileName, prefix ); if ( !pixmap.isNull() ) { icon.addPixmap( pixmap ); if ( !mIconCache.insert( fn, new QIcon( icon ) ) ) { qWarning() << Q_FUNC_INFO << "Can't insert icon" << fn; } } } return icon; } ./qwbfsmanager-1.2.1-src/fresh/src/gui/pGuiUtils.h0000644000175000017520000000663311546156115021313 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pGuiUtils.h ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PGUIUTILS_H #define PGUIUTILS_H /*! \file pGuiUtils.h \brief A central place for reusable gui functions. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include class QColor; class QRect; class QPixmap; class QMargins; class QWidget; /*! \ingroup FreshGui \namespace pGuiUtils \brief A central place for reusable gui functions. */ namespace pGuiUtils { /*! Create a QPixmap of \a size filled with \a color. */ FRESH_EXPORT QPixmap filledPixmap( const QColor& color, const QSize& size ); /*! Create a cache key using \a key and \a size used for caching scaled pixmap in QPixmapCache. */ FRESH_EXPORT QString cacheKey( const QString& key, const QSize& size = QSize() ); /*! Create a QPixmap from \a filePath. If \a size is not null, the pixmap is scaled to \a size. The resulted pixmap is cached in QPixmapCache so a call with same parameters will be very quick. \note The scale is done using Qt::KeepAspectRatio and Qt::SmoothTransformation. */ FRESH_EXPORT QPixmap scaledPixmap( const QString& filePath, const QSize& size = QSize() ); /*! Create a QPixmap from \a pixmap. If \a size is not null, the pixmap is scaled to \a size. The resulted pixmap is cached in QPixmapCache using \a key so a call with same parameters will be very quick. \note The scale is done using Qt::KeepAspectRatio and Qt::SmoothTransformation. */ FRESH_EXPORT QPixmap scaledPixmap( const QPixmap& pixmap, const QString& key, const QSize& size = QSize() ); /*! Returns the margins of \a window. \note The margins are the differences between frameGeometry() and geometry(). */ FRESH_EXPORT QMargins frameMargins( QWidget* window ); /*! Return geometry to save for \a window. \note This implementation is a alternative to QMainWindow::saveGeometry() which is bugguy on Mac OS X and allow non QMainWindow widget to be saved. */ FRESH_EXPORT QRect saveGeometry( QWidget* window ); /*! Restore the \a geometry of \a window. \note This implementation is a alternative to QMainWindow::restoreGeometry() which is bugguy on Mac OS X and allow non QMainWindow widget to be restored. */ FRESH_EXPORT void restoreGeometry( QWidget* window, const QRect& geometry ); }; #endif // PGUIUTILS_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/queuedmessage/0000755000175000017520000000000011546156115022042 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/fresh/src/gui/queuedmessage/pQueuedMessageWidget.cpp0000644000175000017520000002150511546156115026632 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pQueuedMessageWidget.cpp ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pQueuedMessageWidget.h" #include "pIconManager.h" #include #include #include #include #include #include #include pQueuedMessage::pQueuedMessage() { milliSeconds = -1; background = QBrush( Qt::NoBrush ); foreground = QBrush( Qt::NoBrush ); slot = 0; } bool pQueuedMessage::operator==( const pQueuedMessage& other ) const { return message == other.message && milliSeconds == other.milliSeconds && ( pixmap.cacheKey() == other.pixmap.cacheKey() || ( pixmap.isNull() && other.pixmap.isNull() ) ) && background == other.background && foreground == other.foreground && buttons == other.buttons && object == other.object && slot == other.slot && userData == other.userData ; } pQueuedMessageWidget::pQueuedMessageWidget( QWidget* parent ) : QWidget( parent ) { mDefaultTimeout = 0; mDefaultPixmap = pIconManager::pixmap( "info.png", ":/fresh/icons" ); mDefaultBackground = QBrush( QColor( 250, 230, 147 ) ); mDefaultForeground = QBrush( QColor( 0, 0, 0 ) ); // pixmap lPixmap = new QLabel( this ); lPixmap->setAlignment( Qt::AlignCenter ); lPixmap->setSizePolicy( QSizePolicy( QSizePolicy::Maximum, QSizePolicy::Preferred ) ); // message lMessage = new QLabel( this ); lMessage->setAlignment( Qt::AlignVCenter | Qt::AlignLeft ); lMessage->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) ); lMessage->setWordWrap( true ); lMessage->setOpenExternalLinks( true ); lMessage->setTextInteractionFlags( Qt::TextBrowserInteraction ); // button dbbButtons = new QDialogButtonBox( this ); dbbButtons->setSizePolicy( QSizePolicy( QSizePolicy::Maximum, QSizePolicy::Preferred ) ); setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Maximum ) ); // layout QHBoxLayout* hbl = new QHBoxLayout( this ); hbl->setMargin( 0 ); hbl->addWidget( lPixmap, 0, Qt::AlignCenter ); hbl->addWidget( lMessage ); hbl->addWidget( dbbButtons, 0, Qt::AlignCenter ); // font QFont font = this->font(); #if defined( Q_OS_MAC ) font.setPointSize( 11 ); #else font.setPointSize( 9 ); #endif setFont( font ); // connections connect( lMessage, SIGNAL( linkActivated( const QString& ) ), this, SIGNAL( linkActivated( const QString& ) ) ); connect( lMessage, SIGNAL( linkHovered( const QString& ) ), this, SIGNAL( linkHovered( const QString& ) ) ); connect( dbbButtons, SIGNAL( clicked( QAbstractButton* ) ), this, SLOT( buttonClicked( QAbstractButton* ) ) ); } QSize pQueuedMessageWidget::sizeHint() const { return QWidget::minimumSizeHint(); } bool pQueuedMessageWidget::openExternalLinks() const { return lMessage->openExternalLinks(); } int pQueuedMessageWidget::defaultTimeout() const { return mDefaultTimeout; } QPixmap pQueuedMessageWidget::defaultPixmap() const { return mDefaultPixmap; } QBrush pQueuedMessageWidget::defaultBackground() const { return mDefaultBackground; } QBrush pQueuedMessageWidget::defaultForeground() const { return mDefaultForeground; } void pQueuedMessageWidget::currentMessageInformations( QPixmap* pixmap, QBrush* background, QBrush* foreground ) const { if ( pixmap ) { *pixmap = currentMessagePixmap(); } if ( background ) { *background = currentMessageBackground(); } if ( foreground ) { *foreground = currentMessageForeground(); } } int pQueuedMessageWidget::pendingMessageCount() const { return mMessages.count(); } pQueuedMessage pQueuedMessageWidget::currentMessage() const { return mMessages.value( 0 ); } pQueuedMessage pQueuedMessageWidget::append( const QString& message, int milliSeconds ) { pQueuedMessage msg; msg.message = message; msg.milliSeconds = milliSeconds == -1 ? mDefaultTimeout : milliSeconds; msg.pixmap = mDefaultPixmap; msg.background = mDefaultBackground; msg.foreground = mDefaultForeground; append( msg ); return msg; } void pQueuedMessageWidget::setOpenExternalLinks( bool open ) { lMessage->setOpenExternalLinks( open ); } void pQueuedMessageWidget::setDefaultTimeout( int timeout ) { mDefaultTimeout = timeout; } void pQueuedMessageWidget::setDefaultPixmap( const QPixmap& pixmap ) { mDefaultPixmap = pixmap; } void pQueuedMessageWidget::setDefaultBackground( const QBrush& brush ) { mDefaultBackground = brush; } void pQueuedMessageWidget::setDefaultForeground( const QBrush& brush ) { mDefaultForeground = brush; } void pQueuedMessageWidget::append( const pQueuedMessage& message ) { if ( !mMessages.contains( message ) ) { mMessages << message; if ( mMessages.count() == 1 ) { QTimer::singleShot( 0, this, SLOT( showMessage() ) ); } } } void pQueuedMessageWidget::remove( const pQueuedMessage& message ) { if ( mMessages.isEmpty() || mMessages.first() == message ) { return; } mMessages.removeOne( message ); } void pQueuedMessageWidget::clear() { mMessages.clear(); lPixmap->clear(); lMessage->clear(); dbbButtons->clear(); emit cleared(); } QPixmap pQueuedMessageWidget::currentMessagePixmap() const { const pQueuedMessage msg = currentMessage(); return msg.pixmap.isNull() ? mDefaultPixmap : msg.pixmap; } QBrush pQueuedMessageWidget::currentMessageBackground() const { const pQueuedMessage msg = currentMessage(); return msg.background == QBrush( Qt::NoBrush ) ? mDefaultBackground : msg.background; } QBrush pQueuedMessageWidget::currentMessageForeground() const { const pQueuedMessage msg = currentMessage(); return msg.foreground == QBrush( Qt::NoBrush ) ? mDefaultForeground : msg.foreground; } void pQueuedMessageWidget::paintEvent( QPaintEvent* event ) { if ( pendingMessageCount() == 0 ) { QWidget::paintEvent( event ); return; } QPainter painter( this ); painter.setPen( Qt::NoPen ); painter.setBrush( currentMessageBackground() ); painter.drawRect( contentsRect() ); } void pQueuedMessageWidget::buttonClicked( QAbstractButton* button ) { const pQueuedMessage msg = currentMessage(); const QDialogButtonBox::StandardButton standardButton = dbbButtons->standardButton( button ); if ( msg.object && msg.slot ) { QMetaObject::invokeMethod( msg.object.data(), msg.slot, Q_ARG( QDialogButtonBox::StandardButton, standardButton ), Q_ARG( pQueuedMessage, msg ) ); } closeMessage(); } void pQueuedMessageWidget::showMessage() { // get message pQueuedMessage msg = currentMessage(); // update palette QPalette pal = lMessage->palette(); pal.setBrush( lMessage->foregroundRole(), currentMessageForeground() ); lMessage->setPalette( pal ); // format widget lPixmap->setPixmap( currentMessagePixmap() ); lMessage->setText( msg.message ); lMessage->setToolTip( msg.message ); lMessage->setWhatsThis( msg.message ); // set buttons if ( msg.buttons.isEmpty() ) { msg.buttons[ QDialogButtonBox::Ok ] = QString::null; } dbbButtons->clear(); foreach( const QDialogButtonBox::StandardButton& button, msg.buttons.keys() ) { QPushButton* pb = dbbButtons->addButton( button ); if ( !msg.buttons[ button ].isEmpty() ) { pb->setText( msg.buttons[ button ] ); } } // auto close if needed const int timeout = msg.milliSeconds == -1 ? mDefaultTimeout : msg.milliSeconds; if ( timeout > 0 ) { QTimer::singleShot( timeout, this, SLOT( closeMessage() ) ); } // emit signal emit shown( msg ); } void pQueuedMessageWidget::closeMessage() { // emit message emit closed( currentMessage() ); // remove remove current message from hash mMessages.removeFirst(); // process next if possible, else clear gui QTimer::singleShot( 0, this, mMessages.count() > 0 ? SLOT( showMessage() ) : SLOT( clearMessage() ) ); // emit finished message if needed if ( mMessages.isEmpty() ) { emit finished(); } } void pQueuedMessageWidget::clearMessage() { lPixmap->clear(); lMessage->clear(); dbbButtons->clear(); } ./qwbfsmanager-1.2.1-src/fresh/src/gui/queuedmessage/pQueuedMessageToolBar.h0000644000175000017520000000530611546156115026417 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pQueuedMessageToolBar.h ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PQUEUEDMESSAGETOOLBAR_H #define PQUEUEDMESSAGETOOLBAR_H /*! \file pQueuedMessageToolBar.h \brief A toolbar that handle a pQueuedMessageWidget mimicing the chromium yellow toolbar. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include "pQueuedMessageWidget.h" #include /*! \ingroup FreshGui \class pQueuedMessageToolBar \brief A toolbar that handle a pQueuedMessageWidget mimicing the chromium yellow toolbar. */ class FRESH_EXPORT pQueuedMessageToolBar : public QToolBar { Q_OBJECT public: /*! Create an instance of message toolbar having parent \a parent. */ pQueuedMessageToolBar( QWidget* parent = 0 ); /*! Return a pointer to the internal pQueuedMessageWidget widget. */ pQueuedMessageWidget* queuedMessageWidget() const; protected: pQueuedMessageWidget* mQueuedWidget; /*! Reimplemented. */ void changeEvent( QEvent* event ); /*! Reimplemented. */ void paintEvent( QPaintEvent* event ); public slots: /*! \sa pQueuedMessageWidget::append( const QString&, int ) */ pQueuedMessage appendMessage( const QString& message, int milliSeconds = -1 ); /*! \sa pQueuedMessageWidget::append( const pQueuedMessage& ) */ void appendMessage( const pQueuedMessage& message ); /*! \sa pQueuedMessageWidget::remove( const pQueuedMessage& ) */ void removeMessage( const pQueuedMessage& message ); protected slots: void messageShown( const pQueuedMessage& message ); void messageFinished(); }; #endif // PQUEUEDMESSAGETOOLBAR_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/queuedmessage/pQueuedMessageWidget.h0000644000175000017520000001654111546156115026303 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pQueuedMessageWidget.h ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PQUEUEDMESSAGEWIDGET_H #define PQUEUEDMESSAGEWIDGET_H /*! \file pQueuedMessageWidget.h \brief A widget that show non blocking queued message. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include #include #include #include #include class QLabel; class QDialogButtonBox; /*! \ingroup FreshGui \struct pQueuedMessage \brief The is the \a message structure used by the pQueuedMessageWidget class. It allow to configure the message to show. Each variable is directly accessible and mostly optionnal except \c message. A default \a Ok button is added if \a buttons is empty. */ struct FRESH_EXPORT pQueuedMessage { pQueuedMessage(); /*! Return true if message are same. */ bool operator==( const pQueuedMessage& other ) const; /*! The message to show. It can contains plain text or html. */ QString message; /*! The millisecond time to wait before the message is auto closed. Use -1 for the default timeout or 0 for unlimited time. */ int milliSeconds; /*! The pixmap to show before the message. */ QPixmap pixmap; /*! The brush to use as background. */ QBrush background; /*! The brush to use as foreground. */ QBrush foreground; /*! A hash representing a StandardButton role, and it's optionnal text overridding the default StandardButton text. */ QHash buttons; // StandardButton, Button Text ( null text for standard text ) /*! The object that is used to invoke \a Slot. */ QWeakPointer object; /*! If \a object is not null, it will invoke \a slot, the slot must take 2 parameters : \param QDialogButtonBox::StandardButton The StandardButton clicked. \param pQueuedMessage The message from where the button was clicked. */ const char* slot; /*! A place to stock custom user data. */ QVariant userData; }; /*! \ingroup FreshGui \class pQueuedMessageWidget \brief A widget that show non blocking queued message. The messages are queued until they are closed by user or elapsed time timeouts. */ class FRESH_EXPORT pQueuedMessageWidget : public QWidget { Q_OBJECT friend class pQueuedMessageToolBar; public: /*! Create an instance of queued message widget having parent \a parent. */ pQueuedMessageWidget( QWidget* parent = 0 ); /*! Reimplemented. */ virtual QSize sizeHint() const; /*! Return true if external links are opened automatically. */ bool openExternalLinks() const; /*! Return the default timeout of messages. */ int defaultTimeout() const; /*! Return the default pixmap of messages. */ QPixmap defaultPixmap() const; /*! Return the default background of messages. */ QBrush defaultBackground() const; /*! Return the default foreground of messages. */ QBrush defaultForeground() const; /*! Return the current message data. Pointers can be null if u don't need the information. */ void currentMessageInformations( QPixmap* pixmap, QBrush* background, QBrush* foreground ) const; /*! Return the pending messages count. The current displayed one is counted. */ int pendingMessageCount() const; /*! Return the currently shown message. */ pQueuedMessage currentMessage() const; /*! Append string \a message to show with auto close at \a milliSeconds and return the corresponding pQueuedMessage. If the exact same message exists nothing is append. The message will be immediatly shown if the messages list is empty, else it's pended. \note Use -1 for the default timeout or 0 for unlimited time. */ pQueuedMessage append( const QString& message, int milliSeconds = -1 ); public slots: /*! Set auto external links opening according to \a open. */ void setOpenExternalLinks( bool open ); /*! Set the default timeout to \a timeout. */ void setDefaultTimeout( int timeout ); /*! Set the default pixmap to \a pixmap. */ void setDefaultPixmap( const QPixmap& pixmap ); /*! Set the default background to \a brush. */ void setDefaultBackground( const QBrush& brush ); /*! Set the default foreground to \a brush. */ void setDefaultForeground( const QBrush& brush ); /*! Append \a message. */ void append( const pQueuedMessage& message ); /*! Remove pending \a message if it's not the current current viewev one. */ void remove( const pQueuedMessage& message ); /*! Clear all messages. The current viewed one is cleared too. */ void clear(); protected: int mDefaultTimeout; QPixmap mDefaultPixmap; QBrush mDefaultBackground; QBrush mDefaultForeground; QLabel* lPixmap; QLabel* lMessage; QDialogButtonBox* dbbButtons; QList mMessages; /*! Helper to get current message pixmap. */ QPixmap currentMessagePixmap() const; /*! Helper to get current message background. */ QBrush currentMessageBackground() const; /*! Helper to get current message foreground. */ QBrush currentMessageForeground() const; /*! Reimplemented. */ void paintEvent( QPaintEvent* event ); protected slots: void buttonClicked( QAbstractButton* button ); /*! Helper that update the pixmap / messages / buttons of the current message. */ void showMessage(); /*! Helper that close the current message. If there is still pending message the next one will be shown. */ void closeMessage(); /*! Clear the view (remove pixmap / message / buttons ). */ void clearMessage(); signals: /*! This signal is emited when \a message is make visible to user. */ void shown( const pQueuedMessage& message ); /*! This signal is emited when \a message is closed. A message is closed when the user click one of the buttons of a message or when closeMessage() is called. \sa clearMessage() */ void closed( const pQueuedMessage& message ); /*! This signal is emited when clear() is called. \sa clear(); */ void cleared(); /*! This message is emited when the last pending message is closed. */ void finished(); /*! This signal is emited when a link in a message is clicked, \a link being the clicked link. */ void linkActivated( const QString& link ); /*! This signal is emited when a link in a message is hovered, \a link being the hovered link. */ void linkHovered( const QString& link ); }; #endif // PQUEUEDMESSAGEWIDGET_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/queuedmessage/pQueuedMessageToolBar.cpp0000644000175000017520000000636211546156115026755 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pQueuedMessageToolBar.cpp ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pQueuedMessageToolBar.h" #include #include #include #include #include pQueuedMessageToolBar::pQueuedMessageToolBar( QWidget* parent ) : QToolBar( parent ) { mQueuedWidget = new pQueuedMessageWidget( this ); setObjectName( metaObject()->className() ); setMovable( false ); setFloatable( false ); setAllowedAreas( Qt::TopToolBarArea ); toggleViewAction()->setEnabled( false ); toggleViewAction()->setVisible( false ); addWidget( mQueuedWidget ); layout()->setMargin( 3 ); // connections connect( mQueuedWidget, SIGNAL( shown( const pQueuedMessage& ) ), this, SLOT( messageShown( const pQueuedMessage& ) ) ); connect( mQueuedWidget, SIGNAL( finished() ), this, SLOT( messageFinished() ) ); } pQueuedMessageWidget* pQueuedMessageToolBar::queuedMessageWidget() const { return mQueuedWidget; } void pQueuedMessageToolBar::changeEvent( QEvent* event ) { if ( event->type() == QEvent::FontChange ) { mQueuedWidget->setFont( font() ); } QToolBar::changeEvent( event ); } void pQueuedMessageToolBar::paintEvent( QPaintEvent* event ) { if ( mQueuedWidget->pendingMessageCount() == 0 ) { QToolBar::paintEvent( event ); return; } const QBrush brush = mQueuedWidget->currentMessageBackground(); QPainter painter( this ); painter.setPen( brush.color().darker( 150 ) ); painter.setBrush( brush ); painter.drawRect( contentsRect().adjusted( 0, 0, -1, -1 ) ); } pQueuedMessage pQueuedMessageToolBar::appendMessage( const QString& message, int milliSeconds ) { return mQueuedWidget->append( message, milliSeconds ); } void pQueuedMessageToolBar::appendMessage( const pQueuedMessage& message ) { mQueuedWidget->append( message ); } void pQueuedMessageToolBar::removeMessage( const pQueuedMessage& message ) { mQueuedWidget->remove( message ); } void pQueuedMessageToolBar::messageShown( const pQueuedMessage& message ) { Q_UNUSED( message ); if ( !isVisible() ) { setVisible( true ); } } void pQueuedMessageToolBar::messageFinished() { if ( isVisible() ) { setVisible( false ); } } ./qwbfsmanager-1.2.1-src/fresh/src/gui/gc-updatechecker/0000755000175000017520000000000011546156115022403 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/fresh/src/gui/gc-updatechecker/pUpdateCheckerDialog.h0000644000175000017520000000652211546156115026570 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pUpdateCheckerDialog.h ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PUPDATECHECKERDIALOG_H #define PUPDATECHECKERDIALOG_H /*! \file pUpdateCheckerDialog.h \brief A update checker dialog. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include "pVersion.h" #include #include #include #include #include class Ui_pUpdateCheckerDialog; class pUpdateChecker; class QNetworkAccessManager; class QNetworkReply; class QListWidgetItem; class QUrl; class FRESH_EXPORT pUpdateItem { public: enum Type { Updated, Id, Link, Title, Author, Content }; pUpdateItem( pUpdateChecker* updateChecker = 0, const QDomElement& element = QDomElement() ); bool operator<( const pUpdateItem& other ) const; bool operator>( const pUpdateItem& other ) const; bool operator<( const pVersion& other ) const; bool operator>( const pVersion& other ) const; QDateTime updated() const; QString id() const; QUrl link() const; QString title() const; QString author() const; QString content() const; QString toolTip() const; bool isFeatured() const; QString displayText() const; QString versionString() const; pVersion version() const; bool isValid() const; protected: pUpdateChecker* mUpdateChecker; QHash mDatas; }; /*! \ingroup FreshGui \class pUpdateCheckerDialog \brief A update checker dialog. This dialog is used by pUpdateChecker. */ class FRESH_EXPORT pUpdateCheckerDialog : public QDialog { Q_OBJECT public: /*! Create an instance of pUpdateCheckerDialog for \a updateChecker having parent \a parent. */ pUpdateCheckerDialog( pUpdateChecker* updateChecker, QWidget* parent = 0 ); /*! Reimplemented. */ virtual bool event( QEvent* event ); protected: Ui_pUpdateCheckerDialog* ui; pUpdateChecker* mUpdateChecker; QNetworkAccessManager* mAccessManager; void localeChanged(); protected slots: void accessManager_finished( QNetworkReply* reply ); void on_lwVersions_itemSelectionChanged(); void on_lwVersions_itemDoubleClicked( QListWidgetItem* item ); /*! Reimplemented. */ virtual void accept(); }; Q_DECLARE_METATYPE( pUpdateItem ) #endif // PUPDATECHECKERDIALOG_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/gc-updatechecker/pUpdateCheckerDialog.cpp0000644000175000017520000002031111546156115027113 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pUpdateCheckerDialog.cpp ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pUpdateCheckerDialog.h" #include "ui_pUpdateCheckerDialog.h" #include "pUpdateChecker.h" #include #include #include #include #include #include // pUpdateItem pUpdateItem::pUpdateItem( pUpdateChecker* updateChecker, const QDomElement& element ) { mUpdateChecker = updateChecker; QDomNodeList nodes = element.childNodes(); for ( int i = 0; i < nodes.count(); i++ ) { const QDomElement el = nodes.at( i ).toElement(); const QString name = el.tagName(); if ( name == "updated" ) { mDatas[ pUpdateItem::Updated ] = el.firstChild().toText().data(); } else if ( name == "id" ) { mDatas[ pUpdateItem::Id ] = el.firstChild().toText().data(); } else if ( name == "link" ) { mDatas[ pUpdateItem::Link ] = el.attribute( "href" ); } else if ( name == "title" ) { mDatas[ pUpdateItem::Title ] = el.firstChild().toText().data().trimmed(); } else if ( name == "author" ) { mDatas[ pUpdateItem::Author ] = el.firstChild().firstChild().toText().data(); } else if ( name == "content" ) { mDatas[ pUpdateItem::Content ] = el.firstChild().toText().data().trimmed(); } } } bool pUpdateItem::operator<( const pUpdateItem& other ) const { return pVersion( version() ) < pVersion( other.version() ); } bool pUpdateItem::operator>( const pUpdateItem& other ) const { return pVersion( version() ) > pVersion( other.version() ); } bool pUpdateItem::operator<( const pVersion& other ) const { return pVersion( version() ) < other; } bool pUpdateItem::operator>( const pVersion& other ) const { return pVersion( version() ) > other; } QDateTime pUpdateItem::updated() const { return QDateTime::fromString( mDatas.value( pUpdateItem::Updated ), Qt::ISODate ); } QString pUpdateItem::id() const { return mDatas.value( pUpdateItem::Id ); } QUrl pUpdateItem::link() const { return QUrl( mDatas.value( pUpdateItem::Link ) ); } QString pUpdateItem::title() const { return mDatas.value( pUpdateItem::Title ); } QString pUpdateItem::author() const { return mDatas.value( pUpdateItem::Author ); } QString pUpdateItem::content() const { return mDatas.value( pUpdateItem::Content ); } QString pUpdateItem::toolTip() const { return content().replace( QRegExp( "" ), pUpdateCheckerDialog::tr( QT_TRANSLATE_NOOP( "pUpdateCheckerDialog", "Updated on %1 by %2" ) ) .arg( updated().toString( Qt::DefaultLocaleLongDate ) ) .arg( author() ) ); } bool pUpdateItem::isFeatured() const { return content().contains( "Featured", Qt::CaseInsensitive ); } QString pUpdateItem::displayText() const { return content().split( "\n" ).value( 1 ).trimmed().append( " ( " ).append( title() ).append( " ) " ); } QString pUpdateItem::versionString() const { if ( !mUpdateChecker ) { return QString::null; } const QString text = title(); QRegExp rx( mUpdateChecker->versionDiscoveryPattern() ); if ( rx.exactMatch( text ) ) { return rx.cap( 1 ); } return QString::null; } pVersion pUpdateItem::version() const { return pVersion( versionString() ); } bool pUpdateItem::isValid() const { return !mDatas.isEmpty(); } // pUpdateCheckerDialog pUpdateCheckerDialog::pUpdateCheckerDialog( pUpdateChecker* updateChecker, QWidget* parent ) : QDialog( parent ) { Q_ASSERT( updateChecker ); ui = new Ui_pUpdateCheckerDialog; mUpdateChecker = updateChecker; ui->setupUi( this ); setAttribute( Qt::WA_DeleteOnClose ); setAttribute( Qt::WA_MacSmallSize ); ui->dbbButtons->button( QDialogButtonBox::Yes )->setEnabled( false ); foreach ( QWidget* widget, findChildren() ) { widget->setAttribute( Qt::WA_MacSmallSize ); } mAccessManager = new QNetworkAccessManager( this ); localeChanged(); connect( mAccessManager, SIGNAL( finished( QNetworkReply* ) ), this, SLOT( accessManager_finished( QNetworkReply* ) ) ); mAccessManager->get( QNetworkRequest( mUpdateChecker->downloadsFeedUrl() ) ); } bool pUpdateCheckerDialog::event( QEvent* event ) { switch ( event->type() ) { case QEvent::LocaleChange: localeChanged(); break; default: break; } return QDialog::event( event ); } void pUpdateCheckerDialog::localeChanged() { ui->retranslateUi( this ); ui->lVersion->setText( tr( "You are using version %1 (%2)." ).arg( mUpdateChecker->version() ).arg( mUpdateChecker->versionString() ) ); ui->dbbButtons->button( QDialogButtonBox::Yes )->setText( tr( "Download" ) ); } void pUpdateCheckerDialog::accessManager_finished( QNetworkReply* reply ) { localeChanged(); const pVersion currentVersion( mUpdateChecker->version() ); const QDateTime lastUpdated = mUpdateChecker->lastUpdated(); //const QDateTime lastCheck = mUpdateChecker->lastChecked(); if ( reply->error() != QNetworkReply::NoError ) { ui->lwVersions->addItem( new QListWidgetItem( tr( "An error occur: %1" ).arg( reply->errorString() ) ) ); } else { QDomDocument document; if ( document.setContent( reply->readAll() ) ) { const QString updatedText = document.elementsByTagName( "updated" ).at( 0 ).firstChild().toText().data(); const QDateTime updated = QDateTime::fromString( updatedText, Qt::ISODate ); const QDomNodeList entries = document.elementsByTagName( "entry" ); for ( int i = 0; i < entries.count(); i++ ) { const QDomElement element = entries.at( i ).toElement(); const pUpdateItem updateItem( mUpdateChecker, element ); if ( updateItem.isFeatured() && updateItem > currentVersion ) { QListWidgetItem* item = new QListWidgetItem( updateItem.displayText() ); item->setToolTip( updateItem.toolTip() ); item->setData( Qt::UserRole, QVariant::fromValue( updateItem ) ); ui->lwVersions->addItem( item ); } } mUpdateChecker->setLastUpdated( updated ); if ( ui->lwVersions->count() > 0 ) { if ( !isVisible() && lastUpdated < updated ) { open(); } } else { QListWidgetItem* item = new QListWidgetItem( tr( "You are running the last available version." ) ); item->setFlags( Qt::NoItemFlags ); ui->lwVersions->addItem( item ); if ( !isVisible() ) { close(); } } } else { ui->lwVersions->addItem( new QListWidgetItem( tr( "An error occur while parsing xml, retry later." ) ) ); } } mUpdateChecker->setLastChecked( QDateTime::currentDateTime() ); } void pUpdateCheckerDialog::on_lwVersions_itemSelectionChanged() { QListWidgetItem* item = ui->lwVersions->selectedItems().value( 0 ); const pUpdateItem updateItem = item ? item->data( Qt::UserRole ).value() : pUpdateItem(); ui->dbbButtons->button( QDialogButtonBox::Yes )->setEnabled( updateItem.isValid() ); } void pUpdateCheckerDialog::on_lwVersions_itemDoubleClicked( QListWidgetItem* item ) { Q_UNUSED( item ); ui->dbbButtons->button( QDialogButtonBox::Yes )->click(); } void pUpdateCheckerDialog::accept() { QListWidgetItem* item = ui->lwVersions->selectedItems().value( 0 ); const pUpdateItem updateItem = item->data( Qt::UserRole ).value(); QDesktopServices::openUrl( updateItem.link() ); QDialog::accept(); } ./qwbfsmanager-1.2.1-src/fresh/src/gui/gc-updatechecker/pUpdateChecker.h0000644000175000017520000000770611546156115025455 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pUpdateChecker.h ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PUPDATECHECKER_H #define PUPDATECHECKER_H /*! \file pUpdateChecker.h \brief A class for checking available update for your application. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include #include #include #include class QAction; /*! \ingroup FreshGui \class pUpdateChecker \brief A class for checking available update for your application. A class for checking available update for your application based on a download feed. Currently only google code projects is supported. */ class FRESH_EXPORT pUpdateChecker : public QObject { Q_OBJECT public: /*! Create an instance of pUpdateChecker having parent \a parent. */ pUpdateChecker( QWidget* parent = 0 ); /*! Return a QAction that can be put in menu to show the update checker dialog. */ QAction* menuAction() const; /*! Return the datetime of the update attribute of the downloads feed. */ QDateTime lastUpdated() const; /*! Return the last datetime the feed was checked. */ QDateTime lastChecked() const; /*! Return the url of the feed to download. */ QUrl downloadsFeedUrl() const; /*! The current version of the application. */ QString version() const; /*! The current version string of the application. */ QString versionString() const; /*! The regular expression pattern to detect version from releases file name. */ QString versionDiscoveryPattern() const; public slots: /*! Set the datetime of the last feed's update. */ void setLastUpdated( const QDateTime& dateTime ); /*! Set the datetime of the last time the feed was downloaded. */ void setLastChecked( const QDateTime& dateTime ); /*! Set the url of the feed to download. */ void setDownloadsFeedUrl( const QUrl& url ); /*! Set the application current version. (ie: 1.8.4.0a) */ void setVersion( const QString& version ); /*! Set the application version string. (ie: 1.8.4.b Code Banana) */ void setVersionString( const QString& versionString ); /*! Set the regular expression pattern to detect version from release file name. (ie: ".*qwbfsmanager-([0-9\\.]+).*" ) */ void setVersionDiscoveryPattern( const QString& pattern ); /*! Do a silent check in the background. If new versions are available a pUpdateCheckerDialog will be shown to the user. */ void silentCheck(); protected: QAction* mAction; QDateTime mLastUpdated; QDateTime mLastChecked; QUrl mDownloadsFeed; QString mVersion; QString mVersionString; QString mVersionDiscoveryPattern; QWeakPointer mParent; /*! Reimplemented. */ virtual bool eventFilter( QObject* object, QEvent* event ); virtual void localeChanged(); protected slots: void checkForUpdate_triggered( bool show = true ); }; #endif // PUPDATECHECKER_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/gc-updatechecker/pUpdateCheckerDialog.ui0000644000175000017520000001147411546156115026760 0ustar pasnoxpasnox pUpdateCheckerDialog 0 0 502 282 Update Checker :/fresh/icons/gc-update-checker.png:/fresh/icons/gc-update-checker.png 0 0 :/fresh/icons/gc-update-checker.png 0 0 11 75 true Update Checker Qt::AlignCenter 0 0 When an update is detected, you can directly download it (or update it with your package manager). Generally lastest updates fix bugs and/or add new options/plugins/things. Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft true Qt::Vertical QSizePolicy::Fixed 16 5 Qt::Vertical QSizePolicy::Fixed 16 5 Qt::AlignCenter 0 true QDialogButtonBox::Close|QDialogButtonBox::Yes dbbButtons rejected() pUpdateCheckerDialog reject() 280 276 326 326 dbbButtons accepted() pUpdateCheckerDialog accept() 230 276 236 326 ./qwbfsmanager-1.2.1-src/fresh/src/gui/gc-updatechecker/pUpdateChecker.cpp0000644000175000017520000000663111546156115026004 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pUpdateChecker.cpp ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pUpdateChecker.h" #include "pUpdateCheckerDialog.h" #include "pIconManager.h" #include #include #include pUpdateChecker::pUpdateChecker( QWidget* parent ) : QObject( parent ) { Q_ASSERT( parent ); mParent = parent; mAction = new QAction( this ); mAction->setIcon( pIconManager::pixmap( "gc-update-checker.png", ":/fresh/icons" ) ); localeChanged(); mParent.data()->installEventFilter( this ); connect( mAction, SIGNAL( triggered() ), this, SLOT( checkForUpdate_triggered() ) ); } bool pUpdateChecker::eventFilter( QObject* object, QEvent* event ) { switch ( event->type() ) { case QEvent::LocaleChange: localeChanged(); break; default: break; } return QObject::eventFilter( object, event ); } QAction* pUpdateChecker::menuAction() const { return mAction; } QDateTime pUpdateChecker::lastUpdated() const { return mLastUpdated; } void pUpdateChecker::setLastUpdated( const QDateTime& dateTime ) { mLastUpdated = dateTime; } QDateTime pUpdateChecker::lastChecked() const { return mLastChecked; } void pUpdateChecker::setLastChecked( const QDateTime& dateTime ) { mLastChecked = dateTime; } QUrl pUpdateChecker::downloadsFeedUrl() const { return mDownloadsFeed; } void pUpdateChecker::setDownloadsFeedUrl( const QUrl& url ) { mDownloadsFeed = url; } QString pUpdateChecker::version() const { return mVersion; } void pUpdateChecker::setVersion( const QString& version ) { mVersion = version; } QString pUpdateChecker::versionString() const { return mVersionString; } void pUpdateChecker::setVersionString( const QString& versionString ) { mVersionString = versionString; } QString pUpdateChecker::versionDiscoveryPattern() const { return mVersionDiscoveryPattern; } void pUpdateChecker::setVersionDiscoveryPattern( const QString& pattern ) { mVersionDiscoveryPattern = pattern; } void pUpdateChecker::silentCheck() { checkForUpdate_triggered( false ); } void pUpdateChecker::localeChanged() { mAction->setText( tr( "Update" ) ); mAction->setToolTip( tr( "Check for update" ) ); } void pUpdateChecker::checkForUpdate_triggered( bool show ) { pUpdateCheckerDialog* dlg = new pUpdateCheckerDialog( this, mParent.data() ); if ( show ) { dlg->open(); } } ./qwbfsmanager-1.2.1-src/fresh/src/gui/pToolButton.cpp0000644000175000017520000001510311546156115022202 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pToolButton.cpp ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pToolButton.h" #include #include #include #include #include #include #include pToolButton::pToolButton( QWidget* parent, QBoxLayout::Direction direction ) : QToolButton( parent ) { mMenuDown = false; setDirection( direction ); } QSize pToolButton::internalSize( Qt::Orientation orientation ) const { QSize size = QToolButton::size(); Qt::Orientation buttonOrientation = Qt::Horizontal; switch ( mDirection ) { case QBoxLayout::TopToBottom: case QBoxLayout::BottomToTop: buttonOrientation = Qt::Vertical; break; default: break; } if ( buttonOrientation != orientation ) { size.transpose(); } return size; } void pToolButton::paint( QStyleOptionToolButton* option ) { Q_ASSERT( option ); QPainter painter( this ); QTransform transform; // fix some properties due to rotation not handled by Qt switch ( cursorArea() ) { case pToolButton::caButtonClicked: option->activeSubControls |= QStyle::SC_ToolButton; if ( popupMode() == QToolButton::MenuButtonPopup ) { option->state |= QStyle::State_MouseOver; option->activeSubControls |= QStyle::SC_ToolButtonMenu; } break; default: break; } switch ( mDirection ) { case QBoxLayout::TopToBottom: option->rect.setSize( internalSize( Qt::Horizontal ) ); transform.rotate( 90 ); transform.translate( 0, -option->rect.height() +1 ); break; case QBoxLayout::BottomToTop: option->rect.setSize( internalSize( Qt::Horizontal ) ); transform.rotate( -90 ); transform.translate( -option->rect.width() +1, 0 ); break; default: break; } painter.setTransform( transform ); style()->drawComplexControl( QStyle::CC_ToolButton, option, &painter, this ); } void pToolButton::paintEvent( QPaintEvent* event ) { Q_UNUSED( event ); QStyleOptionToolButton option; initStyleOption( &option ); paint( &option ); } void pToolButton::mousePressEvent( QMouseEvent* event ) { switch ( cursorArea( event->pos() ) ) { case pToolButton::caArrowClicked: mMenuDown = true; showMenu(); mMenuDown = false; break; case pToolButton::caButtonClicked: setDown( !isDown() ); break; case pToolButton::caNone: break; default: QAbstractButton::mousePressEvent( event ); break; } // update button update(); } void pToolButton::mouseMoveEvent( QMouseEvent* event ) { QAbstractButton::mouseMoveEvent( event ); if ( event->buttons() != Qt::NoButton ) { setDown( hitButton( event->pos() ) ); } } void pToolButton::mouseReleaseEvent( QMouseEvent* event ) { mMenuDown = false; switch ( cursorArea( event->pos() ) ) { case pToolButton::caButton: click(); break; case pToolButton::caArrow: case pToolButton::caNone: break; default: QAbstractButton::mouseReleaseEvent( event ); break; } // update button update(); } pToolButton::CursorArea pToolButton::cursorArea( const QPoint& _pos ) const { // cursor pos const QPoint pos = _pos.isNull() ? mapFromGlobal( QCursor::pos() ) : _pos; // if not contain is button return none if ( !hitButton( pos ) ) { return pToolButton::caNone; } // is arrow type bool arrowType = popupMode() == QToolButton::MenuButtonPopup; // is mouse pressed ?! bool mousePressed = QApplication::mouseButtons() & Qt::LeftButton; // check if we are a arrow button if ( arrowType ) { // get bounding rectangle QRect rect = this->rect(); // get style options QStyleOptionToolButton opt; initStyleOption( &opt ); // force to do horizontal calcul opt.rect.setSize( internalSize( Qt::Horizontal ) ); // get arraow bounding rectangle QSize size = style()->subControlRect( QStyle::CC_ToolButton, &opt, QStyle::SC_ToolButtonMenu, this ).size(); switch ( mDirection ) { case QBoxLayout::BottomToTop: size.transpose(); break; case QBoxLayout::TopToBottom: size.transpose(); rect.setY( rect.height() -size.height() ); break; default: rect.setX( rect.width() -size.width() ); break; } // get valid bounding rectangle size rect.setSize( size ); // in arrow bounding rect if ( rect.isValid() && rect.contains( pos ) ) { return mousePressed ? pToolButton::caArrowClicked : pToolButton::caArrow; } } // in button return mousePressed ? pToolButton::caButtonClicked : pToolButton::caButton; } QMenu* pToolButton::hasMenu() const { QMenu* menu = this->menu(); if ( !menu && defaultAction() ) { menu = defaultAction()->menu(); } return menu; } bool pToolButton::menuButtonDown() const { #ifndef QT_NO_MENU return hasMenu() && mMenuDown; #else return false; #endif } QSize pToolButton::minimumSizeHint() const { return QSize(); } QSize pToolButton::sizeHint() const { //get default size QSize size = QToolButton::sizeHint(); // calcul new size hint switch ( mDirection ) { case QBoxLayout::LeftToRight: case QBoxLayout::RightToLeft: break; case QBoxLayout::TopToBottom: case QBoxLayout::BottomToTop: size.transpose(); break; } // return new size hint return size; } QBoxLayout::Direction pToolButton::direction() const { return mDirection; } void pToolButton::setDirection( QBoxLayout::Direction direction ) { if ( mDirection == direction ) { return; } mDirection = direction; updateGeometry(); } QVariant pToolButton::userData() const { return mUserData; } void pToolButton::setUserData( const QVariant& data ) { mUserData = data; } ./qwbfsmanager-1.2.1-src/fresh/src/gui/pTranslationDialog.cpp0000644000175000017520000001522511546156115023514 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pTranslationDialog.cpp ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pTranslationDialog.h" #include "ui_pTranslationDialog.h" #include "pTranslationManager.h" #include "pIconManager.h" #include "listeditor/pPathListEditor.h" #include #include pTranslationDialog::pTranslationDialog( QWidget* parent ) : QDialog( parent ), ui( 0 ) { init( 0 ); } pTranslationDialog::pTranslationDialog( pTranslationManager* translationManager, QWidget* parent ) : QDialog( parent ), ui( 0 ) { init( translationManager ); } pTranslationDialog::~pTranslationDialog() { delete ui; } bool pTranslationDialog::event( QEvent* event ) { switch ( event->type() ) { case QEvent::LocaleChange: localeChanged(); break; default: break; } return QDialog::event( event ); } pTranslationManager* pTranslationDialog::translationManager() const { return mTranslationManager; } void pTranslationDialog::setTranslationManager( pTranslationManager* translationManager ) { init( translationManager ); } QString pTranslationDialog::selectedLocale() const { const QTreeWidgetItem* currentItem = ui->twLocales->selectedItems().value( 0 ); return currentItem ? currentItem->data( 0, Qt::UserRole ).toString() : ( mTranslationManager ? mTranslationManager->currentLocale().name() : QString::null ); } QString pTranslationDialog::getLocale( pTranslationManager* translationManager, QWidget* parent ) { pTranslationDialog dlg( translationManager, parent ); if ( dlg.exec() == QDialog::Accepted ) { return dlg.selectedLocale(); } return QString::null; } void pTranslationDialog::localeChanged() { ui->retranslateUi( this ); } void pTranslationDialog::on_tbLocate_clicked() { if ( !mTranslationManager ) { return; } QDialog dlg( this ); pPathListEditor* editor = new pPathListEditor( tr( "Choose folders containing your application translations" ), QApplication::applicationDirPath(), &dlg ); QDialogButtonBox* buttons = new QDialogButtonBox( &dlg ); QVBoxLayout* vl = new QVBoxLayout( &dlg ); vl->addWidget( editor ); vl->addWidget( buttons ); buttons->setStandardButtons( QDialogButtonBox::Cancel | QDialogButtonBox::Ok ); editor->setValues( mTranslationManager->translationsPaths() ); connect( buttons, SIGNAL( rejected() ), &dlg, SLOT( reject() ) ); connect( buttons, SIGNAL( accepted() ), &dlg, SLOT( accept() ) ); if ( dlg.exec() == QDialog::Rejected ) { return; } mTranslationManager->setTranslationsPaths( editor->values() ); ui->tbReload->click(); } void pTranslationDialog::init( pTranslationManager* translationManager ) { if ( mTranslationManager == translationManager ) { return; } mTranslationManager = translationManager; mOriginalLocale = mTranslationManager ? mTranslationManager->currentLocale().name() : locale().name(); if ( !ui ) { ui = new Ui::pTranslationDialog; ui->setupUi( this ); } ui->tbReload->click(); localeChanged(); } QTreeWidgetItem* pTranslationDialog::newItem( const QLocale& locale ) { const QString language = QLocale::languageToString( locale.language() ); const QString country = QLocale::countryToString( locale.country() ); const QString countryCode = locale.name().section( '_', 1 ); QTreeWidgetItem* item = new QTreeWidgetItem; item->setIcon( 0, pIconManager::icon( QString( "%1.png" ).arg( countryCode.toLower() ), ":/fresh/country-flags" ) ); item->setText( 0, QString( "%1 (%2)" ).arg( language ).arg( country ) ); item->setToolTip( 0, locale.name() ); item->setData( 0, Qt::UserRole, locale.name() ); return item; } QTreeWidgetItem* pTranslationDialog::rootItem( const QLocale& locale ) { QTreeWidgetItem* item = mRootItems.value( locale.name() ); if ( !item ) { item = newItem( locale ); ui->twLocales->addTopLevelItem( item ); mRootItems[ locale.name() ] = item; } return item; } void pTranslationDialog::on_tbReload_clicked() { // reload translations if needed if ( mTranslationManager && mTranslationManager->availableLocales().isEmpty() ) { mTranslationManager->reloadTranslations(); } // keep current locale const QString currentLocale = selectedLocale(); // clear items ui->twLocales->clear(); mRootItems.clear(); // create new ones if ( mTranslationManager ) { foreach ( const QLocale& _locale, mTranslationManager->availableQLocales() ) { const QLocale locale = _locale.language() == QLocale::C ? QLocale( QLocale::English ) : _locale; QTreeWidgetItem* rootItem = this->rootItem( QLocale( locale.language() ) ); if ( rootItem->data( 0, Qt::UserRole ).toString() == locale.name() ) { continue; } rootItem->addChild( newItem( locale ) ); } } // sort items ui->twLocales->sortByColumn( 0, Qt::AscendingOrder ); // restore locale QAbstractItemModel* model = ui->twLocales->model(); QModelIndex index = model->match( model->index( 0, 0 ), Qt::UserRole, currentLocale, 1, Qt::MatchFixedString | Qt::MatchWrap ).value( 0 ); if ( !index.isValid() ) { index = model->match( model->index( 0, 0 ), Qt::UserRole, currentLocale, 1, Qt::MatchStartsWith | Qt::MatchWrap ).value( 0 ); } ui->twLocales->setCurrentIndex( index ); } void pTranslationDialog::on_twLocales_itemSelectionChanged() { if ( mTranslationManager ) { mTranslationManager->setCurrentLocale( selectedLocale() ); mTranslationManager->reloadTranslations(); setLocale( selectedLocale() ); } } void pTranslationDialog::reject() { if ( mTranslationManager ) { mTranslationManager->setCurrentLocale( mOriginalLocale ); mTranslationManager->reloadTranslations(); } QDialog::reject(); } void pTranslationDialog::accept() { QDialog::accept(); } ./qwbfsmanager-1.2.1-src/fresh/src/gui/pTranslationDialog.ui0000644000175000017520000000705211546156115023346 0ustar pasnoxpasnox pTranslationDialog 0 0 400 300 Choose a translation locale :/fresh/icons/translation.png:/fresh/icons/translation.png Select the locale you want to use with the application. You can click on buttons to locate/reload the translations. true Qt::Horizontal 325 20 Click here to change the application translations paths :/fresh/icons/folder.png:/fresh/icons/folder.png Click here to reload the translations :/fresh/icons/update.png:/fresh/icons/update.png true true true QDialogButtonBox::Cancel|QDialogButtonBox::Ok dbbButtons accepted() pTranslationDialog accept() 195 272 221 309 dbbButtons rejected() pTranslationDialog reject() 133 282 149 326 ./qwbfsmanager-1.2.1-src/fresh/src/gui/pPaypalButton.h0000644000175000017520000001036311546156115022163 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pPaypalButton.h ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PPAYPALBUTTON_H #define PPAYPALBUTTON_H /*! \file pPaypalButton.h \brief A custom button providing paypal donation. \author Filipe Azevedo aka Nox P\@sNox */ #include #include #include #define PAYPAL_DOMAIN "https://www.paypal.com" #define PAYPAL_MASK "https://www.paypal.com/%1/i/btn/btn_donate_LG.gif" /*! \ingroup FreshGui \class pPaypalButton \brief A custom button providing paypal donation. This button allow your application to easily receives paypal donations. The network traffic is handled by the global instance of pNetworkAccessManager. \sa pNetworkAccessManager::instance(). */ class pPaypalButton : public QPushButton { Q_OBJECT public: /*! Create an instance of button having \a parent as parent. */ pPaypalButton( QWidget* parent = 0 ); /*! Reimplemented. */ virtual QSize minimumSizeHint() const; /*! Reimplemented. */ virtual QSize sizeHint() const; /*! Reimplemented. */ virtual bool event( QEvent* event ); /*! Return the http post action url. */ QString actionPost() const; /*! Return your donation item business id. */ QString businessId() const; /*! Return your donation item name. */ QString itemName() const; /*! Return your donation item id. */ QString itemId() const; /*! Return the currency used by your donation item. */ QString currencyCode() const; /*! Return true if the http request should be automatically opened using QDesktopServices::openUrl() else false. */ bool autoOpenUrl() const; /*! Return the final generated url that will be opened when clicking the button. */ QUrl url() const; /*! Return the pixmap url for \a locale. */ static QUrl pixmapUrl( const QString& locale ); public slots: /*! Set the http post action to \a url. */ void setActionPost( const QString& value ); /*! Set the donation item business id to \a value. */ void setBusinessId( const QString& value ); /*! Set the donation item name to \a value. */ void setItemName( const QString& value ); /*! Set the donation item id to \a value. */ void setItemId( const QString& value ); /*! Set the donation item currency code to \a value.. */ void setCurrencyCode( const QString& value ); /*! Set if the button should automatically open url() when the user click on the button. Give true to automatically open it, else give false and handle the clicked( const QUrl& ) signal. */ void setAutoOpenUrl( bool open ); protected: QHash mQueryItems; QPixmap mPixmap; bool mAutoOpenUrl; QPixmap pixmap( const QUrl& url ) const; /*! Reimplemented. */ virtual void paintEvent( QPaintEvent* event ); void localeChanged(); protected slots: void updatePixmap(); void _q_clicked(); void networkAccessManager_cached( const QUrl& url ); void networkAccessManager_error( const QUrl& url, const QString& message ); void networkAccessManager_cacheCleared(); signals: /*! This signal is emit when the user click the button and that autoOpenUrl() is false. */ void clicked( const QUrl& url ); }; #endif // PPAYPALBUTTON_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/environmentvariablemanager/0000755000175000017520000000000011546156115024612 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/fresh/src/gui/environmentvariablemanager/pEnvironmentVariablesEditor.ui0000644000175000017520000000707111546156115032642 0ustar pasnoxpasnox pEnvironmentVariablesEditor 0 0 498 198 Environment Variables Editor 0 22 22 false 0 :/fresh/icons/add.png:/fresh/icons/add.png Add Add a new variable :/fresh/icons/edit.png:/fresh/icons/edit.png Edit Edit the selected variable :/fresh/icons/remove.png:/fresh/icons/remove.png Remove Remove the selected variable Del :/fresh/icons/clear.png:/fresh/icons/clear.png Clear Clear all variables :/fresh/icons/restore.png:/fresh/icons/restore.png Reset to default Reset to system variables :/fresh/icons/reload.png:/fresh/icons/reload.png Reset to default Reset to default variables ./qwbfsmanager-1.2.1-src/fresh/src/gui/environmentvariablemanager/pEnvironmentVariablesManager.cpp0000644000175000017520000001224111546156115033126 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pEnvironmentVariablesManager.cpp ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pEnvironmentVariablesManager.h" #include "pSettings.h" #include const QString pEnvironmentVariablesManager::mSettingsKey( "EnvironmentVariables" ); pEnvironmentVariablesManager::pEnvironmentVariablesManager() { } pEnvironmentVariablesManager::~pEnvironmentVariablesManager() { } bool pEnvironmentVariablesManager::load() { return readVariables( mVariables ); } bool pEnvironmentVariablesManager::save() { return writeVariables( mVariables ); } pEnvironmentVariablesModel::Variables pEnvironmentVariablesManager::variables() const { pEnvironmentVariablesModel::Variables variables = mVariables; if ( variables.isEmpty() ) { variables = pEnvironmentVariablesModel::stringListToVariables( QProcessEnvironment::systemEnvironment().toStringList() ); } else { mergeNewVariables( variables ); } return variables; } void pEnvironmentVariablesManager::setVariables( const pEnvironmentVariablesModel::Variables& variables ) { mVariables = removeUnmodifiedVariables( variables ); } bool pEnvironmentVariablesManager::mergeNewVariables( pEnvironmentVariablesModel::Variables& variables ) const { const pEnvironmentVariablesModel::Variables newVariables = pEnvironmentVariablesModel::stringListToVariables( QProcessEnvironment::systemEnvironment().toStringList() ); bool modified = false; foreach ( const QString& name, newVariables.keys() ) { if ( variables.contains( name ) ) { continue; } modified = true; variables[ name ] = newVariables[ name ]; } return modified; } pEnvironmentVariablesModel::Variables pEnvironmentVariablesManager::mergeNewVariables( const pEnvironmentVariablesModel::Variables& variables ) const { pEnvironmentVariablesModel::Variables items = variables; mergeNewVariables( items ); return items; } bool pEnvironmentVariablesManager::removeUnmodifiedVariables( pEnvironmentVariablesModel::Variables& variables ) const { const pEnvironmentVariablesModel::Variables sysVariables = pEnvironmentVariablesModel::stringListToVariables( QProcessEnvironment::systemEnvironment().toStringList() ); bool modified = false; foreach ( const pEnvironmentVariablesModel::Variable& variable, variables ) { if ( !variable.enabled ) { continue; } if ( sysVariables.contains( variable.name ) && variable.value == sysVariables[ variable.name ].value ) { variables.remove( variable.name ); modified = true; } } return modified; } pEnvironmentVariablesModel::Variables pEnvironmentVariablesManager::removeUnmodifiedVariables( const pEnvironmentVariablesModel::Variables& variables ) const { pEnvironmentVariablesModel::Variables items = variables; removeUnmodifiedVariables( items ); return items; } QStringList pEnvironmentVariablesManager::variables( bool keepDisabled ) const { return pEnvironmentVariablesModel::variablesToStringList( variables(), keepDisabled ); } bool pEnvironmentVariablesManager::writeVariables( const pEnvironmentVariablesModel::Variables& variables ) const { pSettings settings( 0, mSettingsKey, "1.0.0" ); settings.remove( mSettingsKey ); settings.beginWriteArray( mSettingsKey ); for ( int i = 0; i < variables.count(); i++ ) { settings.setArrayIndex( i ); const pEnvironmentVariablesModel::Variable& variable = (variables.begin() +i).value(); settings.setValue( "Name", variable.name ); settings.setValue( "Value", variable.value ); settings.setValue( "Enabled", variable.enabled ); } settings.endArray(); return true; } bool pEnvironmentVariablesManager::readVariables( pEnvironmentVariablesModel::Variables& variables ) const { pSettings settings( 0, mSettingsKey, "1.0.0" ); const int count = settings.beginReadArray( mSettingsKey ); for ( int i = 0; i < count; i++ ) { settings.setArrayIndex( i ); variables[ settings.value( "Name" ).toString() ] = pEnvironmentVariablesModel::Variable( settings.value( "Name" ).toString(), settings.value( "Value" ).toString(), settings.value( "Enabled" ).toBool() ); } settings.endArray(); return true; } ./qwbfsmanager-1.2.1-src/fresh/src/gui/environmentvariablemanager/pEnvironmentVariableEditor.ui0000644000175000017520000000334311546156115032455 0ustar pasnoxpasnox pEnvironmentVariableEditor 0 0 400 135 Name: Value: QDialogButtonBox::Cancel|QDialogButtonBox::Ok dbbButtons accepted() pEnvironmentVariableEditor accept() 491 107 489 153 dbbButtons rejected() pEnvironmentVariableEditor reject() 582 106 578 138 ./qwbfsmanager-1.2.1-src/fresh/src/gui/environmentvariablemanager/pEnvironmentVariablesEditor.h0000644000175000017520000001071411546156115032452 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pEnvironmentVariablesEditor.h ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PENVIRONMENTVARIABLESEDITOR_H #define PENVIRONMENTVARIABLESEDITOR_H /*! \file pEnvironmentVariablesEditor.h \brief A pEnvironmentVariablesModel::Variable list widget editor. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include "pEnvironmentVariablesModel.h" #include class Ui_pEnvironmentVariablesEditor; /*! \ingroup FreshGui \class pEnvironmentVariablesEditor \brief A pEnvironmentVariablesModel::Variable list widget editor. */ class FRESH_EXPORT pEnvironmentVariablesEditor : public QWidget { Q_OBJECT public: /*! Create a variables editor having \a parent as parent. */ pEnvironmentVariablesEditor( QWidget* parent = 0 ); /*! Destroys the editor. */ virtual ~pEnvironmentVariablesEditor(); /*! Return all variables. */ pEnvironmentVariablesModel::Variables variables() const; /*! Return all the default variables. */ pEnvironmentVariablesModel::Variables defaultVariables() const; /*! Return a string list containing pairs of key=value variables. If \a keepDisabled is false then only enabled variable will be returned else all. */ QStringList variables( bool keepDisabled ) const; /*! Return a variable by its name. */ pEnvironmentVariablesModel::Variable variable( const QString& name ) const; /*! Return true if the variable \a name exists else false. */ bool contains( const QString& name ) const; /*! Return true if the editor is empty (no variables defined) else false. */ bool isEmpty() const; public slots: /*! Set the variables to edit to \a variables making them the default ones if \a setDefault is true. If \a setDefault is false then the default variables is not changed. */ void setVariables( const pEnvironmentVariablesModel::Variables& variables, bool setDefault ); /*! Set the default variables to \a variables. */ void setDefaultVariables( const pEnvironmentVariablesModel::Variables& variables ); /*! Set the variables to edit to \a variables making them the default ones if \a setDefault is true. If \a setDefault is false then the default variables is not changed. The variables must be a list of pairs of key=value. */ void setVariables( const QStringList& variables, bool setDefault ); /*! Replace the variable named \a name by \a variable. */ void setVariable( const QString& name, const pEnvironmentVariablesModel::Variable& variable ); /*! Remove the variable named \a name. */ void removeVariable( const QString& name ); /*! Clear all variables. */ void clearVariables(); /*! Set the variables t obe the default variables. */ void resetVariablesToDefault(); /*! Set the variables t obe all ones defines in QProcess::systemEnvironment() making them default according to \a setDefault. If \a setDefault is false then the default variables is not changed. */ void resetVariablesToSystem( bool setDefault ); protected: Ui_pEnvironmentVariablesEditor* ui; pEnvironmentVariablesModel* mModel; protected slots: void model_view_changed(); void on_aAdd_triggered(); void on_aEdit_triggered(); void on_aRemove_triggered(); void on_aClear_triggered(); void on_aResetDefault_triggered(); void on_aResetSystem_triggered(); void on_tvVariables_activated( const QModelIndex& index ); }; #endif // PENVIRONMENTVARIABLESEDITOR_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/environmentvariablemanager/pEnvironmentVariablesManager.h0000644000175000017520000001046111546156115032575 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pEnvironmentVariablesManager.h ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PENVIRONMENTVARIABLESMANAGER_H #define PENVIRONMENTVARIABLESMANAGER_H /*! \file pEnvironmentVariablesManager.h \brief Helper manager for pEnvironmentVariablesModel. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include "pEnvironmentVariablesModel.h" /*! \ingroup FreshGui \class pEnvironmentVariablesManager \brief Helper manager for pEnvironmentVariablesModel. This helper class allow to read, write, update and merge variables to/from files. */ class FRESH_EXPORT pEnvironmentVariablesManager { public: /*! Create a manager for handling pEnvironmentVariablesModel::Variables. */ pEnvironmentVariablesManager(); /* Destroys the manager. */ virtual ~pEnvironmentVariablesManager(); /*! Load the variables states from ini file. */ bool load(); /*! Save the variables states to ini file. */ bool save(); /*! Return the variables of this manager. */ pEnvironmentVariablesModel::Variables variables() const; /*! Set the variables of this manager. */ void setVariables( const pEnvironmentVariablesModel::Variables& variables ); /*! Check for new variables defined in QProcessEnvironment::systemEnvironment() and merge them in \a variables. Returns true if changes occurs else false. */ bool mergeNewVariables( pEnvironmentVariablesModel::Variables& variables ) const; /*! Check for new variables defined in QProcessEnvironment::systemEnvironment() and merge them with \a variables. Returns the merged version of \a variables. */ pEnvironmentVariablesModel::Variables mergeNewVariables( const pEnvironmentVariablesModel::Variables& variables ) const; /*! Remove from \a variables all unmodified variables. Unmododified variables are the ones that are enabled and content is same as defined in QProcessEnvironment::systemEnvironment(). Returns true if changes occurs else false. */ bool removeUnmodifiedVariables( pEnvironmentVariablesModel::Variables& variables ) const; /*! Remove from \a variables all unmodified variables. Unmododified variables are the ones that are enabled and content is same as defined in QProcessEnvironment::systemEnvironment(). Returns the merged version of \a variables. */ pEnvironmentVariablesModel::Variables removeUnmodifiedVariables( const pEnvironmentVariablesModel::Variables& variables ) const; /*! Return a list of pairs of key=value variables. The disabled one are kept according to \a keepDisabled. */ QStringList variables( bool keepDisabled ) const; protected: static const QString mSettingsKey; bool mInitialized; mutable pEnvironmentVariablesModel::Variables mVariables; /*! This is the low level function that write \a variables to an ini file. The defauld implementation use pSettings for that. */ virtual bool writeVariables( const pEnvironmentVariablesModel::Variables& variables ) const; /*! This is the low level function that read \a variables from an ini file. The defauld implementation use pSettings for that. */ virtual bool readVariables( pEnvironmentVariablesModel::Variables& variables ) const; }; #endif // PENVIRONMENTVARIABLESMANAGER_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/environmentvariablemanager/pEnvironmentVariablesEditor.cpp0000644000175000017520000001606611546156115033013 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pEnvironmentVariablesEditor.cpp ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pEnvironmentVariablesEditor.h" #include "ui_pEnvironmentVariablesEditor.h" #include "pEnvironmentVariableEditor.h" #include pEnvironmentVariablesEditor::pEnvironmentVariablesEditor( QWidget* parent ) : QWidget( parent ) { ui = new Ui_pEnvironmentVariablesEditor; ui->setupUi( this ); ui->verticalLayout->setMenuBar( ui->tbActions ); mModel = new pEnvironmentVariablesModel( this ); ui->tvVariables->setModel( mModel ); ui->tvVariables->header()->setResizeMode( 0, QHeaderView::ResizeToContents ); model_view_changed(); connect( mModel, SIGNAL( defaultVariablesChanged() ), this, SLOT( model_view_changed() ) ); connect( mModel, SIGNAL( rowsInserted( const QModelIndex&, int, int ) ), this, SLOT( model_view_changed() ) ); connect( mModel, SIGNAL( rowsRemoved( const QModelIndex&, int, int ) ), this, SLOT( model_view_changed() ) ); connect( mModel, SIGNAL( layoutChanged() ), this, SLOT( model_view_changed() ) ); connect( ui->tvVariables->selectionModel(), SIGNAL( selectionChanged( const QItemSelection&, const QItemSelection& ) ), this, SLOT( model_view_changed() ) ); } pEnvironmentVariablesEditor::~pEnvironmentVariablesEditor() { delete ui; } pEnvironmentVariablesModel::Variables pEnvironmentVariablesEditor::variables() const { return mModel->variables(); } pEnvironmentVariablesModel::Variables pEnvironmentVariablesEditor::defaultVariables() const { return mModel->defaultVariables(); } QStringList pEnvironmentVariablesEditor::variables( bool keepDisabled ) const { return mModel->variables( keepDisabled ); } pEnvironmentVariablesModel::Variable pEnvironmentVariablesEditor::variable( const QString& name ) const { return mModel->variable( name ); } bool pEnvironmentVariablesEditor::contains( const QString& name ) const { return mModel->contains( name ); } bool pEnvironmentVariablesEditor::isEmpty() const { return mModel->isEmpty(); } void pEnvironmentVariablesEditor::setVariables( const pEnvironmentVariablesModel::Variables& variables, bool setDefault ) { mModel->setVariables( variables, setDefault ); } void pEnvironmentVariablesEditor::setDefaultVariables( const pEnvironmentVariablesModel::Variables& variables ) { mModel->setDefaultVariables( variables ); } void pEnvironmentVariablesEditor::setVariables( const QStringList& variables, bool setDefault ) { mModel->setVariables( variables, setDefault ); } void pEnvironmentVariablesEditor::setVariable( const QString& name, const pEnvironmentVariablesModel::Variable& variable ) { mModel->setVariable( name, variable ); } void pEnvironmentVariablesEditor::removeVariable( const QString& name ) { mModel->removeVariable( name ); } void pEnvironmentVariablesEditor::clearVariables() { mModel->clearVariables(); } void pEnvironmentVariablesEditor::resetVariablesToDefault() { mModel->resetVariablesToDefault(); } void pEnvironmentVariablesEditor::resetVariablesToSystem( bool setDefault ) { mModel->resetVariablesToSystem( setDefault ); } void pEnvironmentVariablesEditor::model_view_changed() { const bool hasSelection = ui->tvVariables->selectionModel()->hasSelection(); ui->aEdit->setEnabled( hasSelection ); ui->aRemove->setEnabled( hasSelection ); ui->aClear->setEnabled( mModel->hasChildren() ); ui->aResetDefault->setEnabled( !mModel->defaultVariables().isEmpty() ); } void pEnvironmentVariablesEditor::on_aAdd_triggered() { pEnvironmentVariableEditor dlg( this ); dlg.setWindowTitle( tr( "Add a new variable..." ) ); if ( dlg.exec() == QDialog::Rejected ) { return; } pEnvironmentVariablesModel::Variable variable = dlg.variable(); if ( variable.name.isEmpty() ) { return; } if ( mModel->contains( variable.name ) ) { const QMessageBox::StandardButton result = QMessageBox::question( this, QString::null, tr( "The variable '%1' already exists, update it?" ).arg( variable.name ), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes ); if ( result != QMessageBox::Yes ) { return; } variable = mModel->variable( variable.name ); } variable.value = dlg.variable().value; mModel->setVariable( variable.name, variable ); const QModelIndex index = mModel->index( variable.name ); ui->tvVariables->setCurrentIndex( index ); } void pEnvironmentVariablesEditor::on_aEdit_triggered() { const QModelIndex index = ui->tvVariables->selectionModel()->selectedIndexes().value( 0 ); pEnvironmentVariablesModel::Variable variable = mModel->variable( index ); pEnvironmentVariableEditor dlg( this, variable ); dlg.setWindowTitle( tr( "Edit a variable..." ) ); if ( dlg.exec() == QDialog::Rejected ) { return; } variable.value = dlg.variable().value; mModel->setVariable( variable.name, variable ); } void pEnvironmentVariablesEditor::on_aRemove_triggered() { const QModelIndex index = ui->tvVariables->selectionModel()->selectedIndexes().value( 0 ); const pEnvironmentVariablesModel::Variable variable = mModel->variable( index ); const QMessageBox::StandardButton result = QMessageBox::question( this, QString::null, tr( "Are you sure you want to remove the variable '%1' ?" ).arg( variable.name ), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes ); if ( result == QMessageBox::No ) { return; } mModel->removeVariable( variable.name ); } void pEnvironmentVariablesEditor::on_aClear_triggered() { const QMessageBox::StandardButton result = QMessageBox::question( this, QString::null, tr( "Are you sure you want to clear all variables?" ), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes ); if ( result == QMessageBox::No ) { return; } mModel->clearVariables(); } void pEnvironmentVariablesEditor::on_aResetDefault_triggered() { mModel->resetVariablesToDefault(); } void pEnvironmentVariablesEditor::on_aResetSystem_triggered() { mModel->resetVariablesToSystem( false ); } void pEnvironmentVariablesEditor::on_tvVariables_activated( const QModelIndex& index ) { Q_UNUSED( index ); if ( index.column() == 1 ) { on_aEdit_triggered(); } } ./qwbfsmanager-1.2.1-src/fresh/src/gui/environmentvariablemanager/pEnvironmentVariableEditor.h0000644000175000017520000000463311546156115032272 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pEnvironmentVariableEditor.h ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PENVIRONMENTVARIABLEEDITOR_H #define PENVIRONMENTVARIABLEEDITOR_H /*! \file pEnvironmentVariableEditor.h \brief Ths dialog allow you to create / edit a pEnvironmentVariablesModel::Variable. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include "pEnvironmentVariablesModel.h" #include class Ui_pEnvironmentVariableEditor; /*! \ingroup FreshGui \class pEnvironmentVariableEditor \brief Ths dialog allow you to create / edit a pEnvironmentVariablesModel::Variable. */ class FRESH_EXPORT pEnvironmentVariableEditor : public QDialog { Q_OBJECT public: /*! Create a new pEnvironmentVariableEditor having parent \a parent. If \a variable is not null then the name and value are read from it. If the variable name is not null then it will be read only. */ pEnvironmentVariableEditor( QWidget* parent = 0, const pEnvironmentVariablesModel::Variable& variable = pEnvironmentVariablesModel::Variable() ); /*! Destroys the editor. */ virtual ~pEnvironmentVariableEditor(); /*! Return the variable. */ pEnvironmentVariablesModel::Variable variable() const; protected: Ui_pEnvironmentVariableEditor* ui; }; #endif // PENVIRONMENTVARIABLEEDITOR_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/environmentvariablemanager/pEnvironmentVariablesModel.cpp0000644000175000017520000002357011546156115032623 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pEnvironmentVariablesModel.cpp ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pEnvironmentVariablesModel.h" #include #include pEnvironmentVariablesModel::Variable::Variable( const QString& _name, const QString& _value, bool _enabled ) { name = _name; value = _value; enabled = _enabled; } pEnvironmentVariablesModel::pEnvironmentVariablesModel( QObject* parent ) : QAbstractItemModel( parent ) { mRowCount = 0; } int pEnvironmentVariablesModel::columnCount( const QModelIndex& parent ) const { return parent.isValid() ? 0 : 2; } QVariant pEnvironmentVariablesModel::data( const QModelIndex& index, int role ) const { if ( !index.isValid() || index.row() < 0 || index.row() >= mRowCount || index.column() < 0 || index.column() >= 2 ) { return QVariant(); } pEnvironmentVariablesModel::Variable* variable = static_cast( index.internalPointer() ); switch ( role ) { case Qt::DisplayRole: { switch ( index.column() ) { case 0: return variable->name; case 1: return variable->value; } } case Qt::ToolTipRole: { const QStringList entries = QStringList() << tr( "Name: %1" ).arg( variable->name ) << tr( "Value: %1" ).arg( variable->value ) << tr( "Enabled: %1" ).arg( variable->enabled ? tr( "true" ) : tr( "false" ) ); return entries.join( "\n" ); } case Qt::FontRole: { QFont font; font.setStrikeOut( !variable->enabled ); return font; } case Qt::CheckStateRole: { if ( index.column() == 0 ) { return variable->enabled ? Qt::Checked : Qt::Unchecked; } break; } } return QVariant(); } QModelIndex pEnvironmentVariablesModel::index( int row, int column, const QModelIndex& parent ) const { if ( parent.isValid() || column < 0 || column >= 2 || row < 0 || row >= mRowCount ) { return QModelIndex(); } pEnvironmentVariablesModel::Variable* variable = mOrder[ row ]; return createIndex( row, column, variable ); } QModelIndex pEnvironmentVariablesModel::parent( const QModelIndex& index ) const { Q_UNUSED( index ); return QModelIndex(); } int pEnvironmentVariablesModel::rowCount( const QModelIndex& parent ) const { return parent.isValid() ? 0 : mRowCount; } QVariant pEnvironmentVariablesModel::headerData( int section, Qt::Orientation orientation, int role ) const { if ( orientation == Qt::Vertical || section < 0 || section >= 2 ) { return QAbstractItemModel::headerData( section, orientation, role ); } switch ( role ) { case Qt::DisplayRole: { switch ( section ) { case 0: return tr( "Name" ); case 1: return tr( "Value" ); } } } return QAbstractItemModel::headerData( section, orientation, role ); } bool pEnvironmentVariablesModel::hasChildren( const QModelIndex& parent ) const { return parent.isValid() ? false : !mVariables.isEmpty(); } Qt::ItemFlags pEnvironmentVariablesModel::flags( const QModelIndex& index ) const { Qt::ItemFlags flags = QAbstractItemModel::flags( index ); if ( !index.isValid() || index.row() < 0 || index.row() >= mRowCount || index.column() < 0 || index.column() >= 2 ) { return flags; } if ( index.column() == 0 ) { flags |= Qt::ItemIsUserCheckable; } return flags; } bool pEnvironmentVariablesModel::setData( const QModelIndex& index, const QVariant& value, int role ) { if ( !index.isValid() || index.column() != 0 || index.row() < 0 || index.row() >= mRowCount ) { return false; } pEnvironmentVariablesModel::Variable* variable = static_cast( index.internalPointer() ); switch ( role ) { case Qt::CheckStateRole: { variable->enabled = value.toInt() == Qt::Checked; emit dataChanged( index, index.sibling( index.row(), 1 ) ); } } return false; } QModelIndex pEnvironmentVariablesModel::index( const QString& name, int column ) const { if ( !mVariables.contains( name ) || column < 0 || column >= 2 ) { return QModelIndex(); } pEnvironmentVariablesModel::Variable* variable = &const_cast( this )->mVariables[ name ]; return createIndex( mOrder.indexOf( variable ), column, variable ); } pEnvironmentVariablesModel::Variable pEnvironmentVariablesModel::variable( const QModelIndex& index ) const { pEnvironmentVariablesModel::Variable variable; if ( index.isValid() && index.row() >= 0 && index.row() < mRowCount && index.column() >= 0 && index.column() < 2 ) { variable = *static_cast( index.internalPointer() ); } return variable; } pEnvironmentVariablesModel::Variables pEnvironmentVariablesModel::variables() const { return mVariables; } pEnvironmentVariablesModel::Variables pEnvironmentVariablesModel::defaultVariables() const { return mDefaultVariables; } QStringList pEnvironmentVariablesModel::variables( bool keepDisabled ) const { return variablesToStringList( mVariables, keepDisabled ); } pEnvironmentVariablesModel::Variable pEnvironmentVariablesModel::variable( const QString& name ) const { return mVariables.value( name ); } bool pEnvironmentVariablesModel::contains( const QString& variable ) const { return mVariables.contains( variable ); } bool pEnvironmentVariablesModel::isEmpty() const { return mVariables.isEmpty(); } pEnvironmentVariablesModel::Variables pEnvironmentVariablesModel::stringListToVariables( const QStringList& variables ) { pEnvironmentVariablesModel::Variables items; foreach ( const QString& variable, variables ) { const QString name = variable.section( '=', 0, 0 ); const QString value = variable.section( '=', 1 ); pEnvironmentVariablesModel::Variable variable; variable.name = name; variable.value = value; variable.enabled = true; items[ name ] = variable; } return items; } QStringList pEnvironmentVariablesModel::variablesToStringList( const pEnvironmentVariablesModel::Variables& variables, bool keepDisabled ) { QStringList items; foreach ( const pEnvironmentVariablesModel::Variable& variable, variables.values() ) { if ( !variable.enabled && !keepDisabled ) { continue; } items << QString( "%1=%2" ).arg( variable.name ).arg( variable.value ); } return items; } void pEnvironmentVariablesModel::setVariables( const pEnvironmentVariablesModel::Variables& variables, bool setDefault ) { emit layoutAboutToBeChanged(); int count = rowCount(); if ( count > 0 ) { beginRemoveRows( QModelIndex(), 0, count -1 ); } mRowCount = 0; mOrder.clear(); mVariables.clear(); if ( setDefault ) { mDefaultVariables.clear(); } if ( count > 0 ) { endRemoveRows(); } count = variables.count(); if ( count > 0 ) { beginInsertRows( QModelIndex(), 0, count -1 ); } mVariables = variables; mRowCount = count; if ( setDefault ) { setDefaultVariables( mVariables ); } QStringList keys = mVariables.keys(); qSort( keys ); foreach ( const QString& key, keys ) { mOrder << &mVariables[ key ]; } if ( count > 0 ) { endInsertRows(); } emit layoutChanged(); } void pEnvironmentVariablesModel::setDefaultVariables( const pEnvironmentVariablesModel::Variables& variables ) { mDefaultVariables = variables; emit defaultVariablesChanged(); } void pEnvironmentVariablesModel::setVariables( const QStringList& variables, bool setDefault ) { setVariables( stringListToVariables( variables ), setDefault ); } void pEnvironmentVariablesModel::setDefaultVariables( const QStringList& variables ) { setDefaultVariables( stringListToVariables( variables ) ); } void pEnvironmentVariablesModel::setVariable( const QString& name, const pEnvironmentVariablesModel::Variable& variable ) { const bool hasVariable = mVariables.contains( name ); QStringList keys = mVariables.keys(); int row = -1; if ( !hasVariable ) { keys << name; qSort( keys ); row = keys.indexOf( name ); beginInsertRows( QModelIndex(), row, row ); } mVariables[ name ] = variable; if ( hasVariable ) { const QModelIndex index = this->index( variable.name, 0 ); emit dataChanged( index, index.sibling( index.row(), 1 ) ); } if ( !hasVariable ) { mOrder.insert( row, &mVariables[ name ] ); mRowCount++; endInsertRows(); } } void pEnvironmentVariablesModel::removeVariable( const QString& name ) { if ( !mVariables.contains( name ) ) { return; } pEnvironmentVariablesModel::Variable& variable = mVariables[ name ]; const int row = mOrder.indexOf( &variable ); beginRemoveRows( QModelIndex(), row, row ); mRowCount--; mOrder.removeAt( row ); mVariables.remove( name ); endRemoveRows(); } void pEnvironmentVariablesModel::clearVariables() { setVariables( pEnvironmentVariablesModel::Variables(), false ); } void pEnvironmentVariablesModel::resetVariablesToDefault() { setVariables( pEnvironmentVariablesModel::Variables( mDefaultVariables ), false ); } void pEnvironmentVariablesModel::resetVariablesToSystem( bool setDefault ) { setVariables( QProcess::systemEnvironment(), setDefault ); } ./qwbfsmanager-1.2.1-src/fresh/src/gui/environmentvariablemanager/pEnvironmentVariableEditor.cpp0000644000175000017520000000374711546156115032632 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pEnvironmentVariableEditor.cpp ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pEnvironmentVariableEditor.h" #include "ui_pEnvironmentVariableEditor.h" pEnvironmentVariableEditor::pEnvironmentVariableEditor( QWidget* parent, const pEnvironmentVariablesModel::Variable& variable ) : QDialog( parent ) { ui = new Ui_pEnvironmentVariableEditor; ui->setupUi( this ); ui->leName->setReadOnly( !variable.name.isEmpty() ); ui->leName->setText( variable.name ); ui->leValue->setText( variable.value ); if ( variable.name.isEmpty() ) { ui->leName->setFocus(); } else { ui->leValue->setFocus(); } } pEnvironmentVariableEditor::~pEnvironmentVariableEditor() { delete ui; } pEnvironmentVariablesModel::Variable pEnvironmentVariableEditor::variable() const { return pEnvironmentVariablesModel::Variable( ui->leName->text(), ui->leValue->text() ); } ./qwbfsmanager-1.2.1-src/fresh/src/gui/environmentvariablemanager/pEnvironmentVariablesModel.h0000644000175000017520000001517711546156115032274 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pEnvironmentVariablesModel.h ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PENVIRONMENTVARIABLESMODEL_H #define PENVIRONMENTVARIABLESMODEL_H /*! \file pEnvironmentVariablesModel.h \brief A model to handle your process environment variables. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include /*! \ingroup FreshGui \class pEnvironmentVariablesModel \brief A model to handle your process environment variables. */ class FRESH_EXPORT pEnvironmentVariablesModel : public QAbstractItemModel { Q_OBJECT public: /*! \ingroup FreshGui \struct pEnvironmentVariablesModel::Variable \brief This structure represent the state of a variable. */ struct Variable { Variable( const QString& _name = QString::null, const QString& _value = QString::null, bool _enabled = false ); /*! The name. */ QString name; /*! The value. */ QString value; /*! The enabled state. A disabled variable should by example not being kept when updating your QProcess environement variables. \sa QProcess::setEnvironment */ bool enabled; }; /*! A QHash of pEnvironmentVariablesModel::Variable. */ typedef QHash Variables; /*! A QList of pEnvironmentVariablesModel::Variable pointers. */ typedef QList VariableList; /*! Create a variable model having \a parent as parent. */ pEnvironmentVariablesModel( QObject* parent = 0 ); /*! Reimplemented. */ virtual int columnCount( const QModelIndex& parent = QModelIndex() ) const; /*! Reimplemented. */ virtual QVariant data( const QModelIndex& index, int role = Qt::DisplayRole ) const; /*! Reimplemented. */ virtual QModelIndex index( int row, int column, const QModelIndex& parent = QModelIndex() ) const; /*! Reimplemented. */ virtual QModelIndex parent( const QModelIndex& index ) const; /*! Reimplemented. */ virtual int rowCount( const QModelIndex& parent = QModelIndex() ) const; /*! Reimplemented. */ virtual QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const; /*! Reimplemented. */ virtual bool hasChildren( const QModelIndex& parent = QModelIndex() ) const; /*! Reimplemented. */ virtual Qt::ItemFlags flags( const QModelIndex& index ) const; /*! Reimplemented. */ virtual bool setData( const QModelIndex& index, const QVariant& value, int role = Qt::EditRole ); /*! Return a QModelIndex for variable \a name at specified \a column. */ QModelIndex index( const QString& name, int column = 0 ) const; /*! Return the variable for the given \a index. */ pEnvironmentVariablesModel::Variable variable( const QModelIndex& index ) const; /*! Return the variables. */ pEnvironmentVariablesModel::Variables variables() const; /*! Return the default variables. */ pEnvironmentVariablesModel::Variables defaultVariables() const; /*! Return the variables as a list of pairs of key=value and keeping the disabled one according to \a keepDisabled. */ QStringList variables( bool keepDisabled ) const; /*! Return the variable named \a name. */ pEnvironmentVariablesModel::Variable variable( const QString& name ) const; /*! Return true if the model contains a variable named \a name else false. */ bool contains( const QString& name ) const; /*! Return true if the model is empty else false. */ bool isEmpty() const; /*! Helper that convert a QStringList to a pEnvironmentVariablesModel::Variables hash. \sa QProcessEnvironment::toStringList() */ static pEnvironmentVariablesModel::Variables stringListToVariables( const QStringList& variables ); /*! Helper that convert a pEnvironmentVariablesModel::Variables hash to a QStringList. \sa QProcessEnvironment::toStringList() */ static QStringList variablesToStringList( const pEnvironmentVariablesModel::Variables& variables, bool keepDisabled ); public slots: /*! Set the model variables to \a variables making them the default according to \a setDefault. \sa setDefaultVariables */ void setVariables( const pEnvironmentVariablesModel::Variables& variables, bool setDefault ); /*! Set the model default variables to \a variables. */ void setDefaultVariables( const pEnvironmentVariablesModel::Variables& variables ); /*! Set the model variables to \a variables making them the default according to \a setDefault. \sa setDefaultVariables */ void setVariables( const QStringList& variables, bool setDefault ); /*! Set the model default variables to \a variables. */ void setDefaultVariables( const QStringList& variables ); /*! Set or update the variable named \a name with the state of \a variable. */ void setVariable( const QString& name, const pEnvironmentVariablesModel::Variable& variable ); /*! Remove the variable named \a name. */ void removeVariable( const QString& name ); /*! Clear the model variables. */ void clearVariables(); /*! Clear the model and set the variables to the default ones. */ void resetVariablesToDefault(); /*! Clear the model and set the variables to the system ones making them default according to \a setDefault. */ void resetVariablesToSystem( bool setDefault ); protected: int mRowCount; pEnvironmentVariablesModel::Variables mDefaultVariables; pEnvironmentVariablesModel::Variables mVariables; pEnvironmentVariablesModel::VariableList mOrder; signals: /*! It's emitted when the default variables have changed. */ void defaultVariablesChanged(); }; #endif // PENVIRONMENTVARIABLESMODEL_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/pMainWindow.h0000644000175000017520000001043211546156115021612 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pMainWindow.h ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PMAINWINDOW_H #define PMAINWINDOW_H /*! \file pMainWindow.h \brief An extended QMainWindow. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include "pQueuedMessageWidget.h" #include "pDockToolBarManager.h" #include class pSettings; class pActionsNodeMenuBar; class pQueuedMessageToolBar; class pDockToolBar; /*! \ingroup FreshGui \class pMainWindow \brief An extended QMainWindow. This extended mainwindow contains some usefull features : - a pMenuBar as menu bar. - a pDockToolBarManager for tabbed management of docked widgets. - a pQueuedMessageToolBar for present the user passive errors / messages. - a pSettings object for storing/reading your settings. */ class FRESH_EXPORT pMainWindow : public QMainWindow { Q_OBJECT public: /*! Create an instance of the main window having \a parent as parent and window flags \a windowFlags. */ pMainWindow( QWidget* parent = 0, Qt::WindowFlags windowFlags = 0 ); /*! Reimplemented. */ virtual ~pMainWindow(); /*! Reimplemented. */ virtual QMenu* createPopupMenu(); /*! Return the settings object used by this main window. */ virtual pSettings* settings() const; /*! Return the menu bar object. */ virtual pActionsNodeMenuBar* menuBar() const; /*! Add \a dockWidget in \a area having \a orientation. */ void addDockManagerWidget( Qt::ToolBarArea area, QDockWidget* dockWidget, Qt::Orientation orientation = Qt::Horizontal ); /*! Seth the dock toolbar in \a area to be exclusive according to \a exclusive. */ void setDockManagerAreaExclusive( Qt::ToolBarArea area, bool exclusive ); /*! Set the dock manager presentation mode to \a mode. */ void setDockManagerMode( pDockToolBarManager::Mode mode ); /*! Append a queued \a message in the message toolbar with an auto close defined to \a milliSeconds. \sa pQueuedMessageToolBar::appendMessage( const QString&, int ). */ void appendMessage( const QString& message, int milliSeconds = -1 ); /*! Append a queued \a message in the message toolbar. \sa pQueuedMessageToolBar::appendMessage( const pQueuedMessage& ). */ void appendMessage( const pQueuedMessage& message ); protected: bool mShown; mutable pSettings* mSettings; mutable pActionsNodeMenuBar* mMenuBar; mutable pQueuedMessageToolBar* mQueuedMessageToolBar; mutable pDockToolBarManager* mDockToolBarManager; /*! Reimplemented. */ virtual void showEvent( QShowEvent* event ); /*! Reimplemented. */ virtual void closeEvent( QCloseEvent* event ); /*! Return the queued message toolbar object. */ virtual pQueuedMessageToolBar* queuedMessageToolBar() const; /*! Return the dock widget toolbar manager object. */ virtual pDockToolBarManager* dockToolBarManager() const; /*! Return the dock toolbar manager for \a area. */ pDockToolBar* dockToolBar( Qt::ToolBarArea area ) const; public slots: /*! Save the state of the main window. \sa QMainWindow::saveState(). */ virtual void saveState(); /*! Restore the state of the main window. \sa QMainWindow::restoreState(). */ virtual void restoreState(); }; #endif // PMAINWINDOW_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/pKeySequenceEdit.h0000644000175000017520000000442111546156115022566 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pKeySequenceEdit.h ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PKEYSEQUENCEEDIT_H #define PKEYSEQUENCEEDIT_H /*! \file pKeySequenceEdit.h \brief A special QLineEdit that allow to defin QShortcut. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include "pLineEdit.h" /*! \ingroup FreshGui \class pKeySequenceEdit \brief A special QLineEdit that allow to define QShortcut. When the user press some combinaison keys, the result is wrotten in the pLineEdit. */ class FRESH_EXPORT pKeySequenceEdit : public pLineEdit { Q_OBJECT public: /*! Create a instance of pKeySequenceEdit having parent \a parent. */ pKeySequenceEdit( QWidget* parent = 0 ); /*! Create a instance of pKeySequenceEdit having parent \a parent. The widget text is set to \a content. */ pKeySequenceEdit( const QString& contents, QWidget* parent = 0 ); protected: mutable bool mFinished; /*! Reimplemented. */ virtual void keyPressEvent( QKeyEvent* event ); /*! Reimplemented. */ virtual void keyReleaseEvent( QKeyEvent* event ); QString keySequence( QKeyEvent* event ) const; }; #endif // PKEYSEQUENCEEDIT_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/pTreeComboBox.cpp0000644000175000017520000004303511546156115022426 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pTreeComboBox.cpp ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pTreeComboBox.h" #include #include #include #include #include #include #include #include #include #include #include #include #include QRect popupGeometry( int screen ) { return QApplication::desktop()->screenGeometry(screen); } pTreeComboBox::pTreeComboBox( QWidget* parent ) : QWidget( parent ) { mForceIndex = false; mModelColumn = 0; mMaxVisibleItems = 10; mFrame = new QFrame( this ); mFrameLayout = new QVBoxLayout( mFrame ); mFrame->setWindowFlags( Qt::Dialog | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint ); //mFrame->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken ); mFrame->setVisible( false ); mFrame->installEventFilter( this ); mFrameLayout->setMargin( 3 ); mFrameLayout->setSpacing( 1 ); mFrameLayout->addWidget( new QSizeGrip( mFrame ), 0, Qt::AlignBottom | Qt::AlignRight ); setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed ) ); setAttribute( Qt::WA_Hover ); setView( new QTreeView( this ) ); } bool pTreeComboBox::eventFilter( QObject* object, QEvent* event ) { switch ( event->type() ) { case QEvent::WindowDeactivate: { if ( object == mFrame ) { if ( !rect().contains( mapFromGlobal( QCursor::pos() ) ) ) { hidePopup(); } } break; } case QEvent::KeyPress: { if ( object == mView ) { const QKeyEvent* ke = static_cast( event ); if ( ke->key() == Qt::Key_Escape && ke->modifiers() == Qt::NoModifier ) { hidePopup(); } } break; } case QEvent::Hide: { if ( object == mFrame ) { const QModelIndex index = modelColumnIndex( mCurrentIndex ); if ( currentIndex() != index ) { mForceIndex = false; mView->clearSelection(); mView->setCurrentIndex( index ); mForceIndex = true; } update(); } break; } case QEvent::MouseMove: { if ( mView && object == mView->viewport() ) { const QMouseEvent* me = static_cast( event ); const QModelIndex index = modelColumnIndex( mView->indexAt( me->pos() ) ); if ( mView->currentIndex() != index ) { emit highlighted( index ); mForceIndex = false; mView->clearSelection(); mView->setCurrentIndex( index ); mForceIndex = true; } } break; } default: break; } return QWidget::eventFilter( object, event ); } QSize pTreeComboBox::sizeHint() const { const QFontMetrics fm( font() ); QSize size = mCurrentIndex.isValid() ? mView->sizeHintForIndex( mCurrentIndex ) : QSize( style()->pixelMetric( QStyle::QStyle::PM_ComboBoxFrameWidth ), qMax( fm.lineSpacing(), 14 ) +2 ) ; QStyleOptionComboBox option; initStyleOption( &option ); if ( !option.currentIcon.isNull() ) { size.setHeight( qMax( size.height(), option.iconSize.height() +2 ) ); } size = style()->sizeFromContents( QStyle::CT_ComboBox, &option, size, this ); return size.expandedTo( QApplication::globalStrut() ); } QSize pTreeComboBox::iconSize() const { const int size = style()->pixelMetric( QStyle::PM_ButtonIconSize ); QSize is = QSize( size, size ); if ( mView && mView->iconSize() != QSize( -1, -1 ) ) { is = mView->iconSize(); } return is; } void pTreeComboBox::setIconSize( const QSize& s ) { if ( mView ) { mView->setIconSize( s ); updateGeometry(); } } int pTreeComboBox::modelColumn() const { return mModelColumn; } void pTreeComboBox::setColumnModel( int column ) { if ( mModelColumn != column ) { mModelColumn = column; mCurrentIndex = modelColumnIndex( mCurrentIndex ); updateGeometry(); } } void pTreeComboBox::initStyleOption( QStyleOptionComboBox* option ) const { // QStyleOption option->initFrom( this ); // QStyleOptionComplex option->activeSubControls = 0; option->subControls = QStyle::SC_ComboBoxEditField | QStyle::SC_ComboBoxArrow | QStyle::SC_ComboBoxFrame; // QStyleOptionComboBox const QModelIndex index = currentIndex(); option->currentIcon = index.data( Qt::DecorationRole ).value(); option->iconSize = iconSize(); option->currentText = index.data( Qt::DisplayRole ).toString(); option->editable = false; option->frame = true; option->popupRect = QRect(); // unused by Qt api Qt 4.7 if ( mView ) { const QPoint pos = mapFromGlobal( QCursor::pos() ); if ( !mView->isVisible() && rect().contains( pos ) ) { option->state |= QStyle::State_MouseOver; } if ( mView->isVisible() ) { option->state |= QStyle::State_On; } } } bool pTreeComboBox::event( QEvent* event ) { switch ( event->type() ) { case QEvent::ToolTip: { const QHelpEvent* he = static_cast( event ); const QString text = toolTip().isEmpty() ? mCurrentIndex.data( Qt::ToolTipRole ).toString() : toolTip(); QToolTip::showText( he->globalPos(), text, this ); event->accept(); return true; } default: return QWidget::event( event ); } } void pTreeComboBox::paintEvent( QPaintEvent* event ) { Q_UNUSED( event ); QStyleOptionComboBox option; initStyleOption( &option ); QStylePainter painter( this ); painter.drawComplexControl( QStyle::CC_ComboBox, option ); painter.drawControl( QStyle::CE_ComboBoxLabel, option ); } void pTreeComboBox::hideEvent( QHideEvent* event ) { hidePopup(); QWidget::hideEvent( event ); } void pTreeComboBox::mousePressEvent( QMouseEvent* event ) { if ( mView ) { mFrame->isVisible() ? hidePopup() : showPopup(); } QWidget::mousePressEvent( event ); } void pTreeComboBox::hidePopup() { if ( mFrame->isVisible() ) { mFrame->hide(); } } void pTreeComboBox::showPopup() { if ( mView && !mFrame->isVisible() ) { mCurrentIndex = modelColumnIndex( currentIndex() ); calculPopupGeometry(); update(); } } QModelIndex pTreeComboBox::modelColumnIndex( const QModelIndex& index ) const { return index.sibling( index.row(), mModelColumn ); } void pTreeComboBox::calculPopupGeometry() { if ( !mView ) { return; } QStyle * const style = this->style(); // set current item and select it view()->selectionModel()->setCurrentIndex( mCurrentIndex, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows ); QFrame* container = mFrame; QStyleOptionComboBox opt; initStyleOption( &opt ); QRect listRect( style->subControlRect( QStyle::CC_ComboBox, &opt, QStyle::SC_ComboBoxListBoxPopup, this ) ); QRect screen = popupGeometry( QApplication::desktop()->screenNumber( this ) ); QPoint below = mapToGlobal( listRect.bottomLeft() ); int belowHeight = screen.bottom() -below.y(); QPoint above = mapToGlobal( listRect.topLeft() ); int aboveHeight = above.y() -screen.y(); bool boundToScreen = !window()->testAttribute( Qt::WA_DontShowOnScreen ); listRect.moveTopLeft( mapToGlobal( rect().bottomLeft() ) ); listRect.setSize( QSize( qMax( qMax( view()->viewport()->width(), mFrame->width() ), width() ) , qMax( view()->viewport()->height(), mFrame->height() ) ) ); const bool usePopup = style->styleHint( QStyle::SH_ComboBox_Popup, &opt, this ); { int listHeight = 0; int count = 0; QStack toCheck; toCheck.push( view()->rootIndex() ); #ifndef QT_NO_TREEVIEW QTreeView* treeView = qobject_cast( view() ); if ( treeView && treeView->header() && !treeView->header()->isHidden() ) listHeight += treeView->header()->height(); #endif while ( !toCheck.isEmpty() ) { QModelIndex parent = toCheck.pop(); for ( int i = 0; i < model()->rowCount( parent ); ++i ) { QModelIndex idx = model()->index( i, mModelColumn, parent ); if ( !idx.isValid() ) continue; listHeight += view()->visualRect( idx ).height(); #ifndef QT_NO_TREEVIEW if ( model()->hasChildren( idx ) && treeView && treeView->isExpanded( idx ) ) toCheck.push( idx ); #endif ++count; if ( !usePopup && count > mMaxVisibleItems ) { toCheck.clear(); break; } } } listRect.setHeight( listHeight ); } { // add the spacing for the grid on the top and the bottom; int heightMargin = 0; // add the frame of the container int marginTop, marginBottom; container->getContentsMargins( 0, &marginTop, 0, &marginBottom ); heightMargin += marginTop +marginBottom; //add the frame of the view view()->getContentsMargins( 0, &marginTop, 0, &marginBottom ); marginTop += 0/*static_cast(QObjectPrivate::get(view()))->top*/; marginBottom += 0/*static_cast(QObjectPrivate::get(view()))->bottom*/; heightMargin += marginTop +marginBottom; listRect.setHeight( listRect.height() +heightMargin ); } // Add space for margin at top and bottom if the style wants it. if ( usePopup ) listRect.setHeight( listRect.height() +style->pixelMetric( QStyle::PM_MenuVMargin, &opt, this ) *2 ); // Make sure the popup is wide enough to display its contents. if ( usePopup ) { const int diff = sizeHint().width() /*d->computeWidthHint()*/ -width(); if ( diff > 0 ) listRect.setWidth( listRect.width() +diff ); } //we need to activate the layout to make sure the min/maximum size are set when the widget was not yet show container->layout()->activate(); //takes account of the minimum/maximum size of the container listRect.setSize( listRect.size().expandedTo(container->minimumSize()) .boundedTo(container->maximumSize())); // make sure the widget fits on screen if (boundToScreen) { if (listRect.width() > screen.width() ) listRect.setWidth(screen.width()); if (/*mapToGlobal(*/listRect/*.bottomRight())*/.x() > screen.right()) { below.setX(screen.x() + screen.width() - listRect.width()); above.setX(screen.x() + screen.width() - listRect.width()); } if (/*mapToGlobal(*/listRect/*.topLeft())*/.x() < screen.x() ) { below.setX(screen.x()); above.setX(screen.x()); } } if ( usePopup ) { // Position horizontally. listRect.moveLeft( above.x() ); // Position vertically so the curently selected item lines up // with the combo box. /*const QRect currentItemRect = view()->visualRect( view()->currentIndex() ); const int offset = listRect.top() -currentItemRect.top(); listRect.moveTop( above.y() +offset -listRect.top() );*/ // Clamp the listRect height and vertical position so we don't expand outside the // available screen geometry.This may override the vertical position, but it is more // important to show as much as possible of the popup. const int height = !boundToScreen ? listRect.height() : qMin(listRect.height(), screen.height()); listRect.setHeight(height); if (boundToScreen) { if (listRect.top() < screen.top()) listRect.moveTop(screen.top()); if (listRect.bottom() > screen.bottom()) listRect.moveBottom(screen.bottom()); } } else if (!boundToScreen || listRect.height() <= belowHeight) { listRect.moveTopLeft(below); } else if (listRect.height() <= aboveHeight) { listRect.moveBottomLeft(above); } else if (belowHeight >= aboveHeight) { listRect.setHeight(belowHeight); listRect.moveTopLeft(below); } else { listRect.setHeight(aboveHeight); listRect.moveBottomLeft(above); } #ifndef QT_NO_IM if ( QInputContext *qic = inputContext() ) qic->reset(); #endif QScrollBar* sb = view()->horizontalScrollBar(); Qt::ScrollBarPolicy policy = view()->horizontalScrollBarPolicy(); bool needHorizontalScrollBar = ( policy == Qt::ScrollBarAsNeeded || policy == Qt::ScrollBarAlwaysOn ) && sb->minimum() < sb->maximum(); if ( needHorizontalScrollBar ) { listRect.adjust( 0, 0, 0, sb->height() ); } container->setGeometry( listRect ); #ifndef Q_WS_MAC const bool updatesEnabled = container->updatesEnabled(); #endif #if defined( Q_WS_WIN ) && !defined( QT_NO_EFFECTS ) #warning Fix me ASAP /*bool scrollDown = ( listRect.topLeft() == below ); if ( QApplication::isEffectEnabled( Qt::UI_AnimateCombo ) && !style->styleHint( QStyle::SH_ComboBox_Popup, &opt, this ) && !window()->testAttribute( Qt::WA_DontShowOnScreen ) ) qScrollEffect( container, scrollDown ? QEffects::DownScroll : QEffects::UpScroll, 150 );*/ #endif // Don't disable updates on Mac OS X. Windows are displayed immediately on this platform, // which means that the window will be visible before the call to container->show() returns. // If updates are disabled at this point we'll miss our chance at painting the popup // menu before it's shown, causing flicker since the window then displays the standard gray // background. #ifndef Q_WS_MAC container->setUpdatesEnabled( false ); #endif container->raise(); container->show(); //container->updateScrollers(); view()->setFocus(); view()->scrollTo( view()->currentIndex(), style->styleHint( QStyle::SH_ComboBox_Popup, &opt, this ) ? QAbstractItemView::PositionAtCenter : QAbstractItemView::EnsureVisible ); #ifndef Q_WS_MAC container->setUpdatesEnabled( updatesEnabled ); #endif container->update(); #ifdef QT_KEYPAD_NAVIGATION if ( QApplication::keypadNavigationEnabled() ) view()->setEditFocus( true ); #endif } QTreeView* pTreeComboBox::view() const { return mView; } void pTreeComboBox::setView( QTreeView* view ) { if ( mView == view ) { return; } delete mView; mView = view; if ( mView ) { mFrameLayout->insertWidget( 0, mView ); mView->setEditTriggers( QAbstractItemView::NoEditTriggers ); mView->setMouseTracking( true ); mView->installEventFilter( this ); mView->viewport()->installEventFilter( this ); connect( mView, SIGNAL( activated( const QModelIndex& ) ), this, SLOT( internal_activated( const QModelIndex& ) ) ); connect( mView, SIGNAL( clicked( const QModelIndex& ) ), this, SLOT( internal_clicked( const QModelIndex& ) ) ); } } QAbstractItemModel* pTreeComboBox::model() const { return mView ? mView->model() : 0; } void pTreeComboBox::setModel( QAbstractItemModel* model ) { if ( mView && mView->model() != model ) { mView->setModel( model ); connect( mView->selectionModel(), SIGNAL( currentChanged( const QModelIndex&, const QModelIndex& ) ), this, SLOT( internal_currentChanged( const QModelIndex&, const QModelIndex& ) ) ); } } QModelIndex pTreeComboBox::rootIndex() const { return mView ? mView->rootIndex() : QModelIndex(); } void pTreeComboBox::setRootIndex( const QModelIndex& index ) { if ( mView ) { mView->setRootIndex( index ); } } QModelIndex pTreeComboBox::currentIndex() const { if ( mView ) { return mFrame->isVisible() ? QModelIndex( mCurrentIndex ) : mView->currentIndex(); } return QModelIndex(); } void pTreeComboBox::setCurrentIndex( const QModelIndex& index ) { if ( mView && ( currentIndex() != index || !index.isValid() ) ) { mCurrentIndex = modelColumnIndex( index ); mForceIndex = true; mView->clearSelection(); mView->setCurrentIndex( mCurrentIndex ); mForceIndex = false; update(); } } void pTreeComboBox::expandAll() { if ( mView ) { mView->expandAll(); } } void pTreeComboBox::internal_activated( const QModelIndex& _index ) { const QModelIndex index = modelColumnIndex( _index ); if ( !( index.flags() & Qt::ItemIsEnabled ) || !( index.flags() & Qt::ItemIsSelectable ) ) { return; } if ( mCurrentIndex != index ) { mCurrentIndex = index; emit currentIndexChanged( index ); } emit activated( index ); hidePopup(); } void pTreeComboBox::internal_clicked( const QModelIndex& _index ) { const QModelIndex index = modelColumnIndex( _index ); if ( !( index.flags() & Qt::ItemIsEnabled ) || !( index.flags() & Qt::ItemIsSelectable ) ) { return; } if ( mCurrentIndex != index ) { mCurrentIndex = index; emit currentIndexChanged( index ); } emit clicked( index ); hidePopup(); } void pTreeComboBox::internal_currentChanged( const QModelIndex& current, const QModelIndex& previous ) { Q_UNUSED( previous ); const QModelIndex index = modelColumnIndex( current ); if ( mForceIndex ) { emit currentIndexChanged( index ); } } ./qwbfsmanager-1.2.1-src/fresh/src/gui/actionmanager/0000755000175000017520000000000011546156115022015 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/fresh/src/gui/actionmanager/pActionsNodeMenuBar.h0000644000175000017520000000765311546156115026041 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pActionsNodeMenuBar.h ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PACTIONSNODEMENUBAR_H #define PACTIONSNODEMENUBAR_H /*! \file pActionsNodeMenuBar.h \brief An extended QMenuBar having menu/actions exposed by a pActionsNodeModel. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include "pActionsNode.h" #include class pActionsNodeModel; /*! \ingroup FreshGui \class pActionsNodeMenuBar \brief An extended QMenuBar having menu/actions exposed by a pActionsNodeModel. */ class FRESH_EXPORT pActionsNodeMenuBar : public QMenuBar { Q_OBJECT public: /*! Create a pActionsNodeMenuBar having parent \a parent. */ pActionsNodeMenuBar( QWidget* parent = 0 ); /*! Destroys the menu bar. */ ~pActionsNodeMenuBar(); /*! Set the model associated with this menu bar. */ void setModel( pActionsNodeModel* model ); /*! Return the model associated with this menu bar. */ pActionsNodeModel* model() const; /*! Add the action \a action at the given \a path. Return true on success else false. */ bool addAction( const QString& path, QAction* action ); /*! Add a new action at the given \a path having text \a text and icon \a icon. Return the new action on success else 0. */ QAction* addAction( const QString& path, const QString& text, const QIcon& icon = QIcon() ); /*! Add a new menu at the given path \a path and return the pActionsNode associated with this menu. */ pActionsNode addMenu( const QString& path ); /*! Remove the action at the given path \a path. */ bool removeAction( const QString& path ); /*! Remove the given action \a action. */ bool removeAction( QAction* action ); /*! Remove the menu at the given path \a path. Any child menus and actions are destroyed. */ bool removeMenu( const QString& path ); /*! Return the menu at the given path \a path. */ QMenu* menu( const QString& path ) const; /*! Return the path of the menu \a menu. */ QString menuPath( QMenu* menu ) const; /*! Return the action at the given path \a path. */ QAction* action( const QString& path ) const; /*! Return the action path at the given path \a path. */ QString actionPath( QAction* action ) const; protected: pActionsNodeModel* mModel; QHash mMenus; /*! This member update the QMenuBar to reflete to the last changes in the pActionsNodeModel starting from node \a node. The scan is recursively done. */ void recursiveSync( const pActionsNode& node ); /*! Completly synchronize the menu bar with the pActionsNodeModel. */ void sync(); protected slots: void model_nodeInserted( const pActionsNode& node ); void model_nodeChanged( const pActionsNode& node ); void model_nodeRemoved( const pActionsNode& node ); void model_nodesCleared(); }; #endif // PACTIONSNODEMENUBAR_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/actionmanager/pActionsNodeModel.cpp0000644000175000017520000003145111546156115026074 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pActionsNodeModel.cpp ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pActionsNodeModel.h" #include int pActionsNodeModel::mColumnCount = 3; pActionsNodeModel::pActionsNodeModel( QObject* parent ) : QAbstractItemModel( parent ) { mNodes[ QString::null ] = &mRootNode; } int pActionsNodeModel::columnCount( const QModelIndex& parent ) const { Q_UNUSED( parent ); return mColumnCount; } QVariant pActionsNodeModel::data( const QModelIndex& index, int role ) const { const pActionsNode* node = nodePointer( index ); if ( !node || node == &mRootNode ) { return QVariant(); } switch ( role ) { case Qt::DecorationRole: switch ( index.column() ) { case 0: return node->icon(); default: break; } break; case Qt::DisplayRole: case Qt::ToolTipRole: switch ( index.column() ) { case pActionsNodeModel::Action: { const QString sep = "**MkS-Separator**"; return node->text() .replace( "&&", sep ) .remove( "&" ) .replace( sep, "&&" ); } case pActionsNodeModel::Shortcut: return node->shortcut().toString( QKeySequence::NativeText ); case pActionsNodeModel::DefaultShortcut: return node->defaultShortcut().toString( QKeySequence::NativeText ); } break; case Qt::FontRole: { QFont font; if ( node->type() == pActionsNode::Path ) { font.setBold( true ); } return font; } /*case Qt::BackgroundRole: return node->type() == pActionsNode::Path ? QBrush( QColor( 0, 0, 255, 20 ) ) : QVariant();*/ } return QVariant(); } QModelIndex pActionsNodeModel::index( int row, int column, const QModelIndex& parent ) const { const pActionsNode* node = nodePointer( parent ); if ( !node || row < 0 || row >= node->d->children.count() || column < 0 || column >= mColumnCount || ( parent.column() != 0 && parent.isValid() ) ) { return QModelIndex(); } return createIndex( row, column, &node->d->children[ row ] ); } QModelIndex pActionsNodeModel::parent( const QModelIndex& index ) const { const pActionsNode* node = nodePointer( index ); if ( !node || node == &mRootNode || node->d->parent == &mRootNode ) { return QModelIndex(); } pActionsNode* parentNode = node->d->parent; const pActionsNode* parentParentNode = parentNode ? parentNode->d->parent : 0; const int row = parentParentNode ? parentParentNode->d->children.indexOf( *parentNode ) : 0; return createIndex( row, 0, parentNode ); } int pActionsNodeModel::rowCount( const QModelIndex& parent ) const { const pActionsNode* node = nodePointer( parent ); return node && ( parent.column() == 0 || parent == QModelIndex() ) ? node->d->children.count() : 0; } bool pActionsNodeModel::hasChildren( const QModelIndex& parent ) const { const pActionsNode* node = nodePointer( parent ); return node && ( parent.column() == 0 || parent == QModelIndex() ) ? !node->d->children.isEmpty() : false; } QVariant pActionsNodeModel::headerData( int section, Qt::Orientation orientation, int role ) const { switch ( orientation ) { case Qt::Horizontal: { if ( role == Qt::DisplayRole ) { switch ( section ) { case pActionsNodeModel::Action: return tr( "Action" ); case pActionsNodeModel::Shortcut: return tr( "Shortcut" ); case pActionsNodeModel::DefaultShortcut: return tr( "Default Shortcut" ); } } break; } default: break; } return QAbstractItemModel::headerData( section, orientation, role ); } bool pActionsNodeModel::setData( const QModelIndex& index, const QVariant& value, int role ) { pActionsNode* node = nodePointer( index ); if ( !node || node == &mRootNode ) { return false; } switch ( role ) { case Qt::DecorationRole: { switch ( node->d->type ) { case pActionsNode::Action: if ( node->d->action ) { node->d->action.data()->setIcon( value.value() ); } break; case pActionsNode::Path: node->d->icon = value.value(); break; default: break; } break; } case Qt::DisplayRole: { switch ( node->d->type ) { case pActionsNode::Action: if ( node->d->action ) { node->d->action.data()->setText( value.toString() ); } break; case pActionsNode::Path: node->d->text = value.toString(); break; default: break; } break; } case pActionsNode::ShortcutRole: { if ( node->d->type == pActionsNode::Action ) { if ( node->d->action ) { const QKeySequence shortcut = value.value(); // check all actions for duplicate shortcuts foreach ( pActionsNode* childNode, mNodes ) { if ( childNode->action() && childNode->action() != node->action() ) { if ( childNode->action()->shortcut() == shortcut && !shortcut.isEmpty() ) { return false; } } } // set shortcut node->d->action.data()->setShortcut( shortcut ); } } break; } case pActionsNode::DefaultShortcutRole: { if ( node->d->type == pActionsNode::Action ) { if ( node->d->action ) { node->d->action.data()->setData( value ); } } break; } default: return QAbstractItemModel::setData( index, value, role ); } emit dataChanged( index.sibling( index.row(), 0 ), index.sibling( index.row(), mColumnCount -1 ) ); emit nodeChanged( *node ); return true; } pActionsNode pActionsNodeModel::rootNode() const { return mRootNode; } pActionsNode pActionsNodeModel::indexToNode( const QModelIndex& index ) const { const pActionsNode* node = nodePointer( index ); return node ? *node : pActionsNode(); } pActionsNode pActionsNodeModel::pathToNode( const QString& _path ) const { const QString path = fixedPath( _path ); const pActionsNode* node = mNodes.value( path ); return node ? *node : pActionsNode(); } pActionsNode pActionsNodeModel::actionToNode( QAction* action ) const { return pathToNode( action ? action->objectName() : QString::null ); } QModelIndex pActionsNodeModel::nodeToIndex( const pActionsNode& node ) const { if ( !mNodes.contains( node.d->path ) || node == mRootNode ) { return QModelIndex(); } const pActionsNode* parentNode = node.d->parent; const int row = parentNode ? parentNode->d->children.indexOf( node ) : 0; return createIndex( row, 0, mNodes[ node.path() ] ); } QModelIndex pActionsNodeModel::pathToIndex( const QString& _path ) const { const QString path = fixedPath( _path ); const pActionsNode* node = mNodes.value( path ); return nodeToIndex( node ? *node : pActionsNode() ); } QModelIndex pActionsNodeModel::actionToIndex( QAction* action ) const { return pathToIndex( action ? action->objectName() : QString::null ); } void pActionsNodeModel::clear() { const int count = mRootNode.d->children.count(); if ( count == 0 ) { return; } beginRemoveRows( QModelIndex(), 0, count -1 ); mRootNode.d->children.clear(); endRemoveRows(); emit nodesCleared(); } bool pActionsNodeModel::addAction( const QString& _path, QAction* action ) { Q_ASSERT( action ); if ( !action ) { return false; } const QString path = fixedPath( _path ); const QString subPath = path.section( '/', 0, -2 ); pActionsNode* parentNode = createCompletePathNode( subPath ); if ( !parentNode ) { return false; } const int count = parentNode->d->children.count(); pActionsNode* node = 0; connect( action, SIGNAL( destroyed( QObject* ) ), this, SLOT( actionDestroyed( QObject* ) ) ); beginInsertRows( nodeToIndex( *parentNode ), count, count ); parentNode->d->children << pActionsNode::actionNode( path, action ); node = &parentNode->d->children.last(); node->d->model = this; node->d->parent = parentNode; mNodes[ path ] = node; action->setParent( this ); endInsertRows(); emit nodeInserted( *node ); return true; } QAction* pActionsNodeModel::addAction( const QString& path, const QString& text, const QIcon& icon ) { QAction* action = new QAction( icon, text, this ); if ( !addAction( path, action ) ) { action->deleteLater(); return 0; } return action; } pActionsNode pActionsNodeModel::addPath( const QString& path ) { pActionsNode* node = createCompletePathNode( path ); return node ? *node : pActionsNode(); } bool pActionsNodeModel::removeAction( const QString& _path, bool removeEmptyPath ) { return removePath( _path, removeEmptyPath ); } bool pActionsNodeModel::removeAction( QAction* action, bool removeEmptyPath ) { return removeAction( action->objectName(), removeEmptyPath ); } bool pActionsNodeModel::removePath( const QString& _path, bool removeEmptyPath ) { const QString path = fixedPath( _path ); const pActionsNode* node = mNodes.value( path ); if ( !node ) { return false; } pActionsNode* parentNode = node->d->parent; const int row = parentNode->d->children.indexOf( *node ); const pActionsNode tmpNode = *node; beginRemoveRows( nodeToIndex( *parentNode ), row, row ); parentNode->d->children.removeAt( row ); endRemoveRows(); emit nodeRemoved( tmpNode ); if ( removeEmptyPath ) { removeCompleteEmptyPathNode( parentNode ); } return true; } bool pActionsNodeModel::isValid( const QModelIndex& index ) const { if ( !index.isValid() || index.row() < 0 || index.column() < 0 || index.column() >= mColumnCount ) { return false; } const pActionsNode* node = static_cast( index.internalPointer() ); const pActionsNode* parentNode = node ? node->d->parent : 0; if ( node == &mRootNode ) { return index.row() == 0; } if ( !node || !parentNode ) { return false; } if ( index.row() >= parentNode->d->children.count() ) { return false; } return true; } pActionsNode* pActionsNodeModel::nodePointer( const QModelIndex& index ) const { if ( index == QModelIndex() ) { return const_cast( &mRootNode ); } if ( !isValid( index ) ) { return 0; } return static_cast( index.internalPointer() ); } pActionsNode* pActionsNodeModel::createCompletePathNode( const QString& path ) { pActionsNode* node = mNodes.value( path ); if ( node ) { return node->d->type == pActionsNode::Path ? node : 0; } const int separatorCount = path.count( "/" ) +1; pActionsNode* parentNode = 0; QString subPath; for ( int i = 0; i < separatorCount; i++ ) { subPath = path.section( '/', 0, i ); node = mNodes.value( subPath ); if ( node ) { if ( path != subPath ) { continue; } return node->d->type == pActionsNode::Path ? node : 0; } parentNode = mNodes.value( i == 0 ? QString::null : path.section( '/', 0, i -1 ) ); const int count = parentNode->d->children.count(); beginInsertRows( nodeToIndex( *parentNode ), count, count ); parentNode->d->children << pActionsNode::pathNode( subPath ); node = &parentNode->d->children.last(); node->d->model = this; node->d->parent = parentNode; mNodes[ subPath ] = node; endInsertRows(); emit nodeInserted( *node ); } return node; } void pActionsNodeModel::removeCompleteEmptyPathNode( pActionsNode* node ) { if ( node == &mRootNode ) { return; } if ( node->d->children.isEmpty() ) { pActionsNode* parentNode = node->d->parent; const int row = parentNode->d->children.indexOf( *node ); const pActionsNode tmpNode = *node; beginRemoveRows( nodeToIndex( *parentNode ), row, row ); parentNode->d->children.removeAt( row ); endRemoveRows(); emit nodeRemoved( tmpNode ); removeCompleteEmptyPathNode( parentNode ); } } QString pActionsNodeModel::fixedPath( const QString& path ) { QString data = QDir::cleanPath( path ) .replace( '\\', '/' ) .remove( ' ' ); while ( data.startsWith( '/' ) ) { data.remove( 0, 1 ); } while ( data.endsWith( '/' ) ) { data.chop( 1 ); } return data; } void pActionsNodeModel::actionDestroyed( QObject* object ) { const QString path = object->objectName(); removeAction( path ); } ./qwbfsmanager-1.2.1-src/fresh/src/gui/actionmanager/pActionsNodeModel.h0000644000175000017520000001523711546156115025545 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pActionsNodeModel.h ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PACTIONSNODEMODEL_H #define PACTIONSNODEMODEL_H /*! \file pActionsNodeModel.h \brief A model for presenting menus and actions. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include #include "pActionsNode.h" class QAction; /*! \ingroup FreshGui \class pActionsNodeModel \brief A model for presenting menus and actions. That allow to have a menu bar that can be easily queried / handled by third party components like plugins. */ class pActionsNodeModel : public QAbstractItemModel { Q_OBJECT friend class pActionsNode::Data; friend class pActionsNodeMenuBar; public: /*! This enum defines teh differents columns of the model. */ enum Column { Action = 0, /*!< The action column. */ Shortcut, /*!< The shortcut column. */ DefaultShortcut /*!< The default shortcut. */ }; /*! Create a new pActionsNodeModel having parent \a parent. */ pActionsNodeModel( QObject* parent = 0 ); /*! Reimplemented from QAbstractItemModel::columnCount(). */ virtual int columnCount( const QModelIndex& parent = QModelIndex() ) const; /*! Reimplemented from QAbstractItemModel::data(). */ virtual QVariant data( const QModelIndex& index, int role = Qt::DisplayRole ) const; /*! Reimplemented from QAbstractItemModel::index(). */ virtual QModelIndex index( int row, int column, const QModelIndex& parent = QModelIndex() ) const; /*! Reimplemented from QAbstractItemModel::parent(). */ virtual QModelIndex parent( const QModelIndex& index ) const; /*! Reimplemented from QAbstractItemModel::rowCount(). */ virtual int rowCount( const QModelIndex& parent = QModelIndex() ) const; /*! Reimplemented from QAbstractItemModel::hasChildren(). */ virtual bool hasChildren( const QModelIndex& parent = QModelIndex() ) const; /*! Reimplemented from QAbstractItemModel::headerData(). */ virtual QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const; /*! Reimplemented from QAbstractItemModel::setData(). */ virtual bool setData( const QModelIndex& index, const QVariant& value, int role = Qt::EditRole ); /*! return the root node of the model. */ pActionsNode rootNode() const; /*! Return the pActionsNode for the given \a index. */ pActionsNode indexToNode( const QModelIndex& index ) const; /*! Return the pActionsNode for the given \a path. */ pActionsNode pathToNode( const QString& path ) const; /*! Return the pActionsNode for the given \a action. */ pActionsNode actionToNode( QAction* action ) const; /*! Return the QModelIndex for the given \a node. */ QModelIndex nodeToIndex( const pActionsNode& node ) const; /*! Return the QModelIndex for the given \a path. */ QModelIndex pathToIndex( const QString& path ) const; /*! Return the QModelIndex for the given \a action. */ QModelIndex actionToIndex( QAction* action ) const; /*! Clear all nodes of the root node. The node's QAction are deleted. */ void clear(); /*! Add the \a action to the model at the given \a path. Return true on success else false. */ bool addAction( const QString& path, QAction* action ); /*! Add a new action in the model at the given \a path having text \a text and icon \a icon. Return the created QAction on success else 0. */ QAction* addAction( const QString& path, const QString& text, const QIcon& icon = QIcon() ); /*! Add a path node at the given \a path. */ pActionsNode addPath( const QString& path ); /*! Remove the action at the given \a path and delete the path hierarchy if it contains no more actions and the \a removeEmptyPath parameter is true. Return true on success else false. */ bool removeAction( const QString& path, bool removeEmptyPath = false ); /*! Remove the action \a action and delete the hierarchy if no more actions exists and the \a removeEmptyPath parameter is true. Return true on success else false. */ bool removeAction( QAction* action, bool removeEmptyPath = false ); /*! Remove the path \a path and delete the hierarchy if it contains no more actions and if the \a removeEmptyPath is true. Return true on success else false. */ bool removePath( const QString& path, bool removeEmptyPath = false ); protected: static int mColumnCount; pActionsNode mRootNode; QHash mNodes; /*! Return true if the given \a index is valid else false. */ bool isValid( const QModelIndex& index ) const; /*! Return the pActionsNode pointer for the given \a index. */ pActionsNode* nodePointer( const QModelIndex& index ) const; /*! Create the complete hierarchy to \a path. Return the pActionsNode pointer of \a path on success else 0. */ pActionsNode* createCompletePathNode( const QString& path ); /*! Remove a complete hierarchy path \a path. */ void removeCompleteEmptyPathNode( pActionsNode* node ); /*! Return a fixed path of \a path. */ static QString fixedPath( const QString& path ); protected slots: /*! Delete the node of deleted QActions. */ void actionDestroyed( QObject* object ); signals: /*! This signal is emited when the node \a node is inserted. */ void nodeInserted( const pActionsNode& node ); /*! This signal is emited when the node \a node is modified. */ void nodeChanged( const pActionsNode& node ); /*! This signal is emited when the node \a node is removed. */ void nodeRemoved( const pActionsNode& node ); /*! This signal is emited when the model is cleared. */ void nodesCleared(); }; #endif // PACTIONSNODEMODEL_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/actionmanager/pActionsNodeShortcutEditor.h0000644000175000017520000000561111546156115027462 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pActionsNodeShortcutEditor.h ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PACTIONSNODESHORTCUTEDITOR_H #define PACTIONSNODESHORTCUTEDITOR_H /*! \file pActionsNodeShortcutEditor.h \brief This class allow to edit the pActionsNode shortcuts of a pActionsNodeModel. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include "pActionsNode.h" #include class Ui_pActionsNodeShortcutEditor; class pActionsNodeModel; class pRecursiveSortFilterProxyModel; class QAbstractButton; /*! \ingroup FreshGui \class pActionsNodeShortcutEditor \brief This class allow to edit the pActionsNode shortcuts of a pActionsNodeModel. */ class FRESH_EXPORT pActionsNodeShortcutEditor : public QDialog { Q_OBJECT public: /*! Create an editor for editing the model \a model and having parent \a parent. */ pActionsNodeShortcutEditor( pActionsNodeModel* model, QWidget* parent = 0 ); /*! Destroys the editor. */ ~pActionsNodeShortcutEditor(); protected: Ui_pActionsNodeShortcutEditor* ui; pActionsNodeModel* mModel; pRecursiveSortFilterProxyModel* mProxy; QHash mOriginalShortcuts; /*! Return the selected node of type pActionsNode::Action. */ pActionsNode selectedActionNode() const; /*! Set the \a node \a shortcut. The \a error is shown if the shortcut can't be setted. */ void setNodeShortcut( pActionsNode& node, const QString& shortcut, const QString& error ); private slots: void on_leFilter_textChanged( const QString& text ); void tvActions_selectionModel_selectionChanged(); void on_kseShortcut_textChanged( const QString& text ); void on_tbSet_clicked(); void on_tbClear_clicked(); void on_dbbButtons_clicked( QAbstractButton* button ); }; #endif // PACTIONSNODESHORTCUTEDITOR_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/actionmanager/pActionsNodeShortcutEditor.ui0000644000175000017520000000577411546156115027662 0ustar pasnoxpasnox pActionsNodeShortcutEditor 0 0 500 400 Shortcut Editor Filter QAbstractItemView::NoEditTriggers true QAbstractItemView::ScrollPerPixel true true false Validate the shortcut :/fresh/icons/apply.png:/fresh/icons/apply.png Clear the shortcut :/fresh/icons/editclear.png:/fresh/icons/editclear.png QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Reset|QDialogButtonBox::RestoreDefaults pKeySequenceEdit QLineEdit

gui/pKeySequenceEdit.h
pLineEdit QLineEdit
gui/pLineEdit.h
./qwbfsmanager-1.2.1-src/fresh/src/gui/actionmanager/pActionsNode.h0000644000175000017520000001212011546156115024550 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pActionsNode.h ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PACTIONSNODE_H #define PACTIONSNODE_H /*! \file pActionsNode.h \brief It's the class used for storing indexes data in pActionsNodeModel. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include #include #include #include class pActionsNodeModel; /*! \ingroup FreshGui \class pActionsNode \brief It's the class used for storing indexes data in pActionsNodeModel. It handle basic data of a node like the icon, text and shortcut. The internal data is explicitly shared so it's easy to use the api. */ class FRESH_EXPORT pActionsNode { friend class pActionsNodeModel; public: /*! This enum defines the differents types of node. */ enum Type { Invalid, /*!< An invalid type */ Path, /*!< This type represents a path node (ie: a possible hierarchy where to integrate the actions nodes) */ Action /*!< This type represente an action node (ie: it represente a QAction) */ }; enum Role { ShortcutRole = Qt::UserRole, DefaultShortcutRole }; /*! Create an invalid node. */ pActionsNode(); /*! Create a node that is a copy of \a other node. */ pActionsNode( const pActionsNode& other ); /*! Create a node having type \a type and path \a path */ pActionsNode( pActionsNode::Type type, const QString& path ); /*! Return true if this node is equal to \a other else false. */ bool operator==( const pActionsNode& other ) const; /*! Return true if this node is different than \a other else false. */ bool operator!=( const pActionsNode& other ) const; /*! Return true if this node is valid else false. A valid node has a type different than pActionsNode::Invalid. */ bool isValid() const; /*! Return true if this node has children else false. */ bool hasChildren() const; /*! Return the pActionsNode::Type of this node. */ pActionsNode::Type type() const; /*! Return the path of this node. */ QString path() const; /*! Return the QAction associated with this node. */ QAction* action() const; /*! Return the icon of this node. */ QIcon icon() const; /*! Return the text of this node. */ QString text() const; /*! Return the parent node of this node. */ pActionsNode parent() const; /*! Return a list of all children of this node. */ QList children() const; /*! Set the node icon, updating the QAction's icon if needed. */ void setIcon( const QIcon& icon ); /*! Set the node text, updating the QAction's text if needed. */ void setText( const QString& text ); /*! Return the shortcut of this node. */ QKeySequence shortcut() const; /*! Set the node shortcut, updating the QAction's shortcut if needed. The model take care that the shortcut is available and not already defined in another node. */ bool setShortcut( const QKeySequence& shortcut ); /*! Return the node default shortcut. */ QKeySequence defaultShortcut() const; /*! Set the node default shortcut, updating the node shortcut if possible. */ void setDefaultShortcut( const QKeySequence& shortcut ); /*! A convenience function to create a path node. */ static pActionsNode pathNode( const QString& path, const QString& text = QString::null, const QIcon& icon = QIcon() ); /*! A convenience function to create an action node. */ static pActionsNode actionNode( const QString& path, QAction* action ); protected: class Data : public QSharedData { public: Data(); virtual ~Data(); bool operator==( const pActionsNode::Data& other ) const; bool operator!=( const pActionsNode::Data& other ) const; pActionsNode::Type type; QString path; QWeakPointer action; QIcon icon; QString text; pActionsNodeModel* model; pActionsNode* parent; QList children; }; QExplicitlySharedDataPointer d; }; uint qHash( const pActionsNode& node ); #endif // PACTIONSNODE_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/actionmanager/pActionsNodeShortcutEditor.cpp0000644000175000017520000001351111546156115030013 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pActionsNodeShortcutEditor.cpp ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pActionsNodeShortcutEditor.h" #include "ui_pActionsNodeShortcutEditor.h" #include "pActionsNodeModel.h" #include "models/pRecursiveSortFilterProxyModel.h" #include "pKeySequenceEdit.h" #include #include #include #include pActionsNodeShortcutEditor::pActionsNodeShortcutEditor( pActionsNodeModel* model, QWidget* parent ) : QDialog( parent ) { Q_ASSERT( model ); ui = new Ui_pActionsNodeShortcutEditor; mModel = model; mProxy = new pRecursiveSortFilterProxyModel( this ); mProxy->setSourceModel( mModel ); mProxy->setFilterCaseSensitivity( Qt::CaseInsensitive ); mProxy->setSortCaseSensitivity( Qt::CaseInsensitive ); ui->setupUi( this ); ui->leFilter->setSearchButtonVisible( false ); ui->leFilter->setPromptText( tr( "Text filter..." ) ); ui->tvActions->setModel( mProxy ); ui->tvActions->header()->setResizeMode( 0, QHeaderView::Stretch ); ui->tvActions->header()->setResizeMode( 1, QHeaderView::ResizeToContents ); ui->tvActions->header()->setResizeMode( 2, QHeaderView::ResizeToContents ); ui->tvActions->expandAll(); // connections connect( ui->tvActions->selectionModel(), SIGNAL( selectionChanged( const QItemSelection&, const QItemSelection& ) ), this, SLOT( tvActions_selectionModel_selectionChanged() ) ); tvActions_selectionModel_selectionChanged(); } pActionsNodeShortcutEditor::~pActionsNodeShortcutEditor() { delete ui; } pActionsNode pActionsNodeShortcutEditor::selectedActionNode() const { const QModelIndex proxyIndex = ui->tvActions->selectionModel()->selectedIndexes().value( 0 ); const QModelIndex index = mProxy->mapToSource( proxyIndex ); const pActionsNode node = mModel->indexToNode( index ); return node.isValid() && node.type() == pActionsNode::Action ? node : pActionsNode(); } void pActionsNodeShortcutEditor::setNodeShortcut( pActionsNode& node, const QString& shortcut, const QString& error ) { if ( !mOriginalShortcuts.contains( node ) ) { mOriginalShortcuts[ node ] = node.shortcut(); } if ( node.setShortcut( shortcut ) ) { tvActions_selectionModel_selectionChanged(); } else { QMessageBox::information( this, QString::null, error ); } } void pActionsNodeShortcutEditor::on_leFilter_textChanged( const QString& text ) { mProxy->setFilterWildcard( text ); ui->tvActions->expandAll(); } void pActionsNodeShortcutEditor::tvActions_selectionModel_selectionChanged() { const pActionsNode node = selectedActionNode(); if ( node.isValid() ) { ui->kseShortcut->setText( node.shortcut().toString() ); } else { ui->kseShortcut->clear(); } ui->kseShortcut->setEnabled( node.isValid() ); ui->tbSet->setEnabled( false ); ui->tbClear->setEnabled( node.isValid() && !node.shortcut().isEmpty() ); ui->dbbButtons->button( QDialogButtonBox::Reset )->setEnabled( false ); ui->dbbButtons->button( QDialogButtonBox::RestoreDefaults )->setEnabled( node.isValid() && node.shortcut() != node.defaultShortcut() ); ui->kseShortcut->setFocus(); } void pActionsNodeShortcutEditor::on_kseShortcut_textChanged( const QString& text ) { Q_UNUSED( text ); const pActionsNode node = selectedActionNode(); ui->tbSet->setEnabled( node.isValid() && !ui->kseShortcut->text().isEmpty() ); ui->dbbButtons->button( QDialogButtonBox::Reset )->setEnabled( true ); ui->dbbButtons->button( QDialogButtonBox::RestoreDefaults )->setEnabled( node.isValid() && node.shortcut() != node.defaultShortcut() ); } void pActionsNodeShortcutEditor::on_tbSet_clicked() { pActionsNode node = selectedActionNode(); if ( node.isValid() && !ui->kseShortcut->text().isEmpty() ) { setNodeShortcut( node, ui->kseShortcut->text(), tr( "Can't set shortcut, it's maybe already used by another action." ) ); } } void pActionsNodeShortcutEditor::on_tbClear_clicked() { pActionsNode node = selectedActionNode(); if ( node.isValid() ) { setNodeShortcut( node, QString::null, QString::null ); } } void pActionsNodeShortcutEditor::on_dbbButtons_clicked( QAbstractButton* button ) { switch ( ui->dbbButtons->standardButton( button ) ) { case QDialogButtonBox::Reset: { tvActions_selectionModel_selectionChanged(); break; } case QDialogButtonBox::RestoreDefaults: { pActionsNode node = selectedActionNode(); if ( node.isValid() ) { setNodeShortcut( node, node.defaultShortcut(), tr( "Can't restore default shortcut, it's maybe already used by another action." ) ); } break; } case QDialogButtonBox::Ok: { accept(); break; } case QDialogButtonBox::Cancel: { foreach ( pActionsNode node, mOriginalShortcuts.keys() ) { node.action()->setShortcut( mOriginalShortcuts.value( node ) ); } reject(); break; } default: break; } } ./qwbfsmanager-1.2.1-src/fresh/src/gui/actionmanager/pActionsNodeMenuBar.cpp0000644000175000017520000001317011546156115026363 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pActionsNodeMenuBar.cpp ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pActionsNodeMenuBar.h" #include "pActionsNodeModel.h" #include #include #include pActionsNodeMenuBar::pActionsNodeMenuBar( QWidget* parent ) : QMenuBar( parent ) { mModel = 0; } pActionsNodeMenuBar::~pActionsNodeMenuBar() { if ( mModel ) { mModel->clear(); } } void pActionsNodeMenuBar::setModel( pActionsNodeModel* model ) { if ( mModel ) { mModel->clear(); disconnect( mModel, SIGNAL( nodeInserted( const pActionsNode& ) ), this, SLOT( model_nodeInserted( const pActionsNode& ) ) ); disconnect( mModel, SIGNAL( nodeChanged( const pActionsNode& ) ), this, SLOT( model_nodeChanged( const pActionsNode& ) ) ); disconnect( mModel, SIGNAL( nodeRemoved( const pActionsNode& ) ), this, SLOT( model_nodeRemoved( const pActionsNode& ) ) ); disconnect( mModel, SIGNAL( nodesCleared() ), this, SLOT( model_nodesCleared() ) ); mModel = 0; } mModel = model; if ( mModel ) { connect( mModel, SIGNAL( nodeInserted( const pActionsNode& ) ), this, SLOT( model_nodeInserted( const pActionsNode& ) ) ); connect( mModel, SIGNAL( nodeChanged( const pActionsNode& ) ), this, SLOT( model_nodeChanged( const pActionsNode& ) ) ); connect( mModel, SIGNAL( nodeRemoved( const pActionsNode& ) ), this, SLOT( model_nodeRemoved( const pActionsNode& ) ) ); connect( mModel, SIGNAL( nodesCleared() ), this, SLOT( model_nodesCleared() ) ); sync(); } } pActionsNodeModel* pActionsNodeMenuBar::model() const { return mModel; } bool pActionsNodeMenuBar::addAction( const QString& path, QAction* action ) { return mModel ? mModel->addAction( path, action ) : false; } QAction* pActionsNodeMenuBar::addAction( const QString& path, const QString& text, const QIcon& icon ) { return mModel ? mModel->addAction( path, text, icon ) : 0; } pActionsNode pActionsNodeMenuBar::addMenu( const QString& path ) { return mModel ? mModel->addPath( path ) : pActionsNode(); } bool pActionsNodeMenuBar::removeAction( const QString& path ) { return mModel ? mModel->removeAction( path ) : false; } bool pActionsNodeMenuBar::removeAction( QAction* action ) { return mModel ? mModel->removeAction( action ) : false; } bool pActionsNodeMenuBar::removeMenu( const QString& path ) { return mModel ? mModel->removePath( path ) : false; } QMenu* pActionsNodeMenuBar::menu( const QString& _path ) const { const QString path = pActionsNodeModel::fixedPath( _path ); return mMenus.value( path ); } QString pActionsNodeMenuBar::menuPath( QMenu* menu ) const { return mMenus.key( menu ); } QAction* pActionsNodeMenuBar::action( const QString& path ) const { return mModel ? mModel->pathToNode( path ).action() : 0; } QString pActionsNodeMenuBar::actionPath( QAction* action ) const { return mModel ? mModel->actionToNode( action ).path() : QString::null; } void pActionsNodeMenuBar::recursiveSync( const pActionsNode& node ) { foreach ( const pActionsNode& childNode, node.children() ) { model_nodeInserted( childNode ); if ( childNode.hasChildren() ) { recursiveSync( childNode ); } } } void pActionsNodeMenuBar::sync() { if ( !mModel ) { qDeleteAll( mMenus.values() ); mMenus.clear(); return; } recursiveSync( mModel->rootNode() ); } void pActionsNodeMenuBar::model_nodeInserted( const pActionsNode& node ) { QMenu* parentMenu = mMenus.value( node.path().section( '/', 0, -2 ) ); switch ( node.type() ) { case pActionsNode::Action: { parentMenu->addAction( node.action() ); break; } case pActionsNode::Path: { QMenu* menu = new QMenu; menu->setObjectName( node.path() ); mMenus[ node.path() ] = menu; if ( parentMenu ) { parentMenu->addMenu( menu ); } else { QMenuBar::addMenu( menu ); } model_nodeChanged( node ); break; } default: break; } } void pActionsNodeMenuBar::model_nodeChanged( const pActionsNode& node ) { switch ( node.type() ) { case pActionsNode::Action: break; case pActionsNode::Path: { QMenu* menu = mMenus.value( node.path() ); menu->setIcon( node.icon() ); menu->setTitle( node.text() ); } default: break; } } void pActionsNodeMenuBar::model_nodeRemoved( const pActionsNode& node ) { if ( node.type() == pActionsNode::Path ) { QMenu* menu = mMenus.take( node.path() ); menu->deleteLater(); } else { QMenu* parentMenu = mMenus.value( node.path().section( '/', 0, -2 ) ); parentMenu->removeAction( node.action() ); } } void pActionsNodeMenuBar::model_nodesCleared() { qDeleteAll( mMenus ); mMenus.clear(); } ./qwbfsmanager-1.2.1-src/fresh/src/gui/actionmanager/pActionsNode.cpp0000644000175000017520000001233611546156115025114 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pActionsNode.cpp ** Date : 2011-02-20T00:41:09 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pActionsNode.h" #include "pActionsNodeModel.h" uint qHash( const pActionsNode& node ) { return qHash( node.path() ); } // pActionsNode::Data pActionsNode::Data::Data() { type = pActionsNode::Invalid; model = 0; parent = 0; } pActionsNode::Data::~Data() { if ( model ) { model->mNodes.remove( path ); } if ( action.data() ) { action.data()->deleteLater(); } } bool pActionsNode::Data::operator==( const pActionsNode::Data& other ) const { return type == other.type && path == other.path && action == other.action && icon.cacheKey() == other.icon.cacheKey() && text == other.text && model == other.model && parent == other.parent && children == other.children; } bool pActionsNode::Data::operator!=( const pActionsNode::Data& other ) const { return !operator==( other ); } // pActionsNode pActionsNode::pActionsNode() { d = new pActionsNode::Data; } pActionsNode::pActionsNode( const pActionsNode& other ) { d = other.d; } pActionsNode::pActionsNode( pActionsNode::Type type, const QString& path ) { d = new pActionsNode::Data; d->type = type; d->path = path; } bool pActionsNode::operator==( const pActionsNode& other ) const { return d == other.d; } bool pActionsNode::operator!=( const pActionsNode& other ) const { return !operator==( other ); } bool pActionsNode::isValid() const { return d->type != pActionsNode::Invalid; } bool pActionsNode::hasChildren() const { return !d->children.isEmpty(); } pActionsNode::Type pActionsNode::type() const { return d->type; } QString pActionsNode::path() const { return d->path; } QAction* pActionsNode::action() const { return d->action.data(); } QIcon pActionsNode::icon() const { switch ( d->type ) { case pActionsNode::Action: return d->action.data()->icon(); case pActionsNode::Path: return d->icon; default: return QIcon(); } } QString pActionsNode::text() const { switch ( d->type ) { case pActionsNode::Action: return d->action.data()->text(); case pActionsNode::Path: return d->text; default: return QString::null; } } pActionsNode pActionsNode::parent() const { return d->parent ? *d->parent : pActionsNode(); } QList pActionsNode::children() const { return d->children; } void pActionsNode::setIcon( const QIcon& icon ) { if ( !d->model ) { return; } const QModelIndex index = d->model->nodeToIndex( *this ); d->model->setData( index, QVariant::fromValue( icon ), Qt::DecorationRole ); } void pActionsNode::setText( const QString& text ) { if ( !d->model ) { return; } const QModelIndex index = d->model->nodeToIndex( *this ); d->model->setData( index, text, Qt::DisplayRole ); } QKeySequence pActionsNode::shortcut() const { return d->type == pActionsNode::Action ? ( d->action ? d->action.data()->shortcut() : QKeySequence() ) : QKeySequence(); } bool pActionsNode::setShortcut( const QKeySequence& shortcut ) { if ( !d->model ) { return false; } const QModelIndex index = d->model->nodeToIndex( *this ); return d->model->setData( index, shortcut, pActionsNode::ShortcutRole ); } QKeySequence pActionsNode::defaultShortcut() const { return d->type == pActionsNode::Action ? ( d->action ? d->action.data()->data().value() : QKeySequence() ) : QKeySequence(); } void pActionsNode::setDefaultShortcut( const QKeySequence& shortcut ) { if ( !d->model ) { return; } const QModelIndex index = d->model->nodeToIndex( *this ); if ( d->model->setData( index, shortcut, pActionsNode::DefaultShortcutRole ) ) { if ( this->shortcut().isEmpty() ) { setShortcut( shortcut ); } } } pActionsNode pActionsNode::pathNode( const QString& path, const QString& text, const QIcon& icon ) { pActionsNode node( pActionsNode::Path, path ); node.d->icon = icon; node.d->text = text; if ( node.d->text.isEmpty() ) { node.d->text = path.section( '/', -1, -1 ); } return node; } pActionsNode pActionsNode::actionNode( const QString& path, QAction* action ) { pActionsNode node( pActionsNode::Action, path ); node.d->action = action; action->setObjectName( path ); return node; } ./qwbfsmanager-1.2.1-src/fresh/src/gui/pToolButton.h0000644000175000017520000000624711546156115021660 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pToolButton.h ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PTOOLBUTTON_H #define PTOOLBUTTON_H /*! \file pToolButton.h \brief An extended QToolButton that can be rotated. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include #include #include class QStyleOptionToolButton; /*! \ingroup FreshGui \class pToolButton \brief An extended QToolButton that can be rotated. This button can be rotated. */ class FRESH_EXPORT pToolButton : public QToolButton { Q_OBJECT friend class pDockWidgetTitleBar; public: /*! Create an instance of button having \a parent as parent and layouted in \a direction. */ pToolButton( QWidget* parent, QBoxLayout::Direction direction = QBoxLayout::LeftToRight ); /*! Reimplemented. */ virtual QSize minimumSizeHint() const; /*! Reimplemented. */ virtual QSize sizeHint() const; /*! Return the direction this button is layouted. */ QBoxLayout::Direction direction() const; /*! Return the user data associated with this button. */ QVariant userData() const; public slots: /*! Set the direction of the button to \a direction. */ void setDirection( QBoxLayout::Direction direction ); /*! Set the user data to \a data. */ void setUserData( const QVariant& data ); protected: QBoxLayout::Direction mDirection; bool mMenuDown; QVariant mUserData; enum CursorArea { caNone = 0, caArrow, caButton, caArrowClicked, caButtonClicked }; /*! Reimplemented. */ virtual void paintEvent( QPaintEvent* event ); /*! Reimplemented. */ virtual void mousePressEvent( QMouseEvent* event ); /*! Reimplemented. */ virtual void mouseMoveEvent( QMouseEvent* event ); /*! Reimplemented. */ virtual void mouseReleaseEvent( QMouseEvent* event ); void paint( QStyleOptionToolButton* option ); QSize internalSize( Qt::Orientation orientation ) const; pToolButton::CursorArea cursorArea( const QPoint& pos = QPoint() ) const; QMenu* hasMenu() const; bool menuButtonDown() const; }; #endif // PTOOLBUTTON_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/pLineEdit.h0000644000175000017520000000731711546156115021243 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pLineEdit.h ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PLINEEDIT_H #define PLINEEDIT_H /*! \file pLineEdit.h \brief An extended QLineEdit. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include class QAction; class QMenu; class QToolButton; class QTimer; /*! \ingroup FreshGui \class pLineEdit \brief An extended QLineEdit. This line edit can have a text place holder (ie: a temporary grey text when the text is empty ), a button menu at left and a clear button at right. */ class FRESH_EXPORT pLineEdit : public QLineEdit { Q_OBJECT public: /*! Create an instance of the widget having \a parent as parent. */ pLineEdit( QWidget* parent = 0 ); /*! Create an instance of the widget having \a parent as parent and text set to \a contents. */ pLineEdit( const QString& contents, QWidget* parent = 0 ); /*! Return the menu of this line edit. */ QMenu* menu() const; /*! Set the menu of this line edit. Menu is accessible from the left button. */ void setMenu( QMenu* menu ); /*! Return true if the search button is visible, else false. */ bool isSearchButtonVisible() const; /*! Return the prompt text (ie: grey text when the text is empty). */ QString promptText() const; public slots: /*! Set the search button visibility to \a visible. */ void setSearchButtonVisible( bool visible ); /*! Set the prompt text to \a prompt. */ void setPromptText( const QString& prompt ); /*! Performs a click on the search button. */ void clickSearchButton(); /*! Performs a click on the clear button. */ void clickClearButton(); protected: static const int mTimeOut; int mMargin; int mSpacing; QToolButton* tbSearch; QToolButton* tbClear; QString mPromptText; QTimer* mTimer; /*! Reimplemented. */ virtual void paintEvent( QPaintEvent* event ); /*! Reimplemented. */ virtual void resizeEvent( QResizeEvent* event ); void init(); void setClearButtonVisible( bool visible ); protected slots: void _q_textChanged( const QString& text ); void timer_timeout(); signals: /*! This signal is emit when the search button is clicked. */ void searchButtonClicked(); /*! This signal is emit when the search button menu \a action is triggered. */ void searchButtonActionTriggered( QAction* action ); /*! This signal is emit when the clear button is clicked. */ void clearButtonClicked(); /*! This signal is emit when the text in the line edit changed to \a text sometimes after the last typed character. */ void searchTextChanged( const QString& text ); }; #endif // PLINEEDIT_H ./qwbfsmanager-1.2.1-src/fresh/src/gui/pIconManager.h0000644000175000017520000000557311546156115021733 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pIconManager.h ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PICONMANAGER_H #define PICONMANAGER_H /*! \file pIconManager.h \brief A cache class for icons and pixmaps \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include #include #include #include /*! \ingroup FreshGui \class pIconManager \brief A cache class for icons and pixmaps. This class allow to cache and share QPixmap & QIcon. Icons and pixmaps can easily be loaded on demand by using coresponding members. */ class FRESH_EXPORT pIconManager { private: typedef QCache pIconCache; // structure for QIcon cache. typedef QPair pFileNamePair; // structure for mapping user path to true path. typedef QMap pFileNameCache; // cache map for paths. static pIconManager::pIconCache mIconCache; static pIconManager::pFileNameCache mFileNameCache; public: /*! Return the file path of the given \a fileName starting looking recursively from \a prefix. \note The fileName/prefix pair is cached for fast lookup for next call. */ static QString filePath( const QString& fileName, const QString& prefix = QLatin1String( ":/" ) ); /*! Return the pixmap \a fileName starting looking recursively from \a prefix. \note The fileName/prefix pair is cached for fast lookup for next call. */ static QPixmap pixmap( const QString& fileName, const QString& prefix = QLatin1String( ":/" ) ); /*! Return the icon \a fileName starting looking recursively from \a prefix. \note The fileName/prefix pair is cached for fast lookup for next call. */ static QIcon icon( const QString& fileName, const QString& prefix = QLatin1String( ":/" ) ); }; #endif // PICONMANAGER_H ./qwbfsmanager-1.2.1-src/fresh/src/core/0000755000175000017520000000000011546156115017351 5ustar pasnoxpasnox./qwbfsmanager-1.2.1-src/fresh/src/core/pWinHelpers.h0000644000175000017520000000527111546156115021767 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pWinHelpers.h ** Date : 2011-02-20T00:44:21 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PWINHELPERS_H #define PWINHELPERS_H /*! \file pWinHelpers.h \brief A central place for windows helpers. \author Filipe Azevedo aka Nox P\@sNox . \note Gordon Schumacher's macros for TCHAR -> QString conversions and vice versa. */ #include /*! \ingroup FreshCore \namespace pWinHelpers \brief A central place for windows helpers. \note This namespace/macros are available on Windows only. */ #ifdef UNICODE /*UNICODE*/ #ifndef _UNICODE // needed for _tcslen #define _UNICODE #endif #define QStringToTCHAR( x ) (wchar_t*)x.utf16() #define PQStringToTCHAR( x ) (wchar_t*)x->utf16() #define TCHARToQString( x ) QString::fromUtf16( (ushort*)( x ) ) #define TCHARToQStringN( x, y ) QString::fromUtf16( (ushort*)( x ), ( y ) ) #else /*UNICODE*/ #define QStringToTCHAR( x ) x.local8Bit().constData() #define PQStringToTCHAR( x ) x->local8Bit().constData() #define TCHARToQString( x ) QString::fromLocal8Bit( ( x ) ) #define TCHARToQStringN( x, y ) QString::fromLocal8Bit( ( x ), ( y ) ) #endif /*UNICODE*/ // in case of need #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif /*! \def QStringToTCHAR( x ) \brief Convert \a x QString to TCHAR. */ /*! \def PQStringToTCHAR( x ) \brief Convert \a x QString pointer to TCHAR. */ /*! \def TCHARToQString( x ) \brief Convert \a x TCHAR to QString. */ /*! \def TCHARToQStringN( x, y ) \brief Convert \a x TCHAR with a length of \a y to QString. */ #endif // PWINHELPERS_H ./qwbfsmanager-1.2.1-src/fresh/src/core/FreshExport.h0000644000175000017520000000324711546156115022001 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : FreshExport.h ** Date : 2011-02-20T00:44:21 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef FRESH_EXPORT_H #define FRESH_EXPORT_H /*! \file FreshExport.h \brief This macro allow symbols to be exported/imported for Windows OS. \author Filipe Azevedo aka Nox P\@sNox */ #include /*! \def FRESH_EXPORT \brief This macro allow symbols to be exported/imported for Windows OS. */ #if defined( FRESH_CORE_BUILD ) #define FRESH_EXPORT Q_DECL_EXPORT #else #define FRESH_EXPORT Q_DECL_IMPORT #endif #endif // FRESH_EXPORT_H ./qwbfsmanager-1.2.1-src/fresh/src/core/Fresh.h0000644000175000017520000000345411546156115020577 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : Fresh.h ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef FRESH_H #define FRESH_H /*! \file Fresh.h \brief Access to library informations. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include /*! \def FRESH_VERSION \brief This macro contains the Fresh version. */ #define FRESH_VERSION "1.0.0" /*! \ingroup FreshCore \namespace Fresh \brief Access to library informations. */ namespace Fresh { /*! Return the QString version of the library. */ FRESH_EXPORT QString versionString(); /*! Return the const char* version of the library. */ FRESH_EXPORT const char* version(); }; #endif // FRESH_H ./qwbfsmanager-1.2.1-src/fresh/src/core/pNetworkAccessManager.cpp0000644000175000017520000001143611546156115024310 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pNetworkAccessManager.cpp ** Date : 2011-02-20T00:44:25 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pNetworkAccessManager.h" #include "pCoreUtils.h" // for qHash( const QUrl& ) #include #include #include #include #if defined( QT_GUI_LIB ) #include #endif Q_GLOBAL_STATIC( pNetworkAccessManager, networkAccessManager ); pNetworkAccessManager* pNetworkAccessManager::instance() { return networkAccessManager(); } pNetworkAccessManager::pNetworkAccessManager( QObject* parent ) : QNetworkAccessManager( parent ) { mMaxRetryPerUrl = 5; mCache = new QNetworkDiskCache( this ); setCache( mCache ); connect( this, SIGNAL( finished( QNetworkReply* ) ), this, SLOT( _q_finished( QNetworkReply* ) ) ); } pNetworkAccessManager::~pNetworkAccessManager() { } QNetworkReply* pNetworkAccessManager::createRequest( Operation op, const QNetworkRequest& req, QIODevice* outgoingData ) { if ( mPendingRequests.contains( req.url() ) || mRetryRequests[ req.url() ] >= mMaxRetryPerUrl ) { QNetworkReply* reply = QNetworkAccessManager::createRequest( QNetworkAccessManager::HeadOperation, QNetworkRequest(), outgoingData ); return reply; } mPendingRequests << req.url(); mRetryRequests[ req.url() ]++; return QNetworkAccessManager::createRequest( op, req, outgoingData ); } void pNetworkAccessManager::_q_finished( QNetworkReply* reply ) { mPendingRequests.remove( reply->request().url() ); if ( reply->operation() == QNetworkAccessManager::HeadOperation && reply->request().url().isEmpty() ) { reply->deleteLater(); return; } if ( reply->error() == QNetworkReply::NoError ) { emit cached( reply->url() ); } else { emit error( reply->url(), reply->errorString() ); } } void pNetworkAccessManager::setCacheDirectory( const QString& cacheDir ) { mCache->setCacheDirectory( cacheDir ); } QString pNetworkAccessManager::cacheDirectory() const { return mCache->cacheDirectory(); } void pNetworkAccessManager::setMaximumCacheSize( qint64 size ) { mCache->setMaximumCacheSize( size ); } qint64 pNetworkAccessManager::maximumCacheSize() const { return mCache->maximumCacheSize(); } void pNetworkAccessManager::setMaxRetryPerUrl( int max ) { mMaxRetryPerUrl = max; } int pNetworkAccessManager::maxRetryPerUrl() const { return mMaxRetryPerUrl; } qint64 pNetworkAccessManager::cacheSize() const { return mCache->cacheSize(); } void pNetworkAccessManager::clearCache() { mRetryRequests.clear(); mCache->clear(); emit cacheCleared(); } bool pNetworkAccessManager::removeCache( const QUrl& url ) const { return mCache->remove( url ); } QIODevice* pNetworkAccessManager::cacheData( const QUrl& url ) const { return mCache->data( url ); } bool pNetworkAccessManager::hasCacheData( const QUrl& url ) const { const QIODevice* data = mCache->data( url ); const bool has = data; delete data; return has; } QNetworkCacheMetaData pNetworkAccessManager::cacheMetaData( const QUrl& url ) const { return mCache->metaData( url ); } QNetworkCacheMetaData pNetworkAccessManager::cacheFileMetaData( const QString& fileName ) const { return mCache->fileMetaData( fileName ); } #if defined( QT_GUI_LIB ) QPixmap pNetworkAccessManager::cachedPixmap( const QUrl& url ) const { const QString key = url.toString(); QPixmap pixmap; if ( !QPixmapCache::find( key, pixmap ) ) { QIODevice* data = mCache->data( url ); if ( data ) { if ( pixmap.loadFromData( data->readAll() ) ) { if ( !QPixmapCache::insert( key, pixmap ) ) { qWarning() << Q_FUNC_INFO << "Can't cache pixmap" << key; } } else { qWarning() << Q_FUNC_INFO << "Can't load pixmap to cache" << key; } delete data; } } return pixmap; } #endif ./qwbfsmanager-1.2.1-src/fresh/src/core/Fresh.cpp0000644000175000017520000000302411546156115021123 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : Fresh.cpp ** Date : 2011-02-20T00:41:35 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "Fresh.h" #ifdef QT_GUI namespace Fresh { struct InitResources { InitResources() { qWarning( "Fresh Initialized" ); Q_INIT_RESOURCE( fresh ); } }; InitResources resources; }; #endif QString Fresh::versionString() { return QLatin1String( FRESH_VERSION ); } const char* Fresh::version() { return FRESH_VERSION; } ./qwbfsmanager-1.2.1-src/fresh/src/core/pMacHelpers.h0000644000175000017520000000573011546156115021732 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pMacHelpers.h ** Date : 2011-02-20T00:44:21 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PMACHELPERS_H #define PMACHELPERS_H /*! \file pMacHelpers.h \brief A central place for mac os x helpers. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include #import #import #import #import #import #import #import #import #import /*! \ingroup FreshCore \namespace pMacHelpers \brief A central place for mac os x helpers. \note This namespace is available on Mac OS X only. */ namespace pMacHelpers { /*! Return a QVariantMap from \a dict. */ FRESH_EXPORT QVariantMap toQVariantMap( CFDictionaryRef dict ); /*! Return a QVariantList from \a array. */ FRESH_EXPORT QVariantList toQVariantList( CFArrayRef array ); /*! Return a QVariant from \a string. */ FRESH_EXPORT QVariant toQVariant( CFStringRef string ); /*! Return a QVariant from \a value. */ FRESH_EXPORT QVariant toQVariant( CFBooleanRef value ); /*! Return a QVariant from \a number. */ FRESH_EXPORT QVariant toQVariant( CFNumberRef number ); /*! Return a QVariant from \a data. */ FRESH_EXPORT QVariant toQVariant( CFDataRef data ); /*! Return a QVariant from \a url. */ FRESH_EXPORT QVariant toQVariant( CFURLRef url ); /*! Return a QVariant from \a uuid. */ FRESH_EXPORT QVariant toQVariant( CFUUIDRef uuid ); /*! Return a QVariant from \a bundle. */ FRESH_EXPORT QVariant toQVariant( CFBundleRef bundle ); /*! Return a QVariant from CFType \a ref. */ FRESH_EXPORT QVariant toQVariant( CFTypeRef ref ); }; #endif // MACHELPERS_H ./qwbfsmanager-1.2.1-src/fresh/src/core/pVersion.cpp0000644000175000017520000000664311546156115021673 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pVersion.cpp ** Date : 2011-02-20T00:44:25 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #include "pVersion.h" #include pVersion::pVersion( const QString& version ) { mVersion = version.trimmed(); const QStringList parts = mVersion.split( "." ); const int index = parts.value( 3 ).indexOf( QRegExp( "[A-Z|a-z]" ) ); major = parts.value( 0 ).toInt(); minor = parts.value( 1 ).toInt(); patch = parts.value( 2 ).toInt(); if ( index != -1 ) { build = parts.value( 3 ).mid( 0, index ).toInt(); extra = parts.value( 3 ).mid( index ); } else { build = parts.value( 3 ).toInt(); } } QString pVersion::toString() const { return mVersion; } bool pVersion::operator==( const pVersion& other ) const { return major == other.major && minor == other.minor && patch == other.patch && build == other.build && extra == other.extra; } bool pVersion::operator!=( const pVersion& other ) const { return !operator==( other ); } bool pVersion::operator<( const pVersion& other ) const { if ( *this == other ) { return false; } else if ( major != other.major ) { return major < other.major; } else if ( minor != other.minor ) { return minor < other.minor; } else if ( patch != other.patch ) { return patch < other.patch; } else if ( build != other.build ) { return build < other.build; } else if ( extra.isEmpty() && !other.extra.isEmpty() ) { return false; } else if ( !extra.isEmpty() && other.extra.isEmpty() ) { return true; } return extra < other.extra; // not the best but afaik ;) } bool pVersion::operator>( const pVersion& other ) const { if ( *this == other ) { return false; } else if ( major != other.major ) { return major > other.major; } else if ( minor != other.minor ) { return minor > other.minor; } else if ( patch != other.patch ) { return patch > other.patch; } else if ( build != other.build ) { return build > other.build; } else if ( extra.isEmpty() && !other.extra.isEmpty() ) { return true; } else if ( !extra.isEmpty() && other.extra.isEmpty() ) { return false; } return extra > other.extra; // not the best but afaik ;) } bool pVersion::operator<=( const pVersion& other ) const { return operator<( other ) || operator==( other ); } bool pVersion::operator>=( const pVersion& other ) const { return operator>( other ) || operator==( other ); } ./qwbfsmanager-1.2.1-src/fresh/src/core/pCoreUtils.h0000644000175000017520000000675011546156115021623 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox ** Project : Fresh Library ** FileName : pCoreUtils.h ** Date : 2011-02-20T00:44:21 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ #ifndef PCOREUTILS_H #define PCOREUTILS_H /*! \file pCoreUtils.h \brief A central place for reusable core functions. \author Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include class QLocale; class QUrl; /*! Return a hash for \a locale. \sa qHash, QHash. */ FRESH_EXPORT uint qHash( const QLocale& locale ); #if QT_VERSION < 0x040700 /*! Return a hash for \a url, in fact it return qHash( url.toString() ). \sa qHash, QHash. \note This member is defined only if QT_VERSION < 4.7.0 because it exists for Qt version >= 4.7.0. */ FRESH_EXPORT uint qHash( const QUrl& url ); #endif /*! \ingroup FreshCore \namespace pCoreUtils \brief A central place for reusable core functions. */ namespace pCoreUtils { /*! Return a file path that match \a fileName in \a dir. If no match is found QString::null is returned. The search is done recursively according to \a recursive. \note fileName can be a filter (ie: README*.TXT). */ FRESH_EXPORT QString findFile( QDir& dir, const QString& fileName, bool recursive = true ); /*! Return a list of file path that match \a filters in \a dir. If no match is found QStringList() is returned. The search is done recursively according to \a recursive. */ FRESH_EXPORT QStringList findFiles( QDir& dir, const QStringList& filters, bool recursive = true ); /*! Return a list of file path that match \a filter in \a dir. If no match is found QStringList() is returned. The search is done recursively according to \a recursive. */ FRESH_EXPORT QStringList findFiles( QDir& dir, const QString& filter, bool recursive = true ); /*! Return true if the directory at \a path is totally empty else false. */ FRESH_EXPORT bool isEmptyDirectory( const QString& path ); /*! Return the available list of sorted text codecs. */ FRESH_EXPORT QStringList textCodecs(); /*! Return a title cased string of \a string. Title case is the meaning of having each first letter of a word upercase and others lower case. */ FRESH_EXPORT QString toTitleCase( const QString& string ); /*! Adapt file size \a nb to a user visible string. */ FRESH_EXPORT QString fileSizeAdaptString( qreal nb ); /*! Convert \a bytes to a human reading string. */ FRESH_EXPORT QString fileSizeToString( qint64 bytes ); }; #endif // PCOREUTILS_H ./qwbfsmanager-1.2.1-src/fresh/src/core/pGetOpt.h0000644000175000017520000001214411546156115021106 0ustar pasnoxpasnox/**************************************************************************** ** ** Created using Monkey Studio IDE v1.8.4.0 (1.8.4.0) ** Authors : Filipe AZEVEDO aka Nox P@sNox & Copyrighted authors later defined ** Project : Fresh Library ** FileName : pGetOpt.cpp ** Date : 2011-02-20T00:44:21 ** License : LGPL v3 ** Home Page : http://bettercodes.org/projects/fresh ** Comment : Fresh Library is a Qt 4 extension library providing set of new core & gui classes. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU Leser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program. If not, see . ** ****************************************************************************/ /********************************************************************** * Copyright (c) 2003, 2004, froglogic Porten & Stadlbauer GbR * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the froglogic nor the names of its * contributors may be used to endorse or promote products * derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * **********************************************************************/ #ifndef PGETOPT_H #define PGETOPT_H /*! \file pGetOpt.h \brief A command line option parser. \author froglogic GbR , Filipe Azevedo aka Nox P\@sNox */ #include "FreshExport.h" #include #include #include class FRESH_EXPORT pGetOpt { public: pGetOpt(); pGetOpt( int offset ); pGetOpt( int argc, char *argv[] ); pGetOpt( const QStringList &a ); QString appName() const { return aname; } // switch (no arguments) void addSwitch( const QString &lname, bool *b ); // options (with arguments, sometimes optional) void addOption( char s, const QString &l, QString *v ); void addVarLengthOption( const QString &l, QStringList *v ); void addRepeatableOption( char s, QStringList *v ); void addRepeatableOption( const QString &l, QStringList *v ); void addOptionalOption( const QString &l, QString *v, const QString &def ); void addOptionalOption( char s, const QString &l, QString *v, const QString &def ); // bare arguments void addArgument( const QString &name, QString *v ); void addOptionalArgument( const QString &name, QString *v ); bool parse( bool untilFirstSwitchOnly ); bool parse() { return parse( false ); } bool isSet( const QString &name ) const; int currentArgument() const { return currArg; } private: enum OptionType { OUnknown, OEnd, OSwitch, OArg1, OOpt, ORepeat, OVarLen }; struct Option; friend struct Option; struct Option { Option( OptionType t = OUnknown, char s = 0, const QString &l = QString::null ) : type( t ), sname( s ), lname( l ), boolValue( 0 ) {} OptionType type; char sname; // short option name (0 if none) QString lname; // long option name (null if none) union { bool *boolValue; QString *stringValue; QStringList *listValue; }; QString def; }; QList
Fresh is a Qt extension library. As an extension library it add usefull \ref FreshCore and \ref FreshGui classes to extend the possibilities offered by the excellent Qt. It runs on any operating system supported by Qt (eg. Windows, UNIX/Linux, MacOS/X). This documentation describes Fresh for Qt 4. Fresh also includes language bindings for Python. These require that PyQt v4 is also installed. This version of Fresh is based on Qt v4.7.1.

Licensing

Fresh is licensed under the GNU Lesser General Public License v3. And allow both closed and open source applications to use it. See the file "LICENSE" to see what license this copy of Fresh is released under.

Installation

As supplied Fresh will be built as a static library and installed in the Qt installation folder. To build Fresh, run:
    qmake fresh.pro
    make
    sudo make install
If you have both Qt v3 and v4 installed then make sure you use the correct version of qmake. Depending on the compiler you are using you may need to run nmake rather than make. Once installed, use it that way in your project:
    CONFIG *= fresh_static
You can replace fresh_static by fresh_shared if you built Fresh in shared mode.

Example Application

The example application provided demonstrate nearly all available classes in Fresh. To build the example, run:
    qmake subdirs.pro
    make
On Windows (and depending on the compiler you are using) you may need to run nmake rather than make.

Python Bindings

Library has Python bindings, which allows you to use it in your Python aplicaton. The Python bindings are in the Python directory. There are next dependencies for Python bindings: - C++ compiler (Ubuntu package g++) - Qt4 library v4.7, headers and tools. (Ubuntu packages qt4-qmake, libqt4-dev) - PyQt4 including development files (Ubuntu packages python-qt4, python-qt4-dev) - SIP (http://www.riverbankcomputing.co.uk/software/sip/download) (Ubuntu package python-sip-dev) The configure, build and install library and bindings
	mkdir build
	cd build
	cmake ..
	make all
	make install
The last command requires root privileges Executing Python example:
	cd examples/python
	python freshexample.py

Qt Designer Plugin (not yet available)

Fresh includes an optional plugin for Qt Designer that allows Fresh widgets to be included in GUI designs just like any other Qt widget. To build the plugin on all platforms, make sure Fresh is installed and then run (as root or administrator):
    qmake designer.pro
    make
    make install
On Windows (and depending on the compiler you are using) you may need to run nmake rather than make. */ ./qwbfsmanager-1.2.1-src/fresh/doc/Doxyfile0000644000175000017520000021066111546156115020113 0ustar pasnoxpasnox# Doxyfile 1.7.1 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = "Fresh Qt Extension Library" # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 1.0.0 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = . # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 4 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this # tag. The format is ext=language, where ext is a file extension, and language # is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, # C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make # doxygen treat .inc files as Fortran files (default is PHP), and .f files as C # (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions # you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen to replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penality. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will rougly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespace are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = YES # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = YES # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = NO # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = NO # If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen # will list include files with double quotes in the documentation # rather than with sharp brackets. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen # will sort the (brief and detailed) documentation of class members so that # constructors and destructors are listed first. If set to NO (the default) # the constructors will appear in the respective orders defined by # SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. # This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO # and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. The create the layout file # that represents doxygen's defaults, run doxygen with the -l option. # You can optionally specify a file name after the option, if omitted # DoxygenLayout.xml will be used as the name of the layout file. LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = README.doc \ ../src # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.d \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.dox \ *.py \ *.f90 \ *.f \ *.vhd \ *.vhdl # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = * # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. # Doxygen will adjust the colors in the stylesheet and background images # according to this color. Hue is specified as an angle on a colorwheel, # see http://en.wikipedia.org/wiki/Hue for more information. # For instance the value 0 represents red, 60 is yellow, 120 is green, # 180 is cyan, 240 is blue, 300 purple, and 360 is red again. # The allowed range is 0 to 359. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of # the colors in the HTML output. For a value of 0 the output will use # grayscales only. A value of 255 will produce the most vivid colors. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to # the luminance component of the colors in the HTML output. Values below # 100 gradually make the output lighter, whereas values above 100 make # the output darker. The value divided by 100 is the actual gamma applied, # so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, # and 100 does not change the gamma. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting # this to NO can help when comparing the output of multiple runs. HTML_TIMESTAMP = YES # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated # that can be used as input for Qt's qhelpgenerator to generate a # Qt Compressed Help (.qch) of the generated HTML documentation. GENERATE_QHP = YES # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = org.monkeystudio.fresh.1.0.0 # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to # add. For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = fresh # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see # # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = fresh # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's # filter section matches. # # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = fresh # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = qhelpgenerator # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files # will be generated, which together with the HTML files, form an Eclipse help # plugin. To install this plugin and make it available under the help contents # menu in Eclipse, the contents of the directory containing the HTML and XML # files needs to be copied into the plugins directory of eclipse. The name of # the directory within the plugins directory should be the same as # the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before # the help appears. GENERATE_ECLIPSEHELP = NO # A unique identifier for the eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have # this name. ECLIPSE_DOC_ID = org.doxygen.Project # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list. USE_INLINE_TREES = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open # links to external symbols imported via tag files in a separate window. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are # not supported properly for IE 6.0, but are supported on all modern browsers. # Note that when changing this option you need to delete any form_*.png files # in the HTML output before the changes have effect. FORMULA_TRANSPARENT = YES # When the SEARCHENGINE tag is enabled doxygen will generate a search box # for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using # HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets # (GENERATE_DOCSET) there is already a search function so this one should # typically be disabled. For large projects the javascript based search engine # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = NO # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a PHP enabled web server instead of at the web client # using Javascript. Doxygen will generate the search PHP script and index # file to put on the web server. The advantage of the server # based approach is that it scales better to large projects and allows # full text search. The disadvances is that it is more difficult to setup # and does not have live searching capabilities. SERVER_BASED_SEARCH = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. # Note that when enabling USE_PDFLATEX this option is only used for # generating bitmaps for formulas in the HTML output, but not in the # Makefile that is written to the output directory. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include # source code with syntax highlighting in the LaTeX output. # Note that which sources are shown also depends on other settings # such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # The DOT_NUM_THREADS specifies the number of dot invocations doxygen is # allowed to run in parallel. When set to 0 (the default) doxygen will # base this on the number of processors available in the system. You can set it # explicitly to a value larger than 0 to get control over the balance # between CPU load and processing speed. DOT_NUM_THREADS = 0 # By default doxygen will write a font called FreeSans.ttf to the output # directory and reference it in all dot files that doxygen generates. This # font does not include all possible unicode characters however, so when you need # these (or just want a differently looking font) you can specify the font name # using DOT_FONTNAME. You need need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = FreeSans.ttf # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES ./qwbfsmanager-1.2.1-src/fresh/functions.pri0000644000175000017520000000637111546156115020365 0ustar pasnoxpasnoxQ_OS = $$lower( $$QMAKE_HOST.os ) Q_OS_BUILD = $$Q_OS win32:Q_OS_BUILD = windows win32:!isEqual( Q_OS, "windows" ):CONFIG *= win32_crossbuild # lupdate/lrelease too buggy ( not full qmake interpreter ), so avoid functions def in this case isEmpty( translations_pass ) { # return the list of directories recursively from a given path ($$1) # Forbidden filters can be given ($$2) defineReplace( getFolders ) { q_paths = $$1 q_filters = $$2 .svn q_folders = for( q_path, q_paths ) { command = "ls -RQ1 \"$$q_path\" | grep \":\" | sed \"s/://g\" | sed \"s/'/\\\\\\'/g\"" mac|win32:command = ls -R1 \"$$q_path\" | grep \":\" | sed \"s/://g\" | sed \"s/\'/\\\\\\\'/g\" | sed \"s/\\(.*\\)/\\\"\\1\\\"/g\" win32:isEqual( Q_OS, windows ):command = "for /D /R \"$$q_path\" %i in (*) do @echo \"%i\"" _q_folders = $$system( $$command ) _q_folders *= $$1 _q_folders = $$replace( _q_folders, "\\\\", "/" ) # loop paths for( q_folder, _q_folders ) { # check filters filtered = false for( q_filter, q_filters ) { result = $$find( q_folder, $$q_filter ) !isEmpty( result ):filtered = true } isEqual( filtered, false ):exists( $$q_folder ) { q_folders *= $$q_folder } } } #message( Getting folders for $$q_paths: $$q_folders ) return( $$q_folders ) } # return relative paths for the given paths ($$1) # according to root path ($$2) # new root path can be given ($$3) # Forbidden filters can be given ($$4) defineReplace( getRelativeFolders ) { q_paths = $$1 q_root_path = $$2 q_new_root_path = $$3 q_filters = $$4 q_folders = $$getFolders( $$q_paths, $$q_filters ) q_folders = $$replace( q_folders, $$q_root_path, $$q_new_root_path ) #message( Getting relative folders for $$q_paths: $$q_folders ) return( $$q_folders ) } # return the project build mode defineReplace( buildMode ) { CONFIG( debug, debug|release ) { return( debug ) } else { return( release ) } } # return the target name ($$1) according to build mode($$2) defineReplace( targetForMode ) { q_target = $$1 q_mode = $$2 isEmpty( q_mode ):q_mode = $$buildMode() isEqual( q_mode, release ) { q_target = $$quote( $$q_target ) } else { unix:q_target = $$quote( $$join( q_target, , , _debug ) ) else:q_target = $$quote( $$join( q_target, , , d ) ) } return( $$q_target ) } # this function set the target name ($$1) according to the build mode ($$2) defineTest( setTarget ) { TARGET = $$targetForMode( $$1, $$2 ) export( TARGET ) } defineTest( setTemporaryDirectories ) { q_build_path = $$1 q_mode = $$buildMode() OBJECTS_DIR = $${q_build_path}/$${q_mode}/$${q_os}/obj UI_DIR = $${q_build_path}/$${q_mode}/$${q_os}/ui MOC_DIR = $${q_build_path}/$${q_mode}/$${q_os}/moc RCC_DIR = $${q_build_path}/$${q_mode}/$${q_os}/rcc export( OBJECTS_DIR ) export( UI_DIR ) export( MOC_DIR ) export( RCC_DIR ) } } else { defineReplace( getFolders ) { } defineReplace( getRelativeFolders ) { } defineReplace( buildMode ) { } defineReplace( targetForMode ) { } defineTest( setTarget ) { } defineTest( setTemporaryDirectories ) { } } ./qwbfsmanager-1.2.1-src/fresh/installs.pri0000644000175000017520000000627311546156115020207 0ustar pasnoxpasnox# Fresh Install Project File !build_pass:!no_fresh_install { mac:universal { UNIVERSAL_TEXT = "(universal)" } FRESH_INSTALL_HEADERS = $$[QT_INSTALL_HEADERS] FRESH_INSTALL_LIBS = $$[QT_INSTALL_LIBS] FRESH_INSTALL_TRANSLATIONS = $$[QT_INSTALL_TRANSLATIONS] FRESH_INSTALL_FEATURES = $$[QMAKE_MKSPECS]/features win32_crossbuild { FRESH_INSTALL_HEADERS = $(QT_WIN32_PATH)/include FRESH_INSTALL_LIBS = $(QT_WIN32_PATH)/lib FRESH_INSTALL_TRANSLATIONS = $(QT_WIN32_PATH)/translations FRESH_INSTALL_FEATURES = $(QT_WIN32_PATH)/mkspecs/features } message( "Configuring Fresh..." ) message( "Build mode: $$FRESH_BUILD_MODE" ) message( "Build type: $$FRESH_BUILD_TYPE $$UNIVERSAL_TEXT" ) message( "Install headers: $$FRESH_INSTALL_HEADERS" ) message( "Install libs: $$FRESH_INSTALL_LIBS" ) message( "Install translations: $$FRESH_INSTALL_TRANSLATIONS" ) message( "You can change the build mode:" ) message( " qmake \"build_mode = release\"" ) message( " qmake \"build_mode = debug\"" ) message( "You can change the build type:" ) message( " qmake \"build_type = static\"" ) message( " qmake \"build_type = shared\"" ) mac:!universal { message( "You can create a universal build:" ) message( " qmake \"CONFIG *= universal\"" ) } message( "Multiple options can be use at same time" ) message( "Configuration complete" ) # core headers fresh_core_headers.path = $$FRESH_INSTALL_HEADERS/FreshCore fresh_core_headers.files = include/FreshCore/* win32:!win32_crossbuild:fresh_core_headers.files *= $$system( for /R src/core %i in (*.h) do @echo %i ) else:fresh_core_headers.files *= $$system( find src/core -name '*.h' ) fresh_core_headers.files = $$replace( fresh_core_headers.files, "\\\\", "/" ) # gui headers fresh_gui_headers.path = $$FRESH_INSTALL_HEADERS/FreshGui fresh_gui_headers.files = include/FreshGui/* win32:!win32_crossbuild:fresh_gui_headers.files *= $$system( for /R src/gui %i in (*.h) do @echo %i ) else:fresh_gui_headers.files *= $$system( find src/gui -name '*.h' ) fresh_gui_headers.files = $$replace( fresh_gui_headers.files, "\\\\", "/" ) # generate fresh.prf # remove old one if needed exists( "fresh.prf" ) { win32:!win32_crossbuild:system( "delete fresh.prf" ) else:system( "rm fresh.prf" ) } # create new one based on build type isEqual( FRESH_BUILD_TYPE, static ) { win32:!win32_crossbuild:system( "copy fresh_static.prf fresh.prf" ) else:system( "cp fresh_static.prf fresh.prf" ) } else { win32:!win32_crossbuild:system( "copy fresh_shared.prf fresh.prf" ) else:system( "cp fresh_shared.prf fresh.prf" ) } # features features.path = $$FRESH_INSTALL_FEATURES features.files = fresh.prf # translations translations.path = $$FRESH_INSTALL_TRANSLATIONS translations.files = translations/*.qm # library target.path = $$FRESH_INSTALL_LIBS INSTALLS = fresh_core_headers fresh_gui_headers features translations target # cmake CMAKE_ROOT = $$system( "cmake --system-information 2> /dev/null | grep CMAKE_ROOT | cut -d ' ' -f 2 | sed s/'\"'/''/g" ) !isEmpty( CMAKE_ROOT ) { CMAKE_PATH = $$CMAKE_ROOT/Modules/ exists( $$CMAKE_PATH ) { cmake.path = $$CMAKE_PATH cmake.files = FindFresh.cmake INSTALLS *= cmake } } } ./qwbfsmanager-1.2.1-src/GPL-20000644000175000017520000004325411410722103015221 0ustar pasnoxpasnox 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. ./qwbfsmanager-1.2.1-src/qwbfs.pro0000644000175000017520000000250711546131113016362 0ustar pasnoxpasnox########################################################################################### ## Created using Monkey Studio v1.8.4.0 (1.8.4.0) ## ## Author : Filipe Azevedo aka Nox P@sNox ## Project : qwbfs ## FileName : qwbfs.pro ## Date : 2010-04-04T11:04:05 ## License : GPL2 ## Comment : Creating using Monkey Studio RAD ## Home Page : http://code.google.com/p/qwbfs ## ########################################################################################### XUPProjectSettings { EDITOR = QMake QT_VERSION = 7.7.0-lgpl OTHERS_PLATFORM_TARGET_RELEASE = bin/qwbfsmanager OTHERS_PLATFORM_TARGET_DEBUG = bin/qwbfs_debug WINDOWS_PLATFORM_TARGET_DEBUG = bin/qwbfsd.exe MAC_PLATFORM_TARGET_RELEASE = bin/QWBFSManager.app } TEMPLATE = subdirs CONFIG *= ordered BUILD_PATH = build include( shared.pri ) win32_crossbuild { exists( "$(QT_WIN32_PATH)/lib/*fresh*" ):CONFIG *= fresh } else { exists( "$$[QT_INSTALL_LIBS]/*fresh*" ):CONFIG *= fresh } fresh { !build_pass:message( "Using system fresh library." ) } else { exists( fresh/fresh.pro ) { SUBDIRS *= fresh !build_pass:message( "Using bundled fresh library." ) } else { !build_pass:error( "Fresh library not found - download from http://bettercodes.org/projects/fresh and uncompress in ROOT/fresh folder." ) } } SUBDIRS *= libwbfs \ qwbfs

ב=Md^Sv_xPȾ7-Z"ق@,e$;*ۏv:lKv~oŠ| ~a*]{}wUu}z BpX%cZtt)0F=*ϛ [n?Bl3 RP@Qpa Z$%''&wr[pޫ+O=&fvdF0_NM^;O·g@:qgtwx/_?p<?7cpyBՕolLkXvW5\rNWl !oe*]G5b.#ꨭ.\hm I[@6Dwt}sۢ9v8:3 5,73 &l ݹ6ya'*` !)}0d]_3;0`܃>Lh L Mӽv6I@k"!A-ߟ胒@TˉhD(t bQK!L 1k/W4M3{n ]ך5UոJ|.'cJϟ{@B.XT6#pcg߽q^BhelFW+Zy9)asK1G m)JP_~OL [,z L0we[=? n׵''s >sn }0nx:t=kbNa@?u|gOd}=N;.=ˌn#mM+\<.S|wDZeeݿǗW`(1G(Lkla#U[dB)? U[I@aJs9aY&L:0tO0auz 0,gL@;o蓺#˙{&cv/\#v ?sRܷQ$,7~gTMgƝIA 7?>zQ?'/HFl0qNAaOsyJ$%ӹm_hd@YVV̱l*ѧe"Z!5DVw}L.L~8C#BB|?<]?|_Q$*"/FLo~mqwxߔVʹ%T# XPR̔_9` a0-pw$ ;rEkEU9spZ0hvzt5~olo~i@9"NzB/M2l)xJ}UI?lO ,ufRIHOΤC(gj }[vlJ׫^EVC{ѿ0~_x>&߻w(p~'|D$>6;߈tXZN[ B)3-8tܤzF5K-`%J`6Ub qu4"jDRE2A,JF*P UPU B ( `a kyP __s8ql @50ӀC/kx]h}j# =yo+Nݾ)ߨZ4H<z)pۆ~E2iC,Ԋ$=uιYZ&&$^Jf*+R.Jb*|M[ZĦJK 4 * *:uB0840Q2hjBS $1qtcddbM""#THH&b*Q 5@S)R܎Qsh؝ys/?U?ˆc<}$v0Ԁ4 Mؗ IDATߨ߁JOGݦE}$٧c쭑xgKi(1fvkZ' BVM%jp/Zdv+&g񙙵jVɩ5kv :؅hTCGf!ZDKL!`QձV(XX~zf JQ -ptEJ)H"UbJ(B p~tЇ?!`54,h1צ ~oyKnmE idrUc&"^+wvup{4[F=͍6I a+o*§E_ 3/kGQULgZaY:\@iR`R1R>f!Q(y|q%}Br%^qN0wG .zqX-!,Kס 7up k"5~U* X}esSxmzϿzΩΝO7\WtHTATP'ŝn[Yqh@38+X";ޕ>@\ H-@\07#L2=O+)9eD#M nۈkP'b\#,_W՚EKEC+ my| -.}jjz82btb!0P0U+J8#HEtHT(I$4.7B BP(k0Lrb ġ$:wREpP< &cWՃ0E+tZC""!4N j?&? |%:{j[g': z_@j(-dj~rsxU!8᷾ Q2~Iýgt̍S%b}k|]gZ1BQ~aOwbK(J[1q`cXf@uiƅ tdUcCښ–d2 Qb1 ш|O8BdJt z@VJ : VY 4ݍw~=J˧1 $}4|חn"ٶ&\\ #>7 岩#bSk}o04=֫tuE|/zn?X(_Au w$pz0m $itR6Cˁ#+Fq 3`qp,,ԙz NC|yN矟ānlۚDwwx\6v~7PEcÀ QOUb ~(̎u1Y.6ڠI&!^jCCA$BTzbCBLXEEC[XGLӧNԵ蠺S w]`4,pˀGqH T:8 4A F;n3M xQ`e7N^o W1 S|X|IBWVE6IwB_D:Pc; ` $mvaq:E@tƳP\b63,LY[5[ԏ>ϽCȎ_9Nŋщ#ۏ,"A_w:\l Ph";x}V&G(Бߊ{ŕ+xxcS= V?g~$N6#w;rM A2M*‘?4!6褖F@}.3pҜi͌C(\?&kE` ol |&&LzEWBR楗xcz'RG>aR,* (=?c}b@y;( !aT?;q}U<<O`Gs;1&Ξbۓf*" jw/jHEbi :vdq!!+J3-YVb92P5h21&b4B[A$ULX\z"h}!cz4?Xӿx[p@'uIi@S@wԃ̀!J2*߰8b@o$^X]l ŒEH \p%"/w?ηџPt dg0qJSONX?ly}X}YHށlW:Pj}}]sˏE%@#I7X2}N:qI$wކ=_؋o%/.Ļ0>GwVCS',~ߟ|=  sOv=oP*8<[Вsq5~:'Fb hrn`۝u '- 6"E)2Qt*jbs?q&GbN,q#X?8@lcLm}N@]᳖)gۙ Ťair۷ nb-]c&T|މߞC' Y}Nb~AG3oe1,n3 J"0VwOxOPE#$TQA^L](p\u{@ÿ^4 7/W1%ӹr~۽QZžQpf+pHLH {sCi~ ;ltU)=hGq:J:sog?v\Qqi3HaacLv>s[#Ijw@Ih~7QL { VTG$TZ AT5kk+d(\Qܿq+@!@G6?%p(VE|~MA*GdZN_FLt:XΙEkygDp&3:"Tҙ3/A28̠mF;S)cI sGoO_E~|CݗE4%#0Mos#!u#iȨ0ٶt +s1[50*e``d|^ϣ^"O:-򤁕5 b6_US{OYWR"ܪs_ҷT=<h?=.e6qO)h'Lհ3QʯIʹ+]t~Bf R;aNYZ,}{h>po?@!eE&;CizDotS>9JH-L9(_ ~qvѴ,)4,L[^ tL5`yAL>0Z2j]_)_|Ea׮X˛?sI{e;n;wzr2 'nVΎo^P&/⡇BFQLHB16sC۠2!I;Dy5W3Y{@mLٴrlFh(|(L`ply>{zX % DlBpX( LsޕyU[|²R)/S +J &ě~Bu}%pT~3;ϕ"G.'ƽ7@آ?>f5#*+Sb\X>Z)eL |A!>aEa* %wF?*͜|{/Ǘ/U(:dz~fR5܂X*Z5~~xw|1ٮ[@:.Q tgern 6bn%p"72w{CbW٬U" i U%fj;-%C`YA.m( } ' =~B| z/}_oI&sy&z2WNcFt!K;nHj$nkۓ.eqwՄ# pVSU-+jLV~c:{QQ7OBL,jDF^'L/!1KϽ؆\ A;k:n< ཝioP)Л4@6˿39,4Z FB_&*:phOwv IOz^6[w0Z]w[Gyqc{+=]좎b4BUpCp jfǞ;ze * )T{Od~~9%x>JA0^{EP#;>|~~Ǜw9eء3|zMC]>>j"Dw{hen[1AS&V8r J -pnn5*IUSL]Vjl1qZ8X}V_Yġ;@ ` `19,&1!`q.rirt0j2nް^>zV `H10g{Q@s0Ӓe  {'ȵSn~yWNԱdّғ*4/._C #L| %fYR~8F7C쑕YCd(Xq'Ա58# b65ԖYU{0_2xPjOdZ_F)nr:Q=7Z\K=u }{o}S5}88U3oU1OMsO/a@ؾs`t ^Z[!H)%pr8T@7{Veas1Agw ^>ayqsۨxƘ@: ;Bénvoesjf²l` TL܉ ~Grxx+  CO<blR:Z$ ^)sti{O$W=pvn$;;Y?(@!\;93gR*Hw%ɹۻw/Xzm^vA9}Z@PeM steE\^|qe;>IH?| U ~n 0Kr2TLaZrtKSdm 6IqòYpبT:?>[>8qSQd;#APUdr"Tw~Uy;˝7[ӠxP ܨrՂ}Wa|-]hE r~D|Ўs'@AHgIT*27_O9[>yr~tG?8~wa3f8xθ)s|3Z}cP ^l<XilB#Ocޭx n^`d }V)=8~ٽbuw ~BC|=:MPp(Nut G]Cs1mn䭜3&QHF,bk Fcg0#ՉzՔ ~9,>gY8Ȧ 4PtI;, JPPA DC۶aVũo:Ʒt0su4Hz3ğ>?ytu~Ho#ZIW~_[~ܫv|BF!v*jUWmf! Hж{f//{ϝ/7! mI34Jl`t{6o\AU,,Sg}/ ti cwL^5or0òCWB˲ʯ&0"a=e휷Y5n8BR ν;SH~/zލ/=k`W^D  lR*‰$@5]7׍?j D/ߎW'?ul߾kʺ{p{Blv,ZDaC<=v=ǿ5N3_ի5ͺ.i`-|fj,tآ g``D`,ӂaoa4,AʒsF**|87Ya&3*76]qY,Ӵ`,BZG:ۍ$SWè W^ciB@h) VWdI]߾(b<U =p ?sTq A@0`(HAJn'(D9~fҙ\~yn8p9(GvE3?\\k !务,.բ'O{ff=;>X@P5CZ ˔/iX{$g}1,yi_1>[_c;}fڿiZ0Mz]؎mW$sxmS,,)2% ..2zu Z\=.:##87!MNVGw׫D@pݰ..Wp!сlukDc7r*{_4#6jqs/M_8PZ[۲{JUXjzܾJØ{i00~f2pɰzm] ꢎr#k6-ZXfƶY_QݜpAD =޻SO7ȥWғ(ܶ Hk8%ZDۧvc7gQn67?(4)v8|qv09]f;BSYXt?RA zݐ~~-Ô~mH t}ou7D]c`bgh%lTvqN=e0, d:FP;z7^2қ"AG"GuC )^灠yҕGxF~y s`@gw# ?]O率 ~@%-. i\(3FIm~[S}I+);eZ$QyױJ~gڙLdGnhg4o&-,ua|աذ̿>N0.$M #؟Mɑ?tIk7k`㉗Km"zPMEp6L ̵x#'ו$zO= H(!]0xau@FR2` ~4[Gs.]'TKZYGEg`1x= Lnw?µ vo8r@=-m-嗮VFW''\wd!*.`蜮KWjkkYJauCߴ\2LwR 9.܈kxٿ -[05WGT#2DvmUy!ܩFE-X|CD q"jLS=p7.4+i;m`t~_<*KOo&& ~FNԜ "(; "\¹Ѳ};2#f]="]87 Aѫѫjfu̕S#j"ձHw3=[V8ՙjD//j05L:80m&`) ]_[ph5+*gVR rmж6 Zqݕ821եEN,=8K*Q-O2x D%}?/"DnzC< 1-XOhY+z- 8Up==/W-Wf/b+z@Cd`"ՕOP\,-d +;毞K0Jq"M\X:rO\HtvV0FWZt#1]cf# `4!lZwVuK:qY&f߬m1&˄=?( r}=NHOlsnjqp: _ZWΊo~_㗗81+,͜gh^D ݑҫP$@K|?շ/!煀ߡX*Zq-w!s=^d@D6~:|loR5ٴğul ŕZQ\RB2۷aիvٲ<ߖڬ1xa\dw$`?5S9 {W s.Nb_~Qk~@fX%U-ѫL$80L`qzK{wIa״vB-KRfgٹJ" +_6no&iu%sCCF}'t7fCwW5 01`wٴ  ubnE@D#x])FMeQHd:4m|+;'z42|rjý~j-9V'g.l j$˨y:eFQ?Q;wR)D 7χ@ S#40tx<<+s'G/fG`ęYE<cZѕzT5[; t2a, \>i.Ю Žk-xy 21R h秛-o𭮑|q!b h#{X9q|!XKQoEGr`lzw- UMk(}? ΁his~>cZ a3Owٟx6v\=˻ʅ\ߖE-J \FNbPXLZr9ݱu$,ɸJj&L[0uuo.gj6ah'Ro/AHCUC"DeaIvt U#K5jHc/{j뮽_=# Tii[ 4<$w|")끟o _OkyL 2d8B#02 %j12'gWf/ dsgSˡM 愠 RX򊙘_,u5Y ՝^a2 DvDcou͘vGV V  x^Rpm7UhFHVBUO]5fy݌^,_'n;5PA /os~-я Jv#( aN,Y²BUE/ӳ=Ou'^_|Kau>=8q6M`˖:=S(EzbnW B LG`8?oa|+o&]v=5PV`:2{oA EzqRx q.8[2p|עė- MK~~ \R%!n5"Eim 8bFXRa:0Zl3]/^\Y>^~H#7=<0vB+b$yj];w<J3LXf5"7Ѹo@=Fz }hoEȅI!EӠ*бmd A9mrԀވ >S k< S/ax~(Z ̪o*@o = n C*+ws%bXLe}kwk#7/]Y]z j"5={7l005 ZA V~] @r}+ IdbzV.!CYCUU4m.V,wVW6WګųuYE],^Fc:=V(,Ck*׫ ׅ~|3/fSY>O5[<˝ŝ?8~zdH zJ|Ձ6Eyrd"2TFkuM"%* Ļ.~g]Ny"IgI&LcjliLwh܆VmmM\]f׆*.,Urݜwܱ\?=^bysӵ<}hahCKẍzf\HʒQZ[#ڱtzZObGA]`Vf@ܱޅʣD&@X)~)" Q{ Brj ,?/+_ 1JiA5*+#Q"Y°lhֲcҵunsH)]d`LcjĹ2|%_z%I$xlx6KJo5F#~uN$$y{$gI)ȘA{{Œ@޷GO~ HÿP0NXk`/h~4Q~_j)~=Im0>E%v)FDh`yMsI126Ձ➡v k0F>c<nyPCo= \7Lo?d1֯# n?w# .TVD0Ho8& 0"[Ȁ7p=u艻w{n&Y'*] A.\}.=c۩7Y^8F=-Mqt: -"V<1RA@mfD 7 T!EaW*P n$G}E.~J{}?TK2>d vuc ȟyIks~ߊʻK(A[7AD>98tE n^%ro+b&f[cmYg1DG~{M`,+kCO'$:y'(UV>S#àXg~WW f幓$QϨFl Ƹ6H!@+zB6Soj(݀Pt?>i>] J[P @tXrdPw+_/+HjugҚT" ~o֊n'cb^@(;|@b>)=a~F~zjkr}+.è]_: a:>m(՞1 *нccG 6U 3?۵z\<,nE:jԗБ o]( (t5]yajijI틬-%_o<*dMS~9rMYXBڤ6>EwNuzmHѹcW:Y T{~j-ܕ.!(7گyrXڇˣ<0nzmPDd!X tz?ჟnkJRku]d%+=@hB %5pǺ bidІ\ڱ1- [2.@oJI9x{)_;IRi YZ` RD'x'lQ!"1pX;ѝd5DTG$-Qm6N!:pժQq~G]Ff?J)ؙ*t茼;P5$:!ZsVل(᱀wp>_ol0^|oAS^EVH&ߖ낿JFqJ-!mؘI[!ﭡLPOa|+}{?mOu1QAA:o+Ц51kmzl-6}(FDc'AxS_gsVO%mIADstok#xWD"ek8%L,1DRFH#^W BpooO`S$Gok4Z~:C 2yڠ3=}\1p|%2IIJ`ӫB^ _W~>yDQ4*,Er??#oT֖j%D1H+O(`$ ,}]*iN* UCcкV]zSVX9ucՌLZ)R\D}]F6WXwgun Uve36ڀb#ȴH"e, $$ @{_Ÿ=z[qrJo> C x 2kо ! 2LhσQC,:/cɣd^T+dHBV矃=HpX{3hȱ.׺t;W,ͳvFb  |Xj:'GVqG3+ % zKqIMq9_tz@Cgmuɯ7l{/YĤM/Ɏo-s,%i=bryUG B7\($pJ0rZ[ђ4 ŕbٻ^A^N k3wŨD7ʪ57UEU.W񵏑umG\CaÐu{ߕr5;&!f=fvK2yMm &r}AFflE>/.En_l ЗUZ!/*@su }rOfì{h /!U{2F%dkt3EDZTpe\c?שּׂ Dcn[' 0eL VUK0. 8NSut/gIS-Zt/J%RzЊº5ŕuB,w߈kTZX{Oρls'<ؼ` a_>06GU1D}Um7 )Zբ}.amj着@O?\{n׻~0uC({ڎ &[4˜Sh6Hu|[f)Qr/ 0hC5K_@B>ЫղCJ_=P0kJ5nyUVR0\g־թQbT2JUy$qұ 8,\ xd fv6Ϝȁcryd,K? ?FVqm_)bYƾ|I"M$[jL#mIfTQt~눨F)ݩ6p ;b0&NI9%jda>V!r;RU D\g߳sϲӒl.M $Q-fiG e^i|B xWsڇz+DqZŀV8USmR !mt+fm=u~y$i15{ G+Esv ER$DI(iPQ1C] UUJAj{qZs ?tQV_OjM~ZAҵרOO[@g~ nja!'3G?rϿ?{j[|,s/E˱~j -稸%4Mqqc['"AĩU^^ utj3$`}hQx Ta.Õ,{Їr?^b`ǫ2* :{=k>Ή_B]~3P[4@JMs{>LkIӶؓJbD1+)G+@VmЅ<Z׫z""u5puI@C>1:~TwUwIktrţG=3/< b !4WYh:dAg0L!p_NȴLoiB$41,2Mmk@>:$g./g~b6Ͳrr_/A`Ґƒ٩=NpnT6^(D%M}>UY * %>(E@PTa /a0J U5MIf؎ ۶]38~j _[hk쏯,]?vc XQAU_~ˈg0C. JGðCd:5WC& iMڱY\Zq,#$5 g?{_WΜX}ۓU/6h vn•Xo彵EsuhIi5${i1H8oӘqxk-Z0;~U+6J5 &bT*BT#|PÒuWzu"JqQ^hlBH߿c0@,#D>_R$qSsOu]_c> Ix#h? \y}eqnQtM6@z=bۖ{LrᧉSΩ ~b_(NI1=#aԿU7v n ֿC?Z(32rFH07lڪ:c-s~zqc9J4lPW')gn66.{2E%U.ǧoTV!+D|em`ж]sj2)"&nyG?< /`8w tйGuGҜ:γVHwR_D ?^KVFa1-"r˂".ׄ"8{>Eڳ_gñ`o %5Fmb]8t<RՃ5c}FQ\_V\/xBhm T2=p-O#O1w$ͩ1[]]:UI}9T:GJh#fR>{3:[fhLQ(NZ#m@_ 6&\/ cIJ+UuhT'Ȑ*> @WI@H[Rh2g;yճeo]g~YK|Wg~_~,\8C,?x_\1Y~WW~t>qr>Iy-?ql϶TStY PvX I Sc]b -{gr6>LmA0X}!JahJ@TWP8y$Gj CweHoh!M@BJZ(mU:5Zjsi~c̷ \쿰$ ItAE` ~~)UtD_`. oK%MY7P <D0ъٱ5oأOsclyĘ(72S-l5*VRcX^@p0b(pҫV~aXRTq;9 ,V7rQ\evpGY6ĭԆU2pnߥw_N}0P::ɸNT+- zҞZToC g0;^3Kkfq N5\n2>\7{TO7!a"5 ~AQ'a$8"HX^82x6fӵV5Q[ڻ~Zr1$ED0xĐJ!X|}?TH)鹿MժRkjI0_mJ0(C_ҏƝ+m@A-LKm{y?ORSleW)s6HS'q \]X3ˡ;grvc%H8%e;U)Gi Yk՜뤭[n<^zKƘG CT@(KzK&4rھ?q9"r?hhNߗI xBV]277p CleQP@uƬ %iNc\=/;ׯXё`+RFw 5049R%*:qUhm9uNƶOrKwzax_֟eeHy)lxuen?C~*뵹?JR@.z/'T ߬p dr?Z%GC w kLvW M_ k-S1Iy3|! T@PjկO 5e,Y|zpuї_gj8II\k{bqsCyGHh0p1?/>DU`?q쏿_S?K=/,} #ߩ7Vm.>vFBegw'Wy>~_'x)+Ii4ǂ&KNWyO>nقID&Icv+w ,ްj _+G sJ[EoMTdkg?TfKcNB_+aP\V~wOٙ9 $ },-?]HߢCc WaBqO/Q.w[{+}yv1i [՚ƦiLl $jP/Y@o uwLb]S@%N-uJv ĉ#"2F`A}o(}y%G08?ʏyߙS׽2>{-"e_ Oy)W?I@ +<~hLx.' W4lPK{+|, ݴ۾-8_Z;ٻ5BҜڊъ2K(YJ8FJszp 4CIT6kJ.c[_s-;'yckK?ﶷ~=}?2J*7 >ϙs Myyl-{=y lզʂ ?І(mo1i1{{utW3-@!j ٝΟ!Ƀ[˱B(BI)q%ʙŮ!(fW_{Y"W+>^X\ӜW<\߽7w.;Mwe׶SMy!uY[@wyųh@@GQDEHE}릹8 @C*Pj7r(5X۶1ߟ45۞?NkIJ\zퟱ9bQKx>g5ʳ1ycXޣ?wBx5)Œ@J?lƿ[~pznny_5} ZPyΦAow,gŞG շ>t};\~perqqYsh/7okyzmTqJT֣^p Wk%|D%z(J|zaDqBs>!=kn#4\}'b9k\k4puDA T-}௾wobk>@6hTc}ʢ@0._*}"?(M[%n! +S w?˼sG;y6:z=KYe6 tVlX<"sI Cv{f`@D> ؘOI6/JSZ?NkDqBcŮ\Gc" ^xZZa8tP͔T~Rkhn黁0?x9WWe)/o YKg-zY͟?iܣ+śwsDF݂g=tfw,r@-"*\w_~<nAD6?i4?!~ƐWoJI5ݮ’ki>y*wX:X3z^uQ=Gy*ΚQd~7KUw 0?GY ~$q84[κĪF~#1k]oA'93iF/m`Yv>*_B5 )IORvm/=hjv-;15wƍ̣Oʇ}<`K6Qr}/෮8ئArepvIo'j ="?x'WѪg;PYNy,]Yz|`T@ )0|eYF iݵL7OJj֨FDfwYȃ <™zc췵3>3aW `se[Pdx;5;wv^&^7=;pz /߁|( J/?w\  >~=!jc}lQFu{=U .ݕEKhĞ $8Wq(y9GibZ~;$PC)q=asle ?-<[7γRG\>C^%K+R[*9{LPڃO-bZ)2}zWe$0&Qv5%3'N|5t-rEz]nuȬX5uULk\]H_W PT @,?r*:UM&Q Q"B88/ ИLCg䷴R  )  ¾s͞V^:nr\w»60 PЃ:CanW*N9n @i^XZӜYg_xJ|rY>8{F&Q9  %GYgy,GD#Юi2N%$aroAhK|H&wI)?bzR+uZ6zW ŔN"c]`۩5-xUF2M`ݗ^Z*;4W̕_PF fN8>_=ǟYe˫*@*a PH 1&0DRJ !axЧ|YOo+'w7X.X!HD[8Aʘt-s]?sZ+U,1rXjVA7Z;ZLmobCyx&qicV0'QN?JexK7^η~vݾe[$iMМњޚ!5ūUƐ*,("/Hk0=I *+Z)-X)r.v W">'ךlwvv|=q-abL|G]bh4YJBHwDd8_xYM vW,fN$&kLhќ.9~>O]B>&7k264hU/\aP%"7w\{'gf`3qj uT5AڑbˎJl?{8Vp`]q*zP&+(WhYMFgTNuʠ`q}97Tvs77nwM\wL͢ ,YFjRHZ"HzD}~s><ּO ~[rm}7gXj:RxBsKd J3Gϱt.q~Z5ZϧW wH:aP SqsH09qw\{ֶ}B[DQ Ƙ۪fEeW`ӃMzU#u;kC+E/kn{Y./j83O}Ƀ+'9-N јQ;'-9{NoTk5[wmڛg {:CCg .v.Ha&꒱ZDD8@xADPN JizaU,+f@/'k'Rj 0g9}^xϝ`$E""5Q0O_%Rg 5UB ߓ@q(q Mؾs1blbj_$cl"@&m^,[Y]^<ӏ"G;ڈۮH)#,wпc_WW-0|u^NqMƴa|bf_ĖRٜjɸ>N\QS}6[b4[vlevSfIkuZJThY̐g[ߥVhcIIKD}NN讵Y87pˋzmqy1)㧥OKfEn#߭ROg$@ y,w^^&&?3[Ӻ IEmwcpܦBj9TUr\ v︐}/E/4 ? }?vwB NԯӴ [cN0fR 62 2uLbQz2L,d<,0=B̸-+n Y,)s<+#J~7xbx-//yXP{6XsC tP#dab[^Cf-н_ugfF6,$lff,ėI>!cvë,ʿ&pR al%4& G;+hW87r_P5"XHƓ7"/U.M>Q}xX|+R4Dze{ 5kwkM0%]XQg{AQHldf6$ 1%3,0HΈܓ4*MYuD \9M4i)it({X{0q4cQ$2v/G??͒;Tv+lPTgRI Xh fSw&VyM.xqu/ :ⰰG+?=4ZRz'F׽;7Ǩt;MfbRrB1>GC.oASJΤqkIENDB`./qwbfsmanager-1.2.1-src/qwbfs/resources/256/properties.png0000644000175000017520000013325011404701453023073 0ustar pasnoxpasnoxPNG  IHDR\rf IDATxw|\uݧ`f *+$$Rj.ے$N|S$彛ͽK';%!ے*EV,ER%[, v$08LIT?~9m9sok-t(2է0 Bޮ7BB`&P!D"]UURJ(d2Bǹ+rr;Wu =UEA]& @qUȭ(:%< 7\TVw?xq]wrEqOQr.?Xt Ͼq$`Z+"PkߚfDZLg9OccMȱg `c¬O={1?s\]w~/utu>2^'t>8WI5soG2wLy> ~|&O[m8t<#Ǝy`qK+wMW_{Z >m5zcy{w9}Q>8 g>-_I$IeK߾SO"mlB!7 #DhaTVVpPMӨ _2 ͂E&f1Mq  9Ewp?|As&4MҩdzGo6j|L5t](]B;!Z AjkkJ @U5"Sp,{H@:){6C8Tx~^o"L%ljB!V5&JKK+sFcۮJYt/(-) xn)R)T ت(5Y#Ra[6ebYlG[[x7vtuvc41D0S `2} $vEP6,_QYY˶m)ۜN sYJI6RJ@XӲ@GEy@Q0lƲ,eI*&HJ%y'b?/򄩁"H;OX"6>6̛cۘm9^}-2`dD]!]wb`` \ny(p0+\T2ѣGwܱs QB>&fLE TE#h".e[v]FY͹[,LQm:{jġW L:>я݀'|yD2a4`0t,\O?kNJl`4,ni>X80ͻ= 7UTXt\z J24a]^Q]Fl#wd}H!B"YQnd> 1qϙ)1rQ|b-OvZB%`Y,tT2I*G?ܱ=Gb`(41( V^M}}T ˲z?Er^_VD幟 ᗸnӜ9sx<*h{TU7`{gWuuw,B{@ @*PC7A7;o<\ګOl~ekSSL? lBSSSWӶh1Lk;gkK `Ö [&uSUTcGM:F5t]GQ~K1"G?ow+'G(apJ+K]׬]]xɗZ}ݻvm跅#0ڗ-[FW HYޗ~-} y?ۊ7 P:=ݧ9z('N!u]8νL31j믿oZڼ vee޻]&tT*՞7x'7}s%L/TVVF*,]J*"ɖksRC/r)([VTUum@,'P=/MߪifлU5mԆ> WӶO~3gY/ e"7 #Q8ZMO=}xcڨt12rKCC#]:n #GX}5QHQU%5xm 5TQQ,`r3u7ٟ=33~?_:0@w_tqoTx˵ZNAO@Q`dy`E^߱};>-b>f:LcliZ7ހao͡c/اȽJ!OZ 4]G:DZ9v(:'NGiz!A(pPliۢ;W^ru%UU0^:lr?X,Dgfÿީ>`KSBn&TM]3j+F^_ sA3'H$8L7y}7'OBT4Ms s pA홟_19$:i-[5G1Xœ# (t$c,\ġsLOom]ݹ_v;suT (8tY) &?iTUU| 9&P&k&φOl> $r-Az{{q4^# O<]QK9,Z(ձ`locٶmv$Ik:ݹ z7`3? Tdw~:{B",5ߏѣGujla%+׭zKu".|p횵ӆ>Ǯ;=g2:@ [oVs%8D Y,6–\,XΗ߼'麎@p==݋eYn(.9Ng0s"\<`zCEI~vO=vUUvGRehƲ+ >}<.}0ظqʾ3o/te`)~Oٵk'Zpx] \̏,]|SKk =E2@NN*Bht$LMXjUֶ];&S ';/Q`,;W<lAQ̌Yܢ/j#%ps?;.j_7ؗSr@q8qkPgAJ4]*|׻o0jБ=_>{N'F y{ C$ 4MR-UEQUTEV5lk~rWJb`۶aXT w7;^d2`s?Gri$sUUUUA @`0HEEHH$[䳟c<.x3~Fi M,׷ M5ttL-S=w8ː>{ >f'~6+BHk =n믿~~+R~4?' FzkJ:ހaJrʻstM%K焧7t#e<>+ HgÕW^I9kaMXaYؖm˶'il-=0LϤmY߷](hll---Si7s±ؤ(*&xutuwܶmL۲A#%"Z`k  TWM4wCY~nfR"X]vmBUUs_ 7 Wx 7*|Kٷ۶l'ñ }\u,[l}"G*ׯnA::w|6/Ydӂ qTA(& iڰV oB)1tt:%^i3\B8g8 87556l,a躧\ؖx 2m16Wв-LITG>O#LHeF**BA6Ŵv&xqM<1MM *E~ P* }sHDm]Jǃ6~>?g3 !kˮBjq @Tѽ|d$j8ed~6ǎsVgr/|?Q=_lm ] J}L{^sb1+A@''+nEhIȑE;"ȨmTUŏaTqiH%(e[b1Y_Cr!:uCmZE8L {޲o/q׬:71utws`>@l&aXm.*w"/"=Kz4]Gl,?Y'fz%X]p'IDϻn7V/wOq@D450͋& <2p`fwyKǁ[ڸuҥamSQQ1jt:M^55 HL$ 뮻_yyOc %w^eeaY3[8E$66xAm֯_yl6 ҂n~\)%݀\1!ࣣsGGWg۞={666A@,N}CCѲ2eH~ѐE`MMcXU|TuZT@u,= }z4MEr>e}2BED*#^3wWRʮ80ࣣsW>m'~mE !*g3Ytjj< ]4$0v`}4FAUUA orO+-ؘd [`xjK- ~(%M7JSK -HR( tܤ 6)- 1tc$Hʪj@aNVxgZLB Lx_n< ݋ kE|(/VḼP(tPb s]h YhفmV~b[6Q66w %l4p$j^pr$y_L@Dm;XIKpZ#< If; <(֮]Ν{Qо` >"-蹖V(۱s݂c`[6\sNR:>Wn*tݍ9W (J&E"7FLR$^ @A) pѐ@ڻ` k+m v|)0v0-3-8.A04[P+#( wԉO(#W8@0 ["|2HB3Q Z[;B aۺWPw|trz_r;˶K7w.imm) " zID#+T`MuG93Gӎ`%ࡈ^}vG)0Yw T3L64}йBӴ|"k{]sIBU,D^3nt*E*l8Fu7WCQ4d&^( M- šfUU8VmtA˴5mXrH7;pe466K2&#sCwG3t,qښ #HzoH XW^aΝ=|T*eZy%pQ)+b嫦RiF]]WL#%uiR^0@8FFs4MUu#CLA3H(RV@ss TJ`؏b&+P+@JIEEńt<@hM pE{M9Wm.[J] GP`h(^ܝ7j`}_``6Nut4%q볕%z&4Gi2]5 TVU {3w.{z3~8\s͵<Ӥ)‘pu/3! Jz/?BrIr & 3`t%I-$pE{;D"gjiBFE(#| IDATB#mKаkhmY$I(XolhCC zzzFj<)Q1R ޹#Gcњ!& fNL`HtyO~p ~f9F4̟_ϰ}ֻXE" ӛdX7(qhFKssѣ;(b<% 0%oiniBTiZp)rJ@7WW^qvOvUU/xsAS_2_e_mLO\ A]7;mb^mJՍ%DUinjv8pСX*6Jx+lni"*"?`pi$0%p8?х?/wmTUa%ry{;?n,\۾mQJ\Rm\*oFOw7;%H *@ᅮ)b!(C"V*B(Auۛh5kxuzV TVoطox{o6W^G/@v~{8x"m8M-C;VlD+% himXE'a_~9/<={F#} ẕtle?\eI /G$\*t&iGQ‘e$%sVaqL:͙^ 7PQQA&FQUү$pI:㙧oam{D|(Ň `Y0UUAee%inmCUU8U ,f~ٲWZK/D^jjZ`wT:EC[?@) ?xOeK;Hr9'j3HFpLUY%flPMd޽9r۷̙;߂iZ=r8gt8$S)L3a(JMM x, kfvB|(gԥ*s/gρ8,hZHt_ Ϝ:Z UUVQ]]Pc=ݛ>go@ t?PJV@gpDp}d鼳巒**iƞ=<3ϰ|rկRS[rFuh4J  HxC|%^kFCqwuIWg'PG ZSCeem1uڎe^ƫ 555TVwWӵ~'-e@!F&PH1mH`ٶmTDQ_U).)L={O?'UʉDJ~[74py dp$¢%KjZt]'s`߾z V hjjbo_AJq`>Qb~rZ;ͩ=FfPw}|͛7_\5y40^8sc) UxJ0t}?϶ml֍n+ B(Aq~_QSu}cAG)B;{leض؎aXh_Am]X?'O䉓ۿyGF*s R)p W6B K 8qDHxˋ UU,4tMՓd8ux* PUF!e.[75*ȓVR)ʒ@iQiFS֚ \r Er߇DdtuvQW_綴~ SJ?'JaBقx \~74y]P! ;oՀ9sP]UE"|b6-B 0cSf2$P蚵,GCiD `7lꪫB6AUUVW{6њ(x'ŋ(477Ql6K2qi-_Ukע*!? P:J-^̡˪ p|b2۶Yd oVT(]:im C>0(X?t E(TTVU nQȂiS`pgh|ܼu-79cpQzI:zu|ӟ"tm! hbn&jk`w)ҩ55TWWpSC;:]~wAiBx+#bYV(_}f VZ[|).E3#&nG'mfiTEt՚<4>Ս~J蠦&pÍIEX鰨 Ec}7($ i]< <Ӂ&-jD?B0X P ǎs۠|Q: }<ZZZE*1MANUdxaL!e8ʫ0o|8Gɩ>"UUE$̙3 ae(Bܣk}sO 0I kжhQ %H/|}TE)WRx JTK}a*@\z.]J&!HH͢*Wƛo ߿(o@SU>_ &B  d3N@y\*Q0vQ@t9JΜ9fd)?a>s5VJ@Jn` X-HGr!;J2$L8SSSv.2,7080H2yGn8/@?ƙ=nbA`F(ÑMM:x((=>szf `d'm܁P&^s'6x+T!^Er~U>})%O=+WlE;Św;]n?؏n-뗿L6EtXt q>RT+?O"kq_Y2>yL&]-*ORjp)٬9T,Iʑ@N L Z[[Z7]8,v,&>*`KʘTwM7ԓOQЈ8ć"!BΜ9C2d|3fhBl6CC/p'_Nw>Bc3G`Ύa$Ph,Z\p^$;/]  fH73|,1B26? d$)zzz8Ukp7r*Ț&Hh4d2Uq-4 2 >^UUU*BQ06(l!H =F}]2J)ꎔU:Q9xe@#0m__<ӟ/ϢH3˿wm[,dgz-[y;o5\}k֭'[c&t˴XشիWDUlr(@CUd`pl&C*ƶRɄS) B(9/qK(JKq!vHg,?HPnKc&I`3tv(QPos ׅ:UE=H2 ={/{/DSS3˖-%R#??'088HS8+VP[[OQ-`$GOI[9 Ѫn4ilІ' ,no0Wf  =s_z5&],%EY1* xj %ӹy-PQ"Fe a;;vۖtpPoYվ?zO IǴSEc>RхӃBec6=S1~!ĴO.%Gy$O~!]]?FDAh3'x%d6tfX*usr?w{.VIz?}-}$S(p)\7^B_ A oSO=ɱDZ-{D/5s,L ʐ@a/%10$P>U7TU# ̬& P #4E T4K D{75,Gݳlu!e/7;IhKP+TjΜ9ͳ?7xt&Uf! '%C *JZR@Uc  |P=ٯ"!*MG Xı,|'D | (zG@Ң6ɝ]Qɺjaw:LF?0X:H)HMxg%qa.f `bQDHXʌ9O~E5B:B(Etb mboIkMGje@EU%*C TR\2ߠ6ȩDəH騣B;2M->QN}]'NgO=bn//Yf `1rB%K5Y%nM=~?AW_UUP5DFJPuˢq j = @G D9( iSU8y>ʐKRQ @2 {툼+Am40h;gY1o.s1H 1ӧYv饴ǯ^}x*o;6 WLCU`;VQ04JPH'(-@86?qN@bןD'=p!^{vJ&m!S :ZM(ƶm,H#c==ؽ8PS]MO?0/Ϫ<%*C[8CU*MՒ&SR-؇toM%EYdɰ42J$Hk^nVG 3'ݛX?}"oGb>o/RCC$q +=Žkn$( TT]8 IDATw@\l?wĶ˴R"-潋ίLE f `OYС| KA;OqίuTj:g]zq+ !̃]?u '#30@r`XА[Sr%Ĥt+ϺAKQa͕BaID׼Z{Q2g1AZ[#jׄY ,L$ű Edɲe#ȕIր>V&xX'O1>3Cd:~ܕ}}8H uI4`6bhLM/-_ւE07)!ؐI&[ ,%8`[1s((/vgsWYa68N! 1 kxSH|g\ܖ7['O`t?!Ig2d-*T!MQ@mS~xz‰!ؐ@$) J~,L? 'Hzz$>3UU^ymm,|ݻm{{]'=8HbpXD2INv>f `z.ϓ@Uu5A] ->y(XVwqx+!~H$HK/T*_tPi'Ůu>i ~0Q@E'o~,yenP+Id:L1MXo/DJBQXL8EsKk@w@WUSt8} }aDr\b:` bWn,0nQTChx(8;ӯ @ %&y対ۋFL&4$Y4oμp(D",pB z}wFQ0t˶Q2&cf4pL?7|Hjam )U>)g }'!rgI) V +ՊDCQW62qK>w=$KR?OޛGu{{֮W,$@idY#ɑ7j-KI(ǎ[rdrrbGddd[<%JReɎXDR EZ@pH@յW?}UՍ@;Nw5 _{w=8^GT+eLvѭ=nvd2"ŗLVõ qK+&S)P.&V~&xK݅0ĈВ}tFߕ,}wxԞs_53x-[o[@͹>֮/by˟=$"Rƴ^in!\T*E*"H6\&C57UL*EZ1k 8n)EZEk1t*X;ۗ~Gae\6<d3do{'W>3&gfCDJx~CaȾXa W3HXa;VM*HH7RRf)Dq0J%rӈt YԠgn/϶"朘P~Ixqxc>ϻo=DxHIxe>LtGx& AkD9T ?!RAHJߧ"\Y0>>Nkc dU~5~OqdRm .B;`" J dys,o^Î$~5n\muw_q\-ÇvnCۓ9}R)1.ͦ ] d4Z-E"Z#B|ƛߵԫ^ž_5Z-^ ßV)XxB"\twx_ЗuAm .:ό8 ˳7~wmGz0ΐ]Ώn5>Re4ü/;ܳyqޮ]n_[Zb1 귯)Z-"+:vܼ}B_y-lu~L&MɅ7WyU;~??: y0$K|!N kc0Zӏ"J C}uy'&*W^Ih~sO롁 &Sz+IKo3E(@ZXSǘVd;\?_9'F_&'1|nZ_GwmǟG4KKԝxgѠKJ.V,= B0z~q8n6qLԀ1jT*U~Ycc0.=_U*E ^[|?З;nf(rH#)sOַ`=i//S_]hhN7CccEVVVc 2zZc&_,"yD&/|υ1`Ø5??-1hnE2(B ALLO;)NcǼ?o<B_Y\-<^|Z>s_c/ *>L47^ZB}ufN`b&CǴ{% CU"E8Fӈtvy(# P@MM6<7 ~ AMLϞ[} ?pi.,l͝(nj;Rvse3o c裖su%:zZJvP` $> +dVn4DHŢekq<яbXQl̐]@!LNkdw/𕜞my3 bdco3D\>hjMV j.R+IA 76FPQaKA^]NJtϣI _?`X1zp QA"3>{`rMw{J^myكNl؟CjI'ؑ/҆Zo=JH}iVNbyu~ߞB؜O <\VF}q1c҅S)d2Pߧq}|rPR*jQD$f`F1 j߻29'z KNmoya ·4w 鹂O.Tʃ@tHix! yË//,XZbueNrjOM(E)AC.0>U  R "BLjg!;ff&cKlh…SWA?99}l-86t~| 9yPFzFO 4 1s/}|LVhlRY՚2R"cH>(BH  d6k ~}/ dDc4s7]w1t]p֚|>&= S qu{}vrrz\shK/X33>}j Ri}͞8xWFvrGJ:Zj8j QDDV{ Dmw7;69I\!P Ǒ*Eghw{/{뉵nՏ@/*㻔`.t 682mkAsTnKy.T@;, O!K/.{4[-A5}:mQ=o!Zw: [aO6l!FÎ gyѸ^^wLNLߍArkD('BOgw5 Uhs` T+c\B S`O!4K/.i_˧[,1;#0ytsH[t0Me2Z-.V:*t>gx{w݅}mfI QbDB,䜿qOosG@ 'EQDTK%LmZAd_,Z"|N ccRv @ )eA@) CBǟ}ab l6ljDwUA)hc=D`OY|d) -$&A>fB)"'ו JJ[i6iRuB2eLO{y{׾jY )0^Cr92D88!n6%X wGju:|ޮ-c 6aL7zoV*a|9 HAҵ|WBvwu PS<>iAA55eA`Ny^אԾcLi|;+׶`ll)suj>FK/.ȗ_/t y ba52mG-YtNgrj`+ \*Q@㳟﹇jvM 1Ƕˠ5FbXC.Rư}LL|䊹wi[pV7N]1|6ZڰPgGF~A DǓކ+ޱ?D]l:1c%L)x>1XkP,)Ǯ]o}wMQjȆ] g nD8cL~?]dn1?tsWmYX+A* <*Q4͕6Gt80 [VB(I?o>o3VML:@FvzZ3S"1hBP.(Jffmÿj?4>i'?T&Cg%x8 EaR ȚY/۔`nE>|ʿghI؟8;30Jj~P'*Yk҃_ ]`APR)1%yX%?˵:66p~B>OT8=75eկGğsi!F|j0vZ 8ǁ1 (#LVmL1t>ܜxoTޚ_Y$E.&3[%r#!iWѓtVKw~(?SFHJ"y>Y# `@RBPK=ݼ@aljBqj 5=_^CC1M `\K()JhqPuo\4UoV4pi͛F+dHԨws6/_UʞP!I|3EVƨgfԫ^ESO?i{ @Z]oÐ8;2R"jF5A {PoVm l Nf[Tl'sK>^^cP{~F**@x)S?qz!]40NP䱫߆<^}|dS9!u4/8"ppӎ(R;h (QBvdHq0+.jY\i|7:s_/f]}^PORɤ ~jW SYPs F+>"]Bok#iA;[;׾7d)}9mϣR.3>>n ~ӷFS 'L_BFk1ds9Nz>QiM6lD!!!5:1Qs16%HCcv?К3U?ĶezV ?VCd:K<ijĐ#<'q =|bjJavW\s >'']A RHdop&yPXPA}R3vE(?2OC`;3o/U*\aNl[p :;^-OlL ߬G?-?)۪h9N/KvNe|ž!?x#/_wK ̬p屣o|:aȆ9- ^.W_o)c0aU_O8GcH` +ܲvZSQ1!+6Hf$b`>W?r佻+TKj-8Y%LT O\G>#<ۦˉs+H kNc4,Ȥu2EomV%vhi||N30;ؖ^gWimJRdg'tÐVru"y#K3Sq|m lAI_HO!/txt΂x{DIq'y [룂$"Su*!9b2/^aW[`V}W# 8fњWؓ?d?X0hz=8T+adǃo sQtfWʇ%l[q~Ny3 PR"=c/o֜K>'A7l >>BT.i$k!(}&J9EJ+fQkFLPB訏3<{wR) ~q2g jbjl1' (y5Q☂F]la0pӆ=cؿũ^oٖ:8g2^O) P|H?{:G{_F~k~D8꟠AN{lO ${ hv5+͈VDSo4;CLbZʋ7_uژwi\' ݬs IDAT}ZnSo{=qՈ1qlu d,I}?}ߥ+N^ iF75EyvBF⑊} dyڭtFk=j|HcB*E6iDtut~65TjcyHm+pS ?=8_Z/q/@wъAˎ߿AkoM=w|ɶ4ʓ $B"Mm4[ac:~dtݻ5?m1|l#֚VzFVL׉++0Q@jՇEd@X\ x@.;5| W| 0{R xbTϓx߬KM $N?Zr]4T5E&cCe`DŽO9+XhE1FGS: g|mt޳ >sDjn ,il$(5@%)(  l(e^F:cOt{=OIE ]PKq|Vo}h. {EZ-zn^}M)BVq̈́B=֊]lE;V0B.O9ٞ|H±FNyhwBgP ʈ{k_(ԗ _?%]iOz3Վq<ub(?T%>aN?;99-!v[+t'%WlR<Ǒ|8Nl#ÐKIF(zScJucW$4%+ u׏SYZ O|}C5Z-~!h][K>B?]9ź~XZ}BIRiT%)@ @rv<m/َ,GG(!wν3?tAlU!K%?RZXgQDFi4[Q}ckEѰ:s+fR> &9 WOH%TR|>"W_X#= t gAo}Z ft% ]uӎhm>Z+ߊBoO(D}G5yGr[zyQiX'/0l >jbFJzi& D1|ϣR#iO|GgګeJ JwUW !y6O# Q?⥯|})Q+ ? lrTdz<){ ;d}Xۊr7Z-؝qh@:~OuUG2<(V(}#G^wG~^vY6b0fέ1y!CGo߬#Rb$O=,ώ06P٠AW|&򒥺=Wض1ZIZ Gfu={frg=T 1t@ 塼XR0P Va"yxqLͽp4fk?|֩ʏ}cBo^TSE~uۑR ZrGVci0/?N4/?!pϨǺިz_i,`,RP-ܰ-`Z_3bmONGct윽_?2Sڵ}vr# ~D $aI#J 1(bN°8>f]f֖r ?6'.}y&l"AsO'_)ۤ8RW4 yo>e_`AcDž68lP\Σ4r0C;usfL N~m? -6T6 swg~}|`+bcެM`9dk5nV ! EZ * td!Z%W,f}B]FXњ9y AsB\禦.݅}`O~$/$GVe |t}iDjl uwM>_7JyT vAKn٢ߪ7ZvHv]?aE [lH9|޴1B=Cc5o4,O}D$ 0 x33˹h3";G`}J.(z2hAQlui/jكBzw W泼uWJ%! >D:m?}>ivGwzn0Rt?!*[Cmq$Q4}Α]޽=qwRQb 㘬RHpbXt 6}(ȵhyqd<h\ s yCRlwW_7mUdAɦ^?HwnF*pίlgߪґ$/dߚ@X-?N8շFsvx1@*We=[_M}.{M88Duй O7 ( Ǥ| %ń( _ k3ABhϔ#WSHKKq<_FOy۩2.V$-s/O^֪g%;Yi9Woߋm/NzCxʘ.c;NY+)iz̅!e&ȤRcO B(֖1hn{Y 0d; @mj,%-cfn/HNew/u7PKb|upoTK$}K4=KcL5mK {Zhtu?;&lft;]Yg6WkcHQ!JJQDڱL1l,:-!,hFBRZ$-–{503I;M/Y 3X|njb! H<̇<{,eW5@䤽$'kH3f|nPK$ڎӎl?O~z0aq"va!?1.zh1)Tɴ0q IA qnOJgs@Ǒ'`\KZ<!Xc0#i RZZO=mNon7.lIy}>)IgϮqMYvy\] zſ Q֟!lk6O1FRNY_uF Dd_I0}K|'= ?;1s{l ñSBi_ .O\ 5 h(6P Td9 @D/ #*Lodx|~ċ<0|)Rc }rI=@R '_jq\Q2g|Y*cjxs 7`vyi@BB!g6N^I+]Thj > @g9 F\m+zP:~yf0R7ǞOԏyK_%^8 {xX~.nRHޫ2 +-[_u>VDwQv¯f,,ěCx7vMXut@@4#N.K6ot:-9O=!FM-mb̀ ZS+)̻!I~{` 1zʁ@-1MT^x~;zK:O)j2~a/I~PA{O(`"jg^|Ey9{K9,ȷ^s,xv:3 [KF{۝3#:dMρYXwI!>CMgۗp `\d HxDdT(5 -y yzD~}7Z>Ooi% (yVr'RLUH[w 4!Y9xzʿJA*?l%!:6=BA k2cVZ׊h#+F*q]\ylό'nLdhϣ ,42ςQ,e 1EѻƪUyM.9-&u[(sw£օë!$U>}F?]8&?gR vߏ遨@гp%2ޮ5c;Em ­1r֌E)cǶp& pi oGu1R2EIƘaM@@`&(Q4[=j3U|d5˛.)-wp›KQ-Q^r{щ%u/);G+*T1?A/O,{BRzuRz^]/D}Xsc,.F߇1N@`T 6 Ra Ei$l˶t@)rZҚE1[iRR}臈?ɷokzm/OmU9R^פ#(y\䂞#OQ.(O!=LO{Dҫ7܀@˿CCޟ]gc#k4V( BY|BPNH]5`h4I:@1>mlaaTG&jͿolD_MrR>G(Qcx׎CPp\{A\r'`Dp(Ռi"MF"8s;[@'2{CcrRK&8]0 @nP0}es;s9ף%]c7xoX~F=lD'P*dP%H{kӛ! A_ Pӟx䗌eWOyCIN7,׷)t|@9۳x %v>Ĝ[]%p\nvDH# hdv@y`d6X*EI A;W/E ss~;#f(DM^z7tR^I ȃ6;g6,%ȵYx ar},.~p_(9ˋV^" h)J`#+}2ԆCL6K>+hi|L.G9f% ܿ`уbh`+;g3i c9tCHyt#I+οr%ʈJ?oըokۀ,T xÊkŃ_ >8]q߹ ٭L 62;+$8Z8i 3Npc6 Z-s9ʩ+RX$^:xm.Jv?P*ly#|վmh/.1@kgKm,5h|$B0%L z&{[!ND (*ff֭'? l;y;q/|S*=t3z~s߁E3w}𼽸*J?7 5Xt=ȷnO:O{.$l()(=^{u֐7,-%Xl|ϧc/Bx/s$mcӗ ]W\C-`דD;( MmɧR4{=p@>vd۴}vE3w|nYoS.R);<;ՀaŃ|ɵck~7'%G1?,亙f'8~ݵZ8֘7M 归~'=|RUtʍˮ1R)fV7LX՚d{>v Pk4(!X W=^.fkE8&c<!k͋Gə\0}D9~; t}<䏍މ0:KK??q@ar |=}_Q@ػ+CaiMƫ-?֘7 !Fא}]MXy)vSC d):1Xk|yG. KlA C:;hvDJ5Ԣh_\lOΕ]Poһ;!H3Vȑͦ<bc Ľsb1W$,ZR;}AOIKn Y_P5-շъh4"[84_DuЅyͿ [''LŠkNd2t C IDAT 9 P @@96Ff\z;\~n]J}v:<[~R`0}$9t&M>FJK!R#" &8/1_[S;gr+Lռ,UC:W[Kkhko#ϛИW{0N_J^׹>& 0?-/ A PE(_ "pZ tx YvTnPXh>T{pz 0S/|ó_*?S1alo}0_/!gɿQ?#`o+W*ʰvkc5:'9[w\4߳8`]kJJ7`N { #L 8х8)O cp`2 njA$dS EϸIʣ++l۹:Ab&A @A@a, }>IP(Nzaj>j˓FebO6 f9[wGX~Dma ׅowTv#vG!nJ@`%))ž9AkMM <ǃo#<&HiG vL@(QTgm;Wת%owwy{(#j;yzR^ұ[}AO O> 9:z?yb+wU.Oo]KHfd@#Hɡyܶ c Pcaun8^Ƕ&pH )^n6,!A#%GLDf!Av#y;>As09>s~y-Xnc;: ;􇧿y'RqB#7ccj.㷏A"}g/U۳¾r_za>PG}j :MF96 LM*AYW8[Rt:M1A1۷(z#7w"+I/R]^z`=:_[]oDIiҌXiܿB(V3LZ~C֟ #t>їlkWV\M_5BJf{=R nӇM#* r F`s@@:vv"@,W {݄['o"YR! l}rfLkаW7VIX~N$F#FʓǔJ|01ZcŽu0_Ga c^ESٵ++|\{`n1`[Mz Ĩh~LJ',d'ɦ$7H2 YmVҫc߄=LC1AU%:tн_{VVxoۃ~Zqޏ{$[$G2qb;dkhIۘ^CB 6:ak&thIRhlgBKMlǏȶd{^k}c>#+]Jo蜳^o}fL&<߽{K$r$,OD(h dlνl9_- Ԅ$}=0{[4 ~.үX(Z)ڙ_xo S\Fc(3YO߷9 1oψj咇rsQ6F0ruӚ~~C'0dJG׉or=Vf _$0m B!i Æ$P| vFD'NGx~4*|a[)$.6=O*Hi$!/ hJ@$[[=t7 'jjs-t3|o]^bS{i-8iƝ̓coyZm6ߑ0j ~E,GQlW3g0:u|#ߥԚ>ՂbC.\c-%aTY/) }o;ZJI0, ߜ8_*B- I 0pՆc񬔭6llw\Ta֋*m-/uxU5U, DZM4}cX؀'շ> e d>6a ?>`/}^eM2kᷨ{`ކg4?Q)G(ik{`Dpzf`< SAxjN@.#\5h6mє6P( uW%vl1x|GуWwVл@,Ƿяmkh lhT<߅PAwnkAw D|헞t!Kܺ>۽K2?0IN w7'^ '?+$nyټ̫) yRq;3GdՒ@;WɁ@,-Yl^AJ9. B`d N1n R"#;c z'>yK#!۫&Ix; $Hʬ&@1d[[%xm7 7==߶W_|}me+|I} &dewsoe_&&3eF#r^CR(c>a`!e ȵH R\H}aZ2|#'x3ݿGc'_Y'^sxcg`@~B=,Ճ){e{>\awd&ngWn׼Yyr$1 \h``3Cs Qzل\Zpf19l Rbh 4lw`)Zc0?(G M>x%Xy7 ğu[.!{Ym_l0xZłJ-ę #!U2+,pS^V߾,Q) X_m?Iy9g|ƽr ϱ4cXO 4U8PD̈}./;nNLsgmO7% A`$ *" A`8aێ}R Rɦ- c@Da΋};^]'XH ժ=`Î *Ǐ:(ҸgB w Kwx H?.d`Yw-~_kkI[?lIg A'N`޽6Q,7EeHfPbK0aT%I鞃3NG*0njsIpaR$o6OģDPu [?iֈqlנKی#DZ Tn^*.^`uq9Qy%$5:}O_W`0Luo`̻iG#ց?+׊Zxu t"f<5}$dC$ }-os6LLB|)!ȅ /"p L9H@8`Z}DJY+fe`C>0Wțx_h-8Z&OHjY.:˯ZFj #@ZBXMm=,U$.vݳA[|O,; r-P>'͌I>qo$`r;tp}Di`܃y$@QV514zP CER,J^l67۶`OcAJGcУͪ>6|̕&$ۄ'u%4<b'F#5 E - pӔobOˌz$P_믎4v(Dpf>@j4;K/ݻQ*0$nLHcҾri)%& l'!vc@ @c2$[{?I Bbː$6F@k$ا7H92?Z_MY3]WW$n>v|v~^ktϞŷk+ 0 m2w"k1@fF#3 fd݃Sɓ@XPQ Rаm 3B`*J #r SWӋ׶U$wYbO ~ꅋH:s?xV5_Wk6 a;c*紙ch7Zz?AkH8l?˯ 6֯w["íօ^g$`13g++(m|m"WH@3gtg̤KKYT18IFP,""4EZk-++(U*v7R1Ej5PȖ `vă(AB6IiWk|yO:#JQNfܚ@+oaK) Fl( zٹ`ya̽{W.;A[s/4d M!v` \ t}+je? ;eƚMj5 g"0@R 5D!UhT.J"ƃ [&ѱk k3c6w7WOlP^X&R -ˇN/A?r%`0<&ٌ6+ aI dvd71^}͓AWJl"tMA=w44XlfXJ `8!ICcKZnÉS1A\lɓ˔rq@` X+&b  sꕓy+Y?ojO3m1"9Z8bZct1:V:۟}Zubӑ^ _;y{"8l~o%Spݠ ݤX^l+$g1fy.RqL8Xk,5g fAZRH |xle;64کڒ1- Qz8F?}n\ST'mZkh&93s+mHm,7m;l%Jap,\Z[w33N@HuK-3Jf<s/}*e}1C FrycÃ%64͂2ZFKmQYg4rEkB)3C+ zA0!~fO^`ضݣҟ]}=n>oNp-6z@FlxM0 x9h\% oN's= Rj5}OCz0D4B1">IAOͦEnՕ  >]/›}/I2C9/xR WjYĠ+ץFyRv<T\> Da(k[3S1-:R_Z\^:w(ү㿸2?~^B'օ 3} Gm(u:fXFgcaVձSyw}[.oW~ʽonkμll@r fƳ*j8ve}kJnfciD|ru<ôZaF5}Vl6݋?t;=N^qPHl/hpl @OZ=Kl|9P?`fWLM‚ I8Æƣy3l㗊*8_i6?`Nq 63XB  0 ~?l{^2ONPqOH0$A~Rn$T.!%'^={^߰o!@E`ItIf-V̨;D9]׎do/Ǟ_ZNH}OxucbmANU"BK̶nvT( Cl ۊA*1{?g$V@dpm9P|$$9<+z} K'W(.? ! %Ւhn  J'syt0@ֺv&93nm >ml{~iS`~]4P/5ֈv>3HHV.ck>CiNIZYOSiXס76:'~ D #7ɶ[9P| Cx0Q@C Kv}qPքCxnY x< =q~) G=(@ -&c_YG`9``هiJsTg|'r'pKK҈Ja<bPcu&F 9`}*2PJ $ʥf3-_3׽ܶCصsxX^Zc4aO <ֶi+̑Бfƚ> " *x:`Qz ݻm6ݷV?-|X;Zql l^Bmr$] i5g_ j cp~ ˷2Mކch:_'+ ~f }>`#g}| n`R~̌QU)Ql8ʣ6uRz8PΕP Cjh`&Bvݩa { zI<ͼtŭK?m@/~H/<`'6V'4idq9%jS ~YO>o~(Tl\{7@hz]pԷT/̿?۽!_.ŋJ{WV>1aI@;RŌzhv$'`b<Hտ3cVCTp0v(hm}i)1z k? x`p.RT( BB%Pm4lg,&I (fNc]f{* 2@<7>{ǎkoiwfkQG'׼ ZM?7WW?g~8-ɥV0NHI ֵFM)1߷AF c[UHk_yʠR,f|ᅏs_͍]qcQrt]zwvnfUj5i @GA@^~))6&?T6{$%O?+s18pvEh;5- Q,ymm /Žzƛ8^WWV~͸%AJ13.j*3JBFOH0 B1 ,e1JAh]~B@U,;é_ķJRnY _CX@ m }aFX,P*QQ]Y\]R}cއ~{OJ!s>)ݶi(A  מ~=d@~faUNI?@4u4Fl1T"8jd;ﭜg\ E oGo1o $O>ou|=w8,>{c ϑ&%β' QTa34-]T.kM]^?Cԟ9 Ɵ9ɦ|z^?~饗ص?_s ~(ԗ <rNz.jEQ$CC| . @D2_(RC59"X0~`Vl?/çTy@ %"!m79`nĶ-ԸyƹAD|F72f}Dl`]L^.P)m^f7aZR zx7A~J$"8 "5-Nz rh޴VOA<;~r$+E,:֭. M~=IL-̦~b$S{*oUܹ/6N穿ȏsקo̟!"@r 3ǎ8cT,Hvl.D<)e3.ʥU1[XB{D)S^,, =[ ,)m O ǥ.-/;,`q˝3L;Ug}9Xd:Ɯ130Ғpw6BikQ9%7nW2af O2q--9# 3{y?e}?;vFBT Rͥ缺}U>6gV4 ._Ը*Թ10ܯ#ɏ 쯠L]GJ0MH,e~{&O|m?R:,LY3t:p6 #0Tx<sFJS7 IFD$$Lt ^󌇗"nC7vq !3K^^RJCDƅ>gދ6VyFkRX,jfuN-/J@,--0 ER)%<b1+>{3w`|AJ]ߜ?}B\sv0get=kFfAĹ]¼CDMLig6{>"J)ۡ2J)i !}3M&Ei鬿pxh6l6E :r6BB9@~ySe(ٶ0n;Hfξ3:%an Eu]?PD(ݖB{g{^UFxӵ;{xmtyUy`ʶ !p뭷f9b)cn,fi3Oq_t\|Kق ດKˍsyRRVk?s5i*9}O/"]#l.CS׽ع})hG@'TRy3/zn+%yU Ϧ΂j%SNŋִj"wM۷C+x-ASǾ|UW\ Xw ג(W^jO~cznv+Uq#mͬ"IENDB`./qwbfsmanager-1.2.1-src/qwbfs/resources/256/windows.png0000644000175000017520000021014111534466576022406 0ustar pasnoxpasnoxPNG  IHDR\rfsRGB7MS pHYs  ~zTXtauthorxs,HUpr su#I; IDATx $u%v_^{_ n4$Aྏ8hM8²!X-BakSbDђ(Q@ v hhג|Yw7@4#ג~VnX:G k|9q&|jn;˯s\{W*f9nݺ+g3+qcAl^km&%Z𘷞q\$u47?_ΖXK,%Gvϻ}}7~s/&I$?wsqގ8rVEzZg:  _Qr4ֺ^;!;7 `lp!{,iG,|o<xtl{}nx;8ͯ iVsYǓryha͛N\!`MM ,ײaٻ_lj&^"Eʩi0B`Y- mz;G P!Vg?S =2`&lQ RIcǸ-ww~ Ǐsv߷or˯謬uYndpqnY**j}2n*Աpg5ThU}?Yl[o +FGo6fٕ^U^񶇅^s^ڀd6`y{\llՒgŠ}WB{NL,ނOo > ǁ$+3ڳ<¡׬YW\YQ/=Z:W:~yus .⢸̆_+vMW/\xP#@~_`"lcb‹H8pJ_yg/,,{׭[M7C>toGj^xAom [y]XgƍߛH%, {ZVؠ,b{u{~{fnz.A,ӿt_/X*'U!JJqߦ pjJr]RkG7lxlǎ+pI$J8+k7.~aZU)^"4*RM{ PCp! ɅгYg6/,ӉSh㽇E2A`f},hr =^SATOP]STc| 7[?ק;6mꍭ^gWVx5nV獼YjqnUucSk2;*fEʤ9r:Dyti:}+8#@UDEb?N6l WVxEn,٢~cw" 1j@<]ctX[;,ZJuޗ '28v{yzgC=GgaϜi~]ڂUWբcSǦ (mܸ8A XX9V ipa+T (1aV{; be(zEfr] Z^7߷U˕jW <I.x.Nᦂ~ :ɮa?ssϋ?~({5kuBbq5@M *,.OBW P4dJmnnfff{7|իWĄx k֬Ui^@#(+ y)痲'@5,q-qWZR=jGjǡ^ҍy ??Ζc;4Z~gU.0 .;G'x|+_p(a(P4X ?Flܨ7hpx&ib*Zj# *b!z<[BPc9p:Ŋ a$&![!֭˷ӦMh4:2yQh2%(K|j2W msIp\kW;wPW z7/_ݼ9+'L(\tMu衇{sت!Ƃ"ٶ1;$=>>.97VFW\_ fB\rt28z(4hNǏ^>s\zÃ5u+i۶m.@!ׁsF-y }\J Ŀj>'_ 7JqE 6^y^mn3` &T{TNs[%`jf%ŠKܼiFZ14g(lPM7 B Aj*t2K~X VzӸ\X P>,8p.CJ} |Fo߾J҃7 YP=HX*IUJ* DNVkӬڰ~ٳͯx  2pRB"w-CO=z:|aKjE׾T5l6oLm֮_Gk֮aAǃ{FJ/U$-8߫+ q@\ڃ  t/Ju_vA4j4¿ti֭7x:,Тڪx LS+t\+ce=4:6ze[ݹ~ݺ#+~E]ZM?ʋl4!]xC{WkUl?FO?|Q{K^>vCoڸ_q9ع.~9/|BrQʃN|1l6oUAp#{ F_ DC8~C |<xB=y:!4M07| 4ʂ7Hx ixdj՚4>pހ¤c%L}qa~vߦ]Qo Ǯly~V|ma5p/.H$x.WUw#q~lq|ӦMk.bwTbyĻpPm,~&K<~svG(+'xNNRCLVg}6Z޶nJìDT:T6C}KT/FkĤ You!ַ{ǥ5 ݻ%E)LH${)‹< (ٳgphpP8O=qQ;wM7$ rf&)m/@#/q]*kʪ:zpᖯtWzgyY>VF^x[㚽.2͌c9ԯ!@ߗ{$2U|n+.v(uݥW⍢5|hÇsO)@< Fv.߶FZ8?'Zr"|ODv\$^h=Y5^n];Ww J,h?v=\zX8$eƂ|'??eF[!ˤ{x9&hFQZ~& BICx% k!qՕt; VX(R9 &d50JỮM 0+ ൽO?jvo,ÂANZ uh<+㣆 5\Cx;-E}5}VՊƋkjh7~M<7TVE/B5hw%b/`zt#_ѡa~_'(2ժ]wJ_wF*/?[N(]F# P|mXHF:;=K3B{kvqHpzc._+Ph$YXʁÉ5(R}lnz ^brrҰ-nPdv) ਸp(cǎѷm7!@b5Rw} qoǘ{O Y*-u.>E {wT/I#ȋ9O=5z{iq~Vp8nʕ M7LVZ${YുXTkTթRύ|ebݿnÚ*[͈Yx_6`B`p4ޗ%~b#w3/"Xdj/$/=2K rS`׽"ǮG#TH2Ve{_|}􎷿&8I|Yi8BeBJx [AC+*?|}dE7& إ,529jmGʤXk_?fjm@!ևV^)=Z^]B w[a:68t:q򄐎65]hS5;wЭo}3޽Q< =ivU'*ھXsW+ p/.{,p Z~;ăp]w>9I7\L7t-hXBL" |!Z)}3<+݃  wRn=}/"w;T{f8p2pVcr71[Zk w5BpAJ>:6gZZ{E\zyqaNzFG*7d4B`GVO.qi@UiJ{N:y{oJ5HEJITP!h5g&&&UVhbB&''‹ o~P~Tbj-do6h idt Q0/$?meU}K^Ko\,1k!Peo!!I97<423>>\w<ILA%[_>qS02 +_ vh#H}C=RP<2(by݇>_М*2$hWx֑wGx tM^a v.2 L]6?NL 1NFJ)-WKTAG :A'4cukdzf3433Occi||"9lk[={q \RW|!n懿wjMZkpٟ$H=.C5r_{v*s&ԥ1+<!6{Ԍ+HBu }G$7DLLe{.9bgÙ2y* {0&9O>A]z XSxm2pPc`U JƼ&~vU;~4ȥ6/apOoši{(\}XpT/#b3( hu'CY r?]M#v?ٳABt#,S,m'Dsg8HWo境 Sz`ş{ qBN 0ƗU51_GϞ>~ǩӓ;!Mo6+dmb@%pǏ~*8VkN;ɡ##c/ϱKE \2a,?^@ ,C%F3>OKd_W0hpnݫŶ?-8%>}~C-ďpW"Y;<B6{q%&(:* [5B߲=Z D/Ѐ`d}"Aqh`TܑYCz>﹍[5~w?/x'?\ 13X˿??pz$ km2avA$cjBk" 5 TeNv ZrA\pd-r26lʿ}IY꽼F@H  9uXo];h/$( Me8H1zʀw|\ _u'okc|Fq7)٣2 (/~*]} |XGq_,3e1-y",A$w}^= V3P.BP`=LMc!Y|*T{;%9ѱQ=#YH15=G{>Nm-2ZW IDATcǕ2lAF IC&?qܶw`=yX@WMOO<擿ezGKA 5Aɟ bhϗ:d?IKrCf.W.;[x/aXg$yD rEm/j.$4@+SO݄EzaAHdַZ){]y\