<?php
/**
* Kama Thumbnail
*
* @author Kama (fork by Romeo)
* @url http://w...content-available-to-author-only...a.ru/?p=142
* @version 1.4.3
*/
class Thumb
{
/**
* ссылка на картинку, когда нет фото (заглушка)
*(Пример: /wp-content/plugins/kama-thumbnail/no_photo.jpg)
*/
public $link_to_no_photo = '';
/**
* путь до папки, куда будут создаваться миниатюры (от корня сайта). Нужны права на запись777
* (Пример: /wp-content/plugins/kama-thumbnail/thumb)
*/
public $cache_folder = '/assets/cache';
/**
* поддомены на котором могут быть исходные картинки (через запятую): img.site.ru,img2.site.ru
*/
public $subdomen = '';
/**
* var not edit
*/
public $src;
public $width;
public $height;
public $quality;
public $no_stub;
public $no_attr;
private $_args;
/**
* Создает миниатюру
*
* @return string|bool - ссылку на миниатюру
*/
private function _makeFile()
{
/* картинка не определена */
if(!isset($psrc['path'])) {
return false;
}
$doc_root = $_SERVER['DOCUMENT_ROOT'];
if (isset($psrc['host']) && strpos($this->subdomen, $psrc['host']) !== false) { $doc_root = str_replace($_SERVER['HTTP_HOST'], $psrc['host'], $doc_root); }
/* собираем абс. путь */
$src = $doc_root . '/' . $psrc['path'];
/* если src пуст или изображение отсутствует */
if ($this->no_stub === true) {
return false;
}
//$src = $this->link_to_no_photo;
}
/**/
//$file_name = substr( md5($psrc['path']), -9);
$image_info = getimagesize($_SERVER['DOCUMENT_ROOT'] . $this->src); $image_type = $image_info[2];
if ($image_type == IMAGETYPE_JPEG) {
$image_ext = '.jpg';
} elseif ($image_type == IMAGETYPE_GIF) {
$image_ext = '.gif';
} elseif ($image_type == IMAGETYPE_PNG) {
$image_ext = '.png';
} else {
$image_ext= '';
}
$file_name = $file_name . '_' . $this->width . 'x' . $this->height . $image_ext;
/* файл миниатюры от корня сайта */
$dest = $_SERVER['DOCUMENT_ROOT'] . '/' . $this->cache_folder . '/' . $file_name;
/* ссылка на изображение */
$out_link = $this->cache_folder . '/' . $file_name;
/* если миниатюра уже есть, то возвращаем */
return $out_link;
} elseif($this->_makeThumb($src, $this->width, $this->height, $this->quality, $dest)) {
return $out_link;
}
return false;
}
/**
* Создание и запись файла-картинки
*
* @param string $src
* @param int $width
* @param int $height
* @param int $quality
* @param string $dest
* @return bool
*/
private function _makeThumb($src, $width, $height, $quality, $dest){
return false;
}
$w_file = $size[0];
$h_file = $size[1];
/* если не указана одна из сторон задаем ей пропорциональное значение */
$width = round($w_file * ($height / $h_file)); }
$height = round($h_file * ($width / $w_file)); }
/* Определяем исходный формат по MIME-информации и выбираем
соответствующую imagecreatefrom-функцию. */
$icfunc = 'imagecreatefrom' . $format;
/* не существует подходящей функции преобразования */
return false;
}
$isrc=$icfunc($src);
/* Создаем холст полноцветного изображения */
/* Создаем прозрачный канал слоя */
/* Заливка холста новыми каналами */
/* Ставим флаг сохраняющий прозрачный канал */
/* Определяем необходимость преобразования размера так чтоб
вписывалась наименьшая сторона */
#if( $width<$w_file || $height<$h_file )
$ratio = max($width/$w_file, $height/$h_file);
$dx = $dy = 0;
/* срезать справа и/или слева
отступ слева у источника */
if ($height/$h_file > $width/$w_file) {
$dx = round(($w_file - $width*$h_file/$height)/2 );
/* срезать верх и низ отступ сверху у источника *6/10 - чтобы
для вертикальных фоток отступ сверху был не половина а процентов 30*/
} else {
$dy = round(($h_file - $height * $w_file / $width) / 2*6/10 ); }
/* сколько пикселей считывать c источника */
$wsrc = round($width / $ratio); /* по ширине */ $hsrc = round($height / $ratio); /* по высоте */
if ($format=='png'){
$quality = floor ($quality * 0.09); } else {
}
return true;
}
/**
* Инициализация аргументов
*
* @param string $args
* @return boolean
*/
private function _setArgs($args) {
/* удаление всех сиволов \s и парсинг строки, как ссылки */
if (empty($this->_args
)) {
return false;
}
$arr_args = $this->_args;
$this->width = !empty($arr_args['w']) ?
trim($arr_args['w']) : ''; $this->height = !empty($arr_args['h']) ?
trim($arr_args['h']) : ''; $this->src = !empty($arr_args['src']) ?
trim($arr_args['src']) : ''; $this->quality = !empty($arr_args['q']) ?
trim($arr_args['q']) : 85; $this->no_stub = isset($arr_args['no_stub']) ?
true : false; $this->no_attr = isset($arr_args['no_attr']) ?
true : false;
if(!isset($this->width) && !isset($this->height)) { $this->width = $this->height = 100;
}
return true;
}
/**
* Возвращает только src
*
* @param string $args
* @return string
*/
public function getSrc($args) {
if (empty($args) || !$this->_setArgs
($args)) {
return '';
}
return ($ret = $this->_makeFile()) ? $ret : '';
}
/**
* Возвращает готовый тег img
*
* @param string $args
* @return string
*/
public function getImg($args) {
if (empty($args) || (!$src = $this->getSrc($args))) {
return '';
}
if ($this->no_attr === false) {
$width = !empty($this->width) ?
'width="' . $this->width . '"' : ''; $height = !empty($this->height) ?
'height="' . $this->height . '"' : ''; } else {
$width = $height = '';
}
$arr_args = $this->_args;
$class = !empty($arr_args['class']) ?
'class="' . trim($arr_args['class']) . '"' : ''; $alt = !empty($arr_args['alt']) ?
trim($arr_args['alt']) : '';
$ret = '<img ' . $class . ' src="' . $src . '" alt="' . $alt . '" ' . $width . ' ' . $height. ' />';
return $ret;
}
/**
* Возвращает ссылку-картинку
*
* @param string $args
* @return string
*/
public function getLink($args) {
if (empty($args) || (!$img = $this->getImg($args))) {
return '';
}
$ret = '<a href="' . $this->src . '">' . $img . '</a>';
return $ret;
}
}
PD9waHAgCi8qKgogKiBLYW1hIFRodW1ibmFpbAogKgogKiBAYXV0aG9yICAgS2FtYSAoZm9yayBieSBSb21lbykKICogQHVybCAgICBodHRwOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uYS5ydS8/cD0xNDIKICogQHZlcnNpb24gICAgMS40LjMKICovCmNsYXNzIFRodW1iCnsKICAgIC8qKgoJICog0YHRgdGL0LvQutCwINC90LAg0LrQsNGA0YLQuNC90LrRgywg0LrQvtCz0LTQsCDQvdC10YIg0YTQvtGC0L4gKNC30LDQs9C70YPRiNC60LApIAoJICoo0J/RgNC40LzQtdGAOiAvd3AtY29udGVudC9wbHVnaW5zL2thbWEtdGh1bWJuYWlsL25vX3Bob3RvLmpwZykKCSAqLwoJcHVibGljICRsaW5rX3RvX25vX3Bob3RvID0gJyc7CgkKCS8qKgoJICog0L/Rg9GC0Ywg0LTQviDQv9Cw0L/QutC4LCDQutGD0LTQsCDQsdGD0LTRg9GCINGB0L7Qt9C00LDQstCw0YLRjNGB0Y8g0LzQuNC90LjQsNGC0Y7RgNGLICjQvtGCINC60L7RgNC90Y8g0YHQsNC50YLQsCkuINCd0YPQttC90Ysg0L/RgNCw0LLQsCDQvdCwINC30LDQv9C40YHRjDc3NwoJICogKNCf0YDQuNC80LXRgDogL3dwLWNvbnRlbnQvcGx1Z2lucy9rYW1hLXRodW1ibmFpbC90aHVtYikKCSAqLwkKCXB1YmxpYyAkY2FjaGVfZm9sZGVyID0gJy9hc3NldHMvY2FjaGUnOwkKCgkvKioKCSAqINC/0L7QtNC00L7QvNC10L3RiyDQvdCwINC60L7RgtC+0YDQvtC8INC80L7Qs9GD0YIg0LHRi9GC0Ywg0LjRgdGF0L7QtNC90YvQtSDQutCw0YDRgtC40L3QutC4ICjRh9C10YDQtdC3INC30LDQv9GP0YLRg9GOKTogaW1nLnNpdGUucnUsaW1nMi5zaXRlLnJ1CgkgKi8JCglwdWJsaWMgJHN1YmRvbWVuID0gJyc7CgoJLyoqCgkgKiB2YXIgbm90IGVkaXQKCSAqLwkJCglwdWJsaWMgJHNyYzsKCXB1YmxpYyAkd2lkdGg7CglwdWJsaWMgJGhlaWdodDsKCXB1YmxpYyAkcXVhbGl0eTsKCXB1YmxpYyAkbm9fc3R1YjsKCXB1YmxpYyAkbm9fYXR0cjsKCQoJcHJpdmF0ZSAkX2FyZ3M7CgoKCS8qKgoJICog0KHQvtC30LTQsNC10YIg0LzQuNC90LjQsNGC0Y7RgNGDCgkgKgoJICogQHJldHVybiBzdHJpbmd8Ym9vbCAtINGB0YHRi9C70LrRgyDQvdCwINC80LjQvdC40LDRgtGO0YDRgyAKCSAqLwkJCglwcml2YXRlIGZ1bmN0aW9uIF9tYWtlRmlsZSgpCiAgICB7CgkJJHBzcmMgPSBwYXJzZV91cmwoJHRoaXMtPnNyYyk7CgkJCgkJLyog0LrQsNGA0YLQuNC90LrQsCDQvdC1INC+0L/RgNC10LTQtdC70LXQvdCwICovCgkJaWYoIWlzc2V0KCRwc3JjWydwYXRoJ10pKSB7CgkJCQoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQkKCQkkZG9jX3Jvb3QgPSAkX1NFUlZFUlsnRE9DVU1FTlRfUk9PVCddOwoJCWlmIChpc3NldCgkcHNyY1snaG9zdCddKSAmJiBzdHJwb3MoJHRoaXMtPnN1YmRvbWVuLCAkcHNyY1snaG9zdCddKSAhPT0gZmFsc2UpIHsKCQkJJGRvY19yb290ID0gc3RyX3JlcGxhY2UoJF9TRVJWRVJbJ0hUVFBfSE9TVCddLCAkcHNyY1snaG9zdCddLCAkZG9jX3Jvb3QpOwoJCX0KCQkKCQkvKiDRgdC+0LHQuNGA0LDQtdC8INCw0LHRgS4g0L/Rg9GC0YwgKi8JCQkKCQkkc3JjID0gJGRvY19yb290IC4gJy8nIC4gJHBzcmNbJ3BhdGgnXTsgCgkJCgkJLyog0LXRgdC70Lggc3JjINC/0YPRgdGCINC40LvQuCDQuNC30L7QsdGA0LDQttC10L3QuNC1INC+0YLRgdGD0YLRgdGC0LLRg9C10YIgKi8KCQlpZiAoZW1wdHkoJHBzcmNbJ3BhdGgnXSkgfHwgIWZpbGVfZXhpc3RzKCRzcmMpKSB7CgkJCWlmICgkdGhpcy0+bm9fc3R1YiA9PT0gdHJ1ZSkgewoJCQkJCgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQkJLy8kc3JjID0gJHRoaXMtPmxpbmtfdG9fbm9fcGhvdG87CgkJfQoJCS8qKi8JCQoJCQoJCS8vJGZpbGVfbmFtZSA9IHN1YnN0ciggbWQ1KCRwc3JjWydwYXRoJ10pLCAtOSk7CgkJJGZpbGVfbmFtZSA9ICBzdWJzdHIobWQ1X2ZpbGUoJHNyYyksIC0xNik7CgkJCgkJJGltYWdlX2luZm8gPSBnZXRpbWFnZXNpemUoJF9TRVJWRVJbJ0RPQ1VNRU5UX1JPT1QnXSAuICR0aGlzLT5zcmMpOwoJCSRpbWFnZV90eXBlID0gJGltYWdlX2luZm9bMl07CgkJaWYgKCRpbWFnZV90eXBlID09IElNQUdFVFlQRV9KUEVHKSB7CgkJCSRpbWFnZV9leHQgPSAnLmpwZyc7CgkJfSBlbHNlaWYgKCRpbWFnZV90eXBlID09IElNQUdFVFlQRV9HSUYpIHsKCQkJJGltYWdlX2V4dCA9ICcuZ2lmJzsKCQl9IGVsc2VpZiAoJGltYWdlX3R5cGUgPT0gSU1BR0VUWVBFX1BORykgewoJCQkkaW1hZ2VfZXh0ID0gJy5wbmcnOwoJCX0gZWxzZQl7CgkJCSRpbWFnZV9leHQ9ICcnOwoJCX0KCQkJCgkJJGZpbGVfbmFtZSA9ICRmaWxlX25hbWUgLiAnXycgLiAkdGhpcy0+d2lkdGggLiAneCcgLiAkdGhpcy0+aGVpZ2h0IC4gJGltYWdlX2V4dDsKCQkKCQkvKiDRhNCw0LnQuyDQvNC40L3QuNCw0YLRjtGA0Ysg0L7RgiDQutC+0YDQvdGPINGB0LDQudGC0LAgKi8KCQkkZGVzdCA9ICRfU0VSVkVSWydET0NVTUVOVF9ST09UJ10gLiAnLycgLiAkdGhpcy0+Y2FjaGVfZm9sZGVyIC4gJy8nIC4gJGZpbGVfbmFtZTsKCQkKCQkvKiDRgdGB0YvQu9C60LAg0L3QsCDQuNC30L7QsdGA0LDQttC10L3QuNC1ICovCgkJJG91dF9saW5rID0gICR0aGlzLT5jYWNoZV9mb2xkZXIgLiAnLycgLiAkZmlsZV9uYW1lOwoJCQoJCS8qINC10YHQu9C4INC80LjQvdC40LDRgtGO0YDQsCDRg9C20LUg0LXRgdGC0YwsINGC0L4g0LLQvtC30LLRgNCw0YnQsNC10LwgKi8KCQlpZiAoZmlsZV9leGlzdHMoJGRlc3QpKSB7CgkJCQoJCQlyZXR1cm4gJG91dF9saW5rOyAgCgkJfSBlbHNlaWYoJHRoaXMtPl9tYWtlVGh1bWIoJHNyYywgJHRoaXMtPndpZHRoLCAkdGhpcy0+aGVpZ2h0LCAkdGhpcy0+cXVhbGl0eSwgJGRlc3QpKSB7CgkJCQoJCQlyZXR1cm4gJG91dF9saW5rOwoJCX0KCgkJcmV0dXJuIGZhbHNlOwoJfQoKCiAgICAvKioKICAgICAqINCh0L7Qt9C00LDQvdC40LUg0Lgg0LfQsNC/0LjRgdGMINGE0LDQudC70LAt0LrQsNGA0YLQuNC90LrQuAogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgICAgJHNyYwogICAgICogQHBhcmFtIGludCAgICAgICAkd2lkdGgKICAgICAqIEBwYXJhbSBpbnQgICAgICAgJGhlaWdodAogICAgICogQHBhcmFtIGludCAgICAgICAkcXVhbGl0eQogICAgICogQHBhcmFtIHN0cmluZyAgICAkZGVzdAogICAgICogQHJldHVybiBib29sCiAgICAgKi8KCXByaXZhdGUgZnVuY3Rpb24gX21ha2VUaHVtYigkc3JjLCAkd2lkdGgsICRoZWlnaHQsICRxdWFsaXR5LCAkZGVzdCl7CgoJCWlmICgoJHNpemUgPSBAZ2V0aW1hZ2VzaXplKCRzcmMpKSA9PT0gZmFsc2UpIHsKCQkJCgkJCXJldHVybiBmYWxzZTsJCgkJfQoKCQkkd19maWxlID0gJHNpemVbMF07CgkJJGhfZmlsZSA9ICRzaXplWzFdOwoJCQoJCS8qINC10YHQu9C4INC90LUg0YPQutCw0LfQsNC90LAg0L7QtNC90LAg0LjQtyDRgdGC0L7RgNC+0L0g0LfQsNC00LDQtdC8INC10Lkg0L/RgNC+0L/QvtGA0YbQuNC+0L3QsNC70YzQvdC+0LUg0LfQvdCw0YfQtdC90LjQtSAqLwoJCWlmIChlbXB0eSgkd2lkdGgpKQl7CgkJCSR3aWR0aCA9IHJvdW5kKCR3X2ZpbGUgKiAoJGhlaWdodCAvICRoX2ZpbGUpKTsKCQl9CgkJaWYoZW1wdHkoJGhlaWdodCkpIHsKCQkJJGhlaWdodCA9IHJvdW5kKCRoX2ZpbGUgKiAoJHdpZHRoIC8gJHdfZmlsZSkpOwoJCX0KCgkJLyog0J7Qv9GA0LXQtNC10LvRj9C10Lwg0LjRgdGF0L7QtNC90YvQuSDRhNC+0YDQvNCw0YIg0L/QviBNSU1FLdC40L3RhNC+0YDQvNCw0YbQuNC4INC4INCy0YvQsdC40YDQsNC10LwKCQkg0YHQvtC+0YLQstC10YLRgdGC0LLRg9GO0YnRg9GOIGltYWdlY3JlYXRlZnJvbS3RhNGD0L3QutGG0LjRji4gKi8KCQkkZm9ybWF0ID0gc3RydG9sb3dlcihzdWJzdHIoJHNpemVbJ21pbWUnXSwgc3RycG9zKCRzaXplWydtaW1lJ10sICcvJykgKyAxKSk7CgkJJGljZnVuYyA9ICdpbWFnZWNyZWF0ZWZyb20nIC4gJGZvcm1hdDsKCQkKCQkvKiDQvdC1INGB0YPRidC10YHRgtCy0YPQtdGCINC/0L7QtNGF0L7QtNGP0YnQtdC5INGE0YPQvdC60YbQuNC4INC/0YDQtdC+0LHRgNCw0LfQvtCy0LDQvdC40Y8gKi8KCQlpZiAoIWZ1bmN0aW9uX2V4aXN0cygkaWNmdW5jKSkgewoJCQkKCQkJcmV0dXJuIGZhbHNlOyAKCQl9CgkJJGlzcmM9JGljZnVuYygkc3JjKTsJCQoJCQoJCS8qINCh0L7Qt9C00LDQtdC8INGF0L7Qu9GB0YIg0L/QvtC70L3QvtGG0LLQtdGC0L3QvtCz0L4g0LjQt9C+0LHRgNCw0LbQtdC90LjRjyAqLwoJCSRpZGVzdCA9IGltYWdlY3JlYXRldHJ1ZWNvbG9yKCR3aWR0aCwgJGhlaWdodCk7CgkJCgkJLyog0KHQvtC30LTQsNC10Lwg0L/RgNC+0LfRgNCw0YfQvdGL0Lkg0LrQsNC90LDQuyDRgdC70L7RjyAqLwoJCSRjb2xvciA9IGltYWdlY29sb3JhbGxvY2F0ZWFscGhhKCRpZGVzdCwgMCwgMCwgMCwgMTI3KTsKCgkJLyog0JfQsNC70LjQstC60LAg0YXQvtC70YHRgtCwINC90L7QstGL0LzQuCDQutCw0L3QsNC70LDQvNC4ICovCgkJaW1hZ2VmaWxsKCRpZGVzdCwgMCwgMCwgJGNvbG9yKTsKCQkKCQkvKiDQodGC0LDQstC40Lwg0YTQu9Cw0LMg0YHQvtGF0YDQsNC90Y/RjtGJ0LjQuSDQv9GA0L7Qt9GA0LDRh9C90YvQuSDQutCw0L3QsNC7ICovCgkJaW1hZ2VzYXZlYWxwaGEoJGlkZXN0LCB0cnVlKTsKCQkKCQkvKiDQntC/0YDQtdC00LXQu9GP0LXQvCDQvdC10L7QsdGF0L7QtNC40LzQvtGB0YLRjCDQv9GA0LXQvtCx0YDQsNC30L7QstCw0L3QuNGPINGA0LDQt9C80LXRgNCwINGC0LDQuiDRh9GC0L7QsSAKCQnQstC/0LjRgdGL0LLQsNC70LDRgdGMINC90LDQuNC80LXQvdGM0YjQsNGPINGB0YLQvtGA0L7QvdCwICovCgkJI2lmKCAkd2lkdGg8JHdfZmlsZSB8fCAkaGVpZ2h0PCRoX2ZpbGUgKQoJCSRyYXRpbyA9IG1heCgkd2lkdGgvJHdfZmlsZSwgJGhlaWdodC8kaF9maWxlKTsKCgkJJGR4ID0gJGR5ID0gMDsKCQkKCQkvKiDRgdGA0LXQt9Cw0YLRjCDRgdC/0YDQsNCy0LAg0Lgv0LjQu9C4INGB0LvQtdCy0LAgCgkJ0L7RgtGB0YLRg9C/INGB0LvQtdCy0LAg0YMg0LjRgdGC0L7Rh9C90LjQutCwICovCgkJaWYgKCRoZWlnaHQvJGhfZmlsZSA+ICR3aWR0aC8kd19maWxlKSB7CgkJCSRkeCA9IHJvdW5kKCgkd19maWxlIC0gJHdpZHRoKiRoX2ZpbGUvJGhlaWdodCkvMiApOwoJCQkKCQkvKiDRgdGA0LXQt9Cw0YLRjCDQstC10YDRhSDQuCDQvdC40Lcg0L7RgtGB0YLRg9C/INGB0LLQtdGA0YXRgyDRgyDQuNGB0YLQvtGH0L3QuNC60LAgKjYvMTAgLSDRh9GC0L7QsdGLCgkJINC00LvRjyDQstC10YDRgtC40LrQsNC70YzQvdGL0YUg0YTQvtGC0L7QuiDQvtGC0YHRgtGD0L8g0YHQstC10YDRhdGDINCx0YvQuyDQvdC1INC/0L7Qu9C+0LLQuNC90LAg0LAg0L/RgNC+0YbQtdC90YLQvtCyIDMwKi8JCQkJCgkJfSBlbHNlIHsKCQkJJGR5ID0gcm91bmQoKCRoX2ZpbGUgLSAkaGVpZ2h0ICogJHdfZmlsZSAvICR3aWR0aCkgLyAyKjYvMTAgKTsKCQl9CgkJIAoJCS8qINGB0LrQvtC70YzQutC+INC/0LjQutGB0LXQu9C10Lkg0YHRh9C40YLRi9Cy0LDRgtGMIGMg0LjRgdGC0L7Rh9C90LjQutCwICovCgkJJHdzcmMgPSByb3VuZCgkd2lkdGggLyAkcmF0aW8pOyAgLyog0L/QviDRiNC40YDQuNC90LUgKi8KCQkkaHNyYyA9IHJvdW5kKCRoZWlnaHQgLyAkcmF0aW8pOyAvKiDQv9C+INCy0YvRgdC+0YLQtSAqLwoKCQlpbWFnZWNvcHlyZXNhbXBsZWQoJGlkZXN0LCAkaXNyYywgMCwgMCwgJGR4LCAkZHksICR3aWR0aCwgJGhlaWdodCwgJHdzcmMsICRoc3JjKTsKCQkJCQoJCWlmICgkZm9ybWF0PT0ncG5nJyl7CgkJCSRxdWFsaXR5ID0gZmxvb3IgKCRxdWFsaXR5ICogMC4wOSk7CgkJCWltYWdlcG5nKCRpZGVzdCwkZGVzdCwkcXVhbGl0eSk7CgkJfSBlbHNlIHsKCQkJaW1hZ2VqcGVnKCRpZGVzdCwkZGVzdCwkcXVhbGl0eSk7CgkJfQoJCWNobW9kKCRkZXN0LCAwNzc3KTsKCQlpbWFnZWRlc3Ryb3koJGlzcmMpOwoJCWltYWdlZGVzdHJveSgkaWRlc3QpOwoJCSAgCgkJcmV0dXJuIHRydWU7IAoJfQoKCiAgICAvKioKICAgICAqINCY0L3QuNGG0LjQsNC70LjQt9Cw0YbQuNGPINCw0YDQs9GD0LzQtdC90YLQvtCyCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgICAkYXJncwogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3NldEFyZ3MoJGFyZ3MpIHsKCQkKCQkvKiDRg9C00LDQu9C10L3QuNC1INCy0YHQtdGFINGB0LjQstC+0LvQvtCyIFxzINC4INC/0LDRgNGB0LjQvdCzINGB0YLRgNC+0LrQuCwg0LrQsNC6INGB0YHRi9C70LrQuCAqLwoJCXBhcnNlX3N0cihwcmVnX3JlcGxhY2UoJy9bXG5cclx0XSsvJywgJycsICRhcmdzKSwgJHRoaXMtPl9hcmdzKTsKCQlpZiAoZW1wdHkoJHRoaXMtPl9hcmdzKSkgewoJCQkKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkKCQkkYXJyX2FyZ3MgPSAkdGhpcy0+X2FyZ3M7CgkJJHRoaXMtPndpZHRoID0gCQkhZW1wdHkoJGFycl9hcmdzWyd3J10pCQkJPyB0cmltKCRhcnJfYXJnc1sndyddKQkgCQkJOiAnJzsKCQkkdGhpcy0+aGVpZ2h0ID0JCSFlbXB0eSgkYXJyX2FyZ3NbJ2gnXSkJCQk/IHRyaW0oJGFycl9hcmdzWydoJ10pCSAJCQk6ICcnOwoJCSR0aGlzLT5zcmMgPSAJCSFlbXB0eSgkYXJyX2FyZ3NbJ3NyYyddKQkgCT8gdHJpbSgkYXJyX2FyZ3NbJ3NyYyddKQkJCTogJyc7CgkJJHRoaXMtPnF1YWxpdHkgPQkhZW1wdHkoJGFycl9hcmdzWydxJ10pCQkJPyB0cmltKCRhcnJfYXJnc1sncSddKQkgCQkJOiA4NTsKCQkkdGhpcy0+bm9fc3R1YiA9CWlzc2V0KCRhcnJfYXJnc1snbm9fc3R1YiddKQkJPyB0cnVlCQkJCQkJCSAJOiBmYWxzZTsKCQkkdGhpcy0+bm9fYXR0ciA9CWlzc2V0KCRhcnJfYXJnc1snbm9fYXR0ciddKQkJPyB0cnVlCQkJCQkJCSAJOiBmYWxzZTsJCQoKCQlpZighaXNzZXQoJHRoaXMtPndpZHRoKSAmJiAhaXNzZXQoJHRoaXMtPmhlaWdodCkpIHsKCQkJJHRoaXMtPndpZHRoID0gJHRoaXMtPmhlaWdodCA9IDEwMDsJCQoJCX0KCQkKCQlyZXR1cm4gdHJ1ZTsKCX0KCgogICAgLyoqCiAgICAgKiDQktC+0LfQstGA0LDRidCw0LXRgiDRgtC+0LvRjNC60L4gc3JjCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgICAkYXJncwogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFNyYygkYXJncykgewoJCWlmIChlbXB0eSgkYXJncykgfHwgISR0aGlzLT5fc2V0QXJncygkYXJncykpIHsKCQkJCgkJCXJldHVybiAnJzsKCQl9CQoJCQkJCgkJcmV0dXJuICgkcmV0ID0gJHRoaXMtPl9tYWtlRmlsZSgpKSA/ICRyZXQgOiAnJzsJCQoJfQoKCgkvKioKCSAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINCz0L7RgtC+0LLRi9C5INGC0LXQsyBpbWcKCSAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICRhcmdzCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCQoJcHVibGljIGZ1bmN0aW9uIGdldEltZygkYXJncykgewoJCWlmIChlbXB0eSgkYXJncykgfHwgKCEkc3JjID0gJHRoaXMtPmdldFNyYygkYXJncykpKSB7CgkJCQoJCQlyZXR1cm4gJyc7CgkJfQkKCQkJCgkJCgkJaWYgKCR0aGlzLT5ub19hdHRyID09PSBmYWxzZSkgewoJCQkkd2lkdGggPSAJIWVtcHR5KCR0aGlzLT53aWR0aCkJIAk/CSd3aWR0aD0iJyAuICR0aGlzLT53aWR0aCAuICciJwkgCTogJyc7CgkJCSRoZWlnaHQgPSAJIWVtcHR5KCR0aGlzLT5oZWlnaHQpIAkJPwknaGVpZ2h0PSInIC4gJHRoaXMtPmhlaWdodCAuICciJwk6ICcnOwoJCX0gZWxzZSB7CgkJCSR3aWR0aCA9ICRoZWlnaHQgPSAnJzsJCgkJfQoJCSRhcnJfYXJncyA9ICR0aGlzLT5fYXJnczsKCQkkY2xhc3MgPSAJIWVtcHR5KCRhcnJfYXJnc1snY2xhc3MnXSkJPwknY2xhc3M9IicgLiB0cmltKCRhcnJfYXJnc1snY2xhc3MnXSkgLiAnIicgCTogJyc7CgkJJGFsdCA9IAkJIWVtcHR5KCRhcnJfYXJnc1snYWx0J10pCT8JdHJpbSgkYXJyX2FyZ3NbJ2FsdCddKQkJCQkJCTogJyc7CgkJCgkJJHJldCA9ICc8aW1nICcgLiAkY2xhc3MgLiAnIHNyYz0iJyAuICRzcmMgLiAnIiBhbHQ9IicgLiAkYWx0IC4gJyIgJyAuICR3aWR0aCAuICcgJyAuICRoZWlnaHQuICcgLz4nOwoJCQoJCXJldHVybiAkcmV0OwoJfQoKCgkvKioKCSAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0YHRi9C70LrRgy3QutCw0YDRgtC40L3QutGDCgkgKgogICAgICogQHBhcmFtIHN0cmluZyAgICAkYXJncwogICAgICogQHJldHVybiBzdHJpbmcKCSAqLwkKCXB1YmxpYyBmdW5jdGlvbiBnZXRMaW5rKCRhcmdzKSB7CgkJaWYgKGVtcHR5KCRhcmdzKSB8fCAoISRpbWcgPSAkdGhpcy0+Z2V0SW1nKCRhcmdzKSkpIHsKCQkJCgkJCXJldHVybiAnJzsKCQl9CQoJCSRyZXQgPSAnPGEgaHJlZj0iJyAuICR0aGlzLT5zcmMgLiAnIj4nIC4gJGltZyAuICc8L2E+JzsKCQoJCXJldHVybiAkcmV0OwoJfQkJCn0=