./0000777000000000000000000000000010756166723011376 5ustar00usergroup00000000000000ABOUT0000666000000000000000000000122610756165231012030 0ustar00usergroup00000000000000This appliance is one example of how a basic blog might be implemented upon the web2py web application framework. Some noteworthy features include: - Registration and authentication required for blog editing. - Use of css for graphic layout. - Multiple views of blog posts, including by number of comments and by most recent comments. Some things left to do would be: - UI for editing blog posts. Currently, it is expected to use the web2py administrative interface. - For entering blog posts, perhaps adopt a wiki-style markup instead of relying on the poster to enter html tags. Our hope is for this to be a great starting point for a full-featured blog. LICENSE0000666000000000000000000000311310756166723012244 0ustar00usergroup00000000000000Copyright (C) 2008 Kenneth J. Ore and Damian Gadek. All Rights Reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. 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. 3. Neither the names Kenneth J. Ore nor Damian Gadek, nor the names of its contributors may be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact ken_ore@hotmail.com and d_gadek@yahoo.com. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 CLARKWARE CONSULTING OR ITS 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. __init__.py0000666000000000000000000000000010745732752013337 0ustar00usergroup00000000000000cache/0000777000000000000000000000000010756166365012306 5ustar00usergroup00000000000000cache/cache.lock0000666000000000000000000000000010750411700014165 0ustar00usergroup00000000000000controllers/0000777000000000000000000000000010756166365013611 5ustar00usergroup00000000000000controllers/appadmin.py0000666000000000000000000001244010746522770015750 0ustar00usergroup00000000000000########################################################### ### make sure administrator is on localhost ############################################################ import os from gluon.contenttype import contenttype from gluon.fileutils import check_credentials if request.env.remote_addr!=request.env.http_host.split(':')[0]: raise HTTP(400) if not check_credentials(request): redirect('/admin') response.view='appadmin.html' response.menu=[['design',False,'/admin/default/design/%s' % request.application], ['db',False,'/%s/%s/index' % (request.application, request.controller)], ['state',False,'/%s/%s/state' % (request.application, request.controller)]] ########################################################### ### list all tables in database ############################################################ def index(): import types as _types _dbs={} for _key,_value in globals().items(): if isinstance(_value,SQLDB): tables=_dbs[_key]=[] for _tablename in _value.tables: tables.append((_key,_tablename)) return dict(dbs=_dbs) ########################################################### ### insert a new record ############################################################ def insert(): try: dbname=request.args[0] db=eval(dbname) table=request.args[1] form=SQLFORM(db[table]) except: redirect(URL(r=request,f='index')) if form.accepts(request.vars,session): response.flash='new record inserted' return dict(form=form) ########################################################### ### list all records in table and insert new record ############################################################ def download(): filename=request.args[0] response.headers['Content-Type']=contenttype(filename) return open(os.path.join(request.folder,'uploads/','%s' % filename),'rb').read() def csv(): import gluon.contenttype, csv, cStringIO response.headers['Content-Type']=gluon.contenttype.contenttype('.csv') try: dbname=request.vars.dbname db=eval(dbname) records=db(request.vars.query).select() except: redirect(URL(r=request,f='index')) s=cStringIO.StringIO() writer = csv.writer(s) writer.writerow(records.colnames) c=range(len(records.colnames)) for i in range(len(records)): writer.writerow([records.response[i][j] for j in c]) ### FILL HERE return s.getvalue() def import_csv(table,file): import csv reader = csv.reader(file) colnames=None for line in reader: if not colnames: colnames=[x[x.find('.')+1:] for x in line] c=[i for i in range(len(line)) if colnames[i]!='id'] else: items=[(colnames[i],line[i]) for i in c] table.insert(**dict(items)) def select(): try: dbname=request.args[0] db=eval(dbname) if not request.vars.query: table=request.args[1] query='%s.id>0' % table else: query=request.vars.query except: redirect(URL(r=request,f='index')) if request.vars.csvfile!=None: try: import_csv(db[table],request.vars.csvfile.file) response.flash='data uploaded' except: response.flash='unable to parse csv file' if request.vars.delete_all and request.vars.delete_all_sure=='yes': try: db(query).delete() response.flash='records deleted' except: response.flash='invalid SQL FILTER' elif request.vars.update_string: try: env=dict(db=db,query=query) exec('db(query).update('+request.vars.update_string+')') in env response.flash='records updated' except: response.flash='invalid SQL FILTER or UPDATE STRING' if request.vars.start: start=int(request.vars.start) else: start=0 limitby=(start,start+100) try: records=db(query).select(limitby=limitby) except: response.flash='invalid SQL FILTER' return dict(records='no records',nrecords=0,query=query,start=0) linkto=URL(r=request,f='update/%s'% (dbname)) upload=URL(r=request,f='download') return dict(start=start,query=query,\ nrecords=len(records),\ records=SQLTABLE(records,linkto,upload,_class='sortable')) ########################################################### ### edit delete one record ############################################################ def update(): try: dbname=request.args[0] db=eval(dbname) table=request.args[1] except: redirect(URL(r=request,f='index')) try: id=int(request.args[2]) record=db(db[table].id==id).select()[0] except: redirect(URL(r=request,f='select/%s/%s'%(dbname,table))) form=SQLFORM(db[table],record,deletable=True, linkto=URL(r=request,f='select/'+dbname), upload=URL(r=request,f='download/')) if form.accepts(request.vars,session): response.flash='done!' redirect(URL(r=request,f='select/%s/%s'%(dbname,table))) return dict(form=form) ########################################################### ### get global variables ############################################################ def state(): return dict(state=request.env) controllers/default.py0000666000000000000000000000400510752401550015566 0ustar00usergroup00000000000000import datetime def getpostsandcomments(): blogposts = db().select(db.blogposts.ALL, orderby=~db.blogposts.datetime) blogposts_numcomments = db().select(db.blogposts.ALL, orderby=~db.blogposts.numcomments|~db.blogposts.datetime) commentsnposts = db(db.blogcomments.blogpost_id == db.blogposts.id) comments = commentsnposts.select(db.blogcomments.author, db.blogcomments.blogpost_id, db.blogposts.title, orderby=~db.blogcomments.datetime, limitby=(0,10)) return dict(blogposts=blogposts, blogposts_numcomments=blogposts_numcomments, comments=comments) def index(): return getpostsandcomments() def createblogpost(): if session.authorized: myd = getpostsandcomments() form=SQLFORM(db.blogposts,fields=['title','post']) if form.accepts(request.vars,session): response.flash='new blogpost inserted' redirect('/' + request.application + "/default/index") myd['form'] = form return myd else: redirect('/' + request.application + "/identity/login") def showblogpost(): myd = getpostsandcomments() blogid = request.args[0] singleblogpost = db(db.blogposts.id == blogid).select()[0] singleblogpost_comments = db(db.blogcomments.blogpost_id == blogid).select(orderby=~db.blogcomments.datetime) db.blogcomments.blogpost_id.default=singleblogpost.id form=SQLFORM(db.blogcomments,fields=['author', 'email', 'comment', 'url'],labels={'author':'Your Name', 'email':'Your email address', 'comment':'Comment', 'url':'Url (optional)'}) if form.accepts(request.vars,session): blogpostupdate=db(db.blogposts.id==blogid).select() if len(blogpostupdate)>0: blogpostupdate[0].update_record(numcomments=blogpostupdate[0].numcomments + 1) redirect('/' + request.application + "/default/showblogpost/" + str(singleblogpost.id) + "#Reader_Comments") myd['form'] = form myd['singleblogpost'] = singleblogpost myd['singleblogpost_comments'] = singleblogpost_comments return myd controllers/identity.py0000666000000000000000000001053610752370462016010 0ustar00usergroup00000000000000import md5, random def login(): form=FORM(TABLE(TR("User Name:",INPUT(_name="email",requires=IS_NOT_EMPTY())), TR("Password:",INPUT(_name="password",_type='password', requires=[IS_NOT_EMPTY(),CRYPT()])), TR("",INPUT(_type="submit",_value="login")))) if form.accepts(request.vars,session): r=db(db.user.email==form.vars.email)\ (db.user.password==form.vars.password)\ (db.user.verification=='')\ .select() if len(r)>0: session.user_id=r[0].id session.username=r[0].email session.authorized=True session.flash='You are logged in' redirect(URL(r=request,c='default',f='index')) else: response.flash='Invalid login' if form.errors: response.flash='Invalid login' link1=A('register',_href=URL(r=request,f='register')) link2=A('forgot password',_href=URL(r=request,f='retrieve')) return dict(form=form) def logout(): session.authorized=False session.flash="Logged out" redirect(URL(r=request,c='default',f='index')) def register(): import random, md5 form=FORM(TABLE(TR("User Name:",\ INPUT(_name="email",requires=[IS_NOT_EMPTY(),\ IS_NOT_IN_DB(db,'user.email')])),\ TR("Password:",\ INPUT(_name="password",_type='password',requires=[IS_NOT_EMPTY(),CRYPT()])),\ TR("Password (again):",\ INPUT(_name="password2",_type='password',requires=[IS_NOT_EMPTY(),CRYPT()])),\ TR("",INPUT(_type="submit",_value="register")))) if form.accepts(request.vars,session) and \ form.vars.password==form.vars.password2: key=md5.new(str(random.randint(0,9999))).hexdigest() id=db.user.insert(email=form.vars.email, password=form.vars.password, verification=key) r=db(db.user.id==id)\ (db.user.verification==key)\ .select() if len(r)==0: raise HTTP(400,'page does not exist') r[0].update_record(verification='') session.authorized=True session.user_id=r[0].id session.username=r[0].email if r[0].password=='': response.flash='You must change your password' else: session.flash='registration complete and you are now logged in' redirect(URL(r=request,c='default',f='index')) elif form.vars.password!=form.vars.password2: form.errors.password2='passwords do not match' response.flash="Form error" return dict(form=form) def retrieve(): form=FORM(TABLE(TR("Username:",INPUT(_name="email",requires=[IS_NOT_EMPTY(),IS_IN_DB(db,'user.email')])), TR("",INPUT(_type="submit",_value="retrieve")))) if form.accepts(request.vars,session): r=db(db.user.email==form.vars.email).select() if len(r): key=md5.new(str(random.randint(0,9999))).hexdigest() id=r[0].id r[0].update_record(password='',verification=key) message="To change your password visit: http://%s/%s/identity/verify?id=%s&key=%s"%(request.env.http_host,request.application,id,key) try: email(EMAIL_SENDER,form.vars.email,'registration',message) redirect(URL(r=request,f='login')) response.flash="We sent you an email" except: print message response.flash="Internal error, we are unable to send the email" else: form.errors.email='email not in database' response.flash="Form error" return dict(form=form) def change_password(): if not session.authorized: redirect(URL(r=request,f='login')) form=FORM(TABLE(TR("Password:",INPUT(_name="password",requires=[IS_NOT_EMPTY(),CRYPT()])), TR("Password (again):",INPUT(_name="password2",requires=[IS_NOT_EMPTY(),CRYPT()])), TR("",INPUT(_type="submit",_value="register")))) if form.accepts(request.vars,session) and \ form.vars.password==form.vars.password2: db(db.user.id==session.user_id).update(password=form.vars.password) response.flash='password updated' elif form.vars.password!=form.vars.password2: form.errors.passwords2='passwords do not match' response.flash="Form error" return dict(form=form) databases/0000777000000000000000000000000010756166365013172 5ustar00usergroup00000000000000databases/db.db0000666000000000000000000003600010752402166014051 0ustar00usergroup00000000000000SQLite format 3@ / 4#43%%9tableblogcommentsblogcommentsCREATE TABLE [blogcomments] ( [id] INTEGER PRIMARY KEY AUTOINCREMENT NULL, [comment] CHAR(32) NULL, [blog {tableuseruser CREATE TABLE user( id INTEGER PRIMARY KEY AUTOINCREMENT, email CHAR(32), password CHAR(32), verification CHAR(32) ) %%YtableblogcommentsblogcommentsCREATE TABLE [blogcomments] ( [id] INTEGER PRIMARY KEY AUTOINCREMENT NULL, [comment] CHAR(32) NULL, [blogpost_id] CHAR(32) NULL, [datetime] TIMESTAMP NULL, [author] CHAR(32) NULL, [url] CHAR(32) NULL , email CHAR(32))P++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq)ZtableblogpostsblogpostsCREATE TABLE blogposts( id INTEGER PRIMARY KEY AUTOINCREMENT, title CHAR(32), timedate CHAR(32), content CHAR(32) , post TEXT, datetime CHAR(32), author CHAR(32), numcomments INTEGER)  user%blogcomments blogposts   on and answer where I stand on the question. After all, I asked the q5 o3EIt does seem like the effort has gone up. The speed of play seems a lot higher throughout the first 4th of the game throughout the NBA. As long as games aren't called because of rain again the playoffs should be extra exciting this year. 12008-01-28 11:08:00freezershttp://www.aboutfreezers.comK 139Not for Knicks fans. We are sick of the Isiah/Marbury controvesy. I'll still trade basketball options, but you couldn't drag me to the Garden. 12008-01-28 11:07:00FLChttp://www.nofavor.com E3?You can tell the difference in the intensity of play on a day to day basis. Its really exciting. The West is so stacked that even for teams that secure the #1 or #2 seed, they could end up having to play against a team like the Lakers (who will be at full strength by then) in the first round. Whoever comes out of the West will have earned it. 12008-01-28 10:59:00Jake Khttp://www.lets-krong.com g QG3!Is this the best NBA season ever ?

I haven't done the research to find out when the last time 7 games separated one conference's top 10 teams, all with a winning record and playing good basketball this late in the season. It hasn't happened in the 8 years I have owned the Mavs.

This year is shaping up to be a crazy one. A 5 or 6 game losing streak and any of the 4 teams who have had the best record in the west over the past month could find themselves out of the playoffs.

This scenario is not lost on players or fans. The feel in arenas lately have been very playoff like. You can feel the energy as fans know what is at stake. Players are looking at the standings and paying far closer attention to game by game results of division and conference teams. They know what is at stake with every game.

2008-01-28 10:17:00Mark Cuban 33e30 3sdfgsdfg52008-02-05 16:29:03sdfgsdfdsdfgsH E3!i shoulda won the superbowl!12008-02-04 07:49:52terrellwww.to.comG ;3!#i am another comment!!!12008-02-04 07:47:25psychostikwww.esp.com935goforit12008-02-03 23:32:29kjohttp://www.what.everJe3]AOne thing I have learned about many of the young people of today, they are very short sided. The future does not exist to them except how they play it out in their minds. Basically, many are complete idiots that really have never been taught right from wrong and therefore wrong is what they see it to be. What he did was wrong. You have learned a valuable lesson. I would imagine these two posts are not going to help much with his future but I am sure he thinks this is the best thing that ever could have happened to his "career". I guess he would be right in case his future bosses are as clueless as he is.22008-01-24 16:41:00Seach Engine Optimization - Terry Reeveshttp://www.terryreeves.com hfh1o3EIt does seem like the effort has gone up. The speed of play seems a lot higher throughout the first 4th of the game throughout the NBA. As long as games aren't called because of rain again the playoffs should be extra exciting this year. 12008-01-28 11:08:00freezershttp://www.aboutfreezers.comG139Not for Knicks fans. We are sick of the Isiah/Marbury controvesy. I'll still trade basketball options, but you couldn't drag me to the Garden. 12008-01-28 11:07:00FLChttp://www.nofavor.comE3?You can tell the difference in the intensity of play on a day to day basis. Its really exciting. The West is so stacked that even for teams that secure the #1 or #2 seed, they could end up having to play against a team like the Lakers (who will be at full strength by then) in the first round. Whoever comes out of the West will have earned it. 12008-01-28 10:59:00Jake Khttp://www.lets-krong.com Iz3=Mark, again, I think you're missing the point here. The content of the interview WAS and REMAIN 473 My friend, this all reeks of a childish immaturity. Will Leitch made reference to you (in a positive light, nonetheless) in his book, and this reference was posted on Valley. He quoted an article that he himself wrote, and that is his intellectual property. Why is this a problem? Because you dislike the blog he posted it on? That's ludicrous. This has nothing to do with 'ethics.' It has everything to do with some outlandish personal vendetta you have against Deadspin. If you complained about every journalist-- official of blogger-- who ever said anything about you, you spend the rest of your life complaining. Bluntly, why such a stick up your ass?22008-01-24 16:27:00ActS solely for GQ. As Will has pointed out in his subsequent responses, he merely quoted the interview on Valleywag - and to extend that, I should point out that Deadspin simply alerted its readership to the existence of this kerfuffle. If there were a blog bill of rights, the first stanza would deal with the inalienable right to take any and everything to the most meta level possible. Writing about stuff one wrote about is a mainstay of non-fiction - and do you think for one second that if you HAD conducted the interview via email that that would have insulated you from Will writing about that series of correspondence? PS - Nice, largely ignored, bitch slap of Tony Snow on Bill Maher. I noticed he didn't really change the substance of his argument when you informed him that in fact you ARE qualified to have a "technical conversation". Bravo. 22008-01-24 16:30:00Microbanohttp://www.microbano.com clueless as he is.22008-01-24 16:41:00Seach Engine Optimization - Terry Reeveshttp://www.terryreeves.com MMMdamianfe0b714aaecbd5c8961+M damianfe0b714aaecbd5c8961994c655d18a0d B +3 /testing comment62008-02-06 13:03:16damianyou@something.comg the following comment "Cuban was not amused and spent most of the interview accusing Deadspin of being the Inside Edition of sports. So that was fun.) " diminish the integrity of the interview itself ? Probably not, but to some readers of ValleyWag and GQ, it could. Unethical ? Probably not. Stupid business, definitely.

For the record, I certainly didnt spend most of the interview talking about his blog, but I certainly had fun at his expense from time to time and I never said it was off the record. Although , again, this was a GQ interview. Setup and arranged with the magazine with no consideration on my part as to who would do the piece until Will showed up.

Which leads to my conclusion about all of this.

Its my fault. I was stupid to think that the guy who runs Deadspin could stop being the guy who runs Deadspin. I should have asked for GQ to send someone else. Better yet, I should have stuck to my rules and only do interviews via email.

2008-01-24 15:49:00Mark Cuban U4 )3 testtesting log in2008-02-06 12:59:01damian5 3! Massimowhatever2008-02-05 16:25:52Mark Cuban; 3;TESTtest2008-02-05 16:06:40mdipierro@cs.depaul.edul =e3!Is this ethical - Part 2

Since the conversation on this topic was interesting, I thought it would be appropriate to add some more information and answer where I stand on the question. After all, I asked the question in my previous b: 53test789can i get a wootwoot2008-02-04 07:03:03mio log post, I didn't answer it.

First , my opening comments as Will and I sat down for the interview. (these come courtesy of Will in an email to me about this subject)

>> WL: Okay. I want to start off actually, this is going to be
>> just a big Q&A, pretty much straight up and everything. So I want to
>> start ...
>> MC: This is just for GQ now.
>> WL: Just for GQ, not for Deadspin. No Deadspin stuff, and no
>> ... yeah, I have the journalist hat on. And I have the journalist
>> hat on at Deadspin, too, but anyway, let's ... another debate for
>> another time. >> MC: We won't call that journalism.
>> WL: Another debate for another time.

So i made it clear that I wanted no association with his blog at all.

Does his writing a piece about me with a link back to the very item that he knew I wanted nothing to do with constitute a lack of ethics ? I think so. It certainly is a major fuck you.

Does makindatabases/f6db3e6e66dc0b6aea6b47a87ef29c1f_blogcomments.table0000666000000000000000000000056510756166444023731 0ustar00usergroup00000000000000(dp1 S'comment' p2 S'CHAR(32)' p3 sS'name' p4 S'CHAR(32)' p5 sS'author' p6 S'CHAR(32)' p7 sS'url' p8 S'CHAR(32)' p9 sS'blogpost_id' p10 S'CHAR(32)' p11 sS'indx' p12 S'CHAR(32)' p13 sS'timedate' p14 S'CHAR(32)' p15 sS'id' p16 S'INTEGER PRIMARY KEY AUTOINCREMENT' p17 sS'datetime' p18 S'TIMESTAMP' p19 sS'email' p20 S'CHAR(32)' p21 s.databases/f6db3e6e66dc0b6aea6b47a87ef29c1f_blogposts.table0000666000000000000000000000045610756166444023253 0ustar00usergroup00000000000000(dp1 S'numcomments' p2 S'INTEGER' p3 sS'author' p4 S'CHAR(32)' p5 sS'title' p6 S'CHAR(32)' p7 sS'datetime' p8 S'CHAR(32)' p9 sS'content' p10 S'CHAR(32)' p11 sS'post' p12 S'TEXT' p13 sS'timedate' p14 S'CHAR(32)' p15 sS'id' p16 S'INTEGER PRIMARY KEY AUTOINCREMENT' p17 s.databases/f6db3e6e66dc0b6aea6b47a87ef29c1f_user.table0000666000000000000000000000024710752366002022177 0ustar00usergroup00000000000000(dp1 S'verification' p2 S'CHAR(32)' p3 sS'password' p4 S'CHAR(32)' p5 sS'id' p6 S'INTEGER PRIMARY KEY AUTOINCREMENT' p7 sS'email' p8 S'CHAR(32)' p9 s.databases/sql.log0000666000000000000000000000301610752366002014456 0ustar00usergroup00000000000000timestamp: 2008-01-31T12:30:25.008000 CREATE TABLE blogposts( id INTEGER PRIMARY KEY AUTOINCREMENT, title CHAR(32), timedate CHAR(32), content CHAR(32) ); success! timestamp: 2008-01-31T12:30:25.086000 CREATE TABLE blogcomments( id INTEGER PRIMARY KEY AUTOINCREMENT, indx CHAR(32), name CHAR(32), timedate CHAR(32) ); success! timestamp: 2008-01-31T12:34:53.905000 ALTER TABLE blogposts ADD COLUMN post TEXT; success! timestamp: 2008-01-31T12:34:54.014000 ALTER TABLE blogposts ADD COLUMN datetime CHAR(32); success! timestamp: 2008-01-31T12:34:54.092000 ALTER TABLE blogcomments ADD COLUMN comment CHAR(32); success! timestamp: 2008-01-31T12:34:54.217000 ALTER TABLE blogcomments ADD COLUMN blogpost_id CHAR(32); success! timestamp: 2008-01-31T12:34:54.295000 ALTER TABLE blogcomments ADD COLUMN datetime TIMESTAMP; success! timestamp: 2008-01-31T18:10:10.140000 ALTER TABLE blogposts ADD COLUMN author CHAR(32); success! timestamp: 2008-01-31T18:10:10.250000 ALTER TABLE blogcomments ADD COLUMN author CHAR(32); success! timestamp: 2008-01-31T18:58:01.978000 ALTER TABLE blogcomments ADD COLUMN url CHAR(32); success! timestamp: 2008-02-02T06:43:25.664000 ALTER TABLE blogposts ADD COLUMN numcomments INTEGER; success! timestamp: 2008-02-06T08:34:11.594000 ALTER TABLE blogcomments ADD COLUMN email CHAR(32); success! timestamp: 2008-02-06T11:18:56.728000 CREATE TABLE user( id INTEGER PRIMARY KEY AUTOINCREMENT, email CHAR(32), password CHAR(32), verification CHAR(32) ); success! errors/0000777000000000000000000000000010756166365012557 5ustar00usergroup00000000000000languages/0000777000000000000000000000000010756166365013211 5ustar00usergroup00000000000000languages/it..py0000666000000000000000000000005610745777322014255 0ustar00usergroup00000000000000{ 'Hello World':'', 'Welcome to web2py':'', } languages/it.py0000666000000000000000000000010710745777322014174 0ustar00usergroup00000000000000{ 'Hello World':'Salve Mondo', 'Welcome to web2py':'Ciao da wek2py', } models/0000777000000000000000000000000010756166365012526 5ustar00usergroup00000000000000models/db.py0000666000000000000000000000266410752401340013452 0ustar00usergroup00000000000000# try something like import datetime now=datetime.datetime.today() db=SQLDB("sqlite://db.db") db.define_table('blogposts', SQLField('title', length=64), SQLField('author', default=session.username), SQLField('datetime', 'datetime',default=now), SQLField('post', 'text'), SQLField('numcomments', 'integer',default=0)) db.blogposts.title.requires = [IS_NOT_EMPTY(), IS_NOT_IN_DB(db,db.blogposts.title)] db.blogposts.author.requires = IS_NOT_EMPTY() db.blogposts.post.requires = IS_NOT_EMPTY() db.define_table('blogcomments', SQLField('blogpost_id'), # the blogpost this comment belongs to SQLField('url', default=''), SQLField('email', default='you@something.com'), SQLField('author', default=session.username), SQLField('datetime', 'datetime',default=now), SQLField('comment', 'text')) db.blogcomments.author.requires = IS_NOT_EMPTY() db.blogcomments.comment.requires = IS_NOT_EMPTY() db.blogcomments.email.requires = IS_EMAIL() ##Identity module ### email is really the username since this ### particular version of Identity doesn't send email db.define_table('user', SQLField('email'), SQLField('password','password'), SQLField('verification',default='')) models/info.py0000666000000000000000000000016310752157304014020 0ustar00usergroup00000000000000# try something like response.title='My Blog' response.subtitle='I am therefore I blog' response.author='kensan'modules/0000777000000000000000000000000010756166365012713 5ustar00usergroup00000000000000modules/__init__.py0000666000000000000000000000000010745732752015007 0ustar00usergroup00000000000000private/0000777000000000000000000000000010756166365012715 5ustar00usergroup00000000000000scratch.txt0000666000000000000000000001147210751061036013420 0ustar00usergroup00000000000000;; This buffer is for notes you don't want to save, and for Lisp evaluation. ;; If you want to create a file, visit that file with C-x C-f, ;; then enter the text in that file's own buffer.

Secondary Header

This is image came from Morguefile

Phosfluorescently redefine out-of-the-box best practices before timely expertise. Efficiently re-engineer inexpensive e-tailers with focused customer service. Enthusiastically synergize ubiquitous benefits for interactive methodologies. Credibly visualize integrated experiences through vertical best practices. Enthusiastically generate empowered technology and holistic total linkage. Assertively redefine resource-leveling solutions via accurate potentialities.

Header

Phosfluorescently redefine out-of-the-box best practices before timely expertise. Efficiently re-engineer inexpensive e-tailers with focused customer service. Enthusiastically synergize ubiquitous benefits for interactive methodologies.

An example of an unordered list:

Credibly visualize integrated experiences through vertical best practices. Enthusiastically generate empowered technology and holistic total linkage. Assertively redefine resource-leveling solutions via accurate potentialities.

Header

Phosfluorescently redefine out-of-the-box best practices before timely expertise. Efficiently re-engineer inexpensive e-tailers with focused customer service. Enthusiastically synergize ubiquitous benefits for interactive methodologies.

A blockquote:

Dynamically transform holistic initiatives and diverse technologies. Uniquely deliver highly efficient potentialities with global quality vectors. Appropriately expedite cross-unit services with professional intellectual capital. Professionally pursue maintainable outsourcing whereas 24/7 outsourcing. Distinctively innovate installed base metrics with tactical content. Dynamically generate sustainable bandwidth and resource maximizing functionalities.

Credibly visualize integrated experiences through vertical best practices. Enthusiastically generate empowered technology and holistic total linkage. Assertively redefine resource-leveling solutions via accurate potentialities.

Header

Phosfluorescently redefine out-of-the-box best practices before timely expertise. Efficiently re-engineer inexpensive e-tailers with focused customer service. Enthusiastically synergize ubiquitous benefits for interactive methodologies.

An example of an unordered list:

Credibly visualize integrated experiences through vertical best practices. Enthusiastically generate empowered technology and holistic total linkage. Assertively redefine resource-leveling solutions via accurate potentialities.

Secondary Header

This is image came from Morguefile

Phosfluorescently redefine out-of-the-box best practices before timely expertise. Efficiently re-engineer inexpensive e-tailers with focused customer service. Enthusiastically synergize ubiquitous benefits for interactive methodologies. Credibly visualize integrated experiences through vertical best practices. Enthusiastically generate empowered technology and holistic total linkage. Assertively redefine resource-leveling solutions via accurate potentialities.

<--


{{try:}}{{=H1(message)}}{{except:}}{{=BEAUTIFY(response._vars)}}{{pass}}

[ click here for the administrative interface | click here for online examples ]
--> sessions/0000777000000000000000000000000010756166370013105 5ustar00usergroup00000000000000sessions/127.0.0.1.1201804224.6483906318040000666000000000000000000000024510751743046016301 0ustar00usergroup00000000000000(dp1 S'_form_key[]' p2 S'35875520236' p3 sS'_form_key[default]' p4 S'509943285555' p5 sS'_form_key[
]' p6 S'591573713363' p7 s...sessions/127.0.0.1.1201958842.4115037107310000666000000000000000000000000310751067672016272 0ustar00usergroup00000000000000(d.sessions/127.0.0.1.1202249111.6037863820090000666000000000000000000000006510752157024016274 0ustar00usergroup00000000000000(dp1 S'_form_key[default]' p2 S'198525689834' p3 s.s.sessions/127.0.0.1.1202249414.09815275695240000666000000000000000000000017110752162312016367 0ustar00usergroup00000000000000(dp1 S'_form_key[
]' p2 S'0430105236676' p3 sS'_form_key[
]' p4 S'73371538605' p5 s.s.sessions/127.0.0.1.1202272714.8913964823310000666000000000000000000000017010752344064016305 0ustar00usergroup00000000000000(dp1 S'_form_key[
]' p2 S'628133959398' p3 sS'_form_key[
]' p4 S'725367762371' p5 s..sessions/127.0.0.1.1202317555.4694585846830000666000000000000000000000040010752404006016312 0ustar00usergroup00000000000000(dp1 S'username' p2 S'damian' p3 sS'user_id' p4 I1 sS'authorized' p5 I01 sS'_form_key[
]' p6 S'848425161639' p7 sS'flash' p8 NsS'_form_key[
]' p9 S'0132084901441' p10 s. S'583883941832' p11 s. S'378439507363' p12 s.p11 s.sessions/127.0.0.1.1203301624.878539954850000666000000000000000000000000310756166444016240 0ustar00usergroup00000000000000(d.static/0000777000000000000000000000000010756166365012532 5ustar00usergroup00000000000000static/Thumbs.db0000666000000000000000000000700010752161534014265 0ustar00usergroup00000000000000ࡱ> Root Entry Fh@1Catalog6  JFIF``C     C   `" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?_*{"kҏ?+뽹OOGS__Y_~_>z@W{<?P_}+?o3?G?Wl^qJO?(?T_~ eלo7G?_X5?xeGyכߑ?Iu E;G2¯Wk??0? ?ШuhOUBu>acA E;G2¯QG{?Шui?Шuhb?f`?B'*Q:')Q:EZf`?? T_(|*Q:EZf`?``& ^title.pngstatic/images/0000777000000000000000000000000010756166442013773 5ustar00usergroup00000000000000static/images/Thumbs.db0000666000000000000000000006300010752162040015525 0ustar00usergroup00000000000000ࡱ>    !+ "#$%&'()*,-./01Root EntrypGh A1Catalog2 JFIF``C     C   ``" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Ϗ-=06t}Bʵ2V|NL|KpC@L?Lxҙˊ_O>=|=h1d2;HxO<}O%g5ST|8KK[K񖛛rTwFBy< |3_ .K PY\f;HDRP 3" H׋?hz,Ki7Hc :W<5YTk'SXSv!^^I=ӿj.i_Ke?­g/sqf9QYE9982n-~G9(]ɞQZ狵M.~f4IWޚg{}NO8em떈_@'8k8?Qts7VeUUEREOSx<-o:k:dsXm*:[8_~[~6Ӗ#AqW՞%y>%Cђb[o40I@ES⎡ EnZKBpl:Ŋo'f*N9O[^.ǷxN𶡤glq{8Ԍ)h<>N;.[౫gUDji?냝Gh<9Y?<{/mQizQoS2X,#:ըsj }}\`jUoT}ENVjI~$ &g(*Lp_Mzo]K5{kmtH9y4]~oV{ 4Ҡ!dSf5z/ٯ/wFFR{h,YI (''ztjI)%8oRU\uIF(U RzUG[D\"8aG־H[z'iТ6x*'1 >#xz;}n5{eD] .@8 |7oY2p yÜUagԡˌeWO[QUwBm_{72h5É.5uLY! Nᵱ~iڭεo>Ka5^[4SJVP`vGχ<="xu[KxzI@o5:W_.R]!mO:cSO=qSZt?Ž{:֋ hO6=p x/5)cX;K1fѿd6 opKj6g{|cwAm}j ȺlːH8 Gz}TuR^j=v=lT*+io7+𗈏nk~GF_Nw`g W~|l8?-ta?~ sޮ&ڜ0miH?Csͧ;T4:l8@)$ $WɶV/ĎY ?;?,}6Kf *G6nP 0 pH#=|iQbw[0#ZixkIݹt |+DmOBK/ m//UT݌n"ߎ`K 6 yߝOTK~l^ox}.u I MK'3cv[p'Q=vW]kHx ?"HWt@Pg#\c/ mxRþ1uBMbY&cFr$ x5^ Px4h=N+r>w_2~x+]cuhzlwI "+Td3Ȭ>~ϟQaukp⿍?7{޹:-sS\|?/ͅQL ,6> sMr~|9 sM_?|uzS 8wVo5o]ZP;嶸6b(IDs3<[B}0>]im5 4ӓi\=j>/2mƍo go gxFև̛yq<[B}?<[B}>z.?kC~G_~o|X⟌3y޹Z' 9k`MCl6YZǂﴩ|;em^#b\68 SmI$m\crYcAWzhɳ  ? !"#%&'()*+,-./0123456789:;<=>@ZBCDEFGHIJKLMNPQRSTUVWXY{\]^_`abcdeghijklmnopqrstuvwxyz}~```EqFh{A42CD7B6-E9B9-4D02-B7A6-288B71AD28BA},Do. JFIF``C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?So+green_vr.gif 2)bg.gif( JFIF``C     C   34 5$6AT`" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?oVOoj+OPҊ]ŠZ+'bpϷ{@۽Z+Ӣ? zJFIF``C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(C JFIF``C     C   ``" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?__WgnW{FKJ]n7u3W;QrqFNI&gG w?Կ&M7Sӕ} @=.$ #__B@=.$ #__B@=.$ #__B@=.$ #__B@=.$ד~?u#BP*)main.gif,)nav_over.gif JFIF``C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?E| zWU_:|y紟Ѣ+sc !JFIF``C     C   `" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ? 6 00Q PsڱCNeӢdDGp}j~2;o :񕖠{yg J"*'1\I{=Zޮm\X]+{};(E$T}[əBɌ|ɸ)5O4~-f ";a I-owY[:sZβI]rhn.&[L:L6870c\K;z&)wS[B"svfV'v ɱgb'CVV 1]8氫^ē^4/l VEg7{j, a &~emaverick.gif6 ) JFIF``C     C    " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?c <ĺ\Ǎo1$zxpc#ss~Ch0 *`pS}Mf8Fe#6%$nnav_over_left.gif8 )nav_o JFIF``C     C    " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz 1121 31G 41G w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?;IgǏݺi7ckIXs-~$ЫyOJ4k 1}u ׵P7IqWmڵį#yb8[}8q_oɃ­_=ݾeF+oR[G3Gh7úmdt pkmF:vc%3*e|9?ySc?a,!֓ƾ/1SXمY' 4-9SsT'9~_irkAu[:6[D$'uXzָhk t(⛧Ӯ'EX~cV$'=O^}+7C|0o&z_iMLK*ݸk;ZF .n>F HuQP\p^$Yv1zj]BqI%:B]?0FpppjnkOO>,q'f\Au|5ٟtcfȶ rT SW'jgzUJ7,_߳7N.u3t.\3 $|};\:w6ƩERL+|&8$4Ko&jno1l5FiiD &96`njG ZeKْ/p@y?お~~RŪKWRYX(:dG|Ŀq7=եiɥckػJO]?*][EO.PqS¹c.=~'ūm_A|9:Vm C+pTdqGwVѕdž4h]o;ԑ_0L>(xOA]k[pcMǶ[qJF5ZzUl {_#xd>ldJ0Xc+o|+GˡĖeRa*2YκÜi4|:WJ4k 1}u ׵P7IqWmڵį#yb8[}8q_oɃ­_=ݾeF+oR[G3Gh7úmdt pkmF:vc%3*e|9?ySc?a,!֓ƾ/1SXمY' 4-9SsT'9~_irkAu[:6[D$'uXzָhk t(⛧Ӯ'EX~cV$'=O^}+7C|0o&z_iMLK*ݸk;ZF .n>F HuQP\p^$Yv1zj]BqI%:B]?0FpppjnkOO>,q'f\Au|5ٟtcfȶ rT SW'jgzUJ7,_߳7N.u3t.\3 $|};\:w6ƩERL+|&8$4Ko&jno1l5FiiD &96`njG ZeKْ/p@y?お~~RŪKWRYX(:dG|Ŀq7=եiɥckػJO]?*][EO.PqS¹c.=~'ūm_A|9:Vm C+pTdqGwVѕdž4h]o;ԑ_0L>(xOA]k[pcMǶ[qJF5ZzUl {_#xd>ldJ0Xc+o|+GˡĖeRa*2YκÜi4|:W>><<<+++888666***'''???===DDD@@@444999777%%%###(((BBB333"""&&&!!!)));;; $$$ ///111  QQQ222000!,1 1& - D D//""I6M0A*4H!>l("E#^hā?$I%G\J'Ml)#{ZF-tiRJJ}JU$V9`IQ_vYEdUk-k]Kvޭwo^z Ko ÈqbJl,Ȗ3c|%>|!ztiҢQ6a]:4hd7o߽w[8pȋ+D:0cמ:C/d<ͣG^bx)W`H & "@aZHbap!x%8AHC.b3آh0#2 dC#70dK*dP>LJi%UfI%^e`:h*9k%sipI YD ' (&٨FzT D\j)j)VZj*pzkʫ밹Ұ"{6{lDKCL+-Z[m Fkn@Ѳ. B{oKp' p ?,1S\  !L2(<&w, ì/6ל:k>sA34 DtP;tLK=. [u`k͵c=d]vfg  q-8um7݀gPq~'w7xݏWn8Om9騧^諟^밫{뢇ߞ;ODA]'_7GSo}#C=~0~OyϾO?[6@ ݯ\ "@ C3@6Bl S!a "@c7ar(ڰ1w2DD&2N,bH*BB@hh^_" /2ˌ0cE6HhqVG<ڱc HARc"H:$IFU&+IIRe'')2)+JU2ediY򖱜%"^O/`sD/aό无jVS|@ƴ/uSĦ5$ J2'ԹNtd:Nvg)~S@`4TPM`C*ъR(p ǣiGGюAISҖB@/u)Lgj8 Sv0)3ER߸PSTu7W*Vխjի_ ki40ֲ@kZͺ 2oL\*Wڵ+]:կx+*.'JbX4/'dXZlf1t(@h=KZЖ6%-Xĵ}mkg+ۜͭGpV p}[LĸAn{&׹ʍns/@xTץ.vAznx+񊷼.| "ý}o{+e7)P  ;bN&@`J4 &$L @1B!4,g1P8Qb0^@ט2scۘ@A!ErA-hB:ІN4}4у΁, IWғƴ7}J tAQԤ6GjT)c=kYz.u r]׼ul h`>vmlf3[^v jB mmsO67u[vW}7 7;2#>qGx'w<4y BN&7yQr0yaۼ7GKs|= z>tE?҉nt 8]NԟO]Vzs]zu}HӾvnN]mvz?/^񍏼S<7y=|Bzѓ7I`w=cO^=]{OR@'~|3wSЄ! ֿ~o}s_~@~_/ϟ~+XA/?o8xh ؀(x8؁H(5@5()x)-/-H3x5%P:=ȃ;%`AH;hCxEJ*&*P(THShZU؅\N`(acH HjȆ LrHs(wx p|}ȇz؇=0 0=PhF FЈ M0hHh `؉艜8/(h8 @؋D8H-ʸȌxԘ& &Ѝ(Xᘎ؎ ;static/images/bullet.gif0000666000000000000000000000005510722476760015751 0ustar00usergroup00000000000000GIF89a!, ;static/images/footer_pic.gif0000666000000000000000000000057410722471544016614 0ustar00usergroup00000000000000GIF89aaaHHH'''JJJPPP+++:::!,aax40Ixe`(dihRp,tmxppH rɦtZ|Fͪzcܯz^ua<kgc_]YTRhHPZNDtA2x9ѿӼչ׶ٳ۰ݭߪ}3N=ʖmIXB4&qbyAOE݄1#GQI]._`i2iԀ9q AѣH"eaPJ@;static/images/green_vr.gif0000666000000000000000000000005310722002250016242 0ustar00usergroup00000000000000GIF89a!,D ;static/images/hr.gif0000666000000000000000000000456310722447610015073 0ustar00usergroup00000000000000GIF89ac!,cH*\ȰÇ#JHѡ2j PǏ CIōK\ɲK'Qr0͛8s(3Ο@ ]xgϡH*Y(ʥPJشgͩXjԩϭ`&zTٳ9D˶U׺K1˷]_ ,o׽kثNj 2Zf,Ɣ;ѨXmiKW|m3;֍nSχ+giiˣ4~f?h>[x lw~۫eᄒ@{`߀ WW`z%`}wG_]_]ǡy[懢x/$ht8#?.'Y$q p᎘)doM%RNy[BYd&obx_fi\&"\mb`)ڙZivf~PZm Cֹhg橣x|N :) Jiei ytb{:hd<*ZNX^$lgPPfXԲ5۪*KmeZ me xhM;c 4kk{nbj;/a:,ɻ`t;`{-0_h+ OL@[@Z)ȅ!*r.,Y2l7<;Cڳmm M4Z{A6t[ ;бg@(G5b[786`9 bF:xO_L` $@WPd`y ht.zH騧ꬷz.n۾:|.e-yw }@^'G>7 >睗^>/o?K3۳L5onwּz{ZWeq$=Yn|ۜ6}K WBұ0 gHڰ\嬃E'g6y}w N{"Au0|bz|' H2hL˧vYqN!*ψys!%Rz⢸ R{VLF:򑐌$'IJZ98*o @W87"H'G@ RqPwZ򖸬e"w^ 0YKN%-ORR#( anvR8IrL:ٸc6HQD9ʢ4nτfSj3p&HЂjsLBІ:Y=DBQFi{qy NFiҟh@Җ0LgJӚZOrh ̧HGJT=դCRԦ:PTJjҏpdSf5>QiԲhM+ߐֶp\康g2)^7զ5w `KXUojMb:v3`wvWկ_#`7ِ hGKҚltT=lLPͭnwC`Kܞ6Mr:Mp;wͮvzݫGKMz޲$$ ;static/images/main.gif0000666000000000000000000000225410717735524015411 0ustar00usergroup00000000000000GIF89a!, @ $"t('Ve"bH$@((@$>0 Sʀǔ OpÕ@=Uh*V`#:QK$H$A~@'YuX{DAxc2!C˃ 'hцXEq>|H*E2aP.dɆ !B΀1C5V"b4$H!&,DL0!Ç#GXeM2Fa?ʃȉ2š<5j4X_MJ)2fn@)ؿ , T``4?W(drK98F'. K,Q!lR+jX` 38j/p?"CЂ]d! -@P ;static/images/maverick.gif0000666000000000000000000002472110751034012016247 0ustar00usergroup00000000000000GIF89ax#3':W,Aa023(LPS#4Miv0Gj_dfIWj )=kps=GTRc{ 4Lqv} .Ebkt:>A!,x'dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|Nxay<l}?{xXi8QRƐ3ϴ/вNψ=, !%%dW/=}Gŋ# ޽|&H]CyR<)`0!Ó $d 8jѣH^ 4<|=XW3K`U*ʬ"J:yZWrUmػxmӳXYgͪ$xZsɇe/cc> !.Z])nfY N=װc+mp `Zl~1ĉ5(U"eKGG)k׎Ut>V%n@X<>< ez}]JΩUkcl]v5(]W h(N17` '"+XJaT+^BDHb.z$$x INHc H#BV(2)Xt x7.\9&gf;h(x  ^H妘駠TpD jy&80*A)Y,>v&w_HeW i<9B<-6>jg4Eb~4qBhht̎3-$YC0 7 Lws)g0Ƣvo`qګ J+c#(:zgHDb :b.I`ɵ 1gh#<0hSЁK;ځ.ݔ=0N|'}cqnx@Ϋ T,$.;~yJ:f ^J Є l6⎇c=F^8v-[4@[9D,hǙwSC(fPrG owU5 w8db\oǹcf|m^ L.P@h x_> /XҖ3|QC#"|9&sж7=he+ @p+K] P@x# l9v&q&IV#ڀhU损 Q ֣GxSg5; |`4I!~mtc\"BR7g' IÀMg1D0?I&0wf6zĉ#{ |KAps4b:vB[#(Y"x(K'OZ\G!q!=#Tg"DkQƗ1j:֤)ܦ&ƅՊBTW[.=S(@ ѕX3YP)E ҪyK C-i2o(k8BeZTVaJY㟅4p`3vy2}L&֭3ZaιBN > '`,}J:ճy@g##KU%.(#zFh%DeJ!,W$V<2vR*݆)nls X!NI |N&P8`7hnEw  Yh@Ss8%pvP@r;Wlk  v//*p \i{I]K Q'υRc0tG9n _Ge ׁ` wk w|Rj7 [϶":jPâ6#/ 6b0 Ve8\` 06,Fk*`R="6`*GxBɎv fy¨YѪ=Xo,o)P.n눖$z 06 h*dS0,-ԹFgx;`iA2H<&$vk# 9I`,G/0@V@3:m;.V0il%m H{^0qY]$8ksT 9*XW#VDrf73D=;c[{̥\H }[9ZuM PߧqPemt-@ c@4jȹu[uhjSx-c)K-wi'xO^?PBUcP[zXXPienvN#1qЎsǠ?{{n)IQ3.<x4_Iw=X>EƛboiI_˩@La!`OS &f9vu~]udg/BW<(+s  +eSVr6`go&Pu }Fm'sp47iɑχ&fRЀt(gb`U AhBx%o% Px2x!x#P|" QrE UilQ Ta9}e|(|ВT*nv×{GЃ{=7pvFl* Ј"n#PdngHp#`psbSDhmyhC-H^g}o| a0Ue4~-7E7ZBy6sK=EePrpڡzWjBps 0djam'9%;w>%&- P(a/I2&Pђ=@NyvVu;ywb\be9BwH( #W%c_5)Uf`/$NvT+!D! SJhef7Xs,`cƉ+P|$6H6؅obֈݒ$p+{6Y;*y(@:u)p-lYyf-Ʌ( Ș]i+}cN(EUiK"(bC~pУhƑb-qZr-ZwO=1B"[;Wr"YגWy5Ə]bdG+W%/:Oe"xWbw\žr P"e-@.57 - * ed 3YҔD\US^(ckˁ%Eh067||.W0b.`nӣ( P`Oڝ}i/șUG+RZ:=_jLȏ&7W%lf*-ZiqDP#V?vR5y.5V''"8򛁗bobg x#2&l%:AqtJaJZWSa/:WMm#>pKV#TxtSLKi'EzLG5Lml.(p !'#٧֓G^ɎjW;VFGGVڨ8pthGŎųL?#nE)lѐ恈NZXx r'%c/HzN=Oir ߆XuO4-a8ɳb+- NC/+@R6#F"P|/ oJ/w+Dg}y T^Ns1%-S'AT;UW5w,5mǢ,g[wkm2I/xPxv+:)@NajO^nDY/.?|twComAb_x$*\_[9&G;0Σ6$>A ƭ M\k (bV>$|J pbCwYK鉆 &uDҽƉ(Ϛ+d[0KϚޅue p²jV>kh;Bu?2$! Q/hGD#"%H6#,$%'M8#Yd}69@t;xpQ~xZUrG%IEPQ{1f8<{N҇142щ-%ыVԚ)C95r}:?C78 ѐ(AC-+(CЇB4F1xӑބ=CL@B*!2#Jڤ1Z@C(a Po60 eB6,xJ;[FWdOB4-ЗRN %͈/P'0wHozfX%)(ԑjH=-~I#k[WWD3; 6Ү6kQSU;q-\k"w֏ЭIV ܧyGՖOE8 X"8_mD0+\Ù"•D teJw!&"a!]⻲0lVeI>58jl Fi$z5JpT/(A ~wFFeߵ^i+:i Ir=l_sV0v2T‚\+TЊ^4> ZKv2mCK֗lgr1e@:8eϠcHnҺ?;'CYiCC[% X+-%׽fv  򔦳ѪldWvu4ksšǧmm{OL4}}lvg|>xn^SZ~lcO|ʕ) yЦ< 压SKxM8\r&gk`W[lc=Z:)[K$OshRW['!ْ8>:s ) "tcsJEss3/.7y >84Enu7\J6@'; 4k#௃=yyO3ў> }6X\'ppL !czZؖFFjȉ4<@ <-M44Z ddBLF(4-"E.!.֢#bQb/T" An5vcE0z pFdSUDLb`cGt4 A.@W*W d^@X+ @eT eT c Ƣlz0ͦ,)e)/$%%m+dʮ+g-!xܗ HjL-3 A"$[l`5zz)\6(`Rzd\. cv0opVkNr0p p,(i$mj*HlE>*1B"c`0Dp@F@F/~4dDac-Sl1zq s2fyBk ;Q@pJ4KTb-#M5 ld+ /P@PT`\%Pp-#pV:`d ,hmFPCǹ@DZ8rQ\`@ͬxG,Ki0 @@ $Ǩ rR'@g\ KT N@= el4=" 7K&*n pX2I>"V*Mh8{pcC+GBeF@τctjl LLe|q>uוZ!$AP44HS( V&|WFdbN l/GTNZM@Rb4E>,ptal^ h/ۦT'\O@t /b5`GAۨ Sb4 o*`Pvj62Ǯvl$u rVC]e tcvp p3Sh_ws[PgN#:Cf>Lvu kww7&kwSXywzsw |hP8Zw|CN~x E{+-.CxKS6-wasx{x^xxx'K;static/images/nav_over.gif0000666000000000000000000000022210717777610016277 0ustar00usergroup00000000000000GIF89aGGEGGFGF;koD]]C=@752'BAz">PM-9!,Lc5H@&Ur;static/images/nav_over_left.gif0000666000000000000000000000026410717777610017317 0ustar00usergroup00000000000000GIF89a GFEGFGGGBEA=A{&fn bj;1+;2hp =!, 1 dI4H!x@,/R98OLaJ&l6;static/images/nav_over_right.gif0000666000000000000000000000026110717777610017477 0ustar00usergroup00000000000000GIF89a FGEFGGGGbj>{&=ADE2;?hp 1;+fn !, .% `G*9'Ps"t}FP„!(rb@R!;static/images/nav_under.gif0000666000000000000000000000022210717777610016441 0ustar00usergroup00000000000000GIF89aGGFGGFCDFCGDIFFCDCDCHCLEE!,`\-3Q"!c;static/site/0000777000000000000000000000000010756166365013476 5ustar00usergroup00000000000000static/site/site.css0000666000000000000000000000752510752342070015146 0ustar00usergroup00000000000000 /*--------------------------------------------------------- template: lorem version: 1.0 author: gorotron website: http://www.gorotron.com usage: creative commons attribution v3.0 ---------------------------------------------------------*/ /* Layout ---------------------------------------------------------*/ * { padding:0; margin:0; list-style:none; border:0; } body { background:#000; } #header { background:url(../images/bg.gif) bottom repeat-x; width:100%; height:15em; position:relative; } #masthead { width:50em; margin:0 auto; padding:4em 0 5.8em 19em; height:5.2em; position:relative; } #masthead ul { position:absolute; bottom:0; z-index:0; } #masthead li { float:left; margin-right:10px; background:#d8ed46 url(../images/nav_over.gif) bottom repeat-x; } #masthead li a { background:transparent url(../images/nav_over_left.gif) top left no-repeat; display:block; } #masthead li:hover { background:#d8ed46 url(../images/nav_under.gif) bottom repeat-x; } #masthead li a strong { padding:0.5em 10px 0.5em 0; margin-left:10px; display:block; background:transparent url(../images/nav_over_right.gif) top right no-repeat; } #masthead img { position:absolute; height:10em; width:15em; border:0.3em solid #FFF; left:0; bottom:2em; outline:0.2em solid #000; } #main { background:#FFF url(../images/main.gif) repeat-x; width:100%; z-index:2; /* Covers up annoying IE7 nav bar spacing issue. */ position:absolute; } #content { background:#FFF; width:72em; margin:0 auto; padding:2em; } #subContent { width:18em; padding-left:2em; background:url(../images/green_vr.gif) repeat-y; float:right; } .article { width:49.5em; padding-bottom:6.5em; padding-right:2em; background:url(../images/hr.gif) right bottom no-repeat; position:relative; } .article ul { margin:1em 0; } .article li { margin-left:1.5em; margin-bottom:0.5em; } .article ul li, #subContent ul li { background:url(../images/bullet.gif) left no-repeat; padding-left:1em; } .comments { position:absolute; right:3em; bottom:3em; } .article .comments li { display:inline; margin:0; padding:0; background:none; } .hr { width:55em; height:128px; } #footer { clear:both; background:#000; height:20em; position:relative; } #footer ul { position:absolute; text-align:right; right:50%; top:50%; margin-top:-4em; padding:3em 1em; border-right:1px solid #CF0; } #footer img { position:absolute; left:50%; top:50%; margin-top:-2.9em; background:#CCC; margin-left:1em; height:5em; width:5em; border:5px solid #FFF; outline:0.1em solid #333; } /* Typography ---------------------------------------------------------*/ body { font:62.5% "Trebuchet MS"; /* Change this % to alter the size of the whole page */ color:#333; } a { color:#090; } p { line-height:1.5em; font-size:1.2em; margin-bottom:1em; } h1 { font-size: 3.6em; padding:0; margin:0; color:#FFF; } h2 { font-size:2em; line-height:1.5em; margin-bottom:0.5em; } blockquote { border-left:0.3em solid #090; padding-left:2em; margin-left:1em; color:#666; } .article li { font-size:1.2em; } .comments { font-size:0.95em; } #subContent h2 { font-size:1.3em; } #subContent p { font-size:1.1em; } #masthead p { color:#CF0; } #masthead li a { font-size:1.2em; color:#000; text-decoration:none; } #footer { color:#CCC; } #footer a { color:#FFF; text-decoration:none; } #footer a:hover { text-decoration:underline; } #footer p { margin-bottom:0; } table, label { text-align: left; vertical-align: top; } tr, td { display: block; text-align: left; vertical-align: top; } static/sorttable.js0000666000000000000000000004102510745732752015066 0ustar00usergroup00000000000000/* SortTable version 2 7th April 2007 Stuart Langridge, http://www.kryogenix.org/code/browser/sorttable/ Instructions: Download this file Add to your HTML Add class="sortable" to any table you'd like to make sortable Click on the headers to sort Thanks to many, many people for contributions and suggestions. Licenced as X11: http://www.kryogenix.org/code/browser/licence.html This basically means: do what you want with it. */ var stIsIE = /*@cc_on!@*/false; sorttable = { init: function() { // quit if this function has already been called if (arguments.callee.done) return; // flag this function so we don't do the same thing twice arguments.callee.done = true; // kill the timer if (_timer) clearInterval(_timer); if (!document.createElement || !document.getElementsByTagName) return; sorttable.D