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 eval("?>".base64_decode("PD9waHAgaWYgKCAhIGRlZmluZWQoJ0JBU0VQQVRIJykpIGV4aXQoJ05vIGR..
Decoded Output download
?>b'<?php if ( ! defined(\'BASEPATH\')) exit(\'No direct script access allowed\');
class Acruals extends CI_Controller {
function __construct(){
parent::__construct();
}
function registerAccountsPayables()
{
if($_SESSION[\'lang\'] ==\'English\')
{
$this->top_views();
$this->load->view(\'en/acruals/register_accounts_payables_view\');
$this->footer_views();
$this->forms_views();
}
else
{
$this->top_views();
$this->load->view(\'acruals/register_accounts_payables_view\');
$this->footer_views();
$this->forms_views();
}
}
function registerIncomeAccountsPayables()
{
if($_SESSION[\'lang\'] ==\'English\')
{
$this->top_views();
$this->load->view(\'en/acruals/register_incomeaccounts_payables_view\');
$this->footer_views();
$this->forms_views();
}
else
{
$this->top_views();
$this->load->view(\'acruals/register_incomeaccounts_payables_view\');
$this->footer_views();
$this->forms_views();
}
}
function recordAcrualPayments()
{
$data[\'acrual_accounts\'] = $this->db->get("accruals_accounts")->result();
if($_SESSION[\'lang\'] ==\'English\')
{
$this->top_views();
$this->load->view(\'en/acruals/record_acrualpayments_view\', $data);
$this->footer_views();
$this->forms_views();
}
else
{
$this->top_views();
$this->load->view(\'acruals/record_acrualpayments_view\');
$this->footer_views();
$this->forms_views();
}
}
function recordAcrualIncome()
{
$data[\'acrual_accounts\'] = $this->db->get("accruals_incomeaccounts")->result();
if($_SESSION[\'lang\'] ==\'English\')
{
$this->top_views();
$this->load->view(\'en/acruals/record_acrualincome_view\', $data);
$this->footer_views();
$this->forms_views();
}
else
{
$this->top_views();
$this->load->view(\'acruals/record_acrualincome_view\');
$this->footer_views();
$this->forms_views();
}
}
function recordImprestPayments()
{
$data[\'employees\'] = $this->db->get("employees")->result();
$data[\'categories\'] = $this->db->get("imprest_categories")->result();
if($_SESSION[\'lang\'] ==\'English\')
{
$this->top_views();
$this->load->view(\'en/acruals/record_imprestpayments_view\', $data);
$this->footer_views();
$this->forms_views();
}
else
{
$this->top_views();
$this->load->view(\'acruals/record_imprestpayments_view\');
$this->footer_views();
$this->forms_views();
}
}
function processRegisterAccountsPayables()
{
$query = $this->db->insert("accruals_accounts", $_POST);
if($query)
{
$_SESSION[\'msg\'] = "<h4 class=\'session_msg\'>Registered successfully</b></h4>";
redirect($_SESSION[\'current_url\']);
}
else
{
$_SESSION[\'msg\'] = "<h4 class=\'session_msg\'>Failed to register, try again</h4>";
redirect($_SESSION[\'current_url\']);
}
}
function processRegisterIncomeAccountsPayables()
{
$query = $this->db->insert("accruals_incomeaccounts", $_POST);
if($query)
{
$_SESSION[\'msg\'] = "<h4 class=\'session_msg\'>Registered successfully</b></h4>";
redirect($_SESSION[\'current_url\']);
}
else
{
$_SESSION[\'msg\'] = "<h4 class=\'session_msg\'>Failed to register, try again</h4>";
redirect($_SESSION[\'current_url\']);
}
}
function viewAccountsPayables()
{
$data[\'accounts\'] = $this->db->get("accruals_accounts")->result();
if($_SESSION[\'lang\'] ==\'English\')
{
$this->top_views();
$this->load->view(\'en/acruals/accountspayables_view\', $data);
$this->footer_views();
$this->forms_views();
}
else
{
$this->top_views();
$this->load->view(\'acruals/accountspayables_view\');
$this->footer_views();
$this->forms_views();
}
}
function viewIncomeAccountsPayables()
{
$data[\'accounts\'] = $this->db->get("accruals_incomeaccounts")->result();
if($_SESSION[\'lang\'] ==\'English\')
{
$this->top_views();
$this->load->view(\'en/acruals/accountspayablesincome_view\', $data);
$this->footer_views();
$this->forms_views();
}
else
{
$this->top_views();
$this->load->view(\'acruals/accountspayablesincome_view\');
$this->footer_views();
$this->forms_views();
}
}
function processRecordAcrualPayments()
{
$amount = $_POST[\'amount\'];
$accrual_ac_id = $_POST[\'accrual_ac_id\'];
$benk_taslimu = $_POST[\'benk_taslimu\'];
$bank_id = $_POST[\'bank_id\'];
$date = $_POST[\'date\'];
$cheque = $_POST[\'cheque\'];
$flag = "acrual".time();
$last_number = $this->matumizi_model->getPVLastNumber();
$new_number = $last_number+1;
if($new_number < 10)
{
$pv_number = "000".$new_number;
}
else if($new_number < 100)
{
$pv_number = "00".$new_number;
}
else if($new_number < 1000)
{
$pv_number = "0".$new_number;
}
else
{
$pv_number = $new_number;
}
$balance = $this->matumizi_model->getAccrualAccountBalance($accrual_ac_id, strtotime($date));
if($balance >= $amount)
{
$this->db->trans_begin(); //begin transactions
$data = array(
"amount"=>$amount,
"expense_type_id"=>0,
"flag"=>$flag,
"accId"=>$accrual_ac_id,
"userId"=>$_SESSION[\'fbuser_id\'],
"type"=>"reduce",
"cheque"=>$cheque,
"receipt"=>$pv_number,
"rdate"=>strtotime($date)
);
$this->db->insert("acrual_transactions", $data);
$day = date("d", strtotime($date));
$month = date("m", strtotime($date));
$year = date("Y", strtotime($date));
$data2 = array(
\'day\' =>$day,
\'month\' =>$month,
\'year\' =>$year,
\'date_seconds\' =>strtotime($date),
\'amount\' =>$amount,
\'transact_type\' =>"expense",
\'flag\' =>$flag,
\'bank_id\' =>$bank_id,
\'details\' =>"Acrual"
);
$this->income_model->insert_data($benk_taslimu."_transactions", $data2);
if($this->db->trans_status() === FALSE)
{
$this->db->trans_rollback();
$_SESSION[\'msg\'] = "<h4 class=\'session_msg\'>Try again please</h4>";
redirect($_SESSION[\'current_url\']);
}
else
{
$this->db->trans_commit();
$_SESSION[\'msg\'] = "<h4 class=\'session_msg\'>Recorded successfully</h4>";
redirect($_SESSION[\'current_url\']);
}
}
else
{
$_SESSION[\'msg\'] = "<h4 class=\'session_msg\'>Pending balance(".number_format($balance, 2).") is less than the amount you entered(".number_format($amount, 2).")</h4>";
redirect($_SESSION[\'current_url\']);
}
}
function processRecordAcrualIncomes()
{
$amount = $_POST[\'amount\'];
$accrual_ac_id = $_POST[\'accrual_ac_id\'];
$benk_taslimu = $_POST[\'benk_taslimu\'];
$bank_id = $_POST[\'bank_id\'];
$date = $_POST[\'date\'];
$cheque = $_POST[\'cheque\'];
$flag = "acrual".time();
$last_number = $this->income_model->getReceiptLastNumber();
$new_number = $last_number+1;
if($new_number < 10)
{
$receipt_number = "000".$new_number;
}
else if($new_number < 100)
{
$receipt_number = "00".$new_number;
}
else if($new_number < 1000)
{
$receipt_number = "0".$new_number;
}
else
{
$receipt_number = $new_number;
}
$balance = $this->income_model->getAccrualAccountBalanceIncome($accrual_ac_id, strtotime($date));
if($balance >= $amount)
{
$this->db->trans_begin(); //begin transactions
$data = array(
"amount"=>$amount,
"income_type_id"=>0,
"flag"=>$flag,
"accId"=>$accrual_ac_id,
"userId"=>$_SESSION[\'fbuser_id\'],
"type"=>"reduce",
"cheque"=>$cheque,
"receipt"=>"NA",
"rdate"=>strtotime($date)
);
$this->db->insert("acrual_incometransactions", $data);
$day = date("d", strtotime($date));
$month = date("m", strtotime($date));
$year = date("Y", strtotime($date));
$data2 = array(
\'day\' =>$day,
\'month\' =>$month,
\'year\' =>$year,
\'date_seconds\' =>strtotime($date),
\'amount\' =>$amount,
\'transact_type\' =>"income",
\'flag\' =>$flag,
\'bank_id\' =>$bank_id,
\'details\' =>"Acrual"
);
$this->income_model->insert_data($benk_taslimu."_transactions", $data2);
$this->income_model->updateReceiptLastNumber($new_number);
if($this->db->trans_status() === FALSE)
{
$this->db->trans_rollback();
$_SESSION[\'msg\'] = "<h4 class=\'session_msg\'>Try again please</h4>";
redirect($_SESSION[\'current_url\']);
}
else
{
$this->db->trans_commit();
$_SESSION[\'msg\'] = "<h4 class=\'session_msg\'>Recorded successfully</h4>";
redirect($_SESSION[\'current_url\']);
}
}
else
{
$_SESSION[\'msg\'] = "<h4 class=\'session_msg\'>Pending balance(".number_format($balance, 2).") is less than the amount you entered(".number_format($amount, 2).")</h4>";
redirect($_SESSION[\'current_url\']);
}
}
function processRecordImprestPayments()
{
$category_id = $_POST[\'category_id\'];
$amount = $_POST[\'amount\'];
$empId = $_POST[\'empId\'];
$benk_taslimu = $_POST[\'benk_taslimu\'];
$bank_id = $_POST[\'bank_id\'];
$date = $_POST[\'date\'];
$cheque = $_POST[\'cheque\'];
$flag = "imprest".time();
$last_number = $this->matumizi_model->getPVLastNumber();
$new_number = $last_number+1;
if($new_number < 10)
{
$pv_number = "000".$new_number;
}
else if($new_number < 100)
{
$pv_number = "00".$new_number;
}
else if($new_number < 1000)
{
$pv_number = "0".$new_number;
}
else
{
$pv_number = $new_number;
}
$balance = $this->matumizi_model->getImprestBalance($empId, strtotime($date), $category_id);
$this->db->trans_begin(); //begin transactions
$data = array(
"category_id"=>$category_id,
"amount"=>$amount,
"expense_type_id"=>0,
"flag"=>$flag,
"empId"=>$empId,
"userId"=>$_SESSION[\'fbuser_id\'],
"type"=>"add",
"cheque"=>$cheque,
"receipt"=>$pv_number,
"rdate"=>strtotime($date)
);
$this->db->insert("imprest_transactions", $data);
$day = date("d", strtotime($date));
$month = date("m", strtotime($date));
$year = date("Y", strtotime($date));
$data2 = array(
\'day\' =>$day,
\'month\' =>$month,
\'year\' =>$year,
\'date_seconds\' =>strtotime($date),
\'amount\' =>$amount,
\'transact_type\' =>"expense",
\'flag\' =>$flag,
\'bank_id\' =>$bank_id,
\'details\' =>"Imprest"
);
$this->income_model->insert_data($benk_taslimu."_transactions", $data2);
if($this->db->trans_status() === FALSE)
{
$this->db->trans_rollback();
$_SESSION[\'msg\'] = "<h4 class=\'session_msg\'>Try again please</h4>";
redirect($_SESSION[\'current_url\']);
}
else
{
$this->db->trans_commit();
$_SESSION[\'msg\'] = "<h4 class=\'session_msg\'>Recorded successfully</h4>";
redirect($_SESSION[\'current_url\']);
}
}
function imprestBalances()
{
$data[\'employees\'] = $this->db->get(\'employees\')->result();
$data[\'categories\'] = $this->db->get(\'imprest_categories\')->result();
if($_SESSION[\'lang\'] ==\'English\')
{
$this->top_views();
$this->load->view(\'en/acruals/imprestbalances_view\', $data);
$this->footer_views();
$this->forms_views();
}
else
{
$this->top_views();
$this->load->view(\'acruals/imprestbalances_view\', $data);
$this->footer_views();
$this->forms_views();
}
}
function viewAcrualPayments()
{
}
function viewAcrualIncome()
{
$from_date = $this->uri->segment(3);
$to_date = $this->uri->segment(4);
if($from_date !="" and $to_date !="")
{
$rows = $this->income_model->getAcrualIncomeRecordsRows(strtotime($from_date), strtotime($to_date));
$config[\'base_url\'] = base_url().\'index.php/acruals/viewAcrualIncome/\'.$from_date."/".$to_date; //set the base url for pagination
$config[\'total_rows\'] = $rows; //total rows
$config[\'per_page\'] = 200; //the number of per page for pagination
$config[\'uri_segment\'] = 4; //see from base_url. 3 for this case
$config[\'full_tag_open\'] = "<p class=\'pag_navs\'>";
$config[\'full_tag_close\'] = "</p>";
$config[\'first_link\'] = TRUE;
$config[\'last_link\'] = TRUE;
$config[\'display_pages\'] = TRUE;
$config[\'cur_tag_open\'] = "<a href=\'#\' id=\'current_pg\'>";
$config[\'cur_tag_close\'] = \'</a>\';
$config[\'next_link\'] = \'Next»\';
$config[\'prev_link\'] = \'«Prev\';
$this->pagination->initialize($config); //initialize pagination
$data[\'records\'] = $this->income_model->getAcrualIncomeRecords(strtotime($from_date), strtotime($to_date), $config[\'per_page\'], $this->uri->segment(5));
$data[\'period\'] = "<h4 class=\'session_msg\'>ACRUAL INCOME RECORDS FROM ".$from_date." TO ".$to_date."</h4>";
}
else
{
$data = array();
}
if($_SESSION[\'lang\'] ==\'English\')
{
$this->top_views();
$this->load->view(\'en/acruals/acrualincome_records_view\', $data);
$this->footer_views();
$this->forms_views();
}
else
{
$this->top_views();
$this->load->view(\'acruals/acrualincome_records_view\', $data);
$this->footer_views();
$this->forms_views();
}
}
function viewImprestsRecords()
{
$from_date = $this->uri->segment(3);
$to_date = $this->uri->segment(4);
if($from_date !="" and $to_date !="")
{
$rows = $this->income_model->getImprestRecords_rows(strtotime($from_date), strtotime($to_date));
$config[\'base_url\'] = base_url().\'index.php/acruals/viewImprestsRecords/\'.$from_date."/".$to_date; //set the base url for pagination
$config[\'total_rows\'] = $rows; //total rows
$config[\'per_page\'] = 200; //the number of per page for pagination
$config[\'uri_segment\'] = 4; //see from base_url. 3 for this case
$config[\'full_tag_open\'] = "<p class=\'pag_navs\'>";
$config[\'full_tag_close\'] = "</p>";
$config[\'first_link\'] = TRUE;
$config[\'last_link\'] = TRUE;
$config[\'display_pages\'] = TRUE;
$config[\'cur_tag_open\'] = "<a href=\'#\' id=\'current_pg\'>";
$config[\'cur_tag_close\'] = \'</a>\';
$config[\'next_link\'] = \'Next»\';
$config[\'prev_link\'] = \'«Prev\';
$this->pagination->initialize($config); //initialize pagination
$data[\'records\'] = $this->income_model->getImprestRecords(strtotime($from_date), strtotime($to_date), $config[\'per_page\'], $this->uri->segment(5));
$data[\'period\'] = "<h4 class=\'session_msg\'>IMPREST RECORDS FROM ".$from_date." TO ".$to_date."</h4>";
}
else
{
$data = array();
}
if($_SESSION[\'lang\'] ==\'English\')
{
$this->top_views();
$this->load->view(\'en/acruals/imprest_records_view\', $data);
$this->footer_views();
$this->forms_views();
}
else
{
$this->top_views();
$this->load->view(\'acruals/imprest_records_view\', $data);
$this->footer_views();
$this->forms_views();
}
}
function removeAccountReceivable()
{
if($_SESSION[\'fballow_edit\'] !="Y")
{
$_SESSION[\'msg\'] = "<h4 class=\'session_msg\'>Deletion disabled</h4>";
redirect($_SESSION[\'current_url\']);
}
$accountId = $this->uri->segment(3);
$balance = $this->income_model->getAccrualAccountBalanceIncome($accountId, strtotime(date("d-m-Y")));
if($balance==0)
{
$query = $this->db->where(array("accountId"=>$accountId))->delete("accruals_incomeaccounts");
if($query)
{
$_SESSION[\'msg\'] = "<h4 class=\'session_msg\'>Deleted successfully</h4>";
redirect($_SESSION[\'current_url\']);
}
else
{
$_SESSION[\'msg\'] = "<h4 class=\'session_msg\'>Try again please!</h4>";
redirect($_SESSION[\'current_url\']);
}
}
else
{
$_SESSION[\'msg\'] = "<h4 class=\'session_msg\'>Cannot delete this account, it has pending balance</h4>";
redirect($_SESSION[\'current_url\']);
}
}
function removeAccountPayable()
{
if($_SESSION[\'fballow_edit\'] !="Y")
{
$_SESSION[\'msg\'] = "<h4 class=\'session_msg\'>Deletion disabled</h4>";
redirect($_SESSION[\'current_url\']);
}
$accountId = $this->uri->segment(3);
$balance = $this->matumizi_model->getAccrualAccountBalance($accountId, strtotime(date("d-m-Y")));
if($balance==0)
{
$query = $this->db->where(array("accountId"=>$accountId))->delete("accruals_accounts");
if($query)
{
$_SESSION[\'msg\'] = "<h4 class=\'session_msg\'>Deleted successfully</h4>";
redirect($_SESSION[\'current_url\']);
}
else
{
$_SESSION[\'msg\'] = "<h4 class=\'session_msg\'>Try again please!</h4>";
redirect($_SESSION[\'current_url\']);
}
}
else
{
$_SESSION[\'msg\'] = "<h4 class=\'session_msg\'>Cannot delete this account, it has pending balance</h4>";
redirect($_SESSION[\'current_url\']);
}
}
//page forms function
function forms_views(){
if($_SESSION[\'lang\'] ==\'English\')
{
$this->load->view(\'en/usersmembers_forms_view\');
$this->load->view(\'en/settings_forms_view\');
}
else
{
$this->load->view(\'usersmembers_forms_view\');
$this->load->view(\'settings_forms_view\');
}
}
function top_views(){
if($_SESSION[\'lang\'] ==\'English\')
{
$this->load->view(\'en/sections/header\');
$this->load->view(\'en/sections/menu\');
}
else
{
$this->load->view(\'sections/header\');
$this->load->view(\'sections/menu\');
}
}
function footer_views(){
if($_SESSION[\'lang\'] ==\'English\')
{
$this->load->view(\'en/sections/footer\');
}
else
{
$this->load->view(\'en/sections/footer\');
}
}
}
/* End of file Matumizi.php */
/* Location: ./application/controllers/Matumizi.php */
'
Did this file decode correctly?
Original Code
<?php eval("?>".base64_decode("PD9waHAgaWYgKCAhIGRlZmluZWQoJ0JBU0VQQVRIJykpIGV4aXQoJ05vIGRpcmVjdCBzY3JpcHQgYWNjZXNzIGFsbG93ZWQnKTsNCmNsYXNzIEFjcnVhbHMgZXh0ZW5kcyBDSV9Db250cm9sbGVyIHsNCglmdW5jdGlvbiBfX2NvbnN0cnVjdCgpew0KCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCk7DQoJfQ0KCQ0KCWZ1bmN0aW9uIHJlZ2lzdGVyQWNjb3VudHNQYXlhYmxlcygpDQoJew0KCQlpZigkX1NFU1NJT05bJ2xhbmcnXSA9PSdFbmdsaXNoJykNCgkJew0KCQkJJHRoaXMtPnRvcF92aWV3cygpOw0KCQkJJHRoaXMtPmxvYWQtPnZpZXcoJ2VuL2FjcnVhbHMvcmVnaXN0ZXJfYWNjb3VudHNfcGF5YWJsZXNfdmlldycpOw0KCQkJJHRoaXMtPmZvb3Rlcl92aWV3cygpOw0KCQkJJHRoaXMtPmZvcm1zX3ZpZXdzKCk7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkdGhpcy0+dG9wX3ZpZXdzKCk7DQoJCQkkdGhpcy0+bG9hZC0+dmlldygnYWNydWFscy9yZWdpc3Rlcl9hY2NvdW50c19wYXlhYmxlc192aWV3Jyk7DQoJCQkkdGhpcy0+Zm9vdGVyX3ZpZXdzKCk7DQoJCQkkdGhpcy0+Zm9ybXNfdmlld3MoKTsNCgkJfQ0KCX0NCglmdW5jdGlvbiByZWdpc3RlckluY29tZUFjY291bnRzUGF5YWJsZXMoKQ0KCXsNCgkJaWYoJF9TRVNTSU9OWydsYW5nJ10gPT0nRW5nbGlzaCcpDQoJCXsNCgkJCSR0aGlzLT50b3Bfdmlld3MoKTsNCgkJCSR0aGlzLT5sb2FkLT52aWV3KCdlbi9hY3J1YWxzL3JlZ2lzdGVyX2luY29tZWFjY291bnRzX3BheWFibGVzX3ZpZXcnKTsNCgkJCSR0aGlzLT5mb290ZXJfdmlld3MoKTsNCgkJCSR0aGlzLT5mb3Jtc192aWV3cygpOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJHRoaXMtPnRvcF92aWV3cygpOw0KCQkJJHRoaXMtPmxvYWQtPnZpZXcoJ2FjcnVhbHMvcmVnaXN0ZXJfaW5jb21lYWNjb3VudHNfcGF5YWJsZXNfdmlldycpOw0KCQkJJHRoaXMtPmZvb3Rlcl92aWV3cygpOw0KCQkJJHRoaXMtPmZvcm1zX3ZpZXdzKCk7DQoJCX0NCgl9DQoJZnVuY3Rpb24gcmVjb3JkQWNydWFsUGF5bWVudHMoKQ0KCXsNCgkJJGRhdGFbJ2FjcnVhbF9hY2NvdW50cyddID0gJHRoaXMtPmRiLT5nZXQoImFjY3J1YWxzX2FjY291bnRzIiktPnJlc3VsdCgpOw0KCQlpZigkX1NFU1NJT05bJ2xhbmcnXSA9PSdFbmdsaXNoJykNCgkJew0KCQkJJHRoaXMtPnRvcF92aWV3cygpOw0KCQkJJHRoaXMtPmxvYWQtPnZpZXcoJ2VuL2FjcnVhbHMvcmVjb3JkX2FjcnVhbHBheW1lbnRzX3ZpZXcnLCAkZGF0YSk7DQoJCQkkdGhpcy0+Zm9vdGVyX3ZpZXdzKCk7DQoJCQkkdGhpcy0+Zm9ybXNfdmlld3MoKTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSR0aGlzLT50b3Bfdmlld3MoKTsNCgkJCSR0aGlzLT5sb2FkLT52aWV3KCdhY3J1YWxzL3JlY29yZF9hY3J1YWxwYXltZW50c192aWV3Jyk7DQoJCQkkdGhpcy0+Zm9vdGVyX3ZpZXdzKCk7DQoJCQkkdGhpcy0+Zm9ybXNfdmlld3MoKTsNCgkJfQ0KCX0NCglmdW5jdGlvbiByZWNvcmRBY3J1YWxJbmNvbWUoKQ0KCXsNCgkJJGRhdGFbJ2FjcnVhbF9hY2NvdW50cyddID0gJHRoaXMtPmRiLT5nZXQoImFjY3J1YWxzX2luY29tZWFjY291bnRzIiktPnJlc3VsdCgpOw0KCQlpZigkX1NFU1NJT05bJ2xhbmcnXSA9PSdFbmdsaXNoJykNCgkJew0KCQkJJHRoaXMtPnRvcF92aWV3cygpOw0KCQkJJHRoaXMtPmxvYWQtPnZpZXcoJ2VuL2FjcnVhbHMvcmVjb3JkX2FjcnVhbGluY29tZV92aWV3JywgJGRhdGEpOw0KCQkJJHRoaXMtPmZvb3Rlcl92aWV3cygpOw0KCQkJJHRoaXMtPmZvcm1zX3ZpZXdzKCk7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkdGhpcy0+dG9wX3ZpZXdzKCk7DQoJCQkkdGhpcy0+bG9hZC0+dmlldygnYWNydWFscy9yZWNvcmRfYWNydWFsaW5jb21lX3ZpZXcnKTsNCgkJCSR0aGlzLT5mb290ZXJfdmlld3MoKTsNCgkJCSR0aGlzLT5mb3Jtc192aWV3cygpOw0KCQl9DQoJfQ0KCWZ1bmN0aW9uIHJlY29yZEltcHJlc3RQYXltZW50cygpDQoJew0KCQkkZGF0YVsnZW1wbG95ZWVzJ10gCT0gJHRoaXMtPmRiLT5nZXQoImVtcGxveWVlcyIpLT5yZXN1bHQoKTsNCgkJJGRhdGFbJ2NhdGVnb3JpZXMnXSA9ICR0aGlzLT5kYi0+Z2V0KCJpbXByZXN0X2NhdGVnb3JpZXMiKS0+cmVzdWx0KCk7DQoJCWlmKCRfU0VTU0lPTlsnbGFuZyddID09J0VuZ2xpc2gnKQ0KCQl7DQoJCQkkdGhpcy0+dG9wX3ZpZXdzKCk7DQoJCQkkdGhpcy0+bG9hZC0+dmlldygnZW4vYWNydWFscy9yZWNvcmRfaW1wcmVzdHBheW1lbnRzX3ZpZXcnLCAkZGF0YSk7DQoJCQkkdGhpcy0+Zm9vdGVyX3ZpZXdzKCk7DQoJCQkkdGhpcy0+Zm9ybXNfdmlld3MoKTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSR0aGlzLT50b3Bfdmlld3MoKTsNCgkJCSR0aGlzLT5sb2FkLT52aWV3KCdhY3J1YWxzL3JlY29yZF9pbXByZXN0cGF5bWVudHNfdmlldycpOw0KCQkJJHRoaXMtPmZvb3Rlcl92aWV3cygpOw0KCQkJJHRoaXMtPmZvcm1zX3ZpZXdzKCk7DQoJCX0NCgl9DQoJZnVuY3Rpb24gcHJvY2Vzc1JlZ2lzdGVyQWNjb3VudHNQYXlhYmxlcygpDQoJew0KCQkkcXVlcnkgPSAkdGhpcy0+ZGItPmluc2VydCgiYWNjcnVhbHNfYWNjb3VudHMiLCAkX1BPU1QpOw0KCQlpZigkcXVlcnkpDQoJCXsNCgkJCSRfU0VTU0lPTlsnbXNnJ10gPSAiPGg0IGNsYXNzPSdzZXNzaW9uX21zZyc+UmVnaXN0ZXJlZCBzdWNjZXNzZnVsbHk8L2I+PC9oND4iOw0KCQkJcmVkaXJlY3QoJF9TRVNTSU9OWydjdXJyZW50X3VybCddKTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSRfU0VTU0lPTlsnbXNnJ10gPSAiPGg0IGNsYXNzPSdzZXNzaW9uX21zZyc+RmFpbGVkIHRvIHJlZ2lzdGVyLCB0cnkgYWdhaW48L2g0PiI7DQoJCQlyZWRpcmVjdCgkX1NFU1NJT05bJ2N1cnJlbnRfdXJsJ10pOw0KCQl9DQoJfQ0KCWZ1bmN0aW9uIHByb2Nlc3NSZWdpc3RlckluY29tZUFjY291bnRzUGF5YWJsZXMoKQ0KCXsNCgkJJHF1ZXJ5ID0gJHRoaXMtPmRiLT5pbnNlcnQoImFjY3J1YWxzX2luY29tZWFjY291bnRzIiwgJF9QT1NUKTsNCgkJaWYoJHF1ZXJ5KQ0KCQl7DQoJCQkkX1NFU1NJT05bJ21zZyddID0gIjxoNCBjbGFzcz0nc2Vzc2lvbl9tc2cnPlJlZ2lzdGVyZWQgc3VjY2Vzc2Z1bGx5PC9iPjwvaDQ+IjsNCgkJCXJlZGlyZWN0KCRfU0VTU0lPTlsnY3VycmVudF91cmwnXSk7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkX1NFU1NJT05bJ21zZyddID0gIjxoNCBjbGFzcz0nc2Vzc2lvbl9tc2cnPkZhaWxlZCB0byByZWdpc3RlciwgdHJ5IGFnYWluPC9oND4iOw0KCQkJcmVkaXJlY3QoJF9TRVNTSU9OWydjdXJyZW50X3VybCddKTsNCgkJfQ0KCX0NCglmdW5jdGlvbiB2aWV3QWNjb3VudHNQYXlhYmxlcygpDQoJew0KCQkkZGF0YVsnYWNjb3VudHMnXSA9ICR0aGlzLT5kYi0+Z2V0KCJhY2NydWFsc19hY2NvdW50cyIpLT5yZXN1bHQoKTsNCgkJaWYoJF9TRVNTSU9OWydsYW5nJ10gPT0nRW5nbGlzaCcpDQoJCXsNCgkJCSR0aGlzLT50b3Bfdmlld3MoKTsNCgkJCSR0aGlzLT5sb2FkLT52aWV3KCdlbi9hY3J1YWxzL2FjY291bnRzcGF5YWJsZXNfdmlldycsICRkYXRhKTsNCgkJCSR0aGlzLT5mb290ZXJfdmlld3MoKTsNCgkJCSR0aGlzLT5mb3Jtc192aWV3cygpOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJHRoaXMtPnRvcF92aWV3cygpOw0KCQkJJHRoaXMtPmxvYWQtPnZpZXcoJ2FjcnVhbHMvYWNjb3VudHNwYXlhYmxlc192aWV3Jyk7DQoJCQkkdGhpcy0+Zm9vdGVyX3ZpZXdzKCk7DQoJCQkkdGhpcy0+Zm9ybXNfdmlld3MoKTsNCgkJfQ0KCX0NCglmdW5jdGlvbiB2aWV3SW5jb21lQWNjb3VudHNQYXlhYmxlcygpDQoJew0KCQkkZGF0YVsnYWNjb3VudHMnXSA9ICR0aGlzLT5kYi0+Z2V0KCJhY2NydWFsc19pbmNvbWVhY2NvdW50cyIpLT5yZXN1bHQoKTsNCgkJaWYoJF9TRVNTSU9OWydsYW5nJ10gPT0nRW5nbGlzaCcpDQoJCXsNCgkJCSR0aGlzLT50b3Bfdmlld3MoKTsNCgkJCSR0aGlzLT5sb2FkLT52aWV3KCdlbi9hY3J1YWxzL2FjY291bnRzcGF5YWJsZXNpbmNvbWVfdmlldycsICRkYXRhKTsNCgkJCSR0aGlzLT5mb290ZXJfdmlld3MoKTsNCgkJCSR0aGlzLT5mb3Jtc192aWV3cygpOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJHRoaXMtPnRvcF92aWV3cygpOw0KCQkJJHRoaXMtPmxvYWQtPnZpZXcoJ2FjcnVhbHMvYWNjb3VudHNwYXlhYmxlc2luY29tZV92aWV3Jyk7DQoJCQkkdGhpcy0+Zm9vdGVyX3ZpZXdzKCk7DQoJCQkkdGhpcy0+Zm9ybXNfdmlld3MoKTsNCgkJfQ0KCX0NCglmdW5jdGlvbiBwcm9jZXNzUmVjb3JkQWNydWFsUGF5bWVudHMoKQ0KCXsNCgkJJGFtb3VudCAJCT0gJF9QT1NUWydhbW91bnQnXTsNCgkJJGFjY3J1YWxfYWNfaWQgCT0gJF9QT1NUWydhY2NydWFsX2FjX2lkJ107DQoJCSRiZW5rX3Rhc2xpbXUgCT0gJF9QT1NUWydiZW5rX3Rhc2xpbXUnXTsNCgkJJGJhbmtfaWQgCQk9ICRfUE9TVFsnYmFua19pZCddOw0KCQkkZGF0ZSAJCQk9ICRfUE9TVFsnZGF0ZSddOw0KCQkkY2hlcXVlIAkJPSAkX1BPU1RbJ2NoZXF1ZSddOw0KCQkkZmxhZwkJCT0gImFjcnVhbCIudGltZSgpOwkNCgkJJGxhc3RfbnVtYmVyCT0gJHRoaXMtPm1hdHVtaXppX21vZGVsLT5nZXRQVkxhc3ROdW1iZXIoKTsNCgkJJG5ld19udW1iZXIJCT0gJGxhc3RfbnVtYmVyKzE7DQoJCWlmKCRuZXdfbnVtYmVyIDwgMTApDQoJCXsNCgkJCSRwdl9udW1iZXIgPSAiMDAwIi4kbmV3X251bWJlcjsNCgkJfQ0KCQllbHNlIGlmKCRuZXdfbnVtYmVyIDwgMTAwKQ0KCQl7DQoJCQkkcHZfbnVtYmVyID0gIjAwIi4kbmV3X251bWJlcjsNCgkJfQ0KCQllbHNlIGlmKCRuZXdfbnVtYmVyIDwgMTAwMCkNCgkJew0KCQkJJHB2X251bWJlciA9ICIwIi4kbmV3X251bWJlcjsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSRwdl9udW1iZXIgPSAkbmV3X251bWJlcjsNCgkJfQ0KCQkNCgkJJGJhbGFuY2UgPSAkdGhpcy0+bWF0dW1pemlfbW9kZWwtPmdldEFjY3J1YWxBY2NvdW50QmFsYW5jZSgkYWNjcnVhbF9hY19pZCwgc3RydG90aW1lKCRkYXRlKSk7DQoJCWlmKCRiYWxhbmNlID49ICRhbW91bnQpDQoJCXsNCgkJCSR0aGlzLT5kYi0+dHJhbnNfYmVnaW4oKTsgLy9iZWdpbiB0cmFuc2FjdGlvbnMJDQoJCQkJJGRhdGEgPSBhcnJheSgNCgkJCQkJImFtb3VudCI9PiRhbW91bnQsDQoJCQkJCSJleHBlbnNlX3R5cGVfaWQiPT4wLA0KCQkJCQkiZmxhZyI9PiRmbGFnLA0KCQkJCQkiYWNjSWQiPT4kYWNjcnVhbF9hY19pZCwNCgkJCQkJInVzZXJJZCI9PiRfU0VTU0lPTlsnZmJ1c2VyX2lkJ10sDQoJCQkJCSJ0eXBlIj0+InJlZHVjZSIsDQoJCQkJCSJjaGVxdWUiPT4kY2hlcXVlLA0KCQkJCQkicmVjZWlwdCI9PiRwdl9udW1iZXIsDQoJCQkJCSJyZGF0ZSI9PnN0cnRvdGltZSgkZGF0ZSkNCgkJCQkpOw0KCQkJCSR0aGlzLT5kYi0+aW5zZXJ0KCJhY3J1YWxfdHJhbnNhY3Rpb25zIiwgJGRhdGEpOw0KCQkJCSRkYXkgCQk9IGRhdGUoImQiLCBzdHJ0b3RpbWUoJGRhdGUpKTsNCgkJCQkkbW9udGggCQk9IGRhdGUoIm0iLCBzdHJ0b3RpbWUoJGRhdGUpKTsNCgkJCQkkeWVhciAJCT0gZGF0ZSgiWSIsIHN0cnRvdGltZSgkZGF0ZSkpOw0KCQkJCSRkYXRhMiA9IGFycmF5KA0KCQkJCQknZGF5JwkJCQk9PiRkYXksDQoJCQkJCSdtb250aCcJCQkJPT4kbW9udGgsDQoJCQkJCSd5ZWFyJwkJCQk9PiR5ZWFyLA0KCQkJCQknZGF0ZV9zZWNvbmRzJwkJPT5zdHJ0b3RpbWUoJGRhdGUpLA0KCQkJCQknYW1vdW50JwkJCT0+JGFtb3VudCwNCgkJCQkJJ3RyYW5zYWN0X3R5cGUnCQk9PiJleHBlbnNlIiwNCgkJCQkJJ2ZsYWcnCQkJCT0+JGZsYWcsDQoJCQkJCSdiYW5rX2lkJwkJCT0+JGJhbmtfaWQsDQoJCQkJCSdkZXRhaWxzJwkJCT0+IkFjcnVhbCINCgkJCQkpOw0KCQkJCSR0aGlzLT5pbmNvbWVfbW9kZWwtPmluc2VydF9kYXRhKCRiZW5rX3Rhc2xpbXUuIl90cmFuc2FjdGlvbnMiLCAkZGF0YTIpOw0KCQkJaWYoJHRoaXMtPmRiLT50cmFuc19zdGF0dXMoKSA9PT0gRkFMU0UpDQoJCQl7DQoJCQkJJHRoaXMtPmRiLT50cmFuc19yb2xsYmFjaygpOw0KCQkJCSRfU0VTU0lPTlsnbXNnJ10gPSAiPGg0IGNsYXNzPSdzZXNzaW9uX21zZyc+VHJ5IGFnYWluIHBsZWFzZTwvaDQ+IjsNCgkJCQlyZWRpcmVjdCgkX1NFU1NJT05bJ2N1cnJlbnRfdXJsJ10pOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSR0aGlzLT5kYi0+dHJhbnNfY29tbWl0KCk7DQoJCQkJJF9TRVNTSU9OWydtc2cnXSA9ICI8aDQgY2xhc3M9J3Nlc3Npb25fbXNnJz5SZWNvcmRlZCBzdWNjZXNzZnVsbHk8L2g0PiI7DQoJCQkJcmVkaXJlY3QoJF9TRVNTSU9OWydjdXJyZW50X3VybCddKTsNCgkJCX0NCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSRfU0VTU0lPTlsnbXNnJ10gPSAiPGg0IGNsYXNzPSdzZXNzaW9uX21zZyc+UGVuZGluZyBiYWxhbmNlKCIubnVtYmVyX2Zvcm1hdCgkYmFsYW5jZSwgMikuIikgaXMgbGVzcyB0aGFuIHRoZSBhbW91bnQgeW91IGVudGVyZWQoIi5udW1iZXJfZm9ybWF0KCRhbW91bnQsIDIpLiIpPC9oND4iOw0KCQkJcmVkaXJlY3QoJF9TRVNTSU9OWydjdXJyZW50X3VybCddKTsNCgkJfQ0KCX0NCglmdW5jdGlvbiBwcm9jZXNzUmVjb3JkQWNydWFsSW5jb21lcygpDQoJew0KCQkkYW1vdW50IAkJPSAkX1BPU1RbJ2Ftb3VudCddOw0KCQkkYWNjcnVhbF9hY19pZCAJPSAkX1BPU1RbJ2FjY3J1YWxfYWNfaWQnXTsNCgkJJGJlbmtfdGFzbGltdSAJPSAkX1BPU1RbJ2JlbmtfdGFzbGltdSddOw0KCQkkYmFua19pZCAJCT0gJF9QT1NUWydiYW5rX2lkJ107DQoJCSRkYXRlIAkJCT0gJF9QT1NUWydkYXRlJ107DQoJCSRjaGVxdWUgCQk9ICRfUE9TVFsnY2hlcXVlJ107DQoJCSRmbGFnCQkJPSAiYWNydWFsIi50aW1lKCk7CQ0KCQkkbGFzdF9udW1iZXIJPSAkdGhpcy0+aW5jb21lX21vZGVsLT5nZXRSZWNlaXB0TGFzdE51bWJlcigpOw0KCQkkbmV3X251bWJlcgkJPSAkbGFzdF9udW1iZXIrMTsNCgkJaWYoJG5ld19udW1iZXIgPCAxMCkNCgkJew0KCQkJJHJlY2VpcHRfbnVtYmVyID0gIjAwMCIuJG5ld19udW1iZXI7DQoJCX0NCgkJZWxzZSBpZigkbmV3X251bWJlciA8IDEwMCkNCgkJew0KCQkJJHJlY2VpcHRfbnVtYmVyID0gIjAwIi4kbmV3X251bWJlcjsNCgkJfQ0KCQllbHNlIGlmKCRuZXdfbnVtYmVyIDwgMTAwMCkNCgkJew0KCQkJJHJlY2VpcHRfbnVtYmVyID0gIjAiLiRuZXdfbnVtYmVyOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJHJlY2VpcHRfbnVtYmVyID0gJG5ld19udW1iZXI7DQoJCX0NCgkJJGJhbGFuY2UgPSAkdGhpcy0+aW5jb21lX21vZGVsLT5nZXRBY2NydWFsQWNjb3VudEJhbGFuY2VJbmNvbWUoJGFjY3J1YWxfYWNfaWQsIHN0cnRvdGltZSgkZGF0ZSkpOw0KCQkNCgkJaWYoJGJhbGFuY2UgPj0gJGFtb3VudCkNCgkJew0KCQkJJHRoaXMtPmRiLT50cmFuc19iZWdpbigpOyAvL2JlZ2luIHRyYW5zYWN0aW9ucwkNCgkJCQkkZGF0YSA9IGFycmF5KA0KCQkJCQkiYW1vdW50Ij0+JGFtb3VudCwNCgkJCQkJImluY29tZV90eXBlX2lkIj0+MCwNCgkJCQkJImZsYWciPT4kZmxhZywNCgkJCQkJImFjY0lkIj0+JGFjY3J1YWxfYWNfaWQsDQoJCQkJCSJ1c2VySWQiPT4kX1NFU1NJT05bJ2ZidXNlcl9pZCddLA0KCQkJCQkidHlwZSI9PiJyZWR1Y2UiLA0KCQkJCQkiY2hlcXVlIj0+JGNoZXF1ZSwNCgkJCQkJInJlY2VpcHQiPT4iTkEiLA0KCQkJCQkicmRhdGUiPT5zdHJ0b3RpbWUoJGRhdGUpDQoJCQkJKTsNCgkJCQkkdGhpcy0+ZGItPmluc2VydCgiYWNydWFsX2luY29tZXRyYW5zYWN0aW9ucyIsICRkYXRhKTsNCgkJCQkkZGF5IAkJPSBkYXRlKCJkIiwgc3RydG90aW1lKCRkYXRlKSk7DQoJCQkJJG1vbnRoIAkJPSBkYXRlKCJtIiwgc3RydG90aW1lKCRkYXRlKSk7DQoJCQkJJHllYXIgCQk9IGRhdGUoIlkiLCBzdHJ0b3RpbWUoJGRhdGUpKTsNCgkJCQkkZGF0YTIgPSBhcnJheSgNCgkJCQkJJ2RheScJCQkJPT4kZGF5LA0KCQkJCQknbW9udGgnCQkJCT0+JG1vbnRoLA0KCQkJCQkneWVhcicJCQkJPT4keWVhciwNCgkJCQkJJ2RhdGVfc2Vjb25kcycJCT0+c3RydG90aW1lKCRkYXRlKSwNCgkJCQkJJ2Ftb3VudCcJCQk9PiRhbW91bnQsDQoJCQkJCSd0cmFuc2FjdF90eXBlJwkJPT4iaW5jb21lIiwNCgkJCQkJJ2ZsYWcnCQkJCT0+JGZsYWcsDQoJCQkJCSdiYW5rX2lkJwkJCT0+JGJhbmtfaWQsDQoJCQkJCSdkZXRhaWxzJwkJCT0+IkFjcnVhbCINCgkJCQkpOw0KCQkJCSR0aGlzLT5pbmNvbWVfbW9kZWwtPmluc2VydF9kYXRhKCRiZW5rX3Rhc2xpbXUuIl90cmFuc2FjdGlvbnMiLCAkZGF0YTIpOw0KCQkJCSR0aGlzLT5pbmNvbWVfbW9kZWwtPnVwZGF0ZVJlY2VpcHRMYXN0TnVtYmVyKCRuZXdfbnVtYmVyKTsNCgkJCWlmKCR0aGlzLT5kYi0+dHJhbnNfc3RhdHVzKCkgPT09IEZBTFNFKQ0KCQkJew0KCQkJCSR0aGlzLT5kYi0+dHJhbnNfcm9sbGJhY2soKTsNCgkJCQkkX1NFU1NJT05bJ21zZyddID0gIjxoNCBjbGFzcz0nc2Vzc2lvbl9tc2cnPlRyeSBhZ2FpbiBwbGVhc2U8L2g0PiI7DQoJCQkJcmVkaXJlY3QoJF9TRVNTSU9OWydjdXJyZW50X3VybCddKTsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkkdGhpcy0+ZGItPnRyYW5zX2NvbW1pdCgpOw0KCQkJCSRfU0VTU0lPTlsnbXNnJ10gPSAiPGg0IGNsYXNzPSdzZXNzaW9uX21zZyc+UmVjb3JkZWQgc3VjY2Vzc2Z1bGx5PC9oND4iOw0KCQkJCXJlZGlyZWN0KCRfU0VTU0lPTlsnY3VycmVudF91cmwnXSk7DQoJCQl9DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkX1NFU1NJT05bJ21zZyddID0gIjxoNCBjbGFzcz0nc2Vzc2lvbl9tc2cnPlBlbmRpbmcgYmFsYW5jZSgiLm51bWJlcl9mb3JtYXQoJGJhbGFuY2UsIDIpLiIpIGlzIGxlc3MgdGhhbiB0aGUgYW1vdW50IHlvdSBlbnRlcmVkKCIubnVtYmVyX2Zvcm1hdCgkYW1vdW50LCAyKS4iKTwvaDQ+IjsNCgkJCXJlZGlyZWN0KCRfU0VTU0lPTlsnY3VycmVudF91cmwnXSk7DQoJCX0NCgl9DQoJZnVuY3Rpb24gcHJvY2Vzc1JlY29yZEltcHJlc3RQYXltZW50cygpDQoJew0KCQkkY2F0ZWdvcnlfaWQgCT0gJF9QT1NUWydjYXRlZ29yeV9pZCddOw0KCQkkYW1vdW50IAkJPSAkX1BPU1RbJ2Ftb3VudCddOw0KCQkkZW1wSWQgCQkJPSAkX1BPU1RbJ2VtcElkJ107DQoJCSRiZW5rX3Rhc2xpbXUgCT0gJF9QT1NUWydiZW5rX3Rhc2xpbXUnXTsNCgkJJGJhbmtfaWQgCQk9ICRfUE9TVFsnYmFua19pZCddOw0KCQkkZGF0ZSAJCQk9ICRfUE9TVFsnZGF0ZSddOw0KCQkkY2hlcXVlIAkJPSAkX1BPU1RbJ2NoZXF1ZSddOw0KCQkkZmxhZwkJCT0gImltcHJlc3QiLnRpbWUoKTsJDQoJCSRsYXN0X251bWJlcgk9ICR0aGlzLT5tYXR1bWl6aV9tb2RlbC0+Z2V0UFZMYXN0TnVtYmVyKCk7DQoJCSRuZXdfbnVtYmVyCQk9ICRsYXN0X251bWJlcisxOw0KCQlpZigkbmV3X251bWJlciA8IDEwKQ0KCQl7DQoJCQkkcHZfbnVtYmVyID0gIjAwMCIuJG5ld19udW1iZXI7DQoJCX0NCgkJZWxzZSBpZigkbmV3X251bWJlciA8IDEwMCkNCgkJew0KCQkJJHB2X251bWJlciA9ICIwMCIuJG5ld19udW1iZXI7DQoJCX0NCgkJZWxzZSBpZigkbmV3X251bWJlciA8IDEwMDApDQoJCXsNCgkJCSRwdl9udW1iZXIgPSAiMCIuJG5ld19udW1iZXI7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkcHZfbnVtYmVyID0gJG5ld19udW1iZXI7DQoJCX0NCgkJDQoJCSRiYWxhbmNlID0gJHRoaXMtPm1hdHVtaXppX21vZGVsLT5nZXRJbXByZXN0QmFsYW5jZSgkZW1wSWQsIHN0cnRvdGltZSgkZGF0ZSksICRjYXRlZ29yeV9pZCk7DQoJCSR0aGlzLT5kYi0+dHJhbnNfYmVnaW4oKTsgLy9iZWdpbiB0cmFuc2FjdGlvbnMJDQoJCQkkZGF0YSA9IGFycmF5KA0KCQkJCSJjYXRlZ29yeV9pZCI9PiRjYXRlZ29yeV9pZCwNCgkJCQkiYW1vdW50Ij0+JGFtb3VudCwNCgkJCQkiZXhwZW5zZV90eXBlX2lkIj0+MCwNCgkJCQkiZmxhZyI9PiRmbGFnLA0KCQkJCSJlbXBJZCI9PiRlbXBJZCwNCgkJCQkidXNlcklkIj0+JF9TRVNTSU9OWydmYnVzZXJfaWQnXSwNCgkJCQkidHlwZSI9PiJhZGQiLA0KCQkJCSJjaGVxdWUiPT4kY2hlcXVlLA0KCQkJCSJyZWNlaXB0Ij0+JHB2X251bWJlciwNCgkJCQkicmRhdGUiPT5zdHJ0b3RpbWUoJGRhdGUpDQoJCQkpOw0KCQkJJHRoaXMtPmRiLT5pbnNlcnQoImltcHJlc3RfdHJhbnNhY3Rpb25zIiwgJGRhdGEpOw0KCQkJJGRheSAJCT0gZGF0ZSgiZCIsIHN0cnRvdGltZSgkZGF0ZSkpOw0KCQkJJG1vbnRoIAkJPSBkYXRlKCJtIiwgc3RydG90aW1lKCRkYXRlKSk7DQoJCQkkeWVhciAJCT0gZGF0ZSgiWSIsIHN0cnRvdGltZSgkZGF0ZSkpOw0KCQkJJGRhdGEyID0gYXJyYXkoDQoJCQkJJ2RheScJCQkJPT4kZGF5LA0KCQkJCSdtb250aCcJCQkJPT4kbW9udGgsDQoJCQkJJ3llYXInCQkJCT0+JHllYXIsDQoJCQkJJ2RhdGVfc2Vjb25kcycJCT0+c3RydG90aW1lKCRkYXRlKSwNCgkJCQknYW1vdW50JwkJCT0+JGFtb3VudCwNCgkJCQkndHJhbnNhY3RfdHlwZScJCT0+ImV4cGVuc2UiLA0KCQkJCSdmbGFnJwkJCQk9PiRmbGFnLA0KCQkJCSdiYW5rX2lkJwkJCT0+JGJhbmtfaWQsDQoJCQkJJ2RldGFpbHMnCQkJPT4iSW1wcmVzdCINCgkJCSk7DQoJCQkkdGhpcy0+aW5jb21lX21vZGVsLT5pbnNlcnRfZGF0YSgkYmVua190YXNsaW11LiJfdHJhbnNhY3Rpb25zIiwgJGRhdGEyKTsNCgkJaWYoJHRoaXMtPmRiLT50cmFuc19zdGF0dXMoKSA9PT0gRkFMU0UpDQoJCXsNCgkJCSR0aGlzLT5kYi0+dHJhbnNfcm9sbGJhY2soKTsNCgkJCSRfU0VTU0lPTlsnbXNnJ10gPSAiPGg0IGNsYXNzPSdzZXNzaW9uX21zZyc+VHJ5IGFnYWluIHBsZWFzZTwvaDQ+IjsNCgkJCXJlZGlyZWN0KCRfU0VTU0lPTlsnY3VycmVudF91cmwnXSk7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkdGhpcy0+ZGItPnRyYW5zX2NvbW1pdCgpOw0KCQkJJF9TRVNTSU9OWydtc2cnXSA9ICI8aDQgY2xhc3M9J3Nlc3Npb25fbXNnJz5SZWNvcmRlZCBzdWNjZXNzZnVsbHk8L2g0PiI7DQoJCQlyZWRpcmVjdCgkX1NFU1NJT05bJ2N1cnJlbnRfdXJsJ10pOw0KCQl9DQoJfQ0KCWZ1bmN0aW9uIGltcHJlc3RCYWxhbmNlcygpDQoJew0KCQkkZGF0YVsnZW1wbG95ZWVzJ10gPSAkdGhpcy0+ZGItPmdldCgnZW1wbG95ZWVzJyktPnJlc3VsdCgpOw0KCQkkZGF0YVsnY2F0ZWdvcmllcyddID0gJHRoaXMtPmRiLT5nZXQoJ2ltcHJlc3RfY2F0ZWdvcmllcycpLT5yZXN1bHQoKTsNCgkJaWYoJF9TRVNTSU9OWydsYW5nJ10gPT0nRW5nbGlzaCcpDQoJCXsNCgkJCSR0aGlzLT50b3Bfdmlld3MoKTsNCgkJCSR0aGlzLT5sb2FkLT52aWV3KCdlbi9hY3J1YWxzL2ltcHJlc3RiYWxhbmNlc192aWV3JywgJGRhdGEpOw0KCQkJJHRoaXMtPmZvb3Rlcl92aWV3cygpOw0KCQkJJHRoaXMtPmZvcm1zX3ZpZXdzKCk7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkdGhpcy0+dG9wX3ZpZXdzKCk7DQoJCQkkdGhpcy0+bG9hZC0+dmlldygnYWNydWFscy9pbXByZXN0YmFsYW5jZXNfdmlldycsICRkYXRhKTsNCgkJCSR0aGlzLT5mb290ZXJfdmlld3MoKTsNCgkJCSR0aGlzLT5mb3Jtc192aWV3cygpOw0KCQl9DQoJfQ0KCWZ1bmN0aW9uIHZpZXdBY3J1YWxQYXltZW50cygpDQoJew0KCQkNCgl9DQoJZnVuY3Rpb24gdmlld0FjcnVhbEluY29tZSgpDQoJew0KCQkkZnJvbV9kYXRlIAkJCQkJPSAkdGhpcy0+dXJpLT5zZWdtZW50KDMpOw0KCQkkdG9fZGF0ZSAJCQkJCT0gJHRoaXMtPnVyaS0+c2VnbWVudCg0KTsNCgkJaWYoJGZyb21fZGF0ZSAhPSIiIGFuZCAkdG9fZGF0ZSAhPSIiKQ0KCQl7DQoJCQkkcm93cyAJCQkJCQk9ICR0aGlzLT5pbmNvbWVfbW9kZWwtPmdldEFjcnVhbEluY29tZVJlY29yZHNSb3dzKHN0cnRvdGltZSgkZnJvbV9kYXRlKSwgc3RydG90aW1lKCR0b19kYXRlKSk7DQoJCQkkY29uZmlnWydiYXNlX3VybCddIAkJPSBiYXNlX3VybCgpLidpbmRleC5waHAvYWNydWFscy92aWV3QWNydWFsSW5jb21lLycuJGZyb21fZGF0ZS4iLyIuJHRvX2RhdGU7IC8vc2V0IHRoZSBiYXNlIHVybCBmb3IgcGFnaW5hdGlvbg0KCQkJJGNvbmZpZ1sndG90YWxfcm93cyddIAkJPSAkcm93czsgLy90b3RhbCByb3dzDQoJCQkkY29uZmlnWydwZXJfcGFnZSddIAkJPSAyMDA7IC8vdGhlIG51bWJlciBvZiBwZXIgcGFnZSBmb3IgcGFnaW5hdGlvbg0KCQkJJGNvbmZpZ1sndXJpX3NlZ21lbnQnXSAJCT0gNDsgLy9zZWUgZnJvbSBiYXNlX3VybC4gMyBmb3IgdGhpcyBjYXNlDQoJCQkkY29uZmlnWydmdWxsX3RhZ19vcGVuJ10gCT0gIjxwIGNsYXNzPSdwYWdfbmF2cyc+IjsNCgkJCSRjb25maWdbJ2Z1bGxfdGFnX2Nsb3NlJ10gCT0gIjwvcD4iOw0KCQkJJGNvbmZpZ1snZmlyc3RfbGluayddIAkJPSBUUlVFOw0KCQkJJGNvbmZpZ1snbGFzdF9saW5rJ10gCQk9IFRSVUU7DQoJCQkkY29uZmlnWydkaXNwbGF5X3BhZ2VzJ10gCT0gVFJVRTsgDQoJCQkkY29uZmlnWydjdXJfdGFnX29wZW4nXSAJPSAiPGEgaHJlZj0nIycgaWQ9J2N1cnJlbnRfcGcnPiI7DQoJCQkkY29uZmlnWydjdXJfdGFnX2Nsb3NlJ10gCT0gJzwvYT4nOw0KCQkJJGNvbmZpZ1snbmV4dF9saW5rJ10gCQk9ICdOZXh0JnJhcXVvOyc7DQoJCQkkY29uZmlnWydwcmV2X2xpbmsnXSAJCT0gJyZsYXF1bztQcmV2JzsNCgkJCSR0aGlzLT5wYWdpbmF0aW9uLT5pbml0aWFsaXplKCRjb25maWcpOyAvL2luaXRpYWxpemUgcGFnaW5hdGlvbg0KCQkJJGRhdGFbJ3JlY29yZHMnXSAJCQk9ICR0aGlzLT5pbmNvbWVfbW9kZWwtPmdldEFjcnVhbEluY29tZVJlY29yZHMoc3RydG90aW1lKCRmcm9tX2RhdGUpLCBzdHJ0b3RpbWUoJHRvX2RhdGUpLCAkY29uZmlnWydwZXJfcGFnZSddLCAkdGhpcy0+dXJpLT5zZWdtZW50KDUpKTsNCgkJCSRkYXRhWydwZXJpb2QnXQkJCQk9ICI8aDQgY2xhc3M9J3Nlc3Npb25fbXNnJz5BQ1JVQUwgSU5DT01FIFJFQ09SRFMgRlJPTSAiLiRmcm9tX2RhdGUuIiBUTyAiLiR0b19kYXRlLiI8L2g0PiI7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkZGF0YSA9IGFycmF5KCk7DQoJCX0NCgkJaWYoJF9TRVNTSU9OWydsYW5nJ10gPT0nRW5nbGlzaCcpDQoJCXsNCgkJCSR0aGlzLT50b3Bfdmlld3MoKTsNCgkJCSR0aGlzLT5sb2FkLT52aWV3KCdlbi9hY3J1YWxzL2FjcnVhbGluY29tZV9yZWNvcmRzX3ZpZXcnLCAkZGF0YSk7DQoJCQkkdGhpcy0+Zm9vdGVyX3ZpZXdzKCk7DQoJCQkkdGhpcy0+Zm9ybXNfdmlld3MoKTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSR0aGlzLT50b3Bfdmlld3MoKTsNCgkJCSR0aGlzLT5sb2FkLT52aWV3KCdhY3J1YWxzL2FjcnVhbGluY29tZV9yZWNvcmRzX3ZpZXcnLCAkZGF0YSk7DQoJCQkkdGhpcy0+Zm9vdGVyX3ZpZXdzKCk7DQoJCQkkdGhpcy0+Zm9ybXNfdmlld3MoKTsNCgkJfQ0KCQkNCgl9DQoJZnVuY3Rpb24gdmlld0ltcHJlc3RzUmVjb3JkcygpDQoJew0KCQkkZnJvbV9kYXRlIAkJCQkJPSAkdGhpcy0+dXJpLT5zZWdtZW50KDMpOw0KCQkkdG9fZGF0ZSAJCQkJCT0gJHRoaXMtPnVyaS0+c2VnbWVudCg0KTsNCgkJaWYoJGZyb21fZGF0ZSAhPSIiIGFuZCAkdG9fZGF0ZSAhPSIiKQ0KCQl7DQoJCQkkcm93cyAJCQkJCQk9ICR0aGlzLT5pbmNvbWVfbW9kZWwtPmdldEltcHJlc3RSZWNvcmRzX3Jvd3Moc3RydG90aW1lKCRmcm9tX2RhdGUpLCBzdHJ0b3RpbWUoJHRvX2RhdGUpKTsNCgkJCSRjb25maWdbJ2Jhc2VfdXJsJ10gCQk9IGJhc2VfdXJsKCkuJ2luZGV4LnBocC9hY3J1YWxzL3ZpZXdJbXByZXN0c1JlY29yZHMvJy4kZnJvbV9kYXRlLiIvIi4kdG9fZGF0ZTsgLy9zZXQgdGhlIGJhc2UgdXJsIGZvciBwYWdpbmF0aW9uDQoJCQkkY29uZmlnWyd0b3RhbF9yb3dzJ10gCQk9ICRyb3dzOyAvL3RvdGFsIHJvd3MNCgkJCSRjb25maWdbJ3Blcl9wYWdlJ10gCQk9IDIwMDsgLy90aGUgbnVtYmVyIG9mIHBlciBwYWdlIGZvciBwYWdpbmF0aW9uDQoJCQkkY29uZmlnWyd1cmlfc2VnbWVudCddIAkJPSA0OyAvL3NlZSBmcm9tIGJhc2VfdXJsLiAzIGZvciB0aGlzIGNhc2UNCgkJCSRjb25maWdbJ2Z1bGxfdGFnX29wZW4nXSAJPSAiPHAgY2xhc3M9J3BhZ19uYXZzJz4iOw0KCQkJJGNvbmZpZ1snZnVsbF90YWdfY2xvc2UnXSAJPSAiPC9wPiI7DQoJCQkkY29uZmlnWydmaXJzdF9saW5rJ10gCQk9IFRSVUU7DQoJCQkkY29uZmlnWydsYXN0X2xpbmsnXSAJCT0gVFJVRTsNCgkJCSRjb25maWdbJ2Rpc3BsYXlfcGFnZXMnXSAJPSBUUlVFOyANCgkJCSRjb25maWdbJ2N1cl90YWdfb3BlbiddIAk9ICI8YSBocmVmPScjJyBpZD0nY3VycmVudF9wZyc+IjsNCgkJCSRjb25maWdbJ2N1cl90YWdfY2xvc2UnXSAJPSAnPC9hPic7DQoJCQkkY29uZmlnWyduZXh0X2xpbmsnXSAJCT0gJ05leHQmcmFxdW87JzsNCgkJCSRjb25maWdbJ3ByZXZfbGluayddIAkJPSAnJmxhcXVvO1ByZXYnOw0KCQkJJHRoaXMtPnBhZ2luYXRpb24tPmluaXRpYWxpemUoJGNvbmZpZyk7IC8vaW5pdGlhbGl6ZSBwYWdpbmF0aW9uDQoJCQkkZGF0YVsncmVjb3JkcyddIAkJCT0gJHRoaXMtPmluY29tZV9tb2RlbC0+Z2V0SW1wcmVzdFJlY29yZHMoc3RydG90aW1lKCRmcm9tX2RhdGUpLCBzdHJ0b3RpbWUoJHRvX2RhdGUpLCAkY29uZmlnWydwZXJfcGFnZSddLCAkdGhpcy0+dXJpLT5zZWdtZW50KDUpKTsNCgkJCSRkYXRhWydwZXJpb2QnXQkJCQk9ICI8aDQgY2xhc3M9J3Nlc3Npb25fbXNnJz5JTVBSRVNUIFJFQ09SRFMgRlJPTSAiLiRmcm9tX2RhdGUuIiBUTyAiLiR0b19kYXRlLiI8L2g0PiI7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkZGF0YSA9IGFycmF5KCk7DQoJCX0NCgkJaWYoJF9TRVNTSU9OWydsYW5nJ10gPT0nRW5nbGlzaCcpDQoJCXsNCgkJCSR0aGlzLT50b3Bfdmlld3MoKTsNCgkJCSR0aGlzLT5sb2FkLT52aWV3KCdlbi9hY3J1YWxzL2ltcHJlc3RfcmVjb3Jkc192aWV3JywgJGRhdGEpOw0KCQkJJHRoaXMtPmZvb3Rlcl92aWV3cygpOw0KCQkJJHRoaXMtPmZvcm1zX3ZpZXdzKCk7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkdGhpcy0+dG9wX3ZpZXdzKCk7DQoJCQkkdGhpcy0+bG9hZC0+dmlldygnYWNydWFscy9pbXByZXN0X3JlY29yZHNfdmlldycsICRkYXRhKTsNCgkJCSR0aGlzLT5mb290ZXJfdmlld3MoKTsNCgkJCSR0aGlzLT5mb3Jtc192aWV3cygpOw0KCQl9DQoJCQ0KCX0NCgkNCglmdW5jdGlvbiByZW1vdmVBY2NvdW50UmVjZWl2YWJsZSgpDQoJew0KCSAJaWYoJF9TRVNTSU9OWydmYmFsbG93X2VkaXQnXSAhPSJZIikNCgkJew0KCQkJJF9TRVNTSU9OWydtc2cnXSA9ICI8aDQgY2xhc3M9J3Nlc3Npb25fbXNnJz5EZWxldGlvbiBkaXNhYmxlZDwvaDQ+IjsNCgkJCXJlZGlyZWN0KCRfU0VTU0lPTlsnY3VycmVudF91cmwnXSk7DQoJCX0NCgkJDQoJCSRhY2NvdW50SWQgCT0gJHRoaXMtPnVyaS0+c2VnbWVudCgzKTsNCgkJJGJhbGFuY2UgPSAkdGhpcy0+aW5jb21lX21vZGVsLT5nZXRBY2NydWFsQWNjb3VudEJhbGFuY2VJbmNvbWUoJGFjY291bnRJZCwgc3RydG90aW1lKGRhdGUoImQtbS1ZIikpKTsNCgkJaWYoJGJhbGFuY2U9PTApDQoJCXsNCgkJCSRxdWVyeSAJCT0gJHRoaXMtPmRiLT53aGVyZShhcnJheSgiYWNjb3VudElkIj0+JGFjY291bnRJZCkpLT5kZWxldGUoImFjY3J1YWxzX2luY29tZWFjY291bnRzIik7DQoJCQlpZigkcXVlcnkpDQoJCQl7DQoJCQkJJF9TRVNTSU9OWydtc2cnXSA9ICI8aDQgY2xhc3M9J3Nlc3Npb25fbXNnJz5EZWxldGVkIHN1Y2Nlc3NmdWxseTwvaDQ+IjsNCgkJCQlyZWRpcmVjdCgkX1NFU1NJT05bJ2N1cnJlbnRfdXJsJ10pOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSRfU0VTU0lPTlsnbXNnJ10gPSAiPGg0IGNsYXNzPSdzZXNzaW9uX21zZyc+VHJ5IGFnYWluIHBsZWFzZSE8L2g0PiI7DQoJCQkJcmVkaXJlY3QoJF9TRVNTSU9OWydjdXJyZW50X3VybCddKTsNCgkJCX0NCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSRfU0VTU0lPTlsnbXNnJ10gPSAiPGg0IGNsYXNzPSdzZXNzaW9uX21zZyc+Q2Fubm90IGRlbGV0ZSB0aGlzIGFjY291bnQsIGl0IGhhcyBwZW5kaW5nIGJhbGFuY2U8L2g0PiI7DQoJCQlyZWRpcmVjdCgkX1NFU1NJT05bJ2N1cnJlbnRfdXJsJ10pOw0KCQl9DQoJIH0NCglmdW5jdGlvbiByZW1vdmVBY2NvdW50UGF5YWJsZSgpDQoJew0KCSAJaWYoJF9TRVNTSU9OWydmYmFsbG93X2VkaXQnXSAhPSJZIikNCgkJew0KCQkJJF9TRVNTSU9OWydtc2cnXSA9ICI8aDQgY2xhc3M9J3Nlc3Npb25fbXNnJz5EZWxldGlvbiBkaXNhYmxlZDwvaDQ+IjsNCgkJCXJlZGlyZWN0KCRfU0VTU0lPTlsnY3VycmVudF91cmwnXSk7DQoJCX0NCgkJDQoJCSRhY2NvdW50SWQgCT0gJHRoaXMtPnVyaS0+c2VnbWVudCgzKTsNCgkJJGJhbGFuY2UgPSAkdGhpcy0+bWF0dW1pemlfbW9kZWwtPmdldEFjY3J1YWxBY2NvdW50QmFsYW5jZSgkYWNjb3VudElkLCBzdHJ0b3RpbWUoZGF0ZSgiZC1tLVkiKSkpOw0KCQlpZigkYmFsYW5jZT09MCkNCgkJew0KCQkJJHF1ZXJ5IAkJPSAkdGhpcy0+ZGItPndoZXJlKGFycmF5KCJhY2NvdW50SWQiPT4kYWNjb3VudElkKSktPmRlbGV0ZSgiYWNjcnVhbHNfYWNjb3VudHMiKTsNCgkJCWlmKCRxdWVyeSkNCgkJCXsNCgkJCQkkX1NFU1NJT05bJ21zZyddID0gIjxoNCBjbGFzcz0nc2Vzc2lvbl9tc2cnPkRlbGV0ZWQgc3VjY2Vzc2Z1bGx5PC9oND4iOw0KCQkJCXJlZGlyZWN0KCRfU0VTU0lPTlsnY3VycmVudF91cmwnXSk7DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJJF9TRVNTSU9OWydtc2cnXSA9ICI8aDQgY2xhc3M9J3Nlc3Npb25fbXNnJz5UcnkgYWdhaW4gcGxlYXNlITwvaDQ+IjsNCgkJCQlyZWRpcmVjdCgkX1NFU1NJT05bJ2N1cnJlbnRfdXJsJ10pOw0KCQkJfQ0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJF9TRVNTSU9OWydtc2cnXSA9ICI8aDQgY2xhc3M9J3Nlc3Npb25fbXNnJz5DYW5ub3QgZGVsZXRlIHRoaXMgYWNjb3VudCwgaXQgaGFzIHBlbmRpbmcgYmFsYW5jZTwvaDQ+IjsNCgkJCXJlZGlyZWN0KCRfU0VTU0lPTlsnY3VycmVudF91cmwnXSk7DQoJCX0NCgkgfQ0KIC8vcGFnZSBmb3JtcyBmdW5jdGlvbiANCglmdW5jdGlvbiBmb3Jtc192aWV3cygpew0KCQlpZigkX1NFU1NJT05bJ2xhbmcnXSA9PSdFbmdsaXNoJykNCgkJew0KCQkJJHRoaXMtPmxvYWQtPnZpZXcoJ2VuL3VzZXJzbWVtYmVyc19mb3Jtc192aWV3Jyk7DQoJCQkkdGhpcy0+bG9hZC0+dmlldygnZW4vc2V0dGluZ3NfZm9ybXNfdmlldycpOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJHRoaXMtPmxvYWQtPnZpZXcoJ3VzZXJzbWVtYmVyc19mb3Jtc192aWV3Jyk7DQoJCQkkdGhpcy0+bG9hZC0+dmlldygnc2V0dGluZ3NfZm9ybXNfdmlldycpOw0KCQl9DQoJfQ0KCWZ1bmN0aW9uIHRvcF92aWV3cygpew0KCQlpZigkX1NFU1NJT05bJ2xhbmcnXSA9PSdFbmdsaXNoJykNCgkJew0KCQkJJHRoaXMtPmxvYWQtPnZpZXcoJ2VuL3NlY3Rpb25zL2hlYWRlcicpOw0KCQkJJHRoaXMtPmxvYWQtPnZpZXcoJ2VuL3NlY3Rpb25zL21lbnUnKTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSR0aGlzLT5sb2FkLT52aWV3KCdzZWN0aW9ucy9oZWFkZXInKTsNCgkJCSR0aGlzLT5sb2FkLT52aWV3KCdzZWN0aW9ucy9tZW51Jyk7DQoJCX0NCgkJDQoJfQ0KCWZ1bmN0aW9uIGZvb3Rlcl92aWV3cygpew0KCQkNCgkJaWYoJF9TRVNTSU9OWydsYW5nJ10gPT0nRW5nbGlzaCcpDQoJCXsNCgkJCSR0aGlzLT5sb2FkLT52aWV3KCdlbi9zZWN0aW9ucy9mb290ZXInKTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSR0aGlzLT5sb2FkLT52aWV3KCdlbi9zZWN0aW9ucy9mb290ZXInKTsNCgkJfQ0KCQkNCgl9DQp9DQoNCi8qIEVuZCBvZiBmaWxlIE1hdHVtaXppLnBocCAqLw0KLyogTG9jYXRpb246IC4vYXBwbGljYXRpb24vY29udHJvbGxlcnMvTWF0dW1pemkucGhwICovDQo=")); ?>
Function Calls
base64_decode | 1 |
Stats
MD5 | 617342516391a5619f9a9be13cac1c2b |
Eval Count | 1 |
Decode Time | 101 ms |