From: <Saved by Windows Internet Explorer 7>
Subject: Venture Nashville: Talent: Top IT execs need Nashville jobs
Date: Tue, 20 May 2008 12:08:44 -0500
MIME-Version: 1.0
Content-Type: multipart/related;
	type="multipart/alternative";
	boundary="----=_NextPart_000_0000_01C8BA72.4067ED50"
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3198

This is a multi-part message in MIME format.

------=_NextPart_000_0000_01C8BA72.4067ED50
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-Location: http://bp0.blogger.com/__TyKup9BVR0/SCPaznRJmDI/AAAAAAAAAGg/7dpwt1isnFs/s200/Buffkin2.jpg

/9j/4AAQSkZJRgABAQEAYABgAAD/4QD6RXhpZgAASUkqAAgAAAAEADEBAgALAAAAPgAAADIBAgAU
AAAASgAAABMCAwABAAAAAQAAAGmHBAABAAAAXgAAAKwAAABQaWNhc2EgMy4wAAAyMDA4OjA1OjA5
IDAwOjAxOjExAAYAAJAHAAQAAAAAAgIAAZEHAAQAAAABAgMAAKAHAAQAAAAAAQAAAaADAAEAAAD/
/wAAAqAEAAEAAABqAAAAA6AEAAEAAACOAAAAAAAAAAQAAwEDAAEAAAAGAAAAGgEFAAEAAADiAAAA
GwEFAAEAAADqAAAAKAEDAAEAAAACAAAAAAAAAEgAAAABAAAASAAAAAEAAAD/7QAsUGhvdG9zaG9w
IDMuMAA4QklNBAQAAAAAAA8cAlAAClBpY2FzYSAzLjAA/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcH
BwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcO
CAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e
/8AAEQgAjgBqAwEiAAIRAQMRAf/EABwAAAICAwEBAAAAAAAAAAAAAAYHBAUAAgMICf/EAEMQAAEC
BAQCBwUGAggHAAAAAAIBAwAEBRIGERMiITIHMUFCUmFxFCNRgZEVM2KhorFywQgWJEOCkuHwU2Nz
ssLR0v/EABoBAAIDAQEAAAAAAAAAAAAAAAMEAgUGAQD/xAAnEQACAgICAQQCAgMAAAAAAAABAgAD
BBESITEFEyJBUWEGFDKBsf/aAAwDAQACEQMRAD8AuI2jWNroLBTI1Ihb3OFp/wAUUeLMQjSJa1iz
XMdpFxBv5dsDMtWHBJx0pyeffcHlEVVRRUzyREy+HZC9l/E8RDpQXjGltJ0RInbb+QRFVMv8KcY2
mSlZZq110xdTmErE/SpZwsZaoVByoEw2U3VCLIClzz2px6kPP80g8w50aVCqtNzM3rSgru0iaRLU
9ByhVsp9+Y2mEJn2xStXSGYuJStEhJFQvrkv5LGzVVppEQlNA24ncPNFy+MGkt0V08Rt1TEfABZJ
/lVFjaodF8s4wLctMaeXIJZmgr6L1Rz+04PcI2CpEFWHWnw1GHWXRTmICRf2jsQ228hZ+HjFTWsJ
1XDkyT5Ut59gOV2WLi2vpHGlYgYddGVmS03DLY7bwc8l+CwevJDHRMUtxWTvXUuu7GRg3E1qd27K
Nh8UOdfUTPU1GNoyMj09I8RarONU2nvTz5e7ZG4vxfBIlDd3YV/TTiJxr2WiyZXOmOoY9nFVtVfl
A7bOKwtScmlHU6rNTlXKenpgBLmEOCWp2IKLFxhWkVXE0z7NJk8xLOlvISXd5Lt7PWA/C8q45ON2
zGvOvEggXXaq8Pyj1BgehyeGqQzJtFqO9bzva4a80U11nEbl7jYwtPfgSwwZhOkUOWERlQJ/vOuE
p8fK7ODJoBIRERAhSKMJoRIWx2xZMOlaJXQsLO5bCga1qXzT5CNo7RSOwkJDu7eb8UU7e4dsSmnS
Ed0S9zuQegCSnRAtpDcPeQuN0BeM8AUWtNOOsS4Skyu7VDghL5pBVrxsTl3yiJfXiD9nY7E831qa
rVDnnKfVyeF1jaDpjwdD45pkmUWWF68xV2hb5X7VtDxIi9kMzpLw03XqG4LQ/wBpZG6XLz+Hzjzj
JtzLE42/IkcpOo5aLR8AIxTq8s4sca8nQ3KfOxQniNyMivw9VWK1SJeoMDp6g7wLrbMVtMV80JIs
ItAdynPnUjwg8eu3Yzqjj9+o24g2jwtBEQcofV0IHpNFxvHFSli2icwjxl5IAr/OFsoHjGcX/KEX
QjIlNYvZnH92i3eAl1DnD89p0x/F4vWEn0IuaVTIi2k4O30SG8/pl47rYoLzyP6mpwtKksGJki3X
wSUhzVatLsgXpg3QSUwtIrfjAFJlrrSwgkx8MTADxRDlnLRu7vLFg1bbDCnqJWE7mosDGrrVpRIb
CNXdsSYDUXDHcgujdtKED0iUOWlcXVCVIbZSdb1h+fV8+EegnRKFT0uyrn21JzwtXabe78SZon5d
cTxyQ0HnIGpJ+4u+jR98arWJF0t2ojzv/VyQSX5ijawdQC4HdadxjVHAAxzlQ490sj/1g4i/qPxm
UtXRkXjCX6a5bSxVriV3tMqB/RVH9kh0f7uhY9O8i421L1MHbm9NGXREeLarcqfvActgqd/cPiI7
MWUdCZ0PkPtJPjyoKCA+UOqnybj7okX6oTfQ+2XsZO94yBsdvanBYbEzWnWy9jlu4Vl495U7eKpG
eftpqqTxrGoSNUwmrdMg/wAMWgsONW3QtXarUJa4hr0o3u5TJc+HXx6o2p/SJPS08NPqT+m4vLeC
ojifhJUyX5dcd4dbjSZe/iY5BCyWG3dG3vHCERL1ijp9aGcpku406BEe3bF0LpNsE6Wzwx1CJFuh
uTAu8UYQv+GBfEOLJmlCJMOs3LtES7yxBpmL61NXOzgg0147VBOOeXMKQbrUXJIP1DO73JeJM4WX
TXMuMUduca7mYZfTL94OmJq673tx9o8M+zJeCr1wB9MjGvgueMeZn313hyiCHTidtTdTRc9Fsnp0
+aqFwODMkmkvbYiXZfrgyij6PpEpPBNNdL7uZ1Da9BO3/wCYvI0NJBQETH3AhyDIo23Ddy3JAHiW
muVqlVZ928iN64d3gVUg67wwG1cnXJP2Yb2xWaMDLw5rdx+RRUerkgoRNF/HkV67qz9ibdHLehSJ
cmxMSUlIR8+2Cx+lTVQlnGJYnmm7ucc8+PFckGIdMYakyJgdotkgiI97NILqQ+Lngtb2gI8EH6RV
hiTLhE2Av4gXOdHsnU5EZF2Y0CTMSdJrM93buRYuMS4ep5YcZp7AygusOG5rDK2K4pLmo2jkPpwg
uJrV3NiAkXeilq7ZMNe/K5yCe4QOMkMEA8pQ4DYmpOoMtuOmQ3bh/wBIdWuLssLbv6oVdDLVqrZN
7suYoZUsRE0N0RrhHqBEEcX0Upx8mxIBbVswHcq2qXUuaZdsV+BejcqUUw6U+DutrIFt7ZCho3lu
E06rC/zQxGmj3X7hjsItlyjaP4RSGFcp2IndSGlHQaTUaYeg7NOzLXhJpEtXyyXLjEPpLYb/AKsV
C4TtRvM7vgi8YNpMBH7sbR/hyinxHTmKihSD4ATEz7t27wLzflAidGc57JH6i7Yp/wBmYFocreZC
2KKF45Lk400Sp9YgwYdIJakpJu8u4BMfNUL+SQH3RoMI7qmW9SGsg/6/5I5RD+zA1Zp9wdRt8bSD
zXtiVHOZb1WtPVNsfwRHMxzfXxXzJ+m5gxbCW8GVst7t0mx5UyH49UEVFd3W3dcC+n7NMk00R2h4
oMMOU/2qnlMt7SDjGZKsrcT5E1dF4YBh4PcJBfFqW1BLk5oX9eqD89UPeFa0hW5QaC4LdP8AfjcK
jAfOexvk5aO67uxMAx17hqSMK1CnsVMWCmAElhpSb7Hswlqhb15kXZCfk8ItTkyTjYmLiEhDbDCw
1Tytcln7xFvLZ2QxUkWa7qFWq97IT0uQOCm7b3kiRSpliaAS+PMPhiLLTAywi0I6babRGI+1ioa7
X3Txbh8KpEj8OzA9PuEToiA7Iq33BKpS7RjcKkt6eVhRKFy667wpAfiypv0+ZZmJUrTRy1PTJYGO
VrgLFiwpQs049KhA3Mycs1tFRJ00H45IKftAXEqpT01UZkpmad1HF/TEWNLRX7aBZlMm73rC84xl
sZGf7+nGCAaO4Dcpah7uoXeMUKCzB04LFMmm+bIbvlCvHE0vVcVVCVYd1GGBTRL/AIgDzqn14QaY
VnA1SaLvjbb6xmMusi8ia7BbeMv6jK9hYnsOS742W8RL5wrcUSNep9Qcdp4yjssnI0QqDhcUzW7i
nV5QYU+sFT6e9SXyuG5CaLxJEqclm6hJ7h3d23zgKtqWCDZ7lDhieqbutrjPMWcGh0mCMuKpx94O
X1gqoNTqZSOvOSc8zMqOTotC04HUnKerx+kR6LJuMC9q2CNq2bdufp1QXUEXCFu4tuml3Xnn2wyj
fepO1lC8QZRv/wBZp58fYZWXkmwcXVdnmr1cDJMrBAkyXj1qq+kWlKlpr7uZ5lJCuty6vmsXWmLd
zY7c+7HG1tgit+8Xl/DELTvqLkkDQnSZcEbi5RuWF3jZ26bZb/CpQbVBwR2l4dxeHKFrXpoZqqvO
DuFNol6cFhr0+sNdv8St9UcJj8fsyHGRrxjOMXxmY8TjcIiREQCKcxFwQfWF7jjG0m/IvUykTBuE
ex14eCZdojGuOq97cLknJun7I2KiJj/er8YV42lJi3fa62S3RIJrudA7kUaq7TavL1Bq8nGXkLSH
hcCdY/SHc0+5TSkalLlq02cbR6RmB4I4BcfkfYqdlsee6gJC/aXb3ocn9GrFkjMo90e4jsmafO5v
U/X7jnFXARexS6084qs7GFo39y0wstqW19Q0qdVKafZf7od2DjDNVF1gRbG4rbvpAviXAFUpTpO0
l05uS5tI/vG/Jcs88vikU9IqE5TXBJwTEUK4f/XCKY1sDNBRkLvzGtJuPzJWkR23XWiXZ6wSU9x1
hq5u+1PEUCeHKzTZxpt0nbXEzG3s7ILJSoSNttoGN3e+MTCnUae1NScw+66Vzvbuzjj7SJOuOfDa
P4o41CptEJNNWXL2D3Yg6brjXfEeYo6VMCzAkATJx1+ok4xKjcVq8veVEzySF2PL+r6w6cE00Xqu
Nu1tlk1Dby5pb/5R5ipWNhFptqoSp3BtImu6qcFzRVi39Mq+JaZ31i3dgT8Q04xnGK2n16kT33E4
zcvcIsl/OLLf3ersiyKmVESM8QiIiPKndgRnmtKruN914bw9U4F+8EU+WY8UisqiIotPLzNmpp5p
2pBSNzm4OVNgi+8G0vDEORKalJxmalXTYfYcBxp0esTRUtX6wW1aVaVhXluuTqge74wJ6wYVG0Z7
o6FKkXSFgWTq7VgzYe5nmh/u3x609F60/ii+rXRa7U/ei002/wCPgl38Xxjyz/RZx/N4J6RZaVbF
x6mVR1uTm2EXqVSFAcHNclIVNE49ilx6o+gYKqlxhRsZIdb3E82VLA9QoszbPU42Bu4PNFsL5xKk
6Y+Ii3763/uj0O+2DjRC6KGBJkokmaKnpA3VcIyBCUxT8pN3LO1EzbVfMez5Qtbj6X4xyjM7AeLy
lU0W2veDbFkTTTY7topuIi6so7gKiVql8uz+UT8MUz7XqpuvEISUm4o6SKqk84lpZr2CKXIvDmXr
yTatbWjWtoS3tyFpTlL7BNNKUkCmHQIDmMlQC4KIJy5+fxjwTiofs/HWJqYQhbK1ibZEfIX3BT8o
+jDaIi5J1R8/enmUGU6bsUaZZA7Pm4qZdRLkqr9VWNFjKEAUTL32Gxixg6Ll3LzJ3Y7faEwnDVme
H/NWIIX7d0d7i+MOCAE//9k=

------=_NextPart_000_0000_01C8BA72.4067ED50
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.blogger.com/img/icon18_email.gif

R0lGODlhEgANAOMAAIqKioCAgOXl5f////Ly8urq6uTk5AAAAMzMzLS0tBoaGjMzM2ZmZk1NTf//
/////ywAAAAAEgANAAAEWRDISSsIk+jN+QUIQAxkaRIgVoSjWaKIoa6iOxygIQNFz56Lg27X89UO
isMiqZv1AAnRgdFYHoROqEAAQCqZxIJ2SxYsA03euLw9CBJozJpdhmMC+Lx+j48AADs=

------=_NextPart_000_0000_01C8BA72.4067ED50
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.blogger.com/img/icon18_edit_allbkg.gif

R0lGODlhEgASAOMAANDHu6pqNFRTUOWjJQAAABYWFhAJA9CPKUk1ErmIF+KjUygVBjMmBv/BMfy2
I9DHuyH5BAEAAA8ALAAAAAASABIAAARP8MlJq72TYLyM3hQRBB4oFcoxlhujAMAKIk6jKMKHIY0z
qLoLz3dIFEAMBzGBABkGy+aGkCAGpBjRcmEKAFKB4KUAg4kvhPJ5TCBgTfBKBAA7

------=_NextPart_000_0000_01C8BA72.4067ED50
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-Location: http://bp1.blogger.com/__TyKup9BVR0/SC8BF9qpZNI/AAAAAAAAAHo/ycLk1vZDtR8/S220/VNC.jpg

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

------=_NextPart_000_0000_01C8BA72.4067ED50
Content-Type: image/png
Content-Transfer-Encoding: base64
Content-Location: http://www.blogger.com/img/icon18_wrench_allbkg.png

iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAA1VBMVEX///9/f38gSoc0ZaTr6efs
6uj+/v6vr691kK5shaFlhKxje5WduNL5+fj09PSRpr7o5+bo5+Tk4+Hj4+Lj4uHX4u3f39/t6+mf
n56EnLaNmKWVlZGBk6mOjo7u8/aBipWGhobz8vH49/bt6+pZfatUfK77+/tgdo9gd5Hq6urq6ej/
//+krbaXpbaQpr76+vnBwcGkutDT3+rY2NfA0eL4+Pf6+vqdts7PzcrMzMywxtvc3Nzz8/JbcYmi
rryhtMjw9PedsMpFcant8vZfX17y8e/w8PCUA2JZAAAAAXRSTlMAQObYZgAAALRJREFUeF5N0FWu
AzEMQNHYgUEoMzPDQ2bY/5LqcVL13c+j2LIi8gBAuMLQyiq5dibXZxsNyVgePSI2nVh69iQvIhoz
yTvJUlwClPW+TWIIKCj81utKqQS+UhKu+3BLqU9ZmzC4qxBRptOGuIT+cYdyM4N/cvV2H+GhYs6G
zWorihdolHKG773OPPZfEYzWbJh9bFmEgPzdgOjpu28lt9IPzWIQ32QsbC9/IMiCyMrl5xCduE6l
mw1pZ6RL9QAAAABJRU5ErkJggg==

------=_NextPart_000_0000_01C8BA72.4067ED50
Content-Type: text/css;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.blogger.com/widgets/3319451950-blogarchive.css

#ArchiveList .toggle {
	CURSOR: pointer; FONT-FAMILY: Arial, sans-serif
}
#ArchiveList .toggle-open {
	LINE-HEIGHT: 0.6em; _font-size: 1.7em
}
#ArchiveList {
	TEXT-ALIGN: left
}
#ArchiveList A.post-count-link {
	TEXT-DECORATION: none
}
#ArchiveList A.post-count-link:link {
	TEXT-DECORATION: none
}
#ArchiveList A.post-count-link:visited {
	TEXT-DECORATION: none
}
#ArchiveList A.toggle {
	TEXT-DECORATION: none
}
#ArchiveList A.toggle:link {
	TEXT-DECORATION: none
}
#ArchiveList A.toggle:visited {
	TEXT-DECORATION: none
}
#ArchiveList A.toggle:hover {
	TEXT-DECORATION: none
}
.BlogArchive #ArchiveList UL LI {
	BORDER-TOP-WIDTH: 0px; LIST-STYLE: none none outside; PADDING-LEFT: =
15px; BORDER-LEFT-WIDTH: 0px; BACKGROUND: none transparent scroll repeat =
0% 0%; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: 0px; TEXT-INDENT: -15px; =
BORDER-RIGHT-WIDTH: 0px
}
.BlogArchive #ArchiveList UL UL LI {
	PADDING-LEFT: 1.2em
}
.BlogArchive #ArchiveList UL {
	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; =
BORDER-LEFT-WIDTH: 0px; LIST-STYLE-IMAGE: none; BORDER-BOTTOM-WIDTH: =
0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px; =
LIST-STYLE-TYPE: none; BORDER-RIGHT-WIDTH: 0px
}
.BlogArchive #ArchiveList UL UL {
	MARGIN-TOP: 5px
}
.BlogArchive #ArchiveList UL.posts LI {
	PADDING-LEFT: 1.3em
}
#ArchiveList .collapsed UL {
	DISPLAY: none
}

------=_NextPart_000_0000_01C8BA72.4067ED50
Content-Type: text/css;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.blogger.com/css/blog_controls.css

.item-control {
	DISPLAY: none
}
.item-control A {
	TEXT-DECORATION: none! important
}
.item-action A {
	TEXT-DECORATION: none! important
}
.widget-item-control {
	FLOAT: right
}
.icon-action {
	MARGIN: 0px 0px -5px 0.5em; BORDER-TOP-STYLE: none! important; =
BORDER-RIGHT-STYLE: none! important; BORDER-LEFT-STYLE: none! important; =
BORDER-BOTTOM-STYLE: none! important
}
.delete-comment-icon {
	PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: =
url(/img/icon_delete13.gif) no-repeat left 50%; PADDING-BOTTOM: 7px; =
PADDING-TOP: 7px
}

@media All   =20
{
.BLOG_mobile_video_class {
	DISPLAY: none
}

}

@media Handheld   =20
{
.BLOG_mobile_video_class {
	DISPLAY: inline
}
.BLOG_video_class {
	DISPLAY: none
}

}

------=_NextPart_000_0000_01C8BA72.4067ED50
Content-Type: text/css;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.blogger.com/widgets/3597482671-blog.css

.backlink-toggle-zippy {
	PADDING-RIGHT: 11px; BACKGROUND: =
url(http://www.blogger.com/img/triangle_ltr.gif) no-repeat left center; =
CURSOR: hand; MARGIN-RIGHT: 0.1em
}
.expanded-backlink .backlink-toggle-zippy {
	BACKGROUND-IMAGE: url(http://www.blogger.com/img/triangle_open.gif)
}
.collapsed-backlink .collapseable {
	DISPLAY: none
}
.status-msg-wrap {
	FONT-SIZE: 110%; MARGIN: 10px auto; WIDTH: 90%; POSITION: relative
}
.status-msg-border {
	BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; FILTER: =
alpha(opacity=3D40); BORDER-LEFT: #000000 1px solid; WIDTH: 100%; =
BORDER-BOTTOM: #000000 1px solid; POSITION: relative; -moz-opacity: .40; =
opacity: .40
}
.status-msg-bg {
	Z-INDEX: 1; FILTER: alpha(opacity=3D30); WIDTH: 100%; POSITION: =
relative; BACKGROUND-COLOR: #cccccc; -moz-opacity: .80; opacity: .80
}
.status-msg-body {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; Z-INDEX: 4; PADDING-BOTTOM: =
0.3em; WIDTH: 100%; PADDING-TOP: 0.3em; POSITION: absolute; TEXT-ALIGN: =
center
}
.status-msg-hidden {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; VISIBILITY: hidden; =
PADDING-BOTTOM: 0.3em; PADDING-TOP: 0.3em
}
.status-msg-wrap A {
	PADDING-LEFT: 0.4em; TEXT-DECORATION: underline
}
#comments .blogger-comment-icon {
	PADDING-LEFT: 20px; BACKGROUND: url(/img/b16-rounded.gif) no-repeat =
left 50%; LINE-HEIGHT: 16px
}
.blogger-comment-icon {
	PADDING-LEFT: 20px; BACKGROUND: url(/img/b16-rounded.gif) no-repeat =
left 50%; LINE-HEIGHT: 16px
}
#comments .openid-comment-icon {
	PADDING-LEFT: 20px; BACKGROUND: url(/img/openid16-rounded.gif) =
no-repeat left 50%; LINE-HEIGHT: 16px
}
.openid-comment-icon {
	PADDING-LEFT: 20px; BACKGROUND: url(/img/openid16-rounded.gif) =
no-repeat left 50%; LINE-HEIGHT: 16px
}
#comments .anon-comment-icon {
	PADDING-LEFT: 20px; BACKGROUND: url(/img/anon16-rounded.gif) no-repeat =
left 50%; LINE-HEIGHT: 16px
}
.anon-comment-icon {
	PADDING-LEFT: 20px; BACKGROUND: url(/img/anon16-rounded.gif) no-repeat =
left 50%; LINE-HEIGHT: 16px
}
.paging-control-container {
	FONT-SIZE: 80%; FLOAT: right; MARGIN: 0px 6px 0px 0px
}
.unneeded-paging-control {
	VISIBILITY: hidden
}

------=_NextPart_000_0000_01C8BA72.4067ED50
Content-Type: image/png
Content-Transfer-Encoding: base64
Content-Location: http://www.blogger.com/img/navbar/3/btn_search_this.png

iVBORw0KGgoAAAANSUhEUgAAAGAAAAAPCAMAAAAs5DqFAAAAUVBMVEVEREQwMDB/f38vLy+ZmZlK
SkpeXl5xcXGFhYU3NzeSkpJra2tmZmZYWFhRUVE9PT1MTEyMjIxkZGQ4ODg1NTV4eHg5OTldXV1L
S0tnZ2d+fn5RAPHoAAABXklEQVR4XrWU2YrsMAxEdbTY2bfe7/9/6MUiMPTDQM9DFwmSRZUPNiRy
fZbpNX2qdH5uLttVtrgbn8r4m+7PTR4X+BrB7kUm7Hv7Y5NMhjEPPhPuHjD6SOuHGWT3kXDwAA53
13NJ82YMMnmAHtBmI1mqGUzyMsOGpe8zCXTa0frisBfWH0CWc8mhkLEEsHgC2mx1ob0CxnmCoctk
BPQ+e4NF7RDvIedvgIgTkDE43QmIBFE6UgkwQ3ZfCFeFxcm+GyLd5PwNoJoAMnY69voGODTcAZvk
ReqmCYdx0CHvfVTEV/j9ijJGOuhdEiDe0xXmnXAjT4BBiVvNs/dojZqw1Ve6GvELoHZ9xkhAFJcW
XdmPxVfWoRTHzBJgjFp7RFUFFUTbwzjTVy3ZqwDwTziXNG/GIJMLjKozcmttKyMkwD7/ENL5uSwB
5WJ88V/xkC0u3wKYXZ6bXLfH9DWV7fofIhMYzf6cbfsAAAAASUVORK5CYII=

------=_NextPart_000_0000_01C8BA72.4067ED50
Content-Type: text/css;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.blogger.com/v-css/navbar/3328360018-navbar.css

BODY {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 100%; PADDING-BOTTOM: =
0px; MARGIN: 0px; PADDING-TOP: 0px; FONT-FAMILY: "Trebuchet =
MS",Verdana,Arial,Sans-serif; WHITE-SPACE: nowrap
}
A {
	TEXT-DECORATION: none
}
#b-navbar {
	FONT-SIZE: 0.85em; LINE-HEIGHT: 0.85em; BORDER-BOTTOM: #024 1px solid; =
HEIGHT: 29px
}
#b-navbar #b-logo {
	LEFT: 5px; POSITION: absolute; TOP: 0.15em
}
#b-navbar #b-logo #navbar-logo {
	WIDTH: 24px; HEIGHT: 24px
}
#b-navbar #b-logo SPAN {
	DISPLAY: block; LEFT: -9000px; POSITION: absolute
}
#b-search {
	PADDING-RIGHT: 1em; PADDING-LEFT: 0.5em; PADDING-BOTTOM: 3px; MARGIN: =
0px 0px 0px 34px; PADDING-TOP: 4px
}
#b-search TD {
	VERTICAL-ALIGN: middle
}
#b-query {
	MARGIN: 0px 0.5em 0px 0px
}
.btn {
	PADDING-RIGHT: 0px; BORDER-TOP: 1px solid; PADDING-LEFT: 0px; =
FONT-SIZE: 0.8em; PADDING-BOTTOM: 0px; MARGIN: 0px 0.5em 0px 1px; =
TEXT-TRANSFORM: uppercase; CURSOR: hand; LINE-HEIGHT: 0.85em; =
PADDING-TOP: 0px; BORDER-BOTTOM: 1px solid; WHITE-SPACE: nowrap
}
.btn DIV {
	BORDER-RIGHT: 1px solid; PADDING-RIGHT: 0.3em; PADDING-LEFT: 0.3em; =
PADDING-BOTTOM: 0.21em; MARGIN: 0px -1px; BORDER-LEFT: 1px solid; =
PADDING-TOP: 0.21em; POSITION: relative; HEIGHT: 0.85em
}
.btn DIV IMG {
	LEFT: 0.3em; POSITION: absolute; TOP: 0.2em
}
#bt-flag-body {
	PADDING-LEFT: 1em
}
#bt-unflag-body {
	PADDING-LEFT: 1em
}
#bt-unflag-body {
	DISPLAY: none
}
.flagged #bt-flag-body {
	DISPLAY: none
}
.flagged #bt-unflag-body {
	DISPLAY: block
}
#flagi {
	BORDER-RIGHT: #333 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: #333 1px =
solid; DISPLAY: none; PADDING-LEFT: 4px; FONT-SIZE: 0.7em; Z-INDEX: 300; =
PADDING-BOTTOM: 4px; BORDER-LEFT: #333 1px solid; COLOR: #000; =
LINE-HEIGHT: 0.8em; PADDING-TOP: 4px; BORDER-BOTTOM: #333 1px solid; =
TOP: 3px; BACKGROUND-COLOR: #ff9
}
#unflagi {
	BORDER-RIGHT: #333 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: #333 1px =
solid; DISPLAY: none; PADDING-LEFT: 4px; FONT-SIZE: 0.7em; Z-INDEX: 300; =
PADDING-BOTTOM: 4px; BORDER-LEFT: #333 1px solid; COLOR: #000; =
LINE-HEIGHT: 0.8em; PADDING-TOP: 4px; BORDER-BOTTOM: #333 1px solid; =
TOP: 3px; BACKGROUND-COLOR: #ff9
}
#flagi A {
	COLOR: #3366cc; TEXT-DECORATION: underline
}
#unflagi A {
	COLOR: #3366cc; TEXT-DECORATION: underline
}
.b-mobile {
	DISPLAY: none
}
#b-sms {
	PADDING-RIGHT: 7px; PADDING-LEFT: 7px; FONT-SIZE: 100%; PADDING-BOTTOM: =
4px; MARGIN: 0px 0px 0px 100px; LINE-HEIGHT: 1em; PADDING-TOP: 4px; =
TEXT-ALIGN: left
}
#b-sms A {
	LINE-HEIGHT: 1em; MARGIN-RIGHT: 0.5em
}
#b-sms A:hover {
	TEXT-DECORATION: underline
}

@media Handheld   =20
{
BODY .b-mobile {
	DISPLAY: block
}
BODY #b-search {
	DISPLAY: none
}
BODY #flagi {
	DISPLAY: none
}
BODY #unflagi {
	DISPLAY: none
}
BODY #b-navbar #b-logo SPAN {
	DISPLAY: none
}

}

------=_NextPart_000_0000_01C8BA72.4067ED50
Content-Type: text/css;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.blogger.com/v-css/navbar/1899273448-3.css

BODY {
	COLOR: #fff
}
A {
	COLOR: #ccc
}
.btn DIV {
	COLOR: #ccc
}
A:hover {
	COLOR: #fff
}
#navbar-logo {
	BACKGROUND-IMAGE: url(../../img/navbar/3/logobar.png)
}
#b-navbar {
	BORDER-BOTTOM: #222 1px solid; BACKGROUND-COLOR: #111
}
#b-search {
	BACKGROUND: url(../../img/navbar/3/corner.gif) #333 no-repeat left =
bottom
}
#b-query {
	BORDER-RIGHT: #555 1px solid; BORDER-TOP: #555 1px solid; BORDER-LEFT: =
#555 1px solid; BORDER-BOTTOM: #555 1px solid
}
.btn {
	BORDER-LEFT-COLOR: #555; BORDER-BOTTOM-COLOR: #555; BORDER-TOP-COLOR: =
#555; BORDER-RIGHT-COLOR: #555
}
.btn DIV {
	BORDER-LEFT-COLOR: #555; BORDER-BOTTOM-COLOR: #555; BORDER-TOP-COLOR: =
#555; BORDER-RIGHT-COLOR: #555
}
.btn DIV:hover {
	BACKGROUND-COLOR: #555
}

------=_NextPart_000_0000_01C8BA72.4067ED50
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.blogger.com/v-js/3625575137-cookies.common.js

// Copyright 2005, Google Inc.=0A=
// =0A=
// Operations on cookies that are common across our pages.=0A=
//=0A=
// Original Author: Pal Takacsi-Nagy (pal@google.com)=0A=
=0A=
=0A=
/**=0A=
 * Sets a Cookie with the given name and value.=0A=
 *=0A=
 * name       Name of the cookie=0A=
 * value      Value of the cookie=0A=
 * [expires]  Expiration date of the cookie (default: end of current =
session)=0A=
 * [path]     Path where the cookie is valid (default: path of calling =
document)=0A=
 * [domain]   Domain where the cookie is valid=0A=
 *              (default: domain of calling document)=0A=
 * [secure]   Boolean value indicating if the cookie transmission =
requires a=0A=
 *              secure transmission=0A=
 */=0A=
function setCookie(name, value, domain, expires, path, secure) {=0A=
    document.cookie =3D name + "=3D" + escape(value) +=0A=
        ((expires) ? "; expires=3D" + expires.toGMTString() : "") +=0A=
        ((path) ? "; path=3D" + path : "") +=0A=
        ((domain) ? "; domain=3D" + domain : "") +=0A=
        ((secure) ? "; secure" : "");=0A=
}=0A=
=0A=
/**=0A=
 * Gets the value of the specified cookie.=0A=
 *=0A=
 * name  Name of the desired cookie.=0A=
 *=0A=
 * Returns a string containing value of specified cookie,=0A=
 *   or null if cookie does not exist.=0A=
 */=0A=
function getCookie(name) {=0A=
    var dc =3D document.cookie;=0A=
    var prefix =3D name + "=3D";=0A=
    var begin =3D dc.indexOf("; " + prefix);=0A=
=0A=
    if (begin =3D=3D -1) {=0A=
        begin =3D dc.indexOf(prefix);=0A=
        if (begin !=3D 0) return null;=0A=
    } else {=0A=
        begin +=3D 2;=0A=
    }=0A=
=0A=
    var end =3D document.cookie.indexOf(";", begin);=0A=
=0A=
    if (end =3D=3D -1) {=0A=
        end =3D dc.length;=0A=
    }=0A=
=0A=
    return unescape(dc.substring(begin + prefix.length, end));=0A=
}=0A=

------=_NextPart_000_0000_01C8BA72.4067ED50
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.blogger.com/v-app/scripts/1019856700-common.js

// Copied from .../google3/javascript/common.js=0A=
=0A=
//-----------------------------------------------------------------------=
-=0A=
// This file contains common utilities and basic javascript =
infrastructure.=0A=
//=0A=
// Notes:=0A=
// * Press 'D' to toggle debug mode.=0A=
//=0A=
// Functions:=0A=
//=0A=
// - Assertions=0A=
// DEPRECATED: Use assert.js=0A=
// AssertTrue(): assert an expression. Throws an exception if false.=0A=
// Fail(): Throws an exception. (Mark block of code that should be =
unreachable)=0A=
// AssertEquals(): assert that two values are equal.=0A=
// AssertNumArgs(): assert number of arguments for the function=0A=
// AssertType(): assert that a value has a particular type=0A=
//=0A=
// - Cookies=0A=
// SetCookie(): Sets a cookie.=0A=
// ExpireCookie(): Expires a cookie.=0A=
// GetCookie(): Gets a cookie value.=0A=
//=0A=
// - Dynamic HTML/DOM utilities=0A=
// MaybeGetElement(): get an element by its id=0A=
// GetElement(): get an element by its id=0A=
// GetParentNode(): Get the parent of an element=0A=
// GetAttribute(): Get attribute value of a DOM node=0A=
// SetInnerHTML(): set the inner HTML of a node=0A=
// GetInnerHTML(): get the inner HTML of a node=0A=
// ClearInnerHTML(): clear the inner HTML of a node=0A=
// SetCssStyle(): Sets a CSS property of a node.=0A=
// GetStyleProperty(): Get CSS property from a style attribute string=0A=
// ShowElement(): Show/hide element by setting the "display" css =
property.=0A=
// ShowBlockElement(): Show/hide block element=0A=
// SetButtonText(): Set the text of a button element.=0A=
// AppendNewElement(): Create and append a html element to a parent node.=0A=
// CreateDIV(): Create a DIV element and append to the document.=0A=
// CreateIFRAME(): Create an IFRAME and append to the document.=0A=
// HasClass(): check if element has a given class=0A=
// AddClass(): add a class to an element=0A=
// RemoveClass(): remove a class from an element=0A=
//=0A=
// - Window/Screen utiltiies=0A=
// GetPageOffsetLeft(): get the X page offset of an element=0A=
// GetPageOffsetTop(): get the Y page offset of an element=0A=
// GetPageOffset(): get the X and Y page offsets of an element=0A=
// GetPageOffsetRight() : get X page offset of the right side of an =
element=0A=
// GetPageOffsetRight() : get Y page offset of the bottom of an element=0A=
// GetScrollTop(): get the vertical scrolling pos of a window.=0A=
// GetScrollLeft(): get the horizontal scrolling pos of a window=0A=
// IsScrollAtEnd():  check if window scrollbar has reached its maximum =
offset=0A=
// ScrollTo(): scroll window to a position=0A=
// ScrollIntoView(): scroll window so that an element is in view.=0A=
// GetWindowWidth(): get width of a window.=0A=
// GetWindowHeight(): get height of a window=0A=
// GetAvailScreenWidth(): get available screen width=0A=
// GetAvailScreenHeight(): get available screen height=0A=
// GetNiceWindowHeight(): get a nice height for a new browser window.=0A=
// Open{External/Internal}Window(): open a separate window=0A=
// CloseWindow(): close a window=0A=
//=0A=
// - DOM walking utilities=0A=
// AnnotateTerms(): find terms in a node and decorate them with some tag=0A=
// AnnotateText(): find terms in a text node and decorate them with some =
tag=0A=
//=0A=
// - String utilties=0A=
// HtmlEscape(): html escapes a string=0A=
// HtmlUnescape(): remove html-escaping.=0A=
// QuoteEscape(): escape " quotes.=0A=
// CollapseWhitespace(): collapse multiple whitespace into one =
whitespace.=0A=
// Trim(): trim whitespace on ends of string=0A=
// IsEmpty(): check if CollapseWhiteSpace(String) =3D=3D ""=0A=
// IsLetterOrDigit(): check if a character is a letter or a digit=0A=
// ConvertEOLToLF(): normalize the new-lines of a string.=0A=
// HtmlEscapeInsertWbrs(): HtmlEscapes and inserts <wbr>s (word break =
tags)=0A=
//   after every n non-space chars and/or after or before certain =
special chars=0A=
//=0A=
// - TextArea utilities=0A=
// GetCursorPos(): finds the cursor position of a textfield=0A=
// SetCursorPos(): sets the cursor position in a textfield=0A=
//=0A=
// - Array utilities=0A=
// FindInArray(): do a linear search to find an element value.=0A=
// DeleteArrayElement(): return a new array with a specific value =
removed.=0A=
// CloneObject(): clone an object, copying its values recursively.=0A=
// CloneEvent(): clone an event; cannot use CloneObject because it=0A=
//               suffers from infinite recursion=0A=
//=0A=
// - Formatting utilities=0A=
// PrintArray(): used to print/generate HTML by combining static text=0A=
// and dynamic strings.=0A=
// ImageHtml(): create html for an img tag=0A=
// FormatJSLink(): formats a link that invokes js code when clicked.=0A=
// MakeId3(): formats an id that has two id numbers, eg, foo_3_7=0A=
//=0A=
// - Miscellaneous=0A=
// IsDefined(): returns true if argument is not undefined=0A=
//-----------------------------------------------------------------------=
-=0A=
=0A=
// browser detection=0A=
var agent =3D navigator.userAgent.toLowerCase();=0A=
var is_ie =3D (agent.indexOf('msie') !=3D -1);=0A=
//var is_ie5 =3D (agent.indexOf('msie 5') !=3D -1 && document.all);=0A=
var is_konqueror =3D (agent.indexOf('konqueror') !=3D -1);=0A=
var is_safari =3D (agent.indexOf('safari') !=3D -1) || is_konqueror;=0A=
var is_nav =3D !is_ie && !is_safari && (agent.indexOf('mozilla') !=3D =
-1);=0A=
var is_win =3D (agent.indexOf('win') !=3D -1);=0A=
delete agent;=0A=
=0A=
=0A=
var BACKSPACE_KEYCODE =3D 8;=0A=
var COMMA_KEYCODE =3D 188;                // ',' key=0A=
var DEBUG_KEYCODE =3D 68;                 // 'D' key=0A=
var DELETE_KEYCODE =3D 46;=0A=
var DOWN_KEYCODE =3D 40;                  // DOWN arrow key=0A=
var ENTER_KEYCODE =3D 13;                 // ENTER key=0A=
var ESC_KEYCODE =3D 27;                   // ESC key=0A=
var LEFT_KEYCODE =3D 37;                  // LEFT arrow key=0A=
var RIGHT_KEYCODE =3D 39;                 // RIGHT arrow key=0A=
var SPACE_KEYCODE =3D 32;                 // space bar=0A=
var TAB_KEYCODE =3D 9;                    // TAB key=0A=
var UP_KEYCODE =3D 38;                    // UP arrow key=0A=
var SHIFT_KEYCODE =3D 16;=0A=
=0A=
// This is a "constant" but has different values depending on the browser=0A=
var semicolon_keycode =3D (is_ie ? 186 : 59);=0A=
=0A=
var MAX_EMAIL_ADDRESS_LENGTH =3D 320;     // 64 + '@' + 255=0A=
var MAX_SIGNATURE_LENGTH =3D 1000;        // 1000 chars of maximum =
signature=0A=
=0A=
//-----------------------------------------------------------------------=
-=0A=
// Assertions=0A=
// DEPRECATED: Use assert.js=0A=
//-----------------------------------------------------------------------=
-=0A=
/**=0A=
 * DEPRECATED: Use assert.js=0A=
 */=0A=
function raise(msg) {=0A=
  if (typeof Error !=3D 'undefined') {=0A=
    throw new Error(msg || 'Assertion Failed');=0A=
  } else {=0A=
    throw (msg);=0A=
  }=0A=
}=0A=
=0A=
/**=0A=
 * DEPRECATED: Use assert.js=0A=
 *=0A=
 * Fail() is useful for marking logic paths that should=0A=
 * not be reached. For example, if you have a class that uses=0A=
 * ints for enums:=0A=
 *=0A=
 * MyClass.ENUM_FOO =3D 1;=0A=
 * MyClass.ENUM_BAR =3D 2;=0A=
 * MyClass.ENUM_BAZ =3D 3;=0A=
 *=0A=
 * And a switch statement elsewhere in your code that=0A=
 * has cases for each of these enums, then you can=0A=
 * "protect" your code as follows:=0A=
 *=0A=
 * switch(type) {=0A=
 *   case MyClass.ENUM_FOO: doFooThing(); break;=0A=
 *   case MyClass.ENUM_BAR: doBarThing(); break;=0A=
 *   case MyClass.ENUM_BAZ: doBazThing(); break;=0A=
 *   default:=0A=
 *     Fail("No enum in MyClass with value: " + type);=0A=
 * }=0A=
 *=0A=
 * This way, if someone introduces a new value for this enum=0A=
 * without noticing this switch statement, then the code will=0A=
 * fail if the logic allows it to reach the switch with the=0A=
 * new value, alerting the developer that he should add a=0A=
 * case to the switch to handle the new value he has introduced.=0A=
 *=0A=
 * @param {string} opt_msg to display for failure=0A=
 *                 DEFAULT: "Assertion failed"=0A=
 */=0A=
function Fail(opt_msg) {=0A=
  if (opt_msg =3D=3D=3D undefined) opt_msg =3D 'Assertion failed';=0A=
  if (IsDefined(DumpError)) DumpError(opt_msg + '\n');=0A=
  raise(opt_msg);=0A=
}=0A=
=0A=
/**=0A=
 * DEPRECATED: Use assert.js=0A=
 *=0A=
 * Asserts that an expression is true (non-zero and non-null).=0A=
 *=0A=
 * Note that it is critical not to pass logic=0A=
 * with side-effects as the expression for AssertTrue=0A=
 * because if the assertions are removed by the=0A=
 * JSCompiler, then the expression will be removed=0A=
 * as well, in which case the side-effects will=0A=
 * be lost. So instead of this:=0A=
 *=0A=
 *  AssertTrue( criticalComputation() );=0A=
 *=0A=
 * Do this:=0A=
 *=0A=
 *  var result =3D criticalComputation();=0A=
 *  AssertTrue(result);=0A=
 *=0A=
 * @param {anything} expression to evaluate=0A=
 * @param {string}   opt_msg to display if the assertion fails=0A=
 *=0A=
 */=0A=
function AssertTrue(expression, opt_msg) {=0A=
  if (!expression) {=0A=
    if (opt_msg =3D=3D=3D undefined) opt_msg =3D 'Assertion failed';=0A=
    Fail(opt_msg);=0A=
  }=0A=
}=0A=
=0A=
/**=0A=
 * DEPRECATED: Use assert.js=0A=
 *=0A=
 * Asserts that two values are the same.=0A=
 *=0A=
 * @param {anything} val1=0A=
 * @param {anything} val2=0A=
 * @param {string} opt_msg to display if the assertion fails=0A=
 */=0A=
function AssertEquals(val1, val2, opt_msg) {=0A=
  if (val1 !=3D val2) {=0A=
    if (opt_msg =3D=3D=3D undefined) {=0A=
      opt_msg =3D "AssertEquals failed: <" + val1 + "> !=3D <" + val2 + =
">";=0A=
    }=0A=
    Fail(opt_msg);=0A=
  }=0A=
}=0A=
=0A=
/**=0A=
 * DEPRECATED: Use assert.js=0A=
 *=0A=
 * Asserts that a value is of the provided type.=0A=
 *=0A=
 *   AssertType(6, Number);=0A=
 *   AssertType("ijk", String);=0A=
 *   AssertType([], Array);=0A=
 *   AssertType({}, Object);=0A=
 *   AssertType(ICAL_Date.now(), ICAL_Date);=0A=
 *=0A=
 * @param {anything} value=0A=
 * @param {constructor function} type=0A=
 * @param {string} opt_msg to display if the assertion fails=0A=
 */=0A=
function AssertType(value, type, opt_msg) {=0A=
  // for backwards compatability only=0A=
  if (typeof value =3D=3D type) return;=0A=
=0A=
  if (value || value =3D=3D "") {=0A=
    try {=0A=
      if (type =3D=3D AssertTypeMap[typeof value] || value instanceof =
type) return;=0A=
    } catch (e) { /* failure, type was an illegal argument to instanceof =
*/ }=0A=
  }=0A=
  if (opt_msg =3D=3D=3D undefined) {=0A=
    if (typeof type =3D=3D 'function') {=0A=
      var match =3D type.toString().match(/^\s*function\s+([^\s\{]+)/);=0A=
      if (match) type =3D match[1];=0A=
    }=0A=
    opt_msg =3D "AssertType failed: <" + value + "> not typeof "+ type;=0A=
  }=0A=
  Fail(opt_msg);=0A=
}=0A=
=0A=
var AssertTypeMap =3D {=0A=
  'string'  : String,=0A=
  'number'  : Number,=0A=
  'boolean' : Boolean=0A=
};=0A=
=0A=
/**=0A=
 * DEPRECATED: Use assert.js=0A=
 *=0A=
 * Asserts that the number of arguments to a=0A=
 * function is num. For example:=0A=
 *=0A=
 * function myFunc(one, two, three) [=0A=
 *   AssertNumArgs(3);=0A=
 *   ...=0A=
 * }=0A=
 *=0A=
 * myFunc(1, 2); // assertion fails!=0A=
 *=0A=
 * Note that AssertNumArgs does not take the function=0A=
 * as an argument; it is simply used in the context=0A=
 * of the function.=0A=
 *=0A=
 * @param {int} number of arguments expected=0A=
 * @param {string} opt_msg to display if the assertion fails=0A=
 */=0A=
function AssertNumArgs(num, opt_msg) {=0A=
  var caller =3D AssertNumArgs.caller;  // This is not supported in =
safari 1.0=0A=
  if (caller && caller.arguments.length !=3D num) {=0A=
    if (opt_msg =3D=3D=3D undefined) {=0A=
      opt_msg =3D caller.name + ' expected ' + num + ' arguments '=0A=
                  + ' but received ' + caller.arguments.length;=0A=
    }=0A=
    Fail(opt_msg);=0A=
  }=0A=
}=0A=
=0A=
//-----------------------------------------------------------------------=
-=0A=
// Cookies=0A=
//-----------------------------------------------------------------------=
-=0A=
var ILLEGAL_COOKIE_CHARS_RE =3D /[\s;]/=0A=
/**=0A=
 * Sets a cookie.=0A=
 * The max_age can be -1 to set a session cookie. To expire cookies, use=0A=
 * ExpireCookie() instead.=0A=
 *=0A=
 * @param name The cookie name.=0A=
 * @param value The cookie value.=0A=
 * @param opt_max_age The max age in seconds (from now). Use -1 to set a=0A=
 *   session cookie. If not provided, the default is -1 (i.e. set a =
session=0A=
 *   cookie).=0A=
 * @param opt_path The path of the cookie, or null to not specify a path=0A=
 *   attribute (browser will use the full request path). If not =
provided, the=0A=
 *   default is '/' (i.e. path=3D/).=0A=
 * @param opt_domain The domain of the cookie, or null to not specify a =
domain=0A=
 *   attribute (brower will use the full request host name). If not =
provided,=0A=
 *   the default is null (i.e. let browser use full request host name).=0A=
 * @return Void.=0A=
 */=0A=
function SetCookie(name, value, opt_max_age, opt_path, opt_domain) {=0A=
=0A=
  value =3D '' + value;=0A=
  AssertTrue((typeof name =3D=3D 'string' &&=0A=
              typeof value =3D=3D 'string' &&=0A=
              !name.match(ILLEGAL_COOKIE_CHARS_RE) &&=0A=
              !value.match(ILLEGAL_COOKIE_CHARS_RE)),=0A=
             'trying to set an invalid cookie');=0A=
=0A=
  if (!IsDefined(opt_max_age)) opt_max_age =3D -1;=0A=
  if (!IsDefined(opt_path)) opt_path =3D '/';=0A=
  if (!IsDefined(opt_domain)) opt_domain =3D null;=0A=
=0A=
  var domain_str =3D (opt_domain =3D=3D null) ? '' : ';domain=3D' + =
opt_domain;=0A=
  var path_str =3D (opt_path =3D=3D null) ? '' : ';path=3D' + opt_path;=0A=
=0A=
  var expires_str;=0A=
=0A=
  // Case 1: Set a session cookie.=0A=
  if (opt_max_age < 0) {=0A=
    expires_str =3D '';=0A=
=0A=
  // Case 2: Expire the cookie.=0A=
  // Note: We don't tell people about this option in the function doc =
because=0A=
  // we prefer people to use ExpireCookie() to expire cookies.=0A=
  } else if (opt_max_age =3D=3D 0) {=0A=
    // Note: Don't use Jan 1, 1970 for date because NS 4.76 will try to =
convert=0A=
    // it to local time, and if the local time is before Jan 1, 1970, =
then the=0A=
    // browser will ignore the Expires attribute altogether.=0A=
    var pastDate =3D new Date(1970, 1 /*Feb*/, 1);  // Feb 1, 1970=0A=
    expires_str =3D ';expires=3D' + pastDate.toUTCString();=0A=
=0A=
  // Case 3: Set a persistent cookie.=0A=
  } else {=0A=
    var futureDate =3D new Date(Now() + opt_max_age * 1000);=0A=
    expires_str =3D ';expires=3D' + futureDate.toUTCString();=0A=
  }=0A=
=0A=
  document.cookie =3D name + '=3D' + value + domain_str + path_str + =
expires_str;=0A=
}=0A=
=0A=
var EXPIRED_COOKIE_VALUE =3D 'EXPIRED';=0A=
=0A=
/**=0A=
 * Expires a cookie.=0A=
 *=0A=
 * @param name The cookie name.=0A=
 * @param opt_path The path of the cookie, or null to expire a cookie =
set at=0A=
 *   the full request path. If not provided, the default is '/' (i.e. =
path=3D/).=0A=
 * @param opt_domain The domain of the cookie, or null to expire a =
cookie set=0A=
 *   at the full request host name. If not provided, the default is null =
(i.e.=0A=
 *   cookie at full request host name).=0A=
 * @return Void.=0A=
 */=0A=
function ExpireCookie(name, opt_path, opt_domain) {=0A=
  SetCookie(name, EXPIRED_COOKIE_VALUE, 0, opt_path, opt_domain);=0A=
}=0A=
=0A=
/** Returns the value for the first cookie with the given name=0A=
 * @param name : string=0A=
 * @return a string or the empty string if no cookie found.=0A=
 */=0A=
function GetCookie(name) {=0A=
  var nameeq =3D name + "=3D";=0A=
  var cookie =3D String(document.cookie);=0A=
  for (var pos =3D -1; (pos =3D cookie.indexOf(nameeq, pos + 1)) >=3D =
0;) {=0A=
    var i =3D pos;=0A=
    // walk back along string skipping whitespace and looking for a ; =
before=0A=
    // the name to make sure that we don't match cookies whose name =
contains=0A=
    // the given name as a suffix.=0A=
    while (--i >=3D 0) {=0A=
      var ch =3D cookie.charAt(i);=0A=
      if (ch =3D=3D ';') {=0A=
        i =3D -1;  // indicate success=0A=
        break;=0A=
      } else if (' \t'.indexOf(ch) < 0) {=0A=
        break;=0A=
      }=0A=
    }=0A=
    if (-1 =3D=3D=3D i) {  // first cookie in the string or we found a ;=0A=
      var end =3D cookie.indexOf(';', pos);=0A=
      if (end < 0) { end =3D cookie.length; }=0A=
      return cookie.substring(pos + nameeq.length, end);=0A=
    }=0A=
  }=0A=
  return "";=0A=
}=0A=
=0A=
=0A=
//-----------------------------------------------------------------------=
-=0A=
// Time=0A=
//-----------------------------------------------------------------------=
-=0A=
function Now() {=0A=
  return (new Date()).getTime();=0A=
}=0A=
=0A=
//-----------------------------------------------------------------------=
-=0A=
// Dynamic HTML/DOM utilities=0A=
//-----------------------------------------------------------------------=
-=0A=
// Gets a element by its id, may return null=0A=
function MaybeGetElement(win, id) {=0A=
  return win.document.getElementById(id);=0A=
}=0A=
=0A=
// Same as MaybeGetElement except that it throws an exception if it's =
null=0A=
function GetElement(win, id) {=0A=
  var el =3D win.document.getElementById(id);=0A=
  if (!el) {=0A=
    DumpError("Element " + id + " not found.");=0A=
  }=0A=
  return el;=0A=
}=0A=
=0A=
// Gets elements by its id/name=0A=
// IE treats getElementsByName as searching over ids, while Moz use =
names.=0A=
// so tags must have both id and name as the same string=0A=
function GetElements(win, id) {=0A=
  return win.document.getElementsByName(id);=0A=
}=0A=
=0A=
// Gets the parent of a html element.=0A=
function GetParentNode(n) {=0A=
  try {=0A=
    return n.parentNode;=0A=
  } catch (e) {=0A=
    // n.parentNode may throw a permission-denied exception on mozilla=0A=
    // (e.g. on text element), ignore this exception.=0A=
    return n;=0A=
  }=0A=
}=0A=
=0A=
function IsDescendant(parent, child) {=0A=
  do {=0A=
    if (parent =3D=3D=3D child) return true;=0A=
    child =3D GetParentNode(child);=0A=
  } while (child && child !=3D=3D document.body);=0A=
  return false;=0A=
}=0A=
=0A=
// Get attribute value of a DOM node=0A=
function GetAttribute(node, attribute) {=0A=
  if (!node.getAttribute) {=0A=
    return null;=0A=
  }=0A=
  var attr =3D node.getAttribute(attribute);=0A=
  if (is_ie && attribute =3D=3D "style") {=0A=
    return attr.value;=0A=
  } else {=0A=
    return attr;=0A=
  }=0A=
}=0A=
=0A=
// Sets inner html of a html element=0A=
function SetInnerHTML(win, id, html) {=0A=
  try {=0A=
    GetElement(win, id).innerHTML =3D html;=0A=
  } catch (ex) {=0A=
    DumpException(ex);=0A=
  }=0A=
}=0A=
=0A=
// Gets inner-html of a html element=0A=
function GetInnerHTML(win, id) {=0A=
  try {=0A=
    return GetElement(win, id).innerHTML;=0A=
  } catch (ex) {=0A=
    DumpException(ex);=0A=
    return "";=0A=
  }=0A=
}=0A=
=0A=
// Clears inner html of a html element=0A=
function ClearInnerHTML(win, id) {=0A=
  try {=0A=
    GetElement(win, id).innerHTML =3D "";=0A=
  } catch (ex) {=0A=
    DumpException(ex);=0A=
  }=0A=
}=0A=
=0A=
// Sets a CSS style of an element=0A=
function SetCssStyle(win, id, name, value) {=0A=
  try {=0A=
    var elem =3D GetElement(win, id);=0A=
    elem.style[name] =3D value;=0A=
  } catch (ex) {=0A=
    DumpException(ex);=0A=
  }=0A=
}=0A=
=0A=
// Get CSS property from a style attribute string=0A=
function GetStyleProperty(style, name) {=0A=
  var i =3D style.indexOf(name);=0A=
  if (i !=3D -1) {=0A=
    var j =3D style.indexOf(";", i);=0A=
    if (j =3D=3D -1) {=0A=
      j =3D style.length;=0A=
    }=0A=
    // the +1 below is for the colon following the attribute name=0A=
    return CollapseWhitespace(style.substring(i + name.length + 1, j));=0A=
  }=0A=
  return null;=0A=
}=0A=
=0A=
// Show/hide an element.=0A=
function ShowElement(el, show) {=0A=
  el.style.display =3D show ? "" : "none";=0A=
}=0A=
=0A=
// Show/hide a block element.=0A=
// ShowElement() doesn't work if object has an initial class with =
display:none=0A=
function ShowBlockElement(el, show) {=0A=
  el.style.display =3D show ? "block" : "none";=0A=
}=0A=
=0A=
// Show/hide an inline element.=0A=
// ShowElement() doesn't work when an element starts off display:none.=0A=
function ShowInlineElement(el, show) {=0A=
  el.style.display =3D show ? "inline" : "none";=0A=
}=0A=
=0A=
// Set the text of a button. This is to get around a bug in mozilla,=0A=
// where we can't set the text of a button by setting innerHTML.=0A=
function SetButtonText(button, text) {=0A=
  button.childNodes[0].nodeValue =3D text;=0A=
}=0A=
=0A=
// Append a new HTML element to a HTML node.=0A=
function AppendNewElement(win, parent, tag) {=0A=
  var e =3D win.document.createElement(tag);=0A=
  parent.appendChild(e);=0A=
  return e;=0A=
}=0A=
=0A=
// Finds the child with the given ID, or null if there is node.=0A=
// This does not search the children's children.=0A=
function FindChildWithID(parent, id) {=0A=
  var el;=0A=
  for (el =3D parent.firstChild; el && el.id !=3D id; el =3D =
el.nextSibling) {=0A=
    // skip=0A=
  }=0A=
  return el;=0A=
}=0A=
=0A=
// Adds a disabled option to the given menu=0A=
function AddMenuDisabledOption(win, menu, html) {=0A=
  var op =3D AppendNewElement(win, menu, 'OPTION');=0A=
  op.disabled =3D true;=0A=
  op.innerHTML =3D html;=0A=
=0A=
  return op;=0A=
}=0A=
=0A=
// Adds a option to the given menu=0A=
function AddMenuOption(win, menu, value, html) {=0A=
  var op =3D AppendNewElement(win, menu, 'OPTION');=0A=
  op.value =3D value;=0A=
  op.innerHTML =3D html;=0A=
=0A=
  return op;=0A=
}=0A=
=0A=
// Create a new DIV (append it to the end of the document)=0A=
function CreateDIV(win, id) {=0A=
  var div =3D MaybeGetElement(win, id);=0A=
  if (!div) {=0A=
    div =3D AppendNewElement(win, win.document.body, "div");=0A=
    div.id =3D id;=0A=
  }=0A=
  return div;=0A=
}=0A=
=0A=
// Create a new IFRAME (append it to the end of the document)=0A=
function CreateIFRAME(win, id, url) {=0A=
  var iframe =3D MaybeGetElement(win, id);=0A=
  if (!iframe) {=0A=
    // We cannot create an IFRAME directly (IE doesn't allow it), so we=0A=
    // create a DIV and then insert an IFRAME.=0A=
    // We also give the IFRAME a name (same as id)=0A=
    var div =3D AppendNewElement(win, win.document.body, "div");=0A=
    div.innerHTML =3D "<iframe id=3D" + id + " name=3D" + id +=0A=
             " src=3D" + url + "></iframe>";=0A=
    iframe =3D GetElement(win, id);=0A=
  }=0A=
  return iframe;=0A=
}=0A=
=0A=
// Create a new TR containing the given td's=0A=
function Tr(win, tds) {=0A=
  var tr =3D win.document.createElement("TR");=0A=
  for (var i =3D 0; i < tds.length; i++) {=0A=
    tr.appendChild(tds[i]);=0A=
  }=0A=
  return tr;=0A=
}=0A=
=0A=
// Create a new TD, with an optional colspan=0A=
function Td(win, opt_colspan) {=0A=
  var td =3D win.document.createElement("TD");=0A=
  if (opt_colspan) {=0A=
    td.colSpan =3D opt_colspan;=0A=
  }=0A=
  return td;=0A=
}=0A=
=0A=
=0A=
// Check if an element has a given class=0A=
function HasClass(el, cl) {=0A=
  if (el =3D=3D null || el.className =3D=3D null) return false;=0A=
  var classes =3D el.className.split(" ");=0A=
  for (var i =3D 0; i < classes.length; i++) {=0A=
    if (classes[i] =3D=3D cl) {=0A=
      return true;=0A=
    }=0A=
  }=0A=
  return false;=0A=
}=0A=
=0A=
// Add a class to element=0A=
function AddClass(el, cl) {=0A=
  if (HasClass(el, cl)) return;=0A=
  el.className +=3D " " + cl;=0A=
}=0A=
=0A=
// Remove a class from an element=0A=
function RemoveClass(el, cl) {=0A=
  if (el.className =3D=3D null) return;=0A=
  var classes =3D el.className.split(" ");=0A=
  var result =3D [];=0A=
  var changed =3D false;=0A=
  for (var i =3D 0; i < classes.length; i++) {=0A=
    if (classes[i] !=3D cl) {=0A=
      if (classes[i]) { result.push(classes[i]); }=0A=
    } else {=0A=
      changed =3D true;=0A=
    }=0A=
  }=0A=
  if (changed) { el.className =3D result.join(" "); }=0A=
}=0A=
=0A=
// Performs an in-order traversal of the tree rooted at the given node=0A=
// (excluding the root node) and returns an array of nodes that match the=0A=
// given selector. The selector must implement the method:=0A=
//=0A=
// boolean select(node);=0A=
//=0A=
// This method is a generalization of the DOM method =
"getElementsByTagName"=0A=
//=0A=
function GetElementsBySelector(root, selector) {=0A=
  var nodes =3D [];=0A=
  for (var child =3D root.firstChild; child; child =3D =
child.nextSibling) {=0A=
    AddElementBySelector_(child, selector, nodes);=0A=
  }=0A=
  return nodes;=0A=
}=0A=
=0A=
// Recursive helper for GetElemnetsBySelector()=0A=
function AddElementBySelector_(root, selector, nodes) {=0A=
  // First test the parent=0A=
  if (selector.select(root)) {=0A=
    nodes.push(root);=0A=
  }=0A=
=0A=
  // Then recurse through the children=0A=
  for (var child =3D root.firstChild; child; child =3D =
child.nextSibling) {=0A=
    AddElementBySelector_(child, selector, nodes);=0A=
  }=0A=
}=0A=
=0A=
//-----------------------------------------------------------------------=
-=0A=
// Window/screen utilities=0A=
// TODO: these should be renamed (e.g. GetWindowWidth to =
GetWindowInnerWidth=0A=
// and moved to geom.js)=0A=
//-----------------------------------------------------------------------=
-=0A=
// Get page offset of an element=0A=
function GetPageOffsetLeft(el) {=0A=
  var x =3D el.offsetLeft;=0A=
  if (el.offsetParent !=3D null)=0A=
    x +=3D GetPageOffsetLeft(el.offsetParent);=0A=
  return x;=0A=
}=0A=
=0A=
// Get page offset of an element=0A=
function GetPageOffsetTop(el) {=0A=
  var y =3D el.offsetTop;=0A=
  if (el.offsetParent !=3D null)=0A=
    y +=3D GetPageOffsetTop(el.offsetParent);=0A=
  return y;=0A=
}=0A=
=0A=
// Get page offset of an element=0A=
function GetPageOffset(el) {=0A=
  var x =3D el.offsetLeft;=0A=
  var y =3D el.offsetTop;=0A=
  if (el.offsetParent !=3D null) {=0A=
    var pos =3D GetPageOffset(el.offsetParent);=0A=
    x +=3D pos.x;=0A=
    y +=3D pos.y;=0A=
  }=0A=
  return {x: x, y: y};=0A=
}=0A=
=0A=
function GetPageOffsetRight(el) {=0A=
  return GetPageOffsetLeft(el) + el.offsetWidth;=0A=
}=0A=
=0A=
function GetPageOffsetBottom(el) {=0A=
  return GetPageOffsetTop(el) + el.offsetHeight;=0A=
}=0A=
=0A=
// Get the y position scroll offset.=0A=
function GetScrollTop(win) {=0A=
  // all except Explorer=0A=
  if ("pageYOffset" in win) {=0A=
    return win.pageYOffset;=0A=
  }=0A=
  // Explorer 6 Strict Mode=0A=
  else if ("documentElement" in win.document &&=0A=
           "scrollTop" in win.document.documentElement) {=0A=
    return win.document.documentElement.scrollTop;=0A=
  }=0A=
  // other Explorers=0A=
  else if ("scrollTop" in win.document.body) {=0A=
    return win.document.body.scrollTop;=0A=
  }=0A=
=0A=
  return 0;=0A=
}=0A=
=0A=
// Get the x position scroll offset.=0A=
function GetScrollLeft(win) {=0A=
  // all except Explorer=0A=
  if ("pageXOffset" in win) {=0A=
    return win.pageXOffset;=0A=
  }=0A=
  // Explorer 6 Strict Mode=0A=
  else if ("documentElement" in win.document &&=0A=
           "scrollLeft" in win.document.documentElement) {=0A=
    return win.document.documentElement.scrollLeft;=0A=
  }=0A=
  // other Explorers=0A=
  else if ("scrollLeft" in win.document.body) {=0A=
    return win.document.body.scrollLeft;=0A=
  }=0A=
=0A=
  return 0;=0A=
}=0A=
=0A=
/**=0A=
 * Checks if window scrollbar has reached its maximum offset=0A=
 *=0A=
 * @param win a window object=0A=
 * @param opt_isHoriz true if horizontal bar, false if vertical=0A=
 */=0A=
function IsScrollAtEnd(win, opt_isHoriz) {=0A=
  var total =3D=0A=
    (opt_isHoriz) ? document.body.offsetWidth : =
document.body.offsetHeight;=0A=
  var inner =3D=0A=
    (opt_isHoriz) ? GetWindowWidth(win) : GetWindowHeight(win);=0A=
  var offset =3D=0A=
    (opt_isHoriz) ? GetScrollLeft(win) : GetScrollTop(win);=0A=
=0A=
  return (inner + offset >=3D total || total < inner);=0A=
}=0A=
=0A=
// Scroll window to pos=0A=
// position: 0 =3D top, 0.5 =3D middle, 1 =3D bottom=0A=
function ScrollTo(win, el, position) {=0A=
  var y =3D GetPageOffsetTop(el);=0A=
  y -=3D GetWindowHeight(win) * position;=0A=
  win.scrollTo(0, y);=0A=
}=0A=
=0A=
// Scroll so that as far as possible the entire element is in view.=0A=
var ALIGN_BOTTOM =3D 'b';=0A=
var ALIGN_MIDDLE =3D 'm';=0A=
var ALIGN_TOP =3D 't';=0A=
function ScrollIntoView(win, el, alignment) {=0A=
  var el_top =3D GetPageOffsetTop(el);=0A=
  var el_bottom =3D el_top + el.offsetHeight;=0A=
  var win_top =3D GetScrollTop(win);=0A=
  var win_height =3D GetWindowHeight(win);=0A=
  var win_bottom =3D win_top + win_height;=0A=
=0A=
  // Out of view?=0A=
  if (el_top < win_top ||=0A=
      el_bottom > win_bottom) {=0A=
=0A=
    var scrollto_y;=0A=
    if (alignment =3D=3D ALIGN_BOTTOM) {=0A=
      scrollto_y =3D el_bottom - win_height + 5;=0A=
    } else if (alignment =3D=3D ALIGN_MIDDLE) {=0A=
      scrollto_y =3D (el_top + el_bottom) / 2 - win_height/2;=0A=
    } else {=0A=
      scrollto_y =3D el_top - 5;        // ALIGN_TOP=0A=
    }=0A=
=0A=
    Debug("Scrolling to " + scrollto_y);=0A=
    win.scrollTo(0, scrollto_y);=0A=
  }=0A=
}=0A=
=0A=
function IsElementVisible(win, id) {=0A=
  var el =3D MaybeGetElement(win, id);=0A=
  if (el =3D=3D null) {=0A=
    return false;=0A=
  }=0A=
  var el_top =3D GetPageOffsetTop(el);=0A=
  var el_bottom =3D el_top + el.offsetHeight;=0A=
  var win_top =3D GetScrollTop(win);=0A=
  var win_bottom =3D win_top + GetWindowHeight(win);=0A=
  if (el_top >=3D win_top && el_bottom <=3D win_bottom) {=0A=
    return true;=0A=
  }=0A=
  return false;=0A=
}=0A=
=0A=
function GetWindowWidth(win) {=0A=
  // all except Explorer=0A=
  if ("innerWidth" in win) {=0A=
    return win.innerWidth;=0A=
  }=0A=
  // Explorer 6 Strict Mode=0A=
  else if ("documentElement" in win.document &&=0A=
           "clientWidth" in win.document.documentElement) {=0A=
    return win.document.documentElement.clientWidth;=0A=
  }=0A=
  // other Explorers=0A=
  else if ("clientWidth" in win.document.body) {=0A=
    return win.document.body.clientWidth;=0A=
  }=0A=
=0A=
  return 0;=0A=
}=0A=
=0A=
function GetWindowHeight(win) {=0A=
  // all except Explorer=0A=
  if ("innerHeight" in win) {=0A=
    return win.innerHeight;=0A=
  }=0A=
  // Explorer 6 Strict Mode=0A=
  else if ("documentElement" in win.document &&=0A=
           "clientHeight" in win.document.documentElement) {=0A=
    return win.document.documentElement.clientHeight;=0A=
  }=0A=
  // other Explorers=0A=
  else if ("clientHeight" in win.document.body) {=0A=
    return win.document.body.clientHeight;=0A=
  }=0A=
=0A=
  return 0;=0A=
}=0A=
=0A=
function GetAvailScreenWidth(win) {=0A=
  return win.screen.availWidth;=0A=
}=0A=
=0A=
function GetAvailScreenHeight(win) {=0A=
  return win.screen.availHeight;=0A=
}=0A=
=0A=
// Returns a "nice" window height.=0A=
// Use the screen height. (Or should we use the height of the current =
window?)=0A=
function GetNiceWindowHeight(win) {=0A=
  return Math.floor(0.8 * GetAvailScreenHeight(win));=0A=
}=0A=
=0A=
// Used for horizontally centering a new window of the given width in the=0A=
// available screen. Set the new window's distance from the left of the =
screen=0A=
// equal to this function's return value.=0A=
// Params: width: the width of the new window=0A=
// Returns: the distance from the left edge of the screen for the new =
window to=0A=
//   be horizontally centered=0A=
function GetCenteringLeft(win, width) {=0A=
  return (win.screen.availWidth - width) >> 1;=0A=
}=0A=
=0A=
// Used for vertically centering a new window of the given height in the=0A=
// available screen. Set the new window's distance from the top of the =
screen=0A=
// equal to this function's return value.=0A=
// Params: height: the height of the new window=0A=
// Returns: the distance from the top edge of the screen for the new =
window to=0A=
//   be vertically aligned.=0A=
function GetCenteringTop(win, height) {=0A=
  return (win.screen.availHeight - height) >> 1;=0A=
}=0A=
=0A=
/*=0A=
 * Opens a child popup window that has no browser toolbar/decorations.=0A=
 * (Copied from caribou's common.js library with small modifications.)=0A=
 *=0A=
 * @param url the URL for the new window (Note: this will be =
unique-ified)=0A=
 * @param opt_name the name of the new window=0A=
 * @param opt_width the width of the new window=0A=
 * @param opt_height the height of the new window=0A=
 * @param opt_center if true, the new window is centered in the =
available screen=0A=
 * @param opt_hide_scrollbars if true, the window hides the scrollbars=0A=
 * @param opt_noresize if true, makes window unresizable=0A=
 * @param opt_blocked_msg message warning that the popup has been blocked=0A=
 * @return a reference to the new child window=0A=
 */=0A=
function Popup(url, opt_name, opt_width, opt_height, opt_center,=0A=
               opt_hide_scrollbars, opt_noresize, opt_blocked_msg) {=0A=
  if (!opt_height) {=0A=
    opt_height =3D Math.floor(GetWindowHeight(window.top) * 0.8);=0A=
  }=0A=
  if (!opt_width) {=0A=
    opt_width =3D Math.min(GetAvailScreenWidth(window), opt_height);=0A=
  }=0A=
=0A=
  var features =3D "resizable=3D" + (opt_noresize ? "no" : "yes") + "," +=0A=
                 "scrollbars=3D" + (opt_hide_scrollbars ? "no" : "yes") =
+ "," +=0A=
                 "width=3D" + opt_width + ",height=3D" + opt_height;=0A=
  if (opt_center) {=0A=
    features +=3D ",left=3D" + GetCenteringLeft(window, opt_width) + "," =
+=0A=
                "top=3D" + GetCenteringTop(window, opt_height);=0A=
  }=0A=
  return OpenWindow(window, url, opt_name, features, opt_blocked_msg);=0A=
}=0A=
=0A=
/*=0A=
 * Opens a new window. Returns the new window handle. Tries to open the =
new=0A=
 * window using top.open() first. If that doesn't work, then tries =
win.open().=0A=
 * If that still doesn't work, prints an alert.=0A=
 * (Copied from caribou's common.js library with small modifications.)=0A=
 *=0A=
 * @param win the parent window from which to open the new child window=0A=
 * @param url the URL for the new window (Note: this will be =
unique-ified)=0A=
 * @param opt_name the name of the new window=0A=
 * @param opt_features the properties of the new window=0A=
 * @param opt_blocked_msg message warning that the popup has been blocked=0A=
 * @return a reference to the new child window=0A=
 */=0A=
function OpenWindow(win, url, opt_name, opt_features, opt_blocked_msg) {=0A=
  var newwin =3D OpenWindowHelper(top, url, opt_name, opt_features);=0A=
  if (!newwin || newwin.closed || !newwin.focus) {=0A=
    newwin =3D OpenWindowHelper(win, url, opt_name, opt_features);=0A=
  }=0A=
  if (!newwin || newwin.closed || !newwin.focus) {=0A=
    if (opt_blocked_msg) alert(opt_blocked_msg);=0A=
  } else {=0A=
    // Make sure that the window has the focus=0A=
    newwin.focus();=0A=
  }=0A=
  return newwin;=0A=
}=0A=
=0A=
/*=0A=
 * Helper for OpenWindow().=0A=
 * (Copied from caribou's common.js library with small modifications.)=0A=
 */=0A=
function OpenWindowHelper(win, url, name, features) {=0A=
  var newwin;=0A=
  if (features) {=0A=
    newwin =3D win.open(url, name, features);=0A=
  } else if (name) {=0A=
    newwin =3D win.open(url, name);=0A=
  } else {=0A=
    newwin =3D win.open(url);=0A=
  }=0A=
  return newwin;=0A=
}=0A=
=0A=
//-----------------------------------------------------------------------=
-=0A=
// DOM walking utilities=0A=
//-----------------------------------------------------------------------=
-=0A=
=0A=
function MaybeEscape(str, escape) {=0A=
  return escape ? HtmlEscape(str) : str;=0A=
}=0A=
=0A=
=0A=
//-----------------------------------------------------------------------=
-=0A=
// Window data=0A=
//-----------------------------------------------------------------------=
-=0A=
// Gets an array, which can store data for the window. This data=0A=
// is deleted when the window is unloaded.=0A=
var windata =3D [];=0A=
function GetWindowData(win) {=0A=
  var data =3D windata[win.name];=0A=
  if (!data) {=0A=
    windata[win.name] =3D data =3D [];=0A=
  }=0A=
  return data;=0A=
}=0A=
=0A=
// Clear js data for a window.=0A=
function ClearWindowData(win_name) {=0A=
  if (windata[win_name]) {=0A=
    windata[win_name] =3D null;=0A=
  }=0A=
}=0A=
=0A=
//-----------------------------------------------------------------------=
-=0A=
// String utilities=0A=
//-----------------------------------------------------------------------=
-=0A=
// Do html escaping=0A=
var amp_re_ =3D /&/g;=0A=
var lt_re_ =3D /</g;=0A=
var gt_re_ =3D />/g;=0A=
=0A=
// Convert text to HTML format. For efficiency, we just convert '&', =
'<', '>'=0A=
// characters.=0A=
// Note: Javascript >=3D 1.3 supports lambda expression in the =
replacement=0A=
// argument. But it's slower on IE.=0A=
// Note: we can also implement HtmlEscape by setting the value=0A=
// of a textnode and then reading the 'innerHTML' value, but that=0A=
// that turns out to be slower.=0A=
// Params: str: String to be escaped.=0A=
// Returns: The escaped string.=0A=
function HtmlEscape(str) {=0A=
  if (!str) return "";=0A=
  return str.replace(amp_re_, "&amp;").replace(lt_re_, "&lt;").=0A=
    replace(gt_re_, "&gt;").replace(quote_re_, "&quot;");=0A=
}=0A=
=0A=
/** converts html entities to plain text.  It covers the most common =
named=0A=
 * entities and numeric entities.=0A=
 * It does not cover all named entities -- it covers =
&{lt,gt,amp,quot,nbsp}; but=0A=
 * does not handle some of the more obscure ones like &{ndash,eacute};.=0A=
 */=0A=
function HtmlUnescape(str) {=0A=
  if (!str) return "";=0A=
  return str.=0A=
    replace(/&#(\d+);/g,=0A=
      function (_, n) { return String.fromCharCode(parseInt(n, 10)); }).=0A=
    replace(/&#x([a-f0-9]+);/gi,=0A=
      function (_, n) { return String.fromCharCode(parseInt(n, 16)); }).=0A=
    replace(/&(\w+);/g, function (_, entity) {=0A=
      entity =3D entity.toLowerCase();=0A=
      return entity in HtmlUnescape.unesc ? HtmlUnescape.unesc[entity] : =
'?';=0A=
    });=0A=
}=0A=
HtmlUnescape.unesc =3D { lt: '<', gt: '>', quot: '"', nbsp: ' ', amp: =
'&' };=0A=
=0A=
// Replace multiple spaces with &nbsp; to retain whitespace formatting=0A=
// in addition to escaping '&', '<', and '>'.=0A=
var dbsp_re_ =3D /  /g;=0A=
var ret_re_ =3D /\r/g;=0A=
var nl_re_ =3D /\n/g;=0A=
function HtmlWhitespaceEscape(str) {=0A=
  str =3D HtmlEscape(str);=0A=
  str =3D str.replace(dbsp_re_, "&nbsp;&nbsp;");=0A=
  str =3D str.replace(ret_re_, "");=0A=
  str =3D str.replace(nl_re_, "<br>");=0A=
  return str;=0A=
}=0A=
=0A=
// Escape double quote '"' characters in addition to '&', '<', '>' so =
that a=0A=
// string can be included in an HTML tag attribute value within double =
quotes.=0A=
// Params: str: String to be escaped.=0A=
// Returns: The escaped string.=0A=
var quote_re_ =3D /\"/g;=0A=
function QuoteEscape(str) {=0A=
  return HtmlEscape(str).replace(quote_re_, "&quot;");=0A=
}=0A=
=0A=
var JS_SPECIAL_RE_ =3D /[\'\\\r\n\b\"<>&]/g;=0A=
=0A=
function JSEscOne_(s) {=0A=
  if (!JSEscOne_.js_escs_) {=0A=
    var escapes =3D {};=0A=
    escapes['\\'] =3D '\\\\';=0A=
    escapes['\''] =3D '\\047';=0A=
    escapes['\n'] =3D '\\n';=0A=
    escapes['\r'] =3D '\\r';=0A=
    escapes['\b'] =3D '\\b';=0A=
    escapes['\"'] =3D '\\042';=0A=
    escapes['<'] =3D  '\\074';=0A=
    escapes['>'] =3D  '\\076';=0A=
    escapes['&'] =3D  '\\046';=0A=
=0A=
    JSEscOne_.js_escs_ =3D escapes;=0A=
  }=0A=
=0A=
  return JSEscOne_.js_escs_[s];=0A=
}=0A=
=0A=
/** convert a string to a javascript string literal.  This function has =
the=0A=
  * property that the return value is also already html escaped, so the =
output=0A=
  * can be embedded in an html handler attribute.=0A=
  */=0A=
function ToJSString(s) {=0A=
  return "'" + s.toString().replace(JS_SPECIAL_RE_, JSEscOne_) + "'";=0A=
}=0A=
=0A=
// converts multiple ws chars to a single space, and strips=0A=
// leading and trailing ws=0A=
var spc_re_ =3D /\s+/g;=0A=
var beg_spc_re_ =3D /^ /;=0A=
var end_spc_re_ =3D / $/;=0A=
function CollapseWhitespace(str) {=0A=
  if (!str) return "";=0A=
  return str.replace(spc_re_, " ").replace(beg_spc_re_, "").=0A=
    replace(end_spc_re_, "");=0A=
}=0A=
=0A=
var newline_re_ =3D /\r?\n/g;=0A=
var spctab_re_ =3D /[ \t]+/g;=0A=
var nbsp_re_ =3D /\xa0/g;=0A=
function StripNewlines(str) {=0A=
  if (!str) return "";=0A=
  return str.replace(newline_re_, " ");=0A=
}=0A=
=0A=
function CanonicalizeNewlines(str) {=0A=
  if (!str) return "";=0A=
  return str.replace(newline_re_, '\n');=0A=
}=0A=
=0A=
function HtmlifyNewlines(str) {=0A=
  if (!str) return "";=0A=
  return str.replace(newline_re_, "<br>");=0A=
}=0A=
=0A=
function NormalizeSpaces(str) {=0A=
  if (!str) return "";=0A=
  return str.replace(spctab_re_, " ").replace(nbsp_re_, " ");=0A=
}=0A=
=0A=
// URL encodes the string.=0A=
function UrlEncode(str) {=0A=
  return encodeURIComponent(str);=0A=
}=0A=
=0A=
function Trim(str) {=0A=
  if (!str) return "";=0A=
  return str.replace(/^\s+/, "").replace(/\s+$/, "");=0A=
}=0A=
=0A=
function EndsWith(str, suffix) {=0A=
  if (!str) return !suffix;=0A=
  return (str.lastIndexOf(suffix) =3D=3D (str.length - suffix.length));=0A=
}=0A=
=0A=
// Check if a string is empty=0A=
function IsEmpty(str) {=0A=
  return CollapseWhitespace(str) =3D=3D "";=0A=
}=0A=
=0A=
// Check if a character is a letter=0A=
function IsLetterOrDigit(ch) {=0A=
  return ((ch >=3D "a" && ch <=3D "z") ||=0A=
          (ch >=3D "A" && ch <=3D "Z") ||=0A=
         (ch >=3D '0' && ch <=3D '9'));=0A=
}=0A=
=0A=
// Check if a character is a space character=0A=
function IsSpace(ch) {=0A=
  return (" \t\r\n".indexOf(ch) >=3D 0);=0A=
}=0A=
=0A=
// Converts any instances of "\r" or "\r\n" style EOLs into "\n" (Line =
Feed),=0A=
// and also trim the extra newlines and whitespaces at the end.=0A=
var eol_re_ =3D /\r\n?/g;=0A=
var trailingspc_re_ =3D /[\n\t ]+$/;=0A=
function NormalizeText(str) {=0A=
  return str.replace(eol_re_, "\n").replace(trailingspc_re_, "");=0A=
}=0A=
=0A=
// Inserts <wbr>s (word break tag) after every n non-space chars and/or=0A=
// after or before certain special chars. The input string should be =
plain=0A=
// text that has not yet been HTML-escaped.=0A=
// Params:=0A=
//   str: The string to insert <wbr>s into.=0A=
//   n: The maximum number of consecutive non-space characters to allow =
before=0A=
//     adding a <wbr>. To turn off this rule (i.e. if you only want to =
add=0A=
//     breaks based on special characters), pass in the value -1.=0A=
//   chars_to_break_after: The list of special characters (concatenated =
into a=0A=
//     string) after which a <wbr> should be added, if there is no =
natural=0A=
//     break at that point. To turn off this rule, pass in the empty =
string.=0A=
//   chars_to_break_before: The list of special characters (concatenated =
into a=0A=
//     string) before which a <wbr> should be added, if there is no =
natural=0A=
//     break at that point. To turn off this rule, pass in the empty =
string.=0A=
// Returns: The string str htmlescaped, and with <wbr>s inserted =
according to=0A=
//   the rules specified by the other arguments.=0A=
function HtmlEscapeInsertWbrs(str, n, chars_to_break_after,=0A=
                              chars_to_break_before) {=0A=
  AssertNumArgs(4);=0A=
=0A=
  var out =3D '';=0A=
  var strpos =3D 0;=0A=
  var spc =3D 0;=0A=
=0A=
  for (var i =3D 1; i < str.length; ++i) {=0A=
    var prev_char =3D str.charAt(i - 1);=0A=
    var next_char =3D str.charAt(i);=0A=
    if (IsSpace(next_char)) {=0A=
      spc =3D i;=0A=
    } else if (i - spc =3D=3D n ||=0A=
               chars_to_break_after.indexOf(prev_char) !=3D -1 ||=0A=
               chars_to_break_before.indexOf(next_char) !=3D -1) {=0A=
      out +=3D HtmlEscape(str.substring(strpos, i)) + '<wbr>';=0A=
      strpos =3D i;=0A=
      spc =3D i;=0A=
    }=0A=
  }=0A=
  out +=3D HtmlEscape(str.substr(strpos));=0A=
  return out;=0A=
}=0A=
=0A=
// Converts a string to its canonicalized label form.=0A=
var illegal_chars_re_ =3D /[ \/(){}&|\\\"\000]/g;=0A=
function CanonicalizeLabel(str, lowercase) {=0A=
  var uppercase =3D str.replace(illegal_chars_re_, '-');=0A=
  return lowercase ? uppercase.toLowerCase() : uppercase;=0A=
}=0A=
=0A=
// Case-insensitive string comparator=0A=
function CompareStringsIgnoreCase(s1, s2) {=0A=
  s1 =3D s1.toLowerCase();=0A=
  s2 =3D s2.toLowerCase();=0A=
=0A=
  if (s1 < s2) {=0A=
    return -1;=0A=
  } else if (s1 =3D=3D s2) {=0A=
    return 0;=0A=
  } else {=0A=
    return 1;=0A=
  }=0A=
}=0A=
=0A=
//-----------------------------------------------------------------------=
-=0A=
// TextArea utilities=0A=
//-----------------------------------------------------------------------=
-=0A=
=0A=
// Gets the cursor pos in a text area. Returns -1 if the cursor pos =
cannot=0A=
// be determined or if the cursor out of the textfield.=0A=
function GetCursorPos(win, textfield) {=0A=
  try {=0A=
    if (IsDefined(textfield.selectionEnd)) {=0A=
      // Mozilla directly supports this=0A=
      return textfield.selectionEnd;=0A=
=0A=
    } else if (win.document.selection && =
win.document.selection.createRange) {=0A=
      // IE doesn't export an accessor for the endpoints of a selection.=0A=
      // Instead, it uses the TextRange object, which has an extremely =
obtuse=0A=
      // API. Here's what seems to work:=0A=
=0A=
      // (1) Obtain a textfield from the current selection (cursor)=0A=
      var tr =3D win.document.selection.createRange();=0A=
=0A=
      // Check if the current selection is in the textfield=0A=
      if (tr.parentElement() !=3D textfield) {=0A=
        return -1;=0A=
      }=0A=
=0A=
      // (2) Make a text range encompassing the textfield=0A=
      var tr2 =3D tr.duplicate();=0A=
      tr2.moveToElementText(textfield);=0A=
=0A=
      // (3) Move the end of the copy to the beginning of the selection=0A=
      tr2.setEndPoint("EndToStart", tr);=0A=
=0A=
      // (4) The span of the textrange copy is equivalent to the cursor =
pos=0A=
      var cursor =3D tr2.text.length;=0A=
=0A=
      // Finally, perform a sanity check to make sure the cursor is in =
the=0A=
      // textfield. IE sometimes screws this up when the window is =
activated=0A=
      if (cursor > textfield.value.length) {=0A=
        return -1;=0A=
      }=0A=
      return cursor;=0A=
    } else {=0A=
      Debug("Unable to get cursor position for: " + navigator.userAgent);=0A=
=0A=
      // Just return the size of the textfield=0A=
      // TODO: Investigate how to get cursor pos in Safari!=0A=
      return textfield.value.length;=0A=
    }=0A=
  } catch (e) {=0A=
    DumpException(e, "Cannot get cursor pos");=0A=
  }=0A=
  =0A=
  return -1;=0A=
}=0A=
=0A=
function SetCursorPos(win, textfield, pos) {=0A=
  if (IsDefined(textfield.selectionEnd) &&=0A=
      IsDefined(textfield.selectionStart)) {=0A=
    // Mozilla directly supports this=0A=
    textfield.selectionStart =3D pos;=0A=
    textfield.selectionEnd =3D pos;=0A=
=0A=
  } else if (win.document.selection && textfield.createTextRange) {=0A=
    // IE has textranges. A textfield's textrange encompasses the=0A=
    // entire textfield's text by default=0A=
    var sel =3D textfield.createTextRange();=0A=
=0A=
    sel.collapse(true);=0A=
    sel.move("character", pos);=0A=
    sel.select();=0A=
  }=0A=
}=0A=
=0A=
//-----------------------------------------------------------------------=
-=0A=
// Array utilities=0A=
//-----------------------------------------------------------------------=
-=0A=
// Find an item in an array, returns the key, or -1 if not found=0A=
function FindInArray(array, x) {=0A=
  for (var i =3D 0; i < array.length; i++) {=0A=
    if (array[i] =3D=3D x) {=0A=
      return i;=0A=
    }=0A=
  }=0A=
  return -1;=0A=
}=0A=
=0A=
// Inserts an item into an array, if it's not already in the array=0A=
function InsertArray(array, x) {=0A=
  if (FindInArray(array, x) =3D=3D -1) {=0A=
    array[array.length] =3D x;=0A=
  }=0A=
}=0A=
=0A=
// Delete an element from an array=0A=
function DeleteArrayElement(array, x) {=0A=
  var i =3D 0;=0A=
  while (i < array.length && array[i] !=3D x)=0A=
    i++;=0A=
  array.splice(i, 1);=0A=
}=0A=
=0A=
// Copies a flat array=0A=
function CopyArray(array) {=0A=
  var copy =3D [];=0A=
  for (var i =3D 0; i < array.length; i++) {=0A=
    copy[i] =3D array[i];=0A=
  }=0A=
  return copy;=0A=
}=0A=
=0A=
// Clone an object (recursively)=0A=
function CloneObject(x) {=0A=
  if ((typeof x) =3D=3D "object") {=0A=
    var y =3D [];=0A=
    for (var i in x) {=0A=
      y[i] =3D CloneObject(x[i]);=0A=
    }=0A=
    return y;=0A=
  }=0A=
  return x;=0A=
}=0A=
=0A=
/**=0A=
 * Clone an event; cannot use CloneObject(event)=0A=
 * because it suffers from infinite recursion.=0A=
 * Thus, only a subset of the event properties are=0A=
 * cloned -- if you need others, just add them=0A=
 * to this function (just don't remove any!)=0A=
 */=0A=
function CloneEvent(ev) {=0A=
  var clone =3D {};=0A=
  clone.clientX =3D ev.clientX;=0A=
  clone.clientY =3D ev.clientY;=0A=
  clone.pageX =3D ev.pageX;=0A=
  clone.pageY =3D ev.pageY;=0A=
  clone.type =3D ev.type;=0A=
  clone.srcElement =3D ev.srcElement;=0A=
  clone.target =3D ev.target;=0A=
  clone.cancelBubble =3D ev.cancelBubble;=0A=
  clone.explicitOriginalTarget =3D ev.explicitOriginalTarget;=0A=
  // add more properties here=0A=
=0A=
  return clone;=0A=
}=0A=
=0A=
function GetEventTarget(/*Event*/ ev) {=0A=
// Event is not a type in IE; IE uses Object for events=0A=
//  AssertType(ev, Event, 'arg passed to GetEventTarget not an Event');=0A=
  return ev.srcElement || ev.target;=0A=
}=0A=
=0A=
/** cancels the event */=0A=
// from http://www.quirksmode.org/js/events_order.html=0A=
function CancelEvent(/*Event*/ ev) {=0A=
  if (is_ie) {=0A=
    ev.cancelBubble =3D true;=0A=
  } else if (ev.stopPropagation) {=0A=
    ev.stopPropagation();=0A=
  }=0A=
}=0A=
=0A=
//-----------------------------------------------------------------------=
-=0A=
// Formatting utilities=0A=
//-----------------------------------------------------------------------=
-=0A=
// A simple printf type function that takes in a template array, and a =
data=0A=
// array. e.g. PrintArray(["a",,"b",,"c"], ["x", "y"]) =3D> axbyc=0A=
function PrintArray(array, data) {=0A=
  // Check that the argument count is correct.=0A=
  AssertEquals(array.length, data.length * 2 + 1);=0A=
=0A=
  for (var i =3D 0, idx =3D 1; i < data.length; i++, idx +=3D 2) {=0A=
    array[idx] =3D data[i];=0A=
  }=0A=
  return array.join("");=0A=
}=0A=
=0A=
function ImageHtml(url, attributes) {=0A=
  return "<img " + attributes + " src=3D" + url + ">";=0A=
}=0A=
=0A=
// Formats an object id that has two id numbers, eg, foo_3_7=0A=
function MakeId3(idprefix, m, n) {=0A=
  return idprefix + m + "_" + n;=0A=
}=0A=
=0A=
//-----------------------------------------------------------------------=
-=0A=
// Email address parsing=0A=
//-----------------------------------------------------------------------=
-=0A=
// Parse an email address of the form "name" <address> into [name, =
address]=0A=
function ParseAddress(addr) {=0A=
  var name =3D "";=0A=
  var address =3D "";=0A=
  for (var i =3D 0; i < addr.length;) {=0A=
    var token =3D GetEmailToken(addr, i);=0A=
    if (token.charAt(0) =3D=3D '<') {=0A=
      var end =3D token.indexOf(">");=0A=
      address =3D token.substring(1, (end !=3D -1) ? end : token.length);=0A=
    } else if (address =3D=3D "") {=0A=
      name +=3D token;=0A=
    }=0A=
    i +=3D token.length;=0A=
  }=0A=
=0A=
  // Check if it's a simple email address of the form "jlim@google.com"=0A=
  if (address =3D=3D "" && name.indexOf("@") !=3D -1) {=0A=
    address =3D name;=0A=
    name =3D "";=0A=
  }=0A=
=0A=
  name =3D CollapseWhitespace(name);=0A=
  name =3D StripQuotes(name, "'");=0A=
  name =3D StripQuotes(name, "\"");=0A=
  address =3D CollapseWhitespace(address);=0A=
  return [name, address];=0A=
}=0A=
=0A=
// Given an email address, get the address part=0A=
function GetAddress(address) {=0A=
  return ParseAddress(address)[1];=0A=
}=0A=
=0A=
// Get the username part of an email address=0A=
function GetAddressUsername(address) {=0A=
  address =3D GetAddress(address);=0A=
  var at =3D address.indexOf("@");=0A=
  return (at =3D=3D -1) ? address : address.substr(0, at);=0A=
}=0A=
=0A=
// Given an email address, get the personal part=0A=
function GetPersonal(address) {=0A=
  return ParseAddress(address)[0];=0A=
}=0A=
=0A=
// Given an address, get a short name=0A=
function GetPersonalElseUsername(address) {=0A=
  var personal =3D GetPersonal(address);=0A=
  if (personal !=3D "") {=0A=
    return personal;=0A=
  } else {=0A=
    return GetAddressUsername(address);=0A=
  }=0A=
}=0A=
=0A=
// Strip ' or " chars around a string=0A=
function StripQuotes(str, quotechar) {=0A=
  var len =3D str.length;=0A=
  if (str.charAt(0) =3D=3D quotechar &&=0A=
      str.charAt(len - 1) =3D=3D quotechar) {=0A=
    return str.substring(1, len - 1);=0A=
  }=0A=
  return str;=0A=
}=0A=
=0A=
// Convert a string containing list of email addresses into an array=0A=
// of strings=0A=
function EmailsToArray(str) {=0A=
  var result =3D [];=0A=
  var email =3D "";=0A=
  var token;=0A=
=0A=
  for (var i =3D 0; i < str.length; ) {=0A=
    token =3D GetEmailToken(str, i);=0A=
    if (token =3D=3D ",") {=0A=
      AddEmailAddress(result, email);=0A=
      email =3D "";=0A=
      i++;=0A=
      continue;=0A=
    }=0A=
    email +=3D token;=0A=
    i +=3D token.length;=0A=
  }=0A=
=0A=
  // Add last=0A=
  if (email !=3D"" || token =3D=3D ",") {=0A=
    AddEmailAddress(result, email);=0A=
  }=0A=
  return result;=0A=
}=0A=
=0A=
// Get the next token from a position in an address string=0A=
var openers_ =3D "\"<([";=0A=
var closers_ =3D "\">)]";=0A=
function GetEmailToken(str, pos) {=0A=
  var ch =3D str.charAt(pos);=0A=
  var p =3D openers_.indexOf(ch);=0A=
  if (p =3D=3D -1)=0A=
    return ch;=0A=
  var end_pos =3D str.indexOf(closers_.charAt(p), pos + 1);=0A=
  var token =3D (end_pos >=3D 0) ? str.substring(pos, end_pos + 1) :=0A=
              str.substr(pos);=0A=
  return token;=0A=
}=0A=
=0A=
// Add an email address to the result array.=0A=
function AddEmailAddress(result, email) {=0A=
  email =3D CleanEmailAddress(email);=0A=
  result[result.length] =3D email;=0A=
}=0A=
=0A=
// Clean up email address:=0A=
// - remove extra spaces=0A=
// - Surround name with quotes if it contains special characters=0A=
// to check if we need " quotes=0A=
// Note: do not use /g in the regular expression, otherwise the=0A=
// regular expression cannot be reusable.=0A=
var specialchars_re_ =3D /[()<>@,;:\\\".\[\]]/;=0A=
=0A=
function CleanEmailAddress(str) {=0A=
  var name_address =3D ParseAddress(str);=0A=
  var name =3D name_address[0];=0A=
  var address =3D name_address[1];=0A=
=0A=
  if (name.indexOf("\"") =3D=3D -1) {  // If there's no "=0A=
    var quote_needed =3D specialchars_re_.test(name);=0A=
    if (quote_needed) {=0A=
      name =3D "\"" + name + "\"";=0A=
    }=0A=
  }=0A=
=0A=
  if (name =3D=3D "")=0A=
    return address;=0A=
  else if (address =3D=3D "")=0A=
    return name;=0A=
  else=0A=
    return name + " <" + address + ">";=0A=
}=0A=
=0A=
//-----------------------------------------------------------------------=
-=0A=
// Misc=0A=
//-----------------------------------------------------------------------=
-=0A=
// Compare long hex strings=0A=
function CompareID(a, b) {=0A=
  if (a.length !=3D b.length) {=0A=
    return (a.length - b.length);=0A=
  } else {=0A=
    return (a < b) ? -1 : (a > b) ? 1 : 0;=0A=
  }=0A=
}=0A=
=0A=
// Check if a value is defined=0A=
function IsDefined(value) {=0A=
  return (typeof value) !=3D 'undefined';=0A=
}=0A=
=0A=
function GetKeyCode(event) {=0A=
  var code;=0A=
  if (event.keyCode) {=0A=
    code =3D event.keyCode;=0A=
  } else if (event.which) {=0A=
    code =3D event.which;=0A=
  }=0A=
  return code;=0A=
}=0A=
=0A=
// define a forid function to fetch a DOM node by id.=0A=
function forid_1(id) {=0A=
  return document.getElementById(id);=0A=
}=0A=
function forid_2(id) {=0A=
  return document.all[id];=0A=
}=0A=
=0A=
/**=0A=
 * Fetch an HtmlElement by id.=0A=
 * DEPRECATED: use $ in dom.js=0A=
 */=0A=
var forid =3D document.getElementById ? forid_1 : forid_2;=0A=
=0A=
=0A=
=0A=
function log(msg) {=0A=
  /* a top level window is its own parent.  Use !=3D or else fails on IE =
with=0A=
   * infinite loop.=0A=
   */=0A=
  try {=0A=
    if (window.parent !=3D window && window.parent.log) {=0A=
      window.parent.log(window.name + '::' + msg);=0A=
      return;=0A=
    }=0A=
  } catch (e) {=0A=
    // Error: uncaught exception: Permission denied to get property =
Window.log=0A=
  }=0A=
  var logPane =3D forid('log');=0A=
  if (logPane) {=0A=
    var logText =3D '<p class=3Dlogentry><span class=3Dlogdate>' + new =
Date() +=0A=
                  '</span><span class=3Dlogmsg>' + msg + '</span></p>';=0A=
    logPane.innerHTML =3D logText + logPane.innerHTML;=0A=
  } else {=0A=
    window.status =3D msg;=0A=
  }=0A=
}=0A=

------=_NextPart_000_0000_01C8BA72.4067ED50
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.blogger.com/v-app/scripts/107652916-dom.common.js

=0A=
// Commonly-used functions, reduced.=0A=
=0A=
function d(s) {return document.getElementById(s);}=0A=
function dE(o,s) {return o.getElementsByTagName(s);}=0A=
=0A=
/**=0A=
 * toggleDisplay()=0A=
 *=0A=
 * Will toggle the display property of the style object for any=0A=
 * DOM element or object that supports style as a property.=0A=
 *=0A=
 * Warning: This'll wreak havoc if applied to <TR> elements. Those=0A=
 * babies got different types "table-row" | "block" dependant on =0A=
 * what browser's being used.=0A=
 *=0A=
 * Warning: Written in Texas.  Yeehaw.=0A=
 *=0A=
 * Typical usage:=0A=
 * toggleDisplay(document.getElementById("foo"));=0A=
 */=0A=
function toggleDisplay(o)=0A=
{  =0A=
  var display =3D getStyle(o, "display"); =0A=
  =0A=
  if (o.style)=0A=
    o.style.display =3D=0A=
      (display !=3D "none") ? "none" : getDisplayStyleByTagName(o);=0A=
}=0A=
=0A=
=0A=
function getDisplayStyleByTagName(o)=0A=
{=0A=
  var n =3D o.nodeName.toLowerCase(); =0A=
  return (=0A=
          n =3D=3D "span"=0A=
          || n =3D=3D "img"=0A=
          || n =3D=3D "a"=0A=
          ) ? "inline" : "block";=0A=
}=0A=
=0A=
=0A=
/**=0A=
 * hideElement()=0A=
 *=0A=
 * Hides an element from view.=0A=
 *=0A=
 * Typical usage:=0A=
 * hideElement(getElement("the-id-of-the-element"));=0A=
 */=0A=
function hideElement(o)=0A=
{=0A=
  if (o && o.style) o.style.display =3D "none";=0A=
}=0A=
=0A=
=0A=
=0A=
/**=0A=
 * showElement()=0A=
 *=0A=
 * Shows an element that was hidden from view.=0A=
 *=0A=
 * Typical usage:=0A=
 * showElement(getElement("the-id-of-the-element"));=0A=
 */=0A=
function showElement(o)=0A=
{=0A=
  =0A=
  if (o && o.style) o.style.display =3D getDisplayStyleByTagName(o);=0A=
}=0A=
=0A=
=0A=
/**=0A=
 * getElement()=0A=
 *=0A=
 * Returns an element by its ID or shows an alert if it can't be found.=0A=
 *=0A=
 * Typical usage:=0A=
 * getElement("the-id-of-the-element");=0A=
 */=0A=
function getElement(id) {=0A=
  var e =3D d(id);=0A=
  if (!e) {=0A=
    alert("Cannot get element: " + id);=0A=
  }=0A=
  return e;=0A=
}=0A=
=0A=
/**=0A=
 * setInnerHTML()=0A=
 *=0A=
 * Sets the innerHTML of an element or shows an alert if can't be set.=0A=
 *=0A=
 * Typical usage:=0A=
 * setInnerHTML("the-id-of-the-element");=0A=
 */=0A=
function setInnerHTML(id, html) {=0A=
  try {=0A=
    getElement(id).innerHTML =3D html;=0A=
  } catch (ex) {=0A=
    alert("Cannot set inner HTML: " + id);=0A=
  }=0A=
}=0A=
=0A=
=0A=
/**=0A=
 * setCssStyle()=0A=
 *=0A=
 * Sets the style of an element by its id or shows an alert if can't be =
set.=0A=
 *=0A=
 * Typical usage:=0A=
 * setCssStyle("the-id-of-the-element", "display", "block");=0A=
 */=0A=
function setCssStyle(id, name, value) {=0A=
  try {=0A=
    getElement(id).style[name] =3D value;=0A=
  } catch (ex) {=0A=
    alert("Cannot set style: " + id);=0A=
  }=0A=
}=0A=
=0A=
=0A=
/**=0A=
 * getStyle()=0A=
 *=0A=
 * Gets the computed style of any object.=0A=
 *=0A=
 * WARNING: Produces unexpected results in Safari.  To achieve best =0A=
 * results, explicitly set the style property for that browser when the =0A=
 * element is rendered.=0A=
 *=0A=
 * Typical usage:=0A=
 * getStyle(object, "display");=0A=
 */=0A=
function getStyle(el, style) {=0A=
  if (!document.getElementById || !el) return;=0A=
  =0A=
  if (document.defaultView=0A=
      && document.defaultView.getComputedStyle) {=0A=
      return document.defaultView.=0A=
        getComputedStyle(el, "").getPropertyValue(style);=0A=
  }  =0A=
  else if (el.currentStyle) {=0A=
    return el.currentStyle[style];=0A=
  }  =0A=
  else { =0A=
    return el.style.display;=0A=
  }=0A=
}=0A=
=0A=
/**=0A=
 * getStyleAttribute()=0A=
 *=0A=
 * Returns the style attribute of the specified node.=0A=
 */=0A=
function getStyleAttribute(node) {=0A=
  if (Detect.IE()) {=0A=
    return node.getAttribute('style').value;=0A=
  }else {=0A=
    return node.getAttribute('style');=0A=
  }=0A=
}=0A=
=0A=
=0A=
/*=0A=
 * showProps()=0A=
 *=0A=
 * Displays all the properties for a given element=0A=
 */=0A=
function showProps(o) {=0A=
	var s=3D""; for (var p in o) {=0A=
		s+=3Dp+": "+o[p]+"\n<br />";=0A=
	}=0A=
	document.write(s);=0A=
}=0A=
=0A=
=0A=
=0A=
function setIFrameEvent(iframe, eventName, func)=0A=
{=0A=
  if (document.all) {=0A=
    eval('getIFrameDocument(iframe).on' + eventName + ' =3D func;');=0A=
  } else {=0A=
    iframe.contentWindow.addEventListener(eventName, func, true);=0A=
  }=0A=
}=0A=
=0A=
function setIFrameBody(iframe, strStyle, innerHtml) =0A=
{=0A=
  if (!innerHtml) innerHtml =3D '';=0A=
  if (innerHtml =3D=3D '' && Detect.IE()) {=0A=
    innerHtml =3D '<div></div>';=0A=
  }=0A=
  var doc =3D getIFrameDocument(iframe);=0A=
  doc.open();=0A=
  doc.write('<head></head><body style=3D"' + strStyle + '">'=0A=
    + innerHtml + '</body>');=0A=
  doc.close();=0A=
}=0A=
=0A=
=0A=
function getIFrameDocument(iframe)=0A=
{=0A=
  if (Detect.IE()) {=0A=
    return iframe.document;=0A=
  } else {=0A=
    return iframe.contentDocument;=0A=
  }=0A=
}=0A=
=0A=
function getIFrame(strId)=0A=
{=0A=
  if (Detect.IE()) {=0A=
    return document.frames[strId];=0A=
  } else {=0A=
    return document.getElementById(strId);=0A=
  }=0A=
}=0A=
=0A=
=0A=
function createElementandAppend(nodeName, strId, appendTo) {=0A=
  var el =3D document.createElement(nodeName);=0A=
  el.setAttribute("id", strId);=0A=
  if (appendTo) {=0A=
    appendTo.appendChild(el); =0A=
  } else {=0A=
    document.body.appendChild(el); =0A=
  }=0A=
  return el; =0A=
}=0A=
=0A=
function createElementandInsertBefore(nodeName, strId, appendTo, =
sibling) {=0A=
  var el =3D document.createElement(nodeName);=0A=
  el.setAttribute("id", strId);=0A=
  if (appendTo) {=0A=
    appendTo.insertBefore(el, sibling); =0A=
  } else {=0A=
    document.body.insertBefore(el, sibling); =0A=
  }=0A=
  return el; =0A=
}=0A=
=0A=
=0A=
/**=0A=
* getXY()=0A=
 *=0A=
 * Returns the position of any element as an object.=0A=
 *=0A=
 * Typical usage:=0A=
 * var pos =3D getXY(object);=0A=
 * alert(pos.x + " " +pos.y);=0A=
 */=0A=
function getXY(el) {=0A=
  var x =3D el.offsetLeft;=0A=
  var y =3D el.offsetTop;=0A=
  if (el.offsetParent !=3D null) {=0A=
    var pos =3D getXY(el.offsetParent);=0A=
    x +=3D pos.x;=0A=
    y +=3D pos.y;=0A=
  }=0A=
  return {x: x, y: y}=0A=
}=0A=
=0A=
// The following 3 functions are taken from common.js=0A=
function hasClass(el, cl) {=0A=
  if (el =3D=3D null || el.className =3D=3D null) return false;=0A=
  var classes =3D el.className.split(" ");=0A=
  for (var i =3D 0; i < classes.length; i++) {=0A=
    if (classes[i] =3D=3D cl) {=0A=
      return true;=0A=
    }=0A=
  }=0A=
  return false;=0A=
}=0A=
=0A=
// Add a class to element=0A=
function addClass(el, cl) {=0A=
  if (hasClass(el, cl)) return;=0A=
  el.className +=3D " " + cl;=0A=
} =0A=
=0A=
// Remove a class from an element=0A=
function removeClass(el, cl) {=0A=
  if (el.className =3D=3D null) return;=0A=
  var classes =3D el.className.split(" ");=0A=
  var result =3D [];=0A=
  var changed =3D false;=0A=
  for (var i =3D 0; i < classes.length; i++) {=0A=
    if (classes[i] !=3D cl) {=0A=
      if (classes[i]) { result.push(classes[i]); }=0A=
    } else {=0A=
      changed =3D true;=0A=
    } =0A=
  } =0A=
  if (changed) { el.className =3D result.join(" "); }=0A=
} =0A=
=0A=
function toggleClass(el, cl) {=0A=
  if (hasClass(el, cl)) {=0A=
    removeClass(el, cl);=0A=
  } else {=0A=
    addClass(el, cl);=0A=
  }=0A=
}=0A=
=0A=
=0A=
/* Constants for node types, since IE doesn't support Node.TEXT_NODE */=0A=
var TEXT_NODE =3D 3;=0A=
var ELEMENT_NODE =3D 1;=0A=
=0A=
=0A=

------=_NextPart_000_0000_01C8BA72.4067ED50
Content-Type: multipart/alternative;
	boundary="----=_NextPart_001_001D_01C8BA72.406A5E50"


------=_NextPart_001_001D_01C8BA72.406A5E50
Content-Type: text/html;
	charset="utf-8"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://venturenashville.blogspot.com/2008/05/talent-top-it-execs-need-nashville-jobs.html

=EF=BB=BF<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" =
"http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML dir=3Dltr xmlns=3D"http://www.w3.org/1999/xhtml" xmlns:b =3D=20
"http://www.google.com/2005/gml/b" xmlns:data =3D=20
"http://www.google.com/2005/gml/data" xmlns:expr =3D=20
"http://www.google.com/2005/gml/expr"><HEAD><TITLE>Venture Nashville: =
Talent: Top IT execs need Nashville jobs</TITLE>
<META http-equiv=3DContent-Type content=3D"text/html; charset=3DUTF-8">
<META content=3Dtrue name=3DMSSmartTagsPreventParsing>
<META content=3D"MSHTML 6.00.6000.16640" name=3DGENERATOR><LINK=20
title=3D"Venture Nashville - Atom"=20
href=3D"http://venturenashville.blogspot.com/feeds/posts/default"=20
type=3Dapplication/atom+xml rel=3Dalternate><LINK title=3D"Venture =
Nashville - RSS"=20
href=3D"http://venturenashville.blogspot.com/feeds/posts/default?alt=3Drs=
s"=20
type=3Dapplication/rss+xml rel=3Dalternate><LINK title=3D"Venture =
Nashville - Atom"=20
href=3D"http://www.blogger.com/feeds/20506419/posts/default"=20
type=3Dapplication/atom+xml rel=3Dservice.post><LINK title=3DRSD=20
href=3D"http://www.blogger.com/rsd.g?blogID=3D20506419" =
type=3Dapplication/rsd+xml=20
rel=3DEditURI><LINK title=3D"Venture Nashville - Atom"=20
href=3D"http://venturenashville.blogspot.com/feeds/8939999438805678777/co=
mments/default"=20
type=3Dapplication/atom+xml rel=3Dalternate>
<STYLE id=3Dpage-skin-1 type=3Dtext/css>BODY {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: small; BACKGROUND: =
#f6f6f6; PADDING-BOTTOM: 0px; MARGIN: 0px; COLOR: #000000; PADDING-TOP: =
0px
}
#outer-wrapper {
	FONT: 100% 'Trebuchet MS',Trebuchet,Verdana,Sans-Serif
}
A {
	COLOR: #de7008
}
A:hover {
	COLOR: #9e5205
}
A IMG {
	BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: =
0px; BORDER-RIGHT-WIDTH: 0px
}
#content-wrapper {
	PADDING-RIGHT: 1em; PADDING-LEFT: 1em; PADDING-BOTTOM: 0px; =
PADDING-TOP: 0px
}

@media All   =20
{
DIV#main {
	PADDING-RIGHT: 0px; PADDING-LEFT: 1em; FLOAT: right; PADDING-BOTTOM: =
10px; OVERFLOW: hidden; BORDER-LEFT: #e0ad12 1px dotted; WIDTH: 66%; =
PADDING-TOP: 30px; WORD-WRAP: break-word
}
DIV#sidebar {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: left; PADDING-BOTTOM: =
0px; MARGIN: 20px 0px 0px; OVERFLOW: hidden; WIDTH: 31%; PADDING-TOP: =
0px; TEXT-ALIGN: left; WORD-WRAP: break-word
}

}

@media Handheld   =20
{
DIV#main {
	FLOAT: none; WIDTH: 90%
}
DIV#sidebar {
	PADDING-RIGHT: 7%; PADDING-LEFT: 3%; PADDING-BOTTOM: 10px; PADDING-TOP: =
30px
}
    }
#header {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BACKGROUND: #f5e39e; =
PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px; BORDER-BOTTOM: =
#e0ad12 1px dotted
}
H1 A:link {
	COLOR: #f5deb3; TEXT-DECORATION: none
}
H1 A:visited {
	COLOR: #f5deb3; TEXT-DECORATION: none
}
H1 {
	MARGIN: 0px
}
H2 {
	MARGIN: 0px
}
H3 {
	MARGIN: 0px
}
H1 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 5%; BACKGROUND: #de7008; =
PADDING-BOTTOM: 10px; FONT: bold 300% Verdana, sans-serif; COLOR: =
#f5deb3; PADDING-TOP: 25px; LETTER-SPACING: -2px
}
H3.post-title {
	FONT: bold 160% Verdana,Sans-Serif; COLOR: #9e5205; LETTER-SPACING: =
-1px
}
H3.post-title A {
	COLOR: #9e5205
}
H3.post-title A:visited {
	COLOR: #9e5205
}
H2.date-header {
	MARGIN: 10px 0px 0px; FONT: bold 105% 'Trebuchet =
MS',Trebuchet,Verdana,Sans-serif; COLOR: #777777
}
H4 {
	COLOR: #aa0033
}
#sidebar H2 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; FONT: bold 150% Verdana,Sans-serif; COLOR: #b8a80d; PADDING-TOP: =
0px
}
#sidebar .widget {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 95%; PADDING-BOTTOM: =
0px; MARGIN: 0px 0px 33px; PADDING-TOP: 0px
}
#sidebar UL {
	MARGIN-TOP: 0px; PADDING-LEFT: 0px; LIST-STYLE-TYPE: none
}
#sidebar LI {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 95%; PADDING-BOTTOM: =
0px; MARGIN: 0px; PADDING-TOP: 0px; LIST-STYLE-TYPE: none
}
.description {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BACKGROUND: none transparent =
scroll repeat 0% 0%; PADDING-BOTTOM: 0px; MARGIN: 7px 12% 7px 5%; FONT: =
bold 100% Verdana,Sans-Serif; COLOR: #9e5205; PADDING-TOP: 0px
}
.post {
	MARGIN: 0px 0px 30px
}
.post STRONG {
	FONT-WEIGHT: bold; COLOR: #000000
}
PRE {
	COLOR: #999999
}
CODE {
	COLOR: #999999
}
STRIKE {
	COLOR: #999999
}
.post-footer {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 80%; PADDING-BOTTOM: =
0px; MARGIN: 0px; COLOR: #444444; PADDING-TOP: 0px
}
.post-footer A {
	COLOR: #968a0a; BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; =
BORDER-LEFT-STYLE: none; TEXT-DECORATION: none; BORDER-BOTTOM-STYLE: =
none
}
.post-footer A:hover {
	TEXT-DECORATION: underline
}
#comments {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; FONT-SIZE: =
110%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
}
.comment-author {
	MARGIN-TOP: 10px
}
.comment-body {
	FONT-WEIGHT: normal; FONT-SIZE: 100%; COLOR: black
}
.comment-footer {
	DISPLAY: inline; FONT-WEIGHT: normal; FONT-SIZE: 80%; PADDING-BOTTOM: =
20px; COLOR: #444444; MARGIN-RIGHT: 10px
}
.deleted-comment {
	COLOR: gray; FONT-STYLE: italic
}
.comment-link {
	MARGIN-LEFT: 0.6em
}
.profile-textblock {
	CLEAR: both; MARGIN-LEFT: 0px
}
.profile-img {
	BORDER-RIGHT: #de7008 2px solid; BORDER-TOP: #de7008 2px solid; FLOAT: =
left; MARGIN: 0px 5px 5px 0px; BORDER-LEFT: #de7008 2px solid; =
BORDER-BOTTOM: #de7008 2px solid
}
#sidebar A:link {
	COLOR: #999999; TEXT-DECORATION: none
}
#sidebar A:active {
	COLOR: #ff0000; TEXT-DECORATION: none
}
#sidebar A:visited {
	TEXT-DECORATION: none
}
#sidebar A:hover {
	COLOR: #b8a80d; TEXT-DECORATION: none
}
.feed-links {
	CLEAR: both; LINE-HEIGHT: 2.5em
}
#blog-pager-newer-link {
	FLOAT: left
}
#blog-pager-older-link {
	FLOAT: right
}
#blog-pager {
	TEXT-ALIGN: center
}
.clear {
	CLEAR: both
}
.widget-content {
	MARGIN-TOP: 0.5em
}
BODY#layout #outer-wrapper {
	MARGIN-TOP: 0px
}
BODY#layout #main {
	MARGIN-TOP: 10px; PADDING-TOP: 0px
}
BODY#layout #sidebar {
	MARGIN-TOP: 10px; PADDING-TOP: 0px
}
</STYLE>
<LINK href=3D"http://www.blogger.com/widgets/3319451950-blogarchive.css" =

type=3Dtext/css rel=3Dstylesheet><!-- -->
<STYLE type=3Dtext/css>@import url( =
http://www.blogger.com/css/blog_controls.css );
@import url( =
http://www.blogger.com/dyn-css/authorization.css?targetBlogID=3D20506419 =
);
#navbar-iframe {
	DISPLAY: block
}
</STYLE>
<LINK href=3D"http://www.blogger.com/widgets/3597482671-blog.css" =
type=3Dtext/css=20
rel=3Dstylesheet></HEAD>
<BODY>
<DIV class=3D"navbar section" id=3Dnavbar>
<DIV class=3D"widget Navbar" id=3DNavbar1><IFRAME id=3Dnavbar-iframe=20
title=3D"Blogger Navigation and Search" marginWidth=3D0 marginHeight=3D0 =

src=3D"http://www.blogger.com/navbar.g?targetBlogID=3D20506419&amp;blogNa=
me=3DVenture+Nashville&amp;publishMode=3DPUBLISH_MODE_BLOGSPOT&amp;navbar=
Type=3DBLACK&amp;layoutType=3DLAYOUTS&amp;homepageUrl=3Dhttp%3A%2F%2Fvent=
urenashville.blogspot.com%2F&amp;searchRoot=3Dhttp%3A%2F%2Fventurenashvil=
le.blogspot.com%2Fsearch"=20
frameBorder=3D0 width=3D"100%" scrolling=3Dno height=3D30></IFRAME>
<DIV id=3Dspace-for-ie></DIV></DIV></DIV>
<DIV id=3Douter-wrapper>
<DIV id=3Dwrap2><!-- skip links for text browsers --><SPAN =
id=3Dskiplinks=20
style=3D"DISPLAY: none"><A=20
href=3D"http://venturenashville.blogspot.com/2008/05/talent-top-it-execs-=
need-nashville-jobs.html#main">skip=20
to main </A>| <A=20
href=3D"http://venturenashville.blogspot.com/2008/05/talent-top-it-execs-=
need-nashville-jobs.html#sidebar">skip=20
to sidebar</A> </SPAN>
<DIV id=3Dheader-wrapper>
<DIV class=3D"header section" id=3Dheader>
<DIV class=3D"widget Header" id=3DHeader1>
<DIV id=3Dheader-inner>
<DIV class=3Dtitlewrapper>
<H1 class=3Dtitle><A =
href=3D"http://venturenashville.blogspot.com/">Venture=20
Nashville</A> </H1></DIV>
<DIV class=3Ddescriptionwrapper>
<P class=3Ddescription><SPAN>Exploring innovation, investment and=20
technologies<BR>in Nashville, Tennessee, United States.<BR>Please visit =
our=20
website: <A=20
href=3D"http://www.venturenashville.com/">VentureNashville.com</A></SPAN>=
</P></DIV></DIV></DIV></DIV></DIV>
<DIV id=3Dcontent-wrapper>
<DIV id=3Dcrosscol-wrapper style=3D"TEXT-ALIGN: center">
<DIV class=3D"crosscol section" id=3Dcrosscol></DIV></DIV>
<DIV id=3Dmain-wrapper>
<DIV class=3D"main section" id=3Dmain>
<DIV class=3D"widget Blog" id=3DBlog1>
<DIV class=3D"blog-posts hfeed"><!-- google_ad_section_start -->
<H2 class=3Ddate-header>Friday, May 09, 2008</H2>
<DIV class=3D"post hentry uncustomized-post-template"><A=20
name=3D8939999438805678777></A>
<H3 class=3D"post-title entry-title"><A=20
href=3D"http://venturenashville.blogspot.com/2008/05/talent-top-it-execs-=
need-nashville-jobs.html">Talent:=20
Top IT execs need Nashville jobs</A> </H3>
<DIV class=3Dpost-header-line-1></DIV>
<DIV class=3D"post-body entry-content">
<P><A=20
href=3D"http://bp0.blogger.com/__TyKup9BVR0/SCPaznRJmDI/AAAAAAAAAGg/7dpwt=
1isnFs/s1600-h/Buffkin2.jpg"><IMG=20
id=3DBLOGGER_PHOTO_ID_5198238975164782642=20
style=3D"FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt=3D""=20
src=3D"http://bp0.blogger.com/__TyKup9BVR0/SCPaznRJmDI/AAAAAAAAAGg/7dpwt1=
isnFs/s200/Buffkin2.jpg"=20
border=3D0></A><STRONG>Some of Nashville's most qualified C-level =
information=20
technology executives</STRONG> are forced to commute to the coasts for =
jobs,=20
when the gigs that brought them here run out of steam, according to =
executive=20
recruiter Craig Buffkin (<EM>left</EM>) of <A=20
href=3D"http://www.buffkinassociates.com/">The Buffkin Group</A>. He =
told us=20
recently that Nissan and other companies' moving to Nashville has =
increased the=20
numbers of highly qualified senior execs from most corporate roles. When =
their=20
jobs end, those execs almost always want to stay in Nashville, he said. =
However,=20
unlike the Bay Area, Austin, Boston and other tech centers, unless Chief =

Technology Officers' and CIOs' timing is perfect, Buffkin says they're =
going to=20
have to take a pay cut, relocate or earn a lot of frequent-flyer miles. =
Buffkin=20
said he could easily think of "8 or 10" local C-level execs in such=20
circumstances. Most of these executives have a combination of strategic =
and=20
tactical skills, a strong work ethic and the ability to "check their =
egos at the=20
door," all of which could make them important players in Nashville tech =
startups=20
or other roles. However, Buffkin explains that those who choose to live =
here and=20
work elsewhere face a disadvantage in getting picked-up by another =
Nashville=20
venture. "They're just not around, not at important [civic and =
professional]=20
functions, not active in the social scene," Buffkin said. That's a =
problem in a=20
town that still relies heavily on the "Old Boy network." The execs are =
often=20
more likely to hear about opportunities from colleagues in other cities, =
before=20
they find jobs here. For these and other reasons, top candidates in the =
C-level=20
talent pool are often overlooked and perceptions of a talent shortage at =
that=20
level may be exaggerated. <EM>In contrast</EM>, there's wide agreement =
that=20
Nashville suffers from a shortage of what Buffkin calls "really senior =
technical=20
people," including engineers and specialists with hot skills. To remedy =
the=20
shortage, the Nashville Technology Council, Belmont University and other =
allies=20
have been pulling together a consortium of several dozen universities, =
colleges,=20
government agencies and companies to encourage more students to take up =
computer=20
sciences and related studies in two- and four-year institutions. The =
project is=20
dubbed "<A=20
href=3D"http://www.technologycouncil.com/news.php?viewStory=3D1226">Turni=
ng the Tide=20
of Technology</A>," and it aims to reverse the decline of tech =
degree-holders;=20
keep more of our grads working in Tennessee; and, more tightly align =
education=20
curricula with employers' requirements.</P>
<DIV style=3D"CLEAR: both"></DIV></DIV>
<DIV class=3Dpost-footer>
<DIV class=3D"post-footer-line post-footer-line-1"><SPAN=20
class=3D"post-author vcard">Posted by <SPAN class=3Dfn>Venture =
Nashville</SPAN>=20
</SPAN><SPAN class=3Dpost-timestamp>at <A class=3Dtimestamp-link=20
title=3D"permanent link"=20
href=3D"http://venturenashville.blogspot.com/2008/05/talent-top-it-execs-=
need-nashville-jobs.html"=20
rel=3Dbookmark><ABBR class=3Dpublished=20
title=3D2008-05-09T07:00:00-06:00>07:00</ABBR></A> </SPAN><SPAN=20
class=3Dstar-ratings></SPAN><SPAN class=3Dpost-comment-link></SPAN><SPAN =

class=3D"post-backlinks post-comment-link"></SPAN><SPAN =
class=3Dpost-icons><SPAN=20
class=3Ditem-action><A title=3D"Email Post"=20
href=3D"http://www.blogger.com/email-post.g?blogID=3D20506419&amp;postID=3D=
8939999438805678777"><IMG=20
class=3Dicon-action alt=3D"" =
src=3D"http://www.blogger.com/img/icon18_email.gif">=20
</A></SPAN><SPAN class=3D"item-control blog-admin pid-822227927"><A=20
title=3D"Edit Post"=20
href=3D"http://www.blogger.com/post-edit.g?blogID=3D20506419&amp;postID=3D=
8939999438805678777"><IMG=20
class=3Dicon-action alt=3D""=20
src=3D"http://www.blogger.com/img/icon18_edit_allbkg.gif">=20
</A></SPAN></SPAN></DIV>
<DIV class=3D"post-footer-line post-footer-line-2"><SPAN=20
class=3Dpost-labels></SPAN></DIV>
<DIV class=3D"post-footer-line post-footer-line-3"></DIV></DIV></DIV>
<DIV class=3Dcomments id=3Dcomments><A name=3Dcomments></A>
<H4>0 comments: </H4>
<DL id=3Dcomments-block></DL>
<P class=3Dcomment-footer><A=20
onclick=3D'javascript:window.open(this.href, "bloggerPopup", =
"toolbar=3D0,location=3D0,statusbar=3D1,menubar=3D0,scrollbars=3Dyes,widt=
h=3D400,height=3D450"); return false;'=20
href=3D"http://www.blogger.com/comment.g?blogID=3D20506419&amp;postID=3D8=
939999438805678777&amp;isPopup=3Dtrue">Post=20
a Comment</A> </P>
<DIV id=3Dbacklinks-container>
<DIV id=3DBlog1_backlinks-container><A name=3Dlinks></A>
<H4></H4>
<P class=3Dcomment-footer><A class=3Dcomment-link =
id=3DBlog1_backlinks-create-link=20
href=3D"http://venturenashville.blogspot.com/2008/05/"=20
target=3D_blank></A></P></DIV></DIV></DIV><!-- google_ad_section_end =
--></DIV>
<DIV class=3Dblog-pager id=3Dblog-pager><SPAN =
id=3Dblog-pager-newer-link><A=20
class=3Dblog-pager-newer-link id=3DBlog1_blog-pager-newer-link =
title=3D"Newer Post"=20
href=3D"http://venturenashville.blogspot.com/2008/05/nashville-healthcare=
-m.html">Newer=20
Post</A> </SPAN><SPAN id=3Dblog-pager-older-link><A =
class=3Dblog-pager-older-link=20
id=3DBlog1_blog-pager-older-link title=3D"Older Post"=20
href=3D"http://venturenashville.blogspot.com/2008/05/ingram-steps-down-at=
-goldleaf.html">Older=20
Post</A> </SPAN><A class=3Dhome-link=20
href=3D"http://venturenashville.blogspot.com/">Home</A> </DIV>
<DIV class=3Dclear></DIV>
<DIV class=3Dpost-feeds>
<DIV class=3Dfeed-links>Subscribe to: <A class=3Dfeed-link=20
href=3D"http://venturenashville.blogspot.com/feeds/8939999438805678777/co=
mments/default"=20
target=3D_blank type=3Dapplication/atom+xml>Post Comments (Atom)</A>=20
</DIV></DIV></DIV></DIV></DIV>
<DIV id=3Dsidebar-wrapper>
<DIV class=3D"sidebar section" id=3Dsidebar>
<DIV class=3D"widget Profile" id=3DProfile1>
<H2>About The VN Blog</H2>
<DIV class=3Dwidget-content><A=20
href=3D"http://www.blogger.com/profile/13390895802173064714"><IMG=20
class=3Dprofile-img height=3D36 alt=3D"My Photo"=20
src=3D"http://bp1.blogger.com/__TyKup9BVR0/SC8BF9qpZNI/AAAAAAAAAHo/ycLk1v=
ZDtR8/S220/VNC.jpg"=20
width=3D79></A>=20
<DL class=3Dprofile-datablock>
  <DT class=3Dprofile-data>Venture Nashville=20
  <DD class=3Dprofile-textblock>The purpose of The Venture Nashville =
Blog (VN) is=20
  to help increase the flow of accurate information about research, =
innovation,=20
  technological developments and investment activity in one of America's =
finest=20
  cities, Nashville, Tennessee. <A=20
  href=3D"http://www.cappscom.com/news.php?viewStory=3D4">Milt Capps</A> =
is Editor=20
  &amp; Publisher of The VN Blog and <A=20
  href=3D"http://www.venturenashville.com/">The VN website</A>. Comments =
are=20
  welcomed! and are reviewed prior to posting. Please <A=20
  href=3D"mailto:milt@cappscom.com">write us here</A>. </DD></DL><A=20
class=3Dprofile-link=20
href=3D"http://www.blogger.com/profile/13390895802173064714">View my =
complete=20
profile</A>=20
<DIV class=3Dclear></DIV><SPAN class=3Dwidget-item-control><SPAN=20
class=3D"item-control blog-admin"><A class=3Dquickedit title=3DEdit=20
onclick=3D'return =
_WidgetManager._PopupConfig(document.getElementById("Profile1"));'=20
href=3D"http://www.blogger.com/rearrange?blogID=3D20506419&amp;widgetType=
=3DProfile&amp;widgetId=3DProfile1&amp;action=3DeditWidget"=20
target=3DconfigProfile1><IMG alt=3D""=20
src=3D"http://www.blogger.com/img/icon18_wrench_allbkg.png"> =
</A></SPAN></SPAN>
<DIV class=3Dclear></DIV></DIV></DIV>
<DIV class=3D"widget BlogArchive" id=3DBlogArchive1>
<H2>Blog Archive</H2>
<DIV class=3Dwidget-content>
<DIV id=3DArchiveList>
<DIV id=3DBlogArchive1_ArchiveList>
<UL>
  <LI class=3D"archivedate expanded"><A class=3Dtoggle=20
  =
href=3D"http://venturenashville.blogspot.com/2008/05/talent-top-it-execs-=
need-nashville-jobs.html?widgetType=3DBlogArchive&amp;widgetId=3DBlogArch=
ive1&amp;action=3Dtoggle&amp;dir=3Dclose&amp;toggle=3DYEARLY-119916720000=
0&amp;toggleopen=3DMONTHLY-1209621600000"><SPAN=20
  class=3D"zippy toggle-open">=E2=96=BC </SPAN></A><A =
class=3Dpost-count-link=20
  =
href=3D"http://venturenashville.blogspot.com/search?updated-min=3D2008-01=
-01T00%3A00%3A00-06%3A00&amp;updated-max=3D2009-01-01T00%3A00%3A00-06%3A0=
0&amp;max-results=3D40">2008</A>=20
  <SPAN class=3Dpost-count dir=3Dltr>(40)</SPAN>=20
  <UL>
    <LI class=3D"archivedate expanded"><A class=3Dtoggle=20
    =
href=3D"http://venturenashville.blogspot.com/2008/05/talent-top-it-execs-=
need-nashville-jobs.html?widgetType=3DBlogArchive&amp;widgetId=3DBlogArch=
ive1&amp;action=3Dtoggle&amp;dir=3Dclose&amp;toggle=3DMONTHLY-12096216000=
00&amp;toggleopen=3DMONTHLY-1209621600000"><SPAN=20
    class=3D"zippy toggle-open">=E2=96=BC </SPAN></A><A =
class=3Dpost-count-link=20
    =
href=3D"http://venturenashville.blogspot.com/2008_05_01_archive.html">May=
</A>=20
    <SPAN class=3Dpost-count dir=3Dltr>(10)</SPAN>=20
    <UL class=3Dposts>
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/05/biomimetic-plots-cha=
nge-of-course.html">BioMimetic=20
      plots change of course</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/05/alexander-and-gordon=
-keep-pressure-on.html">Alexander=20
      and Gordon keep pressure on White House</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/05/nashville-loses-vera=
n-medical.html">Nashville=20
      loses Veran Medical</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/05/kravteks-10-million-=
gambit.html">KravTek's=20
      $10 million gambit</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/05/nashville-healthcare=
-m.html">Nashville=20
      Healthcare M&amp;A</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/05/talent-top-it-execs-=
need-nashville-jobs.html">Talent:=20
      Top IT execs need Nashville jobs</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/05/ingram-steps-down-at=
-goldleaf.html">Ingram=20
      steps down at Goldleaf</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/05/former-bradford-avon=
dale-exec-adds.html">Former=20
      Bradford, Avondale exec adds another seat</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/05/music-sobule-disrupt=
er.html">Music:=20
      Sobule the Disrupter</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/05/world-trade-center-f=
or-nashville.html">World=20
      Trade Center for Nashville</A> </LI></UL></LI></UL>
  <UL>
    <LI class=3D"archivedate collapsed"><A class=3Dtoggle=20
    =
href=3D"http://venturenashville.blogspot.com/2008/05/talent-top-it-execs-=
need-nashville-jobs.html?widgetType=3DBlogArchive&amp;widgetId=3DBlogArch=
ive1&amp;action=3Dtoggle&amp;dir=3Dopen&amp;toggle=3DMONTHLY-120702960000=
0&amp;toggleopen=3DMONTHLY-1209621600000"><SPAN=20
    class=3Dzippy>=E2=96=BA </SPAN></A><A class=3Dpost-count-link=20
    =
href=3D"http://venturenashville.blogspot.com/2008_04_01_archive.html">Apr=
il</A>=20
    <SPAN class=3Dpost-count dir=3Dltr>(24)</SPAN>=20
    <UL class=3Dposts>
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/04/doc-channel-adds-boa=
rd-chairman.html">Doc=20
      Channel adds board chairman</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/04/bu-incubator-hatches=
-soundafx-venture.html">BU=20
      incubator hatches soundAFX venture</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/04/nashvilles-brainpowe=
r-index.html">Nashville's=20
      Brainpower Index</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/04/venture-notes-april-=
28-2008.html">Venture=20
      Notes April 28, 2008</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/04/healthstream-beefs-u=
p-management.html">HealthStream=20
      beefs-up management</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/04/nashville-ceo-report=
s-for-fed.html">Nashville=20
      CEO reports for The Fed</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/04/vcs-want-disruptive-=
music-ventures.html">VCs=20
      want 'disruptive' Music ventures</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/04/another-collins-inve=
stor.html">Another=20
      Collins investor</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/04/mid-tn-coalition-lev=
erages-ut-oak-ridge.html">Mid-TN=20
      coalition leverages UT-Oak Ridge technology...</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/04/local-vgt-investing-=
100m-in-deals.html">Local=20
      VGT investing $100M in deals</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/04/ncn-investment-miles=
tone-ahead.html">NCN=20
      investment milestone ahead</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/04/avondale-keeps-eye-o=
n-local.html">Avondale=20
      keeps eye on local entrepreneurs</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/04/nashville-venture-cr=
eed.html">A=20
      Nashville 'venture creed'</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/04/waddey-nashville-nee=
ds-research-park.html">Waddey:=20
      Nashville needs a research park</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/04/vu-takes-companys-li=
quidation-in-stride.html">VU=20
      takes company's liquidation in stride</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/04/legislating-progress=
.html">Legislating=20
      progress?</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/04/gazelles-and-geezers=
.html">Gazelles=20
      and Geezers</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/04/tn-angel-fund-incent=
ives.html">TN=20
      Angel Fund incentives</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/04/perseverance-cromwel=
l-at-ttdc.html">Perseverance:=20
      Cromwell at TTDC</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/04/friday-fantasy-big-w=
in-vs-motricity.html">Friday=20
      Fantasy: 'The Big Win' vs Motricity</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/04/cautionary-tale-juri=
s-jobs-gone.html">Cautionary=20
      tale: Juris jobs gone</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/04/vn-metrics.html">VN =

      Metrics</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/04/noodge-from-noog.htm=
l">Noodge=20
      from The Noog</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/04/angel-investors.html=
">Angel=20
      investors</A> </LI></UL></LI></UL>
  <UL>
    <LI class=3D"archivedate collapsed"><A class=3Dtoggle=20
    =
href=3D"http://venturenashville.blogspot.com/2008/05/talent-top-it-execs-=
need-nashville-jobs.html?widgetType=3DBlogArchive&amp;widgetId=3DBlogArch=
ive1&amp;action=3Dtoggle&amp;dir=3Dopen&amp;toggle=3DMONTHLY-120435120000=
0&amp;toggleopen=3DMONTHLY-1209621600000"><SPAN=20
    class=3Dzippy>=E2=96=BA </SPAN></A><A class=3Dpost-count-link=20
    =
href=3D"http://venturenashville.blogspot.com/2008_03_01_archive.html">Mar=
ch</A>=20
    <SPAN class=3Dpost-count dir=3Dltr>(6)</SPAN>=20
    <UL class=3Dposts>
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/03/venture-notes_31.htm=
l">Venture=20
      Notes</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/03/venture-notes_30.htm=
l">Venture=20
      Notes</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/03/ip-commercialization=
.html">IP=20
      Commercialization</A>=20
      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/03/regional.html">Regio=
nal</A>=20

      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/03/people.html">People<=
/A>=20

      <LI><A=20
      =
href=3D"http://venturenashville.blogspot.com/2008/03/venture-notes.html">=
Venture=20
      Notes</A> </LI></UL></LI></UL></LI></UL></DIV></DIV>
<DIV class=3Dclear></DIV><SPAN class=3Dwidget-item-control><SPAN=20
class=3D"item-control blog-admin"><A class=3Dquickedit title=3DEdit=20
onclick=3D'return =
_WidgetManager._PopupConfig(document.getElementById("BlogArchive1"));'=20
href=3D"http://www.blogger.com/rearrange?blogID=3D20506419&amp;widgetType=
=3DBlogArchive&amp;widgetId=3DBlogArchive1&amp;action=3DeditWidget"=20
target=3DconfigBlogArchive1><IMG alt=3D""=20
src=3D"http://www.blogger.com/img/icon18_wrench_allbkg.png"> =
</A></SPAN></SPAN>
<DIV class=3Dclear></DIV></DIV></DIV>
<DIV class=3D"widget LinkList" id=3DLinkList1>
<H2>Innovators</H2>
<DIV class=3Dwidget-content>
<UL>
  <LI><A href=3D"http://www.venturenashville.com/">Venture Nashville =
Homepage</A>=20
  <LI><A href=3D"http://www2.owen.vanderbilt.edu/oec/">Owen =
Entrepreneurship=20
  Center</A>=20
  <LI><A href=3D"http://forum.belmont.edu/cornwall/">The Entrepreneurial =
Mind</A>=20
  <LI><A href=3D"http://www.nashvillecapital.com/">Nashville Capital =
Network</A>=20
  <LI><A =
href=3D"http://www.vanderbilt.edu/technology_transfer/">Vanderbilt Tech=20
  Transfer</A>=20
  <LI><A href=3D"http://www.tnbio.org/">Tennessee Biotechnology =
Assn.</A>=20
  <LI><A href=3D"http://www.angelcapitalgr.com/">Angel Capital Group</A> =

  <LI><A href=3D"http://www.technologycouncil.com/">Nashville Technology =

  Council</A>=20
  <LI><A href=3D"http://www.cappscom.com/news.php?viewStory=3D5">News of =
Nashville=20
  Technology</A>=20
  <LI><A =
href=3D"http://www.cappscom.com/news.php?viewStory=3D23">Nashville=20
  Attorney</A>=20
  <LI><A=20
  =
href=3D"http://frontweb.vuse.vanderbilt.edu/vuse_web/research/research.ht=
m">Vanderbilt=20
  Engineering Research</A>=20
  <LI><A =
href=3D"http://www.mc.vanderbilt.edu/medschool/centers.php">Vanderbilt=20
  Medical Research</A>=20
  <LI><A href=3D"http://exploration.vanderbilt.edu/home.htm">Vanderbilt=20
  Exploration</A>=20
  <LI><A =
href=3D"http://www.tnstate.edu/interior.asp?mid=3D77&amp;ptid=3D1">Tennes=
see=20
  State University</A>=20
  <LI><A href=3D"http://www.mtsu.edu/~research/techtransfer.html">Middle =
Tenn.=20
  State Univ.</A>=20
  <LI><A href=3D"http://www.redorbit.com/">Red Orbit News</A>=20
  <LI><A href=3D"http://news.google.com/">Google News</A> </LI></UL>
<DIV class=3Dclear></DIV><SPAN class=3Dwidget-item-control><SPAN=20
class=3D"item-control blog-admin"><A class=3Dquickedit title=3DEdit=20
onclick=3D'return =
_WidgetManager._PopupConfig(document.getElementById("LinkList1"));'=20
href=3D"http://www.blogger.com/rearrange?blogID=3D20506419&amp;widgetType=
=3DLinkList&amp;widgetId=3DLinkList1&amp;action=3DeditWidget"=20
target=3DconfigLinkList1><IMG alt=3D""=20
src=3D"http://www.blogger.com/img/icon18_wrench_allbkg.png"> =
</A></SPAN></SPAN>
<DIV class=3Dclear></DIV></DIV></DIV></DIV></DIV><!-- spacer for skins =
that want sidebar and main to be the same height-->
<DIV class=3Dclear>&nbsp;</DIV></DIV><!-- end content-wrapper =
--></DIV></DIV><!-- end outer-wrapper -->
<SCRIPT src=3D"http://www.blogger.com/widgets/3999149722-widgets.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT type=3Dtext/javascript>=0A=
_WidgetManager._Init('http://www.blogger.com/rearrange?blogID=3D20506419'=
, =
'http://venturenashville.blogspot.com/2008/05/talent-top-it-execs-need-na=
shville-jobs.html','20506419');=0A=
_WidgetManager._SetPageActionUrl('http://www.blogger.com/display?blogID=3D=
20506419', 'r9jrk4TYGt7qHNA56OrvF0vdYiY:1211303321060');=0A=
_WidgetManager._SetDataContext([{'name': 'blog', 'data': {'title': =
'Venture Nashville', 'pageType': 'item', 'url': =
'http://venturenashville.blogspot.com/2008/05/talent-top-it-execs-need-na=
shville-jobs.html', 'homepageUrl': =
'http://venturenashville.blogspot.com/', 'pageName': 'Talent:  Top IT =
execs need Nashville jobs', 'pageTitle': 'Venture Nashville: Talent:  =
Top IT execs need Nashville jobs', 'encoding': 'UTF-8', 'isPrivate': =
false, 'languageDirection': 'ltr', 'feedLinks': '\74link =
rel\75\42alternate\42 type\75\42application/atom+xml\42 =
title\75\42Venture Nashville - Atom\42 =
href\75\42http://venturenashville.blogspot.com/feeds/posts/default\42 =
/\76\n\74link rel\75\42alternate\42 type\75\42application/rss+xml\42 =
title\75\42Venture Nashville - RSS\42 =
href\75\42http://venturenashville.blogspot.com/feeds/posts/default?alt\75=
rss\42 /\76\n\74link rel\75\42service.post\42 =
type\75\42application/atom+xml\42 title\75\42Venture Nashville - Atom\42 =
href\75\42http://www.blogger.com/feeds/20506419/posts/default\42 =
/\76\n\74link rel\75\42EditURI\42 type\75\42application/rsd+xml\42 =
title\75\42RSD\42 =
href\75\42http://www.blogger.com/rsd.g?blogID\07520506419\42 =
/\76\n\74link rel\75\42alternate\42 type\75\42application/atom+xml\42 =
title\75\42Venture Nashville - Atom\42 =
href\75\42http://venturenashville.blogspot.com/feeds/8939999438805678777/=
comments/default\42 /\76\n', 'meTag': '', 'openIdOpTag': ''}}]);=0A=
_WidgetManager._SetSystemMarkup({'layout': {'varName': '', 'template': =
'\74div class\75\47widget-wrap1\47\76\n\74div =
class\75\47widget-wrap2\47\76\n\74div =
class\75\47widget-wrap3\47\76\n\74div =
class\75\47widget-content\47\76\n\74div =
class\75\47layout-title\47\76\74data:layout-title\76\74/data:layout-title=
\76\74/div\76\n\74a class\75\47editlink\47 =
expr:href\75\47data:widget.quickEditUrl\47 =
expr:onclick\75\47\46quot;return =
_WidgetManager._PopupConfig(document.getElementById(\\\46quot;\46quot; + =
      data:widget.instanceId + \46quot;\\\46quot;));\46quot;\47 =
target\75\47chooseWidget\47\76\74data:edit-link\76\74/data:edit-link\76\7=
4/a\76\n\74/div\76\n\74/div\76\n\74/div\76\n\74/div\076'}, 'quickedit': =
{'varName': '', 'template': '\74div =
class\75\47clear\47\76\74/div\76\n\74span =
class\75\47widget-item-control\47\76\n\74span class\75\47item-control =
blog-admin\47\76\n\74a class\75\47quickedit\47 =
expr:href\75\47data:widget.quickEditUrl\47 =
expr:onclick\75\47\46quot;return =
_WidgetManager._PopupConfig(document.getElementById(\\\46quot;\46quot; + =
      data:widget.instanceId + \46quot;\\\46quot;));\46quot;\47 =
expr:target\75\47\46quot;config\46quot; + data:widget.instanceId\47 =
expr:title\75\47data:edit-link\47\76\n\74img alt\75\47\47 =
src\75\47http://www.blogger.com/img/icon18_wrench_allbkg.png\47/\76\n\74/=
a\76\n\74/span\76\n\74/span\76\n\74div =
class\75\47clear\47\76\74/div\076'}, 'all-head-content': {'varName': =
'page', 'template': '\74meta expr:content\75\47\46quot;text/html; =
charset\75\46quot; + data:page.encoding\47 =
http-equiv\75\47Content-Type\47/\76\n\74meta content\75\47true\47 =
name\75\47MSSmartTagsPreventParsing\47/\76\n\74meta =
content\75\47blogger\47 =
name\75\47generator\47/\76\n\74data:blog.feedLinks\76\74/data:blog.feedLi=
nks\76\n\74data:blog.meTag\76\74/data:blog.meTag\76\n\74data:blog.openIdO=
pTag\76\74/data:blog.openIdOpTag\76\n\74b:if =
cond\75\47data:page.isPrivate\47\76\n\74meta =
content\75\47NOINDEX,NOFOLLOW\47 =
name\75\47robots\47/\76\n\74/b:if\076'}});=0A=
_WidgetManager._RegisterWidget('_ProfileView', new =
_WidgetInfo('Profile1', 'sidebar',{'main': {'varName': '', 'template': =
'\74b:if cond\75\47data:title !\75 =
\46quot;\46quot;\47\76\n\74h2\76\74data:title\76\74/data:title\76\74/h2\7=
6\n\74/b:if\76\n\74div class\75\47widget-content\47\76\n\74b:if =
cond\75\47data:team \75\75 =
\46quot;true\46quot;\47\76\n\74ul\76\n\74b:loop =
values\75\47data:authors\47 var\75\47i\47\76\n\74li\76\74a =
expr:href\75\47data:i.userUrl\47\76\74data:i.display-name\76\74/data:i.di=
splay-name\76\74/a\76\74/li\76\n\74/b:loop\76\n\74/ul\76\n\74b:else\76\74=
/b:else\76\n\74b:if cond\75\47data:photo.url !\75 =
\46quot;\46quot;\47\76\n\74a expr:href\75\47data:userUrl\47\76\74img =
class\75\47profile-img\47 expr:alt\75\47data:photo.alt\47 =
expr:height\75\47data:photo.height\47 expr:src\75\47data:photo.url\47 =
expr:width\75\47data:photo.width\47/\76\74/a\76\n\74/b:if\76\n\74dl =
class\75\47profile-datablock\47\76\n\74dt =
class\75\47profile-data\47\76\74data:displayname\76\74/data:displayname\7=
6\74/dt\76\n\74b:if cond\75\47data:showlocation \75\75 =
\46quot;true\46quot;\47\76\n\74dd =
class\75\47profile-data\47\76\74data:location\76\74/data:location\76\74/d=
d\76\n\74/b:if\76\n\74b:if cond\75\47data:aboutme !\75 =
\46quot;\46quot;\47\76\74dd =
class\75\47profile-textblock\47\76\74data:aboutme\76\74/data:aboutme\76\7=
4/dd\76\74/b:if\76\n\74/dl\76\n\74a class\75\47profile-link\47 =
expr:href\75\47data:userUrl\47\76\74data:viewProfileMsg\76\74/data:viewPr=
ofileMsg\76\74/a\76\n\74/b:if\76\n\74b:include =
name\75\47quickedit\47\76\74/b:include\76\n\74/div\076'}}, =
document.getElementById('Profile1'), {}, 'displayModeFull'));=0A=
_WidgetManager._RegisterWidget('_BlogArchiveView', new =
_WidgetInfo('BlogArchive1', 'sidebar',{'main': {'varName': '', =
'template': '\74b:if =
cond\75\47data:title\47\76\n\74h2\76\74data:title\76\74/data:title\76\74/=
h2\76\n\74/b:if\76\n\74div class\75\47widget-content\47\76\n\74div =
id\75\47ArchiveList\47\76\n\74div expr:id\75\47data:widget.instanceId + =
\46quot;_ArchiveList\46quot;\47\76\n\74b:if cond\75\47data:style \75\75 =
\46quot;HIERARCHY\46quot;\47\76\n\74b:include data\75\47data\47 =
name\75\47interval\47\76\74/b:include\76\n\74/b:if\76\n\74b:if =
cond\75\47data:style \75\75 \46quot;FLAT\46quot;\47\76\n\74b:include =
data\75\47data\47 =
name\75\47flat\47\76\74/b:include\76\n\74/b:if\76\n\74b:if =
cond\75\47data:style \75\75 \46quot;MENU\46quot;\47\76\n\74b:include =
data\75\47data\47 =
name\75\47menu\47\76\74/b:include\76\n\74/b:if\76\n\74/div\76\n\74/div\76=
\n\74b:include name\75\47quickedit\47\76\74/b:include\76\n\74/div\076'}, =
'flat': {'varName': 'data', 'template': '\74ul\76\n\74b:loop =
values\75\47data:data\47 var\75\47i\47\76\n\74li =
class\75\47archivedate\47\76\n\74a =
expr:href\75\47data:i.url\47\76\74data:i.name\76\74/data:i.name\76\74/a\7=
6 (\74data:i.post-count\76\74/data:i.post-count\76)\n      =
\74/li\76\n\74/b:loop\76\n\74/ul\076'}, 'menu': {'varName': 'data', =
'template': '\74select expr:id\75\47data:widget.instanceId + =
\46quot;_ArchiveMenu\46quot;\47\76\n\74option =
value\75\47\47\76\74data:title\76\74/data:title\76\74/option\76\n\74b:loo=