___________ .__ .__ __ ____ __. .__ .___ __________
\_ _____/_ __| |___ _|__| ____|/._____ | |/ _| ____ ______ _ _| | ____ __| _/ ____ ____ \______ \_____ ______ ____
| __)| | \ |\ \/ / |/ _ \/ ___/ | < / \ / _ \ \/ \/ / | _/ __ \ / __ | / ___\_/ __ \ | | _/\__ \ / ___// __ \
| \ | | / |_\ /| ( <_> )___ \ | | \| | ( <_> ) /| |_\ ___// /_/ |/ /_/ > ___/ | | \ / __ \_\___ \| ___/
\___ / |____/|____/\_/ |__|\____/____ > |____|__ \___| /\____/ \/\_/ |____/\___ >____ |\___ / \___ > |______ /(____ /____ >\___ >
\/ \/ \/ \/ \/ \/_____/ \/ \/ \/ \/ \/
finally @ home |
|
| back to the index articles users categories send us a message about us Fulvio's Résumé Intermol Coding Standards Intermol Internet +55 11 4063-0801 It is surprising that browsers can still render this website. This was built in 2006. | Intermol Coding Standards (Standards)
---------------------------------------------------------------------
by Fulvio Oliveira, 2006-12-05 13:26
/////////////////////////////////////////////////////////////////////
// intermol_coding_standards.txt
/////////////////////////////////////////////////////////////////////
// description
// the coding standards for Intermol Internet
/////////////////////////////////////////////////////////////////////
// requirements
// none
/////////////////////////////////////////////////////////////////////
// important elements
// information
/////////////////////////////////////////////////////////////////////
// produces
// knowledge
/////////////////////////////////////////////////////////////////////
// history
// +------------+-----------------+--------------------------+
// | when | who | what |
// +------------+-----------------+--------------------------+
// | 2003-06-10 | fulvio oliveira | created the file |
// +------------+-----------------+--------------------------+
// | 2006-11-05 | fulvio oliveira | first English version, |
// | | | enhanced header and |
// | | | minor corrections |
// +------------+-----------------+--------------------------+
/////////////////////////////////////////////////////////////////////
Abstract
This document describes a recommended coding standard for
HTML/CSS, JavaScript, PHP, ASP and SQL. It aims at coding
style and functional organization.
It's loosely based on the "Recommended C Style and Coding
Standards" by the Bell Labs.
1. Introduction
The standards in this document are required for all coding
written for Intermol. Many of these choices are arbitrary,
and chosen after the author's experience. The goal is to
have all developers understanding easily each other's
coding, for its indentation, commenting, naming, conventions
and spacing are all commom to everybody's coding. All
examples are PHP, you can work it out in your language.
"To be clear is professional, not to be clear is
unprofessional."
Sir Ernest Gowers
2. File Organization
A file consists of various sections that should be separated
by several blank lines.
2.1. Number of Lines
If possible, files should have as few lines as possible, from
200 to 500 lines.
2.2. Number of Characters
Though most of us are using Windows, it would be nice to have
the lines shorter than 70 characters. Some of these codes
are edited on servers without a graphical interface. Use
longer lines only when absolutely necessary.
2.3. File Naming Conventions
File names are made up of a base name, a period and a suffix.
The first character of a name should be a letter. The whole
name is to be in lower-case letters, and may also use numbers
and underscore ( _ ).
The following suffixes are required:
* HTML files should end in .html
* JavaScript should be always inside the HTML or included
on the server side
* PHP files should end in .php
* ASP files should end in .asp
2.4. File Contents
The requested itens on all files are:
2.4.1. A header, which holds many information about the file
itself, what it does, all important elements, who wrote and
who edited the file. The standard is:
/////////////////////////////////////////////////////////////////////
// the name of the file
/////////////////////////////////////////////////////////////////////
// description
// a brief description of what this file is
/////////////////////////////////////////////////////////////////////
// requirements
// everything that is necessary to run this file
/////////////////////////////////////////////////////////////////////
// important elements
// the important elements used within the file
/////////////////////////////////////////////////////////////////////
// produces
// elements or whatever the file creates/generates
/////////////////////////////////////////////////////////////////////
// history
// a table, using this template, showing
// +------------+--------+------------------+
// | when | who | what |
// +------------+--------+------------------+
// | date | name | what happened |
// +------------+--------+------------------+
/////////////////////////////////////////////////////////////////////
Note that the lenght of the / lines is 70 characters. If the
character / is not the default comment character, use the
comment character instead. Eg, the header on this file.
2.4.2. The required elements: included files, required
objects, form objects, querystrings, etc. When coding, one
should initially check for the existence and consistency of
the required elements, preventing the file from execution
and returning an error message if something is wrong. When
the requirement of an element only happens deep into the
code, make sure this element is on the header.
2.4.3. All constants, definitions and functions, except for
the ones created dinamically and destroyed within the file.
Every function declared on the beginning should have it's
own complete header, and should be treated as if it were a
file itself. When possible, separate all functions into
their own files, so we all could use it later.
2.4.4. If the file is the entry point for the program
(index.php, for instance), it should show 'the bigger
picture' of the whole program: what it does, for whom it
was developed, the basic file structure.
Obs: do NOT include comments inside HTML coding, as they will
be sent to the client machine. HTML should be kept clean, and
it's comments, if necessary, should be kept in a separate
offline file.
3. Comments
"When the code and the comments disagree, both are
probably wrong."
Norm Schryer
3.1. Avoid sendind them to clients!
3.2. The comments should describe:
3.2.1. What is happening;
3.2.2. How it is being done (if not obvious);
3.2.3. The parameters meanings;
3.2.4. The elements used;
3.2.5. The elements modified;
3.2.6. The expected result;
3.2.7. Restrictions, bugs and suggestions.
3.3. Do not comment micrologic.
3.4. Comments should justify offensive code.
3.5. The indentation of the comment should follow that of
the code itself, such as:
if ($money == 0) {
// you are broke
die('This purchase cannot be completed: lack of funds');
}
3.6. The comment can be on the same line, as long as well
indented. Other similar comments should have the same
indentation.
if ($money >= $purchase) {
$accepted = true; // you can pay, go ahead
} else {
$accepted = false; // you are broke
}
3.7. Blocks of code should have a very distinguishable
begining and ending. Always use this comment style.
///////////
// begin ////////////////////////
// check if the user has money //
/////////////////////////////////
if ($money >= $purchase) {
$accepted = true;
} else {
$accepted = false;
}
/////////////////////////////////
// check if the user has money //
// end //////////////////////////
/////////
4. Function Declarations
4.1. It is highly adviseable to have each function in its own
file. When not possible, this function should be preceded by
a block comment exactly like the file head comment listed in
section 2.4. It's adviseable to have the discussion of non-
trivial design decisions and side effects.
4.2. The function return or break should be alone on a line,
indented as necessary.
5. Whitespace
5.1 The use of vertical and horizontal white space should be
generous. Indentation and spacing should reflect the block
structure of the code.
5.2. Each statement should preferebly be on its own line.
Closely related statements should be on adjacent lines, as
a chunk. There should be at least 1 blank line between one
chunk of code and the next one.
5.3. If the code is a block statement that has a very
distinguishable begining and ending (see 3.7), there should
be at least 5 blank lines between prior code and the begining
comments and 5 blank lines between the rest of the code and
the ending comments.
5.4. A long string of contitional operators should be split
into separate lines, such as:
if (
($money >= $purchase) and
($user == 'fulvio') and
($month != '12')
) {
return true;
}
Use the same idea for other long statements.
5.5. Ternary operators should be avoided.
5.6. Keywords that are followed by expressions in parenthesis
should not be separated from the left parenthesis. It is
adviseable, though, that if the number of arguments is too
long, it should be broken into several lines, eg:
mail(
'contato@fulviooliveira.com.br',
'<< your purchase was accepted >>',
$message,
$headers
);
The same should be applied for arrays:
$week_days = array(
1 => 'Monday',
2 => 'Tuesday',
3 => 'Wednesday',
4 => 'Thursday',
5 => 'Friday',
6 => array(
0 => 'no work on saturday',
1 => 'religious day'
),
7 => 'beach day'
);
5.7. There should be only one statement per line unless these
statements are short and very closely related.
case FOO: oogle (zork); boogle (zork); break;
case BAR: oogle (bork); boogle (zork); break;
case BAZ: oogle (gork); boogle (bork); break;
5.8. Mostly, avoid embedded assignment statements. In some
situations where there is no better way to accomplish the
results, such as:
while ($result = mysql_fetch_assoc($query)) {
process the resource...
}
6. Compound Statements
6.1. A compound statement is a list of statements enclosed by
braces. The chosen way of formatting the braces is the
"K&R style". The open brace should be on the same line as the
statement, and the else part of an if-else statement and the
while part of a do-while statement should appear on the same
line as the close brace. The close brace should have the same
indentation as the original statement.
control {
statement;
statement;
}
6.2. When a block of code has several labels (unless there
are a lot of them), the labels are placed on separate lines.
The fall-through feature of the PHP switch statement,
(that is, when there is no break between a code segment
and the next case statement) must be commented for future
maintenance.
switch (expr) {
case ABC:
case DEF:
statement;
break;
case UVW:
statement;
/*FALLTHROUGH*/
case XYZ:
statement;
break;
}
The last break is unnecessary, but is required because it
prevents a fall-through error if another case is added later
after the last one. The default case, if used, should be
last and does not require a break if it is last.
6.3. Whenever an if-else statement has a compound statement
for either the if or else section, the statements of both
the if and else sections should both be enclosed in braces
(called fully bracketed syntax).
if (expr) {
statement;
} else {
statement;
statement;
}
6.4. Braces are also essential in if-if-else sequences with no
second else such as the following, which will be parsed
incorrectly if the brace after (ex1) and its mate are
omitted:
if (ex1) {
if (ex2) {
funca();
}
} else {
funcb();
}
6.5. Do-while loops should always have braces around the body.
7. Operators
7.1. Uniary operators should not be separated from their
single operand. Generally, all binay operators except
. and -> should be separated from their operands by
blanks or tabs.
7.2. Some judgement is called for in the case of complex
expressions, which may be clearer if the "inner" operators
are not surrounded by spaces and the "outer" ones are.
7.3. If you think an expression will be hard to read, consider
breaking it across lines. Splitting at the lowest-precedence
operator near the break is best. Expressions involving mixed
operators should be parenthesized. Too many parentheses,
however, can make a line harder to read because humans aren't
good at parenthesis-matching.
7.4. Terniary operators should be avoided.
8. Naming Conventions
The following rules are to be applied on all new projects.
8.1. Names with leading and trailing underscores are reserved
for system purposes and should not be used for any
user-created names. Most systems use them for names that the
user should not have to know. If you must have your own
private identifiers, begin them with a letter or two
identifying the package to which they belong.
8.2. Function names should be in lower case.
8.3. Variable names that are created and used within the same
file should be in lower case. However, variable names created
globally by special configuration files should be in upper
case.
8.4. Avoid names that differ only in case, and also avoid
names that differ only by underscores (like foobar and
foo_bar).
8.5. Avoid names that may be hard to spell or read. Be
careful with 'l', '1', 'I', '0', 'O'.
8.6. Avoid names that might conflict with standard library
names.
8.7. Don't be affraid of long names for variables or
functions. It's better to have a long and understandable
name than anagrams (clear_the_screen vs cls).
9. Special Considerations
9.1. SQL
9.1.1. ALWAYS double-check for SQL injection.
9.1.2. Make the queries look clean. Use the heredoc
sintax.
$query = mysql_query(<<<TEXT
select names
from users
where names like 'a%' and
names like 'b%'
order by names
TEXT
);
9.1.3. ALWAYS double-check for SQL injection.
9.1.4. Set up the SQL user so that you have only the
needed grants for each 'side' of the system: the
Administration side can often select, update, insert
and delete, while the User side can often only
select information.
9.1.5. ALWAYS double-check for SQL injection in ALL
forms, fields and querystrings.
9.1.6. Check if insert/update/delete operations where
done successfully, and notify the user.
9.1.7. SQL is usually slow. Operations should better
not be done on the SQL side. Use SQL only for
storying data.
9.1.8. SQL injection?
9.2. ASP (Microsoft)
9.2.1. Avoid using ASP for new projects. It's slow,
bulky and expensive.
9.3. JavaScript
9.3.1. Don't use JavaScript as the only way to
navigate through the site. Also, many effects can
be achieved by CSS.
9.3.2. The Internet Explorer has very different
programming than the JavaScript Standards. Have the
server define what kind of browser it is, and include
the correct JavaScript while on the server.
9.3.3. JavaScript should be always inside the HTML or
included on the server side.
9.3.4. If you think it's important to have comments,
make them very short or only on the server side.
There is no need to send comments to users.
9.3.5. Choose the variable/object names wisely.
They have to be short enough to make the page
smaller, and long enough to be understandable.
9.4. HTML/CSS
9.4.1. Choose the object names wisely. They have to be
short enough to make the page smaller, and long
enough to be understandable.
9.4.2. Don't rely on browser defaults: define either
every formating option or none at all.
9.4.3. Don't comment HTML/CSS coding. Or at least
don't send these comments to the client.
10. Conclusion
A set of standards has been presented for programming style.
Among the most important points are:
10.1. The proper use of white space and comments so that the
structure of the program is evident from the layout of the
code. The use of simple expressions, statements, and
functions so that they may be understood easily.
10.2. To keep in mind that you or someone else will likely be
asked to modify code or make it run on a different machine
sometime in the future. Craft code so that it is portable to
obscure machines. Localize optimizations since they are often
confusing and may be "pessimizations" on other machines.
10.3. Many style choices are arbitrary, based on a personal
experience of 19 years of coding and the "Indian Hill
Recommended C Style and Coding Standards" from Bell Labs.
Having a style that is consistent (particularly with group
standards) is more important than following absolute style
rules. Mixing styles is worse than using any single bad style.
10.4. As with any standard, it must be followed if it is to
be useful. If you have trouble following any of these
standards don't just ignore them. Talk with your local guru,
an experienced programmer or send me an e-mail
(contato@fulviooliveira.com.br).
---------------------------------------------------------------------
Read more on Standards |
. . . ................... .
. . .. .?ZZZOOOOOZ$$8DDNDDDD7..... . ..
. ....?I7$8OOOOOO8DDDD88DDNDDDDDNDZ,..
. ...,O88DDDDD888DDDDNDNMNDD8D8OZ8NNDDDDDO....
. . ...,?Z88NNNN8ZZO88DD8OODO7I$8DDDDDDDNNNDNDDD8Z~... ..
..,+ZO8DDNDDNDDDDDNMNNDDNNDDDNNNNNNNNNNDNDDDNDNNDN88$?,..
...?OOZODNNNDNDDDNNNNNDDOOZZ8NDNNNNNNNNNNNNNNNNNNNNNDDDDD88O,..
..?$OODNNDDDN8ZODNDNDDDNNDDDDNDDDDOOODDNNNNNNNNNNNNDDNDDDN888D8O?.
. .=$ODD88DNNDDDDNNNNNNNNNNDDDDDDDDDDDNNDNNNNDDDD8O8DDNNDDDDD88D8ZODO.. .
..I$8DDNNDMD8D88DDNDD8ZO8DNDD8NNDNNDNNNNNNMNNNDDNN88DDDNDDDDDDDDDDOOZZ$?.. .
..~ZDNDDNNNDOO8DDDNNDDDDDNNNDDNNNNNNNDDDDD8Z$ZODDDDDDDDDNNNNNNNNDNDD8D8O..?Z.... .. ....
.=DN8$ONNDDDD88DDDD8DD88D88OZ8ND8ZZZZDDDDDDNNNNNNDDNNDDNNDDNNNNNNDDDDDD88$7$Z8$..
..Z8DDDNDDDDOODDNDDNND88DDDD8D88D8DNNNNDNNNNNNNND888DDNNNDNDNNNDDDDDNNDDD8OZZZZOD$.. ..
..=888DNDDNND888NDD888O8NN88888OOO8NDD88NNDDDDDDD888DNNNDDDDDDDDNNNNDDDDD8DD8OOOOOO8O7,. .
..~ODDDDNNNNDDDDDNN8DNDNNDDDDDDOOOO8D8ND8888NNDDDDDDNNDNNNNDDDNDNNNNNNDDDDDDDD8OOOO888D8OZ..
..+NNDDDDNNDND8DDDNNDNNDNDDNNNDO8DOZOO8OO8DNDDDDDDDNDDD888DD8DDDDDDDDDDDDDDDDDDD8OOOOO8D8DNZ,. ..
. ..$ODDDNDNNND8DDDDDDNNDDDDDDNNNDDD88DNDDDD88DNDDDDDDNDDNNNN8ZZOODDDDDDD8DDDDDDD888OO88OO8DDDD$=. ..
.$DDDNDDNDDDNNDDDNNDNNNNNNNNDDNN88OZDNDOODNNDDD88DD8888O88O$Z8DDDDD8D8888DDDDDD8OO88O8D8O8DD88?.
. ...8DDDNNNNNNDDDNNDNDDDDNNNNNDDDNND8DNDDDDDD88DDDDD88DDDDDD888DD88O88888O$ZOO8888OZZOOOZZ8D8888OI.
.$DDDDDNNNDDDDDNNNDDDDDNNDDNNNNNNDNNN8888DDDND8DDDDDDDDDDD88DD88O8O8888Z777$Z8888ZZOODOOO8D8888:. ..
. .DNDDNNNNDNDDNNDNDDDDD8O888DDDDD88DDDDDDDD88OO88O88888OOOOOODZZZZZ7$$7I+==+++7$ZOOZO88OZODDD888..
. .NNNNDDDDNDDDDNNNNNNNNNNNNNDNNDNND88888DDNDDDDDDDDD88ZZOO8OO$II???77?=~=~~======+7$$ZZ88O88D88D8? ..
.7NDDNDDDD8DDNNNNNNNNNNNNNND8888888888DDDNDDDDDDD8888OO8OZ$7?+++++?I+~==~:~~~~===+?I7$ZZZ8DDDDDDD8.
.. . ..ZNDDNNDDDDDNNDDDNNNNNDNNNNNNNDDD88OO8DDDD8888Z$888OOO8Z777I++~~~===~:~:~~~~~~====++?I$ZZZ8888D8D8+..
..$NDDDDDDDNDNNNNNNNNNNDDDNNNNDDDDD8888OOZ$O88Z$ZOZ$$ZZ7I??:,,~::~====~::~~~~~~~===+++?I7ZZ88ZO8DD87. ..
..$NNNND88DNNNNNNNNNNNNNNNNDDDDDDDD8D8888DN888O8O8OZZ$7I+~:,,:~~~~~~:::::~~::~~~~==+++?I7$ZZZ8O888D+.
.. ..$DNDDD8DDDNNNNNNNNNNNDDDDNNNNNNNDDNNNDDOZ$77ZZZZ$7I+~,..,:,,:~~~~,,:::~~~:::~~~===++++I7$OZZO888D:. ..
..?8NNNDNNNNNNNNNNNNNNNNNNNDDDD88888O88OOO887$ZZ$I??=~,,::::,:::,:,.,:,,:::::::~~~=====+??I7ZOZZO888=..
.. .IDNDNNDDDDNNNNNNNNDDNNDD88DDDDOO$II7?=II?+$$$$I++=::....,,,...,,,,,,,,:::::::~::~~====+?I7$ZZZ888D:.
. . .IDDNNNDDDDNNNNNDNNNNNDDDDDD88Z$ZO8OZZZ7$$Z$7I?=~:,:,......,,,,,,,,.,,,,:::,,:::~~~====??I77$ZOO8OD,. .
. .$8DNNDDNNDNNNNNNNDDNDDDDDD88Z$?I77??7$IIII+=~:,,,,:......,,,,,,,.,,,,,,,::::::~~=~====++I7I7$Z8OOO:. ..
.. .$DNNNDDNNDDDDDDDNDDDDD88D888Z7??+?===+I+~:::~=:,::...........,,,,,,,,,,,:::::::~~~~~==+??II7$Z8888:..
.. ..?Z8NND8NNNNDNNDDDDDDDDD888D8OZ$II?+~=~=~::~::~:,,,,........,,,,,,,,,,,,,::,::::::~~~~~=????7$$Z8ZOO=..
.?O8DDDDNDDNNNNNDDDDDDDDDDDD8O$7I?+=~===::::::::,,,,,...,,..,,,,,,,,,,,,,,,,::::::~~====+???I77Z8OOO,.
.. ..?ODDDDNDDNNNNDDDDDDNNND8888OZ$$?+=~~~==~:::::::::,,,.....,,,,,,,,,,.,,,,,,,,:::::~~===+++??I$ZZ88OZ.. .
.,:ZD8DNNDDDDNNDDDDDDDDDD8888OZ$$?++~~=~~~:::,,,,,,,............,..,,..,,,,,,,:::::~~~===++??I$OOOOZI..
.. .+88DDDDDDDDNDDDDNNNNND88DO8Z$7?+==~~~~::,,,,,,,,,............,,,....,,.,,,,:::::~~~===+++?IZ8ZOOO+.
.,ODNDDDDD8NNDDNNNNNNNDOZOO$I??++===~~::,,,....,,..............,,..,,,:,,,,,::::::~======+?IZ8OO8O:.
.~8DDDDNND88DDDNNNNNNNDOO8O7III?+==~::::,,,...,,,:,,,::,,::,,,,,,,,...,,,,::::::~~~=======+IO88O8Z:
.ID8DDDNND8DDDDDDNNNNNDO88$7III?++=~::,,:::,::~~~:::::~:::~:,::,,,,...,::::::::~~~~=======+IO8OOOZ:
.IO8DDDDD88DNNNNNDDNNNDO8ZI7?7I??+=~~~=?I?+?I7$$$$77$$77???+~:,:,..,:::~~~~=+++??I?++++===+?ZDOO$+.
..$DDDDDDDDDDDDNNDDNNNDOO$IIII7++?+?77$$$Z$ZZZO88OOZO88OZ7?++=:,,..:::~==+?$$$ZZZ888Z$$77II=7D8O7,.. .
.... .. :DDDDDDDD88DDNNNNNNDDOZ$7II7I7$$77$$777$$I++??III?++++???++=~,,..:~~=+?7ZOOOOZOOOOO88Z$$$?7OOZ~. .
. .8DDDDD8888DDNNNNNNDDZ$77III7$$$7++=++???$DDN8ZZ7I++=I?+====~:,,.::~=I77I?+?788ZZ7I7$OOZZZZZOO:.. ..
.:DDDD8DDDDDDDNDNNDND8$IIIIIIII?=~=~=+?I$88D?ID$?.=+?~~+??=~==~:::::~+III?+IZ8MNDZ7OO$?I7$$$ZZ7.. .
.. ..ODNNDDDDDDDDDNNNNDDD87IIIII?+~~~~=+?7OO$77$ZZ$7?=+I7I++??=~===~~:~~~=7I+~.=Z87NDZ==$ZI+++I$OZ.. . .. .
. ..88ZZZNNNDNNNNNNDNDD8ZI???I?+=~===?III+===~:,:~=+++==~~=++======~~:::~I77?I???7$7$II7$O7?+?$O$. .
..I+=:~$O8DDDNNNNDDD8O$???+??+======~=+==~:,..,:~=~=~~~?+==~~~=====:::~?II?+====~===+++I???+Z$. . .. .
.,~,:==~?ODDDDDDND8OZ7?+++++=~~==~=+===~~~===~~::~~===:::~~=~~=~==:,::=+???+=?+=====+??++?+$:. .. .. .. .
.. .:::+=:,=7ZOODDDD8O$I+?+=++=~~==~~::~~=~~~=======~::,:::~~~~~====~:::~+??+????+++++??+++?=I..
.:,~?~:,,~?7Z8DDD8Z7?+++=+==~~~~~::~~==~=====~~~:,,,,::~~~~~=====~::,~=??=~=+???+======+?~:.
.,~=?,..:+?+?O8D88Z7?+++====~~~:::~~~::::::::::,,,,::::~~~~~==~=~~:,,::=??+======+?++=+??:.
. .,=+=,,:~,:~:$88O8$I+?++++===:::~~~::::::::::::::,,,,,:::=====~~~~::,::~+?++==~~~======++:.
..:~?:::~:..,:+=?777I?++??==~~~~~~::::::::::,,,::,.....,:=======~~::,,,:~~+=~~~~~~~~~=~~==~.
.::?::::,,,:~+~=III??+??+=~~~~~~:::,,,,::,:,,,:,::::::~=+==~==~~~::::,,:~++=~::::::::~~===,.
.~:++,~~~...,=:=III?I???+=~~~~~::,,,.,,,,,,,,,:::::,,~++=~~~==~:::::::::~+??+~:::,:::~~~~==..
.. .:~+:~~+:...:~~?IIIII?++~~~=~:::,,,,,,,....,:::~::::=+=::~~~~::::,..,:::=+?+=~~:,,::::~~=~..
..,~=:,,~~~~+?=?III????+~~~=::::,,,,,,,.,:::~~~~::::~++=:~~=====:,,,,,:~+++?===~,,,:::~~=:. ..
..:=~,.~::~II+I?I?????+~~==~:::,,,,,,,,,:::~=~~:::::=++=~===+++~,::,:~+?+++===~:,,::::~=:. .
...::::=~,,~~=???????++~===~~:::,,:,,,,::~=~~,::,:::~~=++=~~~=+=~~~=+++++?+=~~~~::,:::~~:.
.~~::::,,,:=+II??+?++====~~~:::::,,,,~==~::::::~~~:~~~~~~~~~=++?????I???++====~~:::~~~.
.~~,:::,,==:?I??+++======~~~:~:::,:~=~::~~~~::~~~::~~::~::::~==++???????++++==~:::~=:.
..~:,,,~=,.+I7I++++=====~~~:,::::~=~~~~~~~~~~:::~:::::,::::::~==++++++?++++===~~~~~:.
. .~:,,,,..?77I?+++==~~=~~~~~::~==~~~~~~:::::::,::,,,,,,,,:~~~~===+=++++++?+++=:~==..
.. .~+=:,::=7777??++===~~~~~~:::=~::~:::~~::~~~~:~~::,,..,,::~~~++++++++++?++++=:~+:.
.7O88O8D877$7I??+===~~~~~:::~::~:~~~~+=+?+???++====~=,:~~==+???II????+?+++===:=+,
.ZO8NDD8O7I77II??====~~~=~:,::,::=+I7I?I+?=,,~=~:~=+~~=++++I?++++ZZ$7II?+~~~:~=:....
. $8DDDD8O7I777II?==+=~:~=~:,::,,,:=I$?=7=++,.~~..,~,...~= ..+,,+=77?7I=~~~~,,+:.
.. ?ZDD8OOZ$?I7III?+++=~~~~=~:,::,,:,:=$$7?+I+.,=~..,....,...,~.~?+:=7$+==~,.,~=..
..$8DOOO7?IIIII?+++==~~:=+~:,::,::::=++?77=::?77..:,+:,::?I?~~.+I7I?++=:.,~~..
.7OO8$???IIII??++==~::==~,.,,,:::::~~=+++?::~.,~.,....,=~+7I7I?+?++~~:==,. .. ..
.. .7Z7?+?777II?++===~::~=:..,,,::::~~===~+?I?~~:.=?++?I$77II+???+++~.=~,.
.. .. .IIII++II7I??+++===~::~=:,,,,:::::~=====~~:::=~=~~====+++???++++~:~~...
. .$?I?+=+IIIII???+===~~~+=:,,::::::::::~=~::....~:::=+==++??++++=:+=.. . .
...=7ZI+I+==?I?II??+++++==~=?+:,,:::::::::::::~,...:::~~~~=+++?+++===:..
...7ZZO7~I+==+???III+++++++=~=++,,::::::::::~:,:,,:::::~~~===++++====:..
.7$ZZ$$OZ.??===++????I?++++++=~=?:,,::~::::::::::,:::~~~~~~===++++===:..
.~$Z$$$ZZZO,:I+====++??????++===~=+=:,,::~~::::::::,,::~~~~=~==+++++==+..
.:$$$$$ZZZZ,.?+=====+??????++=====++~::::::::::::::,,,::~~~~===+++==+++.
..,$$$$$$$Z$?.,?+=~~===+?????+==++==?+=~::::::::::::,,.,::::~===++==+?+,. ..
.. ..,$$$$$$$ZZ~.~=~~~~~==++????++++++??+=~::::::::::,...,,,,::~~=+++=?+:...
.....$$$Z$77$Z$:.~~~~~~~===+?++??+++++II?~:::::::::,,..,:,::::~====+++,.. ...
..:ZZ$$I7$$$Z7,~~::~~~~~==+++??++++++?I?+~~:::::,,,::~=~,,,,:~==++?.. ..
. ..I$ZZ$7II$$ZZZ7.:=:~~:::~==++++++????+????+~~~~~:::~~~=~::,::~~??=. .
.. .. .?$$$ZZ$777$ZZ$Z+..=:,::,:~~=====++????????I?+==~=======~~~~~==+II,.. .
.. ..7$$77ZOZ7777Z$$$7I,.::::,:::~~======+?IIII???IIII???I??++?????77~=.
..+$777$OOO$777$Z$$Z$7~.::,,,.:~~~~~~~=~~~=?IIIIIIIIII777777II7?+??.,.. ..
...:7Z$777$ZOOZ$77I$Z$$$77,.:~,,,,:~~::~~~~~~~:,:~==++++++===~=+?I+?I+,=,.
....=$$ZZ77$7$ZOZZO$77I7Z$$$$7+..:,,,,:::::::::::::,,,,:::::::~~~+II?+?$+.?+.
.....?$ZZ$ZZZ7777$$ZOZZZ$77II$Z77?I7:.:,.,,,,::~~::::::::,,,,:::,::~=?II+?7I::ZZ:
.. ......7$$$$$$Z$ZZZ77$$$$ZZZ$$Z7IIIZZ777III:..:.:,,,:~:::,,,,,,,,,,,::,::~+I7?+I7+.7Z$7. . .
....:=7$ZZZZ$$$ZZ$Z7$Z$77$$$$ZZ$Z$O$IIIZZ77II?7I~.~:,,~:::::::,,::,,,,,,,,:~=?$I+=ZI,:$7$$~... .. ..
......,~I77777777777$$$$ZZ$$$77Z$$$$Z$$$ZZ7III$ZI777??II,.,:.,::,:::::,,,,,,:,,,=+?$7+=I?.=$$$7$$7+,.... ..
I$$ZZ$Z$$$$$$$$$7III777$$$Z$$$$7Z$$$$$$$$Z$7II7$7I?II77?7+,.:,,,::::,,::::::,,:~?7$7++I?,?Z$77Z$$7777$7?,.... ..
$$$$$$$ZZZZZZ$$$$ZZZ$$$7$$$$$$$$$$$Z$$$7$Z$7$7I7$$7II77IIII+,.,=::::,::::~~~~~+II7$???~:$$$$77$$$$$777$7777I:..... .
$$$$$$$$$$$$$$$$777$$$$ZZ$$77$$$$$$$$$7$77$$ZOO$+=~:==+?7??II+:.~=~::,:::~~~=?I?I7II:,+ZIZ$77$$Z$$$$$7777III77II+~,.......
777$$$$$$$$$$$7$$$$$ZZZ$7OZZ$7777$$$7$$$ZZZZ,...?+=?=~,......:=+~.,~::::::~~++?7?:..I$$$$$7I$ZZ$Z$$ZZZ$$777II77III777I?+:........ .
77$$$$$$7777$$$ZZ$$$ZZ$$$ZZZ$7$$7$$$7$$$$ZZ+..~I??77I77I+=~,.......,=~====++??+=..:+O$$$7$$7$$$$$$$$$$$$77II77II7II??I777???~,,.......
GlassGiant.com