Find this useful? Enter your email to receive occasional updates for securing PHP code.
Signing you up...
Thank you for signing up!
PHP Decode
<?php /* MD5: e622d1e99f543321668714e109a5c882 */ eval(base64_decode('CiByZXF1aXJlX29uY2..
Decoded Output download
require_once(__DIR__ . '/lib/S360TemplateHelper.php'); $smarty->registerPlugin('function', 'gibPreisStringLocalizedSmarty', 'gibPreisStringLocalizedSmarty') ->registerPlugin('function', 'load_boxes', 'load_boxes') ->registerPlugin('function', 'load_boxes_raw', 'load_boxes_raw') ->registerPlugin('function', 'has_boxes', 'has_boxes') ->registerPlugin('function', 'image', 'get_img_tag') ->registerPlugin('function', 'getCheckBoxForLocation', 'getCheckBoxForLocation') ->registerPlugin('function', 'hasCheckBoxForLocation', 'hasCheckBoxForLocation') ->registerPlugin('function', 'aaURLEncode', 'aaURLEncode') ->registerPlugin('function', 'get_navigation', 'get_navigation') ->registerPlugin('function', 'ts_data', 'get_trustedshops_data') ->registerPlugin('function', 'get_category_array', 'get_category_array') ->registerPlugin('function', 'get_category_parents', 'get_category_parents') ->registerPlugin('function', 'prepare_image_details', 'prepare_image_details') ->registerPlugin('function', 'get_manufacturers', 'get_manufacturers') ->registerPlugin('function', 'get_cms_content', 'get_cms_content') ->registerPlugin('function', 'get_static_route', 'get_static_route') ->registerPlugin('function', 'hasOnlyListableVariations', 'hasOnlyListableVariations') ->registerPlugin('modifier', 'has_trans', 'has_translation') ->registerPlugin('modifier', 'trans', 'get_translation') ->registerPlugin('function', 'get_product_list', 'get_product_list') ->registerPlugin('function', 's360_get_shop_version', 's360_get_shop_version') ->registerPlugin('function', 's360_load_element', 's360_load_element') ->registerPlugin('function', 's360_detect_device', 's360_detect_device') ->registerPlugin('function', 's360_is_checkout', 's360_is_checkout') ->registerPlugin('function', 's360_load_global_setting', 's360_load_global_setting') ->registerPlugin('function', 's360_load_timestamp', 's360_load_timestamp') ->registerPlugin('function', 's360_load_special_link', 's360_load_special_link') ->registerPlugin('function', 's360_get_lpa_mode', 's360_get_lpa_mode') ->registerPlugin('function', 's360_get_lpa_button', 's360_get_lpa_button') ->registerPlugin('function', 's360_lang', 's360_lang') ->registerPlugin('function', 's360_is_ajax', 's360_is_ajax') ->registerPlugin('function', 's360_show_cms_nav', 's360_show_cms_nav'); function get_product_list($params, &$smarty) { $nLimit = isset($params['nLimit']) ? (int)$params['nLimit'] : 10; $nSortierung = isset($params['nSortierung']) ? (int)$params['nSortierung'] : 0; $cAssign = (isset($params['cAssign']) && strlen($params['cAssign']) > 0) ? $params['cAssign'] : 'oCustomArtikel_arr'; $cMerkmalFilter_arr = isset($params['cMerkmalFilter']) ? setzeMerkmalFilter(explode(';', $params['cMerkmalFilter'])) : null; $cSuchFilter_arr = isset($params['cSuchFilter']) ? setzeSuchFilter(explode(';', $params['cSuchFilter'])) : null; $cTagFilter_arr = isset($params['cTagFilter']) ? setzeTagFilter(explode(';', $params['cTagFilter'])) : null; $cParameter_arr = array( 'kKategorie' => isset($params['kKategorie']) ? $params['kKategorie'] : null, 'kHersteller' => isset($params['kHersteller']) ? $params['kHersteller'] : null, 'kArtikel' => isset($params['kArtikel']) ? $params['kArtikel'] : null, 'kVariKindArtikel' => isset($params['kVariKindArtikel']) ? $params['kVariKindArtikel'] : null, 'kSeite' => isset($params['kSeite']) ? $params['kSeite'] : null, 'kSuchanfrage' => isset($params['kSuchanfrage']) ? $params['kSuchanfrage'] : null, 'kMerkmalWert' => isset($params['kMerkmalWert']) ? $params['kMerkmalWert'] : null, 'kTag' => isset($params['kTag']) ? $params['kTag'] : null, 'kSuchspecial' => isset($params['kSuchspecial']) ? $params['kSuchspecial'] : null, 'kKategorieFilter' => isset($params['kKategorieFilter']) ? $params['kKategorieFilter'] : null, 'kHerstellerFilter' => isset($params['kHerstellerFilter']) ? $params['kHerstellerFilter'] : null, 'nBewertungSterneFilter' => isset($params['nBewertungSterneFilter']) ? $params['nBewertungSterneFilter'] : null, 'cPreisspannenFilter' => isset($params['cPreisspannenFilter']) ? $params['cPreisspannenFilter'] : null, 'kSuchspecialFilter' => isset($params['kSuchspecialFilter']) ? $params['kSuchspecialFilter'] : null, 'nSortierung' => $nSortierung, 'MerkmalFilter_arr' => $cMerkmalFilter_arr, 'TagFilter_arr' => $cTagFilter_arr, 'SuchFilter_arr' => $cSuchFilter_arr, 'nArtikelProSeite' => isset($params['nArtikelProSeite']) ? $params['nArtikelProSeite'] : null, 'cSuche' => isset($params['cSuche']) ? $params['cSuche'] : null, 'seite' => isset($params['seite']) ? $params['seite'] : null ); if ($cParameter_arr['kArtikel'] !== null) { $oArtikel_arr = array(); if (!is_array($cParameter_arr['kArtikel'])) { $cParameter_arr['kArtikel'] = array($cParameter_arr['kArtikel']); } foreach ($cParameter_arr['kArtikel'] as $kArtikel) { $article = new Artikel(); $article->fuelleArtikel($kArtikel, Artikel::getDefaultOptions()); $oArtikel_arr[] = $article; } } else { $NaviFilter = Shop::buildNaviFilter($cParameter_arr); if (isset($NaviFilter->Suche->cSuche) && strlen($NaviFilter->Suche->cSuche) > 0) { $NaviFilter->Suche->cSuche = StringHandler::filterXSS($NaviFilter->Suche->cSuche, 1); $NaviFilter->Suche->kSuchCache = bearbeiteSuchCache($NaviFilter); } if (isset($cParameter_arr['cArtAttrib']) && strlen($cParameter_arr['cArtAttrib']) > 0) { $NaviFilter->ArtikelAttributFilter->cArtAttrib = $cParameter_arr['cArtAttrib']; } $FilterSQL = bauFilterSQL($NaviFilter); $oArtikel_arr = gibArtikelKeys($FilterSQL, $nLimit, $NaviFilter, true, null); } $smarty->assign($cAssign, $oArtikel_arr); if (isset($params['bReturn'])) { return $oArtikel_arr; } } function get_static_route($params, &$smarty) { if (isset($params['id'])) { $full = !isset($params['full']) || $params['full'] === true; $secure = isset($params['secure']) && $params['secure'] === true; $url = LinkHelper::getInstance()->getStaticRoute($params['id'], $full, $secure); $qp = isset($params['params']) ? (array)$params['params'] : array(); if (count($qp) > 0) { $url = $url . (parse_url($url, PHP_URL_QUERY) ? '&' : '?') . http_build_query($qp, '', '&'); } if (isset($params['assign'])) { $smarty->assign($params['assign'], $url); } else { return $url; } } return false; } function get_manufacturers($params, &$smarty) { $helper = HerstellerHelper::getInstance(); $manufacturers = $helper->getManufacturers(); if (isset($params['assign'])) { $smarty->assign($params['assign'], $manufacturers); return; } return $manufacturers; } function load_boxes_raw($params, &$smarty) { if (isset($params['array'], $params['assign']) && $params['array'] === true) { $rawData = Boxen::getInstance()->getRawData(); $smarty->assign($params['assign'], (isset($rawData[$params['type']]) ? $rawData[$params['type']] : null)); } } function get_category_array($params, &$smarty) { $id = isset($params['categoryId']) ? (int)$params['categoryId'] : 0; if ($id === 0) { $categories = KategorieHelper::getInstance(); $list = $categories->combinedGetAll(); } else { $categories = new KategorieListe(); $list = $categories->getAllCategoriesOnLevel($id); } if (isset($params['categoryBoxNumber']) && (int)$params['categoryBoxNumber'] > 0) { $list2 = array(); foreach ($list as $key => $oList) { if (isset($oList->categoryFunctionAttributes[KAT_ATTRIBUT_KATEGORIEBOX]) && $oList->categoryFunctionAttributes[KAT_ATTRIBUT_KATEGORIEBOX] == $params['categoryBoxNumber'] ) { $list2[$key] = $oList; } } $list = $list2; } if (isset($params['assign'])) { $smarty->assign($params['assign'], $list); return; } return $list; } function get_category_parents($params, &$smarty) { $id = isset($params['categoryId']) ? (int)$params['categoryId'] : 0; $category = new Kategorie($id); $categories = new KategorieListe(); $list = $categories->getOpenCategories($category); array_shift($list); $list = array_reverse($list); if (isset($params['assign'])) { $smarty->assign($params['assign'], $list); return; } return $list; } function get_img_tag($params, &$smarty) { if (empty($params['src'])) { return ''; } $oImgSize = get_image_size($params['src']); $imageURL = $params['src']; $imageID = isset($params['id']) ? ' id="' . $params['id'] . '"' : ''; $imageALT = isset($params['alt']) ? ' alt="' . truncate($params['alt'], 75) . '"' : ''; $imageTITLE = isset($params['title']) ? ' title="' . truncate($params['title'], 75) . '"' : ''; $imageCLASS = isset($params['class']) ? ' class="' . truncate($params['class'], 75) . '"' : ''; if ($oImgSize !== null && $oImgSize->size->width > 0 && $oImgSize->size->height > 0) { return '<img src="' . $imageURL . '" width="' . $oImgSize->size->width . '" height="' . $oImgSize->size->height . '"' . $imageID . $imageALT . $imageTITLE . $imageCLASS . ' />'; } return '<img src="' . $imageURL . '"' . $imageID . $imageALT . $imageTITLE . $imageCLASS . ' />'; } function load_boxes($params, &$smarty) { $cTplData = ''; $cOldTplDir = ''; $boxes = Boxen::getInstance(); $oBoxen_arr = $boxes->compatGet(); $cTemplateDir = $smarty->getTemplateDir($smarty->context); if (is_array($oBoxen_arr) && isset($params['type'])) { $cType = $params['type']; $_sBoxes = $smarty->getTemplateVars('boxes'); if (isset($_sBoxes[$cType], $oBoxen_arr[$cType]) && is_array($oBoxen_arr[$cType])) { foreach ($oBoxen_arr[$cType] as $oBox) { $oPluginVar = ''; $cTemplate = 'tpl_inc/boxes/' . $oBox->cTemplate; if ($oBox->eTyp === 'plugin') { $oPlugin = new Plugin($oBox->kCustomID); if ($oPlugin->kPlugin > 0 && $oPlugin->nStatus == 2) { $cTemplate = $oBox->cTemplate; $cOldTplDir = $cTemplateDir; $cTemplateDir = $oPlugin->cFrontendPfad . PFAD_PLUGIN_BOXEN; $oPluginVar = 'oPlugin' . $oBox->kBox; $smarty->assign($oPluginVar, $oPlugin); } } elseif ($oBox->eTyp === 'link') { foreach (LinkHelper::getInstance()->getLinkGroups() as $oLinkTpl) { if ($oLinkTpl->kLinkgruppe == $oBox->kCustomID) { $oBox->oLinkGruppeTemplate = $oLinkTpl; $oBox->oLinkGruppe = $oLinkTpl; } } } if (file_exists($cTemplateDir . '/' . $cTemplate)) { $oBoxVar = 'oBox' . $oBox->kBox; $smarty->assign($oBoxVar, $oBox); global $Einstellungen; if ($Einstellungen['template']['general']['use_customtpl'] === 'Y') { $cTemplatePath = pathinfo($cTemplate); $cCustomTemplate = $cTemplatePath['dirname'] . '/' . $cTemplatePath['filename'] . '_custom.tpl'; if (file_exists($cTemplateDir . '/' . $cCustomTemplate)) { $cTemplate = $cCustomTemplate; } } $cTemplatePath = $cTemplateDir . '/' . $cTemplate; if ($oBox->eTyp === 'plugin') { $cTplData .= "{include file='" . $cTemplatePath . "' oBox=\$$oBoxVar oPlugin=\$$oPluginVar}"; } else { $cTplData .= "{include file='" . $cTemplatePath . "' oBox=\$$oBoxVar}"; } if (strlen($cOldTplDir)) { $cTemplateDir = $cOldTplDir; } } } } } if (isset($params['assign'])) { $smarty->assign($params['assign'], $cTplData); return; } return $cTplData; } function has_boxes($params, &$smarty) { $boxes = Boxen::getInstance(); $smarty->assign($params['assign'], isset($boxes->boxes[$params['position']])); } function truncate($text, $numb) { if (strlen($text) > $numb) { $text = substr($text, 0, $numb); $text = substr($text, 0, strrpos($text, ' ')); $text .= '...'; } return $text; } function gibPreisStringLocalizedSmarty($params, &$smarty) { $oAufpreis = new stdClass(); if ((float)$params['fAufpreisNetto'] != 0) { $fAufpreisNetto = (float)$params['fAufpreisNetto']; $fVKNetto = (float)$params['fVKNetto']; $kSteuerklasse = (int)$params['kSteuerklasse']; $fVPEWert = (float)$params['fVPEWert']; $cVPEEinheit = $params['cVPEEinheit']; $FunktionsAttribute_arr = $params['FunktionsAttribute']; $nGenauigkeit = (isset($FunktionsAttribute_arr[FKT_ATTRIBUT_GRUNDPREISGENAUIGKEIT]) && (int)$FunktionsAttribute_arr[FKT_ATTRIBUT_GRUNDPREISGENAUIGKEIT] > 0) ? (int)$FunktionsAttribute_arr[FKT_ATTRIBUT_GRUNDPREISGENAUIGKEIT] : 2; if ((int)$params['nNettoPreise'] === 1) { $oAufpreis->cAufpreisLocalized = gibPreisStringLocalized($fAufpreisNetto); $oAufpreis->cPreisInklAufpreis = gibPreisStringLocalized($fAufpreisNetto + $fVKNetto); $oAufpreis->cAufpreisLocalized = ($fAufpreisNetto > 0) ? ('+ ' . $oAufpreis->cAufpreisLocalized) : str_replace('-', '- ', $oAufpreis->cAufpreisLocalized); if ($fVPEWert > 0) { $oAufpreis->cPreisVPEWertAufpreis = gibPreisStringLocalized( $fAufpreisNetto / $fVPEWert, $_SESSION['Waehrung'], 1, $nGenauigkeit ) . ' ' . Shop::Lang()->get('vpePer', 'global') . ' ' . $cVPEEinheit; $oAufpreis->cPreisVPEWertInklAufpreis = gibPreisStringLocalized( ($fAufpreisNetto + $fVKNetto) / $fVPEWert, $_SESSION['Waehrung'], 1, $nGenauigkeit ) . ' ' . Shop::Lang()->get('vpePer', 'global') . ' ' . $cVPEEinheit; $oAufpreis->cAufpreisLocalized = $oAufpreis->cAufpreisLocalized . ', ' . $oAufpreis->cPreisVPEWertAufpreis; $oAufpreis->cPreisInklAufpreis = $oAufpreis->cPreisInklAufpreis . ', ' . $oAufpreis->cPreisVPEWertInklAufpreis; } } else { $oAufpreis->cAufpreisLocalized = gibPreisStringLocalized(berechneBrutto($fAufpreisNetto, $_SESSION['Steuersatz'][$kSteuerklasse])); $oAufpreis->cPreisInklAufpreis = gibPreisStringLocalized(berechneBrutto($fAufpreisNetto + $fVKNetto, $_SESSION['Steuersatz'][$kSteuerklasse])); $oAufpreis->cAufpreisLocalized = ($fAufpreisNetto > 0) ? ('+ ' . $oAufpreis->cAufpreisLocalized) : str_replace('-', '- ', $oAufpreis->cAufpreisLocalized); if ($fVPEWert > 0) { $oAufpreis->cPreisVPEWertAufpreis = gibPreisStringLocalized( berechneBrutto($fAufpreisNetto / $fVPEWert, $_SESSION['Steuersatz'][$kSteuerklasse]), $_SESSION['Waehrung'], 1, $nGenauigkeit ) . ' ' . Shop::Lang()->get('vpePer', 'global') . ' ' . $cVPEEinheit; $oAufpreis->cPreisVPEWertInklAufpreis = gibPreisStringLocalized( berechneBrutto( ($fAufpreisNetto + $fVKNetto) / $fVPEWert, $_SESSION['Steuersatz'][$kSteuerklasse] ), $_SESSION['Waehrung'], 1, $nGenauigkeit ) . ' ' . Shop::Lang()->get('vpePer', 'global') . ' ' . $cVPEEinheit; $oAufpreis->cAufpreisLocalized = $oAufpreis->cAufpreisLocalized . ', ' . $oAufpreis->cPreisVPEWertAufpreis; $oAufpreis->cPreisInklAufpreis = $oAufpreis->cPreisInklAufpreis . ', ' . $oAufpreis->cPreisVPEWertInklAufpreis; } } } return (isset($params['bAufpreise']) && (int)$params['bAufpreise'] > 0) ? $oAufpreis->cAufpreisLocalized : $oAufpreis->cPreisInklAufpreis; } function hasCheckBoxForLocation($params, &$smarty) { require_once PFAD_ROOT . PFAD_CLASSES . 'class.JTL-Shop.CheckBox.php'; $oCheckBox = new CheckBox(); $oCheckBox_arr = $oCheckBox->getCheckBoxFrontend((int)$params['nAnzeigeOrt'], 0, true, true); $smarty->assign($params['bReturn'], count($oCheckBox_arr) > 0); } function getCheckBoxForLocation($params, &$smarty) { $cid = 'cb_' . (int)$params['nAnzeigeOrt'] . '_' . (int)$_SESSION['kSprache']; if (Shop::has($cid)) { $oCheckBox_arr = Shop::get($cid); } else { $oCheckBox = new CheckBox(); $oCheckBox_arr = $oCheckBox->getCheckBoxFrontend((int)$params['nAnzeigeOrt'], 0, true, true); } if (count($oCheckBox_arr) > 0) { $linkHelper = LinkHelper::getInstance(); foreach ($oCheckBox_arr as $oCheckBox) { $cLinkURL = ''; $cLinkURLFull = ''; if ($oCheckBox->kLink > 0) { $page = $linkHelper->findCMSLinkInSession($oCheckBox->oLink->kLink); if (!empty($page->URL)) { $cLinkURL = $page->URL; $cLinkURLFull = $page->cURLFull; } else { $cLinkURL = baueURL($oCheckBox->oLink, URLART_SEITE); } } $bError = isset($params['cPlausi_arr'][$oCheckBox->cID]); $cPost_arr = $params['cPost_arr']; $oCheckBox->isActive = false; if (isset($cPost_arr[$oCheckBox->cID])) { $oCheckBox->isActive = true; } $oCheckBox->cName = $oCheckBox->oCheckBoxSprache_arr[$_SESSION['kSprache']]->cText; if (strlen($cLinkURL) > 0) { $oCheckBox->cLinkURL = $cLinkURL; } $oCheckBox->cLinkURLFull = $cLinkURLFull; if (isset($oCheckBox->oCheckBoxSprache_arr[$_SESSION['kSprache']]->cBeschreibung) && strlen($oCheckBox->oCheckBoxSprache_arr[$_SESSION['kSprache']]->cBeschreibung) > 0 ) { $oCheckBox->cBeschreibung = $oCheckBox->oCheckBoxSprache_arr[$_SESSION['kSprache']]->cBeschreibung; } if ($bError) { $oCheckBox->cErrormsg = Shop::Lang()->get('pleasyAccept', 'account data'); } } Shop::set($cid, $oCheckBox_arr); if (isset($params['assign'])) { $smarty->assign($params['assign'], $oCheckBox_arr); } } } function aaURLEncode($params, &$smarty) { $bReset = (isset($params['nReset']) && (int)$params['nReset'] === 1); $cURL = $_SERVER['REQUEST_URI']; $cParameter_arr = array('&aaParams', '?aaParams', '&aaReset', '?aaReset'); $aaEnthalten = false; foreach ($cParameter_arr as $cParameter) { $aaEnthalten = strpos($cURL, $cParameter); if ($aaEnthalten !== false) { $cURL = substr($cURL, 0, $aaEnthalten); break; } $aaEnthalten = false; } if ($aaEnthalten !== false) { $cURL = substr($cURL, 0, $aaEnthalten); } if (isset($params['bUrlOnly']) && (int)$params['bUrlOnly'] === 1) { return $cURL; } $cParams = ''; unset($params['nReset']); if (is_array($params) && count($params) > 0) { foreach ($params as $key => $param) { $cParams .= $key . '=' . $param . ';'; } } if (strpos($cURL, '?') !== false) { $cURL .= $bReset ? '&aaReset=' : '&aaParams='; } else { $cURL .= $bReset ? '?aaReset=' : '?aaParams='; } return $cURL . base64_encode($cParams); } function get_navigation($params, &$smarty) { $linkgroupIdentifier = $params['linkgroupIdentifier']; $oLinkGruppe = null; if (strlen($linkgroupIdentifier) > 0) { $linkGroups = LinkHelper::getInstance()->getLinkGroups(); $oLinkGruppe = isset($linkGroups->{$linkgroupIdentifier}) ? $linkGroups->{$linkgroupIdentifier} : null; } if (is_object($oLinkGruppe) && isset($params['assign'])) { $smarty->assign($params['assign'], build_navigation_subs($oLinkGruppe)); } } function build_navigation_subs($oLink_arr, $kVaterLink = 0) { $oNew_arr = array(); if ($oLink_arr->cName !== 'hidden') { $cISO = $_SESSION['cISOSprache']; foreach ($oLink_arr->Links as &$oLink) { if ($oLink->kVaterLink == $kVaterLink) { $oLink->oSub_arr = build_navigation_subs($oLink_arr, $oLink->kLink); $oLink->bIsActive = false; if (isset($GLOBALS['kLink']) && $GLOBALS['kLink'] == $oLink->kLink) { $oLink->bIsActive = true; } $cTitle = ''; if (isset($oLink->cLocalizedTitle[$cISO]) && $oLink->cLocalizedTitle[$cISO] != $oLink->cLocalizedName[$cISO]) { $cTitle = StringHandler::htmlentities($oLink->cLocalizedTitle[$cISO], ENT_QUOTES); } $oLink->cTitle = $cTitle; $oNew_arr[] = $oLink; } } } return $oNew_arr; } function get_trustedshops_data($params, &$smarty) { require_once PFAD_ROOT . PFAD_CLASSES . 'class.JTL-Shop.TrustedShops.php'; $oTrustedShops = new TrustedShops(-1, StringHandler::convertISO2ISO639($_SESSION['cISOSprache'])); $value['tsId'] = $oTrustedShops->tsId; $value['nAktiv'] = $oTrustedShops->nAktiv; $smarty->assign($params['assign'], $value); } function prepare_image_details($params, &$smarty) { if (!isset($params['item'])) { return null; } $result = array( 'xs' => get_image_size($params['item']->cPfadMini), 'sm' => get_image_size($params['item']->cPfadKlein), 'md' => get_image_size($params['item']->cPfadNormal), 'lg' => get_image_size($params['item']->cPfadGross) ); if (isset($params['type'])) { $type = $params['type']; if (isset($result[$type])) { $result = $result[$type]; } } $result = (object)$result; return (isset($params['json']) && $params['json']) ? json_encode($result, JSON_FORCE_OBJECT) : $result; } function get_image_size($image) { $path = (strpos($image, PFAD_BILDER) === 0) ? PFAD_ROOT . $image : $image; if (!file_exists($path)) { $req = MediaImage::toRequest($path); if (!is_object($req)) { return null; } $settings = Image::getSettings(); $refImage = $req->getRaw(); if ($refImage === null) { return null; } list($width, $height, $type, $attr) = getimagesize($refImage); $size = $settings['size'][$req->getSizeType()]; $max_width = $size['width']; $max_height = $size['height']; $old_width = $width; $old_height = $height; $scale = min($max_width / $old_width, $max_height / $old_height); $width = ceil($scale * $old_width); $height = ceil($scale * $old_height); } else { list($width, $height, $type, $attr) = getimagesize($path); } return (object)array( 'src' => $image, 'size' => (object)array( 'width' => $width, 'height' => $height ), 'type' => $type ); } function get_cms_content($params, &$smarty) { if (isset($params['kLink']) && (int)$params['kLink'] > 0) { $kLink = (int)$params['kLink']; $linkHelper = LinkHelper::getInstance(); $oLink = $linkHelper->getPageLink($kLink); $oLink->Sprache = $linkHelper->getPageLinkLanguage($oLink->kLink); if (isset($params['assign'])) { $smarty->assign($params['assign'], $oLink->Sprache->cContent); } else { return $oLink->Sprache->cContent; } } return null; } function hasOnlyListableVariations($params, &$smarty) { if (!isset($params['artikel']->Variationen) || Shop::getVersion() < 406) { if (isset($params['assign'])) { $smarty->assign($params['assign'], 0); return null; } return 0; } $maxVariationCount = isset($params['maxVariationCount']) ? (int)$params['maxVariationCount'] : 1; $maxWerteCount = isset($params['maxWerteCount']) ? (int)$params['maxWerteCount'] : 3; $variationCheck = function ($Variationen, $maxVariationCount, $maxWerteCount) { $result = true; $varCount = is_array($Variationen) ? count($Variationen) : 0; if ($varCount > 0 && $varCount <= $maxVariationCount) { foreach ($Variationen as $oVariation) { if ($oVariation->cTyp !== 'SELECTBOX' && (!in_array($oVariation->cTyp, ['TEXTSWATCHES', 'IMGSWATCHES', 'RADIO'], true) || count($oVariation->Werte) > $maxWerteCount) ) { $result = false; break; } } } else { $result = false; } return $result; }; $result = $variationCheck($params['artikel']->Variationen, $maxVariationCount, $maxWerteCount) ? 1 : 0; if ($result === 0 && $params['artikel']->kVaterArtikel > 0) { $result = $variationCheck($params['artikel']->oVariationenNurKind_arr, $maxVariationCount, $maxWerteCount) ? 2 : 0; } if (isset($params['assign'])) { $smarty->assign($params['assign'], $result); return null; } return $result; } function get_translation($mixed, $to = null) { $to = $to ?: Shop::getLanguage(true); if (has_translation($mixed, $to)) { return is_string($mixed) ? $mixed : $mixed[$to]; } return null; } function has_translation($mixed, $to = null) { $to = $to ?: Shop::getLanguage(true); return is_string($mixed) ?: isset($mixed[$to]); } function s360_load_element($params, &$smarty) { $type = $params['type']; $id = $params['id']; $area = $params['area']; $key = null; if (isset($params['key'])) { $key = $params['key']; } if (empty($type) || empty($id) || empty($area)) { return ''; } return S360TemplateHelper::renderElement($type, $id, $area, $key); } function s360_get_shop_version($params, &$smarty) { $result = (int)Shop::getVersion(); if (isset($params['assignTo']) && $params['assignTo'] !== '') { $smarty->assign($params['assignTo'], $result); return ''; } return $result; } function s360_detect_device($params, &$smarty) { return S360TemplateHelper::detectDevice(); } function s360_is_checkout($params, &$smarty) { $result = (Shop::getPageType() === PAGE_BESTELLVORGANG); if (isset($params['assignTo']) && $params['assignTo'] !== '') { $smarty->assign($params['assignTo'], $result); return ''; } return $result; } function s360_load_global_setting($params, &$smarty) { $type = $params['type']; $result = null; if (empty($type)) { $result = ''; } else { if (Shop::get('s360_global_setting_' . $type) !== null) { $result = Shop::get('s360_global_setting_' . $type); } else { $result = S360TemplateHelper::loadGlobalSetting($type); Shop::set('s360_global_setting_' . $type, $result); } } if (isset($params['assignTo']) && $params['assignTo'] !== '') { $smarty->assign($params['assignTo'], $result); return ''; } return $result; } function s360_load_timestamp($params, &$smarty) { if (Shop::get('s360_less_timestamp') !== null) { return Shop::get('s360_less_timestamp'); } $timestamp = S360TemplateHelper::loadTimestamp(); Shop::set('s360_less_timestamp', $timestamp); return $timestamp; } function s360_load_special_link($params, &$smarty) { $type = $params['type']; $assign = $params['assignTo']; $res = Shop::DB()->select('tlink', 'nLinkArt', $type); if (!empty($res)) { $oLink = new Link($res->kLink); if (!empty($assign)) { $smarty->assign($assign, $oLink); Shop::Smarty()->assign($assign, $oLink); } } return ''; } function s360_get_lpa_mode($params, &$smarty) { if (Shop::get('s360_easytemplate_lpa_mode') !== null) { return Shop::get('s360_easytemplate_lpa_mode'); } $plugin = Plugin::getPluginById('s360_amazon_lpa_shop4'); if ($plugin === null) { Shop::set('s360_easytemplate_lpa_mode', ''); return ''; } if ($plugin->nStatus !== 2) { Shop::set('s360_easytemplate_lpa_mode', ''); return ''; } require_once($plugin->cFrontendPfad . 'lib/lpa_defines.php'); if ($plugin->oPluginEinstellungAssoc_arr[S360_LPA_CONFKEY_GENERAL_ACTIVE] == 0) { Shop::set('s360_easytemplate_lpa_mode', ''); return ''; } if ($plugin->oPluginEinstellungAssoc_arr[S360_LPA_CONFKEY_HIDDENBUTTONS_ACTIVE] == 1 && !isset($_GET['lpa-show'])) { Shop::set('s360_easytemplate_lpa_mode', ''); return ''; } $mode = $plugin->oPluginEinstellungAssoc_arr[S360_LPA_CONFKEY_GENERAL_MODE]; if ($mode !== 'l') { $checkoutPossible = true; if (!isset($_SESSION["Warenkorb"]) || $_SESSION["Warenkorb"]->istBestellungMoeglich() !== 10) { $checkoutPossible = false; } elseif (isset($_SESSION["Warenkorb"])) { foreach ($_SESSION['Warenkorb']->PositionenArr as $oPosition) { if ((int)$oPosition->nPosTyp === (int)C_WARENKORBPOS_TYP_ARTIKEL && is_object($oPosition->Artikel)) { if (isset($oPosition->Artikel->FunktionsAttribute['exclude_amapay']) || isset($oPosition->Artikel->AttributeAssoc['exclude_amapay'])) { $checkoutPossible = false; break; } } } } if (!$checkoutPossible) { $mode = str_replace('p', '', $mode); } } Shop::set('s360_easytemplate_lpa_mode', $mode); return $mode; } function s360_get_lpa_button($params, &$smarty) { $type = $params['type']; $mode = s360_get_lpa_mode($params, $smarty); if (empty($mode) || ($type !== 'pay' && $type !== 'login')) { return ''; } if ($type === 'pay' && $mode === 'l') { return ''; } if ($type === 'login' && $mode === 'p') { return ''; } $oPlugin = Plugin::getPluginById('s360_amazon_lpa_shop4'); if (empty($oPlugin)) { return ''; } require_once($oPlugin->cFrontendPfad . 'lib/lpa_defines.php'); require_once($oPlugin->cFrontendPfad . 'lib/lpa_utils.php'); require_once($oPlugin->cFrontendPfad . 'lib/class.LPAController.php'); require_once($oPlugin->cFrontendPfad . 'lib/class.LPARenderHelper.php'); $controller = new LPAController(); $config = $controller->getConfig(); $scope = "profile payments:widget payments:shipping_address"; $language_suffix = ''; $lpa_language_code = "de-DE"; if (Shop::getLanguage(true) === "eng") { $language_suffix = '-en'; $lpa_language_code = 'en-GB'; } $lpa_ajax_urls = array(); $lpa_ajax_urls['delivery_selection'] = $oPlugin->cFrontendPfadURLSSL . 'ajax/lpa_ajax_update_delivery_selection.php'; $lpa_ajax_urls['update_selected_shipping_method'] = $oPlugin->cFrontendPfadURLSSL . 'ajax/lpa_ajax_update_selected_shipping_method.php'; $lpa_ajax_urls['confirm_order'] = $oPlugin->cFrontendPfadURLSSL . 'ajax/lpa_ajax_confirm_order.php'; $lpa_ajax_urls['select_account_address'] = $oPlugin->cFrontendPfadURLSSL . 'ajax/lpa_ajax_select_account_address.php'; $lpa_other_urls['checkout'] = Shop::getURL(true) . '/lpacheckout' . $language_suffix; $completeUrlLocalized = str_replace("http://", "https://", Shop::getURL()) . '/lpacomplete' . $language_suffix; $lpa_other_urls['complete_localized'] = $completeUrlLocalized; $basePath = lpaGetShopBasePath(); if (empty($basePath) || $basePath === '/') { $basePath = ''; } $lpa_paybutton_css_link = $oPlugin->cFrontendPfadURLSSL . 'css/lpa-pay-button.css'; $lpa_paybutton_css_custom_link = ''; if (file_exists($oPlugin->cFrontendPfad . 'css/lpa-pay-button_custom.css')) { $lpa_paybutton_css_custom_link = $oPlugin->cFrontendPfadURLSSL . 'css/lpa-pay-button_custom.css'; } $lpa_tooltip_css_link = $oPlugin->cFrontendPfadURLSSL . 'css/lpa-tooltip.css'; $lpa_tooltip_css_custom_link = ''; if (file_exists($oPlugin->cFrontendPfad . 'css/lpa-tooltip_custom.css')) { $lpa_tooltip_css_custom_link = $oPlugin->cFrontendPfadURLSSL . 'css/lpa-tooltip_custom.css'; } $lpa_loginbutton_css_link = $oPlugin->cFrontendPfadURLSSL . 'css/lpa-login-button.css'; $lpa_loginbutton_css_custom_link = ''; if (file_exists($oPlugin->cFrontendPfad . 'css/lpa-login-button_custom.css')) { $lpa_loginbutton_css_custom_link = $oPlugin->cFrontendPfadURLSSL . 'css/lpa-login-button_custom.css'; } $loginRedirectUri = null; if($type === 'pay') { $loginRedirectUri = Shop::getURL(true) . '/lpacheckout' . $language_suffix; } else { $loginRedirectUri = Shop::getURL(true) . '/lpalogin' . $language_suffix; } Shop::Smarty()->assign('lpa_client_id', $config['client_id']) ->assign('lpa_widget_endpoint', $controller->getEndpointFor($config, 'widgetURL')) ->assign('lpa_login_redirect_uri', $loginRedirectUri) ->assign('lpa_seller_id', $config['merchant_id']) ->assign('lpa_general_hiddenbuttons_active', false) ->assign('lpa_sandbox_mode', (int)$config['sandbox']) ->assign('lpa_button_scope', $scope) ->assign('lpa_button_tooltip', $oPlugin->oPluginSprachvariableAssoc_arr[S360_LPA_LANGKEY_TOOLTIP]) ->assign('lpa_ajax_urls', $lpa_ajax_urls) ->assign('lpa_other_urls', $lpa_other_urls) ->assign('lpa_language_code', $lpa_language_code) ->assign('lpa_shop_base_path', $basePath) ->assign('lpa_button_idx', '_ajax_' . mt_rand(1000, 10000)) ->assign('lpa_paybutton_css_link', $lpa_paybutton_css_link) ->assign('lpa_paybutton_css_custom_link', $lpa_paybutton_css_custom_link) ->assign('lpa_tooltip_css_link', $lpa_tooltip_css_link) ->assign('lpa_tooltip_css_custom_link', $lpa_tooltip_css_custom_link) ->assign('lpa_loginbutton_css_link', $lpa_loginbutton_css_link) ->assign('lpa_loginbutton_css_custom_link', $lpa_loginbutton_css_custom_link) ->assign('lpa_button_popup', 'false'); if ($type === 'pay') { Shop::Smarty()->assign('lpa_button_type', $oPlugin->oPluginEinstellungAssoc_arr[S360_LPA_CONFKEY_PAYBUTTON_TYPE]) ->assign('lpa_button_color', $oPlugin->oPluginEinstellungAssoc_arr[S360_LPA_CONFKEY_PAYBUTTON_COLOR]) ->assign('lpa_button_size', $oPlugin->oPluginEinstellungAssoc_arr[S360_LPA_CONFKEY_PAYBUTTON_SIZE]); } else { Shop::Smarty()->assign('lpa_button_type', $oPlugin->oPluginEinstellungAssoc_arr[S360_LPA_CONFKEY_LOGINBUTTON_TYPE]) ->assign('lpa_button_color', $oPlugin->oPluginEinstellungAssoc_arr[S360_LPA_CONFKEY_LOGINBUTTON_COLOR]) ->assign('lpa_button_size', $oPlugin->oPluginEinstellungAssoc_arr[S360_LPA_CONFKEY_LOGINBUTTON_SIZE]); } return Shop::Smarty()->fetch(__DIR__ . '/../solution360/lpa_ajax_fallback.tpl'); } function s360_lang($params, &$smarty) { $fallback = array( 'et360_lpa_or' => array( 'ger' => 'oder', 'eng' => 'or', 'fre' => 'ou', 'pol' => 'lub', 'dut' => 'of', 'dan' => 'eller', 'cze' => 'nebo' ), 'et360_lpa_checkout_with_amazon' => array( 'ger' => 'Bezahlen Sie mit Ihrem Amazon-Konto', 'eng' => 'Check out using your Amazon account' ), 'et360_logo_hint' => array( 'ger' => 'Setze Dein Shop-Logo unter Storefront -> Shop-Logo im Shop-Backend!' ), 'et360_lpa_banner_left' => array( 'ger' => 'Wir akzeptieren', 'eng' => 'We accept' ), 'et360_lpa_banner_right' => array( 'ger' => 'Mit Amazon Pay können Sie die Zahlungs- und Adressinformationen aus Ihrem Amazon Account nutzen, um in diesem Shop schnell und sicher einzukaufen.', 'eng' => 'With Amazon Pay, you can use the payment and shipping information stored in your Amazon account to shop quickly, safely, and securely on this site.' ) ); $key = $params['key']; $value = Shop::Lang()->get($key, 'custom'); if ($value === '#custom.' . $key . '#') { $lang = strtolower(Shop::getLanguage(true)); if (isset($fallback[$key]) && isset($fallback[$key][$lang])) { return $fallback[$key][$lang]; } return $value; } return $value; } function s360_is_ajax($params, &$smarty) { $smarty->assign($params['assignTo'], isAjaxRequest()); } function s360_show_cms_nav($params, &$smarty) { $result = true; $uri = Shop::getRequestUri(); if (stripos($uri, 'lpalogin') !== false || stripos($uri, 'lpacheckout') !== false || stripos($uri, 'lpacomplete') !== false || stripos($uri, 'lpamerge') !== false || stripos($uri, 'lpacreate') !== false ) { $result = false; } if (isset($params['assignTo'])) { $smarty->assign($params['assignTo'], $result); return null; } return $result; }
Did this file decode correctly?
Original Code
<?php
/* MD5: e622d1e99f543321668714e109a5c882 */
eval(base64_decode('CiByZXF1aXJlX29uY2UoX19ESVJfXyAuICcvbGliL1MzNjBUZW1wbGF0ZUhlbHBlci5waHAnKTsgJHNtYXJ0eS0+cmVnaXN0ZXJQbHVnaW4oJ2Z1bmN0aW9uJywgJ2dpYlByZWlzU3RyaW5nTG9jYWxpemVkU21hcnR5JywgJ2dpYlByZWlzU3RyaW5nTG9jYWxpemVkU21hcnR5JykgLT5yZWdpc3RlclBsdWdpbignZnVuY3Rpb24nLCAnbG9hZF9ib3hlcycsICdsb2FkX2JveGVzJykgLT5yZWdpc3RlclBsdWdpbignZnVuY3Rpb24nLCAnbG9hZF9ib3hlc19yYXcnLCAnbG9hZF9ib3hlc19yYXcnKSAtPnJlZ2lzdGVyUGx1Z2luKCdmdW5jdGlvbicsICdoYXNfYm94ZXMnLCAnaGFzX2JveGVzJykgLT5yZWdpc3RlclBsdWdpbignZnVuY3Rpb24nLCAnaW1hZ2UnLCAnZ2V0X2ltZ190YWcnKSAtPnJlZ2lzdGVyUGx1Z2luKCdmdW5jdGlvbicsICdnZXRDaGVja0JveEZvckxvY2F0aW9uJywgJ2dldENoZWNrQm94Rm9yTG9jYXRpb24nKSAtPnJlZ2lzdGVyUGx1Z2luKCdmdW5jdGlvbicsICdoYXNDaGVja0JveEZvckxvY2F0aW9uJywgJ2hhc0NoZWNrQm94Rm9yTG9jYXRpb24nKSAtPnJlZ2lzdGVyUGx1Z2luKCdmdW5jdGlvbicsICdhYVVSTEVuY29kZScsICdhYVVSTEVuY29kZScpIC0+cmVnaXN0ZXJQbHVnaW4oJ2Z1bmN0aW9uJywgJ2dldF9uYXZpZ2F0aW9uJywgJ2dldF9uYXZpZ2F0aW9uJykgLT5yZWdpc3RlclBsdWdpbignZnVuY3Rpb24nLCAndHNfZGF0YScsICdnZXRfdHJ1c3RlZHNob3BzX2RhdGEnKSAtPnJlZ2lzdGVyUGx1Z2luKCdmdW5jdGlvbicsICdnZXRfY2F0ZWdvcnlfYXJyYXknLCAnZ2V0X2NhdGVnb3J5X2FycmF5JykgLT5yZWdpc3RlclBsdWdpbignZnVuY3Rpb24nLCAnZ2V0X2NhdGVnb3J5X3BhcmVudHMnLCAnZ2V0X2NhdGVnb3J5X3BhcmVudHMnKSAtPnJlZ2lzdGVyUGx1Z2luKCdmdW5jdGlvbicsICdwcmVwYXJlX2ltYWdlX2RldGFpbHMnLCAncHJlcGFyZV9pbWFnZV9kZXRhaWxzJykgLT5yZWdpc3RlclBsdWdpbignZnVuY3Rpb24nLCAnZ2V0X21hbnVmYWN0dXJlcnMnLCAnZ2V0X21hbnVmYWN0dXJlcnMnKSAtPnJlZ2lzdGVyUGx1Z2luKCdmdW5jdGlvbicsICdnZXRfY21zX2NvbnRlbnQnLCAnZ2V0X2Ntc19jb250ZW50JykgLT5yZWdpc3RlclBsdWdpbignZnVuY3Rpb24nLCAnZ2V0X3N0YXRpY19yb3V0ZScsICdnZXRfc3RhdGljX3JvdXRlJykgLT5yZWdpc3RlclBsdWdpbignZnVuY3Rpb24nLCAnaGFzT25seUxpc3RhYmxlVmFyaWF0aW9ucycsICdoYXNPbmx5TGlzdGFibGVWYXJpYXRpb25zJykgLT5yZWdpc3RlclBsdWdpbignbW9kaWZpZXInLCAnaGFzX3RyYW5zJywgJ2hhc190cmFuc2xhdGlvbicpIC0+cmVnaXN0ZXJQbHVnaW4oJ21vZGlmaWVyJywgJ3RyYW5zJywgJ2dldF90cmFuc2xhdGlvbicpIC0+cmVnaXN0ZXJQbHVnaW4oJ2Z1bmN0aW9uJywgJ2dldF9wcm9kdWN0X2xpc3QnLCAnZ2V0X3Byb2R1Y3RfbGlzdCcpIC0+cmVnaXN0ZXJQbHVnaW4oJ2Z1bmN0aW9uJywgJ3MzNjBfZ2V0X3Nob3BfdmVyc2lvbicsICdzMzYwX2dldF9zaG9wX3ZlcnNpb24nKSAtPnJlZ2lzdGVyUGx1Z2luKCdmdW5jdGlvbicsICdzMzYwX2xvYWRfZWxlbWVudCcsICdzMzYwX2xvYWRfZWxlbWVudCcpIC0+cmVnaXN0ZXJQbHVnaW4oJ2Z1bmN0aW9uJywgJ3MzNjBfZGV0ZWN0X2RldmljZScsICdzMzYwX2RldGVjdF9kZXZpY2UnKSAtPnJlZ2lzdGVyUGx1Z2luKCdmdW5jdGlvbicsICdzMzYwX2lzX2NoZWNrb3V0JywgJ3MzNjBfaXNfY2hlY2tvdXQnKSAtPnJlZ2lzdGVyUGx1Z2luKCdmdW5jdGlvbicsICdzMzYwX2xvYWRfZ2xvYmFsX3NldHRpbmcnLCAnczM2MF9sb2FkX2dsb2JhbF9zZXR0aW5nJykgLT5yZWdpc3RlclBsdWdpbignZnVuY3Rpb24nLCAnczM2MF9sb2FkX3RpbWVzdGFtcCcsICdzMzYwX2xvYWRfdGltZXN0YW1wJykgLT5yZWdpc3RlclBsdWdpbignZnVuY3Rpb24nLCAnczM2MF9sb2FkX3NwZWNpYWxfbGluaycsICdzMzYwX2xvYWRfc3BlY2lhbF9saW5rJykgLT5yZWdpc3RlclBsdWdpbignZnVuY3Rpb24nLCAnczM2MF9nZXRfbHBhX21vZGUnLCAnczM2MF9nZXRfbHBhX21vZGUnKSAtPnJlZ2lzdGVyUGx1Z2luKCdmdW5jdGlvbicsICdzMzYwX2dldF9scGFfYnV0dG9uJywgJ3MzNjBfZ2V0X2xwYV9idXR0b24nKSAtPnJlZ2lzdGVyUGx1Z2luKCdmdW5jdGlvbicsICdzMzYwX2xhbmcnLCAnczM2MF9sYW5nJykgLT5yZWdpc3RlclBsdWdpbignZnVuY3Rpb24nLCAnczM2MF9pc19hamF4JywgJ3MzNjBfaXNfYWpheCcpIC0+cmVnaXN0ZXJQbHVnaW4oJ2Z1bmN0aW9uJywgJ3MzNjBfc2hvd19jbXNfbmF2JywgJ3MzNjBfc2hvd19jbXNfbmF2Jyk7IGZ1bmN0aW9uIGdldF9wcm9kdWN0X2xpc3QoJHBhcmFtcywgJiRzbWFydHkpIHsgJG5MaW1pdCA9IGlzc2V0KCRwYXJhbXNbJ25MaW1pdCddKSA/IChpbnQpJHBhcmFtc1snbkxpbWl0J10gOiAxMDsgJG5Tb3J0aWVydW5nID0gaXNzZXQoJHBhcmFtc1snblNvcnRpZXJ1bmcnXSkgPyAoaW50KSRwYXJhbXNbJ25Tb3J0aWVydW5nJ10gOiAwOyAkY0Fzc2lnbiA9IChpc3NldCgkcGFyYW1zWydjQXNzaWduJ10pICYmIHN0cmxlbigkcGFyYW1zWydjQXNzaWduJ10pID4gMCkgPyAkcGFyYW1zWydjQXNzaWduJ10gOiAnb0N1c3RvbUFydGlrZWxfYXJyJzsgJGNNZXJrbWFsRmlsdGVyX2FyciA9IGlzc2V0KCRwYXJhbXNbJ2NNZXJrbWFsRmlsdGVyJ10pID8gc2V0emVNZXJrbWFsRmlsdGVyKGV4cGxvZGUoJzsnLCAkcGFyYW1zWydjTWVya21hbEZpbHRlciddKSkgOiBudWxsOyAkY1N1Y2hGaWx0ZXJfYXJyID0gaXNzZXQoJHBhcmFtc1snY1N1Y2hGaWx0ZXInXSkgPyBzZXR6ZVN1Y2hGaWx0ZXIoZXhwbG9kZSgnOycsICRwYXJhbXNbJ2NTdWNoRmlsdGVyJ10pKSA6IG51bGw7ICRjVGFnRmlsdGVyX2FyciA9IGlzc2V0KCRwYXJhbXNbJ2NUYWdGaWx0ZXInXSkgPyBzZXR6ZVRhZ0ZpbHRlcihleHBsb2RlKCc7JywgJHBhcmFtc1snY1RhZ0ZpbHRlciddKSkgOiBudWxsOyAkY1BhcmFtZXRlcl9hcnIgPSBhcnJheSggJ2tLYXRlZ29yaWUnID0+IGlzc2V0KCRwYXJhbXNbJ2tLYXRlZ29yaWUnXSkgPyAkcGFyYW1zWydrS2F0ZWdvcmllJ10gOiBudWxsLCAna0hlcnN0ZWxsZXInID0+IGlzc2V0KCRwYXJhbXNbJ2tIZXJzdGVsbGVyJ10pID8gJHBhcmFtc1sna0hlcnN0ZWxsZXInXSA6IG51bGwsICdrQXJ0aWtlbCcgPT4gaXNzZXQoJHBhcmFtc1sna0FydGlrZWwnXSkgPyAkcGFyYW1zWydrQXJ0aWtlbCddIDogbnVsbCwgJ2tWYXJpS2luZEFydGlrZWwnID0+IGlzc2V0KCRwYXJhbXNbJ2tWYXJpS2luZEFydGlrZWwnXSkgPyAkcGFyYW1zWydrVmFyaUtpbmRBcnRpa2VsJ10gOiBudWxsLCAna1NlaXRlJyA9PiBpc3NldCgkcGFyYW1zWydrU2VpdGUnXSkgPyAkcGFyYW1zWydrU2VpdGUnXSA6IG51bGwsICdrU3VjaGFuZnJhZ2UnID0+IGlzc2V0KCRwYXJhbXNbJ2tTdWNoYW5mcmFnZSddKSA/ICRwYXJhbXNbJ2tTdWNoYW5mcmFnZSddIDogbnVsbCwgJ2tNZXJrbWFsV2VydCcgPT4gaXNzZXQoJHBhcmFtc1sna01lcmttYWxXZXJ0J10pID8gJHBhcmFtc1sna01lcmttYWxXZXJ0J10gOiBudWxsLCAna1RhZycgPT4gaXNzZXQoJHBhcmFtc1sna1RhZyddKSA/ICRwYXJhbXNbJ2tUYWcnXSA6IG51bGwsICdrU3VjaHNwZWNpYWwnID0+IGlzc2V0KCRwYXJhbXNbJ2tTdWNoc3BlY2lhbCddKSA/ICRwYXJhbXNbJ2tTdWNoc3BlY2lhbCddIDogbnVsbCwgJ2tLYXRlZ29yaWVGaWx0ZXInID0+IGlzc2V0KCRwYXJhbXNbJ2tLYXRlZ29yaWVGaWx0ZXInXSkgPyAkcGFyYW1zWydrS2F0ZWdvcmllRmlsdGVyJ10gOiBudWxsLCAna0hlcnN0ZWxsZXJGaWx0ZXInID0+IGlzc2V0KCRwYXJhbXNbJ2tIZXJzdGVsbGVyRmlsdGVyJ10pID8gJHBhcmFtc1sna0hlcnN0ZWxsZXJGaWx0ZXInXSA6IG51bGwsICduQmV3ZXJ0dW5nU3Rlcm5lRmlsdGVyJyA9PiBpc3NldCgkcGFyYW1zWyduQmV3ZXJ0dW5nU3Rlcm5lRmlsdGVyJ10pID8gJHBhcmFtc1snbkJld2VydHVuZ1N0ZXJuZUZpbHRlciddIDogbnVsbCwgJ2NQcmVpc3NwYW5uZW5GaWx0ZXInID0+IGlzc2V0KCRwYXJhbXNbJ2NQcmVpc3NwYW5uZW5GaWx0ZXInXSkgPyAkcGFyYW1zWydjUHJlaXNzcGFubmVuRmlsdGVyJ10gOiBudWxsLCAna1N1Y2hzcGVjaWFsRmlsdGVyJyA9PiBpc3NldCgkcGFyYW1zWydrU3VjaHNwZWNpYWxGaWx0ZXInXSkgPyAkcGFyYW1zWydrU3VjaHNwZWNpYWxGaWx0ZXInXSA6IG51bGwsICduU29ydGllcnVuZycgPT4gJG5Tb3J0aWVydW5nLCAnTWVya21hbEZpbHRlcl9hcnInID0+ICRjTWVya21hbEZpbHRlcl9hcnIsICdUYWdGaWx0ZXJfYXJyJyA9PiAkY1RhZ0ZpbHRlcl9hcnIsICdTdWNoRmlsdGVyX2FycicgPT4gJGNTdWNoRmlsdGVyX2FyciwgJ25BcnRpa2VsUHJvU2VpdGUnID0+IGlzc2V0KCRwYXJhbXNbJ25BcnRpa2VsUHJvU2VpdGUnXSkgPyAkcGFyYW1zWyduQXJ0aWtlbFByb1NlaXRlJ10gOiBudWxsLCAnY1N1Y2hlJyA9PiBpc3NldCgkcGFyYW1zWydjU3VjaGUnXSkgPyAkcGFyYW1zWydjU3VjaGUnXSA6IG51bGwsICdzZWl0ZScgPT4gaXNzZXQoJHBhcmFtc1snc2VpdGUnXSkgPyAkcGFyYW1zWydzZWl0ZSddIDogbnVsbCApOyBpZiAoJGNQYXJhbWV0ZXJfYXJyWydrQXJ0aWtlbCddICE9PSBudWxsKSB7ICRvQXJ0aWtlbF9hcnIgPSBhcnJheSgpOyBpZiAoIWlzX2FycmF5KCRjUGFyYW1ldGVyX2Fyclsna0FydGlrZWwnXSkpIHsgJGNQYXJhbWV0ZXJfYXJyWydrQXJ0aWtlbCddID0gYXJyYXkoJGNQYXJhbWV0ZXJfYXJyWydrQXJ0aWtlbCddKTsgfSBmb3JlYWNoICgkY1BhcmFtZXRlcl9hcnJbJ2tBcnRpa2VsJ10gYXMgJGtBcnRpa2VsKSB7ICRhcnRpY2xlID0gbmV3IEFydGlrZWwoKTsgJGFydGljbGUtPmZ1ZWxsZUFydGlrZWwoJGtBcnRpa2VsLCBBcnRpa2VsOjpnZXREZWZhdWx0T3B0aW9ucygpKTsgJG9BcnRpa2VsX2FycltdID0gJGFydGljbGU7IH0gfSBlbHNlIHsgJE5hdmlGaWx0ZXIgPSBTaG9wOjpidWlsZE5hdmlGaWx0ZXIoJGNQYXJhbWV0ZXJfYXJyKTsgaWYgKGlzc2V0KCROYXZpRmlsdGVyLT5TdWNoZS0+Y1N1Y2hlKSAmJiBzdHJsZW4oJE5hdmlGaWx0ZXItPlN1Y2hlLT5jU3VjaGUpID4gMCkgeyAkTmF2aUZpbHRlci0+U3VjaGUtPmNTdWNoZSA9IFN0cmluZ0hhbmRsZXI6OmZpbHRlclhTUygkTmF2aUZpbHRlci0+U3VjaGUtPmNTdWNoZSwgMSk7ICROYXZpRmlsdGVyLT5TdWNoZS0+a1N1Y2hDYWNoZSA9IGJlYXJiZWl0ZVN1Y2hDYWNoZSgkTmF2aUZpbHRlcik7IH0gaWYgKGlzc2V0KCRjUGFyYW1ldGVyX2FyclsnY0FydEF0dHJpYiddKSAmJiBzdHJsZW4oJGNQYXJhbWV0ZXJfYXJyWydjQXJ0QXR0cmliJ10pID4gMCkgeyAkTmF2aUZpbHRlci0+QXJ0aWtlbEF0dHJpYnV0RmlsdGVyLT5jQXJ0QXR0cmliID0gJGNQYXJhbWV0ZXJfYXJyWydjQXJ0QXR0cmliJ107IH0gJEZpbHRlclNRTCA9IGJhdUZpbHRlclNRTCgkTmF2aUZpbHRlcik7ICRvQXJ0aWtlbF9hcnIgPSBnaWJBcnRpa2VsS2V5cygkRmlsdGVyU1FMLCAkbkxpbWl0LCAkTmF2aUZpbHRlciwgdHJ1ZSwgbnVsbCk7IH0gJHNtYXJ0eS0+YXNzaWduKCRjQXNzaWduLCAkb0FydGlrZWxfYXJyKTsgaWYgKGlzc2V0KCRwYXJhbXNbJ2JSZXR1cm4nXSkpIHsgcmV0dXJuICRvQXJ0aWtlbF9hcnI7IH0gfSBmdW5jdGlvbiBnZXRfc3RhdGljX3JvdXRlKCRwYXJhbXMsICYkc21hcnR5KSB7IGlmIChpc3NldCgkcGFyYW1zWydpZCddKSkgeyAkZnVsbCA9ICFpc3NldCgkcGFyYW1zWydmdWxsJ10pIHx8ICRwYXJhbXNbJ2Z1bGwnXSA9PT0gdHJ1ZTsgJHNlY3VyZSA9IGlzc2V0KCRwYXJhbXNbJ3NlY3VyZSddKSAmJiAkcGFyYW1zWydzZWN1cmUnXSA9PT0gdHJ1ZTsgJHVybCA9IExpbmtIZWxwZXI6OmdldEluc3RhbmNlKCktPmdldFN0YXRpY1JvdXRlKCRwYXJhbXNbJ2lkJ10sICRmdWxsLCAkc2VjdXJlKTsgJHFwID0gaXNzZXQoJHBhcmFtc1sncGFyYW1zJ10pID8gKGFycmF5KSRwYXJhbXNbJ3BhcmFtcyddIDogYXJyYXkoKTsgaWYgKGNvdW50KCRxcCkgPiAwKSB7ICR1cmwgPSAkdXJsIC4gKHBhcnNlX3VybCgkdXJsLCBQSFBfVVJMX1FVRVJZKSA/ICcmJyA6ICc/JykgLiBodHRwX2J1aWxkX3F1ZXJ5KCRxcCwgJycsICcmJyk7IH0gaWYgKGlzc2V0KCRwYXJhbXNbJ2Fzc2lnbiddKSkgeyAkc21hcnR5LT5hc3NpZ24oJHBhcmFtc1snYXNzaWduJ10sICR1cmwpOyB9IGVsc2UgeyByZXR1cm4gJHVybDsgfSB9IHJldHVybiBmYWxzZTsgfSBmdW5jdGlvbiBnZXRfbWFudWZhY3R1cmVycygkcGFyYW1zLCAmJHNtYXJ0eSkgeyAkaGVscGVyID0gSGVyc3RlbGxlckhlbHBlcjo6Z2V0SW5zdGFuY2UoKTsgJG1hbnVmYWN0dXJlcnMgPSAkaGVscGVyLT5nZXRNYW51ZmFjdHVyZXJzKCk7IGlmIChpc3NldCgkcGFyYW1zWydhc3NpZ24nXSkpIHsgJHNtYXJ0eS0+YXNzaWduKCRwYXJhbXNbJ2Fzc2lnbiddLCAkbWFudWZhY3R1cmVycyk7IHJldHVybjsgfSByZXR1cm4gJG1hbnVmYWN0dXJlcnM7IH0gZnVuY3Rpb24gbG9hZF9ib3hlc19yYXcoJHBhcmFtcywgJiRzbWFydHkpIHsgaWYgKGlzc2V0KCRwYXJhbXNbJ2FycmF5J10sICRwYXJhbXNbJ2Fzc2lnbiddKSAmJiAkcGFyYW1zWydhcnJheSddID09PSB0cnVlKSB7ICRyYXdEYXRhID0gQm94ZW46OmdldEluc3RhbmNlKCktPmdldFJhd0RhdGEoKTsgJHNtYXJ0eS0+YXNzaWduKCRwYXJhbXNbJ2Fzc2lnbiddLCAoaXNzZXQoJHJhd0RhdGFbJHBhcmFtc1sndHlwZSddXSkgPyAkcmF3RGF0YVskcGFyYW1zWyd0eXBlJ11dIDogbnVsbCkpOyB9IH0gZnVuY3Rpb24gZ2V0X2NhdGVnb3J5X2FycmF5KCRwYXJhbXMsICYkc21hcnR5KSB7ICRpZCA9IGlzc2V0KCRwYXJhbXNbJ2NhdGVnb3J5SWQnXSkgPyAoaW50KSRwYXJhbXNbJ2NhdGVnb3J5SWQnXSA6IDA7IGlmICgkaWQgPT09IDApIHsgJGNhdGVnb3JpZXMgPSBLYXRlZ29yaWVIZWxwZXI6OmdldEluc3RhbmNlKCk7ICRsaXN0ID0gJGNhdGVnb3JpZXMtPmNvbWJpbmVkR2V0QWxsKCk7IH0gZWxzZSB7ICRjYXRlZ29yaWVzID0gbmV3IEthdGVnb3JpZUxpc3RlKCk7ICRsaXN0ID0gJGNhdGVnb3JpZXMtPmdldEFsbENhdGVnb3JpZXNPbkxldmVsKCRpZCk7IH0gaWYgKGlzc2V0KCRwYXJhbXNbJ2NhdGVnb3J5Qm94TnVtYmVyJ10pICYmIChpbnQpJHBhcmFtc1snY2F0ZWdvcnlCb3hOdW1iZXInXSA+IDApIHsgJGxpc3QyID0gYXJyYXkoKTsgZm9yZWFjaCAoJGxpc3QgYXMgJGtleSA9PiAkb0xpc3QpIHsgaWYgKGlzc2V0KCRvTGlzdC0+Y2F0ZWdvcnlGdW5jdGlvbkF0dHJpYnV0ZXNbS0FUX0FUVFJJQlVUX0tBVEVHT1JJRUJPWF0pICYmICRvTGlzdC0+Y2F0ZWdvcnlGdW5jdGlvbkF0dHJpYnV0ZXNbS0FUX0FUVFJJQlVUX0tBVEVHT1JJRUJPWF0gPT0gJHBhcmFtc1snY2F0ZWdvcnlCb3hOdW1iZXInXSApIHsgJGxpc3QyWyRrZXldID0gJG9MaXN0OyB9IH0gJGxpc3QgPSAkbGlzdDI7IH0gaWYgKGlzc2V0KCRwYXJhbXNbJ2Fzc2lnbiddKSkgeyAkc21hcnR5LT5hc3NpZ24oJHBhcmFtc1snYXNzaWduJ10sICRsaXN0KTsgcmV0dXJuOyB9IHJldHVybiAkbGlzdDsgfSBmdW5jdGlvbiBnZXRfY2F0ZWdvcnlfcGFyZW50cygkcGFyYW1zLCAmJHNtYXJ0eSkgeyAkaWQgPSBpc3NldCgkcGFyYW1zWydjYXRlZ29yeUlkJ10pID8gKGludCkkcGFyYW1zWydjYXRlZ29yeUlkJ10gOiAwOyAkY2F0ZWdvcnkgPSBuZXcgS2F0ZWdvcmllKCRpZCk7ICRjYXRlZ29yaWVzID0gbmV3IEthdGVnb3JpZUxpc3RlKCk7ICRsaXN0ID0gJGNhdGVnb3JpZXMtPmdldE9wZW5DYXRlZ29yaWVzKCRjYXRlZ29yeSk7IGFycmF5X3NoaWZ0KCRsaXN0KTsgJGxpc3QgPSBhcnJheV9yZXZlcnNlKCRsaXN0KTsgaWYgKGlzc2V0KCRwYXJhbXNbJ2Fzc2lnbiddKSkgeyAkc21hcnR5LT5hc3NpZ24oJHBhcmFtc1snYXNzaWduJ10sICRsaXN0KTsgcmV0dXJuOyB9IHJldHVybiAkbGlzdDsgfSBmdW5jdGlvbiBnZXRfaW1nX3RhZygkcGFyYW1zLCAmJHNtYXJ0eSkgeyBpZiAoZW1wdHkoJHBhcmFtc1snc3JjJ10pKSB7IHJldHVybiAnJzsgfSAkb0ltZ1NpemUgPSBnZXRfaW1hZ2Vfc2l6ZSgkcGFyYW1zWydzcmMnXSk7ICRpbWFnZVVSTCA9ICRwYXJhbXNbJ3NyYyddOyAkaW1hZ2VJRCA9IGlzc2V0KCRwYXJhbXNbJ2lkJ10pID8gJyBpZD0iJyAuICRwYXJhbXNbJ2lkJ10gLiAnIicgOiAnJzsgJGltYWdlQUxUID0gaXNzZXQoJHBhcmFtc1snYWx0J10pID8gJyBhbHQ9IicgLiB0cnVuY2F0ZSgkcGFyYW1zWydhbHQnXSwgNzUpIC4gJyInIDogJyc7ICRpbWFnZVRJVExFID0gaXNzZXQoJHBhcmFtc1sndGl0bGUnXSkgPyAnIHRpdGxlPSInIC4gdHJ1bmNhdGUoJHBhcmFtc1sndGl0bGUnXSwgNzUpIC4gJyInIDogJyc7ICRpbWFnZUNMQVNTID0gaXNzZXQoJHBhcmFtc1snY2xhc3MnXSkgPyAnIGNsYXNzPSInIC4gdHJ1bmNhdGUoJHBhcmFtc1snY2xhc3MnXSwgNzUpIC4gJyInIDogJyc7IGlmICgkb0ltZ1NpemUgIT09IG51bGwgJiYgJG9JbWdTaXplLT5zaXplLT53aWR0aCA+IDAgJiYgJG9JbWdTaXplLT5zaXplLT5oZWlnaHQgPiAwKSB7IHJldHVybiAnPGltZyBzcmM9IicgLiAkaW1hZ2VVUkwgLiAnIiB3aWR0aD0iJyAuICRvSW1nU2l6ZS0+c2l6ZS0+d2lkdGggLiAnIiBoZWlnaHQ9IicgLiAkb0ltZ1NpemUtPnNpemUtPmhlaWdodCAuICciJyAuICRpbWFnZUlEIC4gJGltYWdlQUxUIC4gJGltYWdlVElUTEUgLiAkaW1hZ2VDTEFTUyAuICcgLz4nOyB9IHJldHVybiAnPGltZyBzcmM9IicgLiAkaW1hZ2VVUkwgLiAnIicgLiAkaW1hZ2VJRCAuICRpbWFnZUFMVCAuICRpbWFnZVRJVExFIC4gJGltYWdlQ0xBU1MgLiAnIC8+JzsgfSBmdW5jdGlvbiBsb2FkX2JveGVzKCRwYXJhbXMsICYkc21hcnR5KSB7ICRjVHBsRGF0YSA9ICcnOyAkY09sZFRwbERpciA9ICcnOyAkYm94ZXMgPSBCb3hlbjo6Z2V0SW5zdGFuY2UoKTsgJG9Cb3hlbl9hcnIgPSAkYm94ZXMtPmNvbXBhdEdldCgpOyAkY1RlbXBsYXRlRGlyID0gJHNtYXJ0eS0+Z2V0VGVtcGxhdGVEaXIoJHNtYXJ0eS0+Y29udGV4dCk7IGlmIChpc19hcnJheSgkb0JveGVuX2FycikgJiYgaXNzZXQoJHBhcmFtc1sndHlwZSddKSkgeyAkY1R5cGUgPSAkcGFyYW1zWyd0eXBlJ107ICRfc0JveGVzID0gJHNtYXJ0eS0+Z2V0VGVtcGxhdGVWYXJzKCdib3hlcycpOyBpZiAoaXNzZXQoJF9zQm94ZXNbJGNUeXBlXSwgJG9Cb3hlbl9hcnJbJGNUeXBlXSkgJiYgaXNfYXJyYXkoJG9Cb3hlbl9hcnJbJGNUeXBlXSkpIHsgZm9yZWFjaCAoJG9Cb3hlbl9hcnJbJGNUeXBlXSBhcyAkb0JveCkgeyAkb1BsdWdpblZhciA9ICcnOyAkY1RlbXBsYXRlID0gJ3RwbF9pbmMvYm94ZXMvJyAuICRvQm94LT5jVGVtcGxhdGU7IGlmICgkb0JveC0+ZVR5cCA9PT0gJ3BsdWdpbicpIHsgJG9QbHVnaW4gPSBuZXcgUGx1Z2luKCRvQm94LT5rQ3VzdG9tSUQpOyBpZiAoJG9QbHVnaW4tPmtQbHVnaW4gPiAwICYmICRvUGx1Z2luLT5uU3RhdHVzID09IDIpIHsgJGNUZW1wbGF0ZSA9ICRvQm94LT5jVGVtcGxhdGU7ICRjT2xkVHBsRGlyID0gJGNUZW1wbGF0ZURpcjsgJGNUZW1wbGF0ZURpciA9ICRvUGx1Z2luLT5jRnJvbnRlbmRQZmFkIC4gUEZBRF9QTFVHSU5fQk9YRU47ICRvUGx1Z2luVmFyID0gJ29QbHVnaW4nIC4gJG9Cb3gtPmtCb3g7ICRzbWFydHktPmFzc2lnbigkb1BsdWdpblZhciwgJG9QbHVnaW4pOyB9IH0gZWxzZWlmICgkb0JveC0+ZVR5cCA9PT0gJ2xpbmsnKSB7IGZvcmVhY2ggKExpbmtIZWxwZXI6OmdldEluc3RhbmNlKCktPmdldExpbmtHcm91cHMoKSBhcyAkb0xpbmtUcGwpIHsgaWYgKCRvTGlua1RwbC0+a0xpbmtncnVwcGUgPT0gJG9Cb3gtPmtDdXN0b21JRCkgeyAkb0JveC0+b0xpbmtHcnVwcGVUZW1wbGF0ZSA9ICRvTGlua1RwbDsgJG9Cb3gtPm9MaW5rR3J1cHBlID0gJG9MaW5rVHBsOyB9IH0gfSBpZiAoZmlsZV9leGlzdHMoJGNUZW1wbGF0ZURpciAuICcvJyAuICRjVGVtcGxhdGUpKSB7ICRvQm94VmFyID0gJ29Cb3gnIC4gJG9Cb3gtPmtCb3g7ICRzbWFydHktPmFzc2lnbigkb0JveFZhciwgJG9Cb3gpOyBnbG9iYWwgJEVpbnN0ZWxsdW5nZW47IGlmICgkRWluc3RlbGx1bmdlblsndGVtcGxhdGUnXVsnZ2VuZXJhbCddWyd1c2VfY3VzdG9tdHBsJ10gPT09ICdZJykgeyAkY1RlbXBsYXRlUGF0aCA9IHBhdGhpbmZvKCRjVGVtcGxhdGUpOyAkY0N1c3RvbVRlbXBsYXRlID0gJGNUZW1wbGF0ZVBhdGhbJ2Rpcm5hbWUnXSAuICcvJyAuICRjVGVtcGxhdGVQYXRoWydmaWxlbmFtZSddIC4gJ19jdXN0b20udHBsJzsgaWYgKGZpbGVfZXhpc3RzKCRjVGVtcGxhdGVEaXIgLiAnLycgLiAkY0N1c3RvbVRlbXBsYXRlKSkgeyAkY1RlbXBsYXRlID0gJGNDdXN0b21UZW1wbGF0ZTsgfSB9ICRjVGVtcGxhdGVQYXRoID0gJGNUZW1wbGF0ZURpciAuICcvJyAuICRjVGVtcGxhdGU7IGlmICgkb0JveC0+ZVR5cCA9PT0gJ3BsdWdpbicpIHsgJGNUcGxEYXRhIC49ICJ7aW5jbHVkZSBmaWxlPSciIC4gJGNUZW1wbGF0ZVBhdGggLiAiJyBvQm94PVwkJG9Cb3hWYXIgb1BsdWdpbj1cJCRvUGx1Z2luVmFyfSI7IH0gZWxzZSB7ICRjVHBsRGF0YSAuPSAie2luY2x1ZGUgZmlsZT0nIiAuICRjVGVtcGxhdGVQYXRoIC4gIicgb0JveD1cJCRvQm94VmFyfSI7IH0gaWYgKHN0cmxlbigkY09sZFRwbERpcikpIHsgJGNUZW1wbGF0ZURpciA9ICRjT2xkVHBsRGlyOyB9IH0gfSB9IH0gaWYgKGlzc2V0KCRwYXJhbXNbJ2Fzc2lnbiddKSkgeyAkc21hcnR5LT5hc3NpZ24oJHBhcmFtc1snYXNzaWduJ10sICRjVHBsRGF0YSk7IHJldHVybjsgfSByZXR1cm4gJGNUcGxEYXRhOyB9IGZ1bmN0aW9uIGhhc19ib3hlcygkcGFyYW1zLCAmJHNtYXJ0eSkgeyAkYm94ZXMgPSBCb3hlbjo6Z2V0SW5zdGFuY2UoKTsgJHNtYXJ0eS0+YXNzaWduKCRwYXJhbXNbJ2Fzc2lnbiddLCBpc3NldCgkYm94ZXMtPmJveGVzWyRwYXJhbXNbJ3Bvc2l0aW9uJ11dKSk7IH0gZnVuY3Rpb24gdHJ1bmNhdGUoJHRleHQsICRudW1iKSB7IGlmIChzdHJsZW4oJHRleHQpID4gJG51bWIpIHsgJHRleHQgPSBzdWJzdHIoJHRleHQsIDAsICRudW1iKTsgJHRleHQgPSBzdWJzdHIoJHRleHQsIDAsIHN0cnJwb3MoJHRleHQsICcgJykpOyAkdGV4dCAuPSAnLi4uJzsgfSByZXR1cm4gJHRleHQ7IH0gZnVuY3Rpb24gZ2liUHJlaXNTdHJpbmdMb2NhbGl6ZWRTbWFydHkoJHBhcmFtcywgJiRzbWFydHkpIHsgJG9BdWZwcmVpcyA9IG5ldyBzdGRDbGFzcygpOyBpZiAoKGZsb2F0KSRwYXJhbXNbJ2ZBdWZwcmVpc05ldHRvJ10gIT0gMCkgeyAkZkF1ZnByZWlzTmV0dG8gPSAoZmxvYXQpJHBhcmFtc1snZkF1ZnByZWlzTmV0dG8nXTsgJGZWS05ldHRvID0gKGZsb2F0KSRwYXJhbXNbJ2ZWS05ldHRvJ107ICRrU3RldWVya2xhc3NlID0gKGludCkkcGFyYW1zWydrU3RldWVya2xhc3NlJ107ICRmVlBFV2VydCA9IChmbG9hdCkkcGFyYW1zWydmVlBFV2VydCddOyAkY1ZQRUVpbmhlaXQgPSAkcGFyYW1zWydjVlBFRWluaGVpdCddOyAkRnVua3Rpb25zQXR0cmlidXRlX2FyciA9ICRwYXJhbXNbJ0Z1bmt0aW9uc0F0dHJpYnV0ZSddOyAkbkdlbmF1aWdrZWl0ID0gKGlzc2V0KCRGdW5rdGlvbnNBdHRyaWJ1dGVfYXJyW0ZLVF9BVFRSSUJVVF9HUlVORFBSRUlTR0VOQVVJR0tFSVRdKSAmJiAoaW50KSRGdW5rdGlvbnNBdHRyaWJ1dGVfYXJyW0ZLVF9BVFRSSUJVVF9HUlVORFBSRUlTR0VOQVVJR0tFSVRdID4gMCkgPyAoaW50KSRGdW5rdGlvbnNBdHRyaWJ1dGVfYXJyW0ZLVF9BVFRSSUJVVF9HUlVORFBSRUlTR0VOQVVJR0tFSVRdIDogMjsgaWYgKChpbnQpJHBhcmFtc1snbk5ldHRvUHJlaXNlJ10gPT09IDEpIHsgJG9BdWZwcmVpcy0+Y0F1ZnByZWlzTG9jYWxpemVkID0gZ2liUHJlaXNTdHJpbmdMb2NhbGl6ZWQoJGZBdWZwcmVpc05ldHRvKTsgJG9BdWZwcmVpcy0+Y1ByZWlzSW5rbEF1ZnByZWlzID0gZ2liUHJlaXNTdHJpbmdMb2NhbGl6ZWQoJGZBdWZwcmVpc05ldHRvICsgJGZWS05ldHRvKTsgJG9BdWZwcmVpcy0+Y0F1ZnByZWlzTG9jYWxpemVkID0gKCRmQXVmcHJlaXNOZXR0byA+IDApID8gKCcrICcgLiAkb0F1ZnByZWlzLT5jQXVmcHJlaXNMb2NhbGl6ZWQpIDogc3RyX3JlcGxhY2UoJy0nLCAnLSAnLCAkb0F1ZnByZWlzLT5jQXVmcHJlaXNMb2NhbGl6ZWQpOyBpZiAoJGZWUEVXZXJ0ID4gMCkgeyAkb0F1ZnByZWlzLT5jUHJlaXNWUEVXZXJ0QXVmcHJlaXMgPSBnaWJQcmVpc1N0cmluZ0xvY2FsaXplZCggJGZBdWZwcmVpc05ldHRvIC8gJGZWUEVXZXJ0LCAkX1NFU1NJT05bJ1dhZWhydW5nJ10sIDEsICRuR2VuYXVpZ2tlaXQgKSAuICcgJyAuIFNob3A6OkxhbmcoKS0+Z2V0KCd2cGVQZXInLCAnZ2xvYmFsJykgLiAnICcgLiAkY1ZQRUVpbmhlaXQ7ICRvQXVmcHJlaXMtPmNQcmVpc1ZQRVdlcnRJbmtsQXVmcHJlaXMgPSBnaWJQcmVpc1N0cmluZ0xvY2FsaXplZCggKCRmQXVmcHJlaXNOZXR0byArICRmVktOZXR0bykgLyAkZlZQRVdlcnQsICRfU0VTU0lPTlsnV2FlaHJ1bmcnXSwgMSwgJG5HZW5hdWlna2VpdCApIC4gJyAnIC4gU2hvcDo6TGFuZygpLT5nZXQoJ3ZwZVBlcicsICdnbG9iYWwnKSAuICcgJyAuICRjVlBFRWluaGVpdDsgJG9BdWZwcmVpcy0+Y0F1ZnByZWlzTG9jYWxpemVkID0gJG9BdWZwcmVpcy0+Y0F1ZnByZWlzTG9jYWxpemVkIC4gJywgJyAuICRvQXVmcHJlaXMtPmNQcmVpc1ZQRVdlcnRBdWZwcmVpczsgJG9BdWZwcmVpcy0+Y1ByZWlzSW5rbEF1ZnByZWlzID0gJG9BdWZwcmVpcy0+Y1ByZWlzSW5rbEF1ZnByZWlzIC4gJywgJyAuICRvQXVmcHJlaXMtPmNQcmVpc1ZQRVdlcnRJbmtsQXVmcHJlaXM7IH0gfSBlbHNlIHsgJG9BdWZwcmVpcy0+Y0F1ZnByZWlzTG9jYWxpemVkID0gZ2liUHJlaXNTdHJpbmdMb2NhbGl6ZWQoYmVyZWNobmVCcnV0dG8oJGZBdWZwcmVpc05ldHRvLCAkX1NFU1NJT05bJ1N0ZXVlcnNhdHonXVska1N0ZXVlcmtsYXNzZV0pKTsgJG9BdWZwcmVpcy0+Y1ByZWlzSW5rbEF1ZnByZWlzID0gZ2liUHJlaXNTdHJpbmdMb2NhbGl6ZWQoYmVyZWNobmVCcnV0dG8oJGZBdWZwcmVpc05ldHRvICsgJGZWS05ldHRvLCAkX1NFU1NJT05bJ1N0ZXVlcnNhdHonXVska1N0ZXVlcmtsYXNzZV0pKTsgJG9BdWZwcmVpcy0+Y0F1ZnByZWlzTG9jYWxpemVkID0gKCRmQXVmcHJlaXNOZXR0byA+IDApID8gKCcrICcgLiAkb0F1ZnByZWlzLT5jQXVmcHJlaXNMb2NhbGl6ZWQpIDogc3RyX3JlcGxhY2UoJy0nLCAnLSAnLCAkb0F1ZnByZWlzLT5jQXVmcHJlaXNMb2NhbGl6ZWQpOyBpZiAoJGZWUEVXZXJ0ID4gMCkgeyAkb0F1ZnByZWlzLT5jUHJlaXNWUEVXZXJ0QXVmcHJlaXMgPSBnaWJQcmVpc1N0cmluZ0xvY2FsaXplZCggYmVyZWNobmVCcnV0dG8oJGZBdWZwcmVpc05ldHRvIC8gJGZWUEVXZXJ0LCAkX1NFU1NJT05bJ1N0ZXVlcnNhdHonXVska1N0ZXVlcmtsYXNzZV0pLCAkX1NFU1NJT05bJ1dhZWhydW5nJ10sIDEsICRuR2VuYXVpZ2tlaXQgKSAuICcgJyAuIFNob3A6OkxhbmcoKS0+Z2V0KCd2cGVQZXInLCAnZ2xvYmFsJykgLiAnICcgLiAkY1ZQRUVpbmhlaXQ7ICRvQXVmcHJlaXMtPmNQcmVpc1ZQRVdlcnRJbmtsQXVmcHJlaXMgPSBnaWJQcmVpc1N0cmluZ0xvY2FsaXplZCggYmVyZWNobmVCcnV0dG8oICgkZkF1ZnByZWlzTmV0dG8gKyAkZlZLTmV0dG8pIC8gJGZWUEVXZXJ0LCAkX1NFU1NJT05bJ1N0ZXVlcnNhdHonXVska1N0ZXVlcmtsYXNzZV0gKSwgJF9TRVNTSU9OWydXYWVocnVuZyddLCAxLCAkbkdlbmF1aWdrZWl0ICkgLiAnICcgLiBTaG9wOjpMYW5nKCktPmdldCgndnBlUGVyJywgJ2dsb2JhbCcpIC4gJyAnIC4gJGNWUEVFaW5oZWl0OyAkb0F1ZnByZWlzLT5jQXVmcHJlaXNMb2NhbGl6ZWQgPSAkb0F1ZnByZWlzLT5jQXVmcHJlaXNMb2NhbGl6ZWQgLiAnLCAnIC4gJG9BdWZwcmVpcy0+Y1ByZWlzVlBFV2VydEF1ZnByZWlzOyAkb0F1ZnByZWlzLT5jUHJlaXNJbmtsQXVmcHJlaXMgPSAkb0F1ZnByZWlzLT5jUHJlaXNJbmtsQXVmcHJlaXMgLiAnLCAnIC4gJG9BdWZwcmVpcy0+Y1ByZWlzVlBFV2VydElua2xBdWZwcmVpczsgfSB9IH0gcmV0dXJuIChpc3NldCgkcGFyYW1zWydiQXVmcHJlaXNlJ10pICYmIChpbnQpJHBhcmFtc1snYkF1ZnByZWlzZSddID4gMCkgPyAkb0F1ZnByZWlzLT5jQXVmcHJlaXNMb2NhbGl6ZWQgOiAkb0F1ZnByZWlzLT5jUHJlaXNJbmtsQXVmcHJlaXM7IH0gZnVuY3Rpb24gaGFzQ2hlY2tCb3hGb3JMb2NhdGlvbigkcGFyYW1zLCAmJHNtYXJ0eSkgeyByZXF1aXJlX29uY2UgUEZBRF9ST09UIC4gUEZBRF9DTEFTU0VTIC4gJ2NsYXNzLkpUTC1TaG9wLkNoZWNrQm94LnBocCc7ICRvQ2hlY2tCb3ggPSBuZXcgQ2hlY2tCb3goKTsgJG9DaGVja0JveF9hcnIgPSAkb0NoZWNrQm94LT5nZXRDaGVja0JveEZyb250ZW5kKChpbnQpJHBhcmFtc1snbkFuemVpZ2VPcnQnXSwgMCwgdHJ1ZSwgdHJ1ZSk7ICRzbWFydHktPmFzc2lnbigkcGFyYW1zWydiUmV0dXJuJ10sIGNvdW50KCRvQ2hlY2tCb3hfYXJyKSA+IDApOyB9IGZ1bmN0aW9uIGdldENoZWNrQm94Rm9yTG9jYXRpb24oJHBhcmFtcywgJiRzbWFydHkpIHsgJGNpZCA9ICdjYl8nIC4gKGludCkkcGFyYW1zWyduQW56ZWlnZU9ydCddIC4gJ18nIC4gKGludCkkX1NFU1NJT05bJ2tTcHJhY2hlJ107IGlmIChTaG9wOjpoYXMoJGNpZCkpIHsgJG9DaGVja0JveF9hcnIgPSBTaG9wOjpnZXQoJGNpZCk7IH0gZWxzZSB7ICRvQ2hlY2tCb3ggPSBuZXcgQ2hlY2tCb3goKTsgJG9DaGVja0JveF9hcnIgPSAkb0NoZWNrQm94LT5nZXRDaGVja0JveEZyb250ZW5kKChpbnQpJHBhcmFtc1snbkFuemVpZ2VPcnQnXSwgMCwgdHJ1ZSwgdHJ1ZSk7IH0gaWYgKGNvdW50KCRvQ2hlY2tCb3hfYXJyKSA+IDApIHsgJGxpbmtIZWxwZXIgPSBMaW5rSGVscGVyOjpnZXRJbnN0YW5jZSgpOyBmb3JlYWNoICgkb0NoZWNrQm94X2FyciBhcyAkb0NoZWNrQm94KSB7ICRjTGlua1VSTCA9ICcnOyAkY0xpbmtVUkxGdWxsID0gJyc7IGlmICgkb0NoZWNrQm94LT5rTGluayA+IDApIHsgJHBhZ2UgPSAkbGlua0hlbHBlci0+ZmluZENNU0xpbmtJblNlc3Npb24oJG9DaGVja0JveC0+b0xpbmstPmtMaW5rKTsgaWYgKCFlbXB0eSgkcGFnZS0+VVJMKSkgeyAkY0xpbmtVUkwgPSAkcGFnZS0+VVJMOyAkY0xpbmtVUkxGdWxsID0gJHBhZ2UtPmNVUkxGdWxsOyB9IGVsc2UgeyAkY0xpbmtVUkwgPSBiYXVlVVJMKCRvQ2hlY2tCb3gtPm9MaW5rLCBVUkxBUlRfU0VJVEUpOyB9IH0gJGJFcnJvciA9IGlzc2V0KCRwYXJhbXNbJ2NQbGF1c2lfYXJyJ11bJG9DaGVja0JveC0+Y0lEXSk7ICRjUG9zdF9hcnIgPSAkcGFyYW1zWydjUG9zdF9hcnInXTsgJG9DaGVja0JveC0+aXNBY3RpdmUgPSBmYWxzZTsgaWYgKGlzc2V0KCRjUG9zdF9hcnJbJG9DaGVja0JveC0+Y0lEXSkpIHsgJG9DaGVja0JveC0+aXNBY3RpdmUgPSB0cnVlOyB9ICRvQ2hlY2tCb3gtPmNOYW1lID0gJG9DaGVja0JveC0+b0NoZWNrQm94U3ByYWNoZV9hcnJbJF9TRVNTSU9OWydrU3ByYWNoZSddXS0+Y1RleHQ7IGlmIChzdHJsZW4oJGNMaW5rVVJMKSA+IDApIHsgJG9DaGVja0JveC0+Y0xpbmtVUkwgPSAkY0xpbmtVUkw7IH0gJG9DaGVja0JveC0+Y0xpbmtVUkxGdWxsID0gJGNMaW5rVVJMRnVsbDsgaWYgKGlzc2V0KCRvQ2hlY2tCb3gtPm9DaGVja0JveFNwcmFjaGVfYXJyWyRfU0VTU0lPTlsna1NwcmFjaGUnXV0tPmNCZXNjaHJlaWJ1bmcpICYmIHN0cmxlbigkb0NoZWNrQm94LT5vQ2hlY2tCb3hTcHJhY2hlX2FyclskX1NFU1NJT05bJ2tTcHJhY2hlJ11dLT5jQmVzY2hyZWlidW5nKSA+IDAgKSB7ICRvQ2hlY2tCb3gtPmNCZXNjaHJlaWJ1bmcgPSAkb0NoZWNrQm94LT5vQ2hlY2tCb3hTcHJhY2hlX2FyclskX1NFU1NJT05bJ2tTcHJhY2hlJ11dLT5jQmVzY2hyZWlidW5nOyB9IGlmICgkYkVycm9yKSB7ICRvQ2hlY2tCb3gtPmNFcnJvcm1zZyA9IFNob3A6OkxhbmcoKS0+Z2V0KCdwbGVhc3lBY2NlcHQnLCAnYWNjb3VudCBkYXRhJyk7IH0gfSBTaG9wOjpzZXQoJGNpZCwgJG9DaGVja0JveF9hcnIpOyBpZiAoaXNzZXQoJHBhcmFtc1snYXNzaWduJ10pKSB7ICRzbWFydHktPmFzc2lnbigkcGFyYW1zWydhc3NpZ24nXSwgJG9DaGVja0JveF9hcnIpOyB9IH0gfSBmdW5jdGlvbiBhYVVSTEVuY29kZSgkcGFyYW1zLCAmJHNtYXJ0eSkgeyAkYlJlc2V0ID0gKGlzc2V0KCRwYXJhbXNbJ25SZXNldCddKSAmJiAoaW50KSRwYXJhbXNbJ25SZXNldCddID09PSAxKTsgJGNVUkwgPSAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXTsgJGNQYXJhbWV0ZXJfYXJyID0gYXJyYXkoJyZhYVBhcmFtcycsICc/YWFQYXJhbXMnLCAnJmFhUmVzZXQnLCAnP2FhUmVzZXQnKTsgJGFhRW50aGFsdGVuID0gZmFsc2U7IGZvcmVhY2ggKCRjUGFyYW1ldGVyX2FyciBhcyAkY1BhcmFtZXRlcikgeyAkYWFFbnRoYWx0ZW4gPSBzdHJwb3MoJGNVUkwsICRjUGFyYW1ldGVyKTsgaWYgKCRhYUVudGhhbHRlbiAhPT0gZmFsc2UpIHsgJGNVUkwgPSBzdWJzdHIoJGNVUkwsIDAsICRhYUVudGhhbHRlbik7IGJyZWFrOyB9ICRhYUVudGhhbHRlbiA9IGZhbHNlOyB9IGlmICgkYWFFbnRoYWx0ZW4gIT09IGZhbHNlKSB7ICRjVVJMID0gc3Vic3RyKCRjVVJMLCAwLCAkYWFFbnRoYWx0ZW4pOyB9IGlmIChpc3NldCgkcGFyYW1zWydiVXJsT25seSddKSAmJiAoaW50KSRwYXJhbXNbJ2JVcmxPbmx5J10gPT09IDEpIHsgcmV0dXJuICRjVVJMOyB9ICRjUGFyYW1zID0gJyc7IHVuc2V0KCRwYXJhbXNbJ25SZXNldCddKTsgaWYgKGlzX2FycmF5KCRwYXJhbXMpICYmIGNvdW50KCRwYXJhbXMpID4gMCkgeyBmb3JlYWNoICgkcGFyYW1zIGFzICRrZXkgPT4gJHBhcmFtKSB7ICRjUGFyYW1zIC49ICRrZXkgLiAnPScgLiAkcGFyYW0gLiAnOyc7IH0gfSBpZiAoc3RycG9zKCRjVVJMLCAnPycpICE9PSBmYWxzZSkgeyAkY1VSTCAuPSAkYlJlc2V0ID8gJyZhYVJlc2V0PScgOiAnJmFhUGFyYW1zPSc7IH0gZWxzZSB7ICRjVVJMIC49ICRiUmVzZXQgPyAnP2FhUmVzZXQ9JyA6ICc/YWFQYXJhbXM9JzsgfSByZXR1cm4gJGNVUkwgLiBiYXNlNjRfZW5jb2RlKCRjUGFyYW1zKTsgfSBmdW5jdGlvbiBnZXRfbmF2aWdhdGlvbigkcGFyYW1zLCAmJHNtYXJ0eSkgeyAkbGlua2dyb3VwSWRlbnRpZmllciA9ICRwYXJhbXNbJ2xpbmtncm91cElkZW50aWZpZXInXTsgJG9MaW5rR3J1cHBlID0gbnVsbDsgaWYgKHN0cmxlbigkbGlua2dyb3VwSWRlbnRpZmllcikgPiAwKSB7ICRsaW5rR3JvdXBzID0gTGlua0hlbHBlcjo6Z2V0SW5zdGFuY2UoKS0+Z2V0TGlua0dyb3VwcygpOyAkb0xpbmtHcnVwcGUgPSBpc3NldCgkbGlua0dyb3Vwcy0+eyRsaW5rZ3JvdXBJZGVudGlmaWVyfSkgPyAkbGlua0dyb3Vwcy0+eyRsaW5rZ3JvdXBJZGVudGlmaWVyfSA6IG51bGw7IH0gaWYgKGlzX29iamVjdCgkb0xpbmtHcnVwcGUpICYmIGlzc2V0KCRwYXJhbXNbJ2Fzc2lnbiddKSkgeyAkc21hcnR5LT5hc3NpZ24oJHBhcmFtc1snYXNzaWduJ10sIGJ1aWxkX25hdmlnYXRpb25fc3Vicygkb0xpbmtHcnVwcGUpKTsgfSB9IGZ1bmN0aW9uIGJ1aWxkX25hdmlnYXRpb25fc3Vicygkb0xpbmtfYXJyLCAka1ZhdGVyTGluayA9IDApIHsgJG9OZXdfYXJyID0gYXJyYXkoKTsgaWYgKCRvTGlua19hcnItPmNOYW1lICE9PSAnaGlkZGVuJykgeyAkY0lTTyA9ICRfU0VTU0lPTlsnY0lTT1NwcmFjaGUnXTsgZm9yZWFjaCAoJG9MaW5rX2Fyci0+TGlua3MgYXMgJiRvTGluaykgeyBpZiAoJG9MaW5rLT5rVmF0ZXJMaW5rID09ICRrVmF0ZXJMaW5rKSB7ICRvTGluay0+b1N1Yl9hcnIgPSBidWlsZF9uYXZpZ2F0aW9uX3N1YnMoJG9MaW5rX2FyciwgJG9MaW5rLT5rTGluayk7ICRvTGluay0+YklzQWN0aXZlID0gZmFsc2U7IGlmIChpc3NldCgkR0xPQkFMU1sna0xpbmsnXSkgJiYgJEdMT0JBTFNbJ2tMaW5rJ10gPT0gJG9MaW5rLT5rTGluaykgeyAkb0xpbmstPmJJc0FjdGl2ZSA9IHRydWU7IH0gJGNUaXRsZSA9ICcnOyBpZiAoaXNzZXQoJG9MaW5rLT5jTG9jYWxpemVkVGl0bGVbJGNJU09dKSAmJiAkb0xpbmstPmNMb2NhbGl6ZWRUaXRsZVskY0lTT10gIT0gJG9MaW5rLT5jTG9jYWxpemVkTmFtZVskY0lTT10pIHsgJGNUaXRsZSA9IFN0cmluZ0hhbmRsZXI6Omh0bWxlbnRpdGllcygkb0xpbmstPmNMb2NhbGl6ZWRUaXRsZVskY0lTT10sIEVOVF9RVU9URVMpOyB9ICRvTGluay0+Y1RpdGxlID0gJGNUaXRsZTsgJG9OZXdfYXJyW10gPSAkb0xpbms7IH0gfSB9IHJldHVybiAkb05ld19hcnI7IH0gZnVuY3Rpb24gZ2V0X3RydXN0ZWRzaG9wc19kYXRhKCRwYXJhbXMsICYkc21hcnR5KSB7IHJlcXVpcmVfb25jZSBQRkFEX1JPT1QgLiBQRkFEX0NMQVNTRVMgLiAnY2xhc3MuSlRMLVNob3AuVHJ1c3RlZFNob3BzLnBocCc7ICRvVHJ1c3RlZFNob3BzID0gbmV3IFRydXN0ZWRTaG9wcygtMSwgU3RyaW5nSGFuZGxlcjo6Y29udmVydElTTzJJU082MzkoJF9TRVNTSU9OWydjSVNPU3ByYWNoZSddKSk7ICR2YWx1ZVsndHNJZCddID0gJG9UcnVzdGVkU2hvcHMtPnRzSWQ7ICR2YWx1ZVsnbkFrdGl2J10gPSAkb1RydXN0ZWRTaG9wcy0+bkFrdGl2OyAkc21hcnR5LT5hc3NpZ24oJHBhcmFtc1snYXNzaWduJ10sICR2YWx1ZSk7IH0gZnVuY3Rpb24gcHJlcGFyZV9pbWFnZV9kZXRhaWxzKCRwYXJhbXMsICYkc21hcnR5KSB7IGlmICghaXNzZXQoJHBhcmFtc1snaXRlbSddKSkgeyByZXR1cm4gbnVsbDsgfSAkcmVzdWx0ID0gYXJyYXkoICd4cycgPT4gZ2V0X2ltYWdlX3NpemUoJHBhcmFtc1snaXRlbSddLT5jUGZhZE1pbmkpLCAnc20nID0+IGdldF9pbWFnZV9zaXplKCRwYXJhbXNbJ2l0ZW0nXS0+Y1BmYWRLbGVpbiksICdtZCcgPT4gZ2V0X2ltYWdlX3NpemUoJHBhcmFtc1snaXRlbSddLT5jUGZhZE5vcm1hbCksICdsZycgPT4gZ2V0X2ltYWdlX3NpemUoJHBhcmFtc1snaXRlbSddLT5jUGZhZEdyb3NzKSApOyBpZiAoaXNzZXQoJHBhcmFtc1sndHlwZSddKSkgeyAkdHlwZSA9ICRwYXJhbXNbJ3R5cGUnXTsgaWYgKGlzc2V0KCRyZXN1bHRbJHR5cGVdKSkgeyAkcmVzdWx0ID0gJHJlc3VsdFskdHlwZV07IH0gfSAkcmVzdWx0ID0gKG9iamVjdCkkcmVzdWx0OyByZXR1cm4gKGlzc2V0KCRwYXJhbXNbJ2pzb24nXSkgJiYgJHBhcmFtc1snanNvbiddKSA/IGpzb25fZW5jb2RlKCRyZXN1bHQsIEpTT05fRk9SQ0VfT0JKRUNUKSA6ICRyZXN1bHQ7IH0gZnVuY3Rpb24gZ2V0X2ltYWdlX3NpemUoJGltYWdlKSB7ICRwYXRoID0gKHN0cnBvcygkaW1hZ2UsIFBGQURfQklMREVSKSA9PT0gMCkgPyBQRkFEX1JPT1QgLiAkaW1hZ2UgOiAkaW1hZ2U7IGlmICghZmlsZV9leGlzdHMoJHBhdGgpKSB7ICRyZXEgPSBNZWRpYUltYWdlOjp0b1JlcXVlc3QoJHBhdGgpOyBpZiAoIWlzX29iamVjdCgkcmVxKSkgeyByZXR1cm4gbnVsbDsgfSAkc2V0dGluZ3MgPSBJbWFnZTo6Z2V0U2V0dGluZ3MoKTsgJHJlZkltYWdlID0gJHJlcS0+Z2V0UmF3KCk7IGlmICgkcmVmSW1hZ2UgPT09IG51bGwpIHsgcmV0dXJuIG51bGw7IH0gbGlzdCgkd2lkdGgsICRoZWlnaHQsICR0eXBlLCAkYXR0cikgPSBnZXRpbWFnZXNpemUoJHJlZkltYWdlKTsgJHNpemUgPSAkc2V0dGluZ3NbJ3NpemUnXVskcmVxLT5nZXRTaXplVHlwZSgpXTsgJG1heF93aWR0aCA9ICRzaXplWyd3aWR0aCddOyAkbWF4X2hlaWdodCA9ICRzaXplWydoZWlnaHQnXTsgJG9sZF93aWR0aCA9ICR3aWR0aDsgJG9sZF9oZWlnaHQgPSAkaGVpZ2h0OyAkc2NhbGUgPSBtaW4oJG1heF93aWR0aCAvICRvbGRfd2lkdGgsICRtYXhfaGVpZ2h0IC8gJG9sZF9oZWlnaHQpOyAkd2lkdGggPSBjZWlsKCRzY2FsZSAqICRvbGRfd2lkdGgpOyAkaGVpZ2h0ID0gY2VpbCgkc2NhbGUgKiAkb2xkX2hlaWdodCk7IH0gZWxzZSB7IGxpc3QoJHdpZHRoLCAkaGVpZ2h0LCAkdHlwZSwgJGF0dHIpID0gZ2V0aW1hZ2VzaXplKCRwYXRoKTsgfSByZXR1cm4gKG9iamVjdClhcnJheSggJ3NyYycgPT4gJGltYWdlLCAnc2l6ZScgPT4gKG9iamVjdClhcnJheSggJ3dpZHRoJyA9PiAkd2lkdGgsICdoZWlnaHQnID0+ICRoZWlnaHQgKSwgJ3R5cGUnID0+ICR0eXBlICk7IH0gZnVuY3Rpb24gZ2V0X2Ntc19jb250ZW50KCRwYXJhbXMsICYkc21hcnR5KSB7IGlmIChpc3NldCgkcGFyYW1zWydrTGluayddKSAmJiAoaW50KSRwYXJhbXNbJ2tMaW5rJ10gPiAwKSB7ICRrTGluayA9IChpbnQpJHBhcmFtc1sna0xpbmsnXTsgJGxpbmtIZWxwZXIgPSBMaW5rSGVscGVyOjpnZXRJbnN0YW5jZSgpOyAkb0xpbmsgPSAkbGlua0hlbHBlci0+Z2V0UGFnZUxpbmsoJGtMaW5rKTsgJG9MaW5rLT5TcHJhY2hlID0gJGxpbmtIZWxwZXItPmdldFBhZ2VMaW5rTGFuZ3VhZ2UoJG9MaW5rLT5rTGluayk7IGlmIChpc3NldCgkcGFyYW1zWydhc3NpZ24nXSkpIHsgJHNtYXJ0eS0+YXNzaWduKCRwYXJhbXNbJ2Fzc2lnbiddLCAkb0xpbmstPlNwcmFjaGUtPmNDb250ZW50KTsgfSBlbHNlIHsgcmV0dXJuICRvTGluay0+U3ByYWNoZS0+Y0NvbnRlbnQ7IH0gfSByZXR1cm4gbnVsbDsgfSBmdW5jdGlvbiBoYXNPbmx5TGlzdGFibGVWYXJpYXRpb25zKCRwYXJhbXMsICYkc21hcnR5KSB7IGlmICghaXNzZXQoJHBhcmFtc1snYXJ0aWtlbCddLT5WYXJpYXRpb25lbikgfHwgU2hvcDo6Z2V0VmVyc2lvbigpIDwgNDA2KSB7IGlmIChpc3NldCgkcGFyYW1zWydhc3NpZ24nXSkpIHsgJHNtYXJ0eS0+YXNzaWduKCRwYXJhbXNbJ2Fzc2lnbiddLCAwKTsgcmV0dXJuIG51bGw7IH0gcmV0dXJuIDA7IH0gJG1heFZhcmlhdGlvbkNvdW50ID0gaXNzZXQoJHBhcmFtc1snbWF4VmFyaWF0aW9uQ291bnQnXSkgPyAoaW50KSRwYXJhbXNbJ21heFZhcmlhdGlvbkNvdW50J10gOiAxOyAkbWF4V2VydGVDb3VudCA9IGlzc2V0KCRwYXJhbXNbJ21heFdlcnRlQ291bnQnXSkgPyAoaW50KSRwYXJhbXNbJ21heFdlcnRlQ291bnQnXSA6IDM7ICR2YXJpYXRpb25DaGVjayA9IGZ1bmN0aW9uICgkVmFyaWF0aW9uZW4sICRtYXhWYXJpYXRpb25Db3VudCwgJG1heFdlcnRlQ291bnQpIHsgJHJlc3VsdCA9IHRydWU7ICR2YXJDb3VudCA9IGlzX2FycmF5KCRWYXJpYXRpb25lbikgPyBjb3VudCgkVmFyaWF0aW9uZW4pIDogMDsgaWYgKCR2YXJDb3VudCA+IDAgJiYgJHZhckNvdW50IDw9ICRtYXhWYXJpYXRpb25Db3VudCkgeyBmb3JlYWNoICgkVmFyaWF0aW9uZW4gYXMgJG9WYXJpYXRpb24pIHsgaWYgKCRvVmFyaWF0aW9uLT5jVHlwICE9PSAnU0VMRUNUQk9YJyAmJiAoIWluX2FycmF5KCRvVmFyaWF0aW9uLT5jVHlwLCBbJ1RFWFRTV0FUQ0hFUycsICdJTUdTV0FUQ0hFUycsICdSQURJTyddLCB0cnVlKSB8fCBjb3VudCgkb1ZhcmlhdGlvbi0+V2VydGUpID4gJG1heFdlcnRlQ291bnQpICkgeyAkcmVzdWx0ID0gZmFsc2U7IGJyZWFrOyB9IH0gfSBlbHNlIHsgJHJlc3VsdCA9IGZhbHNlOyB9IHJldHVybiAkcmVzdWx0OyB9OyAkcmVzdWx0ID0gJHZhcmlhdGlvbkNoZWNrKCRwYXJhbXNbJ2FydGlrZWwnXS0+VmFyaWF0aW9uZW4sICRtYXhWYXJpYXRpb25Db3VudCwgJG1heFdlcnRlQ291bnQpID8gMSA6IDA7IGlmICgkcmVzdWx0ID09PSAwICYmICRwYXJhbXNbJ2FydGlrZWwnXS0+a1ZhdGVyQXJ0aWtlbCA+IDApIHsgJHJlc3VsdCA9ICR2YXJpYXRpb25DaGVjaygkcGFyYW1zWydhcnRpa2VsJ10tPm9WYXJpYXRpb25lbk51cktpbmRfYXJyLCAkbWF4VmFyaWF0aW9uQ291bnQsICRtYXhXZXJ0ZUNvdW50KSA/IDIgOiAwOyB9IGlmIChpc3NldCgkcGFyYW1zWydhc3NpZ24nXSkpIHsgJHNtYXJ0eS0+YXNzaWduKCRwYXJhbXNbJ2Fzc2lnbiddLCAkcmVzdWx0KTsgcmV0dXJuIG51bGw7IH0gcmV0dXJuICRyZXN1bHQ7IH0gZnVuY3Rpb24gZ2V0X3RyYW5zbGF0aW9uKCRtaXhlZCwgJHRvID0gbnVsbCkgeyAkdG8gPSAkdG8gPzogU2hvcDo6Z2V0TGFuZ3VhZ2UodHJ1ZSk7IGlmIChoYXNfdHJhbnNsYXRpb24oJG1peGVkLCAkdG8pKSB7IHJldHVybiBpc19zdHJpbmcoJG1peGVkKSA/ICRtaXhlZCA6ICRtaXhlZFskdG9dOyB9IHJldHVybiBudWxsOyB9IGZ1bmN0aW9uIGhhc190cmFuc2xhdGlvbigkbWl4ZWQsICR0byA9IG51bGwpIHsgJHRvID0gJHRvID86IFNob3A6OmdldExhbmd1YWdlKHRydWUpOyByZXR1cm4gaXNfc3RyaW5nKCRtaXhlZCkgPzogaXNzZXQoJG1peGVkWyR0b10pOyB9IGZ1bmN0aW9uIHMzNjBfbG9hZF9lbGVtZW50KCRwYXJhbXMsICYkc21hcnR5KSB7ICR0eXBlID0gJHBhcmFtc1sndHlwZSddOyAkaWQgPSAkcGFyYW1zWydpZCddOyAkYXJlYSA9ICRwYXJhbXNbJ2FyZWEnXTsgJGtleSA9IG51bGw7IGlmIChpc3NldCgkcGFyYW1zWydrZXknXSkpIHsgJGtleSA9ICRwYXJhbXNbJ2tleSddOyB9IGlmIChlbXB0eSgkdHlwZSkgfHwgZW1wdHkoJGlkKSB8fCBlbXB0eSgkYXJlYSkpIHsgcmV0dXJuICcnOyB9IHJldHVybiBTMzYwVGVtcGxhdGVIZWxwZXI6OnJlbmRlckVsZW1lbnQoJHR5cGUsICRpZCwgJGFyZWEsICRrZXkpOyB9IGZ1bmN0aW9uIHMzNjBfZ2V0X3Nob3BfdmVyc2lvbigkcGFyYW1zLCAmJHNtYXJ0eSkgeyAkcmVzdWx0ID0gKGludClTaG9wOjpnZXRWZXJzaW9uKCk7IGlmIChpc3NldCgkcGFyYW1zWydhc3NpZ25UbyddKSAmJiAkcGFyYW1zWydhc3NpZ25UbyddICE9PSAnJykgeyAkc21hcnR5LT5hc3NpZ24oJHBhcmFtc1snYXNzaWduVG8nXSwgJHJlc3VsdCk7IHJldHVybiAnJzsgfSByZXR1cm4gJHJlc3VsdDsgfSBmdW5jdGlvbiBzMzYwX2RldGVjdF9kZXZpY2UoJHBhcmFtcywgJiRzbWFydHkpIHsgcmV0dXJuIFMzNjBUZW1wbGF0ZUhlbHBlcjo6ZGV0ZWN0RGV2aWNlKCk7IH0gZnVuY3Rpb24gczM2MF9pc19jaGVja291dCgkcGFyYW1zLCAmJHNtYXJ0eSkgeyAkcmVzdWx0ID0gKFNob3A6OmdldFBhZ2VUeXBlKCkgPT09IFBBR0VfQkVTVEVMTFZPUkdBTkcpOyBpZiAoaXNzZXQoJHBhcmFtc1snYXNzaWduVG8nXSkgJiYgJHBhcmFtc1snYXNzaWduVG8nXSAhPT0gJycpIHsgJHNtYXJ0eS0+YXNzaWduKCRwYXJhbXNbJ2Fzc2lnblRvJ10sICRyZXN1bHQpOyByZXR1cm4gJyc7IH0gcmV0dXJuICRyZXN1bHQ7IH0gZnVuY3Rpb24gczM2MF9sb2FkX2dsb2JhbF9zZXR0aW5nKCRwYXJhbXMsICYkc21hcnR5KSB7ICR0eXBlID0gJHBhcmFtc1sndHlwZSddOyAkcmVzdWx0ID0gbnVsbDsgaWYgKGVtcHR5KCR0eXBlKSkgeyAkcmVzdWx0ID0gJyc7IH0gZWxzZSB7IGlmIChTaG9wOjpnZXQoJ3MzNjBfZ2xvYmFsX3NldHRpbmdfJyAuICR0eXBlKSAhPT0gbnVsbCkgeyAkcmVzdWx0ID0gU2hvcDo6Z2V0KCdzMzYwX2dsb2JhbF9zZXR0aW5nXycgLiAkdHlwZSk7IH0gZWxzZSB7ICRyZXN1bHQgPSBTMzYwVGVtcGxhdGVIZWxwZXI6OmxvYWRHbG9iYWxTZXR0aW5nKCR0eXBlKTsgU2hvcDo6c2V0KCdzMzYwX2dsb2JhbF9zZXR0aW5nXycgLiAkdHlwZSwgJHJlc3VsdCk7IH0gfSBpZiAoaXNzZXQoJHBhcmFtc1snYXNzaWduVG8nXSkgJiYgJHBhcmFtc1snYXNzaWduVG8nXSAhPT0gJycpIHsgJHNtYXJ0eS0+YXNzaWduKCRwYXJhbXNbJ2Fzc2lnblRvJ10sICRyZXN1bHQpOyByZXR1cm4gJyc7IH0gcmV0dXJuICRyZXN1bHQ7IH0gZnVuY3Rpb24gczM2MF9sb2FkX3RpbWVzdGFtcCgkcGFyYW1zLCAmJHNtYXJ0eSkgeyBpZiAoU2hvcDo6Z2V0KCdzMzYwX2xlc3NfdGltZXN0YW1wJykgIT09IG51bGwpIHsgcmV0dXJuIFNob3A6OmdldCgnczM2MF9sZXNzX3RpbWVzdGFtcCcpOyB9ICR0aW1lc3RhbXAgPSBTMzYwVGVtcGxhdGVIZWxwZXI6OmxvYWRUaW1lc3RhbXAoKTsgU2hvcDo6c2V0KCdzMzYwX2xlc3NfdGltZXN0YW1wJywgJHRpbWVzdGFtcCk7IHJldHVybiAkdGltZXN0YW1wOyB9IGZ1bmN0aW9uIHMzNjBfbG9hZF9zcGVjaWFsX2xpbmsoJHBhcmFtcywgJiRzbWFydHkpIHsgJHR5cGUgPSAkcGFyYW1zWyd0eXBlJ107ICRhc3NpZ24gPSAkcGFyYW1zWydhc3NpZ25UbyddOyAkcmVzID0gU2hvcDo6REIoKS0+c2VsZWN0KCd0bGluaycsICduTGlua0FydCcsICR0eXBlKTsgaWYgKCFlbXB0eSgkcmVzKSkgeyAkb0xpbmsgPSBuZXcgTGluaygkcmVzLT5rTGluayk7IGlmICghZW1wdHkoJGFzc2lnbikpIHsgJHNtYXJ0eS0+YXNzaWduKCRhc3NpZ24sICRvTGluayk7IFNob3A6OlNtYXJ0eSgpLT5hc3NpZ24oJGFzc2lnbiwgJG9MaW5rKTsgfSB9IHJldHVybiAnJzsgfSBmdW5jdGlvbiBzMzYwX2dldF9scGFfbW9kZSgkcGFyYW1zLCAmJHNtYXJ0eSkgeyBpZiAoU2hvcDo6Z2V0KCdzMzYwX2Vhc3l0ZW1wbGF0ZV9scGFfbW9kZScpICE9PSBudWxsKSB7IHJldHVybiBTaG9wOjpnZXQoJ3MzNjBfZWFzeXRlbXBsYXRlX2xwYV9tb2RlJyk7IH0gJHBsdWdpbiA9IFBsdWdpbjo6Z2V0UGx1Z2luQnlJZCgnczM2MF9hbWF6b25fbHBhX3Nob3A0Jyk7IGlmICgkcGx1Z2luID09PSBudWxsKSB7IFNob3A6OnNldCgnczM2MF9lYXN5dGVtcGxhdGVfbHBhX21vZGUnLCAnJyk7IHJldHVybiAnJzsgfSBpZiAoJHBsdWdpbi0+blN0YXR1cyAhPT0gMikgeyBTaG9wOjpzZXQoJ3MzNjBfZWFzeXRlbXBsYXRlX2xwYV9tb2RlJywgJycpOyByZXR1cm4gJyc7IH0gcmVxdWlyZV9vbmNlKCRwbHVnaW4tPmNGcm9udGVuZFBmYWQgLiAnbGliL2xwYV9kZWZpbmVzLnBocCcpOyBpZiAoJHBsdWdpbi0+b1BsdWdpbkVpbnN0ZWxsdW5nQXNzb2NfYXJyW1MzNjBfTFBBX0NPTkZLRVlfR0VORVJBTF9BQ1RJVkVdID09IDApIHsgU2hvcDo6c2V0KCdzMzYwX2Vhc3l0ZW1wbGF0ZV9scGFfbW9kZScsICcnKTsgcmV0dXJuICcnOyB9IGlmICgkcGx1Z2luLT5vUGx1Z2luRWluc3RlbGx1bmdBc3NvY19hcnJbUzM2MF9MUEFfQ09ORktFWV9ISURERU5CVVRUT05TX0FDVElWRV0gPT0gMSAmJiAhaXNzZXQoJF9HRVRbJ2xwYS1zaG93J10pKSB7IFNob3A6OnNldCgnczM2MF9lYXN5dGVtcGxhdGVfbHBhX21vZGUnLCAnJyk7IHJldHVybiAnJzsgfSAkbW9kZSA9ICRwbHVnaW4tPm9QbHVnaW5FaW5zdGVsbHVuZ0Fzc29jX2FycltTMzYwX0xQQV9DT05GS0VZX0dFTkVSQUxfTU9ERV07IGlmICgkbW9kZSAhPT0gJ2wnKSB7ICRjaGVja291dFBvc3NpYmxlID0gdHJ1ZTsgaWYgKCFpc3NldCgkX1NFU1NJT05bIldhcmVua29yYiJdKSB8fCAkX1NFU1NJT05bIldhcmVua29yYiJdLT5pc3RCZXN0ZWxsdW5nTW9lZ2xpY2goKSAhPT0gMTApIHsgJGNoZWNrb3V0UG9zc2libGUgPSBmYWxzZTsgfSBlbHNlaWYgKGlzc2V0KCRfU0VTU0lPTlsiV2FyZW5rb3JiIl0pKSB7IGZvcmVhY2ggKCRfU0VTU0lPTlsnV2FyZW5rb3JiJ10tPlBvc2l0aW9uZW5BcnIgYXMgJG9Qb3NpdGlvbikgeyBpZiAoKGludCkkb1Bvc2l0aW9uLT5uUG9zVHlwID09PSAoaW50KUNfV0FSRU5LT1JCUE9TX1RZUF9BUlRJS0VMICYmIGlzX29iamVjdCgkb1Bvc2l0aW9uLT5BcnRpa2VsKSkgeyBpZiAoaXNzZXQoJG9Qb3NpdGlvbi0+QXJ0aWtlbC0+RnVua3Rpb25zQXR0cmlidXRlWydleGNsdWRlX2FtYXBheSddKSB8fCBpc3NldCgkb1Bvc2l0aW9uLT5BcnRpa2VsLT5BdHRyaWJ1dGVBc3NvY1snZXhjbHVkZV9hbWFwYXknXSkpIHsgJGNoZWNrb3V0UG9zc2libGUgPSBmYWxzZTsgYnJlYWs7IH0gfSB9IH0gaWYgKCEkY2hlY2tvdXRQb3NzaWJsZSkgeyAkbW9kZSA9IHN0cl9yZXBsYWNlKCdwJywgJycsICRtb2RlKTsgfSB9IFNob3A6OnNldCgnczM2MF9lYXN5dGVtcGxhdGVfbHBhX21vZGUnLCAkbW9kZSk7IHJldHVybiAkbW9kZTsgfSBmdW5jdGlvbiBzMzYwX2dldF9scGFfYnV0dG9uKCRwYXJhbXMsICYkc21hcnR5KSB7ICR0eXBlID0gJHBhcmFtc1sndHlwZSddOyAkbW9kZSA9IHMzNjBfZ2V0X2xwYV9tb2RlKCRwYXJhbXMsICRzbWFydHkpOyBpZiAoZW1wdHkoJG1vZGUpIHx8ICgkdHlwZSAhPT0gJ3BheScgJiYgJHR5cGUgIT09ICdsb2dpbicpKSB7IHJldHVybiAnJzsgfSBpZiAoJHR5cGUgPT09ICdwYXknICYmICRtb2RlID09PSAnbCcpIHsgcmV0dXJuICcnOyB9IGlmICgkdHlwZSA9PT0gJ2xvZ2luJyAmJiAkbW9kZSA9PT0gJ3AnKSB7IHJldHVybiAnJzsgfSAkb1BsdWdpbiA9IFBsdWdpbjo6Z2V0UGx1Z2luQnlJZCgnczM2MF9hbWF6b25fbHBhX3Nob3A0Jyk7IGlmIChlbXB0eSgkb1BsdWdpbikpIHsgcmV0dXJuICcnOyB9IHJlcXVpcmVfb25jZSgkb1BsdWdpbi0+Y0Zyb250ZW5kUGZhZCAuICdsaWIvbHBhX2RlZmluZXMucGhwJyk7IHJlcXVpcmVfb25jZSgkb1BsdWdpbi0+Y0Zyb250ZW5kUGZhZCAuICdsaWIvbHBhX3V0aWxzLnBocCcpOyByZXF1aXJlX29uY2UoJG9QbHVnaW4tPmNGcm9udGVuZFBmYWQgLiAnbGliL2NsYXNzLkxQQUNvbnRyb2xsZXIucGhwJyk7IHJlcXVpcmVfb25jZSgkb1BsdWdpbi0+Y0Zyb250ZW5kUGZhZCAuICdsaWIvY2xhc3MuTFBBUmVuZGVySGVscGVyLnBocCcpOyAkY29udHJvbGxlciA9IG5ldyBMUEFDb250cm9sbGVyKCk7ICRjb25maWcgPSAkY29udHJvbGxlci0+Z2V0Q29uZmlnKCk7ICRzY29wZSA9ICJwcm9maWxlIHBheW1lbnRzOndpZGdldCBwYXltZW50czpzaGlwcGluZ19hZGRyZXNzIjsgJGxhbmd1YWdlX3N1ZmZpeCA9ICcnOyAkbHBhX2xhbmd1YWdlX2NvZGUgPSAiZGUtREUiOyBpZiAoU2hvcDo6Z2V0TGFuZ3VhZ2UodHJ1ZSkgPT09ICJlbmciKSB7ICRsYW5ndWFnZV9zdWZmaXggPSAnLWVuJzsgJGxwYV9sYW5ndWFnZV9jb2RlID0gJ2VuLUdCJzsgfSAkbHBhX2FqYXhfdXJscyA9IGFycmF5KCk7ICRscGFfYWpheF91cmxzWydkZWxpdmVyeV9zZWxlY3Rpb24nXSA9ICRvUGx1Z2luLT5jRnJvbnRlbmRQZmFkVVJMU1NMIC4gJ2FqYXgvbHBhX2FqYXhfdXBkYXRlX2RlbGl2ZXJ5X3NlbGVjdGlvbi5waHAnOyAkbHBhX2FqYXhfdXJsc1sndXBkYXRlX3NlbGVjdGVkX3NoaXBwaW5nX21ldGhvZCddID0gJG9QbHVnaW4tPmNGcm9udGVuZFBmYWRVUkxTU0wgLiAnYWpheC9scGFfYWpheF91cGRhdGVfc2VsZWN0ZWRfc2hpcHBpbmdfbWV0aG9kLnBocCc7ICRscGFfYWpheF91cmxzWydjb25maXJtX29yZGVyJ10gPSAkb1BsdWdpbi0+Y0Zyb250ZW5kUGZhZFVSTFNTTCAuICdhamF4L2xwYV9hamF4X2NvbmZpcm1fb3JkZXIucGhwJzsgJGxwYV9hamF4X3VybHNbJ3NlbGVjdF9hY2NvdW50X2FkZHJlc3MnXSA9ICRvUGx1Z2luLT5jRnJvbnRlbmRQZmFkVVJMU1NMIC4gJ2FqYXgvbHBhX2FqYXhfc2VsZWN0X2FjY291bnRfYWRkcmVzcy5waHAnOyAkbHBhX290aGVyX3VybHNbJ2NoZWNrb3V0J10gPSBTaG9wOjpnZXRVUkwodHJ1ZSkgLiAnL2xwYWNoZWNrb3V0JyAuICRsYW5ndWFnZV9zdWZmaXg7ICRjb21wbGV0ZVVybExvY2FsaXplZCA9IHN0cl9yZXBsYWNlKCJodHRwOi8vIiwgImh0dHBzOi8vIiwgU2hvcDo6Z2V0VVJMKCkpIC4gJy9scGFjb21wbGV0ZScgLiAkbGFuZ3VhZ2Vfc3VmZml4OyAkbHBhX290aGVyX3VybHNbJ2NvbXBsZXRlX2xvY2FsaXplZCddID0gJGNvbXBsZXRlVXJsTG9jYWxpemVkOyAkYmFzZVBhdGggPSBscGFHZXRTaG9wQmFzZVBhdGgoKTsgaWYgKGVtcHR5KCRiYXNlUGF0aCkgfHwgJGJhc2VQYXRoID09PSAnLycpIHsgJGJhc2VQYXRoID0gJyc7IH0gJGxwYV9wYXlidXR0b25fY3NzX2xpbmsgPSAkb1BsdWdpbi0+Y0Zyb250ZW5kUGZhZFVSTFNTTCAuICdjc3MvbHBhLXBheS1idXR0b24uY3NzJzsgJGxwYV9wYXlidXR0b25fY3NzX2N1c3RvbV9saW5rID0gJyc7IGlmIChmaWxlX2V4aXN0cygkb1BsdWdpbi0+Y0Zyb250ZW5kUGZhZCAuICdjc3MvbHBhLXBheS1idXR0b25fY3VzdG9tLmNzcycpKSB7ICRscGFfcGF5YnV0dG9uX2Nzc19jdXN0b21fbGluayA9ICRvUGx1Z2luLT5jRnJvbnRlbmRQZmFkVVJMU1NMIC4gJ2Nzcy9scGEtcGF5LWJ1dHRvbl9jdXN0b20uY3NzJzsgfSAkbHBhX3Rvb2x0aXBfY3NzX2xpbmsgPSAkb1BsdWdpbi0+Y0Zyb250ZW5kUGZhZFVSTFNTTCAuICdjc3MvbHBhLXRvb2x0aXAuY3NzJzsgJGxwYV90b29sdGlwX2Nzc19jdXN0b21fbGluayA9ICcnOyBpZiAoZmlsZV9leGlzdHMoJG9QbHVnaW4tPmNGcm9udGVuZFBmYWQgLiAnY3NzL2xwYS10b29sdGlwX2N1c3RvbS5jc3MnKSkgeyAkbHBhX3Rvb2x0aXBfY3NzX2N1c3RvbV9saW5rID0gJG9QbHVnaW4tPmNGcm9udGVuZFBmYWRVUkxTU0wgLiAnY3NzL2xwYS10b29sdGlwX2N1c3RvbS5jc3MnOyB9ICRscGFfbG9naW5idXR0b25fY3NzX2xpbmsgPSAkb1BsdWdpbi0+Y0Zyb250ZW5kUGZhZFVSTFNTTCAuICdjc3MvbHBhLWxvZ2luLWJ1dHRvbi5jc3MnOyAkbHBhX2xvZ2luYnV0dG9uX2Nzc19jdXN0b21fbGluayA9ICcnOyBpZiAoZmlsZV9leGlzdHMoJG9QbHVnaW4tPmNGcm9udGVuZFBmYWQgLiAnY3NzL2xwYS1sb2dpbi1idXR0b25fY3VzdG9tLmNzcycpKSB7ICRscGFfbG9naW5idXR0b25fY3NzX2N1c3RvbV9saW5rID0gJG9QbHVnaW4tPmNGcm9udGVuZFBmYWRVUkxTU0wgLiAnY3NzL2xwYS1sb2dpbi1idXR0b25fY3VzdG9tLmNzcyc7IH0gJGxvZ2luUmVkaXJlY3RVcmkgPSBudWxsOyBpZigkdHlwZSA9PT0gJ3BheScpIHsgJGxvZ2luUmVkaXJlY3RVcmkgPSBTaG9wOjpnZXRVUkwodHJ1ZSkgLiAnL2xwYWNoZWNrb3V0JyAuICRsYW5ndWFnZV9zdWZmaXg7IH0gZWxzZSB7ICRsb2dpblJlZGlyZWN0VXJpID0gU2hvcDo6Z2V0VVJMKHRydWUpIC4gJy9scGFsb2dpbicgLiAkbGFuZ3VhZ2Vfc3VmZml4OyB9IFNob3A6OlNtYXJ0eSgpLT5hc3NpZ24oJ2xwYV9jbGllbnRfaWQnLCAkY29uZmlnWydjbGllbnRfaWQnXSkgLT5hc3NpZ24oJ2xwYV93aWRnZXRfZW5kcG9pbnQnLCAkY29udHJvbGxlci0+Z2V0RW5kcG9pbnRGb3IoJGNvbmZpZywgJ3dpZGdldFVSTCcpKSAtPmFzc2lnbignbHBhX2xvZ2luX3JlZGlyZWN0X3VyaScsICRsb2dpblJlZGlyZWN0VXJpKSAtPmFzc2lnbignbHBhX3NlbGxlcl9pZCcsICRjb25maWdbJ21lcmNoYW50X2lkJ10pIC0+YXNzaWduKCdscGFfZ2VuZXJhbF9oaWRkZW5idXR0b25zX2FjdGl2ZScsIGZhbHNlKSAtPmFzc2lnbignbHBhX3NhbmRib3hfbW9kZScsIChpbnQpJGNvbmZpZ1snc2FuZGJveCddKSAtPmFzc2lnbignbHBhX2J1dHRvbl9zY29wZScsICRzY29wZSkgLT5hc3NpZ24oJ2xwYV9idXR0b25fdG9vbHRpcCcsICRvUGx1Z2luLT5vUGx1Z2luU3ByYWNodmFyaWFibGVBc3NvY19hcnJbUzM2MF9MUEFfTEFOR0tFWV9UT09MVElQXSkgLT5hc3NpZ24oJ2xwYV9hamF4X3VybHMnLCAkbHBhX2FqYXhfdXJscykgLT5hc3NpZ24oJ2xwYV9vdGhlcl91cmxzJywgJGxwYV9vdGhlcl91cmxzKSAtPmFzc2lnbignbHBhX2xhbmd1YWdlX2NvZGUnLCAkbHBhX2xhbmd1YWdlX2NvZGUpIC0+YXNzaWduKCdscGFfc2hvcF9iYXNlX3BhdGgnLCAkYmFzZVBhdGgpIC0+YXNzaWduKCdscGFfYnV0dG9uX2lkeCcsICdfYWpheF8nIC4gbXRfcmFuZCgxMDAwLCAxMDAwMCkpIC0+YXNzaWduKCdscGFfcGF5YnV0dG9uX2Nzc19saW5rJywgJGxwYV9wYXlidXR0b25fY3NzX2xpbmspIC0+YXNzaWduKCdscGFfcGF5YnV0dG9uX2Nzc19jdXN0b21fbGluaycsICRscGFfcGF5YnV0dG9uX2Nzc19jdXN0b21fbGluaykgLT5hc3NpZ24oJ2xwYV90b29sdGlwX2Nzc19saW5rJywgJGxwYV90b29sdGlwX2Nzc19saW5rKSAtPmFzc2lnbignbHBhX3Rvb2x0aXBfY3NzX2N1c3RvbV9saW5rJywgJGxwYV90b29sdGlwX2Nzc19jdXN0b21fbGluaykgLT5hc3NpZ24oJ2xwYV9sb2dpbmJ1dHRvbl9jc3NfbGluaycsICRscGFfbG9naW5idXR0b25fY3NzX2xpbmspIC0+YXNzaWduKCdscGFfbG9naW5idXR0b25fY3NzX2N1c3RvbV9saW5rJywgJGxwYV9sb2dpbmJ1dHRvbl9jc3NfY3VzdG9tX2xpbmspIC0+YXNzaWduKCdscGFfYnV0dG9uX3BvcHVwJywgJ2ZhbHNlJyk7IGlmICgkdHlwZSA9PT0gJ3BheScpIHsgU2hvcDo6U21hcnR5KCktPmFzc2lnbignbHBhX2J1dHRvbl90eXBlJywgJG9QbHVnaW4tPm9QbHVnaW5FaW5zdGVsbHVuZ0Fzc29jX2FycltTMzYwX0xQQV9DT05GS0VZX1BBWUJVVFRPTl9UWVBFXSkgLT5hc3NpZ24oJ2xwYV9idXR0b25fY29sb3InLCAkb1BsdWdpbi0+b1BsdWdpbkVpbnN0ZWxsdW5nQXNzb2NfYXJyW1MzNjBfTFBBX0NPTkZLRVlfUEFZQlVUVE9OX0NPTE9SXSkgLT5hc3NpZ24oJ2xwYV9idXR0b25fc2l6ZScsICRvUGx1Z2luLT5vUGx1Z2luRWluc3RlbGx1bmdBc3NvY19hcnJbUzM2MF9MUEFfQ09ORktFWV9QQVlCVVRUT05fU0laRV0pOyB9IGVsc2UgeyBTaG9wOjpTbWFydHkoKS0+YXNzaWduKCdscGFfYnV0dG9uX3R5cGUnLCAkb1BsdWdpbi0+b1BsdWdpbkVpbnN0ZWxsdW5nQXNzb2NfYXJyW1MzNjBfTFBBX0NPTkZLRVlfTE9HSU5CVVRUT05fVFlQRV0pIC0+YXNzaWduKCdscGFfYnV0dG9uX2NvbG9yJywgJG9QbHVnaW4tPm9QbHVnaW5FaW5zdGVsbHVuZ0Fzc29jX2FycltTMzYwX0xQQV9DT05GS0VZX0xPR0lOQlVUVE9OX0NPTE9SXSkgLT5hc3NpZ24oJ2xwYV9idXR0b25fc2l6ZScsICRvUGx1Z2luLT5vUGx1Z2luRWluc3RlbGx1bmdBc3NvY19hcnJbUzM2MF9MUEFfQ09ORktFWV9MT0dJTkJVVFRPTl9TSVpFXSk7IH0gcmV0dXJuIFNob3A6OlNtYXJ0eSgpLT5mZXRjaChfX0RJUl9fIC4gJy8uLi9zb2x1dGlvbjM2MC9scGFfYWpheF9mYWxsYmFjay50cGwnKTsgfSBmdW5jdGlvbiBzMzYwX2xhbmcoJHBhcmFtcywgJiRzbWFydHkpIHsgJGZhbGxiYWNrID0gYXJyYXkoICdldDM2MF9scGFfb3InID0+IGFycmF5KCAnZ2VyJyA9PiAnb2RlcicsICdlbmcnID0+ICdvcicsICdmcmUnID0+ICdvdScsICdwb2wnID0+ICdsdWInLCAnZHV0JyA9PiAnb2YnLCAnZGFuJyA9PiAnZWxsZXInLCAnY3plJyA9PiAnbmVibycgKSwgJ2V0MzYwX2xwYV9jaGVja291dF93aXRoX2FtYXpvbicgPT4gYXJyYXkoICdnZXInID0+ICdCZXphaGxlbiBTaWUgbWl0IElocmVtIEFtYXpvbi1Lb250bycsICdlbmcnID0+ICdDaGVjayBvdXQgdXNpbmcgeW91ciBBbWF6b24gYWNjb3VudCcgKSwgJ2V0MzYwX2xvZ29faGludCcgPT4gYXJyYXkoICdnZXInID0+ICdTZXR6ZSBEZWluIFNob3AtTG9nbyB1bnRlciBTdG9yZWZyb250Jm5ic3A7LSZndDsmbmJzcDtTaG9wLUxvZ28gaW0gU2hvcC1CYWNrZW5kIScgKSwgJ2V0MzYwX2xwYV9iYW5uZXJfbGVmdCcgPT4gYXJyYXkoICdnZXInID0+ICdXaXIgYWt6ZXB0aWVyZW4nLCAnZW5nJyA9PiAnV2UgYWNjZXB0JyApLCAnZXQzNjBfbHBhX2Jhbm5lcl9yaWdodCcgPT4gYXJyYXkoICdnZXInID0+ICdNaXQgQW1hem9uIFBheSBrJm91bWw7bm5lbiBTaWUgZGllIFphaGx1bmdzLSB1bmQgQWRyZXNzaW5mb3JtYXRpb25lbiBhdXMgSWhyZW0gQW1hem9uIEFjY291bnQgbnV0emVuLCB1bSBpbiBkaWVzZW0gU2hvcCBzY2huZWxsIHVuZCBzaWNoZXIgZWluenVrYXVmZW4uJywgJ2VuZycgPT4gJ1dpdGggQW1hem9uIFBheSwgeW91IGNhbiB1c2UgdGhlIHBheW1lbnQgYW5kIHNoaXBwaW5nIGluZm9ybWF0aW9uIHN0b3JlZCBpbiB5b3VyIEFtYXpvbiBhY2NvdW50IHRvIHNob3AgcXVpY2tseSwgc2FmZWx5LCBhbmQgc2VjdXJlbHkgb24gdGhpcyBzaXRlLicgKSApOyAka2V5ID0gJHBhcmFtc1sna2V5J107ICR2YWx1ZSA9IFNob3A6OkxhbmcoKS0+Z2V0KCRrZXksICdjdXN0b20nKTsgaWYgKCR2YWx1ZSA9PT0gJyNjdXN0b20uJyAuICRrZXkgLiAnIycpIHsgJGxhbmcgPSBzdHJ0b2xvd2VyKFNob3A6OmdldExhbmd1YWdlKHRydWUpKTsgaWYgKGlzc2V0KCRmYWxsYmFja1ska2V5XSkgJiYgaXNzZXQoJGZhbGxiYWNrWyRrZXldWyRsYW5nXSkpIHsgcmV0dXJuICRmYWxsYmFja1ska2V5XVskbGFuZ107IH0gcmV0dXJuICR2YWx1ZTsgfSByZXR1cm4gJHZhbHVlOyB9IGZ1bmN0aW9uIHMzNjBfaXNfYWpheCgkcGFyYW1zLCAmJHNtYXJ0eSkgeyAkc21hcnR5LT5hc3NpZ24oJHBhcmFtc1snYXNzaWduVG8nXSwgaXNBamF4UmVxdWVzdCgpKTsgfSBmdW5jdGlvbiBzMzYwX3Nob3dfY21zX25hdigkcGFyYW1zLCAmJHNtYXJ0eSkgeyAkcmVzdWx0ID0gdHJ1ZTsgJHVyaSA9IFNob3A6OmdldFJlcXVlc3RVcmkoKTsgaWYgKHN0cmlwb3MoJHVyaSwgJ2xwYWxvZ2luJykgIT09IGZhbHNlIHx8IHN0cmlwb3MoJHVyaSwgJ2xwYWNoZWNrb3V0JykgIT09IGZhbHNlIHx8IHN0cmlwb3MoJHVyaSwgJ2xwYWNvbXBsZXRlJykgIT09IGZhbHNlIHx8IHN0cmlwb3MoJHVyaSwgJ2xwYW1lcmdlJykgIT09IGZhbHNlIHx8IHN0cmlwb3MoJHVyaSwgJ2xwYWNyZWF0ZScpICE9PSBmYWxzZSApIHsgJHJlc3VsdCA9IGZhbHNlOyB9IGlmIChpc3NldCgkcGFyYW1zWydhc3NpZ25UbyddKSkgeyAkc21hcnR5LT5hc3NpZ24oJHBhcmFtc1snYXNzaWduVG8nXSwgJHJlc3VsdCk7IHJldHVybiBudWxsOyB9IHJldHVybiAkcmVzdWx0OyB9IA=='));
Function Calls
base64_decode | 1 |
Stats
MD5 | 53d125e2ed192c35558b85c89157c8fe |
Eval Count | 1 |
Decode Time | 140 ms |