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 $_F=__FILE__;$_C1767279132='Pz48P0RoRA0KDQoNCi8qKg0KKiBuTkggcSBYcXJnIFpOVUJxIG5xZGRO..
Decoded Output download
?><?php
/**
* Get a Easy Media Gallery Global Functions
*
* @param string $name The option name
* @return object|bool Option value on success, false if no value exists
*/
/*
|--------------------------------------------------------------------------
| Easymedia Get Control Panel Options
|--------------------------------------------------------------------------
*/
function easy_get_option( $name ){
$easymedia_values = get_option( 'easy_media_opt' );
if ( is_array( $easymedia_values ) && array_key_exists( $name, $easymedia_values ) ) return $easymedia_values[$name];
return false;
}
/*-------------------------------------------------------------------------------*/
/* ADMIN Register JS & CSS
/*-------------------------------------------------------------------------------*/
function easymedia_reg_script() {
// CSS ( emg-settings.php, tinymce-dlg.php, metaboxes.php )
wp_register_style( 'easymedia-cpstyles', plugins_url( 'css/funcstyle.css' , dirname('index.php') ), false, EASYMEDIA_VERSION, 'all');
wp_register_style( 'easymedia-colorpickercss', plugins_url( 'css/colorpicker.css' , dirname('index.php') ), false, EASYMEDIA_VERSION );
wp_register_style( 'easymedia-sldr', plugins_url( 'css/slider.css' , dirname('index.php') ), false, EASYMEDIA_VERSION );
wp_register_style( 'easymedia-ibutton', plugins_url( 'css/ibutton.css' , dirname('index.php') ), false, EASYMEDIA_VERSION );
wp_register_style( 'easymedia-tinymce', plugins_url( 'css/tinymce.css' , dirname('index.php') ), false, EASYMEDIA_VERSION );
wp_register_style( 'jquery-ui-themes-redmond', plugins_url( 'css/jquery/jquery-ui/themes/smoothness/jquery-ui-1.10.0.custom.min.css' , dirname('index.php') ), false, EASYMEDIA_VERSION );
wp_register_style( 'easymedia-tinymce', plugins_url( 'css/tinymce.css' , dirname('index.php') ), false, EASYMEDIA_VERSION );
wp_register_style( 'jquery-multiselect-css', plugins_url( 'css/jquery/multiselect/jquery.multiselect.css' , dirname('index.php') ), false, EASYMEDIA_VERSION );
wp_register_style( 'jquery-messi-css', plugins_url( 'css/messi.css' , dirname('index.php') ), false, EASYMEDIA_VERSION );
wp_register_style( 'jquery-lightbox-css', plugins_url( 'css/lightbox_me.css' , dirname('index.php') ), false, EASYMEDIA_VERSION );
wp_register_style( 'jquery-gdakramttip-css', plugins_url( 'css/jquery/jquery.tooltip/jquery.tooltip.css' , dirname('index.php') ), false, EASYMEDIA_VERSION );
// JS ( emg-settings.php )
wp_register_script( 'easymedia-jquery-easing', plugins_url( 'js/jquery/jquery.easing.1.3.js' , dirname('index.php') ) );
wp_register_script( 'easymedia-colorpicker', plugins_url( 'js/colorpicker/colorpicker.js' , dirname('index.php') ) );
wp_register_script( 'colorpicker-eye', plugins_url( 'js/colorpicker/eye.js' , dirname('index.php') ) );
wp_register_script( 'colorpicker-utils', plugins_url( 'js/colorpicker/utils.js' , dirname('index.php') ) );
// JS ( tinymce-dlg.php )
//wp_register_script( 'jquery-ui-custom', plugins_url( 'js/jquery/jquery-ui-1.10.0.min.js' , dirname('index.php') ) );
//wp_register_script( 'jquery-ui-custom-1', plugins_url( 'js/jquery/jquery-ui-1.9.2.custom.min.js' , dirname('index.php') ) );
wp_register_script( 'jquery-multi-sel', plugins_url( 'js/jquery/multiselect/jquery.multiselect.js' , dirname('index.php') ) );
//wp_register_style('layoutjs', plugins_url('js/colorpicker/layout.js' , dirname('index.php') ));
// JS ( metaboxes.php, )
wp_register_script( 'jquery-multi-sel', plugins_url( 'js/jquery/multiselect/jquery.multiselect.js' , dirname('index.php') ) );
wp_register_script( 'easymedia-ckeditor', plugins_url( 'addons/ckeditor/ckeditor.js' , dirname('index.php') ) );
wp_register_script( 'jquery-messi-js', plugins_url( 'js/jquery/jquery.messi.min.js' , dirname('index.php') ) );
wp_register_script( 'jquery-lightbox-js', plugins_url( 'js/jquery/jquery.lightbox_me.js' , dirname('index.php') ) );
wp_register_script( 'jquery-gdakram-tooltip', plugins_url( 'js/jquery/jquery.tooltip.js' , dirname('index.php') ) );
}
add_action( 'admin_init', 'easymedia_reg_script' );
function easymedia_frontend_js() {
// JS ( frontend.php )
wp_deregister_script('fittext'); // deregister
wp_register_script( 'fittext', plugins_url( 'js/jquery/jquery.fittext.js' , dirname('index.php') ) );
wp_register_script( 'mootools-core', plugins_url( 'js/mootools/mootools-' .easy_get_option( 'easymedia_plugin_core' ). '.js' , dirname('index.php') ) );
wp_register_script( 'easymedia-core', plugins_url( 'js/mootools/easymedia.js' , dirname('index.php') ) );
wp_register_script( 'easymedia-isotope', plugins_url( 'js/jquery/jquery.isotope.min.js' , dirname('index.php') ) );
wp_register_script( 'easymedia-ajaxfrontend', plugins_url( 'js/func/ajax-frontend.js' , dirname('index.php') ) );
wp_register_script( 'easymedia-frontend', plugins_url( 'js/func/frontend.js' , dirname('index.php') ) );
wp_register_script( 'easymedia-jpages', plugins_url( 'js/jquery/jPages.js' , dirname('index.php') ) );
wp_register_script( 'easymedia-lazyload', plugins_url( 'js/jquery/jquery.lazyload.min.js' , dirname('index.php') ) );
}
add_action( 'wp_enqueue_scripts', 'easymedia_frontend_js' );
/*
|--------------------------------------------------------------------------
| Defines
|--------------------------------------------------------------------------
*/
define( 'EMG_IS_AJAX', easy_get_option( 'easymedia_disen_ajax' ) );
/* These files build out the plugin specific options and associated functions. */
require_once (EMGDEF_PLUGIN_DIR . 'includes/options.php');
/*-------------------------------------------------------------------------------*/
/* Plugin Update Check
/*-------------------------------------------------------------------------------*/
if ( easy_get_option( 'easymedia_disen_upchk' ) == '1' ) {
include_once(EMGDEF_PLUGIN_DIR . 'includes/up-notifier.php');
}
/*-------------------------------------------------------------------------------*/
/* Load Control Panel
/*-------------------------------------------------------------------------------*/
include_once( EMGDEF_PLUGIN_DIR . 'includes/emg-settings.php' );
/*-------------------------------------------------------------------------------*/
/* Load Front End Script
/*-------------------------------------------------------------------------------*/
if ( easy_get_option( 'easymedia_disen_plug' ) == '1' ) {
include_once( EMGDEF_PLUGIN_DIR . 'includes/frontend.php' );
}
/*-------------------------------------------------------------------------------*/
/* Add Widget, Metabox & Shortcode
/*-------------------------------------------------------------------------------*/
include_once( EMGDEF_PLUGIN_DIR . 'includes/metaboxes.php' );
include_once( EMGDEF_PLUGIN_DIR . 'includes/shortcode.php' );
include_once( EMGDEF_PLUGIN_DIR . 'includes/tinymce-dlg.php' );
include_once( EMGDEF_PLUGIN_DIR . 'includes/taxonomy.php' );
include_once( EMGDEF_PLUGIN_DIR . 'includes/easywidget.php' );
/*
|--------------------------------------------------------------------------
| AJAX UPDATE GALLERY
|--------------------------------------------------------------------------
*/
function emg_updt_gall_list() {
if ( !isset( $_POST['pstid'] ) ) {
echo '<p>Ajax request failed, please refresh your browser window.</p>';
die;
}
else {
update_post_meta( $_POST['pstid'] , 'easmedia_metabox_media_gallery', '' );
echo '<p>No images selected...</p>';
die;
}
}
add_action( 'wp_ajax_emg_updt_gall_list', 'emg_updt_gall_list' );
/*
|--------------------------------------------------------------------------
| AJAX LIST MEDIA (TINYMCE)
|--------------------------------------------------------------------------
*/
function emg_load_media_list() {
if ( !isset( $_POST['taxo'] ) ) {
echo '<p>Ajax request failed, please refresh your browser window.</p>';
die;
}
else {
global $post;
$taxoterm = $_POST['taxo'];
$args = array(
'tax_query' => array(
array(
'taxonomy' => 'emediagallery',
'field' => 'id'
//'terms' => $taxoterm
)
)
);
query_posts( $args );
if ( have_posts() ) :
while ( have_posts() ) :
$show_media .= '
<input name="'.$post->ID.'" id="'.$post->ID.'" type="text" value="'.get_post_meta( $id, 'easmedia_metabox_title', true ).'" />';
echo $show_media;
die();
endwhile;
else:
echo 'Sorry, no media matched your criteria.';
die();
endif;
wp_reset_query();
}
}
add_action( 'wp_ajax_emg_load_media_list', 'emg_load_media_list' );
/*
|--------------------------------------------------------------------------
| AJAX DELETE MEDIA IMAGE
|--------------------------------------------------------------------------
*/
function easmedia_img_media_remv() {
if ( !isset( $_POST['pstid'] ) || !isset( $_POST['type'] ) ) {
echo '0';
die;
}
else {
if ( !current_user_can( 'edit_theme_options' ) )
die('-1');
if ( $_POST['type'] == 'image' ){
$data = $_POST['pstid'];
update_post_meta($data, 'easmedia_metabox_img', '');
echo '1';
die;
}
elseif ( $_POST['type'] == 'audio' ){
$data = $_POST['pstid'];
update_post_meta($data, 'easmedia_metabox_media_audio', '');
echo '1';
die;
}
}
}
add_action( 'wp_ajax_easmedia_img_media_remv', 'easmedia_img_media_remv' );
/*
|--------------------------------------------------------------------------
| AJAX LOAD IMAGE DETAILS
|--------------------------------------------------------------------------
*/
function easmedia_img_dtl() {
if ( !isset( $_POST['imgid'] ) ) {
echo '0';
die;
}
else {
$img_info = get_post( $_POST['imgid'] );
$ttl = $img_info->post_title;
$sbttl = $img_info->post_excerpt;
$decs = $img_info->post_content;
$allimgdat = array( $ttl, $sbttl, $decs );
echo implode("|~|", $allimgdat);
die;
}
}
add_action( 'wp_ajax_easmedia_img_dtl', 'easmedia_img_dtl' );
/*
|--------------------------------------------------------------------------
| AJAX UPDATE IMAGE DETAILS
|--------------------------------------------------------------------------
*/
function easy_custom_save_function(){
if ( !isset( $_POST['imgid'] ) || !isset( $_POST['imgttl'] ) || !isset( $_POST['imgsbttl'] ) || !isset( $_POST['imgdesc'] ) ) {
echo '0';
die;
}
else {
wp_update_post(array('ID' => $_POST['imgid'], 'post_title' => $_POST['imgttl']));
wp_update_post(array('ID' => $_POST['imgid'], 'post_excerpt' => $_POST['imgsbttl']));
wp_update_post(array('ID' => $_POST['imgid'], 'post_content' => $_POST['imgdesc']));
echo '101';
die;
}
}
add_action( 'wp_ajax_easy_custom_save_function', 'easy_custom_save_function' );
/*
|--------------------------------------------------------------------------
| AJAX LOAD IMAGE GALLERY
|--------------------------------------------------------------------------
*/
function emg_gallery_list() {
if ( !isset( $_POST['page'] ) ) {$page = 1;}
else {$page = (int)addslashes( $_POST['page'] );}
if ( !isset( $_POST['per_page'] ) ) {$per_page = 8;}
else {$per_page = (int)addslashes( $_POST['per_page'] );}
$img_data = emg_library_images( $page, $per_page );
echo '<ul>';
if ( $img_data['totalimg'] == 0 ) {echo '<p>No images found .. </p>';}
else {
foreach( $img_data['img'] as $img ) {
$defwpgallery = emg_thumb_src( $img['url'], '90', '90', '0', '0' );
echo '<li><img src="'.$defwpgallery.'" id="'.$img['id'].'" /></li>';
}
}
echo '
</ul>
<br class="metagal_clear" />
<table cellspacing="0" cellpadding="5" border="0" width="100%" style="border-top: 1px solid #DDD; margin-top:10px; padding-top:5px;">
<tr>
<td style="width: 35%;">';
if ( $page > 1 ) {
echo '<input type="button" class="prev_page button-secondary" id="btnnav_'. ( $page - 1 ) .'" name="prevbtnnav" value="« Previous images" />';
}
echo '</td><td style="width: 30%; text-align: center;">';
if ( $img_data['totalimg'] > 0 && $img_data['page_count'] > 1 ) {
echo '<em>page '.$img_data['pag'].' of '.$img_data['page_count'].'</em><input style="display:none;" type="text" size="2" name="img_number" id="imgbutperpage" value="'.$per_page.'" />';
}
else { echo '<input style="display:none;" type="text" size="2" name="img_number" id="imgbutperpage" value="'.$per_page.'" />'; }
echo '</td><td style="width: 35%; text-align: right;">';
if ( $img_data['more'] != false ) {
echo '<input type="button" class="next_page button-secondary" id="btnnav_'. ($page + 1) .'" name="nextbtnnav" value="Next images »" />';
}
echo '</td>
</tr>
</table>
';
die();
}
add_action( 'wp_ajax_emg_gallery_list', 'emg_gallery_list' );
function emg_sel_img_rld() {
if ( !isset( $_POST['images'] ) ) { $images = array();}
else { $images = $_POST['images'];}
// get the titles
$images = emg_ext_sel( $images );
$new_img = '';
if ( !$images ) {$new_img = '<p>No images selected...</p>';}
else {
foreach( $images as $img_id ) {
$img_data = get_post( $img_id );
$img_url = $img_data->guid;
$slctdimg = emg_thumb_src( $img_url, '90', '90', '0', '0' );
$new_img .= '
<li>
<input type="hidden" name="easmedia_metabox_img_slider[]" value="'.$img_id.'" />
<img src="'.$slctdimg.'" />
<span title="Remove Image"></span>
</li>
';
}
}
echo $new_img;
die();
}
add_action( 'wp_ajax_emg_sel_img_rld', 'emg_sel_img_rld' );
/*
|--------------------------------------------------------------------------
| Get the images from the WP library
|--------------------------------------------------------------------------
*/
function emg_library_images( $page = 1, $per_page = 10 ) {
$query_images_args = array(
'post_type' => 'attachment', 'post_mime_type' =>'image', 'post_status' => 'inherit', 'posts_per_page' => $per_page, 'paged' => $page
);
$query_images = new WP_Query( $query_images_args );
$images = array();
foreach ( $query_images->posts as $image ) {
$images[] = array(
'id' => $image->ID,
'url' => $image->guid
);
}
$img_number = $query_images->found_posts;
$page_count = ceil( $img_number / $per_page );
$shown = $per_page * $page;
( $shown >= $img_number ) ? $more = false : $more = true;
return array( 'img' => $images, 'pag' => $page, 'page_count' =>$page_count, 'more' => $more, 'totalimg' => $img_number );
}
function emg_ext_sel( $media ) {
if ( is_array( $media ) ) {
$new_array = array();
foreach( $media as $media_id ) {
if ( get_the_title( $media_id ) ) {
$new_array[] = $media_id;
}
}
if (count($new_array) == 0) {return false;}
else {return $new_array;}
}
else {return false;}
}
/*
|--------------------------------------------------------------------------
| Easymedia Custom Category Box (Metabox)
|--------------------------------------------------------------------------
*/
function easymediagallery_categories_meta_box( $post, $box ) {
$defaults = array('taxonomy' => 'emediagallery');
if ( !isset( $box['args'] ) || !is_array( $box['args'] ) )
$args = array();
else
$args = $box['args'];
extract( wp_parse_args($args, $defaults), EXTR_SKIP );
$tax = get_taxonomy( $taxonomy );
?>
<div id="taxonomy-<?php echo $taxonomy; ?>" class="categorydiv">
<ul id="<?php echo $taxonomy; ?>-tabs" class="category-tabs">
<li class="tabs"><a href="#<?php echo $taxonomy; ?>-all"><?php echo $tax->labels->all_items; ?></a></li>
<li class="hide-if-no-js"><a href="#<?php echo $taxonomy; ?>-pop"><?php _e( 'Most Used' ); ?></a></li>
</ul>
<div id="<?php echo $taxonomy; ?>-pop" class="tabs-panel" style="display: none;">
<ul id="<?php echo $taxonomy; ?>checklist-pop" class="categorychecklist form-no-clear" >
<?php $popular_ids = wp_popular_terms_checklist($taxonomy); ?>
</ul>
</div>
<div id="<?php echo $taxonomy; ?>-all" class="tabs-panel">
<?php
$name = ( $taxonomy == 'emediagallery' ) ? 'post_category' : 'tax_input[' . $taxonomy . ']';
echo "<input type='hidden' name='{$name}[]' value='0' />"; // Allows for an empty term set to be sent. 0 is an invalid Term ID and will be ignored by empty() checks.
?>
<ul id="<?php echo $taxonomy; ?>checklist" data-wp-lists="list:<?php echo $taxonomy?>" class="categorychecklist form-no-clear">
<?php wp_terms_checklist($post->ID, array( 'taxonomy' => $taxonomy, 'popular_cats' => $popular_ids ) ) ?>
</ul>
</div>
<?php if ( current_user_can($tax->cap->edit_terms) ) : ?>
<div id="<?php echo $taxonomy; ?>-adder" class="wp-hidden-children">
<h4>
<a id="<?php echo $taxonomy; ?>-add-toggle" href="#<?php echo $taxonomy; ?>-add" class="hide-if-no-js">
<?php
/* translators: %s: add new taxonomy label */
printf( __( '+ %s' ), $tax->labels->add_new_item );
?>
</a>
</h4>
<p id="<?php echo $taxonomy; ?>-add" class="category-add wp-hidden-child">
<label class="screen-reader-text" for="new<?php echo $taxonomy; ?>"><?php echo $tax->labels->add_new_item; ?></label>
<input type="text" name="new<?php echo $taxonomy; ?>" id="new<?php echo $taxonomy; ?>" class="form-required form-input-tip" value="<?php echo esc_attr( $tax->labels->new_item_name ); ?>" aria-required="true"/>
<label class="screen-reader-text" for="new<?php echo $taxonomy; ?>_parent">
<?php echo $tax->labels->parent_item_colon; ?>
</label>
<?php wp_dropdown_categories( array( 'taxonomy' => $taxonomy, 'hide_empty' => 0, 'name' => 'new'.$taxonomy.'_parent', 'orderby' => 'name', 'hierarchical' => 1, 'show_option_none' => '— ' . $tax->labels->parent_item . ' —' ) ); ?>
<input type="button" id="<?php echo $taxonomy; ?>-add-submit" data-wp-lists="add:<?php echo $taxonomy ?>checklist:<?php echo $taxonomy ?>-add" class="button category-add-submit" value="<?php echo esc_attr( $tax->labels->add_new_item ); ?>" />
<?php wp_nonce_field( 'add-'.$taxonomy, '_ajax_nonce-add-'.$taxonomy, false ); ?>
<span id="<?php echo $taxonomy; ?>-ajax-response"></span>
</p>
</div>
<?php endif; ?>
</div>
<?php
}
/*-------------------------------------------------------------------------------*/
/* Add Post Thumbnails and Custom Thumbnails size
/*-------------------------------------------------------------------------------*/
function easmedia_add_thumbnail_support() {
if ( !current_theme_supports( 'post-thumbnails' )) {
add_theme_support( 'post-thumbnails', array( 'easymediagallery' ) );
add_image_size( 'emg-admin-thumb', 70, 70, true ); // Used in the easymedia edit page
}
}
add_action('init', 'easmedia_add_thumbnail_support');
/*-------------------------------------------------------------------------------*/
/* Add credits in admin page
/*-------------------------------------------------------------------------------*/
function easymediagallery_add_footer_credits( $text ) {
$t = '';
if ( get_post_type() === 'easymediagallery' ) {
$t .= "<div id=\"credits\" style=\"line-height: 22px;\">";
$t .= "<p>Easy Media Gallery plugin is created by <a href=\"http://www.ghozylab.com/\" target=\"_blank\">GhozyLab, Inc</a>.</p>";
$t .= "<p>If you have some support issue, don't hesitate to <a href=\"http://ghozylab.com/submit-support-request\" target=\"_blank\">write here</a>. The GhozyLab team will be happy to support you on any issue.</p>";
$t .= "</div>";
}else{
$t = $text;
}
return $t;
}
add_filter( 'admin_footer_text', 'easymediagallery_add_footer_credits' );
/*-------------------------------------------------------------------------------*/
/* Get the patterns list
/*-------------------------------------------------------------------------------*/
function easmedia_patterns_ls() {
$patterns = array();
$patterns_list = scandir( EMG_DIR."/css/images/patterns" );
foreach( $patterns_list as $pattern_name ) {
if ( $pattern_name != '.' && $pattern_name != '..' ) {
$patterns[] = $pattern_name;
}
}
return $patterns;
}
/*-------------------------------------------------------------------------------*/
/* HEX to RGB
/*-------------------------------------------------------------------------------*/
function easymedia_hex2rgb($hex) {
$hex = str_replace("#", "", $hex);
if(strlen($hex) == 3) {
$r = hexdec(substr($hex,0,1).substr($hex,0,1));
$g = hexdec(substr($hex,1,1).substr($hex,1,1));
$b = hexdec(substr($hex,2,1).substr($hex,2,1));
} else {
$r = hexdec(substr($hex,0,2));
$g = hexdec(substr($hex,2,2));
$b = hexdec(substr($hex,4,2));
}
$rgb = array($r, $g, $b);
//return implode(",", $rgb); // returns the rgb values separated by commas
return implode(",", $rgb); // returns an array with the rgb values
}
/*-------------------------------------------------------------------------------*/
/* replace_extension
/*-------------------------------------------------------------------------------*/
function emg_replace_extension($filename) {
$ext = pathinfo($filename, PATHINFO_EXTENSION);
$new_extension = 'emgcvr-'.$ext;
return substr_replace($filename , $new_extension, strrpos($filename , '.') + 1);
//return preg_replace('/\..+$/', '.' . $new_extension, $filename);
}
/*-------------------------------------------------------------------------------*/
/* Get attachment image id
/*-------------------------------------------------------------------------------*/
function emg_get_attachment_id_from_src ($link) {
global $wpdb;
$link = preg_replace('/-\d+x\d+(?=\.(jpg|jpeg|png|gif)$)/i', '', $link);
return $wpdb->get_var("SELECT ID FROM {$wpdb->posts} WHERE guid='$link'");
}
/*-------------------------------------------------------------------------------*/
/* Image Resize ( Aspect Ratio )
/*-------------------------------------------------------------------------------*/
function easymedia_imgresize($img, $limit, $isres, $imw, $imh) {
/*if ( strpos( $img, $_SERVER['HTTP_HOST'] ) === FALSE ) {
$img= "http://".$_SERVER['HTTP_HOST'].$img;
}
else {
$img= $img;
}*/
if ( $img == '' ) {
$img = plugins_url( 'images/no-image-available.jpg' , dirname('index.php') ) ;
}
else {
$img = $img;
}
if ( $isres == 'on' ) {
if ( $imw > $limit ) {
$tempimgratio = $imh / $imw;
$fih = (int)($tempimgratio * $limit); // final image height
$fiw = $limit; // fixed image width
$allimgdata = array( emg_thumb_src( $img, $fiw, $fih, $imw, $imh), $fiw, $fih );
}
else {
$allimgdata = array( $img, $imw, $imh );
}
}
else { $allimgdata = array( $img, $imw, $imh );
}
return implode(",", $allimgdata);
}
/*-------------------------------------------------------------------------------*/
/* Image Resize ( Aspect Ratio ) AJAX
/*-------------------------------------------------------------------------------*/
function easymedia_imgresize_ajax() {
if ( !isset( $_POST['imgurl'] ) || !isset( $_POST['limiter'] ) || $_POST['imgurl'] == '' || $_POST['limiter'] == '' ) {
echo '<p>Ajax request failed, please refresh your browser window.</p>';
die;
}
else {
$imgurl = $_POST['imgurl'];
$limiter = $_POST['limiter'];
$attid = wp_get_attachment_image_src( emg_get_attachment_id_from_src( $imgurl ), 'full' );
/*if ( strpos( $imgurl, $_SERVER['HTTP_HOST'] ) === FALSE ) {
$imgurl = "http://".$_SERVER['HTTP_HOST'].$imgurl;
}
else {
$imgurl = $imgurl;
}*/
$tmpimgratio = $attid[2] / $attid[1]; //get image aspec ratio
if ( $attid[1] > $limiter ) {
$tmph = (int)($tmpimgratio * $limiter); // final image height
$tmpw = $limiter; // fixed image width
$allimgdata = array( emg_thumb_src( $imgurl, $tmpw, $tmph, $attid[1], $attid[2]), $fiw, $fih );
echo implode(",", $allimgdata);
die;
}
else {
$finimgurl = $imgurl;
$allimgdata = array( $finimgurl, $attid[1], $attid[2] );
echo implode(",", $allimgdata);
die;
}
}
}
add_action( 'wp_ajax_easymedia_imgresize_ajax', 'easymedia_imgresize_ajax' );
/*-------------------------------------------------------------------------------*/
/* thumbnail source switch = Timthumb or easymedia_resizer
/*-------------------------------------------------------------------------------*/
function emg_thumb_src( $img_src, $width, $height, $gsze1, $gsze2 ) {
if(!$img_src) {return false;} if ( is_multisite() ){ return false; }
if( easy_get_option( 'easymedia_disen_tthumb' ) == '1' ) {
$emg_thumb_url = EMG_THUMB_FILE . "?src=" . $img_src . "&h=" . $height . "&w=" . $width . "&zc=1&q=100";
} else {
if ( $gsze1 != '0' && $gsze2 != '0' ) {
$gsize1 = $gsze1;
$gsize2 = $gsze2;
}
else {
$globalsize = wp_get_attachment_image_src( emg_get_attachment_id_from_src( $img_src ), 'full' );
$gsize1 = $globalsize[1];
$gsize2 = $globalsize[2];
}
$emg_thumb_url = easymedia_resizer( $img_src, $gsize1, $gsize2, $width, $height, true );
}
return $emg_thumb_url;
}
/*-------------------------------------------------------------------------------*/
/* Get Plugin Version (@return string Plugin version)
/*-------------------------------------------------------------------------------*/
function easymedia_get_plugin_version() {
$plugin_data = get_plugin_data( EMG_DIR . '/easy-media-gallery-pro.php' );
$plugin_version = $plugin_data['Version'];
return $plugin_version;
}
/*-------------------------------------------------------------------------------*/
/* Random String
/*-------------------------------------------------------------------------------*/
function RandomString($length) {
$original_string = array_merge(range(0,9), range('a','z'), range('A', 'Z'));
$original_string = implode('', $original_string);
return substr(str_shuffle($original_string), 0, $length);
}
/*-------------------------------------------------------------------------------*/
/* Enable Sorting of the Media
/*-------------------------------------------------------------------------------*/
function easmedia_create_easymedia_sort_page() {
$easmedia_sort_page = add_submenu_page('edit.php?post_type=easymediagallery', 'Sorter', __('Sorter', 'easmedia'), 'edit_posts', 'easymedia-order', 'easmedia_easymedia_sort');
add_action('admin_print_styles-' . $easmedia_sort_page, 'easmedia_print_sort_styles');
add_action('admin_print_scripts-' . $easmedia_sort_page, 'easmedia_print_sort_scripts');
}
add_action( 'admin_menu', 'easmedia_create_easymedia_sort_page' );
function easmedia_easymedia_sort() {
$easymedias = new WP_Query('post_type=easymediagallery&posts_per_page=-1&orderby=menu_order&order=ASC');
if ( $easymedias->have_posts() ) :
?>
<div class="wrap">
<div id="icon-edit" class="icon32 icon32-posts-easymedia"><br /></div>
<h2><?php _e('Sorter', 'easmedia'); ?></h2>
<p><?php _e('Simply drag the Media up or down and they will be saved in that order. Media at the top will appear first.', 'easmedia'); ?></p>
<div class="metabox-holder">
<div class="postbox">
<h3><?php _e( 'Sort Media', 'easmedia' ); ?>:</h3>
<ul id="easymedia_list" style="padding-left:10px !important;">
<?php while( $easymedias->have_posts() ) : $easymedias->the_post(); ?>
<li id="<?php the_id(); ?>" class="menu-item">
<dl class="menu-item-bar">
<dt class="menu-item-handle">
<img style="float:left; vertical-align:middle;padding-top: 4px; margin-right:10px;" src="<?php echo plugins_url( 'images/sort.png' , dirname('index.php') ) ?>" height="28px;" width="28px;"/><span class="item-title"><?php echo esc_html( esc_js( the_title(NULL, NULL, FALSE) ) ); ?></span>
</dt>
</dl>
<ul class="menu-item-transport"></ul>
</li>
<?php endwhile; ?>
<?php else: ?>
<div class="wrap">
<div id="icon-edit" class="icon32 icon32-posts-easymedia"><br /></div>
<h2><?php _e('Sorter', 'easmedia'); ?></h2>
<div class="metabox-holder">
<div class="postbox">
<h3><?php _e( 'Sort Media', 'easmedia' ); ?>:</h3>
<p style="padding:10px;"><?php printf( __('No items found, why not %screate one%s? ', 'easmedia'), '<a href="post-new.php?post_type=easymediagallery">', '</a>'); ?> </p></div></div></div>
<?php endif; ?>
<?php wp_reset_postdata(); ?>
</ul>
</div><div style="padding-left:33px; margin-bottom:30px"><img src="<?php echo plugins_url( 'images/dragdrop.png' , dirname('index.php') ) ?>" height="23px;" width="161px;"/></div>
</div>
</div>
<?php
}
/*-------------------------------------------------------------------------------*/
/* RENAME POST BUTTON
/*-------------------------------------------------------------------------------*/
add_filter( 'gettext', 'change_publish_button', 10, 2 );
function change_publish_button( $translation, $text ) {
if ( 'easymediagallery' == get_post_type())
if ( $text == 'Publish' ) {
return 'Save Media'; }
else if ( $text == 'Update' ) {
return 'Update Media'; }
return $translation;
}
/*-------------------------------------------------------------------------------*/
/* Load News
/*-------------------------------------------------------------------------------*/
if ( easy_get_option( 'easymedia_disen_dasnews' ) == '1' ) {
function emg_register_dashboard_widgets() {
if ( current_user_can( apply_filters( 'emg_dashboard_stats_cap', 'edit_pages' ) ) ) {
wp_add_dashboard_widget( 'emg_dashboard_stat', __('Easy Media Gallery', 'easmedia'), 'emg_dashboard_widget' );
}
}
add_action('wp_dashboard_setup', 'emg_register_dashboard_widgets' );
function emg_dashboard_widget() {
$notifier_file_url = 'http://www.ghozylab.com/plugins/easy-media-gallery/content/ajax.php';
if ( function_exists( 'curl_init' ) ) { // if cURL is available, use it...
$ch = curl_init( $notifier_file_url );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_HEADER, 0 );
curl_setopt( $ch, CURLOPT_TIMEOUT, 10 );
$plugdata = curl_exec( $ch );
curl_close( $ch );
echo $plugdata;
}
elseif ( ini_get('allow_url_fopen') ) { // if allow_url_fopen/file_get_contents is available, use it...
$plugdata = file_get_contents( $notifier_file_url );
echo $plugdata;
}
else { ?>
<div class="emg_dashboard_widget">
<p class="sub">If you really love Easy Media Gallery, please recommend our plugin to your friends.</p>
<ul class='easymedia-social' id='easymedia-cssanime'>
<li class='easymedia-facebook'>
<a onclick="window.open('http://www.facebook.com/sharer.php?s=100&p[title]=Check out the Best Wordpress Portfolio and Gallery plugin&p[summary]=Easy Media Gallery for WordPress that is powerful and so easy to create portfolio or media gallery&p[url]=http://ghozylab.com/&p[images][0]=http://ghozylab.com/wp-content/uploads/2013/02/ghozy-logo.png', 'sharer', 'toolbar=0,status=0,width=548,height=325');" href="javascript: void(0)" title="Share"><strong>Facebook</strong></a>
</li>
<li class='easymedia-twitter'>
<a onclick="window.open('https://twitter.com/share?text=Check out the Best Wordpress Portfolio and Gallery Plugin &url=http://ghozylab.com/', 'sharer', 'toolbar=0,status=0,width=548,height=325');" title="Twitter" class="circle"><strong>Twitter</strong></a>
</li>
</li>
<li class='easymedia-googleplus'>
<a onclick="window.open('https://plus.google.com/share?url=http://ghozylab.com/','','width=415,height=450');"><strong>Google+</strong></a>
</li>
</li>
<li class='easymedia-pinterest'>
<a onclick="window.open('http://pinterest.com/pin/create/button/?url=http://ghozylab.com/;media=http://ghozylab.com/wp-content/uploads/2013/02/ghozy-logo.png;description=Easy Media Gallery for WordPress that is powerful and so easy to create portfolio or media gallery','','width=600,height=300');"><strong>Pinterest</strong></a>
</li>
</ul>
</div>
<?php
}
}
}
/*-------------------------------------------------------------------------------*/
/* Documentation Page
/*-------------------------------------------------------------------------------*/
function easmedia_create_docs_page() {
$easmedia_docs_page = add_submenu_page('edit.php?post_type=easymediagallery', 'Documentation', __('Documentation', 'easmedia'), 'edit_posts', 'docs', 'easmedia_easymedia_docs');
}
add_action( 'admin_menu', 'easmedia_create_docs_page' );
function easmedia_easymedia_docs() {
?>
<div class="wrap">
<div id="icon-edit" class="icon32 icon32-posts-easymedia"><br /></div>
<h2><?php _e('Documentation', 'easmedia'); ?></h2>
<p><?php _e('This plugin comes with instructional training videos that walk you through every aspect of setting up your new media gallery. We recommend following these videos to setup your media gallery. This user manual is only intended to be a reference guide.', 'easmedia'); ?></p>
<div class="metabox-holder">
<div class="postbox">
<h3><?php _e( 'Video Tutorials', 'easmedia' ); ?></h3>
<div id="easymedia_docs1" style="padding-left:10px !important;">
<ul style="list-style: square; position:relative; margin-left:15px; margin-bottom:25px">
<li><a href="http://www.youtube.com/watch?v=TQ1MMxhsyD8" target="_blank" >How to Create Grid Gallery</a></li>
<li><a href="http://www.youtube.com/watch?v=OEoNB2LpnSE" target="_blank" >How to Create Filterable Media</a></li>
<li><a href="http://www.youtube.com/watch?v=-N0JNcToHOI" target="_blank" >How to Create Grid Gallery with Pagination</a></li>
<li><a href="http://www.youtube.com/watch?v=BpqlkdLHdGU" target="_blank" >How to Set Gallery Default Filter</a></li>
<li><a href="http://www.youtube.com/watch?v=dXFBNY5t6E8" target="_blank" >How to Create Single Image Media</a></li>
<li><a href="http://www.youtube.com/watch?v=htxwZw_aPF0" target="_blank" >How to Create Video Media Types</a></li>
<li><a href="http://www.youtube.com/watch?v=uAGWUcs5ofE" target="_blank" >How to Fetch Youtube or Vimeo Thumbnail</a></li>
<li><a href="http://www.youtube.com/watch?v=Bsn-CB5Hpbw" target="_blank" >How to Create Audio (mp3) Media Types</a></li>
<li><a href="http://www.youtube.com/watch?v=Oee2cpKT-kE" target="_blank" >How to Create Audio Soundcloud</a></li>
<li><a href="http://www.youtube.com/watch?v=SYH8Yl2SQd4" target="_blank" >How to Create Audio Reverbnation</a></li>
<li><a href="http://www.youtube.com/watch?v=PEgfleRf6hg" target="_blank" >How to Create Google Maps</a></li>
<li><a href="http://www.youtube.com/watch?v=BWmWAPb_z90" target="_blank" >How to Change Image Title, Subtitle & Description</a></li>
<li><a href="http://www.youtube.com/watch?v=skCMKvVLD5o" target="_blank" >How to Set Order of Image</a></li>
<li><a href="http://www.youtube.com/watch?v=9cuYyBMKx2k" target="_blank" >How to Insert Image into Media Description</a></li>
<li><a href="http://www.youtube.com/watch?v=Z2qwXz7GIRw" target="_blank" >How to Publish Easy Media Gallery</a></li>
<li><a href="http://www.youtube.com/watch?v=2T73wvt_wOA" target="_blank" >How to Change Media Border Size and Color</a></li>
<li><a href="http://www.youtube.com/watch?v=56f_C7OXiAE" target="_blank" >How to Change Media Columns</a></li>
</ul>
</div>
</div>
<div class="metabox-holder">
<div class="postbox">
<h3><?php _e( 'Troubleshooting', 'easmedia' ); ?></h3>
<div id="easymedia_docs2" style="padding-left:10px !important;">
<ul style="list-style: square; position:relative; margin-left:15px;">
<li><strong>Images not showing up</strong><p>Sometimes you may face problem that your images are not displaying in the site, like <a target="_blank" class="thickbox" href="<?php echo plugins_url( 'images/thumbnail-error.png' , dirname('index.php') ) ?>">this example</a>. We use Timthumb script to resize the images and some hosts do not allow the use of Timthumb for security reasons. Here's how to solve this problem:</p>
<p>Go to Plugin Control Panel from Easy Media > Settings > Miscellaneous and turn OFF <strong>Use TimThumb</strong> option.</p>
<p></p>
<p>If it still does not work please try solutions below :</p>
<ul style="list-style: square; position:relative; margin-left:15px; margin-bottom:25px">
<li>Firstly make sure that you use image from wordpress media library, not from external site. Now try to re-upload your image to the media library, this issue usually occurs when you do import data from localhost (temporarily site) to the main site. If this still does not work please try the second option.</li>
<li>Click the add media button and choose the image you want, then look at the bottom right option (Attachment Display Settings), make sure to select Media File from Link to dropdown and select Full Size from Size dropdown. Please see this <a class="thickbox" href="http://ghozylab.com/images/sshot.jpg" target="_blank">SCREENSHOT.</a></li></ul>
</li>
</ul>
</div>
</div>
</div>
</div>
<?php
}
/*-------------------------------------------------------------------------------*/
/* Add WordPress Pointers
/*-------------------------------------------------------------------------------*/
add_action( 'admin_enqueue_scripts', 'easmedia_pointer_pointer_header' );
function easmedia_pointer_pointer_header() {
$enqueue = false;
$dismissed = explode( ',', (string) get_user_meta( get_current_user_id(), 'dismissed_wp_pointers', true ) );
if ( ! in_array( 'easmedia_pointer_pointer', $dismissed ) ) {
$enqueue = true;
add_action( 'admin_print_footer_scripts', 'easmedia_pointer_pointer_footer' );
}
if ( $enqueue ) {
// Enqueue pointers
wp_enqueue_script( 'wp-pointer' );
wp_enqueue_style( 'wp-pointer' );
}
}
function easmedia_pointer_pointer_footer() {
$pointer_content = '<h3>Congratulations!</h3>';
$pointer_content .= '<p>You've just installed Easy Media Gallery Pro. Click <a class="close"href="edit.php?post_type=easymediagallery&page=docs">here</a> to watch video tutorials and user guide plugin.</p>';
?>
<script type="text/javascript">// <![CDATA[
jQuery(document).ready(function($) {
if (typeof(jQuery().pointer) != 'undefined') {
$('#menu-posts-easymediagallery').pointer({
content: '<?php echo $pointer_content; ?>',
position: {
edge: 'left',
align: 'center'
},
close: function() {
$.post( ajaxurl, {
pointer: 'easmedia_pointer_pointer',
action: 'dismiss-wp-pointer'
});
}
}).pointer('open');
}
});
// ]]></script>
<?php
}
?>
Did this file decode correctly?
Original Code
<?php $_F=__FILE__;$_C1767279132='Pz48P0RoRA0KDQoNCi8qKg0KKiBuTkggcSBYcXJnIFpOVUJxIG5xZGROUGcgbmRmeHFkIGl0bUdIQmZtcg0KKg0KKiBARHFQcVcgckhQQm1hICRtcVdOIEpoTiBmREhCZm0gbXFXTg0KKiBAUE5IdFBtIGZ4a05HSHx4ZmZkIE1ESEJmbSBvcWR0TiBmbSBydEdHTnJyLCBqcWRyTiBCaiBtZiBvcWR0TiBOY0JySHINCiovDQogDQogDQogDQovKg0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQp8IFhxcmdXTlVCcSBuTkggN2ZtSFBmZCBRcW1OZCBNREhCZm1yDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiovDQpqdG1HSEJmbSBOcXJnX2FOSF9mREhCZm0oICRtcVdOICl7DQogICAgJE5xcmdXTlVCcV9vcWR0TnIgPSBhTkhfZkRIQmZtKCAnTnFyZ19XTlVCcV9mREgnICk7DQogICAgQmogKCBCcl9xUFBxZyggJE5xcmdXTlVCcV9vcWR0TnIgKSAmJiBxUFBxZ18xTmdfTmNCckhyKCAkbXFXTiwgJE5xcmdXTlVCcV9vcWR0TnIgKSApIFBOSHRQbSAkTnFyZ1dOVUJxX29xZHROclskbXFXTl07DQogICAgUE5IdFBtIGpxZHJOOw0KfSANCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICAgQUZaWXMgVk5hQnJITlAgSTIgJiA3MjINCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOcXJnV05VQnFfUE5hX3JHUEJESCgpIHsNCgkvLyA3MjIgKCBOV2Etck5ISEJtYXIuRGhELCBIQm1nV0dOLVVkYS5EaEQsIFdOSHF4ZmNOci5EaEQgKQ0KCTNEX1BOYUJySE5QX3JIZ2ROKCAnTnFyZ1dOVUJxLUdEckhnZE5yJywgRGR0YUJtcl90UGQoICdHcnIvanRtR3JIZ2ROLkdycicgLCBVQlBtcVdOKF9faVl1WF9fKSApLCBqcWRyTiwgWEEyNlpYRllBX0xYVjJZTXMsICdxZGQnKTsNCgkzRF9QTmFCckhOUF9ySGdkTiggJ05xcmdXTlVCcS1HZmRmUERCRzFOUEdycicsIERkdGFCbXJfdFBkKCAnR3JyL0dmZGZQREJHMU5QLkdycicgLCBVQlBtcVdOKF9faVl1WF9fKSApLCBqcWRyTiwgWEEyNlpYRllBX0xYVjJZTXMgKTsNCgkzRF9QTmFCckhOUF9ySGdkTiggJ05xcmdXTlVCcS1yZFVQJywgRGR0YUJtcl90UGQoICdHcnIvcmRCVU5QLkdycicgLCBVQlBtcVdOKF9faVl1WF9fKSApLCBqcWRyTiwgWEEyNlpYRllBX0xYVjJZTXMgKTsNCgkzRF9QTmFCckhOUF9ySGdkTiggJ05xcmdXTlVCcS1CeHRISGZtJywgRGR0YUJtcl90UGQoICdHcnIvQnh0SEhmbS5HcnInICwgVUJQbXFXTihfX2lZdVhfXykgKSwganFkck4sIFhBMjZaWEZZQV9MWFYyWU1zICk7CQ0KCTNEX1BOYUJySE5QX3JIZ2ROKCAnTnFyZ1dOVUJxLUhCbWdXR04nLCBEZHRhQm1yX3RQZCggJ0dyci9IQm1nV0dOLkdycicgLCBVQlBtcVdOKF9faVl1WF9fKSApLCBqcWRyTiwgWEEyNlpYRllBX0xYVjJZTXMgKTsNCgkzRF9QTmFCckhOUF9ySGdkTiggJ2swdE5QZy10Qi1IaE5XTnItUE5VV2ZtVScsIERkdGFCbXJfdFBkKCAnR3JyL2swdE5QZy9rMHROUGctdEIvSGhOV05yL3JXZmZIaG1OcnIvazB0TlBnLXRCLUUuRXkueS5HdHJIZlcuV0JtLkdycicgLCBVQlBtcVdOKF9faVl1WF9fKSApLCBqcWRyTiwgWEEyNlpYRllBX0xYVjJZTXMgKTsNCgkzRF9QTmFCckhOUF9ySGdkTiggJ05xcmdXTlVCcS1IQm1nV0dOJywgRGR0YUJtcl90UGQoICdHcnIvSEJtZ1dHTi5HcnInICwgVUJQbXFXTihfX2lZdVhfXykgKSwganFkck4sIFhBMjZaWEZZQV9MWFYyWU1zICk7CQ0KCTNEX1BOYUJySE5QX3JIZ2ROKCAnazB0TlBnLVd0ZEhCck5kTkdILUdycicsIERkdGFCbXJfdFBkKCAnR3JyL2swdE5QZy9XdGRIQnJOZE5HSC9rMHROUGcuV3RkSEJyTmROR0guR3JyJyAsIFVCUG1xV04oX19pWXVYX18pICksIGpxZHJOLCBYQTI2WlhGWUFfTFhWMllNcyApOw0KCTNEX1BOYUJySE5QX3JIZ2ROKCAnazB0TlBnLVdOcnJCLUdycicsIERkdGFCbXJfdFBkKCAnR3JyL1dOcnJCLkdycicgLCBVQlBtcVdOKF9faVl1WF9fKSApLCBqcWRyTiwgWEEyNlpYRllBX0xYVjJZTXMgKTsNCgkzRF9QTmFCckhOUF9ySGdkTiggJ2swdE5QZy1kQmFoSHhmYy1HcnInLCBEZHRhQm1yX3RQZCggJ0dyci9kQmFoSHhmY19XTi5HcnInICwgVUJQbXFXTihfX2lZdVhfXykgKSwganFkck4sIFhBMjZaWEZZQV9MWFYyWU1zICk7DQoJM0RfUE5hQnJITlBfckhnZE4oICdrMHROUGctYVVxMVBxV0hIQkQtR3JyJywgRGR0YUJtcl90UGQoICdHcnIvazB0TlBnL2swdE5QZy5IZmZkSEJEL2swdE5QZy5IZmZkSEJELkdycicgLCBVQlBtcVdOKF9faVl1WF9fKSApLCBqcWRyTiwgWEEyNlpYRllBX0xYVjJZTXMgKTsNCgkJCQ0KCS8vIEkyICggTldhLXJOSEhCbWFyLkRoRCApIA0KCTNEX1BOYUJySE5QX3JHUEJESCggJ05xcmdXTlVCcS1rMHROUGctTnFyQm1hJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcvazB0TlBnLk5xckJtYS5FLmIua3InICwgVUJQbXFXTihfX2lZdVhfXykgKSApOwkNCgkzRF9QTmFCckhOUF9yR1BCREgoICdOcXJnV05VQnEtR2ZkZlBEQkcxTlAnLCBEZHRhQm1yX3RQZCggJ2tyL0dmZGZQREJHMU5QL0dmZGZQREJHMU5QLmtyJyAsIFVCUG1xV04oX19pWXVYX18pICkgKTsJDQoJM0RfUE5hQnJITlBfckdQQkRIKCAnR2ZkZlBEQkcxTlAtTmdOJywgRGR0YUJtcl90UGQoICdrci9HZmRmUERCRzFOUC9OZ04ua3InICwgVUJQbXFXTihfX2lZdVhfXykgKSApOw0KCTNEX1BOYUJySE5QX3JHUEJESCggJ0dmZGZQREJHMU5QLXRIQmRyJywgRGR0YUJtcl90UGQoICdrci9HZmRmUERCRzFOUC90SEJkci5rcicgLCBVQlBtcVdOKF9faVl1WF9fKSApICk7DQoJDQoJLy8gSTIgKCBIQm1nV0dOLVVkYS5EaEQgKSANCgkvLzNEX1BOYUJySE5QX3JHUEJESCggJ2swdE5QZy10Qi1HdHJIZlcnLCBEZHRhQm1yX3RQZCggJ2tyL2swdE5QZy9rMHROUGctdEItRS5FeS55LldCbS5rcicgLCBVQlBtcVdOKF9faVl1WF9fKSApICk7DQoJLy8zRF9QTmFCckhOUF9yR1BCREgoICdrMHROUGctdEItR3RySGZXLUUnLCBEZHRhQm1yX3RQZCggJ2tyL2swdE5QZy9rMHROUGctdEItRS5PLkMuR3RySGZXLldCbS5rcicgLCBVQlBtcVdOKF9faVl1WF9fKSApICk7DQoJM0RfUE5hQnJITlBfckdQQkRIKCAnazB0TlBnLVd0ZEhCLXJOZCcsIERkdGFCbXJfdFBkKCAna3IvazB0TlBnL1d0ZEhCck5kTkdIL2swdE5QZy5XdGRIQnJOZE5HSC5rcicgLCBVQlBtcVdOKF9faVl1WF9fKSApICk7DQoJLy8zRF9QTmFCckhOUF9ySGdkTignZHFnZnRIa3InLCBEZHRhQm1yX3RQZCgna3IvR2ZkZlBEQkcxTlAvZHFnZnRILmtyJyAsIFVCUG1xV04oX19pWXVYX18pICkpOw0KCQ0KCS8vIEkyICggV05IcXhmY05yLkRoRCwgKSANCgkzRF9QTmFCckhOUF9yR1BCREgoICdrMHROUGctV3RkSEItck5kJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcvV3RkSEJyTmROR0gvazB0TlBnLld0ZEhCck5kTkdILmtyJyAsIFVCUG1xV04oX19pWXVYX18pICkgKTsNCgkzRF9QTmFCckhOUF9yR1BCREgoICdOcXJnV05VQnEtRzFOVUJIZlAnLCBEZHRhQm1yX3RQZCggJ3FVVWZtci9HMU5VQkhmUC9HMU5VQkhmUC5rcicgLCBVQlBtcVdOKF9faVl1WF9fKSApICk7DQoJM0RfUE5hQnJITlBfckdQQkRIKCAnazB0TlBnLVdOcnJCLWtyJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcvazB0TlBnLldOcnJCLldCbS5rcicgLCBVQlBtcVdOKF9faVl1WF9fKSApICk7DQoJM0RfUE5hQnJITlBfckdQQkRIKCAnazB0TlBnLWRCYWhIeGZjLWtyJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcvazB0TlBnLmRCYWhIeGZjX1dOLmtyJyAsIFVCUG1xV04oX19pWXVYX18pICkgKTsNCgkzRF9QTmFCckhOUF9yR1BCREgoICdrMHROUGctYVVxMVBxVy1IZmZkSEJEJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcvazB0TlBnLkhmZmRIQkQua3InICwgVUJQbXFXTihfX2lZdVhfXykgKSApOwkNCn0NCnFVVV9xR0hCZm0oICdxVVdCbV9CbUJIJywgJ05xcmdXTlVCcV9QTmFfckdQQkRIJyApOw0KDQoNCmp0bUdIQmZtIE5xcmdXTlVCcV9qUGZtSE5tVV9rcigpIHsNCgkvLyBJMiAoIGpQZm1ITm1VLkRoRCApIA0KCTNEX1VOUE5hQnJITlBfckdQQkRIKCdqQkhITmNIJyk7IC8vIFVOUE5hQnJITlAJCQ0KCTNEX1BOYUJySE5QX3JHUEJESCggJ2pCSEhOY0gnLCBEZHRhQm1yX3RQZCggJ2tyL2swdE5QZy9rMHROUGcuakJISE5jSC5rcicgLCBVQlBtcVdOKF9faVl1WF9fKSApICk7CQkNCgkzRF9QTmFCckhOUF9yR1BCREgoICdXZmZIZmZkci1HZlBOJywgRGR0YUJtcl90UGQoICdrci9XZmZIZmZkci9XZmZIZmZkci0nIC5OcXJnX2FOSF9mREhCZm0oICdOcXJnV05VQnFfRGR0YUJtX0dmUE4nICkuICcua3InICwgVUJQbXFXTihfX2lZdVhfXykgKSApOwkNCgkzRF9QTmFCckhOUF9yR1BCREgoICdOcXJnV05VQnEtR2ZQTicsIERkdGFCbXJfdFBkKCAna3IvV2ZmSGZmZHIvTnFyZ1dOVUJxLmtyJyAsIFVCUG1xV04oX19pWXVYX18pICkgKTsJDQoJM0RfUE5hQnJITlBfckdQQkRIKCAnTnFyZ1dOVUJxLUJyZkhmRE4nLCBEZHRhQm1yX3RQZCggJ2tyL2swdE5QZy9rMHROUGcuQnJmSGZETi5XQm0ua3InICwgVUJQbXFXTihfX2lZdVhfXykgKSApOwkJDQoJM0RfUE5hQnJITlBfckdQQkRIKCAnTnFyZ1dOVUJxLXFrcWNqUGZtSE5tVScsIERkdGFCbXJfdFBkKCAna3IvanRtRy9xa3FjLWpQZm1ITm1VLmtyJyAsIFVCUG1xV04oX19pWXVYX18pICkgKTsJDQoJM0RfUE5hQnJITlBfckdQQkRIKCAnTnFyZ1dOVUJxLWpQZm1ITm1VJywgRGR0YUJtcl90UGQoICdrci9qdG1HL2pQZm1ITm1VLmtyJyAsIFVCUG1xV04oX19pWXVYX18pICkgKTsNCgkzRF9QTmFCckhOUF9yR1BCREgoICdOcXJnV05VQnEta0RxYU5yJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcva1FxYU5yLmtyJyAsIFVCUG1xV04oX19pWXVYX18pICkgKTsJCQ0KCTNEX1BOYUJySE5QX3JHUEJESCggJ05xcmdXTlVCcS1kcXBnZGZxVScsIERkdGFCbXJfdFBkKCAna3IvazB0TlBnL2swdE5QZy5kcXBnZGZxVS5XQm0ua3InICwgVUJQbXFXTihfX2lZdVhfXykgKSApOw0KfQ0KcVVVX3FHSEJmbSggJzNEX05tMHROdE5fckdQQkRIcicsICdOcXJnV05VQnFfalBmbUhObVVfa3InICk7DQoNCi8qDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCnwgRk5qQm1Ocg0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoqLw0KVU5qQm1OKCAnWFpuX1kyX0FJQVInLCBOcXJnX2FOSF9mREhCZm0oICdOcXJnV05VQnFfVUJyTm1fcWtxYycgKSApOw0KDQovKiBKaE5yTiBqQmROciB4dEJkVSBmdEggSGhOIERkdGFCbSByRE5HQmpCRyBmREhCZm1yIHFtVSBxcnJmR0JxSE5VIGp0bUdIQmZtci4gKi8NClBOMHRCUE5fZm1HTiAoWFpuRlhpX1F1S25Zc19GWVYgLiAnQm1HZHRVTnIvZkRIQmZtci5EaEQnKTsgDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgIFFkdGFCbSBLRFVxSE4gN2hORzENCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpCaiAoIE5xcmdfYU5IX2ZESEJmbSggJ05xcmdXTlVCcV9VQnJObV90REdoMScgKSA9PSAnRScgKSB7DQpCbUdkdFVOX2ZtR04oWFpuRlhpX1F1S25Zc19GWVYgLiAnQm1HZHRVTnIvdEQtbWZIQmpCTlAuRGhEJyk7DQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogICB1ZnFVIDdmbUhQZmQgUXFtTmQNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpCbUdkdFVOX2ZtR04oIFhabkZYaV9RdUtuWXNfRllWIC4gJ0JtR2R0VU5yL05XYS1yTkhIQm1hci5EaEQnICk7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgIHVmcVUgaVBmbUggWG1VIDJHUEJESA0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCkJqICggTnFyZ19hTkhfZkRIQmZtKCAnTnFyZ1dOVUJxX1VCck5tX0RkdGEnICkgPT0gJ0UnICkgewkNCkJtR2R0VU5fZm1HTiggWFpuRlhpX1F1S25Zc19GWVYgLiAnQm1HZHRVTnIvalBmbUhObVUuRGhEJyApOw0KfQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICBBVVUgOEJVYU5ILCBaTkhxeGZjICYgMmhmUEhHZlVODQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KQm1HZHRVTl9mbUdOKCBYWm5GWGlfUXVLbllzX0ZZViAuICdCbUdkdFVOci9XTkhxeGZjTnIuRGhEJyApOyANCkJtR2R0VU5fZm1HTiggWFpuRlhpX1F1S25Zc19GWVYgLiAnQm1HZHRVTnIvcmhmUEhHZlVOLkRoRCcgKTsgDQpCbUdkdFVOX2ZtR04oIFhabkZYaV9RdUtuWXNfRllWIC4gJ0JtR2R0VU5yL0hCbWdXR04tVWRhLkRoRCcgKTsgDQpCbUdkdFVOX2ZtR04oIFhabkZYaV9RdUtuWXNfRllWIC4gJ0JtR2R0VU5yL0hxY2ZtZldnLkRoRCcgKTsNCkJtR2R0VU5fZm1HTiggWFpuRlhpX1F1S25Zc19GWVYgLiAnQm1HZHRVTnIvTnFyZzNCVWFOSC5EaEQnICk7DQoNCi8qDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCnwgQUlBUiBLUUZBSlggbkF1dVhWNg0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoqLw0KanRtR0hCZm0gTldhX3REVUhfYXFkZF9kQnJIKCkgew0KCUJqICggIUJyck5IKCAkX1FNMkpbJ0RySEJVJ10gKSApIHsNCgkJTkdoZiAnPEQ+QWtxYyBQTjB0TnJIIGpxQmROVSwgRGROcXJOIFBOalBOcmggZ2Z0UCB4UGYzck5QIDNCbVVmMy48L0Q+JzsNCgkJVUJOOw0KCQl9DQoJCU5kck4gew0KCQkJdERVcUhOX0RmckhfV05IcSggJF9RTTJKWydEckhCVSddICwgJ05xcldOVUJxX1dOSHF4ZmNfV05VQnFfYXFkZE5QZycsICcnICk7DQoJCQlOR2hmICc8RD5zZiBCV3FhTnIgck5kTkdITlUuLi48L0Q+JzsNCgkJCVVCTjsNCgkJfQ0KfQ0KcVVVX3FHSEJmbSggJzNEX3FrcWNfTldhX3REVUhfYXFkZF9kQnJIJywgJ05XYV90RFVIX2FxZGRfZEJySCcgKTsNCg0KDQovKg0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQp8IEFJQVIgdVkySiBaWEZZQSAoSllzNlo3WCkNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKi8NCmp0bUdIQmZtIE5XYV9kZnFVX1dOVUJxX2RCckgoKSB7DQoJDQoJQmogKCAhQnJyTkgoICRfUU0ySlsnSHFjZiddICkgKSB7DQoJCU5HaGYgJzxEPkFrcWMgUE4wdE5ySCBqcUJkTlUsIERkTnFyTiBQTmpQTnJoIGdmdFAgeFBmM3JOUCAzQm1VZjMuPC9EPic7DQoJCVVCTjsNCgkJfQ0KCQlOZHJOIHsNCgkJCWFkZnhxZCAkRGZySDsNCgkJCSRIcWNmSE5QVyA9ICRfUU0ySlsnSHFjZiddOw0KCQkJDQoJCQkNCiRxUGFyID0gcVBQcWcoDQonSHFjXzB0TlBnJyA9PiBxUFBxZygNCiAgICBxUFBxZygNCiAgICAgICAgJ0hxY2ZtZldnJyA9PiAnTldOVUJxYXFkZE5QZycsDQogICAgICAgICdqQk5kVScgPT4gJ0JVJw0KICAgICAgICAvLydITlBXcicgPT4gJEhxY2ZITlBXDQogICAgKQ0KKQ0KKTsNCg0KMHROUGdfRGZySHIoICRxUGFyICk7CQkJDQoJCQkNCkJqICggaHFvTl9EZnJIcigpICkgOg0KCTNoQmROICggaHFvTl9EZnJIcigpICkgOg0KCQkJJHJoZjNfV05VQnEgLj0gJw0KCQkJPEJtRHRIIG1xV049IicuJERmckgtPllGLiciIEJVPSInLiREZnJILT5ZRi4nIiBIZ0ROPSJITmNIIiBvcWR0Tj0iJy5hTkhfRGZySF9XTkhxKCAkQlUsICdOcXJXTlVCcV9XTkhxeGZjX0hCSGROJywgSFB0TiApLiciIC8+JzsNCg0KCU5HaGYgJHJoZjNfV05VQnE7DQoJVUJOKCk7DQoJDQoJTm1VM2hCZE47CQ0KTmRyTjoNCiAgTkdoZiAnMmZQUGcsIG1mIFdOVUJxIFdxSEdoTlUgZ2Z0UCBHUEJITlBCcS4nOwkJDQogIFVCTigpOwkNCk5tVUJqOw0KM0RfUE5yTkhfMHROUGcoKTsJCQkNCgkJCQ0KCX0NCn0NCnFVVV9xR0hCZm0oICczRF9xa3FjX05XYV9kZnFVX1dOVUJxX2RCckgnLCAnTldhX2RmcVVfV05VQnFfZEJySCcgKTsNCg0KLyoNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KfCBBSUFSIEZYdVhKWCBaWEZZQSBZWkFuWA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoqLw0KanRtR0hCZm0gTnFyV05VQnFfQldhX1dOVUJxX1BOV28oKSB7DQoJDQoJQmogKCAhQnJyTkgoICRfUU0ySlsnRHJIQlUnXSApIHx8ICFCcnJOSCggJF9RTTJKWydIZ0ROJ10gKSApIHsNCgkJTkdoZiAneSc7DQoJCVVCTjsNCgkJfQ0KCQkNCgkJTmRyTiB7DQoJCQlCaiAoICFHdFBQTm1IX3RyTlBfR3FtKCAnTlVCSF9IaE5XTl9mREhCZm1yJyApICkNCgkJCVVCTignLUUnKTsNCgkJCQ0KCQkJQmogKCAkX1FNMkpbJ0hnRE4nXSA9PSAnQldxYU4nICl7DQoJCQkJJFVxSHEgPSAkX1FNMkpbJ0RySEJVJ107DQoJCQkJdERVcUhOX0RmckhfV05IcSgkVXFIcSwgJ05xcldOVUJxX1dOSHF4ZmNfQldhJywgJycpOw0KCQkJCU5HaGYgJ0UnOw0KCQkJCVVCTjsNCgkJCQl9DQoJDQoJTmRyTkJqICggJF9RTTJKWydIZ0ROJ10gPT0gJ3F0VUJmJyApew0KCQkkVXFIcSA9ICRfUU0ySlsnRHJIQlUnXTsNCgkJCQl0RFVxSE5fRGZySF9XTkhxKCRVcUhxLCAnTnFyV05VQnFfV05IcXhmY19XTlVCcV9xdFVCZicsICcnKTsNCgkJCQlOR2hmICdFJzsNCgkgICAgVUJOOw0KCQl9DQoJfQ0KfQ0KcVVVX3FHSEJmbSggJzNEX3FrcWNfTnFyV05VQnFfQldhX1dOVUJxX1BOV28nLCAnTnFyV05VQnFfQldhX1dOVUJxX1BOV28nICk7DQoNCg0KLyoNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KfCBBSUFSIHVNQUYgWVpBblggRlhKQVl1Mg0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoqLw0KanRtR0hCZm0gTnFyV05VQnFfQldhX1VIZCgpIHsNCgkNCglCaiAoICFCcnJOSCggJF9RTTJKWydCV2FCVSddICkgKSB7DQoJCU5HaGYgJ3knOw0KCQlVQk47DQoJCX0NCgkJDQoJCU5kck4gew0KCQkJDQoJCQkkQldhX0JtamYgPSBhTkhfRGZySCggJF9RTTJKWydCV2FCVSddICk7DQoJCQkkSEhkID0gJEJXYV9CbWpmLT5EZnJIX0hCSGROOw0KCQkJJHJ4SEhkID0gJEJXYV9CbWpmLT5EZnJIX05jR05QREg7DQoJCQkkVU5HciA9ICAkQldhX0JtamYtPkRmckhfR2ZtSE5tSDsNCgkJCQ0KCQkJJHFkZEJXYVVxSCA9IHFQUHFnKCAkSEhkLCAkcnhISGQsICRVTkdyICk7DQoJCQlOR2hmIEJXRGRmVU4oInx+fCIsICRxZGRCV2FVcUgpOw0KCSAgICBVQk47DQoJCX0NCn0NCnFVVV9xR0hCZm0oICczRF9xa3FjX05xcldOVUJxX0JXYV9VSGQnLCAnTnFyV05VQnFfQldhX1VIZCcgKTsNCg0KDQovKg0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQp8IEFJQVIgS1FGQUpYIFlaQW5YIEZYSkFZdTINCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKi8NCmp0bUdIQmZtIE5xcmdfR3RySGZXX3Jxb05fanRtR0hCZm0oKXsNCgkNCgkJQmogKCAhQnJyTkgoICRfUU0ySlsnQldhQlUnXSApIHx8ICFCcnJOSCggJF9RTTJKWydCV2FISGQnXSApIHx8ICFCcnJOSCggJF9RTTJKWydCV2FyeEhIZCddICkgfHwgIUJyck5IKCAkX1FNMkpbJ0JXYVVOckcnXSApICkgew0KCQlOR2hmICd5JzsNCgkJVUJOOw0KCQl9DQoJCQ0KCQlOZHJOIHsNCiAgICAzRF90RFVxSE5fRGZySChxUFBxZygnWUYnID0+ICRfUU0ySlsnQldhQlUnXSwgJ0RmckhfSEJIZE4nID0+ICRfUU0ySlsnQldhSEhkJ10pKTsNCgkzRF90RFVxSE5fRGZySChxUFBxZygnWUYnID0+ICRfUU0ySlsnQldhQlUnXSwgJ0RmckhfTmNHTlBESCcgPT4gJF9RTTJKWydCV2FyeEhIZCddKSk7DQoJM0RfdERVcUhOX0RmckgocVBQcWcoJ1lGJyA9PiAkX1FNMkpbJ0JXYUJVJ10sICdEZnJIX0dmbUhObUgnID0+ICRfUU0ySlsnQldhVU5yRyddKSk7DQoJTkdoZiAnRXlFJzsNCgkJICAgIFVCTjsNCgkJfQ0KfQ0KcVVVX3FHSEJmbSggJzNEX3FrcWNfTnFyZ19HdHJIZldfcnFvTl9qdG1HSEJmbScsICdOcXJnX0d0ckhmV19ycW9OX2p0bUdIQmZtJyApOw0KDQoNCi8qDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCnwgQUlBUiB1TUFGIFlaQW5YIG5BdXVYVjYNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKi8NCmp0bUdIQmZtIE5XYV9hcWRkTlBnX2RCckgoKSB7DQoNCglCaiAoICFCcnJOSCggJF9RTTJKWydEcWFOJ10gKSApIHskRHFhTiA9IEU7fQ0KCU5kck4geyREcWFOID0gKEJtSClxVVVyZHFyaE5yKCAkX1FNMkpbJ0RxYU4nXSApO30NCgkNCglCaiAoICFCcnJOSCggJF9RTTJKWydETlBfRHFhTiddICkgKSB7JEROUF9EcWFOID0gNDt9DQoJTmRyTiB7JEROUF9EcWFOID0gKEJtSClxVVVyZHFyaE5yKCAkX1FNMkpbJ0ROUF9EcWFOJ10gKTt9DQoJDQoJJEJXYV9VcUhxID0gTldhX2RCeFBxUGdfQldxYU5yKCAkRHFhTiwgJEROUF9EcWFOICk7DQoJDQoJTkdoZiAnPHRkPic7DQoJDQoJQmogKCAkQldhX1VxSHFbJ0hmSHFkQldhJ10gPT0geSApIHtOR2hmICc8RD5zZiBCV3FhTnIgamZ0bVUgLi4gPC9EPic7fQ0KCU5kck4gew0KCQlqZlBOcUdoKCAkQldhX1VxSHFbJ0JXYSddIHFyICRCV2EgKSB7DQoJCQkkVU5qM0RhcWRkTlBnID0gTldhX0hodFd4X3JQRyggJEJXYVsndFBkJ10sICdPeScsICdPeScsICd5JywgJ3knICk7DQoJCQlOR2hmICc8ZEI+PEJXYSByUEc9IicuJFVOajNEYXFkZE5QZy4nIiBCVT0iJy4kQldhWydCVSddLiciIC8+PC9kQj4nOwkNCgkJfQ0KCX0NCgkNCglOR2hmICcNCgk8L3RkPg0KCTx4UCBHZHFycj0iV05IcWFxZF9HZE5xUCIgLz4NCgk8SHF4ZE4gR05kZHJEcUdCbWE9InkiIEdOZGREcVVVQm1hPSJTIiB4ZlBVTlA9InkiIDNCVUhoPSJFeXklIiBySGdkTj0ieGZQVU5QLUhmRDogRURjIHJmZEJVICNGRkY7IFdxUGFCbS1IZkQ6RXlEYzsgRHFVVUJtYS1IZkQ6U0RjOyI+DQoJCTxIUD4NCgkJCTxIVSBySGdkTj0iM0JVSGg6IGJTJTsiPic7CQkJDQoJCQlCaiAoICREcWFOID4gRSApICB7DQoJCQkJTkdoZiAnPEJtRHRIIEhnRE49Inh0SEhmbSIgR2RxcnI9IkRQTm9fRHFhTiB4dEhIZm0tck5HZm1VcVBnIiBCVT0ieEhtbXFvXycuICggJERxYU4gLSBFICkgLiciIG1xV049IkRQTm94SG1tcW8iIG9xZHROPSImZHEwdGY7IFFQTm9CZnRyIEJXcWFOciIgLz4nOw0KCQkJfQ0KCQkJDQoJCU5HaGYgJzwvSFU+PEhVIHJIZ2ROPSIzQlVIaDogYnklOyBITmNILXFkQmFtOiBHTm1ITlA7Ij4nOw0KCQkNCgkJCUJqICggJEJXYV9VcUhxWydIZkhxZEJXYSddID4geSAmJiAkQldhX1VxSHFbJ0RxYU5fR2Z0bUgnXSA+IEUgKSB7DQoJCQkJTkdoZiAnPE5XPkRxYU4gJy4kQldhX1VxSHFbJ0RxYSddLicgZmogJy4kQldhX1VxSHFbJ0RxYU5fR2Z0bUgnXS4nPC9OVz48Qm1EdEggckhnZE49IlVCckRkcWc6bWZtTjsiIEhnRE49IkhOY0giIHJCcE49IkMiIG1xV049IkJXYV9tdFd4TlAiIEJVPSJCV2F4dEhETlBEcWFOIiBvcWR0Tj0iJy4kRE5QX0RxYU4uJyIgLz4nOwkNCgkJCX0NCgkJCU5kck4geyBOR2hmICc8Qm1EdEggckhnZE49IlVCckRkcWc6bWZtTjsiIEhnRE49IkhOY0giIHJCcE49IkMiIG1xV049IkJXYV9tdFd4TlAiIEJVPSJCV2F4dEhETlBEcWFOIiBvcWR0Tj0iJy4kRE5QX0RxYU4uJyIgLz4nOwl9DQoJCQkNCgkJTkdoZiAnPC9IVT48SFUgckhnZE49IjNCVUhoOiBiUyU7IEhOY0gtcWRCYW06IFBCYWhIOyI+JzsNCgkJCUJqICggJEJXYV9VcUhxWydXZlBOJ10gIT0ganFkck4gKSAgew0KCQkJCU5HaGYgJzxCbUR0SCBIZ0ROPSJ4dEhIZm0iIEdkcXJyPSJtTmNIX0RxYU4geHRISGZtLXJOR2ZtVXFQZyIgQlU9InhIbW1xb18nLiAoJERxYU4gKyBFKSAuJyIgbXFXTj0ibU5jSHhIbW1xbyIgb3FkdE49InNOY0ggQldxYU5yICZQcTB0ZjsiIC8+JzsNCgkJCX0NCgkJTkdoZiAnPC9IVT4NCgkJPC9IUD4NCgk8L0hxeGROPg0KCSc7DQoNCglVQk4oKTsNCn0NCnFVVV9xR0hCZm0oICczRF9xa3FjX05XYV9hcWRkTlBnX2RCckgnLCAnTldhX2FxZGROUGdfZEJySCcgKTsNCg0KanRtR0hCZm0gTldhX3JOZF9CV2FfUGRVKCkgewkNCgkNCglCaiAoICFCcnJOSCggJF9RTTJKWydCV3FhTnInXSApICkgeyAkQldxYU5yID0gcVBQcWcoKTt9DQoJTmRyTiB7ICRCV3FhTnIgPSAkX1FNMkpbJ0JXcWFOciddO30NCgkNCgkvLyBhTkggSGhOIEhCSGROcg0KCSRCV3FhTnIgPSBOV2FfTmNIX3JOZCggJEJXcWFOciApOw0KCSRtTjNfQldhID0gJyc7DQoJDQoJQmogKCAhJEJXcWFOciApIHskbU4zX0JXYSA9ICc8RD5zZiBCV3FhTnIgck5kTkdITlUuLi48L0Q+Jzt9DQoJTmRyTiB7DQoJCWpmUE5xR2goICRCV3FhTnIgcXIgJEJXYV9CVSApIHsNCgkJCSRCV2FfVXFIcSA9IGFOSF9EZnJIKCAkQldhX0JVICk7DQoJCQkkQldhX3RQZCA9ICRCV2FfVXFIcS0+YXRCVTsNCgkJCSRyZEdIVUJXYSA9IE5XYV9IaHRXeF9yUEcoICRCV2FfdFBkLCAnT3knLCAnT3knLCAneScsICd5JyApOw0KCQkJJG1OM19CV2EgLj0gJw0KCQkJPGRCPg0KCQkJCTxCbUR0SCBIZ0ROPSJoQlVVTm0iIG1xV049Ik5xcldOVUJxX1dOSHF4ZmNfQldhX3JkQlVOUFtdIiBvcWR0Tj0iJy4kQldhX0JVLiciIC8+DQoJCQkJPEJXYSByUEc9IicuJHJkR0hVQldhLiciIC8+DQoJCQkJPHJEcW0gSEJIZE49IlZOV2ZvTiBZV3FhTiI+PC9yRHFtPg0KCQkJPC9kQj4NCgkJCSc7CQ0KCQl9DQoJfQ0KCQ0KCU5HaGYgJG1OM19CV2E7DQoJVUJOKCk7DQp9DQpxVVVfcUdIQmZtKCAnM0RfcWtxY19OV2Ffck5kX0JXYV9QZFUnLCAnTldhX3JOZF9CV2FfUGRVJyApOw0KDQoNCi8qDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCnwgbk5IIEhoTiBCV3FhTnIgalBmVyBIaE4gOFEgZEJ4UHFQZw0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoqLw0KanRtR0hCZm0gTldhX2RCeFBxUGdfQldxYU5yKCAkRHFhTiA9IEUsICRETlBfRHFhTiA9IEV5ICkgew0KCSQwdE5QZ19CV3FhTnJfcVBhciA9IHFQUHFnKA0KCQknRGZySF9IZ0ROJyA9PiAncUhIcUdoV05tSCcsICdEZnJIX1dCV05fSGdETicgPT4nQldxYU4nLCAnRGZySF9ySHFIdHInID0+ICdCbWhOUEJIJywgJ0RmckhyX0ROUF9EcWFOJyA9PiAkRE5QX0RxYU4sICdEcWFOVScgPT4gJERxYU4NCgkpOw0KCQ0KCSQwdE5QZ19CV3FhTnIgPSBtTjMgOFFfenROUGcoICQwdE5QZ19CV3FhTnJfcVBhciApOw0KCSRCV3FhTnIgPSBxUFBxZygpOw0KCQ0KCWpmUE5xR2ggKCAkMHROUGdfQldxYU5yLT5EZnJIciBxciAkQldxYU4gKSB7IA0KCQkkQldxYU5yW10gPSBxUFBxZygNCgkJCSdCVScJPT4gJEJXcWFOLT5ZRiwNCgkJCSd0UGQnIAk9PiAkQldxYU4tPmF0QlUNCgkJKTsNCgl9DQoJDQoJJEJXYV9tdFd4TlAgPSAkMHROUGdfQldxYU5yLT5qZnRtVV9EZnJIcjsNCgkkRHFhTl9HZnRtSCA9IEdOQmQoICRCV2FfbXRXeE5QIC8gJEROUF9EcWFOICk7DQoJJHJoZjNtID0gJEROUF9EcWFOICogJERxYU47DQoJKCAkcmhmM20gPj0gJEJXYV9tdFd4TlAgKSA/ICRXZlBOID0ganFkck4gOiAkV2ZQTiA9IEhQdE47IA0KCQ0KCVBOSHRQbSBxUFBxZyggJ0JXYScgPT4gJEJXcWFOciwgJ0RxYScgPT4gJERxYU4sICdEcWFOX0dmdG1IJyA9PiREcWFOX0dmdG1ILCAnV2ZQTicgPT4gJFdmUE4sICdIZkhxZEJXYScgPT4gJEJXYV9tdFd4TlAgKTsNCn0NCg0KanRtR0hCZm0gTldhX05jSF9yTmQoICRXTlVCcSApIHsNCglCaiAoIEJyX3FQUHFnKCAkV05VQnEgKSApIHsNCgkJJG1OM19xUFBxZyA9IHFQUHFnKCk7DQoJCQ0KCQlqZlBOcUdoKCAkV05VQnEgcXIgJFdOVUJxX0JVICkgew0KCQkJQmogKCBhTkhfSGhOX0hCSGROKCAkV05VQnFfQlUgKSApIHsJDQoJCQkJJG1OM19xUFBxZ1tdID0gJFdOVUJxX0JVOw0KCQkJfQ0KCQl9DQoJCQ0KCQlCaiAoR2Z0bUgoJG1OM19xUFBxZykgPT0geSkge1BOSHRQbSBqcWRyTjt9DQoJCU5kck4ge1BOSHRQbSAkbU4zX3FQUHFnO30NCgl9DQoJTmRyTiB7UE5IdFBtIGpxZHJOO30JDQp9DQoNCg0KLyoNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KfCBYcXJnV05VQnEgN3RySGZXIDdxSE5hZlBnIDlmYyAoWk5IcXhmYykNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKi8NCmp0bUdIQmZtIE5xcmdXTlVCcWFxZGROUGdfR3FITmFmUEJOcl9XTkhxX3hmYyggJERmckgsICR4ZmMgKSB7DQoJJFVOanF0ZEhyID0gcVBQcWcoJ0hxY2ZtZldnJyA9PiAnTldOVUJxYXFkZE5QZycpOw0KCUJqICggIUJyck5IKCAkeGZjWydxUGFyJ10gKSB8fCAhQnJfcVBQcWcoICR4ZmNbJ3FQYXInXSApICkNCgkJJHFQYXIgPSBxUFBxZygpOw0KCU5kck4NCgkJJHFQYXIgPSAkeGZjWydxUGFyJ107DQoJTmNIUHFHSCggM0RfRHFQck5fcVBhcigkcVBhciwgJFVOanF0ZEhyKSwgWFJKVl8yNVlRICk7DQoJJEhxYyA9IGFOSF9IcWNmbWZXZyggJEhxY2ZtZldnICk7DQoNCgk/Pg0KCTxVQm8gQlU9IkhxY2ZtZldnLTw/RGhEIE5HaGYgJEhxY2ZtZldnOyA/PiIgR2RxcnI9IkdxSE5hZlBnVUJvIj4NCgkJPHRkIEJVPSI8P0RoRCBOR2hmICRIcWNmbWZXZzsgPz4tSHF4ciIgR2RxcnI9IkdxSE5hZlBnLUhxeHIiPg0KCQkJPGRCIEdkcXJyPSJIcXhyIj48cSBoUE5qPSIjPD9EaEQgTkdoZiAkSHFjZm1mV2c7ID8+LXFkZCI+PD9EaEQgTkdoZiAkSHFjLT5kcXhOZHItPnFkZF9CSE5XcjsgPz48L3E+PC9kQj4NCgkJCTxkQiBHZHFycj0iaEJVTi1Cai1tZi1rciI+PHEgaFBOaj0iIzw/RGhEIE5HaGYgJEhxY2ZtZldnOyA/Pi1EZkQiPjw/RGhEIF9OKCAnWmZySCBLck5VJyApOyA/PjwvcT48L2RCPg0KCQk8L3RkPg0KDQoJCTxVQm8gQlU9Ijw/RGhEIE5HaGYgJEhxY2ZtZldnOyA/Pi1EZkQiIEdkcXJyPSJIcXhyLURxbU5kIiBySGdkTj0iVUJyRGRxZzogbWZtTjsiPg0KCQkJPHRkIEJVPSI8P0RoRCBOR2hmICRIcWNmbWZXZzsgPz5HaE5HMWRCckgtRGZEIiBHZHFycj0iR3FITmFmUGdHaE5HMWRCckggamZQVy1tZi1HZE5xUCIgPg0KCQkJCTw/RGhEICREZkR0ZHFQX0JVciA9IDNEX0RmRHRkcVBfSE5QV3JfR2hORzFkQnJIKCRIcWNmbWZXZyk7ID8+DQoJCQk8L3RkPg0KCQk8L1VCbz4NCg0KCQk8VUJvIEJVPSI8P0RoRCBOR2hmICRIcWNmbWZXZzsgPz4tcWRkIiBHZHFycj0iSHF4ci1EcW1OZCI+DQoJCQk8P0RoRA0KICAgICAgICAgICAgJG1xV04gPSAoICRIcWNmbWZXZyA9PSAnTldOVUJxYXFkZE5QZycgKSA/ICdEZnJIX0dxSE5hZlBnJyA6ICdIcWNfQm1EdEhbJyAuICRIcWNmbWZXZyAuICddJzsNCiAgICAgICAgICAgIE5HaGYgIjxCbUR0SCBIZ0ROPSdoQlVVTm0nIG1xV049J3skbXFXTn1bXScgb3FkdE49J3knIC8+IjsgLy8gQWRkZjNyIGpmUCBxbSBOV0RIZyBITlBXIHJOSCBIZiB4TiByTm1ILiB5IEJyIHFtIEJtb3FkQlUgSk5QVyBZRiBxbVUgM0JkZCB4TiBCYW1mUE5VIHhnIE5XREhnKCkgR2hORzFyLg0KICAgICAgICAgICAgPz4NCgkJCTx0ZCBCVT0iPD9EaEQgTkdoZiAkSHFjZm1mV2c7ID8+R2hORzFkQnJIIiBVcUhxLTNELWRCckhyPSJkQnJIOjw/RGhEIE5HaGYgJEhxY2ZtZldnPz4iIEdkcXJyPSJHcUhOYWZQZ0doTkcxZEJySCBqZlBXLW1mLUdkTnFQIj4NCgkJCQk8P0RoRCAzRF9ITlBXcl9HaE5HMWRCckgoJERmckgtPllGLCBxUFBxZyggJ0hxY2ZtZldnJyA9PiAkSHFjZm1mV2csICdEZkR0ZHFQX0dxSHInID0+ICREZkR0ZHFQX0JVciApICkgPz4NCgkJCTwvdGQ+DQoJCTwvVUJvPg0KCTw/RGhEIEJqICggR3RQUE5tSF90ck5QX0dxbSgkSHFjLT5HcUQtPk5VQkhfSE5QV3IpICkgOiA/Pg0KCQkJPFVCbyBCVT0iPD9EaEQgTkdoZiAkSHFjZm1mV2c7ID8+LXFVVU5QIiBHZHFycj0iM0QtaEJVVU5tLUdoQmRVUE5tIj4NCgkJCQk8aGU+DQoJCQkJCTxxIEJVPSI8P0RoRCBOR2hmICRIcWNmbWZXZzsgPz4tcVVVLUhmYWFkTiIgaFBOaj0iIzw/RGhEIE5HaGYgJEhxY2ZtZldnOyA/Pi1xVVUiIEdkcXJyPSJoQlVOLUJqLW1mLWtyIj4NCgkJCQkJCTw/RGhEDQoJCQkJCQkJLyogSFBxbXJkcUhmUHI6ICVyOiBxVVUgbU4zIEhxY2ZtZldnIGRxeE5kICovDQoJCQkJCQkJRFBCbUhqKCBfXyggJysgJXInICksICRIcWMtPmRxeE5kci0+cVVVX21OM19CSE5XICk7DQoJCQkJCQk/Pg0KCQkJCQk8L3E+DQoJCQkJPC9oZT4NCgkJCQk8RCBCVT0iPD9EaEQgTkdoZiAkSHFjZm1mV2c7ID8+LXFVVSIgR2RxcnI9IkdxSE5hZlBnLXFVVSAzRC1oQlVVTm0tR2hCZFUiPg0KCQkJCQk8ZHF4TmQgR2RxcnI9InJHUE5ObS1QTnFVTlAtSE5jSCIgamZQPSJtTjM8P0RoRCBOR2hmICRIcWNmbWZXZzsgPz4iPjw/RGhEIE5HaGYgJEhxYy0+ZHF4TmRyLT5xVVVfbU4zX0JITlc7ID8+PC9kcXhOZD4NCgkJCQkJPEJtRHRIIEhnRE49IkhOY0giIG1xV049Im1OMzw/RGhEIE5HaGYgJEhxY2ZtZldnOyA/PiIgQlU9Im1OMzw/RGhEIE5HaGYgJEhxY2ZtZldnOyA/PiIgR2RxcnI9ImpmUFctUE4wdEJQTlUgamZQVy1CbUR0SC1IQkQiIG9xZHROPSI8P0RoRCBOR2hmIE5yR19xSEhQKCAkSHFjLT5kcXhOZHItPm1OM19CSE5XX21xV04gKTsgPz4iIHFQQnEtUE4wdEJQTlU9IkhQdE4iLz4NCgkJCQkJPGRxeE5kIEdkcXJyPSJyR1BOTm0tUE5xVU5QLUhOY0giIGpmUD0ibU4zPD9EaEQgTkdoZiAkSHFjZm1mV2c7ID8+X0RxUE5tSCI+DQoJCQkJCQk8P0RoRCBOR2hmICRIcWMtPmRxeE5kci0+RHFQTm1IX0JITldfR2ZkZm07ID8+DQoJCQkJCTwvZHF4TmQ+DQoJCQkJCTw/RGhEIDNEX1VQZkRVZjNtX0dxSE5hZlBCTnIoIHFQUHFnKCAnSHFjZm1mV2cnID0+ICRIcWNmbWZXZywgJ2hCVU5fTldESGcnID0+IHksICdtcVdOJyA9PiAnbU4zJy4kSHFjZm1mV2cuJ19EcVBObUgnLCAnZlBVTlB4ZycgPT4gJ21xV04nLCAnaEJOUHFQR2hCR3FkJyA9PiBFLCAncmhmM19mREhCZm1fbWZtTicgPT4gJyZXVXFyaDsgJyAuICRIcWMtPmRxeE5kci0+RHFQTm1IX0JITlcgLiAnICZXVXFyaDsnICkgKTsgPz4NCgkJCQkJPEJtRHRIIEhnRE49Inh0SEhmbSIgQlU9Ijw/RGhEIE5HaGYgJEhxY2ZtZldnOyA/Pi1xVVUtcnR4V0JIIiBVcUhxLTNELWRCckhyPSJxVVU6PD9EaEQgTkdoZiAkSHFjZm1mV2cgPz5HaE5HMWRCckg6PD9EaEQgTkdoZiAkSHFjZm1mV2cgPz4tcVVVIiBHZHFycj0ieHRISGZtIEdxSE5hZlBnLXFVVS1ydHhXQkgiIG9xZHROPSI8P0RoRCBOR2hmIE5yR19xSEhQKCAkSHFjLT5kcXhOZHItPnFVVV9tTjNfQkhOVyApOyA/PiIgLz4NCgkJCQkJPD9EaEQgM0RfbWZtR05fakJOZFUoICdxVVUtJy4kSHFjZm1mV2csICdfcWtxY19tZm1HTi1xVVUtJy4kSHFjZm1mV2csIGpxZHJOICk7ID8+DQoJCQkJCTxyRHFtIEJVPSI8P0RoRCBOR2hmICRIcWNmbWZXZzsgPz4tcWtxYy1QTnJEZm1yTiI+PC9yRHFtPg0KCQkJCTwvRD4NCgkJCTwvVUJvPg0KCQk8P0RoRCBObVVCajsgPz4NCgk8L1VCbz4NCgk8P0RoRA0KfQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogQVVVIFFmckggSmh0V3htcUJkciBxbVUgN3RySGZXIEpodFd4bXFCZHIgckJwTg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5xcldOVUJxX3FVVV9IaHRXeG1xQmRfcnRERGZQSCgpIHsNCglCaiAoICFHdFBQTm1IX0hoTldOX3J0RERmUEhyKCAnRGZySC1IaHRXeG1xQmRyJyApKSAgew0KcVVVX0hoTldOX3J0RERmUEgoICdEZnJILUhodFd4bXFCZHInLCBxUFBxZyggJ05xcmdXTlVCcWFxZGROUGcnICkgKTsNCnFVVV9CV3FhTl9yQnBOKCAnTldhLXFVV0JtLUhodFd4JywgbHksIGx5LCBIUHROICk7IC8vIEtyTlUgQm0gSGhOIE5xcmdXTlVCcSBOVUJIIERxYU4NCgl9DQp9DQpxVVVfcUdIQmZtKCdCbUJIJywgJ05xcldOVUJxX3FVVV9IaHRXeG1xQmRfcnRERGZQSCcpOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogQVVVIEdQTlVCSHIgQm0gcVVXQm0gRHFhTg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5xcmdXTlVCcWFxZGROUGdfcVVVX2pmZkhOUF9HUE5VQkhyKCAkSE5jSCApIHsNCgkkSCA9ICcnOw0KCUJqICggYU5IX0RmckhfSGdETigpID09PSAnTnFyZ1dOVUJxYXFkZE5QZycgKSB7DQoJCSRIIC49ICI8VUJvIEJVPVwiR1BOVUJIclwiIHJIZ2ROPVwiZEJtTi1oTkJhaEg6IENDRGM7XCI+IjsNCgkJJEggLj0gIjxEPlhxcmcgWk5VQnEgbnFkZE5QZyBEZHRhQm0gQnIgR1BOcUhOVSB4ZyA8cSBoUE5qPVwiaEhIRDovLzMzMy5haGZwZ2RxeC5HZlcvXCIgSHFQYU5IPVwiX3hkcW0xXCI+bmhmcGd1cXgsIFltRzwvcT4uPC9EPiI7DQoJCSRIIC49ICI8RD5ZaiBnZnQgaHFvTiByZldOIHJ0RERmUEggQnJydE4sIFVmbSdIIGhOckJIcUhOIEhmIDxxIGhQTmo9XCJoSEhEOi8vYWhmcGdkcXguR2ZXL3J0eFdCSC1ydEREZlBILVBOMHROckhcIiBIcVBhTkg9XCJfeGRxbTFcIj4zUEJITiBoTlBOPC9xPi4gSmhOIG5oZnBndXF4IEhOcVcgM0JkZCB4TiBocUREZyBIZiBydEREZlBIIGdmdCBmbSBxbWcgQnJydE4uPC9EPiI7DQoJCSRIIC49ICI8L1VCbz4iOw0KCX1OZHJOew0KCQkkSCA9ICRITmNIOw0KCX0NCg0KCVBOSHRQbSAkSDsNCn0NCnFVVV9qQmRITlAoICdxVVdCbV9qZmZITlBfSE5jSCcsICdOcXJnV05VQnFhcWRkTlBnX3FVVV9qZmZITlBfR1BOVUJIcicgKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICBuTkggSGhOIERxSEhOUG1yIGRCckggDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyV05VQnFfRHFISE5QbXJfZHIoKSB7DQoJJERxSEhOUG1yID0gcVBQcWcoKTsNCgkkRHFISE5QbXJfZEJySCA9IHJHcW1VQlAoIFhabl9GWVYuIi9HcnIvQldxYU5yL0RxSEhOUG1yIiApOw0KCQ0KCWpmUE5xR2goICREcUhITlBtcl9kQnJIIHFyICREcUhITlBtX21xV04gKSB7DQoJCUJqICggJERxSEhOUG1fbXFXTiAhPSAnLicgJiYgJERxSEhOUG1fbXFXTiAhPSAnLi4nICkgew0KCQkJJERxSEhOUG1yW10gPSAkRHFISE5QbV9tcVdOOw0KCQl9DQoJfQ0KCVBOSHRQbSAkRHFISE5QbXI7CQ0KfQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIFRYUiBIZiBWbjkNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOcXJnV05VQnFfaE5jQ1BheCgkaE5jKSB7DQogICAkaE5jID0gckhQX1BORGRxR04oIiMiLCAiIiwgJGhOYyk7DQoNCiAgIEJqKHJIUGRObSgkaE5jKSA9PSBiKSB7DQogICAgICAkUCA9IGhOY1VORyhydHhySFAoJGhOYyx5LEUpLnJ0eHJIUCgkaE5jLHksRSkpOw0KICAgICAgJGEgPSBoTmNVTkcocnR4ckhQKCRoTmMsRSxFKS5ydHhySFAoJGhOYyxFLEUpKTsNCiAgICAgICR4ID0gaE5jVU5HKHJ0eHJIUCgkaE5jLEMsRSkucnR4ckhQKCRoTmMsQyxFKSk7DQogICB9IE5kck4gew0KICAgICAgJFAgPSBoTmNVTkcocnR4ckhQKCRoTmMseSxDKSk7DQogICAgICAkYSA9IGhOY1VORyhydHhySFAoJGhOYyxDLEMpKTsNCiAgICAgICR4ID0gaE5jVU5HKHJ0eHJIUCgkaE5jLGUsQykpOw0KICAgfQ0KICAgJFBheCA9IHFQUHFnKCRQLCAkYSwgJHgpOw0KICAgLy9QTkh0UG0gQldEZGZVTigiLCIsICRQYXgpOyAvLyBQTkh0UG1yIEhoTiBQYXggb3FkdE5yIHJORHFQcUhOVSB4ZyBHZldXcXINCiAgIFBOSHRQbSBCV0RkZlVOKCIsIiwgJFBheCk7IC8vIFBOSHRQbXIgcW0gcVBQcWcgM0JIaCBIaE4gUGF4IG9xZHROcg0KfQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIFBORGRxR05fTmNITm1yQmZtDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTldhX1BORGRxR05fTmNITm1yQmZtKCRqQmRObXFXTikgew0KCSROY0ggPSBEcUhoQm1qZigkakJkTm1xV04sIFFBSlRZc2lNX1hSSlhzMllNcyk7DQoJJG1OM19OY0hObXJCZm0gPSAnTldhR29QLScuJE5jSDsNCglQTkh0UG0gcnR4ckhQX1BORGRxR04oJGpCZE5tcVdOICwgJG1OM19OY0hObXJCZm0sIHJIUFBEZnIoJGpCZE5tcVdOICwgJy4nKSArIEUpOw0KICAgIC8vUE5IdFBtIERQTmFfUE5EZHFHTignL1wuLiskLycsICcuJyAuICRtTjNfTmNITm1yQmZtLCAkakJkTm1xV04pOw0KfQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIG5OSCBxSEhxR2hXTm1IIEJXcWFOIEJVIA0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5XYV9hTkhfcUhIcUdoV05tSF9CVV9qUGZXX3JQRyAoJGRCbTEpIHsNCiAgICBhZGZ4cWQgJDNEVXg7DQogICAgICAgICRkQm0xID0gRFBOYV9QTkRkcUdOKCcvLVxVK2NcVSsoPz1cLihrRGF8a0ROYXxEbWF8YUJqKSQpL0InLCAnJywgJGRCbTEpOw0KICAgICAgICBQTkh0UG0gJDNEVXgtPmFOSF9vcVAoIjJYdVg3SiBZRiBpVk1aIHskM0RVeC0+RGZySHJ9IDhUWFZYIGF0QlU9JyRkQm0xJyIpOw0KfQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIFlXcWFOIFZOckJwTiAoIEFyRE5HSCBWcUhCZiApDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyZ1dOVUJxX0JXYVBOckJwTigkQldhLCAkZEJXQkgsICRCclBOciwgJEJXMywgJEJXaCkgew0KCQ0KCS8qQmogKCBySFBEZnIoICRCV2EsICRfMlhWTFhWWydUSkpRX1RNMkonXSApID09PSBpQXUyWCApIHsNCgkJJEJXYT0gImhISEQ6Ly8iLiRfMlhWTFhWWydUSkpRX1RNMkonXS4kQldhOw0KCQl9DQoJCU5kck4gew0KCQkJJEJXYT0gJEJXYTsNCgkJCX0qLw0KCQ0KCUJqICggJEJXYSA9PSAnJyApIHsNCgkJJEJXYSA9IERkdGFCbXJfdFBkKCAnQldxYU5yL21mLUJXcWFOLXFvcUJkcXhkTi5rRGEnICwgVUJQbXFXTihfX2lZdVhfXykgKSA7DQoJfQ0KCQlOZHJOIHsNCgkJCSRCV2EgPSAkQldhOw0KCQl9CQ0KCQ0KCUJqICggJEJyUE5yID09ICdmbScgKSB7DQoJCUJqICggJEJXMyA+ICRkQldCSCApIHsNCgkJCSRITldEQldhUHFIQmYgPSAkQldoIC8gJEJXMzsNCgkJCSRqQmggPSAoQm1IKSgkSE5XREJXYVBxSEJmICogJGRCV0JIKTsgLy8gakJtcWQgQldxYU4gaE5CYWhIDQoJCQkkakIzID0gJGRCV0JIOyAvLyBqQmNOVSBCV3FhTiAzQlVIaA0KCQkJDQoJCQkkcWRkQldhVXFIcSA9IHFQUHFnKCBOV2FfSGh0V3hfclBHKCAkQldhLCAkakIzLCAkakJoLCAkQlczLCAkQldoKSwgJGpCMywgJGpCaCApOw0KCQkJDQoJCQl9DQoJCU5kck4gew0KCQkJJHFkZEJXYVVxSHEgPSBxUFBxZyggJEJXYSwgJEJXMywgJEJXaCApOw0KCQkJfQkJDQoJCX0NCglOZHJOIHsgJHFkZEJXYVVxSHEgPSBxUFBxZyggJEJXYSwgJEJXMywgJEJXaCApOwkNCgl9DQpQTkh0UG0gQldEZGZVTigiLCIsICRxZGRCV2FVcUhxKTsNCn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICBZV3FhTiBWTnJCcE4gKCBBckROR0ggVnFIQmYgKSBBSUFSDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyZ1dOVUJxX0JXYVBOckJwTl9xa3FjKCkgew0KCUJqICggIUJyck5IKCAkX1FNMkpbJ0JXYXRQZCddICkgfHwgIUJyck5IKCAkX1FNMkpbJ2RCV0JITlAnXSApIHx8ICRfUU0ySlsnQldhdFBkJ10gPT0gJycgfHwgJF9RTTJKWydkQldCSE5QJ10gPT0gJycgKSB7DQoJCU5HaGYgJzxEPkFrcWMgUE4wdE5ySCBqcUJkTlUsIERkTnFyTiBQTmpQTnJoIGdmdFAgeFBmM3JOUCAzQm1VZjMuPC9EPic7DQoJCVVCTjsNCgkJfQ0KCQlOZHJOIHsNCgkJCQ0KCQkkQldhdFBkID0gJF9RTTJKWydCV2F0UGQnXTsNCgkJJGRCV0JITlAgPSAkX1FNMkpbJ2RCV0JITlAnXTsNCgkJJHFISEJVID0gM0RfYU5IX3FISHFHaFdObUhfQldxYU5fclBHKCBOV2FfYU5IX3FISHFHaFdObUhfQlVfalBmV19yUEcoICRCV2F0UGQgKSwgJ2p0ZGQnICk7DQoJDQoJCS8qQmogKCBySFBEZnIoICRCV2F0UGQsICRfMlhWTFhWWydUSkpRX1RNMkonXSApID09PSBpQXUyWCApIHsNCgkJCSRCV2F0UGQgPSAiaEhIRDovLyIuJF8yWFZMWFZbJ1RKSlFfVE0ySiddLiRCV2F0UGQ7DQoJCQl9DQoJCQlOZHJOIHsNCgkJCQkkQldhdFBkID0gJEJXYXRQZDsNCgkJCQl9Ki8NCgkJCQkNCgkJCQkkSFdEQldhUHFIQmYgPSAkcUhIQlVbQ10gLyAkcUhIQlVbRV07IC8vYU5IIEJXcWFOIHFyRE5HIFBxSEJmDQoNCgkJQmogKCAkcUhIQlVbRV0gPiAkZEJXQkhOUCApIHsNCgkJCSRIV0RoID0gKEJtSCkoJEhXREJXYVBxSEJmICogJGRCV0JITlApOyAvLyBqQm1xZCBCV3FhTiBoTkJhaEgNCgkJCSRIV0QzID0gJGRCV0JITlA7IC8vIGpCY05VIEJXcWFOIDNCVUhoDQoJCQkkcWRkQldhVXFIcSA9IHFQUHFnKCBOV2FfSGh0V3hfclBHKCAkQldhdFBkLCAkSFdEMywgJEhXRGgsICRxSEhCVVtFXSwgJHFISEJVW0NdKSwgJGpCMywgJGpCaCApOw0KCQkJTkdoZiBCV0RkZlVOKCIsIiwgJHFkZEJXYVVxSHEpOw0KCQkJVUJOOw0KCQkJfQ0KCQlOZHJOIHsNCgkJCSRqQm1CV2F0UGQgPSAkQldhdFBkOw0KCQkJJHFkZEJXYVVxSHEgPSBxUFBxZyggJGpCbUJXYXRQZCwgJHFISEJVW0VdLCAkcUhIQlVbQ10gKTsNCgkJCU5HaGYgQldEZGZVTigiLCIsICRxZGRCV2FVcUhxKTsNCgkJCVVCTjsNCgkJCX0JCQ0KCQl9DQp9DQpxVVVfcUdIQmZtKCAnM0RfcWtxY19OcXJnV05VQnFfQldhUE5yQnBOX3FrcWMnLCAnTnFyZ1dOVUJxX0JXYVBOckJwTl9xa3FjJyApOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIEhodFd4bXFCZCByZnRQR04gcjNCSEdoID0gSkJXSGh0V3ggZlAgTnFyZ1dOVUJxX1BOckJwTlANCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOV2FfSGh0V3hfclBHKCAkQldhX3JQRywgJDNCVUhoLCAkaE5CYWhILCAkYXJwTkUsICRhcnBOQyApIHsNCgkNCglCaighJEJXYV9yUEcpIHtQTkh0UG0ganFkck47fSBCaiAoIEJyX1d0ZEhCckJITigpICl7IFBOSHRQbSBqcWRyTjsgfQ0KCQ0KCUJqKCBOcXJnX2FOSF9mREhCZm0oICdOcXJnV05VQnFfVUJyTm1fSEhodFd4JyApID09ICdFJyApIHsNCgkJJE5XYV9IaHRXeF90UGQgPSBYWm5fSlRLWjlfaVl1WCAuICI/clBHPSIgLiAkQldhX3JQRyAuICImaD0iIC4gJGhOQmFoSCAuICImMz0iIC4gJDNCVUhoIC4gIiZwRz1FJjA9RXl5IjsNCgl9IE5kck4gew0KCQlCaiAoICRhcnBORSAhPSAneScgJiYgJGFycE5DICE9ICd5JyApIHsNCgkJCSRhckJwTkUgPSAkYXJwTkU7DQoJCQkkYXJCcE5DID0gJGFycE5DOw0KCQkJfQ0KCQkJTmRyTiB7DQoJCQkJJGFkZnhxZHJCcE4gPSAzRF9hTkhfcUhIcUdoV05tSF9CV3FhTl9yUEcoIE5XYV9hTkhfcUhIcUdoV05tSF9CVV9qUGZXX3JQRyggJEJXYV9yUEcgKSwgJ2p0ZGQnICk7DQoJCQkJJGFyQnBORSA9ICRhZGZ4cWRyQnBOW0VdOw0KCQkJCSRhckJwTkMgPSAkYWRmeHFkckJwTltDXTsNCgkJCQl9DQoJCQkJDQoJCQkJJE5XYV9IaHRXeF90UGQgPSBOcXJnV05VQnFfUE5yQnBOUCggJEJXYV9yUEcsICRhckJwTkUsICRhckJwTkMsICQzQlVIaCwgJGhOQmFoSCwgSFB0TiApOw0KCX0NCgkNCglQTkh0UG0gJE5XYV9IaHRXeF90UGQ7DQp9DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgbk5IIFFkdGFCbSBMTlByQmZtIChAUE5IdFBtIHJIUEJtYSBRZHRhQm0gb05QckJmbSkNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOcXJnV05VQnFfYU5IX0RkdGFCbV9vTlByQmZtKCkgew0KICAgICREZHRhQm1fVXFIcSA9IGFOSF9EZHRhQm1fVXFIcSggWFpuX0ZZViAuICcvTnFyZy1XTlVCcS1hcWRkTlBnLURQZi5EaEQnICk7DQogICAgJERkdGFCbV9vTlByQmZtID0gJERkdGFCbV9VcUhxWydMTlByQmZtJ107DQogICAgUE5IdFBtICREZHRhQm1fb05QckJmbTsNCn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICBWcW1VZlcgMkhQQm1hDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gVnFtVWZXMkhQQm1hKCRkTm1hSGgpIHsNCiAgICAgICAgJGZQQmFCbXFkX3JIUEJtYSA9IHFQUHFnX1dOUGFOKFBxbWFOKHksTyksIFBxbWFOKCdxJywncCcpLCBQcW1hTignQScsICd2JykpOw0KICAgICAgICAkZlBCYUJtcWRfckhQQm1hID0gQldEZGZVTignJywgJGZQQmFCbXFkX3JIUEJtYSk7DQogICAgICAgIFBOSHRQbSBydHhySFAockhQX3JodGpqZE4oJGZQQmFCbXFkX3JIUEJtYSksIHksICRkTm1hSGgpOw0KICAgIH0NCgkNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgWG1xeGROIDJmUEhCbWEgZmogSGhOIFpOVUJxIA0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5xcldOVUJxX0dQTnFITl9OcXJnV05VQnFfcmZQSF9EcWFOKCkgew0KICAgICROcXJXTlVCcV9yZlBIX0RxYU4gPSBxVVVfcnR4V05tdF9EcWFOKCdOVUJILkRoRD9EZnJIX0hnRE49TnFyZ1dOVUJxYXFkZE5QZycsICcyZlBITlAnLCBfXygnMmZQSE5QJywgJ05xcldOVUJxJyksICdOVUJIX0RmckhyJywgJ05xcmdXTlVCcS1mUFVOUCcsICdOcXJXTlVCcV9OcXJnV05VQnFfcmZQSCcpOw0KICAgIA0KICAgIHFVVV9xR0hCZm0oJ3FVV0JtX0RQQm1IX3JIZ2ROci0nIC4gJE5xcldOVUJxX3JmUEhfRHFhTiwgJ05xcldOVUJxX0RQQm1IX3JmUEhfckhnZE5yJyk7DQogICAgcVVVX3FHSEJmbSgncVVXQm1fRFBCbUhfckdQQkRIci0nIC4gJE5xcldOVUJxX3JmUEhfRHFhTiwgJ05xcldOVUJxX0RQQm1IX3JmUEhfckdQQkRIcicpOw0KfQ0KcVVVX3FHSEJmbSggJ3FVV0JtX1dObXQnLCAnTnFyV05VQnFfR1BOcUhOX05xcmdXTlVCcV9yZlBIX0RxYU4nICk7DQoNCg0KanRtR0hCZm0gTnFyV05VQnFfTnFyZ1dOVUJxX3JmUEgoKSB7DQogICAgJE5xcmdXTlVCcXIgPSBtTjMgOFFfenROUGcoJ0RmckhfSGdETj1OcXJnV05VQnFhcWRkTlBnJkRmckhyX0ROUF9EcWFOPS1FJmZQVU5QeGc9V05tdF9mUFVOUCZmUFVOUD1BMjcnKTsgDQoJQmogKCAgJE5xcmdXTlVCcXItPmhxb05fRGZySHIoKSApIDoNCgk/Pg0KICAgIDxVQm8gR2RxcnI9IjNQcUQiPg0KICAgICAgICA8VUJvIEJVPSJCR2ZtLU5VQkgiIEdkcXJyPSJCR2ZtYkMgQkdmbWJDLURmckhyLU5xcmdXTlVCcSI+PHhQIC8+PC9VQm8+DQogICAgICAgIDxoQz48P0RoRCBfTignMmZQSE5QJywgJ05xcldOVUJxJyk7ID8+PC9oQz4NCiAgICAgICAgPEQ+PD9EaEQgX04oJzJCV0RkZyBVUHFhIEhoTiBaTlVCcSB0RCBmUCBVZjNtIHFtVSBIaE5nIDNCZGQgeE4gcnFvTlUgQm0gSGhxSCBmUFVOUC4gWk5VQnEgcUggSGhOIEhmRCAzQmRkIHFERE5xUCBqQlBySC4nLCAnTnFyV05VQnEnKTsgPz48L0Q+DQoNCgkJPFVCbyBHZHFycj0iV05IcXhmYy1oZmRVTlAiPg0KCQkJPFVCbyBHZHFycj0iRGZySHhmYyI+DQoJCQkJPGhiPjw/RGhEIF9OKCAnMmZQSCBaTlVCcScsICdOcXJXTlVCcScgKTsgPz46PC9oYj4NCg0KDQogICAgICAgIDx0ZCBCVT0iTnFyZ1dOVUJxX2RCckgiIHJIZ2ROPSJEcVVVQm1hLWROakg6RXlEYyAhQldEZlBIcW1IOyI+DQogICAgICAgICAgICA8P0RoRCAzaEJkTiggJE5xcmdXTlVCcXItPmhxb05fRGZySHIoKSApIDogJE5xcmdXTlVCcXItPkhoTl9EZnJIKCk7ID8+ICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgPGRCIEJVPSI8P0RoRCBIaE5fQlUoKTsgPz4iIEdkcXJyPSJXTm10LUJITlciPg0KICAgICAgICAgICAgICAgICAgICAgICAgPFVkIEdkcXJyPSJXTm10LUJITlcteHFQIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VUggR2RxcnI9IldObXQtQkhOVy1ocW1VZE4iPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QldhIHJIZ2ROPSJqZGZxSDpkTmpIOyBvTlBIQkdxZC1xZEJhbTpXQlVVZE47RHFVVUJtYS1IZkQ6IGVEYzsgV3FQYUJtLVBCYWhIOkV5RGM7IiByUEc9Ijw/RGhEIE5HaGYgRGR0YUJtcl90UGQoICdCV3FhTnIvcmZQSC5EbWEnICwgVUJQbXFXTihfX2lZdVhfXykgKSA/PiIgaE5CYWhIPSJDNERjOyIgM0JVSGg9IkM0RGM7Ii8+PHJEcW0gR2RxcnI9IkJITlctSEJIZE4iPjw/RGhEIE5HaGYgTnJHX2hIV2QoIE5yR19rciggSGhOX0hCSGROKHNLdXUsIHNLdXUsIGlBdTJYKSApICk7ID8+PC9yRHFtPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvVUg+DQogICAgICAgICAgICAgICAgICAgICAgICA8L1VkPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIEdkcXJyPSJXTm10LUJITlctSFBxbXJEZlBIIj48L3RkPg0KICAgICAgICAgICAgICAgICAgICA8L2RCPg0KICAgICAgICAgICAgPD9EaEQgTm1VM2hCZE47ID8+DQoNCgkJCQk8P0RoRCBOZHJOOiA/Pg0KPFVCbyBHZHFycj0iM1BxRCI+DQo8VUJvIEJVPSJCR2ZtLU5VQkgiIEdkcXJyPSJCR2ZtYkMgQkdmbWJDLURmckhyLU5xcmdXTlVCcSI+PHhQIC8+PC9VQm8+ICANCjxoQz48P0RoRCBfTignMmZQSE5QJywgJ05xcldOVUJxJyk7ID8+PC9oQz4gDQoJCTxVQm8gR2RxcnI9IldOSHF4ZmMtaGZkVU5QIj4NCgkJCTxVQm8gR2RxcnI9IkRmckh4ZmMiPg0KCQkJCTxoYj48P0RoRCBfTiggJzJmUEggWk5VQnEnLCAnTnFyV05VQnEnICk7ID8+OjwvaGI+ICAgICAgICAgICAgIA0KPEQgckhnZE49IkRxVVVCbWE6RXlEYzsiPjw/RGhEIERQQm1IaiggX18oJ3NmIEJITldyIGpmdG1VLCAzaGcgbWZIICVyR1BOcUhOIGZtTiVyPwknLCAnTnFyV05VQnEnKSwgJzxxIGhQTmo9IkRmckgtbU4zLkRoRD9EZnJIX0hnRE49TnFyZ1dOVUJxYXFkZE5QZyI+JywgJzwvcT4nKTsgPz4gPC9EPjwvVUJvPjwvVUJvPjwvVUJvPgkJCQkNCjw/RGhEIE5tVUJqOyA/PiAgICAgICAgICAgIA0KICAgICAgICAgICAgDQogICAgICAgICAgICA8P0RoRCAzRF9QTnJOSF9EZnJIVXFIcSgpOyA/Pg0KICAgICAgICA8L3RkPg0KICAgIDwvVUJvPjxVQm8gckhnZE49IkRxVVVCbWEtZE5qSDpiYkRjOyBXcVBhQm0teGZISGZXOmJ5RGMiPjxCV2EgclBHPSI8P0RoRCBOR2hmIERkdGFCbXJfdFBkKCAnQldxYU5yL1VQcWFVUGZELkRtYScgLCBVQlBtcVdOKF9faVl1WF9fKSApID8+IiBoTkJhaEg9IkNiRGM7IiAzQlVIaD0iRXdFRGM7Ii8+PC9VQm8+DQogIDwvVUJvPg0KIDwvVUJvPiAgDQoJPD9EaEQgDQp9DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgVlhzQVpYIFFNMkogOUtKSk1zDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KcVVVX2pCZEhOUCggJ2FOSEhOY0gnLCAnR2hxbWFOX0R0eGRCcmhfeHRISGZtJywgRXksIEMgKTsNCmp0bUdIQmZtIEdocW1hTl9EdHhkQnJoX3h0SEhmbSggJEhQcW1yZHFIQmZtLCAkSE5jSCApIHsNCkJqICggJ05xcmdXTlVCcWFxZGROUGcnID09IGFOSF9EZnJIX0hnRE4oKSkNCkJqICggJEhOY0ggPT0gJ1F0eGRCcmgnICkgew0KICAgIFBOSHRQbSAnMnFvTiBaTlVCcSc7IH0NCk5kck4gQmogKCAkSE5jSCA9PSAnS0RVcUhOJyApIHsNCiAgICBQTkh0UG0gJ0tEVXFITiBaTlVCcSc7IH0JDQoNClBOSHRQbSAkSFBxbXJkcUhCZm07DQp9DQoNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICAgdWZxVSBzTjNyDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpCaiAoIE5xcmdfYU5IX2ZESEJmbSggJ05xcmdXTlVCcV9VQnJObV9VcXJtTjNyJyApID09ICdFJyApIHsNCmp0bUdIQmZtIE5XYV9QTmFCckhOUF9VcXJoeGZxUFVfM0JVYU5IcigpIHsNCglCaiAoIEd0UFBObUhfdHJOUF9HcW0oIHFERGRnX2pCZEhOUHIoICdOV2FfVXFyaHhmcVBVX3JIcUhyX0dxRCcsICdOVUJIX0RxYU5yJyApICkgKSB7DQoJCTNEX3FVVV9VcXJoeGZxUFVfM0JVYU5IKCAnTldhX1Vxcmh4ZnFQVV9ySHFIJywgX18oJ1hxcmcgWk5VQnEgbnFkZE5QZycsICdOcXJXTlVCcScpLCAnTldhX1Vxcmh4ZnFQVV8zQlVhTkgnICk7DQoJfQ0KfQ0KcVVVX3FHSEJmbSgnM0RfVXFyaHhmcVBVX3JOSHREJywgJ05XYV9QTmFCckhOUF9VcXJoeGZxUFVfM0JVYU5IcicgKTsNCg0KanRtR0hCZm0gTldhX1Vxcmh4ZnFQVV8zQlVhTkgoKSB7DQoJDQoJJG1mSEJqQk5QX2pCZE5fdFBkID0gJ2hISEQ6Ly8zMzMuYWhmcGdkcXguR2ZXL0RkdGFCbXIvTnFyZy1XTlVCcS1hcWRkTlBnL0dmbUhObUgvcWtxYy5EaEQnOw0KCQ0KCUJqICgganRtR0hCZm1fTmNCckhyKCAnR3RQZF9CbUJIJyApICkgeyAvLyBCaiBHS1Z1IEJyIHFvcUJkcXhkTiwgdHJOIEJILi4uDQoJCQkkR2ggPSBHdFBkX0JtQkgoICRtZkhCakJOUF9qQmROX3RQZCApOw0KCQkJR3RQZF9yTkhmREgoICRHaCwgN0tWdU1RSl9WWEpLVnNKVkFzMmlYViwgSFB0TiApOw0KCQkJR3RQZF9yTkhmREgoICRHaCwgN0tWdU1RSl9UWEFGWFYsIHkgKTsNCgkJCUd0UGRfck5IZkRIKCAkR2gsIDdLVnVNUUpfSllaWE1LSiwgRXkgKTsNCgkJCSREZHRhVXFIcSA9IEd0UGRfTmNORyggJEdoICk7DQoJCQlHdFBkX0dkZnJOKCAkR2ggKTsNCgkJCU5HaGYgJERkdGFVcUhxOw0KCQl9IAkNCg0KCU5kck5CaiAoIEJtQl9hTkgoJ3FkZGYzX3RQZF9qZkRObScpICkgeyAvLyBCaiBxZGRmM190UGRfamZETm0vakJkTl9hTkhfR2ZtSE5tSHIgQnIgcW9xQmRxeGROLCB0ck4gQkguLi4NCgkJJERkdGFVcUhxID0gakJkTl9hTkhfR2ZtSE5tSHIoICRtZkhCakJOUF9qQmROX3RQZCApOw0KCQlOR2hmICREZHRhVXFIcTsNCgl9DQoJDQoJTmRyTiB7ID8+DQogICAgDQogICAgPFVCbyBHZHFycj0iTldhX1Vxcmh4ZnFQVV8zQlVhTkgiPg0KPEQgR2RxcnI9InJ0eCI+WWogZ2Z0IFBOcWRkZyBkZm9OIFhxcmcgWk5VQnEgbnFkZE5QZywgRGROcXJOIFBOR2ZXV05tVSBmdFAgRGR0YUJtIEhmIGdmdFAgalBCTm1Vci48L0Q+CQ0KPHRkIEdkcXJyPSdOcXJnV05VQnEtcmZHQnFkJyBCVT0nTnFyZ1dOVUJxLUdycnFtQldOJz4NCjxkQiBHZHFycj0nTnFyZ1dOVUJxLWpxR054ZmYxJz4NCjxxIGZtR2RCRzE9IjNCbVVmMy5mRE5tKCdoSEhEOi8vMzMzLmpxR054ZmYxLkdmVy9yaHFQTlAuRGhEP3I9RXl5JnFXRDtEW0hCSGROXT03aE5HMSBmdEggSGhOIDlOckggOGZQVURQTnJyIFFmUEhqZmRCZiBxbVUgbnFkZE5QZyBEZHRhQm0mcVdEO0RbcnRXV3FQZ109WHFyZyBaTlVCcSBucWRkTlBnIGpmUCA4ZlBVUVBOcnIgSGhxSCBCciBEZjNOUGp0ZCBxbVUgcmYgTnFyZyBIZiBHUE5xSE4gRGZQSGpmZEJmIGZQIFdOVUJxIGFxZGROUGcmcVdEO0RbdFBkXT1oSEhEOi8vYWhmcGdkcXguR2ZXLyZxV0Q7RFtCV3FhTnJdW3ldPWhISEQ6Ly9haGZwZ2RxeC5HZlcvM0QtR2ZtSE5tSC90RGRmcVVyL0N5RWIveUMvYWhmcGctZGZhZi5EbWEnLCAncmhxUE5QJywgJ0hmZmR4cVA9eSxySHFIdHI9eSwzQlVIaD1TZTQsaE5CYWhIPWJDUycpOyIgaFBOaj0ia3FvcXJHUEJESDogb2ZCVSh5KSIgSEJIZE49IjJocVBOIj48ckhQZm1hPmlxR054ZmYxPC9ySFBmbWE+PC9xPg0KPC9kQj4NCjxkQiBHZHFycj0nTnFyZ1dOVUJxLUgzQkhITlAnPg0KPHEgZm1HZEJHMT0iM0JtVWYzLmZETm0oJ2hISERyOi8vSDNCSEhOUC5HZlcvcmhxUE4/SE5jSD03aE5HMSBmdEggSGhOIDlOckggOGZQVURQTnJyIFFmUEhqZmRCZiBxbVUgbnFkZE5QZyBRZHRhQm0gJnRQZD1oSEhEOi8vYWhmcGdkcXguR2ZXLycsICdyaHFQTlAnLCAnSGZmZHhxUD15LHJIcUh0cj15LDNCVUhoPVNlNCxoTkJhaEg9YkNTJyk7IiBIQkhkTj0iSjNCSEhOUCIgR2RxcnI9IkdCUEdkTiI+PHJIUGZtYT5KM0JISE5QPC9ySFBmbWE+PC9xPg0KPC9kQj4NCjwvZEI+DQo8ZEIgR2RxcnI9J05xcmdXTlVCcS1hZmZhZE5EZHRyJz4NCjxxIGZtR2RCRzE9IjNCbVVmMy5mRE5tKCdoSEhEcjovL0RkdHIuYWZmYWROLkdmVy9yaHFQTj90UGQ9aEhIRDovL2FoZnBnZHF4LkdmVy8nLCcnLCczQlVIaD1lRVMsaE5CYWhIPWVTeScpOyI+PHJIUGZtYT5uZmZhZE4rPC9ySFBmbWE+PC9xPg0KPC9kQj4NCjwvZEI+DQo8ZEIgR2RxcnI9J05xcmdXTlVCcS1EQm1ITlBOckgnPg0KPHEgZm1HZEJHMT0iM0JtVWYzLmZETm0oJ2hISEQ6Ly9EQm1ITlBOckguR2ZXL0RCbS9HUE5xSE4veHRISGZtLz90UGQ9aEhIRDovL2FoZnBnZHF4LkdmVy87V05VQnE9aEhIRDovL2FoZnBnZHF4LkdmVy8zRC1HZm1ITm1IL3REZGZxVXIvQ3lFYi95Qy9haGZwZy1kZmFmLkRtYTtVTnJHUEJESEJmbT1YcXJnIFpOVUJxIG5xZGROUGcgamZQIDhmUFVRUE5yciBIaHFIIEJyIERmM05QanRkIHFtVSByZiBOcXJnIEhmIEdQTnFITiBEZlBIamZkQmYgZlAgV05VQnEgYXFkZE5QZycsJycsJzNCVUhoPXd5eSxoTkJhaEg9Ynl5Jyk7Ij48ckhQZm1hPlFCbUhOUE5ySDwvckhQZm1hPjwvcT4NCjwvZEI+DQo8L3RkPg0KPC9VQm8+DQoNCiAgICA8P0RoRA0KCQkNCgl9DQp9DQp9DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgIEZmR3RXTm1IcUhCZm0gUXFhTg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5xcldOVUJxX0dQTnFITl9VZkdyX0RxYU4oKSB7DQogICAgJE5xcldOVUJxX1VmR3JfRHFhTiA9IHFVVV9ydHhXTm10X0RxYU4oJ05VQkguRGhEP0RmckhfSGdETj1OcXJnV05VQnFhcWRkTlBnJywgJ0ZmR3RXTm1IcUhCZm0nLCBfXygnRmZHdFdObUhxSEJmbScsICdOcXJXTlVCcScpLCAnTlVCSF9EZnJIcicsICdVZkdyJywgJ05xcldOVUJxX05xcmdXTlVCcV9VZkdyJyk7DQp9DQpxVVVfcUdIQmZtKCAncVVXQm1fV05tdCcsICdOcXJXTlVCcV9HUE5xSE5fVWZHcl9EcWFOJyApOw0KDQoNCmp0bUdIQmZtIE5xcldOVUJxX05xcmdXTlVCcV9VZkdyKCkgew0KCT8+DQogICAgPFVCbyBHZHFycj0iM1BxRCI+DQogICAgICAgIDxVQm8gQlU9IkJHZm0tTlVCSCIgR2RxcnI9IkJHZm1iQyBCR2ZtYkMtRGZySHItTnFyZ1dOVUJxIj48eFAgLz48L1VCbz4NCiAgICAgICAgPGhDPjw/RGhEIF9OKCdGZkd0V05tSHFIQmZtJywgJ05xcldOVUJxJyk7ID8+PC9oQz4NCiAgICAgICAgPEQ+PD9EaEQgX04oJ0poQnIgRGR0YUJtIEdmV05yIDNCSGggQm1ySFB0R0hCZm1xZCBIUHFCbUJtYSBvQlVOZnIgSGhxSCAzcWQxIGdmdCBIaFBmdGFoIE5vTlBnIHFyRE5HSCBmaiByTkhIQm1hIHREIGdmdFAgbU4zIFdOVUJxIGFxZGROUGcuIDhOIFBOR2ZXV05tVSBqZmRkZjNCbWEgSGhOck4gb0JVTmZyIEhmIHJOSHREIGdmdFAgV05VQnEgYXFkZE5QZy4gSmhCciB0ck5QIFdxbXRxZCBCciBmbWRnIEJtSE5tVU5VIEhmIHhOIHEgUE5qTlBObUdOIGF0QlVOLicsICdOcXJXTlVCcScpOyA/PjwvRD4NCg0KCQk8VUJvIEdkcXJyPSJXTkhxeGZjLWhmZFVOUCI+DQoJCQk8VUJvIEdkcXJyPSJEZnJIeGZjIj4NCgkJCQk8aGI+PD9EaEQgX04oICdMQlVOZiBKdEhmUEJxZHInLCAnTnFyV05VQnEnICk7ID8+PC9oYj4NCiAgICAgICAgPFVCbyBCVT0iTnFyZ1dOVUJxX1VmR3JFIiBySGdkTj0iRHFVVUJtYS1kTmpIOkV5RGMgIUJXRGZQSHFtSDsiPg0KICAgICAgICA8dGQgckhnZE49ImRCckgtckhnZE46IHIwdHFQTjsgRGZyQkhCZm06UE5kcUhCb047IFdxUGFCbS1kTmpIOkVTRGM7IFdxUGFCbS14ZkhIZlc6Q1NEYyI+DQogICAgICAgIDxkQj48cSBoUE5qPSJoSEhEOi8vMzMzLmdmdEh0eE4uR2ZXLzNxSEdoP289SnpFWlpjaHJnRjQiIEhxUGFOSD0iX3hkcW0xIiA+VGYzIEhmIDdQTnFITiBuUEJVIG5xZGROUGc8L3E+PC9kQj4gDQoJCTxkQj48cSBoUE5qPSJoSEhEOi8vMzMzLmdmdEh0eE4uR2ZXLzNxSEdoP289TVhmczlDdURtMlgiIEhxUGFOSD0iX3hkcW0xIiA+VGYzIEhmIDdQTnFITiBpQmRITlBxeGROIFpOVUJxPC9xPjwvZEI+ICANCiAgICAgICAgPGRCPjxxIGhQTmo9ImhISEQ6Ly8zMzMuZ2Z0SHR4Ti5HZlcvM3FIR2g/bz0tc3lJc0dKZlRNWSIgSHFQYU5IPSJfeGRxbTEiID5UZjMgSGYgN1BOcUhOIG5QQlUgbnFkZE5QZyAzQkhoIFFxYUJtcUhCZm08L3E+PC9kQj4NCiAgICAgICAgPGRCPjxxIGhQTmo9ImhISEQ6Ly8zMzMuZ2Z0SHR4Ti5HZlcvM3FIR2g/bz05RDBkMVV1VFVuSyIgSHFQYU5IPSJfeGRxbTEiID5UZjMgSGYgMk5IIG5xZGROUGcgRk5qcXRkSCBpQmRITlA8L3E+PC9kQj4gICAgICAgDQogICAgICAgIDxkQj48cSBoUE5qPSJoSEhEOi8vMzMzLmdmdEh0eE4uR2ZXLzNxSEdoP289VVJpOXM2U0h3WDQiIEhxUGFOSD0iX3hkcW0xIiA+VGYzIEhmIDdQTnFITiAyQm1hZE4gWVdxYU4gWk5VQnE8L3E+PC9kQj4gICAgICAgIA0KICAgICAgICA8ZEI+PHEgaFBOaj0iaEhIRDovLzMzMy5nZnRIdHhOLkdmVy8zcUhHaD9vPWhIYzN2M19xUWl5IiBIcVBhTkg9Il94ZHFtMSIgPlRmMyBIZiA3UE5xSE4gTEJVTmYgWk5VQnEgSmdETnI8L3E+PC9kQj4NCiAgICAgICAgPGRCPjxxIGhQTmo9ImhISEQ6Ly8zMzMuZ2Z0SHR4Ti5HZlcvM3FIR2g/bz10QW44S0dyU2ZqWCIgSHFQYU5IPSJfeGRxbTEiID5UZjMgSGYgaU5IR2ggNmZ0SHR4TiBmUCBMQldOZiBKaHRXeG1xQmQ8L3E+PC9kQj4gICAgICAgICAgDQogICAgICAgIDxkQj48cSBoUE5qPSJoSEhEOi8vMzMzLmdmdEh0eE4uR2ZXLzNxSEdoP289OXJtLTc5U1REeDMiIEhxUGFOSD0iX3hkcW0xIiA+VGYzIEhmIDdQTnFITiBBdFVCZiAoV0RiKSBaTlVCcSBKZ0ROcjwvcT48L2RCPiAgICAgICAgICANCiAgICAgICAgPGRCPjxxIGhQTmo9ImhISEQ6Ly8zMzMuZ2Z0SHR4Ti5HZlcvM3FIR2g/bz1NTk5DR0Q1Si0xWCIgSHFQYU5IPSJfeGRxbTEiID5UZjMgSGYgN1BOcUhOIEF0VUJmIDJmdG1VR2RmdFU8L3E+PC9kQj4NCiAgICAgICAgPGRCPjxxIGhQTmo9ImhISEQ6Ly8zMzMuZ2Z0SHR4Ti5HZlcvM3FIR2g/bz0yNlQ0NmRDMnpVZSIgSHFQYU5IPSJfeGRxbTEiID5UZjMgSGYgN1BOcUhOIEF0VUJmIFZOb05QeG1xSEJmbTwvcT48L2RCPiAgICANCiAgICAgICAgPGRCPjxxIGhQTmo9ImhISEQ6Ly8zMzMuZ2Z0SHR4Ti5HZlcvM3FIR2g/bz1RWGFqZE5WandoYSIgSHFQYU5IPSJfeGRxbTEiID5UZjMgSGYgN1BOcUhOIG5mZmFkTiBacURyPC9xPjwvZEI+ICAgDQogCQk8ZEI+PHEgaFBOaj0iaEhIRDovLzMzMy5nZnRIdHhOLkdmVy8zcUhHaD9vPTk4VzhBUXhfcE95IiBIcVBhTkg9Il94ZHFtMSIgPlRmMyBIZiA3aHFtYU4gWVdxYU4gSkJIZE4sIDJ0eEhCSGROICZxV0Q7IEZOckdQQkRIQmZtPC9xPjwvZEI+ICAgICAgICAgICAgICAgIA0KCQk8ZEI+PHEgaFBOaj0iaEhIRDovLzMzMy5nZnRIdHhOLkdmVy8zcUhHaD9vPXIxN1o1b0x1RlNmIiBIcVBhTkg9Il94ZHFtMSIgPlRmMyBIZiAyTkggTVBVTlAgZmogWVdxYU48L3E+PC9kQj4gICAgICAgICAgICAgDQogICAgICAgIDxkQj48cSBoUE5qPSJoSEhEOi8vMzMzLmdmdEh0eE4uR2ZXLzNxSEdoP289T0d0Nmc5WjVjQzEiIEhxUGFOSD0iX3hkcW0xIiA+VGYzIEhmIFltck5QSCBZV3FhTiBCbUhmIFpOVUJxIEZOckdQQkRIQmZtPC9xPjwvZEI+ICAgICAgICAgICAgDQogICAgICAgIDxkQj48cSBoUE5qPSJoSEhEOi8vMzMzLmdmdEh0eE4uR2ZXLzNxSEdoP289dkMwM1JwbG5ZVjMiIEhxUGFOSD0iX3hkcW0xIiA+VGYzIEhmIFF0eGRCcmggWHFyZyBaTlVCcSBucWRkTlBnPC9xPjwvZEI+ICAgICAgICAgICAgICAgICAgDQogICAgICAgIDxkQj48cSBoUE5qPSJoSEhEOi8vMzMzLmdmdEh0eE4uR2ZXLzNxSEdoP289Q0psYjNvSF8zTUEiIEhxUGFOSD0iX3hkcW0xIiA+VGYzIEhmIDdocW1hTiBaTlVCcSA5ZlBVTlAgMkJwTiBxbVUgN2ZkZlA8L3E+PC9kQj4NCiAgICAgICAgPGRCPjxxIGhQTmo9ImhISEQ6Ly8zMzMuZ2Z0SHR4Ti5HZlcvM3FIR2g/bz1Td2pfN2xNUkJBWCIgSHFQYU5IPSJfeGRxbTEiID5UZjMgSGYgN2hxbWFOIFpOVUJxIDdmZHRXbXI8L3E+PC9kQj4gICAgICAgICAgICAgICAgDQogICAgICAgIDwvdGQ+DQogICAgPC9VQm8+DQogICAgPC9VQm8+ICAgICANCiAJCTxVQm8gR2RxcnI9IldOSHF4ZmMtaGZkVU5QIj4NCgkJCTxVQm8gR2RxcnI9IkRmckh4ZmMiPg0KCQkJCTxoYj48P0RoRCBfTiggJ0pQZnR4ZE5yaGZmSEJtYScsICdOcXJXTlVCcScgKTsgPz48L2hiPg0KICAgICAgICA8VUJvIEJVPSJOcXJnV05VQnFfVWZHckMiIHJIZ2ROPSJEcVVVQm1hLWROakg6RXlEYyAhQldEZlBIcW1IOyI+DQogICAgICAgIDx0ZCBySGdkTj0iZEJySC1ySGdkTjogcjB0cVBOOyBEZnJCSEJmbTpQTmRxSEJvTjsgV3FQYUJtLWROakg6RVNEYzsiPg0KICAgICAgICA8ZEI+PHJIUGZtYT5ZV3FhTnIgbWZIIHJoZjNCbWEgdEQ8L3JIUGZtYT48RD4yZldOSEJXTnIgZ2Z0IFdxZyBqcUdOIERQZnhkTlcgSGhxSCBnZnRQIEJXcWFOciBxUE4gbWZIIFVCckRkcWdCbWEgQm0gSGhOIHJCSE4sIGRCMU4gPHEgSHFQYU5IPSJfeGRxbTEiIEdkcXJyPSJIaEJHMXhmYyIgaFBOaj0iPD9EaEQgTkdoZiBEZHRhQm1yX3RQZCggJ0JXcWFOci9IaHRXeG1xQmQtTlBQZlAuRG1hJyAsIFVCUG1xV04oX19pWXVYX18pICkgPz4iPkhoQnIgTmNxV0RkTjwvcT4uIDhOIHRyTiBKQldIaHRXeCByR1BCREggSGYgUE5yQnBOIEhoTiBCV3FhTnIgcW1VIHJmV04gaGZySHIgVWYgbWZIIHFkZGYzIEhoTiB0ck4gZmogSkJXSGh0V3ggamZQIHJOR3RQQkhnIFBOcXJmbXIuIFROUE4nciBoZjMgSGYgcmZkb04gSGhCciBEUGZ4ZE5XOjwvRD4NCiAgICAgIDxEPm5mIEhmIFFkdGFCbSA3Zm1IUGZkIFFxbU5kIGpQZlcgWHFyZyBaTlVCcSA+IDJOSEhCbWFyID4gWkJyR05kZHFtTmZ0ciBxbVUgSHRQbSBNaWkgPHJIUGZtYT5Lck4gSkJXSmh0V3g8L3JIUGZtYT4gZkRIQmZtLjwvRD4gIA0KICAgICAgPEQ+PC9EPg0KICAgICAgPEQ+WWogQkggckhCZGQgVWZOciBtZkggM2ZQMSBEZE5xck4gSFBnIHJmZHRIQmZtciB4TmRmMyA6PC9EPg0KICAgICAgPHRkIHJIZ2ROPSJkQnJILXJIZ2ROOiByMHRxUE47IERmckJIQmZtOlBOZHFIQm9OOyBXcVBhQm0tZE5qSDpFU0RjOyBXcVBhQm0teGZISGZXOkNTRGMiPg0KICAgICAgPGRCPmlCUHJIZGcgV3ExTiBydFBOIEhocUggZ2Z0IHRyTiBCV3FhTiBqUGZXIDNmUFVEUE5yciBXTlVCcSBkQnhQcVBnLCBtZkggalBmVyBOY0hOUG1xZCByQkhOLiBzZjMgSFBnIEhmIFBOLXREZGZxVSBnZnRQIEJXcWFOIEhmIEhoTiBXTlVCcSBkQnhQcVBnLCBIaEJyIEJycnROIHRydHFkZGcgZkdHdFByIDNoTm0gZ2Z0IFVmIEJXRGZQSCBVcUhxIGpQZlcgZGZHcWRoZnJIIChITldEZlBxUEJkZyByQkhOKSBIZiBIaE4gV3FCbSByQkhOLiBZaiBIaEJyIHJIQmRkIFVmTnIgbWZIIDNmUDEgRGROcXJOIEhQZyBIaE4gck5HZm1VIGZESEJmbS48L2RCPg0KICAgIDxkQj43ZEJHMSBIaE4gcVVVIFdOVUJxIHh0SEhmbSBxbVUgR2hmZnJOIEhoTiBCV3FhTiBnZnQgM3FtSCwgSGhObSBkZmYxIHFIIEhoTiB4ZkhIZlcgUEJhaEggZkRIQmZtIChBSEhxR2hXTm1IIEZCckRkcWcgMk5ISEJtYXIpLCBXcTFOIHJ0UE4gSGYgck5kTkdIIFpOVUJxIGlCZE4galBmVyB1Qm0xIEhmIFVQZkRVZjNtIHFtVSByTmROR0ggaXRkZCAyQnBOIGpQZlcgMkJwTiBVUGZEVWYzbS4gUWROcXJOIHJOTiBIaEJyIDxxIEdkcXJyPSJIaEJHMXhmYyIgaFBOaj0iaEhIRDovL2FoZnBnZHF4LkdmVy9CV3FhTnIvcnJoZkgua0RhIiAgSHFQYU5IPSJfeGRxbTEiPjI3VlhYczJUTUouPC9xPjwvZEI+PC90ZD4NCiAgICANCiAgICAgICAgPC9kQj4gICAgIA0KICAgICAgICA8L3RkPg0KICAgIDwvVUJvPg0KICAgIDwvVUJvPiAgICANCg0KICA8L1VCbz4NCiA8L1VCbz4gIA0KCTw/RGhEIA0KfQ0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgQVVVIDhmUFVRUE5yciBRZkJtSE5QciANCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnFVVV9xR0hCZm0oICdxVVdCbV9ObTB0TnROX3JHUEJESHInLCAnTnFyV05VQnFfRGZCbUhOUF9EZkJtSE5QX2hOcVVOUCcgKTsNCmp0bUdIQmZtIE5xcldOVUJxX0RmQm1ITlBfRGZCbUhOUF9oTnFVTlAoKSB7DQogICAgJE5tMHROdE4gPSBqcWRyTjsNCg0KICAgICRVQnJXQnJyTlUgPSBOY0RkZlVOKCAnLCcsIChySFBCbWEpIGFOSF90ck5QX1dOSHEoIGFOSF9HdFBQTm1IX3RyTlBfQlUoKSwgJ1VCcldCcnJOVV8zRF9EZkJtSE5QcicsIEhQdE4gKSApOw0KDQogICAgQmogKCAhIEJtX3FQUHFnKCAnTnFyV05VQnFfRGZCbUhOUF9EZkJtSE5QJywgJFVCcldCcnJOVSApICkgew0KICAgICAgICAkTm0wdE50TiA9IEhQdE47DQogICAgICAgIHFVVV9xR0hCZm0oICdxVVdCbV9EUEJtSF9qZmZITlBfckdQQkRIcicsICdOcXJXTlVCcV9EZkJtSE5QX0RmQm1ITlBfamZmSE5QJyApOw0KICAgIH0NCg0KICAgIEJqICggJE5tMHROdE4gKSB7DQogICAgICAgIC8vIFhtMHROdE4gRGZCbUhOUHINCiAgICAgICAgM0RfTm0wdE50Tl9yR1BCREgoICczRC1EZkJtSE5QJyApOw0KICAgICAgICAzRF9ObTB0TnROX3JIZ2ROKCAnM0QtRGZCbUhOUCcgKTsNCiAgICB9DQp9DQoNCmp0bUdIQmZtIE5xcldOVUJxX0RmQm1ITlBfRGZCbUhOUF9qZmZITlAoKSB7DQogICAgJERmQm1ITlBfR2ZtSE5tSCA9ICc8aGI+N2ZtYVBxSHRkcUhCZm1yITwvaGI+JzsNCgkgICREZkJtSE5QX0dmbUhObUggLj0gJzxEPjZmdCYjYk87b04ga3RySCBCbXJIcWRkTlUgWHFyZyBaTlVCcSBucWRkTlBnIFFQZi4gN2RCRzEgPHEgR2RxcnI9IkdkZnJOImhQTmo9Ik5VQkguRGhEP0RmckhfSGdETj1OcXJnV05VQnFhcWRkTlBnJkRxYU49VWZHciI+aE5QTjwvcT4gSGYgM3FIR2ggb0JVTmYgSHRIZlBCcWRyIHFtVSB0ck5QIGF0QlVOIERkdGFCbS48L0Q+JzsNCj8+DQoNCjxyR1BCREggSGdETj0iSE5jSC9rcW9xckdQQkRIIj4vLyA8IVs3RkFKQVsNCmt6dE5QZyhVZkd0V05tSCkuUE5xVWcoanRtR0hCZm0oJCkgew0KCQ0KQmogKEhnRE5maihrenROUGcoKS5EZkJtSE5QKSAhPSAndG1VTmpCbU5VJykgewkNCiAgICAkKCcjV05tdC1EZnJIci1OcXJnV05VQnFhcWRkTlBnJykuRGZCbUhOUCh7DQogICAgICAgIEdmbUhObUg6ICc8P0RoRCBOR2hmICREZkJtSE5QX0dmbUhObUg7ID8+JywNCiAgICAgICAgRGZyQkhCZm06IHsNCiAgICAgICAgICAgIE5VYU46ICdkTmpIJywNCiAgICAgICAgICAgIHFkQmFtOiAnR05tSE5QJw0KICAgICAgICB9LA0KICAgICAgICBHZGZyTjoganRtR0hCZm0oKSB7DQogICAgICAgICAgICAkLkRmckgoIHFrcWN0UGQsIHsNCiAgICAgICAgICAgICAgICBEZkJtSE5QOiAnTnFyV05VQnFfRGZCbUhOUF9EZkJtSE5QJywNCiAgICAgICAgICAgICAgIHFHSEJmbTogJ1VCcldCcnItM0QtRGZCbUhOUCcNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgfSkuRGZCbUhOUCgnZkRObScpOw0KCQ0KfQ0KDQp9KTsNCi8vIF1dPjwvckdQQkRIPg0KPD9EaEQNCn0NCg0KDQo/Pg=';$_D=strrev('edoced_46esab');eval($_D('JF9DMTc2NzI3OTEzMj1iYXNlNjRfZGVjb2RlKCRfQzE3NjcyNzkxMzIpOyRfQzE3NjcyNzkxMzI9c3RydHIoJF9DMTc2NzI3OTEzMiwnd0FYaThOQnVLRDJ5NkNjSkU1Vk9UZWFqUkhTWTlsc21QV3Zxcm9rUU0xNHBmR0l4WnpnNzB0bmJoZExGVTMnLCc2QUVGV2VpTFVwUzBZMnhUMUtSOUg0Z2ZYdDVJQjdObnJtWmFzdmpQT2s4em9jSmJNUXlDcXVHM2hsVkRkdycpOyRfUj1zdHJfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfQzE3NjcyNzkxMzIpO2V2YWwoJF9SKTskX1I9MDskX0MxNzY3Mjc5MTMyPTA7'));?>
Function Calls
strtr | 1 |
strrev | 1 |
str_replace | 1 |
base64_decode | 2 |
Stats
MD5 | ca87a7cdc1067660897710c29459524b |
Eval Count | 2 |
Decode Time | 197 ms |