# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: sami.saada@gmail.com-20100502155352-y3xvf6467vabl7bz # target_branch: bzr+ssh://bazaar.launchpad.net/~openfilepad-\ # maintainers/qfriendslol/main/ # testament_sha1: e26a761186db5153854acc492619bc9944f3d295 # timestamp: 2010-05-02 18:57:00 +0300 # base_revision_id: toni.ruottu@iki.fi-20100502105559-rjzhecfb0ljlm51j # # Begin patch === modified file 'COPYING' --- COPYING 2009-10-18 21:45:19 +0000 +++ COPYING 2010-05-02 15:53:52 +0000 @@ -1,8 +1,8 @@ CC0, http://creativecommons.org/publicdomain/zero/1.0/ -To the extent possible under law, QFriendsLOL waivers have waived all copyright and related or neighboring rights to QFriendsLOL. This work is published from various places. +To the extent possible under law, OpenFilepad waivers have waived all copyright and related or neighboring rights to OpenFilepad. This work is published from various places. -QFriendsLOL waivers: +OpenFilepad waivers: Toni Ruottu , Finland 2009 Martti Rannanjärvi , Finland 2009 Sami Saada , Finland 2009 === modified file 'README' --- README 2009-11-04 23:59:10 +0000 +++ README 2010-05-02 15:53:52 +0000 @@ -1,28 +1,28 @@ - QQQ FFFF RRRR III EEEE N N DDD SSSS L OOO L - Q Q F R R I E NN N D D S L O O L - Q Q FFFF RRRR I EE N N N D D SSS L O O L - Q Q F R R I E N NN D D S L O O L - QQQ Q F R R III EEEE N N DDD SSSS LLLL OOO LLLL - - - QFriendsLOL is a simple QT file drop box application that enables friends + OOO PPP EEEE N N FFFF I L EEEE PPP A DDD + O O P P E NN N F I L E P P A A D D + O O PPP EE N N N FFFF I L EE PPP AAAAA D D + O O P E N NN F I L E P A A D D + OOO P EEEE N N F I LLLL EEEE P A A DDD + + + OpenFilepad is a simple QT file drop box application that enables friends to exchange files by using OpenLookup v2. To extract and run the latest - QFriendsLOL source release in Ubuntu 9.10 Karmic Koala, I'd do the + OpenFilepad source release in Ubuntu 9.10 Karmic Koala, I'd do the following... sudo apt-get install python-crypto python-simplejson python-qt4 subversion -tar xpzf qfriendslol-0.1.2.tar.gz -cd qfriendslol-0.1.2/src +tar xpzf openfilepad-0.2.1.tar.gz +cd openfilepad-0.2.1/src svn checkout http://openlookup.googlecode.com/svn/v2/openlookup -./qfriendslol.pyw +./openfilepad.pyw Users of other Linux-based systems are hopefully able to adopt these instructions to their needs. There is a theoretical possibility that - QFriendsLOL might work on Windows or Mac OS X. In the software's + OpenFilepad might work on Windows or Mac OS X. In the software's current state we do not recommend using it in such foreign environments. - best regards, QFriendsLOL developers + best regards, OpenFilepad developers === modified file 'doc/manual.tex' --- doc/manual.tex 2009-11-20 15:39:08 +0000 +++ doc/manual.tex 2010-05-02 15:53:52 +0000 @@ -7,7 +7,7 @@ \usepackage{graphicx} \usepackage{amssymb, amsmath} \usepackage{lmodern} -\title{\Huge{QFriendsLOL 0.2.1} +\title{\Huge{OpenFilepad 0.2.1} \\\normalsize{User Manual}} %\date{\today} %\author{Martti Rannanjärvi , @@ -19,33 +19,33 @@ \section*{Introduction} %What your program's purpose is, who it is for max 1 page. -QFriendsLOL\footnote{https://launchpad.net/qfriendslol/} is an application with which one can publish files on the Internet without acquiring a web space. For this, QFriendsLOL uses a federated datastore called OpenLookup \footnote{http://openlookup.net/} V2. Openlookup allows anyone to store arbitrary data items for a short time without requiring registration. With QFriendsLOL one can give the intended recipients one's QFriendsLOL nickname or userid with which they can find all the files one has published. The nickname is an easily memorable handle, the userid is a unique identifier. - -People who can already publish files in a web space may also benefit from using QFriendsLOL. While a web space can become bloated and unwieldy over time, a QFriendsLOL repository remains easily clean. The data published in QFriendsLOL is kept online for one week, and becomes inaccessible after that. If a user is inactive for one week, all their data, and data of them, is cleared from the datastore. When one returns to QFriendsLOL after being forgotten, one's avatar and nickname are automatically reannounced. - -This document describes the features and limitation of QFriendsLOL, describes how to use it, and presents some selected implementation details. +OpenFilepad\footnote{https://launchpad.net/qfriendslol/} is an application with which one can publish files on the Internet without acquiring a web space. For this, OpenFilepad uses a federated datastore called OpenLookup \footnote{http://openlookup.net/} V2. Openlookup allows anyone to store arbitrary data items for a short time without requiring registration. With OpenFilepad one can give the intended recipients one's OpenFilepad nickname or userid with which they can find all the files one has published. The nickname is an easily memorable handle, the userid is a unique identifier. + +People who can already publish files in a web space may also benefit from using OpenFilepad. While a web space can become bloated and unwieldy over time, a OpenFilepad repository remains easily clean. The data published in OpenFilepad is kept online for one week, and becomes inaccessible after that. If a user is inactive for one week, all their data, and data of them, is cleared from the datastore. When one returns to OpenFilepad after being forgotten, one's avatar and nickname are automatically reannounced. + +This document describes the features and limitation of OpenFilepad, describes how to use it, and presents some selected implementation details. \section*{Features and Limitations} %Which features are available, which bugs and limitations are known) max 1 page. This section presents some of the application's features and limitations. First we go through some details related to uploading, downloading, and deleting files. Then we discuss some limitations related to users' avatar images. Finally we consider suitability for porting the application to other platforms. -A user can have maximum of 30 files available simultaneously in QFriendsLOL. Filenames of the shared files are not allowed to be longer than 256 characters. The files uploaded with QFriendsLOL are protected against forgery. It should be impossible for a QFriendsLOL user to publish files with the userid of another user. Users announce a nickname enabling other people to find them. They can also upload an avatar to help their friends to identify them. An avatar or a nickname can be forged. Whenever protection from forgery is desired, one has to verify the identity of a user by exchanging userids trough a protected channel. +A user can have maximum of 30 files available simultaneously in OpenFilepad. Filenames of the shared files are not allowed to be longer than 256 characters. The files uploaded with OpenFilepad are protected against forgery. It should be impossible for a OpenFilepad user to publish files with the userid of another user. Users announce a nickname enabling other people to find them. They can also upload an avatar to help their friends to identify them. An avatar or a nickname can be forged. Whenever protection from forgery is desired, one has to verify the identity of a user by exchanging userids trough a protected channel. -The group who can download your files cannot be restricted in any way. Anyone who knows someone's QFriendsLOL nickname can download their files. It is also possible to write a piece of software that retrieves all files of all users using QFriendsLOL. +The group who can download your files cannot be restricted in any way. Anyone who knows someone's OpenFilepad nickname can download their files. It is also possible to write a piece of software that retrieves all files of all users using OpenFilepad. Deleting files does not actually remove the files from the datastore. They are only removed from the file listing, and only disappear from the data store when their time to live runs out. Files are listed as available to download for six days and after that some parts of the file may still be accessible in the data store for a day or so. This window gives ongoing downloads a chance to finish, when the time runs out during a download. After seven days the data store stops giving out the data, but copies of the file may remain on the servers for arbitrary amounts of time. -The avatar file size is limited to 99999 bytes. This prevents evil hackers or broken implementations from jamming the user interfaces. Currently the application does not help users to make their images smaller, and in fact it doesn't even check the file type. An image file may or may not work based on some internal magic of the image rendering library that we use. A user can also set their avatar to an image which is larger than the limit. The image will still be uploaded to the datastore, but the client will refuse to download it. We hope we can improve the handling of avatars in future versions of QFriendsLOL. +The avatar file size is limited to 99999 bytes. This prevents evil hackers or broken implementations from jamming the user interfaces. Currently the application does not help users to make their images smaller, and in fact it doesn't even check the file type. An image file may or may not work based on some internal magic of the image rendering library that we use. A user can also set their avatar to an image which is larger than the limit. The image will still be uploaded to the datastore, but the client will refuse to download it. We hope we can improve the handling of avatars in future versions of OpenFilepad. -QFriendsLOL is not cross-platform yet. It has only been tested on Ubuntu and Gentoo. Currently, the application does not allow you to choose a download directory, but the files are downloaded to ~/.Desktop directory. We have discussed improving this in the future versions of the application. QFriendsLOL should be easily portable to platforms supported by QT and Python. Platforms targeted for future versions include systems ranging from Max OS X and Windows to Maemo and Haiku. While a range of platforms seems plausible, running QFriendsLOL currently requires a writable filesystem, as avatar pictures and list of friends are stored in the local filesystem. +OpenFilepad is not cross-platform yet. It has only been tested on Ubuntu and Gentoo. Currently, the application does not allow you to choose a download directory, but the files are downloaded to ~/.Desktop directory. We have discussed improving this in the future versions of the application. OpenFilepad should be easily portable to platforms supported by QT and Python. Platforms targeted for future versions include systems ranging from Max OS X and Windows to Maemo and Haiku. While a range of platforms seems plausible, running OpenFilepad currently requires a writable filesystem, as avatar pictures and list of friends are stored in the local filesystem. \section*{User Guide} %Explain functions of the program in a straightforward, step-by-step manner, so that average users can understand them. Keep in mind the target audience that you mention in Intro. Have at least one use-case. -This section will teach you how to get most out of your fresh QFriendsLOL installation. The next chapter will give you an overall idea of how the application works. Then we'll revisit each view in detail to have you backed up in case you get lost on your way. Finally we present an example usage scenario to give you an idea how the application might be used. +This section will teach you how to get most out of your fresh OpenFilepad installation. The next chapter will give you an overall idea of how the application works. Then we'll revisit each view in detail to have you backed up in case you get lost on your way. Finally we present an example usage scenario to give you an idea how the application might be used. -QFriendsLOL has a tab based user interface. Each tab in the user interface represents a person. The local user (that is you) has a special home tab. It is special in that it can never be removed. It allows you to upload files to the system, and remove files from it. Home tab is the leftmost tab. It is identified by a small house icon on the tab header. In addition to the home tab QFriendsLOL provides a tab with plus sign (+) in the tab header. You can turn this tab into the tab of one of your friends. Just find him by nickname or userid, and click add. Adding a user will also create a new + tab, allowing you to add another friend. Initially you'll only have your home tab and one + tab to get you started. +OpenFilepad has a tab based user interface. Each tab in the user interface represents a person. The local user (that is you) has a special home tab. It is special in that it can never be removed. It allows you to upload files to the system, and remove files from it. Home tab is the leftmost tab. It is identified by a small house icon on the tab header. In addition to the home tab OpenFilepad provides a tab with plus sign (+) in the tab header. You can turn this tab into the tab of one of your friends. Just find him by nickname or userid, and click add. Adding a user will also create a new + tab, allowing you to add another friend. Initially you'll only have your home tab and one + tab to get you started. \clearpage \begin{figure}[h] @@ -68,7 +68,7 @@ \end{center} \end{figure} -The friend finder view has a friend finder which allows you to find your friends who have been using QFriendsLOL within a week. See Figure \ref{friendfinder} for an example of a friend finder view. You can do so by typing either your friend's nickname or userid to the text field and clicking the find button. Only exact matches will work. The application does not support partial matching on nicknames. If your search for a nickname gives multiple matches, images and userids of the resulting users are shown to allow you to infer which of them is the desired one. Note that userids cannot be faked, so you can always use them to correctly identify a user. Each user in the listing has an add button. Clicking on the button will choose that user to be added to your friend tabs, and a new friend addition tab to be created. When you search for people you have already added as your friend, QFriendsLOL will present you a show button instead of an add button. Clicking on the show button will take you to your friend's tab, and clears the results in your friend finder. +The friend finder view has a friend finder which allows you to find your friends who have been using OpenFilepad within a week. See Figure \ref{friendfinder} for an example of a friend finder view. You can do so by typing either your friend's nickname or userid to the text field and clicking the find button. Only exact matches will work. The application does not support partial matching on nicknames. If your search for a nickname gives multiple matches, images and userids of the resulting users are shown to allow you to infer which of them is the desired one. Note that userids cannot be faked, so you can always use them to correctly identify a user. Each user in the listing has an add button. Clicking on the button will choose that user to be added to your friend tabs, and a new friend addition tab to be created. When you search for people you have already added as your friend, OpenFilepad will present you a show button instead of an add button. Clicking on the show button will take you to your friend's tab, and clears the results in your friend finder. \begin{figure}[h] \begin{center} @@ -78,20 +78,20 @@ \end{center} \end{figure} -All the friends that you have added to QFriendsLOL have their own tab. The friend view available to you in such a tab has some resemblance to your home tab. See Figure \ref{friendview} for an example of a friend view. The main difference is that you only have read access to your friends view. You cannot change their nickname or avatar picture. You can neither delete files, nor upload new files. New files can only be uploaded trough your home view. You can remove a friend's tab from QFriendsLOL by clicking on the forget button beside your friends personal information. +All the friends that you have added to OpenFilepad have their own tab. The friend view available to you in such a tab has some resemblance to your home tab. See Figure \ref{friendview} for an example of a friend view. The main difference is that you only have read access to your friends view. You cannot change their nickname or avatar picture. You can neither delete files, nor upload new files. New files can only be uploaded trough your home view. You can remove a friend's tab from OpenFilepad by clicking on the forget button beside your friends personal information. -As an example use case we will now consider Jane and Tarzan chatting on the internet about their jungle adventure. Jane is digitizing her diary of the jungle adventure and wishes Tarzan would review her writing. She saves her writing as jungletale.odt. Jane opens QFriendsLOL and clicks upload from the home tab. QFriendsLOL asks her to pick a file. She browses her computer's filesystem, selects jungletale.odt and clicks OK. The upload starts, and lasts for a few seconds. Jane tells Tarzan her QFriendsLOL nickname, Jane76, and the name of the uploaded file. Tarzan installs QFriendsLOL and clicks on the plus sign, opening the tab used for adding new users. He makes QFriendsLOL show him users named Jane76. The query returns multiple results and one of the users looks like Jane. Tarzan confirms the cryptographically protected userid to be Jane's and clicks the add button of the corresponding search result, adding Jane to his friends. Tarzan sees Jane's profile in a freshly appearing tab which contains a file listing where Tarzan finds jungletale.odt. He selects it and clicks download. After a few seconds the file appears on his Desktop. Tarzan opens the document in a word processor to make sure he got the right file. The file seems to be what Jane suggested it would be. In the chat window, Tarzan tells Jane that he will read the story after feeding the monkeys. +As an example use case we will now consider Jane and Tarzan chatting on the internet about their jungle adventure. Jane is digitizing her diary of the jungle adventure and wishes Tarzan would review her writing. She saves her writing as jungletale.odt. Jane opens OpenFilepad and clicks upload from the home tab. OpenFilepad asks her to pick a file. She browses her computer's filesystem, selects jungletale.odt and clicks OK. The upload starts, and lasts for a few seconds. Jane tells Tarzan her OpenFilepad nickname, Jane76, and the name of the uploaded file. Tarzan installs OpenFilepad and clicks on the plus sign, opening the tab used for adding new users. He makes OpenFilepad show him users named Jane76. The query returns multiple results and one of the users looks like Jane. Tarzan confirms the cryptographically protected userid to be Jane's and clicks the add button of the corresponding search result, adding Jane to his friends. Tarzan sees Jane's profile in a freshly appearing tab which contains a file listing where Tarzan finds jungletale.odt. He selects it and clicks download. After a few seconds the file appears on his Desktop. Tarzan opens the document in a word processor to make sure he got the right file. The file seems to be what Jane suggested it would be. In the chat window, Tarzan tells Jane that he will read the story after feeding the monkeys. \section*{Implementation Highlights} %What is special about your implementation of this program? What kind of innovative solutions you have applied in its development? -QFriendsLOL uses a freely accessible datastore called OpenLookup. In this section we will discuss some characteristics of OpenLookup. In next paragraph we'll discuss time limits. Then we will continue to by discussing size limits and integrity checking. Finally we explain how OpenLookup attempts to protect datastore administrators from the data they may end up storing. +OpenFilepad uses a freely accessible datastore called OpenLookup. In this section we will discuss some characteristics of OpenLookup. In next paragraph we'll discuss time limits. Then we will continue to by discussing size limits and integrity checking. Finally we explain how OpenLookup attempts to protect datastore administrators from the data they may end up storing. Information stored in the datastore is accessible for one week after uploading. During a high load parts of a file may disappear from the network earlier. This is not desirable, but should not happen too often during normal operation. It would be possible to refreshed the data from local disk occasionally, but the expiration seems to be a useful feature. It cleans up the system and clarifies its temporal nature. When all files have a short time to live it is guaranteed that no-one will use the system for system backups. Data is stored in OpenLookup as small signed blocks. Data items have a size limit of 8192 bytes. Our application splits files into multiple blocks that are stored separately. Each item is signed by it's publisher with public key cryptography, to prevent against forgery. The server checks integrity and authenticity of each item upon arrival. -Each item is referred to with an arbitrary string label $l$. Only hash $h(l)$ of the label is revealed to the storage servers. Thus storage servers do not learn the plain text labels used for referring the items. Each plaintext item $i$ is encrypted with symmetric encryption using the plain text label as a key to produce an encrypted item $E_li$. This is supposed to give the data store maintainers some protection against responsibilities related to the information stored in the datastore. A datastore maintainer could use a brute force guessing attack, or study data model of QFriendsLOL to break this protection. This should however not matter to us, as the encryption is used in first place to protect the administrator and not to protect the customer. +Each item is referred to with an arbitrary string label $l$. Only hash $h(l)$ of the label is revealed to the storage servers. Thus storage servers do not learn the plain text labels used for referring the items. Each plaintext item $i$ is encrypted with symmetric encryption using the plain text label as a key to produce an encrypted item $E_li$. This is supposed to give the data store maintainers some protection against responsibilities related to the information stored in the datastore. A datastore maintainer could use a brute force guessing attack, or study data model of OpenFilepad to break this protection. This should however not matter to us, as the encryption is used in first place to protect the administrator and not to protect the customer. \end{document} === modified file 'release.sh' --- release.sh 2009-11-20 16:49:27 +0000 +++ release.sh 2010-05-02 15:53:52 +0000 @@ -1,20 +1,21 @@ #!/bin/sh # -# QFriendsLOL - release.sh +# OpenFilepad - release.sh # # Authors: Toni Ruottu , Finland +# Authors: Sami Saada , Finland # # CC0, http://creativecommons.org/publicdomain/zero/1.0/ # -# To the extent possible under law, QFriendsLOL waivers +# To the extent possible under law, OpenFilepad waivers # have waived all copyright and related or neighboring -# rights to QFriendsLOL. This work is published from +# rights to OpenFilepad. This work is published from # various places. -VERSION=0.1.2 -RELEASE=qfriendslol-$VERSION +VERSION=0.2.1 +RELEASE=openfilepad-$VERSION mkdir -p release bzr export release/$RELEASE === modified file 'src/filelist.py' --- src/filelist.py 2009-11-20 16:49:27 +0000 +++ src/filelist.py 2010-05-02 15:53:52 +0000 @@ -1,16 +1,16 @@ # -*- coding: utf-8 -*- # -# QFriendsLOL - filelist.py +# OpenFilepad - filelist.py # -# Authors: Sami Saada , Finland +# Authors: Martti Rannanjärvi , Finland # # CC0, http://creativecommons.org/publicdomain/zero/1.0/ # -# To the extent possible under law, QFriendsLOL waivers +# To the extent possible under law, OpenFilepad waivers # have waived all copyright and related or neighboring -# rights to QFriendsLOL. This work is published from +# rights to OpenFilepad. This work is published from # various places. import gui.logic === modified file 'src/gui/fileop.py' --- src/gui/fileop.py 2009-11-20 16:49:27 +0000 +++ src/gui/fileop.py 2010-05-02 15:53:52 +0000 @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # -# QFriendsLOL - fileop.py +# OpenFilepad - fileop.py # # Authors: Toni Ruottu , Finland # Martti Rannanjärvi , Finland @@ -9,9 +9,9 @@ # CC0, http://creativecommons.org/publicdomain/zero/1.0/ # -# To the extent possible under law, QFriendsLOL waivers +# To the extent possible under law, OpenFilepad waivers # have waived all copyright and related or neighboring -# rights to QFriendsLOL. This work is published from +# rights to OpenFilepad. This work is published from # various places. === modified file 'src/gui/friendtab.py' --- src/gui/friendtab.py 2009-11-20 16:49:27 +0000 +++ src/gui/friendtab.py 2010-05-02 15:53:52 +0000 @@ -1,16 +1,16 @@ # -*- coding: utf-8 -*- # -# QFriendsLOL - friendtab.py +# OpenFilepad - friendtab.py # # Authors: Sami Saada , Finland # # CC0, http://creativecommons.org/publicdomain/zero/1.0/ # -# To the extent possible under law, QFriendsLOL waivers +# To the extent possible under law, OpenFilepad waivers # have waived all copyright and related or neighboring -# rights to QFriendsLOL. This work is published from +# rights to OpenFilepad. This work is published from # various places. === modified file 'src/gui/hometab.py' --- src/gui/hometab.py 2009-11-20 16:49:27 +0000 +++ src/gui/hometab.py 2010-05-02 15:53:52 +0000 @@ -1,16 +1,16 @@ # -*- coding: utf-8 -*- # -# QFriendsLOL - hometab.py +# OpenFilepad - hometab.py # # Authors: Sami Saada , Finland # # CC0, http://creativecommons.org/publicdomain/zero/1.0/ # -# To the extent possible under law, QFriendsLOL waivers +# To the extent possible under law, OpenFilepad waivers # have waived all copyright and related or neighboring -# rights to QFriendsLOL. This work is published from +# rights to OpenFilepad. This work is published from # various places. === modified file 'src/gui/logic.py' --- src/gui/logic.py 2009-11-20 16:49:27 +0000 +++ src/gui/logic.py 2010-05-02 15:53:52 +0000 @@ -1,16 +1,16 @@ # -*- coding: utf-8 -*- # -# QFriendsLOL - logic.py +# OpenFilepad - logic.py # # Authors: Martti Rannanjärvi , Finland # # CC0, http://creativecommons.org/publicdomain/zero/1.0/ # -# To the extent possible under law, QFriendsLOL waivers +# To the extent possible under law, OpenFilepad waivers # have waived all copyright and related or neighboring -# rights to QFriendsLOL. This work is published from +# rights to OpenFilepad. This work is published from # various places. def seconds2string(s): === modified file 'src/gui/mainwindow.py' --- src/gui/mainwindow.py 2009-11-20 16:49:27 +0000 +++ src/gui/mainwindow.py 2010-05-02 15:53:52 +0000 @@ -1,16 +1,16 @@ # -*- coding: utf-8 -*- # -# QFriendsLOL - mainwindow.py +# OpenFilepad - mainwindow.py # # Authors: Sami Saada , Finland # # CC0, http://creativecommons.org/publicdomain/zero/1.0/ # -# To the extent possible under law, QFriendsLOL waivers +# To the extent possible under law, OpenFilepad waivers # have waived all copyright and related or neighboring -# rights to QFriendsLOL. This work is published from +# rights to OpenFilepad. This work is published from # various places. from usertabwidget import UserTabWidget @@ -22,7 +22,7 @@ def __init__(self, control, *args): apply(QMainWindow.__init__, (self, ) + args) - self.setWindowTitle(u'QFriendsLOL') + self.setWindowTitle(u'OpenFilepad') self._control = control self.setWindowIcon(QIcon(self._control.getGFXPath() + '/logo.svg')) self._userTabs = UserTabWidget(control) === modified file 'src/gui/newfriendtab.py' --- src/gui/newfriendtab.py 2009-11-20 16:49:27 +0000 +++ src/gui/newfriendtab.py 2010-05-02 15:53:52 +0000 @@ -1,16 +1,16 @@ # -*- coding: utf-8 -*- # -# QFriendsLOL - newfriendtab.py +# OpenFilepad - newfriendtab.py # # Authors: Sami Saada , Finland # # CC0, http://creativecommons.org/publicdomain/zero/1.0/ # -# To the extent possible under law, QFriendsLOL waivers +# To the extent possible under law, OpenFilepad waivers # have waived all copyright and related or neighboring -# rights to QFriendsLOL. This work is published from +# rights to OpenFilepad. This work is published from # various places. === modified file 'src/gui/userfiles.py' --- src/gui/userfiles.py 2009-11-20 16:49:27 +0000 +++ src/gui/userfiles.py 2010-05-02 15:53:52 +0000 @@ -1,16 +1,16 @@ # -*- coding: utf-8 -*- # -# QFriendsLOL - userfiles.py +# OpenFilepad - userfiles.py # # Authors: Sami Saada , Finland # # CC0, http://creativecommons.org/publicdomain/zero/1.0/ # -# To the extent possible under law, QFriendsLOL waivers +# To the extent possible under law, OpenFilepad waivers # have waived all copyright and related or neighboring -# rights to QFriendsLOL. This work is published from +# rights to OpenFilepad. This work is published from # various places. from PyQt4.QtGui import QWidget === modified file 'src/gui/userinfo.py' --- src/gui/userinfo.py 2010-05-02 09:12:25 +0000 +++ src/gui/userinfo.py 2010-05-02 15:53:52 +0000 @@ -1,16 +1,16 @@ # -*- coding: utf-8 -*- # -# QFriendsLOL - userinfo.py +# OpenFilepad - userinfo.py # # Authors: Sami Saada , Finland # # CC0, http://creativecommons.org/publicdomain/zero/1.0/ # -# To the extent possible under law, QFriendsLOL waivers +# To the extent possible under law, OpenFilepad waivers # have waived all copyright and related or neighboring -# rights to QFriendsLOL. This work is published from +# rights to OpenFilepad. This work is published from # various places. === modified file 'src/gui/userpicture.py' --- src/gui/userpicture.py 2009-11-20 16:49:27 +0000 +++ src/gui/userpicture.py 2010-05-02 15:53:52 +0000 @@ -1,16 +1,16 @@ # -*- coding: utf-8 -*- # -# QFriendsLOL - userpicture.py +# OpenFilepad - userpicture.py # # Authors: Sami Saada , Finland # # CC0, http://creativecommons.org/publicdomain/zero/1.0/ # -# To the extent possible under law, QFriendsLOL waivers +# To the extent possible under law, OpenFilepad waivers # have waived all copyright and related or neighboring -# rights to QFriendsLOL. This work is published from +# rights to OpenFilepad. This work is published from # various places. from PyQt4.QtGui import QHBoxLayout === modified file 'src/gui/usertab.py' --- src/gui/usertab.py 2009-11-20 16:49:27 +0000 +++ src/gui/usertab.py 2010-05-02 15:53:52 +0000 @@ -1,16 +1,16 @@ # -*- coding: utf-8 -*- # -# QFriendsLOL - usertab.py +# OpenFilepad - usertab.py # # Authors: Sami Saada , Finland # # CC0, http://creativecommons.org/publicdomain/zero/1.0/ # -# To the extent possible under law, QFriendsLOL waivers +# To the extent possible under law, OpenFilepad waivers # have waived all copyright and related or neighboring -# rights to QFriendsLOL. This work is published from +# rights to OpenFilepad. This work is published from # various places. from PyQt4.QtGui import QWidget === modified file 'src/gui/usertabwidget.py' --- src/gui/usertabwidget.py 2009-11-20 16:49:27 +0000 +++ src/gui/usertabwidget.py 2010-05-02 15:53:52 +0000 @@ -1,16 +1,16 @@ # -*- coding: utf-8 -*- # -# QFriendsLOL - usertabwidget.py +# OpenFilepad - usertabwidget.py # # Authors: Sami Saada , Finland # # CC0, http://creativecommons.org/publicdomain/zero/1.0/ # -# To the extent possible under law, QFriendsLOL waivers +# To the extent possible under law, OpenFilepad waivers # have waived all copyright and related or neighboring -# rights to QFriendsLOL. This work is published from +# rights to OpenFilepad. This work is published from # various places. from hometab import HomeTab === modified file 'src/guicontrol.py' --- src/guicontrol.py 2009-11-20 16:49:27 +0000 +++ src/guicontrol.py 2010-05-02 15:53:52 +0000 @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # -# QFriendsLOL - guicontrol.py +# OpenFilepad - guicontrol.py # # Authors: Toni Ruottu , Finland # Sami Saada , Finland @@ -9,9 +9,9 @@ # CC0, http://creativecommons.org/publicdomain/zero/1.0/ # -# To the extent possible under law, QFriendsLOL waivers +# To the extent possible under law, OpenFilepad waivers # have waived all copyright and related or neighboring -# rights to QFriendsLOL. This work is published from +# rights to OpenFilepad. This work is published from # various places. from remote import Remote, NICKNAME_LENGTH_MAX @@ -32,7 +32,7 @@ if not os.environ.has_key('HOME'): os.environ['HOME'] = os.path.join(os.environ['HOMEDRIVE'], \ os.environ['HOMEPATH']) - self._store = Store(Realfs([os.environ['HOME'], '.qfriendslol'])) + self._store = Store(Realfs([os.environ['HOME'], '.openfilepad'])) self._remote = Remote() self._tabW = None self._tabs = [] @@ -64,7 +64,7 @@ if not mugshot == self.getStore().getMugshot(): self.getStore().putMugshot(mugshot) pngfile = StringIO.StringIO(mugshot) - u = r.upload(pngfile, 'mugshot.png', len(mugshot)) + u = self.getRemote().upload(pngfile, 'mugshot.png', len(mugshot)) while u.ready < u.blocks: u.next() === added file 'src/openfilepad.pyw' --- src/openfilepad.pyw 1970-01-01 00:00:00 +0000 +++ src/openfilepad.pyw 2010-05-02 15:53:52 +0000 @@ -0,0 +1,41 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# OpenFilepad - openfilepad.pyw +# +# Authors: Sami Saada , Finland +# + +# CC0, http://creativecommons.org/publicdomain/zero/1.0/ +# +# To the extent possible under law, OpenFilepad waivers +# have waived all copyright and related or neighboring +# rights to OpenFilepad. This work is published from +# various places. + +from guicontrol import GUIControl +from gui.mainwindow import MainWindow + +import signal +import sys +import os.path +from PyQt4.QtGui import QApplication + +def main(): + signal.signal(signal.SIGINT, signal.SIG_DFL) + app = QApplication(sys.argv) + + control = GUIControl() + control.setGFXPath(os.path.dirname(__file__) + '/gfx') + + # Republish user identity. + control.republish() + + window = MainWindow(control) + window.show() + + app.exec_() + +if __name__ == '__main__': + main() === removed file 'src/qfriendslol.pyw' --- src/qfriendslol.pyw 2009-11-20 16:49:27 +0000 +++ src/qfriendslol.pyw 1970-01-01 00:00:00 +0000 @@ -1,41 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -# -# QFriendsLOL - qfriendslol.pyw -# -# Authors: Sami Saada , Finland -# - -# CC0, http://creativecommons.org/publicdomain/zero/1.0/ -# -# To the extent possible under law, QFriendsLOL waivers -# have waived all copyright and related or neighboring -# rights to QFriendsLOL. This work is published from -# various places. - -from guicontrol import GUIControl -from gui.mainwindow import MainWindow - -import signal -import sys -import os.path -from PyQt4.QtGui import QApplication - -def main(): - signal.signal(signal.SIGINT, signal.SIG_DFL) - app = QApplication(sys.argv) - - control = GUIControl() - control.setGFXPath(os.path.dirname(__file__) + '/gfx') - - # Republish user identity. - control.republish() - - window = MainWindow(control) - window.show() - - app.exec_() - -if __name__ == '__main__': - main() === modified file 'src/realfs.py' --- src/realfs.py 2009-11-20 16:49:27 +0000 +++ src/realfs.py 2010-05-02 15:53:52 +0000 @@ -1,16 +1,17 @@ # -*- coding: utf-8 -*- # -# QFriendsLOL - realfs.py +# OpenFilepad - realfs.py # # Authors: Martti Rannanjärvi , Finland +# Sami Saada , Finland # # CC0, http://creativecommons.org/publicdomain/zero/1.0/ # -# To the extent possible under law, QFriendsLOL waivers +# To the extent possible under law, OpenFilepad waivers # have waived all copyright and related or neighboring -# rights to QFriendsLOL. This work is published from +# rights to OpenFilepad. This work is published from # various places. import os @@ -61,7 +62,7 @@ def tests(): ''' - >>> fs = Realfs([os.environ['HOME'], '.qfriendslol']) + >>> fs = Realfs([os.environ['HOME'], '.openfilepad']) >>> fs.mkdir([]) >>> fs.ls([]) [] === modified file 'src/remote.py' --- src/remote.py 2009-11-20 16:49:27 +0000 +++ src/remote.py 2010-05-02 15:53:52 +0000 @@ -1,16 +1,17 @@ # -*- coding: utf-8 -*- # -# QFriendsLOL - remote.py +# OpenFilepad - remote.py # # Authors: Toni Ruottu , Finland +# Sami Saada , Finland # # CC0, http://creativecommons.org/publicdomain/zero/1.0/ # -# To the extent possible under law, QFriendsLOL waivers +# To the extent possible under law, OpenFilepad waivers # have waived all copyright and related or neighboring -# rights to QFriendsLOL. This work is published from +# rights to OpenFilepad. This work is published from # various places. from openlookup.client.singleton import Proxy @@ -19,7 +20,7 @@ import simplejson as json import time -APP_T = u'qfriendslol' +APP_T = u'openfilepad' ADVERT_T = APP_T+u'-advertise-%s' # joe -> '' NICK_T = APP_T+u'-nickname.json' # -> '"joe"' FILES_T = APP_T+u'-files.json' # -> '["foo.txt", "bar.png"]' === modified file 'src/store.py' --- src/store.py 2009-11-20 16:49:27 +0000 +++ src/store.py 2010-05-02 15:53:52 +0000 @@ -1,16 +1,16 @@ # -*- coding: utf-8 -*- # -# QFriendsLOL - store.py +# OpenFilepad - store.py # # Authors: Martti Rannanjärvi , Finland # # CC0, http://creativecommons.org/publicdomain/zero/1.0/ # -# To the extent possible under law, QFriendsLOL waivers +# To the extent possible under law, OpenFilepad waivers # have waived all copyright and related or neighboring -# rights to QFriendsLOL. This work is published from +# rights to OpenFilepad. This work is published from # various places. class Store(object): === modified file 'src/virtualfs.py' --- src/virtualfs.py 2009-11-20 16:49:27 +0000 +++ src/virtualfs.py 2010-05-02 15:53:52 +0000 @@ -1,16 +1,16 @@ # -*- coding: utf-8 -*- # -# QFriendsLOL - virtualfs.py +# OpenFilepad - virtualfs.py # # Authors: Martti Rannanjärvi , Finland # # CC0, http://creativecommons.org/publicdomain/zero/1.0/ # -# To the extent possible under law, QFriendsLOL waivers +# To the extent possible under law, OpenFilepad waivers # have waived all copyright and related or neighboring -# rights to QFriendsLOL. This work is published from +# rights to OpenFilepad. This work is published from # various places. class Virtualfs(object): # Begin bundle IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWVETXDUAFOlflGVQfP//93// /+6////7BAAIAGAkhu++7e5xYx8h7GVVAqcpyy3swABQCgAAAV86rXW7q7bVtyWbGuHYfB9uR2w1 d7775s26s3Znfe8V1XtnbIpdju03Zdk67Gd59ve+7p77L3cHvq02QSRBARNpoExGjI0mamEp6Zo0 KG1NPUaZNqNDygGGgTETQCSh7Un6UGRo0ND0yhiMhoAAAABpkEEIaaQKZGkybKMQAGhoDQA0HqDT QBJpJQmVP00gynoaaInihiG00TIaaGTIGgAGmQESiCZDSKb0TTap6noj0eog/VPU0ZGnqBmoYTQ0 BoZASJAgBNNAkxNCp+kZMRkRkNGgAGjQAA7us6wqEG/ncSOu8MGe6Gg2ajm27X2x52nNmnCcom/8 /+MIH+X5CB/l6vruouudk9D/6X4sJOu2P8gmRR+fdnHVAdnTeye7xQ+ceSHr0zjXtn2bwkbPuHUN 7WC0ON8Z6dHFPJqgVCR66QP5eOnX3L3sgYgZD1GujpPi3aUmUlX20dZcVsdWGF0A2YOEkhdmIVKX LIBjA2ftdZlMCkxJKCGSmUjkWgl9mPHGpFjfCdTSo1ezrg65u9V7oAZmf5D73p/KS4YfmB9Sb+pU KMoeY7Fj4RB9BYoMxCrf12k7QfXchj9aGHgNUOEGkM9XNrbL4nj7X6c/06O/r7Eg5NHrEjnRNqJE UhEghFQkz3fqAh29tFLu3qR5kulOzftPTmt1UCyVRgBG9oErQAgMWwiQQRk/T0kOlmWpnuk6rEDD hY2WuivWjhgLXh/XDugRIIQvdp1wBQYAhm1d6OphXZxTBpCAsCXV0IaIuheRUTJN05+al9m/rYef v9O7rY/v3Oy85InIECi3wKMS8o9dJs7HIVbi2gE2FzsUNT6ZO06ZZOatFeWy31dMw4MzVnBw4mP9 2yMaQWzOuNd+OcrN7Ul0fprslPfGsSLIM1dgIhm1yevGk3FDNm9nHshldHGVBGl53urndJBSkFw/ kyT2XygsPbwN8+TjRA/Mc0jKOaRdewX+hHUiSLDwi2HIntml42oay422vUAKUnIwa0zkvy2fGM+5 o7HJtorajD89iD9+vXzAxcG5cIkYHtJ5BEvYrXZ86EPPZCM2DmNJ3NgmzvyNJyU0vtw03AvrCLLZ 6o1NISmMvRc1ZR0SK6WoiAojknW4Rr6MDNlRjauzuECuUDJf4DAvjosXCIavx6X5eWGzaktTg5CT TDv6S0by+2otSd+NBWZqlDtfjVxMiU7+EJ4X0cTCkAyGYIi+pFP5nQgrSXAH1ywbgGPV2vHbcqij ErlWz6bjAECKwY9sGBCQ8rrjzcdeZ50g4iIbWXnE2Et8kgw89qBMzf6bqX+fNSfEw3M5SNunDPGm Z7Yi64tPZ1dnrUMkvYxexs86ZIgzRab76YYebMTRdLpd0M4WWnH04ahVUW0blKBsbKuCcN2Azwh8 QayRiFF+dtM08lJjjROIBDnxjN2xypQxSTdAte+ZOlgI6eN6M4sAweOlU9JBEDxL1yfxInIUmUh1 0S552in0D+cMwVxYWo7a3mZJD1aMmuUURjCPGOZ1oJFEcXyvrAeeivBhQbzVcOD3VEIzwdhed37V uJmbTHhveuO2OWMaOt7iobXkZvcP3BmBQ1tdQrMKjTKGVrM4BBc8oOiGTVhLUdrwwBCD+fvxELO+ MzpOvSRN73O0wCYsieRZOrT0ZmGY87EBhsox3biLC5vkYntoOB7ZzKsxqGijCyUinM7WIGPJrvtH R7ZrtiPOe2Osx0yF3OgMwUIdCfuLrTzaWrHKS8Ekd4DMNAnJbWhHOXxxXcO1CVSx4YpSzgMCPKtt 7I3tfTLxNoGXZ+ZQiMpxaigaMO+3WLa340giSdZtxnnqN+eiu4JAYd0xBPeZO1dUFxU8dcWxd1Cj pC1hX1Ik3nSIoGXd0ae/ggGHSW1FsyAnUFOtkFtb3B1EXMc3Qz4yIdpXEg6bc2G7iBtlCeqnHbAo y0RFrZAxAhwoqDS4WU1JQTvbh1QXXVRdBHQ5MCXgbYUShNaKQGB60jaalpSSY0O6rB47YGcZpj5c 1udIR3VcFhdu11dPUftma9Xe6nPrSIQ5ppAEHQ3R1BSsVbu7kC4GB4dvrcEju/YJFXLmz6MeW/GS 5JW02vTWX27gQYWSAXrEl5MgR4eG5/Heyy6m3QXt+hwkchL4aZNB3R1Tdjq2872YprVPSBwsUOYV n+P5+8YTm/g18h15Z69bT3YHOMiRhl3yHbfKZQRkaFf2bpu86NEp+jg0OWvtq65T0vHWYaZ+Uqo/ eZUgiwxqO3h4X4u7qz7Ps8uzfpa2VFNM666q7LfSeaTjjvhaDKUQM1WBI9F0PQt2MkmKEhiFeRLY gQeGveQAL8hqTyq4iA+8Zok93sgTJqyAu5r1xucZioOM2UqwLC+RTAAWfVSb3MjEeKWeD1yloHEI zCnWbREw1NiN+TfAkh36BMMxJh4XTM+ytMTGE0dlercjv2PwgbZI7gEE10teg9A4uxwfT7m5ceSG Afzcmk5rnEhbHOPaApYXujiXmKFkGhjbSDR6JGynDQTnFqVtO6xdOxkTICoVGXjKlihUMSY0ZFsB Qmm4MK65efFr9fQ5dwU3vB1dlHhhWHhlObTVJ7MYkXRS/BpTx9R08uTsrh2c+QQiLMwwwJCbsZvm 6kMR9/qHzUyEhWg4IRUbjDASFAgScghEAfeQYikMAViD8AxArEydxVlD5EyDZPAkbWx5CQoKEqrE oFCXCA7lsT4mRBbwU2V+uxreBmCEX4jDaRBQBXKwkXh/H7WLj6CpmYm5MzOpiX5XhllXU9OZUsYq D5mhoXoXdABu0t8nCXdix5wkKN4hCrEADsc5ud6QE+/vwLkPj4GPY7CQu0gMhghSNSVF349Dyj/o 0SS5YrRoRHJmZl0NDMy/HpcZJHQvQjLqryqW/c0dvDur5PTW62FdqYT5aY6XUsaoSmb6GpQyPI/Y CGFrkG21NQFggrLtBbE+rpwcieiBYGpgaJlSLEgBYY3m8poFVAcGJyN7Ei8uFeZm5QxJn0yL+tx7 sjQD3cihldkdDQaXM1XUSKKhY3ChQ+oxLHcqRwQYEHUwPOxeMscitV6qqBMogMA3JnM+AdMC7PoX sG0biIcp/jQKRmAL/e8N7+twhAWQiDajMDHLwdgzJKjBCogTNi7g7H4PQNlXBAtexNaaZGpHOrth PVYUlRUQOUikStWQ1naZeIzUUpCiRpLCCEtaBYYcihVAXbXdBnPC8impkQM1KEG5ib9jjgzQLA7D 6GJd1ODn67SNzgscyhmVOZmWPd69FwflLviZ+AFjkJHkpS0mJvShXW/odDsY1F0wLD8u5XAuHXMy KlwYYY46HkXljQ0MTS0y88tjgtk1cYHIgliGOoSJghcjtLl4qVOS9INTM9CnCwqe40Ni4EcSN+pU 5huX/AnK3IkdGHHGpsVJzyLi88GWxkbGRYyMplTkYhoTFkXncqeYZL2QL346nzAFr6rvv2QWBplI EEMFew5CzTApU77i9MddlFV7gK1T0NaYChKy1ySD5HUg7FChLWZcqrDxqp46JVMBl5JcDmNjO5ce peXoCnI5GdTYAWIbLMzzMCZUxMzIvMzzYdSyA0ggsbnBIg+szISRMgggyNSZoXHPAx4zM6G7Lj1L kupBhO7vfxpfBKtgcg0nTK7WLry+5ApBeygkLgZ8hIZ3DoWJYXrCZ3PRYgC2KoFzLGVplyJmYAmQ EwfLzMCRuQbEgBaqDsYKhTHEsSYTuOxYJmpkaVIxNbJl7mYGEy8wxJBUzLzEwMS8zNTA7l9SpkgK IC9LE9xdQ9cT4F676490LGLSiICc+dd9tipclJpekzmenIwysYTJoFgXlDMoOD1twX7WzNCMUQeR yJWkQZgCg0QFTQyscZcjC4xPY3n39+xsZHI1AFsZGQzc0IXl5AKCpY4MjUmbhwVGZlDvgYF5kdC4 7m5IkYFTbO15o9zvCcLmYV8FSqArupFEpyJm5KhaGXlciWpqaMgoci8wORW8kMqXGxgZ5FTA69by t/bg2LaHB1LyeGJmHI1NjEyK8u3MBXlCpwXFQBZhgTODEYzUyKHU8zcAX/aBfTn0Y/EeMufjJIJj rTkUK3aV5WsFKzhkzvyMVJTZ7srieYdDHG5dixTQxKmpgU0lkdDmfFL3ZbjMCh6pTMS/Gw81yMNh 7nS8nz8am5aA8iDmaHEzmeEAyhgT3DI2OZPU9kCxS8IFvrHBiZDK0pf3yLQrrjnOJmRudJZIQh4d diR5lCxgWQGN3p2DobIC46lsDYmY8jM3V9jUgsFlBU6jJKktjgnmSLElfqM20OC++CNe5wbGpoam oMoczY5zKRy0xEAmVVjYRim4zJNR0kjlUTd297qnrdsJW6AWfaFu12Ybc3bYhJFaSATi8iiSIQLb udEh6ZIeAn30ny7z7XXKwUYqLEVgow8QhaqhFVFFRVU8xIIFUkkkkkknlv8Pt84p0cm0Kaacwo2d 4Un3eRzk7+F440rP8lsSHQyDCCqOvh10e1T5xP4QkCE3vt0d+zEcqQ/l8/p8m/eF99AlCW/QfZ1L X0EUE7n02eUgEZNj5PZ6sFvpKH18ii/Ud8+vjTQJf5M6MNuJEtg5VJCbNmDyjynylOIJDRJ/UaNG HkZIfYgdSCwihBTpYErD/G+lbQTQZwaDNyVR/CiaX3bNschI/presspNhEX1G6GR5/QeDCHOxVIK KSHzsgXylDzZZO06LD39YRM3PKX2Mu9wan8Tzw/Bi8bXys82mkMRWEoIxV4rDoq+O0FOLUmCttlJ EpSjIMjIo8vjD4nwPeSrEkfqHPefEH9xgzjnRzSIYhz20ESJpsJmMDOfSaCofUXkN4zij9RnLjfO 6nVFHA/jlSQWFxmBz8gBR++Ls3IaXR5ZSwYjJviZKWvUYZ5Q6TZ63T27930dBx5ghvf2MjEirKkt aoyBIsipCJpJkouoxBtS5KBDYYDSfccpkc5uak0FBgLFlY+015Bx3QJ02M9s4ihOwt7IzuDkfoE0 w/BJDops7L4uv5SjaHzeLcqQgMwxPGqbnU6iMEoQKicQHARtReJC+nd5Q9jcbwYnmGUjUaWsbSmW 8/e5MNsALj1A4W1ZDS0O/XFvwhvQ0F50FRL8XZBoaolS0OLQSjJJIxUcI4tR84SYahtdxmLuNj+q DDiaY028Ogw+ZOFPFLljRCfslsA0oVvXKykw2+51M8WDiAbpadoMiuU62dEiaR6SBG9kZhm/HjSK 0yOfq7YERkI7TITUpv2lBiM4dxpKzvKyqkYIEBjhwtLQmcDYVERio85tjjLkBgD7DE5bjGcjExPd UZeVNiZgQTNC4+0zNCpiAWHAZyrqI3hOAm3Kws8vKVAHZYUkZIiQ3SKObrlacdtEr95QTsFQoBxK pwkz99UhUzYxEUt8DSZDjM4c5A1GYNJIiX4DEazYTqbHoVGVvQFj2w1LzUqVJnoXGRUwNToYE7Hq VODsdBgJiK8z+5AM0JmZoalF35BQsW9vS3lKMpQSZ2NwgrP3SVFy79+xir8jId7HDhrPTX8m6iG1 hb+Ji9bMYVlIQKRAuBuSbhRmaOVIID5y/Owg+jeiPGME+pGQO7Co0Q4GhYUnI6jZuB2bobggliFW y320z2LXJrUdGmgVtPipcCyQql2ZCsyvBMXJa1i5hmN8KXr1mS7UMwo02piFQxdXTlESQaawzx0L Fy6GKI701hQQwyDlBzlwUosGWccY2Hd0WjWDFhAwbik/aNQFQyNAFM+JSxsOxqYISMxa/IgSF4Gd RLQwGVNTkZEFkXhQ0JB+pr5Z3GhUka12iG1v45VF9o7AKq3glRL5nUnMOR3rekhmSrfjM+LChQyC S97FtNIgTM4gzbYNnm1DGWIAIuEePOvUPfm/MP3fLeW4Ho9O5kXi6tDRWYiQy+Eqns4gPY2+A5em sWGCBg4eJh7oBhBH2iIYMDYjR0XzFSwuRpZUP+aOFru7YezjBN/vZoSweVRFjkfFG2FIEocovoxA pudne9ZupecHBFPOXEDEhBGui8rhAkFoRnlvs18qOh0ueSQQyBCwyCDNFIXLGw7FrCL2WxWatSmM c235rDK5HKMcBkQQRjrsbTus2QNXQDTCwSEjy+vloVmF/R1HUXjDHKbxi4gUHmKDkDiWhtjB5mRg 5nRUUGtjzGIxEComGI4zGdJeVky4pNQwc4kegkbVzSD0YRObYkeECku5yNA+V/q30TD3D9vzkBk/ ZRu2xXqa2+COhgcHI6kjwdz8c/XdamcEzfkc0btQOqkX94J1H2eLItdJ4JBJylpJ3gIZLuhXilpx TxrZ29Ey5iNJjbVaeocDoO9fEO0BsxnIGUmR67l2HGUUmDMsO5rKr1iM6fOxcWm/fSfK6EdZLDsB HrmprOfxn0ef64MV4Gjkr2tA0PdqaXzUhjYy607G/r8KpXFW3h78JjV9J/ASBcE/a+QbCbStKEI1 vuQGuhYEVlZJEzYUL9Oqo6xMBSPyfYXamP6H4kJIVwb8RY0IMo220c1LAhy4aQGEufQJUwXUt4xE Mdd60pEoH2Kw98QrCVGFJfcNWmFSog2chjNtIVpooSAbHL6h8m1ONqEb4ItuzTHg+7/CzuRxanGT 8iXmayG5AxFcSKqj6RdhWpjU4XHByGBbsWiJmYCBUOAMTaGs3TB147u873M0kJmfNSzrLQQeebSe NLKhIilATW8JpyyuNaYx8sHinHFa7ue0vzPUecmMaR6N5oOk4HfQMrSgiHgU1m0AVpWcOHaSC8wM PlM2D1LGgalj2Xoc+ad9Tc+4ZgZkpjPQzDobGxJJGYypHPnl768ypoYGp5pI6j9gGXSHqFOSicse cU8FFTf3Sk3gaAGwIxi6DS0mudG7+ZEQbWM8iC6RiZ5iYB+5kHcdjtgws5KKEXMwyDqEezmV2Yue azaFAvAFm01fpPklSRVwwbBJ1Y1BdF68B5y+23SFmkK/Utc9mKVT1ijVa4X3wvs5kDNg9dbOJSM0 TOe4ceXZ2qve9orkZKqtT3sLrR+rW6TDZnWcPAWWiplcQr54tlUOW0CyMqpnKj0xnz0GkJIsURNW wUgiIxZjIVJm9O31K4wEioFBo/guGSJNjbHjSpWZ6n3IFzsK8vK3Rc5QMY2CHuYfH3heFku/h3GB OFclShKMCSV2oOtBs7Jp7Kins4bU5eTf6DtO61RhIykAFCk3CRUJCuOmJq8CvCTJWNP3kDMIWuMu i63UEfiHIVPSWzBgmjvui6tRMXz+xCRnYB8vQKqv57uMR1qIDKk8id6Dy4AU1N9ihrkgJZkvjO7o 3AO7REF4TJQS+EVAkhIwkFIkiD3t/VAbs7ecA2rnSyqd2MvipNqG5iogJvfADMOI8YdsCMPRyBIY strCtuAEDxpzZP0fv7/PHqoW143FF5E5UGELNGayovfSVVyrhSZUXhjTDJM320enszTRVIEXMhgJ tQfCRv1A0KnqvEuhDDtsA2222DGJDTGwYIbmHZIXaghQjNnbIuWOEB0dobhF/kxaDV2FjIx+e2fm Zq0zzHYHwkiPzHQaqwFgo85fiNx6lgJFC36ZGqpHUY1ZEdmQhsfchyjU/JRffOPtMJSi/U4S5q8B fUgVyPY2gFfmUeNnLDm0TqHl3L01Ax2WmqaTKyGtaw9yUn86yKiQpigcg8BgYAK+fmAJq2YXnhTZ 1Q0bZqfl5vdzYENniI5vO04VZIMTFjWwoYIgO0pe0LNMSPzI1YKkkkdTJ4gaF27bcGgpRAW2Jmgh pc1DTRwE3ceGImGj45JJonT3dgSZwBOPrdsoUf0Wo1iy/Cl9uyFm+sI+K1zY2MbYNmWS/L3IKF8d UoPuMCSlnJGRNo3yJ1+OBcw7ZSMCQ0/VCLDU2oGYsDwc5YA6ATLagXR1BUu87UBQioV+wSE/K68v HD4nweds75fT73fNkeCUnbw8OxFF6GFIRA/iQgU69iCtw7DqYSkHSPLuVSErYFcSyIsH32vMbisR 5QBTJJF8A0iVu8LIGXfT8rSH3+Y8WcGYIU+PKGJ6GZl4NxtiBUa2W3TpNRNlDMJTY+rNaNKbLV1T jhpwubdbNtVYW7c8NMx30rDYhpeqAIboE5opiRUSBTIG4ILSnASNRZsJuBI8+UXT9mXueC8qvDkG g1IOVYFC2ErWqNsGBHQQoVefRkJgpjFhHExKioMTbbUovV06GR6FLNHn6OCswV8AC+LSvCtaOdLL BTdeDzBpwvvOHBwqk4BuKHmIWhuYcJvjJ2GGGdPNwOY7yZbMhgBEtLJxaGMKg2QoScBN+qxMsM5D 4fw88hO1J2I+UpWSsFPYZjBtX4Agk4apFJz0hxWEiSBbxB8mrYm5bn1KJXIMokoVlJXAWSTUmA/w kIAwEhXViyNj+VhE5yBraMSNMLaVusyMjMGVljrZSE5hvZuNwHoR9oXtPTESN6IwCL6r7WNpVt+t tPQ0DmOhmT+jofs1XyfyhxDMcL1mE8htGUENMH+jp8ZLwcWSFR0OgMUEd5CICggsIXrMkzIdL6ln DlJGOCnUyN5MYnvQpezxWpmQtcZc39oU5U9CQAsYG7fK8nQA6+8t4eb66lzmQfEosHDDccARDpEh Sc3BS2JPnstxlh/iGSnEGXY2WmoCOqD4ivwQUgDNhsMFTHe6TI0G4UG1Is3ij7RTqBOvf94981Pg ZjOfajvoicSHUCobe2pUKs4KyUSkhGofa0m7wkUaOGgq32nyLNT+dVQYkSgzBAaBOEcu6BUPB3Nu +nk7Dq2btPFOKrJyTbhWFZndxJjWaZmMFCGS2mscylumxcW2KxMSYyoZJ2MngPM8U5zm+NAyQmjz 4TIdBnIydTLQOblkq7MKuI2lhY2VVGJvO/93pOGs03Wzl1mJiUrNLrueki4YyhKSjlMVTBgDbbYX MV8Q/IFhVARBtfi4CtS4jAyZm8kvaZiV5f62ggwiAd+YsQhwsulB4W4nlBS0hbuUwFvGFIm6qfJ8 UpRYgNlLGqDSQSMSAKC4Oui9kG06LObgHJ4y0CLyRRSWMPWpCgoOFazA73gJDdtP+7ThAOaurbSl TjDIGBnwIPuZ1309bfGPruJyZJ4HFoJQxwz8NqUG8fKAtlN05u0nTKxc+9aDO9w9yJLqzqi4xlxY 2tZZeCI6JXVGxxjWa7xtpqWDCzrBZGQ/u3rObWlKmaWXBUvW7thfCLgEKw6zWaWbbW9XFAoBC4d8 tyk+mW1TPGMmaZwYDcXaTlXg2ZoUGDGepqPegVBebCsNeDUJCvv59xuSQwkP7kc3rGvNQPx8PXTt SpRQ2yU4uaboPzjPsXmhqQOMQPNBbSHBTfPhJjmyCshgj1oJtFM1qpWPmmKz9eQCzrKap+SP1ZqC yuHggXuWBHFTMSJngVUGpCNzJiVBHpdgbaMBaYHFInycqTkNHDIEhw3z2mX0nKYQSuIg+CJzZaDq gW/KTTaeOTgLK+CjUAyzDhyTnm2SwzP1ab4/eUBwqjifchhh3HngKYPWVJRWSpZUSbn2skhEsAQM nGmlZM6WJjRS92wZfXMyJnwlNPN6p3E6QCRl5B/h+U9Ur5zZgJGwJE0uaSMqO+HAQMgyetID3eVj BUhaLbFL7vfWVBpWycBF2W4tbrpIDtfmldCe8wMmIp9MCmsB0SKjQBh74D42UtpGb+OplkFTf3jN kHSTICFwccQFrcyhIQsIJRcofVl1RbgLUuXLkIpbNFm2pgHshMZookJsqflqTnX6UyU102NUAEmh dUCx3z0A1Ei32GlBAf0sRDnppDdykTW68Q2UBaDpzicXEj3gjXrZzAWRu5zUcgLKgkVNBIqGMqp4 IueWZ9BwZqYzH/3NQ0I8nR3nFBIyYcgS9TbnPzq/b+OuJ9y/togPxlk6C52s2MepM68gRQhtHpHc SL05N06N3GOFgSQGExwYSt+JI6Tx8wZ0U7rCHb5mkGta2RrWtNIcTbsrD5tBYxnx6afWq6ALVpt+ B4sAKZSMBC1wbmca2Inr2ZTmj5BmG7ZIHJWzW7PQATrNstYs0XRK8nxw6CFZAZH4bnOBtNDGmDZU 5wg0wLD3cE8+cJIc4nh/IUJ1Gyx3hQmB0WE9VqF2ZIJ0wIkshOkQpPxDzuVcUXz+kcY9xUV+g9g3 eUIcZSgV9JHDsHSQHuQLwAKSA4Nevp7sZK88RalYrOJwh1iU60itBuTadi1u81egKxAgIvvIUyh5 ACn/R6a/owOqkihBeWlqJk68L6RkdmKeFkdhWROhkJFOs2kC3Ag0gKDbrLFDhqu2lS1GcgRNQxz2 0TfR//B+gu5IpwoSCiJrhqA=