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='Pz48P0RoRA0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t..
Decoded Output download
?><?php
/*-------------------------------------------------------------------------------*/
/* Get Control Panel Options
/*-------------------------------------------------------------------------------*/
function enoty_get_option( $name ){
$pnp_values = get_option( 'easynotify_opt' );
if ( is_array( $pnp_values ) && array_key_exists( $name, $pnp_values ) ) return $pnp_values[$name];
return false;
}
/*-------------------------------------------------------------------------------*/
/* Register CSS & JS ( ADMIN AREA )
/*-------------------------------------------------------------------------------*/
function easynotify_reg_script() {
wp_register_style( 'enoty-ui-themes-redmond', plugins_url( 'css/jquery/jquery-ui/themes/smoothness/jquery-ui-1.10.0.custom.min.css' , dirname('index.php') ), false, ENOTIFY_VERSION );
wp_register_style( 'enoty-multiselect-css', plugins_url( 'css/jquery/multiselect/jquery.multiselect.css' , dirname('index.php') ), false, ENOTIFY_VERSION );
wp_register_script( 'enoty-multi-sel', plugins_url( 'js/jquery/multiselect/jquery.multiselect.js' , dirname('index.php') ) );
wp_register_style( 'enoty-colorpicker', plugins_url( 'css/colorpicker.css' , dirname('index.php') ), false, ENOTIFY_VERSION );
wp_register_script( 'enoty-colorpickerjs', plugins_url( 'js/colorpicker/colorpicker.js' , dirname('index.php') ), false );
wp_register_script( 'enoty-eye', plugins_url( 'js/colorpicker/eye.js' , dirname('index.php') ), false );
wp_register_script( 'enoty-utils', plugins_url( 'js/colorpicker/utils.js' , dirname('index.php') ), false );
wp_register_script( 'enoty-cookie', plugins_url( 'js/jquery/jquery.cookie.js' , dirname('index.php') ), false );
wp_register_style( 'enoty-cpstyles', plugins_url( 'css/funcstyle.css' , dirname('index.php') ), false, ENOTIFY_VERSION, 'all');
wp_register_style( 'enoty-sldr', plugins_url( 'css/slider.css' , dirname('index.php') ), false, ENOTIFY_VERSION );
}
add_action( 'admin_init', 'easynotify_reg_script' );
/*-------------------------------------------------------------------------------*/
/* Register CSS & JS ( FRONT END )
/*-------------------------------------------------------------------------------*/
function easynotify_frontend_js() {
wp_register_script( 'enoty-enotybox-js', ENOTIFY_URL. '/js/enotybox/jquery.enotybox.js' );
wp_register_script( 'enoty-cookie-front', ENOTIFY_URL. '/js/jquery/jquery.cookie.js' );
wp_register_script( 'enoty-placeholder', ENOTIFY_URL. '/js/jquery/jquery.placeholder.js' );
wp_register_script( 'enoty-js', ENOTIFY_URL. '/js/easynotify.js' );
}
add_action( 'wp_enqueue_scripts', 'easynotify_frontend_js' );
/*-------------------------------------------------------------------------------*/
/* Load Control Panel & Metabox
/*-------------------------------------------------------------------------------*/
if ( is_admin() ){
include_once( ENOTIFY_DIR . '/layouts/enoty-preview.php' );
include_once( ENOTIFY_DIR . '/inc/enoty-options.php' );
include_once( ENOTIFY_DIR . '/inc/enoty-settings.php' );
include_once( ENOTIFY_DIR . '/inc/enoty-metaboxes.php' );
include_once( ENOTIFY_DIR . '/inc/functions/optin-handler/grab-lists.php' );
include_once( ENOTIFY_DIR . '/inc/functions/optin-handler/mailman/aweber/aweber_oauth.php' );
}
/*-------------------------------------------------------------------------------*/
/* Load Frontend
/*-------------------------------------------------------------------------------*/
include_once( ENOTIFY_DIR . '/inc/enoty-frontend.php' );
include_once( ENOTIFY_DIR . '/inc/enoty-shortcode.php' );
include_once( ENOTIFY_DIR . '/inc/functions/enoty-loader.php' );
include_once( ENOTIFY_DIR . '/inc/enoty-ribbon-generator.php' );
include_once( ENOTIFY_DIR . '/inc/functions/optin-handler/optin-handler.php' );
/*-------------------------------------------------------------------------------*/
/* Ajax Init
/*-------------------------------------------------------------------------------*/
add_action('wp_ajax_nopriv_easynotify_ajax_content', 'easynotify_ajax_content');
add_action('wp_ajax_easynotify_ajax_content', 'easynotify_ajax_content');
/*-------------------------------------------------------------------------------*/
/* CHECK BROWSER VERSION ( IE ONLY )
/*-------------------------------------------------------------------------------*/
function easynotify_check_browser_version_admin( $sid ) {
if ( is_admin() && get_post_type( $sid ) == 'easynotify' ){
preg_match( '/MSIE (.*?);/', $_SERVER['HTTP_USER_AGENT'], $matches );
if ( count( $matches )>1 ){
$version = explode(".", $matches[1]);
switch(true){
case ( $version[0] <= '8' ):
$msg = 'ie8';
break;
case ( $version[0] > '8' ):
$msg = 'gah';
break;
default:
}
return $msg;
} else {
$msg = 'notie';
return $msg;
}
}
}
/*-------------------------------------------------------------------------------*/
/* RENAME POST BUTTON
/*-------------------------------------------------------------------------------*/
add_filter( 'gettext', 'easynotify_publish_button', 10, 2 );
function easynotify_publish_button( $translation, $text ) {
if ( 'easynotify' == get_post_type())
if ( $text == 'Publish' ) {
return 'Save Notify'; }
else if ( $text == 'Update' ) {
return 'Update Notify'; }
return $translation;
}
/*-------------------------------------------------------------------------------*/
/* Get the pattern/layout list
/*-------------------------------------------------------------------------------*/
function easynotify_get_list( $list ) {
$lst = array();
$lst_list = scandir( ENOTIFY_DIR."/css/images/".$list );
foreach( $lst_list as $lst_name ) {
if ( $lst_name != '.' && $lst_name != '..' ) {
$lst[] = $lst_name;
}
}
return $lst;
}
/*-------------------------------------------------------------------------------*/
/* Strip current shortcode when using default notify
/*-------------------------------------------------------------------------------*/
function easynotify_strip_shortcode($code, $content){
global $shortcode_tags;
$stack = $shortcode_tags;
$shortcode_tags = array($code => 1);
$content = strip_shortcodes($content);
$shortcode_tags = $stack;
return $content;
}
/*-------------------------------------------------------------------------------*/
/* Generate Notify Script
/*-------------------------------------------------------------------------------*/
function easynotify_ajax_script( $id, $val ) {
$offect = explode("-", get_post_meta( $id, 'enoty_cp_open_effect', true ));
$cffect = explode("-", get_post_meta( $id, 'enoty_cp_close_effect', true ));
ob_start(); ?>
<script type="text/javascript">
jQuery(document).ready(function($) {
function easynotify_notify_loader() {
var notydata = {
action: "easynotify_ajax_content",
security: "<?php echo wp_create_nonce( "easynotify-nonce"); ?>",
notyid: <?php echo $id; ?>
};
jQuery.post("<?php echo admin_url('admin-ajax.php'); ?>", notydata, function(response) {
jQuery('#noty-<?php echo $id; ?>').append(response);
var timerId;
if(timerId != undefined){clearInterval(timerId);}
timerId = setInterval(function (){
jQuery('#launcher-<?php echo $id; ?>').easynotify({
type: 'inline',
maxWidth: '100%',
width: '<?php echo get_post_meta( $id, 'enoty_cp_thumbsize_tw', true ); ?>',
height: '<?php echo get_post_meta( $id, 'enoty_cp_thumbsize_th', true ); ?>',
padding : 0,
margin: [60, 60, 60, 60],
modal: false,
hideLoading : true,
openSpeed: 500,
closeSpeed: 500,
openEffect: '<?php echo $offect[1]; ?>',
closeEffect: '<?php echo $cffect[1]; ?>',
autoSize: false,
fitToView: false,
scrolling: 'no',
keys : {
close : null
},
helpers: {
overlay : {
closeClick : false,
locked : false
}
},
tpl: { /* Use this to change Notify skin*/
wrap:'<div class="enotybox-wrap"><div class="enotybox-skin enoty-custom-wrapper"><div class="enotybox-outer"><div class="enotybox-inner"></div></div><div class="isribbon enoty-ribbon-<?php echo get_post_meta( $id, 'enoty_cp_ribbon', true ); ?>"><?php switch ( trim( get_post_meta( $id, 'enoty_cp_ribbon_container', true ) ) ) {
case 'socialbutton':
easynotify_share_generator( $id, urlencode( $_SERVER['HTTP_REFERER'] ), $metaval = null );
break;
case 'optin':
easynotify_optin_generator( $id );
break;
case 'button':
easynotify_custom_button_generator( $id );
break;
default:
break;
} ?></div><?php easynotify_generate_footer_note( $id ); ?></div></div>'
},
afterLoad: function(){
clearInterval(timerId); // clear interval... it is
}
}).trigger("click");
}, <?php echo get_post_meta( $id, 'enoty_cp_notify_delay', true ); ?>000);
});
}
// COOKIE CONFIG
var check_cookie = jQuery.cookie('notify-<?php echo $id; ?>');
var ex_cookie = <?php echo get_post_meta( $id, 'enoty_cp_cookies', true ); ?>;
if (check_cookie == null || ex_cookie == '-1') {
easynotify_notify_loader();
} <?php $ckonset = get_post_meta( $id, 'enoty_cp_cookies', true ); if ( $ckonset != '-1' || $ckonset != '0' ) { ?>
jQuery.cookie('notify-<?php echo $id; ?>', 'true', {
expires: <?php echo get_post_meta( $id, 'enoty_cp_cookies', true ); ?>,
path: '/'
}); <?php } ?>
});
</script>
<?php
$contnt = ob_get_clean();
echo $contnt;
}
/*-------------------------------------------------------------------------------*/
/* Check License Status
/*-------------------------------------------------------------------------------*/
function easynotify_front_license_notify() {
echo '<div class="enoty-wrapper">
<div class="noty-content-wrap">
<div class="noty-content-center">
<div class="noty-popup-content" style="font-size:'.$data['maincontentfont'].' !important; color:'.$data['maincontentcol'].' !important;"><div class="enoty-license-logo-front"><img class="enotylicensekey" src="'.plugins_url( "images/key2-32x32.png" , dirname('index.php') ).'" width="32" height="32" alt="Activate License Key" /><span class="enotyactivatecheck">Please activate <strong>'.ENOTIFY_NAME.'</strong> licence key. You can activate <a href="'.admin_url( 'edit.php?post_type=easynotify&page=enoty-activation' ).'">'.__('here', 'easynotify').'</a></span></div></div>';
echo '</div></div></div>';
}
/*-------------------------------------------------------------------------------*/
/* Generate Notify Content
/*-------------------------------------------------------------------------------*/
function easynotify_ajax_content() {
if ( !isset( $_POST['notyid'] ) || !isset( $_POST['security'] ) ) {
die;
}
else {
check_ajax_referer( 'easynotify-nonce', 'security' );
$lyot = get_post_meta( $_POST['notyid'], 'enoty_cp_layoutmode', true );
$layout = preg_replace('/\.[^.\s]{3,4}$/', '', $lyot);
if ( $layout ) {
include_once( ENOTIFY_DIR . '/layouts/'.str_replace('_', '-', $layout ).'.php' );
$layoutfunc = $layout;
}
ob_start();
if ( easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_status', 'invalid' ) == 'invalid' ) {
easynotify_front_license_notify();
} else {
$layoutfunc( $_POST['notyid'] );
}
$contnt = ob_get_clean();
echo $contnt;
die;
}
}
/*-------------------------------------------------------------------------------*/
/* Get WP Info
/*-------------------------------------------------------------------------------*/
$easymemory = (int) ini_get('memory_limit');
$easymemory = empty($easymemory) ? __('N/A') : $easymemory . __(' MB');
function easynotify_get_wpinfo() {
// Get Site URL
$getwpinfo = array();
$getwpinfo[0] = "- Site URL : " .get_site_url();
// Get Multisite status
if ( is_multisite() ) { $getwpinfo[1] = '- WP Multisite : YES'; } else { $getwpinfo[1] = '- WP Multisite : NO'; }
global $wp_version, $easymemory;
echo "- WP Version : ".$wp_version."
";
echo $getwpinfo[0]."
";
echo $getwpinfo[1]."
";
echo "- Memory Limit : ".$easymemory."
";
$theme_name = wp_get_theme();
echo "- Active Theme : ".$theme_name->get('Name')."
";
echo "- Active Plugins :
";
// Get Active Plugin
if ( is_multisite() ) {
$the_plugs = get_site_option('active_sitewide_plugins');
foreach($the_plugs as $key => $value) {
$string = explode('/',$key);
$string[0] = str_replace( "-"," ",$string[0] );
echo " ".ucwords( $string[0] ) ."
";
}
} else {
$the_plugs = get_option('active_plugins');
foreach($the_plugs as $key => $value) {
$string = explode('/',$value);
$string[0] = str_replace( "-"," ",$string[0] );
echo " ".ucwords( $string[0] ) ."
";
}
}
}
/*-------------------------------------------------------------------------------*/
/* AJAX RESET SETTINGS
/*-------------------------------------------------------------------------------*/
function easynotify_cp_reset() {
check_ajax_referer( 'easynotify-nonce', 'security' );
if ( !isset( $_POST['cmd'] ) ) {
echo '0';
die;
}
else {
if ( $_POST['cmd'] == 'reset' ){
echo '1';
easynotify_restore_to_default($_POST['cmd']);
die;
}
}
}
add_action( 'wp_ajax_easynotify_cp_reset', 'easynotify_cp_reset' );
/*-------------------------------------------------------------------------------*/
/* Clear Cookies from Notify List
/*-------------------------------------------------------------------------------*/
function easynotify_enqueue_script_on_notify_list( ) {
global $post_type;
if( 'easynotify' == $post_type ) {
wp_enqueue_script( 'enoty-cookie' );
wp_enqueue_style( 'enoty-admin-styles', plugins_url('../css/admin.css' , 'index.php' ) );
?>
<script type="text/javascript">
jQuery(document).ready(function($) {
jQuery('.resetcookie').bind('click', function() {
jQuery.removeCookie(jQuery(this).attr('id'), { path: '/' });
alert("Successfully cleared this Notify cookies!");
});
});
</script>
<?php
}
}
if (is_admin()) {
add_action( 'admin_head', 'easynotify_enqueue_script_on_notify_list' );
}
/*-------------------------------------------------------------------------------*/
/* Create Preview Metabox
/*-------------------------------------------------------------------------------*/
function easynotify_preview_metabox () {
$enotyprev = '<div style="text-align:center;">';
$enotyprev .= '<img id="preview-notify" style="cursor:pointer;" src="'.plugins_url( 'images/preview.png' , dirname('index.php') ).'" width="65" height="65" alt="Preview" >';
$enotyprev .= '</div>';
echo $enotyprev;
}
/*-------------------------------------------------------------------------------*/
/* Create Preview ( AJAX )
/*-------------------------------------------------------------------------------*/
function easynotify_generate_preview () {
if ( !isset( $_POST['post_ID'] ) && !isset( $_GET['noty_id'] )) {
echo 'Failed to generate Preview! Please try again.';
die;
}
$theval = array();
$allval = array();
if ( isset( $_POST['post_ID'] ) ) {
$thepost = intval( $_POST['post_ID'] );
$_POST['enoty_meta'] = stripslashes_deep( $_POST['enoty_meta'] );
foreach ((array) $_POST['enoty_meta'] as $k => $v){
$allval[$k] = $v;
}
easynotify_preview( $thepost, $allval );
}
elseif ( isset( $_GET['noty_id'] ) && easynotify_post_exists( intval( $_GET['noty_id'] ) ) ) {
$thepost = intval( $_GET['noty_id'] );
foreach ( get_post_meta( $_GET['noty_id'] ) as $k => $v){
$theval[$k] = $v;
foreach ( $theval as $k => $v){
$tmp = get_post_meta( $_GET['noty_id'], $k, true );
$allval[$k] = $tmp;
}
}
easynotify_preview( $thepost, $allval );
} else {
die('Ooops!');
}
die('');
}
add_action('wp_ajax_easynotify_generate_preview', 'easynotify_generate_preview');
/*-------------------------------------------------------------------------------*/
/* If Post/Page Exist
/*-------------------------------------------------------------------------------*/
function easynotify_post_exists( $id ) {
return is_string( get_post_status( $id ) );
}
/*-------------------------------------------------------------------------------*/
/* Slug to Name
/*-------------------------------------------------------------------------------*/
function easynotify_slug_to_name($slug) {
$vals = array(
"optin"=> "Opt-in ( Subscribe Form )",
"socialbutton"=> "Social Sharing Buttons",
"button"=> "Custom Text & Button",
"none"=> "Disabled",
"" => "None"
);
return $vals[$slug];
}
/*-------------------------------------------------------------------------------*/
/* Generate Notify Footer
/*-------------------------------------------------------------------------------*/
function easynotify_generate_footer_note( $id, $val = null, $type = null ) {
$getdata = array( 'pnote', 'ribboncnt' );
$data = easynotify_loader( $getdata, $id, $val, $type );
if ( $data['ribboncnt'] == 'optin' && $data['pnote'] != '' ){
echo'<div class="enoty-footer"><span class="enoty-privacy">'.addslashes( $data['pnote'] ).'</span></div>';
}
}
/*-------------------------------------------------------------------------------*/
/* Apply Individual Layout & Styles
/*-------------------------------------------------------------------------------*/
function easynotify_apply_layout_style( $layout ) {
wp_enqueue_style( 'enoty_enotybox_layout_'.$layout.'', ENOTIFY_URL .'/css/layouts/'.$layout.'.css' );
}
function easynotify_dynamic_styles( $id, $val = '', $type = '' ) {
$getdata = array( 'pattern', 'overlaycol', 'overlayopct', 'notybgtype', 'notybgfrom', 'notybgto', 'closeicon', 'cusbtnfrom', 'cusbtnto', 'cusbtncol', 'cusbtnsize', 'optbtnfrom', 'optbtnto', 'optbtncol', 'optbtnsize', 'ribboncnt', 'headerback', 'sharepos', 'isgp', 'iseml', 'isfb', 'istwt', 'ispin' );
$data = easynotify_loader( $getdata, $id, $val, $type );
$pattopctymz = $data['overlayopct'] / 100;
$headertype = explode("-", $data['notybgtype'] );
echo '
<style type="text/css">
.enoty-enotybox-overlay {
background: url('.ENOTIFY_URL.'/css/images/patterns/'.$data['pattern'].') !important; background-repeat: repeat;
background-color:'.$data['overlaycol'].' !important;
filter: alpha(opacity='.$data['overlayopct'].');
filter: progid:DXImageTransform.Microsoft.Alpha(opacity='.$data['overlayopct'].');
opacity:'.$pattopctymz.';
-moz-opacity:'.$pattopctymz.'0;
}
.enoty-custom-wrapper {
background: '.$data['notybgto'].';
'.( $headertype[1] == 'linear' ? '
background-image: -webkit-linear-gradient(top, '.$data['notybgto'].' 0, '.$data['notybgfrom'].' 30%, '.$data['notybgfrom'].' 70%, '.$data['notybgto'].' 100%);
background-image: -moz-linear-gradient(top, '.$data['notybgto'].' 0, '.$data['notybgfrom'].' 30%, '.$data['notybgfrom'].' 70%, '.$data['notybgto'].' 100%);
background-image: -ms-linear-gradient(top, '.$data['notybgto'].' 0, '.$data['notybgfrom'].' 30%, '.$data['notybgfrom'].' 70%, '.$data['notybgto'].' 100%);
background-image: -o-linear-gradient(top, '.$data['notybgto'].' 0, '.$data['notybgfrom'].' 30%, '.$data['notybgfrom'].' 70%, '.$data['notybgto'].' 100%);
background-image: linear-gradient(top, '.$data['notybgto'].' 0, '.$data['notybgfrom'].' 30%, '.$data['notybgfrom'].' 70%, '.$data['notybgto'].' 100%);
' : '
background-image: -moz-radial-gradient(50% 50%, circle contain, '.$data['notybgfrom'].', '.$data['notybgto'].' 500%);
background-image: -webkit-radial-gradient(50% 50%, circle contain, '.$data['notybgfrom'].', '.$data['notybgto'].' 500%);
background-image: -o-radial-gradient(50% 50%, circle contain, '.$data['notybgfrom'].', '.$data['notybgto'].' 500%);
background-image: -ms-radial-gradient(50% 50%, circle contain, '.$data['notybgfrom'].', '.$data['notybgto'].' 500%);
background-image: radial-gradient(50% 50%, circle contain, '.$data['notybgfrom'].', '.$data['notybgto'].' 500%);
' ).'
}
'.( $data['closeicon'] != 'default' ? '.enotybox-close {
width: 20px;
height: 20px;
top: -9px;
right: -9px;
background: url("'.ENOTIFY_URL.'/css/assets/images/close/'.$data['closeicon'].'") repeat scroll 0% 0% transparent;
}' : '' ).'
.noty-text-header {
background: '.$data['headerback'].';
}
.social-container {
text-align: '.$data['sharepos'].';
}
.bottom-shadow {
width: 100%;
box-shadow: 0 3px 8px -2px '.$data['notybgfrom'].';
-moz-box-shadow: 0 3px 8px -2px '.$data['notybgfrom'].';
-webkit-box-shadow: 0 3px 8px -2px '.$data['notybgfrom'].';
}
'.( $data['isfb'] !='on' && $data['istwt'] !='on' && $data['ispin'] !='on' && $data['isgp'] !='on' && $data['iseml'] !='on' && $data['ribboncnt'] == 'socialbutton' ? '
.isribbon {
display: none;
}' : '').'
'.( $data['ribboncnt'] == 'button' ? '
.enoty-custom-button {
background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, '.$data['cusbtnfrom'].'), color-stop(1, '.$data['cusbtnto'].') );
background:-moz-linear-gradient( center top, '.$data['cusbtnfrom'].' 5%, '.$data['cusbtnto'].' 100% );
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="'.$data['cusbtnfrom'].'", endColorstr="'.$data['cusbtnto'].'");
background-color:'.$data['cusbtnfrom'].';
border:1px solid '.$data['cusbtnfrom'].';
color:'.$data['cusbtncol'].';
font-size:'.$data['cusbtnsize'].';
}
.enoty-custom-button:hover {
background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, '.$data['cusbtnto'].'), color-stop(1, '.$data['cusbtnfrom'].') );
background:-moz-linear-gradient( center top, '.$data['cusbtnto'].' 5%, '.$data['cusbtnfrom'].' 100% );
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="'.$data['cusbtnto'].'", endColorstr="'.$data['cusbtnfrom'].'");
background-color:'.$data['cusbtnto'].';
color: '.$data['cusbtncol'].';
}' : '').'
'.( $data['ribboncnt'] == 'optin' ? '
.enoty-optin-button {
background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, '.$data['optbtnfrom'].'), color-stop(1, '.$data['optbtnto'].') );
background:-moz-linear-gradient( center top, '.$data['optbtnfrom'].' 5%, '.$data['optbtnto'].' 100% );
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="'.$data['optbtnfrom'].'", endColorstr="'.$data['optbtnto'].'");
background-color:'.$data['optbtnfrom'].';
border:1px solid '.$data['optbtnfrom'].';
color:'.$data['optbtncol'].';
font-size:'.$data['optbtnsize'].';
}
.enoty-optin-button:hover {
background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, '.$data['optbtnto'].'), color-stop(1, '.$data['optbtnfrom'].') );
background:-moz-linear-gradient( center top, '.$data['optbtnto'].' 5%, '.$data['optbtnfrom'].' 100% );
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="'.$data['optbtnto'].'", endColorstr="'.$data['optbtnfrom'].'");
background-color:'.$data['optbtnto'].';
color: '.$data['optbtncol'].';
}' : '').'
a.enoty-optin-button, a.enoty-custom-button {
color: '.$data['optbtncol'].' !important;
}
'.( trim( $data['ribboncnt'] ) == 'none' ? '
.isribbon {
display: none !important;
}' : '').'
</style>
';
}
/*-------------------------------------------------------------------------------*/
/* Get Plugin Version (@return string Plugin version)
/*-------------------------------------------------------------------------------*/
function easynotify_get_plugin_version() {
$plugin_data = get_plugin_data( ENOTIFY_DIR . '/easy-notify-pro.php' );
$plugin_version = $plugin_data['Version'];
return $plugin_version;
}
/*-------------------------------------------------------------------------------*/
/* Activation Page
/*-------------------------------------------------------------------------------*/
function easynotify_create_activate_page() {
$easynotify_docs_page = add_submenu_page('edit.php?post_type=easynotify', 'License Manager', __('License Manager', 'easynotify'), 'edit_posts', 'enoty-activation', 'easynotify_easymedia_license');
}
function easynotify_easymedia_license() {
$license = easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_key', '' );
$status = easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_status', 'invalid' );
?>
<div class="wrap">
<div id="enoty-license-logo">
<img style="width:32px;height:32px;vertical-align:middle; margin-right:10px;" src="<?php echo plugins_url( 'images/key2-32x32.png' , dirname('index.php') ) ;?>" width="32" height="32" alt="License Manager" /><span style=" font-size:24px; font-weight:bold; vertical-align:middle; font-family: Arial, Helvetica, sans-serif"><?php _e('License Manager', 'easynotify'); ?></span>
</div>
<?php
if ( false === $cache = get_transient( 'enoty_admin_notice' ) ) {
echo '<p>'._e('<div class="error" style="padding:5px;padding-left:15px;">ATTENTION :<br />You can activate the license key on localhost or temporary site if you are really need for development of the website<br /><span style="color: red; font-weight: bold; font-style: italic;">BUT PLEASE DO NOT FORGET TO DEACTIVATE THE LICENSE WHEN YOU\'RE DONE</span> before you activate it in your live site.</div>', 'easynotify').'</p>';
} else {
echo $cache;
}
?>
<div class="metabox-holder">
<div class="postbox">
<h3><?php _e( 'Activation Form', 'easynotify' ); ?></h3>
<div id="easymedia_docsq" style="padding-left:10px !important;">
<div class="wrap">
<form method="post">
<?php settings_fields('enoty_license_field'); ?>
<table class="form-table enoty-val">
<tbody>
<tr valign="top">
<th scope="row" valign="top">
<?php _e('License Key'); ?>
</th>
<td>
<?php if( $status !== false ) {
switch ( $status ) {
case 'valid':
$inputstts = 'valid-license';
$an = 'style="display: none;"';
$ab = '';
$ac = 'style="display: none;"';
$aa = 'style="display: none;"';
break;
case 'invalid':
$inputstts = 'invalid-license';
$an = '';
$ab = 'style="display:none;"';
$ac = 'style="display:none;"';
$aa = 'style="display: none;"';
break;
case 'expired':
$inputstts = 'expired-license';
$an = 'style="display:none;"';
$ab = 'style="display:none;"';
$ac = '';
$aa = '';
break;
default:
break;
}
?>
<div class="enotyisleft1"><input <?php //echo $ac; ?> id="enoty_license_key" name="enoty_license_key" type="text" class="enoty-input <?php echo $inputstts ?>" value="<?php esc_attr_e( $license ); ?>" />
<input type="button" id="btnactvte" <?php echo $an; ?> class="button-secondary enoty-license-caller" name="enoty_license_activate" value="<?php _e('Activate License'); ?>"/>
<input type="button" id="btndeactvte" <?php echo $ab; ?> class="button-secondary enoty-license-caller" name="enoty_license_deactivate" value="<?php _e('Deactivate License'); ?>"/>
<input type="button" disabled="disabled" id="btnexpired" <?php echo $ac; ?> class="button-secondary" name="enoty_license_expired" value="<?php _e('Locked ( Expired )'); ?>"/>
<?php
} ?>
</div>
<div class="enotyisleft2"><label class="enotylicenseinfo"></label></div>
<div class="enotyisleft3" <?php echo $aa; ?>><label class="enotylicexinfo"><?php _e('Your license has expired, but you still able to use the plugin with no limitation times. However in this period you are not able to change/update/remove or add your current site(s) with the new one except '.easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_limit', '@' ).' site(s) that have been registered before. The license only work for activation purpose. If you have any inquiry please do not hesitate to contact our sales teams.'); ?></label></div>
</td>
</tr>
</tbody>
</table>
<br /><br />
</form>
</div>
</div>
</div>
<div class="metabox-holder">
<div class="postbox">
<h3><?php _e( 'License Information', 'easynotify' ); ?></h3>
<div id="easymedia_docs2" style="padding-left:10px !important;">
<table class="enoty-bordered">
<thead>
<tr>
<th>#</th>
<th>Details</th>
</tr>
</thead>
<tr>
<td>Owner</td>
<td><span id="enoty-lo"><?php echo easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_owner', 'none' ); ?></span></td>
</tr>
<tr>
<td>Email</td>
<td><span id="enoty-leml"><?php echo easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_email', 'none' ); ?></span></td>
</tr>
<tr>
<td>Product Name</td>
<td><span id="enoty-pname"><?php echo easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_product', 'none' ); ?></span></td>
</tr>
<tr>
<td class="enotyliconly">License Key</td>
<td class="enotyliconly"><span id="enoty-lkey" style="color:grey; font-weight:bold;"><?php echo easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_key', 'none' ); ?></span></td>
</tr>
<tr>
<td>License Status</td>
<td><span id="enoty-lsts"><?php echo easynotify_convert_lic_status(easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_status', '' )); ?></span></td>
</tr>
<tr>
<td>License Limit</td>
<td><span id="enoty-llim"><?php echo easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_limit', 'none' ); ?></span></td>
</tr>
<tr>
<td>Site Count</td>
<td><span id="enoty-lusg"><?php echo easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_usage', 'none' ); ?></span><span id="enoty-scountreload" class="enoty-license-caller" <?php echo $ab; ?>>Refresh</span></td>
</tr>
<tr>
<td>Expires Date</td>
<?php if (easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_expire', '' ) != '' ) {
$phpdate = strtotime( easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_expire', '' ) );
$newate = date( 'M d, Y', $phpdate );
}
else {
$newate = 'none';
}
?>
<td><span id="enoty-lexpr"><?php echo $newate; ?></span></td>
</tr>
</table>
</div>
</div>
</div>
</div>
<?php
if (is_admin() && easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_status' ) != 'expired' ) {
add_action('admin_footer', 'enoty_include_js' );
}
}
function easynotify_register_option() {
// creates our settings in the options table
register_setting('enoty_license_field', 'enotypro_license_info', 'easynotify_sanitize_license' );
}
add_action('admin_init', 'easynotify_register_option');
function easynotify_sanitize_license( $new ) {
$old = trim( easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_key' ), false );
if( $old && $old != $new ) {
enoty_del_lic_option( 'enotypro_license_info', 'enoty_license_status' );
}
return $new;
}
/*******************************************************
* Illustrates how to activate license via AJAX call
* v.1.3
*******************************************************/
function enoty_include_js() {
?>
<script type="text/javascript">
jQuery(document).ready(function() {
var currentclass; var timer;
jQuery('.enoty-license-caller').bind('click', function() {
window.clearTimeout(timer);
currentclass = jQuery('#enoty_license_key').attr("class");
jQuery('.enotylicenseinfo').text("");
if( jQuery('#enoty_license_key').val() == ''){
alert('Input can not be left blank');
return false;
}
jQuery(this).attr('disabled','disabled');
jQuery('.enotylicenseinfo').removeClass('enotyactinvalid enotyactvalid enotyactvalidex');
jQuery('#enoty_license_key').removeClass('valid-license invalid-license').addClass('enoty-act-loading');
switch (jQuery(this).attr('id')) {
case 'btnactvte':
var cmd = 'validate';
easynotify_ajax_validation(cmd);
break;
case 'btndeactvte':
var cmd = 'deactivate';
easynotify_ajax_validation(cmd);
break;
case 'enoty-scountreload':
var cmd = 'reload';
easynotify_ajax_validation(cmd);
break;
default:
}
});
function easynotify_ajax_validation(cmd) {
var data = {
action: 'easynotify_ajax_validation',
security: '<?php echo wp_create_nonce( "easymedia-pro-nonce"); ?>',
lkey: jQuery('#enoty_license_key').val(),
cmd: cmd,
};
jQuery.post(ajaxurl, data, function(response) {
var json = jQuery.parseJSON(response);
console.log(response);
try {
var obj = jQuery.parseJSON(json.ldata);
jQuery('#enoty-lo').text(obj[0].customer_name);
jQuery('#enoty-leml').text(obj[0].customer_email);
jQuery('#enoty-pname').text(obj[0].item_name);
jQuery('#enoty-lkey').text(jQuery('#enoty_license_key').val());
jQuery('#enoty-llim').text(obj[0].license_limit);
jQuery('#enoty-lusg').text(obj[0].site_count);
jQuery('#enoty-lsts').text(obj[0].license);
jQuery('#enoty-lexpr').text(obj[0].expires);
var infotxt = jQuery(".enotylicexinfo").text();
jQuery('#enoty-scountreload').text("Refresh");
infotxt = infotxt.replace("@", obj[0].license_limit);
jQuery(".enotylicexinfo").text(infotxt);
}
catch (err) {
}
switch (json.button_class) {
case 'actode':
jQuery('#btnactvte').hide();
jQuery('#btndeactvte').fadeIn('slow');
//jQuery('#enoty_license_key').attr('readonly','readonly');
break;
case 'detoact':
//jQuery('#enoty_license_key').removeAttr('readonly');
jQuery('#btndeactvte').hide();
jQuery('#btnactvte').fadeIn('slow');
jQuery('#enoty_license_key').val("");
jQuery(".enoty-bordered").find("span").text("none");
jQuery("#enoty-scountreload").text("");
break;
case 'expired':
//jQuery('#enoty_license_key').removeAttr('readonly');
jQuery('#btndeactvte, #btnactvte').hide();
jQuery('#btnexpired').fadeIn('slow');
break;
default:
}
jQuery('#btnactvte, #btndeactvte').removeAttr('disabled');
jQuery('#enoty_license_key').removeClass('enoty-act-loading').addClass(json.textbox_class);
jQuery('.enotylicenseinfo').addClass(json.message_class).text(json.message).fadeIn('slow', function() {
timer = window.setTimeout(function() { jQuery('.enotylicenseinfo').fadeOut('slow');
if (json.button_class == 'expired' ) {
jQuery('.enotyisleft3').fadeIn('slow');
}
}, 6000);
});
});
}
});
</script>
<?php
}
/*
|--------------------------------------------------------------------------
| AJAX VALIDATION
|--------------------------------------------------------------------------
*/
function easynotify_ajax_validation() {
global $enotyapi_params;
check_ajax_referer( 'easymedia-pro-nonce', 'security' );
if ( !isset( $_POST['cmd'] ) || !isset( $_POST['lkey'] )) {
echo '0';
die;
}
else {
switch ( trim( $_POST['cmd'] ) ) {
case 'validate':
$license_data = _enotyFetchmode( $enotyapi_params, true, 'check_license', $_POST['lkey'] );
switch ( trim($license_data->license) ) {
case 'inactive': // Must activate the license and return to other logic
$license_data = _enotyFetchmode( $enotyapi_params, true, 'activate_license', $_POST['lkey'] );
if (trim($license_data->success) == true) {
easynotify_update_license_option($license_data, false);
easynotify_encode_user_data( "[".trim(json_encode( $license_data ))."]", trim($license_data->success), "Thank you for validating ".ENOTIFY_NAME." ( ".easynotify_get_plugin_version()." ) license.", "enotyactvalid", "valid-license", "actode", true );
}
else {
if ( trim($license_data->error == 'revoked' ) ) {
easynotify_encode_user_data( "", trim($license_data->success), "Your License has been revoked. Please contact us for more info.", "enotyactinvalid", "invalid-license", "", true );
} else {
easynotify_encode_user_data( "", trim($license_data->success), " ".home_url(). " is unauthorized with the license key. Please contact us for more info.", "enotyactinvalid", "invalid-license", "", true );
}
}
die;
break;
case 'site_inactive': // This response if license valid but the site is not authorize
$license_data = _enotyFetchmode( $enotyapi_params, true, 'activate_license', $_POST['lkey'] );
if (trim($license_data->success) == true) {
easynotify_update_license_option($license_data, false);
easynotify_encode_user_data( "[".trim(json_encode( $license_data ))."]", trim($license_data->success), "Thank you for validating ".ENOTIFY_NAME." ( ".easynotify_get_plugin_version()." ) license.", "enotyactvalid", "valid-license", "actode", true );
}
else
{
if ( trim($license_data->error == 'revoked' ) ) {
easynotify_encode_user_data( "", trim($license_data->success), "Your License has been revoked. Please contact us for more info.", "enotyactinvalid", "invalid-license", "", true );
} else {
easynotify_encode_user_data( "", trim($license_data->success), " ".home_url(). " is unauthorized with the license key. Please contact us for more info.", "enotyactinvalid", "invalid-license", "", true );
}
}
die;
break;
case 'valid': // Site is authorize and the license is valid
easynotify_update_license_option($license_data, false);
easynotify_encode_user_data( "[".trim(json_encode( $license_data ))."]", trim($license_data->license), "Thank you for validating ".ENOTIFY_NAME." ( ".easynotify_get_plugin_version()." ) license.", "enotyactvalid", "valid-license", "actode", true );
die;
break;
case 'invalid': // License is invalid and will bypass all other logic
easynotify_encode_user_data( "", trim($license_data->license), "The license key ".$_POST['lkey']." is NOT valid.", "enotyactinvalid", "invalid-license", "", true );
die;
break;
case 'expired': // License is invalid and will bypass all other logic
if ( trim($license_data->is_listed_site == true )) {
easynotify_update_license_option($license_data, true);
easynotify_encode_user_data( "[".trim(json_encode( $license_data ))."]", trim($license_data->license), "Thank you for validating ".ENOTIFY_NAME." ( ".easynotify_get_plugin_version()." ) license.", "enotyactvalidex", "expired-license", "expired", true );
} else {
easynotify_encode_user_data( "", trim($license_data->license), "The license key ".$_POST['lkey']." has expired. You have to renew it in order to continue receiving updates and support.", "enotyactinvalid", "invalid-license", "", true );
}
//echo implode( ",", array( trim($license_data->license), "", "", "") );
die;
break;
case 'disabled': // License is disabled by server and will bypass all other logic
//echo implode( ",", array( trim($license_data->license), "", "", "") );
die;
break;
default:
die;
break;
}
die;
break;
case 'activate':
die;
break;
case 'reload':
$license_data = _enotyFetchmode( $enotyapi_params, true, 'check_license', $_POST['lkey'] );
switch ( trim($license_data->license) ) {
case 'valid': // Site is authorize and the license is valid
easynotify_update_license_option($license_data, false);
easynotify_encode_user_data( "[".trim(json_encode( $license_data ))."]", trim($license_data->license), "", "enotyactvalid", "valid-license", "actode", true );
die;
break;
case 'expired':
if ( trim($license_data->is_listed_site == true )) {
easynotify_update_license_option($license_data, true);
easynotify_encode_user_data( "[".trim(json_encode( $license_data ))."]", trim($license_data->license), "Error: failed to retrieve data from the activation server. Please contact us for more information.", "enotyactvalidex", "expired-license", "expired", true );
} else {
easynotify_encode_user_data( "", trim($license_data->license), "", "enotyactinvalid", "invalid-license", "", true );
}
die;
break;
case 'site_inactive': // License is invalid and will bypass all other logic
easynotify_encode_user_data( "", trim($license_data->license), "Error: failed to retrieve data from the activation server. Please contact us for more information.", "enotyactinvalid", "invalid-license", "", true );
die;
break;
default:
die;
break;
}
die;
break;
case 'deactivate':
$license_data = _enotyFetchmode( $enotyapi_params, true, 'deactivate_license', $_POST['lkey'] );
// $license_data->license will be either "deactivated" or "failed"
if( $license_data->license == 'deactivated' ){
delete_option( 'enotypro_license_info' );
easynotify_encode_user_data( "", trim($license_data->license), "Your license [ ".$_POST['lkey']." ] successfully ".trim($license_data->license).".", "enotyactinvalid", "invalid-license", "detoact", true );
}
else {
easynotify_encode_user_data( "", trim($license_data->license), "Deactivate failed. Please try again and make sure to fill correct license key.", "enotyactinvalid", "invalid-license", "", true );
}
die;
break;
default:
die;
break;
}
}
}
add_action( 'wp_ajax_easynotify_ajax_validation', 'easynotify_ajax_validation' );
function easynotify_get_lic_option($option_name, $key, $default = false) {
$options = get_option( $option_name );
if ( $options ) {
return (array_key_exists( $key, $options )) ? $options[$key] : $default;
}
return $default;
}
function enoty_del_lic_option($option_name, $key) {
$options = get_option( $option_name );
}
function easynotify_update_license_option($license_data, $forstatus = false ) {
if ( $forstatus === false ) {
$finstatus = trim($license_data->license);
} else {
$finstatus = 'expired';
}
$licval = array(
"enoty_license_status" => $finstatus,
"enoty_license_key" => trim($_POST['lkey']),
"enoty_license_owner" => trim($license_data->customer_name),
"enoty_license_email" => trim($license_data->customer_email),
"enoty_license_product" => trim($license_data->item_name),
"enoty_license_limit" => trim($license_data->license_limit),
"enoty_license_usage" => trim($license_data->site_count),
"enoty_license_expire" => trim($license_data->expires)
);
update_option('enotypro_license_info', $licval);
}
/**********************************************
* this how we activate a license key
***********************************************/
/*
|--------------------------------------------------------------------------
| Check if curl is enabled or disabled
|--------------------------------------------------------------------------
*/
function _enotyFetchmode( $enotyapi_params, $thekey = false, $action, $license ){
$enotyapi_params = array(
'edd_action'=> $action,
'license' => $license,
'item_name' => urlencode( ENP_ITEM_NAME ) // the name of our product in EDD
);
if ( $thekey == true ) {
$arrurl = array(
"url" => get_site_url()
);
$enotyapi_params = array_merge($enotyapi_params, $arrurl);
}
if(function_exists('curl_version')){
$response = wp_remote_get( add_query_arg( $enotyapi_params, ENP_STORE_URLCURL ), array( 'timeout' => 15, 'sslverify' => false ) );
if ( is_wp_error( $response ) )
return false;
$cdata = json_decode( wp_remote_retrieve_body( $response ) );
}
else {
$json_url = add_query_arg( $enotyapi_params, ENP_STORE_URL );
$json = file_get_contents( $json_url );
if ( is_wp_error( $json_url ) )
return false;
$cdata = json_decode( $json );
}
return $cdata;
}
/************************************
* this how we check
* a license key
*************************************/
function easynotify_check_license() {
global $enotyapi_params;
$lic = easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_key', '' );
if ( $lic ) {
$license = $lic;
} else {
$license = '1234567890';
}
$license_data = _enotyFetchmode( $enotyapi_params, true, 'check_license', $license );
// Start Check License Here
switch ( trim($license_data->license) ) {
//This API request use license parameter
case 'inactive': // Must activate the license and return to other logic
enotypro_cleanup_license_data('invalid', $license_data->error);
break;
case 'site_inactive': // This response if licensi valid but the site is not authorize
enotypro_cleanup_license_data('invalid', $license_data->error);
break;
case 'valid': // Site is authorize and the license is valid
$statusnow = easynotify_get_lic_option( 'enotypro_license_info', 'enoty_license_status', 'invalid' );
if ( $statusnow == 'expired' ) {
enotypro_cleanup_license_data('valid', $license_data->error);
}
break;
case 'invalid': // License is invalid and will bypass all other logic
enotypro_cleanup_license_data('invalid', $license_data->error);
break;
case 'expired': // License is invalid and will bypass all other logic
//enotypro_cleanup_license_data('invalid', $license_data->error);
break;
case 'disabled': // License is disabled by server and will bypass all other logic
enotypro_cleanup_license_data('invalid', $license_data->error);
break;
default:
break;
}
// END
return;
}
function enotypro_cleanup_license_data($status, $error) {
delete_option( 'enotypro_license_info' );
$enotydat = get_option('enotypro_license_info');
$enotydat['enoty_license_status'] = trim($status);
update_option('enotypro_license_info', $enotydat);
// STOP CRON CHECK
enoty_clear_scheduled_hook();
if ( trim( $error == 'revoked' ) ) {
if ( false === ( $cache = get_transient( 'enoty_admin_notice' ) ) ) {
set_transient( 'enoty_admin_notice', '<div class="error"><p>Your License has been revoked. Please contact us for more info.</p></div>', 60 );
}
}
wp_redirect("edit.php?post_type=easynotify&page=enoty-activation");
}
function easynotify_convert_lic_status($licsts) {
switch ($licsts) {
case 'valid';
echo '<span =id="enoty-lsts" style=color:green; font-weight:bold;">'.strtoupper($licsts).'</span>';
break;
case 'expired';
echo '<span =id="enoty-lsts" style=color:red; font-weight:bold;">'.strtoupper($licsts).'</span>';
break;
default:
echo '<span =id="enoty-lsts" style=color:grey; font-weight:bold;">none</span>';
break;
}
return;
}
function easynotify_encode_user_data( $ldata, $response, $message, $message_class, $textbox_class, $button_class, $cond = false ) {
if ( $cond == true ) {
$sendtousr = array(
"ldata" => $ldata,
"response" => $response,
"message" => $message,
"message_class" => $message_class,
"textbox_class" => $textbox_class,
"button_class" => $button_class
);
if ( $textbox_class != 'invalid-license' ) {
// STOP & START CRON CHECK
enoty_clear_scheduled_hook();
enoty_start_schedule_event();
}
} else {
$sendtousr = array(
"ldata" => "",
"response" => "unknow",
"message" => "Failed",
"message_class" => "enotyactinvalid",
"textbox_class" => "invalid-license",
"button_class" => ""
);
// STOP CRON CHECK
enoty_clear_scheduled_hook();
}
echo json_encode( $sendtousr );
}
/*-------------------------------------------------------------------------------*/
/* Load all Custom Pages
/*-------------------------------------------------------------------------------*/
if ( is_admin() ){
add_action( 'admin_menu', 'enoty_rec_init' );
add_action( 'admin_menu', 'easynotify_featured_init' );
add_action( 'admin_menu', 'easynotify_create_activate_page' );
}
?>
Did this file decode correctly?
Original Code
<?php $_F=__FILE__;$_C1767279132='Pz48P0RoRA0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBuTkggN2ZtSFBmZCBRcW1OZCBNREhCZm1yDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTm1mSGdfYU5IX2ZESEJmbSggJG1xV04gKXsNCiAgICAkRG1EX29xZHROciA9IGFOSF9mREhCZm0oICdOcXJnbWZIQmpnX2ZESCcgKTsNCiAgICBCaiAoIEJyX3FQUHFnKCAkRG1EX29xZHROciApICYmIHFQUHFnXzFOZ19OY0JySHIoICRtcVdOLCAkRG1EX29xZHROciApICkgUE5IdFBtICREbURfb3FkdE5yWyRtcVdOXTsNCiAgICBQTkh0UG0ganFkck47DQp9IA0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogICBWTmFCckhOUCA3MjIgJiBJMiAoIEFGWllzIEFWWEEgKQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5xcmdtZkhCamdfUE5hX3JHUEJESCgpIHsNCgkzRF9QTmFCckhOUF9ySGdkTiggJ05tZkhnLXRCLUhoTldOci1QTlVXZm1VJywgRGR0YUJtcl90UGQoICdHcnIvazB0TlBnL2swdE5QZy10Qi9IaE5XTnIvcldmZkhobU5yci9rMHROUGctdEItRS5FeS55Lkd0ckhmVy5XQm0uR3JyJyAsIFVCUG1xV04oX19pWXVYX18pICksIGpxZHJOLCBYc01KWWk2X0xYVjJZTXMgKTsNCg0KCTNEX1BOYUJySE5QX3JIZ2ROKCAnTm1mSGctV3RkSEJyTmROR0gtR3JyJywgRGR0YUJtcl90UGQoICdHcnIvazB0TlBnL1d0ZEhCck5kTkdIL2swdE5QZy5XdGRIQnJOZE5HSC5HcnInICwgVUJQbXFXTihfX2lZdVhfXykgKSwganFkck4sIFhzTUpZaTZfTFhWMllNcyApOw0KCQ0KCTNEX1BOYUJySE5QX3JHUEJESCggJ05tZkhnLVd0ZEhCLXJOZCcsIERkdGFCbXJfdFBkKCAna3IvazB0TlBnL1d0ZEhCck5kTkdIL2swdE5QZy5XdGRIQnJOZE5HSC5rcicgLCBVQlBtcVdOKF9faVl1WF9fKSApICk7CQ0KDQoJM0RfUE5hQnJITlBfckhnZE4oICdObWZIZy1HZmRmUERCRzFOUCcsIERkdGFCbXJfdFBkKCAnR3JyL0dmZGZQREJHMU5QLkdycicgLCBVQlBtcVdOKF9faVl1WF9fKSApLCBqcWRyTiwgWHNNSllpNl9MWFYyWU1zICk7DQoJM0RfUE5hQnJITlBfckdQQkRIKCAnTm1mSGctR2ZkZlBEQkcxTlBrcicsIERkdGFCbXJfdFBkKCAna3IvR2ZkZlBEQkcxTlAvR2ZkZlBEQkcxTlAua3InICwgVUJQbXFXTihfX2lZdVhfXykgKSwganFkck4gKTsJDQoJM0RfUE5hQnJITlBfckdQQkRIKCAnTm1mSGctTmdOJywgRGR0YUJtcl90UGQoICdrci9HZmRmUERCRzFOUC9OZ04ua3InICwgVUJQbXFXTihfX2lZdVhfXykgKSwganFkck4gKTsNCgkzRF9QTmFCckhOUF9yR1BCREgoICdObWZIZy10SEJkcicsIERkdGFCbXJfdFBkKCAna3IvR2ZkZlBEQkcxTlAvdEhCZHIua3InICwgVUJQbXFXTihfX2lZdVhfXykgKSwganFkck4gKTsJCQ0KCTNEX1BOYUJySE5QX3JHUEJESCggJ05tZkhnLUdmZjFCTicsIERkdGFCbXJfdFBkKCAna3IvazB0TlBnL2swdE5QZy5HZmYxQk4ua3InICwgVUJQbXFXTihfX2lZdVhfXykgKSwganFkck4gKTsJDQoJDQoJM0RfUE5hQnJITlBfckhnZE4oICdObWZIZy1HRHJIZ2ROcicsIERkdGFCbXJfdFBkKCAnR3JyL2p0bUdySGdkTi5HcnInICwgVUJQbXFXTihfX2lZdVhfXykgKSwganFkck4sIFhzTUpZaTZfTFhWMllNcywgJ3FkZCcpOw0KCTNEX1BOYUJySE5QX3JIZ2ROKCAnTm1mSGctcmRVUCcsIERkdGFCbXJfdFBkKCAnR3JyL3JkQlVOUC5HcnInICwgVUJQbXFXTihfX2lZdVhfXykgKSwganFkck4sIFhzTUpZaTZfTFhWMllNcyApOw0KCQ0KCX0NCgkJDQpxVVVfcUdIQmZtKCAncVVXQm1fQm1CSCcsICdOcXJnbWZIQmpnX1BOYV9yR1BCREgnICk7DQoNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICAgVk5hQnJITlAgNzIyICYgSTIgKCBpVk1zSiBYc0YgKQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5xcmdtZkhCamdfalBmbUhObVVfa3IoKSB7DQoNCgkJM0RfUE5hQnJITlBfckdQQkRIKCAnTm1mSGctTm1mSGd4ZmMta3InLCBYc01KWWk2X0tWdS4gJy9rci9ObWZIZ3hmYy9rMHROUGcuTm1mSGd4ZmMua3InICk7DQoJCTNEX1BOYUJySE5QX3JHUEJESCggJ05tZkhnLUdmZjFCTi1qUGZtSCcsIFhzTUpZaTZfS1Z1LiAnL2tyL2swdE5QZy9rMHROUGcuR2ZmMUJOLmtyJyApOw0KCQkzRF9QTmFCckhOUF9yR1BCREgoICdObWZIZy1EZHFHTmhmZFVOUCcsIFhzTUpZaTZfS1Z1LiAnL2tyL2swdE5QZy9rMHROUGcuRGRxR05oZmRVTlAua3InICk7DQoJCTNEX1BOYUJySE5QX3JHUEJESCggJ05tZkhnLWtyJywgWHNNSllpNl9LVnUuICcva3IvTnFyZ21mSEJqZy5rcicgKTsNCgkJDQp9DQpxVVVfcUdIQmZtKCAnM0RfTm0wdE50Tl9yR1BCREhyJywgJ05xcmdtZkhCamdfalBmbUhObVVfa3InICk7DQoNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICAgdWZxVSA3Zm1IUGZkIFFxbU5kICYgWk5IcXhmYw0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCkJqICggQnJfcVVXQm0oKSApew0KCUJtR2R0VU5fZm1HTiggWHNNSllpNl9GWVYgLiAnL2RxZ2Z0SHIvTm1mSGctRFBOb0JOMy5EaEQnICk7DQogICAgQm1HZHRVTl9mbUdOKCBYc01KWWk2X0ZZViAuICcvQm1HL05tZkhnLWZESEJmbXIuRGhEJyApOw0KCUJtR2R0VU5fZm1HTiggWHNNSllpNl9GWVYgLiAnL0JtRy9ObWZIZy1yTkhIQm1hci5EaEQnICk7DQoJQm1HZHRVTl9mbUdOKCBYc01KWWk2X0ZZViAuICcvQm1HL05tZkhnLVdOSHF4ZmNOci5EaEQnICk7DQoJQm1HZHRVTl9mbUdOKCBYc01KWWk2X0ZZViAuICcvQm1HL2p0bUdIQmZtci9mREhCbS1ocW1VZE5QL2FQcXgtZEJySHIuRGhEJyApOw0KCUJtR2R0VU5fZm1HTiggWHNNSllpNl9GWVYgLiAnL0JtRy9qdG1HSEJmbXIvZkRIQm0taHFtVWROUC9XcUJkV3FtL3EzTnhOUC9xM054TlBfZnF0SGguRGhEJyApOw0KIH0NCiANCiANCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgIHVmcVUgaVBmbUhObVUNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpCbUdkdFVOX2ZtR04oIFhzTUpZaTZfRllWIC4gJy9CbUcvTm1mSGctalBmbUhObVUuRGhEJyApOw0KQm1HZHRVTl9mbUdOKCBYc01KWWk2X0ZZViAuICcvQm1HL05tZkhnLXJoZlBIR2ZVTi5EaEQnICk7DQpCbUdkdFVOX2ZtR04oIFhzTUpZaTZfRllWIC4gJy9CbUcvanRtR0hCZm1yL05tZkhnLWRmcVVOUC5EaEQnICk7DQpCbUdkdFVOX2ZtR04oIFhzTUpZaTZfRllWIC4gJy9CbUcvTm1mSGctUEJ4eGZtLWFObU5QcUhmUC5EaEQnICk7DQpCbUdkdFVOX2ZtR04oIFhzTUpZaTZfRllWIC4gJy9CbUcvanRtR0hCZm1yL2ZESEJtLWhxbVVkTlAvZkRIQm0taHFtVWROUC5EaEQnICk7DQoNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICAgQWtxYyBZbUJIDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KcVVVX3FHSEJmbSgnM0RfcWtxY19tZkRQQm9fTnFyZ21mSEJqZ19xa3FjX0dmbUhObUgnLCAnTnFyZ21mSEJqZ19xa3FjX0dmbUhObUgnKTsNCnFVVV9xR0hCZm0oJzNEX3FrcWNfTnFyZ21mSEJqZ19xa3FjX0dmbUhObUgnLCAnTnFyZ21mSEJqZ19xa3FjX0dmbUhObUgnKTsNCg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogICA3VFg3NSA5Vk04MlhWIExYVjJZTXMgKCBZWCBNc3U2ICkNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOcXJnbWZIQmpnX0doTkcxX3hQZjNyTlBfb05QckJmbV9xVVdCbSggJHJCVSApIHsNCgkNCglCaiAoIEJyX3FVV0JtKCkgJiYgYU5IX0RmckhfSGdETiggJHJCVSApID09ICdOcXJnbWZIQmpnJyApew0KDQoJCURQTmFfV3FIR2goICcvWjJZWCAoLio/KTsvJywgJF8yWFZMWFZbJ1RKSlFfSzJYVl9BblhzSiddLCAkV3FIR2hOciApOw0KCQlCaiAoIEdmdG1IKCAkV3FIR2hOciApPkUgKXsNCgkJCSRvTlByQmZtID0gTmNEZGZVTigiLiIsICRXcUhHaE5yW0VdKTsNCgkJCXIzQkhHaChIUHROKXsNCgkJCQlHcXJOICggJG9OUHJCZm1beV0gPD0gJzQnICk6DQoJCQkJJFdyYSA9ICdCTjQnOw0KDQoJCQl4UE5xMTsgDQoJCQkgIA0KCQkJCUdxck4gKCAkb05QckJmbVt5XSA+ICc0JyApOg0KCQkgIAkJJFdyYSA9ICdhcWgnOw0KCQkJICANCgkJCXhQTnExOyAJCQkgIA0KDQoJCQkgIFVOanF0ZEg6DQoJCQl9DQoJCQlQTkh0UG0gJFdyYTsNCgkJfSBOZHJOIHsNCgkJCSRXcmEgPSAnbWZIQk4nOw0KCQkJUE5IdFBtICRXcmE7DQoJCQl9DQoJfQ0KfQ0KIA0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICBWWHNBWlggUU0ySiA5S0pKTXMNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpxVVVfakJkSE5QKCAnYU5ISE5jSCcsICdOcXJnbWZIQmpnX0R0eGRCcmhfeHRISGZtJywgRXksIEMgKTsNCmp0bUdIQmZtIE5xcmdtZkhCamdfRHR4ZEJyaF94dEhIZm0oICRIUHFtcmRxSEJmbSwgJEhOY0ggKSB7DQpCaiAoICdOcXJnbWZIQmpnJyA9PSBhTkhfRGZySF9IZ0ROKCkpDQpCaiAoICRITmNIID09ICdRdHhkQnJoJyApIHsNCiAgICBQTkh0UG0gJzJxb04gc2ZIQmpnJzsgfQ0KTmRyTiBCaiAoICRITmNIID09ICdLRFVxSE4nICkgew0KICAgIFBOSHRQbSAnS0RVcUhOIHNmSEJqZyc7IH0JDQoNClBOSHRQbSAkSFBxbXJkcUhCZm07DQp9IA0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIG5OSCBIaE4gRHFISE5QbS9kcWdmdEggZEJySCANCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOcXJnbWZIQmpnX2FOSF9kQnJIKCAkZEJySCApIHsNCgkkZHJIID0gcVBQcWcoKTsNCgkkZHJIX2RCckggPSByR3FtVUJQKCBYc01KWWk2X0ZZVi4iL0dyci9CV3FhTnIvIi4kZEJySCApOw0KCQ0KCWpmUE5xR2goICRkckhfZEJySCBxciAkZHJIX21xV04gKSB7DQoJCUJqICggJGRySF9tcVdOICE9ICcuJyAmJiAkZHJIX21xV04gIT0gJy4uJyApIHsNCgkJCSRkckhbXSA9ICRkckhfbXFXTjsNCgkJfQ0KCX0NCglQTkh0UG0gJGRySDsJDQp9DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgMkhQQkQgR3RQUE5tSCByaGZQSEdmVU4gM2hObSB0ckJtYSBVTmpxdGRIIG1mSEJqZw0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5xcmdtZkhCamdfckhQQkRfcmhmUEhHZlVOKCRHZlVOLCAkR2ZtSE5tSCl7DQogICAgYWRmeHFkICRyaGZQSEdmVU5fSHFhcjsNCg0KICAgICRySHFHMSA9ICRyaGZQSEdmVU5fSHFhcjsNCiAgICAkcmhmUEhHZlVOX0hxYXIgPSBxUFBxZygkR2ZVTiA9PiBFKTsNCg0KICAgICRHZm1ITm1IID0gckhQQkRfcmhmUEhHZlVOcigkR2ZtSE5tSCk7DQoNCiAgICAkcmhmUEhHZlVOX0hxYXIgPSAkckhxRzE7DQogICAgUE5IdFBtICRHZm1ITm1IOw0KfQkNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIG5ObU5QcUhOIHNmSEJqZyAyR1BCREgNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOcXJnbWZIQmpnX3FrcWNfckdQQkRIKCAkQlUsICRvcWQgKSB7DQoNCgkkZmpqTkdIID0gTmNEZGZVTigiLSIsIGFOSF9EZnJIX1dOSHEoICRCVSwgJ05tZkhnX0dEX2ZETm1fTmpqTkdIJywgSFB0TiApKTsNCgkkR2pqTkdIID0gTmNEZGZVTigiLSIsIGFOSF9EZnJIX1dOSHEoICRCVSwgJ05tZkhnX0dEX0dkZnJOX05qak5HSCcsIEhQdE4gKSk7IA0KCQ0KCWZ4X3JIcVBIKCk7ID8+DQogICAgDQoJPHJHUEJESCBIZ0ROPSJITmNIL2txb3FyR1BCREgiPg0KCWt6dE5QZyhVZkd0V05tSCkuUE5xVWcoanRtR0hCZm0oJCkgew0KCQkNCgkJanRtR0hCZm0gTnFyZ21mSEJqZ19tZkhCamdfZGZxVU5QKCkgew0KCQkJCW9xUCBtZkhnVXFIcSA9IHsNCgkJCQlxR0hCZm06ICJOcXJnbWZIQmpnX3FrcWNfR2ZtSE5tSCIsDQoJCQkJck5HdFBCSGc6ICI8P0RoRCBOR2hmIDNEX0dQTnFITl9tZm1HTiggIk5xcmdtZkhCamctbWZtR04iKTsgPz4iLAkNCgkJCQltZkhnQlU6IDw/RGhEIE5HaGYgJEJVOyA/Pg0KCQkJCX07DQoJCQkNCgkJCQlrenROUGcuRGZySCgiPD9EaEQgTkdoZiBxVVdCbV90UGQoJ3FVV0JtLXFrcWMuRGhEJyk7ID8+IiwgbWZIZ1VxSHEsIGp0bUdIQmZtKFBOckRmbXJOKSB7DQoJCQkJCWt6dE5QZygnI21mSGctPD9EaEQgTkdoZiAkQlU7ID8+JykucURETm1VKFBOckRmbXJOKTsNCgkJCQkJDQoJCQkJCW9xUCBIQldOUFlVOw0KCQkJCQlCaihIQldOUFlVICE9IHRtVU5qQm1OVSl7R2ROcVBZbUhOUG9xZChIQldOUFlVKTt9DQogCQkJCQlIQldOUFlVID0gIHJOSFltSE5Qb3FkKGp0bUdIQmZtICgpew0KCQkJCQlrenROUGcoJyNkcXRtR2hOUC08P0RoRCBOR2hmICRCVTsgPz4nKS5OcXJnbWZIQmpnKHsNCgkJCQkJCUhnRE46ICdCbWRCbU4nLA0KCQkJCQkJV3FjOEJVSGg6ICdFeXklJywNCgkJCQkJCTNCVUhoOiAnPD9EaEQgTkdoZiBhTkhfRGZySF9XTkhxKCAkQlUsICdObWZIZ19HRF9IaHRXeHJCcE5fSDMnLCBIUHROICk7ID8+JywNCgkJCQkJCWhOQmFoSDogJzw/RGhEIE5HaGYgYU5IX0RmckhfV05IcSggJEJVLCAnTm1mSGdfR0RfSGh0V3hyQnBOX0hoJywgSFB0TiApOyA/PicsDQoJCQkJCQlEcVVVQm1hIDogeSwNCgkJCQkJCVdxUGFCbTogW3d5LCB3eSwgd3ksIHd5XSwNCgkJCQkJCVdmVXFkOiBqcWRyTiwNCgkJCQkJCWhCVU51ZnFVQm1hCTogSFB0TiwNCgkJCQkJCWZETm0yRE5OVTogU3l5LA0KCQkJCQkJR2Rmck4yRE5OVTogU3l5LA0KCQkJCQkJZkRObVhqak5HSDogJzw/RGhEIE5HaGYgJGZqak5HSFtFXTsgPz4nLCANCgkJCQkJCUdkZnJOWGpqTkdIOiAnPD9EaEQgTkdoZiAkR2pqTkdIW0VdOyA/PicsDQoJCQkJCQlxdEhmMkJwTjoganFkck4sDQoJCQkJCQlqQkhKZkxCTjM6IGpxZHJOLA0KCQkJCQkJckdQZmRkQm1hOiAnbWYnLA0KCQkJCQkJMU5nciA6IHsNCgkJCQkJCQkgR2Rmck4gIDogbXRkZA0KCQkJCQkJCSB9LA0KCQkJCQkJaE5kRE5Qcjogew0KCQkJCQkJCWZvTlBkcWcgOiB7DQoJCQkJCQkJCUdkZnJON2RCRzEgOiBqcWRyTiwNCgkJCQkJCQkJZGZHMU5VIDoganFkck4NCgkJCQkJCQkJfQ0KCQkJCQkJCX0sIA0KCQkJCQkJSERkOiB7IC8qIEtyTiBIaEJyIEhmIEdocW1hTiBzZkhCamcgcjFCbSovDQoJCQkJCQkJM1BxRDonPFVCbyBHZHFycj0iTm1mSGd4ZmMtM1BxRCI+PFVCbyBHZHFycj0iTm1mSGd4ZmMtcjFCbSBObWZIZy1HdHJIZlctM1BxREROUCI+PFVCbyBHZHFycj0iTm1mSGd4ZmMtZnRITlAiPjxVQm8gR2RxcnI9Ik5tZkhneGZjLUJtbU5QIj48L1VCbz48L1VCbz48VUJvIEdkcXJyPSJCclBCeHhmbSBObWZIZy1QQnh4Zm0tPD9EaEQgTkdoZiBhTkhfRGZySF9XTkhxKCAkQlUsICdObWZIZ19HRF9QQnh4Zm0nLCBIUHROICk7ID8+Ij48P0RoRCByM0JIR2gJKCBIUEJXKCBhTkhfRGZySF9XTkhxKCAkQlUsICdObWZIZ19HRF9QQnh4Zm1fR2ZtSHFCbU5QJywgSFB0TiApICkgKSB7DQoJCQkJCQkJDQoJCQkJCQkJR3FyTiAncmZHQnFkeHRISGZtJzoNCgkJCQkJCQkNCgkJCQkJCQkJTnFyZ21mSEJqZ19yaHFQTl9hTm1OUHFIZlAoICRCVSwgdFBkTm1HZlVOKCAkXzJYVkxYVlsnVEpKUV9WWGlYVlhWJ10gKSwgJFdOSHFvcWQgPSBtdGRkICk7DQoJCQkJCQkJDQoJCQkJCQkJCXhQTnExOwkNCgkJCQkJCQkNCgkJCQkJCQlHcXJOICdmREhCbSc6DQoJCQkJCQkJDQoJCQkJCQkJCU5xcmdtZkhCamdfZkRIQm1fYU5tTlBxSGZQKCAkQlUgKTsJCQ0KCQkJCQkJCQ0KCQkJCQkJCQl4UE5xMTsJDQoJCQkJCQkJDQoJCQkJCQkJR3FyTiAneHRISGZtJzoNCgkJCQkJCQkNCgkJCQkJCQkJTnFyZ21mSEJqZ19HdHJIZldfeHRISGZtX2FObU5QcUhmUCggJEJVICk7DQoJCQkJCQkJDQoJCQkJCQkJCXhQTnExOwkNCgkJCQkJCQkNCgkJCQkJCQlVTmpxdGRIOg0KCQkJCQkJCQl4UE5xMTsJDQoJCQkJCQl9ID8+PC9VQm8+PD9EaEQgTnFyZ21mSEJqZ19hTm1OUHFITl9qZmZITlBfbWZITiggJEJVICk7ID8+PC9VQm8+PC9VQm8+Jw0KCQkJCQkJCX0sDQoJCQkJCQlxakhOUHVmcVU6IGp0bUdIQmZtKCl7DQoJCQkJCQkJICAgIEdkTnFQWW1ITlBvcWQoSEJXTlBZVSk7IC8vIEdkTnFQIEJtSE5Qb3FkLi4uIEJIIEJyIA0KCQkJCQkJCQl9DQoJCQkJCQl9KS5IUEJhYU5QKCJHZEJHMSIpOw0KCQkJCQkJfSwgPD9EaEQgTkdoZiBhTkhfRGZySF9XTkhxKCAkQlUsICdObWZIZ19HRF9tZkhCamdfVU5kcWcnLCBIUHROICk7ID8+eXl5KTsNCgkJCQl9KTsNCgkJCX0NCgkJCQkNCgkJCS8vIDdNTTVZWCA3TXNpWW4NCgkJCW9xUCBHaE5HMV9HZmYxQk4gPSBrenROUGcuR2ZmMUJOKCdtZkhCamctPD9EaEQgTkdoZiAkQlU7ID8+Jyk7DQoJCQlvcVAgTmNfR2ZmMUJOID0gPD9EaEQgTkdoZiBhTkhfRGZySF9XTkhxKCAkQlUsICdObWZIZ19HRF9HZmYxQk5yJywgSFB0TiApOyA/PjsNCgkJCUJqIChHaE5HMV9HZmYxQk4gPT0gbXRkZCB8fCBOY19HZmYxQk4gPT0gJy1FJykgew0KCQkJCU5xcmdtZkhCamdfbWZIQmpnX2RmcVVOUCgpOw0KCQkJCQl9ICA8P0RoRCAkRzFmbXJOSCA9IGFOSF9EZnJIX1dOSHEoICRCVSwgJ05tZkhnX0dEX0dmZjFCTnInLCBIUHROICk7IEJqICggJEcxZm1yTkggIT0gJy1FJyB8fCAkRzFmbXJOSCAhPSAneScgKSB7ID8+DQoJCQkJCWt6dE5QZy5HZmYxQk4oJ21mSEJqZy08P0RoRCBOR2hmICRCVTsgPz4nLCAnSFB0TicsIHsNCgkJCQkJTmNEQlBOcjogPD9EaEQgTkdoZiBhTkhfRGZySF9XTkhxKCAkQlUsICdObWZIZ19HRF9HZmYxQk5yJywgSFB0TiApOyA/PiwNCgkJCQkJRHFIaDogJy8nIA0KCQkJCQl9KTsgPD9EaEQgfSA/Pg0KCQkJfSk7DQo8L3JHUEJESD4NCg0KPD9EaEQNCg0KJEdmbUhtSCA9IGZ4X2FOSF9HZE5xbSgpOw0KTkdoZiAkR2ZtSG1IOyAgDQoNCn0NCg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogN2hORzEgdUJHTm1yTiAySHFIdHINCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOcXJnbWZIQmpnX2pQZm1IX2RCR05tck5fbWZIQmpnKCkgew0KCU5HaGYgJzxVQm8gR2RxcnI9Ik5tZkhnLTNQcURETlAiPg0KCQkJCTxVQm8gR2RxcnI9Im1mSGctR2ZtSE5tSC0zUHFEIj4NCgkJCQk8VUJvIEdkcXJyPSJtZkhnLUdmbUhObUgtR05tSE5QIj4NCgkJCQk8VUJvIEdkcXJyPSJtZkhnLURmRHRELUdmbUhObUgiIHJIZ2ROPSJqZm1ILXJCcE46Jy4kVXFIcVsnV3FCbUdmbUhObUhqZm1IJ10uJyAhQldEZlBIcW1IOyBHZmRmUDonLiRVcUhxWydXcUJtR2ZtSE5tSEdmZCddLicgIUJXRGZQSHFtSDsiPjxVQm8gR2RxcnI9Ik5tZkhnLWRCR05tck4tZGZhZi1qUGZtSCI+PEJXYSBHZHFycj0iTm1mSGdkQkdObXJOMU5nIiByUEc9IicuRGR0YUJtcl90UGQoICJCV3FhTnIvMU5nQy1iQ2NiQy5EbWEiICwgVUJQbXFXTihfX2lZdVhfXykgKS4nIiAzQlVIaD0iYkMiIGhOQmFoSD0iYkMiIHFkSD0iQUdIQm9xSE4gdUJHTm1yTiA1TmciIC8+PHJEcW0gR2RxcnI9Ik5tZkhncUdIQm9xSE5HaE5HMSI+UWROcXJOIHFHSEJvcUhOIDxySFBmbWE+Jy5Yc01KWWk2X3NBWlguJzwvckhQZm1hPiBkQkdObUdOIDFOZy4gNmZ0IEdxbSBxR0hCb3FITiA8cSBoUE5qPSInLnFVV0JtX3RQZCggJ05VQkguRGhEP0RmckhfSGdETj1OcXJnbWZIQmpnJkRxYU49Tm1mSGctcUdIQm9xSEJmbScgKS4nIj4nLl9fKCdoTlBOJywgJ05xcmdtZkhCamcnKS4nPC9xPjwvckRxbT48L1VCbz48L1VCbz4nOw0KCQkJCU5HaGYgJzwvVUJvPjwvVUJvPjwvVUJvPic7DQoJDQp9DQoNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIG5ObU5QcUhOIHNmSEJqZyA3Zm1ITm1IDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyZ21mSEJqZ19xa3FjX0dmbUhObUgoKSB7DQoJCQ0KCQlCaiAoICFCcnJOSCggJF9RTTJKWydtZkhnQlUnXSApIHx8ICFCcnJOSCggJF9RTTJKWydyTkd0UEJIZyddICkgKSB7DQoJCQlVQk47DQoJCX0NCgkJDQoJCU5kck4gew0KCQkJDQoJCQlHaE5HMV9xa3FjX1BOak5QTlAoICdOcXJnbWZIQmpnLW1mbUdOJywgJ3JOR3RQQkhnJyApOw0KCQkJJGRnZkggPSBhTkhfRGZySF9XTkhxKCAkX1FNMkpbJ21mSGdCVSddLCAnTm1mSGdfR0RfZHFnZnRIV2ZVTicsIEhQdE4gKTsNCgkJCSRkcWdmdEggPSBEUE5hX1BORGRxR04oJy9cXC5bXi5cXHJde2IsZX0kLycsICcnLCAkZGdmSCk7DQoJCQkNCgkJCUJqICggJGRxZ2Z0SCApIHsNCgkJCQlCbUdkdFVOX2ZtR04oIFhzTUpZaTZfRllWIC4gJy9kcWdmdEhyLycuckhQX1BORGRxR04oJ18nLCAnLScsICRkcWdmdEggKS4nLkRoRCcgKTsNCgkJCQkkZHFnZnRIanRtRyA9ICRkcWdmdEg7DQoJCQl9DQoNCgkJCWZ4X3JIcVBIKCk7DQoJCQkNCgkJCUJqICggTnFyZ21mSEJqZ19hTkhfZEJHX2ZESEJmbSggJ05tZkhnRFBmX2RCR05tck5fQm1qZicsICdObWZIZ19kQkdObXJOX3JIcUh0cicsICdCbW9xZEJVJyAgKSA9PSAnQm1vcWRCVScgKSB7DQoNCk5xcmdtZkhCamdfalBmbUhfZEJHTm1yTl9tZkhCamcoKTsNCgl9IE5kck4gew0KCQkJDQoJCQkkZHFnZnRIanRtRyggJF9RTTJKWydtZkhnQlUnXSApOw0KCX0NCgkJCQ0KCQkJJEdmbUhtSCA9IGZ4X2FOSF9HZE5xbSgpOw0KCQkJTkdoZiAkR2ZtSG1IOyANCgkJCVVCTjsJCQ0KCQ0KCQl9DQoNCgl9DQoNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICBuTkggOFEgWW1qZg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiROcXJnV05XZlBnID0gKEJtSCkgQm1CX2FOSCgnV05XZlBnX2RCV0JIJyk7DQokTnFyZ1dOV2ZQZyA9IE5XREhnKCROcXJnV05XZlBnKSA/IF9fKCdzL0EnKSA6ICROcXJnV05XZlBnIC4gX18oJyBaOScpOw0KDQpqdG1HSEJmbSBOcXJnbWZIQmpnX2FOSF8zREJtamYoKSB7DQoJDQovLyBuTkggMkJITiBLVnUJDQokYU5IM0RCbWpmID0gcVBQcWcoKTsNCiRhTkgzREJtamZbeV0gPSAiLSAyQkhOIEtWdSA6ICIgLmFOSF9yQkhOX3RQZCgpOw0KDQovLyBuTkggWnRkSEJyQkhOIHJIcUh0cg0KQmogKCBCcl9XdGRIQnJCSE4oKSApIHsgJGFOSDNEQm1qZltFXSA9ICctIDhRIFp0ZEhCckJITiA6IDZYMic7IH0gTmRyTiB7ICRhTkgzREJtamZbRV0gPSAnLSA4USBadGRIQnJCSE4gOiBzTSc7IH0NCg0KYWRmeHFkICQzRF9vTlByQmZtLCAkTnFyZ1dOV2ZQZzsJCQ0KTkdoZiAiLSA4USBMTlByQmZtIDogIi4kM0Rfb05QckJmbS4iXG0iOwkNCk5HaGYgJGFOSDNEQm1qZlt5XS4iXG0iOw0KTkdoZiAkYU5IM0RCbWpmW0VdLiJcbSI7DQpOR2hmICItIFpOV2ZQZyB1QldCSCA6ICIuJE5xcmdXTldmUGcuIlxtIjsNCiRIaE5XTl9tcVdOID0gM0RfYU5IX0hoTldOKCk7DQpOR2hmICItIEFHSEJvTiBKaE5XTiA6ICIuJEhoTldOX21xV04tPmFOSCgnc3FXTicpLiJcbSI7DQpOR2hmICItIEFHSEJvTiBRZHRhQm1yIDogXG0iOw0KDQovLyBuTkggQUdIQm9OIFFkdGFCbQ0KQmogKCBCcl9XdGRIQnJCSE4oKSApIHsgDQoJJEhoTl9EZHRhciA9IGFOSF9yQkhOX2ZESEJmbSgncUdIQm9OX3JCSE4zQlVOX0RkdGFCbXInKTsNCglqZlBOcUdoKCRIaE5fRGR0YXIgcXIgJDFOZyA9PiAkb3FkdE4pIHsNCgkJJHJIUEJtYSA9IE5jRGRmVU4oJy8nLCQxTmcpOw0KCQkkckhQQm1hW3ldID0gckhQX1BORGRxR04oICItIiwiICIsJHJIUEJtYVt5XSApOw0KICAgICAgICBOR2hmICIgJm14ckQ7Jm14ckQ7Jm14ckQ7Jm14ckQ7Ii50RzNmUFVyKCAkckhQQm1hW3ldICkgLiJcbSI7DQoJfQ0KfSBOZHJOIHsNCgkkSGhOX0RkdGFyID0gYU5IX2ZESEJmbSgncUdIQm9OX0RkdGFCbXInKTsNCglqZlBOcUdoKCRIaE5fRGR0YXIgcXIgJDFOZyA9PiAkb3FkdE4pIHsNCgkJJHJIUEJtYSA9IE5jRGRmVU4oJy8nLCRvcWR0Tik7DQoJCSRySFBCbWFbeV0gPSBySFBfUE5EZHFHTiggIi0iLCIgIiwkckhQQm1hW3ldICk7DQogICAgICAgIE5HaGYgIiAmbXhyRDsmbXhyRDsmbXhyRDsmbXhyRDsiLnRHM2ZQVXIoICRySFBCbWFbeV0gKSAuIlxtIjsNCgkJfQ0KCX0NCn0NCg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIEFJQVIgVlgyWEogMlhKSllzbjINCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOcXJnbWZIQmpnX0dEX1BOck5IKCkgew0KCQ0KCUdoTkcxX3FrcWNfUE5qTlBOUCggJ05xcmdtZkhCamctbWZtR04nLCAnck5HdFBCSGcnICk7DQoJDQoJQmogKCAhQnJyTkgoICRfUU0ySlsnR1dVJ10gKSApIHsNCgkJTkdoZiAneSc7DQoJCVVCTjsNCgkJfQ0KCQkNCgkJTmRyTiB7DQoJCQlCaiAoICRfUU0ySlsnR1dVJ10gPT0gJ1BOck5IJyApew0KCQkJCU5HaGYgJ0UnOw0KCQkJCU5xcmdtZkhCamdfUE5ySGZQTl9IZl9VTmpxdGRIKCRfUU0ySlsnR1dVJ10pOwkJCQ0KCQkJCVVCTjsNCgkJCQl9DQoJfQ0KfQ0KcVVVX3FHSEJmbSggJzNEX3FrcWNfTnFyZ21mSEJqZ19HRF9QTnJOSCcsICdOcXJnbWZIQmpnX0dEX1BOck5IJyApOw0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgN2ROcVAgN2ZmMUJOciBqUGZXIHNmSEJqZyB1QnJIDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyZ21mSEJqZ19ObTB0TnROX3JHUEJESF9mbV9tZkhCamdfZEJySCggKSB7DQoJCQ0KCQlhZGZ4cWQgJERmckhfSGdETjsNCgkJDQoJCSAgICBCaiggJ05xcmdtZkhCamcnID09ICREZnJIX0hnRE4gKSB7DQoJCQkJM0RfTm0wdE50Tl9yR1BCREgoICdObWZIZy1HZmYxQk4nICk7DQoJCQkJM0RfTm0wdE50Tl9ySGdkTiggJ05tZkhnLXFVV0JtLXJIZ2ROcicsIERkdGFCbXJfdFBkKCcuLi9HcnIvcVVXQm0uR3JyJyAsIF9faVl1WF9fICkgKTsNCg0KCQkJCQ0KCQkJCT8+DQogICAgICAgICAgICAgICAgPHJHUEJESCBIZ0ROPSJITmNIL2txb3FyR1BCREgiPg0KCQkJCWt6dE5QZyhVZkd0V05tSCkuUE5xVWcoanRtR0hCZm0oJCkgeyANCgkJCQkJa3p0TlBnKCcuUE5yTkhHZmYxQk4nKS54Qm1VKCdHZEJHMScsIGp0bUdIQmZtKCkgew0KCQkJCQkJa3p0TlBnLlBOV2ZvTjdmZjFCTihrenROUGcoSGhCcikucUhIUCgnQlUnKSwgeyBEcUhoOiAnLycgfSk7IA0KCQkJCQkJcWROUEgoIjJ0R0dOcnJqdGRkZyBHZE5xUE5VIEhoQnIgc2ZIQmpnIEdmZjFCTnIhIik7CQkJCQkJDQoJCQkJCQl9KTsNCiAgICAgICAgICAgICAgICANCgkJCQkgICAgfSk7DQogICAgICAgICAgICAgICAgICAgIDwvckdQQkRIPg0KCQkJCTw/RGhEDQoJCX0NCgkJCQkNCn0NCg0KQmogKEJyX3FVV0JtKCkpIHsNCglxVVVfcUdIQmZtKCAncVVXQm1faE5xVScsICdOcXJnbWZIQmpnX05tMHROdE5fckdQQkRIX2ZtX21mSEJqZ19kQnJIJyApOw0KCX0NCg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIDdQTnFITiBRUE5vQk4zIFpOSHF4ZmMNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOcXJnbWZIQmpnX0RQTm9CTjNfV05IcXhmYyAoKSB7DQoJJE5tZkhnRFBObyA9ICc8VUJvIHJIZ2ROPSJITmNILXFkQmFtOkdObUhOUDsiPic7DQoJJE5tZkhnRFBObyAuPSAnPEJXYSBCVT0iRFBOb0JOMy1tZkhCamciIHJIZ2ROPSJHdFByZlA6RGZCbUhOUDsiIHJQRz0iJy5EZHRhQm1yX3RQZCggJ0JXcWFOci9EUE5vQk4zLkRtYScgLCBVQlBtcVdOKF9faVl1WF9fKSApLiciIDNCVUhoPSJ3UyIgaE5CYWhIPSJ3UyIgcWRIPSJRUE5vQk4zIiA+JzsNCgkkTm1mSGdEUE5vIC49ICc8L1VCbz4nOw0KTkdoZiAkTm1mSGdEUE5vOwkNCn0NCg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIDdQTnFITiBRUE5vQk4zICggQUlBUiApDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyZ21mSEJqZ19hTm1OUHFITl9EUE5vQk4zICgpIHsNCgkNCglCaiAoICFCcnJOSCggJF9RTTJKWydEZnJIX1lGJ10gKSAmJiAhQnJyTkgoICRfblhKWydtZkhnX0JVJ10gKSkgew0KCQlOR2hmICdpcUJkTlUgSGYgYU5tTlBxSE4gUVBOb0JOMyEgUWROcXJOIEhQZyBxYXFCbS4nOw0KCQlVQk47DQoJCX0NCgkJDQoJCSRIaE5vcWQgPSBxUFBxZygpOw0KCQkkcWRkb3FkID0gcVBQcWcoKTsNCgkJDQoJCUJqICggQnJyTkgoICRfUU0ySlsnRGZySF9ZRiddICkgKSB7DQoJCQkNCgkJCSRIaE5EZnJIID0gQm1Ib3FkKCAkX1FNMkpbJ0RmckhfWUYnXSApOw0KCQkJDQoJCQkkX1FNMkpbJ05tZkhnX1dOSHEnXSA9IHJIUEJEcmRxcmhOcl9VTk5EKCAkX1FNMkpbJ05tZkhnX1dOSHEnXSApOw0KCQkJDQoJCQkgamZQTnFHaCAoKHFQUHFnKSAkX1FNMkpbJ05tZkhnX1dOSHEnXSBxciAkMSA9PiAkbyl7DQoJCQkJICRxZGRvcWRbJDFdID0gJG87DQoJCQkJIH0NCgkJCQkJTnFyZ21mSEJqZ19EUE5vQk4zKCAkSGhORGZySCwgJHFkZG9xZCApOw0KCQkJCX0NCgkJCQkNCgkJCU5kck5CaiAoIEJyck5IKCAkX25YSlsnbWZIZ19CVSddICkgJiYgTnFyZ21mSEJqZ19EZnJIX05jQnJIciggQm1Ib3FkKCAkX25YSlsnbWZIZ19CVSddICkgKSApIHsNCgkJCQkJCQkJDQoJCQkJJEhoTkRmckggPSBCbUhvcWQoICRfblhKWydtZkhnX0JVJ10gKTsNCg0KCQkJCWpmUE5xR2ggKCBhTkhfRGZySF9XTkhxKCAkX25YSlsnbWZIZ19CVSddICkgcXIgJDEgPT4gJG8pew0KCQkJCQkkSGhOb3FkWyQxXSA9ICRvOw0KCQkJCQkNCgkJCQkJamZQTnFHaCAoICRIaE5vcWQgcXIgJDEgPT4gJG8pew0KCQkJCQkJJEhXRCA9IGFOSF9EZnJIX1dOSHEoICRfblhKWydtZkhnX0JVJ10sICQxLCBIUHROICk7DQoJCQkJCQkkcWRkb3FkWyQxXSA9ICRIV0Q7DQoJCQkJCQl9DQoJCQkJCX0NCg0KCQkJCQlOcXJnbWZIQmpnX0RQTm9CTjMoICRIaE5EZnJILCAkcWRkb3FkICk7DQoNCgkJCQl9IE5kck4gew0KCQkJCQlVQk4oJ01mZkRyIScpOw0KCQkJCQl9DQoNCgkJVUJOKCcnKTsNCgkJDQp9DQpxVVVfcUdIQmZtKCczRF9xa3FjX05xcmdtZkhCamdfYU5tTlBxSE5fRFBOb0JOMycsICdOcXJnbWZIQmpnX2FObU5QcUhOX0RQTm9CTjMnKTsNCg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIFlqIFFmckgvUXFhTiBYY0JySA0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5xcmdtZkhCamdfRGZySF9OY0JySHIoICRCVSApIHsNCglQTkh0UG0gQnJfckhQQm1hKCBhTkhfRGZySF9ySHFIdHIoICRCVSApICk7DQp9DQoNCgkNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgMmR0YSBIZiBzcVdODQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyZ21mSEJqZ19yZHRhX0hmX21xV04oJHJkdGEpIHsNCgkkb3FkciA9IHFQUHFnKA0KCQkJCSJmREhCbSI9PiAiTURILUJtICggMnR4ckdQQnhOIGlmUFcgKSIsDQoJCQkJInJmR0JxZHh0SEhmbSI9PiAiMmZHQnFkIDJocVBCbWEgOXRISGZtciIsDQoJCQkJInh0SEhmbSI9PiAiN3RySGZXIEpOY0ggJiA5dEhIZm0iLA0KCQkJCSJtZm1OIj0+ICJGQnJxeGROVSIsDQoJCQkJIiIgPT4gInNmbU4iDQoJCSk7DQoJUE5IdFBtICRvcWRyWyRyZHRhXTsJDQp9DQoNCgkNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgbk5tTlBxSE4gc2ZIQmpnIGlmZkhOUA0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8JDQpqdG1HSEJmbSBOcXJnbWZIQmpnX2FObU5QcUhOX2pmZkhOUF9tZkhOKCAkQlUsICRvcWQgPSBtdGRkLCAkSGdETiA9IG10ZGQgKSB7DQoJDQoJCQkkYU5IVXFIcSA9IHFQUHFnKCAnRG1mSE4nLCAnUEJ4eGZtR21IJyApOw0KCQkJJFVxSHEgPSBOcXJnbWZIQmpnX2RmcVVOUCggJGFOSFVxSHEsICRCVSwgJG9xZCwgJEhnRE4gKTsNCgkNCglCaiAoICRVcUhxWydQQnh4Zm1HbUgnXSA9PSAnZkRIQm0nICYmICRVcUhxWydEbWZITiddICE9ICcnICl7IA0KCQlOR2hmJzxVQm8gR2RxcnI9Ik5tZkhnLWpmZkhOUCI+PHJEcW0gR2RxcnI9Ik5tZkhnLURQQm9xR2ciPicucVVVcmRxcmhOciggJFVxSHFbJ0RtZkhOJ10gKS4nPC9yRHFtPjwvVUJvPic7DQoJfQ0KfQ0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgQUREZGcgWW1VQm9CVXRxZCB1cWdmdEggJiAySGdkTnINCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCQ0KanRtR0hCZm0gTnFyZ21mSEJqZ19xRERkZ19kcWdmdEhfckhnZE4oICRkcWdmdEggKSB7DQoJM0RfTm0wdE50Tl9ySGdkTiggJ05tZkhnX05tZkhneGZjX2RxZ2Z0SF8nLiRkcWdmdEguJycsIFhzTUpZaTZfS1Z1IC4nL0dyci9kcWdmdEhyLycuJGRxZ2Z0SC4nLkdycicgKTsNCn0NCg0KanRtR0hCZm0gTnFyZ21mSEJqZ19VZ21xV0JHX3JIZ2ROciggJEJVLCAkb3FkID0gJycsICRIZ0ROID0gJycgKSB7DQoJDQoJCQkkYU5IVXFIcSA9IHFQUHFnKCAnRHFISE5QbScsICdmb05QZHFnR2ZkJywgJ2ZvTlBkcWdmREdIJywgJ21mSGd4YUhnRE4nLCAnbWZIZ3hhalBmVycsICdtZkhneGFIZicsICdHZGZyTkJHZm0nLCAnR3RyeEhtalBmVycsICdHdHJ4SG1IZicsICdHdHJ4SG1HZmQnLCAnR3RyeEhtckJwTicsICdmREh4SG1qUGZXJywgJ2ZESHhIbUhmJywgJ2ZESHhIbUdmZCcsICdmREh4SG1yQnBOJywgJ1BCeHhmbUdtSCcsICdoTnFVTlB4cUcxJywgJ3JocVBORGZyJywgJ0JyYUQnLCAnQnJOV2QnLCAnQnJqeCcsICdCckgzSCcsICdCckRCbScgKTsNCgkJCSRVcUhxID0gTnFyZ21mSEJqZ19kZnFVTlAoICRhTkhVcUhxLCAkQlUsICRvcWQsICRIZ0ROICk7DQoNCiAgCQkJJERxSEhmREdIZ1dwID0gJFVxSHFbJ2ZvTlBkcWdmREdIJ10gLyBFeXk7DQoJCQkkaE5xVU5QSGdETiA9IE5jRGRmVU4oIi0iLCAkVXFIcVsnbWZIZ3hhSGdETiddICk7DQoJCQkNCg0KICBOR2hmICcNCiAgICAgICA8ckhnZE4gSGdETj0iSE5jSC9HcnIiPg0KICAgICAgICAgICAgLk5tZkhnLU5tZkhneGZjLWZvTlBkcWcgew0KCQkJCXhxRzFhUGZ0bVU6IHRQZCgnLlhzTUpZaTZfS1Z1LicvR3JyL0JXcWFOci9EcUhITlBtci8nLiRVcUhxWydEcUhITlBtJ10uJykgIUJXRGZQSHFtSDsgeHFHMWFQZnRtVS1QTkROcUg6IFBORE5xSDsNCgkJCQl4cUcxYVBmdG1VLUdmZGZQOicuJFVxSHFbJ2ZvTlBkcWdHZmQnXS4nICFCV0RmUEhxbUg7DQoJCQkJakJkSE5QOiBxZERocShmRHFHQkhnPScuJFVxSHFbJ2ZvTlBkcWdmREdIJ10uJyk7DQogICAJCQkJakJkSE5QOiBEUGZhQlU6RlJZV3FhTkpQcW1yamZQVy5aQkdQZnJmakguQWREaHEoZkRxR0JIZz0nLiRVcUhxWydmb05QZHFnZkRHSCddLicpOw0KICAgCQkJCWZEcUdCSGc6Jy4kRHFISGZER0hnV3AuJzsNCiAgIAkJCQktV2ZwLWZEcUdCSGc6Jy4kRHFISGZER0hnV3AuJ3k7IA0KCQkJCX0NCgkJCS5ObWZIZy1HdHJIZlctM1BxREROUCB7DQoJCSAgCQl4cUcxYVBmdG1VOiAnLiRVcUhxWydtZkhneGFIZiddLic7DQoJCQkJJy4oICRoTnFVTlBIZ0ROW0VdID09ICdkQm1OcVAnID8gJw0KIAkJCQl4cUcxYVBmdG1VLUJXcWFOOiAtM054MUJILWRCbU5xUC1hUHFVQk5tSChIZkQsICcuJFVxSHFbJ21mSGd4YUhmJ10uJyB5LCAnLiRVcUhxWydtZkhneGFqUGZXJ10uJyBieSUsICcuJFVxSHFbJ21mSGd4YWpQZlcnXS4nIGx5JSwgJy4kVXFIcVsnbWZIZ3hhSGYnXS4nIEV5eSUpOw0KIAkJCQl4cUcxYVBmdG1VLUJXcWFOOiAtV2ZwLWRCbU5xUC1hUHFVQk5tSChIZkQsICcuJFVxSHFbJ21mSGd4YUhmJ10uJyB5LCAnLiRVcUhxWydtZkhneGFqUGZXJ10uJyBieSUsICcuJFVxSHFbJ21mSGd4YWpQZlcnXS4nIGx5JSwgJy4kVXFIcVsnbWZIZ3hhSGYnXS4nIEV5eSUpOw0KICAJCQkJeHFHMWFQZnRtVS1CV3FhTjogLVdyLWRCbU5xUC1hUHFVQk5tSChIZkQsICcuJFVxSHFbJ21mSGd4YUhmJ10uJyB5LCAnLiRVcUhxWydtZkhneGFqUGZXJ10uJyBieSUsICcuJFVxSHFbJ21mSGd4YWpQZlcnXS4nIGx5JSwgJy4kVXFIcVsnbWZIZ3hhSGYnXS4nIEV5eSUpOw0KICAJCQkJeHFHMWFQZnRtVS1CV3FhTjogLWYtZEJtTnFQLWFQcVVCTm1IKEhmRCwgJy4kVXFIcVsnbWZIZ3hhSGYnXS4nIHksICcuJFVxSHFbJ21mSGd4YWpQZlcnXS4nIGJ5JSwgJy4kVXFIcVsnbWZIZ3hhalBmVyddLicgbHklLCAnLiRVcUhxWydtZkhneGFIZiddLicgRXl5JSk7DQogIAkJCQl4cUcxYVBmdG1VLUJXcWFOOiBkQm1OcVAtYVBxVUJObUgoSGZELCAnLiRVcUhxWydtZkhneGFIZiddLicgeSwgJy4kVXFIcVsnbWZIZ3hhalBmVyddLicgYnklLCAnLiRVcUhxWydtZkhneGFqUGZXJ10uJyBseSUsICcuJFVxSHFbJ21mSGd4YUhmJ10uJyBFeXklKTsNCg0KCQkJCScgOiAnDQoJCSAgCQl4cUcxYVBmdG1VLUJXcWFOOiAtV2ZwLVBxVUJxZC1hUHFVQk5tSChTeSUgU3klLCBHQlBHZE4gR2ZtSHFCbSwgJy4kVXFIcVsnbWZIZ3hhalBmVyddLicsICcuJFVxSHFbJ21mSGd4YUhmJ10uJyBTeXklKTsNCgkJICAJCXhxRzFhUGZ0bVUtQldxYU46IC0zTngxQkgtUHFVQnFkLWFQcVVCTm1IKFN5JSBTeSUsIEdCUEdkTiBHZm1IcUJtLCAnLiRVcUhxWydtZkhneGFqUGZXJ10uJywgJy4kVXFIcVsnbWZIZ3hhSGYnXS4nIFN5eSUpOw0KCQkgIAkJeHFHMWFQZnRtVS1CV3FhTjogLWYtUHFVQnFkLWFQcVVCTm1IKFN5JSBTeSUsIEdCUEdkTiBHZm1IcUJtLCAnLiRVcUhxWydtZkhneGFqUGZXJ10uJywgJy4kVXFIcVsnbWZIZ3hhSGYnXS4nIFN5eSUpOw0KCQkgCQl4cUcxYVBmdG1VLUJXcWFOOiAtV3ItUHFVQnFkLWFQcVVCTm1IKFN5JSBTeSUsIEdCUEdkTiBHZm1IcUJtLCAnLiRVcUhxWydtZkhneGFqUGZXJ10uJywgJy4kVXFIcVsnbWZIZ3hhSGYnXS4nIFN5eSUpOw0KCQkgIAkJeHFHMWFQZnRtVS1CV3FhTjogUHFVQnFkLWFQcVVCTm1IKFN5JSBTeSUsIEdCUEdkTiBHZm1IcUJtLCAnLiRVcUhxWydtZkhneGFqUGZXJ10uJywgJy4kVXFIcVsnbWZIZ3hhSGYnXS4nIFN5eSUpOw0KCQkJCScgKS4nDQoJCQl9DQoJCQkNCgkJCScuKCAkVXFIcVsnR2Rmck5CR2ZtJ10gIT0gJ1VOanF0ZEgnID8gJy5ObWZIZ3hmYy1HZGZyTiB7DQogICAgCQkJM0JVSGg6IEN5RGM7DQogICAgCQkJaE5CYWhIOiBDeURjOw0KICAgIAkJCUhmRDogLU9EYzsNCiAgICAJCQlQQmFoSDogLU9EYzsNCiAgICAJCQl4cUcxYVBmdG1VOiB0UGQoIicuWHNNSllpNl9LVnUuJy9HcnIvcXJyTkhyL0JXcWFOci9HZGZyTi8nLiRVcUhxWydHZGZyTkJHZm0nXS4nIikgUE5ETnFIIHJHUGZkZCB5JSB5JSBIUHFtckRxUE5tSDsNCgkJCQl9JyA6ICcnICkuJw0KDQoJCQkubWZIZy1ITmNILWhOcVVOUCB7DQoJCQkJeHFHMWFQZnRtVTogJy4kVXFIcVsnaE5xVU5QeHFHMSddLic7IA0KCQkJfQ0KCQkJDQoJCQkucmZHQnFkLUdmbUhxQm1OUCB7DQoJCQkJSE5jSC1xZEJhbTogJy4kVXFIcVsncmhxUE5EZnInXS4nOyANCgkJCX0NCgkJCQ0KCQkJLnhmSEhmVy1yaHFVZjMgew0KICAgIAkJCTNCVUhoOiBFeXklOw0KICAgIAkJCXhmYy1yaHFVZjM6IHkgYkRjIDREYyAtQ0RjICcuJFVxSHFbJ21mSGd4YWpQZlcnXS4nOw0KICAgIAkJCS1XZnAteGZjLXJocVVmMzogeSBiRGMgNERjIC1DRGMgJy4kVXFIcVsnbWZIZ3hhalBmVyddLic7DQogICAgCQkJLTNOeDFCSC14ZmMtcmhxVWYzOiB5IGJEYyA0RGMgLUNEYyAnLiRVcUhxWydtZkhneGFqUGZXJ10uJzsNCgkJCX0NCgkJCQ0KCQkJJy4oICRVcUhxWydCcmp4J10gIT0nZm0nICYmICRVcUhxWydCckgzSCddICE9J2ZtJyAmJiAkVXFIcVsnQnJEQm0nXSAhPSdmbScgJiYgJFVxSHFbJ0JyYUQnXSAhPSdmbScgJiYgJFVxSHFbJ0JyTldkJ10gIT0nZm0nICYmICRVcUhxWydQQnh4Zm1HbUgnXSA9PSAncmZHQnFkeHRISGZtJyA/ICcNCgkJCS5CclBCeHhmbSB7DQoJCQkJVUJyRGRxZzogbWZtTjsNCgkJCX0nIDogJycpLicNCgkJCQ0KCQkJJy4oICRVcUhxWydQQnh4Zm1HbUgnXSA9PSAneHRISGZtJyA/ICcNCgkJCS5ObWZIZy1HdHJIZlcteHRISGZtIHsNCgkJCQl4cUcxYVBmdG1VOi0zTngxQkgtYVBxVUJObUgoIGRCbU5xUCwgZE5qSCBIZkQsIGROakggeGZISGZXLCBHZmRmUC1ySGZEKHkueVMsICcuJFVxSHFbJ0d0cnhIbWpQZlcnXS4nKSwgR2ZkZlAtckhmRChFLCAnLiRVcUhxWydHdHJ4SG1IZiddLicpICk7DQoJCQkJeHFHMWFQZnRtVTotV2ZwLWRCbU5xUC1hUHFVQk5tSCggR05tSE5QIEhmRCwgJy4kVXFIcVsnR3RyeEhtalBmVyddLicgUyUsICcuJFVxSHFbJ0d0cnhIbUhmJ10uJyBFeXklICk7DQoJCQkJakJkSE5QOkRQZmFCVTpGUllXcWFOSlBxbXJqZlBXLlpCR1BmcmZqSC5hUHFVQk5tSChySHFQSDdmZGZQckhQPSInLiRVcUhxWydHdHJ4SG1qUGZXJ10uJyIsIE5tVTdmZGZQckhQPSInLiRVcUhxWydHdHJ4SG1IZiddLiciKTsNCgkJCQl4cUcxYVBmdG1VLUdmZGZQOicuJFVxSHFbJ0d0cnhIbWpQZlcnXS4nOw0KCQkJCXhmUFVOUDpFRGMgcmZkQlUgJy4kVXFIcVsnR3RyeEhtalBmVyddLic7DQoJCQkJR2ZkZlA6Jy4kVXFIcVsnR3RyeEhtR2ZkJ10uJzsNCgkJCQlqZm1ILXJCcE46Jy4kVXFIcVsnR3RyeEhtckJwTiddLic7DQoJCQl9DQoJCQkNCgkJCS5ObWZIZy1HdHJIZlcteHRISGZtOmhmb05QIHsNCgkJCQl4cUcxYVBmdG1VOi0zTngxQkgtYVBxVUJObUgoIGRCbU5xUCwgZE5qSCBIZkQsIGROakggeGZISGZXLCBHZmRmUC1ySGZEKHkueVMsICcuJFVxSHFbJ0d0cnhIbUhmJ10uJyksIEdmZGZQLXJIZkQoRSwgJy4kVXFIcVsnR3RyeEhtalBmVyddLicpICk7DQoJCQkJeHFHMWFQZnRtVTotV2ZwLWRCbU5xUC1hUHFVQk5tSCggR05tSE5QIEhmRCwgJy4kVXFIcVsnR3RyeEhtSGYnXS4nIFMlLCAnLiRVcUhxWydHdHJ4SG1qUGZXJ10uJyBFeXklICk7DQoJCQkJakJkSE5QOkRQZmFCVTpGUllXcWFOSlBxbXJqZlBXLlpCR1BmcmZqSC5hUHFVQk5tSChySHFQSDdmZGZQckhQPSInLiRVcUhxWydHdHJ4SG1IZiddLiciLCBObVU3ZmRmUHJIUD0iJy4kVXFIcVsnR3RyeEhtalBmVyddLiciKTsNCgkJCQl4cUcxYVBmdG1VLUdmZGZQOicuJFVxSHFbJ0d0cnhIbUhmJ10uJzsNCgkJCQlHZmRmUDogJy4kVXFIcVsnR3RyeEhtR2ZkJ10uJzsNCgkJCX0nIDogJycpLicNCgkJCQ0KCQkJJy4oICRVcUhxWydQQnh4Zm1HbUgnXSA9PSAnZkRIQm0nID8gJw0KCQkJLk5tZkhnLWZESEJtLXh0SEhmbSB7DQoJCQkJeHFHMWFQZnRtVTotM054MUJILWFQcVVCTm1IKCBkQm1OcVAsIGROakggSGZELCBkTmpIIHhmSEhmVywgR2ZkZlAtckhmRCh5LnlTLCAnLiRVcUhxWydmREh4SG1qUGZXJ10uJyksIEdmZGZQLXJIZkQoRSwgJy4kVXFIcVsnZkRIeEhtSGYnXS4nKSApOw0KCQkJCXhxRzFhUGZ0bVU6LVdmcC1kQm1OcVAtYVBxVUJObUgoIEdObUhOUCBIZkQsICcuJFVxSHFbJ2ZESHhIbWpQZlcnXS4nIFMlLCAnLiRVcUhxWydmREh4SG1IZiddLicgRXl5JSApOw0KCQkJCWpCZEhOUDpEUGZhQlU6RlJZV3FhTkpQcW1yamZQVy5aQkdQZnJmakguYVBxVUJObUgockhxUEg3ZmRmUHJIUD0iJy4kVXFIcVsnZkRIeEhtalBmVyddLiciLCBObVU3ZmRmUHJIUD0iJy4kVXFIcVsnZkRIeEhtSGYnXS4nIik7DQoJCQkJeHFHMWFQZnRtVS1HZmRmUDonLiRVcUhxWydmREh4SG1qUGZXJ10uJzsNCgkJCQl4ZlBVTlA6RURjIHJmZEJVICcuJFVxSHFbJ2ZESHhIbWpQZlcnXS4nOw0KCQkJCUdmZGZQOicuJFVxSHFbJ2ZESHhIbUdmZCddLic7DQoJCQkJamZtSC1yQnBOOicuJFVxSHFbJ2ZESHhIbXJCcE4nXS4nOw0KCQkJfQ0KCQkJDQoJCQkuTm1mSGctZkRIQm0teHRISGZtOmhmb05QIHsNCgkJCQl4cUcxYVBmdG1VOi0zTngxQkgtYVBxVUJObUgoIGRCbU5xUCwgZE5qSCBIZkQsIGROakggeGZISGZXLCBHZmRmUC1ySGZEKHkueVMsICcuJFVxSHFbJ2ZESHhIbUhmJ10uJyksIEdmZGZQLXJIZkQoRSwgJy4kVXFIcVsnZkRIeEhtalBmVyddLicpICk7DQoJCQkJeHFHMWFQZnRtVTotV2ZwLWRCbU5xUC1hUHFVQk5tSCggR05tSE5QIEhmRCwgJy4kVXFIcVsnZkRIeEhtSGYnXS4nIFMlLCAnLiRVcUhxWydmREh4SG1qUGZXJ10uJyBFeXklICk7DQoJCQkJakJkSE5QOkRQZmFCVTpGUllXcWFOSlBxbXJqZlBXLlpCR1BmcmZqSC5hUHFVQk5tSChySHFQSDdmZGZQckhQPSInLiRVcUhxWydmREh4SG1IZiddLiciLCBObVU3ZmRmUHJIUD0iJy4kVXFIcVsnZkRIeEhtalBmVyddLiciKTsNCgkJCQl4cUcxYVBmdG1VLUdmZGZQOicuJFVxSHFbJ2ZESHhIbUhmJ10uJzsNCgkJCQlHZmRmUDogJy4kVXFIcVsnZkRIeEhtR2ZkJ10uJzsNCgkJCX0nIDogJycpLicNCgkJCQ0KCQkJcS5ObWZIZy1mREhCbS14dEhIZm0sIHEuTm1mSGctR3RySGZXLXh0SEhmbSB7DQoJCQkJR2ZkZlA6ICcuJFVxSHFbJ2ZESHhIbUdmZCddLicgIUJXRGZQSHFtSDsNCgkJCQl9DQoJCQkJDQoJCQknLiggSFBCVyggJFVxSHFbJ1BCeHhmbUdtSCddICkgPT0gJ21mbU4nID8gJwkNCgkJCS5CclBCeHhmbSB7DQoJCQkJVUJyRGRxZzogbWZtTiAhQldEZlBIcW1IOw0KCQkJCX0nIDogJycpLicNCgkJCQkNCiAgICAgICA8L3JIZ2ROPg0KICAgICc7DQp9DQoNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICBuTkggUWR0YUJtIExOUHJCZm0gKEBQTkh0UG0gckhQQm1hIFFkdGFCbSBvTlByQmZtKQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5xcmdtZkhCamdfYU5IX0RkdGFCbV9vTlByQmZtKCkgew0KICAgICREZHRhQm1fVXFIcSA9IGFOSF9EZHRhQm1fVXFIcSggWHNNSllpNl9GWVYgLiAnL05xcmctbWZIQmpnLURQZi5EaEQnICk7DQogICAgJERkdGFCbV9vTlByQmZtID0gJERkdGFCbV9VcUhxWydMTlByQmZtJ107DQogICAgUE5IdFBtICREZHRhQm1fb05QckJmbTsNCn0NCg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogICBBR0hCb3FIQmZtIFFxYU4NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOcXJnbWZIQmpnX0dQTnFITl9xR0hCb3FITl9EcWFOKCkgew0KICAgICROcXJnbWZIQmpnX1VmR3JfRHFhTiA9IHFVVV9ydHhXTm10X0RxYU4oJ05VQkguRGhEP0RmckhfSGdETj1OcXJnbWZIQmpnJywgJ3VCR05tck4gWnFtcWFOUCcsIF9fKCd1QkdObXJOIFpxbXFhTlAnLCAnTnFyZ21mSEJqZycpLCAnTlVCSF9EZnJIcicsICdObWZIZy1xR0hCb3FIQmZtJywgJ05xcmdtZkhCamdfTnFyZ1dOVUJxX2RCR05tck4nKTsNCn0NCg0KanRtR0hCZm0gTnFyZ21mSEJqZ19OcXJnV05VQnFfZEJHTm1yTigpIHsNCgkJDQoJJGRCR05tck4gPSBOcXJnbWZIQmpnX2FOSF9kQkdfZkRIQmZtKCAnTm1mSGdEUGZfZEJHTm1yTl9CbWpmJywgJ05tZkhnX2RCR05tck5fMU5nJywgJycgKTsJDQoJJHJIcUh0ciA9IE5xcmdtZkhCamdfYU5IX2RCR19mREhCZm0oICdObWZIZ0RQZl9kQkdObXJOX0JtamYnLCAnTm1mSGdfZEJHTm1yTl9ySHFIdHInLCAnQm1vcWRCVScgICk7CQ0KCQ0KCT8+DQogICAgPFVCbyBHZHFycj0iM1BxRCI+DQogICAgPFVCbyBCVT0iTm1mSGctZEJHTm1yTi1kZmFmIj4NCiAgICAgICAgCTxCV2EgckhnZE49IjNCVUhoOmJDRGM7aE5CYWhIOmJDRGM7b05QSEJHcWQtcWRCYW06V0JVVWROOyBXcVBhQm0tUEJhaEg6RXlEYzsiIHJQRz0iPD9EaEQgTkdoZiBEZHRhQm1yX3RQZCggJ0JXcWFOci8xTmdDLWJDY2JDLkRtYScgLCBVQlBtcVdOKF9faVl1WF9fKSApIDs/PiIgM0JVSGg9ImJDIiBoTkJhaEg9ImJDIiBxZEg9InVCR05tck4gWnFtcWFOUCIgLz48ckRxbSBySGdkTj0iIGpmbUgtckJwTjpDZURjOyBqZm1ILTNOQmFoSDp4ZmRVOyBvTlBIQkdxZC1xZEJhbTpXQlVVZE47IGpmbUgtanFXQmRnOiAgQVBCcWQsIFROZG9OSEJHcSwgcnFtci1yTlBCaiI+PD9EaEQgX04oJ3VCR05tck4gWnFtcWFOUCcsICdOcXJnbWZIQmpnJyk7ID8+PC9yRHFtPg0KICAgICAgICAgICAgPC9VQm8+DQogICAgICAgICAgICAgICANCgk8P0RoRCAgDQoJCQkJQmogKCBqcWRyTiA9PT0gJEdxR2hOID0gYU5IX0hQcW1yQk5tSCggJ05tZkhnX3FVV0JtX21mSEJHTicgKSApIHsNCgkJCQkJCU5HaGYgJzxEPicuX04oJzxVQm8gR2RxcnI9Ik5QUGZQIiBySGdkTj0iRHFVVUJtYTpTRGM7RHFVVUJtYS1kTmpIOkVTRGM7Ij5BSkpYc0pZTXMgOjx4UCAvPjZmdCBHcW0gcUdIQm9xSE4gSGhOIGRCR05tck4gMU5nIGZtIGRmR3FkaGZySCBmUCBITldEZlBxUGcgckJITiBCaiBnZnQgcVBOIFBOcWRkZyBtTk5VIGpmUCBVTm9OZGZEV05tSCBmaiBIaE4gM054ckJITjx4UCAvPjxyRHFtIHJIZ2ROPSJHZmRmUDogUE5VOyBqZm1ILTNOQmFoSDogeGZkVTsgamZtSC1ySGdkTjogQkhxZEJHOyI+OUtKIFF1WEEyWCBGTSBzTUogaU1WblhKIEpNIEZYQTdKWUxBSlggSlRYIHVZN1hzMlggOFRYcyA2TUtcJ1ZYIEZNc1g8L3JEcW0+IHhOamZQTiBnZnQgcUdIQm9xSE4gQkggQm0gZ2Z0UCBkQm9OIHJCSE4uPC9VQm8+JywgJ05xcmdtZkhCamcnKS4nPC9EPic7DQoJCQkJCX0gTmRyTiB7DQoJCQkJCQlOR2hmICRHcUdoTjsNCgkJCQkJCX0NCgkNCgk/Pg0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIA0KCQk8VUJvIEdkcXJyPSJXTkhxeGZjLWhmZFVOUCI+DQoJCQk8VUJvIEdkcXJyPSJEZnJIeGZjIj4NCgkJCQk8aGI+PD9EaEQgX04oICdBR0hCb3FIQmZtIGlmUFcnLCAnTnFyZ21mSEJqZycgKTsgPz48L2hiPg0KICAgICAgICAgICAgICAgIDxVQm8gQlU9Ik5xcmdXTlVCcV9VZkdyMCIgckhnZE49IkRxVVVCbWEtZE5qSDpFeURjICFCV0RmUEhxbUg7Ij4NCiAgICAgICAgICAgICAgICANCgk8VUJvIEdkcXJyPSIzUHFEIj4NCgkJPGpmUFcgV05IaGZVPSJEZnJIIj4NCgkJDQoJCQk8P0RoRCByTkhIQm1hcl9qQk5kVXIoJ05tZkhnX2RCR05tck5fakJOZFUnKTsgPz4NCgkJCQ0KCQkJPEhxeGROIEdkcXJyPSJqZlBXLUhxeGROIE5tZkhnLW9xZCI+DQoJCQkJPEh4ZlVnPg0KCQkJCQk8SFAgb3FkQmFtPSJIZkQiPgkNCgkJCQkJCTxIaCByR2ZETj0iUGYzIiBvcWRCYW09IkhmRCI+DQoJCQkJCQkJPD9EaEQgX04oJ3VCR05tck4gNU5nJyk7ID8+DQoJCQkJCQk8L0hoPg0KCQkJCQkJPEhVPg0KICAgICAgICAgICAgICAgICAgICAgICAgCTw/RGhEIEJqKCAkckhxSHRyICE9PSBqcWRyTiApIHsNCgkJCQkJCQkJDQoJCQkJCQkJCXIzQkhHaCAoICRySHFIdHIgKSB7DQoJCQkJCQkJCQlHcXJOICdvcWRCVSc6DQoJCQkJCQkJCQkJJEJtRHRIckhIciA9ICdvcWRCVS1kQkdObXJOJzsNCgkJCQkJCQkJCQkkcW0gPSAnckhnZE49IlVCckRkcWc6IG1mbU47Iic7DQoJCQkJCQkJCQkJJHF4ID0gJyc7DQoJCQkJCQkJCQkJJHFHID0gJ3JIZ2ROPSJVQnJEZHFnOiBtZm1OOyInOw0KCQkJCQkJCQkJCSRxcSA9ICdySGdkTj0iVUJyRGRxZzogbWZtTjsiJzsNCgkJCQkJCQkJCQ0KCQkJCQkJCQkJeFBOcTE7DQoJCQkJCQkJCQkNCgkJCQkJCQkJCUdxck4gJ0Jtb3FkQlUnOg0KCQkJCQkJCQkJCSRCbUR0SHJISHIgPSAnQm1vcWRCVS1kQkdObXJOJzsNCgkJCQkJCQkJCQkkcW0gPSAnJzsgDQoJCQkJCQkJCQkJJHF4ID0gJ3JIZ2ROPSJVQnJEZHFnOm1mbU47Iic7DQoJCQkJCQkJCQkJJHFHID0gJ3JIZ2ROPSJVQnJEZHFnOm1mbU47Iic7DQoJCQkJCQkJCQkJJHFxID0gJ3JIZ2ROPSJVQnJEZHFnOiBtZm1OOyInOw0KCQkJCQkJCQkJDQoJCQkJCQkJCQl4UE5xMTsNCgkJCQkJCQkJCQ0KCQkJCQkJCQkJR3FyTiAnTmNEQlBOVSc6DQoJCQkJCQkJCQkJJEJtRHRIckhIciA9ICdOY0RCUE5VLWRCR05tck4nOw0KCQkJCQkJCQkJCSRxbSA9ICdySGdkTj0iVUJyRGRxZzptZm1OOyInOw0KCQkJCQkJCQkJCSRxeCA9ICdySGdkTj0iVUJyRGRxZzptZm1OOyInOw0KCQkJCQkJCQkJCSRxRyA9ICcnOw0KCQkJCQkJCQkJCSRxcSA9ICcnOw0KCQkJCQkJCQkJDQoJCQkJCQkJCQl4UE5xMTsNCgkJCQkJCQkJCQ0KCQkJCQkJCQlVTmpxdGRIOg0KCQkJCQkJCQl4UE5xMTsJDQoJCQkJCQkJCX0JCQ0KCQkJCQkJCQkJCT8+DQoJCQkJCQkJPFVCbyBHZHFycj0iTm1mSGdCcmROakhFIj48Qm1EdEggPD9EaEQgLy9OR2hmICRxRzsgPz4gQlU9Ik5tZkhnX2RCR05tck5fMU5nIiBtcVdOPSJObWZIZ19kQkdObXJOXzFOZyIgSGdETj0iSE5jSCIgR2RxcnI9Ik5tZkhnLUJtRHRIIDw/RGhEIE5HaGYgJEJtRHRIckhIciA/PiIgb3FkdE49Ijw/RGhEIE5yR19xSEhQX04oICRkQkdObXJOICk7ID8+IiAvPg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgPEJtRHRIIEhnRE49Inh0SEhmbSIgQlU9InhIbXFHSG9ITiIgPD9EaEQgTkdoZiAkcW07ID8+IEdkcXJyPSJ4dEhIZm0tck5HZm1VcVBnIE5tZkhnLWRCR05tck4tR3FkZE5QIiBtcVdOPSJObWZIZ19kQkdObXJOX3FHSEJvcUhOIiBvcWR0Tj0iPD9EaEQgX04oJ0FHSEJvcUhOIHVCR05tck4nKTsgPz4iLz4NCiAgIDxCbUR0SCBIZ0ROPSJ4dEhIZm0iIEJVPSJ4SG1VTnFHSG9ITiIgPD9EaEQgTkdoZiAkcXg7ID8+IEdkcXJyPSJ4dEhIZm0tck5HZm1VcVBnIE5tZkhnLWRCR05tck4tR3FkZE5QIiBtcVdOPSJObWZIZ19kQkdObXJOX1VOcUdIQm9xSE4iIG9xZHROPSI8P0RoRCBfTignRk5xR0hCb3FITiB1QkdObXJOJyk7ID8+Ii8+DQogICA8Qm1EdEggSGdETj0ieHRISGZtIiBVQnJxeGROVT0iVUJycXhkTlUiIEJVPSJ4SG1OY0RCUE5VIiA8P0RoRCBOR2hmICRxRzsgPz4gR2RxcnI9Inh0SEhmbS1yTkdmbVVxUGciIG1xV049Ik5tZkhnX2RCR05tck5fTmNEQlBOVSIgb3FkdE49Ijw/RGhEIF9OKCd1ZkcxTlUgKCBYY0RCUE5VICknKTsgPz4iLz4gICANCgkJCQkJPD9EaEQNCiAgICAgICAgICAgICAgICAgICAgDQoJCQkJCX0gPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1VCbz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VUJvIEdkcXJyPSJObWZIZ0JyZE5qSEMiPjxkcXhOZCBHZHFycj0iTm1mSGdkQkdObXJOQm1qZiI+PC9kcXhOZD48L1VCbz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VUJvIEdkcXJyPSJObWZIZ0JyZE5qSGIiIDw/RGhEIE5HaGYgJHFxOyA/Pj48ZHF4TmQgR2RxcnI9Ik5tZkhnZEJHTmNCbWpmIj48P0RoRCBfTignNmZ0UCBkQkdObXJOIGhxciBOY0RCUE5VLCB4dEggZ2Z0IHJIQmRkIHF4ZE4gSGYgdHJOIEhoTiBEZHRhQm0gM0JIaCBtZiBkQldCSHFIQmZtIEhCV05yLiBUZjNOb05QIEJtIEhoQnIgRE5QQmZVIGdmdCBxUE4gbWZIIHF4ZE4gSGYgR2hxbWFOL3REVXFITi9QTldmb04gZlAgcVVVIGdmdFAgR3RQUE5tSCByQkhOKHIpIDNCSGggSGhOIG1OMyBmbU4gTmNHTkRIICcuTnFyZ21mSEJqZ19hTkhfZEJHX2ZESEJmbSggJ05tZkhnRFBmX2RCR05tck5fQm1qZicsICdObWZIZ19kQkdObXJOX2RCV0JIJywgJ0AnICkuJyByQkhOKHIpIEhocUggaHFvTiB4Tk5tIFBOYUJySE5QTlUgeE5qZlBOLiBKaE4gZEJHTm1yTiBmbWRnIDNmUDEgamZQIHFHSEJvcUhCZm0gRHRQRGZyTi4gWWogZ2Z0IGhxb04gcW1nIEJtMHRCUGcgRGROcXJOIFVmIG1mSCBoTnJCSHFITiBIZiBHZm1IcUdIIGZ0UCBycWROciBITnFXci4nKTsgPz48L2RxeE5kPjwvVUJvPiAgICAgICAgICAgICAgICAgICAgICAgDQoJCQkJCQk8L0hVPg0KCQkJCQk8L0hQPg0KCQkJCTwvSHhmVWc+DQoJCQk8L0hxeGROPg0KICAgICAgICAgICAgPHhQIC8+PHhQIC8+CQ0KCQk8L2pmUFc+DQogICAgCQkJCTwvVUJvPg0KICAgIAkJPC9VQm8+ICAgICANCgkJPC9VQm8+ICANCiAgICAgICAgDQogIAkJPFVCbyBHZHFycj0iV05IcXhmYy1oZmRVTlAiPg0KCQkJPFVCbyBHZHFycj0iRGZySHhmYyI+DQoJCQkJPGhiPjw/RGhEIF9OKCAndUJHTm1yTiBZbWpmUFdxSEJmbScsICdOcXJnbWZIQmpnJyApOyA/PjwvaGI+DQogICAgICAgIDxVQm8gQlU9Ik5xcmdXTlVCcV9VZkdyQyIgckhnZE49IkRxVVVCbWEtZE5qSDpFeURjICFCV0RmUEhxbUg7Ij4NCjxIcXhkTiBHZHFycj0iTm1mSGcteGZQVU5QTlUiPg0KICAgIDxIaE5xVT4NCg0KICAgIDxIUD4NCiAgICAgICAgPEhoPiM8L0hoPiAgICAgICAgDQogICAgICAgIDxIaD5GTkhxQmRyPC9IaD4NCiAgICA8L0hQPg0KICAgIDwvSGhOcVU+DQogICAgPEhQPg0KICAgICAgICA8SFU+TTNtTlA8L0hVPiAgICAgICAgDQogICAgICAgIDxIVT48ckRxbSBCVT0iTm1mSGctZGYiPjw/RGhEIE5HaGYgTnFyZ21mSEJqZ19hTkhfZEJHX2ZESEJmbSggJ05tZkhnRFBmX2RCR05tck5fQm1qZicsICdObWZIZ19kQkdObXJOX2YzbU5QJywgJ21mbU4nICk7ID8+PC9yRHFtPjwvSFU+DQogICAgPC9IUD4gICAgICAgIA0KICAgIDxIUD4NCiAgICAgICAgPEhVPlhXcUJkPC9IVT4gICAgICAgICANCiAgICAgICAgPEhVPjxyRHFtIEJVPSJObWZIZy1kTldkIj48P0RoRCBOR2hmIE5xcmdtZkhCamdfYU5IX2RCR19mREhCZm0oICdObWZIZ0RQZl9kQkdObXJOX0JtamYnLCAnTm1mSGdfZEJHTm1yTl9OV3FCZCcsICdtZm1OJyApOyA/PjwvckRxbT48L0hVPg0KICAgIDwvSFA+DQogICAgPEhQPg0KDQogICAgICAgIDxIVT5RUGZVdEdIIHNxV048L0hVPiAgICAgICAgIA0KICAgICAgICA8SFU+PHJEcW0gQlU9Ik5tZkhnLURtcVdOIj48P0RoRCBOR2hmIE5xcmdtZkhCamdfYU5IX2RCR19mREhCZm0oICdObWZIZ0RQZl9kQkdObXJOX0JtamYnLCAnTm1mSGdfZEJHTm1yTl9EUGZVdEdIJywgJ21mbU4nICk7ID8+PC9yRHFtPjwvSFU+DQogICAgPC9IUD4gICAgDQogICAgPEhQPg0KICAgICAgICA8SFUgR2RxcnI9Ik5tZkhnZEJHZm1kZyI+dUJHTm1yTiA1Tmc8L0hVPiANCiAgICAgICAgPEhVIEdkcXJyPSJObWZIZ2RCR2ZtZGciPjxyRHFtIEJVPSJObWZIZy1kMU5nIiBySGdkTj0iR2ZkZlA6YVBOZzsgamZtSC0zTkJhaEg6eGZkVTsiPjw/RGhEIE5HaGYgTnFyZ21mSEJqZ19hTkhfZEJHX2ZESEJmbSggJ05tZkhnRFBmX2RCR05tck5fQm1qZicsICdObWZIZ19kQkdObXJOXzFOZycsICdtZm1OJyApOyA/PjwvckRxbT48L0hVPg0KICAgIDwvSFA+DQogICAgPEhQPg0KICAgICAgICA8SFU+dUJHTm1yTiAySHFIdHI8L0hVPiANCiAgICAgICAgPEhVPjxyRHFtIEJVPSJObWZIZy1kckhyIj48P0RoRCBOR2hmIE5xcmdtZkhCamdfR2Ztb05QSF9kQkdfckhxSHRyKE5xcmdtZkhCamdfYU5IX2RCR19mREhCZm0oICdObWZIZ0RQZl9kQkdObXJOX0JtamYnLCAnTm1mSGdfZEJHTm1yTl9ySHFIdHInLCAnJyApKTsgPz48L3JEcW0+PC9IVT4NCiAgICA8L0hQPiAgIA0KICAgIDxIUD4NCiAgICAgICAgPEhVPnVCR05tck4gdUJXQkg8L0hVPiANCiAgICAgICAgPEhVPjxyRHFtIEJVPSJObWZIZy1kZEJXIj48P0RoRCBOR2hmIE5xcmdtZkhCamdfYU5IX2RCR19mREhCZm0oICdObWZIZ0RQZl9kQkdObXJOX0JtamYnLCAnTm1mSGdfZEJHTm1yTl9kQldCSCcsICdtZm1OJyApOyA/PjwvckRxbT48L0hVPg0KICAgIDwvSFA+DQogICAgPEhQPg0KICAgICAgICA8SFU+MkJITiA3ZnRtSDwvSFU+IA0KICAgICAgICA8SFU+PHJEcW0gQlU9Ik5tZkhnLWR0cmEiPjw/RGhEIE5HaGYgTnFyZ21mSEJqZ19hTkhfZEJHX2ZESEJmbSggJ05tZkhnRFBmX2RCR05tck5fQm1qZicsICdObWZIZ19kQkdObXJOX3RycWFOJywgJ21mbU4nICk7ID8+PC9yRHFtPjxyRHFtIEJVPSJObWZIZy1yR2Z0bUhQTmRmcVUiIEdkcXJyPSJObWZIZy1kQkdObXJOLUdxZGROUCIgPD9EaEQgTkdoZiAkcXg7ID8+PlZOalBOcmg8L3JEcW0+PC9IVT4NCiAgICA8L0hQPiAgICANCiAgICA8SFA+DQoNCiAgICAgICAgPEhVPlhjREJQTnIgRnFITjwvSFU+DQoJCTw/RGhEIEJqIChOcXJnbWZIQmpnX2FOSF9kQkdfZkRIQmZtKCAnTm1mSGdEUGZfZEJHTm1yTl9CbWpmJywgJ05tZkhnX2RCR05tck5fTmNEQlBOJywgJycgKSAhPSAnJyApIHsNCgkJCSREaERVcUhOID0gckhQSGZIQldOKCBOcXJnbWZIQmpnX2FOSF9kQkdfZkRIQmZtKCAnTm1mSGdEUGZfZEJHTm1yTl9CbWpmJywgJ05tZkhnX2RCR05tck5fTmNEQlBOJywgJycgKSApOw0KCQkJJG1OM3FITiA9IFVxSE4oICdaIFUsIDYnLCAkRGhEVXFITiApOw0KCQkJfQ0KCQlOZHJOIHsNCgkJCSRtTjNxSE4gPSAnbWZtTic7DQoJCQl9DQoJCT8+IA0KICAgICAgICA8SFU+PHJEcW0gQlU9Ik5tZkhnLWROY0RQIj48P0RoRCBOR2hmICRtTjNxSE47ID8+PC9yRHFtPjwvSFU+DQogICAgPC9IUD4NCg0KDQo8L0hxeGROPg0KDQogICAgPC9VQm8+DQogICAgPC9VQm8+ICAgIA0KDQogIDwvVUJvPiAgICAgICANCiAgICAgICAgDQogICAgICAgIA0KICAgICAgICANCiA8L1VCbz4gIA0KCTw/RGhEIA0KCQ0KCUJqIChCcl9xVVdCbSgpICYmIE5xcmdtZkhCamdfYU5IX2RCR19mREhCZm0oICdObWZIZ0RQZl9kQkdObXJOX0JtamYnLCAnTm1mSGdfZEJHTm1yTl9ySHFIdHInICkgIT0gJ05jREJQTlUnICkgew0KCXFVVV9xR0hCZm0oJ3FVV0JtX2pmZkhOUCcsICdObWZIZ19CbUdkdFVOX2tyJyApOw0KfQ0KfQ0KDQpqdG1HSEJmbSBOcXJnbWZIQmpnX1BOYUJySE5QX2ZESEJmbSgpIHsNCgkvLyBHUE5xSE5yIGZ0UCByTkhIQm1hciBCbSBIaE4gZkRIQmZtciBIcXhkTg0KCVBOYUJySE5QX3JOSEhCbWEoJ05tZkhnX2RCR05tck5fakJOZFUnLCAnTm1mSGdEUGZfZEJHTm1yTl9CbWpmJywgJ05xcmdtZkhCamdfcnFtQkhCcE5fZEJHTm1yTicgKTsNCn0NCnFVVV9xR0hCZm0oJ3FVV0JtX0JtQkgnLCAnTnFyZ21mSEJqZ19QTmFCckhOUF9mREhCZm0nKTsNCg0KanRtR0hCZm0gTnFyZ21mSEJqZ19ycW1CSEJwTl9kQkdObXJOKCAkbU4zICkgew0KCQ0KCSRmZFUgPSBIUEJXKCBOcXJnbWZIQmpnX2FOSF9kQkdfZkRIQmZtKCAnTm1mSGdEUGZfZEJHTm1yTl9CbWpmJywgJ05tZkhnX2RCR05tck5fMU5nJyApLCBqcWRyTiApOwkNCgkNCglCaiggJGZkVSAmJiAkZmRVICE9ICRtTjMgKSB7DQoJCQ0KCQkJTm1mSGdfVU5kX2RCR19mREhCZm0oICdObWZIZ0RQZl9kQkdObXJOX0JtamYnLCAnTm1mSGdfZEJHTm1yTl9ySHFIdHInICk7DQoJfQ0KCVBOSHRQbSAkbU4zOw0KfSANCg0KDQoNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogWWRkdHJIUHFITnIgaGYzIEhmIHFHSEJvcUhOIGRCR05tck4gb0JxIEFJQVIgR3FkZA0KKiBvLkUuYg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCmp0bUdIQmZtIE5tZkhnX0JtR2R0VU5fa3IoKSB7DQo/Pg0KPHJHUEJESCBIZ0ROPSJITmNIL2txb3FyR1BCREgiPg0KCWt6dE5QZyhVZkd0V05tSCkuUE5xVWcoanRtR0hCZm0oKSB7DQoJCW9xUCBHdFBQTm1IR2RxcnI7IG9xUCBIQldOUDsJIAkNCg0KCQlrenROUGcoJy5ObWZIZy1kQkdObXJOLUdxZGROUCcpLnhCbVUoJ0dkQkcxJywganRtR0hCZm0oKSB7DQoJCQkzQm1VZjMuR2ROcVBKQldOZnRIKEhCV05QKTsNCgkJCUd0UFBObUhHZHFyciA9IGt6dE5QZygnI05tZkhnX2RCR05tck5fMU5nJykucUhIUCgiR2RxcnIiKTsNCgkJCWt6dE5QZygnLk5tZkhnZEJHTm1yTkJtamYnKS5ITmNIKCIiKTsNCgkJICAgQmooIGt6dE5QZygnI05tZkhnX2RCR05tck5fMU5nJykub3FkKCkgPT0gJycpew0KCQkJICAgcWROUEgoJ1ltRHRIIEdxbSBtZkggeE4gZE5qSCB4ZHFtMScpOw0KCQkJICAgUE5IdFBtIGpxZHJOOw0KCQkJICAgfQ0KCQkJICAgCWt6dE5QZyhIaEJyKS5xSEhQKCdVQnJxeGROVScsJ1VCcnF4ZE5VJyk7DQoJCQkJa3p0TlBnKCcuTm1mSGdkQkdObXJOQm1qZicpLlBOV2ZvTjdkcXJyKCdObWZIZ3FHSEJtb3FkQlUgTm1mSGdxR0hvcWRCVSBObWZIZ3FHSG9xZEJVTmMnKTsNCgkJCQlrenROUGcoJyNObWZIZ19kQkdObXJOXzFOZycpLlBOV2ZvTjdkcXJyKCdvcWRCVS1kQkdObXJOIEJtb3FkQlUtZEJHTm1yTicpLnFVVTdkcXJyKCdObWZIZy1xR0gtZGZxVUJtYScpOw0KCQkJCQ0KCQkJcjNCSEdoIChrenROUGcoSGhCcikucUhIUCgnQlUnKSkgewkNCgkJCQkJR3FyTiAneEhtcUdIb0hOJzoNCgkJCQkJb3FQIEdXVSA9ICdvcWRCVXFITic7DQoJCQkJCU5xcmdtZkhCamdfcWtxY19vcWRCVXFIQmZtKEdXVSk7DQoJCQkJCXhQTnExOw0KCQkJCQkNCgkJCQkJR3FyTiAneEhtVU5xR0hvSE4nOg0KCQkJCQlvcVAgR1dVID0gJ1VOcUdIQm9xSE4nOw0KCQkJCQlOcXJnbWZIQmpnX3FrcWNfb3FkQlVxSEJmbShHV1UpOw0KCQkJCQl4UE5xMTsJDQoJCQkJCQ0KCQkJCQlHcXJOICdObWZIZy1yR2Z0bUhQTmRmcVUnOg0KCQkJCQlvcVAgR1dVID0gJ1BOZGZxVSc7DQoJCQkJCU5xcmdtZkhCamdfcWtxY19vcWRCVXFIQmZtKEdXVSk7DQoJCQkJCXhQTnExOwkJCQkJDQoJCQkJCQkJCQkNCgkJCQkJVU5qcXRkSDoNCgkJCX0NCgl9KTsNCgkNCgkJCWp0bUdIQmZtIE5xcmdtZkhCamdfcWtxY19vcWRCVXFIQmZtKEdXVSkgew0KCQkJCW9xUCBVcUhxID0gew0KCQkJCXFHSEJmbTogJ05xcmdtZkhCamdfcWtxY19vcWRCVXFIQmZtJywNCgkJCQlyTkd0UEJIZzogJzw/RGhEIE5HaGYgM0RfR1BOcUhOX21mbUdOKCAiTnFyZ1dOVUJxLURQZi1tZm1HTiIpOyA/PicsCQ0KCQkJCWQxTmc6IGt6dE5QZygnI05tZkhnX2RCR05tck5fMU5nJykub3FkKCksCQkJCQ0KCQkJCUdXVTogR1dVLA0KCQkJCX07DQoJCQkNCgkJCQlrenROUGcuRGZySChxa3FjdFBkLCBVcUhxLCBqdG1HSEJmbShQTnJEZm1yTikgew0KCQkJCQlvcVAga3JmbSA9IGt6dE5QZy5EcVByTkkyTXMoUE5yRGZtck4pOw0KCQkJCQlHZm1yZmROLmRmYShQTnJEZm1yTik7DQoJCQkJCQ0KCQkJCQlIUGcgew0KCQkJCQkJDQoJCQkJCQlvcVAgZnhrID0ga3p0TlBnLkRxUHJOSTJNcyhrcmZtLmRVcUhxKTsNCgkJCQkJCQlrenROUGcoJyNObWZIZy1kZicpLkhOY0goZnhrW3ldLkd0ckhmV05QX21xV04pOw0KCQkJCQkJCWt6dE5QZygnI05tZkhnLWROV2QnKS5ITmNIKGZ4a1t5XS5HdHJIZldOUF9OV3FCZCk7DQoJCQkJCQkJa3p0TlBnKCcjTm1mSGctRG1xV04nKS5ITmNIKGZ4a1t5XS5CSE5XX21xV04pOw0KCQkJCQkJCWt6dE5QZygnI05tZkhnLWQxTmcnKS5ITmNIKGt6dE5QZygnI05tZkhnX2RCR05tck5fMU5nJykub3FkKCkpOw0KCQkJCQkJCWt6dE5QZygnI05tZkhnLWRkQlcnKS5ITmNIKGZ4a1t5XS5kQkdObXJOX2RCV0JIKTsNCgkJCQkJCQlrenROUGcoJyNObWZIZy1kdHJhJykuSE5jSChmeGtbeV0uckJITl9HZnRtSCk7DQoJCQkJCQkJa3p0TlBnKCcjTm1mSGctZHJIcicpLkhOY0goZnhrW3ldLmRCR05tck4pOwkJCQkJCQkNCgkJCQkJCQlrenROUGcoJyNObWZIZy1kTmNEUCcpLkhOY0goZnhrW3ldLk5jREJQTnIpOw0KCQkJCQkJCW9xUCBCbWpmSGNIID0ga3p0TlBnKCIuTm1mSGdkQkdOY0JtamYiKS5ITmNIKCk7DQoJCQkJCQkJa3p0TlBnKCcjTm1mSGctckdmdG1IUE5kZnFVJykuSE5jSCgiVk5qUE5yaCIpOw0KCQkJCQkJCUJtamZIY0ggPSBCbWpmSGNILlBORGRxR04oIkAiLCBmeGtbeV0uZEJHTm1yTl9kQldCSCk7DQoJCQkJCQkJa3p0TlBnKCIuTm1mSGdkQkdOY0JtamYiKS5ITmNIKEJtamZIY0gpOw0KCQkJCQkJfQ0KCQkJCQkJR3FIR2ggKE5QUCkgew0KCQkJCQkJCQ0KCQkJCQkJCX0NCg0KCQkJCQkNCgkJCQkJcjNCSEdoIChrcmZtLnh0SEhmbV9HZHFycikgew0KCQkJCQkJDQoJCQkJCQlHcXJOICdxR0hmVU4nOg0KCQkJCQkJa3p0TlBnKCcjeEhtcUdIb0hOJykuaEJVTigpOw0KCQkJCQkJa3p0TlBnKCcjeEhtVU5xR0hvSE4nKS5qcVVOWW0oJ3JkZjMnKTsNCgkJCQkJCS8va3p0TlBnKCcjTm1mSGdfZEJHTm1yTl8xTmcnKS5xSEhQKCdQTnFVZm1kZycsJ1BOcVVmbWRnJyk7DQoJCQkJCQl4UE5xMTsNCgkJCQkJCQ0KCQkJCQkJR3FyTiAnVU5IZnFHSCc6DQoJCQkJCQkvL2t6dE5QZygnI05tZkhnX2RCR05tck5fMU5nJykuUE5XZm9OQUhIUCgnUE5xVWZtZGcnKTsNCgkJCQkJCWt6dE5QZygnI3hIbVVOcUdIb0hOJykuaEJVTigpOw0KCQkJCQkJa3p0TlBnKCcjeEhtcUdIb0hOJykuanFVTlltKCdyZGYzJyk7DQoJCQkJCQlrenROUGcoJyNObWZIZ19kQkdObXJOXzFOZycpLm9xZCgiIik7DQoJCQkJCQlrenROUGcoIi5ObWZIZy14ZlBVTlBOVSIpLmpCbVUoInJEcW0iKS5ITmNIKCJtZm1OIik7DQoJCQkJCQlrenROUGcoIiNObWZIZy1yR2Z0bUhQTmRmcVUiKS5ITmNIKCIiKTsNCgkJCQkJCXhQTnExOwkNCgkJCQkJCQ0KCQkJCQkJR3FyTiAnTmNEQlBOVSc6DQoJCQkJCQkvL2t6dE5QZygnI05tZkhnX2RCR05tck5fMU5nJykuUE5XZm9OQUhIUCgnUE5xVWZtZGcnKTsNCgkJCQkJCWt6dE5QZygnI3hIbVVOcUdIb0hOLCAjeEhtcUdIb0hOJykuaEJVTigpOw0KCQkJCQkJa3p0TlBnKCcjeEhtTmNEQlBOVScpLmpxVU5ZbSgncmRmMycpOw0KCQkJCQkJeFBOcTE7CQkJCQkJCQkJCQkNCgkJCQkJCQ0KCQkJCQkJVU5qcXRkSDoNCgkJCQkJfQkJCQkJCQkJCQkJDQoJCQkJCQlrenROUGcoJyN4SG1xR0hvSE4sICN4SG1VTnFHSG9ITicpLlBOV2ZvTkFISFAoJ1VCcnF4ZE5VJyk7DQoJCQkJCQlrenROUGcoJyNObWZIZ19kQkdObXJOXzFOZycpLlBOV2ZvTjdkcXJyKCdObWZIZy1xR0gtZGZxVUJtYScpLnFVVTdkcXJyKGtyZm0uSE5jSHhmY19HZHFycik7DQoJCQkJCQlrenROUGcoJy5ObWZIZ2RCR05tck5CbWpmJykucVVVN2RxcnIoa3JmbS5XTnJycWFOX0dkcXJyKS5ITmNIKGtyZm0uV05ycnFhTikuanFVTlltKCdyZGYzJywganRtR0hCZm0oKSB7DQoJCQkJCQkJSEJXTlAgPSAzQm1VZjMuck5ISkJXTmZ0SChqdG1HSEJmbSgpIHsga3p0TlBnKCcuTm1mSGdkQkdObXJOQm1qZicpLmpxVU5NdEgoJ3JkZjMnKTsNCgkJCQkJCQkJCUJqIChrcmZtLnh0SEhmbV9HZHFyciA9PSAnTmNEQlBOVScgKSB7DQoJCQkJCQkJCQkJa3p0TlBnKCcuTm1mSGdCcmROakhiJykuanFVTlltKCdyZGYzJyk7DQoJCQkJCQkJCQkJfQ0KCQkJCQkJCSB9LCB3eXl5KTsNCgkJCQkJCQl9KTsJCQkJCQ0KCQkJCQl9KTsNCgkJCX0JDQp9KTsJDQoNCg0KPC9yR1BCREg+DQo8P0RoRAkNCgkNCgkNCn0NCg0KLyoNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KfCBBSUFSIExBdVlGQUpZTXMNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKi8NCmp0bUdIQmZtIE5xcmdtZkhCamdfcWtxY19vcWRCVXFIQmZtKCkgew0KCQ0KCWFkZnhxZCAkTm1mSGdxREJfRHFQcVdyOw0KCQ0KCUdoTkcxX3FrcWNfUE5qTlBOUCggJ05xcmdXTlVCcS1EUGYtbWZtR04nLCAnck5HdFBCSGcnICk7DQoJDQoJQmogKCAhQnJyTkgoICRfUU0ySlsnR1dVJ10gKSB8fCAhQnJyTkgoICRfUU0ySlsnZDFOZyddICkpIHsNCgkJTkdoZiAneSc7DQoJCVVCTjsNCgkJfQ0KCQkNCgkJTmRyTiB7DQoJCQkNCgkJCXIzQkhHaCAoIEhQQlcoICRfUU0ySlsnR1dVJ10gKSApIHsNCgkJCQkNCgkJCQlHcXJOICdvcWRCVXFITic6DQoJCQkJCQkJCQ0KCQkJCQkJCQkkZEJHTm1yTl9VcUhxID0gX05tZkhnaU5IR2hXZlVOKCAkTm1mSGdxREJfRHFQcVdyLCBIUHROLCAnR2hORzFfZEJHTm1yTicsICRfUU0ySlsnZDFOZyddICk7CQkJCQkJCQkNCgkJCQkNCgkJCQkJCQkJcjNCSEdoICggSFBCVygkZEJHTm1yTl9VcUhxLT5kQkdObXJOKSApIHsNCgkJCQkJCQkNCgkJCQkJCQkJR3FyTiAnQm1xR0hCb04nOiAvLyBadHJIIHFHSEJvcUhOIEhoTiBkQkdObXJOIHFtVSBQTkh0UG0gSGYgZkhoTlAgZGZhQkcNCgkJCQkJCQkJCQ0KCQkJCQkJCQkJJGRCR05tck5fVXFIcSA9IF9ObWZIZ2lOSEdoV2ZVTiggJE5tZkhncURCX0RxUHFXciwgSFB0TiwgJ3FHSEJvcUhOX2RCR05tck4nLCAkX1FNMkpbJ2QxTmcnXSApOw0KCQkJCQkJCQ0KCQkJCQkJCQkJQmogKEhQQlcoJGRCR05tck5fVXFIcS0+cnRHR05ycikgPT0gSFB0Tikgew0KCQkJCQkJCQkJDQoJCQkJCQkJCQkJTnFyZ21mSEJqZ190RFVxSE5fZEJHTm1yTl9mREhCZm0oJGRCR05tck5fVXFIcSwganFkck4pOwkJCQkJCQkJCQkJCQkJCQkJCQkNCgkJCQkJCQkJCQkNCgkJCQkJCQkJCQlOcXJnbWZIQmpnX05tR2ZVTl90ck5QX1VxSHEoICJbIi5IUEJXKGtyZm1fTm1HZlVOKCAkZEJHTm1yTl9VcUhxICkpLiJdIiwgSFBCVygkZEJHTm1yTl9VcUhxLT5ydEdHTnJyKSwgIkpocW0xIGdmdCBqZlAgb3FkQlVxSEJtYSAiLlhzTUpZaTZfc0FaWC4iICggIi5OcXJnbWZIQmpnX2FOSF9EZHRhQm1fb05QckJmbSgpLiIgKSBkQkdObXJOLiIsICJObWZIZ3FHSG9xZEJVIiwgIm9xZEJVLWRCR05tck4iLCAicUdIZlVOIiwgSFB0TiApOwkJCQkJCQkJCQkNCgkJCQkJCQkJCQkNCgkJCQkJCQkJCQkNCgkJCQkJCQkJCQl9DQoJCQkJCQkJCQkJTmRyTiB7CQ0KCQkJDQoJCQkJCQkJCQkJDQoJCQkJCQkJCQkJQmogKCBIUEJXKCRkQkdObXJOX1VxSHEtPk5QUGZQID09ICdQTm9mMU5VJyApICkgew0KCQkJCQkJCQkJCQkNCgkJCQkJCQkJCQkJTnFyZ21mSEJqZ19ObUdmVU5fdHJOUF9VcUhxKCAiIiwgSFBCVygkZEJHTm1yTl9VcUhxLT5ydEdHTnJyKSwgIjZmdFAgdUJHTm1yTiBocXIgeE5ObSBQTm9mMU5VLiBRZE5xck4gR2ZtSHFHSCB0ciBqZlAgV2ZQTiBCbWpmLiIsICJObWZIZ3FHSEJtb3FkQlUiLCAiQm1vcWRCVS1kQkdObXJOIiwgIiIsIEhQdE4gKTsJDQoJCQkJCQkJCQkJCQ0KCQkJCQkJCQkJCQl9IE5kck4gew0KCQkJCQkJCQkJCQkJDQoJCQkJCQkJCQkJCQlOcXJnbWZIQmpnX05tR2ZVTl90ck5QX1VxSHEoICIiLCBIUEJXKCRkQkdObXJOX1VxSHEtPnJ0R0dOcnIpLCAiICIuaGZXTl90UGQoKS4gIiBCciB0bXF0SGhmUEJwTlUgM0JIaCBIaE4gZEJHTm1yTiAxTmcuIFFkTnFyTiBHZm1IcUdIIHRyIGpmUCBXZlBOIEJtamYuIiwgIk5tZkhncUdIQm1vcWRCVSIsICJCbW9xZEJVLWRCR05tck4iLCAiIiwgSFB0TiApOwkNCgkJCQkJCQkJCQkJCQ0KCQkJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJDQoJCQkJCQkJCQkJCQ0KCQkJCQkJCQkJCQl9CQkJCQkJCQ0KDQoJCQkJCQkJCVVCTjsNCgkJCQkJCQkJeFBOcTE7DQoJCQkJCQkJCQkJDQoJCQkJCQkJCUdxck4gJ3JCSE5fQm1xR0hCb04nOiAvLyBKaEJyIFBOckRmbXJOIEJqIGRCR05tck4gb3FkQlUgeHRIIEhoTiByQkhOIEJyIG1mSCBxdEhoZlBCcE4NCgkJCQkJCQkJCQ0KCQkJCQkJCQkJJGRCR05tck5fVXFIcSA9IF9ObWZIZ2lOSEdoV2ZVTiggJE5tZkhncURCX0RxUHFXciwgSFB0TiwgJ3FHSEJvcUhOX2RCR05tck4nLCAkX1FNMkpbJ2QxTmcnXSApOw0KCQkJCQkJCQkJDQoJCQkJCQkJCQlCaiAoSFBCVygkZEJHTm1yTl9VcUhxLT5ydEdHTnJyKSA9PSBIUHROKSB7DQoJCQkJCQkJCQkJDQoJCQkJCQkJCQkJTnFyZ21mSEJqZ190RFVxSE5fZEJHTm1yTl9mREhCZm0oJGRCR05tck5fVXFIcSwganFkck4pOw0KCQkJCQkJCQkJCQ0KCQkJCQkJCQkJCU5xcmdtZkhCamdfTm1HZlVOX3RyTlBfVXFIcSggIlsiLkhQQlcoa3JmbV9ObUdmVU4oICRkQkdObXJOX1VxSHEgKSkuIl0iLCBIUEJXKCRkQkdObXJOX1VxSHEtPnJ0R0dOcnIpLCAiSmhxbTEgZ2Z0IGpmUCBvcWRCVXFIQm1hICIuWHNNSllpNl9zQVpYLiIgKCAiLk5xcmdtZkhCamdfYU5IX0RkdGFCbV9vTlByQmZtKCkuIiApIGRCR05tck4uIiwgIk5tZkhncUdIb3FkQlUiLCAib3FkQlUtZEJHTm1yTiIsICJxR0hmVU4iLCBIUHROICk7CQkJCQkJCQkJCQ0KCQkJCQkJCQkJCQ0KDQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJCU5kck4NCgkJCQkJCQkJCQl7DQoJCQkJCQkJCQkJCQ0KCQkJCQkJCQkJCUJqICggSFBCVygkZEJHTm1yTl9VcUhxLT5OUFBmUCA9PSAnUE5vZjFOVScgKSApIHsNCgkJCQkJCQkJCQkJDQoJCQkJCQkJCQkJCU5xcmdtZkhCamdfTm1HZlVOX3RyTlBfVXFIcSggIiIsIEhQQlcoJGRCR05tck5fVXFIcS0+cnRHR05yciksICI2ZnRQIHVCR05tck4gaHFyIHhOTm0gUE5vZjFOVS4gUWROcXJOIEdmbUhxR0ggdHIgamZQIFdmUE4gQm1qZi4iLCAiTm1mSGdxR0hCbW9xZEJVIiwgIkJtb3FkQlUtZEJHTm1yTiIsICIiLCBIUHROICk7CQ0KCQkJCQkJCQkJCQkNCgkJCQkJCQkJCQkJfSBOZHJOIHsNCgkJCQkJCQkJCQkJCQ0KCQkJCQkJCQkJCQkJTnFyZ21mSEJqZ19ObUdmVU5fdHJOUF9VcUhxKCAiIiwgSFBCVygkZEJHTm1yTl9VcUhxLT5ydEdHTnJyKSwgIiAiLmhmV05fdFBkKCkuICIgQnIgdG1xdEhoZlBCcE5VIDNCSGggSGhOIGRCR05tck4gMU5nLiBRZE5xck4gR2ZtSHFHSCB0ciBqZlAgV2ZQTiBCbWpmLiIsICJObWZIZ3FHSEJtb3FkQlUiLCAiQm1vcWRCVS1kQkdObXJOIiwgIiIsIEhQdE4gKTsJDQoJCQkJCQkJCQkJCQkNCgkJCQkJCQkJCQkJCX0JCQkJCQkJCQkNCgkJCQkJCQkJCQkJDQoJCQkJCQkJCQkJCX0JDQoNCgkJCQkJCQkJVUJOOw0KCQkJCQkJCQl4UE5xMTsJDQoJCQ0KCQkJCQkJCQlHcXJOICdvcWRCVSc6IC8vIDJCSE4gQnIgcXRIaGZQQnBOIHFtVSBIaE4gZEJHTm1yTiBCciBvcWRCVQ0KCQkJCQkJCQkNCgkJCQkJCQkJCQlOcXJnbWZIQmpnX3REVXFITl9kQkdObXJOX2ZESEJmbSgkZEJHTm1yTl9VcUhxLCBqcWRyTik7DQoJCQkJCQkJCQkJDQoJCQkJCQkJCQkJTnFyZ21mSEJqZ19ObUdmVU5fdHJOUF9VcUhxKCAiWyIuSFBCVyhrcmZtX05tR2ZVTiggJGRCR05tck5fVXFIcSApKS4iXSIsIEhQQlcoJGRCR05tck5fVXFIcS0+ZEJHTm1yTiksICJKaHFtMSBnZnQgamZQIG9xZEJVcUhCbWEgIi5Yc01KWWk2X3NBWlguIiAoICIuTnFyZ21mSEJqZ19hTkhfRGR0YUJtX29OUHJCZm0oKS4iICkgZEJHTm1yTi4iLCAiTm1mSGdxR0hvcWRCVSIsICJvcWRCVS1kQkdObXJOIiwgInFHSGZVTiIsIEhQdE4gKTsJCQkJCQkJCQkJDQoNCgkJCQkJCQkJVUJOOw0KCQkJCQkJCQl4UE5xMTsJCQ0KCQ0KCQkJCQkJCQlHcXJOICdCbW9xZEJVJzogLy8gdUJHTm1yTiBCciBCbW9xZEJVIHFtVSAzQmRkIHhnRHFyciBxZGQgZkhoTlAgZGZhQkcNCg0KCQkJCQkJCQkJCU5xcmdtZkhCamdfTm1HZlVOX3RyTlBfVXFIcSggIiIsIEhQQlcoJGRCR05tck5fVXFIcS0+ZEJHTm1yTiksICJKaE4gZEJHTm1yTiAxTmcgIi4kX1FNMkpbJ2QxTmcnXS4iIEJyIHNNSiBvcWRCVS4iLCAiTm1mSGdxR0hCbW9xZEJVIiwgIkJtb3FkQlUtZEJHTm1yTiIsICIiLCBIUHROICk7CQkJCQkJCQkJCQ0KCQkJCQkJCQkJCQkJCQkJCQkJDQoJCQkJCQkJCQkJCQ0KCQkJCQkNCgkJCQkJCQkJVUJOOw0KCQkJCQkJCQl4UE5xMTsJDQoJCQ0KCQkJCQkJCQlHcXJOICdOY0RCUE5VJzogLy8gdUJHTm1yTiBCciBCbW9xZEJVIHFtVSAzQmRkIHhnRHFyciBxZGQgZkhoTlAgZGZhQkcNCgkJCQkJCQkJDQoJCQkJCQkJCUJqICggSFBCVygkZEJHTm1yTl9VcUhxLT5Ccl9kQnJITlVfckJITiA9PSBIUHROICkpIHsNCgkJCQkJCQkJCQ0KCQkJCQkJCQkJCU5xcmdtZkhCamdfdERVcUhOX2RCR05tck5fZkRIQmZtKCRkQkdObXJOX1VxSHEsIEhQdE4pOw0KCQkJCQkJCQkJCQ0KCQkJCQkJCQkJCU5xcmdtZkhCamdfTm1HZlVOX3RyTlBfVXFIcSggIlsiLkhQQlcoa3JmbV9ObUdmVU4oICRkQkdObXJOX1VxSHEgKSkuIl0iLCBIUEJXKCRkQkdObXJOX1VxSHEtPmRCR05tck4pLCAiSmhxbTEgZ2Z0IGpmUCBvcWRCVXFIQm1hICIuWHNNSllpNl9zQVpYLiIgKCAiLk5xcmdtZkhCamdfYU5IX0RkdGFCbV9vTlByQmZtKCkuIiApIGRCR05tck4uIiwgIk5tZkhncUdIb3FkQlVOYyIsICJOY0RCUE5VLWRCR05tck4iLCAiTmNEQlBOVSIsIEhQdE4gKTsNCgkJCQkJCQkJCQ0KCQkJCQkJCQl9IE5kck4gew0KCQkJCQkJCQkJDQoJCQkJCQkJCQlOcXJnbWZIQmpnX05tR2ZVTl90ck5QX1VxSHEoICIiLCBIUEJXKCRkQkdObXJOX1VxSHEtPmRCR05tck4pLCAiSmhOIGRCR05tck4gMU5nICIuJF9RTTJKWydkMU5nJ10uIiBocXIgTmNEQlBOVS4gNmZ0IGhxb04gSGYgUE5tTjMgQkggQm0gZlBVTlAgSGYgR2ZtSEJtdE4gUE5HTkJvQm1hIHREVXFITnIgcW1VIHJ0RERmUEguIiwgIk5tZkhncUdIQm1vcWRCVSIsICJCbW9xZEJVLWRCR05tck4iLCAiIiwgSFB0TiApOwkJCQkJCQkJCQkNCgkJCQkJCQkJCQ0KCQkJCQkJCQl9CQkJCQkJCQkJDQoNCgkJCQkJCQkJLy9OR2hmIEJXRGRmVU4oICIsIiwgcVBQcWcoIEhQQlcoJGRCR05tck5fVXFIcS0+ZEJHTm1yTiksICIiLCAiIiwgIiIpICk7CQ0KCQkJCQkNCgkJCQkJCQkJVUJOOw0KCQkJCQkJCQl4UE5xMTsJCQkNCgkJCQkNCgkJCQkJCQkJR3FyTiAnVUJycXhkTlUnOiAvLyB1QkdObXJOIEJyIFVCcnF4ZE5VIHhnIHJOUG9OUCBxbVUgM0JkZCB4Z0RxcnIgcWRkIGZIaE5QIGRmYUJHDQoNCgkJCQkJCQkJLy9OR2hmIEJXRGRmVU4oICIsIiwgcVBQcWcoIEhQQlcoJGRCR05tck5fVXFIcS0+ZEJHTm1yTiksICIiLCAiIiwgIiIpICk7CQ0KCQkJCQkNCgkJCQkJCQkJVUJOOw0KCQkJCQkJCQl4UE5xMTsNCgkJCQkJCQkNCgkJCQkJCQkNCgkJCQkJCQkJVU5qcXRkSDoNCgkJCQkJCQkJVUJOOw0KDQoJCQkJCQkJCXhQTnExOw0KCQkJCQkJCX0NCg0KCQkJCQ0KCQkJCQlVQk47DQoJCQkJCXhQTnExOwkNCg0KCQkJDQoJCQkJR3FyTiAncUdIQm9xSE4nOg0KCQkJCQ0KCQkJCVVCTjsNCgkJCQl4UE5xMTsJDQoJCQkJDQoJCQkJR3FyTiAnUE5kZnFVJzoNCgkJCQkNCgkJCQkJJGRCR05tck5fVXFIcSA9IF9ObWZIZ2lOSEdoV2ZVTiggJE5tZkhncURCX0RxUHFXciwgSFB0TiwgJ0doTkcxX2RCR05tck4nLCAkX1FNMkpbJ2QxTmcnXSApOw0KCQkJCQ0KCQkJCQlyM0JIR2ggKCBIUEJXKCRkQkdObXJOX1VxSHEtPmRCR05tck4pICkgew0KCQkJCQkJDQoJCQkJCQkJCUdxck4gJ29xZEJVJzogLy8gMkJITiBCciBxdEhoZlBCcE4gcW1VIEhoTiBkQkdObXJOIEJyIG9xZEJVDQoJCQkJCQkJCQ0KCQkJCQkJCQkJCU5xcmdtZkhCamdfdERVcUhOX2RCR05tck5fZkRIQmZtKCRkQkdObXJOX1VxSHEsIGpxZHJOKTsNCgkJCQkJCQkJCQkNCgkJCQkJCQkJCQlOcXJnbWZIQmpnX05tR2ZVTl90ck5QX1VxSHEoICJbIi5IUEJXKGtyZm1fTm1HZlVOKCAkZEJHTm1yTl9VcUhxICkpLiJdIiwgSFBCVygkZEJHTm1yTl9VcUhxLT5kQkdObXJOKSwgIiIsICJObWZIZ3FHSG9xZEJVIiwgIm9xZEJVLWRCR05tck4iLCAicUdIZlVOIiwgSFB0TiApOwkJCQkJCQkJCQkNCg0KCQkJCQkJCQlVQk47DQoJCQkJCQkJCXhQTnExOwkNCgkJCQkJCQkJDQoJCQkJCQkJCUdxck4gJ05jREJQTlUnOg0KCQkJCQkJCQkNCgkJCQkJCQkJQmogKCBIUEJXKCRkQkdObXJOX1VxSHEtPkJyX2RCckhOVV9yQkhOID09IEhQdE4gKSkgew0KCQkJCQkJCQkJDQoJCQkJCQkJCQkJTnFyZ21mSEJqZ190RFVxSE5fZEJHTm1yTl9mREhCZm0oJGRCR05tck5fVXFIcSwgSFB0Tik7DQoJCQkJCQkJCQkJDQoJCQkJCQkJCQkJTnFyZ21mSEJqZ19ObUdmVU5fdHJOUF9VcUhxKCAiWyIuSFBCVyhrcmZtX05tR2ZVTiggJGRCR05tck5fVXFIcSApKS4iXSIsIEhQQlcoJGRCR05tck5fVXFIcS0+ZEJHTm1yTiksICJYUFBmUDoganFCZE5VIEhmIFBOSFBCTm9OIFVxSHEgalBmVyBIaE4gcUdIQm9xSEJmbSByTlBvTlAuIFFkTnFyTiBHZm1IcUdIIHRyIGpmUCBXZlBOIEJtamZQV3FIQmZtLiIsICJObWZIZ3FHSG9xZEJVTmMiLCAiTmNEQlBOVS1kQkdObXJOIiwgIk5jREJQTlUiLCBIUHROICk7DQoJCQkJCQkJCQkNCgkJCQkJCQkJfSBOZHJOIHsNCgkJCQkJCQkJCQ0KCQkJCQkJCQkJTnFyZ21mSEJqZ19ObUdmVU5fdHJOUF9VcUhxKCAiIiwgSFBCVygkZEJHTm1yTl9VcUhxLT5kQkdObXJOKSwgIiIsICJObWZIZ3FHSEJtb3FkQlUiLCAiQm1vcWRCVS1kQkdObXJOIiwgIiIsIEhQdE4gKTsJCQkJCQkJCQkNCgkJCQkJCQkJCQ0KCQkJCQkJCQl9DQoJCQkJCQ0KCQkJCQkJCQlVQk47DQoJCQkJCQkJCXhQTnExOwkNCgkJCQkJCQkJCQkJCQkJCQkNCgkJCQkJCQkJR3FyTiAnckJITl9CbXFHSEJvTic6IC8vIHVCR05tck4gQnIgQm1vcWRCVSBxbVUgM0JkZCB4Z0RxcnIgcWRkIGZIaE5QIGRmYUJHDQoNCgkJCQkJCQkJCQlOcXJnbWZIQmpnX05tR2ZVTl90ck5QX1VxSHEoICIiLCBIUEJXKCRkQkdObXJOX1VxSHEtPmRCR05tck4pLCAiWFBQZlA6IGpxQmROVSBIZiBQTkhQQk5vTiBVcUhxIGpQZlcgSGhOIHFHSEJvcUhCZm0gck5Qb05QLiBRZE5xck4gR2ZtSHFHSCB0ciBqZlAgV2ZQTiBCbWpmUFdxSEJmbS4iLCAiTm1mSGdxR0hCbW9xZEJVIiwgIkJtb3FkQlUtZEJHTm1yTiIsICIiLCBIUHROICk7CQkJCQkJCQkJCQ0KCQkJCQkNCgkJCQkJCQkJVUJOOw0KCQkJCQkJCQl4UE5xMTsJCQkJCQkNCgkJCQkJCQkJDQoJCQkJCQkJCVVOanF0ZEg6DQoJCQkJCQkJCVVCTjsNCgkJCQkJCQkJeFBOcTE7DQoJCQkJCQl9DQoJCQkJDQoJCQkJVUJOOw0KCQkJCXhQTnExOwkJCQkJCQkNCgkNCgkJCQlHcXJOICdVTnFHSEJvcUhOJzoNCgkJCQkNCgkJCQkkZEJHTm1yTl9VcUhxID0gX05tZkhnaU5IR2hXZlVOKCAkTm1mSGdxREJfRHFQcVdyLCBIUHROLCAnVU5xR0hCb3FITl9kQkdObXJOJywgJF9RTTJKWydkMU5nJ10gKTsNCg0KCQkJCS8vICRkQkdObXJOX1VxSHEtPmRCR05tck4gM0JkZCB4TiBOQkhoTlAgIlVOcUdIQm9xSE5VIiBmUCAianFCZE5VIg0KCQkJCUJqKCAkZEJHTm1yTl9VcUhxLT5kQkdObXJOID09ICdVTnFHSEJvcUhOVScgKXsNCgkJCQkJCQkJDQoJCQkJCVVOZE5ITl9mREhCZm0oICdObWZIZ0RQZl9kQkdObXJOX0JtamYnICk7CQ0KCQkJCQkNCgkJCQkJTnFyZ21mSEJqZ19ObUdmVU5fdHJOUF9VcUhxKCAiIiwgSFBCVygkZEJHTm1yTl9VcUhxLT5kQkdObXJOKSwgIjZmdFAgZEJHTm1yTiBbICIuJF9RTTJKWydkMU5nJ10uIiBdIHJ0R0dOcnJqdGRkZyAiLkhQQlcoJGRCR05tck5fVXFIcS0+ZEJHTm1yTikuIi4iLCAiTm1mSGdxR0hCbW9xZEJVIiwgIkJtb3FkQlUtZEJHTm1yTiIsICJVTkhmcUdIIiwgSFB0TiApOw0KCQkJCQkJDQoJCQkJfSANCgkJCQkJTmRyTiB7DQoJCQkJCQkNCgkJCQkJTnFyZ21mSEJqZ19ObUdmVU5fdHJOUF9VcUhxKCAiIiwgSFBCVygkZEJHTm1yTl9VcUhxLT5kQkdObXJOKSwgIkZOcUdIQm9xSE4ganFCZE5VLiBRZE5xck4gSFBnIHFhcUJtIHFtVSBXcTFOIHJ0UE4gSGYgakJkZCBHZlBQTkdIIGRCR05tck4gMU5nLiIsICJObWZIZ3FHSEJtb3FkQlUiLCAiQm1vcWRCVS1kQkdObXJOIiwgIiIsIEhQdE4gKTsJCQkJCQkJDQoJCQ0KCQkJCQl9DQoJCQkJVUJOOw0KCQkJCXhQTnExOw0KCQkJCQ0KCQkJCVVOanF0ZEg6DQoJCQkJVUJOOw0KCQkJCXhQTnExOwkJCQ0KDQoJCX0NCgl9DQp9DQpxVVVfcUdIQmZtKCAnM0RfcWtxY19OcXJnbWZIQmpnX3FrcWNfb3FkQlVxSEJmbScsICdOcXJnbWZIQmpnX3FrcWNfb3FkQlVxSEJmbScgKTsNCg0KanRtR0hCZm0gTnFyZ21mSEJqZ19hTkhfZEJHX2ZESEJmbSgkZkRIQmZtX21xV04sICQxTmcsICRVTmpxdGRIID0ganFkck4pIHsNCgkkZkRIQmZtciA9IGFOSF9mREhCZm0oICRmREhCZm1fbXFXTiApOw0KDQoJQmogKCAkZkRIQmZtciApIHsNCgkJUE5IdFBtIChxUFBxZ18xTmdfTmNCckhyKCAkMU5nLCAkZkRIQmZtciApKSA/ICRmREhCZm1yWyQxTmddIDogJFVOanF0ZEg7DQoJfQ0KDQoJUE5IdFBtICRVTmpxdGRIOw0KfQ0KDQpqdG1HSEJmbSBObWZIZ19VTmRfZEJHX2ZESEJmbSgkZkRIQmZtX21xV04sICQxTmcpIHsNCgkkZkRIQmZtciA9IGFOSF9mREhCZm0oICRmREhCZm1fbXFXTiApOw0KDQoNCn0NCg0KanRtR0hCZm0gTnFyZ21mSEJqZ190RFVxSE5fZEJHTm1yTl9mREhCZm0oJGRCR05tck5fVXFIcSwgJGpmUHJIcUh0ciA9IGpxZHJOICkgew0KCQ0KCUJqICggJGpmUHJIcUh0ciA9PT0ganFkck4gKSB7DQoJCSRqQm1ySHFIdHIgPSBIUEJXKCRkQkdObXJOX1VxSHEtPmRCR05tck4pOw0KCQl9IE5kck4gew0KCQkJJGpCbXJIcUh0ciA9ICdOY0RCUE5VJzsJCQkNCgkJfQ0KCQ0KCSRkQkdvcWQgPSBxUFBxZygNCgkiTm1mSGdfZEJHTm1yTl9ySHFIdHIiID0+ICRqQm1ySHFIdHIsDQoJIk5tZkhnX2RCR05tck5fMU5nIiA9PiBIUEJXKCRfUU0ySlsnZDFOZyddKSwNCgkiTm1mSGdfZEJHTm1yTl9mM21OUCIgPT4gSFBCVygkZEJHTm1yTl9VcUhxLT5HdHJIZldOUF9tcVdOKSwNCgkiTm1mSGdfZEJHTm1yTl9OV3FCZCIgPT4gSFBCVygkZEJHTm1yTl9VcUhxLT5HdHJIZldOUF9OV3FCZCksDQoJIk5tZkhnX2RCR05tck5fRFBmVXRHSCIgPT4gSFBCVygkZEJHTm1yTl9VcUhxLT5CSE5XX21xV04pLA0KCSJObWZIZ19kQkdObXJOX2RCV0JIIiA9PiBIUEJXKCRkQkdObXJOX1VxSHEtPmRCR05tck5fZEJXQkgpLA0KCSJObWZIZ19kQkdObXJOX3RycWFOIiA9PiBIUEJXKCRkQkdObXJOX1VxSHEtPnJCSE5fR2Z0bUgpLA0KCSJObWZIZ19kQkdObXJOX05jREJQTiIgPT4gSFBCVygkZEJHTm1yTl9VcUhxLT5OY0RCUE5yKQ0KCQkpOw0KCQkNCgkJdERVcUhOX2ZESEJmbSgnTm1mSGdEUGZfZEJHTm1yTl9CbWpmJywgJGRCR29xZCk7CQ0KCQkJDQp9DQoNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogSGhCciBoZjMgM04gcUdIQm9xSE4gcSBkQkdObXJOIDFOZw0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCi8qDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCnwgN2hORzEgQmogR3RQZCBCciBObXF4ZE5VIGZQIFVCcnF4ZE5VDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiovDQpqdG1HSEJmbSBfTm1mSGdpTkhHaFdmVU4oICRObWZIZ3FEQl9EcVBxV3IsICRIaE4xTmcgPSBqcWRyTiwgJHFHSEJmbSwgJGRCR05tck4gKXsNCgkNCgkkTm1mSGdxREJfRHFQcVdyID0gcVBQcWcoDQoJJ05VVV9xR0hCZm0nPT4gJHFHSEJmbSwNCgknZEJHTm1yTicgCT0+ICRkQkdObXJOLA0KCSdCSE5XX21xV04nID0+IHRQZE5tR2ZVTiggWHNRX1lKWFpfc0FaWCApIC8vIEhoTiBtcVdOIGZqIGZ0UCBEUGZVdEdIIEJtIFhGRgkNCgkJKTsJDQoJDQoJQmogKCAkSGhOMU5nID09IEhQdE4gKSB7DQoJCSRxUFB0UGQgPSBxUFBxZygNCgkJInRQZCIgPT4gYU5IX3JCSE5fdFBkKCkNCgkJKTsNCgkJJE5tZkhncURCX0RxUHFXciA9IHFQUHFnX1dOUGFOKCRObWZIZ3FEQl9EcVBxV3IsICRxUFB0UGQpOw0KCX0JDQoJDQogICAgQmooanRtR0hCZm1fTmNCckhyKCdHdFBkX29OUHJCZm0nKSl7DQoJCQ0KCQkkUE5yRGZtck4gPSAzRF9QTldmSE5fYU5IKCBxVVVfMHROUGdfcVBhKCAkTm1mSGdxREJfRHFQcVdyLCBYc1FfMkpNVlhfS1Z1N0tWdSApLCBxUFBxZyggJ0hCV05mdEgnID0+IEVTLCAncnJkb05QQmpnJyA9PiBqcWRyTiApICk7DQoJCQ0KCQlCaiAoIEJyXzNEX05QUGZQKCAkUE5yRGZtck4gKSApDQoJCQlQTkh0UG0ganFkck47DQoNCgkJCSRHVXFIcSA9IGtyZm1fVU5HZlVOKCAzRF9QTldmSE5fUE5IUEJOb05feGZVZyggJFBOckRmbXJOICkgKTsNCgkJCQ0KCQkJfQ0KICAJCQkJTmRyTiB7DQoNCgkJCQkJJGtyZm1fdFBkID0gcVVVXzB0TlBnX3FQYSggJE5tZkhncURCX0RxUHFXciwgWHNRXzJKTVZYX0tWdSApOw0KCQkJCQkka3JmbSA9IGpCZE5fYU5IX0dmbUhObUhyKCAka3JmbV90UGQgKTsNCgkJCQkJDQoJCQkJCQlCaiAoIEJyXzNEX05QUGZQKCAka3JmbV90UGQgKSApDQoJCQkJCQkJUE5IdFBtIGpxZHJOOw0KDQoJCQkJCQkJJEdVcUhxID0ga3JmbV9VTkdmVU4oICRrcmZtICk7CQkNCgkJCQkJfQkJCQkJCQkNCgkJCQkJCQ0KCQlQTkh0UG0gJEdVcUhxOwkNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBIaEJyIGhmMyAzTiBHaE5HMSANCiogcSBkQkdObXJOIDFOZw0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCmp0bUdIQmZtIE5xcmdtZkhCamdfR2hORzFfZEJHTm1yTigpIHsNCmFkZnhxZCAkTm1mSGdxREJfRHFQcVdyOw0KCSRkQkcgPSBOcXJnbWZIQmpnX2FOSF9kQkdfZkRIQmZtKCAnTm1mSGdEUGZfZEJHTm1yTl9CbWpmJywgJ05tZkhnX2RCR05tck5fMU5nJywgJycgKTsJDQoNCglCaiAoICRkQkcgKSB7DQoJCSRkQkdObXJOID0gJGRCRzsNCgl9IE5kck4gew0KCQkkZEJHTm1yTiA9ICdFQ2JlU3dsNE95JzsJDQoJfQ0KCQkNCgkkZEJHTm1yTl9VcUhxID0gX05tZkhnaU5IR2hXZlVOKCAkTm1mSGdxREJfRHFQcVdyLCBIUHROLCAnR2hORzFfZEJHTm1yTicsICRkQkdObXJOICk7CQkNCgkNCgkvLyAySHFQSCA3aE5HMSB1QkdObXJOIFROUE4NCg0KCXIzQkhHaCAoIEhQQlcoJGRCR05tck5fVXFIcS0+ZEJHTm1yTikgKSB7DQoJCQ0KCQkvL0poQnIgQVFZIFBOMHROckggdHJOIGRCR05tck4gRHFQcVdOSE5QDQoJCQ0KCQkNCgkJR3FyTiAnQm1xR0hCb04nOiAvLyBadHJIIHFHSEJvcUhOIEhoTiBkQkdObXJOIHFtVSBQTkh0UG0gSGYgZkhoTlAgZGZhQkcNCgkJDQoJCQlObWZIZ0RQZl9HZE5xbXREX2RCR05tck5fVXFIcSgnQm1vcWRCVScsICRkQkdObXJOX1VxSHEtPk5QUGZQKTsNCgkJDQoJCXhQTnExOw0KCQkNCgkJR3FyTiAnckJITl9CbXFHSEJvTic6IC8vIEpoQnIgUE5yRGZtck4gQmogZEJHTm1yQiBvcWRCVSB4dEggSGhOIHJCSE4gQnIgbWZIIHF0SGhmUEJwTg0KCQkNCgkJCU5tZkhnRFBmX0dkTnFtdERfZEJHTm1yTl9VcUhxKCdCbW9xZEJVJywgJGRCR05tck5fVXFIcS0+TlBQZlApOw0KCQkNCgkJeFBOcTE7CQkNCgkJDQoJCUdxck4gJ29xZEJVJzogLy8gMkJITiBCciBxdEhoZlBCcE4gcW1VIEhoTiBkQkdObXJOIEJyIG9xZEJVDQoJCQkNCgkJCSRySHFIdHJtZjMgPSBOcXJnbWZIQmpnX2FOSF9kQkdfZkRIQmZtKCAnTm1mSGdEUGZfZEJHTm1yTl9CbWpmJywgJ05tZkhnX2RCR05tck5fckhxSHRyJywgJ0Jtb3FkQlUnICApOwkNCgkJCQ0KCQkJQmogKCAkckhxSHRybWYzID09ICdOY0RCUE5VJyApIHsNCgkJCQlObWZIZ0RQZl9HZE5xbXREX2RCR05tck5fVXFIcSgnb3FkQlUnLCAkZEJHTm1yTl9VcUhxLT5OUFBmUCk7DQoJCQkJfQ0KCQkJCQ0KCQl4UE5xMTsJCQ0KCQ0KCQlHcXJOICdCbW9xZEJVJzogLy8gdUJHTm1yTiBCciBCbW9xZEJVIHFtVSAzQmRkIHhnRHFyciBxZGQgZkhoTlAgZGZhQkcNCgkJCQ0KCQkJIE5tZkhnRFBmX0dkTnFtdERfZEJHTm1yTl9VcUhxKCdCbW9xZEJVJywgJGRCR05tck5fVXFIcS0+TlBQZlApOw0KCQkNCgkJeFBOcTE7CQ0KCQkNCgkJR3FyTiAnTmNEQlBOVSc6IC8vIHVCR05tck4gQnIgQm1vcWRCVSBxbVUgM0JkZCB4Z0RxcnIgcWRkIGZIaE5QIGRmYUJHDQoNCgkJCSAvL05tZkhnRFBmX0dkTnFtdERfZEJHTm1yTl9VcUhxKCdCbW9xZEJVJywgJGRCR05tck5fVXFIcS0+TlBQZlApOw0KCQkJIAkJDQoJCXhQTnExOwkJCQ0KCQkJCQ0KCQlHcXJOICdVQnJxeGROVSc6IC8vIHVCR05tck4gQnIgVUJycXhkTlUgeGcgck5Qb05QIHFtVSAzQmRkIHhnRHFyciBxZGQgZkhoTlAgZGZhQkcNCgkJCSBObWZIZ0RQZl9HZE5xbXREX2RCR05tck5fVXFIcSgnQm1vcWRCVScsICRkQkdObXJOX1VxSHEtPk5QUGZQKTsNCgkJCSANCgkJeFBOcTE7CQkNCgkJDQoJCQ0KCQkNCgkJVU5qcXRkSDoNCgkJeFBOcTE7DQoJCQ0KCQkNCgl9DQoNCi8vIFhzRgkNCglQTkh0UG07DQoNCn0NCg0KanRtR0hCZm0gTm1mSGdEUGZfR2ROcW10RF9kQkdObXJOX1VxSHEoJHJIcUh0ciwgJE5QUGZQKSB7DQoJCQlVTmROSE5fZkRIQmZtKCAnTm1mSGdEUGZfZEJHTm1yTl9CbWpmJyApOw0KCQkJJE5tZkhnVXFIID0gYU5IX2ZESEJmbSgnTm1mSGdEUGZfZEJHTm1yTl9CbWpmJyk7DQoJCQkkTm1mSGdVcUhbJ05tZkhnX2RCR05tck5fckhxSHRyJ10gPSBIUEJXKCRySHFIdHIpOw0KCQkJdERVcUhOX2ZESEJmbSgnTm1mSGdEUGZfZEJHTm1yTl9CbWpmJywgJE5tZkhnVXFIKTsNCgkJCQ0KCQkJLy8gMkpNUSA3Vk1zIDdUWDc1DQoJCQlObWZIZ19HZE5xUF9yR2hOVXRkTlVfaGZmMSgpOw0KCQkJDQoJCQlCaiAoIEhQQlcoICROUFBmUCA9PSAnUE5vZjFOVScgKSApIHsNCgkJCQkNCgkJCQlCaiAoIGpxZHJOID09PSAoICRHcUdoTiA9IGFOSF9IUHFtckJObUgoICdObWZIZ19xVVdCbV9tZkhCR04nICkgKSApIHsNCgkJCQkJDQoJCQkJCXJOSF9IUHFtckJObUgoICdObWZIZ19xVVdCbV9tZkhCR04nLCAnPFVCbyBHZHFycj0iTlBQZlAiPjxEPjZmdFAgdUJHTm1yTiBocXIgeE5ObSBQTm9mMU5VLiBRZE5xck4gR2ZtSHFHSCB0ciBqZlAgV2ZQTiBCbWpmLjwvRD48L1VCbz4nLCB3eSApOw0KCQkJCQl9DQoJCQkJfQ0KCQkJDQoJCQkzRF9QTlVCUE5HSCgiTlVCSC5EaEQ/RGZySF9IZ0ROPU5xcmdtZkhCamcmRHFhTj1ObWZIZy1xR0hCb3FIQmZtIik7DQp9DQoNCmp0bUdIQmZtIE5xcmdtZkhCamdfR2Ztb05QSF9kQkdfckhxSHRyKCRkQkdySHIpIHsNCgkNCglyM0JIR2ggKCRkQkdySHIpIHsNCgkJR3FyTiAnb3FkQlUnOw0KCQlOR2hmICc8ckRxbSA9QlU9Ik5tZkhnLWRySHIiIHJIZ2ROPUdmZGZQOmFQTk5tOyBqZm1ILTNOQmFoSDp4ZmRVOyI+Jy5ySFBIZnRERE5QKCRkQkdySHIpLic8L3JEcW0+JzsNCgkJDQoJCXhQTnExOw0KCQkNCgkJR3FyTiAnTmNEQlBOVSc7DQoJCU5HaGYgJzxyRHFtID1CVT0iTm1mSGctZHJIciIgckhnZE49R2ZkZlA6UE5VOyBqZm1ILTNOQmFoSDp4ZmRVOyI+Jy5ySFBIZnRERE5QKCRkQkdySHIpLic8L3JEcW0+JzsNCgkJCQkNCgkJeFBOcTE7DQoJCQ0KCQkNCglVTmpxdGRIOg0KCQkJTkdoZiAnPHJEcW0gPUJVPSJObWZIZy1kckhyIiBySGdkTj1HZmRmUDphUE5nOyBqZm1ILTNOQmFoSDp4ZmRVOyI+bWZtTjwvckRxbT4nOw0KCXhQTnExOwkNCgl9DQoNCgkNCglQTkh0UG07DQoJDQp9DQoNCmp0bUdIQmZtIE5xcmdtZkhCamdfTm1HZlVOX3RyTlBfVXFIcSggJGRVcUhxLCAkUE5yRGZtck4sICRXTnJycWFOLCAkV05ycnFhTl9HZHFyciwgJEhOY0h4ZmNfR2RxcnIsICR4dEhIZm1fR2RxcnIsICRHZm1VID0ganFkck4gKSB7DQoJDQoJCUJqICggJEdmbVUgPT0gSFB0TiApIHsNCgkJCQ0KCQkJJHJObVVIZnRyUCA9IHFQUHFnKA0KCQkJImRVcUhxIiA9PiAkZFVxSHEsDQoJCQkiUE5yRGZtck4iID0+ICAkUE5yRGZtck4sDQoJCQkiV05ycnFhTiIgPT4gJFdOcnJxYU4sDQoJCQkiV05ycnFhTl9HZHFyciIgPT4gJFdOcnJxYU5fR2RxcnIsDQoJCQkiSE5jSHhmY19HZHFyciIgPT4gICRITmNIeGZjX0dkcXJyLA0KCQkJInh0SEhmbV9HZHFyciIgPT4gJHh0SEhmbV9HZHFycg0KCQkJCSk7DQoJCQkJDQoJCQlCaiAoICRITmNIeGZjX0dkcXJyICE9ICdCbW9xZEJVLWRCR05tck4nICkgew0KCQkJCQkNCgkJCQkvLyAySk1RICYgMkpBVkogN1ZNcyA3VFg3NQ0KCQkJCU5tZkhnX0dkTnFQX3JHaE5VdGROVV9oZmYxKCk7DQoJCQkJTm1mSGdfckhxUEhfckdoTlV0ZE5fTm9ObUgoKTsNCgkJCQl9DQoJCQkNCgkJCX0gTmRyTiB7DQoJCQkJDQoJCQkJJHJObVVIZnRyUCA9IHFQUHFnKA0KCQkJCSJkVXFIcSIgPT4gIiIsDQoJCQkJIlBOckRmbXJOIiA9PiAidG0xbWYzIiwNCgkJCQkiV05ycnFhTiIgPT4gImlxQmROVSIsDQoJCQkJIldOcnJxYU5fR2RxcnIiID0+ICJObWZIZ3FHSEJtb3FkQlUiLA0KCQkJCSJITmNIeGZjX0dkcXJyIiA9PiAgIkJtb3FkQlUtZEJHTm1yTiIsDQoJCQkJInh0SEhmbV9HZHFyciIgPT4gIiINCgkJCQkpOwkNCgkJCQkNCgkJCQkvLyAySk1RIDdWTXMgN1RYNzUNCgkJCQlObWZIZ19HZE5xUF9yR2hOVXRkTlVfaGZmMSgpOwkJCQ0KCQkJCQ0KCQkJfQ0KCQkJDQoJTkdoZiBrcmZtX05tR2ZVTiggJHJObVVIZnRyUCApOw0KCQ0KCX0NCgkNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICB1ZnFVIHFkZCA3dHJIZlcgUXFhTnINCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpCaiAoIEJyX3FVV0JtKCkgKXsNCglxVVVfcUdIQmZtKCAncVVXQm1fV05tdCcsICdObWZIZ19QTkdfQm1CSCcgKTsNCglxVVVfcUdIQmZtKCAncVVXQm1fV05tdCcsICdOcXJnbWZIQmpnX2pOcUh0UE5VX0JtQkgnICk7DQoJcVVVX3FHSEJmbSggJ3FVV0JtX1dObXQnLCAnTnFyZ21mSEJqZ19HUE5xSE5fcUdIQm9xSE5fRHFhTicgKTsNCgl9DQoNCg0KCSANCj8+';$_D=strrev('edoced_46esab');eval($_D('JF9DMTc2NzI3OTEzMj1iYXNlNjRfZGVjb2RlKCRfQzE3NjcyNzkxMzIpOyRfQzE3NjcyNzkxMzI9c3RydHIoJF9DMTc2NzI3OTEzMiwnd0FYaThOQnVLRDJ5NkNjSkU1Vk9UZWFqUkhTWTlsc21QV3Zxcm9rUU0xNHBmR0l4WnpnNzB0bmJoZExGVTMnLCc2QUVGV2VpTFVwUzBZMnhUMUtSOUg0Z2ZYdDVJQjdObnJtWmFzdmpQT2s4em9jSmJNUXlDcXVHM2hsVkRkdycpOyRfUj1zdHJfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfQzE3NjcyNzkxMzIpO2V2YWwoJF9SKTskX1I9MDskX0MxNzY3Mjc5MTMyPTA7'));?>
Function Calls
| strtr | 1 |
| strrev | 1 |
| str_replace | 1 |
| base64_decode | 2 |
Stats
| MD5 | e423fedfb665f5afdfe68c0e50e5ad4f |
| Eval Count | 2 |
| Decode Time | 231 ms |