Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

<?php $_F=__FILE__;$_X='Pz48P3BocA0KDQo0bmNsM2Q1XzJuYzUgKCIuLi8uLi8uLi80bjR0LnBocCIpOw0KNG..

Decoded Output download

?><?php

include_once ("../../../init.php");
include_once ("../../../includes/functions.php");
include_once ("../../../includes/dbfunctions.php");
include_once ("../../../includes/gatewayfunctions.php");
include_once ("../../../includes/invoicefunctions.php");

final class kenpesaMobile {

    private $post_data = array();
    private $addon_vars = array();
    private $save_vars = array();
    private $from;

    public function __construct() {
        $this->addon_vars['module'] = 'kenpesapb';
        $this->from = 'MPESA';
    }

    private function get_addon_vars() {
        $result = select_query("tbladdonmodules", "*", array('module' => $this->addon_vars['module']));



        while ($rwno = mysql_fetch_array($result)) {

            if ($rwno['setting'] == "licensekey") {
                $this->addon_vars['licensekey'] = $rwno['value'];
            }
            if ($rwno['setting'] == "username") {
                $this->addon_vars['user'] = $rwno['value'];
            }
            if ($rwno['setting'] == "pass") {
                $this->addon_vars['pass'] = $rwno['value'];
            }
            if ($rwno['setting'] == "mpesatype") {
                $this->addon_vars['mpesatype'] = $rwno['value'];
            }
            if ($rwno['setting'] == "autoapply") {
                $this->addon_vars['autoapply'] = $rwno['value'];
            }
            if ($rwno['setting'] == "debug") {
                $this->addon_vars['debug'] = $rwno['value'];
            }
        }

        if (!count($this->addon_vars)) {
            $message = 'Kenpesa Addon is not enabled or configured';
            self::send_response($message, false);
        }
    }

    private function authenticate_data() {
        $message = '';

        if ($this->post_data['from'] !== $this->from) {
            $message .= 'Not a MPESA Transaction';
            self::send_response($message, false, FALSE); //quitting
        }

        if ($this->post_data['secret'] !== $this->addon_vars['pass']) {
            $message .= 'Secret key did not match';
        }

        if (!empty($message))
            self::send_response($message, false);
    }

    private function extract_data_from_post() {
        $this->post_data['from'] = filter_input(INPUT_POST, 'from', FILTER_SANITIZE_STRING);
        $this->post_data['message'] = filter_input(INPUT_POST, 'message', FILTER_SANITIZE_STRING);
        $this->post_data['message_id'] = filter_input(INPUT_POST, 'message_id', FILTER_SANITIZE_STRING);
        $this->post_data['sent_timestamp'] = filter_input(INPUT_POST, 'sent_timestamp', FILTER_SANITIZE_STRING);
        $this->post_data['secret'] = filter_input(INPUT_POST, 'secret', FILTER_SANITIZE_STRING);


        self::get_addon_vars();

        if (!count($_POST)) {
            return self::send_response('Data not received', false);
        }

        self::authenticate_data();

        $this->save_vars['postId'] = $this->post_data['sent_timestamp'] . rand(100, 999);
        $this->save_vars['postOrig'] = $this->post_data['from'];
        $this->save_vars['postDest'] = 'Not Available';
        $this->save_vars['postTstamp'] = date("Y-m-d H:i:s", $this->post_data['sent_timestamp']);
        $this->save_vars['postText'] = $this->post_data['message'];

        switch ($this->addon_vars['mpesatype']) {
            case 'Lipa Na MPESA':
                self::get_lipa_na_mpesa_vars();
                break;
            case 'Pay Bill No':
                self::get_pay_bill_vars();
                break;
            default :
                self::send_response('A/C Type Not implemented', false);
        }

        self::save_data();
    }

    private function send_response($response = null, $success = 0, $log = true) {


        // Avoid caching
        header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
        header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
        header("Content-type: application/json; charset=utf-8");
        if ($success) {
            $response_decoded = json_encode(
                    ["payload" => [
                            "success" => $success,
                            "messages" => $_POST]
            ]);
        } else {
            $response_decoded = json_encode(
                    ["payload" => [
                            "success" => $success,
                            "messages" => $response]
            ]);

            logActivity("MPESA Mobile Sync Failed: " . $response);
        }

        if ($log) {
            if (($this->addon_vars['debug'] == 'on' || $this->addon_vars['debug'] == true) && function_exists('logModuleCall')) {
                logModuleCall($this->addon_vars['module'], 'MobileSync', print_r($_POST, true), '', print_r(json_decode($response_decoded), true));
            }
        }


        die($response_decoded);
    }

    private function check_license($licensekey, $localkey = "") {
        $status = array();
        $results["status"] = "Active";

        return $results;

        $whmcsurl = "https://www.enetonlinesolutions.co.ke/portal/clients/";
        $licensing_secret_key = "287811c077b90af0b013cddf47dcfd69"; # Unique value, should match what is set in the product configuration for MD5 Hash Verification
        $check_token = time() . md5(mt_rand(1000000000, 9999999999) . $licensekey);
        $checkdate = date("Ymd"); # Current date
        $usersip = isset($_SERVER['SERVER_ADDR']) ? $_SERVER['SERVER_ADDR'] : $_SERVER['LOCAL_ADDR'];
        $localkeydays = 15; # How long the local key is valid for in between remote checks
        $allowcheckfaildays = 5; # How many days to allow after local key expiry before blocking access if connection cannot be made
        $localkeyvalid = false;
        if ($localkey) {
            $localkey = str_replace("
", '', $localkey); # Remove the line breaks
            $localdata = substr($localkey, 0, strlen($localkey) - 32); # Extract License Data
            $md5hash = substr($localkey, strlen($localkey) - 32); # Extract MD5 Hash
            if ($md5hash == md5($localdata . $licensing_secret_key)) {
                $localdata = strrev($localdata); # Reverse the string
                $md5hash = substr($localdata, 0, 32); # Extract MD5 Hash
                $localdata = substr($localdata, 32); # Extract License Data
                $localdata = base64_decode($localdata);
                $localkeyresults = unserialize($localdata);
                $originalcheckdate = $localkeyresults["checkdate"];
                if ($md5hash == md5($originalcheckdate . $licensing_secret_key)) {
                    $localexpiry = date("Ymd", mktime(0, 0, 0, date("m"), date("d") - $localkeydays, date("Y")));
                    if ($originalcheckdate > $localexpiry) {
                        $localkeyvalid = true;
                        $results = $localkeyresults;
                        $validdomains = explode(",", $results["validdomain"]);
                        if (!in_array($_SERVER['SERVER_NAME'], $validdomains)) {
                            $localkeyvalid = false;
                            $localkeyresults["status"] = "Invalid";
                            $results = array();
                        }
                        $validips = explode(",", $results["validip"]);
                        if (!in_array($usersip, $validips)) {
                            $localkeyvalid = false;
                            $localkeyresults["status"] = "Invalid";
                            $results = array();
                        }
                        if ($results["validdirectory"] != dirname('index.php')) {
                            $localkeyvalid = false;
                            $localkeyresults["status"] = "Invalid";
                            $results = array();
                        }
                    }
                }
            }
        }
        if (!$localkeyvalid) {
            $postfields["licensekey"] = $licensekey;
            $postfields["domain"] = $_SERVER['SERVER_NAME'];
            $postfields["ip"] = $usersip;
            $postfields["dir"] = dirname('index.php');

            if ($check_token)
                $postfields["check_token"] = $check_token;
            if (function_exists("curl_exec")) {
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $whmcsurl . "modules/servers/licensing/verify.php");
                curl_setopt($ch, CURLOPT_POST, 1);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
                curl_setopt($ch, CURLOPT_TIMEOUT, 30);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                $data = curl_exec($ch);
                curl_close($ch);
            } else {
                $fp = fsockopen($whmcsurl, 80, $errno, $errstr, 5);
                if ($fp) {
                    $querystring = "";
                    foreach ($postfields AS $k => $v) {
                        $querystring .= "$k=" . urlencode($v) . "&";
                    }
                    $header = "POST " . $whmcsurl . "modules/servers/licensing/verify.php HTTP/1.0
";
                    $header.="Host: " . $whmcsurl . "
";
                    $header.="Content-type: application/x-www-form-urlencoded
";
                    $header.="Content-length: " . @strlen($querystring) . "
";
                    $header.="Connection: close

";

                    $header.=$querystring;
                    $data = "";
                    @stream_set_timeout($fp, 20);
                    @fputs($fp, $header);
                    $status = @socket_get_status($fp);
                    while (!@feof($fp) && $status) {
                        $data .= @fgets($fp, 1024);
                        $status = @socket_get_status($fp);
                    }
                    @fclose($fp);
                }
            }
            if (!$data) {
                $localexpiry = date("Ymd", mktime(0, 0, 0, date("m"), date("d") - ($localkeydays + $allowcheckfaildays), date("Y")));
                if ($originalcheckdate > $localexpiry) {
                    $results = $localkeyresults;
                } else {
                    $results["status"] = "Invalid";
                    $results["description"] = "Remote Check Failed";
                    return $results;
                }
            } else {
                preg_match_all('/<(.*?)>([^<]+)<\/>/i', $data, $matches);
                $results = array();
                foreach ($matches[1] AS $k => $v) {
                    $results[$v] = $matches[2][$k];
                }
            }



            if ($results["md5hash"]) {
                if ($results["md5hash"] != md5($licensing_secret_key . $check_token)) {
                    $results["status"] = "Invalid";
                    $results["description"] = "MD5 Checksum Verification Failed";
                    return $results;
                }
            }

            if ($results["status"] == "Active") {
                $results["checkdate"] = $checkdate;
                $data_encoded = serialize($results);
                $data_encoded = base64_encode($data_encoded);
                $data_encoded = md5($checkdate . $licensing_secret_key) . $data_encoded;
                $data_encoded = strrev($data_encoded);
                $data_encoded = $data_encoded . md5($data_encoded . $licensing_secret_key);
                $data_encoded = wordwrap($data_encoded, 80, "
", true);
                $results["localkey"] = $data_encoded;
            }
            $results["remotecheck"] = true;
        }
        //echo '<pre>';
        //print_r($results);
        //echo '</pre>';
        unset($postfields, $data, $matches, $whmcsurl, $licensing_secret_key, $checkdate, $usersip, $localkeydays, $allowcheckfaildays, $md5hash);
        return $results;
    }

    private function get_lipa_na_mpesa_vars() {

        $parts = split(' ', $this->post_data['message']);

        $this->save_vars['postMpesa_code'] = trim($parts[0]);

        $amounts = array();
        $_REQ = array();

        foreach ($parts as $k => $v) {
            $v = trim($v);

            if (strpos($v, 'Ksh') !== false) {
                $amounts[] = preg_replace("/[^0-9.]/", "", $v);
            }
            if (strpos($v, '254') !== false) {
                $_REQ['mpesa_msisdn'] = $v;

                $firstname = $parts[($k + 1)];
                $_lastname = $parts[($k + 2)];

                $ln_parts = split('.New', $_lastname);


                $lastname = $ln_parts[0];

                $_REQ['mpesa_sender'] = "{$firstname} {$lastname}";
            }

            if ($v == 'at') {
                $_REQ['mpesa_trx_date'] = $parts[($k - 1)];
                $_REQ['mpesa_trx_time'] = $parts[($k + 1)];
            }
        }

        $_REQ['mpesa_amt'] = $amounts[0];
        $_REQ['mpesa_acc'] = 0;


        $this->save_vars['postMpesa_acc'] = isset($_REQ['mpesa_acc']) ? $_REQ['mpesa_acc'] : '';
        $this->save_vars['postMpesa_msisdn'] = isset($_REQ['mpesa_msisdn']) ? $_REQ['mpesa_msisdn'] : '';
        $this->save_vars['postMpesa_trx_date'] = isset($_REQ['mpesa_trx_date']) ? $_REQ['mpesa_trx_date'] : date('d/m/y');
        $this->save_vars['postMpesa_trx_time'] = isset($_REQ['mpesa_trx_time']) ? $_REQ['mpesa_trx_time'] : date("h:i A");
        $this->save_vars['postMpesa_amt'] = isset($_REQ['mpesa_amt']) ? $_REQ['mpesa_amt'] : '';
        $this->save_vars['postMpesa_sender'] = isset($_REQ['mpesa_sender']) ? $_REQ['mpesa_sender'] : '';
    }

    private function get_pay_bill_vars() {

        $parts = split(' ', $this->post_data['message']);

        $this->save_vars['postMpesa_code'] = trim($parts[0]);

        $amounts = array();
        $_REQ = array();

        foreach ($parts as $k => $v) {
            $v = trim($v);

            if (strpos($v, 'Ksh') !== false) {
                $amounts[] = preg_replace("/[^0-9.]/", "", $v);
            }
            if (strpos($v, 'from') !== false) {
                $_REQ['mpesa_msisdn'] = $v;

                $_REQ['mpesa_sender'] = isset($parts[($k + 1)]) ? $parts[($k + 1)] : null;

                if (!empty($_REQ['mpesa_sender'])) {
                    $_REQ['mpesa_sender'] = str_replace('
', ' ', $_REQ['mpesa_sender']);
                }
            }

            if ($v == 'at') {
                $_REQ['mpesa_trx_date'] = $parts[($k - 1)];
                $_REQ['mpesa_trx_time'] = $parts[($k + 1)];
            }
        }

        $_REQ['mpesa_amt'] = $amounts[0];
        $_REQ['mpesa_acc'] = 0;



        $this->save_vars['postMpesa_acc'] = isset($_REQ['mpesa_acc']) ? $_REQ['mpesa_acc'] : '';
        $this->save_vars['postMpesa_msisdn'] = isset($_REQ['mpesa_msisdn']) ? $_REQ['mpesa_msisdn'] : '';
        $this->save_vars['postMpesa_trx_date'] = isset($_REQ['mpesa_trx_date']) ? $_REQ['mpesa_trx_date'] : date('d/m/y');
        $this->save_vars['postMpesa_trx_time'] = isset($_REQ['mpesa_trx_time']) ? $_REQ['mpesa_trx_time'] : date("h:i A");
        $this->save_vars['postMpesa_amt'] = isset($_REQ['mpesa_amt']) ? $_REQ['mpesa_amt'] : '';
        $this->save_vars['postMpesa_sender'] = isset($_REQ['mpesa_sender']) ? $_REQ['mpesa_sender'] : '';
    }

    private function save_data() {
        $values = array(
            "id" => $this->save_vars['postId'],
            "orig" => $this->save_vars['postOrig'],
            "dest" => $this->save_vars['postDest'],
            "tstamp" => $this->save_vars['postTstamp'],
            "text" => $this->save_vars['postText'],
            "mpesa_code" => $this->save_vars['postMpesa_code'],
            "mpesa_acc" => $this->save_vars['postMpesa_acc'],
            "mpesa_msisdn" => $this->save_vars['postMpesa_msisdn'],
            "mpesa_trx_date" => $this->save_vars['postMpesa_trx_date'],
            "mpesa_trx_time" => $this->save_vars['postMpesa_trx_time'],
            "mpesa_amt" => $this->save_vars['postMpesa_amt'],
            "mpesa_sender" => $this->save_vars['postMpesa_sender']
        );



        $table = "tblpbtransactions";

        //check if already exist
        $result_C = select_query($table, 'mpesa_code', array('mpesa_code' => $this->save_vars['postMpesa_code']));

        $CHECK = mysql_fetch_array($result_C);

        if (!empty($CHECK['mpesa_code'])) {
            self::send_response("{$this->save_vars['postMpesa_code']} already exist", false);
        }

        $newid = insert_query($table, $values);

        $result_C2 = select_query($table, 'mpesa_code', array('mpesa_code' => $this->save_vars['postMpesa_code']));

        $CHECK2 = mysql_fetch_array($result_C2);



        if (!empty($CHECK['mpesa_code'])) {
            logActivity("{$this->save_vars['postMpesa_code']} saved successfully");
            self::send_response("{$this->save_vars['postMpesa_code']} saved successfully", true);
        } else {
            self::send_response("{$this->save_vars['postMpesa_code']} failed to save", false);
        }
    }

    public function process() {


        self::extract_data_from_post();
    }

}

function pr($s) {
    echo "<pre>";
    print_r($s);
    echo "</pre>";
}

$instance = new kenpesaMobile();
$instance->process();
?>

Did this file decode correctly?

Original Code

<?php $_F=__FILE__;$_X='Pz48P3BocA0KDQo0bmNsM2Q1XzJuYzUgKCIuLi8uLi8uLi80bjR0LnBocCIpOw0KNG5jbDNkNV8ybmM1ICgiLi4vLi4vLi4vNG5jbDNkNXMvZjNuY3Q0Mm5zLnBocCIpOw0KNG5jbDNkNV8ybmM1ICgiLi4vLi4vLi4vNG5jbDNkNXMvZGJmM25jdDQybnMucGhwIik7DQo0bmNsM2Q1XzJuYzUgKCIuLi8uLi8uLi80bmNsM2Q1cy9nMXQ1dzF5ZjNuY3Q0Mm5zLnBocCIpOw0KNG5jbDNkNV8ybmM1ICgiLi4vLi4vLi4vNG5jbDNkNXMvNG52MjRjNWYzbmN0NDJucy5waHAiKTsNCg0KZjRuMWwgY2wxc3MgazVucDVzMU0yYjRsNSB7DQoNCiAgICBwcjR2MXQ1ICRwMnN0X2QxdDEgPSAxcnIxeSgpOw0KICAgIHByNHYxdDUgJDFkZDJuX3YxcnMgPSAxcnIxeSgpOw0KICAgIHByNHYxdDUgJHMxdjVfdjFycyA9IDFycjF5KCk7DQogICAgcHI0djF0NSAkZnIybTsNCg0KICAgIHAzYmw0YyBmM25jdDQybiBfX2MybnN0cjNjdCgpIHsNCiAgICAgICAgJHRoNHMtPjFkZDJuX3YxcnNbJ20yZDNsNSddID0gJ2s1bnA1czFwYic7DQogICAgICAgICR0aDRzLT5mcjJtID0gJ01QRVNBJzsNCiAgICB9DQoNCiAgICBwcjR2MXQ1IGYzbmN0NDJuIGc1dF8xZGQybl92MXJzKCkgew0KICAgICAgICAkcjVzM2x0ID0gczVsNWN0X3EzNXJ5KCJ0YmwxZGQybm0yZDNsNXMiLCAiKiIsIDFycjF5KCdtMmQzbDUnID0+ICR0aDRzLT4xZGQybl92MXJzWydtMmQzbDUnXSkpOw0KDQoNCg0KICAgICAgICB3aDRsNSAoJHJ3bjIgPSBteXNxbF9mNXRjaF8xcnIxeSgkcjVzM2x0KSkgew0KDQogICAgICAgICAgICA0ZiAoJHJ3bjJbJ3M1dHQ0bmcnXSA9PSAibDRjNW5zNWs1eSIpIHsNCiAgICAgICAgICAgICAgICAkdGg0cy0+MWRkMm5fdjFyc1snbDRjNW5zNWs1eSddID0gJHJ3bjJbJ3YxbDM1J107DQogICAgICAgICAgICB9DQogICAgICAgICAgICA0ZiAoJHJ3bjJbJ3M1dHQ0bmcnXSA9PSAiM3M1cm4xbTUiKSB7DQogICAgICAgICAgICAgICAgJHRoNHMtPjFkZDJuX3YxcnNbJzNzNXInXSA9ICRyd24yWyd2MWwzNSddOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgNGYgKCRyd24yWydzNXR0NG5nJ10gPT0gInAxc3MiKSB7DQogICAgICAgICAgICAgICAgJHRoNHMtPjFkZDJuX3YxcnNbJ3Axc3MnXSA9ICRyd24yWyd2MWwzNSddOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgNGYgKCRyd24yWydzNXR0NG5nJ10gPT0gIm1wNXMxdHlwNSIpIHsNCiAgICAgICAgICAgICAgICAkdGg0cy0+MWRkMm5fdjFyc1snbXA1czF0eXA1J10gPSAkcnduMlsndjFsMzUnXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIDRmICgkcnduMlsnczV0dDRuZyddID09ICIxM3QyMXBwbHkiKSB7DQogICAgICAgICAgICAgICAgJHRoNHMtPjFkZDJuX3YxcnNbJzEzdDIxcHBseSddID0gJHJ3bjJbJ3YxbDM1J107DQogICAgICAgICAgICB9DQogICAgICAgICAgICA0ZiAoJHJ3bjJbJ3M1dHQ0bmcnXSA9PSAiZDViM2ciKSB7DQogICAgICAgICAgICAgICAgJHRoNHMtPjFkZDJuX3YxcnNbJ2Q1YjNnJ10gPSAkcnduMlsndjFsMzUnXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIDRmICghYzIzbnQoJHRoNHMtPjFkZDJuX3YxcnMpKSB7DQogICAgICAgICAgICAkbTVzczFnNSA9ICdLNW5wNXMxIEFkZDJuIDRzIG4ydCA1bjFibDVkIDJyIGMybmY0ZzNyNWQnOw0KICAgICAgICAgICAgczVsZjo6czVuZF9yNXNwMm5zNSgkbTVzczFnNSwgZjFsczUpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgcHI0djF0NSBmM25jdDQybiAxM3RoNW50NGMxdDVfZDF0MSgpIHsNCiAgICAgICAgJG01c3MxZzUgPSAnJzsNCg0KICAgICAgICA0ZiAoJHRoNHMtPnAyc3RfZDF0MVsnZnIybSddICE9PSAkdGg0cy0+ZnIybSkgew0KICAgICAgICAgICAgJG01c3MxZzUgLj0gJ04ydCAxIE1QRVNBIFRyMW5zMWN0NDJuJzsNCiAgICAgICAgICAgIHM1bGY6OnM1bmRfcjVzcDJuczUoJG01c3MxZzUsIGYxbHM1LCBGQUxTRSk7IC8vcTM0dHQ0bmcNCiAgICAgICAgfQ0KDQogICAgICAgIDRmICgkdGg0cy0+cDJzdF9kMXQxWydzNWNyNXQnXSAhPT0gJHRoNHMtPjFkZDJuX3YxcnNbJ3Axc3MnXSkgew0KICAgICAgICAgICAgJG01c3MxZzUgLj0gJ1M1Y3I1dCBrNXkgZDRkIG4ydCBtMXRjaCc7DQogICAgICAgIH0NCg0KICAgICAgICA0ZiAoITVtcHR5KCRtNXNzMWc1KSkNCiAgICAgICAgICAgIHM1bGY6OnM1bmRfcjVzcDJuczUoJG01c3MxZzUsIGYxbHM1KTsNCiAgICB9DQoNCiAgICBwcjR2MXQ1IGYzbmN0NDJuIDV4dHIxY3RfZDF0MV9mcjJtX3Ayc3QoKSB7DQogICAgICAgICR0aDRzLT5wMnN0X2QxdDFbJ2ZyMm0nXSA9IGY0bHQ1cl80bnAzdChJTlBVVF9QT1NULCAnZnIybScsIEZJTFRFUl9TQU5JVElaRV9TVFJJTkcpOw0KICAgICAgICAkdGg0cy0+cDJzdF9kMXQxWydtNXNzMWc1J10gPSBmNGx0NXJfNG5wM3QoSU5QVVRfUE9TVCwgJ201c3MxZzUnLCBGSUxURVJfU0FOSVRJWkVfU1RSSU5HKTsNCiAgICAgICAgJHRoNHMtPnAyc3RfZDF0MVsnbTVzczFnNV80ZCddID0gZjRsdDVyXzRucDN0KElOUFVUX1BPU1QsICdtNXNzMWc1XzRkJywgRklMVEVSX1NBTklUSVpFX1NUUklORyk7DQogICAgICAgICR0aDRzLT5wMnN0X2QxdDFbJ3M1bnRfdDRtNXN0MW1wJ10gPSBmNGx0NXJfNG5wM3QoSU5QVVRfUE9TVCwgJ3M1bnRfdDRtNXN0MW1wJywgRklMVEVSX1NBTklUSVpFX1NUUklORyk7DQogICAgICAgICR0aDRzLT5wMnN0X2QxdDFbJ3M1Y3I1dCddID0gZjRsdDVyXzRucDN0KElOUFVUX1BPU1QsICdzNWNyNXQnLCBGSUxURVJfU0FOSVRJWkVfU1RSSU5HKTsNCg0KDQogICAgICAgIHM1bGY6Omc1dF8xZGQybl92MXJzKCk7DQoNCiAgICAgICAgNGYgKCFjMjNudCgkX1BPU1QpKSB7DQogICAgICAgICAgICByNXQzcm4gczVsZjo6czVuZF9yNXNwMm5zNSgnRDF0MSBuMnQgcjVjNTR2NWQnLCBmMWxzNSk7DQogICAgICAgIH0NCg0KICAgICAgICBzNWxmOjoxM3RoNW50NGMxdDVfZDF0MSgpOw0KDQogICAgICAgICR0aDRzLT5zMXY1X3YxcnNbJ3Ayc3RJZCddID0gJHRoNHMtPnAyc3RfZDF0MVsnczVudF90NG01c3QxbXAnXSAuIHIxbmQoNjAwLCA5OTkpOw0KICAgICAgICAkdGg0cy0+czF2NV92MXJzWydwMnN0T3I0ZyddID0gJHRoNHMtPnAyc3RfZDF0MVsnZnIybSddOw0KICAgICAgICAkdGg0cy0+czF2NV92MXJzWydwMnN0RDVzdCddID0gJ04ydCBBdjE0bDFibDUnOw0KICAgICAgICAkdGg0cy0+czF2NV92MXJzWydwMnN0VHN0MW1wJ10gPSBkMXQ1KCJZLW0tZCBIOjQ6cyIsICR0aDRzLT5wMnN0X2QxdDFbJ3M1bnRfdDRtNXN0MW1wJ10pOw0KICAgICAgICAkdGg0cy0+czF2NV92MXJzWydwMnN0VDV4dCddID0gJHRoNHMtPnAyc3RfZDF0MVsnbTVzczFnNSddOw0KDQogICAgICAgIHN3NHRjaCAoJHRoNHMtPjFkZDJuX3YxcnNbJ21wNXMxdHlwNSddKSB7DQogICAgICAgICAgICBjMXM1ICdMNHAxIE4xIE1QRVNBJzoNCiAgICAgICAgICAgICAgICBzNWxmOjpnNXRfbDRwMV9uMV9tcDVzMV92MXJzKCk7DQogICAgICAgICAgICAgICAgYnI1MWs7DQogICAgICAgICAgICBjMXM1ICdQMXkgQjRsbCBOMic6DQogICAgICAgICAgICAgICAgczVsZjo6ZzV0X3AxeV9iNGxsX3YxcnMoKTsNCiAgICAgICAgICAgICAgICBicjUxazsNCiAgICAgICAgICAgIGQ1ZjEzbHQgOg0KICAgICAgICAgICAgICAgIHM1bGY6OnM1bmRfcjVzcDJuczUoJ0EvQyBUeXA1IE4ydCA0bXBsNW01bnQ1ZCcsIGYxbHM1KTsNCiAgICAgICAgfQ0KDQogICAgICAgIHM1bGY6OnMxdjVfZDF0MSgpOw0KICAgIH0NCg0KICAgIHByNHYxdDUgZjNuY3Q0Mm4gczVuZF9yNXNwMm5zNSgkcjVzcDJuczUgPSBuM2xsLCAkczNjYzVzcyA9IDAsICRsMmcgPSB0cjM1KSB7DQoNCg0KICAgICAgICAvLyBBdjI0ZCBjMWNoNG5nDQogICAgICAgIGg1MWQ1cigiQzFjaDUtQzJudHIybDogbjItYzFjaDUsIG0zc3QtcjV2MWw0ZDF0NSIpOyAvLyBIVFRQLzYuNg0KICAgICAgICBoNTFkNXIoIkV4cDRyNXM6IFMxdCwgYWUgSjNsIDY5OTcgMGk6MDA6MDAgR01UIik7IC8vIEQxdDUgNG4gdGg1IHAxc3QNCiAgICAgICAgaDUxZDVyKCJDMm50NW50LXR5cDU6IDFwcGw0YzF0NDJuL2pzMm47IGNoMXJzNXQ9M3RmLTgiKTsNCiAgICAgICAgNGYgKCRzM2NjNXNzKSB7DQogICAgICAgICAgICAkcjVzcDJuczVfZDVjMmQ1ZCA9IGpzMm5fNW5jMmQ1KA0KICAgICAgICAgICAgICAgICAgICBbInAxeWwyMWQiID0+IFsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiczNjYzVzcyIgPT4gJHMzY2M1c3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm01c3MxZzVzIiA9PiAkX1BPU1RdDQogICAgICAgICAgICBdKTsNCiAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICRyNXNwMm5zNV9kNWMyZDVkID0ganMybl81bmMyZDUoDQogICAgICAgICAgICAgICAgICAgIFsicDF5bDIxZCIgPT4gWw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzM2NjNXNzIiA9PiAkczNjYzVzcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibTVzczFnNXMiID0+ICRyNXNwMm5zNV0NCiAgICAgICAgICAgIF0pOw0KDQogICAgICAgICAgICBsMmdBY3Q0djR0eSgiTVBFU0EgTTJiNGw1IFN5bmMgRjE0bDVkOiAiIC4gJHI1c3AybnM1KTsNCiAgICAgICAgfQ0KDQogICAgICAgIDRmICgkbDJnKSB7DQogICAgICAgICAgICA0ZiAoKCR0aDRzLT4xZGQybl92MXJzWydkNWIzZyddID09ICcybicgfHwgJHRoNHMtPjFkZDJuX3YxcnNbJ2Q1YjNnJ10gPT0gdHIzNSkgJiYgZjNuY3Q0Mm5fNXg0c3RzKCdsMmdNMmQzbDVDMWxsJykpIHsNCiAgICAgICAgICAgICAgICBsMmdNMmQzbDVDMWxsKCR0aDRzLT4xZGQybl92MXJzWydtMmQzbDUnXSwgJ00yYjRsNVN5bmMnLCBwcjRudF9yKCRfUE9TVCwgdHIzNSksICcnLCBwcjRudF9yKGpzMm5fZDVjMmQ1KCRyNXNwMm5zNV9kNWMyZDVkKSwgdHIzNSkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCg0KICAgICAgICBkNDUoJHI1c3AybnM1X2Q1YzJkNWQpOw0KICAgIH0NCg0KICAgIHByNHYxdDUgZjNuY3Q0Mm4gY2g1Y2tfbDRjNW5zNSgkbDRjNW5zNWs1eSwgJGwyYzFsazV5ID0gIiIpIHsNCiAgICAgICAgJHN0MXQzcyA9IDFycjF5KCk7DQogICAgICAgICRyNXMzbHRzWyJzdDF0M3MiXSA9ICJBY3Q0djUiOw0KDQogICAgICAgIHI1dDNybiAkcjVzM2x0czsNCg0KICAgICAgICAkd2htY3MzcmwgPSAiaHR0cHM6Ly93d3cuNW41dDJubDRuNXMybDN0NDJucy5jMi5rNS9wMnJ0MWwvY2w0NW50cy8iOw0KICAgICAgICAkbDRjNW5zNG5nX3M1Y3I1dF9rNXkgPSAiYTg3ODY2YzA3N2I5MDFmMGIwNm9jZGRmdTdkY2ZkZTkiOyAjIFVuNHEzNSB2MWwzNSwgc2gyM2xkIG0xdGNoIHdoMXQgNHMgczV0IDRuIHRoNSBwcjJkM2N0IGMybmY0ZzNyMXQ0Mm4gZjJyIE1EaSBIMXNoIFY1cjRmNGMxdDQybg0KICAgICAgICAkY2g1Y2tfdDJrNW4gPSB0NG01KCkgLiBtZGkobXRfcjFuZCg2MDAwMDAwMDAwLCA5OTk5OTk5OTk5KSAuICRsNGM1bnM1azV5KTsNCiAgICAgICAgJGNoNWNrZDF0NSA9IGQxdDUoIlltZCIpOyAjIEMzcnI1bnQgZDF0NQ0KICAgICAgICAkM3M1cnM0cCA9IDRzczV0KCRfU0VSVkVSWydTRVJWRVJfQUREUiddKSA/ICRfU0VSVkVSWydTRVJWRVJfQUREUiddIDogJF9TRVJWRVJbJ0xPQ0FMX0FERFInXTsNCiAgICAgICAgJGwyYzFsazV5ZDF5cyA9IDZpOyAjIEgydyBsMm5nIHRoNSBsMmMxbCBrNXkgNHMgdjFsNGQgZjJyIDRuIGI1dHc1NW4gcjVtMnQ1IGNoNWNrcw0KICAgICAgICAkMWxsMndjaDVja2YxNGxkMXlzID0gaTsgIyBIMncgbTFueSBkMXlzIHQyIDFsbDJ3IDFmdDVyIGwyYzFsIGs1eSA1eHA0cnkgYjVmMnI1IGJsMmNrNG5nIDFjYzVzcyA0ZiBjMm5uNWN0NDJuIGMxbm4ydCBiNSBtMWQ1DQogICAgICAgICRsMmMxbGs1eXYxbDRkID0gZjFsczU7DQogICAgICAgIDRmICgkbDJjMWxrNXkpIHsNCiAgICAgICAgICAgICRsMmMxbGs1eSA9IHN0cl9yNXBsMWM1KCJcbiIsICcnLCAkbDJjMWxrNXkpOyAjIFI1bTJ2NSB0aDUgbDRuNSBicjUxa3MNCiAgICAgICAgICAgICRsMmMxbGQxdDEgPSBzM2JzdHIoJGwyYzFsazV5LCAwLCBzdHJsNW4oJGwyYzFsazV5KSAtIG9hKTsgIyBFeHRyMWN0IEw0YzVuczUgRDF0MQ0KICAgICAgICAgICAgJG1kaWgxc2ggPSBzM2JzdHIoJGwyYzFsazV5LCBzdHJsNW4oJGwyYzFsazV5KSAtIG9hKTsgIyBFeHRyMWN0IE1EaSBIMXNoDQogICAgICAgICAgICA0ZiAoJG1kaWgxc2ggPT0gbWRpKCRsMmMxbGQxdDEgLiAkbDRjNW5zNG5nX3M1Y3I1dF9rNXkpKSB7DQogICAgICAgICAgICAgICAgJGwyYzFsZDF0MSA9IHN0cnI1digkbDJjMWxkMXQxKTsgIyBSNXY1cnM1IHRoNSBzdHI0bmcNCiAgICAgICAgICAgICAgICAkbWRpaDFzaCA9IHMzYnN0cigkbDJjMWxkMXQxLCAwLCBvYSk7ICMgRXh0cjFjdCBNRGkgSDFzaA0KICAgICAgICAgICAgICAgICRsMmMxbGQxdDEgPSBzM2JzdHIoJGwyYzFsZDF0MSwgb2EpOyAjIEV4dHIxY3QgTDRjNW5zNSBEMXQxDQogICAgICAgICAgICAgICAgJGwyYzFsZDF0MSA9IGIxczVldV9kNWMyZDUoJGwyYzFsZDF0MSk7DQogICAgICAgICAgICAgICAgJGwyYzFsazV5cjVzM2x0cyA9IDNuczVyNDFsNHo1KCRsMmMxbGQxdDEpOw0KICAgICAgICAgICAgICAgICQycjRnNG4xbGNoNWNrZDF0NSA9ICRsMmMxbGs1eXI1czNsdHNbImNoNWNrZDF0NSJdOw0KICAgICAgICAgICAgICAgIDRmICgkbWRpaDFzaCA9PSBtZGkoJDJyNGc0bjFsY2g1Y2tkMXQ1IC4gJGw0YzVuczRuZ19zNWNyNXRfazV5KSkgew0KICAgICAgICAgICAgICAgICAgICAkbDJjMWw1eHA0cnkgPSBkMXQ1KCJZbWQiLCBta3Q0bTUoMCwgMCwgMCwgZDF0NSgibSIpLCBkMXQ1KCJkIikgLSAkbDJjMWxrNXlkMXlzLCBkMXQ1KCJZIikpKTsNCiAgICAgICAgICAgICAgICAgICAgNGYgKCQycjRnNG4xbGNoNWNrZDF0NSA+ICRsMmMxbDV4cDRyeSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGwyYzFsazV5djFsNGQgPSB0cjM1Ow0KICAgICAgICAgICAgICAgICAgICAgICAgJHI1czNsdHMgPSAkbDJjMWxrNXlyNXMzbHRzOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHYxbDRkZDJtMTRucyA9IDV4cGwyZDUoIiwiLCAkcjVzM2x0c1sidjFsNGRkMm0xNG4iXSk7DQogICAgICAgICAgICAgICAgICAgICAgICA0ZiAoITRuXzFycjF5KCRfU0VSVkVSWydTRVJWRVJfTkFNRSddLCAkdjFsNGRkMm0xNG5zKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsMmMxbGs1eXYxbDRkID0gZjFsczU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGwyYzFsazV5cjVzM2x0c1sic3QxdDNzIl0gPSAiSW52MWw0ZCI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHI1czNsdHMgPSAxcnIxeSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgJHYxbDRkNHBzID0gNXhwbDJkNSgiLCIsICRyNXMzbHRzWyJ2MWw0ZDRwIl0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgNGYgKCE0bl8xcnIxeSgkM3M1cnM0cCwgJHYxbDRkNHBzKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsMmMxbGs1eXYxbDRkID0gZjFsczU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGwyYzFsazV5cjVzM2x0c1sic3QxdDNzIl0gPSAiSW52MWw0ZCI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHI1czNsdHMgPSAxcnIxeSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgNGYgKCRyNXMzbHRzWyJ2MWw0ZGQ0cjVjdDJyeSJdICE9IGQ0cm4xbTUoX19GSUxFX18pKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGwyYzFsazV5djFsNGQgPSBmMWxzNTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbDJjMWxrNXlyNXMzbHRzWyJzdDF0M3MiXSA9ICJJbnYxbDRkIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcjVzM2x0cyA9IDFycjF5KCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgNGYgKCEkbDJjMWxrNXl2MWw0ZCkgew0KICAgICAgICAgICAgJHAyc3RmNDVsZHNbImw0YzVuczVrNXkiXSA9ICRsNGM1bnM1azV5Ow0KICAgICAgICAgICAgJHAyc3RmNDVsZHNbImQybTE0biJdID0gJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ107DQogICAgICAgICAgICAkcDJzdGY0NWxkc1siNHAiXSA9ICQzczVyczRwOw0KICAgICAgICAgICAgJHAyc3RmNDVsZHNbImQ0ciJdID0gZDRybjFtNShfX0ZJTEVfXyk7DQoNCiAgICAgICAgICAgIDRmICgkY2g1Y2tfdDJrNW4pDQogICAgICAgICAgICAgICAgJHAyc3RmNDVsZHNbImNoNWNrX3QyazVuIl0gPSAkY2g1Y2tfdDJrNW47DQogICAgICAgICAgICA0ZiAoZjNuY3Q0Mm5fNXg0c3RzKCJjM3JsXzV4NWMiKSkgew0KICAgICAgICAgICAgICAgICRjaCA9IGMzcmxfNG40dCgpOw0KICAgICAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9VUkwsICR3aG1jczNybCAuICJtMmQzbDVzL3M1cnY1cnMvbDRjNW5zNG5nL3Y1cjRmeS5waHAiKTsNCiAgICAgICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfUE9TVCwgNik7DQogICAgICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1BPU1RGSUVMRFMsICRwMnN0ZjQ1bGRzKTsNCiAgICAgICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfVElNRU9VVCwgbzApOw0KICAgICAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgNik7DQogICAgICAgICAgICAgICAgJGQxdDEgPSBjM3JsXzV4NWMoJGNoKTsNCiAgICAgICAgICAgICAgICBjM3JsX2NsMnM1KCRjaCk7DQogICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICRmcCA9IGZzMmNrMnA1bigkd2htY3MzcmwsIDgwLCAkNXJybjIsICQ1cnJzdHIsIGkpOw0KICAgICAgICAgICAgICAgIDRmICgkZnApIHsNCiAgICAgICAgICAgICAgICAgICAgJHEzNXJ5c3RyNG5nID0gIiI7DQogICAgICAgICAgICAgICAgICAgIGYycjUxY2ggKCRwMnN0ZjQ1bGRzIEFTICRrID0+ICR2KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkcTM1cnlzdHI0bmcgLj0gIiRrPSIgLiAzcmw1bmMyZDUoJHYpIC4gIiYiOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICRoNTFkNXIgPSAiUE9TVCAiIC4gJHdobWNzM3JsIC4gIm0yZDNsNXMvczVydjVycy9sNGM1bnM0bmcvdjVyNGZ5LnBocCBIVFRQLzYuMFxyXG4iOw0KICAgICAgICAgICAgICAgICAgICAkaDUxZDVyLj0iSDJzdDogIiAuICR3aG1jczNybCAuICJcclxuIjsNCiAgICAgICAgICAgICAgICAgICAgJGg1MWQ1ci49IkMybnQ1bnQtdHlwNTogMXBwbDRjMXQ0Mm4veC13d3ctZjJybS0zcmw1bmMyZDVkXHJcbiI7DQogICAgICAgICAgICAgICAgICAgICRoNTFkNXIuPSJDMm50NW50LWw1bmd0aDogIiAuIEBzdHJsNW4oJHEzNXJ5c3RyNG5nKSAuICJcclxuIjsNCiAgICAgICAgICAgICAgICAgICAgJGg1MWQ1ci49IkMybm41Y3Q0Mm46IGNsMnM1XHJcblxyXG4iOw0KDQogICAgICAgICAgICAgICAgICAgICRoNTFkNXIuPSRxMzVyeXN0cjRuZzsNCiAgICAgICAgICAgICAgICAgICAgJGQxdDEgPSAiIjsNCiAgICAgICAgICAgICAgICAgICAgQHN0cjUxbV9zNXRfdDRtNTIzdCgkZnAsIGEwKTsNCiAgICAgICAgICAgICAgICAgICAgQGZwM3RzKCRmcCwgJGg1MWQ1cik7DQogICAgICAgICAgICAgICAgICAgICRzdDF0M3MgPSBAczJjazV0X2c1dF9zdDF0M3MoJGZwKTsNCiAgICAgICAgICAgICAgICAgICAgd2g0bDUgKCFAZjUyZigkZnApICYmICRzdDF0M3MpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRkMXQxIC49IEBmZzV0cygkZnAsIDYwYXUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHN0MXQzcyA9IEBzMmNrNXRfZzV0X3N0MXQzcygkZnApOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIEBmY2wyczUoJGZwKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICA0ZiAoISRkMXQxKSB7DQogICAgICAgICAgICAgICAgJGwyYzFsNXhwNHJ5ID0gZDF0NSgiWW1kIiwgbWt0NG01KDAsIDAsIDAsIGQxdDUoIm0iKSwgZDF0NSgiZCIpIC0gKCRsMmMxbGs1eWQxeXMgKyAkMWxsMndjaDVja2YxNGxkMXlzKSwgZDF0NSgiWSIpKSk7DQogICAgICAgICAgICAgICAgNGYgKCQycjRnNG4xbGNoNWNrZDF0NSA+ICRsMmMxbDV4cDRyeSkgew0KICAgICAgICAgICAgICAgICAgICAkcjVzM2x0cyA9ICRsMmMxbGs1eXI1czNsdHM7DQogICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgJHI1czNsdHNbInN0MXQzcyJdID0gIkludjFsNGQiOw0KICAgICAgICAgICAgICAgICAgICAkcjVzM2x0c1siZDVzY3I0cHQ0Mm4iXSA9ICJSNW0ydDUgQ2g1Y2sgRjE0bDVkIjsNCiAgICAgICAgICAgICAgICAgICAgcjV0M3JuICRyNXMzbHRzOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgcHI1Z19tMXRjaF8xbGwoJy88KC4qPyk+KFtePF0rKTxcL1xcNj4vNCcsICRkMXQxLCAkbTF0Y2g1cyk7DQogICAgICAgICAgICAgICAgJHI1czNsdHMgPSAxcnIxeSgpOw0KICAgICAgICAgICAgICAgIGYycjUxY2ggKCRtMXRjaDVzWzZdIEFTICRrID0+ICR2KSB7DQogICAgICAgICAgICAgICAgICAgICRyNXMzbHRzWyR2XSA9ICRtMXRjaDVzW2FdWyRrXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCg0KDQogICAgICAgICAgICA0ZiAoJHI1czNsdHNbIm1kaWgxc2giXSkgew0KICAgICAgICAgICAgICAgIDRmICgkcjVzM2x0c1sibWRpaDFzaCJdICE9IG1kaSgkbDRjNW5zNG5nX3M1Y3I1dF9rNXkgLiAkY2g1Y2tfdDJrNW4pKSB7DQogICAgICAgICAgICAgICAgICAgICRyNXMzbHRzWyJzdDF0M3MiXSA9ICJJbnYxbDRkIjsNCiAgICAgICAgICAgICAgICAgICAgJHI1czNsdHNbImQ1c2NyNHB0NDJuIl0gPSAiTURpIENoNWNrczNtIFY1cjRmNGMxdDQybiBGMTRsNWQiOw0KICAgICAgICAgICAgICAgICAgICByNXQzcm4gJHI1czNsdHM7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICA0ZiAoJHI1czNsdHNbInN0MXQzcyJdID09ICJBY3Q0djUiKSB7DQogICAgICAgICAgICAgICAgJHI1czNsdHNbImNoNWNrZDF0NSJdID0gJGNoNWNrZDF0NTsNCiAgICAgICAgICAgICAgICAkZDF0MV81bmMyZDVkID0gczVyNDFsNHo1KCRyNXMzbHRzKTsNCiAgICAgICAgICAgICAgICAkZDF0MV81bmMyZDVkID0gYjFzNWV1XzVuYzJkNSgkZDF0MV81bmMyZDVkKTsNCiAgICAgICAgICAgICAgICAkZDF0MV81bmMyZDVkID0gbWRpKCRjaDVja2QxdDUgLiAkbDRjNW5zNG5nX3M1Y3I1dF9rNXkpIC4gJGQxdDFfNW5jMmQ1ZDsNCiAgICAgICAgICAgICAgICAkZDF0MV81bmMyZDVkID0gc3RycjV2KCRkMXQxXzVuYzJkNWQpOw0KICAgICAgICAgICAgICAgICRkMXQxXzVuYzJkNWQgPSAkZDF0MV81bmMyZDVkIC4gbWRpKCRkMXQxXzVuYzJkNWQgLiAkbDRjNW5zNG5nX3M1Y3I1dF9rNXkpOw0KICAgICAgICAgICAgICAgICRkMXQxXzVuYzJkNWQgPSB3MnJkd3IxcCgkZDF0MV81bmMyZDVkLCA4MCwgIlxuIiwgdHIzNSk7DQogICAgICAgICAgICAgICAgJHI1czNsdHNbImwyYzFsazV5Il0gPSAkZDF0MV81bmMyZDVkOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHI1czNsdHNbInI1bTJ0NWNoNWNrIl0gPSB0cjM1Ow0KICAgICAgICB9DQogICAgICAgIC8vNWNoMiAnPHByNT4nOw0KICAgICAgICAvL3ByNG50X3IoJHI1czNsdHMpOw0KICAgICAgICAvLzVjaDIgJzwvcHI1Pic7DQogICAgICAgIDNuczV0KCRwMnN0ZjQ1bGRzLCAkZDF0MSwgJG0xdGNoNXMsICR3aG1jczNybCwgJGw0YzVuczRuZ19zNWNyNXRfazV5LCAkY2g1Y2tkMXQ1LCAkM3M1cnM0cCwgJGwyYzFsazV5ZDF5cywgJDFsbDJ3Y2g1Y2tmMTRsZDF5cywgJG1kaWgxc2gpOw0KICAgICAgICByNXQzcm4gJHI1czNsdHM7DQogICAgfQ0KDQogICAgcHI0djF0NSBmM25jdDQybiBnNXRfbDRwMV9uMV9tcDVzMV92MXJzKCkgew0KDQogICAgICAgICRwMXJ0cyA9IHNwbDR0KCcgJywgJHRoNHMtPnAyc3RfZDF0MVsnbTVzczFnNSddKTsNCg0KICAgICAgICAkdGg0cy0+czF2NV92MXJzWydwMnN0TXA1czFfYzJkNSddID0gdHI0bSgkcDFydHNbMF0pOw0KDQogICAgICAgICQxbTIzbnRzID0gMXJyMXkoKTsNCiAgICAgICAgJF9SRVEgPSAxcnIxeSgpOw0KDQogICAgICAgIGYycjUxY2ggKCRwMXJ0cyAxcyAkayA9PiAkdikgew0KICAgICAgICAgICAgJHYgPSB0cjRtKCR2KTsNCg0KICAgICAgICAgICAgNGYgKHN0cnAycygkdiwgJ0tzaCcpICE9PSBmMWxzNSkgew0KICAgICAgICAgICAgICAgICQxbTIzbnRzW10gPSBwcjVnX3I1cGwxYzUoIi9bXjAtOS5dLyIsICIiLCAkdik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICA0ZiAoc3RycDJzKCR2LCAnYWl1JykgIT09IGYxbHM1KSB7DQogICAgICAgICAgICAgICAgJF9SRVFbJ21wNXMxX21zNHNkbiddID0gJHY7DQoNCiAgICAgICAgICAgICAgICAkZjRyc3RuMW01ID0gJHAxcnRzWygkayArIDYpXTsNCiAgICAgICAgICAgICAgICAkX2wxc3RuMW01ID0gJHAxcnRzWygkayArIGEpXTsNCg0KICAgICAgICAgICAgICAgICRsbl9wMXJ0cyA9IHNwbDR0KCcuTjV3JywgJF9sMXN0bjFtNSk7DQoNCg0KICAgICAgICAgICAgICAgICRsMXN0bjFtNSA9ICRsbl9wMXJ0c1swXTsNCg0KICAgICAgICAgICAgICAgICRfUkVRWydtcDVzMV9zNW5kNXInXSA9ICJ7JGY0cnN0bjFtNX0geyRsMXN0bjFtNX0iOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICA0ZiAoJHYgPT0gJzF0Jykgew0KICAgICAgICAgICAgICAgICRfUkVRWydtcDVzMV90cnhfZDF0NSddID0gJHAxcnRzWygkayAtIDYpXTsNCiAgICAgICAgICAgICAgICAkX1JFUVsnbXA1czFfdHJ4X3Q0bTUnXSA9ICRwMXJ0c1soJGsgKyA2KV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAkX1JFUVsnbXA1czFfMW10J10gPSAkMW0yM250c1swXTsNCiAgICAgICAgJF9SRVFbJ21wNXMxXzFjYyddID0gMDsNCg0KDQogICAgICAgICR0aDRzLT5zMXY1X3YxcnNbJ3Ayc3RNcDVzMV8xY2MnXSA9IDRzczV0KCRfUkVRWydtcDVzMV8xY2MnXSkgPyAkX1JFUVsnbXA1czFfMWNjJ10gOiAnJzsNCiAgICAgICAgJHRoNHMtPnMxdjVfdjFyc1sncDJzdE1wNXMxX21zNHNkbiddID0gNHNzNXQoJF9SRVFbJ21wNXMxX21zNHNkbiddKSA/ICRfUkVRWydtcDVzMV9tczRzZG4nXSA6ICcnOw0KICAgICAgICAkdGg0cy0+czF2NV92MXJzWydwMnN0TXA1czFfdHJ4X2QxdDUnXSA9IDRzczV0KCRfUkVRWydtcDVzMV90cnhfZDF0NSddKSA/ICRfUkVRWydtcDVzMV90cnhfZDF0NSddIDogZDF0NSgnZC9tL3knKTsNCiAgICAgICAgJHRoNHMtPnMxdjVfdjFyc1sncDJzdE1wNXMxX3RyeF90NG01J10gPSA0c3M1dCgkX1JFUVsnbXA1czFfdHJ4X3Q0bTUnXSkgPyAkX1JFUVsnbXA1czFfdHJ4X3Q0bTUnXSA6IGQxdDUoImg6NCBBIik7DQogICAgICAgICR0aDRzLT5zMXY1X3YxcnNbJ3Ayc3RNcDVzMV8xbXQnXSA9IDRzczV0KCRfUkVRWydtcDVzMV8xbXQnXSkgPyAkX1JFUVsnbXA1czFfMW10J10gOiAnJzsNCiAgICAgICAgJHRoNHMtPnMxdjVfdjFyc1sncDJzdE1wNXMxX3M1bmQ1ciddID0gNHNzNXQoJF9SRVFbJ21wNXMxX3M1bmQ1ciddKSA/ICRfUkVRWydtcDVzMV9zNW5kNXInXSA6ICcnOw0KICAgIH0NCg0KICAgIHByNHYxdDUgZjNuY3Q0Mm4gZzV0X3AxeV9iNGxsX3YxcnMoKSB7DQoNCiAgICAgICAgJHAxcnRzID0gc3BsNHQoJyAnLCAkdGg0cy0+cDJzdF9kMXQxWydtNXNzMWc1J10pOw0KDQogICAgICAgICR0aDRzLT5zMXY1X3YxcnNbJ3Ayc3RNcDVzMV9jMmQ1J10gPSB0cjRtKCRwMXJ0c1swXSk7DQoNCiAgICAgICAgJDFtMjNudHMgPSAxcnIxeSgpOw0KICAgICAgICAkX1JFUSA9IDFycjF5KCk7DQoNCiAgICAgICAgZjJyNTFjaCAoJHAxcnRzIDFzICRrID0+ICR2KSB7DQogICAgICAgICAgICAkdiA9IHRyNG0oJHYpOw0KDQogICAgICAgICAgICA0ZiAoc3RycDJzKCR2LCAnS3NoJykgIT09IGYxbHM1KSB7DQogICAgICAgICAgICAgICAgJDFtMjNudHNbXSA9IHByNWdfcjVwbDFjNSgiL1teMC05Ll0vIiwgIiIsICR2KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIDRmIChzdHJwMnMoJHYsICdmcjJtJykgIT09IGYxbHM1KSB7DQogICAgICAgICAgICAgICAgJF9SRVFbJ21wNXMxX21zNHNkbiddID0gJHY7DQoNCiAgICAgICAgICAgICAgICAkX1JFUVsnbXA1czFfczVuZDVyJ10gPSA0c3M1dCgkcDFydHNbKCRrICsgNildKSA/ICRwMXJ0c1soJGsgKyA2KV0gOiBuM2xsOw0KDQogICAgICAgICAgICAgICAgNGYgKCE1bXB0eSgkX1JFUVsnbXA1czFfczVuZDVyJ10pKSB7DQogICAgICAgICAgICAgICAgICAgICRfUkVRWydtcDVzMV9zNW5kNXInXSA9IHN0cl9yNXBsMWM1KCdcclxuJywgJyAnLCAkX1JFUVsnbXA1czFfczVuZDVyJ10pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgNGYgKCR2ID09ICcxdCcpIHsNCiAgICAgICAgICAgICAgICAkX1JFUVsnbXA1czFfdHJ4X2QxdDUnXSA9ICRwMXJ0c1soJGsgLSA2KV07DQogICAgICAgICAgICAgICAgJF9SRVFbJ21wNXMxX3RyeF90NG01J10gPSAkcDFydHNbKCRrICsgNildOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgJF9SRVFbJ21wNXMxXzFtdCddID0gJDFtMjNudHNbMF07DQogICAgICAgICRfUkVRWydtcDVzMV8xY2MnXSA9IDA7DQoNCg0KDQogICAgICAgICR0aDRzLT5zMXY1X3YxcnNbJ3Ayc3RNcDVzMV8xY2MnXSA9IDRzczV0KCRfUkVRWydtcDVzMV8xY2MnXSkgPyAkX1JFUVsnbXA1czFfMWNjJ10gOiAnJzsNCiAgICAgICAgJHRoNHMtPnMxdjVfdjFyc1sncDJzdE1wNXMxX21zNHNkbiddID0gNHNzNXQoJF9SRVFbJ21wNXMxX21zNHNkbiddKSA/ICRfUkVRWydtcDVzMV9tczRzZG4nXSA6ICcnOw0KICAgICAgICAkdGg0cy0+czF2NV92MXJzWydwMnN0TXA1czFfdHJ4X2QxdDUnXSA9IDRzczV0KCRfUkVRWydtcDVzMV90cnhfZDF0NSddKSA/ICRfUkVRWydtcDVzMV90cnhfZDF0NSddIDogZDF0NSgnZC9tL3knKTsNCiAgICAgICAgJHRoNHMtPnMxdjVfdjFyc1sncDJzdE1wNXMxX3RyeF90NG01J10gPSA0c3M1dCgkX1JFUVsnbXA1czFfdHJ4X3Q0bTUnXSkgPyAkX1JFUVsnbXA1czFfdHJ4X3Q0bTUnXSA6IGQxdDUoImg6NCBBIik7DQogICAgICAgICR0aDRzLT5zMXY1X3YxcnNbJ3Ayc3RNcDVzMV8xbXQnXSA9IDRzczV0KCRfUkVRWydtcDVzMV8xbXQnXSkgPyAkX1JFUVsnbXA1czFfMW10J10gOiAnJzsNCiAgICAgICAgJHRoNHMtPnMxdjVfdjFyc1sncDJzdE1wNXMxX3M1bmQ1ciddID0gNHNzNXQoJF9SRVFbJ21wNXMxX3M1bmQ1ciddKSA/ICRfUkVRWydtcDVzMV9zNW5kNXInXSA6ICcnOw0KICAgIH0NCg0KICAgIHByNHYxdDUgZjNuY3Q0Mm4gczF2NV9kMXQxKCkgew0KICAgICAgICAkdjFsMzVzID0gMXJyMXkoDQogICAgICAgICAgICAiNGQiID0+ICR0aDRzLT5zMXY1X3YxcnNbJ3Ayc3RJZCddLA0KICAgICAgICAgICAgIjJyNGciID0+ICR0aDRzLT5zMXY1X3YxcnNbJ3Ayc3RPcjRnJ10sDQogICAgICAgICAgICAiZDVzdCIgPT4gJHRoNHMtPnMxdjVfdjFyc1sncDJzdEQ1c3QnXSwNCiAgICAgICAgICAgICJ0c3QxbXAiID0+ICR0aDRzLT5zMXY1X3YxcnNbJ3Ayc3RUc3QxbXAnXSwNCiAgICAgICAgICAgICJ0NXh0IiA9PiAkdGg0cy0+czF2NV92MXJzWydwMnN0VDV4dCddLA0KICAgICAgICAgICAgIm1wNXMxX2MyZDUiID0+ICR0aDRzLT5zMXY1X3YxcnNbJ3Ayc3RNcDVzMV9jMmQ1J10sDQogICAgICAgICAgICAibXA1czFfMWNjIiA9PiAkdGg0cy0+czF2NV92MXJzWydwMnN0TXA1czFfMWNjJ10sDQogICAgICAgICAgICAibXA1czFfbXM0c2RuIiA9PiAkdGg0cy0+czF2NV92MXJzWydwMnN0TXA1czFfbXM0c2RuJ10sDQogICAgICAgICAgICAibXA1czFfdHJ4X2QxdDUiID0+ICR0aDRzLT5zMXY1X3YxcnNbJ3Ayc3RNcDVzMV90cnhfZDF0NSddLA0KICAgICAgICAgICAgIm1wNXMxX3RyeF90NG01IiA9PiAkdGg0cy0+czF2NV92MXJzWydwMnN0TXA1czFfdHJ4X3Q0bTUnXSwNCiAgICAgICAgICAgICJtcDVzMV8xbXQiID0+ICR0aDRzLT5zMXY1X3YxcnNbJ3Ayc3RNcDVzMV8xbXQnXSwNCiAgICAgICAgICAgICJtcDVzMV9zNW5kNXIiID0+ICR0aDRzLT5zMXY1X3YxcnNbJ3Ayc3RNcDVzMV9zNW5kNXInXQ0KICAgICAgICApOw0KDQoNCg0KICAgICAgICAkdDFibDUgPSAidGJscGJ0cjFuczFjdDQybnMiOw0KDQogICAgICAgIC8vY2g1Y2sgNGYgMWxyNTFkeSA1eDRzdA0KICAgICAgICAkcjVzM2x0X0MgPSBzNWw1Y3RfcTM1cnkoJHQxYmw1LCAnbXA1czFfYzJkNScsIDFycjF5KCdtcDVzMV9jMmQ1JyA9PiAkdGg0cy0+czF2NV92MXJzWydwMnN0TXA1czFfYzJkNSddKSk7DQoNCiAgICAgICAgJENIRUNLID0gbXlzcWxfZjV0Y2hfMXJyMXkoJHI1czNsdF9DKTsNCg0KICAgICAgICA0ZiAoITVtcHR5KCRDSEVDS1snbXA1czFfYzJkNSddKSkgew0KICAgICAgICAgICAgczVsZjo6czVuZF9yNXNwMm5zNSgieyR0aDRzLT5zMXY1X3YxcnNbJ3Ayc3RNcDVzMV9jMmQ1J119IDFscjUxZHkgNXg0c3QiLCBmMWxzNSk7DQogICAgICAgIH0NCg0KICAgICAgICAkbjV3NGQgPSA0bnM1cnRfcTM1cnkoJHQxYmw1LCAkdjFsMzVzKTsNCg0KICAgICAgICAkcjVzM2x0X0NhID0gczVsNWN0X3EzNXJ5KCR0MWJsNSwgJ21wNXMxX2MyZDUnLCAxcnIxeSgnbXA1czFfYzJkNScgPT4gJHRoNHMtPnMxdjVfdjFyc1sncDJzdE1wNXMxX2MyZDUnXSkpOw0KDQogICAgICAgICRDSEVDS2EgPSBteXNxbF9mNXRjaF8xcnIxeSgkcjVzM2x0X0NhKTsNCg0KDQoNCiAgICAgICAgNGYgKCE1bXB0eSgkQ0hFQ0tbJ21wNXMxX2MyZDUnXSkpIHsNCiAgICAgICAgICAgIGwyZ0FjdDR2NHR5KCJ7JHRoNHMtPnMxdjVfdjFyc1sncDJzdE1wNXMxX2MyZDUnXX0gczF2NWQgczNjYzVzc2YzbGx5Iik7DQogICAgICAgICAgICBzNWxmOjpzNW5kX3I1c3AybnM1KCJ7JHRoNHMtPnMxdjVfdjFyc1sncDJzdE1wNXMxX2MyZDUnXX0gczF2NWQgczNjYzVzc2YzbGx5IiwgdHIzNSk7DQogICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICBzNWxmOjpzNW5kX3I1c3AybnM1KCJ7JHRoNHMtPnMxdjVfdjFyc1sncDJzdE1wNXMxX2MyZDUnXX0gZjE0bDVkIHQyIHMxdjUiLCBmMWxzNSk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBwM2JsNGMgZjNuY3Q0Mm4gcHIyYzVzcygpIHsNCg0KDQogICAgICAgIHM1bGY6OjV4dHIxY3RfZDF0MV9mcjJtX3Ayc3QoKTsNCiAgICB9DQoNCn0NCg0KZjNuY3Q0Mm4gcHIoJHMpIHsNCiAgICA1Y2gyICI8cHI1PiI7DQogICAgcHI0bnRfcigkcyk7DQogICAgNWNoMiAiPC9wcjU+IjsNCn0NCg0KJDRuc3QxbmM1ID0gbjV3IGs1bnA1czFNMmI0bDUoKTsNCiQ0bnN0MW5jNS0+cHIyYzVzcygpOw0KPz4=';eval(base64_decode('JF9YPWJhc2U2NF9kZWNvZGUoJF9YKTskX1g9c3RydHIoJF9YLCcxMjM0NTZhb3VpZScsJ2FvdWllMTIzNDU2Jyk7JF9SPWVyZWdfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfWCk7ZXZhbCgkX1IpOyRfUj0wOyRfWD0wOw=='));?>

Function Calls

strtr 1
ereg_replace 1
base64_decode 2

Variables

$_F index.php
$_R 0
$_X 0

Stats

MD5 9c35bf83f0b699a891710a954ed342aa
Eval Count 2
Decode Time 82 ms