From: "Saved by Windows Internet Explorer 7"
Subject: Computer in Education and Curriculum Studies: Introduction to Computer Assisted Language Learning (in Arabic) Designed by DR. IBRAHIM SULIMAN AHMED ASHMAIQ
Date: Sat, 17 Nov 2007 19:44:50 +0300
MIME-Version: 1.0
Content-Type: multipart/related;
	type="multipart/alternative";
	boundary="----=_NextPart_000_03C4_01C82952.51360150"
X-MimeOLE: Produced By Microsoft MimeOLE V6.0.6000.16545

This is a multi-part message in MIME format.

------=_NextPart_000_03C4_01C82952.51360150
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://buttons.blogger.com/bloggerbutton1.gif

R0lGODlhWAAfAOYAAPjx6P9mAABDev///+jcy8i1n+/m2e3j1ezi1O7k1vTr4fPr4PTs4vXt4vLp
3vPq3/Hp3fHo2/Dn2kJxl7bDy/+zgOfl4SFaiRFPgYSgtf/Zv/8AAP+MQFN9nw5NgNfa2XSUrf+W
UB1XhjJmkDxsk8bO0jxskv9wEGOJpjtrkUFwlrW/xJWrvLS+wrW/w/ngy//Gn/yaV9LSzrW/xdXW
0ztskv/iz0p2mPmWUsTKy/5uDvDUu0t3mZeruLbAxkt2mdXV0sTJybO/xv/s3/HWvlqAnvmVUYae
r4efsP9vD1F7naW0vcTKyniVqmmLpdTU0ZWptf+DMJirueTg2ixhjNTW1Et2mC1ijYegsniWq7O+
xv/172iKo6e2v5aruKSzu7TAxsPJzP+fYJaptsPIyHmWrGqMpkp1l2mLpLO9wQAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
BAEAABsALAAAAABYAB8AAAf/gBsbBISFhoeIiYqLjI2OiIKDCJOUlZaXmJmam5ydlwSDB6KjpKWm
p6ipqqusqAUECbE7RgG1tre4tkY7sb2+v8DBwsPEwa8GBkQ6uczMOkTI0SkpUNFcKWdf0dvc3d7f
4NHHBjjN5rg43Gkp2ylHRyLh8vPzrxIS5/m29/wtNfwSarSQIUDGGA8iyCC5IcEDEn8Sbghg2IJK
QYAYM2q89ypCBGYhKogUKeaEOY8oXZhAGcFEERErPSxBYyKIBxcCrDQpskREBBEuXIgIwrKo0aMo
X0GAgOuEhgFQow7YEqLZ0qsrTFyFYALLCghMBEBYIVaAkx8efnjJIqDtiqxb/+PKnbv1lQMHuJ5K
3RuF2d2/M0j8dUBixl8BT3oIJuGhhwgROXKIACx4sOXLmP++evDgVoi9oGEw40z6igcppEn4IG3G
g4AuD8oIAMLDA+faHoD4IEG6t+/fwB+8WrDgVoWoMDgo/wx1CDPi0KNLh05jyvToNGhc385d+isF
CoxHrVrrxJCoJnGBX8++vZYw7ePLn0+f/isGDMRHtaFBr1QNHNyC34BKqGCgEkLgJ4QAKgzo4IMQ
RijhhPi90kAD+oEGWgW3XOhhWyAKUEUDYDDo4Ykopqjiiixe+AoAAGSooVQc2gLjjW0BYEEHAmQA
AAUCTHDjkEQWaeSRSML4Yv+Mthy3X3/92UDjLUTmCAAIPf4YJIwWoNAWChbAWMIFAoCQQQdcThAk
CxN8AGMGGAQZJgAdZOAlC0QumSF5nkVVYy1V9ggCBheECaSQAKh5AZmIknlBnALA6CWhbVEAAAsC
XDDClgC09ailQ+rZJHLKlcoBDH5SOWSIZcJ4qI4CYGCBBXFa8EGsWkYKAJkl0CqApZu6SWaYbX0w
Z6gEwNjnjHsFaOOqv1KwKQhaCvlqotFyaqWValraVgYZkOmtrkWKaot/zGqAS6Cu5vjqtd1eu62u
3XYa5AT4umlluckyaYtTzA6gQXrP4qhrBu5uaUGss9Z6Kwa5wsirr8AKUALHu0aa69lIHFfg7LrQ
4tsWmkBi4KOijEoswAiQSpopmb8CgDAGE7AM47559quPPkRCOvKcm6K5489ikomlrhaoWXPMMsPc
gZsYQJxxvzHsbE4MSWaNJM4w1qs1vzC+kITVuSTxwtdfs2AmjxeIiUIGR7uJNrI3vlA12bXEcPbc
WfPYFgZ4yhwitXzfuGThiPNdAgUUHAvAB4zLnXgBGxSQ+OWYZ65kJAV07vnnoIcu+uikl2766aFH
ovrqrLfu+uuwxy777IIEAgA7

------=_NextPart_000_03C4_01C82952.51360150
Content-Type: text/css;
	charset="windows-1256"
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
}
.quick-edit-icon {
	PADDING-RIGHT: 9px; PADDING-LEFT: 9px; BACKGROUND: =
url(/img/icon18_edit_allbkg.gif) no-repeat left 50%; PADDING-BOTTOM: =
9px; MARGIN: 0px 0px 0px 0.5em; PADDING-TOP: 9px
}
.widget-item-control .quick-edit-icon {
	BACKGROUND: url(/img/icon18_wrench_allbkg.gif) no-repeat left 50%
}
.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
}
.email-post-icon {
	PADDING-RIGHT: 9px; PADDING-LEFT: 9px; BACKGROUND: =
url(/img/icon18_email.gif) no-repeat left 50%; PADDING-BOTTOM: 9px; =
MARGIN: 0px 0px 0px 0.5em; PADDING-TOP: 9px
}

@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_03C4_01C82952.51360150
Content-Type: text/css;
	charset="windows-1256"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.blogger.com/css/navbar/classic.css

HTML BODY {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-TOP: 0px
}
BODY #wrapper {
	MARGIN-TOP: 30px
}
BODY #header {
	MARGIN-TOP: 50px
}
#leftcontent {
	MARGIN-TOP: 30px! important
}
#rightcontent {
	MARGIN-TOP: 30px! important
}
#Main #Title {
	MARGIN-TOP: 30px! important
}
BODY #wrap #wrap2 #header {
	MARGIN-TOP: 0px
}
BODY #wrap {
	MARGIN-TOP: 34px
}
#blog-header {
	MARGIN-TOP: -4px
}
BODY #wrap4 {
	PADDING-RIGHT: 15px; MARGIN-TOP: -4px; PADDING-LEFT: 15px; =
PADDING-BOTTOM: 0px; PADDING-TOP: 15px
}
#space-for-ie {
	BORDER-RIGHT: 0px; BORDER-TOP: 0px; DISPLAY: block; BORDER-LEFT: 0px; =
BORDER-BOTTOM: 0px
}
#navbar-iframe {
	Z-INDEX: 500; LEFT: 0px; POSITION: absolute; TOP: 0px
}

------=_NextPart_000_03C4_01C82952.51360150
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.blogger.com/img/navbar/2/btn_search_this.gif

R0lGODlhYAAPANUAAOLVws/BrKSSfLGfioVwWtzOuuHVwaqYg5J9aOLWwpiFbr2smMOznremkdbH
s5mFb76umYt3YZ6Ldr2tmKSSfdbItJiFb9rNuNfJtdrNuaWTfdbItdbJtaWSfZiEb8m6pX9pU5mG
b+LVwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAABgAA8AAAb/wMyE
oggZj8ikcslsOp9Qp4UCEUIwBoNoy+16v+BwVysum8/dCgRCqaDf8Lg8nth0FAmAfs7nAvqAXXsJ
Dw9+CwQgCyIfII4fWwcgB1uNIASLIgERk4wgWyCQWwOOIB6eoJCPIoiKXZYgA1seslutlLaJAiJa
BiEKInoJBAwFBahdCB4IlZ8NnyIRDSIOyKFe19aQA6cixMavnwzQtFzEDiAB1OmaZAkKeOYIoo0f
ogWKIMf1AswB+lzq1cNGL9RAblsIzPPCj5mIcsjKNXAYzMAfBYb+aOLEwJOHbuNEgOjYCAEBSI3C
fczGJVujldu6bRqpMsKuh7VS4hTBzdIfyosYuZCRcEpnJAIeCFBKeeDUv2rNUhGMKjJmF6LhROBT
B/HfMQTTFkRAlifoFgMNPkjYJfCYBwEfBBT9hK4aArgoobGUqk1Ev2Np14b78Iwr3GoRBoyr5oBA
g2cJKiqwsEVPUwHHAnz0wFWdZk3dDiwqIHfa54fqunDecnr1R3WXj3HR/LGjiKYeFgUgalsTUVwW
H4T4GTmQnOLGAwEwoEADhz8ak7+JLr0PBgoTJmwIVn16dz4J1EC4AEGDhSjo06tfDwWjgAkXggAA
Ow==

------=_NextPart_000_03C4_01C82952.51360150
Content-Type: text/css;
	charset="windows-1256"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.blogger.com/v-css/navbar/2173601441-navbar.css

#b-navbar {
	DISPLAY: block! important; Z-INDEX: 1; MIN-HEIGHT: 24px; LEFT: 0px; =
MARGIN-BOTTOM: 10px; PADDING-BOTTOM: 7px; FONT: small "Trebuchet =
MS",Verdana,Arial,Sans-serif; WIDTH: 100%; COLOR: #47a; BORDER-BOTTOM: =
#024 1px solid; POSITION: absolute! important; TOP: 0px
}
.bt1 {
	FONT-SIZE: 1px; MARGIN: 0px 1px; LINE-HEIGHT: 1px; POSITION: relative; =
HEIGHT: 1px
}
.bt2 {
	PADDING-RIGHT: 2px; PADDING-LEFT: 2px; FONT-SIZE: 83%; PADDING-BOTTOM: =
2px; PADDING-TOP: 2px; POSITION: relative
}
#b-next {
	PADDING-LEFT: 5px
}
#b-search-this {
	MARGIN: 0px; TEXT-TRANSFORM: uppercase; CURSOR: pointer; WHITE-SPACE: =
nowrap; POSITION: relative; TEXT-DECORATION: none
}
#b-flag-this {
	PADDING-LEFT: 5px; MARGIN: 0px; TEXT-TRANSFORM: uppercase; CURSOR: =
pointer; WHITE-SPACE: nowrap; POSITION: relative; TEXT-DECORATION: none
}
#b-navbar #b-logo {
	BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; LEFT: 5px; =
BORDER-BOTTOM-WIDTH: 0px; POSITION: absolute! important; TOP: 0.15em; =
BORDER-RIGHT-WIDTH: 0px
}

@media All   =20
{
#b-search {
	MARGIN: 0px 0px 0px 34px; HEIGHT: 1em; BACKGROUND-COLOR: #147
}
#b-search TABLE {
	PADDING-RIGHT: 5px
}
#b-search TD {
	FONT-SIZE: 100%; LINE-HEIGHT: 0.8em
}
#b-more {
	FLOAT: right
}
#b-searchbtn {
	MARGIN-RIGHT: 5px
}
#b-more {
	FLOAT: right
}
#b-search TABLE {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: left; PADDING-BOTTOM: =
2px; PADDING-TOP: 2px; _padding: 1px 2px 1px
}
#b-search A {
	LINE-HEIGHT: 1em; TEXT-DECORATION: none
}
#b-search A:hover {
	LINE-HEIGHT: 1em; TEXT-DECORATION: none
}
#b-search TD {
	LINE-HEIGHT: 0.8; PADDING-TOP: 2px
}
#b-search TD TD {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; =
PADDING-TOP: 0px
}
#b-searchbtn {
	DISPLAY: block
}

}

@media Handheld   =20
{
#b-search {
	DISPLAY: none! important
}
#b-more {
	DISPLAY: none! important
}
    }
.navbar-right {
	PADDING-RIGHT: 10px
}
TD.navbutton {
	PADDING-RIGHT: 5px; _padding-top: .3em
}
TD.navsearch {
	PADDING-LEFT: 5px
}
#b-query {
	VERTICAL-ALIGN: top; WIDTH: 12em; MARGIN-RIGHT: 0.25em
}
#b-query {
	FONT-SIZE: x-small! important
}

@media All   =20
{
BODY DIV.b-mobile {
	DISPLAY: none
}
#b-sms {
	DISPLAY: none! important
}

}

@media Handheld   =20
{
BODY DIV.b-mobile {
	DISPLAY: block
}
#b-sms {
	PADDING-RIGHT: 7px; DISPLAY: block! important; 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; WHITE-SPACE: nowrap; =
TEXT-DECORATION: none
}
#b-sms A:hover {
	COLOR: #fff; TEXT-DECORATION: underline
}

}

@media All   =20
{
#flagi {
	PADDING-RIGHT: 1px; DISPLAY: none; PADDING-LEFT: 1px; Z-INDEX: 300; =
PADDING-BOTTOM: 1px; PADDING-TOP: 1px; TOP: 7px; BACKGROUND-COLOR: #333
}
#unflagi {
	PADDING-RIGHT: 1px; DISPLAY: none; PADDING-LEFT: 1px; Z-INDEX: 300; =
PADDING-BOTTOM: 1px; PADDING-TOP: 1px; TOP: 7px; BACKGROUND-COLOR: #333
}

}

@media Handheld   =20
{
#flagi {
	DISPLAY: none! important
}
#unflagi {
	DISPLAY: none! important
}
    }
#flagi-body {
	PADDING-RIGHT: 3px; PADDING-LEFT: 3px; FONT-WEIGHT: bold; FONT-SIZE: =
10px; PADDING-BOTTOM: 3px; LINE-HEIGHT: 14px; PADDING-TOP: 3px; =
FONT-FAMILY: "Trebuchet MS", Vedana, Arial, Sans-serif; =
BACKGROUND-COLOR: #ffff99; TEXT-ALIGN: center
}
#flagi-body A {
	FONT-SIZE: 10px; COLOR: #3366cc; TEXT-DECORATION: none
}
#flagi-body A:hover {
	TEXT-DECORATION: underline
}
#unflagi-body {
	PADDING-RIGHT: 3px; PADDING-LEFT: 3px; FONT-WEIGHT: bold; FONT-SIZE: =
10px; PADDING-BOTTOM: 3px; LINE-HEIGHT: 14px; PADDING-TOP: 3px; =
FONT-FAMILY: "Trebuchet MS", Vedana, Arial, Sans-serif; =
BACKGROUND-COLOR: #ffff99; TEXT-ALIGN: center
}
#unflagi-body A {
	FONT-SIZE: 10px; COLOR: #3366cc; TEXT-DECORATION: none
}
#unflagi-body A:hover {
	TEXT-DECORATION: underline
}

------=_NextPart_000_03C4_01C82952.51360150
Content-Type: text/css;
	charset="windows-1256"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.blogger.com/v-css/navbar/1620315714-2.css

#b-navbar {
	COLOR: #a4917c; BORDER-BOTTOM: #e1d4c0 1px solid; BACKGROUND-COLOR: =
#f5ece2
}
#b-search TABLE {
	BACKGROUND: url(../../img/navbar/2/corner.gif) #e1d4c0 no-repeat left =
bottom
}
#b-query {
	BORDER-RIGHT: #bcac97 1px solid; BORDER-TOP: #bcac97 1px solid; =
BORDER-LEFT: #bcac97 1px solid; BORDER-BOTTOM: #bcac97 1px solid
}
#b-search A {
	COLOR: #664e38
}
#b-search A:hover {
	COLOR: #047
}
#b-search TD {
	COLOR: #333333
}
#b-sms A {
	COLOR: #664e38
}
#b-sms A:hover {
	COLOR: #047
}
#navbar-logo {
	BACKGROUND-IMAGE: url(../../img/navbar/2/logobar.gif); WIDTH: 24px; =
HEIGHT: 24px
}
#b-search-this {
	BACKGROUND: #e1dc40
}
.bt1 {
	BACKGROUND-COLOR: #bcac97
}
.bt2 {
	BORDER-RIGHT: #bcac07 1px solid; BORDER-LEFT: #bcac97 1px solid; COLOR: =
#664e38; BACKGROUND-COLOR: #e1d4c0
}
DIV.bt2:hover {
	BACKGROUND-COLOR: #bcac97
}
#bt-flag {
	PADDING-LEFT: 8px; BACKGROUND: url(../../img/navbar/2/flag.gif) =
no-repeat left 50%
}

------=_NextPart_000_03C4_01C82952.51360150
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_03C4_01C82952.51360150
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_03C4_01C82952.51360150
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.blogger.com/v-app/scripts/1118085881-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=
  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=
	s=3D""; for (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_03C4_01C82952.51360150
Content-Type: multipart/alternative;
	boundary="----=_NextPart_001_03D7_01C82952.51384B40"


------=_NextPart_001_03D7_01C82952.51384B40
Content-Type: text/html;
	charset="utf-8"
Content-Transfer-Encoding: base64
Content-Location: http://209.85.135.104/search?q=cache:E7HL2I78XH0J:computer-in-education.blogspot.com/2007/04/introduction-to-computer-assisted.html+%D8%B1%D9%8A%D9%85%D8%A7+%D8%A7%D9%84%D8%AC%D8%B1%D9%81&hl=en&ct=clnk&cd=96

77u/PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9u
YWwvL0VOIj4NCjxIVE1MPjxIRUFEPjxUSVRMRT5Db21wdXRlciBpbiBFZHVjYXRpb24gYW5kIEN1
cnJpY3VsdW0gU3R1ZGllczogSW50cm9kdWN0aW9uIHRvIENvbXB1dGVyIEFzc2lzdGVkIExhbmd1
YWdlIExlYXJuaW5nIChpbiBBcmFiaWMpIERlc2lnbmVkIGJ5IERSLiBJQlJBSElNIFNVTElNQU4g
QUhNRUQgQVNITUFJUTwvVElUTEU+DQo8TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250
ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPg0KPE1FVEEgY29udGVudD0iTVNIVE1MIDYu
MDAuNjAwMC4xNjU0NiIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPg0KPEJPRFk+DQo8VEFCTEUgd2lk
dGg9IjEwMCUiIGJvcmRlcj0xPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQ+DQogICAgICA8
VEFCTEUgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0xMCB3aWR0aD0iMTAwJSIgYmdDb2xvcj0j
ZmZmZmZmIGJvcmRlcj0xIA0KICAgICAgY29sb3I9IiNmZmZmZmYiPg0KICAgICAgICA8VEJPRFk+
DQogICAgICAgIDxUUj4NCiAgICAgICAgICA8VEQ+PEZPTlQgZmFjZT1hcmlhbCxzYW5zLXNlcmlm
IGNvbG9yPWJsYWNrIHNpemU9LTE+VGhpcyBpcyA8Qj48Rk9OVCANCiAgICAgICAgICAgIGNvbG9y
PSMwMDM5YjY+RzwvRk9OVD4gPEZPTlQgY29sb3I9I2M0MTIwMD5vPC9GT05UPiA8Rk9OVCANCiAg
ICAgICAgICAgIGNvbG9yPSNmM2M1MTg+bzwvRk9OVD4gPEZPTlQgY29sb3I9IzAwMzliNj5nPC9G
T05UPiA8Rk9OVCANCiAgICAgICAgICAgIGNvbG9yPSMzMGE3MmY+bDwvRk9OVD4gPEZPTlQgY29s
b3I9I2M0MTIwMD5lPC9GT05UPjwvQj4ncyA8QSANCiAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly93
d3cuZ29vZ2xlLmNvbS9pbnRsL2VuL2hlbHAvZmVhdHVyZXMuaHRtbCNjYWNoZWQiPjxGT05UIA0K
ICAgICAgICAgICAgY29sb3I9Ymx1ZT5jYWNoZTwvRk9OVD48L0E+IG9mIDxBIA0KICAgICAgICAg
ICAgaHJlZj0iaHR0cDovL2NvbXB1dGVyLWluLWVkdWNhdGlvbi5ibG9nc3BvdC5jb20vMjAwNy8w
NC9pbnRyb2R1Y3Rpb24tdG8tY29tcHV0ZXItYXNzaXN0ZWQuaHRtbCI+PEZPTlQgDQogICAgICAg
ICAgICBjb2xvcj1ibHVlPmh0dHA6Ly9jb21wdXRlci1pbi1lZHVjYXRpb24uYmxvZ3Nwb3QuY29t
LzIwMDcvMDQvaW50cm9kdWN0aW9uLXRvLWNvbXB1dGVyLWFzc2lzdGVkLmh0bWw8L0ZPTlQ+PC9B
PiANCiAgICAgICAgICAgIGFzIHJldHJpZXZlZCBvbiAxOCBPY3QgMjAwNyAyMjoxMzozNSBHTVQu
PEJSPjxCPjxGT05UIA0KICAgICAgICAgICAgY29sb3I9IzAwMzliNj5HPC9GT05UPiA8Rk9OVCBj
b2xvcj0jYzQxMjAwPm88L0ZPTlQ+IDxGT05UIA0KICAgICAgICAgICAgY29sb3I9I2YzYzUxOD5v
PC9GT05UPiA8Rk9OVCBjb2xvcj0jMDAzOWI2Pmc8L0ZPTlQ+IDxGT05UIA0KICAgICAgICAgICAg
Y29sb3I9IzMwYTcyZj5sPC9GT05UPiA8Rk9OVCBjb2xvcj0jYzQxMjAwPmU8L0ZPTlQ+PC9CPidz
IGNhY2hlIGlzIA0KICAgICAgICAgICAgdGhlIHNuYXBzaG90IHRoYXQgd2UgdG9vayBvZiB0aGUg
cGFnZSBhcyB3ZSBjcmF3bGVkIHRoZSB3ZWIuPEJSPlRoZSANCiAgICAgICAgICAgIHBhZ2UgbWF5
IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGF0IHRpbWUuIENsaWNrIGhlcmUgZm9yIHRoZSA8QSANCiAg
ICAgICAgICAgIGhyZWY9Imh0dHA6Ly9jb21wdXRlci1pbi1lZHVjYXRpb24uYmxvZ3Nwb3QuY29t
LzIwMDcvMDQvaW50cm9kdWN0aW9uLXRvLWNvbXB1dGVyLWFzc2lzdGVkLmh0bWwiPjxGT05UIA0K
ICAgICAgICAgICAgY29sb3I9Ymx1ZT5jdXJyZW50IHBhZ2U8L0ZPTlQ+PC9BPiB3aXRob3V0IGhp
Z2hsaWdodGluZy48QlI+VGhpcyANCiAgICAgICAgICAgIGNhY2hlZCBwYWdlIG1heSByZWZlcmVu
Y2UgaW1hZ2VzIHdoaWNoIGFyZSBubyBsb25nZXIgYXZhaWxhYmxlLiANCiAgICAgICAgICAgIENs
aWNrIGhlcmUgZm9yIHRoZSA8QSANCiAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly8yMDkuODUuMTM1
LjEwNC9zZWFyY2g/cT1jYWNoZTpFN0hMMkk3OFhIMEo6Y29tcHV0ZXItaW4tZWR1Y2F0aW9uLmJs
b2dzcG90LmNvbS8yMDA3LzA0L2ludHJvZHVjdGlvbi10by1jb21wdXRlci1hc3Npc3RlZC5odG1s
KyVEOCVCMSVEOSU4QSVEOSU4NSVEOCVBNyslRDglQTclRDklODQlRDglQUMlRDglQjElRDklODEm
YW1wO2hsPWVuJmFtcDtzdHJpcD0xIj48Rk9OVCANCiAgICAgICAgICAgIGNvbG9yPWJsdWU+Y2Fj
aGVkIHRleHQ8L0ZPTlQ+PC9BPiBvbmx5LjxCUj5UbyBsaW5rIHRvIG9yIGJvb2ttYXJrIA0KICAg
ICAgICAgICAgdGhpcyBwYWdlLCB1c2UgdGhlIGZvbGxvd2luZyB1cmw6IA0KICAgICAgICAgICAg
PENPREU+aHR0cDovL3d3dy5nb29nbGUuY29tL3NlYXJjaD9xPWNhY2hlOkU3SEwySTc4WEgwSjpj
b21wdXRlci1pbi1lZHVjYXRpb24uYmxvZ3Nwb3QuY29tLzIwMDcvMDQvaW50cm9kdWN0aW9uLXRv
LWNvbXB1dGVyLWFzc2lzdGVkLmh0bWwrJUQ4JUIxJUQ5JThBJUQ5JTg1JUQ4JUE3KyVEOCVBNyVE
OSU4NCVEOCVBQyVEOCVCMSVEOSU4MSZhbXA7aGw9ZW4mYW1wO2N0PWNsbmsmYW1wO2NkPTk2PC9D
T0RFPjwvRk9OVD48QlI+PEJSPg0KICAgICAgICAgICAgPENFTlRFUj48Rk9OVCBzaXplPS0yPjxJ
Pkdvb2dsZSBpcyBuZWl0aGVyIGFmZmlsaWF0ZWQgd2l0aCB0aGUgDQogICAgICAgICAgICBhdXRo
b3JzIG9mIHRoaXMgcGFnZSBub3IgcmVzcG9uc2libGUgZm9yIGl0cyANCiAgICAgICAgICAgIGNv
bnRlbnQuPC9JPjwvRk9OVD48L0NFTlRFUj48L1REPjwvVFI+DQogICAgICAgIDxUUj4NCiAgICAg
ICAgICA8VEQ+DQogICAgICAgICAgICA8VEFCTEUgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0w
IGJvcmRlcj0wPg0KICAgICAgICAgICAgICA8VEJPRFk+DQogICAgICAgICAgICAgIDxUUj4NCiAg
ICAgICAgICAgICAgICA8VEQ+PEZPTlQgZmFjZT1hcmlhbCxzYW5zLXNlcmlmIGNvbG9yPWJsYWNr
IHNpemU9LTE+VGhlc2UgDQogICAgICAgICAgICAgICAgICBzZWFyY2ggdGVybXMgaGF2ZSBiZWVu
IGhpZ2hsaWdodGVkOiZuYnNwOzwvRk9OVD48L1REPg0KICAgICAgICAgICAgICAgIDxURCBiZ0Nv
bG9yPSNmZmZmNjY+PEI+PEZPTlQgZmFjZT1hcmlhbCxzYW5zLXNlcmlmIGNvbG9yPWJsYWNrIA0K
ICAgICAgICAgICAgICAgICAgc2l6ZT0tMT7YsdmK2YXYpyZuYnNwOzwvRk9OVD48L0I+PC9URD4N
CiAgICAgICAgICAgICAgICA8VEQgYmdDb2xvcj0jYTBmZmZmPjxCPjxGT05UIGZhY2U9YXJpYWws
c2Fucy1zZXJpZiBjb2xvcj1ibGFjayANCiAgICAgICAgICAgICAgICAgIHNpemU9LTE+2KfZhNis
2LHZgSZuYnNwOzwvRk9OVD48L0I+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT48L1REPjwvVFI+
PC9UQk9EWT48L1RBQkxFPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8SFI+DQoNCjxESVYg
c3R5bGU9IlBPU0lUSU9OOiByZWxhdGl2ZSI+DQo8TUVUQSBjb250ZW50PXRydWUgbmFtZT1NU1Nt
YXJ0VGFnc1ByZXZlbnRQYXJzaW5nPg0KPE1FVEEgY29udGVudD1CbG9nZ2VyIG5hbWU9Z2VuZXJh
dG9yPjxMSU5LIA0KdGl0bGU9IkNvbXB1dGVyIGluIEVkdWNhdGlvbiBhbmQgQ3VycmljdWx1bSBT
dHVkaWVzIC0gQXRvbSIgDQpocmVmPSJodHRwOi8vY29tcHV0ZXItaW4tZWR1Y2F0aW9uLmJsb2dz
cG90LmNvbS9mZWVkcy9wb3N0cy9kZWZhdWx0IiANCnR5cGU9YXBwbGljYXRpb24vYXRvbSt4bWwg
cmVsPWFsdGVybmF0ZT48TElOSyANCnRpdGxlPSJDb21wdXRlciBpbiBFZHVjYXRpb24gYW5kIEN1
cnJpY3VsdW0gU3R1ZGllcyAtIFJTUyIgDQpocmVmPSJodHRwOi8vY29tcHV0ZXItaW4tZWR1Y2F0
aW9uLmJsb2dzcG90LmNvbS9mZWVkcy9wb3N0cy9kZWZhdWx0P2FsdD1yc3MiIA0KdHlwZT1hcHBs
aWNhdGlvbi9yc3MreG1sIHJlbD1hbHRlcm5hdGU+PExJTksgDQp0aXRsZT0iQ29tcHV0ZXIgaW4g
RWR1Y2F0aW9uIGFuZCBDdXJyaWN1bHVtIFN0dWRpZXMgLSBBdG9tIiANCmhyZWY9Imh0dHA6Ly93
d3cuYmxvZ2dlci5jb20vZmVlZHMvMjg5MDM3NjkvcG9zdHMvZGVmYXVsdCIgDQp0eXBlPWFwcGxp
Y2F0aW9uL2F0b20reG1sIHJlbD1zZXJ2aWNlLnBvc3Q+PExJTksgdGl0bGU9UlNEIA0KaHJlZj0i
aHR0cDovL3d3dy5ibG9nZ2VyLmNvbS9yc2QuZz9ibG9nSUQ9Mjg5MDM3NjkiIHR5cGU9YXBwbGlj
YXRpb24vcnNkK3htbCANCnJlbD1FZGl0VVJJPjxMSU5LIHRpdGxlPSJDb21wdXRlciBpbiBFZHVj
YXRpb24gYW5kIEN1cnJpY3VsdW0gU3R1ZGllcyAtIEF0b20iIA0KaHJlZj0iaHR0cDovL2NvbXB1
dGVyLWluLWVkdWNhdGlvbi5ibG9nc3BvdC5jb20vZmVlZHMvNzAxOTUwODMyODY5MjI5NDcxMi9j
b21tZW50cy9kZWZhdWx0IiANCnR5cGU9YXBwbGljYXRpb24vYXRvbSt4bWwgcmVsPWFsdGVybmF0
ZT4NCjxTVFlMRSB0eXBlPXRleHQvY3NzPkBpbXBvcnQgdXJsKCBodHRwOi8vd3d3LmJsb2dnZXIu
Y29tL2Nzcy9ibG9nX2NvbnRyb2xzLmNzcyApOw0KQGltcG9ydCB1cmwoIGh0dHA6Ly93d3cuYmxv
Z2dlci5jb20vZHluLWNzcy9hdXRob3JpemF0aW9uLmNzcz9ibG9nSUQ9Mjg5MDM3NjkgKTsNCjwv
U1RZTEU+DQoNCjxTVFlMRSB0eXBlPXRleHQvY3NzPkJPRFkgew0KCUJPUkRFUi1SSUdIVDogMHB4
OyBQQURESU5HLVJJR0hUOiAwcHg7IEJPUkRFUi1UT1A6IDBweDsgUEFERElORy1MRUZUOiAwcHg7
IEJBQ0tHUk9VTkQ6IHVybChodHRwOi8vd3d3LmJsb2dibG9nLmNvbS9tb3RvX21zL291dGVyd3Jh
cC5naWYpICNkN2IgcmVwZWF0LXkgY2VudGVyIHRvcDsgUEFERElORy1CT1RUT006IDBweDsgTUFS
R0lOOiAwcHg7IEZPTlQ6IHNtYWxsIHRhaG9tYSwgIkJpdHN0cmVhbSBWZXJhIFNhbnMiLCAiVHJl
YnVjaGV0IE1TIiwgIkx1Y2lkYSBHcmFuZGUiLCBsdWNpZGEsIGhlbHZldGljYSwgc2Fucy1zZXJp
ZjsgQk9SREVSLUxFRlQ6IDBweDsgQ09MT1I6ICM1NTU7IFBBRERJTkctVE9QOiAwcHg7IEJPUkRF
Ui1CT1RUT006IDBweDsgVEVYVC1BTElHTjogY2VudGVyDQp9DQpJTUcgew0KCUJPUkRFUi1SSUdI
VDogMHB4OyBCT1JERVItVE9QOiAwcHg7IERJU1BMQVk6IGJsb2NrOyBCT1JERVItTEVGVDogMHB4
OyBCT1JERVItQk9UVE9NOiAwcHgNCn0NCg0KQG1lZGlhIEFsbCAgICANCnsNCiN3cmFwcGVyIHsN
CglCT1JERVItUklHSFQ6IDBweDsgUEFERElORy1SSUdIVDogMHB4OyBCT1JERVItVE9QOiAwcHg7
IFBBRERJTkctTEVGVDogMHB4OyBGT05ULVNJWkU6IDkwJTsgQkFDS0dST1VORDogdXJsKGh0dHA6
Ly93d3cuYmxvZ2Jsb2cuY29tL21vdG9fbXMvaW5uZXJ3cmFwLmdpZikgI2ZmZiByZXBlYXQteSBy
aWdodCB0b3A7IFBBRERJTkctQk9UVE9NOiAwcHg7IE1BUkdJTjogMHB4IGF1dG87IEJPUkRFUi1M
RUZUOiAwcHg7IFdJRFRIOiA2OTBweDsgUEFERElORy1UT1A6IDBweDsgQk9SREVSLUJPVFRPTTog
MHB4OyBURVhULUFMSUdOOiBsZWZ0DQp9DQoNCn0NCg0KQG1lZGlhIEhhbmRoZWxkICAgIA0Kew0K
I3dyYXBwZXIgew0KCVdJRFRIOiA5MCUNCn0NCiAgICB9DQojYmxvZy1oZWFkZXIgew0KCUJPUkRF
Ui1SSUdIVDogMHB4OyBQQURESU5HLVJJR0hUOiAwcHg7IEJPUkRFUi1UT1A6IDBweDsgUEFERElO
Ry1MRUZUOiAwcHg7IEJBQ0tHUk9VTkQ6IHVybChodHRwOi8vd3d3LmJsb2dibG9nLmNvbS9tb3Rv
X21zL2hlYWRib3Rib3JkZXIuZ2lmKSAjZThiIHJlcGVhdC14IGxlZnQgYm90dG9tOyBQQURESU5H
LUJPVFRPTTogMTVweDsgTUFSR0lOOiAwcHggYXV0bzsgQk9SREVSLUxFRlQ6IDBweDsgQ09MT1I6
ICNmZWY7IFBBRERJTkctVE9QOiAwcHg7IEJPUkRFUi1CT1RUT006IDBweA0KfQ0KI2Jsb2ctaGVh
ZGVyIEgxIHsNCglQQURESU5HLVJJR0hUOiAyMHB4OyBCQUNLR1JPVU5ELVBPU0lUSU9OOiBsZWZ0
IHRvcDsgUEFERElORy1MRUZUOiAyMHB4OyBGT05ULVNJWkU6IDI0cHg7IEJBQ0tHUk9VTkQtSU1B
R0U6IHVybChodHRwOi8vd3d3LmJsb2dibG9nLmNvbS9tb3RvX21zL3RvcHBlci5naWYpOyBQQURE
SU5HLUJPVFRPTTogMHB4OyBNQVJHSU46IDBweDsgUEFERElORy1UT1A6IDE1cHg7IEJBQ0tHUk9V
TkQtUkVQRUFUOiByZXBlYXQteDsgVEVYVC1BTElHTjogbGVmdA0KfQ0KI2Jsb2ctaGVhZGVyIFAg
ew0KCVBBRERJTkctUklHSFQ6IDIwcHg7IFBBRERJTkctTEVGVDogMjBweDsgRk9OVC1TSVpFOiAx
MTAlOyBQQURESU5HLUJPVFRPTTogMTBweDsgTUFSR0lOOiAwcHg7IExJTkUtSEVJR0hUOiAxNDAl
OyBQQURESU5HLVRPUDogM3B4OyBURVhULUFMSUdOOiBsZWZ0DQp9DQojY29udGVudCB7DQoJUEFE
RElORy1SSUdIVDogMjBweDsgUEFERElORy1MRUZUOiAyMHB4OyBQQURESU5HLUJPVFRPTTogMHB4
OyBQQURESU5HLVRPUDogMHB4DQp9DQoNCkBtZWRpYSBBbGwgICAgDQp7DQojbWFpbiB7DQoJRkxP
QVQ6IGxlZnQ7IFdJRFRIOiA0MDBweA0KfQ0KI3NpZGViYXIgew0KCUZMT0FUOiByaWdodDsgV0lE
VEg6IDIyNnB4DQp9DQoNCn0NCg0KQG1lZGlhIEhhbmRoZWxkICAgIA0Kew0KI21haW4gew0KCUZM
T0FUOiBub25lOyBXSURUSDogMTAwJQ0KfQ0KI3NpZGViYXIgew0KCUZMT0FUOiBub25lOyBXSURU
SDogMTAwJQ0KfQ0KICAgIH0NCiNmb290ZXIgew0KCUNMRUFSOiBsZWZ0OyBCT1JERVItUklHSFQ6
IDBweDsgUEFERElORy1SSUdIVDogMjBweDsgQk9SREVSLVRPUDogI2Y5ZjlmOSAxcHggc29saWQ7
IFBBRERJTkctTEVGVDogMjBweDsgUEFERElORy1CT1RUT006IDBweDsgTUFSR0lOOiAwcHg7IEJP
UkRFUi1MRUZUOiAwcHg7IFBBRERJTkctVE9QOiAwcHg7IEJPUkRFUi1CT1RUT006IDBweDsgQkFD
S0dST1VORC1DT0xPUjogI2ZkZmRmZDsgVEVYVC1BTElHTjogbGVmdA0KfQ0KI2Zvb3RlciBQIHsN
CglQQURESU5HLVJJR0hUOiAwcHg7IFBBRERJTkctTEVGVDogMHB4OyBGT05ULVNJWkU6IHgtc21h
bGw7IFBBRERJTkctQk9UVE9NOiAxMHB4OyBNQVJHSU46IDBweDsgQ09MT1I6ICM5OTk7IFBBRERJ
TkctVE9QOiAxMHB4OyBCQUNLR1JPVU5ELUNPTE9SOiB0cmFuc3BhcmVudDsgVEVYVC1BTElHTjog
bGVmdA0KfQ0KQTpsaW5rIHsNCglGT05ULVdFSUdIVDogYm9sZDsgQkFDS0dST1VORDogbm9uZSB0
cmFuc3BhcmVudCBzY3JvbGwgcmVwZWF0IDAlIDAlOyBDT0xPUjogI2MyODsgVEVYVC1ERUNPUkFU
SU9OOiBub25lDQp9DQpBOnZpc2l0ZWQgew0KCUZPTlQtV0VJR0hUOiBib2xkOyBCQUNLR1JPVU5E
OiBub25lIHRyYW5zcGFyZW50IHNjcm9sbCByZXBlYXQgMCUgMCU7IENPTE9SOiAjYzI4OyBURVhU
LURFQ09SQVRJT046IG5vbmUNCn0NCkE6aG92ZXIgew0KCUZPTlQtV0VJR0hUOiBib2xkOyBCQUNL
R1JPVU5EOiBub25lIHRyYW5zcGFyZW50IHNjcm9sbCByZXBlYXQgMCUgMCU7IENPTE9SOiAjZThi
OyBURVhULURFQ09SQVRJT046IHVuZGVybGluZQ0KfQ0KQTphY3RpdmUgew0KCUZPTlQtV0VJR0hU
OiBib2xkOyBCQUNLR1JPVU5EOiBub25lIHRyYW5zcGFyZW50IHNjcm9sbCByZXBlYXQgMCUgMCU7
IENPTE9SOiAjYzI4OyBURVhULURFQ09SQVRJT046IG5vbmUNCn0NCiNtYWluIFAgew0KCU1BUkdJ
Ti1UT1A6IDVweDsgTUFSR0lOLUJPVFRPTTogMWVtOyBMSU5FLUhFSUdIVDogMTQwJQ0KfQ0KI3Np
ZGViYXIgUCB7DQoJTUFSR0lOLVRPUDogNXB4OyBNQVJHSU4tQk9UVE9NOiAxZW07IExJTkUtSEVJ
R0hUOiAxNDAlDQp9DQoucG9zdC1ib2R5IHsNCglMSU5FLUhFSUdIVDogMTQwJQ0KfQ0KSDIgew0K
CVBBRERJTkctUklHSFQ6IDBweDsgUEFERElORy1MRUZUOiAwcHg7IFBBRERJTkctQk9UVE9NOiAw
cHg7IE1BUkdJTjogMjVweCAwcHggMHB4OyBQQURESU5HLVRPUDogMHB4DQp9DQpIMyB7DQoJUEFE
RElORy1SSUdIVDogMHB4OyBQQURESU5HLUxFRlQ6IDBweDsgUEFERElORy1CT1RUT006IDBweDsg
TUFSR0lOOiAyNXB4IDBweCAwcHg7IFBBRERJTkctVE9QOiAwcHgNCn0NCkg0IHsNCglQQURESU5H
LVJJR0hUOiAwcHg7IFBBRERJTkctTEVGVDogMHB4OyBQQURESU5HLUJPVFRPTTogMHB4OyBNQVJH
SU46IDI1cHggMHB4IDBweDsgUEFERElORy1UT1A6IDBweA0KfQ0KSDUgew0KCVBBRERJTkctUklH
SFQ6IDBweDsgUEFERElORy1MRUZUOiAwcHg7IFBBRERJTkctQk9UVE9NOiAwcHg7IE1BUkdJTjog
MjVweCAwcHggMHB4OyBQQURESU5HLVRPUDogMHB4DQp9DQpIMiB7DQoJRk9OVC1TSVpFOiBsYXJn
ZQ0KfQ0KSDMucG9zdC10aXRsZSB7DQoJTUFSR0lOLVRPUDogNXB4OyBGT05ULVNJWkU6IG1lZGl1
bQ0KfQ0KVUwgew0KCU1BUkdJTjogMHB4IDBweCAyNXB4DQp9DQpMSSB7DQoJTElORS1IRUlHSFQ6
IDE2MCUNCn0NCiNzaWRlYmFyIFVMIHsNCglQQURESU5HLUxFRlQ6IDEwcHg7IFBBRERJTkctVE9Q
OiAzcHgNCn0NCiNzaWRlYmFyIFVMIExJIHsNCglQQURESU5HLVJJR0hUOiAwcHg7IExJU1QtU1RZ
TEU6IGRpc2MgdXJsKGh0dHA6Ly93d3cuYmxvZ2Jsb2cuY29tL21vdG9fbXMvZGlhbW9uZC5naWYp
IGluc2lkZTsgUEFERElORy1MRUZUOiAwcHg7IFBBRERJTkctQk9UVE9NOiAwcHg7IE1BUkdJTjog
MHB4OyBWRVJUSUNBTC1BTElHTjogdG9wOyBQQURESU5HLVRPUDogMHB4DQp9DQpETC5wcm9maWxl
LWRhdGFibG9jayB7DQoJTUFSR0lOOiAzcHggMHB4IDVweA0KfQ0KREwucHJvZmlsZS1kYXRhYmxv
Y2sgREQgew0KCUxJTkUtSEVJR0hUOiAxNDAlDQp9DQoucHJvZmlsZS1pbWcgew0KCURJU1BMQVk6
IGlubGluZQ0KfQ0KLnByb2ZpbGUtaW1nIElNRyB7DQoJQk9SREVSLVJJR0hUOiAjZThiIDRweCBz
b2xpZDsgQk9SREVSLVRPUDogI2U4YiA0cHggc29saWQ7IEZMT0FUOiBsZWZ0OyBNQVJHSU46IDBw
eCAxMHB4IDVweCAwcHg7IEJPUkRFUi1MRUZUOiAjZThiIDRweCBzb2xpZDsgQk9SREVSLUJPVFRP
TTogI2U4YiA0cHggc29saWQNCn0NCiNjb21tZW50cyB7DQoJQk9SREVSLVJJR0hUOiAwcHg7IFBB
RERJTkctUklHSFQ6IDBweDsgQk9SREVSLVRPUDogI2VlZCAxcHggZGFzaGVkOyBQQURESU5HLUxF
RlQ6IDBweDsgUEFERElORy1CT1RUT006IDBweDsgTUFSR0lOOiAxMHB4IDBweCAwcHg7IEJPUkRF
Ui1MRUZUOiAwcHg7IFBBRERJTkctVE9QOiAwcHg7IEJPUkRFUi1CT1RUT006IDBweA0KfQ0KI2Nv
bW1lbnRzIEgzIHsNCglNQVJHSU4tVE9QOiAxMHB4OyBGT05ULVdFSUdIVDogbm9ybWFsOyBNQVJH
SU4tQk9UVE9NOiAtMTBweDsgVEVYVC1UUkFOU0ZPUk06IHVwcGVyY2FzZTsgRk9OVC1TVFlMRTog
aXRhbGljOyBMRVRURVItU1BBQ0lORzogMXB4DQp9DQojY29tbWVudHMgREwgRFQgew0KCVBBRERJ
TkctUklHSFQ6IDBweDsgTUFSR0lOLVRPUDogMzVweDsgUEFERElORy1MRUZUOiAxOHB4OyBGT05U
LVdFSUdIVDogYm9sZDsgQkFDS0dST1VORDogdXJsKGh0dHA6Ly93d3cuYmxvZ2Jsb2cuY29tL21v
dG9fbXMvY29tbWVudGJ1Zy5naWYpIG5vLXJlcGVhdCBsZWZ0IHRvcDsgUEFERElORy1CT1RUT006
IDBweDsgQ09MT1I6ICNhYWE7IFBBRERJTkctVE9QOiAxcHg7IEZPTlQtU1RZTEU6IGl0YWxpYw0K
fQ0KI2NvbW1lbnRzIERMIEREIHsNCglQQURESU5HLVJJR0hUOiAwcHg7IFBBRERJTkctTEVGVDog
MHB4OyBQQURESU5HLUJPVFRPTTogMHB4OyBNQVJHSU46IDBweDsgUEFERElORy1UT1A6IDBweA0K
fQ0KLmRlbGV0ZWQtY29tbWVudCB7DQoJQ09MT1I6IGdyYXk7IEZPTlQtU1RZTEU6IGl0YWxpYw0K
fQ0KI2Jsb2dmZWVkcyB7DQoJDQp9DQojcG9zdGZlZWRzIHsNCgkNCn0NCjwvU1RZTEU+DQo8IS0t
IC0tPg0KPFNUWUxFIHR5cGU9dGV4dC9jc3M+QGltcG9ydCB1cmwoIGh0dHA6Ly93d3cuYmxvZ2dl
ci5jb20vY3NzL25hdmJhci9jbGFzc2ljLmNzcyApOw0KRElWLmItbW9iaWxlIHsNCglESVNQTEFZ
OiBub25lDQp9DQo8L1NUWUxFPg0KPElGUkFNRSBpZD1uYXZiYXItaWZyYW1lIG1hcmdpbldpZHRo
PTAgbWFyZ2luSGVpZ2h0PTAgDQpzcmM9Imh0dHA6Ly93d3cuYmxvZ2dlci5jb20vbmF2YmFyLmc/
dGFyZ2V0QmxvZ0lEPTI4OTAzNzY5JmFtcDtibG9nTmFtZT1Db21wdXRlcitpbitFZHVjYXRpb24r
YW5kK0N1cnJpY3VsdW0rLi4uJmFtcDtwdWJsaXNoTW9kZT1QVUJMSVNIX01PREVfQkxPR1NQT1Qm
YW1wO25hdmJhclR5cGU9VEFOJmFtcDtsYXlvdXRUeXBlPUNMQVNTSUMmYW1wO2hvbWVwYWdlVXJs
PWh0dHAlM0ElMkYlMkZjb21wdXRlci1pbi1lZHVjYXRpb24uYmxvZ3Nwb3QuY29tJTJGJmFtcDtz
ZWFyY2hSb290PWh0dHAlM0ElMkYlMkZjb21wdXRlci1pbi1lZHVjYXRpb24uYmxvZ3Nwb3QuY29t
JTJGc2VhcmNoIiANCmZyYW1lQm9yZGVyPTAgd2lkdGg9IjEwMCUiIHNjcm9sbGluZz1ubyBoZWln
aHQ9MzA+PC9JRlJBTUU+DQo8RElWIGlkPXNwYWNlLWZvci1pZT48L0RJVj48IS0tIEJlZ2luIHdy
YXBwZXIgLS0+DQo8RElWIGlkPXdyYXBwZXI+DQo8RElWIGlkPWJsb2ctaGVhZGVyPg0KPEgxPjxB
IGhyZWY9Imh0dHA6Ly9jb21wdXRlci1pbi1lZHVjYXRpb24uYmxvZ3Nwb3QuY29tLyI+Q29tcHV0
ZXIgaW4gRWR1Y2F0aW9uIA0KYW5kIEN1cnJpY3VsdW0gU3R1ZGllcyA8L0E+PC9IMT4NCjxQPlRo
aXMgU2l0ZSBkZXNpZ25lZCBieSBEci4gSWJyYWhpbSBTdWxpbWFuIEFobWVkIE11a2h0YXIgQXNo
bWFpcSANCjI1LzUvMjAwNjwvUD48L0RJVj48IS0tIEJlZ2luIGNvbnRlbnQgLS0+DQo8RElWIGlk
PWNvbnRlbnQ+PCEtLSBCZWdpbiBtYWluIGNvbHVtbiAtLT4NCjxESVYgaWQ9bWFpbj4NCjxIMiBj
bGFzcz1kYXRlLWhlYWRlcj5GcmlkYXksIEFwcmlsIDEzLCAyMDA3PC9IMj48IS0tIEJlZ2luIC5w
b3N0IC0tPg0KPERJViBjbGFzcz1wb3N0PjxBIG5hbWU9NzAxOTUwODMyODY5MjI5NDcxMj48L0E+
DQo8SDMgY2xhc3M9cG9zdC10aXRsZT48QSB0aXRsZT0iZXh0ZXJuYWwgbGluayIgDQpocmVmPSJo
dHRwOi8vY29tcHV0ZXItaW4tZWR1Y2F0aW9uLmJsb2dzcG90LmNvbS8iPkludHJvZHVjdGlvbiB0
byBDb21wdXRlciANCkFzc2lzdGVkIExhbmd1YWdlIExlYXJuaW5nIChpbiBBcmFiaWMpIERlc2ln
bmVkIGJ5IERSLiBJQlJBSElNIFNVTElNQU4gQUhNRUQgDQpBU0hNQUlRIDwvQT48L0gzPg0KPERJ
ViBjbGFzcz1wb3N0LWJvZHk+DQo8UD4NCjxESVYgc3R5bGU9IkNMRUFSOiBib3RoIj48L0RJVj48
U1BBTiBzdHlsZT0iQ09MT1I6IHJnYig1MSw1MSwyNTUpIj4NCjxESVYgYWxpZ249cmlnaHQ+PEJS
PjxCUj48U1BBTiBzdHlsZT0iRk9OVC1TSVpFOiAxODAlIj48U1BBTiANCnN0eWxlPSJGT05ULUZB
TUlMWTogYXJpYWwiPjxTUEFOIHN0eWxlPSJDT0xPUjogcmdiKDI1NSwxNTMsMjU1KSI+PFNQQU4g
DQpzdHlsZT0iQ09MT1I6IHJnYigyNTUsMCwwKSI+MS08L1NQQU4+IDwvU1BBTj48U1BBTiANCnN0
eWxlPSJDT0xPUjogcmdiKDI1NSwwLDApIj7ZhdmC2K/ZhdipINi52YYg2KfZhNio2K3YqzwvU1BB
Tj48QlI+PEJSPtil2YbZkdmOINmF2YrYr9in2YYg2KrYudmE2YrZhSDYp9mE2YTYutipIA0K2KfZ
hNi52LHYqNmK2Kkg2KjZhdiz2KfYudiv2Kkg2KfZhNit2KfYs9mI2Kgg2YrZg9in2K8g2YrYrtmE
2Ygg2YXZhiDZg9iq2Kgg2KrYudmE2YrZhSDYp9mE2YTYutipINio2YXYs9in2LnYr9ipINin2YTY
rdin2LPZiNioINmI2YPYsNmE2YMg2KrZg9in2K8gDQrYqtiu2YTZiCDYp9mE2YXZg9iq2KjYqSDY
p9mE2LnYsdio2YrYqSDZhdmGINin2YTZg9iq2Kgg2YjYp9mE2KjYrdmI2Ksg2KfZhNiq2Yog2KrZ
h9iq2YUg2KjYudmE2YXYp9ihINmI2KjYqti52YTZitmFINin2YTZhNi62Kkg2KjZhdiz2KfYudiv
2KkgDQrYp9mE2K3Yp9iz2YjYqCDZiNmF2KzZh9mI2K/Yp9iq2YfZhSDZhdmGINij2YbYtNi32Kkg
2YTYutmI2YrYqSDZiNmF2YLYp9mE2KfYqiDZiNmF2KzZhNin2Kog2YjZhdi02KfYsdmD2Kkg2YHZ
iiDYp9mE2YXYpNiq2YXYsdin2Kog2YjZg9iq2KggDQrZiNiq2LXZhdmK2YUg2YXZhtin2YfYrCDZ
iNiq2LXZhdmK2YUg2LXZgdit2KfYqiDZhNi62YjZitipINmI2LrZitix2YfYp9iMINmI2LnZhNmK
2Ycg2YLYsdixINin2YTZhdik2YTZgSDYo9mGINmK2KPYqtmKINmB2Yog2YfYsNinINin2YTZg9iq
2KfYqCANCtio2YbZgtin2Lcg2YXYrtiq2LXYsdipINi52YYg2KPZiNmE2KbZgyDYp9mE2LnZhNmF
2KfYoSDYp9mE2KPYrNmE2KfYoS4g2YjYsdmD2LIg2KfZhNmF2KTZhNmBINi52YTZiSDZhdis2YfZ
iNiv2KfYqiDYo9mI2YTYptmDINin2YTYudmE2YXYp9ihINmF2YYgDQrZg9iq2Kgg2YjZhdis2YTY
p9iqINmI2YXZgtin2YTYp9iqINmI2YXYpNiq2YXYsdin2Kog2YjYo9mB2YPYp9ixINmI2YbYuNix
2YrYp9iqINmI2LrZitix2YfYpyDZhdmGINij2YbYtNi32Kkg2KPZg9in2K/ZitmF2YrYqS4g2YHZ
gtivINi12YXZhSANCtin2YTZhdik2YTZgSDYp9iz2KrYqNmK2KfZhtin2Ysg2YXZhiDYo9it2K/Z
jiDYudi02LHZjti52YbYtdix2KfZiyDZiNij2LHYs9mE2Ycg2KXZhNmJINi52YTZhdin2KEg2KrY
udmE2YrZhSDYp9mE2YTYutipINio2YXYs9in2LnYr9ipINin2YTYrdin2LPZiNioIA0K2YHZiiDY
p9mE2LnYp9mE2YUg2YTZitiz2KrZh9iv2Yog2KjYo9mB2YPYp9ix2YfZhSDZgdmKINiq2LXZhdmK
2YUg2YfYsNinINin2YTZg9iq2KfYqCDZiNmF2YjYttmI2LnYp9iq2YcuINmI2YLYryDYo9is2KfY
qCDYqNi52LYg2YXZhiANCtin2YTYudmE2YXYp9ihINmF2LTZg9mI2LHZitmGINmF2YYg2KjYsdmK
2LfYp9mG2YrYp9iMINij2YXYsdmK2YPYpyDZiNij2LPYqtix2KfZhNmK2Kcg2YjYp9mE2YrYp9io
2KfZhtiMINmI2YPZiNix2YrYpyDYp9mE2KzZhtmI2KjZitip2IwgDQrZiNmF2KfZhNmK2LLZitin
2Iwg2YjZhtmK2YjYstmE2KfZhtivINmI2KfZhNiv2YjZhCDYp9mE2LnYsdio2YrYqSDZiNij2YPY
r9mI2Kcg2LnZhNmJINij2YfZhdmK2Kkg2YPYqtin2Kgg2KjYp9mE2YTYutipINin2YTYudix2KjZ
itipINmK2KrYrdiv2Ksg2LnZhiANCtiq2LnZhNmK2YUg2KfZhNmE2LrYqSDYqNmF2LPYp9i52K/Y
qSDYp9mE2K3Yp9iz2YjYqNiMINmI2LDZhNmDINmE2YLZhNipPEJSPtmF2KvZhCDZh9iw2Ycg2KfZ
hNmD2KrYqCDYqNin2YTZhNi62Kkg2KfZhNi52LHYqNmK2KnYjCDYqNmEINij2YYgDQrYo9it2K/Z
h9mFINij2LTYp9ixINio2KPZhtmR2Y4g2YTZhyDYt9mE2KfYqCDYudix2Kgg2YLYryDZitiz2KrZ
gdmK2K/ZiNmGINmF2YYg2YfYsNinINin2YTZg9iq2KfYqCDZiNmH2LDYpyDZhdinINit2K/YpyDY
qNin2YTYqNin2K3YqyDZg9iq2KfYqNipIA0K2YfYsNinINin2YTZg9iq2KfYqCDYqNin2YTZhNi6
2Kkg2KfZhNi52LHYqNmK2KkgLiDZg9mF2Kcg2KPYr9mE2Ykg2KfZhNi52YTZhdin2KEg2KjYotix
2KfYptmH2YUg2KfZhNmG2YrYsdipINmB2Yog2LnYr9ipINmF2YjYttmI2LnYp9iqINmF2YbZh9in
IA0K2KrYudmE2YrZhSDYp9mE2YTYutipINio2YXYs9in2LnYr9ipINin2YTYrdin2LPZiNioINmB
2Yog2KfZhNmF2KfYttmKINmI2YHZiiDYp9mE2K3Yp9i22LEg2YjZgdmKINin2YTZhdiz2KrZgtio
2YTYjCDZiNiq2K/YsdmK2Kgg2KfZhNmF2LnZhNmFIA0K2YjYp9mE2KjYrdirINmB2Yog2K3ZgtmE
INiq2LnZhNmK2YUg2KfZhNmE2LrYqSDYqNmF2LPYp9i52K/YqSDYp9mE2K3Yp9iz2YjYqCDZiNiq
2LXZhdmK2YUg2KjYsdin2YXYrCDYqti52YTZitmFINin2YTZhNi62Kkg2KjZhdiz2KfYudiv2Kkg
DQrYp9mE2K3Yp9iz2YjYqCDZiNiq2LnZhNmK2YUg2KfZhNmE2LrYqSDYqNmF2LPYp9i52K/YqSDY
p9mE2K3Yp9iz2YjYqCDZgdmKINiv2YjZhCDYp9mE2LnYp9mE2YUg2KfZhNir2KfZhNirINmI2LrZ
itix2Ycg2YXZhiDZhdmI2LbZiNi52KfYqi4g2YjZgtivIA0K2KPYqNiv2Ykg2YPYq9mK2LEg2YXZ
hiDYp9mE2LnZhNmF2KfYoSDZhdmGINij2YXYsdmK2YPYpyDZiNmF2KfZhNmK2LLZitinINin2YTY
sdi62KjYqSDZgdmKINin2YTYp9i02KrYsdin2YMg2YHZiiDZh9iw2KcgDQrYp9mE2YXYtNix2YjY
uS48QlI+PEJSPtmI2YTZgtivINiq2YbYp9mI2YQg2KfZhNmD2KrYp9ioINi52K/YqSDYudmE2YXY
p9ihINmF2YYg2YXYrtiq2YTZgSDYqNmC2KfYuSDYp9mE2LnYp9mE2YUg2YXZhiDYo9iz2KrYsdin
2YTZitinIA0K2YjYo9mF2LHZitmD2Kcg2YjYqNix2YrYt9in2YbZitinINmI2YPZhtiv2Kcg2YjZ
hdin2YTZitiy2YrYpyDZiNin2YTZitin2KjYp9mGINmI2KjZiNmE2YbYr9inINmI2KfZhNiv2YbZ
hdin2LHZgyDZiNiz2YbYutin2YHZiNix2Kkg2YjYp9mE2K/ZiNmEIA0K2KfZhNi52LHYqNmK2Kkg
2YjYutmK2LHZh9inLiDZiNio2K/YoyDYp9mE2YXYpNmE2YEg2KfZhNmD2KrYp9ioINmH2LDYpyDY
qNiq2K3ZhNmK2YQg2KfZhNin2LPYqtio2YrYp9mGINmE2YXYudix2YHYqSDYotix2KfYoSDYp9mE
2LnZhNmF2KfYoSDZgdmKIA0K2YXYrNin2YQg2KrYudmE2YrZhSDYp9mE2YTYutipINio2YXYs9in
2LnYr9ipINin2YTYrdin2LPZiNio2Iwg2KvZhSDYqtmG2KfZiNmEINin2YTZg9iq2KfYqCDYqtin
2LHZitiuINiq2LnZhNmK2YUg2KfZhNmE2LrYqSDYqNmF2LPYp9i52K/YqSANCtin2YTYrdin2LPZ
iNioINmI2KfZhNil2LfYp9ixINin2YTZhti42LHZiiDZhNmE2K3Yp9iz2YjYqCDZgdmKINin2YTY
qtix2KjZitipLiDZiNij2K/YsdisINin2YTZhdik2YTZgSDZgtin2KbZhdipINmE2KrZgtmI2YrZ
hSDYqNix2KfZhdisIA0K2KfZhNmE2LrYp9iqINio2YXYs9in2LnYr9ipINin2YTYrdin2LPZiNio
INi12YXZhdmH2Kcg2KfZhNmF2KTZhNmBINmG2YHYs9mH2Iwg2YPZhdinINin2YLYqtix2K0g2KfZ
hNmF2KTZhNmBINiq2LXZiNix2KfZiyDZhNmF2LnZhdmEINiq2LnZhNmK2YUgDQrYp9mE2YTYutin
2Kog2KjZhdiz2KfYudiv2Kkg2KfZhNit2KfYs9mI2Kgg2YjZg9iw2YTZgyDYp9mC2KrYsditINmF
2YbZh9is2KfZiyDZhNiq2LnZhNmK2YUg2KfZhNmE2LrYqSDYp9mE2LnYsdio2YrYqSDYqNmF2LPY
p9i52K/YqSDYp9mE2K3Yp9iz2YjYqC4gDQrZg9mF2Kcg2KrZhtin2YjZhCDYp9mE2YPYqtin2Kgg
2YXYrNmE2KfYqiDYqti52YTZitmFINin2YTZhNi62Kkg2KjZhdiz2KfYudiv2Kkg2KfZhNit2KfY
s9mI2Kgg2YXYq9mEINin2YTZhdis2YTYqSDYp9mE2LTZh9mK2LHYqSAiINiq2LnZhNmK2YUgDQrY
p9mE2YTYutipINmI2KfZhNiq2YLZhtmK2KkiINmI2LrZitix2YfYpyDZhdmGINmF2KzZhNin2Kog
2LnYp9mE2YXZitipINmF2LnYsdmI2YHYqSDZhNmD2YQg2YXYqtiq2KjYuSDZhNmH2LDYpyDYp9mE
2YHZhiDZiNmF2KTYqtmF2LHYp9iqINiq2LnZhNmK2YUgDQrYp9mE2YTYutipINio2YXYs9in2LnY
r9ipINin2YTYrdin2LPZiNioINmF2KvZhCDYp9mE2YXYpNiq2YXYsSDYp9mE2K/ZiNmE2Yog2YTY
qti52YTZitmFINin2YTZhNi62Kkg2KjZhdiz2KfYudiv2Kkg2KfZhNit2KfYs9mI2Kgg2KfZhNiw
2Yog2LnZgtivIA0K2KjYo9iz2KrYsdin2YTZitinINmB2Yog2LnYp9mFIDE5OTgg2KjYrNin2YXY
udipINmF2YTYqNmI2LHZhtiMINmI2YHZiiDZg9mG2K/YpyDZgdmKINi52KfZhSAyMDAzINmI2YHZ
iiAyMDA4IOKAkyDYpdmGINi02KfYoSANCtin2YTZhNmHLSDZgdmKINin2YTZitin2KjYp9mGLjxC
Uj48QlI+2YjZhdmGINin2YTYudmE2YXYp9ihINin2YTYsNmK2YYg2KrZhtin2YjZhNmH2YUg2YfY
sNinINin2YTYqNit2Ksg2YPYp9mE2KLYqtmK2Iwg2YHZhdmGIA0K2KPYs9iq2LHYp9mE2YrYpyDZ
g9in2YYg2KfZhNi52KfZhNmFINin2YTZg9io2YrYsSDYp9mE2YXYtNmH2YjYsSDZhdin2YrZg9mE
INmE2YrZgdmK2Iwg2KjZitiq2LEg2YjYp9mK2KrYjCDYo9mG2K/YsdmIINmE2YrYp9mG2Iwg2K/Z
itio2YjYsdinIA0K2YfZiNmB2YbYjCDYsdmI2KjYsdiqINiv2KjZitiz2YPZitiMINis2YrZiNmG
2Log2KjYp9mKINiz2YjZhtiMINmK2YjYtNmKINmB2YTZitmD2LPYjCDYqNix2YjZhtiMINmI2YXY
p9mK2YMg2LPZhdmK2KsuINmI2YXZhiDYo9mF2LHZitmD2KcgDQrYp9mE2LnYp9mE2YUg2KfZhNmD
2KjZitixINin2YTZhdi02YfZiNixINin2YTZgdiwINmI2KfYsdiz2LTZitix2Iwg2KfZhNi52KfZ
hNmF2Kkg2KfZhNis2YTZitmE2Kkg2KzYp9io2YTZhNmK2Iwg2LHZiNio2LHYqiDZgdmK2LTYsdiM
IA0K2LPYp9mE2YrYtNmK2LHZitiMINmH2YjYqNin2LHYr9iMINiv2YrYqNmI2LHYpyDZh9mK2YTZ
hNmK2Iwg2YPZhNin2YrYsSDYqNix2K/Yp9mG2Iwg2YPYp9ix2YTYpyDZhdiz2YPZitmE2Iwg2YHY
p9mG2LMg2KfYs9iq2YrZgdmGINmI2KzZitmGIA0K2YTZitmE2YjYqC4g2YjZhdmGINio2LHZiti3
2KfZhtmK2Kcg2KjYsdmI2YHYs9mI2LEg2YPZitirINmD2YXZitix2YjZhtiMINmC2LHYp9mH2KfZ
hSDYr9mK2YHYsyDZiNi62YrYsdmH2YXYpy4g2YjZhdmGINmF2KfZhNmK2LLZitinINmF2K3Zhdiv
IA0K2KfZhNij2YXZitmGINij2YXYqNmK2Iwg2KjYsdmI2YHYs9mI2LEg2YbZiNix2YrYrdin2YYg
2YXYp9iqINiv2KfYpNmI2K8g2YjYr9mD2KrZiNixINmG2YjYsdmK2LLYp9mGINi52KjYryDYp9mE
2LHYstin2YIg2YjYutmK2LHZh9mFLiDZiNmF2YYgDQrZg9mG2K/YpyDZg9mG2YrYsSDZiNmD2YbZ
itmK2LEuINmI2YXZhiDYp9mE2YrYp9io2KfZhiDYqNix2YjZgdiz2YjYsSDZg9in2LLZitmG2YjY
sdmKINmG2YjYstin2YjYpyDZiNmD2YrZhtis2Yog2YPZitiq2KfZiCDZiNmF2YYg2YfZiNmE2YbY
r9inIA0K2YPYsdin2KzYp9mD2KcuINmI2YXZhiDYp9mE2K/ZiNmEINin2YTYudix2KjZitipINio
2LHZiNmB2LPZiNixIDxCIA0Kc3R5bGU9IkNPTE9SOiBibGFjazsgQkFDS0dST1VORC1DT0xPUjog
I2ZmZmY2NiI+2LHZitmF2Kc8L0I+INi12K/ZiCA8QiANCnN0eWxlPSJDT0xPUjogYmxhY2s7IEJB
Q0tHUk9VTkQtQ09MT1I6ICNhMGZmZmYiPtin2YTYrNix2YE8L0I+INmI2KfZhNit2YjYsdmKIA0K
2YjYutmK2LHZh9mFLjxCUj48QlI+2YjYqNi52K8g2KPZhiDYrdmE2YQg2KfZhNmF2KTZhNmBINmH
2LDYpyDYp9mE2KfYs9iq2KjZitin2YYg2KfYqtio2Lkg2KXYsdi02KfYr9in2Kog2KfZhNi52YTZ
hdin2KEg2KfZhNij2KzZhNin2KEg2YHZiiANCtiq2YbZgdmK2LAg2YfYsNinINin2YTYqNit2Ksu
INmB2KzYp9ihINin2YTZhdik2YTZgSDYqNmF2YLYp9mE2KfYqiDYudiv2Kkg2LnZhiDYqti52YTZ
itmFINin2YTZhNi62Kkg2KjZhdiz2KfYudiv2Kkg2KfZhNit2KfYs9mI2Kgg2YbYuNix2YrYp9mL
IA0K2YjYudmF2YTZitin2Ysg2YjYrdmE2YTZh9inLiDZiNis2KfYoSDYp9mE2YXYpNmE2YEg2KjY
p9mE2LnZhNmF2KfYoSDYp9mE2KPZgdin2LbZhCDYp9mE2YXYtNmH2YjYsdmK2YYg2YjYp9mE2LDZ
itmGINmE2YfZhSDYqNin2Lkg2LfZiNmK2YQg2YHZiiANCtit2YLZhCAiINiq2LnZhNmK2YUg2KfZ
hNmE2LrYqSDYqNmF2LPYp9i52K/YqSDZiNmF2YbYp9mH2Kwg2KfZhNit2KfYs9mI2KgiLiDYo9i0
2KfYsSDYp9mE2YXYpNmE2YEg2KXZhNmJINmF2KzZh9mI2K/Yp9iqINij2YjZhNim2YMg2KfZhNi5
2YTZhdin2KEgDQrYp9mE2KPZg9in2K/ZitmF2YrYqSDZhdmGINmF2YLYp9mE2KfYqiDZiNmF2K3Y
p9i22LHYp9iqINmI2YjYsdi0INi52YXZhC4g2YjYrNin2KEg2KfZhNmF2KTZhNmBINio2YXYrNmE
2KfYqiAiINiq2LnZhNmK2YUg2KfZhNmE2LrYqSDYqNmF2LPYp9i52K/YqSANCtin2YTYrdin2LPZ
iNioIiDZiNmD2LDZhNmDINis2KfYoSDYqNmF2LnYp9mH2K8gIiDYqti52YTZitmFINin2YTZhNi6
2Kkg2KjZhdiz2KfYudiv2Kkg2KfZhNit2KfYs9mI2KgiINmI2YXZhti42YXYp9iqINmI2YXYpNiq
2YXYsdin2Kog2YjYsdmI2KfYqNi3IA0KIiDYqti52YTZitmFINin2YTZhNi62Kkg2KjZhdiz2KfY
udiv2Kkg2KfZhNit2KfYs9mI2KgiLiDZiNin2YLYqtix2K0g2KfZhNmF2KTZhNmBINiq2LXZiNix
2KfZiyDZhNmF2LnZhdmEICIg2KrYudmE2YrZhSDYp9mE2YTYutipINio2YXYs9in2LnYr9ipIA0K
2KfZhNit2KfYs9mI2KgiINmI2YPYsNmE2YMg2KrYtdmI2LHYp9mLINmE2YXZhtmH2KwiINiq2LnZ
hNmK2YUg2KfZhNmE2LrYqSDYqNmF2LPYp9i52K/YqSANCtin2YTYrdin2LPZiNioIi48QlI+PC9T
UEFOPjwvU1BBTj48U1BBTiANCnN0eWxlPSJDT0xPUjogcmdiKDI1NSwxNTMsMjU1KSI+PEJSPjwv
U1BBTj48U1BBTiANCnN0eWxlPSJDT0xPUjogcmdiKDI1NSwwLDApIj48U1BBTiBzdHlsZT0iRk9O
VC1TSVpFOiAxODAlOyBGT05ULUZBTUlMWTogYXJpYWwiPjItIA0K2LfYsdmK2YLYqSDYrNmF2Lkg
2KfZhNmF2LnZhNmI2YXYp9iqPC9TUEFOPjwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6
IDE4MCU7IEZPTlQtRkFNSUxZOiBhcmlhbCI+OjxCUj48QlI+2YTZgtivINij2LHYs9mEINmF2KTZ
hNmBINmH2LDYpyDYp9mE2YPYqtin2KggDQrYp9iz2KrYqNmK2KfZhtin2YsgKNin2YbYuNixINin
2YTYp9iz2KrYqNmK2KfZhi0g2KfZhNmF2YTYrdmCINin2YTYo9mI2YQpINmE2KjYudi2INin2YTY
rtio2LHYp9ihINmB2Yog2YXYrNin2YQg2KrYudmE2YrZhSDYp9mE2YTYutipIA0K2KjZhdiz2KfY
udiv2Kkg2KfZhNit2KfYs9mI2Kgg2LPYp9im2YTYp9mLINi52YYg2KjYudi2INin2YTZhdmI2LbZ
iNi52KfYqiDYp9mE2KrZiiDZitix2Ykg2YrYrNioINij2YYg2YrYqti22YXZhtmH2Kcg2KfZhNmD
2KrYp9ioLiDZiNmE2YLYryANCtij2KzYp9ioINio2LnYtiDZhdmG2YfZhSDZhdi02YPZiNix2KfZ
iyDZiNmF2YbZh9mFINmF2YYg2KjYp9iv2LEg2KjYqtmC2K/ZitmFINin2YTZhdiz2KfYudiv2Kkg
2YHYrNin2KHYqiDYp9mE2KXYrNin2KjYp9iqINmF2YYg2LnYr9ipINiv2YjZhCIgDQrZhdin2YTZ
itiy2YrYp9iMINij2LPYqtix2KfZhNmK2KfYjCDYp9mE2YrYp9io2KfZhtiMINij2YXYsdmK2YPY
p9iMINmI2YPZiNix2YrYpyDYp9mE2KzZhtmI2KjZitip2Iwg2YjZhtmK2YjYstmE2KfZhtivIiDZ
iNi62YrYsdmH2Kcg2YXZhiDYr9mI2YQuIA0K2YjYp9mE2KLZhiDYudiy2YrYstmKINin2YTZgtin
2LHYpiDYr9i52YbYpyDZhtiv2YTZgSDYpdmE2Ykg2LnZhtin2LXYsSDYsNmE2YMg2KfZhNin2LPY
qtio2YrYp9mGINmI2KrZhNmD2YUgDQrYp9mE2KXYrNin2KjYp9iqOjxCUj48QlI+PC9TUEFOPjxT
UEFOIHN0eWxlPSJGT05ULVNJWkU6IDE4MCUiPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBh
cmlhbCI+PFNQQU4gc3R5bGU9IkNPTE9SOiByZ2IoMjU1LDAsMCkiPjEtINin2YTYudmG2LXYsSAN
Ctin2YTYo9mI2YQ8QlI+2YfZhCDYqti52KrZgtivINij2YbZhyDZhdmGINin2YTZhdmH2YUg2YPY
qtin2KjYqSDZg9iq2KfYqCDYudmGINiq2LnZhNmK2YUg2KfZhNmE2LrYqSDYqNmF2LPYp9i52K/Y
qSDYp9mE2K3Yp9iz2YjYqCDYqNin2YTZhNi62KkgDQrYp9mE2LnYsdio2YrYqdifINmC2KfYsdmG
INmH2LDYpyDYp9mE2LnZhti12LEg2KjYp9mE2LnZhti12LEg2KfZhNiz2KfYr9izPEJSPjwvU1BB
Tj48QlI+2KPZg9mR2Y7Yr9mOINis2YXZiti5INmF2YYg2KPYrNin2Kgg2YXZhiANCtin2YTYudmE
2YXYp9ihINin2YTYo9is2YTYp9ihINio2KPZhtmHINmF2YYg2KfZhNij2YfZhdmK2Kkg2KjZhdmD
2KfZhiDZg9iq2KfYqNipINmF2KvZhCDZh9iw2Kcg2KfZhNmD2KrYp9ioINmI2KXZhNmK2YMg2KjY
udi2INin2YTYqti52YTZitmC2KfYqtiMIA0K2YHZgtivINij2LTYp9ixINin2YTYrtio2YrYsSDY
p9mE2KPZiNmEINio2YLZiNmE2Ycg2KPZhtmHINmF2YYg2KfZhNmF2YHZitivINmD2KrYp9io2Kkg
2YPYqtin2Kgg2YXYq9mEINmH2LDYpyDYp9mE2YPYqtin2Kgg2KjYp9mE2YTYutipIA0K2KfZhNi5
2LHYqNmK2KnYjCDZiNin2YTYq9in2YbZiiDYo9is2KfYqCDYqNmG2LnZhSDZhdmGINin2YTZhdmH
2YUg2YPYqtin2KjYqSDZg9iq2KfYqNiMINmI2YTZg9mGINix2KjZhdinINiq2K3Yqtin2Kwg2KXZ
hNmJINmB2LHZitmCINmF2YYgDQrYudmE2YXYp9ihINiq2LnZhNmK2YUg2KfZhNmE2LrYqSDYqNmF
2LPYp9i52K/YqSDYp9mE2K3Yp9iz2YjYqC4g2LrZitixINij2YbZkdmOINin2YTZhdik2YTZgSDY
qNit2Ksg2LnZhdmGINmK2LnZitmG2Ycg2YXZhiDYp9mE2LnZhNmF2KfYoSANCtin2YTYudix2Kgg
2YjYp9mD2KrYtNmBINij2YbZkdmOINin2YTYudmE2YXYp9ihINin2YTYudix2Kgg2YHZiiDZhdis
2KfZhCDYqti52YTZitmFINin2YTZhNi62Kkg2KjZhdiz2KfYudiv2Kkg2KfZhNit2KfYs9mI2Kgg
2YrZhtiv2LEg2YjYrNmI2K/Zh9mFIA0K2YHZiiDZh9iw2Kcg2KfZhNiy2YXZhtiMINmI2KjYp9mE
2LfYqNi5INmH2LDYpyDZitit2KrYp9isINil2YTZiSDZhdin2YQg2YjZhdi12KfYsdmK2YEgLiDZ
gdij2K7YsCDZhdik2YTZgSDZh9iw2Kcg2KfZhNmD2KrYp9ioINio2YbYtdin2KbYrSANCtiu2KjZ
itixINiq2LnZhNmK2YUg2KfZhNmE2LrYqSDYqNmF2LPYp9i52K/YqSDYp9mE2K3Yp9iz2YjYqCDZ
iNij2LHYs9mEINin2YTYp9iz2KrYqNmK2KfZhiDYpdmE2Ykg2KjYudi2INin2YTYpdiu2YjYqSDY
p9mE2LnYsdioINmI2LrZitix2YfZhSDYq9mFIA0K2K/ZhNmBINio2KPYrtiwINix2KPZiiDYp9mE
2LnZhNmF2KfYoSDYp9mE2LrYsdio2YrZitmGLjxCUj48QlI+2KPZhdinINin2YTYpdis2KfYqNip
INin2YTYq9in2YTYq9ipINmE2YfYsNinINin2YTYs9ik2KfZhCDZgdij2LTYp9ix2KogDQrYqNij
2YbZkdmOINmD2KvZitix2KfZiyDZhdmGINin2YTYqtis2KfYsdioICjYqtmF2Kog2KjYp9mE2YTY
utipINin2YTYpdmG2KzZhNmK2LLZitipKSDZiNij2KzYsdmK2Kog2YHZiiDZh9iw2Kcg2KfZhNmF
2KzYp9mEICjZhdis2KfZhCDYqti52YTZitmFIA0K2KfZhNmE2LrYqSDYqNmF2LPYp9i52K/YqSDY
p9mE2K3Yp9iz2YjYqCkg2YjZitix2LTYryDYtdin2K3YqCDZh9iw2Kcg2KfZhNix2KPZiiDYudiv
2YUg2KXYttin2LnYqSDYp9mE2YXYp9mEINmI2KfZhNiy2YXZhiDZiNin2YTYp9iz2KrZgdin2K/Y
qSDZhdmGIA0K2KfZhNiv2LHYp9iz2KfYqiDYp9mE2LPYp9io2YLYqSDZgdmKINmH2LDYpyDYp9mE
2YXYrNin2YQg2YHZgtivINiq2LnZhNmF2YbYpyDYp9mE2YPYq9mK2LEg2YjZh9mG2KfZgyDYp9mE
2YPYq9mK2LEg2KfZhNiw2Yog2YrYrNioINij2YYg2YbYqti02KfZiNixIA0K2YHZitmH2Iwg2YHZ
h9iw2Ycg2K/YudmI2Ykg2YTZhNmF2LTYp9mI2LHYqSDZiNmH2LDYpyDZhdinINmC2KfZhSDYqNmH
INin2YTZhdik2YTZgSDZiNin2LPYqti02KfYsSDYp9mE2LnZhNmF2KfYoSDZgdmKINmH2LDYpyDY
p9mE2YXYrNin2YQuINij2YXYpyANCtin2YTYpdis2KfYqNipINin2YTYsdin2KjYudipINmE2YfY
sNinINin2YTYudmG2LXYsSAo2KPZh9mF2YrYqSDYp9mE2YPYqtin2KgpINmB2KPYrNin2Kgg2KfZ
hNiu2KjZitixINin2YTYsdin2KjYuSDYqNmG2LnZhSDZhNij2YfZhdmK2KkgDQrYp9mE2YPYqtin
2KjYjCDZiNmE2YPZhtmHINiq2LPYotmEINmF2KfYsNinINmK2LPYqtmB2YrYryDYp9mE2YLYp9ix
2KYg2YXZhiDZhdir2YQg2YfYsNinINin2YTZg9iq2KfYqNifINmI2YXYudix2YHYqSAo2YXZhiDZ
h9iw2Kcp2J8g2YjZitmC2YjZhCANCtio2KPZhtmR2Y4g2KfZhNmG2KfYsyDYudin2K/YqSDZitix
2LrYqNmI2YYg2YHZiiDYp9mE2YXYrdiq2YjZiSDZiNmE2YrYsyDZgdmKINin2YTZhdik2YTZgdmK
2YYuPEJSPjxCUj7ZiNmE2YPZhiDZgdmKINmI2KfZgti5INin2YTYo9mF2LEgDQrYo9mGINin2YTZ
g9iq2KfYqCDZhNmFINmK2LHZg9iyINmB2YLYtyDYudmE2Ykg2KfZhNmF2KTZhNmB2YrZhtiMINio
2YQg2KrZhtin2YjZhCDYrtio2LHYp9iq2YfZhSDYp9mE2KrZiiDZitix2Ykg2YXYpNmE2YEg2YfY
sNinINin2YTZg9iq2KfYqCDZgtivIA0K2KrZgdmK2K8g2YPYq9mK2LHYp9mLINmE2YPZhCDZhdmG
INmE2Ycg2YXZitmEINmE2KrYudmE2YrZhSDYp9mE2YTYutipINio2YXYs9in2LnYr9ipINin2YTY
rdin2LPZiNioLiDZiNiq2YbYp9mI2YQg2KfZhNmD2KrYp9ioINmD2LDZhNmDINij2YbYtNi32Kkg
DQrYo9mI2YTYptmDINin2YTYudmE2YXYp9ih2Iwg2YHYp9mE2YXYrdiq2YjZiSDZhtmB2LPZhyDZ
hNmFINmK2YPZhiDZhdmI2KzZiNiv2KfZiyDYo9i12YTYp9mLINmF2Kcg2YTZhSDZitmD2YYg2YfZ
htin2YMg2K7YqNix2KfYoSDZgdmKINmH2LDYpyANCtin2YTZhdis2KfZhNiMINmI2KjYp9mE2LfY
qNi5INis2KfYoSDYp9mE2YXYpNmE2YEg2KjYp9mE2YXYrdiq2YjZiSDZhdmGINmF2YLYp9mE2KfY
qiDZhdiq2LnYr9iv2Kkg2YjYrdmE2YQg2KjYudi2INmF2YYg2KrZhNmDIA0K2KfZhNmF2YLYp9mE
2KfYqi48QlI+PEJSPtmI2KXYrNin2KjYqSDYp9mE2K7YqNmK2LEg2KfZhNiu2KfZhdizINmD2KfZ
htiqINij2YrYttin2Ysg2KjZhti52YUg2YTYo9mH2YXZitipINin2YTZg9iq2KfYqNiMINmI2YrY
tNmK2LEg2KXZhNmJIA0K2KPZhiDYqNi52LYg2LfZhNin2KjZhyDZh9mFINi32YTYp9ioINi52LHY
qCDZitiq2YPZhNmF2YjZhiDYp9mE2YTYutipINin2YTYudix2KjZitipINmD2YTYutipINij2YjZ
hNmJ2Iwg2YjZiti02YrYsSDYpdmE2Ykg2KPZhiDZhdir2YQg2YfYsNinIA0K2KfZhNmD2KrYp9io
INiz2YrZg9mI2YYg2YXZgdmK2K/Yp9mLINmE2LfZhNin2KjZhyDYp9mE2LnYsdioLjxCUj7Yo9mF
2Kcg2KfZhNiu2KjZitix2Kkg2KfZhNiz2KfYr9iz2Kkg2YHYqtis2YrYqCDYqNmG2LnZhSDZhNmD
2KrYp9io2Kkg2YXYq9mEIA0K2YfYsNinINin2YTZg9iq2KfYqCDZiNiq2LTZitixINil2YTZiSDZ
iNis2YjYryDZhdmC2KfZhNin2Kog2YLZhNmK2YTYqSDYudmGINiq2LnZhNmK2YUg2KfZhNmE2LrY
qSDYp9mE2LnYsdio2YrYqSDYqNmF2LPYp9i52K/YqSDYp9mE2K3Yp9iz2YjYqC4gDQrZiNin2YTY
rtio2YrYsSDYp9mE2LPYp9io2Lkg2YrYrNmK2Kgg2KjZhti52YUg2YTYo9mH2YXZitipINin2YTZ
g9iq2KfYqC4g2YjYp9mE2K7YqNmK2LHYqSDYp9mE2KvYp9mF2YbYqSDYqtis2YrYqCDYqNin2YTY
t9io2Lkg2YbYudmFINmE2KPZh9mF2YrYqSANCtin2YTZg9iq2KfYqNiMINmI2KrYsdit2Kgg2KjZ
hdi02KfYsdmD2Kkg2KfZhNmF2KTZhNmBINmE2YfZhSDZgdmKINin2YTZg9iq2KfYqNipINmD2LnY
r9ipIA0K2YXYpNmE2YHZitmGLjxCUj48QlI+PC9TUEFOPjwvU1BBTj48U1BBTiBzdHlsZT0iRk9O
VC1TSVpFOiAxODAlIj48U1BBTiANCnN0eWxlPSJDT0xPUjogcmdiKDI1NSwwLDApOyBGT05ULUZB
TUlMWTogYXJpYWwiPjItINin2YTYudmG2LXYsSANCtin2YTYq9in2YbZijo8QlI+PC9TUEFOPjwv
U1BBTj48U1BBTiBzdHlsZT0iRk9OVC1TSVpFOiAxODAlIj48U1BBTiANCnN0eWxlPSJGT05ULUZB
TUlMWTogYXJpYWwiPjxTUEFOIHN0eWxlPSJDT0xPUjogcmdiKDI1NSwwLDApIj7Zhdiz2KrZgtio
2YQg2KrYudmE2YrZhSDYp9mE2YTYutipIA0K2KjZhdiz2KfYudiv2Kkg2KfZhNit2KfYs9mI2Kg6
PEJSPjwvU1BBTj7Ziti02YrYsSDYp9mE2K7YqNmK2LEg2KfZhNij2YjZhCDYqNij2YbZkdmOINmF
2LPYqtmC2KjZhCDYqti52YTZitmFINin2YTZhNi62Kkg2KjZhdiz2KfYudiv2KkgDQrYp9mE2K3Y
p9iz2YjYqCDYrNmK2ZHZkNivINmI2YTZg9mGINix2KjZhdinINmK2YPZiNmGINi62YrYsSDZiNin
2LbYrS4g2KPZhdinINin2YTYrtio2YrYsSDYp9mE2KvYp9mG2Yog2YHZiti02YrYsSDYpdmE2Ykg
2KPZhtmR2Y4g2YXYs9iq2YLYqNmEIA0K2KrYudmE2YrZhSDYp9mE2YTYutipINio2YXYs9in2LnY
r9ipINin2YTYrdin2LPZiNioINmK2LPZitixINio2LPYsdi52Kkg2LTYr9mK2K/YqSDYqtio2LnY
p9mLINmE2YTYqti32YjYsSDZgdmKINin2YTYqtmC2YbZitip2Iwg2YjYqNin2YTYqtin2YTZiiAN
CtmB2LXZhCDZhdmGINmH2LDYpyDZhdmGINin2YTZhNi62Kkg2KfZhNi52LHYqNmK2Kkg2LPZiNmB
INmK2YPZiNmGINis2YrYr9in2YsuINij2YXYpyDYp9mE2K7YqNmK2LEg2KfZhNir2KfZhNirINmB
2YrYtNmK2LEg2KXZhNmJINij2YbZkdmOINmH2LDYpyANCtin2YTYrdmC2YQg2YHZitmHINmG2YLZ
hNipINiz2LHZiti52Kkg2YXZhiDYrtmE2KfZhCDYp9mE2K/Ysdin2LPYp9iqINin2YTZhdin2LbZ
itipLiDZiNmK2YXZg9mGINiq2LXZiNixINin2YTZhdiz2KrZgtmK2YQg2KjZhdix2KfYrNi52Kkg
2YPZhCANCtin2YTZhdix2KfYrdmEINin2YTYs9in2KjZgtipINmB2Yog2KrYt9mI2LEg2KfZhNit
2KfYs9mI2Kgg2YHZiiDZhdis2KfZhCDYqti52YTZitmFINin2YTZhNi62KkuINmI2YXYs9iq2YLY
qNmEINiq2LnZhNmK2YUg2KfZhNmE2LrYqSDYqNmF2LPYp9i52K/YqSANCtin2YTYrdin2LPZiNio
INmK2K3Yqtin2Kwg2KXZhNmJINmD2KvZitix2Y0g2YXZhiDYp9mE2KjZhtin2KEg2YjYp9mE2KjY
rdirINmE2KjZhtin2KEg2LHYpNmK2Kkg2YXYs9iq2YLYqNmE2YrYqSDZhNiq2LnZhNmK2YUg2KfZ
hNmE2LrYqSANCtio2YXYs9in2LnYr9ipINin2YTYrdin2LPZiNioLjxCUj48QlI+2YjYpdis2KfY
qNipINin2YTYrtio2YrYsSDYp9mE2K7Yp9mF2LMg2LnZhiDZhdiz2KrZgtio2YQg2KrYudmE2YrZ
hSDYp9mE2YTYutipINio2YXYs9in2LnYr9ipIA0K2KfZhNit2KfYs9mI2KjYjCDZgdil2YbZhyDY
o9i02KfYsSDYpdmE2Ykg2KPZhtmR2Y4g2KfZhNit2KfYs9mI2Kgg2LPZiNmBINmK2YPZiNmGINmF
2YjYrNmI2K/Yp9mLINmB2Yog2KfZhNiq2LHYqNmK2Kkg2YjZiti52LLYsiDYqti52YTZitmFIA0K
2YjYqti52YTZhSDYp9mE2YTYutip2Iwg2YTZg9mG2Ycg2YrYtNmK2LEg2KXZhNmJINij2YbZhyDZ
h9mG2KfZgyDYqNi52LYg2KfZhNmF2YjYttmI2LnYp9iqINin2YTYqtmKINmK2KzYqCDYo9mGINmG
2YfYqtmFINio2YfYpyDZhdir2YQgDQoo2KfZhNiq2K/YsdmK2KjYjCDZiNiq2LfZiNmK2LHYp9mE
2YXZiNin2K8g2KfZhNi12YTYqNipINmE2YTYrdin2LPYqCkuINij2YXYpyDYp9mE2K7YqNmK2LHY
qSDYp9mE2LPYp9iv2LPYqSDZgdiq2KzZitioINio2KPZhtmR2Y4g2KfZhNit2KfYs9mI2KggDQrY
o9i12KjYrSDYtdi62YrYsdin2Ysg2YjYsdiu2YrYtdin2Ysg2YjZh9mG2KfZgyDYutmG2Ykg2YHZ
iiDYp9mE2KfYqti12KfZhNin2KrYjCDZiNin2YTYp9iq2LXYp9mEINmF2YjYrNmI2K8g2YHZiiDZ
g9mEINmF2YPYp9mGINmI2YHZiiDZhtmB2LMgDQrYp9mE2YjZgtiq2Iwg2YjYqti52YTZitmFINin
2YTZhNi62Kkg2KjZhdiz2KfYudiv2Kkg2KfZhNit2KfYs9mI2Kgg2YrYrdiq2KfYrCDYpdmE2Ykg
2KPZhiDZhtij2K7YsCDYp9mE2YHZiNin2KbYryDYp9mE2K3ZgtmK2YLZitipINin2YTZhdmI2KzZ
iNiv2KkgDQrYp9mE2KLZhtiMINmF2YYg2LrZhtmJINmE2YTYp9iq2LXYp9mE2KfYqiDZiNmI2KzZ
iNivINii2YTYp9iqINit2KfYs9mI2KjZitipINiw2KfYqiDZgtmI2Kkg2YHZiiDZitivINin2YTZ
hdi52YTZhdmK2YYg2YjYp9mE2LfZhNin2KguINmI2KfZhNiw2YogDQrZiti52LHZgSDZg9mK2YEg
2YrYs9iq2LnZhdmEINiq2YTZgyDYp9mE2KLZhNin2Kog2YrYs9iq2YHZitivINmD2KvZitix2KfZ
iyDZhdmGINiq2KPYq9mK2LEg2KrZhNmDINin2YTYotmE2KfYqi4g2YjYp9mE2YjYp9mC2Lkg2KfZ
hNit2YLZitmC2YogDQrYo9i12KjYrSDZitiq2K3Ys9mGINmB2Yog2YPZhCDZiNmC2KrYjCDZiNmF
2Lkg2LDZhNmDINmF2Kcg2LLYp9mEINmE2YrYsyDZhdmGINin2YTYs9mH2YQg2KfZhNil2YbYqtin
2KwuINmI2KfZhNiu2KjZitixINin2YTYs9in2KjYuSDZiti02YrYsSANCtil2YTZiSDYo9mG2ZHZ
jiDYrdmC2YQg2KrYudmE2YrZhSDYp9mE2YTYutipINio2YXYs9in2LnYr9ipINin2YTYrdin2LPZ
iNioINit2YLZhCDZhdmH2YXYjCDZiNmH2Ygg2YrZhtmF2Ygg2YjZitiq2LfZiNixINio2LXZiNix
2Kkg2KzZitmR2ZDYr9ip2IwgDQrZiNiu2KfYtdipINmF2Lkg2KrZgtiv2YUg2LnZhNmFINin2YTZ
g9mE2KfZhSDZiNi52YXZhNmK2KfYqiDYp9mE2YTYutipINin2YTYt9io2YrYudmK2KkuINmI2KfZ
hNiu2KjZitix2Kkg2KfZhNir2KfZhdmG2Kkg2KrYtNmK2LEg2KXZhNmJINij2YYgDQrZhdiz2KrZ
gtio2YQg2KrYudmE2YrZhSDYp9mE2YTYutipINio2YXYs9in2LnYr9ipINin2YTYrdin2LPZiNio
INmF2LTYsdmCINmI2YjYp9i52K8uPEJSPjwvU1BBTj48L1NQQU4+PFNQQU4gDQpzdHlsZT0iQ09M
T1I6IHJnYigyNTUsMCwwKSI+PEJSPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTgwJTsgRk9O
VC1GQU1JTFk6IGFyaWFsIj4zLSDYp9mE2LnZhti12LEg2KfZhNir2KfZhNirOjxCUj7ZiNin2YLY
uSDYqti52YTZitmFIA0K2KfZhNmE2LrYqSDYqNmF2LPYp9i52K/YqSDYp9mE2K3Yp9iz2YjYqCDZ
gdmKINin2YTZiNmC2Kog2KfZhNit2KfYttixPC9TUEFOPjwvU1BBTj48U1BBTiANCnN0eWxlPSJG
T05ULVNJWkU6IDE4MCU7IEZPTlQtRkFNSUxZOiBhcmlhbCI+OjxCUj7Ziti02YrYsdin2YTYrtio
2YrYsSDYp9mE2KPZiNmEINil2YTZiSDYo9mG2ZHZjiANCtmF2LPYqtmC2KjZhCDYqti52YTZitmF
INin2YTZhNi62Kkg2KjZhdiz2KfYudiv2Kkg2KfZhNit2KfYs9mI2Kgg2KPYrtiwINmK2YbZhdmI
INio2LXZiNix2Kkg2KzZitiv2KkuINij2YXYpyDYp9mE2K7YqNmK2LEg2KfZhNir2KfZhtmKINmB
2YrYtNmK2LEgDQrYpdmE2Ykg2KPZhiDZhdiz2KrZgtio2YQg2KrYudmE2YrZhSDYp9mE2YTYutip
INio2YXYs9in2LnYr9ipINin2YTYrdin2LPZiNioINmK2LTZg9mEINit2LbZiNix2KfZi9iMINmI
2KvYp9mE2Ksg2YrYtNmK2LEg2KXZhNmJINij2YbZkdmOINiq2LnZhNmK2YUgDQrYp9mE2YTYutip
INio2YXYs9in2LnYr9ipINin2YTYrdin2LPZiNioINmK2LjZh9ixINmB2Yog2KPZhdix2YrZhtiM
INin2YTYo9mF2LEg2KfZhNij2YjZhCDZh9mIOjxCUj4xICkg2KrYrdmE2YrZhCDYp9mE2YXZgtin
2YTYp9iqIA0K2KfZhNiz2KfYqNmC2KkgKNin2YTYpdix2LTZitmBKSDYudio2LEg2KfZhNi02KjZ
g9ipINin2YTYudin2YTZhdmK2KkuPEJSPjIgKSDYqtit2YTZitmEINi52YTZhSDYp9mE2YTYutip
INin2YTYp9is2KrZhdin2LnZiiDYqNin2LPYqti52YXYp9mEIA0K2KrYudmE2YrZhSDYp9mE2YTY
utipINio2YXYs9in2LnYr9ipINin2YTYrdin2LPZiNioLjxCUj48QlI+2YjYpdis2KfYqNipINin
2YTYrtio2YrYsSDYp9mE2K7Yp9mF2LMg2LnZhiDZiNin2YLYuSDYqti52YTZitmFINin2YTZhNi6
2KkgDQrYqNmF2LPYp9i52K/YqSDYp9mE2K3Yp9iz2YjYqCDZgdmKINin2YTZiNmC2Kog2KfZhNit
2KfZhNmKINmB2YrYtNmK2LEg2KXZhNmJINij2YbZkdmOINiq2LnZhNmK2YUg2KfZhNmE2LrYqSDY
qNmF2LPYp9i52K/YqSDYp9mE2K3Yp9iz2YjYqCDZhdinIA0K2LLYp9mEINmB2Yog2KjYr9in2YrY
p9iq2YfYjCDZiNmF2Kcg2LLZhNmG2Kcg2YbYqtmE2YXYsyDYt9ix2YrZgtmG2Kcg2YTYqti52YTZ
itmFINin2YTZhNi62Kkg2KjZhdiz2KfYudiv2Kkg2KfZhNit2KfYs9mI2KguINij2YXYpyDYp9mE
2K7YqNmK2LHYqSANCtin2YTYs9in2K/Ys9ipINmB2KrYrNmK2Kgg2YTZgtivINmG2Y7ZhdmO2Kog
2YPYq9mK2LEg2YXZhiDYpdmF2YPYp9mG2YrYp9iqINin2YTZhtiz2YrYrCDYp9mE2LnYp9mE2YXZ
iiDZiNmK2LPYqti52YXZhCDYp9mE2LXZiNiqINmI2KfZhNmB2YrYr9mK2YggDQrYudio2LEg2KfZ
hNi02KjZg9ipINin2YTYudin2YTZhdmK2KnYjCDZiNmE2YUg2KrYs9iq2LnZhdmEINin2YTZiNiz
2KfYpti3INin2YTZhdiq2LnYr9iv2Kkg2YjYp9mE2KLZhNin2Kog2KfYs9iq2LnZhdin2YTYp9mL
INmD2KfZhdmE2KfYjCDZgdin2YTYotmGIA0K2YTYqNix2KfZhdis2YrYp9iqINin2YTYqtmKINiq
2KPYqtmKINmB2Yog2LTZg9mEINij2YLYsdin2LUg2YXYtti62YjYt9ipINiq2LPZhditINmE2YTY
tdmI2Kog2YjYp9mE2YHZitiv2YrZiNiMINmD2YXYpyDZitmF2YPZhiDYp9mE2K3YtdmI2YQg2LnZ
hNmJIA0K2KjYsdin2YXYrCDYp9mE2KrYo9mE2YrZgSDZhdir2YQgKNmH2YjYqiDYqNiq2KfYqtmI
KS48QlI+SG90IFBvdGF0b2VzPEJSPtmI2YrYtNmK2LEg2KfZhNiu2KjZitixINin2YTYs9in2KjY
uSDYpdmE2Ykg2KPZhtmR2Y4gDQrZh9mG2KfZgyDYqNi52LYg2KfZhNmG2YXYp9iw2Kwg2KfZhNij
2LXZitmE2Kkg2KfZhNis2YrYr9ip2Iwg2YjZhNmD2YYg2KrZgtmE2YrYryDYqtmE2YMg2KfZhNmG
2YXYp9iw2Kwg2YXYpyDYstin2YQg2KjYudmK2K/Yp9mLINi52YbYpy4gDQrZiNin2YTYrtio2YrY
sdipINin2YTYq9in2YXZhtipINiq2LTZitixINil2YTZiSDYo9mG2ZHZjiDYqti52YTZitmFINin
2YTZhNi62Kkg2KjZhdiz2KfYudiv2Kkg2KfZhNit2KfYs9mI2Kgg2YrZhtmF2Ygg2YjZhNmD2YYg
2KfZhNmF2KzZh9mI2K/Yp9iqIA0K2YrYrNioINij2YYg2KrYqNiw2YQg2YTYqtmI2LPZiti5INin
2LPYqti52YXYp9mEINin2YTYrdin2LPZiNioINmB2Yog2KrYudmE2YrZhSDYp9mE2YTYutipLjxC
Uj48QlI+PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTgwJSI+PFNQQU4gc3R5bGU9
IkZPTlQtRkFNSUxZOiBhcmlhbCI+PFNQQU4gDQpzdHlsZT0iQ09MT1I6IHJnYigyNTUsMCwwKSI+
NC0g2KfZhNi52YbYtdixINin2YTYsdin2KjYuSA6PEJSPtmI2KfZgti5INiq2LnZhNmK2YUg2KfZ
hNmE2LrYqSDYqNmF2LPYp9i52K/YqSANCtin2YTYrdin2LPZiNioINmB2Yog2KfZhNmF2KfYttmK
IDo8QlI+PC9TUEFOPtin2YTYrtio2YrYsSDYp9mE2KPZiNmEINij2LTYp9ixINil2YTZiSDYo9mG
2ZHZjiDZiNin2YLYuSDYqti52YTZitmFINin2YTZhNi62KkgDQrYqNmF2LPYp9i52K/YqSDYp9mE
2K3Yp9iz2YjYqCDZgdmKINin2YTZhdin2LbZiiDZg9in2YYg2YHZitmHINiq2K3Yr9mKPEJSPtmE
2YTYudmE2YXYp9ih2Iwg2KPZhdinINin2YTYrtio2YrYsSDYp9mE2KvYp9mG2Yog2YHYo9i02KfY
sSDYpdmE2YkgDQrYo9mG2ZHZjiDZiNin2YLYuSDYqti52YTZitmFINin2YTZhNi62Kkg2KjZhdiz
2KfYudiv2Kkg2KfZhNit2KfYs9mI2Kgg2YHZiiDYp9mE2YXYp9i22Yog2YPYp9mGINmK2LHZg9iy
INi52YTZiSDYqtin2LHZitiuINiq2LnZhNmK2YUg2KfZhNmE2LrYqSANCtio2YXYs9in2LnYr9ip
INin2YTYrdin2LPZiNioINmI2YrZgtiq2LHYrSDYqti32YjZitixINio2LHYp9mF2Kwg2KrYudmE
2YrZhSDYp9mE2YTYutipINin2YTYudix2KjZitipINio2YXYs9in2LnYr9ipINin2YTYrdin2LPZ
iNio2Iwg2YHZh9iw2KcgDQrYp9mE2KrYt9mI2YrYsSDYs9mI2YEg2YrZg9mI2YYg2KzZitiv2KfZ
iyDZhNmF2Kcg2YHZitmHINmF2YYg2YXZhtmB2LnYqS48QlI+PEJSPtmI2KfZhNiu2KjZitixINin
2YTYrtin2YXYsyDZiti02YrYsSDYpdmE2Ykg2KPZhtmR2Y4gDQrYqti52YTZitmFINin2YTZhNi6
2Kkg2KjZhdiz2KfYudiv2Kkg2KfZhNit2KfYs9mI2Kgg2YHZiiDYp9mE2YXYp9i22Yog2YPYp9mG
INmK2KrYttmF2YYg2KrYrNin2LHYqCDYudmF2YTZitipINmB2Yog2KfZhNi62KfZhNioINmI2K7Y
p9i12Kkg2YrYtNmD2YQgDQrZiNis2YjYr9in2Ysg2YHZiiDYp9mE2KzYp9mF2LnYp9iqLiDZiNmE
2YPZhiDYqNi52K8g2YjYrNmI2K8g2KvZiNix2Kkg2KfZhNil2YbYqtix2YbZitiqINmB2KrYudmE
2YrZhSDYp9mE2YTYutipINio2YXYs9in2LnYr9ipINin2YTYrdin2LPZiNioIA0K2KfZhtiq2LTY
sSDZiNmE2Ycg2YjYrNmI2K8g2YHZiiDYp9mE2YXYr9in2LHYsyDYp9mE2KfYqNiq2K/Yp9im2YrY
qSDZiNin2YTYq9in2YbZiNmK2KkuPEJSPtij2YXYpyDYp9mE2K7YqNmK2LHYqSDYp9mE2LPYp9iv
2LPYqSDZgdiq2KzZitioOiANCtiq2Y/Ys9iq2LnZhdmEINin2YTYqtmC2YbZitipINio2LXZiNix
2Kkg2KzZitiv2Kkg2KPYrdmK2KfZhtin2Ysg2YjYqNi12YjYsdipINi22LnZitmB2Kkg2KPYrdmK
2KfZhtin2Ysg2KPYrtixLiDZiNmE2YPZhtmG2Kcg2YTYpyDZitmF2YPZhiDYo9mGIA0K2YbZh9mF
2YQg2KPZiCDZhtit2LDZgSDZg9mEINi02YrYpiDYrdmC2YIg2YHZiiDYp9mE2YXYp9i22YrYjCDZ
iNio2KfZhNiq2KfZhNmKINin2K3YqtmB2LjZhtinINio2KfZhNij2LTZitin2KEg2KfZhNi12LrZ
itix2Kkg2KfZhNiq2Yog2KrYudmF2YQgDQrYrNmK2K/Yp9mL2Iwg2YHZhdir2YTYp9mLINio2LnY
tiDYqNix2KfZhdisINin2YTYqtiv2LHZitio2KfYqiDZiNin2YTYqtmF2LHZitmG2KfYqiDZhdin
INiy2KfZhNiqINmF2YHZitiv2KnYjCDZhdir2YQg2KjYsdin2YXYrCDYp9mE2KrYr9ix2YrYqNin
2KogDQrYudmE2Ykg2KfZhNmG2LfZgiDZhdinINiy2KfZhNiqINiq2LPYqti52YXZhCDYqNi12YjY
sdipINmI2KfYs9i52KkuINmI2KjYsdmG2KfZhdisINmF2LnYp9mE2Kwg2KfZhNmD2YTZhdin2Kog
2YXYpyDYstin2YQg2YfZiCDYo9mD2KvYsSANCtin2YTYqNix2KfZhdisINiq2LfYqNmK2YLYp9mL
INmB2Yog2KrYudmE2YrZhSDYp9mE2YTYutipINio2YXYs9in2LnYr9ipINin2YTYrdin2LPZiNio
INmI2KfZhNmF2LTZg9mE2Kkg2KrZg9mF2YYg2YHZiiDZgtmE2Kkg2KfZhNmF2LnYsdmB2KkgDQrY
p9mE2YPYp9mF2YTYqSDYqNin2YTYqtmC2YbZitipINmI2KfZhNiq2LHYqNmK2Kkg2YTYr9mF2KzZ
h9mF2Kcg2KjYtdmI2LHYqSDZgdin2LnZhNipINmB2Yog2KfZhNmB2LXZhC4g2YjZiti02YrYsSDY
p9mE2K7YqNmK2LEg2KfZhNiz2KfYqNi5INil2YTZiSANCtij2YbZkdmOINmH2YbYp9mDINmD2KvZ
itixINmF2YYg2KfZhNmF2LnYp9mF2YQg2KrYudmF2YQg2LnYqNixINin2YTYtNio2YPYqSDYp9mE
2LnYp9mE2YXZitip2Iwg2YjZhNmD2YYg2KjZhtis2KfYrSDZhdit2K/ZiNivLiDZiNin2YTYrtio
2YrYsdipIA0K2KfZhNir2KfZhdmG2Kkg2KrYtNmK2LEg2KXZhNmJINij2YbZkdmOINmB2Yog2YXY
p9mE2YrYstmK2Kcg2YrYtNis2Lkg2KfZhNiq2LfZiNmK2LEg2KjZg9ir2LHYqSDZiNmF2Lkg2KfZ
hNiq2LnYsdmK2YEg2KjYp9mE2YXYr9ix2LPYqSDYp9mE2LDZg9mK2KkgDQrYqti32YjYsSDYp9iz
2KrYudmF2KfZhCDZiNiq2LfYqNmK2YIg2KrYudmE2YrZhSDYp9mE2YTYutipINio2YXYs9in2LnY
r9ipINin2YTYrdin2LPZiNioLjxCUj48L1NQQU4+PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkNPTE9S
OiByZ2IoMjU1LDAsMCkiPjxCUj48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDE4MCU7IEZPTlQt
RkFNSUxZOiBhcmlhbCI+NS0g2KfZhNi52YbYtdixINin2YTYrtin2YXYszo8QlI+2KjYudi2INin
2YTZhdmI2LbZiNi52KfYqiANCtin2YTYqtmKINmK2KzYqCDYo9mGINiq2YbYp9mC2LQgKNmF2KvY
p9mEINi32LHZgiDYqti52YTZhSDZiNiq2LnZhNmK2YUg2KfZhNmE2LrYqSDYqNmF2LPYp9i52K/Y
qSANCtin2YTYrdin2LPZiNioKTwvU1BBTj48L1NQQU4+PFNQQU4gc3R5bGU9IkZPTlQtU0laRTog
MTgwJTsgRk9OVC1GQU1JTFk6IGFyaWFsIj4g2YHYp9mE2K7YqNmK2LEgDQrYp9mE2KPZiNmEINmK
2LTZitixINil2YTZiSDYo9mG2ZHZjtmHINmE2Kcg2KjYryDZhdmGINiq2LXZhdmK2YUg2KfZhNio
2LHYp9mF2Kwg2YjYqti32KjZitmC2YfYpyDZgdmKINin2YTZgdi12YTYjCDYq9mFINiq2YLZiNmK
2YXZh9inINir2YUgDQrYpdiv2KfYsdipINiq2LnZhNmK2YUg2KfZhNmE2LrYqSDYqNmF2LPYp9i5
2K/YqSDYp9mE2K3Yp9iz2YjYqC4g2KPZhdinINin2YTYrtio2YrYsSDYp9mE2KvYp9mG2Yog2YHZ
iti02YrYsdil2YTZiSDYo9mG2Ycg2YTYp9io2K8g2YXZhiANCtin2YTYp9mH2KrZhdin2YUg2KjZ
g9mEINmF2Kcg2YTZhyDZhdmGINiq2LnZhNmCINio2KfZhNmE2LrYqSDYp9mE2LnYsdio2YrYqSDZ
iNin2YTYrtio2YrYsSDYp9mE2KvYp9mE2Ksg2YrYtNmK2LEg2KXZhNmJINmB2YfZhSDYp9mE2YXY
udmE2YUgDQrZhNmE2KPYutix2KfYtiDZiNil2KzYsdin2KHYp9iqINiq2LnZhNmK2YUg2KfZhNmE
2LrYqSDYqNmF2LPYp9i52K/YqSDYp9mE2K3Yp9iz2YjYqCDZiNin2YTYqti32YjZitixINin2YTZ
iNi42YrZgdmKINmE2YTYo9mG2LTYt9ipINmE2YXYpyDZhNmH2Kcg2YXZhiANCtmF2YPYp9mG2Kkg
2YXZh9mF2KkuPEJSPjxCUj7ZiNin2YTYrtio2YrYsSDYp9mE2K7Yp9mF2LMg2YrYtNmK2LEg2KXZ
hNmJINij2YbZkdmOINio2LnYtiDYp9mE2YXZiNi22YjYudin2Kog2KfZhNiq2Yog2YrYrNioINij
2YYgDQrZhtmG2KfZgti02YfYp9iMINmI2YfZiiDYt9ix2YIg2KfZhNiq2K/YsdmK2LMg2KPZiCDY
qNin2YTYo9it2LHZiSDYt9ix2YIg2KrZgtiv2YrZhSDYp9mE2YbYtSDZiNin2YTYr9ix2YjYsyDY
udio2LEg2KfZhNio2LHYp9mF2Kwg2KPZiCANCtin2YTYpdmG2KrYsdmG2YrYqiDYqNin2YTYpdi2
2KfZgdipINil2YTZiSDYp9mE2KjZitim2Kkg2KfZhNiq2LnZhNmK2YXZitipINmI2YXZiNin2K8g
2KfZhNiq2LnZhNmK2YUg2YXZhiDYrdin2LPZiNioINmI2LrZitix2Ycg2YjYp9mE2KfZgtiq2LXY
p9ivIA0K2YjYp9mE2YXYp9mEINmI2KfZhNiq2LrZitmK2LEg2KfZhNiz2LHZiti5INmB2Yog2LnY
p9mE2YUg2KfZhNiq2YLZhtmK2Kkg2YjYqtiv2LHZitioINin2YTZhdi52YTZhdmK2YYg2YjYqti1
2YXZitmFINin2YTZhdmG2KfZh9isINmI2KfZhNiv2LHZiNizIA0K2YjYp9mE2KrYt9io2YrZgiDZ
hNiq2LnZhNmK2YUg2KfZhNmE2LrYqSDYqNmF2LPYp9i52K/YqSDYp9mE2K3Yp9iz2YjYqNiMINmI
2KfZhNiq2YLZiNmK2YUg2YjYqti32YjZitixINin2YTYqNix2KfZhdis2YrYp9iqINmI2LrZitix
2Ycg2KfZhNmD2KvZitixLiANCtij2YXYpyDYp9mE2K7YqNmK2LHYqSDYp9mE2LPYp9iv2LPYqSDZ
gdiq2KzZitioINin2YTYqtix2KjZitipINmH2Yog2KfZhNmF2YHYqtin2K0uINmI2KfZhNmG2KfY
syDZhdmI2YTYudmI2YYg2KjYp9mE2YbYs9mK2Kwg2KfZhNi52KfZhNmF2YogDQrZhNij2LPYqNin
2Kgg2YXZgtio2YjZhNip2Iwg2YjZhNmD2YbZh9inINmE2YrYs9iqINij2YHYttmEINmI2LPZitmE
2KkgIiDYotmE2KkiINmE2YPZhCDYutix2LYuINmF2LnYsdmB2Kkg2YXYp9iw2Kcg2KrYs9iq2LnZ
hdmE2J/YjCDZiNmF2KrZiSANCtiq2LPYqti52YXZhNmH2J/YjCDZiNmF2Lkg2YXZhiDYqtiz2KrY
udmF2YTZh9if2Iwg2YfZiCDZhdmI2LbZiNi5INmD2KjZitixLiDZiNin2YTZhdmI2LbZiNi5INin
2YTYq9in2YbZiiDZh9mIINiq2LTYrNmK2Lkg2KrYt9mI2YrYsSDYp9mE2KLZhNii2KogDQrYp9mE
2KrZiiDYqtmF2YPZhiDZhdmGINin2YTYp9iq2LXYp9mEINin2YTYo9mB2LbZhCDZiNiq2LHZg9iy
INi52YTZiSDYqti52YTZitmFINin2YTYt9in2YTYqCDZg9mF2LHZg9iyINmE2YTYudmF2YTZitip
IA0K2KfZhNiq2LnZhNmK2YXZitipLjxCUj7ZiNmK2LTZitixINin2YTYrtio2YrYsSDYp9mE2LPY
p9io2Lkg2KXZhNmJINij2YbZkdmOINin2LPYqti52YXYp9mEINin2YTYqtmC2YbZitipINin2YTZ
hdis2LHYr9ipINmK2KzYqCDYo9mGINmK2LnYsdmBLiANCtmI2YfZhtin2YMg2KjYudi2INin2YTZ
hdi02KfYsdmK2Lkg2KfZhNio2K3Yq9mK2KnYjCDZiNmK2YbYtditINmH2LDYpyDYp9mE2K7YqNmK
2LEg2YPYp9iq2Kgg2YfYsNmHIDwvU1BBTj48L0RJVj4NCjxESVYgYWxpZ249cmlnaHQ+PFNQQU4g
c3R5bGU9IkNPTE9SOiByZ2IoNTEsNTEsMjU1KSI+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAx
ODAlOyBGT05ULUZBTUlMWTogYXJpYWwiPtin2YTYs9i32YjYsSDYqNin2YTYp9i32YTYp9i5INi5
2YTZiSDZhdinIA0K2YPYqtio2Yc6PEJSPkhpcm9ha2kgT2dhdGE8QlI+2YjYp9mE2K7YqNmK2LHY
qSDYp9mE2KvYp9mF2YbYqSDYqti02YrYsSDYpdmE2Ykg2KfYs9iq2LnZhdin2YQg2KjYsdmF2KzZ
itin2Kog2KzYr9mK2K/YqdiMIA0K2YjYp9mE2KfYs9iq2YHYp9iv2Kkg2KfZhNmC2LXZiNmJINmF
2YYg2KfZhNio2LHZitivINin2YTYp9mE2YPYqtix2YjZhtmKINmI2KfZhNmF2LXYp9iv2LEg2LnY
qNixINin2YTYtNio2YPYqSDYp9mE2LnYp9mE2YXZitipINmB2Yog2KrYudmE2YrZhSANCtin2YTZ
hNi62KkuPEJSPjwvU1BBTj48U1BBTiBzdHlsZT0iQ09MT1I6IHJnYigyNTUsMCwwKSI+PEJSPjxT
UEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTgwJTsgRk9OVC1GQU1JTFk6IGFyaWFsIj42LSDYp9mE
2LnZhti12LEg2KfZhNiz2KfYr9izOjxCUj7Yqti52YTZitmFINin2YTZhNi62KkgDQrYqNmF2LPY
p9i52K/YqSDYp9mE2K3Yp9iz2YjYqCDZiNin2YTYqNit2Ks8L1NQQU4+PC9TUEFOPjxTUEFOIA0K
c3R5bGU9IkZPTlQtU0laRTogMTgwJTsgRk9OVC1GQU1JTFk6IGFyaWFsIj48QlI+2YrYtNmK2LEg
2KfZhNiu2KjZitixINin2YTYo9mI2YQg2KXZhNmJINij2YbZkdmOINiq2LnZhNmK2YUgDQrYp9mE
2YTYutipINio2YXYs9in2LnYr9ipINin2YTYrdin2LPZiNioINmI2KfZhNio2K3YqyDYpdmE2Ykg
2KPZhtmHINi22LHZiNix2YouINmI2YrYtNmK2LEg2KfZhNiu2KjZitixINin2YTYq9in2YbZiiDY
pdmE2Ykg2KPZhtmR2Y4g2LnZhNmJIA0K2YPYp9iq2Kgg2YfYsNmHINin2YTYs9i32YjYsSDYo9mG
INmK2K3Yp9mI2YQg2KPZhiDZitit2LXZhCDYudmE2Ykg2KPZg9io2LEg2LnYr9ivINmF2YYg2KfZ
hNmF2YjYttmI2LnYp9iqINmF2YYg2KfZhNmF2YLYp9mE2KfYqiDYp9mE2KrZiiANCtiq2YbYp9mI
2YTYqiDYp9mE2KzZiNin2YbYqCDYp9mE2YbYuNix2YrYqSDZiNin2YTYrNmI2KfZhtioINin2YTY
qti32KjZitmC2YrYqSDZgdmKINiq2LnZhNmK2YUg2KfZhNmE2LrYqSDYqNmF2LPYp9i52K/YqSDY
p9mE2K3Yp9iz2YjYqCAo2YjZh9iw2KcgDQrZhdinINin2KrYqNi52Ycg2YXYpNmE2YEg2YfYsNin
INin2YTZg9iq2KfYqCkuPEJSPjxCUj7ZiNin2YTYrtio2YrYsSDYp9mE2K7Yp9mF2LMg2YrYtNmK
2LEg2KXZhNmJINij2YbZkdmOINiq2LnZhNmK2YUg2KfZhNmE2LrYqSANCtio2YXYs9in2LnYr9ip
INin2YTYrdin2LPZiNioINmI2KfZhNio2K3YqyDZgdmK2YLZiNmEINio2KPZhtmR2Y4g2KfZhNiz
2KTYp9mEINin2YTYo9iz2KfYs9mKINmH2Ygg2YfZhCDZitmF2YPZhiDYo9mGINmK2LPYp9i52K8g
2KrYudmE2YrZhSANCtin2YTZhNi62Kkg2KjZhdiz2KfYudiv2Kkg2KfZhNit2KfYs9mI2Kgg2KfZ
hNi32KfZhNio2J8g2YjZh9mEINmK2KrYudmE2YUg2KfZhNi32KfZhNioINin2YTZhNi62Kkg2KjY
t9ix2YrZgtipINij2YHYttmE2J8g2YjYo9mK2LbYp9mLINmH2YQg2YbYp9iq2KwgDQrYp9mE2KrY
udmE2YUg2YrYs9in2LnYryDZhdiq2LnZhNmF2Yog2KfZhNmE2LrYqSDYp9mE2KvYp9mG2YrYqdif
LiDZiNin2YTYotmGINio2K/Yo9mG2Kcg2YbZgdmH2YUg2LXYudmI2KjYqSDYp9mE2KjYrdirINin
2YTYsNmKINmK2KrYt9mE2KggDQrYp9mE2KXYrNin2KjYqSDYudmGINin2YTYs9ik2KfZhNmK2YYg
2KfZhNiz2KfYqNmC2YrZhi4g2YHZiiDZg9mEINin2YTYo9it2YjYp9mEINmK2LPYqti52YXZhCDY
p9mE2K3Yp9iz2YjYqCDZiNmE2YPZhtmHINiv2YjZhiDYo9mGINmG2KjYsdmH2YYg2KPZhiANCtmH
2YbYp9mDINiq2K3Ys9mGINmB2Yog2KPYr9in2KEg2KfZhNi32YTYp9ioINmE2YTYpdiv2KfYsdmK
2YrZhiDZiNmF2KrYrtiw2Yog2KfZhNiz2YrYp9iz2Kkg2KfZhNiq2LnZhNmK2YXZitip2Iwg2YHZ
itmD2YjZhiDZhdmGINin2YTYtdi52YjYqNipIA0K2LfZhNioINmG2YLZiNivINmE2KrYuti32YrY
qSDYqtmD2YTZgdipINiq2LnZhNmK2YUg2KfZhNmE2LrYqSDYqNmF2LPYp9i52K/YqSDYp9mE2K3Y
p9iz2YjYqCDYr9mI2YYg2KPZhiDZhtio2LHZh9mGINio2KrYrdiz2YrZhiDZhdiz2KrZiNmJIA0K
2KfZhNi32YTYp9ioLjxCUj48QlI+2KPZhdinINin2YTYrtio2YrYsdipINin2YTYs9in2K/Ys9ip
INmB2KrYrNmK2Kgg2KfZhNio2K3YqyDZgdmKINiq2LnZhNmK2YUg2KfZhNmE2LrYqSDYqNmF2LPY
p9i52K/YqSDYp9mE2K3Yp9iz2YjYqCDZh9mIIA0K2YPZhdit2KfZiNmE2Kkg2YTYttix2Kgg2KzY
s9mFINmF2KrYrdix2YMuINmB2KfZhNio2K3YqyDZgdmKINin2YTYs9io2LnZitmG2KfYqiDZiNin
2YTYq9mF2KfZhtmK2YbYp9iqINmD2KfZhiDYudmGINin2YTYrdin2LPZiNioINin2YTYo9i12YTZ
itiMIA0K2YjZhNmFINiq2YPZhiDZhNmHINmG2YjYp9iq2Kwg2LnYuNmK2YXYqSDZg9mF2Kcg2YfZ
iiDZhdmI2KzZiNiv2Kkg2KfZhNii2YYuINmI2KfZhNio2K3YqyDYp9mE2LPYp9io2YIg2LnZhiDY
p9mE2KrZhNmB2LLZitmI2YYg2KfZhNiq2LnZhNmK2YXZitiMIA0K2LHYqNmF2Kcg2YrZg9mI2YYg
2KPZg9ir2LEg2LnZhNin2YLYqSDYqNiq2LnZhNmK2YUg2KfZhNmE2LrYqSDYqNmF2LPYp9i52K/Y
qSDYp9mE2K3Yp9iz2YjYqCDYp9mE2K3Yp9mE2YouINmI2K/ZiNixINin2YTZhdi52YTZhSDZhdin
INiy2KfZhCANCtiv2YjYsdin2Ysg2YHYudin2YTYp9mLINmB2Yog2KfZhNil2YbYqtin2Kwg2YHZ
i