From 373df6fb09678a79709f9829b3959cf4097a1121 Mon Sep 17 00:00:00 2001 From: Sebastien SAUVAGE Date: Sat, 23 Mar 2013 17:35:44 +0100 Subject: [PATCH] Initial commit of Thomas Rybak's original version --- .gitattributes | 22 + .gitignore | 1 + README.md | 15 + config.php | 43 + config_default.php | 43 + createthumb.php | 92 + css/mediaboxAdvBlack21.css | 167 ++ css/mediaboxAdvWhite.css | 167 ++ images/50.gif | Bin 0 -> 77 bytes images/80.png | Bin 0 -> 146 bytes images/WhiteLoading.gif | Bin 0 -> 11384 bytes images/cannotopen.jpg | Bin 0 -> 10121 bytes images/close.png | Bin 0 -> 417 bytes images/filetype_DOCX.png | Bin 0 -> 13443 bytes images/filetype_GZ.png | Bin 0 -> 15778 bytes images/filetype_PDF.png | Bin 0 -> 12275 bytes images/filetype_PPTX.png | Bin 0 -> 12794 bytes images/filetype_RAR.png | Bin 0 -> 16106 bytes images/filetype_TAR.png | Bin 0 -> 15491 bytes images/filetype_XLXS.png | Bin 0 -> 16165 bytes images/filetype_ZIP.png | Bin 0 -> 15663 bytes images/folder_black.png | Bin 0 -> 7739 bytes images/folder_blue.png | Bin 0 -> 10658 bytes images/folder_green.png | Bin 0 -> 9784 bytes images/folder_grey.png | Bin 0 -> 8519 bytes images/folder_purple.png | Bin 0 -> 9835 bytes images/folder_vista.png | Bin 0 -> 10542 bytes images/loading.gif | Bin 0 -> 12154 bytes images/loading2.gif | Bin 0 -> 15750 bytes images/loading3.gif | Bin 0 -> 11384 bytes images/questionmark.jpg | Bin 0 -> 10577 bytes index.php | 409 +++ integrate.php | 7 + js/mediaboxAdv-1.3.4b.js | 956 ++++++ js/mootools.js | 5800 ++++++++++++++++++++++++++++++++++++ system_check.php | 127 + templates/exhibition.html | 181 ++ templates/integrate.html | 149 + templates/mano.html | 167 ++ 39 files changed, 8346 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 README.md create mode 100644 config.php create mode 100644 config_default.php create mode 100644 createthumb.php create mode 100644 css/mediaboxAdvBlack21.css create mode 100644 css/mediaboxAdvWhite.css create mode 100644 images/50.gif create mode 100644 images/80.png create mode 100644 images/WhiteLoading.gif create mode 100644 images/cannotopen.jpg create mode 100644 images/close.png create mode 100644 images/filetype_DOCX.png create mode 100644 images/filetype_GZ.png create mode 100644 images/filetype_PDF.png create mode 100644 images/filetype_PPTX.png create mode 100644 images/filetype_RAR.png create mode 100644 images/filetype_TAR.png create mode 100644 images/filetype_XLXS.png create mode 100644 images/filetype_ZIP.png create mode 100644 images/folder_black.png create mode 100644 images/folder_blue.png create mode 100644 images/folder_green.png create mode 100644 images/folder_grey.png create mode 100644 images/folder_purple.png create mode 100644 images/folder_vista.png create mode 100644 images/loading.gif create mode 100644 images/loading2.gif create mode 100644 images/loading3.gif create mode 100644 images/questionmark.jpg create mode 100644 index.php create mode 100644 integrate.php create mode 100644 js/mediaboxAdv-1.3.4b.js create mode 100644 js/mootools.js create mode 100644 system_check.php create mode 100644 templates/exhibition.html create mode 100644 templates/integrate.html create mode 100644 templates/mano.html diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..412eeda --- /dev/null +++ b/.gitattributes @@ -0,0 +1,22 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp +*.sln merge=union +*.csproj merge=union +*.vbproj merge=union +*.fsproj merge=union +*.dbproj merge=union + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3b5ca56 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +photos/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..6f471f7 --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +Minigal Nano SSE +================ + +MiniGal Nano is a very simple image gallery. It only requires php and GD (no database, no special libraries like PEAR or ImageMagick). MiniGal Nano does not have a web admin interface: You only have to upload your images in the photo folder. + +This fork (Minigal Nano SSE) is based on Thomas Rybak's version which seems to have been abandonned in 2010: http://www.minigal.dk/minigal-nano.html + +This fork holds some improvements, like thumbnail cache and folder/image description. + +------------------------------------------------------------------------------ + +MiniGal Nano SSE by Sébastien SAUVAGE is licensed under a Creative Commons Attribution-Share Alike. +https://creativecommons.org/licenses/by-sa/2.5/ + +------------------------------------------------------------------------------ diff --git a/config.php b/config.php new file mode 100644 index 0000000..c5eb784 --- /dev/null +++ b/config.php @@ -0,0 +1,43 @@ + \ No newline at end of file diff --git a/config_default.php b/config_default.php new file mode 100644 index 0000000..3a5e016 --- /dev/null +++ b/config_default.php @@ -0,0 +1,43 @@ + \ No newline at end of file diff --git a/createthumb.php b/createthumb.php new file mode 100644 index 0000000..c6b7355 --- /dev/null +++ b/createthumb.php @@ -0,0 +1,92 @@ + +*/ +// error_reporting(E_ALL); + +if (preg_match("/.jpg$|.jpeg$/i", $_GET['filename'])) header('Content-type: image/jpeg'); +if (preg_match("/.gif$/i", $_GET['filename'])) header('Content-type: image/gif'); +if (preg_match("/.png$/i", $_GET['filename'])) header('Content-type: image/png'); + + // Display error image if file isn't found + if (!is_file($_GET['filename'])) { + header('Content-type: image/jpeg'); + $errorimage = ImageCreateFromJPEG('images/questionmark.jpg'); + ImageJPEG($errorimage,null,90); + } + + // Display error image if file exists, but can't be opened + if (substr(decoct(fileperms($_GET['filename'])), -1, strlen(fileperms($_GET['filename']))) < 4 OR substr(decoct(fileperms($_GET['filename'])), -3,1) < 4) { + header('Content-type: image/jpeg'); + $errorimage = ImageCreateFromJPEG('images/cannotopen.jpg'); + ImageJPEG($errorimage,null,90); + } + + // Define variables + $target = ""; + $xoord = 0; + $yoord = 0; + + if ($_GET['size'] == "") $_GET['size'] = 120; // + $imgsize = GetImageSize($_GET['filename']); + $width = $imgsize[0]; + $height = $imgsize[1]; + if ($width > $height) { // If the width is greater than the height it’s a horizontal picture + $xoord = ceil(($width-$height)/2); + $width = $height; // Then we read a square frame that equals the width + } else { + $yoord = ceil(($height-$width)/2); + $height = $width; + } + + // Rotate JPG pictures + if (preg_match("/.jpg$|.jpeg$/i", $_GET['filename'])) { + if (function_exists('exif_read_data') && function_exists('imagerotate')) { + $exif = exif_read_data($_GET['filename']); + $ort = $exif['IFD0']['Orientation']; + $degrees = 0; + switch($ort) + { + case 6: // 90 rotate right + $degrees = 270; + break; + case 8: // 90 rotate left + $degrees = 90; + break; + } + if ($degrees != 0) $target = imagerotate($target, $degrees, 0); + } + } + + $target = ImageCreatetruecolor($_GET['size'],$_GET['size']); + if (preg_match("/.jpg$/i", $_GET['filename'])) $source = ImageCreateFromJPEG($_GET['filename']); + if (preg_match("/.gif$/i", $_GET['filename'])) $source = ImageCreateFromGIF($_GET['filename']); + if (preg_match("/.png$/i", $_GET['filename'])) $source = ImageCreateFromPNG($_GET['filename']); + imagecopyresampled($target,$source,0,0,$xoord,$yoord,$_GET['size'],$_GET['size'],$width,$height); + imagedestroy($source); + + if (preg_match("/.jpg$/i", $_GET['filename'])) ImageJPEG($target,null,90); + if (preg_match("/.gif$/i", $_GET['filename'])) ImageGIF($target,null,90); + if (preg_match("/.png$/i", $_GET['filename'])) ImageJPEG($target,null,90); // Using ImageJPEG on purpose + imagedestroy($target); + + + +?> \ No newline at end of file diff --git a/css/mediaboxAdvBlack21.css b/css/mediaboxAdvBlack21.css new file mode 100644 index 0000000..2879ace --- /dev/null +++ b/css/mediaboxAdvBlack21.css @@ -0,0 +1,167 @@ + /* mediaboxAdvanced Black theme */ + /* version 2.1 - August 2010 */ + /* for mediaboxAdvanced v.1.3.1 */ + + /* Overlay background styling */ + +#mbOverlay { + position: fixed; + z-index: 9998; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: #000; + cursor: pointer; +} + + /* Legacy fix for older browsers */ + +#mbOverlay.mbOverlayFF { + background: transparent url(../images/80.png) repeat; +} + +#mbOverlay.mbOverlayIE { + position: absolute; +} + + /* Overlay panel styling */ + +#mbCenter { + position: absolute; + z-index: 9999; + left: 50%; + overflow: hidden; + background-color: #000; + -webkit-border-radius: 10px; + -khtml-border-radius: 10px; + -moz-border-radius: 10px; + border-radius: 10px; + -webkit-box-shadow: 0px 5px 20px rgba(0,0,0,0.50); + -khtml-box-shadow: 0px 5px 20px rgba(0,0,0,0.50); + -moz-box-shadow: 0px 5px 20px rgba(0,0,0,0.50); + box-shadow: 0px 5px 20px rgba(0,0,0,0.50); + /* For IE 8 */ + -ms-filter: "progid:DXImageTransform.Microsoft.Shadow(Strength=5, Direction=180, Color='#000000')"; + /* For IE 5.5 - 7 */ + filter: progid:DXImageTransform.Microsoft.Shadow(Strength=5, Direction=180, Color='#000000'); +} + +#mbCenter.mbLoading { + background: #000 url(../images/loading2.gif) no-repeat center; + /* This style is applied only during animation. */ + /* For example, the next lines turn off shadows */ + /* improving browser performance on slow systems. */ + /* To leave shadows on, just remove the following: */ + -webkit-box-shadow: none; + -khtml-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +#mbImage { + position: relative; + left: 0; + top: 0; + + /* Inline content styling */ + + font-family: Myriad, Verdana, Arial, Helvetica, sans-serif; + line-height: 20px; + font-size: 12px; + color: #fff; + text-align: left; + background-position: center center; + background-repeat: no-repeat; + padding: 10px; +} + + /* Title, Caption and Button styling */ + +#mbBottom { + min-height: 20px; + font-family: Myriad, Verdana, Arial, Helvetica, sans-serif; + line-height: 20px; + font-size: 12px; + color: #999; + text-align: left; + padding: 0 10px 10px; +} + +#mbTitle, #mbPrevLink, #mbNextLink, #mbCloseLink { + display: inline; + color: #fff; + font-weight: bold; + line-height: 20px; + font-size: 12px; +} + +#mbNumber { + display: inline; + color: #999; + line-height: 14px; + font-size: 10px; + margin: auto 10px; +} + +#mbCaption { + display: block; + color: #999; + line-height: 14px; + font-size: 10px; +} + +#mbPrevLink, #mbNextLink, #mbCloseLink { + float: right; + outline: none; + margin: 0 0 0 10px; + font-weight: normal; +} + +#mbPrevLink b, #mbNextLink b, #mbCloseLink b { + color: #eee; + font-weight: bold; + text-decoration: underline; +} + +#mbPrevLink big, #mbNextLink big, #mbCloseLink big { + color: #eee; + font-size: 16px; + line-height: 14px; + font-weight: bold; +} + +#mbBottom a, #mbBottom a:link, #mbBottom a:visited { /* Thanks to Danny Jung for feedback and corrections */ + text-decoration: none; + color: #ddd; +} + +#mbBottom a:hover, #mbBottom a:active { + text-decoration: underline; + color: #fff; +} + + + /* Error message styling */ + +#mbError { + position: relative; + font-family: Myriad, Verdana, Arial, Helvetica, sans-serif; + line-height: 20px; + font-size: 12px; + color: #fff; + text-align: center; + border: 10px solid #700; + padding: 10px 10px 10px; + margin: 20px; + -webkit-border-radius: 5px; + -khtml-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +#mbError a, #mbError a:link, #mbError a:visited, #mbError a:hover, #mbError a:active { + color: #d00; + font-weight: bold; + text-decoration: underline; +} \ No newline at end of file diff --git a/css/mediaboxAdvWhite.css b/css/mediaboxAdvWhite.css new file mode 100644 index 0000000..3942b3d --- /dev/null +++ b/css/mediaboxAdvWhite.css @@ -0,0 +1,167 @@ + /* mediaboxAdvanced Black theme */ + /* version 2.1 - August 2010 */ + /* for mediaboxAdvanced v.1.3.1 */ + + /* Overlay background styling */ + +#mbOverlay { + position: fixed; + z-index: 9998; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: #000; + cursor: pointer; +} + + /* Legacy fix for older browsers */ + +#mbOverlay.mbOverlayFF { + background: transparent url(../images/80.png) repeat; +} + +#mbOverlay.mbOverlayIE { + position: absolute; +} + + /* Overlay panel styling */ + +#mbCenter { + position: absolute; + z-index: 9999; + left: 50%; + overflow: hidden; + background-color: #fff; + -webkit-border-radius: 10px; + -khtml-border-radius: 10px; + -moz-border-radius: 10px; + border-radius: 10px; + -webkit-box-shadow: 0px 5px 20px rgba(0,0,0,0.50); + -khtml-box-shadow: 0px 5px 20px rgba(0,0,0,0.50); + -moz-box-shadow: 0px 5px 20px rgba(0,0,0,0.50); + box-shadow: 0px 5px 20px rgba(0,0,0,0.50); + /* For IE 8 */ + -ms-filter: "progid:DXImageTransform.Microsoft.Shadow(Strength=5, Direction=180, Color='#000000')"; + /* For IE 5.5 - 7 */ + filter: progid:DXImageTransform.Microsoft.Shadow(Strength=5, Direction=180, Color='#000000'); +} + +#mbCenter.mbLoading { + background: #fff url(../images/WhiteLoading.gif) no-repeat center; + /* This style is applied only during animation. */ + /* For example, the next lines turn off shadows */ + /* improving browser performance on slow systems. */ + /* To leave shadows on, just remove the following: */ + -webkit-box-shadow: none; + -khtml-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +#mbImage { + position: relative; + left: 0; + top: 0; + + /* Inline content styling */ + + font-family: Myriad, Verdana, Arial, Helvetica, sans-serif; + line-height: 20px; + font-size: 12px; + color: #333; + text-align: left; + background-position: center center; + background-repeat: no-repeat; + padding: 10px; +} + + /* Title, Caption and Button styling */ + +#mbBottom { + min-height: 20px; + font-family: Myriad, Verdana, Arial, Helvetica, sans-serif; + line-height: 20px; + font-size: 12px; + color: #000; + text-align: left; + padding: 0 10px 10px; +} + +#mbTitle, #mbPrevLink, #mbNextLink, #mbCloseLink { + display: inline; + color: #000; + font-weight: bold; + line-height: 20px; + font-size: 12px; +} + +#mbNumber { + display: inline; + color: #333; + line-height: 14px; + font-size: 10px; + margin: auto 10px; +} + +#mbCaption { + display: block; + color: #000; + line-height: 14px; + font-size: 10px; +} + +#mbPrevLink, #mbNextLink, #mbCloseLink { + float: right; + outline: none; + margin: 0 0 0 10px; + font-weight: normal; +} + +#mbPrevLink b, #mbNextLink b, #mbCloseLink b { + color: #333; + font-weight: bold; + text-decoration: underline; +} + +#mbPrevLink big, #mbNextLink big, #mbCloseLink big { + color: #333; + font-size: 16px; + line-height: 14px; + font-weight: bold; +} + +#mbBottom a, #mbBottom a:link, #mbBottom a:visited { /* Thanks to Danny Jung for feedback and corrections */ + text-decoration: none; + color: #ddd; +} + +#mbBottom a:hover, #mbBottom a:active { + text-decoration: underline; + color: #000; +} + + + /* Error message styling */ + +#mbError { + position: relative; + font-family: Myriad, Verdana, Arial, Helvetica, sans-serif; + line-height: 20px; + font-size: 12px; + color: #fff; + text-align: center; + border: 10px solid #700; + padding: 10px 10px 10px; + margin: 20px; + -webkit-border-radius: 5px; + -khtml-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +#mbError a, #mbError a:link, #mbError a:visited, #mbError a:hover, #mbError a:active { + color: #d00; + font-weight: bold; + text-decoration: underline; +} \ No newline at end of file diff --git a/images/50.gif b/images/50.gif new file mode 100644 index 0000000000000000000000000000000000000000..580f9887ce5f7c62ae5cae0deabe61e707843986 GIT binary patch literal 77 zcmZ?wbhEHb6k!lyXkcUjg8%>jEB<5wG8q|kKzxu41CxqN&+?hC|179!^ebC?NwVZ@ b;eC-f<wC$h5`x)80Nob_%0xyybq|J!PC{xWt~$(698vfD((OP literal 0 HcmV?d00001 diff --git a/images/WhiteLoading.gif b/images/WhiteLoading.gif new file mode 100644 index 0000000000000000000000000000000000000000..d8bc9e66262c9d5862daba2acd2b950a6c3b36d2 GIT binary patch literal 11384 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 literal 0 HcmV?d00001 diff --git a/images/cannotopen.jpg b/images/cannotopen.jpg new file mode 100644 index 0000000000000000000000000000000000000000..52b9869bb675f387b48ec0daeda097bad73f5705 GIT binary patch literal 10121 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 LNkvXXu0mjfVAHTb literal 0 HcmV?d00001 diff --git a/images/filetype_DOCX.png b/images/filetype_DOCX.png new file mode 100644 index 0000000000000000000000000000000000000000..d25552a61c34df7d3aadf972fd051137098b8e70 GIT binary patch literal 13443 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 literal 0 HcmV?d00001 diff --git a/images/filetype_PDF.png b/images/filetype_PDF.png new file mode 100644 index 0000000000000000000000000000000000000000..b7d7119cb038967617ddd3ab00531372870eec8d GIT binary patch literal 12275 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 z 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 N002ovPDHLkV1gxNuG0Vj literal 0 HcmV?d00001 diff --git a/images/filetype_PPTX.png b/images/filetype_PPTX.png new file mode 100644 index 0000000000000000000000000000000000000000..36290bddaabd5ed130e3c045c33bc5010efb9300 GIT binary patch literal 12794 zcmZ8{V{j$R^YsmH>};Hk&5do_b~ZLP$;P&A+qP}n+8f(^pWml{)%&66^oQx`nloKJ zXR0P#QCJA8Q}%`b0MPHn5gTx!l3xkM>@r%M#qC<#)TLT^u7sLb>hDA)g?|T+n zuXH{CoBnEEzV3^4aaRJuo0ZdXFW|DxqRzTkj3VZ_q1_8jN6c$Vkfb;|yj**hO1A@{47~*#t zytlM9C?J~um`ZQpZ71Ur^Vfl)cLZu^Fc4DBNMX@pup5CJWe741c%3z7l-SugZAiLvqF*YRwngCGE~@8UE6MaS5P>&FA_XZuw^ zeg$cv51;4y9BI~oEZ7XlJKfN@claMSV)=3H>+8oyM{CkU!a7D18s1;#0|tE>pEj>P zydTexdp!qa{=fA6B_Ln+2Bscli}7a@V1tae{>4gsw8DRX5G;}mNg20m(qJ4ap*hBg zW<=fpDkcdRPM{tpU-&jX*rj`i;NN8f)LHR^dB)S1>6t)0$xxzby7V190|0lO_Wes# zFc5wgf%~&=-`4`45_#kRKQpNWM*u)yl#D@jqETQJ1^^Jv^QWm3!h7h)rt5>o?}ysz zhyO5S4-zID8W2VihBNiUcQT}|3J|6WnXV(CF=Sj4Bw+1RvIt3ZKw=nBYeV95Kz=iV z$?2!+@`r^K8iPSMBHjoCGmg+Cje)^R4}Kx;mxM%%BqJIR!%!lTiD#2!R*q05Qj;XO z<8uP%3e^?wi02st{0jI8>5^bh@^4V$TS90SX)oiz4H7SapEGq~&WQbympSLugv%Gj zo)4ON~*(vJBZUF^mif*K^XrCYnsvlT;y8j^Ng*S3z`!Kbp+eyFsG) zi}k^>L%InQ84(IeYRYQLuSu2>;ghkVZoqQDLIf!dP?98;$uv=PpuP@a8~&Nox`4JIzF?t{VqVTu7FuCmX0Iwx zd!VrQ9r%z^@pZ2?USH0lCPpX zpG$;Annj~g`98@^0C$!!4-29yO}+Pt*ul7_KA^@cVU=xX{;g|Wk&>FCSt(hm zR4H-Z&0cd^nqAT@)~WUGk0dlIO{q&MVIDgJl?_r^SJ^IwEBztI$NgBtP+?t+m)|Ms z)@xUKm6p?^@0TNMU%KPb4SK`(X8ctBw0$dmlt9pgZbTr1-b9$e<{f5pwC5#Y9NoNC z644tJ6e%`JHcH(Oif^CiEnF6l7DtY<9ML@_JG33K9Vw)MrXZ$}kvo&S%21YTFQG2s zk>!ycot~O5m|jU|%j9ET{RPSdWv*uKwi;@?YtyxqwY2?~YBt;khed|V1WYod@-t-Ojcku~A4$7BI_mBJU3kpSY|I?EEZeNTV!yJy z3f;<`V$G$_(PD9)8ypkaQ#zg(fX_{4vfi!oQ4mq^H*W@!GMX^PYgDh+wHCWoJR4nO z@jvl9 zfBEZ0+#4gnz4`m8Vf|7lDz9A#Qz$l|I^ej!n%H9OBCeYF8I(2?KVyj$tmt#HG6yvJ zXB0W;gFqP^8mti_5aST0i964n%H}q|CE~m*`X-tpx|3~7U%_C-yTQ@H z+95E)V5T*-teLGTWg~;n#XwWTZfDc8`*C?6dXRkpf9Q#o#yF#|E*!xI~_j3l~S2QJAFCTII$VWk#(K> zeTg=Jwx7^a93rDZPoVj)yUL2If!EPv6YdZbiZ(5P`l}@*@D^Wza9D<9i)_s)PJc+c8Kd6O^CbdO_z^PVw;Sq(^Q+Cfh{8K zg}uCOUB64mXQp`sREty}RNqwDuNJnOjaFam=CANPyPjAtmN#{}oQ&3zI$n-KEI@n$Ns(Gs+n1IJ7Wh<^V^?U;C6Gpc_Izbu zyU`=EBdSGbjU13VhbT{`X~1Hl`Q2<(c5=4255w!0;buXLC&*-G*9zJG zx&y^!e?ja!62#NRGoyRg=5p7td5o^nrjb$0ZD4!ma>o0WxTrANnbnz5)2?gXe)YGz z+0*R#6fcKkX8WPru!`+)m;i*1`mRl zLhB;iq00g~Ut4R}TfSC(Zh80fTN2OE!GW`1@sF{{B2cmEv6CT)A?G=q{9IfI0#2W& zAEhF*rn3||SYHKSlQmdB7=2!r&sS&W)8_M2?@|+cZM}*=&-%`BYBxs)MhJVx-C3CR zAJpG3``xzO2(Alvkrj@-h_HV$knF&bDaANKBEIAR7y67KXL_(!+F-h@ zFa?NnO)!et-3DjhTO`4Dy@76g154(tyEDbj_kPrS(z~{zxut_Zez#CrLqnsx;_vSJ zW>4>Nc!d*#jA+_Sb5rA7Q%P&v7euADZ%Hke+bdALg`VMMO2QJWIIJR8_~BI*Rq1hg zuaL&CjD{)?X5U+_FKBnX>~s4wGsI2S{o;oCof{yA7^Z{)YNl|GdU?LVUf*3Nr2O#O zKOcCWdjpvX#QK%_XX@j9_FXl2PG{K zh1iv+{@cbFznZ23*H;NB*o0JdV-FZ1qnra1JWSk#2|6iS3B(4gq2To+cI92tym8P! zB;?sKB%7TKux5SqIE=Q$;QiU#PVR+z??+*naD&bgdoL^hh%Nhl*XO2KIyZ0MvI+jG>GwRA7($S;}e7?2Wqx zf<5@4_sBNW4`k;rc~@qAr#OWue@`>pRX*Qk{A<@E=sL>~@^y|SXp93|M=C>dLM|F6i&K zSt5|ZLp=jd-~afzsQh{QU8&YRoJlbEqaG16@MSOL>u64a*BZ$!*Z%n|6OdrINy824DqV| zk>gsg79bs?x+ zD5E3KJlkaP5xnY(9I~yIT;pwpk^cRBdQ#^a2ZvA$z8b^s4dE5f2dZ`{VudDc-}~f9 zsVq9!Ty`LFzxY^CP(1JPZh(Z&kDt` zN09U$vInNIxgxGY<|P9y-ri3)q4suCbT?bC^?j}%Wisq=aq)@WUPGxqKMaVf^(;JK zSU$K_frIu(<`)&`$7WmF=-EbR27xP{o!X&-RBhwqPL~-=awewp`#&);_qwfenHuY)3iq!>G&QgAWIKwd7Zz|c-%+%%6cE8`Be%(JYuUK`oRNfQH{bWc)e*CvS`i=M0sfN)(o-3|uNmK0O9{Ze1Mss5{ zq4l1twRU!;Nn$Xa<^J3Be)tNj{%wd-rLq`7oGBbHNiBcUo@R06UIhkoLY?)MCyv={ zWRI=hJElRK<-S1-LhQk#fz)ZCFH$==_sd@xyFj9CD2_u#P0Zz!S4$o}#`-7Gu*Sz? zBvnvp$5Wf*2W`CZ5_AeXB>h(>l`)!;8gYuULV_SM`C2?tCk@{(nHXmdYxcI%b&$Z$ z!gukVX|c+G{@ptqQ8-nzfa@nvCVk7+%T zcFOdb&Z*ts&WrB)O;o1r@d{g}me^ECMkKwWuq=sgbtksnwkmqcX+2w14pG~VUfYdV zTaHukG927d?)DabY!Q&-J*GF2;v)k1Q@T2^dT7; z+PMyYEv5cxNn%4G-D`=hL`4Ck(4qn8^?QTrdh$5Jswt?u_!Tk9NV>Zms~R#luku93 z{clk1GGU*jn7H%eW1H-NK4Awsfh!*M-d z`d^#91+ph}9{gY}(+-)C8~#0j1=gjUn0(XqGuH&Q-e5^a;s>s0{n-)bfT$NrfOQ|d z@F_e3Zqoc6=a0IB4WL9V%l~zs%|r^W zAZ2V}qL4wd7o4!)4&r!_CwK80NR^%$wYCz27(8l`;Cxs>ck#J+KKUG;C6Q<;q}%~8 z=Ek%mswjp=WEP{$*Ex-uT1ZJQn#F{mNg0z#<^CMs*gM_lnjzRb)(c+f{K3|3?_`YT zyX`7D%IoqGGz~ZWM-ESwJ7}i?bakW17Mk&^VnGs3nz*?%L$XE^Ef+3c27Mwl(LaF+ z3Jb!>_c=p*&Z=+x`(A9~UBB=<_6w+AgTq%h9Y9x<2!VPU?{pK5P9sIJnLGhjqToMS z;XVUQ4uT2KMxX@Gn)kYy$T|4kE%%i%uaw{PCho~UL79bLCBkZ&UUb8CUZR-H( zWE?2cOc-EI2B{@t*geM{s!W?OJ{|IhzTPYU`t0?kIy=gyJym3xCX)ZVRkAt&-wVg- z6`F!VM6Cld^8{zgq@ZE(w=lSWVKkYk$WS;^376hU_Bpz}-uB<@TIh_<8)){m=UN2w zgu?VSXE;0(JF!4c_O(VgK2+X#>^9B@G^y@b(>0=L5@LC)vH1cYYappWN34m#d+S(* z+*~tCfR%C;*6o-7NU(zyMpXDubQ47rBBpZCx{ju*`PPuPt}9j|uCZT+FggL-XHA+p8NbDGapB5-V0|gN6Sx>j+*0$z%GrV`mnpb zFGNHgKFu?!rNz^zw8F4_W^`b?SmF%6D17Gd?Kd<1*70dh0Abe zH`vRE@8yIWa*q$pIxEM=!oVp`kj%k%bfz*LJM-&=bCk^|L-zG26Ta8DbbVG}j7vHN z@w9qrSnQO-DjqVvXdn$*63fbO=xjQ*4W&3`9qdvy0&z(^&v_(eWh*IRu;G7EqnXvM zR1voWRzMEIX!u14s-`{09=PR<-#s6^bh>hu)y5;Ca%@c$hw=M(gi6Q^!bCbu;Cd3FQB0nM{yhnyyXRRP?*_Dd^K{NHC@ zD7B@fGv_H5aWxt-wg`+26*VjpM6{=MSyVyANUme58BBDt9VWvp`y%Ml!M^qBX1Jw^ zmHzM;5EgZHSH{7?V-)W@5h){YMt)>jBqP*t8A&kOAtRs2@e6UpeahhccFbFntUkB2 z)zZamo^f{L3A0M$Uc$J+=nhGY@4n3sR2XowIm_pQSqQ^NrC_gdvA$OnibS1dGFtTF zqa~?|(eR+KW7JX-cGdN>n|WqVer!h6YoaZfW|{+!rrjGQG6UnA(cR_*UNP4gafa4w z6&{bI@l_w;+YG$^S&?e9{wlRR?Rr6V5vFL;1l{yz!?sRvGXw?Bu;bvQCa$n8Fk5C$0L{MISQ7IkR)tWdaS8sp=8*?b!`m0aY zGtEUGP)T!ee72rhWi?{@M+{sYvS#y7DQaB8_~oI?_OO_n`d?P_Mu{|BG}SmO9LBN` z*l2KDyq&?99*y}7SnA<7w3@bn0m0+Bo|_lAM3XpLR>P8}o}bdcNHP*sIf5dcL!|DA zrCG~3b6h*>oS_$kQDJ<5 z{zYpSmQA-31lGUrIf9ev+;sWXwZ@;e~1gdT|<{M zg!ss`;_!MA*&9k~VLCJ822q(K@4PslAVv1*l8Y|B$2=}MX_RqP{qvxydj&q1bP8U$ zZ8e84l>W8x)E@K060yrm5R?w&^l{%Tx+;zP*~e8yhH|M;Q)!Uzmeh#9Fn`-M=&D$$W$A0$ z5*=3>?ETg9CqSm^>J}?MTj?OKHGE*WKj6M&JS;APQ>4GutiYDnxmz%qW zg^WGysYj*B`lv4&sT6uSR+W&UtBaM8i4ETP1o1C6)6|U3sj1s0DIrKjdvl` zDFw9lL(2pk$a}l!W)qR+$0x4HX3?=kib@ntiEou~h(Y|R$P{Fen_fAM2>Us%%2}pE zfSy_EjEqm=#xHj~hqnj1v}P&qbb*1EtE>@~08;1Tj?{X*Sl#f3M(~~^skAmTp^K-R z9!6NkoiDY5^`$eWFTpG9vxVXf9Osf(q%eg?ED53_jNB`uN-il|dK1cpq-2qfh5>=DOL^mU6TNFoAiJn2A{YZ#*j9xJ>$^IgN zuWPP0S5DSWKYHjkI9}rTMspH7XUA@(Aw^_`4v-cc^|T*^I116ZO|8lAIFz#D$(4x3 z7q!M*npDaOx{K?-Ptv89=xGf^7>Dx3O5L(!6O)NQ z6SXT@gDYIO1GF`UZ0T&*o3RV|A=yOv7Uc9}{=xJ?f+dX}C;`o!rdldgX_t1mr-q(J zvA3NV(K}m7UnwvIjye`aW)9ZXpk3l&H9j=kXM#qKWUUgUz?!ibDMUCzAff@U8FK&G_ZW)OQJ-ks@r za>~R?;7P%=WL7JaLYv@CKQz^<7dXX$VFr1B4Y4G?Uc4RYtSLt3hy*8pTZxo1B_@^` z2u4&B1JOeajYg<%M?~iQ4ZCD_Yd>g)#U``!arbH15<3sLoiubqk+KWk78X@=J(A97 z1%xEz!G)*q%MqhVB>L=W6i;mO=jH=6XgG^yDO4Enl#-P4yRcHgGdoNNqrmZdd(SXv zI)v=)Ozoq!9SSSP;#>1fh*{k>IF~IdAl1r2Ew07^hPyLlO|Zbib?G?#q>YP1pFz8HTuHK1M2c8t^^tWD;58C&S zNtqT;cW>AzNSeb%uf;%0?v7t)3{4fE@3V&2LX76S`K(Gqeegzpoz#xGJ!h}N-v2{Z z?07U#e4Eo-dg>8B4*#j_afTYeSG$f|uj_wjntm59^dao;Wez{QgLFqQEtwyunlZ$_ zK}J2i-rA2yLs^`&6E6vuJrB#x3{zN|r|hpx`%o>YKqvuWjS)?0nOLknDq|g@;CQ}W zC5=?fCTYB73SIQMt!ka-6zo6yNx4zm`#J!DHcQ%SOwf*bZt*s(pyYWhHlfq2aGX90 zgVYU6K~%O<7OlYKaYW|h94@SZH{64CcS)}}R@@tBnRJtDiD%PLmBqb%qis+g5DJZ1 znLsHayigG0Qtju(k_JGJ!%M;46mFeNTKlP;Z+^qq2 z8(v?TDq+{1;5B+Rzi?1h-z(zIWVi5b03C8PHV?d6JNfJe`w$otZ*N<|S(|8VK1angQi$FQ8R@+TtGzNGEdY-;>aHD_nw=)dG0ms~D4WM`nV zC95O_qG%pR>;@54A&WyvTgA2*J@foTa$dLpJT9*sfsB9!ug!@_wK{#8<>xiN! z(gefUw|y#BX;I66<_90;i*$DWh%gisg8ANyz|-%~Z^6Y3#HppbzyFjvjt`UU+7tKo zGLw8CP!ePLBrlsUPlnQ(SCeUuO#+%5cgK`y^q zhgya!Nilc22AlXkrcJ9?BIDrGJ%06=k3p1&P8C(zwR7ltgHsvNAs?cI#{@3(O);;Q|l4wA*+U-~Jb==f-&i9|d6v|lXUYyCQfnfC` z?c9sT+M8qGbVU%C?;mQTm!WAEmZ5y04=GL^oQR&|U_vy$j5qKke{I%Sc*E;e_`TUE z%l`&Aru<3F>5YpBJ~igBW=lP#X)e;@^otFo#7h-hKuSqROP;_m4XaSb+AK2L@L&`u zYa#X*9LaBm<_JWefBxi&FHEw4%kSff<>Sfm`WiX@{Fr!tCWrhqb+x3YFwnRg0#U0i z7!BJfHzMuO3~f))K^wMqc@u-^@M(Kt7k} zf@;Of_WjA{(Y3)AY<1LNp+RUWVe@an9%MOsMR*%}7kWvw+b~oL&*z1wLy%JzZdRLOT=%{5yqz@d zM4T*A{$c3=tX)bSN~%WmLI_OT8P`J6$RF&XE=PA3ah4Xf`Lf^l!s^us$ljQL_@RR- zs4y0l8J4iBJE1O{X{vf~dv1{D)`7mav^S%zgPFDRozDNB9~N${bB*U)efy9NwjYZ< zue+aV-L_piLh$?Z~jefYmtuiE; z!p&i{+u2Xji(NBYYdu=25`O81&l01Zrx{-;jb7xQm)M(j`@R~ieU|Is(W_onA*^n1 zZ<*`1!tFSmTiyf=N$f|zA`Bz|n$BRH5$qRo?>-V*Y!Nsw$s z_F@Z7>|zg?zrD~XX=$7|R|`01WQ~imsK+t7f9r4$z9&1jd7<0%98QfIwEVbw<;CAY z-hDY}g7_FCjpg+?7z!^GeDz8k0WtQ^jOm3@R8l}K#+!}~|H;X9m{kceP{NaW_#rPcpIs?>T{9LpaHi_9F+HD1rPpTWQ`;L+V>be_$OgU?@2 z;J?d6c;JJsatS<>A3RXxW=Uib`YIfq@`?ZLq;M1e(d)EKTJG3_oJXkq>s1J`);`#_ zBIhiPf(5qkv4QJHr#Sd%M@*M}_dakGL>DUaWY^60fQ9-_)3QZd5ABFTbZNb5uRqlzce3}&!a z^;YmrT9slk)%D9uZ$3u)ZJxu1R|bNT7LQ#@(?f|ckZ;ovw3sq7#UUc`lTIIzwk8M@ z&v4x8!a}Uy+YH%d-Z+X%vWQjkBRjx z?msxAzZD-Ey}+k#fTsbVR`DlAv1${UEk%!g@jAQ&k7}jEh1{eepHuC!ye(gyY4kR4 zkG;parDk%f+s(wF05)7dA_IM2^g=MPE%{7ZfxEU4N?(_n(S-*)D4Kf1IBVLq9uNuS z_@F@`3~hZ1y{G;SM;S?7q-*mi)?>&b|B7;xkACxz87{5u@!AC7z3aY4ORD_alRq!! zJ|F#aDQHrfU8Kg3PSZ0cBfnpc<+-#lqqrGp_ojEE4VfJNc2g!FfG0aj%%VAbUxmTZ zyf!2%!(-EPc_2_pQ;6*IT%a-l8a6GrI^56F62n@`^X6Zu_iNogBlO$+!cMXCi=fY` z1?97}v>REFKeBt-VDr0hRBgD=|7`piXq4@`d6)vrlI^TkIEPJl!b4x1h;BVs^U?97 zAIrRMG0C4Go-3E)HuakcQJ<+%51uDp`!IT`7RV%g{Md727U6c)epg;MoQ^t@oJI?$ zdA%=2*=wv4gbks@d!}f&X8|*-;_ZGPp6u@wfUc|wG`|id&@p^bO+a#{o(`$tak-`( z@L2!(&G+&s5UhMZ?AtHj}vUBZGE8^!9>j_K_=3#_oM3d!O*D3dfsc~ zZf3eY{<;DB@_Q?DxxmT)3`7TBc8w2L<~QGO>2Efp*u8M-`j$R6AYX@wbnaIVwy0Y> z4MP3))Pgg&!v{GdgaW+vl75aDgf-rUNw>nW$Y6JZ-?eXd;-E0PvXju$i ze4ezygNoh`5O2B67k`kE5ahGnmQ-xJPbXn;vp8HdHb*+yk4(_$ddx7?XOs3@CC#?A1 zkc7S{8y$4ZZH_EeZCmOFGjkPPZ)nRRz^Xt_JV0km$_Ne?@WG?fjBqOtI`m1KXrnW) z+|{ZsQ=86$mLYV1u@3ax{n2Bsb1{U!#EkF8ySDH78|m$BKjObyun$qgvmx16t^kb^ z3Qs1Ev-aaO_p9jFXm)vex)XTDomcS!y6Ps8XGcT!dFo7lRw`xHuta)e5t8S3;zp=5ow4J(_V8}<0Z z8f<|LF#MDbbT_6mH3Bb789eAf*(!Xe=UMK>*XEh28LBQB?ADrb^{v~TGG^#rrG@Ok6Q z69f}d_SZjSo@-uu?Sx1~?tsCk$|1&F>zwNLAo0K9-E6?u9s9T+2yxy(t76u)*=_Vg zrET32X;YKtNLU^&M|s`*8hF)zzoHYwF`U8}&7|fn@$%|){Qv1`_`R;|HUPA*bj znA0g}m!3tZ+DO~)km$g++hjLSMyvM#QVq=Qd!M*yy9Hi=?%#~^y|J9^!XD>?VY#HM z%OZ}C+D#>kB*R#;Y82R>k|-z_ZOFB*V849n7rOD`=o>};v>`2zOglKVK4ul(SlA3n zKeUX}U$(hJRe54{9X6DsL($th4AMXSq3!}<<(B+0WMpkt(QJn9?Oct~%8~NJbHx%@ zc~ON7p!rwLH+H)kZ%pgLDE78O!Y5-Zw`AkD-8;2IF+$g0?+L_rCm0#1EJf&sl6V?e z0p?YXu4s1Oi)(ruM}pZ~ zM$J~{6Syb6aenFc##pT~xuay9635TNX-+*us(VhP_4XtZ^8}j+CtkZJ>v*=bI1hZa zwoUaN{WzT$0(EY5?q^>IyY&EL2>eoW{IPyEKDDbil2Scg23;!j?fT%T+xeXfz_jkz z`sdm`ehjEAJzYcHQZt-1g61I`!I%&kv1rlMMWJK#o*)Ap##%w7uL;?-TwY5n6uocQ z3(Lr#sq2x#El*P+Ze~0XAV&Y^uP(K1g-<|^&ss}xhz7~=ajDV!p}MO9xF02<2cTL# z-YaJz;Of-ec6K{*rKoxcHdb{j#y#5nr;J%wcZ6TAL|v-mGP-BHNo^tHC(5ZloJ>v7 zSM!Wt3Qo)FIMqu5@ zv{_8iNRCTE#pNT`fu)vc;v6|m?c-8JmqC*s5R>!a7ycTO96_BSCS5n&k1AP)LXN~r z#URAY3tKOYoR1#wsZ5`YhPy5FC8TSKPu}1i_O5>ebkYv2E_7dfbs9^o`(4BCXk`@D zFch-HxX%??e_+~%Rw#v_MrajHTlzLXBYhZIZ#Zx@AE=1 z^+L6qYP}C0gjVvbpBxou>x(nsM+$EL}U^~A~oiE3~&TXk=e z)(+nC8HG=YYdU$nB{+XarQ#5bAmo~;C%SYG1Y~)yBbYe z+m?a^zIR!&E^yo$0LT^Zf0R5fe@_j$e`2c4x%U?kpC!#MT9N{GepCu+D@KS- z@EEk99J7bS&$8-vrj7^ z-n0lH?X4(Xc@5s6FlC_SI}cs*nyZ29BaOd1{*l6er;Ev!-$oXyjV#TEw{IJhdg319 z9DTI}x>+IJE=b>06!;?60jNqC;N51_AL#$Q75qMD>;Iehf8PHe^5fKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z001-?4^fODK!AKOU_^id7zy&xL4r6)6eNV~I5d*jvK=Rqr6>|5S`ShpMRG0N8ps`}Tz{w40tyLE}kw|oeA z_ulA_@bzxm10dhw&#Qp%?Cj_h?|bZ%r?(a#iq9Ya4XaChb9^;8__taQ&Nn^(Xcb9& ziXU55ezdgO0u=e?8!5=Qe$TfXU|Ptxe;e=T99zqB+tL;hIT*&5UU=ynzj)=!m36y6 zb|(#x@33(-cipMK{1^U>|L`aN^-uiN{r7I~2w-@-F%r98|9>a+~N4b98hxYL3V&24wqc6)U;6p}z3aUs@&<7OZ-zh=B1 zac@PM#SA2eLEI2gaK}Y(ugwf$sAhBA3{k;t#I4S|+^geQEJW=PNnnt2=B;b+U;fWu z{Mo<#sZalnG7dL^G8y?KxM%?qu<93EkNkP8&V~KCd@{}E1I|BM%OWRF^>C)Xpg&rIUAi4QjK_p=|#B<%TQqlH$c*RX{0lZ@4KJJQ(gBfn%SnP5aL{_Af>H40fJKz7r z;;;Nq=g$4Z*WY~OGr-}U+QoOuMJHhS!S`PHbMHBG^WOD(K^+yO;xYo-+-F5oMl^PH z%BkJlwg@!EV=h=(gQm8F6!QvHG%sQ|O51^TBw2U|vwf5WW);;ANd>nJZWU`g#of?m zKs zI&3}Si;RmP25FfQiyP(r3iA=HB9g%k7Ymm?3aRTb43SKdOf6TDq~K7gh&X5ghA@}| z)NtDf)jXm>q3zbTEA7}~^r0Ok6?Xx5%t|{I!j)4ipw#tSiC#6!KP&o8zM(Qt8h~>XRv~* zqJ2gMtj4*V#gUxR=89>tnT^I~7}*<)&Ec9;D`$Ig6Y~|~8jB$*R);tjrNuPnAR0SS zQg{S2MEiLoxeIP37Ko&9y*1o#!~(IVJF)nylVYQhI*=@Q*I@(H!LZtnq*54e-Q-}e z=jOrC1E<=CkUNo1-YElTVClG)v9QpDijca5j|FPs{F8r{d;i#9VzJzPSKf3e@Y*Xc z@WM0yoNo0J%i&8%+KO{IWy}S2eJKW>+!=K>Z@BS<7?Qi(XS3XZQyDbubJ75wn(!U8zIsUU!M)nU5Njs16T6u_v zmXP*;7m<#zrh#<07tE}=Rcl9r#qOMfCt6Ws26%#2byYMcydx?d;3z;bLQiYjhyXcGF}Ei@~` z!A(}@-%H;w`QopCmbcz|i^m^-oXutfz~0^-X2!w60cOU|&JM#cP;14^zGWKW?i?N- zvR)tZfhWI%tw;YV*Pk!!@@z!LgqyWmQB7!C#Cd83(Jmgdint(}Vt1S2E~v$h)!emn z8**29r+P8>Ip$169l-{AMZ^c7xw3QnCOEz7_HY0f> zBu#f58M~uMmb-|e_)xL+fMmtSg5+2O!!VFiqU$<#c6K;>_AIql4i696-rnZ9=bq!i z2Ong!*>LXMIi7v?SuS6`OiJk;4P0yG%{SlV@Zcs7K6pQSdq2+po1bROo&j>?sV2?s zPDq8v`Ano{BDtkZ6{JmvM`i_8+_k)KERpo6>eNT;O1dPG_lhg_w+p< zed+;Tc=1g}Hw4EG$xPptLt3HA$pw>8xE?v4rN{QEAdkuHz z;>C;Hym^x=SFW(xY*1CMUcJiAn>Xj3{7zRX;eNmR)ff0Pe@6J=Q%~^fnV(|+#ZS=> z&xDJvn>n)8)MJv777>TrCcYPK7?ZVgI`ZmpAYtf~Gpd3PucBG_+NHujf94R(_}Eih zeD`}cBzv9Ir2uX$kh;_*RP|0ByWhqgEaDMt3gUuxN~b+yaYlXYV;{rJsI}g<6Sudw z8HR!T@4tUGrn~e0_rL!g3mTK#Ua!}@_~MH^{q)m(>QkR$XJ?y~m-O9-dCzWPSHDh` z9;qAf(qP8afRhx_yaXIMBh#w!`2ll}M_T&Stc_|$J0*9p$ZMQTm%B*YwLM27uh$-A z4A9!Y4ds_R?4n)FpbR5<5bAP4-E63}Ai(bKE~%iDf7j^n)JyRO6CZ~HwFVP|KDr=EI>2OoTJHhd|C z)NOO^>N9M0S4e$_xX;0>H{4mYk0{t3uLFpqqs&E#)I|>Np2*qJl+m0hlKA}>*IeBf zau-J$B{$46m2Sd&vCsh;c|YzB20u~ft5jTS54CfBCy@9%T# z)-85-cV~llUB`_ZH%KXQ`t)fQi^c6{yDA3<2VA{+l{06~gaK2UcX!|SJo@OPY;SMR z5xJ9j?FNj)K<*Y;Em5%Wg4Y^_3aMzrtKBMAYJ(nWt~qL%ZW6e&Rop5fJzu?Yp09oN z8Me0;xWkv9zs~;qp5)x=tGL&;FysBpx-gD%TY7jR4V+ZT%bvV4QdUymqiIA_cblSyRuqz2lZ5~3+`sLS%s+n%Jq)I|v$cI8c={wlnBh{!SZX~fYkfW8GQetm!kJW00nK6zd?#``S zw>W+Jbc;6MVezEIYPEXD$NIjX-+uy5y1rxCfmv=Y*XCNWOGBXCF&n8C1&Bzgruv7s zGGJigM#XBy+$g28xb+O*{~eEE^$Bp{PkiSVviDWISQJal7}smcx=_c0mxNV6;RbFb z3wOmNMVT)3tt!NPo}M{#hLjS+FwAG_VzJ=VsZ-x_;f&+>FQmBmTrKjM#gY4tVePG` zKYc=N;DygMVj*&2QE7RvBMM@XAG>Sp%B&#pjkgA#d~}P&_yT|W`#yl6=)nt=e!(|h zx!H;s@mk(;Z_VjgK7K+CECRX9^t&C}D=ByQFf;(+Xtzzftnd3dW!m1}J}U6P&2U}U z{okTm$G@ru_AIJVk|Z|+>(T2=!cnxWgBaksQ8+TWi?X7Va32Fxbmjcn)12Db@VP&@ z#fz`+qXOc;87Yu1uxebox?y)~#kq5*kz7cNjFk#1$ep+Eop;d@P{j?dqeb9y>@UkX z&*$tr8FMnYh|FhgN&ys13*hZ3*4qs{KW+u9V+2Z56zJ(#X>j6f`CJmj3x?n|2n&vY z8D*^8d;T=v`^O&RnXkUiwf)iQ=Es%_0`is3fU5 z##F2iuGMt@hhY;YhDvHRVFlag@dwZHf%knBG`DIJh_=`8$dSwbs|>gHNG%(v>q3_@ zIh{N#`gpN{YEGqMHc(53T&UxKl}P+^&a-mn;TPmcj;$*m4z?m-i=1t__4XlpXSOeA4L^Y?3o8XF} z)Ui%gW@iy6u$VyFLLhOIfh~2(xpp0_~3&8 zyz#~xESF2ppFhv_>(@DZ_AIw<-NM~DI5^<^`ST3Jz-qPPrI%jf-h1!mi6@@84FU}= zSVlGDbR?oS>nP@N9tuLsj8L3f3rWBg#1+>TkV!{MeIwb$5u|yE)hQd#aU=nsYNq^C*XQi@SFwWXap6N&w8JJH>_dGjW#)r!NzL#|x8!r8ND0l0SU z8r$33tX3;--n_|jx#ZTZTbLPpdwVRGOE#Mg?#`7fSJ>X(p1s1ngBu5|)&Xrt#7vKc zIAbMtvRNQm-T)42Wjd0n1(y`BNq7sqpxO#3B|Ma<1{=j2qtl#PA~mzos3oXEC)~j5 z;&Jn&S_CU?15aV}@jz(`o+j{P3Z#zze1bNo^YQp&Z~wj977&hk&|HnN(PM)`>jaJ* zI~}ZytpE|h6|GDdjE^*bUaNI3I9N6680l8h4s)Ap&mh!#lxs)69o4my?V=mkQB)vH zBh5+Vp3WQU=Tb5(=5CkdorUJ)#~%PpGLq>Z!Xq#W3C zEiE3<6p$r`h$E>BLpO>pIIfPkk|oY-B}Eys0$zf1?Fl*Q)g)`#h>K85oom2W>zoH4 z&vm!9wq_LS)TvV}77N^+ot+(4s}+mIVt&rn*47+NFBS__mA>yeb?OwW)#{tlC4m_` zu40Yr9%-DIH#)C}w+Si=aViJX!z^}outB0qSxXadEsxiP46Njde!D z>ZanRGj;dmrb&YI%LU!GkXpoy^^O00yL(nu9)9>?mdhozR(5uF*xA`ZMA+WmCZ)u3 zxnz5Lo5fIrVC_nggukZaQ}hEcGB=qsJPOwHc~5R!0}dM+#3f z?XskfY1cU1nPkmH3nWoQ7OloBND{0XCK0bo3Z{s(5}~-zt^WvAld3txdZ3OaqE4Wc z5vyfRrX~ZJ88>g<3_@Bd+_-ULt`%Ruemx2X?(FaHV`i+^Ys`#c7}(j_p_D@3_guSn z4Kw4^sZ-yCbd|AC$_5A`JSbL%xjri*4W;lhRaImh$gX|ddM&pmTh>NcW47BqFuunA4U(blvK*E&br9cG0j?W|P= z?Z_^{o%Sf_izafnikh<3culRC2qI->f|xhNOf8;QD|L(wMS$n`KIEv|r#?+n+z_Vd{0YDCY~TY*0qmf|V$U;^<{RZKukFq=9Uw53a+>Oq^XK?$a%f)RN` z&Rrl^rJ`MriQ%Ks96+RcE|5+*ZB`M{E~9-Wtrn!N2NG^0Z++$G*tzcuTwI;Qy^vH} zv!yp$tYSX4W^kKbxoW~CMaxN!l*g^Kb1J0@p<6c~j-(vFR}IZM(5Bi@ zB>_!++mRjGEvVx-x0aZd8CQ-va4RHCd3p7QSw`yP)-dSSvnmavZfm0XtKefs9$vtN zTFTr(VJ>K|*t$|nIr%PHMMOErAgH%Q9CDNY%)pq2(mRFS07PAY;~WwGjUuR)U; z$0)LQ9blxqh+nKjK#ZCZada+J#2M%ANWTc=$i~QVYc!Xu>Rh_CS|UJd-00|H7+X~+ zf~J&u)Ez5hYfVwaqWmf75figGZi=L!%hqv>K6PuoPNHZ|$Vqq6)t#XZ6dTEw=Z3H7 z){DoJgVu%(*G9;b#!KEr6~_>28A;h8DRnr+dLwtsfDTb?9Pk8La{wt)NV16Mk3+cG z)?;n$oG+sxI@NGfGujwj_l6<65j(jG)z^p|l?B~GvcZ+00F?;TtVR*Sip}}HizCS? z>k(U5#?s1(C)vPB)N_|fT1ncWolvc|s!byGu_N6o)X9};1TG?YZRNM5q(wiAs&tDj zR2OLKskVtOg+_lhZ(V~XNJF@g)O0~KWEDz5P%5Pn-4ohPiTQ{$_o*UCr&JTX1WgtT zMFCfD5NtGzn@1_p%*fqQ=Z2R`bwR}=7RfzTHsk|H>4c|AeV532iE$Wbj>Xw0DdAP1 z6zXQ(ILT26APM3TB%$C^sdWr@j71(Ric?xyPlMwuQ-^(|HZGMi9!4!!JCX>c;lN%? zi?YL|o7d(wv~~Em#e$*U(j%<(EVWW+txcyzCpZMLc6Y&@*ML@nkqM~K!Iz6{f=>|sLj>I`Q3DI zP>%r2G$R^mRhqOmBz9saG(0$rDkv&}ok#H?wS3lFiO`NjdMxA_#9OVIglhb*)j9`^ zg2&%C8pQ&Gx9Vulv+UDJHLz{QYE~Q{D^88BJW&(^3_#JW7$sb+IknMckbwI{S}@|# z6J#X-gK+afTn7(~7+S{yn5LkYs5EdRBp%Er(4p--k-0Z`LeAoBwfXbB;TQEO=%*ILsWtyLvD3rUKPB_PcJxT1IF4tAm4DFfHtj`QF1`0hibj{SY7bS3!5 zWh8Yu;J#wfwdam%OG|`^FlmA&>g42M+=daQ^9 zqj5q<+~c^gs0`7X;-(U2K#Xn23g9Vr_*50Ls2BwY%dtA;x{8&ivV&j^dapG~hs8U_ zlK8FY5wx5bdHvLK2#y+rZ0!S)rDJI;`=sq1J&qZh}qe;9VobdkeTG z8cy5QQ#sHjqp3r3BBc&VJ(^Mr`Z7!kK#k1rQ`>1Rcpb4i1~gkoY8mk|M)7gEATPGT zoeQsiVe!v?=egC3S8tsd7kwM)&Yh--72;;1p-rXpLFP^JAhl?A!ghiH7f7PuDK&#; zRKl>L-JDYgNMwyE67mXjKxEc{2o0%*X2@7ujkQ4z=u%~tZi)q!NVLAyZSAG;y+N zQ%`kR_ZkbLVb!w|p%9&a?zn{biPaIS>-btWP=;vs9tXl-HieuP@gC_&PL(JjHC3Kj zJx?68ouAT<%ZYO&De`1*uVEw965WSwfw|R)*lTUEf&c|)1Tw1XP0r)w8Q9%*BDJ}; z3c$3}43Y?SN^hE`4`Kjz_{MW$|msHGRE0hhOkLXmnLz~76-NBLTpu))Ldpe6I*`|DYc-dp-tYRU=7A% z>}aDl5_{-jO(Ld>DYK4ch=#^{ku>;N+J%ssMx-veYiU@Dl&87)W1Y}AwW-=QkA=-@ zJ?=gqJ>C|QL?J@l@2pP89W!t>_nX&Vwaah5%GT~K4ltzYY zY(_~L?G~h@s5vR>bP?Q0ZYO=DAXZDjf{pK08u!X3nFNmpxJYv*ta8eC!^ky-kxg^c zqwL!Iw7go5^s*)bySqn@U28LNrMBG~weJD*67<+6S_&1Ta(GbKYz`R9crsmdN-E3c zwtVCH=UMbS^nGQ0aFfm6!OX108u@Kjd!5{4B6W$B7Uac(+$~7`f^ON7`)#yaG&*XN z2P^|+Q?SP5D4T&=#~}JiAW>0l2=^$HYi~wNIfAQ{I#k!>u1C9plrt%JQNPuU5?n&Y~xCC#QI$!vp}L+LLmJbP>Jg9A8O6IW>#!{BZpvHvOw3 zwUnT&Hl?~*#<`_Ib6ne^<2dINsy&iBQjQ8$h^3~PwK1vVM3mmzNo$Q=TOu_Ig1tq` zWHmbZ-B3;R%O%opaqaSJT)%W#iWNVhXRu2`x#zyKIBznn_oxTgsGD2i=8m1a5&j4w z){5*IDLt0A5Edlwki5W&e_~Ozu;vEqI8etmwQR6)gAHp+G1MzX3^xfxX#zZu04xx+ z%Sh_!a!1KgH%{GxntL>Nq?FOLXlY);RGCE0y*84a)mT^-5xmzzt%iqCWt1(=@UEw@ zBD2fcGYj^w_0ApEQo4gKISCLn?+kC$Rm;!>rldN)=tr`z_Eh5o3~B^i9X=As8nM?Y03elngUYmhL}<` zpB48k0F6?@OVV>yw9lE>#)+f+KI}D{XMfrdfr*RFg zKC7pPfcCVzQuNPCZt{WwXrO&_t^KSJ8>wkyExI?+ZyLsIL4QrmY{|%D1NaY}aS0HH zhDc4o$uX2na%fqrcnicGn#6muOy+`vs|6lKL%DUXuD{K$Gsl z)+i%24M*4qgDdx*uLlUziJR%A31fp#o)vi6)#CeR_*Zq)I&e)|>MJ@ffiFpu6~ zFPrGFYh*MrCt7!OCc{N3twDxe+-xKTKp_o0sn%#Yffji){JdkQs?=>mG^YNdNOvSf z@2)lt4Kzo9*Qh*`RD(4tj=0a1SH3w* z<@MJO6L)ar&>fTXzrNw}Kl`m0U;W+>KJ!TCEmqrG!C(jsGrIhxNgB-&7sp^sff{{7 zGXl~oJ=8Ix-EIM$L2leA4T7CnJ>qRO5$<`sjx=SRNdT=OmqD0|R#2-pBWxh3O<+t! z!l5}iBX%vMoO+=Y5yO(V0))@#ja$VJD#MixRWI;szxmRYuU;u%zmuNyP9j;OsBcbf zujn1Nc4c;1DK)x_faXY-0=u<9k0jC-v0ybuYT`3`Bx!+a?Ce?#s)AUGYEBLy!(B=J zRCdfqGn#0u3vcH)($J}BG;>e0;CCP#u@JnpQ90EcJlPgXQ-3$7{a#ZDXwpem3>#a? zvZaHg!rBwL*EMi(QlUz5kj;9a4u#Z>!FWI@DrlZaZW|;88^UH?t7$Sz6cZ+Kli)(< z)*l=swu#9&skt(?lmsJ=DwfYR2 zOpC_HV4=88qyuXmi8gl?meyfd2V?LN0*989YG7Byt##bFO;nZE&M{g89CV^D&Gq4+ zuiET3MI{=&@aXb$YqAO+_2Mb777dA}RzRp;2tjq9m2bSce0N6?DvlSAUSF5nrlqy` zzY+Q3Ge~0q2r@_i!J(c;@x*7gNl|vI_O#mT+WFS>AM*623SBG%UaA<sY9hTXPJSvexXK1b$3*v+~}HSl05EA z^U_p;gsz&9HfIa-Al)^ByqnGjwrWi;dIC0L5e5yYHg-wV;%V(MmDusKY*LeI!aS;9 zNtUJVqS8ii;m^r07n}b5P7#dx+qB&tT_`@+4&gK$f&PSZ7X%?W> zO23*)s77&+5@X`#XQo!rZ@V)zJ3`&Iw#rZHGIbc*RJ9D%QIE1>^eDBCe-WgFvo^r1 zlT=!YG|_W|6nMPH*BhxIcNueM+>FgFJ9P|jM5;5cE2VbWNtbZon2c2!jNE~GJMZ)u zLt`ez1=})evaP#bAopo@zbPwLkJ6M{Dk@ISJ)W9&6^+ElMCFNj3sHxi+ zlp1Z;0+_*_YCLTj0^09j&ORdgMOxOr)lSp=Hq zW@B`bQ(|<(#<8_H3$?`AJ8N>eqekTIBHxyY*>_xRHfchW(x+&iF165gZ9GjxT|jCQ zk#PfZ&aK{K!Q^OUbJdtrNF%!iY#F-F-7@5i#M&;^5HvHZt=%+Uv9`1&&VHg}v2n3v znvLl?kCP1|JZ%Ts%%()9fKO(An7Uv{)RIN0UXU)lN*yPPkfTY0V|D@!e4C5*>Rzis zcQo=QRNj1QyCroghFOS4Fylfo3$UX#jH!Byl!J0xOQaj5gd?O*D78{HLqj=*l+!#u zAZMpqnWO1ieb)7mHcZ278(XUaCiDB1O`%$}u!>u_>U7kjqynW5)WcXpK@N;qVjRmX z2T@0(nvmKNGz|4bs?FZ!qD4hg3J}7Z9DZ8n)(LM!EE8LEX~!6phomn^`UTAMNu)N`b4ZGnVv`)rMK;1^UbEf;hKDU6^-14 z%zvoA3$9Jk&V{5AS=P2nxF%OO5u^E(S)|;%HKGR?1jWZOvaKtWEfi zTN(T)98#xPDO3k9M$XzqQw(e4Z&ZXb)aZEBHnX^T5cMp^;CkzIP8z{eZ3ID4p^lYt z4B3AvaXgF&HWW&&A^vir&)^g{ElEs73BWndu^1PqE%!9Ep;)59Ll(4&rATxkYD0}Q zM$|+BK6YH!C&(H1O1E4#X@%HPN@^6`$hUKDwP8XpQbq7CN5(r*Y$2M>T}b^z(i4(t zt1(Y}?|4r8vv5~(mZsei{4!0Tu2c*u0X}OEc1JqtGD>9{xhllYk(TUhpjJM#V5b!f zYHi&R?Z#PgQYYj-W1HAXL8dgUffHDC`iBsE=zx?^9X%@PnNf}!5(01LP+xwE*XfwAPf0cB$?7Oc_VCO)oQQ$T*m{*3n=% zPOYSq(yL?*0)hFF{$wN2dl`e0QynifEvy_~CP`b2eiTYedWuR|X$ta`LGHU46TB6J^iV(Y(3p7P)H?D_>phsu0;9renZF%pM zh8g1+o~jNt#L@i3E8QU}DOpp%c@{xOj9H(`ZAU4J%2bvM(p*9@D;$i%^7MV=E~JJJ z4-PPQ7KCb$oG-ZY$*pRyg%TxETJarGJe&Pu}_dotLw_f@^l4wKRBDS|cargoPQhUwbt z2Ujc>be9rcKJj|d7R2sS8P_AyrC3p_aZZY(DN#hRF?x7%muJE7(zLV6db|yoKfO$> zxViylYE;}?LwW4yFE!^I5q%v@8(rD>yetGUOWyVxs+9-yvQ*oheU%M8bdg&I%BD9 zD3tO?U}i&5QzJFXO_0+)kRMG!-9ZA;(&nL6BGO*uj&Z$d&DiY&_dORM`!EZ;&I1>o z;E9j^5CB)-dV?3g{OfG5I+BJ2@TvQrF)3 zb3FHdewqh&Gn>s2i?;=d)u38!1i|2ol?vKuw!=_KDr`0*HP>&;{NOvihBR738bvk> z(zKEzO^PHl`nuCxFIJ6R9B5-An0d_ApXJuhY+QhY>u<6D;%{^R*;7Y#W9_-{*oT`- zy$(3<`OwGcb3@gD2cP^HRr=YJq(0v!M&9*HmfNT1c2iK^eC9KpUu@V~^)t6yRHE73 zDq>F3sB2HPVgpiE7OOaZaw9V6NspotEGMB$f>aAGv`ljhpkIU%Ts23$us$fHq@-0B zIIcpO1;D2$`VxQtKmTcRx8O&9;@{`~N8Znq-}6c8kN!1Y{N?|e+GVV4SY3RK-HVR^ zuyg7(KlqbB)2c;t&no@aE@vM7F2+}WhnzE;iTm85=wJBs-{!gB`*l9?ulyxG`U8KK zol~dz;h+2)eEz@x>kNlCX4xf5Fh1tvJ4Hcasw3CI@GM95V-c$JZ7CPt*(Ky6ZZM8U zF=H5w>M#^z7$P-UZwkW@gz=n%jaUiVOdUqXO}VY=GHy2LmFKwhJAa?w_+S33ImEj7 z#3zvLd#K}vGH%$t{{!rve_%G&W;3wa46HW;rOh7h`X%>&@K196+AW5|k-91Pv4LIX z+BeWwf0tkS*`Mb64)xR@71Td{Mw7$ z^T2yJ^S~2q-S-50U;PZS*x|xs-#y>HU;khK9>4#Ye@wqzvUl?aAO6I@%AfkNe;a`F z4?juTxq#VzQvo`<>D$YW2k+VC#zEnQFMgKq`Jq1#z&#)Q1UFy&d@wi)lzK!UoEak% z(j$r_hbj{lEC>lHq2C4r-_adh-Fz4;>-9(}0kn@pi5h9;NJYIEo6*?cA7UpJqgH3L zE)1JSlQ~v#F4gF|j>9*e=itg4&D}5PPd~{1&3#7S;p{^n0$_cx&)0tYpHg4`O?dgY z(Qo_?uYLJfIM@$$xl{MOhcgd-fbnoY*p|oAq;ag2&B!7-uYCD8=AYmDzVBijLbZLf z8H1W@m0>81n@X(_P;CxJhIQfKaAZA3t#}*@L;D@`lMi%A&dOqu=#~l1DZl_x7R$_H z)kj@aGpjBK7b_>aMP{+p)8#~$WuArxG2E)_I{GegYInh_U;V=T*gfz69(4OGXC8i> zix0gIfX%^8%H`*H;<1N$|^|FH)duY8?LFFy~!YI~OlKKOBJnzTXkoF?V22UV7R z=GJS^&F^#mq4%>m|8Q&SR&pP}g-WnAx}i64G190Zt2o10+3$Aw zrROex{U3eyg?|rt8h8^}yT7{w4exNVA$D*yV_DP65IWIFjcR2eIvp^_hSn=>g5}^* zRTq}Yd0;nk=B`U5oH`aH30s|T|8~YtWin3k%Bof#+U>|W&Tg;9rUpznjix=n({W}i zc(Ni#43G=kiL=Y7YUL!9b>ur4=fYOzTpzXS%*YTV&Z7=ObLtqi;Hd+nl=!=Am6>=@ z3`jPoizm3?A2dbHGEX;|^4^%(8SKWcQw&2a3ijS;F4N6ht`_9fh4}U)*eyX$SIwjp zqw7SJQY$GZR{b>Q2Fzrp-(rRp=yE2v_Wnz<)UjLx2a>K6!e_TEYhh2 zqEu)6xr;s_Q7Rsk)v2K@EBy@cSNg`bjG2&?q?4{?tT!XtMx=E-vHolg&T(l44bhWyJvnf55m`Pq9imMsptUV&nj{+RXhi!l+&i>CoHBJM zO3+=6Sa^;H+-Sis6K##*lbc=`r5+pF;b0nWU%Fs;tSw|6-Z(tu%HhB_t{#2`j#W5L z$PTvlp~qLR?EluUJ$>mT-|^t7Ph38%oZZ=;!TjUEMNC#=N0J$Ke}nOB4#jaqL}uN>0~4h0@RHnDutm_DZC(SFB{y_OyO zz3DTX!QT3i>-+nB{qp+RXJ5Jgi@+hFMtVp5^}C%WP2kBka6j-q6?yNu-NkozS(j!e z|Du)gPOjkHTzT^U;<5kluYP;T8D&KuuiYBHJXU)S_!{skum_ZPIZL`D2A*=^)4;vJ zJix6|M|mL?V8X8U7q0jp-*J1!gahy0p?snQI(2kdhP z1*7l84xV#l+CUUvsPaGP@xK8D@o(lbVPE(MpdBQ&oB;q>)c*|-Kt>i8005(4DI%h% zXkqVS?`&c3KqMt1Lge6NZ)Ry@`j2`eTg6;eFDgZ71 z7d0_7l5{w6{yMr+KeCt@817hJIB0BaKs34%EnFnb8ss5yL2Phgc;v*#o_C@3O4rNr z^mp?r|4G$DcH=B$9~4}QB#RPT09?5+0rGC}=+MaCA-!NA44DG}398YA*!hbT1n}y| z%S%Jj2iXGv@mPd~0`$pc_A%mx{UDwTr|W_Q`~m56iRYAo3P1x0dc_Kt00hNB0AJFg9__BHPg!#M5Dkc6aXNa7f4+vg!|Z!McW5~*AEWthy65Q z|07H`G$4#53}X_2=VU-t6(md)`r06fcS0*mD5kz z6$lL`GzNugNW2jaVic)K8ViM)9`Z`uFA0VcMMg9pj;2H+6VE2eq#UVAq$Y`f&*$_X zSD3DNM?B9MfH~+hv`d01DX>9_Zwanhq`iy-=Z|;+?3{@UQ$`#{Ugn%r6AoWAd;ZB> zr3KKn;UYsEWGE3L%oOc^|C6dOQe8k<5MQuUCOxAq&t#RvAx#|LFtKicy$u<&nEP7Shr&OM>lEywlI$}M7Fim3?QY*|*-YUyiMP`fB7Ou{3 zQLa@AD??><&ET32#*mUJt}aMk#IeA%c(JTKb?HFfN+ys`ozqyDJd-$0Jq3Mqhl3AA z4;~FSr^L?0g2Xb%cE_qslP$qsjKUsOW#nMGNIOYKOt)9lq;8@1L64t+NtRCjm5fWx zpjuv0Qn6hDtM;HasTx=QTgA6VT#ZHLpd5NBrBbaTTk%2#SH--Xr!1_(yv$xzpvX__ zD*{4mPQLn&WGhi#+rRWohbzU*tC04b?ssZV9VwJCmudbwx^Qie{x`rBbED zMK^oRRcUrfw^*mvM<9aGs5FHxg@k$B40!g5%DT!{DNHGb93S^n4Sj`mF>ZdRsC%zn z>2+F8&+mX7S^Ls$&+e0VJYR+{)i2xk(kBTxO^8M~GKfvM87$smHb;A2e1_4@J0%gl zK|zsX!(_wMy+85o^Sp)2;xXcg(Uv2+2V@7fBeo-jzaV}Q|B{hAm%GkTmTNDeD&djk zksY0$nl6}LNoULCV_IcC$vnwi&D?1<(Du-#Z7FMMGnHyM)GpDwZt1cM(dN=B)>PBh zYZR}}t|njUtnMsDE^U`jl&{QLF(0hEYZ-4TZ^f=VT7%fEX|ZkbH8eNEG;bZQ8N5#H zPW0{Yjrrn(gb!OssKnRC_j7J?LgQBF-p-iGx)$&qeoQ%IFxQ+#nq6Z#XhEH%8nVn* z$y}5$$24zu4t@xaijWDKq)+9i&%_yJ%?rThCNo;^RQV~0C4p@E`DUY%_0b=}&R=wT`t;Dh%4^=!fix_>=ya{CNG$14;wPLCirT0)+x~{`+|K z@*(bx72w`9eQsF45{k}i7eW_`3#tw}>aQlY7`yyiP5g3_HWNQ%i4dabce*kMX?ScH zHRuON5fT=n5h@Vt5UzpMJ`WUe-VuElO%dJBG-p!as-=@=qvo%mx8mL4=wR&- z7@;@Qnp)P()|9f5!Q-N*u3@*c>Dl?bdI;Ok-iJN##!O=v({u35pBZ=zDa9zKN1^3T z5tI#==S;d4LZU9ih$g>BbtjL7@f^S(FehP{XP*yW6Vat6kiVCtmh(!ujPGLeBpYTa zrafx^Ls9;>OBP;sE0a41Bg2izmYI*cn<+RU{;#8O1+iRWi}|_vv6JU}DZILb1w#y2YR~o4`e%-&kLN|PKdv!KO9^ZVK8?Br};Kl(SI!Dc~=_lfb$juoQ)O$U<8 z-h$Xq)Co@)&y4PUo6CK}<`Jq!n?^=0x4!MU%Q^3N;-bQ6XI5uMO}nmj`?Xhhv$xsH z8Ey{8%+_PK=N-n+%5n}D-&Xg7m;KA|%hL|VmY);F*UV(+x;w>nb(cby{-fZP(7MQ0 z*s_4mH*oC+=x^2Mp7$^hlz4#%37-9qe~LpC0gp?Mn+$~yy~yF@=i=HIaQZs?EESnG znf;Z6`CafmS%Zne;P<+Gu{txKHlLq*pPJZf>r?!7-gkjryE!s2LeMkr!NT^inN6G;4iN+aF zNF-}O1WlwpAyy!(7m8-TZyS0z3*JGz`*Bg~9~#s}D9CuBo2Dcxz`Db8Ete>VP za_q1ScH?R|ND{RCFX3MJNGzt>6i!>dDSBshOgQy51_l*=T1dT^qY{uh(g@2AzDRaO zgt9HB9x%mZ4HXoAVAcjrAEXoF72O`Bd3nfASFv_QA`|)iI0=r)eeyPXzTQyz=$7|3H!FzK)B{-LBQ3H`7%`=B=Ssba#8H?P%3r&o}WVzM@8>q%Yff& z0S6oI0tt14RfVBPAP}cEjmF(s2~T3Ido0rcT49ay>7(+i0~s6NL|yQf395{20ZLVG zU5nGyMv;Y@xc&IfAogt`v#lEgQ6E^=5XCyzi%)zS>IZKW2%GvlI&?jL4Fv3G6<Q8=Z^#x}!iD0KUxkLRlyG;(&IL9D)sE{6d&4%%6l zMvw?lftgKR0K2L#cx`Me1P*;?vvj3_H%%lDO?mEbSEnV+ST{YiW!9P$hlsNr+dug+ zaG4|HchHq?aluDQe)z-PAyKxO(OKwIgRhb~<@FC!c=OSRVgumbF}pHo+F;UVv5~vj zh-lN!?UelNRhUIk+n5^wR}0p}TX9#DE`2RRborIR3U(e)+WVey1usm2DtzExPuYre zHF^p%AX&a{MREOL;K4swhT#)l9Ws>}o;bLQig?45V@IldEp$QUenI=-)nxF=y7u82 zcSmsYg>!d#OcjVkl}3|6oZ^m9;z8g|0bcJm15nST}Y~S%X z*$R}iMg}$c{59=}+3{c86_vSq$Oar{UA+=+T4!3LEYE26y9B=&g4me_rc26NN$hU(33l41@s{{y^5ek zXvN*odQKc)_x{v^<#L_Xk~$+M$ZD7=Ff0So+$y|NMfLPWBS|dGK6btL6|RAM*1hMM zeB1BCHpll_Ys9fAX<&XH*=%Hd9NKQg%06xdr&(Rwx*dz(BOUwVDI+nFjiLLI*<0bu zHnw)a>T?7xfGCm!38o?nu8O(o$tUAfKig@4s9miK81 zwd?Vc1rP61Oq(o-7})I`XYYT)R`a{F|EQ4^xC4RDw; zqrg+F^NfrKYPw9Um#$YG?r^a}Crt(H@~mwqEVS6?gzn>grT;wwKUy>`3bxM>i@9vc>X`I#%iwwzdSzi_PGJ=x2XZtAf#i ztDSDjMZ)g%*6-2mZ0>UAzMm${^6F?=6h4~J!$&H<2ZnGyq|);l%qdU!@c)!uyuPNok2GzpY!imBv&1Ca%bgmGBxApFzXJY&AENXxBJ#1wU z4vK^t?mk~_c74BJ==S<$cX#v6WOWPje8A0SwND$mXPSWzvk?AL&d1(O!QMyvV@3zc z3lFsbn#Y7^jc)I#UdfXN&Pydsv>zEGkE=su*i5d8lHc-$M(w#J(qM~2iJY%ICl*FM zHy*8-zHS4oxgcO%V}vWCE>41k;|13#Mg#i#Z9U$Eg@y6H0G)ZiUk@IHBb<8tw zJOo4DyS@F}b0greQnPA(z0*6pw@2Kp-cggO@9*I;b~Kr~J_+U1xUQIacioC!32Iv3 zM;8g#6xzAB6rMLp;%GLgGrfi3asSx8-g$W#Xmi*b=%U1k0 zQ#PtfJ{IjGY|~CL5aaKwq!}zbz3Wp-$e@4rn|_J#9+rVGaKahja~y*H;g-xZh{PGn zWm|?EoHos7^@#?l#Up84WdzzZ#iqgHP2`|myPBk|S-ToO7RP#hUGw9J+&mldM%zc4 zBqp(mRA+({!Rmtc2`djO4Q4>nj%1`%5n!5)qaFBn@Id}27KdC?pMdKay zWbhBCq;oi(;A;6Yv@GVfyQ*?pfIL8V1=~R@Nu|g((~Gacb0w+ z`*T8~-6_5WF0@|~Dl^J5;ySHN>~XD$ED{A~Jcv(eahLusg7JjBxBu3NhZpVhfU}XJdBl8V^ly8usoZK`)<*Ow!}Y^> zs=(As?e@`O5lITxGhSN%@Ff1MF4ykFI{X162-_Ul=O{T2c|{3-BsOLI%fO8;`Qv-sAhs znfGJQydO3tN~58~b{YwXxkrMBzn{`T(GqQb>OmnlD&_2l78Lm*egjQ=_#CNRWxG$0 z(U{pJ%U6f=hX30y`1=BjLlAa&GhmtN%^suKXfvf=ECN8=n%k$x9n6?_ z;O%l`w!6-T8A4snr7UrK%WI3rLWeR{@a*%xNQV4wYUn9WRVh|S3*M==s>X zaoQUIkByDxR)t3GSE#E%_4l3!ctda=+cAa z@TU<1-e}~-7eQj`F@FC2`%v!%{&qMX(hEgZzOk|N;M3V$H(lAht6S~vHw2SM37zgY zPB+`#T#-G#AMDpN{rw>SI1&;4$EX<=guJ}`F^doLEn3#q_3m0AyfwPgPJdb{oW+o8 zVcibg3r@`j+1fAW_Unujx1KPH2n8P9Bs26%cy#EpmGrGHHdt*1SM8|Wuo!jzA)?6> ztLWBH*336~9!Ctb=e~CCcJp;DxEuE^|9StPGQp^!oS0D71irKWB2g0N7V*rPlL)xn z-WRUD3$whf%vppLoxZS7XxpTzj!103+BOdn$HA~uC zgjxwKy6#5=dE7P_pMa<9v0An)2Gxglh_fT@Ig=P*>o>ueE%C+`Dkpb(mc*GRxm)If>>!sN9U(!J!E4no6V@^FC6!|Cc$SK-2g!XbXRe%M24j*k zXM+iaU1*G}f^fJH#Loh8U^>oakl~y;)C{LuJxusgdMvZck0Qu?EB93ni`|VD#JiSr#F>BNLy8CUj>1mpipv0*6va4Om%SAk~0OhSq zEEo7F<KQP0+-s-LXF`_dN?G%~lvA0=zF+@gU{dN``X#j|t4_2q$;zbb6-YL@ zVqBG&h9Sl!$gwTWfzouSN@TdQ(Q|4kfIvpnuDtVG zbiW3##BRn#>j4bLpJWBDL) z(_yWUC@o-Ww9QJ&3?Hon=$5pkQdPwEj@Qc-+u~HGXoVdnby%FLQt5>y1w1yn#J4CG zWa_iIRbgvNs-@9r7sOt!{8gSSNV1DZfhGEanI~6%w;?C56iu)F^+{=pY?(IPF4Gd> zb>EQL%KKiZLR@ekxt!5eefryCx}a1lv5W*9HL81uikoi6ENx8|t7!$rKh~o0kx$*L z4t`_UamW&(A;tHuMrYqowlU(;wk=3iqDTmT;K>SDL^+PGOB=KAfeXqnD=5@N)>xp- z%;AJ?ks&186xwn}b}_RR>l6pxwwIpAiV}q&B5|cLXn<`KqAn4HmXb_t@5z6m%i_=g zMV$U2ufuD&z)fa7gd?4s>-z3?OD1X(P>CjrCRgyj^doXDFT{f5R`e(&GmT4HaA&sI z9y2VTD3v~1qKx2CU{ug1G5D%`={_kIZ$wiupI)oOtx)6=lnO?}te&%gb>js*c+ksU z_?3>C9tC;6yIq_j;WGmq*Nrh_KA3kDU=65IX$uw;nyOfFEXua2GmXrbJd9VmJDa<7 zLW&Eh!iE+sQeST3^r+kX%@XMrXQ3&bo9&N1sKB8i>6j9#$e6q2lMs9G-|vG@*YxHZ zpf(0kffE^jGS_0BnKPA(mr`X)C-8Xq#7uKjT3E|E`asZDCaFYBS0OVHzi!g}@pCk{ z*TvKInM4gun~(JEOU*5X zYqj1)hXY~9zv`}%1^3cWJYyD@puj^H2T}6d7JVq_-niu;bIbBNoJ`qtlgKtfgBj#K ze1b<{*O=jV&uz?2@7v+(wneEO z)$BBviY0$3VFCGLlXRS$FRP7poSWW1hvcY`d#-BVHE#vP8rKG|j(h5)#tOnpDhIZV zS^n<$s*S?5g?^Jr2f;G=f~%4h zE&c+XBApg{R>rB7YN~dOUkSUBso;fVW9T@<;;F$U=Evj5M;cp-H{|ao>(V>8oL5ex zYH{r996>$QYH%CaTiLvtkg%K<2WbMae=%O?YAMN8NxqB&91aewM9>uoo3$YYTq8&w z_W0&1L=IoUUE}jdMDZh+XYUe@47`&=CXUf=K`Jm?n!vx7tt}bAS|;#?P}cXq^RE5c zQZ=iPocRKd$=PA9eUs`_j{n*Cd<0(e@K74|rh}v!NKQ~ifD!0&Pk)nV_rGi1E@=OU zhF(jW!?CIp!%G=q;5^11Q9On0pz2MQIVCy(DkXkFzWj&;J&+?$&ag>5U8=nOxWoRn zG=??BOwq{e=Hqr#idw;%x_6kCZ;^ZZwytlR^k@wol7!OV5%9ZB^&$_-g6(KH!ElpIv09h<>qWvWsN_r*`&r zMInaoNt|l4Kf|@{7UH2pJUKSItpr7D@-ES7Umt! zSR7%}X1S2GP40+5fT&D))CdwYq>HbUB4Rb1AW<5o4o&&z^;%da`Q^FzLg;~?u@bFL z2H5m(&lRjF^Rp}gB9^%U;lIz&w`b%7&wS` z3)xOZNpE*ZyjKGr#f7IN1;_I9ROpKV5+^4zNto5gcXL)~oF%N&+O#zo`=xa59ai}| zSNU6!-mN>wBTubG&F7_yeb)s?PEs$4M~n#>gEW)BA5ScH!uc_LF3*AgfT!La>W7MGx}1 zd(J?iE$|PmQ>BNFv29+Aad<{+hNEES7=cAAl&3EI#;lp|rcMfvf;dt)7fjE}%e9#56ZUO!LFwB*Dl3&ELx5b&WL8zhDw2(GVf5FbGh~8`|?+6{w zE1%Q6i4s(~YAT2-RQeOzmHDC7J%1;4D?bzKu@+K7l;(*T9zG*Kn~bP@4qokwMpMgf z{&L~cB6kRc-^~i6-1`EI^o;-~`D zfl*KnP8wQ+<3=J@%I~aC{T>E+;ugZ@&R%Y4R>xf`s&eOA{DM)F-v*hBq>vlYzda+T z+t|8(VZ!?7?dE^!HFbhe`+VUF98O!mD44h3Zd7|+MAdeE&y41NHDV%Syl7sAY!}J1 zV4{%2s0YtFqW}d*1Y2Yq#HuJ`$VSD;NiYOkq0p#({m{IFXm^JPnyn)m|Kih-_ZgxV zI_=+Ss#f{Hk#x!py@+lcYauQk@XrRN^9?_;P@OfIS!AlG8Co0jVrzY9ecvXp+V^<* z`ev(?vC|-k49d@3zGUgJszbulL!u;pjY0eZ6HL4vV z!Df)xU>Pnk$U2iEHA1?MWQfuuNmm9;?tuut#U^U~NgkztpNV92Glk_yWstLxvrPK% zAf;d5x@cFKmuHJwpN^W#+l|{NJT)p{hB7EHR3i7e#)!EXZ zvmt#_8r?3!t(5EV_78J3>AzC{9t=jBT$tZxmXuh%*qDzSNE7`>v)s<$kwcSQ;kM@r z%N;lG3=?U3#$2GCu0-Xyu0&uUUUT~wkTTV&R;X-<>TjK6p9Z2HHM>eL0mhn+O}(HT zP1gwNyT*uts3uNDO;L^Qx>Xhx`6y^@0bOXZBO%IHjHy<)KyZpcCNbn1rOBA0J-q>U z)kql!j=NCOuO_sF3ax=X#7kK`c#d>IM2<@aJ~y>UXa0v)E`U3#-IAFxSTlLf9QMHe zL^sq<;w)%_#co5E*}^!9NiEB;OvuNbpd*5?1_@_V*&ZJkKj=7}I$>!!2|BBizuGo` zy1gw)ZVg4w0)$vx5p8-$o{Ddtgh`5B_VF+6>&es*RkrIxIVzP3S#Co%CqI-1F6nJc zr;F40_~}GD8gU%ja5SwayF#CIYn=@Nr1F4{T+^<~S%Eq7Lef}nvdP1*_acwP82t)x zOGD9765okT@($ZIm@$QunQpF|Dr1-bW*Wre6QrmsL>&cN&K7jTQ!QR+EYq2v-e%@p z4^PcHj+8dpr4cNl0{_d{mELM1!j_Y>wl#_{FZF-Og*p4m?>K#{R5%N>2>&x3o-oQ< zcP7s+!%9`4*{FG^4u8%HjaI=m%xgxZiH6)|Vl0|@_s0W2N9;4}V-p3$n&5X}w#%4F zSQ6oEGKsT@4oh7=`4lvNXdvHYW-*$$_1eFeaD~^s<*E#6EyZm_!H|Ab1is-{_3;9F zN3>@33gAU%JZ~gnqQTeotOJ@_QjiP=tRRq3foF-W&=6Ic&{v@-z7zqvHOopm-F+^F zy=8HpaTa!lU_Zht;+N12b7`y?r_k2sbwRm;(pksrvu#-uN&Um(T*2K|QE2)zTSZ7xfl#c@>I`Bl(wTqPtundheA(gF4L1a4i zs2~2uU9IEWZCVvt=DWnQ!a8EcJhV$L_$!$IMHiaV#Jxx)K87+C{P)wlL{K$z(%baY zz7qK=$soUC4K7`wq;oP(O@l0xs*YJn;^vudkEerFS|=mbbW!(xf)E3bDx)kHxGQbK zfmp(0y@FsqT+hynoC-9^rbvv0VaGX0b5b0sN?8>zEWu04H6vzC(B+sFPe{1$xXY_+LQ>H)r5=ahZr483MKPMG}%UQlz;X;-AK}NH+2P2lRbT^P>cSo&@NKvW?BVzZUwD)d)1$Y zQ@g@&&=Cz#aU#cUI1FJcvCaXDWApSbZ}F}&H&h%&rg4gC9^moA;JJUHiwC`+=TeNz zwD|bYNOO;)$qyVBBuqsKmYF@_!85UppFpY;DAdbdkp$Uq&NmROwP8x|Df74&CQ)W^ zD#5EPhtbX7{S9*>W2kK5)Zj@z9oxaqFGSs;Iw6y!{+2j!Zv)Z0oG0YZq4%?5O17oL zm}TOW-vkbh9CW=&_xeMhy)X|4cJ#>baZP9qYfU=^fN%Ais+-d*VT3`OK)Lc7`CiC{ z7H(=;WeH2p_U!ycs4*53O&4y)oJF_DTA#<$=fabIwg-7Nll<}KfN#%vfQk0&|%K$cvio6m!X zn^}L8m}Jn~L~JX(Q1KI3b<7+yM-OD@lkY7aP26<>@0{iINj&~Uem6R zXP~P^jzs*g>zLzpIAs!H`~UQyRi~>$I_>Aa(2mb}mw4CcbXOH2F*brl-TlWzvf%cZm9LYKmDiYzu@6d z8hgJpeO})b6e&M%b^ND(o_2mx6<29HV-fjWbD}U2u`8X<(sN67syr@q^pCS!f1hCb zJ=xd0ACtuSJ~jeBpMM6KJ8_E^u~{IoI7X{#eM8(X;CsHl817ydXK&a2Z#e$Bi}#;l zd6&dSROwhJj+slozhW^r`{doozDPw>rJY9PtE1d7E4)8hOA(S6T+3<7HPM@zvW8H~ z#Tw_*s9}dgq2|C0doMh`2UG9NY^;t3*1z6HE*UhsUiWA&lO0oj5yZ*Q!Ok}L?@<9( zByR45Yd`53{NFX&9NsKv`0sd4T_ZZ$qmptQjgwkJ;K5IT6(TeAT=o+UHq#D1H}n^Y zY*F1uylV~e#zCUWwUf+akrfGY|9U0Z5ek_)=0B5E+zL{1+Z<7gWGbTUn~2{L96s6m#sAJO zAQ#*EZ>ny~GKTBXDRR!VMk!48Pwewzn$^o@htYx81iS0{p= zzJs%N3XqKHxAVVz&HlN?CJ45cJpo5@AX72`jKMq0`(6wqitl>cD-5^R554;b!M^*M zE$8!;g0sybeUL(bzgwes=yzorht+1rDR7wL?b81h5#&_E97*l>&-LotLhmaDp6?Hh zE`MWDtZT`cykJDT%5-ANg|mqq!oI~D_TZWYicftQyc)mggjtrH7{xoBBn1oM|f z3B-5lr9>hI&r!TbpRbaySFW_ze`F-W$i?u<%OMn8ABR!MYOC;&C-nE1rG9L<4Z%Im zd+BlWSJ|UFs_BvZZKa{-Y4m1(&+prE*WKT0^q20NjVuE0B(I*Z$~&yhOTXNL!5FG< zl512t3Le~37I_ut1Ab9zn!V$Rx*&grZsRA!%%+ za%eoi5eEDA-Vh!4#?ubGuNM+O7wkWSF9|P>4Rzx99+Zzv*kgW(0<JGT6jKumW-OB z%U9o!&NY#S`bXTDbKIpIicV}5KOe!Cpp0CwF|=a}Edz4G1}9KA=}7$DS;6_JU4fLu zW`*MOS>R_>*Z&Ilv3O9C|E^vC1k?ZOMzJH7hQTN0!vDT^Z_q3?GAP{P?i0j(lm+N} zU=8fKgNXBg1xFzKU^EwaZ0!1ICTyVmnrgG5i^9m@wLq2ios?g65rb;xsB=hIrb_W-*4*5Dw0T2=h^g7^8D_<^Rg*%v7+gE54g7(G+7hxw?haRb`~- zq3FHj%>EQmeiannbY7AvVu(={?|QPoOd`;c|K4%cs*B5TI(skc6h4)#95KoA8y`O5 zAN+o!0sK#DmyQE03c82oljff16T}DEl|Zi(?X1~<`G4ctAK|5{&RD-@!uSUxu2pLd z{I0KH`IE~-{)=lgWG-)^)3jRJob0qKa&DS5hnt2xR7=`9g~cl?smEd zaXq)5>gEiN_cORzz|PTuXl0n%@A(^}FD{G^bIqMD@rN8omW3xK;DoYM{c?DkEvk#| zcuc$j$E}oc zPC2N!3VDRO^U11L2A;&pUk$oDu+w|T@s1BvCxB2l`7za?z&L5M(^Du41 z=R*h`lwqAjvO-f-*JcBSkdXSM^Wkx!X&vDJE*qzUH9vFOXW`Ozl~HR6xuCv4INFr? z+wRL?64s*Dy7Q!e^^BM^E(c5Fk&2q=ZC#j+P&|0W1|lA@UnGx}8U0I=<$TqW77ni| zV{wBe;vfY{y8*4d-lo*q(w}nN%>_BX$z;qp@aOGuqSmAmV?!e6UBOWUBR<(>2*mt! zI}n~M#D)uvP<`bH5(P6!U1fyz>E7E{F6lKBxp0x=3P!hu&9|45dg-Mxv!fSpk5vhf zNDxk0J=KM;f%wbcw3JPFg3Nby)gikw$;_5eGRDnQkA6MQ8}ii7VG!v zsxmf&=+dQV3bvBz;$!heZ232xr#Lq4?}=Zh5XBm&sA!g?UCGhec@?m{)9lS^MBuf8=>q4kY0X z4)aA85F0^&qsIqZg=~qRw8C}yfED)MDGeN4W$_7ovRrD-u@8R& zvheXKb?@hrP>ipe>Ii7uS4Oj{!se$GvY}*Vf}fwSyQkf^J9^*TGhHVq61s<}-@{Ad zuY0l)*<2UG;7r&(Pwec}3&L~Ax$NHvP`I3#OnKH~^TcG@Mj~2>Eu@vhxqf5&Mai<;c#iXXDS6(eVt~;wQ<)?R7)$ z@l4uMEyx&c*c8U{S~IAYT#XRXwIJNa_a_O-8yNWBhK*x_VKyiiC2j?82=@+ zSDnE{kqO@#r|@|`omkuB_BC_E(OB4}k66t4nJAwaej4PvOSQW$R?5KV>iC2D5!G-a zRGj4<=(!W)*9SQ^6Z=T#`32grAaMTVpQ9iDV;^ggxp3v9PhgV^YweyGQg6M(tOZtpS^T zp@ii3KdDP%aqT3y4w#z7^Wc6~CZWAm8k4!MIB!^3@`+J?{z8`T@q`EC-#<=oAMC=J zK?`rtr3R3_{v014>L;Y2H+@ftAE3iqo-SXR-h41#1lX_hPh)*?H4+ehE_}?lg%|OG zgnDsspQm0XyZ>L@Dk-Qy$3L?FcisQR`Bkj`@BkX@s5ht?6{-Gpc>tuuob*Y$}yPCB-2TOHfBZFOvP)Jey-bzc8z`Z zs)ae{suQWCAc+Wv3kLuI5T&KWRK8}<{|3yruPcuk=iJu>>m;S^3IM>P{Wrh>8Clo> z0Gy(=sHl>Xm7|-ZtCgb@v9zctv6G9Vg|(ge*Xn=Ss+MZ1$Cv_-8+RhI5rIjvjw%>1 z#3~}uf#~s+v?Q?KWg{B)$f(A@wq&v|$lK(BmeFEjqHPvjGkbUm=ZP_SONcy3vkKy<(l?^ux% zzz+$q!0a?iRX`pjz-YqMWEY^s05GBoIG6_nWqyV)ofZplv@bv%~1OT&gL>LVK(g$EPN=D`h2u%l| zOWbJkU(*4?8jB8{(-_=1;|F8ES2_-B5IgeL z?IZw@7mxAvwYTq{(@4PSY0lVYBtwRio^PL|CMLTd`=Cmv9{|9%oB!+wJyQd2Am6t@ z`;P*O3rH&i_&oQ=Xp4H}A5DO~P8AWrhF1^)AmV4ieP+N4d37JXM4 z)j3uyBj%R1m^4x(fo6ze?$c~%ll~P#aFYX2YaI0ga+E&Je8!Ax%KV#;`k`afQmpS9o zh$|4onSVG_X@&eRPEd4&x%UVgnr+aInQ?ePq>h^&HqmsVj$PYICS_5_1kJWXJU7ne0-yWQk+{%xvqS zd6MXf=|;o$viAn|*!J-DNN#lDvQ2(C7d@%&P^*mF$l&aM-)GtX`O*vR;<2 zhQbl2BT}8;tWu-=s|=0ZJ%eW|1XEhJxVj*D9@h%X>e0I9$gLe^J(*A;bw+b;;#l%1 z^$6n50|7A{BV;7Pk{Txy8yedZ#{;`2O|ArIJ{o64jhTz(H0>}QIo(lRi?*587bAWg zE?Fj-G8vDSNv*u1q++82Uj0^mLM^V`K-CW@q0XkdTMqj-rBb~jTj^94Pt~%Vuk2Ta zWtpRzP?5j(d*nCm0l5K1(IVx%I>X)0VPbewoCZ&N5?jQ|aQ7gNLCU(R72lt<9ck|b z9nk_6<@r3KY%*+`4Jx-u7DCXwY0ghsZVIr6)TODn{!ts~moz&xcqQy|Z7k+`wiPL< zDO#0MmCBWpr(K-D^U~~+F7XcS*B~U}5g95yDoM+@X{hW&)fLtCQn*q~c>&&gAY+AX zFAfU^*0%-(@^7mM)7bn&9L|pX z1WY5V*UF;$13yHIjgyU2w?pIGX88*jBz{XE$5;>R?UL`>58DqHQhuW(p_G+Bk-x}L zk#8%ZDdCgjlN*_uoGO@FOy|fHU|C{4%sk9o%G_)*((%-xZ!T+YHJ7g6(<#xuXzp|f z)8WxB)>7BeZ;+_YuBKS*sO~65DQ#0oRH)2Zv>d3tZXRncZ^5bEU;efVY_@OqGqyCr zvTPXw4qPO5CHl4d{eBmKM*OvcR7s#i;P2Y#g3hbKyOA-Sbs^+8beD3>WT^%E4q9g0 zZAP1*8MMw;&77CC#IkI24Y`eoj+70aU`!Qc%)}dBAMM(cal3cc-}aun&(3Vf>_0DC zt-0X5u)g@UmOIIwOOvC`<~lPlD!Qe-KPv>Eo6KyxS>>-Nsu*P1bV$Zz$`r3zy;R#$ z>{0P(e2FFaAn202E4a(gwZXcfZ8*u*+cMfRp*Y}}V;Ht68bJ1G_UZjO3n&ew0JDUM z3=$5~1%G|=_9f|w72;hrf2dzM7mmqm6UGpZ3$6~{@2e)U8a?|{P4ak{HXT20jTENj zf3!FQZG2!HJ>ZW(74|DkGh8UvDMAZ(mL-+LV|Go{byMs`EJbW1(~?Dzr-ng>gI2JD z(T4vYS37&V&@iKg_T++AwwAP=EItn-Es)c}u6y(C{Px#Q_74264^|q}sJ@d|{&fFc zSSe;XBPu;_$`82+1@5FP;qSC%m@yPLXdV=?a9;fc{g$Lmvz)UL%c6R;gbFuOwDR5w zXYrjJUgSe;#q|4ap;YC6I^_`M)-!o?Ff)D<+p`MrcCmyc#Q$*?sUVS0Y_>eHJh1pV zQDq)h|1snc-NHne3_WJs@TUq&n*pv_q~u6VhkA(?y57=U)1qf8a-1inGKX&Je6nGD z^$%CpW$x!WYCr0BLUVDrtR@42)0C{?@2wTKfgX%5%+B zpnn&ox4dnTLEm_AUlW+^DZDz|ewg3s+S0kcq85|(W|Q$tcs8COMr0HaeHAMeBVd_& z&2t~`m*aR(`dU(BdF5c68OUPJ;`m^LAx9S}r6Tnp70Cf{rbgrW{e$=_Q|c7; zYDY-3Xj@?qe`}|C>DcrXpO9LS+MU{q8t28_dXw?elf&!;8^#n zI+(irg2jUQtMqHbqYyB%;`k}$)n30^!QT0N1Y!>29hwZOd8zI10>PYsno8Uv-Kiwf z2vPS(_N4~{A}6By@2ue+GAA*wz2isN%|}8+-hV%1e5$sg=ZSt2SQ0SVh-BPkNMx#J zyy}|hwku8w&Muy8c)v-m5+P@?^J{y_+^UUP|2qzzPqe%N#bhUE`}s3IuNkctH2WNy zPH);EJ6^VbciWy5|BOE5>*Sl(yJ>a1sbAek(`?nusNprVKXE(Z|45uy9O=mF$N;wK z*|uGHcQyG~JRalaa80k@b$MN5el9NL@CdAT-FiDd4n5v)Vy^qUP`yu2bgXz#T~v1} zb{gLOI2T?KUH`Qpr2Db9e7P22)9aCUJG&UlVZ>6F(s#(r({O*%(&8@FuaT zl!`n6;7tJl1cm?r&!1oOF#zDs3;>)M0RX&d005R_g5i(^0Kl#!Eheny`R}aDBME=W z>)^d3nODAl(uf%h0)aIM3?rLx z{plfaUvlVo=@X_BRgORcInSfgU>fjqI45)&gh?RbhYcKL zUg6C9NWYJM{&#S->z+BkBWE*4j81g#DkT}E49P&1KA)t3yvNQ*|L@erGOkH}{&(EL z&mka&R|ggG?hd8iAjiv2x~1H8R6!5bA%xy7)>zMM>&9yP&hFccgV#*VrFDk|T-lkV z18$^eJ3{lyE$FiEjp}_gufJ&_ZLV~#A-{pjqjqJnU=zVH_%%OpD%|SLlcQ-^6`|59 zc6_J<1m)+Yb;fpl8Ge9|qO?1Fih|iKU`JB4v;^49LjUt8TR=6mg5Fk4VvoZ$*FR%eLI%XCouBg8pYz-6To_9)ScNk90N_8EZ)Lv+=X~8 zz232?hAE{oIQSbcgs$V0b1AKho%B-U&tP!4LddeWmf*yUbRmRMhEfMUnFKF&&GuIo zb_A$HQHjN1STCiN4~F0ZQg(ce*~I|i5xq2|#8ES^{bi9+l_YQQQJciv|30k{aWdi) zs6L6HwzR6XJ?6>iKAXI>*MCV$NNUe@1{-c(`OrIdq0(TGttih;Ljv6(lu(jwXi51+ z#Q9G~3w!Apr0qDY8NABXEz3{L%Hf(S3y@~L7F>?I3PfJirDrDOBGjVlm$wW0^B>Xw zdxg(D*}5V-Lv@#_uUiZr=31Yl-CNCHD%{Z(9tjsRbhAE)W*h!$(h~Z>vZ&u`!dVr; z*bU%|SK`XXpb16OXAdQ1WNop-N{hM$awBN0RBB;^zx+wr(3g*+^>I(g#C>%-Y|j7h zE3B=j2+&N?e6OMuZ-x*JM_B14TuoyzBr1P#sTXmcJ*nwUB@K)$nX;&rm16m{(w4Z*29aCHZA{g9v)%?rZT2tcQ&$MjJod!wp`2Z@TT)<$j(&R zWohS@)lu_AZn*K}V#|a~fg2pE<>JJV^32~7? za9f2`32o2Scu_}2sHR6*g^vLSt#;(`Rowhn%`O(A@C z-x;wrm7jq(8!4=aItk)iK!u8*22}Ut0He@(#W;R)Ubwye6NdKvtNtJTe7F@9ms;^r zmCBoFAKn>1E`W#LdZW$#yM6#CONxcGE7#}q%jcKBBAAEsJE0u@h9wgW&k&>dRVJt7dauYd_ z8QucmpG8Fb<*tVi<7WP34OuzFz*_FSZH4a)Cb(6=9m=Se4ZD;xG&CfamLrta3aFx# zr}ja8M+8=g4`U2QwiBzXBqJ;5+x?pRA+5cw*6m2^eNAAGywpS`#QhayqNjqOsKo^{ zc%EUn!o$>m()guUuyplW7(W~Fwfd2g==oSq_?s6XbR_r}D^exgF{|+HP_hemxT2Yj zccrVSRhP=fnah(#l~S>`JVTOoe05jJ(%n)hrq+Gk_Cu&)3&Y}x1D80mlQ58>PAcRW zB!sCyYGbmCjSgo+uOOmmRVr!eO~VeWY;jX?q9<#{@tbUBotpm?8m(GoV9tunexLlz z&5K&ExiAgA6yN(t9Z!lHrb}4hr9C?Ve^s!mBb1y)pqoqxx~fx0j;~dT*^?OS@M6z5 z#-Z#05$+IeKEXQA(}wv7)+oQ}!h9a|oJnQ=s_DwTzg={(=={~0NH?oSGDhc7phmq1 z7M729hlG5yXUjxVj38LMW=)gYA}2V~wX`wLK)2-TeaB7~rp(^B)m5*Tn}oN`dT9We zOHA1`LE9frgYJMc>zuCcR<-ySYyIED>55!Raf7C_-x9QwzVyEw7=8=Q_DM&(!ylK* z&G;+f7>WRJc?fw=E|SpCWgi0=YHlxY3DEW6;b%~@8r_IwoKLA#V8Q~wK1Te%z-F=Q zcgx(Jwrbsobkzx^{WE^q)sEKdzI*aJZX7DStAPr+32L(l7mWq`D(aTU{RG{g>99d+ ztOYbl0g+`BuudcGC3va~*S5owBTu~vK3}PR`wS-5CAe}uIU!t(A>biW((@|dlM#n6 z#5@hG)z}E4mSd*Oc(vUAZJ#b+;&SaKlbsUxc;fE$w&Fw~DS?EKPFl;^zwX)HVD%XZ zv5Di*{Q*3|P?~;z51Hsq9@oZZMW8h`CQ}?uXEZX}qL#L=Iw7c{Uo4ezj+L$|=~1_z zR_A39)Df!Hk;df#bnFH-+w0iywf@|YCnh;Hqg60loNj10<>~R75Jg`D&rmu7cdLG* zWM=QoWGss=ecIIhh(9m&n8~uDv?l*EUR{tNi|;<0lMy}^*-iKXas?S3y(INQNgdYv z9vt|rwE8kwQckm`5#2F_oUZ@LA+Ow#Cw)IG`n0*LyDL&23(Te!qX<-Luqg6l%(p+iV-D8GBB{@AETS9C%ZA7ZwoFD<0cQe zb%J~3eO*WFfW7RH;%N8st=V>7V?O+Q#^p68STfiy2Dcu#-u}(IWsZfF9fD}CP65B> z=)8a<%jf<;E(wz>K9SINr6JS1)}(wY;HppJrAGSG-4NUymR%Y~j7Ij7rrQ9iS*@D} zjz@d`JAxv?)}ok4)v#7LYSr=bRyHx0E`<;fT-_cAGj8qrlzrhZne(hWN}#n>-YK{! z8a6L>yU0>LV~*M3O3U*_W`Lwz+-#DS80}Ij>G3ag3P+uS2yIG`{c8U~S4ZTCiRz1h ziZsIdR=lEbP=;8-d&n>9R;YlF2!8K5ZOB#Veh6k?RT61N8*H5VZPvl*G2%8Qeg!B5 zb`q|0R+;}G!)cPz-yuA$xiv(%8;2Y#xCXI4>ip4v+8WJFyRuyT5xbZ(VNp`mIAzDA zGaJ>6@q3#aA5=dd&hjW$MCPPOi}APx#UDr1;Y62sR#pdgK|-gM79~{~M4iusoQ#GO z$C2|02hg*j)MHj{Zr^%C)qWlsYSj;bq}A27lm50+m;a>b$5KtI$U^(mi-c*0YH@MPgHiZ7F@dIdL$S9;-K-i<7*FI*I2bIIy z?9%vmp1z*(wq!4=(b2GlkqLknSrHWOb9S$>ayqOQ-i|XbjCZ4&vhan5epmnytM|ya zDZogtsQ=W<*=vR_OksGKBl4ZkAJo4ncx< z*te$#4IWN4il@nHt|n1)x@uE~U5^cB>-3V6al~SguC&Dr3q|IF>adbfjHnb8jBw?8 zdiz^4k(GL%2gJpXT@JC#we7RH0rPldKb%<*CIrN z3?F$uj*iKeS>wu24UW_hk|71bNWoPGSrhQ_{tfK%5$$d_8Rl~=$OPoa9k$q+pLPqV ze$$kR%s=J7i8Lg`iN4j?T-_`FO-Ra~1jC?vjWw7QwI|T9C50u)+r7844E#+-pttW? zgJEyKRVAJXuTvM8i)u;d`)wxKK|IavnOw`uHq6Ak^M*pXxf4>mSVlPB!-YPlD^wBq zO#WGae>vME#!k7&Z{*G}{u9SLAwcLZKx?%w=z>SnwdxaH$oE4V!SBRSC>wNR>*1U5 zdt%AOXDtNUw==TfIUMp=n; z9%+i*F52jnA(@^$d2@-f6>6qY*DxSi+EY)|h%8P!kK7>FJ+AS6xvcP{+!K8&)mR3g z3kIl>WJa($bv>XTck?PAFn|WKH?gvdQR8PZ2e$cam~?xC2D)to!!H=%`_vhmZ4*Jz+VsyA#t+gpsNhSE)?rgI8i|Jc^I7WYOh@+iee7B&tc- zbP_R$cqNW!MAe4^;EM6-$%g%GiFQ_*2#4Z%5Y~Ut{WCGl7)YRpOp^$9Jsxy2)a)6afq2=Vi1hiX+s7CH&&* zu{qOZm9$k)E02_B*U8-9gEJ@Tow>+RnSm<{JS#B zVDpD*d4X?(o2YL?0Q^UrAW^kUfTR}llF;yPOh#%(ro`glWS#;wX=R-(ZSZ>fbV9xJ zp&Rtiw$8-eVR4VT0(TCTeF0omrf>!D0b*idw?e5<7#mbfO*cyxhOh+Hs|-G@+XWxN z2`S@HE|C30${6GjkhC^H+_43wXT_m9^{S)IqIZ%-#hQMDJX52{6X&^eaBvDj z??Vb4{;dZX;?X;v+8W;xS8oSQ>n`6DR$8sQat>giCXb!nwA0||SfB!()nt^NZX1`F zwx)|8^J^g-|54v8h?9yvsx<=P<@AY@hIfX%bPkreW4V!+e3|foS_2Os=U){!C||pn zUV+&DW0QoGtm3CSq*^)uG5n8Y5~pZlnPUN__rw0{+RrTLdV1-f%VPyqqP_dq1<4vY z9JCDJs^&L17m7c``?Hi7Tec3KMsGlKT>cUIT{S3diC`=FzwjC5>B5O~R0~d{=rk?8 z_9+NfA385;mpThvSq!@lHIG4A`{iAmk~ZHWm+9r$B4_SqSk-eykt_pANpj%eb_&FO zS?4}Tc2rW7V@1@QOGNb=zCYnK$l%d467`BuQ&eb((-z!MiE}VS3u!4GyFDkMEbac) zY2vSaY2m&fH?T{WSejyW5U0p;f=a9@Ftx`bWT``3@)882K8FAN(%%DDbA$bzI#fnI zRnYh_?Xx8n2bM8 zoX;ZR*O6du>;3gAgF8)W8VDrpm%7g}#fF>Bs3**!2?4`#{W3WvL7%#d}P%{l(15P)Ny}k zc(vniJ$Wi=D;W+^D|pXQto7A2JS*OqOGq>fuW{@-qFenhEImJ-JR&01erTTvV_4LV zV^Tnh&=k$3^*CiUWqUZCR@j1G@lY)i7OFKH+V5?KZwm2`HYb|dbeES}e&tVomkGMq z8#5abKGM>N(drEM34leaZ~POxJ+$t<$?RBht!G zP)Gl(;-CsO7|iH)QvFg<^05j!Bh^OMWcsFw>2;jIfRu?q)Ai~pR|<3%@}iQTl#*xo z#Hl>YXv1r@xcC;{FmQIV-gl7b=;X9TJg|Ziin@0Wj&=+iT4Fl1Gl(X=6A2k^{4`;4 zWnWrxCtxNmTv_X%@?<@3BFTlaUr@?|)SYIhGBk%!tVW)TTS6^fERMuOpP*Bj(yE-E z{xV%M;&n4+X>BcAXF^!CQ_QYg?v$f)on7;QVC?MciIu6qKMalaz9^m>p&hBc_Sc<` z%Y9uYpgqpMw59(34io8t$c&vUHe8`w$;j6iVTw6oXop;t#^jp2Js*mKTkH)9#lk>@ zcLjpu%zC1}{m7k#l~I*>C63I3;G;C) zeIb@(2-WEsW|Y^2?lTQhTBoiNwNNO7eFmyL#%;iPl4$l-m3gsnb#7PmBYKo}=JZcD@wSE#A#4bfnZq$3)ikbK! z49@Pqn8P?UF@IcdCM(ZlJVAg>uWL#EhFxrZ~ajF4+J+sncZ3KE{lB4BY4p%(^mblt)7^BIsA->wni=p1Xq<3JAFc zMp!fYiEf+|GkM`SY|@M5(hGx;LsNjW8*?V{i0JZP5z=axg@`3;;TSJ-$})`2dATaoX%v!Ziu36S}c}4bO-c@4X1(w8yoL-yf>`6iuQ+puW;ai zA;x%ea%Qva*;;D_C7i+)oWk@Dp8m4hY5V4RYcxDfm-_ty^(mbTI+!qDL@oT5YPt%N#c#P>e{g=F@iu87mV8{inhwWc+wy8Ol$dhh@J*~*Zfp+?)YRYa zt!Ckz_cdX(i3D9=BV+*MrH0F@WfLlXqeQ3o$qd0^__d{1*-Z73G9ZB~KVauM`^41s zi_v&$!b$Qr{+%42t2RpM@qLChSbpU7X2p;)+oMIvvl~+6>X@|Ul+xN7SLz@s=l|n( zoFcetX2qfqi@${h-7`|-_Q?r=YUy?Q3Ax&IjDai7ChXUlqf`0K4;MFpatac!188cx z zV4cALgGw{7G^1FPbDw~!@BX~Lm}bUVw++@B@QZB zHN`x$V)j)(bux07MowEzj~UkL?l51dzAgK@@PPkJoY?DmGPm>DORT@k z9{-)PMVKa={~PdLK;G(-+=&%JD+HVv<0pGYfpY-cX0jPpoM`huTRrmu0TbT(Ks{4d z4rxirVlrVR{JbC(LM;ca0){?1AN_WVj;gc2&PAAm{j7iV45Nw-TdMhqwxIcl_8%P$ zq^s2>d$4;`kf`^o#ZiN+5>3tAlF-Pgq%*!8D)Wnt=MT%sPe|wJ&rb@_UF_vxc+9aa zPE1I0-A=qS)!m*6hR+pRHOG!xonZ?N8=eYXg^EViL!SFE_9c(Kn@DKE2rrH?ClC!? zFVT(F-(LgWzFG<27GmPMK12=p-*|tQqXQv}gBUU9;#~C+@v*XgWKiU}4s?PNXLE>E zvBlB6x5QcQ2ilBZ=HAcn zmK8-ib7I?({@Lh6$|oi+YH)oS##r}3!NX^Y#-;(F+odYEt&NRZki%l&w z-(i89GfyOvG6PQd_h4AQDJ^64B}d2a(}kF_z3x+a3=2rT9~%SwFE@{6aU9F{8A3)RM=!U*1sW-|%XP@A@el76|dOgNd znP1^r5c1a&MG0@mu5qmKL?qS}@!jWc95Z@xQEmVdeq1$(o1ZyDu2|QlMDOkZ;ALlS zS67XzrxjmH4t4chFmZwkFO}49`?2hz6FKtV; zdHK<4#>!6cgv;g^?BTpK(si7`Y1aw8F^n3_Pn zrWe=T*R|A>)6-1At;s|qV})61y@IeBJ2jmn?*VP<;vPQz)DDxu3uSsg3=Lgm<&Q+T za<2!@EE-zMd)J>i3k1~Sg;UX9 zjo~My=A?nNsEGy?!Ah203D3%8RLcHc%%hXr5w_(ph}pQbjy-xvJ{nM~pXulK8j0uZ z@-z0_(xZ0&PUB?vo<7$P>Xdh}w$)mBORYQedOr8VP1VrQaB*b93)Fh#r2b23h=Q=7 zz_19;c~*r6^Don$WrzP@b7IZxAGu@`jj0ZgP&gf03@{BKxrNo+m_U!XX@wx*$2^By zv9goB9K&>%rf<4q&j;UL7C1N=fXgnV7<}YDkTY~B|6{=SajIu0UiZ_;C0wTE$R)DSW3+%_*pe=B+^AcL=FSu5;mDH4wt=%&3vW#S;;=T+*Azk{w~QA1glK#CQoHNJjUnMoU<`pNo7zid7DGkxi-Fv{ZUbf8Q|6k?W# zM}nQ%)XxN=&eI;YKR9`oZ}_)(2P|~6PJI$KECR#z2gUTZ2IHRoS?gUs%PubrNC^05 zlZ0_noPouiq`>;f@5nhNP_PBe*C@*A?iYf!~`GDhCMwPj=FrW0w8EQ zb?sjiG89hc1cr#;h7}v`m*>gp1+>g`8oT|s*yl8-r)jUjJ*pl~sE#;>NV^#=t(d?EK# zb}HO--6dhmcRd@^CRLSfyaWA_aIYn2i!*xNX}jI2L|txv&rms%Q;%s?VP*fdm|dw~ z?-0;OipX-jmlLneb@rf#;F_HEN5M>V8nQ?SXEbedYRFjIhReSVF!5v#I$*_GjeR0z zM(2)@%Ssh;Hc8mDh;Exdqov!={CyV&I=yb(H+Z{}(=M!I3ZfXn^kuB5i;X)Hgr4_5 z&GZj-fak5@hWIZY-jvhMHfQX*pl)&3`p7Sy%Gv@nl{qXg1ZKxA`GxwV`bE6ILwoK& z*>?Kh$j8QI_5Xyo5`kajX!_fDRk#1Bz`OLh{(_IbW)v6u$c+S4p;YVUvvgLO+7sKv zi!qN)WUrR;wLRH(@1@mJ)|wqr2?UmJUFOA?YjiJ4ilbf|Zd|$VNFefzz?zths8gKG z-SgXy^rY*=bP4==nm7D_f@SNg;Gt6<&#c_~hmXxY8lh-LU3?__=tXc{qJ&=SqQLd( z^`8248YehT6tLCfdK#P=fyeTdRlbmFYxAxRCMRQ=_nQ{u)I6WTgTi0)$|Gvc**>^W z)X@wJR#xW()%Ti2<|$%FCQ;NXYr+w|IY57h*n5%a(>rkRa(GwT={wV_WSp5KGkaoD z`i~{I6n3WF{3gRKU8Z-%1dWQlzfhdoVJZnZYE+ZtpPl#44!SOA9tO_vR1%6VUpZNY z<_kXwpYa)_ZM`~v;)Pq(cJ9MzOdpq2H{S=B0*5QM7sI%mPx~{u`8EdNB@OouUvm!z zCIq>US(wh($Ln0FesKAHp1AxqW09UxnEeLtv<@x_dPkMtn?a=eb7Rt4kc`nriNn%}tR(Rw^wbOo3rQiUaq@nq3B*S2gC$*%W%F^~-fhJhN z6Om#-i0xsG`M}zJ))xm+`k98&Py;jWgN%f4!p#?@mVic9>UnVm@AlWDw%r{=vl(c% zh~A(3@Q;&F=iOSc>7@HMK}E>-7Hf-F`2Eg2bt@s5zDap5Y;3GARr)X%rNyK;Lz0MH z^Hv`Ur@Hutl?PmZn@w-Xf_@8Amu`&u%9v?`mENR1b$Wt_C%k@uzxATwjJxYs*7<4| zt2B~qgBqM_%ksMGAEB3_mZwFkk3Xjez{94*nua24XD5bB-j-F}_6lpQcIm#Rm8G6s z0!t4SG}*c;FW9BYu8d^YcIk{r_=>ABiOVBm(4{}xn>{R}YJ2U!Zb-;;4-RAIB*Dp* zKKY{zH0KxaQt8O=VMjhAL*GZiRx!}^HccM}3W6b^G@l;-)Y-fIWCVBOPRSZA#hLoe z+T$!p)OBO(`*`0Yi6u^@_)MSCpTbK0NaMXK154<4Or#|gz>urs!E}qq8*)=HUs%e+ z>xN&xX2g*%;`IZEIX-u5f48RY_-JAhXnj!8ys*ao>7ByC)OF;NXD{h7&*p?FkkZP& z^gP#TrL5srDnr57UpauA&Mhb3nO$Or#-Txq4v#vR3q%!u7*Y4f90fs!HHh??V%gCI zA2u|Ln%0jM!X#_@Ctj(SsU^U!t}aqp9)5|@$Sx*F2#3Qj->tf%QqtPR$E$>45J&Dc z*0G9tZ4bS!uQGjo@Ac!8u@JAnU1+)Bb@)8GxIB^L@S)AL7?`RF%eB;oiGr4SkdX1W zM|}KcGza({&i;+c>vJ*JE}~h%mKqf^CM|<8(?m7)6ncjUyX+P;`(R;wxB>)Exb z4%gwNJ?Qr>r<2Vc`zok=D%Q1wo6S2s*p@65MuQ67bUoO%q12H`7t}elY3CI~x2oZ? zw8PhGJ9e&~dLFpsy`yz`95~o!$JweQui<%K*}uwD%(CG*wiSMuE3=(R*(fF4QLg=W z=meWdZi|+wR9DGBVj_hikl>g(4QH>nm&C+7CPj@c`#!tzZ(|<(c_)1e@YroCLvg9< zd9CX#_@z2hKm+s_F@b!HhbKp-uYI%%#-sl+>Cn+`F0g!M&cCK2S3?#`vXUnt>J)?#UFdi=G(bC&6V|z zU)OJ*d!3%P6>b+gF0WpRh#iWAj0W4YPTMY_()Cf}i*JV%32B6d91GsobGjSK+U0q5 zmd*_fqHHCQ&0k0ROEat#IO3bx?n=Lk(j!X(UNP}`-kd5e)3=$hAQev06%vKG?1RBk z*o)JTF_g#NeRVw8km#lh~Rs1ZYh@$?d_^Wjn|7 zG7`?su^dvaxH)`=rKqmaGATu4t-z^jYOoW`q<+vDhN;#uexLD^PElN^J*+rW6`aqU zQkrAZ)Zkt3OT5e?5RwFmA+Nl(woLICzoUn?NF|3gV166vaoOScYFX`6G}CFXHCm}G z;Bqp+<6+g-I)fn_-dq2?>l~Pe&fRYtV5&7*^j&PM&beF0Lh729vcQ*5TE=(h0Rx`l zp(tR}{#*sV-hJ4nb8v_Cj1?LF)> z%I($Tku2LUSKB&k3WReA$`*jQzYwQkY2hXw;p zt~J|SivjW1Z+mzi?c@7n0-#xQhAZ}BN~IIlOMsv@RH@q6{*+S8x=0&}JVgg^G%5wq zYP-jUkly0}RS72%3X%#q4e-7b9xC2zPgY)<8Te7{K0AN$+r6tR>3>A zl8H(lD@kzan$d1I=TAQSI}gEbbsAWWA9UH z%ll|>ZS0`!gy!@5Q1^a@goH#$k`02i4~YIfVbb1$;Kt2133~ht&OP^uif#YNIlbAd zFY93GJa1BUYn51Cx?%j-7Q&u}NN<-et12%*9l65_e#Yfi_1y?7btN)(G+`#%9az#1 z%A;gg$%isF$hBlj-8G9CEZy`H#{jTfJfGoa9Rj=6{83r^2+ zOJt--#(@^vdUiCU=!sd%FL0Z0^waZ&T$K?YIZC%1bQ8NC5k$>a~V5QD3LAYJe=*COg%rlX_}CzpA0Rz6X~Exx)#ikh;}js%-NIr!)1 zcLfv)-j%T>PgSxX;M?nB(H*fckl_|`H1K4h#OB3P+B64$Cym*KBn-U+^CyXUa{Fk{ z$+XOB-9XB?g2P`%B9Fl)((&eEC|^W(b_~i9 zL*Xl4T$j0WXtFIOYI8PL-{d1DGEjf-W#RiBf0^W-IgNny5}lMU81uY}%>IYcA=c9G zJqfSFHH9w#VXh!Q0o5e^J9*~-ip%9T7>|cbX`t&x%;8s(+}Jbu;Y8jTym?*yn8Qfb2i|9<8>AYCsa+7?sG%lom*&- z%~r>2gy=@UY%Pmbw?h6=T)-C$%MUH{bka1+yq^tDL+2&j3l$vh3GoF~fN5PZ8JpM!Aj&S&xW@72rh06=OGeR2WC3aj}qtNO$mcmnyQnWUB@9a_HS zS@O;nhdKKD1>CXUtbYgx|01erM7?+lNRv7Dp%>=ke8tba^3t>p-$Zgc*rILk6J|B1I zvi0OAB4(eiEW5uaot8xJu6YVE5p2kJ;p zG$iVGbsXcI78BbC?9$etWtUi!$3S{c0pbk(L|$*CGd*h2*b3 zLpEEXKv4|&wGM>5$0o#cmlh@69#j*#Zi)H%>2m`MWeTCY1LX}`p9XtuPkv#GcG08W z1_N^j(eBeIEd6>B&8(P@K3>BYQfkcp$^;9{almk|wYI0956JjNx5xHp$LkY6yaTgz zdz}fsNMK9gxi_B5Ln*YU%cts_6-e<51>KgbKVFai?s44!dHas2nw|5P80Rfm?GZTg zbv-JJORk!BuMYMX$F7uHBv^n;@_?yV^uH2>J&3s^MeqKTL!UbmDQ&ViA<|Br0VQW@%xNvP?MJc#h;IfgavUmgt>*;I%t5x zwyPiXwo!SMe*Fo`pUMix3A7wW=w&ngww2BTaW$C+=4mkr;AgV{BR5+qUhAZD(RlY}>Xyu}^HA*qrG9{`-3GeWhU9_kG`D zTVT)2$;?;lsvxN5A-8!BdH@C?O`1)GBM6~Vln`|?WtfCAHOPU8AW z1_pQy;OD0!9f0lwfO##!!vF>pvIm&)BfgQ(MKkrmf_{SyxFvGS!33cLgni;g%K*ZX zU_rSVlxlzi2!QdFndu=wnE_x-6?n1)2+DoU^aTUxrI28N6(j`z@n14BFTn3i0J`M8 z7XKYx9SVr{Kcq67_&dpYB!cx|7@VQCv=|AgXJxSH&^b+hm}Chv4tZzdum-au?>$Td z00oH{|LykS(`y!~Zg!S4z75HU;k+N}o7B|w@auT4+DRAy*mnz9_@ZZO#tq_w3bOwy zqPT{zHiR#5e~GbdLKbcX6r62nJvjX@HWGz@I@i~akB-)4M@02ZCbj&(tcHvRv_9?L z0{A~(p7#0<$b(r8f~6o{_lBk)wpHYSW@0s-QW? zi)Y0?u$GcWi6+sEQY?O(AMDb(Ko<&+i+dPpJY5K#-+Ok~08cC{E6(KG`fZ4g&y)7X;Hbh~PaAV$%;m;SWM? z4Z?pIbN&`39~lxw5rs1k!gn#IsRdAqI_ED_q$ z^khJ^gr7_(zL8=hT;ym`Vysl1e}2d`mZ&eHElMsrsFI!0S7x(IK103?XDJ3}T%DPVxYpz370CH zN|}mB%cNdeRaUiA1+Vd-F{PeRX{hF3C#k`vc326!oK~$-m8*QAhNos#$yX6kWmVy* zE>ser^BD!DGb}%>BvztQ&}eknGe!(=hSTgtPhyK$9qt~?F+$lmv+n0X+nw=A&>bUC zRawX*#wN?A)vWrEVkrcDnBn}Iy_x%c@IVs8JDHfr;@Ttn1##*sjaJRm&27~DhTjC)iGAtmf{t5 zi+lDvlwW7$^%(}`$vc+sc=v+-;rlavs(;%5D}Rzg(1vP8AcxvSn8oHF<#2Z7Ctw=i zyi*Y~7#0>QHAyu|-~XN1xxin%A{i%%9Q$ib|B(F9e$0NXm=cPTgi=o7T;V!PRiU$t zri@RXPkwx6dZuUwn8}eXz_Q8;$_8bxX79Ee>w4+Zw^g)tSjaRT>6YnSxAi!L>GJ55 zYHR2kG)vaz)=~hwYrD%)%R3d56|3`rR>KWRI(- za)TxKEa;MdD0s-vwZpojV>Hb*(Ehi5N@>_J&nRqHERgKm{M+Yy0Z<-90cHgr6)Y00 z_v8K5$B(2xUWj+o;<;)4N+h#q1e@ig(BY%3Neo_YpZ4qCw~MjQSO zt}ga2p)p2Fo#_?rTx}UUIeZ>Q+B!}LyT09ztA~h#+ynSSU#twKzXnd;g|kDCVda>W zjA-<{X~Oc6irgu;A}F*Kn6VW1KRqep;k<_khO9`L7C09o*TnQ`2^H_9X%&2uE)#n= zyvaw|O6iX~e^XWd>5)g2-_GXE!_4v^wr3UK?PUo~O8nz2T1BFe+-7xdbz z^fl@b)6PVg3O!-l{HF#|hXJllwCq$}mwJ^Jy2;8y%d&qaYLX|dI*)GVYPxxH^AA_f zP5$>4+7Q})Qd?=boE8It_DOGz4Nnulv-c+4AqFH}xF%E$e@Ap1t^JBp^_5n7T|h6T zkAiKm;oxM*U@MsI1-u5_ahU(b*6Njkk~WjhZmY?^@LW7WjHu{3^i8aEjKDSOEw5v| z2*=6(%&nA`%Ic9$^Et~!%d?XmhCDr_w5s%zbR-AF^^F$9UCoxOr)P;xrt}%=&F;`P zvCiUt{*E4t@`>3QJ|XoI^+)x8>YUe$+pQ+6uMP{>c)mT)?3XK>dOa_nf)jn48ekd< zE0!x3?=tVrFG6)uRcEhh@Ad|@iuTS|Z%Dqx(g|!aiYGj z+#62@L{3DFxSX*AGAD8Gqq7&--4{Yc-VKjf-pIP&xh0|5poVYzmB);gZjj;jkA!YWUKqR*xb}y{{Y6fE#u9iHeZn0?5+*6 z<4qTe+y0`&cMOQHhi_K@zQgUlY4iA}R)z86%NbrC*X;IVulF71H*h77M_{}6!N>7s^yO(6b34F=>T`Cgd)<@jy0%BD$LLY` zN@QJZJ7Psh?`v!AW-HKUz_Z|CVN2=-DlByFEAc4-Sqw5EGhr$mG5jKrTabt6K*;6u z?4w+4&U}tC59_PwYpMv>A2Gma@iwtxB~L|(1(l&2x-Ekh#m@< zSYghPBNA1J;Us$QaCF=z6P>i0_t6q+7cZ&^F{E;B+ zFzFo-cU@J-TYg^CyL#OJb&{9a)+NA)wY{qvFA;p6khKd<-`@nCPH5N#mw zb$s2C`+>vJo7?g2-_!fO(6xVnm4DU8oA}-gwBDck&nzpW9e;nq>rbnmJSL)JCE{|T zD!6gA!{q$WA6yPw+z&#IK3_t$PyyKyK$Dj5521fAOkY%iSH1z46Q1~AkOK%WUS{M- zVSjO4$3d6Vc$5d_lFZNs@-#svNTkux#6Q}wweK&M#_m|(`gl9M`@S+kM!V)libMa( zB2Wns^shNiT!asv@Kpw<=kO_|gdMjs1n*wHC#1gG^It3T{jbJaZ6O=l*&bJ~7X1a3 zrn4QKz>ey_eZQ}lzMm2TUX=LX);`iDsEOAJ4o0-V#32124Wmy1$Fsb!KtjdbW(g#(F+yihxLIYWdzt8fTnqd% zNa%Z6munC7>drl7K&q0HTdnEfXi=Y!hDp&qNHUdH5r;1VKM0xG>@YZ>j`oH=tBAkT zPik+RLx1RS|75Hp>-7|uYJuDF>~Obp?)FwYZ1bF6-1d=j4}FiF;S;CZ<~{KCtsU!=-7pdFu4gb*#bp*KeESb2;-#mBxbacs_P}ny4i@7byJ{1Uh*VOd3kiZ#AtGUL%%}>9Vlt z<9muJEEJYmRa9th_+iWpFV>W6aoxf`(D*SDv`0Q#?t2)J8ww#>`$NGM?e$G%IM`mg z+rH_e%ATU;ygNjo7w}jL2m~#4FM+yWRbKO@xUQsvc4zUn7B#*rIUCG{Hvw3>FCb4U zHqLDcMvn8r$jo8-4!5zXo1#mCa8Fh-8woqfmLf9|iPITW4RJ(S3AxdCd=||COEa#y zt!-Q?Dm_A8CnPSajGIt8ukjeuw&83k{c$!iw1#+T9|$(_aSGodl`W8Tjd&s74&qHb zx{mAcIp&SIiXG=9Kow(5bXTFJbBVWt7Kpoam5slVN2k1xPbL#zw>4+Zc!Ib3b@fspTi#)b3T|JU-1TJ?E2KP@^_ ztt4V9x{J$TiDKTRWqIE$qXLF10I>m;)iXr$wQj3wFI3*w<;p1~nd z1C%JR?^Mq`hw9^V(PBwV?F5GX;PQ8s4|8`8oB!EiLvK8sn&V`>A(>C#@1)xs)c%dN z)#p1j75Mn>*6iDKTd$(je+AkmTgU=s9v=Rj+;6|N@eMDRsu&Lhuo7FU3`xiRu6}t% z-5z3ik&kt{CA3IxB!p^?cRRJ0q<;I(#cQ_=042A3y-mU{*?C=*ucX3duq_WQCD^^X z?zW7JaBP@o;B3cHSfV{#f-ojN|f} z^W7Qt=$6pv^nd5H9J{+?xt<*y1bg6L@*St&$*H$EO-}yVw)rzJaNi%F|2^ONa4C-L zja+$wKDb5-KfNhRzGF_hk{IJ5K7&}-X~?1*w#wP873q$r03mnPP+kpF(iitDm1{L1oNkw!Odir5IR?`;Vy)Z()} zhAvtuw=Xxb(9BiL#&3dMAw{*K_5QRt;r@0QdC3=abo6_8SWNJ#Qt574O{sD7%IkGM z;%&KHaCD_wtC-#g5Bz1P)8!a$GntS7X_>FnA0*Y`du+wikN^&TO&~wSP#>9Y>_7HP z}mH>{IuYoAZ(79AP6-s#~V3zrgt#_^CfzhJ!Ic#P6*CX;@Y zIdb`&a}4NLyqH^F!DPGcW+_rwmrzJJJpDVFF5Qn7;A!u}7@niD?EaL|7b_q^;2E3C zap&lKrTWr?Pd(Lkwa)nh$e?R$v=r73WM&imJX3lI6?zT*sAdwJODFp09N+({hM_PT~s)sK+i@(uG1*}8PCc%T{sa!N`JmEDApJZHsCgtDAsHFU4ZNE_V&-O zEU)_ss>ay4>)GzzPY3lU2J5-|yNL-{rv49Brrt+1p|@nAi9wO&oWs|EJb^5pq`6SL z+rBu~2?k{*2nLGgW8rno5<23)xUJk^y5hBTQIR}V7z8Q21KgKRTCxQ52Z^8H5*R9l zvABOX{Do`#_MtdExm-7vE1DNy;QTjCdPxQr7Er5j9p;qo%-9ZZZ*T3lZicK0`d=js{hu_RUtYXV7mMYo=I-<4Ry&xtiZTn(bZ(-x;5)1b77492 zw(N$tRie5!ww<{CAprFTl6P=gi5*m+qSZ#QZBr!tZ8F62Eqz{Unkg=BUG4TrqrQN$ z>$}R)#2PeWqrp3TrRd_nb#FdZJh}<8XHN3wW*&OFo=mV&65Bg2;ISBQ4`P_^kCK&k z4!bU#{>IrdIdkh5$II2~0TkHfP_~2Q3UvJ^v&$Azlnb>7YxWH*Ru)tjbTdkCBaFEB z{}~hlL*V_M+U_Fqcb(rvE!Na0%a{r68gMr5(sbb^raIXg@@o&LBbW3JFxSiY#|igR{9DRb}@JBM5zB3N=y>56$Wfy4wPbYExC=dOgRSkJhd7 zkN-oFovi%+T)`^OW7#D1CEj{(^;#ec$JBa#59oaHh}pj6?>rOawuSCFQO~9>Dd_ry zD)^GA(3y?pSh-=MEF8YI`te z70VG%c8HyE$3Is=o6cx3G`-`}e7J}G{{GJYyk?f73S5-Y@IHv5Iv4}W)`Ho_AHuLY zy;v7`#6grJ1r-6EcEO8qLS6*f3_#|IVF+x_T|!)H3MWr0`_*xC ziWwf8H0i9>5T1R=D*h5l7@3Aw%fZ=hbl|)DGNbK_gtc!JxC`b2TJkzr0`fgfq_yRq zxsLk|{^L<=5@Ocue*a)e(neU??!~k zR+)ZW+;eW`D})LhO41m^BmxnZ_S5Y$EfkuCj@4+>j2EXl)p<1g8Kz#AhaoP4hD^cn z{x^fULTZ`?E$C(l= zE(TKl4kwc^l3lxwgOIhqV;i?S44e+#OpA8#M3PU!ZV(=`$NMX9{z&+@^7 z_0x${=|l&oLnAl-2bfHO#|}mO{TMpl>+{`rW32>ISV$dyZzLt0lVz44>5jksZypdi zv6?GrW(KW>XR$rKACQrdb}(%P^~jixm(Xm}7tigYo=%$1^7;v;bz1-wD)jJZBE*_% zE*wqf_m|w>!zevmz^bu0PL3V#H?+Vn@VWa%E5pN$JAA3pm*$jckYJbBU)MRoF+Rq; zhHhVIthl7gR*X=gei_Y$APlO)f)s^PTajqWcgeLYkH7<{VO8k<^+-p~+w5uqltozn-d z0~_ZP$9Thai+4J~pfxJvU3)dhKhQ zn`YhHE>{~IgaNN6Te%mj^{!4%17BZ)?GD?f&FfB}S%PUhhQ|N6^?J6|cD2K4e+V~w z6_0*z`_x`EMqFO-{U7j0Rf#e1PEevPR`{la9BK!Tks=T*4s=V9l`7)+b4L#a!lw`3 zaz1y5L3GgW5feS{{j;NA>aRvo#7==8aD zDp-+zGgb(7;Y;ZWQPUl(h<|}r#VnfqYbpyPn<6DMF#q$xBme!d&yoZ(=kuG5k<7Yl z`SKHLNvvmZgFd6U@5vhXR5_GnodL}*?)P+vS6mti4Zo{f-fwGl^g>1*@5(&^=Eeqk zA6X>cIT_7AItJ|A(wWBEHy7&ydKZNF_%+na|H)(a43sBmC=CAc=H@>t;pXNxZeDNb z@9)QTtSlXOJ~}*WwgZs)C7u;$7TO$KAfT?j_yBlbLK=8n=g&nJ3HLUSBLWvu?zb5r=lYsUj2X zj(|^I%dycIEUl)2q`epKvQ~m?Ng8nCHGT?btIR}NRJG0PSUCq<=xM$3Q|X&QLX{K; za~zDIDEIL$s(%;*k)Fj$0uElb?A6Y~vz`b@@=7HIW-a@&mBhnYC6PI-?0Npr>m2Jo z=auD}Yxhx9dD@2;#R-D{Fkv3-=mS6Q#?N|}bh|--6$_z`^GyM)c;0f*A+U$ z5ES1Q2Q0wsc{@{LT*@+FVv}ERjON8moKE8dDxNZg&xseA{g&X2V^TwlZ^ai)o-Tk* z_^I>E(>HiPN-MkT;kQcd3)vi;OxHgbH}^$m=(Qi(^KZjUM=mc|_Tv)T%4DjUEW6yS zz)?o>b9v7l+v{I$ddG8EV9-_FXxv32NrdM@iB>Cxb3E*Cd`}iW0!Iv*JGMxZH`l7N z3&lfHU{04?Zs88s1!vbfE!zHkJLEiJJHCYoips=25lZQ0oRg>#Exm?#7o;6 z`Z@pS{P9YD*Ijq%=>Y^B2t_|vR=KLsJV&YcQ(&zTjp>H{W4e7b^_QxN^odw0dMSb# zTpqWDYfuU*176qF5CI6Lf&riIC$?lXtwkYxrDVM((n!EKI&E0_F%(n^+d_hIc)FY&nwDKMDw=P_f7%WUDKiF&;|@*z2~Y>bd9 z+z##h=@O?;Bd#*31Z;a=E#KKACv-S{8>O<>UOz3xzjoTlUqeZd>5BR7EI-wuqN(lk z!1UM*=YCJR6ftw_u!JRs-~@Yg=A?1^qdMtO!gBO;MqT#SZ;)y$WkzA+=C>n?occ?e zCpZf8y#_2Pt*OS}rzywps zn~JG9y2Ny`uJC1(cI2B?8kVOC$1u=W@X>Bqz$uW*N(`kE26;g2u2P5ds>*TB1XDG- zQ$=J&Ud_T?_&t23KsCWN9*%~avg=+xPWK$b*9MzMZJ+Y;Y7gFXTqonaf7CJuGl{CK zYFFNyA@t>?8HxC;RSHH9`%0u^nuHux6{DROU>#(B{uC{wIct=LQ*V6OB-Q$vYderkRJd#@a ziIyy_?Eol3#|EHvPdArxAtthHY&*RkK0}s!9e6G)LLx=EM+Ar@lBXgFQGx;;iW~|4 z8kKQc)n5we1?1{A^i*8Iw;|uj@mez^p+cSu1 zGD3*vUs!d(HNqB=;Ntk#0dl~1Gtq1CH;Pzhf>K6Xd*d0oT(TPbB*pn|25@Rtp_y7| z8GH&Dk^)8mr5>TYOCwewN1^9tKUA}@DW2cvm3`_jmG3!N=5|YhK+2Q++vX2yl5hcT zaqfQ~W2d^*rIxB%$^@k7r$aY_?!A_XKFnOba|?e?*?MQZVgj7k?J9gD_GZnDzHSe{ zUp3ZI%1c8Q=~Yf!84MSm$VkK7EmDc zOoPI^43akdepNA9D5gnLCp|fuJH|W~8l%ypB;_#bhK8uYOGuTBjO#9*W_bsV#i|zV zTs$yD>KYqo5sIsh){AQ@jVr7u9PxLarn+Id;Xbt@J>r~^sHgo-|D6OWL%QQr=^DG# z8!9^Cqnc!cXLOh-Am>zDJEy%ncJ-^fW5z#b#f9)*@0 zC{eGS9)F}OMM6Y}i-d3r{AiL&lTe0G;DedM)a>HXO6O?kxW$m)Dy3cUBx;WXbxX@q=(lxwA~dFNJIKf+QGK6m5-p9*}LSU$v#GMv0S zj!9vv<-0B3UZp$Nb$O)@wk&d$L!x~4vTc@H1<;a2b=Bn+!R@4#;EZL@faRrKf@4#+ zYm&3NRvf&N#wta04CbUVwT0NWUBz%Xs{{5k)a1z@Rj$I7;6s6qzxFn3TN!%AHThM)|c~pe{=Q@l+cRvK}Gvgf>%DQds zl3R89NA~{;NWkl2tR$*Jn`2X36r|vat(N{?s4?j^voC7Lj%wsI>y`L*P>3`|T9EW< zuE3!;u?okfPmNno)2eFo8%iO81h+I5(;#pM(&uSpv6kbXPbh=*{Zv1TI{fesAuplR zVRgOB=cI7h6(&rJczbDmhL5Y>MM?5KSNQyO18(95&#!aE1 z@b;da(>gKbez@MS&&ZRYBiW7;OW?Au)QmNnOzu-`6g(VdBDhVQnA&*|5UkcW#kph^ zwbr=-xLAQ+V+*%`Y^UaUv0U`TW0~(m$ZtFEx!%U!6HonKp}$uc!MW8b`1jMYe^(02 zz})d$THNLb3=38XZy9z66@>=cbmV?r1xLi`3s9kF-(5VS_m%spRJ`~ndC6C^yLzkx zCM#?!$#(M1^rS{Soc^jxd#T#J!P$Se+$(ZwFj~L7GSR(T zzw?fu2LP<*=@G>w0=>j=o@oxlSua(_z-70K5qt|VGM|cDGwZsIt<6m>Rh@HbO0CLr zSP|Q-)pVANGEpPi=YxcoBqHSMP}8UWxGKxZ5IN{f6EZCcdWJzXR=!Du*-&E`Gz%C>g++Pn zIV9qJ5>uJ>^o5&td9aF(6O*Uj02k*m(IP#TbaPGXNmNXQS7o-sc#qQPgRY?1a-5+9 z#2Qcb!iBZtKj_*~ofRlN_7@PvPvO4HPrO^g5v$Z1Z?EHmQ`PnMbEUygV^NOZca8x8 z|7Niai~izW5)mpVRf;TFqeLEkh4oC>MrGP6_;lPrf+a#`oHA^kHU!%!Q;>(Qs1T5K z4$`>G@3`_c8&Xl=N?Te2mllqYUAo*u`);eTR_SRt^g|$mwp^`ItiWy{hS@Pg=+7UU zf>_6M-^|AqiH`F>pFvm6M!9nqNu>iCa7Mgc4KFjr!(WLtwSz@0{+=7S)0jqG%Bg6j z^P(avkSI|j@>7%)!F0V5b!i!9JEmoSe{|9wq68(cEI~?PxAY+e;$VT$50@Qg zQrYvU+AO55^LNLenk}|Cj<+(~_2>C5f{)-W26RXQ1%wmN<&S;t+&`s7L5KFSQR2c6 z`8Zq{V-)&IDHQ3S5@stU37}Fa?L>+TjD#3jKw!}#)C?BiqrAyyhb5-CTd5*=tZxWg z?}!%Wp1v?bk%9`*VPRV=tB36Bod0^!(UG4?Z<(fTUb7%YgY1RuVY^6~$< zyfhf{g1yFwB6XgJM(UFpnQM#NIXf^-}!+kYriY^n{5s%!b;)McBP$Og}Jc2Z0V zl)9J4tGu;M2k1-E>8mu7tq@9W_6EK4(qy7| zV;ePQ(!pBX$;3Q3Ty%}tosaTjc+KNJSsYAGLj)i5a_lwl3C@x@AV-p0LfYfqmCoz; zwpFyuVQ@@Q{}7g@A;o)mZ*Kntg*P?-NVJruD0^gWyu&<=Ka@^5DqpVfH3+rTizeY2 zM?W>+!q%1k$>d8BMtuA9EBe>RT9F8v{XAMRJ&?fzmXXeN+7(yCY_Hq;)TDGa)mO6% z7oE^nrcQ~|;$i}ZLSlV#alpxgiot7DL$x4Geq>1Rab0z6ey%;n@VTuEnnFS26se1P zsq;t+B3FZg3Li$dioVq%hD$}gICI`CRve4iM29Q8G%9;!4IYBI5UkFNu?4P2^yj6v z`KQh?MkBYKx=U7(vB1d8>i%P&G)Wj;eJOLdiEDgM*E~HXOu7aj1N6~Y1DJaASRh@_ zVZgOPP-+L7@Es(HSqSo+~($3%~rm?7sQ4aGugt7icPadi8 zYaoFx%w8yi^&rtX&WSlJ`DghNp>Fk*l;wPai;KyWfiD^VYU^xLdj*$TIFq zgSQJVbVuyjpw25N+q(*v?C|<~bcv{xE9CxiUjnU3U}+#9yRrIWPFhB4CgT)}kOnJ^ z8}X?0H~b>iL4|WyGdtgjBNb-gxl)R)#9q)XiP#rF%Tp~<#L*;>DFxmlv|@Jg^`aV- zQUnrB`Is3L0CDN(X@AD`?_)Hp4_Jb%3gIz7_^j#r7iA^at(?DOsC(x>Bvm(1?^$ zjD_gzBV(GF7J3*LlLhjwF>wvs6&&G%1jFSWiL|2G@3N7e3A$+`#TF*=wCWf>Y+XDQ zW_I~}4>@S^0u5(4GW94=Pn~^(Me8h86zTfbv)~lTP1NUiQ&Ql9PgJfcYz~g|HrJV0 zgl6US6jxT*QWY3ADqOzve3EV@>{{SeW5n7rDK;c96)=L!9CgX`lS$m36RJw$1yl=4 zezl1rm=O?V%e0Nmwa^(wtwkqpEabi0k!W_MGEZ6wAg}L)BwT$S*m| z-rCVQF__{=$r)TacN>o~Q+1BN#Lg%_59(639Q#|snHB_E# zUZk36Ts-E9+AF`{vi_9qNhmY5a5h`yf66I+1@?WFK)b~nFfA8*HU*x+x^*9q3_Uq? zANnRVe9s>Ord%bVIXU~?8`Ohjwcmq*bKQC0ngGGi zL?cl0_hb268WmCz5&c!30IKCkLsqM=$1CBrqZg-_#V$%KB zNyX!-ocy40WfdLb-+x8Bs4}S)^9;W&PJnBR)*wTB&bKL%nBXpQF~Yw|m=kHnKSe6f5Urc!UdI5?sl?u z)&Ddup6j$(r06Z>;>D&D9)btn2^sc-Qk4SHZx{f07@DsuKdxwtjXk;^WEi9o{hhI@ zY-Kd$mLEA_pFp|EqYe(Q%iL?#c1o5A@T=-6+q2jS$iZ5;c@UnLJj4gp`4tkYk|1afFHvBh6=#h)N z=Mft~^wo-dH%avIV@}ZHH}P_BhQ5S+x6uaNWaX1Wqo`pw01Uw-OO%gNska9-WaG#3G8U%ZEAOt zC_YnW2hmfOf!DF;4z=ipa{-J84SMvPN+xjNorv$H6viHll zL)!0)104_)_0JK0p|}T%Tlc2K1*+ldlb$9tH&Z41ga-sS@>90CTusP)glKYP9$bVp zRw*-@l$4FDMhvnogGscBE*5naN~Am=qTPG{Kz~HY{?C|iKA#6ye1QO-KlH8}b!?7S z8({(U(}A8Ron}uv`&)tcY(j%KA4A`RVpvE#Yj_=gE#qnlL@LcC@ba5LJX-J9E(Umd zo>1+HbHbKzE}LzdgXw0LsBN-;E{e%D)H>1Prs5v)Hc?p(_Iy>up*1?xq>ntU6mogb z4%J2U+)Finn?_%F_<|oufPnAxZ%4tWslW)wfcqaClu5I(sugB~Hl69xC206HjXSQ* zM7?e!`GNa1NY7lvgI%ZFz+Qxyol+p$Arq#{@7nwmo3t3_pPI-|`iPKQd1OqCF*V=+ z)kJi4%e#uTu|;IhSFm5a{+Zu9y67F}b)k4`=C218E9C!50HU;De zl&CqRwC&=L@gx~PbSaq5&cbIf@4HJ*N&TGV-sg?2HE;|%MD8`G1uX`E*F#GL#`Iwi!F_+B*W#C++0m&4@Pz)SCnMi5d$w~! z6aEgsz}G&i>KHaEmdTb7_vb&8pZ-VkFk;TeBn2f}BB5<$Xy55BD5AfM4n*uc!)Unb zDtQ^+^s|eiyi&Imob#qi2oWOME^_|Hvr?zY!)A(=uF#`Z^cp&0D0(2a{XDeP204~b zB$P)0cEglAd>!lf#`oE+XE?-KHD;74I7|U7F51d-4??hYLSkw*HX*sEC zrRKboEF2bRlAnx#Yua*k*=M;lp#0G|!Dhzj6m)WT_^~ke!x4nq$-{`r7vSt*$aG(|i(cj5U2_jYTHI1SrS^8)vG?g%fJ5CRBByOBh?OSWqrk z!aoQ*)WBM=qkhvSRFKYAK>$Re9q^1or!1dy!mL?Jds%XeNUX7Aq*)5XtMC)~Chjs$ z4DHx-pqer{G-*OoA*qv37Qy>vnm@vMz&GLF!{s@jtDEwegmS}wRST2K50*F_o&p{4 z%TDcyXN(7y3yHdNjiYq2gzQ`TbH%(TEyX#w9ekxHr}7>Nl5*roCfB)zC;Cm$4QvRh zhuhP3flvjqH?uRFp6k0<&vJuSX0p0xUH|a_CkJ_ZHe_6R$i}44rB{4S33artB3aP0 zaQ~K)L4^sA%=}qaMx$?RJ$VD#%s8{=0=@xi@eIwV3gk)}o@l7Y5?;k-74F4}Hs`bd zY;HtML+nw`M$+R1ibW2!y~EZP0ozqp4j1@t=ykyH*z-{}Ros7#XJpS%rC5V5C#zdD zXk1#;YDlp3ojR;143@@}HkJnBYDvU5me%r#Ql@EJp37#>Gy<)R4^nGg1B*i^EfBM) zrKd2&pX6w^Ligy^OLCNOnJtCkN0am2gTWR;+9rTaR0>V6~Je``oUspQn9K zK%)}Ljx65TYwP>WoF**Tf_=9w=#E#<0@;%Ny$N1dNs zny^qj#cQrN{aB^B?%&7v{sFjZ(@KYTs<;!Gp1b}F8H!9TFtxQVa`aW`!I@0`a+JS3 zJ@p*6`lhhz9NtFgxB}qU5>xsfTtX2u9-zNZ$NRhvZ;Uz{KRw5)hKaCTKWuYS>OsgJ z-yi$=m+KN~VMMoMGgtK)@AZK3-&>dduzwGXq&n!6i6D`JJOOh*<^a18b~`T4-^YGl zhCy2Qb67$30M8%WPeLnPUT=^d0~{gPzDfN9Co?+F{Uu`t2!4FK#nr!Y&-^s3ICsy|L?;8iTS@mcjw2y`2e;)>%tai4$}X1qyS_j6vgXAjYIwiLsIqv literal 0 HcmV?d00001 diff --git a/images/folder_black.png b/images/folder_black.png new file mode 100644 index 0000000000000000000000000000000000000000..f0c89295bea3071a5ce809386191ece78c9d11e6 GIT binary patch literal 7739 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 literal 0 HcmV?d00001 diff --git a/images/folder_blue.png b/images/folder_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..ec9831eee6bc2d24956fd941006e765a0483280f GIT binary patch literal 10658 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 IM6N<$g5_%%d;kCd literal 0 HcmV?d00001 diff --git a/images/folder_green.png b/images/folder_green.png new file mode 100644 index 0000000000000000000000000000000000000000..f194a4daaffb16986fd9f44594e3fbac02c8d3a5 GIT binary patch literal 9784 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 BN?`y1 literal 0 HcmV?d00001 diff --git a/images/folder_purple.png b/images/folder_purple.png new file mode 100644 index 0000000000000000000000000000000000000000..2415f59f0f724d511396adf1933ab2a252d724c9 GIT binary patch literal 9835 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 R<&gjY002ovPDHLkV1gW~RfGTl literal 0 HcmV?d00001 diff --git a/images/folder_vista.png b/images/folder_vista.png new file mode 100644 index 0000000000000000000000000000000000000000..f3019b10f4e82ef68b568de3616a367523f1b63d GIT binary patch literal 10542 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 literal 0 HcmV?d00001 diff --git a/images/loading.gif b/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..53ac6b633777d96b243e583006c2a77bc9d36eda GIT binary patch literal 12154 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 bPY3MXM>?TMQP7YAq4%PIgeo8?f(5bB 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 literal 0 HcmV?d00001 diff --git a/images/questionmark.jpg b/images/questionmark.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ddf42a6d48aaa247ecf36121eb2d31bc105e1496 GIT binary patch literal 10577 zcmeG?d011&_LBq>_C>_4Rbxb4frM3}h!9XgBRib}+uMbTO+iYV2hrl=rt-^|TIg0}j8zwiC^7`{6*XSrw2oHKJWb2-E< z;vStBnj=XCfX@e`000(%LFol(ut$M^fHDA>lYIbED4!VmvneBVJXFZT0k8&x;Db{< z$$oFxU$IaE%yjQ=h3yq!)iDQv;STyXNTf)?n2~7;wL+DqP%?QjK1{wqD3K!=c(OTc zE{DVQVlz4ZTyGz)mp=fsO%(081OdP%szH9vCR$e?j)e-HLeuF;H=YM&P}e*tuEz7A zQuHz??o@+pb6c%AFa@^IBHEU?MLY#IvT(UE30q!-6LC`#bO%9!g(?_IKaPw-F|=jdZ8Ufy`o zRUTtlY0R^G&xI$P0K?Vi_%*0RSzl3ToUa;dFsSg? z8Vv7Jfw&E9XyllVAP}_1mWB-*=~5aN9_CUST^i=HYHN1{0f;Lf$9C0(Eyh~@-Qu4Q z1{{d5-}-7r?eZlX_f)mFv`$*M{z>!e!wbhr?FTm{9I3SL5amZU6JQq3oj!rKF0pt1 z<~qL_kJ7XAH^x1Y9=$N|`@7%NYx-b=8+h9mmkq7>^^Ndx{Atd*yxhin~?kcnP8?7;wZ+XpQ>wcJ7oEg9JrSwqa^7IYn zH$FS3Dp*oofxqAX=iYFR)HrVMu25u(-U4lZN9a; zl2*3oSe;w$xdUaIPxjx4Z+ZQ53jsKpfemNM>*u!mS+3o`_rj|OvhiQuYG|&$R4KeU zv~_C7%vSgEjoeqY4NZB)tp(>Ku6Gja>IxrK5@1f}nMZ3Y=fLPkn@9~$G8Pu1F3r25 z`Qy!`?CGb@|1hUUc0ED(TYjIGJ;nIZ((oDJ%7CjN4g6;I*rjw8T!7o)97e*$7+y%+ zFctJytFyK>cJ28Jm-6PV|6xPa5l?Lky27}ZI~$A*4&$2*BcqA~SsPU(jY}d{!Wz+0 zSOvgZiNn|*k*QW@sv(GecK}a{$6)eInZA$O=*hu6)P~8`n4X6E2nYE|UcNF|nxarh zkz{*PZj2-cu?I`k2#LBh@I4L9AcpCg;ke+y^QpWP^u*gxeC&I zAx@rBE!T^MI;7wRAX=>A8vq_I=XC*cbr&!#MXEATri;~C1|U=>4KV<4nq8uUh3Vpm zl-WW!zSe+x%b;Ix5G`UdMT*RniHhG4NS4XC{2g4d^j*GSTofB8S5F!mEk&L%lwhfd z`96HKN~$LDkvY!kmK>6^KcbRH zfEAaHQOB4;PtYleKzXJV#R)W7dWs@bE>d;dZ9+8~8Z8)rmZ(%A7o$EZ zXek@R!D@v}2P0KLv^Y&qM=)I_l?X9aymT7c5EPSf%t;zVqe#Obfv^xG*$gqR$W)r3 z=n7mSmdJJc%qBDjNsl0LP=>7_Q>~bc$uV4@#zYVSVsn-HNNS~JMi@j1lZlzI`ESpk zmWfM^LNFW=8Q&DcSBZ_oG*n6;RmTd%CR}zx48DiusKZoKV)@hbVaGy`Het3*Q{Z_) zQi)h^DSPeYr|8j84~7U!6=afO&@v0d)$d`C*P~6@ty9E2g;aqX8P`!OKX|f%0AB&q z6>?;2OSM7?fBaOKeqkV*l@u6%@8GSWi_^NZlRI_<5(aGGLk)aJ_O(0L zk?d2nvCIrz+q4T>yKfOcFdqpkv{iI_h>`}t_Maf$7W9J`ot}$O&qb)`BGhvc>bVFJ zb=sIZ1jb4L&nYl!qOfTXg5WVl0aD;`g$W|zElmLrFAAU{drHXR^Z^bg;DH#RJrt7B zTzfKNkS8QK264}BbedYNRqg`xS3ScGp@Y#GN4@;9w$-}Xjyy>yRymXEq6J6S95TOka*W$IIK#&uBfRk082Ni?Cfm!Y%g~OF81K~`}-pqo}O-y z!%dYdR||6736D>tc|<}F zOp3{%Y!&3?koqaPJRB3idsr;IgXtaBbzL|4>WXCR_%V2G!va{yX>J^jn-@D){~2~P zn*&{^W#z+VAcFV1k7HJdB&oR{!^-D#!{jQpKrY0>LIPM&DR+rP#ASPqWpg-w-fTZl zw(nRDXRIG*(pVpV4u==w84?uYN$LdO4N(X)krDLoiqN~9k9${pOcqH0Z!!$7;*v)^ zzCr|T=*41+gxpjGE)&2-B9RHin8$1-CPr%(P7NwNMWTWZ%GK?H7%W5AlS-K6(&7q) z=zBu|ONd;FiC8+c3bY1)~IXu{8!)u*Urou#YMI|#8sD?s=J(?M;;eXc6P%)>QlZ8%aFf14hx}~L+ z70hTbEfgA!W^QI~NvB)dT3K4z+M`SbdzkM4i>|TJLZ%>V=DX@Wt6Evg{r|1baVy{R#X**N^>*=<}g(uD2nbRfT;?- zJxew-oVA$(_q_U~JafT|o)6=B$CPf_D^wl#2^qe!Y@cu6Sdsd~wFV27DER3BpBQ58jUv2;4?5#(yNBW1&l;kd2SMlSy zy2ov!xZ$&A=Ph2pyuPt3VID`n{;s~E1BQ##aegn#_MI3p zvgW>K{;I9}O;w&`lx1O@WMQK7->7Vw4DqII@nPqzQBUG-Rqjbh*?lU}7_1_$e1LxS z1N3Vjpw}4FV-LsIdVftnen0M}&s6>=Q}C%<_tLjpbF~@A7R8dR31l zZyhYdh}OH?}-Ha*;DD{m_xEYm#Jp7KESav#b1k?ahMq zrN2Z^UVdX~?26(|>u);eyBWMr+%TCnToK80t2J)|e_lT3^0tEL&hQz(p8EXZ;ehZ$ z-?pM!R{x!{g559Iq`TQ4ze%4t!)^2_{{i%*@S`sY@U5sI>G#65g_^m9~ zI^Imy4AvxHdPaat!SG3o$i)vGxm8=;nDl$E@wboe!_Tb3(?h=fGY43AE`NC|>eG-V z$5s~xWt{nxbH;|VGb&^=YY~Wxi<$^N0gRxOy$roPU9<-riThmu#GRG}B;nVPA$<*7;StZXu z4P}%k_sU3k(zzhtw_@|7+g~5w60!Z(onJ1M6giB)I{IIcVcr$D%bocdUE3Zm`feM# zYJ_It1HT7~hkf>Trf6P0xLoqZ^M{s0ito18vvaejU2hrCZ^zK3za;+S+>p46O^rc! zobxuaPbh5SUp{wnn7HIqhe?~G97CPsLeW3nIdRjv!b~;sAH{|)C3T^ys@wj2H+H?V KlDoyWx_<+BxQ@O6 literal 0 HcmV?d00001 diff --git a/index.php b/index.php new file mode 100644 index 0000000..fdf4aa5 --- /dev/null +++ b/index.php @@ -0,0 +1,409 @@ + $length) { + return substr($name,0,$length) . "..."; + } else return $name; +} +function getfirstImage($dirname) { + $imageName = false; + $ext = array("jpg", "png", "jpeg", "gif", "JPG", "PNG", "GIF", "JPEG"); + if($handle = opendir($dirname)) + { + while(false !== ($file = readdir($handle))) + { + $lastdot = strrpos($file, '.'); + $extension = substr($file, $lastdot + 1); + if ($file[0] != '.' && in_array($extension, $ext)) break; + } + $imageName = $file; + closedir($handle); + } + return($imageName); +} +function readEXIF($file) { + $exif_data = ""; + $exif_idf0 = exif_read_data ($file,'IFD0' ,0 ); + $emodel = $exif_idf0['Model']; + + $efocal = $exif_idf0['FocalLength']; + list($x,$y) = split('/', $efocal); + $efocal = round($x/$y,0); + + $exif_exif = exif_read_data ($file,'EXIF' ,0 ); + $eexposuretime = $exif_exif['ExposureTime']; + + $efnumber = $exif_exif['FNumber']; + list($x,$y) = split('/', $efnumber); + $efnumber = round($x/$y,0); + + $eiso = $exif_exif['ISOSpeedRatings']; + + $exif_date = exif_read_data ($file,'IFD0' ,0 ); + $edate = $exif_date['DateTime']; + if (strlen($emodel) > 0 OR strlen($efocal) > 0 OR strlen($eexposuretime) > 0 OR strlen($efnumber) > 0 OR strlen($eiso) > 0) $exif_data .= "::"; + if (strlen($emodel) > 0) $exif_data .= "$emodel"; + if ($efocal > 0) $exif_data .= " | $efocal" . "mm"; + if (strlen($eexposuretime) > 0) $exif_data .= " | $eexposuretime" . "s"; + if ($efnumber > 0) $exif_data .= " | f$efnumber"; + if (strlen($eiso) > 0) $exif_data .= " | ISO $eiso"; + return($exif_data); +} +function checkpermissions($file) { + global $messages; + if (substr(decoct(fileperms($file)), -1, strlen(fileperms($file))) < 4 OR substr(decoct(fileperms($file)), -3,1) < 4) $messages = "At least one file or folder has wrong permissions. Learn how to set file permissions"; +} + +//----------------------- +// CHECK FOR NEW VERSION +//----------------------- +if (ini_get('allow_url_fopen') == "1") { + $file = @fopen ("http://www.minigal.dk/minigalnano_version.php", "r"); + $server_version = fgets ($file, 1024); + if (strlen($server_version) == 5 ) { //If string retrieved is exactly 5 chars then continue + if (version_compare($server_version, $version, '>')) $messages = "MiniGal Nano $server_version is available! Get it now"; + } + fclose($file); +} + +if (!defined("GALLERY_ROOT")) define("GALLERY_ROOT", ""); +$thumbdir = rtrim('photos' . "/" .$_REQUEST["dir"],"/"); +$thumbdir = str_replace("/..", "", $thumbdir); // Prevent looking at any up-level folders +$currentdir = GALLERY_ROOT . $thumbdir; + +//----------------------- +// READ FILES AND FOLDERS +//----------------------- +$files = array(); +$dirs = array(); + if ($handle = opendir($currentdir)) + { + while (false !== ($file = readdir($handle))) + { +// 1. LOAD FOLDERS + if (is_directory($currentdir . "/" . $file)) + { + if ($file != "." && $file != ".." ) + { + checkpermissions($currentdir . "/" . $file); // Check for correct file permission + // Set thumbnail to folder.jpg if found: + if (file_exists("$currentdir/" . $file . "/folder.jpg")) + { + $dirs[] = array( + "name" => $file, + "date" => filemtime($currentdir . "/" . $file . "/folder.jpg"), + "html" => "

  • " . padstring($file, $label_max_length) . "$label_loading
  • "); + } else + { + // Set thumbnail to first image found (if any): + unset ($firstimage); + $firstimage = getfirstImage("$currentdir/" . $file); + if ($firstimage != "") { + $dirs[] = array( + "name" => $file, + "date" => filemtime($currentdir . "/" . $file), + "html" => "
  • " . padstring($file, $label_max_length) . "$label_loading
  • "); + } else { + // If no folder.jpg or image is found, then display default icon: + $dirs[] = array( + "name" => $file, + "date" => filemtime($currentdir . "/" . $file), + "html" => "
  • " . padstring($file) . "$label_loading
  • "); + } + } + } + } + +// 2. LOAD CAPTIONS +if (file_exists($currentdir ."/captions.txt")) +{ + $file_handle = fopen($currentdir ."/captions.txt", "rb"); + while (!feof($file_handle) ) + { + $line_of_text = fgets($file_handle); + $parts = explode('/n', $line_of_text); + foreach($parts as $img_capts) + { + list($img_filename, $img_caption) = explode('|', $img_capts); + $img_captions[$img_filename] = $img_caption; + } + } + fclose($file_handle); +} + +// 3. LOAD FILES + if ($file != "." && $file != ".." && $file != "folder.jpg") + { + // JPG, GIF and PNG + if (preg_match("/.jpg$|.gif$|.png$/i", $file)) + { + //Read EXIF + if ($display_exif == 1) $img_captions[$file] .= readEXIF($currentdir . "/" . $file); + + checkpermissions($currentdir . "/" . $file); + $files[] = array ( + "name" => $file, + "date" => filemtime($currentdir . "/" . $file), + "size" => filesize($currentdir . "/" . $file), + "html" => "
  • $label_loading
  • "); + } + // Other filetypes + $extension = ""; + if (preg_match("/.pdf$/i", $file)) $extension = "PDF"; // PDF + if (preg_match("/.zip$/i", $file)) $extension = "ZIP"; // ZIP archive + if (preg_match("/.rar$|.r[0-9]{2,}/i", $file)) $extension = "RAR"; // RAR Archive + if (preg_match("/.tar$/i", $file)) $extension = "TAR"; // TARball archive + if (preg_match("/.gz$/i", $file)) $extension = "GZ"; // GZip archive + if (preg_match("/.doc$|.docx$/i", $file)) $extension = "DOCX"; // Word + if (preg_match("/.ppt$|.pptx$/i", $file)) $extension = "PPTX"; //Powerpoint + if (preg_match("/.xls$|.xlsx$/i", $file)) $extension = "XLXS"; // Excel + + if ($extension != "") + { + $files[] = array ( + "name" => $file, + "date" => filemtime($currentdir . "/" . $file), + "size" => filesize($currentdir . "/" . $file), + "html" => "
  • " . padstring($file, 20) . "$file
  • "); + } + } + } + closedir($handle); + } else die("ERROR: Could not open $currentdir for reading!"); + +//----------------------- +// SORT FILES AND FOLDERS +//----------------------- +if (sizeof($dirs) > 0) +{ + foreach ($dirs as $key => $row) + { + if($row["name"] == "") unset($dirs[$key]); //Delete empty array entries + $name[$key] = strtolower($row['name']); + $date[$key] = strtolower($row['date']); + } + if (strtoupper($sortdir_folders) == "DESC") array_multisort($$sorting_folders, SORT_DESC, $name, SORT_DESC, $dirs); + else array_multisort($$sorting_folders, SORT_ASC, $name, SORT_ASC, $dirs); +} +if (sizeof($files) > 0) +{ + foreach ($files as $key => $row) + { + if($row["name"] == "") unset($files[$key]); //Delete empty array entries + $name[$key] = strtolower($row['name']); + $date[$key] = strtolower($row['date']); + $size[$key] = strtolower($row['size']); + } + if (strtoupper($sortdir_files) == "DESC") array_multisort($$sorting_files, SORT_DESC, $name, SORT_ASC, $files); + else array_multisort($$sorting_files, SORT_ASC, $name, SORT_ASC, $files); +} + +//----------------------- +// OFFSET DETERMINATION +//----------------------- + $offset_start = ($_GET["page"] * $thumbs_pr_page) - $thumbs_pr_page; + if (!isset($_GET["page"])) $offset_start = 0; + $offset_end = $offset_start + $thumbs_pr_page; + if ($offset_end > sizeof($dirs) + sizeof($files)) $offset_end = sizeof($dirs) + sizeof($files); + + if ($_GET["page"] == "all") + { + $offset_start = 0; + $offset_end = sizeof($dirs) + sizeof($files); + } + +//----------------------- +// PAGE NAVIGATION +//----------------------- +if (!isset($_GET["page"])) $_GET["page"] = 1; +if (sizeof($dirs) + sizeof($files) > $thumbs_pr_page) +{ + $page_navigation .= "$label_page "; + for ($i=1; $i <= ceil((sizeof($files) + sizeof($dirs)) / $thumbs_pr_page); $i++) + { + if ($_GET["page"] == $i) + $page_navigation .= "$i"; + else + $page_navigation .= "" . $i . ""; + if ($i != ceil((sizeof($files) + sizeof($dirs)) / $thumbs_pr_page)) $page_navigation .= " | "; + } + //Insert link to view all images + if ($_GET["page"] == "all") $page_navigation .= " | $label_all"; + else $page_navigation .= " | $label_all"; +} + +//----------------------- +// BREADCRUMB NAVIGATION +//----------------------- +if ($_GET['dir'] != "") +{ + $breadcrumb_navigation .= "" . $label_home . " > "; + $navitems = explode("/", $_REQUEST['dir']); + for($i = 0; $i < sizeof($navitems); $i++) + { + if ($i == sizeof($navitems)-1) $breadcrumb_navigation .= $navitems[$i]; + else + { + $breadcrumb_navigation .= "" . $navitems[$i] . " > "; + } + } +} else $breadcrumb_navigation .= $label_home; + +//Include hidden links for all images BEFORE current page so lightbox is able to browse images on different pages +for ($y = 0; $y < $offset_start - sizeof($dirs); $y++) +{ + $breadcrumb_navigation .= ""; +} + +//----------------------- +// DISPLAY FOLDERS +//----------------------- +if (count($dirs) + count($files) == 0) { + $thumbnails .= "
  • $label_noimages
  • "; //Display 'no images' text + if($currentdir == "photos") $messages = "It looks like you have just installed MiniGal Nano. Please run the system check tool"; +} +$offset_current = $offset_start; +for ($x = $offset_start; $x < sizeof($dirs) && $x < $offset_end; $x++) +{ + $offset_current++; + $thumbnails .= $dirs[$x]["html"]; +} + +//----------------------- +// DISPLAY FILES +//----------------------- +for ($i = $offset_start - sizeof($dirs); $i < $offset_end && $offset_current < $offset_end; $i++) +{ + if ($i >= 0) + { + $offset_current++; + $thumbnails .= $files[$i]["html"]; + } +} + +//Include hidden links for all images AFTER current page so lightbox is able to browse images on different pages +for ($y = $i; $y < sizeof($files); $y++) +{ + $page_navigation .= ""; +} + +//----------------------- +// OUTPUT MESSAGES +//----------------------- +if ($messages != "") { +$messages = "
    " . $messages . "
    "; +} + +//PROCESS TEMPLATE FILE + if(GALLERY_ROOT != "") $templatefile = GALLERY_ROOT . "templates/integrate.html"; + else $templatefile = "templates/" . $templatefile . ".html"; + if(!$fd = fopen($templatefile, "r")) + { + echo "Template $templatefile not found!"; + exit(); + } + else + { + $template = fread ($fd, filesize ($templatefile)); + fclose ($fd); + $template = stripslashes($template); + $template = preg_replace("/<% title %>/", $title, $template); + $template = preg_replace("/<% messages %>/", $messages, $template); + $template = preg_replace("/<% author %>/", $author, $template); + $template = preg_replace("/<% gallery_root %>/", GALLERY_ROOT, $template); + $template = preg_replace("/<% images %>/", "$images", $template); + $template = preg_replace("/<% thumbnails %>/", "$thumbnails", $template); + $template = preg_replace("/<% breadcrumb_navigation %>/", "$breadcrumb_navigation", $template); + $template = preg_replace("/<% page_navigation %>/", "$page_navigation", $template); + $template = preg_replace("/<% bgcolor %>/", "$backgroundcolor", $template); + $template = preg_replace("/<% gallery_width %>/", "$gallery_width", $template); + $template = preg_replace("/<% version %>/", "$version", $template); + echo "$template"; + } + +//----------------------- +//Debug stuff +//----------------------- +/* $mtime = microtime(); + $mtime = explode(" ",$mtime); + $mtime = $mtime[1] + $mtime[0]; + $endtime = $mtime; + $totaltime = ($endtime - $starttime); + echo "This page was created in ".$totaltime." seconds"; +*/ +?> diff --git a/integrate.php b/integrate.php new file mode 100644 index 0000000..df24c25 --- /dev/null +++ b/integrate.php @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/js/mediaboxAdv-1.3.4b.js b/js/mediaboxAdv-1.3.4b.js new file mode 100644 index 0000000..a5e2628 --- /dev/null +++ b/js/mediaboxAdv-1.3.4b.js @@ -0,0 +1,956 @@ +/* + mediaboxAdvanced v1.3.4b - The ultimate extension of Slimbox and Mediabox; an all-media script + updated 2010.09.21 + (c) 2007-2010 John Einselen + based on Slimbox v1.64 - The ultimate lightweight Lightbox clone + (c) 2007-2008 Christophe Beyls + MIT-style license. +*/ + +var Mediabox; + +(function() { + // Global variables, accessible to Mediabox only + var options, images, activeImage, prevImage, nextImage, top, mTop, left, mLeft, winWidth, winHeight, fx, preload, preloadPrev = new Image(), preloadNext = new Image(), foxfix = false, iefix = false, + // DOM elements + overlay, center, image, bottom, captionSplit, title, caption, prevLink, number, nextLink, + // Mediabox specific vars + URL, WH, WHL, elrel, mediaWidth, mediaHeight, mediaType = "none", mediaSplit, mediaId = "mediaBox", mediaFmt, margin; + + /* Initialization */ + + window.addEvent("domready", function() { + // Create and append the Mediabox HTML code at the bottom of the document + document.id(document.body).adopt( + $$([ + overlay = new Element("div", {id: "mbOverlay"}).addEvent("click", close), + center = new Element("div", {id: "mbCenter"}) + ]).setStyle("display", "none") + ); + + image = new Element("div", {id: "mbImage"}).injectInside(center); + bottom = new Element("div", {id: "mbBottom"}).injectInside(center).adopt( + closeLink = new Element("a", {id: "mbCloseLink", href: "#"}).addEvent("click", close), + nextLink = new Element("a", {id: "mbNextLink", href: "#"}).addEvent("click", next), + prevLink = new Element("a", {id: "mbPrevLink", href: "#"}).addEvent("click", previous), + title = new Element("div", {id: "mbTitle"}), + number = new Element("div", {id: "mbNumber"}), + caption = new Element("div", {id: "mbCaption"}) + ); + + fx = { + overlay: new Fx.Tween(overlay, {property: "opacity", duration: 360}).set(0), + image: new Fx.Tween(image, {property: "opacity", duration: 360, onComplete: captionAnimate}), + bottom: new Fx.Tween(bottom, {property: "opacity", duration: 240}).set(0) + }; + }); + + /* API */ + + Mediabox = { + close: function(){ + close(); // Thanks to Yosha on the google group for fixing the close function API! + }, + + open: function(_images, startImage, _options) { + options = $extend({ + text: ['«','»','×'], // Set "previous", "next", and "close" button content (HTML code should be written as entity codes or properly escaped) +// text: ['«','»','×'], // Set "previous", "next", and "close" button content (HTML code should be written as entity codes or properly escaped) +// example text: ['Prev','Next','Close'], + loop: true, // Allows to navigate between first and last images + keyboard: true, // Enables keyboard control; escape key, left arrow, and right arrow + alpha: true, // Adds 'x', 'c', 'p', and 'n' when keyboard control is also set to true + stopKey: false, // Stops all default keyboard actions while overlay is open (such as up/down arrows) + // Does not apply to iFrame content, does not affect mouse scrolling + overlayOpacity: 0.7, // 1 is opaque, 0 is completely transparent (change the color in the CSS file) + resizeOpening: true, // Determines if box opens small and grows (true) or starts at larger size (false) + resizeDuration: 240, // Duration of each of the box resize animations (in milliseconds) + resizeTransition: false, // Mootools transition effect (false leaves it at the default) + initialWidth: 320, // Initial width of the box (in pixels) + initialHeight: 180, // Initial height of the box (in pixels) + defaultWidth: 640, // Default width of the box (in pixels) for undefined media (MP4, FLV, etc.) + defaultHeight: 360, // Default height of the box (in pixels) for undefined media (MP4, FLV, etc.) + showCaption: true, // Display the title and caption, true / false + showCounter: true, // If true, a counter will only be shown if there is more than 1 image to display + counterText: '({x} / {y})', // Translate or change as you wish +// Image options + imgBackground: false, // Embed images as CSS background (true) or tag (false) + // CSS background is naturally non-clickable, preventing downloads + // IMG tag allows automatic scaling for smaller screens + // (all images have no-click code applied, albeit not Opera compatible. To remove, comment lines 212 and 822) + imgPadding: 100, // Clearance necessary for images larger than the window size (only used when imgBackground is false) + // Change this number only if the CSS style is significantly divergent from the original, and requires different sizes +// Inline options +// overflow: 'auto', // If set, overides CSS settings for inline content only +// Global media options + html5: 'true', // HTML5 settings for YouTube and Vimeo, false = off, true = on + scriptaccess: 'true', // Allow script access to flash files + fullscreen: 'true', // Use fullscreen + fullscreenNum: '1', // 1 = true + autoplay: 'true', // Plays the video as soon as it's opened + autoplayNum: '1', // 1 = true + autoplayYes: 'yes', // yes = true + volume: '100', // 0-100, used for NonverBlaster and Quicktime players + medialoop: 'true', // Loop video playback, true / false, used for NonverBlaster and Quicktime players + bgcolor: '#000000', // Background color, used for flash and QT media + wmode: 'opaque', // Background setting for Adobe Flash ('opaque' and 'transparent' are most common) +// NonverBlaster + useNB: true, // use NonverBlaster (true) or JW Media Player (false) for .flv and .mp4 files + playerpath: '/js/NonverBlaster.swf', // Path to NonverBlaster.swf + controlColor: '0xFFFFFF', // set the controlbar color + controlBackColor: '0x000000', // set the controlbar color + showTimecode: 'false', // turn timecode display off or on +// JW Media Player settings and options + JWplayerpath: '/js/player.swf', // Path to the mediaplayer.swf or flvplayer.swf file + backcolor: '000000', // Base color for the controller, color name / hex value (0x000000) + frontcolor: '999999', // Text and button color for the controller, color name / hex value (0x000000) + lightcolor: '000000', // Rollover color for the controller, color name / hex value (0x000000) + screencolor: '000000', // Rollover color for the controller, color name / hex value (0x000000) + controlbar: 'over', // bottom, over, none (this setting is ignored when playing audio files) +// Quicktime options + controller: 'true', // Show controller, true / false +// Flickr options + flInfo: 'true', // Show title and info at video start +// Revver options + revverID: '187866', // Revver affiliate ID, required for ad revinue sharing + revverFullscreen: 'true', // Fullscreen option + revverBack: '000000', // Background color + revverFront: 'ffffff', // Foreground color + revverGrad: '000000', // Gradation color +// Ustream options + usViewers: 'true', // Show online viewer count (true/false) +// Youtube options + ytBorder: '0', // Outline (1=true, 0=false) + ytColor1: '000000', // Outline color + ytColor2: '333333', // Base interface color (highlight colors stay consistent) + ytQuality: '&ap=%2526fmt%3D18', // Leave empty for standard quality, use '&ap=%2526fmt%3D18' for high quality, and '&ap=%2526fmt%3D22' for HD (note that not all videos are availible in high quality, and very few in HD) + ytRel: '0', // Show related videos (1=true, 0=false) + ytInfo: '1', // Show video info (1=true, 0=false) + ytSearch: '0', // Show search field (1=true, 0=false) +// Viddyou options + vuPlayer: 'basic', // Use 'full' or 'basic' players +// Vimeo options + vmTitle: '1', // Show video title + vmByline: '1', // Show byline + vmPortrait: '1', // Show author portrait + vmColor: 'ffffff' // Custom controller colors, hex value minus the # sign, defult is 5ca0b5 + }, _options || {}); + + prevLink.set('html', options.text[0]); + nextLink.set('html', options.text[1]); + closeLink.set('html', options.text[2]); + + margin = center.getStyle('padding-left').toInt()+image.getStyle('margin-left').toInt()+image.getStyle('padding-left').toInt(); + + if ((Browser.Engine.gecko) && (Browser.Engine.version<19)) { // Fixes Firefox 2 and Camino 1.6 incompatibility with opacity + flash + foxfix = true; + options.overlayOpacity = 1; + overlay.className = 'mbOverlayFF'; + } + + if ((Browser.Engine.trident) && (Browser.Engine.version<5)) { // Fixes IE 6 and earlier incompatibilities with CSS position: fixed; + iefix = true; + overlay.className = 'mbOverlayIE'; + overlay.setStyle("position", "absolute"); + position(); + } + + if (typeof _images == "string") { // Used for single images only, with URL and Title as first two arguments + _images = [[_images,startImage,_options]]; + startImage = 0; + } + + images = _images; + options.loop = options.loop && (images.length > 1); + + size(); + setup(true); + top = window.getScrollTop() + (window.getHeight()/2); + left = window.getScrollLeft() + (window.getWidth()/2); + fx.resize = new Fx.Morph(center, $extend({duration: options.resizeDuration, onComplete: imageAnimate}, options.resizeTransition ? {transition: options.resizeTransition} : {})); + center.setStyles({top: top, left: left, width: options.initialWidth, height: options.initialHeight, marginTop: -(options.initialHeight/2)-margin, marginLeft: -(options.initialWidth/2)-margin, display: ""}); + fx.overlay.start(options.overlayOpacity); + return changeImage(startImage); + } + }; + + Element.implement({ + mediabox: function(_options, linkMapper) { + $$(this).mediabox(_options, linkMapper); // The processing of a single element is similar to the processing of a collection with a single element + + return this; + } + }); + + Elements.implement({ + /* + options: Optional options object, see Mediabox.open() + linkMapper: Optional function taking a link DOM element and an index as arguments and returning an array containing 3 elements: + the image URL and the image caption (may contain HTML) + linksFilter:Optional function taking a link DOM element and an index as arguments and returning true if the element is part of + the image collection that will be shown on click, false if not. "this" refers to the element that was clicked. + This function must always return true when the DOM element argument is "this". + */ + mediabox: function(_options, linkMapper, linksFilter) { + linkMapper = linkMapper || function(el) { + elrel = el.rel.split(/[\[\]]/); + elrel = elrel[1]; + return [el.href, el.title, elrel]; + }; + + linksFilter = linksFilter || function() { + return true; + }; + + var links = this; + + links.addEvent('contextmenu', function(e){ + if (this.toString().match(/\.gif|\.jpg|\.jpeg|\.png/i)) e.stop(); + }); + + links.removeEvents("click").addEvent("click", function() { + // Build the list of images that will be displayed + var filteredArray = links.filter(linksFilter, this); + var filteredLinks = []; + var filteredHrefs = []; + + filteredArray.each(function(item, index){ + if(filteredHrefs.indexOf(item.toString()) < 0) { + filteredLinks.include(filteredArray[index]); + filteredHrefs.include(filteredArray[index].toString()); + }; + }); + + return Mediabox.open(filteredLinks.map(linkMapper), filteredHrefs.indexOf(this.toString()), _options); + }); + + return links; + } + }); + + /* Internal functions */ + + function position() { + overlay.setStyles({top: window.getScrollTop(), left: window.getScrollLeft()}); + } + + function size() { + winWidth = window.getWidth(); + winHeight = window.getHeight(); + overlay.setStyles({width: winWidth, height: winHeight}); + } + + function setup(open) { + // Hides on-page objects and embeds while the overlay is open, nessesary to counteract Firefox stupidity + if (Browser.Engine.gecko) { + ["object", window.ie ? "select" : "embed"].forEach(function(tag) { + Array.forEach(document.getElementsByTagName(tag), function(el) { + if (open) el._mediabox = el.style.visibility; + el.style.visibility = open ? "hidden" : el._mediabox; + }); + }); + } + + overlay.style.display = open ? "" : "none"; + + var fn = open ? "addEvent" : "removeEvent"; + if (iefix) window[fn]("scroll", position); + window[fn]("resize", size); + if (options.keyboard) document[fn]("keydown", keyDown); + } + + function keyDown(event) { + if (options.alpha) { + switch(event.code) { + case 27: // Esc + case 88: // 'x' + case 67: // 'c' + close(); + break; + case 37: // Left arrow + case 80: // 'p' + previous(); + break; + case 39: // Right arrow + case 78: // 'n' + next(); + } + } else { + switch(event.code) { + case 27: // Esc + close(); + break; + case 37: // Left arrow + previous(); + break; + case 39: // Right arrow + next(); + } + } + if (options.stopKey) { return false; }; + } + + function previous() { + return changeImage(prevImage); + } + + function next() { + return changeImage(nextImage); + } + + function changeImage(imageIndex) { + if (imageIndex >= 0) { + image.set('html', ''); + activeImage = imageIndex; + prevImage = ((activeImage || !options.loop) ? activeImage : images.length) - 1; + nextImage = activeImage + 1; + if (nextImage == images.length) nextImage = options.loop ? 0 : -1; + stop(); + center.className = "mbLoading"; + + /* mediaboxAdvanced link formatting and media support */ + + if (!images[imageIndex][2]) images[imageIndex][2] = ''; // Thanks to Leo Feyer for offering this fix + WH = images[imageIndex][2].split(' '); + WHL = WH.length; + if (WHL>1) { + mediaWidth = (WH[WHL-2].match("%")) ? (window.getWidth()*((WH[WHL-2].replace("%", ""))*0.01))+"px" : WH[WHL-2]+"px"; + mediaHeight = (WH[WHL-1].match("%")) ? (window.getHeight()*((WH[WHL-1].replace("%", ""))*0.01))+"px" : WH[WHL-1]+"px"; + } else { + mediaWidth = ""; + mediaHeight = ""; + } + URL = images[imageIndex][0]; +// URL = encodeURI(URL).replace("(","%28").replace(")","%29"); + captionSplit = images[activeImage][1].split('::'); + +// Quietube and yFrog support + if (URL.match(/quietube\.com/i)) { + mediaSplit = URL.split('v.php/'); + URL = mediaSplit[1]; + } else if (URL.match(/\/\/yfrog/i)) { + mediaType = (URL.substring(URL.length-1)); + if (mediaType.match(/b|g|j|p|t/i)) mediaType = 'image'; + if (mediaType == 's') mediaType = 'flash'; + if (mediaType.match(/f|z/i)) mediaType = 'video'; + URL = URL+":iphone"; + } + + /* Specific Media Types */ + +// GIF, JPG, PNG + if (URL.match(/\.gif|\.jpg|\.jpeg|\.png|twitpic\.com/i) || mediaType == 'image') { + mediaType = 'img'; + URL = URL.replace(/twitpic\.com/i, "twitpic.com/show/full"); + preload = new Image(); + preload.onload = startEffect; + preload.src = URL; +// FLV, MP4 + } else if (URL.match(/\.flv|\.mp4/i) || mediaType == 'video') { + mediaType = 'obj'; + mediaWidth = mediaWidth || options.defaultWidth; + mediaHeight = mediaHeight || options.defaultHeight; + if (options.useNB) { + preload = new Swiff(''+options.playerpath+'?mediaURL='+URL+'&allowSmoothing=true&autoPlay='+options.autoplay+'&buffer=6&showTimecode='+options.showTimecode+'&loop='+options.medialoop+'&controlColor='+options.controlColor+'&controlBackColor='+options.controlBackColor+'&defaultVolume='+options.volume+'&scaleIfFullScreen=true&showScalingButton=true&crop=false', { + id: 'MediaboxSWF', + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + } else { + preload = new Swiff(''+options.JWplayerpath+'?file='+URL+'&backcolor='+options.backcolor+'&frontcolor='+options.frontcolor+'&lightcolor='+options.lightcolor+'&screencolor='+options.screencolor+'&autostart='+options.autoplay+'&controlbar='+options.controlbar, { + id: 'MediaboxSWF', + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + } + startEffect(); +// MP3, AAC + } else if (URL.match(/\.mp3|\.aac|tweetmic\.com|tmic\.fm/i) || mediaType == 'audio') { + mediaType = 'obj'; + mediaWidth = mediaWidth || options.defaultWidth; + mediaHeight = mediaHeight || "20px"; + if (URL.match(/tweetmic\.com|tmic\.fm/i)) { + URL = URL.split('/'); + URL[4] = URL[4] || URL[3]; + URL = "http://media4.fjarnet.net/tweet/tweetmicapp-"+URL[4]+'.mp3'; + } + if (options.useNB) { + preload = new Swiff(''+options.playerpath+'?mediaURL='+URL+'&allowSmoothing=true&autoPlay='+options.autoplay+'&buffer=6&showTimecode='+options.showTimecode+'&loop='+options.medialoop+'&controlColor='+options.controlColor+'&controlBackColor='+options.controlBackColor+'&defaultVolume='+options.volume+'&scaleIfFullScreen=true&showScalingButton=true&crop=false', { + id: 'MediaboxSWF', + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + } else { + preload = new Swiff(''+options.JWplayerpath+'?file='+URL+'&backcolor='+options.backcolor+'&frontcolor='+options.frontcolor+'&lightcolor='+options.lightcolor+'&screencolor='+options.screencolor+'&autostart='+options.autoplay, { + id: 'MediaboxSWF', + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + } + startEffect(); +// SWF + } else if (URL.match(/\.swf/i) || mediaType == 'flash') { + mediaType = 'obj'; + mediaWidth = mediaWidth || options.defaultWidth; + mediaHeight = mediaHeight || options.defaultHeight; + preload = new Swiff(URL, { + id: 'MediaboxSWF', + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + startEffect(); +// MOV, M4V, M4A, MP4, AIFF, etc. + } else if (URL.match(/\.mov|\.m4v|\.m4a|\.aiff|\.avi|\.caf|\.dv|\.mid|\.m3u|\.mp3|\.mp2|\.mp4|\.qtz/i) || mediaType == 'qt') { + mediaType = 'qt'; + mediaWidth = mediaWidth || options.defaultWidth; + mediaHeight = (parseInt(mediaHeight)+16)+"px" || options.defaultHeight; + preload = new Quickie(URL, { + id: 'MediaboxQT', + width: mediaWidth, + height: mediaHeight, + container: 'mbImage', + attributes: {controller: options.controller, autoplay: options.autoplay, volume: options.volume, loop: options.medialoop, bgcolor: options.bgcolor} + }); + startEffect(); + + /* Social Media Sites */ + +// Blip.tv + } else if (URL.match(/blip\.tv/i)) { + mediaType = 'obj'; + mediaWidth = mediaWidth || "640px"; + mediaHeight = mediaHeight || "390px"; + preload = new Swiff(URL, { + src: URL, + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + startEffect(); +// Break.com + } else if (URL.match(/break\.com/i)) { + mediaType = 'obj'; + mediaWidth = mediaWidth || "464px"; + mediaHeight = mediaHeight || "376px"; + mediaId = URL.match(/\d{6}/g); + preload = new Swiff('http://embed.break.com/'+mediaId, { + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + startEffect(); +// DailyMotion + } else if (URL.match(/dailymotion\.com/i)) { + mediaType = 'obj'; + mediaWidth = mediaWidth || "480px"; + mediaHeight = mediaHeight || "381px"; + preload = new Swiff(URL, { + id: mediaId, + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + startEffect(); +// Facebook + } else if (URL.match(/facebook\.com/i)) { + mediaType = 'obj'; + mediaWidth = mediaWidth || "320px"; + mediaHeight = mediaHeight || "240px"; + mediaSplit = URL.split('v='); + mediaSplit = mediaSplit[1].split('&'); + mediaId = mediaSplit[0]; + preload = new Swiff('http://www.facebook.com/v/'+mediaId, { + movie: 'http://www.facebook.com/v/'+mediaId, + classid: 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000', + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + startEffect(); +// Flickr + } else if (URL.match(/flickr\.com/i)) { + mediaType = 'obj'; + mediaWidth = mediaWidth || "500px"; + mediaHeight = mediaHeight || "375px"; + mediaSplit = URL.split('/'); + mediaId = mediaSplit[5]; + preload = new Swiff('http://www.flickr.com/apps/video/stewart.swf', { + id: mediaId, + classid: 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000', + width: mediaWidth, + height: mediaHeight, + params: {flashvars: 'photo_id='+mediaId+'&show_info_box='+options.flInfo, wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + startEffect(); +// GameTrailers Video + } else if (URL.match(/gametrailers\.com/i)) { + mediaType = 'obj'; + mediaWidth = mediaWidth || "480px"; + mediaHeight = mediaHeight || "392px"; + mediaId = URL.match(/\d{5}/g); + preload = new Swiff('http://www.gametrailers.com/remote_wrap.php?mid='+mediaId, { + id: mediaId, + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + startEffect(); +// Google Video + } else if (URL.match(/google\.com\/videoplay/i)) { + mediaType = 'obj'; + mediaWidth = mediaWidth || "400px"; + mediaHeight = mediaHeight || "326px"; + mediaSplit = URL.split('='); + mediaId = mediaSplit[1]; + preload = new Swiff('http://video.google.com/googleplayer.swf?docId='+mediaId+'&autoplay='+options.autoplayNum, { + id: mediaId, + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + startEffect(); +// Megavideo - Thanks to Robert Jandreu for suggesting this code! + } else if (URL.match(/megavideo\.com/i)) { + mediaType = 'obj'; + mediaWidth = mediaWidth || "640px"; + mediaHeight = mediaHeight || "360px"; + mediaSplit = URL.split('='); + mediaId = mediaSplit[1]; + preload = new Swiff('http://wwwstatic.megavideo.com/mv_player.swf?v='+mediaId, { + id: mediaId, + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + startEffect(); +// Metacafe + } else if (URL.match(/metacafe\.com\/watch/i)) { + mediaType = 'obj'; + mediaWidth = mediaWidth || "400px"; + mediaHeight = mediaHeight || "345px"; + mediaSplit = URL.split('/'); + mediaId = mediaSplit[4]; + preload = new Swiff('http://www.metacafe.com/fplayer/'+mediaId+'/.swf?playerVars=autoPlay='+options.autoplayYes, { + id: mediaId, + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + startEffect(); +// Myspace + } else if (URL.match(/vids\.myspace\.com/i)) { + mediaType = 'obj'; + mediaWidth = mediaWidth || "425px"; + mediaHeight = mediaHeight || "360px"; + preload = new Swiff(URL, { + id: mediaId, + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + startEffect(); +// Revver + } else if (URL.match(/revver\.com/i)) { + mediaType = 'obj'; + mediaWidth = mediaWidth || "480px"; + mediaHeight = mediaHeight || "392px"; + mediaSplit = URL.split('/'); + mediaId = mediaSplit[4]; + preload = new Swiff('http://flash.revver.com/player/1.0/player.swf?mediaId='+mediaId+'&affiliateId='+options.revverID+'&allowFullScreen='+options.revverFullscreen+'&autoStart='+options.autoplay+'&backColor=#'+options.revverBack+'&frontColor=#'+options.revverFront+'&gradColor=#'+options.revverGrad+'&shareUrl=revver', { + id: mediaId, + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + startEffect(); +// Rutube + } else if (URL.match(/rutube\.ru/i)) { + mediaType = 'obj'; + mediaWidth = mediaWidth || "470px"; + mediaHeight = mediaHeight || "353px"; + mediaSplit = URL.split('='); + mediaId = mediaSplit[1]; + preload = new Swiff('http://video.rutube.ru/'+mediaId, { + movie: 'http://video.rutube.ru/'+mediaId, + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + startEffect(); +// Seesmic + } else if (URL.match(/seesmic\.com/i)) { + mediaType = 'obj'; + mediaWidth = mediaWidth || "435px"; + mediaHeight = mediaHeight || "355px"; + mediaSplit = URL.split('/'); + mediaId = mediaSplit[5]; + preload = new Swiff('http://seesmic.com/Standalone.swf?video='+mediaId, { + id: mediaId, + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + startEffect(); +// Tudou + } else if (URL.match(/tudou\.com/i)) { + mediaType = 'obj'; + mediaWidth = mediaWidth || "400px"; + mediaHeight = mediaHeight || "340px"; + mediaSplit = URL.split('/'); + mediaId = mediaSplit[5]; + preload = new Swiff('http://www.tudou.com/v/'+mediaId, { + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + startEffect(); +// Twitvcam + } else if (URL.match(/twitcam\.com/i)) { + mediaType = 'obj'; + mediaWidth = mediaWidth || "320px"; + mediaHeight = mediaHeight || "265px"; + mediaSplit = URL.split('/'); + mediaId = mediaSplit[3]; + preload = new Swiff('http://static.livestream.com/chromelessPlayer/wrappers/TwitcamPlayer.swf?hash='+mediaId, { + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + startEffect(); +// Twiturm + } else if (URL.match(/twiturm\.com/i)) { + mediaType = 'obj'; + mediaWidth = mediaWidth || "402px"; + mediaHeight = mediaHeight || "48px"; + mediaSplit = URL.split('/'); + mediaId = mediaSplit[3]; + preload = new Swiff('http://twiturm.com/flash/twiturm_mp3.swf?playerID=0&sf='+mediaId, { + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + startEffect(); +// Twitvid + } else if (URL.match(/twitvid\.com/i)) { + mediaType = 'obj'; + mediaWidth = mediaWidth || "600px"; + mediaHeight = mediaHeight || "338px"; + mediaSplit = URL.split('/'); + mediaId = mediaSplit[3]; + preload = new Swiff('http://www.twitvid.com/player/'+mediaId, { + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + startEffect(); +// Ustream.tv + } else if (URL.match(/ustream\.tv/i)) { + mediaType = 'obj'; + mediaWidth = mediaWidth || "400px"; + mediaHeight = mediaHeight || "326px"; + preload = new Swiff(URL+'&viewcount='+options.usViewers+'&autoplay='+options.autoplay, { + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + startEffect(); +// YouKu + } else if (URL.match(/youku\.com/i)) { + mediaType = 'obj'; + mediaWidth = mediaWidth || "480px"; + mediaHeight = mediaHeight || "400px"; + mediaSplit = URL.split('id_'); + mediaId = mediaSplit[1]; + preload = new Swiff('http://player.youku.com/player.php/sid/'+mediaId+'=/v.swf', { + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + startEffect(); +// YouTube Video (now includes HTML5 option) + } else if (URL.match(/youtube\.com\/watch/i)) { + mediaSplit = URL.split('v='); + if (options.html5) { + mediaType = 'url'; + mediaWidth = mediaWidth || "640px"; + mediaHeight = mediaHeight || "385px"; + mediaId = "mediaId_"+new Date().getTime(); // Safari may not update iframe content with a static id. + preload = new Element('iframe', { + 'src': 'http://www.youtube.com/embed/'+mediaSplit[1], + 'id': mediaId, + 'width': mediaWidth, + 'height': mediaHeight, + 'frameborder': 0 + }); + startEffect(); + } else { + mediaType = 'obj'; + mediaId = mediaSplit[1]; + if (mediaId.match(/fmt=22/i)) { + mediaFmt = '&ap=%2526fmt%3D22'; + mediaWidth = mediaWidth || "640px"; + mediaHeight = mediaHeight || "385px"; + } else if (mediaId.match(/fmt=18/i)) { + mediaFmt = '&ap=%2526fmt%3D18'; + mediaWidth = mediaWidth || "560px"; + mediaHeight = mediaHeight || "345px"; + } else { + mediaFmt = options.ytQuality; + mediaWidth = mediaWidth || "480px"; + mediaHeight = mediaHeight || "295px"; + } + preload = new Swiff('http://www.youtube.com/v/'+mediaId+'&autoplay='+options.autoplayNum+'&fs='+options.fullscreenNum+mediaFmt+'&border='+options.ytBorder+'&color1=0x'+options.ytColor1+'&color2=0x'+options.ytColor2+'&rel='+options.ytRel+'&showinfo='+options.ytInfo+'&showsearch='+options.ytSearch, { + id: mediaId, + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + startEffect(); + } +// YouTube Playlist + } else if (URL.match(/youtube\.com\/view/i)) { + mediaType = 'obj'; + mediaSplit = URL.split('p='); + mediaId = mediaSplit[1]; + mediaWidth = mediaWidth || "480px"; + mediaHeight = mediaHeight || "385px"; + preload = new Swiff('http://www.youtube.com/p/'+mediaId+'&autoplay='+options.autoplayNum+'&fs='+options.fullscreenNum+mediaFmt+'&border='+options.ytBorder+'&color1=0x'+options.ytColor1+'&color2=0x'+options.ytColor2+'&rel='+options.ytRel+'&showinfo='+options.ytInfo+'&showsearch='+options.ytSearch, { + id: mediaId, + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + startEffect(); +// Veoh + } else if (URL.match(/veoh\.com/i)) { + mediaType = 'obj'; + mediaWidth = mediaWidth || "410px"; + mediaHeight = mediaHeight || "341px"; + URL = URL.replace('%3D','/'); + mediaSplit = URL.split('watch/'); + mediaId = mediaSplit[1]; + preload = new Swiff('http://www.veoh.com/static/swf/webplayer/WebPlayer.swf?version=AFrontend.5.5.2.1001&permalinkId='+mediaId+'&player=videodetailsembedded&videoAutoPlay='+options.AutoplayNum+'&id=anonymous', { + id: mediaId, + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + startEffect(); +// Viddler + } else if (URL.match(/viddler\.com/i)) { + mediaType = 'obj'; + mediaWidth = mediaWidth || "437px"; + mediaHeight = mediaHeight || "370px"; + mediaSplit = URL.split('/'); + mediaId = mediaSplit[4]; + preload = new Swiff(URL, { + id: 'viddler_'+mediaId, + movie: URL, + classid: 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000', + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen, id: 'viddler_'+mediaId, movie: URL} + }); + startEffect(); +// Viddyou + } else if (URL.match(/viddyou\.com/i)) { + mediaType = 'obj'; + mediaWidth = mediaWidth || "416px"; + mediaHeight = mediaHeight || "312px"; + mediaSplit = URL.split('='); + mediaId = mediaSplit[1]; + preload = new Swiff('http://www.viddyou.com/get/v2_'+options.vuPlayer+'/'+mediaId+'.swf', { + id: mediaId, + movie: 'http://www.viddyou.com/get/v2_'+options.vuPlayer+'/'+mediaId+'.swf', + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + startEffect(); +// Vimeo (now includes HTML5 option) + } else if (URL.match(/vimeo\.com/i)) { + mediaWidth = mediaWidth || "640px"; // site defualt: 400px + mediaHeight = mediaHeight || "360px"; // site defualt: 225px + mediaSplit = URL.split('/'); + mediaId = mediaSplit[3]; + + if (options.html5) { + mediaType = 'url'; + mediaId = "mediaId_"+new Date().getTime(); // Safari may not update iframe content with a static id. + preload = new Element('iframe', { + 'src': 'http://player.vimeo.com/video/'+mediaSplit[3]+'?portrait='+options.vmPortrait, + 'id': mediaId, + 'width': mediaWidth, + 'height': mediaHeight, + 'frameborder': 0 + }); + startEffect(); + } else { + mediaType = 'obj'; + preload = new Swiff('http://www.vimeo.com/moogaloop.swf?clip_id='+mediaId+'&server=www.vimeo.com&fullscreen='+options.fullscreenNum+'&autoplay='+options.autoplayNum+'&show_title='+options.vmTitle+'&show_byline='+options.vmByline+'&show_portrait='+options.vmPortrait+'&color='+options.vmColor, { + id: mediaId, + width: mediaWidth, + height: mediaHeight, + params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + startEffect(); + } +// 12seconds + } else if (URL.match(/12seconds\.tv/i)) { + mediaType = 'obj'; + mediaWidth = mediaWidth || "430px"; + mediaHeight = mediaHeight || "360px"; + mediaSplit = URL.split('/'); + mediaId = mediaSplit[5]; + preload = new Swiff('http://embed.12seconds.tv/players/remotePlayer.swf', { + id: mediaId, + width: mediaWidth, + height: mediaHeight, + params: {flashvars: 'vid='+mediaId+'', wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + }); + startEffect(); + + /* Specific Content Types */ + +// INLINE + } else if (URL.match(/\#mb_/i)) { + mediaType = 'inline'; + mediaWidth = mediaWidth || options.defaultWidth; + mediaHeight = mediaHeight || options.defaultHeight; + URLsplit = URL.split('#'); + preload = document.id(URLsplit[1]).get('html'); + startEffect(); +// HTML + } else { + mediaType = 'url'; + mediaWidth = mediaWidth || options.defaultWidth; + mediaHeight = mediaHeight || options.defaultHeight; + mediaId = "mediaId_"+new Date().getTime(); // Safari may not update iframe content with a static id. + preload = new Element('iframe', { + 'src': URL, + 'id': mediaId, + 'width': mediaWidth, + 'height': mediaHeight, + 'frameborder': 0 + }); + startEffect(); + } + } + return false; + } + + function startEffect() { + if (mediaType == "img"){ + mediaWidth = preload.width; + mediaHeight = preload.height; + if (options.imgBackground) { + image.setStyles({backgroundImage: "url("+URL+")", display: ""}); + } else { // Thanks to Dusan Medlin for fixing large 16x9 image errors in a 4x3 browser + if (mediaHeight >= winHeight-options.imgPadding && (mediaHeight / winHeight) >= (mediaWidth / winWidth)) { + mediaHeight = winHeight-options.imgPadding; + mediaWidth = preload.width = parseInt((mediaHeight/preload.height)*mediaWidth); + preload.height = mediaHeight; + } else if (mediaWidth >= winWidth-options.imgPadding && (mediaHeight / winHeight) < (mediaWidth / winWidth)) { + mediaWidth = winWidth-options.imgPadding; + mediaHeight = preload.height = parseInt((mediaWidth/preload.width)*mediaHeight); + preload.width = mediaWidth; + } + if (Browser.Engine.trident) preload = document.id(preload); + preload.addEvent('mousedown', function(e){ e.stop(); }).addEvent('contextmenu', function(e){ e.stop(); }); + image.setStyles({backgroundImage: "none", display: ""}); + preload.inject(image); + } + } else if (mediaType == "obj") { + if (Browser.Plugins.Flash.version<8) { + image.setStyles({backgroundImage: "none", display: ""}); + image.set('html', '
    Error
    Adobe Flash is either not installed or not up to date, please visit Adobe.com to download the free player.
    '); + mediaWidth = options.DefaultWidth; + mediaHeight = options.DefaultHeight; + } else { + image.setStyles({backgroundImage: "none", display: ""}); + preload.inject(image); + } + } else if (mediaType == "qt") { + image.setStyles({backgroundImage: "none", display: ""}); + preload; + } else if (mediaType == "inline") { +// if (options.overflow) image.setStyles({overflow: options.overflow}); + image.setStyles({backgroundImage: "none", display: ""}); + image.set('html', preload); + } else if (mediaType == "url") { + image.setStyles({backgroundImage: "none", display: ""}); + preload.inject(image); + } else { + image.setStyles({backgroundImage: "none", display: ""}); + image.set('html', '
    Error
    A file type error has occoured, please visit iaian7.com or contact the website author for more information.
    '); + mediaWidth = options.defaultWidth; + mediaHeight = options.defaultHeight; + } + image.setStyles({width: mediaWidth, height: mediaHeight}); + caption.setStyles({width: mediaWidth}); + + title.set('html', (options.showCaption) ? captionSplit[0] : ""); + caption.set('html', (options.showCaption && (captionSplit.length > 1)) ? captionSplit[1] : ""); + number.set('html', (options.showCounter && (images.length > 1)) ? options.counterText.replace(/{x}/, activeImage + 1).replace(/{y}/, images.length) : ""); + + if ((prevImage >= 0) && (images[prevImage][0].match(/\.gif|\.jpg|\.jpeg|\.png|twitpic\.com/i))) preloadPrev.src = images[prevImage][0].replace(/twitpic\.com/i, "twitpic.com/show/full"); + if ((nextImage >= 0) && (images[nextImage][0].match(/\.gif|\.jpg|\.jpeg|\.png|twitpic\.com/i))) preloadNext.src = images[nextImage][0].replace(/twitpic\.com/i, "twitpic.com/show/full"); + + mediaWidth = image.offsetWidth; + mediaHeight = image.offsetHeight+bottom.offsetHeight; + if (mediaHeight >= top+top) { mTop = -top } else { mTop = -(mediaHeight/2) }; + if (mediaWidth >= left+left) { mLeft = -left } else { mLeft = -(mediaWidth/2) }; + if (options.resizeOpening) { fx.resize.start({width: mediaWidth, height: mediaHeight, marginTop: mTop-margin, marginLeft: mLeft-margin}); + } else { center.setStyles({width: mediaWidth, height: mediaHeight, marginTop: mTop-margin, marginLeft: mLeft-margin}); imageAnimate(); } + } + + function imageAnimate() { + fx.image.start(1); + } + + function captionAnimate() { + center.className = ""; + if (prevImage >= 0) prevLink.style.display = ""; + if (nextImage >= 0) nextLink.style.display = ""; + fx.bottom.start(1); + } + + function stop() { + if (preload) preload.onload = $empty; + fx.resize.cancel(); + fx.image.cancel().set(0); + fx.bottom.cancel().set(0); + $$(prevLink, nextLink).setStyle("display", "none"); + } + + function close() { + if (activeImage >= 0) { + preload.onload = $empty; + image.set('html', ''); + for (var f in fx) fx[f].cancel(); + center.setStyle("display", "none"); + fx.overlay.chain(setup).start(0); + } + return false; + } +})(); + + /* Autoload code block */ + +Mediabox.scanPage = function() { +// $$('#mb_').each(function(hide) { hide.set('display', 'none'); }); + var links = $$("a").filter(function(el) { + return el.rel && el.rel.test(/^lightbox/i); + }); + $$(links).mediabox({/* Put custom options here */}, null, function(el) { + var rel0 = this.rel.replace(/[[]|]/gi," "); + var relsize = rel0.split(" "); + return (this == el) || ((this.rel.length > 8) && el.rel.match(relsize[1])); + }); +}; +window.addEvent("domready", Mediabox.scanPage); \ No newline at end of file diff --git a/js/mootools.js b/js/mootools.js new file mode 100644 index 0000000..88ae5b5 --- /dev/null +++ b/js/mootools.js @@ -0,0 +1,5800 @@ +/* +--- +MooTools: the javascript framework + +web build: + - http://mootools.net/core/7c56cfef9dddcf170a5d68e3fb61cfd7 + +packager build: + - packager build Core/Core Core/Array Core/String Core/Number Core/Function Core/Object Core/Event Core/Browser Core/Class Core/Class.Extras Core/Slick.Parser Core/Slick.Finder Core/Element Core/Element.Style Core/Element.Event Core/Element.Dimensions Core/Fx Core/Fx.CSS Core/Fx.Tween Core/Fx.Morph Core/Fx.Transitions Core/Request Core/Request.HTML Core/Request.JSON Core/Cookie Core/JSON Core/DOMReady Core/Swiff + +/* +--- + +name: Core + +description: The heart of MooTools. + +license: MIT-style license. + +copyright: Copyright (c) 2006-2010 [Valerio Proietti](http://mad4milk.net/). + +authors: The MooTools production team (http://mootools.net/developers/) + +inspiration: + - Class implementation inspired by [Base.js](http://dean.edwards.name/weblog/2006/03/base/) Copyright (c) 2006 Dean Edwards, [GNU Lesser General Public License](http://opensource.org/licenses/lgpl-license.php) + - Some functionality inspired by [Prototype.js](http://prototypejs.org) Copyright (c) 2005-2007 Sam Stephenson, [MIT License](http://opensource.org/licenses/mit-license.php) + +provides: [Core, MooTools, Type, typeOf, instanceOf, Native] + +... +*/ + +(function(){ + +this.MooTools = { + version: '1.3', + build: 'a3eed692dd85050d80168ec2c708efe901bb7db3' +}; + +// typeOf, instanceOf + +var typeOf = this.typeOf = function(item){ + if (item == null) return 'null'; + if (item.$family) return item.$family(); + + if (item.nodeName){ + if (item.nodeType == 1) return 'element'; + if (item.nodeType == 3) return (/\S/).test(item.nodeValue) ? 'textnode' : 'whitespace'; + } else if (typeof item.length == 'number'){ + if (item.callee) return 'arguments'; + if ('item' in item) return 'collection'; + } + + return typeof item; +}; + +var instanceOf = this.instanceOf = function(item, object){ + if (item == null) return false; + var constructor = item.$constructor || item.constructor; + while (constructor){ + if (constructor === object) return true; + constructor = constructor.parent; + } + return item instanceof object; +}; + +// Function overloading + +var Function = this.Function; + +var enumerables = true; +for (var i in {toString: 1}) enumerables = null; +if (enumerables) enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'constructor']; + +Function.prototype.overloadSetter = function(usePlural){ + var self = this; + return function(a, b){ + if (a == null) return this; + if (usePlural || typeof a != 'string'){ + for (var k in a) self.call(this, k, a[k]); + if (enumerables) for (var i = enumerables.length; i--;){ + k = enumerables[i]; + if (a.hasOwnProperty(k)) self.call(this, k, a[k]); + } + } else { + self.call(this, a, b); + } + return this; + }; +}; + +Function.prototype.overloadGetter = function(usePlural){ + var self = this; + return function(a){ + var args, result; + if (usePlural || typeof a != 'string') args = a; + else if (arguments.length > 1) args = arguments; + if (args){ + result = {}; + for (var i = 0; i < args.length; i++) result[args[i]] = self.call(this, args[i]); + } else { + result = self.call(this, a); + } + return result; + }; +}; + +Function.prototype.extend = function(key, value){ + this[key] = value; +}.overloadSetter(); + +Function.prototype.implement = function(key, value){ + this.prototype[key] = value; +}.overloadSetter(); + +// From + +var slice = Array.prototype.slice; + +Function.from = function(item){ + return (typeOf(item) == 'function') ? item : function(){ + return item; + }; +}; + +Array.from = function(item){ + if (item == null) return []; + return (Type.isEnumerable(item) && typeof item != 'string') ? (typeOf(item) == 'array') ? item : slice.call(item) : [item]; +}; + +Number.from = function(item){ + var number = parseFloat(item); + return isFinite(number) ? number : null; +}; + +String.from = function(item){ + return item + ''; +}; + +// hide, protect + +Function.implement({ + + hide: function(){ + this.$hidden = true; + return this; + }, + + protect: function(){ + this.$protected = true; + return this; + } + +}); + +// Type + +var Type = this.Type = function(name, object){ + if (name){ + var lower = name.toLowerCase(); + var typeCheck = function(item){ + return (typeOf(item) == lower); + }; + + Type['is' + name] = typeCheck; + if (object != null){ + object.prototype.$family = (function(){ + return lower; + }).hide(); + //<1.2compat> + object.type = typeCheck; + // + } + } + + if (object == null) return null; + + object.extend(this); + object.$constructor = Type; + object.prototype.$constructor = object; + + return object; +}; + +var toString = Object.prototype.toString; + +Type.isEnumerable = function(item){ + return (item != null && typeof item.length == 'number' && toString.call(item) != '[object Function]' ); +}; + +var hooks = {}; + +var hooksOf = function(object){ + var type = typeOf(object.prototype); + return hooks[type] || (hooks[type] = []); +}; + +var implement = function(name, method){ + if (method && method.$hidden) return this; + + var hooks = hooksOf(this); + + for (var i = 0; i < hooks.length; i++){ + var hook = hooks[i]; + if (typeOf(hook) == 'type') implement.call(hook, name, method); + else hook.call(this, name, method); + } + + var previous = this.prototype[name]; + if (previous == null || !previous.$protected) this.prototype[name] = method; + + if (this[name] == null && typeOf(method) == 'function') extend.call(this, name, function(item){ + return method.apply(item, slice.call(arguments, 1)); + }); + + return this; +}; + +var extend = function(name, method){ + if (method && method.$hidden) return this; + var previous = this[name]; + if (previous == null || !previous.$protected) this[name] = method; + return this; +}; + +Type.implement({ + + implement: implement.overloadSetter(), + + extend: extend.overloadSetter(), + + alias: function(name, existing){ + implement.call(this, name, this.prototype[existing]); + }.overloadSetter(), + + mirror: function(hook){ + hooksOf(this).push(hook); + return this; + } + +}); + +new Type('Type', Type); + +// Default Types + +var force = function(name, object, methods){ + var isType = (object != Object), + prototype = object.prototype; + + if (isType) object = new Type(name, object); + + for (var i = 0, l = methods.length; i < l; i++){ + var key = methods[i], + generic = object[key], + proto = prototype[key]; + + if (generic) generic.protect(); + + if (isType && proto){ + delete prototype[key]; + prototype[key] = proto.protect(); + } + } + + if (isType) object.implement(prototype); + + return force; +}; + +force('String', String, [ + 'charAt', 'charCodeAt', 'concat', 'indexOf', 'lastIndexOf', 'match', 'quote', 'replace', 'search', + 'slice', 'split', 'substr', 'substring', 'toLowerCase', 'toUpperCase' +])('Array', Array, [ + 'pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice', + 'indexOf', 'lastIndexOf', 'filter', 'forEach', 'every', 'map', 'some', 'reduce', 'reduceRight' +])('Number', Number, [ + 'toExponential', 'toFixed', 'toLocaleString', 'toPrecision' +])('Function', Function, [ + 'apply', 'call', 'bind' +])('RegExp', RegExp, [ + 'exec', 'test' +])('Object', Object, [ + 'create', 'defineProperty', 'defineProperties', 'keys', + 'getPrototypeOf', 'getOwnPropertyDescriptor', 'getOwnPropertyNames', + 'preventExtensions', 'isExtensible', 'seal', 'isSealed', 'freeze', 'isFrozen' +])('Date', Date, ['now']); + +Object.extend = extend.overloadSetter(); + +Date.extend('now', function(){ + return +(new Date); +}); + +new Type('Boolean', Boolean); + +// fixes NaN returning as Number + +Number.prototype.$family = function(){ + return isFinite(this) ? 'number' : 'null'; +}.hide(); + +// Number.random + +Number.extend('random', function(min, max){ + return Math.floor(Math.random() * (max - min + 1) + min); +}); + +// forEach, each + +Object.extend('forEach', function(object, fn, bind){ + for (var key in object){ + if (object.hasOwnProperty(key)) fn.call(bind, object[key], key, object); + } +}); + +Object.each = Object.forEach; + +Array.implement({ + + forEach: function(fn, bind){ + for (var i = 0, l = this.length; i < l; i++){ + if (i in this) fn.call(bind, this[i], i, this); + } + }, + + each: function(fn, bind){ + Array.forEach(this, fn, bind); + return this; + } + +}); + +// Array & Object cloning, Object merging and appending + +var cloneOf = function(item){ + switch (typeOf(item)){ + case 'array': return item.clone(); + case 'object': return Object.clone(item); + default: return item; + } +}; + +Array.implement('clone', function(){ + var i = this.length, clone = new Array(i); + while (i--) clone[i] = cloneOf(this[i]); + return clone; +}); + +var mergeOne = function(source, key, current){ + switch (typeOf(current)){ + case 'object': + if (typeOf(source[key]) == 'object') Object.merge(source[key], current); + else source[key] = Object.clone(current); + break; + case 'array': source[key] = current.clone(); break; + default: source[key] = current; + } + return source; +}; + +Object.extend({ + + merge: function(source, k, v){ + if (typeOf(k) == 'string') return mergeOne(source, k, v); + for (var i = 1, l = arguments.length; i < l; i++){ + var object = arguments[i]; + for (var key in object) mergeOne(source, key, object[key]); + } + return source; + }, + + clone: function(object){ + var clone = {}; + for (var key in object) clone[key] = cloneOf(object[key]); + return clone; + }, + + append: function(original){ + for (var i = 1, l = arguments.length; i < l; i++){ + var extended = arguments[i] || {}; + for (var key in extended) original[key] = extended[key]; + } + return original; + } + +}); + +// Object-less types + +['Object', 'WhiteSpace', 'TextNode', 'Collection', 'Arguments'].each(function(name){ + new Type(name); +}); + +// Unique ID + +var UID = Date.now(); + +String.extend('uniqueID', function(){ + return (UID++).toString(36); +}); + +//<1.2compat> + +var Hash = this.Hash = new Type('Hash', function(object){ + if (typeOf(object) == 'hash') object = Object.clone(object.getClean()); + for (var key in object) this[key] = object[key]; + return this; +}); + +Hash.implement({ + + forEach: function(fn, bind){ + Object.forEach(this, fn, bind); + }, + + getClean: function(){ + var clean = {}; + for (var key in this){ + if (this.hasOwnProperty(key)) clean[key] = this[key]; + } + return clean; + }, + + getLength: function(){ + var length = 0; + for (var key in this){ + if (this.hasOwnProperty(key)) length++; + } + return length; + } + +}); + +Hash.alias('each', 'forEach'); + +Object.type = Type.isObject; + +var Native = this.Native = function(properties){ + return new Type(properties.name, properties.initialize); +}; + +Native.type = Type.type; + +Native.implement = function(objects, methods){ + for (var i = 0; i < objects.length; i++) objects[i].implement(methods); + return Native; +}; + +var arrayType = Array.type; +Array.type = function(item){ + return instanceOf(item, Array) || arrayType(item); +}; + +this.$A = function(item){ + return Array.from(item).slice(); +}; + +this.$arguments = function(i){ + return function(){ + return arguments[i]; + }; +}; + +this.$chk = function(obj){ + return !!(obj || obj === 0); +}; + +this.$clear = function(timer){ + clearTimeout(timer); + clearInterval(timer); + return null; +}; + +this.$defined = function(obj){ + return (obj != null); +}; + +this.$each = function(iterable, fn, bind){ + var type = typeOf(iterable); + ((type == 'arguments' || type == 'collection' || type == 'array' || type == 'elements') ? Array : Object).each(iterable, fn, bind); +}; + +this.$empty = function(){}; + +this.$extend = function(original, extended){ + return Object.append(original, extended); +}; + +this.$H = function(object){ + return new Hash(object); +}; + +this.$merge = function(){ + var args = Array.slice(arguments); + args.unshift({}); + return Object.merge.apply(null, args); +}; + +this.$lambda = Function.from; +this.$mixin = Object.merge; +this.$random = Number.random; +this.$splat = Array.from; +this.$time = Date.now; + +this.$type = function(object){ + var type = typeOf(object); + if (type == 'elements') return 'array'; + return (type == 'null') ? false : type; +}; + +this.$unlink = function(object){ + switch (typeOf(object)){ + case 'object': return Object.clone(object); + case 'array': return Array.clone(object); + case 'hash': return new Hash(object); + default: return object; + } +}; + +// + +})(); + + +/* +--- + +name: Array + +description: Contains Array Prototypes like each, contains, and erase. + +license: MIT-style license. + +requires: Type + +provides: Array + +... +*/ + +Array.implement({ + + invoke: function(methodName){ + var args = Array.slice(arguments, 1); + return this.map(function(item){ + return item[methodName].apply(item, args); + }); + }, + + every: function(fn, bind){ + for (var i = 0, l = this.length; i < l; i++){ + if ((i in this) && !fn.call(bind, this[i], i, this)) return false; + } + return true; + }, + + filter: function(fn, bind){ + var results = []; + for (var i = 0, l = this.length; i < l; i++){ + if ((i in this) && fn.call(bind, this[i], i, this)) results.push(this[i]); + } + return results; + }, + + clean: function(){ + return this.filter(function(item){ + return item != null; + }); + }, + + indexOf: function(item, from){ + var len = this.length; + for (var i = (from < 0) ? Math.max(0, len + from) : from || 0; i < len; i++){ + if (this[i] === item) return i; + } + return -1; + }, + + map: function(fn, bind){ + var results = []; + for (var i = 0, l = this.length; i < l; i++){ + if (i in this) results[i] = fn.call(bind, this[i], i, this); + } + return results; + }, + + some: function(fn, bind){ + for (var i = 0, l = this.length; i < l; i++){ + if ((i in this) && fn.call(bind, this[i], i, this)) return true; + } + return false; + }, + + associate: function(keys){ + var obj = {}, length = Math.min(this.length, keys.length); + for (var i = 0; i < length; i++) obj[keys[i]] = this[i]; + return obj; + }, + + link: function(object){ + var result = {}; + for (var i = 0, l = this.length; i < l; i++){ + for (var key in object){ + if (object[key](this[i])){ + result[key] = this[i]; + delete object[key]; + break; + } + } + } + return result; + }, + + contains: function(item, from){ + return this.indexOf(item, from) != -1; + }, + + append: function(array){ + this.push.apply(this, array); + return this; + }, + + getLast: function(){ + return (this.length) ? this[this.length - 1] : null; + }, + + getRandom: function(){ + return (this.length) ? this[Number.random(0, this.length - 1)] : null; + }, + + include: function(item){ + if (!this.contains(item)) this.push(item); + return this; + }, + + combine: function(array){ + for (var i = 0, l = array.length; i < l; i++) this.include(array[i]); + return this; + }, + + erase: function(item){ + for (var i = this.length; i--;){ + if (this[i] === item) this.splice(i, 1); + } + return this; + }, + + empty: function(){ + this.length = 0; + return this; + }, + + flatten: function(){ + var array = []; + for (var i = 0, l = this.length; i < l; i++){ + var type = typeOf(this[i]); + if (type == 'null') continue; + array = array.concat((type == 'array' || type == 'collection' || type == 'arguments' || instanceOf(this[i], Array)) ? Array.flatten(this[i]) : this[i]); + } + return array; + }, + + pick: function(){ + for (var i = 0, l = this.length; i < l; i++){ + if (this[i] != null) return this[i]; + } + return null; + }, + + hexToRgb: function(array){ + if (this.length != 3) return null; + var rgb = this.map(function(value){ + if (value.length == 1) value += value; + return value.toInt(16); + }); + return (array) ? rgb : 'rgb(' + rgb + ')'; + }, + + rgbToHex: function(array){ + if (this.length < 3) return null; + if (this.length == 4 && this[3] == 0 && !array) return 'transparent'; + var hex = []; + for (var i = 0; i < 3; i++){ + var bit = (this[i] - 0).toString(16); + hex.push((bit.length == 1) ? '0' + bit : bit); + } + return (array) ? hex : '#' + hex.join(''); + } + +}); + +//<1.2compat> + +Array.alias('extend', 'append'); + +var $pick = function(){ + return Array.from(arguments).pick(); +}; + +// + + +/* +--- + +name: String + +description: Contains String Prototypes like camelCase, capitalize, test, and toInt. + +license: MIT-style license. + +requires: Type + +provides: String + +... +*/ + +String.implement({ + + test: function(regex, params){ + return ((typeOf(regex) == 'regexp') ? regex : new RegExp('' + regex, params)).test(this); + }, + + contains: function(string, separator){ + return (separator) ? (separator + this + separator).indexOf(separator + string + separator) > -1 : this.indexOf(string) > -1; + }, + + trim: function(){ + return this.replace(/^\s+|\s+$/g, ''); + }, + + clean: function(){ + return this.replace(/\s+/g, ' ').trim(); + }, + + camelCase: function(){ + return this.replace(/-\D/g, function(match){ + return match.charAt(1).toUpperCase(); + }); + }, + + hyphenate: function(){ + return this.replace(/[A-Z]/g, function(match){ + return ('-' + match.charAt(0).toLowerCase()); + }); + }, + + capitalize: function(){ + return this.replace(/\b[a-z]/g, function(match){ + return match.toUpperCase(); + }); + }, + + escapeRegExp: function(){ + return this.replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1'); + }, + + toInt: function(base){ + return parseInt(this, base || 10); + }, + + toFloat: function(){ + return parseFloat(this); + }, + + hexToRgb: function(array){ + var hex = this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/); + return (hex) ? hex.slice(1).hexToRgb(array) : null; + }, + + rgbToHex: function(array){ + var rgb = this.match(/\d{1,3}/g); + return (rgb) ? rgb.rgbToHex(array) : null; + }, + + substitute: function(object, regexp){ + return this.replace(regexp || (/\\?\{([^{}]+)\}/g), function(match, name){ + if (match.charAt(0) == '\\') return match.slice(1); + return (object[name] != null) ? object[name] : ''; + }); + } + +}); + + +/* +--- + +name: Number + +description: Contains Number Prototypes like limit, round, times, and ceil. + +license: MIT-style license. + +requires: Type + +provides: Number + +... +*/ + +Number.implement({ + + limit: function(min, max){ + return Math.min(max, Math.max(min, this)); + }, + + round: function(precision){ + precision = Math.pow(10, precision || 0).toFixed(precision < 0 ? -precision : 0); + return Math.round(this * precision) / precision; + }, + + times: function(fn, bind){ + for (var i = 0; i < this; i++) fn.call(bind, i, this); + }, + + toFloat: function(){ + return parseFloat(this); + }, + + toInt: function(base){ + return parseInt(this, base || 10); + } + +}); + +Number.alias('each', 'times'); + +(function(math){ + var methods = {}; + math.each(function(name){ + if (!Number[name]) methods[name] = function(){ + return Math[name].apply(null, [this].concat(Array.from(arguments))); + }; + }); + Number.implement(methods); +})(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']); + + +/* +--- + +name: Function + +description: Contains Function Prototypes like create, bind, pass, and delay. + +license: MIT-style license. + +requires: Type + +provides: Function + +... +*/ + +Function.extend({ + + attempt: function(){ + for (var i = 0, l = arguments.length; i < l; i++){ + try { + return arguments[i](); + } catch (e){} + } + return null; + } + +}); + +Function.implement({ + + attempt: function(args, bind){ + try { + return this.apply(bind, Array.from(args)); + } catch (e){} + + return null; + }, + + bind: function(bind){ + var self = this, + args = (arguments.length > 1) ? Array.slice(arguments, 1) : null; + + return function(){ + if (!args && !arguments.length) return self.call(bind); + if (args && arguments.length) return self.apply(bind, args.concat(Array.from(arguments))); + return self.apply(bind, args || arguments); + }; + }, + + pass: function(args, bind){ + var self = this; + if (args != null) args = Array.from(args); + return function(){ + return self.apply(bind, args || arguments); + }; + }, + + delay: function(delay, bind, args){ + return setTimeout(this.pass(args, bind), delay); + }, + + periodical: function(periodical, bind, args){ + return setInterval(this.pass(args, bind), periodical); + } + +}); + +//<1.2compat> + +delete Function.prototype.bind; + +Function.implement({ + + create: function(options){ + var self = this; + options = options || {}; + return function(event){ + var args = options.arguments; + args = (args != null) ? Array.from(args) : Array.slice(arguments, (options.event) ? 1 : 0); + if (options.event) args = [event || window.event].extend(args); + var returns = function(){ + return self.apply(options.bind || null, args); + }; + if (options.delay) return setTimeout(returns, options.delay); + if (options.periodical) return setInterval(returns, options.periodical); + if (options.attempt) return Function.attempt(returns); + return returns(); + }; + }, + + bind: function(bind, args){ + var self = this; + if (args != null) args = Array.from(args); + return function(){ + return self.apply(bind, args || arguments); + }; + }, + + bindWithEvent: function(bind, args){ + var self = this; + if (args != null) args = Array.from(args); + return function(event){ + return self.apply(bind, (args == null) ? arguments : [event].concat(args)); + }; + }, + + run: function(args, bind){ + return this.apply(bind, Array.from(args)); + } + +}); + +var $try = Function.attempt; + +// + + +/* +--- + +name: Object + +description: Object generic methods + +license: MIT-style license. + +requires: Type + +provides: [Object, Hash] + +... +*/ + + +Object.extend({ + + subset: function(object, keys){ + var results = {}; + for (var i = 0, l = keys.length; i < l; i++){ + var k = keys[i]; + results[k] = object[k]; + } + return results; + }, + + map: function(object, fn, bind){ + var results = {}; + for (var key in object){ + if (object.hasOwnProperty(key)) results[key] = fn.call(bind, object[key], key, object); + } + return results; + }, + + filter: function(object, fn, bind){ + var results = {}; + Object.each(object, function(value, key){ + if (fn.call(bind, value, key, object)) results[key] = value; + }); + return results; + }, + + every: function(object, fn, bind){ + for (var key in object){ + if (object.hasOwnProperty(key) && !fn.call(bind, object[key], key)) return false; + } + return true; + }, + + some: function(object, fn, bind){ + for (var key in object){ + if (object.hasOwnProperty(key) && fn.call(bind, object[key], key)) return true; + } + return false; + }, + + keys: function(object){ + var keys = []; + for (var key in object){ + if (object.hasOwnProperty(key)) keys.push(key); + } + return keys; + }, + + values: function(object){ + var values = []; + for (var key in object){ + if (object.hasOwnProperty(key)) values.push(object[key]); + } + return values; + }, + + getLength: function(object){ + return Object.keys(object).length; + }, + + keyOf: function(object, value){ + for (var key in object){ + if (object.hasOwnProperty(key) && object[key] === value) return key; + } + return null; + }, + + contains: function(object, value){ + return Object.keyOf(object, value) != null; + }, + + toQueryString: function(object, base){ + var queryString = []; + + Object.each(object, function(value, key){ + if (base) key = base + '[' + key + ']'; + var result; + switch (typeOf(value)){ + case 'object': result = Object.toQueryString(value, key); break; + case 'array': + var qs = {}; + value.each(function(val, i){ + qs[i] = val; + }); + result = Object.toQueryString(qs, key); + break; + default: result = key + '=' + encodeURIComponent(value); + } + if (value != null) queryString.push(result); + }); + + return queryString.join('&'); + } + +}); + + +//<1.2compat> + +Hash.implement({ + + has: Object.prototype.hasOwnProperty, + + keyOf: function(value){ + return Object.keyOf(this, value); + }, + + hasValue: function(value){ + return Object.contains(this, value); + }, + + extend: function(properties){ + Hash.each(properties || {}, function(value, key){ + Hash.set(this, key, value); + }, this); + return this; + }, + + combine: function(properties){ + Hash.each(properties || {}, function(value, key){ + Hash.include(this, key, value); + }, this); + return this; + }, + + erase: function(key){ + if (this.hasOwnProperty(key)) delete this[key]; + return this; + }, + + get: function(key){ + return (this.hasOwnProperty(key)) ? this[key] : null; + }, + + set: function(key, value){ + if (!this[key] || this.hasOwnProperty(key)) this[key] = value; + return this; + }, + + empty: function(){ + Hash.each(this, function(value, key){ + delete this[key]; + }, this); + return this; + }, + + include: function(key, value){ + if (this[key] == null) this[key] = value; + return this; + }, + + map: function(fn, bind){ + return new Hash(Object.map(this, fn, bind)); + }, + + filter: function(fn, bind){ + return new Hash(Object.filter(this, fn, bind)); + }, + + every: function(fn, bind){ + return Object.every(this, fn, bind); + }, + + some: function(fn, bind){ + return Object.some(this, fn, bind); + }, + + getKeys: function(){ + return Object.keys(this); + }, + + getValues: function(){ + return Object.values(this); + }, + + toQueryString: function(base){ + return Object.toQueryString(this, base); + } + +}); + +Hash.extend = Object.append; + +Hash.alias({indexOf: 'keyOf', contains: 'hasValue'}); + +// + + +/* +--- + +name: Browser + +description: The Browser Object. Contains Browser initialization, Window and Document, and the Browser Hash. + +license: MIT-style license. + +requires: [Array, Function, Number, String] + +provides: [Browser, Window, Document] + +... +*/ + +(function(){ + +var document = this.document; +var window = document.window = this; + +var UID = 1; + +this.$uid = (window.ActiveXObject) ? function(item){ + return (item.uid || (item.uid = [UID++]))[0]; +} : function(item){ + return item.uid || (item.uid = UID++); +}; + +$uid(window); +$uid(document); + +var ua = navigator.userAgent.toLowerCase(), + platform = navigator.platform.toLowerCase(), + UA = ua.match(/(opera|ie|firefox|chrome|version)[\s\/:]([\w\d\.]+)?.*?(safari|version[\s\/:]([\w\d\.]+)|$)/) || [null, 'unknown', 0], + mode = UA[1] == 'ie' && document.documentMode; + +var Browser = this.Browser = { + + extend: Function.prototype.extend, + + name: (UA[1] == 'version') ? UA[3] : UA[1], + + version: mode || parseFloat((UA[1] == 'opera' && UA[4]) ? UA[4] : UA[2]), + + Platform: { + name: ua.match(/ip(?:ad|od|hone)/) ? 'ios' : (ua.match(/(?:webos|android)/) || platform.match(/mac|win|linux/) || ['other'])[0] + }, + + Features: { + xpath: !!(document.evaluate), + air: !!(window.runtime), + query: !!(document.querySelector), + json: !!(window.JSON) + }, + + Plugins: {} + +}; + +Browser[Browser.name] = true; +Browser[Browser.name + parseInt(Browser.version, 10)] = true; +Browser.Platform[Browser.Platform.name] = true; + +// Request + +Browser.Request = (function(){ + + var XMLHTTP = function(){ + return new XMLHttpRequest(); + }; + + var MSXML2 = function(){ + return new ActiveXObject('MSXML2.XMLHTTP'); + }; + + var MSXML = function(){ + return new ActiveXObject('Microsoft.XMLHTTP'); + }; + + return Function.attempt(function(){ + XMLHTTP(); + return XMLHTTP; + }, function(){ + MSXML2(); + return MSXML2; + }, function(){ + MSXML(); + return MSXML; + }); + +})(); + +Browser.Features.xhr = !!(Browser.Request); + +// Flash detection + +var version = (Function.attempt(function(){ + return navigator.plugins['Shockwave Flash'].description; +}, function(){ + return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version'); +}) || '0 r0').match(/\d+/g); + +Browser.Plugins.Flash = { + version: Number(version[0] || '0.' + version[1]) || 0, + build: Number(version[2]) || 0 +}; + +// String scripts + +Browser.exec = function(text){ + if (!text) return text; + if (window.execScript){ + window.execScript(text); + } else { + var script = document.createElement('script'); + script.setAttribute('type', 'text/javascript'); + script.text = text; + document.head.appendChild(script); + document.head.removeChild(script); + } + return text; +}; + +String.implement('stripScripts', function(exec){ + var scripts = ''; + var text = this.replace(/]*>([\s\S]*?)<\/script>/gi, function(all, code){ + scripts += code + '\n'; + return ''; + }); + if (exec === true) Browser.exec(scripts); + else if (typeOf(exec) == 'function') exec(scripts, text); + return text; +}); + +// Window, Document + +Browser.extend({ + Document: this.Document, + Window: this.Window, + Element: this.Element, + Event: this.Event +}); + +this.Window = this.$constructor = new Type('Window', function(){}); + +this.$family = Function.from('window').hide(); + +Window.mirror(function(name, method){ + window[name] = method; +}); + +this.Document = document.$constructor = new Type('Document', function(){}); + +document.$family = Function.from('document').hide(); + +Document.mirror(function(name, method){ + document[name] = method; +}); + +document.html = document.documentElement; +document.head = document.getElementsByTagName('head')[0]; + +if (document.execCommand) try { + document.execCommand("BackgroundImageCache", false, true); +} catch (e){} + +if (this.attachEvent && !this.addEventListener){ + var unloadEvent = function(){ + this.detachEvent('onunload', unloadEvent); + document.head = document.html = document.window = null; + }; + this.attachEvent('onunload', unloadEvent); +} + +// IE fails on collections and ) +var arrayFrom = Array.from; +try { + arrayFrom(document.html.childNodes); +} catch(e){ + Array.from = function(item){ + if (typeof item != 'string' && Type.isEnumerable(item) && typeOf(item) != 'array'){ + var i = item.length, array = new Array(i); + while (i--) array[i] = item[i]; + return array; + } + return arrayFrom(item); + }; + + var prototype = Array.prototype, + slice = prototype.slice; + ['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice'].each(function(name){ + var method = prototype[name]; + Array[name] = function(item){ + return method.apply(Array.from(item), slice.call(arguments, 1)); + }; + }); +} + +//<1.2compat> + +if (Browser.Platform.ios) Browser.Platform.ipod = true; + +Browser.Engine = {}; + +var setEngine = function(name, version){ + Browser.Engine.name = name; + Browser.Engine[name + version] = true; + Browser.Engine.version = version; +}; + +if (Browser.ie){ + Browser.Engine.trident = true; + + switch (Browser.version){ + case 6: setEngine('trident', 4); break; + case 7: setEngine('trident', 5); break; + case 8: setEngine('trident', 6); + } +} + +if (Browser.firefox){ + Browser.Engine.gecko = true; + + if (Browser.version >= 3) setEngine('gecko', 19); + else setEngine('gecko', 18); +} + +if (Browser.safari || Browser.chrome){ + Browser.Engine.webkit = true; + + switch (Browser.version){ + case 2: setEngine('webkit', 419); break; + case 3: setEngine('webkit', 420); break; + case 4: setEngine('webkit', 525); + } +} + +if (Browser.opera){ + Browser.Engine.presto = true; + + if (Browser.version >= 9.6) setEngine('presto', 960); + else if (Browser.version >= 9.5) setEngine('presto', 950); + else setEngine('presto', 925); +} + +if (Browser.name == 'unknown'){ + switch ((ua.match(/(?:webkit|khtml|gecko)/) || [])[0]){ + case 'webkit': + case 'khtml': + Browser.Engine.webkit = true; + break; + case 'gecko': + Browser.Engine.gecko = true; + } +} + +this.$exec = Browser.exec; + +// + +})(); + + +/* +--- + +name: Event + +description: Contains the Event Class, to make the event object cross-browser. + +license: MIT-style license. + +requires: [Window, Document, Array, Function, String, Object] + +provides: Event + +... +*/ + +var Event = new Type('Event', function(event, win){ + if (!win) win = window; + var doc = win.document; + event = event || win.event; + if (event.$extended) return event; + this.$extended = true; + var type = event.type, + target = event.target || event.srcElement, + page = {}, + client = {}; + while (target && target.nodeType == 3) target = target.parentNode; + + if (type.indexOf('key') != -1){ + var code = event.which || event.keyCode; + var key = Object.keyOf(Event.Keys, code); + if (type == 'keydown'){ + var fKey = code - 111; + if (fKey > 0 && fKey < 13) key = 'f' + fKey; + } + if (!key) key = String.fromCharCode(code).toLowerCase(); + } else if (type.test(/click|mouse|menu/i)){ + doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body; + page = { + x: (event.pageX != null) ? event.pageX : event.clientX + doc.scrollLeft, + y: (event.pageY != null) ? event.pageY : event.clientY + doc.scrollTop + }; + client = { + x: (event.pageX != null) ? event.pageX - win.pageXOffset : event.clientX, + y: (event.pageY != null) ? event.pageY - win.pageYOffset : event.clientY + }; + if (type.test(/DOMMouseScroll|mousewheel/)){ + var wheel = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3; + } + var rightClick = (event.which == 3) || (event.button == 2), + related = null; + if (type.test(/over|out/)){ + related = event.relatedTarget || event[(type == 'mouseover' ? 'from' : 'to') + 'Element']; + var testRelated = function(){ + while (related && related.nodeType == 3) related = related.parentNode; + return true; + }; + var hasRelated = (Browser.firefox2) ? testRelated.attempt() : testRelated(); + related = (hasRelated) ? related : null; + } + } else if (type.test(/gesture|touch/i)){ + this.rotation = event.rotation; + this.scale = event.scale; + this.targetTouches = event.targetTouches; + this.changedTouches = event.changedTouches; + var touches = this.touches = event.touches; + if (touches && touches[0]){ + var touch = touches[0]; + page = {x: touch.pageX, y: touch.pageY}; + client = {x: touch.clientX, y: touch.clientY}; + } + } + + return Object.append(this, { + event: event, + type: type, + + page: page, + client: client, + rightClick: rightClick, + + wheel: wheel, + + relatedTarget: document.id(related), + target: document.id(target), + + code: code, + key: key, + + shift: event.shiftKey, + control: event.ctrlKey, + alt: event.altKey, + meta: event.metaKey + }); +}); + +Event.Keys = { + 'enter': 13, + 'up': 38, + 'down': 40, + 'left': 37, + 'right': 39, + 'esc': 27, + 'space': 32, + 'backspace': 8, + 'tab': 9, + 'delete': 46 +}; + +//<1.2compat> + +Event.Keys = new Hash(Event.Keys); + +// + +Event.implement({ + + stop: function(){ + return this.stopPropagation().preventDefault(); + }, + + stopPropagation: function(){ + if (this.event.stopPropagation) this.event.stopPropagation(); + else this.event.cancelBubble = true; + return this; + }, + + preventDefault: function(){ + if (this.event.preventDefault) this.event.preventDefault(); + else this.event.returnValue = false; + return this; + } + +}); + + +/* +--- + +name: Class + +description: Contains the Class Function for easily creating, extending, and implementing reusable Classes. + +license: MIT-style license. + +requires: [Array, String, Function, Number] + +provides: Class + +... +*/ + +(function(){ + +var Class = this.Class = new Type('Class', function(params){ + if (instanceOf(params, Function)) params = {initialize: params}; + + var newClass = function(){ + reset(this); + if (newClass.$prototyping) return this; + this.$caller = null; + var value = (this.initialize) ? this.initialize.apply(this, arguments) : this; + this.$caller = this.caller = null; + return value; + }.extend(this).implement(params); + + newClass.$constructor = Class; + newClass.prototype.$constructor = newClass; + newClass.prototype.parent = parent; + + return newClass; +}); + +var parent = function(){ + if (!this.$caller) throw new Error('The method "parent" cannot be called.'); + var name = this.$caller.$name, + parent = this.$caller.$owner.parent, + previous = (parent) ? parent.prototype[name] : null; + if (!previous) throw new Error('The method "' + name + '" has no parent.'); + return previous.apply(this, arguments); +}; + +var reset = function(object){ + for (var key in object){ + var value = object[key]; + switch (typeOf(value)){ + case 'object': + var F = function(){}; + F.prototype = value; + object[key] = reset(new F); + break; + case 'array': object[key] = value.clone(); break; + } + } + return object; +}; + +var wrap = function(self, key, method){ + if (method.$origin) method = method.$origin; + var wrapper = function(){ + if (method.$protected && this.$caller == null) throw new Error('The method "' + key + '" cannot be called.'); + var caller = this.caller, current = this.$caller; + this.caller = current; this.$caller = wrapper; + var result = method.apply(this, arguments); + this.$caller = current; this.caller = caller; + return result; + }.extend({$owner: self, $origin: method, $name: key}); + return wrapper; +}; + +var implement = function(key, value, retain){ + if (Class.Mutators.hasOwnProperty(key)){ + value = Class.Mutators[key].call(this, value); + if (value == null) return this; + } + + if (typeOf(value) == 'function'){ + if (value.$hidden) return this; + this.prototype[key] = (retain) ? value : wrap(this, key, value); + } else { + Object.merge(this.prototype, key, value); + } + + return this; +}; + +var getInstance = function(klass){ + klass.$prototyping = true; + var proto = new klass; + delete klass.$prototyping; + return proto; +}; + +Class.implement('implement', implement.overloadSetter()); + +Class.Mutators = { + + Extends: function(parent){ + this.parent = parent; + this.prototype = getInstance(parent); + }, + + Implements: function(items){ + Array.from(items).each(function(item){ + var instance = new item; + for (var key in instance) implement.call(this, key, instance[key], true); + }, this); + } +}; + +})(); + + +/* +--- + +name: Class.Extras + +description: Contains Utility Classes that can be implemented into your own Classes to ease the execution of many common tasks. + +license: MIT-style license. + +requires: Class + +provides: [Class.Extras, Chain, Events, Options] + +... +*/ + +(function(){ + +this.Chain = new Class({ + + $chain: [], + + chain: function(){ + this.$chain.append(Array.flatten(arguments)); + return this; + }, + + callChain: function(){ + return (this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false; + }, + + clearChain: function(){ + this.$chain.empty(); + return this; + } + +}); + +var removeOn = function(string){ + return string.replace(/^on([A-Z])/, function(full, first){ + return first.toLowerCase(); + }); +}; + +this.Events = new Class({ + + $events: {}, + + addEvent: function(type, fn, internal){ + type = removeOn(type); + + /*<1.2compat>*/ + if (fn == $empty) return this; + /**/ + + this.$events[type] = (this.$events[type] || []).include(fn); + if (internal) fn.internal = true; + return this; + }, + + addEvents: function(events){ + for (var type in events) this.addEvent(type, events[type]); + return this; + }, + + fireEvent: function(type, args, delay){ + type = removeOn(type); + var events = this.$events[type]; + if (!events) return this; + args = Array.from(args); + events.each(function(fn){ + if (delay) fn.delay(delay, this, args); + else fn.apply(this, args); + }, this); + return this; + }, + + removeEvent: function(type, fn){ + type = removeOn(type); + var events = this.$events[type]; + if (events && !fn.internal){ + var index = events.indexOf(fn); + if (index != -1) delete events[index]; + } + return this; + }, + + removeEvents: function(events){ + var type; + if (typeOf(events) == 'object'){ + for (type in events) this.removeEvent(type, events[type]); + return this; + } + if (events) events = removeOn(events); + for (type in this.$events){ + if (events && events != type) continue; + var fns = this.$events[type]; + for (var i = fns.length; i--;) this.removeEvent(type, fns[i]); + } + return this; + } + +}); + +this.Options = new Class({ + + setOptions: function(){ + var options = this.options = Object.merge.apply(null, [{}, this.options].append(arguments)); + if (!this.addEvent) return this; + for (var option in options){ + if (typeOf(options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue; + this.addEvent(option, options[option]); + delete options[option]; + } + return this; + } + +}); + +})(); + + +/* +--- +name: Slick.Parser +description: Standalone CSS3 Selector parser +provides: Slick.Parser +... +*/ + +(function(){ + +var parsed, + separatorIndex, + combinatorIndex, + reversed, + cache = {}, + reverseCache = {}, + reUnescape = /\\/g; + +var parse = function(expression, isReversed){ + if (expression == null) return null; + if (expression.Slick === true) return expression; + expression = ('' + expression).replace(/^\s+|\s+$/g, ''); + reversed = !!isReversed; + var currentCache = (reversed) ? reverseCache : cache; + if (currentCache[expression]) return currentCache[expression]; + parsed = {Slick: true, expressions: [], raw: expression, reverse: function(){ + return parse(this.raw, true); + }}; + separatorIndex = -1; + while (expression != (expression = expression.replace(regexp, parser))); + parsed.length = parsed.expressions.length; + return currentCache[expression] = (reversed) ? reverse(parsed) : parsed; +}; + +var reverseCombinator = function(combinator){ + if (combinator === '!') return ' '; + else if (combinator === ' ') return '!'; + else if ((/^!/).test(combinator)) return combinator.replace(/^!/, ''); + else return '!' + combinator; +}; + +var reverse = function(expression){ + var expressions = expression.expressions; + for (var i = 0; i < expressions.length; i++){ + var exp = expressions[i]; + var last = {parts: [], tag: '*', combinator: reverseCombinator(exp[0].combinator)}; + + for (var j = 0; j < exp.length; j++){ + var cexp = exp[j]; + if (!cexp.reverseCombinator) cexp.reverseCombinator = ' '; + cexp.combinator = cexp.reverseCombinator; + delete cexp.reverseCombinator; + } + + exp.reverse().push(last); + } + return expression; +}; + +var escapeRegExp = function(string){// Credit: XRegExp 0.6.1 (c) 2007-2008 Steven Levithan MIT License + return string.replace(/[-[\]{}()*+?.\\^$|,#\s]/g, "\\$&"); +}; + +var regexp = new RegExp( +/* +#!/usr/bin/env ruby +puts "\t\t" + DATA.read.gsub(/\(\?x\)|\s+#.*$|\s+|\\$|\\n/,'') +__END__ + "(?x)^(?:\ + \\s* ( , ) \\s* # Separator \n\ + | \\s* ( + ) \\s* # Combinator \n\ + | ( \\s+ ) # CombinatorChildren \n\ + | ( + | \\* ) # Tag \n\ + | \\# ( + ) # ID \n\ + | \\. ( + ) # ClassName \n\ + | # Attribute \n\ + \\[ \ + \\s* (+) (?: \ + \\s* ([*^$!~|]?=) (?: \ + \\s* (?:\ + ([\"']?)(.*?)\\9 \ + )\ + ) \ + )? \\s* \ + \\](?!\\]) \n\ + | :+ ( + )(?:\ + \\( (?:\ + (?:([\"'])([^\\12]*)\\12)|((?:\\([^)]+\\)|[^()]*)+)\ + ) \\)\ + )?\ + )" +*/ + "^(?:\\s*(,)\\s*|\\s*(+)\\s*|(\\s+)|(+|\\*)|\\#(+)|\\.(+)|\\[\\s*(+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|:+(+)(?:\\((?:(?:([\"'])([^\\12]*)\\12)|((?:\\([^)]+\\)|[^()]*)+))\\))?)" + .replace(//, '[' + escapeRegExp(">+~`!@$%^&={}\\;/g, '(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])') + .replace(//g, '(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])') +); + +function parser( + rawMatch, + + separator, + combinator, + combinatorChildren, + + tagName, + id, + className, + + attributeKey, + attributeOperator, + attributeQuote, + attributeValue, + + pseudoClass, + pseudoQuote, + pseudoClassQuotedValue, + pseudoClassValue +){ + if (separator || separatorIndex === -1){ + parsed.expressions[++separatorIndex] = []; + combinatorIndex = -1; + if (separator) return ''; + } + + if (combinator || combinatorChildren || combinatorIndex === -1){ + combinator = combinator || ' '; + var currentSeparator = parsed.expressions[separatorIndex]; + if (reversed && currentSeparator[combinatorIndex]) + currentSeparator[combinatorIndex].reverseCombinator = reverseCombinator(combinator); + currentSeparator[++combinatorIndex] = {combinator: combinator, tag: '*'}; + } + + var currentParsed = parsed.expressions[separatorIndex][combinatorIndex]; + + if (tagName){ + currentParsed.tag = tagName.replace(reUnescape, ''); + + } else if (id){ + currentParsed.id = id.replace(reUnescape, ''); + + } else if (className){ + className = className.replace(reUnescape, ''); + + if (!currentParsed.classList) currentParsed.classList = []; + if (!currentParsed.classes) currentParsed.classes = []; + currentParsed.classList.push(className); + currentParsed.classes.push({ + value: className, + regexp: new RegExp('(^|\\s)' + escapeRegExp(className) + '(\\s|$)') + }); + + } else if (pseudoClass){ + pseudoClassValue = pseudoClassValue || pseudoClassQuotedValue; + pseudoClassValue = pseudoClassValue ? pseudoClassValue.replace(reUnescape, '') : null; + + if (!currentParsed.pseudos) currentParsed.pseudos = []; + currentParsed.pseudos.push({ + key: pseudoClass.replace(reUnescape, ''), + value: pseudoClassValue + }); + + } else if (attributeKey){ + attributeKey = attributeKey.replace(reUnescape, ''); + attributeValue = (attributeValue || '').replace(reUnescape, ''); + + var test, regexp; + + switch (attributeOperator){ + case '^=' : regexp = new RegExp( '^'+ escapeRegExp(attributeValue) ); break; + case '$=' : regexp = new RegExp( escapeRegExp(attributeValue) +'$' ); break; + case '~=' : regexp = new RegExp( '(^|\\s)'+ escapeRegExp(attributeValue) +'(\\s|$)' ); break; + case '|=' : regexp = new RegExp( '^'+ escapeRegExp(attributeValue) +'(-|$)' ); break; + case '=' : test = function(value){ + return attributeValue == value; + }; break; + case '*=' : test = function(value){ + return value && value.indexOf(attributeValue) > -1; + }; break; + case '!=' : test = function(value){ + return attributeValue != value; + }; break; + default : test = function(value){ + return !!value; + }; + } + + if (attributeValue == '' && (/^[*$^]=$/).test(attributeOperator)) test = function(){ + return false; + }; + + if (!test) test = function(value){ + return value && regexp.test(value); + }; + + if (!currentParsed.attributes) currentParsed.attributes = []; + currentParsed.attributes.push({ + key: attributeKey, + operator: attributeOperator, + value: attributeValue, + test: test + }); + + } + + return ''; +}; + +// Slick NS + +var Slick = (this.Slick || {}); + +Slick.parse = function(expression){ + return parse(expression); +}; + +Slick.escapeRegExp = escapeRegExp; + +if (!this.Slick) this.Slick = Slick; + +}).apply(/**/(typeof exports != 'undefined') ? exports : /**/this); + + +/* +--- +name: Slick.Finder +description: The new, superfast css selector engine. +provides: Slick.Finder +requires: Slick.Parser +... +*/ + +(function(){ + +var local = {}; + +// Feature / Bug detection + +local.isNativeCode = function(fn){ + return (/\{\s*\[native code\]\s*\}/).test('' + fn); +}; + +local.isXML = function(document){ + return (!!document.xmlVersion) || (!!document.xml) || (Object.prototype.toString.call(document) === '[object XMLDocument]') || + (document.nodeType === 9 && document.documentElement.nodeName !== 'HTML'); +}; + +local.setDocument = function(document){ + + // convert elements / window arguments to document. if document cannot be extrapolated, the function returns. + + if (document.nodeType === 9); // document + else if (document.ownerDocument) document = document.ownerDocument; // node + else if (document.navigator) document = document.document; // window + else return; + + // check if it's the old document + + if (this.document === document) return; + this.document = document; + var root = this.root = document.documentElement; + + this.isXMLDocument = this.isXML(document); + + this.brokenStarGEBTN + = this.starSelectsClosedQSA + = this.idGetsName + = this.brokenMixedCaseQSA + = this.brokenGEBCN + = this.brokenCheckedQSA + = this.brokenEmptyAttributeQSA + = this.isHTMLDocument + = false; + + var starSelectsClosed, starSelectsComments, + brokenSecondClassNameGEBCN, cachedGetElementsByClassName; + + var selected, id; + var testNode = document.createElement('div'); + root.appendChild(testNode); + + // on non-HTML documents innerHTML and getElementsById doesnt work properly + try { + id = 'slick_getbyid_test'; + testNode.innerHTML = ''; + this.isHTMLDocument = !!document.getElementById(id); + } catch(e){}; + + if (this.isHTMLDocument){ + + testNode.style.display = 'none'; + + // IE returns comment nodes for getElementsByTagName('*') for some documents + testNode.appendChild(document.createComment('')); + starSelectsComments = (testNode.getElementsByTagName('*').length > 0); + + // IE returns closed nodes (EG:"") for getElementsByTagName('*') for some documents + try { + testNode.innerHTML = 'foo'; + selected = testNode.getElementsByTagName('*'); + starSelectsClosed = (selected && selected.length && selected[0].nodeName.charAt(0) == '/'); + } catch(e){}; + + this.brokenStarGEBTN = starSelectsComments || starSelectsClosed; + + // IE 8 returns closed nodes (EG:"") for querySelectorAll('*') for some documents + if (testNode.querySelectorAll) try { + testNode.innerHTML = 'foo'; + selected = testNode.querySelectorAll('*'); + this.starSelectsClosedQSA = (selected && selected.length && selected[0].nodeName.charAt(0) == '/'); + } catch(e){}; + + // IE returns elements with the name instead of just id for getElementsById for some documents + try { + id = 'slick_id_gets_name'; + testNode.innerHTML = ''; + this.idGetsName = document.getElementById(id) === testNode.firstChild; + } catch(e){}; + + // Safari 3.2 querySelectorAll doesnt work with mixedcase on quirksmode + try { + testNode.innerHTML = ''; + this.brokenMixedCaseQSA = !testNode.querySelectorAll('.MiXedCaSe').length; + } catch(e){}; + + try { + testNode.innerHTML = ''; + testNode.getElementsByClassName('b').length; + testNode.firstChild.className = 'b'; + cachedGetElementsByClassName = (testNode.getElementsByClassName('b').length != 2); + } catch(e){}; + + // Opera 9.6 getElementsByClassName doesnt detects the class if its not the first one + try { + testNode.innerHTML = ''; + brokenSecondClassNameGEBCN = (testNode.getElementsByClassName('a').length != 2); + } catch(e){}; + + this.brokenGEBCN = cachedGetElementsByClassName || brokenSecondClassNameGEBCN; + + // Webkit dont return selected options on querySelectorAll + try { + testNode.innerHTML = ''; + this.brokenCheckedQSA = (testNode.querySelectorAll(':checked').length == 0); + } catch(e){}; + + // IE returns incorrect results for attr[*^$]="" selectors on querySelectorAll + try { + testNode.innerHTML = ''; + this.brokenEmptyAttributeQSA = (testNode.querySelectorAll('[class*=""]').length != 0); + } catch(e){}; + + } + + root.removeChild(testNode); + testNode = null; + + // hasAttribute + + this.hasAttribute = (root && this.isNativeCode(root.hasAttribute)) ? function(node, attribute) { + return node.hasAttribute(attribute); + } : function(node, attribute) { + node = node.getAttributeNode(attribute); + return !!(node && (node.specified || node.nodeValue)); + }; + + // contains + // FIXME: Add specs: local.contains should be different for xml and html documents? + this.contains = (root && this.isNativeCode(root.contains)) ? function(context, node){ + return context.contains(node); + } : (root && root.compareDocumentPosition) ? function(context, node){ + return context === node || !!(context.compareDocumentPosition(node) & 16); + } : function(context, node){ + if (node) do { + if (node === context) return true; + } while ((node = node.parentNode)); + return false; + }; + + // document order sorting + // credits to Sizzle (http://sizzlejs.com/) + + this.documentSorter = (root.compareDocumentPosition) ? function(a, b){ + if (!a.compareDocumentPosition || !b.compareDocumentPosition) return 0; + return a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; + } : ('sourceIndex' in root) ? function(a, b){ + if (!a.sourceIndex || !b.sourceIndex) return 0; + return a.sourceIndex - b.sourceIndex; + } : (document.createRange) ? function(a, b){ + if (!a.ownerDocument || !b.ownerDocument) return 0; + var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); + aRange.setStart(a, 0); + aRange.setEnd(a, 0); + bRange.setStart(b, 0); + bRange.setEnd(b, 0); + return aRange.compareBoundaryPoints(Range.START_TO_END, bRange); + } : null ; + + this.getUID = (this.isHTMLDocument) ? this.getUIDHTML : this.getUIDXML; + +}; + +// Main Method + +local.search = function(context, expression, append, first){ + + var found = this.found = (first) ? null : (append || []); + + // context checks + + if (!context) return found; // No context + if (context.navigator) context = context.document; // Convert the node from a window to a document + else if (!context.nodeType) return found; // Reject misc junk input + + // setup + + var parsed, i; + + var uniques = this.uniques = {}; + + if (this.document !== (context.ownerDocument || context)) this.setDocument(context); + + // should sort if there are nodes in append and if you pass multiple expressions. + // should remove duplicates if append already has items + var shouldUniques = !!(append && append.length); + + // avoid duplicating items already in the append array + if (shouldUniques) for (i = found.length; i--;) this.uniques[this.getUID(found[i])] = true; + + // expression checks + + if (typeof expression == 'string'){ // expression is a string + + // Overrides + + for (i = this.overrides.length; i--;){ + var override = this.overrides[i]; + if (override.regexp.test(expression)){ + var result = override.method.call(context, expression, found, first); + if (result === false) continue; + if (result === true) return found; + return result; + } + } + + parsed = this.Slick.parse(expression); + if (!parsed.length) return found; + } else if (expression == null){ // there is no expression + return found; + } else if (expression.Slick){ // expression is a parsed Slick object + parsed = expression; + } else if (this.contains(context.documentElement || context, expression)){ // expression is a node + (found) ? found.push(expression) : found = expression; + return found; + } else { // other junk + return found; + } + + // cache elements for the nth selectors + + /**//**/ + + this.posNTH = {}; + this.posNTHLast = {}; + this.posNTHType = {}; + this.posNTHTypeLast = {}; + + /**//**/ + + // if append is null and there is only a single selector with one expression use pushArray, else use pushUID + this.push = (!shouldUniques && (first || (parsed.length == 1 && parsed.expressions[0].length == 1))) ? this.pushArray : this.pushUID; + + if (found == null) found = []; + + // default engine + + var j, m, n; + var combinator, tag, id, classList, classes, attributes, pseudos; + var currentItems, currentExpression, currentBit, lastBit, expressions = parsed.expressions; + + search: for (i = 0; (currentExpression = expressions[i]); i++) for (j = 0; (currentBit = currentExpression[j]); j++){ + + combinator = 'combinator:' + currentBit.combinator; + if (!this[combinator]) continue search; + + tag = (this.isXMLDocument) ? currentBit.tag : currentBit.tag.toUpperCase(); + id = currentBit.id; + classList = currentBit.classList; + classes = currentBit.classes; + attributes = currentBit.attributes; + pseudos = currentBit.pseudos; + lastBit = (j === (currentExpression.length - 1)); + + this.bitUniques = {}; + + if (lastBit){ + this.uniques = uniques; + this.found = found; + } else { + this.uniques = {}; + this.found = []; + } + + if (j === 0){ + this[combinator](context, tag, id, classes, attributes, pseudos, classList); + if (first && lastBit && found.length) break search; + } else { + if (first && lastBit) for (m = 0, n = currentItems.length; m < n; m++){ + this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList); + if (found.length) break search; + } else for (m = 0, n = currentItems.length; m < n; m++) this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList); + } + + currentItems = this.found; + } + + if (shouldUniques || (parsed.expressions.length > 1)) this.sort(found); + + return (first) ? (found[0] || null) : found; +}; + +// Utils + +local.uidx = 1; +local.uidk = 'slick:uniqueid'; + +local.getUIDXML = function(node){ + var uid = node.getAttribute(this.uidk); + if (!uid){ + uid = this.uidx++; + node.setAttribute(this.uidk, uid); + } + return uid; +}; + +local.getUIDHTML = function(node){ + return node.uniqueNumber || (node.uniqueNumber = this.uidx++); +}; + +// sort based on the setDocument documentSorter method. + +local.sort = function(results){ + if (!this.documentSorter) return results; + results.sort(this.documentSorter); + return results; +}; + +/**//**/ + +local.cacheNTH = {}; + +local.matchNTH = /^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/; + +local.parseNTHArgument = function(argument){ + var parsed = argument.match(this.matchNTH); + if (!parsed) return false; + var special = parsed[2] || false; + var a = parsed[1] || 1; + if (a == '-') a = -1; + var b = +parsed[3] || 0; + parsed = + (special == 'n') ? {a: a, b: b} : + (special == 'odd') ? {a: 2, b: 1} : + (special == 'even') ? {a: 2, b: 0} : {a: 0, b: a}; + + return (this.cacheNTH[argument] = parsed); +}; + +local.createNTHPseudo = function(child, sibling, positions, ofType){ + return function(node, argument){ + var uid = this.getUID(node); + if (!this[positions][uid]){ + var parent = node.parentNode; + if (!parent) return false; + var el = parent[child], count = 1; + if (ofType){ + var nodeName = node.nodeName; + do { + if (el.nodeName !== nodeName) continue; + this[positions][this.getUID(el)] = count++; + } while ((el = el[sibling])); + } else { + do { + if (el.nodeType !== 1) continue; + this[positions][this.getUID(el)] = count++; + } while ((el = el[sibling])); + } + } + argument = argument || 'n'; + var parsed = this.cacheNTH[argument] || this.parseNTHArgument(argument); + if (!parsed) return false; + var a = parsed.a, b = parsed.b, pos = this[positions][uid]; + if (a == 0) return b == pos; + if (a > 0){ + if (pos < b) return false; + } else { + if (b < pos) return false; + } + return ((pos - b) % a) == 0; + }; +}; + +/**//**/ + +local.pushArray = function(node, tag, id, classes, attributes, pseudos){ + if (this.matchSelector(node, tag, id, classes, attributes, pseudos)) this.found.push(node); +}; + +local.pushUID = function(node, tag, id, classes, attributes, pseudos){ + var uid = this.getUID(node); + if (!this.uniques[uid] && this.matchSelector(node, tag, id, classes, attributes, pseudos)){ + this.uniques[uid] = true; + this.found.push(node); + } +}; + +local.matchNode = function(node, selector){ + var parsed = this.Slick.parse(selector); + if (!parsed) return true; + + // simple (single) selectors + if(parsed.length == 1 && parsed.expressions[0].length == 1){ + var exp = parsed.expressions[0][0]; + return this.matchSelector(node, (this.isXMLDocument) ? exp.tag : exp.tag.toUpperCase(), exp.id, exp.classes, exp.attributes, exp.pseudos); + } + + var nodes = this.search(this.document, parsed); + for (var i = 0, item; item = nodes[i++];){ + if (item === node) return true; + } + return false; +}; + +local.matchPseudo = function(node, name, argument){ + var pseudoName = 'pseudo:' + name; + if (this[pseudoName]) return this[pseudoName](node, argument); + var attribute = this.getAttribute(node, name); + return (argument) ? argument == attribute : !!attribute; +}; + +local.matchSelector = function(node, tag, id, classes, attributes, pseudos){ + if (tag){ + if (tag == '*'){ + if (node.nodeName < '@') return false; // Fix for comment nodes and closed nodes + } else { + if (node.nodeName != tag) return false; + } + } + + if (id && node.getAttribute('id') != id) return false; + + var i, part, cls; + if (classes) for (i = classes.length; i--;){ + cls = ('className' in node) ? node.className : node.getAttribute('class'); + if (!(cls && classes[i].regexp.test(cls))) return false; + } + if (attributes) for (i = attributes.length; i--;){ + part = attributes[i]; + if (part.operator ? !part.test(this.getAttribute(node, part.key)) : !this.hasAttribute(node, part.key)) return false; + } + if (pseudos) for (i = pseudos.length; i--;){ + part = pseudos[i]; + if (!this.matchPseudo(node, part.key, part.value)) return false; + } + return true; +}; + +var combinators = { + + ' ': function(node, tag, id, classes, attributes, pseudos, classList){ // all child nodes, any level + + var i, item, children; + + if (this.isHTMLDocument){ + getById: if (id){ + item = this.document.getElementById(id); + if ((!item && node.all) || (this.idGetsName && item && item.getAttributeNode('id').nodeValue != id)){ + // all[id] returns all the elements with that name or id inside node + // if theres just one it will return the element, else it will be a collection + children = node.all[id]; + if (!children) return; + if (!children[0]) children = [children]; + for (i = 0; item = children[i++];) if (item.getAttributeNode('id').nodeValue == id){ + this.push(item, tag, null, classes, attributes, pseudos); + break; + } + return; + } + if (!item){ + // if the context is in the dom we return, else we will try GEBTN, breaking the getById label + if (this.contains(this.document.documentElement, node)) return; + else break getById; + } else if (this.document !== node && !this.contains(node, item)) return; + this.push(item, tag, null, classes, attributes, pseudos); + return; + } + getByClass: if (classes && node.getElementsByClassName && !this.brokenGEBCN){ + children = node.getElementsByClassName(classList.join(' ')); + if (!(children && children.length)) break getByClass; + for (i = 0; item = children[i++];) this.push(item, tag, id, null, attributes, pseudos); + return; + } + } + getByTag: { + children = node.getElementsByTagName(tag); + if (!(children && children.length)) break getByTag; + if (!this.brokenStarGEBTN) tag = null; + for (i = 0; item = children[i++];) this.push(item, tag, id, classes, attributes, pseudos); + } + }, + + '>': function(node, tag, id, classes, attributes, pseudos){ // direct children + if ((node = node.firstChild)) do { + if (node.nodeType === 1) this.push(node, tag, id, classes, attributes, pseudos); + } while ((node = node.nextSibling)); + }, + + '+': function(node, tag, id, classes, attributes, pseudos){ // next sibling + while ((node = node.nextSibling)) if (node.nodeType === 1){ + this.push(node, tag, id, classes, attributes, pseudos); + break; + } + }, + + '^': function(node, tag, id, classes, attributes, pseudos){ // first child + node = node.firstChild; + if (node){ + if (node.nodeType === 1) this.push(node, tag, id, classes, attributes, pseudos); + else this['combinator:+'](node, tag, id, classes, attributes, pseudos); + } + }, + + '~': function(node, tag, id, classes, attributes, pseudos){ // next siblings + while ((node = node.nextSibling)){ + if (node.nodeType !== 1) continue; + var uid = this.getUID(node); + if (this.bitUniques[uid]) break; + this.bitUniques[uid] = true; + this.push(node, tag, id, classes, attributes, pseudos); + } + }, + + '++': function(node, tag, id, classes, attributes, pseudos){ // next sibling and previous sibling + this['combinator:+'](node, tag, id, classes, attributes, pseudos); + this['combinator:!+'](node, tag, id, classes, attributes, pseudos); + }, + + '~~': function(node, tag, id, classes, attributes, pseudos){ // next siblings and previous siblings + this['combinator:~'](node, tag, id, classes, attributes, pseudos); + this['combinator:!~'](node, tag, id, classes, attributes, pseudos); + }, + + '!': function(node, tag, id, classes, attributes, pseudos){ // all parent nodes up to document + while ((node = node.parentNode)) if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos); + }, + + '!>': function(node, tag, id, classes, attributes, pseudos){ // direct parent (one level) + node = node.parentNode; + if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos); + }, + + '!+': function(node, tag, id, classes, attributes, pseudos){ // previous sibling + while ((node = node.previousSibling)) if (node.nodeType === 1){ + this.push(node, tag, id, classes, attributes, pseudos); + break; + } + }, + + '!^': function(node, tag, id, classes, attributes, pseudos){ // last child + node = node.lastChild; + if (node){ + if (node.nodeType === 1) this.push(node, tag, id, classes, attributes, pseudos); + else this['combinator:!+'](node, tag, id, classes, attributes, pseudos); + } + }, + + '!~': function(node, tag, id, classes, attributes, pseudos){ // previous siblings + while ((node = node.previousSibling)){ + if (node.nodeType !== 1) continue; + var uid = this.getUID(node); + if (this.bitUniques[uid]) break; + this.bitUniques[uid] = true; + this.push(node, tag, id, classes, attributes, pseudos); + } + } + +}; + +for (var c in combinators) local['combinator:' + c] = combinators[c]; + +var pseudos = { + + /**/ + + 'empty': function(node){ + var child = node.firstChild; + return !(child && child.nodeType == 1) && !(node.innerText || node.textContent || '').length; + }, + + 'not': function(node, expression){ + return !this.matchNode(node, expression); + }, + + 'contains': function(node, text){ + return (node.innerText || node.textContent || '').indexOf(text) > -1; + }, + + 'first-child': function(node){ + while ((node = node.previousSibling)) if (node.nodeType === 1) return false; + return true; + }, + + 'last-child': function(node){ + while ((node = node.nextSibling)) if (node.nodeType === 1) return false; + return true; + }, + + 'only-child': function(node){ + var prev = node; + while ((prev = prev.previousSibling)) if (prev.nodeType === 1) return false; + var next = node; + while ((next = next.nextSibling)) if (next.nodeType === 1) return false; + return true; + }, + + /**/ + + 'nth-child': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTH'), + + 'nth-last-child': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHLast'), + + 'nth-of-type': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTHType', true), + + 'nth-last-of-type': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHTypeLast', true), + + 'index': function(node, index){ + return this['pseudo:nth-child'](node, '' + index + 1); + }, + + 'even': function(node, argument){ + return this['pseudo:nth-child'](node, '2n'); + }, + + 'odd': function(node, argument){ + return this['pseudo:nth-child'](node, '2n+1'); + }, + + /**/ + + /**/ + + 'first-of-type': function(node){ + var nodeName = node.nodeName; + while ((node = node.previousSibling)) if (node.nodeName === nodeName) return false; + return true; + }, + + 'last-of-type': function(node){ + var nodeName = node.nodeName; + while ((node = node.nextSibling)) if (node.nodeName === nodeName) return false; + return true; + }, + + 'only-of-type': function(node){ + var prev = node, nodeName = node.nodeName; + while ((prev = prev.previousSibling)) if (prev.nodeName === nodeName) return false; + var next = node; + while ((next = next.nextSibling)) if (next.nodeName === nodeName) return false; + return true; + }, + + /**/ + + // custom pseudos + + 'enabled': function(node){ + return (node.disabled === false); + }, + + 'disabled': function(node){ + return (node.disabled === true); + }, + + 'checked': function(node){ + return node.checked || node.selected; + }, + + 'focus': function(node){ + return this.isHTMLDocument && this.document.activeElement === node && (node.href || node.type || this.hasAttribute(node, 'tabindex')); + }, + + 'root': function(node){ + return (node === this.root); + }, + + 'selected': function(node){ + return node.selected; + } + + /**/ +}; + +for (var p in pseudos) local['pseudo:' + p] = pseudos[p]; + +// attributes methods + +local.attributeGetters = { + + 'class': function(){ + return ('className' in this) ? this.className : this.getAttribute('class'); + }, + + 'for': function(){ + return ('htmlFor' in this) ? this.htmlFor : this.getAttribute('for'); + }, + + 'href': function(){ + return ('href' in this) ? this.getAttribute('href', 2) : this.getAttribute('href'); + }, + + 'style': function(){ + return (this.style) ? this.style.cssText : this.getAttribute('style'); + } + +}; + +local.getAttribute = function(node, name){ + // FIXME: check if getAttribute() will get input elements on a form on this browser + // getAttribute is faster than getAttributeNode().nodeValue + var method = this.attributeGetters[name]; + if (method) return method.call(node); + var attributeNode = node.getAttributeNode(name); + return attributeNode ? attributeNode.nodeValue : null; +}; + +// overrides + +local.overrides = []; + +local.override = function(regexp, method){ + this.overrides.push({regexp: regexp, method: method}); +}; + +/**/ + +/**/ + +var reEmptyAttribute = /\[.*[*$^]=(?:["']{2})?\]/; + +local.override(/./, function(expression, found, first){ //querySelectorAll override + + if (!this.querySelectorAll || this.nodeType != 9 || !local.isHTMLDocument || local.brokenMixedCaseQSA || + (local.brokenCheckedQSA && expression.indexOf(':checked') > -1) || + (local.brokenEmptyAttributeQSA && reEmptyAttribute.test(expression)) || Slick.disableQSA) return false; + + var nodes, node; + try { + if (first) return this.querySelector(expression) || null; + else nodes = this.querySelectorAll(expression); + } catch(error){ + return false; + } + + var i, hasOthers = !!(found.length); + + if (local.starSelectsClosedQSA) for (i = 0; node = nodes[i++];){ + if (node.nodeName > '@' && (!hasOthers || !local.uniques[local.getUIDHTML(node)])) found.push(node); + } else for (i = 0; node = nodes[i++];){ + if (!hasOthers || !local.uniques[local.getUIDHTML(node)]) found.push(node); + } + + if (hasOthers) local.sort(found); + + return true; + +}); + +/**/ + +/**/ + +local.override(/^[\w-]+$|^\*$/, function(expression, found, first){ // tag override + var tag = expression; + if (tag == '*' && local.brokenStarGEBTN) return false; + + var nodes = this.getElementsByTagName(tag); + + if (first) return nodes[0] || null; + var i, node, hasOthers = !!(found.length); + + for (i = 0; node = nodes[i++];){ + if (!hasOthers || !local.uniques[local.getUID(node)]) found.push(node); + } + + if (hasOthers) local.sort(found); + + return true; +}); + +/**/ + +/**/ + +local.override(/^\.[\w-]+$/, function(expression, found, first){ // class override + if (!local.isHTMLDocument || (!this.getElementsByClassName && this.querySelectorAll)) return false; + + var nodes, node, i, hasOthers = !!(found && found.length), className = expression.substring(1); + if (this.getElementsByClassName && !local.brokenGEBCN){ + nodes = this.getElementsByClassName(className); + if (first) return nodes[0] || null; + for (i = 0; node = nodes[i++];){ + if (!hasOthers || !local.uniques[local.getUIDHTML(node)]) found.push(node); + } + } else { + var matchClass = new RegExp('(^|\\s)'+ Slick.escapeRegExp(className) +'(\\s|$)'); + nodes = this.getElementsByTagName('*'); + for (i = 0; node = nodes[i++];){ + className = node.className; + if (!className || !matchClass.test(className)) continue; + if (first) return node; + if (!hasOthers || !local.uniques[local.getUIDHTML(node)]) found.push(node); + } + } + if (hasOthers) local.sort(found); + return (first) ? null : true; +}); + +/**/ + +/**/ + +local.override(/^#[\w-]+$/, function(expression, found, first){ // ID override + if (!local.isHTMLDocument || this.nodeType != 9) return false; + + var id = expression.substring(1), el = this.getElementById(id); + if (!el) return found; + if (local.idGetsName && el.getAttributeNode('id').nodeValue != id) return false; + if (first) return el || null; + var hasOthers = !!(found.length); + if (!hasOthers || !local.uniques[local.getUIDHTML(el)]) found.push(el); + if (hasOthers) local.sort(found); + return true; +}); + +/**/ + +/**/ + +if (typeof document != 'undefined') local.setDocument(document); + +// Slick + +var Slick = local.Slick = (this.Slick || {}); + +Slick.version = '0.9dev'; + +// Slick finder + +Slick.search = function(context, expression, append){ + return local.search(context, expression, append); +}; + +Slick.find = function(context, expression){ + return local.search(context, expression, null, true); +}; + +// Slick containment checker + +Slick.contains = function(container, node){ + local.setDocument(container); + return local.contains(container, node); +}; + +// Slick attribute getter + +Slick.getAttribute = function(node, name){ + return local.getAttribute(node, name); +}; + +// Slick matcher + +Slick.match = function(node, selector){ + if (!(node && selector)) return false; + if (!selector || selector === node) return true; + if (typeof selector != 'string') return false; + local.setDocument(node); + return local.matchNode(node, selector); +}; + +// Slick attribute accessor + +Slick.defineAttributeGetter = function(name, fn){ + local.attributeGetters[name] = fn; + return this; +}; + +Slick.lookupAttributeGetter = function(name){ + return local.attributeGetters[name]; +}; + +// Slick pseudo accessor + +Slick.definePseudo = function(name, fn){ + local['pseudo:' + name] = function(node, argument){ + return fn.call(node, argument); + }; + return this; +}; + +Slick.lookupPseudo = function(name){ + var pseudo = local['pseudo:' + name]; + if (pseudo) return function(argument){ + return pseudo.call(this, argument); + }; + return null; +}; + +// Slick overrides accessor + +Slick.override = function(regexp, fn){ + local.override(regexp, fn); + return this; +}; + +Slick.isXML = local.isXML; + +Slick.uidOf = function(node){ + return local.getUIDHTML(node); +}; + +if (!this.Slick) this.Slick = Slick; + +}).apply(/**/(typeof exports != 'undefined') ? exports : /**/this); + + +/* +--- + +name: Element + +description: One of the most important items in MooTools. Contains the dollar function, the dollars function, and an handful of cross-browser, time-saver methods to let you easily work with HTML Elements. + +license: MIT-style license. + +requires: [Window, Document, Array, String, Function, Number, Slick.Parser, Slick.Finder] + +provides: [Element, Elements, $, $$, Iframe, Selectors] + +... +*/ + +var Element = function(tag, props){ + var konstructor = Element.Constructors[tag]; + if (konstructor) return konstructor(props); + if (typeof tag != 'string') return document.id(tag).set(props); + + if (!props) props = {}; + + if (!tag.test(/^[\w-]+$/)){ + var parsed = Slick.parse(tag).expressions[0][0]; + tag = (parsed.tag == '*') ? 'div' : parsed.tag; + if (parsed.id && props.id == null) props.id = parsed.id; + + var attributes = parsed.attributes; + if (attributes) for (var i = 0, l = attributes.length; i < l; i++){ + var attr = attributes[i]; + if (attr.value != null && attr.operator == '=' && props[attr.key] == null) + props[attr.key] = attr.value; + } + + if (parsed.classList && props['class'] == null) props['class'] = parsed.classList.join(' '); + } + + return document.newElement(tag, props); +}; + +if (Browser.Element) Element.prototype = Browser.Element.prototype; + +new Type('Element', Element).mirror(function(name){ + if (Array.prototype[name]) return; + + var obj = {}; + obj[name] = function(){ + var results = [], args = arguments, elements = true; + for (var i = 0, l = this.length; i < l; i++){ + var element = this[i], result = results[i] = element[name].apply(element, args); + elements = (elements && typeOf(result) == 'element'); + } + return (elements) ? new Elements(results) : results; + }; + + Elements.implement(obj); +}); + +if (!Browser.Element){ + Element.parent = Object; + + Element.Prototype = {'$family': Function.from('element').hide()}; + + Element.mirror(function(name, method){ + Element.Prototype[name] = method; + }); +} + +Element.Constructors = {}; + +//<1.2compat> + +Element.Constructors = new Hash; + +// + +var IFrame = new Type('IFrame', function(){ + var params = Array.link(arguments, { + properties: Type.isObject, + iframe: function(obj){ + return (obj != null); + } + }); + + var props = params.properties || {}, iframe; + if (params.iframe) iframe = document.id(params.iframe); + var onload = props.onload || function(){}; + delete props.onload; + props.id = props.name = [props.id, props.name, iframe ? (iframe.id || iframe.name) : 'IFrame_' + String.uniqueID()].pick(); + iframe = new Element(iframe || 'iframe', props); + + var onLoad = function(){ + onload.call(iframe.contentWindow); + }; + + if (window.frames[props.id]) onLoad(); + else iframe.addListener('load', onLoad); + return iframe; +}); + +var Elements = this.Elements = function(nodes){ + if (nodes && nodes.length){ + var uniques = {}, node; + for (var i = 0; node = nodes[i++];){ + var uid = Slick.uidOf(node); + if (!uniques[uid]){ + uniques[uid] = true; + this.push(node); + } + } + } +}; + +Elements.prototype = {length: 0}; +Elements.parent = Array; + +new Type('Elements', Elements).implement({ + + filter: function(filter, bind){ + if (!filter) return this; + return new Elements(Array.filter(this, (typeOf(filter) == 'string') ? function(item){ + return item.match(filter); + } : filter, bind)); + }.protect(), + + push: function(){ + var length = this.length; + for (var i = 0, l = arguments.length; i < l; i++){ + var item = document.id(arguments[i]); + if (item) this[length++] = item; + } + return (this.length = length); + }.protect(), + + concat: function(){ + var newElements = new Elements(this); + for (var i = 0, l = arguments.length; i < l; i++){ + var item = arguments[i]; + if (Type.isEnumerable(item)) newElements.append(item); + else newElements.push(item); + } + return newElements; + }.protect(), + + append: function(collection){ + for (var i = 0, l = collection.length; i < l; i++) this.push(collection[i]); + return this; + }.protect(), + + empty: function(){ + while (this.length) delete this[--this.length]; + return this; + }.protect() + +}); + +(function(){ + +// FF, IE +var splice = Array.prototype.splice, object = {'0': 0, '1': 1, length: 2}; + +splice.call(object, 1, 1); +if (object[1] == 1) Elements.implement('splice', function(){ + var length = this.length; + splice.apply(this, arguments); + while (length >= this.length) delete this[length--]; + return this; +}.protect()); + +Elements.implement(Array.prototype); + +Array.mirror(Elements); + +/**/ +var createElementAcceptsHTML; +try { + var x = document.createElement(''); + createElementAcceptsHTML = (x.name == 'x'); +} catch(e){} + +var escapeQuotes = function(html){ + return ('' + html).replace(/&/g, '&').replace(/"/g, '"'); +}; +/**/ + +Document.implement({ + + newElement: function(tag, props){ + if (props && props.checked != null) props.defaultChecked = props.checked; + /**/// Fix for readonly name and type properties in IE < 8 + if (createElementAcceptsHTML && props){ + tag = '<' + tag; + if (props.name) tag += ' name="' + escapeQuotes(props.name) + '"'; + if (props.type) tag += ' type="' + escapeQuotes(props.type) + '"'; + tag += '>'; + delete props.name; + delete props.type; + } + /**/ + return this.id(this.createElement(tag)).set(props); + } + +}); + +})(); + +Document.implement({ + + newTextNode: function(text){ + return this.createTextNode(text); + }, + + getDocument: function(){ + return this; + }, + + getWindow: function(){ + return this.window; + }, + + id: (function(){ + + var types = { + + string: function(id, nocash, doc){ + id = Slick.find(doc, '#' + id.replace(/(\W)/g, '\\$1')); + return (id) ? types.element(id, nocash) : null; + }, + + element: function(el, nocash){ + $uid(el); + if (!nocash && !el.$family && !(/^object|embed$/i).test(el.tagName)){ + Object.append(el, Element.Prototype); + } + return el; + }, + + object: function(obj, nocash, doc){ + if (obj.toElement) return types.element(obj.toElement(doc), nocash); + return null; + } + + }; + + types.textnode = types.whitespace = types.window = types.document = function(zero){ + return zero; + }; + + return function(el, nocash, doc){ + if (el && el.$family && el.uid) return el; + var type = typeOf(el); + return (types[type]) ? types[type](el, nocash, doc || document) : null; + }; + + })() + +}); + +if (window.$ == null) Window.implement('$', function(el, nc){ + return document.id(el, nc, this.document); +}); + +Window.implement({ + + getDocument: function(){ + return this.document; + }, + + getWindow: function(){ + return this; + } + +}); + +[Document, Element].invoke('implement', { + + getElements: function(expression){ + return Slick.search(this, expression, new Elements); + }, + + getElement: function(expression){ + return document.id(Slick.find(this, expression)); + } + +}); + +//<1.2compat> + +(function(search, find, match){ + + this.Selectors = {}; + var pseudos = this.Selectors.Pseudo = new Hash(); + + var addSlickPseudos = function(){ + for (var name in pseudos) if (pseudos.hasOwnProperty(name)){ + Slick.definePseudo(name, pseudos[name]); + delete pseudos[name]; + } + }; + + Slick.search = function(context, expression, append){ + addSlickPseudos(); + return search.call(this, context, expression, append); + }; + + Slick.find = function(context, expression){ + addSlickPseudos(); + return find.call(this, context, expression); + }; + + Slick.match = function(node, selector){ + addSlickPseudos(); + return match.call(this, node, selector); + }; + +})(Slick.search, Slick.find, Slick.match); + +if (window.$$ == null) Window.implement('$$', function(selector){ + var elements = new Elements; + if (arguments.length == 1 && typeof selector == 'string') return Slick.search(this.document, selector, elements); + var args = Array.flatten(arguments); + for (var i = 0, l = args.length; i < l; i++){ + var item = args[i]; + switch (typeOf(item)){ + case 'element': elements.push(item); break; + case 'string': Slick.search(this.document, item, elements); + } + } + return elements; +}); + +// + +if (window.$$ == null) Window.implement('$$', function(selector){ + if (arguments.length == 1){ + if (typeof selector == 'string') return Slick.search(this.document, selector, new Elements); + else if (Type.isEnumerable(selector)) return new Elements(selector); + } + return new Elements(arguments); +}); + +(function(){ + +var collected = {}, storage = {}; +var props = {input: 'checked', option: 'selected', textarea: 'value'}; + +var get = function(uid){ + return (storage[uid] || (storage[uid] = {})); +}; + +var clean = function(item){ + if (item.removeEvents) item.removeEvents(); + if (item.clearAttributes) item.clearAttributes(); + var uid = item.uid; + if (uid != null){ + delete collected[uid]; + delete storage[uid]; + } + return item; +}; + +var camels = ['defaultValue', 'accessKey', 'cellPadding', 'cellSpacing', 'colSpan', 'frameBorder', 'maxLength', 'readOnly', + 'rowSpan', 'tabIndex', 'useMap' +]; +var bools = ['compact', 'nowrap', 'ismap', 'declare', 'noshade', 'checked', 'disabled', 'readOnly', 'multiple', 'selected', + 'noresize', 'defer' +]; + var attributes = { + 'html': 'innerHTML', + 'class': 'className', + 'for': 'htmlFor', + 'text': (function(){ + var temp = document.createElement('div'); + return (temp.innerText == null) ? 'textContent' : 'innerText'; + })() +}; +var readOnly = ['type']; +var expandos = ['value', 'defaultValue']; +var uriAttrs = /^(?:href|src|usemap)$/i; + +bools = bools.associate(bools); +camels = camels.associate(camels.map(String.toLowerCase)); +readOnly = readOnly.associate(readOnly); + +Object.append(attributes, expandos.associate(expandos)); + +var inserters = { + + before: function(context, element){ + var parent = element.parentNode; + if (parent) parent.insertBefore(context, element); + }, + + after: function(context, element){ + var parent = element.parentNode; + if (parent) parent.insertBefore(context, element.nextSibling); + }, + + bottom: function(context, element){ + element.appendChild(context); + }, + + top: function(context, element){ + element.insertBefore(context, element.firstChild); + } + +}; + +inserters.inside = inserters.bottom; + +//<1.2compat> + +Object.each(inserters, function(inserter, where){ + + where = where.capitalize(); + + var methods = {}; + + methods['inject' + where] = function(el){ + inserter(this, document.id(el, true)); + return this; + }; + + methods['grab' + where] = function(el){ + inserter(document.id(el, true), this); + return this; + }; + + Element.implement(methods); + +}); + +// + +var injectCombinator = function(expression, combinator){ + if (!expression) return combinator; + + expression = Slick.parse(expression); + + var expressions = expression.expressions; + for (var i = expressions.length; i--;) + expressions[i][0].combinator = combinator; + + return expression; +}; + +Element.implement({ + + set: function(prop, value){ + var property = Element.Properties[prop]; + (property && property.set) ? property.set.call(this, value) : this.setProperty(prop, value); + }.overloadSetter(), + + get: function(prop){ + var property = Element.Properties[prop]; + return (property && property.get) ? property.get.apply(this) : this.getProperty(prop); + }.overloadGetter(), + + erase: function(prop){ + var property = Element.Properties[prop]; + (property && property.erase) ? property.erase.apply(this) : this.removeProperty(prop); + return this; + }, + + setProperty: function(attribute, value){ + attribute = camels[attribute] || attribute; + if (value == null) return this.removeProperty(attribute); + var key = attributes[attribute]; + (key) ? this[key] = value : + (bools[attribute]) ? this[attribute] = !!value : this.setAttribute(attribute, '' + value); + return this; + }, + + setProperties: function(attributes){ + for (var attribute in attributes) this.setProperty(attribute, attributes[attribute]); + return this; + }, + + getProperty: function(attribute){ + attribute = camels[attribute] || attribute; + var key = attributes[attribute] || readOnly[attribute]; + return (key) ? this[key] : + (bools[attribute]) ? !!this[attribute] : + (uriAttrs.test(attribute) ? this.getAttribute(attribute, 2) : + (key = this.getAttributeNode(attribute)) ? key.nodeValue : null) || null; + }, + + getProperties: function(){ + var args = Array.from(arguments); + return args.map(this.getProperty, this).associate(args); + }, + + removeProperty: function(attribute){ + attribute = camels[attribute] || attribute; + var key = attributes[attribute]; + (key) ? this[key] = '' : + (bools[attribute]) ? this[attribute] = false : this.removeAttribute(attribute); + return this; + }, + + removeProperties: function(){ + Array.each(arguments, this.removeProperty, this); + return this; + }, + + hasClass: function(className){ + return this.className.clean().contains(className, ' '); + }, + + addClass: function(className){ + if (!this.hasClass(className)) this.className = (this.className + ' ' + className).clean(); + return this; + }, + + removeClass: function(className){ + this.className = this.className.replace(new RegExp('(^|\\s)' + className + '(?:\\s|$)'), '$1'); + return this; + }, + + toggleClass: function(className, force){ + if (force == null) force = !this.hasClass(className); + return (force) ? this.addClass(className) : this.removeClass(className); + }, + + adopt: function(){ + var parent = this, fragment, elements = Array.flatten(arguments), length = elements.length; + if (length > 1) parent = fragment = document.createDocumentFragment(); + + for (var i = 0; i < length; i++){ + var element = document.id(elements[i], true); + if (element) parent.appendChild(element); + } + + if (fragment) this.appendChild(fragment); + + return this; + }, + + appendText: function(text, where){ + return this.grab(this.getDocument().newTextNode(text), where); + }, + + grab: function(el, where){ + inserters[where || 'bottom'](document.id(el, true), this); + return this; + }, + + inject: function(el, where){ + inserters[where || 'bottom'](this, document.id(el, true)); + return this; + }, + + replaces: function(el){ + el = document.id(el, true); + el.parentNode.replaceChild(this, el); + return this; + }, + + wraps: function(el, where){ + el = document.id(el, true); + return this.replaces(el).grab(el, where); + }, + + getPrevious: function(expression){ + return document.id(Slick.find(this, injectCombinator(expression, '!~'))); + }, + + getAllPrevious: function(expression){ + return Slick.search(this, injectCombinator(expression, '!~'), new Elements); + }, + + getNext: function(expression){ + return document.id(Slick.find(this, injectCombinator(expression, '~'))); + }, + + getAllNext: function(expression){ + return Slick.search(this, injectCombinator(expression, '~'), new Elements); + }, + + getFirst: function(expression){ + return document.id(Slick.search(this, injectCombinator(expression, '>'))[0]); + }, + + getLast: function(expression){ + return document.id(Slick.search(this, injectCombinator(expression, '>')).getLast()); + }, + + getParent: function(expression){ + return document.id(Slick.find(this, injectCombinator(expression, '!'))); + }, + + getParents: function(expression){ + return Slick.search(this, injectCombinator(expression, '!'), new Elements); + }, + + getSiblings: function(expression){ + return Slick.search(this, injectCombinator(expression, '~~'), new Elements); + }, + + getChildren: function(expression){ + return Slick.search(this, injectCombinator(expression, '>'), new Elements); + }, + + getWindow: function(){ + return this.ownerDocument.window; + }, + + getDocument: function(){ + return this.ownerDocument; + }, + + getElementById: function(id){ + return document.id(Slick.find(this, '#' + ('' + id).replace(/(\W)/g, '\\$1'))); + }, + + getSelected: function(){ + this.selectedIndex; // Safari 3.2.1 + return new Elements(Array.from(this.options).filter(function(option){ + return option.selected; + })); + }, + + toQueryString: function(){ + var queryString = []; + this.getElements('input, select, textarea').each(function(el){ + var type = el.type; + if (!el.name || el.disabled || type == 'submit' || type == 'reset' || type == 'file' || type == 'image') return; + + var value = (el.get('tag') == 'select') ? el.getSelected().map(function(opt){ + // IE + return document.id(opt).get('value'); + }) : ((type == 'radio' || type == 'checkbox') && !el.checked) ? null : el.get('value'); + + Array.from(value).each(function(val){ + if (typeof val != 'undefined') queryString.push(encodeURIComponent(el.name) + '=' + encodeURIComponent(val)); + }); + }); + return queryString.join('&'); + }, + + clone: function(contents, keepid){ + contents = contents !== false; + var clone = this.cloneNode(contents); + var clean = function(node, element){ + if (!keepid) node.removeAttribute('id'); + if (Browser.ie){ + node.clearAttributes(); + node.mergeAttributes(element); + node.removeAttribute('uid'); + if (node.options){ + var no = node.options, eo = element.options; + for (var j = no.length; j--;) no[j].selected = eo[j].selected; + } + } + var prop = props[element.tagName.toLowerCase()]; + if (prop && element[prop]) node[prop] = element[prop]; + }; + + var i; + if (contents){ + var ce = clone.getElementsByTagName('*'), te = this.getElementsByTagName('*'); + for (i = ce.length; i--;) clean(ce[i], te[i]); + } + + clean(clone, this); + if (Browser.ie){ + var ts = this.getElementsByTagName('object'), + cs = clone.getElementsByTagName('object'), + tl = ts.length, cl = cs.length; + for (i = 0; i < tl && i < cl; i++) + cs[i].outerHTML = ts[i].outerHTML; + } + return document.id(clone); + }, + + destroy: function(){ + var children = clean(this).getElementsByTagName('*'); + Array.each(children, clean); + Element.dispose(this); + return null; + }, + + empty: function(){ + Array.from(this.childNodes).each(Element.dispose); + return this; + }, + + dispose: function(){ + return (this.parentNode) ? this.parentNode.removeChild(this) : this; + }, + + match: function(expression){ + return !expression || Slick.match(this, expression); + } + +}); + +var contains = {contains: function(element){ + return Slick.contains(this, element); +}}; + +if (!document.contains) Document.implement(contains); +if (!document.createElement('div').contains) Element.implement(contains); + +//<1.2compat> + +Element.implement('hasChild', function(element){ + return this !== element && this.contains(element); +}); + +// + +[Element, Window, Document].invoke('implement', { + + addListener: function(type, fn){ + if (type == 'unload'){ + var old = fn, self = this; + fn = function(){ + self.removeListener('unload', fn); + old(); + }; + } else { + collected[this.uid] = this; + } + if (this.addEventListener) this.addEventListener(type, fn, false); + else this.attachEvent('on' + type, fn); + return this; + }, + + removeListener: function(type, fn){ + if (this.removeEventListener) this.removeEventListener(type, fn, false); + else this.detachEvent('on' + type, fn); + return this; + }, + + retrieve: function(property, dflt){ + var storage = get(this.uid), prop = storage[property]; + if (dflt != null && prop == null) prop = storage[property] = dflt; + return prop != null ? prop : null; + }, + + store: function(property, value){ + var storage = get(this.uid); + storage[property] = value; + return this; + }, + + eliminate: function(property){ + var storage = get(this.uid); + delete storage[property]; + return this; + } + +}); + +// IE purge +if (window.attachEvent && !window.addEventListener) window.addListener('unload', function(){ + Object.each(collected, clean); + if (window.CollectGarbage) CollectGarbage(); +}); + +})(); + +Element.Properties = {}; + +//<1.2compat> + +Element.Properties = new Hash; + +// + +Element.Properties.style = { + + set: function(style){ + this.style.cssText = style; + }, + + get: function(){ + return this.style.cssText; + }, + + erase: function(){ + this.style.cssText = ''; + } + +}; + +Element.Properties.tag = { + + get: function(){ + return this.tagName.toLowerCase(); + } + +}; + +(function(maxLength){ + if (maxLength != null) Element.Properties.maxlength = Element.Properties.maxLength = { + get: function(){ + var maxlength = this.getAttribute('maxLength'); + return maxlength == maxLength ? null : maxlength; + } + }; +})(document.createElement('input').getAttribute('maxLength')); + +Element.Properties.html = (function(){ + + var tableTest = Function.attempt(function(){ + var table = document.createElement('table'); + table.innerHTML = ''; + }); + + var wrapper = document.createElement('div'); + + var translations = { + table: [1, '', '
    '], + select: [1, ''], + tbody: [2, '', '
    '], + tr: [3, '', '
    '] + }; + translations.thead = translations.tfoot = translations.tbody; + + var html = { + set: function(){ + var html = Array.flatten(arguments).join(''); + var wrap = (!tableTest && translations[this.get('tag')]); + if (wrap){ + var first = wrapper; + first.innerHTML = wrap[1] + html + wrap[2]; + for (var i = wrap[0]; i--;) first = first.firstChild; + this.empty().adopt(first.childNodes); + } else { + this.innerHTML = html; + } + } + }; + + html.erase = html.set; + + return html; +})(); + + +/* +--- + +name: Element.Style + +description: Contains methods for interacting with the styles of Elements in a fashionable way. + +license: MIT-style license. + +requires: Element + +provides: Element.Style + +... +*/ + +(function(){ + +var html = document.html; + +Element.Properties.styles = {set: function(styles){ + this.setStyles(styles); +}}; + +var hasOpacity = (html.style.opacity != null); +var reAlpha = /alpha\(opacity=([\d.]+)\)/i; + +var setOpacity = function(element, opacity){ + if (!element.currentStyle || !element.currentStyle.hasLayout) element.style.zoom = 1; + if (hasOpacity){ + element.style.opacity = opacity; + } else { + opacity = (opacity == 1) ? '' : 'alpha(opacity=' + opacity * 100 + ')'; + var filter = element.style.filter || element.getComputedStyle('filter') || ''; + element.style.filter = filter.test(reAlpha) ? filter.replace(reAlpha, opacity) : filter + opacity; + } +}; + +Element.Properties.opacity = { + + set: function(opacity){ + var visibility = this.style.visibility; + if (opacity == 0 && visibility != 'hidden') this.style.visibility = 'hidden'; + else if (opacity != 0 && visibility != 'visible') this.style.visibility = 'visible'; + + setOpacity(this, opacity); + }, + + get: (hasOpacity) ? function(){ + var opacity = this.style.opacity || this.getComputedStyle('opacity'); + return (opacity == '') ? 1 : opacity; + } : function(){ + var opacity, filter = (this.style.filter || this.getComputedStyle('filter')); + if (filter) opacity = filter.match(reAlpha); + return (opacity == null || filter == null) ? 1 : (opacity[1] / 100); + } + +}; + +var floatName = (html.style.cssFloat == null) ? 'styleFloat' : 'cssFloat'; + +Element.implement({ + + getComputedStyle: function(property){ + if (this.currentStyle) return this.currentStyle[property.camelCase()]; + var defaultView = Element.getDocument(this).defaultView, + computed = defaultView ? defaultView.getComputedStyle(this, null) : null; + return (computed) ? computed.getPropertyValue((property == floatName) ? 'float' : property.hyphenate()) : null; + }, + + setOpacity: function(value){ + setOpacity(this, value); + return this; + }, + + getOpacity: function(){ + return this.get('opacity'); + }, + + setStyle: function(property, value){ + switch (property){ + case 'opacity': return this.set('opacity', parseFloat(value)); + case 'float': property = floatName; + } + property = property.camelCase(); + if (typeOf(value) != 'string'){ + var map = (Element.Styles[property] || '@').split(' '); + value = Array.from(value).map(function(val, i){ + if (!map[i]) return ''; + return (typeOf(val) == 'number') ? map[i].replace('@', Math.round(val)) : val; + }).join(' '); + } else if (value == String(Number(value))){ + value = Math.round(value); + } + this.style[property] = value; + return this; + }, + + getStyle: function(property){ + switch (property){ + case 'opacity': return this.get('opacity'); + case 'float': property = floatName; + } + property = property.camelCase(); + var result = this.style[property]; + if (!result || property == 'zIndex'){ + result = []; + for (var style in Element.ShortStyles){ + if (property != style) continue; + for (var s in Element.ShortStyles[style]) result.push(this.getStyle(s)); + return result.join(' '); + } + result = this.getComputedStyle(property); + } + if (result){ + result = String(result); + var color = result.match(/rgba?\([\d\s,]+\)/); + if (color) result = result.replace(color[0], color[0].rgbToHex()); + } + if (Browser.opera || (Browser.ie && isNaN(parseFloat(result)))){ + if (property.test(/^(height|width)$/)){ + var values = (property == 'width') ? ['left', 'right'] : ['top', 'bottom'], size = 0; + values.each(function(value){ + size += this.getStyle('border-' + value + '-width').toInt() + this.getStyle('padding-' + value).toInt(); + }, this); + return this['offset' + property.capitalize()] - size + 'px'; + } + if (Browser.opera && String(result).indexOf('px') != -1) return result; + if (property.test(/(border(.+)Width|margin|padding)/)) return '0px'; + } + return result; + }, + + setStyles: function(styles){ + for (var style in styles) this.setStyle(style, styles[style]); + return this; + }, + + getStyles: function(){ + var result = {}; + Array.flatten(arguments).each(function(key){ + result[key] = this.getStyle(key); + }, this); + return result; + } + +}); + +Element.Styles = { + left: '@px', top: '@px', bottom: '@px', right: '@px', + width: '@px', height: '@px', maxWidth: '@px', maxHeight: '@px', minWidth: '@px', minHeight: '@px', + backgroundColor: 'rgb(@, @, @)', backgroundPosition: '@px @px', color: 'rgb(@, @, @)', + fontSize: '@px', letterSpacing: '@px', lineHeight: '@px', clip: 'rect(@px @px @px @px)', + margin: '@px @px @px @px', padding: '@px @px @px @px', border: '@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)', + borderWidth: '@px @px @px @px', borderStyle: '@ @ @ @', borderColor: 'rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)', + zIndex: '@', 'zoom': '@', fontWeight: '@', textIndent: '@px', opacity: '@' +}; + +//<1.2compat> + +Element.Styles = new Hash(Element.Styles); + +// + +Element.ShortStyles = {margin: {}, padding: {}, border: {}, borderWidth: {}, borderStyle: {}, borderColor: {}}; + +['Top', 'Right', 'Bottom', 'Left'].each(function(direction){ + var Short = Element.ShortStyles; + var All = Element.Styles; + ['margin', 'padding'].each(function(style){ + var sd = style + direction; + Short[style][sd] = All[sd] = '@px'; + }); + var bd = 'border' + direction; + Short.border[bd] = All[bd] = '@px @ rgb(@, @, @)'; + var bdw = bd + 'Width', bds = bd + 'Style', bdc = bd + 'Color'; + Short[bd] = {}; + Short.borderWidth[bdw] = Short[bd][bdw] = All[bdw] = '@px'; + Short.borderStyle[bds] = Short[bd][bds] = All[bds] = '@'; + Short.borderColor[bdc] = Short[bd][bdc] = All[bdc] = 'rgb(@, @, @)'; +}); + +})(); + + +/* +--- + +name: Element.Event + +description: Contains Element methods for dealing with events. This file also includes mouseenter and mouseleave custom Element Events. + +license: MIT-style license. + +requires: [Element, Event] + +provides: Element.Event + +... +*/ + +(function(){ + +Element.Properties.events = {set: function(events){ + this.addEvents(events); +}}; + +[Element, Window, Document].invoke('implement', { + + addEvent: function(type, fn){ + var events = this.retrieve('events', {}); + if (!events[type]) events[type] = {keys: [], values: []}; + if (events[type].keys.contains(fn)) return this; + events[type].keys.push(fn); + var realType = type, + custom = Element.Events[type], + condition = fn, + self = this; + if (custom){ + if (custom.onAdd) custom.onAdd.call(this, fn); + if (custom.condition){ + condition = function(event){ + if (custom.condition.call(this, event)) return fn.call(this, event); + return true; + }; + } + realType = custom.base || realType; + } + var defn = function(){ + return fn.call(self); + }; + var nativeEvent = Element.NativeEvents[realType]; + if (nativeEvent){ + if (nativeEvent == 2){ + defn = function(event){ + event = new Event(event, self.getWindow()); + if (condition.call(self, event) === false) event.stop(); + }; + } + this.addListener(realType, defn); + } + events[type].values.push(defn); + return this; + }, + + removeEvent: function(type, fn){ + var events = this.retrieve('events'); + if (!events || !events[type]) return this; + var list = events[type]; + var index = list.keys.indexOf(fn); + if (index == -1) return this; + var value = list.values[index]; + delete list.keys[index]; + delete list.values[index]; + var custom = Element.Events[type]; + if (custom){ + if (custom.onRemove) custom.onRemove.call(this, fn); + type = custom.base || type; + } + return (Element.NativeEvents[type]) ? this.removeListener(type, value) : this; + }, + + addEvents: function(events){ + for (var event in events) this.addEvent(event, events[event]); + return this; + }, + + removeEvents: function(events){ + var type; + if (typeOf(events) == 'object'){ + for (type in events) this.removeEvent(type, events[type]); + return this; + } + var attached = this.retrieve('events'); + if (!attached) return this; + if (!events){ + for (type in attached) this.removeEvents(type); + this.eliminate('events'); + } else if (attached[events]){ + attached[events].keys.each(function(fn){ + this.removeEvent(events, fn); + }, this); + delete attached[events]; + } + return this; + }, + + fireEvent: function(type, args, delay){ + var events = this.retrieve('events'); + if (!events || !events[type]) return this; + args = Array.from(args); + + events[type].keys.each(function(fn){ + if (delay) fn.delay(delay, this, args); + else fn.apply(this, args); + }, this); + return this; + }, + + cloneEvents: function(from, type){ + from = document.id(from); + var events = from.retrieve('events'); + if (!events) return this; + if (!type){ + for (var eventType in events) this.cloneEvents(from, eventType); + } else if (events[type]){ + events[type].keys.each(function(fn){ + this.addEvent(type, fn); + }, this); + } + return this; + } + +}); + +// IE9 +try { + if (typeof HTMLElement != 'undefined') + HTMLElement.prototype.fireEvent = Element.prototype.fireEvent; +} catch(e){} + +Element.NativeEvents = { + click: 2, dblclick: 2, mouseup: 2, mousedown: 2, contextmenu: 2, //mouse buttons + mousewheel: 2, DOMMouseScroll: 2, //mouse wheel + mouseover: 2, mouseout: 2, mousemove: 2, selectstart: 2, selectend: 2, //mouse movement + keydown: 2, keypress: 2, keyup: 2, //keyboard + orientationchange: 2, // mobile + touchstart: 2, touchmove: 2, touchend: 2, touchcancel: 2, // touch + gesturestart: 2, gesturechange: 2, gestureend: 2, // gesture + focus: 2, blur: 2, change: 2, reset: 2, select: 2, submit: 2, //form elements + load: 2, unload: 1, beforeunload: 2, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window + error: 1, abort: 1, scroll: 1 //misc +}; + +var check = function(event){ + var related = event.relatedTarget; + if (related == null) return true; + if (!related) return false; + return (related != this && related.prefix != 'xul' && typeOf(this) != 'document' && !this.contains(related)); +}; + +Element.Events = { + + mouseenter: { + base: 'mouseover', + condition: check + }, + + mouseleave: { + base: 'mouseout', + condition: check + }, + + mousewheel: { + base: (Browser.firefox) ? 'DOMMouseScroll' : 'mousewheel' + } + +}; + +//<1.2compat> + +Element.Events = new Hash(Element.Events); + +// + +})(); + + +/* +--- + +name: Element.Dimensions + +description: Contains methods to work with size, scroll, or positioning of Elements and the window object. + +license: MIT-style license. + +credits: + - Element positioning based on the [qooxdoo](http://qooxdoo.org/) code and smart browser fixes, [LGPL License](http://www.gnu.org/licenses/lgpl.html). + - Viewport dimensions based on [YUI](http://developer.yahoo.com/yui/) code, [BSD License](http://developer.yahoo.com/yui/license.html). + +requires: [Element, Element.Style] + +provides: [Element.Dimensions] + +... +*/ + +(function(){ + +Element.implement({ + + scrollTo: function(x, y){ + if (isBody(this)){ + this.getWindow().scrollTo(x, y); + } else { + this.scrollLeft = x; + this.scrollTop = y; + } + return this; + }, + + getSize: function(){ + if (isBody(this)) return this.getWindow().getSize(); + return {x: this.offsetWidth, y: this.offsetHeight}; + }, + + getScrollSize: function(){ + if (isBody(this)) return this.getWindow().getScrollSize(); + return {x: this.scrollWidth, y: this.scrollHeight}; + }, + + getScroll: function(){ + if (isBody(this)) return this.getWindow().getScroll(); + return {x: this.scrollLeft, y: this.scrollTop}; + }, + + getScrolls: function(){ + var element = this.parentNode, position = {x: 0, y: 0}; + while (element && !isBody(element)){ + position.x += element.scrollLeft; + position.y += element.scrollTop; + element = element.parentNode; + } + return position; + }, + + getOffsetParent: function(){ + var element = this; + if (isBody(element)) return null; + if (!Browser.ie) return element.offsetParent; + while ((element = element.parentNode)){ + if (styleString(element, 'position') != 'static' || isBody(element)) return element; + } + return null; + }, + + getOffsets: function(){ + if (this.getBoundingClientRect && !Browser.Platform.ios){ + var bound = this.getBoundingClientRect(), + html = document.id(this.getDocument().documentElement), + htmlScroll = html.getScroll(), + elemScrolls = this.getScrolls(), + isFixed = (styleString(this, 'position') == 'fixed'); + + return { + x: bound.left.toInt() + elemScrolls.x + ((isFixed) ? 0 : htmlScroll.x) - html.clientLeft, + y: bound.top.toInt() + elemScrolls.y + ((isFixed) ? 0 : htmlScroll.y) - html.clientTop + }; + } + + var element = this, position = {x: 0, y: 0}; + if (isBody(this)) return position; + + while (element && !isBody(element)){ + position.x += element.offsetLeft; + position.y += element.offsetTop; + + if (Browser.firefox){ + if (!borderBox(element)){ + position.x += leftBorder(element); + position.y += topBorder(element); + } + var parent = element.parentNode; + if (parent && styleString(parent, 'overflow') != 'visible'){ + position.x += leftBorder(parent); + position.y += topBorder(parent); + } + } else if (element != this && Browser.safari){ + position.x += leftBorder(element); + position.y += topBorder(element); + } + + element = element.offsetParent; + } + if (Browser.firefox && !borderBox(this)){ + position.x -= leftBorder(this); + position.y -= topBorder(this); + } + return position; + }, + + getPosition: function(relative){ + if (isBody(this)) return {x: 0, y: 0}; + var offset = this.getOffsets(), + scroll = this.getScrolls(); + var position = { + x: offset.x - scroll.x, + y: offset.y - scroll.y + }; + + if (relative && (relative = document.id(relative))){ + var relativePosition = relative.getPosition(); + return {x: position.x - relativePosition.x - leftBorder(relative), y: position.y - relativePosition.y - topBorder(relative)}; + } + return position; + }, + + getCoordinates: function(element){ + if (isBody(this)) return this.getWindow().getCoordinates(); + var position = this.getPosition(element), + size = this.getSize(); + var obj = { + left: position.x, + top: position.y, + width: size.x, + height: size.y + }; + obj.right = obj.left + obj.width; + obj.bottom = obj.top + obj.height; + return obj; + }, + + computePosition: function(obj){ + return { + left: obj.x - styleNumber(this, 'margin-left'), + top: obj.y - styleNumber(this, 'margin-top') + }; + }, + + setPosition: function(obj){ + return this.setStyles(this.computePosition(obj)); + } + +}); + + +[Document, Window].invoke('implement', { + + getSize: function(){ + var doc = getCompatElement(this); + return {x: doc.clientWidth, y: doc.clientHeight}; + }, + + getScroll: function(){ + var win = this.getWindow(), doc = getCompatElement(this); + return {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop}; + }, + + getScrollSize: function(){ + var doc = getCompatElement(this), + min = this.getSize(), + body = this.getDocument().body; + + return {x: Math.max(doc.scrollWidth, body.scrollWidth, min.x), y: Math.max(doc.scrollHeight, body.scrollHeight, min.y)}; + }, + + getPosition: function(){ + return {x: 0, y: 0}; + }, + + getCoordinates: function(){ + var size = this.getSize(); + return {top: 0, left: 0, bottom: size.y, right: size.x, height: size.y, width: size.x}; + } + +}); + +// private methods + +var styleString = Element.getComputedStyle; + +function styleNumber(element, style){ + return styleString(element, style).toInt() || 0; +}; + +function borderBox(element){ + return styleString(element, '-moz-box-sizing') == 'border-box'; +}; + +function topBorder(element){ + return styleNumber(element, 'border-top-width'); +}; + +function leftBorder(element){ + return styleNumber(element, 'border-left-width'); +}; + +function isBody(element){ + return (/^(?:body|html)$/i).test(element.tagName); +}; + +function getCompatElement(element){ + var doc = element.getDocument(); + return (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body; +}; + +})(); + +//aliases +Element.alias({position: 'setPosition'}); //compatability + +[Window, Document, Element].invoke('implement', { + + getHeight: function(){ + return this.getSize().y; + }, + + getWidth: function(){ + return this.getSize().x; + }, + + getScrollTop: function(){ + return this.getScroll().y; + }, + + getScrollLeft: function(){ + return this.getScroll().x; + }, + + getScrollHeight: function(){ + return this.getScrollSize().y; + }, + + getScrollWidth: function(){ + return this.getScrollSize().x; + }, + + getTop: function(){ + return this.getPosition().y; + }, + + getLeft: function(){ + return this.getPosition().x; + } + +}); + + +/* +--- + +name: Fx + +description: Contains the basic animation logic to be extended by all other Fx Classes. + +license: MIT-style license. + +requires: [Chain, Events, Options] + +provides: Fx + +... +*/ + +(function(){ + +var Fx = this.Fx = new Class({ + + Implements: [Chain, Events, Options], + + options: { + /* + onStart: nil, + onCancel: nil, + onComplete: nil, + */ + fps: 50, + unit: false, + duration: 500, + link: 'ignore' + }, + + initialize: function(options){ + this.subject = this.subject || this; + this.setOptions(options); + }, + + getTransition: function(){ + return function(p){ + return -(Math.cos(Math.PI * p) - 1) / 2; + }; + }, + + step: function(){ + var time = Date.now(); + if (time < this.time + this.options.duration){ + var delta = this.transition((time - this.time) / this.options.duration); + this.set(this.compute(this.from, this.to, delta)); + } else { + this.set(this.compute(this.from, this.to, 1)); + this.complete(); + } + }, + + set: function(now){ + return now; + }, + + compute: function(from, to, delta){ + return Fx.compute(from, to, delta); + }, + + check: function(){ + if (!this.timer) return true; + switch (this.options.link){ + case 'cancel': this.cancel(); return true; + case 'chain': this.chain(this.caller.pass(arguments, this)); return false; + } + return false; + }, + + start: function(from, to){ + if (!this.check(from, to)) return this; + var duration = this.options.duration; + this.options.duration = Fx.Durations[duration] || duration.toInt(); + this.from = from; + this.to = to; + this.time = 0; + this.transition = this.getTransition(); + this.startTimer(); + this.onStart(); + return this; + }, + + complete: function(){ + if (this.stopTimer()) this.onComplete(); + return this; + }, + + cancel: function(){ + if (this.stopTimer()) this.onCancel(); + return this; + }, + + onStart: function(){ + this.fireEvent('start', this.subject); + }, + + onComplete: function(){ + this.fireEvent('complete', this.subject); + if (!this.callChain()) this.fireEvent('chainComplete', this.subject); + }, + + onCancel: function(){ + this.fireEvent('cancel', this.subject).clearChain(); + }, + + pause: function(){ + this.stopTimer(); + return this; + }, + + resume: function(){ + this.startTimer(); + return this; + }, + + stopTimer: function(){ + if (!this.timer) return false; + this.time = Date.now() - this.time; + this.timer = removeInstance(this); + return true; + }, + + startTimer: function(){ + if (this.timer) return false; + this.time = Date.now() - this.time; + this.timer = addInstance(this); + return true; + } + +}); + +Fx.compute = function(from, to, delta){ + return (to - from) * delta + from; +}; + +Fx.Durations = {'short': 250, 'normal': 500, 'long': 1000}; + +// global timers + +var instances = {}, timers = {}; + +var loop = function(){ + for (var i = this.length; i--;){ + if (this[i]) this[i].step(); + } +}; + +var addInstance = function(instance){ + var fps = instance.options.fps, + list = instances[fps] || (instances[fps] = []); + list.push(instance); + if (!timers[fps]) timers[fps] = loop.periodical(Math.round(1000 / fps), list); + return true; +}; + +var removeInstance = function(instance){ + var fps = instance.options.fps, + list = instances[fps] || []; + list.erase(instance); + if (!list.length && timers[fps]) timers[fps] = clearInterval(timers[fps]); + return false; +}; + +})(); + + +/* +--- + +name: Fx.CSS + +description: Contains the CSS animation logic. Used by Fx.Tween, Fx.Morph, Fx.Elements. + +license: MIT-style license. + +requires: [Fx, Element.Style] + +provides: Fx.CSS + +... +*/ + +Fx.CSS = new Class({ + + Extends: Fx, + + //prepares the base from/to object + + prepare: function(element, property, values){ + values = Array.from(values); + if (values[1] == null){ + values[1] = values[0]; + values[0] = element.getStyle(property); + } + var parsed = values.map(this.parse); + return {from: parsed[0], to: parsed[1]}; + }, + + //parses a value into an array + + parse: function(value){ + value = Function.from(value)(); + value = (typeof value == 'string') ? value.split(' ') : Array.from(value); + return value.map(function(val){ + val = String(val); + var found = false; + Object.each(Fx.CSS.Parsers, function(parser, key){ + if (found) return; + var parsed = parser.parse(val); + if (parsed || parsed === 0) found = {value: parsed, parser: parser}; + }); + found = found || {value: val, parser: Fx.CSS.Parsers.String}; + return found; + }); + }, + + //computes by a from and to prepared objects, using their parsers. + + compute: function(from, to, delta){ + var computed = []; + (Math.min(from.length, to.length)).times(function(i){ + computed.push({value: from[i].parser.compute(from[i].value, to[i].value, delta), parser: from[i].parser}); + }); + computed.$family = Function.from('fx:css:value'); + return computed; + }, + + //serves the value as settable + + serve: function(value, unit){ + if (typeOf(value) != 'fx:css:value') value = this.parse(value); + var returned = []; + value.each(function(bit){ + returned = returned.concat(bit.parser.serve(bit.value, unit)); + }); + return returned; + }, + + //renders the change to an element + + render: function(element, property, value, unit){ + element.setStyle(property, this.serve(value, unit)); + }, + + //searches inside the page css to find the values for a selector + + search: function(selector){ + if (Fx.CSS.Cache[selector]) return Fx.CSS.Cache[selector]; + var to = {}; + Array.each(document.styleSheets, function(sheet, j){ + var href = sheet.href; + if (href && href.contains('://') && !href.contains(document.domain)) return; + var rules = sheet.rules || sheet.cssRules; + Array.each(rules, function(rule, i){ + if (!rule.style) return; + var selectorText = (rule.selectorText) ? rule.selectorText.replace(/^\w+/, function(m){ + return m.toLowerCase(); + }) : null; + if (!selectorText || !selectorText.test('^' + selector + '$')) return; + Element.Styles.each(function(value, style){ + if (!rule.style[style] || Element.ShortStyles[style]) return; + value = String(rule.style[style]); + to[style] = (value.test(/^rgb/)) ? value.rgbToHex() : value; + }); + }); + }); + return Fx.CSS.Cache[selector] = to; + } + +}); + +Fx.CSS.Cache = {}; + +Fx.CSS.Parsers = { + + Color: { + parse: function(value){ + if (value.match(/^#[0-9a-f]{3,6}$/i)) return value.hexToRgb(true); + return ((value = value.match(/(\d+),\s*(\d+),\s*(\d+)/))) ? [value[1], value[2], value[3]] : false; + }, + compute: function(from, to, delta){ + return from.map(function(value, i){ + return Math.round(Fx.compute(from[i], to[i], delta)); + }); + }, + serve: function(value){ + return value.map(Number); + } + }, + + Number: { + parse: parseFloat, + compute: Fx.compute, + serve: function(value, unit){ + return (unit) ? value + unit : value; + } + }, + + String: { + parse: Function.from(false), + compute: function(zero, one){ + return one; + }, + serve: function(zero){ + return zero; + } + } + +}; + +//<1.2compat> + +Fx.CSS.Parsers = new Hash(Fx.CSS.Parsers); + +// + + +/* +--- + +name: Fx.Tween + +description: Formerly Fx.Style, effect to transition any CSS property for an element. + +license: MIT-style license. + +requires: Fx.CSS + +provides: [Fx.Tween, Element.fade, Element.highlight] + +... +*/ + +Fx.Tween = new Class({ + + Extends: Fx.CSS, + + initialize: function(element, options){ + this.element = this.subject = document.id(element); + this.parent(options); + }, + + set: function(property, now){ + if (arguments.length == 1){ + now = property; + property = this.property || this.options.property; + } + this.render(this.element, property, now, this.options.unit); + return this; + }, + + start: function(property, from, to){ + if (!this.check(property, from, to)) return this; + var args = Array.flatten(arguments); + this.property = this.options.property || args.shift(); + var parsed = this.prepare(this.element, this.property, args); + return this.parent(parsed.from, parsed.to); + } + +}); + +Element.Properties.tween = { + + set: function(options){ + this.get('tween').cancel().setOptions(options); + return this; + }, + + get: function(){ + var tween = this.retrieve('tween'); + if (!tween){ + tween = new Fx.Tween(this, {link: 'cancel'}); + this.store('tween', tween); + } + return tween; + } + +}; + +Element.implement({ + + tween: function(property, from, to){ + this.get('tween').start(arguments); + return this; + }, + + fade: function(how){ + var fade = this.get('tween'), o = 'opacity', toggle; + how = [how, 'toggle'].pick(); + switch (how){ + case 'in': fade.start(o, 1); break; + case 'out': fade.start(o, 0); break; + case 'show': fade.set(o, 1); break; + case 'hide': fade.set(o, 0); break; + case 'toggle': + var flag = this.retrieve('fade:flag', this.get('opacity') == 1); + fade.start(o, (flag) ? 0 : 1); + this.store('fade:flag', !flag); + toggle = true; + break; + default: fade.start(o, arguments); + } + if (!toggle) this.eliminate('fade:flag'); + return this; + }, + + highlight: function(start, end){ + if (!end){ + end = this.retrieve('highlight:original', this.getStyle('background-color')); + end = (end == 'transparent') ? '#fff' : end; + } + var tween = this.get('tween'); + tween.start('background-color', start || '#ffff88', end).chain(function(){ + this.setStyle('background-color', this.retrieve('highlight:original')); + tween.callChain(); + }.bind(this)); + return this; + } + +}); + + +/* +--- + +name: Fx.Morph + +description: Formerly Fx.Styles, effect to transition any number of CSS properties for an element using an object of rules, or CSS based selector rules. + +license: MIT-style license. + +requires: Fx.CSS + +provides: Fx.Morph + +... +*/ + +Fx.Morph = new Class({ + + Extends: Fx.CSS, + + initialize: function(element, options){ + this.element = this.subject = document.id(element); + this.parent(options); + }, + + set: function(now){ + if (typeof now == 'string') now = this.search(now); + for (var p in now) this.render(this.element, p, now[p], this.options.unit); + return this; + }, + + compute: function(from, to, delta){ + var now = {}; + for (var p in from) now[p] = this.parent(from[p], to[p], delta); + return now; + }, + + start: function(properties){ + if (!this.check(properties)) return this; + if (typeof properties == 'string') properties = this.search(properties); + var from = {}, to = {}; + for (var p in properties){ + var parsed = this.prepare(this.element, p, properties[p]); + from[p] = parsed.from; + to[p] = parsed.to; + } + return this.parent(from, to); + } + +}); + +Element.Properties.morph = { + + set: function(options){ + this.get('morph').cancel().setOptions(options); + return this; + }, + + get: function(){ + var morph = this.retrieve('morph'); + if (!morph){ + morph = new Fx.Morph(this, {link: 'cancel'}); + this.store('morph', morph); + } + return morph; + } + +}; + +Element.implement({ + + morph: function(props){ + this.get('morph').start(props); + return this; + } + +}); + + +/* +--- + +name: Fx.Transitions + +description: Contains a set of advanced transitions to be used with any of the Fx Classes. + +license: MIT-style license. + +credits: + - Easing Equations by Robert Penner, , modified and optimized to be used with MooTools. + +requires: Fx + +provides: Fx.Transitions + +... +*/ + +Fx.implement({ + + getTransition: function(){ + var trans = this.options.transition || Fx.Transitions.Sine.easeInOut; + if (typeof trans == 'string'){ + var data = trans.split(':'); + trans = Fx.Transitions; + trans = trans[data[0]] || trans[data[0].capitalize()]; + if (data[1]) trans = trans['ease' + data[1].capitalize() + (data[2] ? data[2].capitalize() : '')]; + } + return trans; + } + +}); + +Fx.Transition = function(transition, params){ + params = Array.from(params); + return Object.append(transition, { + easeIn: function(pos){ + return transition(pos, params); + }, + easeOut: function(pos){ + return 1 - transition(1 - pos, params); + }, + easeInOut: function(pos){ + return (pos <= 0.5) ? transition(2 * pos, params) / 2 : (2 - transition(2 * (1 - pos), params)) / 2; + } + }); +}; + +Fx.Transitions = { + + linear: function(zero){ + return zero; + } + +}; + +//<1.2compat> + +Fx.Transitions = new Hash(Fx.Transitions); + +// + +Fx.Transitions.extend = function(transitions){ + for (var transition in transitions) Fx.Transitions[transition] = new Fx.Transition(transitions[transition]); +}; + +Fx.Transitions.extend({ + + Pow: function(p, x){ + return Math.pow(p, x && x[0] || 6); + }, + + Expo: function(p){ + return Math.pow(2, 8 * (p - 1)); + }, + + Circ: function(p){ + return 1 - Math.sin(Math.acos(p)); + }, + + Sine: function(p){ + return 1 - Math.sin((1 - p) * Math.PI / 2); + }, + + Back: function(p, x){ + x = x && x[0] || 1.618; + return Math.pow(p, 2) * ((x + 1) * p - x); + }, + + Bounce: function(p){ + var value; + for (var a = 0, b = 1; 1; a += b, b /= 2){ + if (p >= (7 - 4 * a) / 11){ + value = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2); + break; + } + } + return value; + }, + + Elastic: function(p, x){ + return Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x && x[0] || 1) / 3); + } + +}); + +['Quad', 'Cubic', 'Quart', 'Quint'].each(function(transition, i){ + Fx.Transitions[transition] = new Fx.Transition(function(p){ + return Math.pow(p, [i + 2]); + }); +}); + + +/* +--- + +name: Request + +description: Powerful all purpose Request Class. Uses XMLHTTPRequest. + +license: MIT-style license. + +requires: [Object, Element, Chain, Events, Options, Browser] + +provides: Request + +... +*/ + +(function(){ + +var progressSupport = ('onprogress' in new Browser.Request); + +var Request = this.Request = new Class({ + + Implements: [Chain, Events, Options], + + options: {/* + onRequest: function(){}, + onLoadstart: function(event, xhr){}, + onProgress: function(event, xhr){}, + onComplete: function(){}, + onCancel: function(){}, + onSuccess: function(responseText, responseXML){}, + onFailure: function(xhr){}, + onException: function(headerName, value){}, + onTimeout: function(){}, + user: '', + password: '',*/ + url: '', + data: '', + headers: { + 'X-Requested-With': 'XMLHttpRequest', + 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' + }, + async: true, + format: false, + method: 'post', + link: 'ignore', + isSuccess: null, + emulation: true, + urlEncoded: true, + encoding: 'utf-8', + evalScripts: false, + evalResponse: false, + timeout: 0, + noCache: false + }, + + initialize: function(options){ + this.xhr = new Browser.Request(); + this.setOptions(options); + this.headers = this.options.headers; + }, + + onStateChange: function(){ + var xhr = this.xhr; + if (xhr.readyState != 4 || !this.running) return; + this.running = false; + this.status = 0; + Function.attempt(function(){ + var status = xhr.status; + this.status = (status == 1223) ? 204 : status; + }.bind(this)); + xhr.onreadystatechange = function(){}; + clearTimeout(this.timer); + + this.response = {text: this.xhr.responseText || '', xml: this.xhr.responseXML}; + if (this.options.isSuccess.call(this, this.status)) + this.success(this.response.text, this.response.xml); + else + this.failure(); + }, + + isSuccess: function(){ + var status = this.status; + return (status >= 200 && status < 300); + }, + + isRunning: function(){ + return !!this.running; + }, + + processScripts: function(text){ + if (this.options.evalResponse || (/(ecma|java)script/).test(this.getHeader('Content-type'))) return Browser.exec(text); + return text.stripScripts(this.options.evalScripts); + }, + + success: function(text, xml){ + this.onSuccess(this.processScripts(text), xml); + }, + + onSuccess: function(){ + this.fireEvent('complete', arguments).fireEvent('success', arguments).callChain(); + }, + + failure: function(){ + this.onFailure(); + }, + + onFailure: function(){ + this.fireEvent('complete').fireEvent('failure', this.xhr); + }, + + loadstart: function(event){ + this.fireEvent('loadstart', [event, this.xhr]); + }, + + progress: function(event){ + this.fireEvent('progress', [event, this.xhr]); + }, + + timeout: function(){ + this.fireEvent('timeout', this.xhr); + }, + + setHeader: function(name, value){ + this.headers[name] = value; + return this; + }, + + getHeader: function(name){ + return Function.attempt(function(){ + return this.xhr.getResponseHeader(name); + }.bind(this)); + }, + + check: function(){ + if (!this.running) return true; + switch (this.options.link){ + case 'cancel': this.cancel(); return true; + case 'chain': this.chain(this.caller.pass(arguments, this)); return false; + } + return false; + }, + + send: function(options){ + if (!this.check(options)) return this; + + this.options.isSuccess = this.options.isSuccess || this.isSuccess; + this.running = true; + + var type = typeOf(options); + if (type == 'string' || type == 'element') options = {data: options}; + + var old = this.options; + options = Object.append({data: old.data, url: old.url, method: old.method}, options); + var data = options.data, url = String(options.url), method = options.method.toLowerCase(); + + switch (typeOf(data)){ + case 'element': data = document.id(data).toQueryString(); break; + case 'object': case 'hash': data = Object.toQueryString(data); + } + + if (this.options.format){ + var format = 'format=' + this.options.format; + data = (data) ? format + '&' + data : format; + } + + if (this.options.emulation && !['get', 'post'].contains(method)){ + var _method = '_method=' + method; + data = (data) ? _method + '&' + data : _method; + method = 'post'; + } + + if (this.options.urlEncoded && ['post', 'put'].contains(method)){ + var encoding = (this.options.encoding) ? '; charset=' + this.options.encoding : ''; + this.headers['Content-type'] = 'application/x-www-form-urlencoded' + encoding; + } + + if (!url) url = document.location.pathname; + + var trimPosition = url.lastIndexOf('/'); + if (trimPosition > -1 && (trimPosition = url.indexOf('#')) > -1) url = url.substr(0, trimPosition); + + if (this.options.noCache) + url += (url.contains('?') ? '&' : '?') + String.uniqueID(); + + if (data && method == 'get'){ + url += (url.contains('?') ? '&' : '?') + data; + data = null; + } + + var xhr = this.xhr; + if (progressSupport){ + xhr.onloadstart = this.loadstart.bind(this); + xhr.onprogress = this.progress.bind(this); + } + + xhr.open(method.toUpperCase(), url, this.options.async, this.options.user, this.options.password); + if (this.options.user && 'withCredentials' in xhr) xhr.withCredentials = true; + + xhr.onreadystatechange = this.onStateChange.bind(this); + + Object.each(this.headers, function(value, key){ + try { + xhr.setRequestHeader(key, value); + } catch (e){ + this.fireEvent('exception', [key, value]); + } + }, this); + + this.fireEvent('request'); + xhr.send(data); + if (!this.options.async) this.onStateChange(); + if (this.options.timeout) this.timer = this.timeout.delay(this.options.timeout, this); + return this; + }, + + cancel: function(){ + if (!this.running) return this; + this.running = false; + var xhr = this.xhr; + xhr.abort(); + clearTimeout(this.timer); + xhr.onreadystatechange = xhr.onprogress = xhr.onloadstart = function(){}; + this.xhr = new Browser.Request(); + this.fireEvent('cancel'); + return this; + } + +}); + +var methods = {}; +['get', 'post', 'put', 'delete', 'GET', 'POST', 'PUT', 'DELETE'].each(function(method){ + methods[method] = function(data){ + return this.send({ + data: data, + method: method + }); + }; +}); + +Request.implement(methods); + +Element.Properties.send = { + + set: function(options){ + var send = this.get('send').cancel(); + send.setOptions(options); + return this; + }, + + get: function(){ + var send = this.retrieve('send'); + if (!send){ + send = new Request({ + data: this, link: 'cancel', method: this.get('method') || 'post', url: this.get('action') + }); + this.store('send', send); + } + return send; + } + +}; + +Element.implement({ + + send: function(url){ + var sender = this.get('send'); + sender.send({data: this, url: url || sender.options.url}); + return this; + } + +}); + +})(); + +/* +--- + +name: Request.HTML + +description: Extends the basic Request Class with additional methods for interacting with HTML responses. + +license: MIT-style license. + +requires: [Element, Request] + +provides: Request.HTML + +... +*/ + +Request.HTML = new Class({ + + Extends: Request, + + options: { + update: false, + append: false, + evalScripts: true, + filter: false, + headers: { + Accept: 'text/html, application/xml, text/xml, */*' + } + }, + + success: function(text){ + var options = this.options, response = this.response; + + response.html = text.stripScripts(function(script){ + response.javascript = script; + }); + + var match = response.html.match(/]*>([\s\S]*?)<\/body>/i); + if (match) response.html = match[1]; + var temp = new Element('div').set('html', response.html); + + response.tree = temp.childNodes; + response.elements = temp.getElements('*'); + + if (options.filter) response.tree = response.elements.filter(options.filter); + if (options.update) document.id(options.update).empty().set('html', response.html); + else if (options.append) document.id(options.append).adopt(temp.getChildren()); + if (options.evalScripts) Browser.exec(response.javascript); + + this.onSuccess(response.tree, response.elements, response.html, response.javascript); + } + +}); + +Element.Properties.load = { + + set: function(options){ + var load = this.get('load').cancel(); + load.setOptions(options); + return this; + }, + + get: function(){ + var load = this.retrieve('load'); + if (!load){ + load = new Request.HTML({data: this, link: 'cancel', update: this, method: 'get'}); + this.store('load', load); + } + return load; + } + +}; + +Element.implement({ + + load: function(){ + this.get('load').send(Array.link(arguments, {data: Type.isObject, url: Type.isString})); + return this; + } + +}); + + +/* +--- + +name: JSON + +description: JSON encoder and decoder. + +license: MIT-style license. + +See Also: + +requires: [Array, String, Number, Function] + +provides: JSON + +... +*/ + +if (!this.JSON) this.JSON = {}; + +//<1.2compat> + +JSON = new Hash({ + stringify: JSON.stringify, + parse: JSON.parse +}); + +// + +Object.append(JSON, { + + $specialChars: {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\'}, + + $replaceChars: function(chr){ + return JSON.$specialChars[chr] || '\\u00' + Math.floor(chr.charCodeAt() / 16).toString(16) + (chr.charCodeAt() % 16).toString(16); + }, + + encode: function(obj){ + switch (typeOf(obj)){ + case 'string': + return '"' + obj.replace(/[\x00-\x1f\\"]/g, JSON.$replaceChars) + '"'; + case 'array': + return '[' + String(obj.map(JSON.encode).clean()) + ']'; + case 'object': case 'hash': + var string = []; + Object.each(obj, function(value, key){ + var json = JSON.encode(value); + if (json) string.push(JSON.encode(key) + ':' + json); + }); + return '{' + string + '}'; + case 'number': case 'boolean': return String(obj); + case 'null': return 'null'; + } + return null; + }, + + decode: function(string, secure){ + if (typeOf(string) != 'string' || !string.length) return null; + if (secure && !(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''))) return null; + return eval('(' + string + ')'); + } + +}); + + +/* +--- + +name: Request.JSON + +description: Extends the basic Request Class with additional methods for sending and receiving JSON data. + +license: MIT-style license. + +requires: [Request, JSON] + +provides: Request.JSON + +... +*/ + +Request.JSON = new Class({ + + Extends: Request, + + options: { + secure: true + }, + + initialize: function(options){ + this.parent(options); + Object.append(this.headers, { + 'Accept': 'application/json', + 'X-Request': 'JSON' + }); + }, + + success: function(text){ + var secure = this.options.secure; + var json = this.response.json = Function.attempt(function(){ + return JSON.decode(text, secure); + }); + + if (json == null) this.onFailure(); + else this.onSuccess(json, text); + } + +}); + + +/* +--- + +name: Cookie + +description: Class for creating, reading, and deleting browser Cookies. + +license: MIT-style license. + +credits: + - Based on the functions by Peter-Paul Koch (http://quirksmode.org). + +requires: Options + +provides: Cookie + +... +*/ + +var Cookie = new Class({ + + Implements: Options, + + options: { + path: '/', + domain: false, + duration: false, + secure: false, + document: document, + encode: true + }, + + initialize: function(key, options){ + this.key = key; + this.setOptions(options); + }, + + write: function(value){ + if (this.options.encode) value = encodeURIComponent(value); + if (this.options.domain) value += '; domain=' + this.options.domain; + if (this.options.path) value += '; path=' + this.options.path; + if (this.options.duration){ + var date = new Date(); + date.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 * 1000); + value += '; expires=' + date.toGMTString(); + } + if (this.options.secure) value += '; secure'; + this.options.document.cookie = this.key + '=' + value; + return this; + }, + + read: function(){ + var value = this.options.document.cookie.match('(?:^|;)\\s*' + this.key.escapeRegExp() + '=([^;]*)'); + return (value) ? decodeURIComponent(value[1]) : null; + }, + + dispose: function(){ + new Cookie(this.key, Object.merge({}, this.options, {duration: -1})).write(''); + return this; + } + +}); + +Cookie.write = function(key, value, options){ + return new Cookie(key, options).write(value); +}; + +Cookie.read = function(key){ + return new Cookie(key).read(); +}; + +Cookie.dispose = function(key, options){ + return new Cookie(key, options).dispose(); +}; + + +/* +--- + +name: DOMReady + +description: Contains the custom event domready. + +license: MIT-style license. + +requires: [Browser, Element, Element.Event] + +provides: [DOMReady, DomReady] + +... +*/ + +(function(window, document){ + +var ready, + loaded, + checks = [], + shouldPoll, + timer, + isFramed = true; + +// Thanks to Rich Dougherty +try { + isFramed = window.frameElement != null; +} catch(e){} + +var domready = function(){ + clearTimeout(timer); + if (ready) return; + Browser.loaded = ready = true; + document.removeListener('DOMContentLoaded', domready).removeListener('readystatechange', check); + + document.fireEvent('domready'); + window.fireEvent('domready'); +}; + +var check = function(){ + for (var i = checks.length; i--;) if (checks[i]()){ + domready(); + return true; + } + + return false; +}; + +var poll = function(){ + clearTimeout(timer); + if (!check()) timer = setTimeout(poll, 10); +}; + +document.addListener('DOMContentLoaded', domready); + +// doScroll technique by Diego Perini http://javascript.nwbox.com/IEContentLoaded/ +var testElement = document.createElement('div'); +if (testElement.doScroll && !isFramed){ + checks.push(function(){ + try { + testElement.doScroll(); + return true; + } catch (e){} + + return false; + }); + shouldPoll = true; +} + +if (document.readyState) checks.push(function(){ + var state = document.readyState; + return (state == 'loaded' || state == 'complete'); +}); + +if ('onreadystatechange' in document) document.addListener('readystatechange', check); +else shouldPoll = true; + +if (shouldPoll) poll(); + +Element.Events.domready = { + onAdd: function(fn){ + if (ready) fn.call(this); + } +}; + +// Make sure that domready fires before load +Element.Events.load = { + base: 'load', + onAdd: function(fn){ + if (loaded && this == window) fn.call(this); + }, + condition: function(){ + if (this == window){ + domready(); + delete Element.Events.load; + } + + return true; + } +}; + +// This is based on the custom load event +window.addEvent('load', function(){ + loaded = true; +}); + +})(window, document); + + +/* +--- + +name: Swiff + +description: Wrapper for embedding SWF movies. Supports External Interface Communication. + +license: MIT-style license. + +credits: + - Flash detection & Internet Explorer + Flash Player 9 fix inspired by SWFObject. + +requires: [Options, Object] + +provides: Swiff + +... +*/ + +(function(){ + +var id = 0; + +var Swiff = this.Swiff = new Class({ + + Implements: Options, + + options: { + id: null, + height: 1, + width: 1, + container: null, + properties: {}, + params: { + quality: 'high', + allowScriptAccess: 'always', + wMode: 'window', + swLiveConnect: true + }, + callBacks: {}, + vars: {} + }, + + toElement: function(){ + return this.object; + }, + + initialize: function(path, options){ + this.instance = 'Swiff_' + id++; + + this.setOptions(options); + options = this.options; + var id = this.id = options.id || this.instance; + var container = document.id(options.container); + + Swiff.CallBacks[this.instance] = {}; + + var params = options.params, vars = options.vars, callBacks = options.callBacks; + var properties = Object.append({height: options.height, width: options.width}, options.properties); + + var self = this; + + for (var callBack in callBacks){ + Swiff.CallBacks[this.instance][callBack] = (function(option){ + return function(){ + return option.apply(self.object, arguments); + }; + })(callBacks[callBack]); + vars[callBack] = 'Swiff.CallBacks.' + this.instance + '.' + callBack; + } + + params.flashVars = Object.toQueryString(vars); + if (Browser.ie){ + properties.classid = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'; + params.movie = path; + } else { + properties.type = 'application/x-shockwave-flash'; + } + properties.data = path; + + var build = ''; + } + build += ''; + this.object = ((container) ? container.empty() : new Element('div')).set('html', build).firstChild; + }, + + replaces: function(element){ + element = document.id(element, true); + element.parentNode.replaceChild(this.toElement(), element); + return this; + }, + + inject: function(element){ + document.id(element, true).appendChild(this.toElement()); + return this; + }, + + remote: function(){ + return Swiff.remote.apply(Swiff, [this.toElement()].extend(arguments)); + } + +}); + +Swiff.CallBacks = {}; + +Swiff.remote = function(obj, fn){ + var rs = obj.CallFunction('' + __flash__argumentsToXML(arguments, 2) + ''); + return eval(rs); +}; + +})(); + diff --git a/system_check.php b/system_check.php new file mode 100644 index 0000000..83203d1 --- /dev/null +++ b/system_check.php @@ -0,0 +1,127 @@ + + + + + + +MiniGal Nano system check + + +

    MiniGal Nano system check

    +
    + PHP Version +
    +
    ')) echo 'middle-yes'; else echo 'middle-no' ?>"> + +
    +
    + PHP scripting language version 4.0 or greater is needed +
    +
    + +
    + GD library support +
    +
    "> + +
    +
    + GD image manipulation library is used to create thumbnails. Bundled since PHP 4.3 +
    +
    + +
    + EXIF support +
    +
    "> + +
    +
    + Ability to extract and display EXIF information. The script will work without it, but not display image information +
    +
    + +
    + PHP memory limit +
    +
    + +
    +
    + Memory is needed to create thumbnails. Bigger images uses more memory +
    +
    + +
    + New version check +
    +
    + +
    +
    + The ability to check for new version and display this automatically. The script will work without it +
    +

    +Support website +| Support forum + + diff --git a/templates/exhibition.html b/templates/exhibition.html new file mode 100644 index 0000000..f3ddeae --- /dev/null +++ b/templates/exhibition.html @@ -0,0 +1,181 @@ + + + + +<% title %> + + + + + + + +

    <% title %>

    +<% messages %> +

    by: <% author %>

    +<% breadcrumb_navigation %> +

    +
    + +
    +
    + +
    + + +

    + + diff --git a/templates/integrate.html b/templates/integrate.html new file mode 100644 index 0000000..85f1433 --- /dev/null +++ b/templates/integrate.html @@ -0,0 +1,149 @@ + + + + +<% title %> + + + + + + + +

    <% title %>

    +

    by: <% author %>

    +<% breadcrumb_navigation %> +
    + +
    +
    + +
    + + +

    + + diff --git a/templates/mano.html b/templates/mano.html new file mode 100644 index 0000000..15a26b5 --- /dev/null +++ b/templates/mano.html @@ -0,0 +1,167 @@ + + + + +<% title %> + + + + + +

    <% title %>

    +<% messages %> +

    by: <% author %>

    +<% breadcrumb_navigation %> +
    + +
    +
    + +
    + +
    + +

    + +