Find this useful? Enter your email to receive occasional updates for securing PHP code.
Signing you up...
Thank you for signing up!
PHP Decode
eval( base64_decode( 'aWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyggJ2dnbHN0bXBwcl9hZG1pbl9tZW51JyApICk..
Decoded Output download
if ( ! function_exists( 'gglstmppr_admin_menu' ) ) { function gglstmppr_admin_menu() { bws_add_general_menu( 'google-sitemap-pro/google-sitemap-pro.php' );
add_submenu_page( 'bws_plugins', __( 'Google Sitemap Pro Settings', 'sitemap_pro' ), 'Google Sitemap Pro', 'manage_options', "google-sitemap-pro.php", 'gglstmppr_options_page' );
gglstmppr_update_activate(); global $url_home, $url; $url_home = home_url( '/' ); $url = urlencode( $url_home );
} } if ( ! function_exists( 'gglstmppr_init' ) ) { function gglstmppr_init() { global $gglstmppr_plugin_info;
if ( ! session_id() ) { session_start(); } load_plugin_textdomain( 'sitemap_pro', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' );
require_once( dirname( __FILE__ ) . '/bws_menu/bws_functions.php' ); if ( empty( $gglstmppr_plugin_info ) ) {
if ( ! function_exists( 'get_plugin_data' ) ) require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
$gglstmppr_plugin_info = get_plugin_data( dirname( __FILE__ ) . '/google-sitemap-pro.php' ); } bws_wp_version_check( 'google-sitemap-pro/google-sitemap-pro.php', $gglstmppr_plugin_info, "3.1" );
} } if ( ! function_exists( 'gglstmppr_admin_init' ) ) { function gglstmppr_admin_init() { global $bws_plugin_info, $gglstmppr_plugin_info;
if ( ! isset( $bws_plugin_info ) || empty( $bws_plugin_info ) ) $bws_plugin_info = array( 'id' => '106', 'version' => $gglstmppr_plugin_info["Version"] );
if ( isset( $_GET['page'] ) && "google-sitemap-pro.php" == $_GET['page'] ) gglstmppr_register_settings();
} } if ( ! function_exists( 'gglstmppr_register_settings' ) ) { function gglstmppr_register_settings() {
global $gglstmppr_options, $gglstmppr_plugin_info; $gglstmppr_option_defaults = array( 'plugin_option_version' => $gglstmppr_plugin_info["Version"],
'jstree_url' => 1, 'exception' => array( 'post_type' => array(), 'categories' => array(), 'post_id' => array()
), 'has_sub_exception' => array( 'post_type' => array(), 'categories' => array() ), 'sitemap_change_frequency' => 'monthly',
'sitemap' => array() ); $gglstmppr_sitemaprecreate = false; if ( is_multisite() && is_network_admin() ) {
if ( ! get_site_option( 'gglstmppr_options' ) ) { $gglstmppr_option_defaults['network_apply'] = 'default';
$gglstmppr_option_defaults['network_view'] = '1'; $gglstmppr_option_defaults['network_change'] = '1';
add_site_option( 'gglstmppr_options', $gglstmppr_option_defaults ); } $gglstmppr_options = get_site_option( 'gglstmppr_options' );
} else { if ( ! get_option( 'gglstmppr_options' ) ) { if ( is_multisite() ) { if ( $gglstmppr_network_options = get_site_option( 'gglstmppr_options' ) ) {
if ( 'off' != $gglstmppr_network_options['network_apply'] ) { $gglstmppr_option_defaults = $gglstmppr_network_options;
unset( $gglstmppr_option_defaults['network_apply'] ); unset( $gglstmppr_option_defaults['network_view'] );
unset( $gglstmppr_option_defaults['network_change'] ); $use_network_default = true; } } } if ( empty( $use_network_default ) ) {
if ( get_option( 'gglstmp_settings' ) ) { $gglstmp_options = get_option( 'gglstmp_settings' ); $gglstmppr_option_defaults = array_merge( $gglstmppr_option_defaults, $gglstmp_options );
$gglstmppr_sitemaprecreate = true; } } add_option( 'gglstmppr_options', $gglstmppr_option_defaults );
} $gglstmppr_options = get_option( 'gglstmppr_options' ); } if ( $gglstmppr_sitemaprecreate ) { gglstmppr_sitemapcreate();
} if ( ! isset( $gglstmppr_options['plugin_option_version'] ) || $gglstmppr_options['plugin_option_version'] != $gglstmppr_plugin_info["Version"] ) {
$gglstmppr_options = array_merge( $gglstmppr_option_defaults, $gglstmppr_options ); $gglstmppr_options['plugin_option_version'] = $gglstmppr_plugin_info["Version"];
update_option( 'gglstmppr_options', $gglstmppr_options ); } } } if ( ! function_exists( 'gglstmppr_sitemapcreate' ) ) {
function gglstmppr_sitemapcreate() { global $wpdb, $gglstmppr_options; $str_post_type = ""; if ( ! $gglstmppr_options )
gglstmppr_register_settings(); $post_types = get_post_types( '', 'objects' ); unset( $post_types['revision'] );
unset( $post_types['attachment'] ); unset( $post_types['nav_menu_item'] ); foreach ( $post_types as $key => $value ) {
if ( ! isset( $gglstmppr_options['exception']['post_type'][ $key ] ) ) { if ( $str_post_type != "" )
$str_post_type .= ", "; $str_post_type .= "'" . $key . "'"; } } if ( $str_post_type != '' ) $loc = $wpdb->get_results( "SELECT ID, post_modified, post_status, post_type, ping_status FROM $wpdb->posts WHERE post_status = 'publish' AND post_type IN (" . $str_post_type . ")" );
else $loc = array(); $xml = new DomDocument( '1.0', 'utf-8' ); if ( defined( 'WP_CONTENT_DIR' ) ) $xml_stylesheet_path = home_url( '/' ) . basename( WP_CONTENT_DIR );
else $xml_stylesheet_path = home_url( '/' ) . "wp-content"; if ( defined( 'WP_PLUGIN_DIR' ) ) $xml_stylesheet_path .= '/' . basename( WP_PLUGIN_DIR ) . "/google-sitemap-pro/sitemap.xsl";
else $xml_stylesheet_path .= "/plugins/google-sitemap-pro/sitemap.xsl"; $xslt = $xml->createProcessingInstruction( 'xml-stylesheet', "type=\"text/xsl\" href=\"$xml_stylesheet_path\"" );
$xml->appendChild( $xslt ); $urlset = $xml->appendChild( $xml->createElementNS( 'http://www.sitemaps.org/schemas/sitemap/0.9','urlset' ) );
foreach ( $loc as $val ) { $exclude_post = false; if ( 'post' == $val->post_type && isset( $gglstmppr_options['exception']['categories'] ) && ! empty( $gglstmppr_options['exception']['categories'] ) ) {
$post_categories = wp_get_post_categories( $val->ID ); foreach ( $post_categories as $key => $value ) {
if ( isset( $gglstmppr_options['exception']['categories'][ $value ] ) ) { $exclude_post = true; break;
} } } if ( ! isset( $gglstmppr_options['exception']['post_id'][ $val->ID ] ) && $exclude_post == false ) {
$url = $urlset->appendChild( $xml->createElement( 'url' ) ); $loc = $url->appendChild( $xml->createElement( 'loc' ) );
$permalink = get_permalink( $val->ID ); $loc->appendChild( $xml->createTextNode( $permalink ) ); $lastmod = $url->appendChild( $xml->createElement( 'lastmod' ) );
$now = $val->post_modified; $date = date( 'Y-m-d\TH:i:sP', strtotime( $now ) ); $lastmod->appendChild( $xml -> createTextNode( $date ) );
$changefreq = $url -> appendChild( $xml->createElement( 'changefreq' ) ); $changefreq->appendChild( $xml->createTextNode( $gglstmppr_options['sitemap_change_frequency'] ) );
$priority = $url->appendChild( $xml->createElement( 'priority' ) ); $priority->appendChild( $xml->createTextNode( 1.0 ) );
} } $xml->formatOutput = true; if ( is_multisite() ) { $home_url = preg_replace( "/[^a-zA-Z--0-9\s]/", "_", str_replace( 'http://', '', str_replace( 'https://', '', home_url() ) ) );
$file = 'sitemap_' . $home_url . '.xml'; $xml->save( ABSPATH . $file ); gglstmppr_sitemap_info(); } else {
$xml->save( ABSPATH . 'sitemap.xml' ); } if ( is_multisite() && ! is_network_admin() ) gglstmppr_sitemap_index_create();
} } if ( ! function_exists( 'gglstmppr_sitemap_index_create' ) ) { function gglstmppr_sitemap_index_create() {
global $wpdb; if ( ! is_multisite() ) return; $xmlindex = new DomDocument( '1.0', 'utf-8' ); if ( defined( 'WP_CONTENT_DIR' ) )
$xml_stylesheet_path = network_home_url( '/' ) . basename( WP_CONTENT_DIR ); else $xml_stylesheet_path = network_home_url( '/' ) . "wp-content";
if ( defined( 'WP_PLUGIN_DIR' ) ) $xml_stylesheet_path .= '/' . basename( WP_PLUGIN_DIR ) . "/google-sitemap-pro/sitemap-index.xsl";
else $xml_stylesheet_path .= "/plugins/google-sitemap-pro/sitemap-index.xsl"; $xmlindex->appendChild( $xmlindex->createProcessingInstruction( 'xml-stylesheet', "type=\"text/xsl\" href=\"$xml_stylesheet_path\"" ) );
$sitemapindex = $xmlindex->appendChild( $xmlindex->createElementNS( 'http://www.sitemaps.org/schemas/sitemap/0.9','sitemapindex' ) );
$gglstmppr_sitemaps_count = 0; $blogs = $wpdb->get_col( "SELECT `blog_id` FROM $wpdb->blogs" ); foreach ( $blogs as $blog_id ) {
switch_to_blog( $blog_id ); $gglstmppr_options = get_option( 'gglstmppr_options' ); if ( $gglstmppr_options['sitemap'] && file_exists( $gglstmppr_options['sitemap']['path'] ) ) {
$sitemap = $sitemapindex->appendChild( $xmlindex->createElement( 'sitemap' ) ); $loc = $sitemap->appendChild( $xmlindex->createElement( 'loc' ) );
$loc->appendChild( $xmlindex->createTextNode( $gglstmppr_options['sitemap']['loc'] ) ); $lastmod = $sitemap->appendChild( $xmlindex->createElement( 'lastmod' ) );
$lastmod->appendChild( $xmlindex->createTextNode( $gglstmppr_options['sitemap']['lastmod'] ) ); $gglstmppr_sitemaps_count++;
} } restore_current_blog(); if ( $gglstmppr_sitemaps_count > 0 ) { $xmlindex->formatOutput = true;
$xmlindex->save( ABSPATH . 'sitemap_index.xml' ); } } } if ( ! function_exists( 'gglstmppr_check_sitemap' ) ) {
function gglstmppr_check_sitemap( $gglstmppr_url ) { $result = wp_remote_get( esc_url_raw( $gglstmppr_url ) );
return $result['response']; } } if ( ! function_exists( 'gglstmppr_sitemap_info' ) ) { function gglstmppr_sitemap_info() {
$gglstmppr_options = get_option( 'gglstmppr_options' ); if ( ! $gglstmppr_options ) { return; } if ( is_multisite() ) {
$home_url = preg_replace( "/[^a-zA-Z--0-9\s]/", "_", str_replace( 'http://', '', str_replace( 'https://', '', home_url() ) ) );
$xml_file = 'sitemap_' . $home_url . '.xml'; } else { $xml_file = 'sitemap.xml'; } $xml_path = ABSPATH . $xml_file;
$xml_url = home_url('/') . $xml_file; if ( file_exists( $xml_path ) ) { $gglstmppr_sitemap = array(
'file' => $xml_file, 'path' => $xml_path, 'loc' => $xml_url, 'lastmod' => date( 'Y-m-d\TH:i:sP', filemtime( $xml_path ) )
); $gglstmppr_options['sitemap'] = $gglstmppr_sitemap; update_option( 'gglstmppr_options', $gglstmppr_options );
} } } if ( ! function_exists ( 'gglstmppr_client' ) ) { function gglstmppr_client() { global $gglstmppr_plugin_info;
require_once( dirname( __FILE__ ) . '/google_api/autoload.php' ); $client = new Google_Client(); $client->setClientId( '37374817621-7ujpfn4ai4q98q4nb0gaaq5ga7j7u0ka.apps.googleusercontent.com' );
$client->setClientSecret( 'GMefWPZdRIWk3J7USu6_Kf6_' ); $client->setScopes( array( 'https://www.googleapis.com/auth/webmasters', 'https://www.googleapis.com/auth/siteverification' ) );
$client->setRedirectUri( 'urn:ietf:wg:oauth:2.0:oob' ); $client->setAccessType( 'offline' ); $client->setDeveloperKey( 'AIzaSyBRFiI5TGKKeteDoDa8T8GkJGxRFa1IMxE' );
$client->setApplicationName( $gglstmppr_plugin_info['Name'] ); return $client; } } if ( ! function_exists ( 'gglstmppr_options_page' ) ) {
function gglstmppr_options_page() { global $wpdb, $wp_version, $gglstmppr_options, $url_home, $url, $gglstmppr_plugin_info;
$url_robot = ABSPATH . "robots.txt"; $gglstmppr_robots = get_option( 'gglstmppr_robots' ); $message = $error = $change_permission_attr = '';
$view_permission = true; if ( is_multisite() && ! is_network_admin() ) { if ( $gglstmppr_network_options = get_site_option( 'gglstmppr_options' ) ) {
if ( 'all' == $gglstmppr_network_options['network_apply'] && 0 == $gglstmppr_network_options['network_change'] )
$change_permission_attr = ' readonly="readonly" disabled="disabled"'; if ( 'all' == $gglstmppr_network_options['network_apply'] && 0 == $gglstmppr_network_options['network_view'] )
$view_permission = false; } } if ( ! isset( $_GET['action'] ) && $view_permission ) { if ( $change_permission_attr == '' && isset( $_POST['gglstmppr_submit'] ) && check_admin_referer( plugin_basename( __FILE__ ), 'gglstmppr_nonce_name' ) ) {
if ( isset( $_POST['gglstmppr_sitemap_change_frequency'] ) ) $gglstmppr_options['sitemap_change_frequency'] = $_POST['gglstmppr_sitemap_change_frequency'];
if ( is_multisite() && is_network_admin() ) { if ( 'all' == $_REQUEST['gglstmppr_network_apply'] ) {
$blogs = $wpdb->get_col( "SELECT `blog_id` FROM $wpdb->blogs" ); foreach ( $blogs as $blog_id ) {
switch_to_blog( $blog_id ); if ( isset( $gglstmppr_options['authorization_code'] ) ) { unset( $gglstmppr_options['authorization_code'] );
} update_option( 'gglstmppr_options', $gglstmppr_options ); } restore_current_blog(); } $gglstmppr_options['network_apply'] = $_REQUEST['gglstmppr_network_apply'];
$gglstmppr_options['network_view'] = isset( $_REQUEST['gglstmppr_network_view'] ) ? 1 : 0; $gglstmppr_options['network_change'] = isset( $_REQUEST['gglstmppr_network_change'] ) ? 1 : 0;
update_site_option( 'gglstmppr_options', $gglstmppr_options ); } else { update_option( 'gglstmppr_options', $gglstmppr_options );
} if ( isset( $_POST['gglstmppr_new'] ) ) { if ( is_network_admin() ) { $blogs = $wpdb->get_col( "SELECT `blog_id` FROM $wpdb->blogs" );
foreach ( $blogs as $blog_id ) { switch_to_blog( $blog_id ); gglstmppr_sitemapcreate(); } restore_current_blog();
gglstmppr_sitemap_index_create(); $message = __( "Your sitemap files were created in the site root directory.", 'sitemap_pro' );
} else { $message = __( "Your sitemap file is created in the site root directory.", 'sitemap_pro' );
gglstmppr_sitemapcreate(); } } if ( isset( $_POST['gglstmppr_checkbox'] ) ) { if ( file_exists( $url_robot ) && ! is_multisite() ) {
$fp = fopen( ABSPATH . 'robots.txt', "a+" ); $flag = false; while ( false !== ( $line = fgets( $fp ) ) ) {
if ( $line == "Sitemap: " . $url_home . "sitemap.xml" ) $flag = true; } if ( ! $flag ) fwrite( $fp, "
Sitemap: " . $url_home . "sitemap.xml" );
fclose ( $fp ); } if ( false === get_option( 'gglstmppr_robots' ) ) add_option( 'gglstmppr_robots', 1 );
else update_option( 'gglstmppr_robots', 1 ); $gglstmppr_robots = get_option( 'gglstmppr_robots' );
} else { if ( get_option( 'gglstmppr_robots' ) ) update_option( 'gglstmppr_robots', 0 ); $gglstmppr_robots = get_option( 'gglstmppr_robots' );
} if ( $message == "" && ! isset( $_POST['gglstmppr_authorize'] ) && ! isset( $_POST['gglstmppr_logout'] ) && ! isset( $_POST['gglstmppr_menu'] ) ) {
$message = __( 'Settings saved.', 'sitemap_pro' ); } } } elseif ( isset( $_GET['action'] ) && 'extra' == $_GET['action'] ) {
$exceptions_error = ''; $exceptions_message = __( "Settings saved. Your sitemap file is created in the site root directory." , 'sitemap_pro' );
} if ( ! isset( $_GET['action'] ) ) { $result_check_pro = bws_check_pro_license( 'google-sitemap-pro/google-sitemap-pro.php' );
if ( ! empty( $result_check_pro['error'] ) ) $error = $result_check_pro['error']; elseif ( ! empty( $result_check_pro['message'] ) )
$message = $result_check_pro['message']; } ?> <div class="wrap"> <div class="icon32 icon32-bws" id="icon-options-general"></div>
<h2>Google Sitemap Pro <?php echo ( is_network_admin() ) ? __( 'Network Settings', 'sitemap_pro' ) : __( 'Settings', 'sitemap_pro' ); ?></h2>
<h2 class="nav-tab-wrapper"> <a class="nav-tab<?php if ( ! isset( $_GET['action'] ) ) echo ' nav-tab-active'; ?>" href="admin.php?page=google-sitemap-pro.php"><?php _e( 'Settings', 'sitemap_pro' ); ?></a>
<?php if ( ! is_network_admin() ) { ?> <a class="nav-tab<?php if ( isset( $_GET['action'] ) && 'extra' == $_GET['action'] ) echo ' nav-tab-active'; ?>" href="admin.php?page=google-sitemap-pro.php&action=extra"><?php _e( 'Extra settings', 'sitemap_pro' ); ?></a>
<?php } ?> <a class="nav-tab" href="http://bestwebsoft.com/products/google-sitemap/faq/" target="_blank"><?php _e( 'FAQ', 'sitemap_pro' ); ?></a>
</h2> <?php if ( ! isset( $_GET['action'] ) ) { if ( $view_permission && is_multisite() && ! is_subdomain_install() ) { ?>
<div id="gglstmppr_check_sitemap_block" class="error"> <p> <?php printf( '<strong>%s</strong> %s',
__( 'Warning:', 'sitemap_pro' ), sprintf( __( 'To have an access to subsites XML files, please add the following rule %s to your %s file in %s after line %s.', 'sitemap_pro' ),
'<code>RewriteRule ([^/]+\.xml)$ $1 [L]</code>', '<strong>.htaccess</strong>', sprintf( '<strong>"%s"</strong>', ABSPATH ),
'<strong>"RewriteBase"</strong>' ) ); ?> </p> <div style="margin: .5em 0; padding: 2px;"> <form action="admin.php?page=google-sitemap-pro.php" method='post' id="gglstmppr_check_sitemap">
<input <?php echo $change_permission_attr; ?> type="submit" class="button-secondary" name="gglstmppr_check_sitemap" value="<?php _e( 'heck Access', 'sitemap_pro' ) ?>" />
<?php wp_nonce_field( plugin_basename( __FILE__ ), 'gglstmppr_nonce_sitemap' ); ?> </form> <?php if ( isset( $_POST['gglstmppr_check_sitemap'] ) && check_admin_referer( plugin_basename( __FILE__ ), 'gglstmppr_nonce_sitemap' ) ) {
$gglstmppr_background = array( '200' => '#f8fdf5', '404' => '#fdf6f6' ); if ( is_multisite() && is_network_admin() ) {
$blogs = $wpdb->get_col( "SELECT `blog_id` FROM $wpdb->blogs" ); foreach ( $blogs as $blog_id ) { switch_to_blog( $blog_id );
$gglstmppr_blog_options = get_option( 'gglstmppr_options' ); if ( $gglstmppr_blog_options['sitemap'] && file_exists( $gglstmppr_blog_options['sitemap']['path'] ) ) {
$gglstmppr_status = gglstmppr_check_sitemap( $gglstmppr_blog_options['sitemap']['loc'] ); printf( '<div style="margin: 10px 0 0; padding: 2px 5px; background-color: %s;"><a href="%s">%s</a> - %s</div>', $gglstmppr_background[ $gglstmppr_status['code'] ], $gglstmppr_blog_options['sitemap']['loc'], $gglstmppr_blog_options['sitemap']['file'], $gglstmppr_status['message'] );
} } restore_current_blog(); } else { $gglstmppr_blog_options = get_option( 'gglstmppr_options' ); if ( $gglstmppr_blog_options['sitemap'] && file_exists( $gglstmppr_blog_options['sitemap']['path'] ) ) {
$gglstmppr_status = gglstmppr_check_sitemap( $gglstmppr_blog_options['sitemap']['loc'] ); printf( '<div style="margin: 10px 0 0; padding: 2px 5px; background-color: %s;"><a href="%s">%s</a> - %s</div>', $gglstmppr_background[ $gglstmppr_status['code'] ], $gglstmppr_blog_options['sitemap']['loc'], $gglstmppr_blog_options['sitemap']['file'], $gglstmppr_status['message'] );
} } } ?> </div> </div> <?php } if ( $view_permission && $change_permission_attr != '' ) { ?> <div class="error"><p><strong><?php _e( "Notice:", 'sitemap_pro' ); ?></strong> <strong><?php _e( "It is prohibited to change Google Sitemap Pro settings on this site in the Google Sitemap Pro network settings.", 'sitemap_pro' ); ?></strong></p></div>
<?php } if ( ! $view_permission ) { ?> <div class="error"><p><strong><?php _e( "Notice:", 'sitemap_pro' ); ?></strong> <strong><?php _e( "It is prohibited to view Google Sitemap Pro settings on this site in the Google Sitemap Pro network settings.", 'sitemap_pro' ); ?></strong></p></div>
<?php } else { ?> <div id="gglstmppr_network_notice" class="updated" style="display:none"><p><strong><?php _e( "Notice:", 'sitemap_pro' ); ?></strong> <?php _e( "This option will replace all current settings on separate sites.", 'sitemap_pro' ); ?></p></div>
<div class="updated fade" <?php if ( ! ( isset( $_REQUEST['gglstmppr_submit'] ) || isset( $_REQUEST['bws_license_submit'] ) ) || $message == "" ) echo "style=\"display:none\""; ?>><p><strong><?php echo $message; ?></strong></p></div>
<div id="gglstmppr_settings_notice" class="updated fade" style="display:none"><p><strong><?php _e( "Notice:", 'sitemap_pro' ); ?></strong> <?php _e( "The plugin's settings have been changed. In order to save them please don't forget to click the 'Save Changes' button.", 'sitemap_pro' ); ?></p></div>
<div class="error" <?php if ( "" == $error ) echo "style=\"display:none\""; ?>><p><strong><?php echo $error; ?></strong></p></div>
<form action="admin.php?page=google-sitemap-pro.php" method='post' id="gglstmppr_auth" name="gglstmppr_auth">
<?php if ( is_multisite() && is_network_admin() ) { ?> <table id="gglstmppr_settings_network" class="form-table">
<tr valign="top" class="gglstmppr_network_settings"> <th scope="row"><?php _e( 'Apply network settings', 'sitemap_pro' ); ?></th>
<td> <label><input type="radio" name="gglstmppr_network_apply" value="all" <?php if ( "all" == $gglstmppr_options['network_apply'] ) echo 'checked="checked"'; ?> /> <?php _e( 'Apply to all sites and use by default', 'sitemap_pro' ); ?> <span class="gglstmppr_span">(<?php _e( 'All current settings on separate sites will be replaced', 'sitemap_pro' ); ?>)</span></label><br />
<div class="gglstmppr_network_apply_all"> <label><input type="checkbox" name="gglstmppr_network_change" value="1" <?php if ( 1 == $gglstmppr_options['network_change'] ) echo 'checked="checked"'; ?> /> <?php _e( 'Allow to change the settings on separate websites', 'sitemap_pro' ); ?></label><br />
<label><input type="checkbox" name="gglstmppr_network_view" value="1" <?php if ( 1 == $gglstmppr_options['network_view'] ) echo 'checked="checked"'; ?> /> <?php _e( 'Allow to view the settings on separate websites', 'sitemap_pro' ); ?></label><br />
</div> <label><input type="radio" name="gglstmppr_network_apply" value="default" <?php if ( "default" == $gglstmppr_options['network_apply'] ) echo 'checked="checked"'; ?> /> <?php _e( 'By default', 'sitemap_pro' ); ?> <span class="gglstmppr_span">(<?php _e( 'Settings will be applied to newly added websites by default', 'sitemap_pro' ); ?>)</span></label><br />
<label><input type="radio" name="gglstmppr_network_apply" value="off" <?php if ( "off" == $gglstmppr_options['network_apply'] ) echo 'checked="checked"'; ?> /> <?php _e( 'Do not apply', 'sitemap_pro' ); ?> <span class="gglstmppr_span">(<?php _e( 'Change the settings on separate sites of the multisite only', 'sitemap_pro' ); ?>)</span></label><br />
</td> </tr> </table> <?php } ?> <div id="gglstmppr_sitemap_info"> <?php if ( ! is_network_admin() || ( is_network_admin() && $gglstmppr_options['network_apply'] != "off" ) ) {
$url_sitemaps['false'] = $url_sitemaps['true'] = array(); if ( is_network_admin() ) { $blogs = $wpdb->get_col( "SELECT `blog_id` FROM $wpdb->blogs" );
foreach ( $blogs as $blog_id ) { switch_to_blog( $blog_id ); $home_url = preg_replace( "/[^a-zA-Z--0-9\s]/", "_", str_replace( 'http://', '', str_replace( 'https://', '', home_url() ) ) );
$xml_file = 'sitemap_' . $home_url . '.xml'; $xml_url = home_url('/') . $xml_file; $url_sitemap = ABSPATH . $xml_file;
$xml_file_exists = file_exists( $url_sitemap ) ? 'true' : 'false'; $url_sitemaps[ $xml_file_exists ][] = sprintf( '<a href="%s" target="_blank">%s</a>', $xml_url, $xml_file );
if ( $xml_file_exists == 'false' ) { gglstmppr_sitemapcreate(); } else { gglstmppr_sitemap_info();
} } restore_current_blog(); gglstmppr_sitemap_index_create(); krsort( $url_sitemaps ); if ( $url_sitemaps['true'] ) {
if ( count( $url_sitemaps['true'] ) == 1 ) { printf( '<p>%s (%s) %s</p>', __( 'The Sitemap file', 'sitemap_pro' ),
implode( ', ', $url_sitemaps['true'] ), __( 'already exists. If you would like to replace it with a new one, please choose the necessary box below. All other actions will overwrite the existing file.', 'sitemap_pro' )
); } else { printf( '<p>%s (%s) %s</p>', __( 'The Sitemap files', 'sitemap_pro' ), implode( ', ', $url_sitemaps['true'] ),
__( 'already exist. If you would like to replace them with new ones, please choose the necessary box below. All other actions will overwrite the existing files.', 'sitemap_pro' )
); } } if ( $url_sitemaps['false'] ) { if ( count( $url_sitemaps['false'] ) == 1 ) { printf( '<p>%s (%s) %s</p>',
__( 'The Sitemap file', 'sitemap_pro' ), implode( ', ', $url_sitemaps['false'] ), __( 'is created in the site root directory.', 'sitemap_pro' )
); } else { printf( '<p>%s (%s) %s</p>', __( 'The Sitemap files', 'sitemap_pro' ), implode( ', ', $url_sitemaps['false'] ),
__( 'are created in the site root directory.', 'sitemap_pro' ) ); } } printf( '<p>%s <a href="https://www.google.com/webmasters/tools/home?hl=en">%s</a> %s.</p>',
__( "If you do not want a sitemap file to be added to Google Webmaster Tools automatically, you can do it using", 'sitemap_pro' ),
__( "this", 'sitemap_pro' ), __( "link - sign in, choose the necessary site, go to 'sitemaps' and fill out the mandatory field", 'sitemap_pro' )
); } else { if ( is_multisite() ) { $home_url = preg_replace( "/[^a-zA-Z--0-9\s]/", "_", str_replace( 'http://', '', str_replace( 'https://', '', home_url() ) ) );
$xml_file = 'sitemap_' . $home_url . '.xml'; } else { $xml_file = 'sitemap.xml'; } $xml_url = home_url('/') . $xml_file;
$url_sitemap = ABSPATH . $xml_file; $xml_file_exists = file_exists( $url_sitemap ) ? 'true' : 'false';
$url_sitemaps[ $xml_file_exists ] = array( 'link' => sprintf( '<a href="%s" target="_blank">%s</a>', $xml_url, __( "The Sitemap file", 'sitemap_pro' ) ),
'file' => $xml_file, 'url' => $xml_url ); if ( $xml_file_exists == 'false' ){ gglstmppr_sitemapcreate();
} else { gglstmppr_sitemap_info(); } if ( $url_sitemaps['true'] ) { printf( '<p>%s %s</p>', $url_sitemaps['true']['link']
, __( "already exists. If you would like to replace it with a new one, please choose the necessary box below. All other actions will overwrite the existing file.", 'sitemap_pro' )
); } if ( $url_sitemaps['false'] ) { printf( '<p>%s %s</p>', $url_sitemaps['false']['link'], __( "is created in the site root directory.", 'sitemap_pro' )
); } printf( '<p>%s <a href="https://www.google.com/webmasters/tools/home?hl=en">%s</a> %s - %s.</p>',
__( "If you do not want a sitemap file to be added to Google Webmaster Tools automatically, you can do it using", 'sitemap_pro' ),
__( "this", 'sitemap_pro' ), __( "link - sign in, choose the necessary site, go to 'sitemaps' and fill out the mandatory field", 'sitemap_pro' ),
( $url_sitemaps['false'] ) ? $url_sitemaps['false']['url'] : $url_sitemaps['true']['url'] ); } } ?>
</div> <div id="gglstmppr_settings_block"> <?php if ( $change_permission_attr != '' ) { echo '<div class="gglstmppr_bg"></div>';
} ?> <table id="gglstmppr_settings_table" class="form-table"> <tr valign="top"> <td colspan="2">
<label><input <?php echo $change_permission_attr; ?> type='checkbox' name='gglstmppr_new' value="1" /> <?php _e( "I want to create a new sitemap file or update the existing one", 'sitemap_pro' ); ?></label>
</td> </tr> <?php if ( is_multisite() ) { ?> <tr valign="top"> <td colspan="2"> <label><input type='checkbox' disabled="disabled" name='gglstmppr_checkbox' value="1" <?php if ( 1 == $gglstmppr_robots ) echo 'checked="checked"'; ?> /> <?php _e( "I want to add sitemap file path in robots.txt", 'sitemap_pro' );?></label>
<p style="color:red"><?php _e( "Since you are using multisiting, the plugin does not allow to add a sitemap to robots.txt", 'sitemap_pro' ); ?></div>
</td> </tr> <?php } else { ?> <tr valign="top"> <td colspan="2"> <label><input type='checkbox' name='gglstmppr_checkbox' value="1" <?php if ( 1 == $gglstmppr_robots ) echo 'checked="checked"'; ?> /> <?php _e( "I want to add sitemap file path in", 'sitemap_pro' );?> <a href="<?php echo $url_home; ?>robots.txt" target="_new">robots.txt</a></label>
</td> </tr> <?php } ?> <tr valign="top"> <th><?php _e( 'XML Sitemap "Change Frequency" parameter', 'sitemap_pro' ); ?></th>
<td> <select <?php echo $change_permission_attr; ?> name="gglstmppr_sitemap_change_frequency"> <option <?php if ( 'always' == $gglstmppr_options['sitemap_change_frequency'] ) echo 'selected="selected" '; ?>value="always"><?php _e( 'Always', 'sitemap_pro' ); ?></option>
<option <?php if ( 'hourly' == $gglstmppr_options['sitemap_change_frequency'] ) echo 'selected="selected" '; ?>value="hourly"><?php _e( 'Hourly', 'sitemap_pro' ); ?></option>
<option <?php if ( 'daily' == $gglstmppr_options['sitemap_change_frequency'] ) echo 'selected="selected" '; ?>value="daily"><?php _e( 'Daily', 'sitemap_pro' ); ?></option>
<option <?php if ( 'weekly' == $gglstmppr_options['sitemap_change_frequency'] ) echo 'selected="selected" '; ?>value="weekly"><?php _e( 'Weekly', 'sitemap_pro' ); ?></option>
<option <?php if ( 'monthly' == $gglstmppr_options['sitemap_change_frequency'] ) echo 'selected="selected" '; ?>value="monthly"><?php _e( 'Monthly', 'sitemap_pro' ); ?></option>
<option <?php if ( 'yearly' == $gglstmppr_options['sitemap_change_frequency'] ) echo 'selected="selected" '; ?>value="yearly"><?php _e( 'Yearly', 'sitemap_pro' ); ?></option>
<option <?php if ( 'never' == $gglstmppr_options['sitemap_change_frequency'] ) echo 'selected="selected" '; ?>value="never"><?php _e( 'Never', 'sitemap_pro' ); ?></option>
</select><br /> <span class="gglstmppr_span"><?php _e( 'This value is used in the sitemap file and provides general information to search engines. The sitemap itself is generated once and will be re-generated when you create or update any post or page.', 'sitemap_pro' ); ?></span>
</td> </tr> <?php if ( ! function_exists( 'curl_init' ) ) { ?> <tr valign="top"> <td colspan="2" class="gglstmppr_error">
<?php _e( "This hosting does not support URL, so you cannot add a sitemap file automatically.", 'sitemap_pro' ); ?>
</td> </tr> <?php } else { ?> <tr id="gglstmppr_google_webmaster" valign="top"> <th scope="row"><?php _e( 'Remote work with Google Webmaster Tools', 'sitemap_pro' ); ?></th>
<td> <?php $gglstmppr_client = gglstmppr_client(); if ( is_network_admin() ) { $gglstmppr_blog_prefix = '_' . 0;
$gglstmppr_options = get_site_option( 'gglstmppr_options' ); } else { $gglstmppr_blog_prefix = '_' . get_current_blog_id();
$gglstmppr_options = get_option( 'gglstmppr_options' ); } if ( isset( $_POST['gglstmppr_logout'] ) && check_admin_referer( plugin_basename( __FILE__ ), 'gglstmppr_nonce_name' ) ) {
unset( $_SESSION[ 'gglstmppr_authorization_code' . $gglstmppr_blog_prefix ] ); unset( $gglstmppr_options['authorization_code'] );
if ( is_network_admin() ) { update_site_option( 'gglstmppr_options', $gglstmppr_options ); } else {
update_option( 'gglstmppr_options', $gglstmppr_options ); } } if ( isset( $_POST['gglstmppr_authorization_code'] ) && ! empty( $_POST['gglstmppr_authorization_code'] ) && check_admin_referer( plugin_basename( __FILE__ ), 'gglstmppr_nonce_name' ) ) {
try { $gglstmppr_client->authenticate( $_POST['gglstmppr_authorization_code'] ); $gglstmppr_options['authorization_code'] = $_SESSION[ 'gglstmppr_authorization_code' . $gglstmppr_blog_prefix ] = $gglstmppr_client->getAccessToken();
if ( is_network_admin() ) { update_site_option( 'gglstmppr_options', $gglstmppr_options ); } else {
update_option( 'gglstmppr_options', $gglstmppr_options ); } } catch ( Exception $e ) {} } if ( ! isset( $_SESSION[ 'gglstmppr_authorization_code' . $gglstmppr_blog_prefix ] ) && isset( $gglstmppr_options['authorization_code'] ) ) {
$_SESSION[ 'gglstmppr_authorization_code' . $gglstmppr_blog_prefix ] = $gglstmppr_options['authorization_code'];
} if ( isset( $_SESSION[ 'gglstmppr_authorization_code' . $gglstmppr_blog_prefix ] ) ) { $gglstmppr_client->setAccessToken( $_SESSION[ 'gglstmppr_authorization_code' . $gglstmppr_blog_prefix ] );
} if ( $gglstmppr_client->getAccessToken() ) { ?> <div id="gglstmppr_logout_button"> <input <?php echo $change_permission_attr; ?> class="button-secondary" name="gglstmppr_logout" type="submit" value="<?php _e( 'Log out from Google Webmaster Tools', 'sitemap_pro' ); ?>" />
</div> <?php if ( is_multisite() && is_network_admin() ) { $gglstmppr_menu_ad = __( "I want to add network sites to Google Webmaster Tools", 'sitemap_pro' );
$gglstmppr_menu_del = __( "I want to delete network sites from Google Webmaster Tools", 'sitemap_pro' );
$gglstmppr_menu_inf = __( "I want to get info about network sites in Google Webmaster Tools", 'sitemap_pro' );
} else { $gglstmppr_menu_ad = __( "I want to add this site to Google Webmaster Tools", 'sitemap_pro' );
$gglstmppr_menu_del = __( "I want to delete this site from Google Webmaster Tools", 'sitemap_pro' );
$gglstmppr_menu_inf = __( "I want to get info about this site in Google Webmaster Tools", 'sitemap_pro' );
} ?> <label><input <?php echo $change_permission_attr; ?> type='radio' name='gglstmppr_menu' value="ad" /> <?php echo $gglstmppr_menu_ad; ?></label><br />
<label><input <?php echo $change_permission_attr; ?> type='radio' name='gglstmppr_menu' value="del" /> <?php echo $gglstmppr_menu_del; ?></label><br />
<label><input <?php echo $change_permission_attr; ?> type='radio' name='gglstmppr_menu' value="inf" /> <?php echo $gglstmppr_menu_inf; ?></label><br />
<span class="gglstmppr_span"> <?php _e( 'In case you failed to add a sitemap to Google automatically using this plugin, it is possible to do it manually', 'sitemap_pro' ); ?>:
<a target="_blank" href="https://docs.google.com/document/d/1VOJx_OaasVskCqi9fsAbUmxfsckoagPU5Py97yjha9w/edit"><?php _e( 'View the Instruction', 'sitemap_pro' ); ?></a>
</span> <?php if ( isset( $_POST['gglstmppr_menu'] ) && check_admin_referer( plugin_basename( __FILE__ ), 'gglstmppr_nonce_name' ) ) {
$gglstmppr_wmt = new Google_Service_Webmasters( $gglstmppr_client ); $gglstmppr_sv = new Google_Service_SiteVerification( $gglstmppr_client );
switch ( $_POST['gglstmppr_menu'] ) { case 'inf': if ( is_multisite() && is_network_admin() ) { $blogs = $wpdb->get_col( "SELECT `blog_id` FROM $wpdb->blogs" );
foreach ( $blogs as $blog_id ) { switch_to_blog( $blog_id ); gglstmppr_info_site( $gglstmppr_wmt, $gglstmppr_sv );
} restore_current_blog(); } else { gglstmppr_info_site( $gglstmppr_wmt, $gglstmppr_sv ); } break; case 'ad':
if ( is_multisite() && is_network_admin() ) { $blogs = $wpdb->get_col( "SELECT `blog_id` FROM $wpdb->blogs" );
foreach ( $blogs as $blog_id ) { switch_to_blog( $blog_id ); gglstmppr_add_site( $gglstmppr_wmt, $gglstmppr_sv );
} restore_current_blog(); } else { gglstmppr_add_site( $gglstmppr_wmt, $gglstmppr_sv ); } break; case 'del':
if ( is_multisite() && is_network_admin() ) { $blogs = $wpdb->get_col( "SELECT `blog_id` FROM $wpdb->blogs" );
foreach ( $blogs as $blog_id ) { switch_to_blog( $blog_id ); gglstmppr_del_site( $gglstmppr_wmt, $gglstmppr_sv );
} restore_current_blog(); } else { gglstmppr_del_site( $gglstmppr_wmt, $gglstmppr_sv ); } break; default:
break; } } } else { $gglstmppr_state = mt_rand(); $gglstmppr_client->setState( $gglstmppr_state );
$_SESSION[ 'gglstmppr_state' . $gglstmppr_blog_prefix ] = $gglstmppr_client; $gglstmppr_auth_url = $gglstmppr_client->createAuthUrl(); ?>
<p><?php _e( "Please authorize via your Google Account in order to add or delete a site and a sitemap file automatically or get information about this site in Google Webmaster Tools.", 'sitemap_pro' ); ?></p>
<a <?php echo $change_permission_attr; ?> id="gglstmppr_authorization_button" class="button-primary" href="<?php echo $gglstmppr_auth_url; ?>" target="_blank" onclick="window.open(this.href,'','top='+(screen.height/2-560/2)+',left='+(screen.width/2-640/2)+',width=640,height=560,resizable=0,scrollbars=0,menubar=0,toolbar=0,status=1,location=0').focus(); return false;"><?php _e( 'Get Authorization Code', 'sitemap_pro' ); ?></a>
<div id="gglstmppr_authorization_form"> <input <?php echo $change_permission_attr; ?> id="gglstmppr_authorization_code" name="gglstmppr_authorization_code" type="text" autocomplete="off">
<input <?php echo $change_permission_attr; ?> id="gglstmppr_authorize" class="button-primary" name="gglstmppr_authorize" type="submit" value="<?php _e( 'Authorize', 'sitemap_pro' ); ?>">
</div> <?php if ( isset( $_POST['gglstmppr_authorization_code'] ) && isset( $_POST['gglstmppr_authorize'] ) && check_admin_referer( plugin_basename( __FILE__ ), 'gglstmppr_nonce_name' ) ) { ?>
<div id="gglstmppr_authorize_error"><?php _e( 'Invalid authorization code. Please, try again.', 'sitemap_pro' ); ?></div>
<?php } } ?> </td> </tr> <?php } ?> </table> <input type="hidden" name="gglstmppr_submit" value="submit" />
<p class="submit"> <input <?php echo $change_permission_attr; ?> type="submit" class="button-primary" value="<?php _e( 'Save Changes', 'sitemap_pro' ) ?>" />
</p> <?php wp_nonce_field( plugin_basename( __FILE__ ), 'gglstmppr_nonce_name' ); ?> </div> </form>
<div class="clear"></div> <?php bws_check_pro_license_form( 'google-sitemap-pro/google-sitemap-pro.php', 'google-sitemap-pro.php' );
} } elseif ( 'extra' == $_GET['action'] ) { ?> <noscript> <div class="error"><p><strong><?php _e( "Please, enable JavaScript in Your browser.", 'sitemap_pro' ); ?></strong></p></div>
</noscript> <div class="updated fade" <?php if ( ! isset( $_REQUEST['gglstmppr_submit'] ) || '' != $exceptions_error ) echo "style=\"display:none\""; ?>><p><strong><?php echo $exceptions_message; ?></strong></p></div>
<div class="error gglstmppr_exceptions_error" <?php if ( "" == $exceptions_error ) echo "style=\"display:none\""; ?>><p><strong><?php echo $exceptions_error; ?></strong></p></div>
<p><?php _e( 'Please choose the necessary post types the links to which are to be added to the sitemap:', 'sitemap_pro' ); ?></p>
<form id="gglstmppr_settings_block" action="admin.php?page=google-sitemap-pro.php&action=extra" method="post" name="gglstmppr_exceptions">
<p><label> <input id="gglstmppr_jstree_url" type="checkbox" name="gglstmppr_jstree_url" value="1" <?php if ( 1 == $gglstmppr_options['jstree_url'] ) echo 'checked="checked"'; ?> />
<?php _e( "Show URL for pages", 'sitemap_pro' );?> </label></p> <div id="gglstmppr_jstree_box"> <div id="gglstmppr_disable_box"></div>
<div id="gglstmppr_jstree"></div> </div> <div class="clear"></div> <input type="hidden" name="gglstmppr_submit" value="submit" />
<p class="submit"> <input id="gglstmppr_exceptions_submit" type="submit" class="button-primary" value="<?php _e( 'Save Changes', 'sitemap_pro' ) ?>" />
<img id="gglstmppr_loader" alt="loader" src="<?php echo plugins_url( 'images/ajax-loader.gif', __FILE__ ); ?>">
</p> <?php wp_nonce_field( plugin_basename( __FILE__ ), 'gglstmppr_nonce_name' ); ?> </form> <?php }
bws_plugin_reviews_block( $gglstmppr_plugin_info['Name'], 'google-sitemap-plugin' ); ?> </div> <?php }
} if ( ! function_exists( 'gglstmppr_robots_add_sitemap' ) ) { function gglstmppr_robots_add_sitemap( $output, $public ) {
if ( '0' == $public ) { return $output; } else { if ( false === strpos( $output, 'Sitemap' ) ) {
if ( is_multisite() ) { $home_url = preg_replace( "/[^a-zA-Z--0-9\s]/", "_", str_replace( 'http://', '', str_replace( 'https://', '', home_url() ) ) );
$output .= "Sitemap: " . home_url( "/" ) . "sitemap_" . $home_url . ".xml"; } else { $output .= "Sitemap: " . home_url( "/" ) . "sitemap.xml";
} return $output; } } } } if ( ! function_exists( 'gglstmppr_add_plugin_stylesheet' ) ) { function gglstmppr_add_plugin_stylesheet() {
global $wp_version, $hook_suffix; if ( isset( $_GET['page'] ) && $_GET['page'] == "google-sitemap-pro.php" ) {
if ( $wp_version < 3.8 ) wp_enqueue_style( 'gglstmppr_stylesheet', plugins_url( 'css/style_wp_before_3.8.css', __FILE__ ) );
else wp_enqueue_style( 'gglstmppr_stylesheet', plugins_url( 'css/style.css', __FILE__ ) ); wp_enqueue_style( 'ui.dynatree' , plugins_url( 'css/ui.dynatree.css', __FILE__ ) );
wp_enqueue_script( 'jquery' ); wp_enqueue_script( 'jquery.dynatree', plugins_url( 'js/jquery.dynatree.js' , __FILE__ ), array( 'jquery-ui-core', 'jquery-ui-widget' ) );
wp_enqueue_script( 'gglstmppr_dynatree', plugins_url( 'js/script_for_dynatree.js' , __FILE__ ) ); wp_localize_script( 'gglstmppr_dynatree', 'gglstmppr_ajax', array( 'gglstmppr_ajax_nonce' => wp_create_nonce( 'gglstmppr_ajax_nonce' ) ) );
} if ( $hook_suffix == 'plugins.php' || ( isset( $_GET['page'] ) && $_GET['page'] == "google-sitemap-pro.php" ) )
wp_enqueue_script( 'gglstmppr_script', plugins_url( 'js/script.js' , __FILE__ ) ); } } if ( ! function_exists( 'gglstmppr_info_site' ) ) {
function gglstmppr_info_site( $gglstmppr_wmt, $gglstmppr_sv ) { $gglstmppr_instruction_url = 'https://docs.google.com/document/d/1VOJx_OaasVskCqi9fsAbUmxfsckoagPU5Py97yjha9w/edit';
$url_home = home_url('/'); $gglstmppr_options = get_option( 'gglstmppr_options' ); $gglstmppr_wmt_sites_arr = $gglstmppr_wmt_sitemaps_arr = array();
printf( '<h4>' . __( 'I want to get info about site %s in Google Webmaster Tools', 'sitemap_pro' ) . ':</h4>', sprintf( '<a href="%1$s">%1$s</a>', $url_home ) );
echo '<div class="gglstmppr_wmt_content">'; $gglstmppr_wmt_sites = $gglstmppr_wmt->sites->listSites()->getSiteEntry();
foreach ( $gglstmppr_wmt_sites as $gglstmppr_wmt_site ) { $gglstmppr_wmt_sites_arr[ $gglstmppr_wmt_site->siteUrl ] = $gglstmppr_wmt_site->permissionLevel;
} if ( ! array_key_exists( $url_home, $gglstmppr_wmt_sites_arr ) ) { printf( '<div>%s</div>', __( 'This site is not added to the Google Webmaster Tools.', 'sitemap_pro') );
echo '</div><!-- .gglstmppr_wmt_content -->'; return; } else { printf( '<div>%s</div>', __( 'This site is added to the Google Webmaster Tools.', 'sitemap_pro' ) );
printf( '<div><strong>%s</strong> <a href="%s" target="_blank">%2$s</a></div>', __( 'Site URL:', 'sitemap_pro'), $url_home );
printf( '<div><strong>%s</strong> %s</div>', __( 'Site verification:', 'sitemap_pro'), ( $gglstmppr_wmt_sites_arr[ $url_home ] == 'siteOwner' ) ? __( 'verified', 'sitemap_pro' ) : __( 'not verified', 'sitemap_pro' ) );
try { $gglstmppr_wmt_sitemaps = $gglstmppr_wmt->sitemaps->listSitemaps( $url_home )->getSitemap();
} catch ( Google_Service_Exception $e ) { $gglstmppr_sv_error = $e->getErrors(); if ( isset( $gglstmppr_sv_error[0]['message'] ) ) {
printf( '<div>%s</div>', $gglstmppr_sv_error[0]['message'] ); } else { printf( '<div>%s</div>', __( 'An unexpected error occurred when verifying site in the Google Webmaster Tools.', 'sitemap_pro' ) );
} printf( '<div>%s - <a target="_blank" href="%s">%s</a></div>', __( "The site couldn't be verified. Please, verify the site manually", 'sitemap_pro' ), $gglstmppr_instruction_url, __( 'View the Instruction', 'sitemap_pro' ) );
echo '</div><!-- .gglstmppr_wmt_content -->'; return; } foreach ( $gglstmppr_wmt_sitemaps as $gglstmppr_wmt_sitemap ) {
$gglstmppr_wmt_sitemaps_arr [ $gglstmppr_wmt_sitemap->path ] = ( $gglstmppr_wmt_sitemap->errors > 0 || $gglstmppr_wmt_sitemap->warnings > 0 ) ? true : false;
} if ( isset( $gglstmppr_options['sitemap']['loc'] ) ) { $url_sitemap = $gglstmppr_options['sitemap']['loc'];
if ( ! array_key_exists( $url_sitemap, $gglstmppr_wmt_sitemaps_arr ) ) { printf( '<div>%s</div>', __( 'The sitemap file is not added to the Google Webmaster Tools.', 'sitemap_pro') );
} else { if( ! $gglstmppr_wmt_sitemaps_arr[ $url_sitemap ] ) { printf( '<div>%s</div>', __( 'The sitemap file is added to the Google Webmaster Tools.', 'sitemap_pro') );
} else { printf( '<div class="gglstmppr_wmt_error">%s <a href="%s">%s</a></div>', __( 'The sitemap file is added to the Google Webmaster Tools, but has some errors or warnings.', 'sitemap_pro' ), sprintf( 'https://www.google.com/webmasters/tools/sitemap-details?hl=en&siteUrl=%s&sitemapUrl=%s#ISSUE_FILTER=-1', urlencode( $url_home ), urlencode( $url_sitemap ) ), __( 'Please, see them in the Google Webmaster Tools.', 'sitemap_pro' ) );
} } printf( '<div><strong>%s</strong> <a href="%s" target="_blank">%2$s</a></div></div>', __( 'Sitemap URL:', 'sitemap_pro'), $url_sitemap );
} else { printf( '<div>%s - <a target="_blank" href="%s">%s</a></div>', __( 'When checking the sitemap file an unexpected error occurred. Please, check the sitemap file manually', 'sitemap_pro' ), $gglstmppr_instruction_url, __( 'View the Instruction', 'sitemap_pro' ) );
} } echo '</div><!-- .gglstmppr_wmt_content -->'; } } if ( ! function_exists( 'gglstmppr_del_site' ) ) {
function gglstmppr_del_site( $gglstmppr_wmt, $gglstmppr_sv ) { $url_home = home_url('/'); $gglstmppr_options = get_option( 'gglstmppr_options' );
printf( '<h4>' . __( 'I want to delete site %s from Google Webmaster Tools', 'sitemap_pro' ) . '</h4>', sprintf( '<a href="%1$s">%1$s</a>', $url_home ) );
echo '<div class="gglstmppr_wmt_content">'; try { $gglstmppr_wmt_sitemaps = $gglstmppr_wmt->sitemaps->listSitemaps( $url_home )->getSitemap();
foreach ( $gglstmppr_wmt_sitemaps as $gglstmppr_wmt_sitemap ) { try { $gglstmppr_wmt->sitemaps->delete( $url_home, $gglstmppr_wmt_sitemap->path );
} catch ( Google_Service_Exception $e ) {} } } catch ( Google_Service_Exception $e ) {} try { $gglstmppr_wmt->sites->delete( $url_home );
printf( '<div>%s</div>', __( 'This site has been successfully deleted from Google Webmaster Tools', 'sitemap_pro' ) );
unset( $gglstmppr_options['site_vererification_code'] ); update_option( 'gglstmppr_options', $gglstmppr_options );
} catch ( Google_Service_Exception $e ) { printf( '<div>%s</div>', __( 'This site is not added to the Google Webmaster Tools.', 'sitemap_pro') );
} echo '</div><!-- .gglstmppr_wmt_content -->'; } } if ( ! function_exists( 'gglstmppr_add_site' ) ) {
function gglstmppr_add_site( $gglstmppr_wmt, $gglstmppr_sv ) { $gglstmppr_sv_method = 'META'; $gglstmppr_sv_type = 'SITE';
$gglstmppr_instruction_url = 'https://docs.google.com/document/d/1VOJx_OaasVskCqi9fsAbUmxfsckoagPU5Py97yjha9w/edit';
$url_home = home_url( '/' ); $gglstmppr_options = get_option( 'gglstmppr_options' ); printf( '<h4>' . __( 'I want to add site %s in Google Webmaster Tools', 'sitemap_pro' ) . '</h4>', sprintf( '<a href="%1$s">%1$s</a>', $url_home ) );
echo '<div class="gglstmppr_wmt_content">'; try { $gglstmppr_wmt->sites->add( $url_home ); printf( '<div>%s</div>', __( 'The site is added to the Google Webmaster Tools.', 'sitemap_pro' ) );
} catch ( Google_Service_Exception $e ) { $gglstmppr_wmt_error = $e->getErrors(); if ( isset( $gglstmppr_wmt_error[0]['message'] ) ) {
printf( '<div>%s</div>', $gglstmppr_wmt_error[0]['message'] ); } else { printf( '<div>%s</div>', __( 'When you add a site in the Google Webmaster Tools unexpected error occurred.', 'sitemap_pro' ) );
} printf( '<div>%s - <a target="_blank" href="%s">%s</a></div>', __( "The site couldn't be added. Please, add the site manually", 'sitemap_pro' ), $gglstmppr_instruction_url, __( 'View the Instruction', 'sitemap_pro' ) );
echo '</div><!-- .gglstmppr_wmt_content -->'; return; } try { $gglstmppr_sv_get_token_request_site = new Google_Service_SiteVerification_SiteVerificationWebResourceGettokenRequestSite;
$gglstmppr_sv_get_token_request_site->setIdentifier( $url_home ); $gglstmppr_sv_get_token_request_site->setType( $gglstmppr_sv_type );
$gglstmppr_sv_get_token_request = new Google_Service_SiteVerification_SiteVerificationWebResourceGettokenRequest;
$gglstmppr_sv_get_token_request->setSite( $gglstmppr_sv_get_token_request_site ); $gglstmppr_sv_get_token_request->setVerificationMethod( $gglstmppr_sv_method );
$getToken = $gglstmppr_sv->webResource->getToken( $gglstmppr_sv_get_token_request ); $gglstmppr_options['site_vererification_code'] = htmlspecialchars( $getToken['token'] );
if ( preg_match( '|^<meta name="google-site-verification" content="(.*)" />$|', $gglstmppr_options['site_vererification_code'] ) ) {
update_option( 'gglstmppr_options', $gglstmppr_options ); printf( '<div>%s</div>', __( 'Verification code has been successfully received and added to the site.', 'sitemap_pro' ) );
} else { printf( '<div>%s</div>', __( 'Verification code has been successfully received but has not been added to the site.', 'sitemap_pro' ) );
} } catch ( Google_Service_Exception $e ) { $gglstmppr_sv_error = $e->getErrors(); if ( isset( $gglstmppr_sv_error[0]['message'] ) ) {
printf( '<div>%s</div>', $gglstmppr_sv_error[0]['message'] ); } else { printf( '<div>%s</div>', __( 'An error has occurred when receiving the verification code site in the Google Webmaster.', 'sitemap_pro' ) );
} printf( '<div>%s - <a target="_blank" href="%s">%s</a></div>', __( "The site couldn't be verified. Please, verify the site manually", 'sitemap_pro' ), $gglstmppr_instruction_url, __( 'View the Instruction', 'sitemap_pro' ) );
echo '</div><!-- .gglstmppr_wmt_content -->'; return; } try { $gglstmppr_wmt_resource_site = new Google_Service_SiteVerification_SiteVerificationWebResourceResourceSite;
$gglstmppr_wmt_resource_site->setIdentifier( $url_home ); $gglstmppr_wmt_resource_site->setType( $gglstmppr_sv_type );
$gglstmppr_wmt_resource = new Google_Service_SiteVerification_SiteVerificationWebResourceResource; $gglstmppr_wmt_resource->setSite( $gglstmppr_wmt_resource_site );
$gglstmppr_sv->webResource->insert( $gglstmppr_sv_method, $gglstmppr_wmt_resource ); printf( '<div>%s</div>', __( 'The site has been successfully verified in the Google Webmaster Tools.', 'sitemap_pro' ) );
} catch ( Google_Service_Exception $e ) { $gglstmppr_sv_error = $e->getErrors(); if ( isset( $gglstmppr_sv_error[0]['message'] ) ) {
printf( '<div>%s</div>', $gglstmppr_sv_error[0]['message'] ); } else { printf( '<div>%s</div>', __( 'An unexpected error occurred when verifying site in the Google Webmaster Tools.', 'sitemap_pro' ) );
} printf( '<div>%s - <a target="_blank" href="%s">%s</a></div>', __( "The site couldn't be verified. Please, verify the site manually", 'sitemap_pro' ), $gglstmppr_instruction_url, __( 'View the Instruction', 'sitemap_pro' ) );
echo '</div><!-- .gglstmppr_wmt_content -->'; return; } if ( isset( $gglstmppr_options['sitemap']['loc'] ) ) {
$url_sitemap = $gglstmppr_options['sitemap']['loc']; $gglstmppr_check_sitemap = gglstmppr_check_sitemap( $url_sitemap );
if ( $gglstmppr_check_sitemap['code'] == 200 ) { try { $gglstmppr_wmt->sitemaps->submit( $url_home, $url_sitemap );
printf( '<div>%s</div>', __( 'The sitemap file has been successfully added to the Google Webmaster Tools.', 'sitemap_pro' ) );
} catch ( Google_Service_Exception $e ) { $gglstmppr_wmt_error = $e->getErrors(); if ( isset( $gglstmppr_wmt_error[0]['message'] ) ) {
printf( '<div>%s</div>', $gglstmppr_wmt_error[0]['message'] ); } else { printf( '<div>%s</div>', __( 'When you add a sitemap file in the Google Webmaster Tools unexpected error occurred.', 'sitemap_pro' ) );
} printf( '<div>%s - <a target="_blank" href="%s">%s</a></div>', __( "The sitemap file couldn't be added. Please, add the sitemap file manually", 'sitemap_pro' ), $gglstmppr_instruction_url, __( 'View the Instruction', 'sitemap_pro' ) );
} } else { printf( '<div>%s</div>', sprintf( __( 'Error 404. The sitemap file %s not found.', 'sitemap_pro' ), sprintf( '(<a href="%s">%s</a>)', $gglstmppr_options['sitemap']['loc'], $gglstmppr_options['sitemap']['file'] ) ) );
} } else { printf( '<div>%s</div>', __( 'The sitemap file not found.', 'sitemap_pro' ) ); } echo '</div><!-- .gglstmppr_wmt_content -->';
} } if ( ! function_exists( 'gglstmppr_add_verification_code' ) ) { function gglstmppr_add_verification_code() {
$gglstmppr_options = get_option( 'gglstmppr_options' ); if ( isset( $gglstmppr_options['site_vererification_code'] ) ) {
echo htmlspecialchars_decode( $gglstmppr_options['site_vererification_code'] ); } } } if ( ! function_exists( 'gglstmppr_check_post_status' ) ) {
function gglstmppr_check_post_status( $new_status, $old_status, $post ) { if ( ! wp_is_post_revision( $post->ID ) ) {
global $gglstmppr_update_sitemap; if ( 'publish' == $new_status || 'trash' == $new_status || 'future' == $new_status ) {
$gglstmppr_update_sitemap = true; } elseif ( ( 'publish' == $old_status || 'future' == $old_status ) &&
( 'auto-draft' == $new_status || 'draft' == $new_status || 'private' == $new_status || 'pending' == $new_status ) ) {
$gglstmppr_update_sitemap = true; } } } } if ( ! function_exists( 'gglstmppr_update_sitemap' ) ) {
function gglstmppr_update_sitemap( $post_id ) { if ( ! wp_is_post_revision( $post_id ) ) { global $gglstmppr_update_sitemap;
if ( true === $gglstmppr_update_sitemap ) { gglstmppr_register_settings(); gglstmppr_sitemapcreate();
} } } } if ( ! function_exists( 'gglstmppr_action_links' ) ) { function gglstmppr_action_links( $links, $file ) {
static $this_plugin; if ( ! $this_plugin ) $this_plugin = 'google-sitemap-pro/google-sitemap-pro.php';
if ( $file == $this_plugin ) { $settings_link = '<a href="admin.php?page=google-sitemap-pro.php">' . __( 'Settings', 'sitemap_pro' ) . '</a>';
array_unshift( $links, $settings_link ); } return $links; } } if ( ! function_exists( 'gglstmppr_links' ) ) {
function gglstmppr_links( $links, $file ) { if ( $file == 'google-sitemap-pro/google-sitemap-pro.php' ) {
$links[] = '<a href="admin.php?page=google-sitemap-pro.php">' . __( 'Settings','sitemap_pro' ) . '</a>';
$links[] = '<a href="http://bestwebsoft.com/products/google-sitemap/faq/" target="_blank">' . __( 'FAQ','sitemap_pro' ) . '</a>';
$links[] = '<a href="http://support.bestwebsoft.com">' . __( 'Support','sitemap_pro' ) . '</a>'; } return $links;
} } if ( ! function_exists ( 'gglstmppr_ajax_get_post_types' ) ) { function gglstmppr_ajax_get_post_types() {
check_ajax_referer( 'gglstmppr_ajax_nonce', 'gglstmppr_nonce' ); $gglstmppr_options = get_option( 'gglstmppr_options' );
$post_types = get_post_types( '', 'objects' ); unset( $post_types['revision'] ); unset( $post_types['attachment'] );
unset( $post_types['nav_menu_item'] ); $post_types_array = array(); foreach ( $post_types as $key => $value ) {
$posts_name['title'] = $value->labels->name; $posts_name['isFolder'] = true; $posts_name['isLazy'] = true;
if ( ! isset( $gglstmppr_options['exception']['post_type'][ $key ] ) ) $posts_name['select'] = true;
else $posts_name['select'] = false; if ( isset( $gglstmppr_options['has_sub_exception']['post_type'][ $key ] ) )
$posts_name['hasSubSel'] = true; else $posts_name['hasSubSel'] = false; $posts_name['unselectable'] = false;
$posts_name['noLink'] = true; $posts_name['post_type'] = $key; $posts_name['addClass'] = $key; $post_types_array[] = $posts_name;
} echo json_encode( $post_types_array ); die(); } } if ( ! function_exists ( 'gglstmppr_ajax_get_categories' ) ) {
function gglstmppr_ajax_get_categories() { check_ajax_referer( 'gglstmppr_ajax_nonce', 'gglstmppr_nonce' );
$gglstmppr_options = get_option( 'gglstmppr_options' ); $args = array( 'orderby' => 'name', 'order' => 'ASC',
'show_count' => 1, 'hide_empty' => 1, 'echo' => 0 ); $categories = get_categories( $args ); $categories_array = array();
foreach ( $categories as $key => $value ) { $categories_name['title'] = $value->name; $categories_name['isFolder'] = true;
$categories_name['isLazy'] = true; $categories_name['noLink'] = true; $categories_name['post_type'] = 'post';
$categories_name['category_id'] = $value->cat_ID; if ( isset( $gglstmppr_options['exception']['categories'][ $value->cat_ID ] ) )
$categories_name['select'] = false; elseif ( isset( $gglstmppr_options['exception']['post_type']['post'] ) )
$categories_name['select'] = false; else $categories_name['select'] = true; if ( isset( $gglstmppr_options['has_sub_exception']['categories'][ $value->cat_ID ] ) )
$categories_name['hasSubSel'] = true; else $categories_name['hasSubSel'] = false; $categories_array[] = $categories_name;
} echo json_encode( $categories_array ); die(); } } if ( ! function_exists ( 'gglstmppr_ajax_get_elements' ) ) {
function gglstmppr_ajax_get_elements() { check_ajax_referer( 'gglstmppr_ajax_nonce', 'gglstmppr_nonce' );
$gglstmppr_options = get_option( 'gglstmppr_options' ); if ( isset( $_REQUEST['post_type'] ) ) { $posts_array = array();
if ( isset( $_REQUEST['category_id'] ) ) { $args = array( 'post_type' => $_REQUEST['post_type'], 'posts_per_page' => -1,
'category' => $_REQUEST['category_id'] ); } else { $args = array( 'post_type' => $_REQUEST['post_type'],
'posts_per_page' => -1 ); } $all_posts = get_posts( $args ); foreach ( $all_posts as $post ) { if ( $post->post_title )
setup_postdata( $post ); $post_info['title'] = $post->post_title . '<span class="gglstmppr_element_url';
if ( isset( $_REQUEST['gglstmppr_url_setting'] ) && 'false' == $_REQUEST['gglstmppr_url_setting'] )
$post_info['title'] .= ' hidden'; $post_info['title'] .= '">- <a target="_blank" href="' . get_permalink( $post->ID ) . '">' . get_permalink( $post->ID ) . '</a></span>';
$post_info['noLink'] = true; $post_info['post_id'] = $post->ID; $post_info['post_type'] = $_REQUEST['post_type'];
if ( isset( $gglstmppr_options['exception']['post_id'][ $post->ID ] ) ) $post_info['select'] = false;
elseif ( isset( $gglstmppr_options['exception']['post_type'][ $_REQUEST['post_type'] ] ) ) $post_info['select'] = false;
elseif ( isset( $_REQUEST['category_id'] ) && isset( $gglstmppr_options['exception']['categories'][ $_REQUEST['category_id'] ] ) )
$post_info['select'] = false; else $post_info['select'] = true; $posts_array[] = $post_info; } wp_reset_postdata();
echo json_encode( $posts_array ); } die(); } } if ( ! function_exists ( 'gglstmppr_ajax_exception_element' ) ) {
function gglstmppr_ajax_exception_element() { check_ajax_referer( 'gglstmppr_ajax_nonce', 'gglstmppr_nonce' );
$gglstmppr_options = get_option( 'gglstmppr_options' ); $gglstmppr_options['exception'] = array( 'post_type' => array(),
'categories' => array(), 'post_id' => array() ); $gglstmppr_options['has_sub_exception'] = array(
'post_type' => array(), 'categories' => array() ); if ( isset( $_REQUEST['gglstmppr_deselected_array'] ) ) {
foreach ( $_REQUEST['gglstmppr_deselected_array'] as $key => $value ) { if ( isset( $value['category_id'] ) && ! empty( $value['category_id'] ) ) {
$gglstmppr_options['exception']['categories'][ $value['category_id'] ] = $value['category_id']; $gglstmppr_options['has_sub_exception']['post_type'][ $value['post_type'] ] = $value['post_type'];
} else if ( isset( $value['post_id'] ) && ! empty( $value['post_id'] ) ) { $gglstmppr_options['exception']['post_id'][ $value['post_id'] ] = $value['post_id'];
$gglstmppr_options['has_sub_exception']['post_type'][ $value['post_type'] ] = $value['post_type']; $post_categories = wp_get_post_categories( $value['post_id'] );
if ( isset( $post_categories ) && is_array( $post_categories ) && !empty( $post_categories ) ) { foreach ( $post_categories as $key_cat => $value_cat ) {
$gglstmppr_options['has_sub_exception']['categories'][ $value_cat ] = $value_cat; } } } else if ( isset( $value['post_type'] ) && ! empty( $value['post_type'] ) ) {
$gglstmppr_options['exception']['post_type'][ $value['post_type'] ] = $value['post_type']; } } } $gglstmppr_options['jstree_url'] = ( isset( $_REQUEST['gglstmppr_url_setting'] ) && 'false' != $_REQUEST['gglstmppr_url_setting'] ) ? 1 : 0;
update_option( 'gglstmppr_options', $gglstmppr_options ); gglstmppr_sitemapcreate(); die(); } } if ( ! function_exists( 'gglstmppr_delete_settings' ) ) {
function gglstmppr_delete_settings() { delete_option( 'gglstmppr_options' ); delete_site_option( 'gglstmppr_options' );
delete_option( 'gglstmppr_robots' ); } } if ( ! function_exists( 'gglstmppr_update_activate' ) ) {
function gglstmppr_update_activate() { global $bestwebsoft_wp_update_plugins, $bstwbsftwppdtplgns_options;
deactivate_plugins( 'google-sitemap-plugin/google-sitemap-plugin.php' ); if ( !function_exists ( 'bestwebsoft_wp_update_plugins' ) && ! $bestwebsoft_wp_update_plugins ) {
$bestwebsoft_wp_update_plugins = true; require_once( dirname( __FILE__ ) . '/bws_update.php' ); } if ( $bstwbsftwppdtplgns_options && !file_exists( dirname( __FILE__ ) . '/license_key.txt' ) ) {
if ( isset( $bstwbsftwppdtplgns_options['google-sitemap-pro/google-sitemap-pro.php'] ) ) { $bws_license_key = $bstwbsftwppdtplgns_options['google-sitemap-pro/google-sitemap-pro.php'];
$file = @fopen( dirname( __FILE__ ) . "/license_key.txt" , "w+" ); if ( $file ) { @fwrite( $file, $bws_license_key );
@fclose( $file ); } } } } } if ( ! function_exists( 'gglstmppr_license_cron_task' ) ) { function gglstmppr_license_cron_task() {
if ( ! function_exists ( 'bestwebsoft_license_cron_task' ) ) require_once( dirname( __FILE__ ) . '/bws_update.php' );
bestwebsoft_license_cron_task( 'google-sitemap-pro/google-sitemap-pro.php', 'google-sitemap-plugin/google-sitemap-plugin.php' );
} } if ( ! function_exists ( 'gglstmppr_plugin_update_row' ) ) { function gglstmppr_plugin_update_row( $file, $plugin_data ) {
bws_plugin_update_row( 'google-sitemap-pro/google-sitemap-pro.php' ); } } if ( ! function_exists ( 'gglstmppr_plugin_banner' ) ) {
function gglstmppr_plugin_banner() { global $hook_suffix, $gglstmppr_plugin_info; if ( $hook_suffix == 'plugins.php' ) {
bws_plugin_banner_timeout( 'google-sitemap-pro/google-sitemap-pro.php', 'gglstmppr', $gglstmppr_plugin_info['Name'], '//ps.w.org/google-sitemap-plugin/assets/icon-128x128.png' );
} } } if ( ! function_exists( 'gglstmppr_inject_info' ) ) { function gglstmppr_inject_info( $result, $action = null, $args = null ) {
if ( ! function_exists( 'bestwebsoft_inject_info' ) ) require_once( dirname( __FILE__ ) . '/bws_update.php' );
return bestwebsoft_inject_info( $result, $action, $args, 'google-sitemap-pro' ); } } add_action( 'admin_menu', 'gglstmppr_admin_menu' );
if ( function_exists( 'is_multisite' ) && is_multisite() ) add_action( 'network_admin_menu', 'gglstmppr_admin_menu' );
add_action( 'init', 'gglstmppr_init' ); add_action( 'admin_init', 'gglstmppr_admin_init' ); add_action( 'admin_enqueue_scripts', 'gglstmppr_add_plugin_stylesheet' );
add_action( 'transition_post_status', 'gglstmppr_check_post_status', 10, 3 ); add_action( 'save_post', 'gglstmppr_update_sitemap' );
add_action( 'trashed_post ', 'gglstmppr_update_sitemap' ); if ( 1 == get_option( 'gglstmppr_robots' ) )
add_filter( 'robots_txt', 'gglstmppr_robots_add_sitemap', 10, 2 ); add_action( 'wp_head', 'gglstmppr_add_verification_code' );
add_filter( 'plugin_action_links', 'gglstmppr_action_links', 10, 2 ); add_filter( 'plugin_row_meta', 'gglstmppr_links', 10, 2 );
add_action( 'wp_ajax_gglstmppr_get_post_types', 'gglstmppr_ajax_get_post_types' ); add_action( 'wp_ajax_gglstmppr_get_categories', 'gglstmppr_ajax_get_categories' );
add_action( 'wp_ajax_gglstmppr_get_elements', 'gglstmppr_ajax_get_elements' ); add_action( 'wp_ajax_gglstmppr_exception_element', 'gglstmppr_ajax_exception_element' );
add_action( 'google_sitemap_pro_license_cron', 'gglstmppr_license_cron_task' ); add_action( "after_plugin_row_google-sitemap-pro/google-sitemap-pro.php", 'gglstmppr_plugin_update_row', 10, 2 );
add_action( 'admin_notices', 'gglstmppr_plugin_banner' ); add_filter( 'plugins_api', 'gglstmppr_inject_info', 20, 3 );
register_uninstall_hook( 'google-sitemap-pro/google-sitemap-pro.php', 'gglstmppr_delete_settings');
Did this file decode correctly?
Original Code
eval( base64_decode(
'aWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyggJ2dnbHN0bXBwcl9hZG1pbl9tZW51JyApICkgeyBmdW5jdGlvbiBnZ2xzdG1wcHJfYWRtaW5fbWVudSgpIHsgYndzX2FkZF9nZW5lcmFsX21lbnUoICdnb29nbGUtc2l0ZW1hcC1wcm8vZ29vZ2xlLXNpdGVtYXAtcHJvLnBocCcgKTsKYWRkX3N1Ym1lbnVfcGFnZSggJ2J3c19wbHVnaW5zJywgX18oICdHb29nbGUgU2l0ZW1hcCBQcm8gU2V0dGluZ3MnLCAnc2l0ZW1hcF9wcm8nICksICdHb29nbGUgU2l0ZW1hcCBQcm8nLCAnbWFuYWdlX29wdGlvbnMnLCAiZ29vZ2xlLXNpdGVtYXAtcHJvLnBocCIsICdnZ2xzdG1wcHJfb3B0aW9uc19wYWdlJyApOwpnZ2xzdG1wcHJfdXBkYXRlX2FjdGl2YXRlKCk7IGdsb2JhbCAkdXJsX2hvbWUsICR1cmw7ICR1cmxfaG9tZSA9IGhvbWVfdXJsKCAnLycgKTsgJHVybCA9IHVybGVuY29kZSggJHVybF9ob21lICk7Cn0gfSBpZiAoICEgZnVuY3Rpb25fZXhpc3RzKCAnZ2dsc3RtcHByX2luaXQnICkgKSB7IGZ1bmN0aW9uIGdnbHN0bXBwcl9pbml0KCkgeyBnbG9iYWwgJGdnbHN0bXBwcl9wbHVnaW5faW5mbzsKaWYgKCAhIHNlc3Npb25faWQoKSApIHsgc2Vzc2lvbl9zdGFydCgpOyB9IGxvYWRfcGx1Z2luX3RleHRkb21haW4oICdzaXRlbWFwX3BybycsIGZhbHNlLCBkaXJuYW1lKCBwbHVnaW5fYmFzZW5hbWUoIF9fRklMRV9fICkgKSAuICcvbGFuZ3VhZ2VzLycgKTsKcmVxdWlyZV9vbmNlKCBkaXJuYW1lKCBfX0ZJTEVfXyApIC4gJy9id3NfbWVudS9id3NfZnVuY3Rpb25zLnBocCcgKTsgaWYgKCBlbXB0eSggJGdnbHN0bXBwcl9wbHVnaW5faW5mbyApICkgewogaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyggJ2dldF9wbHVnaW5fZGF0YScgKSApIHJlcXVpcmVfb25jZSggQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy9wbHVnaW4ucGhwJyApOwokZ2dsc3RtcHByX3BsdWdpbl9pbmZvID0gZ2V0X3BsdWdpbl9kYXRhKCBkaXJuYW1lKCBfX0ZJTEVfXyApIC4gJy9nb29nbGUtc2l0ZW1hcC1wcm8ucGhwJyApOyB9IGJ3c193cF92ZXJzaW9uX2NoZWNrKCAnZ29vZ2xlLXNpdGVtYXAtcHJvL2dvb2dsZS1zaXRlbWFwLXByby5waHAnLCAkZ2dsc3RtcHByX3BsdWdpbl9pbmZvLCAiMy4xIiApOwp9IH0gaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyggJ2dnbHN0bXBwcl9hZG1pbl9pbml0JyApICkgeyBmdW5jdGlvbiBnZ2xzdG1wcHJfYWRtaW5faW5pdCgpIHsgZ2xvYmFsICRid3NfcGx1Z2luX2luZm8sICRnZ2xzdG1wcHJfcGx1Z2luX2luZm87CiBpZiAoICEgaXNzZXQoICRid3NfcGx1Z2luX2luZm8gKSB8fCBlbXB0eSggJGJ3c19wbHVnaW5faW5mbyApICkgJGJ3c19wbHVnaW5faW5mbyA9IGFycmF5KCAnaWQnID0+ICcxMDYnLCAndmVyc2lvbicgPT4gJGdnbHN0bXBwcl9wbHVnaW5faW5mb1siVmVyc2lvbiJdICk7CiBpZiAoIGlzc2V0KCAkX0dFVFsncGFnZSddICkgJiYgImdvb2dsZS1zaXRlbWFwLXByby5waHAiID09ICRfR0VUWydwYWdlJ10gKSBnZ2xzdG1wcHJfcmVnaXN0ZXJfc2V0dGluZ3MoKTsKfSB9IGlmICggISBmdW5jdGlvbl9leGlzdHMoICdnZ2xzdG1wcHJfcmVnaXN0ZXJfc2V0dGluZ3MnICkgKSB7IGZ1bmN0aW9uIGdnbHN0bXBwcl9yZWdpc3Rlcl9zZXR0aW5ncygpIHsKIGdsb2JhbCAkZ2dsc3RtcHByX29wdGlvbnMsICRnZ2xzdG1wcHJfcGx1Z2luX2luZm87ICRnZ2xzdG1wcHJfb3B0aW9uX2RlZmF1bHRzID0gYXJyYXkoICdwbHVnaW5fb3B0aW9uX3ZlcnNpb24nID0+ICRnZ2xzdG1wcHJfcGx1Z2luX2luZm9bIlZlcnNpb24iXSwKICdqc3RyZWVfdXJsJyA9PiAxLCAnZXhjZXB0aW9uJyA9PiBhcnJheSggJ3Bvc3RfdHlwZScgPT4gYXJyYXkoKSwgJ2NhdGVnb3JpZXMnID0+IGFycmF5KCksICdwb3N0X2lkJyA9PiBhcnJheSgpCiApLCAnaGFzX3N1Yl9leGNlcHRpb24nID0+IGFycmF5KCAncG9zdF90eXBlJyA9PiBhcnJheSgpLCAnY2F0ZWdvcmllcycgPT4gYXJyYXkoKSApLCAnc2l0ZW1hcF9jaGFuZ2VfZnJlcXVlbmN5JyA9PiAnbW9udGhseScsCiAnc2l0ZW1hcCcgPT4gYXJyYXkoKSApOyAkZ2dsc3RtcHByX3NpdGVtYXByZWNyZWF0ZSA9IGZhbHNlOyBpZiAoIGlzX211bHRpc2l0ZSgpICYmIGlzX25ldHdvcmtfYWRtaW4oKSApIHsKIGlmICggISBnZXRfc2l0ZV9vcHRpb24oICdnZ2xzdG1wcHJfb3B0aW9ucycgKSApIHsgJGdnbHN0bXBwcl9vcHRpb25fZGVmYXVsdHNbJ25ldHdvcmtfYXBwbHknXSA9ICdkZWZhdWx0JzsKJGdnbHN0bXBwcl9vcHRpb25fZGVmYXVsdHNbJ25ldHdvcmtfdmlldyddID0gJzEnOyAkZ2dsc3RtcHByX29wdGlvbl9kZWZhdWx0c1snbmV0d29ya19jaGFuZ2UnXSA9ICcxJzsKYWRkX3NpdGVfb3B0aW9uKCAnZ2dsc3RtcHByX29wdGlvbnMnLCAkZ2dsc3RtcHByX29wdGlvbl9kZWZhdWx0cyApOyB9ICRnZ2xzdG1wcHJfb3B0aW9ucyA9IGdldF9zaXRlX29wdGlvbiggJ2dnbHN0bXBwcl9vcHRpb25zJyApOwp9IGVsc2UgeyBpZiAoICEgZ2V0X29wdGlvbiggJ2dnbHN0bXBwcl9vcHRpb25zJyApICkgeyBpZiAoIGlzX211bHRpc2l0ZSgpICkgeyBpZiAoICRnZ2xzdG1wcHJfbmV0d29ya19vcHRpb25zID0gZ2V0X3NpdGVfb3B0aW9uKCAnZ2dsc3RtcHByX29wdGlvbnMnICkgKSB7CiBpZiAoICdvZmYnICE9ICRnZ2xzdG1wcHJfbmV0d29ya19vcHRpb25zWyduZXR3b3JrX2FwcGx5J10gKSB7ICRnZ2xzdG1wcHJfb3B0aW9uX2RlZmF1bHRzID0gJGdnbHN0bXBwcl9uZXR3b3JrX29wdGlvbnM7CnVuc2V0KCAkZ2dsc3RtcHByX29wdGlvbl9kZWZhdWx0c1snbmV0d29ya19hcHBseSddICk7IHVuc2V0KCAkZ2dsc3RtcHByX29wdGlvbl9kZWZhdWx0c1snbmV0d29ya192aWV3J10gKTsKdW5zZXQoICRnZ2xzdG1wcHJfb3B0aW9uX2RlZmF1bHRzWyduZXR3b3JrX2NoYW5nZSddICk7ICR1c2VfbmV0d29ya19kZWZhdWx0ID0gdHJ1ZTsgfSB9IH0gaWYgKCBlbXB0eSggJHVzZV9uZXR3b3JrX2RlZmF1bHQgKSApIHsKIGlmICggZ2V0X29wdGlvbiggJ2dnbHN0bXBfc2V0dGluZ3MnICkgKSB7ICRnZ2xzdG1wX29wdGlvbnMgPSBnZXRfb3B0aW9uKCAnZ2dsc3RtcF9zZXR0aW5ncycgKTsgJGdnbHN0bXBwcl9vcHRpb25fZGVmYXVsdHMgPSBhcnJheV9tZXJnZSggJGdnbHN0bXBwcl9vcHRpb25fZGVmYXVsdHMsICRnZ2xzdG1wX29wdGlvbnMgKTsKJGdnbHN0bXBwcl9zaXRlbWFwcmVjcmVhdGUgPSB0cnVlOyB9IH0gYWRkX29wdGlvbiggJ2dnbHN0bXBwcl9vcHRpb25zJywgJGdnbHN0bXBwcl9vcHRpb25fZGVmYXVsdHMgKTsKfSAkZ2dsc3RtcHByX29wdGlvbnMgPSBnZXRfb3B0aW9uKCAnZ2dsc3RtcHByX29wdGlvbnMnICk7IH0gaWYgKCAkZ2dsc3RtcHByX3NpdGVtYXByZWNyZWF0ZSApIHsgZ2dsc3RtcHByX3NpdGVtYXBjcmVhdGUoKTsKfSBpZiAoICEgaXNzZXQoICRnZ2xzdG1wcHJfb3B0aW9uc1sncGx1Z2luX29wdGlvbl92ZXJzaW9uJ10gKSB8fCAkZ2dsc3RtcHByX29wdGlvbnNbJ3BsdWdpbl9vcHRpb25fdmVyc2lvbiddICE9ICRnZ2xzdG1wcHJfcGx1Z2luX2luZm9bIlZlcnNpb24iXSApIHsKICRnZ2xzdG1wcHJfb3B0aW9ucyA9IGFycmF5X21lcmdlKCAkZ2dsc3RtcHByX29wdGlvbl9kZWZhdWx0cywgJGdnbHN0bXBwcl9vcHRpb25zICk7ICRnZ2xzdG1wcHJfb3B0aW9uc1sncGx1Z2luX29wdGlvbl92ZXJzaW9uJ10gPSAkZ2dsc3RtcHByX3BsdWdpbl9pbmZvWyJWZXJzaW9uIl07CnVwZGF0ZV9vcHRpb24oICdnZ2xzdG1wcHJfb3B0aW9ucycsICRnZ2xzdG1wcHJfb3B0aW9ucyApOyB9IH0gfSBpZiAoICEgZnVuY3Rpb25fZXhpc3RzKCAnZ2dsc3RtcHByX3NpdGVtYXBjcmVhdGUnICkgKSB7CiBmdW5jdGlvbiBnZ2xzdG1wcHJfc2l0ZW1hcGNyZWF0ZSgpIHsgZ2xvYmFsICR3cGRiLCAkZ2dsc3RtcHByX29wdGlvbnM7ICRzdHJfcG9zdF90eXBlID0gIiI7IGlmICggISAkZ2dsc3RtcHByX29wdGlvbnMgKQogZ2dsc3RtcHByX3JlZ2lzdGVyX3NldHRpbmdzKCk7ICRwb3N0X3R5cGVzID0gZ2V0X3Bvc3RfdHlwZXMoICcnLCAnb2JqZWN0cycgKTsgdW5zZXQoICRwb3N0X3R5cGVzWydyZXZpc2lvbiddICk7CnVuc2V0KCAkcG9zdF90eXBlc1snYXR0YWNobWVudCddICk7IHVuc2V0KCAkcG9zdF90eXBlc1snbmF2X21lbnVfaXRlbSddICk7IGZvcmVhY2ggKCAkcG9zdF90eXBlcyBhcyAka2V5ID0+ICR2YWx1ZSApIHsKIGlmICggISBpc3NldCggJGdnbHN0bXBwcl9vcHRpb25zWydleGNlcHRpb24nXVsncG9zdF90eXBlJ11bICRrZXkgXSApICkgeyBpZiAoICRzdHJfcG9zdF90eXBlICE9ICIiICkKICRzdHJfcG9zdF90eXBlIC49ICIsICI7ICRzdHJfcG9zdF90eXBlIC49ICInIiAuICRrZXkgLiAiJyI7IH0gfSBpZiAoICRzdHJfcG9zdF90eXBlICE9ICcnICkgJGxvYyA9ICR3cGRiLT5nZXRfcmVzdWx0cyggIlNFTEVDVCBJRCwgcG9zdF9tb2RpZmllZCwgcG9zdF9zdGF0dXMsIHBvc3RfdHlwZSwgcGluZ19zdGF0dXMgRlJPTSAkd3BkYi0+cG9zdHMgV0hFUkUgcG9zdF9zdGF0dXMgPSAncHVibGlzaCcgQU5EIHBvc3RfdHlwZSBJTiAoIiAuICRzdHJfcG9zdF90eXBlIC4gIikiICk7CmVsc2UgJGxvYyA9IGFycmF5KCk7ICR4bWwgPSBuZXcgRG9tRG9jdW1lbnQoICcxLjAnLCAndXRmLTgnICk7IGlmICggZGVmaW5lZCggJ1dQX0NPTlRFTlRfRElSJyApICkgJHhtbF9zdHlsZXNoZWV0X3BhdGggPSBob21lX3VybCggJy8nICkgLiBiYXNlbmFtZSggV1BfQ09OVEVOVF9ESVIgKTsKZWxzZSAkeG1sX3N0eWxlc2hlZXRfcGF0aCA9IGhvbWVfdXJsKCAnLycgKSAuICJ3cC1jb250ZW50IjsgaWYgKCBkZWZpbmVkKCAnV1BfUExVR0lOX0RJUicgKSApICR4bWxfc3R5bGVzaGVldF9wYXRoIC49ICcvJyAuIGJhc2VuYW1lKCBXUF9QTFVHSU5fRElSICkgLiAiL2dvb2dsZS1zaXRlbWFwLXByby9zaXRlbWFwLnhzbCI7CmVsc2UgJHhtbF9zdHlsZXNoZWV0X3BhdGggLj0gIi9wbHVnaW5zL2dvb2dsZS1zaXRlbWFwLXByby9zaXRlbWFwLnhzbCI7ICR4c2x0ID0gJHhtbC0+Y3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKCAneG1sLXN0eWxlc2hlZXQnLCAidHlwZT1cInRleHQveHNsXCIgaHJlZj1cIiR4bWxfc3R5bGVzaGVldF9wYXRoXCIiICk7CiR4bWwtPmFwcGVuZENoaWxkKCAkeHNsdCApOyAkdXJsc2V0ID0gJHhtbC0+YXBwZW5kQ2hpbGQoICR4bWwtPmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cuc2l0ZW1hcHMub3JnL3NjaGVtYXMvc2l0ZW1hcC8wLjknLCd1cmxzZXQnICkgKTsKZm9yZWFjaCAoICRsb2MgYXMgJHZhbCApIHsgJGV4Y2x1ZGVfcG9zdCA9IGZhbHNlOyBpZiAoICdwb3N0JyA9PSAkdmFsLT5wb3N0X3R5cGUgJiYgaXNzZXQoICRnZ2xzdG1wcHJfb3B0aW9uc1snZXhjZXB0aW9uJ11bJ2NhdGVnb3JpZXMnXSApICYmICEgZW1wdHkoICRnZ2xzdG1wcHJfb3B0aW9uc1snZXhjZXB0aW9uJ11bJ2NhdGVnb3JpZXMnXSApICkgewogJHBvc3RfY2F0ZWdvcmllcyA9IHdwX2dldF9wb3N0X2NhdGVnb3JpZXMoICR2YWwtPklEICk7IGZvcmVhY2ggKCAkcG9zdF9jYXRlZ29yaWVzIGFzICRrZXkgPT4gJHZhbHVlICkgewogaWYgKCBpc3NldCggJGdnbHN0bXBwcl9vcHRpb25zWydleGNlcHRpb24nXVsnY2F0ZWdvcmllcyddWyAkdmFsdWUgXSApICkgeyAkZXhjbHVkZV9wb3N0ID0gdHJ1ZTsgYnJlYWs7Cn0gfSB9IGlmICggISBpc3NldCggJGdnbHN0bXBwcl9vcHRpb25zWydleGNlcHRpb24nXVsncG9zdF9pZCddWyAkdmFsLT5JRCBdICkgJiYgJGV4Y2x1ZGVfcG9zdCA9PSBmYWxzZSApIHsKICR1cmwgPSAkdXJsc2V0LT5hcHBlbmRDaGlsZCggJHhtbC0+Y3JlYXRlRWxlbWVudCggJ3VybCcgKSApOyAkbG9jID0gJHVybC0+YXBwZW5kQ2hpbGQoICR4bWwtPmNyZWF0ZUVsZW1lbnQoICdsb2MnICkgKTsKJHBlcm1hbGluayA9IGdldF9wZXJtYWxpbmsoICR2YWwtPklEICk7ICRsb2MtPmFwcGVuZENoaWxkKCAkeG1sLT5jcmVhdGVUZXh0Tm9kZSggJHBlcm1hbGluayApICk7ICRsYXN0bW9kID0gJHVybC0+YXBwZW5kQ2hpbGQoICR4bWwtPmNyZWF0ZUVsZW1lbnQoICdsYXN0bW9kJyApICk7CiRub3cgPSAkdmFsLT5wb3N0X21vZGlmaWVkOyAkZGF0ZSA9IGRhdGUoICdZLW0tZFxUSDppOnNQJywgc3RydG90aW1lKCAkbm93ICkgKTsgJGxhc3Rtb2QtPmFwcGVuZENoaWxkKCAkeG1sIC0+IGNyZWF0ZVRleHROb2RlKCAkZGF0ZSApICk7CiRjaGFuZ2VmcmVxID0gJHVybCAtPiBhcHBlbmRDaGlsZCggJHhtbC0+Y3JlYXRlRWxlbWVudCggJ2NoYW5nZWZyZXEnICkgKTsgJGNoYW5nZWZyZXEtPmFwcGVuZENoaWxkKCAkeG1sLT5jcmVhdGVUZXh0Tm9kZSggJGdnbHN0bXBwcl9vcHRpb25zWydzaXRlbWFwX2NoYW5nZV9mcmVxdWVuY3knXSApICk7CiRwcmlvcml0eSA9ICR1cmwtPmFwcGVuZENoaWxkKCAkeG1sLT5jcmVhdGVFbGVtZW50KCAncHJpb3JpdHknICkgKTsgJHByaW9yaXR5LT5hcHBlbmRDaGlsZCggJHhtbC0+Y3JlYXRlVGV4dE5vZGUoIDEuMCApICk7Cn0gfSAkeG1sLT5mb3JtYXRPdXRwdXQgPSB0cnVlOyBpZiAoIGlzX211bHRpc2l0ZSgpICkgeyAkaG9tZV91cmwgPSBwcmVnX3JlcGxhY2UoICIvW15hLXpBLVrQkC3Qr9CwLdGPMC05XHNdLyIsICJfIiwgc3RyX3JlcGxhY2UoICdodHRwOi8vJywgJycsIHN0cl9yZXBsYWNlKCAnaHR0cHM6Ly8nLCAnJywgaG9tZV91cmwoKSApICkgKTsKJGZpbGUgPSAnc2l0ZW1hcF8nIC4gJGhvbWVfdXJsIC4gJy54bWwnOyAkeG1sLT5zYXZlKCBBQlNQQVRIIC4gJGZpbGUgKTsgZ2dsc3RtcHByX3NpdGVtYXBfaW5mbygpOyB9IGVsc2UgewogJHhtbC0+c2F2ZSggQUJTUEFUSCAuICdzaXRlbWFwLnhtbCcgKTsgfSBpZiAoIGlzX211bHRpc2l0ZSgpICYmICEgaXNfbmV0d29ya19hZG1pbigpICkgZ2dsc3RtcHByX3NpdGVtYXBfaW5kZXhfY3JlYXRlKCk7Cn0gfSBpZiAoICEgZnVuY3Rpb25fZXhpc3RzKCAnZ2dsc3RtcHByX3NpdGVtYXBfaW5kZXhfY3JlYXRlJyApICkgeyBmdW5jdGlvbiBnZ2xzdG1wcHJfc2l0ZW1hcF9pbmRleF9jcmVhdGUoKSB7CiBnbG9iYWwgJHdwZGI7IGlmICggISBpc19tdWx0aXNpdGUoKSApIHJldHVybjsgJHhtbGluZGV4ID0gbmV3IERvbURvY3VtZW50KCAnMS4wJywgJ3V0Zi04JyApOyBpZiAoIGRlZmluZWQoICdXUF9DT05URU5UX0RJUicgKSApCiAkeG1sX3N0eWxlc2hlZXRfcGF0aCA9IG5ldHdvcmtfaG9tZV91cmwoICcvJyApIC4gYmFzZW5hbWUoIFdQX0NPTlRFTlRfRElSICk7IGVsc2UgJHhtbF9zdHlsZXNoZWV0X3BhdGggPSBuZXR3b3JrX2hvbWVfdXJsKCAnLycgKSAuICJ3cC1jb250ZW50IjsKaWYgKCBkZWZpbmVkKCAnV1BfUExVR0lOX0RJUicgKSApICR4bWxfc3R5bGVzaGVldF9wYXRoIC49ICcvJyAuIGJhc2VuYW1lKCBXUF9QTFVHSU5fRElSICkgLiAiL2dvb2dsZS1zaXRlbWFwLXByby9zaXRlbWFwLWluZGV4LnhzbCI7CmVsc2UgJHhtbF9zdHlsZXNoZWV0X3BhdGggLj0gIi9wbHVnaW5zL2dvb2dsZS1zaXRlbWFwLXByby9zaXRlbWFwLWluZGV4LnhzbCI7ICR4bWxpbmRleC0+YXBwZW5kQ2hpbGQoICR4bWxpbmRleC0+Y3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKCAneG1sLXN0eWxlc2hlZXQnLCAidHlwZT1cInRleHQveHNsXCIgaHJlZj1cIiR4bWxfc3R5bGVzaGVldF9wYXRoXCIiICkgKTsKJHNpdGVtYXBpbmRleCA9ICR4bWxpbmRleC0+YXBwZW5kQ2hpbGQoICR4bWxpbmRleC0+Y3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy5zaXRlbWFwcy5vcmcvc2NoZW1hcy9zaXRlbWFwLzAuOScsJ3NpdGVtYXBpbmRleCcgKSApOwokZ2dsc3RtcHByX3NpdGVtYXBzX2NvdW50ID0gMDsgJGJsb2dzID0gJHdwZGItPmdldF9jb2woICJTRUxFQ1QgYGJsb2dfaWRgIEZST00gJHdwZGItPmJsb2dzIiApOyBmb3JlYWNoICggJGJsb2dzIGFzICRibG9nX2lkICkgewogc3dpdGNoX3RvX2Jsb2coICRibG9nX2lkICk7ICRnZ2xzdG1wcHJfb3B0aW9ucyA9IGdldF9vcHRpb24oICdnZ2xzdG1wcHJfb3B0aW9ucycgKTsgaWYgKCAkZ2dsc3RtcHByX29wdGlvbnNbJ3NpdGVtYXAnXSAmJiBmaWxlX2V4aXN0cyggJGdnbHN0bXBwcl9vcHRpb25zWydzaXRlbWFwJ11bJ3BhdGgnXSApICkgewogJHNpdGVtYXAgPSAkc2l0ZW1hcGluZGV4LT5hcHBlbmRDaGlsZCggJHhtbGluZGV4LT5jcmVhdGVFbGVtZW50KCAnc2l0ZW1hcCcgKSApOyAkbG9jID0gJHNpdGVtYXAtPmFwcGVuZENoaWxkKCAkeG1saW5kZXgtPmNyZWF0ZUVsZW1lbnQoICdsb2MnICkgKTsKJGxvYy0+YXBwZW5kQ2hpbGQoICR4bWxpbmRleC0+Y3JlYXRlVGV4dE5vZGUoICRnZ2xzdG1wcHJfb3B0aW9uc1snc2l0ZW1hcCddWydsb2MnXSApICk7ICRsYXN0bW9kID0gJHNpdGVtYXAtPmFwcGVuZENoaWxkKCAkeG1saW5kZXgtPmNyZWF0ZUVsZW1lbnQoICdsYXN0bW9kJyApICk7CiRsYXN0bW9kLT5hcHBlbmRDaGlsZCggJHhtbGluZGV4LT5jcmVhdGVUZXh0Tm9kZSggJGdnbHN0bXBwcl9vcHRpb25zWydzaXRlbWFwJ11bJ2xhc3Rtb2QnXSApICk7ICRnZ2xzdG1wcHJfc2l0ZW1hcHNfY291bnQrKzsKfSB9IHJlc3RvcmVfY3VycmVudF9ibG9nKCk7IGlmICggJGdnbHN0bXBwcl9zaXRlbWFwc19jb3VudCA+IDAgKSB7ICR4bWxpbmRleC0+Zm9ybWF0T3V0cHV0ID0gdHJ1ZTsKJHhtbGluZGV4LT5zYXZlKCBBQlNQQVRIIC4gJ3NpdGVtYXBfaW5kZXgueG1sJyApOyB9IH0gfSBpZiAoICEgZnVuY3Rpb25fZXhpc3RzKCAnZ2dsc3RtcHByX2NoZWNrX3NpdGVtYXAnICkgKSB7CiBmdW5jdGlvbiBnZ2xzdG1wcHJfY2hlY2tfc2l0ZW1hcCggJGdnbHN0bXBwcl91cmwgKSB7ICRyZXN1bHQgPSB3cF9yZW1vdGVfZ2V0KCBlc2NfdXJsX3JhdyggJGdnbHN0bXBwcl91cmwgKSApOwpyZXR1cm4gJHJlc3VsdFsncmVzcG9uc2UnXTsgfSB9IGlmICggISBmdW5jdGlvbl9leGlzdHMoICdnZ2xzdG1wcHJfc2l0ZW1hcF9pbmZvJyApICkgeyBmdW5jdGlvbiBnZ2xzdG1wcHJfc2l0ZW1hcF9pbmZvKCkgewogJGdnbHN0bXBwcl9vcHRpb25zID0gZ2V0X29wdGlvbiggJ2dnbHN0bXBwcl9vcHRpb25zJyApOyBpZiAoICEgJGdnbHN0bXBwcl9vcHRpb25zICkgeyByZXR1cm47IH0gaWYgKCBpc19tdWx0aXNpdGUoKSApIHsKICRob21lX3VybCA9IHByZWdfcmVwbGFjZSggIi9bXmEtekEtWtCQLdCv0LAt0Y8wLTlcc10vIiwgIl8iLCBzdHJfcmVwbGFjZSggJ2h0dHA6Ly8nLCAnJywgc3RyX3JlcGxhY2UoICdodHRwczovLycsICcnLCBob21lX3VybCgpICkgKSApOwokeG1sX2ZpbGUgPSAnc2l0ZW1hcF8nIC4gJGhvbWVfdXJsIC4gJy54bWwnOyB9IGVsc2UgeyAkeG1sX2ZpbGUgPSAnc2l0ZW1hcC54bWwnOyB9ICR4bWxfcGF0aCA9IEFCU1BBVEggLiAkeG1sX2ZpbGU7CiR4bWxfdXJsID0gaG9tZV91cmwoJy8nKSAuICR4bWxfZmlsZTsgaWYgKCBmaWxlX2V4aXN0cyggJHhtbF9wYXRoICkgKSB7ICRnZ2xzdG1wcHJfc2l0ZW1hcCA9IGFycmF5KAogJ2ZpbGUnID0+ICR4bWxfZmlsZSwgJ3BhdGgnID0+ICR4bWxfcGF0aCwgJ2xvYycgPT4gJHhtbF91cmwsICdsYXN0bW9kJyA9PiBkYXRlKCAnWS1tLWRcVEg6aTpzUCcsIGZpbGVtdGltZSggJHhtbF9wYXRoICkgKQogKTsgJGdnbHN0bXBwcl9vcHRpb25zWydzaXRlbWFwJ10gPSAkZ2dsc3RtcHByX3NpdGVtYXA7IHVwZGF0ZV9vcHRpb24oICdnZ2xzdG1wcHJfb3B0aW9ucycsICRnZ2xzdG1wcHJfb3B0aW9ucyApOwp9IH0gfSBpZiAoICEgZnVuY3Rpb25fZXhpc3RzICggJ2dnbHN0bXBwcl9jbGllbnQnICkgKSB7IGZ1bmN0aW9uIGdnbHN0bXBwcl9jbGllbnQoKSB7IGdsb2JhbCAkZ2dsc3RtcHByX3BsdWdpbl9pbmZvOwpyZXF1aXJlX29uY2UoIGRpcm5hbWUoIF9fRklMRV9fICkgLiAnL2dvb2dsZV9hcGkvYXV0b2xvYWQucGhwJyApOyAkY2xpZW50ID0gbmV3IEdvb2dsZV9DbGllbnQoKTsgJGNsaWVudC0+c2V0Q2xpZW50SWQoICczNzM3NDgxNzYyMS03dWpwZm40YWk0cTk4cTRuYjBnYWFxNWdhN2o3dTBrYS5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbScgKTsKJGNsaWVudC0+c2V0Q2xpZW50U2VjcmV0KCAnR01lZldQWmRSSVdrM0o3VVN1Nl9LZjZfJyApOyAkY2xpZW50LT5zZXRTY29wZXMoIGFycmF5KCAnaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vYXV0aC93ZWJtYXN0ZXJzJywgJ2h0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvc2l0ZXZlcmlmaWNhdGlvbicgKSApOwokY2xpZW50LT5zZXRSZWRpcmVjdFVyaSggJ3VybjppZXRmOndnOm9hdXRoOjIuMDpvb2InICk7ICRjbGllbnQtPnNldEFjY2Vzc1R5cGUoICdvZmZsaW5lJyApOyAkY2xpZW50LT5zZXREZXZlbG9wZXJLZXkoICdBSXphU3lCUkZpSTVUR0tLZXRlRG9EYThUOEdrSkd4UkZhMUlNeEUnICk7CiRjbGllbnQtPnNldEFwcGxpY2F0aW9uTmFtZSggJGdnbHN0bXBwcl9wbHVnaW5faW5mb1snTmFtZSddICk7IHJldHVybiAkY2xpZW50OyB9IH0gaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyAoICdnZ2xzdG1wcHJfb3B0aW9uc19wYWdlJyApICkgewogZnVuY3Rpb24gZ2dsc3RtcHByX29wdGlvbnNfcGFnZSgpIHsgZ2xvYmFsICR3cGRiLCAkd3BfdmVyc2lvbiwgJGdnbHN0bXBwcl9vcHRpb25zLCAkdXJsX2hvbWUsICR1cmwsICRnZ2xzdG1wcHJfcGx1Z2luX2luZm87CiAkdXJsX3JvYm90ID0gQUJTUEFUSCAuICJyb2JvdHMudHh0IjsgJGdnbHN0bXBwcl9yb2JvdHMgPSBnZXRfb3B0aW9uKCAnZ2dsc3RtcHByX3JvYm90cycgKTsgJG1lc3NhZ2UgPSAkZXJyb3IgPSAkY2hhbmdlX3Blcm1pc3Npb25fYXR0ciA9ICcnOwokdmlld19wZXJtaXNzaW9uID0gdHJ1ZTsgaWYgKCBpc19tdWx0aXNpdGUoKSAmJiAhIGlzX25ldHdvcmtfYWRtaW4oKSApIHsgaWYgKCAkZ2dsc3RtcHByX25ldHdvcmtfb3B0aW9ucyA9IGdldF9zaXRlX29wdGlvbiggJ2dnbHN0bXBwcl9vcHRpb25zJyApICkgewogaWYgKCAnYWxsJyA9PSAkZ2dsc3RtcHByX25ldHdvcmtfb3B0aW9uc1snbmV0d29ya19hcHBseSddICYmIDAgPT0gJGdnbHN0bXBwcl9uZXR3b3JrX29wdGlvbnNbJ25ldHdvcmtfY2hhbmdlJ10gKQogJGNoYW5nZV9wZXJtaXNzaW9uX2F0dHIgPSAnIHJlYWRvbmx5PSJyZWFkb25seSIgZGlzYWJsZWQ9ImRpc2FibGVkIic7IGlmICggJ2FsbCcgPT0gJGdnbHN0bXBwcl9uZXR3b3JrX29wdGlvbnNbJ25ldHdvcmtfYXBwbHknXSAmJiAwID09ICRnZ2xzdG1wcHJfbmV0d29ya19vcHRpb25zWyduZXR3b3JrX3ZpZXcnXSApCiAkdmlld19wZXJtaXNzaW9uID0gZmFsc2U7IH0gfSBpZiAoICEgaXNzZXQoICRfR0VUWydhY3Rpb24nXSApICYmICR2aWV3X3Blcm1pc3Npb24gKSB7IGlmICggJGNoYW5nZV9wZXJtaXNzaW9uX2F0dHIgPT0gJycgJiYgaXNzZXQoICRfUE9TVFsnZ2dsc3RtcHByX3N1Ym1pdCddICkgJiYgY2hlY2tfYWRtaW5fcmVmZXJlciggcGx1Z2luX2Jhc2VuYW1lKCBfX0ZJTEVfXyApLCAnZ2dsc3RtcHByX25vbmNlX25hbWUnICkgKSB7CiBpZiAoIGlzc2V0KCAkX1BPU1RbJ2dnbHN0bXBwcl9zaXRlbWFwX2NoYW5nZV9mcmVxdWVuY3knXSApICkgJGdnbHN0bXBwcl9vcHRpb25zWydzaXRlbWFwX2NoYW5nZV9mcmVxdWVuY3knXSA9ICRfUE9TVFsnZ2dsc3RtcHByX3NpdGVtYXBfY2hhbmdlX2ZyZXF1ZW5jeSddOwppZiAoIGlzX211bHRpc2l0ZSgpICYmIGlzX25ldHdvcmtfYWRtaW4oKSApIHsgaWYgKCAnYWxsJyA9PSAkX1JFUVVFU1RbJ2dnbHN0bXBwcl9uZXR3b3JrX2FwcGx5J10gKSB7CiAkYmxvZ3MgPSAkd3BkYi0+Z2V0X2NvbCggIlNFTEVDVCBgYmxvZ19pZGAgRlJPTSAkd3BkYi0+YmxvZ3MiICk7IGZvcmVhY2ggKCAkYmxvZ3MgYXMgJGJsb2dfaWQgKSB7CiBzd2l0Y2hfdG9fYmxvZyggJGJsb2dfaWQgKTsgaWYgKCBpc3NldCggJGdnbHN0bXBwcl9vcHRpb25zWydhdXRob3JpemF0aW9uX2NvZGUnXSApICkgeyB1bnNldCggJGdnbHN0bXBwcl9vcHRpb25zWydhdXRob3JpemF0aW9uX2NvZGUnXSApOwp9IHVwZGF0ZV9vcHRpb24oICdnZ2xzdG1wcHJfb3B0aW9ucycsICRnZ2xzdG1wcHJfb3B0aW9ucyApOyB9IHJlc3RvcmVfY3VycmVudF9ibG9nKCk7IH0gJGdnbHN0bXBwcl9vcHRpb25zWyduZXR3b3JrX2FwcGx5J10gPSAkX1JFUVVFU1RbJ2dnbHN0bXBwcl9uZXR3b3JrX2FwcGx5J107CiRnZ2xzdG1wcHJfb3B0aW9uc1snbmV0d29ya192aWV3J10gPSBpc3NldCggJF9SRVFVRVNUWydnZ2xzdG1wcHJfbmV0d29ya192aWV3J10gKSA/IDEgOiAwOyAkZ2dsc3RtcHByX29wdGlvbnNbJ25ldHdvcmtfY2hhbmdlJ10gPSBpc3NldCggJF9SRVFVRVNUWydnZ2xzdG1wcHJfbmV0d29ya19jaGFuZ2UnXSApID8gMSA6IDA7CnVwZGF0ZV9zaXRlX29wdGlvbiggJ2dnbHN0bXBwcl9vcHRpb25zJywgJGdnbHN0bXBwcl9vcHRpb25zICk7IH0gZWxzZSB7IHVwZGF0ZV9vcHRpb24oICdnZ2xzdG1wcHJfb3B0aW9ucycsICRnZ2xzdG1wcHJfb3B0aW9ucyApOwp9IGlmICggaXNzZXQoICRfUE9TVFsnZ2dsc3RtcHByX25ldyddICkgKSB7IGlmICggaXNfbmV0d29ya19hZG1pbigpICkgeyAkYmxvZ3MgPSAkd3BkYi0+Z2V0X2NvbCggIlNFTEVDVCBgYmxvZ19pZGAgRlJPTSAkd3BkYi0+YmxvZ3MiICk7CmZvcmVhY2ggKCAkYmxvZ3MgYXMgJGJsb2dfaWQgKSB7IHN3aXRjaF90b19ibG9nKCAkYmxvZ19pZCApOyBnZ2xzdG1wcHJfc2l0ZW1hcGNyZWF0ZSgpOyB9IHJlc3RvcmVfY3VycmVudF9ibG9nKCk7CmdnbHN0bXBwcl9zaXRlbWFwX2luZGV4X2NyZWF0ZSgpOyAkbWVzc2FnZSA9IF9fKCAiWW91ciBzaXRlbWFwIGZpbGVzIHdlcmUgY3JlYXRlZCBpbiB0aGUgc2l0ZSByb290IGRpcmVjdG9yeS4iLCAnc2l0ZW1hcF9wcm8nICk7Cn0gZWxzZSB7ICRtZXNzYWdlID0gX18oICJZb3VyIHNpdGVtYXAgZmlsZSBpcyBjcmVhdGVkIGluIHRoZSBzaXRlIHJvb3QgZGlyZWN0b3J5LiIsICdzaXRlbWFwX3BybycgKTsKZ2dsc3RtcHByX3NpdGVtYXBjcmVhdGUoKTsgfSB9IGlmICggaXNzZXQoICRfUE9TVFsnZ2dsc3RtcHByX2NoZWNrYm94J10gKSApIHsgaWYgKCBmaWxlX2V4aXN0cyggJHVybF9yb2JvdCApICYmICEgaXNfbXVsdGlzaXRlKCkgKSB7CiAkZnAgPSBmb3BlbiggQUJTUEFUSCAuICdyb2JvdHMudHh0JywgImErIiApOyAkZmxhZyA9IGZhbHNlOyB3aGlsZSAoIGZhbHNlICE9PSAoICRsaW5lID0gZmdldHMoICRmcCApICkgKSB7CiBpZiAoICRsaW5lID09ICJTaXRlbWFwOiAiIC4gJHVybF9ob21lIC4gInNpdGVtYXAueG1sIiApICRmbGFnID0gdHJ1ZTsgfSBpZiAoICEgJGZsYWcgKSBmd3JpdGUoICRmcCwgIlxuU2l0ZW1hcDogIiAuICR1cmxfaG9tZSAuICJzaXRlbWFwLnhtbCIgKTsKZmNsb3NlICggJGZwICk7IH0gaWYgKCBmYWxzZSA9PT0gZ2V0X29wdGlvbiggJ2dnbHN0bXBwcl9yb2JvdHMnICkgKSBhZGRfb3B0aW9uKCAnZ2dsc3RtcHByX3JvYm90cycsIDEgKTsKZWxzZSB1cGRhdGVfb3B0aW9uKCAnZ2dsc3RtcHByX3JvYm90cycsIDEgKTsgJGdnbHN0bXBwcl9yb2JvdHMgPSBnZXRfb3B0aW9uKCAnZ2dsc3RtcHByX3JvYm90cycgKTsKfSBlbHNlIHsgaWYgKCBnZXRfb3B0aW9uKCAnZ2dsc3RtcHByX3JvYm90cycgKSApIHVwZGF0ZV9vcHRpb24oICdnZ2xzdG1wcHJfcm9ib3RzJywgMCApOyAkZ2dsc3RtcHByX3JvYm90cyA9IGdldF9vcHRpb24oICdnZ2xzdG1wcHJfcm9ib3RzJyApOwp9IGlmICggJG1lc3NhZ2UgPT0gIiIgJiYgISBpc3NldCggJF9QT1NUWydnZ2xzdG1wcHJfYXV0aG9yaXplJ10gKSAmJiAhIGlzc2V0KCAkX1BPU1RbJ2dnbHN0bXBwcl9sb2dvdXQnXSApICYmICEgaXNzZXQoICRfUE9TVFsnZ2dsc3RtcHByX21lbnUnXSApICkgewogJG1lc3NhZ2UgPSBfXyggJ1NldHRpbmdzIHNhdmVkLicsICdzaXRlbWFwX3BybycgKTsgfSB9IH0gZWxzZWlmICggaXNzZXQoICRfR0VUWydhY3Rpb24nXSApICYmICdleHRyYScgPT0gJF9HRVRbJ2FjdGlvbiddICkgewogJGV4Y2VwdGlvbnNfZXJyb3IgPSAnJzsgJGV4Y2VwdGlvbnNfbWVzc2FnZSA9IF9fKCAiU2V0dGluZ3Mgc2F2ZWQuIFlvdXIgc2l0ZW1hcCBmaWxlIGlzIGNyZWF0ZWQgaW4gdGhlIHNpdGUgcm9vdCBkaXJlY3RvcnkuIiAsICdzaXRlbWFwX3BybycgKTsKfSBpZiAoICEgaXNzZXQoICRfR0VUWydhY3Rpb24nXSApICkgeyAkcmVzdWx0X2NoZWNrX3BybyA9IGJ3c19jaGVja19wcm9fbGljZW5zZSggJ2dvb2dsZS1zaXRlbWFwLXByby9nb29nbGUtc2l0ZW1hcC1wcm8ucGhwJyApOwppZiAoICEgZW1wdHkoICRyZXN1bHRfY2hlY2tfcHJvWydlcnJvciddICkgKSAkZXJyb3IgPSAkcmVzdWx0X2NoZWNrX3Byb1snZXJyb3InXTsgZWxzZWlmICggISBlbXB0eSggJHJlc3VsdF9jaGVja19wcm9bJ21lc3NhZ2UnXSApICkKICRtZXNzYWdlID0gJHJlc3VsdF9jaGVja19wcm9bJ21lc3NhZ2UnXTsgfSA/PiA8ZGl2IGNsYXNzPSJ3cmFwIj4gPGRpdiBjbGFzcz0iaWNvbjMyIGljb24zMi1id3MiIGlkPSJpY29uLW9wdGlvbnMtZ2VuZXJhbCI+PC9kaXY+CiA8aDI+R29vZ2xlIFNpdGVtYXAgUHJvIDw/cGhwIGVjaG8gKCBpc19uZXR3b3JrX2FkbWluKCkgKSA/IF9fKCAnTmV0d29yayBTZXR0aW5ncycsICdzaXRlbWFwX3BybycgKSA6IF9fKCAnU2V0dGluZ3MnLCAnc2l0ZW1hcF9wcm8nICk7ID8+PC9oMj4KIDxoMiBjbGFzcz0ibmF2LXRhYi13cmFwcGVyIj4gPGEgY2xhc3M9Im5hdi10YWI8P3BocCBpZiAoICEgaXNzZXQoICRfR0VUWydhY3Rpb24nXSApICkgZWNobyAnIG5hdi10YWItYWN0aXZlJzsgPz4iIGhyZWY9ImFkbWluLnBocD9wYWdlPWdvb2dsZS1zaXRlbWFwLXByby5waHAiPjw/cGhwIF9lKCAnU2V0dGluZ3MnLCAnc2l0ZW1hcF9wcm8nICk7ID8+PC9hPgogPD9waHAgaWYgKCAhIGlzX25ldHdvcmtfYWRtaW4oKSApIHsgPz4gPGEgY2xhc3M9Im5hdi10YWI8P3BocCBpZiAoIGlzc2V0KCAkX0dFVFsnYWN0aW9uJ10gKSAmJiAnZXh0cmEnID09ICRfR0VUWydhY3Rpb24nXSApIGVjaG8gJyBuYXYtdGFiLWFjdGl2ZSc7ID8+IiBocmVmPSJhZG1pbi5waHA/cGFnZT1nb29nbGUtc2l0ZW1hcC1wcm8ucGhwJmFtcDthY3Rpb249ZXh0cmEiPjw/cGhwIF9lKCAnRXh0cmEgc2V0dGluZ3MnLCAnc2l0ZW1hcF9wcm8nICk7ID8+PC9hPgogPD9waHAgfSA/PiA8YSBjbGFzcz0ibmF2LXRhYiIgaHJlZj0iaHR0cDovL2Jlc3R3ZWJzb2Z0LmNvbS9wcm9kdWN0cy9nb29nbGUtc2l0ZW1hcC9mYXEvIiB0YXJnZXQ9Il9ibGFuayI+PD9waHAgX2UoICdGQVEnLCAnc2l0ZW1hcF9wcm8nICk7ID8+PC9hPgogPC9oMj4gPD9waHAgaWYgKCAhIGlzc2V0KCAkX0dFVFsnYWN0aW9uJ10gKSApIHsgaWYgKCAkdmlld19wZXJtaXNzaW9uICYmIGlzX211bHRpc2l0ZSgpICYmICEgaXNfc3ViZG9tYWluX2luc3RhbGwoKSApIHsgPz4KIDxkaXYgaWQ9ImdnbHN0bXBwcl9jaGVja19zaXRlbWFwX2Jsb2NrIiBjbGFzcz0iZXJyb3IiPiA8cD4gPD9waHAgcHJpbnRmKCAnPHN0cm9uZz4lczwvc3Ryb25nPiAlcycsCiBfXyggJ1dhcm5pbmc6JywgJ3NpdGVtYXBfcHJvJyApLCBzcHJpbnRmKCBfXyggJ1RvIGhhdmUgYW4gYWNjZXNzIHRvIHN1YnNpdGVzIFhNTCBmaWxlcywgcGxlYXNlIGFkZCB0aGUgZm9sbG93aW5nIHJ1bGUgJXMgdG8geW91ciAlcyBmaWxlIGluICVzIGFmdGVyIGxpbmUgJXMuJywgJ3NpdGVtYXBfcHJvJyApLAogJzxjb2RlPlJld3JpdGVSdWxlIChbXi9dK1wueG1sKSQgJDEgW0xdPC9jb2RlPicsICc8c3Ryb25nPi5odGFjY2Vzczwvc3Ryb25nPicsIHNwcmludGYoICc8c3Ryb25nPiIlcyI8L3N0cm9uZz4nLCBBQlNQQVRIICksCiAnPHN0cm9uZz4iUmV3cml0ZUJhc2UiPC9zdHJvbmc+JyApICk7ID8+IDwvcD4gPGRpdiBzdHlsZT0ibWFyZ2luOiAuNWVtIDA7IHBhZGRpbmc6IDJweDsiPiA8Zm9ybSBhY3Rpb249ImFkbWluLnBocD9wYWdlPWdvb2dsZS1zaXRlbWFwLXByby5waHAiIG1ldGhvZD0ncG9zdCcgaWQ9ImdnbHN0bXBwcl9jaGVja19zaXRlbWFwIj4KIDxpbnB1dCA8P3BocCBlY2hvICRjaGFuZ2VfcGVybWlzc2lvbl9hdHRyOyA/PiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidXR0b24tc2Vjb25kYXJ5IiBuYW1lPSJnZ2xzdG1wcHJfY2hlY2tfc2l0ZW1hcCIgdmFsdWU9Ijw/cGhwIF9lKCAn0KFoZWNrIEFjY2VzcycsICdzaXRlbWFwX3BybycgKSA/PiIgLz4KIDw/cGhwIHdwX25vbmNlX2ZpZWxkKCBwbHVnaW5fYmFzZW5hbWUoIF9fRklMRV9fICksICdnZ2xzdG1wcHJfbm9uY2Vfc2l0ZW1hcCcgKTsgPz4gPC9mb3JtPiA8P3BocCBpZiAoIGlzc2V0KCAkX1BPU1RbJ2dnbHN0bXBwcl9jaGVja19zaXRlbWFwJ10gKSAmJiBjaGVja19hZG1pbl9yZWZlcmVyKCBwbHVnaW5fYmFzZW5hbWUoIF9fRklMRV9fICksICdnZ2xzdG1wcHJfbm9uY2Vfc2l0ZW1hcCcgKSApIHsKICRnZ2xzdG1wcHJfYmFja2dyb3VuZCA9IGFycmF5KCAnMjAwJyA9PiAnI2Y4ZmRmNScsICc0MDQnID0+ICcjZmRmNmY2JyApOyBpZiAoIGlzX211bHRpc2l0ZSgpICYmIGlzX25ldHdvcmtfYWRtaW4oKSApIHsKICRibG9ncyA9ICR3cGRiLT5nZXRfY29sKCAiU0VMRUNUIGBibG9nX2lkYCBGUk9NICR3cGRiLT5ibG9ncyIgKTsgZm9yZWFjaCAoICRibG9ncyBhcyAkYmxvZ19pZCApIHsgc3dpdGNoX3RvX2Jsb2coICRibG9nX2lkICk7CiRnZ2xzdG1wcHJfYmxvZ19vcHRpb25zID0gZ2V0X29wdGlvbiggJ2dnbHN0bXBwcl9vcHRpb25zJyApOyBpZiAoICRnZ2xzdG1wcHJfYmxvZ19vcHRpb25zWydzaXRlbWFwJ10gJiYgZmlsZV9leGlzdHMoICRnZ2xzdG1wcHJfYmxvZ19vcHRpb25zWydzaXRlbWFwJ11bJ3BhdGgnXSApICkgewogJGdnbHN0bXBwcl9zdGF0dXMgPSBnZ2xzdG1wcHJfY2hlY2tfc2l0ZW1hcCggJGdnbHN0bXBwcl9ibG9nX29wdGlvbnNbJ3NpdGVtYXAnXVsnbG9jJ10gKTsgcHJpbnRmKCAnPGRpdiBzdHlsZT0ibWFyZ2luOiAxMHB4IDAgMDsgcGFkZGluZzogMnB4IDVweDsgYmFja2dyb3VuZC1jb2xvcjogJXM7Ij48YSBocmVmPSIlcyI+JXM8L2E+IC0gJXM8L2Rpdj4nLCAkZ2dsc3RtcHByX2JhY2tncm91bmRbICRnZ2xzdG1wcHJfc3RhdHVzWydjb2RlJ10gXSwgJGdnbHN0bXBwcl9ibG9nX29wdGlvbnNbJ3NpdGVtYXAnXVsnbG9jJ10sICRnZ2xzdG1wcHJfYmxvZ19vcHRpb25zWydzaXRlbWFwJ11bJ2ZpbGUnXSwgJGdnbHN0bXBwcl9zdGF0dXNbJ21lc3NhZ2UnXSApOwp9IH0gcmVzdG9yZV9jdXJyZW50X2Jsb2coKTsgfSBlbHNlIHsgJGdnbHN0bXBwcl9ibG9nX29wdGlvbnMgPSBnZXRfb3B0aW9uKCAnZ2dsc3RtcHByX29wdGlvbnMnICk7IGlmICggJGdnbHN0bXBwcl9ibG9nX29wdGlvbnNbJ3NpdGVtYXAnXSAmJiBmaWxlX2V4aXN0cyggJGdnbHN0bXBwcl9ibG9nX29wdGlvbnNbJ3NpdGVtYXAnXVsncGF0aCddICkgKSB7CiAkZ2dsc3RtcHByX3N0YXR1cyA9IGdnbHN0bXBwcl9jaGVja19zaXRlbWFwKCAkZ2dsc3RtcHByX2Jsb2dfb3B0aW9uc1snc2l0ZW1hcCddWydsb2MnXSApOyBwcmludGYoICc8ZGl2IHN0eWxlPSJtYXJnaW46IDEwcHggMCAwOyBwYWRkaW5nOiAycHggNXB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAlczsiPjxhIGhyZWY9IiVzIj4lczwvYT4gLSAlczwvZGl2PicsICRnZ2xzdG1wcHJfYmFja2dyb3VuZFsgJGdnbHN0bXBwcl9zdGF0dXNbJ2NvZGUnXSBdLCAkZ2dsc3RtcHByX2Jsb2dfb3B0aW9uc1snc2l0ZW1hcCddWydsb2MnXSwgJGdnbHN0bXBwcl9ibG9nX29wdGlvbnNbJ3NpdGVtYXAnXVsnZmlsZSddLCAkZ2dsc3RtcHByX3N0YXR1c1snbWVzc2FnZSddICk7Cn0gfSB9ID8+IDwvZGl2PiA8L2Rpdj4gPD9waHAgfSBpZiAoICR2aWV3X3Blcm1pc3Npb24gJiYgJGNoYW5nZV9wZXJtaXNzaW9uX2F0dHIgIT0gJycgKSB7ID8+IDxkaXYgY2xhc3M9ImVycm9yIj48cD48c3Ryb25nPjw/cGhwIF9lKCAiTm90aWNlOiIsICdzaXRlbWFwX3BybycgKTsgPz48L3N0cm9uZz4gPHN0cm9uZz48P3BocCBfZSggIkl0IGlzIHByb2hpYml0ZWQgdG8gY2hhbmdlIEdvb2dsZSBTaXRlbWFwIFBybyBzZXR0aW5ncyBvbiB0aGlzIHNpdGUgaW4gdGhlIEdvb2dsZSBTaXRlbWFwIFBybyBuZXR3b3JrIHNldHRpbmdzLiIsICdzaXRlbWFwX3BybycgKTsgPz48L3N0cm9uZz48L3A+PC9kaXY+CiA8P3BocCB9IGlmICggISAkdmlld19wZXJtaXNzaW9uICkgeyA/PiA8ZGl2IGNsYXNzPSJlcnJvciI+PHA+PHN0cm9uZz48P3BocCBfZSggIk5vdGljZToiLCAnc2l0ZW1hcF9wcm8nICk7ID8+PC9zdHJvbmc+IDxzdHJvbmc+PD9waHAgX2UoICJJdCBpcyBwcm9oaWJpdGVkIHRvIHZpZXcgR29vZ2xlIFNpdGVtYXAgUHJvIHNldHRpbmdzIG9uIHRoaXMgc2l0ZSBpbiB0aGUgR29vZ2xlIFNpdGVtYXAgUHJvIG5ldHdvcmsgc2V0dGluZ3MuIiwgJ3NpdGVtYXBfcHJvJyApOyA/Pjwvc3Ryb25nPjwvcD48L2Rpdj4KIDw/cGhwIH0gZWxzZSB7ID8+IDxkaXYgaWQ9ImdnbHN0bXBwcl9uZXR3b3JrX25vdGljZSIgY2xhc3M9InVwZGF0ZWQiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjxwPjxzdHJvbmc+PD9waHAgX2UoICJOb3RpY2U6IiwgJ3NpdGVtYXBfcHJvJyApOyA/Pjwvc3Ryb25nPiA8P3BocCBfZSggIlRoaXMgb3B0aW9uIHdpbGwgcmVwbGFjZSBhbGwgY3VycmVudCBzZXR0aW5ncyBvbiBzZXBhcmF0ZSBzaXRlcy4iLCAnc2l0ZW1hcF9wcm8nICk7ID8+PC9wPjwvZGl2PgogPGRpdiBjbGFzcz0idXBkYXRlZCBmYWRlIiA8P3BocCBpZiAoICEgKCBpc3NldCggJF9SRVFVRVNUWydnZ2xzdG1wcHJfc3VibWl0J10gKSB8fCBpc3NldCggJF9SRVFVRVNUWydid3NfbGljZW5zZV9zdWJtaXQnXSApICkgfHwgJG1lc3NhZ2UgPT0gIiIgKSBlY2hvICJzdHlsZT1cImRpc3BsYXk6bm9uZVwiIjsgPz4+PHA+PHN0cm9uZz48P3BocCBlY2hvICRtZXNzYWdlOyA/Pjwvc3Ryb25nPjwvcD48L2Rpdj4KIDxkaXYgaWQ9ImdnbHN0bXBwcl9zZXR0aW5nc19ub3RpY2UiIGNsYXNzPSJ1cGRhdGVkIGZhZGUiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjxwPjxzdHJvbmc+PD9waHAgX2UoICJOb3RpY2U6IiwgJ3NpdGVtYXBfcHJvJyApOyA/Pjwvc3Ryb25nPiA8P3BocCBfZSggIlRoZSBwbHVnaW4ncyBzZXR0aW5ncyBoYXZlIGJlZW4gY2hhbmdlZC4gSW4gb3JkZXIgdG8gc2F2ZSB0aGVtIHBsZWFzZSBkb24ndCBmb3JnZXQgdG8gY2xpY2sgdGhlICdTYXZlIENoYW5nZXMnIGJ1dHRvbi4iLCAnc2l0ZW1hcF9wcm8nICk7ID8+PC9wPjwvZGl2PgogPGRpdiBjbGFzcz0iZXJyb3IiIDw/cGhwIGlmICggIiIgPT0gJGVycm9yICkgZWNobyAic3R5bGU9XCJkaXNwbGF5Om5vbmVcIiI7ID8+PjxwPjxzdHJvbmc+PD9waHAgZWNobyAkZXJyb3I7ID8+PC9zdHJvbmc+PC9wPjwvZGl2PgogPGZvcm0gYWN0aW9uPSJhZG1pbi5waHA/cGFnZT1nb29nbGUtc2l0ZW1hcC1wcm8ucGhwIiBtZXRob2Q9J3Bvc3QnIGlkPSJnZ2xzdG1wcHJfYXV0aCIgbmFtZT0iZ2dsc3RtcHByX2F1dGgiPgogPD9waHAgaWYgKCBpc19tdWx0aXNpdGUoKSAmJiBpc19uZXR3b3JrX2FkbWluKCkgKSB7ID8+IDx0YWJsZSBpZD0iZ2dsc3RtcHByX3NldHRpbmdzX25ldHdvcmsiIGNsYXNzPSJmb3JtLXRhYmxlIj4KIDx0ciB2YWxpZ249InRvcCIgY2xhc3M9ImdnbHN0bXBwcl9uZXR3b3JrX3NldHRpbmdzIj4gPHRoIHNjb3BlPSJyb3ciPjw/cGhwIF9lKCAnQXBwbHkgbmV0d29yayBzZXR0aW5ncycsICdzaXRlbWFwX3BybycgKTsgPz48L3RoPgogPHRkPiA8bGFiZWw+PGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJnZ2xzdG1wcHJfbmV0d29ya19hcHBseSIgdmFsdWU9ImFsbCIgPD9waHAgaWYgKCAiYWxsIiA9PSAkZ2dsc3RtcHByX29wdGlvbnNbJ25ldHdvcmtfYXBwbHknXSApIGVjaG8gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsgPz4gLz4gPD9waHAgX2UoICdBcHBseSB0byBhbGwgc2l0ZXMgYW5kIHVzZSBieSBkZWZhdWx0JywgJ3NpdGVtYXBfcHJvJyApOyA/PiA8c3BhbiBjbGFzcz0iZ2dsc3RtcHByX3NwYW4iPig8P3BocCBfZSggJ0FsbCBjdXJyZW50IHNldHRpbmdzIG9uIHNlcGFyYXRlIHNpdGVzIHdpbGwgYmUgcmVwbGFjZWQnLCAnc2l0ZW1hcF9wcm8nICk7ID8+KTwvc3Bhbj48L2xhYmVsPjxiciAvPgogPGRpdiBjbGFzcz0iZ2dsc3RtcHByX25ldHdvcmtfYXBwbHlfYWxsIj4gPGxhYmVsPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iZ2dsc3RtcHByX25ldHdvcmtfY2hhbmdlIiB2YWx1ZT0iMSIgPD9waHAgaWYgKCAxID09ICRnZ2xzdG1wcHJfb3B0aW9uc1snbmV0d29ya19jaGFuZ2UnXSApIGVjaG8gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsgPz4gLz4gPD9waHAgX2UoICdBbGxvdyB0byBjaGFuZ2UgdGhlIHNldHRpbmdzIG9uIHNlcGFyYXRlIHdlYnNpdGVzJywgJ3NpdGVtYXBfcHJvJyApOyA/PjwvbGFiZWw+PGJyIC8+CiA8bGFiZWw+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJnZ2xzdG1wcHJfbmV0d29ya192aWV3IiB2YWx1ZT0iMSIgPD9waHAgaWYgKCAxID09ICRnZ2xzdG1wcHJfb3B0aW9uc1snbmV0d29ya192aWV3J10gKSBlY2hvICdjaGVja2VkPSJjaGVja2VkIic7ID8+IC8+IDw/cGhwIF9lKCAnQWxsb3cgdG8gdmlldyB0aGUgc2V0dGluZ3Mgb24gc2VwYXJhdGUgd2Vic2l0ZXMnLCAnc2l0ZW1hcF9wcm8nICk7ID8+PC9sYWJlbD48YnIgLz4KIDwvZGl2PiA8bGFiZWw+PGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJnZ2xzdG1wcHJfbmV0d29ya19hcHBseSIgdmFsdWU9ImRlZmF1bHQiIDw/cGhwIGlmICggImRlZmF1bHQiID09ICRnZ2xzdG1wcHJfb3B0aW9uc1snbmV0d29ya19hcHBseSddICkgZWNobyAnY2hlY2tlZD0iY2hlY2tlZCInOyA/PiAvPiA8P3BocCBfZSggJ0J5IGRlZmF1bHQnLCAnc2l0ZW1hcF9wcm8nICk7ID8+IDxzcGFuIGNsYXNzPSJnZ2xzdG1wcHJfc3BhbiI+KDw/cGhwIF9lKCAnU2V0dGluZ3Mgd2lsbCBiZSBhcHBsaWVkIHRvIG5ld2x5IGFkZGVkIHdlYnNpdGVzIGJ5IGRlZmF1bHQnLCAnc2l0ZW1hcF9wcm8nICk7ID8+KTwvc3Bhbj48L2xhYmVsPjxiciAvPgogPGxhYmVsPjxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iZ2dsc3RtcHByX25ldHdvcmtfYXBwbHkiIHZhbHVlPSJvZmYiIDw/cGhwIGlmICggIm9mZiIgPT0gJGdnbHN0bXBwcl9vcHRpb25zWyduZXR3b3JrX2FwcGx5J10gKSBlY2hvICdjaGVja2VkPSJjaGVja2VkIic7ID8+IC8+IDw/cGhwIF9lKCAnRG8gbm90IGFwcGx5JywgJ3NpdGVtYXBfcHJvJyApOyA/PiA8c3BhbiBjbGFzcz0iZ2dsc3RtcHByX3NwYW4iPig8P3BocCBfZSggJ0NoYW5nZSB0aGUgc2V0dGluZ3Mgb24gc2VwYXJhdGUgc2l0ZXMgb2YgdGhlIG11bHRpc2l0ZSBvbmx5JywgJ3NpdGVtYXBfcHJvJyApOyA/Pik8L3NwYW4+PC9sYWJlbD48YnIgLz4KIDwvdGQ+IDwvdHI+IDwvdGFibGU+IDw/cGhwIH0gPz4gPGRpdiBpZD0iZ2dsc3RtcHByX3NpdGVtYXBfaW5mbyI+IDw/cGhwIGlmICggISBpc19uZXR3b3JrX2FkbWluKCkgfHwgKCBpc19uZXR3b3JrX2FkbWluKCkgJiYgJGdnbHN0bXBwcl9vcHRpb25zWyduZXR3b3JrX2FwcGx5J10gIT0gIm9mZiIgKSApIHsKICR1cmxfc2l0ZW1hcHNbJ2ZhbHNlJ10gPSAkdXJsX3NpdGVtYXBzWyd0cnVlJ10gPSBhcnJheSgpOyBpZiAoIGlzX25ldHdvcmtfYWRtaW4oKSApIHsgJGJsb2dzID0gJHdwZGItPmdldF9jb2woICJTRUxFQ1QgYGJsb2dfaWRgIEZST00gJHdwZGItPmJsb2dzIiApOwpmb3JlYWNoICggJGJsb2dzIGFzICRibG9nX2lkICkgeyBzd2l0Y2hfdG9fYmxvZyggJGJsb2dfaWQgKTsgJGhvbWVfdXJsID0gcHJlZ19yZXBsYWNlKCAiL1teYS16QS1a0JAt0K/QsC3RjzAtOVxzXS8iLCAiXyIsIHN0cl9yZXBsYWNlKCAnaHR0cDovLycsICcnLCBzdHJfcmVwbGFjZSggJ2h0dHBzOi8vJywgJycsIGhvbWVfdXJsKCkgKSApICk7CiR4bWxfZmlsZSA9ICdzaXRlbWFwXycgLiAkaG9tZV91cmwgLiAnLnhtbCc7ICR4bWxfdXJsID0gaG9tZV91cmwoJy8nKSAuICR4bWxfZmlsZTsgJHVybF9zaXRlbWFwID0gQUJTUEFUSCAuICR4bWxfZmlsZTsKJHhtbF9maWxlX2V4aXN0cyA9IGZpbGVfZXhpc3RzKCAkdXJsX3NpdGVtYXAgKSA/ICd0cnVlJyA6ICdmYWxzZSc7ICR1cmxfc2l0ZW1hcHNbICR4bWxfZmlsZV9leGlzdHMgXVtdID0gc3ByaW50ZiggJzxhIGhyZWY9IiVzIiB0YXJnZXQ9Il9ibGFuayI+JXM8L2E+JywgJHhtbF91cmwsICR4bWxfZmlsZSApOwppZiAoICR4bWxfZmlsZV9leGlzdHMgPT0gJ2ZhbHNlJyApIHsgZ2dsc3RtcHByX3NpdGVtYXBjcmVhdGUoKTsgfSBlbHNlIHsgZ2dsc3RtcHByX3NpdGVtYXBfaW5mbygpOwp9IH0gcmVzdG9yZV9jdXJyZW50X2Jsb2coKTsgZ2dsc3RtcHByX3NpdGVtYXBfaW5kZXhfY3JlYXRlKCk7IGtyc29ydCggJHVybF9zaXRlbWFwcyApOyBpZiAoICR1cmxfc2l0ZW1hcHNbJ3RydWUnXSApIHsKIGlmICggY291bnQoICR1cmxfc2l0ZW1hcHNbJ3RydWUnXSApID09IDEgKSB7IHByaW50ZiggJzxwPiVzICglcykgJXM8L3A+JywgX18oICdUaGUgU2l0ZW1hcCBmaWxlJywgJ3NpdGVtYXBfcHJvJyApLAogaW1wbG9kZSggJywgJywgJHVybF9zaXRlbWFwc1sndHJ1ZSddICksIF9fKCAnYWxyZWFkeSBleGlzdHMuIElmIHlvdSB3b3VsZCBsaWtlIHRvIHJlcGxhY2UgaXQgd2l0aCBhIG5ldyBvbmUsIHBsZWFzZSBjaG9vc2UgdGhlIG5lY2Vzc2FyeSBib3ggYmVsb3cuIEFsbCBvdGhlciBhY3Rpb25zIHdpbGwgb3ZlcndyaXRlIHRoZSBleGlzdGluZyBmaWxlLicsICdzaXRlbWFwX3BybycgKQogKTsgfSBlbHNlIHsgcHJpbnRmKCAnPHA+JXMgKCVzKSAlczwvcD4nLCBfXyggJ1RoZSBTaXRlbWFwIGZpbGVzJywgJ3NpdGVtYXBfcHJvJyApLCBpbXBsb2RlKCAnLCAnLCAkdXJsX3NpdGVtYXBzWyd0cnVlJ10gKSwKIF9fKCAnYWxyZWFkeSBleGlzdC4gSWYgeW91IHdvdWxkIGxpa2UgdG8gcmVwbGFjZSB0aGVtIHdpdGggbmV3IG9uZXMsIHBsZWFzZSBjaG9vc2UgdGhlIG5lY2Vzc2FyeSBib3ggYmVsb3cuIEFsbCBvdGhlciBhY3Rpb25zIHdpbGwgb3ZlcndyaXRlIHRoZSBleGlzdGluZyBmaWxlcy4nLCAnc2l0ZW1hcF9wcm8nICkKICk7IH0gfSBpZiAoICR1cmxfc2l0ZW1hcHNbJ2ZhbHNlJ10gKSB7IGlmICggY291bnQoICR1cmxfc2l0ZW1hcHNbJ2ZhbHNlJ10gKSA9PSAxICkgeyBwcmludGYoICc8cD4lcyAoJXMpICVzPC9wPicsCiBfXyggJ1RoZSBTaXRlbWFwIGZpbGUnLCAnc2l0ZW1hcF9wcm8nICksIGltcGxvZGUoICcsICcsICR1cmxfc2l0ZW1hcHNbJ2ZhbHNlJ10gKSwgX18oICdpcyBjcmVhdGVkIGluIHRoZSBzaXRlIHJvb3QgZGlyZWN0b3J5LicsICdzaXRlbWFwX3BybycgKQogKTsgfSBlbHNlIHsgcHJpbnRmKCAnPHA+JXMgKCVzKSAlczwvcD4nLCBfXyggJ1RoZSBTaXRlbWFwIGZpbGVzJywgJ3NpdGVtYXBfcHJvJyApLCBpbXBsb2RlKCAnLCAnLCAkdXJsX3NpdGVtYXBzWydmYWxzZSddICksCiBfXyggJ2FyZSBjcmVhdGVkIGluIHRoZSBzaXRlIHJvb3QgZGlyZWN0b3J5LicsICdzaXRlbWFwX3BybycgKSApOyB9IH0gcHJpbnRmKCAnPHA+JXMgPGEgaHJlZj0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS93ZWJtYXN0ZXJzL3Rvb2xzL2hvbWU/aGw9ZW4iPiVzPC9hPiAlcy48L3A+JywKIF9fKCAiSWYgeW91IGRvIG5vdCB3YW50IGEgc2l0ZW1hcCBmaWxlIHRvIGJlIGFkZGVkIHRvIEdvb2dsZSBXZWJtYXN0ZXIgVG9vbHMgYXV0b21hdGljYWxseSwgeW91IGNhbiBkbyBpdCB1c2luZyIsICdzaXRlbWFwX3BybycgKSwKIF9fKCAidGhpcyIsICdzaXRlbWFwX3BybycgKSwgX18oICJsaW5rIC0gc2lnbiBpbiwgY2hvb3NlIHRoZSBuZWNlc3Nhcnkgc2l0ZSwgZ28gdG8gJ3NpdGVtYXBzJyBhbmQgZmlsbCBvdXQgdGhlIG1hbmRhdG9yeSBmaWVsZCIsICdzaXRlbWFwX3BybycgKQogKTsgfSBlbHNlIHsgaWYgKCBpc19tdWx0aXNpdGUoKSApIHsgJGhvbWVfdXJsID0gcHJlZ19yZXBsYWNlKCAiL1teYS16QS1a0JAt0K/QsC3RjzAtOVxzXS8iLCAiXyIsIHN0cl9yZXBsYWNlKCAnaHR0cDovLycsICcnLCBzdHJfcmVwbGFjZSggJ2h0dHBzOi8vJywgJycsIGhvbWVfdXJsKCkgKSApICk7CiR4bWxfZmlsZSA9ICdzaXRlbWFwXycgLiAkaG9tZV91cmwgLiAnLnhtbCc7IH0gZWxzZSB7ICR4bWxfZmlsZSA9ICdzaXRlbWFwLnhtbCc7IH0gJHhtbF91cmwgPSBob21lX3VybCgnLycpIC4gJHhtbF9maWxlOwokdXJsX3NpdGVtYXAgPSBBQlNQQVRIIC4gJHhtbF9maWxlOyAkeG1sX2ZpbGVfZXhpc3RzID0gZmlsZV9leGlzdHMoICR1cmxfc2l0ZW1hcCApID8gJ3RydWUnIDogJ2ZhbHNlJzsKJHVybF9zaXRlbWFwc1sgJHhtbF9maWxlX2V4aXN0cyBdID0gYXJyYXkoICdsaW5rJyA9PiBzcHJpbnRmKCAnPGEgaHJlZj0iJXMiIHRhcmdldD0iX2JsYW5rIj4lczwvYT4nLCAkeG1sX3VybCwgX18oICJUaGUgU2l0ZW1hcCBmaWxlIiwgJ3NpdGVtYXBfcHJvJyApICksCiAnZmlsZScgPT4gJHhtbF9maWxlLCAndXJsJyA9PiAkeG1sX3VybCApOyBpZiAoICR4bWxfZmlsZV9leGlzdHMgPT0gJ2ZhbHNlJyApeyBnZ2xzdG1wcHJfc2l0ZW1hcGNyZWF0ZSgpOwp9IGVsc2UgeyBnZ2xzdG1wcHJfc2l0ZW1hcF9pbmZvKCk7IH0gaWYgKCAkdXJsX3NpdGVtYXBzWyd0cnVlJ10gKSB7IHByaW50ZiggJzxwPiVzICVzPC9wPicsICR1cmxfc2l0ZW1hcHNbJ3RydWUnXVsnbGluayddCiAsIF9fKCAiYWxyZWFkeSBleGlzdHMuIElmIHlvdSB3b3VsZCBsaWtlIHRvIHJlcGxhY2UgaXQgd2l0aCBhIG5ldyBvbmUsIHBsZWFzZSBjaG9vc2UgdGhlIG5lY2Vzc2FyeSBib3ggYmVsb3cuIEFsbCBvdGhlciBhY3Rpb25zIHdpbGwgb3ZlcndyaXRlIHRoZSBleGlzdGluZyBmaWxlLiIsICdzaXRlbWFwX3BybycgKQogKTsgfSBpZiAoICR1cmxfc2l0ZW1hcHNbJ2ZhbHNlJ10gKSB7IHByaW50ZiggJzxwPiVzICVzPC9wPicsICR1cmxfc2l0ZW1hcHNbJ2ZhbHNlJ11bJ2xpbmsnXSwgX18oICJpcyBjcmVhdGVkIGluIHRoZSBzaXRlIHJvb3QgZGlyZWN0b3J5LiIsICdzaXRlbWFwX3BybycgKQogKTsgfSBwcmludGYoICc8cD4lcyA8YSBocmVmPSJodHRwczovL3d3dy5nb29nbGUuY29tL3dlYm1hc3RlcnMvdG9vbHMvaG9tZT9obD1lbiI+JXM8L2E+ICVzIC0gJXMuPC9wPicsCiBfXyggIklmIHlvdSBkbyBub3Qgd2FudCBhIHNpdGVtYXAgZmlsZSB0byBiZSBhZGRlZCB0byBHb29nbGUgV2VibWFzdGVyIFRvb2xzIGF1dG9tYXRpY2FsbHksIHlvdSBjYW4gZG8gaXQgdXNpbmciLCAnc2l0ZW1hcF9wcm8nICksCiBfXyggInRoaXMiLCAnc2l0ZW1hcF9wcm8nICksIF9fKCAibGluayAtIHNpZ24gaW4sIGNob29zZSB0aGUgbmVjZXNzYXJ5IHNpdGUsIGdvIHRvICdzaXRlbWFwcycgYW5kIGZpbGwgb3V0IHRoZSBtYW5kYXRvcnkgZmllbGQiLCAnc2l0ZW1hcF9wcm8nICksCiAoICR1cmxfc2l0ZW1hcHNbJ2ZhbHNlJ10gKSA/ICR1cmxfc2l0ZW1hcHNbJ2ZhbHNlJ11bJ3VybCddIDogJHVybF9zaXRlbWFwc1sndHJ1ZSddWyd1cmwnXSApOyB9IH0gPz4KIDwvZGl2PiA8ZGl2IGlkPSJnZ2xzdG1wcHJfc2V0dGluZ3NfYmxvY2siPiA8P3BocCBpZiAoICRjaGFuZ2VfcGVybWlzc2lvbl9hdHRyICE9ICcnICkgeyBlY2hvICc8ZGl2IGNsYXNzPSJnZ2xzdG1wcHJfYmciPjwvZGl2Pic7Cn0gPz4gPHRhYmxlIGlkPSJnZ2xzdG1wcHJfc2V0dGluZ3NfdGFibGUiIGNsYXNzPSJmb3JtLXRhYmxlIj4gPHRyIHZhbGlnbj0idG9wIj4gPHRkIGNvbHNwYW49IjIiPgogPGxhYmVsPjxpbnB1dCA8P3BocCBlY2hvICRjaGFuZ2VfcGVybWlzc2lvbl9hdHRyOyA/PiB0eXBlPSdjaGVja2JveCcgbmFtZT0nZ2dsc3RtcHByX25ldycgdmFsdWU9IjEiIC8+IDw/cGhwIF9lKCAiSSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBzaXRlbWFwIGZpbGUgb3IgdXBkYXRlIHRoZSBleGlzdGluZyBvbmUiLCAnc2l0ZW1hcF9wcm8nICk7ID8+PC9sYWJlbD4KIDwvdGQ+IDwvdHI+IDw/cGhwIGlmICggaXNfbXVsdGlzaXRlKCkgKSB7ID8+IDx0ciB2YWxpZ249InRvcCI+IDx0ZCBjb2xzcGFuPSIyIj4gPGxhYmVsPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgZGlzYWJsZWQ9ImRpc2FibGVkIiBuYW1lPSdnZ2xzdG1wcHJfY2hlY2tib3gnIHZhbHVlPSIxIiA8P3BocCBpZiAoIDEgPT0gJGdnbHN0bXBwcl9yb2JvdHMgKSBlY2hvICdjaGVja2VkPSJjaGVja2VkIic7ID8+IC8+IDw/cGhwIF9lKCAiSSB3YW50IHRvIGFkZCBzaXRlbWFwIGZpbGUgcGF0aCBpbiByb2JvdHMudHh0IiwgJ3NpdGVtYXBfcHJvJyApOz8+PC9sYWJlbD4KIDxwIHN0eWxlPSJjb2xvcjpyZWQiPjw/cGhwIF9lKCAiU2luY2UgeW91IGFyZSB1c2luZyBtdWx0aXNpdGluZywgdGhlIHBsdWdpbiBkb2VzIG5vdCBhbGxvdyB0byBhZGQgYSBzaXRlbWFwIHRvIHJvYm90cy50eHQiLCAnc2l0ZW1hcF9wcm8nICk7ID8+PC9kaXY+CiA8L3RkPiA8L3RyPiA8P3BocCB9IGVsc2UgeyA/PiA8dHIgdmFsaWduPSJ0b3AiPiA8dGQgY29sc3Bhbj0iMiI+IDxsYWJlbD48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J2dnbHN0bXBwcl9jaGVja2JveCcgdmFsdWU9IjEiIDw/cGhwIGlmICggMSA9PSAkZ2dsc3RtcHByX3JvYm90cyApIGVjaG8gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsgPz4gLz4gPD9waHAgX2UoICJJIHdhbnQgdG8gYWRkIHNpdGVtYXAgZmlsZSBwYXRoIGluIiwgJ3NpdGVtYXBfcHJvJyApOz8+IDxhIGhyZWY9Ijw/cGhwIGVjaG8gJHVybF9ob21lOyA/PnJvYm90cy50eHQiIHRhcmdldD0iX25ldyI+cm9ib3RzLnR4dDwvYT48L2xhYmVsPgogPC90ZD4gPC90cj4gPD9waHAgfSA/PiA8dHIgdmFsaWduPSJ0b3AiPiA8dGg+PD9waHAgX2UoICdYTUwgU2l0ZW1hcCAiQ2hhbmdlIEZyZXF1ZW5jeSIgcGFyYW1ldGVyJywgJ3NpdGVtYXBfcHJvJyApOyA/PjwvdGg+CiA8dGQ+IDxzZWxlY3QgPD9waHAgZWNobyAkY2hhbmdlX3Blcm1pc3Npb25fYXR0cjsgPz4gbmFtZT0iZ2dsc3RtcHByX3NpdGVtYXBfY2hhbmdlX2ZyZXF1ZW5jeSI+IDxvcHRpb24gPD9waHAgaWYgKCAnYWx3YXlzJyA9PSAkZ2dsc3RtcHByX29wdGlvbnNbJ3NpdGVtYXBfY2hhbmdlX2ZyZXF1ZW5jeSddICkgZWNobyAnc2VsZWN0ZWQ9InNlbGVjdGVkIiAnOyA/PnZhbHVlPSJhbHdheXMiPjw/cGhwIF9lKCAnQWx3YXlzJywgJ3NpdGVtYXBfcHJvJyApOyA/Pjwvb3B0aW9uPgogPG9wdGlvbiA8P3BocCBpZiAoICdob3VybHknID09ICRnZ2xzdG1wcHJfb3B0aW9uc1snc2l0ZW1hcF9jaGFuZ2VfZnJlcXVlbmN5J10gKSBlY2hvICdzZWxlY3RlZD0ic2VsZWN0ZWQiICc7ID8+dmFsdWU9ImhvdXJseSI+PD9waHAgX2UoICdIb3VybHknLCAnc2l0ZW1hcF9wcm8nICk7ID8+PC9vcHRpb24+CiA8b3B0aW9uIDw/cGhwIGlmICggJ2RhaWx5JyA9PSAkZ2dsc3RtcHByX29wdGlvbnNbJ3NpdGVtYXBfY2hhbmdlX2ZyZXF1ZW5jeSddICkgZWNobyAnc2VsZWN0ZWQ9InNlbGVjdGVkIiAnOyA/PnZhbHVlPSJkYWlseSI+PD9waHAgX2UoICdEYWlseScsICdzaXRlbWFwX3BybycgKTsgPz48L29wdGlvbj4KIDxvcHRpb24gPD9waHAgaWYgKCAnd2Vla2x5JyA9PSAkZ2dsc3RtcHByX29wdGlvbnNbJ3NpdGVtYXBfY2hhbmdlX2ZyZXF1ZW5jeSddICkgZWNobyAnc2VsZWN0ZWQ9InNlbGVjdGVkIiAnOyA/PnZhbHVlPSJ3ZWVrbHkiPjw/cGhwIF9lKCAnV2Vla2x5JywgJ3NpdGVtYXBfcHJvJyApOyA/Pjwvb3B0aW9uPgogPG9wdGlvbiA8P3BocCBpZiAoICdtb250aGx5JyA9PSAkZ2dsc3RtcHByX29wdGlvbnNbJ3NpdGVtYXBfY2hhbmdlX2ZyZXF1ZW5jeSddICkgZWNobyAnc2VsZWN0ZWQ9InNlbGVjdGVkIiAnOyA/PnZhbHVlPSJtb250aGx5Ij48P3BocCBfZSggJ01vbnRobHknLCAnc2l0ZW1hcF9wcm8nICk7ID8+PC9vcHRpb24+CiA8b3B0aW9uIDw/cGhwIGlmICggJ3llYXJseScgPT0gJGdnbHN0bXBwcl9vcHRpb25zWydzaXRlbWFwX2NoYW5nZV9mcmVxdWVuY3knXSApIGVjaG8gJ3NlbGVjdGVkPSJzZWxlY3RlZCIgJzsgPz52YWx1ZT0ieWVhcmx5Ij48P3BocCBfZSggJ1llYXJseScsICdzaXRlbWFwX3BybycgKTsgPz48L29wdGlvbj4KIDxvcHRpb24gPD9waHAgaWYgKCAnbmV2ZXInID09ICRnZ2xzdG1wcHJfb3B0aW9uc1snc2l0ZW1hcF9jaGFuZ2VfZnJlcXVlbmN5J10gKSBlY2hvICdzZWxlY3RlZD0ic2VsZWN0ZWQiICc7ID8+dmFsdWU9Im5ldmVyIj48P3BocCBfZSggJ05ldmVyJywgJ3NpdGVtYXBfcHJvJyApOyA/Pjwvb3B0aW9uPgogPC9zZWxlY3Q+PGJyIC8+IDxzcGFuIGNsYXNzPSJnZ2xzdG1wcHJfc3BhbiI+PD9waHAgX2UoICdUaGlzIHZhbHVlIGlzIHVzZWQgaW4gdGhlIHNpdGVtYXAgZmlsZSBhbmQgcHJvdmlkZXMgZ2VuZXJhbCBpbmZvcm1hdGlvbiB0byBzZWFyY2ggZW5naW5lcy4gVGhlIHNpdGVtYXAgaXRzZWxmIGlzIGdlbmVyYXRlZCBvbmNlIGFuZCB3aWxsIGJlIHJlLWdlbmVyYXRlZCB3aGVuIHlvdSBjcmVhdGUgb3IgdXBkYXRlIGFueSBwb3N0IG9yIHBhZ2UuJywgJ3NpdGVtYXBfcHJvJyApOyA/Pjwvc3Bhbj4KIDwvdGQ+IDwvdHI+IDw/cGhwIGlmICggISBmdW5jdGlvbl9leGlzdHMoICdjdXJsX2luaXQnICkgKSB7ID8+IDx0ciB2YWxpZ249InRvcCI+IDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iZ2dsc3RtcHByX2Vycm9yIj4KIDw/cGhwIF9lKCAiVGhpcyBob3N0aW5nIGRvZXMgbm90IHN1cHBvcnQg0YFVUkwsIHNvIHlvdSBjYW5ub3QgYWRkIGEgc2l0ZW1hcCBmaWxlIGF1dG9tYXRpY2FsbHkuIiwgJ3NpdGVtYXBfcHJvJyApOyA/PgogPC90ZD4gPC90cj4gPD9waHAgfSBlbHNlIHsgPz4gPHRyIGlkPSJnZ2xzdG1wcHJfZ29vZ2xlX3dlYm1hc3RlciIgdmFsaWduPSJ0b3AiPiA8dGggc2NvcGU9InJvdyI+PD9waHAgX2UoICdSZW1vdGUgd29yayB3aXRoIEdvb2dsZSBXZWJtYXN0ZXIgVG9vbHMnLCAnc2l0ZW1hcF9wcm8nICk7ID8+PC90aD4gCiA8dGQ+IDw/cGhwICRnZ2xzdG1wcHJfY2xpZW50ID0gZ2dsc3RtcHByX2NsaWVudCgpOyBpZiAoIGlzX25ldHdvcmtfYWRtaW4oKSApIHsgJGdnbHN0bXBwcl9ibG9nX3ByZWZpeCA9ICdfJyAuIDA7CiRnZ2xzdG1wcHJfb3B0aW9ucyA9IGdldF9zaXRlX29wdGlvbiggJ2dnbHN0bXBwcl9vcHRpb25zJyApOyB9IGVsc2UgeyAkZ2dsc3RtcHByX2Jsb2dfcHJlZml4ID0gJ18nIC4gZ2V0X2N1cnJlbnRfYmxvZ19pZCgpOwokZ2dsc3RtcHByX29wdGlvbnMgPSBnZXRfb3B0aW9uKCAnZ2dsc3RtcHByX29wdGlvbnMnICk7IH0gaWYgKCBpc3NldCggJF9QT1NUWydnZ2xzdG1wcHJfbG9nb3V0J10gKSAmJiBjaGVja19hZG1pbl9yZWZlcmVyKCBwbHVnaW5fYmFzZW5hbWUoIF9fRklMRV9fICksICdnZ2xzdG1wcHJfbm9uY2VfbmFtZScgKSApIHsKIHVuc2V0KCAkX1NFU1NJT05bICdnZ2xzdG1wcHJfYXV0aG9yaXphdGlvbl9jb2RlJyAuICRnZ2xzdG1wcHJfYmxvZ19wcmVmaXggXSApOyB1bnNldCggJGdnbHN0bXBwcl9vcHRpb25zWydhdXRob3JpemF0aW9uX2NvZGUnXSApOwppZiAoIGlzX25ldHdvcmtfYWRtaW4oKSApIHsgdXBkYXRlX3NpdGVfb3B0aW9uKCAnZ2dsc3RtcHByX29wdGlvbnMnLCAkZ2dsc3RtcHByX29wdGlvbnMgKTsgfSBlbHNlIHsKIHVwZGF0ZV9vcHRpb24oICdnZ2xzdG1wcHJfb3B0aW9ucycsICRnZ2xzdG1wcHJfb3B0aW9ucyApOyB9IH0gaWYgKCBpc3NldCggJF9QT1NUWydnZ2xzdG1wcHJfYXV0aG9yaXphdGlvbl9jb2RlJ10gKSAmJiAhIGVtcHR5KCAkX1BPU1RbJ2dnbHN0bXBwcl9hdXRob3JpemF0aW9uX2NvZGUnXSApICYmIGNoZWNrX2FkbWluX3JlZmVyZXIoIHBsdWdpbl9iYXNlbmFtZSggX19GSUxFX18gKSwgJ2dnbHN0bXBwcl9ub25jZV9uYW1lJyApICkgewogdHJ5IHsgJGdnbHN0bXBwcl9jbGllbnQtPmF1dGhlbnRpY2F0ZSggJF9QT1NUWydnZ2xzdG1wcHJfYXV0aG9yaXphdGlvbl9jb2RlJ10gKTsgJGdnbHN0bXBwcl9vcHRpb25zWydhdXRob3JpemF0aW9uX2NvZGUnXSA9ICRfU0VTU0lPTlsgJ2dnbHN0bXBwcl9hdXRob3JpemF0aW9uX2NvZGUnIC4gJGdnbHN0bXBwcl9ibG9nX3ByZWZpeCBdID0gJGdnbHN0bXBwcl9jbGllbnQtPmdldEFjY2Vzc1Rva2VuKCk7CmlmICggaXNfbmV0d29ya19hZG1pbigpICkgeyB1cGRhdGVfc2l0ZV9vcHRpb24oICdnZ2xzdG1wcHJfb3B0aW9ucycsICRnZ2xzdG1wcHJfb3B0aW9ucyApOyB9IGVsc2UgewogdXBkYXRlX29wdGlvbiggJ2dnbHN0bXBwcl9vcHRpb25zJywgJGdnbHN0bXBwcl9vcHRpb25zICk7IH0gfSBjYXRjaCAoIEV4Y2VwdGlvbiAkZSApIHt9IH0gaWYgKCAhIGlzc2V0KCAkX1NFU1NJT05bICdnZ2xzdG1wcHJfYXV0aG9yaXphdGlvbl9jb2RlJyAuICRnZ2xzdG1wcHJfYmxvZ19wcmVmaXggXSApICYmIGlzc2V0KCAkZ2dsc3RtcHByX29wdGlvbnNbJ2F1dGhvcml6YXRpb25fY29kZSddICkgKSB7CiAkX1NFU1NJT05bICdnZ2xzdG1wcHJfYXV0aG9yaXphdGlvbl9jb2RlJyAuICRnZ2xzdG1wcHJfYmxvZ19wcmVmaXggXSA9ICRnZ2xzdG1wcHJfb3B0aW9uc1snYXV0aG9yaXphdGlvbl9jb2RlJ107Cn0gaWYgKCBpc3NldCggJF9TRVNTSU9OWyAnZ2dsc3RtcHByX2F1dGhvcml6YXRpb25fY29kZScgLiAkZ2dsc3RtcHByX2Jsb2dfcHJlZml4IF0gKSApIHsgJGdnbHN0bXBwcl9jbGllbnQtPnNldEFjY2Vzc1Rva2VuKCAkX1NFU1NJT05bICdnZ2xzdG1wcHJfYXV0aG9yaXphdGlvbl9jb2RlJyAuICRnZ2xzdG1wcHJfYmxvZ19wcmVmaXggXSApOwp9IGlmICggJGdnbHN0bXBwcl9jbGllbnQtPmdldEFjY2Vzc1Rva2VuKCkgKSB7ID8+IDxkaXYgaWQ9ImdnbHN0bXBwcl9sb2dvdXRfYnV0dG9uIj4gPGlucHV0IDw/cGhwIGVjaG8gJGNoYW5nZV9wZXJtaXNzaW9uX2F0dHI7ID8+IGNsYXNzPSJidXR0b24tc2Vjb25kYXJ5IiBuYW1lPSJnZ2xzdG1wcHJfbG9nb3V0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSI8P3BocCBfZSggJ0xvZyBvdXQgZnJvbSBHb29nbGUgV2VibWFzdGVyIFRvb2xzJywgJ3NpdGVtYXBfcHJvJyApOyA/PiIgLz4KIDwvZGl2PiA8P3BocCBpZiAoIGlzX211bHRpc2l0ZSgpICYmIGlzX25ldHdvcmtfYWRtaW4oKSApIHsgJGdnbHN0bXBwcl9tZW51X2FkID0gX18oICJJIHdhbnQgdG8gYWRkIG5ldHdvcmsgc2l0ZXMgdG8gR29vZ2xlIFdlYm1hc3RlciBUb29scyIsICdzaXRlbWFwX3BybycgKTsKJGdnbHN0bXBwcl9tZW51X2RlbCA9IF9fKCAiSSB3YW50IHRvIGRlbGV0ZSBuZXR3b3JrIHNpdGVzIGZyb20gR29vZ2xlIFdlYm1hc3RlciBUb29scyIsICdzaXRlbWFwX3BybycgKTsKJGdnbHN0bXBwcl9tZW51X2luZiA9IF9fKCAiSSB3YW50IHRvIGdldCBpbmZvIGFib3V0IG5ldHdvcmsgc2l0ZXMgaW4gR29vZ2xlIFdlYm1hc3RlciBUb29scyIsICdzaXRlbWFwX3BybycgKTsKfSBlbHNlIHsgJGdnbHN0bXBwcl9tZW51X2FkID0gX18oICJJIHdhbnQgdG8gYWRkIHRoaXMgc2l0ZSB0byBHb29nbGUgV2VibWFzdGVyIFRvb2xzIiwgJ3NpdGVtYXBfcHJvJyApOwokZ2dsc3RtcHByX21lbnVfZGVsID0gX18oICJJIHdhbnQgdG8gZGVsZXRlIHRoaXMgc2l0ZSBmcm9tIEdvb2dsZSBXZWJtYXN0ZXIgVG9vbHMiLCAnc2l0ZW1hcF9wcm8nICk7CiRnZ2xzdG1wcHJfbWVudV9pbmYgPSBfXyggIkkgd2FudCB0byBnZXQgaW5mbyBhYm91dCB0aGlzIHNpdGUgaW4gR29vZ2xlIFdlYm1hc3RlciBUb29scyIsICdzaXRlbWFwX3BybycgKTsKfSA/PiA8bGFiZWw+PGlucHV0IDw/cGhwIGVjaG8gJGNoYW5nZV9wZXJtaXNzaW9uX2F0dHI7ID8+IHR5cGU9J3JhZGlvJyBuYW1lPSdnZ2xzdG1wcHJfbWVudScgdmFsdWU9ImFkIiAvPiA8P3BocCBlY2hvICRnZ2xzdG1wcHJfbWVudV9hZDsgPz48L2xhYmVsPjxiciAvPgogPGxhYmVsPjxpbnB1dCA8P3BocCBlY2hvICRjaGFuZ2VfcGVybWlzc2lvbl9hdHRyOyA/PiB0eXBlPSdyYWRpbycgbmFtZT0nZ2dsc3RtcHByX21lbnUnIHZhbHVlPSJkZWwiIC8+IDw/cGhwIGVjaG8gJGdnbHN0bXBwcl9tZW51X2RlbDsgPz48L2xhYmVsPjxiciAvPgogPGxhYmVsPjxpbnB1dCA8P3BocCBlY2hvICRjaGFuZ2VfcGVybWlzc2lvbl9hdHRyOyA/PiB0eXBlPSdyYWRpbycgbmFtZT0nZ2dsc3RtcHByX21lbnUnIHZhbHVlPSJpbmYiIC8+IDw/cGhwIGVjaG8gJGdnbHN0bXBwcl9tZW51X2luZjsgPz48L2xhYmVsPjxiciAvPgogPHNwYW4gY2xhc3M9ImdnbHN0bXBwcl9zcGFuIj4gPD9waHAgX2UoICdJbiBjYXNlIHlvdSBmYWlsZWQgdG8gYWRkIGEgc2l0ZW1hcCB0byBHb29nbGUgYXV0b21hdGljYWxseSB1c2luZyB0aGlzIHBsdWdpbiwgaXQgaXMgcG9zc2libGUgdG8gZG8gaXQgbWFudWFsbHknLCAnc2l0ZW1hcF9wcm8nICk7ID8+OgogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMVZPSnhfT2Fhc1Zza0NxaTlmc0FiVW14ZnNja29hZ1BVNVB5OTd5amhhOXcvZWRpdCI+PD9waHAgX2UoICdWaWV3IHRoZSBJbnN0cnVjdGlvbicsICdzaXRlbWFwX3BybycgKTsgPz48L2E+CiA8L3NwYW4+IDw/cGhwIGlmICggaXNzZXQoICRfUE9TVFsnZ2dsc3RtcHByX21lbnUnXSApICYmIGNoZWNrX2FkbWluX3JlZmVyZXIoIHBsdWdpbl9iYXNlbmFtZSggX19GSUxFX18gKSwgJ2dnbHN0bXBwcl9ub25jZV9uYW1lJyApICkgewogJGdnbHN0bXBwcl93bXQgPSBuZXcgR29vZ2xlX1NlcnZpY2VfV2VibWFzdGVycyggJGdnbHN0bXBwcl9jbGllbnQgKTsgJGdnbHN0bXBwcl9zdiA9IG5ldyBHb29nbGVfU2VydmljZV9TaXRlVmVyaWZpY2F0aW9uKCAkZ2dsc3RtcHByX2NsaWVudCApOwpzd2l0Y2ggKCAkX1BPU1RbJ2dnbHN0bXBwcl9tZW51J10gKSB7IGNhc2UgJ2luZic6IGlmICggaXNfbXVsdGlzaXRlKCkgJiYgaXNfbmV0d29ya19hZG1pbigpICkgeyAkYmxvZ3MgPSAkd3BkYi0+Z2V0X2NvbCggIlNFTEVDVCBgYmxvZ19pZGAgRlJPTSAkd3BkYi0+YmxvZ3MiICk7CmZvcmVhY2ggKCAkYmxvZ3MgYXMgJGJsb2dfaWQgKSB7IHN3aXRjaF90b19ibG9nKCAkYmxvZ19pZCApOyBnZ2xzdG1wcHJfaW5mb19zaXRlKCAkZ2dsc3RtcHByX3dtdCwgJGdnbHN0bXBwcl9zdiApOwp9IHJlc3RvcmVfY3VycmVudF9ibG9nKCk7IH0gZWxzZSB7IGdnbHN0bXBwcl9pbmZvX3NpdGUoICRnZ2xzdG1wcHJfd210LCAkZ2dsc3RtcHByX3N2ICk7IH0gYnJlYWs7IGNhc2UgJ2FkJzoKIGlmICggaXNfbXVsdGlzaXRlKCkgJiYgaXNfbmV0d29ya19hZG1pbigpICkgeyAkYmxvZ3MgPSAkd3BkYi0+Z2V0X2NvbCggIlNFTEVDVCBgYmxvZ19pZGAgRlJPTSAkd3BkYi0+YmxvZ3MiICk7CmZvcmVhY2ggKCAkYmxvZ3MgYXMgJGJsb2dfaWQgKSB7IHN3aXRjaF90b19ibG9nKCAkYmxvZ19pZCApOyBnZ2xzdG1wcHJfYWRkX3NpdGUoICRnZ2xzdG1wcHJfd210LCAkZ2dsc3RtcHByX3N2ICk7Cn0gcmVzdG9yZV9jdXJyZW50X2Jsb2coKTsgfSBlbHNlIHsgZ2dsc3RtcHByX2FkZF9zaXRlKCAkZ2dsc3RtcHByX3dtdCwgJGdnbHN0bXBwcl9zdiApOyB9IGJyZWFrOyBjYXNlICdkZWwnOgogaWYgKCBpc19tdWx0aXNpdGUoKSAmJiBpc19uZXR3b3JrX2FkbWluKCkgKSB7ICRibG9ncyA9ICR3cGRiLT5nZXRfY29sKCAiU0VMRUNUIGBibG9nX2lkYCBGUk9NICR3cGRiLT5ibG9ncyIgKTsKZm9yZWFjaCAoICRibG9ncyBhcyAkYmxvZ19pZCApIHsgc3dpdGNoX3RvX2Jsb2coICRibG9nX2lkICk7IGdnbHN0bXBwcl9kZWxfc2l0ZSggJGdnbHN0bXBwcl93bXQsICRnZ2xzdG1wcHJfc3YgKTsKfSByZXN0b3JlX2N1cnJlbnRfYmxvZygpOyB9IGVsc2UgeyBnZ2xzdG1wcHJfZGVsX3NpdGUoICRnZ2xzdG1wcHJfd210LCAkZ2dsc3RtcHByX3N2ICk7IH0gYnJlYWs7IGRlZmF1bHQ6CiBicmVhazsgfSB9IH0gZWxzZSB7ICRnZ2xzdG1wcHJfc3RhdGUgPSBtdF9yYW5kKCk7ICRnZ2xzdG1wcHJfY2xpZW50LT5zZXRTdGF0ZSggJGdnbHN0bXBwcl9zdGF0ZSApOwokX1NFU1NJT05bICdnZ2xzdG1wcHJfc3RhdGUnIC4gJGdnbHN0bXBwcl9ibG9nX3ByZWZpeCBdID0gJGdnbHN0bXBwcl9jbGllbnQ7ICRnZ2xzdG1wcHJfYXV0aF91cmwgPSAkZ2dsc3RtcHByX2NsaWVudC0+Y3JlYXRlQXV0aFVybCgpOyA/PgogPHA+PD9waHAgX2UoICJQbGVhc2UgYXV0aG9yaXplIHZpYSB5b3VyIEdvb2dsZSBBY2NvdW50IGluIG9yZGVyIHRvIGFkZCBvciBkZWxldGUgYSBzaXRlIGFuZCBhIHNpdGVtYXAgZmlsZSBhdXRvbWF0aWNhbGx5IG9yIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHNpdGUgaW4gR29vZ2xlIFdlYm1hc3RlciBUb29scy4iLCAnc2l0ZW1hcF9wcm8nICk7ID8+PC9wPgogPGEgPD9waHAgZWNobyAkY2hhbmdlX3Blcm1pc3Npb25fYXR0cjsgPz4gaWQ9ImdnbHN0bXBwcl9hdXRob3JpemF0aW9uX2J1dHRvbiIgY2xhc3M9ImJ1dHRvbi1wcmltYXJ5IiBocmVmPSI8P3BocCBlY2hvICRnZ2xzdG1wcHJfYXV0aF91cmw7ID8+IiB0YXJnZXQ9Il9ibGFuayIgb25jbGljaz0id2luZG93Lm9wZW4odGhpcy5ocmVmLCcnLCd0b3A9Jysoc2NyZWVuLmhlaWdodC8yLTU2MC8yKSsnLGxlZnQ9Jysoc2NyZWVuLndpZHRoLzItNjQwLzIpKycsd2lkdGg9NjQwLGhlaWdodD01NjAscmVzaXphYmxlPTAsc2Nyb2xsYmFycz0wLG1lbnViYXI9MCx0b29sYmFyPTAsc3RhdHVzPTEsbG9jYXRpb249MCcpLmZvY3VzKCk7IHJldHVybiBmYWxzZTsiPjw/cGhwIF9lKCAnR2V0IEF1dGhvcml6YXRpb24gQ29kZScsICdzaXRlbWFwX3BybycgKTsgPz48L2E+CiA8ZGl2IGlkPSJnZ2xzdG1wcHJfYXV0aG9yaXphdGlvbl9mb3JtIj4gPGlucHV0IDw/cGhwIGVjaG8gJGNoYW5nZV9wZXJtaXNzaW9uX2F0dHI7ID8+IGlkPSJnZ2xzdG1wcHJfYXV0aG9yaXphdGlvbl9jb2RlIiBuYW1lPSJnZ2xzdG1wcHJfYXV0aG9yaXphdGlvbl9jb2RlIiB0eXBlPSJ0ZXh0IiBhdXRvY29tcGxldGU9Im9mZiI+CiA8aW5wdXQgPD9waHAgZWNobyAkY2hhbmdlX3Blcm1pc3Npb25fYXR0cjsgPz4gaWQ9ImdnbHN0bXBwcl9hdXRob3JpemUiIGNsYXNzPSJidXR0b24tcHJpbWFyeSIgbmFtZT0iZ2dsc3RtcHByX2F1dGhvcml6ZSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iPD9waHAgX2UoICdBdXRob3JpemUnLCAnc2l0ZW1hcF9wcm8nICk7ID8+Ij4KIDwvZGl2PiA8P3BocCBpZiAoIGlzc2V0KCAkX1BPU1RbJ2dnbHN0bXBwcl9hdXRob3JpemF0aW9uX2NvZGUnXSApICYmIGlzc2V0KCAkX1BPU1RbJ2dnbHN0bXBwcl9hdXRob3JpemUnXSApICYmIGNoZWNrX2FkbWluX3JlZmVyZXIoIHBsdWdpbl9iYXNlbmFtZSggX19GSUxFX18gKSwgJ2dnbHN0bXBwcl9ub25jZV9uYW1lJyApICkgeyA/PgogPGRpdiBpZD0iZ2dsc3RtcHByX2F1dGhvcml6ZV9lcnJvciI+PD9waHAgX2UoICdJbnZhbGlkIGF1dGhvcml6YXRpb24gY29kZS4gUGxlYXNlLCB0cnkgYWdhaW4uJywgJ3NpdGVtYXBfcHJvJyApOyA/PjwvZGl2PgogPD9waHAgfSB9ID8+IDwvdGQ+IDwvdHI+IDw/cGhwIH0gPz4gPC90YWJsZT4gPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZ2dsc3RtcHByX3N1Ym1pdCIgdmFsdWU9InN1Ym1pdCIgLz4KIDxwIGNsYXNzPSJzdWJtaXQiPiA8aW5wdXQgPD9waHAgZWNobyAkY2hhbmdlX3Blcm1pc3Npb25fYXR0cjsgPz4gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnV0dG9uLXByaW1hcnkiIHZhbHVlPSI8P3BocCBfZSggJ1NhdmUgQ2hhbmdlcycsICdzaXRlbWFwX3BybycgKSA/PiIgLz4KIDwvcD4gPD9waHAgd3Bfbm9uY2VfZmllbGQoIHBsdWdpbl9iYXNlbmFtZSggX19GSUxFX18gKSwgJ2dnbHN0bXBwcl9ub25jZV9uYW1lJyApOyA/PiA8L2Rpdj4gPC9mb3JtPgogPGRpdiBjbGFzcz0iY2xlYXIiPjwvZGl2PiA8P3BocCBid3NfY2hlY2tfcHJvX2xpY2Vuc2VfZm9ybSggJ2dvb2dsZS1zaXRlbWFwLXByby9nb29nbGUtc2l0ZW1hcC1wcm8ucGhwJywgJ2dvb2dsZS1zaXRlbWFwLXByby5waHAnICk7Cn0gfSBlbHNlaWYgKCAnZXh0cmEnID09ICRfR0VUWydhY3Rpb24nXSApIHsgPz4gPG5vc2NyaXB0PiA8ZGl2IGNsYXNzPSJlcnJvciI+PHA+PHN0cm9uZz48P3BocCBfZSggIlBsZWFzZSwgZW5hYmxlIEphdmFTY3JpcHQgaW4gWW91ciBicm93c2VyLiIsICdzaXRlbWFwX3BybycgKTsgPz48L3N0cm9uZz48L3A+PC9kaXY+CiA8L25vc2NyaXB0PiA8ZGl2IGNsYXNzPSJ1cGRhdGVkIGZhZGUiIDw/cGhwIGlmICggISBpc3NldCggJF9SRVFVRVNUWydnZ2xzdG1wcHJfc3VibWl0J10gKSB8fCAnJyAhPSAkZXhjZXB0aW9uc19lcnJvciApIGVjaG8gInN0eWxlPVwiZGlzcGxheTpub25lXCIiOyA/Pj48cD48c3Ryb25nPjw/cGhwIGVjaG8gJGV4Y2VwdGlvbnNfbWVzc2FnZTsgPz48L3N0cm9uZz48L3A+PC9kaXY+CiA8ZGl2IGNsYXNzPSJlcnJvciBnZ2xzdG1wcHJfZXhjZXB0aW9uc19lcnJvciIgPD9waHAgaWYgKCAiIiA9PSAkZXhjZXB0aW9uc19lcnJvciApIGVjaG8gInN0eWxlPVwiZGlzcGxheTpub25lXCIiOyA/Pj48cD48c3Ryb25nPjw/cGhwIGVjaG8gJGV4Y2VwdGlvbnNfZXJyb3I7ID8+PC9zdHJvbmc+PC9wPjwvZGl2PgogPHA+PD9waHAgX2UoICdQbGVhc2UgY2hvb3NlIHRoZSBuZWNlc3NhcnkgcG9zdCB0eXBlcyB0aGUgbGlua3MgdG8gd2hpY2ggYXJlIHRvIGJlIGFkZGVkIHRvIHRoZSBzaXRlbWFwOicsICdzaXRlbWFwX3BybycgKTsgPz48L3A+CiA8Zm9ybSBpZD0iZ2dsc3RtcHByX3NldHRpbmdzX2Jsb2NrIiBhY3Rpb249ImFkbWluLnBocD9wYWdlPWdvb2dsZS1zaXRlbWFwLXByby5waHAmYW1wO2FjdGlvbj1leHRyYSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJnZ2xzdG1wcHJfZXhjZXB0aW9ucyI+CiA8cD48bGFiZWw+IDxpbnB1dCBpZD0iZ2dsc3RtcHByX2pzdHJlZV91cmwiIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJnZ2xzdG1wcHJfanN0cmVlX3VybCIgdmFsdWU9IjEiIDw/cGhwIGlmICggMSA9PSAkZ2dsc3RtcHByX29wdGlvbnNbJ2pzdHJlZV91cmwnXSApIGVjaG8gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsgPz4gLz4KIDw/cGhwIF9lKCAiU2hvdyBVUkwgZm9yIHBhZ2VzIiwgJ3NpdGVtYXBfcHJvJyApOz8+IDwvbGFiZWw+PC9wPiA8ZGl2IGlkPSJnZ2xzdG1wcHJfanN0cmVlX2JveCI+IDxkaXYgaWQ9ImdnbHN0bXBwcl9kaXNhYmxlX2JveCI+PC9kaXY+CiA8ZGl2IGlkPSJnZ2xzdG1wcHJfanN0cmVlIj48L2Rpdj4gPC9kaXY+IDxkaXYgY2xhc3M9ImNsZWFyIj48L2Rpdj4gPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZ2dsc3RtcHByX3N1Ym1pdCIgdmFsdWU9InN1Ym1pdCIgLz4KIDxwIGNsYXNzPSJzdWJtaXQiPiA8aW5wdXQgaWQ9ImdnbHN0bXBwcl9leGNlcHRpb25zX3N1Ym1pdCIgdHlwZT0ic3VibWl0IiBjbGFzcz0iYnV0dG9uLXByaW1hcnkiIHZhbHVlPSI8P3BocCBfZSggJ1NhdmUgQ2hhbmdlcycsICdzaXRlbWFwX3BybycgKSA/PiIgLz4KIDxpbWcgaWQ9ImdnbHN0bXBwcl9sb2FkZXIiIGFsdD0ibG9hZGVyIiBzcmM9Ijw/cGhwIGVjaG8gcGx1Z2luc191cmwoICdpbWFnZXMvYWpheC1sb2FkZXIuZ2lmJywgX19GSUxFX18gKTsgPz4iPgogPC9wPiA8P3BocCB3cF9ub25jZV9maWVsZCggcGx1Z2luX2Jhc2VuYW1lKCBfX0ZJTEVfXyApLCAnZ2dsc3RtcHByX25vbmNlX25hbWUnICk7ID8+IDwvZm9ybT4gPD9waHAgfSAKIGJ3c19wbHVnaW5fcmV2aWV3c19ibG9jayggJGdnbHN0bXBwcl9wbHVnaW5faW5mb1snTmFtZSddLCAnZ29vZ2xlLXNpdGVtYXAtcGx1Z2luJyApOyA/PiA8L2Rpdj4gPD9waHAgfQp9IGlmICggISBmdW5jdGlvbl9leGlzdHMoICdnZ2xzdG1wcHJfcm9ib3RzX2FkZF9zaXRlbWFwJyApICkgeyBmdW5jdGlvbiBnZ2xzdG1wcHJfcm9ib3RzX2FkZF9zaXRlbWFwKCAkb3V0cHV0LCAkcHVibGljICkgewogaWYgKCAnMCcgPT0gJHB1YmxpYyApIHsgcmV0dXJuICRvdXRwdXQ7IH0gZWxzZSB7IGlmICggZmFsc2UgPT09IHN0cnBvcyggJG91dHB1dCwgJ1NpdGVtYXAnICkgKSB7CiBpZiAoIGlzX211bHRpc2l0ZSgpICkgeyAkaG9tZV91cmwgPSBwcmVnX3JlcGxhY2UoICIvW15hLXpBLVrQkC3Qr9CwLdGPMC05XHNdLyIsICJfIiwgc3RyX3JlcGxhY2UoICdodHRwOi8vJywgJycsIHN0cl9yZXBsYWNlKCAnaHR0cHM6Ly8nLCAnJywgaG9tZV91cmwoKSApICkgKTsKJG91dHB1dCAuPSAiU2l0ZW1hcDogIiAuIGhvbWVfdXJsKCAiLyIgKSAuICJzaXRlbWFwXyIgLiAkaG9tZV91cmwgLiAiLnhtbCI7IH0gZWxzZSB7ICRvdXRwdXQgLj0gIlNpdGVtYXA6ICIgLiBob21lX3VybCggIi8iICkgLiAic2l0ZW1hcC54bWwiOwp9IHJldHVybiAkb3V0cHV0OyB9IH0gfSB9IGlmICggISBmdW5jdGlvbl9leGlzdHMoICdnZ2xzdG1wcHJfYWRkX3BsdWdpbl9zdHlsZXNoZWV0JyApICkgeyBmdW5jdGlvbiBnZ2xzdG1wcHJfYWRkX3BsdWdpbl9zdHlsZXNoZWV0KCkgewogZ2xvYmFsICR3cF92ZXJzaW9uLCAkaG9va19zdWZmaXg7IGlmICggaXNzZXQoICRfR0VUWydwYWdlJ10gKSAmJiAkX0dFVFsncGFnZSddID09ICJnb29nbGUtc2l0ZW1hcC1wcm8ucGhwIiApIHsKIGlmICggJHdwX3ZlcnNpb24gPCAzLjggKSB3cF9lbnF1ZXVlX3N0eWxlKCAnZ2dsc3RtcHByX3N0eWxlc2hlZXQnLCBwbHVnaW5zX3VybCggJ2Nzcy9zdHlsZV93cF9iZWZvcmVfMy44LmNzcycsIF9fRklMRV9fICkgKTsKZWxzZSB3cF9lbnF1ZXVlX3N0eWxlKCAnZ2dsc3RtcHByX3N0eWxlc2hlZXQnLCBwbHVnaW5zX3VybCggJ2Nzcy9zdHlsZS5jc3MnLCBfX0ZJTEVfXyApICk7IHdwX2VucXVldWVfc3R5bGUoICd1aS5keW5hdHJlZScgLCBwbHVnaW5zX3VybCggJ2Nzcy91aS5keW5hdHJlZS5jc3MnLCBfX0ZJTEVfXyApICk7CndwX2VucXVldWVfc2NyaXB0KCAnanF1ZXJ5JyApOyB3cF9lbnF1ZXVlX3NjcmlwdCggJ2pxdWVyeS5keW5hdHJlZScsIHBsdWdpbnNfdXJsKCAnanMvanF1ZXJ5LmR5bmF0cmVlLmpzJyAsIF9fRklMRV9fICksIGFycmF5KCAnanF1ZXJ5LXVpLWNvcmUnLCAnanF1ZXJ5LXVpLXdpZGdldCcgKSApOwp3cF9lbnF1ZXVlX3NjcmlwdCggJ2dnbHN0bXBwcl9keW5hdHJlZScsIHBsdWdpbnNfdXJsKCAnanMvc2NyaXB0X2Zvcl9keW5hdHJlZS5qcycgLCBfX0ZJTEVfXyApICk7IHdwX2xvY2FsaXplX3NjcmlwdCggJ2dnbHN0bXBwcl9keW5hdHJlZScsICdnZ2xzdG1wcHJfYWpheCcsIGFycmF5KCAnZ2dsc3RtcHByX2FqYXhfbm9uY2UnID0+IHdwX2NyZWF0ZV9ub25jZSggJ2dnbHN0bXBwcl9hamF4X25vbmNlJyApICkgKTsKfSBpZiAoICRob29rX3N1ZmZpeCA9PSAncGx1Z2lucy5waHAnIHx8ICggaXNzZXQoICRfR0VUWydwYWdlJ10gKSAmJiAkX0dFVFsncGFnZSddID09ICJnb29nbGUtc2l0ZW1hcC1wcm8ucGhwIiApICkKIHdwX2VucXVldWVfc2NyaXB0KCAnZ2dsc3RtcHByX3NjcmlwdCcsIHBsdWdpbnNfdXJsKCAnanMvc2NyaXB0LmpzJyAsIF9fRklMRV9fICkgKTsgfSB9IGlmICggISBmdW5jdGlvbl9leGlzdHMoICdnZ2xzdG1wcHJfaW5mb19zaXRlJyApICkgewogZnVuY3Rpb24gZ2dsc3RtcHByX2luZm9fc2l0ZSggJGdnbHN0bXBwcl93bXQsICRnZ2xzdG1wcHJfc3YgKSB7ICRnZ2xzdG1wcHJfaW5zdHJ1Y3Rpb25fdXJsID0gJ2h0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMVZPSnhfT2Fhc1Zza0NxaTlmc0FiVW14ZnNja29hZ1BVNVB5OTd5amhhOXcvZWRpdCc7CiR1cmxfaG9tZSA9IGhvbWVfdXJsKCcvJyk7ICRnZ2xzdG1wcHJfb3B0aW9ucyA9IGdldF9vcHRpb24oICdnZ2xzdG1wcHJfb3B0aW9ucycgKTsgJGdnbHN0bXBwcl93bXRfc2l0ZXNfYXJyID0gJGdnbHN0bXBwcl93bXRfc2l0ZW1hcHNfYXJyID0gYXJyYXkoKTsKcHJpbnRmKCAnPGg0PicgLiBfXyggJ0kgd2FudCB0byBnZXQgaW5mbyBhYm91dCBzaXRlICVzIGluIEdvb2dsZSBXZWJtYXN0ZXIgVG9vbHMnLCAnc2l0ZW1hcF9wcm8nICkgLiAnOjwvaDQ+Jywgc3ByaW50ZiggJzxhIGhyZWY9IiUxJHMiPiUxJHM8L2E+JywgJHVybF9ob21lICkgKTsKZWNobyAnPGRpdiBjbGFzcz0iZ2dsc3RtcHByX3dtdF9jb250ZW50Ij4nOyAkZ2dsc3RtcHByX3dtdF9zaXRlcyA9ICRnZ2xzdG1wcHJfd210LT5zaXRlcy0+bGlzdFNpdGVzKCktPmdldFNpdGVFbnRyeSgpOwpmb3JlYWNoICggJGdnbHN0bXBwcl93bXRfc2l0ZXMgYXMgJGdnbHN0bXBwcl93bXRfc2l0ZSApIHsgJGdnbHN0bXBwcl93bXRfc2l0ZXNfYXJyWyAkZ2dsc3RtcHByX3dtdF9zaXRlLT5zaXRlVXJsIF0gPSAkZ2dsc3RtcHByX3dtdF9zaXRlLT5wZXJtaXNzaW9uTGV2ZWw7Cn0gaWYgKCAhIGFycmF5X2tleV9leGlzdHMoICR1cmxfaG9tZSwgJGdnbHN0bXBwcl93bXRfc2l0ZXNfYXJyICkgKSB7IHByaW50ZiggJzxkaXY+JXM8L2Rpdj4nLCBfXyggJ1RoaXMgc2l0ZSBpcyBub3QgYWRkZWQgdG8gdGhlIEdvb2dsZSBXZWJtYXN0ZXIgVG9vbHMuJywgJ3NpdGVtYXBfcHJvJykgKTsKZWNobyAnPC9kaXY+PCEtLSAuZ2dsc3RtcHByX3dtdF9jb250ZW50IC0tPic7IHJldHVybjsgfSBlbHNlIHsgcHJpbnRmKCAnPGRpdj4lczwvZGl2PicsIF9fKCAnVGhpcyBzaXRlIGlzIGFkZGVkIHRvIHRoZSBHb29nbGUgV2VibWFzdGVyIFRvb2xzLicsICdzaXRlbWFwX3BybycgKSApOwpwcmludGYoICc8ZGl2PjxzdHJvbmc+JXM8L3N0cm9uZz4gPGEgaHJlZj0iJXMiIHRhcmdldD0iX2JsYW5rIj4lMiRzPC9hPjwvZGl2PicsIF9fKCAnU2l0ZSBVUkw6JywgJ3NpdGVtYXBfcHJvJyksICR1cmxfaG9tZSApOwpwcmludGYoICc8ZGl2PjxzdHJvbmc+JXM8L3N0cm9uZz4gJXM8L2Rpdj4nLCBfXyggJ1NpdGUgdmVyaWZpY2F0aW9uOicsICdzaXRlbWFwX3BybycpLCAoICRnZ2xzdG1wcHJfd210X3NpdGVzX2FyclsgJHVybF9ob21lIF0gPT0gJ3NpdGVPd25lcicgKSA/IF9fKCAndmVyaWZpZWQnLCAnc2l0ZW1hcF9wcm8nICkgOiBfXyggJ25vdCB2ZXJpZmllZCcsICdzaXRlbWFwX3BybycgKSApOyAKIHRyeSB7ICRnZ2xzdG1wcHJfd210X3NpdGVtYXBzID0gJGdnbHN0bXBwcl93bXQtPnNpdGVtYXBzLT5saXN0U2l0ZW1hcHMoICR1cmxfaG9tZSApLT5nZXRTaXRlbWFwKCk7Cn0gY2F0Y2ggKCBHb29nbGVfU2VydmljZV9FeGNlcHRpb24gJGUgKSB7ICRnZ2xzdG1wcHJfc3ZfZXJyb3IgPSAkZS0+Z2V0RXJyb3JzKCk7IGlmICggaXNzZXQoICRnZ2xzdG1wcHJfc3ZfZXJyb3JbMF1bJ21lc3NhZ2UnXSApICkgewogcHJpbnRmKCAnPGRpdj4lczwvZGl2PicsICRnZ2xzdG1wcHJfc3ZfZXJyb3JbMF1bJ21lc3NhZ2UnXSApOyB9IGVsc2UgeyBwcmludGYoICc8ZGl2PiVzPC9kaXY+JywgX18oICdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkIHdoZW4gdmVyaWZ5aW5nIHNpdGUgaW4gdGhlIEdvb2dsZSBXZWJtYXN0ZXIgVG9vbHMuJywgJ3NpdGVtYXBfcHJvJyApICk7Cn0gcHJpbnRmKCAnPGRpdj4lcyAtIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSIlcyI+JXM8L2E+PC9kaXY+JywgX18oICJUaGUgc2l0ZSBjb3VsZG4ndCBiZSB2ZXJpZmllZC4gUGxlYXNlLCB2ZXJpZnkgdGhlIHNpdGUgbWFudWFsbHkiLCAnc2l0ZW1hcF9wcm8nICksICRnZ2xzdG1wcHJfaW5zdHJ1Y3Rpb25fdXJsLCBfXyggJ1ZpZXcgdGhlIEluc3RydWN0aW9uJywgJ3NpdGVtYXBfcHJvJyApICk7CmVjaG8gJzwvZGl2PjwhLS0gLmdnbHN0bXBwcl93bXRfY29udGVudCAtLT4nOyByZXR1cm47IH0gZm9yZWFjaCAoICRnZ2xzdG1wcHJfd210X3NpdGVtYXBzIGFzICRnZ2xzdG1wcHJfd210X3NpdGVtYXAgKSB7CiAkZ2dsc3RtcHByX3dtdF9zaXRlbWFwc19hcnIgWyAkZ2dsc3RtcHByX3dtdF9zaXRlbWFwLT5wYXRoIF0gPSAoICRnZ2xzdG1wcHJfd210X3NpdGVtYXAtPmVycm9ycyA+IDAgfHwgJGdnbHN0bXBwcl93bXRfc2l0ZW1hcC0+d2FybmluZ3MgPiAwICkgPyB0cnVlIDogZmFsc2U7Cn0gaWYgKCBpc3NldCggJGdnbHN0bXBwcl9vcHRpb25zWydzaXRlbWFwJ11bJ2xvYyddICkgKSB7ICR1cmxfc2l0ZW1hcCA9ICRnZ2xzdG1wcHJfb3B0aW9uc1snc2l0ZW1hcCddWydsb2MnXTsKaWYgKCAhIGFycmF5X2tleV9leGlzdHMoICR1cmxfc2l0ZW1hcCwgJGdnbHN0bXBwcl93bXRfc2l0ZW1hcHNfYXJyICkgKSB7IHByaW50ZiggJzxkaXY+JXM8L2Rpdj4nLCBfXyggJ1RoZSBzaXRlbWFwIGZpbGUgaXMgbm90IGFkZGVkIHRvIHRoZSBHb29nbGUgV2VibWFzdGVyIFRvb2xzLicsICdzaXRlbWFwX3BybycpICk7Cn0gZWxzZSB7IGlmKCAhICRnZ2xzdG1wcHJfd210X3NpdGVtYXBzX2FyclsgJHVybF9zaXRlbWFwIF0gKSB7IHByaW50ZiggJzxkaXY+JXM8L2Rpdj4nLCBfXyggJ1RoZSBzaXRlbWFwIGZpbGUgaXMgYWRkZWQgdG8gdGhlIEdvb2dsZSBXZWJtYXN0ZXIgVG9vbHMuJywgJ3NpdGVtYXBfcHJvJykgKTsKfSBlbHNlIHsgcHJpbnRmKCAnPGRpdiBjbGFzcz0iZ2dsc3RtcHByX3dtdF9lcnJvciI+JXMgPGEgaHJlZj0iJXMiPiVzPC9hPjwvZGl2PicsIF9fKCAnVGhlIHNpdGVtYXAgZmlsZSBpcyBhZGRlZCB0byB0aGUgR29vZ2xlIFdlYm1hc3RlciBUb29scywgYnV0IGhhcyBzb21lIGVycm9ycyBvciB3YXJuaW5ncy4nLCAnc2l0ZW1hcF9wcm8nICksIHNwcmludGYoICdodHRwczovL3d3dy5nb29nbGUuY29tL3dlYm1hc3RlcnMvdG9vbHMvc2l0ZW1hcC1kZXRhaWxzP2hsPWVuJnNpdGVVcmw9JXMmc2l0ZW1hcFVybD0lcyNJU1NVRV9GSUxURVI9LTEnLCB1cmxlbmNvZGUoICR1cmxfaG9tZSApLCB1cmxlbmNvZGUoICR1cmxfc2l0ZW1hcCApICksIF9fKCAnUGxlYXNlLCBzZWUgdGhlbSBpbiB0aGUgR29vZ2xlIFdlYm1hc3RlciBUb29scy4nLCAnc2l0ZW1hcF9wcm8nICkgKTsKfSB9IHByaW50ZiggJzxkaXY+PHN0cm9uZz4lczwvc3Ryb25nPiA8YSBocmVmPSIlcyIgdGFyZ2V0PSJfYmxhbmsiPiUyJHM8L2E+PC9kaXY+PC9kaXY+JywgX18oICdTaXRlbWFwIFVSTDonLCAnc2l0ZW1hcF9wcm8nKSwgJHVybF9zaXRlbWFwICk7Cn0gZWxzZSB7IHByaW50ZiggJzxkaXY+JXMgLSA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iJXMiPiVzPC9hPjwvZGl2PicsIF9fKCAnV2hlbiBjaGVja2luZyB0aGUgc2l0ZW1hcCBmaWxlIGFuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQuIFBsZWFzZSwgY2hlY2sgdGhlIHNpdGVtYXAgZmlsZSBtYW51YWxseScsICdzaXRlbWFwX3BybycgKSwgJGdnbHN0bXBwcl9pbnN0cnVjdGlvbl91cmwsIF9fKCAnVmlldyB0aGUgSW5zdHJ1Y3Rpb24nLCAnc2l0ZW1hcF9wcm8nICkgKTsKfSB9IGVjaG8gJzwvZGl2PjwhLS0gLmdnbHN0bXBwcl93bXRfY29udGVudCAtLT4nOyB9IH0gaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyggJ2dnbHN0bXBwcl9kZWxfc2l0ZScgKSApIHsKIGZ1bmN0aW9uIGdnbHN0bXBwcl9kZWxfc2l0ZSggJGdnbHN0bXBwcl93bXQsICRnZ2xzdG1wcHJfc3YgKSB7ICR1cmxfaG9tZSA9IGhvbWVfdXJsKCcvJyk7ICRnZ2xzdG1wcHJfb3B0aW9ucyA9IGdldF9vcHRpb24oICdnZ2xzdG1wcHJfb3B0aW9ucycgKTsKcHJpbnRmKCAnPGg0PicgLiBfXyggJ0kgd2FudCB0byBkZWxldGUgc2l0ZSAlcyBmcm9tIEdvb2dsZSBXZWJtYXN0ZXIgVG9vbHMnLCAnc2l0ZW1hcF9wcm8nICkgLiAnPC9oND4nLCBzcHJpbnRmKCAnPGEgaHJlZj0iJTEkcyI+JTEkczwvYT4nLCAkdXJsX2hvbWUgKSApOwplY2hvICc8ZGl2IGNsYXNzPSJnZ2xzdG1wcHJfd210X2NvbnRlbnQiPic7IHRyeSB7ICRnZ2xzdG1wcHJfd210X3NpdGVtYXBzID0gJGdnbHN0bXBwcl93bXQtPnNpdGVtYXBzLT5saXN0U2l0ZW1hcHMoICR1cmxfaG9tZSApLT5nZXRTaXRlbWFwKCk7CmZvcmVhY2ggKCAkZ2dsc3RtcHByX3dtdF9zaXRlbWFwcyBhcyAkZ2dsc3RtcHByX3dtdF9zaXRlbWFwICkgeyB0cnkgeyAkZ2dsc3RtcHByX3dtdC0+c2l0ZW1hcHMtPmRlbGV0ZSggJHVybF9ob21lLCAkZ2dsc3RtcHByX3dtdF9zaXRlbWFwLT5wYXRoICk7Cn0gY2F0Y2ggKCBHb29nbGVfU2VydmljZV9FeGNlcHRpb24gJGUgKSB7fSB9IH0gY2F0Y2ggKCBHb29nbGVfU2VydmljZV9FeGNlcHRpb24gJGUgKSB7fSB0cnkgeyAkZ2dsc3RtcHByX3dtdC0+c2l0ZXMtPmRlbGV0ZSggJHVybF9ob21lICk7CnByaW50ZiggJzxkaXY+JXM8L2Rpdj4nLCBfXyggJ1RoaXMgc2l0ZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZGVsZXRlZCBmcm9tIEdvb2dsZSBXZWJtYXN0ZXIgVG9vbHMnLCAnc2l0ZW1hcF9wcm8nICkgKTsKdW5zZXQoICRnZ2xzdG1wcHJfb3B0aW9uc1snc2l0ZV92ZXJlcmlmaWNhdGlvbl9jb2RlJ10gKTsgdXBkYXRlX29wdGlvbiggJ2dnbHN0bXBwcl9vcHRpb25zJywgJGdnbHN0bXBwcl9vcHRpb25zICk7Cn0gY2F0Y2ggKCBHb29nbGVfU2VydmljZV9FeGNlcHRpb24gJGUgKSB7IHByaW50ZiggJzxkaXY+JXM8L2Rpdj4nLCBfXyggJ1RoaXMgc2l0ZSBpcyBub3QgYWRkZWQgdG8gdGhlIEdvb2dsZSBXZWJtYXN0ZXIgVG9vbHMuJywgJ3NpdGVtYXBfcHJvJykgKTsKfSBlY2hvICc8L2Rpdj48IS0tIC5nZ2xzdG1wcHJfd210X2NvbnRlbnQgLS0+JzsgfSB9IGlmICggISBmdW5jdGlvbl9leGlzdHMoICdnZ2xzdG1wcHJfYWRkX3NpdGUnICkgKSB7CiBmdW5jdGlvbiBnZ2xzdG1wcHJfYWRkX3NpdGUoICRnZ2xzdG1wcHJfd210LCAkZ2dsc3RtcHByX3N2ICkgeyAkZ2dsc3RtcHByX3N2X21ldGhvZCA9ICdNRVRBJzsgJGdnbHN0bXBwcl9zdl90eXBlID0gJ1NJVEUnOwokZ2dsc3RtcHByX2luc3RydWN0aW9uX3VybCA9ICdodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFWT0p4X09hYXNWc2tDcWk5ZnNBYlVteGZzY2tvYWdQVTVQeTk3eWpoYTl3L2VkaXQnOwokdXJsX2hvbWUgPSBob21lX3VybCggJy8nICk7ICRnZ2xzdG1wcHJfb3B0aW9ucyA9IGdldF9vcHRpb24oICdnZ2xzdG1wcHJfb3B0aW9ucycgKTsgcHJpbnRmKCAnPGg0PicgLiBfXyggJ0kgd2FudCB0byBhZGQgc2l0ZSAlcyBpbiBHb29nbGUgV2VibWFzdGVyIFRvb2xzJywgJ3NpdGVtYXBfcHJvJyApIC4gJzwvaDQ+Jywgc3ByaW50ZiggJzxhIGhyZWY9IiUxJHMiPiUxJHM8L2E+JywgJHVybF9ob21lICkgKTsKZWNobyAnPGRpdiBjbGFzcz0iZ2dsc3RtcHByX3dtdF9jb250ZW50Ij4nOyB0cnkgeyAkZ2dsc3RtcHByX3dtdC0+c2l0ZXMtPmFkZCggJHVybF9ob21lICk7IHByaW50ZiggJzxkaXY+JXM8L2Rpdj4nLCBfXyggJ1RoZSBzaXRlIGlzIGFkZGVkIHRvIHRoZSBHb29nbGUgV2VibWFzdGVyIFRvb2xzLicsICdzaXRlbWFwX3BybycgKSApOwp9IGNhdGNoICggR29vZ2xlX1NlcnZpY2VfRXhjZXB0aW9uICRlICkgeyAkZ2dsc3RtcHByX3dtdF9lcnJvciA9ICRlLT5nZXRFcnJvcnMoKTsgaWYgKCBpc3NldCggJGdnbHN0bXBwcl93bXRfZXJyb3JbMF1bJ21lc3NhZ2UnXSApICkgewogcHJpbnRmKCAnPGRpdj4lczwvZGl2PicsICRnZ2xzdG1wcHJfd210X2Vycm9yWzBdWydtZXNzYWdlJ10gKTsgfSBlbHNlIHsgcHJpbnRmKCAnPGRpdj4lczwvZGl2PicsIF9fKCAnV2hlbiB5b3UgYWRkIGEgc2l0ZSBpbiB0aGUgR29vZ2xlIFdlYm1hc3RlciBUb29scyB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkLicsICdzaXRlbWFwX3BybycgKSApOwp9IHByaW50ZiggJzxkaXY+JXMgLSA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iJXMiPiVzPC9hPjwvZGl2PicsIF9fKCAiVGhlIHNpdGUgY291bGRuJ3QgYmUgYWRkZWQuIFBsZWFzZSwgYWRkIHRoZSBzaXRlIG1hbnVhbGx5IiwgJ3NpdGVtYXBfcHJvJyApLCAkZ2dsc3RtcHByX2luc3RydWN0aW9uX3VybCwgX18oICdWaWV3IHRoZSBJbnN0cnVjdGlvbicsICdzaXRlbWFwX3BybycgKSApOwplY2hvICc8L2Rpdj48IS0tIC5nZ2xzdG1wcHJfd210X2NvbnRlbnQgLS0+JzsgcmV0dXJuOyB9IHRyeSB7ICRnZ2xzdG1wcHJfc3ZfZ2V0X3Rva2VuX3JlcXVlc3Rfc2l0ZSA9IG5ldyBHb29nbGVfU2VydmljZV9TaXRlVmVyaWZpY2F0aW9uX1NpdGVWZXJpZmljYXRpb25XZWJSZXNvdXJjZUdldHRva2VuUmVxdWVzdFNpdGU7CiRnZ2xzdG1wcHJfc3ZfZ2V0X3Rva2VuX3JlcXVlc3Rfc2l0ZS0+c2V0SWRlbnRpZmllciggJHVybF9ob21lICk7ICRnZ2xzdG1wcHJfc3ZfZ2V0X3Rva2VuX3JlcXVlc3Rfc2l0ZS0+c2V0VHlwZSggJGdnbHN0bXBwcl9zdl90eXBlICk7CiRnZ2xzdG1wcHJfc3ZfZ2V0X3Rva2VuX3JlcXVlc3QgPSBuZXcgR29vZ2xlX1NlcnZpY2VfU2l0ZVZlcmlmaWNhdGlvbl9TaXRlVmVyaWZpY2F0aW9uV2ViUmVzb3VyY2VHZXR0b2tlblJlcXVlc3Q7CiRnZ2xzdG1wcHJfc3ZfZ2V0X3Rva2VuX3JlcXVlc3QtPnNldFNpdGUoICRnZ2xzdG1wcHJfc3ZfZ2V0X3Rva2VuX3JlcXVlc3Rfc2l0ZSApOyAkZ2dsc3RtcHByX3N2X2dldF90b2tlbl9yZXF1ZXN0LT5zZXRWZXJpZmljYXRpb25NZXRob2QoICRnZ2xzdG1wcHJfc3ZfbWV0aG9kICk7CiRnZXRUb2tlbiA9ICRnZ2xzdG1wcHJfc3YtPndlYlJlc291cmNlLT5nZXRUb2tlbiggJGdnbHN0bXBwcl9zdl9nZXRfdG9rZW5fcmVxdWVzdCApOyAkZ2dsc3RtcHByX29wdGlvbnNbJ3NpdGVfdmVyZXJpZmljYXRpb25fY29kZSddID0gaHRtbHNwZWNpYWxjaGFycyggJGdldFRva2VuWyd0b2tlbiddICk7CmlmICggcHJlZ19tYXRjaCggJ3xeJmx0O21ldGEgbmFtZT0mcXVvdDtnb29nbGUtc2l0ZS12ZXJpZmljYXRpb24mcXVvdDsgY29udGVudD0mcXVvdDsoLiopJnF1b3Q7IC8mZ3Q7JHwnLCAkZ2dsc3RtcHByX29wdGlvbnNbJ3NpdGVfdmVyZXJpZmljYXRpb25fY29kZSddICkgKSB7CiB1cGRhdGVfb3B0aW9uKCAnZ2dsc3RtcHByX29wdGlvbnMnLCAkZ2dsc3RtcHByX29wdGlvbnMgKTsgcHJpbnRmKCAnPGRpdj4lczwvZGl2PicsIF9fKCAnVmVyaWZpY2F0aW9uIGNvZGUgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJlY2VpdmVkIGFuZCBhZGRlZCB0byB0aGUgc2l0ZS4nLCAnc2l0ZW1hcF9wcm8nICkgKTsKfSBlbHNlIHsgcHJpbnRmKCAnPGRpdj4lczwvZGl2PicsIF9fKCAnVmVyaWZpY2F0aW9uIGNvZGUgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJlY2VpdmVkIGJ1dCBoYXMgbm90IGJlZW4gYWRkZWQgdG8gdGhlIHNpdGUuJywgJ3NpdGVtYXBfcHJvJyApICk7Cn0gfSBjYXRjaCAoIEdvb2dsZV9TZXJ2aWNlX0V4Y2VwdGlvbiAkZSApIHsgJGdnbHN0bXBwcl9zdl9lcnJvciA9ICRlLT5nZXRFcnJvcnMoKTsgaWYgKCBpc3NldCggJGdnbHN0bXBwcl9zdl9lcnJvclswXVsnbWVzc2FnZSddICkgKSB7CiBwcmludGYoICc8ZGl2PiVzPC9kaXY+JywgJGdnbHN0bXBwcl9zdl9lcnJvclswXVsnbWVzc2FnZSddICk7IH0gZWxzZSB7IHByaW50ZiggJzxkaXY+JXM8L2Rpdj4nLCBfXyggJ0FuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGVuIHJlY2VpdmluZyB0aGUgdmVyaWZpY2F0aW9uIGNvZGUgc2l0ZSBpbiB0aGUgR29vZ2xlIFdlYm1hc3Rlci4nLCAnc2l0ZW1hcF9wcm8nICkgKTsKfSBwcmludGYoICc8ZGl2PiVzIC0gPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9IiVzIj4lczwvYT48L2Rpdj4nLCBfXyggIlRoZSBzaXRlIGNvdWxkbid0IGJlIHZlcmlmaWVkLiBQbGVhc2UsIHZlcmlmeSB0aGUgc2l0ZSBtYW51YWxseSIsICdzaXRlbWFwX3BybycgKSwgJGdnbHN0bXBwcl9pbnN0cnVjdGlvbl91cmwsIF9fKCAnVmlldyB0aGUgSW5zdHJ1Y3Rpb24nLCAnc2l0ZW1hcF9wcm8nICkgKTsKZWNobyAnPC9kaXY+PCEtLSAuZ2dsc3RtcHByX3dtdF9jb250ZW50IC0tPic7IHJldHVybjsgfSB0cnkgeyAkZ2dsc3RtcHByX3dtdF9yZXNvdXJjZV9zaXRlID0gbmV3IEdvb2dsZV9TZXJ2aWNlX1NpdGVWZXJpZmljYXRpb25fU2l0ZVZlcmlmaWNhdGlvbldlYlJlc291cmNlUmVzb3VyY2VTaXRlOwokZ2dsc3RtcHByX3dtdF9yZXNvdXJjZV9zaXRlLT5zZXRJZGVudGlmaWVyKCAkdXJsX2hvbWUgKTsgJGdnbHN0bXBwcl93bXRfcmVzb3VyY2Vfc2l0ZS0+c2V0VHlwZSggJGdnbHN0bXBwcl9zdl90eXBlICk7CiRnZ2xzdG1wcHJfd210X3Jlc291cmNlID0gbmV3IEdvb2dsZV9TZXJ2aWNlX1NpdGVWZXJpZmljYXRpb25fU2l0ZVZlcmlmaWNhdGlvbldlYlJlc291cmNlUmVzb3VyY2U7ICRnZ2xzdG1wcHJfd210X3Jlc291cmNlLT5zZXRTaXRlKCAkZ2dsc3RtcHByX3dtdF9yZXNvdXJjZV9zaXRlICk7CiRnZ2xzdG1wcHJfc3YtPndlYlJlc291cmNlLT5pbnNlcnQoICRnZ2xzdG1wcHJfc3ZfbWV0aG9kLCAkZ2dsc3RtcHByX3dtdF9yZXNvdXJjZSApOyBwcmludGYoICc8ZGl2PiVzPC9kaXY+JywgX18oICdUaGUgc2l0ZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdmVyaWZpZWQgaW4gdGhlIEdvb2dsZSBXZWJtYXN0ZXIgVG9vbHMuJywgJ3NpdGVtYXBfcHJvJyApICk7Cn0gY2F0Y2ggKCBHb29nbGVfU2VydmljZV9FeGNlcHRpb24gJGUgKSB7ICRnZ2xzdG1wcHJfc3ZfZXJyb3IgPSAkZS0+Z2V0RXJyb3JzKCk7IGlmICggaXNzZXQoICRnZ2xzdG1wcHJfc3ZfZXJyb3JbMF1bJ21lc3NhZ2UnXSApICkgewogcHJpbnRmKCAnPGRpdj4lczwvZGl2PicsICRnZ2xzdG1wcHJfc3ZfZXJyb3JbMF1bJ21lc3NhZ2UnXSApOyB9IGVsc2UgeyBwcmludGYoICc8ZGl2PiVzPC9kaXY+JywgX18oICdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkIHdoZW4gdmVyaWZ5aW5nIHNpdGUgaW4gdGhlIEdvb2dsZSBXZWJtYXN0ZXIgVG9vbHMuJywgJ3NpdGVtYXBfcHJvJyApICk7Cn0gcHJpbnRmKCAnPGRpdj4lcyAtIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSIlcyI+JXM8L2E+PC9kaXY+JywgX18oICJUaGUgc2l0ZSBjb3VsZG4ndCBiZSB2ZXJpZmllZC4gUGxlYXNlLCB2ZXJpZnkgdGhlIHNpdGUgbWFudWFsbHkiLCAnc2l0ZW1hcF9wcm8nICksICRnZ2xzdG1wcHJfaW5zdHJ1Y3Rpb25fdXJsLCBfXyggJ1ZpZXcgdGhlIEluc3RydWN0aW9uJywgJ3NpdGVtYXBfcHJvJyApICk7CmVjaG8gJzwvZGl2PjwhLS0gLmdnbHN0bXBwcl93bXRfY29udGVudCAtLT4nOyByZXR1cm47IH0gaWYgKCBpc3NldCggJGdnbHN0bXBwcl9vcHRpb25zWydzaXRlbWFwJ11bJ2xvYyddICkgKSB7CiAkdXJsX3NpdGVtYXAgPSAkZ2dsc3RtcHByX29wdGlvbnNbJ3NpdGVtYXAnXVsnbG9jJ107ICRnZ2xzdG1wcHJfY2hlY2tfc2l0ZW1hcCA9IGdnbHN0bXBwcl9jaGVja19zaXRlbWFwKCAkdXJsX3NpdGVtYXAgKTsKaWYgKCAkZ2dsc3RtcHByX2NoZWNrX3NpdGVtYXBbJ2NvZGUnXSA9PSAyMDAgKSB7IHRyeSB7ICRnZ2xzdG1wcHJfd210LT5zaXRlbWFwcy0+c3VibWl0KCAkdXJsX2hvbWUsICR1cmxfc2l0ZW1hcCApOwpwcmludGYoICc8ZGl2PiVzPC9kaXY+JywgX18oICdUaGUgc2l0ZW1hcCBmaWxlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBhZGRlZCB0byB0aGUgR29vZ2xlIFdlYm1hc3RlciBUb29scy4nLCAnc2l0ZW1hcF9wcm8nICkgKTsKfSBjYXRjaCAoIEdvb2dsZV9TZXJ2aWNlX0V4Y2VwdGlvbiAkZSApIHsgJGdnbHN0bXBwcl93bXRfZXJyb3IgPSAkZS0+Z2V0RXJyb3JzKCk7IGlmICggaXNzZXQoICRnZ2xzdG1wcHJfd210X2Vycm9yWzBdWydtZXNzYWdlJ10gKSApIHsKIHByaW50ZiggJzxkaXY+JXM8L2Rpdj4nLCAkZ2dsc3RtcHByX3dtdF9lcnJvclswXVsnbWVzc2FnZSddICk7IH0gZWxzZSB7IHByaW50ZiggJzxkaXY+JXM8L2Rpdj4nLCBfXyggJ1doZW4geW91IGFkZCBhIHNpdGVtYXAgZmlsZSBpbiB0aGUgR29vZ2xlIFdlYm1hc3RlciBUb29scyB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkLicsICdzaXRlbWFwX3BybycgKSApOwp9IHByaW50ZiggJzxkaXY+JXMgLSA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iJXMiPiVzPC9hPjwvZGl2PicsIF9fKCAiVGhlIHNpdGVtYXAgZmlsZSBjb3VsZG4ndCBiZSBhZGRlZC4gUGxlYXNlLCBhZGQgdGhlIHNpdGVtYXAgZmlsZSBtYW51YWxseSIsICdzaXRlbWFwX3BybycgKSwgJGdnbHN0bXBwcl9pbnN0cnVjdGlvbl91cmwsIF9fKCAnVmlldyB0aGUgSW5zdHJ1Y3Rpb24nLCAnc2l0ZW1hcF9wcm8nICkgKTsKfSB9IGVsc2UgeyBwcmludGYoICc8ZGl2PiVzPC9kaXY+Jywgc3ByaW50ZiggX18oICdFcnJvciA0MDQuIFRoZSBzaXRlbWFwIGZpbGUgJXMgbm90IGZvdW5kLicsICdzaXRlbWFwX3BybycgKSwgc3ByaW50ZiggJyg8YSBocmVmPSIlcyI+JXM8L2E+KScsICRnZ2xzdG1wcHJfb3B0aW9uc1snc2l0ZW1hcCddWydsb2MnXSwgJGdnbHN0bXBwcl9vcHRpb25zWydzaXRlbWFwJ11bJ2ZpbGUnXSApICkgKTsKfSB9IGVsc2UgeyBwcmludGYoICc8ZGl2PiVzPC9kaXY+JywgX18oICdUaGUgc2l0ZW1hcCBmaWxlIG5vdCBmb3VuZC4nLCAnc2l0ZW1hcF9wcm8nICkgKTsgfSBlY2hvICc8L2Rpdj48IS0tIC5nZ2xzdG1wcHJfd210X2NvbnRlbnQgLS0+JzsKfSB9IGlmICggISBmdW5jdGlvbl9leGlzdHMoICdnZ2xzdG1wcHJfYWRkX3ZlcmlmaWNhdGlvbl9jb2RlJyApICkgeyBmdW5jdGlvbiBnZ2xzdG1wcHJfYWRkX3ZlcmlmaWNhdGlvbl9jb2RlKCkgewogJGdnbHN0bXBwcl9vcHRpb25zID0gZ2V0X29wdGlvbiggJ2dnbHN0bXBwcl9vcHRpb25zJyApOyBpZiAoIGlzc2V0KCAkZ2dsc3RtcHByX29wdGlvbnNbJ3NpdGVfdmVyZXJpZmljYXRpb25fY29kZSddICkgKSB7CiBlY2hvIGh0bWxzcGVjaWFsY2hhcnNfZGVjb2RlKCAkZ2dsc3RtcHByX29wdGlvbnNbJ3NpdGVfdmVyZXJpZmljYXRpb25fY29kZSddICk7IH0gfSB9IGlmICggISBmdW5jdGlvbl9leGlzdHMoICdnZ2xzdG1wcHJfY2hlY2tfcG9zdF9zdGF0dXMnICkgKSB7CiBmdW5jdGlvbiBnZ2xzdG1wcHJfY2hlY2tfcG9zdF9zdGF0dXMoICRuZXdfc3RhdHVzLCAkb2xkX3N0YXR1cywgJHBvc3QgKSB7IGlmICggISB3cF9pc19wb3N0X3JldmlzaW9uKCAkcG9zdC0+SUQgKSApIHsKIGdsb2JhbCAkZ2dsc3RtcHByX3VwZGF0ZV9zaXRlbWFwOyBpZiAoICdwdWJsaXNoJyA9PSAkbmV3X3N0YXR1cyB8fCAndHJhc2gnID09ICRuZXdfc3RhdHVzIHx8ICdmdXR1cmUnID09ICRuZXdfc3RhdHVzICkgewogJGdnbHN0bXBwcl91cGRhdGVfc2l0ZW1hcCA9IHRydWU7IH0gZWxzZWlmICggKCAncHVibGlzaCcgPT0gJG9sZF9zdGF0dXMgfHwgJ2Z1dHVyZScgPT0gJG9sZF9zdGF0dXMgKSAmJgogKCAnYXV0by1kcmFmdCcgPT0gJG5ld19zdGF0dXMgfHwgJ2RyYWZ0JyA9PSAkbmV3X3N0YXR1cyB8fCAncHJpdmF0ZScgPT0gJG5ld19zdGF0dXMgfHwgJ3BlbmRpbmcnID09ICRuZXdfc3RhdHVzICkgKSB7CiAkZ2dsc3RtcHByX3VwZGF0ZV9zaXRlbWFwID0gdHJ1ZTsgfSB9IH0gfSBpZiAoICEgZnVuY3Rpb25fZXhpc3RzKCAnZ2dsc3RtcHByX3VwZGF0ZV9zaXRlbWFwJyApICkgewogZnVuY3Rpb24gZ2dsc3RtcHByX3VwZGF0ZV9zaXRlbWFwKCAkcG9zdF9pZCApIHsgaWYgKCAhIHdwX2lzX3Bvc3RfcmV2aXNpb24oICRwb3N0X2lkICkgKSB7IGdsb2JhbCAkZ2dsc3RtcHByX3VwZGF0ZV9zaXRlbWFwOwppZiAoIHRydWUgPT09ICRnZ2xzdG1wcHJfdXBkYXRlX3NpdGVtYXAgKSB7IGdnbHN0bXBwcl9yZWdpc3Rlcl9zZXR0aW5ncygpOyBnZ2xzdG1wcHJfc2l0ZW1hcGNyZWF0ZSgpOwp9IH0gfSB9IGlmICggISBmdW5jdGlvbl9leGlzdHMoICdnZ2xzdG1wcHJfYWN0aW9uX2xpbmtzJyApICkgeyBmdW5jdGlvbiBnZ2xzdG1wcHJfYWN0aW9uX2xpbmtzKCAkbGlua3MsICRmaWxlICkgewogc3RhdGljICR0aGlzX3BsdWdpbjsgaWYgKCAhICR0aGlzX3BsdWdpbiApICR0aGlzX3BsdWdpbiA9ICdnb29nbGUtc2l0ZW1hcC1wcm8vZ29vZ2xlLXNpdGVtYXAtcHJvLnBocCc7CmlmICggJGZpbGUgPT0gJHRoaXNfcGx1Z2luICkgeyAkc2V0dGluZ3NfbGluayA9ICc8YSBocmVmPSJhZG1pbi5waHA/cGFnZT1nb29nbGUtc2l0ZW1hcC1wcm8ucGhwIj4nIC4gX18oICdTZXR0aW5ncycsICdzaXRlbWFwX3BybycgKSAuICc8L2E+JzsKYXJyYXlfdW5zaGlmdCggJGxpbmtzLCAkc2V0dGluZ3NfbGluayApOyB9IHJldHVybiAkbGlua3M7IH0gfSBpZiAoICEgZnVuY3Rpb25fZXhpc3RzKCAnZ2dsc3RtcHByX2xpbmtzJyApICkgewogZnVuY3Rpb24gZ2dsc3RtcHByX2xpbmtzKCAkbGlua3MsICRmaWxlICkgeyBpZiAoICRmaWxlID09ICdnb29nbGUtc2l0ZW1hcC1wcm8vZ29vZ2xlLXNpdGVtYXAtcHJvLnBocCcgKSB7CiAkbGlua3NbXSA9ICc8YSBocmVmPSJhZG1pbi5waHA/cGFnZT1nb29nbGUtc2l0ZW1hcC1wcm8ucGhwIj4nIC4gX18oICdTZXR0aW5ncycsJ3NpdGVtYXBfcHJvJyApIC4gJzwvYT4nOwokbGlua3NbXSA9ICc8YSBocmVmPSJodHRwOi8vYmVzdHdlYnNvZnQuY29tL3Byb2R1Y3RzL2dvb2dsZS1zaXRlbWFwL2ZhcS8iIHRhcmdldD0iX2JsYW5rIj4nIC4gX18oICdGQVEnLCdzaXRlbWFwX3BybycgKSAuICc8L2E+JzsKJGxpbmtzW10gPSAnPGEgaHJlZj0iaHR0cDovL3N1cHBvcnQuYmVzdHdlYnNvZnQuY29tIj4nIC4gX18oICdTdXBwb3J0Jywnc2l0ZW1hcF9wcm8nICkgLiAnPC9hPic7IH0gcmV0dXJuICRsaW5rczsKfSB9IGlmICggISBmdW5jdGlvbl9leGlzdHMgKCAnZ2dsc3RtcHByX2FqYXhfZ2V0X3Bvc3RfdHlwZXMnICkgKSB7IGZ1bmN0aW9uIGdnbHN0bXBwcl9hamF4X2dldF9wb3N0X3R5cGVzKCkgewogY2hlY2tfYWpheF9yZWZlcmVyKCAnZ2dsc3RtcHByX2FqYXhfbm9uY2UnLCAnZ2dsc3RtcHByX25vbmNlJyApOyAkZ2dsc3RtcHByX29wdGlvbnMgPSBnZXRfb3B0aW9uKCAnZ2dsc3RtcHByX29wdGlvbnMnICk7CiRwb3N0X3R5cGVzID0gZ2V0X3Bvc3RfdHlwZXMoICcnLCAnb2JqZWN0cycgKTsgdW5zZXQoICRwb3N0X3R5cGVzWydyZXZpc2lvbiddICk7IHVuc2V0KCAkcG9zdF90eXBlc1snYXR0YWNobWVudCddICk7CnVuc2V0KCAkcG9zdF90eXBlc1snbmF2X21lbnVfaXRlbSddICk7ICRwb3N0X3R5cGVzX2FycmF5ID0gYXJyYXkoKTsgZm9yZWFjaCAoICRwb3N0X3R5cGVzIGFzICRrZXkgPT4gJHZhbHVlICkgewogJHBvc3RzX25hbWVbJ3RpdGxlJ10gPSAkdmFsdWUtPmxhYmVscy0+bmFtZTsgJHBvc3RzX25hbWVbJ2lzRm9sZGVyJ10gPSB0cnVlOyAkcG9zdHNfbmFtZVsnaXNMYXp5J10gPSB0cnVlOwppZiAoICEgaXNzZXQoICRnZ2xzdG1wcHJfb3B0aW9uc1snZXhjZXB0aW9uJ11bJ3Bvc3RfdHlwZSddWyAka2V5IF0gKSApICRwb3N0c19uYW1lWydzZWxlY3QnXSA9IHRydWU7CmVsc2UgJHBvc3RzX25hbWVbJ3NlbGVjdCddID0gZmFsc2U7IGlmICggaXNzZXQoICRnZ2xzdG1wcHJfb3B0aW9uc1snaGFzX3N1Yl9leGNlcHRpb24nXVsncG9zdF90eXBlJ11bICRrZXkgXSApICkKICRwb3N0c19uYW1lWydoYXNTdWJTZWwnXSA9IHRydWU7IGVsc2UgJHBvc3RzX25hbWVbJ2hhc1N1YlNlbCddID0gZmFsc2U7ICRwb3N0c19uYW1lWyd1bnNlbGVjdGFibGUnXSA9IGZhbHNlOwokcG9zdHNfbmFtZVsnbm9MaW5rJ10gPSB0cnVlOyAkcG9zdHNfbmFtZVsncG9zdF90eXBlJ10gPSAka2V5OyAkcG9zdHNfbmFtZVsnYWRkQ2xhc3MnXSA9ICRrZXk7ICRwb3N0X3R5cGVzX2FycmF5W10gPSAkcG9zdHNfbmFtZTsKfSBlY2hvIGpzb25fZW5jb2RlKCAkcG9zdF90eXBlc19hcnJheSApOyBkaWUoKTsgfSB9IGlmICggISBmdW5jdGlvbl9leGlzdHMgKCAnZ2dsc3RtcHByX2FqYXhfZ2V0X2NhdGVnb3JpZXMnICkgKSB7CiBmdW5jdGlvbiBnZ2xzdG1wcHJfYWpheF9nZXRfY2F0ZWdvcmllcygpIHsgY2hlY2tfYWpheF9yZWZlcmVyKCAnZ2dsc3RtcHByX2FqYXhfbm9uY2UnLCAnZ2dsc3RtcHByX25vbmNlJyApOwokZ2dsc3RtcHByX29wdGlvbnMgPSBnZXRfb3B0aW9uKCAnZ2dsc3RtcHByX29wdGlvbnMnICk7ICRhcmdzID0gYXJyYXkoICdvcmRlcmJ5JyA9PiAnbmFtZScsICdvcmRlcicgPT4gJ0FTQycsCiAnc2hvd19jb3VudCcgPT4gMSwgJ2hpZGVfZW1wdHknID0+IDEsICdlY2hvJyA9PiAwICk7ICRjYXRlZ29yaWVzID0gZ2V0X2NhdGVnb3JpZXMoICRhcmdzICk7ICRjYXRlZ29yaWVzX2FycmF5ID0gYXJyYXkoKTsKZm9yZWFjaCAoICRjYXRlZ29yaWVzIGFzICRrZXkgPT4gJHZhbHVlICkgeyAkY2F0ZWdvcmllc19uYW1lWyd0aXRsZSddID0gJHZhbHVlLT5uYW1lOyAkY2F0ZWdvcmllc19uYW1lWydpc0ZvbGRlciddID0gdHJ1ZTsKJGNhdGVnb3JpZXNfbmFtZVsnaXNMYXp5J10gPSB0cnVlOyAkY2F0ZWdvcmllc19uYW1lWydub0xpbmsnXSA9IHRydWU7ICRjYXRlZ29yaWVzX25hbWVbJ3Bvc3RfdHlwZSddID0gJ3Bvc3QnOwokY2F0ZWdvcmllc19uYW1lWydjYXRlZ29yeV9pZCddID0gJHZhbHVlLT5jYXRfSUQ7IGlmICggaXNzZXQoICRnZ2xzdG1wcHJfb3B0aW9uc1snZXhjZXB0aW9uJ11bJ2NhdGVnb3JpZXMnXVsgJHZhbHVlLT5jYXRfSUQgXSApICkKICRjYXRlZ29yaWVzX25hbWVbJ3NlbGVjdCddID0gZmFsc2U7IGVsc2VpZiAoIGlzc2V0KCAkZ2dsc3RtcHByX29wdGlvbnNbJ2V4Y2VwdGlvbiddWydwb3N0X3R5cGUnXVsncG9zdCddICkgKQogJGNhdGVnb3JpZXNfbmFtZVsnc2VsZWN0J10gPSBmYWxzZTsgZWxzZSAkY2F0ZWdvcmllc19uYW1lWydzZWxlY3QnXSA9IHRydWU7IGlmICggaXNzZXQoICRnZ2xzdG1wcHJfb3B0aW9uc1snaGFzX3N1Yl9leGNlcHRpb24nXVsnY2F0ZWdvcmllcyddWyAkdmFsdWUtPmNhdF9JRCBdICkgKQogJGNhdGVnb3JpZXNfbmFtZVsnaGFzU3ViU2VsJ10gPSB0cnVlOyBlbHNlICRjYXRlZ29yaWVzX25hbWVbJ2hhc1N1YlNlbCddID0gZmFsc2U7ICRjYXRlZ29yaWVzX2FycmF5W10gPSAkY2F0ZWdvcmllc19uYW1lOwp9IGVjaG8ganNvbl9lbmNvZGUoICRjYXRlZ29yaWVzX2FycmF5ICk7IGRpZSgpOyB9IH0gaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyAoICdnZ2xzdG1wcHJfYWpheF9nZXRfZWxlbWVudHMnICkgKSB7CiBmdW5jdGlvbiBnZ2xzdG1wcHJfYWpheF9nZXRfZWxlbWVudHMoKSB7IGNoZWNrX2FqYXhfcmVmZXJlciggJ2dnbHN0bXBwcl9hamF4X25vbmNlJywgJ2dnbHN0bXBwcl9ub25jZScgKTsKJGdnbHN0bXBwcl9vcHRpb25zID0gZ2V0X29wdGlvbiggJ2dnbHN0bXBwcl9vcHRpb25zJyApOyBpZiAoIGlzc2V0KCAkX1JFUVVFU1RbJ3Bvc3RfdHlwZSddICkgKSB7ICRwb3N0c19hcnJheSA9IGFycmF5KCk7CmlmICggaXNzZXQoICRfUkVRVUVTVFsnY2F0ZWdvcnlfaWQnXSApICkgeyAkYXJncyA9IGFycmF5KCAncG9zdF90eXBlJyA9PiAkX1JFUVVFU1RbJ3Bvc3RfdHlwZSddLCAncG9zdHNfcGVyX3BhZ2UnID0+IC0xLAogJ2NhdGVnb3J5JyA9PiAkX1JFUVVFU1RbJ2NhdGVnb3J5X2lkJ10gKTsgfSBlbHNlIHsgJGFyZ3MgPSBhcnJheSggJ3Bvc3RfdHlwZScgPT4gJF9SRVFVRVNUWydwb3N0X3R5cGUnXSwKICdwb3N0c19wZXJfcGFnZScgPT4gLTEgKTsgfSAkYWxsX3Bvc3RzID0gZ2V0X3Bvc3RzKCAkYXJncyApOyBmb3JlYWNoICggJGFsbF9wb3N0cyBhcyAkcG9zdCApIHsgaWYgKCAkcG9zdC0+cG9zdF90aXRsZSApCiBzZXR1cF9wb3N0ZGF0YSggJHBvc3QgKTsgJHBvc3RfaW5mb1sndGl0bGUnXSA9ICRwb3N0LT5wb3N0X3RpdGxlIC4gJzxzcGFuIGNsYXNzPSJnZ2xzdG1wcHJfZWxlbWVudF91cmwnOwppZiAoIGlzc2V0KCAkX1JFUVVFU1RbJ2dnbHN0bXBwcl91cmxfc2V0dGluZyddICkgJiYgJ2ZhbHNlJyA9PSAkX1JFUVVFU1RbJ2dnbHN0bXBwcl91cmxfc2V0dGluZyddICkKICRwb3N0X2luZm9bJ3RpdGxlJ10gLj0gJyBoaWRkZW4nOyAkcG9zdF9pbmZvWyd0aXRsZSddIC49ICciPi0gPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9IicgLiBnZXRfcGVybWFsaW5rKCAkcG9zdC0+SUQgKSAuICciPicgLiBnZXRfcGVybWFsaW5rKCAkcG9zdC0+SUQgKSAuICc8L2E+PC9zcGFuPic7CiRwb3N0X2luZm9bJ25vTGluayddID0gdHJ1ZTsgJHBvc3RfaW5mb1sncG9zdF9pZCddID0gJHBvc3QtPklEOyAkcG9zdF9pbmZvWydwb3N0X3R5cGUnXSA9ICRfUkVRVUVTVFsncG9zdF90eXBlJ107CmlmICggaXNzZXQoICRnZ2xzdG1wcHJfb3B0aW9uc1snZXhjZXB0aW9uJ11bJ3Bvc3RfaWQnXVsgJHBvc3QtPklEIF0gKSApICRwb3N0X2luZm9bJ3NlbGVjdCddID0gZmFsc2U7CmVsc2VpZiAoIGlzc2V0KCAkZ2dsc3RtcHByX29wdGlvbnNbJ2V4Y2VwdGlvbiddWydwb3N0X3R5cGUnXVsgJF9SRVFVRVNUWydwb3N0X3R5cGUnXSBdICkgKSAkcG9zdF9pbmZvWydzZWxlY3QnXSA9IGZhbHNlOwplbHNlaWYgKCBpc3NldCggJF9SRVFVRVNUWydjYXRlZ29yeV9pZCddICkgJiYgaXNzZXQoICRnZ2xzdG1wcHJfb3B0aW9uc1snZXhjZXB0aW9uJ11bJ2NhdGVnb3JpZXMnXVsgJF9SRVFVRVNUWydjYXRlZ29yeV9pZCddIF0gKSApCiAkcG9zdF9pbmZvWydzZWxlY3QnXSA9IGZhbHNlOyBlbHNlICRwb3N0X2luZm9bJ3NlbGVjdCddID0gdHJ1ZTsgJHBvc3RzX2FycmF5W10gPSAkcG9zdF9pbmZvOyB9IHdwX3Jlc2V0X3Bvc3RkYXRhKCk7CmVjaG8ganNvbl9lbmNvZGUoICRwb3N0c19hcnJheSApOyB9IGRpZSgpOyB9IH0gaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyAoICdnZ2xzdG1wcHJfYWpheF9leGNlcHRpb25fZWxlbWVudCcgKSApIHsKIGZ1bmN0aW9uIGdnbHN0bXBwcl9hamF4X2V4Y2VwdGlvbl9lbGVtZW50KCkgeyBjaGVja19hamF4X3JlZmVyZXIoICdnZ2xzdG1wcHJfYWpheF9ub25jZScsICdnZ2xzdG1wcHJfbm9uY2UnICk7CiRnZ2xzdG1wcHJfb3B0aW9ucyA9IGdldF9vcHRpb24oICdnZ2xzdG1wcHJfb3B0aW9ucycgKTsgJGdnbHN0bXBwcl9vcHRpb25zWydleGNlcHRpb24nXSA9IGFycmF5KCAncG9zdF90eXBlJyA9PiBhcnJheSgpLAogJ2NhdGVnb3JpZXMnID0+IGFycmF5KCksICdwb3N0X2lkJyA9PiBhcnJheSgpICk7ICRnZ2xzdG1wcHJfb3B0aW9uc1snaGFzX3N1Yl9leGNlcHRpb24nXSA9IGFycmF5KAogJ3Bvc3RfdHlwZScgPT4gYXJyYXkoKSwgJ2NhdGVnb3JpZXMnID0+IGFycmF5KCkgKTsgaWYgKCBpc3NldCggJF9SRVFVRVNUWydnZ2xzdG1wcHJfZGVzZWxlY3RlZF9hcnJheSddICkgKSB7CiBmb3JlYWNoICggJF9SRVFVRVNUWydnZ2xzdG1wcHJfZGVzZWxlY3RlZF9hcnJheSddIGFzICRrZXkgPT4gJHZhbHVlICkgeyBpZiAoIGlzc2V0KCAkdmFsdWVbJ2NhdGVnb3J5X2lkJ10gKSAmJiAhIGVtcHR5KCAkdmFsdWVbJ2NhdGVnb3J5X2lkJ10gKSApIHsKICRnZ2xzdG1wcHJfb3B0aW9uc1snZXhjZXB0aW9uJ11bJ2NhdGVnb3JpZXMnXVsgJHZhbHVlWydjYXRlZ29yeV9pZCddIF0gPSAkdmFsdWVbJ2NhdGVnb3J5X2lkJ107ICRnZ2xzdG1wcHJfb3B0aW9uc1snaGFzX3N1Yl9leGNlcHRpb24nXVsncG9zdF90eXBlJ11bICR2YWx1ZVsncG9zdF90eXBlJ10gXSA9ICR2YWx1ZVsncG9zdF90eXBlJ107Cn0gZWxzZSBpZiAoIGlzc2V0KCAkdmFsdWVbJ3Bvc3RfaWQnXSApICYmICEgZW1wdHkoICR2YWx1ZVsncG9zdF9pZCddICkgKSB7ICRnZ2xzdG1wcHJfb3B0aW9uc1snZXhjZXB0aW9uJ11bJ3Bvc3RfaWQnXVsgJHZhbHVlWydwb3N0X2lkJ10gXSA9ICR2YWx1ZVsncG9zdF9pZCddOwokZ2dsc3RtcHByX29wdGlvbnNbJ2hhc19zdWJfZXhjZXB0aW9uJ11bJ3Bvc3RfdHlwZSddWyAkdmFsdWVbJ3Bvc3RfdHlwZSddIF0gPSAkdmFsdWVbJ3Bvc3RfdHlwZSddOyAkcG9zdF9jYXRlZ29yaWVzID0gd3BfZ2V0X3Bvc3RfY2F0ZWdvcmllcyggJHZhbHVlWydwb3N0X2lkJ10gKTsKaWYgKCBpc3NldCggJHBvc3RfY2F0ZWdvcmllcyApICYmIGlzX2FycmF5KCAkcG9zdF9jYXRlZ29yaWVzICkgJiYgIWVtcHR5KCAkcG9zdF9jYXRlZ29yaWVzICkgKSB7IGZvcmVhY2ggKCAkcG9zdF9jYXRlZ29yaWVzIGFzICRrZXlfY2F0ID0+ICR2YWx1ZV9jYXQgKSB7CiAkZ2dsc3RtcHByX29wdGlvbnNbJ2hhc19zdWJfZXhjZXB0aW9uJ11bJ2NhdGVnb3JpZXMnXVsgJHZhbHVlX2NhdCBdID0gJHZhbHVlX2NhdDsgfSB9IH0gZWxzZSBpZiAoIGlzc2V0KCAkdmFsdWVbJ3Bvc3RfdHlwZSddICkgJiYgISBlbXB0eSggJHZhbHVlWydwb3N0X3R5cGUnXSApICkgewogJGdnbHN0bXBwcl9vcHRpb25zWydleGNlcHRpb24nXVsncG9zdF90eXBlJ11bICR2YWx1ZVsncG9zdF90eXBlJ10gXSA9ICR2YWx1ZVsncG9zdF90eXBlJ107IH0gfSB9ICRnZ2xzdG1wcHJfb3B0aW9uc1snanN0cmVlX3VybCddID0gKCBpc3NldCggJF9SRVFVRVNUWydnZ2xzdG1wcHJfdXJsX3NldHRpbmcnXSApICYmICdmYWxzZScgIT0gJF9SRVFVRVNUWydnZ2xzdG1wcHJfdXJsX3NldHRpbmcnXSApID8gMSA6IDA7CnVwZGF0ZV9vcHRpb24oICdnZ2xzdG1wcHJfb3B0aW9ucycsICRnZ2xzdG1wcHJfb3B0aW9ucyApOyBnZ2xzdG1wcHJfc2l0ZW1hcGNyZWF0ZSgpOyBkaWUoKTsgfSB9IGlmICggISBmdW5jdGlvbl9leGlzdHMoICdnZ2xzdG1wcHJfZGVsZXRlX3NldHRpbmdzJyApICkgewogZnVuY3Rpb24gZ2dsc3RtcHByX2RlbGV0ZV9zZXR0aW5ncygpIHsgZGVsZXRlX29wdGlvbiggJ2dnbHN0bXBwcl9vcHRpb25zJyApOyBkZWxldGVfc2l0ZV9vcHRpb24oICdnZ2xzdG1wcHJfb3B0aW9ucycgKTsKZGVsZXRlX29wdGlvbiggJ2dnbHN0bXBwcl9yb2JvdHMnICk7IH0gfSBpZiAoICEgZnVuY3Rpb25fZXhpc3RzKCAnZ2dsc3RtcHByX3VwZGF0ZV9hY3RpdmF0ZScgKSApIHsKIGZ1bmN0aW9uIGdnbHN0bXBwcl91cGRhdGVfYWN0aXZhdGUoKSB7IGdsb2JhbCAkYmVzdHdlYnNvZnRfd3BfdXBkYXRlX3BsdWdpbnMsICRic3R3YnNmdHdwcGR0cGxnbnNfb3B0aW9uczsKZGVhY3RpdmF0ZV9wbHVnaW5zKCAnZ29vZ2xlLXNpdGVtYXAtcGx1Z2luL2dvb2dsZS1zaXRlbWFwLXBsdWdpbi5waHAnICk7IGlmICggIWZ1bmN0aW9uX2V4aXN0cyAoICdiZXN0d2Vic29mdF93cF91cGRhdGVfcGx1Z2lucycgKSAmJiAhICRiZXN0d2Vic29mdF93cF91cGRhdGVfcGx1Z2lucyApIHsKICRiZXN0d2Vic29mdF93cF91cGRhdGVfcGx1Z2lucyA9IHRydWU7IHJlcXVpcmVfb25jZSggZGlybmFtZSggX19GSUxFX18gKSAuICcvYndzX3VwZGF0ZS5waHAnICk7IH0gaWYgKCAkYnN0d2JzZnR3cHBkdHBsZ25zX29wdGlvbnMgJiYgIWZpbGVfZXhpc3RzKCBkaXJuYW1lKCBfX0ZJTEVfXyApIC4gJy9saWNlbnNlX2tleS50eHQnICkgKSB7CiBpZiAoIGlzc2V0KCAkYnN0d2JzZnR3cHBkdHBsZ25zX29wdGlvbnNbJ2dvb2dsZS1zaXRlbWFwLXByby9nb29nbGUtc2l0ZW1hcC1wcm8ucGhwJ10gKSApIHsgJGJ3c19saWNlbnNlX2tleSA9ICRic3R3YnNmdHdwcGR0cGxnbnNfb3B0aW9uc1snZ29vZ2xlLXNpdGVtYXAtcHJvL2dvb2dsZS1zaXRlbWFwLXByby5waHAnXTsKJGZpbGUgPSBAZm9wZW4oIGRpcm5hbWUoIF9fRklMRV9fICkgLiAiL2xpY2Vuc2Vfa2V5LnR4dCIgLCAidysiICk7IGlmICggJGZpbGUgKSB7IEBmd3JpdGUoICRmaWxlLCAkYndzX2xpY2Vuc2Vfa2V5ICk7CkBmY2xvc2UoICRmaWxlICk7IH0gfSB9IH0gfSBpZiAoICEgZnVuY3Rpb25fZXhpc3RzKCAnZ2dsc3RtcHByX2xpY2Vuc2VfY3Jvbl90YXNrJyApICkgeyBmdW5jdGlvbiBnZ2xzdG1wcHJfbGljZW5zZV9jcm9uX3Rhc2soKSB7CiBpZiAoICEgZnVuY3Rpb25fZXhpc3RzICggJ2Jlc3R3ZWJzb2Z0X2xpY2Vuc2VfY3Jvbl90YXNrJyApICkgcmVxdWlyZV9vbmNlKCBkaXJuYW1lKCBfX0ZJTEVfXyApIC4gJy9id3NfdXBkYXRlLnBocCcgKTsKYmVzdHdlYnNvZnRfbGljZW5zZV9jcm9uX3Rhc2soICdnb29nbGUtc2l0ZW1hcC1wcm8vZ29vZ2xlLXNpdGVtYXAtcHJvLnBocCcsICdnb29nbGUtc2l0ZW1hcC1wbHVnaW4vZ29vZ2xlLXNpdGVtYXAtcGx1Z2luLnBocCcgKTsKfSB9IGlmICggISBmdW5jdGlvbl9leGlzdHMgKCAnZ2dsc3RtcHByX3BsdWdpbl91cGRhdGVfcm93JyApICkgeyBmdW5jdGlvbiBnZ2xzdG1wcHJfcGx1Z2luX3VwZGF0ZV9yb3coICRmaWxlLCAkcGx1Z2luX2RhdGEgKSB7CiBid3NfcGx1Z2luX3VwZGF0ZV9yb3coICdnb29nbGUtc2l0ZW1hcC1wcm8vZ29vZ2xlLXNpdGVtYXAtcHJvLnBocCcgKTsgfSB9IGlmICggISBmdW5jdGlvbl9leGlzdHMgKCAnZ2dsc3RtcHByX3BsdWdpbl9iYW5uZXInICkgKSB7CiBmdW5jdGlvbiBnZ2xzdG1wcHJfcGx1Z2luX2Jhbm5lcigpIHsgZ2xvYmFsICRob29rX3N1ZmZpeCwgJGdnbHN0bXBwcl9wbHVnaW5faW5mbzsgaWYgKCAkaG9va19zdWZmaXggPT0gJ3BsdWdpbnMucGhwJyApIHsKIGJ3c19wbHVnaW5fYmFubmVyX3RpbWVvdXQoICdnb29nbGUtc2l0ZW1hcC1wcm8vZ29vZ2xlLXNpdGVtYXAtcHJvLnBocCcsICdnZ2xzdG1wcHInLCAkZ2dsc3RtcHByX3BsdWdpbl9pbmZvWydOYW1lJ10sICcvL3BzLncub3JnL2dvb2dsZS1zaXRlbWFwLXBsdWdpbi9hc3NldHMvaWNvbi0xMjh4MTI4LnBuZycgKTsKfSB9IH0gaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyggJ2dnbHN0bXBwcl9pbmplY3RfaW5mbycgKSApIHsgZnVuY3Rpb24gZ2dsc3RtcHByX2luamVjdF9pbmZvKCAkcmVzdWx0LCAkYWN0aW9uID0gbnVsbCwgJGFyZ3MgPSBudWxsICkgewogaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyggJ2Jlc3R3ZWJzb2Z0X2luamVjdF9pbmZvJyApICkgcmVxdWlyZV9vbmNlKCBkaXJuYW1lKCBfX0ZJTEVfXyApIC4gJy9id3NfdXBkYXRlLnBocCcgKTsKcmV0dXJuIGJlc3R3ZWJzb2Z0X2luamVjdF9pbmZvKCAkcmVzdWx0LCAkYWN0aW9uLCAkYXJncywgJ2dvb2dsZS1zaXRlbWFwLXBybycgKTsgfSB9IGFkZF9hY3Rpb24oICdhZG1pbl9tZW51JywgJ2dnbHN0bXBwcl9hZG1pbl9tZW51JyApOwppZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ2lzX211bHRpc2l0ZScgKSAmJiBpc19tdWx0aXNpdGUoKSApIGFkZF9hY3Rpb24oICduZXR3b3JrX2FkbWluX21lbnUnLCAnZ2dsc3RtcHByX2FkbWluX21lbnUnICk7CmFkZF9hY3Rpb24oICdpbml0JywgJ2dnbHN0bXBwcl9pbml0JyApOyBhZGRfYWN0aW9uKCAnYWRtaW5faW5pdCcsICdnZ2xzdG1wcHJfYWRtaW5faW5pdCcgKTsgYWRkX2FjdGlvbiggJ2FkbWluX2VucXVldWVfc2NyaXB0cycsICdnZ2xzdG1wcHJfYWRkX3BsdWdpbl9zdHlsZXNoZWV0JyApOwphZGRfYWN0aW9uKCAndHJhbnNpdGlvbl9wb3N0X3N0YXR1cycsICdnZ2xzdG1wcHJfY2hlY2tfcG9zdF9zdGF0dXMnLCAxMCwgMyApOyBhZGRfYWN0aW9uKCAnc2F2ZV9wb3N0JywgJ2dnbHN0bXBwcl91cGRhdGVfc2l0ZW1hcCcgKTsKYWRkX2FjdGlvbiggJ3RyYXNoZWRfcG9zdCAnLCAnZ2dsc3RtcHByX3VwZGF0ZV9zaXRlbWFwJyApOyBpZiAoIDEgPT0gZ2V0X29wdGlvbiggJ2dnbHN0bXBwcl9yb2JvdHMnICkgKQogYWRkX2ZpbHRlciggJ3JvYm90c190eHQnLCAnZ2dsc3RtcHByX3JvYm90c19hZGRfc2l0ZW1hcCcsIDEwLCAyICk7IGFkZF9hY3Rpb24oICd3cF9oZWFkJywgJ2dnbHN0bXBwcl9hZGRfdmVyaWZpY2F0aW9uX2NvZGUnICk7CmFkZF9maWx0ZXIoICdwbHVnaW5fYWN0aW9uX2xpbmtzJywgJ2dnbHN0bXBwcl9hY3Rpb25fbGlua3MnLCAxMCwgMiApOyBhZGRfZmlsdGVyKCAncGx1Z2luX3Jvd19tZXRhJywgJ2dnbHN0bXBwcl9saW5rcycsIDEwLCAyICk7CmFkZF9hY3Rpb24oICd3cF9hamF4X2dnbHN0bXBwcl9nZXRfcG9zdF90eXBlcycsICdnZ2xzdG1wcHJfYWpheF9nZXRfcG9zdF90eXBlcycgKTsgYWRkX2FjdGlvbiggJ3dwX2FqYXhfZ2dsc3RtcHByX2dldF9jYXRlZ29yaWVzJywgJ2dnbHN0bXBwcl9hamF4X2dldF9jYXRlZ29yaWVzJyApOwphZGRfYWN0aW9uKCAnd3BfYWpheF9nZ2xzdG1wcHJfZ2V0X2VsZW1lbnRzJywgJ2dnbHN0bXBwcl9hamF4X2dldF9lbGVtZW50cycgKTsgYWRkX2FjdGlvbiggJ3dwX2FqYXhfZ2dsc3RtcHByX2V4Y2VwdGlvbl9lbGVtZW50JywgJ2dnbHN0bXBwcl9hamF4X2V4Y2VwdGlvbl9lbGVtZW50JyApOwphZGRfYWN0aW9uKCAnZ29vZ2xlX3NpdGVtYXBfcHJvX2xpY2Vuc2VfY3JvbicsICdnZ2xzdG1wcHJfbGljZW5zZV9jcm9uX3Rhc2snICk7IGFkZF9hY3Rpb24oICJhZnRlcl9wbHVnaW5fcm93X2dvb2dsZS1zaXRlbWFwLXByby9nb29nbGUtc2l0ZW1hcC1wcm8ucGhwIiwgJ2dnbHN0bXBwcl9wbHVnaW5fdXBkYXRlX3JvdycsIDEwLCAyICk7CmFkZF9hY3Rpb24oICdhZG1pbl9ub3RpY2VzJywgJ2dnbHN0bXBwcl9wbHVnaW5fYmFubmVyJyApOyBhZGRfZmlsdGVyKCAncGx1Z2luc19hcGknLCAnZ2dsc3RtcHByX2luamVjdF9pbmZvJywgMjAsIDMgKTsKIHJlZ2lzdGVyX3VuaW5zdGFsbF9ob29rKCAnZ29vZ2xlLXNpdGVtYXAtcHJvL2dvb2dsZS1zaXRlbWFwLXByby5waHAnLCAnZ2dsc3RtcHByX2RlbGV0ZV9zZXR0aW5ncycpOw=='
));
Function Calls
| base64_decode | 1 |
Stats
| MD5 | 205f2f4f9777887aadb47c375edb0e98 |
| Eval Count | 1 |
| Decode Time | 228 ms |