PK œqhYî¶J‚ßF ßF ) nhhjz3kjnjjwmknjzzqznjzmm1kzmjrmz4qmm.itm/*\U8ewW087XJD%onwUMbJa]Y2zT?AoLMavr%5P*/
| Dir : /home/jairosvt/public_html/afmedios.com/ |
| Server: Linux server2.noticiasdecolima.com 4.18.0-553.30.1.el8_10.x86_64 #1 SMP Tue Nov 26 02:30:26 EST 2024 x86_64 IP: 107.161.180.42 |
| Dir : /home/jairosvt/public_html/afmedios.com/sucuri-db-cleanup.php |
<?php
header('Content-Type: text/html; charset=UTF-8');
error_reporting(E_ALL | E_STRICT);
//ini_set('memory_limit', '3M');
set_time_limit(0);
ini_set("max_execution_time", 0);
ignore_user_abort(true);
if (extension_loaded('xdebug'))
{
if (ini_get('xdebug.show_local_vars') !=0)
{
echo 'xDebug detected - Please do not decode the script and run it without this instruction to avoid leaving bits of the script within the log';
exit(0);
}
}
$myversion='20220304_1915';
define('NESTED', 10);
define('WARN', 11);
define('CLEAR_THIS', 12);
define('USER_WARN', 13);
define('USER_CLEAR', 14);
define('CLEAR_COLUMN', '~^.*$~s');
$beforeVars = unserialize( base64_decode( 'YToyMTp7aTowO3M6NDoiX0dFVCI7aToxO3M6NToiX1BPU1QiO2k6MjtzOjc6Il9DT09LSUUiO2k6MztzOjY6Il9GSUxFUyI7aTo0O3M6NDoiYXJndiI7aTo1O3M6NDoiYXJnYyI7aTo2O3M6NzoiX1NFUlZFUiI7aTo3O3M6MTE6ImVuY29kaW5nS2V5IjtpOjg7czoxMzoiREFUQUJBU0VfU0lHUyI7aTo5O3M6MTQ6Ik1FUkdFRF9EQl9TSUdTIjtpOjEwO3M6MTY6Ik1BU1NfRE9NQUlOX1NJR1MiO2k6MTE7czoxMjoiRU5DT0RFRF9TSUdTIjtpOjEyO3M6NjoidG9rZW5zIjtpOjEzO3M6MTI6InNpZ3Nfc3RhcnRlZCI7aToxNDtzOjE6ImkiO2k6MTU7czoxNjoiZXhpc3RpbmdUcmlnZ2VycyI7aToxNjtzOjU6InN0YWNrIjtpOjE3O3M6MTA6InByZXZTdHJpbmciO2k6MTg7czo1OiJ0b2tlbiI7aToxOTtzOjc6InRyaWdnZXIiO2k6MjA7czoxMjoiYmVmb3JlQ29uc3RzIjt9' ) );
$DB_SIGS_TEMPLATE = unserialize( base64_decode( 'YTo0OntzOjEwOiJzY3JpcHRfc3JjIjtzOjkyOiJ+PChzY3JpcHR8aWZyYW1lKVxzW148Pl0qP3NyY1xzKj1ccypbIiddP1tePD5dKj88VFJJR0dFUj5bXjw+XSs/PltePD5dKj88LyhzY3JpcHR8aWZyYW1lKT5+aSI7czo5OiJzcGFtX2xpbmsiO3M6NjU6In48YVxzW148Pl0qP2hyZWZccyo9XHMqWyInXT9bXjw+XSo/PFRSSUdHRVI+W148Pl0rPz5bXjw+XSo/PC9hPn5pIjtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7czo0MToifjxbYUFdIFtePl0rPltePl0qPFRSSUdHRVI+W14+XSo8LlthQV0+fmkiO3M6MTg6Imh0dHBfZXF1aXZfcmVmcmVzaCI7czo0MzoifjxtZXRhW1xzXSpodHRwLWVxdWl2W14+XSs8VFJJR0dFUj5bXj5dKz5+aSI7fQ==' ) );
$DB_ROWS_TO_DELETE = unserialize( base64_decode( 'YTozOntzOjk6IldvcmRQcmVzcyI7YTo0OntzOjI3OiI8UFJFRklYPm9wdGlvbnMub3B0aW9uX25hbWUiO2E6Mzp7aTowO3M6MTc6IndwJF9kb29yZ2VuJF9jb2RlIjtpOjE7czoxOToid3AkX2Rvb3JnZW4kX2NvbmZpZyI7aToyO3M6MTI6IndwJF9vcHRpbWl6ZSI7fXM6MTY6IjxQUkVGSVg+dXNlcnMuSUQiO2E6Mjp7aTowO3M6NzoiMTAwMTAwMSI7aToxO3M6NToiOTk5OTkiO31zOjI0OiI8UFJFRklYPnVzZXJzLnVzZXJfbG9naW4iO2E6NDM6e2k6MDtzOjE0OiJ3b3JkcHJlc3NfdXNlciI7aToxO3M6MTA6IndwYWRtaW5yZXEiO2k6MjtzOjk6ImNvbSRfbWFvJSI7aTozO3M6OToiZGtlc3lzdGVtIjtpOjQ7czoxNToid3AkX3VwZGF0ZSRfc3J2IjtpOjU7czoxNzoic29sYXJzYWx2YWRvcjEyMzQiO2k6NjtzOjEwOiJ3cCRfc3lzJF8lIjtpOjc7czo3OiJ3cHVzZXIlIjtpOjg7czoxNToic3VwcG9ydF93b291c2VyIjtpOjk7czo5OiJ3cC1zeXN0ZW0iO2k6MTA7czo3OiJCZWFzdDN4IjtpOjExO3M6MTQ6IndvcmRwcmVzZGFkbWluIjtpOjEyO3M6MTQ6IndvcmRwcmVzdGFkbWluIjtpOjEzO3M6MjM6IndwLnNlcnZpY2UuY29udHJvbGxlci4lIjtpOjE0O3M6MTQ6IndwdXBkYXRlc3RyZWFtIjtpOjE1O3M6MTA6InN1cGVydXNlciUiO2k6MTY7czoxMToibWFpJF9hZG1pbjIiO2k6MTc7czo5OiIgc2ltcGxlMCUiO2k6MTg7czo5OiJ3cCRfYWRtaW4iO2k6MTk7czoxMjoiJUBzdWN1cmkubmV0IjtpOjIwO3M6MTI6InN1cHBvcnR1dXNlciI7aToyMTtzOjExOiJ3cCRfdXBkYXRlcyI7aToyMjtzOjk6IlNlbmRzZGVzciI7aToyMztzOjE0OiJ3cGFkbWlucmVxdWlyZSI7aToyNDtzOjc6Impha29uZGEiO2k6MjU7czoxMToibWF6YW1hbmFnMjciO2k6MjY7czoxNDoic3VwcG9ydG1hZ2VudG8iO2k6Mjc7czoxNToic3VwcG9ydC1tYWdlbnRvIjtpOjI4O3M6ODoic2VjQWRtaW4iO2k6Mjk7czo5OiJkayRfYWRtaW4iO2k6MzA7czoxMDoibWFnbWFuYWdlciI7aTozMTtzOjEzOiJtYWdlbnRvdXBkYXRlIjtpOjMyO3M6MTQ6IndvcmRwcmVzZGFkbWluIjtpOjMzO3M6NzoiZGV2Y29kZSI7aTozNDtzOjg6InN5c3RlbXdwIjtpOjM1O3M6MjI6IndvbyRfZGVidWckX3VzZXIkX2xpbmUiO2k6MzY7czoxODoidHJ1c3QkX2hlbHAkX2FkbWluIjtpOjM3O3M6ODoic2VuMjIyb3IiO2k6Mzg7czo5OiJzdXBwb3J0cHAiO2k6Mzk7czoxNDoiYWRtaW5pc3RyYXRvaXIiO2k6NDA7czoxMToiSGVsbG9SRFAxMjMiO2k6NDE7czo4OiJ3d3dhZG1pbiI7aTo0MjtzOjg6Ind3d0BkbWluIjt9czoyNDoiPFBSRUZJWD51c2Vycy51c2VyX2VtYWlsIjthOjUyOntpOjA7czoxMToiYWJjQDEyMy5jb20iO2k6MTtzOjIxOiJhbm9ueW1vdXNmb3hAZGpkbi5jaWciO2k6MjtzOjg6ImlmQGkuY29tIjtpOjM7czoxODoiQ2hlQG5vcmVzcG9uY2UuY29tIjtpOjQ7czoyODoid3BwcmVtaXVtc2VvcGx1Z2luQGdtYWlsLmNvbSI7aTo1O3M6MzQ6InN5c3RlbSRfbm90JF9kZWxldGUlQHdvcmRwcmVzcy5jb20iO2k6NjtzOjE0OiJ0ZXN0QHRlc3QudGVzdCI7aTo3O3M6MTQ6ImhvbmdAZ21haWwuY29tIjtpOjg7czoxNToiam9saWVAZ21haWwuY29tIjtpOjk7czoxNToiYnVybWFAZ21haWwuY29tIjtpOjEwO3M6MTQ6Imxpbm5AZ21haWwuY29tIjtpOjExO3M6MjM6InBldHJvd3BldHIyM0B5YW5kZXguY29tIjtpOjEyO3M6MTQ6ImdkQGdvZGFkZHkuY29tIjtpOjEzO3M6Mjc6ImpmOHh6ajNAZ2hhcmFid2V5aHlkMTYwLmNvbSI7aToxNDtzOjI3OiJqOWV1NWtAcGhvc3dvb2RjbGFyYTE4NS5jb20iO2k6MTU7czoyMzoid29yZGNhbXBzQHdvcmRwcmVzcy5jb20iO2k6MTY7czoyNzoic29sYXJzYWx2YWRvcjEyMzRAZ21haWwuY29tIjtpOjE3O3M6MjY6IkpvaG5NaWxsZXI4M0B3b3JkcHJlc3MuY29tIjtpOjE4O3M6MjA6IndwaW5mbzEyMzRAZ21haWwuY29tIjtpOjE5O3M6MTY6InN5c3RlbUBsb2NhbGhvc3QiO2k6MjA7czoyMjoic3lzdGVtQHdvcmRwcmVzcy5sb2NhbCI7aToyMTtzOjIxOiJ3cHNlcnZpY2VzQHlhbmRleC5jb20iO2k6MjI7czoxOToiam9lZG91ODdAbm9tYWlsLmNvbSI7aToyMztzOjE3OiIlQGFkbWluaXN0cndwLmNvbSI7aToyNDtzOjE3OiJlY2hvbGwlQGdtYWlsLmNvbSI7aToyNTtzOjE3OiJzdXBlcnVzZXIlQHlhaG9vJSI7aToyNjtzOjE4OiIlYmFsYW50ZnJvbXN1bi5jb20iO2k6Mjc7czoxOToiJUB3b3JkcHJlc3Mub3JnLmNvbSI7aToyODtzOjI1OiJkci5pbmplY3Rpb25pQGhvdG1haWwuY29tIjtpOjI5O3M6MjE6ImNsZWFuZXJAd29yZGZlbmNlLmNvbSI7aTozMDtzOjIyOiJ3b3JkY2FtcEB3b3JkcHJlc3MuY29tIjtpOjMxO3M6MTc6InRlc3RpbmdAZ21haWwuY29tIjtpOjMyO3M6MjA6InVwZGF0ZUB3b3JkcHJlc3Mub3JnIjtpOjMzO3M6MzU6IndwJF9zeXMkX2FqemJAZGV2LndvcmRwcmVzcy5vcmcuY29tIjtpOjM0O3M6MTQ6ImxpY2tzQG1haW4uY29tIjtpOjM1O3M6Mjc6InN1cHBvcnRAd29yZHByZXNzZW5naW5lLmNvbSI7aTozNjtzOjI1OiJkb2Nzc0Bpbm1vdGlvbmhvc3RpbmcuY29tIjtpOjM3O3M6MjU6InRyYWlud29yZHByZXNzYWlAc2l0ZS5jb20iO2k6Mzg7czoxOToiYXNhZ3JjeWRxeEBuYWlsLmNvbSI7aTozOTtzOjE5OiJhc25xbXpwa3JkQG5haWwuY29tIjtpOjQwO3M6Mjc6ImRvLW5vdC1yZW1vdmVAd29yZHByZXNzLmMwbSI7aTo0MTtzOjExOiIxMjNAYWJjLmNvbSI7aTo0MjtzOjI1OiJnZXJ0cnVkZUBnYW1lY29uc29sZS5zaXRlIjtpOjQzO3M6MjQ6ImNvZGVyYnJ1aEBwcm90b25tYWlsLmNvbSI7aTo0NDtzOjEzOiJjYW1lQGVtYWlsLndwIjtpOjQ1O3M6MTc6IndwZGV2QGhvdG1haWwuY29tIjtpOjQ2O3M6MjM6IndwLXNlY3VyaXR5QGhvdG1haWwuY29tIjtpOjQ3O3M6MjQ6ImNvZGVyYnJ1aEBwcm90b25tYWlsLmNvbSI7aTo0ODtzOjIxOiJ3YWRtaW53QHdvcmRwcmVzcy5jb20iO2k6NDk7czoyMzoib3JkZXJub3dAcHJvdG9ubWFpbC5jb20iO2k6NTA7czoyMjoid3d3YWRtaW5Ad29yZHByZXNzLmNvbSI7aTo1MTtzOjIyOiJkMHJrLmY0MTloNzNyQGdtYWlsLmNvIjt9fXM6NjoiSm9vbWxhIjthOjE6e3M6MjI6IjxQUkVGSVg+dXNlcnMudXNlcm5hbWUiO2E6Nzp7aTowO3M6MjA6Impvb21sYS51c2VyLmhlbHBlci4lIjtpOjE7czoxMToic3VwZXJ1c2VyOCUiO2k6MjtzOjExOiJzdXBlcnVzZXI5JSI7aTozO3M6MTE6InN1cGVydXNlcjElIjtpOjQ7czo4OiJuZXdhZG1pbiI7aTo1O3M6MTg6IndvcmRwcmVzcyRfc3VwcG9ydCI7aTo2O3M6MTI6ImFkbWluc3RyYXRvciI7fX1zOjc6Ik1hZ2VudG8iO2E6MTp7czoyNzoiPFBSRUZJWD5hZG1pbl91c2VyLnVzZXJuYW1lIjthOjk6e2k6MDtzOjE1OiJzdXBwb3J0LW1hZ2VudG8iO2k6MTtzOjg6InNlY0FkbWluIjtpOjI7czoxMToibWFnZXN1cHBvcnQiO2k6MztzOjY6InN5c21vbiI7aTo0O3M6MTA6IlN1cGVyYWRtaW4iO2k6NTtzOjE0OiJzeXN0ZW0kX2JhY2t1cCI7aTo2O3M6OToibWFnZW50b2t1IjtpOjc7czoxMToibWdudHJlc3RvcmUiO2k6ODtzOjY6Im1hbmdnbyI7fX19' ) );
$DB_USER_SIGNATURES = unserialize( base64_decode( 'YToxOntzOjk6IldvcmRQcmVzcyI7YToxMjp7czozMDoiZGJfdXNlci56ZXJvX2NyZWF0aW9uX3RpbWUuMDAxIjthOjM6e2k6MDtpOjEzO2k6MTtzOjEzOiI8UFJFRklYPnVzZXJzIjtpOjI7czozNDoiVElNRSh1c2VyX3JlZ2lzdGVyZWQpID0gJzAwOjAwOjAwJyI7fXM6MjM6ImRiX3VzZXIudGVjaHN1cHBvcnQuMDAxIjthOjM6e2k6MDtpOjE0O2k6MTtzOjEzOiI8UFJFRklYPnVzZXJzIjtpOjI7czo5MToidXNlcl9sb2dpbiBMSUtFICd0ZWNoc3VwcG9ydCcgQU5EIHVzZXJfZW1haWwgTElLRSAnJyBBTkQgVElNRSh1c2VyX3JlZ2lzdGVyZWQpID0gJzAwOjAwOjAwJyI7fXM6MTk6ImRiX3VzZXIuaHVib3Bzcy4wMDEiO2E6Mzp7aTowO2k6MTQ7aToxO3M6MTM6IjxQUkVGSVg+dXNlcnMiO2k6MjtzOjcwOiJ1c2VyX2VtYWlsIExJS0UgJyVAaHVib3Bzcy5jb20nIEFORCBUSU1FKHVzZXJfcmVnaXN0ZXJlZCkgPSAnMDg6MDk6MjMnIjt9czoyNToiZGJfdXNlci5jb21fZW1haWxfY29tLjAwMSI7YTozOntpOjA7aToxNDtpOjE7czoxMzoiPFBSRUZJWD51c2VycyI7aToyO3M6NjM6InVzZXJfbG9naW4gTElLRSAnY29tJF8lJyBBTkQgdXNlcl9lbWFpbCBMSUtFICdjb20kXyVAZW1haWwuY29tJyI7fXM6MjU6ImRiX3VzZXIuY29tX2VtYWlsX2NvbS4wMDIiO2E6Mzp7aTowO2k6MTQ7aToxO3M6MTM6IjxQUkVGSVg+dXNlcnMiO2k6MjtzOjk2OiJ1c2VyX2xvZ2luIFJFR0VYUCAnY29tW2EtejAtOV0qW0EtWl0rJyBBTkQgdXNlcl9lbWFpbCBSRUdFWFAgJ2NvbVthLXowLTldKltBLVpdK1teQF0qQGVtYWlsLmNvbSciO31zOjIyOiJkYl91c2VyLmNvbnRyb2xsZXIuMDAxIjthOjM6e2k6MDtpOjE0O2k6MTtzOjEzOiI8UFJFRklYPnVzZXJzIjtpOjI7czoyOToidXNlcl9sb2dpbiBMSUtFICdjb250cm9sbGVyJSciO31zOjIxOiJkYl91c2VyLmFkbWluX2NvbS4wMDEiO2E6Mzp7aTowO2k6MTQ7aToxO3M6MTM6IjxQUkVGSVg+dXNlcnMiO2k6MjtzOjY0OiJ1c2VyX2xvZ2luIExJS0UgJ2FkbWlubGluJyBBTkQgdXNlcl9lbWFpbCBMSUtFICdhZG1pbkBhZG1pbi5jb20nIjt9czoyMDoiZGJfdXNlci5uYWlsX2NvbS4wMDEiO2E6Mzp7aTowO2k6MTQ7aToxO3M6MTM6IjxQUkVGSVg+dXNlcnMiO2k6MjtzOjM4OiJ1c2VyX2VtYWlsIFJFR0VYUCAnW2Etel17MTB9QG5haWwuY29tJyI7fXM6MjI6ImRiX3VzZXIubG9naW5fc3BhbS4wMDEiO2E6Mzp7aTowO2k6MTQ7aToxO3M6MTM6IjxQUkVGSVg+dXNlcnMiO2k6MjtzOjY3OiJ1c2VyX2xvZ2luIFJFR0VYUCAnKGNoYXR8bWVldHxkYXRlKSBbOmFscGhhOl0rIGFuZCBbOmFscGhhOl0rIHd3dy4nIjt9czoyMjoiZGJfdXNlci5sb2dpbl9zcGFtLjAwMiI7YTozOntpOjA7aToxNDtpOjE7czoxMzoiPFBSRUZJWD51c2VycyI7aToyO3M6NTM6InVzZXJfbG9naW4gUkVHRVhQICdbOmFscGhhOl0rIGhhcyBzZW50IHlvdSBbOmRpZ2l0Ol0nIjt9czoyMjoiZGJfdXNlci5sb2dpbl9zcGFtLjAwMyI7YTozOntpOjA7aToxNDtpOjE7czoxMzoiPFBSRUZJWD51c2VycyI7aToyO3M6Nzc6InVzZXJfbG9naW4gUkVHRVhQICdbOmFscGhhOl0rIFs6YWxwaGE6XSsgaHR0cHNbOmFscGhhOl0rW146YWxwaGE6XVs6YWxwaGE6XSsnIjt9czoyMjoiZGJfdXNlci5sb2dpbl9zcGFtLjAwNCI7YTozOntpOjA7aToxNDtpOjE7czoxMzoiPFBSRUZJWD51c2VycyI7aToyO3M6NjE6InVzZXJfZW1haWwgUkVHRVhQICd0ZXN0WzpkaWdpdDpdWzpkaWdpdDpdK0BtYWlsLmltYWlsZnJlZS5jYyciO319fQ==' ) );
$DB_NOCLEAN_FOR_ROBOT = unserialize( base64_decode( 'YTo3OntzOjIzOiJpbmplY3RlZC5oaWRkZW4tZGl2LjAwMSI7aToxO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDA3IjtpOjE7czoyNDoiaW5qZWN0ZWQuaGlkZGVuLXNwYW4uMDAxIjtpOjE7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2RvY3VtZW50LjAwMyI7aToxO3M6MzM6ImluamVjdGVkLmpzX2RvY3VtZW50X2xvY2F0aW9uLjAwNyI7aToxO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDA3IjtpOjE7czoyODoiaW5qZWN0ZWQuanNfY2xpY2tfaGlqYWNrLjAwMSI7aToxO30=' ) );
$DB_SIGS = unserialize( base64_decode( 'YTo0OTI6e3M6NzoiPHNjcmlwdCI7YTo3Njp7aTowO2k6MTA7czozOiJzcmMiO2E6MTk2OntpOjA7aToxMDtzOjg6Ii8vIGIzNzRrIjthOjI6e2k6MDtpOjEwO3M6MTY6ImZ1bmN0aW9uIHBraWxsKCkiO2E6Mjp7aTowO3M6MTg6ImJhY2tkb29yLnNoZWxsLjAwNSI7aToxO3M6MzQ6In48XD9waHBbXHNdKlwvXC8gYjM3NGtbXlx4MDJdK1w/Pn4iO319czoxMjoiLnNwbGl0KCJ8Iik7IjthOjI6e2k6MDtpOjEwO3M6Njc6IikuaW5uZXJIVE1MID0gJzxpZnJhbWUgZnJhbWVib3JkZXI9IjAiIHdpZHRoPSIwIiBoZWlnaHQ9IjAiIHNyYz0iJysiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDQ1IjtpOjE7czoyMTU6In48ZGl2IGlkPS5bXj5dKz5bXHNdKjwuZGl2Pltcc10qPHNjcmlwdFtePl0rPltcc10qdmFyIFtcd10rW1xzXSo9W1xzXSpbXjtdKztbXHNdKnZhciBbXHddK1tcc10qPVtcc10qW1x3XStcLnNwbGl0XCguXHwuXCk7W1xzXSp2YXIgW1x3XStbXHNdKj1bXHNdKltcd10rXFtbXGRdK1xdW1xzXSpcK1teO10rO1tcc10qZG9jdW1lbnRcLlteO10rO1tcc10qPC5zY3JpcHQ+W1xzXSp+Ijt9fXM6MjE6Imh0dHA6Ly9hZS5hd2F1ZS5jb20vNyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMjEiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMjoiaHR0cDovL2llLmVyYWNvdS5jb20vMyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMjIiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMToiaHR0cDovL2FvLmV1dWF3LmNvbS85IjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjAyMyI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIyOiJodHRwOi8vdWUub2Vhb3UuY29tLzMxIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjAyNCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIwOiJodHRwOi8vYWVhYWVhLmNvbS9vdSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMjUiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMDoiaHR0cDovL3NlY3JlZS5jb20vcmUiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDI2IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjA6Imh0dHA6Ly91b2F1ZXIuY29tL3NpIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjAyNyI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIwOiJodHRwOi8vb2Vvb2VhLmNvbS92ZSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMjgiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMToiaHR0cDovL3NlY29uZW8uY29tL29uIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjAyOSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIwOiJodHRwOi8vc2Vjb3dvLmNvbS93byI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMzAiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMDoiaHR0cDovL291cm91ZS5jb20vc2UiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDMxIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6NDI6Imh0dHA6Ly9qcy50cmFmZmljYW5hbHl0aWNzLm9ubGluZS9qcy9qcy5qcyI7YToyOntpOjA7czoyNDoiYmFja2Rvb3IuanNfbmV1dHJpbm8uMDAxIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTg6InJlc3R3cC5tb2JpZGVhLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNjQiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNDoiaHR0cHM6Ly9pcy5nZC8iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLnVybF9zaG9ydGVuZXIuMDAxIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTY6InZvaXBuZXdzd2lyZS5uZXQiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDg5IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTE6ImNwbWF0aWsuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA5MCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE2OiJnbGFzc3N1bnNoaW5lLmNmIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA5MSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE1OiJzdW5pZ2xhc3Nlcy5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDkyIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTI6ImV4YW1ob21lLm5ldCI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wOTQiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNzoidXVzdG91Z2h0b25tYS5vcmciO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDk3IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTY6ImRydXBhbHVwZGF0ZXMudGsiO2E6Mjp7aTowO3M6MjM6Im1hbHdhcmUuY3J5cHRvbWluZXIuMDEwIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjE6Imh0dHBzOi8vbWFnZW50by5uYW1lLyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMDIiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMjoiaHR0cDovL3Jvc2EtdGVtYS5pbmZvLyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMzIiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czozMjoiaHR0cDovL2J3aW5wb2tlcjI0LmNvbS9jbGljazcuanMiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDMzIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6NDc6Imh0dHA6Ly93ZWxjb21ldG90aGVnbG9iYWxpc29yZy5jb20vanMucGhwP2trPTI2IjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjAzNCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjQ5OiJodHRwOi8vZ2xvYmFscG93ZXJpbmdnYXRoZXJpbmdvbi5jb20vbGwucGhwP2trPTE2IjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjAzNSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjI5OiJodHRwOi8vaW5qai5pZ25vcmVsaXN0LmNvbS8xNCI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMzYiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czo1NjoiaHR0cDovL2NvdW50ZXI1LmFsbGZyZWVjb3VudGVyLmNvbS9wcml2YXRlL2NvdW50ZXIuanM/Yz0iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDM3IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6NDM6Imh0dHA6Ly9zd2VlcHN0YWtlc2FuZGNvbnRlc3RzZG8uY29tL3BtZy5waHAiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDM4IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6NDY6Imh0dHA6Ly9zd2VlcHN0YWtlc2FuZGNvbnRlc3RzZG8uY29tL25sLnBocD9wPWQiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDM5IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MzQ6Imh0dHA6Ly9hc2F1bmlyZy5jb20uYnIvanMvMGRheS5waHAiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDQwIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MzY6Imh0dHA6Ly9kZW55Ym9uZmFudGUuY29tL2FwcC9NZW51LnBocCI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNDEiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czozMzoiaHR0cDovL2xpZy1saW1wLmNvbS5ici9yZWJvdHMucGhwIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA0MiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIwOiIkZG9tYWluL2xsLnBocD9raz0xMSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNDMiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czozNzoiaHR0cDovL3dvcmRwcmVzcy11cGRhdGUuY29tL2dvb2dsZS5qcyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNDQiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czo0MzoiLy8wMDU1ZDdiLm5ldHNvbGhvc3QuY29tL0Jsb2cvbGliMi9qcy9qcy5qcyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNDUiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czo0MToiaHR0cDovL2Fkcy5nb29nbGVhZHNlcnZpY2VzLmF0L2NvdW50ZXIuanMiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDQ2IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MzA6Imh0dHBzOi8vZGF0YWluZm9ybWVyeC5ldS9ldS5qcyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNDciO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyNToianMtY2xvdWQuY29tL2pzL3N0YXRpYy5qcyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNzUiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxMzoiYWxlaW52ZXN0Lnh5eiI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNjciO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNzoiaWRpb21hc2Vudml2by5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDY4IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTk6Imh0dHA6Ly9hbGVtb25leS54eXoiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDcxIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6Mjg6InRyYWZmaWNleGNoYW5nZXIuYml6L21haW4uanMiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDczIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjE6InN0YXRzLnN0YXJ0cmVjZWl2ZS50ayI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNzgiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNzoib25saW5lY2xvdWRzLmluZm8iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDc5IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTU6IjovL3Bhc3RlYmluLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNDgiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxOToiLy9nb2Z1cm5pdHVyZS5jby51ayI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNDkiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNjoiaHR0cDovL25pbm5pLm9yZyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNTAiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMzoiLy9zdGF0aWMtNDY3Ny5reGNkbi5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDUxIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6Mzg6Imh0dHBzOi8vd3d3LndlYnN0YXQuY2MvbWVkaWEvY29va2llLmpzIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA1MiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjM5OiJodHRwOi8vd3d3LmJsb2cucGFzYXJzb3JlLmNvbS93cC1hZG1pbi8iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDUzIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MzI6Imh0dHA6Ly93d3cuZ2V0LnNwYWNlL3dwLWNvbnRlbnQvIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA1NCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjMwOiJodHRwOi8vd3d3LndlbGRpbXBleC5odS9tZWRpYS8iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDU1IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MzY6Imh0dHA6Ly93d3cuaGNpZnguY29tL3Ryb3llbmdlbGhhcmR0LyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNTYiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNToiaHR0cHM6Ly9nb28uZ2wvIjthOjI6e2k6MDtzOjIyOiJiYWNrZG9vci5qc19nb29fZ2wuMDAxIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjA6Imh0dHA6Ly9nb28uZ2wvQnRGVlBkIjthOjI6e2k6MDtzOjI1OiJiYWNrZG9vci5qc19nb29fZ2wuMDAxLjAyIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6NTE6Ii8vd3d3LmhlcmJhbHNob3BwZS5jb20vanMvc2NyaXB0YWN1bG91cy9lbGVtZW50cy5qcyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNTciO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxOToiaHR0cDovL2EuYzA1OTQuY29tLyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNjAiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxMjoianMtcmVhY3QuY29tIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA1MSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE2OiJjcmVhdGl2ZXRlaHMuY29tIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA1NiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIwOiJtYWdlbnRvLXNlY3VyaXR5Lm9yZyI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNTIiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czo0MToiYWRuZXR3b3JrcGVyZm9ybWFuY2UuY29tL2EvZGlzcGxheS5waHA/cj0iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLmpzX3Vud2FudGVkX2Fkcy4wMDgiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czo0NDoicmVkaXJlY3RfYmFzZS9yZWRpcmVjdC5qcyIgaWQ9IjEzNzE0OTkxNTU1NDUiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLm1hZ2VudG9fcmVkaXJlY3QuMDAxIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTI3OiIvd3AtY29udGVudC8tLXBsdWdpbnMub2xkL3dwLXBvcHVwLXNjaGVkdWxlci9lZGl0b3IvanNjcmlwdHMvdGlueV9tY2UvcGx1Z2lucy9pbmxpbmVwb3B1cHMvc2tpbnMvY2xlYXJsb29rczIvYWN0aW9uX3JlcXVlc3QucGhwIjthOjI6e2k6MDtzOjIyOiJiYWNrZG9vci53cC1wb3BfdXAuMDAxIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6NDc6InMzLmFtYXpvbmF3cy5jb20vY2FzaGUtanMvMTQzZTdjZGViZjE5M2QyNzY0LmpzIjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA4MC4wNCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjc6ImN1ZXYuaW4iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDgxIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTA6Imh2YXRvLmluZm8iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDgyIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6Mjc6InNjcmlwdC5jcmVhdGl2ZXNjZW5lc2VzLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wODMiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMDoiaW5mb2FuYWx5dGljcy50b29scy8iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDg0IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTU6ImVsdXhlci5uZXQvY29kZSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wODUiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czozMDoicmF3Z2l0LmNvbS9zc25uaXBwZXJyL3JlZGlyZWN0IjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA4NiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjEyOiJwb29yZ2VuLm5ldC8iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDg3IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjA6ImNkbi53aWRnZXRzZXJ2ZXIuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA5OCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjEyOiJtYWdlbnRvLm5hbWUiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDk5IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTI6Imhhc2hpbmcud2luLyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMDAiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNzoiaG90b3Bwb25lbnRzLnNpdGUiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTAxIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTc6IndhcDRkb2xsYXIuY29tL2FkIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjEwMyI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE0OiJsb2Fkc291cmNlLm9yZyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMDQiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNToiY29vbHBhZ2VjdXAuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjEwNSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE2OiJjZG5hbmFseXRpY3MubmV0IjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjEwNiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjEyOiJzY3JiaXppbS54eXoiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTA3IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTk6ImpzY29udHJvbGxlci5zdHJlYW0iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTA4IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTc6ImNkbi5mdXNlLWRhdGEuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjExMSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjEyOiJzYXNrbWFkZS5uZXQiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTEyIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTM6ImRvd2xleHRmZi5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTEzIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTg6ImFqYXguZ29vcWxlYXBpLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMTQiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNjoiY291bnRzb3VyY2UuY29vbCI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMTUiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czo5OiJjZG43Ny5vcmciO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTE2IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTU6Im1hZ2VudG9jb3JlLm5ldCI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQubWFnZW50b19zaG9wbGlmdC4wMDMuMDIiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxMToibWluaWpzLmluZm8iO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLm1hZ2VudG9fc2hvcGxpZnQuMDA2IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6Mjg6InRyYWZmaWN0cmFkZS5saWZlL3NjcmlwdHMuanMiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmpzX21hbHdhcmUuMDAxIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTE6IjAyMGhhaXIuY29tIjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5tYWdlbnRvX3Nob3BsaWZ0LjAwNyI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjEzOiJleHRjb29sZmYuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjExOCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIwOiJmb3J3YXJkbXl0cmFmZmljLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMjAiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxMjoiZWxlZ3JpbmEuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjEyMSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE5OiJibHVlZXllc3dlYnNpdGUuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjEyMiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE4OiJvbmxpbmVjbG91ZHMuY2xvdWQiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTIzIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTI6InN0YXRzcmMuY29vbCI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMjQiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMDoic2ltcGxlb25lbGluZS5vbmxpbmUiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTI1IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTM6ImFkcmVxdWVzdC54eXoiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTI2IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTY6Imd0YWdtYW5hZ2Vycy5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTI3IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjE6Im1hZ2VudG8tYW5hbHl0aWNzLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMjgiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNDoianF1ZXJ5LXdlYi5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTI5IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTc6ImdldG15bGFuZGluZy5zaXRlIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjEzMCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE0OiJsaWtlbXl0ZXN0cy5wdyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMzEiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxOToic29tZWxhbmRpbmdwYWdlLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMzIiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMzoiY2EtcHViLTQ1MDMwOTAxNzE3NzA0MjQiO2E6Mjp7aTowO3M6MjQ6ImpzLnNwYW0tc2VvLmJvZ3VzX2FkLjAwMSI7aToxO3M6MTkzOiJ+PHNjcmlwdCBhc3luYyBzcmM9Li4ucGFnZWFkMi5nb29nbGVzeW5kaWNhdGlvblwuY29tW14+XSs+PC5zY3JpcHQ+W1xzXSo8aW5zIGNsYXNzPS5hZHNieWdvb2dsZVtePl0rY2EtcHViLTQ1MDMwOTAxNzE3NzA0MjQuW14+XSs+W1xzXSo8Lmlucz5bXHNdKjxzY3JpcHQ+W1xzXSpcKGFkc2J5Z29vZ2xlW1xzXSo9W14+XSs8LnNjcmlwdD5+Ijt9czoxNToiZGFuY2V3aXRobWUuYml6IjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjEzNSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjExOiJkb2xvaGVuLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMzYiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMjoiYXBwcy5jYXJlc2VhcmNoLmNvbS5hdSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMzciO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMjoid3d3LnRhcmdldGludGVybmV0LmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMzgiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNjoieW91cnNlcnZpY2UubGl2ZSI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMzkuMDIiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNzoiYmxhY2thd2FyZGFnby5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTQwIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6NDg6In5cL3N0YXRzLmpzXD9bXHddPVtcd11cJi4gdHlwZT0udGV4dC5qYXZhc2NyaXB0fiI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNDEiO2k6MTtzOjgzOiJ+PHNjcmlwdFtcc10qc3JjW1xzXSo9W1xzXSouaHR0cHM/OltePl0rc3RhdHNcLmpzXD9bXHddPVtcd11cJltePl0rPltcc10qPC5zY3JpcHQ+fiI7fXM6MjM6InNpdGV2ZXJpZmljYXRpb24ub25saW5lIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE0MiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE5OiJvcGVuY2FydG1vZHVsZXMuYml6IjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE0MyI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIwOiJnb29nbGV0YWduYW1hZ2VyLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNDQiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNToibG9jYWxzdG9yYWdlLnRrIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE0NSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE5OiJnb2dsZXRhZ21hbmFnZXIuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE0NiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE4OiJjaGFsbGVuZ2Vmb3JtZS5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTQ3IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjY6Imdvb2dsZWFkc2VydmljZXNvbmxpbmUuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE0OSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjEwOiJyOXdlYnMuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE1MSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE1OiJ3ZWJ0b29sc2FwcC5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTUyIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjE6ImJlbGF0ZXJiZXdhc3RoZXJlLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNTMiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyNjoiY3JlYXRlcmVsYXRpdmVjaGFuZ2luZy5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTU0IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjM6InBsMTUxODA3NzMucHZjbG91ZHMuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE1NSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE4OiJwNzk0NzkuY2xrc2l0ZS5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTU2IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6ODE6IjsmcGVyaW9kOyYjeDYxOyYjeDcwOyYjeDcwOyYjeDY1OyYjeDZFOyYjeDY0OyYjeDQzOyYjeDY4OyYjeDY5OyYjeDZDOyYjeDY0OyZscGFyOyI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDMwIjtpOjE7czoxMTU6In48c2NyaXB0W14+XSs7JnBlcmlvZDsmI3g2MTsmI3g3MDsmI3g3MDsmI3g2NTsmI3g2RTsmI3g2NDsmI3g0MzsmI3g2ODsmI3g2OTsmI3g2QzsmI3g2NDsmbHBhcjtbXj5dKz5bXHNdKjwuc2NyaXB0Pn4iO31zOjIyOiJ0cmFzbmFsdGVteXJlY29yZHMuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE1NyI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE2OiJidXlpdHRyYWZmaWMuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE1OCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE3OiJ3b3JsZGN0cmFmZmljLmNvbSI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNTguMDIiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMzoiZ3JlZW5sYWJlbGZyYW5jaXNjby5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTU5IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTU6ImdvdG9zZWNvbmQyLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNjAiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMToiLmFkbWFya2V0bG9jYXRpb24uY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE2MSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE3OiIuYWRzZm9ybWFya2V0LmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNjIiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMToiYXB1LnBocD96b25laWQ9Njc2NjMwIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE2MyI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE5OiJkZXN0aW55ZmVybmFuZGkuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE2NCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjI1OiJwcml2YWN5bG9jYXRpb25mb3Jsb2MuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE2NSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIyOiJ3aGVyZWRveW91Y29tZWZyb20ub3ZoIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE2NiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIzOiJ3d3cuZnJlZWNvdW50ZXJzdGF0LmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNjciO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMjoidmVyeWJlYXRpZnVsYW50b255LmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNjkiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNDoic3RhdC1ncm91cC5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTcwIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTQ6Im1laWRpYXBsdXMuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE3MSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIxOiJjb2xsZWN0ZmFzdHRyYWNrcy5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTcyIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6OToici5hYmEub29vIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE3MyI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIwOiJyZXNvbHV0aW9uZGVzdGluLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNzQiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxOToic2NyaXB0YWxpY2lvdXMuaW5mbyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNzUiO2k6MTtzOjU3OiJ+PHNjcmlwdFtePl0rc2NyaXB0YWxpY2lvdXNcLmluZm9bXj5dKz5bXHNdKig8LnNjcmlwdD4pP34iO31zOjIwOiJsZWFybmluZ3Rvb2xraXQuY2x1YiI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNzYiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMjoiZ29vZ2xlLWFuYWx5dGNzYXBpLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNzciO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxODoic3RpdmVuZmVybmFuZG8uY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE3OCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIxOiJ0cmFja3N0YXRpc3RpY3Nzcy5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTc5IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTY6ImRpZ2VzdGNvbGVjdC5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTgwIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6NzY6IjxzY3JpcHQgc3JjPSJkYXRhOnRleHQvaHRtbDtiYXNlNjQsYVdZZ0tIUjVjR1Z2WmlCS1UwOU9JQ0U5UFNBaWIySnFaV04wSWlrZ2UiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTE1IjtpOjE7czo2MToifjxzY3JpcHQgc3JjPS5kYXRhOnRleHQuaHRtbDtiYXNlNjQsYVdZZ0tIUjVjW14+XSs+PC5zY3JpcHQ+fiI7fXM6MjA6ImRldmVsb3BmaXJzdGxpbmUuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE4MSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIyOiJkb250c3RvcHRoaXNtdXNpY3MuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE4MiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjMyOiJodHRwczovL2FwaWJhemFhcnZvaWNlLmNvbS9idi5qcyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xODMiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czozMToiaHR0cHM6Ly9ibGFja2VudGVydGFpbm1lbnRzLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xODQiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNDoiZmluZ2VybGluZy5vcmciO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTg1IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTY6Im1hZ2VudG8tYXBpLmhvc3QiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTg2IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTY6ImJ1bGxnb2VzZG93bi5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTg3IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTY6ImxvYmJ5ZGVzaXJlcy5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTg4IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTc6ImxldHNtYWtlcGFydHkzLmdhIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE4OSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE4OiJkZXZlbG9wZXJzdGF0c3MuZ2EiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTkwIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjM6ImRvbmF0ZWxsb2Zsb3dmaXJzdGx5LmdhIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE5MSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE5OiJsb3dlcmJlZm9yd2FyZGVuLm1sIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE5MiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE1OiJwb3BvbmNsaWNrLmluZm8iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTkzIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTc6ImNkbmJvb3RzdHJhcC5ob3N0IjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE5NCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjEzOiJtaWxrcGxvYWQubmV0IjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE5NiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjExOiJoYXBweWtpZC5pbiI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xOTciO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMDoibWFnZW50by1mZWVkYmFjay5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTk4IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjE6Imxvd2VydGhlbnNreWFjdGl2ZS5nYSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xOTkiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxMToiZzk4Lm1vbnN0ZXIiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMjAwIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTM6InBpbmdjbG9jay5uZXQiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMjAyIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTI6InNvZGFwb3AuYnV6eiI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4yMDQiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxODoiYmFua2luZ2NvbmNlZGUuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjIwNSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE2OiJ3Z2F0NWxuMndseTguY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjIwNiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE5OiJqcXVlcnktYW5hbHlzaXMuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjIwNyI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE1OiJkb250a2luaG9vb3QudHciO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMjA4IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjM6InRyYXZlbGZvcm5hbWV3YWxraW5nLmdhIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjIwOSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE5OiJsb3ZlZ3JlZW5wZW5jaWxzLmdhIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjIxMCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjEwOiJnb3JhcHMuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjIxMSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjg6ImpzbWluLmNvIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjIxMiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE4OiJoaXR0YWlsLmNvbS9tbHQuanMiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMjEzIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTY6InBpdGVycmVjZWl2ZXIuZ2EiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMjE0IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTU6IndvZHJwcmVzcy5wcC51YSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4yMTUiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxMToiZ29vZ2FwaS5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMjE2IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6Mjc6ImFpcmxpbmVyYXBwZXRpemluZ2NvYXN0LmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4yMTciO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMjoic3RvcmVyaWdodGRlc2ljaW9uLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4yMTgiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyNjoibmF0dXJhbGZyZXNobWFsbC5jb20vaW1hZ2UiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTY5IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6ODoiZ282cy5iaXoiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMjE5IjtpOjE7czo0NjoifjxzY3JpcHRbXj5dK2dvNnNcLmJpeltePl0rPltcc10qKDwuc2NyaXB0Pik/fiI7fXM6MTE6Im9wdG91dC9zZXQvIjthOjI6e2k6MDtpOjEwO3M6OToiP2pzb25wPV9fIjthOjI6e2k6MDtzOjE3OiJpbmplY3RlZC5sbmtyLjAwMyI7aToxO3M6MzU2OiJ+KDxzY3JpcHQgW148Pl0qc3JjPVsiJ11bXiInXSo/XC9cL1tcd1wtXC5dK1wvW14iJ10qKD86bG5rcjVcLm1pblwuanN8bG5rcjMwX250XC5taW5cLmpzfG9wdG91dFwvc2V0XC9cdytcP2pzb25wPV9ffFswLTlhLWZdezE4fVwuanN8XC93aGl0ZWxpc3RcL1xkezR9XC98anNcL2ludC5qc1w/a2V5PVswLTlhLWZdezQwfSZhbXA7dWlkPXxcP2tleT1bMC05YS1mXXs0MH0mYW1wO3VpZD1cZHs0fXh8dmFsaWRhdGUtc2l0ZVwuanNcP3VpZD1cZHs1fXh8YVwvZGlzcGxheS5waHBcP3I9fCZhbXA7ZXh0PU5vdCUyMHNldHxjb2RlXD9pZD1cZHszfSZhbXA7c3ViaWQ9KVteIiddKlsiJ11bXjw+XSo+XHMqPFwvc2NyaXB0PlxzKikrfiI7fX1zOjE1OiIvanMvaW50LmpzP2tleT0iO2E6Mjp7aTowO3M6MTc6ImluamVjdGVkLmxua3IuMDAxIjtpOjE7czozNTY6In4oPHNjcmlwdCBbXjw+XSpzcmM9WyInXVteIiddKj9cL1wvW1x3XC1cLl0rXC9bXiInXSooPzpsbmtyNVwubWluXC5qc3xsbmtyMzBfbnRcLm1pblwuanN8b3B0b3V0XC9zZXRcL1x3K1w/anNvbnA9X198WzAtOWEtZl17MTh9XC5qc3xcL3doaXRlbGlzdFwvXGR7NH1cL3xqc1wvaW50LmpzXD9rZXk9WzAtOWEtZl17NDB9JmFtcDt1aWQ9fFw/a2V5PVswLTlhLWZdezQwfSZhbXA7dWlkPVxkezR9eHx2YWxpZGF0ZS1zaXRlXC5qc1w/dWlkPVxkezV9eHxhXC9kaXNwbGF5LnBocFw/cj18JmFtcDtleHQ9Tm90JTIwc2V0fGNvZGVcP2lkPVxkezN9JmFtcDtzdWJpZD0pW14iJ10qWyInXVtePD5dKj5ccyo8XC9zY3JpcHQ+XHMqKSt+Ijt9czoxOToiYWRkb25zL2xua3I1Lm1pbi5qcyI7YToyOntpOjA7czoxNzoiaW5qZWN0ZWQubG5rci4wMDIiO2k6MTtzOjM1Njoifig8c2NyaXB0IFtePD5dKnNyYz1bIiddW14iJ10qP1wvXC9bXHdcLVwuXStcL1teIiddKig/Omxua3I1XC5taW5cLmpzfGxua3IzMF9udFwubWluXC5qc3xvcHRvdXRcL3NldFwvXHcrXD9qc29ucD1fX3xbMC05YS1mXXsxOH1cLmpzfFwvd2hpdGVsaXN0XC9cZHs0fVwvfGpzXC9pbnQuanNcP2tleT1bMC05YS1mXXs0MH0mYW1wO3VpZD18XD9rZXk9WzAtOWEtZl17NDB9JmFtcDt1aWQ9XGR7NH14fHZhbGlkYXRlLXNpdGVcLmpzXD91aWQ9XGR7NX14fGFcL2Rpc3BsYXkucGhwXD9yPXwmYW1wO2V4dD1Ob3QlMjBzZXR8Y29kZVw/aWQ9XGR7M30mYW1wO3N1YmlkPSlbXiInXSpbIiddW148Pl0qPlxzKjxcL3NjcmlwdD5ccyopK34iO319czo4OiJmdW5jdGlvbiI7YToyNjp7aTowO2k6MTA7czoxMjoiZnVuY3Rpb24oXzB4IjthOjk6e2k6MDtpOjEwO3M6NDI6IjtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7alF1ZXJ5KGZ1bmN0aW9uKF8weCI7YToyOntpOjA7aToxMDtzOjIzOiJ4NjNceDY4XHg2MVx4NkVceDY3XHg2NSI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wMTEiO2k6MTtzOjIyNToifjxzY3JpcHQ+XHMqdmFyXHMqXzB4XHcrPVxbIi54NjMueDY4Lng2MS54NkUueDY3Lng2NVteXF1dK1xdKztzZXRUaW1lb3V0XChmdW5jdGlvblwoXClce2pRdWVyeVwoZnVuY3Rpb25cKF8weFx3KyhbXjtdKzspK1teLF0rLGRhdGE6W146XSs6XzB4W14sXSssZGF0YVR5cGU6XzB4W15cfV0rXH0sZXJyb3I6ZnVuY3Rpb25bXn1dK1x9XH1cKVx9XH1bXixdKyxcZHswLDEwfVwpXHMuLnNjcmlwdD5+Ijt9fXM6MTU6InNldEludGVydmFsKF8weCI7YToyOntpOjA7aToxMDtzOjEyOToifjxzY3JpcHRbXj5dKj5bXHNdKnZhciBfMHhbXHddK1tcc10qPVtcc10qXFtbXlxdXXsxNTAwLH1cXTtbXHNdKlwoZnVuY3Rpb25cKF8weFteXG5dK3NldEludGVydmFsXChfMHhbXHddK1teO10rXCk7W1xzXSo8LnNjcmlwdD5+IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjEyNSI7aToxO3M6MTI5OiJ+PHNjcmlwdFtePl0qPltcc10qdmFyIF8weFtcd10rW1xzXSo9W1xzXSpcW1teXF1dezE1MDAsfVxdO1tcc10qXChmdW5jdGlvblwoXzB4W15cbl0rc2V0SW50ZXJ2YWxcKF8weFtcd10rW147XStcKTtbXHNdKjwuc2NyaXB0Pn4iO319czoyMToifSxkZWNvZGU6ZnVuY3Rpb24oXzB4IjthOjI6e2k6MDtpOjEwO3M6Mjc6Il1dKCksQ3Z2OmpRdWVyeShkb2N1bWVudFtfJCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xNDgiO2k6MTtzOjEzNToifnZhciBbXHdcJF0rPVwoZnVuY3Rpb25cKF8weFteXCldK1wpXHt2YXIgXzB4W1x3XSs9XzB4W1x3XStcLmxlbmd0aDt2YXIgXzB4W1x3XSs9XFtcXTtmb3JcKHZhclteXG5dK3JldHVybiBfMHhbXHddK1x9XH1cfSxbXGRdK1wpW1xzXSp+Ijt9fXM6NDoiYXRvYiI7YTo0OntpOjA7aToxMDtzOjIyOiJ3aGlsZSghIVtdKXt0cnl7dmFyIF8wIjthOjQ6e2k6MDtpOjEwO3M6MTE6IildKGF0b2IsXzB4IjthOjM6e2k6MDtpOjEwO3M6NDQ6IntyZXR1cm4gYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoXzB4IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjE2MCI7aToxO3M6MjA3OiJ+dmFyW1xzXSpbXHddKz1bXHNdKlxbLltcd10rLixbXjtdKztbXHNdKnZhcltcc10qW1x3XSs9ZnVuY3Rpb25cKFtcd10rLFteXCFdK1wpO1x9O3doaWxlXCghIVxbXF1cKVx7dHJ5XHt2YXJbXHNdKltcd10rPXBhcnNlSW50XChbXkBdK1wpO1x9O2pRdWVyeVwoW1x3XStcKVxbW1x3XStcKFtcd10rLFtcd10rLFtcd10rLFtcd10rXClcXVwoW1x3XStcKTtcfVwpO34iO31zOjUyOiJ+PHNjcmlwdFtePl0qPlxzKmZ1bmN0aW9uIF8weFx3K1woXClce3ZhciBfMHhcdys9XFt+IjthOjI6e2k6MDtzOjI2OiJoYWNrdG9vbC5jYy1zdGVhbGVyLjE2MC4wMyI7aToxO3M6MTQ1OiJ+PHNjcmlwdFtePl0qPlxzKmZ1bmN0aW9uIF8weFx3K1woXClce3ZhciBfMHhcdys9XFtbXjxdK3doaWxlXCghIVxbXF1cKVx7dHJ5e3ZhciBfMHguK2VuY29kZVVSSUNvbXBvbmVudCxsb2NhdGlvbltePF0rXClcXVwoYXRvYixfMHguKz88LnNjcmlwdD5+Ijt9fXM6Nzc6In48c2NyaXB0W14+XSo+XHMqXChmdW5jdGlvblwoXzB4XHcrLF8weFx3K1wpXHt2YXIgXzB4XHcrPV8weFx3K1woXCk7ZnVuY3Rpb25+IjthOjI6e2k6MDtzOjI2OiJoYWNrdG9vbC5jYy1zdGVhbGVyLjE2MC4wMiI7aToxO3M6MTY2OiJ+PHNjcmlwdFtePl0qPlxzKlwoZnVuY3Rpb25cKF8weFx3KyxfMHhcdytcKVx7dmFyIF8weFx3Kz1fMHhcdytcKFwpO2Z1bmN0aW9uW148IV0rO313aGlsZVwoISFcW1xdXClce3RyeVx7dmFyW15cbl0rPydQT1NUJ1teXG5dKz9cXVwoYXRvYixbXj5dK1woalF1ZXJ5W148XSs8LnNjcmlwdD5+Ijt9czo2OiI6YXRvYigiO2E6Mjp7aTowO3M6MjY6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTYwLjA0IjtpOjE7czo4ODoifjxzY3JpcHRbXj5dKj5cKD9mdW5jdGlvbltePF0rPS54MjJwYXltZW50W15cbl0rPzphdG9iXChfW14+XStcKF8weFx3K1wpO1x9XCk7PC5zY3JpcHQ+fiI7fX1zOjE0OiJqc2ppYW1pLmNvbS52NiI7YToyOntpOjA7aToxMDtzOjI2OiI9PmRvY3VtZW50WydyZWZlcnJlciddW18weCI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDUwIjtpOjE7czoxMzM6In48c2NyaXB0W14+XSo+XHMqdmFyIF8weFx3Kz0uanNqaWFtaVwuY29tXC52Ni4sXzB4XHcrPVxbLis/PT5kb2N1bWVudFxbLnJlZmVycmVyLlxdW148XStuYXZpZ2F0b3JbXjxdK2pzamlhbWlcLmNvbVwudjYuO1xzKjwuc2NyaXB0Pn4iO319czozMjoiflwiYXRvYlwiLFwiXHcrLi5cIixcIlx3Ky5cIixcIn4iO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLmpzX3JlZGlyZWN0LjA0OC4wMiI7aToxO3M6MTY4OiJ+dmFyXHMqXzB4XHcrPVxzKlxbXCJcdysuLlwiLFwiXHcrXCIsXCJbXjtdKlxdO1xzKlwoZnVuY3Rpb25cKF8weFx3KyxfMHhcdytcKVx7dmFyXHMqXzB4XHcrPWZ1bmN0aW9uXChfMHhcdytcKVx7d2hpbGVcKC0tXzB4XHcrXClce18weFteOl0qXCksXHcrXFtcdytcXVwpLFx3K1woXClcKTtcfX4iO319czozMjoiKSwhW11dLFsnbmFtZScsJ3JlZ2lvbl9pZCcsISFbXV0iO2E6Mjp7aTowO3M6MjY6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTE0LjAyIjtpOjE7czoxMjY6In52YXIgXzB4W1x3XStbXHNdKj1bXHNdKlxbW15cXV0rXF07W1xzXSpcKGZ1bmN0aW9uXChfMHhbXlxuXSshXFtcXSwuW1x3XSsnOlteXH1dK1x9O1tcc10qXzB4W1x3XStcW18weFtcd10rXChbXlwpXStcKVxdXChcKTs/fiI7fXM6MzI6IlsncmVtb3ZlQ29va2llJ11bJ3RvU3RyaW5nJ10oKSk7IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjEzMSI7aToxO3M6NTk6In52YXIgXzB4W1x3XSs9XFtbXlxdXXsyMDAwLH1cXTtbXHNdKlwoZnVuY3Rpb25bXlxuXStcfVx9Oz9+Ijt9czozNzoiXV0oL3BheW1lbnR8YmlsbGluZzp8c2hpcHBpbmc6L2kpP18weCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xNDUiO2k6MTtzOjg1OiJ+dmFyIF8weFtcd10rW1xzXSo9W1xzXSpcWyIueFteO10rXF07W15cfF0rcGF5bWVudFx8YmlsbGluZ1teXG5dK1wpXH0sW1xkXStcKVx9W1xzXSp+Ijt9czoyNDoiInRvVVRDU3RyaW5nIiwiY29va2llIiwiIjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5qc19yZWRpcmVjdC4wNDgiO2k6MTtzOjE4NToifnZhclxzKlx3Kz1cWyJcdysuPSIsIjtcdys9IiwiW15cc10qdmFyXHMqXzB4XHcrPWZ1bmN0aW9uXChfMHhcdytcKVx7d2hpbGVcKC0tXzB4XHcrXClce1teXHNdKnZhclxzKlx3Kz1mdW5jdGlvblwoXzB4XHcrLF8weFteXG5dKlwpXF1cKFx3K1woXHcrXChcdytcW1x3K1xdXCksXHcrXFtcdytcXVwpLFx3K1woXClcKTtcfX4iO319czoyODoiZnVuY3Rpb24gc3R5bGVfc2Vzc2lvbl91bnNldCI7YToyOntpOjA7aToxMDtzOjM3OiIpLnN0eWxlLmRpc3BsYXkgPSBzdHlsZV9zZXNzaW9uX3Vuc2V0IjthOjI6e2k6MDtpOjEwO3M6MzM6IigpIHsgcmV0dXJuICJub25lIiB9IGZ1bmN0aW9uIGVuZCI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wNDMiO2k6MTtzOjIwNzoifjxzY3JpcHRbXj5dKz5bXHNdKmZ1bmN0aW9uIHN0eWxlX3Nlc3Npb25fdW5zZXRbXlx9XStyZXR1cm4gLm5vbmUuW1xzXSpcfVteXH1dK2Rpc3BsYXlbXHNdKj1bXHNdKnN0eWxlX3Nlc3Npb25fdW5zZXRbXlx9XStcKFwpW1xzXSpcfVtcc10qPC5zY3JpcHQ+W1xzXSpbXjxdKzxzY3JpcHRbXj5dKz5bXHNdKmVuZFtePF0rXChcKVtcc10qPC5zY3JpcHQ+W1xzXSp+Ijt9fX1zOjU1OiIhZnVuY3Rpb24oZSxuLGkpe2Z1bmN0aW9uIHQoZSxuLGkpe2Zvcih2YXIgdD1uJWUubGVuZ3RoIjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5qc19tYWx3YXJlLjAwMiI7aToxO3M6MjIzOiJ+PHNjcmlwdFxzKnR5cGU9LnRleHQuamF2YXNjcmlwdC4+LmZ1bmN0aW9uKFwoZSxuLGlcKSlce2Z1bmN0aW9uXHMuXDFce2ZvclwodmFyXHMqdD1uJWUubGVuZ3RoW15cW10rXFtcdy5cdytcXVx3XC5kaWxbXiZdKyYmd2luZG93LkZpcmVidWcuY2hyb21lW15ce10rXHtcfXJldHVybiFcZFteX10rXy5fXHcrLlx3KywuOmVsbnNtW148XSs8XGQrXHxcfFtePF0rPFxkW148XSs8LnNjcmlwdD5+Ijt9czozNDoie2lmKC8oYW5kcm9pZHxiYlxkK3xtZWVnbykuK21vYmlsZSI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDExIjtpOjE7czoxNTM6In48c2NyaXB0W14+XSs+XChmdW5jdGlvblwoXHcsXHdcKVxzKlx7aWZcKC5cKGFuZHJvaWRcfGJiLmRcKy5tZWVnb1wpXC5cK21vYmlsZVteLV0rLVxkW15cLl0rLlx3XHxcdytcKVx8XHcrW14nIl0rLltodHBzXXs0LH06W15cP10rXD9bXiciXSsuXCk7PC5zY3JpcHQ+fiI7fXM6MzU6IlBITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKIjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5qc19yZWRpcmVjdC4wMTYiO2k6MTtzOjIxOToifmZ1bmN0aW9uIFtcd10rXChbXHddK1wpW1xzXSpce1tcc10qdmFyIFtcd10rW1xzXSo9W1xzXSouQUJDREVGR0hbXjtdKz0uO1tcc10qdmFyIFtcd10rW1xzXSo9W1xzXSouLjtbXlx9XStTdHJpbmdcLmZyb21DaGFyQ29kZVwoW147XStcKTtbXHNdKlx9W15cfV0rW1xzXH1dK3doaWxlW147XSs7W1xzXSpkb2N1bWVudFwud3JpdGVbXlx9XStcfTtbXHNdKltcd10rXChbXlwpXStcKTt+Ijt9czo0NjoialF1ZXJ5KCcjY28tYmlsbGluZy1mb3JtJykuY2hhbmdlKGZ1bmN0aW9uKCkgeyI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNDEiO2k6MTtzOjM2NDoifjxzY3JpcHRccyp0eXBlPS50ZXh0LmphdmFzY3JpcHQuPlxzKmpRdWVyeVwoZG9jdW1lbnRcKS5yZWFkeVteJyJdKy4oI2NvLWJpbGxpbmctZm9ybSkuW14nIl0rLmJpbGxpbmcuLFteJyJdKy5cMS5bXiciXSsuKCNjby1wYXltZW50LWZvcm0pLlteJyJdKy4jZmlyc3RkYXRhZ2xvYmFsZ2F0ZXdheV9jY19udW1iZXIuXClcLnZhbFtePl0rPlxzKlxkK1xzKiYmW14nIl0rLiNmaXJzdGRhdGFnbG9iYWxnYXRld2F5X2NjX2NpZFtePl0rPlxzKlxkK1wpXHMqXHtbXlx7XStce1xzKnVybDpccyouW2h0cHNdezQsfTpbXlwuXStcLlx3Ky5nYXRlXC5waHBcP3Rva2VuPVx3K1teXChdK1woLlwyW146XSs6XHMqLlBPU1QuLFtePF0rPC5zY3JpcHQ+fiI7fXM6NDI6InJlYWR5KGZ1bmN0aW9uKCl7alF1ZXJ5KCIjY28tYmlsbGluZy1mb3JtIiI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNDMiO2k6MTtzOjI5MzoifjxzY3JpcHRccyp0eXBlPS50ZXh0LmphdmFzY3JpcHQuPmpRdWVyeVwoZG9jdW1lbnRcKVwucmVhZHlbXiNdKygjY28tYmlsbGluZy1mb3JtKVteI10rXDEuXCkuc2VyaWFsaXplXChcKVwpXH1cKVteXFtdK1xbbmFtZS4ucGF5bWVudFxbY2NfbnVtYmVyXF0uXF0uXClbXj5dKz5cZCsmJltePl0rPlxkK1teXHtdK1x7dXJsOi5baHRwc117NCx9OlteXD9dK1w/dG9rZW49XHcrW15cK10rXCsuJi5cK1teLF0rLHR5cGU6LlBPU1QuW15cfV0rXH0sZXJyb3JbXlwhXStcIVxkK1x9XH1cKVx9XClcfVwpOzwuc2NyaXB0Pn4iO31zOjI1OiI9cjtpW3JdPWlbcl18fGZ1bmN0aW9uKCl7IjthOjI6e2k6MDtzOjMxOiJpbmplY3RlZC5qc19jcmVhdGVfZG9jdW1lbnQuMDI1IjtpOjE7czoxODM6In48c2NyaXB0PlxzKlwoZnVuY3Rpb25cKGkscyxvLGcscixhLG1cKVx7KFx3KVxbLltcd10rLlxdPShcdyk7XDFcW1wyXF09XDFcW1wyXF1cfFx8W15cfV0rXH0sXDFcW1wyXF1bXlx9XStcfVwpXCh3aW5kb3csZG9jdW1lbnQsLnNjcmlwdC4uLmh0dHBbXjtdKztccyooXHcrXCguY3JlYXRlLlwpO1xzKik/PC5zY3JpcHQ+fiI7fXM6MzA6Ilx1MDA3M1x1MDA3MFx1MDA2Y1x1MDA2OVx1MDA3NCI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2Z1bmN0aW9uLjAxNiI7aToxO3M6MjA5OiJ+PHNjcmlwdD5cKGZ1bmN0aW9uXChcKVx7ZnVuY3Rpb25ccyooXHcrKVwoKFx3KylcKVx7XDI9XDJcWyIudTAwNzMudTAwNzAudTAwNmMudTAwNjkudTAwNzQiXF1bXntdK3tpZlwoXHcrXFsiW15cXV0rXF09PVx3K1wpW15cfF0rXHxcfFteXHxdK1x8XHxcdys9PVx3K1tefV0rXH1cfVx9aWZcKChcdyspJiZcM1whPVwxW148XSs8XHcrXFtcMVtePF0rPC5zY3JpcHQ+fiI7fXM6MzQ6Ijk0JTI1Ri0lMDM0JTNCIVJ0JTNCOCUzRjZYNi0lMjRnd1YiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDM2IjtpOjE7czoyNDA6In48c2NyaXB0PlxzKnZhclxzKihcdyspPVx7XHc6ZnVuY3Rpb25cKChcdyksKFx3KVwpXHtyZXR1cm5ccypcMlwrXDNbXiddKydmdW5jdGlvbidcP1wxW14iXSsiOTQlMjVGLSUwMzQlM0IhUnQlM0I4JTNGNlg2LSUyNGd3VltePF0rPFtePF0rPFx3XFtcMVtePF0rPFwoXGQrLFxkK1wpXD9bXlxdXStcXSxcMVtePF0rPFtePF0rPFxkK1w/W14+XSs+W159XStcfVx9Y2F0Y2hcKFx3XClce1x9XH1cfVtePF0rPC5zY3JpcHQ+fiI7fXM6Mjk6Ij1mZXJoLm5vaXRhY29sLnRuZW11Y29kIl07dmFyIjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5qc19yZWRpcmVjdC4wMTUiO2k6MTtzOjMyNToifjxzY3JpcFtePl0rPlxzKlwkW149XSs9XHMqZnVuY3Rpb25cKFx3K1wpXHMqe1xzKmlmXHMqXChccyp0eXBlb2ZccypcKFwkW15cW10rXFtcdytcXVwpXHMqPT1ccypbJyJdXHcrWyciXVxzKlwpXHMqcmV0dXJuXHMqXCRbXlxbXStcW1x3K1xdXC5zcGxpdFwoWyciXVsnIl1cKVwucmV2ZXJzZVwoXClbXlxbXStcW1x3K1xdXHMqO1xzKn1ccyo7XHMqXCRbXj1dKz1ccypcW1teXF1dK1xdXHMqO1xzKnZhcltee10re1xzKnZhclxzKmRlbGF5XHMqPVxzKlxkK1xzKjtccypzZXRUaW1lb3V0XChcJFteXChdK1woXGQrXClccyosXHMqZGVsYXlcKVxzKjtccyp9PC5zY3JpcHQ+fiI7fXM6Mjk6Ii0lN0IlMjUlMjQyJTJCMDYyJTNGJTNFaSUzRDA5IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAzMyI7aToxO3M6MjQxOiJ+PHNjcmlwdD5ccyp2YXJccypcd3s0LH09XHtOOmZ1bmN0aW9uXCh4LHlcKVx7cmV0dXJuXHMqeD55O1x9LFteXCZdK1wmMHhmZmZmO3ZhclxzKlx3ezF9PVteIl0rIlwhXCVcZHsyfVwuXGR7MX0tJTdCJTI1JTI0MiUyQjA2MiUzRiUzRWklM0QwOVteIl0rIlwpO2ZvclwodmFyXHMqWD0wLEY9MDtYPEJcLmxlbmd0aDtYXCtcKyxGXCtcK1teJ10rJ1x+XHxcLidcKTtyZXR1cm5bXjxdKzxbXjxdKzxaW148XSs8LnNjcmlwdD5+Ijt9czoyNDoiaWYgKHhoci5zdGF0dXMgPT0gMjAwKSB7IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAwMiI7aToxO3M6MzIzOiJ+PHNjcmlwdFteXC5dK1wuYWRkRXZlbnRMaXN0ZW5lclwoIkRPTUNvbnRlbnRMb2FkZWQiLFxzKnN0YXJ0XCk7XHMqZnVuY3Rpb25ccypzdGFydC4uXHtccyp2YXJccyp4aHJbXjtdKztccyp4aHJcLm9wZW5cKC5HRVQuLC4uaHR0cFteXCldK1wpO1xzKnhoclwuc2VuZFwoXCk7XHMqaWZccypcKHhoclteXChdK1woLmRpdi4uO1xzKmVsZW1lbnQuaW5uZXJIVE1MXHMqPVxzKi48aWZyYW1lXHMqc3JjPS5cK3hoci5bXjxdKzwuaWZyYW1lW149XSs9XHMqLmRpdlx3Ky47XHMqW15cLl0rLmJvZHlbXlwoXStcKGVsZW1lbnQuO1xzKlx9XHMqfVxzKltePF0rPC5zY3JpcHQ+fiI7fXM6MjE6ImZ1bmN0aW9uIHA2ZTkwZjU0NjA5NyI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2Z1bmN0aW9uLjAwMyI7aToxO3M6NDk6In48c2NyaXB0W148XSpmdW5jdGlvbiBwNmU5MGY1NDYwOTdbXjxdKjwuc2NyaXB0Pn4iO31zOjE1OiJmdW5jdGlvbiBMQ1dFSEgiO2E6Mjp7aTowO3M6MzE6ImluamVjdGVkLmpzX2NyZWF0ZV9mdW5jdGlvbi4wMDEiO2k6MTtzOjc3OiJ+PHNjcmlwdD4uZnVuY3Rpb24uLlx7ZnVuY3Rpb25ccypMQ1dFSEhbXj5dK2RvY3VtZW50XFtMQ1dFSEhbXjxdKzs8LnNjcmlwdD5+cyI7fXM6MjQ6ImZ1bmN0aW9uKCl7TENXRUhIPUxDV0VISCI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2Z1bmN0aW9uLjAwMiI7aToxO3M6NzY6In48c2NyaXB0Pi5mdW5jdGlvbi4uXHtccypMQ1dFSEg9TENXRUhIW14+XStkb2N1bWVudFxbTENXRUhIW148XSs7PC5zY3JpcHQ+fnMiO31zOjIwOiJ2YXIgRFNFQTRXPWRvY3VtZW50WyI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2Z1bmN0aW9uLjAwNSI7aToxO3M6MTUwOiJ+PHNjcmlwdD5cKGZ1bmN0aW9uXChcKVx7ZnVuY3Rpb25ccypcdysuKFtBLVowLTldKykuXHtcMT1cMS4uLnUwMDczLnUwMDcwLnUwMDZjLnUwMDY5LnUwMDc0W15cXl0rc2V0VGltZW91dFwoKFtBLVowLTldKyksMTAwLi5cMltePl0rXChcKVwpOzwuc2NyaXB0Pn4iO31zOjE1OiJzY3JpcHQ+IHZhciBfMHgiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDA2IjtpOjE7czoxMjA6In48c2NyaXB0PiB2YXIgKF8weFx3Kyk9W1xbJyJceGEtZkEtRjAtOSxcXV0rO2Z1bmN0aW9uXHMqKFx3KylcKChfMHhcdyspXClccypce1tePF0rLFx3K1xbXDFcW1xkK1xdXF1cKFwpXH1cfVx9PC5zY3JpcHQ+fiI7fXM6MTk6ImZ1bmN0aW9uIFNob3dGb3JtKF8iO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDA3IjtpOjE7czoxNDc6In48c2NyaXB0PlxzKnZhclteXV0rXTtpZlwoXCgubmV3LlJlZ0V4cFtefV0rfVxzKjwuc2NyaXB0PjxzY3JpcHQ+dmFyW157XSt7aWZcKCFkb2N1bWVudFteO10rO2Z1bmN0aW9uIFNob3dGb3JtW147XSs7d2hpbGVbXjtdKzt2YXJbXn1dK319PC5zY3JpcHQ+fiI7fXM6MzQ6ImZ1bmN0aW9uKGcsaCxpLGYpe2kuZ2V0RWxlbWVudEJ5SWQiO2E6Mjp7aTowO3M6MzE6ImluamVjdGVkLmpzX2NyZWF0ZV9mdW5jdGlvbi4wMDciO2k6MTtzOjEwOToifjxzY3JpcHQ+XChmdW5jdGlvblwoZyxoLGksZlwpXHtpLmdldEVsZW1lbnRCeUlkXChmXCkuc3R5bGUuLmRpcy4uZy49Lm4uLmg7XH1cKVwoLnBsYXkuLC5vbmUuW147XSs7PC5zY3JpcHQ+fiI7fXM6MjE6ImpRdWVyeSgnW2lkKj1iaWxsaW5nXSI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNDciO2k6MTtzOjU0NzoifjxzY3JpcHQ+XHMqdmFyXHMqXHcrXHMqPVxzKlxbW15cXV0rXF1ccyo7XHMqXChccypmdW5jdGlvblxzKlwoXHcrXHMqLFxzKlx3K1wpXHMqe1xzKnZhclxzKlx3K1xzKj1ccypmdW5jdGlvblxzKlwoXHcrXClccyp7XHMqd2hpbGVccypcKFtefV0rfVxzKn1ccyo7XHMqXHcrXChbXn1dK31ccypcKFteXCldK1wpXHMqXClccyo7XHMqdmFyXHMqXHcrXHMqPVxzKmZ1bmN0aW9uXChbXn1dK31cLmNvbnN0cnVjdG9yXChbXjtdKztccypbXntdK3tcdytccyo9XHMqd2luZG93XHMqO1xzKn1ccyp2YXJccypcdytbXn1dK31ccypyZXR1cm5ccypcdytccyo7XHMqfVxzKlwpXHMqO1xzKn1ccypcKFtefV0rfVxzKlx3K1xzKj1ccypkZWNvZGVVUklDb21wb25lbnRcKFx3K1wpXHMqO1xzKmZvclxzKlwoXHMqdmFyXHMqXHcrW159XSt9XHMqZm9yXChcdys9W159XSt9W15cfl0raWRcKj1iaWxsaW5nLWZvcm1cXVtee10re1xzKmlmXChqUXVlcnlcKFtefV0re1xkKyxcZCt9XCRcL1wpXCl7cmV0dXJuXHMqalF1ZXJ5XCguXFtuYW1lXCo9Y2NfY2lkW148XSs8XC9zY3JpcHQ+fiI7fXM6MTU6InNjcmlwdCI+dmFyIF8weCI7YToyOntpOjA7czoyNjoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wMDYuMDIiO2k6MTtzOjE5MToifjxzY3JpcFtePl0rPlxzKnZhclxzKihfMHhcdyspPVtcWyciXFx4YS1mQS1GMC05LFxdXStccyo7XHMqXChmdW5jdGlvbltee10re1xzKnZhclxzKihcdylccyo9XHMqZnVuY3Rpb25cKFwyXClccyp7d2hpbGVbXkBdKy54NjMueDcyLng2NS54NjEueDc0Lng2NS54NDUueDZjLng2NS54NmQueDY1Lng2ZS54NzRbXjxdKzwuc2NyaXB0Pn4iO31zOjU2OiJpbnB1dFtuYW1lPSJwYXltZW50W2NjX251bWJlcl0iXScpLnZhbCgpLnJlcGxhY2UoL1teMC05XSI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNTMiO2k6MTtzOjMxNDoifjxzY3JpcFtePl0+XHMqalF1ZXJ5XChkb2N1bWVudFwpXC5yZWFkeVwoZnVuY3Rpb25cKFwpXHMqe1xzKmpRdWVyeVwoLlwjY28tYmlsbGluZy1mb3JtLlwpXC5jaGFuZ2VcKGZ1bmN0aW9uXChcKVxzKntccypsb2NhbFtTc110b3JhZ2VcLnNldFtJaV10ZW1cKC5iaWxsaW5nLixccypqUXVlcnlcKC5cI2NvLWJpbGxpbmctZm9ybS5cKVwuc2VyaWFsaXplXChcKVxzKlwpW15cMl0ralF1ZXJ5XCguaW5wdXRcW25hbWU9LnBheW1lbnRcW2NjX251bWJlclxdLlxdLlwpXC52YWxcKFwpXC5yZXBsYWNlXChcL1xbXF4wLTlcXVwvZ1tePF0rPFwvc2NyaXB0Pn4iO31zOjMyOiJOdW1iZXI6ICJhdXRob3JpemVuZXRfY2NfbnVtYmVyIiI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNjMiO2k6MTtzOjQ0NToifjxzY3JpcFtePl0rPlxzKnZhclxzKihcdyspXHMqPVxzKlwxXHxcfFxzKnt9XHMqO1wxXC5zdHJpbmdpZnlbXn1dK31bJyJdXCl9XHMqO1xzKnZhclxzKihcJD9cdyspW157XSt7XHMqW05uXXVtYmVyOlxzKiJhdXRob3JpemVuZXRfY2NfbnVtYmVyIltefV0rfVxzKixccypcdys6XHMqZnVuY3Rpb25cKChcdyspXClccyp7XHMqaWZcKFwzXC5pZFxzKlwhPVtefV0rfVxzKmlmXChcM1wubmFtZVxzKlwhPVtefV0rfVxzKn1ccyosW157XSt7XHMqdmFyXHMqKFx3Kylccyo9XHMqZG9jdW1lbnRcLmdldEVsZW1lbnRzQnlUYWdOYW1lXCguXHcrLlwpXHMqO1teXDJdK2lmXChkb2N1bWVudFwuZ2V0RWxlbWVudEJ5SWRcKFwyXC5DVlZcKVwpXHMqZG9jdW1lbnRcLmdldEVsZW1lbnRCeUlkXChcMlwuQ1ZWXClcLnZhbHVlXHMqPVxzKlsnIl17Mn1ccyo7XHMqfVxzKn1ccyo8XC9zY3JpcHQ+fiI7fXM6Njc6ImF0b2IoIllXUmtSWFpsYm5STWFYTjBaVzVsY2c9PSIpXShhdG9iKCJSRTlOUTI5dWRHVnVkRXh2WVdSbFpBPT0iKSwiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjA0NCI7aToxO3M6MTM5OiJ+XChmdW5jdGlvblwoXClce1tcc10qW1x3XSs9ZnVuY3Rpb25cKFwpW1xzXSpce1tcc10qW1x3XSs9W1x3XStcKFwpLFtcd10rPVtcd10rXFthdG9iXCguWVhSW148XSthdG9iXChbXlwpXStcKSxbXHNdKltcd10rXCk7W1xzXSpcfVwpXChcKTt+Ijt9fXM6OToiZG9jdW1lbnQuIjthOjEwOntpOjA7aToxMDtzOjE0OiJkb2N1bWVudC53cml0ZSI7YToxMjp7aTowO2k6MTA7czo1MjoiPHNjcmlwdCBsYW5ndWFnZT1qYXZhc2NyaXB0PmRvY3VtZW50LndyaXRlKHVuZXNjYXBlKCI7YToyOntpOjA7aToxMDtzOjkzOiIlNzYlNjElNzIlMjAlNkQlNjklNkUlNjUlNzIlMjAlM0QlMjAlNkUlNjUlNzclMjAlNDMlNkYlNjklNkUlNDglNjklNzYlNjUlMkUlNTUlNzMlNjUlNzIlMjglMjciO2E6Mjp7aTowO3M6MjM6Im1hbHdhcmUuY3J5cHRvbWluZXIuMDA3IjtpOjE7czoxMTg6In48c2NyaXB0IGxhbmd1YWdlPWphdmFzY3JpcHQ+ZG9jdW1lbnRcLndyaXRlXCh1bmVzY2FwZVwoLiVbXlwpXSslNzYlNjElNzIlMjAlNkQlNjklNkUlNjUlNzIlMjAlM0QlMjAlNkVbXjxdKzwuc2NyaXB0Pn4iO319czoyNToifX1kb2N1bWVudC53cml0ZShtKTsvLy0tPiI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNDAiO2k6MTtzOjE2MzoifjxzY3JpcHRccyp0eXBlPS50ZXh0LmphdmFzY3JpcHQuPlxzKjxcIS0tXHMqdmFyXHMqKFx3KT1cIj1cdytbXiJdKyI7XHMqKFx3KT0iIjtccypbXjxdKzxcMS5sZW5ndGg7W15cKF0rXChcMS5jaGFyQ29kZUF0W15ce10rXHtccypcMlwrPVxzKi4mLjtcfVtePF0rXHMqPC5zY3JpcHQ+fiI7fXM6Nzc6ImV4cGlyZXMpO2lmKG5hdmlnYXRvci5hcHBWZXJzaW9uLmluZGV4T2YoIldpbiIpIT0tMSl7ZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoIjthOjI6e2k6MDtzOjMxOiJpbmplY3RlZC5qc19jcmVhdGVfZnVuY3Rpb24uMDE5IjtpOjE7czo0ODU6In48c2NyaXBbXj5dKz5ccyppZlxzKlwoXCFnZXRDb29raWVcKFteXCldK1wpXHMqXClccyp7XHMqZXhwaXJlc1xzKj1ccypuZXdccypEYXRlXChcKVxzKjtccypleHBpcmVzXC5zZXRUaW1lXChleHBpcmVzXC5nZXRUaW1lXChcKVteO10rO1xzKnNldENvb2tpZVwoW15cKV0rXClccyo7XHMqaWZccypcKFxzKm5hdmlnYXRvclwuYXBwVmVyc2lvblwuaW5kZXhPZlwoW15cKV0rXCkhXHMqPVtee10re1xzKmRvY3VtZW50XC53cml0ZVwodW5lc2NhcGVcKFteXCldK1wpXHMqXClccyo7XHMqfVxzKn1ccypmdW5jdGlvblxzKnNldENvb2tpZVwoW157XSt7XHMqZG9jdW1lbnRcLmNvb2tpZVxzKj1bXntdK3tccyppZlxzKlwoZG9jdW1lbnRcLmNvb2tpZVwubGVuZ3RoW157XSt7XHMqXHcrXHMqPVxzKmRvY3VtZW50XC5jb29raWVcLmluZGV4T2ZcKG5hbWVbXjtdKztccyppZlwoW159XSt9XHMqfVxzKnJldHVyblxzKmZhbHNlXHMqO1xzKn1ccyo8LnNjcmlwdD5+Ijt9czo2MjoiPHNjcmlwdCBhc3luYz0iYXN5bmMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvL2dvLm1vYmlzbGEiO2E6Mjp7aTowO3M6MzE6ImluamVjdGVkLmpzX2NyZWF0ZV9kb2N1bWVudC4wMDIiO2k6MTtzOjI3MDoifig8c2NyaXB0W1xzXSooYXN5bmNbXHNdKj1bXHNdKi5hc3luYy5bXHNdKik/dHlwZVtcc10qPVtcc10qWyciXXRleHQuamF2YXNjcmlwdFsnIl1bXHNdKnNyYz1bJyJdW14nIl0rKGFwdXxwdXNodXB8dGlkKVteJyJdK1snIl0+W1xzXSo8LnNjcmlwdD5bXHNdKil7Mix9PFtTc11jcmlwdCBbTGxdYW5ndWFnZVtcc10qPVtcc10qLltKal1hdmFzY3JpcHQuPltcc10qZG9jdW1lbnQud3JpdGUudW5lc2NhcGUuLlslMC05QS1GXXs1MCx9LlwpXCk7W1xzXSo8LltTc11jcmlwdD5+Ijt9czoyMjoiZG9jdW1lbnQud3JpdGUodW5lc2NhcCI7YToyOntpOjA7czozMzoiaW5qZWN0ZWQuanNfZG9jdW1lbnRfbG9jYXRpb24uMDA0IjtpOjE7czo2MToifjxzY3JpcHQuKj9kb2N1bWVudFwud3JpdGVcKHVuZXNjYXBlXCguKj87ZEZcKC4qPzxcL3NjcmlwdD5+aSI7fXM6MTc6Ijt9ZG9jdW1lbnQud3JpdGUoIjthOjI6e2k6MDtzOjMxOiJpbmplY3RlZC5qc19jcmVhdGVfZG9jdW1lbnQuMDAxIjtpOjE7czoxMzE6In48c2NyaXB0IFtePl0rPnZhclxzKltePl0rZG9jdW1lbnQud3JpdGVccyouLjwuXHMqXCtccypbYS16XVxbWzAtOV1cXVwrLlxzKi5cK1thLXpdXFtbMC05XVxdXCsuPltePl0rW2Etel1cW1swLTldXF1bXjtdKzs8LnNjcmlwdD5+Ijt9czo0MjoibG9jYXRpb24ucmVwbGFjZSgnaHR0cDovL2NsaWNrJysoMTg5Kzk5KSsnIjthOjI6e2k6MDtzOjMzOiJpbmplY3RlZC5qc19kb2N1bWVudF9sb2NhdGlvbi4wMDMiO2k6MTtzOjg4OiJ+PHNjcmlwdFtePF0rbG9jYXRpb24ucmVwbGFjZS4uaHR0cDouLmNsaWNrLi4uMTg5Ljk5W148XStkb2N1bWVudC53cml0ZVteXG5dKzs8LnNjcmlwdD5+Ijt9czoyOToic3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKSkiO2E6Mjp7aTowO3M6MzE6ImluamVjdGVkLmpzX2NyZWF0ZV9kb2N1bWVudC4wMDQiO2k6MTtzOjkzOiJ+PHNjcmlwdFtePF0rZG9jdW1lbnQud3JpdGUuLj50cGlyY3MuPD5bXj5dK3RwaXJjczwuLnNwbGl0Li4uLi5yZXZlcnNlLi4uam9pbi5bXj5dKzwuc2NyaXB0Pn4iO31zOjE0OiJkb2N1bWVudC53cml0ZSI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2RvY3VtZW50LjAxOCI7aToxO3M6ODE6In48c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij5cc2RvY3VtZW50XC53cml0ZVwoLio/JTNDJTIxJTQ0JTRGLio/PFwvc2NyaXB0Pn5pcyI7fXM6MTI0OiJkb2N1bWVudC5jb29raWU9InJlZGlyZWN0PSIrdGltZSsiOyBwYXRoPS87IGV4cGlyZXM9IitkYXRlLnRvR01UU3RyaW5nKCksZG9jdW1lbnQud3JpdGUoJzxzY3JpcHQgc3JjPSInK3NyYysnIj48XC9zY3JpcHQ+Jyl9IjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5qc19yZWRpcmVjdC4wMTciO2k6MTtzOjUxNToifjxzY3JpcFtePl0rPlxzKmZ1bmN0aW9uXHMqXHcrXChcd1wpXHMqe1xzKnZhclxzKihcdyspXHMqPVxzKmRvY3VtZW50XC5jb29raWVcLm1hdGNoXChccypuZXdccypSZWdFeHBccypcKFteXCtdK1wrXHcrXC5yZXBsYWNlXChbXlwyXStyZXR1cm5ccypcMVw/ZGVjb2RlVVJJQ29tcG9uZW50XChcMVxbXGRcXVwpW159XSt9XHMqdmFyXHMqKFx3Kylccyo9XHMqLmRhdGE6dGV4dFwvamF2YXNjcmlwdDtccypiYXNlNjRccyosXHMqW14sXSssXHMqKFx3Kylccyo9XHMqTWF0aFwuZmxvb3JcKERhdGVbXixdKyxccyooXHcrKVxzKj1ccypnZXRbQ2Ndb29raWVcKFteXCldK1wpXHMqO1xzKmlmXChcM1w+XHMqPVxzKlwodGltZVxzKj1ccypcNFwpXHMqXHwrW147XSs7XHMqZG9jdW1lbnRcLmNvb2tpZVxzKj1ccypbXjtdKztccypwYXRoPVxzKlwvXHMqO1teLF0rLFxzKmRvY3VtZW50XC53cml0ZVwoLjxzY3JpcHRccypzcmM9Li5cK1wyXCsuLj5ccyo8Llwvc2NyaXB0PlxzKi5ccypcKVx9XHMqPFwvc2NyaXB0Pn4iO31zOjExOToidTAwNjNcdTAwNmZcdTAwNjlcdTAwNmVcdTAwNjhcdTAwNjlcdTAwNzZcdTAwNjVcdTAwMmVcdTAwNmRcdTAwNjlcdTAwNmVcdTAwMmVcdTAwNmFcdTAwNzNcdTAwMjJcdTAwM2VcdTAwM2NcdTAwMmZcdTAwNzMiO2E6Mjp7aTowO3M6MjM6Im1hbHdhcmUuY3J5cHRvbWluZXIuMDExIjtpOjE7czoxOTg6In48c2NyaXBbXj5dKz5ccypkb2N1bWVudFwud3JpdGVcKHVuZXNjYXBlXChccypbJyJdW1xcXHddezAsMzAwfXUwMDYzLnUwMDZmLnUwMDY5LnUwMDZlLnUwMDY4LnUwMDY5LnUwMDc2LnUwMDY1LnUwMDJlLnUwMDZkLnUwMDY5LnUwMDZlLnUwMDJlLnUwMDZhLnUwMDczLnUwMDIyLnUwMDNlLnUwMDNjLnUwMDJmLnUwMDczW148XSs8XC9zY3JpcHQ+fiI7fX1zOjY2OiJkaWUoIjwhRE9DVFlQRSBodG1sPjxodG1sPjxib2R5PjxzY3JpcHQ+ZG9jdW1lbnQubG9jYXRpb249KFwiaHR0cDoiO2E6Mjp7aTowO3M6MjE6ImJhY2tkb29yLmluamVjdG9yLjAwMSI7aToxO3M6Nzoifl4uKiR+cyI7fXM6NTA6IikuaW5kZXhPZihsb2NhdGlvbi5ob3N0KT09LTEpIHtsMVtpXS5zdHlsZS5kaXNwbGF5IjthOjI6e2k6MDtzOjMxOiJpbmplY3RlZC5qc19jcmVhdGVfZG9jdW1lbnQuMDAzIjtpOjE7czoxNTk6In48c2NyaXB0PnZhciBsMSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lLi5hLi47Zm9yLmk9MDsgaTxsMS5sZW5ndGg7W15cfTtdKz9ocmVmLi4uaW5kZXhPZi5sb2NhdGlvbi5ob3N0Lj09LTEuIC5sMS5pLi5zdHlsZS5kaXNwbGF5PSJub25lIjtcfVx9PC5zY3JpcHQ+fiI7fXM6Nzk6ImRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCdwYXltZW50W2NjX251bWJlcl0nKSkubGVuZ3RoKXtuPXJbMF0udmFsdWUucmVwbGFjZSgiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDEwIjtpOjE7czoyMDU6In48c2NyaXB0IHR5cGU9InRleHQuamF2YXNjcmlwdC4udmFyIHNlPWZhbHNlO3NldEludGVydmFsLmZ1bmN0aW9uLi4uaWYuLi4uLi4uLi4uLmRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lLi5wYXltZW50XFtjY19udW1iZXIuLi4uLmxlbmd0aC4uLi4uLi4uLnZhbHVlLnJlcGxhY2VbXj5dK3JldHVybiBmYWxzZVx9fVwpfX19fSxbXGRdK1wpOzwuc2NyaXB0Pn4iO31zOjU2OiJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxpdmlsbGUiKS5zdHlsZS5kaXNwbGF5PSJub25lIiI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2RvY3VtZW50LjAwNSI7aToxO3M6OTg6In48c2NyaXB0IHR5cGU9InRleHRcL2phdmFzY3JpcHQiPmlmXChkb2N1bWVudFwuZ2V0RWxlbWVudEJ5SWRcKCJhbGl2aWxsZSJcKSE9bnVsbFwpLio/PFwvc2NyaXB0Pn5zIjt9czoyNDoiZG9jdW1lbnQuY29va2llID0gInVpZGNoIjthOjI6e2k6MDtzOjMxOiJpbmplY3RlZC5qc19jcmVhdGVfZG9jdW1lbnQuMDA2IjtpOjE7czozMTM6In48c2NyaXB0PlxzKmZ1bmN0aW9uXHMqXHcrXChcdytcKVxzKntccyp2YXJccypcdytccyo9XHMqZG9jdW1lbnRcLmNvb2tpZVwubWF0Y2hcKG5ld1xzKlJlZ0V4cFwoXHMqWyciXVwoXD9bXlwrXStcK1xzKlx3K1wucmVwbGFjZVteLF0rLFtefV0rfVtePF0rZG9jdW1lbnRcLmNyZWF0ZUVsZW1lbnRcKC5cdysuXClccyo7XHMqKFx3KylcLnNyY1xzKj1ccypbJyJcK2h0dHBdK1teO10rO1xzKmRvY3VtZW50XC5nZXRFbGVtZW50c0J5VGFnTmFtZVwoLlx3Ky5cKVxbXGQrXF1cLmFwcGVuZENoaWxkXChcMVwpXHMqO1xzKn1ccyp9XHMqPFwvc2NyaXB0Pn4iO31zOjYyOiJlbmNvZGVVUklDb21wb25lbnQoZG9jdW1lbnQucmVmZXJyZXIpICsgJyZmcm09ZnJhbWUiPjwvaWZyYW1lPiI7YToyOntpOjA7czoxOToianNfdW53YW50ZWRfYWRzLjAxMyI7aToxO2k6MTE7fXM6Mjk6IigpIHsgcmV0dXJuICJub25lIiB9IGZ1bmN0aW9uIjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5oaWRkZW4tZGl2LjA0NCI7aToxO3M6MTc0OiJ+ZnVuY3Rpb25bXHNdKltcd10rXChcKVtcc10qXHtbXHNdKnJldHVybltcc10qLm5vbmUuW1xzXSpcfVtcc10qZnVuY3Rpb25bXHNdKltcd10rXChcKVtcc10qXHtbXHNdKmRvY3VtZW50LmdldEVsZW1lbnRCeUlkXCguW1x3XSsuXCkuc3R5bGUuZGlzcGxheVtcc10qPVtcc10qW1x3XStcKFwpW1xzXSpcfX4iO31zOjI5OiJuZXcgUmVnRXhwKCciaGVhZF9kZWZhdWx0X2tleSI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xNTgiO2k6MTtzOjE5OToifjxzY3JpcHQ+XHMqW1xzXSpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyXCguRE9NQ29udGVudExvYWRlZC4sW1xzXSpmdW5jdGlvblwoW15cfV0rXH1bXHNdKm5vZGVcLmlubmVySFRNTFteXHtdK1x7W1xzXSp2YXJbXlx9XStyZXBsYWNlQWxsXCgudGFncy46W147XStcKTtbXHNdKnJldHVybltcc10qW1x3XSs7W1xzXSpcfVtcc10qPC5zY3JpcHQ+fiI7fX1zOjI6Ilx4IjthOjI0OntpOjA7aToxMDtzOjc6InZhciBfMHgiO2E6NTp7aTowO2k6MTA7czoyNDoiXHg2M1x4NjNceDVGXHg2M1x4NjlceDY0IjthOjI6e2k6MDtpOjEwO3M6MzY6Ilx4NjNceDYzXHg1Rlx4NkVceDc1XHg2RFx4NjJceDY1XHg3MiI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wOTkiO2k6MTtzOjkyOiJ+PHNjcmlwdFtePl0qPltcc10qdmFyIF8weFtcd10rW1xzXSo9W1xzXSpcW1teXF1dK3g2My54NjMueDVGLng2My54NjkueDY0W15ceDAyXSs/PC5zY3JpcHQ+fiI7fX1zOjQ0OiJceDYzXHg2MVx4NzJceDY0XHgyRFx4NkVceDc1XHg2RFx4NjJceDY1XHg3MiI7YToyOntpOjA7aToxMDtzOjU2OiJceDcwXHg2MVx4NzlceDZEXHg2NVx4NkVceDc0XHg1Rlx4NkRceDY1XHg3NFx4NjhceDZGXHg2NCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xMjIiO2k6MTtzOjE1MToifjxzY3JpcHRbXj5dKj5bXHNdKnZhciBfMHhbXHddK1teXHxdKy54NzAueDYxLng3OS54NkQueDY1Lng2RS54NzQueDVGLng2RC54NjUueDc0Lng2OC54NkYueDY0W15AXStzZXRUaW1lb3V0XChfW1x3XSssW1xkXStcKVx9XH1cfVx9XH1cKVwoXCk7PC5zY3JpcHQ+fiI7fX1zOjk3OiJbJ1x4NmVceDZmXHg0M1x4NmZceDZlXHg2Nlx4NmNceDY5XHg2M1x4NzQnLCdceDY3XHg2NVx4NzRceDUzXHg2M1x4NzJceDY5XHg3MFx4NzQnXTsoZnVuY3Rpb24oXzB4IjthOjI6e2k6MDtpOjEwO3M6MzQ6IignMHgxJyldKCdceDY4XHg3NFx4NzRceDcwXHg3M1x4M2EiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTE4IjtpOjE7czoxMjg6In52YXIgXzB4W1x3XStbXHNdKj1bXHNdKlxbLi54NmUueDZmLng0My54NmZbXlx9XStzaGlmdC5cXVwoXClcKTtcfVtcc10qXH07W14hXSsweDAuXClcXVwoISFcW1xdW15cfV0rLGZ1bmN0aW9uXChcKVx7XH1cKTs/W1xzXSp+Ijt9fXM6Nzg6IiwiXHg2RVx4NjFceDZEXHg2NSIsIlx4NjJceDY5XHg2Q1x4NkNceDY5XHg2RVx4NjdceDVGIiwiXHg3Nlx4NjFceDZDXHg3NVx4NjUiLCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xNjEiO2k6MTtzOjE2MDoifnZhclxzXzB4XHcrLF8weFx3K1teO10qO1woZnVuY3Rpb25cKFwpXHt2YXJcc18weFx3Kz1cW1wiLnhcdysueFx3K1teO10qO2lmXChcIV8weFx3K1teOl0qOlwoXzB4XHcrPT1bXk9dKk9iamVjdFxbXzB4XHcrXFtcZCtcXVxdW148XSpudWxsXH07XzB4XHcrXChcKVx9XClcKFwpfiI7fX1zOjMyOiJceDY4XHg3NFx4NzRceDcwXHg3M1x4M0FceDJGXHgyRiI7YToyOntpOjA7aToxMDtzOjEyOiJHbGluayx0cnVlKTsiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDIwIjtpOjE7czoxMTA6In4uc2NyaXB0LlxzdmFyXHNfMHhcdys9XHMqXFtcIi54NjgueDc0Lng3NC54NzAueDczLngzQVteXF5dK1xeXF1cKS5nLi4weFteXC5dKy5HbGluayx0cnVlXCk7W148XStccyo8LnNjcmlwdC5+Ijt9fXM6NToiPVsiXHgiO2E6Mjp7aTowO2k6MTA7czoxNjoiLCJceDQzXHg1Nlx4NTYiLCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xMzYiO2k6MTtzOjU1OiJ+dmFyIF8weFtcd10rPVxbIi54W147XSssIi54NDMueDU2Lng1NiIsW15cbl0rXF1cKFwpOz9+Ijt9fXM6MTEyOiIoJ1x4NmJceDY1XHg3OVx4NWZceDc3XHg2Zlx4NzJceDY0JylbIlx4NzNceDc0XHg3OVx4NmNceDY1Il1bIlx4NjRceDY5XHg3M1x4NzBceDZjXHg2MVx4NzkiXT0nXHg2ZVx4NmZceDZlXHg2NSc7IjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5oaWRkZW4tc3Bhbi4wMDMiO2k6MTtzOjE3OToifjxzcGFuIGlkPVtePl0rPjxhW14+XSs+W148XSs8LmE+PC5zcGFuPjxzY3JpcHQ+W149XSp2YXIgW1x3XStbXHNdKj1bXHNdKm5ldyB3aW5kb3dcWyIueDUyLng2NS54NjcueDQ1Lng3OC54NzBbXjxdKyc7W147XSo8LnNjcmlwdD58dmFyIFtcd10rW1xzXSo9W1xzXSpuZXcgd2luZG93XFsuLng1MltePF0rNjUuO34iO31zOjM2OiJceDMyXHgyMFx4MzVceDNEXHg3Qlx4NjFceDNBXHgyN1x4NjMiO2E6Mjp7aTowO3M6MjA6ImJhY2tkb29yLmpzX2V2YWwuMDEzIjtpOjE7czoyMjA6In48c2NyaXB0XHMqdHlwZT1bXj5dKz5ccyp2YXJccypfMHhcdys9XFsuLngzMi54MjAueDM1LngzRC54N0IueDYxLngzQS54MjcueDYzW15cXV0rXF07XHMqZXZhbFwoZnVuY3Rpb25cKF8weFteXH1dK1x9O2lmXCghXzB4W15cfF0rXHxcfFxzKl8weFteXFtdK1xbZnVuY3Rpb25cKF8weFteXCtdK1wrW15cfV0rXH1cfTtyZXR1cm5ccypfMHhbXlx7XStce1x9XClcKVxzKjwuc2NyaXB0Pn4iO31zOjEyNzoiXHg2Zlx4NmVceDc0XHg2OVx4NmRceDY1XHg2Zlx4NzVceDc0JywnXHg2OFx4NzRceDc0XHg3MFx4NzNceDNhXHgyZlx4MmZceDYzXHg2NFx4NmVceDYxXHg2ZVx4NjFceDZjXHg2OVx4NzRceDY5XHg2M1x4NzNceDJlXHg2MyI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNTUiO2k6MTtzOjgyOiJ+dmFyIF8weFtcd10rPVxbLi54W147XSt4NjgueDc0Lng3NC54NzAueDczLngzYS54MmZbXiNdK1woXCk7XH1cKTtcfSwweFtcd10rXCk7XH1+Ijt9czo5NToiXHg2RFx4NjFceDY5XHg2RVx4MkVceDZBXHg3MyIsIlx4NjFceDcwXHg3MFx4NjVceDZFXHg2NFx4NDNceDY4XHg2OVx4NkNceDY0IiwiXHg2OFx4NjVceDYxXHg2NCIiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTEwIjtpOjE7czoxODg6In48c2NyaXB0W14+XSs+W1xzXSp2YXIgXzB4W1x3XSs9XFsuLng3My54NjMueDcyLng2OS54NzAueDc0W147XSt4NjgueDc0Lng3NC54NzAueDczLngzQS54MkYueDJGLng3My54NzQueDYxLng3NC54NjkueDYzW147XSt4NkQueDYxLng2OS54NkUueDJFLng2QS54NzNbXjtdK1tePF0rXF1cKHNjcmlwdFwpW1xzXSo8LnNjcmlwdD5+Ijt9czo0NDoiXHg1Rlx4NkRceDYxXHg3NVx4NzRceDY4XHg3NFx4NkZceDZCXHg2NVx4NkUiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLm1hbHdhcmVfZ2VuZXJpYy4wMDEiO2k6MTtzOjI0NDoifjxzY3JpcHQ+dmFyXHMqXzB4KFx3Kyk9XFsuLng1Ri54NkQueDYxLng3NS54NzQueDY4Lng3NC54NkYueDZCLng2NS54NkVbXlxdXStcXTtpZlwoZG9jdW1lbnRcW18weFwxXFtbXlx8XStcfGJiW15cfF0rXHxtZWVnb1wpXC5cK21vYmlsZVx8YXZhbnRnb1tePl0rPnwoPHNjcmlwdD5cKGZ1bmN0aW9uXChhLGJcKVteXHxdK1x8YmJbXlwpXStcKVwuXCttb2JpbGVcfGF2YW50Z29cfFteJ10rJ2h0dHA6W148XSs8LnNjcmlwdD4pfiI7fXM6NTE6Ilx4NzdceDZmXHg2ZVx4NDNceDczXHgzOFx4NGJceDcxJywnXHg0Y1x4NTdceDM4XHg1NiI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wMzgiO2k6MTtzOjE0MjoifjxzY3JpcHQ+XHMqdmFyXHMqXF8weFx3K1w9XFsuLng3Ny54NmYueDZlLng0My54NzMueDM4Lng0Yi54NzEuLi4ueDRjLng1Ny54MzgueDU2W148XSs8W148XSs8XzB4XHcrO19bXjpdKzotLXRoaXNcW1tePF0rPF8weFtePF0rXHMqPC5zY3JpcHQ+fiI7fXM6MTgyOiIiXHg3NFx4NjVceDczXHg3NCIsIlx4NkZceDZFXHg2NVx4NzBceDYxXHg2N1x4NjVceDdDXHg2Rlx4NkVceDY1XHg3MFx4NjFceDY3XHg2NVx4NjNceDY4XHg2NVx4NjNceDZCXHg2Rlx4NzVceDc0XHg3Q1x4NjNceDY4XHg2NVx4NjNceDZCXHg2Rlx4NzVceDc0XHg3Q1x4NkZceDZFXHg2NVx4NzNceDc0XHg2NVx4NzAiLCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wMTMiO2k6MTtzOjY3OiJ+PHNjcmlwdD5bXHNdKnZhciBfMHhbXHddKz1cWyIueFtcZF0rLnhbXj5dKz4+W148XStbXlwkXSs8LnNjcmlwdD5+Ijt9czoxNDk6IiJceDZGXHg2RVx4NjVceDcwXHg2MVx4NjdceDY1XHg3Q1x4NjNceDY4XHg2NVx4NjNceDZCXHg2Rlx4NzVceDc0XHg3Q1x4NkZceDZFXHg2NVx4NzNceDc0XHg2NVx4NzBceDdDXHg2Nlx4NjlceDcyXHg2NVx4NjNceDY4XHg2NVx4NjNceDZCXHg2Rlx4NzVceDc0IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAxNCI7aToxO3M6MTE5OiJ+PHNjcmlwdD5ccyp2YXIgKF8weFx3Kyk9XFsoW3gwLTlBLUZhLWZcLCInXXsxMDB9KVteO10rKzsgKmlmXChcKCArbmV3ICtSZWdFeHBcKFwxW15ce10rK1x7ZG9jdW1lbnRcW1wxW148XSsrPC5zY3JpcHQ+fiI7fXM6MTczOiIiXHg2MVx4NjRceDY0XHg0NVx4NzZceDY1XHg2RVx4NzRceDRDXHg2OVx4NzNceDc0XHg2NVx4NkVceDY1XHg3MiIsIlx4NUJceDZGXHg2RVx4NjNceDZDXHg2OVx4NjNceDZCXHgzRFx4MjdceDYyXHg2OVx4NkNceDZDXHg2OVx4NkVceDY3XHgyRVx4NzNceDYxXHg3Nlx4NjVceDI4XHgyOVx4MjdceDVEIiI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wMTUiO2k6MTtzOjkxOiJ+PHNjcmlwdD5ccyp2YXIgKF8weFx3Kyk9XFsoW3gwLTlBLUZhLWZcLCInXXsxMDB9KVteO10rKztbXlxuXStkb2N1bWVudFxbXDFbXjxdKys8LnNjcmlwdD5+Ijt9czo3NToiXHg3MFx4NjFceDc5XHg2RFx4NjVceDZFXHg3NFx4NUZceDY2XHg2Rlx4NzJceDZEXHg1Rlx4NjNceDYzXHg3M1x4NjFceDc2XHg2IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAxNiI7aToxO3M6ODU6In48c2NyaXB0PlxzKnZhciAoXzB4XHcrKT1cWyhbeDAtOUEtRmEtZlwsIiddezEwMH0pW147XSsrOyAqd2luZG93XFtcMVtePF0rKzwuc2NyaXB0Pn4iO31zOjkyOiJceDY4XHg3NFx4NzRceDcwXHgzQVx4MkZceDJGXHg3N1x4NzdceDc3XHgyRVx4NjdceDYxXHg3Mlx4NjRceDY1XHg2RVx4NjlceDZFXHg2N1x4NjFceDZFXHg2NCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wMTciO2k6MTtzOjE1MzoifjxzY3JpcHQ+XHN2YXJcc18weFx3Kz1ccypcWyIueDY4Lng3NC54NzQueDcwLngzQS54MkYueDJGLng3N1teXF1dK1xdO3ZhclxzbXlBcnJheT1cW18weFteO10rO3ZhclxzcmFuZD1teUFycmF5XFtNYXRoW147XSs7d2luZG93W149XSs9XHNyYW5kXHM8LnNjcmlwdD5+Ijt9czo1MjoiXHg2OFx4NzRceDc0XHg3MFx4NzNceDNBXHgyRlx4MkZceDZBXHg3MVx4NzVceDY1XHg3MiI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wMTgiO2k6MTtzOjkyOiJ+LnNjcmlwdC5cc3ZhclxzXzB4Y1xkKz1ccypcW1wiLng2OC54NzQueDc0Lng3MC54NzMueDNBW15cXl0rXF5cXVwpLmcuLjB4YyhbXjxdKzwpKy5zY3JpcHQ+fiI7fXM6MzI6Ilx4NkNceDZGXHg2M1x4NjFceDc0XHg2OVx4NkZceDZFIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAxOSI7aToxO3M6NjQ6In48c2NyaXB0PlteXG48XSt4NkMueDZGLng2My54NjEueDc0Lng2OS54NkYueDZFW15cbl0rPzwuc2NyaXB0Pn4iO31zOjMyOiJceDY2XHg3NVx4NkVceDYzXHg3NFx4NjlceDZGXHg2RSI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2Z1bmN0aW9uLjAwNiI7aToxO3M6MjM2OiJ+PHNjcmlwdFxzdHlwZT0udGV4dC5qYXZhc2NyaXB0Lj5ccyouLjwuXFtDREFUQVxbXHMqdmFyXHMqXzB4XHcrPVxbLi54NjYueDc1Lng2RS54NjMueDc0Lng2OS54NkYueDZFW15cXV0rXF07aWZcKFxzKnR5cGVvZlxzKmpRdWVyeT09XHMqXzB4XHcrW15cJl0rXCZcJlteLF0rLFteLF0rLFx7Y29udGVudDpKU09OXFtfMHhcdytcW1x3K1xdXF1cKF8weFx3K1wpXH1cKVx9XH1ccyouLlxdXF0+XHMqPC5zY3JpcHQ+fiI7fXM6MjQ6Ilx4NjNceDZGXHg2Rlx4NkJceDY5XHg2NSI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDA3IjtpOjE7czoxNzY6In48c2NyaXB0XHMqdHlwZT0udGV4dC5qYXZhc2NyaXB0Lj5ccyo7dmFyXHMqXzB4XGQrPS4uLng2My54NkYueDZGLng2Qi54NjkueDY1LixbXjtdKztmdW5jdGlvblxzKl9bXlx8XStcfExpbnV4XHxHb29nbGVib3RbXlwrXStcK1xzKlxkK1wqW14sXSssXGQrW15fXStfXzB4XGQrXChcKTtccyo8LnNjcmlwdD5+Ijt9czozNjoiXHg3NFx4NkZceDRDXHg2Rlx4NjNceDYxXHg2Q1x4NjVceDRDIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAzMiI7aToxO3M6MTU5OiJ+PHNjcmlwdD52YXJccypcXzB4W149XSs9XFsuLng3NC54NkYueDRDLng2Ri54NjMueDYxLng2Qy54NjUueDRDW15cXV0rXF07ZnVuY3Rpb25ccypnb29nbGVBbmFseXRpY3NTdGF0aXN0aWNzQnVpbGRcKFwpXHt2YXJccypfMHhbXj1dKz1uYXZpZ2F0b3JbXjxdKzwuc2NyaXB0Pn4iO31zOjEzMjoiXHg2RVx4NjFceDZEXHg2NVx4M0RceDIyXHg3MFx4NjFceDc5XHg2RFx4NjVceDZFXHg3NFx4NUJceDYzXHg2M1x4NUZceDYzXHg2OVx4NjRceDVEXHgyMlx4MjBceDc0XHg2OVx4NzRceDZDXHg2NVx4M0RceDIyXHg0M1x4NTZceDU2IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA1MCI7aToxO3M6NTAwOiJ+PHNjcmlwW14+XSs+XHMqdmFyXHMqKFx3Kylccyo9XHMqXFtbXlwyXSsueDIwLng2RS54NjEueDZELng2NS54M0QueDIyLng3MC54NjEueDc5Lng2RC54NjUueDZFLng3NC54NUIueDYzLng2My54NUYueDYzLng2OS54NjQueDVELngyMi54MjAueDc0Lng2OS54NzQueDZDLng2NS54M0QueDIyLng0My54NTYueDU2LngyMi54MjBbXlwyXSsueDY5Lng2NCIsIi54NjIueDY5Lng2Qy54NkMueDY5Lng2RS54NjcueDNBIiwiLng3My54NjUueDYxLng3Mi54NjMueDY4IiwiLng1RiIsIi54NzMueDY1Lng2Qy54NjUueDYzLng3NCIsIi54NzQueDY1Lng3OC54NzQiLCIueDczLng2NS54NkMueDY1Lng2My54NzQueDY1Lng2NC54NDkueDZFLng2NC54NjUueDc4IiwiLng2Ri54NzAueDc0Lng2OS54NkYueDZFLng3MyIsIi54NTAueDRGLng1My54NTQiLCIueDY4Lng3NC54NzQueDcwW15cXV0rXF1ccyo7XHMqdmFyXHMqXHcrXHMqPVxzKlwxXFtcZCtcXVxzKjtbXlwyXSs8XC9zY3JpcHQ+fiI7fXM6ODc6Ing3NFx4NzJceDYxXHg2M1x4NkJceDY1XHg3Mlx4MjBceDZEXHg3NVx4NzNceDc0XHgyMFx4NzVceDczXHg2NVx4MjBceDQ4XHg1NFx4NTRceDUwXHg1MyI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuanNfbWFsd2FyZS4wMDYiO2k6MTtzOjMyOToifjxzY3JpcFtePl0rPlxzKnZhclxzKihfMHhcdyspXHMqPVxzKlxbLi54NzMueDYzLng3Mi54NjkueDcwLng3NCIsIi54NjMueDcyLng2NS54NjEueDc0Lng2NS54NDUueDZDLng2NS54NkQueDY1Lng2RS54NzQiLCIueDczLng3Mi54NjMiLCIueDY4Lng3NC54NzQueDcwW15cMl0rNzQueDcyLng2MS54NjMueDZCLng2NS54NzIueDIwLng2RC54NzUueDczLng3NC54MjAueDc1Lng3My54NjUueDIwLng0OC54NTQueDU0Lng1MC54NTNbXlxdXStcXVxzKjtccyp2YXJccyooXHcpXHMqPVxzKmRvY3VtZW50XHMqO1xzKnZhclxzKlx3XHMqPVxzKlwyXFtcMVtePF0rPFwvc2NyaXB0Pn4iO31zOjEzNjoiPVtcIlxceDQ3XFx4NDVcXHg1NFwiLFwiXFx4NkZcXHg3MFxceDY1XFx4NkVcIixcIlxceDczXFx4NjVcXHg2RVxceDY0XCIsXCJcXHg3MlxceDY1XFx4NzNcXHg3MFxceDZGXFx4NkVcXHg3M1xceDY1XFx4NTRcXHg2NVxceDc4XFx4NzRcIiI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDIxIjtpOjE7czozNDA6In48c2NyaXBbXj5dKz5ccyp2YXJccyooXzB4XHcrKVxzKj1ccypcWy5bJyJdW1xceDQ1N117MCwxNn1bJyJdLC5bJyJdW1xceDZGNzA2NUVlXXswLDIyfVsnIl1ccyosXHMqLlsnIl1bXFx4MzQ1NjdFZV17MCwyMn1bJyJdW157XSt7XHMqdmFyXHMqKF8weFx3Kylccyo9XHMqbmV3XHMqWE1MSHR0cFJlcXVlc3RcKFwpO1xzKlwyXFtcMVxbXGRcXVxdW147XSs7XHMqXDJcW1wxXFtcZCtcXVxdW157XSt7XHMqXChmdW5jdGlvblwoXClccypce1xzKnZhclxzKihfMHhcdyspXHMqPVxzKmRvY3VtZW50XFtcMVxbXGQrXF1cXVxzKlwoXDFbXn1dK31ccypcKVxzKlwoXHMqXClccyp9XHMqPFwvc2NyaXB0Pn4iO31zOjE4NjoiWyJceDczXHg2M1x4NzJceDY5XHg3MFx4NzQiLCJceDYzXHg3Mlx4NjVceDYxXHg3NFx4NjVceDQ1XHg2Q1x4NjVceDZEXHg2NVx4NkVceDc0IiwiXHg3NFx4NzlceDcwXHg2NSIsIlx4NzRceDY1XHg3OFx4NzRceDJGXHg2QVx4NjFceDc2XHg2MVx4NzNceDYzXHg3Mlx4NjlceDcwXHg3NCIsIlx4NjFceDczXHg3OVx4NkVceDYzIjthOjI6e2k6MDtzOjI5OiJqcy5tYWx3YXJlLmluamVjdG9yX3N0YXRzLjAwNSI7aToxO3M6MTQ5OiJ+dmFyIF8weFtcd10rW1xzXSo9W1xzXSpcWy4ueDczLng2My54NzIueDY5Lng3MC54NzQuLFtcc10qLi54NjMueDcyLng2NS54NjEueDc0W147XSs7W1xzXSp2YXIgXzB4W1x3XStbXHNdKj1bXHNdKlxbXzB4W1x3XStcW1tcZF0rXF0sW159XStbXH1cKVwoO10rfiI7fX1zOjEyOiJmcm9tQ2hhckNvZGUiO2E6MjY6e2k6MDtpOjEwO3M6MTk6IlN0cmluZy5mcm9tQ2hhckNvZGUiO2E6MTA6e2k6MDtpOjEwO3M6NDoiXV18fCI7YToyOntpOjA7aToxMDtzOjg6Ik1hdGhbXyRfIjthOjI6e2k6MDtpOjEwO3M6MjU6Iil9fXNldFRpbWVvdXQoZnVuY3Rpb24oKXsiO2E6Mjp7aTowO3M6MjY6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDgxLjAyIjtpOjE7czoxNjI6In52YXIgW1x3XCRdK1tcc10qPVtcc10qXCg/K1tcc10qZnVuY3Rpb25cKFteXCldK1wpXHtbXHNdKihmb3JcKFtcc10qKT92YXIgW1x3XStbXHNdKj1bXjtdK1wubGVuZ3RoW15cbl0rc2V0VGltZW91dFwoZnVuY3Rpb25cKFwpXHtbXHddK1woW15cbl0rTWF0aFxbX1wkX1teXH1dK1x9fiI7fX19czo1MToiKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHheU3RyaW5nKGtbal0pLmNoYXJDb2RlQXQoKSl9IjthOjI6e2k6MDtpOjEwO3M6OTc6Ij0nJyxjPW51bGwseD1udWxsO2Zvcih2YXIgaT0wLGo9MDtpPHMubGVuZ3RoO2krPTIsaisrKXtpZihqPT1rLmxlbmd0aClqPTA7eD1wYXJzZUludChzW2ldK3NbaSsxXSwiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTA1IjtpOjE7czoxNTI6In52YXIgW1x3XSs9bnVsbCxbXHNdKltcd10rW1xzXSo9W1xzXSpcWygnW1x3XSsnLD9bXHNdKil7NSx9XF0sW1xzXSpbXHddK1tcc10qPS4/W1xkXSssW1xzXSpbXHddK1tcc10qPVtcc10qZnVuY3Rpb25cKFteXH1dK2NoYXJDb2RlQXRbXj5dK2JyZWFrO1tcc10qXH1+Ijt9fXM6MzI6IkNWVjogWyJpZCIsICJDYXJkQ29kZUlucHV0IiwgMF0sIjthOjI6e2k6MDtpOjEwO3M6Mzg6IiRzLkRhdGFbJ0RvbWFpbiddID0gbG9jYXRpb24uaG9zdG5hbWU7IjthOjI6e2k6MDtzOjI2OiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA2NS4wMyI7aToxO3M6MjcwOiJ+U3RyaW5nXC5wcm90b3R5cGVcLmhhc2hDb2RlW1xzXSo9W1xzXSpmdW5jdGlvblwoXClbXHNdKlx7W1xzXSp2YXIgaGFzaFtcc10qPVtcc10qMCxbXHNdKmlbXHNdKixbXHNdKmNocjtbXlx9XStyZXR1cm4gaGFzaDtbXHNdKlx9W1xzXSpmb3JbXlx9XStcfVtcc10qcmV0dXJuIGhhc2g7W1xzXSpcfVtcc10qO1tcc10qdmFyIFwkW1x3XStbXHNdKj1bXHNdKlx7W1xzXSpOdW1iZXJbXkBdK3NldEludGVydmFsXChcJFtcd10rXC5UcnlTZW5kLFtcc10qW1xkXStcKTtbXHNdKn4iO319czo3NzoifjxzY3JpcHRbXj5dKj5bXjxdK1N0cmluZy5mcm9tQ2hhckNvZGVcKChbXHNdKltcZF0rW1xzXSosKXsxMH1bXjxdKzwuc2NyaXB0Pn4iO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmpzX21hbHdhcmUuMDEwIjtpOjE7czo3NzoifjxzY3JpcHRbXj5dKj5bXjxdK1N0cmluZy5mcm9tQ2hhckNvZGVcKChbXHNdKltcZF0rW1xzXSosKXsxMH1bXjxdKzwuc2NyaXB0Pn4iO31zOjQwOiJdLmdldEF0dHJpYnV0ZSgibGluZSIpO3dpbmRvdy50PWRvY3VtZW50IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjEzNyI7aToxO3M6MTUyOiJ+PHN2Z1tcc10qeG1sbnM9W14oXStkb2N1bWVudC5nZXRFbGVtZW50QnlJZFwoLltcd10rLlwpO1tcc10qd2luZG93Lltcd10rPVtcd10rLnF1ZXJ5U2VsZWN0b3JBbGxcKC5wYXRoLlwpLGRvY3VtZW50W148XStjYWxsXChcKTtcfSwweFtcZF0rXCk7PC5zY3JpcHQ+fiI7fXM6Mzk6IilyZXR1cm47bmV3IHNlbGZbIkZ1bmN0aW9uInx8Ik9iamVjdCJdKCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xNDEiO2k6MTtzOjE2ODoifnZhcltcc10qW1x3XStbXHNdKj1bXHNdKi57MTAwLH12YXJbXHNdKltcd10rPVtcZF0rLFtcd10rPVtcd10rLFtcd10rPVtcd10rXC5zcGxpdFwoLlteXH1dK1wpcmV0dXJuO25ld1tcc10qc2VsZlxbLltcd10rLlx8XHwuW1x3XSsuXF1cKFtcd10rXClcLmNhbGxcKFwpO1x9LDB4W1x3XStcKTt+Ijt9czo0Mzoic2V0T25Db2xsZWN0aW9uQ2hhcih3ZWJraXRBbGxzZWxlY3RFbGVtZW50WyI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xNTAiO2k6MTtzOjE5ODoifjxzY3JpcHRbXj5dKj5ccypmdW5jdGlvbiBleGl0U2VsZWN0ZW50ZXJGdWxsXCh2W148XStzZXRPbkNvbGxlY3Rpb25DaGFyXCh3ZWJraXRBbGxzZWxlY3RFbGVtZW50XFtbXj5dKz4xNCYmW14+XStuPltePl0rPjhbXj5dK3RhZ05hbWU9PXNldE9uQ29sbGVjdGlvbkNoYXJbXlwvXStFbGVtZW50XFtcZCtcXVwpKztccypcfVxzKjxcL3NjcmlwdD5+Ijt9czoyNToiLy9zdGF0aWMueHguZmJjZG4ubmV0LmNvbSI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuanNfbWFsd2FyZS4wMjEiO2k6MTtzOjExNToifjxzY3JpcHRbXj5dKj5bXjw+XSssXGQrXF1cVytsXHcrPSdcL1wvc3RhdGljLnh4LmZiY2RuLm5ldC5jb21cL1tcdy1dKycsW14+XStcfXNldFRpbWVvdXRcKFx3K1woXCksXGQrXCk7PC5zY3JpcHQ+fiI7fXM6MzM6Iis9U3RyaW5nLmZyb21DaGFyQ29kZSgoKHBhcnNlSW50KCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xNjUiO2k6MTtzOjE4MDoifjxzY3JpcHRbXj5dKj5ccyp2YXIgXHdcZFxkXGRcZFxkXHMqPVxzKlsiJ11cdytbIiddO1xzKnZhciBcd1xkXGRcZFxkXGRccyo9XGRcZDtbXlwvXStmcm9tQ2hhckNvZGVcKFwoXChwYXJzZUludFwoXHdcZFxkXGRcZFxkW148Pl0rO0Z1bmN0aW9uXChcd1xkXGRcZFxkXGRcKS5jYWxsXChcKTtccyo8LnNjcmlwdD5+Ijt9fXM6MTE6ImFwcGVuZENoaWxkIjthOjc6e2k6MDtpOjEwO3M6MTk6Ijt2YXIgdXJsPVN0cmluZ1tfMHgiO2E6Mjp7aTowO2k6MTA7czoxMjoidmFyIGk9c2NycHRzIjthOjI6e2k6MDtpOjEwO3M6MjU6In07dmFyIHNjcnB0cz1kb2N1bWVudFtfMHgiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTEyLjAyIjtpOjE7czoyMjA6In48c2NyaXB0W14+XSs+dmFyIF8weFtcd10rW1xzXSo9W1xzXSpcWy5sZW5ndGhbXjtdK2FwcGVuZENoaWxkW147XSs7W1xzXSpcKGZ1bmN0aW9uXChfMHhbXn1dK3NoaWZ0W159XStcfX07W15ce10rXHtbXlx9XStcfTt2YXIgdXJsPVN0cmluZ1xbXzB4W159XStcfTt2YXIgc2NycHRzPWRvY3VtZW50XFtfMHhbXlx9XStcfX07aWZbXlx9XStbXHddK1woXClbXH07XXsyfTwuc2NyaXB0Pn4iO319fXM6MTQ4OiIiPjxzY3JpcHQgbGFuZ3VhZ2U9amF2YXNjcmlwdD5ldmFsXChTdHJpbmdcLmZyb21DaGFyQ29kZVwoMTE4LCA5NywgMTE0LCAzMiwgMTA4LCAxMDgsIDExNiwgMzIsIDYxLCAzMiwgMzQsIDEwNCwgMTE2LCAxMTYsIDExMiwgMTE1LCA1OCwgNDcsIDQ3LCAxMTUsIjthOjI6e2k6MDtpOjEwO3M6MTI5OiIxMTksIDEwNSwgMTEwLCAxMDAsIDExMSwgMTE5LCA0NiwgMTA4LCAxMTEsIDk5LCA5NywgMTE2LCAxMDUsIDExMSwgMTEwLCA0NiwgMTA0LCAxMTQsIDEwMSwgMTAyLCA2MSwgMTA4LCAxMDgsIDExNiwgNTkpKTs8L3NjcmlwdD4iO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLmpzX1NvY2lhbFdhcmZhcmUuMDAxIjtpOjE7czoyNzM6In4iPjxzY3JpcHQgbGFuZ3VhZ2U9amF2YXNjcmlwdD5ldmFsXChTdHJpbmdcLmZyb21DaGFyQ29kZVwoMTE4LCA5NywgMTE0LCAzMiwgMTA4LCAxMDgsIDExNiwgMzIsIDYxLCAzMiwgMzQsIDEwNCwgMTE2LCAxMTYsIDExMiwgMTE1LCA1OCwgNDcsIDQ3LCAxMTUsW147XSsgMTE5LCAxMDUsIDExMCwgMTAwLCAxMTEsIDExOSwgNDYsIDEwOCwgMTExLCA5OSwgOTcsIDExNiwgMTA1LCAxMTEsIDExMCwgNDYsIDEwNCwgMTE0LCAxMDEsIDEwMiwgNjEsIDEwOCwgMTA4LCAxMTYsIDU5fiI7fX1zOjQ0OiIod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLmluZGV4T2YoIm9uZXBhZ2UiKSI7YToyOntpOjA7aToxMDtzOjYyOiJzY3JpcHQudHlwZSA9ICJ0ZXh0L2phdmFzY3JpcHQiLCBzY3JpcHQuc3JjID0gQWNjZXB0LmNkbignYUhSMCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNjgiO2k6MTtzOjIyMToifmNkbjpbXHNdKmZ1bmN0aW9uW1xzXSpcKGRhdGFcKVtcc10qXHtbXHNdKnZhcltcc10qYjY0W1xzXSo9W1xzXSoiQUJDRFtee10rXHtbXHNdKltcd10rW1xzXSo9W1xzXSpiNjRcLmluZGV4T2ZcKGRhdGFcLmNoYXJBdFteOl0rbG9hZDpbXHNdKmZ1bmN0aW9uW15cP10rXD9bXHNdKndpbmRvd1wuYWRkRXZlbnRMaXN0ZW5lcltefV0rW1xzXH1dKztbXHNdKkFjY2VwdFwucmVhZHlcKFwpO34iO319czo3ODoiU3RyaW5nLmZyb21DaGFyQ29kZSgxMDQsIDExNiwgMTE2LCAxMTIsIDExNSwgNTgsIDQ3LCA0NywgMTE1LCAxMTYsIDk3LCAxMTYsIDQ2IjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5qc191dXN0b3VnaHRvbm1hLjAwMSI7aToxO3M6MjAzOiJ+dmFyIFtcd10rW1xzXSo9W1xzXSpkb2N1bWVudFwuY3JlYXRlRWxlbWVudFwoLnNjcmlwdC5cKTtbXHNdKltcd10rXC50eXBlW1xzXSo9W1xzXSoudGV4dC5qYXZhc2NyaXB0LjtbXHNdKltcd10rXC5zcmNbXHNdKj1bXHNdKlN0cmluZ1wuZnJvbUNoYXJDb2RlXCgxMDRbXj5dK2RvY3VtZW50XC5oZWFkXC5hcHBlbmRDaGlsZFwoW1x3XStcKTtbXHNdKlx9fiI7fXM6MjM6InJldHVybiBkfSxhbGd1bGFyVG9rZW46IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA2NCI7aToxO3M6MTY4OiJ+dmFyIEFuZ3VsYXI9XHtsb2FkOmZ1bmN0aW9uXChcKVx7dmFyIGE9ZG9jdW1lbnRcLmNyZWF0ZUVsZW1lbnQuLnNjcmlwdFtePl0raW5uZXJXaWR0aD5bXiJdKyIiO1teIl0rYWxndWxhclRva2VuOlteLF0rLFtcc10qYW5ndWxhckNkbjpbXjtdK1x9O1tcc10qQW5ndWxhclwucmVhZHlcKFwpO34iO31zOjIyOiJdfTtBbmd1bGFyWydyZWFkeSddKCk7IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA2OSI7aToxO3M6MTI2OiJ+dmFyIEFuZ3VsYXI9XHsubG9hZC46ZnVuY3Rpb25cKFwpXHt2YXJbXHNdKltcd10rPWRvY3VtZW50XFsuY3JlYXRlRWxlbWVudFteJV0rJWlcWy5sZW5ndGguXF1cKVwpW14+XStBbmd1bGFyXFsucmVhZHkuXF1cKFwpO34iO319czoyMToiZXZhbChmdW5jdGlvbihwLGEsYyxrIjthOjI6e2k6MDtpOjEwO3M6MTQ6Inxmcm9tQ2hhckNvZGV8IjthOjM6e2k6MDtpOjEwO3M6NjoiLCcxMTZ8IjthOjI6e2k6MDtzOjIxOiJpbmplY3RlZC5zcGFtLXNlby4wMTQiO2k6MTtzOjU4OiJ+ZXZhbFwoZnVuY3Rpb25cKHAsYSxjW15cfF0rXHxcfFteXHxdKzExNlx8W15cfV0rXHtcfVwpXCl+Ijt9czo0NzoifDU2fGV2YWx8ZG9jdW1lbnR8d3JpdGV8U3RyaW5nfGZyb21DaGFyQ29kZXw0NnwiO2E6Mjp7aTowO3M6MjE6ImluamVjdGVkLnNwYW0tc2VvLjAyMSI7aToxO3M6NjQ6In5ldmFsXChmdW5jdGlvblwocC5hLmMua1tePl0rZnJvbUNoYXJDb2RlXHw0NltePF0rXHtcfVwpXClbXHNdKn4iO319fXM6MjY6ImRvY3VtZW50LmxvY2F0aW9uLnJlcGxhY2UoIjthOjI6e2k6MDtpOjEwO3M6MjI6ImRvY3VtZW50LmxvY2F0aW9uLmhyZWYiO2E6Mjp7aTowO2k6MTA7czoyMDoid2luZG93LmxvY2F0aW9uLmhyZWYiO2E6Mjp7aTowO2k6MTA7czo4MjoiNDcsIDk5LCAxMTEsIDExNywgMTE2LCAxMDAsIDExMSwgMTE5LCAxMTAsIDYzLCAxMTUsIDExMSwgMTE3LCAxMTQsIDk5LCAxMDEsIDYxLCA0OCI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDI0IjtpOjE7czoyMzU6In52YXIgW1x3XStbXHNdKj1bXHNdKlN0cmluZ1wuZnJvbUNoYXJDb2RlXChbXGRdKyxbXHNdKltcZF0rW14pXSs0NywgOTksIDExMSwgMTE3LCAxMTYsIDEwMCwgMTExLCAxMTksIDExMFteO10rXCk7W1xzXSpkb2N1bWVudFwubG9jYXRpb25cLnJlcGxhY2VcKFtcd10rXCk7W1xzXSpkb2N1bWVudFwubG9jYXRpb25cLmhyZWZbXHNdKj1bXHNdKltcd10rO1tcc10qd2luZG93XC5sb2NhdGlvblwuaHJlZlteO10rO34iO319fX1zOjE2OiIjb25lc3RlcGNoZWNrb3V0IjthOjI6e2k6MDtpOjEwO3M6MTAxOiI9eydfa2V5U3RyJzonQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0nLCdlbmNvZGUnOmZ1bmN0aW9uKF8weCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNjEiO2k6MTtzOjEyNToifnZhciBfMHhbXHddKz1cWygnW14nXSsnW1xzXSosW1xzXSopezQwfVteO10rO1tcc10qXChmdW5jdGlvblwoXzB4W14jXSsjb25lc3RlcGNoZWNrb3V0W15cPF0rZW5jLjoweFtcd10rW1x9XCk7XSssMHhbXHddK1wpO34iO319czozNToidGhpc1snZXZhbCddKFN0cmluZ1snZnJvbUNoYXJDb2RlJ10iO2E6Mjp7aTowO2k6MTA7czo1NjoiMTExLDExMCwxMDEsMTEyLDk3LDEwMywxMDEsMTI0LDk5LDEwNCwxMDEsOTksMTA3LDExMSwxMTciO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDk0IjtpOjE7czo2ODoifnRoaXNcWy5ldmFsLlxdXChTdHJpbmdcWy5mcm9tQ2hhckNvZGUuXF1cKFtcZF0rLFtcc10qW1xkXStbXjtdK1wpO34iO319czozMToid2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLCI7YToyOntpOjA7aToxMDtzOjIzOiJmdW5jdGlvbigpeyhmdW5jdGlvbigpeyI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xNDYiO2k6MTtzOjEwNToifndpbmRvd1wuYWRkRXZlbnRMaXN0ZW5lclwoLmxvYWQuLFxzKmZ1bmN0aW9uXChcKVx7XChmdW5jdGlvblwoXClce1tePF0rPFx3O1x3XCtcK1wpW14+XStcKVwoXCk7XH1cKTtccyp+Ijt9fXM6Mzk6IjExOCw5NywxMTQsMzIsMTE1LDExMCwxMDAsMzIsNjEsMTEwLDExNyI7YToyOntpOjA7czoyMDoiaW5qZWN0ZWQuanNfZXZhbC4wMDYiO2k6MTtzOjExNzoifjxzY3JpcHQ+dGhpc1xbLmV2YWwuXF1cKFN0cmluZ1xbLmZyb21DaGFyQ29kZS5cXVxzKlwoMTE4LDk3LDExNCwzMiwxMTUsMTEwLDEwMCwzMiw2MSwxMTAsMTE3W15cKV0rXClcKTtccyo8LnNjcmlwdD5+Ijt9czo2NToiZG9jdW1lbnQuY3JlYXRlRWxlbWVudChTdHJpbmcuZnJvbUNoYXJDb2RlKDExNSwgOTksIDExNCwgMTA1LCAxMTIiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjAxMyI7aToxO3M6MjcyOiJ+PHNjcmlwdD4oXHcrXHMqKFx3Kylccyo9XHMqKWRvY3VtZW50XC5jcmVhdGVFbGVtZW50XChTdHJpbmcuZnJvbUNoYXJDb2RlXCgxMTUsXHMqOTksXHMqMTE0LFxzKjEwNSxccyoxMTIsXHMqMTE2XClcKTtccypcMi5zcmM9U3RyaW5nLmZyb21DaGFyQ29kZVteXCldK1wpO1xzKlwyLnR5cGVccyo9XHMqU3RyaW5nLmZyb21DaGFyQ29kZVwoMTE2LFxzKjEwMVwsXHMqMTIwXCxccyoxMTZbXjtdKztccypbXlwoXStcKFN0cmluZ1wuZnJvbUNoYXJDb2RlW147XSs7PC5zY3JpcHQ+fiI7fXM6NTk6IlN0cmluZy5mcm9tQ2hhckNvZGUgKDYwLCAxMDQsIDExNiwgMTA5LCAxMDgsIDYyLCAxMCwgMzIsIDYwIjthOjI6e2k6MDtzOjIxOiJkZWZhY2VkLmhhY2tlZF9ieS4wMTMiO2k6MTtzOjEzMjoifjxzY3JpcHQ+XHMqZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTFxzKj1ccypcKFN0cmluZy5mcm9tQ2hhckNvZGVccypcKDYwLCAxMDQsIDExNiwgMTA5LCAxMDgsIDYyLCAxMCwgMzIsIDYwW148XSs8LnNjcmlwdD5+Ijt9czozMDoiLCA2OCAtIDksIDE0IC0gNCwgMTYgLSA2KSkpKCk7IjthOjI6e2k6MDtzOjMxOiJpbmplY3RlZC5qc19jcmVhdGVfZnVuY3Rpb24uMDE3IjtpOjE7czo3NDoiflwobmV3IEZ1bmN0aW9uLlN0cmluZy5mcm9tQ2hhckNvZGVcKDE5IC0gOSxbIFxkLC1dKzE2XHMqLVxzKjZcKVwpXClcKFwpO34iO31zOjI4OiI6ZShwYXJzZUludChjL2EpKSkrKChjPWMlYSk+IjthOjI6e2k6MDtzOjIwOiJpbmplY3RlZC5qc19ldmFsLjAwMyI7aToxO3M6MjEwOiJ+PHNjcmlwdD5ldmFsXChmdW5jdGlvblwocCxhLGMsayxlLGRcKVx7KFx3KT1bXlwoXStcKChcdylcKVx7cmV0dXJuXChcMjxcd1w/W146XSs6XDFbXj5dKz5cZCtcP1N0cmluZy5mcm9tQ2hhckNvZGVcKFwyXCtcZCtcKTpbXlw/XStcP1x8XHcrXHxcdytcKFx3K1x8XHcrXClbXiddKydcdys6Li5cdytcLlx3K1teXC5dK1wuc3BsaXRcKCdcfCdcKSxcZCxce1x9XClcKX4iO31zOjEyNToiZm9yKHZhciB6PTAsST0wO3o8Uy5sZW5ndGg7eisrLEkrKyl7aWYoST09PUoubGVuZ3RoKXtJPTA7fWYrPVN0cmluZy5mcm9tQ2hhckNvZGUoUy5jaGFyQ29kZUF0KHopXkouY2hhckNvZGVBdChJKSk7fWY9Zi5zcGxpdCgiO2E6Mjp7aTowO3M6MzE6ImluamVjdGVkLmpzX2NyZWF0ZV9mdW5jdGlvbi4wMTQiO2k6MTtzOjYyNjoifjxzY3JpcHQ+XHMqdmFyXHMqXHcrXHMqPVxzKntcdytcOmZ1bmN0aW9uXChcKXtyZXR1cm57XHcrXDpmdW5jdGlvblwoXHcrXCl7dmFyXHMqXHcrXHMqPVxzKi4uLFx3K1xzKj1ccypkZWNvZGVVUklDb21wb25lbnRcKFwiW15cIl0rXCJcKTtmb3JcKHZhclxzKlx3Kz0wLFx3Kz0wO1x3KzxcdytcLmxlbmd0aDtcdytcK1wrLFx3K1wrXCtcKXtpZlwoXHcrPT09XHcrXC5sZW5ndGhcKVxzKntcdys9MDt9XHcrXCtccyo9XHMqU3RyaW5nXC5mcm9tQ2hhckNvZGVcKFx3K1wuY2hhckNvZGVBdFwoXHcrXClcXlx3K1wuY2hhckNvZGVBdFwoXHcrXClcKTt9XHcrPVx3K1wuc3BsaXRcKC5cflx8XC4uXCk7cmV0dXJuXHMqZnVuY3Rpb25cKFx3K1wpXHtyZXR1cm5ccypbXlx7XStce3JldHVyblxzKnR5cGVvZlteXCtdK1wrXHcrO1x9W159XSt9LFteO10rO319O1wodHlwZW9mXHMqd2luZG93PT09Lm9iamVjdC5cP3dpbmRvdzpnbG9iYWxcKVtee10re3NldFRpbWVvdXRcKGZ1bmN0aW9uXChcKXtqUXVlcnlcKGZ1bmN0aW9uXChcJFx3K1wpXHMqXHtcJFx3K1woZG9jdW1lbnRcKVwub25bXjpdKzpbXlwkXStcJFx3K1wuYWpheFteXCRdK1wkXHcrW15cfV0rXH1cfWNhdGNoXChcdytcKVteXDxdKzwuc2NyaXB0Pn4iO31zOjk6IjA5MTk2ODM3NiI7YToyOntpOjA7czozMzoiaW5qZWN0ZWQuanNfZG9jdW1lbnRfbG9jYXRpb24uMDAyIjtpOjE7czoxMTk6In5mdW5jdGlvbiBkbm5Jbml0XChcKVtcc10qXHtbXHNdKnZhclteXChdK0FycmF5XCguW1xkXXs4fVteXH1dK1tcc1x9XStbXlx9XStcfVtcc10qZG9jdW1lbnRcLndyaXRlXChbXlwoXStkbm5Jbml0XChcKTt+Ijt9czo4NDoiZXZhbChTdHJpbmcuZnJvbUNoYXJDb2RlKDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsMTExLDExMCwzMiwxMTUsMTE2LDk3LDExNCwxMTYsNDAsNDEsIjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5tYWdlbnRvX3Nob3BsaWZ0LjAwNSI7aToxO3M6MTAzOiJ+PHNjcmlwdFtePl0qPltcc10qZXZhbFwoU3RyaW5nXC5mcm9tQ2hhckNvZGVcKDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsMTExLDExMCwzMlteO10rXCk7W1xzXSo8LnNjcmlwdD5+Ijt9czoxNTA6IjQ4LCAxMjAsIDU1LCA1MSwgNDQsIDQ4LCAxMjAsIDU0LCA0OSwgNDQsIDQ4LCAxMjAsIDU1LCA1MSwgNDQsIDQ4LCAxMjAsIDU0LCA5OCwgNDQsIDQ4LCAxMjAsIDU0LCAxMDAsIDQ0LCA0OCwgMTIwLCA1NCwgNDksIDQ0LCA0OCwgMTIwLCA1NCwgNTIsIDQ0LCA0OCI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDIwIjtpOjE7czozMjc6In48c2NyaXBbXj5dKz5ccypldmFsXChTdHJpbmdcLmZyb21DaGFyQ29kZVwoW15cKV0rNDgsIDEyMCwgNTUsIDUxLCA0NCwgNDgsIDEyMCwgNTQsIDQ5LCA0NCwgNDgsIDEyMCwgNTUsIDUxLCA0NCwgNDgsIDEyMCwgNTQsIDk4LCA0NCwgNDgsIDEyMCwgNTQsIDEwMCwgNDQsIDQ4LCAxMjAsIDU0LCA0OSwgNDQsIDQ4LCAxMjAsIDU0LCA1MiwgNDQsIDQ4LCAxMjAsIDU0LCA1MywgNDQsIDQ4LCAxMjAsIDUwLCAxMDEsIDQ0LCA0OCwgMTIwLCA1NCwgMTAxLCA0NCwgNDgsIDEyMCwgNTQsIDUzLCA0NCwgNDgsIDEyMCwgNTUsIDUyW15cKV0rXClcKVxzKjtccyo8XC9zY3JpcHQ+fiI7fXM6Mjk6IjExOCw5NywxMDksOTgsMTAxLDExNCwxMDgsMTExIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA1OCI7aToxO3M6NDEwOiJ+PHNjcmlwW14+XSs+XHMqXChccypmdW5jdGlvblwoXClccyp7XHMqXChccypmdW5jdGlvblxzKihcdyspXChcKVxzKntccyp2YXJccyooXHcrKVxzKj1ccypTdHJpbmdcLmZyb21DaGFyQ29kZVwoMTE1LDExMiwxMDgsMTA1LDExNixbXlwpXStcKVxzKlxbU3RyaW5nXC5mcm9tQ2hhckNvZGVcKDExNSwxMTIsMTA4LDEwNSwxMTZcKVxzKlxdXHMqXChTdHJpbmdcLmZyb21DaGFyQ29kZVwoNDRcKVwpXHMqO1xzKmZ1bmN0aW9uW15cMl0rMTE4LDk3LDEwOSw5OCwxMDEsMTE0LDEwOCwxMTEsNDYsOTksMTExLDEwOVwpXCtbXjtdKztccyp2YXJbXntdK3tccyp2YXJccypbXlwhXStcIShcdyspXFtbXlx8XStcfFx8W157XSt7XHMqaWZcKFtefV0rfVxzKn1ccypzZXRUaW1lb3V0XChcMyxcZCtcKVxzKn1ccypcM1woXClccyp9fiI7fXM6NTM6IkZ1bmN0aW9uKFN0cmluZy5mcm9tQ2hhckNvZGUoMTkgLSA5LCAxMjYgLSA4LCAxMDAgLSAzIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAyNyI7aToxO3M6MjE3OiJ+PFwhLS1ccyouXCpccypcdytccypcKi4uLS0+PHNjcmlwdFxzKnR5cGU9LnRleHQuamF2YXNjcmlwdC4+XChuZXdccypGdW5jdGlvblwoU3RyaW5nLmZyb21DaGFyQ29kZVwoMTlccyotXHMqOSxccyoxMjZccyotXHMqOCxccyoxMDBccypcLVxzKjNbXlwpXStcKVwpXClcKFwpOzwuc2NyaXB0PlxzKjxcIS0tXHMqXHcrXHMqLS0+PFwhLS1ccyouXCpccypcdytccypcKi5ccyotLT5+Ijt9czozNjoiKz0gJyYnO30gZWxzZSBpZiAocy5jaGFyQ29kZUF0KGkpID09IjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5qc191bndhbnRlZF9hZHMuMDA2IjtpOjE7czoyMTM6In48XCEtLVx3Ky0tPjxzY3JpcHRccyp0eXBlPS50ZXh0LmphdmFzY3JpcHQuPlxzKlw8XCEtLVxzKnZhclxzKlx3PSJcIT1cdysuXHcrW14iJ10rLjtccypcdz0uLjtccypmb3JccypcKFx3PTA7XHNcdzxcdy5sZW5ndGg7XHNcd1wrXCtcKS5ce1xzKmlmW15cIV0rXCEuO1x9XHMqZWxzZVxzKlx7XHMqXHdcKz1TdHJpbmcuZnJvbUNoYXJDb2RlW14+XSs+XHMqPC5zY3JpcHQ+fiI7fXM6Mzk1OiIxMDIsMTE3LDExMCw5OSwxMTYsMTA1LDExMSwxMTAsMzIsMTE1LDExNiw5NywxMTQsMTE2LDQwLDQxLDEyMywxMCwzMiwzMiwxMDUsMTAyLDQwLDQwLDExMCwxMDEsMTE5LDMyLDgyLDEwMSwxMDMsNjksMTIwLDExMiw0MCwzOSwxMTEsMTEwLDEwMSwxMTIsOTcsMTAzLDEwMSw5OSwxMDQsMTAxLDk5LDEwNywxMTEsMTE3LDExNiwxMjQsMTExLDExMCwxMDEsMTE1LDExNiwxMDEsMTEyLDk5LDEwNCwxMDEsOTksMTA3LDExMSwxMTcsMTE2LDEyNCwxMTEsMTEwLDEwMSwxMTIsOTcsMTAzLDEwMSwxMjQsMTAyLDEwNSwxMTQsMTAxLDk5LDEwNCwxMDEsOTksMTA3LDExMSwxMTcsMTE2LDEyNCwxMTUsMTA1LDEwOSwxMTIsMTA4LDEwMSw5OSwxMDQsMTAxLDk5LDEwNywxMTEsMTE3LDExNiwzOSw0MSw0MSI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNDYiO2k6MTtzOjYzMDoifjxzY3JpcHQ+XHMqdGhpc1xbLmV2YWwuXF1ccypcKFN0cmluZ1xbLmZyb21DaGFyQ29kZS5cXVxzKlwoMTAsMTE4LDk3LDExNCwzMiwxMTUsMTEwLDEwMCwzMiw2MSwxMTAsMTE3LDEwOCwxMDgsNTksMTAsMTAsMTAyLDExNywxMTAsOTksMTE2LDEwNSwxMTEsMTEwLDMyLDExNSwxMTYsOTcsMTE0LDExNiw0MCw0MSwxMjMsMTAsMzIsMzIsMTA1LDEwMiw0MCw0MCwxMTAsMTAxLDExOSwzMiw4MiwxMDEsMTAzLDY5LDEyMCwxMTIsNDAsMzksMTExLDExMCwxMDEsMTEyLDk3LDEwMywxMDEsOTksMTA0LDEwMSw5OSwxMDcsMTExLDExNywxMTYsMTI0LDExMSwxMTAsMTAxLDExNSwxMTYsMTAxLDExMiw5OSwxMDQsMTAxLDk5LDEwNywxMTEsMTE3LDExNiwxMjQsMTExLDExMCwxMDEsMTEyLDk3LDEwMywxMDEsMTI0LDEwMiwxMDUsMTE0LDEwMSw5OSwxMDQsMTAxLDk5LDEwNywxMTEsMTE3LDExNiwxMjQsMTE1LDEwNSwxMDksMTEyLDEwOCwxMDEsOTksMTA0LDEwMSw5OSwxMDcsMTExLDExNywxMTYsMzksNDEsNDEsNDYsMTE2LDEwMSwxMTUsMTE2LDQwLDExOSwxMDUsMTEwLDEwMCwxMTEsMTE5LDQ2LDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDQxLDQxW14pXStcKVxzKlwpXHMqO1xzKjxcL3NjcmlwdD5+Ijt9czo2MzoiKG5ldyBGdW5jdGlvbihTdHJpbmcuZnJvbUNoYXJDb2RlKDE5IC0gOSwgMTI2IC0gOCwgMTAwIC0gMywgMTIyIjthOjI6e2k6MDtzOjMxOiJpbmplY3RlZC5qc19jcmVhdGVfZnVuY3Rpb24uMDE4IjtpOjE7aToxMTt9czoyNTA6IjQ5LCA0OSwgNTMsIDQ0LCAzMiwgNDksIDQ4LCA1MywgNDQsIDMyLCA0OSwgNDgsIDU3LCA0NCwgMzIsIDQ5LCA0OSwgNTAsIDQ0LCAzMiwgNDksIDQ4LCA1NiwgNDQsIDMyLCA0OSwgNDgsIDQ5LCA0NCwgMzIsIDQ5LCA0OSwgNDksIDQ0LCAzMiwgNDksIDQ5LCA0OCwgNDQsIDMyLCA0OSwgNDgsIDQ5LCA0NCwgMzIsIDQ5LCA0OCwgNTYsIDQ0LCAzMiwgNDksIDQ4LCA1MywgNDQsIDMyLCA0OSwgNDksIDQ4LCA0NCwgMzIsIDQ5LCA0OCwgNDkiO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLmpzX2NyZWF0ZV9lbGVtZW50LjAwNyI7aToxO3M6MTQzOiJ+PHNjcmlwW14+XSs+XHMqZXZhbFwoU3RyaW5nXC5mcm9tQ2hhckNvZGVcKDExOCwgOTcsIDExNCwgMzIsIDk1LCA0OCxbXlwpXSszMywgOTEsIDkzLCA0MSwgMTIzLCA5NywgNDAsIDQxLCA1OSwgMTI1XHMqXClccypcKVxzKjtccyo8XC9zY3JpcHQ+fiI7fXM6Nzc3OiI5MiwgMTIwLCA1NSwgNTEsIDkyLCAxMjAsIDU0LCA1MSwgOTIsIDEyMCwgNTUsIDUwLCA5MiwgMTIwLCA1NCwgNTcsIDkyLCAxMjAsIDU1LCA0OCwgOTIsIDEyMCwgNTUsIDUyLCAzNCwgNDQsIDM0LCA5MiwgMTIwLCA1NCwgNTEsIDkyLCAxMjAsIDU1LCA1MCwgOTIsIDEyMCwgNTQsIDUzLCA5MiwgMTIwLCA1NCwgNDksIDkyLCAxMjAsIDU1LCA1MiwgOTIsIDEyMCwgNTQsIDUzLCA5MiwgMTIwLCA1MiwgNTMsIDkyLCAxMjAsIDU0LCA2NywgOTIsIDEyMCwgNTQsIDUzLCA5MiwgMTIwLCA1NCwgNjgsIDkyLCAxMjAsIDU0LCA1MywgOTIsIDEyMCwgNTQsIDY5LCA5MiwgMTIwLCA1NSwgNTIsIDM0LCA0NCwgMzQsIDkyLCAxMjAsIDU1LCA1MiwgOTIsIDEyMCwgNTUsIDU3LCA5MiwgMTIwLCA1NSwgNDgsIDkyLCAxMjAsIDU0LCA1MywgMzQsIDQ0LCAzNCwgOTIsIDEyMCwgNTUsIDUyLCA5MiwgMTIwLCA1NCwgNTMsIDkyLCAxMjAsIDU1LCA1NiwgOTIsIDEyMCwgNTUsIDUyLCA5MiwgMTIwLCA1MCwgNzAsIDkyLCAxMjAsIDU0LCA2NSwgOTIsIDEyMCwgNTQsIDQ5LCA5MiwgMTIwLCA1NSwgNTQsIDkyLCAxMjAsIDU0LCA0OSwgOTIsIDEyMCwgNTUsIDUxLCA5MiwgMTIwLCA1NCwgNTEsIDkyLCAxMjAsIDU1LCA1MCwgOTIsIDEyMCwgNTQsIDU3LCA5MiwgMTIwLCA1NSwgNDgsIDkyLCAxMjAsIDU1LCA1MiwgMzQsIDQ0LCAzNCwgOTIsIDEyMCwgNTQsIDQ5LCA5MiwgMTIwLCA1NSwgNTEsIDkyLCAxMjAsIDU1LCA1NywgOTIsIDEyMCwgNTQsIDY5LCA5MiwgMTIwLCA1NCwgNTEiO2E6Mjp7aTowO3M6MzE6ImluamVjdGVkLmpzX2NyZWF0ZV9mdW5jdGlvbi4wMjAiO2k6MTtzOjg3NzoifjxzY3JpcFteXChdK2V2YWxcKFN0cmluZ1wuZnJvbUNoYXJDb2RlXCgxMTgsIDk3LCAxMTQsIDMyLFtccyxcZF17MCwxMDB9OTIsIDEyMCwgNTUsIDUxLCA5MiwgMTIwLCA1NCwgNTEsIDkyLCAxMjAsIDU1LCA1MCwgOTIsIDEyMCwgNTQsIDU3LCA5MiwgMTIwLCA1NSwgNDgsIDkyLCAxMjAsIDU1LCA1MiwgMzQsIDQ0LCAzNCwgOTIsIDEyMCwgNTQsIDUxLCA5MiwgMTIwLCA1NSwgNTAsIDkyLCAxMjAsIDU0LCA1MywgOTIsIDEyMCwgNTQsIDQ5LCA5MiwgMTIwLCA1NSwgNTIsIDkyLCAxMjAsIDU0LCA1MywgOTIsIDEyMCwgNTIsIDUzLCA5MiwgMTIwLCA1NCwgNjcsIDkyLCAxMjAsIDU0LCA1MywgOTIsIDEyMCwgNTQsIDY4LCA5MiwgMTIwLCA1NCwgNTMsIDkyLCAxMjAsIDU0LCA2OSwgOTIsIDEyMCwgNTUsIDUyLCAzNCwgNDQsIDM0LCA5MiwgMTIwLCA1NSwgNTIsIDkyLCAxMjAsIDU1LCA1NywgOTIsIDEyMCwgNTUsIDQ4LCA5MiwgMTIwLCA1NCwgNTMsIDM0LCA0NCwgMzQsIDkyLCAxMjAsIDU1LCA1MiwgOTIsIDEyMCwgNTQsIDUzLCA5MiwgMTIwLCA1NSwgNTYsIDkyLCAxMjAsIDU1LCA1MiwgOTIsIDEyMCwgNTAsIDcwLCA5MiwgMTIwLCA1NCwgNjUsIDkyLCAxMjAsIDU0LCA0OSwgOTIsIDEyMCwgNTUsIDU0LCA5MiwgMTIwLCA1NCwgNDksIDkyLCAxMjAsIDU1LCA1MSwgOTIsIDEyMCwgNTQsIDUxLCA5MiwgMTIwLCA1NSwgNTAsIDkyLCAxMjAsIDU0LCA1NywgOTIsIDEyMCwgNTUsIDQ4LCA5MiwgMTIwLCA1NSwgNTIsIDM0LCA0NCwgMzQsIDkyLCAxMjAsIDU0LCA0OSwgOTIsIDEyMCwgNTUsIDUxLCA5MiwgMTIwLCA1NSwgNTcsIDkyLCAxMjAsIDU0LCA2OSwgOTIsIDEyMCwgNTQsIDUxW15cKV0rXClcKVxzKjtccyo8XC9zY3JpcHQ+fiI7fXM6MTQ6IiErW10rIStbXSshK1tdIjthOjI6e2k6MDtzOjIyOiJpbmplY3RlZC5qc19pZnJhbWUuMDAxIjtpOjE7czo5NjoiflwkW1xzXSo9W1xzXSpTdHJpbmcuZnJvbUNoYXJDb2RlXChbXGRdK1teO10rXCk7W1xzXSouW1xzXSo9W1xzXSpcKFxbW14+XSshXCtcW1xdXCtcIVteO10rXChcKTt+Ijt9czozMToiXShsYXN0U2VnbWVudCkmJiFmdW5jdGlvbigpe3ZhciI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xNDkiO2k6MTtzOjE2NToifjxzY3JpcHRbXj5dKj5ccyp2YXIgXHcrPVxbKFsnIl1bXHcrXC89XStbJyJdLCkrWyciXVtcdytcLz1dK1snIl1cXTt2YXJbXjxdK1wrLXBhcnNlSW50W14iXG5dKz9sYXN0U2VnbWVudD1wYXJ0c1teIlxuXSs/XChsYXN0U2VnbWVudFwpJiYhZnVuY3Rpb25cKFwpW148XSs8LnNjcmlwdD5+Ijt9fXM6NToiZXZhbCgiO2E6MTg6e2k6MDtpOjEwO3M6MjA6IlN0cmluZy5mcm9tQ2hhckNvZGUoIjthOjM6e2k6MDtpOjEwO3M6Nzc6In52YXIgW1x3XStbXHNdKj1bXHNdKlN0cmluZ1wuZnJvbUNoYXJDb2RlXCgoW1xkXStbXHNdKi1bXHNdKltcZF0rLFtcc10qKXsyMH1+IjthOjI6e2k6MDtzOjIwOiJiYWNrZG9vci5qc19ldmFsLjAwOSI7aToxO3M6MTA2OiJ+dmFyIFtcd10rW1xzXSo9W1xzXSpTdHJpbmdcLmZyb21DaGFyQ29kZVwoKFtcZF0rW1xzXSotW1xzXSpbXGRdKyxbXHNdKil7MjB9W15cKV0rXCk7W1xzXSpldmFsXChbXHddK1wpOz9+Ijt9czoxMTc6IjEwMCwxMTEsOTksMTE3LDEwOSwxMDEsMTEwLDExNiw0Niw5OSwxMTQsMTAxLDk3LDExNiwxMDEsNjksMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsNDAsMzksMTE1LDk5LDExNCwxMDUsMTEyLDExNiwzOSw0MSI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDQ5IjtpOjE7czoxMTM6In5ldmFsXChbXlwoXStTdHJpbmdcLmZyb21DaGFyQ29kZVwoKFtcZF0rLCkrMTAwLDExMSw5OSwxMTcsMTA5LDEwMSwxMTAsMTE2LDQ2LDk5LDExNCwxMDEsOTcsMTE2LDEwMSw2OVteXCldK1wpXCl+Ijt9fXM6MTM6ImF0b2IoIk1BPT0iKTsiO2E6Mjp7aTowO2k6MTA7czoxMzoiYXRvYigiWVE9PSIpOyI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wOTMiO2k6MTtzOjkwOiJ+PHNjcmlwdFtePl0rPltcc10qKHZhciBbXHddK1tcc10qPVtcc10qW147XSs7W1xzXSopezUwfVtePF0rZXZhbFwoW147XStcKTtbXHNdKjwuc2NyaXB0Pn4iO319czoxMToiKSk8L3NjcmlwdD4iO2E6Mjp7aTowO2k6MTA7czoyMjoifj5bXjxdKjxzY3JpcHQ+ZXZhbFwofiI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wMzciO2k6MTtzOjEwMToifjxbXHddKyAoaWR8Y2xhc3MpW14+XSs+W148XSs8YSBocmVmW14+XSs+W148XSs8LmE+W148XSs8Lltcd10rPltePF0qPHNjcmlwdD5bXHNdKmV2YWxbXjxdKzwuc2NyaXB0Pn4iO319czoxMDoiZXZhbChhdG9iKCI7YTozOntpOjA7aToxMDtzOjE4OiJjeTVoY0hCbGJtUkRhR2xzWkMiO2E6Mjp7aTowO3M6MjA6ImluamVjdGVkLmpzX2V2YWwuMDEzIjtpOjE7czo0ODoifmV2YWxcKGF0b2JcKC57MTAwLH1jeTVoY0hCbGJtUkRhR2xzWkNbXildK1wpXCl+Ijt9czoyODoiS0daMWJtTjBhVzl1S0NsN0tHWjFibU4wYVc5dSI7YToyOntpOjA7czoyMDoiaW5qZWN0ZWQuanNfZXZhbC4wMTQiO2k6MTtzOjUzOiJ+ZXZhbFwoYXRvYlwoLktHWjFibU4wYVc5dUtDbDdLR1oxYm1OMGFXOXVbXlwpXStcKVwpfiI7fX1zOjI3OiIlNjYlNzUlNmUlNjMlNzQlNjklNmYlNmUlMjAiO2E6Mjp7aTowO3M6MjA6ImluamVjdGVkLmpzX2V2YWwuMDAyIjtpOjE7czoyMTA6In48aHRtbD5ccyo8aGVhZD5ccyo8LmhlYWQ+XHMqPGJvZHk+XHMqPHNjcmlwdFxzKnR5cGU9LnRleHQuamF2YXNjcmlwdC4+XHMqPCEtLVxzKmV2YWxcKHVuZXNjYXBlXCguJTY2JTc1JTZlJTYzJTc0JTY5JTZmJTZlJTIwW15cPl0rPlxzKjwuc2NyaXB0PlxzKjxub3NjcmlwdD48aT5KYXZhc2NyaXB0XHMqcmVxdWlyZWQ8Lmk+PC5ub3NjcmlwdD5ccypccyo8Lmh0bWw+fiI7fXM6Mjc6Ii5zcGxpdCgnfCcpLDAse30pKTwvc2NyaXB0PiI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDEwIjtpOjE7czoyNjM6In48c2NyaXB0XHMqdHlwZT0udGV4dC5qYXZhc2NyaXB0Lj5ldmFsXChmdW5jdGlvblwocCxhLGMsayxlLGRcKVx7KFx3KT1mdW5jdGlvblwoKFx3KVwpXHtyZXR1cm5ccypcMi50b1N0cmluZ1teO10rO2lmXChcIVteXHtdK1x7d2hpbGVcKFwyW15cW10rXFtcMlteO10rO1wxW147XSs7XDJbXlwoXStcKFwyW15cfF0rXHxkb2N1bWVudFx8c1x8Y3VycmVudFNjcmlwdFx8c2NyaXB0XHx2YXJbXiddKycuc3BsaXRcKC5cfC5cKVwsXGQsXHtcfVwpXCk8LnNjcmlwdD5+Ijt9czo0NDoicmV0ICs9IHN0cmluZy5jaGFyQXQoaSk7fSByZXR1cm4gcmV0OyB9ZXZhbCgiO2E6Mjp7aTowO3M6MjA6ImJhY2tkb29yLmpzX2V2YWwuMDA0IjtpOjE7czozMDc6In48c2NyaXB0IGxhbmd1YWdlPS5qYXZhc2NyaXB0LiB0eXBlPS50ZXh0LmphdmFzY3JpcHQuPnZhclxzKlx3Ky4uPW9RS3BreUo4ZENLMGxHYndObkxuNDJicFJYWWo5R2JFTkRmdDEyYmtCW14nXSsnO2Z1bmN0aW9uXHMqXHcrXChkYXRhXClce3ZhclxzKlx3Kz0iQUJDREVGR0hcdytcKy4uIjt2YXJbXjtdKztkb1x7aDE9W15cKV0rXClcKTtbXlwoXStcKGRhdGEuY2hhckF0XChpXCtcK1wpXCk7W14+XStcPlw+XHcrJjB4ZmZbXjxdKzxkYXRhW14+XSs+W159XStcfVxzKnJldHVyblxzKnJldDtccypcfWV2YWxcKFteO10rOy4uc2NyaXB0Pn4iO31zOjMwOiJ7d2hpbGUoYy0tKXJbZShjKV09a1tjXXx8ZShjKTsiO2E6Mjp7aTowO3M6MjA6ImJhY2tkb29yLmpzX2V2YWwuMDEyIjtpOjE7czoxNzU6In48XCEtLVx3Ky0tPjxzY3JpcHRccyp0eXBlPS50ZXh0Llx3Ky4+ZXZhbFwoZnVuY3Rpb25cKFteXH1dK1x9W15cfV0rXH1cXTtlPVteXC5dK1wucmVwbGFjZVwobmV3W14nXSsnLi5iJ1wrZS5jLltePF0rPDZccypwPSJxOnM7dTp2IltePl0rPjwuNj4uLi5cfS4uLjtbXlx7XStce1x9XClcKTwuc2NyaXB0Pn4iO31zOjE2OiJaWFpoYkNBOUlHWmhiSE5sIjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5qc19tYWx3YXJlLjAwNyI7aToxO3M6MTIwOiJ+PHNjcmlwW14+XSs+XHMqdmFyXHMqKFx3Kylccyo9XHMqYXRvYlwoWyciXC1cL3ZhclxzKlx3K1xzKj1ccyphdG9iXChcdytcKVxzKjtdKztccypldmFsXChcMVwrW15cKV0rXClccyo7XHMqPFwvc2NyaXB0Pn4iO31zOjE5OiJ2YXJ8dTAwMjZ1fHJlZmVycmVyIjthOjI6e2k6MDtzOjIwOiJpbmplY3RlZC5qc19ldmFsLjAwNSI7aToxO3M6MTM1OiJ+PHNjcmlwW14+XSo+W15cKFx7aWVdKmV2YWxcKGZ1bmN0aW9uXChwLGEsYyxrLmUuZFwpXHMqe2U9ZnVuY3Rpb25bXjxdKzxhIGdbXlx8fV0rZG9jdW1lbnRcfFx8W148XSt2YXJcfHUwMDI2dVx8cmVmZXJyZXJbXjxdKzwuc2NyaXB0Pn4iO31zOjM1OiJkKGUuZihnLmgoNiwxLDAsNywzLDQsOCxpLGosOSxrLGEsYSI7YToyOntpOjA7czoyMDoiaW5qZWN0ZWQuanNfZXZhbC4wMDEiO2k6MTtzOjE5MzoifjxzY3JpcHRccyp0eXBlPS50ZXh0LmphdmFzY3JpcHQuPlxzKmV2YWxcKGZ1bmN0aW9uXChwLGEsYyxrLGUsclwpXHMqXHsoXHcrKT1mdW5jdGlvblwoKFx3KylcKVx7cmV0dXJuXHMqKFwyKVteO10rO2lmXChcIVteXHxdK1x8XHwoXDEpXCgoXDIpXClbXlx8XStcfFxkK1x8XGQrXHxcZCtcfFteXHtdK1x7XH1cKVwpXHMqPC5zY3JpcHQ+fiI7fXM6MTA6InxDb2luSGl2ZXwiO2E6Mjp7aTowO3M6MjM6Im1hbHdhcmUuY3J5cHRvbWluZXIuMDAzIjtpOjE7czozMjk6In48c2NyaXB0XHMqdHlwZT0udGV4dC5qYXZhc2NyaXB0Lj4uLlxzKjwhLkNEQVRBXFtccypldmFsXChmdW5jdGlvblteO10rO2lmXCghLi5cLnJlcGxhY2VbXlx7XStce3doaWxlXChjLS1cKVxzKlx7XHdcW1x3XC50b1N0cmluZ1teXHxdK1x8XHxcd1wudG9TdHJpbmdbXlx8XStcfFx8XHdcfVx3PVxbXGRcKFteXHxdK1x8XHdcfFx3XHxcd1x8XHdcfFx3XHxcd1x8XHdbXlx7XStce1x9XClcKS4sXGQrLFxkKywuXHx7NCx9ZnVuY3Rpb25cfHs0LH1yZXR1cm5cfFx8bmV3XHx3aGlsZVteX10rX1x3K1x8Q29pbkhpdmVbXlx7XStce1x9XClcKVxzKi4uXHMqXF1cXT48LnNjcmlwdD5+Ijt9czoyNToifHBheXBhbF9kaXJlY3RfY2NfbnVtYmVyfCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNTQiO2k6MTtzOjE0MjoifjxzY3JpcHRbXj5dKz4oLi5ccyo8IS5DREFUQVxbKT9ccypldmFsLmZ1bmN0aW9uXChwLGEsYyxrLGVbXlxuXHJdK1x8cGF5cGFsX2RpcmVjdF9jY19udW1iZXJcfFtePlwpXStcfC5cKVssXClce1x9MF0rXHMqKFwvXC9cXVxdPik/PC5zY3JpcHQ+fiI7fXM6NjM6InxzY3JpcHR8ZG9jdW1lbnR8anN8aHR0cHN8c3JjfGNyZWF0ZUVsZW1lbnR8dmFyfHRyeXNvbWV0aGluZ25ldyI7YToyOntpOjA7czoyMDoiaW5qZWN0ZWQuanNfZXZhbC4wMDQiO2k6MTtzOjI1NToifjxzY3JpcHRccyp0eXBlPS50ZXh0LmphdmFzY3JpcHQuPmV2YWxcKFteO10rO2lmXCghLi4ucmVwbGFjZVteXHtdK3t3aGlsZVwoKFx3KS0tW15cW10rXFtcMS50b1N0cmluZ1teXFtdK1xbXDFcXVx8XHxcMS50b1N0cmluZ1teXHtdK3tyZXR1cm5ccypcd1teXCtdK1wrLlx9O1wxPVxkXH1bXlx8XStcfHNjcmlwdFx8ZG9jdW1lbnRcfGpzXHxodHRwc1x8c3JjXHxcdytcfFx3K1x8dHJ5c29tZXRoaW5nbmV3W15ce10rXHtcfVwpXCk8LnNjcmlwdD5+Ijt9czoyMjoiMTE4LDk3LDExNCwzMiw5OSwzMiw2MSI7YToyOntpOjA7czoyMDoiaW5qZWN0ZWQuanNfZXZhbC4wMDkiO2k6MTtzOjczOiJ+PHNjcmlwdFtcc10qdHlwZT0uP3RleHQuamF2YXNjcmlwdC4/W14+XSs+ZXZhbFwoW1xkXSssW147XStcKTs8LnNjcmlwdD5+Ijt9czozNjoiZDJsdVpHOTNMbTl1ZFc1c2IyRmtQV1oxYm1OMGFXOXVLQ2w3IjthOjI6e2k6MDtzOjIwOiJpbmplY3RlZC5qc19ldmFsLjAxMCI7aToxO3M6Njc6In5ldmFsXChhdG9iXCguW147XStkMmx1Wkc5M0xtOXVkVzVzYjJGa1BXWjFibU4wYVc5dUtDbDdbXlwpXStcKVwpO34iO31zOjQ0OiJvbmZvY3VzPWphdmFzY3JpcHQ6ZXZhbChTdHJpbmcuZnJvbUNoYXJDb2RlKCI7YToyOntpOjA7czoyMDoiaW5qZWN0ZWQuanNfZXZhbC4wMTIiO2k6MTtzOjYwOiJ+amF2YXNjcmlwdDpldmFsXChTdHJpbmcuZnJvbUNoYXJDb2RlXCgoXGQrLCl7MSwyNTB9XGQrXClcKX4iO319czoxMzoiY3JlYXRlRWxlbWVudCI7YToxMzp7aTowO2k6MTA7czoxNToiLmNyZWF0ZUVsZW1lbnQoIjthOjExOntpOjA7aToxMDtzOjU6ImF0b2IoIjthOjg6e2k6MDtpOjEwO3M6NToiYUhSMGMiO2E6OTp7aTowO2k6MTA7czoxOToid2luZG93LmF0b2IoImFIUjBjSCI7YTozOntpOjA7aToxMDtzOjMwOiIod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiO2E6Mjp7aTowO2k6MTA7czoxMzoiLmFwcGVuZENoaWxkKCI7YToyOntpOjA7czoyNjoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNTkuMDIiO2k6MTtzOjIyNjoifmlmW1xzXSpcKHdpbmRvd1wubG9jYXRpb25cLmhyZWZcLmluZGV4T2ZcKFteXHtdKz5bXHNdKi0/W1xkXStcKVtcc10qXHtbXHNdKnZhciBbXHddK1tcc10qPVtcc10qZG9jdW1lbnRcLmNyZWF0ZUVsZW1lbnRcKFteO10rXCk7W1xzXSpbXHddK1wuc3JjW1xzXSo9W1xzXSp3aW5kb3dcLmF0b2JcKC5hSFJbXjtdKztbXHNdKmRvY3VtZW50W147XSthcHBlbmRDaGlsZFwoW1x3XStcKTtbXHNdKlx9fiI7fX1zOjIxOiJbMF0uYXBwZW5kQ2hpbGQoaW1nKTsiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDU5IjtpOjE7czoxODY6In52YXIgaW1nW1xzXSo9W1xzXSpkb2N1bWVudFwuY3JlYXRlRWxlbWVudFwoW147XStcKTtbXHNdKmltZ1wuc3JjW1xzXSo9W1xzXSp3aW5kb3dcLmF0b2JcKC5hSFIwY0hNNlteXCldK1wpW15cfT5dKmRvY3VtZW50XC5nZXRFbGVtZW50c0J5VGFnTmFtZVwoLmhlYWQuXClcWzBcXVwuYXBwZW5kQ2hpbGRcKGltZ1wpWztcc10qfiI7fX1zOjE0OiJvbmVwYWdlJywnYUhSMCI7YToyOntpOjA7aToxMDtzOjYwOiJzcmM9YXRvYihtKTtzLmJvZHkuYXBwZW5kQ2hpbGQobil9fSkod2luZG93LGRvY3VtZW50LCdzY3JpcHQiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDg4IjtpOjE7czoxMTI6In5cKGZ1bmN0aW9uXCguLC4sLiwuLC4sLixbXlx9XStcfVx9XClbXHNdKlwod2luZG93LFtcc10qZG9jdW1lbnQsW1xzXSouc2NyaXB0LixbXjtdK29uZXBhZ2UuLFtcc10qLmFIUjBbXjtdK1wpO34iO319czoxNToiIWZ1bmN0aW9uKCl7dmFyIjthOjI6e2k6MDtpOjEwO3M6MjU6Ii5wYXJlbnROb2RlLmluc2VydEJlZm9yZSgiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDkwIjtpOjE7czo3MzoifiFmdW5jdGlvblwoXClce3ZhciBbXHddKz1hdG9iXCguYUhSMFteXH1dK2luc2VydEJlZm9yZVwoW15cKV0rXClcfVwoXCk7fiI7fX1zOjQ0OiImJiF3aW5kb3cuZGV2dG9vbHMub3BlbiYmInVuZGVmaW5lZCI9PXR5cGVvZiI7YToyOntpOjA7aToxMDtzOjM2OiIsc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtpZighd2luZG93LiQiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDkxIjtpOjE7czo3NjoiflwoZnVuY3Rpb25cKFwpXHsudXNlIHN0cmljdC47W15cW10rYXRvYlwoLmFIUjBjW15cfV0rW1xzXH1dKixbXHNdKltcZF0rXCk7fiI7fX1zOjI1OiJ2YXIgYXBpX2tleSA9IGF0b2IoImFIUjBjIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5qc19hcHBlbmRDaGlsZC4wMDIiO2k6MTtzOjUwOiJ+dmFyIGFwaV9rZXkgPSBhdG9iXCguYUhSW148XSthcHBlbmRDaGlsZFwoYXBpXCk7fiI7fXM6MzE6Im5pZiggbG9jYXRpb24uaHJlZi5zZWFyY2goYXRvYigiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTY3IjtpOjE7czoxMzQ6In48c2NyaXB0W14+XSo/Pi5yLm5pZlwoIGxvY2F0aW9uLmhyZWYuc2VhcmNoLmF0b2JcKFtePl0rXC5zcmNccyo9XHMqYXRvYlwoW15cKV0rXCk7XHMqZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZFwoXHcrXCk7fS5yLm48LnNjcmlwdD5+Ijt9czozMToicHVzaCgidXJsJSIrbG9jYXRpb24uaG9zdG5hbWUpLCI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuanNfYXBwZW5kQ2hpbGQuMDE0IjtpOjE7czozNjI6In5mdW5jdGlvbltcc10qW1x3XStcKFwpW1xzXSpce1tcc10qQXJyYXlcLmZyb21cKGRvY3VtZW50XC5nZXRFbGVtZW50c0J5VGFnTmFtZVwoLmlucHV0LlwpXClcLmZvckVhY2hcKGZ1bmN0aW9uLi4uLlwpXHtudWxsW15ce10rXHtbXHNdKm51bGw9PS5cLmdldEF0dHJpYnV0ZVwoLm9uY2hhbmdlLltefF0rem9uZVx8cmVnaW9uXHxzdGF0ZVteOl0rOlteXH1dK1x9K1tcc10qZnVuY3Rpb25bXHNdKltcd10rXCguXClbXlx9XStcKVx9W1xzXSpbXlx9XStcfVwpLEFycmF5XC5mcm9tXChkb2N1bWVudFteXH1dK1x9XCksW1xzXSpBcnJheVwuZnJvbVwoZG9jdW1lbnRbXlx9XStcfVwpLFtcc10qW1x3XStcKC5cKVx9W15cfV0rXH07W1xzXSp+Ijt9czozMzoiKXtyZXR1cm4gYnRvYShlbmNvZGVVUklDb21wb25lbnQoIjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5qc19hcHBlbmRDaGlsZC4wMTQuMDIiO2k6MTtzOjE0OToifmZ1bmN0aW9uW1xzXSpbXHddK1woLlwpW1xzXSpce1tcc10qcmV0dXJuW1xzXSpidG9hXChlbmNvZGVVUklDb21wb25lbnRbXixdKyxmdW5jdGlvblteXHtdK1x7cmV0dXJuIFN0cmluZ1wuZnJvbUNoYXJDb2RlXChwYXJzZUludFteXH1dK1tcfVwpXStbXHNdKn4iO319czo1NToidmFyIHM9dGhpcy5yZWFkeVN0YXRlO3MmJnMhPT0ibG9hZGVkIiYmcyE9PSJjb21wbGV0ZSJ8fCI7YToyOntpOjA7aToxMDtzOjM0OiIpfSkod2luZG93LGRvY3VtZW50LCJzY3JpcHQiLGF0b2IoIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjE1NSI7aToxO3M6MTY4OiJ+XChmdW5jdGlvblwoLixbXHNdKi4sW1xzXSouLFtcc10qLixbXHNdKlteXCldK1wpW1xzXSpce1tcc10qdmFyW14hXSshPT0ubG9hZGVkLiYmcyE9PS5jb21wbGV0ZS5bXlx9XStcfSxbXjtdK3dpbmRvdyxbXHNdKmRvY3VtZW50LFtcc10qLnNjcmlwdC4sW1xzXSphdG9iW147XStcKTtbXHNdKn4iO319czoyMDoiKGZ1bmN0aW9uKHcsZCx0LHIsdSkiO2E6Mjp7aTowO2k6MTA7czo1MDoiaW5zZXJ0QmVmb3JlKG4saSl9KSh3aW5kb3csZG9jdW1lbnQsInNjcmlwdCIsYXRvYigiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTYyIjtpOjE7czoxMjI6In48c2NyaXB0W14+XSo+KFwvXC9ccyo8IVxbQ0RBVEFcWyk/XHMqXChmdW5jdGlvblwodyxkLHQscix1XClce3ZhciBbXjxdK1wpXCh3aW5kb3csZG9jdW1lbnQsLnNjcmlwdC4sYXRvYlwoW148XSs8LnNjcmlwdD5+Ijt9fXM6Mjk6In5hdG9iXChbR2ddb29nbGVfW1R0XW9rZW5cKTt+IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjEyNCI7aToxO3M6MjQyOiJ+dmFyIEdUTVtcc10qPVtcc10qZG9jdW1lbnRcLmNyZWF0ZUVsZW1lbnQuLnNjcmlwdC4uLFtcc10qLm9vZ2xlXy5va2VuW1xzXSo9W1xzXSpbJyJdW147XSs7W1xzXSpHVE1cLmFzeW5jW147XSs7W1xzXSpHVE1cLnNyY1tcc10qPVtcc10qYXRvYlwoLm9vZ2xlXy5va2VuXCk7W147XSpcLmdldEVsZW1lbnRzQnlUYWdOYW1lW147XSs7KD86W1xzXSpzLnBhcmVudE5vZGVcLmluc2VydEJlZm9yZVwoR1RNLFteXCldK1wpOyk/fiI7fXM6NjQ6Ij09ZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2w/Imh0dHBzOi8vIjoiaHR0cDovLyIpK3dpbmRvdy5hdG9iKCIiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDcyIjtpOjE7czoyMDk6In5cIWZ1bmN0aW9uXChcKVx7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudC4ic2NyaXB0Ii47W15cc10rPT1kb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbFw/Imh0dHBzOlwvXC8iOiJodHRwOlwvXC8iXClcK3dpbmRvdy5hdG9iXCgiW1x3XCs9XSsiXCksXChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZVteXHNdKzBdLi5hcHBlbmRDaGlsZC50Llx9XChcKTt+Ijt9czo0OToib25jbGljaycsYXRvYihzLnNwbGl0KHMuc3BsaXQoJycpWzBdKS5qb2luKCcnKSkpOyI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xNTciO2k6MTtzOjE4ODoifjxzY3JpcHRbXjxdKj5mdW5jdGlvbiBbXiBdKyBlPWRvY3VtZW50W148XStcLnNldEF0dHJpYnV0ZVwoLm9uY2xpY2suLGF0b2Iucy5zcGxpdC5zLnNwbGl0Li4uLlxbMFxdLi5qb2luLi4uXClcKVwpO2UuY2xpY2suLjtcfTwuc2NyaXB0PlxzKjxzY3JpcHRbXjxdKj5cdytcKFsnIl1bXlwpXXs1MDAsfVsnIl1cKTwuc2NyaXB0Pn4iO31zOjMzOiJoICYmIGguaW5jbHVkZXMoYXRvYihvLl9oai5pZGhqKSkiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTYzIjtpOjE7czoxNzY6In48c2NyaXB0XHMqPlxzKndpbmRvd1wuYWRkRXZlbnRMaXN0ZW5lclwoLmxvYWQuLCBmdW5jdGlvblxXK2Z1bmN0aW9uIFwoaCwgbywgdCwgaiwgYSwgclwpW148LV0rXC5zcmMgPSBcdytcLnN1YnN0clwoW147XSthdG9iXChcdy5faGpbXjxdK2hvdGphci5jb21cL2NcL1tePH1dK31cKTtccyo8LnNjcmlwdD5+Ijt9fXM6MzM6Ii5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdOyI7YToyOntpOjA7aToxMDtzOjEwOiJ9KSh3aW5kb3csIjthOjI6e2k6MDtpOjEwO3M6ODoieC5vbmxvYWQiO2E6Mjp7aTowO2k6MTA7czo1OiJ0Y2lkOiI7YToyOntpOjA7aToxMDtzOjg1OiJ+XChbXHNdKmZ1bmN0aW9uW1xzXSpcKFtcc10qcFtcc10qLFtcc10qdVtcc10qLFtcc10qc1tcc10qLFtcc10qaFtcc10qLFtcc10qeFtcc10qXCl+IjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5qc191bndhbnRlZF9hZHMuMDE3IjtpOjE7czoyNjQ6In5cKFtcc10qZnVuY3Rpb25bXHNdKlwoW1xzXSpwW1xzXSosW1xzXSp1W1xzXSosW1xzXSpzW1xzXSosW1xzXSpoW1xzXSosW1xzXSp4W1xzXSpcKVtcc10qXHtbXHNdKmhbXHNdKj1bXHNdKnVcLmdldEVsZW1lbnRzQnlUYWdOYW1lXCguaGVhZC5cKVxbMFxdO1tcc10qeFteXH1dK3RjaWQ6W1xzXSpbXGRdK1teXH1dK1x9W148XSthcHBlbmRDaGlsZFwoeFwpO1tcc10qXH1bXHNdKlwpW1xzXSpcKFtcc10qd2luZG93LFtcc10qZG9jdW1lbnRbXjtdK1wpO1tcc10qfiI7fX19fX1zOjE1OiJ2YXIgZD1kb2N1bWVudDsiO2E6Mjp7aTowO2k6MTA7czoxNjoiLmFwcGVuZENoaWxkKHMpOyI7YToyOntpOjA7aToxMDtzOjExMDoifnZhciBkPWRvY3VtZW50O1tcc10qdmFyIFtcc10qcz1bXHNdKmRcLmNyZWF0ZUVsZW1lbnRcKC5zY3JpcHQuXCk7W1xzXSouXC5zcmNbXjxdK1wuYXBwZW5kQ2hpbGRcKHNcKTtbXHNdKlx9P34iO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLmpzX2FwcGVuZENoaWxkLjAwNSI7aToxO3M6MTEwOiJ+dmFyIGQ9ZG9jdW1lbnQ7W1xzXSp2YXIgW1xzXSpzPVtcc10qZFwuY3JlYXRlRWxlbWVudFwoLnNjcmlwdC5cKTtbXHNdKi5cLnNyY1tePF0rXC5hcHBlbmRDaGlsZFwoc1wpO1tcc10qXH0/fiI7fX19czoyMzoiLnJlcGxhY2UoL1swLTlBLVpdL2csIiIiO2E6Mjp7aTowO2k6MTA7czoyODoiaWYoLTEhPWxvY2F0aW9uLmhyZWYuc2VhcmNoKCI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuanNfYXBwZW5kQ2hpbGQuMDAzIjtpOjE7czo5MjoifmlmXCgtMSE9bG9jYXRpb24uaHJlZi5zZWFyY2hcKFteXC5dK1wucmVwbGFjZVwoLlxbMC05QS1aW15cfV0rYXBwZW5kQ2hpbGRcKFteXCldK1wpW1xzXSpcfX4iO319czoyMToifSkoZG9jdW1lbnQsIFwnc2NyaXB0IjthOjI6e2k6MDtpOjEwO3M6MzE6IiZ2PVwnICsgKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsiO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLmpzX2NyZWF0ZV9lbGVtZW50LjAxMSI7aToxO3M6MTU5OiJ+XChmdW5jdGlvbltcc10qXChbXHddKyxbXHNdKltcd10rLFtcc10qW1x3XStcKVtcc10qXHtbXHNdKnZhcltcc10qW1x3XStbXHNdKj1bXHNdKltcd10rXC5jcmVhdGVFbGVtZW50XChbXHddK1wpLFteXH1dK1x9XClcKGRvY3VtZW50LFtcc10qLi5zY3JpcHQuLixbXjtdK1wpO34iO319czoxMDoic2V0VGltZW91dCI7YTozOntpOjA7aToxMDtzOjYxOiJzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHBvLHMpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgZWxfIjthOjI6e2k6MDtpOjEwO3M6MTE6Iik7fX19KX0pKCk7IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjE0MyI7aToxO3M6MjQzOiJ+PHNwYW4gKD86aWR8Y2xhc3MpPSIoXHcrLVtcdy1dKykiW14+XSo+XHMqPHNjcmlwdFtePl0qPlxzKlwoZnVuY3Rpb25cKFwpXHt2YXIgcG89W148XStzZXRUaW1lb3V0XChmdW5jdGlvblwoXCl7dmFyIGVsXz1kb2N1bWVudC5nZXRFbGVtZW50KEJ5SWR8c0J5Q2xhc3NOYW1lKVwoIlwxIlwpO2lmXChlbF9bXjxdKyh0cmltXChcKVwpfFwoZWxfW15cKV0qXCkpO1x9XH1cfVwpXH1cKVwoXCk7PC5zY3JpcHQ+XHMqPC5zcGFuPn4iO319czo0NToiL2dhdGUucGhwP2NhcmRfbnVtPSIrZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjE1MSI7aToxO3M6MjI4OiJ+PHNjcmlwdFtePl0qPlxzKmZ1bmN0aW9uIFtcd10rXChcKVx7W1xzXSpkb2N1bWVudFwuZ2V0RWxlbWVudEJ5SWRcKFteXCldK1wpXC5zcmM9Imh0dFteIl0rXC9nYXRlXC5waHBcP2NhcmRfbnVtPSJcK1teXH1dK1x9W1xzXSpmdW5jdGlvbltePFx9XStcfVtcc10qd2luZG93XC5vbmxvYWRbXlx9XStcfVtcc10qd2luZG93XC5vbnVubG9hZFtePFx9XStcKFwpO1tcc10qXH1bXHNdKjwuc2NyaXB0Pn4iO319czo4ODoiaWYocy5zdHlsZVNoZWV0KSBzLnN0eWxlU2hlZXQuY3NzVGV4dD1jOyBlbHNlIHMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYykpOyI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wMzgiO2k6MTtzOjE0NzoifmZ1bmN0aW9uIFtcd10rXChcKVtcc10qXHtbXHNdKnZhciBbXHddK1tePF0rc3R5bGVTaGVldFwpIHNcLnN0eWxlU2hlZXQuY3NzVGV4dD1jOyBlbHNlIHNcLmFwcGVuZENoaWxkXChkb2N1bWVudFwuY3JlYXRlVGV4dE5vZGVcKGNcKVwpO1tePF0rXChcKTt+Ijt9czo4Njoic2V0QXR0cmlidXRlKCdkYXRhLXpvbmUnLHopLHAuYXBwZW5kQ2hpbGQocyk7fSkoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0JyksJ2h0dHAiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLmpzX2FwcGVuZENoaWxkLjAwOCI7aToxO3M6MTcwOiJ+PHNjcmlwdD5bXHNdKlwoZnVuY3Rpb25cKC4sLiwuLFteXCldKlwpXHsuXC5zcmM9LiwuXC5zZXRBdHRyaWJ1dGVcKC5kYXRhLXpvbmUuLC5cKSwuXC5hcHBlbmRDaGlsZFtePF0rZG9jdW1lbnRFbGVtZW50XClbXHNdKjwuc2NyaXB0Pltcc10qKDxzY3JpcHRbXjxdKz48LnNjcmlwdD5bXHNdKikqfiI7fXM6Mjg6IisnanF1ZXJ5JytrWzRdKydhcGknK2suc2xpY2UiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTQwIjtpOjE7czoxMzA6In52YXJccypcdys9XHcrXC5zcmM7XHcrPVx3K1wuc2xpY2UuXGQrLFxzKlxkK1wpXCsuXHcrLlwrXHcrLlxkKy5cKy5cdysuXCtcdytcLnNsaWNlXChcZCssXGQrXClcK1x3Ky5cZCtcXVwrXHcrXC5zbGljZVwoXGQrLFxkK1wpO34iO31zOjEzOiIuYXBwZW5kQ2hpbGQoIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5qc19hcHBlbmRDaGlsZC4wMDEiO2k6MTtpOjExO319czo1MzoiZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXS5hcHBlbmRDaGlsZCgiO2E6Mjp7aTowO2k6MTA7czo0MjoidmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7IjthOjI6e2k6MDtpOjEwO3M6MjY6ImVsLnNyYyA9ICdceDY4XHg3NFx4NzRceDcwIjthOjI6e2k6MDtzOjI2OiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA1MS4wMiI7aToxO3M6MTU1OiJ+c2V0VGltZW91dFwoZnVuY3Rpb25cKFwpW1xzXSpce1tcc10qdmFyIGVsW1xzXSo9W1xzXSpkb2N1bWVudFwuY3JlYXRlRWxlbWVudFwoLnNjcmlwdC5cKTtbXHNdKmVsXC5zcmMgPSAuLng2OFtefV0rYXBwZW5kQ2hpbGRcKGVsXCk7W1xzXSpcfSxbXHNdKltcZF0rXCk7fiI7fX19czo1MzoiPnZhciBwbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOyBwby50eXBlID0iO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDQyIjtpOjE7czozMTc6In48c2NyaXB0IHR5cGU9LnRleHQuamF2YXNjcmlwdC4+dmFyIHBvID0gZG9jdW1lbnRcLmNyZWF0ZUVsZW1lbnRcKC5zY3JpcHQuXCk7W1xzXSpwby50eXBlW1xzXSo9W1xzXSoudGV4dC5qYXZhc2NyaXB0LjtbXHNdKnBvXC5hc3luY1tcc10qPVtcc10qdHJ1ZTtbXHNdKnBvXC5zcmNbXHNdKj1bXHNdKi5cL1wvW147XStcL1teO10rO1tcc10qdmFyIHNbXHNdKj1bXHNdKmRvY3VtZW50XC5nZXRFbGVtZW50c0J5VGFnTmFtZS4uc2NyaXB0Li5cWzBcXTtbXHNdKnNcLnBhcmVudE5vZGVcLmluc2VydEJlZm9yZVwocG8sW1xzXSpzXCk7W1xzXSo8LnNjcmlwdD5+Ijt9czoyNzoib2NsYXNydi5jb20vYXB1LnBocD96b25laWQ9IjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5qc19tYWx3YXJlLjAwMyI7aToxO3M6NTcyOiJ+KDxzY3JpcHRccyp0eXBlPS50ZXh0LmphdmFzY3JpcHQuXHMqc3JjPS4uLmdvXC5bXlw/XStcP3pvbmVpZD1cdysuPjwuc2NyaXB0Pik/KDxzY3JpcHRccyp0eXBlPS50ZXh0LmphdmFzY3JpcHQuPi4uPFwhXFtDREFUQVxbXHMqXChmdW5jdGlvblwoXClccypce1xzKnZhclxzKmNvbmZpZ3VyYXRpb25ccyo9XHMqXHtccyoudG9rZW4uOlxzKi5cdysuLFxzKi5leGl0U2NyaXB0Ljpccypce1teXH1dK1x9LFxzKi5wb3BVbmRlci46XHMqXHtccyouZW5hYmxlZC46XHMqdHJ1ZVxzKlx9XHMqfS5ccyp2YXJccypzY3JpcHRccyo9XHMqZG9jdW1lbnQuY3JlYXRlRWxlbWVudFwoLnNjcmlwdC5cKTtccypbXlx7XStce3ZhclteO10rO1xzKmlmXHMqXChyc1teXH1dK1x9O1xzKnZhclxzKmVudHJ5W15cW10rXFtcZFxdO1xzKlteO10rO1xzKlx9XClcKFwpO1xzKi4uXF1cXT48LnNjcmlwdD4pPyg8c2NyaXB0XHMqZGF0YS1jZmFzeW5jPS5mYWxzZS5ccyp0eXBlPS50ZXh0LmphdmFzY3JpcHQuXHMqc3JjPS4uLlx3Ky5jbGtzaXRlW15cL10rXC9hZFNlcnZlLmJhbm5lcnNcP3RpZD1bXiciXSsuPjwuc2NyaXB0Pik/fiI7fXM6NDI6InZhciBwbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOyI7YToyOntpOjA7czozMDoiaW5qZWN0ZWQuanNfY3JlYXRlX2VsZW1lbnQuMDA0IjtpOjE7czoxOTg6In48c2NyaXB0W14+XSs+dmFyXHMqKHBvKVxzKj1ccypkb2N1bWVudFwuY3JlYXRlRWxlbWVudFwoLnNjcmlwdC5cKTtccypcMVwudHlwZVteJ10rJ3RleHQuamF2YXNjcmlwdC47XHMqXDFcLmFzeW5jW14nXSsnLi5nb29naWVjbG91ZFteO10rO1xzKnZhclxzKlteJ10rJ3NjcmlwdCdcKVxbXGRcXTtbXlwoXStcKFwxXCxccypzXCk7PC5zY3JpcHQ+fiI7fXM6Nzc6ImRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpO2Eud2lkdGg9IjFweCIsYS5oZWlnaHQ9IjFweCIsYS5pZD10LGEuc3JjPWF0b2IoIjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5tYWdlbnRvX3Nob3BsaWZ0LjAwNCI7aToxO3M6NTAzOiJ+PHNjcmlwdD5ccypmdW5jdGlvblxzKlx3K1woXHdcKVxzKlx7XHMqcmV0dXJuXHMqYnRvYVwoXHMqZW5jb2RlVVJJQ29tcG9uZW50XChcdytcKVxzKlwucmVwbGFjZVxzKlwoLlwlXChcW1teXDJdKz1kb2N1bWVudFwuY3JlYXRlRWxlbWVudFwoLlx3Ky5cKTtccypcd1wud2lkdGhccyo9XHMqLlxkXHMqcHguXHMqLFxzKlx3LmhlaWdodFxzKj1ccyouXGRccypweC5ccyosXHMqXHcuaWRccyo9XHMqXHdccyosXHMqXHdcLnNyY1xzKj1ccyphdG9iXChbXn1dK31ccypmdW5jdGlvblxzKihcdytcKFwpKVxzKntccyp2YXJccypcdytccyo9XHMqXFtcXVxzKjtccypcd1wucHVzaFwoLnVybFwlLlwrbG9jYXRpb25cLmhvc3RuYW1lXClbXn1dK31ccypcKVxzKixccypBcnJheVwuZnJvbVwoZG9jdW1lbnRcLmdldEVsZW1lbnRzQnlUYWdOYW1lW15cMl0rLHNldEludGVydmFsXCguXDEuXHMqLFxzKlx3K1wpXHMqLFxzKnNldEludGVydmFsXCguXHcrXChcKS4sXGQrXClccypcKVxzKn1ccyo7fiI7fXM6OTQ6ImN1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlbC5pbm5lckhUTUw9IiYjODI7JiMxMDE7JiMxMDI7JiMxMDE7JiMxMTQ7JiMxMDE7JiMxMTA7JiM5OTsmIzEwMTsiO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLmpzX2NyZWF0ZV9lbGVtZW50LjAwMSI7aToxO3M6OTI6In48c2NyaXB0PmVsPWRvLio/Y3VtZW50LmNyZWF0ZUVsZW1lbnQuLmRpdi4uO2VsLmlubmVySFRNTD0iJiM4MjsmIzEwMTsuKz9lXChzXCk7PFwvc2NyaXB0Pn5zIjt9czo4OiJtYWluMS5qcyI7YToyOntpOjA7czozMDoiaW5qZWN0ZWQuanNfY3JlYXRlX2VsZW1lbnQuMDAyIjtpOjE7czoxNDY6In48c2NyaXB0PltePl0rZ2NzZVxzKj1ccypkb2N1bWVudC5jcmVhdGVFbGVtZW50Li5zY3JpcHQuLjtccypnY3NlLnR5cGVbXj5dK2djc2Uuc3JjXHMqXD1ccyouaHR0cFteO10rbWFpbjEuanNbXj5dK2luc2VydEJlZm9yZS5nY3NlW148XSs8LnNjcmlwdD5+Ijt9czoyODoic2VjdXJlLWNvbnRlbnQtZGVsaXZlcnkuY29tLyI7YToyOntpOjA7czozMDoiaW5qZWN0ZWQuanNfY3JlYXRlX2VsZW1lbnQuMDAzIjtpOjE7czozMTY6In48c2NyaXB0XHNbXjw+XSo/c3JjXHMqPVxzKlsiJ10/W148PiInXSo/XC9cL3NlY3VyZS1jb250ZW50LWRlbGl2ZXJ5LmNvbVwvW148Pl0rPz5bXjw+XSo/PC9zY3JpcHQ+XHMqPHNjcmlwdFtefV0rfVxzKjtccypcKGZ1bmN0aW9uXChcKVxzKntccyp2YXJccypcdytccyo9XHMqZG9jdW1lbnRcLmNyZWF0ZUVsZW1lbnRbXj5dKz48LnNjcmlwdD48c2NyaXB0XHMqaWRccyo9W146XSs6XC9cL2lcLnNpbXBsaVwuZmlcL1tePl0rPjxcL3NjcmlwdD5ccyo8c2NyaXB0W146XSs6XC9cL2lcLnNlbGVjdGlvbmxpbmtzanNcLmluZm9cL1tePF0rPFwvc2NyaXB0Pn4iO31zOjExOToiZG9jdW1lbnQuY3JlYXRlRWxlbWVudChTdHJpbmcuZnJvbUNoYXJDb2RlKDExNSwgOTksIDExNCwgMTA1LCAxMTIsIDExNikpOyBzYy5zcmM9U3RyaW5nLmZyb21DaGFyQ29kZSgxMDQsIDExNiwgMTE2LCAxMTIiO2E6Mjp7aTowO3M6MzE6ImluamVjdGVkLmpzX2NyZWF0ZV9kb2N1bWVudC4wMjciO2k6MTtzOjM2NDoifjxzY3JpcFtePl0rPlxzKnZhclxzKlx3K1xzKj1ccypkb2N1bWVudFwuY3JlYXRlRWxlbWVudFwoU3RyaW5nXC5mcm9tQ2hhckNvZGVcKDExNSxccyo5OSxccyoxMTQsXHMqMTA1LFxzKjExMixccyoxMTZcKVwpO1xzKlx3K1wuc3JjXHMqPVxzKlN0cmluZ1wuZnJvbUNoYXJDb2RlXCgxMDQsXHMqMTE2LFxzKjExNixccyoxMTIsW147XSs7XHMqXHcrXC50eXBlXHMqPVxzKlN0cmluZ1wuZnJvbUNoYXJDb2RlXChbXjtdKztccypkb2N1bWVudFwuZ2V0RWxlbWVudHNCeVRhZ05hbWVcKFN0cmluZ1wuZnJvbUNoYXJDb2RlXCgxMDQsXHMqMTAxLFxzKjk3LFxzKjEwMFwpXClcW1xkK1xdXC5hcHBlbmRDaGlsZFwoXHcrXCk7XHMqPC5zY3JpcHQ+fiI7fXM6NDM6ImRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sKyIvL2RubjUwNnlyYmFncmciO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmpzX21hbHdhcmUuMDA0IjtpOjE7czo0MDg6In48c2NyaXBbXj5dKz5ccyooXC9cLyk/c2V0VGltZW91dFwoZnVuY3Rpb25cKFwpXHMqe1xzKnZhclxzKlx3XHMqPVxzKmRvY3VtZW50XC5jcmVhdGVFbGVtZW50XCguc2NyaXB0LlwpXHMqO1xzKlwxP3ZhclxzKlx3XHMqPVxzKmRvY3VtZW50XC5nZXRFbGVtZW50c0J5VGFnTmFtZVwoLnNjcmlwdC5cKVxzKlxbXGRcXVxzKjtccypcMT9cd1wuc3JjXHMqPVxzKmRvY3VtZW50XC5sb2NhdGlvblwucHJvdG9jb2xcK1teXCtdK1wrTWF0aFwuZmxvb3JcKG5ld1xzKkRhdGVcKFwpXC5nZXRUaW1lXChcKVteO10rO1xzKlwxP1x3XC5hc3luY1xzKj1ccyp0cnVlXHMqO1x3XC50eXBlXHMqPVxzKi50ZXh0XC9qYXZhc2NyaXB0LlxzKjtccypcd1wucGFyZW50Tm9kZVwuaW5zZXJ0QmVmb3JlXChbXjtdKztccyo8XC9zY3JpcHQ+fiI7fXM6MTU6InBhcGVycGxhbmVzbGl2ZSI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xMjciO2k6MTtzOjIzNjoiflwoZnVuY3Rpb25cKFwpXHt2YXJbXlwoXStkb2N1bWVudC5jcmVhdGVFbGVtZW50XCguc2NyaXB0LlwpO1teO10rO1tcd10rLmFzeW5jPXRydWU7W1xzXSpbXHddK1wuc3JjPVteO10rO3Zhcltcc10qW1x3XSs9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVcKC5zY3JpcHQuXClcW1tcZF0rXF07W1x3XSsucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmVcKFtcd10rLFtcd10rXCk7XH1cKVtcc10qXChcKTtbXHNdKn4iO319czo4OiJsb2NhdGlvbiI7YToxNTp7aTowO2k6MTA7czoyNDoid2luZG93LnRvcC5sb2NhdGlvbi5ocmVmIjthOjM6e2k6MDtpOjEwO3M6MTM6Ijt9c2V0VGltZW91dCgiO2E6Mjp7aTowO2k6MTA7czo4ODoifmZ1bmN0aW9uIFtcd10rXChcKVtcc10qXHtbXHNdKndpbmRvd1wudG9wXC5sb2NhdGlvblwuaHJlZj1bXjtdKztbXHNdKlx9W1xzXSpzZXRUaW1lb3V0fiI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDMxIjtpOjE7czoyNjc6In48ZGl2IGlkPS5bXHddKy4+W15cblx7XSo8c2NyaXB0PihTdHJpbmdcLnByb3RvdHlwZVwuW1x3XStbXHNdKj1bXHNdKmZ1bmN0aW9uXChcKVtcc10qXHtbXHNdKnJldHVybiB0aGlzXC5yZXBsYWNlW15cfV0rO1tcfVwpXHM7XStbXlx7XSspP2Z1bmN0aW9uIFtcd10rXChcKVtcc10qXHtbXHNdKndpbmRvd1wudG9wXC5sb2NhdGlvblwuaHJlZltcc10qPVteXH1dKztcfXNldFRpbWVvdXRcKFtcd10rLFtcc10qW1xkXStcKTtbXHNdKjwuc2NyaXB0Pltcc10qPC5kaXY+fiI7fX1zOjMyOiI8c2NyaXB0PndpbmRvdy50b3AubG9jYXRpb24uaHJlZiI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDMxLjAyIjtpOjE7czo3NzoifjxzY3JpcHQ+d2luZG93XC50b3BcLmxvY2F0aW9uXC5ocmVmW1xzXSo9W1xzXSpbJyJdW14nIl0rWyciXTtbXHNdKjwuc2NyaXB0Pn4iO319czoyNzoiaSl8fG5hdmlnYXRvclsndXNlckFnZW50J11bIjthOjI6e2k6MDtpOjEwO3M6MTI6IiE9PSd1bicpe2lmKCI7YToyOntpOjA7aToxMDtzOjE3OiJjb29raWUnLCdsb2NhdGlvbiI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuanNfbWFsd2FyZS4wMTIiO2k6MTtzOjEyOToifnZhciBbXHddK1tcc10qPVtcc10qW14oXStcXTtcKGZ1bmN0aW9uXChbXHddKyxbXHNdKltcd10rXClce1tcc10qdmFyW14+XSt3aW5kb3dcW1tcd10rXChbXlwpXStcKVxdXFtbXlx9XStbXH1dK1wodGhpc1wpXClbO1x9XSt+Ijt9fX1zOjY6IlJlZ0V4cCI7YTo0OntpOjA7aToxMDtzOjU5OiIudGVzdCh3aW5kb3cubG9jYXRpb24pKW5ldyBzZWxmWyJGdW5jdGlvbiJ8fCJPYmplY3QiXShhdG9iKCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xMTciO2k6MTtzOjExNToifnZhcltcc10qW1x3XSs7W1xzXSppZlwobmV3W1xzXSpSZWdFeHBcKFteXFtdK1wudGVzdFwod2luZG93XC5sb2NhdGlvblwpK25ld1tcc10qc2VsZlxbLkZ1bmN0aW9uW147XStjYWxsXCh0aGlzXCk7fiI7fXM6Njc6ImlmKG5ldyBSZWdFeHAoYXRvYignWTJobFkydHZkWFE9JykpLnRlc3Qod2luZG93LmxvY2F0aW9uKSluZXcgc2VsZlsiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTMyIjtpOjE7czoxNjM6In52YXJbXHNdKltcd10rO1tcc10qaWZcKG5ld1tcc10qUmVnRXhwXChhdG9iXCguWTJobFkyW15cKV0rXClcKVwudGVzdFwod2luZG93XC5sb2NhdGlvblwpXClbXHNdKm5ld1tcc10qc2VsZlxbLltcd10rLlx8XHxbXlwoXStcKGF0b2JcKC5bXlwpXStcKVwpXC5jYWxsXChbXHddK1wpO34iO31zOjMzOiJdO3ZhciBzb2M7aWYoIG5ldyBSZWdFeHAoYXRvYihfMHgiO2E6Mjp7aTowO3M6MjY6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTE3LjAyIjtpOjE7czoxMTM6In48c2NyaXB0W14+XSo+XHMqdmFyIF8weFx3K1xzKj1ccypcW1siJ11bXlxdXStcXTt2YXIgc29jO2lmXCggbmV3IFJlZ0V4cFwoYXRvYlwoXzB4W148XStcKHRoaXNcKVteXHc8XSs8LnNjcmlwdD5+Ijt9fXM6Mjc6Ii54eXovanMvc3RhdC5qcyI+PC9zY3JpcHQ+PCI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuanNfbG9jYXRpb25fcmVwbGFjZS4wMDEiO2k6MTtzOjE4MjoifjxzY3JpcHRccyp0eXBlPS50ZXh0LmphdmFzY3JpcHQuXHMqc3JjPS5baHRwc117NCx9OlteXC5dK1wueHl6LmpzLnN0YXRcLmpzLj48LnNjcmlwdD48c2NyaXB0XHMqdHlwZT0udGV4dC5qYXZhc2NyaXB0Lj5ccypsb2NhdGlvbi5yZXBsYWNlXCguW2h0cHNdezQsfTpbXlw/XStcP1teXCldK1wpO1xzKjwuc2NyaXB0Pn4iO31zOjExMDoibG9jYXRpb24uaHJlZi5pbmRleE9mKCd3cC1hZG1pbicpICE9IC0xIHx8IGxvY2F0aW9uLmhyZWYuaW5kZXhPZignd3AtbG9naW4nKSAhPSAtMSApIHsgcmV0dXJuIGZhbHNlOyB9IHdpbmRvdy4iO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLmpzX2NyZWF0ZV9lbGVtZW50LjAwNiI7aToxO3M6MzI0OiJ+PHNjcmlwdD5ccypcKGZ1bmN0aW9uXChcKVxzKntccyppZlxzKlwod2luZG93XC5cdytccypcfFx8XHMqbG9jYXRpb25cLmhyZWZcLmluZGV4T2ZcKC53cC1hZG1pbi5cKVxzKlwhPVxzKi0xXHMqXHxcfFxzKmxvY2F0aW9uXC5ocmVmXC5pbmRleE9mXCgud3AtbG9naW4uXClccypcIT1ccyotMVxzKlwpW147XSs7XHMqfVxzKndpbmRvd1wuW159XSt9XHMqfVxzKjtccyp4bWxIdHRwXC5vcGVuXCguR0VULixccypcdyssXHMqdHJ1ZVwpXHMqO1xzKnhtbEh0dHBcLnNlbmRcKFtee10re1xzKnZhclxzKlx3K1xzKj1ccypKU09OXC5wYXJzZVwoZGF0YVwpXHMqO1tePl0rPn4iO31zOjM2OiI8YnI+PHNjcmlwdD53aW5kb3cubG9jYXRpb24gPSAiaHR0cDoiO2E6Mjp7aTowO3M6MzM6ImluamVjdGVkLmpzX2RvY3VtZW50X2xvY2F0aW9uLjAwNSI7aToxO3M6NTY6In48YnI+PHNjcmlwdD53aW5kb3cubG9jYXRpb24gPSAiaHR0cDouLlteIl0rIjs8LnNjcmlwdD5+Ijt9czo0OToiOyBpZihwYXRybi5leGVjKHJVcmwpKXdpbmRvdy5sb2NhdGlvbi5ocmVmPXRvVXJsOyI7YToyOntpOjA7czozMzoiaW5qZWN0ZWQuanNfZG9jdW1lbnRfbG9jYXRpb24uMDA3IjtpOjE7czoxNTA6In48c2NyaXB0IHR5cGU9InRleHQuamF2YXNjcmlwdCI+Li4uPC4uQ0RBVEEuW1xzXSp2YXIgdG9Vcmw9Imh0dHA6W14+XSt2YXIgcGF0cm49W14+XStwYXRybi5leGVjLnJVcmwuLndpbmRvdy5sb2NhdGlvbi5ocmVmPXRvVXJsO1tcc10qLi4uLi4+PC5zY3JpcHQ+fiI7fXM6ODE6ImlmKCFqUXVlcnkoJyonKS5pcygnI2NjX2NpZCcpICYmIGpRdWVyeSgnI3BfbWV0aG9kX3NhZ2VwYXlzZXJ2ZXInKS5pcygnOmNoZWNrZWQnKSI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNDkiO2k6MTtzOjY5NToifjxzY3JpcHQ+XHMqdmFyXHMqXHcrXHMqPVxzKnRydWVccyo7XHMqdmFyXHMqXHcrXHMqPVxzKi48XHMqZGl2XHMqY2xhc3NccypbXlwyXStwYXltZW50OmNjX251bWJlclteXDJdK3BheW1lbnQ6Y2NfZXhwX21vbnRoLlxzKm5hbWU9LnBheW1lbnRcW2NjX2V4cF9tb250aFxdW15cMl0ralF1ZXJ5XChkb2N1bWVudFwpXC5yZWFkeVwoZnVuY3Rpb25cKFwpXHMqe1xzKmlmXChccypcIVxzKlwoZG9jdW1lbnRcLmNvb2tpZVwuaW5kZXhPZlwoLnVzZXJwYXlpZC5cKVtefV0rfVxzKjtccypkb2N1bWVudFwuY29va2llXHMqPVxzKi51c2VycGF5aWQ9W159XSt9XHMqalF1ZXJ5XChbXn1dK31ccypcKVxzKjtccypmdW5jdGlvblxzKlx3K1woXClccyp7XHMqdmFyXHMqXHcrXHMqPVxzKmF0b2JcKFteXCldK1wpXHMqO1xzKnZhclxzKlx3K1xzKj1ccyp7fVxzKjtccypqUXVlcnlcKC5pbnB1dC5cKVwuZWFjaFwoZnVuY3Rpb25cKFwpXHMqe1teXDJdK3tccyp1cmw6dXJsY2hlY2tccyosXHMqdHlwZTouUE9TVC5ccyosXHMqZGF0YTouZGF0YT0uXCtlbmNvZGVVUklDb21wb25lbnRcKEpTT05cLnN0cmluZ2lmeVwoZGF0YVwpXHMqXClccypcKy5ccypcJlxzKnRhcmdldFxzKj1ccyouXHMqXCtsb2NhdGlvblwuaG9zdFwrLiZ2YWxpZD0uXCtlbmNvZGVVUklDb21wb25lbnRcKGRvY3VtZW50XC5jb29raWVcKVtePF0rPFwvc2NyaXB0Pn4iO31zOjQ5OiJqYXZhc2NyaXB0Ij5sb2NhdGlvbi5yZXBsYWNlKCJodHRwOi8vZ2V0aGVyZS5pbmZvIjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5qc19yZWRpcmVjdC4wMDIiO2k6MTtpOjExO31zOjMyOiJsb2NhdGlvbj0iaHR0cHM6Ly9iaXRidWNrZXQub3JnLyI7YToxOntpOjA7czoyMzoiaW5qZWN0ZWQuanNfdGltZW91dC4wMDEiO31zOjUzOiJsaW5rc1tpXTtlLnNldEF0dHJpYnV0ZSgiaHJlZiIsYjY0RGVjb2RlVW5pY29kZSgiYUhSMCI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDI2IjtpOjE7czoxNTk6In5mdW5jdGlvbiBiNjREZWNvZGVVbmljb2RlXChbXHddK1wpW1xzXSpce1tcc10qcmV0dXJuW1xzXSpkZWNvZGVVUklDb21wb25lbnRcKGF0b2JbXjxdKzxbXHNdKmxpbmtzXC5sZW5ndGhbXn1dK1x9W1xzXSp2YXJbXHNdKnVhW1xzXSo9W1xzXSpkZXRlY3RbXlx9XStbXHNcfV0rfiI7fXM6MzA6IlJSWydceDY2XHg2MVx4NmJceDY1XHg2Mlx4NzQnXSI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xMDkiO2k6MTtpOjExO31zOjExOiIpXShhdG9iLF8weCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xNTMiO2k6MTtzOjEwNDoifjxzY3JpcHRbXj5dKj52YXIgXzB4XHcrPVxbXFMrXF07ZnVuY3Rpb24gW14+XStsb2NhdGlvbltePl0rXClcXVwoYXRvYixfMHhbXj5dK0pTT05cW18weFtePl0rPFwvc2NyaXB0Pn4iO31zOjQwOiI8L2E+PHA+PHNjcmlwdD5sb2NhdGlvbi5ocmVmPSIjdG9ycmVudHAiIjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5zcGFtLXNlb190b3JyZW50LjAwMSI7aToxO3M6MTM0OiJ+PGEgaWQ9LnRvcnJlbnRwLiBocmVmPS4jLj4gPC5hPjxwPjxzY3JpcHQ+bG9jYXRpb24uaHJlZj0uI3RvcnJlbnRwLjwuc2NyaXB0PjxwPjxwPlteXF5dKz8+dVRvcnJlbnQ8LmE+IG9yIDxhIHJlbFtePl0rPkJpdFRvcnJlbnQ8LmE+fiI7fX1zOjg6InVuZXNjYXBlIjthOjk6e2k6MDtpOjEwO3M6Njc6IjxzY3JpcHQ+ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTCA9IHVuZXNjYXBlKCcnKTs8L3NjcmlwdD4iO2E6Mjp7aTowO3M6MzE6ImluamVjdGVkLmpzX2NyZWF0ZV9kb2N1bWVudC4wMjQiO2k6MTtpOjEyO31zOjYwOiJpZiUyOCUyOG4lNjUlNzclMjBSJTY1Z0V4cCUyOCUyN29uJTY1cGFnJTY1JTdDY2glNjVja28lNzUlNzQiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDM0IjtpOjE7czoxMjg6In48c2NyaXB0PnRoaXNcWy5ldmFsLlxdXCh0aGlzXFsudW5lc2NhcGUuXF1cKC5pZiUyOCUyOG4lNjUlNzclMjBSJTY1Z0V4cCUyOCUyN29uJTY1cGFnJTY1JTdDY2glNjVja28lNzUlNzRbXiciXSsuXClcKTs8LnNjcmlwdD5+Ijt9czoyMjA6IjxzY3JpcHQ+ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTCA9IHVuZXNjYXBlKCclNDglNjElNjMlNGIlNjUlNDQlMjAlNDIlNzklMjAlNDQlNzIlMmUlNTMlNDglNDElMzYlNDglMjAlN2MlMjAlNDYlNzUlNjMlNmIlMjAlNDElNmMlNmMlMjAlNTMlNjklNzQlNjUlMjAlM2QlMjklMjAlNWIlMjAlNDclMzIlM2ElMjAlNGIlMzElNTYlMzMlNmUlMjAlNWQnKTs8L3NjcmlwdD4iO2E6Mjp7aTowO3M6MzE6ImluamVjdGVkLmpzX2NyZWF0ZV9kb2N1bWVudC4wMTkiO2k6MTtpOjEyO31zOjIwMjoiPHNjcmlwdD5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuaW5uZXJIVE1MID0gdW5lc2NhcGUoJyU0OCU2MSU2MyU2YiU2NSU2NCUyMCU0MiU3OSUyMCU0MiU0MSU0YyU0MSUyMCU1MyU0ZSU0OSU1MCU0NSU1MiUyMCU0YiU3NSU3MiU2NCU2OSU3MyU2OCUyMCU0OCU2MSU2MyU2YiU2NSU3MiUyMCU1NyU2MSU3MyUyMCU0OCU2NSU3MiU2NScpOzwvc2NyaXB0PiI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2RvY3VtZW50LjAyMCI7aToxO2k6MTI7fXM6MzA6IiU0OCU0MSU0MyU2YiU2NSU0NCUyMCU0MiU3OSUyMCI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2RvY3VtZW50LjAyMiI7aToxO3M6MTE5OiJ+PHNjcmlwdD5kb2N1bWVudFwuZG9jdW1lbnRFbGVtZW50XC5pbm5lckhUTUxccz1cc3VuZXNjYXBlXCgnJTQ4JTQxJTQzJTZiJTY1JTQ0JTIwJTQyJTc5JTIwJTYxJTQ0JTcyW14nXSsnXCk7PC5zY3JpcHQ+fiI7fXM6NjY6IiUwZCUwYSUwZCUwYSUwZCUwYSUzYyUyMSU0NCU0ZiU0MyU1NCU1OSU1MCU0NSUyMCU2OCU3NCU2ZCU2YyUzZSUwZCI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2RvY3VtZW50LjAyMSI7aToxO3M6MTQwOiJ+ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTFxzKj1ccyp1bmVzY2FwZVwoWyciXSUwZCUwYSUwZCUwYSUwZCUwYSUzYyUyMSU0NCU0ZiU0MyU1NCU1OSU1MCU0NSUyMCU2OCU3NCU2ZCU2YyUzZSUwZCUwYVteJyJdK1snIl0rXCk7fiI7fXM6NTc6IiUzYyU2MyU2NSU2ZSU3NCU2NSU3MiUzZSUzYyU2OCUzMiUzZSU0OCU2MSU0MyU2YiU0NSU2NCUyMCI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuanNfZGVmYWNlbWVudC4wMDIiO2k6MTtzOjEzMDoifmRvY3VtZW50XC5kb2N1bWVudEVsZW1lbnRcLmlubmVySFRNTFxzKj1ccyp1bmVzY2FwZVwoWyciXSUzYyU2MyU2NSU2ZSU3NCU2NSU3MiUzZSUzYyU2OCUzMiUzZSU0OCU2MSU0MyU2YiU0NSU2NCUyMFteJyJdK1snIl0rXCk7fiI7fXM6MzM6IiRqc19wb3B1bmRlcl9VUkw9Imh0dHBzOi8vYml0Lmx5LyI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuanNfdW53YW50ZWRfYWRzLjAxOSI7aToxO3M6MTU4OiJ+PHNjcmlwdFtePl0qPlxzKlwkanNfcG9wdW5kZXJHbG9iYWxDbGljaz0wO1xzKmRvY3VtZW50Lm9ubW91c2V1cFtePD5dK1wkanNfcG9wdW5kZXJfVVJMPS5odHRwczouLmJpdFwuW148Pl0rPjBcKVtePD5dK1wkRW5kLi47W1xzXH1dK3JldHVyblteXHc8Pl0rPC5zY3JpcHQ+fiI7fX1zOjI4OiJqcXVlcnkubWluLmpzPjwvc2NyaXB0PjwvaDU+IjthOjc6e2k6MDtpOjEwO3M6ODI6IjxoNT48c2NyaXB0IHNyYz1odHRwOi8vcHVycGxlLnNtYXJ0ZW5lcmd5bW9kZWwuY29tL2pzL2pxdWVyeS5taW4uanM+PC9zY3JpcHQ+PC9oNT4iO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmZha2VfanF1ZXJ5LjAwMiI7aToxO2k6MTI7fXM6Nzg6IjxoNT48c2NyaXB0IHNyYz1odHRwOi8vaGcuc21hcnRlbmVyZ3ltb2RlbC5jb20vanMvanF1ZXJ5Lm1pbi5qcz48L3NjcmlwdD48L2g1PiI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuZmFrZV9qcXVlcnkuMDAzIjtpOjE7aToxMjt9czo3NDoiPGg1PjxzY3JpcHQgc3JjPWh0dHA6Ly9hcXVhLmthcmVuZWdyZW4uY29tL2pzL2pxdWVyeS5taW4uanM+PC9zY3JpcHQ+PC9oNT4iO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmZha2VfanF1ZXJ5LjAwNCI7aToxO2k6MTI7fXM6NzM6IjxoNT48c2NyaXB0IHNyYz1odHRwOi8vZXFlLnRvb2xiYXJpbmMuY29tL2pzL2pxdWVyeS5taW4uanM+PC9zY3JpcHQ+PC9oNT4iO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmZha2VfanF1ZXJ5LjAwNSI7aToxO2k6MTI7fXM6Nzg6IjxoNT48c2NyaXB0IHNyYz1odHRwOi8vb28uc21hcnRlbmVyZ3ltb2RlbC5jb20vanMvanF1ZXJ5Lm1pbi5qcz48L3NjcmlwdD48L2g1PiI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuZmFrZV9qcXVlcnkuMDA2IjtpOjE7aToxMjt9czo3NDoiPGg1PjxzY3JpcHQgc3JjPWh0dHA6Ly9seDViLnRvb2xiYXJpbmMuY29tL2pzL2pxdWVyeS5taW4uanM+PC9zY3JpcHQ+PC9oNT4iO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmZha2VfanF1ZXJ5LjAwNyI7aToxO2k6MTI7fX1zOjE5OiJuZXcgQWN0aXZlWE9iamVjdCgiIjthOjI6e2k6MDtpOjEwO3M6MTE6Iikuam9pbigiIik7IjthOjI6e2k6MDtpOjEwO3M6NToiW2ldO30iO2E6Mjp7aTowO2k6MTA7czo1OiI9MDt9OyI7YToyOntpOjA7aToxMDtzOjE2Mzoifih2YXIgW1x3XStbXHNdKj1bXHNdKidbXiddKyc7W1xzXSopezMsfXZhciBbXHddK1tcc10qPVtcc10qKFtcd10rW1xzXSpcK1tcc10qKXszLH1bXHddKztbXHNdKnZhciBbXHddK1tcc10qPVtcc10qIiI7W15cbl0rdGhpc1xbW1x3XStcXTtbXHNdKltcd10rXChbXHddK1wpO1tcc10qfiI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuanNfbWFsd2FyZS4wMTciO2k6MTtzOjE2Mzoifih2YXIgW1x3XStbXHNdKj1bXHNdKidbXiddKyc7W1xzXSopezMsfXZhciBbXHddK1tcc10qPVtcc10qKFtcd10rW1xzXSpcK1tcc10qKXszLH1bXHddKztbXHNdKnZhciBbXHddK1tcc10qPVtcc10qIiI7W15cbl0rdGhpc1xbW1x3XStcXTtbXHNdKltcd10rXChbXHddK1wpO1tcc10qfiI7fX19fX1zOjU6Iix1cmw6IjthOjI6e2k6MDtpOjEwO3M6MTE6In07PC9zY3JpcHQ+IjthOjI6e2k6MDtpOjEwO3M6ODoie2V4cGlyZToiO2E6Mjp7aTowO2k6MTA7czoyMDoiPHNjcmlwdD52YXIgcG9wdW5kZXIiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjAzMyI7aToxO3M6NzU6In48c2NyaXB0PnZhciBwb3B1bmRlcltcc10qPVtcc10qXHtleHBpcmU6W1xzXSpbXGRdKyx1cmw6W15cfV0rXH07PC5zY3JpcHQ+fiI7fX19fXM6MzA6InNyYz0iaHR0cDovL3lvdXJqYXZhc2NyaXB0LmNvbSI7YToyOntpOjA7aToxMDtzOjc6Ii9pLmpzIj4iO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnlvdXJqYXZhc2NyaXB0LjAwMSI7aToxO2k6MTE7fX1zOjE4OiJjZGpzLm9ubGluZS9saWIuanMiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDc2IjtpOjE7czo2MToifjxzY3JpcHRccypzcmM9LltodHBzXXs0LH06Li5jZGpzXC5vbmxpbmUubGliXC5qcy4+PC5zY3JpcHQ+fiI7fXM6MTc6ImFsbHlvdXdhbnQub25saW5lIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA4OCI7aToxO3M6NDc6In48c2NyaXB0W14+XSthbGx5b3V3YW50XC5vbmxpbmVbXj5dKz48LnNjcmlwdD5+Ijt9czoxNjoid2VibWluaW5nLmNvL2xpYiI7YToyOntpOjA7czoyMzoibWFsd2FyZS5jcnlwdG9taW5lci4wMDkiO2k6MTtzOjUzOiJ+PHNjcmlwdCBhc3luY1tePl0rd2VibWluaW5nXC5jb1wvbGliW14+XSs+PC5zY3JpcHQ+fiI7fXM6NDE6Im5ld3NoYXJlY291bnRzLnMzLXVzLXdlc3QtMi5hbWF6b25hd3MuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjExOSI7aToxO3M6MTQxOiJ+PHNjcmlwdCB0eXBlPS50ZXh0LmphdmFzY3JpcHQuIHNyYz0uLi5uZXdzaGFyZWNvdW50c1wuczMtdXMtd2VzdFtePl0rPjwuc2NyaXB0PjxzY3JpcHQgdHlwZT0udGV4dFtePl0rPndpbmRvd1wubmV3U2hhcmVDb3VudHNbXj5dKzwuc2NyaXB0Pn4iO31zOjIyOiJzb21ldGltZXNmcmVlLmJpei9jLmpzIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA3NCI7aToxO3M6Njg6In48c2NyaXB0XHMqdHlwZT1bXjpdKzouLlteXC5dK1wuc29tZXRpbWVzZnJlZVwuYml6LmNcLmpzJz48LnNjcmlwdD5+Ijt9czo5OiJjMDU5NC5jb20iO2E6Mjp7aTowO3M6MzE6ImluamVjdGVkLmpzX2NyZWF0ZV9mdW5jdGlvbi4wMDQiO2k6MTtzOjY1OiJ+Jmx0O3NjcmlwdFxzKnNyYz1odHRwOi4uKFx3Ky4pYzA1OTQuY29tLi5qcz0uJmd0OyZsdDtccyouc2NyaXB0fiI7fXM6Mzk6ImFIUjBjRG92TDJkdmIyZHNaUzF6WldGeVkyaHpaWEoyYVdObGN5MSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMTciO2k6MTtzOjEyNToifjxzY3JpcHRbXj5dKj5bXHNdKnZhcltcc10qXzB4W1x3XStbXHNdKj1bXHNdKlxbW15cXV0rYUhSMGNEb3ZMMmR2YjJkc1pTMXpaV0Z5WTJoelpYSjJhV05sY3kxW15cXl0rXF5cXVtePl0rPj1bXj5dKzwuc2NyaXB0Pn4iO31zOjMzOiJ2YXIgbWluZXIgPSBuZXcgQ2xpZW50LkFub255bW91cygiO2E6Mjp7aTowO3M6MjM6Im1hbHdhcmUuY3J5cHRvbWluZXIuMDA2IjtpOjE7czoxODg6In48c2NyaXB0XHMqc3JjPVwiaHR0cHM6Li5bXlwvXStcL3NUYU1cLmpzXCI+PC5zY3JpcHQ+XHMqPHNjcmlwdD5ccyp2YXJccyptaW5lclxzKj1ccypuZXdccypDbGllbnRcLkFub255bW91c1woLi5bXlwsXStcLFxzKlx7XHMqdGhyb3R0bGU6XHMqXGRcLlxkK1xzKlx9XCk7XHMqbWluZXJcLnN0YXJ0XChcKTtccyo8LnNjcmlwdD5+Ijt9czozODoiJD1+W107JD17X19fOisrJCwkJCQkOighW10rIiIpWyRdLF9fJDoiO2E6Mjp7aTowO3M6MjM6Im1hbHdhcmUuY3J5cHRvbWluZXIuMDA0IjtpOjE7czo4ODoifjxzY3JpcHQ+XCQ9XH5cW1xdO1wkPVx7X19fXDpbXntdK1x7XH1cKy4uXClcW1wkXF0sXCRcJFxfXCRcOlwoXCRcW1wkXF1cK1tePF0rPC5zY3JpcHQ+fiI7fXM6MTY6Ii9kYXRhLmpzLnBocD9pPXsiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLmpzX3Vud2FudGVkX2Fkcy4wMTEiO2k6MTtzOjE2NjoifjxzY3JpcHRccyp0eXBlPS50ZXh0LmphdmFzY3JpcHQuXHMqc3JjPS5baHRwc117NCx9Oi4uW15cL10rXC9kYXRhXC5qc1wucGhwXD9cdz1ce1x3Ky1cdystXHcrLVx3K1wtXHcrXH0mYW1wO1x3PVxkezR9LVxkezJ9XC1cZHsyfSZhbXA7XHc9W147XSs7Y2I9XGRcLlxkKy4+PC5zY3JpcHQ+fiI7fXM6Mzk6IllRSEhBQVVEWXdCRmdsRFhnMFZTQjFWVDFERVRBektab2tDMEluRiI7YToyOntpOjA7czoxNjoidW53YW50ZWRfYWRzLjAxMyI7aToxO3M6OTY6In48c2NyaXB0XHMqc3JjW15cLl0uaHR0cHM6Li5bXlwvXStcL2pzLllRSEhBQVVEWXdCRmdsRFhnMFZTQjFWVDFERVRBektab2tDMEluRlteIiddKy4+PC5zY3JpcHQ+fiI7fXM6MzQ6IiQoImhlYWQiKS5hcHBlbmQoJCgiPHNjcmlwdCAvPiIsIHsiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDQ0IjtpOjE7czoxMDA6In5cJFwoWyInXWhlYWRbIiddXClcLmFwcGVuZFwoXCRcKFsiJ108c2NyaXB0XHMqLj5bIiddLFxzKlx7XHMqc3JjOlxzKi5cL1wvW15cL10rXC9bXiciXSsuXHMqXH1cKVwpO34iO31zOjQ5OiIiJnU9IiArIGVuY29kZXVyaShuYXZpZ2F0b3IudXNlcmFnZW50KSArICInPjwvc2MiIjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5qc19yZWRpcmVjdC4wMTIiO2k6MTtzOjI1MToifjxub2luZGV4PjxzY3JpcHRbXi1dKy1kZWNvcmF0aW9uOm5vbmVbXj5dKz5ccypkb2N1bWVudFwud3JpdGVcKC48c2NyaXB0W146XSs6Li5bXlwvXStcLy5cL2pxdWVyeVwuanNcLnBocFw/cj0uXHMqXCtccyplbmNvZGV1cmlcKGRvY3VtZW50XC5yZWZlcnJlclwpXHMqXCtccyouJlx3PS5ccypcK1xzKmVuY29kZXVyaVwobmF2aWdhdG9yLnVzZXJhZ2VudFwpXHMqXCtccyouLj48LnNjW15cKV0rXCk7XHMqPC5zY3JpcHQ+PC5ub2luZGV4Pn4iO31zOjE1OiJlYXN5YWNjZXNzLm1vYmkiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDcwIjtpOjE7czo4ODoifjxzY3JpcHRccyphc3luY1xzKj1ccyoudHJ1ZS5ccypzcmNccyo9Lmh0dHAocyk/XDouLlsoZWFzeWFjZXMubW9iaSldK1wvW14+XSs+PC5zY3JpcHQ+fiI7fXM6Mzk6InZhciBhZGxpbmtmbHlfdXJsID0gJ2h0dHBzOi8vY3V0d2luLmNvbSI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDE0IjtpOjE7czoxMDY6In48c2NyaXB0W14+XSs+W1xzXSoodmFyIGFkbGlua2ZseV9bXHddK1tcc10qPVteO10rO1tcc10qKXszLH08LnNjcmlwdD5bXHNdKig8c2NyaXB0IHNyYz1bXj5dKz48LnNjcmlwdD4pP34iO31zOjIzOiJhc3J2LWEuYWthbWFpaGQubmV0LnNkLyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNTgiO2k6MTtzOjcxOiJ+PHNjcmlwdCBpZD0iXHcrIiBzcmM9Ii4uYXNydi1hLmFrYW1haWhkLm5ldC5zZC9cZCsvXGQrXC5qcyI+PC9zY3JpcHQ+fiI7fXM6MzI6InZhciBjb29raWVjb25zZW50X2lkID0gJzlkZjRjZmE2IjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5qc191bndhbnRlZF9hZHMuMDA5IjtpOjE7czoyMDc6In48c2NyaXB0XHMqdHlwZT0udGV4dC5qYXZhc2NyaXB0Lj5ccyp3aW5kb3cuY29va2llY29uc2VudF9vcHRpb25zXHMqPVxzKlx7Lm1lc3NhZ2UuOi5UaGlzXHMqd2Vic2l0ZVxzKnVzZXNccypjb29raWVzW14sXSssLmRpc21pc3MuOi5Hb3RccyppdFwhW147XSs7XHMqdmFyXHMqY29va2llY29uc2VudF9pZFxzKj1ccyonOWRmNGNmYTZbXiddKyc7PC5zY3JpcHQ+fiI7fXM6MTM6ImFuYWxpdGljb3NjZG4iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDY1IjtpOjE7czo2MzoifjxzY3JpcHRccypzcmNccyo9XHMqLmh0dHAocyk/Oi4uYW5hbGl0aWNvc2NkblwuW148XSs8LnNjcmlwdD5+Ijt9czozODoiZXhvY2xpY2suY29tL3NwbGFzaC5waHA/aWR6b25lPTIzMzI5MTciO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLmpzX3Vud2FudGVkX2Fkcy4wMDUiO2k6MTtzOjIxMToifjxzY3JpcHRccyp0eXBlXHMqPVxzKi50ZXh0LmphdmFzY3JpcHQuc3JjXHMqPVxzKi5odHRwOi4ubmVlZGFsb2dvXC5uZXQudHJhY2tpbmdcLmpzLj48LnNjcmlwdD5ccyo8c2NyaXB0XHMqdHlwZVxzKj1ccyoudGV4dC5qYXZhc2NyaXB0LlxzKnNyY1xzKj1ccyouaHR0cDouLlsoPzpcdytcc1wuKV0rLnNwbGFzaFwucGhwXD9pZHpvbmU9MjMzMjkxNy4+PC5zY3JpcHQ+fiI7fXM6MTY6Im5ldGFuYWx5dGljcy54eXoiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDgwIjtpOjE7czo1NToifjwoaW1nfHNjcmlwdClbXj5dK25ldGFuYWx5dGljc1wueHl6W14+XSs+KDwuc2NyaXB0Pik/fiI7fXM6MTg6IndvcmxkbmF0dXJlbmV0Lnh5eiI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wODAuMDIiO2k6MTtzOjU3OiJ+PChpbWd8c2NyaXB0KVtePl0rd29ybGRuYXR1cmVuZXRcLnh5eltePl0rPig8LnNjcmlwdD4pP34iO31zOjIyOiJzdGF0dmFsaWRhdGlvbi53ZWJzaXRlIjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA4MC4wMyI7aToxO3M6NjE6In48KGltZ3xzY3JpcHQpW14+XStzdGF0dmFsaWRhdGlvblwud2Vic2l0ZVtePl0rPig8LnNjcmlwdD4pP34iO31zOjI0OiI6Ly9kYXRhcHJvdmlkZXIud2Vic2l0ZS8iO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDgwLjA1IjtpOjE7czo2MjoifjwoaW1nfHNjcmlwdClbXj5dKzouLmRhdGFwcm92aWRlclwud2Vic2l0ZVtePl0rPig8LnNjcmlwdD4pP34iO31zOjE3MjoiPHNjcmlwdD5hbGVydCgnaGFja2VkIGJ5IEhtZWk3Jyk8L3NjcmlwdD48aDE+aGFja2VkIGJ5IEhtZWk3PGJyIC8+PC9oMT48ZGl2IHN0eWxlPWJhY2tncm91bmQtY29sb3I6YmxhY2s7PjxiciAvPjxoMT48Zm9udCBjb2xvcj1jeWFuPmhhY2tlZCBieSBIbWVpNzwvZm9udD48L2gxPjxiciAvPjwvZGl2PiI7YToyOntpOjA7czoyMToiZGVmYWNlZC5oYWNrZWRfYnkuMDEyIjtpOjE7aToxMjt9czo2MjoiPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij52YXIgXzAxMT0iO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDAzIjtpOjE7czo4OToifjxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHR5cGU9InRleHRcL2phdmFzY3JpcHQiPnZhciBfMDExLio/XzAxMVwpXClcKTs8XC9zY3JpcHQ+fmkiO31zOjIyOiI5MS4yMzkuMTUuNjEvZ29vZ2xlLmpzIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA1OSI7aToxO3M6NjU6In48c2NyaXB0IHR5cGU9WyJ8J10uKjkxXC4yMzlcLjE1XC42MVwvZ29vZ2xlXC5qc1tePF0qPFwvc2NyaXB0Pn5pIjt9czo3OiJkZ3Nnc2RnIjthOjI6e2k6MDtzOjIwOiJiYWNrZG9vci5qc19ldmFsLjAwMyI7aToxO3M6NDE6In48c2NyaXB0Pi4qP2Rnc2dzZGcuKj9ldmFsLio/PFwvc2NyaXB0Pn5pIjt9czozMjoiOiIiLCdjZW50ZXJPblNjcm9sbCc6IGZhbHNlfSk7fSkiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLmpzX2NsaWNrX2hpamFjay4wMDEiO2k6MTtzOjYwOiJ+IiIsLmNlbnRlck9uU2Nyb2xsLjogZmFsc2UuLjsuLlxzKjwuc2NyaXB0Pi4rPzxzY3JpcHQ+XChce34iO31zOjM3OiIvL3NlcnZlcmFkcy5uZXQvNTk5YjQ3MjYwMzk0ZGViMmQ4LmpzIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5qc191bndhbnRlZF9hZHMuMDAxIjtpOjE7czoxNzg6In48c2NyaXB0IHNyYz0uXC9cL3NlcnZlcmFkc1wubmV0XC81OTliNDcyNjAzOTRkZWIyZDguanMuPjwuc2NyaXB0PjxzY3JpcHQgc3JjPS4uLnB1bHNlYWRuZXR3b3JrLmNvW148XSs8LnNjcmlwdD4oPzpccz88aWZyYW1lIFtePl0rPjwuaWZyYW1lPlxzPyk/KD86PHNjcmlwdCBzcmNbXj5dKz48LnNjcmlwdD4pKn4iO31zOjI5OiJnY3NlLnNyYyA9ICJodHRwOi8vbmlubmkub3JnLyI7YToyOntpOjA7czozMzoiaW5qZWN0ZWQuanNfZG9jdW1lbnRfbG9jYXRpb24uMDA2IjtpOjE7czo4MzoifjxzY3JpcHRbXn1dK3ZhciBnY3NlID0gZG9jdW1lbnRbXn1dK2djc2Uuc3JjID0gImh0dHBbXlx9XStuaW5uaS5vcmdbXj5dKzwuc2NyaXB0Pn4iO31zOjE2OiJza2luL2l0ZW1zLmpzIj48IjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA2MiI7aToxO3M6NjM6In48c2NyaXB0XHMqc3JjLi5odHRwcy4uLnVwc2Jyb2tlci5jb20uc2tpbi5pdGVtcy5qcy4+PC5zY3JpcHQufiI7fXM6MzQ6Imh0dHBzOi8vb3JkZXItc2VjdXJpdHkuY29tL3NjcmlwdHMiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDYzIjtpOjE7czo5NDoifi5zY3JpcHRccyp0eXBlLi50ZXh0LmphdmFzY3JpcHQuXHMqc3JjLi5odHRwcy4uLm9yZGVyLXNlY3VyaXR5LmNvbS5zY3JpcHRzLlx3Ky5qcy4uLi5zY3JpcHQufiI7fXM6MzY6Ii5zcGxpdChUKS5yZXZlcnNlKCkuam9pbihUKSkreStEK3ksWCI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDA4IjtpOjE7czoyMDc6In48c2NyaXB0XHMqZGF0YS1jZmFzeW5jPS5cdysuXHMqdHlwZT0udGV4dC5qYXZhc2NyaXB0Lj52YXJccypcdys9d2luZG93O2ZvclwodmFyXHNcd1xzKmluXHNcdytcKVx7aWZcKFx3Lmxlbmd0aD09PVwoXGQrPlwoXGQrLDB4XHcrXClcP1teIl0rIlx3IjpbXl9dK19cdysuLFxbLj09XHcrLlxdW15cP10rXD96b25laWRbXlwoXStcKFwpOy4+XHMqPC5zY3JpcHQ+fiI7fXM6MTM6Im1pbmVyLnN0YXJ0KCkiO2E6Mjp7aTowO3M6MjM6Im1hbHdhcmUuY3J5cHRvbWluZXIuMDAxIjtpOjE7czoxNTU6In48c2NyaXB0XHMqc3JjXHMqPVxzKlxcPy5odHRwcz86XC9cL1tePl0rPjxcL3NjcmlwdD5ccyo8c2NyaXB0PlxzKnZhclxzKlx3K1xzKj1ccypuZXdccypcdytcLkFub255bW91c1woW15cKV0rXClccyo7XHMqbWluZXJcLnN0YXJ0XChcKTtccyooPzo8XC9zY3JpcHQ+KT9+Ijt9czoxODoieyBkaXNwTEF5IDogTk9uRSB9IjthOjI6e2k6MDtzOjIxOiJpbmplY3RlZC5zcGFtLXNlby4wMTIiO2k6MTtzOjE0MDoifjxzdHlsZT5ccypcLihcdyspXHMqe1xzKltEZElpU3NQcExsQWFZeV17N31ccyo6XHMqW05uT29ObkVlXXs0fVxzKn1ccyo8XC9zdHlsZT5ccyo8XHMqZGl2XHMqY2xhc3Nccyo9XHMqXDFccyo+XHMqPFxzKmFccypocmVmW15cMl0rPFwvZGl2Pn4iO31zOjI4OiIiPndpbmRvdy5uZXdTaGFyZUNvdW50c0F1dG89IjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5qc19yZWRpcmVjdC4wMTkiO2k6MTtzOjE0MToifjxzY3JpcHRcc3R5cGU9LiJ0ZXh0XC9qYXZhc2NyaXB0LiJcc3NyYz0uIlwvXC9uZXdzaGFyZWNvdW50c1tePl0rPlxzKjxcL3NjcmlwdD5ccyo8c2NyaXBbXj5dKz5ccyp3aW5kb3dcLm5ld1NoYXJlQ291bnRzQXV0bz1bXjxdKzxcL3NjcmlwdD5+Ijt9czo3MjoiU3RyaW5nWydmJysncicrJ28nKydtJysnQycrJ2gnKydhJysncicrJ0MnKydvJysnZCcrJ2UnXShnKTtsZXQgYz1hWzB4MF0sIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjEyOSI7aToxO3M6NjM6In5qamxza2V5W1xzXSpbXjtdKztbXHNdKmpqbGlua1teXG5dK2pqbGF1bmNoXChcKTtbXjxdKlwpO1tcc10qfiI7fXM6Mjg6ImpRdWVyeShhdG9iKCdQSE5qY21sd2RDQnBaRDAiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTQ0IjtpOjE7czoxNDI6In5pZltcc10qXChbXHNdKmpRdWVyeVwoW149XStcLmxlbmd0aFtcc10qPT09W1xzXSpbXGRdK1tcc10qXClbXHNdKlx7W1xzXSpqUXVlcnlcKGF0b2JcKC5QSE5qY21sd2RDQnBaRDBbXlwpXStcKVwpXC5hcHBlbmRUb1woLmhlYWQuXCk7W1xzXSpcfX4iO31zOjE2OiIvYXB1LnBocD96b25laWQ9IjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5qc191bndhbnRlZF9hZHMuMDAyIjtpOjE7aToxMTt9czoxNzoidHJhZmZpY3RyYWRlLmxpZmUiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDcyIjtpOjE7aToxMTt9czoxODoidHJ5c29tZXRoaW5nbmV3LmV1IjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA3Mi4wMiI7aToxO2k6MTE7fXM6MTc6InNvbWV0aW1lc2ZyZWUuYml6IjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA3Mi4wMyI7aToxO2k6MTE7fXM6MTc6ImdpdmVtZWFsZXR0ZXIuYml6IjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA3Mi4wNCI7aToxO2k6MTE7fXM6MTg6InNpbXBsZWZ1bnNpdGUuaW5mbyI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNzIuMDUiO2k6MTtpOjExO31zOjE1OiJkYW5jZXdpdGhtZS5iaXoiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDcyLjA2IjtpOjE7aToxMTt9czoxODoidHJ5bXluZXdzcGlyaXQuY29tIjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA3Mi4wNyI7aToxO2k6MTE7fXM6MTg6InIvdHU4WkkiPjwvc2NyaXB0PiI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNjkiO2k6MTtpOjExO31zOjI0OiJnb28uZ2wvUUtaWnhDJz48L3NjcmlwdD4iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDc3IjtpOjE7aToxMTt9czozNDoidmFyIG1pbmVyID0gbmV3IENvaW5IaXZlLkFub255bW91cyI7YToyOntpOjA7czoyMzoibWFsd2FyZS5jcnlwdG9taW5lci4wMDgiO2k6MTtpOjExO31zOjI0OiIvbWFnZS9tYWdlLmpzIj48L3NjcmlwdD4iO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLm1hZ2VudG9fc2hvcGxpZnQuMDAyIjtpOjE7aToxMTt9czozOToic3RhdGNvdW50ZXJmcmVlLmNvbS9wcml2YXRlL2NvdW50ZXIuanM/IjthOjI6e2k6MDtzOjE5OiJtYWx3YXJlLmNvdW50ZXIuMDAxIjtpOjE7aToxMTt9czoxNzoiL3h4LmpzIj48L3NjcmlwdD4iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLmpzX2RlZmFjZW1lbnQuMDAxIjtpOjE7aToxMTt9czoyNToiL3dlYi9qUXVlcnkuanMnPjwvc2NyaXB0PiI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuZmFrZV9qcXVlcnkuMDA5IjtpOjE7aToxMTt9czozNDoiTVRBd01qc3pPM054ZFdGeVpTNXNZWEpuWlY5eVpXTjBZVyI7YToyOntpOjA7czoxNjoidW53YW50ZWRfYWRzLjAxNCI7aToxO2k6MTE7fXM6NDI6IjcyLCA5NywgOTksIDEwNywgMTAxLCAxMDAsIDMyLCA2NiwgMTIxLCAzMiI7YToyOntpOjA7czoyMToiZGVmYWNlZC5oYWNrZWRfYnkuMDE0IjtpOjE7aToxMTt9czo3Mjoie3ZhciBycyA9IHRoaXMucmVhZHlTdGF0ZTsgaWYgKHJzICYmIHJzICE9ICdjb21wbGV0ZScgJiYgcnMgIT0gJ2xvYWRlZCcpIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5qc191bndhbnRlZF9hZHMuMDEwIjtpOjE7aToxMTt9czozMDoiLmNjL21lZGlhL2Nvb2tpZS5qcyI+PC9zY3JpcHQ+IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAzNSI7aToxO2k6MTE7fXM6MTg6IjoiPC9zY3JpcHQ+PHNjcmlwdCI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2RvY3VtZW50LjAxMiI7aToxO2k6MTE7fXM6MTg6Ii9CdEZWUGQnPjwvc2NyaXB0PiI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDA5IjtpOjE7aToxMTt9czo1NjoiIGhlaWdodDogMjgwcHg7IHBvc2l0aW9uOiBhYnNvbHV0ZSIgaWQ9ImJhbm5lcmZsb2F0QURTIj4iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLmpzX3Vud2FudGVkX2Fkcy4wMTUiO2k6MTtpOjExO31zOjEyOiJhdG9iKCJhSFIwY0giO2E6Mjp7aTowO3M6MjI6ImluamVjdGVkLmpzX2Jhc2U2NC4wMDIiO2k6MTtpOjExO31zOjIyOiIoYXRvYignYVdZb2JtVjNJRkpsWjBWIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjE1OSI7aToxO3M6OTM6In52YXJbXHNdKltcd10rO1tcc10qbmV3W1xzXSpzZWxmXFsuW1x3XSsuXHxcfC5bXHddKy5cXVtcc10qXChhdG9iXChbXlwpXStcKVwpXC5jYWxsXCh0aGlzXCk7fiI7fX1zOjc6IjxpZnJhbWUiO2E6MTg6e2k6MDtpOjEwO3M6Mzc6InN0eWxlPSJ2aXNpYmlsaXR5OiBoaWRkZW47Ij48L2lmcmFtZT4iO2E6Mzp7aTowO2k6MTA7czoyODoiPGlmcmFtZSBzcmM9Imh0dHBzOi8vZ29vLmdsLyI7YToyOntpOjA7czoyMDoiaWZyYW1lLmluamVjdGlvbi4wMTQiO2k6MTtzOjg3OiJ+PGlmcmFtZVxzKnNyYz0iaHR0cHM6Li5nb28uZ2wuXHcrIlxzKnN0eWxlPSJ2aXNpYmlsaXR5OlxzKmhpZGRlbjsiPjwuaWZyYW1lPig8LmJvZHk+KX4iO31zOjE1OiJodHRwOi8vYW16bi50by8iO2E6Mjp7aTowO3M6MjA6ImlmcmFtZS5pbmplY3Rpb24uMDEzIjtpOjE7czo3ODoifjxpZnJhbWVccypzcmM9Imh0dHA6Li5hbXpuLnRvLlx3KyJccypzdHlsZT0idmlzaWJpbGl0eTpccypoaWRkZW47Ij48LmlmcmFtZT5+Ijt9fXM6MzQ6IjxpZnJhbWUgZnJhbWVib3JkZXI9IjAiIGhlaWdodD0iMCIiO2E6Mjp7aTowO2k6MTA7czoxNDoic2Nyb2xsaW5nPSJubyIiO2E6Mjp7aTowO3M6MjA6ImlmcmFtZS5pbmplY3Rpb24uMDE3IjtpOjE7aToxMTt9fXM6NjY6InN0eWxlPSJ3aWR0aDowO2hlaWdodDowO2JvcmRlcjowOyBib3JkZXI6bm9uZTsgdmlzaWJpbGl0eTogaGlkZGVuOyI7YToyOntpOjA7czoyMDoiaWZyYW1lLmluamVjdGlvbi4wMTgiO2k6MTtzOjE1OToifjxpZnJhbWVccypzcmM9LltodHBzXXs0LH06W14iJ10rLlxzKnN0eWxlPS53aWR0aDowO2hlaWdodDowO2JvcmRlcjowO1xzKmJvcmRlcjpub25lO1xzKnZpc2liaWxpdHk6XHMqaGlkZGVuO1xzKnBvc2l0aW9uOmFic29sdXRlW14tXSstXGR7NSx9cHg7Lj5ccyo8LmlmcmFtZT5+Ijt9czo5NjoiPGlmcmFtZSBzcmM9Imh0dHA6Ly9nb29nbGUtcGluZ2luZ3MuY29tL2luLmNnaT9kZWZhdWx0IiBoZWlnaHQ9MSB3aWR0aD0xIGZyYW1lYm9yZGVyPTA+PC9pZnJhbWU+IjthOjI6e2k6MDtzOjIwOiJpZnJhbWUuaW5qZWN0aW9uLjAwMSI7aToxO2k6MTI7fXM6MTA3OiI8aWZyYW1lIHNyYz0iaHR0cDovL3MxNjkwNzA4MDUub25saW5laG9tZS51cy8yMDA4LzAxL2dvLnBocD9zaWQ9NiIgaGVpZ2h0PTEgd2lkdGg9MSBmcmFtZWJvcmRlcj0wPjwvaWZyYW1lPiI7YToyOntpOjA7czoyMDoiaWZyYW1lLmluamVjdGlvbi4wMDIiO2k6MTtpOjEyO31zOjI4OiIgc3JjPSJodHRwOi8vMTA4LjE3OS4yNTIuNzAvIjthOjI6e2k6MDtzOjIwOiJpZnJhbWUuaW5qZWN0aW9uLjAwMyI7aToxO3M6NjE6In48aWZyYW1lW14+XSs/c3JjPSJodHRwOi4uMTA4XC4xNzlcLjI1MlwuNzBcL1tePl0rPjwuaWZyYW1lPn4iO31zOjkyOiI8aWZyYW1lIHNyYz1odHRwOi8vNjEuMTMyLjc1LjcxL2lmcmFtZS93cC1zdGF0cy5waHAgd2lkdGg9MSBoZWlnaHQ9MSBmcmFtZWJvcmRlcj0wPjwvaWZyYW1lPiI7YToyOntpOjA7czoyMDoiaWZyYW1lLmluamVjdGlvbi4wMDQiO2k6MTtpOjEyO31zOjExMDoiPGlmcmFtZSBzcmM9Imh0dHA6Ly9zaGFuZ2FjdXB1bmN0dXJlLm9zYS5wbC9zaG93dGhyZWFkLnBocD90PTU3ODUyNDY0IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmcmFtZWJvcmRlcj0iMCIgLz4iO2E6Mjp7aTowO3M6MjA6ImlmcmFtZS5pbmplY3Rpb24uMDA1IjtpOjE7aToxMjt9czo5MDoiPGRpdiBzdHlsZT0icG9zaXRpb246IGFic29sdXRlOyB6LWluZGV4OiAxMDAwOyB0b3A6IC0xMDAwcHg7IGxlZnQ6IC05OTk5cHg7Ij48aWZyYW1lIHNyYz0iIjthOjI6e2k6MDtzOjIwOiJpZnJhbWUuaW5qZWN0aW9uLjAwNiI7aToxO3M6MTE4OiJ+PGRpdiBzdHlsZT0icG9zaXRpb246IGFic29sdXRlOyB6LWluZGV4OiAxMDAwOyB0b3A6IC0xMDAwcHg7IGxlZnQ6IC05OTk5cHg7Ij48aWZyYW1lIHNyYz0iaHR0cFteIl0rIj48LmlmcmFtZT48LmRpdj5+Ijt9czozNjoiPGlmcmFtZSBzcmM9Imh0dHA6Ly9jbG91ZGZsYXJlcy5pbmZvIjthOjI6e2k6MDtzOjIwOiJpZnJhbWUuaW5qZWN0aW9uLjAwNyI7aToxO3M6ODc6In48aWZyYW1lIHNyYz0uXEgrY2xvdWRmbGFyZXNcLmluZm9bXj5dKyh3aWR0aHxoZWlnaHR8ZnJhbWVib3JkZXJ8XHMrKSs9IlxkKyI+PC5pZnJhbWU+fiI7fXM6MTI6InN0YXRpY3dlYi50ayI7YToyOntpOjA7czoyMDoiaWZyYW1lLmluamVjdGlvbi4wMDgiO2k6MTtzOjEyMDoifjxpZnJhbWVccypzcmMuLmh0dHA6Li4oXHcqXC4pc3RhdGljd2ViLnRrXC9cdysuXHMqW147XSs7XHMqbGVmdDpccyotMTAwMHB4O1xzKnRvcDpccyotMTAwMHB4O1xzKnotaW5kZXg6LTE7Lj48LmlmcmFtZT5+Ijt9czo1MDoiZm9ydHVub2ZmZGV2LmdlbWZpbmR3ZWJkZXNpZ24uY29tL2dlbWZpbmQvaW5mby5waHAiO2E6Mjp7aTowO3M6MjA6ImlmcmFtZS5pbmplY3Rpb24uMDA5IjtpOjE7czoxMDc6In48ZGl2IHN0eWxlW148XSsrPGlmcmFtZSBzcmM9LltePl0rZm9ydHVub2ZmZGV2LmdlbWZpbmR3ZWJkZXNpZ24uY29tL2dlbWZpbmQvaW5mby5waHBbXj5dKz48LmlmcmFtZT48LmRpdj5+Ijt9czozMDoid3d3LnZpc2lvLXJ4LmNvbS9kb2NzL2luZm8ucGhwIjthOjI6e2k6MDtzOjIwOiJpZnJhbWUuaW5qZWN0aW9uLjAxMCI7aToxO3M6ODc6In48ZGl2IHN0eWxlW148XSsrPGlmcmFtZSBzcmM9LltePl0rd3d3LnZpc2lvLXJ4LmNvbS9kb2NzL2luZm8ucGhwW14+XSs+PC5pZnJhbWU+PC5kaXY+fiI7fXM6MzQ6InNpdGVvbmxpbmUuY2xpY2svc3RhdGlzdGljc19vbmxpbmUiO2E6Mjp7aTowO3M6MjA6ImlmcmFtZS5pbmplY3Rpb24uMDExIjtpOjE7czo5NDoifjxkaXYgc3R5bGVbXjxdKys8aWZyYW1lIHNyYz0uW14+XStzaXRlb25saW5lLmNsaWNrL3N0YXRpc3RpY3Nfb25saW5lW14+XSs+PC5pZnJhbWU+XHMqPC5kaXY+fiI7fXM6NTg6IjxpZnJhbWUgZnJhbWVib3JkZXI9IjAiIHN0eWxlPSJwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IC0iO2E6Mjp7aTowO3M6MjA6ImlmcmFtZS5pbmplY3Rpb24uMDE1IjtpOjE7czoxMjM6In48aWZyYW1lXHMqZnJhbWVib3JkZXI9LjAuXHMqc3R5bGU9LlteOl0rOlxzKmFic29sdXRlO1xzKmxlZnQ6XHMqLVxkezQsfXB4O1xzKnRvcDpccyotXGR7NCx9cHhbXlwuXSsuY2xpY2tbXiJdKyI+PC5pZnJhbWU+fiI7fXM6MTU6ImNvaW5wb3QuY28vbWluZSI7YToyOntpOjA7czoyMzoibWFsd2FyZS5jcnlwdG9taW5lci4wMDIiO2k6MTtzOjExMToifjxpZnJhbWVbXlwyPl0rc3JjXHMqPVxzKlsnIl1odHRwKD86cyk/OlwvXC8oPzpcdytcLik/Y29pbnBvdFwuY29cL21pbmVcL1x3K1wvXD9yZWY9XHcrLlxzKltePl0rPlxzKjxcL2lmcmFtZT5+Ijt9czoxODoiOiI8L3NjcmlwdD48aWZyYW1lIjthOjI6e2k6MDtzOjIwOiJpZnJhbWUuaW5qZWN0aW9uLjAxMiI7aToxO2k6MTE7fX1zOjU6ImV2YWwoIjthOjIxOntpOjA7aToxMDtzOjEyOiJmcm9tQ2hhckNvZGUiO2E6OTp7aTowO2k6MTA7czo5NDoiMTE5LCAxMDUsIDExMCwgMTAwLCAxMTEsIDExOSwgNDYsIDEwOCwgMTExLCA5OSwgOTcsIDExNiwgMTA1LCAxMTEsIDExMCwgNDYsIDEwNCwgMTE0LCAxMDEsIDEwMiI7YToyOntpOjA7aToxMDtzOjExNjoiMTAwLCAxMTEsIDk5LCAxMTcsIDEwOSwgMTAxLCAxMTAsIDExNiwgNDYsIDEwOCwgMTExLCA5OSwgOTcsIDExNiwgMTA1LCAxMTEsIDExMCwgNDYsIDExNCwgMTAxLCAxMTIsIDEwOCwgOTcsIDk5LCAxMDEiO2E6Mjp7aTowO2k6MTA7czoxMDM6IjEwMCwgMTExLCA5OSwgMTE3LCAxMDksIDEwMSwgMTEwLCAxMTYsIDQ2LCAxMDgsIDExMSwgOTksIDk3LCAxMTYsIDEwNSwgMTExLCAxMTAsIDQ2LCAxMDQsIDExNCwgMTAxLCAxMDIiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjAyNyI7aToxO3M6MTUyOiJ+ZXZhbFwoU3RyaW5nXC5mcm9tQ2hhckNvZGVcKFtcZF0rLFteO10rMTAwLCAxMTEsIDk5LCAxMTcsIDEwOSwgMTAxLCAxMTAsIDExNiwgNDYsIDEwOCwgMTExLCA5OSwgOTcsIDExNiwgMTA1LCAxMTEsIDExMCwgNDYsIDEwNCwgMTE0LCAxMDEsIDEwMlteO10rXCk7fiI7fX19czoxMjE6IjQ2LDEwMywxMDEsMTE2LDY5LDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDY2LDEyMSw3MywxMDAsNDAsMzQsOTcsMTAwLDEwOSwxMDUsMTEwLDEwNiwxMTUsMTEyLDk3LDEwMywxMDEsMzQsNDEsMzgsMzgsNDAsNDAiO2E6Mjp7aTowO2k6MTA7czoxNjI6IjEwMSwxMTAsMTE2LDExNSw2NiwxMjEsODQsOTcsMTAzLDc4LDk3LDEwOSwxMDEsNDAsMTE1LDQxLDkxLDQ4LDkzLDQxLDQ2LDExMiw5NywxMTQsMTAxLDExMCwxMTYsNzgsMTExLDEwMCwxMDEsNDYsMTA1LDExMCwxMTUsMTAxLDExNCwxMTYsNjYsMTAxLDEwMiwxMTEsMTE0LDEwMSw0MCI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuanNfYXBwZW5kQ2hpbGQuMDA3IjtpOjE7czo1OToifmV2YWxcKFN0cmluZ1wuZnJvbUNoYXJDb2RlXCgoW1xkXSssW1xzXSopezIwLH1bXGRdK1wpXCk7P34iO319czo2MjoiZXZhbChTdHJpbmcuZnJvbUNoYXJDb2RlKDMyLDQwLDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsMTExLDExMCwiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLmpzX2FwcGVuZENoaWxkLjAwNCI7aToxO3M6NTE6In5ldmFsXChTdHJpbmdcLmZyb21DaGFyQ29kZVwoMzIsNDAsMTAyW15cKV0rW1wpO10rfiI7fXM6Mzg6ImV2YWwoU3RyaW5nLmZyb21DaGFyQ29kZSgxMTgsIDk3LCAxMTQsIjthOjI6e2k6MDtzOjI5OiJqcy5tYWx3YXJlLmluamVjdG9yX3N0YXRzLjAwNCI7aToxO3M6NTM6In5ldmFsXChTdHJpbmdcLmZyb21DaGFyQ29kZVwoMTE4LCA5NywgMTE0W15cKV0rXCkrOz9+Ijt9czoxNDE6Ijc3LCA2OCwgNjUsIDExMiwgNzUsIDg2LCAxMTUsIDExOSwgODgsIDgzLCA1MywgMTA0LCA5OSwgNzIsIDY2LCAxMDgsIDk4LCAxMDksIDgyLCA2OCwgOTcsIDcxLCAxMDgsIDExNSwgOTAsIDY3LCAxMDQsIDExMywgOTksIDEyMSwgMTA3LCA1NSkpKSI7YToyOntpOjA7czoyMDoiaW5qZWN0ZWQuanNfZXZhbC4wMDciO2k6MTtzOjczOiJ+ZXZhbFwoYXRvYlwoU3RyaW5nXC5mcm9tQ2hhckNvZGVcKDEwMCwgMTA5LFteXCldKzk5LCAxMjEsIDEwNywgNTVcKVwpXCl+Ijt9czo4OToiZXZhbChTdHJpbmcuZnJvbUNoYXJDb2RlKDMzLDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsMTExLDExMCw0MCw0MSwxMjMsMTE4LDk3LDExNCwzMiwxMTYsNjEiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLmpzX3JlZGlyZWN0LjAyOS4wMiI7aToxO3M6NTQ6In5ldmFsXChTdHJpbmcuZnJvbUNoYXJDb2RlXCgzMywxMDIsMTE3LDFbXlwpXStbXHNcKV0rfiI7fXM6ODI6IjEsNDEsMTI1LDQwLDEwMCwxMTEsOTksMTE3LDEwOSwxMDEsMTEwLDExNiw0NCwzNCwxMTUsOTksMTE0LDEwNSwxMTIsMTE2LDM0LDQxLDU5KSkiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjA0NSI7aToxO3M6NTA6In5ldmFsXChTdHJpbmdcLmZyb21DaGFyQ29kZVwoW1xkXSssW1xkXStbXlwpXStcKSt+Ijt9czozNjoiZXZhbChTdHJpbmcuZnJvbUNoYXJDb2RlKDExOCw5NywxMTQsIjthOjI6e2k6MDtzOjI5OiJqcy5tYWx3YXJlLmluamVjdG9yX3N0YXRzLjAwNiI7aToxO3M6NTM6In5ldmFsXChTdHJpbmdcLmZyb21DaGFyQ29kZVwoMTE4LDk3LDExNFteO10rXCk7W1xzXSp+Ijt9fXM6MTM6ImJhc2U2NF9kZWNvZGUiO2E6Nzp7aTowO2k6MTA7czozODoiZXZhbChiYXNlNjRfZGVjb2RlKCdhV1lnS0hCeVpXZGZiV0YwWTIiO2E6Mjp7aTowO3M6MjQ6ImJhY2tkb29yLmV2YWxfYmFzZTY0LjAwMSI7aToxO3M6NzM6In5ldmFsXChiYXNlNjRfZGVjb2RlXCgnYVdZZ0tIQnlaV2RmYldGMFkyZ29KeThvUjI5dloyeGxZW149XSs3ZlE9PSdcKVwpO34iO31zOjI1OiIlJih7JHtldmFsKGJhc2U2NF9kZWNvZGUoIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci5ldmFsX2Jhc2U2NC4wMDMiO2k6MTtzOjg0OiJ+XCVcJlwoXHtcJFx7ZXZhbFwoYmFzZTY0X2RlY29kZVwoXCRfKFNFUlZFUnxQT1NUfEdFVClcW1teXF1dK1xdXClcKVx9XH1cfFwuXCtcKSZcJX4iO31zOjMxOiJdKSl7QGV2YWwoYmFzZTY0X2RlY29kZSgkX1BPU1RbIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci5ldmFsX2Jhc2U2NC4wMTQiO2k6MTtzOjExNDoifjxcP3BocFxzKlteQF0rQGV2YWxcKGJhc2U2NF9kZWNvZGVcKFwkX1BPU1RcW1x3K1xdXClcKTtleGl0O1x9aWZcKGlzc2V0XChcJF9HRVRcW1x3K1xdXClcKVx7cGhwaW5mb1woXCk7XH1ccypcPz5+Ijt9czo1MToiOiJldmFsXChiYXNlNjRfZGVjb2RlXCgnRFFvTkNpOHZEUW9rUWs5UFZGOU9RVTFGSUQwIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci5ldmFsX2Jhc2U2NC4wMTYiO2k6MTtzOjg5OiJ+czpcZCs6WyciXWV2YWxcKGJhc2U2NF9kZWNvZGVcKFsnIl1EUW9OQ2k4dkRRb2tRazlQVkY5T1FVMUZJRDBbXlwpXStcKVwpXHMqO1xzKlsnIl1ccyo7fiI7fXM6MjM6ImV2YWwoJ2Z1bmN0aW9uIGZ1bmN0aW9uIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci5ldmFsX2Jhc2U2NC4wMDgiO2k6MTtzOjE2MjoifmV2YWxcKC5mdW5jdGlvblxzKmZ1bmN0aW9uXHcrW149XSs9bWQ1W15cfV0rXH1lbHNlXHtbXjxdKzxzdHJsZW5cKFteXF5dK1xeb3JkW147XSs7XH1yZXR1cm5ccypcJFx3KztcfVteIl0rIlx3KyI7XHMqXEBldmFsXChmdW5jdGlvblx3K1woYmFzZTY0X2RlY29kZVteO10rOydcKTt+Ijt9czozMzoiJHRtcFsncG9zdF90aXRsZSddID0gJHBvc3RfdGl0bGU7IjthOjI6e2k6MDtzOjE4OiJiYWNrZG9vci5zaGVsbC4wMDYiO2k6MTtzOjMwNjoifmZ1bmN0aW9uIFtcd10rXChcJHNpZ24sW1xzXSpcJGRhdGFcKVtcc10qXHtbXHNdKlwkcHVia2V5W15cfV0rXH1bXHNdKmVsc2VbXHNdKntbXHNdKnJldHVybiBmYWxzZTtbXHNcfV0rZnVuY3Rpb25bXlx7XStce1tcc10qXCRkYXRhW1xzXSo9W1xzXSp1bnNlcmlhbGl6ZVwoYmFzZTY0X2RlY29kZVwoXCRkYXRhXClcKTtbXlx4MDJdK2lmW1xzXSpcKFtcc10qW1x3XStcKFwpW1xzXSomJltcc10qW1x3XStjb29raWVcKFwpW1xzXSomJltcc10qW1x3XSt1YVwoW1xzXCldK1x7W1xzXSphZGRfYWN0aW9uW147XStcKTtbXHNdKlx9W1xzXSp+Ijt9fXM6MjU6ImV2YWwoZnVuY3Rpb24ocCxhLGMsayxlLGQiO2E6Nzp7aTowO2k6MTA7czoxNDoiX2NoZWNrb3V0cGFnZXwiO2E6Mjp7aTowO2k6MTA7czoxMToiX2NjX251bWJlcnwiO2E6Mjp7aTowO2k6MTA7czoxMDoifGNoZWNrb3V0fCI7YTozOntpOjA7aToxMDtzOjIzOiJ8ZnJvbUNoYXJDb2RlfGVsc2V8dGV4dCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNzUiO2k6MTtzOjY1OiJ+ZXZhbC5mdW5jdGlvbi5wLmEuYy5rLmUuZC5bXlxuXStfY2NfbnVtYmVyXHxbXlwpXStzcGxpdC4uXHwuXCkrfiI7fXM6MjQ6InxhdXRob3JpemVuZXRfY2NfbnVtYmVyfCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xMjEiO2k6MTtzOjc5OiJ+ZXZhbC5mdW5jdGlvbi5wLmEuYy5rLmUuZC5bXlxuXStfY2NfbnVtYmVyXHxbXlwpXStzcGxpdC4uXHwuXCksW1xkXSssXHtcfVwpXCl+Ijt9fX19czoyMDoifGVuY29kZVVSSUNvbXBvbmVudHwiO2E6Mzp7aTowO2k6MTA7czoxMzoifHNlX3JlZmVycmVyfCI7YToyOntpOjA7aToxMDtzOjE3OiJ8ZGVmYXVsdF9rZXl3b3JkfCI7YToyOntpOjA7czozMDoiaW5qZWN0ZWQuanNfY3JlYXRlX2VsZW1lbnQuMDA4IjtpOjE7czo5NjoifmV2YWwuZnVuY3Rpb24ucC5hLmMuay5lLmRbXlx8XStcfFx8W1x3XVwudG9TdHJpbmdbXlx8XStbXlx9XStcfGRlZmF1bHRfa2V5d29yZFx8W15cfV0rXHtcfVwpXCl+Ijt9fXM6MTc6InxvbmVzdGVwY2hlY2tvdXR8IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjEzNCI7aToxO3M6MTAzOiJ+ZXZhbC5mdW5jdGlvbi5wLmEuYy5rLmUuZFteXHxdK1x8XHxbXHddK1woW1x3XStcKVx9W15cfF0rXHxbXHddK1x8W15ce10rc3BsaXRcKC5cfC5cKSxbXGRdKyxce1x9XClcKTt+Ijt9fXM6MjA6IiwxMywxMywncGhwfHZvdGV8anN8IjthOjI6e2k6MDtpOjEwO3M6Mzg6Inx3d3d8aHR0cHN8bG9jYXRpb24nLnNwbGl0KCd8JyksMCx7fSkpIjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5qc19yZWRpcmVjdC4wNDMiO2k6MTtzOjcwOiJ+ZXZhbC5mdW5jdGlvbi5wLmEuYy5rW148XStodHRwc1x8bG9jYXRpb24uXC5zcGxpdFteXH1dK1x7XH1cKVwpW1xzXSp+Ijt9fXM6OToifHBsdWdpbnN8IjthOjI6e2k6MDtpOjEwO3M6Mjc6InBocHxjb25maWd8amV0cGFja3xwbHVnaW5zfCI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDQ2IjtpOjE7czoxMjA6In5ldmFsXChmdW5jdGlvblwocCxhLGMsa1teK10rZnVuY3Rpb25cKFwpXHtyZXR1cm4uLi53XCsuXH07W15cfF0rcGhwXHxjb25maWdcfGpldHBhY2tbXlx9XStzcGxpdFwoLlx8LlwpLFtcZF0rLFx7XH1cKVwpfiI7fX1zOjI1OiJzdGF0dXN8dW1icmRhdGF8cmVzcG9uc2V8IjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjEzMyI7aToxO3M6NzA6In5ldmFsXChmdW5jdGlvblwocC5hLmMuay5lLmRbXnxdK1x8XHxbXlx8XStcfHVtYnJkYXRhXHxbXlx9XStce1x9XClcKX4iO31zOjQwOiJkb2N1bWVudHxmcm9tQ2hhckNvZGV8U3RyaW5nfGV2YWx8d3JpdGV8IjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5oaWRkZW4tZGl2LjA0MiI7aToxO3M6MTE2OiJ+ZXZhbFwoZnVuY3Rpb25cKHAuYS5jLmsuZS5kW158XStcfFx8W15cfF0rXClcKVwpOy4sW15cKF0rZG9jdW1lbnRcfGZyb21DaGFyQ29kZVx8U3RyaW5nXHxldmFsXHx3cml0ZVteXHtdK1x7XH1cKVwpfiI7fX1zOjI6Imd6IjthOjc6e2k6MDtpOjEwO3M6NTE6IkBldmFsKEBnenVuY29tcHJlc3MoQHN0cl9yb3QxMyhAYmFzZTY0X2RlY29kZSgnYTV6bCI7YToyOntpOjA7czoyNDoiYmFja2Rvb3IuZXZhbF9iYXNlNjQuMDAyIjtpOjE7czo5NjoifkBldmFsXChAZ3p1bmNvbXByZXNzXChAc3RyX3JvdDEzXChAYmFzZTY0X2RlY29kZVwoLmE1emxbXjtdK01ibU5wWXBBb1Q3eWYvdy9OTXdvUUE9PS5cKVwpXClcKTt+Ijt9czo1NDoiQGV2YWwoQGd6dW5jb21wcmVzcyhAc3RyX3JvdDEzKEBiYXNlNjRfZGVjb2RlKCdhNXpsZlgxIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci5ldmFsX2Jhc2U2NC4wMDQiO2k6MTtzOjcyOiJ+QGV2YWxcKEBnenVuY29tcHJlc3NcKEBzdHJfcm90MTNcKEBiYXNlNjRfZGVjb2RlXCguezEwMjR9W147XSs7XHMqZGllO34iO31zOjU0OiJldmFsKGd6aW5mbGF0ZShiYXNlNjRfZGVjb2RlKCdEWmZIRG9RNEdvVHY4eUl6SXc3a3BBMGoiO2E6Mjp7aTowO3M6MjQ6ImJhY2tkb29yLmV2YWxfYmFzZTY0LjAxMCI7aToxO3M6MTE0OiJ+PD9waHBccypcL1wqXHMqb25saW5lXHMqZW5jb2RlW15lXStldmFsXChnemluZmxhdGVcKGJhc2U2NF9kZWNvZGVcKC5EWmZIRG9RNEdvVHY4eUl6SXc3a3BBMGpbXj1dKz0uXClcKVwpO1xzKlw/Pn4iO31zOjUwOiJldmFsKGd6aW5mbGF0ZShiYXNlNjRfZGVjb2RlKCc3YjFyZXhvNUVqRDYyZk04OHg4NiI7YToyOntpOjA7czoyNDoiYmFja2Rvb3IuZXZhbF9iYXNlNjQuMDExIjtpOjE7czoxNDc6In5pZlxzKlwoc3RycG9zXChcJF9TRVJWRVJcWy5QSFBfU0VMRi5cXSwucnNzcG9zdGVyLnBocC5cKVwpXHMqXHtccypldmFsXChnemluZmxhdGVcKGJhc2U2NF9kZWNvZGVcKC43YjFyZXhvNUVqRDYyZk04OHg4NlteJ10rJ1wpXClcKTtccypleGl0O1xzKlx9fiI7fXM6NDE6Ijk3LDEwMCwxMDksMTA1LDExMCwxMDQsMTAxLDk3LDEwMCwxMDYsMTE1IjthOjI6e2k6MDtzOjIwOiJpbmplY3RlZC5qc19ldmFsLjAxMSI7aToxO3M6ODc6In5ldmFsXChTdHJpbmdcLmZyb21DaGFyQ29kZVwoW15cKV0rOTcsMTAwLDEwOSwxMDUsMTEwLDEwNCwxMDEsOTcsMTAwLDEwNiwxMTVbXlwpXStcKVwpfiI7fXM6MTk6IkBldmFsKEBnenVuY29tcHJlc3MiO2E6Mjp7aTowO3M6MjQ6ImJhY2tkb29yLmV2YWxfYmFzZTY0LjAxMyI7aToxO2k6MTE7fX1zOjE4OiJldmFsKGJhc2U2NF9kZWNvZGUiO2E6Mzp7aTowO2k6MTA7czoxOToiaWYoIWVtcHR5KCRfU0VSVkVSWyI7YToyOntpOjA7aToxMDtzOjE5OiJpZighZW1wdHkoJF9TRVJWRVJbIjthOjI6e2k6MDtpOjEwO3M6Mjg6ImV2YWwoYmFzZTY0X2RlY29kZSgkX1NFUlZFUlsiO2E6Mjp7aTowO3M6MTc6ImJhY2tkb29yLmV2YWwuMDA3IjtpOjE7czo4MDoifmlmXCghZW1wdHlcKFwkX1NFUlZFUlxbW15cXV0rXF1bXHNcKV0rQD9ldmFsXChiYXNlNjRfZGVjb2RlXChcJF9TRVJWRVJbXjtdK1wpO34iO319fXM6MTk6ImV2YWwoYmFzZTY0X2RlY29kZSgiO2E6Mjp7aTowO3M6MTc6ImJhY2tkb29yLmV2YWwuMDA2IjtpOjE7czozMToifkA/ZXZhbFwoYmFzZTY0X2RlY29kZVteO10rXCk7fiI7fX1zOjIzOiJvbm1vdXNlb3Zlcj0iZXZhbChhdG9iKCI7YToyOntpOjA7czoxNzoiYmFja2Rvb3IuZXZhbC4wMDEiO2k6MTtzOjEyODoiflxbPGFbXHNdKnRpdGxlW14+XStyZWxbXHNdKj1bXHNdKi5ub2ZvbGxvdy4+W1xzXSo8LmE+W15cKF0rb25tb3VzZW92ZXJbXHNdKj1bXHNdKi5ldmFsW1xzXSpcKFtcc10qYXRvYlwoW15cXV0rPC5hPltcc10qXF1bXHNdKn4iO31zOjIxOiJwLmgobC5tKDgsMSwwLGMsNCwyLGQiO2E6Mjp7aTowO3M6MzE6ImluamVjdGVkLmpzX2NyZWF0ZV9mdW5jdGlvbi4wMTUiO2k6MTtzOjE3MDoifjxzY3JpcHQ+ZXZhbFwoZnVuY3Rpb25cKHAsYSxjLGssZSxyXClccypce1teO10rO2lmXCghJycucmVwbGFjZVteO10rO2tbXiddKycuLndcKy5cfTtccypbXlxdXStcXVteXF1dK1xdXCk7cmV0dXJuXHMqcFx9XCgncC5oXChsLm1cKDgsMSwwLGMsNCwyLGRbXlx7XStce1x9XClcKTwuc2NyaXB0Pn4iO31zOjEyOiJhdG9iKCJZWElnIikiO2E6Mjp7aTowO3M6MjA6ImJhY2tkb29yLmpzX2V2YWwuMDE0IjtpOjE7czoxMTY6In48c2NyaXBbXj5dKz5ccyp2YXJccyooXHcrKVxzKj1ccyphdG9iXChbJyJcd1w9LV0rXClccyo7XHMqdmFyXHMqKFx3Kylccyo9W15cMl0rZXZhbFwoXDFcK1teXCldK1wpXHMqO1xzKjxcL3NjcmlwdD5+Ijt9czoxNDoiID0gYXRvYignZG1GeUkiO2E6Mjp7aTowO3M6MjA6ImJhY2tkb29yLmpzX2V2YWwuMDExIjtpOjE7czo1OToifnZhciBbXHddK1tcc10qPVtcc10qYXRvYlwoLmRtRlteO10rXCk7W1xzXSpldmFsXChbXHddK1wpO34iO31zOjM3OiJldmFsKCdcMTU2XDE0NVwxNjdcNDBcMTIyXDE0NVwxNDdcMTA1IjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci5ldmFsX2Jhc2U2NC4wMDUiO2k6MTtzOjQ4OiJ+ZXZhbFwoLi4xNTYuMTQ1LjE2Ny40MC4xMjIuMTQ1LjE0Ny4xMDVbXiddKydcKX4iO31zOjQ1OiJjPTF9O3doaWxlKGMtLSlpZihrW2NdKXA9cC5yZXBsYWNlKG5ldyBSZWdFeHAiO2E6Mjp7aTowO3M6MjA6ImJhY2tkb29yLmpzX2V2YWwuMDAyIjtpOjE7czoyNDU6In48XCEtLVx3Ky0tPjxzY3JpcHRccyp0eXBlPS50ZXh0LmphdmFzY3JpcHQuPlxzKmV2YWxcKGZ1bmN0aW9uXChwLGEsY1teO10rO2lmXChcIS4uLnJlcGxhY2VcKC5cXi5bXiddKycuLndcKy5cfTtccypbXiddKycuLmIuXCtlXChjLlwrW15cKl0rXCpmXCk7MlteXH1dK1x9XClcKFwpO1xzKi4sMzUsMzUsLnNyYy4udmFyLmRvY3VtZW50LnJhem13LnJhem1oW15cLl0rLnNwbGl0XCguLi4uLDAsXHtcfVwpXClccyo8LnNjcmlwdD5+Ijt9czo0MToiZXZhbChhdG9iKCdkbUZ5SUhnZ1BTQmtiMk4xYldWdWRDNW5aWFJGYkciO2E6Mjp7aTowO3M6MjQ6ImJhY2tkb29yLmV2YWxfYmFzZTY0LjAwOSI7aToxO3M6MTE2OiJ+PCEtLVxzKnN0eWxlPS5wb3NpdGlvbjpmaXhlZDt0b3A6MHB4W14iXSsiZXZhbFwoYXRvYlwoLmRtRnlJSGdnUFNCa2IyTjFiV1Z1ZEM1blpYUkZiR1Z0Wlc1MGMwSlteIl0rIlxzKlwmZ3Q7XHMqLS0+fiI7fXM6MzI6IltpbnNlcnRfcGhwXWlmIChpc3NldCgkX1JFUVVFU1RbIjthOjI6e2k6MDtzOjE3OiJiYWNrZG9vci5ldmFsLjAwNSI7aToxO3M6MTQxOiJ+XFtpbnNlcnRfcGhwXF1pZlxzKlwoaXNzZXRcKFwkX1JFUVVFU1RcWy5cdysuXF1cKVwpXHtldmFsXChcJF9SRVFVRVNUXFsuXHcrLlxdXCk7ZXhpdDtcfVteXHtdK1x7ZXZhbFwoXCRfUkVRVUVTVFxbLlx3Ky5cXVwpO2V4aXQ7XH1cWy5waHBcXX4iO31zOjI4OiInLnNwbGl0KCd8JyksMCx7fSkpPC9zY3JpcHQ+IjthOjI6e2k6MDtzOjE3OiJiYWNrZG9vci5ldmFsLjAwMiI7aToxO3M6MjY4OiJ+PGRpdlxzKmNsYXNzPS5jaGFuZ2UtdGhpcy4+W148XSs8YVxzKmhyZWY9Imh0dHBbXiJdKyI+W148XSs8LmE+W148XSs8LmRpdj48c2NyaXB0PmV2YWxcKGZ1bmN0aW9uW147XSs7aWZcKFwhLi4ucmVwbGFjZVteXHtdK1x7d2hpbGVcKGMtLVteJ10rJy4ud1wrJ1x9O1xzKmM9XGQrXH07d2hpbGVbXjtdKztyZXR1cm5ccypbXixdKyxcZCxcZCxcd1teO10rOy4uXGR7Mix9LFxkezIsfSwnXGR7Myx9W14nXSsnLnNwbGl0XCgnXHwnXCksXGQsXHtcfVwpXCk8LnNjcmlwdD5+Ijt9czoyMToieG1sLnBocD9hPWlubmVyJmhvc3Q9IjthOjI6e2k6MDtzOjI1OiJiYWNrZG9vci5nZXRfY29udGVudHMuMDAxIjtpOjE7czoxNjk6In5cJGNvbmZpZ19cdytccz1cc2ZpbGVfZ2V0X2NvbnRlbnRzXCguaHR0cDouLlteXD9dK1w/YT1pbm5lclwmaG9zdD0uXHMuXHNcJF9TRVJWRVIuLlNFUlZFUl9OQU1FLi4uLi4uanMuXCk7XHNpZi5zdHJsZW4uLmNvbmZpZy5cdysuXHM+XHMwLlx7XHNldmFsXChcJGNvbmZpZ19cdytcKVw7XHNcfX4iO31zOjQyOiJablZ1WTNScGIyNGdjMlYwUTI5dmEybGxLRzVoYldVc0lIWmhiSFZsTEMiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjAzOSI7aToxO3M6NTg6In5ldmFsW1xzXSpcKFtcc10qYXRvYltcc10qXChbXHNdKi5ablZ1WTNScGIyNGdjMlZbXjtdK1wpO34iO31zOjE3OiJ3aGlsZSh4PWV2YWwoeCkpOyI7YToyOntpOjA7czoyMDoiaW5qZWN0ZWQuanNfZXZhbC4wMDgiO2k6MTtzOjU2OiJ+dmFyIHhbXHNdKj1bXHNdKiJmdW5jdGlvblteXHgwMl0rd2hpbGVcKHg9ZXZhbFwoeFwpXCk7fiI7fXM6NDE6ImV2YWwoYXRvYignWm5WdVkzUnBiMjRnYzNSaGNuUW9LU0I3Q2lBZ0lDIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci5ldmFsX2Jhc2U2NC4wMjIiO2k6MTtzOjMxOiJ+ZXZhbFwoYXRvYlwoLlpuVnVbXlwpXStbXCk7XSt+Ijt9czo2MzoifENWMnxFeHBpcnlEYXRlWWVhcnx6b25lfHBvc3R8YXRvYnxjbGVhcnxjb25zb2xlfHNldFRpbWVvdXR8YUhSIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjEzOSI7aToxO3M6MTc1OiJ+ZXZhbFwoZnVuY3Rpb25cKFtwYWNrZWQsXSpcKVx7XHcrPWZ1bmN0aW9uXChcdytcKS5yZXR1cm5cKFteUl0qUmVnRXhwXCguLi4uLlx3Ky5cK1teXHxdKlx8XFwuXClbXlwiXSp2YWxcfFx8XHxwYXltZW50XHxpbnB1dFx8W15cLl0qYUhSXHcrXHxDYXJkTnVtYmVyXHxbXlwpXSpcKSxcZCssXHtcfVwpXCl+Ijt9czo1OiJldmFsKCI7YToyOntpOjA7czoxNzoiYmFja2Rvb3IuZXZhbC4wMDMiO2k6MTtpOjExO319czo5OiJkb2N1bWVudC4iO2E6Mjc6e2k6MDtpOjEwO3M6MTQ6ImRvY3VtZW50LndyaXRlIjthOjExOntpOjA7aToxMDtzOjEzOiJhdE9wdGlvbnMgPSB7IjthOjI6e2k6MDtpOjEwO3M6MjE6In5cL1x3ezMyfVwvaW52b2tlLmpzfiI7YToyOntpOjA7czo0MjoiaW5qZWN0ZWQucG90ZW50aWFsbHlfdW53YW50ZWRfYWRzdGVycmEuMDAxIjtpOjE7aToxMTt9fXM6NDI6IiUyRiU2NyU2RiU2RiU2NyU2QyU2NSUyRSU2QSU3MyUyMiUyOSUwQSUyMCI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2RvY3VtZW50LjAwOSI7aToxO3M6MjM5OiJ+ZG9jdW1lbnQud3JpdGVcKFxzKnVuZXNjYXBlXChccyouJyUzQyUyMSU0NCU0RiU0MyU1NCU1OS4qPyUyQyUyMCUyMiU2OCU3NCU3NCU3MCUzQSUyRiUyRltcdyVdKj8lMkYlNjclNkYlNkYlNjclNkMlNjUlMkUlNkElNzMlMjIlMjklMEElMjBbXlwpXSo/JTY4JTY1JTYxJTY0JTNFJTBBJTBBJTNDJTYyJTZGJTY0JTc5JTNFJTBBJTNDJTJGJTYyJTZGJTY0JTc5JTNFJTBBJTNDJTJGJTY4JTc0JTZEJTZDJTNFLlwpXCk7fiI7fXM6MTIyOiJkb2N1bWVudC53cml0ZSggdW5lc2NhcGUoICclM0MlMjElNDQlNEYlNDMlNTQlNTklNTAlNDUlMjAlNDglNTQlNEQlNEMlMjAlNTAlNTUlNDIlNEMlNDklNDMlMjAlMjIlMkQlMkYlMkYlNTclMzMlNDMlMkYlMkYlNCI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2RvY3VtZW50LjAxMCI7aToxO3M6MTAzOiJ+ZG9jdW1lbnQud3JpdGVcKFxzKnVuZXNjYXBlXChccyouJTNDJTIxJTQ0JTRGJTQzJTU0JTU5JTUwJTQ1JTIwW147XSs5JTNFJTBBJTNDJTJGJTY4JTc0JTZEJTZDJTMuXClcKTt+Ijt9czoxODA6ImRvY3VtZW50LndyaXRlKHVuZXNjYXBlKCclM0MlNzMlNjMlNzIlNjklNzAlNzQlMjAlNzMlNzIlNjMlM0QlMjIlNjglNzQlNzQlNzAlM0ElMkYlMkYlNkElNzMlMkQlNkYlMkQlNjQlNjYlNzklNzElNjclNzUlMkUlNjMlN0ElMkUlNjMlNjMlMkYlMzMlMzklMjIlM0UlM0MlMkYlNzMlNjMlNzIlNjklNzAlNzQlM0UnKSI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2RvY3VtZW50LjAwOCI7aToxO2k6MTI7fXM6NzI6Ij9waHAud2FyL21vYy5uaWJldHNhcC8vOnB0dGgiPWNycyB0cGlyY3M8Jy5zcGxpdCgiIikucmV2ZXJzZSgpLmpvaW4oIiIpKSI7YToyOntpOjA7czoyMDoiYmFja2Rvb3IuanNfZXZhbC4wMDEiO2k6MTtzOjExNjoifmRvY3VtZW50LndyaXRlLi4+dHBpcmNzXC88Pi5cdys9aVw/cGhwLndhclwvbW9jLm5pYmV0c2FwLi46cHR0aC49Y3JzIHRwaXJjczwuLnNwbGl0XCgiIlwpLnJldmVyc2VcKFwpLmpvaW5cKCIiXClcKX4iO31zOjc1OiJkb2N1bWVudC53cml0ZShTdHJpbmcuZnJvbUNoYXJDb2RlKDYwLCAxMTUsIDk5LCAxMTQsIDEwNSwgMTEyLCAxMTYsIDMyLCAxMTUiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmpzX21hbHdhcmUuMDA5IjtpOjE7czo2NjoifmRvY3VtZW50XC53cml0ZVwoU3RyaW5nXC5mcm9tQ2hhckNvZGVcKDYwLCAxMTUsW15cKV0rXClbXHNdKlwpOz9+Ijt9czoxNToiZG9jdW1lbnQud3JpdGUoIjthOjI6e2k6MDtzOjMxOiJpbmplY3RlZC5qc19jcmVhdGVfZG9jdW1lbnQuMDExIjtpOjE7aToxMTt9czo2NDoiIjsgZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoIiUzQ3NjcmlwdCBzcmM9JyIrbG9jYXRpb24ucHJvdG9jb2wrIiI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2RvY3VtZW50LjAyMyI7aToxO2k6MTE7fXM6MzM6In1jPXVuZXNjYXBlKGIpO2RvY3VtZW50LndyaXRlKGMpOyI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2RvY3VtZW50LjAxMyI7aToxO2k6MTE7fXM6NjE6ImZ1bmN0aW9uIGdldENvb2tpZShlKXt2YXIgVT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmpzX21hbHdhcmUuMDA4IjtpOjE7czo3NzoifmZ1bmN0aW9uIGdldENvb2tpZVwoZVwpXHtbXjpdKzpbXjpdKzp2b2lkW1xzXSpbXGRdK1x9W1xzXSp2YXIgc3JjW15cfV0rXClcfX4iO319czoyOToiZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUiO2E6Nzp7aTowO2k6MTA7czoyNDoiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlIjthOjk6e2k6MDtpOjEwO3M6MzE6IlsiRG9tYWluIl0gPSBsb2NhdGlvbi5ob3N0bmFtZTsiO2E6Mjp7aTowO2k6MTA7czoxMjU6IltbbnVsbCwgImF0b2IiXSwgW251bGwsICJidG9hIl0sIFtudWxsLCAic2V0SW50ZXJ2YWwiXSwgWyJKU09OIiwgInN0cmluZ2lmeSJdLCBbbnVsbCwgIlJlZ0V4cCJdLCBbbnVsbCwgImVuY29kZVVSSUNvbXBvbmVudCJdIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjExNCI7aToxO3M6MTgyOiJ+dmFyIFtcd1wkXStbXHNdKj1bXHNdKlx7W1xzXSpbXHddK1tcc10qOltcc10qZnVuY3Rpb25cKFwpW1xzXSpce1tcc10qdmFyIFtcd10rW1xzXSo9W1xzXSpcW1xbbnVsbCxbXHNdKi5hdG9iLlxdLFtcc10qXFtudWxsLFtcc10qLmJ0b2FbXlx4MDJdK2FIUjBjW15cfV0rXH07W1xzXSpbXHdcJF0rXC5bXHddK1woXCk7fiI7fX1zOjUwOiJkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShTdHJpbmcuZnJvbUNoYXJDb2RlKCI7YToyOntpOjA7aToxMDtzOjMzOiJjcmVhdGVFbGVtZW50KFN0cmluZy5mcm9tQ2hhckNvZGUiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLm1hc3NfaW5qZWN0aW9uLjAwMSI7aToxO3M6MTkzOiJ+dmFyIFtcd10rW1xzXSo9W1xzXSpTdHJpbmdcLmZyb21DaGFyQ29kZVwoW1xkXStbXlx9XStkb2N1bWVudFwuY3VycmVudFNjcmlwdFwpO1tcc10qXH1bXHNdKmVsc2VbXHNdKlx7W1xzXSpbXHddK1wuZ2V0RWxlbWVudHNCeVRhZ05hbWVcKFN0cmluZ1wuZnJvbUNoYXJDb2RlW15cfV0rY2hpbGROb2Rlc1xbW1xkXStcXVwpO1tcc10qXH1+Ijt9fXM6NjoiKSArICcvIjthOjI6e2k6MDtpOjEwO3M6NTY6Ii5zcmMgPSAoJ2h0dHBzOicgPT0gZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2wgPyAnaHR0cHM6IjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5qc19yZWRpcmVjdC4wNDEiO2k6MTtzOjEyNzoifltcd10rW1xzXSo9W1xzXSpbXGRdKztbXHNdKlwoZnVuY3Rpb25cKFwpW1xzXSpce1tcc10qdmFyIFtcd10rW1xzXSo9W1xzXSpkb2N1bWVudFwuY3JlYXRlRWxlbWVudFwoLnNjcmlwdFteXH1dK1x9W1xzXSpcKVwoXCk7fiI7fX1zOjIwOiJsbWNTY3IoInNjcmVlbi1vYmoiLCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wODEiO2k6MTtzOjE3NDoifihpZlwoXChuZXcgUmVnRXhwW15cKV0rb25lcGFnZVteXCldK1wpK1wudGVzdFwod2luZG93XC5sb2NhdGlvblwpXClbXHNdKlx7KXxmdW5jdGlvbiBpTUN3T1woXClbXjxdK3NldFRpbWVvdXRcKGZ1bmN0aW9uXChcKVtcc10qXHtbXHNdKmxtY1NjcltePF0rTWF0aFwucmFuZG9tXChcKVwpO1tcc1x9XSt+Ijt9czoyNjI6In4odmFyIFtcd10rW1xzXSo9W1xzXSpTdHJpbmdcLmZyb21DaGFyQ29kZVwoW15cKV0rXCk7W1xzXSopezQsfXZhciBbXHddK1tcc10qPVtcc10qZG9jdW1lbnRcLmNyZWF0ZUVsZW1lbnRcKFtcd10rXCk7W1xzXSpbXHddXC50eXBlW147XSs7W1xzXSp2YXJbXHNdKltcd10rW1xzXSo9W1xzXSpkb2N1bWVudFwuZ2V0RWxlbWVudHNCeVRhZ05hbWVcKFteO10rXF07W1xzXSpbXHddK1wucGFyZW50Tm9kZVwuaW5zZXJ0QmVmb3JlXChbXHddLFtcc10qW1x3XVwpO34iO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjAyOCI7aToxO3M6MjYyOiJ+KHZhciBbXHddK1tcc10qPVtcc10qU3RyaW5nXC5mcm9tQ2hhckNvZGVcKFteXCldK1wpO1tcc10qKXs0LH12YXIgW1x3XStbXHNdKj1bXHNdKmRvY3VtZW50XC5jcmVhdGVFbGVtZW50XChbXHddK1wpO1tcc10qW1x3XVwudHlwZVteO10rO1tcc10qdmFyW1xzXSpbXHddK1tcc10qPVtcc10qZG9jdW1lbnRcLmdldEVsZW1lbnRzQnlUYWdOYW1lXChbXjtdK1xdO1tcc10qW1x3XStcLnBhcmVudE5vZGVcLmluc2VydEJlZm9yZVwoW1x3XSxbXHNdKltcd11cKTt+Ijt9czoxOTY6In5cKGZ1bmN0aW9uXChcKVx7dmFyIC49bmF2aWdhdG9yXFsuXCgiW14iXSsiXClcXTt2YXIgLj1kb2N1bWVudFxbLlwoIlteIl0rIlwpXF07aWZcKC5cKC4sLlwoIlteIl0rIlwpXCkmJiEuXCguLC5cKCJbXiJdKyJcKVwpXClce2lmXCghLlwoLiwuXCgiW14iXSsiXClcKVwpXHt2YXIgLj1kb2N1bWVudFwuY3JlYXRlRWxlbWVudFwoLnNjcmlwdH4iO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLmpzX2NyZWF0ZV9lbGVtZW50LjAwOSI7aToxO3M6MjMwOiJ+XChmdW5jdGlvblwoXClce3ZhciAuPW5hdmlnYXRvclxbLlwoIlteIl0rIlwpXF07dmFyIC49ZG9jdW1lbnRcWy5cKCJbXiJdKyJcKVxdO2lmXCguXCguLC5cKCJbXiJdKyJcKVwpJiYhLlwoLiwuXCgiW14iXSsiXClcKVwpXHtpZlwoIS5cKC4sLlwoIlteIl0rIlwpXClcKVx7dmFyIC49ZG9jdW1lbnRcLmNyZWF0ZUVsZW1lbnRcKC5zY3JpcHRbXlwoXStcKCdbXiddKy5cKTtbXjpdK1x9XH1cKVwoXCk7fiI7fXM6MTAzOiIvYXBwL21ldHJpY3MuanMnO3ZhciBzPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKVswXTtzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHBvLHMpO30pKCk7IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjEyOCI7aToxO3M6MTU0OiJ+XChmdW5jdGlvblwoXClbXHNdKlx7W1xzXSp2YXIgW1x3XStbXHNdKj1bXHNdKmRvY3VtZW50XC5jcmVhdGVFbGVtZW50Li5zY3JpcHQuLjtbXHNdKltcd10rXC50eXBlW148XSthcHAubWV0cmljc1wuanNbXlx9XStpbnNlcnRCZWZvcmVbXlx9XStcfVtcc1wpXChdKzt+Ijt9czoyMToiPCEtLSBIaXRUYWlsIENvZGUgLS0+IjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5qc191bndhbnRlZF9hZHMuMDE4IjtpOjE7czoxNDQ6In48IS0tIEhpdFRhaWwgQ29kZSAtLT5ccyo8c2NyaXB0W14+XSo+XHMqXChmdW5jdGlvbi4uXHtccyp2YXIgaHRbXjw+XStcLmhpdHRhaWxcLmNvbVwvbWx0XC5qc1tePD5dK2luc2VydEJlZm9yZVwoaHQsXHMqc1wpO31cKVwoXCk7XHMqPC5zY3JpcHQ+fiI7fX1zOjQ4OiIuc3JjLnJlcGxhY2Uod2luZG93LmF0b2IoJ1oyOXZaMnhsTFdGdVlXeDVkR2xqY3kiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDczIjtpOjE7czoyMjQ6In5cKGZ1bmN0aW9uXChcKVtcc10qXHtbXHNdKnZhciBbXHddK1tcc10qPVtcc10qZG9jdW1lbnRcLmNyZWF0ZUVsZW1lbnRcKC5zY3JpcHQuXCk7W146XStodHRwcz86Lltcc10qPT1bXHNdKmRvY3VtZW50XC5sb2NhdGlvblwucHJvdG9jb2xbXjtdKztbXHNdKltcd10rXC5zcmNbXHNdKj1bXHNdKltcd10rXC5zcmNcLnJlcGxhY2VcKHdpbmRvd1wuYXRvYlwoLloyOVteXH1dK1tcfVwoXCldKzt+Ijt9czo3MDoiOmJ0b2EobG9jYXRpb24uaG9zdG5hbWUuc3BsaXQoJy4nKS5zbGljZSgwKS5qb2luKCdfJykgIHx8ICdub2RvbWFpbicpLCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wODQiO2k6MTtzOjIzMjoifmlmW1xzXSpcKFtcc10qdHlwZW9mW1xzXSpbXHddK1tcc10qPT1bXHNdKi51bmRlZmluZWQuXClbXHNdKlx7W1xzXSp2YXJbXHNdKltcd10rW1xzXSo9W1xzXSpce1tcc10qW1x3XSs6YnRvYVwobG9jYXRpb25cLnRvU3RyaW5nXChcKVwpLFteJl0rdmFyIGRhdGFbXHNdKj1bXlx9XSt1cmwsW1xzXSpkYXRhLFtcc10qaXNfZXZhbCxbXHNdKmlzX3N5bmNcKTtbXHNcfV0rW1x3XStbXlwpXStcKTtbXHNcfV0rfiI7fXM6Njk6Iil9d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpey0xIT1sb2NhdGlvbi5ocmVmLnNlYXJjaCgnJykmJnNldEludGVydmFsKCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xMDIiO2k6MTtzOjE0MzoifmZ1bmN0aW9uIFtcd10rXChcKVtcc10qXHtbXHNdKkFycmF5XC5mcm9tXChkb2N1bWVudFwuZ2V0RWxlbWVudHNCeVRhZ05hbWVcKC5pbnB1dFtePF0rLTEhPWxvY2F0aW9uXC5ocmVmXC5zZWFyY2hcKC4uXCkmJnNldEludGVydmFsW15cfV0rXH07P34iO31zOjg5OiJHVE0uc3JjID0gYXRvYihHb29nbGVfVG9rZW4pOyAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChHVE0pOyI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuZmFrZV9ob3RqYXIuMDAxIjtpOjE7czoxMTM6In5cKGZ1bmN0aW9uXChoLG8sdCxqLGEsclwpW1xzXSpce1tePl0rR1RNXC5zcmNbXHNdKj1bXHNdKmF0b2JcKEdvb2dsZV9Ub2tlblwpO1tcc10qZG9jdW1lbnRcLmdldEVsZW1lbnRzW147XStcKTt+Ijt9czo0MToiYXV0aG9yaXplbmV0X2NjX251bWJlciIpLnZhbHVlLnRvU3RyaW5nKCkiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDg2IjtpOjE7czo0MDE6In48c2NyaXB0W15cfV0rZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWRcKC5iaWxsaW5nOlteXCldK1wpXC52YWx1ZVwudG9TdHJpbmdcKFwpW157XStjYXRjaFwoW1x3XStcKVx7W14mXStnZXRFbGVtZW50QnlJZFwoLmF1dGhvcml6ZW5ldF9jY19udW1iZXJbXlx9XStcfVtcc10qY2F0Y2hcKFtcd10rXClce1x9W1xzXSp2YXJbXHNdKltcd10rW1xzXSo9W1xzXSpkb2N1bWVudC5jcmVhdGVFbGVtZW50XChbXlx7XStmdW5jdGlvbltcc10qW1x3XStcKFwpXHtbXHNdKnRyeVx7W1xzXSpkb2N1bWVudFwuZ2V0RWxlbWVudEJ5SWRcKFteXH1dK1tcc10qXH1bXHNdKmNhdGNoXChbXHddK1wpXHtcfVtcc10qXH07W1xzXSp3aW5kb3dcLnNldEludGVydmFsXChbXHddKyxbXHNdKltcZF0qXCk7W1xzXSo8LnNjcmlwdD5+Ijt9fXM6MTM6Ii5hcHBlbmRDaGlsZCgiO2E6NTp7aTowO2k6MTA7czozMzoiZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7IjthOjU6e2k6MDtpOjEwO3M6NjoiYXRvYignIjthOjQ6e2k6MDtpOjEwO3M6NToiYUhSMGMiO2E6Mjp7aTowO2k6MTA7czoxNDM6In52YXIgW1x3XStbXHNdKj1bXHNdKmRvY3VtZW50XC5jcmVhdGVFbGVtZW50XCguc2NyaXB0LlwpO1tcc10qW1x3XStcLnNyY1tcc10qPVtcc10qYXRvYlwoLmFIUjBjW147XStcKTtbXHNdKmRvY3VtZW50W147XSthcHBlbmRDaGlsZFwoW1x3XStcKTt+IjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5qc19hcHBlbmRDaGlsZC4wMDkiO2k6MTtzOjE0MzoifnZhciBbXHddK1tcc10qPVtcc10qZG9jdW1lbnRcLmNyZWF0ZUVsZW1lbnRcKC5zY3JpcHQuXCk7W1xzXSpbXHddK1wuc3JjW1xzXSo9W1xzXSphdG9iXCguYUhSMGNbXjtdK1wpO1tcc10qZG9jdW1lbnRbXjtdK2FwcGVuZENoaWxkXChbXHddK1wpO34iO319czoxMzoibG9jYXRpb24uaHJlZiI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wODUiO2k6MTtzOjEyNjoifmlmW1xzXSpcKFtcc10qW15cKV0rXChbXlwoXSphdG9iXChbXlx7XStce1tcc10qdmFyIFtcd10rW1xzXSo9W1xzXSpkb2N1bWVudFwuY3JlYXRlRWxlbWVudFteXH1dK2FwcGVuZENoaWxkXChbXHddK1wpO1tcc10qXH1+Ijt9czo2Mjoic2NyaXB0LnNyYyA9IHVybDsgaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpOyB9IGxvYWRTY3JpcHQoYXRvYigiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTQ3IjtpOjE7czo5MjoifmZ1bmN0aW9uIGxvYWRTY3JpcHRcKHVybFwpW1xzXSpce1tcc10qdmFyIGhlYWRbXlx9XStcfVtcc10qbG9hZFNjcmlwdFwoYXRvYlwoW147XStcKTtbXHNdKn4iO319czo1ODoidmFyIGV2ZW50c0xpc3RlbmVyUG9vbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOyI7YToyOntpOjA7aToxMDtzOjczOiJkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYm9keScpWzBdLmFwcGVuZENoaWxkKGV2ZW50c0xpc3RlbmVyUG9vbCk7IjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5qc19hcHBlbmRDaGlsZC4wMTAiO2k6MTtzOjIxNToifnZhciBldmVudHNMaXN0ZW5lclBvb2xbXHNdKj1bXHNdKmRvY3VtZW50XC5jcmVhdGVFbGVtZW50XCguc2NyaXB0LlwpO1tcc10qZXZlbnRzTGlzdGVuZXJQb29sW147XSs7W1xzXSpldmVudHNMaXN0ZW5lclBvb2xbXjtdKztbXHNdKmRvY3VtZW50XC5nZXRFbGVtZW50c0J5VGFnTmFtZVwoLmJvZHkuXClcWzBcXVwuYXBwZW5kQ2hpbGRcKGV2ZW50c0xpc3RlbmVyUG9vbFwpO34iO319czozNjoiaWYoIXdpbmRvdy5SUiAmJiAhd2luZG93LmJlbnMpe2JlbnM9IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA5NSI7aToxO3M6MTEzOiJ+aWZcKCF3aW5kb3dcLlJSICYmICF3aW5kb3dcLmJlbnNcKVx7YmVucz1bXGRdKztjb25zdCBbXHddKz1kb2N1bWVudFwuY3JlYXRlRWxlbWVudFteXH1dK2FwcGVuZENoaWxkXChbXlx9XStcfTs/fiI7fXM6MzA6Il0uam9pbignLicpXS5qb2luKCcvJykudHJpbSgpOyI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDM4IjtpOjE7czoxNzk6In52YXIgczJbXHNdKj1bXHNdKmRvY3VtZW50XC5jcmVhdGVFbGVtZW50XCguc2NyaXB0LlwpO1teO10rO1tcc10qczJcLnNldEF0dHJpYnV0ZVwoLnNyYy4sW1xzXSpbXHddK1wpO1tcc10qZG9jdW1lbnRcLmdldEVsZW1lbnRzQnlUYWdOYW1lXCguaGVhZC5cKVwuaXRlbVwoMFwpXC5hcHBlbmRDaGlsZFwoczJcKTt+Ijt9fXM6MTE6IihmdW5jdGlvbigpIjthOjQ6e2k6MDtpOjEwO3M6MjA6Ii5zZW5kKG51bGwpfWZ1bmN0aW9uIjthOjI6e2k6MDtpOjEwO3M6Mjg6IndpbmRvdy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIiO2E6Mjp7aTowO2k6MTA7czo4OiI9WzI2LDI2LCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xMTkiO2k6MTtzOjI4NToifmZ1bmN0aW9uIFtcd10rXChcKVtcc10qXHtbXHNdKltcc10qW1x3XStbXHNdKj1bXjtdKztbXHNdKnZhciBbXHddK1tcc10qPVtcc10qbmV3IEltYWdlW147XSo7W1xzXSpPYmplY3RcLmRlZmluZVByb3BlcnR5XChbXHddKyxbXHNdKi5pZC4sW1xzXSpce1tcc10qZ2V0OmZ1bmN0aW9uXChcKVteXC9dK2Z1bmN0aW9uXChcKVx7dmFyIFtcd10rW1xzXSo9W1xzXSpcWzI2LDI2W148XSs8W1x3XStcLmxlbmd0aFtePl0rPi5bXClcfTtcc10rc2V0VGltZW91dFwoW1x3XStcKFwpLFtcc10qW1xkXStcKTt+Ijt9fX1zOjk5OiJ+XChmdW5jdGlvblwoXClbXHNdKlx7W1xzXSp2YXJbXlx9XStTdHJpbmdcLmZyb21DaGFyQ29kZVwoW15cfV0rYXBwZW5kQ2hpbGRcKFteXH1dK1x9W1xzXSpbXChcKTtdK34iO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLmpzX2NyZWF0ZV9lbGVtZW50LjAxMCI7aToxO3M6OTk6In5cKGZ1bmN0aW9uXChcKVtcc10qXHtbXHNdKnZhclteXH1dK1N0cmluZ1wuZnJvbUNoYXJDb2RlXChbXlx9XSthcHBlbmRDaGlsZFwoW15cfV0rXH1bXHNdKltcKFwpO10rfiI7fXM6Nzc6Iil9d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpey0xIT1sb2NhdGlvbi5ocmVmLnNlYXJjaCgnY2hlY2tvdXQnKSYmc2V0SW50ZXJ2YWwoIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjEyMyI7aToxO3M6MzE1OiJ+ZnVuY3Rpb24gW1x3XStcKFwpW1xzXSpce1tcc10qQXJyYXlcLmZyb21cKGRvY3VtZW50XC5nZXRFbGVtZW50c0J5VGFnTmFtZVwoLmlucHV0LlwpXClcLmZvckVhY2hcKGZ1bmN0aW9uXCguLC5cKVx7W1xzXSpudWxsW1xzXSo9PVtcc10qLlwuZ2V0QXR0cmlidXRlXCgub25jaGFuZ2VbXiFdKyE9LlwubmFtZVwubGVuZ3RoW15cfV0rYXBwZW5kQ2hpbGRcKC5cKVx9W1xzXSp3aW5kb3dcLm9ubG9hZFtcc10qPVtcc10qZnVuY3Rpb25cKFwpW1xzXSpce1tcc10qLVtcZF0rIT1sb2NhdGlvblwuaHJlZlwuc2VhcmNoXCguY2hlY2tvdXRbXlx9XStcKVx9O34iO319czoxMDoiLnNyYz1hdG9iKCI7YTozOntpOjA7aToxMDtzOjI2OiJsb2NhdGlvbi5ocmVmLnNlYXJjaChhdG9iKCI7YToyOntpOjA7aToxMDtzOjQyOiJ+XClcKVtcc10qIT1bXHNdKi0xW1xzXSpcKVtcc10qXHtbXHNdKnZhcn4iO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLmpzX2FwcGVuZENoaWxkLjAwMi4wMiI7aToxO3M6MTQzOiJ+aWZbXHNdKlwoW1xzXSpsb2NhdGlvblwuaHJlZlwuc2VhcmNoW1xzXSpcKFtcc10qYXRvYltcc10qXChbXHNdKi5bXlx9XSthcHBlbmRDaGlsZFwoW1x3XStcKTs/W1xzXSpcfTs/W1xzXSoodmFyIFtcd10rW1xzXSo9W1xzXSpcKFteXCldK1wpOyk/fiI7fX1zOjIyOiIuaW5jbHVkZXMoYXRvYignWTJGeWRBIjthOjI6e2k6MDtpOjEwO3M6Mjc6Ii5pbmNsdWRlcyhhdG9iKCdZMmhsWTJ0dmRYUSI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuanNfYXBwZW5kQ2hpbGQuMDEzIjtpOjE7czoxNTM6In52YXJbXHNdKltcd109ZG9jdW1lbnRcLmxvY2F0aW9uXC5wYXRobmFtZTtbXHNdKmlmXChbXHddKyYmW1xzXSpbXHddK1wuaW5jbHVkZXNcKGF0b2JcKC5ZMmhsWTJ0dmRYUS5cKVwpW15cfV0rXCk7ZG9jdW1lbnRcLmJvZHlcLmFwcGVuZENoaWxkXChbXHddK1wpO1x9fiI7fX19czo1NzoiZ2V0RWxlbWVudHNCeVRhZ05hbWUoU3RyaW5nLmZyb21DaGFyQ29kZSgxMDQsMTAxLDk3LDEwMCkpIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5tYXNzX2luamVjdGlvbi4wMDIiO2k6MTtzOjExNDoifmlmW1xzXSpcKGRvY3VtZW50XC5oZWFkXClbXHNdKlx7W1xzXSp2YXIgW1x3XStbXHNdKj1bXlx9XSs5NyxbXHNdKjEwMFwpXClcW1tcZF0rXF1cLmFwcGVuZENoaWxkXChbXHddK1wpO1tcc10qXH1+Ijt9fXM6MTA6IkdldENDSW5mbzoiO2E6Mzp7aTowO2k6MTA7czoxODoidmFyIEpTT049SlNPTnx8e307IjthOjI6e2k6MDtpOjEwO3M6Mzc6InZhciBKU09OPUpTT058fHt9O0pTT04uc3RyaW5naWZ5PUpTT04iO2E6Mjp7aTowO3M6MjY6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDY1LjAyIjtpOjE7czoyMTU6In52YXIgSlNPTj1KU09OXHxcfFx7XH07W1xzXSpKU09OXC5zdHJpbmdpZnlbXlwvXStHYXRlOlteLF0rLFtcc10qRGF0YTpbXHNdKlx7XH1bXlw/XStcP2hhc2hbXj5dKz4+W14jXStpZlwoZG9jdW1lbnRcLmdldEVsZW1lbnRCeUlkXChcJFtcd10rXC5DVlZcKVwpW1xzXSpkb2N1bWVudFwuZ2V0RWxlbWVudEJ5SWRcKFwkW1x3XStcLkNWVlwpXC52YWx1ZVteO10rO1tcc1x9XSt+Ijt9fXM6MTE6InZhciBoZXhfY2hyIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA2NSI7aToxO3M6MTU1OiJ+XChmdW5jdGlvblwoXClbXHNdKlx7W1xzXSpmdW5jdGlvblteXF5dK1teVl0rWWVhcjpbXixdKyxbXHNdKkNWVjpbXixdKyxbXHNdKkdhdGU6W15ceDAyXStkb2N1bWVudFwuZ2V0RWxlbWVudEJ5SWRcKFwkLlwuQ1ZWXClcLnZhbHVlW1xzXSo9W1xzXSoiIjtbXHNcfV0rfiI7fX1zOjQwOiJ3aW5kb3cubG9jYXRpb24uc2VhcmNoLnJlcGxhY2UoJz8nLCAnJicpIjthOjM6e2k6MDtpOjEwO3M6MzU6Ii5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JylbMF07IjthOjI6e2k6MDtpOjEwO3M6NTU6IiZkZWZhdWx0X2tleXdvcmQ9JyArIGVuY29kZVVSSUNvbXBvbmVudChkb2N1bWVudC50aXRsZSkiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjAzNCI7aToxO3M6MjI0OiJ+dmFyIFtcd10rW1xzXSo9W1xzXSpkb2N1bWVudCxbXHNdKltcd10rW1xzXSo9W1xzXSpbXHddK1wuZ2V0RWxlbWVudHNCeVRhZ05hbWVcKC5zY3JpcHRbXjtdKztbXHNdKnZhciBbXHddK1tcc10qPVtcc10qW1x3XStcLmNyZWF0ZUVsZW1lbnRcKC5zY3JpcHQuXCk7W148XStpbmRleE9mXCguaHR0cHM/Oi5cKVtcc10qPStbXHNdKjBbXHNdKlwpW1xzXSpce1tcc10qYWxlcnRcKFteXH1dK1x9fiI7fX1zOjU1OiImZGVmYXVsdF9rZXl3b3JkPScgKyBlbmNvZGVVUklDb21wb25lbnQoZG9jdW1lbnQudGl0bGUpIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjEwOCI7aToxO3M6MTExOiJ+aWZbXHNdKlwoZG9jdW1lbnRcLmxvY2F0aW9uXC5wcm90b2NvbFtcc10qPT09W1xzXSouaHR0cHM6Lltcc10qJiZbXHNdKlteXHsmXSsmZGVmYXVsdF9rZXl3b3JkW15cfV0rXCk7W1xzXSpcfX4iO319czoyMDoid2luZG93LmxvY2F0aW9uLmhyZWYiO2E6Mzp7aTowO2k6MTA7czoyMjoiaWYocmVnZXhwLnRlc3Qod2hlcmUpKSI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDQyIjtpOjE7czoxMzM6In52YXIgcmVnZXhwW1xzXSo9W147XSs7W1xzXSp2YXIgd2hlcmVbXHNdKj1bXHNdKmRvY3VtZW50XC5bXjtdKztbXHNdKmlmXChyZWdleHBcLnRlc3RcKHdoZXJlXClcKVtcc10qXHtbXHNdKndpbmRvd1wubG9jYXRpb25bXlx9XStcfX4iO31zOjYzOiIuY29tJztkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKGUpO30iO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDQ1IjtpOjE7aToxMTt9fXM6NDI6IjxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW1nIHNyYz0iaHR0cCI7YToyOntpOjA7aToxMDtzOjEzOiJzcmM9YXRvYignTHk5IjthOjI6e2k6MDtpOjEwO3M6NzE6InM9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpWzBdO3MucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA2NiI7aToxO3M6MjQxOiJ+PHNwYW5bXHNdKnN0eWxlPS5kaXNwbGF5Om5vbmU7Lj48aW1nW1xzXSpzcmM9W149XStvbmxvYWRbXHNdKj0udmFyW1xzXSpbXHddK1tcc10qPVtcc10qZG9jdW1lbnRcLmNyZWF0ZUVsZW1lbnRcKC5zY3JpcHQuXCk7W1xzXSpbXHddK1wuc3JjW1xzXSo9W1xzXSphdG9iXCguTHk5W147XStcKTtbXHNdKnZhcltcc10qW1x3XStbXHNdKj1bXHNdKmRvY3VtZW50XC5nZXRFbGVtZW50c0J5VGFnTmFtZVtePl0rPjwuc3Bhbj5+Ijt9fX1zOjE1OiIvYWZ1LnBocD96b25laWQiO2E6Mjp7aTowO2k6MTA7czoyNjoic2RrLm9uUGVybWlzc2lvbkRlZmF1bHQoKCkiO2E6Mjp7aTowO2k6MTA7czo0NToiKG92ZXJsYXlUcmFuc2xhdGlvbnNbbmF2aWdhdG9yLmxhbmd1YWdlLnNsaWNlIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5qc191bndhbnRlZF9hZHMuMDE2IjtpOjE7czoxNzI6In5jb25zdCBvdmVybGF5VHJhbnNsYXRpb25zID0gXHsuZW4uOlx7LnRpdGxlW147XStcfTtbXHNdKmNvbnN0IG92ZXJsYXkgPSBcey5kZWxheS46W147XStcfTtbXHNdKmNvbnN0W1xzXSpbXHddK1tcc10qPVtcc10qZG9jdW1lbnRcLmNyZWF0ZUVsZW1lbnRbXjxdK2FwcGVuZENoaWxkXChbXHddK1wpO34iO319fXM6Mjc6Iihpc0Rlc2t0b3AoKSB8fCBpc01vYmlsZSgpKSI7YToyOntpOjA7aToxMDtzOjQ4OiIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIndwYWRtaW5iYXIiKSA9PT0gbnVsbCkiO2E6Mjp7aTowO2k6MTA7czoyMjoibG9jYXRpb24ucmVwbGFjZSgiaHR0cCI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDQwIjtpOjE7czoxOTc6In5cKGZ1bmN0aW9uW1xzXSpcKFwpW1xzXSpce1tcc10qaWZbXHNdKlwoZG9jdW1lbnRcLmdldEVsZW1lbnRCeUlkXCgud3BhZG1pbmJhci5cKVtcc10qPT09W1xzXSpudWxsXClbXHNdKlx7W1xzXSppZltcc10qXCh0eXBlb2ZbXHNdKnNldENvb2tpZVtePl0rbG9jYXRpb25cLnJlcGxhY2VcKC5odHRwW147XStcKTtbXHNcfV0rXClcKHRoaXNcKTt+Ijt9fX1zOjExOiInIiwgZGVsYXkpOyI7YToyOntpOjA7aToxMDtzOjQwOiJzZXRUaW1lb3V0KCJkb2N1bWVudC5sb2NhdGlvbi5ocmVmPSdodHRwIjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5qc19yZWRpcmVjdC4wMjMiO2k6MTtzOjYwOiJ+c2V0VGltZW91dFwoLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Lmh0dHBbXildKyciLCBkZWxheVwpO34iO319czo2MToiZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChzY3JpcHQpOyI7YToyOntpOjA7aToxMDtzOjE2OiJ5b3Vyc2VydmljZS5saXZlIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjEzOSI7aToxO3M6MTkwOiJ+dmFyIFtcd10rW1xzXSo9W1xzXSpkb2N1bWVudFwuY3JlYXRlRWxlbWVudFwoW15cKV0rXCk7W146XXsxMCwxNTB9XC5zcmNbXHNdKj1bXHNdKiJodHRwczouLnlvdXJzZXJ2aWNlXC5saXZlW147XSs7W15cKF0rZG9jdW1lbnRcLmdldEVsZW1lbnRzQnlUYWdOYW1lXCguaGVhZC5cKVxbMFxdXC5hcHBlbmRDaGlsZFwoW1x3XStcKTt+Ijt9fXM6NzY6IjxzY3JpcHQ+ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTCA9IHVuZXNjYXBlKCclM2MlNzQlNjklNzQlNmMlNjUlM2UiO2E6Mjp7aTowO3M6MzE6ImluamVjdGVkLmpzX2NyZWF0ZV9kb2N1bWVudC4wMTciO2k6MTtzOjExOToifjxzY3JpcHQ+ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTCA9IHVuZXNjYXBlXCgnJTNjJTc0JTY5JTc0JTZjJTY1JTNlJTQ4JTYxJTYzJTZiJTY1JTY0JTIwJTYyJVteO10rOzwuc2NyaXB0Pn4iO31zOjI4OiI8c2NyaXB0PmRvY3VtZW50LmxvY2F0aW9uPSgiIjthOjE6e2k6MDtzOjMxOiJpbmplY3RlZC5qc19jcmVhdGVfZG9jdW1lbnQuMDE1Ijt9czo1OToiZ2V0Q29va2llKGUpe3ZhciBVPWRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCIoPzpefDsiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLmpzX2Nvb2tpZV9oaWphY2suMDAyIjtpOjE7czoyMzM6In48c2NyaXB0W14+XSs+XHMqZnVuY3Rpb25ccypnZXRDb29raWVcKFteXD9dK1w/OlxeXHw7W146XSs6dm9pZFxzKlxkXH12YXJccypzcmM9LmRhdGE6dGV4dC5qYXZhc2NyaXB0O1xzKmJhc2U2NFwsXHcrPS4sbm93PU1hdGguXHMqZmxvb3JbXj5dKz49XCh0aW1lPWNvb2tpZVwpXHxcfHZvaWRbXlx7XStce3ZhclxzKnRpbWVbXjxdKzxzY3JpcHRccypzcmM9Li5cK3NyY1wrW15cfV0rXH1ccyo8LnNjcmlwdD5+Ijt9czo0MToiYW5kcm9pZHxiYlxkK3xtZWVnbykuK21vYmlsZXxhdmFudGdvfGJhZGEiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjAwNiI7aToxO3M6MTk4OiJ+aWZcKGRvY3VtZW50LmNvb2tpZS5pbmRleE9mXCgiX21hdXRodG9rZW4iXCk9PS0xW14iXSsiZ29vZ2xlYm90IlteXHxdK1x8YmIuZFwrLm1lZWdvXClcLi5tb2JpbGVbXlw9XSs9XHMqbmV3XHMqRGF0ZVteO10rO1xzKmRvY3VtZW50LmNvb2tpZVteO10rO1xzKnBhdGg9Li5leHBpcmVzPSJbXiddKydodHRwOi4uW15cP10rXD9cdytcJidcKTtcfX4iO31zOjY1OiJkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuaW5uZXJIVE1MID0gdW5lc2NhcGUoJyU0OCU2MSU2MyU2YiU2NSU2NCI7YToyOntpOjA7czoyMToiZGVmYWNlZC5oYWNrZWRfYnkuMDExIjtpOjE7czoxMDg6In48c2NyaXB0PmRvY3VtZW50XC5kb2N1bWVudEVsZW1lbnRcLmlubmVySFRNTFxzKlw9XHMqdW5lc2NhcGVcKC4oJVxkK1xzKik/JTYxJTYzJTZiJTY1JTY0W15cKV0rXCk7PC5zY3JpcHQ+fiI7fXM6NTI6InZhciB0cnlyZXBsYWNlc2hpdD1mdW5jdGlvbiB0cnlyZXBsYWNlc2hpdCh4KXtyZXR1cm4iO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDg3IjtpOjE7czoxODA6In5cKGZ1bmN0aW9uXChcKVx7dHJ5XHtkb2N1bWVudFwuZ2V0RWxlbWVudEJ5SWRcKFteXCldK1wpXC5yZW1vdmVcKFwpXH1bXHNdKmNhdGNoW15cfV0rXH1bXHNdKnZhcltcc10qZGVidWdbXjtdKztbXHNdKnZhciB0cnlyZXBsYWNlc2hpdFteJV0rJVwoXFswLTlbXlwrXStcK2V4ZGF5c1teXH1dK1x9XH1cKVwoXCk7fiI7fXM6NjU6IkNvb2tpZS5zZXQgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgZXhwaXJlcywgcGF0aCwgZG9tYWluLCBzZWN1cmUpIjthOjI6e2k6MDtzOjIyOiJpbmplY3RlZC5qc19pZnJhbWUuMDAyIjtpOjE7czoyNTE6In48ZGl2W1xzXSppZFtePl0rPjwuZGl2Pltcc10qPHNjcmlwdFtePl0rPltcc10qdmFyIENvb2tpZVtcc10qPVtcc10qbmV3IE9iamVjdFwoXCk7W1xzXSpDb29raWVcLnNldFtcc10qPVtcc10qZnVuY3Rpb25cKG5hbWUsIHZhbHVlLCBleHBpcmVzLCBwYXRoLCBkb21haW4sIHNlY3VyZVwpW1xzXSpce1tcc10qZG9jdW1lbnRcLmNvb2tpZVtePF0rPGlmcmFtZVteXH1dK0Nvb2tpZVwuc2V0W147XStcKTtbXHNdKlx9W1xzXSo8LnNjcmlwdD5+Ijt9czoyOToidmFyIGNyYXdsZXJBZ2VudFJlZ2V4ID0gL2JvdHwiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjAzNiI7aToxO3M6MTMwOiJ+dmFyW1xzXSpjcmF3bGVyQWdlbnRSZWdleFtcc10qPVtcc10qLmJvdFteO10rO1tcc10qaWZbXHNdKlwoY3Jhd2xlckFnZW50UmVnZXhcLnRlc3RcKG5hdmlnYXRvcltePF0rXC5sb2NhdGlvbltcc10qPVteXH1dK1tcc1x9XSt+Ijt9czo1MzoiJnV0bXA9IituKyImY29va2llPSIraigiU0VTU0lJRCIpKSxjb25zb2xlLmNsZWFyKCl9fX0iO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTIwIjtpOjE7czoxMjg6In5mdW5jdGlvbiBbXHddK1woW1x3XStcKVx7W1xzXSp2YXIgW1x3XStbXHNdKj1bXHNdKiJbXiJdKyJbXHNdKlwrW1xzXSpkb2N1bWVudFwuY29va2llW14jXSsmIzEwNFtePF0rY29uc29sZVwuY2xlYXJcKFwpW1x9XCk7XSt+Ijt9czo0MDoiaSsrKXN0cis9cmV0W2hlYWRbaV0tcmVzcG9uc2VdO3N0cj1hdG9iKCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xMjYiO2k6MTtzOjExMDoifnZhciBoZWFkW1xzXSo9XFtbXlxdXXsxMDAwLH1cXTtbXHNdKnZhciByZXRbXHNdKj1bXHNdKi4uLFtcc10qbGVuW15cfV0rXH1bXHNdKnJldFwrPWxlblteXH1dK3N0clwpO1x9Oz9bXHNdKn4iO31zOjE0OiJhZnUucGhwP3pvbmVpZCI7YToyOntpOjA7aToxMDtzOjMyOiJzZGsub25Ob3RpZmljYXRpb25VbnN1cHBvcnRlZCgoKSI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfdW53YW50ZWRfYWRzLjAxNi4wMiI7aToxO2k6MTE7fX1zOjM3OiJtLmpzP2Q9M1wiOyBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkIjthOjI6e2k6MDtzOjQzOiJpbmplY3RlZC5zZXJpYWxpemF0aW9uLnNjcmlwdF9pbmplY3Rpb24uMDAxIjtpOjE7aToxMTt9czo2MDoiZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGNoZWNrYm94IjthOjI6e2k6MDtzOjMxOiJpbmplY3RlZC5qc19jcmVhdGVfZG9jdW1lbnQuMDE0IjtpOjE7aToxMTt9czo0ODoiZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTCA9IHVuZXNjYXBlKCclIjthOjI6e2k6MDtzOjMxOiJpbmplY3RlZC5qc19jcmVhdGVfZG9jdW1lbnQuMDE2IjtpOjE7aToxMTt9czozNzoiZG9jdW1lbnQubG9jYXRpb249Imh0dHA6Ly9pbGhhYmVsZW5zZSI7YToyOntpOjA7czozMzoiaW5qZWN0ZWQuanNfZG9jdW1lbnRfbG9jYXRpb24uMDAxIjtpOjE7aToxMTt9fXM6ODoiY2hlY2tvdXQiO2E6MTY6e2k6MDtpOjEwO3M6NDU6ImRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJkZXZ0b29sc2NoYW5nZSI7YTozOntpOjA7aToxMDtzOjQyOiIpKyI/aW1hZ2VfaWQ9IitCYXNlNjRGdW5jdGlvbl9EU0hBVUpOS0FTRCgiO2E6Mjp7aTowO2k6MTA7czo3MToiKXtyZXR1cm4gYnRvYShlbmNvZGVVUklDb21wb25lbnQoZSkucmVwbGFjZSgvJShbMC05QS1GXXsyfSkvZyxmdW5jdGlvbigiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDc2IjtpOjE7czozOTc6In52YXIgW1x3XSs9IihpZHxuYW1lKSIsW1x3XSs9IihpZHxuYW1lKSIsW1x3XSs9W1xzXSpuZXdbXHNdKlJlZ0V4cFwoYXRvYlwoW14pXStcKSssW1xzXSpbXHddK1tcc10qPVtcc10qbmV3IFJlZ0V4cFwoYXRvYlwoW14pXStcKSssW1x3XSs9XHtcfVteO10rO1tcc10qZnVuY3Rpb25bXlx7XStce1tcc10qcmV0dXJuW1xzXSpidG9hXChlbmNvZGVVUklDb21wb25lbnRbXj5dK1wpXCsiXD9pbWFnZV9pZD0iXCtCYXNlNjRGdW5jdGlvbl9EU0hBVUpOS0FTRFwoW14+XStpbm5lcldpZHRoW1xzXSo+W1xzXSp0aHJlc2hvbGRbXlx9XStcKVtcc10qXH0sW1xzXSpbXGRdK1wpLFtcc10qInVuZGVmaW5lZFteO10rc2V0SW50ZXJ2YWxcKGZ1bmN0aW9uXChcKVx7W1x3XStcKFwpXH0sW1xzXSpbXGRdK1wpO34iO319czo0ODoib3BlbiYmL2NoZWNrb3V0Ly50ZXN0KHdpbmRvdy5sb2NhdGlvbikmJihvQ2FudmFzIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjExMiI7aToxO3M6MTE1OiJ+dmFyIG9DYW52YXM7W1xzXSpcKGZ1bmN0aW9uXChcKVtcc10qXHtbXHNdKnZhcltcc10qW1x3XStbXHNdKj1bXHNdKlx7W1xzXSpvcGVuOlteXG5dK2F0b2JcKFteXH1dK3RoaXNbXClcfV0rXChcKTt+Ijt9fXM6MjI6ImltZy5zcmMgPSB3aW5kb3cuYXRvYigiO2E6Mjp7aTowO2k6MTA7czo1OiJkYXRhPSI7YToyOntpOjA7aToxMDtzOjQ6ImxvYz0iO2E6Mjp7aTowO2k6MTA7czoyOToiKyB3aW5kb3cuYnRvYShsb2NhdGlvbi5ocmVmKTsiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDYyIjtpOjE7czo0NDc6In52YXIgX19kYXRhW1xkXStbXHNdKj1bXHNdKlteXHtdK2Z1bmN0aW9uIF9fcHJlbG9hZFwoXClbXHNdKlx7W1xzXSpzZXRUaW1lb3V0XChfX2xvYWQsW1xzXSpbXGRdK1wpO1tcc10qXH1bXHNdKmZ1bmN0aW9uIF9fbG9hZFwoXClbXHNdKlx7W1xzXSpzZXRJbnRlcnZhbFwoZ2V0RGF0YSxbXHNdKltcZF0rXCk7W1xzXSpcfVtcc10qZnVuY3Rpb24gZ2V0RGF0YVwoXClbXHNdKlx7W159XStcfVtcc10qX19kYXRhW1xkXStbXHNdKj1bXHNdKmRhdGE7W1xzXSpcfVtcc10qcmV0dXJuO1tcc10qXH1bXHNdKmZ1bmN0aW9uIF9fc2VuZFwoc3RyXClbXHNdKlx7W1xzXSppZltcc10qXCghLmNoZWNrb3V0W15fXStmdW5jdGlvbiBfX2lzVmFsaWRbXl9dK2Z1bmN0aW9uIF9fb251bmxvYWRbXl9dK2NvbnRlbnRMb2FkZWRcKHdpbmRvdyxbXHNdKl9fbG9hZFwpO1tcc10qX19vbnVubG9hZFwoXCk7fiI7fX19fXM6MTA6Ii5pbm5lckhUTUwiO2E6Mjp7aTowO2k6MTA7czoyMDoiZnVuY3Rpb24gaW5zZXJ0QWZ0ZXIiO2E6Mjp7aTowO2k6MTA7czoyNDoiQ2FyZCBWZXJpZmljYXRpb24gTnVtYmVyIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA4MiI7aToxO3M6Mjc4OiJ+ZnVuY3Rpb24gX2NoZWNrX3BcKFwpW1xzXSpce1tePF0rdHRcLmlubmVySFRNTFtcc10qPVteXH1dK3N0eWxlXC5kaXNwbGF5W1xzXSo9W1xzXSoubm9uZS47W15cfV0rW1xzXH1dK2lmW15cfV0rW1xzXH1dK3NldFRpbWVvdXRcKFtcc10qX2NoZWNrX3BbXjtdK1wpO1tcc10qXH1bXHNdKl9jaGVja19wXChcKTtbXHNdKmZ1bmN0aW9uIGluc2VydEFmdGVyW15cfV0rXH1bXHNdKihmdW5jdGlvbiBfcmVtb1woXClbXlx9XStcfVtcc10qc2V0VGltZW91dFteO10rO1tcc10qXH1bXHNdKik/fiI7fX19czoxOToiLnBocCIsYnVpbGREYXRhKCkpOyI7YToyOntpOjA7aToxMDtzOjU0OiJ2YXIgZm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjby1iaWxsaW5nLWZvcm0iKTsiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDY3IjtpOjE7czoyMTY6In5mdW5jdGlvbltcc10qYjY0RW5jb2RlVW5pY29kZVwoc3RyXClbXHNdKlx7W1xzXSpyZXR1cm4gYnRvYVtePF0rZnVuY3Rpb24gZ2V0QmlsbGluZ1woXClbXj5dK2lmW1xzXSpcKHBheW1lbnRbXHNdKiYmW1xzXSpwYXltZW50XC52YWx1ZVtcc10qIT1bXlx7XStce1tcc10qc2VuZFBvc3RbXjtdK2J1aWxkRGF0YVwoXClcKTtbXlx9XStbXHNcfV0rZWxzZVteXH1dK1tcc1x9XSs7fiI7fX1zOjE0OiJYTUxIdHRwUmVxdWVzdCI7YToyOntpOjA7aToxMDtzOjk6InBhcnNlSW50KCI7YToyOntpOjA7aToxMDtzOjEyOiJmdW5jdGlvbihfMHgiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTY2IjtpOjE7aToxMTt9fX1zOjM3OiJqYXZhc2NyaXB0IiBpZD0ibWFnX2dvb2dsZV9hbmFseXRpY3MiIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAxMiI7aToxO3M6Mjc2OiJ+PHNjcmlwdFxzdHlwZS4udGV4dC5qYXZhc2NyaXB0LlxzaWQ9Lm1hZ19nb29nbGVfYW5hbHl0aWNzLj5pZlxzXChcKG5ld1xzUmVnRXhwLi5vbmVwYWdlLmNoZWNrb3V0Lm9uZXN0ZS5bXlx7XStce1xzKmRvY3VtZW50LndyaXRlXCguLngzQ3NjcmlwdFxzc3JjLi5odHRwW146XSs6Li5bXlwuXStcLlteXC5dK1wuanMiXHNhc3luYz1bXj5dKz4ueDNDLnNjcmlwdD4uXCk7XHMqXH1cc1woZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZFwoLm1hZ19nb29nbGVbXjtdKztcczwuc2NyaXB0Ln4iO31zOjQwOiJpZigobmV3IFJlZ0V4cCgnb25lcGFnZXxjaGVja291dHxvbmVzdGVwIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAyOCI7aToxO3M6Nzc0OiJ+XDxzY3JpcHRccyp0eXBlXD0udGV4dFwvamF2YXNjcmlwdC5cPlxzKlw8XCFcLVwtXHMqdmFyXHMqXHcrXD1ce1xzKlx3K1w6bnVsbFwsXHMqXHcrXDouXGIoaHR0cHN8aHR0cClcYlw6XC9cL1x3K1wuXHcrXC9cdytbKD86XHdcL1x3XC9cd1wvXHdcLlx3KV0rLlwsXHMqbXlpZFw6XChmdW5jdGlvblwoXHcrXClce1xzKnZhclxzKm1hdGNoZXNcPWRvY3VtZW50XC5jb29raWVcLm1hdGNoW15cK10rXCtuYW1lXC5yZXBsYWNlXChbXj1dK1w9W14nXSsnXClcKVw7W15cfF0rXHxcfFwoZnVuY3Rpb25cKFwpXHtccyp2YXJccypcdytcPW5ld1xzKkRhdGVcKFwpXDtbXn1dK1x9XClcKFwpXCxccypjbGtcOmZ1bmN0aW9uXChcKVx7W15cOl0rXDpmdW5jdGlvblwoXClce1xzKnRyeVx7W15cfV0rXH1lbHNlXHtccypiXC5hdHRhY2hFdmVudFwoLm9uY2xpY2suXCxbXlx9XStcfVxzKlx9XHMqXH1ccyp2YXJccypcdytcPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGxbXlwhXStcIVw9bnVsbFwpXHtccyp2YXJccypcdytcPVteXDtdK1w7XHMqdmFyXHMqXHcrXD1idG9hW15cO10rXDtccyp2YXJccypodHRwXD1uZXdccypYTUxIdHRwUmVxdWVzdFwoXClcO1xzKmh0dHBcLm9wZW5cKC5QT1NULlteXDtdK1w7XHMqaHR0cFwuc2V0UmVxdWVzdEhlYWRlclwoW15cO10rXDtccypodHRwXC5zZW5kXChbXlw7XStcO1xzKlx9W15cfV0rXH1bXiddKy5vbmVwYWdlXHxjaGVja291dFx8b25lc3RlcC5cLC5naS5cKVwpW15cO10rXDtccypcfVxzKlwtXC1cPlxzKlw8XC9zY3JpcHRcPn4iO31zOjQxOiJpZighKGRvY3VtZW50LmNvb2tpZS5pbmRleE9mKCJ1c2VycGF5aWQiKSI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNDgiO2k6MTtzOjczOToifjxccypzY3JpcFtePl0rPlxzKmpbUXFddWVyeVxzKlwoKD86InwnKT9kb2N1bWVudCg/OiJ8Jyk/XHMqXClccypcLnJlYWR5XHMqXChmdW5jdGlvblxzKlwoXHMqXClccyp7XHMqaWZccypcKFxzKlwhXHMqXChccypkb2N1bWVudFwuY29va2llXC5pbmRleE9mXCgoPzoifCcpP3VzZXJwYXlpZCg/OiJ8Jyk/XHMqXClccypcK1xzKlxkK1xzKlwpXHMqXClccyp7XHMqalF1ZXJ5XChbXlxbXStcW1xzKm9uY2xpY2soPzpcXik/XHMqPVxzKlxcLig/OnNoaXBwaW5nfGNoZWNrb3V0fHBheW1lbnR8Y3Z2fG9yZGVyKT9bXn1dK31ccyp9XHMqXClccyo7XHMqZnVuY3Rpb25ccypcdytcKFxzKlwpXHMqe1xzKmlmXHMqXChcIVwoZG9jdW1lbnRcLmNvb2tpZVwuaW5kZXhPZlwoLnVzZXJwYXlpZC5cKVxzKlwrXHMqXGQrXClccypcKVxzKntccyp2YXJccypcdytccyo9XHMqZnVuY3Rpb25ccypcKFwpXHMqe1xzKltefV0rfVxzKjtccypkb2N1bWVudFwuY29va2llXHMqPVxzKi51c2VycGF5aWQ9LlxzKlwrXHMqcmFuZFxzKlwoXClccyo7XHMqdmFyXHMqXHcrXHMqPVxzKntccyoubG9jYXRpb24uXHMqLlxzKi5odHRwOlwvXC8uXHMqXCtccypsb2NhdGlvblwuaG9zdFxzKixccyoubWV0aG9kLlxzKjpccyouW1BwXWF5W1BwXWFsLlxzKn1ccyo7XHMqalF1ZXJ5XChsb2NhdGlvblwpXC5hdHRyXCguaHJlZi5ccyosXHMqYXRvYlxzKlwoW15cKV0rXClccypcK1xzKmJ0b2FcKFtefV0rfVxzKn1ccyo8XC9zY3JpcHQ+fiI7fXM6MzY6Imh0bWwoIiYjMTA0OyYjMTE2OyYjMTE2OyYjMTEyOyYjMTE1OyI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuZmFrZV9qcXVlcnkuMDA4IjtpOjE7czoxMzk6In48c2NyaXB0IHR5cGU9InRleHQuamF2YXNjcmlwdC4+alF1ZXJ5LmZ1bmN0aW9uW14mXSt3aW5kb3cubG9jYXRpb24uaHJlZiwuLm1hdGNoLi5vbmVwYWdlLmNoZWNrb3V0W14+XSs+Li4uaHRtbC4uKCYjW1xkXSs7KStbXjxdKzwuc2NyaXB0Pn4iO31zOjg6ImdyZWxvc192IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAwNSI7aToxO3M6MTI0OiJ+PHNjcmlwdCB0eXBlPSJ0ZXh0LmphdmFzY3JpcHRbXkBdK3ZhciBncmVsb3NfdlteQF0raWZcKFwobmV3IFJlZ0V4cFwoLm9uZXBhZ2VcfGNoZWNrb3V0XHxvbmVzdGVwW15cfV0rXH1ccyotLT5ccyo8LnNjcmlwdD5+Ijt9czo1MToiKSkudGVzdCh3aW5kb3cubG9jYXRpb24pKXsgalF1ZXJ5LmFqYXgoeyB1cmw6ICJodHRwIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjExMCI7aToxO3M6NzA6In5pZiBcKFwobmV3IFJlZ0V4cFwoLlteXCldKmNoZWNrb3V0W15cfV0rXH0sW1xzXSphc3luY1teXH1dK1tcfVwpXHNdK34iO31zOjE2Nzoib25lcGFnZXxjaGVja291dC9naSkmJih0KCJpbnB1dCwgc2VsZWN0IikuZWFjaChmdW5jdGlvbigpe3QodGhpcykudmFsKCk/cSs9IiYiK3QodGhpcykuYXR0cigibmFtZSIpKyI9Iit0KHRoaXMpLnZhbCgpOiIifSksdC5wb3N0KHQoIjxkaXYgLz4iKS5odG1sKCImIzEwNDsmIzExNjsmIzExNjsiO2E6MTp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDIyIjt9czozMDoibmV3IFJlZ0V4cCgiY2hlY2tvdXQiKS50ZXN0KG4pIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAyOSI7aToxO2k6MTE7fXM6MzU6In5zdGVwIGNoZWNrb3V0W1xzXXs1MCx9PHNjcmlwdCBzcmN+IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA4MyI7aToxO2k6MTE7fXM6MjQ6Im9uZXBhZ2V8Y2hlY2tvdXR8b25lc3RlcCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wOTciO2k6MTtpOjExO319czoyOiJceCI7YToxMTp7aTowO2k6MTA7czoxMDoid2luZG93W18weCI7YTo0OntpOjA7aToxMDtzOjE2OiJ9KShuYXZpZ2F0b3JbXzB4IjthOjI6e2k6MDtpOjEwO3M6Njc6IiJceDc0XHg2NVx4NzNceDc0IiwiXHg3M1x4NzVceDYyXHg3M1x4NzRceDcyIiwiXHg2N1x4NjVceDc0XHg1NFx4NjkiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjAyMiI7aToxO3M6ODc6In52YXIgXzB4W1x3XStbXHNdKj1bXHNdKlxbLi54Li4ueC4uLng2MS54NzUueDc0Lng2OFtePF0rXHxcfFtcc10qd2luZG93XFtfMHhbXlx9XStcKVx9fiI7fX1zOjE5OiJdKTtpZighZG9jdW1lbnRbXzB4IjthOjI6e2k6MDtpOjEwO3M6MzE6Ijt2YXIgbj0wO2Z1bmN0aW9uIGJvbSgpe3ZhciBfMHgiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDg5IjtpOjE7czo3NzoifnZhciBfMHhbXHddKz1cW1teO10rXF07W15ce10rZnVuY3Rpb24gYm9tXChcKVteXG5dK3NldEludGVydmFsXChib20sW1xkXStcKX4iO319czo4MToieDVGXFx4NjNcXHg2M1xceDVGXFx4NkZcXHg3N1xceDZFXFx4NjVcXHg3MlwiLFwiXFx4NDVcXHg3MlxceDcyXFx4NkZcXHg3MlxceDIwXCIsIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjEwMyI7aToxO3M6MTgwOiJ+dmFyIChbXHddKyxbXHNdKil7MjAsfVtcd10rO1tcc10qXChmdW5jdGlvblwoXClbXHNdKlx7W1xzXSp2YXIgW1x3XStbXHNdKj1bXHNdKlxbW15cXV17MTAwMCx9XF07W1xzXSpmdW5jdGlvbiBbXHddK1woW1x3XStcKVtcc10qXHtbXlxuXStzZXRUaW1lb3V0XChbXHddKyxbXHNdKltcZF0rW1wpXH1dK1woXCk7P34iO319czo1OiIuPSJceCI7YToyOntpOjA7aToxMDtzOjQ6Iik7QCQiO2E6Mjp7aTowO2k6MTA7czoyNDoiKTt9O2lmKGZ1bmN0aW9uX2V4aXN0cygkIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjE0MiI7aToxO3M6MTEyOiJ+KFwkW1x3XStcLj89IlteIl0rIjtbXHNdKil7Myx9W15cfV0rXH1lbHNlXHtbXlx9XStcfTtpZlwoZnVuY3Rpb25fZXhpc3RzW149XSs9QFwkW15cfV0rXH1lbHNlXHtbXlx9XSs7XH07W1xzXSp+Ijt9fX1zOjk4OiJceDZFXHg3NVx4NkNceDZDIiwiXHg3M1x4NjNceDcyXHg2OVx4NzBceDc0IiwiXHg2M1x4NzJceDY1XHg2MVx4NzRceDY1XHg0NVx4NkNceDY1XHg2RFx4NjVceDZFXHg3NCI7YToyOntpOjA7czozMDoiaW5qZWN0ZWQuanNfY3JlYXRlX2VsZW1lbnQuMDA1IjtpOjE7czoyNTg6In48c2NyaXBbXj5dKz5ccyp2YXJccyooXHcrKVxzKj1ccypcW1teXDJdK3g0Ny54NDUueDU0W15cMl0reDY4Lng3NC54NzQueDcwW147XSs7XHMqZnVuY3Rpb25ccypcdytcKChcdyspXClccyp7XHMqdmFyXHMqKFx3Kylccyo9XHMqbmV3XHMqWE1MSHR0cFJlcXVlc3RcKFwpXHMqO1xzKlwzXHMqXFtcMVxbXGQrXF1cXVtee10re1xzKlwoXHMqZnVuY3Rpb25cKFwpXHMqe1xzKnZhclxzKltefV0rfVxzKlwpXHMqXChccypcKVxzKn1ccyo8XC9zY3JpcHQ+fiI7fXM6MTE5OiJydD1bIlx4NkZceDZFXHg2Q1x4NkZceDYxXHg2NCIsIlx4NkNceDZGXHg2M1x4NjFceDc0XHg2OVx4NkZceDZFIiwiXHg3NFx4NjVceDczXHg3NCIsIlx4NjNceDY4XHg2NVx4NjNceDZCXHg2Rlx4NzVceDc0IiI7YToxOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wMjEiO31zOjEwMjoiLCJceDY4XHg3NFx4NzRceDcwXHgzQVx4MkZceDJGXHg2Q1x4NkZceDYxXHg2NFx4MkRceDZEXHg2NVx4MkVceDYzXHg2OFx4NjlceDYzXHg2Qlx4NjVceDZFXHg2Qlx4NjlceDZDIjthOjE6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAyMyI7fXM6NDE2OiJceDJFXHg3MFx4NjhceDcwIiwiXHg1MFx4NEZceDUzXHg1NCIsIlx4NjZceDZGXHg3Mlx4NkQiLCJceDczXHg2NVx4NzJceDY5XHg2MVx4NkNceDY5XHg3QVx4NjUiLCJceDYxXHg2QVx4NjFceDc4IiwiXHg2MVx4NjRceDY0XHg0NVx4NzZceDY1XHg2RVx4NzRceDRDXHg2OVx4NzNceDc0XHg2NVx4NkVceDY1XHg3MiIsIlx4NUJceDZGXHg2RVx4NjNceDZDXHg2OVx4NjNceDZCXHgzRFx4MjdceDYyXHg2OVx4NkNceDZDXHg2OVx4NkVceDY3XHgyRVx4NzNceDYxXHg3Nlx4NjVceDI4XHgyOVx4MjdceDVEIiwiXHg2M1x4NjhceDY1XHg2M1x4NkJceDZGXHg3NVx4NzRceDJEXHg3M1x4NzRceDY1XHg3MFx4MkRceDYyXHg2OVx4NkNceDZDXHg2OVx4NkVceDY3IiwiXHg2N1x4NjVceDc0XHg0NVx4NkNceDY1XHg2RFx4NjVceDZFXHg3NCI7YToxOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wMjQiO31zOjYwOiJceDc3XHg3OFx4NzlceDdhXHgzMFx4MzFceDMyXHgzM1x4MzRceDM1XHgzNlx4MzdceDM4XHgzOVx4MmIiO2E6MTp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDI1Ijt9czo1NDoiPHNjcmlwdD4gdmFyIF8weGVjNTU9WyJceDQ3XHg0NVx4NTQiLCJceDZGXHg3MFx4NjVceDZFIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAzMSI7aToxO3M6MTE3OiJ+PHNjcmlwdD5ccyp2YXJccypfMHhbXj1dKz1cWy4ueDQ3Lng0NS54NTQuLC4ueDZGLng3MC54NjVbXlxbXStcW18weFteXD9dK1w/XzB4W146XSs6YmxfcmF3XH12YXJccypfMHhbXjxdKzwuc2NyaXB0Pn4iO31zOjI1OiJmdW5jdGlvbigpe20rKzt6KCl9O2JbIlx4IjthOjI6e2k6MDtzOjMxOiJpbmplY3RlZC5qc19jcmVhdGVfZnVuY3Rpb24uMDEyIjtpOjE7aToxMTt9czo0MToiQ1E5am5VTnREVElscHo5bEszV3lwVDlscVR5aE1sdVNLMElGSHg5RlgiO2E6Mjp7aTowO3M6MTg6ImJhY2tkb29yLnNoZWxsLjAwNyI7aToxO3M6MTM5OiJ+XCRwYXNzd29yZFtcc10qPVteO10rO1tcc10qZGVmaW5lLi5WRVJTSU9OW147XStbXlwoXStcKFtcc10qYXJyYXlbXHNdKlwoW1xzXSpbXjtdezUwMDAsfVteXCldK1wpW1xzXSo7W15cKV0rXClbXHNdKjtbXHNdKihcL1wqW1x3XStcKlwvKSp+Ijt9fXM6NDoibm9uZSI7YToxMDp7aTowO2k6MTA7czoxNDoicmV0dXJuICJub25lIjsiO2E6Mjp7aTowO2k6MTA7czozMToieyByZXR1cm4gIm5vbmUiOyB9IGZ1bmN0aW9uIGVuZCI7YTozOntpOjA7aToxMDtzOjQ6Il8oKTsiO2E6Mjp7aTowO2k6MTA7czozOiJlbmQiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLmhpZGRlbi1kaXYuMDM1LjAyIjtpOjE7czo1MToifjxzY3JpcHRbXj5dKz5bXHNdKmVuZChbXGRdKyk/X1woXCk7W1xzXSo8LnNjcmlwdD5+Ijt9fXM6Mjc6Iikuc3R5bGUuZGlzcGxheSA9IGdldF9zdHlsZSI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wMzUiO2k6MTtzOjIwMzoifmZ1bmN0aW9uIGdldF9zdHlsZShbXGRdKyk/W1xzXSpcKFwpW1xzXSpce1tcc10qcmV0dXJuICJub25lIjtbXHNdKlx9W1xzXSpmdW5jdGlvbiBlbmQoW1xkXSspP19bXHNdKlwoXClbXHNdKlx7W1xzXSpkb2N1bWVudFwuZ2V0RWxlbWVudEJ5SWRcKC4oW1x3XSspLlwpXC5zdHlsZVwuZGlzcGxheVtcc10qPVtcc10qZ2V0X3N0eWxlW15cfV0rXH1bXHNdKn4iO319fXM6MTg6ImhpZGRlbjsiIHNyYz0iaHR0cCI7YToyOntpOjA7aToxMDtzOjEyOiJtZXRyaWMvP21pZD0iO2E6Mjp7aTowO3M6MTc6ImluamVjdGVkLmxua3IuMDA0IjtpOjE7czoxNjM6In4oPzo8aW1nIHN0eWxlPSJ3aWR0aDpccyowO1xzKmhlaWdodDpccyowO1xzKmRpc3BsYXk6XHMqbm9uZTtccyp2aXNpYmlsaXR5OlxzKmhpZGRlbjsiIHNyYz0iaHR0cHM/OlwvXC9bXlwvXStcL21ldHJpY1wvXD9taWQ9XHcqJmFtcDt3aWQ9W14iPl0rJmFtcDt0PVxkKyJbXj5dKj4pK34iO319czo2OiI+enA4NDkiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDAzIjtpOjE7czo2NjoifjxkaXYgc3R5bGU9ImRpc3BsYXk6XHMqP25vbmUiPjxhIGhyZWY9W14+XSs/PltePF0rPzxcL2E+PFwvZGl2Pn5pIjt9czozMjoiLS0+PGEgc3R5bGU9ImRpc3BsYXk6bm9uZTsiIGhyZWYiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDA1IjtpOjE7czo2OToifjxcIS0tKFx3ezIzfSktLT48YSBzdHlsZT0iZGlzcGxheTpub25lOyIgaHJlZj0iLis/PFwvYT48XCEtLVwvXDEtLT5+Ijt9czoxMToiPC9hPjwhLS0vNTUiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDA2IjtpOjE7czo4MjoifjxcIS0tNTVcd3sxNSx9LS0+PGFccypzdHlsZT0uZGlzcGxheTpub25lOy5ccypocmVmPS5bXjxdKzwvYT48XCEtLS41NVx3ezE1LH0tLT5+cyI7fXM6NDU6IiIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjpub25lO2NvbG9yOiM2NzZjNmMiPiI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuaGlkZGVuX2EtaHJlZi4wMDEiO2k6MTtzOjc4OiJ+PGEgaHJlZj0iaHR0cDouLlteIl0rIiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOm5vbmU7Y29sb3I6IzY3NmM2YyI+W148XSs/PC5hPn4iO31zOjY6Ij4uPC9hPiI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuaGlkZGVuX2EtaHJlZi4wMDIiO2k6MTtzOjY1OiJ+PGEgc3R5bGU9Lj8idGV4dC1kZWNvcmF0aW9uOltcc10qbm9uZS4/IiBocmVmPS4/IlwvW14+XSs+XC48LmE+fiI7fXM6Mzc6Ij4gZG9mb2xsb3cgeyBkaXNwbGF5OiBub25lOyB9PC9zdHlsZT4iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLmhpZGRlbl9hLWhyZWYuMDA0IjtpOjE7czo5NToifjxzdHlsZSB0eXBlPVxXK3RleHQuY3NzXFcrPiBkb2ZvbGxvdyBceyBkaXNwbGF5OiBub25lOyBcfTwuc3R5bGU+PGRvZm9sbG93PlteXH1dKzxcL2RvZm9sbG93Pn4iO31zOjQyOiI8L2E+PC9kaXY+PHNjcmlwdD5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiO2E6Mjp7aTowO2k6MTA7czozMjoiKS5zdHlsZS5kaXNwbGF5PSJub25lIjs8L3NjcmlwdD4iO2E6Mjp7aTowO2k6MTA7czo1MjoiKS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wMzkiO2k6MTtpOjExO319fX1zOjEzOiJiYXNlNjRfZGVjb2RlIjthOjg6e2k6MDtpOjEwO3M6NDoiZXZhbCI7YToyOntpOjA7aToxMDtzOjE5OiJldmFsKGJhc2U2NF9kZWNvZGUoIjthOjM6e2k6MDtpOjEwO3M6Mjc6IkBldmFsKGJhc2U2NF9kZWNvZGUoJF9QT1NUWyI7YToyOntpOjA7czoyNDoiYmFja2Rvb3IuZXZhbF9iYXNlNjQuMDE3IjtpOjE7czoxOTU6In5cJChcdyspXHMqPVxzKidcdysnO1xzKmlmXChpc3NldFwoXCRfUE9TVFxbXHcrXF1cKVwpXHtpZlxzKlwobWQ1XChcJF9QT1NUXFsuXDEuXF1cKVxzKj09PVxzKlwkXDFcKVxzKkBldmFsXChiYXNlNjRfZGVjb2RlXChcJF9QT1NUXFtcdytcXVwpXCk7ZXhpdDtcfWlmXChpc3NldFwoXCRfR0VUXFtcdytcXVwpXClce3BocGluZm9cKFwpO1x9fiI7fXM6Mjk6ImV2YWwoYmFzZTY0X2RlY29kZSgkYzU1Mzc1ZGJhIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci5ldmFsX2Jhc2U2NC4wMTUiO2k6MTtzOjIxOToiflwvXCo8XCFET0NUWVBFXHMqaHRtbFtePl0rPlxzKjEwNTFiZWZlM2ZlNmI0MDVjNjlbXlwqXStcKlwvXHMqXCRjNTUzNzVkYmE5ZDJmMTg2N2Y0MDgzYWNjZTk1OTg4ZGQ9W147XSs7XCRlX1xzKj1ccyplcnJvcl9yZXBvcnRpbmdcKDBcKTtccypldmFsXChiYXNlNjRfZGVjb2RlXChcJGM1NTM3NWRiYVteXCldK1wpXCk7XHMqZXJyb3JfW15cKV0rXCk7XHMqcmV0dXJuXHMqdHJ1ZTt+Ijt9fX1zOjE3OiIiY3JlYXRlX2Z1bmN0aW9uIiI7YToyOntpOjA7aToxMDtzOjQzOiJLU0I3SUVCbGRtRnNLR0poYzJVMk5GOWtaV052WkdVb0pGOVFUMU5VV3lSIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci5ldmFsX2Jhc2U2NC4wMTkiO2k6MTtzOjcwOiJ+W0EtWmEtejAtOVwrXD1dezQwLH1LU0I3SUVCbGRtRnNLR0poYzJVMk5GOWtaV052WkdVb0pGOVFUMU5VV3lSW14iXSt+Ijt9fXM6MjI6ImJhc2U2NF9kZWNvZGUoJ1BITmpjbWwiO2E6Mjp7aTowO3M6MjE6ImluamVjdGVkLmpzX3BvcHVwLjAwMSI7aToxO3M6Mjk1OiJ+aWZcKHByZWdfbWF0Y2hcKCIuXChhbmRyb2lkXHxhdmFudGdvW14iXSsiLFxzKlwkX1NFUlZFUlxbIkhUVFBfVVNFUl9BR0VOVCJcXVwpXClccypce1xzKlwkXHcrXHMqPVxzKnN0cl9yZXBsYWNlXCguPC5oZWFkLi4sXHMqYmFzZTY0X2RlY29kZVwoJ1BITmpjbWxbXiddKydcKVxzKlwuXHMqUEhQX0VPTFteO10rO1xzKlx9XHMqZWxzZVxzKlx7XHMqXCRcdytccyo9XHMqc3RyX3JlcGxhY2VcKC48LmhlYWQ+LixccypiYXNlNjRfZGVjb2RlXCgnUEhOamNtbFteJ10rJ1wpXHMqXC5ccypQSFBfRU9MW147XSs7XHMqXH1+Ijt9czo0MDoiJF9TRVJWRVJbYmFzZTY0X2RlY29kZSgnU0ZSVVVGOVNSVVpGVWtWUyI7YToyOntpOjA7czoyNDoiYmFja2Rvb3IuZXZhbF9iYXNlNjQuMDA2IjtpOjE7czoxOTQ6In5cJFx3Kz1cJF9TRVJWRVJcW2Jhc2U2NF9kZWNvZGVcKFsnIl1TRlJVVUY5U1JVWkZVa1ZTWyciXVwpXF07XHMqXCRcdys9XCRfU0VSVkVSW147XSs7XHMqXCRcdys9YmFzZTY0X2RlY29kZVteO10rO1xzKlwkXHcrXHM9XHMqc3RycG9zXChcJFx3KyxccypcJFx3K1wpO1xzKmlmXChcKFwkXHcrPT09W15ce10rXHtlY2hvXHMqXCRcdys7XH1+Ijt9czozNzoiYmFzZTY0X2RlY29kZShnZXRfb3B0aW9uKCJfc2l0ZV9jYWNoZSI7YToyOntpOjA7czoyNDoiYmFja2Rvb3IuZXZhbF9iYXNlNjQuMDEyIjtpOjE7aToxMTt9czo3NDoiaWYoJF9TRVJWRVJbIlFVRVJZX1NUUklORyJdPT0icHJpbnQ9MSIgJiYgbWQ1KG1kNShiYXNlNjRfZGVjb2RlKCRfQ09PS0lFWyIiO2E6Mjp7aTowO3M6MzE6ImhhY2t0b29sLnZidWxsZXRpbi5iYWNrZG9vci4wMDEiO2k6MTtpOjExO31zOjI0OiJmdW5jdGlvbiBlY2hvZnJhbWUoJHVybCwiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjAyNSI7aToxO3M6MjE2OiJ+ZXJyb3JfcmVwb3J0aW5nXCgwXCk7W15AXStAY2htb2RcKFwkbXlodFteQF0rQG1rZGlyW159XStcfVtcc10qZmlsZV9wdXRfY29udGVudHNbXkBdK0Bta2RpclteXH1dK1x9W1xzXSpmaWxlX3B1dFtefV0rXH1bXHNdKihlbHNlaWZbXHNdKlwoc3RycG9zW15cfV0rNDA0IE5vdCBGb3VuZFtefV0rXH1bXHNdKikrW1x9XHNdK2Vsc2VbXHNdKlx7W1xzXSpyZXR1cm47W1xzXSpcfX4iO319czoxMjoid3AtaW5jbHVkZXMvIjthOjg6e2k6MDtpOjEwO3M6MzU6IndwLWluY2x1ZGVzL2NlcnRpZmljYXRlcy9tZW1iZXIucGhwIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci53cC1pbmNsdWRlcy4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MzM6IndwLWluY2x1ZGVzL2NlcnRpZmljYXRlcy9tZW51LnBocCI7YToyOntpOjA7czoyNDoiYmFja2Rvb3Iud3AtaW5jbHVkZXMuMDAyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjMyOiJ3cC1pbmNsdWRlcy9jZXJ0aWZpY2F0ZXMvYnV5LnBocCI7YToyOntpOjA7czoyNDoiYmFja2Rvb3Iud3AtaW5jbHVkZXMuMDAzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjMxOiJ3cC1pbmNsdWRlcy9jZXJ0aWZpY2F0ZXMvdXMucGhwIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci53cC1pbmNsdWRlcy4wMDQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjM6IndwLWluY2x1ZGVzL1RleHQvdXMucGhwIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci53cC1pbmNsdWRlcy4wMDUiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjM6IndwLWluY2x1ZGVzL1RleHQvZG8ucGhwIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci53cC1pbmNsdWRlcy4wMDYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjY6IndwLWluY2x1ZGVzL2ZvbnRzL2Jlc3QucGhwIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci53cC1pbmNsdWRlcy4wMDciO2k6MTtzOjk6InNwYW1fbGluayI7fX1zOjM6InNuZCI7YTo2OntpOjA7aToxMDtzOjI6Ilx4IjthOjI6e2k6MDtpOjEwO3M6MzI6Ilx4NjNceDY4XHg2NVx4NjNceDZCXHg2Rlx4NzVceDc0IjthOjI6e2k6MDtpOjEwO3M6ODoic25kOm51bGwiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDYwIjtpOjE7czo5MjoifnZhciBfMHhbXHddK1tcc10qPVtePl0rLng2My54NjgueDY1Lng2My54NkIueDZGLng3NS54NzRbXj5dK3NuZDpudWxsW14+XSs+W14+XStcKFwpW1xzXSpcfX4iO319fXM6NDg6ImRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCcoPzpefDsgKScrbmFtZSI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wMzciO2k6MTtzOjE1ODoifnZhciBbXHddK1tcc10qPVtcc10qXHtbXHNdKnNuZDpudWxsLFtcc10qW1x3XSs6W14sXSssW1xzXSpteWlkOlwoZnVuY3Rpb25cKG5hbWVcKVtcc10qXHtbXiZdK3ZhbHVlLi4mLjtbXj5dK2lmW1xzXSpcKFwoW1xzXSpuZXcgUmVnRXhwW15cfV0rc2VuZFwoXCk7W1xzXSpcfX4iO31zOjI5OiJpbnA9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wMDEiO2k6MTtzOjE0ODoifjxzY3JpcHQ+XHMqdmFyIHNuZFxzKj1ccypudWxsO1teXH1dK1JlZ0V4cC4uKG9uZXBhZ2V8Y2hlY2tvdXQpW15cXl0raW5wPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGxbXlxeXStzbmRccyo9bnVsbDtccypzZXRUaW1lb3V0Li5zZW5kW14+XStzY3JpcHQ+fiI7fXM6NjE6ImlmKChuZXcgUmVnRXhwKCdvbmVwYWdlfGNoZWNrb3V0fG9uZXN0ZXAnLCdnaScpKS50ZXN0KHdpbmRvdy4iO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDI2IjtpOjE7czoyMjQ6In48ZGl2XHMqaWQ9LndlYnN0YXRfYW5hbHl0aWNzX2NvZGUuPjxzY3JpcHRbXj5dKz5ccyo8XCEtLVxzKnZhclxzKlx3Kz1ce1xzKnNuZDpudWxsLFxzKlx3KzouaHR0cHNbXixdKyxccypteWlkOi5mdW5jdGlvbi5uYW1lLlx7XHMqW15cLl0rLmNvb2tpZS5tYXRjaFteIl0rIi0iXCtNYXRoW14sXSssXHMqY2xrOlteXCZdK1wmLjtbXjxdKzxidG5bXj5dKz5ccyo8LnNjcmlwdD5ccyo8LmRpdj5+Ijt9czozMToiO3ZhciBzbmQ9bnVsbDtmdW5jdGlvbiBzdGFydCgpeyI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wOTIiO2k6MTtzOjgwOiJ+dmFyIFtcd10rW1xzXSo9W1xzXSpcW1teO117NTAwLH07W15cbl0rc25kPW51bGw7W1xzXSpzZXRUaW1lb3V0W147XStcKTtbXHNdKlx9fiI7fX1zOjg6ImZ1bmN0aW9uIjthOjIxOntpOjA7aToxMDtzOjExOiJhcHBlbmRDaGlsZCI7YTo0OntpOjA7aToxMDtzOjExOiIoZnVuY3Rpb24oKSI7YTo1OntpOjA7aToxMDtzOjMwOiIuY2xvbmUoKS50ZXh0KCkpO31jYXRjaChlKXt9fTsiO2E6Mjp7aTowO2k6MTA7czo0NzoiK3dpbmRvdy5sb2NhdGlvbjtmb3IoaT0wO2k8dGhpcy5sZW5ndGg7aSsrKXtpZigiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTA3IjtpOjE7czoyNjM6In5TdHJpbmdcLnByb3RvdHlwZVwuW1x3XStbXHNdKj1bXHNdKmZ1bmN0aW9uXChbXlwpXStcKVtcc10qXHtbXHNdKltcd10rW1xzXSo9W1xzXSpkb2N1bWVudCxbXHNdKltcd10rW1xzXSo9W1xzXSpbXHddK1wuY3JlYXRlRWxlbWVudFwodGhpc1teXH1dK2FwcGVuZENoaWxkW15cfV0rXH07P1tcc10qQXJyYXlcLnByb3RvW15cL10rc2V0VGltZW91dFwoXChcKVtcc10qPT5bXHNdKlx7aWZbXHNdKlwoIXdpbmRvd1teXH1dK1tcc1x9XSssW1xzXSpbXGRdK1wpOz9+Ijt9fXM6NzA6In5kb2N1bWVudFwuZ2V0RWxlbWVudHNCeVRhZ05hbWVcKFteXCldKmhlYWRbXlwpXSpcKVxbMFxdXC5hcHBlbmRDaGlsZH4iO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLmpzX2FwcGVuZENoaWxkLjAwNiI7aToxO3M6MTMxOiJ+XChmdW5jdGlvblwoXClbXHNdKlx7W1xzXSp2YXJbXlx9XStkb2N1bWVudFwuZ2V0RWxlbWVudHNCeVRhZ05hbWVcKFteXCldKmhlYWRbXlwpXSpcKVxbMFxdXC5hcHBlbmRDaGlsZFteXH1dK1x9W1xzXSpcKVtcc10qXChcKTs/fiI7fXM6NjE6Iik7fSxpbml0OmZ1bmN0aW9uKCl7c2V0dGluZ3NfdGltZXI9c2V0VGltZW91dCgnd3d3LmZpbmlzaCgpJywiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTA2IjtpOjE7czoxOTg6In5bXHddKz1mYWxzZTtbXHNdKnZhciBbXHddK1tcc10qPVtcc10qbmV3IEltYWdlXChcKTtbXHNdKk9iamVjdFwuZGVmaW5lUHJvcGVydHlcKFtcd10rLFtcc10qLmlkLixbXHNdKlx7Z2V0Oltcc10qZnVuY3Rpb25bXlw8XSt3aW5kb3dcLnd3d1tcc10qPVtcc10qW1x3XStcLmluaXRcKFwpO1tcc10qcmV0dXJuIFtcd10rO1x9XChbXClcfTtcc10rfiI7fXM6Njc6IkFEQkxPQ0sgREVURUNURUQ8YnIvPlVuZm9ydHVuYXRlbHkgQWRCbG9jayBtaWdodCBjYXVzZSBhIGJhZCBhZmZlY3QiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjAzNyI7aToxO3M6MjQzOiJ+XChmdW5jdGlvblwoLiwuLC5cKVx7T2JqZWN0XC5kZWZpbmVQcm9wZXJ0eVwoW15cKF0rXClcKHdpbmRvdyxbXHNdKlteLF0rLFtcc10qZnVuY3Rpb25cKFwpXHtbXHNdKnZhciBbXHddK1tcc10qPVtcc10qXFtbXjxdK0FEQkxPQ0sgREVURUNURUQ8YnIuPltePF0rRE9NQ29udGVudExvYWRlZFtePF0rPC5zY3JpcHQ+W1xzXSo8c2NyaXB0IHR5cGVbXHNdKj1bXj1dK29uZXJyb3JbXHNdKj1bXj1dK3NyY1tcc10qPVtePl0rPn4iO319czoxODoiLmJvZHkuYXBwZW5kQ2hpbGQoIjthOjM6e2k6MDtpOjEwO3M6Mjg6Ii5sb2NhdGlvbi5ocmVmLmluZGV4T2YoYXRvYigiO2E6Mjp7aTowO2k6MTA7czoyNjoiJywnYjI1bGMzUmxjR05vWldOcmIzVjAnLCciO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDc0IjtpOjE7czoxMjM6In5cKGZ1bmN0aW9uXCguLC4sLixbXlwpXStcKVx7aWZcKC5cLmxvY2F0aW9uXC5ocmVmXC5pbmRleE9mXChhdG9iXCguXClcKVteXH1dK2JvZHlcLmFwcGVuZENoaWxkXCguXClbXjxdK2IyNWxjW15cKV0rW1wpO10rfiI7fX1zOjU2OiIoZG9jdW1lbnQsd2luZG93LCdzY3JpcHQnLCdndG0uanMnLCdiMjVsYzNSbGNHTm9aV05yYjNWMCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wOTgiO2k6MTtzOjEzOToiflwoZnVuY3Rpb25cKC4sLiwuLC4sLiwuW15cKV0rXClce3ZhciBbXHddKz1mdW5jdGlvblwoLlwpXHt2YXIgLj1ce1x9W15cfV0rXH1bXj5dKz49W159XStcfVtePl0rbG9jYXRpb24uaHJlZi5pbmRleE9mW148XSthSFIwY1teKV0rXClcKTs/fiI7fX1zOjMzOiJfX2dhZHNfYXUnLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTsiO2E6Mjp7aTowO2k6MTA7czo2NzoibmF2aWdhdG9yLmFwcFZlcnNpb24uaW5kZXhPZignV2luJykmJignSW5zdGFsbFRyaWdnZXInaW4gd3x8J2Nocm9tZSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNDgiO2k6MTtzOjE4NjoifiFmdW5jdGlvblwoLiwuLC4sLiwuXClceyEuW1x3XVwuY29va2llXC5pbmRleE9mXCguXCkmJi5uYXZpZ2F0b3JcLmFwcFZlcnNpb25cLmluZGV4T2ZcKC5XaW4uLi4uLi5JbnN0YWxsVHJpZ2dlclteXC9dK2xvY2F0aW9uLnByb3RvY29sLmNvbmNhdFteXH1dK1x9XCk7XH1cKHdpbmRvdyxbXHNdKmRvY3VtZW50W147XStcKTt+Ijt9fX1zOjY1OiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSI7YTo0OntpOjA7aToxMDtzOjIyOiJTdHJpbmdbJ2Zyb21DaGFyQ29kZSddIjthOjM6e2k6MDtpOjEwO3M6OToiR2V0Q0NJbmZvIjthOjI6e2k6MDtpOjEwO3M6MTc6ImZ1bmN0aW9uIHJoZXgoXzB4IjthOjI6e2k6MDtpOjEwO3M6MTY6InN0cjJibGtzX01ENShfMHgiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDc5IjtpOjE7czo4NDoifnZhciBfMHhbXHddK1tcc10qPVtcc10qXFsoJ1teJ10rJyxbXHNdKil7MjAsfSdbXiddKydcXTtcKGZ1bmN0aW9uXChfMHhbXlxuXSs7XH1cfTt+Ijt9fX1zOjc6Il09ISFbXTsiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDcwIjtpOjE7czoxMjY6In4odmFyfGNvbnN0KSBbXHddK1tcc10qPVtcc10qXFtbXlxdXXsxMDAsfVxdO1tcc10qXChmdW5jdGlvblteXH1dK1x9XH07W15cbl0rKDtcfVx9O3xzZW5kLi5cKFwpO1x9fGRvbWFpblwrLlwoW15cKV0rW1wpXH07XSspfiI7fX1zOjM0OiJkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG5ld0ltZyk7IjthOjI6e2k6MDtpOjEwO3M6NDY6Im5ld0ltZy5zZXRBdHRyaWJ1dGUoImFsdCIsICJQbGVhc2UsIHdhaXQuLi4iKTsiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTE2IjtpOjE7czoxNDc6In5mdW5jdGlvbiBiYXNlNjRfZW5jb2RlXChkYXRhXClbXHNdKlx7W1xzXSp2YXIgYjY0W1xzXSo9W1xzXSouQUJDW146XSs6W1xzXSplbmNbXlwvXStuZXdJbWdcLnNldEF0dHJpYnV0ZVwoLnNyYy4sW1xzXSpbXlx9XStbXHNcfTtdK01ha2VFdmVudFwoXCk7fiI7fX1zOjI0OiJyaGV4KGIpK3JoZXgoYykrcmhleChkKTsiO2E6Mjp7aTowO3M6MjY6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDc5LjAyIjtpOjE7aToxMTt9fXM6NDoiKDEwNCI7YTo0OntpOjA7aToxMDtzOjk6IiBodHRwR2V0KCI7YToyOntpOjA7aToxMDtzOjIxOiJuZXcgWE1MSHR0cFJlcXVlc3QoKTsiO2E6Mjp7aTowO2k6MTA7czoyMDoiZnVuY3Rpb24gaHR0cEdldChfMHgiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjAxOCI7aToxO3M6MTIwOiJ+PHNjcmlwdCBsYW5ndWFnZVtePl0rPnZhciBfMHhbXHddKz1cWy5cXHguLlxceC4uW14+XStcKTt2YXIgZ2V0X3RleHQ9ZnVuY3Rpb24gaHR0cEdldFwoXzB4W148XStce1tcd11cKFwpXH1cfTwuc2NyaXB0Pn4iO319fXM6MzA6IlN0cmluZy5mcm9tQ2hhckNvZGUoNzEsNjksODQpLCI7YToyOntpOjA7aToxMDtzOjE1OiIucmVzcG9uc2VUZXh0O30iO2E6Mjp7aTowO2k6MTA7czoyMzoiU3RyaW5nLmZyb21DaGFyQ29kZSgxMDQiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLmpzX3JlZGlyZWN0LjAxOC4wMiI7aToxO3M6MTk2OiJ+KHZhciBbXHddW1xzXSo9W1xzXSpbXGRdKztbXHNdKik/dmFyIFtcd10rW1xzXSo9W1xzXSpTdHJpbmdcLmZyb21DaGFyQ29kZVwoW14sXSoxMDRbXlx9XStcfVtcc10qZnVuY3Rpb24gW1x3XStcKFteXH1dK1wucmVzcG9uc2VUZXh0O1x9W1xzXSooZnVuY3Rpb25bXHNdKltcd10rXChbXHddK1wpW1xzXSpce1tcc10qdmFyW15cfV0rO1x9KT9+Ijt9fX1zOjMxOiJTdHJpbmcuZnJvbUNoYXJDb2RlKDEwNCwxMTYsMTE2IjthOjI6e2k6MDtpOjEwO3M6NzQ6ImRvY3VtZW50LmN1cnJlbnRTY3JpcHQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocywgZG9jdW1lbnQuY3VycmVudFNjcmlwdCk7IjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5qc19yZWRpcmVjdC4wMjkiO2k6MTtzOjE5MToifnZhciBbXHddK1tcc10qPVtcc10qW1xkXSs7W1xzXSp2YXIgW1x3XVtcc10qPVtcc10qZG9jdW1lbnQ7W1xzXSp2YXIgW1x3XVtcc10qPVtcc10qLlwuY3JlYXRlRWxlbWVudFwoLnNjcmlwdFteXH1dK3MsIGRvY3VtZW50XC5jdXJyZW50U2NyaXB0XCk7W1xzXSpcfVtcc10qZWxzZVteXH1dK2FwcGVuZENoaWxkXChzXCk7W1xzXSpcfX4iO319fXM6NToiXXx8W10iO2E6Mjp7aTowO2k6MTA7czo5OiJndG0uc3RhcnQiO2E6NDp7aTowO2k6MTA7czoyMToiKz1TdHJpbmcuZnJvbUNoYXJDb2RlIjthOjI6e2k6MDtpOjEwO3M6NDQ6ImJyZWFrfX0od2luZG93LGRvY3VtZW50LCJzY3JpcHQiLCJkYXRhTGF5ZXIiIjthOjI6e2k6MDtzOjI2OiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA3Mi4wMiI7aToxO3M6MTQyOiJ+IWZ1bmN0aW9uXCguLC4sLixbXlwpXStcKVx7W15ce10rXHsuZ3RtXC5zdGFydC4uLm5ldyBEYXRlLi5nZXRUaW1lW15ce10rXHtmb3JcKHZhcltee10rXHtcKC49ZG9jdW1lbnRbXlx9XSticmVha1x9fVwod2luZG93LGRvY3VtZW50W147XStcKTt+Ijt9fXM6NzE6In5HVE0tKDVTRjI5M0p8NVBKNEQ2OHxUUkRMTTdRfDVNTkhCRzN8UFBGOFdRV3w1NzcyS0ZMfFQ2VEpIQlJ8VDc4RzU4Ryl+IjthOjI6e2k6MDtzOjI2OiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA3Mi4wMyI7aToxO3M6MTY5OiJ+XChmdW5jdGlvblwodyxkLHMsW15cKV0rXClce1teXHtdK1x7Li4/Z3RtXC5zdGFydC4uPzpbXHM8XSpuZXcgRGF0ZVwoXClbXjxdK2RhdGFMYXllci4uPywuLj9HVE0tKDVTRjI5M0p8NVBKNEQ2OHxUUkRMTTdRfDVNTkhCRzN8UFBGOFdRV3w1NzcyS0ZMfFQ2VEpIQlJ8VDc4RzU4RykuLj9cKTt+Ijt9czozMDoiLnNwbGl0KCcnKS5yZXZlcnNlKCkuam9pbignJyksIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjE2NCI7aToxO3M6MTQzOiJ+XChmdW5jdGlvblwodyxkLHMsW15cKV0rXClce1teXHtdK1x7Li4/Z3RtXC5zdGFydC4uPzpbXHM8XSpuZXcgRGF0ZVwoXClbXjxdK1wuc3BsaXRcKC4uXClcLnJldmVyc2VcKFwpXC5qb2luXCguLlwpLFtePF0rZGF0YUxheWVyLi4/LFteO10rXCk7fiI7fX19czo0OiI9e307IjthOjM6e2k6MDtpOjEwO3M6MTY6Ij13aW5kb3dbImF0b2IiXTsiO2E6Mjp7aTowO2k6MTA7czoxODoiPXdpbmRvd1siZXNjYXBlIl07IjthOjI6e2k6MDtpOjEwO3M6MzA6Ij13aW5kb3dbImRlY29kZVVSSUNvbXBvbmVudCJdOyI7YToyOntpOjA7aToxMDtzOjIxOiIrU3RyaW5nLmZyb21DaGFyQ29kZSgiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTAxIjtpOjE7czo5OToiflwoZnVuY3Rpb24gW1x3XStcKFwpW1xzXSpce1tccztdKigodmFyW1xzXSopP1tcd10rW1xzXSo9W1xzXSpbXlxuXSs7W1xzXSopezEwLH1bXlx4MDJdK1x9XClcKFwpOz9+Ijt9fX19czoxNjoiPSIiLmNvbnN0cnVjdG9yOyI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNzciO2k6MTtzOjEyODoiflwoZnVuY3Rpb25cKFwpW1xzXSpce1teXHtdKz1ce1x9O1tcc10qW15cfV0rW15cbl0rdmFyW1xzXSpbXHddKz0iW14iXXs1MDAwfVteO10rIltcc10qO1teXG5dKyIiXC5jb25zdHJ1Y3RvcjtbXlx4MDJdK1x9XClcKFwpO34iO319czo1OiIoJycsJCI7YToyOntpOjA7aToxMDtzOjk6ImNocihvcmQoJCI7YToyOntpOjA7aToxMDtzOjU6InhvciAkIjthOjI6e2k6MDtpOjEwO3M6MjY6Ijw/cGhwIGlmKCFmdW5jdGlvbl9leGlzdHMoIjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5qc19tYWx3YXJlLjAxMyI7aToxO3M6MTgwOiJ+aWZcKCFmdW5jdGlvbl9leGlzdHNcKFteXCldK1wpXClbXHNdKlx7W1xzXSpmdW5jdGlvbiBbXHddK1woXCRbXlwpXStcKVtcc10qXHtbXHNdKlwkW1x3XStbXHNdKj1bXHNdKmFycmF5W15cfV0rXH1bXHNdKnJldHVybiBcJFteXH1dK1x9W1xzXSpcJFtcd10rW15cfV0rXH1bXHNdKihlY2hvW147XSs7W1xzXSopP34iO319fX1zOjI3OiJ+XClcW1N0cmluZy5mcm9tQ2hhckNvZGVcKH4iO2E6Mjp7aTowO2k6MTA7czoyODoiflwoZnVuY3Rpb25cKFwpXHtcKGZ1bmN0aW9ufiI7YToyOntpOjA7aToxMDtzOjM0OiJ+XClcXTtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50XCh+IjthOjI6e2k6MDtpOjEwO3M6MzA6In5cKFwpXH1cKFwpXClcfVwoXClcKVx9XChcKVwpfiI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xMDAiO2k6MTtzOjEyNjoiflwoZnVuY3Rpb25cKFwpXHtcKGZ1bmN0aW9uIFtcd10rXChcKVtcc10qXHtbXHNdKnZhciBbXHddK1tcc10qPVtcc10qU3RyaW5nXC5mcm9tQ2hhckNvZGVbXlx4MDJdK1woXClcfVwoXClcKVx9XChcKVwpXH1cKFwpXCl+Ijt9fX19czo4OiJ7RG9tYWluOiI7YToyOntpOjA7aToxMDtzOjg6ImJ0b2EoXzB4IjthOjI6e2k6MDtpOjEwO3M6NToiO3VybGwiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDc4IjtpOjE7czo3MzoifnZhciBfMHhbXHddKz1cW1teXH1dK1x9W15cbl0rXHtEb21haW46W15cbl0rZnVuY3Rpb25cKFwpXHtbXHddK1woXClcfVwpfiI7fX19czo2OiJsZWZ0Oi0iO2E6Mjp7aTowO2k6MTA7czozOiI+JysiO2E6Mjp7aTowO2k6MTA7czoyNjoiKGpRdWVyeSgnaGVhZCcpKTs8L3NjcmlwdD4iO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDQwIjtpOjE7czoxMzY6In5mdW5jdGlvbiBbXHddK1woW1x3XStcKVtcc10qXHtbXHNdKnZhciBbXHddK1tcc10qPVtcc10qLiNbXlxuXStweFteXH1dKlx9LjtbXHNdKnZhciBbXHddK1tcc10qPVteXH1dK1x9W1xzXSpbXHddK1woalF1ZXJ5XCguaGVhZC5cKVwpO34iO319fXM6MTI6ImF3YWl0IGZldGNoKCI7YTo0OntpOjA7aToxMDtzOjIwOiJhd2FpdCBmZXRjaChhdG9iKF8weCI7YToyOntpOjA7aToxMDtzOjMzOiI7fTtpKCk7YXN5bmMgZnVuY3Rpb24gaSgpe2xldCBfMHgiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmpzX21hbHdhcmUuMDE0IjtpOjE7czoxMjI6In5jb25zdCBfMHhbXHddK1tcc10qPVtcc10qXFtbXlxdXStcXTtbXHNdKlwoZnVuY3Rpb25cKFteXH1dK1x9XH07W1xzXSpfMHhbXHddK1woXCtcK1teJ10rYXdhaXQgZmV0Y2hcKGF0b2JbXlx9XStcKFwpO1x9XH1+Ijt9fXM6ODoidjAoKSk7fX0iO2E6Mjp7aTowO2k6MTA7czo0OiJmMCgpIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjEzNSI7aToxO3M6MTc1OiJ+dmFyIF8/Y3NbXHNdKj1cW1teXF1dK1xdO1tcc10qXz9mMFwoXCk7W1xzXSphc3luYyBmdW5jdGlvbiBfP2YwXChcKVtcc10qXHtbXHNdKmxldCBfP2cwW1xzXSo9W1xzXSphd2FpdCBmZXRjaFteXH1dK18/djBcKFwpXCk7W1xzXSpcfSsoXHMqdmFyIFtcd10rXHMqPVxzKiJbXHdcK1w9XSsiO1tcc10qKT9+Ijt9fXM6MTA6Ii5vaykge2xldCAiO2E6Mzp7aTowO2k6MTA7czoxNDoiPHN0eWxlIG9ubG9hZD0iO2E6Mjp7aTowO3M6MjY6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTM1LjAyIjtpOjE7czoxNDk6In48c3R5bGUgb25sb2FkPS4odmFyIF8/Y3NcZD89XFtbXlxdXStcXTtccyopP1woYXN5bmNccytmdW5jdGlvblteXH1dK2F3YWl0IGZldGNoW15cfV0rXC5zbGljZVwoKFx3K3wtXGRcZFxkKylcKVwpO1xzKnJldHVyblwoXHcrXChcKVwpO1x9XH1cKVwoXCk7Lj5+Ijt9czozOToiLnRleHQoKTt2YXIgRiA9IG5ldyBGdW5jdGlvbiAoeC5zbGljZSgtIjthOjI6e2k6MDtzOjI2OiJoYWNrdG9vbC5jYy1zdGVhbGVyLjEzNS4wMyI7aToxO3M6MTExOiJ+aVwoXCk7W1xzXSphc3luYyBmdW5jdGlvbiBbXHddK1woXClbXHNdKlx7W1xzXSpsZXQgW1x3XStbXHNdKj1bXHNdKmF3YWl0IGZldGNoW15cfV0rcmV0dXJuXChbXHddK1woWztcKVx9XHNdK34iO319fXM6NDoiYXRvYiI7YTo0OntpOjA7aToxMDtzOjI0OiIoZnVuY3Rpb24oaSxzLG8sZyxyLGEsbSkiO2E6Mjp7aTowO2k6MTA7czozNToiO2lmKGkubG9jYXRpb24uaHJlZi5pbmRleE9mKGkuYXRvYigiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDgwIjtpOjE7czoxMzA6In5cKGZ1bmN0aW9uXChpLHMsbyxnLHIsYSxtXFcraVxbLltnR11bXjw+XStpbmRleE9mLmlcLmF0b2JcKFx3XClbXjxdK2F0b2JcKFx3XClbXjx7XStcKHdpbmRvdyxccypkb2N1bWVudCxbJyJdXHdbXjxdKyxbJyJdZ1x3LlwpO34iO319czoyNzoiaHJlZi5tYXRjaChuZXcgUmVnRXhwKGF0b2IoIjthOjI6e2k6MDtpOjEwO3M6OToiMmhsWTJ0dmRRIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjE2OCI7aToxO3M6MTIwOiJ+XChmdW5jdGlvblwoW1x3XSssW1x3XSssW15cfV0rcGFyZW50Tm9kZVwuaW5zZXJ0QmVmb3JlXChbXHddKyxbXHddK1wpXH1cfVwpW147XSsyaGxZMnR2ZFFbXjtdKyxbXHNdKi5zY3JpcHQuLHdpbmRvd1wpO34iO319czoxMToiWTJobFkydHZkWFEiO2E6Mjp7aTowO3M6MjY6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDI5LjAyIjtpOjE7aToxMTt9fXM6MjI6ImZlcmgubm9pdGFjb2wudG5lbXVjb2QiO2E6Mjp7aTowO2k6MTA7czo0NjoiLmxpc3Rbbl0uc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKTtyZXR1cm4gJCI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDM1IjtpOjE7czoyMjg6In5cJFtcd10rW1xzXSo9W1xzXSpmdW5jdGlvblwoLlwpW1xzXSpce1tcc10qaWZcKHR5cGVvZlwoXCRbXHddK1wubGlzdFxbLlxdXClbXHNdKj09W1xzXSouc3RyaW5nLlwpW1xzXSpyZXR1cm4gXCRbXHddK1wubGlzdFxbLlxdXC5zcGxpdFwoLi5cKVwucmV2ZXJzZVwoXClcLmpvaW5cKC4uXCk7W1xzXSpyZXR1cm5bXlx9XStcXVx9O1tcc10qXCRbXHddK1wubGlzdFteXH1dK2RlbGF5XClbXHNdKlx9fiI7fX1zOjIxOiI9IGpRdWVyeSgnaHRtbCcpOyB2YXIiO2E6Mjp7aTowO2k6MTA7czoyOToiPmRpdntvdmVyZmxvdzpoaWRkZW47Ym90dG9tOi0iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLmhpZGRlbi1kaXYuMDM4LjAyIjtpOjE7czoxNjY6In5mdW5jdGlvbiBbXHddK1woXClbXHNdKlx7W1xzXSp2YXIgW1x3XStbXHNdKj1bXHNdKmpRdWVyeVwoW147XStcKTtbXHNdKnZhciBbXHddK1teXHtdK1x7W1xzXSpvdmVyZmxvdzpoaWRkZW5bXjxdK2ZpeGVkXH1bXlx9XSthcHBlbmRcKFtcd10rXCk7W1xzXSpcfVtcc10qW1x3XStcKFwpO34iO319czoxNzoiWE1MSHR0cFJlcXVlc3QoKTsiO2E6Mzp7aTowO2k6MTA7czozMToicHR0aCcuc3BsaXQoJycpLnJldmVyc2UoKS5qb2luKCI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQubWFnZW50b19zaG9wbGlmdC4wMDgiO2k6MTtzOjE2MjoifjxpbWdbXHNdKnNyY1tcc10qPVteO10rOy5bXHNdKm9ubG9hZFtcc10qPVtcc10qLnZhclteO10rO1tcd10rLm9wZW5cKC5HRVQuLFteO10rcmV2ZXJzZVwoXCkuam9pblwoW15cfV0rcmVzcG9uc2VcKVwpLmNhbGxcKHRoaXNcKTtbXHNdKlx9O1tcc10qW1x3XSsuc2VuZFwoXCk7Lj5+Ijt9czo1NDoicXVlcnlTZWxlY3RvckFsbCgiYVtocmVmKj0namF2YXNjcmlwdDp2b2lkKDApJ10sYnV0dG9uIjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5tYWdlbnRvX3Nob3BsaWZ0LjAwOSI7aToxO3M6MjkwOiJ+aWZcKHR5cGVvZltcc10qW1x3XSs9PS5bXHddKy5cKVx7W1xzXSp2YXJbXHNdKltcd10rPVx7W1xzXSp1cmxbXlx8XStkb2N1bWVudC5jb29raWUubWF0Y2hcKG5ld1tcc10qUmVnRXhwXChbXjxdK2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGxcKC5pbnB1dFteXCpdK2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGxcKC5hXFtocmVmW15cLV0rQ29udGVudC10eXBlLiwuYXBwbGljYXRpb24ueC13d3ctZm9ybS11cmxlbmNvZGVkLlwpO1teXH1dK1x9LFtcc10qXH1bXHNdKltcd10rXC5pbml0XChcKTtbXHNdKlx9fiI7fX1zOjEzOiJbZnVzaW9uX2NvZGVdIjthOjI6e2k6MDtpOjEwO3M6Mzc6IlBITmpjbWx3ZEQ1MllYSWdYekI0TTJNM056MWJKMXg0TmpaY2UiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmpzX21hbHdhcmUuMDE2IjtpOjE7czo3NjoiflxbZnVzaW9uX2NvZGVcXVBITmpjbWx3ZEQ1MllYSWdYekI0TTJNM056MWJKMXg0TmpaY2VbXlxbXStcW1wvZnVzaW9uX2NvZGVdfiI7fX1zOjU5OiJpZighZnVuY3Rpb25fZXhpc3RzKCdiYXMnLidlJy4nNjRfJy4nZW4nLidjb2RlJykpe2Z1bmN0aW9uICI7YToyOntpOjA7czoyNDoiYmFja2Rvb3IuZXZhbF9iYXNlNjQuMDIwIjtpOjE7czoyMjQ6In48XD9waHBccypcJEdMT0JBTFNcWy5EQl9OQU1FLlxdXHMqPVxzKmFycmF5XChccypbXlwoXStcKC5zaGVsbF9ib3JkZXIuXHMqPT5bXjtdKztccyppZlwoXCFmdW5jdGlvbl9leGlzdHNcKC5bXHMnIlwuYmFzZTY0X2VuY29kZV0rXClcKVxzKntccypmdW5jdGlvblxzKlx3K1woKFwkXHcrKVwpXHMqe1xzKmlmXChlbXB0eVwoXDFcKVwpXHMqcmV0dXJuXHMqO1teXDFdKydcKVxzKjtccypcPz5+Ijt9czo0Mzoic2V0VGltZW91dChmdW5jdGlvbigpe2pRdWVyeS5nZXRTY3JpcHQoJ2h0dCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xMzAiO2k6MTtzOjczOiJ+c2V0VGltZW91dFwoZnVuY3Rpb25cKFwpXHtqUXVlcnlcLmdldFNjcmlwdFwoLmh0dFteXH1dK1x9LFtcc10qW1xkXStcKTt+Ijt9czoxNjM6Il09PT11bmRlZmluZWQpe3ZhciBmPWZ1bmN0aW9uKGkpe3ZhciBqPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSsvPScsaz1TdHJpbmcoaSlbJ3JlcGxhY2UnXSgvPSskLywnJyk7dmFyIGw9Jyc7Zm9yKHZhciBtPTB4MCwiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTMzIjtpOjE7czoxMDc6In48c2NyaXB0PihcKGZ1bmN0aW9uXChcKVx7dHJ5XHtbXHNdKik/dmFyIGE9XFtbXlxdXStcXTtcKGZ1bmN0aW9uXChiLGNcKVteXG5dK2VcKVteXChdK1woXCk7W1xzXSo8LnNjcmlwdD5+Ijt9czoxOToicG9zdGNvZGUnLCFbXV0sW18weCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xMTMiO2k6MTtpOjExO31zOjk6IkdldENDSW5mbyI7YToyOntpOjA7czoyNjoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNzkuMDMiO2k6MTtpOjExO319czoyOiJaWCI7YToxMDp7aTowO2k6MTA7czoyMDoiJGF1dGhfdXNlcnMgPSBhcnJheSgiO2E6Mjp7aTowO2k6MTA7czo1NToiOyRfQT1zdHJyZXYoImVzYWIiKS4iNjRfIi5zdHJyZXYoImVkb2NlZCIpOyRfWD0kX0EoJ1pYWiI7YToyOntpOjA7czoxNzoiYmFja2Rvb3IuZXZhbC4wMDgiO2k6MTtzOjc6In5eLiokfnMiO319czo1NjoiNDBcNjVcNzZcNjFcNmNcMjhcNjJcNjFcNzNcNjVcMzZcMzRcNWZcNjRcNjVcNjNcNmZcNjRcNjUiO2E6Mjp7aTowO3M6MjQ6ImJhY2tkb29yLmV2YWxfYmFzZTY0LjAyMSI7aToxO3M6MjI6In4uNDAuNjUuNzYuNjFbXjtdK1wpO34iO31zOjEzNDoiYVdZb2MzUnliR1Z1S0NSeUtTQThJREV3S1NCN0Nna0pjbVYwZFhKdUlHWmhiSE5sT3dvSmZRb0pDZ2trWkNBOUlITjBjblJ2Ykc5M1pYSW9KRjlUUlZKV1JWSmJKMGhVVkZCZlNFOVRWQ2RkS1RzS0NTUndiM01nUFNCemRISndiM01vSkgiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLnBocF9iYXNlNjQuMDAxIjtpOjE7czo3OiJ+Xi4qJH5zIjt9czoxODoiTHlwd2FIQXFMMmxtS0NGamJHIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci5ldmFsX2Jhc2U2NC4wMjMiO2k6MTtpOjExO31zOjg6ImRtbGhaM0poIjthOjI6e2k6MDtzOjIxOiJpbmplY3RlZC5zcGFtLXNlby4wMjAiO2k6MTtpOjExO31zOjM4OiJKVE5EWkdsMkpUSXdjM1I1YkdVbE0wUWxNakp3YjNOcGRHbHZiaSI7YToyOntpOjA7czoyMToiaW5qZWN0ZWQuc3BhbS1zZW8uMDIzIjtpOjE7aToxMTt9czozMjoiQ2dwcFppZ2haR1ZtYVc1bFpDZ25SRTlNVEZsZlYwRloiO2E6Mjp7aTowO3M6MjQ6ImJhY2tkb29yLmV2YWxfYmFzZTY0LjAyNCI7aToxO3M6NDA6In5DZ3BwWmlnaFpHVm1hVzVsWkNnblJFOU1URmxmVjBGWlteXHNdKn4iO31zOjkyOiJZUzV6Y21NOUp5Y3JhUzVoZEc5aUtHOHBPMjB1Y0dGeVpXNTBUbTlrWlM1cGJuTmxjblJDWldadmNtVW9ZU3h0S1gxOUtTQW9kMmx1Wkc5M0xHUnZZM1Z0Wlc1MCI7YToyOntpOjA7czoyNDoiYmFja2Rvb3IuZXZhbF9iYXNlNjQuMDI1IjtpOjE7czoxMzc6In5cW2Z1c2lvbl9jb2RlXF1bXlxbXStZUzV6Y21NOUp5Y3JhUzVoZEc5aUtHOHBPMjB1Y0dGeVpXNTBUbTlrWlM1cGJuTmxjblJDWldadmNtVW9ZU3h0S1gxOUtTQW9kMmx1Wkc5M0xHUnZZM1Z0Wlc1MFteXF1dK1xbLmZ1c2lvbl9jb2RlXF1+Ijt9czoyOToiWyh0eXBlb2YgSW1hZ2UpLnJlcGxhY2UoL14uLywiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTU0IjtpOjE7czoyMjI6In4oPGltZyBzcmMgb25lcnJvcj0ufDtcKGZ1bmN0aW9uXChcKVx7KWxldCBhID0gd2luZG93OyBbXjw+e10qbmV3IGFcW1wodHlwZW9mIEltYWdlXCkucmVwbGFjZVwoXC9cXlwuXC8sW15cKV0ranBlZy5cKVxdXChbXlxdXStcWy5jb25jYXQuXF1bXlxdXStiYXNlNjRbXlxdXStcXVwoWyciXVteXH08Pl0rXCguYS5cKVwpXClcKFwpKC4+fFsnIl0gc3R5bGU9W148Pl0rPnxcfVwoXClcKTspfiI7fX1zOjI6IllYIjthOjc6e2k6MDtpOjEwO3M6ODoiYjJOMWJXVnUiO2E6Mjp7aTowO2k6MTA7czoxMDoiZG1GeUlGOHdlRCI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuanNfbWFsd2FyZS4wMjAiO2k6MTtzOjE3OiJ+ZG1GeUlGOFtcdz1cK10rfiI7fX1zOjIyOiJVM1J5YVc1bkxtWnliMjFEYUdGeVEyIjthOjI6e2k6MDtzOjIyOiJpbmplY3RlZC5qc19iYXNlNjQuMDAxIjtpOjE7aToxMTt9czozODoiTG5OeVl5QTlJRk4wY21sdVp5NW1jbTl0UTJoaGNrTnZaR1VvTVQiO2E6Mjp7aTowO3M6MjI6ImluamVjdGVkLmpzX2Jhc2U2NC4wMDMiO2k6MTtpOjExO31zOjk6IlBITmpjbWx3ZCI7YToyOntpOjA7czoyMjoiaW5qZWN0ZWQuanNfYmFzZTY0LjAwNCI7aToxO2k6MTE7fXM6MjA6ImNIQmxibVJEYUdsc1pGd25YU2h6IjthOjI6e2k6MDtzOjIyOiJpbmplY3RlZC5qc19iYXNlNjQuMDA1IjtpOjE7aToxMTt9czo3NToid3hNVFFzTXpJc01URXlMREV4TVN3ek1pdzJNU3d6TWl3eE1EQXNNVEV4TERrNUxERXhOeXd4TURrc01UQXhMREV4TUN3eE1UWXNOIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5qc19yZWRpcmVjdC4wNDkuMDIiO2k6MTtpOjEyO319czozOiJ0bXAiO2E6NTp7aTowO2k6MTA7czo5OiJnZXRjd2QoKS4iO2E6Mjp7aTowO2k6MTA7czoyMjoiaWYoaXNzZXQoJF9HRVRbJ2dvb2QnXSI7YToyOntpOjA7czoyMToiYmFja2Rvb3IudXBsb2FkZXIuMDAxIjtpOjE7czoxMjA6In5pZlwoaXNzZXRcKFwkX0dFVFxbLmdvb2QuXVwpXClbXHNdKlx7W1xzXSppZlwoaXNzZXRcKFwkX0ZJTEVTW15AXStAbW92ZV91cGxvYWRlZF9maWxlW15cfV0rXH1bXHNdKmVsc2VbXHNdKlteXH1dK1tcfV0rfiI7fX1zOjE3OiJpZihAY29weSgkX0ZJTEVTWyI7YToyOntpOjA7aToxMDtzOjM0OiJpZiggJF9QT1NUWydfdXBsJ10gPT0gIlVwbG9hZCIgKSB7IjthOjI6e2k6MDtzOjIxOiJiYWNrZG9vci51cGxvYWRlci4wMDMiO2k6MTtzOjIyMToifmVjaG9bXHNdKi48Zm9ybVteXHtdK2lmXChbXHNdKlwkX1BPU1RcWy5bXHddKy5cXVtcc10qPT1bXHNdKi5bXHddKy5bXHNdKlwpW1xzXSpce1tcc10qaWZcKFxAY29weVwoXCRfRklMRVNcW1teXH1dK1x9W1xzXSplbHNlW1xzXSpce1tcc10qZWNob1teJF0rXCRfU0VSVkVSXFsuU0VSVkVSX05BTUUuXF1bXlx9XStcJF9GSUxFU1xbLltcd10rLlxdXFsuW1x3XSsuXF0uLi47W1xzXSpcfX4iO319czoyMDoiZ2NjIC1vIC90bXAvYW5nZWxfYmMiO2E6Mjp7aTowO3M6MTg6ImJhY2tkb29yLmFuZ2VsLjAwMSI7aToxO2k6MTE7fXM6OToiLi4vLi4vLi4vIjthOjI6e2k6MDtzOjIxOiJtYWx3YXJlLmluY2x1c2lvbi4wMDEiO2k6MTtpOjExO319czoxNjoiPG1ldGEgaHR0cC1lcXVpdiI7YTo0OntpOjA7aToxMDtzOjM1OiI8bWV0YSBodHRwLWVxdWl2PSJSZWZyZXNoIiBjb250ZW50PSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMDkiO2k6MTtzOjEwODoifjxtZXRhW1xzXSpodHRwLWVxdWl2W14+XStcL3dwLSg/OmNvbnRlbnR8YWRtaW58aW5jbHVkZXMpXC9bXC9fXHcrLV0rKD86LnBocHxodG1sfHBodG1sfGh0bXxqc3x4aHRtbClbXj5dKz5+Ijt9czo5OiJqNGRzbXdqeC4iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDk2IjtpOjE7czoxODoiaHR0cF9lcXVpdl9yZWZyZXNoIjt9czo5OiJiaXRseS5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTUwIjtpOjE7czoxODoiaHR0cF9lcXVpdl9yZWZyZXNoIjt9fXM6MTI6InByZWdfcmVwbGFjZSI7YTozOntpOjA7aToxMDtzOjE0OiJwcmVnX3JlcGxhY2UoJCI7YToyOntpOjA7aToxMDtzOjc6InN0cnRyKCQiO2E6Mjp7aTowO2k6MTA7czoxNDoiJyVzJScuc3Vic3RyKCQiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmpzX21hbHdhcmUuMDExIjtpOjE7czoxNjQ6In5cJFtcd10rW1xzXSo9W1xzXSonW1x3XXszMn0nO1tcc10qKFwkW1x3XStbXHNdKj1bXHNdKidbXiddKyc7W1xzXSopezMsfVwkW1x3XStbXHNdKj1bXHNdKiclcyUnXC5zdWJzdHJcKFwkW147XStcKTtbXHNdKlwkW1x3XStbXHNdKj1bXHNdKnByZWdfcmVwbGFjZVteO10rXCk7W1xzXSp+Ijt9fX1zOjEzOiJwcmVnX3JlcGxhY2UoIjthOjI6e2k6MDtzOjI1OiJiYWNrZG9vci5wcmVnX3JlcGxhY2UuMDAxIjtpOjE7aToxMTt9fXM6MTI6ImZyb21DaGFyQ29kZSI7YTo0OntpOjA7aToxMDtzOjg6IisgYXRvYigiIjthOjI6e2k6MDtpOjEwO3M6NjM6IiIuc3BsaXQoJyAnKS5tYXAoKGUpPT57cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoZSl9KS5qb2luKCcnKSI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuanNfYXBwZW5kQ2hpbGQuMDEyIjtpOjE7czoxNzg6In4odmFyIFtcd10rW1xzXSo9W1xzXSpbXjtdKztbXHNdKikrW1x3XStbXHNdKlxbW1x3XStcXVwoW15cW10raWZbXHNdKlwoW1xzXSp0eXBlb2YgW1x3XStbXHNdKlxbW1x3XStcXVtcc10qPT1bXjxdK2Zyb21DaGFyQ29kZVwoLlwpXH1cKVwuam9pblwoLi5cKVteXH1dK1x9XH0sW1xzXSpbXlwpXStcKTtbXHNdKn4iO319czo0OToifTwvc3R5bGU+PGRpdiBzdHlsZT0idmlzaWJpbGl0eTpoaWRkZW47YW5pbWF0aW9uOiI7YToyOntpOjA7aToxMDtzOjIyOiJvbmFuaW1hdGlvbnN0YXJ0PSJ2YXIgIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjE1MiI7aToxO3M6MTY3OiJ+PHN0eWxlPkAtd2Via2l0LWtleWZyYW1lcyBbXjxdK1x9PC5zdHlsZT48ZGl2IHN0eWxlPSJ2aXNpYmlsaXR5OmhpZGRlbjthbmltYXRpb246IFteIl0rIltePD5dK29uYW5pbWF0aW9uc3RhcnQ9InZhciBcdys9XFtbXiJdK2Zyb21DaGFyQ29kZVteIl0rcGFyc2VJbnRbXiJdKyI+PC5kaXY+fiI7fX1zOjE1NDoiMTIwLCA0NiwgMTE1LCAxMDEsIDExMCwgMTAwLCA0MCwgNDEsIDU5LCAxMCwgMzIsIDMyLCAxMjUsIDEwLCAzMiwgMzIsIDEwMywgMTAxLCAxMTYsIDY3LCAxMTEsIDEwMCwgMTAxLCA0MCwgNDEsIDU5LCAxMCwgMTAsIDEyNSwgNDEsIDQwLCA0MSwgNTksIDEwLCAxMCkpOyI7YToyOntpOjA7czoyMToiaW5qZWN0ZWQuc3BhbS1zZW8uMDIyIjtpOjE7czo1MzoifjxpbWcgc3JjW147XSs0MSwgNTksIDEwLCAxMFwpXCk7W1xzXSpbXHddK1woXCk7Py4uPn4iO319czoxNjoiPGRpdiBjbGFzcz0nZGMnPiI7YToyOntpOjA7aToxMDtzOjEzOiI8YSBocmVmPSJodHRwIjthOjI6e2k6MDtpOjEwO3M6MTY6InRhcmdldD0iX2JsYW5rIj4iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLnNwYW0tc2VvX2xpbmsuMDEwIjtpOjE7aToxMTt9fX1zOjU6ImNvZGUoIjthOjI6e2k6MDtpOjEwO3M6NToiNjRfZGUiO2E6Mjp7aTowO2k6MTA7czo1MjoiRFFvTkNtbG1LQ0FvYzNSeWNHOXpLQ1JmVTBWU1ZrVlNXeWRTUlZGVlJWTlVYMVZTU1NkZCI7YToyOntpOjA7czoyNDoiYmFja2Rvb3IuZXZhbF9iYXNlNjQuMDE4IjtpOjE7aToxMTt9fX1zOjc6InRwaXJjczwiO2E6Mjp7aTowO2k6MTA7czoxNzoiKXooZXRpcncudG5lbXVjb2QiO2E6Mjp7aTowO3M6MzE6ImluamVjdGVkLmpzX2NyZWF0ZV9kb2N1bWVudC4wMjYiO2k6MTtzOjExNToifj50cGlyY3NcLzxccyo7XHMqXClccyooXHcrKVxzKlwoXHMqZXRpcndcLnRuZW11Y29kXHMqO1xzKlwpW14+XStcMVxzKj1ccypcdytccypyYXZccyo7XHMqXClccypdW14+XSs+W148XSt0cGlyY3M8fiI7fX1zOjQ6IiZsdDsiO2E6Mzp7aTowO2k6MTA7czozMToiZ3Q7Jmx0O2ltZyBzcmM9Imh0dHBzOi8vY291bnRlciI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNjgiO2k6MTtzOjg4OiJ+Jmx0O1tcd10rW14+Jl0rKGZyZWVjb3VudGVyc3RhdC5jb218d2hlcmVkb3lvdWNvbWVmcm9tLm92aClbXiZdKyZndDtbXHNdKigmbHQ7LmEmZ3Q7KT9+Ijt9czo0NDoiK2kuYXRvYihvKTttLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHIsbSl9fSkiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmpzX21hbHdhcmUuMDE5IjtpOjE7czoxMTY6In4mbHQ7c2NyaXB0Jmd0O1teXH1dK3BhcmVudE5vZGVcLmluc2VydEJlZm9yZVwoW1x3XSssW1x3XStcKVx9XH1cKVtcc10qXCh3aW5kb3csZG9jdW1lbnQsW15cKV0rXCk7XCZsdDsuc2NyaXB0XCZndDt+Ijt9fXM6OToiJF9DT09LSUVbIjthOjI6e2k6MDtpOjEwO3M6OToiYXNzZXJ0KCJAIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci5ldmFsX0NPT0tJRS4wMDIiO2k6MTtzOjcyOiJ+YXNzZXJ0XCguQGV2W15cKF0rXChiYXNbXlwoXStcKC5cJF9DT09LSUVcWy5bXHddKy5cXVwpXClcfFx8W1xkXSsuXCkuO34iO319czoxNzoiaWYgKGlzc2V0KCRfUE9TVFsiO2E6Mjp7aTowO2k6MTA7czoyMzoiZGllKCI8aDE+Tm90IEZvdW5kPC9oMT4iO2E6Mjp7aTowO3M6Mjk6ImhhY2t0b29sLk1vZFguYXV0aF9ieXBhc3MuMDAxIjtpOjE7aToxMTt9fXM6MTQ6IiJyZWRpcmVjdF91cmwiIjthOjI6e2k6MDtpOjEwO3M6MjE6ImJlbGF0ZXJiZXdhc3RoZXJlLmNvbSI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNTMuMDIiO2k6MTtpOjExO319czo0OiJQQzl6IjthOjM6e2k6MDtpOjEwO3M6MjQ6In5eUEM5elkzSnBjSFFcK1BITmpjbWx3fiI7YToyOntpOjA7czoyMjoiaW5qZWN0ZWQuanNfYmFzZTY0LjAwNiI7aToxO2k6MTE7fXM6MjM6In5eUEM5emRIbHNaVDQ4YzJOeWFYQjB+IjthOjI6e2k6MDtzOjI1OiJpbmplY3RlZC5qc19iYXNlNjQuMDA2LjAyIjtpOjE7aToxMTt9fXM6MzoiPnpwIjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5oaWRkZW4tZGl2LjAwNCI7aToxO3M6Mjc6In48ZGl2W14+XSo/PnpwXGQrcnE8L2Rpdj5+aSI7fXM6MTk6InJrX2N6eFYxZHYxVVRmRXJkUXkiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnJrX2NvbW1lbnQtZGl2LjAwMSI7aToxO3M6Nzc6In48IS0tIHJrX2N6eFYxZHYxVVRmRXJkUXkuWzAtOV0gLS0+Lio/PCEtLSBcL3JrX2N6eFYxZHYxVVRmRXJkUXkuWzAtOV0gLS0+fmlzIjt9czo3NjoiPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7ZmlsdGVyOmFscGhhKG9wYWNpdHk9MCk7b3BhY2l0eTowLjAwMTt6LWluZGV4OiI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wMDciO2k6MTtzOjEwOToifjxkaXYgc3R5bGU9LnBvc2l0aW9uOmFic29sdXRlO2ZpbHRlcjphbHBoYVwob3BhY2l0eT0wXCk7b3BhY2l0eTowXC4wMDE7ei1pbmRleDpcZCs7Ij48YSBocmVmPS4rP2E+PFwvZGl2Pn5pcyI7fXM6MjI6IkdxZ1NzZE1WTjU4QlVlUTl6SFZFclMiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDA4IjtpOjE7czo3MjoifjxkaXYgaWQ9IkdxZ1NzZE1WTjU4QlVlUTl6SFZFclMiIHN0eWxlPSJwb3NpdGlvbjogYWJzb2x1dGU7Lio/PjxcL2Rpdj5+Ijt9czoyMzoiPGRpdiBjbGFzcz0iX2FsbF93cGxpbmsiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLmFsbF93cGxpbmstZGl2LjAwMSI7aToxO3M6MTU1OiJ+PGRpdiBjbGFzcz0uX2FsbF93cGxpbmtfW14+XStzdHlsZT0ucG9zaXRpb246YWJzb2x1dGU7b3BhY2l0eTowLjAwMTtbXj5dKz4oW15cbl0rPGEgaHJlZltePF0rXHcrPC5hPikoW15cPl0rPC5kaXY+fFteXG5dK1xuXHMqPGEgaHJlZltePF0rXHcrPC5hPjwuZGl2Pil+cyI7fXM6Mjc6IjxkaXYgY2xhc3M9Il9hbGxfd3BsaW5rX25EOCI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuYWxsX3dwbGluay1kaXYuMDAyIjtpOjE7czo3NzoifjxkaXYgY2xhc3M9Ll9hbGxfd3BsaW5rX1tePl0rPig8YVxzKmhyZWYuLmh0dHAuLi5cdytbXj5dKz5bXjxdKzwuYT4pKzwuZGl2Pn4iO31zOjI0OiI8ZGl2IGNsYXNzPSJfYWxsX3dwbGlua18iO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLmFsbF93cGxpbmstZGl2LjAwMyI7aToxO3M6MTA5OiJ+PGRpdiBjbGFzcz0uX2FsbF93cGxpbmtfW14+XStzdHlsZT0ucG9zaXRpb246YWJzb2x1dGU7b3BhY2l0eTowLjAwMTtbXj5dKz4oW15cbl0rPGEgaHJlZltePF0rXHcrPC5hPik8LmRpdj5+Ijt9czoyNDoiPCEtLSB+fnNwb25zb3J+fiAtLT48ZGl2IjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5oaWRkZW4tZGl2LjAwOSI7aToxO3M6NTQ6In48Li0tIC4uc3BvbnNvci4uIC0tPlteXH5dKjwuLS0gXH5cfnNwb25zb3JlZFx+XH4gLS0+fiI7fXM6MzU6ImhhdmUgdW5jYW5ueSBwb2tlbW9uIGdvIGhhY2sgb25saW5lIjthOjI6e2k6MDtzOjIxOiJpbmplY3RlZC5zcGFtLXNlby4wMDgiO2k6MTtzOjE1NDoifjxkaXZccypjbGFzcz0iKFx3KykiPmhhdmVccyp1bmNhbm55XHMqcG9rZW1vblxzKmdvXHMqaGFja1xzKm9ubGluZVtePF0rPGFccypocmVmPS5odHRwOi4ucG9rZW1vbmdvLWhhY2tvbmxpbmVbXj5dKz5wb2tlW148XSs8LmE+XHMqb3V0bGV0c1xzKltePF0rPC5kaXY+fiI7fXM6Mzg6Ino2ZUlRZktFRnMyaWQvQi9ydVJUblpZdVFJdjhabDVDaUx0aFgwIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAzOSI7aToxO3M6Nzoifl4uKiR+cyI7fXM6MjE6IjxkaXYgc3R5bGU9InBvc2l0aW9uOiI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuaGlkZGVuLXNwYW4uMDAxIjtpOjE7czoxOTA6In4oPzo8L3NwYW4+KT8rKD86PFwvcD5ccyopPysoPGRpdiBzdHlsZT0icG9zaXRpb246XHMqYWJzb2x1dGU7ICg/OmJvdHRvbTogMHB4OyApPyg/OmxlZnR8dG9wKTpccyotWzAtOV17NCx9cHhbXjw+XSo/Pig/ITxpbnB1dCkoPz5bXjxdKig/Oig/ITxcL2Rpdj4pKD8hPGRpdik8fCg/MSl8KSkqPFwvZGl2PilccyooPzo8cD4pPyt+aXMiO31zOjE5OiI8ZGl2IGlkPSdhbGl2aWxsZSc+IjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5hbGl2aWxsZV9oaWRkZW4tZGl2LjAwMSI7aToxO3M6MzI6In48ZGl2IGlkPSdhbGl2aWxsZSc+Lio/PFwvZGl2Pn5zIjt9czo0MzoiWydhdG9iJ10oRltYXS5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpKSI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDAxIjtpOjE7czoxNjc6In5ccyo8c2NyaXB0W14+XSs+dmFyW15ce10rXHtbXj5dKz5cKDB4MUM0LFteOl0rOlwoXGQrLFxkKy4uLlwmXCZbXlwrXStcK1x3W147XSs7XHcrLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvblwoXClce2lmW15cIl0rXCJmYWxzZVwiXHMqW15cP10rXD96b25laWQ9W148XSs8LnNjcmlwdD5+Ijt9czoxNjoiPGRpdiBpZD0iZGl2X2lkXyI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wMzIiO2k6MTtzOjExOToifjxkaXYgaWQ9ImRpdl9pZF9bXGRdKyI+W1xzXSooW14+XSs/PGEgaHJlZltePl0rPyhbakpdb3JkYW58W2pKXWVyc2V5KXxbY0NdZWFwfFtzU11hbGV8W14+XSs/PltePF0rPzwuYT4pK1tePl0rPzwuZGl2Pn4iO31zOjMyOiJhV1lvYVhOZllXUnRhVzRvS1NrZ2NtVjBkWEp1T3c9PSI7YToyOntpOjA7czoyNToiaGFja3Rvb2wud3BfY29uZmlnX2RiLjAwMiI7aToxO3M6Nzoifl4uKiR+cyI7fXM6NzoiLmpzP3ByPSI7YToyOntpOjA7czo0MzoiaW5qZWN0ZWQuc2VyaWFsaXphdGlvbi5zY3JpcHRfaW5qZWN0aW9uLjAwMiI7aToxO3M6MjQyOiJ+dmFyIF8weFthLWYwLTldKz1cW1teXF1dK2NyZWF0ZUVsZW1lbnRbXixdKyxbXixdK3NjcmlwdFteLF0rLFteLF0rb25sb2FkW14sXSssW14sXStzcmNbXixdKyxbXixdK2h0dHBzPzpbXixdK2pzXD9wcj1bXGRdK1teXF1dK2FwcGVuZENoaWxkW14+XSs/XClcXVwoc2NyaXB0XCk7fDxzY3JpcHQgc3JjPVteO10raHR0cHM/OlteO10rc2NcLmpzW147XSt0eXBlPVteO10rdGV4dC5qYXZhc2NyaXB0W14+XSs+PC5zY3JpcHQ+fiI7fXM6NTQ6IlhLamhpYnZsR2RqNVdkbTFUWjdsQ1pzVUdMcnh5WXNFR0x3aGlidmxHZGo1V2RtaENiaFpYWiI7YToyOntpOjA7czoyMDoiYmFja2Rvb3IuanNfZXZhbC4wMDYiO2k6MTtzOjcwOiJ+dmFyIFtcd19dKz0uLlteO10rWlhaLi47ZnVuY3Rpb25bXj9dK2V2YWwuW1x3X10rXChbXHdfXStcKFtcd19dKy4uLjt+Ijt9czoxODoidGhpc1siZXZhbCJdKCIlOil7IjthOjI6e2k6MDtzOjIwOiJiYWNrZG9vci5qc19ldmFsLjAwNyI7aToxO3M6MTMwOiJ+PHNjcmlwdD5ccyp0aGlzXFsiZXZhbFwiXVwoIiU6XClce1woLTdce1xeLSZbXjxdKzwyOCwtbTFcKzR5b1teXDtdKztmb3JcKEs9MTtccypbXiJdKyIiLi5yZXZlcnNlLi4uam9pblteXH1dK1x9XClcKTtccyo8LnNjcmlwdD5+Ijt9czo0NzoiUEhOamNtbHdkQ0J6Y21NOUltaDBkSEJ6T2k4dlkyUnVMbTVoWW14aFltVmxMbU4iO2E6Mjp7aTowO3M6MjM6Im1hbHdhcmUuY3J5cHRvbWluZXIuMDA1IjtpOjE7czo3OiJ+Xi4qJH5zIjt9czozMzoiSlNPTi5wYXJzZShkKCdhcG9oY2RpImF9c2hpX3hkYSJlIjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5tYWdlbnRvX3Nob3BsaWZ0LjAwMSI7aToxO3M6Mjg4OiJ+PHNjcmlwdFxzKnR5cGU9LnRleHQuamF2YXNjcmlwdC4+Li5ccyo8XCFcW0NEQVRBXFtccypcIWZ1bmN0aW9uXChuLGUsaVwpXHtmdW5jdGlvblxzKi5cKG5cKVx7dmFyXHMqZT13aW5kb3dbXiJdKyJoY3RpbnMiW14iXSsiZ2prdGlwW147XSs7cmV0dXJuXHMqZVwmXCZbXjxdKzxbXj5dKz5uW14+XSs+bjtpZlwod2luZG93LkZpcmVidWdbXjpdKzpkOmFnZWJwW15cKV0rXClcKVwpLGFcKGwsSlNPTlteXFtdK1xbbixwb2V0W15cK10rXCtDUTlaS01EW15cKV0rXCk7XHMqLi5ccypcXVxdPjwuc2NyaXB0Pn4iO31zOjI2OiIpO307fSkobTRGW29dW3ZdLCdfb2t6Zmp0aSI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDA1IjtpOjE7czoxNzE6In48c2NyaXB0XHMqW14+XSs+dmFyXHMqXHcrPXdpbmRvdztmb3JbXj5dKz49XChcZCsuXHcrLFxkKy5cdytcKVw/W15cIl0rXCJJIjpbXlxbXStcW29cXVteXF9dK19cdysnLFxbJz09XHcrLi4udWwyZHU4MlteO10rOzwuc2NyaXB0PjxzY3JpcHRbXlxfXStcX29remZqdGlbXiJdKyI+PC5zY3JpcHQ+fiI7fXM6NDY6ImNsa3NpdGUuY29tL2FkU2VydmUvYmFubmVycz90aWQ9Nzk0NzlfMTI3NDgwXzciO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLmpzX3Vud2FudGVkX2Fkcy4wMDciO2k6MTtzOjEzNzoifjxzY3JpcHRccypkYXRhLWNmYXN5bmM9LmZhbHNlLlxzKnR5cGU9LnRleHQuamF2YXNjcmlwdC5ccypzcmM9Li4uXHcrLmNsa3NpdGUuY29tLmFkU2VydmVccyouYmFubmVycy50aWQ9Nzk0NzlfMTI3NDgwXzdbXiInXSsuPjwuc2NyaXB0Pn4iO31zOjIyOiJtb2Jpc2xhLmNvbS9ub3RpY2UucGhwIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA2NiI7aToxO3M6MTAzOiJ+PHNjcmlwdFxzKmFzeW5jPS5hc3luYy5ccyp0eXBlPS50ZXh0LmphdmFzY3JpcHQuXHMqc3JjPS4uLlx3Ky5tb2Jpc2xhLmNvbS5ub3RpY2UucGhwW14iJ10rLj48LnNjcmlwdD5+Ijt9czozMjoiPCEtLSBCZWdpbiBDb29raWUgQ29uc2VudCBzY3JpcHQiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLmpzX2Nvb2tpZV9oaWphY2suMDAxIjtpOjE7czozNTg6In48XCEtLVxzKkJlZ2luXHMqQ29va2llW14+XSs+XHMqPHNjcmlwdFtePl0rPlxzKndpbmRvdy5jb29raWVjb25zZW50W14iXSsibWVzc2FnZSI6IlRoaXNccyp3ZWJzaXRlXHMqdXNlc1xzKmNvb2tpZXNbXiddKydcdystXHcrLVx3K1teJ10rJzs8LnNjcmlwdD5ccyo8c2NyaXB0XHN0eXBlPS5bXiciXSsiXHMqc3JjPS4uLlteXC9dK1wvbGlic1wvY29va2llW14+XSs+PC5zY3JpcHQ+XHMqPG5vc2NyaXB0PjxhXHMqaHJlZj1bIiddW14+XSs+KEVVXHMqKT9bQ2Ndb29raWVccypbQ2Ndb25zZW50XHMqW1NzXWNyaXB0PC5hPjwubm9zY3JpcHQ+XHMqXDxcIS0tXHMqRW5kXHMqQ29va2llXHMqQ29uc2VudFxzKnNjcmlwdFxzKi0tPn4iO31zOjE3MDoiY2hyKDY0KS5jaHIoMTAxKS5jaHIoMTE4KS5jaHIoOTcpLmNocigxMDgpLmNocig0MCkuY2hyKDk4KS5jaHIoOTcpLmNocigxMTUpLmNocigxMDEpLmNocig1NCkuY2hyKDUyKS5jaHIoOTUpLmNocigxMDApLmNocigxMDEpLmNocig5OSkuY2hyKDExMSkuY2hyKDEwMCkuY2hyKDEwMSkuY2hyKDQwKS4iO2E6Mjp7aTowO3M6MjE6ImJhY2tkb29yLmNocl9ldmFsLjAwMSI7aToxO3M6MjEzOiJ+XHtcJFx7XCRcdytccyo9W147XStjaHJcKDY0XClcLmNoclwoMTAxXClcLmNoclwoMTE4XClcLmNoclwoOTdcKVwuY2hyXCgxMDhcKVwuY2hyXCg0MFwpXC5jaHJcKDk4XClcLmNoclwoOTdcKVwuY2hyXCgxMTVcKVwuY2hyXCgxMDFcKVwuY2hyXCg1NFwpXC5jaHJcKDUyXClcLmNoclwoOTVcKVwuY2hyXCgxMDBcKVwuY2hyXCgxMDFcKVteO10rXH1cfShce1wkXHcrXH0pP34iO31zOjMyOiI4NmU2YTJlNzg4MGE5MjIzNDM2NDM4YjQxMmFmZDYyZCI7YToyOntpOjA7czoxNzoiYmFja2Rvb3IubW9keC4wMDEiO2k6MTtzOjc6In5eLiokfnMiO31zOjEyOiI9QCRfQ09PS0lFWyIiO2E6Mjp7aTowO3M6MjQ6ImJhY2tkb29yLmV2YWxfQ09PS0lFLjAwMSI7aToxO3M6NjI6In5cJFx3Kz1AXCRfQ09PS0lFXFsuXHcrLi47XHMqaWZbXkBdK0BcJF9DT09LSUVbXj5dK3BocGluZm8uLjt+Ijt9czoxMjoiPT0iKSwiLiIpfX17IjthOjI6e2k6MDtzOjE4OiJiYWNrZG9vci5zaGVsbC4wMDQiO2k6MTtzOjU2OiJ+XHtcJFx7XCRcdys9W14sXSssXCRcdytcKC5cdys9PS5cKSwuXC4uXClcfVx9XHtcJFx3K1x9fiI7fXM6MjY6IkhhVFJrIEZpbGUgTWFuYWdlcjwvdGl0bGU+IjthOjI6e2k6MDtzOjI0OiJoYWNrdG9vbC5maWxlbWFuYWdlci4wMDEiO2k6MTtzOjEwOToifjwucGhwXHMqc2V0X3RpbWVfbGltaXQuMC47W148XSs/ZWNobyAuPC5ET0NUWVBFIEhUTUw+W15ce10rP0hhVFJrIEZpbGUgTWFuYWdlci4rP3JldHVybiBcJGluZm87XHMqXH1ccypcPz5+cyI7fXM6MjQ6ImFkZCcpO2V4aXQ7fWVjaG8gJ3RydWUnOyI7YToyOntpOjA7czoxNzoiYmFja2Rvb3IuUE9TVC4wMDIiO2k6MTtzOjExNzoifmlmXChpc3NldFwoXCRfUE9TVFxbLlx3Ky5cXVwpXClce0BwcmVnX3JlcGxhY2VcKC4uLi5lLiwuZS4uLnZhbFwoXCRfUE9TVFxbLlx3Ky5cXVwpLixccy5hZGQuXCk7ZXhpdDtcfWVjaG8uLnRydWUuXDt+Ijt9czo0NToiR1YyWVd3b1ltRnpaVFkwWDJSbFkyOWtaU2duV201V2RWa3pVbkJpTWpSbll6IjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci5ldmFsX2Jhc2U2NC4wMDciO2k6MTtzOjExMToiflwkXHcrPS4uMTQyLi4uLjE0MS4uLi54NzMuLi4ueDY1Li4uLngzNi4uY2hyXCg1MlwpW14sXSssXCRcdytcKC5RR1YyWVd3b1ltRnpaVFkwWDJSbFkyOWtaU2duV21bXiJdKyJcKSwuLi5cKTt+Ijt9czozODoicldtZ3NKZzMyZnZsNkJzeEltUCtKTFo5MjdURU5acUJrZnkyUnciO2E6Mjp7aTowO3M6MTk6ImJhY2tkb29yLnN1YnN0ci4wMDIiO2k6MTtzOjEyOToiflwkXHcrPS5yV21nc0pnMzJmdmw2QnN4SW1QW149XSs9PS47XCR4Llx3K1xzKj1ccyouc3RyLi4uLnJvdFteXH1dK1x9XH1ccyppZlwoaXNzZXRcKFwkXHcrXClcKVxzKlx7XHMqXCRcdytccyo9XHMqdGVtcG5hbVtefV0rXH1+Ijt9czo4NzoiZURSbVhIZzBNbCB4NE5ERmNlRFJqIFhIZzFNeUo5V3kgSmNlRGMzWEhnMyBNVng0TmpkY2VEIFl6WWx4NE5tTWkgWFQwaWEyVjVJaiB0bWIzSmxZV05vIjthOjI6e2k6MDtzOjIzOiJiYWNrZG9vci5vYmZ1c2NhdGVkLjAwMSI7aToxO3M6MTYwOiJ+UEQ5d2FIQWdKSFsoPzpcd1xzKildK2VEUm1YSGcwTWxccyp4NE5ERmNlRFJqXHMqWEhnMU15SjlXeVxzKkpjZURjM1hIZzNccypNVng0TmpkY2VEXHMqWXpZbHg0Tm1NaVxzKlhUMGlhMlY1SWpccyp0bWIzSmxZV05vWyg/Olx3XHMqKV0rWEhnMk5DSmRLVFxzKnQ5ZlEwS1B6ND1+Ijt9czo5ODoiU0dWbWFsZHBORyBwWE5IVkxlSFpsIFFUWjFaRUpKZGwgTkpjMHRaYm13eCBWVnBqTTFCd1prIHRNTDFodFdtcEcgUkhjdlUwZG5hVyB4b1owSnhOSHA1IFowbEllWEJ4VVUiO2E6Mjp7aTowO3M6MjM6ImJhY2tkb29yLm9iZnVzY2F0ZWQuMDAyIjtpOjE7czoyOTE6In5QRDl3YUhBZ0pFWyg/Olx3XHMqKV0rU0dWbWFsZHBOR1xzKnBYTkhWTGVIWmxccypRVFoxWkVKSmRsXHMqTkpjMHRaYm13eFxzKlZWcGpNMUJ3Wmtccyp0TUwxaHRXbXBHXHMqUkhjdlUwZG5hV1xzKnhvWjBKeE5IcDVccypaMGxJZVhCeFVVWyg/Olx3XHMqKV0rWjBiRTh5VjI5alxzKlF6WkNkVXMwU21ccyp4TVFVUnBaVEp4XHMqV0VNMVkxVkZVelxzKmd5VDFsSk5sbFBccyplRWt5YkZOTmR6XHMqVnFZMlpKUVhGU1xzKk55dHBUMlJRYmxccypwMkwzWldkbTlHWyg/Olx3XHMqKV0rSWpnM01TSXBPd1xzKj09fiI7fXM6NzE6IiZkYXRhPScuJGRhdGEuJycpOyAkY29kZSA9IGN1cmxfZXhlYygkY2gpOyBjdXJsX2Nsb3NlKCRjaCk7IGVjaG8gJGNvZGU7IjthOjI6e2k6MDtzOjE3OiJiYWNrZG9vci5jdXJsLjAwMSI7aToxO3M6MzIxOiJ+PFw/KD86cGhwKT9ccyooXCRcdyspXHMqPVxzKlsnIl1bXjtdKztccypmdW5jdGlvblxzKlx3K1woXClccypce1xzKmlmXHMqXChcKFwhW147XSs7XHMqfVxzKmVsc2VpZlxzKlwoXChcIVteXDJdK2Vsc2Vccypce1wkXHcrXHMqPVxzKlsnIl1bJyJdXHMqO1xzKn1ccypcJGNoXHMqPVxzKmN1cmxfaW5pdFxzKlwoXClccyo7XHMqY3VybF9zZXRvcHRcKFwkY2gsXHMqQ1VSTE9QVF9VUkwsXHMqWyciXWh0dHBbXlwyXSsoXCRcdyspXHMqPVxzKmN1cmxfZXhlY1woXCRjaFwpXHMqO1xzKmN1cmxfY2xvc2VcKFwkXHcrXClccyo7XHMqZWNob1xzKlwyXHMqO1xzKlw/Pn4iO31zOjIzOiIvd29yZHByZXNzJyk7IGV4aXQ7fSA/PiI7YToyOntpOjA7czoyMToiYmFja2Rvb3IuaW5jbHVkZXMuMDAxIjtpOjE7czoxMTA6In48XD9waHBccyppZlwoaXNzZXRcKFwkX1JFUVVFU1RcWy5cdysuXF1cKVwpXHMqe1xzKmluY2x1ZGVcKFsnIlwvXHddK3dvcmRwcmVzc1snIl1cKVxzKjtccypleGl0XHMqO1xzKn1ccypcPz5+Ijt9czoyNDoid2Vtb3ZlZHRvdGhpc2FkZHJlc3MuY29tIjthOjI6e2k6MDtzOjIxOiJpbmplY3RlZC5zcGFtLXNlby4wMDUiO2k6MTtzOjE3MjoifjxhXHMqaHJlZj0uaHR0cC4uLndlbW92ZWR0b3RoaXNhZGRyZXNzLmNvbS5jYXRhbG9nLltCYl1lc3RzZWxsZXJzLltWdl1pYWdyYS5cdysuPjxpbWdccypbXjpdKy4uLndlbW92ZWR0b3RoaXNhZGRyZXNzW14iXSsiXHMqYWx0W14+XSs+PC5hPlxzKjxoMj48c3Ryb25nPlxzKjwuc3Ryb25nPjwuaDI+fiI7fXM6Mjc6ImxlYWRwbGF5Lm1vYmkvP3RyYWNraW5nX2lkPSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWV0YV9yZWRpcmVjdC4wMDMiO2k6MTtzOjk5OiJ+PG1ldGFccypodHRwLWVxdWl2PS5yZWZyZXNoLlxzKmNvbnRlbnQ9LjE7VVJMPWh0dHBzOi4uKHd3dy4pbGVhZHBsYXkubW9iaS5cP3RyYWNraW5nX2lkPVteIl0rIi4uPn4iO31zOjIwOiJIYWNrZWQgQnkgTXVobWFkRW1hZCI7YToyOntpOjA7czoyMToiZGVmYWNlZC5oYWNrZWRfYnkuMDA4IjtpOjE7aToxMjt9czoxMDoiUjAwdFNMYXllciI7YToyOntpOjA7czoyMToiZGVmYWNlZC5oYWNrZWRfYnkuMDE1IjtpOjE7czoxMDQ6In5bME9vXXduWzNFZV1kXHMqW0JiXXlccyooLik/XHMqUjAwdFNMYXllclxzKiguKT9ccypbUHBdcml2YXRlaGFja2Vyc1wuY29tKFxzKiMrKT8oXHMqPGltZyBzcmM9W14+XSs+KT9+Ijt9czo1OToiPGltZyBzcmM9eCBvbmVycm9yPT48aW5wdXQgYXV0b2ZvY3VzIG9uZm9jdXM9Pjxzdmcvb25sb2FkPT4iO2E6Mjp7aTowO3M6MTY6ImluamVjdGVkLnhzcy4wMDEiO2k6MTtzOjU4OiJ+PGltZyBzcmM9eCBvbmVycm9yW14+XSs+W1xzXSo8aW5wdXRbXj5dKz5bXHNdKjxzdmdbXj5dKz5+Ijt9czoyNDoiPD9waHAgZmlsZV9wdXRfY29udGVudHMoIjthOjI6e2k6MDtzOjIxOiJiYWNrZG9vci51cGxvYWRlci4wMDIiO2k6MTtzOjI5OiJ+ZmlsZV9wdXRfY29udGVudHNcKFteO10rXCk7fiI7fXM6Mzk6ImFXWWdLQ0ZqYkdGemMxOWxlR2x6ZEhNb0oxSmhkR1ZzSnlrcElIdCI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuYmFzZTY0X3dpZGdldC4wMDEiO2k6MTtpOjExO31zOjM0OiIvanMvZnVsbC1wYWdlLXNjcmlwdC5qcyc+PC9zY3JpcHQ+IjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5qc191bndhbnRlZF9hZHMuMDEzIjtpOjE7aToxMTt9czozMDoidmFyIGFTaXRlcyA9IG5ldyBBcnJheSgnZ29vZ2xlIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5qc191bndhbnRlZF9hZHMuMDAzIjtpOjE7aToxMTt9czo1ODoidG9VcmwrPSIiOyBpZihwYXRybi5leGVjKHJVcmwpKXdpbmRvdy5sb2NhdGlvbi5ocmVmPXRvVXJsOyI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDAzIjtpOjE7aToxMTt9czoyMjoiZnVuY3Rpb24gY2xrKCl7dmFyIF8weCI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2Z1bmN0aW9uLjAxMCI7aToxO2k6MTE7fXM6NDI6Im0rPVN0cmluZy5mcm9tQ2hhckNvZGUocy5jaGFyQ29kZUF0KGkpLTEpOyI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wMzAiO2k6MTtpOjExO31zOjIzOiJzZW5kOmZ1bmN0aW9uKCl7dHJ5e3ZhciI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2Z1bmN0aW9uLjAxMSI7aToxO2k6MTE7fXM6Mzk6Int0b3AubG9jYXRpb24gPSAnaHR0cHM6Ly91bHRyYWZpbGVzLmNvLyI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDA0IjtpOjE7aToxMTt9czo3OiJzdHJ0cigkIjthOjI6e2k6MDtzOjE5OiJiYWNrZG9vci5zdWJzdHIuMDAxIjtpOjE7aToxMTt9czo4OiJzeXN0ZW0oJyI7YToyOntpOjA7czoxOToiYmFja2Rvb3Iuc3lzdGVtLjAwMSI7aToxO2k6MTE7fXM6NzoiYXNzZXJ0KCI7YToyOntpOjA7czoxOToiYmFja2Rvb3IuYXNzZXJ0LjAwMSI7aToxO2k6MTE7fXM6NTA6Ij0gcHJlZ19yZXBsYWNlKCRhcywgc3RydHIoJHZiZywgJHhtbCwgJHhtbDIpLCAnY3NzIjthOjI6e2k6MDtzOjI1OiJiYWNrZG9vci5wcmVnX3JlcGxhY2UuMDAyIjtpOjE7aToxMTt9czoyNDoiPXByZWdfcmVwbGFjZSgkZixzdHJ0cigkIjthOjI6e2k6MDtzOjI1OiJiYWNrZG9vci5wcmVnX3JlcGxhY2UuMDAzIjtpOjE7aToxMTt9czo1NjoiJGNvbnRlbnQgPSBwcmVnX3JlcGxhY2UoJyE8L2JvZHk+IXNpJywgJGNvZGUgLiAnPC9ib2R5PiciO2E6Mjp7aTowO3M6MjU6ImJhY2tkb29yLnByZWdfcmVwbGFjZS4wMDQiO2k6MTtpOjExO31zOjQ3OiIkZGF0YT1NT0R4IENhY2hlIERhdGEgKGRvbnQgY2hhbmdlKTt0ZXh0O2V5SnRaWCI7YToyOntpOjA7czoyNDoiaGFja3Rvb2wuZmlsZW1hbmFnZXIuMDA2IjtpOjE7aToxMTt9czoyMjoiaWYgKHN0cnBvcyAoJHJlZiwgJ2cnLiI7YToyOntpOjA7czoxOToiYmFja2Rvb3Iuc3RycG9zLjAwMiI7aToxO2k6MTE7fXM6NDg6IkBlcnJvcl9yZXBvcnRpbmcoMCk7IEBzZXRfdGltZV9saW1pdCgwKTsgICAkY29kZSI7YToyOntpOjA7czoxNzoiYmFja2Rvb3IuZXZhbC4wMDQiO2k6MTtpOjExO31zOjM0OiJpZiggJF9QT1NUWydfdXBsJ10gPT0gIlVwbG9hZCIgKSB7IjthOjI6e2k6MDtzOjI0OiJoYWNrdG9vbC5maWxlbWFuYWdlci4wMDUiO2k6MTtpOjExO31zOjE3OiI8dGl0bGU+TWlzdGVyIFNweSI7YToyOntpOjA7czoyNDoiaGFja3Rvb2wuZmlsZW1hbmFnZXIuMDA3IjtpOjE7aToxMTt9czoyMjoiJF9QT1NUWydwYXNzd29yZCddID09ICI7YToyOntpOjA7czoyNDoiaGFja3Rvb2wuZmlsZW1hbmFnZXIuMDA0IjtpOjE7aToxMTt9czoyNDoiZmlsZV9nZXRfY29udGVudHMoJ2h0dHA6IjthOjI6e2k6MDtzOjI0OiJoYWNrdG9vbC5maWxlbWFuYWdlci4wMDMiO2k6MTtpOjExO31zOjUwOiJpZiAoc3RycG9zKCRfU0VSVkVSWydQSFBfU0VMRiddLCdzdWJzY3JpcHRpb25zLnBocCI7YToyOntpOjA7czoxOToiYmFja2Rvb3Iuc3RycG9zLjAwMSI7aToxO2k6MTE7fXM6MjM6ImlmKGlzc2V0KCRfUkVRVUVTVFsneCddIjthOjI6e2k6MDtzOjIwOiJiYWNrZG9vci5SRVFVRVNULjAwMSI7aToxO2k6MTE7fXM6Mjk6IlNFTEVDVCBgY29kZWAgRlJPTSBgd3BfY29uZmlnIjthOjI6e2k6MDtzOjI1OiJoYWNrdG9vbC53cF9jb25maWdfZGIuMDAxIjtpOjE7aToxMTt9czo1OiJIbWVpNyI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wMTIiO2k6MTtpOjExO31zOjY6ImFyZ2FpdiI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wMTMiO2k6MTtpOjExO31zOjY6InNpbGFpYyI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wMTQiO2k6MTtpOjExO31zOjg6ImVsaXRjZXJlIjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5oaWRkZW4tZGl2LjAxNSI7aToxO2k6MTE7fXM6OToiZWNuZXRvcG1pIjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5oaWRkZW4tZGl2LjAxNiI7aToxO2k6MTE7fXM6ODoieWNhbXJhaHAiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDE3IjtpOjE7aToxMTt9czo2OiJ5YWR5YXAiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDE4IjtpOjE7aToxMTt9czoxNDoiZXRpcncudG5lbXVjb2QiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDE5IjtpOjE7aToxMTt9czo2OiI0NmVzYWIiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDIwIjtpOjE7aToxMTt9czoxMjoiZWNhbHBlcl9nZXJwIjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5oaWRkZW4tZGl2LjAyMSI7aToxO2k6MTE7fXM6OToiZXRhbGZuaXpnIjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5oaWRkZW4tZGl2LjAyMiI7aToxO2k6MTE7fXM6MTE6ImFsX2tpX3NoZWxsIjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5oaWRkZW4tZGl2LjAyMyI7aToxO2k6MTE7fXM6NjoiTENXRUhIIjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5oaWRkZW4tZGl2LjAyNCI7aToxO2k6MTE7fXM6MTY6InB0dGgiPWNycyB0cGlyY3MiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDI1IjtpOjE7aToxMTt9czo1OiJ1Z2djOiI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wMjYiO2k6MTtpOjExO31zOjEyOiJtb2MubmliZXRzYXAiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDI5IjtpOjE7aToxMTt9czo2ODoiVFVWVVFTQm9kSFJ3TFdWeGRXbDJQU0p5WldaeVpYTm9JaUJqYjI1MFpXNTBQU0l3TzN0bWNtRnRaVjkxY214OUlqNEsiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDMwIjtpOjE7aToxMTt9czo2OiJTRW9ET1IiO2E6Mjp7aTowO3M6MjE6ImluamVjdGVkLnNwYW0tc2VvLjAxMyI7aToxO2k6MTE7fXM6MTA6InBhc3N0aHJ1KCQiO2E6Mjp7aTowO3M6MjE6ImhhY2t0b29sLnBhc3N0aHJ1LjAwMSI7aToxO2k6MTE7fXM6MTY6Imh0dHAub3BlbigiUE9TVCIiO2E6Mjp7aTowO3M6MTc6ImJhY2tkb29yLlBPU1QuMDAxIjtpOjE7aToxMTt9czoyNToiZGVidWcoJ0hPT0sgLSBhZGRfcmVrbGFtYSI7YToyOntpOjA7czoxODoiYmFja2Rvb3Iuc2hlbGwuMDAxIjtpOjE7aToxMTt9czo3OiJTSEVMTCc+IjthOjI6e2k6MDtzOjE4OiJiYWNrZG9vci5zaGVsbC4wMDIiO2k6MTtpOjExO31zOjI4OiJQcm9kdWN0IEtleTwvYT4mbmJzcDsmbmJzcDt8IjthOjI6e2k6MDtzOjIxOiJpbmplY3RlZC5zcGFtLXNlby4wMDEiO2k6MTtpOjExO31zOjIxOiJQcm9kdWN0IEtleSBHZW5lcmF0b3IiO2E6Mjp7aTowO3M6MjE6ImluamVjdGVkLnNwYW0tc2VvLjAwMiI7aToxO2k6MTE7fXM6MTQ6Im1vYy5uaWJldHNhcC8vIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjAwMSI7aToxO2k6MTE7fXM6MzE6ImJkdi5iaWR2ZXJ0aXNlci5jb20vQmlkVmVydGlzZXIiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDAyIjtpOjE7aToxMTt9czo0MDoicCsnd3d3LndlYnV0YXRpb24ubmV0L2pzL2xvYWRfYmFkZ2UuanMnOyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMDMiO2k6MTtpOjExO31zOjE3OiJvbmxpbmUtc2FsZTI0LmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMDQiO2k6MTtpOjExO31zOjEyOiJlY2xrc3Bibi5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDA1IjtpOjE7aToxMTt9czoyNDoiYWRzaGV4YS5jb20vc2hvd19hZHMucGhwIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjAwNiI7aToxO2k6MTE7fXM6MTU6ImxvZ2lzdGljdXNhLmJpeiI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMDciO2k6MTtpOjExO31zOjMwOiJha2FtYWloZC5uZXQvbG9hZGVycy8xMDMyL2wuanMiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDA4IjtpOjE7aToxMTt9czoxNjoiLWJpbmFyeS1vcHRpb25zLSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMDkiO2k6MTtpOjExO31zOjE2OiJzZW5kaW5nLW1vbmV5LXRvIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjAxMCI7aToxO2k6MTE7fXM6MTQ6ImFkU2VydmUvYmFubmVyIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjAxMSI7aToxO2k6MTE7fXM6MTU6InNyYz0nLy9lY2xrbXBzYSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMTIiO2k6MTtpOjExO31zOjE3OiJzcmM9Ii8vZ28ubW9iaXNsYSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMTMiO2k6MTtpOjExO31zOjE3OiJzcmM9Ii8vZ28ucHViMnNydiI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMTQiO2k6MTtpOjExO31zOjk6ImMwNTk0LmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMTUiO2k6MTtpOjExO31zOjIzOiJqcy9nb29nbGUtc2VydmljZXMucGhwPyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMTYiO2k6MTtpOjExO31zOjI2OiJyZXN0d3AubW9iaWRlYS5jb20vanNyZWRpciI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMTciO2k6MTtpOjExO31zOjI0OiJ3ZWJkYXRhc291cmNldHJhZmZpYy54eXoiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDE4IjtpOjE7aToxMTt9czoyNjoidGhlbWUtaW5kZXgucGhwIj48L3NjcmlwdD4iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDE5IjtpOjE7aToxMTt9czozMjoibWFnZW50b19nb29naWVwbGF5LmpzIj48L3NjcmlwdD4iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDIwIjtpOjE7aToxMTt9czo2MzoibWV0YSBodHRwLWVxdWl2PSJyZWZyZXNoIiBjb250ZW50PSIwO1VSTD1odHRwOi8vbWlxaXoudm9sdXVtdHJrIjthOjI6e2k6MDtzOjIxOiJpbmplY3RlZC5tZXRhX3RhZy4wMDEiO2k6MTtpOjExO31zOjE3OiJGUkVFIEdpZnQhPC9zcGFuPiI7YToyOntpOjA7czoyMToiaW5qZWN0ZWQuc3BhbS1zZW8uMDAzIjtpOjE7aToxMTt9czozMzoic2NyaXB0IHNyYz0iaHR0cHM6Ly9qcXVlcnktY3NzLnN1IjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5mYWtlX2pxdWVyeS4wMDEiO2k6MTtpOjExO31zOjIwOiJUb3JyZW50IERvd25sb2FkPGJyPiI7YToyOntpOjA7czoyMToiaW5qZWN0ZWQuc3BhbS1zZW8uMDA0IjtpOjE7aToxMTt9czoxNToiaW1hZ2VzL3dlbGNvbWVfIjthOjI6e2k6MDtzOjE4OiJpbmplY3RlZC5pbWFnZS4wMDEiO2k6MTtzOjM5OiJ+KC4uKS5cdytcL2ltYWdlc1wvd2VsY29tZV8yMDFcZCtcLnBuZ34iO31zOjQwOiJjb250ZW50PSIwO1VSTD1odHRwOi8veGdlbmNhc2xhbm4uZXN5LmVzIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tZXRhX3JlZGlyZWN0LjAwMSI7aToxO2k6MTE7fXM6NTY6Im1ldGEgaHR0cC1lcXVpdj0mcXVvdDtyZWZyZXNoJnF1b3Q7IGNvbnRlbnQ9JnF1b3Q7MDtVUkw9IjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tZXRhX3JlZGlyZWN0LjAwMiI7aToxO2k6MTE7fXM6MjM6Ii9pYy5qcyI+PC9zY3JpcHQ+SEFDS0VEIjthOjI6e2k6MDtzOjIxOiJkZWZhY2VkLmhhY2tlZF9ieS4wMDEiO2k6MTtpOjExO31zOjk6IkhBQ0tFRCBCWSI7YToyOntpOjA7czoyMToiZGVmYWNlZC5oYWNrZWRfYnkuMDAyIjtpOjE7aToxMTt9czo5OiJIYWNrZWQgQnkiO2E6Mjp7aTowO3M6MjE6ImRlZmFjZWQuaGFja2VkX2J5LjAwMyI7aToxO2k6MTE7fXM6MTc6Ijx0aXRsZT5IYWNrZWQ/IE1yIjthOjI6e2k6MDtzOjIxOiJkZWZhY2VkLmhhY2tlZF9ieS4wMDQiO2k6MTtpOjExO31zOjEzOiI8dGl0bGU+SGFja2VkIjthOjI6e2k6MDtzOjIxOiJkZWZhY2VkLmhhY2tlZF9ieS4wMDUiO2k6MTtpOjExO31zOjEzOiI8dGl0bGU+SEFDS0VEIjthOjI6e2k6MDtzOjIxOiJkZWZhY2VkLmhhY2tlZF9ieS4wMDYiO2k6MTtpOjExO31zOjk6IkhBQ0tFRCBCeSI7YToyOntpOjA7czoyMToiZGVmYWNlZC5oYWNrZWRfYnkuMDA3IjtpOjE7aToxMTt9czo5OiJIYUNrZUQgYnkiO2E6Mjp7aTowO3M6MjE6ImRlZmFjZWQuaGFja2VkX2J5LjAwOSI7aToxO2k6MTE7fXM6MTU6IiU2MSU2MyU2YiU2NSU2NCI7YToyOntpOjA7czoyMToiZGVmYWNlZC5oYWNrZWRfYnkuMDEwIjtpOjE7aToxMTt9czo1OiJpYWxpcyI7YTo5Mzp7aTowO2k6MTA7czoyMjoiTm8gUHJlc2NyaXB0aW9uIE5lZWRlZCI7YToyOntpOjA7aToxMDtzOjEyOiJjaWFsaXMgcHJpY2UiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wODIiO2k6MTtzOjc6In5eLiokfnMiO319czozNjoiQ2lhbGlzIE9ubGluZSBPdmVybmlnaHQgU2hpcHBpbmcgQnV5IjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDg0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI1OiJDaWFsaXMgb3Zlcm5pZ2h0IGRlbGl2ZXJ5IjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDg1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjc6Ii1jaWFsaXMiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTU6IjFnZW5lcmljLWNpYWxpcyI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjAwMiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNDoiYWNpYWxpc2ZvcnNhbGUiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wMDMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTE6ImJidXktY2lhbGlzIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDA0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE3OiJiZXN0LWNpYWxpcy1wcmljZSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjAwNSI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMzoiYmVzdGNoZWFwLWNpYWxpcy1vbmxpbmUiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wMDYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTA6ImJ1eSBjaWFsaXMiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wMDciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6ImJ1eS1jaGVhcHAtY2lhbGlzIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDA4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE3OiJidXktY2lhbGlzLW9ubGluZSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjAwOSI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMDoiYnV5LWNpYWxpcy1vbmxpbmUtZWQiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wMTAiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTE6ImJ1eS1jaWFsaXNzIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDExIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIwOiJidXljaGVhcGNpYWxpc29ubGluZSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjAxMiI7aToxO3M6OToic3BhbV9saW5rIjt9czo5OiJidXljaWFsaXMiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wMTMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTk6ImJ1eXNvZnRjaWFsaXNvbmxpbmUiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wMTQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6ImNjaWFsaXMtcHJpY2Uub3JnIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDE1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjExOiJjY2lhbGlzMjBtZyI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjAxNiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMzoiY2NpYWxpc29ubGluZSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjAxNyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNzoiLWNoZWFwZXN0LWNpYWxpcy0iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wMTgiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6ImNoZWFwLWNpYWxpc2UuY29tIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDE5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE3OiJjaGVhcC1jaWFsaXNzLmNvbSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjAyMCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxOToiY2hlYXBwY2lhbGlzLW9ubGluZSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjAyMSI7aToxO3M6OToic3BhbV9saW5rIjt9czo5OiJjaWFsaXMtMjAiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wMjIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTE6ImNpYWxpcy1iZXN0IjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDIzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE3OiJjaWFsaXMtY2FuYWRhLmNvbSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjAyNCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMToiY2lhbGlzLWdlbmVyaWMtZWQuY29tIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDI1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE5OiJjaWFsaXMtZ2VuZXJpY3MuY29tIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDI2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI0OiJjaWFsaXMtb25saW5lLWl0YWxpYS5vcmciO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wMjciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjM6ImNpYWxpcy1vbmxpbmUtcHJpY2UuY29tIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDI4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIzOiJjaWFsaXMtb25saW5lLXByaWNlLm5ldCI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjAyOSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxODoiY2lhbGlzLW9ubGluZXNhbGVzIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDMwIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE1OiJjaWFsaXMtcGFzLWNoZXIiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wMzEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTY6ImNpYWxpcy1waGFybS5jb20iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wMzIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6ImNpYWxpcy1waWxsc3MuY29tIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDMzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEzOiJjaWFsaXMtcHJpY2VlIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDM0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE0OiJjaWFsaXMtcHJpY2VzcyI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjAzNSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMjoiY2lhbGlzLXMuY29tIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDM2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjMyOiJjaWFsaXMtd2l0aG91dC1wcmVzY3JpcHRpb25zLm9yZyI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjAzNyI7aToxO3M6OToic3BhbV9saW5rIjt9czozMzoiY2lhbGlzLXdpdGhvdXR0LXByZXNjcmlwdGlvbnMuY29tIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDM4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjc6ImNpYWxpczEiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wMzkiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6NzoiY2lhbGlzYSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA0MCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNDoiY2lhbGlzY2FuYWRhc3QiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wNDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTM6ImNpYWxpc29ubGluZWUiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wNDIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjA6ImNpYWxpc29ubGluZW5vd2Uub3JnIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDQzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE0OiJjaWFsaXNvbmxpbmVvbiI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA0NCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNzoiY2lhbGlzb29ubGluZS5jb20iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wNDUiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTM6ImNpYWxpc3ByaWNlYWEiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wNDYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTI6ImNpYWxpc3ByaWNlZSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA0NyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNjoiY2lhbGlzcy0yMG1nLmNvbSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA0OCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxODoiY2lhbGlzcy1vbmxpbmUub3JnIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDQ5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEzOiJjaWFsaXNzLXByaWNlIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDUwIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjMyOiJjaWFsaXNzLXdpdGhvdXQtcHJlc2NyaXB0aW9uLmNvbSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA1MSI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMjoiY2lhbGlzc3VwZXJhY3RpdmVlLmNvbSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA1MiI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMjoiY29tcHJhcmUtY2lhbGlzLW9ubGluZSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA1MyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxODoiZGNpYWxpc2ZvcnNhbGUuY29tIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDU0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE4OiJkY2lhbGlzZm9yc2FsZS5uZXQiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wNTUiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTg6ImUtb25saW5lY2lhbGlzLmNvbSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA1NiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxODoiZS1vbmxpbmVjaWFsaXMubmV0IjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDU3IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE1OiJnZW5lcmljLWNpYWxpc3MiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wNTgiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6ImdlbmVyaWNjaWFsaXNmYXN0IjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDU5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjM1OiJnZ2VuZXJpYy1jaWFsaXMtbm8tcHJlc2NyaXB0aW9uLmNvbSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA2MCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNzoibm9uLXByZXNjcmlwdGlvbi1jaWFsaXMuY29tIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDYxIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIxOiJvbmxpbmVjaWFsaXNjaGVhcC5jb20iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wNjIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjE6Im9ubGluZWNpYWxpc2NoZWFwLm5ldCI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA2MyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxOToib25saW5lb3JkZXJjaWFsaXN1ayI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA2NCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMDoib3JkZXItY2lhbGlzLW9ubGluZXEiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wNjUiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTM6Im9yZGVyLWNpYWxpc3MiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wNjYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTY6Im9yZGVyY2hlYXBjaWFsaXMiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wNjciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6Im9yZGVyci1jaWFsaXMub3JnIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDY4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI5OiJwaGFybWFjaWUtZW4tbGlnbmUtY2lhbGlzLm9yZyI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA2OSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNjoicGlsbHMtY2lhbGlzLmNvbSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA3MCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNzoicGxvY2lhLWNpYWxpcy10YWRhbGFmaWwuY29tIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDcxIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE4OiJzYnV5aW5nLWNpYWxpcy5jb20iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wNzIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTg6InNidXlpbmctY2lhbGlzLm5ldCI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA3MyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNToidGhlY2hlYXAtY2lhbGlzIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDc0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE0OiJ2ZW5kaXRhLWNpYWxpcyI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA3NSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNjoidmljaWFsaXNhYnV5LmNvbSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA3NiI7aToxO3M6OToic3BhbV9saW5rIjt9czozMDoiY2lhbGlzLWNhbmFkaWFuLW5vLXByZXNjaXB0aW9uIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDc3IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjg6ImNpYWxpcy0wIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDc4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE4OiJvbmxpbmUgY2lhbGlzIDIwbWciO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wODMiO2k6MTtzOjc6In5eLiokfnMiO31zOjk6ImNpYWxpc21lZCI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA3OSI7aToxO3M6MjY6In5jaWFsaXNtZWQuKj9jaWFsaXNcczVtZ35pIjt9czo0MToid2FsbWFydC1wcmljaW5nLWZvci1zdWJsaW5ndWFsLWNpYWxpcy1wcm8iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wODEiO2k6MTtpOjExO31zOjc6ImdlbmVyaWMiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLnNwYW0tc2VvX2xpbmsuMDAxIjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjU6InBpbGxzIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5zcGFtLXNlb19saW5rLjAwNiI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9czo4OiIgY2lhbGlzICI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuc3BhbS1zZW9fbGluay4wMDciO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6NzoiPmNpYWxpcyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuc3BhbS1zZW9fbGluay4wMDgiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6NzoiY2FuYWRhPCI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuc3BhbS1zZW9fbGluay4wMDkiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6MTA6ImJ1eSBDaWFsaXMiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLnNwYW0tc2VvX2xpbmsuMTA5IjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjc6IkNpYWxpcyAiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wODAiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6MTM6ImNpYWxpc2dlbmVyaWMiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wODYiO2k6MTtzOjk6InNwYW1fbGluayI7fX1zOjU6ImlhZ3JhIjthOjI4OntpOjA7aToxMDtzOjU6Imh0dHA6IjthOjk6e2k6MDtpOjEwO3M6MzY6IiNpcy12aWFncmEtZGFuZ2Vyb3VzIHZpYWdyYSBnZW5lcmlrYSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fdmlhZ3JhLjAzMSI7aToxO3M6Nzoifl4uKiR+cyI7fXM6MjA6InZpYWdyYSB2aWFncmEgb25saW5lIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb192aWFncmEuMDI1IjtpOjE7czo3OiJ+Xi4qJH5zIjt9czozNToiV2l0aG91dCBhIERvY3RvciBQcmVzY3JpcHRpb24sICA9LSkiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX3ZpYWdyYS4wMzAiO2k6MTtzOjc6In5eLiokfnMiO31zOjE0OiJWaWFncmEgU2FtcGxlcyI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fdmlhZ3JhLjAyOCI7aToxO3M6Nzoifl4uKiR+cyI7fXM6MjA6IkNoZWFwIFZpYWdyYSBUYWJsZXRzIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb192aWFncmEuMDI5IjtpOjE7czo3OiJ+Xi4qJH5zIjt9czo0MzoidmlhZ3JhIHBpbGxzWy9VUkwgLSAgZWFybHk7IHZpYWdyYSB0aGVyYXB5OyI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fdmlhZ3JhLjAzMiI7aToxO3M6Nzoifl4uKiR+cyI7fXM6MTk6ImdlbmVyaWMgdmlhZ3JhWy9VUkwiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX3ZpYWdyYS4wMzMiO2k6MTtzOjc6In5eLiokfnMiO31zOjE2OiJjaGVhcHZpYWdyYVsvVVJMIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb192aWFncmEuMDM0IjtpOjE7czo3OiJ+Xi4qJH5zIjt9fXM6MTQ6InZpYWdyYSB3aXRob3V0IjthOjI6e2k6MDtpOjEwO3M6MTg6InZpYWdyYSAyMG1nIG9ubGluZSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fdmlhZ3JhLjAyNiI7aToxO3M6Nzoifl4uKiR+cyI7fX1zOjY6InZpYWdyYSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fdmlhZ3JhLjAwMiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMjoiMC12aWFncmEuY29tIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb192aWFncmEuMDAzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE4OiJhdmlhZ3JhZm9yc2FsZS5jb20iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX3ZpYWdyYS4wMDQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTE6ImNoZWFwdmlhZ3JhIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb192aWFncmEuMDA1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE4OiJlLXZpYWdyYW9ubGluZS5jb20iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX3ZpYWdyYS4wMDYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTg6ImUtdmlhZ3Jhb25saW5lLm5ldCI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fdmlhZ3JhLjAwNyI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMzoiZmVtYWxldmlhZ3JhYnV5c2FsZS5jb20iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX3ZpYWdyYS4wMDgiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjE6Im9ubGluZXZpYWdyYWNoZWFwLmNvbSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fdmlhZ3JhLjAwOSI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMToib25saW5ldmlhZ3JhY2hlYXAubmV0IjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb192aWFncmEuMDEwIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIwOiJzb2Z0dmlhZ3Jhb25saW5lLmNvbSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fdmlhZ3JhLjAxMSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNToic3ZpYWdyYXJidXkuY29tIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb192aWFncmEuMDEyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIzOiJ2aWFncmEtb25saW5lLXByaWNlLmNvbSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fdmlhZ3JhLjAxMyI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMzoidmlhZ3JhLW9ubGluZS1wcmljZS5uZXQiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX3ZpYWdyYS4wMTQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTM6InZpYWdyYWVubGlnbmUiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX3ZpYWdyYS4wMTUiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTE6InZpYWdyYWVzLmVzIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb192aWFncmEuMDE2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEzOiJ2aWFncmFmb3JzYWxlIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb192aWFncmEuMDE3IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIzOiJ2aWFncmFub3ByZXNjcmlwdGlvbi0xcyI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fdmlhZ3JhLjAxOCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMToid3d3LnZpYWdyYS1vdXRsZXQuY29tIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb192aWFncmEuMDE5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEwOiJidXkgdmlhZ3JhIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb192aWFncmEuMDI0IjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjE3OiJ2aWFncmEgcGlsbHMgaHR0cCI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fdmlhZ3JhLjAyNyI7aToxO3M6Nzoifl4uKiR+cyI7fXM6NjY6InN0eWxlPSJoZWlnaHQ6IDBwdDt3aWR0aDogMHB0O3Bvc2l0aW9uOiBhYnNvbHV0ZTtvdmVyZmxvdzogYXV0bzsiPiI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fdmlhZ3JhLjAyMCI7aToxO3M6OTA6In48cFxzc3R5bGU9ImhlaWdodDogMHB0O3dpZHRoOiAwcHQ7cG9zaXRpb246IGFic29sdXRlO292ZXJmbG93OiBhdXRvOyI+Lio/dmlhZ3JhLio/PFwvcD5+aSI7fXM6MTM6InZpYWdyYWtvcGVubmwiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX3ZpYWdyYS4wMjEiO2k6MTtzOjI5OiJ+dmlhZ3Jha29wZW5ubCo/dmlhZ3JhLnNvZnR+aSI7fXM6MjM6InZpYWdyYSBnZW5lcmlrYSBzY2h3ZWl6IjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb192aWFncmEuMDM1IjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjI5OiJzdHlsZT0iZGlzcGxheTpub25lIj48YSBocmVmPSI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuaGlkZGVuLXNwYW4uMDAyIjtpOjE7czo2Mzoifjwoc3BhbnxpKSBzdHlsZT0iZGlzcGxheTpub25lIj48YSBocmVmPS4qP3ZpYWdyYS4qPzwvYT48L1wxPn5zIjt9czoxNDoidmlhZ3JhcGlsbC5jb20iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX3ZpYWdyYS4wMjMiO2k6MTtpOjExO319czo1OiJlc3NheSI7YTozNzp7aTowO2k6MTA7czoyNDoiYXJndW1lbnRhdGl2ZWVzc2F5cGFwZXJzIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6Mjg6ImVzc2F5cHJvZmVzc2lvbmFsd3JpdGluZy5jb20iO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAwMiI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNDoiZXNzYXl3cml0aW5nc3NlcnZpY2UuY29tIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wMDMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjE6ImVzc2F5d3JpdGluZ3NzZXJ2aWNlcyI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDA0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIyOiJ3cml0ZWFuZXNzYXlmb3JtZWUuY29tIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wMDUiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MzE6ImJlc3QtZXNzYXktd3JpdGluZy1zZXJ2aWNlcy5jb20iO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAwNiI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNToicGF5c29tZW9uZXRvZG9teWVzc2F5LmNvbSI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDA3IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI4OiJiZXN0ZXNzYXl3cml0aW5nc2VydmljZWUuY29tIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wMDgiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjE6ImJlc3Rlc3NheXNmb3JzYWxlLm5ldCI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDA5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE1OiJidXllc3NheW5vdy5uZXQiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAxMCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNDoiYnV5ZXNzYXlzb25saW5lY2hlYXAubmV0IjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wMTEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6ImVzc2F5Y2FzdGxlLmNvLnVrIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wMTIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTY6ImVzc2F5c3dyaXRlci5uZXQiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAxMyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNToiZXNzYXl3aGFsZXMuY29tIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wMTQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjQ6ImV4Y2VsbGVudGVzc2F5d3JpdGVyLmNvbSI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDE1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE4OiJzdWNjZXNzZXNzYXkuY28udWsiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAxNiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNDoidGVlbmVzc2F5cy5jb20iO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAxNyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNzoidHVyYm9lc3NheXMuY28udWsiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAxOCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNDoid3JpdGVteWVzc2F5b3JpZ2luYWwuY29tIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wMTkiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjI6IndyaXRpbmctaGVscC1lc3NheS5jb20iO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAyMCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMzoiZXNzYXkgd3JpdGluZyI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDM2IjtpOjE7aToxMTt9czoxNDoid3JpdGUgbXkgZXNzYXkiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAzNyI7aToxO2k6MTE7fXM6ODoiZXNzYXk0bWUiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAzOCI7aToxO2k6MTE7fXM6MTk6ImNoZWFwIGVzc2F5IHdyaXRpbmciO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAzOSI7aToxO2k6MTE7fXM6Mjk6ImVzc2F5IG9uIGN1c3RvbWVyIHNlcnZpY2U8L2E+IjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wNDIiO2k6MTtpOjExO31zOjI1OiJ3cml0ZSBteSBwYXBlciBmb3IgbWU8L2E+IjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wNDMiO2k6MTtpOjExO31zOjI4OiJodG1sIj5lc3NheWJpc29uLmNvbSB3cml0aW5nIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wMjEiO2k6MTtpOjExO31zOjE5OiJoZWxwIHdpdGggZXNzYXk8L2E+IjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wNDQiO2k6MTtpOjExO31zOjIzOiJjdXN0b20gdW5pdmVyc2l0eSBlc3NheSI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDQ4IjtpOjE7aToxMTt9czoyMDoicGxhZ2lhcmlzbS1jaGVjay5vcmciO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjA0OSI7aToxO2k6MTE7fXM6MTU6ImRhcndpbmVzc2F5Lm5ldCI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDUwIjtpOjE7aToxMTt9czoxNjoicGF5Zm9ycGFwZXJzLm5ldCI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDUxIjtpOjE7aToxMTt9czoxNDoiPmVzc2F5IGVkaXRpbmciO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjA1NSI7aToxO2k6MTE7fXM6MTM6Ij5vbmxpbmUgZXNzYXkiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjA1NiI7aToxO2k6MTE7fXM6MjM6Ij5wcm9kdWNlIG9ubGluZSB3cml0aW5nIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wNTciO2k6MTtpOjExO31zOjIzOiI+cmVwb3J0IGZvcm1hdCBleGFtcGxlPCI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDU4IjtpOjE7aToxMTt9fXM6MjoiPGEiO2E6MzE6e2k6MDtpOjEwO3M6NToiZXJzZXkiO2E6MTA6e2k6MDtpOjEwO3M6NToiY2hlYXAiO2E6Mjp7aTowO2k6MTA7czozOiJuZmwiO2E6Mzp7aTowO2k6MTA7czo4OiItamVyc2V5LSI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9famVyc2V5cy4wMDkiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6ODoiX2plcnNleV8iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2plcnNleXMuMDA5LjAyIjtpOjE7czo5OiJzcGFtX2xpbmsiO319fXM6MTI6ImNoZWFwIGplcnNleSI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9famVyc2V5cy4wMDQiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6MTA6Im1sYiBqZXJzZXkiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX2plcnNleXMuMDA1IjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjE2OiJ3aG9sZXNhbGUgamVyc2V5IjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5zcGFtLXNlb19qZXJzZXlzLjAwNiI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9czoxMDoibmZsIGplcnNleSI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9famVyc2V5cy4wMDciO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6MTA6Ik5GTCBqZXJzZXkiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2plcnNleXMuMDA3LjAyIjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjEwOiJuYmEgamVyc2V5IjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5zcGFtLXNlb19qZXJzZXlzLjAwOCI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9czoxMDoiTkJBIGplcnNleSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9famVyc2V5cy4wMDguMDIiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6MzQ6In4ob2ZmaWNpYWx8YXV0aGVudGljfGxvY2tlcnxzaG9wKX4iO2E6Mjp7aTowO2k6MTA7czo4NToifmhyZWY9WyInXWh0dHAuLi4uW15cLz5dKyhvZmZpY2lhbHxhdXRoZW50aWN8bG9ja2VyfHNob3ApW15cLz5dK1wvW15ccz4iJ10rW2pKXWVyc2V5fiI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9famVyc2V5cy4wMDIiO2k6MTtpOjExO319fXM6MTM6InJlbD0ibm9mb2xsb3ciO2E6MTE6e2k6MDtpOjEwO3M6MTQ6IjUwIE1nIEF0ZW5vbG9sIjthOjI6e2k6MDtzOjMzOiJpbmplY3RlZC5zcGFtLXNlb19hbnRpYmlvdGljcy4wMDUiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6OToiYnVwcm9waW9uIjthOjI6e2k6MDtzOjMzOiJpbmplY3RlZC5zcGFtLXNlb19hbnRpYmlvdGljcy4wMDYiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6MTc6IkF0ZW5vbG9sIE1lZGljaW5lIjthOjI6e2k6MDtzOjMzOiJpbmplY3RlZC5zcGFtLXNlb19hbnRpYmlvdGljcy4wMDciO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6MTE6ImZpbmFzdGVyaWRlIjthOjI6e2k6MDtzOjMzOiJpbmplY3RlZC5zcGFtLXNlb19hbnRpYmlvdGljcy4wMDgiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6MTA6Imxpc2lub3ByaWwiO2E6Mjp7aTowO3M6MzM6ImluamVjdGVkLnNwYW0tc2VvX2FudGliaW90aWNzLjAwOSI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9czoxMzoicHJvcGVjaWEgNSBtZyI7YToyOntpOjA7czozMzoiaW5qZWN0ZWQuc3BhbS1zZW9fYW50aWJpb3RpY3MuMDEwIjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjI5OiJidXkgYWN5Y2xvdmlyIG5vIHByZXNjcmlwdGlvbiI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW8ucGhhcm1hY3ktb25saW5lLjA5MCI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9czo4OiJhcmltaWRleCI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW8ucGhhcm1hY3ktb25saW5lLjA5MSI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9czoxMDoiZmx1b3hldGluZSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW8ucGhhcm1hY3ktb25saW5lLjA5MiI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9czoxMjoidGV0cmFjeWNsaW5lIjthOjI6e2k6MDtzOjMzOiJpbmplY3RlZC5zcGFtLXNlb19hbnRpYmlvdGljcy4wMTEiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fX1zOjU6ImRpZGFzIjthOjY6e2k6MDtpOjEwO3M6MTQ6Ii1hZGlkYXMteWVlenktIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlby5hZGlkYXMuMDAxIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEzOiItYWRpZGFzLXVsdHJhIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlby5hZGlkYXMuMDAyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEyOiIteWVlenktYm9vc3QiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvLmFkaWRhcy4wMDMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjI6ImFkaWRhcyBZZWV6eSA3NTAgQm9vc3QiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX3Nob2VzLjAwMSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMzoiYWRpZGFzIFllZXp5cyI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fc2hvZXMuMDAyIjtpOjE7czo5OiJzcGFtX2xpbmsiO319czoxMDoib3BhY2l0eTowOyI7YTozOntpOjA7aToxMDtzOjY6IkplcnNleSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuc3BhbS1zZW9fbGluay4wMTEiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6MTE6Im5mbCBqYWNrZXRzIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5zcGFtLXNlb19saW5rLjAxMiI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9fXM6NToiYWx2aW4iO2E6Mzp7aTowO2k6MTA7czoyMToiLUNhbHZpbi1LbGVpbi1iYXJhdG9zIjthOjI6e2k6MDtzOjMzOiJpbmplY3RlZC5zcGFtLXNlby5jYWx2aW5rbGVpbi4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6Mjg6Ij5DYWx2aW4gS2xlaW4gQm94ZXIgQmFyYXRvczwiO2E6Mjp7aTowO3M6MzM6ImluamVjdGVkLnNwYW0tc2VvLmNhbHZpbmtsZWluLjAwMiI7aToxO2k6MTE7fX1zOjY6InVpdHRvbiI7YToyOntpOjA7aToxMDtzOjc6InVpdHRvbi0iO2E6Mjp7aTowO2k6MTA7czo1OiJvdWlzLSI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW8udnVpdHRvbi4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fX19czo3OiJoaWRkZW47IjthOjM6e2k6MDtpOjEwO3M6NjoiY2FzaW5vIjthOjI6e2k6MDtpOjEwO3M6OTA6In48ZGl2IHN0eWxlPS5vdmVyZmxvdzpccypoaWRkZW47XHMqaGVpZ2h0OlxzKjFweDsuPjxhIGhyZWY9W15cPF0rY2FzaW5vW15cPF0qPzxcL2E+PC5kaXY+fiI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2FzaW5vLjAwOCI7aToxO3M6OTE6In4oPzo8ZGl2IHN0eWxlPS5vdmVyZmxvdzpccypoaWRkZW47XHMqaGVpZ2h0OlxzKjFweDsuPjxhIGhyZWY9W15cPl0rPltePF0rPFwvYT48LmRpdj5ccyopK34iO319czoyMToiPGRpdiBzdHlsZT0ib3ZlcmZsb3c6IjthOjM6e2k6MDtpOjEwO3M6NDE6IjxkaXYgc3R5bGU9Im92ZXJmbG93OmhpZGRlbjtoZWlnaHQ6MXB4OyI+IjthOjI6e2k6MDtpOjEwO3M6NjE6In48ZGl2IHN0eWxlPSJvdmVyZmxvdzpoaWRkZW47aGVpZ2h0OjFweDsiPltcc10qPGhlYWQ+PGEgaHJlZn4iO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDM2IjtpOjE7czoxMDE6In48ZGl2IHN0eWxlPSJvdmVyZmxvdzpoaWRkZW47aGVpZ2h0OjFweDsiPltcc10qPGhlYWQ+KCg8YSBocmVmfDxtZXRhKVteXG5dK1tcc10qKSs8LmhlYWQ+W1xzXSo8LmRpdj5+Ijt9fXM6NTI6In48ZGl2IHN0eWxlPSJvdmVyZmxvdzpccypoaWRkZW47XHMqaGVpZ2h0OlxzKjFweDsiPn4iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLmhpZGRlbi1kaXYuMDM2LjAyIjtpOjE7aToxMTt9fX1zOjM3OiI8YSBzdHlsZT0iY29sb3I6ICNmZmZmZmY7IiBocmVmPSJodHRwIjthOjI6e2k6MDtpOjEwO3M6MzU6In48YSBzdHlsZVtePl0rPltcd10rW1xkXStbXHddKzwuYT5+IjthOjI6e2k6MDtzOjIxOiJpbmplY3RlZC5zcGFtLXNlby4wMTkiO2k6MTtzOjM1OiJ+PGEgc3R5bGVbXj5dKz5bXHddK1tcZF0rW1x3XSs8LmE+fiI7fX1zOjEyOiJleGFtaG9tZS5uZXQiO2E6Mjp7aTowO3M6MzI6ImpzLm1hbHdhcmUuaW5qZWN0b3JfZXhhbWhvbWUuMDAxIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI5OiJjb2xsZWdlIHBhcGVyIHdyaXRpbmcgc2VydmljZSI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW8uZXNzYXkuMDQ4IjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjE1OiJnZW5lcmlrYSBrYXVmZW4iO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4xMTMiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6MjA6InN0b3AtYW55LWRpc2Vhc2UuY29tIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMTE0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIwOiJhc2lhbi1kYXRpbmctd2Vic2l0ZSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fZGF0aW5nLjAwMSI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9czoxMjoiYnVzdHkgYnJpZGVzIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19kYXRpbmcuMDAyIjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjE0OiJldXJvcGVhbiB3aXZlcyI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fZGF0aW5nLjAwMyI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9czoxNDoibWVldCBob3QgZ2lybHMiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2RhdGluZy4wMDQiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6MjA6InVrcmFpbmUgZGF0ZSBydXNzaWFuIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19kYXRpbmcuMDA1IjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjE1OiJmcmVlLWFkdWx0LWNoYXQiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2RhdGluZy4wMDYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTY6IndpdGggbXkgaG9tZXdvcmsiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLnNwYW0tc2VvX2V4YW0uMDAzIjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjEyOiJsYXRpbi1icmlkZXMiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2RhdGluZy4wMDciO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6NzoiY2hlYXByeCI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjExNiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNzoic3R5bGU9ImZvbnQtc2l6ZToiO2E6Mjp7aTowO2k6MTA7czo0OiIwcHg7IjthOjQ6e2k6MDtpOjEwO3M6NjoiPm9yZGVyIjthOjI6e2k6MDtzOjMzOiJpbmplY3RlZC5zcGFtLXNlb19oaWRkZW5fZm9udC4wMDQiO2k6MTtpOjExO31zOjk6Ij5wdXJjaGFzZSI7YToyOntpOjA7czozMzoiaW5qZWN0ZWQuc3BhbS1zZW9faGlkZGVuX2ZvbnQuMDAzIjtpOjE7aToxMTt9czoxMjoicHJlc2NyaXB0aW9uIjthOjI6e2k6MDtzOjMzOiJpbmplY3RlZC5zcGFtLXNlb19oaWRkZW5fZm9udC4wMDUiO2k6MTtpOjExO319fXM6NjoiZXJzYWNlIjthOjI6e2k6MDtpOjEwO3M6MTk6Ij5UZWUgU2hpcnQgVmVyc2FjZTwiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvLnZlcnNhY2UuMDAxIjtpOjE7aToxMTt9fXM6NjoiYXVyZW50IjthOjI6e2k6MDtpOjEwO3M6Mjg6Ij5UIFNoaXJ0IFl2ZXMgU2FpbnQgTGF1cmVudDwiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvLmxhdXJlbnQuMDAxIjtpOjE7aToxMTt9fXM6NjoiYW1hZ3JhIjthOjI6e2k6MDtpOjEwO3M6ODoia2FtYWdyYS0iO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4xMTciO2k6MTtpOjExO319czo1MjoiPHNwYW4gY2xhc3M9ImtleXNfd29yZHMiPjxhIGNsYXNzPSJsaW5rc19nb29kX3JhbmRzIiI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuaGlkZGVuLXNwYW4uMDA0IjtpOjE7czoyMjE6In4oOj88cD5ccyopPzxzcGFuIGNsYXNzPSJrZXlzX3dvcmRzIj4oPGEgY2xhc3M9ImxpbmtzX2dvb2RfcmFuZHMiIGhyZWZbXj5dKz5bXjw+XSs8LmE+W148Pl0qKSs8LnNwYW4+KDo/PC5wPlxzKik/KDo/PHNjcmlwdD5bXnNjcmlwdF0qZXZhbFwoZnVuY3Rpb25cKHAsYSxjW159XSt0b1N0cmluZy4zNltePl0rXHxOTHBuZGxTM1x8W148XStce1x9XClcKTtbXlx3XSo8XC9zY3JpcHQ+KT9+Ijt9czoxOToiPnN1cGVyb25saW5lIGZhdHVyYSI7YToyOntpOjA7czozMzoiaW5qZWN0ZWQuc3BhbS1zZW9faGlkZGVuX2ZvbnQuMDAxIjtpOjE7aToxMTt9czo3NDoiPGZvbnQgc3R5bGU9Im92ZXJmbG93OiBhdXRvOyBwb3NpdGlvbjogYWJzb2x1dGU7IGhlaWdodDogMHB0OyB3aWR0aDogMHB0Ij4iO2E6Mjp7aTowO3M6MzM6ImluamVjdGVkLnNwYW0tc2VvX2hpZGRlbl9mb250LjAwMiI7aToxO2k6MTE7fXM6MjY6IlVsdGltYXRlIFByb2R1Y3QgS2V5IEZyZWU8IjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjEyNiI7aToxO2k6MTE7fXM6MjU6InByb2Zlc3Npb25hbCBwcm9kdWN0IGtleTwiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMTI3IjtpOjE7aToxMTt9fXM6NzoicGhhcm1hYyI7YToyMzp7aTowO2k6MTA7czo0OiJocmVmIjthOjI6e2k6MDtpOjEwO3M6NToieGFuYXgiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX3hhbmF4LjAwMSI7aToxO3M6ODQ6In48YVxzKnN0eWxlPS5mb250LXNpemU6MDsuXHMqaHJlZj0uaHR0cDouLlteLV0rLXBoYXJtYWN5W14+XSs+W14uXSsuW154XSt4YW5heC48LmE+fiI7fX1zOjE0OiIxcGhhcm1hY3lzdG9yZSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjAwMSI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMToiMjQ3cGhhcm1hY2V1dGljYWwuY29tIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDAyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI1OiJjYW5hZGlhbi1waGFybWFjeS05MTEuY29tIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDAzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI0OiJjYW5hZGlhbi1waGFybWFjeS1zdG9yZXMiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wMDQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTk6ImNhbmFkaWFucGhhcm1hY3l3ZWIiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wMDUiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6Mjc6ImNoZWFwLWNhbmFkaWFuLXBoYXJtYWN5Lm5ldCI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjAwNiI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMToiZS1waGFybWFjeS1vbmxpbmUuY29tIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDA3IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE5OiJnZW5lcmljLWVkLXBoYXJtYWN5IjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDA4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIyOiJvbmxpbmUtcGhhcm1hY3ktc3QuY29tIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDA5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE0OiJvbmxpbmVwaGFybWFjeSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjAxMCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNDoib25saW5lcGhhcm1hY3ktZHJ1Z3MuY29tIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDExIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE5OiJwaGFybWFjaWUtLWVuLWxpZ25lIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDEyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE1OiJwaGFybWFjeS1jaGVhcHMiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wMTMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTY6InBoYXJtYWN5LXBpbGwyNDciO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wMTQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjA6InBoYXJtYWN5LXBpbGwzNjUuY29tIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDE1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE5OiJ1cy1jYWQtcGhhcm1hY3kuY29tIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDE2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIyOiJ4ZW5vcGhhcm1hY29waGlsaWEuY29tIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDE3IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIzOiJwYXJ0bmVycGhhcm1hY3kyNC03LmNvbSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjAxOCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMjoid3d3LnBoYXJtYWN5aW5jaXR5LmNvbSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjAxOSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNzoiY2FuYWRpYW4gcGhhcm1hY3kiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wODIiO2k6MTtpOjExO31zOjE0OiJjYW5hZGFwaGFybWFjeSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjExNSI7aToxO3M6OToic3BhbV9saW5rIjt9fXM6Njoiam9yZGFuIjthOjE4OntpOjA7aToxMDtzOjEzOiJhaXIgam9yZGFuIDExIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19qb3JkYW4uMDAxIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEzOiJjaGVhcCBqb3JkYW5zIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19qb3JkYW4uMDAyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjk6ImpvcmRhbiAxMSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fam9yZGFuLjAwMyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNDoiam9yZGFuIDExIGJyZWQiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2pvcmRhbi4wMDQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTg6ImpvcmRhbiAxMSBsb3cgYnJlZCI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fam9yZGFuLjAwNSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxODoiam9yZGFuIDExIHBsYXlvZmZzIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19qb3JkYW4uMDA2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjk6ImpvcmRhbiAxMyI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fam9yZGFuLjAwNyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxODoiam9yZGFuIDEzIGxvdyBicmVkIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19qb3JkYW4uMDA4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIxOiJqb3JkYW4gMTMgbG93IGhvcm5ldHMiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2pvcmRhbi4wMDkiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6ODoiam9yZGFuIDUiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2pvcmRhbi4wMTAiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjI6ImpvcmRhbiA1IG1pZG5pZ2h0IG5hdnkiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2pvcmRhbi4wMTEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6ODoiam9yZGFuIDYiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2pvcmRhbi4wMTIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6ODoiam9yZGFuIDciO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2pvcmRhbi4wMTMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTM6ImpvcmRhbiA3IGhhcmUiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2pvcmRhbi4wMTQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6ODoiam9yZGFuIDgiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2pvcmRhbi4wMTUiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTU6ImpvcmRhbiByZXRybyAxMiI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fam9yZGFuLjAxNiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNDoiam9yZGFuIHJldHJvIDQiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2pvcmRhbi4wMTciO2k6MTtzOjk6InNwYW1fbGluayI7fX1zOjU6ImxvYW5zIjthOjE0OntpOjA7aToxMDtzOjE1OiIxc3QtcGF5ZGF5bG9hbnMiO2E6Mjp7aTowO3M6MzQ6ImluamVjdGVkLnNwYW0tc2VvX3BheWRheS1sb2Fucy4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjA6ImNsYXNzaWNwYXlkYXlsb2Fuc3VrIjthOjI6e2k6MDtzOjM0OiJpbmplY3RlZC5zcGFtLXNlb19wYXlkYXktbG9hbnMuMDAyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIxOiJmYXN0LXBheWRheS1sb2Fucy5vcmciO2E6Mjp7aTowO3M6MzQ6ImluamVjdGVkLnNwYW0tc2VvX3BheWRheS1sb2Fucy4wMDMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTI6ImxvYW5zc29ubGluZSI7YToyOntpOjA7czozNDoiaW5qZWN0ZWQuc3BhbS1zZW9fcGF5ZGF5LWxvYW5zLjAwNCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMjoicGF5ZGF5IGxvYW5zIjthOjI6e2k6MDtzOjM0OiJpbmplY3RlZC5zcGFtLXNlb19wYXlkYXktbG9hbnMuMDA1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEzOiJwYXkgZGF5IGxvYW5zIjthOjI6e2k6MDtzOjM0OiJpbmplY3RlZC5zcGFtLXNlb19wYXlkYXktbG9hbnMuMDA2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIyOiJjYXNoLWxvYW5zLW9ubGluZS1mYXN0IjthOjI6e2k6MDtzOjM0OiJpbmplY3RlZC5zcGFtLXNlb19wYXlkYXktbG9hbnMuMDA3IjtpOjE7aToxMTt9czoxNDoiLXBheWRheS1sb2Fucy0iO2E6Mjp7aTowO3M6MzQ6ImluamVjdGVkLnNwYW0tc2VvX3BheWRheS1sb2Fucy4wMDgiO2k6MTtpOjExO31zOjIwOiJsb2Fucy1zYWx0LWxha2UtY2l0eSI7YToyOntpOjA7czozNDoiaW5qZWN0ZWQuc3BhbS1zZW9fcGF5ZGF5LWxvYW5zLjAwOSI7aToxO2k6MTE7fXM6MzM6InBheWRheS1sb2Fucy1jaGVhcC1pbnRlcmVzdC1yYXRlcyI7YToyOntpOjA7czozNDoiaW5qZWN0ZWQuc3BhbS1zZW9fcGF5ZGF5LWxvYW5zLjAxMCI7aToxO2k6MTE7fXM6MzA6InBlcnNvbmFsLWxvYW5zLWJhc2VkLW9uLWluY29tZSI7YToyOntpOjA7czozNDoiaW5qZWN0ZWQuc3BhbS1zZW9fcGF5ZGF5LWxvYW5zLjAxMSI7aToxO2k6MTE7fXM6MjA6InF1aWNrLXBlcnNvbmFsLWxvYW5zIjthOjI6e2k6MDtzOjM0OiJpbmplY3RlZC5zcGFtLXNlb19wYXlkYXktbG9hbnMuMDEyIjtpOjE7aToxMTt9czoyMDoidHJ1c3RlZC1vbmxpbmUtbG9hbnMiO2E6Mjp7aTowO3M6MzQ6ImluamVjdGVkLnNwYW0tc2VvX3BheWRheS1sb2Fucy4wMTMiO2k6MTtpOjExO319czo3OiJsZXZpdHJhIjthOjEyOntpOjA7aToxMDtzOjc6Imxldml0cmEiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX2xldml0cmEuMDAxIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE4OiJkbGV2aXRyYW9ubGluZS5jb20iO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX2xldml0cmEuMDAyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI3OiJlbm9wcmVzY3JpcHRpb24tbGV2aXRyYS5jb20iO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX2xldml0cmEuMDAzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI3OiJlbm9wcmVzY3JpcHRpb24tbGV2aXRyYS5uZXQiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX2xldml0cmEuMDA0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE3OiJncmVhdC1sZXZpdHJhLmNvbSI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9fbGV2aXRyYS4wMDUiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjQ6Imxldml0cmEtb25saW5lLXByaWNlLmNvbSI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9fbGV2aXRyYS4wMDYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjQ6Imxldml0cmEtb25saW5lLXByaWNlLm5ldCI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9fbGV2aXRyYS4wMDciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjI6Im9ubGluZWxldml0cmFjaGVhcC5jb20iO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX2xldml0cmEuMDA4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIyOiJvbmxpbmVsZXZpdHJhY2hlYXAubmV0IjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5zcGFtLXNlb19sZXZpdHJhLjAwOSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNToidG9wbGV2aXRyYWd1aWRlIjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5zcGFtLXNlb19sZXZpdHJhLjAxMCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxODoiYnV5IGxldml0cmEgb25saW5lIjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5zcGFtLXNlb19sZXZpdHJhLjAxMSI7aToxO3M6OToic3BhbV9saW5rIjt9fXM6NToicGlsbHMiO2E6MTA6e2k6MDtpOjEwO3M6MTE6ImNoZWFwLXBpbGxzIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19waWxscy4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTA6ImJhc2ljcGlsbHMiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX3BpbGxzLjAwMiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNjoiY2hlYXBwaWxsc29ubGluZSI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGlsbHMuMDAzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEwOiJnZXRyeHBpbGxzIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19waWxscy4wMDQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTQ6ImdldHJ4cGlsbHMuY29tIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19waWxscy4wMDUiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTI6Im9ubGluZS1waWxscyI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGlsbHMuMDA2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE5OiJvbmxpbmVwaWxsc3Nob3AuY29tIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19waWxscy4wMDciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTE6Ii1waWxscy5odG1sIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19waWxscy4wMDgiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTg6InBpbGxzMjRob25saW5lLmNvbSI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGlsbHMuMDA5IjtpOjE7czo5OiJzcGFtX2xpbmsiO319czoxMToib25saW5lZS5jb20iO2E6OTp7aTowO2k6MTA7czoyOToiYnV5Y2hlYXBjaWFncmV0dGVzb25saW5lZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDAxIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIxOiJidXljeXRvdGVjb25saW5lZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDAyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI4OiJidXlnZW5lcmljcHJpbGlneW9ubGluZWUuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjAwMyI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMToiYnV5cHJvc2Nhcm9ubGluZWUuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjAwNCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMDoiYnV5eGVuaWNhb25saW5lZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDA1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE3OiJmbGFneWxvbmxpbmVlLmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wMDYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjQ6ImJ1eWNpZ2FyZXR0ZXNvbmxpbmVlLmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wMDciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjA6ImNhc2hxdWlja29ubGluZWUuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjAwOCI7aToxO3M6OToic3BhbV9saW5rIjt9fXM6MTA6ImFtcGljaWxsaW4iO2E6ODp7aTowO2k6MTA7czoyMDoiYW1waWNpbGxpbi1waGFybS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2FtcGljaWxsaW4uMDAxIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIwOiJhbXBpY2lsbGluLXBoYXJtLm5ldCI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fYW1waWNpbGxpbi4wMDIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjA6ImFtcGljaWxsaW4tcGlsbHMuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19hbXBpY2lsbGluLjAwMyI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMDoiYW1waWNpbGxpbi1waWxscy5uZXQiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2FtcGljaWxsaW4uMDA0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE5OiJhbXBpY2lsbGlucGlsbHMuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19hbXBpY2lsbGluLjAwNSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxOToiYW1waWNpbGxpbnBpbGxzLm5ldCI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fYW1waWNpbGxpbi4wMDYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjI6InBlYW1waWNpbGxpbm9ubGluZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2FtcGljaWxsaW4uMDA3IjtpOjE7czo5OiJzcGFtX2xpbmsiO319czo2OiJhbW94aWwiO2E6ODp7aTowO2k6MTA7czo2OiJhbW94aWwiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2Ftb3hpbC4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTY6ImFtb3hpbC1jaGVhcC5uZXQiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2Ftb3hpbC4wMDIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTY6ImFtb3hpbC1waWxscy5uZXQiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2Ftb3hpbC4wMDMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTU6ImFtb3hpbGNoZWFwLm5ldCI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fYW1veGlsLjAwNCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNToiYW1veGlscGhhcm0uY29tIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19hbW94aWwuMDA1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE1OiJhbW94aWxwaGFybS5uZXQiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2Ftb3hpbC4wMDYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTU6ImFtb3hpbHBpbGxzLm5ldCI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fYW1veGlsLjAwNyI7aToxO3M6OToic3BhbV9saW5rIjt9fXM6MTE6InJlc2NyaXB0aW9uIjthOjk6e2k6MDtpOjEwO3M6MTU6ImVub3ByZXNjcmlwdGlvbiI7YToyOntpOjA7czozNDoiaW5qZWN0ZWQuc3BhbS1zZW9fcHJlc2NyaXB0aW9uLjAwMSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxODoibm9ucHJlc2NyaXB0aW9ubWVkIjthOjI6e2k6MDtzOjM0OiJpbmplY3RlZC5zcGFtLXNlb19wcmVzY3JpcHRpb24uMDAyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE0OiJub3ByZXNjcmlwdGlvbiI7YToyOntpOjA7czozNDoiaW5qZWN0ZWQuc3BhbS1zZW9fcHJlc2NyaXB0aW9uLjAwMyI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNjoib25saW5lLXByZXNjcmlwdGlvbm1lZC5uZXQiO2E6Mjp7aTowO3M6MzQ6ImluamVjdGVkLnNwYW0tc2VvX3ByZXNjcmlwdGlvbi4wMDQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTg6InBoYXJtLXByZXNjcmlwdGlvbiI7YToyOntpOjA7czozNDoiaW5qZWN0ZWQuc3BhbS1zZW9fcHJlc2NyaXB0aW9uLjAwNSI7aToxO3M6OToic3BhbV9saW5rIjt9czozMDoiQ2xvbmlkaW5lIHdpdGhvdXQgcHJlc2NyaXB0aW9uIjthOjI6e2k6MDtzOjM0OiJpbmplY3RlZC5zcGFtLXNlb19wcmVzY3JpcHRpb24uMDA2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE1OiJubyBwcmVzY3JpcHRpb24iO2E6Mjp7aTowO3M6MzQ6ImluamVjdGVkLnNwYW0tc2VvX3ByZXNjcmlwdGlvbi4wMDciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTk6IndpdGhvdXRwcmVzY3JpcHRpb24iO2E6Mjp7aTowO3M6MzQ6ImluamVjdGVkLnNwYW0tc2VvX3ByZXNjcmlwdGlvbi4wMDgiO2k6MTtzOjk6InNwYW1fbGluayI7fX1zOjEwOiJvbmxpbmUuY29tIjthOjg6e2k6MDtpOjEwO3M6MjM6ImJ1eXppdGhyb21heG9vbmxpbmUuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjAyNyI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMDoiY3l0b3RlY2J1eW9ubGluZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDI4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI0OiJkb215YXNzaWdubWVudG9ubGluZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDI5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIyOiJjYW5hZGEtZHJ1Z3NvbmxpbmUuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjAzMCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNjoibXlmYXZvcml0ZWRvY3Rvcm9ubGluZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDMxIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIzOiJ3aW5kb3dzMTBrZXlzb25saW5lLmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wMzIiO2k6MTtpOjExO31zOjIxOiJvZmZpY2lhbGtleW9ubGluZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDMzIjtpOjE7aToxMTt9fXM6NjoiY2FzaW5vIjthOjg6e2k6MDtpOjEwO3M6MTM6Im9ubGluZSBjYXNpbm8iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2Nhc2luby4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6InRhc3R5b25saW5lY2FzaW5vIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jYXNpbm8uMDAyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE5OiJ4bWljcm9nYW1pbmdjYXNpbm9zIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jYXNpbm8uMDAzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIxOiJ3d3cuc3ZlbnNra2FzaW5vbi5jb20iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2Nhc2luby4wMDQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6Mjc6Ii14eC5jb21dY2FzaW5vIG9ubGluZVsvdXJsXSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2FzaW5vLjAwNyI7aToxO3M6Nzoifl4uKiR+cyI7fXM6MTU6Ii1vbmxpbmUtY2FzaW5vLSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2FzaW5vLjAwNSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNToidG9wLWNhc2luby1yZWFsIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jYXNpbm8uMDA2IjtpOjE7czo5OiJzcGFtX2xpbmsiO319czoxMzoic29mdHdhcmVlLmNvbSI7YTo3OntpOjA7aToxMDtzOjIxOiJkb3dubG9hZHNvZnR3YXJlZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDA5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIyOiJpcGhvbmVzcHlzb2Z0d2FyZWUuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjAxMCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxODoiYWRvYmVzb2Z0d2FyZWUuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjAxMSI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNjoiYmxhY2tiZXJyeXNweXNvZnR3YXJlZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDEyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI0OiJlbGxwaG9uZXNweXNvZnR3YXJlZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDEzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIxOiJjb21wdXRlcnNvZnR3YXJlZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDE0IjtpOjE7czo5OiJzcGFtX2xpbmsiO319czo4OiJhY29tcGxpYSI7YTo2OntpOjA7aToxMDtzOjI1OiJhY29tcGxpYS1vbmxpbmUtcHJpY2UuY29tIjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19hY29tcGxpYS4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjU6ImFjb21wbGlhLW9ubGluZS1wcmljZS5uZXQiO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX2Fjb21wbGlhLjAwMiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNzoiZGFjb21wbGlhc2FsZS5jb20iO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX2Fjb21wbGlhLjAwMyI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMzoib25saW5lYWNvbXBsaWFjaGVhcC5jb20iO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX2Fjb21wbGlhLjAwNCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMzoib25saW5lYWNvbXBsaWFjaGVhcC5uZXQiO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX2Fjb21wbGlhLjAwNSI7aToxO3M6OToic3BhbV9saW5rIjt9fXM6NDoidGFkYSI7YTo2OntpOjA7aToxMDtzOjc6InRhZGFjaXAiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX3RhZGFmaWwuMDAxIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjc6InRhZGFmaWwiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX3RhZGFmaWwuMDAyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE0OiJ0YWRhbGFmaWwgMjBtZyI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9fdGFkYWZpbC4wMDMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTQ6InRhZGFsYWZpbC0yMG1nIjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5zcGFtLXNlb190YWRhZmlsLjAwNCI7aToxO3M6OToic3BhbV9saW5rIjt9czo5OiJ0YWRhbGFmaWwiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX3RhZGFmaWwuMDA1IjtpOjE7czo5OiJzcGFtX2xpbmsiO319czo4OiJwcm9wZWNpYSI7YTo2OntpOjA7aToxMDtzOjI0OiJidXktcHJvcGVjaWEtb25saW5lZS5jb20iO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX3Byb3BlY2lhLjAwMSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxODoiYnV5eXByb3BlY2lhb25saW5lIjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19wcm9wZWNpYS4wMDIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjA6InNwcm9wZWNpYS1vbmxpbmUuY29tIjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19wcm9wZWNpYS4wMDMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjA6InNwcm9wZWNpYS1vbmxpbmUubmV0IjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19wcm9wZWNpYS4wMDQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjA6Indwcm9wZWNpYW5vbmxpbmUuY29tIjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19wcm9wZWNpYS4wMDUiO2k6MTtzOjk6InNwYW1fbGluayI7fX1zOjM6InNleCI7YTo2OntpOjA7aToxMDtzOjE0OiJpem1pciBzZXggc2hvcCI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuc3BhbS1zZW9fcG9ybi4wMDEiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6MTc6ImlzdGFuYnVsIHNleCBzaG9wIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5zcGFtLXNlb19wb3JuLjAwMiI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9czo4OiJhbmFsIHNleCI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuc3BhbS1zZW9fcG9ybi4wMDMiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6OToic2V4IHZpZGVvIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5zcGFtLXNlb19wb3JuLjAwNCI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9czo3OiJzZXh0dWJlIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5zcGFtLXNlb19wb3JuLjAwOCI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9fXM6ODoic2lsZGFsaXMiO2E6Njp7aTowO2k6MTA7czoxMjoic2lsZGFsaXMgYnV5IjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19zaWxkYWxpcy4wMDEiO2k6MTtpOjExO31zOjIxOiJvcmRlciBzaWxkYWxpcyBvbmxpbmUiO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX3NpbGRhbGlzLjAwMiI7aToxO2k6MTE7fXM6MTg6ImJ1eSBjaGVhcCBzaWxkYWxpcyI7YToyOntpOjA7czozMDoiaW5qZWN0ZWQuc3BhbS1zZW9fc2lsZGFsaXMuMDAzIjtpOjE7aToxMTt9czoxNDoic2lsZGFsaXMgb3JkZXIiO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX3NpbGRhbGlzLjAwNCI7aToxO2k6MTE7fXM6MTM6InNhbGUgc2lsZGFsaXMiO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX3NpbGRhbGlzLjAwNSI7aToxO2k6MTE7fX1zOjQ6InBvcm4iO2E6NTp7aTowO2k6MTA7czoxMToiaW5jZXN0IHBvcm4iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLnNwYW0tc2VvX3Bvcm4uMDA1IjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjc6ImhkIHBvcm4iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLnNwYW0tc2VvX3Bvcm4uMDA2IjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjg6ImhvdHBvcm5vIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5zcGFtLXNlb19wb3JuLjAxMSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMDoiamFwYW4gcG9ybiI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuc3BhbS1zZW9fcG9ybi4wMTIiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fX1zOjExOiJhbnRpYmlvdGljcyI7YTo1OntpOjA7aToxMDtzOjE2OiJhbnRpYmlvdGljcy1zaG9wIjthOjI6e2k6MDtzOjMzOiJpbmplY3RlZC5zcGFtLXNlb19hbnRpYmlvdGljcy4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjA6ImFudGliaW90aWNzLXNob3AuY29tIjthOjI6e2k6MDtzOjMzOiJpbmplY3RlZC5zcGFtLXNlb19hbnRpYmlvdGljcy4wMDIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjE6ImFudGliaW90aWNzLXN0b3JlLmNvbSI7YToyOntpOjA7czozMzoiaW5qZWN0ZWQuc3BhbS1zZW9fYW50aWJpb3RpY3MuMDAzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIxOiJhbnRpYmlvdGljc29yZHJlci5jb20iO2E6Mjp7aTowO3M6MzM6ImluamVjdGVkLnNwYW0tc2VvX2FudGliaW90aWNzLjAwNCI7aToxO3M6OToic3BhbV9saW5rIjt9fXM6NzoiY2FtYWdyYSI7YTo1OntpOjA7aToxMDtzOjE3OiJjYW1hZ3JhLXBoYXJtLmNvbSI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9fY2FtYWdyYS4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6ImNhbWFncmEtcGhhcm0ubmV0IjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5zcGFtLXNlb19jYW1hZ3JhLjAwMiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNjoiY2FtYWdyYWNoZWFwLmNvbSI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9fY2FtYWdyYS4wMDMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTY6ImNhbWFncmFjaGVhcC5uZXQiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX2NhbWFncmEuMDA0IjtpOjE7czo5OiJzcGFtX2xpbmsiO319czo2OiJjbG9taWQiO2E6NTp7aTowO2k6MTA7czoxOToiYnV5LWNsb21pZC1vbmxpbmUyNCI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2xvbWlkLjAwMSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMzoiY2xvbWlkb25saW5lZSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2xvbWlkLjAwMiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNDoic2Nsb21pZGJ1eS5jb20iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2Nsb21pZC4wMDMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTI6ImNoZWFwLWNsb21pZCI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2xvbWlkLjAwNCI7aToxO3M6OToic3BhbV9saW5rIjt9fXM6ODoiY2FyYWZhdGUiO2E6NTp7aTowO2k6MTA7czoxNToiYnV5aW5nLWNhcmFmYXRlIjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19jYXJhZmF0ZS4wMDEiO2k6MTtpOjExO31zOjEyOiJidXktY2FyYWZhdGUiO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX2NhcmFmYXRlLjAwMiI7aToxO2k6MTE7fXM6MTQ6Im9yZGVyLWNhcmFmYXRlIjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19jYXJhZmF0ZS4wMDMiO2k6MTtpOjExO31zOjI4OiJ3YWxtYXJ0LXByaWNpbmctZm9yLWNhcmFmYXRlIjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19jYXJhZmF0ZS4wMDQiO2k6MTtpOjExO319czo4OiJrbGFyaWNpZCI7YTo1OntpOjA7aToxMDtzOjEyOiJidXkta2xhcmljaWQiO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX2tsYXJpY2lkLjAwMSI7aToxO2k6MTE7fXM6MTU6ImJ1eWluZy1rbGFyaWNpZCI7YToyOntpOjA7czozMDoiaW5qZWN0ZWQuc3BhbS1zZW9fa2xhcmljaWQuMDAyIjtpOjE7aToxMTt9czoxNDoib3JkZXIta2xhcmljaWQiO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX2tsYXJpY2lkLjAwMyI7aToxO2k6MTE7fXM6Mjg6IndhbG1hcnQtcHJpY2luZy1mb3Ita2xhcmljaWQiO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX2tsYXJpY2lkLjAwNCI7aToxO2k6MTE7fX1zOjc6Imxhbm94aW4iO2E6NTp7aTowO2k6MTA7czoxMToiYnV5LWxhbm94aW4iO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX2xhbm94aW4uMDAxIjtpOjE7aToxMTt9czoxNDoiYnV5aW5nLWxhbm94aW4iO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX2xhbm94aW4uMDAyIjtpOjE7aToxMTt9czoxMzoib3JkZXItbGFub3hpbiI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9fbGFub3hpbi4wMDMiO2k6MTtpOjExO31zOjI3OiJ3YWxtYXJ0LXByaWNpbmctZm9yLWxhbm94aW4iO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX2xhbm94aW4uMDA0IjtpOjE7aToxMTt9fXM6MTA6InZhcmRlbmFmaWwiO2E6NTp7aTowO2k6MTA7czoxNDoiYnV5LXZhcmRlbmFmaWwiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX3ZhcmRlbmFmaWwuMDAxIjtpOjE7aToxMTt9czoxNzoiYnV5aW5nLXZhcmRlbmFmaWwiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX3ZhcmRlbmFmaWwuMDAyIjtpOjE7aToxMTt9czoxNjoib3JkZXItdmFyZGVuYWZpbCI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fdmFyZGVuYWZpbC4wMDMiO2k6MTtpOjExO31zOjMwOiJ3YWxtYXJ0LXByaWNpbmctZm9yLXZhcmRlbmFmaWwiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX3ZhcmRlbmFmaWwuMDA0IjtpOjE7aToxMTt9fXM6MjA6IjxkaXYgc3R5bGU9ImRpc3BsYXk6IjthOjQ6e2k6MDtpOjEwO3M6MzA6IjxzcGFuIHN0eWxlPSJjb2xvcjogI2ZmZmZmZTsiPiI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wMTEiO2k6MTtzOjcwOiJ+PGRpdiBzdHlsZT0iZGlzcGxheTogbm9uZTs/Ij48c3BhbiBzdHlsZT0iY29sb3I6ICNmZmZmZmU7Ij4uKj88L2Rpdj5+Ijt9czoxMjQ6In5ob3cgdG8gd2luIGJhY2sgeW91ciBleHx0by1nZXQtZXgtYmFjay5vcmcvfGZhcm1hY2lhMjR8dmlhZ3JhfHRhZGFmaWx8ZXNzYXl8bGV2aXRyYXxjcmVkaXQgc2NvcmV8bW9ydGdhZ2V8Y2FzaW5vfHByb3BlY2lhfmkiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDAyIjtpOjE7czoxNzM6In48ZGl2IHN0eWxlPSJkaXNwbGF5OlxzKm5vbmU7PyI+Lio/KD86aG93IHRvIHdpbiBiYWNrIHlvdXIgZXh8dG8tZ2V0LWV4LWJhY2sub3JnL3xmYXJtYWNpYTI0fHZpYWdyYXx0YWRhZmlsfGVzc2F5fGxldml0cmF8Y3JlZGl0IHNjb3JlfG1vcnRnYWdlfGNhc2lub3xwcm9wZWNpYSkuKj88XC9kaXY+fmlzIjt9czo0MjoifjxkaXYgc3R5bGU9ImRpc3BsYXk6ID9ub25lOz8iPi4rPzwvZGl2Pn5zIjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5oaWRkZW4tZGl2LjAzMyI7aToxO2k6MTE7fX1zOjg6ImRpZmx1Y2FuIjthOjQ6e2k6MDtpOjEwO3M6ODoiZGlmbHVjYW4iO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX2RpZmx1Y2FuLjAwMSI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMDoiYnV5ZGlmbHVjYW5jaGVhcC5jb20iO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX2RpZmx1Y2FuLjAwMiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxODoiYnV5ZGlmbHVjYW5vbmxpbmVlIjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19kaWZsdWNhbi4wMDMiO2k6MTtzOjk6InNwYW1fbGluayI7fX1zOjk6ImNoZWFwLmNvbSI7YTo0OntpOjA7aToxMDtzOjE4OiJidXlmbGFneWxjaGVhcC5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMTIzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIwOiJidXlsZXZhcXVpbmNoZWFwLmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4xMjQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjA6ImJ1eW5vbHZhZGV4Y2hlYXAuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjEyNSI7aToxO3M6OToic3BhbV9saW5rIjt9fXM6NDoiYXNpeCI7YTo0OntpOjA7aToxMDtzOjU6Imxhc2l4IjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19sYXNpeC4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6ImJ1eWxhc2l4Y2hlYXAuY29tIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19sYXNpeC4wMDIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6ImJ1eUxhc2l4Y2hlYXAuY29tIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19sYXNpeC4wMDMiO2k6MTtzOjk6InNwYW1fbGluayI7fX1zOjEwOiJzdWJsaW5ndWFsIjthOjQ6e2k6MDtpOjEwO3M6MTQ6ImJ1eS1zdWJsaW5ndWFsIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDIwIjtpOjE7aToxMTt9czoxNzoiYnV5aW5nLXN1Ymxpbmd1YWwiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wMjEiO2k6MTtpOjExO31zOjE2OiJvcmRlci1zdWJsaW5ndWFsIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDIyIjtpOjE7aToxMTt9fXM6NjoiZXNjb3J0IjthOjQ6e2k6MDtpOjEwO3M6MTk6ImJleWxpa2TDvHrDvCBlc2NvcnQiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLnNwYW0tc2VvX3Bvcm4uMDA3IjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjE2OiJnYXppYW50ZXAgZXNjb3J0IjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5zcGFtLXNlb19wb3JuLjAwOSI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9czoxNjoiZXNjb3J0IGdhemlhbnRlcCI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuc3BhbS1zZW9fcG9ybi4wMTAiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fX1zOjc6InRlcm9pZHMiO2E6NDp7aTowO2k6MTA7czoxNToic3Rlcm9pZHMgb25saW5lIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMTE4IjtpOjE7aToxMTt9czoxMjoiYnV5c3Rlcm9pZHNzIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDM5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE4OiJ3aGVyZXRvZ2V0c3Rlcm9pZHMiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wNzAiO2k6MTtzOjk6InNwYW1fbGluayI7fX1zOjc6InN0dWRlbnQiO2E6Mzp7aTowO2k6MTA7czoxNDoicGFwZXIgd3JpdGluZzwiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjA1MiI7aToxO2k6MTE7fXM6MTc6ImhvbWV3b3JrIG1pbnV0ZXM8IjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wNTQiO2k6MTtpOjExO319czo3OiJHZW5lcmljIjthOjI6e2k6MDtpOjEwO3M6ODoiT3ZlcnNlYXMiO2E6Mjp7aTowO2k6MTA7czoxMzoiQ2lwcm9mbG94YWNpbiI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW8ucGhhcm1hY3ktb25saW5lLjA4OSI7aToxO2k6MTE7fX19czo0NjoiPHAgc3R5bGU9InBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogLTI1MDBweDsiPiI7YToyOntpOjA7aToxMDtzOjEwOiIvcCZndDs8L3A+IjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19oaWRkZW5fcC4wMDEiO2k6MTtpOjExO319czo2OiJzdXByYXgiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wMzIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTE6ImFjY3V0YW5lYnV5IjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDMzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjExOiJhbGJlbmRhem9sZSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjAzNCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNDoiYXJlLW1lZHMtZnJvbS1pbmRpYS1zYWZlIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDM1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE2OiJidXktZG94eWN5Y2xpbmUtIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDM2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEyOiJidXlub3J4MS5jb20iO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wMzciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTI6ImJ1eW5vcnh4LmNvbSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjAzOCI7aToxO3M6OToic3BhbV9saW5rIjt9czo4OiJjaXBybzI0aCI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA0MCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMDoiY29sY2hpY2luZSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA0MSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMDoiZGFwb3hldGluZSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA0MiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMDoiRGlzdWxmaXJhbSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA0MyI7aToxO3M6OToic3BhbV9saW5rIjt9czo5OiJkcnVnc3RvcmUiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wNDQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTg6ImR6aXRocm9tYXhzYnV5LmNvbSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA0NSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMToiRmx1Y29uYXpvbGUiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wNDYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6ImhlYWx0aGNhcmV4eXouY29tIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDQ3IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjc6ImthbWFyZ2EiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wNDgiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTI6Im1ldGhvdHJleGF0ZSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA0OSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMToibWlzb3Byb3N0b2wiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wNTAiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjU6Im5hc2FsLXBvbHlwLXRyZWF0bWVudC5jb20iO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wNTEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6OToiTmF0cmV4b25lIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDUyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjExOiJuZXRtZWR4LmNvbSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA1MyI7aToxO3M6OToic3BhbV9saW5rIjt9czo3OiJuaXpvcmFsIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDU0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE0OiJvcmRlcm5vcnh4LmNvbSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA1NSI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMzoiaHR0cDovL3BpbGxzZm9yZGljay5jb20iO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wNTYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTE6InByb3ByYW5vbG9sIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDU4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE0OiJSZXRpbmEgZGlzcGxheSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA1OSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMzoicnhzaG9wbm93LmNvbSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA2MCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxOToic2RveHljeWNsaW5lYnV5LmNvbSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA2MSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMDoic2lsZGVuYWZpbCI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA2MiI7aToxO3M6OToic3BhbV9saW5rIjt9czo3OiJzb3ZhbGRpIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDYzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjc6InNwaXJpdmEiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wNjQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6OToidGFtb3hpZmVuIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDY1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjY6InZhbGl1bSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA2NiI7aToxO3M6OToic3BhbV9saW5rIjt9czo2OiJWYWxpdW0iO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wNjciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6NjoidmVybW94IjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDY4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI0OiJ3aGVyZS1jYW4taS1idXktcGhlbmdyZW4iO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wNjkiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjE6IndvbWVuLWhlYWx0aC1zaG9wLmNvbSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA3MSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNToieGVuaWNhbC1zaGlwcGVyIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDcyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjY6InpvbG9mdCI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA3MyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMToiYW1veGljaWxsaW4iO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wODMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6ODoiYmFjbG9mZW4iO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wODYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6OToiZXN0cmFkaW9sIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDg3IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEwOiJwcmVkbmlzb25lIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDg4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIzOiJidXkgaXNvdHJldGlub2luIG9ubGluZSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA3NCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMDoiYnV5IHByb3phYyI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA3NSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNDoiY2hlYXAgVmVudG9saW4iO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wNzYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjA6Imxldm9ub3JnZXN0cmVsIHByaWNlIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDc3IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE2OiJwdXJjaGFzZSBMYW1pc2lsIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDc4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEyOiJidXkgYWNjdXRhbmUiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wOTYiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6MjE6ImFtZXJpY2FubGFuZG93bmVyLmNvbSI7YToyOntpOjA7czozNDoiaW5qZWN0ZWQuc3BhbS1zZW9fcGF5ZGF5LWxvYW5zLjAxNCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMjoiYW1lcmljYW5sYW5kb3duZXJzLmNvbSI7YToyOntpOjA7czozNDoiaW5qZWN0ZWQuc3BhbS1zZW9fcGF5ZGF5LWxvYW5zLjAxNSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNzoiYXBwcmFpc2VkNHlvdS5jb20iO2E6Mjp7aTowO3M6MzQ6ImluamVjdGVkLnNwYW0tc2VvX3BheWRheS1sb2Fucy4wMTYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjA6ImNyZWRpdG5vcHJvYmxlbXMuY29tIjthOjI6e2k6MDtzOjM0OiJpbmplY3RlZC5zcGFtLXNlb19wYXlkYXktbG9hbnMuMDE3IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE1OiJkZWJ0c2V0dGxlbWVudHQiO2E6Mjp7aTowO3M6MzQ6ImluamVjdGVkLnNwYW0tc2VvX3BheWRheS1sb2Fucy4wMTgiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTM6ImRvd25tb3J0Z2FnZXMiO2E6Mjp7aTowO3M6MzQ6ImluamVjdGVkLnNwYW0tc2VvX3BheWRheS1sb2Fucy4wMTkiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjQ6Im9ubGluZXBheWRheWxvYW4tMjRoLmNvbSI7YToyOntpOjA7czozNDoiaW5qZWN0ZWQuc3BhbS1zZW9fcGF5ZGF5LWxvYW5zLjAyMCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMjoicXVpY2sgcGF5ZGF5IjthOjI6e2k6MDtzOjM0OiJpbmplY3RlZC5zcGFtLXNlb19wYXlkYXktbG9hbnMuMDIxIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE5OiJvbmxpbmUtY2FzaC1hZHZhbmNlIjthOjI6e2k6MDtzOjM0OiJpbmplY3RlZC5zcGFtLXNlb19wYXlkYXktbG9hbnMuMDIyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIxOiJjaGVja2NyZWRpdHNjb3JlZmZyZWUiO2E6Mjp7aTowO3M6MzQ6ImluamVjdGVkLnNwYW0tc2VvX3BheWRheS1sb2Fucy4wMjMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjE6ImNvdXJzZXdvcmtzZXJ2aWNlLmNvbSI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDIyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI5OiJjdXN0b21wYXBlcndyaXRpbmdzZXJ2aWNlLm5ldCI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDIzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE1OiJkaXBsb21hZmFrZXMuY28iO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAyNCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNzoicGFwZXI0Y29sbGVnZS5jb20iO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAyNSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMzoicGFwZXJ3cml0aW5nMSI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDI2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIzOiJyZXNlYXJjaHBhcGVyd3JpdGVyLm5ldCI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDI3IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIwOiJ0ZXJtcGFwZXJzd3JpdGVyLm9yZyI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDI4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIwOiJ0b3B1c2F1bml2ZXJzaXR5LmNvbSI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDI5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE2OiJ3ZWRvaG9tZXdvcmsubmV0IjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wMzAiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjM6IndyaXRlbXllbmdsaXNocGFwZXIub3JnIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wMzEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjM6IndyaXRpbmdzZXJ2aWNlczR5b3UuY29tIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wMzMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTk6IndyaXRlbXlwYXBlcjRtZS5vcmciO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAzNCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxOToid3JpdGVteWVzc2F5NG1lLm9yZyI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDQxIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEwOiJlc3NheWJlYXJzIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wNDYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTE6InNtYXJ0eWVzc2F5IjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wNDciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6ImNlbWVudCB0b25ndWUgNXNhIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19zaG9lcy4wMDMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6NzoiaGFyZSA3cyI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fc2hvZXMuMDA0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEyOiJsb3cgYnJlZCAxMXMiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX3Nob2VzLjAwNSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNjoibWlkbmlnaHQgbmF2eSA1cyI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fc2hvZXMuMDA2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEyOiJwbGF5b2ZmcyAxMXMiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX3Nob2VzLjAwNyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNjoibXVsYmVycnkgb3V0bGV0cyI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fc2hvZXMuMDA4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjMwOiJjaGF1c3N1cmVzIGNocmlzdGlhbiBsb3Vib3V0aW4iO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX3Nob2VzLjAwOSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNDoicHJhZGEgc2hvZXMgdWsiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX3Nob2VzLjAxMCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMDoibXVsYmVycnkgaGFuZGJhZ3MgdWsiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX3Nob2VzLjAxMSI7aToxO3M6OToic3BhbV9saW5rIjt9czoyODoidmVudGUgZGUgY2hhdXNzdXJlcyBlbiBsaWduZSI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fc2hvZXMuMDEyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjExOiJtY20gaGFuZGJhZyI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fc2hvZXMuMDEzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE5OiJzY2FycGUgaG9nYW4gb3V0bGV0IjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19zaG9lcy4wMTQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6ImhvZ2FuIHNjYXJwZSB1b21vIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19zaG9lcy4wMTUiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTU6InJlcGxpY2Egd2F0Y2hlcyI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9fd2F0Y2hlcy4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjM6ImJ1eXJvbGV4cmVwbGljYXdhdGNoZXNzIjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5zcGFtLXNlb193YXRjaGVzLjAwMiI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNToid29ybGRwdWxzZS5jb20vbm9kZS82MjIyOCI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9fd2F0Y2hlcy4wMDYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6NzE6ImFydGljbGVzLXN1Ym1pc3Npb24ub3Vyc2NvbXBhbnkuY29tLz9wdHlwZT1wcmV2aWV3JmFtcDthbG9vaz0xJmFtcDtwaWQ9IjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5zcGFtLXNlb193YXRjaGVzLjAwNyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNzoid3d3LmJyYW5kaWcuY28udWsiO2E6Mjp7aTowO3M6MjE6ImluamVjdGVkLnNwYW0tc2VvLjAwNyI7aToxO3M6OToic3BhbV9saW5rIjt9czo4OiJ2b2x0YXJvbCI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW8ucGhhcm1hY3ktb25saW5lLjA4NSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNzoibGFiZXRhbG9sIG9ubGluZTwiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvLnBoYXJtYWN5LW9ubGluZS4wODYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjU6InB1cmNoYXNlIHBhcmxvZGVsIG9ubGluZTwiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvLnBoYXJtYWN5LW9ubGluZS4wODciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTk6Ij5jYXB0b3ByaWwgY2Fwb3RlbjwiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvLnBoYXJtYWN5LW9ubGluZS4wODgiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjY6Im15LWFmZmlsaWF0ZXMtcHJvZ3JhbXMuY29tIjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19nZXQtcmljaC4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjI6ImNhbmliZWFtaWxsaW9uYWlyZS5jb20iO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX2dldC1yaWNoLjAwMiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxODoibWFrZW1vbmV5aW50ZXJuZXR0IjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19nZXQtcmljaC4wMDMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6Im1sbXN1Y2Nlc3Nmb3JtdWxhIjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19nZXQtcmljaC4wMDQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjE6Im1sbXN1Y2Nlc3Nmb3JtdWxhLmNvbSI7YToyOntpOjA7czozMDoiaW5qZWN0ZWQuc3BhbS1zZW9fZ2V0LXJpY2guMDA1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE2OiJzdGFydC1zdWNjZXNzLXVwIjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19nZXQtcmljaC4wMDYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjA6InRlYW1idWlsZG5ldHdvcmsub3JnIjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19nZXQtcmljaC4wMDciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTY6InlvdS1zdGFydC11cC5jb20iO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX2dldC1yaWNoLjAwOCI7aToxO3M6OToic3BhbV9saW5rIjt9czozMDoiYWRvYmVjcmVhdGl2ZXN1aXRlZG93bmxvYWQuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjAxNSI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNToiYWRvYmVhY3JvYmF0ZG93bmxvYWRkLmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wMTYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjQ6ImFkb2JlYWNyb2JhdHNvZnR3YXJlLmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wMTciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTk6ImNkbm91dGxldG9uc2FsZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDE4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIwOiJkb3dubG9hZGFkb2JlY3M2Lm9yZyI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wMTkiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjU6Imdvb2RhbnRpdmlydXNzb2Z0d2FyZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDIwIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI0OiJtb3ZpZWRvd25sb2FkbWFuYWdlci5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDIxIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE1OiJzb2Z0d2FyZS1mb3IteHAiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDIyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI1OiJzcHktcGhvbmUtc29mdHdhcmUtb25saW5lIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjAyMyI7aToxO3M6OToic3BhbV9saW5rIjt9czoyODoidGhlYmVzdGFudGl2aXJ1c3NvZnR3YXJlLm5ldCI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wMjQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjI6ImJlc3RhbnRpdmlydXNzb2Z0d2FyZTEiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDI1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI3OiJ0aGViZXN0Y29tcHV0ZXJzb2Z0d2FyZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDI2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIzOiJ3d3cudGV4YXNnb2xkZW5naXJsLmNvbSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fdmlhZ3JhLjAwMSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMzoianVtcGJvb2JzLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuc3BhbS1zZW9fbGluay4wMTMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6Mjg6Ij5tb2lzc2FuaXRlIGVuZ2FnZW1lbnQgcmluZ3MiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDM0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE5OiJwYXJhd2FuYW9ib3lhaC5pbmZvIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjAzNSI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMToifTsgd3BPdXJwdXNoZXIoImh0dHA6IjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjAzNiI7aToxO3M6OToic3BhbV9saW5rIjt9czo1OiIyNDdwaCI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wMzciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTQ6ImFic2Nhbm5pbmcuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjAzOCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNjoiYWN0aXZpdGllc3RhYmxlcyI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wMzkiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTQ6ImFsbC1mb3J1bXMuYml6IjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA0MCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMToiYW1lcmljYW50cmFuc3BvcnRwZXJ1IjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA0MSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMzoiYW1lcmlseW54Lm5ldCI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wNDIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTM6ImFyYXVqb2FsdmFyZXoiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDQzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE3OiJhcmVseXNmcmFua2VuLmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wNDQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTk6ImFydGVzLW1hcmNpYWxlcy5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDQ1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI0OiJhdXRvcmVzcG9uZGVyLm1tLXByb2plY3QiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDQ2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI2OiJiZWF1dGlmdWxzdW1tZXJtb3JuaW5nLmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wNDciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjI6ImJlc3RhZmZpbGlhdGVsYW5kbWluZXMiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDQ4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE1OiJiaWtlY29sbGVjdGl2ZXMiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDQ5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE0OiJiaWtlcmNoaWNrei53cyI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wNTAiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTY6ImNhbGxpbnNlYXJjaC5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDUxIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEyOiJjYW5kbGVzdG9uZXMiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDUyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEyOiJjYXBlY28uZWR1LnAiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDUzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIxOiJjYXB0YWluZHNndWlkZXNlcnZpY2UiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDU0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE2OiJjYXNleXNjb3JuZXIuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA1NSI7aToxO3M6OToic3BhbV9saW5rIjt9czo2OiJjZWZ0aW4iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDU2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIxOiJjbGFyaWZ5dGhldHJ1dGhpbmNoaW4iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDU3IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEzOiJjbGluZXNpdGUuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA1OCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMzoiY29tdW5pY2FyLm9yZyI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wNTkiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTQ6ImNvbmdyZXNzZmF4LmNvIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA2MCI7aToxO3M6OToic3BhbV9saW5rIjt9czo4OiJjcHBsLm9yZyI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wNjEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTU6ImNyZWVrMmNvYXN0LmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wNjIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjM6ImN1cGlkb2ludGVybmFjaW9uYWwuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA2MyI7aToxO3M6OToic3BhbV9saW5rIjt9czo5OiJjd3RyYW5zbGwiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDY0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEyOiJkYWxlbWFyay5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDY1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE1OiJkZWx0YXNvbmVvbmxpbmUiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDY2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE3OiJkb3VnbGFzbWlzcXVpdGEuYyI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wNjciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTQ6ImVkdWFpZGd1cnUuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA2OCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMjoiZWxjYXJyZXRlLmNsIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA2OSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMzoiZW1iYWxhamVzcGVydSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wNzAiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTU6ImVuem9zcmVzdGF1cmFudCI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wNzEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTY6ImV4dHJlbWV2YWx1ZWhvc3QiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDcyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE1OiJmb3JtYXRpb25zdHVkaW8iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDczIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE2OiJmcmVlLXRyYWZmaWNib29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA3NCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMjoiaG90c3BpbGwuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA3NSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxODoiaG93dG91c2VteWlwYWQuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA3NiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNjoiY2hhbXBhZ25hdDM3LmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wNzciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTQ6ImNoYW5uZWxrb2xrYXRhIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA3OCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMzoiY2hlYXB3ZXN0Y2lnYXJldHRlcy5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDc5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI4OiJjaGVzdGVyZmllbGRjaWdhcmV0dGVzNHUub3JnIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA4MCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNToiY2hpY2tuZWdnc3VwcGx5IjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA4MSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNjoiam9hbmJlYXVsaWV1LmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wODIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTg6Imp1cmlzcHJ1ZGVuY2lhY2l2aSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wODMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTM6ImxpYmVydHlkaW5pbmciO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDg0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE2OiJsaWZlNHN1Y2Nlc3MubmV0IjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA4NSI7aToxO3M6OToic3BhbV9saW5rIjt9czoyODoibWVkaWNhbGNhcmVvbnRoZWludGVybmV0LmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wODYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6Mjc6Im1lZGljYXRpb25zb25saW5lZG9jdG9yLmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wODciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6Im1pcmFjbGUtcHJlZ25hbmN5IjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA4OCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMzoibW9iaWxlY29udGVudHN0b3JlLm1vYmkiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDg5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI0OiJvbmVkb2xsYXIubW0tcHJvamVjdC5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDkwIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE2OiJvbmVuZXRjZW50ZXIuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA5MSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNzoicGFzc2lvbm9mbGlmZS5uZXQiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDkzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEwOiJxZ2FzLmNvLnVrIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA5NCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMzoicngtcHJpY2VzLmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wOTUiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTQ6InNlZWF2aXNpb24uY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA5NiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNToic2hhcmUtdmlkZW8uaW5mIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA5NyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNToic2lsdmVyd2F0ZXJjYWZlIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA5OCI7aToxO3M6OToic3BhbV9saW5rIjt9czo5OiJ0NGhiLmluZm8iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDk5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE5OiJ0YWtlYWZyZWVjcnVpc2UuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjEwMCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNjoidWdjcy5jYWx0ZWNoLmVkdSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4xMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6InVuaXRlZHJldGVrLmNvLnVrIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjEwMiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMToid2ViZW1lZC5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMTAzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIwOiJ3aWNoaXRhYnJvYWRiYW5kLmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4xMDQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjE6Ind3dy5hbXBoaS1mZXN0aXZhbC5kZSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4xMDUiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTY6Ind3dy5wb29sZGF5LmluZm8iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMTA2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI0OiJ3d3cuc2NvcmUtbG91aXN2aWxsZS5vcmciO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMTA3IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIyOiJ3d3cudWx0cmFkYXJrcmFkaW8uY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjEwOCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNjoid3d3LnlhbGVhYXNhLm9yZyI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4xMDkiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjE6InlvdXJkaXNjb3VudDRmcmVlLmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4xMTAiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6NjoiY3lhbGlzIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5zcGFtLXNlb19saW5rLjAwMiI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9czoxNzoiY2hlYXAgbmZsIGplcnNleXMiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLnNwYW0tc2VvX2xpbmsuMDAzIjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjE5OiJjaGVhcCBqZXJzZXlzIGNoaW5hIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5zcGFtLXNlb19saW5rLjAwNCI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9czoxNDk6InJ0ZG9jay5jb20vYnBvLXJvY2tldHRhYi1qcy8/cGlkPTcyNjk2MzY4NzI2OTc2NjU3MjZkNjU2NDY5NjE1ZjczNjU3MjcwJmFtcDtlaWQ9ZmFzdGNvbm5lY3QxJmFtcDtibmFtZT1GYXN0Q29ubmVjdCZhbXA7cHJvZHVjdD1mYyZhbXA7YWZmaWxpYXRlaWQ9MDE3IjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjExMSI7aToxO3M6OToic3BhbV9saW5rIjt9czozNDoid2VzdGVybnVuaW9uLWNvdW50cnktbG9jYXRpb25zLmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4xMTIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjY6Indlc3Rlcm51bmlvbi1sb2NhdGlvbnMuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjExMyI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMzoibW9uZXlncmFtbG9jYXRpb25zLmluZm8iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMTE0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIwOiJtdXNjbGUtdHJhaW5pbmcuaW5mbyI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4xMTUiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6Mjg6Im15LWJlYXV0eS1oZWFsdGgtZml0bmVzcy5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMTE2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE5OiJhcm9tYXRlcmFwaWEuY29tLnBlIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjExNyI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMToiY2hvb3NlZ3JlYXRoZWFsdGguY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjExOCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMToibG9zZWV3ZWlnaHQiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMTE5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIyOiJvdmVyNTBsb3Npbmd3ZWlnaHQuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjEyMCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNzoid3d3LmhlYWx0aGZpdG5lc3NyZW1lZHkuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjEyMSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNjoid3d3LmdvdG9jZXJ0LmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4xMjIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6Mjk6ImNhbmFkaWFucGhhcm1hY3k0YmVzdGxpZmUuY29tIjthOjI6e2k6MDtzOjI0OiJpbmplY3Rpb24uc3BhbV9saW5rcy4wMDIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjY6InBoYXJtYWN5Y2FuYWRhLXJ4ZWR0b3AuY29tIjthOjI6e2k6MDtzOjI0OiJpbmplY3Rpb24uc3BhbV9saW5rcy4wMDMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjU6InBoYXJtYWN5b25saW5lNGJldHRlci5jb20iO2E6Mjp7aTowO3M6MjQ6ImluamVjdGlvbi5zcGFtX2xpbmtzLjAwNCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyODoiZGlzY291bnRwaGFybWFjeS1yeHN0b3JlLmNvbSI7YToyOntpOjA7czoyNDoiaW5qZWN0aW9uLnNwYW1fbGlua3MuMDA1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjMyOiIgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LSI7YToxOntpOjA7czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wMzQiO31zOjM3OiIgaGVpZ2h0PSIwIiBmcmFtZWJvcmRlcj0iMCI+PC9pZnJhbWU+IjthOjE6e2k6MDtzOjIwOiJpZnJhbWUuaW5qZWN0aW9uLjAxNiI7fXM6MzU6InN0eWxlPSJ0ZXh0LWRlY29yYXRpb246bm9uZTtjb2xvcjojIjthOjE6e2k6MDtzOjI0OiJpbmplY3Rpb24uaGlkZGVuLWRpdi4wMzUiO31zOjQ4OiJjb2xvcjogI2ZmZmZmZjsgZm9udC1zaXplOiAwLjFweDsgZGlzcGxheTogbm9uZTsiO2E6MTp7aTowO3M6MjQ6ImluamVjdGlvbi5oaWRkZW4tZGl2LjAzNiI7fXM6MzQ6ImRpc3BsYXk6IG5vbmU7IHZpc2liaWxpdHk6IGhpZGRlbjsiO2E6MTp7aTowO3M6MjQ6ImluamVjdGlvbi5oaWRkZW4tZGl2LjAzNyI7fXM6NDA6IjxhIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246bm9uZSIgaHJlZj0iLy8iO2E6MTp7aTowO3M6Mjc6ImluamVjdGlvbi5oaWRkZW5fYS1ocmVmLjAwMyI7fXM6NDE6IjxhIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246IG5vbmUiIGhyZWY9Ii8vIjthOjE6e2k6MDtzOjI3OiJpbmplY3Rpb24uaGlkZGVuX2EtaHJlZi4wMDQiO31zOjkzOiI8YSBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOiBub25lOyBjb2xvcjogaW5oZXJpdDsgY3Vyc29yOiBkZWZhdWx0OyBvdXRsaW5lOiBub25lOyIgaHJlZj0iaHR0cDoiO2E6MTp7aTowO3M6Mjc6ImluamVjdGlvbi5oaWRkZW5fYS1ocmVmLjAwNSI7fXM6ODM6InN0eWxlPSJwb3NpdGlvbjogYWJzb2x1dGU7IG9wYWNpdHk6IDAuMDAxOyB6LWluZGV4OiAxMDsgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTApOyI+IjthOjE6e2k6MDtzOjI3OiJpbmplY3Rpb24uaGlkZGVuX2EtaHJlZi4wMDYiO31zOjc1OiJzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7b3BhY2l0eTowLjAwMTt6LWluZGV4OjEwO2ZpbHRlcjphbHBoYShvcGFjaXR5PTApIj4iO2E6MTp7aTowO3M6Mjc6ImluamVjdGlvbi5oaWRkZW5fYS1ocmVmLjAwNyI7fXM6MjU6InN0eWxlPSJmb250LXNpemU6MDsiIGhyZWYiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGlvbi5oaWRkZW5fYS1ocmVmLjAwOCI7aToxO3M6ODM6In48YVxzKnN0eWxlPVsnIl1mb250LXNpemVccyo6XHMqMFxzKjtccypbJyJdXHMqaHJlZj1bJyJdaHR0cFtePl0rPlxzKlx3K1tePF0rPFwvYT5+Ijt9czozMToic2hvcnRlLnN0L2xpbmstY29udmVydGVyLm1pbi5qcyI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuanNfdW53YW50ZWRfYWRzLjAwNCI7aToxO3M6MzE3OiJ+PHNjcmlwdFxzKnR5cGUuLnRleHQuamF2YXNjcmlwdC4+Li48XCFcW0NEQVRBXFtccypcKGZ1bmN0aW9uW146XSsidG9rZW4iOlxzKiJcdysiLFxzKiJbXlwpXStcKTtccypzY3JpcHQuYXN5bmNccyo9XHMqdHJ1ZTtccypzY3JpcHQuc3JjXHMqPVxzKi4uLmNkblwuc2hvcnRlXC5zdC5saW5rLWNvbnZlcnRlci5taW4uanMuO1tefV0rXH07XHMqdmFyXHMqZW50cnlccyo9XHMqZG9jdW1lbnRbXlxbXStcWzBcXTtccyplbnRyeS5wYXJlbnROb2RlLmluc2VydEJlZm9yZVwoc2NyaXB0LFxzKmVudHJ5XCk7XHMqfVwpXChcKTtccyouLlxdXF0+PC5zY3JpcHQ+fiI7fXM6MjE6Inh2aWQta2lja2Fzcy10b3JyZW50LyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuaGlkZGVuX2EtaHJlZi4wMDMiO2k6MTtzOjM2OiJ+aHR0cDouLlteeF0reHZpZC1raWNrYXNzLXRvcnJlbnRcL34iO31zOjIzOiJbdXJsPWh0dHA6Ly9jYXNpbm9nYW1lcyI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW8uY2FzaW5vLjAwNiI7aToxO3M6NjI6In5cW3VybD1odHRwOi4uY2FzaW5vZ2FtZXNbXlxdXStcXWNhc2lub1xzKmdhbWVzW15cW10rXFsudXJsXF1+Ijt9czo1OToiaHR0cDovL3d3dy5rbHVza2FwLmNvbS8/cT1jb250ZW50L2Nhc2gtcGF5ZGF5LWxvYW5zLWF0bGFudGEiO2E6Mjp7aTowO3M6MzQ6ImluamVjdGVkLnNwYW0tc2VvX3BheWRheS1sb2Fucy4wMjYiO2k6MTtpOjEyO31zOjE0OiI+b3JkZXIgYWRpcGV4PCI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA4OSI7aToxO3M6NzQ6In48YVxzJipzdHlsZT0uZm9udC1zaXplOjBweDsuXHMqaHJlZj0uW2h0cHNdezQsfTpbXj5dKz5vcmRlclxzKmFkaXBleDwuYT5+Ijt9czoyMzoiPm9yZGVyIHpvbHBpZGVtIG9ubGluZTwiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wOTAiO2k6MTtzOjg1OiJ+PGFccyYqc3R5bGU9LmZvbnQtc2l6ZTowcHg7LlxzKmhyZWY9LltodHBzXXs0LH06W14+XSs+b3JkZXJccyp6b2xwaWRlbVxzKm9ubGluZTwuYT5+Ijt9czoxMjoiRXhhbSBQREY8L2E+IjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5zcGFtLXNlb19leGFtLjAwMSI7aToxO2k6MTE7fXM6MTI6ImV4YW1kb3duLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuc3BhbS1zZW9fZXhhbS4wMDIiO2k6MTtpOjExO31zOjExOiJKZXJzZXlzPC9hPiI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9famVyc2V5cy4wMDEiO2k6MTtpOjExO31zOjEwOiJKZXJzZXk8L2E+IjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19qZXJzZXlzLjAwMS4wMiI7aToxO2k6MTE7fXM6MTA6Ij5qb3JkYW4gMTEiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2pvcmRhbi4wMTgiO2k6MTtpOjExO31zOjE4OiI8ZGl2IHN0eWxlPSJsZWZ0Oi0iO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDEwIjtpOjE7aToxMTt9czoxNzoiOiJJQ0FnSUNBZ0lDQWdJQ0EiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDMxIjtpOjE7aToxMTt9czoyMDoiR2VudWluZSBQcm9kdWN0IEtleXMiO2E6Mjp7aTowO3M6MjE6ImluamVjdGVkLnNwYW0tc2VvLjAwNiI7aToxO2k6MTE7fXM6MTY6IndyaXRlIGZvciBtZTwvYT4iO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjA0NSI7aToxO2k6MTE7fXM6MTY6IldhdGNoIEZ1bGwgTW92aWUiO2E6Mjp7aTowO3M6MjE6ImluamVjdGVkLnNwYW0tc2VvLjAwOSI7aToxO2k6MTE7fXM6MTY6IndhdGNoIGZ1bGwgbW92aWUiO2E6Mjp7aTowO3M6MjE6ImluamVjdGVkLnNwYW0tc2VvLjAxMCI7aToxO2k6MTE7fXM6MTY6IldhdGNoIGZ1bGwgTW92aWUiO2E6Mjp7aTowO3M6MjE6ImluamVjdGVkLnNwYW0tc2VvLjAxMSI7aToxO2k6MTE7fXM6MTk6IkZha2UgRGVzaWduZXIgQmFnczwiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX3JlcGxpY2EuMDAxIjtpOjE7aToxMTt9czoyNjoiUmVwbGljYSBEZXNpZ25lciBIYW5kYmFnczwiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX3JlcGxpY2EuMDAyIjtpOjE7aToxMTt9czoyMDoiPHA+Y2FuYWRhIGdvb3NlIHNhbGUiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX3JlcGxpY2EuMDAzIjtpOjE7aToxMTt9czoyMjoiPkNoZWFwIENlbGluZSBIYW5kYmFncyI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9fcmVwbGljYS4wMDQiO2k6MTtpOjExO31zOjExOiJidXktcHJlY29zZSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjAyMyI7aToxO2k6MTE7fXM6MTQ6ImJ1eWluZy1wcmVjb3NlIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDI0IjtpOjE7aToxMTt9czoxMjoiYnV5LWNlZml4aW1lIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDI1IjtpOjE7aToxMTt9czoxNDoiYnV5LW9ybmlkYXpvbGUiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wMjYiO2k6MTtpOjExO31zOjE0OiJidXktdGl6YW5pZGluZSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjAyNyI7aToxO2k6MTE7fXM6MTU6ImJ1eWluZy10ZW5vcm1pbiI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjAyOCI7aToxO2k6MTE7fXM6ODoibGV2YXF1aW4iO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wMjkiO2k6MTtpOjExO31zOjg6ImVyZWN0aWxlIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDMwIjtpOjE7aToxMTt9czoxNDoiZ2VuZXJpYyBjaWFsaXMiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wNzkiO2k6MTtpOjExO31zOjE0OiJjaGVhcCBPcmxpc3RhdCI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA4MCI7aToxO2k6MTE7fXM6MTc6ImJ1eSBYZW5pY2FsIGNoZWFwIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDgxIjtpOjE7aToxMTt9czoxMDoiYnV5LWF0aXZhbiI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA5MSI7aToxO2k6MTE7fXM6MTQ6ImJ1eSBjbG9uYXplcGFtIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDkyIjtpOjE7aToxMTt9czoxNToiYWNoZXRlcmR1ZnJhbmNlIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDkzIjtpOjE7aToxMTt9czoxNjoiY2lhbGlzIGdlbmVyaXF1ZSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA5NCI7aToxO2k6MTE7fXM6MTQ6ImNpYWxpc2ZyYW5jZTI0IjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDk1IjtpOjE7aToxMTt9czo3OiJhdm9kYXJ0IjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDMxIjtpOjE7aToxMTt9czo2OiJhZGFsYXQiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wODQiO2k6MTtpOjExO31zOjIwOiJwZXJzb25hbC1sb2FuLWNlbnRyZSI7YToyOntpOjA7czozNDoiaW5qZWN0ZWQuc3BhbS1zZW9fcGF5ZGF5LWxvYW5zLjAyNCI7aToxO2k6MTE7fXM6MjU6InF1aWNrLWxvYW4tbGVuZGVycy1vbmxpbmUiO2E6Mjp7aTowO3M6MzQ6ImluamVjdGVkLnNwYW0tc2VvX3BheWRheS1sb2Fucy4wMjUiO2k6MTtpOjExO31zOjE1OiJXcml0ZU15UGFwZXI0TWUiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAzNSI7aToxO2k6MTE7fXM6MzA6ImRpc3NlcnRhdGlvbiBmcmVlbGFuY2Ugd3JpdGVycyI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDQwIjtpOjE7aToxMTt9czo3OiJoYW5nYmFnIjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5zcGFtLXNlb193YXRjaGVzLjAwMyI7aToxO2k6MTE7fXM6NToicm9sZXgiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX3dhdGNoZXMuMDA0IjtpOjE7aToxMTt9czoxMzoiPnByYWRhIG91dGxldCI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9fd2F0Y2hlcy4wMDUiO2k6MTtpOjExO31zOjE2OiJydXFibnNtb2tlYmJxLmdhIjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5zcGFtX2xpbmtzLjAwMSI7aToxO2k6MTE7fXM6MTQ6IiI+bGVzIHByb3N0aXR1IjthOjI6e2k6MDtzOjI0OiJpbmplY3Rpb24uc3BhbV9saW5rcy4wMDYiO2k6MTtpOjExO31zOjE3OiIiPnJlbmNvbnRyZSBmZW1tZSI7YToyOntpOjA7czoyNDoiaW5qZWN0aW9uLnNwYW1fbGlua3MuMDA3IjtpOjE7aToxMTt9czoxODoiPmZyZWUgZGF0aW5nIHNpdGVzIjthOjI6e2k6MDtzOjI0OiJpbmplY3Rpb24uc3BhbV9saW5rcy4wMDgiO2k6MTtpOjExO31zOjEzOiJjaGVhcCByYXkgYmFuIjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5oaWRkZW4tZGl2LjAyOCI7aToxO2k6MTE7fXM6MTE6ImJ1eSBhY2lwaGV4IjthOjI6e2k6MDtzOjI0OiJpbmplY3Rpb24uc3BhbV9saW5rcy4wMDkiO2k6MTtpOjExO31zOjEyOiJidXkgdHJhbWFkb2wiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGlvbi5zcGFtX2xpbmtzLjAxMCI7aToxO2k6MTE7fXM6MTE6ImJ1eSBsZXhhcHJvIjthOjI6e2k6MDtzOjI0OiJpbmplY3Rpb24uc3BhbV9saW5rcy4wMTEiO2k6MTtpOjExO31zOjg6InRvcnJlbnQ8IjthOjI6e2k6MDtzOjI0OiJpbmplY3Rpb24uc3BhbV9saW5rcy4wMTIiO2k6MTtpOjExO31zOjg6ImFjY3V0YW5lIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDk3IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjg6Im5vbHZhZGV4IjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDk4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjExOiJkb3h5Y3ljbGluZSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA5OSI7aToxO3M6OToic3BhbV9saW5rIjt9czo2OiJiZW50eWwiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4xMDAiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6NToibGFzaXgiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4xMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTE6Im1lYmVuZGF6b2xlIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMTAyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjk6InRyZXRpbm9pbiI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjEwMyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNToib25saW5lLXBoYXJtYWN5IjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMTA0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE3OiJjYW5hZGlhbi1waGFybWFjeSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjEwNSI7aToxO3M6OToic3BhbV9saW5rIjt9czo3OiJzdGVuZHJhIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMTA2IjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjc6Im1hbGVncmEiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4xMDciO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6ODoibW90aWxpdW0iO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4xMDgiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6NToieGFuYXgiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4xMDkiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6ODoidHJhbWFkb2wiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4xMTEiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6OToibW9kYWZpbmlsIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMTEyIjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjE2OiJicmF6aWxpYW4gd2F4aW5nIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlby5jaGVhcC1idXlzLjEyNyI7aToxO2k6MTE7fXM6MTY6ImJyYXppbGlhbi13YXhpbmciO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvLmNoZWFwLWJ1eXMuMTI4IjtpOjE7aToxMTt9czoxNzoid3JpdGVwYXBlcjRtZS5jb20iO2E6Mjp7aTowO3M6MjE6ImluamVjdGVkLnNwYW0tc2VvLjAxNSI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNToiY29sbGVnZS1ob21ld29yay1oZWxwLm9yZyI7YToyOntpOjA7czoyMToiaW5qZWN0ZWQuc3BhbS1zZW8uMDE2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEyOiJzcHlpbmcubmluamEiO2E6Mjp7aTowO3M6MjE6ImluamVjdGVkLnNwYW0tc2VvLjAxNyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNjoidHJ5bW9iaWxlc3B5LmNvbSI7YToyOntpOjA7czoyMToiaW5qZWN0ZWQuc3BhbS1zZW8uMDE4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIwOiJTdHJpbmcuZnIwbUNoYXJDMGRlKCI7YToyOntpOjA7czoyNToiaW5qZWN0ZWQuZnJvbUNoYXJDb2RlLjAwMSI7aToxO2k6MTE7fX0=' ) );
$WHITELIST_STRINGS = unserialize( base64_decode( 'YToxNDp7czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wMjAiO2E6MTp7aTowO3M6MjA6IjoicGF0dGVybnMiO2E6MTp7aTowIjt9czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9famVyc2V5cy4wMDEuMDIiO2E6MTp7aTowO3M6MTE6Ik5ldyBKZXJzZXk8Ijt9czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2RvY3VtZW50LjAxMSI7YToyOntpOjA7czoxNDoiLmdldEZ1bGxZZWFyKCkiO2k6MTtzOjI0OiJjb250ZW50cy5kb2N1bWVudC53cml0ZSgiO31zOjI2OiJpbmplY3RlZC5zcGFtLXNlb19saW5rLjAwMSI7YToxOntpOjA7czo1MjoiPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL0F1dG9tYXR0aWMvamV0cGFjay9wdWxsLyI7fXM6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDMzIjthOjE6e2k6MDtzOjMyOiI8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfd3BjZiI7fXM6MTc6ImJhY2tkb29yLmV2YWwuMDAzIjthOjM6e2k6MDtzOjExOiJfaWNsX3N0cmluZyI7aToxO3M6NDY6ImZ1bmN0aW9uIGZmX0NzZWxSZWdpb25fYWN0aW9uKGVsZW1lbnQsIGFjdGlvbikiO2k6MjtzOjMwOiJmZl9wcm9jZXNzb3IuZm9ybV9pZCkucmVzZXQoKTsiO31zOjI3OiJpbmplY3RlZC5qc19hcHBlbmRDaGlsZC4wMDYiO2E6Mjp7aTowO3M6MTc6ImNkbi5tb3VzZWZsb3cuY29tIjtpOjE7czo0NDoid3d3LnNob3BwZXJhcHByb3ZlZC5jb20vc2VhbHMvY2VydGlmaWNhdGUuanMiO31zOjI3OiJpbmplY3RlZC5qc19hcHBlbmRDaGlsZC4wMDEiO2E6Mzp7aTowO3M6MTc6ImNkbi5tb3VzZWZsb3cuY29tIjtpOjE7czo0NDoid3d3LnNob3BwZXJhcHByb3ZlZC5jb20vc2VhbHMvY2VydGlmaWNhdGUuanMiO2k6MjtzOjMyOiJhY3NiYXBwLmNvbS9hcHBzL2FwcC9kaXN0L2pzL2FwcCI7fXM6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjA0MSI7YToxOntpOjA7czoxNToibHVja3lvcmFuZ2UuY29tIjt9czoyMjoiaW5qZWN0ZWQuanNfYmFzZTY0LjAwNCI7YToyOntpOjA7czozNToiJnNob3dfZGFzaF93aWRnZXQ9MSZpbnZpdGFpb25fY29kZT0iO2k6MTtzOjQ4OiJQSE5qY21sd2RENWhiR1Z5ZENnblZuVnNibVZ5WVdKc1pTY3BQQzl6WTNKcGNIUSsiO31zOjIxOiJpbmplY3RlZC5zcGFtLXNlby4wMjMiO2E6MTp7aTowO3M6Mzg6IkpUTkRKVEl4TFMwbE1qQkNaV2RwYmlVeU1FMWhhV3hqYUdsdGNDIjt9czoyNDoiaW5qZWN0ZWQuaGlkZGVuLXNwYW4uMDAxIjthOjE6e2k6MDtzOjM3OiI8IS0tIHJlYWwgcGVvcGxlIHNob3VsZCBub3QgZmlsbCB0aGlzIjt9czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wMjYiO2E6MTp7aTowO3M6Mjk6InVnZ2M6Ly9qamoucWpwdmFhYmluZ3ZiYWYucGJ6Ijt9czoyNToiYmFja2Rvb3IucHJlZ19yZXBsYWNlLjAwMSI7YToxOntpOjA7czoyMDoiZ2xvYmFsICRmZl9wcm9jZXNzb3IiO319' ) );
$WHITELIST_TABS = unserialize( base64_decode( 'YTo2OntzOjE0OiI8UFJFRklYPndmSGl0cyI7YToxOntpOjA7czo1OiJ0YWJsZSI7fXM6Mjg6IjxQUkVGSVg+c3BiY19zY2FuX3NpZ25hdHVyZXMiO2E6MTp7aTowO3M6NToidGFibGUiO31zOjMzOiI8UFJFRklYPm9wdGlvbnMucXV0dGVyYV93cF9yZXBvcnQiO2E6MTp7aTowO3M6NToidGFibGUiO31zOjM5OiI8UFJFRklYPm9wdGlvbnMuR09UTUxTX2RlZmluaXRpb25zX2Jsb2IiO2E6MTp7aTowO3M6NToidGFibGUiO31zOjIwOiI8UFJFRklYPm9wdGlvbnMuV1BNUiI7YToxOntpOjA7czo1OiJ0YWJsZSI7fXM6MTY6IndmSXNzdWVzLmxvbmdNc2ciO2E6MTp7aTowO3M6NToidGFibGUiO319' ) );
$SIGS_MASSDOMAINS = unserialize( base64_decode( 'YToxOntzOjY6IjxzY3JpcCI7YToyOntpOjA7aToxMDtzOjM6InNyYyI7YToyMzp7aTowO2k6MTA7czoyMzoiZGVjbGFyZWJ1c2luZXNzZ3JvdXAuZ2EiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLm1hc3NfZG9tYWluLjAwMSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIxOiJsb3dlcnRoZW5za3lhY3RpdmUuZ2EiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLm1hc3NfZG9tYWluLjAwMiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE5OiJzdHJvbmdjYXBpdGFsYWRzLmdhIjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5tYXNzX2RvbWFpbi4wMDMiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxMToib2NsYXNydi5jb20iO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLm1hc3NfZG9tYWluLjAwNCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE0OiJvbmVtYm9hcmFuLmNvbSI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQubWFzc19kb21haW4uMDA1IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6OToiZ25vZ2xlLnJ1IjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5tYXNzX2RvbWFpbi4wMDYiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyNDoic2Vjb25kYXJ5aW5mb3JtdHJhbmQuY29tIjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5tYXNzX2RvbWFpbi4wMDciO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxOToibG92ZWdyZWVucGVuY2lscy5nYSI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQubWFzc19kb21haW4uMDA4IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTk6ImxpbmV0b2Fkc2FjdGl2ZS5jb20iO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLm1hc3NfZG9tYWluLjAwOSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE4OiJ0cmFuc2FuZGZpZXN0YXMuZ2EiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLm1hc3NfZG9tYWluLjAxMCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIzOiJ0cmF2ZWxmb3JuYW1ld2Fsa2luZy5nYSI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQubWFzc19kb21haW4uMDExIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTM6InVwdG9kYXRlci5uZXQiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLm1hc3NfZG9tYWluLjAxMiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjEzOiJpdG91cmxpZmUudG9wIjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5tYXNzX2RvbWFpbi4wMTMiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNToiZG9udGtpbmhvb290LnR3IjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5tYXNzX2RvbWFpbi4wMTQiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMDoidGFsa2luZ2Fib3V0ZmlybXMuZ2EiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLm1hc3NfZG9tYWluLjAxNSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE5OiJ0cmF2ZWxpbnNreWRyZWFtLmdhIjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5tYXNzX2RvbWFpbi4wMTYiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czozMzoiUkVNT1ZFRF93cC11cGRhdGUtY2RuLmNvbV9SRU1PVkVEIjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5tYXNzX2RvbWFpbi4wMTciO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxOToiZHJpdmVyZm9ydG5pZ3RseS5nYSI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQubWFzc19kb21haW4uMDE4IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjA6ImJlbG9ubmFub3RzZXJ2aWNlLmdhIjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5tYXNzX2RvbWFpbi4wMTkiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNjoic3BlY2lhbGFkdmVzLmNvbSI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQubWFzc19kb21haW4uMDIwIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjE6InRydXN0ZWRjcG1yZXZlbnVlLmNvbSI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQubWFzc19kb21haW4uMDIxIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjM6ImNsYXNzaWNwYXJ0bmVyc2hpcHMuY29tIjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5tYXNzX2RvbWFpbi4wMjIiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9fX19' ) );
//KEEP EMPTY
//KEEP EMPTY
//KEEP EMPTY
//KEEP EMPTY
/**
* Returns a 200 HTTP status code.
*
* One of the security analysts requested this option.
*
* @option test Returns a 200 HTTP status code and custom header.
*
* @author Unknown <noreply@sucuri.net>
* @author Yorman <yorman@sucuri.net>
* @date Nov 23, 2017
*/
if (isset($_GET['test'])) {
header('HTTP/1.1 200 OK');
header('X-SUCURIDB-RAND: ' . rand(100, 999));
exit;
}
define('CI_NAME', 0);
define('CI_ACTION', 1);
define('CI_WHITELIST', 2);
define('PCRE_DELIM', '~'); // Delimiter for PCRE regular expressions
define('POSIX_DELIM', '/'); // Delimiter for POSIX regular expressions
if (isset($_GET['dir'])) {
$scan_dir = $_GET['dir'];
define('QUARANTINE_FOLDER', '.' . DIRECTORY_SEPARATOR . $scan_dir . DIRECTORY_SEPARATOR . '.sucuriquarantine');
}
else{
define('QUARANTINE_FOLDER', '.' . DIRECTORY_SEPARATOR . '.sucuriquarantine');
}
define('BACKUP_APPENDIX', '_sucuridbbackup.');
define('SUCURI_KEY', 'kduhgop32lkj');
define('BACKUP_COMMENT', "-- sucuri_backup");
define('RESUME_FILE_NAME', '.sucuridbresume.txt');
define('RESUME_RESULTS', '.sucuridbresumeresults.txt');
define('UPDATE_ERR_BACKUP_DIR', 1);
define('UPDATE_ERR_BACKUP_FILE', 2);
define('UPDATE_ERR_CHANGED', 3);
define('UPDATE_ERR_NO_PRI', 4);
if (!function_exists('get_magic_quotes_gpc')) {
function get_magic_quotes_gpc() {
return false;
}
}
/**
* Support composite primary keys.
*
* A column can have multiple primary keys also knows as composite keys. In
* this case, instead of identifying an unique row through the entire table
* using one single values, we will use a merge of all the values for all the
* columns marked as primary keys.
*
* For backward compatibility reasons, we will transform any non-list of data
* identifiers into a single-value list. This is, if ths security analyst uses
* the old URL format to show the content of an infected table row, the data
* coming from the URL (assuming its a single-value) will be transformed into
* an array.
*/
define('SUPPORT_COMPOSITE_KEYS', true);
$updateErrMessages = array(
UPDATE_ERR_BACKUP_DIR => 'Create backup dir failed',
UPDATE_ERR_BACKUP_FILE => 'Create backup file failed',
UPDATE_ERR_CHANGED => 'The database column was simultaneously changed by another program. Please try again',
UPDATE_ERR_NO_PRI => 'No primary key found',
);
// If running via terminal
if (isTerminal()) {
parse_str(implode('&', array_slice($argv, 1)), $_GET);
}
/**
* Prevents the non-supervised execution of the cleanup script.
*
* The main idea of this condition is to automatically delete this and other
* scripts that were uploaded by one of our security analysts to a customer's
* website during a regular malware cleanup.
*
* If the analyst forgets to delete these files and a web crawler finds them,
* the direct execution of the script without the required parameters will
* trigger the deletion of the cleanup suite.
*
* @option srun Stop the automatic deletion of the unsupervised scripts.
*/
if (!isset($_GET['srun'])) {
@unlink('sucuri-cleanup.php');
@unlink('sucuri-version-check.php');
@unlink('sucuri-wpdb-clean.php');
@unlink('sucuri-db-cleanup.php');
@unlink('sucuri-db-clean.php');
@unlink('sucuri_listcleaned.php');
@unlink('sucuri-filemanager.php');
@unlink('sucuri-toolbox.php');
@unlink('sucuri-toolbox-client.php');
@unlink('sucuri-adminer.php');
@unlink('sucuri-magento2.php');
@unlink('sucuri_db_clean.php');
@unlink('google936278b9bb435851.html');
@unlink('google79c13c5605e6f406.html');
@unlink('googlee6cb14d10ed8d0d2.html');
@unlink('googlec55310faa35e04c1.html');
@unlink(__FILE__);
exit(0);
}
// Get file content and find the line with content
function findLineInFile($file, $content)
{
$fh = @fopen($file, "r");
if (!$fh) {
echo "DEBUG: UNABLE TO CHECK " . escapeHtml($file) . "\n";
return null;
}
while (($buffer = fgets($fh, 4096)) !== false) {
if (strpos($buffer, $content) !== false) {
fclose($fh);
return $buffer;
}
}
fclose($fh);
return null;
}
if (!function_exists('file_get_contents')) { // below PHP 4.3
function file_get_contents($fileName) {
$fh = @fopen($fileName);
if ($fh === false) {
return false;
}
$res = fread($fh, 1048576);
fclose($fh);
return $res;
}
}
define('OPT_TYPE_CONST', 1);
define('OPT_TYPE_VAR', 2);
define('OPT_TYPE_ASSOC', 4);
define('OPT_TYPE_ENV', 8);
define('OPT_TYPE_XML', 16);
define('OPT_TYPE_FIRST', 32);
define('OPT_TYPE_CONST_NUM', 64);
define('OPT_TYPE_PHPDOTENV', 128);
function getOptMatch($m, $type)
{
return ($type & OPT_TYPE_FIRST) ? $m[0] : $m[count($m) - 1];
}
function getOption($option, $config, $type)
{
$option = preg_quote($option);
// String constants (WordPress)
if (($type & OPT_TYPE_CONST) &&
preg_match_all('@^\s*define\(\s*([\'"])' . $option . '\1\s*,\s*([\'"])(.*)\2\s*\)\s*;@m', $config, $m)) {
return stripslashes(getOptMatch($m[3], $type));
}
// Numeric constants
if (($type & OPT_TYPE_CONST_NUM) &&
preg_match_all('@^\s*define\(\s*([\'"])' . $option . '\1\s*,\s*(\d*)\s*\)\s*;@m', $config, $m)) {
return stripslashes(getOptMatch($m[2], $type));
}
// wp-config.php trick, see
// http://www.wpbeginner.com/wp-tutorials/useful-wordpress-configuration-tricks-that-you-may-not-know/
if (($type & OPT_TYPE_ENV) && preg_match('@^\s*define\(\s*([\'"])' . $option . '\1\s*,\s*\$_ENV\s*[[{]\s*' .
'([\'"]?)DATABASE_SERVER\2\s*[}\]]\s*\)\s*;@m', $config, $m)) {
return $_ENV['DATABASE_SERVER'];
}
// Variables (Joomla, WordPress prefix)
if (($type & OPT_TYPE_VAR) &&
preg_match_all('@^\s*(?:public|var)?\s*' . $option . '\s*=\s*(?:([\'"])(.*)\1|([0-9]+))\s*;@m', $config, $m)) {
$str = getOptMatch($m[2], $type); // Return the string m[2] or the number m[3] if the string was not found
return $str ? stripslashes($str) : getOptMatch($m[3], $type);
}
// Associative arrays (Drupal)
if (($type & OPT_TYPE_ASSOC) &&
preg_match_all('@(?:^|,|\()\s*([\'"])' . $option . '\1\s*=>\s*([\'"])(.*?)\2\s*[,)]@m', $config, $m)) {
return stripslashes(getOptMatch($m[3], $type));
}
// Magento XML config
if (($type & OPT_TYPE_XML) && preg_match_all('@^\s*<' . $option . '>(?:<!\[CDATA\[|\{\{)(.*)(?:}}|\]\]>)</' .
$option . '>\s*$@m', $config, $m)) {
return getOptMatch($m[1], $type);
}
// PHPDotEnv .env config files
if (($type == OPT_TYPE_PHPDOTENV) && preg_match_all('@^' . $option . '[^\=]*[^\w+]*[^\s*]*@m', $config, $m)) {
return preg_replace('@^' . $option . '[^\=]*[^\w+]*@m', "",$m[0][0]);
}
return '';
}
// Properly escape HTML content
function escapeHTML($string)
{
global $isPlainText;
if ($isPlainText) {
return $string;
}
if (!defined('ENT_SUBSTITUTE')) {
define('ENT_SUBSTITUTE', 0);
}
return htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
/**
* The nature of the code forces us to disregard the addition of unit-tests for
* most of the implemented features. This option allows the execution of a small
* set of tests that guarantee the functionality of some of the main actions of
* the database cleanup script.
*
* @option tests Includes and executes the script test suite.
*/
if (isset($_GET['tests'])) {
include 'sucuri-db-tests.php';
runTests();
exit;
}
// Find the output format
$isPlainText = false;
if (isset($_GET['robot'])) {
$isPlainText = true;
if (!isset($_GET['dump'])) {
header('Content-Type: text/plain');
}
} elseif (isTerminal()) {
$isPlainText = true;
}
if (!isset($_GET['dump'])) {
if (!$isPlainText) {
echo '<style><!--
.cleared {color: green}
.warn {color: red; font-weight: bold}
.hidden-copied {position: absolute; opacity: 0; z-index: -999}
.inserted::before {content: attr(data-content)}
textarea {font-family: monospace; font-size: 100%; overflow: auto}
--></style><pre style="white-space:pre-wrap">';
}
printMsg("Sucuri Database Cleanup");
$version = ' v1.3.3 - build ' . $myversion;
if ($isPlainText) {
echo $version;
} else {
// Make the version selectable to allow easy copying to Jira
echo '<input type="text" readonly name="version" style="border:none;font-family:monospace;font-size: 100%" '.
'size="' . (strlen($version) + 10) . '" value="' . $version . '" onclick="this.setSelectionRange(1, ' .
strlen($version) . ')">';
}
printMsg("\n\n");
}
// Create sucuri_db_clean.php
if (isset($_GET['dbconfig'])) {
doDbConfig();
}
$config = getCMSConfig();
if (null === $config) {
doDbConfig();
}
/**
* The mysqli extension, or as it is sometimes known, the MySQL improved
* extension, was developed to take advantage of new features found in MySQL
* systems versions 4.1.3 and newer. The mysqli extension is included with PHP
* versions 5 and later. The mysqli extension has a number of benefits, the key
* enhancements over the mysql extension being:
*
* Object-oriented interface
* Support for Prepared Statements
* Support for Multiple Statements
* Support for Transactions
* Enhanced debugging capabilities
* Embedded server support
*/
if (function_exists('mysqli_connect')) {
if (function_exists('mysqli_real_query')
&& function_exists('mysqli_use_result')
) {
/*
* If we detect the possibility, we are going to use some methods
* that consume less memory, to avoid getting out-of-memory errors
*/
$driver = new MySQLIDriverLowMemory();
} else {
$driver = new MySQLIDriver();
}
} else {
$driver = new MySQLDriver();
}
$errMsg = $driver->connect($config);
if ($errMsg !== true) {
reportFatalError($errMsg);
}
if (!isset($_GET['dump'])) {
printMsg("\nINFO: Connected to " . $driver->getName() . "\n");
}
maybePrintUserList();
// Show field/row content
if (isset($_GET['showcontent'])
&& isset($_GET['t'])
&& isset($_GET['c'])
&& isset($_GET['id_name'])
&& isset($_GET['id'])
) {
showContent($driver, $_GET['t'], $_GET['c'], $_GET['id_name'], $_GET['id']);
}
if (isset($_GET['showcontent'])
&& isset($_GET['t'])
&& isset($_GET['id_name'])
&& isset($_GET['id'])
) {
showRow($driver, $_GET['t'], $_GET['id_name'], $_GET['id']);
}
// Restore database
if (isset($_GET['restore'])) {
restore($driver, $_GET['restore']);
}
// Turning off whitelists when requested
if (isset($_GET['nowhitelist'])) {
$WHITELIST_STRINGS = array();
$WHITELIST_TABS = array();
}
// Search all tables
$tablesColumns = $driver->getTablesColumns($config, SUPPORT_COMPOSITE_KEYS);
if (isset($_GET['dump'])) {
$tmp_file_name = getBackupFilename('dump-tables', uniqid('dump-'));
if ($tmp_file_name === false) {
showUpdateDbError(UPDATE_ERR_BACKUP_FILE);
exit;
}
$tmp_file = fopen($tmp_file_name, 'w+');
dumpTables($driver, $_GET['dump'], $tablesColumns, $config['db']);
}
if (isset($_GET['resumeresults'])) {
resumeResults();
}
readSkipTable($tablesColumns);
$foundMalware = false;
startResume();
$displayScanningComplete = false;
if (isset($_GET['s'])) {
$displayScanningComplete = true;
$searchSignature = getSearchSignature();
searchAndClear($driver, $tablesColumns, $searchSignature);
replaceInTerminal($driver, $tablesColumns, $searchSignature);
} elseif (isset($_GET['help'])) {
printScriptUsage();
} elseif (isset($_GET['list'])) {
listTables($driver, $tablesColumns, $config);
} elseif (isset($_GET['listTriggers'])) {
listTriggers($driver);
} elseif (isset($_GET['procedures'])
|| isset($_GET['procedures_name'])
|| isset($_GET['procedures_delete'])
) {
printStoredProcedures($driver);
} else {
$displayScanningComplete = true;
searchAndClear($driver, $tablesColumns, $DB_SIGS);
searchAndClear($driver, $tablesColumns, $SIGS_MASSDOMAINS);
deleteRows($driver, $tablesColumns, $config);
checkDBUsers($driver, $tablesColumns, $config);
checkWPDefaultUserRole($driver, $tablesColumns, $config);
checkWPSiteURL($driver, $tablesColumns, $config);
checkTriggers($driver);
}
checkSkippedTables();
$verdict = '';
if (!$foundMalware) {
$verdict = '. No malware found';
} elseif (!skipCleanup()) {
// When using noclean, it reports "Found malware to clean", so we don't suggest to copy these lines
$verdict = '. Press Ctrl+A, then Ctrl+C to copy the report';
}
if ($displayScanningComplete) {
printMsg("\n\nINFO: Scanning complete" . $verdict);
}
printMsg("\nTools: ");
$tools = array(
'dbconfig',
'list',
's',
'restore',
'dump',
'',
'noclean',
'noise',
'skiptable=wp_comments,wp_commentmeta',
'scantable=wp_posts,wp_options',
'resume',
'procedures',
);
foreach ($tools as $tool) {
if ($tool === '') {
printMsg("\n");
continue;
}
printInsertedLink($tool);
printMsg("\x20\x20");
}
prush($isPlainText ? "\n" : '</pre>');
finishResume(); // delete the resume file after all operations to ensure that we run to the end
$driver->disconnect();
exit;
// ======================================================
// DB abstraction layer
class MySQLCommon
{
function escapeName($name)
{
// See https://dev.mysql.com/doc/refman/5.7/en/identifiers.html
return '"' . str_replace('"', '""', $name) . '"';
}
function begin()
{
$this->query('SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;');
$this->query('BEGIN;');
}
function commit()
{
$this->query('COMMIT;');
}
function rollback()
{
$this->query('ROLLBACK;');
}
function getTablesColumns($config, $withCompositeKeys = false)
{
$scannedTypes = array(
'varchar' => 1, 'char' => 1,
'tinytext' => 1, 'mediumtext' => 1, 'text' => 1, 'longtext' => 1,
'binary' => 1, 'varbinary' => 1,
'tinyblob' => 1, 'blob' => 1, 'mediumblob' => 1, 'longblob' => 1);
// Get all tables
$tablesResult = $this->query('SHOW FULL TABLES;');
$allTables = array();
while ($tablesRow = $this->fetchRow($tablesResult)) {
$tablesRows[] = $tablesRow;
}
foreach ($tablesRows as $tablesRow) {
// Report tables that does not begin with the Wordpress prefix
$table = $tablesRow[0];
if ($tablesRow[1] === 'SEQUENCE') { // MariaDB sequence
continue;
}
if (!empty($config['prefix']) && 0 !== strncmp($table, $config['prefix'], strlen($config['prefix'])) &&
!isset($_GET['dump'])) {
printMsg("\nWARN: Table " . $table . ' does not start with prefix ' .
$config['prefix'] . ';', ' whitelists and CMS-specific rules will not work for this table');
}
$allTables[$table] = array();
// Get all columns
$columnsResult = $this->query('SHOW COLUMNS FROM ' . $this->escapeName($table) . ';', true);
if ($columnsResult === false) {
printMsg("\nWARN: Failed to list columns for " . $table);
continue;
}
$uniqueString = null;
$compositePrimary = false;
$compositeKeys = array();
while ($columnsRow = $this->fetchAssoc($columnsResult)) {
$type = $columnsRow['Type'];
$pos = strpos($type, "(");
if ($pos !== false) {
$type = substr($type, 0, $pos);
}
if (strtoupper($columnsRow['Key']) === 'PRI') {
if (isset($allTables[$table]['idname'])) {
$compositePrimary = true;
}
if ($withCompositeKeys) {
$compositeKeys[] = $columnsRow['Field'];
}
$allTables[$table]['idname'] = $columnsRow['Field'];
}
$type = strtolower(trim($type));
if (!isset($scannedTypes[$type])) {
continue;
}
// Prefer unique string keys to display wp_options.option_name instead of the numeric ID
if (strtoupper($columnsRow['Key']) === 'UNI') {
$uniqueString = $columnsRow['Field'];
}
$allTables[$table][] = $columnsRow['Field'];
}
if ($uniqueString !== null) {
$allTables[$table]['idname'] = $uniqueString;
} elseif ($withCompositeKeys && count($compositeKeys) > 1) {
/* return idname as an array of primary keys */
$allTables[$table]['idname'] = $compositeKeys[0];
//patch to attempt to fix composite keys index in drupal table field_data_body and others
if($allTables[$table]['idname'] == 'entity_type'){
$allTables[$table]['idname'] = 'entity_id';
}
} elseif ($compositePrimary) { // Disable the cleanup for composite primary keys and no primary key
unset($allTables[$table]['idname']);
}
}
return $allTables;
}
function getColumnNamesTypes($table)
{
$columnsResult = $this->query('SHOW COLUMNS FROM ' . $this->escapeName($table) . ';');
$binaryTypes = array('binary' => 1, 'varbinary' => 1,
'tinyblob' => 1, 'blob' => 1, 'mediumblob' => 1, 'longblob' => 1);
$numericTypes = array('tinyint' => 1, 'smallint' => 1, 'mediumint' => 1,
'int' => 1, 'integer' => 1, 'bigint' => 1,
'decimal' => 1, 'dec' => 1, 'numeric' => 1, 'fixed' => 1,
'float' => 1, 'real' => 1, 'double' => 1, 'double precision' => 1);
$names = array();
$types = array();
while ($columnsRow = $this->fetchAssoc($columnsResult)) {
$names[] = $columnsRow['Field'];
$type = $columnsRow['Type'];
$pos = strpos($type, "(");
if ($pos !== false) {
$type = substr($type, 0, $pos);
}
$type = strtolower(trim($type));
if (isset($numericTypes[$type])) {
$types[] = 'num';
} elseif (isset($binaryTypes[$type])) {
$types[] = 'bin';
} elseif ($type === 'bit') {
$types[] = 'bit';
} else {
$types[] = 'other';
}
}
return array($names, $types);
}
function exportRow($row, $types)
{
for ($i = 0; $i < count($row); $i++) {
if ($row[$i] === null) {
$row[$i] = 'NULL';
} elseif ($types[$i] === 'bin') {
// Story binary data as hex to avoid encoding problems
$row[$i] = 'UNHEX(' . $this->escapeStr(bin2hex($row[$i])) . ')';
} elseif ($types[$i] === 'bit') {
// TODO: tests under PHP 4
// See https://stackoverflow.com/questions/15106985/
$row[$i] = "b'" . decbin($row[$i]) . "'";
} elseif ($types[$i] === 'num') {
$row[$i] = (string)$row[$i];
} else {
$row[$i] = $this->escapeStr($row[$i]);
}
}
return implode(', ', $row);
}
function getCreateTableSql($table)
{
$res = $this->query('SHOW CREATE TABLE ' . $this->escapeName($table) . ';');
$row = $this->fetchRow($res);
if (!$row) {
exit('Unexpected empty result from SHOW CREATE TABLE');
}
return $row[1] . ";\n\n";
}
function getCreateDBSql($db)
{
$res = $this->query('SHOW CREATE DATABASE ' . $this->escapeName($db) . ';');
$row = $this->fetchRow($res);
if (!$row) {
exit('Unexpected empty result from SHOW CREATE DATABASE');
}
return $row[1] . ";\nUSE " . $this->escapeName($db) . ";\n\n";
}
function getDumpHeader()
{
return
"SET NAMES 'utf8';\n" .
"SET sql_mode='NO_AUTO_VALUE_ON_ZERO,ANSI_QUOTES,STRICT_TRANS_TABLES';\n" .
"SET foreign_key_checks=0;\n";
}
function setModes()
{
$this->query("SET NAMES 'utf8';");
$this->query("SET sql_mode='PIPES_AS_CONCAT,IGNORE_SPACE," .
"NO_AUTO_VALUE_ON_ZERO,ANSI_QUOTES,STRICT_TRANS_TABLES';");
}
function queryLowMemory($sql, $forceResReturn = false)
{
return $this->query($sql, $forceResReturn);
}
}
class MySQLDriver extends MySQLCommon
{
var $link;
function connect($config)
{
// Connect to DB
$host = $config['host'];
if (isset($config['port'])) {
$host .= ':' . $config['port'];
}
$this->link = @mysql_connect($host, $config['user'], $config['pass']);
if ($this->link === false) {
return 'Could not connect to MySQL database: ' . mysql_error();
}
mysql_select_db($config['db'], $this->link);
$this->setModes();
return true;
}
function disconnect()
{
mysql_close($this->link);
}
function escapeStr($str)
{
return "'" . mysql_real_escape_string($str, $this->link) . "'";
}
function query($sql, $forceResReturn = false)
{
global $isPlainText;
$res = mysql_query($sql, $this->link);
if (!$res) {
if ($forceResReturn === true) {
return $res;
}
$error = mysql_error($this->link);
if (!$isPlainText) {
$error = '<b>' . escapeHtml($error) . '</b>';
}
echo "\n" . escapeHtml(substr($sql, 0, 100)) . ' -- ' . $error . "\n";
exit(1);
}
return $res;
}
function fetchAssoc($res)
{
$row = mysql_fetch_assoc($res);
if (false === $row) {
mysql_free_result($res);
}
return $row;
}
function fetchRow($res)
{
$row = mysql_fetch_row($res);
if (false === $row) {
mysql_free_result($res);
}
return $row;
}
function getAffectedRows()
{
return mysql_affected_rows($this->link);
}
function getName()
{
return 'MySQL database';
}
}
class MySQLIDriver extends MySQLCommon
{
var $link;
function connect($config)
{
// Connect to DB
$port = isset($config['port']) ? $config['port'] : null;
$this->link = @mysqli_connect($config['host'], $config['user'], $config['pass'], $config['db'], $port);
if ($this->link === false) {
return 'Could not connect to MySQLi database: ' . mysqli_connect_error();
}
$this->setModes();
return true;
}
function disconnect()
{
mysqli_close($this->link);
}
function escapeStr($str)
{
return "'" . mysqli_real_escape_string($this->link, $str) . "'";
}
function query($sql, $forceResReturn = false)
{
global $isPlainText;
$res = mysqli_query($this->link, $sql);
if (!$res) {
if ($forceResReturn === true) {
return $res;
}
$error = mysqli_error($this->link);
if (!$isPlainText) {
$error = '<b>' . escapeHtml($error) . '</b>';
}
echo "\n" . escapeHtml(substr($sql, 0, 100)) . ' -- ' . $error . "\n";
exit(1);
}
return $res;
}
function fetchAssoc($res)
{
$row = mysqli_fetch_assoc($res);
if (false === $row) {
mysqli_free_result($res);
}
return $row;
}
function fetchRow($res)
{
$row = mysqli_fetch_row($res);
if (false === $row) {
mysqli_free_result($res);
}
return $row;
}
function getAffectedRows()
{
return mysqli_affected_rows($this->link);
}
function getName()
{
return 'MySQLi database';
}
}
/**
* Class MySQLIDriverLowMemory
*
* This object consumes less memory when querying the database, but
* be aware that you cannot keep results in memory without using
* them first in a loop or cleaning them with mysqli_free_result
*
*/
class MySQLIDriverLowMemory extends MySQLIDriver
{
function queryLowMemory($sql, $forceResReturn = false)
{
global $isPlainText;
mysqli_store_result($this->link);
if ($forceResReturn) {
$res = mysqli_query($this->link, $sql);
} else {
mysqli_real_query($this->link, $sql);
$res = mysqli_use_result($this->link);
}
if (!$res) {
if ($forceResReturn === true) {
return $res;
}
$error = mysqli_error($this->link);
if ($error !== '') {
if (!$isPlainText) {
$error = '<b>' . escapeHtml($error) . '</b>';
}
echo "\n" . escapeHtml(substr($sql, 0, 100)) . ' -- ' . $error . "\n";
exit(1);
}
}
return $res;
}
}
// ======================================================
// Read CMS configuration
/**
* Returns the credentials to connect to a WordPress database.
*
* @param string $lines Content of the configuration file.
* @return array Credentials to connect to the database.
*/
function readWordPressConfig($lines)
{
return array(
'host' => getOption('DB_HOST', $lines, OPT_TYPE_CONST | OPT_TYPE_ENV),
'user' => getOption('DB_USER', $lines, OPT_TYPE_CONST),
'pass' => getOption('DB_PASSWORD', $lines, OPT_TYPE_CONST),
'db' => getOption('DB_NAME', $lines, OPT_TYPE_CONST),
'prefix' => getOption('$table_prefix', $lines, OPT_TYPE_VAR),
);
}
/**
* Returns the credentials to connect to a Magento1 database.
*
* @param string $lines Content of the configuration file.
* @return array Credentials to connect to the database.
*/
function readMagento1Config($lines)
{
return array(
'host' => getOption('host', $lines, OPT_TYPE_XML),
'user' => getOption('username', $lines, OPT_TYPE_XML),
'pass' => getOption('password', $lines, OPT_TYPE_XML),
'db' => getOption('dbname', $lines, OPT_TYPE_XML),
'prefix' => getOption('table_prefix', $lines, OPT_TYPE_XML),
);
}
/**
* Returns the credentials to connect to a Magento2 database.
*
* @param string $lines Content of the configuration file.
* @return array Credentials to connect to the database.
*/
function readMagento2Config($lines)
{
return array(
'host' => getOption('host', $lines, OPT_TYPE_ASSOC),
'user' => getOption('username', $lines, OPT_TYPE_ASSOC),
'pass' => getOption('password', $lines, OPT_TYPE_ASSOC),
'db' => getOption('dbname', $lines, OPT_TYPE_ASSOC),
'prefix' => getOption('table_prefix', $lines, OPT_TYPE_ASSOC),
);
}
/**
* Returns the credentials to connect to a Drupal database.
*
* @param string $lines Content of the configuration file.
* @return array Credentials to connect to the database.
*/
function readDrupalConfig($lines)
{
return array(
'host' => getOption('host', $lines, OPT_TYPE_ASSOC | OPT_TYPE_FIRST),
'user' => getOption('username', $lines, OPT_TYPE_ASSOC | OPT_TYPE_FIRST),
'pass' => getOption('password', $lines, OPT_TYPE_ASSOC | OPT_TYPE_FIRST),
'db' => getOption('database', $lines, OPT_TYPE_ASSOC | OPT_TYPE_FIRST),
'prefix' => getOption('prefix', $lines, OPT_TYPE_ASSOC | OPT_TYPE_FIRST),
);
}
/**
* Returns the credentials to connect to a Joomla database.
*
* @param string $lines Content of the configuration file.
* @return array Credentials to connect to the database.
*/
function readJoomlaConfig($lines)
{
return array(
'host' => getOption('$host', $lines, OPT_TYPE_VAR),
'user' => getOption('$user', $lines, OPT_TYPE_VAR),
'pass' => getOption('$password', $lines, OPT_TYPE_VAR),
'db' => getOption('$db', $lines, OPT_TYPE_VAR),
'prefix' => getOption('$dbprefix', $lines, OPT_TYPE_VAR),
);
}
/**
* Returns the credentials to connect to a Vbulletin database.
*
* @param string $lines Content of the configuration file.
* @return array Credentials to connect to the database.
*/
function readVbulletinConfig($lines)
{
// https://www.vbulletin.com/docs/html/main/install_core_config_php
return array(
'host' => getOption("\$config['MasterServer']['servername']", $lines, OPT_TYPE_VAR),
'user' => getOption("\$config['MasterServer']['username']", $lines, OPT_TYPE_VAR),
'pass' => getOption("\$config['MasterServer']['password']", $lines, OPT_TYPE_VAR),
'db' => getOption("\$config['Database']['dbname']", $lines, OPT_TYPE_VAR),
'port' => getOption("\$config['MasterServer']['port']", $lines, OPT_TYPE_VAR),
'prefix' => getOption("\$config['Database']['tableprefix']", $lines, OPT_TYPE_VAR),
);
}
/**
* Returns the credentials to connect to a PrestaShop database.
*
* @param string $lines Content of the configuration file.
* @return array Credentials to connect to the database.
*/
function readPrestaShopConfig($lines)
{
$lines = explode("\n", $lines);
$dbconfig = array();
foreach ($lines as $line) {
preg_match('/^[^#]\s+([\'"])(.*)\1\s+=>\s+([\'"])(.*)\3/', $line, $matches);
$key = isset($matches[2]) ? $matches[2] : null;
$value = isset($matches[4]) ? $matches[4] : null;
if (isset($key) && isset($value)) {
$dbconfig[$key] = $value;
}
}
$admin_profile_config = '.' . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'defines.inc.php';
$apc_lines = file_get_contents($admin_profile_config);
$admin_profile_num = getOption('_PS_ADMIN_PROFILE_', $apc_lines, OPT_TYPE_CONST_NUM);
return array(
'host' => $dbconfig['database_host'],
'user' => $dbconfig['database_user'],
'pass' => $dbconfig['database_password'],
'db' => $dbconfig['database_name'],
'prefix' => $dbconfig['database_prefix'],
'admin_id' => $admin_profile_num,
);
}
/**
* Returns the credentials to connect to a PrestaShop database (versions 1.6 and lower).
*
* @param string $lines Content of the configuration file.
* @return array Credentials to connect to the database.
*/
function readPrestaShopConfigOld($lines)
{
if (is_array($lines)) {
$lines = implode("\n", $lines);
}
$admin_profile_config = '.' . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'defines.inc.php';
$apc_lines = file_get_contents($admin_profile_config);
$admin_profile_num = getOption('_PS_ADMIN_PROFILE_', $apc_lines, OPT_TYPE_CONST_NUM);
return array(
'host' => getOption('_DB_SERVER_', $lines, OPT_TYPE_CONST | OPT_TYPE_ENV),
'user' => getOption('_DB_USER_', $lines, OPT_TYPE_CONST),
'pass' => getOption('_DB_PASSWD_', $lines, OPT_TYPE_CONST),
'db' => getOption('_DB_NAME_', $lines, OPT_TYPE_CONST),
'prefix' => getOption('_DB_PREFIX_', $lines, OPT_TYPE_CONST),
'admin_id' => $admin_profile_num,
'old' => true,
);
}
/**
* Returns the credentials to connect to a OsCommerce database.
*
* @param string $lines Content of the configuration file.
* @return array Credentials to connect to the database.
*/
function readOsCommerceConfig($lines)
{
return array(
'host' => getOption('DB_SERVER', $lines, OPT_TYPE_CONST | OPT_TYPE_ENV),
'user' => getOption('DB_SERVER_USERNAME', $lines, OPT_TYPE_CONST),
'pass' => getOption('DB_SERVER_PASSWORD', $lines, OPT_TYPE_CONST),
'db' => getOption('DB_DATABASE', $lines, OPT_TYPE_CONST),
'prefix' => getOption('DB_PREFIX', $lines, OPT_TYPE_CONST),
);
}
/**
* Returns the credentials to connect to a MODX database.
*
* @param string $lines Content of the configuration file.
* @return array Credentials to connect to the database.
*/
function readMODXConfig($lines)
{
return array(
'host' => getOption('$database_server', $lines, OPT_TYPE_VAR),
'user' => getOption('$database_user', $lines, OPT_TYPE_VAR),
'pass' => getOption('$database_password', $lines, OPT_TYPE_VAR),
'db' => getOption('$dbase', $lines, OPT_TYPE_VAR),
'prefix' => getOption('$table_prefix', $lines, OPT_TYPE_VAR),
);
}
/**
* Returns the credentials to connect to a OpenCart database.
*
* @param string $lines Content of the configuration file.
* @return array Credentials to connect to the database.
*/
function readOpenCartConfig($lines)
{
return array(
'host' => getOption('DB_HOSTNAME', $lines, OPT_TYPE_CONST | OPT_TYPE_ENV),
'user' => getOption('DB_USERNAME', $lines, OPT_TYPE_CONST),
'pass' => getOption('DB_PASSWORD', $lines, OPT_TYPE_CONST),
'db' => getOption('DB_DATABASE', $lines, OPT_TYPE_CONST),
'prefix' => getOption('DB_PREFIX', $lines, OPT_TYPE_CONST),
);
}
/**
* Returns the credentials to connect to a PhpBB database.
*
* @param string $lines Content of the configuration file.
* @return array Credentials to connect to the database.
*/
function readPhpBBConfig($lines)
{
return array(
'host' => getOption('$dbhost', $lines, OPT_TYPE_VAR),
'user' => getOption('$dbuser', $lines, OPT_TYPE_VAR),
'pass' => getOption('$dbpasswd', $lines, OPT_TYPE_VAR),
'db' => getOption('$dbname', $lines, OPT_TYPE_VAR),
'prefix' => getOption('$table_prefix', $lines, OPT_TYPE_VAR),
);
}
/**
* Returns the credentials to connect to a Laravel/Symfony database.
*
* @param string $lines Content of the configuration file.
* @return array Credentials to connect to the database.
*/
function readSymfLaravelConfig($lines)
{
return array(
'host' => getOption('DB_HOST', $lines, OPT_TYPE_PHPDOTENV),
'user' => getOption('DB_USERNAME', $lines, OPT_TYPE_PHPDOTENV),
'pass' => getOption('DB_PASSWORD', $lines, OPT_TYPE_PHPDOTENV),
'db' => getOption('DB_NAME', $lines, OPT_TYPE_PHPDOTENV),
'prefix' => '',
);
}
/**
* Returns the website configuration.
*
* @param string $dir Directory where the website is installed.
* @return array|bool Website configuration or false on failure.
*/
function getCMSConfigInDir($dir)
{
global $config;
$cmses = array(
'sucuri_db_clean.php' => array( 'sucuri_db_clean.php', 'readWordPressConfig' ),
'wp-config.php' => array( 'WordPress', 'readWordPressConfig' ),
'configuration.php' => array( 'Joomla', 'readJoomlaConfig' ),
'sites/default/settings.php' => array( 'Drupal', 'readDrupalConfig' ),
'app/etc/local.xml' => array( 'Magento1', 'readMagento1Config' ),
'app/etc/env.php' => array( 'Magento2', 'readMagento2Config' ),
'includes/config.php' => array( 'vBulletin', 'readVbulletinConfig' ), // vBulletin 4
'core/includes/config.php' => array( 'vBulletin', 'readVbulletinConfig' ), // vBulletin 5 and higher
'config/settings.inc.php' => array( 'PrestaShop', 'readPrestaShopConfigOld' ), // Older prestashop
'app/config/parameters.php' => array( 'PrestaShop', 'readPrestaShopConfig' ),
'includes/configure.php' => array( 'osCommerce', 'readOsCommerceConfig' ),
'core/config/config.inc.php' => array( 'MODX', 'readMODXConfig' ),
'admin/config.php' => array( 'OpenCart', 'readOpenCartConfig' ),
'config.php' => array( 'phpBB', 'readPhpBBConfig' ),
'.env' => array( 'laravel/Symfony', 'readSymfLaravelConfig' ),
);
if (isset($_GET['noise'])) {
printMsg("Checking config in " . $dir . "\n");
}
// Detect the CMS
foreach ($cmses as $filename => $cmsArray) {
if (!is_readable($dir . $filename)) {
continue;
}
list($cmsName, $configFunc) = $cmsArray;
$config = call_user_func($configFunc, file_get_contents($dir . $filename));
// At least these parameters must be present in the config file;
// the prefix, the port number, and the password can be empty
if ($config['host'] && $config['db'] && $config['user']) {
$config['cms'] = $cmsName;
if (preg_match('/:([0-9]+)$/', $config['host'], $matches)) {
$config['host'] = substr($config['host'], 0, -strlen($matches[0]));
$config['port'] = $matches[1];
}
if (!isset($_GET['dump'])) {
printMsg($cmsName . " detected. Config file: $dir$filename");
if (!$GLOBALS['isPlainText']) {
echo(' <a href="sucuri-cleanup.php?srun&new&seefile=' . base64_encode($dir . $filename) . '" target="_blank">' .
'<span class="inserted" data-content="show content"></span></a>');
}
}
return $config;
} else {
printMsg("INFO: not found DB config in $dir$filename\n");
}
}
return false;
}
/**
* Returns the website configuration.
*
* The function searches for the configuration file in the current directory,
* then the parent directory, then in every directory that is under the current
* location. Once it finds it, it immediately returns the information contained
* in the file.
*
* @return array|bool|null Website configuration or false on failure.
*/
function getCMSConfig()
{
if (isset($_GET['dir'])) {
$scan_dir = $_GET['dir'];
$config = getCMSConfigInDir($scan_dir . DIRECTORY_SEPARATOR);
return $config;
}
else{
// Check . and .. first because readdir() can return them after the other directories
$config = getCMSConfigInDir('.' . DIRECTORY_SEPARATOR);
if ($config) {
return $config;
}
$config = getCMSConfigInDir('..' . DIRECTORY_SEPARATOR);
if ($config) {
return $config;
}
$dh = opendir('.');
if (!$dh) {
return null;
}
while (false !== ($fileName = @readdir($dh))) {
if (!is_dir($fileName) || $fileName === '.' || $fileName === '..') {
continue;
}
$config = getCMSConfigInDir($fileName . DIRECTORY_SEPARATOR);
if ($config) {
closedir($dh);
return $config;
}
}
closedir($dh);
echo "ERROR: Unable to complete. Missing config file\n\n";
return null;
}
}
/**
* Creates a file with the website configuration.
*
* If the script is not able to find the file with the website configuration,
* this function can be used to create a temporary file that will be used to
* expose the necessary data in order to connect to the database and proceed
* with the rest of the operations.
*
* @param array $config Website configuration.
* @return void
*/
function createConfigFile($config)
{
$contents = "<?php
define( 'DB_NAME', '" . addslashes($config['dbname']) . "' );
define( 'DB_USER', '" . addslashes($config['dbuser']) . "' );
define( 'DB_PASSWORD', '" . addslashes($config['dbpass']) . "' );
define( 'DB_HOST', '" . addslashes($config['dbhost']) . "' );
\$table_prefix = '" . addslashes($config['prefix']) . "';
\$cms = '" . addslashes($config['cms']) . "';
";
$fh = fopen('sucuri_db_clean.php', 'wb');
if ($fh === false || false === fwrite($fh, $contents)) {
reportFatalError('Unable to store file: sucuri_db_clean.php');
}
fclose($fh);
echo "Successfully stored file: sucuri_db_clean.php\n";
}
/**
* Prints a message into the command line and waits for user input.
*
* @param string $prompt Text to act as the command line prompt.
* @param string $default Default value in case of no user input.
* @return string User input.
*/
function askFromCmdLine($prompt, $default = '')
{
if ($default) {
echo $prompt . ' (press Enter for ' . $default . '): ';
} else {
echo $prompt . ': ';
}
$ret = trim(fgets(STDIN));
if ($ret === '') {
return $default;
}
return $ret;
}
/**
* Displays a form to create a custom configuration file.
*
* If the script is executed over a web interface, the script will print a form
* with fields asking for the information that will be used to connect with the
* database associated to the website. However, if the script is being executed
* over a command line interface, the script will ask for the same information
* using command prompts.
*
* @return void
*/
function doDbConfig()
{
if (isTerminal()) {
$config = array();
$config['dbname'] = askFromCmdLine('Database name');
$config['dbuser'] = askFromCmdLine('Username', $config['dbname']);
$config['dbpass'] = askFromCmdLine('Password');
$config['dbhost'] = askFromCmdLine('Host', '127.0.0.1');
$cmses = array('WordPress' => 1, 'Joomla' => 1, 'Magento' => 1, 'vBulletin' => 1, 'Drupal' => 1);
do {
$config['cms'] = askFromCmdLine('CMS (one of WordPress, Joomla, Magento, vBulletin, or Drupal)', 'WordPress');
} while (!isset($cmses[$config['cms']]));
if ($config['cms'] === 'WordPress') {
$defaultPrefix = 'wp_';
} elseif ($config['cms'] === 'Magento') {
$defaultPrefix = 'mg_';
} else {
$defaultPrefix = '';
}
$config['prefix'] = askFromCmdLine('Prefix', $defaultPrefix);
createConfigFile($config);
return;
}
if (isset($_POST['createconfig'])) {
if (!isset($_POST['dbname'])
|| !isset($_POST['dbuser'])
|| !isset($_POST['dbpass'])
|| !isset($_POST['dbhost'])
|| !isset($_POST['prefix'])
) {
reportFatalError('No DB params');
}
if (get_magic_quotes_gpc()) {
$_POST['dbname'] = stripslashes($_POST['dbname']);
$_POST['dbuser'] = stripslashes($_POST['dbuser']);
$_POST['dbpass'] = stripslashes($_POST['dbpass']);
$_POST['dbhost'] = stripslashes($_POST['dbhost']);
$_POST['prefix'] = stripslashes($_POST['prefix']);
}
createConfigFile($_POST);
echo '<a href="?srun">Scan the database</a>';
exit;
}
echo "Setup sucuri_db_clean.php with custom DB credentials (WARNING: THIS WILL OVERRIDE ANY CURRENT FILE):\n";
echo '<form method="post" action="">';
echo '<scr' . 'ipt type="text/javascript"><!--' . "\n";
echo 'function onChangeCms() {' . "\n";
echo 'var prefix = ["wp_", "", "mg_", "", ""];' . "\n";
echo 'document.getElementById("prefix").value = prefix[document.getElementById("cms").selectedIndex];' . "\n";
echo "}\n";
echo '--></script>';
echo '<input type="hidden" name="createconfig" value="myconfig" />';
echo "Database:\t" . '<input type="text" name="dbname" value="">' . "\n";
echo "Username:\t" . '<input type="text" name="dbuser" value="">' . "\n";
echo "Password:\t" . '<input type="text" name="dbpass" value="">' . "\n";
echo "Host:\t\t" . '<input type="text" name="dbhost" value="localhost">' . "\n";
echo "CMS:\t\t" . '<select name="cms" id="cms" onchange="onChangeCms()">' .
'<option selected>WordPress</option><option>Joomla</option>' .
'<option>Magento</option><option>vBulletin</option><option>Drupal</option></select>' . "\n";
echo "Prefix:\t\t" . '<input type="text" name="prefix" id="prefix" value="wp_">' . "\n";
echo '<input type="submit" name="submit" value="Save file" />';
echo '</form>';
exit;
}
/**
* Allows to edit a database column manually.
*
* This function renders a HTML form that allows to edit the content of one or
* more rows in a specific table in the database. The form sends old_content and
* row_content which are used to search and replace the content of a table.
*
* @param MySQLIDriver $driver Database connection.
* @param string $table Name of the table.
* @param string $column Name of the column.
* @param string $idName Name of the primary key column.
* @param array $id List of identifiers for the primary key column.
* @return void
*/
function showContent($driver, $table = '', $column = '', $idName = '', $id = array())
{
$location = array('table' => $table, 'column' => $column, 'idname' => $idName, 'id' => $id);
$updateRes = false;
if (isset($_POST['row_content']) && isset($_POST['old_content'])) {
if (get_magic_quotes_gpc()) {
$_POST['row_content'] = stripslashes($_POST['row_content']);
}
$old_content = base64_decode($_POST['old_content']);
$updateRes = updateDb($driver, $_POST['row_content'], $old_content, $location, 'manual');
}
$sqlContent = 'SELECT ' . $driver->escapeName($column) . ' FROM ' . $driver->escapeName($table) .
' WHERE ' . $driver->escapeName($idName) . ' = ' . $driver->escapeStr($id) . ';';
$row = $driver->fetchRow($driver->query($sqlContent));
$dir = '';
if (isset($_GET['dir'])) {
$dir = '&dir=' . $_GET['dir'];
}
// Exclude match_start/match_end from the link: after editing, there should be no selection
$link = '?srun&showcontent&t=' . escapeHTML($table) . '&c=' . escapeHTML($column) .
'&id_name=' . escapeHTML($idName) . '&id=' . escapeHTML($id) . $dir;
echo '<form method="post" action="' . $link . '">';
echo '<input type="hidden" name="old_content" value="' . base64_encode($row[0]) . '">';
echo getLocationHTML($location, 'plaintext');
$compoundRe = '/^ (?:
a : (?P<count> [0-9]+) : \\{
| (?P<type> [OC]) : (?P<namelen> [0-9]+) : "(?P<name> [^"]+)" : (?P<clen> [0-9]+) : \\{
) /x';
if (preg_match($compoundRe, $row[0])) {
echo ' - THIS STRING IS SERIALIZED! Please use <a href="?srun&s"><b>search and replace</b></a> instead!';
} else {
echo ' - <input type="submit" name="submit" value="Update Content" />';
}
echo '<div style="float:right"><a href="?srun&s">Global search and replace</a></div>';
showUpdateDbError($updateRes);
if ($updateRes === true) {
echo "\n" . '<span class="cleared">Updated</span>';
}
echo "\n\n" . '<textarea id="row_content" name="row_content" style="margin: 2px; height: 85%; width: 100%">';
echo escapeHTML($row[0]);
echo "</textarea></form>";
if (isset($_GET['match_start']) && isset($_GET['match_end'])) {
// Highlight the matching text
$match_start = intval($_GET['match_start']);
$match_end = intval($_GET['match_end']);
echo '<scr' . 'ipt type="text/javascript"><!--' . "\n";
echo 'document.getElementById("row_content").setSelectionRange(' . $match_start . ',' . $match_end . ');';
echo 'document.getElementById("row_content").focus();';
echo "\n--></script>";
}
$driver->disconnect();
exit;
}
function showRow($driver, $table, $idName, $id)
{
$location = array('table' => $table, 'idname' => $idName, 'id' => $id);
$updateRes = false;
if (isset($_POST['delete_row'])) {
list($res, $out) = deleteRowsFromDb($driver, $location, $driver->escapeName($idName) . ' = ' . $driver->escapeStr($id));
showUpdateDbError($res);
echo $out;
$driver->disconnect();
exit;
}
list($columns, $types) = $driver->getColumnNamesTypes($location['table']);
$sqlContent = 'SELECT * FROM ' . $driver->escapeName($table) .
' WHERE ' . $driver->escapeName($idName) . ' = ' . $driver->escapeStr($id) . ';';
$row = $driver->fetchRow($driver->query($sqlContent));
echo '<h2>' . escapeHTML($table) . '</h2>';
echo '<table border="1" cellpadding="4" cellspacing="0"><tr>';
for ($i = 0; $i < count($columns); $i++) {
echo '<td>' . escapeHTML($columns[$i]) . '</td>';
}
echo '</tr><tr>';
for ($i = 0; $i < count($columns); $i++) {
echo '<td>' . escapeHTML($row[$i]) . '</td>';
}
echo '</tr></table>';
echo '<br><form method="post"><input type="submit" name="delete_row" value="Delete this row" /></form>';
$driver->disconnect();
exit;
}
/**
* Detects the CMS type and prints a list of admin users from the database.
*
* @option skip-listusers Skips the execution of the database user list printer.
*
* @return void
*/
function maybePrintUserList()
{
global $config;
if (isset($_GET['skip-listusers'])
|| isset($_GET['s'])
|| isset($_GET['dump'])
|| isset($_GET['restore'])
|| isset($_GET['showcontent'])
) {
return;
}
printMsg("\n\nList of Administrator users:\n");
switch ($config['cms']) {
case 'WordPress':
listUsersFromWordpress();
break;
case 'Joomla':
listUsersFromJoomla();
break;
case 'Drupal':
listUsersFromDrupal($dir . DIRECTORY_SEPARATOR . $filename);
break;
case 'Magento1':
case 'Magento2':
listUsersFromMagento(realpath(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'app' . DIRECTORY_SEPARATOR . 'Mage.php');
break;
case 'vBulletin':
listUsersFromVbulletin($dir . DIRECTORY_SEPARATOR . $filename);
break;
case 'PrestaShop':
listUsersFromPrestashop();
break;
case 'osCommerce':
listUsersFromOscommerce($dir . DIRECTORY_SEPARATOR . $filename);
break;
case 'MODX':
listUsersFromModx($dir . DIRECTORY_SEPARATOR . $filename);
break;
case 'OpenCart':
listUsersFromOpencart($dir . DIRECTORY_SEPARATOR . $filename);
break;
case 'phpBB':
listUsersFromPhpbb($dir . DIRECTORY_SEPARATOR . $filename);
break;
}
}
/**
* Prints a list of admin users from a WordPress website.
*
* @return void
*/
function listUsersFromWordpress()
{
global $config, $driver;
$sqlContent = "SELECT " . $config['prefix'] . "users.*
FROM " . $config['prefix'] . "users
INNER JOIN " . $config['prefix'] . "usermeta ON ( " . $config['prefix'] . "users.ID = " . $config['prefix'] . "usermeta.user_id )
WHERE 1=1
AND ( ( ( " . $config['prefix'] . "usermeta.meta_key = '" . $config['prefix'] . "capabilities'
AND " . $config['prefix'] . "usermeta.meta_value LIKE '%\"Administrator\"%' ) ) )
ORDER BY ID ASC";
$result = $driver->query($sqlContent);
$users = array();
$users = array();
while ($row = $result->fetch_array()) {
$users[] = $row;
}
$usersPosts = array();
if (isset($_GET["count_user_posts"])) {
$usersIDs = "";
$totalUsers = count($users);
for ($i = 0; $i < $totalUsers; $i++) {
$usersIDs .= " OR u.ID = " . $users[$i]["ID"];
}
$sqlCountUsersPosts = "SELECT u.ID, COUNT(p.post_author) AS count " .
"FROM " . $config['prefix'] . "users AS u " .
"LEFT JOIN " . $config['prefix'] . "posts AS p ON u.ID = p.post_author " .
"WHERE 1=1 " . $usersIDs .
" GROUP BY u.ID";
$resultUsersPosts = $driver->query($sqlCountUsersPosts);
while ($row = $resultUsersPosts->fetch_array()) {
$usersPosts[$row["ID"]] = $row["count"];
}
}
foreach ($users as $user) {
printf(
"ID: %d, Username: %s, E-mail: %s, Creation Date: %s\n",
$user["ID"],
$user["user_login"],
$user["user_email"],
$user["user_registered"]
);
}
}
/**
* Prints a list of admin users from a Joomla website.
*
* @return bool True if the website is built on top of Joomla.
*/
function listUsersFromJoomla()
{
global $config, $driver;
$query = "SELECT u.id, u.username
FROM `" . $config['prefix'] . "usergroups` us, `" . $config['prefix'] . "users` u,
`" . $config['prefix'] . "user_usergroup_map` uum
WHERE us.id = uum.group_id AND uum.user_id = u.id
AND `title` IN ('Super Users', 'Administrator', 'Super Administrator')";
$result = $driver->query($query, true);
if ($result === false) {
$query = "SELECT u.id, u.username FROM `" . $config['prefix'] . "users` u WHERE u.usertype = 'Super Administrator'";
$result = $driver->query($query);
}
if (!$result) {
/**
* Return True no matter if this operation failed.
*
* This guarantees that the calls for other listUsers methods will stop
* as at this point we already know that the website is built on top of
* the Joomla CMS, considering that the framework library is available.
*/
return true;
}
$users = array();
while ($row = $result->fetch_array()) {
$users[] = $row;
}
foreach ($users as $row) {
printf("ID: %d, Username: %s\n", $row['id'], $row['username']);
}
return true;
}
/**
* Prints a list of admin users from a Magento website.
*
* @param string $config Location of the configuration file.
* @return bool True if the website is built on top of Magento.
*/
function listUsersFromMagento($config)
{
define('MAGENTO', realpath(dirname(__FILE__)));
if (file_exists($config)) {
include_once $config;
}
if (!class_exists('Mage')) {
return false;
}
Mage::app();
$app = Mage::app();
umask(0);
Mage::app('default');
Mage::getSingleton('core/session', array('name' => 'adminhtml'));
$users = Mage::getResourceModel('admin/roles_user_collection');
foreach ($users as $roleuser) {
$user = Mage::getModel('admin/user')->load($roleuser->getUserId());
printf("ID: %d, Username: %s\n", $roleuser->getUserId(), $user->getUsername());
}
return true;
}
/**
* Prints a list of admin users from a Vbulletin website.
*
* @param string $config Location of the configuration file.
* @return bool True if the website is built on top of Vbulletin.
*/
function listUsersFromVbulletin($config)
{
$vb_url = '';
$login_url = '';
if (file_exists($config)) {
define('VB_ENTRY', 'sucuri');
@chdir('core');
include_once $config;
@chdir('../');
if (!class_exists('vB')) {
return false;
}
$vb_options = vB::getDatastore()->getValue('options');
$login_url = $vb_options['frontendurl_login'];
$vb_url = VB_URL;
}
if (!isset($GLOBALS['vbulletin'])) {
return false; /* not a vbulletin site */
}
if (!$login_url && is_array($GLOBALS['vbulletin']->options)) {
$login_url = $GLOBALS['vbulletin']->options['bburl'];
}
if (!$vb_url && defined('VB_URL')) {
$vb_url = VB_URL;
}
if ($vb_url && $login_url) {
$parsed_vb_url = parse_url($vb_url);
$parsed_login_url = parse_url($login_url);
$new_url = array();
foreach ($parsed_vb_url as $k => $v) {
if ($k !== 'path' && isset($parsed_login_url[$k]) && $v !== $parsed_login_url[$k]) {
$new_url[$k] = $parsed_login_url[$k];
}
}
$new_url = array_merge($parsed_vb_url, $new_url);
$redir_url = vbulletinBuildURL($new_url);
if ($vb_url !== $redir_url) {
header('Location: ' . $redir_url);
exit(0);
}
}
$users = $GLOBALS['vbulletin']->db->query_read(
'SELECT * FROM ' . TABLE_PREFIX . 'user WHERE usertitle = "Administrator"'
);
while ($user = $GLOBALS['vbulletin']->db->fetch_array($users)) {
printf("ID: %d, Username: %s\n", $user['userid'], $user['username']);
}
$GLOBALS['vbulletin']->db->free_result($user);
return true;
}
/**
* Takes most output from parse_url.
*
* @param array $parsed_url Output from parse_url.
* @return string Formalize the output of parse_url.
*/
function vbulletinBuildURL($parsed_url)
{
$scheme = isset($parsed_url['scheme']) ? $parsed_url['scheme'] . '://' : '';
$host = isset($parsed_url['host']) ? $parsed_url['host'] : '';
$path = isset($parsed_url['path']) ? $parsed_url['path'] : '';
$query = isset($parsed_url['query']) ? '?' . $parsed_url['query'] : '';
$fragment = isset($parsed_url['fragment']) ? '#' . $parsed_url['fragment'] : '';
return $scheme . $host . $path . $query . $fragment;
}
/**
* Prints a list of admin users from a Drupal website.
*
* @param string $config Location of the configuration file.
* @return void
*/
function listUsersFromDrupal($config)
{
/* TODO: Implement function to print admin users from Drupal */
}
/**
* Prints a list of admin users from a Prestashop website.
*
* @return void
*/
function listUsersFromPrestashop()
{
global $config, $driver;
$query = "SELECT DISTINCT * FROM " . $config['prefix'] . "employee e " .
"JOIN " . $config['prefix'] . "access a " .
"ON e.id_profile = a.id_profile " .
"WHERE e.active = 1 ";
if (isset($config['admin_id'])) {
$role = $config['old'] ? 'id_tab' : 'id_authorization_role';
$query .= "AND a.$role = " . $config['admin_id'];
}
$result = $driver->query($query);
$admins = array();
while ($row = $driver->fetchAssoc($result)) {
$admins[] = $row;
}
if (!is_array($admins)) {
echo "Unable to get PrestaShop users..\n";
return;
}
foreach ($admins as $admin) {
printf(
"ID: %d, Username: %s, E-mail: %s\n",
$admin['id_employee'],
$admin['firstname'] . ' ' . $admin['lastname'],
$admin['email']
);
}
return;
}
/**
* Prints a list of admin users from a Oscommerce website.
*
* @param string $config Location of the configuration file.
* @return void
*/
function listUsersFromOscommerce($config)
{
/* TODO: Implement function to print admin users from Oscommerce */
}
/**
* Prints a list of admin users from a Modx website.
*
* @param string $config Location of the configuration file.
* @return void
*/
function listUsersFromModx($config)
{
/* TODO: Implement function to print admin users from Modx */
}
/**
* Prints a list of admin users from a Opencart website.
*
* @param string $config Location of the configuration file.
* @return void
*/
function listUsersFromOpencart($config)
{
/* TODO: Implement function to print admin users from Opencart */
}
/**
* Prints a list of admin users from a Phpbb website.
*
* @param string $config Location of the configuration file.
* @return void
*/
function listUsersFromPhpbb($config)
{
/* TODO: Implement function to print admin users from Phpbb */
}
/**
* Prints information about the database tables.
*
* The information includes the table structure and size.
*
* @option list Describes and analyzes the tables in the database.
*
* @param MySQLIDriver $driver Database connection.
* @param array $tablesColumns List of tables with their columns.
* @param array $config Application configuration.
* @return void
*/
function listTables($driver, $tablesColumns, $config)
{
$totalBlob = 0;
$entries = array();
foreach ($tablesColumns as $table => $columns) {
$uniqueid = '--'; /* empty */
$tableName = escapeHTML($table);
/* primary key or composite primary key */
if (array_key_exists('idname', $columns)) {
$uniqueid = $columns['idname'];
}
/* get number of rows in this table */
$sql = 'SELECT COUNT(*) AS total FROM ' . $driver->escapeName($table);
$res = $driver->query($sql, true);
if ($res === false) {
printMsg("\nWARN: Failed to access " . $table . "\n");
continue;
}
$res = $driver->fetchAssoc($res);
$rows = intval($res['total']);
$cols = count($columns);
/* implode column names and composite keys */
if (array_key_exists('idname', $columns)) {
$shortColumns = $columns;
unset($shortColumns['idname']);
$colsText = smartImplode($shortColumns, ",\x20");
} else {
$colsText = smartImplode($columns, ",\x20");
}
/**
* How much data the script needs to scan.
*
* We will multiply the number of rows against the number of columns on
* each database table. However, because the unique identifier for each
* table is usually safe (because it is almost always an integer) we
* will decrease the number of columns by one before the operation.
*
* @var int
*/
$usefulCols = ($cols > 0) ? ($cols - 1) : 0;
$blobSize = $rows * $usefulCols;
$totalBlob += $blobSize;
/* add link to skip table on browser */
if (!isTerminal()) {
$tableName = '<a target="_self" href="?srun&resume&noise&scantable='
. escapeHTML($table) . '">' . escapeHTML($table) . '</a>';
}
$entries[] = array(
'Table' => $tableName,
'ID' => escapeHTML($uniqueid),
'Rows' => $rows,
'Cols' => $cols,
'Blob' => $blobSize,
'Perc' => 0,
'Columns' => escapeHTML($colsText),
);
}
/**
* Append percentages to all database tables.
*/
foreach ($entries as $key => $data) {
if ($totalBlob <= 0) {
/* avoid impossible division by zero */
$entries[$key]['Perc'] = '0%';
continue;
}
$percentage = ($data['Blob'] * 100) / $totalBlob;
$entries[$key]['Perc'] = sprintf('%.2g%%', $percentage);
}
/**
* Setup ASCII table.
* @var TabularData
*/
$tabular = new TabularData();
$tabular->setTitle('Database Tables');
$tabular->addColumn('Table');
$tabular->addColumn('ID');
$tabular->addColumn('Rows');
$tabular->addColumn('Cols');
$tabular->addColumn('Blob');
$tabular->addColumn('Perc');
$tabular->addColumn('Columns');
$tabular->addData($entries);
$tabular->sortBy('Blob');
$dbPrefix = isset($config['prefix']) ? $config['prefix'] : '[none]';
$tabular->addNote('Table Prefix = ' . escapeHTML($dbPrefix));
$tabular->addNote(sprintf('%d text/blob to scan', $totalBlob));
$tabular->addNote(
'A "--" ID means <a href="https://stackoverflow.com/a/15268888"'
. ' target="_blank" rel="nofollow">no PRI/UNI but MUL</a>'
);
$tabular->addNote(
'Empty "Columns" means <a href="https://stackoverflow.com/a/15268888"'
. ' target="_blank" rel="nofollow">MUL</a> is in place'
);
$tabular->printTable();
}
/**
* Searches and replaces content in a database table.
*
* This function only works if the script was called from a CLI.
*
* @param MySQLIDriver $driver Database connection.
* @param array $tablesColumns List of tables with their columns.
* @param array $searchSignature List of signatures to search.
* @return void
*/
function replaceInTerminal($driver, $tablesColumns, $searchSignature)
{
// Not run from terminal or a search signature specified on the command line
if (!isTerminal() || $_GET['s'] !== '') {
return;
}
foreach ($searchSignature as $trigger => $sigArray) {
// No cleanup was requested; only search
if ($sigArray[CI_ACTION] === WARN) {
return;
}
}
echo "\n";
$reply = askFromCmdLine('Clean the malware (save the changes)? [Y / N]');
if ($reply === 'y' || $reply === 'Y') {
unset($_GET['noclean']);
$_POST = array('clean' => '1');
searchAndClear($driver, $tablesColumns, $searchSignature);
} else {
echo "Not cleaned";
}
}
/**
* Displays a form to search for signatures in the database.
*
* If the script is executed via a web server, it will render a HTML form with
* fields to allow the user to search for a string that will be matched against
* the content of the database. However, if the script is executed via the CLI
* a simple command prompt will be used to receive the user input.
*
* @return array Information about the malware cleanup.
*/
function getSearchSignature()
{
$trigger = $_GET['s'];
if (isset($_POST['s'])) {
$trigger = $_POST['s'];
}
$action = isset($_POST['regex']) ? $_POST['regex'] : '';
if (get_magic_quotes_gpc() && !isTerminal()) {
$trigger = stripslashes($trigger);
$action = stripslashes($action);
}
if (!isset($GLOBALS['isPlainText'])) {
$GLOBALS['isPlainText'] = false;
}
if (!isset($GLOBALS['DB_SIGS_TEMPLATE'])) {
$GLOBALS['DB_SIGS_TEMPLATE'] = array();
}
if (!$GLOBALS['isPlainText']) {
// Print the form
echo '<form action="" method="post">';
printMsg("\nSearch for:\t\t");
echo '<input type="text" name="s" value="' . escapeHTML($trigger) .
'" placeholder="<div id="coolhacker">" style="width:30%">';
printMsg("\n\nClean the regex:\t");
echo '<input type="text" name="regex" value="' . escapeHTML($action) .
'" placeholder="~<div id="coolhacker">[^<>]*?</div>~" style="width:60%">';
printMsg(
"\n(You can also use the following pre-defined templates: "
. implode(', ', array_keys($GLOBALS['DB_SIGS_TEMPLATE'])) . ")\n"
);
echo '<input type="checkbox" name="clean" value="1" id="clean">';
echo '<label for="clean" class="inserted" data-content="' . "Clean the malware (save the changes)\n" . '"></label>';
echo "\n" . '<input type="submit" value="Search">' . "\n";
echo '</form>';
}
if ($trigger === '') {
if (isTerminal()) {
do {
$trigger = askFromCmdLine('Search for');
} while ($trigger === '');
$action = askFromCmdLine('Clean the regex');
} else {
echo $GLOBALS['isPlainText'] ? "Please use\n" . "s=trigger\n" .
"regex=~regex~\n" . "clean to save the changes\n" : '</pre>';
exit;
}
}
$_GET['investigation'] = '1';
if (!isset($_POST['clean'])) {
$_GET['noclean'] = '1';
} elseif (skipCleanup()) {
unset($_GET['noclean']);
}
if ($trigger[0] === PCRE_DELIM) {
reportFatalError(PCRE_DELIM . ' is not allowed as the first character of the trigger');
}
if ($action === '') {
return array(
$trigger => array('custom.db.search', WARN)
);
}
if (!isset($GLOBALS['DB_SIGS_TEMPLATE'][$action])) {
if (PCRE_DELIM !== $action[0]) {
reportFatalError('Invalid regex, please use ' . PCRE_DELIM . ' as the delimiter');
}
if (preg_match($action, '') === false) {
reportFatalError('Invalid regex');
}
}
return array(
$trigger => array('custom.db.search', $action)
);
}
/**
* Modifies a global variable DB_SKIPPED_TABLES
*
* Function skips the scan over any table specified in a GET request.
*
* @param array $tablesColumns List of tables with their columns.
* @return void
*/
function readSkipTable($tablesColumns)
{
$GLOBALS['DB_SKIPPED_TABLES'] = array();
if (isset($_GET['skiptable'])) {
$tables = explode(',', $_GET['skiptable']);
foreach ($tables as $table) {
$GLOBALS['DB_SKIPPED_TABLES'][$table] = false;
}
}
if (isset($_GET['scantable'])) {
$tables = explode(',', $_GET['scantable']);
$tablesToScan = array();
// Convert the array to a set (hash table)
foreach ($tables as $table) {
if (!isset($tablesColumns[$table])) {
printMsg("\nWARN: Not found the table to scan: ", $table);
continue;
}
$tablesToScan[$table] = true;
if (isset($GLOBALS['DB_SKIPPED_TABLES'][$table])) {
printMsg("\nWARN: The same table in scantable and skiptable: ", $table);
}
}
// Invert the set
foreach ($tablesColumns as $table => $columns) {
if (!isset($tablesToScan[$table])) {
$GLOBALS['DB_SKIPPED_TABLES'][$table] = false;
}
}
}
}
/**
* Determines wheter a table must be skipped or not.
*
* The function checks the global DB_SKIPPED_TABLES variable, if the specified
* table exists in this array then it returns a boolean True meaning that the
* table must be skipped during the scan.
*
* @param string $table Name of the table.
* @return bool True if the table must be skipped.
*/
function shouldSkipTable($table)
{
if (!isset($GLOBALS['DB_SIGS_TEMPLATE'])) {
$GLOBALS['DB_SIGS_TEMPLATE'] = array();
}
if (!isset($GLOBALS['DB_SKIPPED_TABLES'][$table])) {
return false;
}
// Print the name of the skipped table once
if ($GLOBALS['DB_SKIPPED_TABLES'][$table] === false) {
printMsg("\nINFO: Skipped table ", $table);
$GLOBALS['DB_SKIPPED_TABLES'][$table] = true;
}
return true;
}
/**
* Prints the name of the skipped tables.
*
* @return void
*/
function checkSkippedTables()
{
if (!isset($GLOBALS['DB_SIGS_TEMPLATE'])) {
$GLOBALS['DB_SIGS_TEMPLATE'] = array();
}
foreach ($GLOBALS['DB_SKIPPED_TABLES'] as $table => $found) {
if ($found === false) {
printMsg("\nWARN: Not found the table to skip: ", $table);
}
}
}
/**
* Continues with a previously started scan.
*
* The function reads a file located in the quarantine folder which contains a
* list of associative names corresponding to the tables in the database that
* were not read during the last scan.
*
* @return void
*/
function startResume()
{
if (!isset($_GET['resume'])) {
return;
}
$GLOBALS['g_lastTable'] = false;
$GLOBALS['g_lastColumn'] = false;
$f = @fopen(QUARANTINE_FOLDER . DIRECTORY_SEPARATOR . RESUME_FILE_NAME, 'r');
if (false !== $f) {
$info = fread($f, 65536);
if ($info === false || $info === '') {
fclose($f);
@unlink(QUARANTINE_FOLDER . DIRECTORY_SEPARATOR . RESUME_FILE_NAME);
if ($info === false) {
reportFatalError('Reading sucuridbresume failed');
} else {
reportFatalError('Resume failed; please run with &list and skip the largest tables');
}
}
fclose($f);
list($a, $b) = explode("\n", $info, 2);
$GLOBALS['g_lastTable'] = $a;
$GLOBALS['g_lastColumn'] = $b;
}
if (!createQuarantineFolder()) {
reportFatalError('Create quarantine folder failed');
}
$GLOBALS['g_resumeHandle'] = @fopen(QUARANTINE_FOLDER . DIRECTORY_SEPARATOR . RESUME_FILE_NAME, 'w');
if (false === $GLOBALS['g_resumeHandle']) {
reportFatalError('Saving sucuridbresume failed; please check permissions');
}
}
/**
* Determine whether to skip or not a table.
*
* @param string $table Name of the table.
* @param string $column Name of the column.
* @return bool True if we need to skip the table.
*/
function shouldSkipForResume($table, $column)
{
if (!isset($GLOBALS['g_lastTable'])) {
$GLOBALS['g_lastTable'] = false;
}
if (!isset($GLOBALS['g_lastColumn'])) {
$GLOBALS['g_lastColumn'] = '';
}
if (!isset($GLOBALS['g_resumeHandle'])) {
$GLOBALS['g_resumeHandle'] = null;
}
if (!isset($_GET['resume'])) {
return false;
}
if ($GLOBALS['g_lastTable'] === false) {
/* support composite primary keys */
if (is_array($column)) {
$column = array_pop($column);
}
// Save the table/column that we started the check
if (false === ftruncate($GLOBALS['g_resumeHandle'], 0)
|| 0 !== fseek($GLOBALS['g_resumeHandle'], 0, SEEK_SET)
|| false === fwrite($GLOBALS['g_resumeHandle'], $table . "\n" . $column)
) {
reportFatalError('Writing sucuri-sss-resume failed');
}
return false; // we are not resuming now
}
// Skip until the last table/column
if ($table !== $GLOBALS['g_lastTable'] || $column !== $GLOBALS['g_lastColumn']) {
return true;
}
printMsg("\nINFO: Resuming from " . $table . '.' . $column . '...');
$GLOBALS['g_lastTable'] = false;
$GLOBALS['g_lastColumn'] = false;
return false; // Recheck this column again (some messages may be repeated from the previous run)
}
/**
* Closes and deletes the resume file.
*
* The file that keeps tracks of the scanning process and is used to resume the
* scan during a sudden stop, is closed with this function and then discarded
* as a normal system resource.
*
* @return void
*/
function finishResume()
{
if (!isset($GLOBALS['g_resumeHandle'])) {
$GLOBALS['g_resumeHandle'] = null;
}
if (!isset($_GET['resume'])) {
return;
}
fclose($GLOBALS['g_resumeHandle']);
if (!@unlink(QUARANTINE_FOLDER . DIRECTORY_SEPARATOR . RESUME_FILE_NAME)) {
echo "ERROR: deleting resume failed\n";
}
if (file_exists(QUARANTINE_FOLDER . DIRECTORY_SEPARATOR . RESUME_RESULTS)) {
echo "Run &resumeresults to see resume results.\n";
}
}
/**
* Displays resume results.
*
* @return void
*/
function resumeResults()
{
if (file_exists(QUARANTINE_FOLDER . DIRECTORY_SEPARATOR . RESUME_RESULTS)) {
echo "Resume results: \n" . file_get_contents(QUARANTINE_FOLDER . DIRECTORY_SEPARATOR . RESUME_RESULTS);
if (!@unlink(QUARANTINE_FOLDER . DIRECTORY_SEPARATOR . RESUME_RESULTS)) {
echo "ERROR: deleting resume results failed\n";
}
} else {
echo "Resume results file does not exist.\n";
}
exit;
}
/**
* Checks whether the script is executed in a Terminal or Web Browser.
*
* This function checks for the existence of the REMOTE_ADDR and SHELL keys in
* the global SERVER variable, which can be used to detect if the file is being
* loaded via a Terminal emulator or a Web Browser.
*
* @return bool True if the script is executed in a Terminal.
*/
function isTerminal()
{
return !isset($_SERVER['REMOTE_ADDR']) && (
isset($_SERVER['SHELL'])
|| isset($_SERVER['TERM'])
);
}
/**
* Returns the HTML code with the information about the table.
*
* @param array $location Table information.
* @param string $type Either plaintext, link or insertedlink.
* @param array $matches RegExp result following PHP standards.
* @param string $text Content of the configuration file.
* @return string HTML anchor to link to the file content.
*/
function getLocationHTML($location, $type, $matches = null, $text = null)
{
$ret = escapeHTML($location['table']);
if (isset($location['column'])) {
$ret .= '.' . escapeHTML($location['column']);
}
// If id is not set (a table without primary key or a composite primary key), then we cannot display the link.
// Even if $type == 'link', return the plain text version with table.column.
if (!isset($location['idname'])) {
return $ret;
}
$ret .= ', ' . escapeHTML($location['idname']) . ' = ' . escapeHTML($location['id']);
if ($type === 'plaintext') {
return $ret;
}
$pos = '';
if (isset($matches[0][1])) {
$matches[0][0] = str_replace("\r\n", "\n", $matches[0][0]);
$text = str_replace("\r\n", "\n", substr($text, 0, $matches[0][1]));
if (function_exists('mb_strlen')) {
// Locate the character index in UTF-8 encoding
$match_start = mb_strlen($text, 'UTF-8');
$match_end = $match_start + mb_strlen($matches[0][0], 'UTF-8');
} else {
// Calculate the byte offset
$match_start = strlen($text);
$match_end = $match_start + strlen($matches[0][0]);
}
$pos = '&match_start=' . $match_start . '&match_end=' . $match_end;
}
if (isset($_GET['dir'])) {
$pos = $pos . '&dir=' . $_GET['dir'];
}
$link = '<a href="?srun'
. '&showcontent'
. '&t=' . escapeHTML($location['table'])
. (isset($location['column']) ? '&c=' . escapeHTML($location['column']) : '')
. '&id_name=' . escapeHTML($location['idname'])
. '&id=' . escapeHTML($location['id']) . $pos . '" target="_blank"';
if ($type === 'insertedlink') {
return '"></span>' . $link . ' class="inserted" data-content="' . $ret
. '"></a>' . '<span class="inserted warn" data-content="';
}
if ($type === 'link') {
return $link . '>' . $ret . '</a>';
}
reportFatalError('Invalid type ' . $type);
return '';
}
/**
* Prints a message to the web or terminal with a status code.
*
* @param boolean $status Either true for success or false for failures.
* @param string $message Message to print, cut to 255 characters.
* @return void
*/
function logMsg($status = false, $message = '')
{
if (!isset($GLOBALS['isPlainText'])) {
$GLOBALS['isPlainText'] = false;
}
$message = str_replace("\n", "\x20", $message);
$limit = ($GLOBALS['isPlainText'] ? 255 : 130);
if (strlen($message) > $limit) {
$message = substr($message, 0, $limit) . "\xe2\x80\xa6";
}
/* success and terminal */
if ($status && $GLOBALS['isPlainText']) {
prush("\xe2\x9c\x94 " . $message . "\n");
return;
}
/* success and no terminal */
if ($status && !$GLOBALS['isPlainText']) {
prush("✔ " . $message . "\n");
return;
}
/* failure and terminal */
if (!$status && $GLOBALS['isPlainText']) {
prush("\xe2\x9c\x98 " . $message . "\n");
return;
}
/* failure and no terminal */
if (!$status && !$GLOBALS['isPlainText']) {
prush("✘ " . $message . "\n");
return;
}
}
/**
* Prints a message to the console or web page.
*
* If the script is being executed in a Terminal emulator then this function
* will print the message and details associated to the message into the same
* Terminal, otherwise it prints into whatever interface the script is running
* on, which in most cases will be a web browser, in this case, the message will
* be merged with some HTML code.
*
* @param string $msg Message to print.
* @param string $details Additional information for the message.
* @return void
*/
function printMsg($msg, $details = '')
{
if (!isset($GLOBALS['isPlainText'])) {
$GLOBALS['isPlainText'] = false;
}
if ($GLOBALS['isPlainText']) {
prush($msg . $details);
return;
}
if (strncmp($msg, "\nWARN:", 6) === 0) {
prush('<span class="inserted warn" data-content="' . escapeHTML($msg) . '"></span>');
$msg = '';
}
prush('<span class="inserted" data-content="' . escapeHTML($msg . $details) . '"></span>');
}
/**
* Prints information about an error occurred during the scan.
*
* @param string $msg Message to be printed into the console.
* @return void
*/
function reportFatalError($msg)
{
if (!isset($GLOBALS['isPlainText'])) {
$GLOBALS['isPlainText'] = false;
}
$msg = 'ERROR: ' . $msg;
if ($GLOBALS['isPlainText']) {
echo "\n" . $msg;
} else {
echo '<span class="inserted warn" data-content="' . escapeHTML("\n" . $msg) . '"></span></pre>';
}
exit(1);
}
/**
* Prints an inserted link into the console.
*
* @param string $tool Name of the script with the insertion.
* @return void
*/
function printInsertedLink($tool)
{
if (!isset($GLOBALS['isPlainText'])) {
$GLOBALS['isPlainText'] = false;
}
if ($GLOBALS['isPlainText']) {
echo $tool;
return;
}
$url = '?srun&' . $tool;
$msg = $tool === 's' ? 'search' : $tool;
echo '<a href="' . $url . '" class="inserted" data-content="' . $msg . '"></a>';
}
/**
* Prints the HTML code with the final status of the database scan.
*
* @param string $status Status of the database scan.
* @param string $afterStatus Message to complement the status information.
* @return string Status of the database scan in HTML code.
*/
function getStatusHtml($status, $afterStatus = '')
{
if (!isset($GLOBALS['isPlainText'])) {
$GLOBALS['isPlainText'] = false;
}
if ($GLOBALS['isPlainText']) {
return "\n" . $status . ': ' . $afterStatus;
}
if ($status === 'ERROR' || $status === 'WARN') {
return "\n" . '<span class="inserted warn" data-content="' .
$status . ': ' . escapeHTML($afterStatus) . '"></span>' .
'<span class="hidden-copied">CLEARED: Cleared malware from database (manual review)</span>';
}
return "\n" . '<span class="cleared">' . $status . ':</span> ' . escapeHTML($afterStatus);
}
/**
* Returns the text (or HTML) of the signature found in the database.
*
* @param string $status Name of the cleanup result in uppercase.
* @param string $signatureName Name of the signature found in the database.
* @param array $location Info about the table where the malware is.
* @param string $matches RegExp result following PHP standards.
* @param string $text Text containing the signature.
* @param string $msg Optional text to print in the result.
* @return string Text or HTML of the signature found in the database.
*/
function reportMalware($status, $signatureName, $location = null, $matches = null, $text = null, $msg = null)
{
if (!isset($GLOBALS['foundMalware'])) {
$GLOBALS['foundMalware'] = false;
}
if (!isset($GLOBALS['isPlainText'])) {
$GLOBALS['isPlainText'] = false;
}
// Output research messages only in the investigation mode
if ($status === 'RESEARCH' && !isset($_GET['investigation'])) {
return '';
}
// Get location and content matched by the regex
if ($status === 'WARN' || $status === 'CLEARED' && skipCleanup()) {
$type = 'link';
} elseif ($status === 'RESEARCH' || $status === 'ERROR') {
$type = 'insertedlink';
} else {
$type = 'plaintext';
}
if ($GLOBALS['isPlainText']) {
$type = 'plaintext';
}
$locationHTML = $location === null ? '' : ': ' . getLocationHTML($location, $type, $matches, $text);
$msgHTML = $msg === null ? '' : ' - ' . escapeHTML($msg);
$signatureHTML = '. Details: ' . escapeHTML($signatureName);
$contentHTML = '';
if ($matches !== null) {
// Below PHP 4.3, PREG_OFFSET_CAPTURE is not supported and match text is returned in $matches[0]
$matchText = is_array($matches[0]) ? $matches[0][0] : $matches[0];
$maxLen = isset($_GET['s']) ? 500 : 50;
$content = substr($matchText, 0, $maxLen);
if (strlen($matchText) > $maxLen) {
$content = substr($matchText, 0, $maxLen - 10) . '...' . substr($matchText, -7);
}
$contentHTML = '. Content: ' . escapeHTML(preg_replace('/[\x00-\x1F\x7F]/', '`', $content));
if ($status !== 'RESEARCH' && $status !== 'ERROR' && !$GLOBALS['isPlainText']) {
// Hide the content from user to avoid disclosing our signatures
$contentHTML = '<span class="inserted" data-content="' . $contentHTML . '"></span>';
}
}
if ($status === 'CLEARED' || $status === 'FOUND') {
if (skipCleanup() || $status === 'FOUND') {
$statusHTML = getStatusHtml('FOUND', 'Found malware to clean');
} elseif (!isset($location['idname'])) {
$statusHTML = getStatusHtml('ERROR', 'Not cleaned (no primary key or a composite primary key)');
} else {
$statusHTML = getStatusHtml('CLEARED', 'Cleared malware from database');
}
} elseif ($status === 'OK') {
// Omit the word "Details:"; print action message instead of the signature name
$statusHTML = getStatusHtml('OK', $signatureName);
$signatureHTML = '';
} elseif ($status === 'WARN') {
// Manual review is required
$after = isset($location['idname']) ? 'Please review' : 'No primary key or a composite primary key';
$statusHTML = getStatusHtml('WARN', $after);
} elseif ($GLOBALS['isPlainText']) {
$statusHTML = "\n" . $status; // RESEARCH, ERROR
} else {
// RESEARCH, ERROR - should not be sent to user
$statusHTML = '<span class="inserted warn" data-content="' . "\n" . $status;
$msgHTML .= '"></span>';
}
if (isset($_GET['resume'])) {
$resume_file = @fopen(QUARANTINE_FOLDER . DIRECTORY_SEPARATOR . RESUME_RESULTS, 'a+');
if (false !== $resume_file) {
fwrite($resume_file, $statusHTML . $locationHTML . $signatureHTML);
} else {
echo "Could not write to resume results file.\n";
}
}
$GLOBALS['foundMalware'] = true;
return $statusHTML . $locationHTML . $signatureHTML . $contentHTML . $msgHTML;
}
/**
* Checks if the table or column is whitelisted.
*
* @param array $location Table information.
* @param array $whitelist List of whitelisted tables.
* @return bool True if the table or column is whitelisted.
*/
function checkWhitelist($location, $whitelist)
{
if (!isset($GLOBALS['config'])) {
$GLOBALS['config'] = array('prefix' => '');
}
// Prepare for comparison with the whitelist. WordPress/Joomla prefix is written as <PREFIX>;
// column name can follow after a dot.
$table = $location['table'];
if (!empty($GLOBALS['config']['prefix']) && strncmp($table, $GLOBALS['config']['prefix'], strlen($GLOBALS['config']['prefix'])) === 0) {
$table = '<PREFIX>' . substr($table, strlen($GLOBALS['config']['prefix']));
}
// Lookup in the whitelist
return isset($whitelist[$table]) || isset($whitelist[$table . '.' . $location['column']]) || isset($whitelist[$table . '.' . $location['id']]);
}
/**
* Checks if whitelisted string appears in the scanned buffer.
*
* @param string $signature Signature name.
* @param string $buffer Scanned buffer.
* @return bool True if the table or column is whitelisted.
*/
function checkStrWhitelist($signature, $buffer)
{
global $WHITELIST_STRINGS;
if (array_key_exists($signature, $WHITELIST_STRINGS)) {
foreach ($WHITELIST_STRINGS[$signature] as $white_string) {
if (strpos($buffer, $white_string) !== false) {
return true;
}
}
}
else return false;
}
/**
* Reverts the escaping applied to a string.
*
* @param string $str Text to remove the escaping.
* @param int $nChars Number of characters to revert.
* @return array Array representation of the string.
*/
function unescapeString($str, $nChars)
{
$inputLen = 0;
$out = '';
for ($i = 0; $i < $nChars; $i++) {
if (!isset($str[$inputLen])) {
return array(0, false); // Invalid string length
}
if ($str[$inputLen] !== '\\') {
$out .= $str[$inputLen];
$inputLen++;
continue;
}
$hex = substr($str, $inputLen + 1, 2);
if (!ctype_xdigit($hex)) {
return array(0, false); // Invalid hex char
}
$out .= pack("H*", $hex);
$inputLen += 3;
}
return array($inputLen, $out);
}
/**
* Replaces content in a serialized object.
*
* Avoid the use of the built-in PHP unserialize function as it is vulnerable on
* old PHP versions. Do a custom parsing function, replace inside the serialized
* strings, and correct the string lengths.
*
* @param string $pattern Regular expression to change.
* @param string $serialized Serialized object as a string.
* @param bool $isRegEx True if pattern is a regexp, false for string.
* @return array Two-index length array with new serialized data.
*/
function replaceInSerialized($pattern, $serialized, $isRegEx)
{
$valueToSkipRe = '/^(?:
N; | b:[01]; # null, Boolean
| [rR] : [0-9]+; # references
| [id] : [+-]? [0-9]+; # an integer (as integer or double type)
| d : [+-]? [0-9]* \\. [0-9]+ (?: [eE] [+-]? [0-9]+ )?; # a floating point number (double)
) /x';
$strRe = '/^ (?P<type> [sS]) : (?P<len> [0-9]+) : "/x';
$compoundRe = '/^ (?:
a : (?P<count> [0-9]+) : \\{
| (?P<type> [OC]) : (?P<namelen> [0-9]+) : "(?P<name> [^"]+)" : (?P<clen> [0-9]+) : \\{
) /x';
if (preg_match($valueToSkipRe, $serialized, $m)) {
return array(strlen($m[0]), $m[0]);
}
if (preg_match($strRe, $serialized, $m)) {
if ($m['type'] === 'S') {
list($inputLen, $str) = unescapeString(substr($serialized, strlen($m[0])), $m['len']);
if ($str === false) {
return array(0, false);
}
$inputLen += strlen($m[0]);
} else {
$str = substr($serialized, strlen($m[0]), $m['len']);
$inputLen = strlen($m[0]) + $m['len'];
}
if (substr($serialized, $inputLen, 2) !== '";') {
return array(0, false);
}
$str = $isRegEx ? preg_replace($pattern, '', $str) : str_replace($pattern, '', $str);
return array($inputLen + 2, 's:' . strlen($str) . ':"' . $str . '";');
}
if (preg_match($compoundRe, $serialized, $m)) {
if (isset($m['namelen']) && intval($m['namelen']) !== strlen($m['name'])) {
return array(0, false);
}
if (isset($m['type']) && $m['type'] === 'C') {
// Custom serialization format, skip it (no search-and-replace)
$inputLen = strlen($m[0]) + $m['clen'];
if (substr($serialized, $inputLen, 1) !== '}') { // substr silently returns false if out of bounds
return array(0, false);
}
return array($inputLen + 1, substr($serialized, 0, $inputLen + 1));
}
$out = $m[0];
$inputPos = strlen($m[0]);
$count = $m['count'] === '' ? $m['clen'] : $m['count'];
for ($i = 0; $i < $count; $i++) {
if ($m['count'] === '') { // Object - don't replace in the variable name
list($len, $replaced) = replaceInSerialized('', substr($serialized, $inputPos), false);
} else { // Array - replace in the index
list($len, $replaced) = replaceInSerialized($pattern, substr($serialized, $inputPos), $isRegEx);
}
if ($replaced === false) {
return array(0, false);
}
$inputPos += $len;
$out .= $replaced;
// Always replace in the value
list($len, $replaced) = replaceInSerialized($pattern, substr($serialized, $inputPos), $isRegEx);
if ($replaced === false) {
return array(0, false);
}
$inputPos += $len;
$out .= $replaced;
}
if (substr($serialized, $inputPos, 1) !== '}') {
return array(0, false);
}
return array($inputPos + 1, $out . '}');
}
return array(0, false);
}
/**
* Returns a clean version of a string.
*
* @param string $pattern Expression to locate the malicious text.
* @param string $text Text containing the malicious payload.
* @param bool $isRegex Whether pattern is a regexp or a string.
* @return string Clean version of the text.
*/
function doCleanup($pattern, $text, $isRegex)
{
// Quick check: if it's a serialized object/array/string
if (isset($text[1]) && $text[1] !== ':') {
return $isRegex ? preg_replace($pattern, '', $text) : str_replace($pattern, '', $text);
}
list($pos, $replaced) = replaceInSerialized($pattern, $text, $isRegex);
if ($replaced === false || $pos !== strlen($text)) {
// Not a valid serialized data; do a usual textual search-and-replace
return $isRegex ? preg_replace($pattern, '', $text) : str_replace($pattern, '', $text);
}
return $replaced;
}
/**
* Walks through all the signatures and removes the malicious payload.
*
* Look for the signatures in the text and remove the malware. Table and column
* are used for whitelisting. Function returns NULL if no malware was cleaned.
*
* @param string $text Text containing the malicious payload.
* @param array $signatures Regular expressions to match the malicious code.
* @param array $location Information about the table.
* @return array Clean version of the text.
*/
function clearMalwareFromText($text, $signatures, $location)
{
global $WHITELIST_TABS;
if (!isset($GLOBALS['DB_SIGS_TEMPLATE'])) {
$GLOBALS['DB_SIGS_TEMPLATE'] = array();
}
if (!isset($GLOBALS['DB_NOCLEAN_FOR_ROBOT'])) {
$GLOBALS['DB_NOCLEAN_FOR_ROBOT'] = array();
}
$out = '';
$replaced = false;
foreach ($signatures as $trigger => $sigArray) {
if ($sigArray === NESTED) {
continue;
}
// Check the trigger (regular expression or plain text search)
$matches = null;
if ($trigger[0] === PCRE_DELIM) {
if (!preg_match($trigger, $text, $matches, PREG_OFFSET_CAPTURE)) {
continue;
}
} elseif ($trigger[0] !== POSIX_DELIM || substr($trigger, -1) !== POSIX_DELIM) {
$pos = strpos($text, $trigger);
if ($pos === false) {
continue;
}
$matches = array(array($trigger, $pos));
}
if ($sigArray[CI_NAME] === NESTED) {
list($newText, $newOut) = clearMalwareFromText($text, $sigArray, $location);
if ($newText !== null) {
$text = $newText;
$replaced = true;
}
$out .= $newOut;
continue;
}
// Check the general tab/column whitelist
if (checkWhitelist($location, $WHITELIST_TABS)) {
$out .= reportMalware('RESEARCH', $sigArray[CI_NAME], $location, $matches, $text, 'Whitelisted location');
continue;
}
// Check the sig->location whitelist
if (isset($sigArray[CI_WHITELIST]) && checkWhitelist($location, $sigArray[CI_WHITELIST])) {
$out .= reportMalware('RESEARCH', $sigArray[CI_NAME], $location, $matches, $text, 'Whitelisted');
continue;
}
// Check the string whitelist
if (checkStrWhitelist($sigArray[CI_NAME], $text)) {
$out .= reportMalware('RESEARCH', $sigArray[CI_NAME], $location, $matches, $text, 'Whitelisted');
continue;
}
// Do the action
$action = isset($sigArray[CI_ACTION]) ? $sigArray[CI_ACTION] : WARN;
if ($action === WARN) {
$out .= reportMalware('WARN', $sigArray[CI_NAME], $location, $matches, $text);
} elseif ($action === CLEAR_THIS) {
$out .= reportMalware('CLEARED', $sigArray[CI_NAME], $location, $matches, $text);
$text = doCleanup($trigger, $text, false);
$replaced = true;
} else {
if (isset($GLOBALS['DB_SIGS_TEMPLATE'][$action])) {
$action = str_replace('<TRIGGER>', preg_quote($trigger), $GLOBALS['DB_SIGS_TEMPLATE'][$action]);
}
if (!preg_match($action, $text, $matches, PREG_OFFSET_CAPTURE)) { // Fill the matches
$msg = 'Trigger found; regex not found';
$out .= reportMalware('RESEARCH', $sigArray[CI_NAME], $location, null, $text, $msg);
continue;
}
$status = 'FOUND';
if (!isset($_GET['robot']) || !isset($GLOBALS['DB_NOCLEAN_FOR_ROBOT'][$sigArray[CI_NAME]])) {
$text = doCleanup($action, $text, true); // Do the actual cleanup
$status = 'CLEARED';
$replaced = true;
}
$out .= reportMalware($status, $sigArray[CI_NAME], $location, $matches, $text);
}
}
return $replaced ? array($text, $out) : array(null, $out);
}
/**
* Escapes the LIKE keyword in an SQL statement.
*
* @param string $trigger SQL statement to be escaped.
* @return string Clean version of the SQL statement.
*/
function escapeLike($trigger)
{
return str_replace(array('$', '%', '_'), array('$$', '$%', '$_'), $trigger);
}
/**
* Prepares the WHERE conditions with triggers.
*
* Later we will insert table and column names there.
*
* @param MySQLIDriver $driver Database connection.
* @param array $signatures List of signatures to search.
* @param int $maxConditions Maximum number of conditions.
* @return array List of WHERE SQL statements.
*/
function prepareConditions($driver, $signatures, $maxConditions)
{
$i = 0;
$j = 0;
$conditionSets = array(array(' WHERE '));
$signatureSet = array();
foreach ($signatures as $trigger => $nested) {
if ($j !== 0) {
// Add OR to the previous condition
$conditionSets[$i][$j] .= ' OR ';
}
if ($trigger[0] === POSIX_DELIM && substr($trigger, -1) === POSIX_DELIM) {
array_push($conditionSets[$i], ' REGEXP ' . $driver->escapeStr(substr($trigger, 1, -1)));
} else {
array_push($conditionSets[$i], ' LIKE ' . $driver->escapeStr('%' . escapeLike($trigger) . '%') . " ESCAPE '$'");
}
$j++;
$signatureSet[$trigger] = $nested;
if ($j >= $maxConditions) {
// End the WHERE statement here and start another one
array_push($conditionSets[$i], $signatureSet);
$signatureSet = array();
array_push($conditionSets, array(' WHERE '));
$i++;
$j = 0;
}
}
// Delete the extra WHERE statement
if ($j === 0) {
array_pop($conditionSets);
} else {
array_push($conditionSets[$i], $signatureSet);
}
return $conditionSets;
}
/**
* Locates the infected table entries and executes the cleaners.
*
* @param MySQLIDriver $driver Database connection.
* @param array $tablesColumns List of tables with their columns.
* @param array $signatures Regular expressions to match the malicious code.
* @return void
*/
function searchAndClear($driver, $tablesColumns, $signatures)
{
global $config;
// Break signatures into sets (20 triggers in each set)
$conditionSets = prepareConditions($driver, $signatures, 20);
$location = array();
/**
* By default the "Search & Replace" tool executes the malware cleanup
* against the database once the infection is found. However, if the analyst
* wants to see the infection before its cleaned they can send an additional
* parameter via GET named "s" (in lowercase) to execute the search alone.
*
* @option s Sets the action to be executed, in this case "search".
*/
$action = isset($_GET['s']) ? 'search' : 'cleanup';
foreach ($tablesColumns as $table => $columns) {
if (shouldSkipTable($table)) {
continue;
}
// Remember location in the associative array
$location['table'] = $table;
$escapedId = '';
if (isset($columns['idname'])) {
$location['idname'] = $columns['idname'];
$escapedId = ',' . $driver->escapeName($columns['idname']);
} else {
unset($location['idname']);
unset($location['id']);
}
$escapedTable = $driver->escapeName($table);
foreach ($columns as $i => $column) {
if ($i === 'idname' || shouldSkipForResume($table, $column)) {
continue;
}
if (is_array($column)) {
/* skip composite keys; not necessary */
/* idnames => [option_id, option_name] */
continue;
}
$location['column'] = $column;
$escapedColumn = $driver->escapeName($location['column']);
// Run cleanup for each set
foreach ($conditionSets as $conditions) {
$signaturesSet = array_pop($conditions);
// Set Scan Restrictions on rows that meet specific criteria, I.E trashed posts.
$rowRestrictions = false;
$rowConditions = "";
if ($config['cms'] === 'WordPress'){
if (!isset($_GET['scantrash'])) {
if ($escapedTable == '"' . $GLOBALS['config']['prefix'] . 'posts"') {
$rowRestrictions = true;
$rowConditions = ' "post_status" LIKE \'%trash%\' ';
}
// Modify our WHERE statement if row restriction criteria have been met
if ($rowRestrictions) {
// Include ANY post NOT IN trash
$whereReplacement = ' WHERE ' . substr($escapedId, 1) . ' NOT IN (SELECT "ID" FROM ' . $escapedTable . ' WHERE ' . $rowConditions . ' ) AND ( ';
$conditions[0] = $whereReplacement;
}
} else {
if ($rowRestrictions) {
// Include ONLY posts IN trash
$whereReplacement = ' WHERE ' . substr($escapedId, 1) . ' IN (SELECT "ID" FROM ' . $escapedTable . ' WHERE ' . $rowConditions . ' ) AND ( ';
$conditions[0] = $whereReplacement;
}
}
}
// Search for the triggers using the previously prepared conditions
$sql = 'SELECT ' . $escapedColumn . $escapedId . ' FROM ' . $escapedTable . implode($escapedColumn, $conditions);
if ($rowRestrictions) {
$sql .= ");";
} else {
$sql .= ";";
}
clearMalwareFromDb($driver, $location, $sql, $signaturesSet, $action);
}
}
}
}
/**
* Searches a signature in the database and clears the malicious code.
*
* @param MySQLIDriver $driver Database connection.
* @param array $location Information about the table.
* @param string $sql SQL statement to execute in the database.
* @param array $signatures Malware identifiers to search and clear.
* @param string $action Name of the action to be executed.
* @return void
*/
function clearMalwareFromDb($driver, $location, $sql, $signatures, $action)
{
/**
* To allow the security analyst to monitor the process followed by any of
* the implemented features in the cleanup script, the script itself will
* allow them to activate the verbose mode which will start printing labals
* marking every step followed by each action.
*
* @option noise Prints information about what is currently happening.
*/
if (isset($_GET['noise'])) {
printMsg("\nSearching " . $location['table'] . '.' . $location['column'] . '...');
}
$result = $driver->query($sql);
// If any trigger was found, try to find the triggers in the column text
while ($row = $driver->fetchRow($result)) {
if (isset($location['idname'])) {
$location['id'] = $row[1];
}
list($cleared, $out) = clearMalwareFromText($row[0], $signatures, $location);
if ($cleared !== null
&& !showUpdateDbError(updateDb($driver, $cleared, $row[0], $location, $action))
) {
// Instead of CLEARED message, prepare the FOUND message
list($cleared, $out) = clearMalwareFromText($row[0], $signatures, $location);
}
if ($out) {
prush($out);
}
}
}
/**
* Deletes entries from a database table.
*
* @param MySQLIDriver $driver Database connection.
* @param array $tablesColumns List of tables with their columns.
* @param array $config Application configuration.
* @return void
*/
function deleteRows($driver, $tablesColumns, $config)
{
if (!isset($GLOBALS['DB_ROWS_TO_DELETE'])) {
$GLOBALS['DB_ROWS_TO_DELETE'] = array();
}
if (!isset($GLOBALS['DB_ROWS_TO_DELETE'][$config['cms']])) {
return;
}
$rules = $GLOBALS['DB_ROWS_TO_DELETE'][$config['cms']];
foreach ($rules as $tableColumn => $values) {
list($table, $column) = explode('.', $tableColumn, 2);
if (strncmp($table, '<PREFIX>', strlen('<PREFIX>')) === 0) {
$table = $config['prefix'] . substr($table, strlen('<PREFIX>'));
}
if (!isset($tablesColumns[$table])) {
printMsg(
"\nINFO: Table " . $table . " not found for CMS " . $config['cms'] .
', prefix ' . (empty($config['prefix']) ? 'not detected' : $config['prefix'])
);
continue;
}
if (shouldSkipTable($table)) {
continue;
}
$location = array('table' => $table, 'idname' => $column);
$vals = array();
$col = $driver->escapeName($column) . ' LIKE ';
foreach ($values as $value) {
$vals[] = $col . $driver->escapeStr($value) . " ESCAPE '$'";
}
$vals = implode(' OR ', $vals);
list($err, $out) = deleteRowsFromDb($driver, $location, $vals);
if (!showUpdateDbError($err)) {
// Instead of the "Removed row" message, prepare the "Found malicious row" message
list($err, $out) = deleteRowsFromDb($driver, $location, $vals);
}
if ($out) {
prush($out);
}
}
}
/**
* Detects and reports or clears suspicious and malicious users from a DB
*
* @param MySQLIDriver $driver Database connection.
* @param array $tablesColumns List of tables with their columns.
* @param array $config Application configuration.
* @return void
*/
function checkDBUsers($driver, $tablesColumns, $config)
{
if (!isset($GLOBALS['DB_USER_SIGNATURES'])) {
$GLOBALS['DB_USER_SIGNATURES'] = array();
}
if (!isset($GLOBALS['DB_USER_SIGNATURES'][$config['cms']])) {
return;
}
$signatures = $GLOBALS['DB_USER_SIGNATURES'][$config['cms']];
foreach ($signatures as $signature => $value) {
$table = $value[1];
if (strncmp($table, '<PREFIX>', strlen('<PREFIX>')) === 0) {
$table = $config['prefix'] . substr($table, strlen('<PREFIX>'));
}
if (!isset($tablesColumns[$table])) {
printMsg(
"\nINFO: Table " . $table . " not found for CMS " . $config['cms'] .
', prefix ' . (empty($config['prefix']) ? 'not detected' : $config['prefix'])
);
continue;
}
if (shouldSkipTable($table)) {
continue;
}
$location = array('table' => $table, 'sig' => $signature, 'idname' => 'ID');
$location['sigtype'] = $value[0];
$match_regex = $value[2];
list($err, $out) = deleteRowsFromDb($driver, $location, $match_regex);
if (!showUpdateDbError($err)) {
// Instead of the "Removed row" message, prepare the "Found malicious row" message
list($err, $out) = deleteRowsFromDb($driver, $location, $match_regex);
}
if ($out) {
prush($out);
}
}
}
/**
* Checks the default role for new users in WordPress.
*
* If the website is based on WordPress, this function reads the options table
* and checks whether the default role for new user accounts is different than
* "subscriber" in which case will print a warning for the security analyze to
* investigate.
*
* @param MySQLIDriver $driver Database connection.
* @param array $tablesColumns List of tables with their columns.
* @param array $config Application configuration.
* @return void
*/
function checkWPDefaultUserRole($driver, $tablesColumns, $config)
{
if ('WordPress' !== $config['cms']) {
return;
}
$table = $config['prefix'] . 'options';
if (!isset($tablesColumns[$table])) {
printMsg("\nWARN: Table " . $table . " not found for WordPress");
return;
}
if (shouldSkipTable($table)) {
return;
}
$res = $driver->query(
'SELECT "option_value" FROM ' . $driver->escapeName($table) .
' WHERE "option_name" = \'default_role\' AND "option_value" <> \'subscriber\';'
);
$row = $driver->fetchRow($res);
if ($row) {
printMsg(
"\nWARN: Default WordPress user role set to '" . $row[0] . "'",
" instead of 'subscriber' in table " . $table .
', please notify the client to change this for security reasons.'
);
}
}
/**
* Checks if the site_url was tampered in WordPress.
*
* If the website is based on WordPress, this function reads the options table
* and checks whether the site_url value is different than the URI we are running
* cleanup from in which case will print a warning for the security analyze to
* investigate.
*
* @param MySQLIDriver $driver Database connection.
* @param array $tablesColumns List of tables with their columns.
* @param array $config Application configuration.
* @return void
*/
function checkWPSiteURL($driver, $tablesColumns, $config)
{
if ('WordPress' !== $config['cms']) {
return;
}
if (isTerminal()) {
return;
}
$table = $config['prefix'] . 'options';
if (!isset($tablesColumns[$table])) {
printMsg("\nWARN: Table " . $table . " not found for WordPress");
return;
}
if (shouldSkipTable($table)) {
return;
}
$siteURL = $_SERVER['HTTP_HOST'];
$res = $driver->query(
'SELECT "option_value" FROM ' . $driver->escapeName($table) .
' WHERE "option_name" = \'siteurl\' AND "option_value" NOT LIKE \'%'.$siteURL.'%\';'
);
$row = $driver->fetchRow($res);
if ($row) {
printMsg(
"\nWARN: WordPress siteurl value was changed to '" . $row[0] . "'",
" instead of: \"". $siteURL ."\"" .
"\nThis may be a sign of compromise. Correct value should be checked with the client."
);
echo ("<br>Review <a href=?srun&showcontent&t=" . $table . "&c=option_value&id_name=option_name&id=siteurl>SiteUrl</a> ".
"manually. (This record may not exist in old and differ in multisite WP installations.)");
}
$res = $driver->query(
'SELECT "option_value" FROM ' . $driver->escapeName($table) .
' WHERE "option_name" = \'home\' AND "option_value" NOT LIKE \'%'.$siteURL.'%\';'
);
$row = $driver->fetchRow($res);
if ($row) {
printMsg(
"\nWARN: WordPress home value was changed to '" . $row[0] . "'",
" instead of: \"". $siteURL ."\"" .
"\nThis may be a sign of compromise. Correct value should be checked with the client."
);
echo ("<br>Review <a href=?srun&showcontent&t=" . $table . "&c=option_value&id_name=option_name&id=home>Home" .
"</a> manually. (This record may not exist in old and differ in multisite WP installations.");
}
}
/**
* Checks if triggers are present in the database
* and presents a message with a URL to list them.
* @param MySQLIDriver $driver Database connection.
*/
function checkTriggers($driver)
{
if (isTerminal()) {
return;
}
$res = $driver->query(
'show triggers'
);
$row = $driver->fetchRow($res);
if ($row) {
printMsg(
"\n\n Triggers have been detected on the database. Please check them to ensure they are innocent here:"
);
printInsertedLink ('listTriggers');
}
}
/**
* lists triggers present in the database if any.
* @param MySQLIDriver $driver Database connection.
*/
function listTriggers($driver)
{
if (isTerminal()) {
return;
}
$res = $driver->query(
'show triggers'
);
printMsg(
"\n\n Please note that the important field here is the 'Statement' field which is the actual query\n".
"\n Here's some description about the notable fields you will see:".
"\n [Trigger] --> Name of the trigger".
"\n [Event] --> What action will trigger this".
"\n [Table] --> In what table this ocurrs".
"\n [Statement] --> The query that is run".
"\n [Timing] --> Wether this ocurrs before or after what triggered this \n\n"
);
echo ('<hr>');
while ($row = $driver->fetchAssoc($res)) {
if ($row) {
print_r($row);
}
}
}
/**
* Determines if errors must be printed or not.
*
* @param bool $updateRes Whether there are messages or not.
* @return bool Whether to print messages or not.
*/
function showUpdateDbError($updateRes)
{
if (!isset($GLOBALS['updateErrMessages'])) {
$GLOBALS['updateErrMessages'] = array();
}
if (!isset($GLOBALS['isPlainText'])) {
$GLOBALS['isPlainText'] = false;
}
if (!is_int($updateRes) || !isset($GLOBALS['updateErrMessages'][$updateRes])) {
return true;
}
if ($GLOBALS['isPlainText']) {
echo "\n" . $GLOBALS['updateErrMessages'][$updateRes];
} else {
echo "\n" . '<span class="warn">' . $GLOBALS['updateErrMessages'][$updateRes] . '</span>';
}
// If the DB update fails, continue looking for malware in read-only mode
$_GET['noclean'] = 1;
return false;
}
/**
* Append a database backup into the same file.
*
* @param string $backupFilename Location of the backup file.
* @param string $backup Additional data to backup.
* @return bool Whether the operation succeeded or not.
*/
function addToBackup($backupFilename, $backup)
{
$fh = @fopen($backupFilename, "ab");
if (false === $fh) {
return false;
}
if (fseek($fh, 0, SEEK_END) !== 0) {
return false;
}
$size = ftell($fh);
if ($size === 0) {
$backup = BACKUP_COMMENT . "\n" . $backup;
}
$res = false !== fwrite($fh, encrypt($backup, SUCURI_KEY, $size));
fclose($fh);
return $res;
}
/**
* Changes the value in a table row in the database.
*
* This function also creates a backup of the original content.
*
* @param MySQLIDriver $driver Database connection.
* @param string $cleared Clean version of the table row.
* @param string $previousValue Original content of the table row.
* @param array $location Information about the table.
* @param string $action Name of the action to be executed.
* @return bool Whether the operation succeeded or not.
*/
function updateDb($driver, $cleared, $previousValue, $location, $action)
{
if (skipCleanup() || !isset($location['idname'])) {
return true;
}
$backupFilename = getBackupFilename($action, $location['table']);
if ($backupFilename === false) {
return UPDATE_ERR_BACKUP_DIR;
}
// Prepare the SQL statements
$update = 'UPDATE ' . $driver->escapeName($location['table']) . ' SET ' .
$driver->escapeName($location['column']) . ' = ';
$where = ' WHERE ' . $driver->escapeName($location['idname']) . ' = ' .
$driver->escapeStr($location['id']) . ' AND ' .
$driver->escapeName($location['column']) . ' = ';
// Encrypt the backup and save it in that folder
$backup = $update . $driver->escapeStr($previousValue) . $where .
$driver->escapeStr($cleared) . ";\n\n";
if (!addToBackup($backupFilename, $backup)) {
return UPDATE_ERR_BACKUP_FILE;
}
// Change the column value in the database only when we have the backup
$driver->query($update . $driver->escapeStr($cleared) . $where . $driver->escapeStr($previousValue) . ';');
if ($driver->getAffectedRows() !== 1) {
return UPDATE_ERR_CHANGED;
}
return true;
}
/**
* Starts a transaction to delete some entries in the database.
*
* @param MySQLIDriver $driver Database connection.
* @param array $location Information about the table.
* @param string $where Condition for the SQL statement.
* @return array Result of the operation.
*/
function deleteRowsFromDb($driver, $location, $where)
{
$fromWhere = ' FROM ' . $driver->escapeName($location['table']) . ' WHERE ' . $where . ";\n\n";
$driver->begin();
// Select the malicious rows and backup them
$res = $driver->query('SELECT * ' . $fromWhere);
list($columns, $types) = $driver->getColumnNamesTypes($location['table']);
$values = array();
$out = '';
$warnOnly = false;
if (isset($location['sigtype'])) {
$warnOnly = $location['sigtype'] === USER_WARN;
$msg = (skipCleanup() || $warnOnly) ? 'Found malicious DB user: ' : 'Removed malicious DB user: ';
$msg .= $location['sig'];
} else {
$msg = skipCleanup() ? 'Found malicious row' : 'Removed row';
}
while ($row = $driver->fetchRow($res)) {
$values[] = '(' . $driver->exportRow($row, $types) . ')';
$location['id'] = $row[array_search($location['idname'], $columns)];
$msgRow = $msg;
if (isset($location['sigtype']) && array_search('user_login', $columns) !== false) {
$msgRow .= ': ' . $row[array_search('user_login', $columns)];
}
$out .= reportMalware($warnOnly ? 'WARN' : 'CLEARED', $msgRow, $location);
}
/**
* Prints the status of the infection and skips the cleanup.
*
* @option noclean Disables the cleanup of the malicious data.
*/
if (count($values) === 0 || skipCleanup() || $warnOnly) {
// No malware was found or cleanup is disabled
$driver->rollback();
return array(true, $out);
}
$total = count($columns);
for ($i = 0; $i < $total; $i++) {
$columns[$i] = $driver->escapeName($columns[$i]);
}
$backup = '';
foreach ($values as $value) {
$backup .= 'INSERT INTO ' . $driver->escapeName($location['table'])
. ' (' . implode(', ', $columns) . ') VALUES ' . $value
. ";\n\n";
}
$backupFilename = getBackupFilename('deleterows', $location['table']);
if ($backupFilename === false) {
$driver->rollback();
return array(UPDATE_ERR_BACKUP_DIR, $out);
}
// Save the backup
if (!addToBackup($backupFilename, $backup)) {
$driver->rollback();
return array(UPDATE_ERR_BACKUP_FILE, $out);
}
// Delete the rows
$driver->query('DELETE ' . $fromWhere);
$driver->commit();
return array(true, $out);
}
/**
* Returns information about the table from an SQL statement.
*
* @param string $sql SQL statement that will be parsed.
* @return array|null Information about the table.
*/
function getLocationFromSql($sql)
{
// Escaped names and values are not handled correctly by these regular expressions;
// we would need a full SQL lexer to handle them.
$location = array();
if (preg_match('@^UPDATE "([^"]+)" SET "([^"]+)" = @', $sql, $match)) {
$location['table'] = $match[1];
$location['column'] = $match[2];
if (preg_match('@ WHERE "([^"]+)" = \'([^\']+)\' AND @', $sql, $match)) {
$location['idname'] = $match[1];
$location['id'] = $match[2];
return $location;
}
} elseif (preg_match('@^INSERT INTO "([^"]+)" \("([^"]+)"@', $sql, $match)) {
// We cannot determine the primary key from the INSERT statement,
// so just take the first column for the message
$location['table'] = $match[1];
$location['idname'] = $match[2];
if (preg_match('@\) VALUES \(\'([^\']+)\'@', $sql, $match)) {
$location['id'] = $match[1];
return $location;
}
}
return null;
}
/**
* Find SQL statements associated to the same action.
*
* The default behavior of this function is to restore the backup file by
* executing every SQL statement individually after splitting the file by new
* lines, this clearly poses a problem with certain statements, for example,
* with stored procedures where they could be composed of multiple lines and
* separated by the DELIMITER keyword. This iteration is trying to fix this
* problem by executing all the SQL statements previously collected with a
* DELIMITER keyword.
*
* @param string $content All SQL statements that will be executed.
* @return array SQL statements grouped by actions.
*/
function getMultiSQLStatements($content = '')
{
$sqlGroup = '';
$sqlGroups = array();
$appendToGroup = false;
/* Clean and formalize SQL statements */
// $content = str_replace("\x60", '', $content);
$content = str_replace(";END", ";\nEND", $content);
$content = str_replace("\x20END", "\nEND", $content);
$content = str_replace("\x20BEGIN", "\nBEGIN", $content);
$lines = explode("\n", $content); /* assume unique lines */
foreach ($lines as $line) {
$line = trim($line);
/* Skip empty lines, comments and SQL delimiters */
if (empty($line)
|| strpos($line, "--\x20") === 0
|| strpos($line, 'DELIMITER') === 0
) {
continue;
}
if (strpos($line, 'CREATE DEFINER') === 0
|| strpos($line, 'CREATE FUNCTION') === 0
|| strpos($line, 'CREATE PROCEDURE') === 0
) {
$appendToGroup = true;
$sqlGroup = $line;
/**
* Close group if the END was in the previous line.
*
* In some cases when the group of SQL statements is all merged in
* a single line, both the CREATE and END keywords will be at the
* beginning and end of the same instruction, making this condition
* more or less irrelevant. To prevent conflicts with other groups
* we will check if this line also contains the END keyword and
* close the group right here.
*/
if (strpos($line, ';END') !== false
|| strpos($line, ";\x20END") !== false
) {
$appendToGroup = false;
$sqlGroups[] = $sqlGroup;
}
continue;
}
if (strpos($line, 'END') === 0) {
$appendToGroup = false;
$sqlGroups[] = $sqlGroup . "\n" . $line;
continue;
}
if ($appendToGroup) {
$sqlGroup .= "\n" . $line;
continue;
}
$sqlGroups[] = $line;
}
return $sqlGroups;
}
/**
* Restores the content of a specific database.
*
* @param MySQLIDriver $driver Database connection.
* @param string $content List of SQL statements to execute.
* @return void
*/
function restoreBackup($driver, $content)
{
if (!isset($GLOBALS['isPlainText'])) {
$GLOBALS['isPlainText'] = false;
}
$sqlLines = getMultiSQLStatements($content);
prush("Restoring " . count($sqlLines) . " SQL statements...\n");
foreach ($sqlLines as $sql) {
if ($sql === '' || $sql === BACKUP_COMMENT) {
continue;
}
$res = $driver->query($sql);
if (strpos($sql, "CREATE\x20") === 0
|| strpos($sql, "DROP\x20") === 0
) {
logMsg($res !== false, $sql);
continue;
}
$location = getLocationFromSql($sql);
$naffected = $driver->getAffectedRows();
if ($naffected === 0) {
prush(reportMalware('ERROR', 'The DB column was changed after backup. Please restore manually', $location) . "\n");
} elseif ($naffected !== 1) {
prush(reportMalware('ERROR', 'Unexpected naffected: ' . $naffected, $location) . "\n");
} else {
prush(reportMalware('OK', isset($location['column']) ? 'Restored DB column' : 'Restored DB row', $location) . "\n");
}
}
printMsg("\n\nINFO: Restore complete");
prush($GLOBALS['isPlainText'] ? "\n" : '</pre>');
}
/**
* Creates a new directory to store the infected data.
*
* @return bool True if the directory was created, false otherwise.
*/
function createQuarantineFolder()
{
// Create the directory (race condition here)
if (!is_dir(QUARANTINE_FOLDER)) {
if (!mkdir(QUARANTINE_FOLDER, 0755, true)) {
return false;
}
}
// Harden the directory
if (!touch(QUARANTINE_FOLDER . DIRECTORY_SEPARATOR . 'index.html')
|| !touch(QUARANTINE_FOLDER . DIRECTORY_SEPARATOR . 'index.php')
) {
return false;
}
$fh = fopen(QUARANTINE_FOLDER . DIRECTORY_SEPARATOR . '.htaccess', 'w');
if ($fh === false || false === fwrite($fh, 'deny from all')) {
return false;
}
fclose($fh);
return true;
}
/**
* Returns the path to the requested database backup.
*
* @param string $action Category associated to the backup.
* @param string $table Name of the table.
* @return string|bool Path to the database backup or false.
*/
function getBackupFilename($action, $table)
{
if (!isset($GLOBALS['backupFilename'])) {
$GLOBALS['backupFilename'] = array();
}
// Sanitize table name
$table = preg_replace('/[^a-zA-Z0-9_-]/', '-', $table);
// If the current backup file is too large or does not exist, generate a new one
clearstatcache();
if (isset($GLOBALS['backupFilename'][$table]) && filesize($GLOBALS['backupFilename'][$table]) <= 500000) {
return $GLOBALS['backupFilename'][$table];
}
if (!createQuarantineFolder()) {
return false;
}
// Generate the file name. There is a race condition here, but it's mostly okay
// because scan usually takes more than 1 sec. Ideally, we would use fopen(..., "xb"),
// but it's not supported until PHP 4.3.2.
$suffix = BACKUP_APPENDIX . time();
$prefix = QUARANTINE_FOLDER . DIRECTORY_SEPARATOR . $action . '-' . $table;
$rand = '';
while (file_exists($prefix . $rand . $suffix)) {
$rand = mt_rand(0, 1000000000);
}
if (!$GLOBALS['backupFilename']) {
$GLOBALS['backupFilename'] = array();
}
$GLOBALS['backupFilename'][$table] = $prefix . $rand . $suffix;
return $GLOBALS['backupFilename'][$table];
}
/**
* Encodes the passed content with certain key.
*
* @param string $content Text to be encrypted.
* @param string $key Password for the encryption.
* @param int $shift Number of encryption cycles.
* @return string New text already encrypted.
*/
function encrypt($content, $key, $shift)
{
$result = '';
$contentLength = strlen($content);
$keyLength = strlen($key);
// XOR the first 'shift' bytes
$shift %= $keyLength;
$processedLength = min($keyLength - $shift, $contentLength);
// substr() returns false for an empty $content string, so we do an additional check
if ($processedLength > 0) {
$result = substr($content, 0, $processedLength) ^ substr($key, $shift, $processedLength);
}
$restLength = ($contentLength - $processedLength) % $keyLength;
$mainPartEnd = $contentLength - $restLength;
for ($i = $processedLength; $i < $mainPartEnd; $i += $keyLength) {
$result .= $key ^ substr($content, $i, $keyLength);
}
if ($restLength > 0) {
$result .= substr($content, $mainPartEnd) ^ substr($key, 0, $restLength);
}
return $result;
}
/**
* Prints the list of available backup files.
*
* @return void
*/
function listBackupFiles()
{
if (!isset($GLOBALS['isPlainText'])) {
$GLOBALS['isPlainText'] = false;
}
$dateLimit = null;
/**
* @option date Timestamp to filter the files in the backup archive.
*/
if (isset($_GET['date'])) {
$dateLimit = intval($_GET['date']);
if ($dateLimit <= 0 || $dateLimit > time()) {
$dateLimit = time();
}
}
$backupFiles = array();
$handle = @opendir(QUARANTINE_FOLDER);
if (!$handle) {
reportFatalError('Failed to open the quarantine folder');
}
while (false !== ($filename = @readdir($handle))) {
$key = explode(BACKUP_APPENDIX, $filename, 2);
if (is_dir($filename) || count($key) < 2) {
continue;
}
$fileDate = intval($key[1]);
if ($dateLimit !== null && ($fileDate > $dateLimit || $fileDate < $dateLimit - 24 * 60 * 60)) {
continue;
}
$backupFiles[$filename] = $fileDate;
}
closedir($handle);
arsort($backupFiles);
foreach ($backupFiles as $filename => $fileDate) {
$fileDate = @date('Y-m-d H:i:s', $fileDate);
$restoreLink = '?srun&restore=' . base64_encode($filename);
if ($GLOBALS['isPlainText']) {
echo "\n" . $fileDate . ' - ' . $filename . ' - restore=' . base64_encode($filename);
} else {
echo "\n" . '<a href="' . $restoreLink . '" target="_blank">' . $fileDate . ' - ' .
escapeHTML($filename) . "</a>";
}
}
echo "\n\n" . count($backupFiles) . ' backup file' . (count($backupFiles) === 1 ? '' : 's') . ' found';
echo $GLOBALS['isPlainText'] ? "\n" : '</pre>';
}
/**
* Restores the selected database.
*
* @param MySQLIDriver $driver Database connection.
* @param string $filename Database backup.
* @return void
*/
function restore($driver, $filename)
{
if (empty($filename)) {
listBackupFiles();
$driver->disconnect();
exit;
}
if (isset($_POST['file_content'])) {
if (get_magic_quotes_gpc()) {
$_POST['file_content'] = stripslashes($_POST['file_content']);
}
restoreBackup($driver, $_POST['file_content']);
$driver->disconnect();
exit;
}
$filename = base64_decode($filename);
if (!preg_match('@^[A-Za-z0-9_-]+' . preg_quote(BACKUP_APPENDIX, '@') . '[0-9]+$@', $filename)) {
reportFatalError('Invalid backup file name: ' . $filename);
}
$fh = fopen(QUARANTINE_FOLDER . DIRECTORY_SEPARATOR . $filename, 'rb');
if ($fh === false || false === ($contents = fread($fh, 8 * 1048576))) {
reportFatalError('Unable to read file: ' . $filename);
}
fclose($fh);
// Decrypt the file
$contents = encrypt($contents, SUCURI_KEY, 0);
$valid = strncmp($contents, BACKUP_COMMENT, strlen(BACKUP_COMMENT)) === 0 ||
strpos($contents, "\nWHERE ") !== false;
if (isTerminal()) {
echo "File: " . $filename;
if (!$valid) {
reportFatalError('Invalid backup file');
}
echo "\n" . $contents . "\n";
$reply = askFromCmdLine('Restore this backup? [Y / N]');
if ($reply === 'y' || $reply === 'Y') {
restoreBackup($driver, $contents);
}
} else {
echo '<form method="post" style="height:100%" action="">';
echo "File: " . escapeHtml($filename);
if ($valid) {
echo ' - <input type="submit" name="submit" value="Restore" />';
} else {
echo ' - Invalid backup file';
}
echo '<textarea name="file_content" style="margin: 2px; height: 85%; width: 100%;">';
echo escapeHtml($contents);
echo '</textarea></form></pre>';
}
$driver->disconnect();
exit;
}
/**
* Prints the content of a specific table.
*
* @param MySQLIDriver $driver Database connection.
* @param string $table Name of the table.
* @return void
*/
function dumpTableData($driver, $table)
{
list($columns, $types) = $driver->getColumnNamesTypes($table);
// Prepare the header with column names
$columnsEscaped = array();
$total = count($columns);
for ($i = 0; $i < $total; $i++) {
$columnsEscaped[$i] = $driver->escapeName($columns[$i]);
}
$columnsEscaped = implode(', ', $columnsEscaped);
$header = 'INSERT INTO ' . $driver->escapeName($table) . ' (' . $columnsEscaped . ') VALUES';
// Print all rows
$allValues = '';
$count = 0;
$res = $driver->queryLowMemory('SELECT * FROM ' . $driver->escapeName($table) . ';');
while ($row = $driver->fetchRow($res)) {
$values = "\n(" . $driver->exportRow($row, $types) . ')';
if (strlen($allValues) >= 500000) { // Split long SQL statements to avoid MySQL timeouts
echo $header . $allValues . ";\n";
$allValues = '';
}
if ($allValues) {
$allValues .= ',';
}
$allValues .= $values;
$count++;
}
if ($count === 0) {
return;
}
echo $header . $allValues . ";\n\n";
}
/**
* Triggers the download of the entire database.
*
* @param MySQLIDriver $driver Database connection.
* @param string $tables List of table names.
* @param array $tablesColumns List of tables with their columns.
* @param string $db Name of the database.
* @return void
*/
function dumpTables($driver, $tables, $tablesColumns, $db)
{
global $tmp_file, $tmp_file_name;
if (!isset($_SERVER['SERVER_NAME'])) {
$serverName = date('ymd-His');
} else {
$serverName = preg_replace('/[^a-zA-Z0-9.-]/', '-', $_SERVER['SERVER_NAME']);
}
while (@ob_end_clean());
ob_start('ob_handler', 256);
date_default_timezone_set("GMT");
header('Content-Type: application/sql; charset=utf-8');
header('Content-Disposition: attachment; filename=dump_' . $serverName . '.sql');
echo "-- Sucuri DB dump\n\n";
echo $driver->getDumpHeader() . "\n";
echo $driver->getCreateDBSql($db);
if ($tables) {
$tablesColumns = array_flip(explode(',', $tables));
}
foreach ($tablesColumns as $table => $_) {
echo $driver->getCreateTableSql($table);
dumpTableData($driver, $table);
}
echo "-- End of the dump\n";
ob_end_clean();
rewind($tmp_file);
fpassthru($tmp_file);
fclose($tmp_file);
@unlink($tmp_file_name);
exit;
}
function ob_handler($buffer)
{
global $tmp_file;
fwrite($tmp_file, $buffer);
}
/**
* Prints to console the content of the data array.
*
* Each header must be an array with a required "name" attribute and additional
* optional keys to specify an alias (alternative name for the column) and the
* alignment of the data (either left or right, by default: left). If there is
* no "alias" the function takes the value from the required "name" key.
*
* Similar to the example below:
*
* <pre>
* Headers [
* [name: "ID"],
* [name: "Name"],
* [name: "Population", align: "right"],
* [name: "Percentage", alias: "Density", align: "right"],
* [name: "LandArea", alias: "Land Area", align: "right"],
* ]
*
* +----+---------------------------+------------+---------+--------------+
* | Tabular Data |
* +----+---------------------------+------------+---------+--------------+
* | ID | Name | Population | Density | Land Area |
* +----+---------------------------+------------+---------+--------------+
* | 1 | Ontario | 13,448,494 | 38.30% | 908,699.33 |
* | 2 | Quebec | 8,164,361 | 23.20% | 1,356,625.27 |
* | 3 | British Columbia | 4,648,055 | 13.20% | 922,503.01 |
* | 4 | Alberta | 4,067,175 | 11.60% | 640,330.46 |
* | 5 | Manitoba | 1,278,365 | 3.60% | 552,370.99 |
* | 6 | Saskatchewan | 1,098,352 | 3.10% | 588,243.54 |
* | 7 | Nova Scotia | 923,598 | 2.60% | 52,942.27 |
* | 8 | New Brunswick | 747,101 | 2.10% | 71,388.81 |
* | 9 | Newfoundland and Labrador | 519,716 | 1.50% | 370,514.08 |
* | 10 | Prince Edward Island | 142,907 | 0.41% | 5,686.03 |
* | 11 | Northwest Territories | 41,786 | 0.12% | 1,143,793.86 |
* | 12 | Nunavut | 35,944 | 0.10% | 1,877,778.53 |
* | 13 | Yukon | 35,874 | 0.10% | 474,712.68 |
* +----+---------------------------+------------+---------+--------------+
* </pre>
*
* @category Terminal
* @package Cleanup
* @author Yorman <yorman@sucuri.net>
* @license https://opensource.org/licenses/MIT MIT
* @link https://sucuri.net/
* @date Nov 23, 2017
*/
class TabularData
{
/**
* @var array List of entries to print in the terminal.
*/
private $data;
/**
* @var string Optional title for the terminal table.
*/
private $title;
/**
* @var array Names for the columns in the table.
*/
private $headers;
/**
* @var array Two-dimensional array where each item contains information
* about the data on each column of the table, more specifically, the number
* of characters of the entry with the longest string.
*/
private $longest;
/**
* @var array Lines composing the table for buffering.
*/
private $lines;
/**
* @var array List of optional foot notes.
*/
private $notes;
/**
* @var int Total number of entries in the data array.
*/
private $total;
/**
* Constructor.
*/
public function __construct()
{
$this->title = '';
$this->data = array();
$this->headers = array();
$this->longest = array();
$this->lines = array();
$this->notes = array();
$this->total = 0;
}
/**
* Attaches the data that will be tabulated.
*
* @param array $data Array with multiple entries.
* @return void
*/
public function addData($data)
{
$this->data = $data;
$this->total = count($data);
}
/**
* Adds a new column to the table.
*
* @param string $name Name of the array key with the data.
* @param string $align Either "left" or "right" (default: "left")
* @param string $alias Optional name for the column.
* @return void
*/
public function addColumn($name, $align = 'left', $alias = '')
{
if (empty($name)) {
return;
}
if ($alias === '') {
$alias = $name;
}
$this->headers[] = array(
'name' => $name, /* key to find the data in the array */
'alias' => $alias, /* column name to print in the console */
/**
* This condition should be read as "where do you want to put the
* white spaces" instead of "where do you want to put the text" as
* we want to use white spaces to align the text in the column. So
* if the function call has align to the "right", we have to use
* STR_PAD_LEFT to fill up the left side of the string.
*/
'align' => ($align === 'right' ? STR_PAD_LEFT : STR_PAD_RIGHT),
);
$this->longest[$name] = strlen($alias);
}
/**
* Adds a note to the foot of the table.
*
* @param string $text Message to append at the end of the table.
* @return void
*/
public function addNote($text = '')
{
$this->notes[] = $text;
}
/**
* Defines an optional title for the table.
*
* @param string $title Name of the data.
* @return void
*/
public function setTitle($title)
{
$this->title = $title;
}
/**
* Finds the longest text on each column.
*
* @return void
*/
private function findLongestText()
{
foreach ($this->data as $row) {
foreach ($this->headers as $header) {
$length = 0;
$name = $header['name'];
if (array_key_exists($name, $row)) {
$length = strlen(strip_tags($row[$name]));
}
if ($length > $this->longest[$name]) {
$this->longest[$name] = $length;
}
}
}
}
/**
* Sort an array with a user-defined comparison function.
*
* This function sorts an array such that array indices maintain their
* correlation with the array elements they are associated with, using a
* user-defined comparison function. This is used mainly when sorting
* associative arrays where the actual element order is significant. If two
* members compare as equal, their relative order in the sorted array is
* undefined.
*
* @param string $field Name of the column to sort by.
* @return void
*/
public function sortBy($field = '')
{
$GLOBALS['sortByField'] = $field;
usort($this->data, 'TabularData::sortByAlgo');
}
/**
* Compares two variables.
*
* @param mixed $a Value to compare.
* @param mixed $b Value to be compared with.
* @return int Zero if equal, one for greater than, minus one otherwise.
*/
private static function sortByAlgo($a, $b)
{
$field = @$GLOBALS['sortByField'];
if ($a[$field] === $b[$field]) {
return 0; /* they are the same */
}
return $a[$field] > $b[$field] ? -1 : 1;
}
/**
* Tabulate and print the data to the terminal.
*
* @throws Exception
* @return void
*/
public function printTable()
{
if (!is_array($this->data) || empty($this->data)) {
throw new Exception('There is no data to print', 3114);
}
$start = microtime(true);
$this->findLongestText();
$this->printTableSeparator();
$this->printTableTitle();
$this->printTableSeparator();
$this->printTableHeader();
$this->printTableSeparator();
$this->printTableContent();
$this->printTableSeparator();
foreach ($this->notes as $note) {
if (isTerminal()) {
$this->lines[] = strip_tags($note);
continue;
}
$this->lines[] = $note;
}
$end = microtime(true) - $start;
$this->lines[] = sprintf('%d rows in set (%f secs)', $this->total, $end);
/* Browser; print all lines from buffer */
if (!isTerminal()) {
prush('<style type="text/css">');
prush('.tabular {');
prush(' width: 100%;');
prush(' overflow-x: scroll;');
prush(' white-space: pre;');
prush(' border: none;');
prush('}');
prush('</style>');
prush("<div class='tabular'>");
foreach ($this->lines as $line) {
prush('<div>' . $line . '</div>');
}
prush('</div>');
return;
}
/* Terminal; print all lines from buffer */
foreach ($this->lines as $line) {
prush($line . "\n");
}
}
/**
* Prints a line of dashes and plus signs to separate.
*
* @return void
*/
private function printTableSeparator()
{
$line = '';
foreach ($this->headers as $header) {
$line .= '+' . str_repeat('-', $this->longest[$header['name']] + 2);
}
$this->lines[] = $line . '-+';
}
/**
* Prints the title of the table.
*
* @return void
*/
private function printTableTitle()
{
/* total table width, with separators */
$total = 3 * (count($this->longest) - 1);
foreach ($this->longest as $col => $width) {
$total += $width;
}
$line = "|\x20";
if (strlen($this->title) > $total) {
$line .= substr($this->title, 0, $total) . '…';
} else {
$line .= str_pad($this->title, $total + 1, "\x20", STR_PAD_RIGHT);
}
$this->lines[] = $line . "\x20|";
}
/**
* Prints the header of the table.
*
* @return void
*/
private function printTableHeader()
{
$line = '';
foreach ($this->headers as $header) {
$line .= "|\x20";
$line .= str_pad($header['alias'], $this->longest[$header['name']]);
$line .= "\x20";
}
$this->lines[] = $line . "\x20|";
}
/**
* Prints the content of the table.
*
* @return void
*/
private function printTableContent()
{
for ($i = 0; $i < $this->total; $i++) {
$line = '';
foreach ($this->headers as $header) {
$a = $this->longest[$header['name']];
$b = strip_tags($this->data[$i][$header['name']]);
$c = strlen(strip_tags($this->data[$i][$header['name']]));
$spaces = str_repeat("\x20", $a - $c);
$line .= "|\x20";
$line .= ($header['align'] === STR_PAD_LEFT ? $spaces : '');
$line .= $this->data[$i][$header['name']];
$line .= ($header['align'] === STR_PAD_RIGHT ? $spaces : '');
$line .= "\x20";
}
$this->lines[] = $line . "\x20|";
}
}
}
/**
* Skips the modification of the database and only prints the status of the
* infection rather than cleaning the infected data. This is useful if you want
* to see what the script is going to modify before it happens. This option is
* automatically set if the script finds a problem during an update of one of
* the records, to prevent future failures it sets itself to read-only mode and
* simply prints the subsequent infected records.
*
* @option noclean Disables the cleanup of the malicious data.
*
* @return bool True if the GET parameter "noclean" exists, false otherwise.
*/
function skipCleanup()
{
return (bool) isset($_GET['noclean']);
}
/**
* Prints text and immediately flush system output buffer.
*
* Outputs all parameters. No additional newline is appended. This is not
* actually a function (it is a language construct), so you are not required to
* use parentheses with it. echo (unlike some other language constructs) does
* not behave like a function, so it cannot always be used in the context of a
* function. Additionally, if you want to pass more than one parameter to echo,
* the parameters must not be enclosed within parentheses.
*
* @param string $text The parameter to output.
* @return void
*/
function prush($text)
{
echo $text;
@ob_flush();
@flush();
}
/**
* Merges all the values from an array into a string.
*
* The "smart" part of this function in comparison with the built-in function
* "implode" is that it handles multi-dimensional arrays. You can refer to the
* example below for a better understanding.
*
* Input: [1, 2, 3, [4, 5, 6], [7, 8, 9]]
* Output: "1, 2, 3, 4, 5, 6, 7, 8, 9"
*
* @param array $list Possibly a multi-dimensional array.
* @param string $glue String to concatenate the items in the list.
* @return string Merged version of the list as a string.
*/
function smartImplode($list = array(), $glue = ",\x20")
{
$output = '';
foreach ($list as $key => $values) {
if (is_array($values)) {
$output .= ",\x20" . smartImplode($values, $glue);
continue;
}
if (is_string($values)) {
$output .= ",\x20" . $values;
continue;
}
}
return substr($output, 2);
}
/**
* Finds all stored procedures and functions from a MySQL database.
*
* A stored procedure is a set of Structured Query Language (SQL) statements
* with an assigned name, which are stored in a relational database management
* system as a group, so it can be reused and shared by multiple programs.
*
* A benefit of stored procedures is that you can centralize data access logic
* into a single place that is then easy for DBA's to optimize. Stored
* procedures also have a security benefit in that you can grant execute rights
* to a stored procedure but the user will not need to have read/write
* permissions on the underlying tables. This is a good first step against SQL
* injection.
*
* @see https://dev.mysql.com/doc/refman/5.7/en/create-procedure.html
* @see https://dev.mysql.com/doc/refman/5.7/en/show-create-procedure.html
*
* @param MySQLIDriver $driver Database connection.
* @param string $group Either "PROCEDURE" or "FUNCTION".
* @param array $row Raw associative data from the database.
* @param bool $limit True to include the SQL delimiter, false otherwise.
* @return array Information associated to a single stored procedure.
*/
function getStoredProcedure($driver, $group = '', $row = array(), $limit = false)
{
$sql = sprintf(
'SHOW CREATE %s %s.%s;',
$group,
$driver->escapeName($row['Db']),
$driver->escapeName($row['Name'])
);
$data = $driver->fetchAssoc($driver->query($sql));
/* Either "Create Procedure" or "Create Function" */
$filter = sprintf('Create %s', ucwords(strtolower($group)));
$row['Procedure'] = $data[$filter];
$row['SqlMode'] = array();
$row['CssClass'] = '';
if (array_key_exists('sql_mode', $data)) {
/* ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,…,NO_ZERO_DATE */
$row['SqlMode'] = explode(',', $data['sql_mode']);
}
/* ignore normal procedures */
if ($row['Db'] === 'sys') {
$row['CssClass'] .= "\x20normal";
}
/* mark DUMPFILE SQL statement as suspicious */
if (stripos($row['Procedure'], 'DUMPFILE') !== false) {
$row['CssClass'] .= "\x20suspicious";
}
/* mark PHP code as suspicious */
if (stripos($row['Procedure'], '<?php') !== false) {
$row['CssClass'] .= "\x20suspicious";
}
/* include the SQL delimiter if necessary */
if ($limit === true) {
$row['Procedure'] = sprintf(
"DELIMITER\x20;;\n%s\x20;;\nDELIMITER\x20;",
$row['Procedure'] /* original sql statement */
);
}
return $row;
}
/**
* Returns all stored procedures and functions.
*
* @param MySQLIDriver $driver Database connection.
* @return array List of all stored procedures and functions.
*/
function getStoredProcedures($driver)
{
$entries = array();
$groups = array('PROCEDURE', 'FUNCTION');
foreach ($groups as $group) {
$res = $driver->query(sprintf('SHOW %s STATUS;', $group));
while ($row = $driver->fetchAssoc($res)) {
$entries[] = getStoredProcedure($driver, $group, $row);
}
}
return $entries;
}
/**
* Deletes one single stored procedure after a POST request.
*
* @param MySQLIDriver $driver Database connection.
* @return void
*/
function handleStoredProcedureDeletion($driver)
{
if (!isset($_POST['procedure_delete'])
|| !isset($_POST['procedure_db'])
|| !isset($_POST['procedure_type'])
|| !isset($_POST['procedure_name'])
) {
return;
}
$data = getStoredProcedure(
$driver,
$_POST['procedure_type'],
array('Db' => $_POST['procedure_db'], 'Name' => $_POST['procedure_name']),
true /* include the SQL statement delimiters */
);
$bakfile = getBackupFilename('delprocedure', $_POST['procedure_db']);
if ($bakfile === false) {
printMsg("3356 - Backup file for the stored procedure is not available.\n");
return;
}
if (!addToBackup($bakfile, $data['Procedure'])) {
printMsg("3361 - Stored procedure was not backuped up before deletion.\n");
return;
}
$driver->query(
sprintf(
'DROP %s IF EXISTS %s.%s',
$_POST['procedure_type'],
$_POST['procedure_db'],
$_POST['procedure_name']
)
);
}
/**
* Finds all stored procedures from a MySQL database.
*
* @option procedures Finds all stored procedures from a MySQL database.
* @option procedures.name=TYPE:db.procedure Prints a specific database stored procedure.
* @option procedures.delete=TYPE:db.procedure Deletes a specific database stored procedure.
*
* @param MySQLIDriver $driver Database connection.
* @return void
*/
function printStoredProcedures($driver)
{
/* print details for one single entry (in terminal mode) */
if (isTerminal() && isset($_GET['procedures_name'])) {
echo "\n\n"; /* separator*/
/* check valid format; expected -> TYPE:db.procedure */
if (preg_match('/^([A-Z]+):([^\.]+)\.(.+)$/', $_GET['procedures_name'], $match)) {
$row = array('Db' => $match[2], 'Name' => $match[3]);
$data = getStoredProcedure($driver, $match[1], $row);
printf("Database: %s\n", $data['Db']);
printf("Name: %s\n", $data['Name']);
foreach ($data['SqlMode'] as $idx => $mode) {
printf("SQL Mode #%d: %s\n", ($idx + 1), $data['SqlMode'][$idx]);
}
printf("Procedure:\n%s\n", $data['Procedure']);
return;
}
printMsg("Missing database name or procedure name.\n");
return;
}
/* delete a single stored procedure (in terminal mode) */
if (isTerminal() && isset($_GET['procedures_delete'])) {
echo "\n\n"; /* separator*/
/* check valid format; expected -> TYPE:db.procedure */
if (preg_match('/^([A-Z]+):([^\.]+)\.(.+)$/', $_GET['procedures_delete'], $match)) {
$_POST['procedure_delete'] = true;
$_POST['procedure_db'] = $match[2];
$_POST['procedure_type'] = $match[1];
$_POST['procedure_name'] = $match[3];
handleStoredProcedureDeletion($driver);
printMsg("3420 - Stored procedure " . $match[2] . "." . $match[3] . " was deleted.\n");
return;
}
printMsg("Missing database name or procedure name.\n");
return;
}
/* print the entire list (in terminal mode) */
if (isTerminal()) {
echo "\n\n"; /* separator*/
$tabular = new TabularData();
$entries = getStoredProcedures($driver);
$tabular->setTitle('Stored Procedures');
$tabular->addColumn('Type');
$tabular->addColumn('Created');
$tabular->addColumn('Modified');
$tabular->addColumn('Definer');
$tabular->addColumn('Security_type');
$tabular->addColumn('Db');
$tabular->addColumn('Name');
$tabular->addData($entries);
$tabular->printTable();
return;
}
?>
<div class="procedures">
<style type="text/css">
body {
/* y-overflow for long procedures */
padding-bottom: 300px;
}
.procedures table {
border: 1px solid #999;
border-bottom: 0;
border-right: 0;
border-spacing: 0;
position: relative;
width: 100%;
}
.procedures table .normal td {
color: #999;
}
.procedures table .comment {
background: #efefef;
border-bottom-right-radius: 3px;
border-top-right-radius: 3px;
border: 1px solid #999;
box-shadow: 0 0 5px #999;
color: #000;
display: none;
left: 0;
margin-left: -1px;
margin-top: 11px;
padding: 20px;
position: absolute;
white-space: pre-wrap;
width: 750px;
word-break: break-all;
}
.procedures table .suspicious .comment {
background: #ffadb2;
border-color: #ff6051;
}
.procedures table tr:hover .comment {
display: block;
}
.procedures table th,
.procedures table td {
padding: 2px 5px;
}
.procedures table th {
background: #efefef;
border-bottom: 1px solid #999;
border-right: 1px solid #999;
text-align: left;
text-transform: uppercase;
}
.procedures table td {
border: 1px solid #999;
border-left: 0;
border-top: 0;
}
.procedures table .procedure_form {
padding: 0;
text-align: center;
}
.procedures table .procedure_form form {
margin: 0;
}
</style>
<?php
handleStoredProcedureDeletion($driver);
$entries = getStoredProcedures($driver);
?>
<table>
<thead>
<tr>
<th> </th>
<th>Type</th>
<th>Created</th>
<th>Modified</th>
<th>Definer</th>
<th>Security</th>
<th>Db</th>
<th>Name</th>
<th> </th>
</tr>
</thead>
<tbody>
<?php foreach ($entries as $row) : ?>
<tr class="<?php echo $row['CssClass']; ?>">
<td><span class="comment"><?php echo htmlentities($row['Procedure']); ?></span></td>
<td><?php echo $row['Type']; ?></td>
<td><?php echo $row['Created']; ?></td>
<td><?php echo $row['Modified']; ?></td>
<td><?php echo $row['Definer']; ?></td>
<td><?php echo $row['Security_type']; ?></td>
<td><?php echo $row['Db']; ?></td>
<td><?php echo $row['Name']; ?></td>
<td class="procedure_form">
<form method="post">
<input type="hidden" name="procedure_delete" value="true">
<input type="hidden" name="procedure_db" value="<?php echo $row['Db']; ?>">
<input type="hidden" name="procedure_name" value="<?php echo $row['Name']; ?>">
<input type="hidden" name="procedure_type" value="<?php echo $row['Type']; ?>">
<?php if ($row['Db'] === 'sys') : ?>
<button type="submit" disabled>delete</button>
<?php else : ?>
<button type="submit">delete</button>
<?php endif; ?>
</form>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?php
}
/**
* Prints all the available options in the script.
*
* @option help Prints all the available options in the script.
*
* @return void
*/
function printScriptUsage()
{
if (!is_readable(__FILE__)) {
return;
}
$maxlen = 0;
$options = array();
$lines = file(__FILE__, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);
foreach ($lines as $line) {
if (strpos($line, "@option\x20") !== false) {
$index = strpos($line, "@option\x20");
$line = substr($line, $index + 8);
$index = strpos($line, "\x20");
$option = substr($line, 0, $index);
$desc = substr($line, $index + 1);
$length = strlen($option);
if ($length > $maxlen) {
$maxlen = $length;
}
$options[$option] = $desc;
}
}
if (empty($options)) {
return;
}
echo "\n\nUsage:\n";
foreach ($options as $option => $desc) {
printf(
"\x20\x20%s\x20%s\n",
str_pad($option, $maxlen, "\x20", STR_PAD_RIGHT),
$desc
);
}
}